ZGlmZiAtLWdpdCBhL2lwdXRpbHMvQW5kcm9pZC5tayBiL2lwdXRpbHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmE0ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDEgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpcHV0aWxzX2NmbGFncyA6PSBcCisgIC1EX0dOVV9TT1VSQ0UgXAorICAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIFwKKyAgLVduby1zaWduLWNvbXBhcmUgXAorICAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX0NGTEFHUyA6PSAkKGlwdXRpbHNfY2ZsYWdzKQorTE9DQUxfTU9EVUxFIDo9IHBpbmcKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaW5nLmMgcGluZ19jb21tb24uYworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfQ0ZMQUdTIDo9ICQoaXB1dGlsc19jZmxhZ3MpCitMT0NBTF9NT0RVTEUgOj0gcGluZzYKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCitMT0NBTF9TUkNfRklMRVMgOj0gcGluZzYuYyBwaW5nX2NvbW1vbi5jCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DRkxBR1MgOj0gJChpcHV0aWxzX2NmbGFncykKK0xPQ0FMX01PRFVMRSA6PSB0cmFjZXBhdGgKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCitMT0NBTF9TUkNfRklMRVMgOj0gdHJhY2VwYXRoLmMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX0NGTEFHUyA6PSAkKGlwdXRpbHNfY2ZsYWdzKQorTE9DQUxfTU9EVUxFIDo9IHRyYWNlcGF0aDYKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCitMT0NBTF9TUkNfRklMRVMgOj0gdHJhY2VwYXRoNi5jCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DRkxBR1MgOj0gJChpcHV0aWxzX2NmbGFncykKK0xPQ0FMX01PRFVMRSA6PSB0cmFjZXJvdXRlNgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKK0xPQ0FMX1NSQ19GSUxFUyA6PSB0cmFjZXJvdXRlNi5jCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2lwdXRpbHMvQ2xlYW5TcGVjLm1rIGIvaXB1dGlscy9DbGVhblNwZWMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZTFiNgotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvQ2xlYW5TcGVjLm1rCkBAIC0wLDAgKzEsNDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCisjIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAorIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KKyMgcnVuIGJlZm9yZS4KKyMKKyMgRS5nLjoKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKKyMKKyMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCisjIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgorIworIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCisjIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCisjCisjIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQorIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQorIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQorIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCisjIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorIworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIEZvciBleGFtcGxlOgorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKKworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9JTlNUQUxMIGIvaXB1dGlscy9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjZkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL0lOU1RBTEwKQEAgLTAsMCArMSwyNCBAQAorCittYWtlCittYWtlIGh0bWwKK21ha2UgbWFuCitseW54IGRvYy9pcHV0aWxzLmh0bWwKK1JlYWQuLi4KKworCisKK0lmIHRoZSBmaXJzdCAibWFrZSIgZmFpbHMsIG5vIHByb2JsZW1zOgorCittYWtlIGh0bWwKK2x5bnggZG9jL2lwdXRpbHMuaHRtbAorUmVhZCBzZWN0aW9uICJJbnN0YWxsYXRpb24gbm90ZXMiLi4uCisKKworCitCdXQgaWYgIm1ha2UgaHRtbCIgZmFpbHMgdG9vLCBjaGVjayB0aGF0IERvY0Jvb2sgcGFja2FnZSBpcyBpbnN0YWxsZWQKK29uIHlvdXIgbWFjaGluZS4gSWYgaXQgaXMgaW5zdGFsbGVkLCBhbmQgbmV2ZXJ0aGVsZXNzICJtYWtlIiBkb2VzIG5vdCB3b3JrLAorZGVsZXRlIGlwdXRpbHMgYW5kIGdvIHRvIHNsZWVwLiBUaGUgbmV4dCBkYXkgcmVwZWF0LiBJZiBldmVuIGZ1bGwgcmVzZXQKK2RpZCBub3QgaGVscCwgSSBicmluZyBhcG9sb2dpZXMuIDotKQorCisKKwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9NT0RVTEVfTElDRU5TRV9CU0QgYi9pcHV0aWxzL01PRFVMRV9MSUNFTlNFX0JTRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9NT0RVTEVfTElDRU5TRV9CU0QKZGlmZiAtLWdpdCBhL2lwdXRpbHMvTWFrZWZpbGUgYi9pcHV0aWxzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjQ5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjUyIEBACisjCisjIENvbmZpZ3VyYXRpb24KKyMKKworIyBDQworQ0M9Z2NjCisjIFBhdGggdG8gcGFyZW50IGtlcm5lbCBpbmNsdWRlIGZpbGVzIGRpcmVjdG9yeQorTElCQ19JTkNMVURFPS91c3IvaW5jbHVkZQorIyBMaWJyYXJpZXMKK0FERExJQj0KKyMgTGlua2VyIGZsYWdzCitMREZMQUdfU1RBVElDPS1XbCwtQnN0YXRpYworTERGTEFHX0RZTkFNSUM9LVdsLC1CZHluYW1pYworTERGTEFHX0NBUD0tbGNhcAorTERGTEFHX0dOVVRMUz0tbGdudXRscy1vcGVuc3NsCitMREZMQUdfQ1JZUFRPPS1sY3J5cHRvCitMREZMQUdfSUROPS1saWRuCitMREZMQUdfUkVTT0xWPS1scmVzb2x2CitMREZMQUdfU1lTRlM9LWxzeXNmcworCisjCisjIE9wdGlvbnMKKyMKKworIyBDYXBhYmlsaXR5IHN1cHBvcnQgKHdpdGggbGliY2FwKSBbeWVzfHN0YXRpY3xub10KK1VTRV9DQVA9eWVzCisjIHN5c2ZzIHN1cHBvcnQgKHdpdGggbGlic3lzZnMgLSBkZXByZWNhdGVkKSBbbm98eWVzfHN0YXRpY10KK1VTRV9TWVNGUz1ubworIyBJRE4gc3VwcG9ydCAoZXhwZXJpbWVudGFsKSBbbm98eWVzfHN0YXRpY10KK1VTRV9JRE49bm8KKworIyBEbyBub3QgdXNlIGdldGlmYWRkcnMgW25vfHllc3xzdGF0aWNdCitXSVRIT1VUX0lGQUREUlM9bm8KKyMgYXJwaW5nIGRlZmF1bHQgZGV2aWNlIChlLmcuIGV0aDApIFtdCitBUlBJTkdfREVGQVVMVF9ERVZJQ0U9CisKKyMgR05VIFRMUyBsaWJyYXJ5IGZvciBwaW5nNiBbeWVzfG5vfHN0YXRpY10KK1VTRV9HTlVUTFM9eWVzCisjIENyeXB0byBsaWJyYXJ5IGZvciBwaW5nNiBbc2hhcmVkfHN0YXRpY10KK1VTRV9DUllQVE89c2hhcmVkCisjIFJlc29sdiBsaWJyYXJ5IGZvciBwaW5nNiBbeWVzfHN0YXRpY10KK1VTRV9SRVNPTFY9eWVzCisjIHBpbmc2IHNvdXJjZSByb3V0aW5nIChkZXByZWNhdGVkIGJ5IFJGQzUwOTUpIFtub3x5ZXN8UkZDMzU0Ml0KK0VOQUJMRV9QSU5HNl9SVEhEUj1ubworCisjIHJkaXNjIHNlcnZlciAoLXIgb3B0aW9uKSBzdXBwb3J0IFtub3x5ZXNdCitFTkFCTEVfUkRJU0NfU0VSVkVSPW5vCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXaGF0IGEgcGl0eSwgYWxsIG5ldyBnY2NzIGFyZSBidWdneSBhbmQgLVdlcnJvciBkb2VzIG5vdCB3b3JrLiBTaWdoLgorIyBDQ09QVD0tZm5vLXN0cmljdC1hbGlhc2luZyAtV3N0cmljdC1wcm90b3R5cGVzIC1XYWxsIC1XZXJyb3IgLWcKK0NDT1BUPS1mbm8tc3RyaWN0LWFsaWFzaW5nIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdhbGwgLWcKK0NDT1BUT1BUPS1PMworR0xJQkNGSVg9LURfR05VX1NPVVJDRQorREVGSU5FUz0KK0xETElCPQorCitGVU5DX0xJQiA9ICQoaWYgJChmaWx0ZXIgc3RhdGljLCQoMSkpLCQoTERGTEFHX1NUQVRJQykgJCgyKSAkKExERkxBR19EWU5BTUlDKSwkKDIpKQorCisjIFVTRV9HTlVUTFM6IERFRl9HTlVUTFMsIExJQl9HTlVUTFMKKyMgVVNFX0NSWVBUTzogTElCX0NSWVBUTworaWZuZXEgKCQoVVNFX0dOVVRMUyksbm8pCisJTElCX0NSWVBUTyA9ICQoY2FsbCBGVU5DX0xJQiwkKFVTRV9HTlVUTFMpLCQoTERGTEFHX0dOVVRMUykpCisJREVGX0NSWVBUTyA9IC1EVVNFX0dOVVRMUworZWxzZQorCUxJQl9DUllQVE8gPSAkKGNhbGwgRlVOQ19MSUIsJChVU0VfQ1JZUFRPKSwkKExERkxBR19DUllQVE8pKQorZW5kaWYKKworIyBVU0VfUkVTT0xWOiBMSUJfUkVTT0xWCitMSUJfUkVTT0xWID0gJChjYWxsIEZVTkNfTElCLCQoVVNFX1JFU09MViksJChMREZMQUdfUkVTT0xWKSkKKworIyBVU0VfQ0FQOiAgREVGX0NBUCwgTElCX0NBUAoraWZuZXEgKCQoVVNFX0NBUCksbm8pCisJREVGX0NBUCA9IC1EQ0FQQUJJTElUSUVTCisJTElCX0NBUCA9ICQoY2FsbCBGVU5DX0xJQiwkKFVTRV9DQVApLCQoTERGTEFHX0NBUCkpCitlbmRpZgorCisjIFVTRV9TWVNGUzogREVGX1NZU0ZTLCBMSUJfU1lTRlMKK2lmbmVxICgkKFVTRV9TWVNGUyksbm8pCisJREVGX1NZU0ZTID0gLURVU0VfU1lTRlMKKwlMSUJfU1lTRlMgPSAkKGNhbGwgRlVOQ19MSUIsJChVU0VfU1lTRlMpLCQoTERGTEFHX1NZU0ZTKSkKK2VuZGlmCisKKyMgVVNFX0lETjogREVGX0lETiwgTElCX0lETgoraWZuZXEgKCQoVVNFX0lETiksbm8pCisJREVGX0lETiA9IC1EVVNFX0lETgorCUxJQl9JRE4gPSAkKGNhbGwgRlVOQ19MSUIsJChVU0VfSUROKSwkKExERkxBR19JRE4pKQorZW5kaWYKKworIyBXSVRIT1VUX0lGQUREUlM6IERFRl9XSVRIT1VUX0lGQUREUlMKK2lmbmVxICgkKFdJVEhPVVRfSUZBRERSUyksbm8pCisJREVGX1dJVEhPVVRfSUZBRERSUyA9IC1EV0lUSE9VVF9JRkFERFJTCitlbmRpZgorCisjIEVOQUJMRV9SRElTQ19TRVJWRVI6IERFRl9FTkFCTEVfUkRJU0NfU0VSVkVSCitpZm5lcSAoJChFTkFCTEVfUkRJU0NfU0VSVkVSKSxubykKKwlERUZfRU5BQkxFX1JESVNDX1NFUlZFUiA9IC1EUkRJU0NfU0VSVkVSCitlbmRpZgorCisjIEVOQUJMRV9QSU5HNl9SVEhEUjogREVGX0VOQUJMRV9QSU5HNl9SVEhEUgoraWZuZXEgKCQoRU5BQkxFX1BJTkc2X1JUSERSKSxubykKKwlERUZfRU5BQkxFX1BJTkc2X1JUSERSID0gLURQSU5HNl9FTkFCTEVfUlRIRFIKK2lmZXEgKCQoRU5BQkxFX1BJTkc2X1JUSERSKSxSRkMzNTQyKQorCURFRl9FTkFCTEVfUElORzZfUlRIRFIgKz0gLURQSU5SNl9FTkFCTEVfUlRIRFJfUkZDMzU0MgorZW5kaWYKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSVBWNF9UQVJHRVRTPXRyYWNlcGF0aCBwaW5nIGNsb2NrZGlmZiByZGlzYyBhcnBpbmcgdGZ0cGQgcmFycGQKK0lQVjZfVEFSR0VUUz10cmFjZXBhdGg2IHRyYWNlcm91dGU2IHBpbmc2CitUQVJHRVRTPSQoSVBWNF9UQVJHRVRTKSAkKElQVjZfVEFSR0VUUykKKworQ0ZMQUdTPSQoQ0NPUFRPUFQpICQoQ0NPUFQpICQoR0xJQkNGSVgpICQoREVGSU5FUykKK0xETElCUz0kKExETElCKSAkKEFERExJQikKKworVU5BTUVfTjo9JChzaGVsbCB1bmFtZSAtbikKK0xBU1RUQUc6PSQoc2hlbGwgZ2l0IGRlc2NyaWJlIEhFQUQgfCBzZWQgLWUgJ3MvLS4qLy8nKQorVE9EQVk9JChzaGVsbCBkYXRlICslWS8lbS8lZCkKK0RBVEU9JChzaGVsbCBkYXRlIC0tZGF0ZSAkKFRPREFZKSArJVklbSVkKQorVEFHOj0kKHNoZWxsIGRhdGUgLS1kYXRlPSQoVE9EQVkpICtzJVklbSVkKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlBIT05ZOiBhbGwgbmluZm9kIGNsZWFuIGRpc3RjbGVhbiBtYW4gaHRtbCBjaGVjay1rZXJuZWwgbW9kdWxlcyBzbmFwc2hvdAorCithbGw6ICQoVEFSR0VUUykKKworJS5zOiAlLmMKKwkkKENPTVBJTEUuYykgJDwgJChERUZfJChwYXRzdWJzdCAlLm8sJSwkQCkpIC1TIC1vICRACislLm86ICUuYworCSQoQ09NUElMRS5jKSAkPCAkKERFRl8kKHBhdHN1YnN0ICUubywlLCRAKSkgLW8gJEAKKyQoVEFSR0VUUyk6ICU6ICUubworCSQoTElOSy5vKSAkXiAkKExJQl8kQCkgJChMRExJQlMpIC1vICRACisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBhcnBpbmcKK0RFRl9hcnBpbmcgPSAkKERFRl9TWVNGUykgJChERUZfQ0FQKSAkKERFRl9JRE4pICQoREVGX1dJVEhPVVRfSUZBRERSUykKK0xJQl9hcnBpbmcgPSAkKExJQl9TWVNGUykgJChMSUJfQ0FQKSAkKExJQl9JRE4pCisKK2lmbmVxICgkKEFSUElOR19ERUZBVUxUX0RFVklDRSksKQorREVGX2FycGluZyArPSAtRERFRkFVTFRfREVWSUNFPVwiJChBUlBJTkdfREVGQVVMVF9ERVZJQ0UpXCIKK2VuZGlmCisKKyMgY2xvY2tkaWZmCitERUZfY2xvY2tkaWZmID0gJChERUZfQ0FQKQorTElCX2Nsb2NrZGlmZiA9ICQoTElCX0NBUCkKKworIyBwaW5nIC8gcGluZzYKK0RFRl9waW5nX2NvbW1vbiA9ICQoREVGX0NBUCkgJChERUZfSUROKQorREVGX3BpbmcgID0gJChERUZfQ0FQKSAkKERFRl9JRE4pICQoREVGX1dJVEhPVVRfSUZBRERSUykKK0xJQl9waW5nICA9ICQoTElCX0NBUCkgJChMSUJfSUROKQorREVGX3Bpbmc2ID0gJChERUZfQ0FQKSAkKERFRl9JRE4pICQoREVGX1dJVEhPVVRfSUZBRERSUykgJChERUZfRU5BQkxFX1BJTkc2X1JUSERSKSAkKERFRl9DUllQVE8pCitMSUJfcGluZzYgPSAkKExJQl9DQVApICQoTElCX0lETikgJChMSUJfUkVTT0xWKSAkKExJQl9DUllQVE8pCisKK3Bpbmc6IHBpbmdfY29tbW9uLm8KK3Bpbmc2OiBwaW5nX2NvbW1vbi5vCitwaW5nLm8gcGluZ19jb21tb24ubzogcGluZ19jb21tb24uaAorcGluZzYubzogcGluZ19jb21tb24uaCBpbjZfZmxvd2xhYmVsLmgKKworIyByYXJwZAorREVGX3JhcnBkID0KK0xJQl9yYXJwZCA9CisKKyMgcmRpc2MKK0RFRl9yZGlzYyA9ICQoREVGX0VOQUJMRV9SRElTQ19TRVJWRVIpCitMSUJfcmRpc2MgPQorCisjIHRyYWNlcGF0aAorREVGX3RyYWNlcGF0aCA9ICQoREVGX0lETikKK0xJQl90cmFjZXBhdGggPSAkKExJQl9JRE4pCisKKyMgdHJhY2VwYXRoNgorREVGX3RyYWNlcGF0aDYgPSAkKERFRl9JRE4pCitMSUJfdHJhY2VwYXRoNiA9CisKKyMgdHJhY2Vyb3V0ZTYKK0RFRl90cmFjZXJvdXRlNiA9ICQoREVGX0NBUCkgJChERUZfSUROKQorTElCX3RyYWNlcm91dGU2ID0gJChMSUJfQ0FQKSAkKExJQl9JRE4pCisKKyMgdGZ0cGQKK0RFRl90ZnRwZCA9CitERUZfdGZ0cHN1YnMgPQorTElCX3RmdHBkID0KKwordGZ0cGQ6IHRmdHBzdWJzLm8KK3RmdHBkLm8gdGZ0cHN1YnMubzogdGZ0cC5oCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBuaW5mb2QKK25pbmZvZDoKKwlAc2V0IC1lOyBcCisJCWlmIFsgISAtZiBuaW5mb2QvTWFrZWZpbGUgXTsgdGhlbiBcCisJCQljZCBuaW5mb2Q7IFwKKwkJCS4vY29uZmlndXJlOyBcCisJCQljZCAuLjsgXAorCQlmaTsgXAorCQkkKE1BS0UpIC1DIG5pbmZvZAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbW9kdWxlcyAvIGNoZWNrLWtlcm5lbCBhcmUgb25seSBmb3IgYW5jaWVudCBrZXJuZWxzOyBvYnNvbGV0ZQorY2hlY2sta2VybmVsOgoraWZlcSAoJChLRVJORUxfSU5DTFVERSksKQorCUBlY2hvICJQbGVhc2UsIHNldCBjb3JyZWN0IEtFUk5FTF9JTkNMVURFIjsgZmFsc2UKK2Vsc2UKKwlAc2V0IC1lOyBcCisJaWYgWyAhIC1yICQoS0VSTkVMX0lOQ0xVREUpL2xpbnV4L2F1dG9jb25mLmggXTsgdGhlbiBcCisJCWVjaG8gIlBsZWFzZSwgc2V0IGNvcnJlY3QgS0VSTkVMX0lOQ0xVREUiOyBmYWxzZTsgZmkKK2VuZGlmCisKK21vZHVsZXM6IGNoZWNrLWtlcm5lbAorCSQoTUFLRSkgS0VSTkVMX0lOQ0xVREU9JChLRVJORUxfSU5DTFVERSkgLUMgTW9kdWxlcworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hbjoKKwkkKE1BS0UpIC1DIGRvYyBtYW4KKworaHRtbDoKKwkkKE1BS0UpIC1DIGRvYyBodG1sCisKK2NsZWFuOgorCUBybSAtZiAqLm8gJChUQVJHRVRTKQorCUAkKE1BS0UpIC1DIE1vZHVsZXMgY2xlYW4KKwlAJChNQUtFKSAtQyBkb2MgY2xlYW4KKwlAc2V0IC1lOyBcCisJCWlmIFsgLWYgbmluZm9kL01ha2VmaWxlIF07IHRoZW4gXAorCQkJJChNQUtFKSAtQyBuaW5mb2QgY2xlYW47IFwKKwkJZmkKKworZGlzdGNsZWFuOiBjbGVhbgorCUBzZXQgLWU7IFwKKwkJaWYgWyAtZiBuaW5mb2QvTWFrZWZpbGUgXTsgdGhlbiBcCisJCQkkKE1BS0UpIC1DIG5pbmZvZCBkaXN0Y2xlYW47IFwKKwkJZmkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzbmFwc2hvdDoKKwlAaWYgWyB4IiQoVU5BTUVfTikiICE9IHgicGxlaWFkZXMiIF07IHRoZW4gZWNobyAiTm90IGF1dGhvcml6ZWQgdG8gYWR2YW5jZSBzbmFwc2hvdCI7IGV4aXQgMTsgZmkKKwlAZWNobyAiWyQoVEFHKV0iID4gUkVMTk9URVMuTkVXCisJQGVjaG8gPj5SRUxOT1RFUy5ORVcKKwlAZ2l0IGxvZyAtLW5vLW1lcmdlcyAkKExBU1RUQUcpLi4gfCBnaXQgc2hvcnRsb2cgPj4gUkVMTk9URVMuTkVXCisJQGVjaG8gPj4gUkVMTk9URVMuTkVXCisJQGNhdCBSRUxOT1RFUyA+PiBSRUxOT1RFUy5ORVcKKwlAbXYgUkVMTk9URVMuTkVXIFJFTE5PVEVTCisJQHNlZCAtZSAicy9eJWRlZmluZSBzc2RhdGUgLiovJWRlZmluZSBzc2RhdGUgJChEQVRFKS8iIGlwdXRpbHMuc3BlYyA+IGlwdXRpbHMuc3BlYy50bXAKKwlAbXYgaXB1dGlscy5zcGVjLnRtcCBpcHV0aWxzLnNwZWMKKwlAZWNobyAic3RhdGljIGNoYXIgU05BUFNIT1RbXSA9IFwiJChUQUcpXCI7IiA+IFNOQVBTSE9ULmgKKwlAJChNQUtFKSAtQyBkb2Mgc25hcHNob3QKKwlAJChNQUtFKSBtYW4KKwlAZ2l0IGNvbW1pdCAtYSAtbSAiaXB1dGlscy0kKFRBRykiCisJQGdpdCB0YWcgLXMgLW0gImlwdXRpbHMtJChUQUcpIiAkKFRBRykKKwlAZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9dGFyIC0tcHJlZml4PWlwdXRpbHMtJChUQUcpLyAkKFRBRykgfCBiemlwMiAtOSA+IC4uL2lwdXRpbHMtJChUQUcpLnRhci5iejIKKwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9Nb2R1bGVzL01ha2VmaWxlIGIvaXB1dGlscy9Nb2R1bGVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODRkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL01vZHVsZXMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorS0VSTkVMX0lOQ0xVREU9L3Vzci9zcmMvbGludXgvaW5jbHVkZQorCisKK0NDPWdjYworQ0NPUFQ9LU8yIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdhbGwgLVdlcnJvciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbgorQ0ZMQUdTPS1ETU9EVUxFIC1EX19LRVJORUxfXyAtSSQoS0VSTkVMX0lOQ0xVREUpICQoQ0NPUFQpCisKKworYWxsOiBwZzMubworCitjbGVhbjoKKwlAcm0gLWYgKi5vCmRpZmYgLS1naXQgYS9pcHV0aWxzL01vZHVsZXMvcGczLmMgYi9pcHV0aWxzL01vZHVsZXMvcGczLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlODhmOQotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvTW9kdWxlcy9wZzMuYwpAQCAtMCwwICsxLDczNSBAQAorLyogcGczLmM6IFBhY2tldCBHZW5lcmF0b3IgZm9yIHBhY2tldCBwZXJmb3JtYW5jZSB0ZXN0aW5nLgorICoKKyAqIENvcHlyaWdodCAyMDAxIGJ5IFJvYmVydCBPbHNzb24gPHJvYmVydC5vbHNzb25AaXRzLnV1LnNlPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBzYWxhIFVuaXZlcnNpdHksIFN3ZWRlbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqCisgKi8KKworLyoKKworQSB0b29sIGZvciBsb2FkaW5nIGEgbmV0d29yayB3aXRoIGEgcHJlY29uZmlndXJhdGVkIHBhY2tldHMuIFRoZSB0b29sIGlzCitpbXBsZW1lbnRlZCBhcyBhIGxpbnV4IG1vZHVsZS4gUGFyYW1ldGVycyBhcyBvdXRwdXQgZGV2aWNlIElQRyBpbnRlcnBhY2tldAorcGFja2V0LCBudW1iZXIgb2YgcGFja2V0cyBjYW4gYmUgY29uZmlndXJlZC4gcGcgdXNlcyBhbHJlYWR5IGludGFsbGVkCitkZXZpY2UgZHJpdmVyIG91dHB1dCByb3V0aW5lLgorCisKK0FkZGl0aW9uYWwgaGFja2luZyBieToKKworSmVucy5MYWFzQGRhdGEuc2x1LnNlCitJbXByb3ZlZCBieSBBTksuIDAxMDEyMC4KK0ltcHJvdmVkIGJ5IEFOSyBldmVuIG1vcmUuIDAxMDIxMi4KK01BQyBhZGRyZXNzIHR5cG8gZml4ZWQuIDAxMDQxNyAtLXJvCisKKworVE9ETzoKKyogY291bGQgcmVsZWFzZSBrZXJuZWwgbG9jayB5ZXQuCisKKworSE9XVE86CisKKzEuIENvbXBpbGUgbW9kdWxlIHBnMy5vIGFuZCBpbnN0YWxsIGl0IGluIHRoZSBwbGFjZSB3aGVyZSBtb2Rwcm9iZSBtYXkgZmluZCBpdC4KKzIuIEN1dCBzY3JpcHQgImlwZyIgKHNlZSBiZWxvdykuCiszLiBFZGl0IHNjcmlwdCB0byBzZXQgcHJlZmVycmVkIGRldmljZSBhbmQgZGVzdGluYXRpb24gSVAgYWRkcmVzcy4KKzQuIC4gaXBnCis1LiBBZnRlciB0aGlzIHR3byBjb21tYW5kcyBhcmUgZGVmaW5lZDoKKyAgIEEuICJwZyIgdG8gc3RhcnQgZ2VuZXJhdG9yIGFuZCB0byBnZXQgcmVzdWx0cy4KKyAgIEIuICJwZ3NldCIgdG8gY2hhbmdlIGdlbmVyYXRvciBwYXJhbWV0ZXJzLiBGLmUuCisgICAgICBwZ3NldCAicGt0X3NpemUgOTAxNCIgICBzZXRzIHBhY2tldCBzaXplIHRvIDkwMTQKKyAgICAgIHBnc2V0ICJmcmFncyA1IiAgICAgICAgIHBhY2tldCB3aWxsIGNvbnNpc3Qgb2YgNSBmcmFnbWVudHMKKyAgICAgIHBnc2V0ICJjb3VudCAyMDAwMDAiICAgIHNldHMgbnVtYmVyIG9mIHBhY2tldHMgdG8gc2VuZAorICAgICAgcGdzZXQgImlwZyA1MDAwIiAgICAgICAgc2V0cyBhcnRpZmljaWFsIGdhcCBpbnNlcnRlZCBiZXR3ZWVuIHBhY2tldHMKKwkJCSAgICAgIHRvIDUwMDAgbmFub3NlY29uZHMKKyAgICAgIHBnc2V0ICJkc3QgMTAuMC4wLjEiICAgIHNldHMgSVAgZGVzdGluYXRpb24gYWRkcmVzcworCQkJICAgICAgKEJFV0FSRSEgVGhpcyBnZW5lcmF0b3IgaXMgdmVyeSBhZ2dyZXNzaXZlISkKKyAgICAgIHBnc2V0ICJkc3RtYWMgMDA6MDA6MDA6MDA6MDA6MDAiICAgIHNldHMgTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAgICAgIHBnc2V0IHN0b3AgICAgCSAgICAgIGFib3J0cyBpbmplY3Rpb24KKworICBBbHNvLCBeQyBhYm9ydHMgZ2VuZXJhdG9yLgorCistLS0tIGN1dCBoZXJlCisKKyMhIC9iaW4vc2gKKworbW9kcHJvYmUgcGczLm8KKworZnVuY3Rpb24gcGdzZXQoKSB7CisgICAgbG9jYWwgcmVzdWx0CisKKyAgICBlY2hvICQxID4gL3Byb2MvbmV0L3BnCisKKyAgICByZXN1bHQ9YGNhdCAvcHJvYy9uZXQvcGcgfCBmZ3JlcCAiUmVzdWx0OiBPSzoiYAorICAgIGlmIFsgIiRyZXN1bHQiID0gIiIgXTsgdGhlbgorCSBjYXQgL3Byb2MvbmV0L3BnIHwgZmdyZXAgUmVzdWx0OgorICAgIGZpCit9CisKK2Z1bmN0aW9uIHBnKCkgeworICAgIGVjaG8gaW5qZWN0ID4gL3Byb2MvbmV0L3BnCisgICAgY2F0IC9wcm9jL25ldC9wZworfQorCitwZ3NldCAib2RldiBldGgwIgorcGdzZXQgImRzdCAwLjAuMC4wIgorCistLS0tIGN1dCBoZXJlCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0KKyAgInBnMy5jOiB2MS4wIDAxMDgxMjogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iOworCisKKworLyogUGFyYW1ldGVycyAqLworCitjaGFyIHBnX291dGRldlszMl0sIHBnX2RzdFszMl07CitpbnQgcGt0X3NpemU9RVRIX1pMRU47CitpbnQgbmZyYWdzPTA7CitfX3UzMiBwZ19jb3VudCA9IDEwMDAwMDsgIC8qIERlZmF1bHQgTm8gcGFja2V0cyB0byBzZW5kICovCitfX3UzMiBwZ19pcGcgPSAwOyAgLyogRGVmYXVsdCBJbnRlcnBhY2tldCBnYXAgaW4gbnNlYyAqLworCisvKiBHbG9iYXIgdmFycyAqLworCitpbnQgZGVidWc7CitpbnQgZm9yY2VkX3N0b3A7CitpbnQgcGdfY3B1X3NwZWVkOworaW50IHBnX2J1c3k7CisKK3N0YXRpYyBfX3U4IGhoWzE0XSA9IHsKKyAgICAweDAwLCAweDgwLCAweEM4LCAweDc5LCAweEIzLCAweENCLAorCisgICAgLyogV2UgZmlsbCBpbiBTUkMgYWRkcmVzcyBsYXRlciAqLworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwOCwgMHgwMAorfTsKKwordW5zaWduZWQgY2hhciAqcGdfZHN0bWFjID0gaGg7CitjaGFyIHBnX3Jlc3VsdFs1MTJdOworCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcGdfc2V0dXBfaW5qZWN0KHUzMiAqc2FkZHJwKQoreworCWludCBwMSwgcDI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm9kZXY7CisJdTMyIHNhZGRyOworCisJcnRubF9sb2NrKCk7CisJb2RldiA9IF9fZGV2X2dldF9ieV9uYW1lKHBnX291dGRldik7CisJaWYgKCFvZGV2KSB7CisJCXNwcmludGYocGdfcmVzdWx0LCAiTm8gc3VjaCBuZXRkZXZpY2U6IFwiJXNcIiIsIHBnX291dGRldik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAob2Rldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpIHsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJOb3QgZXRoZXJuZXQgZGV2aWNlOiBcIiVzXCIiLCBwZ19vdXRkZXYpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7CisJCXNwcmludGYocGdfcmVzdWx0LCAiRGV2aWNlIGlzIGRvd246IFwiJXNcIiIsIHBnX291dGRldik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlmb3IocDE9NixwMj0wOyBwMSA8IG9kZXYtPmFkZHJfbGVuKzY7cDErKykKKwkJaGhbcDFdPW9kZXYtPmRldl9hZGRyW3AyKytdOworCisJc2FkZHIgPSAwOworCWlmIChvZGV2LT5pcF9wdHIpIHsKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gb2Rldi0+aXBfcHRyOworCisJCWlmIChpbl9kZXYtPmlmYV9saXN0KQorCQkJc2FkZHIgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzczsKKwl9CisJYXRvbWljX2luYygmb2Rldi0+cmVmY250KTsKKwlydG5sX3VubG9jaygpOworCisJKnNhZGRycCA9IHNhZGRyOworCXJldHVybiBvZGV2OworCitvdXRfdW5sb2NrOgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKwordTMyIGlkbGVfYWNjX2xvLCBpZGxlX2FjY19oaTsKKwordm9pZCBuYW5vc3BpbihpbnQgcGdfaXBnKQoreworCXUzMiBpZGxlX3N0YXJ0LCBpZGxlOworCisJaWRsZV9zdGFydCA9IGdldF9jeWNsZXMoKTsKKworCWZvciAoOzspIHsKKwkJYmFycmllcigpOworCQlpZGxlID0gZ2V0X2N5Y2xlcygpIC0gaWRsZV9zdGFydDsKKwkJaWYgKGlkbGUqMTAwMCA+PSBwZ19pcGcqcGdfY3B1X3NwZWVkKQorCQkJYnJlYWs7CisJfQorCWlkbGVfYWNjX2xvICs9IGlkbGU7CisJaWYgKGlkbGVfYWNjX2xvIDwgaWRsZSkKKwkJaWRsZV9hY2NfaGkrKzsKK30KKworaW50IGNhbGNfbWh6KHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgc3RhcnQsIHN0b3A7CisJdTMyIHN0YXJ0X3MsIGVsYXBzZWQ7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnN0YXJ0KTsKKwlzdGFydF9zID0gZ2V0X2N5Y2xlcygpOworCWRvIHsKKwkJYmFycmllcigpOworCQllbGFwc2VkID0gZ2V0X2N5Y2xlcygpIC0gc3RhcnRfczsKKwkJaWYgKGVsYXBzZWQgPT0gMCkKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKGVsYXBzZWQgPCAxMDAwKjUwMDAwKTsKKwlkb19nZXR0aW1lb2ZkYXkoJnN0b3ApOworCXJldHVybiBlbGFwc2VkLyhzdG9wLnR2X3VzZWMtc3RhcnQudHZfdXNlYysxMDAwMDAwKihzdG9wLnR2X3NlYy1zdGFydC50dl9zZWMpKTsKK30KKworc3RhdGljIHZvaWQgY3ljbGVzX2NhbGlicmF0ZSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCWludCByZXMgPSBjYWxjX21oeigpOworCQlpZiAocmVzID4gcGdfY3B1X3NwZWVkKQorCQkJcGdfY3B1X3NwZWVkID0gcmVzOworCX0KK30KKworc3RydWN0IHNrX2J1ZmYgKgorZmlsbF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKm9kZXYsIF9fdTMyIHNhZGRyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCAqZXRoOworCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CisJaW50IGRhdGFsZW4sIGlwbGVuOworCXN0cnVjdCBpcGhkciAqaXBoOworCisJc2tiID0gYWxsb2Nfc2tiKHBrdF9zaXplKzY0KzE2LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk5vIG1lbW9yeSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2JfcmVzZXJ2ZShza2IsIDE2KTsKKworCS8qICBSZXNlcnZlIGZvciBldGhlcm5ldCBhbmQgSVAgaGVhZGVyICAqLworCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOworCWlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYl9wdXQoc2tiLCBzaXplb2YoIHN0cnVjdCBpcGhkcikpOworCXVkcGggPSAoc3RydWN0IHVkcGhkciopc2tiX3B1dChza2IsIHNpemVvZiggc3RydWN0IHVkcGhkcikpOworCisJLyogIENvcHkgdGhlIGV0aGVybmV0IGhlYWRlciAgKi8KKwltZW1jcHkoZXRoLCBoaCwgMTQpOworCisJZGF0YWxlbiA9IHBrdF9zaXplLTE0LTIwLTg7IC8qIEV0aCArIElQaCArIFVEUGggKi8KKwlpZiAoZGF0YWxlbiA8IDApCisJCWRhdGFsZW4gPSAwOworCisJdWRwaC0+c291cmNlPSBodG9ucyg5KTsKKwl1ZHBoLT5kZXN0PSBodG9ucyg5KTsKKwl1ZHBoLT5sZW49IGh0b25zKGRhdGFsZW4rOCk7IC8qIERBVEEgKyB1ZHBoZHIgKi8KKwl1ZHBoLT5jaGVjaz0wOyAgLyogTm8gY2hlY2tzdW0gKi8KKworCWlwaC0+aWhsPTU7CisJaXBoLT52ZXJzaW9uPTQ7CisJaXBoLT50dGw9MzsKKwlpcGgtPnRvcz0wOworCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX1VEUDsgLyogVURQICovCisJaXBoLT5zYWRkciA9ICBzYWRkcjsKKwlpcGgtPmRhZGRyID0gIGluX2F0b24ocGdfZHN0KTsKKwlpcGgtPmZyYWdfb2ZmID0gMDsKKwlpcGxlbiA9IDIwICsgOCArIGRhdGFsZW47CisJaXBoLT50b3RfbGVuID0gaHRvbnMoaXBsZW4pOworCWlwaC0+Y2hlY2sgPSAwOworCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHZvaWQgKilpcGgsIGlwaC0+aWhsKTsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7CisJc2tiLT5tYWMucmF3ID0gKCh1OCopaXBoKSAtIDE0OworCXNrYi0+ZGV2ID0gb2RldjsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisKKwlpZiAobmZyYWdzPD0wKSB7CisJCXNrYl9wdXQoc2tiLCBkYXRhbGVuKTsKKwl9IGVsc2UgeworCQlpbnQgZnJhZ3MgPSBuZnJhZ3M7CisJCWludCBpOworCisJCWlmIChmcmFncyA+IE1BWF9TS0JfRlJBR1MpCisJCQlmcmFncyA9IE1BWF9TS0JfRlJBR1M7CisJCWlmIChkYXRhbGVuID4gZnJhZ3MqUEFHRV9TSVpFKSB7CisJCQlza2JfcHV0KHNrYiwgZGF0YWxlbi1mcmFncypQQUdFX1NJWkUpOworCQkJZGF0YWxlbiA9IGZyYWdzKlBBR0VfU0laRTsKKwkJfQorCisJCWkgPSAwOworCQl3aGlsZSAoZGF0YWxlbiA+IDApIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UgPSBwYWdlOworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCA9IDA7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPSAoZGF0YWxlbiA8IFBBR0VfU0laRSA/IGRhdGFsZW4gOiBQQUdFX1NJWkUpOworCQkJZGF0YWxlbiAtPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCQlza2ItPmxlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCQlza2ItPmRhdGFfbGVuICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJCWkrKzsKKwkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOworCQl9CisKKwkJd2hpbGUgKGkgPCBmcmFncykgeworCQkJaW50IHJlbTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlicmVhazsKKworCQkJcmVtID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdLnNpemUvMjsKKwkJCWlmIChyZW0gPT0gMCkKKwkJCQlicmVhazsKKworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdLnNpemUgLT0gcmVtOworCisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdOworCQkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaS0xXS5wYWdlOworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ktMV0uc2l6ZTsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9IHJlbTsKKwkJCWkrKzsKKwkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOworCQl9CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworCitzdGF0aWMgdm9pZCBwZ19pbmplY3Qodm9pZCkKK3sKKwl1MzIgc2FkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm9kZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgdGltZXZhbCBzdGFydCwgc3RvcDsKKwl1MzIgdG90YWwsIGlkbGU7CisJaW50IHBjLCBsY291bnQ7CisKKwlvZGV2ID0gcGdfc2V0dXBfaW5qZWN0KCZzYWRkcik7CisJaWYgKCFvZGV2KQorCQlyZXR1cm47CisKKwlza2IgPSBmaWxsX3BhY2tldChvZGV2LCBzYWRkcik7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlnb3RvIG91dF9yZWxkZXY7CisKKwlmb3JjZWRfc3RvcCA9IDA7CisJaWRsZV9hY2NfaGkgPSAwOworCWlkbGVfYWNjX2xvID0gMDsKKwlwYyA9IDA7CisJbGNvdW50ID0gcGdfY291bnQ7CisJZG9fZ2V0dGltZW9mZGF5KCZzdGFydCk7CisKKwlmb3IoOzspIHsKKwkJc3Bpbl9sb2NrX2JoKCZvZGV2LT54bWl0X2xvY2spOworCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKKwkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpKSB7CisJCQlpZiAob2Rldi0+aGFyZF9zdGFydF94bWl0KHNrYiwgb2RldikpIHsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJIYXJkIHhtaXQgZXJyb3JcbiIpOworCQkJfQorCQkJcGMrKzsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZvZGV2LT54bWl0X2xvY2spOworCisJCWlmIChwZ19pcGcpCisJCQluYW5vc3BpbihwZ19pcGcpOworCQlpZiAoZm9yY2VkX3N0b3ApCisJCQlnb3RvIG91dF9pbnRyOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIG91dF9pbnRyOworCisJCWlmICgtLWxjb3VudCA9PSAwKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpICE9IDEpIHsKKwkJCQl1MzIgaWRsZV9zdGFydCwgaWRsZTsKKworCQkJCWlkbGVfc3RhcnQgPSBnZXRfY3ljbGVzKCk7CisJCQkJd2hpbGUgKGF0b21pY19yZWFkKCZza2ItPnVzZXJzKSAhPSAxKSB7CisJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQkJCWdvdG8gb3V0X2ludHI7CisJCQkJCXNjaGVkdWxlKCk7CisJCQkJfQorCQkJCWlkbGUgPSBnZXRfY3ljbGVzKCkgLSBpZGxlX3N0YXJ0OworCQkJCWlkbGVfYWNjX2xvICs9IGlkbGU7CisJCQkJaWYgKGlkbGVfYWNjX2xvIDwgaWRsZSkKKwkJCQkJaWRsZV9hY2NfaGkrKzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQob2RldikgfHwgY3VycmVudC0+bmVlZF9yZXNjaGVkKSB7CisJCQl1MzIgaWRsZV9zdGFydCwgaWRsZTsKKworCQkJaWRsZV9zdGFydCA9IGdldF9jeWNsZXMoKTsKKwkJCWRvIHsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWdvdG8gb3V0X2ludHI7CisJCQkJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKQorCQkJCQlnb3RvIG91dF9pbnRyOworCQkJCWlmIChjdXJyZW50LT5uZWVkX3Jlc2NoZWQpCisJCQkJCXNjaGVkdWxlKCk7CisJCQkJZWxzZQorCQkJCQlkb19zb2Z0aXJxKCk7CisJCQl9IHdoaWxlIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpKTsKKwkJCWlkbGUgPSBnZXRfY3ljbGVzKCkgLSBpZGxlX3N0YXJ0OworCQkJaWRsZV9hY2NfbG8gKz0gaWRsZTsKKwkJCWlmIChpZGxlX2FjY19sbyA8IGlkbGUpCisJCQkJaWRsZV9hY2NfaGkrKzsKKwkJfQorCX0KKworCWRvX2dldHRpbWVvZmRheSgmc3RvcCk7CisKKwl0b3RhbCA9IChzdG9wLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykqMTAwMDAwMCArCisJCXN0b3AudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWM7CisKKwlpZGxlID0gKCgoaWRsZV9hY2NfaGk8PDIwKS9wZ19jcHVfc3BlZWQpPDwxMikraWRsZV9hY2NfbG8vcGdfY3B1X3NwZWVkOworCisJaWYgKDEpIHsKKwkJY2hhciAqcCA9IHBnX3Jlc3VsdDsKKworCQlwICs9IHNwcmludGYocCwgIk9LOiAldShjJXUrZCV1KSB1c2VjLCAldSAoJWRieXRlLCVkZnJhZ3MpICV1cHBzICV1TUIvc2VjIiwKKwkJCSAgICAgdG90YWwsIHRvdGFsLWlkbGUsIGlkbGUsCisJCQkgICAgIHBjLCBza2ItPmxlbiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywKKwkJCSAgICAgKChwYyoxMDAwKS8odG90YWwvMTAwMCkpLAorCQkJICAgICAoKChwYyoxMDAwKS8odG90YWwvMTAwMCkpKnBrdF9zaXplKS8xMDI0LzEwMjQKKwkJCSAgICAgKTsKKwl9CisKK291dF9yZWxza2I6CisJa2ZyZWVfc2tiKHNrYik7CitvdXRfcmVsZGV2OgorCWRldl9wdXQob2Rldik7CisJcmV0dXJuOworCitvdXRfaW50cjoKKwlzcHJpbnRmKHBnX3Jlc3VsdCwgIkludGVycnVwdGVkIik7CisJZ290byBvdXRfcmVsc2tiOworfQorCisvKiBwcm9jL25ldC9wZyAqLworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZ19wcm9jX2VudCA9IDA7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZ19idXN5X3Byb2NfZW50ID0gMDsKKworaW50IHByb2NfcGdfYnVzeV9yZWFkKGNoYXIgKmJ1ZiAsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgICAgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwOworCisJcCA9IGJ1ZjsKKwlwICs9IHNwcmludGYocCwgIiVkXG4iLCBwZ19idXN5KTsKKwkqZW9mID0gMTsKKworCXJldHVybiBwLWJ1ZjsKK30KKworaW50IHByb2NfcGdfcmVhZChjaGFyICpidWYgLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgKnA7CisJaW50IGk7CisKKwlwID0gYnVmOworCXAgKz0gc3ByaW50ZihwLCAiUGFyYW1zOiBjb3VudD0ldSBwa3Rfc2l6ZT0ldSBmcmFncyAlZCBpcGcgJXUgb2RldiBcIiVzXCIgZHN0ICVzIGRzdG1hYyAiLAorCQkgICAgIHBnX2NvdW50LCBwa3Rfc2l6ZSwgbmZyYWdzLCBwZ19pcGcsCisJCSAgICAgcGdfb3V0ZGV2LCBwZ19kc3QpOworCWZvcihpPTA7aTw2O2krKykKKwkJcCArPSBzcHJpbnRmKHAsICIlMDJYJXMiLCBwZ19kc3RtYWNbaV0sIGkgPT0gNSA/ICJcbiIgOiAiOiIpOworCisJaWYocGdfcmVzdWx0WzBdKQorCQlwICs9IHNwcmludGYocCwgIlJlc3VsdDogJXNcbiIsIHBnX3Jlc3VsdCk7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIlJlc3VsdDogSWRsZVxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIHAtYnVmOworfQorCitpbnQgY291bnRfdHJhaWxfY2hhcnMoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbWF4bGVuKQoreworCWludCBpOworCisJZm9yKGk9MDsgaTxtYXhsZW47aSsrKSB7CisJCXN3aXRjaChidWZmZXJbaV0pIHsKKwkJY2FzZSAnXCInOgorCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJY2FzZSAnXHQnOgorCQljYXNlICcgJzoKKwkJY2FzZSAnPSc6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KK2RvbmU6CisJcmV0dXJuIGk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbnVtX2FyZyhjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4bGVuLAorCQkgICAgICB1bnNpZ25lZCBsb25nICpudW0pCit7CisJaW50IGk9MDsKKwkqbnVtID0gMDsKKworCWZvcig7IGk8bWF4bGVuO2krKykgeworCQlpZiggKGJ1ZmZlcltpXSA+PSAnMCcpICYmIChidWZmZXJbaV0gPD0gJzknKSkgeworCQkJKm51bSAqPSAxMDsKKwkJCSpudW0gKz0gYnVmZmVyW2ldIC0nMCc7CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpOworfQorCitpbnQgc3Rybl9sZW4oY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbWF4bGVuKQoreworCWludCBpPTA7CisKKwlmb3IoOyBpPG1heGxlbjtpKyspCisJCXN3aXRjaChidWZmZXJbaV0pIHsKKwkJY2FzZSAnXCInOgorCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJY2FzZSAnXHQnOgorCQljYXNlICcgJzoKKwkJCWdvdG8gZG9uZV9zdHI7CisJCWRlZmF1bHQ6CisJCX0KK2RvbmVfc3RyOgorCXJldHVybiBpOworfQorCitpbnQgcHJvY19wZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJaW50IGk9MCwgbWF4LCBsZW47CisJY2hhciBuYW1lWzE2XSwgdmFsc3RyWzMyXTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKworCWlmIChjb3VudCA8IDEpIHsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJXcm9uZyBjb21tYW5kIGZvcm1hdCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXggPSBjb3VudCAtaTsKKwlpICs9IGNvdW50X3RyYWlsX2NoYXJzKCZidWZmZXJbaV0sIG1heCk7CisKKwkvKiBSZWFkIHZhcmlhYmxlIG5hbWUgKi8KKworCWxlbiA9IHN0cm5fbGVuKCZidWZmZXJbaV0sIHNpemVvZihuYW1lKS0xKTsKKwltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKKwlzdHJuY3B5KG5hbWUsICZidWZmZXJbaV0sIGxlbik7CisJaSArPSBsZW47CisKKwltYXggPSBjb3VudCAtaTsKKwlsZW4gPSBjb3VudF90cmFpbF9jaGFycygmYnVmZmVyW2ldLCBtYXgpOworCWkgKz0gbGVuOworCisJaWYgKGRlYnVnKQorCQlwcmludGsoInBnOiAlcywlbHVcbiIsIG5hbWUsIGNvdW50KTsKKworCS8qIE9ubHkgc3RvcCBpcyBhbGxvd2VkIHdoZW4gd2UgYXJlIHJ1bm5pbmcgKi8KKworCWlmKCFzdHJjbXAobmFtZSwgInN0b3AiKSkgeworCQlmb3JjZWRfc3RvcD0xOworCQlpZiAocGdfYnVzeSkKKwkJCXN0cmNweShwZ19yZXN1bHQsICJTdG9wcGluZyIpOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJaWYgKHBnX2J1c3kpIHsKKwkJc3RyY3B5KHBnX3Jlc3VsdCwgIkJ1c3kiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoIXN0cmNtcChuYW1lLCAicGt0X3NpemUiKSkgeworCQlsZW4gPSBudW1fYXJnKCZidWZmZXJbaV0sIDEwLCAmdmFsdWUpOworCQlpICs9IGxlbjsKKwkJaWYgKHZhbHVlIDwgMTQrMjArOCkKKwkJCXZhbHVlID0gMTQrMjArODsKKwkJcGt0X3NpemUgPSB2YWx1ZTsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogcGt0X3NpemU9JXUiLCBwa3Rfc2l6ZSk7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYoIXN0cmNtcChuYW1lLCAiZnJhZ3MiKSkgeworCQlsZW4gPSBudW1fYXJnKCZidWZmZXJbaV0sIDEwLCAmdmFsdWUpOworCQlpICs9IGxlbjsKKwkJbmZyYWdzID0gdmFsdWU7CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZyYWdzPSV1IiwgbmZyYWdzKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZighc3RyY21wKG5hbWUsICJpcGciKSkgeworCQlsZW4gPSBudW1fYXJnKCZidWZmZXJbaV0sIDEwLCAmdmFsdWUpOworCQlpICs9IGxlbjsKKwkJcGdfaXBnID0gdmFsdWU7CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGlwZz0ldSIsIHBnX2lwZyk7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYoIXN0cmNtcChuYW1lLCAiY291bnQiKSkgeworCQlsZW4gPSBudW1fYXJnKCZidWZmZXJbaV0sIDEwLCAmdmFsdWUpOworCQlpICs9IGxlbjsKKwkJcGdfY291bnQgPSB2YWx1ZTsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogY291bnQ9JXUiLCBwZ19jb3VudCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYoIXN0cmNtcChuYW1lLCAib2RldiIpKSB7CisJCWxlbiA9IHN0cm5fbGVuKCZidWZmZXJbaV0sIHNpemVvZihwZ19vdXRkZXYpLTEpOworCQltZW1zZXQocGdfb3V0ZGV2LCAwLCBzaXplb2YocGdfb3V0ZGV2KSk7CisJCXN0cm5jcHkocGdfb3V0ZGV2LCAmYnVmZmVyW2ldLCBsZW4pOworCQlpICs9IGxlbjsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogb2Rldj0lcyIsIHBnX291dGRldik7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYoIXN0cmNtcChuYW1lLCAiZHN0IikpIHsKKwkJbGVuID0gc3Rybl9sZW4oJmJ1ZmZlcltpXSwgc2l6ZW9mKHBnX2RzdCktMSk7CisJCW1lbXNldChwZ19kc3QsIDAsIHNpemVvZihwZ19kc3QpKTsKKwkJc3RybmNweShwZ19kc3QsICZidWZmZXJbaV0sIGxlbik7CisJCWlmKGRlYnVnKQorCQkJcHJpbnRrKCJwZzogZHN0IHNldCB0bzogJXNcbiIsIHBnX2RzdCk7CisJCWkgKz0gbGVuOworCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3Q9JXMiLCBwZ19kc3QpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmKCFzdHJjbXAobmFtZSwgImRzdG1hYyIpKSB7CisJCWNoYXIgKnYgPSB2YWxzdHI7CisJCXVuc2lnbmVkIGNoYXIgKm0gPSBwZ19kc3RtYWM7CisKKwkJbGVuID0gc3Rybl9sZW4oJmJ1ZmZlcltpXSwgc2l6ZW9mKHZhbHN0ciktMSk7CisJCW1lbXNldCh2YWxzdHIsIDAsIHNpemVvZih2YWxzdHIpKTsKKwkJc3RybmNweSh2YWxzdHIsICZidWZmZXJbaV0sIGxlbik7CisJCWkgKz0gbGVuOworCisJCWZvcigqbSA9IDA7KnYgJiYgbSA8IHBnX2RzdG1hYys2O3YrKykgeworCQkJaWYoKnYgPj0gJzAnICYmICp2IDw9ICc5JykgeworCQkJCSptICo9IDE2OworCQkJCSptICs9ICp2IC0gJzAnOworCQkJfQorCQkJaWYoKnYgPj0gJ0EnICYmICp2IDw9ICdGJykgeworCQkJCSptICo9IDE2OworCQkJCSptICs9ICp2IC0gJ0EnICsgMTA7CisJCQl9CisJCQlpZigqdiA+PSAnYScgJiYgKnYgPD0gJ2YnKSB7CisJCQkJKm0gKj0gMTY7CisJCQkJKm0gKz0gKnYgLSAnYScgKyAxMDsKKwkJCX0KKwkJCWlmKCp2ID09ICc6JykgeworCQkJCW0rKzsKKwkJCQkqbSA9IDA7CisJCQl9CisJCX0KKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0bWFjIik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlpZiAoIXN0cmNtcChuYW1lLCAiaW5qZWN0IikgfHwgIXN0cmNtcChuYW1lLCAic3RhcnQiKSApIHsKKwkJTU9EX0lOQ19VU0VfQ09VTlQ7CisJCXBnX2J1c3kgPSAxOworCQlzdHJjcHkocGdfcmVzdWx0LCAiU3RhcnRpbmciKTsKKwkJcGdfaW5qZWN0KCk7CisJCXBnX2J1c3kgPSAwOworCQlNT0RfREVDX1VTRV9DT1VOVDsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCXNwcmludGYocGdfcmVzdWx0LCAiTm8gc3VjaCBwYXJhbWV0ZXIgXCIlc1wiIiwgbmFtZSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcGdfaW5pdCh2b2lkKQoreworCXByaW50ayh2ZXJzaW9uKTsKKwljeWNsZXNfY2FsaWJyYXRlKCk7CisJaWYgKHBnX2NwdV9zcGVlZCA9PSAwKSB7CisJCXByaW50aygicGczOiBFcnJvcjogeW91ciBtYWNoaW5lIGRvZXMgbm90IGhhdmUgd29ya2luZyBjeWNsZSBjb3VudGVyLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZighcGdfcHJvY19lbnQpIHsKKwkJcGdfcHJvY19lbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgibmV0L3BnIiwgMDYwMCwgMCk7CisJCWlmIChwZ19wcm9jX2VudCkgeworCQkJcGdfcHJvY19lbnQtPnJlYWRfcHJvYyA9IHByb2NfcGdfcmVhZDsKKwkJCXBnX3Byb2NfZW50LT53cml0ZV9wcm9jID0gcHJvY19wZ193cml0ZTsKKwkJCXBnX3Byb2NfZW50LT5kYXRhID0gMDsKKwkJfQorCQlwZ19idXN5X3Byb2NfZW50ID0gY3JlYXRlX3Byb2NfZW50cnkoIm5ldC9wZ19idXN5IiwgMCwgMCk7CisJCWlmIChwZ19idXN5X3Byb2NfZW50KSB7CisJCQlwZ19idXN5X3Byb2NfZW50LT5yZWFkX3Byb2MgPSBwcm9jX3BnX2J1c3lfcmVhZDsKKwkJCXBnX2J1c3lfcHJvY19lbnQtPmRhdGEgPSAwOworCQl9CisJfQorCXJldHVybiAwOworfQorCit2b2lkIHBnX2NsZWFudXAodm9pZCkKK3sKKwlpZiAocGdfcHJvY19lbnQpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm5ldC9wZyIsIE5VTEwpOworCQlwZ19wcm9jX2VudCA9IDA7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJuZXQvcGdfYnVzeSIsIE5VTEwpOworCQlwZ19idXN5X3Byb2NfZW50ID0gMDsKKwl9Cit9CisKK21vZHVsZV9pbml0KHBnX2luaXQpOworbW9kdWxlX2V4aXQocGdfY2xlYW51cCk7CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MjAxMTgKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBPbHNzb24gPHJvYmVydC5vbHNzb25AaXRzLnV1LnNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBhY2tldCBHZW5lcmF0b3IgdG9vbCIpOworTU9EVUxFX1BBUk0ocGdfY291bnQsICJpIik7CitNT0RVTEVfUEFSTShwZ19pcGcsICJpIik7CitNT0RVTEVfUEFSTShwZ19jcHVfc3BlZWQsICJpIik7CisjZW5kaWYKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1jIHBnMy5jIgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9pcHV0aWxzL05PVElDRSBiL2lwdXRpbHMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YmRmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL05PVElDRQpAQCAtMCwwICsxLDMzIEBACitDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1RoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKK01pa2UgTXV1c3MuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCis0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCitPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCitMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCitTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL2lwdXRpbHMvUkVMTk9URVMgYi9pcHV0aWxzL1JFTE5PVEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2ZjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL1JFTE5PVEVTCkBAIC0wLDAgKzEsNjY3IEBACitbczIwMTIxMjIxXQorCitZT1NISUZVSkkgSGlkZWFraSAoMTQpOgorICAgICAgbmluZm9kOiBVc2UgdW5zaWduZWQgaW50IGZvciBkaWdlc3QuCisgICAgICBuaW5mb2Q6IG5hbm9zbGVlcCgzKSBuZWVkcyA8dGltZS5oPi4KKyAgICAgIG5pbmZvZDogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBzeXNsb2coMykvZnByaW50ZigzKSB2aWEgREVCVUcoKS4KKyAgICAgIG5pbmZvZDogRml4IHNldmVyYWwgd2FybmluZ3Mgb24gdW51bnNlZCB2YXJpYWJsZXMuCisgICAgICBwaW5nNjogUHJpbnQgdW5rbm93biBJQ01QIHR5cGUuCisgICAgICBwaW5nNjogRml4IGZsb3dsYWJlbCBzd2l0Y2ggKC1GIG9wdGlvbikuCisgICAgICBhcnBpbmc6IEZpeCBzeXNmcyBkZWNpbWFsL2hleGFkZWNpbWFsIHBhcnNlciBmb3IgbGlic3lzZnMgc3VwcG9ydC4KKyAgICAgIHBpbmc2OiBVc2UgR05VIFRMUyBieSBkZWZhdWx0LgorICAgICAgbmluZm9kOiBGaXggbWVtb3J5IGxlYWthZ2UgaW4gZXJyb3IgcGF0aC4KKyAgICAgIG5pbmZvZDogRml4IG9mZi1ieS1vbmUgZXJyb3IgdG8gY2hlY2sgcG9zc2libGUgcHJvZ3JhbW1pbmcgZXJyb3IgKGFnYWluKS4KKyAgICAgIG5pbmZvZDogRG8gbm90IGV4cG9zZSBmcmVlZCBidWZmZXIgdG8gY2FsbGVyLgorICAgICAgcGluZzY6IEVuc3VyZSB0byBpbml0aWFsaXplIG1zZ2hkci4KKyAgICAgIG5pbmZvZDogU3VwcG9ydCBHTlUgVExTLgorICAgICAgbmluZm9kOiBBbGxvdyBwcmludGluZyB1c2FnZSB3aXRob3V0IHBlcm1pc3Npb24gZXJyb3JzLgorCisKK1tzMjAxMjEyMDddCisKK1lPU0hJRlVKSSBIaWRlYWtpICgyKToKKyAgICAgIFJFTE5PVEVTOiBUeXBvcy4KKyAgICAgIHBpbmcscGluZzY6IENoZWNrIG91dGdvaW5nIGRldmljZSBvbmx5IGlmIHNwZWNpZmllZC4KKworCitbczIwMTIxMjA1XQorCitKYW4gU3luYWNlayAoMSk6CisgICAgICBwaW5nLHRyYWNlcGF0aCBkb2M6IEZpeCBtaXNzaW5nIGVuZCB0YWdzLgorCitZT1NISUZVSkkgSGlkZWFraSAoMzUpOgorICAgICAgdHJhY2VwYXRoNjogcGFja2V0IGxlbmd0aCBvcHRpb24gKC1sKSBkaWQgbm90IGhhdmUgYW55IGVmZmVjdC4KKyAgICAgIHRyYWNlcGF0aCx0cmFjZXBhdGg2OiBGaXggcGt0bGVuIG1lc3NhZ2UuCisgICAgICB0cmFjZXBhdGgsdHJhY2VwYXRoNjogVXNlIGNhbGxvYygzKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrLgorICAgICAgdHJhY2VwYXRoNjogSWdub3JlIGZhbWlsaWVzIG90aGVyIHRoYW4gSVB2NCBhbmQgSVB2Ni4KKyAgICAgIHBpbmc2OiBJbXByb3ZlIHJhbmRvbW5lc3Mgb2YgTkkgTm9uY2UuCisgICAgICB0cmFjZXBhdGgsdHJhY2VwYXRoNiBkb2M6IEZpeCBkZWZhdWx0IHBrdGxlbi4KKyAgICAgIHBpbmcscmRpc2M6IE9wdGltaXplIGNoZWNrc3VtbWluZy4KKyAgICAgIG1ha2VmaWxlOiBTdGF0aWMgbGluayBzdXBwb3J0IGZvciBjcnlwdG8sIHJlc29sdiwgY2FwIGFuZCBzeXNmcy4KKyAgICAgIGRvYzogQWpkdXN0IHNwYWNlcyBhcm91bmQgc3FhcmUgYnJhY2tldHMuCisgICAgICBwaW5nLHJkaXNjOiBVc2UgbWFjcm8gdG8gZ2V0IG9kZCBieXRlIHdoZW4gY2hlY2tzdW1taW5nLgorICAgICAgcGluZzY6IERvIG5vdCB0cnkgdG8gZnJlZSBtZW1vcnkgcG9pbnRlZCBieSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG9uIGVycm9yIHBhdGguCisgICAgICBhcnBpbmc6IEFsbG93IGJ1aWxkaW5nIHdpdGhvdXQgZGVmYXVsdCBpbnRlcmZhY2UuCisgICAgICBhcnBpbmc6IE5vIGRlZmF1bHQgaW50ZXJmYWNlIGJ5IGRlZmF1bHQuCisgICAgICBhcnBpbmc6IEFsbG93IHByaW50aW5nIHVzYWdlIHdpdGhvdXQgcGVybWlzc2lvbiBlcnJvcnMuCisgICAgICBwaW5nLHBpbmc2OiBBbGxvdyBwcmludGluZyB1c2FnZSB3aXRob3V0IHBlcm1pc3Npb24gZXJyb3JzLgorICAgICAgcGluZyxwaW5nNjogRml4IGNhcF90IGxlYWthZ2UuCisgICAgICBhcnBpbmcscGluZyxwaW5nNjogRG8gbm90IGlkZW9sb2dpY2FsbHkgY2hlY2sgcmV0dXJuIHZhbHVlIGZyb20gY2FwX2ZyZWUsY2FwX3tzZXQsZ2V0fV9mbGFnKCkuCisgICAgICBhcnBpbmc6IEZpeCBzeXNmc19jbGFzcyBsZWFrYWdlIG9uIGVycm9yIHBhdGguCisgICAgICBhcnBpbmc6IFNvbWUgY29tbWVudHMgZm9yIG5ldyBmdW5jdGlvbnMgZm9yIGZpbmRpbmcgZGV2aWNlcyBzdXBwb3J0LgorICAgICAgYXJwaW5nOiBUeXBvIGluIHR5cGUgZGVjbGFyYXRpb24uCisgICAgICBtYWtlZmlsZTogVXNlIGNhbGwgZnVuY3Rpb24gZm9yIGV4dGVybmFsIGxpYnJhcmllcy4KKyAgICAgIG1ha2VmaWxlOiBBZGQgbW9yZSBjb21tZW50cy4KKyAgICAgIGFycGluZzogRW5zdXJlIHRvIGZhaWwgaWYgbm8gYXBwcm9wcmlhdGUgZGV2aWNlIGZvdW5kIHdpdGggc3lzZnMuCisgICAgICBhcnBpbmc6IEVuZm9yY2UgdXNlciB0byBzcGVjaWZ5IGRldmljZSAoLUkpIGlmIG11bHRpcGxlIGRldmljZXMgZm91bmQuCisgICAgICBNYWtlZmlsZTogcGFyYW1ldGVyaXplIG9wdGlvbnMgZm9yIGxpbmtpbmcgbGlicmFyaWVzLgorICAgICAgTWFrZWZpbGU6IFVzZSBzaGVsbCBmdW5jdGlvbiBpbnN0ZWFkIGlmIGJhY2txdW90ZXMuCisgICAgICBNYWtlZmlsZTogRW5zdXJlIHRvIGhhdmUgc2FtZSBkYXRlIHdoZW4gbWFraW5nIHNuYXBzaG90LgorICAgICAgc3BlYzogTWFpbnRhaW5lciBkb2VzIG5vdCB1c2UgaXBzZWMuc3BlYy4KKyAgICAgIHNwZWM6IHBhcnRpYWxseSBzeW5jIHdpdGggZmVkb3JhLgorICAgICAgTWFrZWZpbGU6IEJ1bXAgZGF0ZSBpbiBpcHV0aWxzLnNwZWMgYXMgd2VsbC4KKyAgICAgIHNwZWM6IEFkZCBleG1wbGUgbGluZXMgZm9yIHN1aWQtcm9vdCBpbnN0YWxsYXRpb24KKyAgICAgIHNwZWM6IFNvcnQgY2hhbmdlbG9nLgorICAgICAgcGluZzogRXhpdCBvbiBTT19CSU5EVE9ERVZJQ0UgZmFpbHVyZS4KKyAgICAgIHBpbmc6IFdhcm4gaWYga2VybmVsIGhhcyBzZWxlY3RlZCBzb3VyY2UgYWRkcmVzcyBmcm9tIG90aGVyIGludGVyZmFjZS4KKyAgICAgIHBpbmc6IENsYXJpZnkgZGlmZmVyZW5jZSBiZXR3ZWVuIC1JIGRldmljZSBhbmQgLUkgYWRkci4KKworCitbczIwMTIxMTI2XQorCitZT1NISUZVSkkgSGlkZWFraSAoNSk6CisgICAgICB0cmFjZXBhdGg6IFJlcGFpciB0cmFjZXBhdGggd2l0aG91dCAtcCBvcHRpb24uCisgICAgICB0cmFjZXBhdGgsdHJhY2VwYXRoNjogLXAgb3B0aW9uIGluIHVzYWdlLgorICAgICAgcGluZyxwaW5nNjogVXNlIE1BWF9EVVBfQ0hLIGRpcmVjdGx5LCBub3QgdXNpbmcgbXhfZHVwX2NoayB2YXJpYWJsZS4KKyAgICAgIHBpbmcscGluZzY6IEFic3RyYWN0IHJlY2VpdmVkIGJpdG1hcCBtYWNyb3MvZGVmaW5pdGlvbnMuCisgICAgICBwaW5nLHBpbmc2OiBVc2UgX191NjQgb3IgX191MzIgZm9yIGJpdG1hcC4KKworCitbczIwMTIxMTI1XQorCitZT1NISUZVSkkgSGlkZWFraSAoMzApOgorICAgICAgcGluZzY6IFVzZSBJTjZfSVNfQUREUl9VTlNQRUNJRklFRCgpIGluc3RlYWQgb2Ygb3VyIG93biBoZWxwZXIgZnVuY3Rpb24uCisgICAgICBwaW5nNiBkb2M6IEV4cGxpY2l0bHkgZGVzY3JpYmUgcGluZzYgaXMgSVB2NiB2ZXJzaW9uIGlmIHBpbmcuCisgICAgICBwaW5nNjogRGVwcmVjYXRlIHNvdXJjZSByb3V0aW5nIGJ5IGRlZmF1bHQgKFJGQzUwOTUpLgorICAgICAgcGluZzY6IFVzZSBSRkMzNTQyIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbiBmb3Igc291cmNlIHJvdXRpbmcuCisgICAgICBwaW5nNjogSW50cm9kdWNlIG5pcXVlcnlfaXNfZW5hYmxlZCgpIGZvciByZWFkYWJpbGl0eS4KKyAgICAgIGFycGluZyBkb2M6IGludGVyZmFjZSBpcyBvcHRpb25hbCAoLUkgb3B0aW9uKS4KKyAgICAgIHBpbmc6IEVsaW1pbmF0ZSBkaXJ0eSBoYWNrIHRvIGNvcGUgd2l0aCBhbmNpZW50IGVnY3MgYnVnLgorICAgICAgTWFrZWZpbGU6IEZpeCBtaXNzaW5nIHJpZ2h0IHBhcmVudGhlcyBpbiBjb21tZW50LgorICAgICAgYXJwaW5nOiBGaXggYnVpbGQgZmFpbHVyZSB3aXRoIFVTRV9TWVNGUz15ZXMgYW5kL29yIFdJVEhPVVRfSUZBRERSUz15ZXMKKyAgICAgIGFycGluZzogVW5pZnkgc291cmNlIGZpbGVzLgorICAgICAgYXJwaW5nOiBSZW9yZGVyIGZ1bmN0aW9ucyBhbmQgY29tbWVudCBvdXQgdW5zdWVkIGNvZGUuCisgICAgICBhcnBpbmcscGluZyxwaW5nNix0cmFjZXBhdGgsdHJhY2Vyb3V0ZTYgTWFrZWZpbGU6IFN1cHBvcnQgc3RhdGljIGxpbmsgb2YgbGliaWRuIGJ5IFVTRV9JRE49c3RhdGljLgorICAgICAgTWFrZWZpbGU6IE1pbmltaXplIHN0YXRpY2FsbHkgbGlua2VkIGxpYnJhcmllcy4KKyAgICAgIHBpbmc2OiBEbyBub3QgY2xlYXIgc2VxIGNoZWNrIGFycmF5IHR3aWNlIGZvciBOSS4KKyAgICAgIHBpbmc2OiBVc2UgTUQ1X0RJR0VTVF9MRU5HVEggaW5zdGVhZCBvZiBtYWdpYyB2YWx1ZSAxNi4KKyAgICAgIHBpbmc2OiBJbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucyBmb3Igbm9uY2UgaW4gTkkuCisgICAgICBwaW5nNjogSW50cm9kdWNlIE5JX05PTkNFX1NJWkUgbWFjcm8gaW5zdGVhZCBvZiBtYWdpYyB2YWx1ZSA4LgorICAgICAgcGluZzY6IEVuc3VyZSB0byBjYWxsIHNyYW5kKCkgdG8gZ2V0IHNvbWUgcmFuZG9tbmVzcyBpbiBOSSBOb25jZS4KKyAgICAgIHBpbmc2OiBHZW5lcmF0ZSBkaWZmZXJlbnQgTkkgTm9uY2UgaW4gZWFjaCBOSSBRdWVyeSAoTWVtb3J5IHZlcnNpb24pLgorICAgICAgcGluZzY6IEdlbmVyYXRlIGRpZmZlcmVudCBOSSBOb25jZSBpbiBlYWNoIE5JIFF1ZXJ5IChNRDUgdmVyc2lvbikuCisgICAgICBwaW5nNjogQ2FjaGUgTkkgTm9uY2UuCisgICAgICBwaW5nNjogUHJpbnQgJ3NlcXVlbmNlIG51bWJlcicgZW1iZWRkZWQgaW4gTkkgTm9uY2UuCisgICAgICBuaW5mb2Q6IERvIG5veSB0cnkgdG8gbWVtY3B5IHRvIHNlbGYuCisgICAgICBuaW5mb2QgTWFrZWZpbGU6IE1vcmUgcHJlY2lzZSBkZXBlbmRlbmNpZXMuCisgICAgICBuaW5mb2Q6IERpc2NhcmQgbXVsdGljYXQgcGFja2V0IG91dHNpZGUgbGlua2xvY2FsIHNjb3BlLgorICAgICAgbmluZm9kOiBBcHBseSBkZWZhdWx0IHBvbGljeSB0byByZWZ1c2UgcXVlcmllcyBmcm9tIGdsb2JhbCBhZGRyZXNzZXMuCisgICAgICBuaW5mb2Q6IE5vcm1hbGl6ZSB0aW1lc3BlYyBmb3IgZGVsYXkuCisgICAgICBuaW5mb2Q6IEZpeCBkb3VibGUtZnJlZSB3aXRob3V0IHB0aHJlYWRzLgorICAgICAgbmluZm9kOiBEbyBub3QgbWl4IG91dHB1dCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisgICAgICBuaW5mb2Q6IEVtcGxveSBpbnRlcm5hbCBidWZmZXIgaW4gc3RkZXJybG9nKCkgZm9yIGNvbW1vbiBjYXNlLgorCisKK1tzMjAxMjExMjFdCisKK0phbiBTeW5hY2VrICgyKToKKyAgICAgIHBpbmcscGluZzY6IEFkZCBuZXdsaW5lIHRvIGVycm9yIG1lc3NhZ2UuCisgICAgICBwaW5nOiBEb24ndCBmcmVlIGFuIHVuaW50aWFsaXplZCB2YWx1ZS4KKworWU9TSElGVUpJIEhpZGVha2kgKDMxKToKKyAgICAgIGFycGluZyxjbG9ja2RpZmYscGluZyxyYXJwZCxyZGlzYyx0cmFjZXJvdXRlNiBkb2M6IHMvQ0FQX05FVF9SQVdJTy9DQVBfTkVUX1JBVy8uCisgICAgICBwaW5nLHBpbmc2OiBEbyBub3QgYXNzdW1lIHJhZGl4IHBvaW50IGlzIGRlbm90ZWQgYnkgJy4nICgtaSBvcHRpb24pLgorICAgICAgYXJwaW5nLHBpbmcscGluZzYscmRpc2MsdHJhY2Vyb3V0ZTY6IEZpeCB2ZXJzaW9uIHN0cmluZy4KKyAgICAgIG1ha2VmaWxlOiBHaXZlIC1mbm8tc3RyaWN0LWFsaWFzaW5nIHRvIGNvbXBpbGVyIGJ5IGRlZmF1bHQuCisgICAgICBwaW5nNjogVXNlIFNDT1BFX0RFTElNSVRFUi4KKyAgICAgIE1ha2VmaWxlOiBSZW1vdmUgLWxtIGZyb20gQURETElCLgorICAgICAgcmRpc2Nfc3J2LE1ha2VmaWxlOiBGaXggYnVpbGQuCisgICAgICByZGlzY19zcnYsTWFrZWZpbGU6IEJ1aWxkIHJkaXNjX3NydiB3aXRoIG1ha2UgYWxsLgorICAgICAgYXJwaW5nOiBzZXRfZGV2aWNlX2Jyb2FkY2FzdCgpIGRvZXMgbm90IG5lZWQgdG8gc3RvcmUgcmV0dXJuIHZhbHVlIG9mIHN1Yi1mdW5jdGlvbnMuCisgICAgICBhcnBpbmcsTWFrZWZpbGU6IE1ha2UgZGVmYXVsdCBpbnRlcmZhY2UgY29uZmlndXJhYmxlLgorICAgICAgYXJwaW5nOiBEbyBub3QgYWxsb3cgZW1wdHkgZGV2aWNlIG5hbWUgKC1JIG9wdGlvbikuCisgICAgICBhcnBpbmc6IEludHJvZHVjZSBjaGVja19pZmZsYWdzKCkgaGVscGVyIGZ1bmN0aW9uLgorICAgICAgYXJwaW5nOiBJbnRyb2R1Y2UgZGV2aWNlIHN0cnVjdHVyZSB0byBob2xkIG91dHB1dCBkZXZpY2UgaW5mb3JtYXRpb24uCisgICAgICBhcnBpbmc6IEFMbG93IG5vIGRlZmF1bHQgaW50ZXJmYWNlIGFuZCBzZWxlY3Qgb25lIGJ5IGdldGlmYWRkcnMoKS4KKyAgICAgIGFycGluZzogSW50cm9kdWNlIDJuZCAobGVnYWN5KSBtZXRob2QgdG8gc2VsZWN0IGludGVyZmFjZSBieSBpb2N0bHMuCisgICAgICBhcnBpbmcsTWFrZWZpbGU6IEFsbG93IGJ1aWxkIHdpdGhvdXQgZ2V0aWZhZGRycygpIHdpdGggV0lUSE9VVF9JRkFERFJTPXllcy4KKyAgICAgIE1ha2VmaWxlOiBVc2UgJDwgaW5zdGVhZCBvZiAkXiB0byBjb21wbGlsZSBDIHNvdXJjZSBjb2RlLgorICAgICAgcGluZyxwaW5nNjogUmVvcmRlciBjb21tYW5kLWxpbmUgb3B0aW9ucyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCisgICAgICBwaW5nNjogU2hvdyBzdWJvcHRpb25zIGZvciBOb2RlIEluZm9ybWF0aW9uIFF1ZXJpZXMgaWYgLU4gc3Vib3B0aW9uIGlzIGludmFsaWQuCisgICAgICBwaW5nLHBpbmc2IGRvYzogUmVhZGFiaWxpdHkgZm9yIFRPUyAoLVEpIG9wdGlvbi4KKyAgICAgIHJkaXNjOiBNaXNzaW5nIG5ldyBsaW5lIGFmdGVyIHVzYWdlLgorICAgICAgcmRpc2M6IE1ha2UgcmRpc2Mgd2l0aCByZXNwb25kZXIgc3VwcG9ydCBpZiBjb25maWd1cmVkLgorICAgICAgTWFrZWZpbGU6IGRpc3RjbGVhbiBkZXBlbmRzIG9uIGNsZWFuLgorICAgICAgTWFrZWZpbGU6IERlZmF1bHQgdG8gLU8zLgorICAgICAgTWFrZWZpbGU6IE1pbmltaXplIG9wdGlvbnMgdG8gZ2NjLgorICAgICAgTWFrZWZpbGU6IEFkZCBydWxlIHRvIGJ1aWxkIGFzc2VtYmx5IGZpbGVzLgorICAgICAgYXJwaW5nLE1ha2VmaWxlOiAzcmQgbGVnYWN5IGltcGxlbWVudGF0aW9uIHRvIGNoZWNrIG5ldHdvcmsgZGV2aWNlcy4KKyAgICAgIGFycGluZzogTGVzcyBpZmRlZnMuCisgICAgICByZGlzYyBkb2M6IERvY3VtZW50IC1yLCAtcCBhbmQgLVQgb3B0aW9ucy4KKyAgICAgIHBpbmc2OiBOSSBTdWJqZWNldCBhZGRyZXNzIGRpZCBub3Qgd29yayAoLU4gc3ViamVjdC17aXB2NixpcHY0XSBzdWJvcHRpb25zKS4KKyAgICAgIHBpbmc2OiBFbnN1cmUgdG8gZGV0ZWN0IHN1YmplY3QgdHlwZSBjb25mbGljdHMuCisKKworW3MyMDEyMTExNF0KKworSmFuIFN5bmFjZWsgKDIpOgorICAgICAgY2xvY2tkaWZmOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisgICAgICBwaW5nOiBXcmFwIFNPX0JJTkRUT0RFVklDRSB3aXRoIHRoZSBjb3JyZWN0IGNhcGFiaWxpdHkuCisKK1lPU0hJRlVKSSBIaWRlYWtpICgxMyk6CisgICAgICBwaW5nOiBJUF9NVUxUSUNBU1RfSUYgZG9lcyBub3QgbmVlZCBDQVBfTkVUX1JBVy4KKyAgICAgIHBpbmc2OiBDaGVjayByYW5nZXMgb2YgZmxvd2xhYmVsICgtRiBvcHRpb24pIGFuZCB0Y2xhc3MgKC1RIG9wdGlvbikgYXJndW1lbnRzLgorICAgICAgcGluZzY6IEFjY2VwdCAweC1ub3RhdGlvbiBmb3IgZmxvd2xhYmVsICgtRiBvcHRpb24pIGFuZCB0Y2xhc3MgKC1RIG9wdGlvbikgYXJndW1lbnRzLgorICAgICAgcGluZyxwaW5nNjogTWFudWFsIHVwZGF0ZSByZWdhcmRpbmcgLUYsIC1RIGFuZCAtTiBvcHRpb24uCisgICAgICBhcnBpbmcscGluZyxwaW5nNjogRGVmZXIgZXhpdHRpbmcgdG8gYWxsb3cgdXNlcnMgdG8gc2VlIHVzYWdlLgorICAgICAgYXJwaW5nLHBpbmcscGluZzYsbmluZm9kOiBDaGFuZ2UgZXVpZCB0byB1aWQgKG5vbi1yb290KSBldmVuIGlmIGNhcGFiaWxpeSBpcyBlbmFibGVkLgorICAgICAgbmluZm9kOiBBZGQgY29uZmlndXJlLgorICAgICAgbmluZm9kOiBsaWJjYXAgc3VwcG9ydCB0byBkcm9wIGNhcGFiaWxpdGllcy4KKyAgICAgIG5pbmZvZDogQWRkIHJ1biBhcyB1c2VyICgtdSB1c2VyKSBvcHRpb24uCisgICAgICBuaW5mb2Q6IEZpeCB1c2FnZSBtZXNzYWdlLgorICAgICAgYXJwaW5nLGNsb2NrZGlmZixyYXJwZCxyZGlzYyx0ZnRwZDogQ2hhbmdlIFJGQyBzb3VyY2UgdG8gdG9vbHMuaWV0Zi5vcmcuCisgICAgICBuaW5mb2Q6IEFkZCBuaW5mb2QoOCkgbWFucGFnZS4KKyAgICAgIG1ha2VmaWxlOiBBZGQgbmluZm9kLCBkaXN0Y2xlYW4gdGFyZ2V0cy4KKworCitbczIwMTIxMTEyXQorCitTZXJnZXkgRmlvbm92ICgxKToKKyAgICAgIHBpbmcscGluZzY6IEZhbGxiYWNrIHRvIG51bWVyaWMgYWRkcmVzc2VzIHdoaWxlIGV4aXRpbmcKKworWU9TSElGVUpJIEhpZGVha2kgKDE4KToKKyAgICAgIHBpbmcscGluZzY6IFJld29yayBjYXBhYmlsaXR5IHN1cHBvcnQgYW5kIE1ha2Ugc3VyZSAtbSBhbmQgLUkgb3B0aW9ucyB3b3JrLgorICAgICAgcGluZyx0cmFjZXBhdGg6IFNwZWxsaW5nIGZpeGVzIGluIG1hbnBhZ2VzLgorICAgICAgcGluZyxwaW5nNjogRml4IGludGVnZXIgb3ZlcmZsb3cgd2l0aCBsYXJnZSBpbnRlcnZhbCB2YWx1ZSAoLWkgb3B0aW9uKS4KKyAgICAgIGNsb2NrZGlmZjogTWFrZSBpdCB3b3JrIHdpdGggbGFyZ2UgcGlkLgorICAgICAgcGluZyxwaW5nNjogTWFrZSBpbl9wcl9hZGRyIHZvbGF0aWxlLgorICAgICAgYXJwaW5nOiBEbyBub3QgcXVpdCB0b28gZWFybHkgd2l0aCBsYXJnZSBkZWFkbGluZSB2YWx1ZSAoLXcgb3B0aW9uKS4KKyAgICAgIGFycGluZzogTWFpbnRhaW4gbWluaW11bSBjYXBhYmlsaXRpZXMgZm9yIFNPX0JJTkRUT0RFVklDRSgtSSBvcHRpb24pLgorICAgICAgcGluZzogRml4IHJlY29yZGVkIHJvdXRlIGNvbXBhcmlzb24uCisgICAgICBhcnBpbmc6IFVzZSBnZXRpZmFkZHJzKCkgdG8gZ2V0IGJyb2FkY2FzdCBhZGRyZXNzLgorICAgICAgcGluZzY6IEZpeCB0eXBvIGluIGVycm9yIG1lc3NhZ2UuCisgICAgICBwaW5nNjogR2VuZXJhdGUgTkkgR3JvdXAgQWRkcmVzcyBhbmQgU3ViamVjdCBOYW1lIGF0IG9uY2UuCisgICAgICBwaW5nLHBpbmc2OiBVbm1hc2sgc2lnbmFscyBvbiBzdGFydC11cC4KKyAgICAgIGFycGluZzogQnVpbGQgd2l0aCBVU0VfQ0FQPW5vLgorICAgICAgYXJwaW5nLHBpbmcscGluZzYsdHJhY2VwYXRoLHRyYWNlcGF0aDYsdHJhY2Vyb3V0ZTY6IEV4cGVyaW1lbnRhbCBJRE4gc3VwcG9ydC4KKyAgICAgIHBpbmc2OiBJRE4gc3VwcG9ydCBmb3IgdGhlIFN1YmplY3QgTmFtZSBpbiBOSSBRdWVyeS4KKyAgICAgIHRyYWNlcGF0aCx0cmFjZXBhdGg2OiBJbnRyb2R1Y2UgLXAgb3B0aW9uIGZvciBwb3J0LgorICAgICAgcGluZzY6IEFkZCBtaXNzaW5nIGRlZmluaXRpb25zL2RlY2xhcmF0aW9ucyBmb3IgZmxvd2xhYmVsIG1hbmFnZW1lbnQgKC1GIG9wdGlvbikuCisgICAgICBtYWtlZmlsZTogRG8gbm90IGluY2x1ZGUgbWVyZ2UgY29tbWl0cyBpbiBSRUxOT1RFUy4KKworCitbczIwMTIxMTA2XQorCitZT1NISUZVSkkgSGlkZWFraSAoNSk6CisgICAgICBuaW5mb2Q6IEF0dGF0Y2ggY29uZmlndXJlIGFuZCByZW5ldyBjb25maWcuaC5pbi4KKyAgICAgIG1ha2VmaWxlOiBjbGVhbi11cAorICAgICAgdHJhY2VwYXRoNjogUHJpbnQgcmVhc29uIG9uIGdldGFkcmluZm8oKSBmYWlsdXJlLgorICAgICAgcGluZyxwaW5nNjogRml4IGhhbmcgd2l0aCAtZiBvcHRpb24uCisgICAgICBwaW5nOiBNYWtlIHN1cmUgdG8gcHJpbnQgQyBpZiBjaGVja3N1bSBmYWlsZWQgd2l0aCAtZiBvcHRpb24uCisKKworW3MyMDEyMTAxMV0KKworSmFuIFN5bmFjZWsgKDIpOgorICAgICAgcGluZyxwaW5nNjogRGVmZXIgdGhlIGRyb3BwaW5nIGlmIHRoZSAiLW0iIGlzIHNwZWNpZmllZCBhbmQgY29ycmVjdCBjYXBhYmlsaXR5IGlzIHNldC4KKyAgICAgIHBpbmc6IEZpeCB0eXBvIGluIGVjaG8gcmVwbHkKKworT2xlIEJqb3JuIEhlc3NlbiAoMSk6CisgICAgICBwaW5nOiByZXBvcnQgb3V0c3RhbmRpbmcgcGFja2V0cyBiZWZvcmUgc2VuZGluZyBuZXh0IHBhY2tldAorCitZT1NISUZVSkkgSGlkZWFraSAoMzIpOgorICAgICAgcGluZyxwaW5nNjogQWRkIC1EIHRvIHN5bm9wc2lzLgorICAgICAgcGluZzogTW9yZSBpY21wIGNvZGUgZGVzY3JpcHRpb25zLgorICAgICAgcGluZyxwaW5nNjogSGlkZSBpcGcvZXdtYSBpbmZvIHdpdGhvdXQgcGFja2V0cyByZWNlaXZlZC4KKyAgICAgIHBpbmc2OiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorICAgICAgcGluZzY6IEhlbHAgZm9yIC1OIHN1Ym9wdGlvbnMuCisgICAgICB0cmFjZXBhdGgsdHJhY2VwYXRoNjogVXNlIGFyZ3VtZW50IHR5cGUgb2YgaW50IGZvciBmaWVsZCB3aWR0aCBzcGVjaWZpZXIuCisgICAgICBjbG9ja2RpZmY6IENhbGwgbmljZSgpIGJlZm9yZSBjaGFuZ2luZyBlZmZlY3RpdmUgdWlkLgorICAgICAgcmRpc2M6IFVzZSBmcHV0cygpIGluc3RlYWQgb2YgZnByaW50ZigpIHRvIHNodXQgdXAgZ2NjIHdhcm5pbmcuCisgICAgICByYXJwZDogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGNoZGlyKCkuCisgICAgICBtYWtlZmlsZTogSW50cm9kdWNlIG5ldyB2YXJpYWJsZSBmb3IgY2FwYWJpbGl0eSBzdXBwb3J0LgorICAgICAgcGluZyxwaW5nNjogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIHdyaXRlKDIpIGZvciBzdGRvdXQuCisgICAgICBwaW5nNix0cmFjZXBhdGgsdHJhY2VwYXRoNjogRG8gbm90IGRlcmVmZXJlbmNlIHR5cGUtcHVubmVkIHBvaW50ZXIgZGlyZWN0bHkuCisgICAgICBNYWtlZmlsZTogaG9zdCBjaGFuZ2VkIGZyb20gdGFrb3MgdG8gcGxlaWFkZXMuCisgICAgICBwaW5nNjogUHJvdmlkZSBlbm91Z2ggYnVmZmVyIGZvciBkbl9jb21wKCkgYW5kIG1ha2UgTkkgUXVlcnkgd2l0aCBOYW1lIHN1YmplY3Qgd29yay4KKyAgICAgIHBpbmc2OiBDb25zb2xpZGF0ZSBlcnJvciBwYXRoIG9mIG5pcXVlcnlfb3B0aW9uX3N1YmplY3RfbmFtZV9oYW5kbGVyKCkuCisgICAgICBuaW5mb2Q6IE5vZGUgSW5mb3JtYXRpb24gUXVlcnkgKFJGQzQ2MjApIGRhZW1vbiBmcm9tIFVTQUdJIFByb2plY3QuCisgICAgICBuaW5mb2Q6IHN0cnVjdCBpbjZfcGt0aW5mbyByZXF1aXJlcyAtRF9HTlVfU09VUkNFLgorICAgICAgbmluZm9kOiBVc2UgJXp1IGZvcm1hdCBzdHJpbmcgZm9yIHNpemVfdCB2YXJpYWJsZS4KKyAgICAgIG5pbmZvZDogQWRkIG1pc3NpbmcgZW50cnkgZm9yIEVOQUJMRV9TVVBUWVBFUyBpbiBjb25maWcuaC5pbi4KKyAgICAgIG5pbmZvZDogU3VwcG9ydCBuZXdlciBlbnZpcm9ubWVudCBzdXBwb3J0aW5nIFJGQzM1NDIuCisgICAgICBuaW5mb2Q6IEZpeCBmb3JtYXQgc3RyaW5nIGZvciBzdHJpbmcgcmV0dXJuZWQgZnJvbSBzdHJlcnJvcigzKS4KKyAgICAgIG5pbmZvZDogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGZzY2FuZigzKS4KKyAgICAgIG5pbmZvZDogRml4IG9mZi1ieS1vbmUgZXJyb3IgdG8gY2hlY2sgcG9zc2libGUgcHJvZ3JhbW1pbmcgZXJyb3IuCisgICAgICBuaW5mb2Q6IEFkZCBkYXRhcm9vdGRpci4KKyAgICAgIG5pbmZvZDogVXNlIF9fZnVuY19fIGluc3RlYWQgb2YgX19GVU5DVElPTl9fLgorICAgICAgbmluZm9kOiBJbnRyb2R1Y2UgQVJSQVlfU0laRSBtYWNybyBmb3IgY291bnRpbmcgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5LgorICAgICAgbmluZm9kOiBEZWxldGUgbmluZm9kLnNoIGJ5IG1ha2UgZGlzdGNsZWFuLCBub3QgYnkgbWFrZSBjbGVhbi4KKyAgICAgIHBpbmc2OiBEbyBub3QgdHJ5IHRvIHVzZSByZXN1bHQgYnVmZmVyIHdoZW4gZG5fY29tcCgzKSBmYWlsZWQuCisgICAgICBwaW5nLHBpbmc2OiBpZmRlZiBndWFyZCBmb3IgaW5saW5lIGZ1bmN0aW9uIGZvciBjYXBhYmlsaXR5IHN1cHBvcnQgYW5kIGZpeCBidWlsZCB3aXRoIFVTRV9DQVA9bm8uCisgICAgICBtYWtlZmlsZTogRG8gbm90IHVzZSAiLWxsaWIiIGRlcGVuZGVuY3kuCisgICAgICBhcnBpbmc6IGJ1aWxkIHdpdGhvdXQgc3lzZnMgc3VwcG9ydCAoVVNFX1NZU0ZTPW5vKS4KKworw4FuZ2VsIEdvbnrDoWxleiAoMSk6CisgICAgICBpcHV0aWxzOiBBZGQgY2FwYWJpbGl0eSBkcm9wcGluZworCisKK1tzMjAxMDEwMDZdCisKK0NocmlzIENhcHV0byAoMSk6CisgICAgICBwaW5nLHBpbmc2OiBhdm9pZCBnZXRob3N0YnlhZGRyIGR1cmluZyBwaW5nIGZsb29kLgorCitQYXVsIE1hcnRpbiAoMSk6CisgICAgICBhcnBpbmc6IFNldCBjb3JyZWN0IGJyb2FkY2FzdCBhZGRyZXNzLgorCitZT1NISUZVSkkgSGlkZWFraSAoNCk6CisgICAgICB0cmFjZXBhdGg6IEZpeCBzb21lIHNtYWxsIHR5cG9zIGluIHRyYWNlcGF0aC5zZ21sLgorICAgICAgcGluZzogRml4IHJlc291cmNlIGNvbnN1bXB0aW9uIHRyaWdnZXJlZCBieSBzcGVjaWFsbHkgY3JhZnRlZCBJQ01QIEVjaG8gUmVwbHkgKENWRS0yMDEwLTI1MjkpCisgICAgICBNYWtlZmlsZTogbWlncmF0ZSBtYWluIG1hY2hpbmUgZnJvbSBiZWF0cmljZSB0byB0YWtvcy4KKyAgICAgIE1ha2VmaWxlOiBVc2UgbmV3ZXIgZ2l0IHN1YmNvbW1hbmQgc3R5bGUgaW5zdGVhZCBvZiBnaXQtc3ViY29tbWFuZC4KKworCitbczIwMTAwNDE4XQorCitZT1NISUZVSkkgSGlkZWFraSAoMjgpOgorICAgICAgcGluZzY6IFVzZSBJUFY2X1RDTEFTUyB0byBzZXQgb3V0Z29pbmcgdHJhZmZpYyBjbGFzcyBpZiBhdmFpbGFibGUuCisgICAgICBwaW5nOiBNYWtlIGJ1aWxkX2VjaG8oKSwgZ2F0aGVyX3N0YXRpc3RpY3MoKSBtb3JlIGdlbmVyaWMuCisgICAgICBwaW5nNjogRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIE5vZGUgSW5mb3JtYXRpb24gUXVlcmllcyAoUkZDNDYyMCkuCisgICAgICBwaW5nOiBzaW1wbGlmeSB1c2FnZSBoaW50LgorICAgICAgcGluZzogUmVuYW1lIGNvbnN0YW50IG5hbWVzCisgICAgICBFeHRlbmQgLU4gb3B0aW9uIGZvciBOSSBRdWVyeSBvcHRpb25zLgorICAgICAgcGluZzY6IE1ha2UgbGVuZ3RoLWNoZWNrIHF0eXBlLXNwZWNpZmljLgorICAgICAgcGluZzY6IFJlbW92ZSB0b28gbWFueSBzcGFjZXMgYmV0d2VlbiBuYW1lcy4KKyAgICAgIHBpbmc2OiBwaW5nNl9uaXF1ZXJ5LmggbmVlZHMgYXNtL2J5dGVvcmRlci5oLgorICAgICAgcGluZzY6IFN1cHBvcnQgUXR5cGVzIGZvciBJUHY2L0lQdjQgQWRkcmVzc2VzLgorICAgICAgcGluZzY6IFNwbGl0IHByX25pcXVlcnlfcmVwbHkoKS4KKyAgICAgIHBpbmc2OiBIYW5kbGUgSUNNUHY2IGNvZGUgaW4gTkkgUmVwbHkuCisgICAgICBwaW5nNjogQWRkIHN1YmplY3QtaXB2NiBhbmQgc3ViamVjdC1pcHY0IE5JIHN1Yi1vcHRpb24gZm9yIHN1YmplY3QgYWRkcmVzcy4KKyAgICAgIHBpbmc2OiBTdXBwb3J0IHN1YmplY3QgbmFtZS4KKyAgICAgIHBpbmc2OiBGcmVlIG9sZCBtZW1vcnkgd2hlbiByZWFzc2lnbiBwb2ludGVycy4KKyAgICAgIHBpbmc2OiBBbHdheXMgZW5hYmxlIElQdjYgTm9kZSBJbmZvcm1hdGlvbiBRdWVyaWVzLgorICAgICAgbWFrZWZpbGU6IERvIG5vdCBhbHdheXMgbGluayBsaWJyZXNvbHYgYW5kIGxpYmNyeXB0by4KKyAgICAgIHBpbmcsdHJhY2Vyb3V0ZTYsY2xvY2tkaWZmOiBFbmxhcmdlIGhvc3RuYW1lIGJ1ZmZlci4KKyAgICAgIHBpbmc2OiBkbyBub3QgYWxsb3cgdG9vIGxhcmdlIHBhY2tldCBzaXplIGJ5IC1zIG9wdGlvbi4KKyAgICAgIHBpbmc6IG5lZWRsZXNzIHNwYWNlIHdoZW4gcHJpbnRpbmcgdXNhZ2UuCisgICAgICByZGlzYzogRml4IHR5cG8gaW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgIHJkaXNjOiBBbGxvdyBtdWx0aXBsZSBhZGRyZXNzZXMgb24gb25lIGludGVyZmFjZS4KKyAgICAgIGFycGluZzogU3VwcG9ydCBsaW5rLWxheWVyIHR5cGUgd2l0aCBsYXJnZXIgbGluay1sYXllciBhZGRyZXNzLgorICAgICAgdHJhY2VwYXRoNjogcmVzb2x2ZSB0YXJnZXQgZXZlbiBpZiAtbiBvcHRpb24gaXMgc3VwcGxpZWQuCisgICAgICB0cmFjZXBhdGgsdHJhY2VwYXRoNjogc3luYyB0cmFjZXBhdGggYW5kIHRyYWNlcGF0aDYuCisgICAgICB0cmFjZXBhdGg2OiBNYWtlIGl0IG1vcmUgcHJvdG9jb2wgaW5kZXBlbmRlbnQuCisKKworW3MyMDEwMDIxNF0KKworSmFtYWwgSGFkaSBTYWxpbSAoMik6CisgICAgICBwaW5nOiBwaW5nIGJ5IG1hcmsKKyAgICAgIHBpbmc6IHBpbmcgYnkgbWFyayBkb2MgdXBkYXRlCisKK0phbWllIExlIFR1YWwgKDEpOgorICAgICAgcGluZzogc2V0IHVuLmVjaG8uaWQgdG8gbmV0d29yayBieXRlIG9yZGVyCisKK1lPU0hJRlVKSSBIaWRlYWtpICgxMSk6CisgICAgICBbUElORzYsVFJBQ0VST1VURTZdOiBJZ25vcmUgZXJyb3IgaW4gc2V0dGluZyBJUFY2X0NIRUNLU1VNIHNvY2tldCBvcHRpb24gZm9yIElDTVB2NiBzb2NrZXQuCisgICAgICBbUElORzZdOiBVc2UgaWZfbmFtZXRvaW5kZXgoKSB0byBjb252ZXJ0IGlmbmFtZSB0byBpZmluZGV4LgorICAgICAgW1BJTkc2XTogQWxsb3cgdG8gc3BlY2lmeSBzb3VyY2UgYWRkcmVzcyB3aXRoIGludGVyZmFjZSBpbiBhIHNpbmdsZSAtSSBvcHRpb24uCisgICAgICBwaW5nNjogVHJ5IHVzaW5nIElQVjZfUEtUSU5GTyBzdGlja3kgb3B0aW9uIHRvIHNwZWNpZnkgb3V0Z29pbmcgaW50ZXJmYWNlLgorICAgICAgcmRpc2M6IFVzZSBGT1BFTl9NQVggaWYgT1BFTl9NQVggaXMgdW5kZWZpbmVkLgorICAgICAgcGluZzY6IEZpeCBzb3VyY2Ugcm91dGluZyB3aXRoIHNvdXJjZSBpbnRlcmZhY2Ugc2V0LgorICAgICAgcGluZyxwaW5nNjogRG9uJ3QgcHJpbnQgZXh0cmEgJywgJyBpbiBmaW5pc2goKS4KKyAgICAgIHRyYWNlcGF0aDogRml4IGRvY3VtZW50YXRpb24gdHlwby4KKyAgICAgIFVzZSBzeXNjb25mKF9TQ19PUEVOX01BWCkgaW5zdGVhZCBvZiBPUEVOX01BWC4KKyAgICAgIHBpbmcscGluZzY6IEFkZCAtRCBvcHRpb24gdG8gcHJpbnQgdGltZXN0YW1wLgorCisKK1tzMjAwNzExMjddCisKK0pvaG4gSGVmZm5lciAoNik6CisgICAgICBbaXB1dGlsc10gdHJhY2VwYXRoOiBBZGQgbGVuZ3RoIGZsYWcgdG8gc2V0IGluaXRpYWwgTVRVLgorICAgICAgW2lwdXRpbHNdIHRyYWNlcGF0aDogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoZSAtbCBmbGFnLgorICAgICAgW2lwdXRpbHNdIHRyYWNlcGF0aDogVXNlIFBNVFVESVNDX1BST0JFIG1vZGUgaWYgaXQgZXhpc3RzLgorICAgICAgW2lwdXRpbHNdIHRyYWNlcGF0aDogRG9jdW1lbnQgLW4gZmxhZy4KKyAgICAgIFtpcHV0aWxzXSB0cmFjZXBhdGg6IEZpeCBhc3ltbSBtZXNzYWdlcy4KKyAgICAgIFtpcHV0aWxzXSB0cmFjZXBhdGg6IFJlLXByb2JlIGF0IHNhbWUgVFRMIGFmdGVyIE1UVSByZWR1Y3Rpb24uCisKK1lPU0hJRlVKSSBIaWRlYWtpICg4KToKKyAgICAgIFtET0NdOiBEZWxldGUgZHVwbGljYXRlZCBsaW5lcyBpbiBSRUxOT1RFUy4KKyAgICAgIEZpeCB3aGl0ZSBzcGFjZSBlcnJvcnMuCisgICAgICBbQ0xPQ0tESUZGLFBJTkcsUkRJU0MsVFJBQ0VST1VURTZdOiBTdXBwb3J0IHVDbGliYy4KKyAgICAgIFtSQVJQRF06IEZpeGVkIHNldmVyYWwgc2lnbmVkbmVzcyBpc3N1ZXMgZm9yIGNoYXIgc3RyaW5ncy4KKyAgICAgIFtQSU5HXTogVXNlIGluZXRfcHRvbigpIGluc3RlYWQgb2Ygc3NjYW4oKS4KKyAgICAgIFtQSU5HNl06IFVzZSBJTjZfSVNfQUREUl94eHgoKSBtYWNyby4KKyAgICAgIFtNQUtFRklMRV06IENoYW5nZSBhdXRob3JpemVkIGhvc3QgdG8gcHVzaCBzbmFwc2hvdHMuCisgICAgICBbTUFLRUZJTEVdOiBVc2UgZ2l0LWFyY2hpdmUgaW5zdGVhZCBvZiBnaXQtdGFyLXRyZWUuCisKKworW3MyMDA3MDIwMl0KKworTWlrZSBGcnlzaW5nZXIgKDIpOgorICAgICAgVXNlIHNvY2tsZW5fdCBpbiBhbGwgdGhlIHJpZ2h0IHBsYWNlcy4KKyAgICAgIFtJUEddOiBoYW5kbGUgcGt0Z2VuIHNldHVwIGluIG5ld2VyIGtlcm5lbHMuCisKK01pdHN1cnUgQ2hpbmVuICgyKToKKyAgICAgIFtDTE9DS0RJRkZdOiBGaXggY29tcGlsYXRpb24gZXJyb3JzIGFib3V0IGxhYmVscyBhdCBlbmQgb2YgY29tcG91bmQgc3RhdGVtZW50cy4KKyAgICAgIFtQSU5HNl06IFVzZSBnZXRhZGRyaW5mbygpIGZvciB0aGUgbmFtZSByZXNvbHV0aW9uIG9mIGludGVybWVkaWF0ZSBub2Rlcy4KKworWU9TSElGVUpJIEhpZGVha2kgKDkpOgorICAgICAgW01BS0VGSUxFXSBSZW1vdmUgdW51c2VkIC1JLi4vaW5jbHVkZQorICAgICAgW1RSQUNFUEFUSF0gUHJpbnQgdXNhZ2UgaWYgd2UgbWV0IGluY29ycmVjdCBvcHRpb24uCisgICAgICBbUElORzZdOiBGaXggY29tcGlsYXRpb24gZXJyb3Igd2l0aCBnbGliYy0yLjQgYW5kIGxhdGVyLgorICAgICAgW1BJTkc2XTogVXNlIGdldGFkZHJpbmZvKCkgdG8gYWxsb3cgc2NvcGVkIGFkZHJlc3NlcworICAgICAgW1BJTkc2XTogRW5zdXJlIG5vdCB0byByZXZlcnNlLWxvb2t1cCBpZiB0YXJnZXQgaXMgbnVtZXJpYyBhZGRyZXNzLgorCisKK1tzMjAwNjA1MTJdCisKK1lPU0hJRlVKSSBIaWRlYWtpOgorICAgICAgW0JVSUxEXSBCdWlsZCB3aXRoIHN0YW5kYXJkIGhlYWRlcnMuCisgICAgICBbQVJQSU5HLFBJTkc2XSBCdWlsZCBmaXggZm9yIHNvbWUgb2xkIHN5c3RlbXMuCisKKworW3MyMDA2MDQyNV0KKworWU9TSElGVUpJIEhpZGVha2k6CisgICAgICBbVFJBQ0VST1VURTZdIEZpeCBJQ01QdjYgdHlwZSBwcmludGluZyB3aXRoIC12IG9wdGlvbgorICAgICAgW1RSQUNFUk9VVEU2XSBNYXJrIElDTVB2NiBtZXNzYWdlcyBhcyBrbm93bgorICAgICAgW0RPQ10gTWFpbnRhaW5lciAvIENvbnRhY3QgY2hhbmdlCisgICAgICBbUElORzYsVFJBQ0VQQVRINixUUkFDRVJPVVRFNl0gRGVmaW5lIFNPTF9JUFY2LFNPTF9JQ01QVjYgd2hlcmUgbmVlZGVkCisgICAgICBbVFJBQ0VST1VURTZdIEZpeCBzb3VyY2UvZGVzdGluYXRpb24gYWRkcmVzcyB3aXRoIC12IG9wdGlvbgorICAgICAgW1BJTkc2LFRSQUNFUEFUSDYsVFJBQ0VST1VURTZdIFVzZSBuZXcgUkZDMzU0MiBhZHZhbmNlZCBBUEkgaWYgYXZhaWxhYmxlCisgICAgICBbUkRJU0NdIFVzZSBwcm9wZXIgdHlwZSBmb3IgaXNfZGlyZWN0bHlfY29ubmVjdGVkKCkKKyAgICAgIFtQSU5HLFBJTkc2XSBVc2UgcHJvcGVyIHR5cGUgZm9yIHByaW50ZigpCisgICAgICBbVFJBQ0VST1VURTZdIEZpeCBpbmV0X3B0b24oKSBlcnJvciBoYW5kbGluZworICAgICAgW1RSQUNFUk9VVEU2XSBVc2UgbWluaW11bSBmb3JtYXQgaWYgMCBpcyBzcGVjaWZpZWQgZm9yIGRhdGFsZW4KKyAgICAgIFtUUkFDRVJPVVRFNl0gT3B0aW1pemUgZGF0YWxlbiBzYW5pdHkgY2hlY2tpbmcgY29kZQorICAgICAgW1RSQUNFUEFUSDZdIFVzZSBnZXRhZGRyaW5mbygpIHRvIGFsbG93IHNjb3BlZCBhZGRyZXNzZXMKKyAgICAgIFtSRElTQ10gVXNlIHN0cmVycm9yKGVycm5vKSBpbnN0ZWFkIG9mIHN5c19lcnJsaXN0W2Vycm5vXQorICAgICAgW1BJTkcsUElORzZdIEF2b2lkIHVzaW5nIF9fY29uc3RhbnRfaHRvbnMoKSBpZiBpdCBpcyByZWFsbHkgbmVlZGVkCisgICAgICBbVFJBQ0VQQVRINl0gRml4IGZvcm1hdCBmb3Igc3Vic2Vjb25kcworICAgICAgW0FSUElORyxDTE9DS0RJRkYsUElORyxQSU5HNixUUkFDRVJPVVRFNl0gQ2hlY2sgcmV0dXJuIHZhbHVlIGZyb20gc2V0dWlkKCkuCisgICAgICBbUElORyxQSU5HNl0gZW5zdXJlIHRvIGluaXRpYWxpemUgbXNnLgorICAgICAgW01BS0VGSUxFXSBNYWtlIHNuYXBzaG90IHVzaW5nIGdpdAorCisKK1swMjA5MjddCisqIGFycGluZy5zZ21sLCBzb21lIG9wdGlvbnMgd2VyZSBmb3Jnb3R0ZW4uCisqIHNlbmQgc2Vxbm8gaW4gbmV0d29yayBieXRlIG9yZGVyLiBNZS4KKyogTWFkcyBNYXJ0aW4gSvhyZ2Vuc2VuIDxtbWpAc3VzZS5kZT4gUmVjdXJzaXZlIGNpdGF0aW9uOgorIk9uIHJlcXVlc3Qgb2YgTWFkcyBNYXJ0aW4gSvhyZ2Vuc2VuIDxtbWpAc3VzZS5kZT4gSSd2ZSBhZGRlZCBtYW5wYWdlcworcHJlZ2VuZXJhdGVkIGZyb20gdGhlIERvY2Jvb2sgc291cmNlcy4gT25lIGNvdWxkIGFyZ3VlIGl0IGlzIHJlZHVuZGFudAord2hlbiB0aGUgRG9jYm9vayBzb3VyY2VzIGFyZSBhbHNvIHRoZXJlLCBidXQgdGhlIGFyZ3VtZW50IG9mIG5vdCBoYXZpbmcKK3RvIGluc3RhbGwgRG9jYm9vayBvbiBhIHZlcnkgc21hbGwgc3lzdGVtIHRvIGdldCB0aGUgbWFuIHBhZ2VzIHdhcworY29udmludmluZyBlbm91Z2ggdG8gbWUuIFRvIHF1b3RlIE1hZHMgTWFydGluOiAiSG93IHdvdWxkIGEgc3lzdGVtCitiZSB3aXRob3V0IGEgbWFuIHBhZ2UgZm9yIHBpbmc/IiAKKyAgQXMgYSBjaGlsaWRpc2ggcmV2ZW5nZSBmcm9tIG15IHNpZGUgZW5qb3kgd2l0aCBjeXJpbGxpYyBkYXRlIGluIHRoZXNlCisgIG1hbiBwYWdlcy4gOi0pCisqIEtlbiBDb3ggPGprY0ByZWRoYXQuY29tPi4gQm9ndXMgZGVmaW5pdGlvbiBvZiBTT0NLX0RSR0FNJlNPQ0tfU1RSRUFNIG9uIG1pcHMuCisqIEVycm9yIHJldHVybmVkIGZyb20gcmVjdm1zZygpIHJlc3VsdGVkIGluIGEgYm9ndXMgcHJpbnRvdXQgaW4gdHJhY2Vyb3V0ZTYuIE1lLgorKiBVc2UgSVBWNl9DSEVDS1NVTSBvbiBpY21wIHNvY2tldCBpbiB0cmFjZXJvdXRlNi4gTWUuCisqIE5vYWggTC4gTWV5ZXJoYW5zIDxmcm9kb0Btb3JndWwubmV0PiBGaXggdG8gZG9jLgorISogTm9haCBMLiBNZXllcmhhbnMgPGZyb2RvQG1vcmd1bC5uZXQ+IFdoYXQgaXMgdGhlIHByb2JsZW0gd2l0aCAibG9uZyIgdHJpcHRpbWU/CishICBSZXBvcnRlciBkb2VzIG5vdCByZXNwb25kLiBfTWFsaWduYW50bHlfLgorKiBUaG9tYXMgJ0RlbnQnIE1pcmxhY2hlciA8ZGVudEBjb3N5LnNiZy5hYy5hdD4gUGluZyBkaWQgbm90IGV4aXQgc29tZXRpbWVzIQorKiBBZGQgb3B0aW9uIC1XIHRvIG92ZXJyaWRlIGRlZmF1bHQgMTAgc2Vjb25kIGxpbmdlciB0aW1lb3V0LiBNZS4KKyogTWFkcyBNYXJ0aW4gSvhyZ2Vuc2VuIDxtbWpAc3VzZS5kZT46IHBpbmcgc2hvdWxkIG5vdCBiaW5kIHRvIGF1dG9zZWxlY3RlZAorICBzb3VyY2UgYWRkcmVzcywgaXQgdXNlZCB0byB3b3JrIHdoZW4gcm91dGluZyBjaGFuZ2VzLiBSZXR1cm4gY2xhc3NpYworICBiZWhhdmlvdXIsIG9wdGlvbiAtQiBpcyBhZGRlZCB0byBlbmZvcmNlIGJpbmRpbmcuCisqIFBla2thIFNhdm9sYSA8cGVra2FzQG5ldGNvcmUuZmk+IEZvcmdvdHRlbiBcbiBtZXNzaW5nIG91dHB1dCBvZiBwaW5nNi4KKyogTm9haCBMLiBNZXllcmhhbnMgPGZyb2RvQG1vcmd1bC5uZXQ+IHRyYWNlcm91dGU2IC1xIDEgZGlkIG5vdCB3b3JrLgorKiBQZWtrYSBTYXZvbGEgPHBla2thc0BuZXRjb3JlLmZpPiB2YXJpb3VzIHNpemVvZigpIGNsZWFudXBzIGluIHRyYWNlcm91dGU2LmMKKyogIkRtaXRyeSBWLiBMZXZpbiIgPGxkdkBhbHQtbGludXgub3JnPiB3cm90ZToKKyAgPiBwaW5nIChhcyB3ZWxsIGFzIG90aGVyIHV0aWxpdGllcykgbWF5IG9wZW4gcmF3IHNvY2tldCB3aXRoIGRlc2NyaXB0b3IgPD0yOworICA+IEluIGNhc2Ugb2Ygc3VpZC1yb290LCBpdCBjYW4gYmUgdXNlZCBieSBtYWxpY2lvdXMgdXNlciB0byBzZW5kIGRhdGEgdG8KKyAgPiB0aGlzIHJhdyBzb2NrZXQuCisgID4gCisgID4gWWVzLCBtb2Rlcm4gZ2xpYmMgYW5kIHNvbWUga2VybmVscyBoYXZlIHdvcmthcm91bmQgZm9yIGl0LCBidXQKKyAgPiBJTUhPIGlwdXRpbHMgc2hvdWxkbid0IHJlbHkgb24gdGhpcyBmZWF0dXJlLgorICBUYWtlbiBpbnRvIGFjY291bnQsIGJ1dCBubyBjaGFuZ2VzIG1hZGUuCisqICJUaWxtYW4gSGVpbnJpY2giIDx0aWxIZWlucmljaEB3ZWIuZGU+IHNhaWQgc29tZSBzY3JpcHRzIGFyZSBicm9rZW4KKyAgd2hlbiB3b3JkICJwYWNrZXQiIGRpc2FwcGVhcmVkIGZyb20gIjEwMCUgcGFja2V0IGxvc3MiLiBEZXNwaXRlIG9mCisgIHRoZSBpbmFyZ3VhYmxlIGZhY3QgdGhhdCBzdWNoIHNjcmlwdHMgYXJlIHRydWx5IG1hZCBhbmQgZGVzZXJ2ZSBicmVha2luZworICAoc2lnaC4uLiBleGl0IGNvZGVzIGFyZSB0b28gc21hcnQgY29uY2VwdCBmb3Igc2NyaXB0IHdyaXRlcnMsIEkgZ3Vlc3MpLAorICBJIGhhdmUgdG8gcmVjb2duaXplIHJlbW92aW5nIHRoaXMgd29yZCBjYXJyeWluZyB6ZXJvIGluZm9ybWF0aW9uCisgIHdhcyBub3QgZW5vdWdoIG1vdGl2YXRlZC4gUmV0dXJuZWQuCisqIHBpbmcgdXNlZCB0byByZXRyeSBmb3JldmVyIHdoZW4gc2VlaW5nIEVOT0JVRlMvRU5PTUVNIHdpdGhvdXQgZXhwbGljaXRseQorICBnaXZlbiBkZWFkbGluZS4gQmVpbmcgbG9naWNhbGx5IGNvcnJlY3QgaXQgaXMgYmFkIGluIHByYWN0aWNlIGYuZS4gd2hlbgorICBwaW5naW5nIGJ1Z2d5IGRldmljZSB3aGljaCBsb2NrZWQgdXAgd2l0aCBzb21lIHBhY2tldHMgaW4gcXVldWUuCisgIFNvLCByZXRyeSBmb3IgYSBmaW5pdGUgdGltZS4uLiBsZXQgaXMgYmUgbGluZ2VydGltZS4gRmFpcj8gTWUuCisqIFR3byAibWVzc2FnZXMiIGFyZSBzZW50IHRvIHJwbSBtYWludGFpbmVycyB0byBtYWtlIHRoZWlyIHdyb25nIHBhdGNoZXMKKyAgZmFpbGVkLgorKiBGaXggZnJvbSBSSCBpcHV0aWxzLTIwMDAxMDA3LWRlYWRsaW5lLnBhdGNoLiBJdCB3YXMgbG9zdCBpbiB0aGUgbGF0ZXN0CisgIHJwbXMgYnR3LgorKiBEYXggS2Vsc29uIDxkYXhAZ3VydWxhYnMuY29tPjogYWRkZWQgX3Vuc3VwcG9ydGVkXyBvcHRpb24gdG8gY29tcHBpbGUKKyAgcmRpc2Nfc3J2LgorCitbMDIwMTI0XQorKiBNaWNoYWwgS29jaGFub3dpY3ogPG1pY2hhbEBtaWNoYWwud2F3LnBsPiB0eXBvcyBpbiB0cmFjZXBhdGguOAorKiBNaWNoYWVsIFdhcmRsZSA8bWljaGFlbC53YXJkbGVAYWRhY2VsLmNvbT46IHVuZG8gc2lsbHkgY2hhbmdlIG9mIHNzMDAwMzA1CisgIChwcmludGluZyBydHQgaW4gc29tZSBmdW5ueSB1bml0cykuIE1pY2hhZWwgbm90aWNlZCB0aGF0ICJzZWMiIGlzIG5vdAorICBzdGFuZGFyZCBhYmJyZXZpYXRpb24gZm9yIHRpbWUgdW5pdHMgKGJ1bGxzaGl0LCBvZiBjb3Vyc2UpLCBidXQgcmVhbCBjb25jZXJuCisgIGlzIHRoYXQgaXQgaXMgbW9yZSBkaWZmaWN1bHQgdG8gaW50ZXJwcmV0IHdpdGggYSBuZWdsaWJpYmxlIGltcHJvdmVtZW50CisgIHRvIGFwcGVhcmFuY2UuIFNvLCBkbyB0aGlzIGFzIGV4cGVjdGVkOiBpbiAibXMiLgorKiBEb2N1bWVudGF0aW9uLiBXb3chIEkgZGlkIGl0LiBtYW4gcGFnZXMgYXJlIGRpc2Fzc2VtYmxlZCB0byBkb2Nib29rLAorICBhdWRpdGVkIHdydCByZWFsIHN0YXRlLCBlZGl0ZWQuLi4gYW5kIHByb21pc2VkIHRvIGJlIG1haW50YWluZWQKKyAgaW4gc3luYyB3aXRoIHRoZSBzdGF0ZSBvZiB1dGlsaXRpZXMuCisKK1swMTEyMDJdCisqIFV0eiBCYWNoZXIgPHV0ei5iYWNoZXJAZGUuaWJtLmNvbT4gQml0b3BzIGluIHBpbmc2IHdlcmUgd3JvbmcKKyAgb24gYmlnZW5kaWFuIG1hY2hpbmVzLiBXb3csIGx1Y2tpbHkgSSBmb3Jnb3QgdG8gYWNrbm93bGVkZ2UgdGhhdCBwYXRjaAorICBvZiAwMTA4MDUgd2hpY2ggaGFzIGdvdHRlbiByaWQgb2Yga2VybmVsIGJpdG9wcyBhbmQgZGlkIHRoaXMgc28gd3JvbmdseS4KKyogTWljaGFlbCBCYWt1bmluIDxiYWt1bmluQG1hcGhpYXNvZnQub3JnPiAoOi0pKQorICBmb3VuZCBtdWQgaW4gdGZ0cGQuYywgaXQgd2lsbCBjcmFzaCB3aGVuIGRpcmVjdG9yeSBzdXBwbGllZCBpbiBhcmd1bWVudAorICBpcyBsb25nZXIgfjUxMiBzeW1ib2xzLgorKiBBbGV4YW5kciBELiBLYW5ldnNraXkgPGthZEBibGFja2NhdGxpbnV4LmNvbT46IGJ1ZmZlciBvdmVyZmxvdworICBpbiBjbG9ja2RpZmYuIFZlcnkgc3R1cGlkIG9uZSwgdGhlIG92ZXJmbG93ZWQgYnVmZmVyIGV2ZW4gd2FzIG5vdCB1c2VkLiA6LSkKKyogQWxleGFuZHIgRC4gS2FuZXZza2l5IDxrYWRAYmxhY2tjYXRsaW51eC5jb20+OiBzaGl0ISBDb2RlIHJlY29nbml6aW5nCisgIGtlcm5lbHMgd2l0aCBicm9rZW4gSVBfUkVDVkVSUiBmb3IgcmF3IHNvY2tldHMgZGVwZW5kZWQgb24gcmFjZQorICBhbmQgYWNjdXNlZCBldmVuIGdvb2Qga2VybmVsIG9mIGJlaW5nIGJ1Z2d5LiA6LSkKKworWzAxMTAwMl0KKyogU3RlcGFuIEtvbHRzb3YgPHlvemhAbXgxLnJ1PiwgdHJhY2VwYXRoL3RyYWNlcHRoNiBzZWdmYXVsdGVkIHdoZW4KKyAgdXNlZCB3aXRob3V0IGFkZHJlc3MuCisqIEFsZXhhbmRyIEQuIEthbmV2c2tpeSA8a2FkQGJsYWNrY2F0bGludXguY29tPjogYXJwaW5nIHByaW50ZWQKKyAgInBlcm1pc3Npb24gZGVuaWVkIiBpbnN0ZWFkIG9mIHNob3dpbmcgaGVscCBwYWdlIHRvIG5vbi1zdXBlcnVzZXIuCisKK1swMTA4MjRdCisqIEFsZXhhbmRyIEQuIEthbmV2c2tpeSA8a2FkQGJsYWNrY2F0bGludXguY29tPjogcGluZyBjb21waWxlZAorICBmb3IgbGludXgtMi40IGZvcmdvdCB0byBzZW5kIHRoZSBzZWNvbmQgcGFja2V0LCB3aGVuIHVzZWQgd2l0aCBsaW51eC0yLjIKKyogQ2hyaXMgRXZhbnMgPGNocmlzQHNjYXJ5LmJlYXN0cy5vcmc+OiBidWZmZXIgb3ZlcmZsb3cgaW4gdHJhY2Vyb3V0ZTYuCisgIGRhdGFsZW4gd2FzIG1lc3NlZDogY291bnRpbmcgaGVhZGVyIGluIGhhbGYgb2YgcGxhY2VzLgorICBGdW5ueSwgbG9va2luZyBpbnRvIExCTCB0cmFjZXJvdXRlLCBpdCBpcyBldmVuIHdvcnNlIDotKQorKiBBbGV4YW5kciBELiBLYW5ldnNraXkgPGthZEBibGFja2NhdGxpbnV4LmNvbT46IHJlbGF5ZWQgcGF0Y2hlcworICBieSBTb2xhcl9EaXouIE9ubHkgbWlzc2luZyBkZXNjcmlwdGlvbiBvZiBvcHRpb24gLXEgaXMgYWNjZXB0ZWQuCisqIDxpcGF0ZWxAd2lsbmV0b25saW5lLm5ldD4gcGluZzYgcHJpbnRlZCB3cm9uZyBtdHUuCisqIEFsZXhhbmRyIEQuIEthbmV2c2tpeSA8a2FkQGJsYWNrY2F0bGludXguY29tPjogLVdlcnJvciBpcyByZW1vdmVkLgorICBOZXdlciBnY2MgYXJlIGJ1Z2d5IGFuZCBnZW5lcmF0ZXMgc29tZSB3cm9uZyB3YXJuaW5ncyBhYm91dAorICB1bmluaXRhbGl6ZWQgdmFyaWFibGVzLCB3aGljaCBhcmUgZXZpZGVudGx5IGluaXRpYWxpemVkLgorCitbMDEwODA1XQorKiBTb21lIG5ld3MgZnJvbSBQZWtrYSBTYXZvbGEgPHBla2thc0BuZXRjb3JlLmZpPiBhcm91bmQgc2V0dGluZyB0b3MgYml0cy4KKyogYXJwaW5nOiBicm9hZGNhc3Qtb25seSBtb2RlIGJ5IEFyZCB2YW4gQnJlZW1lbiA8YXJkQHRlbGVncmFhZm5ldC5ubD4KKyogcGluZzYvdHJhY2Vyb3V0ZTY6IHBhcnNlIElDTVAgZXJyb3JzIHdpdGggZXh0ZW5zaW9uIGhlYWRlcnMgKG1lKQorICB0cmFjZXJvdXRlNiB3b3JrcyB3aXRoIHNpemUgPiBtdHUgbm93LiBOaWNlLgorKiBwaW5nOiBFcmlrIFF1YW5zdHJvbSA8cXVhbnN0cm9AY2xhcmsubmV0Pi4gU2VyaW91cyBwYXRjaC4KKyAgcGluZyBpbnRlcnZhbCB0aW1lciB3YXMgbm90IHZlcnkgYnJva2VuLCBidXQgdmVyeSB1bmludGVsbGlnaWJsZS4KKyAgVGhvdWdoIEkgcmVtYWRlIHRoZSBjb2RlIHRvIHVzZSBsZWFreSBidWNrZXQgbG9naWMsIHdoaWNoCisgIGlzIHRoZSBtb3N0IHRyYW5zcGFyZW50IG9uZS4gQW55d2F5LCBjb250cmlidXRpb24gYnkgRXJpYyBpcworICB0aGUgbW9zdCBpbXBvcnRhbnQgb25lIHNpbmNlIHRoZSBwcmV2aW91cyByZWxlYXNlLgorICBTaG9ydCB0aGVvcnkgb2Ygb3BlcmF0aW9uOiBvcHRpb24gLWkgKGludGVydmFsKSBzZXRzIHJhdGUgcj0xL2ludGVydmFsIHBwcywKKyAgb3B0aW9uIC1sIChwcmVsb2FkKSBzZXRzIGJ1cnN0IHNpemUgb2YgbCBwYWNrZXRzLiBTbywgcGluZyBzZW5kcworICBhdCBtb3N0IHIqdCtsIHBhY2tldHMgZm9yIGFuIGFyYml0cmFyeSBpbnRlcnZhbCB0LgorICBEZWZhdWx0IHZhbHVlczogbD0xIGFuZCBmb3Igbm9uLWZsb29kIGNhc2U6IHI9MXBwcywgZm9yIGZsb29kIHI9aW5maW5pdHkuCisgIE5pY2U/IEV4YWN0IGFsZ29yaXRobSBpczoKKworICBMZXQgTih0KSBiZSBsL3I9bCppIGluaXRpYWxseSBhbmQgTih0KSBncm93IGNvbnRpbnVvdXNseSB3aXRoIHRpbWUgYXM6CisKKwlOKHQrZGVsdGEpID0gbWlue2wqaSwgTih0KSArIGRlbHRhfQorCisgIFBhY2tldCBjYW4gYmUgdHJhbnNtaXR0ZWQgb25seSBhdCB0aGUgdGltZSB0Xyogd2hlbiAxL3I9aSA8PSBOKHRfKikKKyAgYW5kIGluIHRoaXMgY2FzZSBOKHQpIGp1bXBzOgorCisJTih0XyogKyAwKSA9IE4odF8qIC0gMCkgLSBpLgorCisgIFdoZW4gaW50ZXJ2YWwgaXMgemVybywgYWxnbyBkZWdlbmVyYXRlcyBhbGxvd2luZyB0byBzZW5kIGFueSBhbW91bnQKKyAgb2YgbWVzc2FnZXMuIEluIHRoaXMgY2FzZSB3ZSBtb2RpZnkgaXQgdXNpbmcgbCBhcyBsaW1pdCBvbiBhbW91bnQKKyAgb2YgdW5hbnN3ZXJlZCByZXF1ZXN0cyBhbmQgd2FpdGluZyBmb3IgMTBtc2VjLCB3aGVuIHNvbWV0aGluZyBpcyBub3QKKyAgYW5zd2VyZWQuIE5vdGUgdGhhdCB0aGUgbGFzdCB0aGluZyAoMTBtc2VjKSBpcyBqdXN0IHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICBCU0QgbWFudWFsIHBhZ2VzLiBCU0QgcGluZyBpcyBzaW1wbHkgbm90IGFibGUgdG8gYXZvaWQgZGVsYXkgdGVjaG5pY2FsbHksCisgIHdlIGFyZSBhYmxlIG5vdy4KKworICBJbiByZXN1bHQgd2UgZ290IHNvbWUgbmV3IGZhY2lsaXRpZXM6CisgICogIi1mIC1sIDEwMCIgYmVjb21lcyB2ZXJ5IGFnZ3Jlc3NpdmUsIGluIGZhY3Qgb24gZ29vZCBsaW5rCisgICAgaXQgaG9sZHMgcGVybWFuZW50bHkgMTAwIHBhY2tldHMgaW4gZmxpZ2h0LCB3aGljaCBpcyB2ZXJ5IGRpZmZlcmVudAorICAgIG9mIGVhcmxpZXIgYmV2YXZpb3VyIChvbmUgcGFja2V0IGluIGZsaWdodCkuCisgICogLWYgYW5kIC1pIGFyZSBub3QgaW5jb21wYXRpYmxlIG1vcmUuIEluIGZhY3QsICItZiAtaSAxIiBpcyBlcXVpdmFsZW50CisgICAgdG8gcGxhaW4gcGluZywgb25seSBvdXRwdXQgaXMgZGlmZmVyZW50IChkb3R0ZWQpLiBFc3NlbnRpYWxseSwKKyAgICBjaGFuZ2Ugb2Ygb3V0cHV0IGZvcm1hdCBpcyB0aGUgb25seSBlZmZlY3QuICJwaW5nIC1pIDAiIGlzIGZsb29kCisgICAgcHJpbnRpbmcgb3V0cHV0IGluIG5vcm1hbCBmb3JtYXQuCisKKyAgTW92ZWQgc29tZSBwYXJ0cyBvZiBjb2RlIHRvIHBpbmdfY29tbW9uLmMuIENvbW1vbiBwYXJ0IGlzIG5vdCBmdWxseQorICB0cml2aWFsIG5vdy4gOi0pCisKKyogcGluZzogSWFuIEx5bmFnaCA8aWdsb29AZWFydGgubGk+LCBsYXJnZXIgYW5kIGR5bmFtaWMgZHVwIGRldGVjdG9yLgorICBBbHNvLCBJYW4gc3VibWl0dGVkIHR3byBsYXJnZSBwYXRjaGVzLCBvbmUgZml4aW5nIGZvcm1hdHRpbmcsIGFub3RoZXIKKyAgZG9pbmcgc29tZXRoaW5nIHdpdGggc2lnbmVkbmVzcy9sb25nbmVzcy4gTm90IG5vdy4uLgorICBMYXRlciBub3RlOiBmb3VuZCBub3Qgd29ya2luZy4geCArIDcgLyA4IDotKS4gU29ycnkuLi4gZHViaW91cywgd2l0aGRyYXduLgorICBzaXplIG9mIHRhYmxlIGluY3JlYXNlZCB0byBtYXhpbWFsIHZhbHVlIGluc3RlYWQgKDhLIG9mIG1lbW9yeSwKKyAgbm90IGEgYmlnIGRlYWwpLgorKiB0ZnRwZDogYW4gb2xkIG1pc3ByaW50LiBsZWZ0QHNib3Iuc3BiLnN1IChJZ29yIEEuIExlZnRlcm92KQorKiBjbG9ja2RpZmY6IGRvIG5vdCBmYWlsLCBpZiByZXZlcnNlZCByZXNvbHV0aW9uIGZhaWxlZC4KKyAgVG9tbXkgTGFjcm9peCA8dG9tbXlsQHplcm9rbm93bGVkZ2UuY29tPgorKiBwaW5nOiBhdWRpYmxlIHBpbmcgYnkgUGF0cmlrIFNjaGlsdCA8cGF0cmlrQGJuYy5jaD4KKyAgUGF0cmljaydzIG9wdGlvbiByZW5hbWVkIHRvIC1hIHRvIGFsaWduIHRvIGZyZWVic2QuCisqIHBpbmc6IHJlYWN0IHRvIGRldmljZSBxdWV1ZSBvdmVyZmxvd3MgdXNpbmcgSVBfUkVDVkVSUi4gbWUuCisqIHBpbmc6IG9wdGlvbiAtUyBhbGxvd3MgdG8gY2hhbmdlIHNuZGJ1ZiAKKyogcmFycGQgaXMgbW92ZWQgZnJvbSBzZXBhcmF0ZSBwYWNrYWdlIGhlcmUgKHBlb3BsZSBhc2tlZCkKKyogcGluZzY6IGtlcm5lbCBzdHlsZSBiaXRvcHMgYXJlIG5vdCB1c2VkIG1vcmUuCisqIE9wdGlvbiAtQSB0byBhZGFwdCB0byBuZXR3b3JrIHJ0dC4KKyogVXNlIEJQRiwgd2hlbiBtdWx0aXBsZSBwaW5ncyBhcmUgZGV0ZWN0ZWQuCisKK1swMDExMTBdCisqIHBpbmcgaXMgYWJsZSB0byBzZWxlY3QgVE9TLiBCeSBQZWtrYSBTYXZvbGEgPHBla2thc0BuZXRjb3JlLmZpPgorKiB0cmFjZXBhdGgqIEROUyBuYW1lcy4gQnkgUGF3ZWwgS3Jhd2N6eWsgPGtyYXZpZXR6QGNldGkuY29tLnBsPiBhbmQKKyAgQXJrYWRpdXN6IE1pc2tpZXdpY3ogPG1pc2lla0BwbGQub3JnLnBsPgorKiBwaW5nNiBpcyBleHBlY3RlZCB0byBiZSBjb21waWxlZCB3aXRoIGxpbnV4LTIuMi4KKworWzAwMTAxMV0KKyogUkggYnVnaWQjMTY2Nzc6IHNlZ2ZhdWx0LCB3aGVuIHBpbmcgaXMgdXNlZCBieSByb290IGFuZCBzaXplCisgIGlzIGxhcmdlIGVub3VnaC4gRml4IGlzIHRvIGFsbG93IG92ZXJzaXplIGJ5IHJvb3QgKGl0IGlzIG5lY2Vzc2FyeQorICB0byBjaGVjayBrZXJuZWwgc2lkZSksIGJ1dCBjbGFtcCBpdCBhdCBzb21lIHNhZmUgdmFsdWUuCisKK1swMDEwMTBdCisqIE1vcmUgYnVnIGZpeGVzIGZyb20gQ2hyaXMgRXZhbnMgPGNocmlzQGZlcnJldC5sbWgub3guYWMudWs+CisgIC0gZG8gbm90IHRydXN0IGhfbGVuZ3RoIHJldHVybmVkIGJ5IHN5c3RlbSByZXNvbHZlci4KKyAgICBUaGlzIHZhbHVlIGlzIG1lYW5pbmdsZXNzIGluIGFueSBjYXNlLgorICAtIHBpbmc6IGJ1ZmZlciBvdmVyZmxvdyBpbiBmaWxsKCkhISEgRGlzZ3JhY2VmdWwgYnVnLgorCisqIHBpbmc6IGFsbG93IG5vdC1wcml2aWxlZGdlZCB1c2VycyB0byB1c2UgYnJvYWRjYXN0cy4gSXQgd2FzIHBhcmFub2lhLgorICBNdWx0aWNhc3RzIHdlcmUgYWxsb3dlZC4gOCkKKyogcGluZzogYnV0IGZvcmNlIGJyb2FkY2FzdHMmbXVsdGljYXN0cyBub3QgdG8gZnJhZ21lbnQuIEJTRCBkb2VzCisgIG5vdCBhbGxvdyB0byBkbyB0aGlzIHRvIGFueW9uZSwgd2Ugc3RpbGwgYWxsb3cgdGhpcyBmb3Igc3VwZXJ1c2VyLgorKiBPcHRpb24gLU0gdG8gY29udHJvbCBwYXRoIG10dSBkaXNjb3ZlcnkuCisKK1swMDEwMDddCisqIEJ5IFBla2thIFNhdm9sYSA8cGVra2FzQG5ldGNvcmUuZmk+CisgIC0gU0lPQ0dTVEFNUC9TT19USU1FU1RBTVAgYXJlIHNlbnNpdGl2ZSB0byBidWcgaW4ga2VybmVsLgorICAgIFdoZW4gZ2V0X2Zhc3RfdGltZSAhPSBnZXR0aW1lb2ZkYXkgKGYuZS4gdGltZXN0YW1wbGVzcyB4ODYpLAorICAgIHJldHVybmVkIHN0YW1wIGNhbiBiZSBvdXQgb2Ygc3luYyB3aXRoIGdldHRpbWVvZmRheS4KKyAgICBXb3JrYXJvdW5kIGlzIG5vdCB0byB1c2UgU0lPQ0dTVEFNUC9TT19USU1FU1RBTVAgb24gc3VjaCBzeXN0ZW1zLgorICAtIGZpeGVzIGluIG1hbiBwYWdlcworICAtIGNvbXBpbGVzIHVuZGVyIHJoLTcuMAorKiBDaHJpcyBFdmFucyA8Y2hyaXNAZmVycmV0LmxtaC5veC5hYy51az4KKyAgLSBwaW5nOiBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gcHJfYWRkcigpLgorCitbMDAwOTI4XQorKiBTb3JyeS4gSSBoYXZlIGxvc3QgYWxsIHRoZSBDVlMgd2l0aCBjaGFuZ2VzIG1hZGUgc2luY2UgMDAwNDE4LgorICBJZiBzb21lb25lIHNlbnQgbWUgYSBwYXRjaCBhZnRlciB0aGlzIGRhdGUsIHBsZWFzZSwgcmVzdWJtaXQuCisgIFJlc3RvcmVkIGZyb20gdGhlIGxhc3QgYmFja3VwIGFuZCBtYWlsYm94ZXM6CisKKyogcGluZyosIFNPX1RJTUVTVEFNUCBzdXBwb3J0LgorKiBwaW5nKiwgYWxsb3cgemVybyBkYXRhIGxlbmd0aCAocmVwb3J0ZWQgYnkgRGFtamFuIExhbmdvIDxkYW1qYW4ubGFuZ29AaGVybWVzLnNpPikKKyogaXB1dGlscyBtYW4gYW5kIGhlbHAgdXBkYXRlcy4gUGVra2EgU2F2b2xhIDxQZWtrYS5TYXZvbGFAbmV0Y29yZS5maT4KKyogcGluZy44LCBmaXggdG8gcGluZyBtYW4gcGFnZS4gQnkgRGFkaWQgRWlzbmVyIDxjcmFkbGVAZ2x1ZS51bWQuZWR1PgorKiBwaW5nIHByaW50cyBhZGRyZXNzZXMgaW4gbnVtZXJpYywgaWYgZGVzdGluYXRpb24gaXMgbnVtZXJpYy4KKyAgUHJvcG9zZWQgYnkgVGltIFdhdWdoIDx0d2F1Z2hAbWVtZS5zdXJyZXkucmVkaGF0LmNvbT4KKworTmV3OgorKiBwaW5nOiBzdHJuY3B5IGJ1ZyA8dHlwb0BpbmZlcm5vLnR1c2N1bHVtLmVkdT4KKyogYXJwaW5nOiBpbXByb3ZlbWVudHMgYnkgQ2hhcmxlcyBIb3dlcyA8Y3Jvb3RAbWljcm8tbG9naXN0aWNzLmNvbT4KKwktIGEgZmVhdHVyZSB0byBhcnBpbmc6IHF1aXQgYXMgc29vbiBhcyBhIHJlcGx5IGlzIHJlY2VpdmVkLgorCS0gZGVmYXVsdCB0byBldGgwLgorCS0gc3BlbGxpbmcKKworWzAwMDQxOF0KKyogbGxzcXJ0KCkgd2FzIGJ1Z2d5IGFnYWluIQorICAgICAgIChub3RpY2VkIGJ5IFNhbSBGYXJpbiA8c2ZhcmluQHJhdG9sLmZpPikKKworWzAwMDQwNF0KKyogdHJhY2VwYXRoKiwgIk5VUkRVbmV0LWd3IiBidWcgd29ya2Fyb3VuZC4KKwkobm90aWNlZCBieSBWaXRhbHkgRS5MYXZyb3YgPGx2ZUBhYW5ldC5ydT4pCisqIHRyYWNlcGF0aCosIGhhbmRsZSBjYXNlIG9mIHJvdXRlcnMgaW5pdGlhbGl6aW5nIHJ0dCB0byAxMjguCisJVml0YWx5IEUuTGF2cm92IDxsdmVAYWFuZXQucnU+CisqIHNoYWRvd2VkIGljbXBfc29jayBpbiBwaW5nNi4gSmFtZXMgTW9ycmlzIDxqbW9ycmlzQEBpbnRlcmNvZGUuY29tLmF1PgorKiBCdWcgaW4gcGluZyAtZiwgaW50cm9kdWNlZCB3aXRoIFNPX1JDVlRJTUVPLiBtZS4KKyogbGxzcXJ0KCkgKHBpbmcsIHBpbmc2KSB3YXMgd3JvbmcgeWV0LiBtZS4KKworWzAwMDMxMF0KKyogUHJpbnQgbWVhbiBkZXZpYXRpb24gb2YgUlRUIGluIHBpbmcvcGluZzYuCisqIFVzZSBTSU9DR1NUQU1QIGluIHBpbmcvcGluZzYuIE9sZCBiZWhhdmlvdXIgY2FsY3VsYXRpbmcKKyAgdHJ1ZSB1c2VyLXRvLXVzZXIgbGF0ZW5jeSBpcyByZXN0b3JlZCB3aXRoIG9wdGlvbiAtVS4KKyAgUmVhc29uIGZvciB0aGlzIHN0dXBpZCBjaGFuZ2UgaXMgbWFpbmx5IHBvbGl0aWNhbDsgcGVvcGxlCisgIHdvbmRlciB3aHkgZnJlZWJzZCBoYXMgdHdpY2UgbGVzcyBsYXRlbmN5IG9uIGxvb3BiYWNrLgorICBJZiB0byBmb2xsb3cgYWxvbmcgdGhpcyBsaW5lLCB3ZSBoYXZlIHRvIHByaW50IHJ0dCBlcXVhbCB0byAwLiA4KQorICBbIExBVEVSIE5PVEU6IGFjdHVhbGx5LCB0aGUgY2hhbmdlIGlzIF9yaWdodF8gd2l0aG91dCBhbnkgZG91YnRzLgorICAgIFBpbmcgaGFzIGFub3RoZXIgYnVnOiBuYW1lcmVzb2x2ZXIgaXMgYmxvY2tpbmcsIHNvIHRoYXQKKyAgICB3aGVuIGl0IGRpZXMgbm90IHJlc3BvbmQsIHBpbmcgc2hvd3MgZXZlbmx5IGluY3JlYXNpbmcgYnkgMSBzZWMKKyAgICBSVFQuIEl0IGlzIHZlcnkgY29uZnVzaW5nIChsb29rIHRocm91Z2ggbGludXgta2VybmVsIG1haWxsaXN0cworICAgIHRvIGNvdW50IG51bWJlciBvZiBwZW9wbGUsIHdobyB3ZXJlIGNoZWF0ZWQgYnkgbWlzY29uZmlndXJlZCBkbnMpLiBdCisqIFVzZSBTT19SQ1ZUSU1FTyBpbnN0ZWFkIG9mIHBvbGwoKSB3aXRoIHBpbmcvcGluZzYgLWYuCisqIEFkZGVkIC1WIG9wdGlvbiB0byBhcnBpbmcvcGluZy9waW5nNi90cmFjZXJvdXRlNi9yZGlzYworICB0byBwcmludCBzbmFwc2hvdCBudW1iZXIuCisKK1swMDAzMDVdCisqIHJkaXNjOiB1Z2x5IGJ1ZyBpbiBnZXR0aW5nIGludGVyZmFjZSBsaXN0LiBtZS4KKyogcGluZy9waW5nNjogcGluZyAtaSBOLCBOPj0zIGRpZCBub3Qgd29yay4gSmVmZiBKb25zb24gPGpiakByZWRoYXQuY29tPgorKiBwaW5nL3Bpbmc2OiBtaWNyb3NlY29uZCBydHQgbWVhc3VyZW1lbnRzLiBtZS4KKworWzAwMDEyMF0KKyogcGluZy9waW5nNjogbm9uLXplcm8gZXhpdCBjb2RlIGV2ZW4gd2l0aG91dCAtdy4KKworWzk5MTAyNF0KKyogT3B0aW9uICItaSIgdG8gcGluZy9waW5nNiB0YWtlcyBmcmFjdGlvbmFsIHRpbWUgbm93LCBzbyB0aGF0CisgICJwaW5nIC1pIDAuMyB4eHgiIHBpbmdzIGVhY2ggMzAwIG1zZWMuIFRoZSBpZGVhIGlzIGJ5CisgIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiBhbHBoYS9nbGliYy0yLjEgYWxpZ25tZW50IHByb2JsZW1zIGluIHBpbmcgYXJlIGZpeGVkIChzdHJ1Y3QgdGltZXZhbAorICB3YXMgd3JvbmdseSBhbGlnbmVkKS4KKworWzk5MDkxNV0KKyogcGluZy9waW5nNiB3b3JrZWQgb25seSB3aXRoIGtlcm5lbHMgMi4zLjE1KyBpbiA5OTA4MjQuCisKK1s5OTA4MjRdCisqIHRmdHBkIGlzIGFkZGVkLiBJdCB1c2VzIE1TR19DT05GSVJNIHRvIGNvbmZpcm0gYXJwIGVudHJpZXMuCisqIHBpbmc2OiB3b3JrYXJvdW5kIGZvciBidWcgaW4gc29tZSBlZ2NzIHZlcnNpb25zLgorCitbOTkwNjEwXQorKiBwaW5nOiBvdXRwdXQgYnVmZmVyIHdhcyB0b28gc21hbGwgZm9yIGZ1bGwgc2l6ZWQgcGluZy4KKyogcGluZzogc2lsbHkgcmVzdHJpY3Rpb24gb24gcGluZyBzaXplIGlzIHJlbW92ZWQuCisKK1s5OTA1MzBdCisqIHNob3J0IG1hbiBwYWdlcyAoT2xlZyBNLiBTaHVtc2t5IDxvbXNAY3AudG9tc2suc3U+KQorKiBwaW5nNjogZ2V0IGFuZCBwcmludCBob3AgbGltaXQgb2YgcmVwbHkgcGFja2V0cyAoTUUpCisqIHJkaXNjIGRlbGV0ZXMgcm91dGVzIGJlZm9yZSBleGl0IHdpdGggLVRFUk0KKyogcGluZy9waW5nNjogb3B0aW9uIC13IFRJTUVPVVQgCisqIGFycGluZzogZXhpdCB3aXRoIGVycm9yLCBpZiByZWNlaXZlZCBubyByZXBsaWVzIGluIG5vcm1hbAorICAobm90IERBRCBhbmQgbm90IHVuc2lsaWNpdGVkIEFSUCkgbW9kZS4KKwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9TTkFQU0hPVC5oIGIvaXB1dGlscy9TTkFQU0hPVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMmNjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL1NOQVBTSE9ULmgKQEAgLTAsMCArMSBAQAorc3RhdGljIGNoYXIgU05BUFNIT1RbXSA9ICJzMjAxMjEyMjEiOwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9hcnBpbmcuYyBiL2lwdXRpbHMvYXJwaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MDhjMQotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvYXJwaW5nLmMKQEAgLTAsMCArMSwxMjMzIEBACisvKgorICogYXJwaW5nLmMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKiAJCVlPU0hJRlVKSSBIaWRlYWtpIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpZmRlZiBDQVBBQklMSVRJRVMKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvY2FwYWJpbGl0eS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2lmZGVmIFVTRV9TWVNGUworI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CitzdHJ1Y3Qgc3lzZnNfZGV2YXR0cl92YWx1ZXM7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIT1VUX0lGQUREUlMKKyNpbmNsdWRlIDxpZmFkZHJzLmg+CisjZW5kaWYKKworI2lmZGVmIFVTRV9JRE4KKyNpbmNsdWRlIDxpZG5hLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNOQVBTSE9ULmgiCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKKyNpZmRlZiBERUZBVUxUX0RFVklDRQorIyBkZWZpbmUgREVGQVVMVF9ERVZJQ0VfU1RSCURFRkFVTFRfREVWSUNFCisjZWxzZQorIyBkZWZpbmUgREVGQVVMVF9ERVZJQ0UJCU5VTEwKKyNlbmRpZgorCitzdHJ1Y3QgZGV2aWNlIHsKKwljaGFyICpuYW1lOworCWludCBpZmluZGV4OworI2lmbmRlZiBXSVRIT1VUX0lGQUREUlMKKwlzdHJ1Y3QgaWZhZGRycyAqaWZhOworI2VuZGlmCisjaWZkZWYgVVNFX1NZU0ZTCisJc3RydWN0IHN5c2ZzX2RldmF0dHJfdmFsdWVzICpzeXNmczsKKyNlbmRpZgorfTsKKworaW50IHF1aXRfb25fcmVwbHk9MDsKK3N0cnVjdCBkZXZpY2UgZGV2aWNlID0geworCS5uYW1lID0gREVGQVVMVF9ERVZJQ0UsCit9OworY2hhciAqc291cmNlOworc3RydWN0IGluX2FkZHIgc3JjLCBkc3Q7CitjaGFyICp0YXJnZXQ7CitpbnQgZGFkLCB1bnNvbGljaXRlZCwgYWR2ZXJ0OworaW50IHF1aWV0OworaW50IGNvdW50PS0xOworaW50IHRpbWVvdXQ7CitpbnQgdW5pY2FzdGluZzsKK2ludCBzOworaW50IGJyb2FkY2FzdF9vbmx5OworCitzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBtZTsKK3N0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGhlOworCitzdHJ1Y3QgdGltZXZhbCBzdGFydCwgbGFzdDsKKworaW50IHNlbnQsIGJyZF9zZW50OworaW50IHJlY2VpdmVkLCBicmRfcmVjdiwgcmVxX3JlY3Y7CisKKyNpZm5kZWYgQ0FQQUJJTElUSUVTCitzdGF0aWMgdWlkX3QgZXVpZDsKKyNlbmRpZgorCisjZGVmaW5lIE1TX1RESUZGKHR2MSx0djIpICggKCh0djEpLnR2X3NlYy0odHYyKS50dl9zZWMpKjEwMDAgKyBcCisJCQkgICAoKHR2MSkudHZfdXNlYy0odHYyKS50dl91c2VjKS8xMDAwICkKKworI2RlZmluZSBPRkZTRVRfT0YobmFtZSxlbGUpCSgoc2l6ZV90KSgoKG5hbWUgKikwKS0+ZWxlKSkKKworc3RhdGljIGlubGluZSBzb2NrbGVuX3Qgc2xsX2xlbihzaXplX3QgaGFsZW4pCit7CisJc29ja2xlbl90IGxlbiA9IE9GRlNFVF9PRihzdHJ1Y3Qgc29ja2FkZHJfbGwsIHNsbF9hZGRyKSArIGhhbGVuOworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkKKwkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCk7CisJcmV0dXJuIGxlbjsKK30KKworI2RlZmluZSBTTExfTEVOKGhsbikJCXNsbF9sZW4oaGxuKQorCit2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJVc2FnZTogYXJwaW5nIFstZnFiRFVBVl0gWy1jIGNvdW50XSBbLXcgdGltZW91dF0gWy1JIGRldmljZV0gWy1zIHNvdXJjZV0gZGVzdGluYXRpb25cbiIKKwkJIiAgLWYgOiBxdWl0IG9uIGZpcnN0IHJlcGx5XG4iCisJCSIgIC1xIDogYmUgcXVpZXRcbiIKKwkJIiAgLWIgOiBrZWVwIGJyb2FkY2FzdGluZywgZG9uJ3QgZ28gdW5pY2FzdFxuIgorCQkiICAtRCA6IGR1cGxpY2F0ZSBhZGRyZXNzIGRldGVjdGlvbiBtb2RlXG4iCisJCSIgIC1VIDogVW5zb2xpY2l0ZWQgQVJQIG1vZGUsIHVwZGF0ZSB5b3VyIG5laWdoYm91cnNcbiIKKwkJIiAgLUEgOiBBUlAgYW5zd2VyIG1vZGUsIHVwZGF0ZSB5b3VyIG5laWdoYm91cnNcbiIKKwkJIiAgLVYgOiBwcmludCB2ZXJzaW9uIGFuZCBleGl0XG4iCisJCSIgIC1jIGNvdW50IDogaG93IG1hbnkgcGFja2V0cyB0byBzZW5kXG4iCisJCSIgIC13IHRpbWVvdXQgOiBob3cgbG9uZyB0byB3YWl0IGZvciBhIHJlcGx5XG4iCisJCSIgIC1JIGRldmljZSA6IHdoaWNoIGV0aGVybmV0IGRldmljZSB0byB1c2UiCisjaWZkZWYgREVGQVVMVF9ERVZJQ0VfU1RSCisJCQkiICgiIERFRkFVTFRfREVWSUNFX1NUUiAiKSIKKyNlbmRpZgorCQkJIlxuIgorCQkiICAtcyBzb3VyY2UgOiBzb3VyY2UgaXAgYWRkcmVzc1xuIgorCQkiICBkZXN0aW5hdGlvbiA6IGFzayBmb3Igd2hhdCBpcCBhZGRyZXNzXG4iCisJCSk7CisJZXhpdCgyKTsKK30KKwordm9pZCBzZXRfc2lnbmFsKGludCBzaWdubywgdm9pZCAoKmhhbmRsZXIpKHZvaWQpKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gKHZvaWQgKCopKGludCkpaGFuZGxlcjsKKwlzYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7CisJc2lnYWN0aW9uKHNpZ25vLCAmc2EsIE5VTEwpOworfQorCisjaWZkZWYgQ0FQQUJJTElUSUVTCitzdGF0aWMgY29uc3QgY2FwX3ZhbHVlX3QgY2Fwc1tdID0geyBDQVBfTkVUX1JBVywgfTsKK3N0YXRpYyBjYXBfZmxhZ192YWx1ZV90IGNhcF9yYXcgPSBDQVBfQ0xFQVI7CisjZW5kaWYKKwordm9pZCBsaW1pdF9jYXBhYmlsaXRpZXModm9pZCkKK3sKKyNpZmRlZiBDQVBBQklMSVRJRVMKKwljYXBfdCBjYXBfcDsKKworCWNhcF9wID0gY2FwX2dldF9wcm9jKCk7CisJaWYgKCFjYXBfcCkgeworCQlwZXJyb3IoImFycGluZzogY2FwX2dldF9wcm9jIik7CisJCWV4aXQoLTEpOworCX0KKworCWNhcF9nZXRfZmxhZyhjYXBfcCwgQ0FQX05FVF9SQVcsIENBUF9QRVJNSVRURUQsICZjYXBfcmF3KTsKKworCWlmIChjYXBfcmF3ICE9IENBUF9DTEVBUikgeworCQlpZiAoY2FwX2NsZWFyKGNhcF9wKSA8IDApIHsKKwkJCXBlcnJvcigiYXJwaW5nOiBjYXBfY2xlYXIiKTsKKwkJCWV4aXQoLTEpOworCQl9CisKKwkJY2FwX3NldF9mbGFnKGNhcF9wLCBDQVBfUEVSTUlUVEVELCAxLCBjYXBzLCBDQVBfU0VUKTsKKworCQlpZiAoY2FwX3NldF9wcm9jKGNhcF9wKSA8IDApIHsKKwkJCXBlcnJvcigiYXJwaW5nOiBjYXBfc2V0X3Byb2MiKTsKKwkJCWlmIChlcnJubyAhPSBFUEVSTSkKKwkJCQlleGl0KC0xKTsKKwkJfQorCX0KKworCWlmIChwcmN0bChQUl9TRVRfS0VFUENBUFMsIDEpIDwgMCkgeworCQlwZXJyb3IoImFycGluZzogcHJjdGwiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKHNldHVpZChnZXR1aWQoKSkgPCAwKSB7CisJCXBlcnJvcigiYXJwaW5nOiBzZXR1aWQiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKHByY3RsKFBSX1NFVF9LRUVQQ0FQUywgMCkgPCAwKSB7CisJCXBlcnJvcigiYXJwaW5nOiBwcmN0bCIpOworCQlleGl0KC0xKTsKKwl9CisKKwljYXBfZnJlZShjYXBfcCk7CisjZWxzZQorCWV1aWQgPSBnZXRldWlkKCk7CisjZW5kaWYKK30KKworaW50IG1vZGlmeV9jYXBhYmlsaXR5X3JhdyhpbnQgb24pCit7CisjaWZkZWYgQ0FQQUJJTElUSUVTCisJY2FwX3QgY2FwX3A7CisKKwlpZiAoY2FwX3JhdyAhPSBDQVBfU0VUKQorCQlyZXR1cm4gb24gPyAtMSA6IDA7CisKKwljYXBfcCA9IGNhcF9nZXRfcHJvYygpOworCWlmICghY2FwX3ApIHsKKwkJcGVycm9yKCJhcnBpbmc6IGNhcF9nZXRfcHJvYyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2FwX3NldF9mbGFnKGNhcF9wLCBDQVBfRUZGRUNUSVZFLCAxLCBjYXBzLCBvbiA/IENBUF9TRVQgOiBDQVBfQ0xFQVIpOworCisJaWYgKGNhcF9zZXRfcHJvYyhjYXBfcCkgPCAwKSB7CisJCXBlcnJvcigiYXJwaW5nOiBjYXBfc2V0X3Byb2MiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNhcF9mcmVlKGNhcF9wKTsKKyNlbHNlCisJaWYgKHNldHVpZChvbiA/IGV1aWQgOiBnZXR1aWQoKSkpIHsKKwkJcGVycm9yKCJhcnBpbmc6IHNldHVpZCIpOworCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYWJsZV9jYXBhYmlsaXR5X3Jhdyh2b2lkKQoreworCXJldHVybiBtb2RpZnlfY2FwYWJpbGl0eV9yYXcoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpc2FibGVfY2FwYWJpbGl0eV9yYXcodm9pZCkKK3sKKwlyZXR1cm4gbW9kaWZ5X2NhcGFiaWxpdHlfcmF3KDApOworfQorCit2b2lkIGRyb3BfY2FwYWJpbGl0aWVzKHZvaWQpCit7CisjaWZkZWYgQ0FQQUJJTElUSUVTCisJY2FwX3QgY2FwX3AgPSBjYXBfaW5pdCgpOworCisJaWYgKCFjYXBfcCkgeworCQlwZXJyb3IoImFycGluZzogY2FwX2luaXQiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKGNhcF9zZXRfcHJvYyhjYXBfcCkgPCAwKSB7CisJCXBlcnJvcigiYXJwaW5nOiBjYXBfc2V0X3Byb2MiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJY2FwX2ZyZWUoY2FwX3ApOworI2Vsc2UKKwlpZiAoc2V0dWlkKGdldHVpZCgpKSA8IDApIHsKKwkJcGVycm9yKCJhcnBpbmc6IHNldHVpZCIpOworCQlleGl0KC0xKTsKKwl9CisjZW5kaWYKK30KKworaW50IHNlbmRfcGFjayhpbnQgcywgc3RydWN0IGluX2FkZHIgc3JjLCBzdHJ1Y3QgaW5fYWRkciBkc3QsCisJICAgICAgc3RydWN0IHNvY2thZGRyX2xsICpNRSwgc3RydWN0IHNvY2thZGRyX2xsICpIRSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOworCXN0cnVjdCBhcnBoZHIgKmFoID0gKHN0cnVjdCBhcnBoZHIqKWJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikoYWgrMSk7CisKKwlhaC0+YXJfaHJkID0gaHRvbnMoTUUtPnNsbF9oYXR5cGUpOworCWlmIChhaC0+YXJfaHJkID09IGh0b25zKEFSUEhSRF9GRERJKSkKKwkJYWgtPmFyX2hyZCA9IGh0b25zKEFSUEhSRF9FVEhFUik7CisJYWgtPmFyX3BybyA9IGh0b25zKEVUSF9QX0lQKTsKKwlhaC0+YXJfaGxuID0gTUUtPnNsbF9oYWxlbjsKKwlhaC0+YXJfcGxuID0gNDsKKwlhaC0+YXJfb3AgID0gYWR2ZXJ0ID8gaHRvbnMoQVJQT1BfUkVQTFkpIDogaHRvbnMoQVJQT1BfUkVRVUVTVCk7CisKKwltZW1jcHkocCwgJk1FLT5zbGxfYWRkciwgYWgtPmFyX2hsbik7CisJcCs9TUUtPnNsbF9oYWxlbjsKKworCW1lbWNweShwLCAmc3JjLCA0KTsKKwlwKz00OworCisJaWYgKGFkdmVydCkKKwkJbWVtY3B5KHAsICZNRS0+c2xsX2FkZHIsIGFoLT5hcl9obG4pOworCWVsc2UKKwkJbWVtY3B5KHAsICZIRS0+c2xsX2FkZHIsIGFoLT5hcl9obG4pOworCXArPWFoLT5hcl9obG47CisKKwltZW1jcHkocCwgJmRzdCwgNCk7CisJcCs9NDsKKworCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwllcnIgPSBzZW5kdG8ocywgYnVmLCBwLWJ1ZiwgMCwgKHN0cnVjdCBzb2NrYWRkciopSEUsIFNMTF9MRU4oYWgtPmFyX2hsbikpOworCWlmIChlcnIgPT0gcC1idWYpIHsKKwkJbGFzdCA9IG5vdzsKKwkJc2VudCsrOworCQlpZiAoIXVuaWNhc3RpbmcpCisJCQlicmRfc2VudCsrOworCX0KKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGZpbmlzaCh2b2lkKQoreworCWlmICghcXVpZXQpIHsKKwkJcHJpbnRmKCJTZW50ICVkIHByb2JlcyAoJWQgYnJvYWRjYXN0KHMpKVxuIiwgc2VudCwgYnJkX3NlbnQpOworCQlwcmludGYoIlJlY2VpdmVkICVkIHJlc3BvbnNlKHMpIiwgcmVjZWl2ZWQpOworCQlpZiAoYnJkX3JlY3YgfHwgcmVxX3JlY3YpIHsKKwkJCXByaW50ZigiICgiKTsKKwkJCWlmIChyZXFfcmVjdikKKwkJCQlwcmludGYoIiVkIHJlcXVlc3QocykiLCByZXFfcmVjdik7CisJCQlpZiAoYnJkX3JlY3YpCisJCQkJcHJpbnRmKCIlcyVkIGJyb2FkY2FzdChzKSIsCisJCQkJICAgICAgIHJlcV9yZWN2ID8gIiwgIiA6ICIiLAorCQkJCSAgICAgICBicmRfcmVjdik7CisJCQlwcmludGYoIikiKTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJCWZmbHVzaChzdGRvdXQpOworCX0KKwlpZiAoZGFkKQorCQlleGl0KCEhcmVjZWl2ZWQpOworCWlmICh1bnNvbGljaXRlZCkKKwkJZXhpdCgwKTsKKwlleGl0KCFyZWNlaXZlZCk7Cit9CisKK3ZvaWQgY2F0Y2hlcih2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHR2LCB0dl9zLCB0dl9vOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKwlpZiAoc3RhcnQudHZfc2VjPT0wKQorCQlzdGFydCA9IHR2OworCisJdGltZXJzdWIoJnR2LCAmc3RhcnQsICZ0dl9zKTsKKwl0dl9vLnR2X3NlYyA9IHRpbWVvdXQ7CisJdHZfby50dl91c2VjID0gNTAwICogMTAwMDsKKworCWlmIChjb3VudC0tID09IDAgfHwgKHRpbWVvdXQgJiYgdGltZXJjbXAoJnR2X3MsICZ0dl9vLCA+KSkpCisJCWZpbmlzaCgpOworCisJdGltZXJzdWIoJnR2LCAmbGFzdCwgJnR2X3MpOworCXR2X28udHZfc2VjID0gMDsKKworCWlmIChsYXN0LnR2X3NlYz09MCB8fCB0aW1lcmNtcCgmdHZfcywgJnR2X28sID4pKSB7CisJCXNlbmRfcGFjayhzLCBzcmMsIGRzdCwKKwkJCSAgKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZtZSwgKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZoZSk7CisJCWlmIChjb3VudCA9PSAwICYmIHVuc29saWNpdGVkKQorCQkJZmluaXNoKCk7CisJfQorCWFsYXJtKDEpOworfQorCit2b2lkIHByaW50X2hleCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQoreworCWludCBpOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCXByaW50ZigiJTAyWCIsIHBbaV0pOworCQlpZiAoaSAhPSBsZW4tMSkKKwkJCXByaW50ZigiOiIpOworCX0KK30KKworaW50IHJlY3ZfcGFjayh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIHN0cnVjdCBzb2NrYWRkcl9sbCAqRlJPTSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgYXJwaGRyICphaCA9IChzdHJ1Y3QgYXJwaGRyKilidWY7CisJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopKGFoKzEpOworCXN0cnVjdCBpbl9hZGRyIHNyY19pcCwgZHN0X2lwOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKwkvKiBGaWx0ZXIgb3V0IHdpbGQgcGFja2V0cyAqLworCWlmIChGUk9NLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfSE9TVCAmJgorCSAgICBGUk9NLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfQlJPQURDQVNUICYmCisJICAgIEZST00tPnNsbF9wa3R0eXBlICE9IFBBQ0tFVF9NVUxUSUNBU1QpCisJCXJldHVybiAwOworCisJLyogT25seSB0aGVzZSB0eXBlcyBhcmUgcmVjb2duaXNlZCAqLworCWlmIChhaC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkgJiYKKwkgICAgYWgtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUExZKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBUlBIUkQgY2hlY2sgYW5kIHRoaXMgZGFybmVkIEZEREkgaGFjayBoZXJlIDotKCAqLworCWlmIChhaC0+YXJfaHJkICE9IGh0b25zKEZST00tPnNsbF9oYXR5cGUpICYmCisJICAgIChGUk9NLT5zbGxfaGF0eXBlICE9IEFSUEhSRF9GRERJIHx8IGFoLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKSkpCisJCXJldHVybiAwOworCisJLyogUHJvdG9jb2wgbXVzdCBiZSBJUC4gKi8KKwlpZiAoYWgtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiAwOworCWlmIChhaC0+YXJfcGxuICE9IDQpCisJCXJldHVybiAwOworCWlmIChhaC0+YXJfaGxuICE9ICgoc3RydWN0IHNvY2thZGRyX2xsICopJm1lKS0+c2xsX2hhbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAobGVuIDwgc2l6ZW9mKCphaCkgKyAyKig0ICsgYWgtPmFyX2hsbikpCisJCXJldHVybiAwOworCW1lbWNweSgmc3JjX2lwLCBwK2FoLT5hcl9obG4sIDQpOworCW1lbWNweSgmZHN0X2lwLCBwK2FoLT5hcl9obG4rNCthaC0+YXJfaGxuLCA0KTsKKwlpZiAoIWRhZCkgeworCQlpZiAoc3JjX2lwLnNfYWRkciAhPSBkc3Quc19hZGRyKQorCQkJcmV0dXJuIDA7CisJCWlmIChzcmMuc19hZGRyICE9IGRzdF9pcC5zX2FkZHIpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG1lbWNtcChwK2FoLT5hcl9obG4rNCwgKChzdHJ1Y3Qgc29ja2FkZHJfbGwgKikmbWUpLT5zbGxfYWRkciwgYWgtPmFyX2hsbikpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBEQUQgcGFja2V0IHdhczoKKwkJICAgc3JjX2lwID0gMCAob3Igc29tZSBzcmMpCisJCSAgIHNyY19odyA9IE1FCisJCSAgIGRzdF9pcCA9IHRlc3RlZCBhZGRyZXNzCisJCSAgIGRzdF9odyA9IDx1bnNwZWM+CisKKwkJICAgV2UgZmFpbCwgaWYgcmVjZWl2ZSByZXF1ZXN0L3JlcGx5IHdpdGg6CisJCSAgIHNyY19pcCA9IHRlc3RlZF9hZGRyZXNzCisJCSAgIHNyY19odyAhPSBNRQorCQkgICBpZiBzcmNfaXAgaW4gcmVxdWVzdCB3YXMgbm90IHplcm8sIGNoZWNrCisJCSAgIGFsc28gdGhhdCBpdCBtYXRjaGVzIHRvIGRzdF9pcCwgb3RoZXJ3aXNlCisJCSAgIGRzdF9pcC9kc3RfaHcgZG8gbm90IG1hdHRlci4KKwkJICovCisJCWlmIChzcmNfaXAuc19hZGRyICE9IGRzdC5zX2FkZHIpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG1lbWNtcChwLCAoKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZtZSktPnNsbF9hZGRyLCAoKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZtZSktPnNsbF9oYWxlbikgPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoc3JjLnNfYWRkciAmJiBzcmMuc19hZGRyICE9IGRzdF9pcC5zX2FkZHIpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFxdWlldCkgeworCQlpbnQgc19wcmludGVkID0gMDsKKwkJcHJpbnRmKCIlcyAiLCBGUk9NLT5zbGxfcGt0dHlwZT09UEFDS0VUX0hPU1QgPyAiVW5pY2FzdCIgOiAiQnJvYWRjYXN0Iik7CisJCXByaW50ZigiJXMgZnJvbSAiLCBhaC0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVQTFkpID8gInJlcGx5IiA6ICJyZXF1ZXN0Iik7CisJCXByaW50ZigiJXMgWyIsIGluZXRfbnRvYShzcmNfaXApKTsKKwkJcHJpbnRfaGV4KHAsIGFoLT5hcl9obG4pOworCQlwcmludGYoIl0gIik7CisJCWlmIChkc3RfaXAuc19hZGRyICE9IHNyYy5zX2FkZHIpIHsKKwkJCXByaW50ZigiZm9yICVzICIsIGluZXRfbnRvYShkc3RfaXApKTsKKwkJCXNfcHJpbnRlZCA9IDE7CisJCX0KKwkJaWYgKG1lbWNtcChwK2FoLT5hcl9obG4rNCwgKChzdHJ1Y3Qgc29ja2FkZHJfbGwgKikmbWUpLT5zbGxfYWRkciwgYWgtPmFyX2hsbikpIHsKKwkJCWlmICghc19wcmludGVkKQorCQkJCXByaW50ZigiZm9yICIpOworCQkJcHJpbnRmKCJbIik7CisJCQlwcmludF9oZXgocCthaC0+YXJfaGxuKzQsIGFoLT5hcl9obG4pOworCQkJcHJpbnRmKCJdIik7CisJCX0KKwkJaWYgKGxhc3QudHZfc2VjKSB7CisJCQlsb25nIHVzZWNzID0gKHR2LnR2X3NlYy1sYXN0LnR2X3NlYykgKiAxMDAwMDAwICsKKwkJCQl0di50dl91c2VjLWxhc3QudHZfdXNlYzsKKwkJCWxvbmcgbXNlY3MgPSAodXNlY3MrNTAwKS8xMDAwOworCQkJdXNlY3MgLT0gbXNlY3MqMTAwMCAtIDUwMDsKKwkJCXByaW50ZigiICVsZC4lMDNsZG1zXG4iLCBtc2VjcywgdXNlY3MpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIgVU5TT0xJQ0lURUQ/XG4iKTsKKwkJfQorCQlmZmx1c2goc3Rkb3V0KTsKKwl9CisJcmVjZWl2ZWQrKzsKKwlpZiAoRlJPTS0+c2xsX3BrdHR5cGUgIT0gUEFDS0VUX0hPU1QpCisJCWJyZF9yZWN2Kys7CisJaWYgKGFoLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKSkKKwkJcmVxX3JlY3YrKzsKKwlpZiAocXVpdF9vbl9yZXBseSkKKwkJZmluaXNoKCk7CisJaWYoIWJyb2FkY2FzdF9vbmx5KSB7CisJCW1lbWNweSgoKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZoZSktPnNsbF9hZGRyLCBwLCAoKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZtZSktPnNsbF9oYWxlbik7CisJCXVuaWNhc3Rpbmc9MTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBVU0VfU1lTRlMKK3VuaW9uIHN5c2ZzX2RldmF0dHJfdmFsdWUgeworCXVuc2lnbmVkIGxvbmcJdWxvbmc7CisJdm9pZAkJKnB0cjsKK307CisKK2VudW0geworCVNZU0ZTX0RFVkFUVFJfSUZJTkRFWCwKKwlTWVNGU19ERVZBVFRSX0ZMQUdTLAorCVNZU0ZTX0RFVkFUVFJfQUREUl9MRU4sCisjaWYgMAorCVNZU0ZTX0RFVkFUVFJfVFlQRSwKKwlTWVNGU19ERVZBVFRSX0FERFJFU1MsCisjZW5kaWYKKwlTWVNGU19ERVZBVFRSX0JST0FEQ0FTVCwKKwlTWVNGU19ERVZBVFRSX05VTQorfTsKKworc3RydWN0IHN5c2ZzX2RldmF0dHJfdmFsdWVzCit7CisJY2hhciAqaWZuYW1lOworCXVuaW9uIHN5c2ZzX2RldmF0dHJfdmFsdWUJdmFsdWVbU1lTRlNfREVWQVRUUl9OVU1dOworfTsKKworc3RhdGljIGludCBzeXNmc19kZXZhdHRyX3Vsb25nX2RlYyhjaGFyICpwdHIsIHN0cnVjdCBzeXNmc19kZXZhdHRyX3ZhbHVlcyAqdiwgdW5zaWduZWQgaWR4KTsKK3N0YXRpYyBpbnQgc3lzZnNfZGV2YXR0cl91bG9uZ19oZXgoY2hhciAqcHRyLCBzdHJ1Y3Qgc3lzZnNfZGV2YXR0cl92YWx1ZXMgKnYsIHVuc2lnbmVkIGlkeCk7CitzdGF0aWMgaW50IHN5c2ZzX2RldmF0dHJfbWFjYWRkcihjaGFyICpwdHIsIHN0cnVjdCBzeXNmc19kZXZhdHRyX3ZhbHVlcyAqdiwgdW5zaWduZWQgaWR4KTsKKworc3RydWN0IHN5c2ZzX2RldmF0dHJzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKmhhbmRsZXIpKGNoYXIgKnB0ciwgc3RydWN0IHN5c2ZzX2RldmF0dHJfdmFsdWVzICp2LCB1bnNpZ25lZCBpbnQgaWR4KTsKKwlpbnQgZnJlZTsKK30gc3lzZnNfZGV2YXR0cnNbU1lTRlNfREVWQVRUUl9OVU1dID0geworCVtTWVNGU19ERVZBVFRSX0lGSU5ERVhdID0geworCQkubmFtZQkJPSAiaWZpbmRleCIsCisJCS5oYW5kbGVyCT0gc3lzZnNfZGV2YXR0cl91bG9uZ19kZWMsCisJfSwKKwlbU1lTRlNfREVWQVRUUl9BRERSX0xFTl0gPSB7CisJCS5uYW1lCQk9ICJhZGRyX2xlbiIsCisJCS5oYW5kbGVyCT0gc3lzZnNfZGV2YXR0cl91bG9uZ19kZWMsCisJfSwKKwlbU1lTRlNfREVWQVRUUl9GTEFHU10gPSB7CisJCS5uYW1lCQk9ICJmbGFncyIsCisJCS5oYW5kbGVyCT0gc3lzZnNfZGV2YXR0cl91bG9uZ19oZXgsCisJfSwKKyNpZiAwCisJW1NZU0ZTX0RFVkFUVFJfVFlQRV0gPSB7CisJCS5uYW1lCQk9ICJ0eXBlIiwKKwkJLmhhbmRsZXIJPSBzeXNmc19kZXZhdHRyX3Vsb25nX2RlYywKKwl9LAorCVtTWVNGU19ERVZBVFRSX0FERFJFU1NdID0geworCQkubmFtZQkJPSAiYWRkcmVzcyIsCisJCS5oYW5kbGVyCT0gc3lzZnNfZGV2YXR0cl9tYWNhZGRyLAorCQkuZnJlZQkJPSAxLAorCX0sCisjZW5kaWYKKwlbU1lTRlNfREVWQVRUUl9CUk9BRENBU1RdID0geworCQkubmFtZQkJPSAiYnJvYWRjYXN0IiwKKwkJLmhhbmRsZXIJPSBzeXNmc19kZXZhdHRyX21hY2FkZHIsCisJCS5mcmVlCQk9IDEsCisJfSwKK307CisjZW5kaWYKKworLyoKKyAqIGZpbmRfZGV2aWNlKCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyAxKSBpZiB0aGUgZGV2aWNlIChpZiBnaXZlbikgaXMgb2theSBmb3IgQVJQLAorICogb3IgMikgZmluZCBmaXN0IGFwcHJvcHJpYXRlIGRldmljZSBvbiB0aGUgc3lzdGVtLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCT4wCTogU3VjY2VlZGVkLCBhbmQgYXBwcm9wcmlhdGUgZGV2aWNlIG5vdCBmb3VuZC4KKyAqCQkgIGRldmljZS5pZmluZGV4IHJlbWFpbnMgMC4KKyAqCTAJOiBTdWNjZWVkZWQsIGFuZCBhcHByb3B0aWF0ZSBkZXZpY2UgZm91bmQuCisgKgkJICBkZXZpY2UuaWZpbmRleCBpcyBzZXQuCisgKgk8MAk6IEZhaWxlZC4gIFN1cHBvcnQgbm90IGZvdW5kLCBvciBvdGhlcgorICoJCTogc3lzdGVtIGVycm9yLiAgVHJ5IG90aGVyIG1ldGhvZC4KKyAqCisgKiBJZiBhbiBhcHByb3ByaWF0ZSBkZXZpY2UgZm91bmQsIGl0IGlzIHJlY29yZGVkIGluc2lkZSB0aGUKKyAqICJkZXZpY2UiIHZhcmlhYmxlIGZvciBsYXRlciByZWZlcmVuY2UuCisgKgorICogV2UgaGF2ZSBzZXZlcmFsIGltcGxlbWVudGF0aW9ucyBmb3IgdGhpcy4KKyAqCWJ5X2lmYWRkcnMoKToJcmVxdWlyZXMgZ2V0aWZhZGRyKCkgaW4gZ2xpYmMsIGFuZCBydG5ldGxpbmsgaW4KKyAqCQkJa2VybmVsLiBkZWZhdWx0IGFuZCByZWNvbW1lbmRlZCBmb3IgcmVjZW50IHN5c3RlbXMuCisgKglieV9zeXNmcygpOglyZXF1aXJlcyBsaWJzeXNmcyAsIGFuZCBzeXNmcyBpbiBrZXJuZWwuCisgKglieV9pb2N0bCgpOgl1bmFibGUgdG8gbGlzdCBkZXZpY2VzIHdpdGhvdXQgaXB2NCBhZGRyZXNzOyB0aGlzCisgKgkJCW1lYW5zLCB5b3UgbmVlZCB0byBzdXBwbHkgdGhlIGRldmljZSBuYW1lIGZvcgorICoJCQlEQUQgcHVycG9zZS4KKyAqLworLyogQ29tbW9uIGNoZWNrIGZvciBpZmEtPmlmYV9mbGFncyAqLworc3RhdGljIGludCBjaGVja19pZmZsYWdzKHVuc2lnbmVkIGludCBpZmZsYWdzLCBpbnQgZmF0YWwpCit7CisJaWYgKCEoaWZmbGFncyAmIElGRl9VUCkpIHsKKwkJaWYgKGZhdGFsKSB7CisJCQlpZiAoIXF1aWV0KQorCQkJCXByaW50ZigiSW50ZXJmYWNlIFwiJXNcIiBpcyBkb3duXG4iLCBkZXZpY2UubmFtZSk7CisJCQlleGl0KDIpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGlmZmxhZ3MgJiAoSUZGX05PQVJQIHwgSUZGX0xPT1BCQUNLKSkgeworCQlpZiAoZmF0YWwpIHsKKwkJCWlmICghcXVpZXQpCisJCQkJcHJpbnRmKCJJbnRlcmZhY2UgXCIlc1wiIGlzIG5vdCBBUlBhYmxlXG4iLCBkZXZpY2UubmFtZSk7CisJCQlleGl0KGRhZCA/IDAgOiAyKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfZGV2aWNlX2J5X2lmYWRkcnModm9pZCkKK3sKKyNpZm5kZWYgV0lUSE9VVF9JRkFERFJTCisJaW50IHJjOworCXN0cnVjdCBpZmFkZHJzICppZmEwLCAqaWZhOworCWludCBjb3VudCA9IDA7CisKKwlyYyA9IGdldGlmYWRkcnMoJmlmYTApOworCWlmIChyYykgeworCQlwZXJyb3IoImdldGlmYWRkcnMiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaWZhID0gaWZhMDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisJCWlmICghaWZhLT5pZmFfYWRkcikKKwkJCWNvbnRpbnVlOworCQlpZiAoaWZhLT5pZmFfYWRkci0+c2FfZmFtaWx5ICE9IEFGX1BBQ0tFVCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2aWNlLm5hbWUgJiYgaWZhLT5pZmFfbmFtZSAmJiBzdHJjbXAoaWZhLT5pZmFfbmFtZSwgZGV2aWNlLm5hbWUpKQorCQkJY29udGludWU7CisKKwkJaWYgKGNoZWNrX2lmZmxhZ3MoaWZhLT5pZmFfZmxhZ3MsIGRldmljZS5uYW1lICE9IE5VTEwpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKChzdHJ1Y3Qgc29ja2FkZHJfbGwgKilpZmEtPmlmYV9hZGRyKS0+c2xsX2hhbGVuKQorCQkJY29udGludWU7CisJCWlmICghaWZhLT5pZmFfYnJvYWRhZGRyKQorCQkJY29udGludWU7CisKKwkJZGV2aWNlLmlmYSA9IGlmYTsKKworCQlpZiAoY291bnQrKykKKwkJCWJyZWFrOworCX0KKworCWlmIChjb3VudCA9PSAxICYmIGRldmljZS5pZmEpIHsKKwkJZGV2aWNlLmlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChkZXZpY2UuaWZhLT5pZmFfbmFtZSk7CisJCWlmICghZGV2aWNlLmlmaW5kZXgpIHsKKwkJCXBlcnJvcigiYXJwaW5nOiBpZl9uYW1ldG9pbmRleCIpOworCQkJZnJlZWlmYWRkcnMoaWZhMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZGV2aWNlLm5hbWUgID0gZGV2aWNlLmlmYS0+aWZhX25hbWU7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKKyNlbHNlCisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKKyNpZmRlZiBVU0VfU1lTRlMKK3N0YXRpYyB2b2lkIHN5c2ZzX2RldmF0dHJfdmFsdWVzX2luaXQoc3RydWN0IHN5c2ZzX2RldmF0dHJfdmFsdWVzICp2LCBpbnQgZG9fZnJlZSkKK3sKKwlpbnQgaTsKKwlpZiAoZG9fZnJlZSkgeworCQlmcmVlKHYtPmlmbmFtZSk7CisJCWZvciAoaSA9IDA7IGkgPCBTWVNGU19ERVZBVFRSX05VTTsgaSsrKSB7CisJCQlpZiAoc3lzZnNfZGV2YXR0cnNbaV0uZnJlZSkKKwkJCQlmcmVlKHYtPnZhbHVlW2ldLnB0cik7CisJCX0KKwl9CisJbWVtc2V0KHYsIDAsIHNpemVvZigqdikpOworfQorCitzdGF0aWMgaW50IHN5c2ZzX2RldmF0dHJfdWxvbmcoY2hhciAqcHRyLCBzdHJ1Y3Qgc3lzZnNfZGV2YXR0cl92YWx1ZXMgKnYsIHVuc2lnbmVkIGludCBpZHgsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nICpwOworCWNoYXIgKmVwOworCisJaWYgKCFwdHIgfHwgIXYpCisJCXJldHVybiAtMTsKKworCXAgPSAmdi0+dmFsdWVbaWR4XS51bG9uZzsKKwllcnJubyA9IDA7CisJKnAgPSBzdHJ0b3VsKHB0ciwgJmVwLCBiYXNlKTsKKwlpZiAoKCpwdHIgJiYgaXNzcGFjZSgqcHRyICYgMHhmZikpIHx8IGVycm5vIHx8ICgqZXAgIT0gJ1wwJyAmJiAqZXAgIT0gJ1xuJykpCisJCWdvdG8gb3V0OworCisJcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHN5c2ZzX2RldmF0dHJfdWxvbmdfZGVjKGNoYXIgKnB0ciwgc3RydWN0IHN5c2ZzX2RldmF0dHJfdmFsdWVzICp2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCWludCByYyA9IHN5c2ZzX2RldmF0dHJfdWxvbmcocHRyLCB2LCBpZHgsIDEwKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgc3lzZnNfZGV2YXR0cl91bG9uZ19oZXgoY2hhciAqcHRyLCBzdHJ1Y3Qgc3lzZnNfZGV2YXR0cl92YWx1ZXMgKnYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJaW50IHJjID0gc3lzZnNfZGV2YXR0cl91bG9uZyhwdHIsIHYsIGlkeCwgMTYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBzeXNmc19kZXZhdHRyX21hY2FkZHIoY2hhciAqcHRyLCBzdHJ1Y3Qgc3lzZnNfZGV2YXR0cl92YWx1ZXMgKnYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJdW5zaWduZWQgY2hhciAqbTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgYWRkcmxlbjsKKworCWlmICghcHRyIHx8ICF2KQorCQlyZXR1cm4gLTE7CisKKwlhZGRybGVuID0gdi0+dmFsdWVbU1lTRlNfREVWQVRUUl9BRERSX0xFTl0udWxvbmc7CisJbSA9IG1hbGxvYyhhZGRybGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGRybGVuOyBpKyspIHsKKwkJaWYgKGkgJiYgKihwdHIgKyBpICogMyAtIDEpICE9ICc6JykKKwkJCWdvdG8gb3V0OworCQlpZiAoc3NjYW5mKHB0ciArIGkgKiAzLCAiJTAyaGh4IiwgJm1baV0pICE9IDEpCisJCQlnb3RvIG91dDsKKwl9CisKKwl2LT52YWx1ZVtpZHhdLnB0ciA9IG07CisJcmV0dXJuIDA7CitvdXQ6CisJZnJlZShtKTsKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworaW50IGZpbmRfZGV2aWNlX2J5X3N5c2ZzKHZvaWQpCit7CisJaW50IHJjID0gLTE7CisjaWZkZWYgVVNFX1NZU0ZTCisJc3RydWN0IHN5c2ZzX2NsYXNzICpjbHNfbmV0OworCXN0cnVjdCBkbGlzdCAqZGV2X2xpc3Q7CisJc3RydWN0IHN5c2ZzX2NsYXNzX2RldmljZSAqZGV2OworCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmRldl9hdHRyOworCXN0cnVjdCBzeXNmc19kZXZhdHRyX3ZhbHVlcyBzeXNmc19kZXZhdHRyX3ZhbHVlczsKKwlpbnQgY291bnQgPSAwOworCisJaWYgKCFkZXZpY2Uuc3lzZnMpIHsKKwkJZGV2aWNlLnN5c2ZzID0gbWFsbG9jKHNpemVvZigqZGV2aWNlLnN5c2ZzKSk7CisJCXN5c2ZzX2RldmF0dHJfdmFsdWVzX2luaXQoZGV2aWNlLnN5c2ZzLCAwKTsKKwl9CisKKwljbHNfbmV0ID0gc3lzZnNfb3Blbl9jbGFzcygibmV0Iik7CisJaWYgKCFjbHNfbmV0KSB7CisJCXBlcnJvcigic3lzZnNfb3Blbl9jbGFzcyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2X2xpc3QgPSBzeXNmc19nZXRfY2xhc3NfZGV2aWNlcyhjbHNfbmV0KTsKKwlpZiAoIWRldl9saXN0KSB7CisJCXBlcnJvcigic3lzZnNfZ2V0X2NsYXNzX2RldmljZXMiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3lzZnNfZGV2YXR0cl92YWx1ZXNfaW5pdCgmc3lzZnNfZGV2YXR0cl92YWx1ZXMsIDApOworCisJZGxpc3RfZm9yX2VhY2hfZGF0YShkZXZfbGlzdCwgZGV2LCBzdHJ1Y3Qgc3lzZnNfY2xhc3NfZGV2aWNlKSB7CisJCWludCBpOworCQlpbnQgcmMgPSAtMTsKKworCQlpZiAoZGV2aWNlLm5hbWUgJiYgc3RyY21wKGRldi0+bmFtZSwgZGV2aWNlLm5hbWUpKQorCQkJZ290byBkb19uZXh0OworCisJCXN5c2ZzX2RldmF0dHJfdmFsdWVzX2luaXQoJnN5c2ZzX2RldmF0dHJfdmFsdWVzLCAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU1lTRlNfREVWQVRUUl9OVU07IGkrKykgeworCisJCQlkZXZfYXR0ciA9IHN5c2ZzX2dldF9jbGFzc2Rldl9hdHRyKGRldiwgc3lzZnNfZGV2YXR0cnNbaV0ubmFtZSk7CisJCQlpZiAoIWRldl9hdHRyKSB7CisJCQkJcGVycm9yKCJzeXNmc19nZXRfY2xhc3NkZXZfYXR0ciIpOworCQkJCXJjID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3lzZnNfcmVhZF9hdHRyaWJ1dGUoZGV2X2F0dHIpKSB7CisJCQkJcGVycm9yKCJzeXNmc19yZWFkX2F0dHJpYnV0ZSIpOworCQkJCXJjID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyYyA9IHN5c2ZzX2RldmF0dHJzW2ldLmhhbmRsZXIoZGV2X2F0dHItPnZhbHVlLCAmc3lzZnNfZGV2YXR0cl92YWx1ZXMsIGkpOworCisJCQlpZiAocmMgPCAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZG9fbmV4dDsKKworCQlpZiAoY2hlY2tfaWZmbGFncyhzeXNmc19kZXZhdHRyX3ZhbHVlcy52YWx1ZVtTWVNGU19ERVZBVFRSX0ZMQUdTXS51bG9uZywKKwkJCQkgIGRldmljZS5uYW1lICE9IE5VTEwpIDwgMCkKKwkJCWdvdG8gZG9fbmV4dDsKKworCQlpZiAoIXN5c2ZzX2RldmF0dHJfdmFsdWVzLnZhbHVlW1NZU0ZTX0RFVkFUVFJfQUREUl9MRU5dLnVsb25nKQorCQkJZ290byBkb19uZXh0OworCisJCWlmIChkZXZpY2Uuc3lzZnMtPnZhbHVlW1NZU0ZTX0RFVkFUVFJfSUZJTkRFWF0udWxvbmcpIHsKKwkJCWlmIChkZXZpY2Uuc3lzZnMtPnZhbHVlW1NZU0ZTX0RFVkFUVFJfRkxBR1NdLnVsb25nICYgSUZGX1JVTk5JTkcpCisJCQkJZ290byBkb19uZXh0OworCQl9CisKKwkJc3lzZnNfZGV2YXR0cl92YWx1ZXMuaWZuYW1lID0gc3RyZHVwKGRldi0+bmFtZSk7CisJCWlmICghc3lzZnNfZGV2YXR0cl92YWx1ZXMuaWZuYW1lKSB7CisJCQlwZXJyb3IoIm1hbGxvYyIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzeXNmc19kZXZhdHRyX3ZhbHVlc19pbml0KGRldmljZS5zeXNmcywgMSk7CisJCW1lbWNweShkZXZpY2Uuc3lzZnMsICZzeXNmc19kZXZhdHRyX3ZhbHVlcywgc2l6ZW9mKCpkZXZpY2Uuc3lzZnMpKTsKKwkJc3lzZnNfZGV2YXR0cl92YWx1ZXNfaW5pdCgmc3lzZnNfZGV2YXR0cl92YWx1ZXMsIDApOworCisJCWlmIChjb3VudCsrKQorCQkJYnJlYWs7CisKKwkJY29udGludWU7Citkb19uZXh0OgorCQlzeXNmc19kZXZhdHRyX3ZhbHVlc19pbml0KCZzeXNmc19kZXZhdHRyX3ZhbHVlcywgMSk7CisJfQorCisJaWYgKGNvdW50ID09IDEpIHsKKwkJZGV2aWNlLmlmaW5kZXggPSBkZXZpY2Uuc3lzZnMtPnZhbHVlW1NZU0ZTX0RFVkFUVFJfSUZJTkRFWF0udWxvbmc7CisJCWRldmljZS5uYW1lID0gZGV2aWNlLnN5c2ZzLT5pZm5hbWU7CisJfQorCXJjID0gIWRldmljZS5pZmluZGV4Oworb3V0OgorCXN5c2ZzX2Nsb3NlX2NsYXNzKGNsc19uZXQpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RldmljZV9ieV9pb2N0bChpbnQgcywgc3RydWN0IGlmcmVxICppZnIpCit7CisJaWYgKGlvY3RsKHMsIFNJT0NHSUZGTEFHUywgaWZyKSA8IDApIHsKKwkJcGVycm9yKCJpb2N0bChTSU9DR0lGSU5ERVgiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjaGVja19pZmZsYWdzKGlmci0+aWZyX2ZsYWdzLCBkZXZpY2UubmFtZSAhPSBOVUxMKSA8IDApCisJCXJldHVybiAxOworCisJaWYgKGlvY3RsKHMsIFNJT0NHSUZJTkRFWCwgaWZyKSA8IDApIHsKKwkJcGVycm9yKCJpb2N0bChTSU9DR0lGSU5ERVgiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfZGV2aWNlX2J5X2lvY3RsKHZvaWQpCit7CisJaW50IHM7CisJc3RydWN0IGlmcmVxICppZnIwLCAqaWZyLCAqaWZyX2VuZDsKKwlzaXplX3QgaWZyc2l6ZSA9IHNpemVvZigqaWZyKTsKKwlzdHJ1Y3QgaWZjb25mIGlmYzsKKwlzdGF0aWMgc3RydWN0IGlmcmVxIGlmcmJ1ZjsKKwlpbnQgY291bnQgPSAwOworCisJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAocyA8IDApIHsKKwkJcGVycm9yKCJzb2NrZXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCgmaWZyYnVmLCAwLCBzaXplb2YoaWZyYnVmKSk7CisKKwlpZiAoZGV2aWNlLm5hbWUpIHsKKwkJc3RybmNweShpZnJidWYuaWZyX25hbWUsIGRldmljZS5uYW1lLCBzaXplb2YoaWZyYnVmLmlmcl9uYW1lKSAtIDEpOworCQlpZiAoY2hlY2tfZGV2aWNlX2J5X2lvY3RsKHMsICZpZnJidWYpKQorCQkJZ290byBvdXQ7CisJCWNvdW50Kys7CisJfSBlbHNlIHsKKwkJZG8geworCQkJaW50IHJjOworCQkJaWZyMCA9IG1hbGxvYyhpZnJzaXplKTsKKwkJCWlmICghaWZyMCkgeworCQkJCXBlcnJvcigibWFsbG9jIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWlmYy5pZmNfYnVmID0gKGNoYXIgKilpZnIwOworCQkJaWZjLmlmY19sZW4gPSBpZnJzaXplOworCisJCQlyYyA9IGlvY3RsKHMsIFNJT0NHSUZDT05GLCAmaWZjKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwZXJyb3IoImlvY3RsKFNJT0NGSUZDT05GIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWlmIChpZmMuaWZjX2xlbiArIHNpemVvZigqaWZyMCkgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpIC0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgPD0gaWZyc2l6ZSkKKwkJCQlicmVhazsKKwkJCWlmcnNpemUgKj0gMjsKKwkJCWZyZWUoaWZyMCk7CisJCQlpZnIwID0gTlVMTDsKKwkJfSB3aGlsZShpZnJzaXplIDwgSU5UX01BWCAvIDIpOworCisJCWlmICghaWZyMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJhcnBpbmc6IHRvbyBtYW55IGludGVyZmFjZXMhP1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmcl9lbmQgPSAoc3RydWN0IGlmcmVxICopKCgoY2hhciAqKWlmcjApICsgaWZjLmlmY19sZW4gLSBzaXplb2YoKmlmcjApKTsKKwkJZm9yIChpZnIgPSBpZnIwOyBpZnIgPD0gaWZyX2VuZDsgaWZyKyspIHsKKwkJCWlmIChjaGVja19kZXZpY2VfYnlfaW9jdGwocywgJmlmcmJ1ZikpCisJCQkJY29udGludWU7CisJCQltZW1jcHkoJmlmcmJ1Zi5pZnJfbmFtZSwgaWZyLT5pZnJfbmFtZSwgc2l6ZW9mKGlmcmJ1Zi5pZnJfbmFtZSkpOworCQkJaWYgKGNvdW50KyspCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwljbG9zZShzKTsKKworCWlmIChjb3VudCA9PSAxKSB7CisJCWRldmljZS5pZmluZGV4ID0gaWZyYnVmLmlmcl9pZmluZGV4OworCQlkZXZpY2UubmFtZSA9IGlmcmJ1Zi5pZnJfbmFtZTsKKwl9CisJcmV0dXJuICFkZXZpY2UuaWZpbmRleDsKK291dDoKKwljbG9zZShzKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9kZXZpY2Uodm9pZCkKK3sKKwlpbnQgcmM7CisJcmMgPSBmaW5kX2RldmljZV9ieV9pZmFkZHJzKCk7CisJaWYgKHJjID49IDApCisJCWdvdG8gb3V0OworCXJjID0gZmluZF9kZXZpY2VfYnlfc3lzZnMoKTsKKwlpZiAocmMgPj0gMCkKKwkJZ290byBvdXQ7CisJcmMgPSBmaW5kX2RldmljZV9ieV9pb2N0bCgpOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoKKyAqIHNldF9kZXZpY2VfYnJvYWRjYXN0KCkKKyAqCisgKiBUaGlzIGZpbGxzIHRoZSBkZXZpY2UgImJyb2FkY2FzdCBhZGRyZXNzIgorICogYmFzZWQgb24gaW5mb3JtYXRpb24gZm91bmQgYnkgZmluZF9kZXZpY2UoKSBmdW5jaW9uLgorICovCitzdGF0aWMgaW50IHNldF9kZXZpY2VfYnJvYWRjYXN0X2lmYWRkcnNfb25lKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdW5zaWduZWQgY2hhciAqYmEsIHNpemVfdCBiYWxlbiwgaW50IGZhdGFsKQoreworI2lmbmRlZiBXSVRIT1VUX0lGQUREUlMKKwlzdHJ1Y3QgaWZhZGRycyAqaWZhOworCXN0cnVjdCBzb2NrYWRkcl9sbCAqc2xsOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtMTsKKworCWlmYSA9IGRldmljZS0+aWZhOworCWlmICghaWZhKQorCQlyZXR1cm4gLTE7CisKKwlzbGwgPSAoc3RydWN0IHNvY2thZGRyX2xsICopaWZhLT5pZmFfYnJvYWRhZGRyOworCisJaWYgKHNsbC0+c2xsX2hhbGVuICE9IGJhbGVuKSB7CisJCWlmIChmYXRhbCkgeworCQkJaWYgKCFxdWlldCkKKwkJCQlwcmludGYoIkFkZHJlc3MgbGVuZ3RoIGRvZXMgbm90IG1hdGNoLi4uXG4iKTsKKwkJCWV4aXQoMik7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoYmEsIHNsbC0+c2xsX2FkZHIsIHNsbC0+c2xsX2hhbGVuKTsKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC0xOworI2VuZGlmCit9CitpbnQgc2V0X2RldmljZV9icm9hZGNhc3Rfc3lzZnMoc3RydWN0IGRldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBjaGFyICpiYSwgc2l6ZV90IGJhbGVuKQoreworI2lmZGVmIFVTRV9TWVNGUworCXN0cnVjdCBzeXNmc19kZXZhdHRyX3ZhbHVlcyAqdjsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC0xOworCXYgPSBkZXZpY2UtPnN5c2ZzOworCWlmICghdikKKwkJcmV0dXJuIC0xOworCWlmICh2LT52YWx1ZVtTWVNGU19ERVZBVFRSX0FERFJfTEVOXS51bG9uZyAhPSBiYWxlbikKKwkJcmV0dXJuIC0xOworCW1lbWNweShiYSwgdi0+dmFsdWVbU1lTRlNfREVWQVRUUl9CUk9BRENBU1RdLnB0ciwgYmFsZW4pOworCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gLTE7CisjZW5kaWYKK30KKworc3RhdGljIGludCBzZXRfZGV2aWNlX2Jyb2FkY2FzdF9mYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGNoYXIgKmJhLCBzaXplX3QgYmFsZW4pCit7CisJaWYgKCFxdWlldCkKKwkJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiB1c2luZyBkZWZhdWx0IGJyb2FkY2FzdCBhZGRyZXNzLlxuIik7CisJbWVtc2V0KGJhLCAtMSwgYmFsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGV2aWNlX2Jyb2FkY2FzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmJhLCBzaXplX3QgYmFsZW4pCit7CisJaWYgKCFzZXRfZGV2aWNlX2Jyb2FkY2FzdF9pZmFkZHJzX29uZShkZXYsIGJhLCBiYWxlbiwgMCkpCisJCXJldHVybjsKKwlpZiAoIXNldF9kZXZpY2VfYnJvYWRjYXN0X3N5c2ZzKGRldiwgYmEsIGJhbGVuKSkKKwkJcmV0dXJuOworCXNldF9kZXZpY2VfYnJvYWRjYXN0X2ZhbGxiYWNrKGRldiwgYmEsIGJhbGVuKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc29ja2V0X2Vycm5vOworCWludCBjaDsKKworCWxpbWl0X2NhcGFiaWxpdGllcygpOworCisjaWZkZWYgVVNFX0lETgorCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKyNlbmRpZgorCisJZW5hYmxlX2NhcGFiaWxpdHlfcmF3KCk7CisKKwlzID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgMCk7CisJc29ja2V0X2Vycm5vID0gZXJybm87CisKKwlkaXNhYmxlX2NhcGFiaWxpdHlfcmF3KCk7CisKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoP2JmRFVBcWM6dzpzOkk6ViIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoKGNoKSB7CisJCWNhc2UgJ2InOgorCQkJYnJvYWRjYXN0X29ubHk9MTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWRhZCsrOworCQkJcXVpdF9vbl9yZXBseT0xOworCQkJYnJlYWs7CisJCWNhc2UgJ1UnOgorCQkJdW5zb2xpY2l0ZWQrKzsKKwkJCWJyZWFrOworCQljYXNlICdBJzoKKwkJCWFkdmVydCsrOworCQkJdW5zb2xpY2l0ZWQrKzsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCXF1aWV0Kys7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb3VudCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXRpbWVvdXQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnSSc6CisJCQlkZXZpY2UubmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXF1aXRfb25fcmVwbHk9MTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXNvdXJjZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50ZigiYXJwaW5nIHV0aWxpdHksIGlwdXRpbHMtJXNcbiIsIFNOQVBTSE9UKTsKKwkJCWV4aXQoMCk7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0KKwl9CisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoYXJnYyAhPSAxKQorCQl1c2FnZSgpOworCisJdGFyZ2V0ID0gKmFyZ3Y7CisKKwlpZiAoZGV2aWNlLm5hbWUgJiYgISpkZXZpY2UubmFtZSkKKwkJZGV2aWNlLm5hbWUgPSBOVUxMOworCisJaWYgKHMgPCAwKSB7CisJCWVycm5vID0gc29ja2V0X2Vycm5vOworCQlwZXJyb3IoImFycGluZzogc29ja2V0Iik7CisJCWV4aXQoMik7CisJfQorCisJaWYgKGZpbmRfZGV2aWNlKCkgPCAwKQorCQlleGl0KDIpOworCisJaWYgKCFkZXZpY2UuaWZpbmRleCkgeworCQlpZiAoZGV2aWNlLm5hbWUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiYXJwaW5nOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZS5cbiIsIGRldmljZS5uYW1lKTsKKwkJCWV4aXQoMik7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICJhcnBpbmc6IGRldmljZSAob3B0aW9uIC1JKSBpcyByZXF1aXJlZC5cbiIpOworCQl1c2FnZSgpOworCX0KKworCWlmIChpbmV0X2F0b24odGFyZ2V0LCAmZHN0KSAhPSAxKSB7CisJCXN0cnVjdCBob3N0ZW50ICpocDsKKwkJY2hhciAqaWRuID0gdGFyZ2V0OworI2lmZGVmIFVTRV9JRE4KKwkJaW50IHJjOworCisJCXJjID0gaWRuYV90b19hc2NpaV9seih0YXJnZXQsICZpZG4sIDApOworCisJCWlmIChyYyAhPSBJRE5BX1NVQ0NFU1MpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiYXJwaW5nOiBJRE4gZW5jb2RpbmcgZmFpbGVkOiAlc1xuIiwgaWRuYV9zdHJlcnJvcihyYykpOworCQkJZXhpdCgyKTsKKwkJfQorI2VuZGlmCisKKwkJaHAgPSBnZXRob3N0YnluYW1lMihpZG4sIEFGX0lORVQpOworCQlpZiAoIWhwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImFycGluZzogdW5rbm93biBob3N0ICVzXG4iLCB0YXJnZXQpOworCQkJZXhpdCgyKTsKKwkJfQorCisjaWZkZWYgVVNFX0lETgorCQlmcmVlKGlkbik7CisjZW5kaWYKKworCQltZW1jcHkoJmRzdCwgaHAtPmhfYWRkciwgNCk7CisJfQorCisJaWYgKHNvdXJjZSAmJiBpbmV0X2F0b24oc291cmNlLCAmc3JjKSAhPSAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiYXJwaW5nOiBpbnZhbGlkIHNvdXJjZSAlc1xuIiwgc291cmNlKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlpZiAoIWRhZCAmJiB1bnNvbGljaXRlZCAmJiBzcmMuc19hZGRyID09IDApCisJCXNyYyA9IGRzdDsKKworCWlmICghZGFkIHx8IHNyYy5zX2FkZHIpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCQlpbnQgcHJvYmVfZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisKKwkJaWYgKHByb2JlX2ZkIDwgMCkgeworCQkJcGVycm9yKCJzb2NrZXQiKTsKKwkJCWV4aXQoMik7CisJCX0KKwkJaWYgKGRldmljZS5uYW1lKSB7CisJCQllbmFibGVfY2FwYWJpbGl0eV9yYXcoKTsKKworCQkJaWYgKHNldHNvY2tvcHQocHJvYmVfZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgZGV2aWNlLm5hbWUsIHN0cmxlbihkZXZpY2UubmFtZSkrMSkgPT0gLTEpCisJCQkJcGVycm9yKCJXQVJOSU5HOiBpbnRlcmZhY2UgaXMgaWdub3JlZCIpOworCisJCQlkaXNhYmxlX2NhcGFiaWxpdHlfcmF3KCk7CisJCX0KKwkJbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CisJCXNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlpZiAoc3JjLnNfYWRkcikgeworCQkJc2FkZHIuc2luX2FkZHIgPSBzcmM7CisJCQlpZiAoYmluZChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA9PSAtMSkgeworCQkJCXBlcnJvcigiYmluZCIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCX0gZWxzZSBpZiAoIWRhZCkgeworCQkJaW50IG9uID0gMTsKKwkJCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHNhZGRyKTsKKworCQkJc2FkZHIuc2luX3BvcnQgPSBodG9ucygxMDI1KTsKKwkJCXNhZGRyLnNpbl9hZGRyID0gZHN0OworCisJCQlpZiAoc2V0c29ja29wdChwcm9iZV9mZCwgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLCAoY2hhciopJm9uLCBzaXplb2Yob24pKSA9PSAtMSkKKwkJCQlwZXJyb3IoIldBUk5JTkc6IHNldHNvY2tvcHQoU09fRE9OVFJPVVRFKSIpOworCQkJaWYgKGNvbm5lY3QocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYWRkciwgc2l6ZW9mKHNhZGRyKSkgPT0gLTEpIHsKKwkJCQlwZXJyb3IoImNvbm5lY3QiKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJaWYgKGdldHNvY2tuYW1lKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyKikmc2FkZHIsICZhbGVuKSA9PSAtMSkgeworCQkJCXBlcnJvcigiZ2V0c29ja25hbWUiKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJc3JjID0gc2FkZHIuc2luX2FkZHI7CisJCX0KKwkJY2xvc2UocHJvYmVfZmQpOworCX07CisKKwkoKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZtZSktPnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJKChzdHJ1Y3Qgc29ja2FkZHJfbGwgKikmbWUpLT5zbGxfaWZpbmRleCA9IGRldmljZS5pZmluZGV4OworCSgoc3RydWN0IHNvY2thZGRyX2xsICopJm1lKS0+c2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKKwlpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyKikmbWUsIHNpemVvZihtZSkpID09IC0xKSB7CisJCXBlcnJvcigiYmluZCIpOworCQlleGl0KDIpOworCX0KKworCWlmICgxKSB7CisJCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKG1lKTsKKwkJaWYgKGdldHNvY2tuYW1lKHMsIChzdHJ1Y3Qgc29ja2FkZHIqKSZtZSwgJmFsZW4pID09IC0xKSB7CisJCQlwZXJyb3IoImdldHNvY2tuYW1lIik7CisJCQlleGl0KDIpOworCQl9CisJfQorCWlmICgoKHN0cnVjdCBzb2NrYWRkcl9sbCAqKSZtZSktPnNsbF9oYWxlbiA9PSAwKSB7CisJCWlmICghcXVpZXQpCisJCQlwcmludGYoIkludGVyZmFjZSBcIiVzXCIgaXMgbm90IEFSUGFibGUgKG5vIGxsIGFkZHJlc3MpXG4iLCBkZXZpY2UubmFtZSk7CisJCWV4aXQoZGFkPzA6Mik7CisJfQorCisJaGUgPSBtZTsKKworCXNldF9kZXZpY2VfYnJvYWRjYXN0KCZkZXZpY2UsICgoc3RydWN0IHNvY2thZGRyX2xsICopJmhlKS0+c2xsX2FkZHIsCisJCQkgICAgICgoc3RydWN0IHNvY2thZGRyX2xsICopJmhlKS0+c2xsX2hhbGVuKTsKKworCWlmICghcXVpZXQpIHsKKwkJcHJpbnRmKCJBUlBJTkcgJXMgIiwgaW5ldF9udG9hKGRzdCkpOworCQlwcmludGYoImZyb20gJXMgJXNcbiIsICBpbmV0X250b2Eoc3JjKSwgZGV2aWNlLm5hbWUgPyA6ICIiKTsKKwl9CisKKwlpZiAoIXNyYy5zX2FkZHIgJiYgIWRhZCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImFycGluZzogbm8gc291cmNlIGFkZHJlc3MgaW4gbm90LURBRCBtb2RlXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlkcm9wX2NhcGFiaWxpdGllcygpOworCisJc2V0X3NpZ25hbChTSUdJTlQsIGZpbmlzaCk7CisJc2V0X3NpZ25hbChTSUdBTFJNLCBjYXRjaGVyKTsKKworCWNhdGNoZXIoKTsKKworCXdoaWxlKDEpIHsKKwkJc2lnc2V0X3Qgc3NldCwgb3NzZXQ7CisJCXVuc2lnbmVkIGNoYXIgcGFja2V0WzQwOTZdOworCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBmcm9tOworCQlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihmcm9tKTsKKwkJaW50IGNjOworCisJCWlmICgoY2MgPSByZWN2ZnJvbShzLCBwYWNrZXQsIHNpemVvZihwYWNrZXQpLCAwLAorCQkJCSAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmFsZW4pKSA8IDApIHsKKwkJCXBlcnJvcigiYXJwaW5nOiByZWN2ZnJvbSIpOworCQkJY29udGludWU7CisJCX0KKworCQlzaWdlbXB0eXNldCgmc3NldCk7CisJCXNpZ2FkZHNldCgmc3NldCwgU0lHQUxSTSk7CisJCXNpZ2FkZHNldCgmc3NldCwgU0lHSU5UKTsKKwkJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc3NldCwgJm9zc2V0KTsKKwkJcmVjdl9wYWNrKHBhY2tldCwgY2MsIChzdHJ1Y3Qgc29ja2FkZHJfbGwgKikmZnJvbSk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NzZXQsIE5VTEwpOworCX0KK30KKworCmRpZmYgLS1naXQgYS9pcHV0aWxzL2Nsb2NrZGlmZi5jIGIvaXB1dGlscy9jbG9ja2RpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFlYTFiCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9jbG9ja2RpZmYuYwpAQCAtMCwwICsxLDY4NyBAQAorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1leC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjZGVmaW5lIFRTUFRZUEVTCisjaW5jbHVkZSA8cHJvdG9jb2xzL3RpbWVkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpZmRlZiBDQVBBQklMSVRJRVMKKyNpbmNsdWRlIDxzeXMvY2FwYWJpbGl0eS5oPgorI2VuZGlmCisKK3ZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworI2RlZmluZSBNQVhfSE9TVE5BTUVMRU4JTklfTUFYSE9TVAorCisvKgorICogQ2hlY2tzdW0gcm91dGluZSBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgZmFtaWx5IGhlYWRlcnMuCisgKgorICogVGhpcyByb3V0aW5lIGlzIHZlcnkgaGVhdmlseSB1c2VkIGluIHRoZSBuZXR3b3JrCisgKiBjb2RlIGFuZCBzaG91bGQgYmUgbW9kaWZpZWQgZm9yIGVhY2ggQ1BVIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBUQUhPRSB2ZXJzaW9uLgorICovCisKKyN1bmRlZglBRERDQVJSWQorI2RlZmluZSBBRERDQVJSWShzdW0pIHsgXAorCWlmIChzdW0gJiAweGZmZmYwMDAwKSB7CVwKKwkJc3VtICY9IDB4ZmZmZjsgXAorCQlzdW0rKzsgXAorCX0gXAorfQorCitpbnQgaW5fY2tzdW0odV9zaG9ydCAqYWRkciwgaW50IGxlbikKK3sKKwl1bmlvbiB3b3JkIHsKKwkJY2hhcgljWzJdOworCQl1X3Nob3J0CXM7CisJfSB1OworCWludCBzdW0gPSAwOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJLyoKKwkJICogYWRkIGJ5IHdvcmRzLgorCQkgKi8KKwkJd2hpbGUgKChsZW4gLT0gMikgPj0gMCkgeworCQkJaWYgKCh1bnNpZ25lZCBsb25nKWFkZHIgJiAweDEpIHsKKwkJCQkvKiB3b3JkIGlzIG5vdCBhbGlnbmVkICovCisJCQkJdS5jWzBdID0gKihjaGFyICopYWRkcjsKKwkJCQl1LmNbMV0gPSAqKChjaGFyICopYWRkcisxKTsKKwkJCQlzdW0gKz0gdS5zOworCQkJCWFkZHIrKzsKKwkJCX0gZWxzZQorCQkJCXN1bSArPSAqYWRkcisrOworCQkJQUREQ0FSUlkoc3VtKTsKKwkJfQorCQlpZiAobGVuID09IC0xKQorCQkJLyoKKwkJCSAqIE9kZCBudW1iZXIgb2YgYnl0ZXMuCisJCQkgKi8KKwkJCXUuY1swXSA9ICoodV9jaGFyICopYWRkcjsKKwl9CisJaWYgKGxlbiA9PSAtMSkgeworCQkvKiBUaGUgbGFzdCBtYnVmIGhhcyBvZGQgIyBvZiBieXRlcy4gRm9sbG93IHRoZQorCQkgICBzdGFuZGFyZCAodGhlIG9kZCBieXRlIGlzIHNoaWZ0ZWQgbGVmdCBieSA4IGJpdHMpICovCisJCXUuY1sxXSA9IDA7CisJCXN1bSArPSB1LnM7CisJCUFERENBUlJZKHN1bSk7CisJfQorCXJldHVybiAofnN1bSAmIDB4ZmZmZik7Cit9CisKKyNkZWZpbmUgT04JCTEKKyNkZWZpbmUgT0ZGCQkwCisKKyNkZWZpbmUgUkFOR0UJCTEJCS8qIGJlc3QgZXhwZWN0ZWQgcm91bmQtdHJpcCB0aW1lLCBtcyAqLworI2RlZmluZSBNU0dTIAkJNTAKKyNkZWZpbmUgVFJJQUxTCQkxMAorCisjZGVmaW5lIEdPT0QJCTAKKyNkZWZpbmUgVU5SRUFDSEFCTEUJMgorI2RlZmluZSBOT05TVERUSU1FCTMKKyNkZWZpbmUgSE9TVERPV04gCTB4N2ZmZmZmZmYKKworCitpbnQgaW50ZXJhY3RpdmUgPSAwOwordWludDE2X3QgaWQ7CitpbnQgc29jazsKK2ludCBzb2NrX3JhdzsKK3N0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXI7CitpbnQgaXBfb3B0X2xlbiA9IDA7CisKKyNkZWZpbmUgQklBU1AJIAk0MzE5OTk5OQorI2RlZmluZSBCSUFTTgkJLTQzMjAwMDAwCisjZGVmaW5lIE1PRFVMTwkgCTg2NDAwMDAwCisjZGVmaW5lIFBST0NFU1NJTkdfVElNRQkwIAkvKiBtcy4gdG8gcmVkdWNlIGVycm9yIGluIG1lYXN1cmVtZW50ICovCisKKyNkZWZpbmUgUEFDS0VUX0lOCTEwMjQKKworaW50IG1lYXN1cmVfZGVsdGE7CitpbnQgbWVhc3VyZV9kZWx0YTE7CitzdGF0aWMgdV9zaG9ydCBzZXFubywgc2Vxbm8wLCBhY2tlZDsKK2xvbmcgcnR0ID0gMTAwMDsKK2xvbmcgbWluX3J0dDsKK2xvbmcgcnR0X3NpZ21hID0gMDsKKworLyoKKyAqIE1lYXN1cmVzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG1hY2hpbmVzJyBjbG9ja3MgdXNpbmcKKyAqIElDTVAgdGltZXN0YW1wIG1lc3NhZ2VzLgorICovCitpbnQKK21lYXN1cmUoc3RydWN0IHNvY2thZGRyX2luICogYWRkcikKK3sKKwlzb2NrbGVuX3QgbGVuZ3RoOworCWludCBtc2djb3VudDsKKwlpbnQgY2MsIGNvdW50OworCWZkX3NldCByZWFkeTsKKwlsb25nIHNlbmR0aW1lLCByZWN2dGltZSwgaGlzdGltZTsKKwlsb25nIG1pbjEsIG1pbjIsIGRpZmY7CisJbG9uZyBkZWx0YTEsIGRlbHRhMjsKKwlzdHJ1Y3QgdGltZXZhbCB0djEsIHRvdXQ7CisJdV9jaGFyIHBhY2tldFtQQUNLRVRfSU5dLCBvcGFja2V0WzY0XTsKKwlzdHJ1Y3QgaWNtcGhkciAqaWNwID0gKHN0cnVjdCBpY21waGRyICopIHBhY2tldDsKKwlzdHJ1Y3QgaWNtcGhkciAqb2ljcCA9IChzdHJ1Y3QgaWNtcGhkciAqKSBvcGFja2V0OworCXN0cnVjdCBpcGhkciAqaXAgPSAoc3RydWN0IGlwaGRyICopIHBhY2tldDsKKworCW1pbjEgPSBtaW4yID0gMHg3ZmZmZmZmZjsKKwltaW5fcnR0ID0gMHg3ZmZmZmZmZjsKKwltZWFzdXJlX2RlbHRhID0gSE9TVERPV047CisJbWVhc3VyZV9kZWx0YTEgPSBIT1NURE9XTjsKKworLyogZW1wdGllcyB0aGUgaWNtcCBpbnB1dCBxdWV1ZSAqLworCUZEX1pFUk8oJnJlYWR5KTsKKworZW1wdHk6CisJdG91dC50dl9zZWMgPSB0b3V0LnR2X3VzZWMgPSAwOworCUZEX1NFVChzb2NrX3JhdywgJnJlYWR5KTsKKwlpZiAoc2VsZWN0KEZEX1NFVFNJWkUsICZyZWFkeSwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdG91dCkpIHsKKwkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCWNjID0gcmVjdmZyb20oc29ja19yYXcsIChjaGFyICopcGFja2V0LCBQQUNLRVRfSU4sIDAsCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopTlVMTCwgJmxlbmd0aCk7CisJCWlmIChjYyA8IDApCisJCQlyZXR1cm4gLTE7CisJCWdvdG8gZW1wdHk7CisJfQorCisJLyoKKwkgKiBUbyBtZWFzdXJlIHRoZSBkaWZmZXJlbmNlLCBzZWxlY3QgTVNHUyBtZXNzYWdlcyB3aG9zZSByb3VuZC10cmlwCisJICogdGltZSBpcyBzbWFsbGVyIHRoYW4gUkFOR0UgaWYgY2tyYW5nZSBpcyAxLCBvdGhlcndpc2Ugc2ltcGx5CisJICogc2VsZWN0IE1TR1MgbWVzc2FnZXMgcmVnYXJkbGVzcyBvZiByb3VuZC10cmlwIHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqIENob29zZSB0aGUgc21hbGxlc3QgdHJhbnNtaXNzaW9uIHRpbWUgaW4gZWFjaCBvZiB0aGUgdHdvIGRpcmVjdGlvbnMuCisJICogVXNlIHRoZXNlIHR3byBsYXR0ZXIgcXVhbnRpdGllcyB0byBjb21wdXRlIHRoZSBkZWx0YSBiZXR3ZWVuCisJICogdGhlIHR3byBjbG9ja3MuCisJICovCisKKwlsZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwlvaWNwLT50eXBlID0gSUNNUF9USU1FU1RBTVA7CisJb2ljcC0+Y29kZSA9IDA7CisJb2ljcC0+Y2hlY2tzdW0gPSAwOworCW9pY3AtPnVuLmVjaG8uaWQgPSBpZDsKKwkoKF9fdTMyKikob2ljcCsxKSlbMF0gPSAwOworCSgoX191MzIqKShvaWNwKzEpKVsxXSA9IDA7CisJKChfX3UzMiopKG9pY3ArMSkpWzJdID0gMDsKKwlGRF9aRVJPKCZyZWFkeSk7CisJbXNnY291bnQgPSAwOworCisJYWNrZWQgPSBzZXFubyA9IHNlcW5vMCA9IDA7CisKKwlmb3IgKG1zZ2NvdW50ID0gMDsgbXNnY291bnQgPCBNU0dTOyApIHsKKworCS8qCisJICogSWYgbm8gYW5zd2VyIGlzIHJlY2VpdmVkIGZvciBUUklBTFMgY29uc2VjdXRpdmUgdGltZXMsCisJICogdGhlIG1hY2hpbmUgaXMgYXNzdW1lZCB0byBiZSBkb3duCisJICovCisJCWlmIChzZXFubyAtIGFja2VkID4gVFJJQUxTKQorCQkJcmV0dXJuIEhPU1RET1dOOworCisJCW9pY3AtPnVuLmVjaG8uc2VxdWVuY2UgPSArK3NlcW5vOworCQlvaWNwLT5jaGVja3N1bSA9IDA7CisKKwkJKHZvaWQpZ2V0dGltZW9mZGF5ICgmdHYxLCAoc3RydWN0IHRpbWV6b25lICopMCk7CisJCSooX191MzIqKShvaWNwKzEpID0gaHRvbmwoKHR2MS50dl9zZWMgJSAoMjQqNjAqNjApKSAqIDEwMDAKKwkJCQkJICArIHR2MS50dl91c2VjIC8gMTAwMCk7CisJCW9pY3AtPmNoZWNrc3VtID0gaW5fY2tzdW0oKHVfc2hvcnQgKilvaWNwLCBzaXplb2YoKm9pY3ApICsgMTIpOworCisJCWNvdW50ID0gc2VuZHRvKHNvY2tfcmF3LCAoY2hhciAqKW9wYWNrZXQsIHNpemVvZigqb2ljcCkrMTIsIDAsCisJCQkgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKworCQlpZiAoY291bnQgPCAwKQorCQkJcmV0dXJuIFVOUkVBQ0hBQkxFOworCisJCWZvciAoOzspIHsKKwkJCUZEX1pFUk8oJnJlYWR5KTsKKwkJCUZEX1NFVChzb2NrX3JhdywgJnJlYWR5KTsKKwkJCXsKKwkJCSAgbG9uZyB0bW8gPSBydHQgKyBydHRfc2lnbWE7CisJCQkgIHRvdXQudHZfc2VjID0gIHRtby8xMDAwOworCQkJICB0b3V0LnR2X3VzZWMgPSAodG1vIC0gKHRtby8xMDAwKSoxMDAwKSoxMDAwOworCQkJfQorCisJCQlpZiAoKGNvdW50ID0gc2VsZWN0KEZEX1NFVFNJWkUsICZyZWFkeSwgKGZkX3NldCAqKTAsCisJCQkgICAgKGZkX3NldCAqKTAsICZ0b3V0KSkgPD0gMCkKKwkJCQlicmVhazsKKworCQkJKHZvaWQpZ2V0dGltZW9mZGF5KCZ0djEsIChzdHJ1Y3QgdGltZXpvbmUgKikwKTsKKwkJCWNjID0gcmVjdmZyb20oc29ja19yYXcsIChjaGFyICopcGFja2V0LCBQQUNLRVRfSU4sIDAsCisJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKU5VTEwsICZsZW5ndGgpOworCisJCQlpZiAoY2MgPCAwKQorCQkJCXJldHVybigtMSk7CisKKwkJCWljcCA9IChzdHJ1Y3QgaWNtcGhkciAqKShwYWNrZXQgKyAoaXAtPmlobCA8PCAyKSk7CisJCQlpZiggaWNwLT50eXBlID09IElDTVBfVElNRVNUQU1QUkVQTFkgJiYKKwkJCSAgICBpY3AtPnVuLmVjaG8uaWQgPT0gaWQgJiYgaWNwLT51bi5lY2hvLnNlcXVlbmNlID49IHNlcW5vMCAmJgorCQkJCQkJICBpY3AtPnVuLmVjaG8uc2VxdWVuY2UgPD0gc2Vxbm8pIHsKKwkJCSAgaWYgKGFja2VkIDwgaWNwLT51bi5lY2hvLnNlcXVlbmNlKQorCQkJICAgIGFja2VkID0gaWNwLT51bi5lY2hvLnNlcXVlbmNlOworCisJCQkgIHJlY3Z0aW1lID0gKHR2MS50dl9zZWMgJSAoMjQqNjAqNjApKSAqIDEwMDAgKworCQkJCSAgICAgdHYxLnR2X3VzZWMgLyAxMDAwOworCQkJICBzZW5kdGltZSA9IG50b2hsKCooX191MzIqKShpY3ArMSkpOworCQkJICBkaWZmID0gcmVjdnRpbWUgLSBzZW5kdGltZTsKKwkJLyoKKwkJICogZGlmZiBjYW4gYmUgbGVzcyB0aGFuIDAgYXJvdWQgbWlkbmlnaHQKKwkJICovCisJCQkgIGlmIChkaWZmIDwgMCkKKwkJCSAgICBjb250aW51ZTsKKwkJCSAgcnR0ID0gKHJ0dCAqIDMgKyBkaWZmKS80OworCQkJICBydHRfc2lnbWEgPSAocnR0X3NpZ21hICozICsgYWJzKGRpZmYtcnR0KSkvNDsKKwkJCSAgbXNnY291bnQrKzsKKwkJCSAgaGlzdGltZSA9IG50b2hsKCgoX191MzIqKShpY3ArMSkpWzFdKTsKKwkJLyoKKwkJICogYSBob3N0cyB1c2luZyBhIHRpbWUgZm9ybWF0IGRpZmZlcmVudCBmcm9tCisJCSAqIG1zLiBzaW5jZSBtaWRuaWdodCBVVCAoYXMgcGVyIFJGQzc5Mikgc2hvdWxkCisJCSAqIHNldCB0aGUgaGlnaCBvcmRlciBiaXQgb2YgdGhlIDMyLWJpdCB0aW1lCisJCSAqIHZhbHVlIGl0IHRyYW5zbWl0cy4KKwkJICovCisJCQlpZiAoKGhpc3RpbWUgJiAweDgwMDAwMDAwKSAhPSAwKQorCQkJICByZXR1cm4gTk9OU1REVElNRTsKKworCQkJaWYgKGludGVyYWN0aXZlKSB7CisJCQkgIHByaW50ZigiLiIpOworCQkJICBmZmx1c2goc3Rkb3V0KTsKKwkJCX0KKworCQkJZGVsdGExID0gaGlzdGltZSAtIHNlbmR0aW1lOworCQkvKgorCQkgKiBIYW5kbGVzIHdyYXAtYXJvdW5kIHRvIGF2b2lkIHRoYXQgYXJvdW5kCisJCSAqIG1pZG5pZ2h0IHNtYWxsIHRpbWUgZGlmZmVyZW5jZXMgYXBwZWFyCisJCSAqIGVub3Jtb3VzLiBIb3dldmVyLCB0aGUgdHdvIG1hY2hpbmUncyBjbG9ja3MKKwkJICogbXVzdCBiZSB3aXRoaW4gMTIgaG91cnMgZnJvbSBlYWNoIG90aGVyLgorCQkgKi8KKwkJCWlmIChkZWx0YTEgPCBCSUFTTikKKwkJCQlkZWx0YTEgKz0gTU9EVUxPOworCQkJZWxzZSBpZiAoZGVsdGExID4gQklBU1ApCisJCQkJZGVsdGExIC09IE1PRFVMTzsKKworCQkJZGVsdGEyID0gcmVjdnRpbWUgLSBoaXN0aW1lOworCQkJaWYgKGRlbHRhMiA8IEJJQVNOKQorCQkJCWRlbHRhMiArPSBNT0RVTE87CisJCQllbHNlIGlmIChkZWx0YTIgPiBCSUFTUCkKKwkJCQlkZWx0YTIgLT0gTU9EVUxPOworCisJCQlpZiAoZGVsdGExIDwgbWluMSkKKwkJCQltaW4xID0gZGVsdGExOworCQkJaWYgKGRlbHRhMiA8IG1pbjIpCisJCQkJbWluMiA9IGRlbHRhMjsKKwkJCWlmIChkZWx0YTEgKyBkZWx0YTIgPCBtaW5fcnR0KSB7CisJCQkgIG1pbl9ydHQgID0gZGVsdGExICsgZGVsdGEyOworCQkJICBtZWFzdXJlX2RlbHRhMSA9IChkZWx0YTEgLSBkZWx0YTIpLzIgKyBQUk9DRVNTSU5HX1RJTUU7CisJCQl9CisJCQlpZiAoZGlmZiA8IFJBTkdFKSB7CisJCQkJbWluMSA9IGRlbHRhMTsKKwkJCQltaW4yID0gZGVsdGEyOworCQkJCWdvdG8gZ29vZF9leGl0OworCQkJfQorCQkgICAgICB9CisJCX0KKwl9CisKK2dvb2RfZXhpdDoKKwltZWFzdXJlX2RlbHRhID0gKG1pbjEgLSBtaW4yKS8yICsgUFJPQ0VTU0lOR19USU1FOworCXJldHVybiBHT09EOworfQorCitjaGFyICpteW5hbWUsICpoaXNuYW1lOworCitpbnQKK21lYXN1cmVfb3B0KHN0cnVjdCBzb2NrYWRkcl9pbiAqIGFkZHIpCit7CisJc29ja2xlbl90IGxlbmd0aDsKKwlpbnQgbXNnY291bnQ7CisJaW50IGNjLCBjb3VudDsKKwlmZF9zZXQgcmVhZHk7CisJbG9uZyBzZW5kdGltZSwgcmVjdnRpbWUsIGhpc3RpbWUsIGhpc3RpbWUxOworCWxvbmcgbWluMSwgbWluMiwgZGlmZjsKKwlsb25nIGRlbHRhMSwgZGVsdGEyOworCXN0cnVjdCB0aW1ldmFsIHR2MSwgdG91dDsKKwl1X2NoYXIgcGFja2V0W1BBQ0tFVF9JTl0sIG9wYWNrZXRbNjRdOworCXN0cnVjdCBpY21waGRyICppY3AgPSAoc3RydWN0IGljbXBoZHIgKikgcGFja2V0OworCXN0cnVjdCBpY21waGRyICpvaWNwID0gKHN0cnVjdCBpY21waGRyICopIG9wYWNrZXQ7CisJc3RydWN0IGlwaGRyICppcCA9IChzdHJ1Y3QgaXBoZHIgKikgcGFja2V0OworCisJbWluMSA9IG1pbjIgPSAweDdmZmZmZmZmOworCW1pbl9ydHQgPSAweDdmZmZmZmZmOworCW1lYXN1cmVfZGVsdGEgPSBIT1NURE9XTjsKKwltZWFzdXJlX2RlbHRhMSA9IEhPU1RET1dOOworCisvKiBlbXB0aWVzIHRoZSBpY21wIGlucHV0IHF1ZXVlICovCisJRkRfWkVSTygmcmVhZHkpOworZW1wdHk6CisJdG91dC50dl9zZWMgPSB0b3V0LnR2X3VzZWMgPSAwOworCUZEX1NFVChzb2NrX3JhdywgJnJlYWR5KTsKKwlpZiAoc2VsZWN0KEZEX1NFVFNJWkUsICZyZWFkeSwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdG91dCkpIHsKKwkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCWNjID0gcmVjdmZyb20oc29ja19yYXcsIChjaGFyICopcGFja2V0LCBQQUNLRVRfSU4sIDAsCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopTlVMTCwgJmxlbmd0aCk7CisJCWlmIChjYyA8IDApCisJCQlyZXR1cm4gLTE7CisJCWdvdG8gZW1wdHk7CisJfQorCisJLyoKKwkgKiBUbyBtZWFzdXJlIHRoZSBkaWZmZXJlbmNlLCBzZWxlY3QgTVNHUyBtZXNzYWdlcyB3aG9zZSByb3VuZC10cmlwCisJICogdGltZSBpcyBzbWFsbGVyIHRoYW4gUkFOR0UgaWYgY2tyYW5nZSBpcyAxLCBvdGhlcndpc2Ugc2ltcGx5CisJICogc2VsZWN0IE1TR1MgbWVzc2FnZXMgcmVnYXJkbGVzcyBvZiByb3VuZC10cmlwIHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqIENob29zZSB0aGUgc21hbGxlc3QgdHJhbnNtaXNzaW9uIHRpbWUgaW4gZWFjaCBvZiB0aGUgdHdvIGRpcmVjdGlvbnMuCisJICogVXNlIHRoZXNlIHR3byBsYXR0ZXIgcXVhbnRpdGllcyB0byBjb21wdXRlIHRoZSBkZWx0YSBiZXR3ZWVuCisJICogdGhlIHR3byBjbG9ja3MuCisJICovCisKKwlsZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwlvaWNwLT50eXBlID0gSUNNUF9FQ0hPOworCW9pY3AtPmNvZGUgPSAwOworCW9pY3AtPmNoZWNrc3VtID0gMDsKKwlvaWNwLT51bi5lY2hvLmlkID0gaWQ7CisJKChfX3UzMiopKG9pY3ArMSkpWzBdID0gMDsKKwkoKF9fdTMyKikob2ljcCsxKSlbMV0gPSAwOworCSgoX191MzIqKShvaWNwKzEpKVsyXSA9IDA7CisKKwlGRF9aRVJPKCZyZWFkeSk7CisJbXNnY291bnQgPSAwOworCisJYWNrZWQgPSBzZXFubyA9IHNlcW5vMCA9IDA7CisKKwlmb3IgKG1zZ2NvdW50ID0gMDsgbXNnY291bnQgPCBNU0dTOyApIHsKKworCS8qCisJICogSWYgbm8gYW5zd2VyIGlzIHJlY2VpdmVkIGZvciBUUklBTFMgY29uc2VjdXRpdmUgdGltZXMsCisJICogdGhlIG1hY2hpbmUgaXMgYXNzdW1lZCB0byBiZSBkb3duCisJICovCisJCWlmICggc2Vxbm8gLSBhY2tlZCA+IFRSSUFMUykgeworCQkJZXJybm8gPSBFSE9TVERPV047CisJCQlyZXR1cm4gSE9TVERPV047CisJCX0KKwkJb2ljcC0+dW4uZWNoby5zZXF1ZW5jZSA9ICsrc2Vxbm87CisJCW9pY3AtPmNoZWNrc3VtID0gMDsKKworCQlnZXR0aW1lb2ZkYXkgKCZ0djEsIE5VTEwpOworCQkoKF9fdTMyKikob2ljcCsxKSlbMF0gPSBodG9ubCgodHYxLnR2X3NlYyAlICgyNCo2MCo2MCkpICogMTAwMAorCQkJCQkgICAgICArIHR2MS50dl91c2VjIC8gMTAwMCk7CisJCW9pY3AtPmNoZWNrc3VtID0gaW5fY2tzdW0oKHVfc2hvcnQgKilvaWNwLCBzaXplb2YoKm9pY3ApKzEyKTsKKworCQljb3VudCA9IHNlbmR0byhzb2NrX3JhdywgKGNoYXIgKilvcGFja2V0LCBzaXplb2YoKm9pY3ApKzEyLCAwLAorCQkJICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisKKwkJaWYgKGNvdW50IDwgMCkgeworCQkJZXJybm8gPSBFSE9TVFVOUkVBQ0g7CisJCQlyZXR1cm4gVU5SRUFDSEFCTEU7CisJCX0KKworCQlmb3IgKDs7KSB7CisJCQlGRF9aRVJPKCZyZWFkeSk7CisJCQlGRF9TRVQoc29ja19yYXcsICZyZWFkeSk7CisJCQl7CisJCQkJbG9uZyB0bW8gPSBydHQgKyBydHRfc2lnbWE7CisJCQkJdG91dC50dl9zZWMgPSAgdG1vLzEwMDA7CisJCQkJdG91dC50dl91c2VjID0gKHRtbyAtICh0bW8vMTAwMCkqMTAwMCkqMTAwMDsKKwkJCX0KKworCQkJaWYgKChjb3VudCA9IHNlbGVjdChGRF9TRVRTSVpFLCAmcmVhZHksIChmZF9zZXQgKikwLAorCQkJICAgIChmZF9zZXQgKikwLCAmdG91dCkpIDw9IDApCisJCQkJYnJlYWs7CisKKwkJCSh2b2lkKWdldHRpbWVvZmRheSgmdHYxLCAoc3RydWN0IHRpbWV6b25lICopMCk7CisJCQljYyA9IHJlY3Zmcm9tKHNvY2tfcmF3LCAoY2hhciAqKXBhY2tldCwgUEFDS0VUX0lOLCAwLAorCQkJCSAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKilOVUxMLCAmbGVuZ3RoKTsKKworCQkJaWYgKGNjIDwgMCkKKwkJCQlyZXR1cm4oLTEpOworCisJCQlpY3AgPSAoc3RydWN0IGljbXBoZHIgKikocGFja2V0ICsgKGlwLT5paGwgPDwgMikpOworCQkJaWYgKGljcC0+dHlwZSA9PSBJQ01QX0VDSE9SRVBMWSAmJgorCQkJICAgIHBhY2tldFsyMF0gPT0gSVBPUFRfVElNRVNUQU1QICYmCisJCQkgICAgaWNwLT51bi5lY2hvLmlkID09IGlkICYmCisJCQkgICAgaWNwLT51bi5lY2hvLnNlcXVlbmNlID49IHNlcW5vMCAmJgorCQkJICAgIGljcC0+dW4uZWNoby5zZXF1ZW5jZSA8PSBzZXFubykgeworCQkJCWludCBpOworCQkJCV9fdTggKm9wdCA9IHBhY2tldCsyMDsKKworCQkJCWlmIChhY2tlZCA8IGljcC0+dW4uZWNoby5zZXF1ZW5jZSkKKwkJCQkJYWNrZWQgPSBpY3AtPnVuLmVjaG8uc2VxdWVuY2U7CisJCQkJaWYgKChvcHRbM10mMHhGKSAhPSBJUE9QVF9UU19QUkVTUEVDKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgdGltZXN0YW1wICVkXG4iLCBvcHRbM10mMHhGKTsKKwkJCQkJcmV0dXJuIE5PTlNURFRJTUU7CisJCQkJfQorCQkJCWlmIChvcHRbM10+PjQpIHsKKwkJCQkJaWYgKChvcHRbM10+PjQpICE9IDEgfHwgaXBfb3B0X2xlbiAhPSA0KzMqOCkKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiT3ZlcmZsb3cgJWQgaG9wc1xuIiwgb3B0WzNdPj40KTsKKwkJCQl9CisJCQkJc2VuZHRpbWUgPSByZWN2dGltZSA9IGhpc3RpbWUgPSBoaXN0aW1lMSA9IDA7CisJCQkJZm9yIChpPTA7IGkgPCAob3B0WzJdLTUpLzg7IGkrKykgeworCQkJCQlfX3UzMiAqdGltZXAgPSAoX191MzIqKShvcHQrNCtpKjgrNCk7CisJCQkJCV9fdTMyIHQgPSBudG9obCgqdGltZXApOworCisJCQkJCWlmICh0ICYgMHg4MDAwMDAwMCkKKwkJCQkJCXJldHVybiBOT05TVERUSU1FOworCisJCQkJCWlmIChpID09IDApCisJCQkJCQlzZW5kdGltZSA9IHQ7CisJCQkJCWlmIChpID09IDEpCisJCQkJCQloaXN0aW1lID0gaGlzdGltZTEgPSB0OworCQkJCQlpZiAoaSA9PSAyKSB7CisJCQkJCQlpZiAoaXBfb3B0X2xlbiA9PSA0KzQqOCkKKwkJCQkJCQloaXN0aW1lMSA9IHQ7CisJCQkJCQllbHNlCisJCQkJCQkJcmVjdnRpbWUgPSB0OworCQkJCQl9CisJCQkJCWlmIChpID09IDMpCisJCQkJCQlyZWN2dGltZSA9IHQ7CisJCQkJfQorCisJCQkJaWYgKCEoc2VuZHRpbWUmaGlzdGltZSZoaXN0aW1lMSZyZWN2dGltZSkpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJ3cm9uZyB0aW1lc3RhbXBzXG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCWRpZmYgPSByZWN2dGltZSAtIHNlbmR0aW1lOworCQkJCS8qCisJCQkJICogZGlmZiBjYW4gYmUgbGVzcyB0aGFuIDAgYXJvdWQgbWlkbmlnaHQKKwkJCQkgKi8KKwkJCQlpZiAoZGlmZiA8IDApCisJCQkJCWNvbnRpbnVlOworCQkJCXJ0dCA9IChydHQgKiAzICsgZGlmZikvNDsKKwkJCQlydHRfc2lnbWEgPSAocnR0X3NpZ21hICozICsgYWJzKGRpZmYtcnR0KSkvNDsKKwkJCQltc2djb3VudCsrOworCisJCQkJaWYgKGludGVyYWN0aXZlKSB7CisJCQkJCXByaW50ZigiLiIpOworCQkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCQl9CisKKwkJCQlkZWx0YTEgPSBoaXN0aW1lIC0gc2VuZHRpbWU7CisJCQkJLyoKKwkJCQkgKiBIYW5kbGVzIHdyYXAtYXJvdW5kIHRvIGF2b2lkIHRoYXQgYXJvdW5kCisJCQkJICogbWlkbmlnaHQgc21hbGwgdGltZSBkaWZmZXJlbmNlcyBhcHBlYXIKKwkJCQkgKiBlbm9ybW91cy4gSG93ZXZlciwgdGhlIHR3byBtYWNoaW5lJ3MgY2xvY2tzCisJCQkJICogbXVzdCBiZSB3aXRoaW4gMTIgaG91cnMgZnJvbSBlYWNoIG90aGVyLgorCQkJCSAqLworCQkJCWlmIChkZWx0YTEgPCBCSUFTTikKKwkJCQkJZGVsdGExICs9IE1PRFVMTzsKKwkJCQllbHNlIGlmIChkZWx0YTEgPiBCSUFTUCkKKwkJCQkJZGVsdGExIC09IE1PRFVMTzsKKworCQkJCWRlbHRhMiA9IHJlY3Z0aW1lIC0gaGlzdGltZTE7CisJCQkJaWYgKGRlbHRhMiA8IEJJQVNOKQorCQkJCQlkZWx0YTIgKz0gTU9EVUxPOworCQkJCWVsc2UgaWYgKGRlbHRhMiA+IEJJQVNQKQorCQkJCQlkZWx0YTIgLT0gTU9EVUxPOworCisJCQkJaWYgKGRlbHRhMSA8IG1pbjEpCisJCQkJCW1pbjEgPSBkZWx0YTE7CisJCQkJaWYgKGRlbHRhMiA8IG1pbjIpCisJCQkJCW1pbjIgPSBkZWx0YTI7CisJCQkJaWYgKGRlbHRhMSArIGRlbHRhMiA8IG1pbl9ydHQpIHsKKwkJCQkJbWluX3J0dCAgPSBkZWx0YTEgKyBkZWx0YTI7CisJCQkJCW1lYXN1cmVfZGVsdGExID0gKGRlbHRhMSAtIGRlbHRhMikvMiArIFBST0NFU1NJTkdfVElNRTsKKwkJCQl9CisJCQkJaWYgKGRpZmYgPCBSQU5HRSkgeworCQkJCQltaW4xID0gZGVsdGExOworCQkJCQltaW4yID0gZGVsdGEyOworCQkJCQlnb3RvIGdvb2RfZXhpdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK2dvb2RfZXhpdDoKKwltZWFzdXJlX2RlbHRhID0gKG1pbjEgLSBtaW4yKS8yICsgUFJPQ0VTU0lOR19USU1FOworCXJldHVybiBHT09EOworfQorCisKKy8qCisgKiBDbG9ja2RpZmYgY29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdGltZSBvZiB0aGUgbWFjaGluZSBvbgorICogd2hpY2ggaXQgaXMgY2FsbGVkIGFuZCB0aGUgdGltZSBvZiB0aGUgbWFjaGluZXMgZ2l2ZW4gYXMgYXJndW1lbnQuCisgKiBUaGUgdGltZSBkaWZmZXJlbmNlcyBtZWFzdXJlZCBieSBjbG9ja2RpZmYgYXJlIG9idGFpbmVkIHVzaW5nIGEgc2VxdWVuY2UKKyAqIG9mIElDTVAgVFNUQU1QIG1lc3NhZ2VzIHdoaWNoIGFyZSByZXR1cm5lZCB0byB0aGUgc2VuZGVyIGJ5IHRoZSBJUCBtb2R1bGUKKyAqIGluIHRoZSByZW1vdGUgbWFjaGluZS4KKyAqIEluIG9yZGVyIHRvIGNvbXBhcmUgY2xvY2tzIG9mIG1hY2hpbmVzIGluIGRpZmZlcmVudCB0aW1lIHpvbmVzLCB0aGUgdGltZQorICogaXMgdHJhbnNtaXR0ZWQgKGFzIGEgMzItYml0IHZhbHVlKSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgVVQuCisgKiBJZiBhIGhvc3RzIHVzZXMgYSBkaWZmZXJlbnQgdGltZSBmb3JtYXQsIGl0IHNob3VsZCBzZXQgdGhlIGhpZ2ggb3JkZXIKKyAqIGJpdCBvZiB0aGUgMzItYml0IHF1YW50aXR5IGl0IHRyYW5zbWl0cy4KKyAqIEhvd2V2ZXIsIFZNUyBhcHBhcmVudGx5IHRyYW5zbWl0cyB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQKKyAqIGxvY2FsIHRpbWUgKHJhdGhlciB0aGFuIEdNVCkgd2l0aG91dCBzZXR0aW5nIHRoZSBoaWdoIG9yZGVyIGJpdC4KKyAqIEZ1cnRoZXJtb3JlLCBpdCBkb2VzIG5vdCB1bmRlcnN0YW5kIGRheWxpZ2h0LXNhdmluZyB0aW1lLiAgVGhpcyBtYWtlcworICogY2xvY2tkaWZmIGJlaGF2aW5nIGluY29uc2lzdGVudGx5IHdpdGggaG9zdHMgcnVubmluZyBWTVMuCisgKgorICogSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBzZW5zaXRpdml0eSB0byB0aGUgdmFyaWFuY2Ugb2YgbWVzc2FnZSB0cmFuc21pc3Npb24KKyAqIHRpbWUsIGNsb2NrZGlmZiBzZW5kcyBhIHNlcXVlbmNlIG9mIG1lc3NhZ2VzLiAgWWV0LCBtZWFzdXJlcyBiZXR3ZWVuCisgKiB0d28gYGRpc3RhbnQnIGhvc3RzIGNhbiBiZSBhZmZlY3RlZCBieSBhIHNtYWxsIGVycm9yLiBUaGUgZXJyb3IgY2FuLCBob3dldmVyLAorICogYmUgcmVkdWNlZCBieSBpbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgc2VudCBpbiBlYWNoIG1lYXN1cmVtZW50LgorICovCisKK3ZvaWQKK3VzYWdlKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBjbG9ja2RpZmYgWy1vXSA8aG9zdD5cbiIpOworICBleGl0KDEpOworfQorCit2b2lkIGRyb3BfcmlnaHRzKHZvaWQpIHsKKyNpZmRlZiBDQVBBQklMSVRJRVMKKwljYXBfdCBjYXBzID0gY2FwX2luaXQoKTsKKwlpZiAoY2FwX3NldF9wcm9jKGNhcHMpKSB7CisJCXBlcnJvcigiY2xvY2tkaWZmOiBjYXBfc2V0X3Byb2MiKTsKKwkJZXhpdCgtMSk7CisJfQorCWNhcF9mcmVlKGNhcHMpOworI2VuZGlmCisJaWYgKHNldHVpZChnZXR1aWQoKSkpIHsKKwkJcGVycm9yKCJjbG9ja2RpZmY6IHNldHVpZCIpOworCQlleGl0KC0xKTsKKwl9Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBtZWFzdXJlX3N0YXR1czsKKwlzdHJ1Y3QgaG9zdGVudCAqIGhwOworCWNoYXIgaG9zdG5hbWVbTUFYX0hPU1ROQU1FTEVOXTsKKwlpbnQgc19lcnJubyA9IDA7CisJaW50IG5fZXJybm8gPSAwOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCWRyb3BfcmlnaHRzKCk7CisJCXVzYWdlKCk7CisJfQorCisJc29ja19yYXcgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fSUNNUCk7CisJc19lcnJubyA9IGVycm5vOworCisJZXJybm8gPSAwOworCWlmIChuaWNlKC0xNikgPT0gLTEpCisJCW5fZXJybm8gPSBlcnJubzsKKwlkcm9wX3JpZ2h0cygpOworCisJaWYgKGFyZ2MgPT0gMykgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICItbyIpID09IDApIHsKKwkJCWlwX29wdF9sZW4gPSA0ICsgNCo4OworCQkJYXJndisrOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLW8xIikgPT0gMCkgeworCQkJaXBfb3B0X2xlbiA9IDQgKyAzKjg7CisJCQlhcmd2Kys7CisJCX0gZWxzZQorCQkJdXNhZ2UoKTsKKwl9IGVsc2UgaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoKTsKKworCWlmIChzb2NrX3JhdyA8IDApICB7CisJCWVycm5vID0gc19lcnJubzsKKwkJcGVycm9yKCJjbG9ja2RpZmY6IHNvY2tldCIpOworCQlleGl0KDEpOworCX0KKworCWlmIChuX2Vycm5vIDwgMCkgeworCQllcnJubyA9IG5fZXJybm87CisJCXBlcnJvcigiY2xvY2tkaWZmOiBuaWNlIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKGlzYXR0eShmaWxlbm8oc3RkaW4pKSAmJiBpc2F0dHkoZmlsZW5vKHN0ZG91dCkpKQorCQlpbnRlcmFjdGl2ZSA9IDE7CisKKwlpZCA9IGdldHBpZCgpOworCisJKHZvaWQpZ2V0aG9zdG5hbWUoaG9zdG5hbWUsc2l6ZW9mKGhvc3RuYW1lKSk7CisJaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNsb2NrZGlmZjogJXM6IG15IGhvc3Qgbm90IGZvdW5kXG4iLCBob3N0bmFtZSk7CisJCWV4aXQoMSk7CisJfQorCW15bmFtZSA9IHN0cmR1cChocC0+aF9uYW1lKTsKKworCWhwID0gZ2V0aG9zdGJ5bmFtZShhcmd2WzFdKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNsb2NrZGlmZjogJXM6IGhvc3Qgbm90IGZvdW5kXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisJaGlzbmFtZSA9IHN0cmR1cChocC0+aF9uYW1lKTsKKworCW1lbXNldCgmc2VydmVyLCAwLCBzaXplb2Yoc2VydmVyKSk7CisJc2VydmVyLnNpbl9mYW1pbHkgPSBocC0+aF9hZGRydHlwZTsKKwltZW1jcHkoJihzZXJ2ZXIuc2luX2FkZHIuc19hZGRyKSwgaHAtPmhfYWRkciwgNCk7CisKKwlpZiAoY29ubmVjdChzb2NrX3JhdywgKHN0cnVjdCBzb2NrYWRkciopJnNlcnZlciwgc2l6ZW9mKHNlcnZlcikpID09IC0xKSB7CisJCXBlcnJvcigiY29ubmVjdCIpOworCQlleGl0KDEpOworCX0KKwlpZiAoaXBfb3B0X2xlbikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gbXlhZGRyOworCQlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihteWFkZHIpOworCQl1bnNpZ25lZCBjaGFyIHJzcGFjZVtpcF9vcHRfbGVuXTsKKworCQltZW1zZXQocnNwYWNlLCAwLCBzaXplb2YocnNwYWNlKSk7CisJCXJzcGFjZVswXSA9IElQT1BUX1RJTUVTVEFNUDsKKwkJcnNwYWNlWzFdID0gaXBfb3B0X2xlbjsKKwkJcnNwYWNlWzJdID0gNTsKKwkJcnNwYWNlWzNdID0gSVBPUFRfVFNfUFJFU1BFQzsKKwkJaWYgKGdldHNvY2tuYW1lKHNvY2tfcmF3LCAoc3RydWN0IHNvY2thZGRyKikmbXlhZGRyLCAmYWRkcmxlbikgPT0gLTEpIHsKKwkJCXBlcnJvcigiZ2V0c29ja25hbWUiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJKChfX3UzMiopKHJzcGFjZSs0KSlbMCoyXSA9IG15YWRkci5zaW5fYWRkci5zX2FkZHI7CisJCSgoX191MzIqKShyc3BhY2UrNCkpWzEqMl0gPSBzZXJ2ZXIuc2luX2FkZHIuc19hZGRyOworCQkoKF9fdTMyKikocnNwYWNlKzQpKVsyKjJdID0gbXlhZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwkJaWYgKGlwX29wdF9sZW4gPT0gNCs0KjgpIHsKKwkJCSgoX191MzIqKShyc3BhY2UrNCkpWzIqMl0gPSBzZXJ2ZXIuc2luX2FkZHIuc19hZGRyOworCQkJKChfX3UzMiopKHJzcGFjZSs0KSlbMyoyXSA9IG15YWRkci5zaW5fYWRkci5zX2FkZHI7CisJCX0KKworCQlpZiAoc2V0c29ja29wdChzb2NrX3JhdywgSVBQUk9UT19JUCwgSVBfT1BUSU9OUywgcnNwYWNlLCBpcF9vcHRfbGVuKSA8IDApIHsKKwkJCXBlcnJvcigicGluZzogSVBfT1BUSU9OUyAoZmFsbGJhY2sgdG8gaWNtcCB0c3RhbXBzKSIpOworCQkJaXBfb3B0X2xlbiA9IDA7CisJCX0KKwl9CisKKwlpZiAoKG1lYXN1cmVfc3RhdHVzID0gKGlwX29wdF9sZW4gPyBtZWFzdXJlX29wdCA6IG1lYXN1cmUpKCZzZXJ2ZXIpKSA8IDApIHsKKwkJaWYgKGVycm5vKQorCQkJcGVycm9yKCJtZWFzdXJlIik7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAibWVhc3VyZTogdW5rbm93biBmYWlsdXJlXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlzd2l0Y2ggKG1lYXN1cmVfc3RhdHVzKSB7CisJY2FzZSBIT1NURE9XTjoKKwkJZnByaW50ZihzdGRlcnIsICIlcyBpcyBkb3duXG4iLCBoaXNuYW1lKTsKKwkJZXhpdCgxKTsKKwljYXNlIE5PTlNURFRJTUU6CisJCWZwcmludGYoc3RkZXJyLCAiJXMgdGltZSB0cmFuc21pdHRlZCBpbiBhIG5vbi1zdGFuZGFyZCBmb3JtYXRcbiIsIGhpc25hbWUpOworCQlleGl0KDEpOworCWNhc2UgVU5SRUFDSEFCTEU6CisJCWZwcmludGYoc3RkZXJyLCAiJXMgaXMgdW5yZWFjaGFibGVcbiIsIGhpc25hbWUpOworCQlleGl0KDEpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCisJeworCQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKworCQlpZiAoaW50ZXJhY3RpdmUpCisJCQlwcmludGYoIlxuaG9zdD0lcyBydHQ9JWxkKCVsZCltcy8lbGRtcyBkZWx0YT0lZG1zLyVkbXMgJXMiLCBoaXNuYW1lLAorCQkJICAgICAgIHJ0dCwgcnR0X3NpZ21hLCBtaW5fcnR0LAorCQkJICAgICAgIG1lYXN1cmVfZGVsdGEsIG1lYXN1cmVfZGVsdGExLAorCQkJICAgICAgIGN0aW1lKCZub3cpKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlbGQgJWQgJWRcbiIsIG5vdywgbWVhc3VyZV9kZWx0YSwgbWVhc3VyZV9kZWx0YTEpOworCX0KKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvTWFrZWZpbGUgYi9pcHV0aWxzL2RvYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM0ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorU0dNTEZJTEVTPSQoc2hlbGwgZWNobyAqLnNnbWwpCitIVE1MRklMRVM9JChzdWJzdCAuc2dtbCwuaHRtbCwkKFNHTUxGSUxFUykpIGluZGV4Lmh0bWwKK01BTkZJTEVTPSQoc3Vic3QgLnNnbWwsLjgsJChTR01MRklMRVMpKQorCithbGw6IGh0bWwKKworaHRtbDogJChIVE1MRklMRVMpIGlwdXRpbHMuaHRtbAorCittYW46ICQoTUFORklMRVMpCisKKyMgZG9jYm9vayBzY3JpcHRzIGFyZSBpbmNyZWRpYmx5IGRpcnR5IGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgbGVhaworIyBsb3RzIG9mIHNvbWUgc3RyYW5nZSB0ZW1wb3JhcnkganVuayBkaXJlY3RvcmllcyBhbmQgZmlsZXMuCisjIFNvLCBzY29wZSBpdCB0byBhIHRlbXBvcmFyeSBkaXIgYW5kIGNsZWFuIGFsbCBhZnRlciBlYWNoIHJ1bi4KKworJChIVE1MRklMRVMpOiBpbmRleC5kYgorCUAtcm0gLXJmIHRtcC5kYjJodG1sCisJQG1rZGlyIHRtcC5kYjJodG1sCisJQHNldCAtZTsgY2QgdG1wLmRiMmh0bWw7IGRvY2Jvb2syaHRtbCAuLi8kPCA7IG12ICouaHRtbCAuLgorCUAtcm0gLXJmIHRtcC5kYjJodG1sCisKK2lwdXRpbHMuaHRtbDogaXB1dGlscy5kYgorCUAtcm0gLXJmIHRtcC5kYjJodG1sCisJQG1rZGlyIHRtcC5kYjJodG1sCisJQHNldCAtZTsgY2QgdG1wLmRiMmh0bWw7IGRvY2Jvb2syaHRtbCAtdSAtbyBodG1sIC4uLyQ8IDsgbXYgaHRtbC8kQCAuLgorCUAtcm0gLXJmIHRtcC5kYjJodG1sCisKKyMgZG9jYm9vazJtYW4gcHJvZHVjZXMgdXR0ZXJseSB1Z2x5IG91dHB1dCBhbmQgSSBkaWQgbm90IGZpbmQKKyMgYW55IHdheSB0byBjdXN0b21pemUgdGhpcyBidXQgaGFja2luZyBiYWNrZW5kIHBlcmwgc2NyaXB0IGEgbGl0dGxlLgorIyBXZWxsLCBoZW5jZS4uLgorCiskKE1BTkZJTEVTKTogaW5kZXguZGIKKwlALW1rZGlyIHRtcC5kYjJtYW4KKwlAc2V0IC1lOyBjZCB0bXAuZGIybWFuOyBuc2dtbHMgLi4vJDwgfCBzZ21sc3BsIC4uL2RvY2Jvb2sybWFuLXNwZWMucGwgOwltdiAkQCAuLgorCUAtcm0gLXJmIHRtcC5kYjJtYW4KKworY2xlYW46CisJQHJtIC1yZiAkKE1BTkZJTEVTKSAkKEhUTUxGSUxFUykgaXB1dGlscy5odG1sIHRtcC5kYjJodG1sIHRtcC5kYjJtYW4KKworc25hcHNob3Q6CisJQGRhdGUgIisleSVtJWQiID4gc25hcHNob3QuZGIKKworCiskKE1BTkZJTEVTKTogJChTR01MRklMRVMpCisKKyQoSFRNTEZJTEVTKTogJChTR01MRklMRVMpCisKKwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvYXJwaW5nLnNnbWwgYi9pcHV0aWxzL2RvYy9hcnBpbmcuc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg4ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvYXJwaW5nLnNnbWwKQEAgLTAsMCArMSwyMjEgQEAKKzxyZWZlbnRyeSBpZD0iYXJwaW5nIj4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5hcnBpbmc8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjg8L21hbnZvbG51bT4KKzxyZWZtaXNjaW5mbz5pcHV0aWxzLSZzbmFwc2hvdDs8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorCisKKzxyZWZuYW1lZGl2PgorPHJlZm5hbWU+YXJwaW5nPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+c2VuZCBBUlAgUkVRVUVTVCB0byBhIG5laWdoYm91ciBob3N0PC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorCis8cmVmc3lub3BzaXNkaXY+Cis8Y21kc3lub3BzaXM+Cis8Y29tbWFuZD5hcnBpbmc8L2NvbW1hbmQ+Cis8YXJnIGNob2ljZT0ib3B0Ij48b3B0aW9uPi1BYkRmaHFVVjwvb3B0aW9uPjwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LWMgPHJlcGxhY2VhYmxlL2NvdW50LzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LXcgPHJlcGxhY2VhYmxlL2RlYWRsaW5lLzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LXMgPHJlcGxhY2VhYmxlL3NvdXJjZS88L2FyZz4KKzxhcmcgY2hvaWNlPSJyZXEiPi1JIDxyZXBsYWNlYWJsZS9pbnRlcmZhY2UvPC9hcmc+Cis8YXJnIGNob2ljZT0icmVxIj48cmVwbGFjZWFibGUvZGVzdGluYXRpb24vPC9hcmc+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworPHJlZnNlY3QxPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT4KK1BpbmcgPHJlcGxhY2VhYmxlL2Rlc3RpbmF0aW9uLyBvbiBkZXZpY2UgPHJlcGxhY2VhYmxlL2ludGVyZmFjZS8gYnkgQVJQIHBhY2tldHMsCit1c2luZyBzb3VyY2UgYWRkcmVzcyA8cmVwbGFjZWFibGUvc291cmNlLy4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+T1BUSU9OUzwvdGl0bGU+CisKKzx2YXJpYWJsZWxpc3Q+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1BLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorVGhlIHNhbWUgYXMgPG9wdGlvbi8tVS8sIGJ1dCBBUlAgUkVQTFkgcGFja2V0cyB1c2VkIGluc3RlYWQKK29mIEFSUCBSRVFVRVNULgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LWI8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NlbmQgb25seSBNQUMgbGV2ZWwgYnJvYWRjYXN0cy4gTm9ybWFsbHkgPGNvbW1hbmQvYXJwaW5nLyBzdGFydHMKK2Zyb20gc2VuZGluZyBicm9hZGNhc3QsIGFuZCBzd2l0Y2ggdG8gdW5pY2FzdCBhZnRlciByZXBseSByZWNlaXZlZC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+PGFuY2hvciBpZD0iYXJwaW5nLmNvdW50Ij4tYyA8cmVwbGFjZWFibGUvY291bnQvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTdG9wIGFmdGVyIHNlbmRpbmcgPHJlcGxhY2VhYmxlL2NvdW50LyBBUlAgUkVRVUVTVAorcGFja2V0cy4gV2l0aCAKKzxsaW5rIGxpbmtlbmQ9ImFycGluZy5kZWFkbGluZSI+PHJlcGxhY2VhYmxlL2RlYWRsaW5lLzwvbGluaz4KK29wdGlvbiwgPGNvbW1hbmQvYXJwaW5nLyB3YWl0cyBmb3IKKzxyZXBsYWNlYWJsZS9jb3VudC8gQVJQIFJFUExZIHBhY2tldHMsIHVudGlsIHRoZSB0aW1lb3V0IGV4cGlyZXMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tRC88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0R1cGxpY2F0ZSBhZGRyZXNzIGRldGVjdGlvbiBtb2RlIChEQUQpLiBTZWUgCis8dWxpbmsgdXJsPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvcmZjL3JmYzIxMzEudHh0Ij5SRkMyMTMxLCA0LjQuMTwvdWxpbms+LgorUmV0dXJucyAwLCBpZiBEQUQgc3VjY2VlZGVkIGkuZS4gbm8gcmVwbGllcyBhcmUgcmVjZWl2ZWQKKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi1mPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitGaW5pc2ggYWZ0ZXIgdGhlIGZpcnN0IHJlcGx5IGNvbmZpcm1pbmcgdGhhdCB0YXJnZXQgaXMgYWxpdmUuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj48YW5jaG9yIGlkPSJvcHQuaW50ZXJmYWNlIj4tSSA8cmVwbGFjZWFibGUvaW50ZXJmYWNlLzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorTmFtZSBvZiBuZXR3b3JrIGRldmljZSB3aGVyZSB0byBzZW5kIEFSUCBSRVFVRVNUIHBhY2tldHMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4taDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorUHJpbnQgaGVscCBwYWdlIGFuZCBleGl0LgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tcS88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1F1aWV0IG91dHB1dC4gTm90aGluZyBpcyBkaXNwbGF5ZWQuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj48YW5jaG9yIGlkPSJvcHQuc291cmNlIj4tcyA8cmVwbGFjZWFibGUvc291cmNlLzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorSVAgc291cmNlIGFkZHJlc3MgdG8gdXNlIGluIEFSUCBwYWNrZXRzLgorSWYgdGhpcyBvcHRpb24gaXMgYWJzZW50LCBzb3VyY2UgYWRkcmVzcyBpczoKKyAgIDxpdGVtaXplZGxpc3Q+CisgICAgPGxpc3RpdGVtPjxwYXJhPgorSW4gREFEIG1vZGUgKHdpdGggb3B0aW9uIDxvcHRpb24vLUQvKSBzZXQgdG8gMC4wLjAuMC4KKyAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8bGlzdGl0ZW0+PHBhcmE+CitJbiBVbnNvbGljaXRlZCBBUlAgbW9kZSAod2l0aCBvcHRpb25zIDxvcHRpb24vLVUvIG9yIDxvcHRpb24vLUEvKQorc2V0IHRvIDxyZXBsYWNlYWJsZS9kZXN0aW5hdGlvbi8uCisgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPjxwYXJhPgorT3RoZXJ3aXNlLCBpdCBpcyBjYWxjdWxhdGVkIGZyb20gcm91dGluZyB0YWJsZXMuCisgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICA8L2l0ZW1pemVkbGlzdD4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1VLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorVW5zb2xpY2l0ZWQgQVJQIG1vZGUgdG8gdXBkYXRlIG5laWdoYm91cnMnIEFSUCBjYWNoZXMuCitObyByZXBsaWVzIGFyZSBleHBlY3RlZC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi1WPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitQcmludCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBleGl0LgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj48YW5jaG9yIGlkPSJhcnBpbmcuZGVhZGxpbmUiPi13IDxyZXBsYWNlYWJsZS9kZWFkbGluZS88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NwZWNpZnkgYSB0aW1lb3V0LCBpbiBzZWNvbmRzLCBiZWZvcmUKKzxjb21tYW5kL2FycGluZy8KK2V4aXRzIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkKK3BhY2tldHMgaGF2ZSBiZWVuIHNlbnQgb3IgcmVjZWl2ZWQuIEluIHRoaXMgY2FzZQorPGNvbW1hbmQvYXJwaW5nLworZG9lcyBub3Qgc3RvcCBhZnRlcgorPGxpbmsgbGlua2VuZD0iYXJwaW5nLmNvdW50Ij48cmVwbGFjZWFibGUvY291bnQvPC9saW5rPgorcGFja2V0IGFyZSBzZW50LCBpdCB3YWl0cyBlaXRoZXIgZm9yCis8bGluayBsaW5rZW5kPSJhcnBpbmcuZGVhZGxpbmUiPjxyZXBsYWNlYWJsZS9kZWFkbGluZS88L2xpbms+CitleHBpcmUgb3IgdW50aWwKKzxsaW5rIGxpbmtlbmQ9ImFycGluZy5jb3VudCI+PHJlcGxhY2VhYmxlL2NvdW50LzwvbGluaz4KK3Byb2JlcyBhcmUgYW5zd2VyZWQuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPlNFRSBBTFNPPC90aXRsZT4KKzxwYXJhPgorPGxpbmsgbGlua2VuZD0icGluZyI+Cis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL3BpbmcvPG1hbnZvbG51bS84LzwvY2l0ZXJlZmVudHJ5PjwvbGluaz4sCis8bGluayBsaW5rZW5kPSJjbG9ja2RpZmYiPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9jbG9ja2RpZmYvPG1hbnZvbG51bS84LzwvY2l0ZXJlZmVudHJ5PjwvbGluaz4sCis8bGluayBsaW5rZW5kPSJ0cmFjZXBhdGgiPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS90cmFjZXBhdGgvPG1hbnZvbG51bS84LzwvY2l0ZXJlZmVudHJ5PjwvbGluaz4uCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkFVVEhPUjwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL2FycGluZy8gd2FzIHdyaXR0ZW4gYnkKKzx1bGluayB1cmw9Im1haWx0bzprdXpuZXRAbXMyLmluci5hYy5ydSI+QWxleGV5IEt1em5ldHNvdgorJmx0O2t1em5ldEBtczIuaW5yLmFjLnJ1Jmd0OzwvdWxpbms+LgorSXQgaXMgbm93IG1haW50YWluZWQgYnkKKzx1bGluayB1cmw9Im1haWx0bzp5b3NoZnVqaUBza2J1ZmYubmV0Ij5ZT1NISUZVSkkgSGlkZWFraQorJmx0O3lvc2hmdWppQHNrYnVmZi5uZXQmZ3Q7PC91bGluaz4uCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPlNFQ1VSSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvYXJwaW5nLyByZXF1aXJlcyA8Y29uc3RhbnQvQ0FQX05FVF9SQVcvIGNhcGFiaWxpdHkKK3RvIGJlIGV4ZWN1dGVkLiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBhcyBzZXQtdWlkIHJvb3QsCitiZWNhdXNlIGl0IGFsbG93cyB1c2VyIHRvIG1vZGlmeSBBUlAgY2FjaGVzIG9mIG5laWdoYm91ciBob3N0cy4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+QVZBSUxBQklMSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvYXJwaW5nLyBpcyBwYXJ0IG9mIDxmaWxlbmFtZS9pcHV0aWxzLyBwYWNrYWdlCithbmQgdGhlIGxhdGVzdCB2ZXJzaW9ucyBhcmUgIGF2YWlsYWJsZSBpbiBzb3VyY2UgZm9ybSBhdAorPHVsaW5rIHVybD0iaHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejIiPgoraHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejI8L3VsaW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzwhW0lHTk9SRVsKKzxyZWZzZWN0MT48dGl0bGU+Q09QWUlORzwvdGl0bGU+Cis8cGFyYT4KKzxsaXRlcmFsbGF5b3V0PgorVGhpcyBkb2N1bWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCitpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIFZlcnNpb24gMi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlCitkaXN0cmlidXRpb24gb2YgTGludXgga2VybmVsIG9mIHZlcnNpb24gMi40LgorPC9saXRlcmFsbGF5b3V0PgorPC9wYXJhPgorPC9yZWZzZWN0MT4KK11dPgorCisKKworPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2lwdXRpbHMvZG9jL2Nsb2NrZGlmZi5zZ21sIGIvaXB1dGlscy9kb2MvY2xvY2tkaWZmLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhYjU5MgotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvZG9jL2Nsb2NrZGlmZi5zZ21sCkBAIC0wLDAgKzEsMTYxIEBACis8cmVmZW50cnkgaWQ9ImNsb2NrZGlmZiI+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+Y2xvY2tkaWZmPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT44PC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8+aXB1dGlscy0mc25hcHNob3Q7PC9yZWZtaXNjaW5mbz4KKzwvcmVmbWV0YT4KKworPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5jbG9ja2RpZmY8L3JlZm5hbWU+Cis8cmVmcHVycG9zZT5tZWFzdXJlIGNsb2NrIGRpZmZlcmVuY2UgYmV0d2VlbiBob3N0czwvcmVmcHVycG9zZT4KKzwvcmVmbmFtZWRpdj4KKworPHJlZnN5bm9wc2lzZGl2PgorPGNtZHN5bm9wc2lzPgorPGNvbW1hbmQ+Y2xvY2tkaWZmPC9jb21tYW5kPgorPGFyZyBjaG9pY2U9Im9wdCI+PG9wdGlvbj4tbzwvb3B0aW9uPjwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+PG9wdGlvbj4tbzE8L29wdGlvbj48L2FyZz4KKzxhcmcgY2hvaWNlPSJyZXEiPjxyZXBsYWNlYWJsZS9kZXN0aW5hdGlvbi88L2FyZz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCis8cmVmc2VjdDE+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvY2xvY2tkaWZmLyBNZWFzdXJlcyBjbG9jayBkaWZmZXJlbmNlIGJldHdlZW4gdXMgYW5kCis8cmVwbGFjZWFibGUvZGVzdGluYXRpb24vIHdpdGggMSBtc2VjIHJlc29sdXRpb24gdXNpbmcgSUNNUCBUSU1FU1RBTVAKKzxsaW5rIGxpbmtlbmQ9ImNsb2NrZGlmZi5pY21wLXRpbWVzdGFtcCI+WzJdPC9saW5rPgorcGFja2V0cyBvciwgb3B0aW9uYWxseSwgSVAgVElNRVNUQU1QIG9wdGlvbgorPGxpbmsgbGlua2VuZD0iY2xvY2tkaWZmLmlwLXRpbWVzdGFtcCI+WzNdPC9saW5rPgorb3B0aW9uIGFkZGVkIHRvIElDTVAgRUNITy4KKzxsaW5rIGxpbmtlbmQ9ImNsb2NrZGlmZi5pY21wLWVjaG8iPlsxXTwvbGluaz4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+T1BUSU9OUzwvdGl0bGU+CisKKzx2YXJpYWJsZWxpc3Q+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1vLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorVXNlIElQIFRJTUVTVEFNUCB3aXRoIElDTVAgRUNITyBpbnN0ZWFkIG9mIElDTVAgVElNRVNUQU1QCittZXNzYWdlcy4gSXQgaXMgdXNlZnVsIHdpdGggc29tZSBkZXN0aW5hdGlvbnMsIHdoaWNoIGRvIG5vdCBzdXBwb3J0CitJQ01QIFRJTUVTVEFNUCAoZi5lLiBTb2xhcmlzICZsdDsyLjQpLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLW8xLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorU2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gb2YgPG9wdGlvbi8tby8sIG5hbWVseSBpdCB1c2VzIHRocmVlLXRlcm0KK0lQIFRJTUVTVEFNUCB3aXRoIHByZXNwZWNpZmllZCBob3AgYWRkcmVzc2VzIGluc3RlYWQgb2YgZm91ciB0ZXJtIG9uZS4KK1doYXQgZmxhdm9yIHdvcmtzIGJldHRlciBkZXBlbmRzIG9uIHRhcmdldCBob3N0LiBQYXJ0aWN1bGFybHksCis8b3B0aW9uLy1vLyBpcyBiZXR0ZXIgZm9yIExpbnV4LgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworPC92YXJpYWJsZWxpc3Q+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+V0FSTklOR1M8L3RpdGxlPgorPGl0ZW1pemVkbGlzdD4KKyA8bGlzdGl0ZW0+PHBhcmE+CitTb21lIG5vZGVzIChDaXNjbykgdXNlIG5vbi1zdGFuZGFyZCB0aW1lc3RhbXBzLCB3aGljaCBpcyBhbGxvd2VkCitieSBSRkMsIGJ1dCBtYWtlcyB0aW1lc3RhbXBzIG1vc3RseSB1c2VsZXNzLgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KK1NvbWUgbm9kZXMgZ2VuZXJhdGUgbWVzc2VkIHRpbWVzdGFtcHMgKFNvbGFyaXMmZ3Q7Mi40KSwgd2hlbgorcnVuIDxjb21tYW5kL3hudHBkLy4gU2VlbXMsIGl0cyBJUCBzdGFjayB1c2VzIGEgY29ycnVwdGVkIGNsb2NrIHNvdXJjZSwKK3doaWNoIGlzIHN5bmNocm9uaXplZCB0byB0aW1lLW9mLWRheSBjbG9jayBwZXJpb2RpY2FsbHkgYW5kIGp1bXBzCityYW5kb21seSBtYWtpbmcgdGltZXN0YW1wcyBtb3N0bHkgdXNlbGVzcy4gR29vZCBuZXdzIGlzIHRoYXQgeW91IGNhbgordXNlIE5UUCBpbiB0aGlzIGNhc2UsIHdoaWNoIGlzIGV2ZW4gYmV0dGVyLgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KKzxjb21tYW5kL2Nsb2NrZGlmZi8gc2hvd3MgZGlmZmVyZW5jZSBpbiB0aW1lIG1vZHVsbyAyNCBkYXlzLgorIDwvcGFyYT48L2xpc3RpdGVtPgorPC9pdGVtaXplZGxpc3Q+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+U0VFIEFMU088L3RpdGxlPgorPHBhcmE+Cis8bGluayBsaW5rZW5kPSJwaW5nIj4KKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvcGluZy88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+PC9saW5rPiwKKzxsaW5rIGxpbmtlbmQ9ImFycGluZyI+Cis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL2FycGluZy88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+PC9saW5rPiwKKzxsaW5rIGxpbmtlbmQ9InRyYWNlcGF0aCI+Cis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL3RyYWNlcGF0aC88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+PC9saW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+UkVGRVJFTkNFUzwvdGl0bGU+Cis8cGFyYT4KK1sxXSA8YW5jaG9yIGlkPSJjbG9ja2RpZmYuaWNtcC1lY2hvIj5JQ01QIEVDSE8sCis8dWxpbmsgdXJsPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvcmZjL3JmYzc5Mi50eHQiPgorUkZDMDc5MiwgcGFnZSAxNDwvdWxpbms+LgorPC9wYXJhPgorPHBhcmE+CitbMl0gPGFuY2hvciBpZD0iY2xvY2tkaWZmLmljbXAtdGltZXN0YW1wIj5JQ01QIFRJTUVTVEFNUCwKKzx1bGluayB1cmw9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9yZmMvcmZjNzkyLnR4dCI+CitSRkMwNzkyLCBwYWdlIDE2PC91bGluaz4uCis8L3BhcmE+Cis8cGFyYT4KK1szXSA8YW5jaG9yIGlkPSJjbG9ja2RpZmYuaXAtdGltZXN0YW1wIj5JUCBUSU1FU1RBTVAgb3B0aW9uLAorPHVsaW5rIHVybD0iaHR0cDovL3Rvb2xzLmlldGYub3JnL3JmYy9yZmM3OTEudHh0Ij4KK1JGQzA3OTEsIDMuMSwgcGFnZSAxNjwvdWxpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5BVVRIT1I8L3RpdGxlPgorPHBhcmE+Cis8Y29tbWFuZC9jbG9ja2RpZmYvIHdhcyBjb21waWxlZCBieQorPHVsaW5rIHVybD0ibWFpbHRvOmt1em5ldEBtczIuaW5yLmFjLnJ1Ij5BbGV4ZXkgS3V6bmV0c292CismbHQ7a3V6bmV0QG1zMi5pbnIuYWMucnUmZ3Q7PC91bGluaz4uIEl0IHdhcyBiYXNlZCBvbiBjb2RlIGJvcnJvd2VkCitmcm9tIEJTRCA8Y29tbWFuZC90aW1lZC8gZGFlbW9uLgorSXQgaXMgbm93IG1haW50YWluZWQgYnkKKzx1bGluayB1cmw9Im1haWx0bzp5b3NoZnVqaUBza2J1ZmYubmV0Ij5ZT1NISUZVSkkgSGlkZWFraQorJmx0O3lvc2hmdWppQHNrYnVmZi5uZXQmZ3Q7PC91bGluaz4uCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPlNFQ1VSSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvY2xvY2tkaWZmLyByZXF1aXJlcyA8Y29uc3RhbnQvQ0FQX05FVF9SQVcvIGNhcGFiaWxpdHkKK3RvIGJlIGV4ZWN1dGVkLiBJdCBpcyBzYWZlIHRvIGJlIHVzZWQgYXMgc2V0LXVpZCByb290LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5BVkFJTEFCSUxJVFk8L3RpdGxlPgorPHBhcmE+Cis8Y29tbWFuZC9jbG9ja2RpZmYvIGlzIHBhcnQgb2YgPGZpbGVuYW1lL2lwdXRpbHMvIHBhY2thZ2UKK2FuZCB0aGUgbGF0ZXN0IHZlcnNpb25zIGFyZSAgYXZhaWxhYmxlIGluIHNvdXJjZSBmb3JtIGF0Cis8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MiI+CitodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MjwvdWxpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPCFbSUdOT1JFWworPHJlZnNlY3QxPjx0aXRsZT5DT1BZSU5HPC90aXRsZT4KKzxwYXJhPgorPGxpdGVyYWxsYXlvdXQ+CitUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK2l0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgVmVyc2lvbiAyLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCit3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCitTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCitGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbiBvZiBMaW51eCBrZXJuZWwgb2YgdmVyc2lvbiAyLjQuCis8L2xpdGVyYWxsYXlvdXQ+Cis8L3BhcmE+Cis8L3JlZnNlY3QxPgorXV0+CisKKworCis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvZG9jYm9vazJtYW4tc3BlYy5wbCBiL2lwdXRpbHMvZG9jL2RvY2Jvb2sybWFuLXNwZWMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzZDhhMAotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvZG9jL2RvY2Jvb2sybWFuLXNwZWMucGwKQEAgLTAsMCArMSwxMTY0IEBACis9aGVhZDEgTkFNRQorCitkb2Nib29rMm1hbi1zcGVjIC0gY29udmVydCBEb2NCb29rIFJlZkVudHJpZXMgdG8gVW5peCBtYW5wYWdlcworCis9aGVhZDEgU1lOT1BTSVMKKworVGhlIFNHTUxTcG0gcGFja2FnZSBmcm9tIENQQU4uICBUaGlzIGNvbnRhaW5zIHRoZSBzZ21sc3BsIHNjcmlwdCB3aGljaAoraXMgdXNlZCB0byBncm9rIHRoaXMgZmlsZS4gIFVzZSBpdCBsaWtlIHRoaXM6CisKK25zZ21scyBzb21lLWRvY2Jvb2stZG9jdW1lbnQuc2dtbCB8IHNnbWxzcGwgZG9jYm9vazJtYW4tc3BlYy5wbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBpcyBhIHNnbWxzcGwgc3BlYyBmaWxlIHRoYXQgcHJvZHVjZXMgVW5peC1zdHlsZQorbWFucGFnZXMgZnJvbSBSZWZFbnRyeSBtYXJrdXAuCisKK1NlZSB0aGUgYWNjb21wYW55aW5nIFJlZkVudHJ5IG1hbiBwYWdlIGZvciAncGxhaW4gbmV3JyBkb2N1bWVudGF0aW9uLiA6KQorCis9aGVhZDEgTElNSVRBVElPTlMKKworVHJ5aW5nIGRvY2Jvb2sybWFuIG9uIG5vbi1Eb2NCb29rIG9yIG5vbi1jb25mb3JtYW50IFNHTUwgcmVzdWx0cyBpbgordW5kZWZpbmVkIGJlaGF2aW9yLiA6LSkKKworVGhpcyBwcm9ncmFtIGlzIGEgc2xvdywgZG9kZ3kgUGVybCBzY3JpcHQuCisKK1RoaXMgcHJvZ3JhbSBkb2VzIG5vdCBjb21lIGNsb3NlIHRvIHN1cHBvcnRpbmcgYWxsIHRoZSBwb3NzaWJsZSBtYXJrdXAKK2luIERvY0Jvb2ssIGFuZCB3aWxsIHByb2R1Y2Ugd3Jvbmcgb3V0cHV0IGluIHNvbWUgY2FzZXMgd2l0aCBzdXBwb3J0ZWQKK21hcmt1cC4KKworPWhlYWQxIFRPRE8KKworQWRkIG5ldyBlbGVtZW50IGhhbmRsaW5nIGFuZCBmaXggZXhpc3RpbmcgaGFuZGxpbmcuICBCZSByb2J1c3QuCitQcm9kdWNlIGNsZWFuZXN0LCByZWFkYWJsZSBtYW4gb3V0cHV0IGFzIHBvc3NpYmxlICh1bmxpa2Ugc29tZQorb3RoZXIgY29udmVydGVycykuICBGb2xsb3cgTGludXggbWFuKDcpIGNvbnZlbnRpb24uCitJZiB0aGlzIHJlc3VsdHMgaW4gYWRkZWQgbG9naWMgaW4gdGhpcyBzY3JpcHQsCit0aGF0J3Mgb2theS4gIFRoZSBjb2RlIHNob3VsZCBzdGlsbCBiZSByZWFzb25hYmx5IG9yZ2FuaXplZC4KKworTWFrZSBpdCBmYXN0ZXIuICBJZiBQZXJsIHN1Y2tzIHBvcnQgaXQgdG8gYW5vdGhlciBsYW5ndWFnZS4KKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSBTdGV2ZSBDaGVuZyA8c3RldmVAZ2dpLXByb2plY3Qub3JnPgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBwbGVhc2Ugd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCis9Y3V0CisKKyMgJElkOiBkb2Nib29rMm1hbi1zcGVjLnBsLHYgMS4xIDIwMDAvMDcvMjEgMjA6MjI6MzAgcm9zYWxpYSBFeHAgJAorCit1c2UgU0dNTFM7CQkJIyBVc2UgdGhlIFNHTUxTIHBhY2thZ2UuCit1c2UgU0dNTFM6Ok91dHB1dDsJCSMgVXNlIHN0YWNrLWJhc2VkIG91dHB1dC4KK3VzZSBTR01MUzo6UmVmczsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNHTUxTUEwgc2NyaXB0IHByb2R1Y2VkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNjcmlwdCBzZ21sc3BsLnBsCisjCisjIERvY3VtZW50IFR5cGU6IGFueSwgYnV0IHByb2Nlc3NlcyBvbmx5IFJlZkVudHJpZXMKKyMgRWRpdGVkIGJ5OiBtZSA6KQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyR3cml0ZV9tYW5wYWdlcyA9IDA7CiskYmxhbmtfeHJlZnMgPSAwOworCitzZ21sKCdzdGFydCcsIHN1YiB7IAorCXB1c2hfb3V0cHV0KCdudWwnKTsKKwkkcmF3X2NkYXRhID0gMTsJCQkjIE1ha2VzIGl0IGEgYml0IGZhc3Rlci4KKwkKKwkjIExpbmtzIGZpbGUKKwlvcGVuKExJTktTRklMRSwgIj5tYW5wYWdlLmxpbmtzIik7CisKKwkkUmVmcyA9IG5ldyBTR01MUzo6UmVmcygibWFucGFnZS5yZWZzIik7Cit9KTsKK3NnbWwoJ2VuZCcsIHN1YiB7CisJY2xvc2UoTElOS1NGSUxFKTsKKwlpZigkYmxhbmtfeHJlZnMpIHsKKwkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiBvdXRwdXQgY29udGFpbnMgdW5yZXNvbHZlZCBYUmVmc1xuIjsKKwl9Cit9KTsKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE91dHB1dCBoZWxwZXJzIAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgT3VyIG93biB2ZXJzaW9uIG9mIHNnbWwoKSBhbmQgb3V0cHV0KCkgdG8gYWxsb3cgc2ltcGxlIHN0cmluZyBvdXRwdXQKKyMgdG8gcGxheSB3ZWxsIHdpdGggcm9mZidzIHN0dXBpZCB3aGl0ZXNwYWNlIHJ1bGVzLiAKKworc3ViIG1hbl9zZ21sCit7CisJaWYocmVmKCRfWzFdKSBlcSAnQ09ERScpIHsKKwkJcmV0dXJuICZzZ21sOworCX0KKwkKKwlteSAkcyA9ICRfWzFdOworCisJJHMgPX4gcy9cXC9cXFxcL2c7CisJJHMgPX4gcy8nL1xcJy9nOworCisJIyBcbiBhdCB0aGUgYmVnaW5uaW5nIG1lYW5zIHN0YXJ0IGF0IGJlZ2lubmluZyBvZiBsaW5lCisJaWYoJHMgPX4gcy9eXG4vLykgeworCQkkc3ViID0gJ3N1YiB7IG91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7ICc7CisJCWlmKCRzIGVxICcnKSB7IAorCQkJc2dtbCgkX1swXSwgZXZhbCgnc3ViIHsgb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsgfScpKTsKKwkJfSBlbHNpZigkcyA9fiAvXG4kLykgeworCQkJc2dtbCgkX1swXSwgZXZhbCgic3ViIHsgb3V0cHV0IFwiXFxuXCIgdW5sZXNzIFwkbmV3bGluZV9sYXN0Kys7IG91dHB1dCAnJHMnOyB9IikpOworCQl9IGVsc2UgeworCQkJc2dtbCgkX1swXSwgZXZhbCgic3ViIHsgb3V0cHV0IFwiXFxuXCIgdW5sZXNzIFwkbmV3bGluZV9sYXN0OyBvdXRwdXQgJyRzJzsgXCRuZXdsaW5lX2xhc3QgPSAwOyB9IikpOworCQl9CisJfSBlbHNlIHsKKwkJaWYoJHMgPX4gL1xuJC8pIHsKKwkJCXNnbWwoJF9bMF0sIGV2YWwoInN1YiB7IG91dHB1dCAnJHMnOyBcJG5ld2xpbmVfbGFzdCA9IDE7IH0iKSk7CisJCX0gZWxzZSB7CisJCQlzZ21sKCRfWzBdLCBldmFsKCJzdWIgeyBvdXRwdXQgJyRzJzsgXCRuZXdsaW5lX2xhc3QgPSAwOyB9IikpOworCQl9CisJfQorfQorCitzdWIgbWFuX291dHB1dAoreworCSRfID0gc2hpZnQ7CisJaWYocy9eXG4vLykgeworCQlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworCX0KKwlyZXR1cm4gaWYgJF8gZXEgJyc7CisJCisJb3V0cHV0ICRfOworCisJaWYoQF8pIHsKKwkJb3V0cHV0IEBfOworCQkkbmV3bGluZV9sYXN0ID0gKHBvcChAXykgPX4gL1xuJC8pOworCX0gZWxzZSB7CisJCSRuZXdsaW5lX2xhc3QgPSAoJF8gPX4gL1xuJC8pCisJfQorfQorCisjIEZvbGQgbGluZXMgaW50byBvbmUsIHF1b3RlIHNvbWUgY2hhcmFjdGVycworc3ViIGZvbGRfc3RyaW5nCit7CisJJF8gPSBzaGlmdDsKKwkKKwlzL1xcL1xcXFwvZzsKKwlzLyIvXFxcJiIvZzsKKworCSMgQ2hhbmdlIHRhYnMgdG8gc3BhY2VzCisJdHIvXHRcbi8gIC87CisKKwkjIFRyaW0gd2hpdGVzcGFjZSBmcm9tIGJlZ2lubmluZyBhbmQgZW5kLgorCXMvXiArLy87CisJcy8gKyQvLzsKKworCXJldHVybiAkXzsKK30KKwkKK3N1YiBzYXZlX2NkYXRhKCkKK3sKKwkkcmF3X2NkYXRhKys7CisJcHVzaF9vdXRwdXQoJ3N0cmluZycpOworfQorCitzdWIgYm9sZF9vbigpCit7CisJIyBJZiB0aGUgbGFzdCBmb250IGlzIGFsc28gYm9sZCwgZG9uJ3QgY2hhbmdlIGFueXRoaW5nLgorCSMgQmFzaWNhbGx5IHRoaXMgaXMgdG8ganVzdCBnZXQgbW9yZSByZWFkYWJsZSBtYW4gb3V0cHV0LgorCWlmKCRmb250c3RhY2tbJCNmb250c3RhY2tdIG5lICdib2xkJykgeworCQlpZighJHJhd19jZGF0YSkgeworCQkJb3V0cHV0ICdcZkInOworCQkJJG5ld2xpbmVfbGFzdCA9IDA7CisJCX0KKwl9CisJcHVzaChAZm9udHN0YWNrLCAnYm9sZCcpOworfQorCitzdWIgaXRhbGljX29uKCkKK3sKKwkjIElmIHRoZSBsYXN0IGZvbnQgaXMgYWxzbyBpdGFsaWMsIGRvbid0IGNoYW5nZSBhbnl0aGluZy4KKwlpZigkZm9udHN0YWNrWyQjZm9udHN0YWNrXSBuZSAnaXRhbGljJykgeworCQlpZighJHJhd19jZGF0YSkgeworCQkJb3V0cHV0ICdcZkknOworCQkJJG5ld2xpbmVfbGFzdCA9IDA7CisJCX0KKwl9CisJcHVzaChAZm9udHN0YWNrLCAnaXRhbGljJyk7Cit9CisKK3N1YiBmb250X29mZigpCit7CisJbXkgJHRoaXNmb250ID0gcG9wKEBmb250c3RhY2spOworCW15ICRsYXN0Zm9udCA9ICRmb250c3RhY2tbJCNmb250c3RhY2tdOworCQorCSMgT25seSBvdXRwdXQgZm9udCBjaGFuZ2UgaWYgaXQgaXMgZGlmZmVyZW50CisJaWYoJHRoaXNmb250IG5lICRsYXN0Zm9udCkgeworCQlpZigkcmF3X2NkYXRhKQkJCXsgcmV0dXJuOyB9CisJCWVsc2lmKCRsYXN0Zm9udCBlcSAnYm9sZCcpIAl7IG91dHB1dCAnXGZCJzsgfQorCQllbHNpZigkbGFzdGZvbnQgZXEgJ2l0YWxpYycpCXsgb3V0cHV0ICdcZkknOyB9CisJCWVsc2UJCQkJeyBvdXRwdXQgJ1xmUic7IH0KKwkKKwkJJG5ld2xpbmVfbGFzdCA9IDA7CisJfQorfQorCisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1hbnBhZ2UgbWFuYWdlbWVudAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3NnbWwoJzxSRUZFTlRSWT4nLCBzdWIgeyAKKwkjIFRoaXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBhdCBlbmQgb2YgUkVGTUVUQSwgd2hlbiB3ZSBrbm93IHRoZSBuYW1lIG9mIHRoZSBwYWdlLgorCXBvcF9vdXRwdXQoKTsKKwkKKwkkd3JpdGVfbWFucGFnZXMgPSAxOwkJIyBDdXJyZW50bHkgd3JpdGluZyBtYW5wYWdlLgorCQorCSRub2NvbGxhcHNlX3doaXRlc3BhY2UgPSAwOwkjIEN1cnJlbnQgd2hpdGVzcGFjZSBjb2xsYXBzZSBjb3VudGVyLgorCSRuZXdsaW5lX2xhc3QgPSAxOwkJIyBBdCBiZWdpbm5pbmcgb2YgbGluZT8KKwkJIyBKdXN0IGEgYml0IG9mIHdhcm5pbmcsIHlvdSB3aWxsIHNlZSB0aGlzIHZhcmlhYmxlIG1hbmlwdWxhdGVkCisJCSMgbWFudWFsbHkgYSBsb3QuICBJdCBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gZm9sbG93IGJ1dCBpdAorCQkjIHNhdmVzIHlvdSBmcm9tIGhhdmluZyB0byB3b3JyeSBhYm91dCBjb2xsYXBzaW5nIGF0IHRoZSBlbmQgb2YKKwkJIyBwYXJzZSwgc3RvcHBpbmcgYXQgdmVyYmF0aW1zLCBldGMuCisJJHJhd19jZGF0YSA9IDA7ICAgICAgICAgICAgICAgICAjIEluc3RydWN0cyBjZXJ0YWluIG91dHB1dCBmdW5jdGlvbnMgdG8KKwkJCQkJIyBsZWF2ZSBDREFUQSBhbG9uZSwgc28gd2UgY2FuIGFzc2lnbgorCQkJCQkjIGl0IHRvIGEgc3RyaW5nIGFuZCBwcm9jZXNzIGl0LCBldGMuCisJQGZvbnRzdGFjayA9ICgpOwkJIyBGb250cyBiZWluZyBhY3RpdmF0ZWQuCisJCisJJG1hbnBhZ2VfdGl0bGUgPSAnJzsJCSMgTmVlZGVkIGZvciBpbmRleGluZy4KKwkkbWFucGFnZV9zZWN0ID0gJyc7CisJQG1hbnBhZ2VfbmFtZXMgPSAoKTsKKwkKKwkkbWFucGFnZV9taXNjID0gJyc7CisJCisJJGxpc3RfbmVzdGxldmVsID0gMDsJCSMgSW5kZW50IGNlcnRhaW4gbmVzdGVkIGNvbnRlbnQuCit9KTsKK3NnbWwoJzwvUkVGRU5UUlk+Jywgc3ViIHsKKwlpZighJG5ld2xpbmVfbGFzdCkgeworCQlvdXRwdXQgIlxuIjsKKwl9CisJCisJJHdyaXRlX21hbnBhZ2VzID0gMDsKKwkkcmF3X2NkYXRhID0gMTsKKwlwdXNoX291dHB1dCgnbnVsJyk7Cit9KTsKKworc2dtbCgnPC9SRUZNRVRBPicsIHN1YiB7CisJcHVzaF9vdXRwdXQoJ2ZpbGUnLCAiJG1hbnBhZ2VfdGl0bGUuJG1hbnBhZ2Vfc2VjdCIpOworCisJb3V0cHV0IDw8X0VORF9CQU5ORVI7CisuXFwiIFRoaXMgbWFucGFnZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBkb2Nib29rMm1hbiAKKy5cXCIgZnJvbSBhIERvY0Jvb2sgZG9jdW1lbnQuICBUaGlzIHRvb2wgY2FuIGJlIGZvdW5kIGF0OgorLlxcIiA8aHR0cDovL3NoZWxsLmlwb2xpbmUuY29tL35lbG1lcnQvY29tcC9kb2Nib29rMlgvPiAKKy5cXCIgUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzLCBpbXByb3ZlbWVudHMsIGNvbW1lbnRzLCBwYXRjaGVzLCAKKy5cXCIgZXRjLiB0byBTdGV2ZSBDaGVuZyA8c3RldmVcQGdnaS1wcm9qZWN0Lm9yZz4uCitfRU5EX0JBTk5FUgorCisJbXkgJG1hbnBhZ2VfZGF0ZSA9IGBkYXRlICIrJWQgJUIgJVkiYDsKKwkJCisJb3V0cHV0ICcuVEggIic7CisJCisJIyBJZiB0aGUgdGl0bGUgaXMgbm90IG1peGVkLWNhc2UsIGNvbnZlbnRpb24gc2F5cyB0bworCSMgdXBwZXJjYXNlIHRoZSB3aG9sZSB0aXRsZS4gIChUaGUgY2Fub25pY2FsIHRpdGxlIGlzCisJIyBsb3dlcmNhc2UuKQorCWlmKCRtYW5wYWdlX3RpdGxlID1+IC9bQS1aXS8pIHsKKwkJb3V0cHV0IGZvbGRfc3RyaW5nKCRtYW5wYWdlX3RpdGxlKTsKKwl9IGVsc2UgeworCQlvdXRwdXQgdWMoZm9sZF9zdHJpbmcoJG1hbnBhZ2VfdGl0bGUpKTsKKwl9CisJCisJb3V0cHV0ICAnIiAiJywgZm9sZF9zdHJpbmcoJG1hbnBhZ2Vfc2VjdCksIAorCQknIiAiJywgZm9sZF9zdHJpbmcoYGRhdGUgIislZCAlQiAlWSJgKSwgCisJCSciICInLCAkbWFucGFnZV9taXNjLCAKKwkJJyIgIicsICRtYW5wYWdlX21hbnVhbCwgCisJCSJcIlxuIjsKKworCSRuZXdsaW5lX2xhc3QgPSAxOworCisJIyBSZWZlcmVuY2VzIHRvIHRoaXMgUmVmRW50cnkuCisJbXkgJGlkID0gJF9bMF0tPnBhcmVudC0+YXR0cmlidXRlKCdJRCcpLT52YWx1ZTsKKwlpZigkaWQgbmUgJycpIHsKKwkJIyBUaGUgJ3BhY2thZ2UgbmFtZScgcGFydCBvZiB0aGUgc2VjdGlvbiBzaG91bGQKKwkJIyBub3QgYmUgdXNlZCB3aGVuIGNpdGluZyBpdC4KKwkJbXkgKCRzZWN0bnVtKSA9ICgkbWFucGFnZV9zZWN0ID1+IC8oWzAtOV0qKS8pOworCQkKKwkJaWYoJF9bMF0tPnBhcmVudC0+YXR0cmlidXRlKCdYUkVGTEFCRUwnKS0+dmFsdWUgZXEgJycpIHsKKwkJCSRSZWZzLT5wdXQoInJlZmVudHJ5OiRpZCIsICIkbWFucGFnZV90aXRsZSgkc2VjdG51bSkiKTsKKwkJfSBlbHNlIHsKKwkJCSRSZWZzLT5wdXQoInJlZmVudHJ5OiRpZCIsCisJCQkJJF9bMF0tPnBhcmVudC0+YXR0cmlidXRlKCdYUkVGTEFCRUwnKS0+dmFsdWUgLiAKKwkJCQkiKCRzZWN0bnVtKSIpOworCQl9CisJfQorfSk7CisKK3NnbWwoJzxSRUZFTlRSWVRJVExFPicsIHN1YiB7IAorCWlmKCRfWzBdLT5pbignUkVGTUVUQScpKSB7IAorCQlzYXZlX2NkYXRhKCk7CisJfSBlbHNlIHsgCisJCSMgTWFucGFnZSBjaXRhdGlvbnMgYXJlIGluIGJvbGQuCisJCWJvbGRfb24oKTsKKwl9Cit9KTsKK3NnbWwoJzwvUkVGRU5UUllUSVRMRT4nLCBzdWIgeyAKKwlpZigkX1swXS0+aW4oJ1JFRk1FVEEnKSkgeworCQkkcmF3X2NkYXRhLS07CisJCSRtYW5wYWdlX3RpdGxlID0gcG9wX291dHB1dCgpOworCX0KKwllbHNlIHsgZm9udF9vZmYoKTsgfQorfSk7CisKK3NnbWwoJzxNQU5WT0xOVU0+Jywgc3ViIHsgCisJaWYoJF9bMF0tPmluKCdSRUZNRVRBJykpIHsgCisJCXNhdmVfY2RhdGEoKTsJCisJfSBlbHNlIHsKKwkJIyBNYW5wYWdlIGNpdGF0aW9ucyB1c2UgKCkuCisJCW91dHB1dCAnKCc7CisJfQorfSk7CitzZ21sKCc8L01BTlZPTE5VTT4nLCBzdWIgeyAKKwlpZigkX1swXS0+aW4oJ1JFRk1FVEEnKSkgeworCQkkcmF3X2NkYXRhLS07CisJCSRtYW5wYWdlX3NlY3QgPSBwb3Bfb3V0cHV0KCk7CisJfQorCWVsc2UgeyBvdXRwdXQgJyknIH0KK30pOworCitzZ21sKCc8UkVGTUlTQ0lORk8+JywgXCZzYXZlX2NkYXRhKTsKK3NnbWwoJzwvUkVGTUlTQ0lORk8+Jywgc3ViIHsgCisJJHJhd19jZGF0YS0tOworCSRtYW5wYWdlX21pc2MgPSBmb2xkX3N0cmluZyhwb3Bfb3V0cHV0KCkpOworfSk7CisKKworIyBOQU1FIHNlY3Rpb24KK21hbl9zZ21sKCc8UkVGTkFNRURJVj4nLCAiXG4uU0ggTkFNRVxuIik7CisKK3NnbWwoJzxSRUZOQU1FPicsIFwmc2F2ZV9jZGF0YSk7CitzZ21sKCc8L1JFRk5BTUU+Jywgc3ViIHsgCisJJHJhd19jZGF0YS0tOworCXB1c2goQG1hbnBhZ2VfbmFtZXMsIHBvcF9vdXRwdXQoKSk7Cit9KTsKKworc2dtbCgnPFJFRlBVUlBPU0U+JywgXCZzYXZlX2NkYXRhKTsKK3NnbWwoJzwvUkVGUFVSUE9TRT4nLCBzdWIgeyAKKwkkcmF3X2NkYXRhLS07CisJbXkgJG1hbnBhZ2VfcHVycG9zZSA9IGZvbGRfc3RyaW5nKHBvcF9vdXRwdXQoKSk7CisJCisJZm9yKG15ICRpID0gMDsgJGkgPCAkI21hbnBhZ2VfbmFtZXM7ICRpKyspIHsKKwkJb3V0cHV0IGZvbGRfc3RyaW5nKCRtYW5wYWdlX25hbWVzWyRpXSksICcsICc7CisJfQorCisJb3V0cHV0IGZvbGRfc3RyaW5nKCRtYW5wYWdlX25hbWVzWyQjbWFucGFnZV9uYW1lc10pOworCW91dHB1dCAiIFxcLSAkbWFucGFnZV9wdXJwb3NlXG4iOworCisJJG5ld2xpbmVfbGFzdCA9IDE7CisKKwlmb3JlYWNoKEBtYW5wYWdlX25hbWVzKSB7CisJCSMgRG9uJ3QgbGluayB0byBpdHNlbGYKKwkJaWYoJF8gbmUgJG1hbnBhZ2VfdGl0bGUpIHsKKwkJCXByaW50IExJTktTRklMRSAiJG1hbnBhZ2VfdGl0bGUuJG1hbnBhZ2Vfc2VjdAkkXy4kbWFucGFnZV9zZWN0XG4iOworCQl9CisJfQorfSk7CisJCittYW5fc2dtbCgnPFJFRkNMQVNTPicsICJcbi5zcFxuIik7CisKKyNSZWZEZXNjcmlwdG9yCisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNZTk9QU0lTIHNlY3Rpb24gYW5kIHN5bm9wc2VzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbWFuX3NnbWwoJzxSRUZTWU5PUFNJU0RJVj4nLCAiXG4uU0ggU1lOT1BTSVNcbiIpOworbWFuX3NnbWwoJzwvUkVGU1lOT1BTSVNESVY+JywgIlxuIik7CisKKyMjIEZJWE1FISBNdXN0IGJlIG1hZGUgaW50byBibG9jayBlbGVtZW50cyEhCisjc2dtbCgnPEZVTkNTWU5PUFNJUz4nLCBcJmJvbGRfb24pOworI3NnbWwoJzwvRlVOQ1NZTk9QU0lTPicsIFwmZm9udF9vZmYpOworI3NnbWwoJzxDTURTWU5PUFNJUz4nLCBcJmJvbGRfb24pOworI3NnbWwoJzwvQ01EU1lOT1BTSVM+JywgXCZmb250X29mZik7CisKK21hbl9zZ21sKCc8RlVOQ1NZTk9QU0lTPicsIHN1YiB7CisJbWFuX291dHB1dCgiXG4uc3BcbiIpOworCWJvbGRfb24oKTsKK30pOworbWFuX3NnbWwoJzwvRlVOQ1NZTk9QU0lTPicsIHN1YiB7CisJZm9udF9vZmYoKTsKKwltYW5fb3V0cHV0KCJcbiIpOworfSk7CisKK21hbl9zZ21sKCc8Q01EU1lOT1BTSVM+JywgIlxuXG4iKTsKK21hbl9zZ21sKCc8L0NNRFNZTk9QU0lTPicsICJcblxuIik7CisKK21hbl9zZ21sKCc8RlVOQ1BST1RPVFlQRT4nLCAiXG4uc3BcbiIpOworCisjIEFyZ3VtZW50cyB0byBmdW5jdGlvbnMuICBUaGlzIGlzIEMgY29udmVudGlvbi4KK21hbl9zZ21sKCc8UEFSQU1ERUY+JywgJygnKTsKK21hbl9zZ21sKCc8L1BBUkFNREVGPicsICIpO1xuIik7CittYW5fc2dtbCgnPFZPSUQ+JywgIih2b2lkKTtcbiIpOworCisKKworc3ViIGFyZ19zdGFydAoreworCSMgbXkgJGNob2ljZSA9ICRfWzBdLT5hdHRyaWJ1dGUoJ0NIT0lDRScpLT52YWx1ZTsKKworCSMgVGhlIGNvbnRlbnQgbW9kZWwgZm9yIENtZFN5bm9wc2lzIGRvZXNuJ3QgaW5jbHVkZSAjUENEQVRBLAorCSMgc28gd2Ugd29uJ3Qgc2VlIGFueSBvZiB0aGUgd2hpdGVzcGFjZSBpbiB0aGUgc291cmNlIGZpbGUsCisJIyBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBhZnRlciBlYWNoIGNvbXBvbmVudC4KKwlvdXRwdXQgJyAnOworCisJaWYoJF9bMF0tPmF0dHJpYnV0ZSgnQ0hPSUNFJyktPnZhbHVlID1+IC9vcHQvaSkgeworCQlvdXRwdXQgJ1snOworCX0KKwlib2xkX29uKCk7Cit9CitzdWIgYXJnX2VuZAoreworCWZvbnRfb2ZmKCk7CisJaWYoJF9bMF0tPmF0dHJpYnV0ZSgnUkVQJyktPnZhbHVlID1+IC9eUmVwZWF0L2kpIHsKKwkJaXRhbGljX29uKCk7CisJCW91dHB1dCAnIC4uLic7CisJCWZvbnRfb2ZmKCk7CisJfQorCWlmKCRfWzBdLT5hdHRyaWJ1dGUoJ0NIT0lDRScpLT52YWx1ZSA9fiAvb3B0L2kpIHsKKwkJb3V0cHV0ICddJzsKKwl9Cit9CisKK3NnbWwoJzxBUkc+JywgXCZhcmdfc3RhcnQpOworc2dtbCgnPC9BUkc+JywgXCZhcmdfZW5kKTsKK3NnbWwoJzxHUk9VUD4nLCBcJmFyZ19zdGFydCk7CitzZ21sKCc8L0dST1VQPicsIFwmYXJnX2VuZCk7CisKK3NnbWwoJzxPUFRJT04+JywgXCZib2xkX29uKTsKK3NnbWwoJzwvT1BUSU9OPicsIFwmZm9udF9vZmYpOworCisjIEZJWE1FOiBUaGlzIGlzIG9uZSBfYmxhbmtfIGxpbmUuCittYW5fc2dtbCgnPFNCUj4nLCAiXG5cbiIpOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBHZW5lcmFsIHNlY3Rpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyBoYW5kbGVkIGJ5IFRJVExFLiAgVGhpcyBqdXN0IHNldHMKKyMgdXAgdGhlIHJvZmYgbWFya3VwLgorbWFuX3NnbWwoJzxSRUZTRUNUMT4nLCAiXG4uU0ggIik7CittYW5fc2dtbCgnPFJFRlNFQ1QyPicsICJcbi5TUyAiKTsKK21hbl9zZ21sKCc8UkVGU0VDVDM+JywgIlxuLlNTICIpOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaXRsZXMsIG1ldGFkYXRhLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3NnbWwoJzxUSVRMRT4nLCBzdWIgeworCWlmKCRfWzBdLT5pbignUkVGRVJFTkNFJykgb3IgJF9bMF0tPmluKCdCT09LJykpIHsKKwkJJHdyaXRlX21hbnBhZ2VzID0gMTsKKwl9CisJc2F2ZV9jZGF0YSgpOworfSk7CitzZ21sKCc8L1RJVExFPicsIHN1YiB7IAorCW15ICR0aXRsZSA9IGZvbGRfc3RyaW5nKHBvcF9vdXRwdXQoKSk7CisJJHJhd19jZGF0YS0tOworCQorCWlmKCRfWzBdLT5pbignUkVGRVJFTkNFJykgb3IgJF9bMF0tPmluKCdCT09LJykpIHsKKwkJIyBXZSB1c2UgVElUTEUgb2YgZW5jbG9zaW5nIFJlZmVyZW5jZSBvciBCb29rIGFzIG1hbnVhbCBuYW1lCisJCSRtYW5wYWdlX21hbnVhbCA9ICR0aXRsZTsKKwkJJHdyaXRlX21hbnBhZ2VzID0gMDsKKwl9CisJZWxzaWYoZXhpc3RzICRfWzBdLT5wYXJlbnQtPmV4dC0+eyd0aXRsZSd9KSB7CisJCSMgQnkgZmFyIHRoZSBlYXNpZXN0IGNhc2UuICBKdXN0IGZvbGQgdGhlIHN0cmluZyBhcworCQkjIGFib3ZlLCBhbmQgdGhlbiBzZXQgdGhlIHBhcmVudCBlbGVtZW50J3MgdmFyaWFibGUuCisJCSRfWzBdLT5wYXJlbnQtPmV4dC0+eyd0aXRsZSd9ID0gJHRpdGxlOworCX0KKwllbHNlIHsKKwkJIyBJZiB0aGUgcGFyZW50IGVsZW1lbnQncyBoYW5kbGVycyBhcmUgbGF6eSwgCisJCSMgb3V0cHV0IHRoZSBmb2xkZWQgc3RyaW5nIGZvciB0aGVtIDopCisJCSMgV2UgYXNzdW1lIHRoZXkgd2FudCB1cHBlcmNhc2UgYW5kIGEgbmV3bGluZS4KKwkJb3V0cHV0ICciJywgdWMoJHRpdGxlKSwgIlwiXG4iOworCQkkbmV3bGluZV9sYXN0ID0gMTsKKwl9Cit9KTsKKworc2dtbCgnPEFUVFJJQlVUSU9OPicsIHN1YiB7IHB1c2hfb3V0cHV0KCdzdHJpbmcnKSB9KTsKK3NnbWwoJzwvQVRUUklCVVRJT04+Jywgc3ViIHsgJF9bMF0tPnBhcmVudC0+ZXh0LT57J2F0dHJpYnV0aW9uJ30gPSBwb3Bfb3V0cHV0KCk7IH0pOworCisKKyMgSUdOT1JFLgorc2dtbCgnPERPQ0lORk8+Jywgc3ViIHsgcHVzaF9vdXRwdXQoJ251bCcpOyB9KTsKK3NnbWwoJzwvRE9DSU5GTz4nLCBzdWIgeyBwb3Bfb3V0cHV0KCk7IH0pOworc2dtbCgnPFJFRlNFQ1QxSU5GTz4nLCBzdWIgeyBwdXNoX291dHB1dCgnbnVsJyk7IH0pOworc2dtbCgnPC9SRUZTRUNUMUlORk8+Jywgc3ViIHsgcG9wX291dHB1dCgpOyB9KTsKK3NnbWwoJzxSRUZTRUNUMklORk8+Jywgc3ViIHsgcHVzaF9vdXRwdXQoJ251bCcpOyB9KTsKK3NnbWwoJzwvUkVGU0VDVDJJTkZPPicsIHN1YiB7IHBvcF9vdXRwdXQoKTsgfSk7CitzZ21sKCc8UkVGU0VDVDNJTkZPPicsIHN1YiB7IHB1c2hfb3V0cHV0KCdudWwnKTsgfSk7CitzZ21sKCc8L1JFRlNFQ1QzSU5GTz4nLCBzdWIgeyBwb3Bfb3V0cHV0KCk7IH0pOworCitzZ21sKCc8SU5ERVhURVJNPicsIHN1YiB7IHB1c2hfb3V0cHV0KCdudWwnKTsgfSk7CitzZ21sKCc8L0lOREVYVEVSTT4nLCBzdWIgeyBwb3Bfb3V0cHV0KCk7IH0pOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTZXQgYm9sZCBvbiBlbmNsb3NlZCBjb250ZW50IAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3NnbWwoJzxBUFBMSUNBVElPTj4nLCBcJmJvbGRfb24pOwlzZ21sKCc8L0FQUExJQ0FUSU9OPicsIFwmZm9udF9vZmYpOworCitzZ21sKCc8Q0xBU1NOQU1FPicsIFwmYm9sZF9vbik7CQlzZ21sKCc8L0NMQVNTTkFNRT4nLCBcJmZvbnRfb2ZmKTsKK3NnbWwoJzxTVFJVQ1ROQU5FPicsIFwmYm9sZF9vbik7CXNnbWwoJzwvU1RSVUNUTkFNRT4nLCBcJmZvbnRfb2ZmKTsKK3NnbWwoJzxTVFJVQ1RGSUVMRD4nLCBcJmJvbGRfb24pOwlzZ21sKCc8L1NUUlVDVEZJRUxEPicsIFwmZm9udF9vZmYpOworc2dtbCgnPFNZTUJPTD4nLCBcJmJvbGRfb24pOwkJc2dtbCgnPC9TWU1CT0w+JywgXCZmb250X29mZik7CitzZ21sKCc8VFlQRT4nLCBcJmJvbGRfb24pOwkJc2dtbCgnPC9UWVBFPicsIFwmZm9udF9vZmYpOworCitzZ21sKCc8RU5WQVI+JywgXCZib2xkX29uKTsJc2dtbCgnPC9FTlZBUj4nLCBcJmZvbnRfb2ZmKTsKKworc2dtbCgnPEZVTkNUSU9OPicsIFwmYm9sZF9vbik7CXNnbWwoJzwvRlVOQ1RJT04+JywgXCZmb250X29mZik7CisKK3NnbWwoJzxFTVBIQVNJUz4nLCBcJmJvbGRfb24pOwlzZ21sKCc8L0VNUEhBU0lTPicsIFwmZm9udF9vZmYpOworCitzZ21sKCc8RVJST1JOQU1FPicsIFwmYm9sZF9vbik7CXNnbWwoJzwvRVJST1JOQU1FPicsIFwmZm9udF9vZmYpOworIyBFUlJPUlRZUEUKKworc2dtbCgnPENPTU1BTkQ+JywgXCZib2xkX29uKTsJc2dtbCgnPC9DT01NQU5EPicsIFwmZm9udF9vZmYpOworCitzZ21sKCc8R1VJQlVUVE9OPicsIFwmYm9sZF9vbik7CXNnbWwoJzwvR1VJQlVUVE9OPicsIFwmZm9udF9vZmYpOworc2dtbCgnPEdVSUlDT04+JywgXCZib2xkX29uKTsJc2dtbCgnPC9HVUlJQ09OPicsIFwmZm9udF9vZmYpOworIyBHVUlMQUJFTAorIyBHVUlNRU5VCisjIEdVSU1FTlVJVEVNCisjIEdVSVNVQk1FTlUKKyMgTUVOVUNIT0lDRQorIyBNT1VTRUJVVFRPTgorCitzZ21sKCc8QUNDRUw+JywgXCZib2xkX29uKTsJc2dtbCgnPC9BQ0NFTD4nLCBcJmZvbnRfb2ZmKTsKK3NnbWwoJzxLRVlDQVA+JywgXCZib2xkX29uKTsJc2dtbCgnPC9LRVlDQVA+JywgXCZmb250X29mZik7CitzZ21sKCc8S0VZU1lNPicsIFwmYm9sZF9vbik7CXNnbWwoJzwvS0VZU1lNPicsIFwmZm9udF9vZmYpOworIyBLRVlDT0RFCisjIEtFWUNPTUJPCisjIFNIT1JUQ1VUCisKK3NnbWwoJzxVU0VSSU5QVVQ+JywgXCZib2xkX29uKTsJc2dtbCgnPC9VU0VSSU5QVVQ+JywgXCZmb250X29mZik7CisKK3NnbWwoJzxJTlRFUkZBQ0VERUZJTklUSU9OPicsIFwmYm9sZF9vbik7CitzZ21sKCc8L0lOVEVSRkFDRURFRklOSVRJT04+JywgXCZmb250X29mZik7CisKKyMgTWF5IG5lZWQgdG8gbG9vayBhdCB0aGUgQ0xBU1MKK3NnbWwoJzxTWVNURU1JVEVNPicsIFwmYm9sZF9vbik7CitzZ21sKCc8L1NZU1RFTUlURU0+JywgXCZmb250X29mZik7CisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNldCBpdGFsaWMgb24gZW5jbG9zZWQgY29udGVudCAKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzZ21sKCc8RklSU1RURVJNPicsIFwmaXRhbGljX29uKTsJc2dtbCgnPC9GSVJTVFRFUk0+JywgXCZmb250X29mZik7CisKK3NnbWwoJzxGSUxFTkFNRT4nLCBcJml0YWxpY19vbik7CXNnbWwoJzwvRklMRU5BTUU+JywgXCZmb250X29mZik7CitzZ21sKCc8UEFSQU1FVEVSPicsIFwmaXRhbGljX29uKTsJc2dtbCgnPC9QQVJBTUVURVI+JywgXCZmb250X29mZik7CitzZ21sKCc8UFJPUEVSVFk+JywgXCZpdGFsaWNfb24pOwlzZ21sKCc8L1BST1BFUlRZPicsIFwmZm9udF9vZmYpOworCitzZ21sKCc8UkVQTEFDRUFCTEU+Jywgc3ViIHsKKwlpdGFsaWNfb24oKTsKKwlpZigkX1swXS0+aW4oJ1RPS0VOJykpIHsKKwkJIyBXaGVuIHRva2VuaXppbmcsIGZvbGxvdyBtb3JlICdpbnR1aXRpdmUnIGNvbnZlbnRpb24KKwkJb3V0cHV0ICI8IjsKKwl9Cit9KTsKK3NnbWwoJzwvUkVQTEFDRUFCTEU+Jywgc3ViIHsKKwlpZigkX1swXS0+aW4oJ1RPS0VOJykpIHsKKwkJb3V0cHV0ICI+IjsKKwl9CisJZm9udF9vZmYoKTsKK30pOworCitzZ21sKCc8Q0lURVRJVExFPicsIFwmaXRhbGljX29uKTsJc2dtbCgnPC9DSVRFVElUTEU+JywgXCZmb250X29mZik7CitzZ21sKCc8Rk9SRUlHTlBIUkFTRT4nLCBcJml0YWxpY19vbik7CXNnbWwoJzwvRk9SRUlHTlBIUkFTRT4nLCBcJmZvbnRfb2ZmKTsKKworc2dtbCgnPExJTkVBTk5PVEFUSU9OPicsIFwmaXRhbGljX29uKTsJc2dtbCgnPC9MSU5FQU5OT1RBVElPTj4nLCBcJmZvbnRfb2ZmKTsKKworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBPdGhlciAnaW5saW5lJyBlbGVtZW50cyAKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCittYW5fc2dtbCgnPEVNQUlMPicsICc8Jyk7CittYW5fc2dtbCgnPC9FTUFJTD4nLCAnPicpOworbWFuX3NnbWwoJzxPUFRJT05BTD4nLCAnWycpOworbWFuX3NnbWwoJzwvT1BUSU9OQUw+JywgJ10nKTsKKworbWFuX3NnbWwoJzwvVFJBREVNQVJLPicsICJcXHVcXHMtMlRNXFxzKzJcXGQiKTsKKworbWFuX3NnbWwoJzxDT01NRU5UPicsICJbQ29tbWVudDogIik7CittYW5fc2dtbCgnPC9DT01NRU5UPicsICJdIik7CisKK21hbl9zZ21sKCc8UVVPVEU+JywgImBgIik7CittYW5fc2dtbCgnPC9RVU9URT4nLCAiJyciKTsKKworI21hbl9zZ21sKCc8TElURVJBTD4nLCAnIicpOworI21hbl9zZ21sKCc8L0xJVEVSQUw+JywgJyInKTsKKworIyBObyBzcGVjaWFsIHByZXNlbnRhdGlvbjoKKworIyBBVVRIT1IKKyMgQVVUSE9SSU5JVElBTFMKKworIyBBQkJSRVYKKyMgQUNUSU9OCisjIEFDUk9OWU0KKyMgQUxUCisjIENJVEFUSU9OCisjIFBIUkFTRQorIyBRVU9URQorIyBXT1JEQVNXT1JECisKKyMgQ09NUFVURVJPVVRQVVQKKyMgTUFSS1VQCisjIFBST01QVAorIyBSRVRVUk5WQUxVRQorIyBTR01MVEFHCisjIFRPS0VOCisKKyMgREFUQUJBU0UKKyMgSEFSRFdBUkUKKyMgSU5URVJGQUNFCisjIE1FRElBTEFCRUwKKworIyBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBnb29kIHdheSB0byByZXByZXNlbnQgTElURVJBTCBpbiAtbWFuCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUGFyYWdyYXBoIGFuZCBwYXJhZ3JhcGgtbGlrZSBlbGVtZW50cyAKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgcGFyYV9zdGFydCB7CisJb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsKKworCSMgSW4gbGlzdHMsIGV0Yy4sIGRvbid0IHN0YXJ0IHBhcmFncmFwaCB3aXRoIC5QUCBzaW5jZQorCSMgdGhlIGluZGVudGF0aW9uIHdpbGwgYmUgZ29uZS4KKworCWlmKCRfWzBdLT5wYXJlbnQtPmV4dC0+eydub2JyZWFrJ309PTEpIHsKKwkJIyBVc3VhbGx5IHRoaXMgaXMgdGhlIEZJUlNUIGVsZW1lbnQgb2YKKwkJIyBhIGhhbmdpbmcgdGFnLCBzbyB3ZSBNVVNUIG5vdCBkbyBhIGZ1bGwKKwkJIyBwYXJhZ3JhcGggYnJlYWsuCisJCSRfWzBdLT5wYXJlbnQtPmV4dC0+eydub2JyZWFrJ30gPSAyOworCX0gZWxzaWYoJF9bMF0tPnBhcmVudC0+ZXh0LT57J25vYnJlYWsnfT09MikgeworCQkjIFVzdWFsbHkgdGhlc2UgYXJlIHRoZSBORVhUIGVsZW1lbnRzIG9mCisJCSMgYSBoYW5naW5nIHRhZy4gIElmIHdlIGJyZWFrIHVzaW5nIGEgYmxhbmsKKwkJIyBsaW5lLCB3ZSdyZSBva2F5LgorCQlvdXRwdXQgIlxuIjsKKwl9IGVsc2UgeworCQkjIE5vcm1hbCBjYXNlLiAoRm9yIGluZGVudGVkIGJsb2NrcyB0b28sIGF0IGxlYXN0CisJCSMgLW1hbiBpc24ndCBzbyBicmFpbmRlYWQgaW4gdGhpcyBhcmVhLikKKwkJb3V0cHV0ICIuUFBcbiI7CisJfQorfQorIyBBY3R1YWxseSBhcHBsaWVzIHRvIGEgZmV3IG90aGVyIGJsb2NrIGVsZW1lbnRzIGFzIHdlbGwKK3N1YiBwYXJhX2VuZCB7CisJb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsgCit9CisKK3NnbWwoJzxQQVJBPicsIFwmcGFyYV9zdGFydCk7CitzZ21sKCc8L1BBUkE+JywgXCZwYXJhX2VuZCk7CitzZ21sKCc8U0lNUEFSQT4nLCBcJnBhcmFfc3RhcnQpOworc2dtbCgnPC9TSU1QQVJBPicsIFwmcGFyYV9lbmQpOworCisjIE5vdGhpbmcgc3BlY2lhbCwgZXhjZXB0IG1heWJlIEZJWE1FIHNldCBub2JyZWFrLgorc2dtbCgnPElORk9STUFMRVhBTVBMRT4nLCBcJnBhcmFfc3RhcnQpOworc2dtbCgnPC9JTkZPUk1BTEVYQU1QTEU+JywgXCZwYXJhX2VuZCk7CisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJsb2NrcyB1c2luZyBTUyBzZWN0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRklYTUU6IFdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGVmZmVjdHMgb2YgU1MKKyMgaW4gYSBoYW5naW5nIHRhZyA6KAorCisjIENvbXBsZXRlIHdpdGggdGhlIG9wdGlvbmFsLXRpdGxlIGRpbGVtbWEgKGFnYWluKS4KK3NnbWwoJzxBQlNUUkFDVD4nLCBzdWIgeworCSRfWzBdLT5leHQtPnsndGl0bGUnfSA9ICdBQlNUUkFDVCc7CisJb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsKKwlwdXNoX291dHB1dCgnc3RyaW5nJyk7Cit9KTsKK3NnbWwoJzwvQUJTVFJBQ1Q+Jywgc3ViIHsKKwlteSAkY29udGVudCA9IHBvcF9vdXRwdXQoKTsKKwkKKwkjIEFzIEFCU1RSQUNUIGlzIG5ldmVyIG9uIHRoZSBzYW1lIGxldmVsIGFzIFJlZlNlY3QxLAorCSMgdGhpcyBsZWF2ZXMgdXMgd2l0aCBvbmx5IC5TUyBpbiB0ZXJtcyBvZiAtbWFuIG1hY3Jvcy4KKwlvdXRwdXQgIi5TUyBcIiIsIHVjKCRfWzBdLT5leHQtPnsndGl0bGUnfSksICJcIlxuIjsKKworCW91dHB1dCAkY29udGVudDsKKwlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworfSk7CisKKyMgQWgsIEkgbmVlZGVkIGEgYnJlYWsuICBFeGFtcGxlIGFsd2F5cyBoYXMgYSB0aXRsZS4KK21hbl9zZ21sKCc8RVhBTVBMRT4nLCAiXG4uU1MgIik7CitzZ21sKCc8L0VYQU1QTEU+JywgXCZwYXJhX2VuZCk7CisKKyMgU2FtZSB3aXRoIHNpZGViYXIuCittYW5fc2dtbCgnPFNJREVCQVI+JywgIlxuLlNTICIpOworc2dtbCgnPC9TSURFQkFSPicsIFwmcGFyYV9lbmQpOworCisjIE5PIHRpdGxlLgorbWFuX3NnbWwoJzxISUdITElHSFRTPicsICJcbi5TUyBISUdITElHSFRTXG4iKTsKK3NnbWwoJzwvSElHSExJR0hUUz4nLCBcJnBhcmFfZW5kKTsKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEluZGVudGVkICdCbG9jaycgZWxlbWVudHMgCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIGluZGVudF9ibG9ja19zdGFydAoreworCW91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7CisJb3V0cHV0ICIuc3Bcbi5SU1xuIjsKK30KK3N1YiBpbmRlbnRfYmxvY2tfZW5kCit7CisJb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsKKwlvdXRwdXQgIi5SRVxuIjsKK30KKworIyBUaGlzIGVsZW1lbnQgaXMgYWxtb3N0IGxpa2UgYW4gYWRtb25pdGlvbiAoYmVsb3cpLAorIyBvbmx5IHRoZSBkZWZhdWx0IHRpdGxlIGlzIGJsYW5rIDopCisKK3NnbWwoJzxCTE9DS1FVT1RFPicsIHN1YiB7IAorCSRfWzBdLT5leHQtPnsndGl0bGUnfSA9ICcnOyAKKwlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworCXB1c2hfb3V0cHV0KCdzdHJpbmcnKTsKK30pOworc2dtbCgnPC9CTE9DS1FVT1RFPicsIHN1YiB7CisJbXkgJGNvbnRlbnQgPSBwb3Bfb3V0cHV0KCk7CisKKwlpbmRlbnRfYmxvY2tfc3RhcnQoKTsKKwkKKwlpZigkX1swXS0+ZXh0LT57J3RpdGxlJ30pIHsKKwkJb3V0cHV0ICIuQiBcIiIsICRfWzBdLT5leHQtPnsndGl0bGUnfSwgIjpcIlxuIjsKKwl9CisJCisJb3V0cHV0ICRjb250ZW50OworCisJaWYoJF9bMF0tPmV4dC0+eydhdHRyaWJ1dGlvbid9KSB7CisJCW91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7CisJCSMgT25lIHBsYWNlIHdoZXJlIHJvZmYncyBzcGFjZS1zZW5zaXRpdml0eSBtYWtlcyBzZW5zZSA6KQorCQlvdXRwdXQgIlxuICAgICAgICAgICAgICAgIC0tICI7CisJCW91dHB1dCAkX1swXS0+ZXh0LT57J2F0dHJpYnV0aW9uJ30gLiAiXG4iOworCX0KKwkKKwlpbmRlbnRfYmxvY2tfZW5kKCk7Cit9KTsKKworIyBTZXQgb2ZmIGFkbW9uaXRpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHRleHQgYnkgaW5kZW50aW5nLgorIyBGSVhNRTogTmVlZCB0byBjaGVjayBpZiB0aGlzIHdvcmtzIGluc2lkZSBwYXJhZ3JhcGhzLCBub3QgZW5jbG9zaW5nIHRoZW0uCitzdWIgYWRtb25pdGlvbl9lbmQgeworCW15ICRjb250ZW50ID0gcG9wX291dHB1dCgpOworCisJaW5kZW50X2Jsb2NrX3N0YXJ0KCk7CisJCisJIyBXaGVuIHRoZSBhZG1vbml0aW9uIGlzIG9ubHkgb25lIHBhcmFncmFwaCwKKwkjIGl0IGxvb2tzIG5pY2VyIGlmIHRoZSB0aXRsZSB3YXMgaW5saW5lLgorCW15ICRudW1fcGFyYTsKKwl3aGlsZSAoJGNvbnRlbnQgPX4gL15cLlBQL2dtKSB7ICRudW1fcGFyYSsrIH0KKwlpZigkbnVtX3BhcmE9PTEpIHsKKwkJJGNvbnRlbnQgPX4gcy9eXC5QUFxuLy87CisJfQorCQorCW91dHB1dCAiLkIgXCIiIC4gJF9bMF0tPmV4dC0+eyd0aXRsZSd9IC4gIjpcIlxuIjsKKwlvdXRwdXQgJGNvbnRlbnQ7CisJCisJaW5kZW50X2Jsb2NrX2VuZCgpOworfQorCitzZ21sKCc8Tk9URT4nLCBzdWIgeworCSMgV2UgY2FuJ3Qgc2VlIHJpZ2h0IG5vdyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIFRJVExFCisJIyBlbGVtZW50LCBzbyB3ZSBoYXZlIHRvIHNhdmUgdGhlIG91dHB1dCBub3cgYW5kIGFkZCBpdCBiYWNrCisJIyBhdCB0aGUgZW5kIG9mIHRoaXMgYWRtb25pdGlvbi4KKwkkX1swXS0+ZXh0LT57J3RpdGxlJ30gPSAnTm90ZSc7CisKKwkjIEFsdGhvdWdoIGFkbW9uaXRpb25fZW5kJ3MgaW5kZW50X2Jsb2NrX3N0YXJ0IHdpbGwgZG8gdGhpcywKKwkjIHdlIG5lZWQgdG8gc3luY2hyb25pemUgdGhlIG91dHB1dCBfbm93XworCW91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7CisKKwlwdXNoX291dHB1dCgnc3RyaW5nJyk7Cit9KTsKK3NnbWwoJzwvTk9URT4nLCBcJmFkbW9uaXRpb25fZW5kKTsKKworIyBTYW1lIGFzIGFib3ZlLgorc2dtbCgnPFdBUk5JTkc+Jywgc3ViIHsgCisJJF9bMF0tPmV4dC0+eyd0aXRsZSd9ID0gJ1dhcm5pbmcnOyAKKwlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworCXB1c2hfb3V0cHV0KCdzdHJpbmcnKTsKK30pOworc2dtbCgnPC9XQVJOSU5HPicsIFwmYWRtb25pdGlvbl9lbmQpOworCitzZ21sKCc8VElQPicsIHN1YiB7CisJJF9bMF0tPmV4dC0+eyd0aXRsZSd9ID0gJ1RpcCc7CisJb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsKKwlwdXNoX291dHB1dCgnc3RyaW5nJyk7Cit9KTsKK3NnbWwoJzwvVElQPicsIFwmYWRtb25pdGlvbl9lbmQpOworc2dtbCgnPENBVVRJT04+Jywgc3ViIHsKKwkkX1swXS0+ZXh0LT57J3RpdGxlJ30gPSAnQ2F1dGlvbic7CisJb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsKKwlwdXNoX291dHB1dCgnc3RyaW5nJyk7Cit9KTsKK3NnbWwoJzwvQ0FVVElPTj4nLCBcJmFkbW9uaXRpb25fZW5kKTsKKworc2dtbCgnPElNUE9SVEFOVD4nLCBzdWIgeworCSRfWzBdLT5leHQtPnsndGl0bGUnfSA9ICdJbXBvcnRhbnQnOworCW91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7CisJcHVzaF9vdXRwdXQoJ3N0cmluZycpOworfSk7CitzZ21sKCc8L0lNUE9SVEFOVD4nLCBcJmFkbW9uaXRpb25fZW5kKTsKKworCisKKworCisKKworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBWZXJiYXRpbSBkaXNwbGF5cy4gCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIHZlcmJhdGltX3N0YXJ0IHsKKwlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworCQorCWlmKCRfWzBdLT5wYXJlbnQtPmV4dC0+eydub2JyZWFrJ309PTEpIHsKKwkJIyBVc3VhbGx5IHRoaXMgaXMgdGhlIEZJUlNUIGVsZW1lbnQgb2YKKwkJIyBhIGhhbmdpbmcgdGFnLCBzbyB3ZSBNVVNUIG5vdCBkbyBhIGZ1bGwKKwkJIyBwYXJhZ3JhcGggYnJlYWsuCisJCSRfWzBdLT5wYXJlbnQtPmV4dC0+eydub2JyZWFrJ30gPSAyOworCX0gZWxzZSB7CisJCW91dHB1dCAiXG4iOworCX0KKwkKKwlvdXRwdXQoIi5uZlxuIikgdW5sZXNzICRub2NvbGxhcHNlX3doaXRlc3BhY2UrKzsKK30KKworc3ViIHZlcmJhdGltX2VuZCB7CisJb3V0cHV0ICJcbiIgdW5sZXNzICRuZXdsaW5lX2xhc3QrKzsKKwlvdXRwdXQoIi5maVxuIikgdW5sZXNzIC0tJG5vY29sbGFwc2Vfd2hpdGVzcGFjZTsKK30KKworc2dtbCgnPFBST0dSQU1MSVNUSU5HPicsIFwmdmVyYmF0aW1fc3RhcnQpOyAKK3NnbWwoJzwvUFJPR1JBTUxJU1RJTkc+JywgXCZ2ZXJiYXRpbV9lbmQpOworCitzZ21sKCc8U0NSRUVOPicsIFwmdmVyYmF0aW1fc3RhcnQpOyAKK3NnbWwoJzwvU0NSRUVOPicsIFwmdmVyYmF0aW1fZW5kKTsKKworc2dtbCgnPExJVEVSQUxMQVlPVVQ+JywgXCZ2ZXJiYXRpbV9zdGFydCk7IAorc2dtbCgnPC9MSVRFUkFMTEFZT1VUPicsIFwmdmVyYmF0aW1fZW5kKTsKKworI3NnbWwoJzxTWU5PUFNJUz4nLCBzdWIgeworIwlpZigkX1swXS0+YXR0cmlidXRlKCdGT1JNQVQnKS0+dmFsdWUgPX4gL2xpbmVzcGVjaWZpYy9pKSB7CisjCQkmdmVyYmF0aW1fc3RhcnQ7CisjCX0gZWxzZSB7CisjCQlyb2ZmY21kKCIiKTsKKyMJfQorI30pOworIworI3NnbWwoJzwvU1lOT1BTSVM+Jywgc3ViIHsKKyMJaWYoJF9bMF0tPmF0dHJpYnV0ZSgnRk9STUFUJyktPnZhbHVlID1+IC9saW5lc3BlY2lmaWMvaSkgeworIwkJJnZlcmJhdGltX2VuZDsKKyMJfQorIwllbHNlIHsKKyMJCXJvZmZjbWQoIiIpOyMgbm90IHN1cmUgYWJvdXQgdGhpcy4KKyMJfQorI30pOworc2dtbCgnPFNZTk9QU0lTPicsIFwmdmVyYmF0aW1fc3RhcnQpOworc2dtbCgnPC9TWU5PUFNJUz4nLCBcJnZlcmJhdGltX2VuZCk7CisKKworCisKKworCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTGlzdHMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluZGVudCBuZXN0ZWQgbGlzdHMuCitzdWIgaW5kZW50X2xpc3Rfc3RhcnQgeworCWlmKCRsaXN0X25lc3RsZXZlbCsrKSB7CisJCW91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7CisJCW91dHB1dCAiLlJTXG4iOworCX0KK30KK3N1YiBpbmRlbnRfbGlzdF9lbmQgeworCWlmKC0tJGxpc3RfbmVzdGxldmVsKSB7CisJCW91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7CisJCW91dHB1dCAiLlJFXG4iOworCX0KK30KKworc2dtbCgnPFZBUklBQkxFTElTVD4nLCBcJmluZGVudF9saXN0X3N0YXJ0KTsKK3NnbWwoJzwvVkFSSUFCTEVMSVNUPicsIFwmaW5kZW50X2xpc3RfZW5kKTsKK3NnbWwoJzxJVEVNSVpFRExJU1Q+JywgXCZpbmRlbnRfbGlzdF9zdGFydCk7CitzZ21sKCc8L0lURU1JWkVETElTVD4nLCBcJmluZGVudF9saXN0X2VuZCk7CitzZ21sKCc8T1JERVJFRExJU1Q+Jywgc3ViIHsgCisJaW5kZW50X2xpc3Rfc3RhcnQoKTsKKwkkX1swXS0+ZXh0LT57J2NvdW50J30gPSAxOworfSk7CitzZ21sKCc8L09SREVSRURMSVNUPicsIFwmaW5kZW50X2xpc3RfZW5kKTsKKwkJCisjIE91dHB1dCBjb250ZW50IG9uIG9uZSBsaW5lLCBib2xkZWQuCitzZ21sKCc8VEVSTT4nLCBzdWIgeyAKKwlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworCW91dHB1dCAiLlRQXG4iOworCWJvbGRfb24oKTsKKwlwdXNoX291dHB1dCgnc3RyaW5nJyk7Cit9KTsKK3NnbWwoJzwvVEVSTT4nLCBzdWIgeyAKKwlteSAkdGVybSA9IHBvcF9vdXRwdXQoKTsKKwkkdGVybSA9fiB0ci9cbi8gLzsKKwlvdXRwdXQgJHRlcm07CisJZm9udF9vZmYoKTsKKwlvdXRwdXQgIlxuIjsKKwkkbmV3bGluZV9sYXN0ID0gMTsKK30pOworCQorc2dtbCgnPExJU1RJVEVNPicsIHN1YiB7CisJIyBBIGJ1bGxldGVkIGxpc3QuCisJaWYoJF9bMF0tPmluKCdJVEVNSVpFRExJU1QnKSkgeworCQlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworCQlvdXRwdXQgIi5UUCAwLjJpXG5cXChidVxuIjsKKwl9CisKKwkjIE5lZWQgbnVtYmVycy4KKwkjIEFzc3VtZSBBcmFiaWMgbnVtZXJhdGlvbiBmb3Igbm93LgorCWVsc2lmKCRfWzBdLT5pbignT1JERVJFRExJU1QnKSkgeworCQlvdXRwdXQgIlxuIiB1bmxlc3MgJG5ld2xpbmVfbGFzdCsrOworCQlvdXRwdXQgIi5UUCAiLCAkX1swXS0+cGFyZW50LT5leHQtPnsnY291bnQnfSsrLCAiLiBcbiI7CisJfQorCQorCSRfWzBdLT5leHQtPnsnbm9icmVhayd9ID0gMTsKK30pOworCitzZ21sKCc8U0lNUExFTElTVD4nLCBzdWIgeworCSRfWzBdLT5leHQtPnsnZmlyc3RfbWVtYmVyJ30gPSAxOworfSk7CisKK3NnbWwoJzxNRU1CRVI+Jywgc3ViIHsKKwlteSAkcGFyZW50ID0gJF9bMF0tPnBhcmVudDsKKwkKKwlpZigkcGFyZW50LT5hdHRyaWJ1dGUoJ1RZUEUnKS0+dmFsdWUgPX4gL0lubGluZS9pKSB7CisJCWlmKCRwYXJlbnQtPmV4dC0+eydmaXJzdF9tZW1iZXInfSkgeyAKKwkJCSMgSWYgdGhpcyBpcyB0aGUgZmlyc3QgbWVtYmVyIGRvbid0IHB1dCBhbnkgY29tbWFzCisJCQkkcGFyZW50LT5leHQtPnsnZmlyc3RfbWVtYmVyJ30gPSAwOworCQl9IGVsc2UgeworCQkJb3V0cHV0ICIsICI7CisJCX0KKwl9IGVsc2lmKCRwYXJlbnQtPmF0dHJpYnV0ZSgnVFlQRScpLT52YWx1ZSA9fiAvVmVydC9pKSB7CisJCW91dHB1dCAiXG4iIHVubGVzcyAkbmV3bGluZV9sYXN0Kys7CisJCW91dHB1dCAiXG4iOworCX0KK30pOworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTdHVmZiB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgKHlldCkgCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBZGRyZXNzIGJsb2NrczoKKworIyBDcmVkaXQgc3R1ZmY6CisjIEFDS05PCisjIEFERFJFU1MKKyMgQUZGSUxJQVRJT04KKyMgQVJUUEFHRU5VTVMKKyMgQVRUUklCVVRJT04KKyMgQVVUSE9SQkxVUkIKKyMgQVVUSE9SR1JPVVAKKyMgT1RIRVJDUkVESVQKKyMgSE9OT1JJRklDCisKKyMgQXJlYXM6CisjIEFSRUEKKyMgQVJFQVNFVAorIyBBUkVBU1BFQworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBMaW5rYWdlLCBjcm9zcyByZWZlcmVuY2VzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBQcmludCB0aGUgVVJMCitzZ21sKCc8L1VMSU5LPicsIHN1YiB7CisjCW91dHB1dCAnIDxVUkw6JywgJF9bMF0tPmF0dHJpYnV0ZSgnVVJMJyktPnZhbHVlLCAnPic7CisJJG5ld2xpbmVfbGFzdCA9IDA7Cit9KTsKKworIyBJZiBjcm9zcyByZWZlcmVuY2UgdGFyZ2V0IGlzIGEgUmVmRW50cnksIAorIyBvdXRwdXQgQ2l0ZVJlZkVudHJ5LXN0eWxlIHJlZmVyZW5jZXMuCitzZ21sKCc8WFJFRj4nLCBzdWIgeworCW15ICRpZCA9ICRfWzBdLT5hdHRyaWJ1dGUoJ0xJTktFTkQnKS0+dmFsdWU7CisJbXkgJG1hbnJlZiA9ICRSZWZzLT5nZXQoInJlZmVudHJ5OiRpZCIpOworCisJaWYoJG1hbnJlZikgeworCQlteSAoJHRpdGxlLCAkc2VjdCkgPSAoJG1hbnJlZiA9fiAvKC4qKShcKC4qXCkpLyk7CisJCWJvbGRfb24oKTsKKwkJb3V0cHV0ICR0aXRsZTsKKwkJZm9udF9vZmYoKTsKKwkJb3V0cHV0ICRzZWN0OworCX0gZWxzZSB7CisJCSRibGFua194cmVmcysrIGlmICR3cml0ZV9tYW5wYWdlczsKKwkJb3V0cHV0ICJbWFJlZiB0byAkaWRdIjsKKwl9CisKKwkkbmV3bGluZV9sYXN0ID0gMDsKK30pOworCisjIEFuY2hvcgorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT3RoZXIgaGFuZGxlcnMgCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbWFuX3NnbWwoJ3xbbHQgICAgXXwnLCAnPCcpOworbWFuX3NnbWwoJ3xbZ3QgICAgXXwnLCAnPicpOworbWFuX3NnbWwoJ3xbYW1wICAgXXwnLCAnJicpOworCisjCisjIERlZmF1bHQgaGFuZGxlcnMgKHVuY29tbWVudCB0aGVzZSBpZiBuZWVkZWQpLiAgUmlnaHQgbm93LCB0aGVzZSBhcmUgc2V0CisjIHVwIHRvIGdhZyBvbiBhbnkgdW5yZWNvZ25pc2VkIGVsZW1lbnRzLCBzZGF0YSwgcHJvY2Vzc2luZy1pbnN0cnVjdGlvbnMsCisjIG9yIGVudGl0aWVzLgorIworIyBzZ21sKCdzdGFydF9lbGVtZW50JyxzdWIgeyBkaWUgIlVua25vd24gZWxlbWVudDogIiAuICRfWzBdLT5uYW1lOyB9KTsKKyMgc2dtbCgnZW5kX2VsZW1lbnQnLCcnKTsKKworIyBUaGlzIGlzIGZvciB3ZWVkaW5nIG91dCBhbmQgZXNjYXBpbmcgY2VydGFpbiBjaGFyYWN0ZXJzLgorIyBUaGlzIGxvb2tzIGxpa2UgaXQncyBpbmVmZmljaWVudCBzaW5jZSBpdCdzIGRvbmUgb24gZXZlcnkgbGluZSwgYnV0CisjIGluIHJlYWxpdHksIFNHTUxTcG0gYW5kIHNnbWxzcGwgcGFyc2luZyBFU0lTIHRha2VzIF9tdWNoXyBsb25nZXIuCisKK3NnbWwoJ2NkYXRhJywgc3ViCit7IAorCWlmKCEkd3JpdGVfbWFucGFnZXMpIHsgcmV0dXJuOyB9CisJZWxzaWYoJHJhd19jZGF0YSkgeyBvdXRwdXQgJF9bMF07IHJldHVybjsgfQorCQorCSMgRXNjYXBlIGJhY2tzbGFzaGVzCisJJF9bMF0gPX4gcy9cXC9cXFxcL2c7CisKKwkjIEluIG5vbi0ncHJlJy10eXBlIGVsZW1lbnRzOgorCWlmKCEkbm9jb2xsYXBzZV93aGl0ZXNwYWNlKSB7CisJCSMgQ2hhbmdlIHRhYnMgdG8gc3BhY2VzCisJCSRfWzBdID1+IHRyL1x0LyAvOworCisJCSMgRG8gbm90IGFsbG93IGluZGVudHMgYXQgYmVnaW5uaW5nIG9mIGxpbmUKKwkJIyBncm9mZiBjaG9rZXMgb24gdGhhdC4KKwkJaWYoJG5ld2xpbmVfbGFzdCkgeyAKKwkJCSRfWzBdID1+IHMvXiArLy87CisKKwkJCSMgSWYgdGhlIGxpbmUgaXMgYWxsIGJsYW5rLCBkb24ndCBkbyBhbnl0aGluZy4KKwkJCWlmKCRfWzBdIGVxICcnKSB7IHJldHVybjsgfQorCQkJCisJCQkkX1swXSA9fiBzL15cLi9cXFwmXC4vOworCisJCQkjIEFyZ2guLi4gcm9mZiBkb2Vzbid0IGxpa2UgJyBlaXRoZXIuLi4KKwkJCSRfWzBdID1+IHMvXlwnL1xcXCZcJy87CisJCX0KKwl9CisKKwkkbmV3bGluZV9sYXN0ID0gMDsKKworCW91dHB1dCAkX1swXTsKK30pOworCisKKyMgV2hlbiBpbiB3aGl0ZXNwYWNlLWNvbGxhcHNpbmcgbW9kZSwgd2UgZGlzYWxsb3cgY29uc2VjdXRpdmUgbmV3bGluZXMuCisKK3NnbWwoJ3JlJywgc3ViCit7CisJaWYoJG5vY29sbGFwc2Vfd2hpdGVzcGFjZSB8fCAhJG5ld2xpbmVfbGFzdCkgeworCQlvdXRwdXQgIlxuIjsKKwl9CisKKwkkbmV3bGluZV9sYXN0ID0gMTsKK30pOworCitzZ21sKCdzZGF0YScsc3ViIHsgZGllICJVbmtub3duIFNEQVRBOiAiIC4gJF9bMF07IH0pOworc2dtbCgncGknLHN1YiB7IGRpZSAiVW5rbm93biBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiAiIC4gJF9bMF07IH0pOworc2dtbCgnZW50aXR5JyxzdWIgeyBkaWUgIlVua25vd24gZXh0ZXJuYWwgZW50aXR5OiAiIC4gJF9bMF0tPm5hbWU7IH0pOworc2dtbCgnc3RhcnRfc3ViZG9jJyxzdWIgeyBkaWUgIlVua25vd24gc3ViZG9jIGVudGl0eTogIiAuICRfWzBdLT5uYW1lOyB9KTsKK3NnbWwoJ2VuZF9zdWJkb2MnLCcnKTsKK3NnbWwoJ2NvbmZvcm1pbmcnLCcnKTsKKworMTsKKwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvaW5kZXguZGIgYi9pcHV0aWxzL2RvYy9pbmRleC5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdjMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvaW5kZXguZGIKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBWMy4xLy9FTiJbCis8IUVOVElUWSBzbmFwc2hvdCBTWVNURU0gInNuYXBzaG90LmRiIj4KKzwhRU5USVRZIHBpbmcgU1lTVEVNICJwaW5nLnNnbWwiPgorPCFFTlRJVFkgcmRpc2MgU1lTVEVNICJyZGlzYy5zZ21sIj4KKzwhRU5USVRZIGFycGluZyBTWVNURU0gImFycGluZy5zZ21sIj4KKzwhRU5USVRZIGNsb2NrZGlmZiBTWVNURU0gImNsb2NrZGlmZi5zZ21sIj4KKzwhRU5USVRZIHRyYWNlcGF0aCBTWVNURU0gInRyYWNlcGF0aC5zZ21sIj4KKzwhRU5USVRZIHRyYWNlcm91dGU2IFNZU1RFTSAidHJhY2Vyb3V0ZTYuc2dtbCI+Cis8IUVOVElUWSByYXJwZCBTWVNURU0gInJhcnBkLnNnbWwiPgorPCFFTlRJVFkgbmluZm9kIFNZU1RFTSAibmluZm9kLnNnbWwiPgorPCFFTlRJVFkgdGZ0cGQgU1lTVEVNICJ0ZnRwZC5zZ21sIj4KKzwhRU5USVRZIHBnMyBTWVNURU0gInBnMy5zZ21sIj4KK10+Cis8cmVmZXJlbmNlIGlkPSJpbmRleCI+Cis8dGl0bGU+U3lzdGVtIE1hbmFnZXIncyBNYW51YWw6IGlwdXRpbHM8L3RpdGxlPgorCismcGluZzsKKyZhcnBpbmc7CismY2xvY2tkaWZmOworJnJhcnBkOworJnRyYWNlcGF0aDsKKyZ0cmFjZXJvdXRlNjsKKyZ0ZnRwZDsKKyZuaW5mb2Q7CismcmRpc2M7CismcGczOworCis8L3JlZmVyZW5jZT4KZGlmZiAtLWdpdCBhL2lwdXRpbHMvZG9jL2luZGV4Lm91dCBiL2lwdXRpbHMvZG9jL2luZGV4Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZThlZjJlCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvaW5kZXgub3V0CkBAIC0wLDAgKzEsODcgQEAKK1xCT09LTUFSSyBbMV17MC4xLjF9e3Bpbmd9e30KK1xCT09LTUFSSyBbMl17MC4xLjEuMn17TmFtZX17MC4xLjF9CitcQk9PS01BUksgWzJdezAuMS4yLjJ9e1N5bm9wc2lzfXswLjEuMX0KK1xCT09LTUFSSyBbMl17MC4xLjMuMn17REVTQ1JJUFRJT059ezAuMS4xfQorXEJPT0tNQVJLIFsyXXswLjEuNC4yfXtPUFRJT05TfXswLjEuMX0KK1xCT09LTUFSSyBbMl17MC4xLjUuMn17SUNNUCBQQUNLRVQgREVUQUlMU317MC4xLjF9CitcQk9PS01BUksgWzJdezAuMS42LjJ9e0RVUExJQ0FURSBBTkQgREFNQUdFRCBQQUNLRVRTfXswLjEuMX0KK1xCT09LTUFSSyBbMl17MC4xLjcuMn17VFJZSU5HIERJRkZFUkVOVCBEQVRBIFBBVFRFUk5TfXswLjEuMX0KK1xCT09LTUFSSyBbMl17MC4xLjguMn17VFRMIERFVEFJTFN9ezAuMS4xfQorXEJPT0tNQVJLIFsyXXswLjEuOS4yfXtCVUdTfXswLjEuMX0KK1xCT09LTUFSSyBbMl17MC4xLjEwLjJ9e1NFRSBBTFNPfXswLjEuMX0KK1xCT09LTUFSSyBbMl17MC4xLjExLjJ9e0hJU1RPUll9ezAuMS4xfQorXEJPT0tNQVJLIFsyXXswLjEuMTIuMn17U0VDVVJJVFl9ezAuMS4xfQorXEJPT0tNQVJLIFsyXXswLjEuMTMuMn17QVZBSUxBQklMSVRZfXswLjEuMX0KK1xCT09LTUFSSyBbMV17MC4yLjF9e2FycGluZ317fQorXEJPT0tNQVJLIFsyXXswLjIuMTQuMn17TmFtZX17MC4yLjF9CitcQk9PS01BUksgWzJdezAuMi4xNS4yfXtTeW5vcHNpc317MC4yLjF9CitcQk9PS01BUksgWzJdezAuMi4xNi4yfXtERVNDUklQVElPTn17MC4yLjF9CitcQk9PS01BUksgWzJdezAuMi4xNy4yfXtPUFRJT05TfXswLjIuMX0KK1xCT09LTUFSSyBbMl17MC4yLjE4LjJ9e1NFRSBBTFNPfXswLjIuMX0KK1xCT09LTUFSSyBbMl17MC4yLjE5LjJ9e0FVVEhPUn17MC4yLjF9CitcQk9PS01BUksgWzJdezAuMi4yMC4yfXtTRUNVUklUWX17MC4yLjF9CitcQk9PS01BUksgWzJdezAuMi4yMS4yfXtBVkFJTEFCSUxJVFl9ezAuMi4xfQorXEJPT0tNQVJLIFsxXXswLjMuMX17Y2xvY2tkaWZmfXt9CitcQk9PS01BUksgWzJdezAuMy4yMi4yfXtOYW1lfXswLjMuMX0KK1xCT09LTUFSSyBbMl17MC4zLjIzLjJ9e1N5bm9wc2lzfXswLjMuMX0KK1xCT09LTUFSSyBbMl17MC4zLjI0LjJ9e0RFU0NSSVBUSU9OfXswLjMuMX0KK1xCT09LTUFSSyBbMl17MC4zLjI1LjJ9e09QVElPTlN9ezAuMy4xfQorXEJPT0tNQVJLIFsyXXswLjMuMjYuMn17V0FSTklOR1N9ezAuMy4xfQorXEJPT0tNQVJLIFsyXXswLjMuMjcuMn17U0VFIEFMU099ezAuMy4xfQorXEJPT0tNQVJLIFsyXXswLjMuMjguMn17UkVGRVJFTkNFU317MC4zLjF9CitcQk9PS01BUksgWzJdezAuMy4yOS4yfXtBVVRIT1J9ezAuMy4xfQorXEJPT0tNQVJLIFsyXXswLjMuMzAuMn17U0VDVVJJVFl9ezAuMy4xfQorXEJPT0tNQVJLIFsyXXswLjMuMzEuMn17QVZBSUxBQklMSVRZfXswLjMuMX0KK1xCT09LTUFSSyBbMV17MC40LjF9e3JhcnBkfXt9CitcQk9PS01BUksgWzJdezAuNC4zMi4yfXtOYW1lfXswLjQuMX0KK1xCT09LTUFSSyBbMl17MC40LjMzLjJ9e1N5bm9wc2lzfXswLjQuMX0KK1xCT09LTUFSSyBbMl17MC40LjM0LjJ9e0RFU0NSSVBUSU9OfXswLjQuMX0KK1xCT09LTUFSSyBbMl17MC40LjM1LjJ9e1dBUk5JTkd9ezAuNC4xfQorXEJPT0tNQVJLIFsyXXswLjQuMzYuMn17T1BUSU9OU317MC40LjF9CitcQk9PS01BUksgWzJdezAuNC4zNy4yfXtTRUUgQUxTT317MC40LjF9CitcQk9PS01BUksgWzJdezAuNC4zOC4yfXtBVVRIT1J9ezAuNC4xfQorXEJPT0tNQVJLIFsyXXswLjQuMzkuMn17U0VDVVJJVFl9ezAuNC4xfQorXEJPT0tNQVJLIFsyXXswLjQuNDAuMn17QVZBSUxBQklMSVRZfXswLjQuMX0KK1xCT09LTUFSSyBbMV17MC41LjF9e3RyYWNlcGF0aH17fQorXEJPT0tNQVJLIFsyXXswLjUuNDEuMn17TmFtZX17MC41LjF9CitcQk9PS01BUksgWzJdezAuNS40Mi4yfXtTeW5vcHNpc317MC41LjF9CitcQk9PS01BUksgWzJdezAuNS40My4yfXtERVNDUklQVElPTn17MC41LjF9CitcQk9PS01BUksgWzJdezAuNS40NC4yfXtTRUUgQUxTT317MC41LjF9CitcQk9PS01BUksgWzJdezAuNS40NS4yfXtBVVRIT1J9ezAuNS4xfQorXEJPT0tNQVJLIFsyXXswLjUuNDYuMn17U0VDVVJJVFl9ezAuNS4xfQorXEJPT0tNQVJLIFsyXXswLjUuNDcuMn17QVZBSUxBQklMSVRZfXswLjUuMX0KK1xCT09LTUFSSyBbMV17MC42LjF9e3RyYWNlcm91dGU2fXt9CitcQk9PS01BUksgWzJdezAuNi40OC4yfXtOYW1lfXswLjYuMX0KK1xCT09LTUFSSyBbMl17MC42LjQ5LjJ9e1N5bm9wc2lzfXswLjYuMX0KK1xCT09LTUFSSyBbMl17MC42LjUwLjJ9e0RFU0NSSVBUSU9OfXswLjYuMX0KK1xCT09LTUFSSyBbMl17MC42LjUxLjJ9e1NFRSBBTFNPfXswLjYuMX0KK1xCT09LTUFSSyBbMl17MC42LjUyLjJ9e0hJU1RPUll9ezAuNi4xfQorXEJPT0tNQVJLIFsyXXswLjYuNTMuMn17U0VDVVJJVFl9ezAuNi4xfQorXEJPT0tNQVJLIFsyXXswLjYuNTQuMn17QVZBSUxBQklMSVRZfXswLjYuMX0KK1xCT09LTUFSSyBbMV17MC43LjF9e3RmdHBkfXt9CitcQk9PS01BUksgWzJdezAuNy41NS4yfXtOYW1lfXswLjcuMX0KK1xCT09LTUFSSyBbMl17MC43LjU2LjJ9e1N5bm9wc2lzfXswLjcuMX0KK1xCT09LTUFSSyBbMl17MC43LjU3LjJ9e0RFU0NSSVBUSU9OfXswLjcuMX0KK1xCT09LTUFSSyBbMl17MC43LjU4LjJ9e1NFQ1VSSVRZfXswLjcuMX0KK1xCT09LTUFSSyBbMl17MC43LjU5LjJ9e1NFRSBBTFNPfXswLjcuMX0KK1xCT09LTUFSSyBbMl17MC43LjYwLjJ9e0hJU1RPUll9ezAuNy4xfQorXEJPT0tNQVJLIFsyXXswLjcuNjEuMn17QVZBSUxBQklMSVRZfXswLjcuMX0KK1xCT09LTUFSSyBbMV17MC44LjF9e3JkaXNjfXt9CitcQk9PS01BUksgWzJdezAuOC42Mi4yfXtOYW1lfXswLjguMX0KK1xCT09LTUFSSyBbMl17MC44LjYzLjJ9e1N5bm9wc2lzfXswLjguMX0KK1xCT09LTUFSSyBbMl17MC44LjY0LjJ9e0RFU0NSSVBUSU9OfXswLjguMX0KK1xCT09LTUFSSyBbMl17MC44LjY1LjJ9e09QVElPTlN9ezAuOC4xfQorXEJPT0tNQVJLIFsyXXswLjguNjYuMn17SElTVE9SWX17MC44LjF9CitcQk9PS01BUksgWzJdezAuOC42Ny4yfXtTRUUgQUxTT317MC44LjF9CitcQk9PS01BUksgWzJdezAuOC42OC4yfXtSRUZFUkVOQ0VTfXswLjguMX0KK1xCT09LTUFSSyBbMl17MC44LjY5LjJ9e1NFQ1VSSVRZfXswLjguMX0KK1xCT09LTUFSSyBbMl17MC44LjcwLjJ9e0FWQUlMQUJJTElUWX17MC44LjF9CitcQk9PS01BUksgWzFdezAuOS4xfXtwZzN9e30KK1xCT09LTUFSSyBbMl17MC45LjcxLjJ9e05hbWV9ezAuOS4xfQorXEJPT0tNQVJLIFsyXXswLjkuNzIuMn17U3lub3BzaXN9ezAuOS4xfQorXEJPT0tNQVJLIFsyXXswLjkuNzMuMn17REVTQ1JJUFRJT059ezAuOS4xfQorXEJPT0tNQVJLIFsyXXswLjkuNzQuMn17Q09NTUFORH17MC45LjF9CitcQk9PS01BUksgWzJdezAuOS43NS4yfXtXQVJOSU5HfXswLjkuMX0KK1xCT09LTUFSSyBbMl17MC45Ljc2LjJ9e0FVVEhPUn17MC45LjF9CitcQk9PS01BUksgWzJdezAuOS43Ny4yfXtTRUNVUklUWX17MC45LjF9CitcQk9PS01BUksgWzJdezAuOS43OC4yfXtBVkFJTEFCSUxJVFl9ezAuOS4xfQpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvaXB1dGlscy5kYiBiL2lwdXRpbHMvZG9jL2lwdXRpbHMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5ZGZhZAotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvZG9jL2lwdXRpbHMuZGIKQEAgLTAsMCArMSwyMDkgQEAKKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFYzLjEvL0VOIltdPgorPGFydGljbGUgaWQ9ImlwdXRpbHMiPgorIDxhcnRoZWFkZXI+CisgIDx0aXRsZT5pcHV0aWxzOiBkb2N1bWVudGF0aW9uIGRpcmVjdG9yeTwvdGl0bGU+CisgPC9hcnRoZWFkZXI+CisKKzxzZWN0MT4KKzx0aXRsZT5JbmRleDwvdGl0bGU+CisKKzxpdGVtaXplZGxpc3Q+CisgPGxpc3RpdGVtPjxwYXJhPgorICA8dWxpbmsgdXJsPSJwaW5nLmh0bWwiPnBpbmcsIHBpbmc2PC91bGluaz4uCisgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPGxpc3RpdGVtPjxwYXJhPgorICA8dWxpbmsgdXJsPSJhcnBpbmcuaHRtbCI+YXJwaW5nPC91bGluaz4uCisgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPGxpc3RpdGVtPjxwYXJhPgorICA8dWxpbmsgdXJsPSJjbG9ja2RpZmYuaHRtbCI+Y2xvY2tkaWZmPC91bGluaz4uCisgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPGxpc3RpdGVtPjxwYXJhPgorICA8dWxpbmsgdXJsPSJyYXJwZC5odG1sIj5yYXJwZDwvdWxpbms+LgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KKyAgPHVsaW5rIHVybD0idHJhY2VwYXRoLmh0bWwiPnRyYWNlcGF0aCwgdHJhY2VwYXRoNjwvdWxpbms+LgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KKyAgPHVsaW5rIHVybD0idHJhY2Vyb3V0ZTYuaHRtbCI+dHJhY2Vyb3V0ZTY8L3VsaW5rPi4KKyA8L3BhcmE+PC9saXN0aXRlbT4KKyA8bGlzdGl0ZW0+PHBhcmE+CisgIDx1bGluayB1cmw9InJkaXNjLmh0bWwiPnJkaXNjPC91bGluaz4uCisgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPGxpc3RpdGVtPjxwYXJhPgorICA8dWxpbmsgdXJsPSJ0ZnRwZC5odG1sIj50ZnRwZDwvdWxpbms+LgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KKyAgPHVsaW5rIHVybD0icGczLmh0bWwiPnBnMywgaXBnLCBwZ3NldDwvdWxpbms+LgorIDwvcGFyYT48L2xpc3RpdGVtPgorPC9pdGVtaXplZGxpc3Q+Cis8L3NlY3QxPgorCis8c2VjdDE+Cis8dGl0bGU+SGlzdG9yaWNhbCBub3RlczwvdGl0bGU+CisKKzxwYXJhPgorVGhpcyBwYWNrYWdlIGFwcGVhcmVkIGFzIGEgZGVzcGVyYXRlIGF0dGVtcHQgdG8gYnJpbmcgc29tZSBsaWZlCit0byBzdGF0ZSBvZiBiYXNpYyBuZXR3b3JraW5nIGFwcGxldHM6IDxjb21tYW5kL3BpbmcvLCA8Y29tbWFuZC90cmFjZXJvdXRlLworZXRjLiBUaG91Z2ggaXQgd2FzIGtub3duIHRoYXQgcG9ydCBvZiBCU0QgPGNvbW1hbmQvcGluZy8gdG8gTGludXgKK3dhcyBiYXNpY2FsbHkgYnJva2VuLCBuZWl0aGVyIG1haW50YWluZXJzIG9mIHdlbGwga25vd24gKGFuZCBzdXBlcmIpCitMaW51eCBuZXQtdG9vbHMgcGFja2FnZSBub3IgbWFpbnRhaW5lcnMgb2YgTGludXggZGlzdHJpYnV0aW9ucword29ycmllZCBhYm91dCBmaXhpbmcgd2VsbCBrbm93biBidWdzLCB3aGljaCB3ZXJlIHJlcG9ydGVkIGluIGxpbnV4LWtlcm5lbAorYW5kIGxpbnV4LW5ldCBtYWlsIGxpc3RzIGZvciBhZ2VzLCB3ZXJlIGlkZW50aWZpZWQgYW5kIG5ldmVydGhlbGVzcworbm90IHJlcGFpcmVkLiBTbywgb25lIGRheSAxMDAxdGggcmVzdW1pbmcgb2YgdGhlIHN1YmplY3QgaGFwcGVuZWQKK3RvIGJlIHRoZSBsYXN0IHN0cmF3IHRvIGJyZWFrIGNhbWVsJ3MgYmFjaywgSSBqdXN0IHBhcnNlZCBteSBoYXJkIGRpc2tzCithbmQgY29sbGVjdGVkIGEgc2V0IG9mIHV0aWxpdGllcywgd2hpY2ggc2hhcmVkIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKzwvcGFyYT4KKworPGl0ZW1pemVkbGlzdD4KKyA8bGlzdGl0ZW0+PHBhcmE+CitTbWFsbAorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KK1VzZWZ1bCBkZXNwaXRlIG9mIHRoaXMKKyA8L3BhcmE+PC9saXN0aXRlbT4KKyA8bGlzdGl0ZW0+PHBhcmE+CitJIG5ldmVyIHNlZW4gaXQgd2FzIG1hZGUgcmlnaHQKKyA8L3BhcmE+PC9saXN0aXRlbT4KKyA8bGlzdGl0ZW0+PHBhcmE+CitOb3QgcXVpdGUgdHJpdmlhbAorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KK0RlbW9uc3RyYXRpbmcgc29tZSBpbXBvcnRhbnQgZmVhdHVyZSBvZiBMaW51eCAKKyA8L3BhcmE+PC9saXN0aXRlbT4KKyA8bGlzdGl0ZW0+PHBhcmE+CitUaGUgbGFzdCBidXQgbm90IHRoZSBsZWFzdCwgSSB1c2UgaXQgbW9yZSBvciBsZXNzIHJlZ3VsYXJseQorIDwvcGFyYT48L2xpc3RpdGVtPgorPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPgorVGhpcyB1dGlsaXR5IHNldCB3YXMgbm90IHN1cHBvc2VkIHRvIGJlIGEgcmVmZXJlbmNlIHNldCBvciBzb21ldGhpbmcgbGlrZQordGhhdC4gTW9zdCBvZiB0aGVtIHdlcmUgY2xvbmVkIGZyb20gc29tZSBvcmlnaW5hbHM6Cis8aW5mb3JtYWx0YWJsZT4KKyA8dGdyb3VwIGNvbHM9Mj48dGJvZHk+CisgPHJvdz4KKyAgPGVudHJ5PnBpbmc8L2VudHJ5PgorICA8ZW50cnk+Y2xvbmVkIG9mIGFuIGFuY2llbnQgTmV0VG9vbHMtQi14eDwvZW50cnk+CisgPC9yb3c+CisgPHJvdz4KKyAgPGVudHJ5PnBpbmc2PC9lbnRyeT4KKyAgPGVudHJ5PmNsb25lZCBvZiBhIHZlcnkgb2xkIFBlZHJvJ3MgdXRpbGl0eSBzZXQ8L2VudHJ5PgorIDwvcm93PgorIDxyb3c+CisgIDxlbnRyeT50cmFjZXJvdXRlNjwvZW50cnk+CisgIDxlbnRyeT5jbG9uZWQgb2YgTlJMIFNlcCA5NiBkaXN0cmlidXRpb248L2VudHJ5PgorIDwvcm93PgorIDxyb3c+CisgIDxlbnRyeT5yZGlzYzwvZW50cnk+CisgIDxlbnRyeT5jbG9uZWQgb2YgU1VOIGluLnJkaXNjPC9lbnRyeT4KKyA8L3Jvdz4KKyA8cm93PgorICA8ZW50cnk+Y2xvY2tkaWZmPC9lbnRyeT4KKyAgPGVudHJ5PmJyb2tlbiBvdXQgb2Ygc29tZSBCU0QgdGltZWQ8L2VudHJ5PgorIDwvcm93PgorIDxyb3c+CisgIDxlbnRyeT50ZnRwZDwvZW50cnk+CisgIDxlbnRyeT5pdCBpcyBjbG9uZSBvZiBzb21lIGFuY2llbnQgTmV0S2l0IHBhY2thZ2U8L2VudHJ5PgorIDwvcm93PgorIDwvdGJvZHk+PC90Z3JvdXA+Cis8L2luZm9ybWFsdGFibGU+Cis8L3BhcmE+CisKKzxwYXJhPgorQWxzbyBJIGFkZGVkIHNvbWUgdXRpbGl0aWVzIHdyaXR0ZW4gZnJvbSBzY3JhdGNoLCBuYW1lbHkKKzxjb21tYW5kL3RyYWNlcGF0aC8sIDxjb21tYW5kL2FycGluZy8gYW5kIGxhdGVyIDxjb21tYW5kL3JhcnBkLworKHRoZSBsYXN0IG9uZSBkb2VzIG5vdCBzYXRpc2Z5IGFsbCB0aGUgY3JpdGVyaWEsIEkgdXNlZCBpdCB0d28gb3IgdGhyZWUKK3RpbWVzKS4KKzwvcGFyYT4KKworPHBhcmE+CitIZXNpdGF0ZWQgYSBiaXQgSSBvdmVyY2FtZSB0ZW1wdGF0aW9uIHRvIGFkZCA8Y29tbWFuZC90cmFjZXJvdXRlLy4KK1RoZSB2YXJpYW50IHJlbGVhc2VkIGJ5IExCTkwgdG8gdGhhdCB0aW1lIHdhcyBtb3N0bHkgc2FuZSBhbmQgYnVncworaW4gaXQgd2VyZSBtb3N0bHkgbm90IHNwZWNpZmljIHRvIExpbnV4LCBidXQgbWFpbiByZWFzb24gd2FzIHRoYXQKK3RoZSBsYXRlc3QgdmVyc2lvbiBvZiBMQk5MIDxjb21tYW5kL3RyYWNlcm91dGUvIHdhcyBub3QgCis8ZW1waGFzaXMvc21hbGwvLCBpdCBjb25zaXN0ZWQgb2Ygc2V2ZXJhbCBmaWxlcywKK3VzZWQgYSB3aWNrZWQgKGFuZCBmYWlsaW5nIHdpdGggTGludXggOi0pKSBhdXRvY29uZmlndXJhdGlvbiBldGMuCitTbywgaW5zdGVhZCBJIGFzc2VtYmxlZCB0byBpcHV0aWxzIGEgc2ltcGxpc3RpYyA8Y29tbWFuZC90cmFjZXBhdGgvIHV0aWxpdHkKK2FuZCBJUHY2IHZlcnNpb24gb2YgdHJhY2Vyb3V0ZSwgYW5kIHB1Ymxpc2hlZCBteSAKKzx1bGluayB1cmw9ImZ0cDovL2Z0cC5pbnIuYWMucnUvaXAtcm91dGluZy9sYmwtdG9vbHMiPiBwYXRjaGVzPC91bGluaz4uCit0byBMQk5MIDxjb21tYW5kL3RyYWNlcm91dGUvIHNlcGFyYXRlbHkuPGZvb3Rub3RlPjxwYXJhPlRoaXMgd2FzIG1pc3Rha2UuCitEdWUgdG8gdGhpcyA8Y29tbWFuZC90cmFjZXJvdXRlLyB3YXMgaW4gYSBzYWQgc3RhdGUgdW50aWwgcmVjZW50bHkuCitHb29kIG5ld3MsIHJlZGhhdC03LjIgc2VlbXMgdG8gYWRkIHRoZXNlIHBhdGNoZXMgdG8gdGhlaXIgdHJhY2Vyb3V0ZQorcnBtIGV2ZW50dWFsbHkuIFNvLCBJIHRoaW5rIEkgd2lsbCByZWZyYWluIG9mIHN1aWNpZGUgZm9yIGF3aGlsZS4KKzwvcGFyYT48L2Zvb3Rub3RlPgorPC9wYXJhPgorCis8L3NlY3QxPgorCis8c2VjdDE+Cis8dGl0bGU+SW5zdGFsbGF0aW9uIG5vdGVzPC90aXRsZT4KKzxwYXJhPgorPHVzZXJpbnB1dC9tYWtlLyB0byBjb21waWxlIHV0aWxpdGllcy4gPHVzZXJpbnB1dC9tYWtlIGh0bWwvIHRvIHByZXBhcmUKK2h0bWwgZG9jdW1lbnRhdGlvbiwgPHVzZXJpbnB1dC9tYWtlIG1hbi8gaWYgeW91IHByZWZlciBtYW4gcGFnZXMuCitOb3RoaW5nIGZhbmN5LCBwcm92aWRlZCB5b3UgaGF2ZSBEb2NCb29rIHBhY2thZ2UgaW5zdGFsbGVkLgorPC9wYXJhPgorCis8cGFyYT4KKzx1c2VyaW5wdXQvbWFrZSBpbnN0YWxsLyBpbnN0YWxscyA8ZW1waGFzaXMvb25seS8gSFRNTCBkb2N1bWVudGF0aW9uCit0byA8ZmlsZW5hbWU+L3Vzci9kb2MvaXB1dGlsczwvZmlsZW5hbWU+LiBJdCBldmVuIGRvZXMgbm90IHRyeQordG8gaW5zdGFsbCBiaW5hcmllcyBhbmQgbWFuIHBhZ2VzLiBJZiB5b3UgcmVhZCBoaXN0b3JpY2FsCitub3RlcyBhYm92ZSwgdGhlIHJlYXNvbiBzaG91bGQgYmUgZXZpZGVudC4gTW9zdCBvZiB1dGlsaXRpZXMKK2ludGVyc2VjdCB3aXRoIHV0aWxpdGllcyBkaXN0cmlidXRlZCBpbiBhbm90aGVyIHBhY2thZ2VzLCBhbmQKK21ha2luZyBzdWNoIHRhcmdldCByZXdyaXRpbmcgZXhpc3RpbmcgaW5zdGFsbGF0aW9uIHdvdWxkIGJlIGEgY3JpbWUKK2Zyb20gbXkgc2lkZS4gVGhlIGRlY2lzaW9uIHdoYXQgdmFyaWFudCBvZiA8Y29tbWFuZC9waW5nLyBpcyBwcmVmZXJyZWQsCitob3cgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzIGV0Yy4gaXMgbGVmdCB0byB5b3Ugb3IgdG8gcGVyc29uIHdobworYXNzZW1ibGVkIGFuIHJwbS4gSSB2b3RlIGZvciB2YXJpYW50IGZyb20gPGNvbW1hbmQvaXB1dGlscy8gb2YgY291cnNlLgorPC9wYXJhPgorCis8cGFyYT4KK0FueXdheSwgc2VsZWN0IHV0aWxpdGllcyB3aGljaCB5b3UgbGlrZSBhbmQgaW5zdGFsbCB0aGVtIHRvIHRoZSBwbGFjZXMKK3doaWNoIHlvdSBwcmVmZXIgdG9nZXRoZXIgd2l0aCB0aGVpciBtYW4gcGFnZXMuCis8L3BhcmE+CisKKworPHBhcmE+CitJdCBpcyBwb3NzaWJsZSB0aGF0IGNvbXBpbGF0aW9uIHdpbGwgZmFpbCwgaWYgeW91IHVzZSBzb21lCitmdW5ueSBMaW51eCBkaXN0cmlidXRpb24gbWFuZ2xpbmcgaGVhZGVyIGZpbGVzIGluIHNvbWUgdW5leHBlY3RlZCB3YXlzCisoZXhwZWN0ZWQgb25lcyBhcmUgdGhlIHdheXMgb2YgcmVkaGF0IG9mIGNvdXJzZSA6LSkpLgorSSB2YWxpZGF0ZSBpcHV0aWxzIGFnYWluc3QgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5hc3BsaW51eC5ydSI+YXNwbGludXg8L3VsaW5rPgorZGlzdHJpYnV0aW9uLCB3aGljaCBpcyBpbmV2aXRhYmx5IGZvbGxvd2VkIGJ5IHZhbGlkaXR5IHdpdGggcmVzcGVjdAordG8gPHVsaW5rIHVybD0iaHR0cDovL3d3dy5yZWRoYXQuY29tIj5yZWRoYXQ8L3VsaW5rPi4KK0lmIHlvdXIgZGlzdHJpYnV0aW9uIGlzIG9uZSBvZiB3aWRlbHkga25vd24gb25lcywgc3VzZSBvciBkZWJpYW4sCitpdCBhbHNvIHdpbGwgY29tcGlsZSBwcm92aWRlZCBzbmFwc2hvdCBpcyBlbGRlciB0aGFuIG1vbnRoIG9yIHNvIGFuZAorc29tZW9uZSByZXBvcnRlZCBhbGwgdGhlIHByb2JsZW1zLCBpZiB0aGV5IHRvb2sgcGxhY2UgYXQgYWxsLgorPC9wYXJhPgorCis8cGFyYT4KKzxlbXBoYXNpcz4KK0FueXdheSwgcGxlYXNlLCBkbyBub3QgYWJ1c2UgbWUgY29tcGxhaW5pbmcgYWJvdXQgc29tZSBjb21waWxhdGlvbiBwcm9ibGVtcworaW4gYW55IGRpc3RyaWJ1dGlvbiBkaWZmZXJlbnQgb2YgYXNwbGludXggb3IgcmVkaGF0LgorSWYgeW91IGhhdmUgYSBmaXgsIHBsZWFzZSwgc2VuZCBpdCB0bworPHVsaW5rIHVybD0ibWFpbHRvOmt1em5ldEBtczIuaW5yLmFjLnJ1Ij5tZTwvdWxpbms+LAorSSB3aWxsIGNoZWNrIHRoYXQgaXQgZG9lcyBub3QgYnJlYWsgZGlzdHJpYnV0aW9ucyBtZW50aW9uZWQgYWJvdmUKK2FuZCBhcHBseSBpdC4gQnV0IEkgYW0gbm90IGdvaW5nIHRvIHVuZGVydGFrZSBhbnkgaW52ZXN0aWdhdGlvbnMsCitiYXJlIHJlcG9ydHMgYXJlIGRlZW1lZCB0byBiZSByb3V0ZWQgdG8gPGZpbGVuYW1lPi9kZXYvbnVsbDwvZmlsZW5hbWU+LgorPC9lbXBoYXNpcz4KKzwvcGFyYT4KKworPC9zZWN0MT4KKworPHNlY3QxPjx0aXRsZT5BdmFpbGFiaWxpdHk8L3RpdGxlPgorCis8cGFyYT4KK1RoZSBjb2xsZWN0aW9uIG9mIGRvY3VtZW50cyBpcyBwYXJ0IG9mIDxmaWxlbmFtZS9pcHV0aWxzLyBwYWNrYWdlCithbmQgdGhlIGxhdGVzdCB2ZXJzaW9ucyBhcmUgIGF2YWlsYWJsZSBpbiBzb3VyY2UgZm9ybSBhdAorPHVsaW5rIHVybD0iaHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejIiPgoraHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejI8L3VsaW5rPi4KKzwvcGFyYT4KKzwvc2VjdDE+CisKKworPHNlY3QxPgorPHRpdGxlPkNvcHlpbmc8L3RpdGxlPgorPHBhcmE+CitEaWZmZXJlbnQgZmlsZXMgYXJlIGNvcHlyaWdodGVkIGJ5IGRpZmZlcmVudCBwZXJzb25zIGFuZCBvcmdhbml6YXRpb25zCithbmQgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2VzLiBGb3IgZGV0YWlscyBsb29rIGludG8gY29ycmVzcG9uZGluZworc291cmNlIGZpbGVzLgorPC9wYXJhPgorPC9zZWN0MT4KKworPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvbmluZm9kLnNnbWwgYi9pcHV0aWxzL2RvYy9uaW5mb2Quc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTU0YTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvbmluZm9kLnNnbWwKQEAgLTAsMCArMSwxMjAgQEAKKzxyZWZlbnRyeSBpZD0ibmluZm9kIj4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5uaW5mb2Q8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjg8L21hbnZvbG51bT4KKzxyZWZtaXNjaW5mbz5pcHV0aWxzLSZzbmFwc2hvdDs8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorCis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPm5pbmZvZDwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPlJlc3BvbmQgdG8gSVB2NiBOb2RlIEluZm9ybWF0aW9uIFF1ZXJpZXM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+CisKKzxyZWZzeW5vcHNpc2Rpdj4KKzxjbWRzeW5vcHNpcz4KKzxjb21tYW5kPm5pbmZvZDwvY29tbWFuZD4KKzxhcmcgY2hvaWNlPSJvcHQiPjxvcHRpb24+LWRodjwvb3B0aW9uPjwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LXAgPHJlcGxhY2VhYmxlL3BpZGZpbGUvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tdSA8cmVwbGFjZWFibGUvdXNlci88L2FyZz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCis8cmVmc2VjdDE+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPgorUmVzcG9uZHMgdG8gPHVsaW5rIHVybD0iaHR0cDovL3Rvb2xzLmlldGYub3JnL3JmYy9yZmM0NjIwLnR4dCI+SVB2NiBOb2RlIEluZm9ybWF0aW9uIFF1ZXJpZXMgKFJGQzQ2MjApPC91bGluaz4gZnJvbSBjbGllbnRzLgorUXVlcmllcyBjYW4gYmUgc2VudCBieSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyBvZiA8Y29tbWFuZC9waW5nNi8gY29tbWFuZC4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+T1BUSU9OUzwvdGl0bGU+CisKKzx2YXJpYWJsZWxpc3Q+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1hLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorRGVidWcgbW9kZS4gIERvIG5vdCBnbyBiYWNrZ3JvdW5kLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLWgvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTaG93IGhlbHAuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tdi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1ZlcmJvc2UgbW9kZS4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi11IDxyZXBsYWNlYWJsZS91c2VyLzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorUnVuIGFzIGFub3RoZXIgdXNlci4KKzxyZXBsYWNlYWJsZS91c2VyLyBjYW4gZWl0aGVyIGJlIHVzZXJuYW1lIG9yIHVzZXIgSUQuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tcCA8cmVwbGFjZWFibGUvcGlkZmlsZS88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0ZpbGUgZm9yIHByb2Nlc3MtaWQgc3RvcmFnZS4KKzxyZXBsYWNlYWJsZS91c2VyLyBpcyByZXF1aXJlZCB0byBiZSBhYmxlIHRvIGNyZWF0ZSB0aGUgZmlsZS4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+U0VFIEFMU088L3RpdGxlPgorPHBhcmE+Cis8bGluayBsaW5rZW5kPSJwaW5nIj4KKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvcGluZy88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+PC9saW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvbmluZm9kLyB3YXMgd3JpdHRlbiBieSBVU0FHSS9XSURFIFByb2plY3QuCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkNPUFlJTkc8L3RpdGxlPgorPHBhcmE+Cis8bGl0ZXJhbGxheW91dD4KK0NvcHlyaWdodCAoQykgMjAxMiBZT1NISUZVSkkgSGlkZWFraS4KK0NvcHlyaWdodCAoQykgMjAwMiBVU0FHSS9XSURFIFByb2plY3QuCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCitGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKK09SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKK0xJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFLgorPC9saXRlcmFsbGF5b3V0PgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2lwdXRpbHMvZG9jL3BnMy5zZ21sIGIvaXB1dGlscy9kb2MvcGczLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjODBmZQotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvZG9jL3BnMy5zZ21sCkBAIC0wLDAgKzEsMTc1IEBACis8cmVmZW50cnkgaWQ9InBnMyI+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+cGczPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT44PC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8+aXB1dGlscy0mc25hcHNob3Q7PC9yZWZtaXNjaW5mbz4KKzwvcmVmbWV0YT4KKworCis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPnBnMywgaXBnLCBwZ3NldDwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPnNlbmQgc3RyZWFtIG9mIFVEUCBwYWNrZXRzPC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorCis8cmVmc3lub3BzaXNkaXY+Cis8Y21kc3lub3BzaXM+Cis8Y29tbWFuZD5zb3VyY2UgaXBnPC9jb21tYW5kPgorPC9jbWRzeW5vcHNpcz4KKzxjbWRzeW5vcHNpcz4KKzxjb21tYW5kPnBnPC9jb21tYW5kPgorPC9jbWRzeW5vcHNpcz4KKzxjbWRzeW5vcHNpcz4KKzxjb21tYW5kPnBnc2V0PC9jb21tYW5kPgorPGFyZyBjaG9pY2U9InJlcSI+PHJlcGxhY2VhYmxlL0NPTU1BTkQvPC9hcmc+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworPHJlZnNlY3QxPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL2lwZy8gaXMgbm90IGEgcHJvZ3JhbSwgaXQgaXMgc2NyaXB0IHdoaWNoIHNob3VsZCBiZSBzb3VyY2VkCit0byA8Y29tbWFuZC9iYXNoLy4gV2hlbiBzb3VyY2VkIGl0IGxvYWRzIG1vZHVsZSA8ZmlsZW5hbWUvcGczLyBhbmQKK2V4cG9ydHMgYSBmZXcgb2YgZnVuY3Rpb25zIGFjY2Vzc2libGUgZnJvbSBwYXJlbnQgc2hlbGwuIFRoZXNlIG1hY3JvcworYXJlIDxjb21tYW5kL3BnLyB0byBzdGFydCBwYWNrZXQgaW5qZWN0aW9uIGFuZCB0byBnZXQgdGhlIHJlc3VsdHMgb2YgcnVuOworYW5kIDxjb21tYW5kL3Bnc2V0LyB0byBzZXR1cCBwYWNrZXQgZ2VuZXJhdG9yLgorPC9wYXJhPgorCis8cGFyYT4KKzxjb21tYW5kL3Bnc2V0LyBjYW4gc2VuZCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHRvIG1vZHVsZSA8ZmlsZW5hbWUvcGczLzoKKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+Q09NTUFORDwvdGl0bGU+CisKKzx2YXJpYWJsZWxpc3Q+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPm9kZXYgPHJlcGxhY2VhYmxlL0RFVklDRS88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK05hbWUgb2YgRXRoZXJuZXQgZGV2aWNlIHRvIHRlc3QuIFNlZQorPGxpbmsgbGlua2VuZD0icGczLndhcm5pbmciPndhcm5pbmc8L2xpbms+IGJlbG93LgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+cGt0X3NpemUgPHJlcGxhY2VhYmxlL0JZVEVTLzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorU2l6ZSBvZiBwYWNrZXQgdG8gZ2VuZXJhdGUuIFRoZSBzaXplIGluY2x1ZGVzIGFsbCB0aGUgaGVhZGVyczogVURQLCBJUCwKK01BQywgYnV0IGRvZXMgbm90IGFjY291bnQgZm9yIG92ZXJoZWFkIGludGVybmFsIHRvIG1lZGl1bSwgaS5lLiBGQ1MKK2FuZCB2YXJpb3VzIHBhZGRpbmdzLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+ZnJhZ3MgPHJlcGxhY2VhYmxlL05VTUJFUi88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0VhY2ggcGFja2V0IHdpbGwgY29udGFpbiA8cmVwbGFjZWFibGUvTlVNQkVSLyBvZiBmcmFnbWVudHMuCitNYXhpbWFsIGFtb3VudCBmb3IgbGludXgtMi40IGlzIDYuIEZhciBub3QgYWxsIHRoZSBkZXZpY2VzIHN1cHBvcnQKK2ZyYWdtZW50ZWQgYnVmZmVycy4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPmNvdW50IDxyZXBsYWNlYWJsZS9OVU1CRVIvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTZW5kIHN0cmVhbSBvZiA8cmVwbGFjZWFibGUvTlVNQkVSLyBvZiBwYWNrZXRzIGFuZCBzdG9wIGFmdGVyIHRoaXMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj5pcGcgPHJlcGxhY2VhYmxlL1RJTUUvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitJbnRyb2R1Y2UgYXJ0aWZpY2lhbCBkZWxheSBiZXR3ZWVuIHBhY2tldHMgb2YgPHJlcGxhY2VhYmxlL1RJTUUvCittaWNyb3NlY29uZHMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj5kc3QgPHJlcGxhY2VhYmxlL0lQX0FERFJFU1MvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTZWxlY3QgSVAgZGVzdGluYXRpb24gd2hlcmUgdGhlIHN0cmVhbSBpcyBzZW50IHRvLgorQmV3YXJlLCBuZXZlciBzZXQgdGhpcyBhZGRyZXNzIGF0IHJhbmRvbS4gPGNvbW1hbmQvcGczLyBpcyBub3QgYSB0b3ksCitpdCBjcmVhdGVzIHJlYWxseSB0b3VnaCBzdHJlYW0uIERlZmF1bHQgdmFsdWUgaXMgMC4wLjAuMC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPmRzdCA8cmVwbGFjZWFibGUvTUFDX0FERFJFU1MvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTZWxlY3QgTUFDIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSBzdHJlYW0gaXMgc2VudCB0by4KK0RlZmF1bHQgdmFsdWUgaXMgMDA6MDA6MDA6MDA6MDA6MDAgaW4gaG9wZSB0aGF0IHRoaXMgd2lsbCBub3QgYmUgcmVjZWl2ZWQKK2J5IGFueSBub2RlIG9uIExBTi4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPnN0b3A8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0Fib3J0IHBhY2tldCBpbmplY3Rpb24uCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0icGczLndhcm5pbmciPjx0aXRsZT5XQVJOSU5HPC90aXRsZT4KKzxwYXJhPgorV2hlbiBvdXRwdXQgZGV2aWNlIGlzIHNldCB0byBzb21lIHJhbmRvbSBkZXZpY2UgZGlmZmVyZW50CitvZiBoYXJkd2FyZSBFdGhlcm5ldCBkZXZpY2UsIDxjb21tYW5kL3BnMy8gd2lsbCBjcmFzaCBrZXJuZWwuCis8L3BhcmE+Cis8cGFyYT4KK0RvIG5vdCB1c2UgaXQgb24gVkxBTiwgZXRoZXJ0YXAsIFZUVU4gYW5kIG90aGVyIGRldmljZXMsCit3aGljaCBlbXVsYXRlIEV0aGVybmV0IG5vdCBiZWluZyByZWFsIEV0aGVybmV0IGluIGZhY3QuCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkFVVEhPUjwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL3BnMy8gd2FzIHdyaXR0ZW4gYnkgPHVsaW5rIHVybD0ibWFpbHRvOnJvYmVydC5vbHNzb25AaXRzLnV1LnNlIj4KK1JvYmVydCBPbHNzb24gJmx0O3JvYmVydC5vbHNzb25AaXRzLnV1LnNlJmd0OzwvdWxpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5TRUNVUklUWTwvdGl0bGU+Cis8cGFyYT4KK1RoaXMgY2FuIGJlIHVzZWQgb25seSBieSBzdXBlcnVzZXIuCis8L3BhcmE+Cis8cGFyYT4KK1RoaXMgdG9vbCBjcmVhdGVzIGZsb29kcyBvZiBwYWNrZXRzIHdoaWNoIGlzIHVubGlrZWx5IHRvIGJlIGhhbmRsZWQKK2V2ZW4gYnkgaGlnaC1lbmQgbWFjaGluZXMuIEZvciBleGFtcGxlLCBpdCBzYXR1cmF0ZXMgZ2lnYWJpdCBsaW5rIHdpdGgKKzYwIGJ5dGUgcGFja2V0cyB3aGVuIHVzZWQgd2l0aCBJbnRlbCdzIGUxMDAwLiBJbiBmYWNlIG9mIHN1Y2ggc3RyZWFtCitzd2l0Y2hlcywgcm91dGVycyBhbmQgZW5kIGhvc3RzIG1heSBkZWFkbG9jaywgY3Jhc2gsIGV4cGxvZGUuCitVc2Ugb25seSBpbiB0ZXN0IGxhYiBlbnZpcm9ubWVudC4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+QVZBSUxBQklMSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvcGczLyBpcyBwYXJ0IG9mIDxmaWxlbmFtZS9pcHV0aWxzLyBwYWNrYWdlCithbmQgdGhlIGxhdGVzdCB2ZXJzaW9ucyBhcmUgIGF2YWlsYWJsZSBpbiBzb3VyY2UgZm9ybSBhdAorPHVsaW5rIHVybD0iaHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejIiPgoraHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejI8L3VsaW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzwhW0lHTk9SRVsKKzxyZWZzZWN0MT48dGl0bGU+Q09QWUlORzwvdGl0bGU+Cis8cGFyYT4KKzxsaXRlcmFsbGF5b3V0PgorVGhpcyBkb2N1bWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCitpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIFZlcnNpb24gMi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlCitkaXN0cmlidXRpb24gb2YgTGludXgga2VybmVsIG9mIHZlcnNpb24gMi40LgorPC9saXRlcmFsbGF5b3V0PgorPC9wYXJhPgorPC9yZWZzZWN0MT4KK11dPgorCis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvcGluZy5zZ21sIGIvaXB1dGlscy9kb2MvcGluZy5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzkyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL2RvYy9waW5nLnNnbWwKQEAgLTAsMCArMSw2ODkgQEAKKzxyZWZlbnRyeSBpZD0icGluZyI+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+cGluZzwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+ODwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvPmlwdXRpbHMtJnNuYXBzaG90OzwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+CisKKzxyZWZuYW1lZGl2PgorPHJlZm5hbWU+cGluZywgcGluZzY8L3JlZm5hbWU+Cis8cmVmcHVycG9zZT5zZW5kIElDTVAgRUNIT19SRVFVRVNUIHRvIG5ldHdvcmsgaG9zdHM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+CisKKzxyZWZzeW5vcHNpc2Rpdj4KKzxjbWRzeW5vcHNpcz4KKzxjb21tYW5kPnBpbmc8L2NvbW1hbmQ+Cis8YXJnIGNob2ljZT0ib3B0Ij48b3B0aW9uPi1hQWJCZERmaExuT3FyUlV2Vjwvb3B0aW9uPjwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LWMgPHJlcGxhY2VhYmxlL2NvdW50LzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LUYgPHJlcGxhY2VhYmxlL2Zsb3dsYWJlbC88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1pIDxyZXBsYWNlYWJsZS9pbnRlcnZhbC88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1JIDxyZXBsYWNlYWJsZS9pbnRlcmZhY2UvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tbCA8cmVwbGFjZWFibGUvcHJlbG9hZC88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1tIDxyZXBsYWNlYWJsZS9tYXJrLzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LU0gPHJlcGxhY2VhYmxlL3BtdHVkaXNjX29wdGlvbi88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1OIDxyZXBsYWNlYWJsZS9ub2RlaW5mb19vcHRpb24vPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tdyA8cmVwbGFjZWFibGUvZGVhZGxpbmUvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tVyA8cmVwbGFjZWFibGUvdGltZW91dC88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1wIDxyZXBsYWNlYWJsZS9wYXR0ZXJuLzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LVEgPHJlcGxhY2VhYmxlL3Rvcy88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1zIDxyZXBsYWNlYWJsZS9wYWNrZXRzaXplLzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LVMgPHJlcGxhY2VhYmxlL3NuZGJ1Zi88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi10IDxyZXBsYWNlYWJsZS90dGwvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tVCA8cmVwbGFjZWFibGUvdGltZXN0YW1wIG9wdGlvbi88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiIHJlcD0icmVwZWF0Ij48cmVwbGFjZWFibGUvaG9wLzwvYXJnPgorPGFyZyBjaG9pY2U9InJlcSI+PHJlcGxhY2VhYmxlL2Rlc3RpbmF0aW9uLzwvYXJnPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKzxyZWZzZWN0MT48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+Cis8Y29tbWFuZC9waW5nLyB1c2VzIHRoZSBJQ01QIHByb3RvY29sJ3MgbWFuZGF0b3J5IEVDSE9fUkVRVUVTVAorZGF0YWdyYW0gdG8gZWxpY2l0IGFuIElDTVAgRUNIT19SRVNQT05TRSBmcm9tIGEgaG9zdCBvciBnYXRld2F5LgorRUNIT19SRVFVRVNUIGRhdGFncmFtcyAoYGBwaW5ncycnKSBoYXZlIGFuIElQIGFuZCBJQ01QCitoZWFkZXIsIGZvbGxvd2VkIGJ5IGEgPHN0cnVjdG5hbWUvc3RydWN0IHRpbWV2YWwvIGFuZCB0aGVuIGFuIGFyYml0cmFyeQorbnVtYmVyIG9mIGBgcGFkJycgYnl0ZXMgdXNlZCB0byBmaWxsIG91dCB0aGUgcGFja2V0LgorPC9wYXJhPgorPHBhcmE+Cis8Y29tbWFuZC9waW5nNi8gaXMgSVB2NiB2ZXJzaW9uIG9mIDxjb21tYW5kL3BpbmcvLCBhbmQgY2FuIGFsc28gc2VuZCBOb2RlIEluZm9ybWF0aW9uIFF1ZXJpZXMgKFJGQzQ2MjApLgorSW50ZXJtZWRpYXRlIDxyZXBsYWNlYWJsZS9ob3AvcyBtYXkgbm90IGJlIGFsbG93ZWQsIGJlY2F1c2UgSVB2NiBzb3VyY2Ugcm91dGluZyB3YXMgZGVwcmVjYXRlZCAoUkZDNTA5NSkuCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorCis8dmFyaWFibGVsaXN0PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLWEvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitBdWRpYmxlIHBpbmcuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLUEvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitBZGFwdGl2ZSBwaW5nLiBJbnRlcnBhY2tldCBpbnRlcnZhbCBhZGFwdHMgdG8gcm91bmQtdHJpcCB0aW1lLCBzbyB0aGF0CitlZmZlY3RpdmVseSBub3QgbW9yZSB0aGFuIG9uZSAob3IgbW9yZSwgaWYgcHJlbG9hZCBpcyBzZXQpIHVuYW5zd2VyZWQgcHJvYmUKK2lzIHByZXNlbnQgaW4gdGhlIG5ldHdvcmsuIE1pbmltYWwgaW50ZXJ2YWwgaXMgMjAwbXNlYyBmb3Igbm90IHN1cGVyLXVzZXIuCitPbiBuZXR3b3JrcyB3aXRoIGxvdyBydHQgdGhpcyBtb2RlIGlzIGVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gZmxvb2QgbW9kZS4gIAorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1iLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorQWxsb3cgcGluZ2luZyBhIGJyb2FkY2FzdCBhZGRyZXNzLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1CLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorRG8gbm90IGFsbG93IDxjb21tYW5kL3BpbmcvIHRvIGNoYW5nZSBzb3VyY2UgYWRkcmVzcyBvZiBwcm9iZXMuCitUaGUgYWRkcmVzcyBpcyBib3VuZCB0byBvbmUgc2VsZWN0ZWQgd2hlbiA8Y29tbWFuZC9waW5nLyBzdGFydHMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+PGFuY2hvciBpZD0icGluZy5jb3VudCI+LWMgPHJlcGxhY2VhYmxlL2NvdW50Lzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorU3RvcCBhZnRlciBzZW5kaW5nIDxyZXBsYWNlYWJsZS9jb3VudC8gRUNIT19SRVFVRVNUCitwYWNrZXRzLiBXaXRoIAorPGxpbmsgbGlua2VuZD0icGluZy5kZWFkbGluZSI+PHJlcGxhY2VhYmxlL2RlYWRsaW5lLzwvbGluaz4KK29wdGlvbiwgPGNvbW1hbmQvcGluZy8gd2FpdHMgZm9yCis8cmVwbGFjZWFibGUvY291bnQvIEVDSE9fUkVQTFkgcGFja2V0cywgdW50aWwgdGhlIHRpbWVvdXQgZXhwaXJlcy4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tZC88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NldCB0aGUgPGNvbnN0YW50L1NPX0RFQlVHLyBvcHRpb24gb24gdGhlIHNvY2tldCBiZWluZyB1c2VkLgorRXNzZW50aWFsbHksIHRoaXMgc29ja2V0IG9wdGlvbiBpcyBub3QgdXNlZCBieSBMaW51eCBrZXJuZWwuIAorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1ELzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorUHJpbnQgdGltZXN0YW1wICh1bml4IHRpbWUgKyBtaWNyb3NlY29uZHMgYXMgaW4gZ2V0dGltZW9mZGF5KSBiZWZvcmUKK2VhY2ggbGluZS4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tZi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0Zsb29kIHBpbmcuIEZvciBldmVyeSBFQ0hPX1JFUVVFU1Qgc2VudCBhIHBlcmlvZCBgYC4nJyBpcyBwcmludGVkLAord2hpbGUgZm9yIGV2ZXIgRUNIT19SRVBMWSByZWNlaXZlZCBhIGJhY2tzcGFjZSBpcyBwcmludGVkLgorVGhpcyBwcm92aWRlcyBhIHJhcGlkIGRpc3BsYXkgb2YgaG93IG1hbnkgcGFja2V0cyBhcmUgYmVpbmcgZHJvcHBlZC4KK0lmIGludGVydmFsIGlzIG5vdCBnaXZlbiwgaXQgc2V0cyBpbnRlcnZhbCB0byB6ZXJvIGFuZAorb3V0cHV0cyBwYWNrZXRzIGFzIGZhc3QgYXMgdGhleSBjb21lIGJhY2sgb3Igb25lIGh1bmRyZWQgdGltZXMgcGVyIHNlY29uZCwKK3doaWNoZXZlciBpcyBtb3JlLgorT25seSB0aGUgc3VwZXItdXNlciBtYXkgdXNlIHRoaXMgb3B0aW9uIHdpdGggemVybyBpbnRlcnZhbC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tRiA8cmVwbGFjZWFibGUvZmxvdyBsYWJlbC88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KKzxjb21tYW5kL3Bpbmc2LyBvbmx5LgorQWxsb2NhdGUgYW5kIHNldCAyMCBiaXQgZmxvdyBsYWJlbCAoaW4gaGV4KSBvbiBlY2hvIHJlcXVlc3QgcGFja2V0cy4KK0lmIHZhbHVlIGlzIHplcm8sIGtlcm5lbCBhbGxvY2F0ZXMgcmFuZG9tIGZsb3cgbGFiZWwuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLWgvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTaG93IGhlbHAuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LWkgPHJlcGxhY2VhYmxlL2ludGVydmFsLzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorV2FpdCA8cmVwbGFjZWFibGUvaW50ZXJ2YWwvIHNlY29uZHMgYmV0d2VlbiBzZW5kaW5nIGVhY2ggcGFja2V0LgorVGhlIGRlZmF1bHQgaXMgdG8gd2FpdCBmb3Igb25lIHNlY29uZCBiZXR3ZWVuIGVhY2ggcGFja2V0IG5vcm1hbGx5LAorb3Igbm90IHRvIHdhaXQgaW4gZmxvb2QgbW9kZS4gT25seSBzdXBlci11c2VyIG1heSBzZXQgaW50ZXJ2YWwKK3RvIHZhbHVlcyBsZXNzIDAuMiBzZWNvbmRzLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi1JIDxyZXBsYWNlYWJsZS9pbnRlcmZhY2UvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+Cis8cmVwbGFjZWFibGUvaW50ZXJmYWNlLyBpcyBlaXRoZXIgYW4gYWRkcmVzcywgb3IgYW4gaW50ZXJmYWNlIG5hbWUuCitJZiA8cmVwbGFjZWFibGUvaW50ZXJmYWNlLyBpcyBhbiBhZGRyZXNzLCBpdCBzZXRzIHNvdXJjZSBhZGRyZXNzCit0byBzcGVjaWZpZWQgaW50ZXJmYWNlIGFkZHJlc3MuCitJZiA8cmVwbGFjZWFibGUvaW50ZXJmYWNlLyBpbiBhbiBpbnRlcmZhY2UgbmFtZSwgaXQgc2V0cworc291cmNlIGludGVyZmFjZSB0byBzcGVjaWZpZWQgaW50ZXJmYWNlLgorRm9yIDxjb21tYW5kL3Bpbmc2Lywgd2hlbiBkb2luZyBwaW5nIHRvIGEgbGluay1sb2NhbCBzY29wZQorYWRkcmVzcywgbGluayBzcGVjaWZpY2F0aW9uIChieSB0aGUgJyUnLW5vdGF0aW9uIGluCis8cmVwbGFjZWFibGUvZGVzdGluYXRpb24vLCBvciBieSB0aGlzIG9wdGlvbikgaXMgcmVxdWlyZWQuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LWwgPHJlcGxhY2VhYmxlL3ByZWxvYWQvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitJZiA8cmVwbGFjZWFibGUvcHJlbG9hZC8gaXMgc3BlY2lmaWVkLAorPGNvbW1hbmQvcGluZy8gc2VuZHMgdGhhdCBtYW55IHBhY2tldHMgbm90IHdhaXRpbmcgZm9yIHJlcGx5LgorT25seSB0aGUgc3VwZXItdXNlciBtYXkgc2VsZWN0IHByZWxvYWQgbW9yZSB0aGFuIDMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLUwvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTdXBwcmVzcyBsb29wYmFjayBvZiBtdWx0aWNhc3QgcGFja2V0cy4gIFRoaXMgZmxhZyBvbmx5IGFwcGxpZXMgaWYgdGhlIHBpbmcKK2Rlc3RpbmF0aW9uIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LW0gPHJlcGxhY2VhYmxlL21hcmsvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+Cit1c2UgPHJlcGxhY2VhYmxlL21hcmsvIHRvIHRhZyB0aGUgcGFja2V0cyBnb2luZyBvdXQuIFRoaXMgaXMgdXNlZnVsCitmb3IgdmFyaWV0eSBvZiByZWFzb25zIHdpdGhpbiB0aGUga2VybmVsIHN1Y2ggYXMgdXNpbmcgcG9saWN5Cityb3V0aW5nIHRvIHNlbGVjdCBzcGVjaWZpYyBvdXRib3VuZCBwcm9jZXNzaW5nLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi1NIDxyZXBsYWNlYWJsZS9wbXR1ZGlzY19vcHQvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTZWxlY3QgUGF0aCBNVFUgRGlzY292ZXJ5IHN0cmF0ZWd5LgorPHJlcGxhY2VhYmxlL3BtdHVkaXNjX29wdGlvbi8gbWF5IGJlIGVpdGhlciA8cmVwbGFjZWFibGUvZG8vCisocHJvaGliaXQgZnJhZ21lbnRhdGlvbiwgZXZlbiBsb2NhbCBvbmUpLCAKKzxyZXBsYWNlYWJsZS93YW50LyAoZG8gUE1UVSBkaXNjb3ZlcnksIGZyYWdtZW50IGxvY2FsbHkgd2hlbiBwYWNrZXQgc2l6ZQoraXMgbGFyZ2UpLCBvciA8cmVwbGFjZWFibGUvZG9udC8gKGRvIG5vdCBzZXQgREYgZmxhZykuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LU4gPHJlcGxhY2VhYmxlL25vZGVpbmZvX29wdGlvbi88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KKzxjb21tYW5kL3Bpbmc2LyBvbmx5LgorU2VuZCBJQ01QdjYgTm9kZSBJbmZvcm1hdGlvbiBRdWVyaWVzIChSRkM0NjIwKSwgaW5zdGVhZCBvZiBFY2hvIFJlcXVlc3QuCisgICA8dmFyaWFibGVsaXN0PgorICAgIDx2YXJsaXN0ZW50cnk+CisgICAgIDx0ZXJtPjxvcHRpb24+aGVscDwvb3B0aW9uPjwvdGVybT4KKyAgICAgPGxpc3RpdGVtPjxwYXJhPlNob3cgaGVscCBmb3IgTkkgc3VwcG9ydC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgIDwvdmFyaWFibGVsaXN0PgorICAgPHZhcmlhYmxlbGlzdD4KKyAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT48b3B0aW9uPm5hbWU8L29wdGlvbj48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT48cGFyYT5RdWVyaWVzIGZvciBOb2RlIE5hbWVzLjwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvdmFybGlzdGVudHJ5PgorICAgPC92YXJpYWJsZWxpc3Q+CisgICA8dmFyaWFibGVsaXN0PgorICAgIDx2YXJsaXN0ZW50cnk+CisgICAgIDx0ZXJtPjxvcHRpb24+aXB2Njwvb3B0aW9uPjwvdGVybT4KKyAgICAgPGxpc3RpdGVtPjxwYXJhPlF1ZXJpZXMgZm9yIElQdjYgQWRkcmVzc2VzLiBUaGVyZSBhcmUgc2V2ZXJhbCBJUHY2IHNwZWNpZmljIGZsYWdzLgorICAgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPmlwdjYtZ2xvYmFsPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+UmVxdWVzdCBJUHY2IGdsb2JhbC1zY29wZSBhZGRyZXNzZXMuPC9wYXJhPjwvbGlzdGl0ZW0+IAorICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+aXB2Ni1zaXRlbG9jYWw8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT48cGFyYT5SZXF1ZXN0IElQdjYgc2l0ZS1sb2NhbCBhZGRyZXNzZXMuPC9wYXJhPjwvbGlzdGl0ZW0+IAorICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+aXB2Ni1saW5rbG9jYWw8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT48cGFyYT5SZXF1ZXN0IElQdjYgbGluay1sb2NhbCBhZGRyZXNzZXMuPC9wYXJhPjwvbGlzdGl0ZW0+IAorICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+aXB2Ni1hbGw8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT48cGFyYT5SZXF1ZXN0IElQdjYgYWRkcmVzc2VzIG9uIG90aGVyIGludGVyZmFjZXMuPC9wYXJhPjwvbGlzdGl0ZW0+IAorICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvdmFybGlzdGVudHJ5PgorICAgPC92YXJpYWJsZWxpc3Q+CisgICA8dmFyaWFibGVsaXN0PgorICAgIDx2YXJsaXN0ZW50cnk+CisgICAgIDx0ZXJtPjxvcHRpb24+aXB2NDwvb3B0aW9uPjwvdGVybT4KKyAgICAgPGxpc3RpdGVtPjxwYXJhPlF1ZXJpZXMgZm9yIElQdjQgQWRkcmVzc2VzLiAgVGhlcmUgaXMgb25lIElQdjQgc3BlY2lmaWMgZmxhZy4KKyAgICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj5pcHY0LWFsbDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPjxwYXJhPlJlcXVlc3QgSVB2NCBhZGRyZXNzZXMgb24gb3RoZXIgaW50ZXJmYWNlcy48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgIDwvdmFyaWFibGVsaXN0PgorICAgPHZhcmlhYmxlbGlzdD4KKyAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT48b3B0aW9uPnN1YmplY3QtaXB2Nj08cmVwbGFjZWFibGUvaXB2NmFkZHIvPC9vcHRpb24+PC90ZXJtPgorICAgICA8bGlzdGl0ZW0+PHBhcmE+SVB2NiBzdWJqZWN0IGFkZHJlc3MuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPC92YXJsaXN0ZW50cnk+CisgICA8L3ZhcmlhYmxlbGlzdD4KKyAgIDx2YXJpYWJsZWxpc3Q+CisgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgPHRlcm0+PG9wdGlvbj5zdWJqZWN0LWlwdjQ9PHJlcGxhY2VhYmxlL2lwdjRhZGRyLzwvb3B0aW9uPjwvdGVybT4KKyAgICAgPGxpc3RpdGVtPjxwYXJhPklQdjQgc3ViamVjdCBhZGRyZXNzLjwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvdmFybGlzdGVudHJ5PgorICAgPC92YXJpYWJsZWxpc3Q+CisgICA8dmFyaWFibGVsaXN0PgorICAgIDx2YXJsaXN0ZW50cnk+CisgICAgIDx0ZXJtPjxvcHRpb24+c3ViamVjdC1uYW1lPTxyZXBsYWNlYWJsZS9ub2RlbmFtZS88L29wdGlvbj48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT48cGFyYT5TdWJqZWN0IG5hbWUuICBJZiBpdCBjb250YWlucyBtb3JlIHRoYW4gb25lIGRvdCwKKwlmdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUgaXMgYXNzdW1lZC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgIDwvdmFyaWFibGVsaXN0PgorICAgPHZhcmlhYmxlbGlzdD4KKyAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT48b3B0aW9uPnN1YmplY3QtZnFkbj08cmVwbGFjZWFibGUvbm9kZW5hbWUvPC9vcHRpb24+PC90ZXJtPgorICAgICA8bGlzdGl0ZW0+PHBhcmE+U3ViamVjdCBuYW1lLiAgRnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGlzCisJYWx3YXlzIGFzc3VtZWQuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPC92YXJsaXN0ZW50cnk+CisgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tbi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK051bWVyaWMgb3V0cHV0IG9ubHkuCitObyBhdHRlbXB0IHdpbGwgYmUgbWFkZSB0byBsb29rdXAgc3ltYm9saWMgbmFtZXMgZm9yIGhvc3QgYWRkcmVzc2VzLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1PLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorUmVwb3J0IG91dHN0YW5kaW5nIElDTVAgRUNITyByZXBseSBiZWZvcmUgc2VuZGluZyBuZXh0IHBhY2tldC4KK1RoaXMgaXMgdXNlZnVsIHRvZ2V0aGVyIHdpdGggdGhlIHRpbWVzdGFtcCA8b3B0aW9uPi1EPC9vcHRpb24+IHRvCitsb2cgb3V0cHV0IHRvIGEgZGlhZ25vc3RpYyBmaWxlIGFuZCBzZWFyY2ggZm9yIG1pc3NpbmcgYW5zd2Vycy4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tcCA8cmVwbGFjZWFibGUvcGF0dGVybi88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1lvdSBtYXkgc3BlY2lmeSB1cCB0byAxNiBgYHBhZCcnIGJ5dGVzIHRvIGZpbGwgb3V0IHRoZSBwYWNrZXQgeW91IHNlbmQuCitUaGlzIGlzIHVzZWZ1bCBmb3IgZGlhZ25vc2luZyBkYXRhLWRlcGVuZGVudCBwcm9ibGVtcyBpbiBhIG5ldHdvcmsuCitGb3IgZXhhbXBsZSwgPG9wdGlvbj4tcCBmZjwvb3B0aW9uPiB3aWxsIGNhdXNlIHRoZSBzZW50IHBhY2tldAordG8gYmUgZmlsbGVkIHdpdGggYWxsIG9uZXMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLXEvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitRdWlldCBvdXRwdXQuCitOb3RoaW5nIGlzIGRpc3BsYXllZCBleGNlcHQgdGhlIHN1bW1hcnkgbGluZXMgYXQgc3RhcnR1cCB0aW1lIGFuZAord2hlbiBmaW5pc2hlZC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tUSA8cmVwbGFjZWFibGUvdG9zLzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorCVNldCBRdWFsaXR5IG9mIFNlcnZpY2UgLXJlbGF0ZWQgYml0cyBpbiBJQ01QIGRhdGFncmFtcy4KKwk8cmVwbGFjZWFibGUvdG9zLyBjYW4gYmUgZGVjaW1hbCAoPGNvbW1hbmQvcGluZy8gb25seSkgb3IgaGV4IG51bWJlci4KKwk8L3BhcmE+CisJPHBhcmE+CisJSW4gUkZDMjQ3NCwgdGhlc2UgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyA4LWJpdCBEaWZmZXJlbnRpYXRlZAorCVNlcnZpY2VzIChEUyksIGNvbnNpc3Rpbmcgb2Y6IGJpdHMgMC0xICgyIGxvd2VzdCBiaXRzKSBvZiBzZXBhcmF0ZQorCWRhdGEsIGFuZCBiaXRzIDItNyAoaGlnaGVzdCA2IGJpdHMpIG9mIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzCisJQ29kZXBvaW50IChEU0NQKS4gIEluIFJGQzI0ODEgYW5kIFJGQzMxNjgsIGJpdHMgMC0xIGFyZSB1c2VkIGZvciBFQ04uCisJPC9wYXJhPgorCTxwYXJhPgorCUhpc3RvcmljYWxseSAoUkZDMTM0OSwgb2Jzb2xldGVkIGJ5IFJGQzI0NzQpLCB0aGVzZSB3ZXJlIGludGVycHJldGVkCisJYXM6IGJpdCAwIChsb3dlc3QgYml0KSBmb3IgcmVzZXJ2ZWQgKGN1cnJlbnRseSBiZWluZyByZWRlZmluZWQgYXMKKwljb25nZXN0aW9uIGNvbnRyb2wpLCAxLTQgZm9yIFR5cGUgb2YgU2VydmljZSBhbmQgYml0cyA1LTcKKwkoaGlnaGVzdCBiaXRzKSBmb3IgUHJlY2VkZW5jZS4KKyAgIDwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1yLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorQnlwYXNzIHRoZSBub3JtYWwgcm91dGluZyB0YWJsZXMgYW5kIHNlbmQgZGlyZWN0bHkgdG8gYSBob3N0IG9uIGFuIGF0dGFjaGVkCitpbnRlcmZhY2UuCitJZiB0aGUgaG9zdCBpcyBub3Qgb24gYSBkaXJlY3RseS1hdHRhY2hlZCBuZXR3b3JrLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KK1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHBpbmcgYSBsb2NhbCBob3N0IHRocm91Z2ggYW4gaW50ZXJmYWNlCit0aGF0IGhhcyBubyByb3V0ZSB0aHJvdWdoIGl0IHByb3ZpZGVkIHRoZSBvcHRpb24gPG9wdGlvbi8tSS8gaXMgYWxzbwordXNlZC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tUi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KKzxjb21tYW5kL3BpbmcvIG9ubHkuCitSZWNvcmQgcm91dGUuCitJbmNsdWRlcyB0aGUgUkVDT1JEX1JPVVRFIG9wdGlvbiBpbiB0aGUgRUNIT19SRVFVRVNUCitwYWNrZXQgYW5kIGRpc3BsYXlzIHRoZSByb3V0ZSBidWZmZXIgb24gcmV0dXJuZWQgcGFja2V0cy4KK05vdGUgdGhhdCB0aGUgSVAgaGVhZGVyIGlzIG9ubHkgbGFyZ2UgZW5vdWdoIGZvciBuaW5lIHN1Y2ggcm91dGVzLgorTWFueSBob3N0cyBpZ25vcmUgb3IgZGlzY2FyZCB0aGlzIG9wdGlvbi4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tcyA8cmVwbGFjZWFibGUvcGFja2V0c2l6ZS88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdG8gYmUgc2VudC4gIAorVGhlIGRlZmF1bHQgaXMgNTYsIHdoaWNoIHRyYW5zbGF0ZXMgaW50byA2NCBJQ01QCitkYXRhIGJ5dGVzIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgOCBieXRlcyBvZiBJQ01QIGhlYWRlciBkYXRhLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi1TIDxyZXBsYWNlYWJsZS9zbmRidWYvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTZXQgc29ja2V0IHNuZGJ1Zi4gSWYgbm90IHNwZWNpZmllZCwgaXQgaXMgc2VsZWN0ZWQgdG8gYnVmZmVyCitub3QgbW9yZSB0aGFuIG9uZSBwYWNrZXQuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LXQgPHJlcGxhY2VhYmxlL3R0bC88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KKzxjb21tYW5kL3BpbmcvIG9ubHkuCitTZXQgdGhlIElQIFRpbWUgdG8gTGl2ZS4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tVCA8cmVwbGFjZWFibGUvdGltZXN0YW1wIG9wdGlvbi88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NldCBzcGVjaWFsIElQIHRpbWVzdGFtcCBvcHRpb25zLgorPHJlcGxhY2VhYmxlL3RpbWVzdGFtcCBvcHRpb24vIG1heSBiZSBlaXRoZXIgCis8cmVwbGFjZWFibGUvdHNvbmx5LyAob25seSB0aW1lc3RhbXBzKSwgCis8cmVwbGFjZWFibGUvdHNhbmRhZGRyLyAodGltZXN0YW1wcyBhbmQgYWRkcmVzc2VzKSBvciAKKzxyZXBsYWNlYWJsZS90c3ByZXNwZWMgaG9zdDEgW2hvc3QyIFtob3N0MyBbaG9zdDRdXV0vCisodGltZXN0YW1wIHByZXNwZWNpZmllZCBob3BzKS4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tVS88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1ByaW50IGZ1bGwgdXNlci10by11c2VyIGxhdGVuY3kgKHRoZSBvbGQgYmVoYXZpb3VyKS4gTm9ybWFsbHkKKzxjb21tYW5kL3BpbmcvCitwcmludHMgbmV0d29yayByb3VuZCB0cmlwIHRpbWUsIHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQKK2YuZS4gZHVlIHRvIEROUyBmYWlsdXJlcy4gCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLXYvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitWZXJib3NlIG91dHB1dC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tVi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1Nob3cgdmVyc2lvbiBhbmQgZXhpdC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj48YW5jaG9yIGlkPSJwaW5nLmRlYWRsaW5lIj4tdyA8cmVwbGFjZWFibGUvZGVhZGxpbmUvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTcGVjaWZ5IGEgdGltZW91dCwgaW4gc2Vjb25kcywgYmVmb3JlCis8Y29tbWFuZC9waW5nLworZXhpdHMgcmVnYXJkbGVzcyBvZiBob3cgbWFueQorcGFja2V0cyBoYXZlIGJlZW4gc2VudCBvciByZWNlaXZlZC4gSW4gdGhpcyBjYXNlCis8Y29tbWFuZC9waW5nLworZG9lcyBub3Qgc3RvcCBhZnRlcgorPGxpbmsgbGlua2VuZD0icGluZy5jb3VudCI+PHJlcGxhY2VhYmxlL2NvdW50LzwvbGluaz4KK3BhY2tldCBhcmUgc2VudCwgaXQgd2FpdHMgZWl0aGVyIGZvcgorPGxpbmsgbGlua2VuZD0icGluZy5kZWFkbGluZSI+PHJlcGxhY2VhYmxlL2RlYWRsaW5lLzwvbGluaz4KK2V4cGlyZSBvciB1bnRpbAorPGxpbmsgbGlua2VuZD0icGluZy5jb3VudCI+PHJlcGxhY2VhYmxlL2NvdW50LzwvbGluaz4KK3Byb2JlcyBhcmUgYW5zd2VyZWQgb3IgZm9yIHNvbWUgZXJyb3Igbm90aWZpY2F0aW9uIGZyb20gbmV0d29yay4gICAKKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tVyA8cmVwbGFjZWFibGUvdGltZW91dC88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1RpbWUgdG8gd2FpdCBmb3IgYSByZXNwb25zZSwgaW4gc2Vjb25kcy4gVGhlIG9wdGlvbiBhZmZlY3RzIG9ubHkgdGltZW91dAoraW4gYWJzZW5jZSBvZiBhbnkgcmVzcG9uc2VzLCBvdGhlcndpc2UgPGNvbW1hbmQvcGluZy8gd2FpdHMgZm9yIHR3byBSVFRzLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT4KK1doZW4gdXNpbmcgPGNvbW1hbmQvcGluZy8gZm9yIGZhdWx0IGlzb2xhdGlvbiwgaXQgc2hvdWxkIGZpcnN0IGJlIHJ1bgorb24gdGhlIGxvY2FsIGhvc3QsIHRvIHZlcmlmeSB0aGF0IHRoZSBsb2NhbCBuZXR3b3JrIGludGVyZmFjZSBpcyB1cAorYW5kIHJ1bm5pbmcuIFRoZW4sIGhvc3RzIGFuZCBnYXRld2F5cyBmdXJ0aGVyIGFuZCBmdXJ0aGVyIGF3YXkgc2hvdWxkIGJlCitgYHBpbmdlZCcnLiBSb3VuZC10cmlwIHRpbWVzIGFuZCBwYWNrZXQgbG9zcyBzdGF0aXN0aWNzIGFyZSBjb21wdXRlZC4KK0lmIGR1cGxpY2F0ZSBwYWNrZXRzIGFyZSByZWNlaXZlZCwgdGhleSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBwYWNrZXQKK2xvc3MgY2FsY3VsYXRpb24sIGFsdGhvdWdoIHRoZSByb3VuZCB0cmlwIHRpbWUgb2YgdGhlc2UgcGFja2V0cyBpcyB1c2VkCitpbiBjYWxjdWxhdGluZyB0aGUgbWluaW11bS9hdmVyYWdlL21heGltdW0gcm91bmQtdHJpcCB0aW1lIG51bWJlcnMuCitXaGVuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBhY2tldHMgaGF2ZSBiZWVuIHNlbnQgKGFuZCByZWNlaXZlZCkgb3IKK2lmIHRoZSBwcm9ncmFtIGlzIHRlcm1pbmF0ZWQgd2l0aCBhCis8Y29uc3RhbnQvU0lHSU5ULywgYSBicmllZiBzdW1tYXJ5IGlzIGRpc3BsYXllZC4gU2hvcnRlciBjdXJyZW50IHN0YXRpc3RpY3MKK2NhbiBiZSBvYnRhaW5lZCB3aXRob3V0IHRlcm1pbmF0aW9uIG9mIHByb2Nlc3Mgd2l0aCBzaWduYWwKKzxjb25zdGFudC9TSUdRVUlULy4KKzwvcGFyYT4KKworPHBhcmE+CitJZiA8Y29tbWFuZC9waW5nLyBkb2VzIG5vdCByZWNlaXZlIGFueSByZXBseSBwYWNrZXRzIGF0IGFsbCBpdCB3aWxsCitleGl0IHdpdGggY29kZSAxLiBJZiBhIHBhY2tldCAKKzxsaW5rIGxpbmtlbmQ9InBpbmcuY291bnQiPjxyZXBsYWNlYWJsZS9jb3VudC88L2xpbms+CithbmQKKzxsaW5rIGxpbmtlbmQ9InBpbmcuZGVhZGxpbmUiPjxyZXBsYWNlYWJsZS9kZWFkbGluZS88L2xpbms+CithcmUgYm90aCBzcGVjaWZpZWQsIGFuZCBmZXdlciB0aGFuCis8bGluayBsaW5rZW5kPSJwaW5nLmNvdW50Ij48cmVwbGFjZWFibGUvY291bnQvPC9saW5rPgorcGFja2V0cyBhcmUgcmVjZWl2ZWQgYnkgdGhlIHRpbWUgdGhlCis8bGluayBsaW5rZW5kPSJwaW5nLmRlYWRsaW5lIj48cmVwbGFjZWFibGUvZGVhZGxpbmUvPC9saW5rPgoraGFzIGFycml2ZWQsIGl0IHdpbGwgYWxzbyBleGl0IHdpdGggY29kZSAxLiAKK09uIG90aGVyIGVycm9yIGl0IGV4aXRzIHdpdGggY29kZSAyLiBPdGhlcndpc2UgaXQgZXhpdHMgd2l0aCBjb2RlIDAuIFRoaXMKK21ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgZXhpdCBjb2RlIHRvIHNlZSBpZiBhIGhvc3QgaXMgYWxpdmUgb3IKK25vdC4KKzwvcGFyYT4KKworCis8cGFyYT4KK1RoaXMgcHJvZ3JhbSBpcyBpbnRlbmRlZCBmb3IgdXNlIGluIG5ldHdvcmsgdGVzdGluZywgbWVhc3VyZW1lbnQgYW5kCittYW5hZ2VtZW50LgorQmVjYXVzZSBvZiB0aGUgbG9hZCBpdCBjYW4gaW1wb3NlIG9uIHRoZSBuZXR3b3JrLCBpdCBpcyB1bndpc2UgdG8gdXNlCis8Y29tbWFuZC9waW5nLyBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbnMgb3IgZnJvbSBhdXRvbWF0ZWQgc2NyaXB0cy4KKzwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworCis8cmVmc2VjdDE+PHRpdGxlPklDTVAgUEFDS0VUIERFVEFJTFM8L3RpdGxlPgorCis8cGFyYT4KK0FuIElQIGhlYWRlciB3aXRob3V0IG9wdGlvbnMgaXMgMjAgYnl0ZXMuCitBbiBJQ01QIEVDSE9fUkVRVUVTVCBwYWNrZXQgY29udGFpbnMgYW4gYWRkaXRpb25hbCA4IGJ5dGVzIHdvcnRoCitvZiBJQ01QIGhlYWRlciBmb2xsb3dlZCBieSBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIGRhdGEuCitXaGVuIGEgPHJlcGxhY2VhYmxlL3BhY2tldHNpemUvIGlzIGdpdmVuLCB0aGlzIGluZGljYXRlZCB0aGUgc2l6ZSBvZiB0aGlzCitleHRyYSBwaWVjZSBvZiBkYXRhICh0aGUgZGVmYXVsdCBpcyA1NikuIFRodXMgdGhlIGFtb3VudCBvZiBkYXRhIHJlY2VpdmVkCitpbnNpZGUgb2YgYW4gSVAgcGFja2V0IG9mIHR5cGUgSUNNUCBFQ0hPX1JFUExZIHdpbGwgYWx3YXlzIGJlIDggYnl0ZXMKK21vcmUgdGhhbiB0aGUgcmVxdWVzdGVkIGRhdGEgc3BhY2UgKHRoZSBJQ01QIGhlYWRlcikuCis8L3BhcmE+CisKKzxwYXJhPgorSWYgdGhlIGRhdGEgc3BhY2UgaXMgYXQgbGVhc3Qgb2Ygc2l6ZSBvZiA8c3RydWN0bmFtZS9zdHJ1Y3QgdGltZXZhbC8KKzxjb21tYW5kL3BpbmcvIHVzZXMgdGhlIGJlZ2lubmluZyBieXRlcyBvZiB0aGlzIHNwYWNlIHRvIGluY2x1ZGUKK2EgdGltZXN0YW1wIHdoaWNoIGl0IHVzZXMgaW4gdGhlIGNvbXB1dGF0aW9uIG9mIHJvdW5kIHRyaXAgdGltZXMuCitJZiB0aGUgZGF0YSBzcGFjZSBpcyBzaG9ydGVyLCBubyByb3VuZCB0cmlwIHRpbWVzIGFyZSBnaXZlbi4KKzwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5EVVBMSUNBVEUgQU5EIERBTUFHRUQgUEFDS0VUUzwvdGl0bGU+CisKKzxwYXJhPgorPGNvbW1hbmQvcGluZy8gd2lsbCByZXBvcnQgZHVwbGljYXRlIGFuZCBkYW1hZ2VkIHBhY2tldHMuCitEdXBsaWNhdGUgcGFja2V0cyBzaG91bGQgbmV2ZXIgb2NjdXIsIGFuZCBzZWVtIHRvIGJlIGNhdXNlZCBieQoraW5hcHByb3ByaWF0ZSBsaW5rLWxldmVsIHJldHJhbnNtaXNzaW9ucy4KK0R1cGxpY2F0ZXMgbWF5IG9jY3VyIGluIG1hbnkgc2l0dWF0aW9ucyBhbmQgYXJlIHJhcmVseSAoaWYgZXZlcikgYQorZ29vZCBzaWduLCBhbHRob3VnaCB0aGUgcHJlc2VuY2Ugb2YgbG93IGxldmVscyBvZiBkdXBsaWNhdGVzIG1heSBub3QKK2Fsd2F5cyBiZSBjYXVzZSBmb3IgYWxhcm0uCis8L3BhcmE+CisKKzxwYXJhPgorRGFtYWdlZCBwYWNrZXRzIGFyZSBvYnZpb3VzbHkgc2VyaW91cyBjYXVzZSBmb3IgYWxhcm0gYW5kIG9mdGVuCitpbmRpY2F0ZSBicm9rZW4gaGFyZHdhcmUgc29tZXdoZXJlIGluIHRoZQorPGNvbW1hbmQvcGluZy8gcGFja2V0J3MgcGF0aCAoaW4gdGhlIG5ldHdvcmsgb3IgaW4gdGhlIGhvc3RzKS4KKzwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5UUllJTkcgRElGRkVSRU5UIERBVEEgUEFUVEVSTlM8L3RpdGxlPgorCis8cGFyYT4KK1RoZSAoaW50ZXIpbmV0d29yayBsYXllciBzaG91bGQgbmV2ZXIgdHJlYXQgcGFja2V0cyBkaWZmZXJlbnRseSBkZXBlbmRpbmcKK29uIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBwb3J0aW9uLgorVW5mb3J0dW5hdGVseSwgZGF0YS1kZXBlbmRlbnQgcHJvYmxlbXMgaGF2ZSBiZWVuIGtub3duIHRvIHNuZWFrIGludG8KK25ldHdvcmtzIGFuZCByZW1haW4gdW5kZXRlY3RlZCBmb3IgbG9uZyBwZXJpb2RzIG9mIHRpbWUuCitJbiBtYW55IGNhc2VzIHRoZSBwYXJ0aWN1bGFyIHBhdHRlcm4gdGhhdCB3aWxsIGhhdmUgcHJvYmxlbXMgaXMgc29tZXRoaW5nCit0aGF0IGRvZXNuJ3QgaGF2ZSBzdWZmaWNpZW50IGBgdHJhbnNpdGlvbnMnJywgc3VjaCBhcyBhbGwgb25lcyBvciBhbGwKK3plcm9zLCBvciBhIHBhdHRlcm4gcmlnaHQgYXQgdGhlIGVkZ2UsIHN1Y2ggYXMgYWxtb3N0IGFsbCB6ZXJvcy4KK0l0IGlzbid0IG5lY2Vzc2FyaWx5IGVub3VnaCB0byBzcGVjaWZ5IGEgZGF0YSBwYXR0ZXJuIG9mIGFsbCB6ZXJvcyAoZm9yCitleGFtcGxlKSBvbiB0aGUgY29tbWFuZCBsaW5lIGJlY2F1c2UgdGhlIHBhdHRlcm4gdGhhdCBpcyBvZiBpbnRlcmVzdCBpcworYXQgdGhlIGRhdGEgbGluayBsZXZlbCwgYW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB3aGF0IHlvdSB0eXBlIGFuZAord2hhdCB0aGUgY29udHJvbGxlcnMgdHJhbnNtaXQgY2FuIGJlIGNvbXBsaWNhdGVkLgorPC9wYXJhPgorCis8cGFyYT4KK1RoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSBhIGRhdGEtZGVwZW5kZW50IHByb2JsZW0geW91IHdpbGwgcHJvYmFibHkKK2hhdmUgdG8gZG8gYSBsb3Qgb2YgdGVzdGluZyB0byBmaW5kIGl0LgorSWYgeW91IGFyZSBsdWNreSwgeW91IG1heSBtYW5hZ2UgdG8gZmluZCBhIGZpbGUgdGhhdCBlaXRoZXIgY2FuJ3QgYmUgc2VudAorYWNyb3NzIHlvdXIgbmV0d29yayBvciB0aGF0IHRha2VzIG11Y2ggbG9uZ2VyIHRvIHRyYW5zZmVyIHRoYW4gb3RoZXIKK3NpbWlsYXIgbGVuZ3RoIGZpbGVzLgorWW91IGNhbiB0aGVuIGV4YW1pbmUgdGhpcyBmaWxlIGZvciByZXBlYXRlZCBwYXR0ZXJucyB0aGF0IHlvdSBjYW4gdGVzdAordXNpbmcgdGhlIDxvcHRpb24vLXAvIG9wdGlvbiBvZiA8Y29tbWFuZC9waW5nLy4KKzwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5UVEwgREVUQUlMUzwvdGl0bGU+CisKKzxwYXJhPgorVGhlIFRUTCB2YWx1ZSBvZiBhbiBJUCBwYWNrZXQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgSVAgcm91dGVycwordGhhdCB0aGUgcGFja2V0IGNhbiBnbyB0aHJvdWdoIGJlZm9yZSBiZWluZyB0aHJvd24gYXdheS4KK0luIGN1cnJlbnQgcHJhY3RpY2UgeW91IGNhbiBleHBlY3QgZWFjaCByb3V0ZXIgaW4gdGhlIEludGVybmV0IHRvIGRlY3JlbWVudAordGhlIFRUTCBmaWVsZCBieSBleGFjdGx5IG9uZS4KKzwvcGFyYT4KKworPHBhcmE+CitUaGUgVENQL0lQIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgdGhlIFRUTCBmaWVsZCBmb3IgVENQCitwYWNrZXRzIHNob3VsZCBiZSBzZXQgdG8gNjAsIGJ1dCBtYW55IHN5c3RlbXMgdXNlIHNtYWxsZXIgdmFsdWVzCisoNC4zIEJTRCB1c2VzIDMwLCA0LjIgdXNlZCAxNSkuCis8L3BhcmE+CisKKzxwYXJhPgorVGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyAyNTUsIGFuZCBtb3N0IFVuaXggc3lzdGVtcyBzZXQKK3RoZSBUVEwgZmllbGQgb2YgSUNNUCBFQ0hPX1JFUVVFU1QgcGFja2V0cyB0byAyNTUuCitUaGlzIGlzIHdoeSB5b3Ugd2lsbCBmaW5kIHlvdSBjYW4gYGBwaW5nJycgc29tZSBob3N0cywgYnV0IG5vdCByZWFjaCB0aGVtCit3aXRoCis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL3RlbG5ldC88bWFudm9sbnVtLzEvPC9jaXRlcmVmZW50cnk+CitvcgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9mdHAvPG1hbnZvbG51bS8xLzwvY2l0ZXJlZmVudHJ5Pi4KKzwvcGFyYT4KKworPHBhcmE+CitJbiBub3JtYWwgb3BlcmF0aW9uIHBpbmcgcHJpbnRzIHRoZSBUVEwgdmFsdWUgZnJvbSB0aGUgcGFja2V0IGl0IHJlY2VpdmVzLgorV2hlbiBhIHJlbW90ZSBzeXN0ZW0gcmVjZWl2ZXMgYSBwaW5nIHBhY2tldCwgaXQgY2FuIGRvIG9uZSBvZiB0aHJlZSB0aGluZ3MKK3dpdGggdGhlIFRUTCBmaWVsZCBpbiBpdHMgcmVzcG9uc2U6Cis8L3BhcmE+CisKKzxpdGVtaXplZGxpc3Q+CisgPGxpc3RpdGVtPjxwYXJhPgorTm90IGNoYW5nZSBpdDsgdGhpcyBpcyB3aGF0IEJlcmtlbGV5IFVuaXggc3lzdGVtcyBkaWQgYmVmb3JlIHRoZQorNC4zQlNEIFRhaG9lIHJlbGVhc2UuIEluIHRoaXMgY2FzZSB0aGUgVFRMIHZhbHVlIGluIHRoZSByZWNlaXZlZCBwYWNrZXQKK3dpbGwgYmUgMjU1IG1pbnVzIHRoZSBudW1iZXIgb2Ygcm91dGVycyBpbiB0aGUgcm91bmQtdHJpcCBwYXRoLgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KK1NldCBpdCB0byAyNTU7IHRoaXMgaXMgd2hhdCBjdXJyZW50IEJlcmtlbGV5IFVuaXggc3lzdGVtcyBkby4KK0luIHRoaXMgY2FzZSB0aGUgVFRMIHZhbHVlIGluIHRoZSByZWNlaXZlZCBwYWNrZXQgd2lsbCBiZSAyNTUgbWludXMgdGhlCitudW1iZXIgb2Ygcm91dGVycyBpbiB0aGUgcGF0aCA8ZW1waGFzaXMvZnJvbS8KK3RoZSByZW1vdGUgc3lzdGVtIDxlbXBoYXNpcy90by8gdGhlIDxjb21tYW5kL3BpbmcvaW5nIGhvc3QuCisgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPGxpc3RpdGVtPjxwYXJhPgorU2V0IGl0IHRvIHNvbWUgb3RoZXIgdmFsdWUuIFNvbWUgbWFjaGluZXMgdXNlIHRoZSBzYW1lIHZhbHVlIGZvcgorSUNNUCBwYWNrZXRzIHRoYXQgdGhleSB1c2UgZm9yIFRDUCBwYWNrZXRzLCBmb3IgZXhhbXBsZSBlaXRoZXIgMzAgb3IgNjAuCitPdGhlcnMgbWF5IHVzZSBjb21wbGV0ZWx5IHdpbGQgdmFsdWVzLgorIDwvcGFyYT48L2xpc3RpdGVtPgorPC9pdGVtaXplZGxpc3Q+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+QlVHUzwvdGl0bGU+CisKKzxpdGVtaXplZGxpc3Q+CisgPGxpc3RpdGVtPjxwYXJhPgorTWFueSBIb3N0cyBhbmQgR2F0ZXdheXMgaWdub3JlIHRoZSBSRUNPUkRfUk9VVEUgb3B0aW9uLgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KK1RoZSBtYXhpbXVtIElQIGhlYWRlciBsZW5ndGggaXMgdG9vIHNtYWxsIGZvciBvcHRpb25zIGxpa2UKK1JFQ09SRF9ST1VURSB0byBiZSBjb21wbGV0ZWx5IHVzZWZ1bC4KK1RoZXJlJ3Mgbm90IG11Y2ggdGhhdCBjYW4gYmUgZG9uZSBhYm91dCB0aGlzLCBob3dldmVyLgorIDwvcGFyYT48L2xpc3RpdGVtPgorIDxsaXN0aXRlbT48cGFyYT4KK0Zsb29kIHBpbmdpbmcgaXMgbm90IHJlY29tbWVuZGVkIGluIGdlbmVyYWwsIGFuZCBmbG9vZCBwaW5naW5nIHRoZQorYnJvYWRjYXN0IGFkZHJlc3Mgc2hvdWxkIG9ubHkgYmUgZG9uZSB1bmRlciB2ZXJ5IGNvbnRyb2xsZWQgY29uZGl0aW9ucy4KKyA8L3BhcmE+PC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPlNFRSBBTFNPPC90aXRsZT4KKzxwYXJhPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9uZXRzdGF0LzxtYW52b2xudW0vMS88L2NpdGVyZWZlbnRyeT4sCis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL2lmY29uZmlnLzxtYW52b2xudW0vOC88L2NpdGVyZWZlbnRyeT4uCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkhJU1RPUlk8L3RpdGxlPgorPHBhcmE+CitUaGUgPGNvbW1hbmQvcGluZy8gY29tbWFuZCBhcHBlYXJlZCBpbiA0LjNCU0QuCis8L3BhcmE+Cis8cGFyYT4KK1RoZSB2ZXJzaW9uIGRlc2NyaWJlZCBoZXJlIGlzIGl0cyBkZXNjZW5kYW50IHNwZWNpZmljIHRvIExpbnV4LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5TRUNVUklUWTwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL3BpbmcvIHJlcXVpcmVzIDxjb25zdGFudC9DQVBfTkVUX1JBVy8gY2FwYWJpbGl0eQordG8gYmUgZXhlY3V0ZWQuIEl0IG1heSBiZSB1c2VkIGFzIHNldC11aWQgcm9vdC4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+QVZBSUxBQklMSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvcGluZy8gaXMgcGFydCBvZiA8ZmlsZW5hbWUvaXB1dGlscy8gcGFja2FnZQorYW5kIHRoZSBsYXRlc3QgdmVyc2lvbnMgYXJlICBhdmFpbGFibGUgaW4gc291cmNlIGZvcm0gYXQKKzx1bGluayB1cmw9Imh0dHA6Ly93d3cuc2tidWZmLm5ldC9pcHV0aWxzL2lwdXRpbHMtY3VycmVudC50YXIuYnoyIj4KK2h0dHA6Ly93d3cuc2tidWZmLm5ldC9pcHV0aWxzL2lwdXRpbHMtY3VycmVudC50YXIuYnoyPC91bGluaz4uCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8IVtJR05PUkVbCis8cmVmc2VjdDE+PHRpdGxlPkNPUFlJTkc8L3RpdGxlPgorPHBhcmE+Cis8bGl0ZXJhbGxheW91dD4KK0NvcHlyaWdodCAoYykgMTk4OSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorTWlrZSBNdXVzcy4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiszLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKwlUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCis0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCitPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCitMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCitTVUNIIERBTUFHRS4KKzwvbGl0ZXJhbGxheW91dD4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CitdXT4KKworCis8L3JlZmVudHJ5PgorCmRpZmYgLS1naXQgYS9pcHV0aWxzL2RvYy9yYXJwZC5zZ21sIGIvaXB1dGlscy9kb2MvcmFycGQuc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg2ZWYwCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvcmFycGQuc2dtbApAQCAtMCwwICsxLDE3MCBAQAorPHJlZmVudHJ5IGlkPSJyYXJwZCI+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+cmFycGQ8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjg8L21hbnZvbG51bT4KKzxyZWZtaXNjaW5mbz5pcHV0aWxzLSZzbmFwc2hvdDs8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorCis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPnJhcnBkPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+YW5zd2VyIFJBUlAgUkVRVUVTVHM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+CisKKzxyZWZzeW5vcHNpc2Rpdj4KKzxjbWRzeW5vcHNpcz4KKzxjb21tYW5kPmFycGluZzwvY29tbWFuZD4KKzxhcmcgY2hvaWNlPSJvcHQiPjxvcHRpb24+LWFBdmRlPC9vcHRpb24+PC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tYiA8cmVwbGFjZWFibGUvYm9vdGRpci88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPjxyZXBsYWNlYWJsZS9pbnRlcmZhY2UvPC9hcmc+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworPHJlZnNlY3QxPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT4KK0xpc3RlbnMKKzx1bGluayB1cmw9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9yZmMvcmZjOTAzLnR4dCI+UkFSUDwvdWxpbms+CityZXF1ZXN0cyBmcm9tIGNsaWVudHMuIFByb3ZpZGVkIE1BQyBhZGRyZXNzIG9mIGNsaWVudAoraXMgZm91bmQgaW4gPGZpbGVuYW1lPi9ldGMvZXRoZXJzPC9maWxlbmFtZT4gZGF0YWJhc2UgYW5kCitvYnRhaW5lZCBob3N0IG5hbWUgaXMgcmVzb2x2YWJsZSB0byBhbiBJUCBhZGRyZXNzIGFwcHJvcHJpYXRlCitmb3IgYXR0YWNoZWQgbmV0d29yaywgPGNvbW1hbmQvcmFycGQvIGFuc3dlcnMgdG8gY2xpZW50IHdpdGggUkFSUEQKK3JlcGx5IGNhcnJ5aW5nIGFuIElQIGFkZHJlc3MuCis8L3BhcmE+Cis8cGFyYT4KK1RvIGFsbG93IG11bHRpcGxlIGJvb3Qgc2VydmVycyBvbiB0aGUgbmV0d29yayA8Y29tbWFuZC9yYXJwZC8KK29wdGlvbmFsbHkgY2hlY2tzIGZvciBwcmVzZW5jZSBTdW4tbGlrZSBib290YWJsZSBpbWFnZSBpbiBURlRQIGRpcmVjdG9yeS4KK0l0IHNob3VsZCBoYXZlIGZvcm0gPHVzZXJpbnB1dC9IZXhhZGVjaW1hbF9JUC5BUkNILywgZi5lLiB0byBsb2FkCitzcGFyYyAxOTMuMjMzLjcuOTggPGZpbGVuYW1lL0MxRTkwNzYyLlNVTjRNLyBpcyBsaW5rZWQgdG8KK2FuIGltYWdlIGFwcHJvcHJpYXRlIGZvciBTVU00TSBpbiBkaXJlY3RvcnkgPGZpbGVuYW1lPi9ldGMvdGZ0cGJvb3Q8L2ZpbGVuYW1lPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+V0FSTklORzwvdGl0bGU+Cis8cGFyYT4KK1RoaXMgZmFjaWxpdHkgaXMgZGVlcGx5IG9ic29sZXRlZCBieQorPHVsaW5rIHVybD0iaHR0cDovL3Rvb2xzLmlldGYub3JnL3JmYy9yZmM5NTEudHh0Ij5CT09UUDwvdWxpbms+CithbmQgbGF0ZXIKKzx1bGluayB1cmw9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9yZmMvcmZjMjEzMS50eHQiPkRIQ1A8L3VsaW5rPiBwcm90b2NvbHMuCitIb3dldmVyLCBzb21lIGNsaWVudHMgcmVhbGx5IHN0aWxsIG5lZWQgdGhpcyB0byBib290LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworCis8cmVmc2VjdDE+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorCis8dmFyaWFibGVsaXN0PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tYS88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0xpc3RlbiBvbiBhbGwgdGhlIGludGVyZmFjZXMuIEN1cnJlbnRseSBpdCBpcyBhbiBpbnRlcm5hbAorb3B0aW9uLCBpdHMgZnVuY3Rpb24gaXMgb3ZlcnJpZGRlbiB3aXRoIDxyZXBsYWNlYWJsZS9pbnRlcmZhY2UvCithcmd1bWVudC4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLUEvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitMaXN0ZW4gbm90IG9ubHkgUkFSUCBidXQgYWxzbyBBUlAgbWVzc2FnZXMsIHNvbWUgcmFyZSBjbGllbnRzCit1c2UgQVJQIGJ5IHNvbWUgdW5rbm93biByZWFzb24uCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tdi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0JlIHZlcmJvc2UuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tZC88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK0RlYnVnIG1vZGUuIERvIG5vdCBnbyB0byBiYWNrZ3JvdW5kLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLWUvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitEbyBub3QgY2hlY2sgZm9yIHByZXNlbmNlIG9mIGEgYm9vdCBpbWFnZSwgcmVwbHkgaWYgTUFDIGFkZHJlc3MKK3Jlc29sdmVzIHRvIGEgdmFsaWQgSVAgYWRkcmVzcyB1c2luZyA8ZmlsZW5hbWU+L2V0Yy9ldGhlcnM8L2ZpbGVuYW1lPgorZGF0YWJhc2UgYW5kIEROUy4gCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tYiA8cmVwbGFjZWFibGUvYm9vdGRpci88L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1RGVFAgYm9vdCBkaXJlY3RvcnkuIERlZmF1bHQgaXMgPGZpbGVuYW1lPi9ldGMvdGZ0cGJvb3Q8L2ZpbGVuYW1lPgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5TRUUgQUxTTzwvdGl0bGU+Cis8cGFyYT4KKzxsaW5rIGxpbmtlbmQ9ImFycGluZyI+Cis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL2FycGluZy88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+PC9saW5rPiwKKzxsaW5rIGxpbmtlbmQ9InRmdHBkIj4KKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvdGZ0cGQvPG1hbnZvbG51bS84LzwvY2l0ZXJlZmVudHJ5PjwvbGluaz4uCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkFVVEhPUjwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL3JhcnBkLyB3YXMgd3JpdHRlbiBieQorPHVsaW5rIHVybD0ibWFpbHRvOmt1em5ldEBtczIuaW5yLmFjLnJ1Ij5BbGV4ZXkgS3V6bmV0c292CismbHQ7a3V6bmV0QG1zMi5pbnIuYWMucnUmZ3Q7PC91bGluaz4uCitJdCBpcyBub3cgbWFpbnRhaW5lZCBieQorPHVsaW5rIHVybD0ibWFpbHRvOnlvc2hmdWppQHNrYnVmZi5uZXQiPllPU0hJRlVKSSBIaWRlYWtpCismbHQ7eW9zaGZ1amlAc2tidWZmLm5ldCZndDs8L3VsaW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+U0VDVVJJVFk8L3RpdGxlPgorPHBhcmE+Cis8Y29tbWFuZC9yYXJwZC8gcmVxdWlyZXMgPGNvbnN0YW50L0NBUF9ORVRfUkFXLyBjYXBhYmlsaXR5Cit0byBsaXN0ZW4gYW5kIHNlbmQgUkFSUCBhbmQgQVJQIHBhY2tldHMuIEl0IGFsc28gbmVlZHMgPGNvbnN0YW50L0NBUF9ORVRfQURNSU4vCit0byBnaXZlIHRvIGtlcm5lbCBoaW50IGZvciBBUlAgcmVzb2x1dGlvbjsgdGhpcyBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQsCitidXQgc29tZSAobW9zdCBvZiwgdG8gYmUgbW9yZSBleGFjdCkgY2xpZW50cyBhcmUgc28gYmFkbHkgYnJva2VuIHRoYXQKK2FyZSBub3QgYWJsZSB0byBhbnN3ZXIgQVJQIGJlZm9yZSB0aGV5IGFyZSBmaW5hbGx5IGJvb3RlZC4gVGhpcyBpcworbm90IHdvbmRlcmZ1bCB0YWtpbmcgaW50byBhY2NvdW50IHRoYXQgY2xpZW50cyB1c2luZyBSQVJQRCBpbiAyMDAyCithcmUgYWxsIHVuc3VwcG9ydGVkIHJlbGljIGNyZWF0dXJlcyBvZiA5MCdzIGFuZCBldmVuIGVhcmxpZXIuCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkFWQUlMQUJJTElUWTwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL3JhcnBkLyBpcyBwYXJ0IG9mIDxmaWxlbmFtZS9pcHV0aWxzLyBwYWNrYWdlCithbmQgdGhlIGxhdGVzdCB2ZXJzaW9ucyBhcmUgIGF2YWlsYWJsZSBpbiBzb3VyY2UgZm9ybSBhdAorPHVsaW5rIHVybD0iaHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejIiPgoraHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejI8L3VsaW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzwhW0lHTk9SRVsKKzxyZWZzZWN0MT48dGl0bGU+Q09QWUlORzwvdGl0bGU+Cis8cGFyYT4KKzxsaXRlcmFsbGF5b3V0PgorVGhpcyBkb2N1bWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCitpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIFZlcnNpb24gMi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlCitkaXN0cmlidXRpb24gb2YgTGludXgga2VybmVsIG9mIHZlcnNpb24gMi40LgorPC9saXRlcmFsbGF5b3V0PgorPC9wYXJhPgorPC9yZWZzZWN0MT4KK11dPgorCisKKworCis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2MvcmRpc2Muc2dtbCBiL2lwdXRpbHMvZG9jL3JkaXNjLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MWNiOQotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvZG9jL3JkaXNjLnNnbWwKQEAgLTAsMCArMSwyNDYgQEAKKzxyZWZlbnRyeSBpZD0icmRpc2MiPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPnJkaXNjPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT44PC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8+aXB1dGlscy0mc25hcHNob3Q7PC9yZWZtaXNjaW5mbz4KKzwvcmVmbWV0YT4KKworPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5yZGlzYzwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPm5ldHdvcmsgcm91dGVyIGRpc2NvdmVyeSBkYWVtb248L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+CisKKzxyZWZzeW5vcHNpc2Rpdj4KKzxjbWRzeW5vcHNpcz4KKzxjb21tYW5kPnJkaXNjPC9jb21tYW5kPgorPGFyZyBjaG9pY2U9Im9wdCI+PG9wdGlvbj4tYWJkZnJzdHZWPC9vcHRpb24+PC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tcCA8cmVwbGFjZWFibGUvcHJlZmVyZW5jZS88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1UIDxyZXBsYWNlYWJsZS9tYXhfaW50ZXJ2YWwvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij48cmVwbGFjZWFibGUvc2VuZF9hZGRyZXNzLzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+PHJlcGxhY2VhYmxlL3JlY2VpdmVfYWRkcmVzcy88L2FyZz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCis8cmVmc2VjdDE+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvcmRpc2MvIGltcGxlbWVudHMgY2xpZW50IHNpZGUgb2YgdGhlIElDTVAgcm91dGVyIGRpc2NvdmVyIHByb3RvY29sLgorPGNvbW1hbmQvcmRpc2MvIGlzIGludm9rZWQgYXQgYm9vdCB0aW1lIHRvIHBvcHVsYXRlIHRoZSBuZXR3b3JrCityb3V0aW5nIHRhYmxlcyB3aXRoIGRlZmF1bHQgcm91dGVzLiAKKzwvcGFyYT4KKworPHBhcmE+Cis8Y29tbWFuZC9yZGlzYy8gbGlzdGVucyBvbiB0aGUgQUxMX0hPU1RTICgyMjQuMC4wLjEpIG11bHRpY2FzdCBhZGRyZXNzCisob3IgPHJlcGxhY2VhYmxlL3JlY2VpdmVfYWRkcmVzcy8gcHJvdmlkZWQgaXQgaXMgZ2l2ZW4pIAorZm9yIFJPVVRFUl9BRFZFUlRJU0UgbWVzc2FnZXMgZnJvbSByb3V0ZXJzLiBUaGUgcmVjZWl2ZWQKK21lc3NhZ2VzIGFyZSBoYW5kbGVkIGJ5IGZpcnN0IGlnbm9yaW5nIHRob3NlIGxpc3RlZCByb3V0ZXIgYWRkcmVzc2VzCit3aXRoIHdoaWNoIHRoZSBob3N0IGRvZXMgbm90IHNoYXJlIGEgbmV0d29yay4gQW1vbmcgdGhlIHJlbWFpbmluZyBhZGRyZXNzZXMKK3RoZSBvbmVzIHdpdGggdGhlIGhpZ2hlc3QgcHJlZmVyZW5jZSBhcmUgc2VsZWN0ZWQgYXMgZGVmYXVsdCByb3V0ZXJzCithbmQgYSBkZWZhdWx0IHJvdXRlIGlzIGVudGVyZWQgaW4gdGhlIGtlcm5lbCByb3V0aW5nIHRhYmxlCitmb3IgZWFjaCBvbmUgb2YgdGhlbS4KKzwvcGFyYT4KKworPHBhcmE+CitPcHRpb25hbGx5LCA8Y29tbWFuZC9yZGlzYy8gY2FuIGF2b2lkIHdhaXRpbmcgZm9yIHJvdXRlcnMgdG8gYW5ub3VuY2UgCit0aGVtc2VsdmVzIGJ5IHNlbmRpbmcgb3V0IGEgZmV3IFJPVVRFUl9TT0xJQ0lUQVRJT04gbWVzc2FnZXMKK3RvIHRoZSBBTExfUk9VVEVSUyAoMjI0LjAuMC4yKSBtdWx0aWNhc3QgYWRkcmVzcyAKKyhvciA8cmVwbGFjZWFibGUvc2VuZF9hZGRyZXNzLyBwcm92aWRlZCBpdCBpcyBnaXZlbikgCit3aGVuIGl0IGlzIHN0YXJ0ZWQuCis8L3BhcmE+CisKKzxwYXJhPgorQSB0aW1lciBpcyBhc3NvY2lhdGVkIHdpdGggZWFjaCByb3V0ZXIgYWRkcmVzcyBhbmQgdGhlIGFkZHJlc3Mgd2lsbAorbm8gbG9uZ2VyIGJlIGNvbnNpZGVyZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgdGhlIHJvdXRpbmcgdGFibGVzIGlmIHRoZSAKK3RpbWVyIGV4cGlyZXMgYmVmb3JlIGEgbmV3IAorPGVtcGhhc2lzL2FkdmVydGlzZS8gbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSByb3V0ZXIuCitUaGUgYWRkcmVzcyB3aWxsIGFsc28gYmUgZXhjbHVkZWQgZnJvbSBjb25zaWRlcmF0aW9uIGlmIHRoZSBob3N0IHJlY2VpdmVzIGFuIAorPGVtcGhhc2lzL2FkdmVydGlzZS8KK21lc3NhZ2Ugd2l0aCB0aGUgcHJlZmVyZW5jZSBiZWluZyBtYXhpbWFsbHkgbmVnYXRpdmUuCis8L3BhcmE+CisKKzxwYXJhPgorU2VydmVyIHNpZGUgb2Ygcm91dGVyIGRpc2NvdmVyeSBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgQ2lzY28gSU9TCithbmQgYnkgYW55IG1vcmUgb3IgbGVzcyBjb21wbGV0ZSBVTklYIHJvdXRpbmcgZGFlbW9uLCBmLmUgPGNvbW1hbmQvZ2F0ZWQvLgorT3IsIDxjb21tYW5kL3JkaXNjLyBjYW4gYWN0IGFzIHJlc3BvbmRlciwgaWYgY29tcGlsZWQgd2l0aCAtRFJESVNDX1NFUlZFUi4KKzwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5PUFRJT05TPC90aXRsZT4KKworPHZhcmlhYmxlbGlzdD4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1hLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorQWNjZXB0IGFsbCByb3V0ZXJzIGluZGVwZW5kZW50bHkgb2YgdGhlIHByZWZlcmVuY2UgdGhleSBoYXZlIGluIHRoZWlyIAorPGVtcGhhc2lzL2FkdmVydGlzZS8gbWVzc2FnZXMuCitOb3JtYWxseSA8Y29tbWFuZC9yZGlzYy8gb25seSBhY2NlcHRzIChhbmQgZW50ZXJzIGluIHRoZSBrZXJuZWwgcm91dGluZwordGFibGVzKSB0aGUgcm91dGVyIG9yIHJvdXRlcnMgd2l0aCB0aGUgaGlnaGVzdCBwcmVmZXJlbmNlLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1iLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorT3Bwb3NpdGUgdG8gPG9wdGlvbi8tYS8sIGkuZS4gaW5zdGFsbCBvbmx5IHJvdXRlciB3aXRoIHRoZSBiZXN0CitwcmVmZXJlbmNlIHZhbHVlLiBJdCBpcyBkZWZhdWx0IGJlaGF2aW91ci4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tZC88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NlbmQgZGVidWdnaW5nIG1lc3NhZ2VzIHRvIHN5c2xvZy4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tZi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1J1biA8Y29tbWFuZC9yZGlzYy8gZm9yZXZlciBldmVuIGlmIG5vIHJvdXRlcnMgYXJlIGZvdW5kLgorTm9ybWFsbHkgPGNvbW1hbmQvcmRpc2MvIGdpdmVzIHVwIGlmIGl0IGhhcyBub3QgcmVjZWl2ZWQgYW55IAorPGVtcGhhc2lzL2FkdmVydGlzZS8gbWVzc2FnZSBhZnRlciBhZnRlciBzb2xpY2l0aW5nIHRocmVlIHRpbWVzLAoraW4gd2hpY2ggY2FzZSBpdCBleGl0cyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLgorSWYgPG9wdGlvbi8tZi8gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZmlyc3QgZm9ybSB0aGVuIAorPG9wdGlvbi8tcy8gbXVzdCBiZSBzcGVjaWZpZWQuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tci88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1Jlc3BvbmRlciBtb2RlLCBhdmFpbGFibGUgb25seSBpZiBjb21waWxlZCB3aXRoIC1EUkRJU0NfU0VSVkVSLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLXMvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTZW5kIHRocmVlIDxlbXBoYXNpcy9zb2xpY2l0YXRpb24vIG1lc3NhZ2VzIGluaXRpYWxseSB0byBxdWlja2x5IGRpc2NvdmVyCit0aGUgcm91dGVycyB3aGVuIHRoZSBzeXN0ZW0gaXMgYm9vdGVkLgorV2hlbiA8b3B0aW9uLy1zLyBpcyBzcGVjaWZpZWQgPGNvbW1hbmQvcmRpc2MvCitleGl0cyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGlmIGl0IGNhbiBub3QgZmluZCBhbnkgcm91dGVycy4KK1RoaXMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgPG9wdGlvbi8tZi8gb3B0aW9uLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LXAgPHJlcGxhY2VhYmxlL3ByZWZlcmVuY2UvPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitTZXQgcHJlZmVyZW5jZSBpbiBhZHZlcnRpc2VtZW50LgorQXZhaWxhYmxlIG9ubHkgd2l0aCAtciBvcHRpb24uCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tVCA8cmVwbGFjZWFibGUvbWF4X2ludGVydmFsLzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorU2V0IG1heGltdW0gYWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCBpbiBzZWNvbmRzLiAgRGVmYXVsdCBpcyA2MDAgc2Vjcy4KK0F2YWlsYWJsZSBvbmx5IHdpdGggLXIgb3B0aW9uLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLXQvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitUZXN0IG1vZGUuIERvIG5vdCBnbyB0byBiYWNrZ3JvdW5kLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLXYvPC90ZXJtPgorICA8bGlzdGl0ZW0+PHBhcmE+CitCZSB2ZXJib3NlIGkuZS4gc2VuZCBsb3RzIG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBzeXNsb2cuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tVi88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkhJU1RPUlk8L3RpdGxlPgorPHBhcmE+CitUaGlzIHByb2dyYW0gd2FzIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zIChzZWUgY29weXJpZ2h0Citub3RpY2UgaW4gc291cmNlIGZpbGUpLiBJdCB3YXMgcG9ydGVkIHRvIExpbnV4IGJ5Cis8dWxpbmsgdXJsPSJtYWlsdG86a3V6bmV0QG1zMi5pbnIuYWMucnUiPkFsZXhleSBLdXpuZXRzb3YKKyZsdDtrdXpuZXRAbXMyLmluci5hYy5ydSZndDs8L3VsaW5rPi4KK0l0IGlzIG5vdyBtYWludGFpbmVkIGJ5Cis8dWxpbmsgdXJsPSJtYWlsdG86eW9zaGZ1amlAc2tidWZmLm5ldCI+WU9TSElGVUpJIEhpZGVha2kKKyZsdDt5b3NoZnVqaUBza2J1ZmYubmV0Jmd0OzwvdWxpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworCis8cmVmc2VjdDE+PHRpdGxlPlNFRSBBTFNPPC90aXRsZT4KKzxwYXJhPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9pY21wLzxtYW52b2xudW0vNy88L2NpdGVyZWZlbnRyeT4sCis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL2luZXQvPG1hbnZvbG51bS83LzwvY2l0ZXJlZmVudHJ5PiwKKzxsaW5rIGxpbmtlbmQ9InBpbmciPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9waW5nLzxtYW52b2xudW0vOC88L2NpdGVyZWZlbnRyeT48L2xpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5SRUZFUkVOQ0VTPC90aXRsZT4KKzxwYXJhPgorRGVlcmluZywgUy5FLixlZCAiSUNNUCBSb3V0ZXIgRGlzY292ZXJ5IE1lc3NhZ2VzIiwKKzx1bGluayB1cmw9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9yZmMvcmZjMTI1Ni50eHQiPgorUkZDMTI1NjwvdWxpbms+LCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciwgU1JJIEludGVybmF0aW9uYWwsCitNZW5sbyBQYXJrLCBDYWxpZi4sIFNlcHRlbWJlciAxOTkxLgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5TRUNVUklUWTwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL3JkaXNjLyByZXF1aXJlcyA8Y29uc3RhbnQvQ0FQX05FVF9SQVcvIHRvIGxpc3RlbgorYW5kIHNlbmQgSUNNUCBtZXNzYWdlcyBhbmQgY2FwYWJpbGl0eSA8Y29uc3RhbnQvQ0FQX05FVF9BRE1JTi8KK3RvIHVwZGF0ZSByb3V0aW5nIHRhYmxlcy4gCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPkFWQUlMQUJJTElUWTwvdGl0bGU+Cis8cGFyYT4KKzxjb21tYW5kL3JkaXNjLyBpcyBwYXJ0IG9mIDxmaWxlbmFtZS9pcHV0aWxzLyBwYWNrYWdlCithbmQgdGhlIGxhdGVzdCB2ZXJzaW9ucyBhcmUgIGF2YWlsYWJsZSBpbiBzb3VyY2UgZm9ybSBhdAorPHVsaW5rIHVybD0iaHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejIiPgoraHR0cDovL3d3dy5za2J1ZmYubmV0L2lwdXRpbHMvaXB1dGlscy1jdXJyZW50LnRhci5iejI8L3VsaW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzwhW0lHTk9SRVsKKzxyZWZzZWN0MT48dGl0bGU+Q09QWUlORzwvdGl0bGU+Cis8cGFyYT4KKzxsaXRlcmFsbGF5b3V0PgorUmRpc2MgKHRoaXMgcHJvZ3JhbSkgd2FzIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyAKK3Byb3ZpZGVkIGZvciB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gCithbGwgdGFwZSBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICAKK1VzZXJzIG1heSBjb3B5IG9yIG1vZGlmeSBSZGlzYyB3aXRob3V0IGNoYXJnZSwgYW5kIHRoZXkgbWF5IGZyZWVseSAKK2Rpc3RyaWJ1dGUgaXQuCisKK1JESVNDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCitXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKworUmRpc2MgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorCitTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKK0lORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFJESVNDCitPUiBBTlkgUEFSVCBUSEVSRU9GLgorCitJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCitvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKK1N1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKK1N1biBNaWNyb3N5c3RlbXMsIEluYy4KKzI1NTAgR2FyY2lhIEF2ZW51ZQorTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKzwvbGl0ZXJhbGxheW91dD4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CitdXT4KKworCis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9kb2Mvc25hcHNob3QuZGIgYi9pcHV0aWxzL2RvYy9zbmFwc2hvdC5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ1NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2Mvc25hcHNob3QuZGIKQEAgLTAsMCArMSBAQAorMTIxMjIxCmRpZmYgLS1naXQgYS9pcHV0aWxzL2RvYy90ZnRwZC5zZ21sIGIvaXB1dGlscy9kb2MvdGZ0cGQuc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTdmZDdjCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvdGZ0cGQuc2dtbApAQCAtMCwwICsxLDE1MSBAQAorPHJlZmVudHJ5IGlkPSJ0ZnRwZCI+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+dGZ0cGQ8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjg8L21hbnZvbG51bT4KKzxyZWZtaXNjaW5mbz5pcHV0aWxzLSZzbmFwc2hvdDs8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorCis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPnRmdHBkPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+VHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIHNlcnZlcjwvcmVmcHVycG9zZT4KKzwvcmVmbmFtZWRpdj4KKworPHJlZnN5bm9wc2lzZGl2PgorPGNtZHN5bm9wc2lzPgorPGNvbW1hbmQ+dGZ0cGQ8L2NvbW1hbmQ+Cis8YXJnIGNob2ljZT0icmVxIj48cmVwbGFjZWFibGUvZGlyZWN0b3J5LzwvYXJnPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKzxyZWZzZWN0MT48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+Cis8Y29tbWFuZC90ZnRwZC8gaXMgYSBzZXJ2ZXIgd2hpY2ggc3VwcG9ydHMgdGhlIERBUlBBCitUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wKKyg8dWxpbmsgdXJsPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvcmZjL3JmYzEzNTAudHh0Ij5SRkMxMzUwPC91bGluaz4pLgorVGhlIFRGVFAgc2VydmVyIGlzIHN0YXJ0ZWQKK2J5IDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvaW5ldGQvPG1hbnZvbG51bS84LzwvY2l0ZXJlZmVudHJ5Pi4KKzwvcGFyYT4KKworPHBhcmE+Cis8cmVwbGFjZWFibGUvZGlyZWN0b3J5LyBpcyByZXF1aXJlZCBhcmd1bWVudDsgaWYgaXQgaXMgbm90IGdpdmVuCis8Y29tbWFuZC90ZnRwZC8gYWJvcnRzLiBUaGlzIHBhdGggaXMgcHJlcGVuZGVkIHRvIGFueSBmaWxlIG5hbWUgcmVxdWVzdGVkCit2aWEgVEZUUCBwcm90b2NvbCwgZWZmZWN0aXZlbHkgY2hyb290aW5nIDxjb21tYW5kL3RmdHBkLyB0byB0aGlzIGRpcmVjdG9yeS4KK0ZpbGUgbmFtZXMgYXJlIHZhbGlkYXRlZCBub3QgdG8gZXNjYXBlIG91dCBvZiB0aGlzIGRpcmVjdG9yeSwgaG93ZXZlcgorYWRtaW5pc3RyYXRvciBtYXkgY29uZmlndXJlIHN1Y2ggZXNjYXBlIHVzaW5nIHN5bWJvbGljIGxpbmtzLgorPC9wYXJhPgorCis8cGFyYT4KK0l0IGlzIGluIGRpZmZlcmVuY2Ugb2YgdmFyaWFudHMgb2YgPGNvbW1hbmQvdGZ0cGQvIHVzdWFsbHkgZGlzdHJpYnV0ZWQKK3dpdGggdW5peC1saWtlIHN5c3RlbXMsIHdoaWNoIHRha2UgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIGFuZCBtYXRjaAorZmlsZSBuYW1lcyB0byBzdGFydCBmcm9tIG9uZSBvZiBnaXZlbiBwcmVmaXhlcyBvciB0byBzb21lIHJhbmRvbQorZGVmYXVsdCwgd2hlbiBubyBhcmd1bWVudHMgd2VyZSBnaXZlbi4gVGhlcmUgYXJlIHR3byByZWFzb25zIG5vdCB0bworYmVoYXZlIGluIHRoaXMgd2F5OiBmaXJzdCwgaXQgaXMgaW5jb252ZW5pZW50LCBjbGllbnRzIGFyZSBub3QgZXhwZWN0ZWQKK3RvIGtub3cgc29tZXRoaW5nIGFib3V0IGxheW91dCBvZiBmaWxlc3lzdGVtIG9uIHNlcnZlciBob3N0LgorQW5kIHNlY29uZCwgVEZUUCBwcm90b2NvbCBpcyBub3QgYSB0b29sIGZvciBicm93c2luZyBvZiBzZXJ2ZXIncyBmaWxlc3lzdGVtLAoraXQgaXMganVzdCBhbiBhZ2VudCBhbGxvd2luZyB0byBib290IGR1bWIgY2xpZW50cy4gCis8L3BhcmE+CisKKzxwYXJhPgorSW4gdGhlIGNhc2Ugd2hlbiA8Y29tbWFuZC90ZnRwZC8gaXMgdXNlZCB0b2dldGhlciB3aXRoCis8bGluayBsaW5rZW5kPSJyYXJwZCI+Cis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL3JhcnBkLzxtYW52b2xudW0vOC88L2NpdGVyZWZlbnRyeT48L2xpbms+LAordGZ0cCBkaXJlY3RvcmllcyBpbiB0aGVzZSBzZXJ2aWNlcyBzaG91bGQgY29pbmNpZGUgYW5kIGl0IGlzIGV4cGVjdGVkCit0aGF0IGVhY2ggY2xpZW50IGJvb3RlZCB2aWEgVEZUUCBoYXMgYm9vdCBpbWFnZSBjb3JyZXNwb25kaW5nCitpdHMgSVAgYWRkcmVzcyB3aXRoIGFuIGFyY2hpdGVjdHVyZSBzdWZmaXggZm9sbG93aW5nIFN1biBNaWNyb3N5c3RlbXMKK2NvbnZlbnRpb25zLiBTZWUgCis8bGluayBsaW5rZW5kPSJyYXJwZCI+Cis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlL3JhcnBkLzxtYW52b2xudW0vOC88L2NpdGVyZWZlbnRyeT48L2xpbms+Citmb3IgbW9yZSBkZXRhaWxzLgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5TRUNVUklUWTwvdGl0bGU+Cis8cGFyYT4KK1RGVFAgcHJvdG9jb2wgZG9lcyBub3QgcHJvdmlkZSBhbnkgYXV0aGVudGljYXRpb24uCitEdWUgdG8gdGhpcyBjYXBpdGFsIGZsYXcgPGNvbW1hbmQvdGZ0cGQvIGlzIG5vdCBhYmxlIHRvIHJlc3RyaWN0CithY2Nlc3MgdG8gZmlsZXMgYW5kIHdpbGwgYWxsb3cgb25seSBwdWJsaWNhbGx5IHJlYWRhYmxlCitmaWxlcyB0byBiZSBhY2Nlc3NlZC4gRmlsZXMgbWF5IGJlIHdyaXR0ZW4gb25seSBpZiB0aGV5IGFscmVhZHkKK2V4aXN0IGFuZCBhcmUgcHVibGljYWxseSB3cml0YWJsZS4KKzwvcGFyYT4KKworPHBhcmE+CitJbXBhY3QgaXMgZXZpZGVudCwgZGlyZWN0b3J5IGV4cG9ydGVkIHZpYSBURlRQIDxlbXBoYXNpcy9tdXN0IG5vdC8KK2NvbnRhaW4gc2Vuc2l0aXZlIGluZm9ybWF0aW9uIG9mIGFueSBraW5kLCBldmVyeW9uZSBpcyBhbGxvd2VkCit0byByZWFkIGl0IGFzIHNvb24gYXMgYSBjbGllbnQgaXMgYWxsb3dlZC4gQm9vdCBpbWFnZXMgZG8gbm90IGNvbnRhaW4KK3N1Y2ggaW5mb3JtYXRpb24gYXMgcnVsZSwgaG93ZXZlciB5b3Ugc2hvdWxkIHRoaW5rIHR3aWNlIGJlZm9yZQorcHVibGlzaGluZyBmLmUuIENpc2NvIElPUyBjb25maWcgZmlsZXMgdmlhIFRGVFAsIHRoZXkgY29udGFpbgorPGVtcGhhc2lzL3VuZW5jcnlwdGVkLyBwYXNzd29yZHMgYW5kIG1heSBjb250YWluIHNvbWUgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBuZXR3b3JrLCB3aGljaCB5b3Ugd2VyZSBub3QgZ29pbmcgdG8gbWFrZSBwdWJsaWMuCis8L3BhcmE+CisKKzxwYXJhPgorVGhlIDxjb21tYW5kL3RmdHBkLyBzZXJ2ZXIgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IDxjb21tYW5kL2luZXRkLword2l0aCBkcm9wcGVkIHJvb3QgcHJpdmlsZWdlcywgbmFtZWx5IHdpdGggYSB1c2VyIElEIGdpdmluZyBtaW5pbWFsCithY2Nlc3MgdG8gZmlsZXMgcHVibGlzaGVkIGluIHRmdHAgZGlyZWN0b3J5LiBJZiBpdCBpcyBleGVjdXRlZAorYXMgc3VwZXJ1c2VyIG9jY2FzaW9uYWxseSwgPGNvbW1hbmQvdGZ0cGQvIGRyb3BzIGl0cyBVSUQgYW5kIEdJRAordG8gNjU1MzQsIHdoaWNoIGlzIG1vc3QgbGlrZWx5IG5vdCB0aGUgdGhpbmcgd2hpY2ggeW91IGV4cGVjdC4KK0hvd2V2ZXIsIHRoaXMgaXMgbm90IHZlcnkgZXNzZW50aWFsOyByZW1lbWJlciwgb25seSBmaWxlcyBhY2Nlc3NpYmxlCitmb3IgZXZlcnlvbmUgY2FuIGJlIHJlYWQgb3Igd3JpdHRlbiB2aWEgVEZUUC4KKzwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworCis8cmVmc2VjdDE+PHRpdGxlPlNFRSBBTFNPPC90aXRsZT4KKzxwYXJhPgorPGxpbmsgbGlua2VuZD0icmFycGQiPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9yYXJwZC88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+PC9saW5rPiwKKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvdGZ0cC88bWFudm9sbnVtLzEvPC9jaXRlcmVmZW50cnk+LAorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9pbmV0ZC88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5ISVNUT1JZPC90aXRsZT4KKzxwYXJhPgorVGhlIDxjb21tYW5kL3RmdHBkLyBjb21tYW5kIGFwcGVhcmVkIGluIDQuMkJTRC4gVGhlIHNvdXJjZSBpbiBpcHV0aWxzCitpcyBjbGVhbmVkIHVwIGJvdGggc3ludGFjdGljYWxseSAoQU5TSWl6ZWQpIGFuZCBzZW1hbnRpY2FsbHkgKFVEUCBzb2NrZXQgSU8pLgorPC9wYXJhPgorPHBhcmE+CitJdCBpcyBkaXN0cmlidXRlZCB3aXRoIGlwdXRpbHMgbW9zdGx5IGFzIGdvb2QgZGVtbyBvZiBhbiBpbnRlcmVzdGluZyBmZWF0dXJlCisoPGNvbnN0YW50L01TR19DT05GSVJNLykgYWxsb3dpbmcgdG8gYm9vdCBsb25nIGltYWdlcyBieSBkdW1iIGNsaWVudHMKK25vdCBhbnN3ZXJpbmcgQVJQIHJlcXVlc3RzIHVudGlsIHRoZXkgYXJlIGZpbmFsbHkgYm9vdGVkLgorSG93ZXZlciwgdGhpcyBpcyBmdWxsIGZ1bmN0aW9uYWwgYW5kIGNhbiBiZSB1c2VkIGluIHByb2R1Y3Rpb24uCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCisKKzxyZWZzZWN0MT48dGl0bGU+QVZBSUxBQklMSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvdGZ0cGQvIGlzIHBhcnQgb2YgPGZpbGVuYW1lL2lwdXRpbHMvIHBhY2thZ2UKK2FuZCB0aGUgbGF0ZXN0IHZlcnNpb25zIGFyZSAgYXZhaWxhYmxlIGluIHNvdXJjZSBmb3JtIGF0Cis8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MiI+CitodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MjwvdWxpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworCis8IVtJR05PUkVbCis8cmVmc2VjdDE+PHRpdGxlPkNPUFlJTkc8L3RpdGxlPgorPHBhcmE+Cis8bGl0ZXJhbGxheW91dD4KK1RoaXMgZG9jdW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQoraXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBWZXJzaW9uIDIuCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KK1NlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKK0ZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQorZGlzdHJpYnV0aW9uIG9mIExpbnV4IGtlcm5lbCBvZiB2ZXJzaW9uIDIuNC4KKzwvbGl0ZXJhbGxheW91dD4KKzwvbGl0ZXJhbGxheW91dD4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CitdXT4KKworCisKKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9pcHV0aWxzL2RvYy90cmFjZXBhdGguc2dtbCBiL2lwdXRpbHMvZG9jL3RyYWNlcGF0aC5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTE4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL2RvYy90cmFjZXBhdGguc2dtbApAQCAtMCwwICsxLDIwMSBAQAorPHJlZmVudHJ5IGlkPSJ0cmFjZXBhdGgiPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPnRyYWNlcGF0aDwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+ODwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvPmlwdXRpbHMtJnNuYXBzaG90OzwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+CisKKzxyZWZuYW1lZGl2PgorPHJlZm5hbWU+dHJhY2VwYXRoLCB0cmFjZXBhdGg2PC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+Cit0cmFjZXMgcGF0aCB0byBhIG5ldHdvcmsgaG9zdCBkaXNjb3ZlcmluZyBNVFUgYWxvbmcgdGhpcyBwYXRoPC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorCis8cmVmc3lub3BzaXNkaXY+Cis8Y21kc3lub3BzaXM+Cis8Y29tbWFuZD50cmFjZXBhdGg8L2NvbW1hbmQ+Cis8YXJnIGNob2ljZT0ib3B0Ij4tbjwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LWI8L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1sIDxyZXBsYWNlYWJsZS9wa3RsZW4vPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tbSA8cmVwbGFjZWFibGUvbWF4X2hvcHMvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tcCA8cmVwbGFjZWFibGUvcG9ydC88L2FyZz4KKzxhcmcgY2hvaWNlPSJyZXEiPjxyZXBsYWNlYWJsZS9kZXN0aW5hdGlvbi88L2FyZz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCis8cmVmc2VjdDE+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPgorSXQgdHJhY2VzIHBhdGggdG8gPHJlcGxhY2VhYmxlL2Rlc3RpbmF0aW9uLyBkaXNjb3ZlcmluZyBNVFUgYWxvbmcgdGhpcyBwYXRoLgorSXQgdXNlcyBVRFAgcG9ydCA8cmVwbGFjZWFibGUvcG9ydC8gb3Igc29tZSByYW5kb20gcG9ydC4KK0l0IGlzIHNpbWlsYXIgdG8gPGNvbW1hbmQvdHJhY2Vyb3V0ZS8sIG9ubHkgZG9lcyBub3QgcmVxdWlyZSBzdXBlcnVzZXIKK3ByaXZpbGVnZXMgYW5kIGhhcyBubyBmYW5jeSBvcHRpb25zLgorPC9wYXJhPgorCis8cGFyYT4KKzxjb21tYW5kL3RyYWNlcGF0aDYvIGlzIGdvb2QgcmVwbGFjZW1lbnQgZm9yIDxjb21tYW5kL3RyYWNlcm91dGU2LworYW5kIGNsYXNzaWMgZXhhbXBsZSBvZiBhcHBsaWNhdGlvbiBvZiBMaW51eCBlcnJvciBxdWV1ZXMuCitUaGUgc2l0dWF0aW9uIHdpdGggSVB2NCBpcyB3b3JzZSwgYmVjYXVzZSBjb21tZXJjaWFsCitJUCByb3V0ZXJzIGRvIG5vdCByZXR1cm4gZW5vdWdoIGluZm9ybWF0aW9uIGluIElDTVAgZXJyb3IgbWVzc2FnZXMuCitQcm9iYWJseSwgaXQgd2lsbCBjaGFuZ2UsIHdoZW4gdGhleSB3aWxsIGJlIHVwZGF0ZWQuCitGb3Igbm93IGl0IHVzZXMgVmFuIEphY29ic29uJ3MgdHJpY2ssIHN3ZWVwaW5nIGEgcmFuZ2UKK29mIFVEUCBwb3J0cyB0byBtYWludGFpbiB0cmFjZSBoaXN0b3J5LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5PUFRJT05TPC90aXRsZT4KKzx2YXJpYWJsZWxpc3Q+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1uLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorUHJpbnQgcHJpbWFyaWx5IElQIGFkZHJlc3NlcyBudW1lcmljYWxseS4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1iLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorUHJpbnQgYm90aCBvZiBob3N0IG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMuCisgIDwvcGFyYT48L2xpc3RpdGVtPgorIDwvdmFybGlzdGVudHJ5PgorCisgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbi8tbC88L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NldHMgdGhlIGluaXRpYWwgcGFja2V0IGxlbmd0aCB0byA8cmVwbGFjZWFibGUvcGt0bGVuLyBpbnN0ZWFkIG9mCis2NTUzNSBmb3IgPGNvbW1hbmQvdHJhY2VwYXRoLyBvciAxMjgwMDAgZm9yIDxjb21tYW5kL3RyYWNlcGF0aDYvLgorICA8L3BhcmE+PC9saXN0aXRlbT4KKyA8L3Zhcmxpc3RlbnRyeT4KKworIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24vLW08L3Rlcm0+CisgIDxsaXN0aXRlbT48cGFyYT4KK1NldCBtYXhpbXVtIGhvcHMgKG9yIG1heGltdW0gVFRMcykgdG8gPHJlcGxhY2VhYmxlL21heF9ob3BzLworaW5zdGVhZCBvZiAzMC4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+CisKKyA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uLy1wLzwvdGVybT4KKyAgPGxpc3RpdGVtPjxwYXJhPgorU2V0cyB0aGUgaW5pdGlhbCBkZXN0aW5hdGlvbiBwb3J0IHRvIHVzZS4KKyAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+T1VUUFVUPC90aXRsZT4KKzxwYXJhPgorPGxpdGVyYWxsYXlvdXQ+Cityb290QG1vcHM6fiAjIHRyYWNlcGF0aDYgM2ZmZToyNDAwOjA6MTA5OjoyCisgMT86IFtMT0NBTEhPU1RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG10dSAxNTAwCisgMTogIGR1c3QuaW5yLmFjLnJ1ICAgICAgICAgICAgICAgICAgIDAuNDExbXMKKyAyOiAgZHVzdC5pbnIuYWMucnUgICAgICAgIGFzeW1tICAxICAgMC4zOTBtcyBwbXR1IDE0ODAKKyAyOiAgM2ZmZToyNDAwOjA6MTA5OjoyICAgICAgICAgICAgICAgNDYzLjUxNG1zIHJlYWNoZWQKKyAgICAgUmVzdW1lOiBwbXR1IDE0ODAgaG9wcyAyIGJhY2sgMgorPC9saXRlcmFsbGF5b3V0PgorPC9wYXJhPgorCis8cGFyYT4KK1RoZSBmaXJzdCBjb2x1bW4gc2hvd3MgPGxpdGVyYWwvVFRMLyBvZiB0aGUgcHJvYmUsIGZvbGxvd2VkIGJ5IGNvbG9uLgorVXN1YWxseSB2YWx1ZSBvZiA8bGl0ZXJhbC9UVEwvIGlzIG9idGFpbmVkIGZyb20gcmVwbHkgZnJvbSBuZXR3b3JrLAorYnV0IHNvbWV0aW1lcyByZXBseSBkb2VzIG5vdCBjb250YWluIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhbmQKK3dlIGhhdmUgdG8gZ3Vlc3MgaXQuIEluIHRoaXMgY2FzZSB0aGUgbnVtYmVyIGlzIGZvbGxvd2VkIGJ5ID8uCis8L3BhcmE+CisKKzxwYXJhPgorVGhlIHNlY29uZCBjb2x1bW4gc2hvd3MgdGhlIG5ldHdvcmsgaG9wLCB3aGljaCByZXBsaWVkIHRvIHRoZSBwcm9iZS4KK0l0IGlzIGVpdGhlciBhZGRyZXNzIG9mIHJvdXRlciBvciB3b3JkIDxsaXRlcmFsL1tMT0NBTEhPU1RdLywgaWYKK3RoZSBwcm9iZSB3YXMgbm90IHNlbnQgdG8gdGhlIG5ldHdvcmsuCis8L3BhcmE+CisKKzxwYXJhPgorVGhlIHJlc3Qgb2YgbGluZSBzaG93cyBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uIGFib3V0IHBhdGggdG8KK3RoZSBjb3JyZXNwaW5kaW5nIG5ldHdvcmsgaG9wLiBBcyBydWxlIGl0IGNvbnRhaW5zIHZhbHVlIG9mIFJUVC4KK0FkZGl0aW9uYWxseSwgaXQgY2FuIHNob3cgUGF0aCBNVFUsIHdoZW4gaXQgY2hhbmdlcy4KK0lmIHRoZSBwYXRoIGlzIGFzeW1tZXRyaWMKK29yIHRoZSBwcm9iZSBmaW5pc2hlcyBiZWZvcmUgaXQgcmVhY2ggcHJlc2NyaWJlZCBob3AsIGRpZmZlcmVuY2UKK2JldHdlZW4gbnVtYmVyIG9mIGhvcHMgaW4gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uIGlzIHNob3duCitmb2xsb3dpbmcga2V5d29yZCA8bGl0ZXJhbC9hc3luYy8uIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90IHJlbGlhYmxlLgorRi5lLiB0aGUgdGhpcmQgbGluZSBzaG93cyBhc3ltbWV0cnkgb2YgMSwgaXQgaXMgYmVjYXVzZSB0aGUgZmlyc3QgcHJvYmUKK3dpdGggVFRMIG9mIDIgd2FzIHJlamVjdGVkIGF0IHRoZSBmaXJzdCBob3AgZHVlIHRvIFBhdGggTVRVIERpc2NvdmVyeS4KKzwvcGFyYT4KKworPHBhcmE+CitUaGUgbGFzdCBsaW5lIHN1bW1hcml6ZXMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiwKK2l0IHNob3dzIGRldGVjdGVkIFBhdGggTVRVLCBhbW91bnQgb2YgaG9wcyB0byB0aGUgZGVzdGluYXRpb24gYW5kIG91cgorZ3Vlc3MgYWJvdXQgYW1vdW50IG9mIGhvcHMgZnJvbSB0aGUgZGVzdGluYXRpb24gdG8gdXMsIHdoaWNoIGNhbiBiZQorZGlmZmVyZW50IHdoZW4gdGhlIHBhdGggaXMgYXN5bW1ldHJpYy4KKzwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworCisKKworPHJlZnNlY3QxPjx0aXRsZT5TRUUgQUxTTzwvdGl0bGU+Cis8cGFyYT4KKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvdHJhY2Vyb3V0ZS88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+LAorPGxpbmsgbGlua2VuZD0idHJhY2Vyb3V0ZTYiPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS90cmFjZXJvdXRlNi88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+PC9saW5rPiwKKzxsaW5rIGxpbmtlbmQ9InBpbmciPgorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS9waW5nLzxtYW52b2xudW0vOC88L2NpdGVyZWZlbnRyeT48L2xpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5BVVRIT1I8L3RpdGxlPgorPHBhcmE+Cis8Y29tbWFuZC90cmFjZXBhdGgvIHdhcyB3cml0dGVuIGJ5Cis8dWxpbmsgdXJsPSJtYWlsdG86a3V6bmV0QG1zMi5pbnIuYWMucnUiPkFsZXhleSBLdXpuZXRzb3YKKyZsdDtrdXpuZXRAbXMyLmluci5hYy5ydSZndDs8L3VsaW5rPi4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+U0VDVVJJVFk8L3RpdGxlPgorPHBhcmE+CitObyBzZWN1cml0eSBpc3N1ZXMuCis8L3BhcmE+Cis8cGFyYT4KK1RoaXMgbGFwaWRhcnkgZGVzZXJ2ZXMgdG8gYmUgZWxhYm9yYXRlZC4KKzxjb21tYW5kL3RyYWNlcGF0aC8gaXMgbm90IGEgcHJpdmlsZWdlZCBwcm9ncmFtLCB1bmxpa2UKKzxjb21tYW5kL3RyYWNlcm91dGUvLCA8Y29tbWFuZC9waW5nLyBhbmQgb3RoZXIgYmVhc3RzIG9mIHRoaXMga2luZC4KKzxjb21tYW5kL3RyYWNlcGF0aC8gbWF5IGJlIGV4ZWN1dGVkIGJ5IGV2ZXJ5b25lIHdobyBoYXMgc29tZSBhY2Nlc3MKK3RvIG5ldHdvcmssIGVub3VnaCB0byBzZW5kIFVEUCBkYXRhZ3JhbXMgdG8gaW52ZXN0aWdhdGVkIGRlc3RpbmF0aW9uCit1c2luZyBnaXZlbiBwb3J0LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5BVkFJTEFCSUxJVFk8L3RpdGxlPgorPHBhcmE+Cis8Y29tbWFuZC90cmFjZXBhdGgvIGlzIHBhcnQgb2YgPGZpbGVuYW1lL2lwdXRpbHMvIHBhY2thZ2UKK2FuZCB0aGUgbGF0ZXN0IHZlcnNpb25zIGFyZSAgYXZhaWxhYmxlIGluIHNvdXJjZSBmb3JtIGF0Cis8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MiI+CitodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MjwvdWxpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPCFbSUdOT1JFWworPHJlZnNlY3QxPjx0aXRsZT5DT1BZSU5HPC90aXRsZT4KKzxwYXJhPgorPGxpdGVyYWxsYXlvdXQ+CitUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK2l0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgVmVyc2lvbiAyLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCit3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCitTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCitGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbiBvZiBMaW51eCBrZXJuZWwgb2YgdmVyc2lvbiAyLjQuCis8L2xpdGVyYWxsYXlvdXQ+Cis8L3BhcmE+Cis8L3JlZnNlY3QxPgorXV0+CisKKworCisKKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9pcHV0aWxzL2RvYy90cmFjZXJvdXRlNi5zZ21sIGIvaXB1dGlscy9kb2MvdHJhY2Vyb3V0ZTYuc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDdkZDEzCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9kb2MvdHJhY2Vyb3V0ZTYuc2dtbApAQCAtMCwwICsxLDk3IEBACis8cmVmZW50cnkgaWQ9InRyYWNlcm91dGU2Ij4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT50cmFjZXJvdXRlNjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+ODwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvPmlwdXRpbHMtJnNuYXBzaG90OzwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+CisKKzxyZWZuYW1lZGl2PgorPHJlZm5hbWU+dHJhY2Vyb3V0ZTY8L3JlZm5hbWU+Cis8cmVmcHVycG9zZT50cmFjZXMgcGF0aCB0byBhIG5ldHdvcmsgaG9zdDwvcmVmcHVycG9zZT4KKzwvcmVmbmFtZWRpdj4KKworPHJlZnN5bm9wc2lzZGl2PgorPGNtZHN5bm9wc2lzPgorPGNvbW1hbmQ+dHJhY2Vyb3V0ZTY8L2NvbW1hbmQ+Cis8YXJnIGNob2ljZT0ib3B0Ij48b3B0aW9uPi1kbnJ2Vjwvb3B0aW9uPjwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LWkgPHJlcGxhY2VhYmxlL2ludGVyZmFjZS88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1tIDxyZXBsYWNlYWJsZS9tYXhfdHRsLzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+LXAgPHJlcGxhY2VhYmxlL3BvcnQvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tcSA8cmVwbGFjZWFibGUvbWF4X3Byb2Jlcy88L2FyZz4KKzxhcmcgY2hvaWNlPSJvcHQiPi1zIDxyZXBsYWNlYWJsZS9zb3VyY2UvPC9hcmc+Cis8YXJnIGNob2ljZT0ib3B0Ij4tdyA8cmVwbGFjZWFibGUvd2FpdCB0aW1lLzwvYXJnPgorPGFyZyBjaG9pY2U9InJlcSI+PHJlcGxhY2VhYmxlL2Rlc3RpbmF0aW9uLzwvYXJnPgorPGFyZyBjaG9pY2U9Im9wdCI+PHJlcGxhY2VhYmxlL3NpemUvPC9hcmc+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworPHJlZnNlY3QxPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT4KK0Rlc2NyaXB0aW9uIGNhbiBiZSBmb3VuZCBpbiAKKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvdHJhY2Vyb3V0ZS88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+LAorYWxsIHRoZSByZWZlcmVuY2VzIHRvIElQIHJlcGxhY2VkIHRvIElQdjYuIEl0IGlzIG5lZWRsZXNzIHRvIGNvcHkKK3RoZSBkZXNjcmlwdGlvbiBmcm9tIHRoZXJlLgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5TRUUgQUxTTzwvdGl0bGU+Cis8cGFyYT4KKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvdHJhY2Vyb3V0ZS88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+LAorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZS90cmFjZXBhdGgvPG1hbnZvbG51bS84LzwvY2l0ZXJlZmVudHJ5PiwKKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGUvcGluZy88bWFudm9sbnVtLzgvPC9jaXRlcmVmZW50cnk+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxPjx0aXRsZT5ISVNUT1JZPC90aXRsZT4KKzxwYXJhPgorVGhpcyBwcm9ncmFtIGhhcyBsb25nIGhpc3RvcnkuIEF1dGhvciBvZiA8Y29tbWFuZC90cmFjZXJvdXRlLworaXMgVmFuIEphY29ic29uIGFuZCBpdCBmaXJzdCBhcHBlYXJlZCBpbiAxOTg4LiBUaGlzIGNsb25lIGlzCitiYXNlZCBvbiBhIHBvcnQgb2YgPGNvbW1hbmQvdHJhY2Vyb3V0ZS8gdG8gSVB2NiBwdWJsaXNoZWQKK2luIE5STCBJUHY2IGRpc3RyaWJ1dGlvbiBpbiAxOTk2LiBJbiB0dXJuLCBpdCB3YXMgcG9ydGVkCit0byBMaW51eCBieSBQZWRybyBSb3F1ZS4gQWZ0ZXIgdGhpcyBpdCB3YXMga2VwdCBpbiBzeW5jIGJ5ICAgIAorPHVsaW5rIHVybD0ibWFpbHRvOmt1em5ldEBtczIuaW5yLmFjLnJ1Ij5BbGV4ZXkgS3V6bmV0c292CismbHQ7a3V6bmV0QG1zMi5pbnIuYWMucnUmZ3Q7PC91bGluaz4uIEFuZCBldmVudHVhbGx5IGVudGVyZWQKKzxjb21tYW5kL2lwdXRpbHMvIHBhY2thZ2UuCis8L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDE+PHRpdGxlPlNFQ1VSSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvdHJhY2VwYXRoNi8gcmVxdWlyZXMgPGNvbnN0YW50L0NBUF9ORVRfUkFXLyBjYXBhYmlsaXR5Cit0byBiZSBleGVjdXRlZC4gSXQgaXMgc2FmZSB0byBiZSB1c2VkIGFzIHNldC11aWQgcm9vdC4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MT48dGl0bGU+QVZBSUxBQklMSVRZPC90aXRsZT4KKzxwYXJhPgorPGNvbW1hbmQvdHJhY2Vyb3V0ZTYvIGlzIHBhcnQgb2YgPGZpbGVuYW1lL2lwdXRpbHMvIHBhY2thZ2UKK2FuZCB0aGUgbGF0ZXN0IHZlcnNpb25zIGFyZSAgYXZhaWxhYmxlIGluIHNvdXJjZSBmb3JtIGF0Cis8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MiI+CitodHRwOi8vd3d3LnNrYnVmZi5uZXQvaXB1dGlscy9pcHV0aWxzLWN1cnJlbnQudGFyLmJ6MjwvdWxpbms+LgorPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPCFbSUdOT1JFWworPHJlZnNlY3QxPjx0aXRsZT5DT1BZSU5HPC90aXRsZT4KKzxwYXJhPgorPGxpdGVyYWxsYXlvdXQ+CitUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK2l0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgVmVyc2lvbiAyLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCit3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCitTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCitGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbiBvZiBMaW51eCBrZXJuZWwgb2YgdmVyc2lvbiAyLjQuCis8L2xpdGVyYWxsYXlvdXQ+Cis8L3BhcmE+Cis8L3JlZnNlY3QxPgorXV0+CisKKworCis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9pbjZfZmxvd2xhYmVsLmggYi9pcHV0aWxzL2luNl9mbG93bGFiZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTI3Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9pbjZfZmxvd2xhYmVsLmgKQEAgLTAsMCArMSw0IEBACisvKiBUaGUgaW42X2Zsb3dsYWJlbC5oIGZpbGUgaW4gdGhlIGlwdXRpbHMgZGlzdHJpYnV0aW9uIGV4aXN0cyB0byBwcm92aWRlCisgKiBrZXJuZWwgZmxvd2xhYmVsIEFQSSBkZWZpbml0aW9ucyB0aGF0IGFyZSBub3QgaW4gdGhlIHVzZXJzcGFjZSBoZWFkZXJzCisgKiBiZWNhdXNlIHRoZXkgYXJlIGxpbnV4LXNwZWNpZmljLiBJdCdzIG5vdCBuZWVkZWQgb24gQW5kcm9pZCBiZWNhdXNlIEFuZHJvaWQKKyAqIGV4cG9zZXMgdGhlIGtlcm5lbCBkZWZpbml0aW9ucyB0byB1c2Vyc3BhY2UgZGlyZWN0bHkgLiAqLwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9pcGcgYi9pcHV0aWxzL2lwZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzMyMDEzCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9pcGcKQEAgLTAsMCArMSwzNCBAQAorIyEgL2Jpbi9iYXNoCisKK2lmIFsgLWUgL3Byb2MvbW9kdWxlcyBdIDsgdGhlbgorCW1vZHByb2JlIHBnMyA+JiAvZGV2L251bGwKKwltb2Rwcm9iZSBwa3RnZW4gPiYgL2Rldi9udWxsCitmaQorCitmb3IgUEdERVYgaW4gL3Byb2MvbmV0L3BnIC9wcm9jL25ldC9wa3RnZW4vcGcwIC8gOyBkbworCVsgLWUgJHtQR0RFVn0gXSAmJiBicmVhaworZG9uZQoraWYgWyAiJHtQR0RFVn0iID0gIi8iIF0gOyB0aGVuCisJZWNobyAiQ291bGQgbm90IGxvY2F0ZSBwZyBpbiAvcHJvYy9uZXQiIDE+JjIKKwlleGl0IDEKK2ZpCisKK2Z1bmN0aW9uIHBnc2V0KCkgeworICAgIGxvY2FsIHJlc3VsdAorCisgICAgZWNobyAkMSA+ICR7UEdERVZ9CisKKyAgICByZXN1bHQ9YGNhdCAke1BHREVWfSB8IGZncmVwICJSZXN1bHQ6IE9LOiJgCisgICAgaWYgWyAiJHJlc3VsdCIgPSAiIiBdOyB0aGVuCisgICAgICAgICBjYXQgJHtQR0RFVn0gfCBmZ3JlcCBSZXN1bHQ6CisgICAgZmkKK30KKworZnVuY3Rpb24gcGcoKSB7CisgICAgZWNobyBpbmplY3QgPiAke1BHREVWfQorICAgIGNhdCAke1BHREVWfQorfQorCitwZ3NldCAib2RldiBldGgwIgorcGdzZXQgImRzdCAwLjAuMC4wIgorCmRpZmYgLS1naXQgYS9pcHV0aWxzL2lwdXRpbHMuc3BlYyBiL2lwdXRpbHMvaXB1dGlscy5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjNhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL2lwdXRpbHMuc3BlYwpAQCAtMCwwICsxLDkzIEBACisjCisjIFRoaXMgc3BlYyBmaWxlIGlzIGZvciBfdGVzdGluZ18uCisjCisKKyVkZWZpbmUgc3NkYXRlIDIwMTIxMjIxCitTdW1tYXJ5OiBUaGUgcGluZyBwcm9ncmFtIGZvciBjaGVja2luZyB0byBzZWUgaWYgbmV0d29yayBob3N0cyBhcmUgYWxpdmUuCitOYW1lOiBpcHV0aWxzCitWZXJzaW9uOiBzJXtzc2RhdGV9CitSZWxlYXNlOiAxbG9jYWwKK0xpY2Vuc2U6IEdQTHYyKworR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9EYWVtb25zCitTb3VyY2UwOiBpcHV0aWxzLXMle3NzZGF0ZX0udGFyLmJ6MgorUHJlZml4OiAle19wcmVmaXh9CitCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tcm9vdAorI0J1aWxkUHJlcmVxOiBkb2Nib29rLWR0ZDMxLXNnbWwsIHBlcmwKK1JlcXVpcmVzOiBrZXJuZWwgPj0gMi40LjcKKworJWRlc2NyaXB0aW9uCitUaGUgaXB1dGlscyBwYWNrYWdlIGNvbnRhaW5zIHBpbmcsIGEgYmFzaWMgbmV0d29ya2luZyB0b29sLiAgVGhlIHBpbmcKK2NvbW1hbmQgc2VuZHMgYSBzZXJpZXMgb2YgSUNNUCBwcm90b2NvbCBFQ0hPX1JFUVVFU1QgcGFja2V0cyB0byBhCitzcGVjaWZpZWQgbmV0d29yayBob3N0IGFuZCBjYW4gdGVsbCB5b3UgaWYgdGhhdCBtYWNoaW5lIGlzIGFsaXZlIGFuZAorcmVjZWl2aW5nIG5ldHdvcmsgdHJhZmZpYy4KKworJXByZXAKKyVzZXR1cCAtcSAle25hbWV9CisKKyVidWlsZAorbWFrZQorbWFrZSBuaW5mb2QKK21ha2UgbWFuCittYWtlIGh0bWwKKworJWluc3RhbGwKK3JtIC1mciAke1JQTV9CVUlMRF9ST09UfQorbWtkaXIgLXAgJHtSUE1fQlVJTERfUk9PVH0le19zYmluZGlyfQorbWtkaXIgLXAgJHtSUE1fQlVJTERfUk9PVH0le19iaW5kaXJ9Citta2RpciAtcCAkUlBNX0JVSUxEX1JPT1QvJXtfdW5pdGRpcn0KKworaW5zdGFsbCAtYyBjbG9ja2RpZmYgICAgICAgICAgICAke1JQTV9CVUlMRF9ST09UfSV7X3NiaW5kaXJ9LworaW5zdGFsbCAtY3AgYXJwaW5nICAgICAgICAgICAgICAke1JQTV9CVUlMRF9ST09UfSV7X3NiaW5kaXJ9LworaW5zdGFsbCAtY3AgcGluZyAgICAgICAgICAgICAgICAke1JQTV9CVUlMRF9ST09UfSV7X2JpbmRpcn0vCitpbnN0YWxsIC1jcCByZGlzYyAgICAgICAgICAgICAgICR7UlBNX0JVSUxEX1JPT1R9JXtfc2JpbmRpcn0vCitpbnN0YWxsIC1jcCBwaW5nNiAgICAgICAgICAgICAgICR7UlBNX0JVSUxEX1JPT1R9JXtfYmluZGlyfS8KK2luc3RhbGwgLWNwIHRyYWNlcGF0aCAgICAgICAgICAgJHtSUE1fQlVJTERfUk9PVH0le19iaW5kaXJ9LworaW5zdGFsbCAtY3AgdHJhY2VwYXRoNiAgICAgICAgICAke1JQTV9CVUlMRF9ST09UfSV7X2JpbmRpcn0vCitpbnN0YWxsIC1jcCBuaW5mb2QvbmluZm9kICAgICAgICR7UlBNX0JVSUxEX1JPT1R9JXtfc2JpbmRpcn0vCisKK21rZGlyIC1wICR7UlBNX0JVSUxEX1JPT1R9JXtfYmluZGlyfQorbG4gLXNmIC4uL2Jpbi9waW5nNiAke1JQTV9CVUlMRF9ST09UfSV7X3NiaW5kaXJ9CitsbiAtc2YgLi4vYmluL3RyYWNlcGF0aCAke1JQTV9CVUlMRF9ST09UfSV7X3NiaW5kaXJ9CitsbiAtc2YgLi4vYmluL3RyYWNlcGF0aDYgJHtSUE1fQlVJTERfUk9PVH0le19zYmluZGlyfQorCitta2RpciAtcCAke1JQTV9CVUlMRF9ST09UfSV7X21hbmRpcn0vbWFuOAoraW5zdGFsbCAtY3AgZG9jL2Nsb2NrZGlmZi44ICAgICAke1JQTV9CVUlMRF9ST09UfSV7X21hbmRpcn0vbWFuOC8KK2luc3RhbGwgLWNwIGRvYy9hcnBpbmcuOCAgICAgICAgJHtSUE1fQlVJTERfUk9PVH0le19tYW5kaXJ9L21hbjgvCitpbnN0YWxsIC1jcCBkb2MvcGluZy44ICAgICAgICAgICR7UlBNX0JVSUxEX1JPT1R9JXtfbWFuZGlyfS9tYW44LworaW5zdGFsbCAtY3AgZG9jL3JkaXNjLjggICAgICAgICAke1JQTV9CVUlMRF9ST09UfSV7X21hbmRpcn0vbWFuOC8KK2luc3RhbGwgLWNwIGRvYy90cmFjZXBhdGguOCAgICAgJHtSUE1fQlVJTERfUk9PVH0le19tYW5kaXJ9L21hbjgvCitpbnN0YWxsIC1jcCBkb2MvbmluZm9kLjggICAgICAgICR7UlBNX0JVSUxEX1JPT1R9JXtfbWFuZGlyfS9tYW44LworbG4gLXMgcGluZy44Lmd6ICR7UlBNX0JVSUxEX1JPT1R9JXtfbWFuZGlyfS9tYW44L3Bpbmc2LjguZ3oKK2xuIC1zIHRyYWNlcGF0aC44Lmd6ICR7UlBNX0JVSUxEX1JPT1R9JXtfbWFuZGlyfS9tYW44L3RyYWNlcGF0aDYuOC5negorCitpY29udiAtZiBJU084ODU5MSAtdCBVVEY4IFJFTE5PVEVTIC1vIFJFTE5PVEVTLnRtcAordG91Y2ggLXIgUkVMTk9URVMgUkVMTk9URVMudG1wCittdiAtZiBSRUxOT1RFUy50bXAgUkVMTk9URVMKKworJWNsZWFuCitybSAtcmYgJHtSUE1fQlVJTERfUk9PVH0KKworJWZpbGVzCislZG9jIFJFTE5PVEVTCislYXR0cigwNzU1LHJvb3Qscm9vdCkgJWNhcHMoY2FwX25ldF9yYXc9ZXApICV7X3NiaW5kaXJ9L2Nsb2NrZGlmZgorIyVhdHRyKDQ3NTUscm9vdCxyb290KSAle19zYmluZGlyfS9jbG9ja2RpZmYKKyVhdHRyKDA3NTUscm9vdCxyb290KSAlY2FwcyhjYXBfbmV0X3Jhdz1lcCkgJXtfc2JpbmRpcn0vYXJwaW5nCisjJWF0dHIoNDc1NSxyb290LHJvb3QpICV7X3NiaW5kaXJ9L2FycGluZworJWF0dHIoMDc1NSxyb290LHJvb3QpICVjYXBzKGNhcF9uZXRfcmF3PWVwIGNhcF9uZXRfYWRtaW49ZXApICV7X2JpbmRpcn0vcGluZworIyVhdHRyKDQ3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3BpbmcKKyVhdHRyKDA3NTUscm9vdCxyb290KSAlY2FwcyhjYXBfbmV0X3Jhdz1lcCBjYXBfbmV0X2FkbWluPWVwKSAle19iaW5kaXJ9L3Bpbmc2CisjJWF0dHIoNDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vcGluZzYKKyV7X3NiaW5kaXJ9L3JkaXNjCisle19iaW5kaXJ9L3RyYWNlcGF0aAorJXtfYmluZGlyfS90cmFjZXBhdGg2Cisle19zYmluZGlyfS9waW5nNgorJXtfc2JpbmRpcn0vdHJhY2VwYXRoCisle19zYmluZGlyfS90cmFjZXBhdGg2Cisle19zYmluZGlyfS9uaW5mb2QKKyVhdHRyKDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuOC8qCisKKyVjaGFuZ2Vsb2cKKyogRnJpIE5vdiAzMCAyMDEyIFlPU0hJRlVKSSBIaWRlYWtpIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKyAgUGFydGljYWxseSBzeW5jIHdpdGggY3VycmVudCBGZWRvcmEncyBzcGVjZmlsZS4KKyogU2F0IEZlYiAyMyAyMDAxIEFsZXhleSBLdXpuZXRzb3YgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICBUYWtlbiBpcHV0aWxzIHJwbSBmcm9tIEFTUExpbnV4LTcuMiBhcyBwYXR0ZXJuLgpkaWZmIC0tZ2l0IGEvaXB1dGlscy9uaW5mb2QvQ09QWUlORyBiL2lwdXRpbHMvbmluZm9kL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkZjU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvbmluZm9kL0NPUFlJTkcKQEAgLTAsMCArMSwyNiBAQAorQ29weXJpZ2h0IChDKSAyMDAyIFVTQUdJL1dJREUgUHJvamVjdC4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCitBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKK0ZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9pcHV0aWxzL25pbmZvZC9NYWtlZmlsZS5pbiBiL2lwdXRpbHMvbmluZm9kL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDc4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL25pbmZvZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDg4IEBACisjICRVU0FHSTogTWFrZWZpbGUuaW4sdiAxLjYgMjAwMy0wMS0xNSAwNjo0MToyMyBtayBFeHAgJAorIworIyBDb3B5cmlnaHQgKEMpMjAwMiBVU0FHSS9XSURFIFByb2plY3QuCisjIENvcHlyaWdodCAoQykyMDAwLTIwMDEgSGlkZWFraSBZT1NISUZVSkkgYW5kIFVTQUdJIFByb2plY3QuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCisjICRJZDogTWFrZWZpbGUuaW4sdiAxLjIgMjAwMC8wNi8xMCAwNTo0NToxNCB5b3NoZnVqaSBFeHAgeW9zaGZ1amkgJAorCitTSEVMTCA9IEBTSEVMTEAKKworc3JjZGlyID0gQHNyY2RpckAKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYmluZGlyID0gQGJpbmRpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsaWJkaXIgPSBAbGliZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorCitDQyA9IEBDQ0AKK0NGTEFHUz1AQ0ZMQUdTQCAtRF9HTlVfU09VUkNFCitERUZTPUBERUZTQAorTElCUz1ATElCU0AKK0xERkxBR1M9QExERkxBR1NACitJTlNUQUxMID0gQElOU1RBTExACisKKyMgLS0tLS0tLS0tLS0tLS0tLQorYWxsOiBuaW5mb2QKK2NsZWFuOgorCS1ybSAtZiAqLm8gbmluZm9kCitkaXN0Y2xlYW46IGNsZWFuCisJLXJtIC1mICp+ICouYmFrICMqCisJLXJtIC1mciBhdXRvbTR0ZS5jYWNoZQorCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuaCBjb25maWcuY2FjaGUgY29uZmlnLnN0YXR1cyBjb25maWcubG9nCisJLXJtIC1mIG5pbmZvZC5zaAoraW5zdGFsbDogYWxsCisJQElOU1RBTExfRElSQCBAc2JpbmRpckAKKwlASU5TVEFMTEAgbmluZm9kIC1vIHJvb3QgQHNiaW5kaXJACisJQElOU1RBTExAIG5pbmZvZC5zaCAtbyByb290IC1tIDc1NSBAc3lzY29uZmRpckAvaW5pdC5kL25pbmZvZAorCisjIC0tLS0tLS0tLS0tLS0tLS0KK25pbmZvZDogbmluZm9kX2FkZHJzLm8gbmlfaWZhZGRycy5vIG5pbmZvZF9uYW1lLm8gbmluZm9kX2NvcmUubyBuaW5mb2QubworCSQoQ0MpICQoTERGTEFHUykgJF4gJChMSUJTKSAtbyAkQAorJS5vOiAlLmMKKwkkKENDKSAkKENGTEFHUykgLWMgJChERUZTKSAtbyAkQCAkPAorCisjIC0tLS0tLS0tLS0tLS0tLS0KK25pX2lmYWRkcnMubzogY29uZmlnLmggbmlfaWZhZGRycy5oCituaW5mb2QubzogY29uZmlnLmggbmluZm9kLmgKK25pbmZvZF9hZGRycy5jOiBjb25maWcuaCBuaW5mb2QuaCBuaV9pZmFkZHJzLmgKK25pbmZvZF9jb3JlLmM6IGNvbmZpZy5oIG5pbmZvZC5oCituaW5mb2RfbmFtZS5jOiBjb25maWcuaCBuaW5mb2QuaAorCmRpZmYgLS1naXQgYS9pcHV0aWxzL25pbmZvZC9jb25maWcuaC5pbiBiL2lwdXRpbHMvbmluZm9kL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzA5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL25pbmZvZC9jb25maWcuaC5pbgpAQCAtMCwwICsxLDEzOSBAQAorLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybykgKi8KKyN1bmRlZiBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKworLyogRW5hYmxlIGRlYnVnZ2luZyAqLworI3VuZGVmIEVOQUJMRV9ERUJVRworCisvKiBFbmFibGUgdHRsIHN1cHBvcnQgZm9yIHF0eXBlcyAoZGVwcmVjYXRlZCkgKi8KKyN1bmRlZiBFTkFCTEVfU1VQVFlQRVMKKworLyogRW5hYmxlIHRocmVhZHMgKi8KKyN1bmRlZiBFTkFCTEVfVEhSRUFEUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0FSUEFfSU5FVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z251dGxzL29wZW5zc2wuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9HTlVUTFNfT1BFTlNTTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2FwJyBsaWJyYXJ5ICgtbGNhcCkuICovCisjdW5kZWYgSEFWRV9MSUJDQVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdGhyZWFkJyBsaWJyYXJ5ICgtbHB0aHJlYWQpLiAqLworI3VuZGVmIEhBVkVfTElCUFRIUkVBRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvcnRuZXRsaW5rLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfUlRORVRMSU5LX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5hbm9zbGVlcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9OQU5PU0xFRVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVERCX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2ljbXA2Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkVUSU5FVF9JQ01QNl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVElORVRfSU5fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaXA2Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkVUSU5FVF9JUDZfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG9wZW5zc2wvbWQ1Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfT1BFTlNTTF9NRDVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QVEhSRUFEX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwd2QuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QV0RfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURElOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3RydWN0IGljbXA2X25vZGVpbmZvICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfSUNNUDZfTk9ERUlORk8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXNsb2cuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNMT0dfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9jYXBhYmlsaXR5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0NBUEFCSUxJVFlfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Vpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19VSU9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91dHNuYW1lLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1VUU05BTUVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX05BTUUKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1VSTAorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICovCisjdW5kZWYgVElNRV9XSVRIX1NZU19USU1FCisKKy8qIERlZmluZSBXT1JEU19CSUdFTkRJQU4gdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCkuICovCisjaWYgZGVmaW5lZCBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKyMgaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXworIyAgZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgV09SRFNfQklHRU5ESUFOCisjICB1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgc2l6ZV90CmRpZmYgLS1naXQgYS9pcHV0aWxzL25pbmZvZC9jb25maWd1cmUgYi9pcHV0aWxzL25pbmZvZC9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzYzZTQxNgotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvbmluZm9kL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDU1MTkgQEAKKyMhIC9iaW4vc2gKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LgorIworIworIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisjIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKyMKKyMgQ29weXJpZ2h0IChDKTIwMDIgVVNBR0kvV0lERSBQcm9qZWN0LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisKKworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQorCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIGV4aXQgMQorZmkKKworIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgorIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgorIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAorIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KK2ZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKK2RvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCisgICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCisKKyMgQ0RQQVRILgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCisgIGFzX2JvdXJuZV9jb21wYXRpYmxlPSJpZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorIgorICBhc19yZXF1aXJlZD0iYXNfZm5fcmV0dXJuICgpIHsgKGV4aXQgXCQxKTsgfQorYXNfZm5fc3VjY2VzcyAoKSB7IGFzX2ZuX3JldHVybiAwOyB9Cithc19mbl9mYWlsdXJlICgpIHsgYXNfZm5fcmV0dXJuIDE7IH0KK2FzX2ZuX3JldF9zdWNjZXNzICgpIHsgcmV0dXJuIDA7IH0KK2FzX2ZuX3JldF9mYWlsdXJlICgpIHsgcmV0dXJuIDE7IH0KKworZXhpdGNvZGU9MAorYXNfZm5fc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2FzX2ZuX3JldF9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9yZXRfZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQoraWYgKCBzZXQgeDsgYXNfZm5fcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4gOgorCitlbHNlCisgIGV4aXRjb2RlPTE7IGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgorZmkKK3Rlc3QgeFwkZXhpdGNvZGUgPSB4MCB8fCBleGl0IDEiCisgIGFzX3N1Z2dlc3RlZD0iICBhc19saW5lbm9fMT0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzFhPVwkTElORU5PCisgIGFzX2xpbmVub18yPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMmE9XCRMSU5FTk8KKyAgZXZhbCAndGVzdCBcInhcJGFzX2xpbmVub18xJ1wkYXNfcnVuJ1wiICE9IFwieFwkYXNfbGluZW5vXzInXCRhc19ydW4nXCIgJiYKKyAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSdcJGFzX3J1bicgKyAxXGBcIiA9IFwieFwkYXNfbGluZW5vXzInXCRhc19ydW4nXCInIHx8IGV4aXQgMQordGVzdCBcJCgoIDEgKyAxICkpID0gMiB8fCBleGl0IDEiCisgIGlmIChldmFsICIkYXNfcmVxdWlyZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitlbHNlCisgIGFzX2hhdmVfcmVxdWlyZWQ9bm8KK2ZpCisgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geHllcyAmJiAoZXZhbCAiJGFzX3N1Z2dlc3RlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKworZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCithc19mb3VuZD1mYWxzZQorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBhc19mb3VuZD06CisgIGNhc2UgJGFzX2RpciBpbiAjKAorCSAvKikKKwkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisJICAgICAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCisJICAgICBhc19zaGVsbD0kYXNfZGlyLyRhc19iYXNlCisJICAgICBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRhc19zaGVsbCBhc19oYXZlX3JlcXVpcmVkPXllcworCQkgICBpZiB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19zdWdnZXN0ZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBicmVhayAyCitmaQorZmkKKwkgICBkb25lOzsKKyAgICAgICBlc2FjCisgIGFzX2ZvdW5kPWZhbHNlCitkb25lCiskYXNfZm91bmQgfHwgeyBpZiB7IHRlc3QgLWYgIiRTSEVMTCIgfHwgdGVzdCAtZiAiJFNIRUxMLmV4ZSI7IH0gJiYKKwkgICAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJFNIRUxMIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kU0hFTEwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2ZpOyB9CitJRlM9JGFzX3NhdmVfSUZTCisKKworICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4gOgorICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQorCSMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCisJIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KKwkjIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCisJQkFTSF9FTlY9L2Rldi9udWxsCisJRU5WPS9kZXYvbnVsbAorCSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorCWV4cG9ydCBDT05GSUdfU0hFTEwKKwljYXNlICQtIGluICMgKCgoKAorCSAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CisJICAqdiogKSBhc19vcHRzPS12IDs7CisJICAqeCogKSBhc19vcHRzPS14IDs7CisJICAqICkgYXNfb3B0cz0gOzsKKwllc2FjCisJZXhlYyAiJENPTkZJR19TSEVMTCIgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQorZmkKKworICAgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geG5vOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiQwOiBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIgorICAkYXNfZWNobyAiJDA6IHRoZSBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiIKKyAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KKyAgICAkYXNfZWNobyAiJDA6IEluIHBhcnRpY3VsYXIsIHpzaCAkWlNIX1ZFUlNJT04gaGFzIGJ1Z3MgYW5kIHNob3VsZCIKKyAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCisgIGVsc2UKKyAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAorJDA6IGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCiskMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KKyQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgorICBmaQorICBleGl0IDEKK2ZpCitmaQorZmkKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitleHBvcnQgU0hFTEwKKyMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgorQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KK3Vuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTworICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgeworICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KKyAgICAgIE4KKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKyAgICAgIHQgbG9vcAorICAgICAgcy8tXG4uKi8vCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKwordGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAorZXhlYyA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0KK1BBQ0tBR0VfVEFSTkFNRT0KK1BBQ0tBR0VfVkVSU0lPTj0KK1BBQ0tBR0VfU1RSSU5HPQorUEFDS0FHRV9CVUdSRVBPUlQ9CitQQUNLQUdFX1VSTD0KKworYWNfdW5pcXVlX2ZpbGU9Im5pbmZvZC5jIgorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbC92NgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCithY19zdWJzdF92YXJzPSdMVExJQk9CSlMKK0xJQk9CSlMKK0VHUkVQCitHUkVQCitDUFAKK0lOU1RBTExfRElSCitJTlNUQUxMX0xJQgorSU5TVEFMTF9EQVRBCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9QUk9HUkFNCitPQkpFWFQKK0VYRUVYVAorYWNfY3RfQ0MKK0NQUEZMQUdTCitMREZMQUdTCitDRkxBR1MKK0NDCit0YXJnZXRfYWxpYXMKK2hvc3RfYWxpYXMKK2J1aWxkX2FsaWFzCitMSUJTCitFQ0hPX1QKK0VDSE9fTgorRUNIT19DCitERUZTCittYW5kaXIKK2xvY2FsZWRpcgorbGliZGlyCitwc2RpcgorcGRmZGlyCitkdmlkaXIKK2h0bWxkaXIKK2luZm9kaXIKK2RvY2Rpcgorb2xkaW5jbHVkZWRpcgoraW5jbHVkZWRpcgorbG9jYWxzdGF0ZWRpcgorc2hhcmVkc3RhdGVkaXIKK3N5c2NvbmZkaXIKK2RhdGFkaXIKK2RhdGFyb290ZGlyCitsaWJleGVjZGlyCitzYmluZGlyCitiaW5kaXIKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKK3ByZWZpeAorZXhlY19wcmVmaXgKK1BBQ0tBR0VfVVJMCitQQUNLQUdFX0JVR1JFUE9SVAorUEFDS0FHRV9TVFJJTkcKK1BBQ0tBR0VfVkVSU0lPTgorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX05BTUUKK1BBVEhfU0VQQVJBVE9SCitTSEVMTCcKK2FjX3N1YnN0X2ZpbGVzPScnCithY191c2VyX29wdHM9JworZW5hYmxlX29wdGlvbl9jaGVja2luZworZW5hYmxlX2RlYnVnCitlbmFibGVfdGhyZWFkcworZW5hYmxlX3N1cHR5cGVzCisnCisgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcworaG9zdF9hbGlhcwordGFyZ2V0X2FsaWFzCitDQworQ0ZMQUdTCitMREZMQUdTCitMSUJTCitDUFBGTEFHUworQ1BQJworCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorYWNfdW5yZWNvZ25pemVkX29wdHM9CithY191bnJlY29nbml6ZWRfc2VwPQorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2NhY2hlX2ZpbGU9L2Rldi9udWxsCitleGVjX3ByZWZpeD1OT05FCitub19jcmVhdGU9Citub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KKyMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJworZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0V9JworaW5mb2Rpcj0nJHtkYXRhcm9vdGRpcn0vaW5mbycKK2h0bWxkaXI9JyR7ZG9jZGlyfScKK2R2aWRpcj0nJHtkb2NkaXJ9JworcGRmZGlyPScke2RvY2Rpcn0nCitwc2Rpcj0nJHtkb2NkaXJ9JworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitsb2NhbGVkaXI9JyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZScKK21hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJworCithY19wcmV2PQorYWNfZGFzaGRhc2g9Citmb3IgYWNfb3B0aW9uCitkbworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAkYWNfcHJldj1cJGFjX29wdGlvbgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgKj0/KikgYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKKyAgKj0pICAgYWNfb3B0YXJnPSA7OworICAqKSAgICBhY19vcHRhcmc9eWVzIDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgorICAtLSkKKyAgICBhY19kYXNoZGFzaD15ZXMgOzsKKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKKyAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKKyAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCisgICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OworICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCisgIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQorICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZGlzYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1ubyA7OworCisgIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCisgICAgYWNfcHJldj1kb2NkaXIgOzsKKyAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCisgICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKKworICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQorICAgIGFjX3ByZXY9ZHZpZGlyIDs7CisgIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCisgICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZW5hYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQorICAgIGFjX3ByZXY9aHRtbGRpciA7OworICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKKyAgfCAtLWh0PSopCisgICAgaHRtbGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKKyAgICBhY19wcmV2PWxvY2FsZWRpciA7OworICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQorICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCisgICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisKKyAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKKyAgICBhY19wcmV2PXBkZmRpciA7OworICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQorICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKKyAgICBhY19wcmV2PXBzZGlyIDs7CisgIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQorICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGgtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRob3V0LSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1ubyA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCRhY19vcHRpb24nCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICAgIDs7CisKKyAgKj0qKQorICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtePV0qXCk9J2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgY2FzZSAkYWNfZW52dmFyIGluICMoCisgICAgICAnJyB8IFswLTldKiB8ICpbIV8kYXNfY3JfYWxudW1dKiApCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YXJpYWJsZSBuYW1lOiBcYCRhY19lbnZ2YXInIiA7OworICAgIGVzYWMKKyAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKKyAgICBleHBvcnQgJGFjX2VudnZhciA7OworCisgICopCisgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgorICAgIDogIiR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259IgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICBhc19mbl9lcnJvciAkPyAibWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIgorZmkKKworaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgorICBjYXNlICRlbmFibGVfb3B0aW9uX2NoZWNraW5nIGluCisgICAgbm8pIDs7CisgICAgZmF0YWwpIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA7OworICAgICopICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjIgOzsKKyAgZXNhYworZmkKKworIyBDaGVjayBhbGwgZGlyZWN0b3J5IGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kuCitmb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKKwkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCisJCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKKwkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKK2RvCisgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAjIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICAqLyApCisgICAgICBhY192YWw9YGV4cHIgIlgkYWNfdmFsIiA6ICdYXCguKlteL11cKScgXHwgIlgkYWNfdmFsIiA6ICdYXCguKlwpJ2AKKyAgICAgIGV2YWwgJGFjX3Zhcj1cJGFjX3ZhbDs7CisgIGVzYWMKKyAgIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKKyAgZXNhYworICBhc19mbl9lcnJvciAkPyAiZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIKK2RvbmUKKworIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitidWlsZD0kYnVpbGRfYWxpYXMKK2hvc3Q9JGhvc3RfYWxpYXMKK3RhcmdldD0kdGFyZ2V0X2FsaWFzCisKKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2lmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkIiA+JjIKKyAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKyAgZmkKK2ZpCisKK2FjX3Rvb2xfcHJlZml4PQordGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCisKKworYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCithY19sc19kaT1gbHMgLWRpIC5gICYmCithY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIndvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIgordGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJwd2QgZG9lcyBub3QgcmVwb3J0IG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkiCisKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX215c2VsZiIgfHwKKyRhc19leHByIFgiJGFzX215c2VsZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19teXNlbGYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllcyAmJiBzcmNkaXI9IiRhY19jb25mZGlyIG9yIC4uIgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIgorZmkKK2FjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKK2FjX2Fic19jb25mZGlyPWAoCisJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCBhc19mbl9lcnJvciAkPyAiJGFjX21zZyIKKwlwd2QpYAorIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KK2lmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KKyAgc3JjZGlyPS4KK2ZpCisjIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgorIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCisjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KK2Nhc2UgJHNyY2RpciBpbgorKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Citlc2FjCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorZG9uZQorCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxfQUNFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nIC4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL1BBQ0tBR0VdCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCitfQUNFT0YKKworICBjYXQgPDxcX0FDRU9GCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCisKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1lbmFibGUtZGVidWcgICAgICAgICAgRW5hYmxlIGRlYnVnZ2luZworICAtLWRpc2FibGUtdGhyZWFkcyAgICAgICBEaXNhYmxlIHRocmVhZHMgKGFuZCByYW5kb20gZGVsYXkpCisgIC0tZW5hYmxlLXN1cHR5cGVzICAgICAgIEVuYWJsZSBzdXB0eXBlcyBxdHlwZSAoZGVwcmVjYXRlZCkKKyAgLS1lbmFibGUtdHRsICAgICAgICAgICAgRW5hYmxlIHR0bCBzdXBwb3J0IGZvciBxdHlwZXMgKGRlcHJlY2F0ZWQpCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLgorX0FDRU9GCithY19zdGF0dXM9JD8KK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorY29uZmlndXJlCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjgKKworQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworQ29weXJpZ2h0IChDKTIwMDIgVVNBR0kvV0lERSBQcm9qZWN0LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK19BQ0VPRgorICBleGl0CitmaQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEF1dG9jb25mIGluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgYWNfZm5fY190cnlfY29tcGlsZSBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4gY29uZnRlc3QuaSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY3BwCisKKyMgYWNfZm5fY190cnlfcnVuIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcworIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KK2FjX2ZuX2NfdHJ5X3J1biAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisgICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cworZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9ydW4KKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZworIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKKyAgeWVzOm5vOiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAorCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgVFlQRSBleGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCisjIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfdHlwZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPW5vIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgkMikpCisJIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCgkMikpKQorCSAgICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGV2YWwgIiQzPXllcyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX3R5cGUKKworIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2xpbmsKKworIyBhY19mbl9jX2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBGVU5DIGV4aXN0cywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5CithY19mbl9jX2NoZWNrX2Z1bmMgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfZnVuYworY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKworSXQgd2FzIGNyZWF0ZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqXCcqKQorICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKK3sgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KK3sgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCisjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispCisgICAgZWNobworCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgICBjYXNlICRhY192YWwgaW4KKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKyAgICAgIGVzYWMKKyAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICBkb25lIHwgc29ydAorICAgIGVjaG8KKworICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKyAgICAgIGRvCisJZXZhbCBhY192YWw9XCQkYWNfdmFyCisJY2FzZSAkYWNfdmFsIGluCisJKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworCWVzYWMKKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgY2F0IGNvbmZkZWZzLmgKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCisgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAorCiskYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2FjX3NpdGVfZmlsZTE9Tk9ORQorYWNfc2l0ZV9maWxlMj1OT05FCitpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCisgICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCisgIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAorICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CisgICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgZXNhYworZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIiBcCisgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKKyAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KKwlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKKwlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKwlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBhY19jYWNoZV9jb3JydXB0ZWQ9OgorCWVsc2UKKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CisgICAgZXNhYworICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCisgICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7CisgICAgZXNhYworICBmaQorZG9uZQoraWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKK2ZpCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCithY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGNvbmZpZy5oIgorCisKKworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIGZpCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIHNlZCAnMTBhXAorLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgorICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KK2RvbmUKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKworIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgorYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKworYWNfcm1maWxlcz0KK2ZvciBhY19maWxlIGluICRhY19maWxlcworZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKKyAgZXNhYworZG9uZQorcm0gLWYgJGFjX3JtZmlsZXMKKworaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCisjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCisjIEF1dG9jb25mLgorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCitkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKKwk7OworICAgIFthYl0ub3V0ICkKKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorCSMgY2VydGFpbmx5IHJpZ2h0LgorCWJyZWFrOzsKKyAgICAqLiogKQorCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOworCXRoZW4gOjsgZWxzZQorCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCWZpCisJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90CisJIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCisJIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCisJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCisJIyBhY3R1YWxseSB3b3JraW5nLgorCWJyZWFrOzsKKyAgICAqICkKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKK3Rlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQorCitlbHNlCisgIGFjX2ZpbGU9JycKK2ZpCitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CisKK3JtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KK2lmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOworIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBlbHNlCisJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgIGZpCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X29iamV4dCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2NfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2NjX2c9bm8KKyAgIENGTEFHUz0iLWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBDRkxBR1M9IiIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworCSBDRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19jODk9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCisvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZpbmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisJLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCitkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKKyAgKikKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OworZXNhYworaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKKworZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KKyAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCisjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4gIygoCisgIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bworCSAgICBta2RpciBjb25mdGVzdC5kaXIKKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworCSAgICB0aGVuCisJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICAgIGJyZWFrIDMKKwkgICAgZmkKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKKworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK3JtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK0lOU1RBTExfTElCPSJcJHtJTlNUQUxMX0RBVEF9IgorCitJTlNUQUxMX0RJUj0iXCR7SU5TVEFMTH0gLWQiCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZGVidWc7CitmaQorCitpZiB0ZXN0IHgiJGVuYWJsZXZhbCIgIT0geCJubyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgRU5BQkxFX0RFQlVHIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGhyZWFkcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90aHJlYWRzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdGhyZWFkczsKK2Vsc2UKKyAgZW5hYmxlX3RocmVhZHM9bm8KK2ZpCisKK2lmIHRlc3QgeCIkZW5hYmxldmFsIiAhPSB4Im5vIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBFTkFCTEVfVEhSRUFEUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN1cHR5cGVzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N1cHR5cGVzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc3VwdHlwZXM7CitmaQorCitpZiB0ZXN0IHgiJGVuYWJsZXZhbCIgIT0geCJubyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgRU5BQkxFX1NVUFRZUEVTIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3VwdHlwZXMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3VwdHlwZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zdXB0eXBlczsKK2ZpCisKK2lmIHRlc3QgeCIkZW5hYmxldmFsIiAhPSB4Im5vIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBFTkFCTEVfU1VQVFlQRVMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlmICR7YWNfY3ZfcHJvZ19DUFArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKworZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAorZWxzZQorICBhY19jdl9wcm9nX0NQUD0kQ1BQCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDUFAiID4mNQorJGFzX2VjaG8gIiRDUFAiID4mNjsgfQorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0dSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9HUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKK2Nhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgorICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQorIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfRUdSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfdGltZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluICgpCit7CitpZiAoKHN0cnVjdCB0bSAqKSAwKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl90aW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfdGltZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl90aW1lIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gbGltaXRzLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbWl0cy5oIiAiYWNfY3ZfaGVhZGVyX2xpbWl0c19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW1pdHNfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJTUlUU19IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gZ251dGxzL29wZW5zc2wuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZ251dGxzL29wZW5zc2wuaCIgImFjX2N2X2hlYWRlcl9nbnV0bHNfb3BlbnNzbF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9nbnV0bHNfb3BlbnNzbF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfR05VVExTX09QRU5TU0xfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfaGVhZGVyIGluIG9wZW5zc2wvbWQ1LmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIm9wZW5zc2wvbWQ1LmgiICJhY19jdl9oZWFkZXJfb3BlbnNzbF9tZDVfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfb3BlbnNzbF9tZDVfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX09QRU5TU0xfTUQ1X0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZm9yIGFjX2hlYWRlciBpbiBzeXMvdWlvLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy91aW8uaCIgImFjX2N2X2hlYWRlcl9zeXNfdWlvX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c191aW9faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NZU19VSU9fSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfaGVhZGVyIGluIHN5cy91dHNuYW1lLmggYXJwYS9pbmV0LmggbmV0ZGIuaCBzeXNsb2cuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfaGVhZGVyIGluIHN5cy9jYXBhYmlsaXR5LmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy9jYXBhYmlsaXR5LmgiICJhY19jdl9oZWFkZXJfc3lzX2NhcGFiaWxpdHlfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX2NhcGFiaWxpdHlfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NZU19DQVBBQklMSVRZX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZm9yIGFjX2hlYWRlciBpbiBwd2QuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAicHdkLmgiICJhY19jdl9oZWFkZXJfcHdkX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3B3ZF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfUFdEX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZm9yIGFjX2hlYWRlciBpbiBuZXRpbmV0L2luLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIm5ldGluZXQvaW4uaCIgImFjX2N2X2hlYWRlcl9uZXRpbmV0X2luX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX25ldGluZXRfaW5faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvaXA2LmggbmV0aW5ldC9pY21wNi5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZiBIQVZFX05FVElORVRfSU5fSAorIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gbGludXgvcnRuZXRsaW5rLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgImxpbnV4L3J0bmV0bGluay5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X3J0bmV0bGlua19oIiAiCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9ydG5ldGxpbmtfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJTlVYX1JUTkVUTElOS19IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gcHRocmVhZC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJwdGhyZWFkLmgiICJhY19jdl9oZWFkZXJfcHRocmVhZF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9wdGhyZWFkX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19BUFBMRV9DQ19fCisJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisJICAgICAjZW5kaWYKKwkgICAgIHR5cGVkZWYgaW50IGR1bW15OworCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCisJIyB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIC1hcmNoIGZsYWdzIHdpdGggZGlmZmVyZW50IHZhbHVlcy4KKwlhY19hcmNoPQorCWFjX3ByZXY9CisJZm9yIGFjX3dvcmQgaW4gJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTOyBkbworCSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKwkgICBjYXNlICRhY193b3JkIGluCisJICAgICBpPzg2IHwgeDg2XzY0IHwgcHBjIHwgcHBjNjQpCisJICAgICAgIGlmIHRlc3QgLXogIiRhY19hcmNoIiB8fCB0ZXN0ICIkYWNfYXJjaCIgPSAiJGFjX3dvcmQiOyB0aGVuCisJCSBhY19hcmNoPSRhY193b3JkCisJICAgICAgIGVsc2UKKwkJIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbAorCQkgYnJlYWsKKwkgICAgICAgZmkKKwkgICAgICAgOzsKKwkgICBlc2FjCisJICAgYWNfcHJldj0KKwkgZWxpZiB0ZXN0ICJ4JGFjX3dvcmQiID0gIngtYXJjaCI7IHRoZW4KKwkgICBhY19wcmV2PWFyY2gKKwkgZmkKKyAgICAgICBkb25lCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAgICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZiAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2ludAorbWFpbiAoKQoreworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorCQkgbm90IGJpZyBlbmRpYW4KKwkJI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBmaQorICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCSBub3QgYmlnIGVuZGlhbgorCQkjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitzaG9ydCBpbnQgYXNjaWlfbW1bXSA9CisJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisJCXNob3J0IGludCBhc2NpaV9paVtdID0KKwkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKwkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKKwkJfQorCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OworCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKKwkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworCQl9CisJCWV4dGVybiBpbnQgZm9vOworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KKwkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKwkgICAgZmkKKwkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCisJCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisJICAgICAgZWxzZQorCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KKwkJYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorCSAgICAgIGZpCisJICAgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworCSAgICAgdW5pb24KKwkgICAgIHsKKwkgICAgICAgbG9uZyBpbnQgbDsKKwkgICAgICAgY2hhciBjW3NpemVvZiAobG9uZyBpbnQpXTsKKwkgICAgIH0gdTsKKwkgICAgIHUubCA9IDE7CisJICAgICByZXR1cm4gdS5jW3NpemVvZiAobG9uZyBpbnQpIC0gMV0gPT0gMTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KKyBjYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbiAjKAorICAgeWVzKQorICAgICAkYXNfZWNobyAiI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMSIgPj5jb25mZGVmcy5oCis7OyAjKAorICAgbm8pCisgICAgICA7OyAjKAorICAgdW5pdmVyc2FsKQorCiskYXNfZWNobyAiI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgOzsgIygKKyAgICopCisgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bmtub3duIGVuZGlhbm5lc3MKKyBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgIiRMSU5FTk8iIDUgOzsKKyBlc2FjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2NvbnN0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKy8qIEZJWE1FOiBJbmNsdWRlIHRoZSBjb21tZW50cyBzdWdnZXN0ZWQgYnkgUGF1bC4gKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsKKyAgY29uc3QgY2hhcnNldCBjczsKKyAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOworICBjaGFyICoqcHBjOworICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CisgIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCisgICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKKyAgICAgZXhwcmVzc2lvbiAqLworICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7CisgIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOworICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworICArK3BjcGNjOworICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKKyAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOworICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICAgIGNoYXIgKnQ7CisgICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAgICp0KysgPSAwOworICAgIGlmIChzKSByZXR1cm4gMDsKKyAgfQorICB7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICAgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICAgICsrZm9vOworICB9CisgIHsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICAgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICAgIGlwdHIgcCA9IDA7CisgICAgKytwOworICB9CisgIHsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICAgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKKyAgfQorICB7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICAgIGNvbnN0IGludCBmb28gPSAxMDsKKyAgICBpZiAoIWZvbykgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICFjc1swXSAmJiAhemVyby54OworI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbnN0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19jb25zdCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgY29uc3QgLyoqLyIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInNpemVfdCIgImFjX2N2X3R5cGVfc2l6ZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc2l6ZV90IiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGludAorX0FDRU9GCisKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RydWN0IGljbXA2X25vZGVpbmZvIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJ1Y3QgaWNtcDZfbm9kZWluZm8uLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2ljbXA2Lmg+CisKK2ludAorbWFpbiAoKQoreworCitzdHJ1Y3QgaWNtcDZfbm9kZWluZm8gbm9kZWluZm87CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TVFJVQ1RfSUNNUDZfTk9ERUlORk8gMSIgPj5jb25mZGVmcy5oCisKKworZWxzZQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZm9yIGFjX2Z1bmMgaW4gbmFub3NsZWVwCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIm5hbm9zbGVlcCIgImFjX2N2X2Z1bmNfbmFub3NsZWVwIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX25hbm9zbGVlcCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX05BTk9TTEVFUCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2NyZWF0ZSBpbiAtbHB0aHJlYWQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9jcmVhdGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHB0aHJlYWQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHB0aHJlYWRfY3JlYXRlICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcHRocmVhZF9jcmVhdGUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9jcmVhdGU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfY3JlYXRlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfY3JlYXRlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9jcmVhdGUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2NyZWF0ZSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQorX0FDRU9GCisKKyAgTElCUz0iLWxwdGhyZWFkICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjYXBfaW5pdCBpbiAtbGNhcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgY2FwX2luaXQgaW4gLWxjYXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2NhcF9jYXBfaW5pdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY2FwICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBjYXBfaW5pdCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGNhcF9pbml0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9jYXBfY2FwX2luaXQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9jYXBfY2FwX2luaXQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NhcF9jYXBfaW5pdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9jYXBfY2FwX2luaXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY2FwX2NhcF9pbml0IiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCQ0FQIDEKK19BQ0VPRgorCisgIExJQlM9Ii1sY2FwICRMSUJTIgorCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIE1ENV9Jbml0IGluIC1sZ251dGxzLW9wZW5zc2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIE1ENV9Jbml0IGluIC1sZ251dGxzLW9wZW5zc2wuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2dudXRsc19vcGVuc3NsX01ENV9Jbml0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxnbnV0bHMtb3BlbnNzbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgTUQ1X0luaXQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBNRDVfSW5pdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZ251dGxzX29wZW5zc2xfTUQ1X0luaXQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9nbnV0bHNfb3BlbnNzbF9NRDVfSW5pdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZ251dGxzX29wZW5zc2xfTUQ1X0luaXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZ251dGxzX29wZW5zc2xfTUQ1X0luaXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZ251dGxzX29wZW5zc2xfTUQ1X0luaXQiID0geHllczsgdGhlbiA6CisgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUQ1X0lOSVQgMSIgPj5jb25mZGVmcy5oCisKKwlMSUJTPSItbGdudXRscy1vcGVuc3NsICRMSUJTIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBNRDVfSW5pdCBpbiAtbGNyeXB0byIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgTUQ1X0luaXQgaW4gLWxjcnlwdG8uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2NyeXB0b19NRDVfSW5pdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY3J5cHRvICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBNRDVfSW5pdCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIE1ENV9Jbml0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9jcnlwdG9fTUQ1X0luaXQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9jcnlwdG9fTUQ1X0luaXQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0b19NRDVfSW5pdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9jcnlwdG9fTUQ1X0luaXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRvX01ENV9Jbml0IiA9IHh5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX01ENV9JTklUIDEiID4+Y29uZmRlZnMuaAorCisJCUxJQlM9Ii1sY3J5cHRvICRMSUJTIgorZmkKKworCitmaQorCisKKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIG5pbmZvZC5zaCIKKworY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisgICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgorICAgICAgc2VkIC1uIFwKKwkicy8nLydcXFxcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7ICMoCisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispIHwKKyAgc2VkICcKKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCisgICAgIHQgY2xlYXIKKyAgICAgOmNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDplbmQnID4+Y29uZmNhY2hlCitpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgICAgaWYgdGVzdCAhIC1mICIkY2FjaGVfZmlsZSIgfHwgdGVzdCAtaCAiJGNhY2hlX2ZpbGUiOyB0aGVuCisJY2F0IGNvbmZjYWNoZSA+IiRjYWNoZV9maWxlIgorICAgICAgZWxzZQorICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCisgICAgICAgICovKiB8ID86KikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiJCQgJiYKKwkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCisgICAgICAgICopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCitERUZTPS1ESEFWRV9DT05GSUdfSAorCithY19saWJvYmpzPQorYWNfbHRsaWJvYmpzPQorVT0KK2ZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQorICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCisgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworICBhY19pPWAkYXNfZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKKyAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgorICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKyAgYXNfZm5fYXBwZW5kIGFjX2xpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKKyAgYXNfZm5fYXBwZW5kIGFjX2x0bGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworCisKKzogIiR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9IgorYWNfd3JpdGVfZmFpbD0wCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cithc193cml0ZV9mYWlsPTAKK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCisKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKworIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNj4mMQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTRU9GCit0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisiCisKK19BQ0VPRgorCitjYXNlICRhY19jb25maWdfZmlsZXMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKK2VzYWMKKworY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2hlYWRlcnM7IHNoaWZ0OyBhY19jb25maWdfaGVhZGVycz0kKjs7Citlc2FjCisKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCitjb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCitjb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gYWN0aW9ucworZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICBVbmxlc3MgdGhlIGZpbGVzCithbmQgYWN0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIFRBR3MsIGFsbCBhcmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVEFHXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0CisgICAgICAtLWNvbmZpZyAgICAgcHJpbnQgY29uZmlndXJhdGlvbiwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudAorICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAgICAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLiIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCithY19jc192ZXJzaW9uPSJcXAorY29uZmlnLnN0YXR1cworY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LAorICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKKworQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPT8qKQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtLSo9KQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPQorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAqKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKKyAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKKyAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKKworICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBzZXQgWCAnJFNIRUxMJyAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCisgIHNoaWZ0CisgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisgIENPTkZJR19TSEVMTD0nJFNIRUxMJworICBleHBvcnQgQ09ORklHX1NIRUxMCisgIGV4ZWMgIlwkQCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCisgICRhc19lY2hvICIkYWNfbG9nIgorfSA+JjUKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisKKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCitkbworICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisgICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICAgIm5pbmZvZC5zaCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBuaW5mb2Quc2giIDs7CisKKyAgKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgYXJndW1lbnQ6IFxgJGFjX2NvbmZpZ190YXJnZXQnIiAiJExJTkVOTyIgNTs7CisgIGVzYWMKK2RvbmUKKworCisjIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCisjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKyMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKKyMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCitpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcworICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycworZmkKKworIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCisjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6CisjIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KKyRkZWJ1ZyB8fAoreworICB0bXA9IGFjX3RtcD0KKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgOiAiJHthY190bXA6PSR0bXB9IgorICB7IHRlc3QgISAtZCAiJGFjX3RtcCIgfHwgcm0gLWZyICIkYWNfdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cworJyAwCisgIHRyYXAgJ2FzX2ZuX2V4aXQgMScgMSAyIDEzIDE1Cit9CisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKworeworICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKKyAgdGVzdCAtZCAiJHRtcCIKK30gIHx8Cit7CisgIHRtcD0uL2NvbmYkJC0kUkFORE9NCisgICh1bWFzayAwNzcgJiYgbWtkaXIgIiR0bXAiKQorfSB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgIiRMSU5FTk8iIDUKK2FjX3RtcD0kdG1wCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCisKKworYWNfY3I9YGVjaG8gWCB8IHRyIFggJ1wwMTUnYAorIyBPbiBjeWd3aW4sIGJhc2ggY2FuIGVhdCBcciBpbnNpZGUgYGAgaWYgdGhlIHVzZXIgcmVxdWVzdGVkIGlnbmNyLgorIyBCdXQgd2Uga25vdyBvZiBubyBvdGhlciBzaGVsbCB3aGVyZSBhY19jciB3b3VsZCBiZSBlbXB0eSBhdCB0aGlzCisjIHBvaW50LCBzbyB3ZSBjYW4gdXNlIGEgYmFzaGlzbSBhcyBhIGZhbGxiYWNrLgoraWYgdGVzdCAieCRhY19jciIgPSB4OyB0aGVuCisgIGV2YWwgYWNfY3I9XCRcJ1xcclwnCitmaQorYWNfY3NfYXdrX2NyPWAkQVdLICdCRUdJTiB7IHByaW50ICJhXHJiIiB9JyA8L2Rldi9udWxsIDI+L2Rldi9udWxsYAoraWYgdGVzdCAiJGFjX2NzX2F3a19jciIgPSAiYSR7YWNfY3J9YiI7IHRoZW4KKyAgYWNfY3NfYXdrX2NyPSdcXHInCitlbHNlCisgIGFjX2NzX2F3a19jcj0kYWNfY3IKK2ZpCisKK2VjaG8gJ0JFR0lOIHsnID4iJGFjX3RtcC9zdWJzMS5hd2siICYmCitfQUNFT0YKKworCit7CisgIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCisgIGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IHNlZCAncy8uKi8mISQmJGFjX2RlbGltLycgJiYKKyAgZWNobyAiX0FDRU9GIgorfSA+Y29uZiQkc3Vicy5zaCB8fAorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CithY19kZWxpbV9udW09YGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IGdyZXAgLWMgJ14nYAorYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworICAuIC4vY29uZiQkc3Vicy5zaCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAorICBpZiB0ZXN0ICRhY19kZWxpbV9uID0gJGFjX2RlbGltX251bTsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKK3JtIC1mIGNvbmYkJHN1YnMuc2gKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmCitfQUNFT0YKK3NlZCAtbiAnCitoCitzL14vU1siLzsgcy8hLiovIl09LworcAorZworcy9eW14hXSohLy8KKzpyZXBsCit0IHJlcGwKK3MvJyIkYWNfZGVsaW0iJyQvLwordCBkZWxpbQorOm5sCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcbiJcXC8KK3AKK24KK2IgcmVwbAorOm1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCitwCitnCitzLy5cezE0OFx9Ly8KK3QgbmwKKzpkZWxpbQoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iLworcAorYgorOm1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCitwCitnCitzLy5cezE0OFx9Ly8KK3QgZGVsaW0KKycgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKKy9eW14iIl0veworICBOCisgIHMvXG4vLworfQorJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorcm0gLWYgY29uZiQkc3Vicy5hd2sKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorX0FDQVdLCitjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorICBmb3IgKGtleSBpbiBTKSBTX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorCit9Cit7CisgIGxpbmUgPSAkIDAKKyAgbmZpZWxkcyA9IHNwbGl0KGxpbmUsIGZpZWxkLCAiQCIpCisgIHN1YnN0ZWQgPSAwCisgIGxlbiA9IGxlbmd0aChmaWVsZFsxXSkKKyAgZm9yIChpID0gMjsgaSA8IG5maWVsZHM7IGkrKykgeworICAgIGtleSA9IGZpZWxkW2ldCisgICAga2V5bGVuID0gbGVuZ3RoKGtleSkKKyAgICBpZiAoU19pc19zZXRba2V5XSkgeworICAgICAgdmFsdWUgPSBTW2tleV0KKyAgICAgIGxpbmUgPSBzdWJzdHIobGluZSwgMSwgbGVuKSAiIiB2YWx1ZSAiIiBzdWJzdHIobGluZSwgbGVuICsga2V5bGVuICsgMykKKyAgICAgIGxlbiArPSBsZW5ndGgodmFsdWUpICsgbGVuZ3RoKGZpZWxkWysraV0pCisgICAgICBzdWJzdGVkID0gMQorICAgIH0gZWxzZQorICAgICAgbGVuICs9IDEgKyBrZXlsZW4KKyAgfQorCisgIHByaW50IGxpbmUKK30KKworX0FDQVdLCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIHNlZCAicy8kYWNfY3IvLyIgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICBzZWQgInMvJGFjX2NyXCQvLzsgcy8kYWNfY3IvJGFjX2NzX2F3a19jci9nIgorZWxzZQorICBjYXQKK2ZpIDwgIiRhY190bXAvc3ViczEuYXdrIiA+ICIkYWNfdG1wL3N1YnMuYXdrIiBcCisgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK19BQ0VPRgorCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlIHNvbGUgJChzcmNkaXIpLAorIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGVudHJpZXMgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj1bCSBdKi97CitoCitzLy8vCitzL14vOi8KK3MvWwkgXSokLzovCitzLzpcJChzcmNkaXIpOi86L2cKK3MvOlwke3NyY2Rpcn06LzovZworcy86QHNyY2RpckA6LzovZworcy9eOiovLworcy86KiQvLworeAorcy9cKD1bCSBdKlwpLiovXDEvCitHCitzL1xuLy8KK3MvXltePV0qPVsJIF0qJC8vCit9JworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfSEVBREVSUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgTWFrZWZpbGUnLgoraWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorY2F0ID4iJGFjX3RtcC9kZWZpbmVzLmF3ayIgPDxcX0FDQVdLIHx8CitCRUdJTiB7CitfQUNFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGFuIGF3ayBzY3JpcHQgYGRlZmluZXMuYXdrJywgZW1iZWRkZWQgYXMKKyMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKyMgY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4KKworIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQorIyBoYW5kbGluZyBvZiBsb25nIGxpbmVzLgorYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbworICBhY190dD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCisgIGlmIHRlc3QgLXogIiRhY190dCI7IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorCisjIEZvciB0aGUgYXdrIHNjcmlwdCwgRCBpcyBhbiBhcnJheSBvZiBtYWNybyB2YWx1ZXMga2V5ZWQgYnkgbmFtZSwKKyMgbGlrZXdpc2UgUCBjb250YWlucyBtYWNybyBwYXJhbWV0ZXJzIGlmIGFueS4gIFByZXNlcnZlIGJhY2tzbGFzaAorIyBuZXdsaW5lIHNlcXVlbmNlcy4KKworYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKK3NlZCAtbiAnCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgcnNldAorOnJzZXQKK3MvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qLyAvCit0IGRlZgorZAorOmRlZgorcy9cXCQvLwordCBic25sCitzL1siXFxdL1xcJi9nCitzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKK0RbIlwxIl09IiBcMyIvcAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDIiL3AKK2QKKzpic25sCitzL1siXFxdL1xcJi9nCitzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKK0RbIlwxIl09IiBcM1xcXFxcXG4iXFwvcAordCBjb250CitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMlxcXFxcXG4iXFwvcAordCBjb250CitkCis6Y29udAorbgorcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IGNsZWFyCis6Y2xlYXIKK3MvXFwkLy8KK3QgYnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvcAorZAorOmJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXFxcXFxuIlxcL3AKK2IgY29udAorJyA8Y29uZmRlZnMuaCB8IHNlZCAnCitzLyciJGFjX2RlbGltIicvIlxcXAorIi9nJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgZm9yIChrZXkgaW4gRCkgRF9pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKK30KKy9eW1x0IF0qI1tcdCBdKihkZWZpbmV8dW5kZWYpW1x0IF0rJGFjX3dvcmRfcmUoW1x0IChdfFwkKS8geworICBsaW5lID0gXCQgMAorICBzcGxpdChsaW5lLCBhcmcsICIgIikKKyAgaWYgKGFyZ1sxXSA9PSAiIyIpIHsKKyAgICBkZWZ1bmRlZiA9IGFyZ1syXQorICAgIG1hYzEgPSBhcmdbM10KKyAgfSBlbHNlIHsKKyAgICBkZWZ1bmRlZiA9IHN1YnN0cihhcmdbMV0sIDIpCisgICAgbWFjMSA9IGFyZ1syXQorICB9CisgIHNwbGl0KG1hYzEsIG1hYzIsICIoIikgIykKKyAgbWFjcm8gPSBtYWMyWzFdCisgIHByZWZpeCA9IHN1YnN0cihsaW5lLCAxLCBpbmRleChsaW5lLCBkZWZ1bmRlZikgLSAxKQorICBpZiAoRF9pc19zZXRbbWFjcm9dKSB7CisgICAgIyBQcmVzZXJ2ZSB0aGUgd2hpdGUgc3BhY2Ugc3Vycm91bmRpbmcgdGhlICIjIi4KKyAgICBwcmludCBwcmVmaXggImRlZmluZSIsIG1hY3JvIFBbbWFjcm9dIERbbWFjcm9dCisgICAgbmV4dAorICB9IGVsc2UgeworICAgICMgUmVwbGFjZSAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSwKKyAgICAjIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisgICAgIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCisgICAgaWYgKGRlZnVuZGVmID09ICJ1bmRlZiIpIHsKKyAgICAgIHByaW50ICIvKiIsIHByZWZpeCBkZWZ1bmRlZiwgbWFjcm8sICIqLyIKKyAgICAgIG5leHQKKyAgICB9CisgIH0KK30KK3sgcHJpbnQgfQorX0FDQVdLCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitmaSAjIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyIKKworCitldmFsIHNldCBYICIgIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgICAiCitzaGlmdAorZm9yIGFjX3RhZworZG8KKyAgY2FzZSAkYWNfdGFnIGluCisgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworICBlc2FjCisgIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCisgIDpbRkhMXSo6Kik7OworICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKKyAgOltGSF0tKSBhY190YWc9LTotOzsKKyAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKyAgZXNhYworICBhY19zYXZlX0lGUz0kSUZTCisgIElGUz06CisgIHNldCB4ICRhY190YWcKKyAgSUZTPSRhY19zYXZlX0lGUworICBzaGlmdAorICBhY19maWxlPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6TCkgYWNfc291cmNlPSQxOzsKKyAgOltGSF0pCisgICAgYWNfZmlsZV9pbnB1dHM9CisgICAgZm9yIGFjX2YKKyAgICBkbworICAgICAgY2FzZSAkYWNfZiBpbgorICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OworICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKwkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCisJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisJIHRlc3QgLWYgIiRhY19mIiB8fAorCSAgIGNhc2UgJGFjX2YgaW4KKwkgICBbXFwvJF0qKSBmYWxzZTs7CisJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworCSAgIGVzYWMgfHwKKwkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYworICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworCWAnIGJ5IGNvbmZpZ3VyZS4nCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKyAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKKyAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAorICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworICAgIGVzYWMKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworCisgIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisgIGVzYWMKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCisjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KK2FjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQorYWNfc2VkX2RhdGFyb290PScKKy9kYXRhcm9vdGRpci8geworICBwCisgIHEKK30KKy9AZGF0YWRpckAvcAorL0Bkb2NkaXJAL3AKKy9AaW5mb2RpckAvcAorL0Bsb2NhbGVkaXJAL3AKKy9AbWFuZGlyQC9wJworY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OworKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCisgIHMmQGRvY2RpckAmJGRvY2RpciZnCisgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKKyAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKKyAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKK2VzYWMKK19BQ0VPRgorCisjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKyMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0CitzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CitzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAorcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0CitzJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CitzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0CitzJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0CiskYWNfZGF0YXJvb3RkaXJfaGFjaworIgorZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisKK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKKyAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQorCisgIHJtIC1mICIkYWNfdG1wL3N0ZGluIgorICBjYXNlICRhY19maWxlIGluCisgIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OworICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CisgIGVzYWMgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyA7OworICA6SCkKKyAgIworICAjIENPTkZJR19IRUFERVIKKyAgIworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeworICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKyAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBybSAtZiAiJGFjX2ZpbGUiCisgICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCisJfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CisgIGZpCisgOzsKKworCisgIGVzYWMKKworZG9uZSAjIGZvciBhY190YWcKKworCithc19mbl9leGl0IDAKK19BQ0VPRgorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKwordGVzdCAkYWNfd3JpdGVfZmFpbCA9IDAgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIndyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCisjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCisjIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAorIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCisjIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGFjX2NzX3N1Y2Nlc3M9OgorICBhY19jb25maWdfc3RhdHVzX2FyZ3M9CisgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisgICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCisgIGV4ZWMgNT4vZGV2L251bGwKKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorICBleGVjIDU+PmNvbmZpZy5sb2cKKyAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICRhY19jc19zdWNjZXNzIHx8IGFzX2ZuX2V4aXQgMQorZmkKK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjI7fQorZmkKKwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9uaW5mb2QvY29uZmlndXJlLmluIGIvaXB1dGlscy9uaW5mb2QvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzI3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL25pbmZvZC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxNDEgQEAKK2RubCAkVVNBR0k6IGNvbmZpZ3VyZS5pbix2IDEuMTIgMjAwMy0wNy0xNiAwOTo0OTowMSB5b3NoZnVqaSBFeHAgJAorCitkbmwgQ29weXJpZ2h0IChDKSAyMDAyIFVTQUdJL1dJREUgUHJvamVjdC4KK2RubCBBbGwgcmlnaHRzIHJlc2VydmVkLgorZG5sIAorZG5sIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorZG5sIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworZG5sIGFyZSBtZXQ6CitkbmwgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK2RubCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCitkbmwgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKK2RubCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCitkbmwgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KK2RubCAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworZG5sICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorZG5sICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorZG5sIAorZG5sIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECitkbmwgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitkbmwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK2RubCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKK2RubCBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorZG5sIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCitkbmwgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCitkbmwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKK2RubCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCitkbmwgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorZG5sIFNVQ0ggREFNQUdFLgorCitBQ19QUkVSRVEoMi41MykKK0FDX0lOSVQobmluZm9kLmMpCitBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oKQorQUNfUFJFRklYX0RFRkFVTFQoL3Vzci9sb2NhbC92NikKKworQUNfQ09QWVJJR0hUKFtDb3B5cmlnaHQgKEMpMjAwMiBVU0FHSS9XSURFIFByb2plY3QuICBBbGwgUmlnaHRzIFJlc2VydmVkLl0pCisKK2RubCBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19DQworQUNfUFJPR19JTlNUQUxMCitJTlNUQUxMX0xJQj0iXCR7SU5TVEFMTF9EQVRBfSIKK0FDX1NVQlNUKElOU1RBTExfTElCKQorSU5TVEFMTF9ESVI9Ilwke0lOU1RBTEx9IC1kIgorQUNfU1VCU1QoSU5TVEFMTF9ESVIpCisKK2RubCBDaGVja3MgZm9yIEVuYWJsZS9XaXRoCitBQ19BUkdfRU5BQkxFKGRlYnVnLAorWyAgLS1lbmFibGUtZGVidWcgICAgICAgICAgRW5hYmxlIGRlYnVnZ2luZ10pCitpZiB0ZXN0IHgiJGVuYWJsZXZhbCIgIT0geCJubyI7IHRoZW4KKyAgQUNfREVGSU5FKEVOQUJMRV9ERUJVRywgMSwgCisJICAgIFtFbmFibGUgZGVidWdnaW5nXSkKK2ZpCisKK0FDX0FSR19FTkFCTEUodGhyZWFkcywKK1sgIC0tZGlzYWJsZS10aHJlYWRzICAgICAgIERpc2FibGUgdGhyZWFkcyAoYW5kIHJhbmRvbSBkZWxheSldLCxlbmFibGVfdGhyZWFkcz1ubykKK2lmIHRlc3QgeCIkZW5hYmxldmFsIiAhPSB4Im5vIjsgdGhlbgorICBBQ19ERUZJTkUoRU5BQkxFX1RIUkVBRFMsIDEsCisgICAgICAgICAgICBbRW5hYmxlIHRocmVhZHNdKQorZmkKKworQUNfQVJHX0VOQUJMRShzdXB0eXBlcywKK1sgIC0tZW5hYmxlLXN1cHR5cGVzICAgICAgIEVuYWJsZSBzdXB0eXBlcyBxdHlwZSAoZGVwcmVjYXRlZCldKQoraWYgdGVzdCB4IiRlbmFibGV2YWwiICE9IHgibm8iOyB0aGVuCisgIEFDX0RFRklORShFTkFCTEVfU1VQVFlQRVMsIDEsCisJICAgIFtFbmFibGUgc3VwdHlwZXMgKGRlcHJlY2F0ZWQpXSkKK2ZpCisKK0FDX0FSR19FTkFCTEUoc3VwdHlwZXMsCitbICAtLWVuYWJsZS10dGwgICAgICAgICAgICBFbmFibGUgdHRsIHN1cHBvcnQgZm9yIHF0eXBlcyAoZGVwcmVjYXRlZCldKQoraWYgdGVzdCB4IiRlbmFibGV2YWwiICE9IHgibm8iOyB0aGVuCisgIEFDX0RFRklORShFTkFCTEVfU1VQVFlQRVMsIDEsCisJICAgIFtFbmFibGUgdHRsIHN1cHBvcnQgZm9yIHF0eXBlcyAoZGVwcmVjYXRlZCldKQorZmkKKworZG5sIENoZWNrcyBmb3IgbGlicmFyaWVzLgorCitkbmwgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19IRUFERVJfU1REQworQUNfSEVBREVSX1RJTUUKK0FDX0NIRUNLX0hFQURFUlMobGltaXRzLmgpCitBQ19DSEVDS19IRUFERVJTKGdudXRscy9vcGVuc3NsLmgpCitBQ19DSEVDS19IRUFERVJTKG9wZW5zc2wvbWQ1LmgpCitBQ19DSEVDS19IRUFERVJTKHN5cy91aW8uaCkKK0FDX0NIRUNLX0hFQURFUlMoc3lzL3V0c25hbWUuaCBhcnBhL2luZXQuaCBuZXRkYi5oIHN5c2xvZy5oKQorQUNfQ0hFQ0tfSEVBREVSUyhzeXMvY2FwYWJpbGl0eS5oKQorQUNfQ0hFQ0tfSEVBREVSUyhwd2QuaCkKK0FDX0NIRUNLX0hFQURFUlMobmV0aW5ldC9pbi5oKQorQUNfQ0hFQ0tfSEVBREVSUyhuZXRpbmV0L2lwNi5oIG5ldGluZXQvaWNtcDYuaCwsLFsKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWYgSEFWRV9ORVRJTkVUX0lOX0gKKyMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCitdKQorQUNfQ0hFQ0tfSEVBREVSUyhsaW51eC9ydG5ldGxpbmsuaCwsLFsKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitdKQorQUNfQ0hFQ0tfSEVBREVSUyhwdGhyZWFkLmgpCisKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfQ19CSUdFTkRJQU4KK0FDX0NfQ09OU1QKK0FDX1RZUEVfU0laRV9UCisKK0FDX01TR19DSEVDS0lORyhbZm9yIHN0cnVjdCBpY21wNl9ub2RlaW5mb10pCitBQ19UUllfQ09NUElMRShbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWNtcDYuaD4KK10sWworc3RydWN0IGljbXA2X25vZGVpbmZvIG5vZGVpbmZvOworXSxbCisJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwlBQ19ERUZJTkUoW0hBVkVfU1RSVUNUX0lDTVA2X05PREVJTkZPXSwgMSwKKwkJICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3RydWN0IGljbXA2X25vZGVpbmZvXSkKK10sWworCUFDX01TR19SRVNVTFQoW25vXSkKK10pCisKK2RubCBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfQ0hFQ0tfRlVOQ1MobmFub3NsZWVwKQorQUNfQ0hFQ0tfTElCKHB0aHJlYWQsIHB0aHJlYWRfY3JlYXRlKQorQUNfQ0hFQ0tfTElCKGNhcCwgY2FwX2luaXQpCisKK0FDX0NIRUNLX0xJQihnbnV0bHMtb3BlbnNzbCwgTUQ1X0luaXQsCisJQUNfREVGSU5FKEhBVkVfTUQ1X0lOSVQpCisJTElCUz0iLWxnbnV0bHMtb3BlbnNzbCAkTElCUyIsCisJQUNfQ0hFQ0tfTElCKGNyeXB0bywgTUQ1X0luaXQsCisJCUFDX0RFRklORShIQVZFX01ENV9JTklUKQorCQlMSUJTPSItbGNyeXB0byAkTElCUyIsCisJKQorKQorZG5sIEFDX0NIRUNLX0xJQihjcnlwdG8sIE1ENUluaXQsCitkbmwJQUNfREVGSU5FKEhBVkVfTUQ1SU5JVCkKK2RubAlMSUJTPSItbGNyeXB0byAkTElCUyIsCitkbmwpCisKK2RubCBBQ19TVUJTVChERUZTKQorCitBQ19PVVRQVVQoTWFrZWZpbGUgbmluZm9kLnNoKQpkaWZmIC0tZ2l0IGEvaXB1dGlscy9uaW5mb2QvaWNtcDZfbm9kZWluZm8uaCBiL2lwdXRpbHMvbmluZm9kL2ljbXA2X25vZGVpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2ZTc0MQotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvbmluZm9kL2ljbXA2X25vZGVpbmZvLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBVU0FHSS9XSURFIFByb2plY3QuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSUNNUDZfTk9ERUlORk9fSAorI2RlZmluZSBJQ01QNl9OT0RFSU5GT19ICisKK3N0cnVjdCBpY21wNl9ub2RlaW5mbyB7CisJc3RydWN0IGljbXA2X2hkcglpY21wNl9uaV9oZHI7CisJdWludDhfdAkJCWljbXA2X25pX25vbmNlWzhdOworCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IHJlcGx5IGRhdGEgKi8KK307CisKKyNkZWZpbmUgbmlfdHlwZQkJaWNtcDZfbmlfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbmlfY29kZQkJaWNtcDZfbmlfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmlfY2tzdW0JaWNtcDZfbmlfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIG5pX3F0eXBlCWljbXA2X25pX2hkci5pY21wNl9kYXRhMTZbMF0KKyNkZWZpbmUgbmlfZmxhZ3MJaWNtcDZfbmlfaGRyLmljbXA2X2RhdGExNlsxXQorI2RlZmluZSBuaV9ub25jZQlpY21wNl9uaV9ub25jZQorCisvKiBJQ01QNiB0eXBlcyAqLworI2RlZmluZSBJQ01QNl9OSV9RVUVSWQkJCTEzOQorI2RlZmluZSBJQ01QNl9OSV9SRVBMWQkJCTE0MAorCisvKiBJQ01QNiBjb2RlcyBmb3IgTkkgUXVlcnkgKi8KKyNkZWZpbmUgSUNNUDZfTklfU1VCSl9JUFY2CQkwCS8qIFF1ZXJ5IFN1YmplY3QgaXMgYW4gaXB2NiBhZGRyZXNzICovCisjZGVmaW5lIElDTVA2X05JX1NVQkpfRlFETgkJMQkvKiBRdWVyeSBTdWJqZWN0IGlzIGEgRG9tYWluIG5hbWUgKi8KKyNkZWZpbmUgSUNNUDZfTklfU1VCSl9JUFY0CQkyCS8qIFF1ZXJ5IFN1YmplY3QgaXMgYW4gaXB2NCBhZGRyZXNzICovCisKKy8qIElDTVA2IGNvZGVzIGZvciBOSSBSZXBseSAqLworI2RlZmluZSBJQ01QNl9OSV9TVUNDRVNTCQkwCS8qIE5JIHN1Y2Nlc3NmdWwgcmVwbHkgKi8KKyNkZWZpbmUgSUNNUDZfTklfUkVGVVNFRAkJMQkvKiBOSSByZXF1ZXN0IGlzIHJlZnVzZWQgKi8KKyNkZWZpbmUgSUNNUDZfTklfVU5LTk9XTgkJMgkvKiB1bmtub3duIFF0eXBlICovCisKKy8qIE5JIENvZGVzICovCisjZGVmaW5lIE5JX1FUWVBFX05PT1AJCQkwCS8qIE5PT1AgICovCisjZGVmaW5lIE5JX1FUWVBFX1NVUFRZUEVTCQkxCS8qIFN1cHBvcnRlZCBRdHlwZXMgKi8KKyNkZWZpbmUgTklfUVRZUEVfRE5TTkFNRQkJMgkvKiBETlMgTmFtZSAqLworI2RlZmluZSBOSV9RVFlQRV9OT0RFQUREUgkJMwkvKiBOb2RlIEFkZHJlc3NlcyAqLworI2RlZmluZSBOSV9RVFlQRV9JUFY0QUREUgkJNAkvKiBJUHY0IEFkZHJlc3NlcyAqLworCisvKiBOSSBGbGFncyAqLworI2lmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBOSV9TVVBUWVBFX0ZMQUdfQ09NUFJFU1MJMHgxCisjZGVmaW5lIE5JX0ZRRE5fRkxBR19WQUxJRFRUTAkJMHgxCisjZWxzZQorI2RlZmluZSBOSV9TVVBUWVBFX0ZMQUdfQ09NUFJFU1MJMHgwMTAwCisjZGVmaW5lIE5JX0ZRRE5fRkxBR19WQUxJRFRUTAkJMHgwMTAwCisjZW5kaWYKKworI2lmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBOSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFCTB4MQorI2RlZmluZSBOSV9OT0RFQUREUl9GTEFHX0FMTAkJMHgyCisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfQ09NUEFUCQkweDQKKyNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19MSU5LTE9DQUwJMHg4CisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfU0lURUxPQ0FMCTB4MTAKKyNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19HTE9CQUwJCTB4MjAKKyNlbHNlCisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfVFJVTkNBVEUJMHgwMTAwCisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfQUxMCQkweDAyMDAKKyNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19DT01QQVQJCTB4MDQwMAorI2RlZmluZSBOSV9OT0RFQUREUl9GTEFHX0xJTktMT0NBTAkweDA4MDAKKyNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19TSVRFTE9DQUwJMHgxMDAwCisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfR0xPQkFMCQkweDIwMDAKKyNlbmRpZgorCisjZGVmaW5lIE5JX0lQVjRBRERSX0ZMQUdfVFJVTkNBVEUJTklfTk9ERUFERFJfRkxBR19UUlVOQ0FURQorI2RlZmluZSBOSV9JUFY0QUREUl9GTEFHX0FMTAkJTklfTk9ERUFERFJfRkxBR19BTEwKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2lwdXRpbHMvbmluZm9kL2luc3RhbGwtc2ggYi9pcHV0aWxzL25pbmZvZC9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5ZGUyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL25pbmZvZC9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMjUxIEBACisjIS9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKyMKKyMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisjIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisjIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisjIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisjIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCit0cmFuc2Zvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwkJY2htb2RjbWQ9IiIKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2lwdXRpbHMvbmluZm9kL25pX2lmYWRkcnMuYyBiL2lwdXRpbHMvbmluZm9kL25pX2lmYWRkcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWUyODM4Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9uaW5mb2QvbmlfaWZhZGRycy5jCkBAIC0wLDAgKzEsNTQzIEBACisvKiAkVVNBR0k6IG5pX2lmYWRkcnMuYyx2IDEuOCAyMDA3LTEwLTExIDA2OjI1OjIxIHlvc2hmdWppIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFVTQUdJL1dJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogcmVmb3JtYXR0ZWQgYnkgaW5kZW50IC1rciAtaTggLWwgMTAwMCAqLworLyogVVNBR0k6IGlmYWRkcnMuYyx2IDEuMTggMjAwMi8wMy8wNiAwMTo1MDo0NiB5b3NoZnVqaSBFeHAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpZmFkZHJzLmMKKyAqIENvcHlyaWdodCAoQykyMDAwIEhpZGVha2kgWU9TSElGVUpJLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CS8qIHRoZSBMMiBwcm90b2NvbHMgKi8KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgIm5pX2lmYWRkcnMuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpZmRlZiBfVVNBR0lfTElCSU5FVDYKKyNpbmNsdWRlICJsaWJjLWNvbXBhdC5oIgorI2VuZGlmCisKKy8vI2RlZmluZSBJRkFfTE9DQUwJSUZBX0xPQ0FMCisKK3N0YXRpYyBjb25zdCBjaGFyICpSQ1NJRCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgPSAiJFVTQUdJOiBuaV9pZmFkZHJzLmMsdiAxLjggMjAwNy0xMC0xMSAwNjoyNToyMSB5b3NoZnVqaSBFeHAgJCBiYXNlZCBvbiBVU0FHSTogaWZhZGRycy5jLHYgMS4xOCAyMDAyLzAzLzA2IDAxOjUwOjQ2IHlvc2hmdWppIEV4cCI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0cnVjdCBubG1zZ19saXN0IHsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbmxtX25leHQ7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJaW50IHNpemU7CisJdGltZV90IHNlcTsKK307CisKKyNpZm5kZWYgSUZBX0xPQ0FMCitzdHJ1Y3QgcnRtYWRkcl9pZmFtYXAgeworCXZvaWQgKmFkZHJlc3M7CisJdm9pZCAqbG9jYWw7CisJdm9pZCAqYnJvYWRjYXN0OworCWludCBhZGRyZXNzX2xlbjsKKwlpbnQgbG9jYWxfbGVuOworCWludCBicm9hZGNhc3RfbGVuOworfTsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgaW50IG5sX3NlbmRyZXEoaW50IHNkLCBpbnQgcmVxdWVzdCwgaW50IGZsYWdzLCBpbnQgKnNlcSkKK3sKKwljaGFyIHJlcWJ1ZltOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHJ0Z2VubXNnKSldOworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisJc3RydWN0IG5sbXNnaGRyICpyZXFfaGRyOworCXN0cnVjdCBydGdlbm1zZyAqcmVxX21zZzsKKwl0aW1lX3QgdCA9IHRpbWUoTlVMTCk7CisKKwlpZiAoc2VxKQorCQkqc2VxID0gdDsKKwltZW1zZXQoJnJlcWJ1ZiwgMCwgc2l6ZW9mKHJlcWJ1ZikpOworCXJlcV9oZHIgPSAoc3RydWN0IG5sbXNnaGRyICopIHJlcWJ1ZjsKKwlyZXFfbXNnID0gKHN0cnVjdCBydGdlbm1zZyAqKSBOTE1TR19EQVRBKHJlcV9oZHIpOworCXJlcV9oZHItPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YoKnJlcV9tc2cpKTsKKwlyZXFfaGRyLT5ubG1zZ190eXBlID0gcmVxdWVzdDsKKwlyZXFfaGRyLT5ubG1zZ19mbGFncyA9IGZsYWdzIHwgTkxNX0ZfUkVRVUVTVDsKKwlyZXFfaGRyLT5ubG1zZ19waWQgPSAwOworCXJlcV9oZHItPm5sbXNnX3NlcSA9IHQ7CisJcmVxX21zZy0+cnRnZW5fZmFtaWx5ID0gQUZfVU5TUEVDOworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisJbmxhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJcmV0dXJuIChzZW5kdG8oc2QsICh2b2lkICopIHJlcV9oZHIsIHJlcV9oZHItPm5sbXNnX2xlbiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmbmxhZGRyLCBzaXplb2YobmxhZGRyKSkpOworfQorCitzdGF0aWMgaW50IG5sX3JlY3Ztc2coaW50IHNkLCBpbnQgcmVxdWVzdCwgaW50IHNlcSwgdm9pZCAqYnVmLCBzaXplX3QgYnVmbGVuLCBpbnQgKmZsYWdzKQoreworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBpb3ZlYyBpb3YgPSB7IGJ1ZiwgYnVmbGVuIH07CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKwlpbnQgcmVhZF9sZW47CisKKwlmb3IgKDs7KSB7CisJCW1zZy5tc2dfbmFtZSA9ICh2b2lkICopICZubGFkZHI7CisJCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihubGFkZHIpOworCQltc2cubXNnX2lvdiA9ICZpb3Y7CisJCW1zZy5tc2dfaW92bGVuID0gMTsKKwkJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwkJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwkJbXNnLm1zZ19mbGFncyA9IDA7CisJCXJlYWRfbGVuID0gcmVjdm1zZyhzZCwgJm1zZywgMCk7CisJCWlmICgocmVhZF9sZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorCQkgICAgfHwgKG1zZy5tc2dfZmxhZ3MgJiBNU0dfVFJVTkMpKQorCQkJY29udGludWU7CisJCWlmIChmbGFncykKKwkJCSpmbGFncyA9IG1zZy5tc2dfZmxhZ3M7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVhZF9sZW47Cit9CisKK3N0YXRpYyBpbnQgbmxfZ2V0bXNnKGludCBzZCwgaW50IHJlcXVlc3QsIGludCBzZXEsIHN0cnVjdCBubG1zZ2hkciAqKm5saHAsIGludCAqZG9uZSkKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5oOworCXNpemVfdCBidWZzaXplID0gNjU1MzYsIGxhc3RidWZzaXplID0gMDsKKwl2b2lkICpidWZmID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMCwgcmVhZF9zaXplOworCWludCBtc2dfZmxhZ3M7CisJcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisJZm9yICg7OykgeworCQl2b2lkICpuZXdidWZmID0gcmVhbGxvYyhidWZmLCBidWZzaXplKTsKKwkJaWYgKG5ld2J1ZmYgPT0gTlVMTCB8fCBidWZzaXplIDwgbGFzdGJ1ZnNpemUpIHsKKwkJCWZyZWUobmV3YnVmZik7CisJCQlyZXN1bHQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZmYgPSBuZXdidWZmOworCQlyZXN1bHQgPSByZWFkX3NpemUgPSBubF9yZWN2bXNnKHNkLCByZXF1ZXN0LCBzZXEsIGJ1ZmYsIGJ1ZnNpemUsICZtc2dfZmxhZ3MpOworCQlpZiAocmVhZF9zaXplIDwgMCB8fCAobXNnX2ZsYWdzICYgTVNHX1RSVU5DKSkgeworCQkJbGFzdGJ1ZnNpemUgPSBidWZzaXplOworCQkJYnVmc2l6ZSAqPSAyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJlYWRfc2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCW5oID0gKHN0cnVjdCBubG1zZ2hkciAqKSBidWZmOworCQlmb3IgKG5oID0gKHN0cnVjdCBubG1zZ2hkciAqKSBidWZmOyBOTE1TR19PSyhuaCwgcmVhZF9zaXplKTsgbmggPSAoc3RydWN0IG5sbXNnaGRyICopIE5MTVNHX05FWFQobmgsIHJlYWRfc2l6ZSkpIHsKKwkJCWlmIChuaC0+bmxtc2dfcGlkICE9IHBpZCB8fCBuaC0+bmxtc2dfc2VxICE9IHNlcSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChuaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKSB7CisJCQkJKCpkb25lKSsrOworCQkJCWJyZWFrOwkvKiBvayAqLworCQkJfQorCQkJaWYgKG5oLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKSB7CisJCQkJc3RydWN0IG5sbXNnZXJyICpubGVyciA9IChzdHJ1Y3Qgbmxtc2dlcnIgKikgTkxNU0dfREFUQShuaCk7CisJCQkJcmVzdWx0ID0gLTE7CisJCQkJaWYgKG5oLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpKQorCQkJCQllcnJubyA9IEVJTzsKKwkJCQllbHNlCisJCQkJCWVycm5vID0gLW5sZXJyLT5lcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJaWYgKHJlc3VsdCA8IDApCisJCWlmIChidWZmKSB7CisJCQlpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJCWZyZWUoYnVmZik7CisJCQlidWZmID0gTlVMTDsKKwkJCWVycm5vID0gc2F2ZWRfZXJybm87CisJCX0KKwkqbmxocCA9IChzdHJ1Y3Qgbmxtc2doZHIgKikgYnVmZjsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG5sX2dldGxpc3QoaW50IHNkLCBpbnQgc2VxLCBpbnQgcmVxdWVzdCwgc3RydWN0IG5sbXNnX2xpc3QgKipubG1fbGlzdCwgc3RydWN0IG5sbXNnX2xpc3QgKipubG1fZW5kKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCWludCBkb25lID0gMDsKKworCXN0YXR1cyA9IG5sX3NlbmRyZXEoc2QsIHJlcXVlc3QsIE5MTV9GX1JPT1QgfCBOTE1fRl9NQVRDSCwgJnNlcSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHNlcSA9PSAwKQorCQlzZXEgPSAoaW50KSB0aW1lKE5VTEwpOworCXdoaWxlICghZG9uZSkgeworCQlzdGF0dXMgPSBubF9nZXRtc2coc2QsIHJlcXVlc3QsIHNlcSwgJm5saCwgJmRvbmUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCWlmIChubGgpIHsKKwkJCXN0cnVjdCBubG1zZ19saXN0ICpubG1fbmV4dCA9IChzdHJ1Y3Qgbmxtc2dfbGlzdCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBubG1zZ19saXN0KSk7CisJCQlpZiAobmxtX25leHQgPT0gTlVMTCkgeworCQkJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCQkJCWZyZWUobmxoKTsKKwkJCQllcnJubyA9IHNhdmVkX2Vycm5vOworCQkJCXN0YXR1cyA9IC0xOworCQkJfSBlbHNlIHsKKwkJCQlubG1fbmV4dC0+bmxtX25leHQgPSBOVUxMOworCQkJCW5sbV9uZXh0LT5ubGggPSAoc3RydWN0IG5sbXNnaGRyICopIG5saDsKKwkJCQlubG1fbmV4dC0+c2l6ZSA9IHN0YXR1czsKKwkJCQlubG1fbmV4dC0+c2VxID0gc2VxOworCQkJCWlmICgqbmxtX2xpc3QgPT0gTlVMTCkgeworCQkJCQkqbmxtX2xpc3QgPSBubG1fbmV4dDsKKwkJCQkJKm5sbV9lbmQgPSBubG1fbmV4dDsKKwkJCQl9IGVsc2UgeworCQkJCQkoKm5sbV9lbmQpLT5ubG1fbmV4dCA9IG5sbV9uZXh0OworCQkJCQkqbmxtX2VuZCA9IG5sbV9uZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzID49IDAgPyBzZXEgOiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIGZyZWVfbmxtc2dsaXN0KHN0cnVjdCBubG1zZ19saXN0ICpubG0wKQoreworCXN0cnVjdCBubG1zZ19saXN0ICpubG0sICpubG1fbmV4dDsKKwlpbnQgc2F2ZWRfZXJybm87CisJaWYgKCFubG0wKQorCQlyZXR1cm47CisJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwlubG0gPSBubG0wOworCXdoaWxlKG5sbSkgeworCQlpZihubG0tPm5saCkKKwkJCWZyZWUobmxtLT5ubGgpOworCQlubG1fbmV4dCA9IG5sbS0+bmxtX25leHQ7CisJCWZyZWUobmxtKTsKKwkJbmxtID0gbmxtX25leHQ7CisJfQorCWVycm5vID0gc2F2ZWRfZXJybm87Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZGF0YSh2b2lkICpkYXRhKQoreworCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCWlmIChkYXRhICE9IE5VTEwpCisJCWZyZWUoZGF0YSk7CisJZXJybm8gPSBzYXZlZF9lcnJubzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgbmxfY2xvc2UoaW50IHNkKQoreworCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCWlmIChzZCA+PSAwKQorCQljbG9zZShzZCk7CisJZXJybm8gPSBzYXZlZF9lcnJubzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBubF9vcGVuKHZvaWQpCit7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKwlpbnQgc2Q7CisKKwlzZCA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ST1VURSk7CisJaWYgKHNkIDwgMCkKKwkJcmV0dXJuIC0xOworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisJbmxhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJaWYgKGJpbmQoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm5sYWRkciwgc2l6ZW9mKG5sYWRkcikpIDwgMCkgeworCQlubF9jbG9zZShzZCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHNkOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgbmlfaWZhZGRycyhzdHJ1Y3QgbmlfaWZhZGRycyAqKmlmYXAsIHNhX2ZhbWlseV90IGZhbWlseSkKK3sKKwlpbnQgc2Q7CisJc3RydWN0IG5sbXNnX2xpc3QgKm5sbXNnX2xpc3QsICpubG1zZ19lbmQsICpubG07CisJLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKwlpbnQgaWNudDsKKwlzaXplX3QgZGxlbiwgeGxlbjsKKwl1aW50MzJfdCBtYXhfaWZpbmRleCA9IDA7CisKKwlwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKwlpbnQgc2VxID0gMDsKKwlpbnQgcmVzdWx0OworCWludCBidWlsZDsJCS8qIDAgb3IgMSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogaW5pdGlhbGl6ZSAqLworCWljbnQgPSBkbGVuID0geGxlbiA9IDA7CisJbmxtc2dfbGlzdCA9IG5sbXNnX2VuZCA9IE5VTEw7CisKKwlpZiAoaWZhcCkKKwkJKmlmYXAgPSBOVUxMOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogb3BlbiBzb2NrZXQgYW5kIGJpbmQgKi8KKwlzZCA9IG5sX29wZW4oKTsKKwlpZiAoc2QgPCAwKQorCQlyZXR1cm4gLTE7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBnYXRoZXIgaW5mbyAqLworCWlmICgoc2VxID0gbmxfZ2V0bGlzdChzZCwgc2VxICsgMSwgUlRNX0dFVEFERFIsICZubG1zZ19saXN0LCAmbmxtc2dfZW5kKSkgPCAwKSB7CisJCWZyZWVfbmxtc2dsaXN0KG5sbXNnX2xpc3QpOworCQlubF9jbG9zZShzZCk7CisJCXJldHVybiAtMTsKKwl9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBFc3RpbWF0ZSBzaXplIG9mIHJlc3VsdCBidWZmZXIgYW5kIGZpbGwgaXQgKi8KKwlmb3IgKGJ1aWxkID0gMDsgYnVpbGQgPD0gMTsgYnVpbGQrKykgeworCQlzdHJ1Y3QgbmlfaWZhZGRycyAqaWZsID0gTlVMTCwgKmlmYSA9IE5VTEw7CisJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCAqbmxoMDsKKwkJdm9pZCAqZGF0YSA9IE5VTEwsICp4ZGF0YSA9IE5VTEw7CisJCXVpbnQxNl90ICppZmZsaXN0ID0gTlVMTDsKKyNpZm5kZWYgSUZBX0xPQ0FMCisJCXN0cnVjdCBydG1hZGRyX2lmYW1hcCBpZmFtYXA7CisjZW5kaWYKKworCQlpZiAoYnVpbGQpIHsKKwkJCWlmYSA9IGRhdGEgPSBjYWxsb2MoMSwgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuaV9pZmFkZHJzW2ljbnRdKSkKKwkJCQkJICAgICsgZGxlbiArIHhsZW4pOworCQkJaWYgKGlmYXAgIT0gTlVMTCkKKwkJCQkqaWZhcCA9IGlmYTsKKwkJCWVsc2UgeworCQkJCWZyZWVfZGF0YShkYXRhKTsKKwkJCQlyZXN1bHQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGRhdGEgPT0gTlVMTCkgeworCQkJCWZyZWVfZGF0YShkYXRhKTsKKwkJCQlyZXN1bHQgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmbCA9IE5VTEw7CisJCQlkYXRhICs9IE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmlfaWZhZGRycykpICogaWNudDsKKwkJCXhkYXRhID0gZGF0YSArIGRsZW47CisJCQlpZmZsaXN0ID0geGRhdGEgKyB4bGVuOworCQl9CisKKwkJZm9yIChubG0gPSBubG1zZ19saXN0OyBubG07IG5sbSA9IG5sbS0+bmxtX25leHQpIHsKKwkJCWludCBubG1sZW4gPSBubG0tPnNpemU7CisJCQlpZiAoIShubGgwID0gbmxtLT5ubGgpKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChubGggPSBubGgwOyBOTE1TR19PSyhubGgsIG5sbWxlbik7IG5saCA9IE5MTVNHX05FWFQobmxoLCBubG1sZW4pKSB7CisJCQkJc3RydWN0IGlmYWRkcm1zZyAqaWZhbSA9IE5VTEw7CisJCQkJc3RydWN0IHJ0YXR0ciAqcnRhOworCisJCQkJc2l6ZV90IG5sbV9zdHJ1Y3Rfc2l6ZSA9IDA7CisJCQkJc2FfZmFtaWx5X3QgbmxtX2ZhbWlseSA9IDA7CisJCQkJdWludDMyX3QgbmxtX3Njb3BlID0gMCwgbmxtX2luZGV4ID0gMDsKKwkJCQl1bnNpZ25lZCBpbnQgbmxtX2ZsYWdzOworCQkJCXNpemVfdCBydGFzaXplOworCisjaWZuZGVmIElGQV9MT0NBTAorCQkJCW1lbXNldCgmaWZhbWFwLCAwLCBzaXplb2YoaWZhbWFwKSk7CisjZW5kaWYKKworCQkJCS8qIGNoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIHdoYXQgd2Ugd2FudCAqLworCQkJCWlmIChubGgtPm5sbXNnX3BpZCAhPSBwaWQgfHwgbmxoLT5ubG1zZ19zZXEgIT0gbmxtLT5zZXEpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChubGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSkgeworCQkJCQlicmVhazsJLyogb2sgKi8KKwkJCQl9CisJCQkJc3dpdGNoIChubGgtPm5sbXNnX3R5cGUpIHsKKwkJCQljYXNlIFJUTV9ORVdBRERSOgorCQkJCQlpZmFtID0gKHN0cnVjdCBpZmFkZHJtc2cgKikgTkxNU0dfREFUQShubGgpOworCQkJCQlubG1fc3RydWN0X3NpemUgPSBzaXplb2YoKmlmYW0pOworCQkJCQlubG1fZmFtaWx5ID0gaWZhbS0+aWZhX2ZhbWlseTsKKwkJCQkJbmxtX3Njb3BlID0gaWZhbS0+aWZhX3Njb3BlOworCQkJCQlubG1faW5kZXggPSBpZmFtLT5pZmFfaW5kZXg7CisJCQkJCW5sbV9mbGFncyA9IGlmYW0tPmlmYV9mbGFnczsKKwkJCQkJaWYgKGZhbWlseSAmJiBubG1fZmFtaWx5ICE9IGZhbWlseSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoYnVpbGQpIHsKKwkJCQkJCWlmYS0+aWZhX2lmaW5kZXggPSBubG1faW5kZXg7CisJCQkJCQlpZmEtPmlmYV9mbGFncyA9IG5sbV9mbGFnczsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIWJ1aWxkKSB7CisJCQkJCWlmIChtYXhfaWZpbmRleCA8IG5sbV9pbmRleCkKKwkJCQkJCW1heF9pZmluZGV4ID0gbmxtX2luZGV4OworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChpZmwgIT0gTlVMTCkKKwkJCQkJCWlmbC0+aWZhX25leHQgPSBpZmE7CisJCQkJfQorCisJCQkJcnRhc2l6ZSA9IE5MTVNHX1BBWUxPQUQobmxoLCBubG1sZW4pIC0gTkxNU0dfQUxJR04obmxtX3N0cnVjdF9zaXplKTsKKwkJCQlmb3IgKHJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopICgoKGNoYXIgKikgTkxNU0dfREFUQShubGgpKSArIAorCQkJCQkJCQkJTkxNU0dfQUxJR04obmxtX3N0cnVjdF9zaXplKSk7IAorCQkJCSAgICAgUlRBX09LKHJ0YSwgcnRhc2l6ZSk7IAorCQkJCSAgICAgcnRhID0gUlRBX05FWFQocnRhLCBydGFzaXplKSkgeworCQkJCQl2b2lkICpydGFkYXRhID0gUlRBX0RBVEEocnRhKTsKKwkJCQkJc2l6ZV90IHJ0YXBheWxvYWQgPSBSVEFfUEFZTE9BRChydGEpOworCisJCQkJCXN3aXRjaCAobmxoLT5ubG1zZ190eXBlKSB7CisJCQkJCWNhc2UgUlRNX05FV0FERFI6CisJCQkJCQlpZiAobmxtX2ZhbWlseSA9PSBBRl9QQUNLRVQpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlzd2l0Y2ggKHJ0YS0+cnRhX3R5cGUpIHsKKyNpZm5kZWYgSUZBX0xPQ0FMCisJCQkJCQljYXNlIElGQV9BRERSRVNTOgorCQkJCQkJCWlmYW1hcC5hZGRyZXNzID0gcnRhZGF0YTsKKwkJCQkJCQlpZmFtYXAuYWRkcmVzc19sZW4gPSBydGFwYXlsb2FkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJRkFfTE9DQUw6CisJCQkJCQkJaWZhbWFwLmxvY2FsID0gcnRhZGF0YTsKKwkJCQkJCQlpZmFtYXAubG9jYWxfbGVuID0gcnRhcGF5bG9hZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSUZBX0JST0FEQ0FTVDoKKwkJCQkJCQlpZmFtYXAuYnJvYWRjYXN0ID0gcnRhZGF0YTsKKwkJCQkJCQlpZmFtYXAuYnJvYWRjYXN0X2xlbiA9IHJ0YXBheWxvYWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIElGQV9MQUJFTDoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSUZBX1VOU1BFQzoKKwkJCQkJCQlicmVhazsKKyNlbHNlCisJCQkJCQljYXNlIElGQV9MT0NBTDoKKwkJCQkJCQlpZiAoIWJ1aWxkKQorCQkJCQkJCQlkbGVuICs9IE5MTVNHX0FMSUdOKHJ0YXBheWxvYWQpOworCQkJCQkJCWVsc2UgeworCQkJCQkJCQltZW1jcHkoZGF0YSwgcnRhZGF0YSwgcnRhcGF5bG9hZCk7CisJCQkJCQkJCWlmYS0+aWZhX2FkZHIgPSBkYXRhOworCQkJCQkJCQlkYXRhICs9IE5MTVNHX0FMSUdOKHJ0YXBheWxvYWQpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCQkJY2FzZSBJRkFfQ0FDSEVJTkZPOgorCQkJCQkJCWlmICghYnVpbGQpCisJCQkJCQkJCXhsZW4gKz0gTkxNU0dfQUxJR04ocnRhcGF5bG9hZCk7CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCW1lbWNweSh4ZGF0YSwgcnRhZGF0YSwgcnRhcGF5bG9hZCk7CisJCQkJCQkJCWlmYS0+aWZhX2NhY2hlaW5mbyA9IHhkYXRhOworCQkJCQkJCQl4ZGF0YSArPSBOTE1TR19BTElHTihydGFwYXlsb2FkKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisjaWZuZGVmIElGQV9MT0NBTAorCQkJCWlmIChubGgtPm5sbXNnX3R5cGUgPT0gUlRNX05FV0FERFIgJiYgbmxtX2ZhbWlseSAhPSBBRl9QQUNLRVQpIHsKKwkJCQkJaWYgKCFpZmFtYXAubG9jYWwpIHsKKwkJCQkJCWlmYW1hcC5sb2NhbCA9IGlmYW1hcC5hZGRyZXNzOworCQkJCQkJaWZhbWFwLmxvY2FsX2xlbiA9IGlmYW1hcC5hZGRyZXNzX2xlbjsKKwkJCQkJfQorCQkJCQlpZiAoIWlmYW1hcC5hZGRyZXNzKSB7CisJCQkJCQlpZmFtYXAuYWRkcmVzcyA9IGlmYW1hcC5sb2NhbDsKKwkJCQkJCWlmYW1hcC5hZGRyZXNzX2xlbiA9IGlmYW1hcC5sb2NhbF9sZW47CisJCQkJCX0KKwkJCQkJaWYgKGlmYW1hcC5hZGRyZXNzX2xlbiAhPSBpZmFtYXAubG9jYWxfbGVuIHx8IAorCQkJCQkgICAgKGlmYW1hcC5hZGRyZXNzICE9IE5VTEwgJiYgCisJCQkJCSAgICAgbWVtY21wKGlmYW1hcC5hZGRyZXNzLCBpZmFtYXAubG9jYWwsIGlmYW1hcC5hZGRyZXNzX2xlbikpKSB7CisJCQkJCQkvKiBwMnA7IGFkZHJlc3MgaXMgcGVlciBhbmQgbG9jYWwgaXMgb3VycyAqLworCQkJCQkJaWZhbWFwLmJyb2FkY2FzdCA9IGlmYW1hcC5hZGRyZXNzOworCQkJCQkJaWZhbWFwLmJyb2FkY2FzdF9sZW4gPSBpZmFtYXAuYWRkcmVzc19sZW47CisJCQkJCQlpZmFtYXAuYWRkcmVzcyA9IGlmYW1hcC5sb2NhbDsKKwkJCQkJCWlmYW1hcC5hZGRyZXNzX2xlbiA9IGlmYW1hcC5sb2NhbF9sZW47CisJCQkJCX0KKwkJCQkJaWYgKGlmYW1hcC5hZGRyZXNzKSB7CisJCQkJCQlpZiAoIWJ1aWxkKQorCQkJCQkJCWRsZW4gKz0gTkxNU0dfQUxJR04oaWZhbWFwLmFkZHJlc3NfbGVuKTsKKwkJCQkJCWVsc2UgeworCQkJCQkJCWlmYS0+aWZhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGRhdGE7CisJCQkJCQkJbWVtY3B5KGlmYS0+aWZhX2FkZHIsIGlmYW1hcC5hZGRyZXNzLCBpZmFtYXAuYWRkcmVzc19sZW4pOworCQkJCQkJCWRhdGEgKz0gTkxNU0dfQUxJR04oaWZhbWFwLmFkZHJlc3NfbGVuKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCWlmICghYnVpbGQpIHsKKwkJCQkJaWNudCsrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmbCA9IGlmYSsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWJ1aWxkKSB7CisJCQlpZiAoaWNudCA9PSAwICYmIChkbGVuICsgeGxlbiA9PSAwKSkgeworCQkJCWlmIChpZmFwICE9IE5VTEwpCisJCQkJCSppZmFwID0gTlVMTDsKKwkJCQlicmVhazsJLyogY2Fubm90IGZvdW5kIGFueSBhZGRyZXNzZXMgKi8KKwkJCX0KKwkJfQorCX0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEZpbmFsaXplICovCisJZnJlZV9ubG1zZ2xpc3Qobmxtc2dfbGlzdCk7CisJbmxfY2xvc2Uoc2QpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIG5pX2ZyZWVpZmFkZHJzKHN0cnVjdCBuaV9pZmFkZHJzICppZmEpCit7CisJZnJlZShpZmEpOworfQorCmRpZmYgLS1naXQgYS9pcHV0aWxzL25pbmZvZC9uaV9pZmFkZHJzLmggYi9pcHV0aWxzL25pbmZvZC9uaV9pZmFkZHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NGE4YgotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvbmluZm9kL25pX2lmYWRkcnMuaApAQCAtMCwwICsxLDQ1IEBACisvKiAkVVNBR0k6IG5pX2lmYWRkcnMuaCx2IDEuMSAyMDAyLTEyLTAzIDE3OjQ4OjUzIHlvc2hmdWppIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFVTQUdJL1dJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgTk9ERUlORk9fSUZBRERSU19ICisjZGVmaW5lIE5PREVJTkZPX0lGQUREUlNfSAorCitzdHJ1Y3QgbmlfaWZhZGRycyB7CisJc3RydWN0IG5pX2lmYWRkcnMgIAkqaWZhX25leHQ7CisJdW5zaWduZWQgaW50CQlpZmFfaWZpbmRleDsKKwl1bnNpZ25lZCBzaG9ydAkJaWZhX2ZsYWdzOworCXZvaWQJCQkqaWZhX2FkZHI7CisJc3RydWN0IGlmYV9jYWNoZWluZm8JKmlmYV9jYWNoZWluZm87Cit9OworCitpbnQgbmlfaWZhZGRycyhzdHJ1Y3QgbmlfaWZhZGRycyAqKmlmYXAsIHNhX2ZhbWlseV90IGZhbWlseSk7Cit2b2lkIG5pX2ZyZWVpZmFkZHJzKHN0cnVjdCBuaV9pZmFkZHJzICppZmEpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9uaW5mb2QvbmluZm9kLmMgYi9pcHV0aWxzL25pbmZvZC9uaW5mb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmY2OTkzCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9uaW5mb2QvbmluZm9kLmMKQEAgLTAsMCArMSw3NzUgQEAKKy8qICRVU0FHSTogbmluZm9kLmMsdiAxLjM0IDIwMDMtMDEtMTUgMDY6NDE6MjMgbWsgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgVVNBR0kvV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworLyoKKyAqIEF1dGhvcjoKKyAqIAlZT1NISUZVSkkgSGlkZWFraSA8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CisgKi8KKworI2lmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIVNURENfSEVBREVSUyAmJiBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RESU5UX0gKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9MSU1JVFNfSAorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyBpbmNsdWRlIDx0aW1lLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9TWVNfVUlPX0gKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2lmIEhBVkVfTkVUSU5FVF9JTl9ICisjIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaWYgSEFWRV9ORVRJTkVUX0lDTVA2X0gKKyMgaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorI2VuZGlmCisjaWZuZGVmIEhBVkVfU1RSVUNUX0lDTVA2X05PREVJTkZPCisjIGluY2x1ZGUgImljbXA2X25vZGVpbmZvLmgiCisjZW5kaWYKKworI2lmIEhBVkVfTkVUREJfSAorIyBpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWYgSEFWRV9TWVNMT0dfSAorIyBpbmNsdWRlIDxzeXNsb2cuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9QV0RfSAorIyBpbmNsdWRlIDxwd2QuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9TWVNfQ0FQQUJJTElUWV9ICisjIGluY2x1ZGUgPHN5cy9wcmN0bC5oPgorIyBpbmNsdWRlIDxzeXMvY2FwYWJpbGl0eS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJuaW5mb2QuaCIKKworI2lmbmRlZiBvZmZzZXRvZgorIyBkZWZpbmUgb2Zmc2V0b2YoYWdncmVnYXRlLG1lbWJlcikJKChzaXplX3QpJigoYWdncmVnYXRlICopMCktPm1lbWJlcikKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0gKi8KKy8qIElEICovCitzdGF0aWMgY2hhciAqUkNTSUQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpID0gIiRVU0FHSTogbmluZm9kLmMsdiAxLjM0IDIwMDMtMDEtMTUgMDY6NDE6MjMgbWsgRXhwICQiOworCisvKiBWYXJpYWJsZXMgKi8KK2ludCBzb2NrOworaW50IGRhZW1vbml6ZWQ7CisKK2NoYXIgKmFwcG5hbWU7CitzdGF0aWMgaW50IG9wdF9kID0gMDsJLyogZGVidWcgKi8KK3N0YXRpYyBpbnQgb3B0X2ggPSAwOwkvKiBoZWxwICovCitzdGF0aWMgY2hhciAqb3B0X3AgPSBOSU5GT0RfUElERklMRTsJLyogcGlkZmlsZSAqLworc3RhdGljIGludCBnb3Rfc2lnbmFsID0gMDsJLyogbG9vcCB1bmxlc3MgdHJ1ZSAqLworaW50IG9wdF92ID0gMDsJCS8qIHZlcmJvc2UgKi8KK3N0YXRpYyB1aWRfdCBvcHRfdTsKKworc3RhdGljIGludCBpcHY2X3BrdGluZm8gPSBJUFY2X1BLVElORk87CisKKy8qIC0tLS0tLS0tLSAqLworI2lmIEVOQUJMRV9ERUJVRworc3RhdGljIGNvbnN0IF9faW5saW5lX18gY2hhciAqIGxvZ19sZXZlbChpbnQgcHJpb3JpdHkpIHsKKwlzd2l0Y2gocHJpb3JpdHkpIHsKKwljYXNlIExPR19FTUVSRzoJCXJldHVybiAiRU1FUkciOworCWNhc2UgTE9HX0FMRVJUOgkJcmV0dXJuICJBTEVSVCI7CisJY2FzZSBMT0dfQ1JJVDoJCXJldHVybiAiQ1JJVCI7CisJY2FzZSBMT0dfRVJSOgkJcmV0dXJuICJFUlIiOworCWNhc2UgTE9HX1dBUk5JTkc6CXJldHVybiAiV0FSTklORyI7CisJY2FzZSBMT0dfTk9USUNFOglyZXR1cm4gIk5PVElDRSI7CisJY2FzZSBMT0dfSU5GTzoJCXJldHVybiAiSU5GTyI7CisJY2FzZSBMT0dfREVCVUc6CQlyZXR1cm4gIkRFQlVHIjsKKwlkZWZhdWx0OgkJcmV0dXJuICI/Pz8iOworCX0KK30KKwordm9pZCBzdGRlcnJsb2coaW50IHByaSwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwljaGFyIGVidWZbNTEyXTsKKwljaGFyICpidWY7CisJc2l6ZV90IGJ1ZmxlbjsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCisJZm9yIChidWYgPSBlYnVmLCBidWZsZW4gPSBzaXplb2YoZWJ1Zik7CisJICAgICBidWZsZW4gPCBTSVpFX01BWCAvIDI7CisJICAgICBmcmVlKGJ1ZiAhPSBlYnVmID8gYnVmIDogTlVMTCksIGJ1ZiA9IE5VTEwsIGJ1ZmxlbiAqPSAyKSB7CisJCXNpemVfdCByZW07CisJCXNpemVfdCByZXM7CisKKwkJYnVmID0gbWFsbG9jKGJ1Zmxlbik7CisJCWlmICghYnVmKQorCQkJYnJlYWs7CS8qWFhYKi8KKworCQlyZW0gPSBidWZsZW47CisKKwkJcmVzID0gc25wcmludGYoYnVmLCByZW0sICJbJXNdICIsIGxvZ19sZXZlbChwcmkpKTsKKwkJaWYgKHJlcyA+PSByZW0pCisJCQljb250aW51ZTsKKwkJcmVtIC09IHJlczsKKworCQlyZXMgPSB2c25wcmludGYoYnVmICsgcmVzLCByZW0sIGZtdCwgYXApOworCisJCWlmIChyZXMgPj0gcmVtKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKworCWlmIChidWYpIHsKKwkJZnB1dHMoYnVmLCBzdGRlcnIpOworCQlmcmVlKGJ1ZiAhPSBlYnVmID8gYnVmIDogTlVMTCk7CisJfQorCisJdmFfZW5kKGFwKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgX19pbmxpbmVfXyBvcGVuX3NvY2sodm9pZCkKK3sKKwlyZXR1cm4gc29ja2V0KFBGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpOworfQorCitzdGF0aWMgaW50IHNldF9yZWN2cGt0aW5mbyhpbnQgc29jaykKK3sKKwlpbnQgb24sIHJldDsKKworCW9uID0gMTsKKworI2lmIGRlZmluZWQoSVBWNl9SRUNWUEtUSU5GTykKKwlyZXQgPSBzZXRzb2Nrb3B0KHNvY2ssCisJCQkgSVBQUk9UT19JUFY2LCBJUFY2X1JFQ1ZQS1RJTkZPLAorCQkJICZvbiwgc2l6ZW9mKG9uKSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworIyBpZiBkZWZpbmVkKElQVjZfMjI5MlBLVElORk8pCisJcmV0ID0gc2V0c29ja29wdChzb2NrLAorCQkJIElQUFJPVE9fSVBWNiwgSVBWNl8yMjkyUEtUSU5GTywKKwkJCSAmb24sIHNpemVvZihvbikpOworCWlmICghcmV0KSB7CisJCWlwdjZfcGt0aW5mbyA9IElQVjZfMjI5MlBLVElORk87CisJCXJldHVybiAwOworCX0KKworCURFQlVHKExPR19FUlIsICJzZXRzb2Nrb3B0KElQVjZfUkVDVlBLVElORk8vSVBWNl8yMjkyUEtUSU5GTyk6ICVzXG4iLAorCSAgICAgIHN0cmVycm9yKGVycm5vKSk7CisjIGVsc2UKKwlERUJVRyhMT0dfRVJSLCAic2V0c29ja29wdChJUFY2X1JFQ1ZQS1RJTkZPKTogJXNcbiIsCisJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyMgZW5kaWYKKyNlbHNlCisJcmV0ID0gc2V0c29ja29wdChzb2NrLAorCQkJIElQUFJPVE9fSVBWNiwgSVBWNl9QS1RJTkZPLAorCQkJICZvbiwgc2l6ZW9mKG9uKSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJREVCVUcoTE9HX0VSUiwgInNldHNvY2tvcHQoSVBWNl9QS1RJTkZPKTogJXNcbiIsCisJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZgorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IF9faW5saW5lX18gaW5pdF9zb2NrKGludCBzb2NrKQoreworCXN0cnVjdCBpY21wNl9maWx0ZXIgZmlsdGVyOworI2lmIE5FRURfSVBWNkNIRUNLU1VNCisJaW50IGk7CisKKwlpID0gb2Zmc2V0b2Yoc3RydWN0IGljbXA2X25vZGVpbmZvLCBuaV9ja3N1bSk7CisJaWYgKHNldHNvY2tvcHQoc29jaywKKwkJICAgICAgIElQUFJPVE9fSVBWNiwgSVBWNl9DSEVDS1NVTSwKKwkJICAgICAgICZpLCBzaXplb2YoaSkpIDwgMCkgeworCQlERUJVRyhMT0dfRVJSLCAic2V0c29ja29wdChJUFY2X0NIRUNLU1VNKTogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCUlDTVA2X0ZJTFRFUl9TRVRCTE9DS0FMTCgmZmlsdGVyKTsKKwlJQ01QNl9GSUxURVJfU0VUUEFTUyhJQ01QNl9OSV9RVUVSWSwgJmZpbHRlcik7CisJaWYgKHNldHNvY2tvcHQoc29jaywKKwkJICAgICAgIElQUFJPVE9fSUNNUFY2LCBJQ01QNl9GSUxURVIsCisJCSAgICAgICAmZmlsdGVyLCBzaXplb2YoZmlsdGVyKSkgPCAwKSB7CisJCURFQlVHKExPR19FUlIsICJzZXRzb2Nrb3B0KElDTVA2X0ZJTFRFUik6ICVzXG4iLAorCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNldF9yZWN2cGt0aW5mbyhzb2NrKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0gKi8KK2ludCBuaV9yZWN2KHN0cnVjdCBwYWNrZXRjb250ZXh0ICpwKQoreworCWludCBzb2NrID0gcC0+c29jazsKKwlzdHJ1Y3QgaW92ZWMgaW92WzFdOworCXN0cnVjdCBtc2doZHIgbXNnaDsKKwljaGFyIHJlY3ZjYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKHAtPnBrdGluZm8pKV07CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJaW50IGNjOworCisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJbWVtc2V0KCZpb3YsIDAsIHNpemVvZihpb3YpKTsKKwlpb3ZbMF0uaW92X2Jhc2UgPSBwLT5xdWVyeTsKKwlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihwLT5xdWVyeSk7CisKKwltZW1zZXQoJm1zZ2gsIDAsIHNpemVvZihtc2doKSk7CisJbXNnaC5tc2dfbmFtZSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmcC0+YWRkcjsKKwltc2doLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHAtPmFkZHIpOworCW1zZ2gubXNnX2lvdiA9IGlvdjsKKwltc2doLm1zZ19pb3ZsZW4gPSAxOworCW1zZ2gubXNnX2NvbnRyb2wgPSByZWN2Y2J1ZjsKKwltc2doLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKHJlY3ZjYnVmKTsKKworCWlmICgoY2MgPSByZWN2bXNnKHNvY2ssICZtc2doLCAwKSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlwLT5xdWVyeWxlbiA9IGNjOworCXAtPmFkZHJsZW4gPSBtc2doLm1zZ19uYW1lbGVuOworCisJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnaCk7IGNtc2c7CisJICAgICBjbXNnID0gQ01TR19OWFRIRFIoJm1zZ2gsIGNtc2cpKSB7CisJCWlmIChjbXNnLT5jbXNnX2xldmVsID09IElQUFJPVE9fSVBWNiAmJgorCQkgICAgKGNtc2ctPmNtc2dfdHlwZSA9PSBJUFY2X1BLVElORk8KKyNpZiBkZWZpbmVkKElQVjZfMjI5MlBLVElORk8pCisJCSAgICAgfHwgY21zZy0+Y21zZ190eXBlID09IElQVjZfMjI5MlBLVElORk8KKyNlbmRpZgorCQkgICAgKSkgeworCQkJbWVtY3B5KCZwLT5wa3RpbmZvLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZihwLT5wa3RpbmZvKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbmlfc2VuZChzdHJ1Y3QgcGFja2V0Y29udGV4dCAqcCkKK3sKKwlpbnQgc29jayA9IHAtPnNvY2s7CisJc3RydWN0IGlvdmVjIGlvdlsyXTsKKwljaGFyIGNidWZbQ01TR19TUEFDRShzaXplb2YocC0+cGt0aW5mbykpXTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZ2g7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJaW50IGNjOworCisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJbWVtc2V0KCZpb3YsIDAsIHNpemVvZihpb3YpKTsKKwlpb3ZbMF0uaW92X2Jhc2UgPSAmcC0+cmVwbHk7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocC0+cmVwbHkpOworCWlvdlsxXS5pb3ZfYmFzZSA9IHAtPnJlcGx5ZGF0YTsKKwlpb3ZbMV0uaW92X2xlbiA9IHAtPnJlcGx5ZGF0YWxlbjsKKworCW1lbXNldCgmbXNnaCwgMCwgc2l6ZW9mKG1zZ2gpKTsKKwltc2doLm1zZ19uYW1lID0gKHN0cnVjdCBzb2NrYWRkciAqKSZwLT5hZGRyOworCW1zZ2gubXNnX25hbWVsZW4gPSBwLT5hZGRybGVuOworCW1zZ2gubXNnX2lvdiA9IGlvdjsKKwltc2doLm1zZ19pb3ZsZW4gPSBwLT5yZXBseWRhdGEgPyAyIDogMTsKKworCW1zZ2gubXNnX2NvbnRyb2wgPSBjYnVmOworCW1zZ2gubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY2J1Zik7CisKKwljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnaCk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fSVBWNjsKKwljbXNnLT5jbXNnX3R5cGUgPSBpcHY2X3BrdGluZm87CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2YocC0+cGt0aW5mbykpOworCW1lbWNweShDTVNHX0RBVEEoY21zZyksICZwLT5wa3RpbmZvLCBzaXplb2YocC0+cGt0aW5mbykpOworCisJbXNnaC5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCisJaWYgKHAtPmRlbGF5KSB7CisjaWYgSEFWRV9OQU5PU0xFRVAKKwkJc3RydWN0IHRpbWVzcGVjIHRzLCBydHM7CisJCWludCBlcnIgPSAwOworCisJCXJ0cy50dl9zZWMgID0gcC0+ZGVsYXkgLyAxMDAwMDAwOworCQlydHMudHZfbnNlYyA9IChsb25nKShwLT5kZWxheSAlIDEwMDAwMDApICogMTAwMDsKKworCQlkbyB7CisJCQl0cyA9IHJ0czsKKwkJCWVyciA9IG5hbm9zbGVlcCgmdHMsICZydHMpOworCQl9IHdoaWxlKGVyciA8IDApOworI2Vsc2UKKwkJdXNsZWVwKHAtPmRlbGF5KTsJLypYWFg6IHNpZ25hbCovCisjZW5kaWYKKwl9CisKKwljYyA9IHNlbmRtc2coc29jaywgJm1zZ2gsIDApOworCWlmIChjYyA8IDApCisJCURFQlVHKExPR19ERUJVRywgInNlbmRtc2coKTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwluaV9mcmVlKHAtPnJlcGx5ZGF0YSk7CisJbmlfZnJlZShwKTsKKworCXJldHVybiBjYzsKK30KKworLyogLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnKQoreworCWlmICghZ290X3NpZ25hbCkKKwkJREVCVUcoTE9HX0lORk8sICJzaW5nbmFsKCVkKSByZWNlaXZlZCwgcXVpdHRpbmcuXG4iLCBzaWcpOworCWdvdF9zaWduYWwgPSAxOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9zaWdoYW5kbGVycyh2b2lkKQoreworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCXNpZ3NldF90IHNtYXNrOworCXNpZ2VtcHR5c2V0KCZzbWFzayk7CisJc2lnYWRkc2V0KCZzbWFzaywgU0lHSFVQKTsKKwlzaWdhZGRzZXQoJnNtYXNrLCBTSUdJTlQpOworCXNpZ2FkZHNldCgmc21hc2ssIFNJR1FVSVQpOworCXNpZ2FkZHNldCgmc21hc2ssIFNJR1RFUk0pOworCisJbWVtc2V0KCZhY3QsIDAsIHNpemVvZihhY3QpKTsKKwlhY3Quc2FfaGFuZGxlciA9IHNpZ19oYW5kbGVyOworCWFjdC5zYV9tYXNrID0gc21hc2s7CisKKwlzaWdhY3Rpb24oU0lHSFVQLCAmYWN0LCBOVUxMKTsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmYWN0LCBOVUxMKTsKKwlzaWdhY3Rpb24oU0lHUVVJVCwgJmFjdCwgTlVMTCk7CisJc2lnYWN0aW9uKFNJR1RFUk0sICZhY3QsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbG9nZmlsZSh2b2lkKQoreworCXNldGJ1ZihzdGRlcnIsIE5VTEwpOworI2lmIEVOQUJMRV9ERUJVRworCW9wZW5sb2coTklORk9ELCAwLCBMT0dfVVNFUik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9waWRmaWxlKHZvaWQpCit7CisJaW50IGVycjsKKworCWlmIChkYWVtb25pemVkICYmIG9wdF9wKSB7CisJCWVyciA9IHVubGluayhvcHRfcCk7CisJCURFQlVHKExPR19FUlIsICJmYWlsZWQgdG8gdW5saW5rIGZpbGUgJyVzJyA6ICVzXG4iLAorCQkJCW9wdF9wLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKworc3RhdGljIEZJTEUgKmZvcGVuX2V4Y2woY29uc3QgY2hhciAqZmlsZSkKK3sKKyNpZm5kZWYgX19saW51eF9fCisJaW50IGZkOworCUZJTEUgKmZwOworCisJZmQgPSBvcGVuKGZpbGUsIE9fQ1JFQVQgfCBPX1JEV1IgfCBPX0VYQ0wsCisJCSAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZmRvcGVuKGZpbGUsICJ3KyIpOworI2Vsc2UKKwlyZXR1cm4gZm9wZW4oZmlsZSwgIncreCIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGRvX2RhZW1vbml6ZSh2b2lkKQoreworCUZJTEUgKmZwID0gTlVMTDsKKwlwaWRfdCBwaWQ7CisKKwlpZiAob3B0X3ApIHsKKwkJaWYgKCFhY2Nlc3Mob3B0X3AsIFJfT0spKSB7CisJCQlpZiAoKGZwID0gZm9wZW4ob3B0X3AsICJyIikpKSB7CisJCQkJaWYgKGZzY2FuZihmcCwgIiVkIiwgJnBpZCkgIT0gMSkgeworCQkJCQlERUJVRyhMT0dfRVJSLCAicGlkIGZpbGUgJyVzJyBleGlzdHMsIGJ1dCByZWFkIGZhaWxlZC5cbiIsCisJCQkJCSAgICAgIG9wdF9wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlERUJVRyhMT0dfRVJSLCAicGlkIGZpbGUgJyVzJyBleGlzdHMgOiAlZFxuIiwKKwkJCQkJICAgICAgb3B0X3AsIHBpZCk7CisJCQkJfQorCQkJCWZjbG9zZShmcCk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCisJCWZwID0gZm9wZW5fZXhjbChvcHRfcCk7CisJCWlmICghZnApIHsKKwkJCURFQlVHKExPR19FUlIsICJmYWlsZWQgdG8gb3BlbiBmaWxlICclcyc6ICVzXG4iLAorCQkJICAgICAgb3B0X3AsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKGRhZW1vbigwLCAwKSA8IDApIHsKKwkJREVCVUcoTE9HX0VSUiwgImZhaWxlZCB0byBkYWVtb24oKTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXVubGluayhvcHRfcCk7CisJCWV4aXQoMSk7CisJfQorCWRhZW1vbml6ZWQgPSAxOworCisJaWYgKGZwKSB7CisJCWZwcmludGYoZnAsICIlZFxuIiwgZ2V0cGlkKCkpOworCQlmY2xvc2UoZnApOworCX0KK30KKworLyogLS0tLS0tLS0tICovCisjaWZkZWYgSEFWRV9MSUJDQVAKK3N0YXRpYyBjb25zdCBjYXBfdmFsdWVfdCBjYXBfbmV0X3JhdyA9IENBUF9ORVRfUkFXOworc3RhdGljIGNvbnN0IGNhcF92YWx1ZV90IGNhcF9zZXR1aWQgPSAgQ0FQX1NFVFVJRDsgCitzdGF0aWMgY2FwX2ZsYWdfdmFsdWVfdCBjYXBfb2s7CisjZWxzZQorc3RhdGljIHVpZF90IGV1aWQ7CisjZW5kaWYKKworc3RhdGljIHZvaWQgbGltaXRfY2FwYWJpbGl0aWVzKHZvaWQpCit7CisjaWZkZWYgSEFWRV9MSUJDQVAKKwljYXBfdCBjYXBfcCwgY2FwX2N1cl9wOworCisJY2FwX3AgPSBjYXBfaW5pdCgpOworCWlmICghY2FwX3ApIHsKKwkJREVCVUcoTE9HX0VSUiwgImNhcF9pbml0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgtMSk7CisJfQorCisJY2FwX2N1cl9wID0gY2FwX2dldF9wcm9jKCk7CisJaWYgKCFjYXBfY3VyX3ApIHsKKwkJREVCVUcoTE9HX0VSUiwgImNhcF9nZXRfcHJvYzogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoLTEpOworICAgICAgICB9CisKKwkvKiBuZXRfcmF3ICsgc2V0dWlkIC8gbmV0X3JhdyAqLworCWNhcF9nZXRfZmxhZyhjYXBfY3VyX3AsIENBUF9ORVRfUkFXLCBDQVBfUEVSTUlUVEVELCAmY2FwX29rKTsKKwlpZiAoY2FwX29rICE9IENBUF9DTEVBUikgeworCQljYXBfc2V0X2ZsYWcoY2FwX3AsIENBUF9QRVJNSVRURUQsIDEsICZjYXBfbmV0X3JhdywgQ0FQX1NFVCk7CisJCWNhcF9zZXRfZmxhZyhjYXBfcCwgQ0FQX0VGRkVDVElWRSwgMSwgJmNhcF9uZXRfcmF3LCBDQVBfU0VUKTsKKwl9CisKKwljYXBfZ2V0X2ZsYWcoY2FwX2N1cl9wLCBDQVBfU0VUVUlELCBDQVBfUEVSTUlUVEVELCAmY2FwX29rKTsKKwlpZiAoY2FwX29rICE9IENBUF9DTEVBUikKKwkJY2FwX3NldF9mbGFnKGNhcF9wLCBDQVBfUEVSTUlUVEVELCAxLCAmY2FwX3NldHVpZCwgQ0FQX1NFVCk7CisKKwlpZiAoY2FwX3NldF9wcm9jKGNhcF9wKSA8IDApIHsKKwkJREVCVUcoTE9HX0VSUiwgImNhcF9zZXRfcHJvYzogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChlcnJubyAhPSBFUEVSTSkKKwkJCWV4aXQoLTEpOworCX0KKworCWlmIChwcmN0bChQUl9TRVRfS0VFUENBUFMsIDEpIDwgMCkgeworCQlERUJVRyhMT0dfRVJSLCAicHJjdGw6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KC0xKTsKKwl9CisKKwljYXBfZnJlZShjYXBfY3VyX3ApOworCWNhcF9mcmVlKGNhcF9wKTsKKyNlbHNlCisJZXVpZCA9IGdldGV1aWQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBkcm9wX2NhcGFiaWxpdGllcyh2b2lkKQoreworI2lmZGVmIEhBVkVfTElCQ0FQCisJY2FwX3QgY2FwX3A7CisKKwljYXBfcCA9IGNhcF9pbml0KCk7CisJaWYgKCFjYXBfcCkgeworCQlERUJVRyhMT0dfRVJSLCAiY2FwX2luaXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KC0xKTsKKwl9CisKKwkvKiBzZXR1aWQgLyBzZXR1aWQgKi8KKwlpZiAoY2FwX29rICE9IENBUF9DTEVBUikgeworCQljYXBfc2V0X2ZsYWcoY2FwX3AsIENBUF9QRVJNSVRURUQsIDEsICZjYXBfc2V0dWlkLCBDQVBfU0VUKTsKKwkJY2FwX3NldF9mbGFnKGNhcF9wLCBDQVBfRUZGRUNUSVZFLCAxLCAmY2FwX3NldHVpZCwgQ0FQX1NFVCk7CisKKwkJaWYgKGNhcF9zZXRfcHJvYyhjYXBfcCkgPCAwKSB7CisJCQlERUJVRyhMT0dfRVJSLCAiY2FwX3NldF9wcm9jOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoLTEpOworCQl9CisJfQorCisJaWYgKHNldGV1aWQob3B0X3UgPyBvcHRfdSA6IGdldHVpZCgpKSA8IDApIHsKKwkJREVCVUcoTE9HX0VSUiwgInNldHVpZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChwcmN0bChQUl9TRVRfS0VFUENBUFMsIDApIDwgMCkgeworCQlERUJVRyhMT0dfRVJSLCAicHJjdGw6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KC0xKTsKKwl9CisKKwljYXBfY2xlYXIoY2FwX3ApOworCWlmIChjYXBfc2V0X3Byb2MoY2FwX3ApIDwgMCkgeworCQlERUJVRyhMT0dfRVJSLCAiY2FwX3NldF9wcm9jOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgtMSk7CisJfQorCisJY2FwX2ZyZWUoY2FwX3ApOworI2Vsc2UKKwlpZiAoc2V0dWlkKGdldHVpZCgpKSA8IDApIHsKKwkJREVCVUcoTE9HX0VSUiwgInNldHVpZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoLTEpOworCX0KKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWNoYXIgKmVwOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGh2cDp1OiIpKSAhPSAtMSkgeworCQlzd2l0Y2goYykgeworCQljYXNlICdkJzoJLyogZGVidWcgKi8KKwkJCW9wdF9kID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoJLyogdmVyYm9zZSAqLworCQkJb3B0X3YgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJb3B0X3AgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQl2YWwgPSBzdHJ0b3VsKG9wdGFyZywgJmVwLCAxMCk7CisJCQlpZiAoIW9wdGFyZyB8fCAqZXApIHsKKwkJCQlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3bmFtKG9wdGFyZyk7CisJCQkJaWYgKCFwdykgeworCQkJCQlERUJVRyhMT0dfRVJSLCAiTm8gc3VjaCB1c2VyOiAlcyIsIG9wdGFyZyk7CisJCQkJCWV4aXQoMSk7CisJCQkJfQorCQkJCW9wdF91ID0gcHctPnB3X3VpZDsKKwkJCX0gZWxzZQorCQkJCW9wdF91ID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgkvKiBoZWxwICovCisJCWRlZmF1bHQ6CisJCQlvcHRfaCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWFyZ2MgLT0gb3B0aW5kOworI2lmIDAKKwlhcmd2ICs9IG9wdGluZDsKKyNlbmRpZgorCisJaWYgKGFyZ2MpCisJCW9wdF9oID0gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfY29weWluZyh2b2lkKSB7CisJZnByaW50ZihzdGRlcnIsCisJCSJOb2RlIEluZm9ybWF0aW9uIERhZW1vblxuIgorCQkiQ29weXJpZ2h0IChDKTIwMDIgVVNBR0kvV0lERSBQcm9qZWN0LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiIKKwkJIlxuIgorCSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKHZvaWQpIHsKKwlmcHJpbnRmKHN0ZGVyciwgCisJCSJVc2FnZTogJXMgWy1kXSBbLXAgcGlkZmlsZV0gWy11IHVzZXJdIFstaF0gWy12XVxuXG4iLAorCQlhcHBuYW1lCisJKTsKK30KKworLyogLS0tLS0tLS0tICovCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBzb2NrX2Vycm5vID0gMDsKKwlpbnQgcmV0OworCisJYXBwbmFtZSA9IGFyZ3ZbMF07CisJc2V0X2xvZ2ZpbGUoKTsKKworCWxpbWl0X2NhcGFiaWxpdGllcygpOworCisJc29jayA9IG9wZW5fc29jaygpOworCWlmIChzb2NrIDwgMCkKKwkJc29ja19lcnJubyA9IGVycm5vOworCisJcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKKworCWRyb3BfY2FwYWJpbGl0aWVzKCk7CisKKwlpZiAob3B0X2ggfHwgb3B0X3YpCisJCXByaW50X2NvcHlpbmcoKTsKKwlpZiAob3B0X2gpIHsKKwkJcHJpbnRfdXNhZ2UoKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoc29ja19lcnJubykgeworCQlERUJVRyhMT0dfRVJSLCAic29ja2V0OiAlc1xuIiwgc3RyZXJyb3Ioc29ja19lcnJubykpOworCQlleGl0KDEpOworCX0KKworCS8qIGluaXRpYWxpemUgKi8KKwlpZiAoaW5pdF9zb2NrKHNvY2spIDwgMCkKKwkJZXhpdCgxKTsKKworCXNldHVwX3NpZ2hhbmRsZXJzKCk7CisJaWYgKCFvcHRfZCkKKwkJZG9fZGFlbW9uaXplKCk7CisKKwlpbml0X2NvcmUoMSk7CisKKwkvKiBtYWluIGxvb3AgKi8KKwl3aGlsZSAoIWdvdF9zaWduYWwpIHsKKwkJc3RydWN0IHBhY2tldGNvbnRleHQgKnA7CisJCXN0cnVjdCBpY21wNl9oZHIgKmljbXBoOworI2lmIEVOQUJMRV9ERUJVRworCQljaGFyIHNhZGRyYnVmW05JX01BWEhPU1RdOworCQlpbnQgZ25pOworI2VuZGlmIAorCisJCWluaXRfY29yZSgwKTsKKworCQlwID0gbmlfbWFsbG9jKHNpemVvZigqcCkpOworCQlpZiAoIXApIHsKKwkJCURFQlVHKExPR19XQVJOSU5HLCAiJXMoKTogZmFpbGVkIHRvIGFsbG9jYXRlIHBhY2tldCBjb250ZXh0OyBzbGVlcCAxIHNlYy5cbiIsCisJCQkgICAgICBfX2Z1bmNfXyk7CisJCQlzbGVlcCgxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJd2hpbGUgKCFnb3Rfc2lnbmFsKSB7CisJCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJCQlwLT5zb2NrID0gc29jazsKKworCQkJaWYgKG5pX3JlY3YocCkgPCAwKSB7CisJCQkJaWYgKGdvdF9zaWduYWwpCisJCQkJCWJyZWFrOworCQkJCWlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpCisJCQkJCWNvbnRpbnVlOworCQkJCS8qIFhYWDogc3lzbG9nICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisjaWYgRU5BQkxFX0RFQlVHCisJCWduaSA9IGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKikmcC0+YWRkciwKKwkJCQkgIHAtPmFkZHJsZW4sCisJCQkJICBzYWRkcmJ1Ziwgc2l6ZW9mKHNhZGRyYnVmKSwKKwkJCQkgIE5VTEwsIDAsCisJCQkJICBOSV9OVU1FUklDSE9TVCk7CisJCWlmIChnbmkpCisJCQlzcHJpbnRmKHNhZGRyYnVmLCAiPz8/Iik7CisjZW5kaWYKKwkJaW5pdF9jb3JlKDApOworCisJCWlmIChwLT5xdWVyeWxlbiA8IHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSkgeworCQkJbmlfZnJlZShwKTsKKwkJCURFQlVHKExPR19XQVJOSU5HLCAiVG9vIHNob3J0IGljbXAgbWVzc2FnZSBmcm9tICVzXG4iLCBzYWRkcmJ1Zik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWljbXBoID0gKHN0cnVjdCBpY21wNl9oZHIgKilwLT5xdWVyeTsKKworCQlERUJVRyhMT0dfREVCVUcsCisJCSAgICAgICJ0eXBlPSVkLCBjb2RlPSVkLCBja3N1bT0weCUwNHhcbiIsCisJCSAgICAgIGljbXBoLT5pY21wNl90eXBlLCBpY21waC0+aWNtcDZfY29kZSwKKwkJICAgICAgbnRvaHMoaWNtcGgtPmljbXA2X2Nrc3VtKSk7CisKKwkJaWYgKGljbXBoLT5pY21wNl90eXBlICE9IElDTVA2X05JX1FVRVJZKSB7CisJCQlERUJVRyhMT0dfV0FSTklORywKKwkJCSAgICAgICJTdHJhbmdlIGljbXAgdHlwZSAlZCBmcm9tICVzXG4iLCAKKwkJCSAgICAgIGljbXBoLT5pY21wNl90eXBlLCBzYWRkcmJ1Zik7CisJCQluaV9mcmVlKHApOworCQkJY29udGludWU7CisJCX0KKworCQlwcl9ub2RlaW5mbyhwKTsJLyogdGhpcyBmcmVlcyBwICovCisJfQorCisJY2xlYW51cF9waWRmaWxlKCk7CisKKwlleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9pcHV0aWxzL25pbmZvZC9uaW5mb2QuaCBiL2lwdXRpbHMvbmluZm9kL25pbmZvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGE0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL25pbmZvZC9uaW5mb2QuaApAQCAtMCwwICsxLDEzNiBAQAorLyogJFVTQUdJOiBuaW5mb2QuaCx2IDEuMjAgMjAwMi0xMi0xOSAxNTo1MToxNiB5b3NoZnVqaSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBVU0FHSS9XSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisvKgorICogQXV0aG9yOgorICogCVlPU0hJRlVKSSBIaWRlYWtpIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKyAqLworCisvKiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBOSU5GT0QJCQkibmluZm9kIgorI2RlZmluZSBOSU5GT0RfUElERklMRQkJIi92YXIvcnVuL25pbmZvZC5waWQiCisKKyNkZWZpbmUJTUFYX0FOWUNBU1RfREVMQVlfVElNRQkxMDAwMDAwLjAJLyogMSBzZWMgKi8KKworI2RlZmluZSBNQVhfRE5TTEFCRUxfU0laRQk2MworI2RlZmluZSBNQVhfRE5TTkFNRV9TSVpFCTI1NQorI2RlZmluZSBNQVhfUVVFUllfU0laRQkJKHNpemVvZihzdHJ1Y3QgaWNtcDZfbm9kZWluZm8pK01BWF9ETlNOQU1FX1NJWkUrMikKKyNkZWZpbmUgTUFYX1JFUExZX1NJWkUJCTEyODAtc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKQorCisjZGVmaW5lIE1BWF9TVVBUWVBFUwkJMzIKKworI2RlZmluZSBDSEVDS0FOREZJTExfQVJHUwlzdHJ1Y3QgcGFja2V0Y29udGV4dCAqcCxcCisJCQkJY2hhciAqc3ViamVjdCwgc2l6ZV90IHN1YmpsZW4sCVwKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsCQlcCisJCQkJdW5zaWduZWQgaW50ICpzdWJqX2lmLAkJXAorCQkJCWludCByZXBseQorI2RlZmluZSBJTklUX0FSR1MJCVwKKwkJCQlpbnQgZm9yY2VkCisKK3N0cnVjdCBwYWNrZXRjb250ZXh0IHsKKwkvKiBzb2NrZXQgKi8KKwlpbnQgc29jazsKKworCS8qIHF1ZXJ5IGluZm8gKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworCXNvY2tsZW5fdCBhZGRybGVuOworCXN0cnVjdCBpbjZfcGt0aW5mbyBwa3RpbmZvOworCWNoYXIgcXVlcnlbTUFYX1FVRVJZX1NJWkVdOworCWludCBxdWVyeWxlbjsKKworCS8qIHJlcGx5IGluZm8gKi8KKwlzdHJ1Y3QgaWNtcDZfbm9kZWluZm8gcmVwbHk7CS8qIGNvbW1vbiAqLworCWNoYXIgKnJlcGx5ZGF0YTsJCS8qIGRhdGEgKi8KKwlpbnQgcmVwbHlkYXRhbGVuOworCisJdW5zaWduZWQgaW50IGRlbGF5OwkJLyogKHJhbmRvbSkgZGVsYXkgKi8KK307CisKKy8qIHZhcmlhYmxlcyAqLworZXh0ZXJuIGludCBvcHRfdjsJCS8qIG5pbmZvZC5jICovCitleHRlcm4gaW50IGRhZW1vbml6ZWQ7CQkvKiBuaW5mb2QuYyAqLworZXh0ZXJuIGludCBzb2NrOwkJLyogbmluZm9kLmMgKi8KK2V4dGVybiBpbnQgaW5pdGlhbGl6ZWQ7CQkvKiBuaW5mb2RfY29yZS5jICovCisKKy8qIG5pbmZvZC5jKiAqLworaW50IG5pX3JlY3Yoc3RydWN0IHBhY2tldGNvbnRleHQgKnApOworaW50IG5pX3NlbmQoc3RydWN0IHBhY2tldGNvbnRleHQgKnApOworCisvKiBuaW5mb2RfY29yZS5jICovCisjaWYgRU5BQkxFX0RFQlVHCit2b2lkIHN0ZGVycmxvZyhpbnQgcHJpb3JpdHksIGNoYXIgKmZvcm1hdCwgLi4uKTsKKyMgZGVmaW5lIERFQlVHKHByaSwgZm10LCBhcmdzLi4uKQlkbyB7CQkJCQkJCQkJXAorCQkJCQkJaW50IHNhdmVkX2Vycm5vID0gZXJybm87CQkJCQlcCisJCQkJCQlpZiAob3B0X3YgfHwgcHJpICE9IExPR19ERUJVRykgewkJCQlcCisJCQkJCQkJaWYgKGRhZW1vbml6ZWQpIHsJCQkJCVwKKwkJCQkJCQkJc3lzbG9nKHByaSwgZm10LCAjIyBhcmdzKTsJCQlcCisJCQkJCQkJfSBlbHNlIHsJCQkJCQlcCisJCQkJCQkJCXN0ZGVycmxvZyhwcmksIGZtdCwgIyMgYXJncyk7CQkJXAorCQkJCQkJCX0JCQkJCQkJXAorCQkJCQkJfQkJCQkJCQkJXAorCQkJCQkJZXJybm8gPSBzYXZlZF9lcnJubzsJCQkJCQlcCisJCQkJCX0gd2hpbGUoMCkKKyNlbHNlCisjIGRlZmluZSBERUJVRyhwcmksIGZtdCwgYXJncy4uLikJZG8geyA7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIG5pX21hbGxvYyhzaXplKQkoewkJCQkJCQkJCQlcCisJCQkJc2l6ZV90IF9zaXplID0gKHNpemUpOwkJCQkJCQlcCisJCQkJdm9pZCAqcCA9IG1hbGxvYyhfc2l6ZSk7CQkJCQkJXAorCQkJCURFQlVHKExPR19ERUJVRywgIiVzKCk6IG1hbGxvYyglenUpID0gJXBcbiIsIF9fZnVuY19fLCBfc2l6ZSwgcCk7CVwKKwkJCQlwOwkJCQkJCQkJCVwKKwkJCX0pCisjZGVmaW5lIG5pX2ZyZWUocCkJKHsJCQkJCQkJCQkJXAorCQkJCXZvaWQgKl9wID0gKHApOwkJCQkJCQkJXAorCQkJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOwkJCQkJCVwKKwkJCQlERUJVRyhMT0dfREVCVUcsICIlcygpOiBmcmVlKCVwKVxuIiwgX19mdW5jX18sIF9wKTsJCQlcCisJCQkJZnJlZShfcCk7CQkJCQkJCQlcCisJCQkJZXJybm8gPSBzYXZlZF9lcnJubzsJCQkJCQkJXAorCQkJfSkKKwordm9pZCBpbml0X2NvcmUoaW50IGZvcmNlZCk7CitpbnQgcHJfbm9kZWluZm8oc3RydWN0IHBhY2tldGNvbnRleHQgKnApOworCitpbnQgcHJfbm9kZWluZm9fdW5rbm93bihDSEVDS0FOREZJTExfQVJHUyk7CitpbnQgcHJfbm9kZWluZm9fcmVmdXNlZChDSEVDS0FOREZJTExfQVJHUyk7CitpbnQgcHJfbm9kZWluZm9fbm9vcChDSEVDS0FOREZJTExfQVJHUyk7Cit2b2lkIGluaXRfbm9kZWluZm9fc3VwdHlwZXMoSU5JVF9BUkdTKTsKK2ludCBwcl9ub2RlaW5mb19zdXB0eXBlcyhDSEVDS0FOREZJTExfQVJHUyk7CisKKy8qIG5pbmZvZF9hZGRycy5jICovCit2b2lkIGluaXRfbm9kZWluZm9faXB2NmFkZHIoSU5JVF9BUkdTKTsKK2ludCBwcl9ub2RlaW5mb19pcHY2YWRkcihDSEVDS0FOREZJTExfQVJHUyk7Cit2b2lkIGluaXRfbm9kZWluZm9faXB2NGFkZHIoSU5JVF9BUkdTKTsKK2ludCBwcl9ub2RlaW5mb19pcHY0YWRkcihDSEVDS0FOREZJTExfQVJHUyk7CisKKy8qIG5pbmZvZF9uYW1lLmMgKi8KK2ludCBjaGVja19uaWdyb3VwKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcik7Cit2b2lkIGluaXRfbm9kZWluZm9fbm9kZW5hbWUoSU5JVF9BUkdTKTsKK2ludCBwcl9ub2RlaW5mb19ub2RlbmFtZShDSEVDS0FOREZJTExfQVJHUyk7CisKZGlmZiAtLWdpdCBhL2lwdXRpbHMvbmluZm9kL25pbmZvZC5zaC5pbiBiL2lwdXRpbHMvbmluZm9kL25pbmZvZC5zaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzVlNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9uaW5mb2QvbmluZm9kLnNoLmluCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorCitOSU5GT0Q9QHByZWZpeEAvc2Jpbi9uaW5mb2QKK1BJRD0vdmFyL3J1bi9uaW5mb2QucGlkCisKK2lmICEgWyAteCAkTklORk9EIF07IHRoZW4KKwlleGl0IDAKK2ZpCisKK2Nhc2UgIiQxIiBpbgorICAgIHN0YXJ0KQorCWVjaG8gLW4gIlN0YXJ0aW5nIG5vZGUgaW5mb21hdGlvbiBkYWVtb246IgorCWVjaG8gLW4gIiBuaW5mb2QiIDsgCisJJE5JTkZPRCAKKwllY2hvICIuIgorCTs7CisgICAgc3RvcCkKKwllY2hvIC1uICJTdG9wcGluZyBub2RlIGluZm9tYXRpb24gZGFlbW9uOiIKKwllY2hvIC1uICIgbmluZm9kIiA7IAorCWtpbGwgYGNhdCAkUElEYAorCWVjaG8gIi4iCisJOzsKKyAgICByZXN0YXJ0KQorCWVjaG8gLW4gIlJlc3RhcnRpbmcgbm9kZSBpbmZvcm1hdGlvbiBkYWVtb246IgorCWVjaG8gLW4gIiBuaW5mb2QiCisJa2lsbCBgY2F0ICRQSURgCisJJE5JTkZPRAorCWVjaG8gIi4iCisJOzsKKyAgICAqKQorCWVjaG8gIlVzYWdlOiAvZXRjL2luaXQuZC9uaW5mb2Qge3N0YXJ0fHN0b3B8cmVzdGFydH0iCisJZXhpdCAxCisJOzsKK2VzYWMKKworZXhpdCAwCisKZGlmZiAtLWdpdCBhL2lwdXRpbHMvbmluZm9kL25pbmZvZF9hZGRycy5jIGIvaXB1dGlscy9uaW5mb2QvbmluZm9kX2FkZHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4MTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvbmluZm9kL25pbmZvZF9hZGRycy5jCkBAIC0wLDAgKzEsNDY5IEBACisvKiAkVVNBR0k6IG5pbmZvZF9hZGRycy5jLHYgMS4xOCAyMDAzLTA3LTE2IDA5OjQ5OjAxIHlvc2hmdWppIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFVTQUdJL1dJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKy8qCisgKiBBdXRob3I6CisgKiAJWU9TSElGVUpJIEhpZGVha2kgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorICovCisKKyNpZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIVNURENfSEVBREVSUyAmJiBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RESU5UX0gKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWYgVElNRV9XSVRIX1NZU19USU1FICAgCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAKKyMgaW5jbHVkZSA8dGltZS5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TWVNfVElNRV9IICAgICAKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGVsc2UgICAgICAgICAgICAgICAgCisjICBpbmNsdWRlIDx0aW1lLmg+CisjIGVuZGlmICAgICAgICAgICAgICAgICAgCisjZW5kaWYgICAgICAgICAgICAgICAgICAgCisKKyNpZiBIQVZFX1NZU19VSU9fSAorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2lmIEhBVkVfTElOVVhfUlRORVRMSU5LX0gKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9ORVRJTkVUX0lOX0gKKyMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisKKyNpZiBIQVZFX05FVElORVRfSVA2X0gKKyMgaW5jbHVkZSA8bmV0aW5ldC9pcDYuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9ORVRJTkVUX0lDTVA2X0gKKyMgaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorI2VuZGlmCisjaWZuZGVmIEhBVkVfU1RSVUNUX0lDTVA2X05PREVJTkZPCisjIGluY2x1ZGUgImljbXA2X25vZGVpbmZvLmgiCisjZW5kaWYKKworI2lmIEhBVkVfTkVUREJfSAorIyBpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmIEhBVkVfU1lTTE9HX0gKKyMgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm5pbmZvZC5oIgorI2luY2x1ZGUgIm5pX2lmYWRkcnMuaCIKKworI2lmbmRlZiBvZmZzZXRvZgorIyBkZWZpbmUgb2Zmc2V0b2YoYWdncmVnYXRlLG1lbWJlcikJKChzaXplX3QpJigoYWdncmVnYXRlICopMCktPm1lbWJlcikKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tICovCisvKiBJRCAqLworc3RhdGljIGNoYXIgKlJDU0lEIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSA9ICIkVVNBR0k6IG5pbmZvZF9hZGRycy5jLHYgMS4xOCAyMDAzLTA3LTE2IDA5OjQ5OjAxIHlvc2hmdWppIEV4cCAkIjsKKworLyogLS0tLS0tLS0tLSAqLworLyogaXB2NiBhZGRyZXNzICovCit2b2lkIGluaXRfbm9kZWluZm9faXB2NmFkZHIoSU5JVF9BUkdTKQoreworCURFQlVHKExPR19ERUJVRywgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm47Cit9CisKK2ludCBmaWx0ZXJfaXB2NmFkZHIoY29uc3Qgc3RydWN0IGluNl9hZGRyICppZmFkZHIsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoaWZhZGRyKSB8fAorCSAgICBJTjZfSVNfQUREUl9MT09QQkFDSyhpZmFkZHIpKSB7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoSU42X0lTX0FERFJfVjRDT01QQVQoaWZhZGRyKSB8fAorCQkgICBJTjZfSVNfQUREUl9WNE1BUFBFRChpZmFkZHIpKSB7CisJCXJldHVybiAhKGZsYWdzICYgTklfTk9ERUFERFJfRkxBR19DT01QQVQpOworCX0gZWxzZSBpZiAoSU42X0lTX0FERFJfTElOS0xPQ0FMKGlmYWRkcikpIHsKKwkJcmV0dXJuICEoZmxhZ3MgJiBOSV9OT0RFQUREUl9GTEFHX0xJTktMT0NBTCk7CisJfSBlbHNlIGlmIChJTjZfSVNfQUREUl9TSVRFTE9DQUwoaWZhZGRyKSkgeworCQlyZXR1cm4gIShmbGFncyAmIE5JX05PREVBRERSX0ZMQUdfU0lURUxPQ0FMKTsKKwl9CisJcmV0dXJuICEoZmxhZ3MgJiBOSV9OT0RFQUREUl9GTEFHX0dMT0JBTCk7Cit9CisKK2ludCBwcl9ub2RlaW5mb19pcHY2YWRkcihDSEVDS0FOREZJTExfQVJHUykKK3sKKwlzdHJ1Y3QgbmlfaWZhZGRycyAqaWZhMDsKKwl1bnNpZ25lZCBpbnQgaWZpbmRleCA9IDA7CisKKwlERUJVRyhMT0dfREVCVUcsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoc3ViamVjdCAmJiBzdWJqbGVuICE9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7CisJCURFQlVHKExPR19JTkZPLAorCQkgICAgICAiJXMoKTogaW52YWxpZCBzdWJqZWN0IGxlbmd0aCAlenUgZm9yIElQdjYgQWRkcmVzcyBTdWJqZWN0XG4iLAorCQkgICAgICBfX2Z1bmNfXywgc3Viamxlbik7CisJCXJldHVybiAxOworCX0KKwlpZiAobmlfaWZhZGRycygmaWZhMCwgQUZfSU5FVDYpKQorCQlyZXR1cm4gLTE7CS8qIGZhaWxlZCB0byBnZXQgYWRkcmVzc2VzICovCisKKwkvKiBwYXNzIDA6IGNvbnNpZGVyIHN1YmplY3QgYW5kIGRldGVybWluZSBzdWJqZWN0ZWQgaW50ZXJmYWNlICovCisJaWYgKHN1YmplY3QpIHsKKwkJc3RydWN0IG5pX2lmYWRkcnMgKmlmYTsKKworCQlmb3IgKGlmYSA9IGlmYTA7IGlmYTsgaWZhID0gaWZhLT5pZmFfbmV4dCkgeworCQkJaWYgKCFpZmEtPmlmYV9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGlmYS0+aWZhX2ZsYWdzICYgKElGQV9GX1RFTlRBVElWRXxJRkFfRl9TRUNPTkRBUlkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpZmluZGV4ICYmIAorCQkJICAgIElONl9BUkVfQUREUl9FUVVBTCgmcC0+cGt0aW5mby5pcGk2X2FkZHIsCisJCQkJCSAgICAgICAoc3RydWN0IGluNl9hZGRyICopc3ViamVjdCkpIHsKKwkJCQkvKgorCQkJCSAqIGlmIHN1YmplY3QgaXMgZXF1YWwgdG8gZGVzdGluYXRpb24KKwkJCQkgKiBhZGRyZXNzLCByZWNlaXZpbmcgaW50ZXJmYWNlIGlzCisJCQkJICogdGhlIGNhbmRpZGF0ZSBzdWJqZWN0IGludGVyZmFjZS4KKwkJCQkgKi8KKwkJCQlpZmluZGV4ID0gcC0+cGt0aW5mby5pcGk2X2lmaW5kZXg7CisJCQl9CisJCQlpZiAoIUlONl9JU19BRERSX0xPT1BCQUNLKChzdHJ1Y3QgaW42X2FkZHIgKilzdWJqZWN0KSAmJgorCQkJICAgIElONl9BUkVfQUREUl9FUVVBTCgoc3RydWN0IGluNl9hZGRyICopaWZhLT5pZmFfYWRkciwKKwkJCQkJICAgICAgIChzdHJ1Y3QgaW42X2FkZHIgKilzdWJqZWN0KSkgeworCQkJCS8qCisJCQkJICogYWRkcmVzcyBpcyBhc3NpZ25lZCBvbiBzb21lIGludGVyZmFjZS4KKwkJCQkgKiBpZiBtdWx0aXBsZSBpbnRlcmZhY2VzIGhhdmUgdGhlIHNhbWUgaW50ZXJmYWNlLAorCQkJCSAqICAxKSBwcmVmZXIgcmVjZWl2aW5nIGludGVyZmFjZQorCQkJCSAqICAyKSB1c2UgZmlyc3QgZm91bmQgb25lCisJCQkJICovCisJCQkJaWYgKCFpZmluZGV4IHx8CisJCQkJICAgIChwLT5wa3RpbmZvLmlwaTZfaWZpbmRleCA9PSBpZmluZGV4KSkKKwkJCQkJaWZpbmRleCA9IGlmYS0+aWZhX2lmaW5kZXg7CisJCQl9CisJCX0KKwkJaWYgKCFpZmluZGV4KSB7CisJCQluaV9mcmVlaWZhZGRycyhpZmEwKTsKKwkJCXJldHVybiAxOwkvKiBzdWJqZWN0IG5vdCBmb3VuZCAqLworCQl9CisJCWlmIChzdWJqX2lmKQorCQkJKnN1YmpfaWYgPSBpZmluZGV4OworCX0gZWxzZSB7CisJCWlmaW5kZXggPSBzdWJqX2lmID8gKnN1YmpfaWYgOiAwOworCQlpZiAoaWZpbmRleCA9PSAwKQorCQkJaWZpbmRleCA9IHAtPnBrdGluZm8uaXBpNl9pZmluZGV4OworCQlpZiAoaWZpbmRleCA9PSAwKSB7CisJCQluaV9mcmVlaWZhZGRycyhpZmEwKTsKKwkJCXJldHVybiAxOwkvKiBYWFggKi8KKwkJfQorCX0KKworCWlmIChyZXBseSkgeworCQlzdHJ1Y3QgbmlfaWZhZGRycyAqaWZhOworCQl1bnNpZ25lZCBpbnQgYWRkcnMwID0gMCwgcGFkZHJzMCA9IDA7CisJCXVuc2lnbmVkIGludCBhZGRycywgcGFkZHJzID0gMCwgZGFkZHJzID0gMDsKKworCQlmbGFncyAmPSB+TklfTk9ERUFERFJfRkxBR19UUlVOQ0FURTsJCisJCisJCS8qIHBhc3MgMTogY291bnQgYWRkcmVzc2VzIGFuZCBwcmVmZXJyZWQgYWRkcmVzc2VzIHRvIGJlIHJldHVybmVkICovCisJCWZvciAoaWZhID0gaWZhMDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisJCQlpZiAoIWlmYS0+aWZhX2FkZHIpCisJCQkJY29udGludWU7CisJCQlpZiAoaWZhLT5pZmFfZmxhZ3MgJiAoSUZBX0ZfVEVOVEFUSVZFfElGQV9GX1NFQ09OREFSWSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIShmbGFncyAmIE5JX05PREVBRERSX0ZMQUdfQUxMKSAmJgorCQkJICAgIGlmYS0+aWZhX2lmaW5kZXggIT0gaWZpbmRleCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChmaWx0ZXJfaXB2NmFkZHIoKHN0cnVjdCBpbjZfYWRkciAqKWlmYS0+aWZhX2FkZHIsIGZsYWdzKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGFkZHJzMCArIDEgPj0gKChNQVhfUkVQTFlfU0laRSAtIHNpemVvZihzdHJ1Y3QgaWNtcDZfbm9kZWluZm8pKSAvIChzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKSkgeworCQkJCWZsYWdzIHw9IH5OSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlhZGRyczArKzsKKwkJCWlmICghKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfREVQUkVDQVRFRCkpCisJCQkJcGFkZHJzMCsrOworCQl9CisJCQorCQlwLT5yZXBseS5uaV90eXBlID0gSUNNUDZfTklfUkVQTFk7CisJCXAtPnJlcGx5Lm5pX2NvZGUgPSBJQ01QNl9OSV9TVUNDRVNTOworCQlwLT5yZXBseS5uaV9ja3N1bSA9IDA7CisJCXAtPnJlcGx5Lm5pX3F0eXBlID0gaHRvbnMoTklfUVRZUEVfTk9ERUFERFIpOworCQlwLT5yZXBseS5uaV9mbGFncyA9IGZsYWdzJihOSV9OT0RFQUREUl9GTEFHX0NPTVBBVHwKKwkJCQkJICAgTklfTk9ERUFERFJfRkxBR19MSU5LTE9DQUx8CisJCQkJCSAgIE5JX05PREVBRERSX0ZMQUdfU0lURUxPQ0FMfAorCQkJCQkgICBOSV9OT0RFQUREUl9GTEFHX0dMT0JBTCk7CisKKwkJLyogcGFzcyAyOiBzdG9yZSBhZGRyZXNzZXMgKi8KKwkJcC0+cmVwbHlkYXRhbGVuID0gKHNpemVvZih1aW50MzJfdCkrc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpICogYWRkcnMwOworCQlwLT5yZXBseWRhdGEgPSBwLT5yZXBseWRhdGFsZW4gPyBuaV9tYWxsb2MocC0+cmVwbHlkYXRhbGVuKSA6IE5VTEw7CisKKwkJaWYgKHAtPnJlcGx5ZGF0YWxlbiAmJiAhcC0+cmVwbHlkYXRhKSB7CisJCQlwLT5yZXBseS5uaV9mbGFncyB8PSBOSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFOworCQkJYWRkcnMwID0gcGFkZHJzMCA9IDA7CisJCX0KKworCQlmb3IgKGlmYSA9IGlmYTAsIGFkZHJzID0gMDsgCisJCSAgICAgaWZhICYmIGFkZHJzIDwgYWRkcnMwOyAKKwkJICAgICBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisJCQljaGFyICpjcDsKKwkJCXVpbnQzMl90IHR0bDsKKworCQkJaWYgKCFpZmEtPmlmYV9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGlmYS0+aWZhX2ZsYWdzICYgKElGQV9GX1RFTlRBVElWRXxJRkFfRl9TRUNPTkRBUlkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEoZmxhZ3MgJiBOSV9OT0RFQUREUl9GTEFHX0FMTCkgJiYKKwkJCSAgICAoKHN1YmpfaWYgJiYgKnN1YmpfaWYpID8gKGlmYS0+aWZhX2lmaW5kZXggIT0gKnN1YmpfaWYpIDoKKwkJCQkJCSAgICAgKGlmYS0+aWZhX2lmaW5kZXggIT0gcC0+cGt0aW5mby5pcGk2X2lmaW5kZXgpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChmaWx0ZXJfaXB2NmFkZHIoKHN0cnVjdCBpbjZfYWRkciAqKWlmYS0+aWZhX2FkZHIsIGZsYWdzKSkKKwkJCQljb250aW51ZTsKKworI2lmIEVOQUJMRV9UVEwKKwkJCWlmIChpZmEtPmlmYV9jYWNoZWluZm8pIHsKKwkJCQl0dGwgPSBpZmEtPmlmYV9jYWNoZWluZm8tPmlmYV92YWxpZCA+IDB4N2ZmZmZmZmYgPyAKKwkJCQkgICAgICBodG9ubCgweDdmZmZmZmZmKSA6IGh0b25sKGlmYS0+aWZhX2NhY2hlaW5mby0+aWZhX3ZhbGlkKTsKKwkJCX0gZWxzZSB7CisJCQkJdHRsID0gKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfUEVSTUFORU5UKSA/IGh0b25sKDB4N2ZmZmZmZmYpIDogMDsKKwkJCX0KKyNlbHNlCisJCQl0dGwgPSAwOworI2VuZGlmCisKKwkJCWNwID0gcC0+cmVwbHlkYXRhICsKKwkJCSAgICAgKHNpemVvZih1aW50MzJfdCkrc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpICogKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfREVQUkVDQVRFRCA/IHBhZGRyczArZGFkZHJzIDogcGFkZHJzKTsKKwkJCW1lbWNweShjcCwgJnR0bCwgc2l6ZW9mKHR0bCkpOworCQkJbWVtY3B5KGNwICsgc2l6ZW9mKHR0bCksIGlmYS0+aWZhX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKworCQkJYWRkcnMrKzsKKwkJCWlmIChpZmEtPmlmYV9mbGFncyAmIElGQV9GX0RFUFJFQ0FURUQpCisJCQkJZGFkZHJzKys7CisJCQllbHNlCisJCQkJcGFkZHJzKys7CisJCX0KKwl9CisKKwluaV9mcmVlaWZhZGRycyhpZmEwKTsKKwlyZXR1cm4gMDsKK30KKworLyogaXB2NCBhZGRyZXNzICovCit2b2lkIGluaXRfbm9kZWluZm9faXB2NGFkZHIoSU5JVF9BUkdTKQoreworCURFQlVHKExPR19ERUJVRywgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm47Cit9CisKK2ludCBmaWx0ZXJfaXB2NGFkZHIoY29uc3Qgc3RydWN0IGluX2FkZHIgKmlmYWRkciwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiAwOworfQorCitpbnQgcHJfbm9kZWluZm9faXB2NGFkZHIoQ0hFQ0tBTkRGSUxMX0FSR1MpCit7CisJc3RydWN0IG5pX2lmYWRkcnMgKmlmYTA7CisJdW5zaWduZWQgaW50IGlmaW5kZXggPSAwOworCisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKHN1YmplY3QgJiYgc3ViamxlbiAhPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisJCURFQlVHKExPR19JTkZPLAorCQkgICAgICAiJXMoKTogaW52YWxpZCBzdWJqZWN0IGxlbmd0aCAlenUgZm9yIElQdjQgQWRkcmVzcyBTdWJqZWN0XG4iLAorCQkgICAgICBfX2Z1bmNfXywgc3Viamxlbik7CisJCXJldHVybiAxOworCX0KKwlpZiAobmlfaWZhZGRycygmaWZhMCwgQUZfSU5FVCkpCisJCXJldHVybiAtMTsJLyogZmFpbGVkIHRvIGdldCBhZGRyZXNzZXMgKi8KKworCS8qIHBhc3MgMDogY29uc2lkZXIgc3ViamVjdCBhbmQgZGV0ZXJtaW5lIHN1YmplY3RlZCBpbnRlcmZhY2UgKi8KKwlpZiAoc3ViamVjdCkgeworCQlzdHJ1Y3QgbmlfaWZhZGRycyAqaWZhOworCisJCWZvciAoaWZhID0gaWZhMDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisJCQlpZiAoIWlmYS0+aWZhX2FkZHIpCisJCQkJY29udGludWU7CisJCQlpZiAoaWZhLT5pZmFfZmxhZ3MgJiAoSUZBX0ZfVEVOVEFUSVZFfElGQV9GX1NFQ09OREFSWSkpCisJCQkJY29udGludWU7CisJCQlpZiAoKCgoc3RydWN0IGluX2FkZHIgKilzdWJqZWN0KS0+c19hZGRyICE9IGh0b25sKElOQUREUl9MT09QQkFDSykpICYmCisJCQkgICAgbWVtY21wKChzdHJ1Y3QgaW5fYWRkciAqKWlmYS0+aWZhX2FkZHIsCisJCQkJICAgKHN0cnVjdCBpbl9hZGRyICopc3ViamVjdCwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBhZGRyZXNzIGlzIGFzc2lnbmVkIG9uIHNvbWUgaW50ZXJmYWNlLgorCQkJCSAqIGlmIG11bHRpcGxlIGludGVyZmFjZXMgaGF2ZSB0aGUgc2FtZSBpbnRlcmZhY2UsCisJCQkJICogIDEpIHByZWZlciByZWNlaXZpbmcgaW50ZXJmYWNlCisJCQkJICogIDIpIHVzZSBmaXJzdCBmb3VuZCBvbmUKKwkJCQkgKi8KKwkJCQlpZiAoIWlmaW5kZXggfHwKKwkJCQkgICAgKHAtPnBrdGluZm8uaXBpNl9pZmluZGV4ID09IGlmaW5kZXgpKQorCQkJCQlpZmluZGV4ID0gaWZhLT5pZmFfaWZpbmRleDsKKwkJCX0KKwkJfQorCQlpZiAoIWlmaW5kZXgpIHsKKwkJCW5pX2ZyZWVpZmFkZHJzKGlmYTApOworCQkJcmV0dXJuIDE7CS8qIHN1YmplY3Qgbm90IGZvdW5kICovCisJCX0KKwkJaWYgKHN1YmpfaWYpCisJCQkqc3Vial9pZiA9IGlmaW5kZXg7CisJfSBlbHNlIHsKKwkJaWZpbmRleCA9IHN1YmpfaWYgPyAqc3Vial9pZiA6IDA7CisJCWlmIChpZmluZGV4ID09IDApCisJCQlpZmluZGV4ID0gcC0+cGt0aW5mby5pcGk2X2lmaW5kZXg7CisJCWlmIChpZmluZGV4ID09IDApIHsKKwkJCW5pX2ZyZWVpZmFkZHJzKGlmYTApOworCQkJcmV0dXJuIDE7CS8qIFhYWCAqLworCQl9CisJfQorCisJaWYgKHJlcGx5KSB7CisJCXN0cnVjdCBuaV9pZmFkZHJzICppZmE7CisJCXVuc2lnbmVkIGludCBhZGRyczAgPSAwLCBwYWRkcnMwID0gMDsKKwkJdW5zaWduZWQgaW50IGFkZHJzLCBwYWRkcnMgPSAwLCBkYWRkcnMgPSAwOworCisJCWZsYWdzICY9IH5OSV9JUFY0QUREUl9GTEFHX1RSVU5DQVRFOworCisJCS8qIHBhc3MgMTogY291bnQgYWRkcmVzc2VzIGFuZCBwcmVmZXJyZWQgYWRkcmVzc2VzIHRvIGJlIHJldHVybmVkICovCisJCWZvciAoaWZhID0gaWZhMDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisJCQlpZiAoIWlmYS0+aWZhX2FkZHIpCisJCQkJY29udGludWU7CisjaWYgMQkvKiBub3QgdXNlZCBpbiBrZXJuZWwgKi8KKwkJCWlmIChpZmEtPmlmYV9mbGFncyAmIChJRkFfRl9URU5UQVRJVkUpKQorCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQlpZiAoIShmbGFncyAmIE5JX05PREVBRERSX0ZMQUdfQUxMKSAmJgorCQkJICAgICgoc3Vial9pZiAmJiAqc3Vial9pZikgPyAoaWZhLT5pZmFfaWZpbmRleCAhPSAqc3Vial9pZikgOgorCQkJCQkJICAgICAoaWZhLT5pZmFfaWZpbmRleCAhPSBwLT5wa3RpbmZvLmlwaTZfaWZpbmRleCkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZpbHRlcl9pcHY0YWRkcigoc3RydWN0IGluX2FkZHIgKilpZmEtPmlmYV9hZGRyLCBmbGFncykpCisJCQkJY29udGludWU7CisKKwkJCWlmIChhZGRyczAgKyAxID49ICgoTUFYX1JFUExZX1NJWkUgLSBzaXplb2Yoc3RydWN0IGljbXA2X25vZGVpbmZvKSkgLyAoc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKSkgeworCQkJCWZsYWdzIHw9IE5JX0lQVjRBRERSX0ZMQUdfVFJVTkNBVEU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWFkZHJzMCsrOworCQkJaWYgKCEoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9ERVBSRUNBVEVEKSkKKwkJCQlwYWRkcnMwKys7CisJCX0KKworCQlwLT5yZXBseS5uaV90eXBlID0gSUNNUDZfTklfUkVQTFk7CisJCXAtPnJlcGx5Lm5pX2NvZGUgPSBJQ01QNl9OSV9TVUNDRVNTOworCQlwLT5yZXBseS5uaV9ja3N1bSA9IDA7CisJCXAtPnJlcGx5Lm5pX3F0eXBlID0gaHRvbnMoTklfUVRZUEVfSVBWNEFERFIpOworCQlwLT5yZXBseS5uaV9mbGFncyA9IGZsYWdzICYgTklfSVBWNEFERFJfRkxBR19BTEw7CisKKwkJLyogcGFzcyAyOiBzdG9yZSBhZGRyZXNzZXMgKi8KKwkJcC0+cmVwbHlkYXRhbGVuID0gKHNpemVvZih1aW50MzJfdCkrc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgKiBhZGRyczA7CisJCXAtPnJlcGx5ZGF0YSA9IGFkZHJzMCA/IG5pX21hbGxvYyhwLT5yZXBseWRhdGFsZW4pIDogTlVMTDsKKworCQlpZiAocC0+cmVwbHlkYXRhbGVuICYmICFwLT5yZXBseWRhdGEpIHsKKwkJCXAtPnJlcGx5Lm5pX2ZsYWdzIHw9IE5JX05PREVBRERSX0ZMQUdfVFJVTkNBVEU7CisJCQlhZGRyczAgPSBwYWRkcnMwID0gMDsKKwkJfQorCisJCWZvciAoaWZhID0gaWZhMCwgYWRkcnMgPSAwOyAKKwkJICAgICBpZmEgJiYgYWRkcnMgPCBhZGRyczA7IAorCQkgICAgIGlmYSA9IGlmYS0+aWZhX25leHQpIHsKKwkJCWNoYXIgKmNwOworCQkJdWludDMyX3QgdHRsOworCisJCQlpZiAoIWlmYS0+aWZhX2FkZHIpCisJCQkJY29udGludWU7CisjaWYgMQkvKiBub3QgdXNlZCBpbiBrZXJuZWwgKi8KKwkJCWlmIChpZmEtPmlmYV9mbGFncyAmIChJRkFfRl9URU5UQVRJVkUpKQorCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQlpZiAoIShmbGFncyAmIE5JX05PREVBRERSX0ZMQUdfQUxMKSAmJgorCQkJICAgIChpZmEtPmlmYV9pZmluZGV4ICE9IGlmaW5kZXgpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZpbHRlcl9pcHY0YWRkcigoc3RydWN0IGluX2FkZHIgKilpZmEtPmlmYV9hZGRyLCBmbGFncykpCisJCQkJY29udGludWU7CQorCisjaWYgRU5BQkxFX1RUTAorCQkJaWYgKGlmYS0+aWZhX2NhY2hlaW5mbykgeworCQkJCXR0bCA9IGlmYS0+aWZhX2NhY2hlaW5mby0+aWZhX3ZhbGlkID4gMHg3ZmZmZmZmZiA/IAorCQkJCSAgICAgIGh0b25sKDB4N2ZmZmZmZmYpIDogaHRvbmwoaWZhLT5pZmFfY2FjaGVpbmZvLT5pZmFfdmFsaWQpOworCQkJfSBlbHNlIHsKKwkJCQl0dGwgPSAwOwkvKlhYWCovCisJCQl9CisjZWxzZQorCQkJdHRsID0gMDsKKyNlbmRpZgorCisJCQljcCA9IChwLT5yZXBseWRhdGEgKworCQkJICAgICAgKHNpemVvZih1aW50MzJfdCkrc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgKiAoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9ERVBSRUNBVEVEID8gcGFkZHJzMCtkYWRkcnMgOiBwYWRkcnMpKTsKKwkJCW1lbWNweShjcCwgJnR0bCwgc2l6ZW9mKHR0bCkpOworCQkJbWVtY3B5KGNwICsgc2l6ZW9mKHR0bCksIGlmYS0+aWZhX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCisJCQlhZGRycysrOworCQkJaWYgKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfREVQUkVDQVRFRCkKKwkJCQlkYWRkcnMrKzsKKwkJCWVsc2UKKwkJCQlwYWRkcnMrKzsKKwkJfQorCX0KKworCW5pX2ZyZWVpZmFkZHJzKGlmYTApOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9pcHV0aWxzL25pbmZvZC9uaW5mb2RfY29yZS5jIGIvaXB1dGlscy9uaW5mb2QvbmluZm9kX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODlmNWMwCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9uaW5mb2QvbmluZm9kX2NvcmUuYwpAQCAtMCwwICsxLDY5OCBAQAorLyogJFVTQUdJOiBuaW5mb2RfY29yZS5jLHYgMS4yOSAyMDAzLTA3LTE2IDA5OjQ5OjAxIHlvc2hmdWppIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFVTQUdJL1dJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKy8qCisgKiBBdXRob3I6CisgKiAJWU9TSElGVUpJIEhpZGVha2kgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorICovCisKKyNpZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZiBFTkFCTEVfVEhSRUFEUyAmJiBIQVZFX1BUSFJFQURfSAorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR19ICisjIGlmICFTVERDX0hFQURFUlMgJiYgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURElOVF9ICisjICBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmIFRJTUVfV0lUSF9TWVNfVElNRSAgIAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1lTX1RJTUVfSCAgICAgCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyBlbHNlICAgICAgICAgICAgICAgIAorIyAgaW5jbHVkZSA8dGltZS5oPgorIyBlbmRpZiAgICAgICAgICAgICAgICAgIAorI2VuZGlmICAgICAgICAgICAgICAgICAgIAorCisjaWYgSEFWRV9TWVNfVUlPX0gKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZW5kaWYKKworI2lmIEhBVkVfTkVUSU5FVF9JTl9ICisjIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaWYgSEFWRV9ORVRJTkVUX0lDTVA2X0gKKyMgaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorI2VuZGlmCisjaWZuZGVmIEhBVkVfU1RSVUNUX0lDTVA2X05PREVJTkZPCisjIGluY2x1ZGUgImljbXA2X25vZGVpbmZvLmgiCisjZW5kaWYKKworI2lmIEhBVkVfTkVUREJfSAorIyBpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmIEhBVkVfU1lTTE9HX0gKKyMgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm5pbmZvZC5oIgorCisjaWZuZGVmIG9mZnNldG9mCisjIGRlZmluZSBvZmZzZXRvZihhZ2dyZWdhdGUsbWVtYmVyKQkoKHNpemVfdCkmKChhZ2dyZWdhdGUgKikwKS0+bWVtYmVyKQorI2VuZGlmCisKKyNkZWZpbmUgQVJSQVlfU0laRShhKQkJKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKworLyogLS0tLS0tLS0tLSAqLworLyogSUQgKi8KK3N0YXRpYyBjaGFyICpSQ1NJRCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgPSAiJFVTQUdJOiBuaW5mb2RfY29yZS5jLHYgMS4yOSAyMDAzLTA3LTE2IDA5OjQ5OjAxIHlvc2hmdWppIEV4cCAkIjsKKworLyogVmFyaWFibGVzICovCitpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisjaWYgRU5BQkxFX1RIUkVBRFMgJiYgSEFWRV9MSUJQVEhSRUFECitwdGhyZWFkX2F0dHJfdCBwYXR0cjsKKyNlbmRpZgorCitzdGF0aWMgdWludDMyX3Qgc3VwdHlwZXNbKE1BWF9TVVBUWVBFUyszMSk+PjVdOworc3RhdGljIHNpemVfdCBzdXB0eXBlc19sZW47CisKKy8qIC0tLS0tLS0tLS0gKi8KK3N0cnVjdCBzdWJqaW5mbyB7CisJdWludDhfdAljb2RlOworCWNoYXIJKm5hbWU7CisJaW50CSgqY2hlY2tzdWJqKShDSEVDS0FOREZJTExfQVJHUyk7CisJaW50CSgqaW5pdCkoSU5JVF9BUkdTKTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3ViamluZm8gc3ViamluZm9fdGFibGUgW10gPSB7CisJW0lDTVA2X05JX1NVQkpfSVBWNl0gPSB7CisJCS5jb2RlID0gSUNNUDZfTklfU1VCSl9JUFY2LAorCQkubmFtZSA9ICJJUHY2IiwKKwkJLy8uaW5pdCA9IGluaXRfbm9kZWluZm9faXB2NmFkZHIsCisJCS5jaGVja3N1YmogPSBwcl9ub2RlaW5mb19pcHY2YWRkciwKKwl9LAorCVtJQ01QNl9OSV9TVUJKX0ZRRE5dID0geworCQkuY29kZSA9IElDTVA2X05JX1NVQkpfRlFETiwKKwkJLm5hbWUgPSAiRlFETiIsCisJCS8vLmluaXQgPSBpbml0X25vZGVpbmZvX25vZGVuYW1lLAorCQkuY2hlY2tzdWJqID0gcHJfbm9kZWluZm9fbm9kZW5hbWUsCisJfSwKKwlbSUNNUDZfTklfU1VCSl9JUFY0XSA9IHsKKwkJLmNvZGUgPSBJQ01QNl9OSV9TVUJKX0lQVjQsCisJCS5uYW1lID0gIklQdjQiLAorCQkvLy5pbml0ID0gaW5pdF9ub2RlaW5mb19pcHY0YWRkciwKKwkJLmNoZWNrc3ViaiA9IHByX25vZGVpbmZvX2lwdjRhZGRyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHN1YmppbmZvIHN1YmppbmZvX251bGwgPSB7CisJLm5hbWUgPSAibnVsbCIsCisJLmNoZWNrc3ViaiA9IHByX25vZGVpbmZvX25vb3AsCit9OworCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc3ViamluZm8gKnN1YmppbmZvX2xvb2t1cChpbnQgY29kZSkKK3sKKwlpZiAoY29kZSA+PSBBUlJBWV9TSVpFKHN1YmppbmZvX3RhYmxlKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN1YmppbmZvX3RhYmxlW2NvZGVdLm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZzdWJqaW5mb190YWJsZVtjb2RlXTsKK30KKworLyogLS0tLS0tLS0tLSAqLworI2RlZmluZSBRVFlQRUlORk9fRl9SQVRFTElNSVQJMHgxCisKK3N0cnVjdCBxdHlwZWluZm8geworCXVpbnQxNl90IHF0eXBlOworCWNoYXIJKm5hbWU7CisJaW50CSgqZ2V0cmVwbHkpKENIRUNLQU5ERklMTF9BUkdTKTsKKwl2b2lkCSgqaW5pdCkoSU5JVF9BUkdTKTsKKwlpbnQJZmxhZ3M7Cit9OworCitzdGF0aWMgc3RydWN0IHF0eXBlaW5mbyBxdHlwZWluZm9fdGFibGVbXSA9IHsKKwlbTklfUVRZUEVfTk9PUF0JCT0geworCQkucXR5cGUgPSBOSV9RVFlQRV9OT09QLAorCQkubmFtZSA9ICJOT09QIiwKKwkJLmdldHJlcGx5ID0gcHJfbm9kZWluZm9fbm9vcCwKKwl9LAorI2lmIEVOQUJMRV9TVVBUWVBFUworCVtOSV9RVFlQRV9TVVBUWVBFU10JPSB7CisJCS5xdHlwZSA9IE5JX1FUWVBFX1NVUFRZUEVTLAorCQkubmFtZSA9ICJTdXBUeXBlcyIsCisJCS5nZXRyZXBseSA9IHByX25vZGVpbmZvX3N1cHR5cGVzLAorCQkuaW5pdCA9IGluaXRfbm9kZWluZm9fc3VwdHlwZXMsCisJfSwKKyNlbmRpZgorCVtOSV9RVFlQRV9ETlNOQU1FXQk9IHsKKwkJLnF0eXBlID0gTklfUVRZUEVfRE5TTkFNRSwKKwkJLm5hbWUgPSAiRG5zTmFtZSIsCisJCS5nZXRyZXBseSA9IHByX25vZGVpbmZvX25vZGVuYW1lLAorCQkuaW5pdCA9IGluaXRfbm9kZWluZm9fbm9kZW5hbWUsCisJfSwKKwlbTklfUVRZUEVfTk9ERUFERFJdCT0geworCQkucXR5cGUgPSBOSV9RVFlQRV9OT0RFQUREUiwKKwkJLm5hbWUgPSAiTm9kZUFkZHIiLAorCQkuZ2V0cmVwbHkgPSBwcl9ub2RlaW5mb19pcHY2YWRkciwKKwkJLmluaXQgPSBpbml0X25vZGVpbmZvX2lwdjZhZGRyLAorCX0sCisJW05JX1FUWVBFX0lQVjRBRERSXQk9IHsKKwkJLnF0eXBlID0gTklfUVRZUEVfSVBWNEFERFIsCisJCS5uYW1lID0gIklQdjRBZGRyIiwKKwkJLmdldHJlcGx5ID0gcHJfbm9kZWluZm9faXB2NGFkZHIsCisJCS5pbml0ID0gaW5pdF9ub2RlaW5mb19pcHY0YWRkciwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBxdHlwZWluZm8gcXR5cGVpbmZvX3Vua25vd24gPSB7CisJLm5hbWUgPSAidW5rbm93biIsCisJLmdldHJlcGx5ID0gcHJfbm9kZWluZm9fdW5rbm93biwKKwkuZmxhZ3MgPSBRVFlQRUlORk9fRl9SQVRFTElNSVQsCit9OworCitzdGF0aWMgc3RydWN0IHF0eXBlaW5mbyBxdHlwZWluZm9fcmVmdXNlZCA9IHsKKwkubmFtZSA9ICJyZWZ1c2VkIiwKKwkuZ2V0cmVwbHkgPSBwcl9ub2RlaW5mb19yZWZ1c2VkLAorCS5mbGFncyA9IFFUWVBFSU5GT19GX1JBVEVMSU1JVCwKK307CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBxdHlwZWluZm8gKnF0eXBlaW5mb19sb29rdXAoaW50IHF0eXBlKQoreworCWlmIChxdHlwZSA+PSBBUlJBWV9TSVpFKHF0eXBlaW5mb190YWJsZSkpCisJCXJldHVybiAmcXR5cGVpbmZvX3Vua25vd247CisJaWYgKHF0eXBlaW5mb190YWJsZVtxdHlwZV0ubmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gJnF0eXBlaW5mb191bmtub3duOworCXJldHVybiAmcXR5cGVpbmZvX3RhYmxlW3F0eXBlXTsKK30KKworLyogLS0tLS0tLS0tLSAqLworLyogbm9vcCAqLworaW50IHByX25vZGVpbmZvX25vb3AoQ0hFQ0tBTkRGSUxMX0FSR1MpCit7CisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKHN1YmpsZW4pIHsKKwkJREVCVUcoTE9HX1dBUk5JTkcsCisJCSAgICAgICIlcygpOiBpbnZhbGlkIHN1YmplY3QgbGVuZ3RoKCV6dSlcbiIsCisJCSAgICAgIF9fZnVuY19fLCBzdWJqbGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJlcGx5KSB7CisJCXAtPnJlcGx5Lm5pX3R5cGUgPSBJQ01QNl9OSV9SRVBMWTsKKwkJcC0+cmVwbHkubmlfY29kZSA9IElDTVA2X05JX1NVQ0NFU1M7CisJCXAtPnJlcGx5Lm5pX2Nrc3VtID0gMDsKKwkJcC0+cmVwbHkubmlfcXR5cGUgPSBodG9ucyhOSV9RVFlQRV9OT09QKTsKKwkJcC0+cmVwbHkubmlfZmxhZ3MgPSBmbGFnczsKKwl9CisKKwlpZiAoc3Vial9pZikKKwkJKnN1YmpfaWYgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfU1VQVFlQRVMKKy8qIHN1cHR5cGVzICovCitpbnQgcHJfbm9kZWluZm9fc3VwdHlwZXMoQ0hFQ0tBTkRGSUxMX0FSR1MpCit7CisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKHN1YmpsZW4pIHsKKwkJREVCVUcoTE9HX1dBUk5JTkcsICIlcygpOiBpbnZhbGlkIHN1YmplY3QgbGVuZ3RoKCV6dSlcbiIsCisJCSAgICAgIF9fZnVuY19fLCBzdWJqbGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJlcGx5KSB7CisJCXAtPnJlcGx5Lm5pX3R5cGUgPSBJQ01QNl9OSV9SRVBMWTsKKwkJcC0+cmVwbHkubmlfY29kZSA9IElDTVA2X05JX1NVQ0NFU1M7CisJCXAtPnJlcGx5Lm5pX2Nrc3VtID0gMDsKKwkJcC0+cmVwbHkubmlfcXR5cGUgPSBodG9ucyhOSV9RVFlQRV9TVVBUWVBFUyk7CisJCXAtPnJlcGx5Lm5pX2ZsYWdzID0gZmxhZ3Mmfk5JX1NVUFRZUEVfRkxBR19DT01QUkVTUzsKKwkJCisJCXAtPnJlcGx5ZGF0YWxlbiA9IHN1cHR5cGVzX2xlbjw8MjsKKwkJcC0+cmVwbHlkYXRhID0gbmlfbWFsbG9jKHAtPnJlcGx5ZGF0YWxlbik7CisJCWlmIChwLT5yZXBseWRhdGEgPT0gTlVMTCkgeworCQkJcC0+cmVwbHlkYXRhbGVuID0gLTE7CisJCQlyZXR1cm4gLTE7CS8qWFhYKi8KKwkJfQorCisJCW1lbWNweShwLT5yZXBseWRhdGEsIHN1cHR5cGVzLCBwLT5yZXBseWRhdGFsZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBpbml0X25vZGVpbmZvX3N1cHR5cGVzKElOSVRfQVJHUykKK3sKKwlzaXplX3QgdywgYjsKKwlpbnQgaTsKKworCWlmICghZm9yY2VkICYmIGluaXRpYWxpemVkKQorCQlyZXR1cm47CisKKwltZW1zZXQoc3VwdHlwZXMsIDAsIHNpemVvZihzdXB0eXBlcykpOworCXN1cHR5cGVzX2xlbiA9IDA7CisKKwlmb3IgKGk9MDsgaSA8IEFSUkFZX1NJWkUocXR5cGVpbmZvX3RhYmxlKTsgaSsrKSB7CisJCXVuc2lnbmVkIHNob3J0IHF0eXBlOworCisJCWlmIChxdHlwZWluZm9fdGFibGVbaV0ubmFtZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXF0eXBlID0gcXR5cGVpbmZvX3RhYmxlW2ldLnF0eXBlOworCQl3ID0gcXR5cGU+PjU7CisJCWIgPSBxdHlwZSYweDFmOworCQlpZiAodyA+PSBBUlJBWV9TSVpFKHN1cHR5cGVzKSkgeworCQkJLyogVGhpcyBpcyBwcm9ncmFtbWluZyBlcnJvci4gKi8KKwkJCURFQlVHKExPR19FUlIsICJXYXJuaW5nOiBUb28gTGFyZ2UgU3VwcG9ydGVkIFR5cGVzXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJc3VwdHlwZXNbd10gfD0gaHRvbmwoMTw8Yik7CisKKwkJaWYgKHN1cHR5cGVzX2xlbiA8IHcpCisJCQlzdXB0eXBlc19sZW4gPSB3OworCX0KKwlzdXB0eXBlc19sZW4rKzsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tICovCisvKiB1bmtub3duIHF0eXBlIHJlc3BvbnNlICovCitpbnQgcHJfbm9kZWluZm9fdW5rbm93bihDSEVDS0FOREZJTExfQVJHUykKK3sKKwlpZiAoIXJlcGx5KQorCQlyZXR1cm4gLTE7CS8qPz8/Ki8KKworCXAtPnJlcGx5Lm5pX3R5cGUgPSBJQ01QNl9OSV9SRVBMWTsKKwlwLT5yZXBseS5uaV9jb2RlID0gSUNNUDZfTklfVU5LTk9XTjsKKwlwLT5yZXBseS5uaV9ja3N1bSA9IDA7CisJLy9wLT5yZXBseS5uaV9xdHlwZSA9IDA7CisJcC0+cmVwbHkubmlfZmxhZ3MgPSBmbGFnczsKKworCXAtPnJlcGx5ZGF0YSA9IE5VTEw7CisJcC0+cmVwbHlkYXRhbGVuID0gMDsKKworCXJldHVybiAwOworfQorCisvKiByZWZ1c2VkIHJlc3BvbnNlICovCitpbnQgcHJfbm9kZWluZm9fcmVmdXNlZChDSEVDS0FOREZJTExfQVJHUykKK3sKKwlpZiAoIXJlcGx5KQorCQlyZXR1cm4gLTE7CS8qPz8/Ki8KKworCXAtPnJlcGx5Lm5pX3R5cGUgPSBJQ01QNl9OSV9SRVBMWTsKKwlwLT5yZXBseS5uaV9jb2RlID0gSUNNUDZfTklfUkVGVVNFRDsKKwlwLT5yZXBseS5uaV9ja3N1bSA9IDA7CisJLy9wLT5yZXBseS5uaV9xdHlwZSA9IDA7CisJcC0+cmVwbHkubmlfZmxhZ3MgPSBmbGFnczsKKworCXAtPnJlcGx5ZGF0YSA9IE5VTEw7CisJcC0+cmVwbHlkYXRhbGVuID0gMDsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tICovCisvKiBQb2xpY3kgKi8KK3N0YXRpYyBpbnQgbmlfcG9saWN5KHN0cnVjdCBwYWNrZXRjb250ZXh0ICpwKQoreworCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnAtPmFkZHIpLT5zaW42X2FkZHI7CisKKwkvKgorCSAqID4wOiByZXBseQorCSAqICAwOiByZWZ1c2VkCisJICogPDA6IGRpc2NhcmQKKwkgKi8KKworCS8qIERlZmF1bHQgcG9saWN5IGlzIHRvIHJlZnVzZSBxdWVyaWVzIGZyb20KKwkgKiBub24tbG9jYWwgYWRkcmVzc2VzOyBsb29wYmFjaywgbGluay1sb2NhbCBvcgorCSAqIHNpdGUtbG9jYWwgYXJlIG9rYXkKKwkgKi8KKwlpZiAoIShJTjZfSVNfQUREUl9MSU5LTE9DQUwoc2FkZHIpIHx8CisJICAgICAgSU42X0lTX0FERFJfU0lURUxPQ0FMKHNhZGRyKSB8fAorCSAgICAgIElONl9JU19BRERSX0xPT1BCQUNLKHNhZGRyKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiAtLS0tLS0tLS0tICovCit2b2lkIGluaXRfY29yZShpbnQgZm9yY2VkKQoreworCWludCBpOworCisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKCFpbml0aWFsaXplZCB8fCBmb3JjZWQpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCXVuc2lnbmVkIGludCBzZWVkID0gMDsKKwkJcGlkX3QgcGlkOworCisJCWlmIChnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSA8IDApIHsKKwkJCURFQlVHKExPR19XQVJOSU5HLCAiJXMoKTogZmFpbGVkIHRvIGdldHRpbWVvZmRheSgpXG4iLCBfX2Z1bmNfXyk7CisJCX0gZWxzZSB7CisJCQlzZWVkID0gKHR2LnR2X3VzZWMgJiAweGZmZmZmZmZmKTsKKwkJfQorCisJCXBpZCA9IGdldHBpZCgpOworCQlzZWVkIF49ICgoKHVuc2lnbmVkIGxvbmcpcGlkKSAmIDB4ZmZmZmZmZmYpOworCisJCXNyYW5kKHNlZWQpOworCisjaWYgRU5BQkxFX1RIUkVBRFMgJiYgSEFWRV9MSUJQVEhSRUFECisJCWlmIChpbml0aWFsaXplZCkKKwkJCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZwYXR0cik7CisKKwkJcHRocmVhZF9hdHRyX2luaXQoJnBhdHRyKTsKKwkJcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZwYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworI2VuZGlmCisJfQorCisJZm9yIChpPTA7IGkgPCBBUlJBWV9TSVpFKHN1YmppbmZvX3RhYmxlKTsgaSsrKSB7CisJCWlmIChzdWJqaW5mb190YWJsZVtpXS5uYW1lID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHN1YmppbmZvX3RhYmxlW2ldLmluaXQpCisJCQlzdWJqaW5mb190YWJsZVtpXS5pbml0KGZvcmNlZCk7CisJfQorCisJZm9yIChpPTA7IGkgPCBBUlJBWV9TSVpFKHF0eXBlaW5mb190YWJsZSk7IGkrKykgeworCQlpZiAocXR5cGVpbmZvX3RhYmxlW2ldLm5hbWUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAocXR5cGVpbmZvX3RhYmxlW2ldLmluaXQpCisJCQlxdHlwZWluZm9fdGFibGVbaV0uaW5pdChmb3JjZWQpOworCX0KKworCWluaXRpYWxpemVkID0gMTsKKworCXJldHVybjsKK30KKworI2lmIEVOQUJMRV9USFJFQURTICYmIEhBVkVfTElCUFRIUkVBRAorc3RhdGljIHZvaWQgKm5pX3NlbmRfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKwlERUJVRyhMT0dfREVCVUcsICIlcygpOiB0aHJlYWQ9JWxkXG4iLCBfX2Z1bmNfXywgcHRocmVhZF9zZWxmKCkpOworCXJldCA9IG5pX3NlbmQoZGF0YSk7CisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKTogdGhyZWFkPSVsZCA9PiAlZFxuIiwgX19mdW5jX18sIHB0aHJlYWRfc2VsZigpLCByZXQpOworCXJldHVybiBOVUxMOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgbmlfc2VuZF9mb3JrKHN0cnVjdCBwYWNrZXRjb250ZXh0ICpwKQoreworCXBpZF90IGNoaWxkID0gZm9yaygpOworCWlmIChjaGlsZCA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoY2hpbGQgPT0gMCkgeworCQlwaWRfdCBncmFuZGNoaWxkID0gZm9yaygpOworCQlpZiAoZ3JhbmRjaGlsZCA8IDApCisJCQlleGl0KDEpOworCQlpZiAoZ3JhbmRjaGlsZCA9PSAwKSB7CisJCQlpbnQgcmV0OworCQkJREVCVUcoTE9HX0RFQlVHLCAiJXMoKTogd29ya2VyPSVkXG4iLAorCQkJICAgICAgX19mdW5jX18sIGdldHBpZCgpKTsKKwkJCXJldCA9IG5pX3NlbmQocCk7CisJCQlERUJVRyhMT0dfREVCVUcsICIlcygpOiB3b3JrZXI9JWQgPT4gJWRcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgZ2V0cGlkKCksIHJldCk7CisJCQlleGl0KHJldCA+IDAgPyAxIDogMCk7CisJCX0KKwkJbmlfZnJlZShwLT5yZXBseWRhdGEpOworCQluaV9mcmVlKHApOworCQlleGl0KDApOworCX0gZWxzZSB7CisJCXdhaXRwaWQoY2hpbGQsIE5VTEwsIDApOworCQluaV9mcmVlKHAtPnJlcGx5ZGF0YSk7CisJCW5pX2ZyZWUocCk7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbmlfcmF0ZWxpbWl0KHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCB0aW1ldmFsIGxhc3Q7CisJc3RydWN0IHRpbWV2YWwgdHYsIHN1YjsKKworCWlmIChnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSA8IDApIHsKKwkJREVCVUcoTE9HX1dBUk5JTkcsICIlcygpOiBnZXR0aW1lb2ZkYXkoKTogJXNcbiIsCisJCSAgICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCF0aW1lcmlzc2V0KCZsYXN0KSkgeworCQlsYXN0ID0gdHY7CisJCXJldHVybiAwOworCX0KKworCXRpbWVyc3ViKCZ0diwgJmxhc3QsICZzdWIpOworCisJaWYgKHN1Yi50dl9zZWMgPCAxKQorCQlyZXR1cm4gMTsKKworCWxhc3QgPSB0djsKKwlyZXR1cm4gMDsKK30KKworaW50IHByX25vZGVpbmZvKHN0cnVjdCBwYWNrZXRjb250ZXh0ICpwKQoreworCXN0cnVjdCBpY21wNl9ub2RlaW5mbyAqcXVlcnkgPSAoc3RydWN0IGljbXA2X25vZGVpbmZvICopcC0+cXVlcnk7CisKKwljaGFyICpzdWJqZWN0ID0gKGNoYXIgKikocXVlcnkgKyAxKTsKKwlzaXplX3Qgc3ViamxlbjsKKwlzdHJ1Y3Qgc3ViamluZm8gKnN1YmppbmZvOworCXN0cnVjdCBxdHlwZWluZm8gKnF0eXBlaW5mbzsKKwlpbnQgcmVwbHlvbnN1YmpjaGVjayA9IDA7CisJdW5zaWduZWQgaW50IHN1YmpfaWY7CisjaWYgRU5BQkxFX0RFQlVHCisJY2hhciBwcmludGJ1ZlsxMjhdOworCWludCBpOworCWNoYXIgKmNwOworI2VuZGlmCisjaWYgRU5BQkxFX1RIUkVBRFMgJiYgSEFWRV9QVEhSRUFEX0gKKwlwdGhyZWFkX3QgdGhyZWFkOworI2VuZGlmCisJaW50IHJjOworCisJLyogU3RlcCAwOiBDaGVjayBkZXN0aW5hdGlvbiBhZGRyZXNzCisJICoJCWRpc2NhcmQgbm9uLWxpbmtsb2NhbCBtdWx0aWNhc3QKKwkgKgkJZGlzY2FyZCBub24tbmlncm91cCBtdWx0aWNhc3QgYWRkcmVzcyg/KQorCSAqLworCWlmIChJTjZfSVNfQUREUl9NVUxUSUNBU1QoJnAtPnBrdGluZm8uaXBpNl9hZGRyKSkgeworCQlpZiAoIUlONl9JU19BRERSX01DX0xJTktMT0NBTCgmcC0+cGt0aW5mby5pcGk2X2FkZHIpKSB7CisJCQlERUJVRyhMT0dfV0FSTklORywKKwkJCSAgICAgICJEZXN0aW5hdGlvbiBpcyBub24tbGluay1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcy5cbiIpOworCQkJbmlfZnJlZShwKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2lmIDAKKwkJLyogRG8gbm90IGRpc2NhcmQgTkkgUXVlcmllcyB0byBtdWx0aWNhc3QgYWRkcmVzcworCQkgKiBvdGhlciB0aGFuIGl0cyBvd24gTkkgR3JvdXAgQWRkcmVzcyhlcykgYnkgZGVmYXVsdC4KKwkJICovCisJCWlmICghY2hlY2tfbmlncm91cCgmcC0+cGt0aW5mby5pcGk2X2FkZHIpKSB7CisJCQlERUJVRyhMT0dfV0FSTklORywKKwkJCSAgICAgICJEZXN0aW5hdGlvbiBpcyBsaW5rLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzIG90aGVyIHRoYW4gIgorCQkJICAgICAgIk5JIEdyb3VwIGFkZHJlc3MuXG4iKTsKKwkJCW5pX2ZyZWUocCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKyNlbmRpZgorCX0KKworCS8qIFN0ZXAgMTogQ2hlY2sgbGVuZ3RoICovCisJaWYgKHAtPnF1ZXJ5bGVuIDwgc2l6ZW9mKHN0cnVjdCBpY21wNl9ub2RlaW5mbykpIHsKKwkJREVCVUcoTE9HX1dBUk5JTkcsICJRdWVyeSB0b28gc2hvcnRcbiIpOworCQluaV9mcmVlKHApOworCQlyZXR1cm4gLTE7CisJfQorCisjaWYgRU5BQkxFX0RFQlVHCisJY3AgPSBwcmludGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHF1ZXJ5LT5pY21wNl9uaV9ub25jZSk7IGkrKykgeworCQljcCArPSBzcHJpbnRmKGNwLCAiICUwMngiLCBxdWVyeS0+aWNtcDZfbmlfbm9uY2VbaV0pOworCX0KKwlERUJVRyhMT0dfREVCVUcsICIlcygpOiBxdHlwZT0lZCwgZmxhZ3M9MHglMDR4LCBub25jZVtdID0geyVzIH1cbiIsCisJICAgICAgX19mdW5jX18sCisJICAgICAgbnRvaHMocXVlcnktPm5pX3F0eXBlKSwgbnRvaHMocXVlcnktPm5pX2ZsYWdzKSwgcHJpbnRidWYpOworI2VuZGlmCisKKwlzdWJqbGVuID0gcC0+cXVlcnlsZW4gLSBzaXplb2Yoc3RydWN0IGljbXA2X25vZGVpbmZvKTsKKworCS8qIFN0ZXAgMjogQ2hlY2sgU3ViamVjdCBDb2RlICovCisJc3dpdGNoKGh0b25zKHF1ZXJ5LT5uaV9xdHlwZSkpIHsKKwljYXNlIE5JX1FUWVBFX05PT1A6CisJY2FzZSBOSV9RVFlQRV9TVVBUWVBFUzoKKwkJaWYgKHF1ZXJ5LT5uaV9jb2RlICE9IElDTVA2X05JX1NVQkpfRlFETikgeworCQkJREVCVUcoTE9HX1dBUk5JTkcsCisJCQkgICAgICAiJXMoKTogaW52YWxpZC91bmtub3duIGNvZGUgJXVcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgcXVlcnktPm5pX2NvZGUpOworCQkJc3ViamxlbiA9IDA7CisJCX0KKwkJc3ViamluZm8gPSAmc3ViamluZm9fbnVsbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ViamluZm8gPSBzdWJqaW5mb19sb29rdXAocXVlcnktPm5pX2NvZGUpOworCQlpZiAoIXN1YmppbmZvKSB7CisJCQlERUJVRyhMT0dfV0FSTklORywKKwkJCSAgICAgICIlcygpOiB1bmtub3duIGNvZGUgJXVcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgcXVlcnktPm5pX2NvZGUpOworCQkJbmlfZnJlZShwKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIFN0ZXAgMzogTG9va3VwIFF0eXBlICovCisJcXR5cGVpbmZvID0gcXR5cGVpbmZvX2xvb2t1cChudG9ocyhxdWVyeS0+bmlfcXR5cGUpKTsKKworCS8qIFN0ZXAgNDogQ2hlY2sgU3ViamVjdAorCSAqICAgICAgICAgKEFuZCBmaWxsIHJlcGx5IGlmIGl0IGlzIGF2YWlsYWJsZSBub3cpCisJICovCisJaWYgKHF0eXBlaW5mby0+Z2V0cmVwbHkgPT0gc3ViamluZm8tPmNoZWNrc3ViaikKKwkJcmVwbHlvbnN1YmpjaGVjayA9IDE7CisKKwlpZiAoc3ViamluZm8tPmNoZWNrc3ViaihwLAorCQkJCXN1YmplY3QsIHN1YmpsZW4sCisJCQkJcXVlcnktPm5pX2ZsYWdzLAorCQkJCXJlcGx5b25zdWJqY2hlY2sgPyBOVUxMIDogJnN1YmpfaWYsCisJCQkJcmVwbHlvbnN1YmpjaGVjaykpIHsKKwkJaWYgKHAtPnJlcGx5ZGF0YWxlbiA8IDApIHsKKwkJCURFQlVHKExPR19XQVJOSU5HLAorCQkJICAgICAgImZhaWxlZCB0byBtYWtlIHJlcGx5OiAlc1xuIiwKKwkJCSAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJbmlfZnJlZShwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFhYWDogU3RlcCA1OiBDaGVjayB0aGUgcG9saWN5ICovCisJcmMgPSBuaV9wb2xpY3kocCk7CisJaWYgKHJjIDw9IDApIHsKKwkJbmlfZnJlZShwLT5yZXBseWRhdGEpOworCQlwLT5yZXBseWRhdGEgPSBOVUxMOworCQlwLT5yZXBseWRhdGFsZW4gPSAwOworCQlpZiAocmMgPCAwKSB7CisJCQlERUJVRyhMT0dfV0FSTklORywgIklnbm9yZWQgYnkgcG9saWN5LlxuIik7CisJCQluaV9mcmVlKHApOworCQkJcmV0dXJuIC0xOworCQl9CisJCURFQlVHKExPR19XQVJOSU5HLCAiUmVmdXNlZCBieSBwb2xpY3kuXG4iKTsKKwkJcmVwbHlvbnN1YmpjaGVjayA9IDA7CisJCXF0eXBlaW5mbyA9ICZxdHlwZWluZm9fcmVmdXNlZDsKKwl9CisKKwkvKiBTdGVwIDY6IEZpbGwgdGhlIHJlcGx5IGlmIG5vdCB5ZXQgZG9uZSAqLworCWlmICghcmVwbHlvbnN1YmpjaGVjaykgeworCQlpZiAocXR5cGVpbmZvLT5nZXRyZXBseShwLAorCQkJCQlOVUxMLCAwLAorCQkJCQlxdWVyeS0+bmlfZmxhZ3MsCisJCQkJCSZzdWJqX2lmLAorCQkJCQkxKSkgeworCQkJaWYgKHAtPnJlcGx5ZGF0YWxlbikgeworCQkJCURFQlVHKExPR19XQVJOSU5HLAorCQkJCSAgICAgICJmYWlsZWQgdG8gbWFrZSByZXBseTogJXNcbiIsCisJCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCW5pX2ZyZWUocCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBTdGVwIDc6IFJhdGUgTGltaXQgKi8KKwlpZiAocXR5cGVpbmZvLT5mbGFncyZRVFlQRUlORk9fRl9SQVRFTElNSVQgJiYKKwkgICAgbmlfcmF0ZWxpbWl0KCkpIHsKKwkJbmlfZnJlZShwLT5yZXBseWRhdGEpOworCQluaV9mcmVlKHApOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU3RlcCA4OiBGaWxsIFF0eXBlIC8gTm9uY2UgKi8KKwlwLT5yZXBseS5uaV9xdHlwZSA9IHF1ZXJ5LT5uaV9xdHlwZTsKKwltZW1jcHkocC0+cmVwbHkuaWNtcDZfbmlfbm9uY2UsIHF1ZXJ5LT5pY21wNl9uaV9ub25jZSwgc2l6ZW9mKHAtPnJlcGx5LmljbXA2X25pX25vbmNlKSk7CisKKwkvKiBTdGVwIDk6IFNvdXJjZSBhZGRyZXNzIHNlbGVjdGlvbiAqLworCWlmIChJTjZfSVNfQUREUl9NVUxUSUNBU1QoJnAtPnBrdGluZm8uaXBpNl9hZGRyKSkgeworCQkvKiBpZiBxdWVyeSB3YXMgc2VudCB0byBtdWx0aWNhc3QgYWRkcmVzcywKKwkJICogdXNlIHNvdXJjZSBhZGRyZXNzIHNlbGVjdGlvbiBpbiBrZXJuZWwuCisJCSAqIFhYWDogYW55Y2FzdD8KKwkJICovCisJCW1lbXNldCgmcC0+cGt0aW5mby5pcGk2X2FkZHIsIDAsIHNpemVvZihwLT5wa3RpbmZvLmlwaTZfYWRkcikpOworCisJIAkvKiBSYW5kb20gRGVsYXkgYmV0d2VlbiB6ZXJvIGFuZCBNQVhfQU5ZQ0FTVF9ERUxBWV9USU1FIGlzCisJCSAqIHJlcXVpcmVkIGlmIHF1ZXJ5IHdhcyBzZW50IHRvIGFueWNhc3Qgb3IgbXVsdGljYXN0IGFkZHJlc3MuCisJCSAqLworCQlwLT5kZWxheSA9IChpbnQpIChNQVhfQU5ZQ0FTVF9ERUxBWV9USU1FKnJhbmQoKS8oUkFORF9NQVgrMS4wKSk7CisJfSBlbHNlIHsKKwkJcC0+ZGVsYXkgPSAwOworCX0KKworCS8qIFN0ZXAgMTA6IFNlbmQgdGhlIHJlcGx5CisJICogWFhYOiB3aXRoIHBvc3NpYmxlIHJhbmRvbSBkZWxheSAqLworI2lmIEVOQUJMRV9USFJFQURTICYmIEhBVkVfTElCUFRIUkVBRAorCS8qIG5pX3NlbmRfdGhyZWFkKCkgZnJlZXMgcCAqLworCWlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCAmcGF0dHIsIG5pX3NlbmRfdGhyZWFkLCBwKSkgeworCQluaV9mcmVlKHAtPnJlcGx5ZGF0YSk7CisJCW5pX2ZyZWUocCk7CisJCXJldHVybiAtMTsKKwl9CisjZWxzZQorCS8qIG5pX3NlbmRfZm9yaygpIGZyZWVzIHAgKi8KKwlpZiAobmlfc2VuZF9mb3JrKHApKSB7CisJCW5pX2ZyZWUocC0+cmVwbHlkYXRhKTsKKwkJbmlfZnJlZShwKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2lwdXRpbHMvbmluZm9kL25pbmZvZF9uYW1lLmMgYi9pcHV0aWxzL25pbmZvZC9uaW5mb2RfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkN2U5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL25pbmZvZC9uaW5mb2RfbmFtZS5jCkBAIC0wLDAgKzEsMzg5IEBACisvKiAkVVNBR0k6IG5pbmZvZF9uYW1lLmMsdiAxLjE1IDIwMDMtMDEtMTEgMTQ6MzM6MjggeW9zaGZ1amkgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgVVNBR0kvV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworLyoKKyAqIEF1dGhvcjoKKyAqIAlZT1NISUZVSkkgSGlkZWFraSA8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CisgKi8KKworI2lmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjIGluY2x1ZGUgPGN0eXBlLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIVNURENfSEVBREVSUyAmJiBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RESU5UX0gKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWYgVElNRV9XSVRIX1NZU19USU1FICAgCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAKKyMgaW5jbHVkZSA8dGltZS5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TWVNfVElNRV9IICAgICAKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGVsc2UgICAgICAgICAgICAgICAgCisjICBpbmNsdWRlIDx0aW1lLmg+CisjIGVuZGlmICAgICAgICAgICAgICAgICAgCisjZW5kaWYgICAgICAgICAgICAgICAgICAgCisKKyNpZiBIQVZFX1NZU19VSU9fSAorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaWYgSEFWRV9ORVRJTkVUX0lOX0gKKyMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisKKyNpZiBIQVZFX05FVElORVRfSUNNUDZfSAorIyBpbmNsdWRlIDxuZXRpbmV0L2ljbXA2Lmg+CisjZW5kaWYKKyNpZm5kZWYgSEFWRV9TVFJVQ1RfSUNNUDZfTk9ERUlORk8KKyMgaW5jbHVkZSAiaWNtcDZfbm9kZWluZm8uaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpZiBkZWZpbmVkKEhBVkVfR05VVExTX09QRU5TU0xfSCkKKyMgaW5jbHVkZSA8Z251dGxzL29wZW5zc2wuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9PUEVOU1NMX01ENV9IKQorIyBpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1NZU19VVFNOQU1FX0gKKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorI2lmIEhBVkVfTkVUREJfSAorIyBpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmIEhBVkVfU1lTTE9HX0gKKyMgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm5pbmZvZC5oIgorCisjaWZuZGVmIG9mZnNldG9mCisjIGRlZmluZSBvZmZzZXRvZihhZ2dyZWdhdGUsbWVtYmVyKQkoKHNpemVfdCkmKChhZ2dyZWdhdGUgKikwKS0+bWVtYmVyKQorI2VuZGlmCisKKy8qIEhtbSwsLCAqLworI2lmbmRlZiBJUFY2X0pPSU5fR1JPVVAKKyMgZGVmaW5lIElQVjZfSk9JTl9HUk9VUAlJUFY2X0FERF9NRU1CRVJTSElQCisjIGRlZmluZSBJUFY2X0xFQVZFX0dST1VQCUlQVjZfRFJPUF9NRU1CRVJTSElQCisjZW5kaWYKKworLyogLS0tLS0tLS0tLSAqLworLyogSUQgKi8KK3N0YXRpYyBjaGFyICpSQ1NJRCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgPSAiJFVTQUdJOiBuaW5mb2RfbmFtZS5jLHYgMS4xNSAyMDAzLTAxLTExIDE0OjMzOjI4IHlvc2hmdWppIEV4cCAkIjsKKworLyogVmFyaWFibGVzICovCitzdGF0aWMgc3RydWN0IHV0c25hbWUgdXRzbmFtZTsKK3N0YXRpYyBjaGFyICp1dHNfbm9kZW5hbWUgPSB1dHNuYW1lLm5vZGVuYW1lOworCitjaGFyIG5vZGVuYW1lW01BWF9ETlNOQU1FX1NJWkVdOworc3RhdGljIHNpemVfdCBub2RlbmFtZWxlbjsKKworc3RhdGljIHN0cnVjdCBpcHY2X21yZXEgbmlncm91cDsKKworLyogLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb25zICovCitpbnQgY2hlY2tfbmlncm91cChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCit7CisJcmV0dXJuIElONl9JU19BRERSX01VTFRJQ0FTVCgmbmlncm91cC5pcHY2bXJfbXVsdGlhZGRyKSAmJgorCSAgICAgICBJTjZfQVJFX0FERFJfRVFVQUwoJm5pZ3JvdXAuaXB2Nm1yX211bHRpYWRkciwgYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2Ruc25hbWUoY29uc3QgY2hhciAqbmFtZSwgCisJCQkgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgCisJCQkgIGludCBmcWRuKQoreworCXNpemVfdCBuYW1lbGVuOworCWludCBpOworCisJaWYgKGJ1ZmxlbiA8IDApCisJCXJldHVybiAtMTsKKworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKG5hbWVsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG5hbWVsZW4gPiAyNTUgfHwgYnVmbGVuIDwgbmFtZWxlbisxKQorCQlyZXR1cm4gLTE7CisKKwlpID0gMDsKKwl3aGlsZShpIDw9IG5hbWVsZW4pIHsKKwkJY29uc3QgY2hhciAqZTsKKwkJaW50IGxsZW4sIGlpOworCisJCWUgPSBzdHJjaHIoJm5hbWVbaV0sICcuJyk7CisJCWlmIChlID09IE5VTEwpCisJCQllID0gbmFtZSArIG5hbWVsZW47CisJCWxsZW4gPSBlIC0gJm5hbWVbaV07CisJCWlmIChsbGVuID09IDApIHsKKwkJCWlmICgqZSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoZnFkbiA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJZnFkbiA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAobGxlbiA+PSAweDQwKQorCQkJcmV0dXJuIC0xOworCQlidWZbaV0gPSBsbGVuOworCQlmb3IgKGlpID0gMDsgaWkgPCBsbGVuOyBpaSsrKSB7CisJCQlpZiAoIWlzYXNjaWkobmFtZVtpK2lpXSkpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKGlpID09IDAgfHwgaWkgPT0gbGxlbi0xKSB7CisJCQkJaWYgKCFpc2FscGhhKG5hbWVbaStpaV0pICYmICFpc2RpZ2l0KG5hbWVbaStpaV0pKQorCQkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UgaWYgKCFpc2FsbnVtKG5hbWVbaStpaV0pICYmIG5hbWVbaStpaV0gIT0gJy0nKQorCQkJCXJldHVybiAtMTsKKwkJCWJ1ZltpK2lpKzFdID0gaXN1cHBlcihuYW1lW2kraWldKSA/IHRvbG93ZXIobmFtZVtpK2lpXSkgOiBuYW1lW2kraWldOworCQl9CisJCWkgKz0gbGxlbiArIDE7CisJfQorCWlmIChidWZsZW4gPCBpICsgMSArICEoZnFkbiA+IDApKQorCQlyZXR1cm4gLTE7CisJYnVmW2krK10gPSAwOworCWlmICghKGZxZG4gPiAwKSkKKwkJYnVmW2krK10gPSAwOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfZG5zbmFtZShjb25zdCBjaGFyICpzLCBzaXplX3Qgc2xlbiwKKwkJCSAgIGNvbnN0IGNoYXIgKm4sIHNpemVfdCBubGVuKQoreworCWNvbnN0IGNoYXIgKnMwID0gcywgKm4wID0gbjsKKwlpbnQgZG9uZSA9IDAsIHJldGNvZGUgPSAwOworCWlmIChzbGVuIDwgMSB8fCBubGVuIDwgMSkKKwkJcmV0dXJuIC0xOwkvKiBpbnZhbGlkIGxlbmd0aCAqLworCS8qIHNpbXBsZSBjYXNlICovCisJaWYgKHNsZW4gPT0gbmxlbiAmJiBtZW1jbXAocywgbiwgc2xlbikgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKCooczAgKyBzbGVuIC0gMSkgfHwgKihuMCArIG5sZW4gLSAxKSkKKwkJcmV0dXJuIC0xOwkvKiBpbnZhbGlkIHRlcm1pbmF0aW9uICovCisJd2hpbGUgKHMgPCBzMCArIHNsZW4gJiYgbiA8IG4wICsgbmxlbikgeworCQlpZiAoKnMgPj0gMHg0MCB8fCAqbiA+PSAweDQwKQorCQkJcmV0dXJuIC0xOwkvKiBETlMgY29tcHJlc3Npb24gaXMgbm90IGFsbG93ZWQgaGVyZSAqLworCQlpZiAocyArICpzICsgMSA+IHMwICsgc2xlbiB8fCBuICsgKm4gKyAxID4gbjAgKyBubGVuKQorCQkJcmV0dXJuIC0xOwkvKiBvdmVycnVuICovCisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQlpZiAocyA9PSBzMCArIHNsZW4gLSAxKQorCQkJCWJyZWFrOwkvKiBGUUROICovCisJCQllbHNlIGlmIChzICsgMSA9PSBzMCArIHNsZW4gLSAxKQorCQkJCXJldHVybiByZXRjb2RlOwkvKiB0cnVuY2F0ZWQgKi8KKwkJCWVsc2UKKwkJCQlyZXR1cm4gLTE7CS8qIG1vcmUgdGhhbiBvbmUgc3ViamVjdCAqLworCQl9CisJCWlmICghZG9uZSkgeworCQkJaWYgKCpuID09ICdcMCcpIHsKKwkJCQlpZiAobiA9PSBuMCArIG5sZW4gLSAxKSB7CisJCQkJCWRvbmUgPSAxOwkvKiBGUUROICovCisJCQkJfSBlbHNlIGlmIChuICsgMSA9PSBuMCArIG5sZW4gLSAxKSB7CisJCQkJCXJldGNvZGUgPSAxOwkvLyB0cnVuYworCQkJCQlkb25lID0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKnMgIT0gKm4pIHsKKwkJCQkJZG9uZSA9IDE7CisJCQkJCXJldGNvZGUgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChtZW1jbXAocysxLCBuKzEsICpzKSkgeworCQkJCQkJZG9uZSA9IDE7CisJCQkJCQlyZXRjb2RlID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlzICs9ICpzICsgMTsKKwkJbiArPSBkb25lID8gMCA6ICgqbiArIDEpOworCX0KKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBub2RlaW5mb19ncm91cChjb25zdCBjaGFyICpkbnNuYW1lLCBpbnQgbmFtZWxlbiwgCisJCQkgIHN0cnVjdCBpbjZfYWRkciAqbmlncm91cCkKK3sKKwlNRDVfQ1RYIGN0eHQ7CisJdW5zaWduZWQgY2hhciBkaWdlc3RbMTZdOworCisJaWYgKCFkbnNuYW1lIHx8ICFuaWdyb3VwKQorCQlyZXR1cm4gLTE7CisKKwlNRDVfSW5pdCgmY3R4dCk7CisJTUQ1X1VwZGF0ZSgmY3R4dCwgZG5zbmFtZSwgKmRuc25hbWUpOworCU1ENV9GaW5hbChkaWdlc3QsICZjdHh0KTsKKworI2lmZGVmIHM2X2FkZHIzMgorCW5pZ3JvdXAtPnM2X2FkZHIzMlswXSA9IGh0b25sKDB4ZmYwMjAwMDApOworCW5pZ3JvdXAtPnM2X2FkZHIzMlsxXSA9IDA7CisJbmlncm91cC0+czZfYWRkcjMyWzJdID0gaHRvbmwoMHgwMDAwMDAwMik7CisjZWxzZQorCW1lbXNldChuaWdyb3VwLCAwLCBzaXplb2YoKm5pZ3JvdXApKTsKKwluaWdyb3VwLT5zNl9hZGRyWyAwXSA9IDB4ZmY7CisJbmlncm91cC0+czZfYWRkclsgMV0gPSAweDAyOworCW5pZ3JvdXAtPnM2X2FkZHJbMTFdID0gMHgwMjsKKyNlbmRpZgorCW1lbWNweSgmbmlncm91cC0+czZfYWRkclsxMl0sIGRpZ2VzdCwgNCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLSAqLwordm9pZCBpbml0X25vZGVpbmZvX25vZGVuYW1lKGludCBmb3JjZWQpCit7CisJc3RydWN0IHV0c25hbWUgbmV3bmFtZTsKKwlpbnQgbGVuOworCWludCBjaGFuZ2VkID0gMDsKKworCURFQlVHKExPR19ERUJVRywgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXVuYW1lKCZuZXduYW1lKTsKKwljaGFuZ2VkID0gc3RyY21wKG5ld25hbWUubm9kZW5hbWUsIHV0c25hbWUubm9kZW5hbWUpOworCisJaWYgKCFjaGFuZ2VkICYmICFmb3JjZWQpCisJCXJldHVybjsKKworCW1lbWNweSgmdXRzbmFtZSwgJm5ld25hbWUsIHNpemVvZihuZXduYW1lKSk7CisKKwkvKiBsZWF2ZSBvbGQgZ3JvdXAgKi8KKwlpZiAoKGNoYW5nZWQgfHwgZm9yY2VkKSAmJiAhSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoJm5pZ3JvdXAuaXB2Nm1yX211bHRpYWRkcikpIHsKKwkJaWYgKHNldHNvY2tvcHQoc29jaywgSVBQUk9UT19JUFY2LCBJUFY2X0xFQVZFX0dST1VQLCAmbmlncm91cCwgc2l6ZW9mKG5pZ3JvdXApKSA8IDApIHsKKyNpZiBFTkFCTEVfREVCVUcKKwkJCWNoYXIgbmlhZGRyYnVmW0lORVQ2X0FERFJTVFJMRU5dOworCQkJaWYgKGluZXRfbnRvcChBRl9JTkVUNiwgJm5pZ3JvdXAsIG5pYWRkcmJ1Ziwgc2l6ZW9mKG5pYWRkcmJ1ZikpID09IE5VTEwpCisJCQkJc3RyY3B5KG5pYWRkcmJ1ZiwgIj8/PyIpOworI2VuZGlmCisJCQlERUJVRyhMT0dfV0FSTklORywKKwkJCSAgICAgICIlcygpOiBmYWlsZWQgdG8gbGVhdmUgZ3JvdXAgJXMuXG4iLAorCQkJICAgICAgX19mdW5jX18sIG5pYWRkcmJ1Zik7CisJCQltZW1zZXQoJm5pZ3JvdXAsIDAsIHNpemVvZihuaWdyb3VwKSk7CisJCX0KKwl9CisKKwlsZW4gPSBlbmNvZGVfZG5zbmFtZSh1dHNfbm9kZW5hbWUsCisJCQkgICAgIG5vZGVuYW1lLCAKKwkJCSAgICAgc2l6ZW9mKG5vZGVuYW1lKSwKKwkJCSAgICAgMCk7CisKKwkvKiBzZXR1cCBuaSByZXBseSAqLworCW5vZGVuYW1lbGVuID0gbGVuID4gMCA/IGxlbiA6IDA7CisKKwkvKiBzZXR1cCBuaSBncm91cCAqLworCWlmIChjaGFuZ2VkIHx8IGZvcmNlZCkgeworCQlpZiAobm9kZW5hbWVsZW4pIHsKKwkJCW1lbXNldCgmbmlncm91cCwgMCwgc2l6ZW9mKG5pZ3JvdXApKTsKKwkJCW5vZGVpbmZvX2dyb3VwKG5vZGVuYW1lLCBsZW4sICZuaWdyb3VwLmlwdjZtcl9tdWx0aWFkZHIpOworCQkJbmlncm91cC5pcHY2bXJfaW50ZXJmYWNlID0gMDsKKwkJCWlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9KT0lOX0dST1VQLCAmbmlncm91cCwgc2l6ZW9mKG5pZ3JvdXApKSA8IDApIHsKKyNpZiBFTkFCTEVfREVCVUcKKwkJCQljaGFyIG5pYWRkcmJ1ZltJTkVUNl9BRERSU1RSTEVOXTsKKwkJCQlpZiAoaW5ldF9udG9wKEFGX0lORVQ2LCAmbmlncm91cCwgbmlhZGRyYnVmLCBzaXplb2YobmlhZGRyYnVmKSkgPT0gTlVMTCkKKwkJCQkJc3RyY3B5KG5pYWRkcmJ1ZiwgIj8/PyIpOworI2VuZGlmCisJCQkJREVCVUcoTE9HX1dBUk5JTkcsCisJCQkJICAgICAgIiVzKCk6IGZhaWxlZCB0byBqb2luIGdyb3VwICVzLlxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXywgbmlhZGRyYnVmKTsKKwkJCQltZW1zZXQoJm5pZ3JvdXAsIDAsIHNpemVvZihuaWdyb3VwKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQltZW1zZXQoJm5pZ3JvdXAsIDAsIHNpemVvZihuaWdyb3VwKSk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0gKi8KKy8qIG5vZGVuYW1lICovCitpbnQgcHJfbm9kZWluZm9fbm9kZW5hbWUoQ0hFQ0tBTkRGSUxMX0FSR1MpCit7CisJREVCVUcoTE9HX0RFQlVHLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKHN1YmplY3QpIHsKKwkJaWYgKCFub2RlbmFtZWxlbiB8fAorCQkgICAgY29tcGFyZV9kbnNuYW1lKHN1YmplY3QsIHN1YmpsZW4sIAorCQkJCSAgICBub2RlbmFtZSwgCisJCQkJICAgIG5vZGVuYW1lbGVuKSkKKwkJCXJldHVybiAxOworCQlpZiAoc3Vial9pZikKKwkJCSpzdWJqX2lmID0gcC0+cGt0aW5mby5pcGk2X2lmaW5kZXg7CisJfQorCisJaWYgKHJlcGx5KSB7CisJCXVpbnQzMl90IHR0bCA9IDA7CisKKwkJcC0+cmVwbHkubmlfdHlwZSA9IElDTVA2X05JX1JFUExZOworCQlwLT5yZXBseS5uaV9jb2RlID0gSUNNUDZfTklfU1VDQ0VTUzsKKwkJcC0+cmVwbHkubmlfY2tzdW0gPSAwOworCQlwLT5yZXBseS5uaV9xdHlwZSA9IGh0b25zKE5JX1FUWVBFX0ROU05BTUUpOworCQlwLT5yZXBseS5uaV9mbGFncyA9IDA7CisKKwkJcC0+cmVwbHlkYXRhbGVuID0gbm9kZW5hbWVsZW4gPyBzaXplb2YodHRsKStub2RlbmFtZWxlbiA6IDA7CisJCXAtPnJlcGx5ZGF0YSA9IG5vZGVuYW1lbGVuID8gbmlfbWFsbG9jKHAtPnJlcGx5ZGF0YWxlbikgOiBOVUxMOworCQlpZiAocC0+cmVwbHlkYXRhKSB7CisJCQltZW1jcHkocC0+cmVwbHlkYXRhLCAmdHRsLCBzaXplb2YodHRsKSk7CisJCQltZW1jcHkocC0+cmVwbHlkYXRhICsgc2l6ZW9mKHR0bCksICZub2RlbmFtZSwgbm9kZW5hbWVsZW4pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2lwdXRpbHMvcGluZy5jIGIvaXB1dGlscy9waW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0ZTA0MAotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvcGluZy5jCkBAIC0wLDAgKzEsMTQzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBNaWtlIE11dXNzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitjaGFyIGNvcHlyaWdodFtdID0KKyJAKCMpIENvcHlyaWdodCAoYykgMTk4OSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iOworI2VuZGlmIC8qIG5vdCBsaW50ICovCisKKy8qCisgKgkJCVAgSSBOIEcgLiBDCisgKgorICogVXNpbmcgdGhlIEludGVyTmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCAoSUNNUCkgIkVDSE8iIGZhY2lsaXR5LAorICogbWVhc3VyZSByb3VuZC10cmlwLWRlbGF5cyBhbmQgcGFja2V0IGxvc3MgYWNyb3NzIG5ldHdvcmsgcGF0aHMuCisgKgorICogQXV0aG9yIC0KKyAqCU1pa2UgTXV1c3MKKyAqCVUuIFMuIEFybXkgQmFsbGlzdGljIFJlc2VhcmNoIExhYm9yYXRvcnkKKyAqCURlY2VtYmVyLCAxOTgzCisgKgorICogU3RhdHVzIC0KKyAqCVB1YmxpYyBEb21haW4uICBEaXN0cmlidXRpb24gVW5saW1pdGVkLgorICogQnVncyAtCisgKglNb3JlIHN0YXRpc3RpY3MgY291bGQgYWx3YXlzIGJlIGdhdGhlcmVkLgorICoJVGhpcyBwcm9ncmFtIGhhcyB0byBydW4gU1VJRCB0byBST09UIHRvIGFjY2VzcyB0aGUgSUNNUCBzb2NrZXQuCisgKi8KKworI2luY2x1ZGUgInBpbmdfY29tbW9uLmgiCisKKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaWZuZGVmIFdJVEhPVVRfSUZBRERSUworI2luY2x1ZGUgPGlmYWRkcnMuaD4KKyNlbmRpZgorCisjaWZuZGVmIElDTVBfRklMVEVSCisjZGVmaW5lIElDTVBfRklMVEVSCTEKK3N0cnVjdCBpY21wX2ZpbHRlciB7CisJX191MzIJZGF0YTsKK307CisjZW5kaWYKKworI2RlZmluZQlNQVhJUExFTgk2MAorI2RlZmluZQlNQVhJQ01QTEVOCTc2CisjZGVmaW5lCU5ST1VURVMJCTkJCS8qIG51bWJlciBvZiByZWNvcmQgcm91dGUgc2xvdHMgKi8KKyNkZWZpbmUgVE9TX01BWAkJMjU1CQkvKiA4LWJpdCBUT1MgZmllbGQgKi8KKyNkZWZpbmUgTUFYX0hPU1ROQU1FTEVOCU5JX01BWEhPU1QKKworCitzdGF0aWMgaW50IHRzX3R5cGU7CitzdGF0aWMgaW50IG5yb3V0ZSA9IDA7CitzdGF0aWMgX191MzIgcm91dGVbMTBdOworCisKKworc3RydWN0IHNvY2thZGRyX2luIHdoZXJldG87CS8qIHdobyB0byBwaW5nICovCitpbnQgb3B0bGVuID0gMDsKK2ludCBzZXR0b3MgPSAwOwkJCS8qIFNldCBUT1MsIFByZWNlbmRlbmNlIG9yIG90aGVyIFFPUyBvcHRpb25zICovCitpbnQgaWNtcF9zb2NrOwkJCS8qIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KK3VfY2hhciBvdXRwYWNrWzB4MTAwMDBdOworaW50IG1heHBhY2tldCA9IHNpemVvZihvdXRwYWNrKTsKKworc3RhdGljIGludCBicm9hZGNhc3RfcGluZ3MgPSAwOworCitzdGF0aWMgY2hhciAqcHJfYWRkcihfX3UzMik7CitzdGF0aWMgdm9pZCBwcl9vcHRpb25zKHVuc2lnbmVkIGNoYXIgKiBjcCwgaW50IGhsZW4pOworc3RhdGljIHZvaWQgcHJfaXBoKHN0cnVjdCBpcGhkciAqaXApOworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3N0YXRpYyB1X3Nob3J0IGluX2Nrc3VtKGNvbnN0IHVfc2hvcnQgKmFkZHIsIGludCBsZW4sIHVfc2hvcnQgc2FsdCk7CitzdGF0aWMgdm9pZCBwcl9pY21waChfX3U4IHR5cGUsIF9fdTggY29kZSwgX191MzIgaW5mbywgc3RydWN0IGljbXBoZHIgKmljcCk7CitzdGF0aWMgaW50IHBhcnNldG9zKGNoYXIgKnN0cik7CisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBjbXNnaGRyIGNtOworCXN0cnVjdCBpbl9wa3RpbmZvIGlwaTsKK30gY21zZyA9IHsge3NpemVvZihzdHJ1Y3QgY21zZ2hkcikgKyBzaXplb2Yoc3RydWN0IGluX3BrdGluZm8pLCBTT0xfSVAsIElQX1BLVElORk99LAorCSAgIHswLCB9fTsKK2ludCBjbXNnX2xlbjsKKworc3RydWN0IHNvY2thZGRyX2luIHNvdXJjZTsKK2NoYXIgKmRldmljZTsKK2ludCBwbXR1ZGlzYyA9IC0xOworCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGhvc3RlbnQgKmhwOworCWludCBjaCwgaG9sZCwgcGFja2xlbjsKKwlpbnQgc29ja2V0X2Vycm5vID0gMDsKKwl1X2NoYXIgKnBhY2tldDsKKwljaGFyICp0YXJnZXQ7CisjaWZkZWYgVVNFX0lETgorCWNoYXIgKmhuYW1lYnVmID0gTlVMTDsKKyNlbHNlCisJY2hhciBobmFtZWJ1ZltNQVhfSE9TVE5BTUVMRU5dOworI2VuZGlmCisJY2hhciByc3BhY2VbMyArIDQgKiBOUk9VVEVTICsgMV07CS8qIHJlY29yZCByb3V0ZSBzcGFjZSAqLworCisjaWZkZWYgQU5EUk9JRAorCWFuZHJvaWRfY2hlY2tfc2VjdXJpdHkoKTsKKyNlbmRpZgorCisJbGltaXRfY2FwYWJpbGl0aWVzKCk7CisKKyNpZmRlZiBVU0VfSUROCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworI2VuZGlmCisKKwlpY21wX3NvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19JQ01QKTsKKwlpZiAoaWNtcF9zb2NrIDwgMCkgeworCQllbmFibGVfY2FwYWJpbGl0eV9yYXcoKTsKKwkJaWNtcF9zb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApOworCQlzb2NrZXRfZXJybm8gPSBlcnJubzsKKwkJZGlzYWJsZV9jYXBhYmlsaXR5X3JhdygpOworCQl1c2luZ19waW5nX3NvY2tldCA9IDA7CisJfQorCisJc291cmNlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisJcHJlbG9hZCA9IDE7CisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCBDT01NT05fT1BUU1RSICJiUlQ6IikpICE9IEVPRikgeworCQlzd2l0Y2goY2gpIHsKKwkJY2FzZSAnYic6CisJCQlicm9hZGNhc3RfcGluZ3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ1EnOgorCQkJc2V0dG9zID0gcGFyc2V0b3Mob3B0YXJnKTsKKwkJCWlmIChzZXR0b3MgJiYKKwkJCSAgICAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVAsIElQX1RPUywKKwkJCQkJKGNoYXIgKikmc2V0dG9zLCBzaXplb2YoaW50KSkgPCAwKSkgeworCQkJCXBlcnJvcigicGluZzogZXJyb3Igc2V0dGluZyBRT1Mgc29ja29wdHMiKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1InOgorCQkJaWYgKG9wdGlvbnMgJiBGX1RJTUVTVEFNUCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiT25seSBvbmUgb2YgLVQgb3IgLVIgbWF5IGJlIHVzZWRcbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlvcHRpb25zIHw9IEZfUlJPVVRFOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJaWYgKG9wdGlvbnMgJiBGX1JST1VURSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiT25seSBvbmUgb2YgLVQgb3IgLVIgbWF5IGJlIHVzZWRcbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlvcHRpb25zIHw9IEZfVElNRVNUQU1QOworCQkJaWYgKHN0cmNtcChvcHRhcmcsICJ0c29ubHkiKSA9PSAwKQorCQkJCXRzX3R5cGUgPSBJUE9QVF9UU19UU09OTFk7CisJCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAidHNhbmRhZGRyIikgPT0gMCkKKwkJCQl0c190eXBlID0gSVBPUFRfVFNfVFNBTkRBRERSOworCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgInRzcHJlc3BlYyIpID09IDApCisJCQkJdHNfdHlwZSA9IElQT1BUX1RTX1BSRVNQRUM7CisJCQllbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgdGltZXN0YW1wIHR5cGVcbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnSSc6CisJCXsKKyNpZiAwCisJCQljaGFyIGR1bW15OworCQkJaW50IGkxLCBpMiwgaTMsIGk0OworCisJCQlpZiAoc3NjYW5mKG9wdGFyZywgIiV1LiV1LiV1LiV1JWMiLAorCQkJCSAgICZpMSwgJmkyLCAmaTMsICZpNCwgJmR1bW15KSA9PSA0KSB7CisJCQkJX191OCAqcHRyOworCQkJCXB0ciA9IChfX3U4Kikmc291cmNlLnNpbl9hZGRyOworCQkJCXB0clswXSA9IGkxOworCQkJCXB0clsxXSA9IGkyOworCQkJCXB0clsyXSA9IGkzOworCQkJCXB0clszXSA9IGk0OworCQkJCW9wdGlvbnMgfD0gRl9TVFJJQ1RTT1VSQ0U7CisJCQl9IGVsc2UgeworCQkJCWRldmljZSA9IG9wdGFyZzsKKwkJCX0KKyNlbHNlCisJCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQsIG9wdGFyZywgJnNvdXJjZS5zaW5fYWRkcikgPiAwKQorCQkJCW9wdGlvbnMgfD0gRl9TVFJJQ1RTT1VSQ0U7CisJCQllbHNlCisJCQkJZGV2aWNlID0gb3B0YXJnOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQljYXNlICdNJzoKKwkJCWlmIChzdHJjbXAob3B0YXJnLCAiZG8iKSA9PSAwKQorCQkJCXBtdHVkaXNjID0gSVBfUE1UVURJU0NfRE87CisJCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZG9udCIpID09IDApCisJCQkJcG10dWRpc2MgPSBJUF9QTVRVRElTQ19ET05UOworCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIndhbnQiKSA9PSAwKQorCQkJCXBtdHVkaXNjID0gSVBfUE1UVURJU0NfV0FOVDsKKwkJCWVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAicGluZzogd3JvbmcgdmFsdWUgZm9yIC1NOiBkbywgZG9udCwgd2FudCBhcmUgdmFsaWQgb25lcy5cbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlwcmludGYoInBpbmcgdXRpbGl0eSwgaXB1dGlscy0lc1xuIiwgU05BUFNIT1QpOworCQkJZXhpdCgwKTsKKwkJQ09NTU9OX09QVElPTlMKKwkJCWNvbW1vbl9vcHRpb25zKGNoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJfQorCX0KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmdjID09IDApCisJCXVzYWdlKCk7CisJaWYgKGFyZ2MgPiAxKSB7CisJCWlmIChvcHRpb25zICYgRl9SUk9VVEUpCisJCQl1c2FnZSgpOworCQllbHNlIGlmIChvcHRpb25zICYgRl9USU1FU1RBTVApIHsKKwkJCWlmICh0c190eXBlICE9IElQT1BUX1RTX1BSRVNQRUMpCisJCQkJdXNhZ2UoKTsKKwkJCWlmIChhcmdjID4gNSkKKwkJCQl1c2FnZSgpOworCQl9IGVsc2UgeworCQkJaWYgKGFyZ2MgPiAxMCkKKwkJCQl1c2FnZSgpOworCQkJb3B0aW9ucyB8PSBGX1NPVVJDRVJPVVRFOworCQl9CisJfQorCXdoaWxlIChhcmdjID4gMCkgeworCQl0YXJnZXQgPSAqYXJndjsKKworCQltZW1zZXQoKGNoYXIgKikmd2hlcmV0bywgMCwgc2l6ZW9mKHdoZXJldG8pKTsKKwkJd2hlcmV0by5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJaWYgKGluZXRfYXRvbih0YXJnZXQsICZ3aGVyZXRvLnNpbl9hZGRyKSA9PSAxKSB7CisJCQlob3N0bmFtZSA9IHRhcmdldDsKKwkJCWlmIChhcmdjID09IDEpCisJCQkJb3B0aW9ucyB8PSBGX05VTUVSSUM7CisJCX0gZWxzZSB7CisJCQljaGFyICppZG47CisjaWZkZWYgVVNFX0lETgorCQkJaW50IHJjOworCisJCQlpZiAoaG5hbWVidWYpIHsKKwkJCQlmcmVlKGhuYW1lYnVmKTsKKwkJCQlobmFtZWJ1ZiA9IE5VTEw7CisJCQl9CisKKwkJCXJjID0gaWRuYV90b19hc2NpaV9seih0YXJnZXQsICZpZG4sIDApOworCQkJaWYgKHJjICE9IElETkFfU1VDQ0VTUykgeworCQkJCWZwcmludGYoc3RkZXJyLCAicGluZzogSUROIGVuY29kaW5nIGZhaWxlZDogJXNcbiIsIGlkbmFfc3RyZXJyb3IocmMpKTsKKwkJCQlleGl0KDIpOworCQkJfQorI2Vsc2UKKwkJCWlkbiA9IHRhcmdldDsKKyNlbmRpZgorCQkJaHAgPSBnZXRob3N0YnluYW1lKGlkbik7CisJCQlpZiAoIWhwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiB1bmtub3duIGhvc3QgJXNcbiIsIHRhcmdldCk7CisJCQkJZXhpdCgyKTsKKwkJCX0KKyNpZmRlZiBVU0VfSUROCisJCQlmcmVlKGlkbik7CisjZW5kaWYKKwkJCW1lbWNweSgmd2hlcmV0by5zaW5fYWRkciwgaHAtPmhfYWRkciwgNCk7CisjaWZkZWYgVVNFX0lETgorCQkJaWYgKGlkbmFfdG9fdW5pY29kZV9semx6KGhwLT5oX25hbWUsICZobmFtZWJ1ZiwgMCkgIT0gSUROQV9TVUNDRVNTKSB7CisJCQkJaG5hbWVidWYgPSBzdHJkdXAoaHAtPmhfbmFtZSk7CisJCQkJaWYgKCFobmFtZWJ1ZikgeworCQkJCQlwZXJyb3IoInBpbmc6IHN0cmR1cCIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQl9CisjZWxzZQorCQkJc3RybmNweShobmFtZWJ1ZiwgaHAtPmhfbmFtZSwgc2l6ZW9mKGhuYW1lYnVmKSAtIDEpOworCQkJaG5hbWVidWZbc2l6ZW9mKGhuYW1lYnVmKSAtIDFdID0gMDsKKyNlbmRpZgorCQkJaG9zdG5hbWUgPSBobmFtZWJ1ZjsKKwkJfQorCQlpZiAoYXJnYyA+IDEpCisJCQlyb3V0ZVtucm91dGUrK10gPSB3aGVyZXRvLnNpbl9hZGRyLnNfYWRkcjsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCisJaWYgKHNvdXJjZS5zaW5fYWRkci5zX2FkZHIgPT0gMCkgeworCQlzb2NrbGVuX3QgYWxlbjsKKwkJc3RydWN0IHNvY2thZGRyX2luIGRzdCA9IHdoZXJldG87CisJCWludCBwcm9iZV9mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKworCQlpZiAocHJvYmVfZmQgPCAwKSB7CisJCQlwZXJyb3IoInNvY2tldCIpOworCQkJZXhpdCgyKTsKKwkJfQorCQlpZiAoZGV2aWNlKSB7CisJCQlzdHJ1Y3QgaWZyZXEgaWZyOworCQkJaW50IHJjOworCisJCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCQkJc3RybmNweShpZnIuaWZyX25hbWUsIGRldmljZSwgSUZOQU1TSVotMSk7CisKKwkJCWVuYWJsZV9jYXBhYmlsaXR5X3JhdygpOworCQkJcmMgPSBzZXRzb2Nrb3B0KHByb2JlX2ZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIGRldmljZSwgc3RybGVuKGRldmljZSkrMSk7CisJCQlkaXNhYmxlX2NhcGFiaWxpdHlfcmF3KCk7CisKKwkJCWlmIChyYyA9PSAtMSkgeworCQkJCWlmIChJTl9NVUxUSUNBU1QobnRvaGwoZHN0LnNpbl9hZGRyLnNfYWRkcikpKSB7CisJCQkJCXN0cnVjdCBpcF9tcmVxbiBpbXI7CisJCQkJCWlmIChpb2N0bChwcm9iZV9mZCwgU0lPQ0dJRklOREVYLCAmaWZyKSA8IDApIHsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAicGluZzogdW5rbm93biBpZmFjZSAlc1xuIiwgZGV2aWNlKTsKKwkJCQkJCWV4aXQoMik7CisJCQkJCX0KKwkJCQkJbWVtc2V0KCZpbXIsIDAsIHNpemVvZihpbXIpKTsKKwkJCQkJaW1yLmltcl9pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworCQkJCQlpZiAoc2V0c29ja29wdChwcm9iZV9mZCwgU09MX0lQLCBJUF9NVUxUSUNBU1RfSUYsICZpbXIsIHNpemVvZihpbXIpKSA9PSAtMSkgeworCQkJCQkJcGVycm9yKCJwaW5nOiBJUF9NVUxUSUNBU1RfSUYiKTsKKwkJCQkJCWV4aXQoMik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwZXJyb3IoInBpbmc6IFNPX0JJTkRUT0RFVklDRSIpOworCQkJCQlleGl0KDIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChzZXR0b3MgJiYKKwkJICAgIHNldHNvY2tvcHQocHJvYmVfZmQsIElQUFJPVE9fSVAsIElQX1RPUywgKGNoYXIgKikmc2V0dG9zLCBzaXplb2YoaW50KSkgPCAwKQorCQkJcGVycm9yKCJXYXJuaW5nOiBlcnJvciBzZXR0aW5nIFFPUyBzb2Nrb3B0cyIpOworCisJCWRzdC5zaW5fcG9ydCA9IGh0b25zKDEwMjUpOworCQlpZiAobnJvdXRlKQorCQkJZHN0LnNpbl9hZGRyLnNfYWRkciA9IHJvdXRlWzBdOworCisJCXNvY2tfc2V0bWFyayhwcm9iZV9mZCk7CisKKwkJaWYgKGNvbm5lY3QocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZkc3QsIHNpemVvZihkc3QpKSA9PSAtMSkgeworCQkJaWYgKGVycm5vID09IEVBQ0NFUykgeworCQkJCWlmIChicm9hZGNhc3RfcGluZ3MgPT0gMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkRvIHlvdSB3YW50IHRvIHBpbmcgYnJvYWRjYXN0PyBUaGVuIC1iXG4iKTsKKwkJCQkJZXhpdCgyKTsKKwkJCQl9CisJCQkJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBwaW5naW5nIGJyb2FkY2FzdCBhZGRyZXNzXG4iKTsKKwkJCQlpZiAoc2V0c29ja29wdChwcm9iZV9mZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULAorCQkJCQkgICAgICAgJmJyb2FkY2FzdF9waW5ncywgc2l6ZW9mKGJyb2FkY2FzdF9waW5ncykpIDwgMCkgeworCQkJCQlwZXJyb3IgKCJjYW4ndCBzZXQgYnJvYWRjYXN0aW5nIik7CisJCQkJCWV4aXQoMik7CisJCQkJfQorCQkJCWlmIChjb25uZWN0KHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyKikmZHN0LCBzaXplb2YoZHN0KSkgPT0gLTEpIHsKKwkJCQkJcGVycm9yKCJjb25uZWN0Iik7CisJCQkJCWV4aXQoMik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwZXJyb3IoImNvbm5lY3QiKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQl9CisJCWFsZW4gPSBzaXplb2Yoc291cmNlKTsKKwkJaWYgKGdldHNvY2tuYW1lKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyKikmc291cmNlLCAmYWxlbikgPT0gLTEpIHsKKwkJCXBlcnJvcigiZ2V0c29ja25hbWUiKTsKKwkJCWV4aXQoMik7CisJCX0KKwkJc291cmNlLnNpbl9wb3J0ID0gMDsKKworI2lmbmRlZiBXSVRIT1VUX0lGQUREUlMKKwkJaWYgKGRldmljZSkgeworCQkJc3RydWN0IGlmYWRkcnMgKmlmYTAsICppZmE7CisJCQlpbnQgcmV0OworCisJCQlyZXQgPSBnZXRpZmFkZHJzKCZpZmEwKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdhdGlmYWRkcnMoKSBmYWlsZWQuXG4iKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJZm9yIChpZmEgPSBpZmEwOyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKKwkJCQlpZiAoIWlmYS0+aWZhX2FkZHIgfHwgaWZhLT5pZmFfYWRkci0+c2FfZmFtaWx5ICE9IEFGX0lORVQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghc3RybmNtcChpZmEtPmlmYV9uYW1lLCBkZXZpY2UsIHNpemVvZihkZXZpY2UpIC0gMSkgJiYKKwkJCQkgICAgIW1lbWNtcCgmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilpZmEtPmlmYV9hZGRyKS0+c2luX2FkZHIsCisJCQkJCSAgICAmc291cmNlLnNpbl9hZGRyLCBzaXplb2Yoc291cmNlLnNpbl9hZGRyKSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJZnJlZWlmYWRkcnMoaWZhMCk7CisJCQlpZiAoIWlmYSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IFdhcm5pbmc6IHNvdXJjZSBhZGRyZXNzIG1pZ2h0IGJlIHNlbGVjdGVkIG9uIGRldmljZSBvdGhlciB0aGFuICVzLlxuIiwgZGV2aWNlKTsKKwkJfQorI2VuZGlmCisJCWNsb3NlKHByb2JlX2ZkKTsKKwl9IHdoaWxlICgwKTsKKworCWlmICh3aGVyZXRvLnNpbl9hZGRyLnNfYWRkciA9PSAwKQorCQl3aGVyZXRvLnNpbl9hZGRyLnNfYWRkciA9IHNvdXJjZS5zaW5fYWRkci5zX2FkZHI7CisKKwlpZiAoaWNtcF9zb2NrIDwgMCkgeworCQllcnJubyA9IHNvY2tldF9lcnJubzsKKwkJcGVycm9yKCJwaW5nOiBpY21wIG9wZW4gc29ja2V0Iik7CisJCWV4aXQoMik7CisJfQorCisJaWYgKGRldmljZSkgeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworCisJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXZpY2UsIElGTkFNU0laLTEpOworCQlpZiAoaW9jdGwoaWNtcF9zb2NrLCBTSU9DR0lGSU5ERVgsICZpZnIpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiB1bmtub3duIGlmYWNlICVzXG4iLCBkZXZpY2UpOworCQkJZXhpdCgyKTsKKwkJfQorCQljbXNnLmlwaS5pcGlfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKwkJY21zZ19sZW4gPSBzaXplb2YoY21zZyk7CisJfQorCisJaWYgKGJyb2FkY2FzdF9waW5ncyB8fCBJTl9NVUxUSUNBU1QobnRvaGwod2hlcmV0by5zaW5fYWRkci5zX2FkZHIpKSkgeworCQlpZiAodWlkKSB7CisJCQlpZiAoaW50ZXJ2YWwgPCAxMDAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBicm9hZGNhc3QgcGluZyB3aXRoIHRvbyBzaG9ydCBpbnRlcnZhbC5cbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlpZiAocG10dWRpc2MgPj0gMCAmJiBwbXR1ZGlzYyAhPSBJUF9QTVRVRElTQ19ETykgeworCQkJCWZwcmludGYoc3RkZXJyLCAicGluZzogYnJvYWRjYXN0IHBpbmcgZG9lcyBub3QgZnJhZ21lbnQuXG4iKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQl9CisJCWlmIChwbXR1ZGlzYyA8IDApCisJCQlwbXR1ZGlzYyA9IElQX1BNVFVESVNDX0RPOworCX0KKworCWlmIChwbXR1ZGlzYyA+PSAwKSB7CisJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX0lQLCBJUF9NVFVfRElTQ09WRVIsICZwbXR1ZGlzYywgc2l6ZW9mKHBtdHVkaXNjKSkgPT0gLTEpIHsKKwkJCXBlcnJvcigicGluZzogSVBfTVRVX0RJU0NPVkVSIik7CisJCQlleGl0KDIpOworCQl9CisJfQorCisJaWYgKChvcHRpb25zJkZfU1RSSUNUU09VUkNFKSAmJgorCSAgICBiaW5kKGljbXBfc29jaywgKHN0cnVjdCBzb2NrYWRkciopJnNvdXJjZSwgc2l6ZW9mKHNvdXJjZSkpID09IC0xKSB7CisJCXBlcnJvcigiYmluZCIpOworCQlleGl0KDIpOworCX0KKworCWlmICghdXNpbmdfcGluZ19zb2NrZXQpIHsKKwkJc3RydWN0IGljbXBfZmlsdGVyIGZpbHQ7CisJCWZpbHQuZGF0YSA9IH4oKDE8PElDTVBfU09VUkNFX1FVRU5DSCl8CisJCQkgICAgICAoMTw8SUNNUF9ERVNUX1VOUkVBQ0gpfAorCQkJICAgICAgKDE8PElDTVBfVElNRV9FWENFRURFRCl8CisJCQkgICAgICAoMTw8SUNNUF9QQVJBTUVURVJQUk9CKXwKKwkJCSAgICAgICgxPDxJQ01QX1JFRElSRUNUKXwKKwkJCSAgICAgICgxPDxJQ01QX0VDSE9SRVBMWSkpOworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9SQVcsIElDTVBfRklMVEVSLCAoY2hhciopJmZpbHQsIHNpemVvZihmaWx0KSkgPT0gLTEpCisJCQlwZXJyb3IoIldBUk5JTkc6IHNldHNvY2tvcHQoSUNNUF9GSUxURVIpIik7CisJfQorCisJaG9sZCA9IDE7CisJaWYgKHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfSVAsIElQX1JFQ1ZFUlIsIChjaGFyICopJmhvbGQsIHNpemVvZihob2xkKSkpCisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogeW91ciBrZXJuZWwgaXMgdmVlZXJ5IG9sZC4gTm8gcHJvYmxlbXMuXG4iKTsKKwlpZiAodXNpbmdfcGluZ19zb2NrZXQpIHsKKwkJaWYgKHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfSVAsIElQX1JFQ1ZUVEwsIChjaGFyICopJmhvbGQsIHNpemVvZihob2xkKSkpCisJCQlwZXJyb3IoIldBUk5JTkc6IHNldHNvY2tvcHQoSVBfUkVDVlRUTCkiKTsKKwkJaWYgKHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfSVAsIElQX1JFVE9QVFMsIChjaGFyICopJmhvbGQsIHNpemVvZihob2xkKSkpCisJCQlwZXJyb3IoIldBUk5JTkc6IHNldHNvY2tvcHQoSVBfUkVUT1BUUykiKTsKKwl9CisKKwkvKiByZWNvcmQgcm91dGUgb3B0aW9uICovCisJaWYgKG9wdGlvbnMgJiBGX1JST1VURSkgeworCQltZW1zZXQocnNwYWNlLCAwLCBzaXplb2YocnNwYWNlKSk7CisJCXJzcGFjZVswXSA9IElQT1BUX05PUDsKKwkJcnNwYWNlWzErSVBPUFRfT1BUVkFMXSA9IElQT1BUX1JSOworCQlyc3BhY2VbMStJUE9QVF9PTEVOXSA9IHNpemVvZihyc3BhY2UpLTE7CisJCXJzcGFjZVsxK0lQT1BUX09GRlNFVF0gPSBJUE9QVF9NSU5PRkY7CisJCW9wdGxlbiA9IDQwOworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVAsIElQX09QVElPTlMsIHJzcGFjZSwgc2l6ZW9mKHJzcGFjZSkpIDwgMCkgeworCQkJcGVycm9yKCJwaW5nOiByZWNvcmQgcm91dGUiKTsKKwkJCWV4aXQoMik7CisJCX0KKwl9CisJaWYgKG9wdGlvbnMgJiBGX1RJTUVTVEFNUCkgeworCQltZW1zZXQocnNwYWNlLCAwLCBzaXplb2YocnNwYWNlKSk7CisJCXJzcGFjZVswXSA9IElQT1BUX1RJTUVTVEFNUDsKKwkJcnNwYWNlWzFdID0gKHRzX3R5cGU9PUlQT1BUX1RTX1RTT05MWSA/IDQwIDogMzYpOworCQlyc3BhY2VbMl0gPSA1OworCQlyc3BhY2VbM10gPSB0c190eXBlOworCQlpZiAodHNfdHlwZSA9PSBJUE9QVF9UU19QUkVTUEVDKSB7CisJCQlpbnQgaTsKKwkJCXJzcGFjZVsxXSA9IDQrbnJvdXRlKjg7CisJCQlmb3IgKGk9MDsgaTxucm91dGU7IGkrKykKKwkJCQkqKF9fdTMyKikmcnNwYWNlWzQraSo4XSA9IHJvdXRlW2ldOworCQl9CisJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgSVBQUk9UT19JUCwgSVBfT1BUSU9OUywgcnNwYWNlLCByc3BhY2VbMV0pIDwgMCkgeworCQkJcnNwYWNlWzNdID0gMjsKKwkJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgSVBQUk9UT19JUCwgSVBfT1BUSU9OUywgcnNwYWNlLCByc3BhY2VbMV0pIDwgMCkgeworCQkJCXBlcnJvcigicGluZzogdHMgb3B0aW9uIik7CisJCQkJZXhpdCgyKTsKKwkJCX0KKwkJfQorCQlvcHRsZW4gPSA0MDsKKwl9CisJaWYgKG9wdGlvbnMgJiBGX1NPVVJDRVJPVVRFKSB7CisJCWludCBpOworCQltZW1zZXQocnNwYWNlLCAwLCBzaXplb2YocnNwYWNlKSk7CisJCXJzcGFjZVswXSA9IElQT1BUX05PT1A7CisJCXJzcGFjZVsxK0lQT1BUX09QVFZBTF0gPSAob3B0aW9ucyAmIEZfU09fRE9OVFJPVVRFKSA/IElQT1BUX1NTUlIKKwkJCTogSVBPUFRfTFNSUjsKKwkJcnNwYWNlWzErSVBPUFRfT0xFTl0gPSAzICsgbnJvdXRlKjQ7CisJCXJzcGFjZVsxK0lQT1BUX09GRlNFVF0gPSBJUE9QVF9NSU5PRkY7CisJCWZvciAoaT0wOyBpPG5yb3V0ZTsgaSsrKQorCQkJKihfX3UzMiopJnJzcGFjZVs0K2kqNF0gPSByb3V0ZVtpXTsKKworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVAsIElQX09QVElPTlMsIHJzcGFjZSwgNCArIG5yb3V0ZSo0KSA8IDApIHsKKwkJCXBlcnJvcigicGluZzogcmVjb3JkIHJvdXRlIik7CisJCQlleGl0KDIpOworCQl9CisJCW9wdGxlbiA9IDQwOworCX0KKworCS8qIEVzdGltYXRlIG1lbW9yeSBlYXRlbiBieSBzaW5nbGUgcGFja2V0LiBJdCBpcyByb3VnaCBlc3RpbWF0ZS4KKwkgKiBBY3R1YWxseSwgZm9yIHNtYWxsIGRhdGFsZW4ncyBpdCBkZXBlbmRzIG9uIGtlcm5lbCBzaWRlIGEgbG90LiAqLworCWhvbGQgPSBkYXRhbGVuICsgODsKKwlob2xkICs9ICgoaG9sZCs1MTEpLzUxMikqKG9wdGxlbiArIDIwICsgMTYgKyA2NCArIDE2MCk7CisJc29ja19zZXRidWZzKGljbXBfc29jaywgaG9sZCk7CisKKwlpZiAoYnJvYWRjYXN0X3BpbmdzKSB7CisJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULAorCQkJICAgICAgICZicm9hZGNhc3RfcGluZ3MsIHNpemVvZihicm9hZGNhc3RfcGluZ3MpKSA8IDApIHsKKwkJCXBlcnJvciAoInBpbmc6IGNhbid0IHNldCBicm9hZGNhc3RpbmciKTsKKwkJCWV4aXQoMik7CisJCX0KKwl9CisKKwlpZiAob3B0aW9ucyAmIEZfTk9MT09QKSB7CisJCWludCBsb29wID0gMDsKKwkJaWYgKHNldHNvY2tvcHQoaWNtcF9zb2NrLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfTE9PUCwKKwkJCQkJCQkmbG9vcCwgMSkgPT0gLTEpIHsKKwkJCXBlcnJvciAoInBpbmc6IGNhbid0IGRpc2FibGUgbXVsdGljYXN0IGxvb3BiYWNrIik7CisJCQlleGl0KDIpOworCQl9CisJfQorCWlmIChvcHRpb25zICYgRl9UVEwpIHsKKwkJaW50IGl0dGwgPSB0dGw7CisJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX1RUTCwKKwkJCQkJCQkmdHRsLCAxKSA9PSAtMSkgeworCQkJcGVycm9yICgicGluZzogY2FuJ3Qgc2V0IG11bHRpY2FzdCB0aW1lLXRvLWxpdmUiKTsKKwkJCWV4aXQoMik7CisJCX0KKwkJaWYgKHNldHNvY2tvcHQoaWNtcF9zb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsCisJCQkJCQkJJml0dGwsIHNpemVvZihpdHRsKSkgPT0gLTEpIHsKKwkJCXBlcnJvciAoInBpbmc6IGNhbid0IHNldCB1bmljYXN0IHRpbWUtdG8tbGl2ZSIpOworCQkJZXhpdCgyKTsKKwkJfQorCX0KKworCWlmIChkYXRhbGVuID4gMHhGRkZGIC0gOCAtIG9wdGxlbiAtIDIwKSB7CisJCWlmICh1aWQgfHwgZGF0YWxlbiA+IHNpemVvZihvdXRwYWNrKS04KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBwYWNrZXQgc2l6ZSAlZCBpcyB0b28gbGFyZ2UuIE1heGltdW0gaXMgJWRcbiIsIGRhdGFsZW4sIDB4RkZGRi04LTIwLW9wdGxlbik7CisJCQlleGl0KDIpOworCQl9CisJCS8qIEFsbG93IHNtYWxsIG92ZXJzaXplIHRvIHJvb3QgeWV0LiBJdCB3aWxsIGNhdXNlIEVNU0dTSVpFLiAqLworCQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IHBhY2tldCBzaXplICVkIGlzIHRvbyBsYXJnZS4gTWF4aW11bSBpcyAlZFxuIiwgZGF0YWxlbiwgMHhGRkZGLTgtMjAtb3B0bGVuKTsKKwl9CisKKwlpZiAoZGF0YWxlbiA+PSBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKQkvKiBjYW4gd2UgdGltZSB0cmFuc2ZlciAqLworCQl0aW1pbmcgPSAxOworCXBhY2tsZW4gPSBkYXRhbGVuICsgTUFYSVBMRU4gKyBNQVhJQ01QTEVOOworCWlmICghKHBhY2tldCA9ICh1X2NoYXIgKiltYWxsb2MoKHVfaW50KXBhY2tsZW4pKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IG91dCBvZiBtZW1vcnkuXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlwcmludGYoIlBJTkcgJXMgKCVzKSAiLCBob3N0bmFtZSwgaW5ldF9udG9hKHdoZXJldG8uc2luX2FkZHIpKTsKKwlpZiAoZGV2aWNlIHx8IChvcHRpb25zJkZfU1RSSUNUU09VUkNFKSkKKwkJcHJpbnRmKCJmcm9tICVzICVzOiAiLCBpbmV0X250b2Eoc291cmNlLnNpbl9hZGRyKSwgZGV2aWNlID86ICIiKTsKKwlwcmludGYoIiVkKCVkKSBieXRlcyBvZiBkYXRhLlxuIiwgZGF0YWxlbiwgZGF0YWxlbis4K29wdGxlbisyMCk7CisKKwlzZXR1cChpY21wX3NvY2spOworCisJbWFpbl9sb29wKGljbXBfc29jaywgcGFja2V0LCBwYWNrbGVuKTsKK30KKworCitpbnQgcmVjZWl2ZV9lcnJvcl9tc2coKQoreworCWludCByZXM7CisJY2hhciBjYnVmWzUxMl07CisJc3RydWN0IGlvdmVjICBpb3Y7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyICplOworCXN0cnVjdCBpY21waGRyIGljbXBoOworCXN0cnVjdCBzb2NrYWRkcl9pbiB0YXJnZXQ7CisJaW50IG5ldF9lcnJvcnMgPSAwOworCWludCBsb2NhbF9lcnJvcnMgPSAwOworCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCisJaW92Lmlvdl9iYXNlID0gJmljbXBoOworCWlvdi5pb3ZfbGVuID0gc2l6ZW9mKGljbXBoKTsKKwltc2cubXNnX25hbWUgPSAodm9pZCopJnRhcmdldDsKKwltc2cubXNnX25hbWVsZW4gPSBzaXplb2YodGFyZ2V0KTsKKwltc2cubXNnX2lvdiA9ICZpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCW1zZy5tc2dfY29udHJvbCA9IGNidWY7CisJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNidWYpOworCisJcmVzID0gcmVjdm1zZyhpY21wX3NvY2ssICZtc2csIE1TR19FUlJRVUVVRXxNU0dfRE9OVFdBSVQpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIG91dDsKKworCWUgPSBOVUxMOworCWZvciAoY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUigmbXNnLCBjbXNnKSkgeworCQlpZiAoY21zZy0+Y21zZ19sZXZlbCA9PSBTT0xfSVApIHsKKwkJCWlmIChjbXNnLT5jbXNnX3R5cGUgPT0gSVBfUkVDVkVSUikKKwkJCQllID0gKHN0cnVjdCBzb2NrX2V4dGVuZGVkX2VyciAqKUNNU0dfREFUQShjbXNnKTsKKwkJfQorCX0KKwlpZiAoZSA9PSBOVUxMKQorCQlhYm9ydCgpOworCisJaWYgKGUtPmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fTE9DQUwpIHsKKwkJbG9jYWxfZXJyb3JzKys7CisJCWlmIChvcHRpb25zICYgRl9RVUlFVCkKKwkJCWdvdG8gb3V0OworCQlpZiAob3B0aW9ucyAmIEZfRkxPT0QpCisJCQl3cml0ZV9zdGRvdXQoIkUiLCAxKTsKKwkJZWxzZSBpZiAoZS0+ZWVfZXJybm8gIT0gRU1TR1NJWkUpCisJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IGxvY2FsIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZS0+ZWVfZXJybm8pKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBsb2NhbCBlcnJvcjogTWVzc2FnZSB0b28gbG9uZywgbXR1PSV1XG4iLCBlLT5lZV9pbmZvKTsKKwkJbmVycm9ycysrOworCX0gZWxzZSBpZiAoZS0+ZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9JQ01QKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiopKGUrMSk7CisJCWludCBlcnJvcl9wa3Q7CisKKwkJaWYgKHJlcyA8IHNpemVvZihpY21waCkgfHwKKwkJICAgIHRhcmdldC5zaW5fYWRkci5zX2FkZHIgIT0gd2hlcmV0by5zaW5fYWRkci5zX2FkZHIgfHwKKwkJICAgIGljbXBoLnR5cGUgIT0gSUNNUF9FQ0hPIHx8CisJCSAgICAhaXNfb3VycyhpY21waC51bi5lY2hvLmlkKSkgeworCQkJLyogTm90IG91ciBlcnJvciwgbm90IGFuIGVycm9yIGF0IGFsbC4gQ2xlYXIuICovCisJCQlzYXZlZF9lcnJubyA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWVycm9yX3BrdCA9IChlLT5lZV90eXBlICE9IElDTVBfUkVESVJFQ1QgJiYKKwkJCSAgICAgZS0+ZWVfdHlwZSAhPSBJQ01QX1NPVVJDRV9RVUVOQ0gpOworCQlpZiAoZXJyb3JfcGt0KSB7CisJCQlhY2tub3dsZWRnZShudG9ocyhpY21waC51bi5lY2hvLnNlcXVlbmNlKSk7CisJCQluZXRfZXJyb3JzKys7CisJCQluZXJyb3JzKys7CisJCX0KKwkJZWxzZSB7CisJCQlzYXZlZF9lcnJubyA9IDA7CisJCX0KKworCQlpZiAoIXVzaW5nX3Bpbmdfc29ja2V0ICYmICF3b3JraW5nX3JlY3ZlcnIpIHsKKwkJCXN0cnVjdCBpY21wX2ZpbHRlciBmaWx0OworCQkJd29ya2luZ19yZWN2ZXJyID0gMTsKKwkJCS8qIE9LLCBpdCB3b3Jrcy4gQWRkIHN0cm9uZ2VyIGZpbHRlci4gKi8KKwkJCWZpbHQuZGF0YSA9IH4oKDE8PElDTVBfU09VUkNFX1FVRU5DSCl8CisJCQkJICAgICAgKDE8PElDTVBfUkVESVJFQ1QpfAorCQkJCSAgICAgICgxPDxJQ01QX0VDSE9SRVBMWSkpOworCQkJaWYgKHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfUkFXLCBJQ01QX0ZJTFRFUiwgKGNoYXIqKSZmaWx0LCBzaXplb2YoZmlsdCkpID09IC0xKQorCQkJCXBlcnJvcigiXHJXQVJOSU5HOiBzZXRzb2Nrb3B0KElDTVBfRklMVEVSKSIpOworCQl9CisKKwkJaWYgKG9wdGlvbnMgJiBGX1FVSUVUKQorCQkJZ290byBvdXQ7CisJCWlmIChvcHRpb25zICYgRl9GTE9PRCkgeworCQkJaWYgKGVycm9yX3BrdCkKKwkJCQl3cml0ZV9zdGRvdXQoIlxiRSIsIDIpOworCQl9IGVsc2UgeworCQkJcHJpbnRfdGltZXN0YW1wKCk7CisJCQlwcmludGYoIkZyb20gJXM6IGljbXBfc2VxPSV1ICIsIHByX2FkZHIoc2luLT5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhpY21waC51bi5lY2hvLnNlcXVlbmNlKSk7CisJCQlwcl9pY21waChlLT5lZV90eXBlLCBlLT5lZV9jb2RlLCBlLT5lZV9pbmZvLCBOVUxMKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQl9CisJfQorCitvdXQ6CisJZXJybm8gPSBzYXZlZF9lcnJubzsKKwlyZXR1cm4gbmV0X2Vycm9ycyA/IDogLWxvY2FsX2Vycm9yczsKK30KKworLyoKKyAqIHBpbmdlciAtLQorICogCUNvbXBvc2UgYW5kIHRyYW5zbWl0IGFuIElDTVAgRUNITyBSRVFVRVNUIHBhY2tldC4gIFRoZSBJUCBwYWNrZXQKKyAqIHdpbGwgYmUgYWRkZWQgb24gYnkgdGhlIGtlcm5lbC4gIFRoZSBJRCBmaWVsZCBpcyBvdXIgVU5JWCBwcm9jZXNzIElELAorICogYW5kIHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYW4gYXNjZW5kaW5nIGludGVnZXIuICBUaGUgZmlyc3QgOCBieXRlcworICogb2YgdGhlIGRhdGEgcG9ydGlvbiBhcmUgdXNlZCB0byBob2xkIGEgVU5JWCAidGltZXZhbCIgc3RydWN0IGluIFZBWAorICogYnl0ZS1vcmRlciwgdG8gY29tcHV0ZSB0aGUgcm91bmQtdHJpcCB0aW1lLgorICovCitpbnQgc2VuZF9wcm9iZSgpCit7CisJc3RydWN0IGljbXBoZHIgKmljcDsKKwlpbnQgY2M7CisJaW50IGk7CisKKwlpY3AgPSAoc3RydWN0IGljbXBoZHIgKilvdXRwYWNrOworCWljcC0+dHlwZSA9IElDTVBfRUNITzsKKwlpY3AtPmNvZGUgPSAwOworCWljcC0+Y2hlY2tzdW0gPSAwOworCWljcC0+dW4uZWNoby5zZXF1ZW5jZSA9IGh0b25zKG50cmFuc21pdHRlZCsxKTsKKwlpY3AtPnVuLmVjaG8uaWQgPSBpZGVudDsJCQkvKiBJRCAqLworCisJcmN2ZF9jbGVhcihudHJhbnNtaXR0ZWQrMSk7CisKKwlpZiAodGltaW5nKSB7CisJCWlmIChvcHRpb25zJkZfTEFURU5DWSkgeworCQkJc3RydWN0IHRpbWV2YWwgdG1wX3R2OworCQkJZ2V0dGltZW9mZGF5KCZ0bXBfdHYsIE5VTEwpOworCQkJbWVtY3B5KGljcCsxLCAmdG1wX3R2LCBzaXplb2YodG1wX3R2KSk7CisJCX0gZWxzZSB7CisJCQltZW1zZXQoaWNwKzEsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCQl9CisJfQorCisJY2MgPSBkYXRhbGVuICsgODsJCQkvKiBza2lwcyBJQ01QIHBvcnRpb24gKi8KKworCS8qIGNvbXB1dGUgSUNNUCBjaGVja3N1bSBoZXJlICovCisJaWNwLT5jaGVja3N1bSA9IGluX2Nrc3VtKCh1X3Nob3J0ICopaWNwLCBjYywgMCk7CisKKwlpZiAodGltaW5nICYmICEob3B0aW9ucyZGX0xBVEVOQ1kpKSB7CisJCXN0cnVjdCB0aW1ldmFsIHRtcF90djsKKwkJZ2V0dGltZW9mZGF5KCZ0bXBfdHYsIE5VTEwpOworCQltZW1jcHkoaWNwKzEsICZ0bXBfdHYsIHNpemVvZih0bXBfdHYpKTsKKwkJaWNwLT5jaGVja3N1bSA9IGluX2Nrc3VtKCh1X3Nob3J0ICopJnRtcF90diwgc2l6ZW9mKHRtcF90diksIH5pY3AtPmNoZWNrc3VtKTsKKwl9CisKKwlkbyB7CisJCXN0YXRpYyBzdHJ1Y3QgaW92ZWMgaW92ID0ge291dHBhY2ssIDB9OworCQlzdGF0aWMgc3RydWN0IG1zZ2hkciBtID0geyAmd2hlcmV0bywgc2l6ZW9mKHdoZXJldG8pLAorCQkJCQkJICAgJmlvdiwgMSwgJmNtc2csIDAsIDAgfTsKKwkJbS5tc2dfY29udHJvbGxlbiA9IGNtc2dfbGVuOworCQlpb3YuaW92X2xlbiA9IGNjOworCisJCWkgPSBzZW5kbXNnKGljbXBfc29jaywgJm0sIGNvbmZpcm0pOworCQljb25maXJtID0gMDsKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiAoY2MgPT0gaSA/IDAgOiBpKTsKK30KKworLyoKKyAqIHBhcnNlX3JlcGx5IC0tCisgKglQcmludCBvdXQgdGhlIHBhY2tldCwgaWYgaXQgY2FtZSBmcm9tIHVzLiAgVGhpcyBsb2dpYyBpcyBuZWNlc3NhcnkKKyAqIGJlY2F1c2UgQUxMIHJlYWRlcnMgb2YgdGhlIElDTVAgc29ja2V0IGdldCBhIGNvcHkgb2YgQUxMIElDTVAgcGFja2V0cworICogd2hpY2ggYXJyaXZlICgndGlzIG9ubHkgZmFpcikuICBUaGlzIHBlcm1pdHMgbXVsdGlwbGUgY29waWVzIG9mIHRoaXMKKyAqIHByb2dyYW0gdG8gYmUgcnVuIHdpdGhvdXQgaGF2aW5nIGludGVybWluZ2xlZCBvdXRwdXQgKG9yIHN0YXRpc3RpY3MhKS4KKyAqLwordm9pZCBwcl9lY2hvX3JlcGx5KF9fdTggKl9pY3AsIGludCBsZW4pCit7CisJc3RydWN0IGljbXBoZHIgKmljcCA9IChzdHJ1Y3QgaWNtcGhkciAqKV9pY3A7CisJcHJpbnRmKCIgaWNtcF9zZXE9JXUiLCBudG9ocyhpY3AtPnVuLmVjaG8uc2VxdWVuY2UpKTsKK30KKworaW50CitwYXJzZV9yZXBseShzdHJ1Y3QgbXNnaGRyICptc2csIGludCBjYywgdm9pZCAqYWRkciwgc3RydWN0IHRpbWV2YWwgKnR2KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSA9IGFkZHI7CisJX191OCAqYnVmID0gbXNnLT5tc2dfaW92LT5pb3ZfYmFzZTsKKwlzdHJ1Y3QgaWNtcGhkciAqaWNwOworCXN0cnVjdCBpcGhkciAqaXA7CisJaW50IGhsZW47CisJaW50IGNzZmFpbGVkOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCWludCB0dGw7CisJX191OCAqb3B0czsKKwlpbnQgb3B0bGVuOworCisJLyogQ2hlY2sgdGhlIElQIGhlYWRlciAqLworCWlwID0gKHN0cnVjdCBpcGhkciAqKWJ1ZjsKKwlpZiAoIXVzaW5nX3Bpbmdfc29ja2V0KSB7CisJCWhsZW4gPSBpcC0+aWhsKjQ7CisJCWlmIChjYyA8IGhsZW4gKyA4IHx8IGlwLT5paGwgPCA1KSB7CisJCQlpZiAob3B0aW9ucyAmIEZfVkVSQk9TRSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IHBhY2tldCB0b28gc2hvcnQgKCVkIGJ5dGVzKSBmcm9tICVzXG4iLCBjYywKKwkJCQkJcHJfYWRkcihmcm9tLT5zaW5fYWRkci5zX2FkZHIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCXR0bCA9IGlwLT50dGw7CisJCW9wdHMgPSBidWYgKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwkJb3B0bGVuID0gaGxlbiAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCX0gZWxzZSB7CisJCWhsZW4gPSAwOworCQl0dGwgPSAwOworCQlvcHRzID0gYnVmOworCQlvcHRsZW4gPSAwOworCQlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKG1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUihtc2csIGNtc2cpKSB7CisJCQlpZiAoY21zZy0+Y21zZ19sZXZlbCAhPSBTT0xfSVApCisJCQkJY29udGludWU7CisJCQlpZiAoY21zZy0+Y21zZ190eXBlID09IElQX1RUTCkgeworCQkJCWlmIChjbXNnLT5jbXNnX2xlbiA8IHNpemVvZihpbnQpKQorCQkJCQljb250aW51ZTsKKwkJCQl0dGwgPSAqKGludCAqKSBDTVNHX0RBVEEoY21zZyk7CisJCQl9IGVsc2UgaWYgKGNtc2ctPmNtc2dfdHlwZSA9PSBJUF9SRVRPUFRTKSB7CisJCQkJb3B0cyA9IChfX3U4ICopIENNU0dfREFUQShjbXNnKTsKKwkJCQlvcHRsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwkJCX0KKwkJfQorCX0KKworCS8qIE5vdyB0aGUgSUNNUCBwYXJ0ICovCisJY2MgLT0gaGxlbjsKKwlpY3AgPSAoc3RydWN0IGljbXBoZHIgKikoYnVmICsgaGxlbik7CisJY3NmYWlsZWQgPSBpbl9ja3N1bSgodV9zaG9ydCAqKWljcCwgY2MsIDApOworCisJaWYgKGljcC0+dHlwZSA9PSBJQ01QX0VDSE9SRVBMWSkgeworCQlpZiAoIWlzX291cnMoaWNwLT51bi5lY2hvLmlkKSkKKwkJCXJldHVybiAxOwkJCS8qICdUd2FzIG5vdCBvdXIgRUNITyAqLworCQlpZiAoZ2F0aGVyX3N0YXRpc3RpY3MoKF9fdTgqKWljcCwgc2l6ZW9mKCppY3ApLCBjYywKKwkJCQkgICAgICBudG9ocyhpY3AtPnVuLmVjaG8uc2VxdWVuY2UpLAorCQkJCSAgICAgIHR0bCwgMCwgdHYsIHByX2FkZHIoZnJvbS0+c2luX2FkZHIuc19hZGRyKSwKKwkJCQkgICAgICBwcl9lY2hvX3JlcGx5KSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIFdlIGZhbGwgaGVyZSB3aGVuIGEgcmVkaXJlY3Qgb3Igc291cmNlIHF1ZW5jaCBhcnJpdmVkLgorCQkgKiBBbHNvIHRoaXMgYnJhbmNoIHByb2Nlc3NlcyBpY21wIGVycm9ycywgd2hlbiBJUF9SRUNWRVJSCisJCSAqIGlzIGJyb2tlbi4gKi8KKworCQlzd2l0Y2ggKGljcC0+dHlwZSkgeworCQljYXNlIElDTVBfRUNITzoKKwkJCS8qIE1VU1QgTk9UICovCisJCQlyZXR1cm4gMTsKKwkJY2FzZSBJQ01QX1NPVVJDRV9RVUVOQ0g6CisJCWNhc2UgSUNNUF9SRURJUkVDVDoKKwkJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKKwkJY2FzZSBJQ01QX1RJTUVfRVhDRUVERUQ6CisJCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQkJeworCQkJCXN0cnVjdCBpcGhkciAqIGlwaCA9IChzdHJ1Y3QgIGlwaGRyICopKCZpY3BbMV0pOworCQkJCXN0cnVjdCBpY21waGRyICppY3AxID0gKHN0cnVjdCBpY21waGRyKikoKHVuc2lnbmVkIGNoYXIgKilpcGggKyBpcGgtPmlobCo0KTsKKwkJCQlpbnQgZXJyb3JfcGt0OworCQkJCWlmIChjYyA8IDgrc2l6ZW9mKHN0cnVjdCBpcGhkcikrOCB8fAorCQkJCSAgICBjYyA8IDgraXBoLT5paGwqNCs4KQorCQkJCQlyZXR1cm4gMTsKKwkJCQlpZiAoaWNwMS0+dHlwZSAhPSBJQ01QX0VDSE8gfHwKKwkJCQkgICAgaXBoLT5kYWRkciAhPSB3aGVyZXRvLnNpbl9hZGRyLnNfYWRkciB8fAorCQkJCSAgICAhaXNfb3VycyhpY3AxLT51bi5lY2hvLmlkKSkKKwkJCQkJcmV0dXJuIDE7CisJCQkJZXJyb3JfcGt0ID0gKGljcC0+dHlwZSAhPSBJQ01QX1JFRElSRUNUICYmCisJCQkJCSAgICAgaWNwLT50eXBlICE9IElDTVBfU09VUkNFX1FVRU5DSCk7CisJCQkJaWYgKGVycm9yX3BrdCkgeworCQkJCQlhY2tub3dsZWRnZShudG9ocyhpY3AxLT51bi5lY2hvLnNlcXVlbmNlKSk7CisJCQkJCWlmICh3b3JraW5nX3JlY3ZlcnIpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJc3RhdGljIGludCBvbmNlOworCQkJCQkJLyogU2lnaCwgSVBfUkVDVkVSUiBmb3IgcmF3IHNvY2tldAorCQkJCQkJICogd2FzIGJyb2tlbiB1bnRpbCAyLjQuOS4gU28sIHdlIGlnbm9yZQorCQkJCQkJICogdGhlIGZpcnN0IGVycm9yIGFuZCB3YXJuIG9uIHRoZSBzZWNvbmQuCisJCQkJCQkgKi8KKwkJCQkJCWlmIChvbmNlKysgPT0gMSkKKwkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxyV0FSTklORzoga2VybmVsIGlzIG5vdCB2ZXJ5IGZyZXNoLCB1cGdyYWRlIGlzIHJlY29tbWVuZGVkLlxuIik7CisJCQkJCQlpZiAob25jZSA9PSAxKQorCQkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJCW5lcnJvcnMrPWVycm9yX3BrdDsKKwkJCQlpZiAob3B0aW9ucyZGX1FVSUVUKQorCQkJCQlyZXR1cm4gIWVycm9yX3BrdDsKKwkJCQlpZiAob3B0aW9ucyAmIEZfRkxPT0QpIHsKKwkJCQkJaWYgKGVycm9yX3BrdCkKKwkJCQkJCXdyaXRlX3N0ZG91dCgiXGJFIiwgMik7CisJCQkJCXJldHVybiAhZXJyb3JfcGt0OworCQkJCX0KKwkJCQlwcmludF90aW1lc3RhbXAoKTsKKwkJCQlwcmludGYoIkZyb20gJXM6IGljbXBfc2VxPSV1ICIsCisJCQkJICAgICAgIHByX2FkZHIoZnJvbS0+c2luX2FkZHIuc19hZGRyKSwKKwkJCQkgICAgICAgbnRvaHMoaWNwMS0+dW4uZWNoby5zZXF1ZW5jZSkpOworCQkJCWlmIChjc2ZhaWxlZCkKKwkJCQkJcHJpbnRmKCIoQkFEIENIRUNLU1VNKSIpOworCQkJCXByX2ljbXBoKGljcC0+dHlwZSwgaWNwLT5jb2RlLCBudG9obChpY3AtPnVuLmdhdGV3YXkpLCBpY3ApOworCQkJCXJldHVybiAhZXJyb3JfcGt0OworCQkJfQorCQlkZWZhdWx0OgorCQkJLyogTVVTVCBOT1QgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmICgob3B0aW9ucyAmIEZfRkxPT0QpICYmICEob3B0aW9ucyAmIChGX1ZFUkJPU0V8Rl9RVUlFVCkpKSB7CisJCQlpZiAoIWNzZmFpbGVkKQorCQkJCXdyaXRlX3N0ZG91dCgiIUUiLCAyKTsKKwkJCWVsc2UKKwkJCQl3cml0ZV9zdGRvdXQoIiFFQyIsIDMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCEob3B0aW9ucyAmIEZfVkVSQk9TRSkgfHwgdWlkKQorCQkJcmV0dXJuIDA7CisJCWlmIChvcHRpb25zICYgRl9QVElNRU9GREFZKSB7CisJCQlzdHJ1Y3QgdGltZXZhbCByZWN2X3RpbWU7CisJCQlnZXR0aW1lb2ZkYXkoJnJlY3ZfdGltZSwgTlVMTCk7CisJCQlwcmludGYoIiVsdS4lMDZsdSAiLCAodW5zaWduZWQgbG9uZylyZWN2X3RpbWUudHZfc2VjLCAodW5zaWduZWQgbG9uZylyZWN2X3RpbWUudHZfdXNlYyk7CisJCX0KKwkJcHJpbnRmKCJGcm9tICVzOiAiLCBwcl9hZGRyKGZyb20tPnNpbl9hZGRyLnNfYWRkcikpOworCQlpZiAoY3NmYWlsZWQpIHsKKwkJCXByaW50ZigiKEJBRCBDSEVDS1NVTSlcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJfaWNtcGgoaWNwLT50eXBlLCBpY3AtPmNvZGUsIG50b2hsKGljcC0+dW4uZ2F0ZXdheSksIGljcCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKG9wdGlvbnMgJiBGX0ZMT09EKSkgeworCQlwcl9vcHRpb25zKG9wdHMsIG9wdGxlbiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKworCQlpZiAob3B0aW9ucyAmIEZfQVVESUJMRSkKKwkJCXB1dGNoYXIoJ1xhJyk7CisJCXB1dGNoYXIoJ1xuJyk7CisJCWZmbHVzaChzdGRvdXQpOworCX0gZWxzZSB7CisJCXB1dGNoYXIoJ1xhJyk7CisJCWZmbHVzaChzdGRvdXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisjIGRlZmluZSBPRERCWVRFKHYpCSh2KQorI2VsaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBPRERCWVRFKHYpCSgodV9zaG9ydCkodikgPDwgOCkKKyNlbHNlCisjIGRlZmluZSBPRERCWVRFKHYpCWh0b25zKCh1X3Nob3J0KSh2KSA8PCA4KQorI2VuZGlmCisKK3Vfc2hvcnQKK2luX2Nrc3VtKGNvbnN0IHVfc2hvcnQgKmFkZHIsIHJlZ2lzdGVyIGludCBsZW4sIHVfc2hvcnQgY3N1bSkKK3sKKwlyZWdpc3RlciBpbnQgbmxlZnQgPSBsZW47CisJY29uc3QgdV9zaG9ydCAqdyA9IGFkZHI7CisJcmVnaXN0ZXIgdV9zaG9ydCBhbnN3ZXI7CisJcmVnaXN0ZXIgaW50IHN1bSA9IGNzdW07CisKKwkvKgorCSAqICBPdXIgYWxnb3JpdGhtIGlzIHNpbXBsZSwgdXNpbmcgYSAzMiBiaXQgYWNjdW11bGF0b3IgKHN1bSksCisJICogIHdlIGFkZCBzZXF1ZW50aWFsIDE2IGJpdCB3b3JkcyB0byBpdCwgYW5kIGF0IHRoZSBlbmQsIGZvbGQKKwkgKiAgYmFjayBhbGwgdGhlIGNhcnJ5IGJpdHMgZnJvbSB0aGUgdG9wIDE2IGJpdHMgaW50byB0aGUgbG93ZXIKKwkgKiAgMTYgYml0cy4KKwkgKi8KKwl3aGlsZSAobmxlZnQgPiAxKSAgeworCQlzdW0gKz0gKncrKzsKKwkJbmxlZnQgLT0gMjsKKwl9CisKKwkvKiBtb3AgdXAgYW4gb2RkIGJ5dGUsIGlmIG5lY2Vzc2FyeSAqLworCWlmIChubGVmdCA9PSAxKQorCQlzdW0gKz0gT0REQllURSgqKHVfY2hhciAqKXcpOyAvKiBsZTE2dG9oKCkgbWF5IGJlIHVuYXZhaWxhYmxlIG9uIG9sZCBzeXN0ZW1zICovCisKKwkvKgorCSAqIGFkZCBiYWNrIGNhcnJ5IG91dHMgZnJvbSB0b3AgMTYgYml0cyB0byBsb3cgMTYgYml0cworCSAqLworCXN1bSA9IChzdW0gPj4gMTYpICsgKHN1bSAmIDB4ZmZmZik7CS8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KKwlzdW0gKz0gKHN1bSA+PiAxNik7CQkJLyogYWRkIGNhcnJ5ICovCisJYW5zd2VyID0gfnN1bTsJCQkJLyogdHJ1bmNhdGUgdG8gMTYgYml0cyAqLworCXJldHVybiAoYW5zd2VyKTsKK30KKworLyoKKyAqIHByX2ljbXBoIC0tCisgKglQcmludCBhIGRlc2NyaXB0aXZlIHN0cmluZyBhYm91dCBhbiBJQ01QIGhlYWRlci4KKyAqLwordm9pZCBwcl9pY21waChfX3U4IHR5cGUsIF9fdTggY29kZSwgX191MzIgaW5mbywgc3RydWN0IGljbXBoZHIgKmljcCkKK3sKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgSUNNUF9FQ0hPUkVQTFk6CisJCXByaW50ZigiRWNobyBSZXBseVxuIik7CisJCS8qIFhYWCBJRCArIFNlcSArIERhdGEgKi8KKwkJYnJlYWs7CisJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKKwkJc3dpdGNoKGNvZGUpIHsKKwkJY2FzZSBJQ01QX05FVF9VTlJFQUNIOgorCQkJcHJpbnRmKCJEZXN0aW5hdGlvbiBOZXQgVW5yZWFjaGFibGVcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUF9IT1NUX1VOUkVBQ0g6CisJCQlwcmludGYoIkRlc3RpbmF0aW9uIEhvc3QgVW5yZWFjaGFibGVcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUF9QUk9UX1VOUkVBQ0g6CisJCQlwcmludGYoIkRlc3RpbmF0aW9uIFByb3RvY29sIFVucmVhY2hhYmxlXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBfUE9SVF9VTlJFQUNIOgorCQkJcHJpbnRmKCJEZXN0aW5hdGlvbiBQb3J0IFVucmVhY2hhYmxlXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBfRlJBR19ORUVERUQ6CisJCQlwcmludGYoIkZyYWcgbmVlZGVkIGFuZCBERiBzZXQgKG10dSA9ICV1KVxuIiwgaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX1NSX0ZBSUxFRDoKKwkJCXByaW50ZigiU291cmNlIFJvdXRlIEZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX05FVF9VTktOT1dOOgorCQkJcHJpbnRmKCJEZXN0aW5hdGlvbiBOZXQgVW5rbm93blxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX0hPU1RfVU5LTk9XTjoKKwkJCXByaW50ZigiRGVzdGluYXRpb24gSG9zdCBVbmtub3duXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBfSE9TVF9JU09MQVRFRDoKKwkJCXByaW50ZigiU291cmNlIEhvc3QgSXNvbGF0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUF9ORVRfQU5POgorCQkJcHJpbnRmKCJEZXN0aW5hdGlvbiBOZXQgUHJvaGliaXRlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX0hPU1RfQU5POgorCQkJcHJpbnRmKCJEZXN0aW5hdGlvbiBIb3N0IFByb2hpYml0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUF9ORVRfVU5SX1RPUzoKKwkJCXByaW50ZigiRGVzdGluYXRpb24gTmV0IFVucmVhY2hhYmxlIGZvciBUeXBlIG9mIFNlcnZpY2VcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUF9IT1NUX1VOUl9UT1M6CisJCQlwcmludGYoIkRlc3RpbmF0aW9uIEhvc3QgVW5yZWFjaGFibGUgZm9yIFR5cGUgb2YgU2VydmljZVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX1BLVF9GSUxURVJFRDoKKwkJCXByaW50ZigiUGFja2V0IGZpbHRlcmVkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBfUFJFQ19WSU9MQVRJT046CisJCQlwcmludGYoIlByZWNlZGVuY2UgVmlvbGF0aW9uXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBfUFJFQ19DVVRPRkY6CisJCQlwcmludGYoIlByZWNlZGVuY2UgQ3V0b2ZmXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJEZXN0IFVucmVhY2hhYmxlLCBCYWQgQ29kZTogJWRcbiIsIGNvZGUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGljcCAmJiAob3B0aW9ucyAmIEZfVkVSQk9TRSkpCisJCQlwcl9pcGgoKHN0cnVjdCBpcGhkciopKGljcCArIDEpKTsKKwkJYnJlYWs7CisJY2FzZSBJQ01QX1NPVVJDRV9RVUVOQ0g6CisJCXByaW50ZigiU291cmNlIFF1ZW5jaFxuIik7CisJCWlmIChpY3AgJiYgKG9wdGlvbnMgJiBGX1ZFUkJPU0UpKQorCQkJcHJfaXBoKChzdHJ1Y3QgaXBoZHIqKShpY3AgKyAxKSk7CisJCWJyZWFrOworCWNhc2UgSUNNUF9SRURJUkVDVDoKKwkJc3dpdGNoKGNvZGUpIHsKKwkJY2FzZSBJQ01QX1JFRElSX05FVDoKKwkJCXByaW50ZigiUmVkaXJlY3QgTmV0d29yayIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUF9SRURJUl9IT1NUOgorCQkJcHJpbnRmKCJSZWRpcmVjdCBIb3N0Iik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX1JFRElSX05FVFRPUzoKKwkJCXByaW50ZigiUmVkaXJlY3QgVHlwZSBvZiBTZXJ2aWNlIGFuZCBOZXR3b3JrIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX1JFRElSX0hPU1RUT1M6CisJCQlwcmludGYoIlJlZGlyZWN0IFR5cGUgb2YgU2VydmljZSBhbmQgSG9zdCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIlJlZGlyZWN0LCBCYWQgQ29kZTogJWQiLCBjb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ZigiKE5ldyBuZXh0aG9wOiAlcylcbiIsIHByX2FkZHIoaWNwID8gaWNwLT51bi5nYXRld2F5IDogaW5mbykpOworCQlpZiAoaWNwICYmIChvcHRpb25zICYgRl9WRVJCT1NFKSkKKwkJCXByX2lwaCgoc3RydWN0IGlwaGRyKikoaWNwICsgMSkpOworCQlicmVhazsKKwljYXNlIElDTVBfRUNITzoKKwkJcHJpbnRmKCJFY2hvIFJlcXVlc3RcbiIpOworCQkvKiBYWFggSUQgKyBTZXEgKyBEYXRhICovCisJCWJyZWFrOworCWNhc2UgSUNNUF9USU1FX0VYQ0VFREVEOgorCQlzd2l0Y2goY29kZSkgeworCQljYXNlIElDTVBfRVhDX1RUTDoKKwkJCXByaW50ZigiVGltZSB0byBsaXZlIGV4Y2VlZGVkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBfRVhDX0ZSQUdUSU1FOgorCQkJcHJpbnRmKCJGcmFnIHJlYXNzZW1ibHkgdGltZSBleGNlZWRlZFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiVGltZSBleGNlZWRlZCwgQmFkIENvZGU6ICVkXG4iLCBjb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpY3AgJiYgKG9wdGlvbnMgJiBGX1ZFUkJPU0UpKQorCQkJcHJfaXBoKChzdHJ1Y3QgaXBoZHIqKShpY3AgKyAxKSk7CisJCWJyZWFrOworCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQlwcmludGYoIlBhcmFtZXRlciBwcm9ibGVtOiBwb2ludGVyID0gJXVcbiIsIGljcCA/IChudG9obChpY3AtPnVuLmdhdGV3YXkpPj4yNCkgOiBpbmZvKTsKKwkJaWYgKGljcCAmJiAob3B0aW9ucyAmIEZfVkVSQk9TRSkpCisJCQlwcl9pcGgoKHN0cnVjdCBpcGhkciopKGljcCArIDEpKTsKKwkJYnJlYWs7CisJY2FzZSBJQ01QX1RJTUVTVEFNUDoKKwkJcHJpbnRmKCJUaW1lc3RhbXBcbiIpOworCQkvKiBYWFggSUQgKyBTZXEgKyAzIHRpbWVzdGFtcHMgKi8KKwkJYnJlYWs7CisJY2FzZSBJQ01QX1RJTUVTVEFNUFJFUExZOgorCQlwcmludGYoIlRpbWVzdGFtcCBSZXBseVxuIik7CisJCS8qIFhYWCBJRCArIFNlcSArIDMgdGltZXN0YW1wcyAqLworCQlicmVhazsKKwljYXNlIElDTVBfSU5GT19SRVFVRVNUOgorCQlwcmludGYoIkluZm9ybWF0aW9uIFJlcXVlc3RcbiIpOworCQkvKiBYWFggSUQgKyBTZXEgKi8KKwkJYnJlYWs7CisJY2FzZSBJQ01QX0lORk9fUkVQTFk6CisJCXByaW50ZigiSW5mb3JtYXRpb24gUmVwbHlcbiIpOworCQkvKiBYWFggSUQgKyBTZXEgKi8KKwkJYnJlYWs7CisjaWZkZWYgSUNNUF9NQVNLUkVRCisJY2FzZSBJQ01QX01BU0tSRVE6CisJCXByaW50ZigiQWRkcmVzcyBNYXNrIFJlcXVlc3RcbiIpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIElDTVBfTUFTS1JFUExZCisJY2FzZSBJQ01QX01BU0tSRVBMWToKKwkJcHJpbnRmKCJBZGRyZXNzIE1hc2sgUmVwbHlcbiIpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXByaW50ZigiQmFkIElDTVAgdHlwZTogJWRcbiIsIHR5cGUpOworCX0KK30KKwordm9pZCBwcl9vcHRpb25zKHVuc2lnbmVkIGNoYXIgKiBjcCwgaW50IGhsZW4pCit7CisJaW50IGksIGo7CisJaW50IG9wdGxlbiwgdG90bGVuOworCXVuc2lnbmVkIGNoYXIgKiBvcHRwdHI7CisJc3RhdGljIGludCBvbGRfcnJsZW47CisJc3RhdGljIGNoYXIgb2xkX3JyW01BWF9JUE9QVExFTl07CisKKwl0b3RsZW4gPSBobGVuLXNpemVvZihzdHJ1Y3QgaXBoZHIpOworCW9wdHB0ciA9IGNwOworCisJd2hpbGUgKHRvdGxlbiA+IDApIHsKKwkJaWYgKCpvcHRwdHIgPT0gSVBPUFRfRU9MKQorCQkJYnJlYWs7CisJCWlmICgqb3B0cHRyID09IElQT1BUX05PUCkgeworCQkJdG90bGVuLS07CisJCQlvcHRwdHIrKzsKKwkJCXByaW50ZigiXG5OT1AiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNwID0gb3B0cHRyOworCQlvcHRsZW4gPSBvcHRwdHJbMV07CisJCWlmIChvcHRsZW4gPCAyIHx8IG9wdGxlbiA+IHRvdGxlbikKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoKmNwKSB7CisJCWNhc2UgSVBPUFRfU1NSUjoKKwkJY2FzZSBJUE9QVF9MU1JSOgorCQkJcHJpbnRmKCJcbiVjU1JSOiAiLCAqY3A9PUlQT1BUX1NTUlIgPyAnUycgOiAnTCcpOworCQkJaiA9ICorK2NwOworCQkJaSA9ICorK2NwOworCQkJaSAtPSA0OworCQkJY3ArKzsKKwkJCWlmIChqID4gSVBPUFRfTUlOT0ZGKSB7CisJCQkJZm9yICg7OykgeworCQkJCQlfX3UzMiBhZGRyZXNzOworCQkJCQltZW1jcHkoJmFkZHJlc3MsIGNwLCA0KTsKKwkJCQkJY3AgKz0gNDsKKwkJCQkJaWYgKGFkZHJlc3MgPT0gMCkKKwkJCQkJCXByaW50ZigiXHQwLjAuMC4wIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50ZigiXHQlcyIsIHByX2FkZHIoYWRkcmVzcykpOworCQkJCQlqIC09IDQ7CisJCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJCWlmIChqIDw9IElQT1BUX01JTk9GRikKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElQT1BUX1JSOgorCQkJaiA9ICorK2NwOwkJLyogZ2V0IGxlbmd0aCAqLworCQkJaSA9ICorK2NwOwkJLyogYW5kIHBvaW50ZXIgKi8KKwkJCWlmIChpID4gaikKKwkJCQlpID0gajsKKwkJCWkgLT0gSVBPUFRfTUlOT0ZGOworCQkJaWYgKGkgPD0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChpID09IG9sZF9ycmxlbgorCQkJICAgICYmICFtZW1jbXAoY3AsIG9sZF9yciwgaSkKKwkJCSAgICAmJiAhKG9wdGlvbnMgJiBGX0ZMT09EKSkgeworCQkJCXByaW50ZigiXHQoc2FtZSByb3V0ZSkiKTsKKwkJCQlpID0gKChpICsgMykgLyA0KSAqIDQ7CisJCQkJY3AgKz0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW9sZF9ycmxlbiA9IGk7CisJCQltZW1jcHkob2xkX3JyLCAoY2hhciAqKWNwLCBpKTsKKwkJCXByaW50ZigiXG5SUjogIik7CisJCQljcCsrOworCQkJZm9yICg7OykgeworCQkJCV9fdTMyIGFkZHJlc3M7CisJCQkJbWVtY3B5KCZhZGRyZXNzLCBjcCwgNCk7CisJCQkJY3AgKz0gNDsKKwkJCQlpZiAoYWRkcmVzcyA9PSAwKQorCQkJCQlwcmludGYoIlx0MC4wLjAuMCIpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCJcdCVzIiwgcHJfYWRkcihhZGRyZXNzKSk7CisJCQkJaSAtPSA0OworCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJaWYgKGkgPD0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJUE9QVF9UUzoKKwkJeworCQkJaW50IHN0ZHRpbWUgPSAwLCBub25zdGR0aW1lID0gMDsKKwkJCV9fdTggZmxhZ3M7CisJCQlqID0gKisrY3A7CQkvKiBnZXQgbGVuZ3RoICovCisJCQlpID0gKisrY3A7CQkvKiBhbmQgcG9pbnRlciAqLworCQkJaWYgKGkgPiBqKQorCQkJCWkgPSBqOworCQkJaSAtPSA1OworCQkJaWYgKGkgPD0gMCkKKwkJCQlicmVhazsKKwkJCWZsYWdzID0gKisrY3A7CisJCQlwcmludGYoIlxuVFM6ICIpOworCQkJY3ArKzsKKwkJCWZvciAoOzspIHsKKwkJCQlsb25nIGw7CisKKwkJCQlpZiAoKGZsYWdzJjB4RikgIT0gSVBPUFRfVFNfVFNPTkxZKSB7CisJCQkJCV9fdTMyIGFkZHJlc3M7CisJCQkJCW1lbWNweSgmYWRkcmVzcywgY3AsIDQpOworCQkJCQljcCArPSA0OworCQkJCQlpZiAoYWRkcmVzcyA9PSAwKQorCQkJCQkJcHJpbnRmKCJcdDAuMC4wLjAiKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRmKCJcdCVzIiwgcHJfYWRkcihhZGRyZXNzKSk7CisJCQkJCWkgLT0gNDsKKwkJCQkJaWYgKGkgPD0gMCkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlsID0gKmNwKys7CisJCQkJbCA9IChsPDw4KSArICpjcCsrOworCQkJCWwgPSAobDw8OCkgKyAqY3ArKzsKKwkJCQlsID0gKGw8PDgpICsgKmNwKys7CisKKwkJCQlpZiAgKGwgJiAweDgwMDAwMDAwKSB7CisJCQkJCWlmIChub25zdGR0aW1lPT0wKQorCQkJCQkJcHJpbnRmKCJcdCVsZCBhYnNvbHV0ZSBub3Qtc3RhbmRhcmQiLCBsJjB4N2ZmZmZmZmYpOworCQkJCQllbHNlCisJCQkJCQlwcmludGYoIlx0JWxkIG5vdC1zdGFuZGFyZCIsIChsJjB4N2ZmZmZmZmYpIC0gbm9uc3RkdGltZSk7CisJCQkJCW5vbnN0ZHRpbWUgPSBsJjB4N2ZmZmZmZmY7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHN0ZHRpbWU9PTApCisJCQkJCQlwcmludGYoIlx0JWxkIGFic29sdXRlIiwgbCk7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50ZigiXHQlbGQiLCBsIC0gc3RkdGltZSk7CisJCQkJCXN0ZHRpbWUgPSBsOworCQkJCX0KKwkJCQlpIC09IDQ7CisJCQkJcHV0Y2hhcignXG4nKTsKKwkJCQlpZiAoaSA8PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChmbGFncz4+NCkKKwkJCQlwcmludGYoIlVucmVjb3JkZWQgaG9wczogJWRcbiIsIGZsYWdzPj40KTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIlxudW5rbm93biBvcHRpb24gJXgiLCAqY3ApOworCQkJYnJlYWs7CisJCX0KKwkJdG90bGVuIC09IG9wdGxlbjsKKwkJb3B0cHRyICs9IG9wdGxlbjsKKwl9Cit9CisKKworLyoKKyAqIHByX2lwaCAtLQorICoJUHJpbnQgYW4gSVAgaGVhZGVyIHdpdGggb3B0aW9ucy4KKyAqLwordm9pZCBwcl9pcGgoc3RydWN0IGlwaGRyICppcCkKK3sKKwlpbnQgaGxlbjsKKwl1X2NoYXIgKmNwOworCisJaGxlbiA9IGlwLT5paGwgPDwgMjsKKwljcCA9ICh1X2NoYXIgKilpcCArIDIwOwkJLyogcG9pbnQgdG8gb3B0aW9ucyAqLworCisJcHJpbnRmKCJWciBITCBUT1MgIExlbiAgIElEIEZsZyAgb2ZmIFRUTCBQcm8gIGNrcyAgICAgIFNyYyAgICAgIERzdCBEYXRhXG4iKTsKKwlwcmludGYoIiAlMXggICUxeCAgJTAyeCAlMDR4ICUwNHgiLAorCSAgICAgICBpcC0+dmVyc2lvbiwgaXAtPmlobCwgaXAtPnRvcywgaXAtPnRvdF9sZW4sIGlwLT5pZCk7CisJcHJpbnRmKCIgICAlMXggJTA0eCIsICgoaXAtPmZyYWdfb2ZmKSAmIDB4ZTAwMCkgPj4gMTMsCisJICAgICAgIChpcC0+ZnJhZ19vZmYpICYgMHgxZmZmKTsKKwlwcmludGYoIiAgJTAyeCAgJTAyeCAlMDR4IiwgaXAtPnR0bCwgaXAtPnByb3RvY29sLCBpcC0+Y2hlY2spOworCXByaW50ZigiICVzICIsIGluZXRfbnRvYSgqKHN0cnVjdCBpbl9hZGRyICopJmlwLT5zYWRkcikpOworCXByaW50ZigiICVzICIsIGluZXRfbnRvYSgqKHN0cnVjdCBpbl9hZGRyICopJmlwLT5kYWRkcikpOworCXByaW50ZigiXG4iKTsKKwlwcl9vcHRpb25zKGNwLCBobGVuKTsKK30KKworLyoKKyAqIHByX2FkZHIgLS0KKyAqCVJldHVybiBhbiBhc2NpaSBob3N0IGFkZHJlc3MgYXMgYSBkb3R0ZWQgcXVhZCBhbmQgb3B0aW9uYWxseSB3aXRoCisgKiBhIGhvc3RuYW1lLgorICovCitjaGFyICoKK3ByX2FkZHIoX191MzIgYWRkcikKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJc3RhdGljIGNoYXIgYnVmWzQwOTZdOworCisJaW5fcHJfYWRkciA9ICFzZXRqbXAocHJfYWRkcl9qbXApOworCisJaWYgKGV4aXRpbmcgfHwgKG9wdGlvbnMgJiBGX05VTUVSSUMpIHx8CisJICAgICEoaHAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopJmFkZHIsIDQsIEFGX0lORVQpKSkKKwkJc3ByaW50ZihidWYsICIlcyIsIGluZXRfbnRvYSgqKHN0cnVjdCBpbl9hZGRyICopJmFkZHIpKTsKKwllbHNlIHsKKwkJY2hhciAqczsKKyNpZiBVU0VfSUROCisJCWlmIChpZG5hX3RvX3VuaWNvZGVfbHpseihocC0+aF9uYW1lLCAmcywgMCkgIT0gSUROQV9TVUNDRVNTKQorCQkJcyA9IE5VTEw7CisjZWxzZQorCQlzID0gTlVMTDsKKyNlbmRpZgorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMgKCVzKSIsIHMgPyBzIDogaHAtPmhfbmFtZSwKKwkJCSBpbmV0X250b2EoKihzdHJ1Y3QgaW5fYWRkciAqKSZhZGRyKSk7CisjaWYgVVNFX0lETgorCQlmcmVlKHMpOworI2VuZGlmCisJfQorCisJaW5fcHJfYWRkciA9IDA7CisKKwlyZXR1cm4oYnVmKTsKK30KKworCisvKiBTZXQgVHlwZSBvZiBTZXJ2aWNlIChUT1MpIGFuZCBvdGhlciBRdWFsaXR5IG9mIFNlcnZpY2UgcmVsYXRpbmcgYml0cyAqLworaW50IHBhcnNldG9zKGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpjcDsKKwlpbnQgdG9zOworCWNoYXIgKmVwOworCisJLyogaGFuZGxlIGJvdGggaGV4IGFuZCBkZWNpbWFsIHZhbHVlcyAqLworCWlmIChzdHJbMF0gPT0gJzAnICYmIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpKSB7CisJCWNwID0gc3RyICsgMjsKKwkJdG9zID0gKGludClzdHJ0b2woY3AsICZlcCwgMTYpOworCX0gZWxzZQorCQl0b3MgPSAoaW50KXN0cnRvbChzdHIsICZlcCwgMTApOworCisJLyogZG9lc24ndCBsb29rIGxpa2UgZGVjaW1hbCBvciBoZXgsIGVoPyAqLworCWlmICgqZXAgIT0gJ1wwJykgeworCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IFwiJXNcIiBiYWQgdmFsdWUgZm9yIFRPU1xuIiwgc3RyKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlpZiAodG9zID4gVE9TX01BWCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IHRoZSBkZWNpbWFsIHZhbHVlIG9mIFRPUyBiaXRzIG11c3QgYmUgMC0yNTQgKG9yIHplcm8pXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisJcmV0dXJuKHRvcyk7Cit9CisKKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKwordm9pZCBpbnN0YWxsX2ZpbHRlcih2b2lkKQoreworCXN0YXRpYyBpbnQgb25jZTsKKwlzdGF0aWMgc3RydWN0IHNvY2tfZmlsdGVyIGluc25zW10gPSB7CisJCUJQRl9TVE1UKEJQRl9MRFh8QlBGX0J8QlBGX01TSCwgMCksIC8qIFNraXAgSVAgaGVhZGVyLiBGLi5nIEJTRC4uLiBMb29rIGludG8gcGluZzYuICovCisJCUJQRl9TVE1UKEJQRl9MRHxCUEZfSHxCUEZfSU5ELCA0KSwgLyogTG9hZCBpY21wIGVjaG8gaWRlbnQgKi8KKwkJQlBGX0pVTVAoQlBGX0pNUHxCUEZfSkVRfEJQRl9LLCAweEFBQUEsIDAsIDEpLCAvKiBPdXJzPyAqLworCQlCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCB+MFUpLCAvKiBZZXMsIGl0IHBhc3Nlcy4gKi8KKwkJQlBGX1NUTVQoQlBGX0xEfEJQRl9CfEJQRl9JTkQsIDApLCAvKiBMb2FkIGljbXAgdHlwZSAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KRVF8QlBGX0ssIElDTVBfRUNIT1JFUExZLCAxLCAwKSwgLyogRWNobz8gKi8KKwkJQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgMHhGRkZGRkZGKSwgLyogTm8uIEl0IHBhc3Nlcy4gKi8KKwkJQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgMCkgLyogRWNobyB3aXRoIHdyb25nIGlkZW50LiBSZWplY3QuICovCisJfTsKKwlzdGF0aWMgc3RydWN0IHNvY2tfZnByb2cgZmlsdGVyID0geworCQlzaXplb2YgaW5zbnMgLyBzaXplb2YoaW5zbnNbMF0pLAorCQlpbnNucworCX07CisKKwlpZiAob25jZSB8fCB1c2luZ19waW5nX3NvY2tldCkKKwkJcmV0dXJuOworCW9uY2UgPSAxOworCisJLyogUGF0Y2ggYnBmbGV0IGZvciBjdXJyZW50IGlkZW50aWZpZXIuICovCisJaW5zbnNbMl0gPSAoc3RydWN0IHNvY2tfZmlsdGVyKUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgaHRvbnMoaWRlbnQpLCAwLCAxKTsKKworCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpKQorCQlwZXJyb3IoIldBUk5JTkc6IGZhaWxlZCB0byBpbnN0YWxsIHNvY2tldCBmaWx0ZXJcbiIpOworfQorCisjZGVmaW5lIFVTQUdFX05FV0xJTkUJIlxuICAgICAgICAgICAiCisKK3ZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiBwaW5nIgorCQkiIFstIgorCQkJImFBYkJkRGZoTG5PcXJSVXZWIgorCQkiXSIKKwkJIiBbLWMgY291bnRdIgorCQkiIFstaSBpbnRlcnZhbF0iCisJCSIgWy1JIGludGVyZmFjZV0iCisJCVVTQUdFX05FV0xJTkUKKwkJIiBbLW0gbWFya10iCisJCSIgWy1NIHBtdHVkaXNjX29wdGlvbl0iCisJCSIgWy1sIHByZWxvYWRdIgorCQkiIFstcCBwYXR0ZXJuXSIKKwkJIiBbLVEgdG9zXSIKKwkJVVNBR0VfTkVXTElORQorCQkiIFstcyBwYWNrZXRzaXplXSIKKwkJIiBbLVMgc25kYnVmXSIKKwkJIiBbLXQgdHRsXSIKKwkJIiBbLVQgdGltZXN0YW1wX29wdGlvbl0iCisJCVVTQUdFX05FV0xJTkUKKwkJIiBbLXcgZGVhZGxpbmVdIgorCQkiIFstVyB0aW1lb3V0XSIKKwkJIiBbaG9wMSAuLi5dIGRlc3RpbmF0aW9uIgorCQkiXG4iCisJKTsKKwlleGl0KDIpOworfQpkaWZmIC0tZ2l0IGEvaXB1dGlscy9waW5nNi5jIGIvaXB1dGlscy9waW5nNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTA3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL3Bpbmc2LmMKQEAgLTAsMCArMSwxODc4IEBACisvKgorICoKKyAqCU1vZGlmaWVkIGZvciBBRl9JTkVUNiBieSBQZWRybyBSb3F1ZQorICoKKyAqCTxyb3F1ZUBkaS5mYy51bC5wdD4KKyAqCisgKglPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGluY2x1ZGVkIGJlbGxvdworICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogTWlrZSBNdXVzcy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGludAorY2hhciBjb3B5cmlnaHRbXSA9CisiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cblwKKyBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworCisvKgorICoJCQlQIEkgTiBHIC4gQworICoKKyAqIFVzaW5nIHRoZSBJbnRlck5ldCBDb250cm9sIE1lc3NhZ2UgUHJvdG9jb2wgKElDTVApICJFQ0hPIiBmYWNpbGl0eSwKKyAqIG1lYXN1cmUgcm91bmQtdHJpcC1kZWxheXMgYW5kIHBhY2tldCBsb3NzIGFjcm9zcyBuZXR3b3JrIHBhdGhzLgorICoKKyAqIEF1dGhvciAtCisgKglNaWtlIE11dXNzCisgKglVLiBTLiBBcm15IEJhbGxpc3RpYyBSZXNlYXJjaCBMYWJvcmF0b3J5CisgKglEZWNlbWJlciwgMTk4MworICoKKyAqIFN0YXR1cyAtCisgKglQdWJsaWMgRG9tYWluLiAgRGlzdHJpYnV0aW9uIFVubGltaXRlZC4KKyAqIEJ1Z3MgLQorICoJTW9yZSBzdGF0aXN0aWNzIGNvdWxkIGFsd2F5cyBiZSBnYXRoZXJlZC4KKyAqCVRoaXMgcHJvZ3JhbSBoYXMgdG8gcnVuIFNVSUQgdG8gUk9PVCB0byBhY2Nlc3MgdGhlIElDTVAgc29ja2V0LgorICovCisjaW5jbHVkZSAicGluZ19jb21tb24uaCIKKworI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorI2luY2x1ZGUgPHJlc29sdi5oPgorI2lmbmRlZiBXSVRIT1VUX0lGQUREUlMKKyNpbmNsdWRlIDxpZmFkZHJzLmg+CisjZW5kaWYKKworI2lmZGVmIFVTRV9JRE4KKyNpbmNsdWRlIDxzdHJpbmdwcmVwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInBpbmc2X25pcXVlcnkuaCIKKyNpbmNsdWRlICJpbjZfZmxvd2xhYmVsLmgiCisKKyNpZm5kZWYgU09MX0lQVjYKKyNkZWZpbmUgU09MX0lQVjYgSVBQUk9UT19JUFY2CisjZW5kaWYKKworI2lmbmRlZiBTT0xfSUNNUFY2CisjZGVmaW5lIFNPTF9JQ01QVjYgSVBQUk9UT19JQ01QVjYKKyNlbmRpZgorCisvKiBSRkMzNTQyICovCisjaWZuZGVmIElDTVA2X0RTVF9VTlJFQUNIX0JFWU9ORFNDT1BFCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX0JFWU9ORFNDT1BFIElDTVA2X0RTVF9VTlJFQUNIX05PVE5FSUdIQk9SCisjZW5kaWYKKworI2lmIGRlZmluZWQoRU5BQkxFX1BJTkc2X1JUSERSKSAmJiAhZGVmaW5lZChFTkFCTEVfUElORzZfUlRIRFJfUkZDMzU0MikKKyNpZm5kZWYgSVBWNl9TUkNSVF9UWVBFXzAKKyNkZWZpbmUgSVBWNl9TUkNSVF9UWVBFXzAJMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBNTERfTElTVEVORVJfUVVFUlkKKyNkZWZpbmUgTUxEX0xJU1RFTkVSX1FVRVJZCTEzMAorI2RlZmluZSBNTERfTElTVEVORVJfUkVQT1JUCTEzMQorI2RlZmluZSBNTERfTElTVEVORVJfUkVEVUNUSU9OCTEzMgorI2VuZGlmCisKKyNkZWZpbmUgQklUX0NMRUFSKG5yLCBhZGRyKSBkbyB7ICgoX191MzIgKikoYWRkcikpWyhucikgPj4gNV0gJj0gfigxVSA8PCAoKG5yKSAmIDMxKSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQklUX1NFVChuciwgYWRkcikgZG8geyAoKF9fdTMyICopKGFkZHIpKVsobnIpID4+IDVdIHw9ICgxVSA8PCAoKG5yKSAmIDMxKSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQklUX1RFU1QobnIsIGFkZHIpIGRvIHsgKF9fdTMyICopKGFkZHIpKVsobnIpID4+IDVdICYgKDFVIDw8ICgobnIpICYgMzEpKTsgfSB3aGlsZSgwKQorCisjaWZuZGVmIElDTVA2X0ZJTFRFUl9XSUxMUEFTUworI2RlZmluZSBJQ01QNl9GSUxURVJfV0lMTFBBU1ModHlwZSwgZmlsdGVycCkgXAorCShCSVRfVEVTVCgodHlwZSksIGZpbHRlcnApID09IDApCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1dJTExCTE9DSyh0eXBlLCBmaWx0ZXJwKSBcCisJQklUX1RFU1QoKHR5cGUpLCBmaWx0ZXJwKQorCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9TRVRQQVNTKHR5cGUsIGZpbHRlcnApIFwKKwlCSVRfQ0xFQVIoKHR5cGUpLCBmaWx0ZXJwKQorCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9TRVRCTE9DSyh0eXBlLCBmaWx0ZXJwKSBcCisJQklUX1NFVCgodHlwZSksIGZpbHRlcnApCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1NFVFBBU1NBTEwoZmlsdGVycCkgXAorCW1lbXNldChmaWx0ZXJwLCAwLCBzaXplb2Yoc3RydWN0IGljbXA2X2ZpbHRlcikpOworCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9TRVRCTE9DS0FMTChmaWx0ZXJwKSBcCisJbWVtc2V0KGZpbHRlcnAsIDB4RkYsIHNpemVvZihzdHJ1Y3QgaWNtcDZfZmlsdGVyKSk7CisjZW5kaWYKKworI2RlZmluZQlNQVhQQUNLRVQJMTI4MDAwCQkvKiBtYXggcGFja2V0IHNpemUgKi8KKworI2lmZGVmIFNPX1RJTUVTVEFNUAorI2RlZmluZSBIQVZFX1NJTjZfU0NPUEVJRCAxCisjZW5kaWYKKworI2lmbmRlZiBTQ09QRV9ERUxJTUlURVIKKyMgZGVmaW5lIFNDT1BFX0RFTElNSVRFUiAnJScKKyNlbmRpZgorCitfX3UzMiBmbG93bGFiZWw7CitfX3UzMiB0Y2xhc3M7CisjaWZkZWYgRU5BQkxFX1BJTkc2X1JUSERSCitzdHJ1Y3QgY21zZ2hkciAqc3JjcnQ7CisjZW5kaWYKKworc3RydWN0IHNvY2thZGRyX2luNiB3aGVyZXRvOwkvKiB3aG8gdG8gcGluZyAqLwordV9jaGFyIG91dHBhY2tbTUFYUEFDS0VUXTsKK2ludCBtYXhwYWNrZXQgPSBzaXplb2Yob3V0cGFjayk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNtc2didWZbNDA5Nl07CitzdGF0aWMgaW50IGNtc2dsZW4gPSAwOworCitzdGF0aWMgY2hhciAqIHByX2FkZHIoc3RydWN0IGluNl9hZGRyICphZGRyKTsKK3N0YXRpYyBjaGFyICogcHJfYWRkcl9uKHN0cnVjdCBpbjZfYWRkciAqYWRkcik7CitzdGF0aWMgaW50IHByX2ljbXBoKF9fdTggdHlwZSwgX191OCBjb2RlLCBfX3UzMiBpbmZvKTsKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlKChub3JldHVybikpOworCitzdHJ1Y3Qgc29ja2FkZHJfaW42IHNvdXJjZTsKK2NoYXIgKmRldmljZTsKK2ludCBwbXR1ZGlzYz0tMTsKKworc3RhdGljIGludCBpY21wX3NvY2s7CisKKyNpZmRlZiBVU0VfR05VVExTCisjIGluY2x1ZGUgPGdudXRscy9vcGVuc3NsLmg+CisjZWxzZQorIyBpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2VuZGlmCisKKy8qIE5vZGUgSW5mb3JtYXRpb24gcXVlcnkgKi8KK2ludCBuaV9xdWVyeSA9IC0xOworaW50IG5pX2ZsYWcgPSAwOwordm9pZCAqbmlfc3ViamVjdCA9IE5VTEw7CitpbnQgbmlfc3ViamVjdF9sZW4gPSAwOworaW50IG5pX3N1YmplY3RfdHlwZSA9IC0xOworY2hhciAqbmlfZ3JvdXA7CisKK3N0YXRpYyBpbmxpbmUgaW50IG50b2hzcChfX3UxNiAqcCkKK3sKKwlfX3UxNiB2OworCW1lbWNweSgmdiwgcCwgc2l6ZW9mKHYpKTsKKwlyZXR1cm4gbnRvaHModik7Cit9CisKKyNpZiBkZWZpbmVkKEVOQUJMRV9QSU5HNl9SVEhEUikgJiYgIWRlZmluZWQoRU5BQkxFX1BJTkc2X1JUSERSX1JGQzM1NDIpCitzaXplX3QgaW5ldDZfc3JjcnRfc3BhY2UoaW50IHR5cGUsIGludCBzZWdtZW50cykKK3sKKwlpZiAodHlwZSAhPSAwIHx8IHNlZ21lbnRzID4gMjQpCisJCXJldHVybiAwOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGNtc2doZHIpICsgc2l6ZW9mKHN0cnVjdCBpcDZfcnRoZHIwKSArCisJCXNlZ21lbnRzICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworfQorCitleHRlcm4gc3RydWN0IGNtc2doZHIgKglpbmV0Nl9zcmNydF9pbml0KHZvaWQgKmJwLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKworCWlmICh0eXBlKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChicCwgMCwgc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSArIHNpemVvZihzdHJ1Y3QgaXA2X3J0aGRyMCkpOworCWNtc2cgPSAoc3RydWN0IGNtc2doZHIgKikgYnA7CisKKwljbXNnLT5jbXNnX2xlbiA9IHNpemVvZihzdHJ1Y3QgY21zZ2hkcikgKyBzaXplb2Yoc3RydWN0IGlwNl9ydGhkcjApOworCWNtc2ctPmNtc2dfbGV2ZWwgPSBTT0xfSVBWNjsKKwljbXNnLT5jbXNnX3R5cGUgPSBJUFY2X1JUSERSOworCisJcmV0dXJuIGNtc2c7Cit9CisKK2ludCBpbmV0Nl9zcmNydF9hZGQoc3RydWN0IGNtc2doZHIgKmNtc2csIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgaXA2X3J0aGRyMCAqaGRyOworCisJaGRyID0gKHN0cnVjdCBpcDZfcnRoZHIwICopIENNU0dfREFUQShjbXNnKTsKKworCWNtc2ctPmNtc2dfbGVuICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCWhkci0+aXA2cjBfbGVuICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIC8gODsKKworCW1lbWNweSgmaGRyLT5pcDZyMF9hZGRyW2hkci0+aXA2cjBfc2VnbGVmdCsrXSwgYWRkciwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwordW5zaWduZWQgaW50IGlmX25hbWUyaW5kZXgoY29uc3QgY2hhciAqaWZuYW1lKQoreworCXVuc2lnbmVkIGludCBpID0gaWZfbmFtZXRvaW5kZXgoaWZuYW1lKTsKKwlpZiAoIWkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJwaW5nOiB1bmtub3duIGlmYWNlICVzXG4iLCBpZm5hbWUpOworCQlleGl0KDIpOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RydWN0IG5pcXVlcnlfb3B0aW9uIHsKKwljaGFyICpuYW1lOworCWludCBuYW1lbGVuOworCWludCBoYXNfYXJnOworCWludCBkYXRhOworCWludCAoKmhhbmRsZXIpKGludCBpbmRleCwgY29uc3QgY2hhciAqYXJnKTsKK307CisKKyNkZWZpbmUgTklRVUVSWV9PUFRJT04oX25hbWUsIF9oYXNfYXJnLCBfZGF0YSwgX2hhbmRsZXIpCVwKKwl7CQkJCQkJCVwKKwkJLm5hbWUgPSBfbmFtZSwJCQkJCVwKKwkJLm5hbWVsZW4gPSBzaXplb2YoX25hbWUpIC0gMSwJCQlcCisJCS5oYXNfYXJnID0gX2hhc19hcmcsCQkJCVwKKwkJLmRhdGEgPSBfZGF0YSwJCQkJCVwKKwkJLmhhbmRsZXIgPSBfaGFuZGxlcgkJCQlcCisJfQorCitzdGF0aWMgaW50IG5pcXVlcnlfb3B0aW9uX25hbWVfaGFuZGxlcihpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmFyZyk7CitzdGF0aWMgaW50IG5pcXVlcnlfb3B0aW9uX2lwdjZfaGFuZGxlcihpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmFyZyk7CitzdGF0aWMgaW50IG5pcXVlcnlfb3B0aW9uX2lwdjZfZmxhZ19oYW5kbGVyKGludCBpbmRleCwgY29uc3QgY2hhciAqYXJnKTsKK3N0YXRpYyBpbnQgbmlxdWVyeV9vcHRpb25faXB2NF9oYW5kbGVyKGludCBpbmRleCwgY29uc3QgY2hhciAqYXJnKTsKK3N0YXRpYyBpbnQgbmlxdWVyeV9vcHRpb25faXB2NF9mbGFnX2hhbmRsZXIoaW50IGluZGV4LCBjb25zdCBjaGFyICphcmcpOworc3RhdGljIGludCBuaXF1ZXJ5X29wdGlvbl9zdWJqZWN0X2FkZHJfaGFuZGxlcihpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmFyZyk7CitzdGF0aWMgaW50IG5pcXVlcnlfb3B0aW9uX3N1YmplY3RfbmFtZV9oYW5kbGVyKGludCBpbmRleCwgY29uc3QgY2hhciAqYXJnKTsKK3N0YXRpYyBpbnQgbmlxdWVyeV9vcHRpb25faGVscF9oYW5kbGVyKGludCBpbmRleCwgY29uc3QgY2hhciAqYXJnKTsKKworc3RydWN0IG5pcXVlcnlfb3B0aW9uIG5pcXVlcnlfb3B0aW9uc1tdID0geworCU5JUVVFUllfT1BUSU9OKCJuYW1lIiwJCQkwLAkwLAkJCQluaXF1ZXJ5X29wdGlvbl9uYW1lX2hhbmRsZXIpLAorCU5JUVVFUllfT1BUSU9OKCJmcWRuIiwJCQkwLAkwLAkJCQluaXF1ZXJ5X29wdGlvbl9uYW1lX2hhbmRsZXIpLAorCU5JUVVFUllfT1BUSU9OKCJpcHY2IiwJCQkwLAkwLAkJCQluaXF1ZXJ5X29wdGlvbl9pcHY2X2hhbmRsZXIpLAorCU5JUVVFUllfT1BUSU9OKCJpcHY2LWFsbCIsCQkwLAlOSV9JUFY2QUREUl9GX0FMTCwJCW5pcXVlcnlfb3B0aW9uX2lwdjZfZmxhZ19oYW5kbGVyKSwKKwlOSVFVRVJZX09QVElPTigiaXB2Ni1jb21wYXRpYmxlIiwJMCwJTklfSVBWNkFERFJfRl9DT01QQVQsCQluaXF1ZXJ5X29wdGlvbl9pcHY2X2ZsYWdfaGFuZGxlciksCisJTklRVUVSWV9PUFRJT04oImlwdjYtbGlua2xvY2FsIiwJMCwJTklfSVBWNkFERFJfRl9MSU5LTE9DQUwsCW5pcXVlcnlfb3B0aW9uX2lwdjZfZmxhZ19oYW5kbGVyKSwKKwlOSVFVRVJZX09QVElPTigiaXB2Ni1zaXRlbG9jYWwiLAkwLAlOSV9JUFY2QUREUl9GX1NJVEVMT0NBTCwJbmlxdWVyeV9vcHRpb25faXB2Nl9mbGFnX2hhbmRsZXIpLAorCU5JUVVFUllfT1BUSU9OKCJpcHY2LWdsb2JhbCIsCQkwLAlOSV9JUFY2QUREUl9GX0dMT0JBTCwJCW5pcXVlcnlfb3B0aW9uX2lwdjZfZmxhZ19oYW5kbGVyKSwKKwlOSVFVRVJZX09QVElPTigiaXB2NCIsCQkJMCwJMCwJCQkJbmlxdWVyeV9vcHRpb25faXB2NF9oYW5kbGVyKSwKKwlOSVFVRVJZX09QVElPTigiaXB2NC1hbGwiLAkJMCwJTklfSVBWNEFERFJfRl9BTEwsCQluaXF1ZXJ5X29wdGlvbl9pcHY0X2ZsYWdfaGFuZGxlciksCisJTklRVUVSWV9PUFRJT04oInN1YmplY3QtaXB2NiIsCQkxLAlOSV9TVUJKX0lQVjYsCQkJbmlxdWVyeV9vcHRpb25fc3ViamVjdF9hZGRyX2hhbmRsZXIpLAorCU5JUVVFUllfT1BUSU9OKCJzdWJqZWN0LWlwdjQiLAkJMSwJTklfU1VCSl9JUFY0LAkJCW5pcXVlcnlfb3B0aW9uX3N1YmplY3RfYWRkcl9oYW5kbGVyKSwKKwlOSVFVRVJZX09QVElPTigic3ViamVjdC1uYW1lIiwJCTEsCTAsCQkJCW5pcXVlcnlfb3B0aW9uX3N1YmplY3RfbmFtZV9oYW5kbGVyKSwKKwlOSVFVRVJZX09QVElPTigic3ViamVjdC1mcWRuIiwJCTEsCS0xLAkJCQluaXF1ZXJ5X29wdGlvbl9zdWJqZWN0X25hbWVfaGFuZGxlciksCisJTklRVUVSWV9PUFRJT04oImhlbHAiLAkJCTAsCTAsCQkJCW5pcXVlcnlfb3B0aW9uX2hlbHBfaGFuZGxlciksCisJe30sCit9OworCitzdGF0aWMgaW5saW5lIGludCBuaXF1ZXJ5X2lzX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gbmlfcXVlcnkgPj0gMDsKK30KKworI2lmIFBJTkc2X05PTkNFX01FTU9SWQorX191OCAqbmlfbm9uY2VfcHRyOworI2Vsc2UKK3N0cnVjdCB7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJcGlkX3QgcGlkOworfSBuaV9ub25jZV9zZWNyZXQ7CisjZW5kaWYKKworc3RhdGljIHZvaWQgbmlxdWVyeV9pbml0X25vbmNlKHZvaWQpCit7CisjaWYgUElORzZfTk9OQ0VfTUVNT1JZCisJc3RydWN0IHRpbWV2YWwgdHY7CisJdW5zaWduZWQgbG9uZyBzZWVkOworCisJc2VlZCA9ICh1bnNpZ25lZCBsb25nKWdldHBpZCgpOworCWlmICghZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCkpCisJCXNlZWQgXj0gdHYudHZfdXNlYzsKKwlzcmFuZChzZWVkKTsKKworCW5pX25vbmNlX3B0ciA9IGNhbGxvYyhOSV9OT05DRV9TSVpFLCBNQVhfRFVQX0NISyk7CisJaWYgKCFuaV9ub25jZV9wdHIpIHsKKwkJcGVycm9yKCJwaW5nNjogY2FsbG9jIik7CisJCWV4aXQoMik7CisJfQorCisJbmlfbm9uY2VfcHRyWzBdID0gfjA7CisjZWxzZQorCWdldHRpbWVvZmRheSgmbmlfbm9uY2Vfc2VjcmV0LnR2LCBOVUxMKTsKKwluaV9ub25jZV9zZWNyZXQucGlkID0gZ2V0cGlkKCk7CisjZW5kaWYKK30KKworI2lmICFQSU5HNl9OT05DRV9NRU1PUlkKK3N0YXRpYyBpbnQgbmlxdWVyeV9ub25jZShfX3U4ICpub25jZSwgaW50IGZpbGwpCit7CisJc3RhdGljIF9fdTggZGlnZXN0W01ENV9ESUdFU1RfTEVOR1RIXTsKKwlzdGF0aWMgaW50IHNlcSA9IC0xOworCisJaWYgKGZpbGwgfHwgc2VxICE9ICooX191MTYgKilub25jZSB8fCBzZXEgPCAwKSB7CisJCU1ENV9DVFggY3R4dDsKKworCQlNRDVfSW5pdCgmY3R4dCk7CisJCU1ENV9VcGRhdGUoJmN0eHQsICZuaV9ub25jZV9zZWNyZXQsIHNpemVvZihuaV9ub25jZV9zZWNyZXQpKTsKKwkJTUQ1X1VwZGF0ZSgmY3R4dCwgbm9uY2UsIHNpemVvZihfX3UxNikpOworCQlNRDVfRmluYWwoZGlnZXN0LCAmY3R4dCk7CisKKwkJc2VxID0gKihfX3UxNiAqKW5vbmNlOworCX0KKworCWlmIChmaWxsKSB7CisJCW1lbWNweShub25jZSArIHNpemVvZihfX3UxNiksIGRpZ2VzdCwgTklfTk9OQ0VfU0laRSAtIHNpemVvZihfX3UxNikpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAobWVtY21wKG5vbmNlICsgc2l6ZW9mKF9fdTE2KSwgZGlnZXN0LCBOSV9OT05DRV9TSVpFIC0gc2l6ZW9mKF9fdTE2KSkpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiBudG9oc3AoKF9fdTE2ICopbm9uY2UpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgbmlxdWVyeV9maWxsX25vbmNlKF9fdTE2IHNlcSwgX191OCAqbm9uY2UpCit7CisJX191MTYgdiA9IGh0b25zKHNlcSk7CisjaWYgUElORzZfTk9OQ0VfTUVNT1JZCisJaW50IGk7CisKKwltZW1jcHkoJm5pX25vbmNlX3B0cltOSV9OT05DRV9TSVpFICogKHNlcSAlIE1BWF9EVVBfQ0hLKV0sICZ2LCBzaXplb2YodikpOworCisJZm9yIChpID0gc2l6ZW9mKHYpOyBpIDwgTklfTk9OQ0VfU0laRTsgaSsrKQorCQluaV9ub25jZV9wdHJbTklfTk9OQ0VfU0laRSAqIChzZXEgJSBNQVhfRFVQX0NISykgKyBpXSA9IDB4MTAwICogKHJhbmQoKSAvIChSQU5EX01BWCArIDEuMCkpOworCisJbWVtY3B5KG5vbmNlLCAmbmlfbm9uY2VfcHRyW05JX05PTkNFX1NJWkUgKiAoc2VxICUgTUFYX0RVUF9DSEspXSwgTklfTk9OQ0VfU0laRSk7CisjZWxzZQorCW1lbWNweShub25jZSwgJnYsIHNpemVvZih2KSk7CisJbmlxdWVyeV9ub25jZShub25jZSwgMSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgbmlxdWVyeV9jaGVja19ub25jZShfX3U4ICpub25jZSkKK3sKKyNpZiBQSU5HNl9OT05DRV9NRU1PUlkKKwlfX3UxNiBzZXEgPSBudG9oc3AoKF9fdTE2ICopbm9uY2UpOworCWlmIChtZW1jbXAobm9uY2UsICZuaV9ub25jZV9wdHJbTklfTk9OQ0VfU0laRSAqIChzZXEgJSBNQVhfRFVQX0NISyldLCBOSV9OT05DRV9TSVpFKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBzZXE7CisjZWxzZQorCXJldHVybiBuaXF1ZXJ5X25vbmNlKG5vbmNlLCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IG5pcXVlcnlfc2V0X3F0eXBlKGludCB0eXBlKQoreworCWlmIChuaXF1ZXJ5X2lzX2VuYWJsZWQoKSAmJiBuaV9xdWVyeSAhPSB0eXBlKSB7CisJCXByaW50ZigiUXR5cGUgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW5pX3F1ZXJ5ID0gdHlwZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuaXF1ZXJ5X29wdGlvbl9uYW1lX2hhbmRsZXIoaW50IGluZGV4LCBjb25zdCBjaGFyICphcmcpCit7CisJaWYgKG5pcXVlcnlfc2V0X3F0eXBlKE5JX1FUWVBFX05BTUUpIDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5pcXVlcnlfb3B0aW9uX2lwdjZfaGFuZGxlcihpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpZiAobmlxdWVyeV9zZXRfcXR5cGUoTklfUVRZUEVfSVBWNkFERFIpIDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5pcXVlcnlfb3B0aW9uX2lwdjZfZmxhZ19oYW5kbGVyKGludCBpbmRleCwgY29uc3QgY2hhciAqYXJnKQoreworCWlmIChuaXF1ZXJ5X3NldF9xdHlwZShOSV9RVFlQRV9JUFY2QUREUikgPCAwKQorCQlyZXR1cm4gLTE7CisJbmlfZmxhZyB8PSBuaXF1ZXJ5X29wdGlvbnNbaW5kZXhdLmRhdGE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmlxdWVyeV9vcHRpb25faXB2NF9oYW5kbGVyKGludCBpbmRleCwgY29uc3QgY2hhciAqYXJnKQoreworCWlmIChuaXF1ZXJ5X3NldF9xdHlwZShOSV9RVFlQRV9JUFY0QUREUikgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmlxdWVyeV9vcHRpb25faXB2NF9mbGFnX2hhbmRsZXIoaW50IGluZGV4LCBjb25zdCBjaGFyICphcmcpCit7CisJaWYgKG5pcXVlcnlfc2V0X3F0eXBlKE5JX1FUWVBFX0lQVjRBRERSKSA8IDApCisJCXJldHVybiAtMTsKKwluaV9mbGFnIHw9IG5pcXVlcnlfb3B0aW9uc1tpbmRleF0uZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmlxdWVyeV9pc19zdWJqZWN0X3ZhbGlkKHZvaWQpCit7CisJcmV0dXJuIG5pX3N1YmplY3RfdHlwZSA+PSAwICYmIG5pX3N1YmplY3Q7Cit9CisKK3N0YXRpYyBpbnQgbmlxdWVyeV9zZXRfc3ViamVjdF90eXBlKGludCB0eXBlKQoreworCWlmIChuaXF1ZXJ5X2lzX3N1YmplY3RfdmFsaWQoKSAmJiBuaV9zdWJqZWN0X3R5cGUgIT0gdHlwZSkgeworCQlwcmludGYoIlN1YmplY3QgdHlwZSBjb25mbGljdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJbmlfc3ViamVjdF90eXBlID0gdHlwZTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KQkoc2l6ZW9mKGFycmF5KSAvIHNpemVvZihhcnJheVswXSkpCisjZGVmaW5lIE9GRlNFVF9PRih0eXBlLGVsZW0pCSgoc2l6ZV90KSYoKHR5cGUgKikwKS0+ZWxlbSkKKworc3RhdGljIGludCBuaXF1ZXJ5X29wdGlvbl9zdWJqZWN0X2FkZHJfaGFuZGxlcihpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaTAsICphaTsKKwlpbnQgb2Zmc2V0OworCWludCBnYWk7CisKKwlpZiAobmlxdWVyeV9zZXRfc3ViamVjdF90eXBlKG5pcXVlcnlfb3B0aW9uc1tpbmRleF0uZGF0YSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwluaV9zdWJqZWN0X3R5cGUgPSBuaXF1ZXJ5X29wdGlvbnNbaW5kZXhdLmRhdGE7CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKworCXN3aXRjaCAobmlxdWVyeV9vcHRpb25zW2luZGV4XS5kYXRhKSB7CisJY2FzZSBOSV9TVUJKX0lQVjY6CisJCW5pX3N1YmplY3RfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJCW9mZnNldCA9IE9GRlNFVF9PRihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpOworCQloaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJYnJlYWs7CisJY2FzZSBOSV9TVUJKX0lQVjQ6CisJCW5pX3N1YmplY3RfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJb2Zmc2V0ID0gT0ZGU0VUX09GKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpOworCQloaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzaG91bGQgbm90IGhhcHBlbi4gKi8KKwkJb2Zmc2V0ID0gLTE7CisJfQorCisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworI2lmZGVmIFVTRV9JRE4KKwloaW50cy5haV9mbGFncyA9IEFJX0lETjsKKyNlbmRpZgorCisJZ2FpID0gZ2V0YWRkcmluZm8oYXJnLCAwLCAmaGludHMsICZhaTApOworCWlmIChnYWkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGhvc3Q6ICVzXG4iLCBhcmcpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChhaSA9IGFpMDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJdm9pZCAqcCA9IG1hbGxvYyhuaV9zdWJqZWN0X2xlbik7CisJCWlmICghcCkKKwkJCWNvbnRpbnVlOworCQltZW1jcHkocCwgKF9fdTggKilhaS0+YWlfYWRkciArIG9mZnNldCwgbmlfc3ViamVjdF9sZW4pOworCQlmcmVlKG5pX3N1YmplY3QpOworCQluaV9zdWJqZWN0ID0gcDsKKwkJYnJlYWs7CisJfQorCWZyZWVhZGRyaW5mbyhhaTApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmlxdWVyeV9vcHRpb25fc3ViamVjdF9uYW1lX2hhbmRsZXIoaW50IGluZGV4LCBjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNoYXIgbmlncm91cF9idWZbSU5FVDZfQUREUlNUUkxFTiArIDEgKyBJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciAqZG5wdHJzWzJdLCAqKmRwcCwgKipsYXN0ZG5wdHI7CisJaW50IG47CisJaW50IGk7CisJY2hhciAqbmFtZSwgKnA7CisJY2hhciAqY2Fub25uYW1lID0gTlVMTCwgKmlkbiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKKwlzaXplX3QgbmFtZWxlbjsKKwlzaXplX3QgYnVmbGVuOworCWludCBkb3RzLCBmcWRuID0gbmlxdWVyeV9vcHRpb25zW2luZGV4XS5kYXRhOworCU1ENV9DVFggY3R4dDsKKwlfX3U4IGRpZ2VzdFtNRDVfRElHRVNUX0xFTkdUSF07CisjaWZkZWYgVVNFX0lETgorCWludCByYzsKKyNlbmRpZgorCisJaWYgKG5pcXVlcnlfc2V0X3N1YmplY3RfdHlwZShOSV9TVUJKX05BTUUpIDwgMCkKKwkJcmV0dXJuIC0xOworCisjaWZkZWYgVVNFX0lETgorCW5hbWUgPSBzdHJpbmdwcmVwX2xvY2FsZV90b191dGY4KGFyZyk7CisJaWYgKCFuYW1lKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGluZzY6IElETiBzdXBwb3J0IGZhaWxlZC5cbiIpOworCQlleGl0KDIpOworCX0KKyNlbHNlCisJbmFtZSA9IHN0cmR1cChhcmcpOworCWlmICghbmFtZSkKKwkJZ290byBvb21leGl0OworI2VuZGlmCisKKwlwID0gc3RyY2hyKG5hbWUsIFNDT1BFX0RFTElNSVRFUik7CisJaWYgKHApIHsKKwkJKnAgPSAnXDAnOworCQlpZiAoc3RybGVuKHAgKyAxKSA+PSBJRk5BTVNJWikgeworCQkJZnByaW50ZihzdGRlcnIsICJwaW5nNjogdG9vIGxvbmcgc2NvcGUgbmFtZS5cbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworI2lmZGVmIFVTRV9JRE4KKwlyYyA9IGlkbmFfdG9fYXNjaWlfOHoobmFtZSwgJmlkbiwgMCk7CisJaWYgKHJjKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGluZzY6IElETiBlbmNvZGluZyBlcnJvcjogJXNcbiIsCisJCQlpZG5hX3N0cmVycm9yKHJjKSk7CisJCWV4aXQoMik7CisJfQorI2Vsc2UKKwlpZG4gPSBzdHJkdXAobmFtZSk7CisJaWYgKCFpZG4pCisJCWdvdG8gb29tZXhpdDsKKyNlbmRpZgorCisJbmFtZWxlbiA9IHN0cmxlbihpZG4pOworCWNhbm9ubmFtZSA9IG1hbGxvYyhuYW1lbGVuICsgMSk7CisJaWYgKCFjYW5vbm5hbWUpCisJCWdvdG8gb29tZXhpdDsKKworCWRvdHMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBuYW1lbGVuICsgMTsgaSsrKSB7CisJCWNhbm9ubmFtZVtpXSA9IGlzdXBwZXIoaWRuW2ldKSA/IHRvbG93ZXIoaWRuW2ldKSA6IGlkbltpXTsKKwkJaWYgKGlkbltpXSA9PSAnLicpCisJCQlkb3RzKys7CisJfQorCisJaWYgKGZxZG4gPT0gMCkgeworCQkvKiBndWVzcyBpZiBob3N0bmFtZSBpcyBGUUROICovCisJCWZxZG4gPSBkb3RzID8gMSA6IC0xOworCX0KKworCWJ1ZmxlbiA9IG5hbWVsZW4gKyAzICsgMTsJLyogZG5fY29tcCgpIHJlcXVyaXJlcyBzdHJsZW4oKSArIDMsCisJCQkJCSAgIHBsdXMgbm9uLWZxZG4gaW5kaWNhdG9yLiAqLworCWJ1ZiA9IG1hbGxvYyhidWZsZW4pOworCWlmICghYnVmKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGluZzY6IG91dCBvZiBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJleGl0OworCX0KKworCWRwcCA9IGRucHRyczsKKwlsYXN0ZG5wdHIgPSAmZG5wdHJzW0FSUkFZX1NJWkUoZG5wdHJzKV07CisKKwkqZHBwKysgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKwkqZHBwKysgPSBOVUxMOworCisJbiA9IGRuX2NvbXAoY2Fub25uYW1lLCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgYnVmbGVuLCBkbnB0cnMsIGxhc3RkbnB0cik7CisJaWYgKG4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGluZzY6IEluYXBwcm9wcmlhdGUgc3ViamVjdCBuYW1lOiAlc1xuIiwgY2Fub25uYW1lKTsKKwkJZ290byBlcnJleGl0OworCX0gZWxzZSBpZiAobiA+PSBidWZsZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJwaW5nNjogZG5fY29tcCgpIHJldHVybmVkIHRvbyBsb25nIHJlc3VsdC5cbiIpOworCQlnb3RvIGVycmV4aXQ7CisJfQorCisJTUQ1X0luaXQoJmN0eHQpOworCU1ENV9VcGRhdGUoJmN0eHQsIGJ1ZiwgYnVmWzBdKTsKKwlNRDVfRmluYWwoZGlnZXN0LCAmY3R4dCk7CisKKwlzcHJpbnRmKG5pZ3JvdXBfYnVmLCAiZmYwMjo6MjolMDJ4JTAyeDolMDJ4JTAyeCVzJXMiLAorCQlkaWdlc3RbMF0sIGRpZ2VzdFsxXSwgZGlnZXN0WzJdLCBkaWdlc3RbM10sCisJCXAgPyAiJSIgOiAiIiwKKwkJcCA/IHAgKyAxIDogIiIpOworCisJaWYgKGZxZG4gPCAwKQorCQlidWZbbl0gPSAwOworCisJZnJlZShuaV9zdWJqZWN0KTsKKworCW5pX2dyb3VwID0gbmlncm91cF9idWY7CisJbmlfc3ViamVjdCA9IGJ1ZjsKKwluaV9zdWJqZWN0X2xlbiA9IG4gKyAoZnFkbiA8IDApOworCW5pX2dyb3VwID0gbmlncm91cF9idWY7CisKKwlmcmVlKGNhbm9ubmFtZSk7CisJZnJlZShpZG4pOworCWZyZWUobmFtZSk7CisKKwlyZXR1cm4gMDsKK29vbWV4aXQ6CisJZnByaW50ZihzdGRlcnIsICJwaW5nNjogb3V0IG9mIG1lbW9yeS5cbiIpOworZXJyZXhpdDoKKwlmcmVlKGJ1Zik7CisJZnJlZShjYW5vbm5hbWUpOworCWZyZWUoaWRuKTsKKwlmcmVlKG5hbWUpOworCWV4aXQoMSk7Cit9CisKK2ludCBuaXF1ZXJ5X29wdGlvbl9oZWxwX2hhbmRsZXIoaW50IGluZGV4LCBjb25zdCBjaGFyICphcmcpCit7CisJZnByaW50ZihzdGRlcnIsICJwaW5nNiAtTiBzdWJvcHRpb25zXG4iCisJCQkiXHRIZWxwOlxuIgorCQkJIlx0XHRoZWxwXG4iCisJCQkiXHRRdWVyeTpcbiIKKwkJCSJcdFx0bmFtZSxcbiIKKwkJCSJcdFx0aXB2NixpcHY2LWFsbCxpcHY2LWNvbXBhdGlibGUsaXB2Ni1saW5rbG9jYWwsaXB2Ni1zaXRlbG9jYWwsaXB2Ni1nbG9iYWwsXG4iCisJCQkiXHRcdGlwdjQsaXB2NC1hbGwsXG4iCisJCQkiXHRTdWJqZWN0OlxuIgorCQkJIlx0XHRzdWJqZWN0LWlwdjY9YWRkcixzdWJqZWN0LWlwdjQ9YWRkcixzdWJqZWN0LW5hbWU9bmFtZSxzdWJqZWN0LWZxZG49bmFtZSxcbiIKKwkJKTsKKwlleGl0KDIpOworfQorCitpbnQgbmlxdWVyeV9vcHRpb25faGFuZGxlcihjb25zdCBjaGFyICpvcHRfYXJnKQoreworCXN0cnVjdCBuaXF1ZXJ5X29wdGlvbiAqcDsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gLTE7CisJZm9yIChpID0gMCwgcCA9IG5pcXVlcnlfb3B0aW9uczsgcC0+bmFtZTsgaSsrLCBwKyspIHsKKwkJaWYgKHN0cm5jbXAocC0+bmFtZSwgb3B0X2FyZywgcC0+bmFtZWxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKCFwLT5oYXNfYXJnKSB7CisJCQlpZiAob3B0X2FyZ1twLT5uYW1lbGVuXSA9PSAnXDAnKSB7CisJCQkJcmV0ID0gcC0+aGFuZGxlcihpLCBOVUxMKTsKKwkJCQlpZiAocmV0ID49IDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG9wdF9hcmdbcC0+bmFtZWxlbl0gPT0gJz0nKSB7CisJCQkJcmV0ID0gcC0+aGFuZGxlcihpLCAmb3B0X2FyZ1twLT5uYW1lbGVuXSArIDEpOworCQkJCWlmIChyZXQgPj0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCFwLT5uYW1lKQorCQlyZXQgPSBuaXF1ZXJ5X29wdGlvbl9oZWxwX2hhbmRsZXIoMCwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoZXh0b3VpKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwljaGFyICplcDsKKworCWVycm5vID0gMDsKKwl2YWwgPSBzdHJ0b3VsKHN0ciwgJmVwLCAxNik7CisJaWYgKCplcCkgeworCQlpZiAoIWVycm5vKQorCQkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodmFsID4gVUlOVF9NQVgpIHsKKwkJZXJybm8gPSBFUkFOR0U7CisJCXJldHVybiBVSU5UX01BWDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjaCwgaG9sZCwgcGFja2xlbjsKKwl1X2NoYXIgKnBhY2tldDsKKwljaGFyICp0YXJnZXQ7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWk7CisJaW50IGdhaTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGZpcnN0aG9wOworCWludCBzb2NrZXRfZXJybm8gPSAwOworCXN0cnVjdCBpY21wNl9maWx0ZXIgZmlsdGVyOworCWludCBlcnI7CisjaWZkZWYgX19saW51eF9fCisJaW50IGNzdW1fb2Zmc2V0LCBzel9vcHQ7CisjZW5kaWYKKwlzdGF0aWMgdWludDMyX3Qgc2NvcGVfaWQgPSAwOworCisjaWZkZWYgQU5EUk9JRAorCWFuZHJvaWRfY2hlY2tfc2VjdXJpdHkoKTsKKyNlbmRpZgorCisJbGltaXRfY2FwYWJpbGl0aWVzKCk7CisKKyNpZmRlZiBVU0VfSUROCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworI2VuZGlmCisKKwlpY21wX3NvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIElQUFJPVE9fSUNNUFY2KTsKKwlpZiAoaWNtcF9zb2NrIDwgMCkgeworCQllbmFibGVfY2FwYWJpbGl0eV9yYXcoKTsKKwkJaWNtcF9zb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpOworCQlzb2NrZXRfZXJybm8gPSBlcnJubzsKKwkJZGlzYWJsZV9jYXBhYmlsaXR5X3JhdygpOworCQl1c2luZ19waW5nX3NvY2tldCA9IDA7CisJfQorCisJc291cmNlLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJbWVtc2V0KCZmaXJzdGhvcCwgMCwgc2l6ZW9mKGZpcnN0aG9wKSk7CisJZmlyc3Rob3Auc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKworCXByZWxvYWQgPSAxOworCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgQ09NTU9OX09QVFNUUiAiRjpOOiIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoKGNoKSB7CisJCWNhc2UgJ0YnOgorCQkJZmxvd2xhYmVsID0gaGV4dG91aShvcHRhcmcpOworCQkJaWYgKGVycm5vIHx8IChmbG93bGFiZWwgJiB+SVBWNl9GTE9XSU5GT19GTE9XTEFCRUwpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBJbnZhbGlkIGZsb3dpbmZvICVzXG4iLCBvcHRhcmcpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlvcHRpb25zIHw9IEZfRkxPV0lORk87CisJCQlicmVhazsKKwkJY2FzZSAnUSc6CisJCQl0Y2xhc3MgPSBoZXh0b3VpKG9wdGFyZyk7CisJCQlpZiAoZXJybm8gfHwgKHRjbGFzcyAmIH4weGZmKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAicGluZzogSW52YWxpZCB0Y2xhc3MgJXNcbiIsIG9wdGFyZyk7CisJCQkJZXhpdCgyKTsKKwkJCX0KKwkJCW9wdGlvbnMgfD0gRl9UQ0xBU1M7CisJCQlicmVhazsKKwkJY2FzZSAnSSc6CisJCQlpZiAoc3RyY2hyKG9wdGFyZywgJzonKSkgeworCQkJCWNoYXIgKnAsICphZGRyID0gc3RyZHVwKG9wdGFyZyk7CisKKwkJCQlpZiAoIWFkZHIpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCQkJZXhpdCgyKTsKKwkJCQl9CisKKwkJCQlwID0gc3RyY2hyKGFkZHIsIFNDT1BFX0RFTElNSVRFUik7CisJCQkJaWYgKHApIHsKKwkJCQkJKnAgPSAnXDAnOworCQkJCQlkZXZpY2UgPSBvcHRhcmcgKyAocCAtIGFkZHIpICsgMTsKKwkJCQl9CisKKwkJCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBhZGRyLCAoY2hhciopJnNvdXJjZS5zaW42X2FkZHIpIDw9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBpbnZhbGlkIHNvdXJjZSBhZGRyZXNzICVzXG4iLCBvcHRhcmcpOworCQkJCQlleGl0KDIpOworCQkJCX0KKworCQkJCW9wdGlvbnMgfD0gRl9TVFJJQ1RTT1VSQ0U7CisKKwkJCQlmcmVlKGFkZHIpOworCQkJfSBlbHNlIHsKKwkJCQlkZXZpY2UgPSBvcHRhcmc7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQlpZiAoc3RyY21wKG9wdGFyZywgImRvIikgPT0gMCkKKwkJCQlwbXR1ZGlzYyA9IElQVjZfUE1UVURJU0NfRE87CisJCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZG9udCIpID09IDApCisJCQkJcG10dWRpc2MgPSBJUFY2X1BNVFVESVNDX0RPTlQ7CisJCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAid2FudCIpID09IDApCisJCQkJcG10dWRpc2MgPSBJUFY2X1BNVFVESVNDX1dBTlQ7CisJCQllbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IHdyb25nIHZhbHVlIGZvciAtTTogZG8sIGRvbnQsIHdhbnQgYXJlIHZhbGlkIG9uZXMuXG4iKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRmKCJwaW5nNiB1dGlsaXR5LCBpcHV0aWxzLSVzXG4iLCBTTkFQU0hPVCk7CisJCQlleGl0KDApOworCQljYXNlICdOJzoKKwkJCWlmICh1c2luZ19waW5nX3NvY2tldCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAicGluZzogLU4gcmVxdWlyZXMgcmF3IHNvY2tldCBwZXJtaXNzaW9uc1xuIik7CisJCQkJZXhpdCgyKTsKKwkJCX0KKwkJCWlmIChuaXF1ZXJ5X29wdGlvbl9oYW5kbGVyKG9wdGFyZykgPCAwKSB7CisJCQkJdXNhZ2UoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlDT01NT05fT1BUSU9OUworCQkJY29tbW9uX29wdGlvbnMoY2gpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CisJfQorCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisjaWZkZWYgRU5BQkxFX1BJTkc2X1JUSERSCisJd2hpbGUgKGFyZ2MgPiAxKSB7CisJCXN0cnVjdCBpbjZfYWRkciAqYWRkcjsKKworCQlpZiAoc3JjcnQgPT0gTlVMTCkgeworCQkJaW50IHNwYWNlOworCisJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc2OiBXYXJuaW5nOiAiCisJCQkJCSJTb3VyY2Ugcm91dGluZyBpcyBkZXByZWNhdGVkIGJ5IFJGQzUwOTUuXG4iKTsKKworI2lmZGVmIEVOQUJMRV9QSU5HNl9SVEhEUl9SRkMzNTQyCisJCQlzcGFjZSA9IGluZXQ2X3J0aF9zcGFjZShJUFY2X1JUSERSX1RZUEVfMCwgYXJnYyAtIDEpOworI2Vsc2UKKwkJCXNwYWNlID0gaW5ldDZfc3JjcnRfc3BhY2UoSVBWNl9TUkNSVF9UWVBFXzAsIGFyZ2MgLSAxKTsKKyNlbmRpZgorCQkJaWYgKHNwYWNlID09IDApCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInNyY3J0X3NwYWNlIGZhaWxlZFxuIik7CisJCQkJZXhpdCgyKTsKKwkJCX0KKyNpZmRlZiBFTkFCTEVfUElORzZfUlRIRFJfUkZDMzU0MgorCQkJaWYgKGNtc2dsZW4gKyBDTVNHX1NQQUNFKHNwYWNlKSA+IHNpemVvZihjbXNnYnVmKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAibm8gcm9vbSBmb3Igb3B0aW9uc1xuIik7CisJCQkJZXhpdCgyKTsKKwkJCX0KKyNlbHNlCisJCQlpZiAoc3BhY2UgKyBjbXNnbGVuID4gc2l6ZW9mKGNtc2didWYpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJubyByb29tIGZvciBvcHRpb25zXG4iKTsKKwkJCQlleGl0KDIpOworCQkJfQorI2VuZGlmCisJCQlzcmNydCA9IChzdHJ1Y3QgY21zZ2hkciopKGNtc2didWYrY21zZ2xlbik7CisjaWZkZWYgRU5BQkxFX1BJTkc2X1JUSERSX1JGQzM1NDIKKwkJCW1lbXNldChzcmNydCwgMCwgQ01TR19TUEFDRSgwKSk7CisJCQlzcmNydC0+Y21zZ19sZW4gPSBDTVNHX0xFTihzcGFjZSk7CisJCQlzcmNydC0+Y21zZ19sZXZlbCA9IElQUFJPVE9fSVBWNjsKKwkJCXNyY3J0LT5jbXNnX3R5cGUgPSBJUFY2X1JUSERSOworCQkJaW5ldDZfcnRoX2luaXQoQ01TR19EQVRBKHNyY3J0KSwgc3BhY2UsIElQVjZfUlRIRFJfVFlQRV8wLCBhcmdjIC0gMSk7CisJCQljbXNnbGVuICs9IENNU0dfU1BBQ0Uoc3BhY2UpOworI2Vsc2UKKwkJCWNtc2dsZW4gKz0gQ01TR19BTElHTihzcGFjZSk7CisJCQlpbmV0Nl9zcmNydF9pbml0KHNyY3J0LCBJUFY2X1NSQ1JUX1RZUEVfMCk7CisjZW5kaWYKKwkJfQorCisJCXRhcmdldCA9ICphcmd2OworCisJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCQloaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUNjsKKyNpZmRlZiBVU0VfSUROCisJCWhpbnRzLmFpX2ZsYWdzID0gQUlfSUROOworI2VuZGlmCisJCWdhaSA9IGdldGFkZHJpbmZvKHRhcmdldCwgTlVMTCwgJmhpbnRzLCAmYWkpOworCQlpZiAoZ2FpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gaG9zdFxuIik7CisJCQlleGl0KDIpOworCQl9CisJCWFkZHIgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGFpLT5haV9hZGRyKSktPnNpbjZfYWRkcjsKKyNpZmRlZiBFTkFCTEVfUElORzZfUlRIRFJfUkZDMzU0MgorCQlpbmV0Nl9ydGhfYWRkKENNU0dfREFUQShzcmNydCksIGFkZHIpOworI2Vsc2UKKwkJaW5ldDZfc3JjcnRfYWRkKHNyY3J0LCBhZGRyKTsKKyNlbmRpZgorCQlpZiAoSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoJmZpcnN0aG9wLnNpbjZfYWRkcikpIHsKKwkJCW1lbWNweSgmZmlyc3Rob3Auc2luNl9hZGRyLCBhZGRyLCAxNik7CisjaWZkZWYgSEFWRV9TSU42X1NDT1BFSUQKKwkJCWZpcnN0aG9wLnNpbjZfc2NvcGVfaWQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikoYWktPmFpX2FkZHIpKS0+c2luNl9zY29wZV9pZDsKKwkJCS8qIFZlcmlmeSBzY29wZV9pZCBpcyB0aGUgc2FtZSBhcyBwcmV2aW91cyBub2RlcyAqLworCQkJaWYgKGZpcnN0aG9wLnNpbjZfc2NvcGVfaWQgJiYgc2NvcGVfaWQgJiYgZmlyc3Rob3Auc2luNl9zY29wZV9pZCAhPSBzY29wZV9pZCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAic2NvcGUgZGlzY3JlcGFuY3kgYW1vbmcgdGhlIG5vZGVzXG4iKTsKKwkJCQlleGl0KDIpOworCQkJfSBlbHNlIGlmICghc2NvcGVfaWQpIHsKKwkJCQlzY29wZV9pZCA9IGZpcnN0aG9wLnNpbjZfc2NvcGVfaWQ7CisJCQl9CisjZW5kaWYKKwkJfQorCQlmcmVlYWRkcmluZm8oYWkpOworCisJCWFyZ3YrKzsKKwkJYXJnYy0tOworCX0KKyNlbmRpZgorCisJaWYgKG5pcXVlcnlfaXNfZW5hYmxlZCgpKSB7CisJCW5pcXVlcnlfaW5pdF9ub25jZSgpOworCisJCWlmICghbmlxdWVyeV9pc19zdWJqZWN0X3ZhbGlkKCkpIHsKKwkJCW5pX3N1YmplY3QgPSAmd2hlcmV0by5zaW42X2FkZHI7CisJCQluaV9zdWJqZWN0X2xlbiA9IHNpemVvZih3aGVyZXRvLnNpbjZfYWRkcik7CisJCQluaV9zdWJqZWN0X3R5cGUgPSBOSV9TVUJKX0lQVjY7CisJCX0KKwl9CisKKwlpZiAoYXJnYyA+IDEpIHsKKyNpZm5kZWYgRU5BQkxFX1BJTkc2X1JUSERSCisJCWZwcmludGYoc3RkZXJyLCAicGluZzY6IFNvdXJjZSByb3V0aW5nIGlzIGRlcHJlY2F0ZWQgYnkgUkZDNTA5NS5cbiIpOworI2VuZGlmCisJCXVzYWdlKCk7CisJfSBlbHNlIGlmIChhcmdjID09IDEpIHsKKwkJdGFyZ2V0ID0gKmFyZ3Y7CisJfSBlbHNlIHsKKwkJaWYgKG5pX3F1ZXJ5IDwgMCAmJiBuaV9zdWJqZWN0X3R5cGUgIT0gTklfU1VCSl9OQU1FKQorCQkJdXNhZ2UoKTsKKwkJdGFyZ2V0ID0gbmlfZ3JvdXA7CisJfQorCisJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7CisjaWZkZWYgVVNFX0lETgorCWhpbnRzLmFpX2ZsYWdzID0gQUlfSUROOworI2VuZGlmCisJZ2FpID0gZ2V0YWRkcmluZm8odGFyZ2V0LCBOVUxMLCAmaGludHMsICZhaSk7CisJaWYgKGdhaSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gaG9zdFxuIik7CisJCWV4aXQoMik7CisJfQorCisJbWVtY3B5KCZ3aGVyZXRvLCBhaS0+YWlfYWRkciwgc2l6ZW9mKHdoZXJldG8pKTsKKwl3aGVyZXRvLnNpbjZfcG9ydCA9IGh0b25zKElQUFJPVE9fSUNNUFY2KTsKKworCWlmIChtZW1jaHIodGFyZ2V0LCAnOicsIHN0cmxlbih0YXJnZXQpKSkKKwkJb3B0aW9ucyB8PSBGX05VTUVSSUM7CisKKwlmcmVlYWRkcmluZm8oYWkpOworCisJaWYgKElONl9JU19BRERSX1VOU1BFQ0lGSUVEKCZmaXJzdGhvcC5zaW42X2FkZHIpKSB7CisJCW1lbWNweSgmZmlyc3Rob3Auc2luNl9hZGRyLCAmd2hlcmV0by5zaW42X2FkZHIsIDE2KTsKKyNpZmRlZiBIQVZFX1NJTjZfU0NPUEVJRAorCQlmaXJzdGhvcC5zaW42X3Njb3BlX2lkID0gd2hlcmV0by5zaW42X3Njb3BlX2lkOworCQkvKiBWZXJpZnkgc2NvcGVfaWQgaXMgdGhlIHNhbWUgYXMgaW50ZXJtZWRpYXRlIG5vZGVzICovCisJCWlmIChmaXJzdGhvcC5zaW42X3Njb3BlX2lkICYmIHNjb3BlX2lkICYmIGZpcnN0aG9wLnNpbjZfc2NvcGVfaWQgIT0gc2NvcGVfaWQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAic2NvcGUgZGlzY3JlcGFuY3kgYW1vbmcgdGhlIG5vZGVzXG4iKTsKKwkJCWV4aXQoMik7CisJCX0gZWxzZSBpZiAoIXNjb3BlX2lkKSB7CisJCQlzY29wZV9pZCA9IGZpcnN0aG9wLnNpbjZfc2NvcGVfaWQ7CisJCX0KKyNlbmRpZgorCX0KKworCWhvc3RuYW1lID0gdGFyZ2V0OworCisJaWYgKElONl9JU19BRERSX1VOU1BFQ0lGSUVEKCZzb3VyY2Uuc2luNl9hZGRyKSkgeworCQlzb2NrbGVuX3QgYWxlbjsKKwkJaW50IHByb2JlX2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKworCQlpZiAocHJvYmVfZmQgPCAwKSB7CisJCQlwZXJyb3IoInNvY2tldCIpOworCQkJZXhpdCgyKTsKKwkJfQorCQlpZiAoZGV2aWNlKSB7CisjaWYgZGVmaW5lZChJUFY2X1JFQ1ZQS1RJTkZPKSB8fCBkZWZpbmVkKEhBVkVfU0lONl9TQ09QRUlEKQorCQkJdW5zaWduZWQgaW50IGlmYWNlID0gaWZfbmFtZTJpbmRleChkZXZpY2UpOworI2VuZGlmCisjaWZkZWYgSVBWNl9SRUNWUEtUSU5GTworCQkJc3RydWN0IGluNl9wa3RpbmZvIGlwaTsKKworCQkJbWVtc2V0KCZpcGksIDAsIHNpemVvZihpcGkpKTsKKwkJCWlwaS5pcGk2X2lmaW5kZXggPSBpZmFjZTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TSU42X1NDT1BFSUQKKwkJCWlmIChJTjZfSVNfQUREUl9MSU5LTE9DQUwoJmZpcnN0aG9wLnNpbjZfYWRkcikgfHwKKwkJCSAgICBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoJmZpcnN0aG9wLnNpbjZfYWRkcikpCisJCQkJZmlyc3Rob3Auc2luNl9zY29wZV9pZCA9IGlmYWNlOworI2VuZGlmCisJCQllbmFibGVfY2FwYWJpbGl0eV9yYXcoKTsKKwkJCWlmICgKKyNpZmRlZiBJUFY2X1JFQ1ZQS1RJTkZPCisJCQkgICAgc2V0c29ja29wdChwcm9iZV9mZCwgSVBQUk9UT19JUFY2LCBJUFY2X1BLVElORk8sICZpcGksIHNpemVvZihpcGkpKSA9PSAtMSAmJgorI2VuZGlmCisJCQkgICAgc2V0c29ja29wdChwcm9iZV9mZCwgU09MX1NPQ0tFVCwgU09fQklORFRPREVWSUNFLCBkZXZpY2UsIHN0cmxlbihkZXZpY2UpKzEpID09IC0xKSB7CisJCQkJcGVycm9yKCJzZXRzb2Nrb3B0KFNPX0JJTkRUT0RFVklDRSkiKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJZGlzYWJsZV9jYXBhYmlsaXR5X3JhdygpOworCQl9CisJCWZpcnN0aG9wLnNpbjZfcG9ydCA9IGh0b25zKDEwMjUpOworCisJCXNvY2tfc2V0bWFyayhwcm9iZV9mZCk7CisKKwkJaWYgKGNvbm5lY3QocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZmaXJzdGhvcCwgc2l6ZW9mKGZpcnN0aG9wKSkgPT0gLTEpIHsKKwkJCXBlcnJvcigiY29ubmVjdCIpOworCQkJZXhpdCgyKTsKKwkJfQorCQlhbGVuID0gc2l6ZW9mKHNvdXJjZSk7CisJCWlmIChnZXRzb2NrbmFtZShwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvdXJjZSwgJmFsZW4pID09IC0xKSB7CisJCQlwZXJyb3IoImdldHNvY2tuYW1lIik7CisJCQlleGl0KDIpOworCQl9CisJCXNvdXJjZS5zaW42X3BvcnQgPSAwOworCQljbG9zZShwcm9iZV9mZCk7CisKKyNpZm5kZWYgV0lUSE9VVF9JRkFERFJTCisJCWlmIChkZXZpY2UpIHsKKwkJCXN0cnVjdCBpZmFkZHJzICppZmEwLCAqaWZhOworCisJCQlpZiAoZ2V0aWZhZGRycygmaWZhMCkpIHsKKwkJCQlwZXJyb3IoImdldGlmYWRkcnMiKTsKKwkJCQlleGl0KDIpOworCQkJfQorCisJCQlmb3IgKGlmYSA9IGlmYTA7IGlmYTsgaWZhID0gaWZhLT5pZmFfbmV4dCkgeworCQkJCWlmICghaWZhLT5pZmFfYWRkciB8fCBpZmEtPmlmYV9hZGRyLT5zYV9mYW1pbHkgIT0gQUZfSU5FVDYpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghc3RybmNtcChpZmEtPmlmYV9uYW1lLCBkZXZpY2UsIHNpemVvZihkZXZpY2UpIC0gMSkgJiYKKwkJCQkgICAgSU42X0FSRV9BRERSX0VRVUFMKCYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilpZmEtPmlmYV9hZGRyKS0+c2luNl9hZGRyLAorCQkJCQkJICAgICAgICZzb3VyY2Uuc2luNl9hZGRyKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWlmYSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc2OiBXYXJuaW5nOiBzb3VyY2UgYWRkcmVzcyBtaWdodCBiZSBzZWxlY3RlZCBvbiBkZXZpY2Ugb3RoZXIgdGhhbiAlcy5cbiIsIGRldmljZSk7CisKKwkJCWZyZWVpZmFkZHJzKGlmYTApOworCQl9CisjZW5kaWYKKwl9CisjaWZkZWYgSEFWRV9TSU42X1NDT1BFSUQKKwllbHNlIGlmIChkZXZpY2UgJiYgKElONl9JU19BRERSX0xJTktMT0NBTCgmc291cmNlLnNpbjZfYWRkcikgfHwKKwkJCSAgICBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoJnNvdXJjZS5zaW42X2FkZHIpKSkKKwkJc291cmNlLnNpbjZfc2NvcGVfaWQgPSBpZl9uYW1lMmluZGV4KGRldmljZSk7CisjZW5kaWYKKworCWlmIChpY21wX3NvY2sgPCAwKSB7CisJCWVycm5vID0gc29ja2V0X2Vycm5vOworCQlwZXJyb3IoInBpbmc6IGljbXAgb3BlbiBzb2NrZXQiKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlpZiAoZGV2aWNlKSB7CisJCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCQlzdHJ1Y3QgaW42X3BrdGluZm8gKmlwaTsKKworCQljbXNnID0gKHN0cnVjdCBjbXNnaGRyKikoY21zZ2J1ZitjbXNnbGVuKTsKKwkJY21zZ2xlbiArPSBDTVNHX1NQQUNFKHNpemVvZigqaXBpKSk7CisJCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKCppcGkpKTsKKwkJY21zZy0+Y21zZ19sZXZlbCA9IFNPTF9JUFY2OworCQljbXNnLT5jbXNnX3R5cGUgPSBJUFY2X1BLVElORk87CisKKwkJaXBpID0gKHN0cnVjdCBpbjZfcGt0aW5mbyopQ01TR19EQVRBKGNtc2cpOworCQltZW1zZXQoaXBpLCAwLCBzaXplb2YoKmlwaSkpOworCQlpcGktPmlwaTZfaWZpbmRleCA9IGlmX25hbWUyaW5kZXgoZGV2aWNlKTsKKwl9CisKKwlpZiAoKHdoZXJldG8uc2luNl9hZGRyLnM2X2FkZHIxNlswXSZodG9ucygweGZmMDApKSA9PSBodG9ucyAoMHhmZjAwKSkgeworCQlpZiAodWlkKSB7CisJCQlpZiAoaW50ZXJ2YWwgPCAxMDAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBtdWx0aWNhc3QgcGluZyB3aXRoIHRvbyBzaG9ydCBpbnRlcnZhbC5cbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlpZiAocG10dWRpc2MgPj0gMCAmJiBwbXR1ZGlzYyAhPSBJUFY2X1BNVFVESVNDX0RPKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBtdWx0aWNhc3QgcGluZyBkb2VzIG5vdCBmcmFnbWVudC5cbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCX0KKwkJaWYgKHBtdHVkaXNjIDwgMCkKKwkJCXBtdHVkaXNjID0gSVBWNl9QTVRVRElTQ19ETzsKKwl9CisKKwlpZiAocG10dWRpc2MgPj0gMCkgeworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9JUFY2LCBJUFY2X01UVV9ESVNDT1ZFUiwgJnBtdHVkaXNjLCBzaXplb2YocG10dWRpc2MpKSA9PSAtMSkgeworCQkJcGVycm9yKCJwaW5nOiBJUFY2X01UVV9ESVNDT1ZFUiIpOworCQkJZXhpdCgyKTsKKwkJfQorCX0KKworCWlmICgob3B0aW9ucyZGX1NUUklDVFNPVVJDRSkgJiYKKwkgICAgYmluZChpY21wX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb3VyY2UsIHNpemVvZihzb3VyY2UpKSA9PSAtMSkgeworCQlwZXJyb3IoInBpbmc6IGJpbmQgaWNtcCBzb2NrZXQiKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlpZiAoZGF0YWxlbiA+PSBzaXplb2Yoc3RydWN0IHRpbWV2YWwpICYmIChuaV9xdWVyeSA8IDApKSB7CisJCS8qIGNhbiB3ZSB0aW1lIHRyYW5zZmVyICovCisJCXRpbWluZyA9IDE7CisJfQorCXBhY2tsZW4gPSBkYXRhbGVuICsgOCArIDQwOTYgKyA0MCArIDg7IC8qIDQwOTYgZm9yIHJ0aGRyICovCisJaWYgKCEocGFja2V0ID0gKHVfY2hhciAqKW1hbGxvYygodV9pbnQpcGFja2xlbikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGluZzogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlleGl0KDIpOworCX0KKworCXdvcmtpbmdfcmVjdmVyciA9IDE7CisJaG9sZCA9IDE7CisJaWYgKHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfSVBWNiwgSVBWNl9SRUNWRVJSLCAoY2hhciAqKSZob2xkLCBzaXplb2YoaG9sZCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogeW91ciBrZXJuZWwgaXMgdmVlZXJ5IG9sZC4gTm8gcHJvYmxlbXMuXG4iKTsKKwkJd29ya2luZ19yZWN2ZXJyID0gMDsKKwl9CisKKwkvKiBFc3RpbWF0ZSBtZW1vcnkgZWF0ZW4gYnkgc2luZ2xlIHBhY2tldC4gSXQgaXMgcm91Z2ggZXN0aW1hdGUuCisJICogQWN0dWFsbHksIGZvciBzbWFsbCBkYXRhbGVuJ3MgaXQgZGVwZW5kcyBvbiBrZXJuZWwgc2lkZSBhIGxvdC4gKi8KKwlob2xkID0gZGF0YWxlbis4OworCWhvbGQgKz0gKChob2xkKzUxMSkvNTEyKSooNDArMTYrNjQrMTYwKTsKKwlzb2NrX3NldGJ1ZnMoaWNtcF9zb2NrLCBob2xkKTsKKworCWlmICghdXNpbmdfcGluZ19zb2NrZXQpIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkJY3N1bV9vZmZzZXQgPSAyOworCQlzel9vcHQgPSBzaXplb2YoaW50KTsKKworCQllcnIgPSBzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwKKwkJCQkgJmNzdW1fb2Zmc2V0LCBzel9vcHQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJLyogY2hlY2tzdW0gc2hvdWxkIGJlIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgc2V0dGluZworCQkJICogdGhpcyBvcHRpb24gbWlnaHQgZmFpbCBhbnl3YXkuCisJCQkgKi8KKwkJCWZwcmludGYoc3RkZXJyLCAic2V0c29ja29wdChSQVdfQ0hFQ0tTVU0pIGZhaWxlZCIKKwkJCQkiIC0gdHJ5IHRvIGNvbnRpbnVlLiIpOworCQl9CisjZW5kaWYKKworCQkvKgorCQkgKglzZWxlY3QgaWNtcCBlY2hvIHJlcGx5IGFzIGljbXAgdHlwZSB0byByZWNlaXZlCisJCSAqLworCisJCUlDTVA2X0ZJTFRFUl9TRVRCTE9DS0FMTCgmZmlsdGVyKTsKKworCQlpZiAoIXdvcmtpbmdfcmVjdmVycikgeworCQkJSUNNUDZfRklMVEVSX1NFVFBBU1MoSUNNUDZfRFNUX1VOUkVBQ0gsICZmaWx0ZXIpOworCQkJSUNNUDZfRklMVEVSX1NFVFBBU1MoSUNNUDZfUEFDS0VUX1RPT19CSUcsICZmaWx0ZXIpOworCQkJSUNNUDZfRklMVEVSX1NFVFBBU1MoSUNNUDZfVElNRV9FWENFRURFRCwgJmZpbHRlcik7CisJCQlJQ01QNl9GSUxURVJfU0VUUEFTUyhJQ01QNl9QQVJBTV9QUk9CLCAmZmlsdGVyKTsKKwkJfQorCisJCWlmIChuaXF1ZXJ5X2lzX2VuYWJsZWQoKSkKKwkJCUlDTVA2X0ZJTFRFUl9TRVRQQVNTKElDTVBWNl9OSV9SRVBMWSwgJmZpbHRlcik7CisJCWVsc2UKKwkJCUlDTVA2X0ZJTFRFUl9TRVRQQVNTKElDTVA2X0VDSE9fUkVQTFksICZmaWx0ZXIpOworCisJCWVyciA9IHNldHNvY2tvcHQoaWNtcF9zb2NrLCBJUFBST1RPX0lDTVBWNiwgSUNNUDZfRklMVEVSLAorCQkJCSAmZmlsdGVyLCBzaXplb2Yoc3RydWN0IGljbXA2X2ZpbHRlcikpOworCisJCWlmIChlcnIgPCAwKSB7CisJCQlwZXJyb3IoInNldHNvY2tvcHQoSUNNUDZfRklMVEVSKSIpOworCQkJZXhpdCgyKTsKKwkJfQorCX0KKworCWlmIChvcHRpb25zICYgRl9OT0xPT1ApIHsKKwkJaW50IGxvb3AgPSAwOworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9NVUxUSUNBU1RfTE9PUCwKKwkJCQkmbG9vcCwgc2l6ZW9mKGxvb3ApKSA9PSAtMSkgeworCQkJcGVycm9yICgiY2FuJ3QgZGlzYWJsZSBtdWx0aWNhc3QgbG9vcGJhY2siKTsKKwkJCWV4aXQoMik7CisJCX0KKwl9CisJaWYgKG9wdGlvbnMgJiBGX1RUTCkgeworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9NVUxUSUNBU1RfSE9QUywKKwkJCSAgICAgICAmdHRsLCBzaXplb2YodHRsKSkgPT0gLTEpIHsKKwkJCXBlcnJvciAoImNhbid0IHNldCBtdWx0aWNhc3QgaG9wIGxpbWl0Iik7CisJCQlleGl0KDIpOworCQl9CisJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgSVBQUk9UT19JUFY2LCBJUFY2X1VOSUNBU1RfSE9QUywKKwkJCSAgICAgICAmdHRsLCBzaXplb2YodHRsKSkgPT0gLTEpIHsKKwkJCXBlcnJvciAoImNhbid0IHNldCB1bmljYXN0IGhvcCBsaW1pdCIpOworCQkJZXhpdCgyKTsKKwkJfQorCX0KKworCWlmICgxKSB7CisJCWludCBvbiA9IDE7CisJCWlmICgKKyNpZmRlZiBJUFY2X1JFQ1ZIT1BMSU1JVAorCQkgICAgc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9SRUNWSE9QTElNSVQsCisJCQkgICAgICAgJm9uLCBzaXplb2Yob24pKSA9PSAtMSAmJgorCQkgICAgc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl8yMjkySE9QTElNSVQsCisJCQkgICAgICAgJm9uLCBzaXplb2Yob24pKSA9PSAtMQorI2Vsc2UKKwkJICAgIHNldHNvY2tvcHQoaWNtcF9zb2NrLCBJUFBST1RPX0lQVjYsIElQVjZfSE9QTElNSVQsCisJCQkgICAgICAgJm9uLCBzaXplb2Yob24pKSA9PSAtMQorI2VuZGlmCisJCSAgICl7CisJCQlwZXJyb3IgKCJjYW4ndCByZWNlaXZlIGhvcCBsaW1pdCIpOworCQkJZXhpdCgyKTsKKwkJfQorCX0KKworCWlmIChvcHRpb25zICYgRl9UQ0xBU1MpIHsKKyNpZmRlZiBJUFY2X1RDTEFTUworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9UQ0xBU1MsCisJCQkgICAgICAgJnRjbGFzcywgc2l6ZW9mKHRjbGFzcykpID09IC0xKSB7CisJCQlwZXJyb3IgKCJzZXRzb2Nrb3B0KElQVjZfVENMQVNTKSIpOworCQkJZXhpdCgyKTsKKwkJfQorI2Vsc2UKKwkJZnByaW50ZihzdGRlcnIsICJUcmFmZmljIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyNlbmRpZgorCX0KKworCWlmIChvcHRpb25zJkZfRkxPV0lORk8pIHsKKyNpZmRlZiBJUFY2X0ZMT1dJTkZPX1NFTkQKKwkJaW50IG9uID0gMTsKKyNlbmRpZgorI2lmZGVmIElQVjZfRkxPV0xBQkVMX01HUgorCQljaGFyIGZyZXFfYnVmW0NNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpbjZfZmxvd2xhYmVsX3JlcSkpICsgY21zZ2xlbl07CisJCXN0cnVjdCBpbjZfZmxvd2xhYmVsX3JlcSAqZnJlcSA9IChzdHJ1Y3QgaW42X2Zsb3dsYWJlbF9yZXEgKilmcmVxX2J1ZjsKKwkJaW50IGZyZXFfbGVuID0gc2l6ZW9mKCpmcmVxKTsKKyNpZmRlZiBFTkFCTEVfUElORzZfUlRIRFIKKwkJaWYgKHNyY3J0KQorCQkJZnJlcV9sZW4gPSBDTVNHX0FMSUdOKHNpemVvZigqZnJlcSkpICsgc3JjcnQtPmNtc2dfbGVuOworI2VuZGlmCisJCW1lbXNldChmcmVxLCAwLCBzaXplb2YoKmZyZXEpKTsKKwkJZnJlcS0+ZmxyX2xhYmVsID0gaHRvbmwoZmxvd2xhYmVsICYgSVBWNl9GTE9XSU5GT19GTE9XTEFCRUwpOworCQlmcmVxLT5mbHJfYWN0aW9uID0gSVBWNl9GTF9BX0dFVDsKKwkJZnJlcS0+ZmxyX2ZsYWdzID0gSVBWNl9GTF9GX0NSRUFURTsKKwkJZnJlcS0+ZmxyX3NoYXJlID0gSVBWNl9GTF9TX0VYQ0w7CisJCW1lbWNweSgmZnJlcS0+ZmxyX2RzdCwgJndoZXJldG8uc2luNl9hZGRyLCAxNik7CisjaWZkZWYgRU5BQkxFX1BJTkc2X1JUSERSCisJCWlmIChzcmNydCkKKwkJCW1lbWNweShmcmVxX2J1ZiArIENNU0dfQUxJR04oc2l6ZW9mKCpmcmVxKSksIHNyY3J0LCBzcmNydC0+Y21zZ19sZW4pOworI2VuZGlmCisJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgSVBQUk9UT19JUFY2LCBJUFY2X0ZMT1dMQUJFTF9NR1IsCisJCQkgICAgICAgZnJlcSwgZnJlcV9sZW4pID09IC0xKSB7CisJCQlwZXJyb3IgKCJjYW4ndCBzZXQgZmxvd2xhYmVsIik7CisJCQlleGl0KDIpOworCQl9CisJCWZsb3dsYWJlbCA9IGZyZXEtPmZscl9sYWJlbDsKKyNpZmRlZiBFTkFCTEVfUElORzZfUlRIRFIKKwkJaWYgKHNyY3J0KSB7CisJCQljbXNnbGVuID0gKGNoYXIqKXNyY3J0IC0gKGNoYXIqKWNtc2didWY7CisJCQlzcmNydCA9IE5VTEw7CisJCX0KKyNlbmRpZgorI2Vsc2UKKwkJZnByaW50ZihzdGRlcnIsICJGbG93IGxhYmVscyBhcmUgbm90IHN1cHBvcnRlZC5cbiIpOworCQlleGl0KDIpOworI2VuZGlmCisKKyNpZmRlZiBJUFY2X0ZMT1dJTkZPX1NFTkQKKwkJd2hlcmV0by5zaW42X2Zsb3dpbmZvID0gZmxvd2xhYmVsOworCQlpZiAoc2V0c29ja29wdChpY21wX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9GTE9XSU5GT19TRU5ELAorCQkJICAgICAgICZvbiwgc2l6ZW9mKG9uKSkgPT0gLTEpIHsKKwkJCXBlcnJvciAoImNhbid0IHNlbmQgZmxvd2luZm8iKTsKKwkJCWV4aXQoMik7CisJCX0KKyNlbHNlCisJCWZwcmludGYoc3RkZXJyLCAiRmxvd2luZm8gaXMgbm90IHN1cHBvcnRlZC5cbiIpOworCQlleGl0KDIpOworI2VuZGlmCisJfQorCisJcHJpbnRmKCJQSU5HICVzKCVzKSAiLCBob3N0bmFtZSwgcHJfYWRkcigmd2hlcmV0by5zaW42X2FkZHIpKTsKKwlpZiAoZmxvd2xhYmVsKQorCQlwcmludGYoIiwgZmxvdyAweCUwNXgsICIsICh1bnNpZ25lZCludG9obChmbG93bGFiZWwpKTsKKwlpZiAoZGV2aWNlIHx8IChvcHRpb25zJkZfU1RSSUNUU09VUkNFKSkgeworCQlwcmludGYoImZyb20gJXMgJXM6ICIsCisJCSAgICAgICBwcl9hZGRyX24oJnNvdXJjZS5zaW42X2FkZHIpLCBkZXZpY2UgPyA6ICIiKTsKKwl9CisJcHJpbnRmKCIlZCBkYXRhIGJ5dGVzXG4iLCBkYXRhbGVuKTsKKworCXNldHVwKGljbXBfc29jayk7CisKKwlkcm9wX2NhcGFiaWxpdGllcygpOworCisJbWFpbl9sb29wKGljbXBfc29jaywgcGFja2V0LCBwYWNrbGVuKTsKK30KKworaW50IHJlY2VpdmVfZXJyb3JfbXNnKCkKK3sKKwlpbnQgcmVzOworCWNoYXIgY2J1Zls1MTJdOworCXN0cnVjdCBpb3ZlYyAgaW92OworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBzb2NrX2V4dGVuZGVkX2VyciAqZTsKKwlzdHJ1Y3QgaWNtcDZfaGRyIGljbXBoOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgdGFyZ2V0OworCWludCBuZXRfZXJyb3JzID0gMDsKKwlpbnQgbG9jYWxfZXJyb3JzID0gMDsKKwlpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworCWlvdi5pb3ZfYmFzZSA9ICZpY21waDsKKwlpb3YuaW92X2xlbiA9IHNpemVvZihpY21waCk7CisJbXNnLm1zZ19uYW1lID0gKHZvaWQqKSZ0YXJnZXQ7CisJbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHRhcmdldCk7CisJbXNnLm1zZ19pb3YgPSAmaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2ZsYWdzID0gMDsKKwltc2cubXNnX2NvbnRyb2wgPSBjYnVmOworCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjYnVmKTsKKworCXJlcyA9IHJlY3Ztc2coaWNtcF9zb2NrLCAmbXNnLCBNU0dfRVJSUVVFVUV8TVNHX0RPTlRXQUlUKTsKKwlpZiAocmVzIDwgMCkKKwkJZ290byBvdXQ7CisKKwllID0gTlVMTDsKKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOyBjbXNnOyBjbXNnID0gQ01TR19OWFRIRFIoJm1zZywgY21zZykpIHsKKwkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgPT0gU09MX0lQVjYpIHsKKwkJCWlmIChjbXNnLT5jbXNnX3R5cGUgPT0gSVBWNl9SRUNWRVJSKQorCQkJCWUgPSAoc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyICopQ01TR19EQVRBKGNtc2cpOworCQl9CisJfQorCWlmIChlID09IE5VTEwpCisJCWFib3J0KCk7CisKKwlpZiAoZS0+ZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9MT0NBTCkgeworCQlsb2NhbF9lcnJvcnMrKzsKKwkJaWYgKG9wdGlvbnMgJiBGX1FVSUVUKQorCQkJZ290byBvdXQ7CisJCWlmIChvcHRpb25zICYgRl9GTE9PRCkKKwkJCXdyaXRlX3N0ZG91dCgiRSIsIDEpOworCQllbHNlIGlmIChlLT5lZV9lcnJubyAhPSBFTVNHU0laRSkKKwkJCWZwcmludGYoc3RkZXJyLCAicGluZzogbG9jYWwgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlLT5lZV9lcnJubykpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IGxvY2FsIGVycm9yOiBNZXNzYWdlIHRvbyBsb25nLCBtdHU9JXVcbiIsIGUtPmVlX2luZm8pOworCQluZXJyb3JzKys7CisJfSBlbHNlIGlmIChlLT5lZV9vcmlnaW4gPT0gU09fRUVfT1JJR0lOX0lDTVA2KSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiopKGUrMSk7CisKKwkJaWYgKHJlcyA8IHNpemVvZihpY21waCkgfHwKKwkJICAgIG1lbWNtcCgmdGFyZ2V0LnNpbjZfYWRkciwgJndoZXJldG8uc2luNl9hZGRyLCAxNikgfHwKKwkJICAgIGljbXBoLmljbXA2X3R5cGUgIT0gSUNNUDZfRUNIT19SRVFVRVNUIHx8CisJCSAgICAhaXNfb3VycyhpY21waC5pY21wNl9pZCkpIHsKKwkJCS8qIE5vdCBvdXIgZXJyb3IsIG5vdCBhbiBlcnJvciBhdCBhbGwuIENsZWFyLiAqLworCQkJc2F2ZWRfZXJybm8gPSAwOworCQkJZ290byBvdXQ7CisJCX0KKworCQluZXRfZXJyb3JzKys7CisJCW5lcnJvcnMrKzsKKwkJaWYgKG9wdGlvbnMgJiBGX1FVSUVUKQorCQkJZ290byBvdXQ7CisJCWlmIChvcHRpb25zICYgRl9GTE9PRCkgeworCQkJd3JpdGVfc3Rkb3V0KCJcYkUiLCAyKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50X3RpbWVzdGFtcCgpOworCQkJcHJpbnRmKCJGcm9tICVzIGljbXBfc2VxPSV1ICIsIHByX2FkZHIoJnNpbjYtPnNpbjZfYWRkciksIG50b2hzKGljbXBoLmljbXA2X3NlcSkpOworCQkJcHJfaWNtcGgoZS0+ZWVfdHlwZSwgZS0+ZWVfY29kZSwgZS0+ZWVfaW5mbyk7CisJCQlwdXRjaGFyKCdcbicpOworCQkJZmZsdXNoKHN0ZG91dCk7CisJCX0KKwl9CisKK291dDoKKwllcnJubyA9IHNhdmVkX2Vycm5vOworCXJldHVybiBuZXRfZXJyb3JzID8gOiAtbG9jYWxfZXJyb3JzOworfQorCisvKgorICogcGluZ2VyIC0tCisgKiAJQ29tcG9zZSBhbmQgdHJhbnNtaXQgYW4gSUNNUCBFQ0hPIFJFUVVFU1QgcGFja2V0LiAgVGhlIElQIHBhY2tldAorICogd2lsbCBiZSBhZGRlZCBvbiBieSB0aGUga2VybmVsLiAgVGhlIElEIGZpZWxkIGlzIG91ciBVTklYIHByb2Nlc3MgSUQsCisgKiBhbmQgdGhlIHNlcXVlbmNlIG51bWJlciBpcyBhbiBhc2NlbmRpbmcgaW50ZWdlci4gIFRoZSBmaXJzdCA4IGJ5dGVzCisgKiBvZiB0aGUgZGF0YSBwb3J0aW9uIGFyZSB1c2VkIHRvIGhvbGQgYSBVTklYICJ0aW1ldmFsIiBzdHJ1Y3QgaW4gVkFYCisgKiBieXRlLW9yZGVyLCB0byBjb21wdXRlIHRoZSByb3VuZC10cmlwIHRpbWUuCisgKi8KK2ludCBidWlsZF9lY2hvKF9fdTggKl9pY21waCkKK3sKKwlzdHJ1Y3QgaWNtcDZfaGRyICppY21waDsKKwlpbnQgY2M7CisKKwlpY21waCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopX2ljbXBoOworCWljbXBoLT5pY21wNl90eXBlID0gSUNNUDZfRUNIT19SRVFVRVNUOworCWljbXBoLT5pY21wNl9jb2RlID0gMDsKKwlpY21waC0+aWNtcDZfY2tzdW0gPSAwOworCWljbXBoLT5pY21wNl9zZXEgPSBodG9ucyhudHJhbnNtaXR0ZWQrMSk7CisJaWNtcGgtPmljbXA2X2lkID0gaWRlbnQ7CisKKwlpZiAodGltaW5nKQorCQlnZXR0aW1lb2ZkYXkoKHN0cnVjdCB0aW1ldmFsICopJm91dHBhY2tbOF0sCisJCSAgICAoc3RydWN0IHRpbWV6b25lICopTlVMTCk7CisKKwljYyA9IGRhdGFsZW4gKyA4OwkJCS8qIHNraXBzIElDTVAgcG9ydGlvbiAqLworCisJcmV0dXJuIGNjOworfQorCisKK2ludCBidWlsZF9uaXF1ZXJ5KF9fdTggKl9uaWgpCit7CisJc3RydWN0IG5pX2hkciAqbmloOworCWludCBjYzsKKworCW5paCA9IChzdHJ1Y3QgbmlfaGRyICopX25paDsKKwluaWgtPm5pX2Nrc3VtID0gMDsKKworCW5paC0+bmlfdHlwZSA9IElDTVBWNl9OSV9RVUVSWTsKKwljYyA9IHNpemVvZigqbmloKTsKKwlkYXRhbGVuID0gMDsKKworCW5pcXVlcnlfZmlsbF9ub25jZShudHJhbnNtaXR0ZWQgKyAxLCBuaWgtPm5pX25vbmNlKTsKKwluaWgtPm5pX2NvZGUgPSBuaV9zdWJqZWN0X3R5cGU7CisJbmloLT5uaV9xdHlwZSA9IGh0b25zKG5pX3F1ZXJ5KTsKKwluaWgtPm5pX2ZsYWdzID0gbmlfZmxhZzsKKwltZW1jcHkobmloICsgMSwgbmlfc3ViamVjdCwgbmlfc3ViamVjdF9sZW4pOworCWNjICs9IG5pX3N1YmplY3RfbGVuOworCisJcmV0dXJuIGNjOworfQorCitpbnQgc2VuZF9wcm9iZSh2b2lkKQoreworCWludCBsZW4sIGNjOworCisJcmN2ZF9jbGVhcihudHJhbnNtaXR0ZWQgKyAxKTsKKworCWlmIChuaXF1ZXJ5X2lzX2VuYWJsZWQoKSkKKwkJbGVuID0gYnVpbGRfbmlxdWVyeShvdXRwYWNrKTsKKwllbHNlCisJCWxlbiA9IGJ1aWxkX2VjaG8ob3V0cGFjayk7CisKKwlpZiAoY21zZ2xlbiA9PSAwKSB7CisJCWNjID0gc2VuZHRvKGljbXBfc29jaywgKGNoYXIgKilvdXRwYWNrLCBsZW4sIGNvbmZpcm0sCisJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmd2hlcmV0bywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCX0gZWxzZSB7CisJCXN0cnVjdCBtc2doZHIgbWhkcjsKKwkJc3RydWN0IGlvdmVjIGlvdjsKKworCQlpb3YuaW92X2xlbiAgPSBsZW47CisJCWlvdi5pb3ZfYmFzZSA9IG91dHBhY2s7CisKKwkJbWVtc2V0KCZtaGRyLCAwLCBzaXplb2YobWhkcikpOworCQltaGRyLm1zZ19uYW1lID0gJndoZXJldG87CisJCW1oZHIubXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCW1oZHIubXNnX2lvdiA9ICZpb3Y7CisJCW1oZHIubXNnX2lvdmxlbiA9IDE7CisJCW1oZHIubXNnX2NvbnRyb2wgPSBjbXNnYnVmOworCQltaGRyLm1zZ19jb250cm9sbGVuID0gY21zZ2xlbjsKKworCQljYyA9IHNlbmRtc2coaWNtcF9zb2NrLCAmbWhkciwgY29uZmlybSk7CisJfQorCWNvbmZpcm0gPSAwOworCisJcmV0dXJuIChjYyA9PSBsZW4gPyAwIDogY2MpOworfQorCit2b2lkIHByX2VjaG9fcmVwbHkoX191OCAqX2ljbXBoLCBpbnQgY2MpCit7CisJc3RydWN0IGljbXA2X2hkciAqaWNtcGggPSAoc3RydWN0IGljbXA2X2hkciAqKSBfaWNtcGg7CisJcHJpbnRmKCIgaWNtcF9zZXE9JXUiLCBudG9ocyhpY21waC0+aWNtcDZfc2VxKSk7Cit9OworCitzdGF0aWMgdm9pZCBwdXRjaGFyX3NhZmUoY2hhciBjKQoreworCWlmIChpc3ByaW50KGMpKQorCQlwdXRjaGFyKGMpOworCWVsc2UKKwkJcHJpbnRmKCJcXCUwM28iLCBjKTsKK30KKwordm9pZCBwcl9uaXF1ZXJ5X3JlcGx5X25hbWUoc3RydWN0IG5pX2hkciAqbmloLCBpbnQgbGVuKQoreworCV9fdTggKmggPSAoX191OCAqKShuaWggKyAxKTsKKwlfX3U4ICpwID0gaCArIDQ7CisJX191OCAqZW5kID0gKF9fdTggKiluaWggKyBsZW47CisJaW50IGNvbnRpbnVlZCA9IDA7CisJY2hhciBidWZbMTAyNF07CisJaW50IHJldDsKKworCWxlbiAtPSBzaXplb2Yoc3RydWN0IG5pX2hkcikgKyA0OworCisJaWYgKGxlbiA8IDApIHsKKwkJcHJpbnRmKCIgcGFyc2UgZXJyb3IgKHRvbyBzaG9ydCkiKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAocCA8IGVuZCkgeworCQlpbnQgZnFkbiA9IDE7CisJCWludCBpOworCisJCW1lbXNldChidWYsIDB4ZmYsIHNpemVvZihidWYpKTsKKworCQlpZiAoY29udGludWVkKQorCQkJcHV0Y2hhcignLCcpOworCisJCXJldCA9IGRuX2V4cGFuZChoLCBlbmQsIHAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRmKCIgcGFyc2UgZXJyb3IgKHRydW5jYXRlZCkiKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwICsgcmV0IDwgZW5kICYmICoocCArIHJldCkgPT0gJ1wwJykKKwkJCWZxZG4gPSAwOworCisJCXB1dGNoYXIoJyAnKTsKKwkJZm9yIChpID0gMDsgaSA8IHN0cmxlbihidWYpOyBpKyspCisJCQlwdXRjaGFyX3NhZmUoYnVmW2ldKTsKKwkJaWYgKGZxZG4pCisJCQlwdXRjaGFyKCcuJyk7CisKKwkJcCArPSByZXQgKyAhZnFkbjsKKworCQljb250aW51ZWQgPSAxOworCX0KK30KKwordm9pZCBwcl9uaXF1ZXJ5X3JlcGx5X2FkZHIoc3RydWN0IG5pX2hkciAqbmloLCBpbnQgbGVuKQoreworCV9fdTggKmggPSAoX191OCAqKShuaWggKyAxKTsKKwlfX3U4ICpwID0gaCArIDQ7CisJX191OCAqZW5kID0gKF9fdTggKiluaWggKyBsZW47CisJaW50IGFmOworCWludCBhZmxlbjsKKwlpbnQgY29udGludWVkID0gMDsKKwlpbnQgdHJ1bmNhdGVkOworCWNoYXIgYnVmWzEwMjRdOworCisJc3dpdGNoIChudG9ocyhuaWgtPm5pX3F0eXBlKSkgeworCWNhc2UgTklfUVRZUEVfSVBWNEFERFI6CisJCWFmID0gQUZfSU5FVDsKKwkJYWZsZW4gPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworCQl0cnVuY2F0ZWQgPSBuaWgtPm5pX2ZsYWdzICYgTklfSVBWNkFERFJfRl9UUlVOQ0FURTsKKwkJYnJlYWs7CisJY2FzZSBOSV9RVFlQRV9JUFY2QUREUjoKKwkJYWYgPSBBRl9JTkVUNjsKKwkJYWZsZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkJdHJ1bmNhdGVkID0gbmloLT5uaV9mbGFncyAmIE5JX0lQVjRBRERSX0ZfVFJVTkNBVEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNob3VsZCBub3QgaGFwcGVuICovCisJCWFmID0gYWZsZW4gPSB0cnVuY2F0ZWQgPSAwOworCX0KKwlwID0gaDsKKwlpZiAobGVuIDwgMCkgeworCQlwcmludGYoIiBwYXJzZSBlcnJvciAodG9vIHNob3J0KSIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJaWYgKGNvbnRpbnVlZCkKKwkJCXB1dGNoYXIoJywnKTsKKworCQlpZiAocCArIHNpemVvZihfX3UzMikgKyBhZmxlbiA+IGVuZCkgeworCQkJcHJpbnRmKCIgcGFyc2UgZXJyb3IgKHRydW5jYXRlZCkiKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghaW5ldF9udG9wKGFmLCBwICsgc2l6ZW9mKF9fdTMyKSwgYnVmLCBzaXplb2YoYnVmKSkpCisJCQlwcmludGYoIiB1bmV4cGVjZWQgZXJyb3IgaW4gaW5ldF9udG9wKCVzKSIsCisJCQkgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgJXMiLCBidWYpOworCQlwICs9IHNpemVvZihfX3UzMikgKyBhZmxlbjsKKworCQljb250aW51ZWQgPSAxOworCX0KKwlpZiAodHJ1bmNhdGVkKQorCQlwcmludGYoIiAodHJ1bmNhdGVkKSIpOworfQorCit2b2lkIHByX25pcXVlcnlfcmVwbHkoX191OCAqX25paCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmlfaGRyICpuaWggPSAoc3RydWN0IG5pX2hkciAqKV9uaWg7CisKKwlzd2l0Y2ggKG5paC0+bmlfY29kZSkgeworCWNhc2UgTklfU1VDQ0VTUzoKKwkJc3dpdGNoIChudG9ocyhuaWgtPm5pX3F0eXBlKSkgeworCQljYXNlIE5JX1FUWVBFX05BTUU6CisJCQlwcl9uaXF1ZXJ5X3JlcGx5X25hbWUobmloLCBsZW4pOworCQkJYnJlYWs7CisJCWNhc2UgTklfUVRZUEVfSVBWNEFERFI6CisJCWNhc2UgTklfUVRZUEVfSVBWNkFERFI6CisJCQlwcl9uaXF1ZXJ5X3JlcGx5X2FkZHIobmloLCBsZW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIiB1bmtub3duIHF0eXBlKDB4JTAyeCkiLCBudG9ocyhuaWgtPm5pX3F0eXBlKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOSV9SRUZVU0VEOgorCQlwcmludGYoIiByZWZ1c2VkIik7CisJCWJyZWFrOworCWNhc2UgTklfVU5LTk9XTjoKKwkJcHJpbnRmKCIgdW5rbm93biIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiB1bmtub3duIGNvZGUoJTAyeCkiLCBudG9ocyhuaWgtPm5pX2NvZGUpKTsKKwl9CisJcHJpbnRmKCI7IHNlcT0ldTsiLCBudG9oc3AoKF9fdTE2KiluaWgtPm5pX25vbmNlKSk7Cit9CisKKy8qCisgKiBwYXJzZV9yZXBseSAtLQorICoJUHJpbnQgb3V0IHRoZSBwYWNrZXQsIGlmIGl0IGNhbWUgZnJvbSB1cy4gIFRoaXMgbG9naWMgaXMgbmVjZXNzYXJ5CisgKiBiZWNhdXNlIEFMTCByZWFkZXJzIG9mIHRoZSBJQ01QIHNvY2tldCBnZXQgYSBjb3B5IG9mIEFMTCBJQ01QIHBhY2tldHMKKyAqIHdoaWNoIGFycml2ZSAoJ3RpcyBvbmx5IGZhaXIpLiAgVGhpcyBwZXJtaXRzIG11bHRpcGxlIGNvcGllcyBvZiB0aGlzCisgKiBwcm9ncmFtIHRvIGJlIHJ1biB3aXRob3V0IGhhdmluZyBpbnRlcm1pbmdsZWQgb3V0cHV0IChvciBzdGF0aXN0aWNzISkuCisgKi8KK2ludAorcGFyc2VfcmVwbHkoc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgY2MsIHZvaWQgKmFkZHIsIHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tID0gYWRkcjsKKwlfX3U4ICpidWYgPSBtc2ctPm1zZ19pb3YtPmlvdl9iYXNlOworCXN0cnVjdCBjbXNnaGRyICpjOworCXN0cnVjdCBpY21wNl9oZHIgKmljbXBoOworCWludCBob3BzID0gLTE7CisKKwlmb3IgKGMgPSBDTVNHX0ZJUlNUSERSKG1zZyk7IGM7IGMgPSBDTVNHX05YVEhEUihtc2csIGMpKSB7CisJCWlmIChjLT5jbXNnX2xldmVsICE9IFNPTF9JUFY2KQorCQkJY29udGludWU7CisJCXN3aXRjaChjLT5jbXNnX3R5cGUpIHsKKwkJY2FzZSBJUFY2X0hPUExJTUlUOgorI2lmZGVmIElQVjZfMjI5MkhPUExJTUlUCisJCWNhc2UgSVBWNl8yMjkySE9QTElNSVQ6CisjZW5kaWYKKwkJCWlmIChjLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihpbnQpKSkKKwkJCQljb250aW51ZTsKKwkJCW1lbWNweSgmaG9wcywgQ01TR19EQVRBKGMpLCBzaXplb2YoaG9wcykpOworCQl9CisJfQorCisKKwkvKiBOb3cgdGhlIElDTVAgcGFydCAqLworCisJaWNtcGggPSAoc3RydWN0IGljbXA2X2hkciAqKSBidWY7CisJaWYgKGNjIDwgOCkgeworCQlpZiAob3B0aW9ucyAmIEZfVkVSQk9TRSkKKwkJCWZwcmludGYoc3RkZXJyLCAicGluZzogcGFja2V0IHRvbyBzaG9ydCAoJWQgYnl0ZXMpXG4iLCBjYyk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpY21waC0+aWNtcDZfdHlwZSA9PSBJQ01QNl9FQ0hPX1JFUExZKSB7CisJCWlmICghaXNfb3VycyhpY21waC0+aWNtcDZfaWQpKQorCQkJcmV0dXJuIDE7CisJCWlmIChnYXRoZXJfc3RhdGlzdGljcygoX191OCopaWNtcGgsIHNpemVvZigqaWNtcGgpLCBjYywKKwkJCQkgICAgICBudG9ocyhpY21waC0+aWNtcDZfc2VxKSwKKwkJCQkgICAgICBob3BzLCAwLCB0diwgcHJfYWRkcigmZnJvbS0+c2luNl9hZGRyKSwKKwkJCQkgICAgICBwcl9lY2hvX3JlcGx5KSkKKwkJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaWNtcGgtPmljbXA2X3R5cGUgPT0gSUNNUFY2X05JX1JFUExZKSB7CisJCXN0cnVjdCBuaV9oZHIgKm5paCA9IChzdHJ1Y3QgbmlfaGRyICopaWNtcGg7CisJCWludCBzZXEgPSBuaXF1ZXJ5X2NoZWNrX25vbmNlKG5paC0+bmlfbm9uY2UpOworCQlpZiAoc2VxIDwgMCkKKwkJCXJldHVybiAxOworCQlpZiAoZ2F0aGVyX3N0YXRpc3RpY3MoKF9fdTgqKWljbXBoLCBzaXplb2YoKmljbXBoKSwgY2MsCisJCQkJICAgICAgc2VxLAorCQkJCSAgICAgIGhvcHMsIDAsIHR2LCBwcl9hZGRyKCZmcm9tLT5zaW42X2FkZHIpLAorCQkJCSAgICAgIHByX25pcXVlcnlfcmVwbHkpKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaW50IG5leHRoZHI7CisJCXN0cnVjdCBpcDZfaGRyICppcGgxID0gKHN0cnVjdCBpcDZfaGRyKikoaWNtcGgrMSk7CisJCXN0cnVjdCBpY21wNl9oZHIgKmljbXBoMSA9IChzdHJ1Y3QgaWNtcDZfaGRyICopKGlwaDErMSk7CisKKwkJLyogV2UgbXVzdCBub3QgZXZlciBmYWxsIGhlcmUuIEFsbCB0aGUgbWVzc2FnZXMgYnV0CisJCSAqIGVjaG8gcmVwbHkgYXJlIGJsb2NrZWQgYnkgZmlsdGVyIGFuZCBlcnJvciBhcmUKKwkJICogcmVjZWl2ZWQgd2l0aCBJUFY2X1JFQ1ZFUlIuIFVnbHkgY29kZSBpcyBwcmVzZXJ2ZWQKKwkJICogaG93ZXZlciwganVzdCB0byByZW1lbWJlciB3aGF0IGNyYXAgd2UgYXZvaWRlZAorCQkgKiB1c2luZyBSRUNWUkVSUi4gOi0pCisJCSAqLworCisJCWlmIChjYyA8IDgrc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKSs4KQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKG1lbWNtcCgmaXBoMS0+aXA2X2RzdCwgJndoZXJldG8uc2luNl9hZGRyLCAxNikpCisJCQlyZXR1cm4gMTsKKworCQluZXh0aGRyID0gaXBoMS0+aXA2X254dDsKKworCQlpZiAobmV4dGhkciA9PSA0NCkgeworCQkJbmV4dGhkciA9ICooX191OCopaWNtcGgxOworCQkJaWNtcGgxKys7CisJCX0KKwkJaWYgKG5leHRoZHIgPT0gSVBQUk9UT19JQ01QVjYpIHsKKwkJCWlmIChpY21waDEtPmljbXA2X3R5cGUgIT0gSUNNUDZfRUNIT19SRVFVRVNUIHx8CisJCQkgICAgIWlzX291cnMoaWNtcGgxLT5pY21wNl9pZCkpCisJCQkJcmV0dXJuIDE7CisJCQlhY2tub3dsZWRnZShudG9ocyhpY21waDEtPmljbXA2X3NlcSkpOworCQkJaWYgKHdvcmtpbmdfcmVjdmVycikKKwkJCQlyZXR1cm4gMDsKKwkJCW5lcnJvcnMrKzsKKwkJCWlmIChvcHRpb25zICYgRl9GTE9PRCkgeworCQkJCXdyaXRlX3N0ZG91dCgiXGJFIiwgMik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwcmludF90aW1lc3RhbXAoKTsKKwkJCXByaW50ZigiRnJvbSAlczogaWNtcF9zZXE9JXUgIiwgcHJfYWRkcigmZnJvbS0+c2luNl9hZGRyKSwgbnRvaHMoaWNtcGgxLT5pY21wNl9zZXEpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlJ3ZlIGdvdCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBFQ0hPUkVQTFkgKi8KKwkJCWlmICghKG9wdGlvbnMgJiBGX1ZFUkJPU0UpIHx8IHVpZCkKKwkJCQlyZXR1cm4gMTsKKwkJCXByaW50X3RpbWVzdGFtcCgpOworCQkJcHJpbnRmKCJGcm9tICVzOiAiLCBwcl9hZGRyKCZmcm9tLT5zaW42X2FkZHIpKTsKKwkJfQorCQlwcl9pY21waChpY21waC0+aWNtcDZfdHlwZSwgaWNtcGgtPmljbXA2X2NvZGUsIG50b2hsKGljbXBoLT5pY21wNl9tdHUpKTsKKwl9CisKKwlpZiAoIShvcHRpb25zICYgRl9GTE9PRCkpIHsKKwkJaWYgKG9wdGlvbnMgJiBGX0FVRElCTEUpCisJCQlwdXRjaGFyKCdcYScpOworCQlwdXRjaGFyKCdcbicpOworCQlmZmx1c2goc3Rkb3V0KTsKKwl9IGVsc2UgeworCQlwdXRjaGFyKCdcYScpOworCQlmZmx1c2goc3Rkb3V0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworaW50IHByX2ljbXBoKF9fdTggdHlwZSwgX191OCBjb2RlLCBfX3UzMiBpbmZvKQoreworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSDoKKwkJcHJpbnRmKCJEZXN0aW5hdGlvbiB1bnJlYWNoYWJsZTogIik7CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEU6CisJCQlwcmludGYoIk5vIHJvdXRlIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTjoKKwkJCXByaW50ZigiQWRtaW5pc3RyYXRpdmVseSBwcm9oaWJpdGVkIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9CRVlPTkRTQ09QRToKKwkJCXByaW50ZigiQmV5b25kIHNjb3BlIG9mIHNvdXJjZSBhZGRyZXNzIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRERSOgorCQkJcHJpbnRmKCJBZGRyZXNzIHVucmVhY2hhYmxlIik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9OT1BPUlQ6CisJCQlwcmludGYoIlBvcnQgdW5yZWFjaGFibGUiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJVbmtub3duIGNvZGUgJWQiLCBjb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgSUNNUDZfUEFDS0VUX1RPT19CSUc6CisJCXByaW50ZigiUGFja2V0IHRvbyBiaWc6IG10dT0ldSIsIGluZm8pOworCQlpZiAoY29kZSkKKwkJCXByaW50ZigiLCBjb2RlPSVkIiwgY29kZSk7CisJCWJyZWFrOworCWNhc2UgSUNNUDZfVElNRV9FWENFRURFRDoKKwkJcHJpbnRmKCJUaW1lIGV4Y2VlZGVkOiAiKTsKKwkJaWYgKGNvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCkKKwkJCXByaW50ZigiSG9wIGxpbWl0Iik7CisJCWVsc2UgaWYgKGNvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfUkVBU1NFTUJMWSkKKwkJCXByaW50ZigiRGVmcmFnbWVudGF0aW9uIGZhaWx1cmUiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJjb2RlICVkIiwgY29kZSk7CisJCWJyZWFrOworCWNhc2UgSUNNUDZfUEFSQU1fUFJPQjoKKwkJcHJpbnRmKCJQYXJhbWV0ZXIgcHJvYmxlbTogIik7CisJCWlmIChjb2RlID09IElDTVA2X1BBUkFNUFJPQl9IRUFERVIpCisJCQlwcmludGYoIldyb25nIGhlYWRlciBmaWVsZCAiKTsKKwkJZWxzZSBpZiAoY29kZSA9PSBJQ01QNl9QQVJBTVBST0JfTkVYVEhFQURFUikKKwkJCXByaW50ZigiVW5rbm93biBoZWFkZXIgIik7CisJCWVsc2UgaWYgKGNvZGUgPT0gSUNNUDZfUEFSQU1QUk9CX09QVElPTikKKwkJCXByaW50ZigiVW5rbm93biBvcHRpb24gIik7CisJCWVsc2UKKwkJCXByaW50ZigiY29kZSAlZCAiLCBjb2RlKTsKKwkJcHJpbnRmICgiYXQgJXUiLCBpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBJQ01QNl9FQ0hPX1JFUVVFU1Q6CisJCXByaW50ZigiRWNobyByZXF1ZXN0Iik7CisJCWJyZWFrOworCWNhc2UgSUNNUDZfRUNIT19SRVBMWToKKwkJcHJpbnRmKCJFY2hvIHJlcGx5Iik7CisJCWJyZWFrOworCWNhc2UgTUxEX0xJU1RFTkVSX1FVRVJZOgorCQlwcmludGYoIk1MRCBRdWVyeSIpOworCQlicmVhazsKKwljYXNlIE1MRF9MSVNURU5FUl9SRVBPUlQ6CisJCXByaW50ZigiTUxEIFJlcG9ydCIpOworCQlicmVhazsKKwljYXNlIE1MRF9MSVNURU5FUl9SRURVQ1RJT046CisJCXByaW50ZigiTUxEIFJlZHVjdGlvbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoInVua25vd24gaWNtcCB0eXBlOiAldSIsIHR5cGUpOworCisJfQorCXJldHVybiAwOworfQorCisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisKK3ZvaWQgaW5zdGFsbF9maWx0ZXIodm9pZCkKK3sKKwlzdGF0aWMgaW50IG9uY2U7CisJc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlciBpbnNuc1tdID0geworCQlCUEZfU1RNVChCUEZfTER8QlBGX0h8QlBGX0FCUywgNCksICAvKiBMb2FkIGljbXAgZWNobyBpZGVudCAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KRVF8QlBGX0ssIDB4QUFBQSwgMCwgMSksICAvKiBPdXJzPyAqLworCQlCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCB+MFUpLCAgLyogWWVzLCBpdCBwYXNzZXMuICovCisJCUJQRl9TVE1UKEJQRl9MRHxCUEZfQnxCUEZfQUJTLCAwKSwgIC8qIExvYWQgaWNtcCB0eXBlICovCisJCUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgSUNNUDZfRUNIT19SRVBMWSwgMSwgMCksIC8qIEVjaG8/ICovCisJCUJQRl9TVE1UKEJQRl9SRVR8QlBGX0ssIH4wVSksIC8qIE5vLiBJdCBwYXNzZXMuIFRoaXMgbXVzdCBub3QgaGFwcGVuLiAqLworCQlCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCAwKSwgLyogRWNobyB3aXRoIHdyb25nIGlkZW50LiBSZWplY3QuICovCisJfTsKKwlzdGF0aWMgc3RydWN0IHNvY2tfZnByb2cgZmlsdGVyID0geworCQlzaXplb2YgaW5zbnMgLyBzaXplb2YoaW5zbnNbMF0pLAorCQlpbnNucworCX07CisKKwlpZiAob25jZSkKKwkJcmV0dXJuOworCW9uY2UgPSAxOworCisJLyogUGF0Y2ggYnBmbGV0IGZvciBjdXJyZW50IGlkZW50aWZpZXIuICovCisJaW5zbnNbMV0gPSAoc3RydWN0IHNvY2tfZmlsdGVyKUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgaHRvbnMoaWRlbnQpLCAwLCAxKTsKKworCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpKQorCQlwZXJyb3IoIldBUk5JTkc6IGZhaWxlZCB0byBpbnN0YWxsIHNvY2tldCBmaWx0ZXJcbiIpOworfQorCisKKy8qCisgKiBwcl9hZGRyIC0tCisgKglSZXR1cm4gYW4gYXNjaWkgaG9zdCBhZGRyZXNzIGFzIGEgZG90dGVkIHF1YWQgYW5kIG9wdGlvbmFsbHkgd2l0aAorICogYSBob3N0bmFtZS4KKyAqLworY2hhciAqIHByX2FkZHIoc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CisJc3RhdGljIGNoYXIgKnM7CisKKyNpZmRlZiBVU0VfSUROCisJZnJlZShzKTsKKyNlbmRpZgorCisJaW5fcHJfYWRkciA9ICFzZXRqbXAocHJfYWRkcl9qbXApOworCisJaWYgKCEoZXhpdGluZyB8fCBvcHRpb25zJkZfTlVNRVJJQykpCisJCWhwID0gZ2V0aG9zdGJ5YWRkcigoX191OCopYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIEFGX0lORVQ2KTsKKworCWluX3ByX2FkZHIgPSAwOworCisJaWYgKCFocAorI2lmZGVmIFVTRV9JRE4KKwkgICAgfHwgaWRuYV90b191bmljb2RlX2x6bHooaHAtPmhfbmFtZSwgJnMsIDApICE9IElETkFfU1VDQ0VTUworI2VuZGlmCisJICAgICkKKwkJcyA9IE5VTEw7CisKKwlyZXR1cm4gaHAgPyAocyA/IHMgOiBocC0+aF9uYW1lKSA6IHByX2FkZHJfbihhZGRyKTsKK30KKworY2hhciAqIHByX2FkZHJfbihzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCit7CisJc3RhdGljIGNoYXIgc3RyWzY0XTsKKwlpbmV0X250b3AoQUZfSU5FVDYsIGFkZHIsIHN0ciwgc2l6ZW9mKHN0cikpOworCXJldHVybiBzdHI7Cit9CisKKyNkZWZpbmUgVVNBR0VfTkVXTElORQkiXG4gICAgICAgICAgICAiCisKK3ZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiBwaW5nNiIKKwkJIiBbLSIKKwkJCSJhQWJCZERmaExuT3FyUlV2ViIKKwkJIl0iCisJCSIgWy1jIGNvdW50XSIKKwkJIiBbLWkgaW50ZXJ2YWxdIgorCQkiIFstSSBpbnRlcmZhY2VdIgorCQlVU0FHRV9ORVdMSU5FCisJCSIgWy1sIHByZWxvYWRdIgorCQkiIFstbSBtYXJrXSIKKwkJIiBbLU0gcG10dWRpc2Nfb3B0aW9uXSIKKwkJVVNBR0VfTkVXTElORQorCQkiIFstTiBub2RlaW5mb19vcHRpb25dIgorCQkiIFstcCBwYXR0ZXJuXSIKKwkJIiBbLVEgdGNsYXNzXSIKKwkJIiBbLXMgcGFja2V0c2l6ZV0iCisJCVVTQUdFX05FV0xJTkUKKwkJIiBbLVMgc25kYnVmXSIKKwkJIiBbLXQgdHRsXSIKKwkJIiBbLVQgdGltZXN0YW1wX29wdGlvbl0iCisJCSIgWy13IGRlYWRsaW5lXSIKKwkJVVNBR0VfTkVXTElORQorCQkiIFstVyB0aW1lb3V0XSIKKyNpZmRlZiBFTkFCTEVfUElORzZfUlRIRFIKKwkJIiBbaG9wMSAuLi5dIgorI2VuZGlmCisJCSIgZGVzdGluYXRpb24iCisJCSJcbiIKKwkpOworCWV4aXQoMik7Cit9CmRpZmYgLS1naXQgYS9pcHV0aWxzL3Bpbmc2X25pcXVlcnkuaCBiL2lwdXRpbHMvcGluZzZfbmlxdWVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjYyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL3Bpbmc2X25pcXVlcnkuaApAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIE5JX05PTkNFX1NJWkUJCQk4CisKKy8qIE5vZGUgSW5mb3JtYXRpb24gUXVlcnkgKi8KK3N0cnVjdCBuaV9oZHIgeworCXN0cnVjdCBpY21wNl9oZHIJCW5pX3U7CisJX191OAkJCQluaV9ub25jZVtOSV9OT05DRV9TSVpFXTsKK307CisKKyNkZWZpbmUgbmlfdHlwZQkJbmlfdS5pY21wNl90eXBlCisjZGVmaW5lIG5pX2NvZGUJCW5pX3UuaWNtcDZfY29kZQorI2RlZmluZSBuaV9ja3N1bQluaV91LmljbXA2X2Nrc3VtCisjZGVmaW5lIG5pX3F0eXBlCW5pX3UuaWNtcDZfZGF0YTE2WzBdCisjZGVmaW5lIG5pX2ZsYWdzCW5pX3UuaWNtcDZfZGF0YTE2WzFdCisKKy8qIFR5cGVzICovCisjaWZuZGVmIElDTVBWNl9OSV9RVUVSWQorIyBkZWZpbmUgSUNNUFY2X05JX1FVRVJZCQkxMzkKKyMgZGVmaW5lIElDTVBWNl9OSV9SRVBMWQkJMTQwCisjZW5kaWYKKworLyogUXVlcnkgQ29kZXMgKi8KKyNkZWZpbmUgTklfU1VCSl9JUFY2CQkJMAorI2RlZmluZSBOSV9TVUJKX05BTUUJCQkxCisjZGVmaW5lIE5JX1NVQkpfSVBWNAkJCTIKKworLyogUmVwbHkgQ29kZXMgKi8KKyNkZWZpbmUgTklfU1VDQ0VTUwkJCTAKKyNkZWZpbmUgTklfUkVGVVNFRAkJCTEKKyNkZWZpbmUgTklfVU5LTk9XTgkJCTIKKworLyogUXR5cGVzICovCisjZGVmaW5lIE5JX1FUWVBFX05PT1AJCQkwCisjZGVmaW5lIE5JX1FUWVBFX05BTUUJCQkyCisjZGVmaW5lIE5JX1FUWVBFX0lQVjZBRERSCQkzCisjZGVmaW5lIE5JX1FUWVBFX0lQVjRBRERSCQk0CisKKy8qIEZsYWdzICovCisjZGVmaW5lIE5JX0lQVjZBRERSX0ZfVFJVTkNBVEUJCV9fY29uc3RhbnRfY3B1X3RvX2JlMTYoMHgwMDAxKQorI2RlZmluZSBOSV9JUFY2QUREUl9GX0FMTAkJX19jb25zdGFudF9jcHVfdG9fYmUxNigweDAwMDIpCisjZGVmaW5lIE5JX0lQVjZBRERSX0ZfQ09NUEFUCQlfX2NvbnN0YW50X2NwdV90b19iZTE2KDB4MDAwNCkKKyNkZWZpbmUgTklfSVBWNkFERFJfRl9MSU5LTE9DQUwJCV9fY29uc3RhbnRfY3B1X3RvX2JlMTYoMHgwMDA4KQorI2RlZmluZSBOSV9JUFY2QUREUl9GX1NJVEVMT0NBTAkJX19jb25zdGFudF9jcHVfdG9fYmUxNigweDAwMTApCisjZGVmaW5lIE5JX0lQVjZBRERSX0ZfR0xPQkFMCQlfX2NvbnN0YW50X2NwdV90b19iZTE2KDB4MDAyMCkKKworI2RlZmluZSBOSV9JUFY0QUREUl9GX1RSVU5DQVRFCQlOSV9JUFY2QUREUl9GX1RSVU5DQVRFCisjZGVmaW5lIE5JX0lQVjRBRERSX0ZfQUxMCQlOSV9JUFY2QUREUl9GX0FMTAorCmRpZmYgLS1naXQgYS9pcHV0aWxzL3BpbmdfY29tbW9uLmMgYi9pcHV0aWxzL3BpbmdfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5MzQyZAotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvcGluZ19jb21tb24uYwpAQCAtMCwwICsxLDEwOTMgQEAKKyNpbmNsdWRlICJwaW5nX2NvbW1vbi5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKK2ludCBvcHRpb25zOworCitfX3UzMiBtYXJrOworaW50IHNuZGJ1ZjsKK2ludCB0dGw7CitpbnQgcnR0OworaW50IHJ0dF9hZGRlbmQ7CitfX3UxNiBhY2tlZDsKKworc3RydWN0IHJjdmRfdGFibGUgcmN2ZF90Ymw7CitpbnQgdXNpbmdfcGluZ19zb2NrZXQgPSAxOworCisKKy8qIGNvdW50ZXJzICovCitsb25nIG5wYWNrZXRzOwkJCS8qIG1heCBwYWNrZXRzIHRvIHRyYW5zbWl0ICovCitsb25nIG5yZWNlaXZlZDsJCQkvKiAjIG9mIHBhY2tldHMgd2UgZ290IGJhY2sgKi8KK2xvbmcgbnJlcGVhdHM7CQkJLyogbnVtYmVyIG9mIGR1cGxpY2F0ZXMgKi8KK2xvbmcgbnRyYW5zbWl0dGVkOwkJLyogc2VxdWVuY2UgIyBmb3Igb3V0Ym91bmQgcGFja2V0cyA9ICNzZW50ICovCitsb25nIG5jaGVja3N1bTsJCQkvKiByZXBsaWVzIHdpdGggYmFkIGNoZWNrc3VtICovCitsb25nIG5lcnJvcnM7CQkJLyogaWNtcCBlcnJvcnMgKi8KK2ludCBpbnRlcnZhbCA9IDEwMDA7CQkvKiBpbnRlcnZhbCBiZXR3ZWVuIHBhY2tldHMgKG1zZWMpICovCitpbnQgcHJlbG9hZDsKK2ludCBkZWFkbGluZSA9IDA7CQkvKiB0aW1lIHRvIGRpZSAqLworaW50IGxpbmdlcnRpbWUgPSBNQVhXQUlUKjEwMDA7CitzdHJ1Y3QgdGltZXZhbCBzdGFydF90aW1lLCBjdXJfdGltZTsKK3ZvbGF0aWxlIGludCBleGl0aW5nOwordm9sYXRpbGUgaW50IHN0YXR1c19zbmFwc2hvdDsKK2ludCBjb25maXJtID0gMDsKK3ZvbGF0aWxlIGludCBpbl9wcl9hZGRyID0gMDsJLyogcHJfYWRkcigpIGlzIGV4ZWN1dGluZyAqLworam1wX2J1ZiBwcl9hZGRyX2ptcDsKKworLyogU3R1cGlkIHdvcmthcm91bmRzIGZvciBidWdzL21pc3NpbmcgZnVuY3Rpb25hbGl0eSBpbiBvbGRlciBsaW51Y2VzLgorICogY29uZmlybV9mbGFnIGZpeGVzIHJlZnVzaW5nIHNlcnZpY2Ugb2Yga2VybmVscyB3aXRob3V0IE1TR19DT05GSVJNLgorICogaS5lLiBmb3IgbGludXgtMi4yICovCitpbnQgY29uZmlybV9mbGFnID0gTVNHX0NPTkZJUk07CisvKiBBbmQgdGhpcyBpcyB3b3JrYXJvdW5kIGZvciBidWcgaW4gSVBfUkVDVkVSUiBvbiByYXcgc29ja2V0cyB3aGljaCBpcyBwcmVzZW50CisgKiBpbiBsaW51eC0yLjIuWzAtMTldLCBsaW51eC0yLjQuWzAtN10gKi8KK2ludCB3b3JraW5nX3JlY3ZlcnI7CisKKy8qIHRpbWluZyAqLworaW50IHRpbWluZzsJCQkvKiBmbGFnIHRvIGRvIHRpbWluZyAqLworbG9uZyB0bWluID0gTE9OR19NQVg7CQkvKiBtaW5pbXVtIHJvdW5kIHRyaXAgdGltZSAqLworbG9uZyB0bWF4OwkJCS8qIG1heGltdW0gcm91bmQgdHJpcCB0aW1lICovCisvKiBNZXNzYWdlIGZvciBycG0gbWFpbnRhaW5lcnM6IGhhdmUgX3NoYW1lXy4gSWYgeW91IHdhbnQKKyAqIHRvIGZpeCBzb21ldGhpbmcgc2VuZCB0aGUgcGF0Y2ggdG8gbWUgZm9yIHNhbml0eSBjaGVja2luZy4KKyAqICJzcGFyY2ZpeCIgcGF0Y2ggaXMgYSBjb21wbGV0ZSBub24tc2Vuc2UsIGFwcGFyZW5seSB0aGUgcGVyc29uCisgKiBwcmVwYXJlZCBpdCB3YXMgc3RvbmVkLgorICovCitsb25nIGxvbmcgdHN1bTsJCQkvKiBzdW0gb2YgYWxsIHRpbWVzLCBmb3IgZG9pbmcgYXZlcmFnZSAqLworbG9uZyBsb25nIHRzdW0yOworaW50ICBwaXBlc2l6ZSA9IC0xOworCitpbnQgZGF0YWxlbiA9IERFRkRBVEFMRU47CisKK2NoYXIgKmhvc3RuYW1lOworaW50IHVpZDsKK3VpZF90IGV1aWQ7CitpbnQgaWRlbnQgPSAwOwkJCS8qIHByb2Nlc3MgaWQgdG8gaWRlbnRpZnkgb3VyIHBhY2tldHMgKi8KKworc3RhdGljIGludCBzY3JlZW5fd2lkdGggPSBJTlRfTUFYOworCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkJKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKworI2lmZGVmIENBUEFCSUxJVElFUworc3RhdGljIGNhcF92YWx1ZV90IGNhcF9yYXcgPSBDQVBfTkVUX1JBVzsKK3N0YXRpYyBjYXBfdmFsdWVfdCBjYXBfYWRtaW4gPSBDQVBfTkVUX0FETUlOOworI2VuZGlmCisKK3ZvaWQgbGltaXRfY2FwYWJpbGl0aWVzKHZvaWQpCit7CisjaWZkZWYgQ0FQQUJJTElUSUVTCisJY2FwX3QgY2FwX2N1cl9wOworCWNhcF90IGNhcF9wOworCWNhcF9mbGFnX3ZhbHVlX3QgY2FwX29rOworCisJY2FwX2N1cl9wID0gY2FwX2dldF9wcm9jKCk7CisJaWYgKCFjYXBfY3VyX3ApIHsKKwkJcGVycm9yKCJwaW5nOiBjYXBfZ2V0X3Byb2MiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJY2FwX3AgPSBjYXBfaW5pdCgpOworCWlmICghY2FwX3ApIHsKKwkJcGVycm9yKCJwaW5nOiBjYXBfaW5pdCIpOworCQlleGl0KC0xKTsKKwl9CisKKwljYXBfb2sgPSBDQVBfQ0xFQVI7CisJY2FwX2dldF9mbGFnKGNhcF9jdXJfcCwgQ0FQX05FVF9BRE1JTiwgQ0FQX1BFUk1JVFRFRCwgJmNhcF9vayk7CisKKwlpZiAoY2FwX29rICE9IENBUF9DTEVBUikKKwkJY2FwX3NldF9mbGFnKGNhcF9wLCBDQVBfUEVSTUlUVEVELCAxLCAmY2FwX2FkbWluLCBDQVBfU0VUKTsKKworCWNhcF9vayA9IENBUF9DTEVBUjsKKwljYXBfZ2V0X2ZsYWcoY2FwX2N1cl9wLCBDQVBfTkVUX1JBVywgQ0FQX1BFUk1JVFRFRCwgJmNhcF9vayk7CisKKwlpZiAoY2FwX29rICE9IENBUF9DTEVBUikKKwkJY2FwX3NldF9mbGFnKGNhcF9wLCBDQVBfUEVSTUlUVEVELCAxLCAmY2FwX3JhdywgQ0FQX1NFVCk7CisKKwlpZiAoY2FwX3NldF9wcm9jKGNhcF9wKSA8IDApIHsKKwkJcGVycm9yKCJwaW5nOiBjYXBfc2V0X3Byb2MiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKHByY3RsKFBSX1NFVF9LRUVQQ0FQUywgMSkgPCAwKSB7CisJCXBlcnJvcigicGluZzogcHJjdGwiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKHNldHVpZChnZXR1aWQoKSkgPCAwKSB7CisJCXBlcnJvcigic2V0dWlkIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChwcmN0bChQUl9TRVRfS0VFUENBUFMsIDApIDwgMCkgeworCQlwZXJyb3IoInBpbmc6IHByY3RsIik7CisJCWV4aXQoLTEpOworCX0KKworCWNhcF9mcmVlKGNhcF9wKTsKKwljYXBfZnJlZShjYXBfY3VyX3ApOworI2VuZGlmCisJdWlkID0gZ2V0dWlkKCk7CisJZXVpZCA9IGdldGV1aWQoKTsKKyNpZm5kZWYgQ0FQQUJJTElUSUVTCisJaWYgKHNldGV1aWQodWlkKSkgeworCQlwZXJyb3IoInBpbmc6IHNldHVpZCIpOworCQlleGl0KC0xKTsKKwl9CisjZW5kaWYKK30KKworI2lmZGVmIENBUEFCSUxJVElFUworaW50IG1vZGlmeV9jYXBhYmlsaXR5KGNhcF92YWx1ZV90IGNhcCwgY2FwX2ZsYWdfdmFsdWVfdCBvbikKK3sKKwljYXBfdCBjYXBfcCA9IGNhcF9nZXRfcHJvYygpOworCWNhcF9mbGFnX3ZhbHVlX3QgY2FwX29rOworCWludCByYyA9IC0xOworCisJaWYgKCFjYXBfcCkgeworCQlwZXJyb3IoInBpbmc6IGNhcF9nZXRfcHJvYyIpOworCQlnb3RvIG91dDsKKwl9CisKKwljYXBfb2sgPSBDQVBfQ0xFQVI7CisJY2FwX2dldF9mbGFnKGNhcF9wLCBjYXAsIENBUF9QRVJNSVRURUQsICZjYXBfb2spOworCWlmIChjYXBfb2sgPT0gQ0FQX0NMRUFSKSB7CisJCXJjID0gb24gPyAtMSA6IDA7CisJCWdvdG8gb3V0OworCX0KKworCWNhcF9zZXRfZmxhZyhjYXBfcCwgQ0FQX0VGRkVDVElWRSwgMSwgJmNhcCwgb24pOworCisJaWYgKGNhcF9zZXRfcHJvYyhjYXBfcCkgPCAwKSB7CisJCXBlcnJvcigicGluZzogY2FwX3NldF9wcm9jIik7CisJCWdvdG8gb3V0OworCX0KKworCWNhcF9mcmVlKGNhcF9wKTsKKworCXJjID0gMDsKK291dDoKKwlpZiAoY2FwX3ApCisJCWNhcF9mcmVlKGNhcF9wKTsKKwlyZXR1cm4gcmM7Cit9CisjZWxzZQoraW50IG1vZGlmeV9jYXBhYmlsaXR5KGludCBvbikKK3sKKwlpZiAoc2V0ZXVpZChvbiA/IGV1aWQgOiBnZXR1aWQoKSkpIHsKKwkJcGVycm9yKCJzZXRldWlkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIGRyb3BfY2FwYWJpbGl0aWVzKHZvaWQpCit7CisjaWZkZWYgQ0FQQUJJTElUSUVTCisJY2FwX3QgY2FwID0gY2FwX2luaXQoKTsKKwlpZiAoY2FwX3NldF9wcm9jKGNhcCkgPCAwKSB7CisJCXBlcnJvcigicGluZzogY2FwX3NldF9wcm9jIik7CisJCWV4aXQoLTEpOworCX0KKwljYXBfZnJlZShjYXApOworI2Vsc2UKKwlpZiAoc2V0dWlkKGdldHVpZCgpKSkgeworCQlwZXJyb3IoInBpbmc6IHNldHVpZCIpOworCQlleGl0KC0xKTsKKwl9CisjZW5kaWYKK30KKwordm9pZCBhbmRyb2lkX2NoZWNrX3NlY3VyaXR5KHZvaWQpCit7CisJaWYgKGdldGF1eHZhbChBVF9TRUNVUkUpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGlzIHZlcnNpb24gb2YgcGluZyBzaG91bGQgTk9UIHJ1biB3aXRoIHByaXZpbGVnZXMuIEFib3J0aW5nXG4iKTsKKwkJZXhpdCgxKTsKKwl9Cit9CisKKy8qIEZpbGxzIGFsbCB0aGUgb3V0cGFjaywgZXhjbHVkaW5nIElDTVAgaGVhZGVyLCBidXQgX2luY2x1ZGluZ18KKyAqIHRpbWVzdGFtcCBhcmVhIHdpdGggc3VwcGxpZWQgcGF0dGVybi4KKyAqLworc3RhdGljIHZvaWQgZmlsbChjaGFyICpwYXRwKQoreworCWludCBpaSwgamosIGtrOworCWludCBwYXRbMTZdOworCWNoYXIgKmNwOworCXVfY2hhciAqYnAgPSBvdXRwYWNrKzg7CisKKyNpZmRlZiBVU0VfSUROCisJc2V0bG9jYWxlKExDX0FMTCwgIkMiKTsKKyNlbmRpZgorCisJZm9yIChjcCA9IHBhdHA7ICpjcDsgY3ArKykgeworCQlpZiAoIWlzeGRpZ2l0KCpjcCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJwaW5nOiBwYXR0ZXJucyBtdXN0IGJlIHNwZWNpZmllZCBhcyBoZXggZGlnaXRzLlxuIik7CisJCQlleGl0KDIpOworCQl9CisJfQorCWlpID0gc3NjYW5mKHBhdHAsCisJICAgICIlMnglMnglMnglMnglMnglMnglMnglMnglMnglMnglMnglMnglMnglMnglMnglMngiLAorCSAgICAmcGF0WzBdLCAmcGF0WzFdLCAmcGF0WzJdLCAmcGF0WzNdLCAmcGF0WzRdLCAmcGF0WzVdLCAmcGF0WzZdLAorCSAgICAmcGF0WzddLCAmcGF0WzhdLCAmcGF0WzldLCAmcGF0WzEwXSwgJnBhdFsxMV0sICZwYXRbMTJdLAorCSAgICAmcGF0WzEzXSwgJnBhdFsxNF0sICZwYXRbMTVdKTsKKworCWlmIChpaSA+IDApIHsKKwkJZm9yIChrayA9IDA7IGtrIDw9IG1heHBhY2tldCAtICg4ICsgaWkpOyBrayArPSBpaSkKKwkJCWZvciAoamogPSAwOyBqaiA8IGlpOyArK2pqKQorCQkJCWJwW2pqICsga2tdID0gcGF0W2pqXTsKKwl9CisJaWYgKCEob3B0aW9ucyAmIEZfUVVJRVQpKSB7CisJCXByaW50ZigiUEFUVEVSTjogMHgiKTsKKwkJZm9yIChqaiA9IDA7IGpqIDwgaWk7ICsramopCisJCQlwcmludGYoIiUwMngiLCBicFtqal0gJiAweEZGKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworI2lmZGVmIFVTRV9JRE4KKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisjZW5kaWYKK30KKwordm9pZCBjb21tb25fb3B0aW9ucyhpbnQgY2gpCit7CisJc3dpdGNoKGNoKSB7CisJY2FzZSAnYSc6CisJCW9wdGlvbnMgfD0gRl9BVURJQkxFOworCQlicmVhazsKKwljYXNlICdBJzoKKwkJb3B0aW9ucyB8PSBGX0FEQVBUSVZFOworCQlicmVhazsKKwljYXNlICdjJzoKKwkJbnBhY2tldHMgPSBhdG9pKG9wdGFyZyk7CisJCWlmIChucGFja2V0cyA8PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IGJhZCBudW1iZXIgb2YgcGFja2V0cyB0byB0cmFuc21pdC5cbiIpOworCQkJZXhpdCgyKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdkJzoKKwkJb3B0aW9ucyB8PSBGX1NPX0RFQlVHOworCQlicmVhazsKKwljYXNlICdEJzoKKwkJb3B0aW9ucyB8PSBGX1BUSU1FT0ZEQVk7CisJCWJyZWFrOworCWNhc2UgJ2knOgkJLyogd2FpdCBiZXR3ZWVuIHNlbmRpbmcgcGFja2V0cyAqLworCXsKKwkJZG91YmxlIGRibDsKKwkJY2hhciAqZXA7CisKKwkJZXJybm8gPSAwOworCQlkYmwgPSBzdHJ0b2Qob3B0YXJnLCAmZXApOworCisJCWlmIChlcnJubyB8fCAqZXAgIT0gJ1wwJyB8fAorCQkgICAgIWZpbml0ZShkYmwpIHx8IGRibCA8IDAuMCB8fCBkYmwgPj0gKGRvdWJsZSlJTlRfTUFYIC8gMTAwMCAtIDEuMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBiYWQgdGltaW5nIGludGVydmFsXG4iKTsKKwkJCWV4aXQoMik7CisJCX0KKworCQlpbnRlcnZhbCA9IChpbnQpKGRibCAqIDEwMDApOworCisJCW9wdGlvbnMgfD0gRl9JTlRFUlZBTDsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ20nOgorCXsKKwkJY2hhciAqZW5kcDsKKwkJbWFyayA9IHN0cnRvdWwob3B0YXJnLCAmZW5kcCwgMCk7CisJCWlmICgqZW5kcCAhPSAnXDAnKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IGludmFsaWQgbWFyayAlc1xuIiwgb3B0YXJnKTsKKwkJCWV4aXQoMik7CisJCX0KKwkJb3B0aW9ucyB8PSBGX01BUks7CisJCWJyZWFrOworCX0KKwljYXNlICd3JzoKKwkJZGVhZGxpbmUgPSBhdG9pKG9wdGFyZyk7CisJCWlmIChkZWFkbGluZSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicGluZzogYmFkIHdhaXQgdGltZS5cbiIpOworCQkJZXhpdCgyKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdsJzoKKwkJcHJlbG9hZCA9IGF0b2kob3B0YXJnKTsKKwkJaWYgKHByZWxvYWQgPD0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBiYWQgcHJlbG9hZCB2YWx1ZSwgc2hvdWxkIGJlIDEuLiVkXG4iLCBNQVhfRFVQX0NISyk7CisJCQlleGl0KDIpOworCQl9CisJCWlmIChwcmVsb2FkID4gTUFYX0RVUF9DSEspCisJCQlwcmVsb2FkID0gTUFYX0RVUF9DSEs7CisJCWlmICh1aWQgJiYgcHJlbG9hZCA+IDMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicGluZzogY2Fubm90IHNldCBwcmVsb2FkIHRvIHZhbHVlID4gM1xuIik7CisJCQlleGl0KDIpOworCQl9CisJCWJyZWFrOworCWNhc2UgJ08nOgorCQlvcHRpb25zIHw9IEZfT1VUU1RBTkRJTkc7CisJCWJyZWFrOworCWNhc2UgJ1MnOgorCQlzbmRidWYgPSBhdG9pKG9wdGFyZyk7CisJCWlmIChzbmRidWYgPD0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBiYWQgc25kYnVmIHZhbHVlLlxuIik7CisJCQlleGl0KDIpOworCQl9CisJCWJyZWFrOworCWNhc2UgJ2YnOgorCQlvcHRpb25zIHw9IEZfRkxPT0Q7CisJCXNldGJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCk7CisJCS8qIGZhbGx0aHJvdWdoIHRvIG51bWVyaWMgLSBhdm9pZCBnZXRob3N0YnlhZGRyIGR1cmluZyBmbG9vZCAqLworCWNhc2UgJ24nOgorCQlvcHRpb25zIHw9IEZfTlVNRVJJQzsKKwkJYnJlYWs7CisJY2FzZSAncCc6CQkvKiBmaWxsIGJ1ZmZlciB3aXRoIHVzZXIgcGF0dGVybiAqLworCQlvcHRpb25zIHw9IEZfUElOR0ZJTExFRDsKKwkJZmlsbChvcHRhcmcpOworCQlicmVhazsKKwljYXNlICdxJzoKKwkJb3B0aW9ucyB8PSBGX1FVSUVUOworCQlicmVhazsKKwljYXNlICdyJzoKKwkJb3B0aW9ucyB8PSBGX1NPX0RPTlRST1VURTsKKwkJYnJlYWs7CisJY2FzZSAncyc6CQkvKiBzaXplIG9mIHBhY2tldCB0byBzZW5kICovCisJCWRhdGFsZW4gPSBhdG9pKG9wdGFyZyk7CisJCWlmIChkYXRhbGVuIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBpbGxlZ2FsIG5lZ2F0aXZlIHBhY2tldCBzaXplICVkLlxuIiwgZGF0YWxlbik7CisJCQlleGl0KDIpOworCQl9CisJCWlmIChkYXRhbGVuID4gbWF4cGFja2V0IC0gOCkgeworCQkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBwYWNrZXQgc2l6ZSB0b28gbGFyZ2U6ICVkXG4iLAorCQkJCWRhdGFsZW4pOworCQkJZXhpdCgyKTsKKwkJfQorCQlicmVhazsKKwljYXNlICd2JzoKKwkJb3B0aW9ucyB8PSBGX1ZFUkJPU0U7CisJCWJyZWFrOworCWNhc2UgJ0wnOgorCQlvcHRpb25zIHw9IEZfTk9MT09QOworCQlicmVhazsKKwljYXNlICd0JzoKKwkJb3B0aW9ucyB8PSBGX1RUTDsKKwkJdHRsID0gYXRvaShvcHRhcmcpOworCQlpZiAodHRsIDwgMCB8fCB0dGwgPiAyNTUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicGluZzogdHRsICV1IG91dCBvZiByYW5nZVxuIiwgdHRsKTsKKwkJCWV4aXQoMik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnVSc6CisJCW9wdGlvbnMgfD0gRl9MQVRFTkNZOworCQlicmVhazsKKwljYXNlICdCJzoKKwkJb3B0aW9ucyB8PSBGX1NUUklDVFNPVVJDRTsKKwkJYnJlYWs7CisJY2FzZSAnVyc6CisJCWxpbmdlcnRpbWUgPSBhdG9pKG9wdGFyZyk7CisJCWlmIChsaW5nZXJ0aW1lIDwgMCB8fCBsaW5nZXJ0aW1lID4gSU5UX01BWC8xMDAwMDAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInBpbmc6IGJhZCBsaW5nZXIgdGltZS5cbiIpOworCQkJZXhpdCgyKTsKKwkJfQorCQlsaW5nZXJ0aW1lICo9IDEwMDA7CisJCWJyZWFrOworCWNhc2UgJ1YnOgorCQlwcmludGYoInBpbmcgdXRpbGl0eSwgaXB1dGlscy0lc1xuIiwgU05BUFNIT1QpOworCQlleGl0KDApOworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNpZ2V4aXQoaW50IHNpZ25vKQoreworCWV4aXRpbmcgPSAxOworCWlmIChpbl9wcl9hZGRyKQorCQlsb25nam1wKHByX2FkZHJfam1wLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2lnc3RhdHVzKGludCBzaWdubykKK3sKKwlzdGF0dXNfc25hcHNob3QgPSAxOworfQorCisKK2ludCBfX3NjaGVkdWxlX2V4aXQoaW50IG5leHQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgd2FpdHRpbWU7CisJc3RydWN0IGl0aW1lcnZhbCBpdDsKKworCWlmICh3YWl0dGltZSkKKwkJcmV0dXJuIG5leHQ7CisKKwlpZiAobnJlY2VpdmVkKSB7CisJCXdhaXR0aW1lID0gMiAqIHRtYXg7CisJCWlmICh3YWl0dGltZSA8IDEwMDAqaW50ZXJ2YWwpCisJCQl3YWl0dGltZSA9IDEwMDAqaW50ZXJ2YWw7CisJfSBlbHNlCisJCXdhaXR0aW1lID0gbGluZ2VydGltZSoxMDAwOworCisJaWYgKG5leHQgPCAwIHx8IG5leHQgPCB3YWl0dGltZS8xMDAwKQorCQluZXh0ID0gd2FpdHRpbWUvMTAwMDsKKworCWl0Lml0X2ludGVydmFsLnR2X3NlYyA9IDA7CisJaXQuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDA7CisJaXQuaXRfdmFsdWUudHZfc2VjID0gd2FpdHRpbWUvMTAwMDAwMDsKKwlpdC5pdF92YWx1ZS50dl91c2VjID0gd2FpdHRpbWUlMTAwMDAwMDsKKwlzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZpdCwgTlVMTCk7CisJcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfaW50ZXJ2YWwodm9pZCkKK3sKKwlpbnQgZXN0ID0gcnR0ID8gcnR0LzggOiBpbnRlcnZhbCoxMDAwOworCisJaW50ZXJ2YWwgPSAoZXN0K3J0dF9hZGRlbmQrNTAwKS8xMDAwOworCWlmICh1aWQgJiYgaW50ZXJ2YWwgPCBNSU5VU0VSSU5URVJWQUwpCisJCWludGVydmFsID0gTUlOVVNFUklOVEVSVkFMOworfQorCisvKgorICogUHJpbnQgdGltZXN0YW1wCisgKi8KK3ZvaWQgcHJpbnRfdGltZXN0YW1wKHZvaWQpCit7CisJaWYgKG9wdGlvbnMgJiBGX1BUSU1FT0ZEQVkpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQlwcmludGYoIlslbHUuJTA2bHVdICIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyl0di50dl9zZWMsICh1bnNpZ25lZCBsb25nKXR2LnR2X3VzZWMpOworCX0KK30KKworLyoKKyAqIHBpbmdlciAtLQorICogCUNvbXBvc2UgYW5kIHRyYW5zbWl0IGFuIElDTVAgRUNITyBSRVFVRVNUIHBhY2tldC4gIFRoZSBJUCBwYWNrZXQKKyAqIHdpbGwgYmUgYWRkZWQgb24gYnkgdGhlIGtlcm5lbC4gIFRoZSBJRCBmaWVsZCBpcyBvdXIgVU5JWCBwcm9jZXNzIElELAorICogYW5kIHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYW4gYXNjZW5kaW5nIGludGVnZXIuICBUaGUgZmlyc3QgOCBieXRlcworICogb2YgdGhlIGRhdGEgcG9ydGlvbiBhcmUgdXNlZCB0byBob2xkIGEgVU5JWCAidGltZXZhbCIgc3RydWN0IGluIFZBWAorICogYnl0ZS1vcmRlciwgdG8gY29tcHV0ZSB0aGUgcm91bmQtdHJpcCB0aW1lLgorICovCitpbnQgcGluZ2VyKHZvaWQpCit7CisJc3RhdGljIGludCBvb21fY291bnQ7CisJc3RhdGljIGludCB0b2tlbnM7CisJaW50IGk7CisKKwkvKiBIYXZlIHdlIGFscmVhZHkgc2VudCBlbm91Z2g/IElmIHdlIGhhdmUsIHJldHVybiBhbiBhcmJpdHJhcnkgcG9zaXRpdmUgdmFsdWUuICovCisJaWYgKGV4aXRpbmcgfHwgKG5wYWNrZXRzICYmIG50cmFuc21pdHRlZCA+PSBucGFja2V0cyAmJiAhZGVhZGxpbmUpKQorCQlyZXR1cm4gMTAwMDsKKworCS8qIENoZWNrIHRoYXQgcGFja2V0cyA8IHJhdGUqdGltZSArIHByZWxvYWQgKi8KKwlpZiAoY3VyX3RpbWUudHZfc2VjID09IDApIHsKKwkJZ2V0dGltZW9mZGF5KCZjdXJfdGltZSwgTlVMTCk7CisJCXRva2VucyA9IGludGVydmFsKihwcmVsb2FkLTEpOworCX0gZWxzZSB7CisJCWxvbmcgbnRva2VuczsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisKKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCW50b2tlbnMgPSAodHYudHZfc2VjIC0gY3VyX3RpbWUudHZfc2VjKSoxMDAwICsKKwkJCSh0di50dl91c2VjLWN1cl90aW1lLnR2X3VzZWMpLzEwMDA7CisJCWlmICghaW50ZXJ2YWwpIHsKKwkJCS8qIENhc2Ugb2YgdW5saW1pdGVkIGZsb29kIGlzIHNwZWNpYWw7CisJCQkgKiBpZiB3ZSBzZWUgbm8gcmVwbHksIHRoZXkgYXJlIGxpbWl0ZWQgdG8gMTAwcHBzICovCisJCQlpZiAobnRva2VucyA8IE1JTklOVEVSVkFMICYmIGluX2ZsaWdodCgpID49IHByZWxvYWQpCisJCQkJcmV0dXJuIE1JTklOVEVSVkFMLW50b2tlbnM7CisJCX0KKwkJbnRva2VucyArPSB0b2tlbnM7CisJCWlmIChudG9rZW5zID4gaW50ZXJ2YWwqcHJlbG9hZCkKKwkJCW50b2tlbnMgPSBpbnRlcnZhbCpwcmVsb2FkOworCQlpZiAobnRva2VucyA8IGludGVydmFsKQorCQkJcmV0dXJuIGludGVydmFsIC0gbnRva2VuczsKKworCQljdXJfdGltZSA9IHR2OworCQl0b2tlbnMgPSBudG9rZW5zIC0gaW50ZXJ2YWw7CisJfQorCisJaWYgKG9wdGlvbnMgJiBGX09VVFNUQU5ESU5HKSB7CisJCWlmIChudHJhbnNtaXR0ZWQgPiAwICYmICFyY3ZkX3Rlc3QobnRyYW5zbWl0dGVkKSkgeworCQkJcHJpbnRfdGltZXN0YW1wKCk7CisJCQlwcmludGYoIm5vIGFuc3dlciB5ZXQgZm9yIGljbXBfc2VxPSVsdVxuIiwgKG50cmFuc21pdHRlZCAlIE1BWF9EVVBfQ0hLKSk7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJfQorCX0KKworcmVzZW5kOgorCWkgPSBzZW5kX3Byb2JlKCk7CisKKwlpZiAoaSA9PSAwKSB7CisJCW9vbV9jb3VudCA9IDA7CisJCWFkdmFuY2VfbnRyYW5zbWl0dGVkKCk7CisJCWlmICghKG9wdGlvbnMgJiBGX1FVSUVUKSAmJiAob3B0aW9ucyAmIEZfRkxPT0QpKSB7CisJCQkvKiBWZXJ5IHNpbGx5LCBidXQgd2l0aG91dCB0aGlzIG91dHB1dCB3aXRoCisJCQkgKiBoaWdoIHByZWxvYWQgb3IgcGlwZSBzaXplIGlzIHZlcnkgY29uZnVzaW5nLiAqLworCQkJaWYgKChwcmVsb2FkIDwgc2NyZWVuX3dpZHRoICYmIHBpcGVzaXplIDwgc2NyZWVuX3dpZHRoKSB8fAorCQkJICAgIGluX2ZsaWdodCgpIDwgc2NyZWVuX3dpZHRoKQorCQkJCXdyaXRlX3N0ZG91dCgiLiIsIDEpOworCQl9CisJCXJldHVybiBpbnRlcnZhbCAtIHRva2VuczsKKwl9CisKKwkvKiBBbmQgaGFuZGxlIHZhcmlvdXMgZXJyb3JzLi4uICovCisJaWYgKGkgPiAwKSB7CisJCS8qIEFwcGFyZW50bHksIGl0IGlzIHNvbWUgZmF0YWwgYnVnLiAqLworCQlhYm9ydCgpOworCX0gZWxzZSBpZiAoZXJybm8gPT0gRU5PQlVGUyB8fCBlcnJubyA9PSBFTk9NRU0pIHsKKwkJaW50IG5vcmVzX2ludGVydmFsOworCisJCS8qIERldmljZSBxdWV1ZSBvdmVyZmxvdyBvciBPT00uIFBhY2tldCBpcyBub3Qgc2VudC4gKi8KKwkJdG9rZW5zID0gMDsKKwkJLyogU2xvd2Rvd24uIFRoaXMgd29ya3Mgb25seSBpbiBhZGFwdGl2ZSBtb2RlIChvcHRpb24gLUEpICovCisJCXJ0dF9hZGRlbmQgKz0gKHJ0dCA8IDgqNTAwMDAgPyBydHQvOCA6IDUwMDAwKTsKKwkJaWYgKG9wdGlvbnMmRl9BREFQVElWRSkKKwkJCXVwZGF0ZV9pbnRlcnZhbCgpOworCQlub3Jlc19pbnRlcnZhbCA9IFNDSElOVChpbnRlcnZhbC8yKTsKKwkJaWYgKG5vcmVzX2ludGVydmFsID4gNTAwKQorCQkJbm9yZXNfaW50ZXJ2YWwgPSA1MDA7CisJCW9vbV9jb3VudCsrOworCQlpZiAob29tX2NvdW50Km5vcmVzX2ludGVydmFsIDwgbGluZ2VydGltZSkKKwkJCXJldHVybiBub3Jlc19pbnRlcnZhbDsKKwkJaSA9IDA7CisJCS8qIEZhbGwgdG8gaGFyZCBlcnJvci4gSXQgaXMgdG8gYXZvaWQgY29tcGxldGUgZGVhZGxvY2sKKwkJICogb24gc3R1Y2sgb3V0cHV0IGRldmljZSBldmVuIHdoZW4gZGVhbGluZSB3YXMgbm90IHJlcXVlc3RlZC4KKwkJICogRXhwZWN0ZWQgdGltaW5ncyBhcmUgc2NyZXdlZCB1cCBpbiBhbnkgY2FzZSwgYnV0IHdlIHdpbGwKKwkJICogZXhpdCBzb21lIGRheS4gOi0pICovCisJfSBlbHNlIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKwkJLyogU29ja2V0IGJ1ZmZlciBpcyBmdWxsLiAqLworCQl0b2tlbnMgKz0gaW50ZXJ2YWw7CisJCXJldHVybiBNSU5JTlRFUlZBTDsKKwl9IGVsc2UgeworCQlpZiAoKGk9cmVjZWl2ZV9lcnJvcl9tc2coKSkgPiAwKSB7CisJCQkvKiBBbiBJQ01QIGVycm9yIGFycml2ZWQuICovCisJCQl0b2tlbnMgKz0gaW50ZXJ2YWw7CisJCQlyZXR1cm4gTUlOSU5URVJWQUw7CisJCX0KKwkJLyogQ29tcGF0aWJpbGl0eSB3aXRoIG9sZCBsaW51Y2VzLiAqLworCQlpZiAoaSA9PSAwICYmIGNvbmZpcm1fZmxhZyAmJiBlcnJubyA9PSBFSU5WQUwpIHsKKwkJCWNvbmZpcm1fZmxhZyA9IDA7CisJCQllcnJubyA9IDA7CisJCX0KKwkJaWYgKCFlcnJubykKKwkJCWdvdG8gcmVzZW5kOworCX0KKworCS8qIEhhcmQgbG9jYWwgZXJyb3IuIFByZXRlbmQgd2Ugc2VudCBwYWNrZXQuICovCisJYWR2YW5jZV9udHJhbnNtaXR0ZWQoKTsKKworCWlmIChpID09IDAgJiYgIShvcHRpb25zICYgRl9RVUlFVCkpIHsKKwkJaWYgKG9wdGlvbnMgJiBGX0ZMT09EKQorCQkJd3JpdGVfc3Rkb3V0KCJFIiwgMSk7CisJCWVsc2UKKwkJCXBlcnJvcigicGluZzogc2VuZG1zZyIpOworCX0KKwl0b2tlbnMgPSAwOworCXJldHVybiBTQ0hJTlQoaW50ZXJ2YWwpOworfQorCisvKiBTZXQgc29ja2V0IGJ1ZmZlcnMsICJhbGxvYyIgaXMgYW4gZXN0aW1hdGUgb2YgbWVtb3J5IHRha2VuIGJ5IHNpbmdsZSBwYWNrZXQuICovCisKK3ZvaWQgc29ja19zZXRidWZzKGludCBpY21wX3NvY2ssIGludCBhbGxvYykKK3sKKwlpbnQgcmN2YnVmLCBob2xkOworCXNvY2tsZW5fdCB0bXBsZW4gPSBzaXplb2YoaG9sZCk7CisKKwlpZiAoIXNuZGJ1ZikKKwkJc25kYnVmID0gYWxsb2M7CisJc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIgKikmc25kYnVmLCBzaXplb2Yoc25kYnVmKSk7CisKKwlyY3ZidWYgPSBob2xkID0gYWxsb2MgKiBwcmVsb2FkOworCWlmIChob2xkIDwgNjU1MzYpCisJCWhvbGQgPSA2NTUzNjsKKwlzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciAqKSZob2xkLCBzaXplb2YoaG9sZCkpOworCWlmIChnZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciAqKSZob2xkLCAmdG1wbGVuKSA9PSAwKSB7CisJCWlmIChob2xkIDwgcmN2YnVmKQorCQkJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBwcm9iYWJseSwgcmN2YnVmIGlzIG5vdCBlbm91Z2ggdG8gaG9sZCBwcmVsb2FkLlxuIik7CisJfQorfQorCit2b2lkIHNvY2tfc2V0bWFyayhpbnQgaWNtcF9zb2NrKSB7CisjaWZkZWYgU09fTUFSSworCWlmIChvcHRpb25zICYgRl9NQVJLKSB7CisJCWludCByZXQ7CisKKwkJZW5hYmxlX2NhcGFiaWxpdHlfYWRtaW4oKTsKKwkJcmV0ID0gc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX01BUkssICZtYXJrLCBzaXplb2YobWFyaykpOworCQlkaXNhYmxlX2NhcGFiaWxpdHlfYWRtaW4oKTsKKworCQlpZiAocmV0ID09IC0xKSB7CisJCQkvKiB3ZSBwcm9iYWJseSBkb250IHdhbm5hIGV4aXQgc2luY2Ugb2xkIGtlcm5lbHMKKwkJCSAqIGRvbnQgc3VwcG9ydCBtYXJrIC4uCisJCQkqLworCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBGYWlsZWQgdG8gc2V0IG1hcmsgJWRcbiIsIG1hcmspOworCQl9CisJfQorI2VuZGlmCit9CisKKy8qIFByb3RvY29sIGluZGVwZW5kZW50IHNldHVwIGFuZCBwYXJhbWV0ZXIgY2hlY2tzLiAqLworCit2b2lkIHNldHVwKGludCBpY21wX3NvY2spCit7CisJaW50IGhvbGQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc2lnc2V0X3Qgc3NldDsKKworCWlmICgob3B0aW9ucyAmIEZfRkxPT0QpICYmICEob3B0aW9ucyAmIEZfSU5URVJWQUwpKQorCQlpbnRlcnZhbCA9IDA7CisKKwlpZiAodWlkICYmIGludGVydmFsIDwgTUlOVVNFUklOVEVSVkFMKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGluZzogY2Fubm90IGZsb29kOyBtaW5pbWFsIGludGVydmFsLCBhbGxvd2VkIGZvciB1c2VyLCBpcyAlZG1zXG4iLCBNSU5VU0VSSU5URVJWQUwpOworCQlleGl0KDIpOworCX0KKworCWlmIChpbnRlcnZhbCA+PSBJTlRfTUFYL3ByZWxvYWQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJwaW5nOiBpbGxlZ2FsIHByZWxvYWQgYW5kL29yIGludGVydmFsXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlob2xkID0gMTsKKwlpZiAob3B0aW9ucyAmIEZfU09fREVCVUcpCisJCXNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywgKGNoYXIgKikmaG9sZCwgc2l6ZW9mKGhvbGQpKTsKKwlpZiAob3B0aW9ucyAmIEZfU09fRE9OVFJPVVRFKQorCQlzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLCAoY2hhciAqKSZob2xkLCBzaXplb2YoaG9sZCkpOworCisjaWZkZWYgU09fVElNRVNUQU1QCisJaWYgKCEob3B0aW9ucyZGX0xBVEVOQ1kpKSB7CisJCWludCBvbiA9IDE7CisJCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fVElNRVNUQU1QLCAmb24sIHNpemVvZihvbikpKQorCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBubyBTT19USU1FU1RBTVAgc3VwcG9ydCwgZmFsbGluZyBiYWNrIHRvIFNJT0NHU1RBTVBcbiIpOworCX0KKyNlbmRpZgorCisJc29ja19zZXRtYXJrKGljbXBfc29jayk7CisKKwkvKiBTZXQgc29tZSBTTkRUSU1FTyB0byBwcmV2ZW50IGJsb2NraW5nIGZvcmV2ZXIKKwkgKiBvbiBzZW5kcywgd2hlbiBkZXZpY2UgaXMgdG9vIHNsb3cgb3Igc3RhbGxzLiBKdXN0IHB1dCBsaW1pdAorCSAqIG9mIG9uZSBzZWNvbmQsIG9yICJpbnRlcnZhbCIsIGlmIGl0IGlzIGxlc3MuCisJICovCisJdHYudHZfc2VjID0gMTsKKwl0di50dl91c2VjID0gMDsKKwlpZiAoaW50ZXJ2YWwgPCAxMDAwKSB7CisJCXR2LnR2X3NlYyA9IDA7CisJCXR2LnR2X3VzZWMgPSAxMDAwICogU0NISU5UKGludGVydmFsKTsKKwl9CisJc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLCAoY2hhciopJnR2LCBzaXplb2YodHYpKTsKKworCS8qIFNldCBSQ1ZUSU1FTyB0byAiaW50ZXJ2YWwiLiBOb3RlLCBpdCBpcyBqdXN0IGFuIG9wdGltaXphdGlvbgorCSAqIGFsbG93aW5nIHRvIGF2b2lkIHJlZHVuZGFudCBwb2xsKCkuICovCisJdHYudHZfc2VjID0gU0NISU5UKGludGVydmFsKS8xMDAwOworCXR2LnR2X3VzZWMgPSAxMDAwKihTQ0hJTlQoaW50ZXJ2YWwpJTEwMDApOworCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sIChjaGFyKikmdHYsIHNpemVvZih0dikpKQorCQlvcHRpb25zIHw9IEZfRkxPT0RfUE9MTDsKKworCWlmICghKG9wdGlvbnMgJiBGX1BJTkdGSUxMRUQpKSB7CisJCWludCBpOworCQl1X2NoYXIgKnAgPSBvdXRwYWNrKzg7CisKKwkJLyogRG8gbm90IGZvcmdldCBhYm91dCBjYXNlIG9mIHNtYWxsIGRhdGFsZW4sCisJCSAqIGZpbGwgdGltZXN0YW1wIGFyZWEgdG9vIQorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRhdGFsZW47ICsraSkKKwkJCSpwKysgPSBpOworCX0KKworCWlmICghdXNpbmdfcGluZ19zb2NrZXQpCisJCWlkZW50ID0gaHRvbnMoZ2V0cGlkKCkgJiAweEZGRkYpOworCisJc2V0X3NpZ25hbChTSUdJTlQsIHNpZ2V4aXQpOworCXNldF9zaWduYWwoU0lHQUxSTSwgc2lnZXhpdCk7CisJc2V0X3NpZ25hbChTSUdRVUlULCBzaWdzdGF0dXMpOworCisJc2lnZW1wdHlzZXQoJnNzZXQpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc3NldCwgTlVMTCk7CisKKwlnZXR0aW1lb2ZkYXkoJnN0YXJ0X3RpbWUsIE5VTEwpOworCisJaWYgKGRlYWRsaW5lKSB7CisJCXN0cnVjdCBpdGltZXJ2YWwgaXQ7CisKKwkJaXQuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKwkJaXQuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDA7CisJCWl0Lml0X3ZhbHVlLnR2X3NlYyA9IGRlYWRsaW5lOworCQlpdC5pdF92YWx1ZS50dl91c2VjID0gMDsKKwkJc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmaXQsIE5VTEwpOworCX0KKworCWlmIChpc2F0dHkoU1RET1VUX0ZJTEVOTykpIHsKKwkJc3RydWN0IHdpbnNpemUgdzsKKworCQlpZiAoaW9jdGwoU1RET1VUX0ZJTEVOTywgVElPQ0dXSU5TWiwgJncpICE9IC0xKSB7CisJCQlpZiAody53c19jb2wgPiAwKQorCQkJCXNjcmVlbl93aWR0aCA9IHcud3NfY29sOworCQl9CisJfQorfQorCit2b2lkIG1haW5fbG9vcChpbnQgaWNtcF9zb2NrLCBfX3U4ICpwYWNrZXQsIGludCBwYWNrbGVuKQoreworCWNoYXIgYWRkcmJ1ZlsxMjhdOworCWNoYXIgYW5zX2RhdGFbNDA5Nl07CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgY21zZ2hkciAqYzsKKwlpbnQgY2M7CisJaW50IG5leHQ7CisJaW50IHBvbGxpbmc7CisKKwlpb3YuaW92X2Jhc2UgPSAoY2hhciAqKXBhY2tldDsKKworCWZvciAoOzspIHsKKwkJLyogQ2hlY2sgZXhpdCBjb25kaXRpb25zLiAqLworCQlpZiAoZXhpdGluZykKKwkJCWJyZWFrOworCQlpZiAobnBhY2tldHMgJiYgbnJlY2VpdmVkICsgbmVycm9ycyA+PSBucGFja2V0cykKKwkJCWJyZWFrOworCQlpZiAoZGVhZGxpbmUgJiYgbmVycm9ycykKKwkJCWJyZWFrOworCQkvKiBDaGVjayBmb3IgYW5kIGRvIHNwZWNpYWwgYWN0aW9ucy4gKi8KKwkJaWYgKHN0YXR1c19zbmFwc2hvdCkKKwkJCXN0YXR1cygpOworCisJCS8qIFNlbmQgcHJvYmVzIHNjaGVkdWxlZCB0byB0aGlzIHRpbWUuICovCisJCWRvIHsKKwkJCW5leHQgPSBwaW5nZXIoKTsKKwkJCW5leHQgPSBzY2hlZHVsZV9leGl0KG5leHQpOworCQl9IHdoaWxlIChuZXh0IDw9IDApOworCisJCS8qICJuZXh0IiBpcyB0aW1lIHRvIHNlbmQgbmV4dCBwcm9iZSwgaWYgcG9zaXRpdmUuCisJCSAqIElmIG5leHQ8PTAgc2VuZCBub3cgb3IgYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KKworCQkvKiBUZWNobmljYWwgcGFydC4gTG9va3Mgd2lja2VkLiBDb3VsZCBiZSBkcm9wcGVkLAorCQkgKiBpZiBldmVyeW9uZSB1c2VkIHRoZSBuZXdlc3Qga2VybmVsLiA6LSkKKwkJICogSXRzIHB1cnBvc2UgaXM6CisJCSAqIDEuIFByb3ZpZGUgaW50ZXJ2YWxzIGxlc3MgdGhhbiByZXNvbHV0aW9uIG9mIHNjaGVkdWxlci4KKwkJICogICAgU29sdXRpb246IHNwaW5uaW5nLgorCQkgKiAyLiBBdm9pZCB1c2Ugb2YgcG9sbCgpLCB3aGVuIHJlY3Ztc2coKSBjYW4gcHJvdmlkZQorCQkgKiAgICB0aW1lZCB3YWl0aW5nIChTT19SQ1ZUSU1FTykuICovCisJCXBvbGxpbmcgPSAwOworCQlpZiAoKG9wdGlvbnMgJiAoRl9BREFQVElWRXxGX0ZMT09EX1BPTEwpKSB8fCBuZXh0PFNDSElOVChpbnRlcnZhbCkpIHsKKwkJCWludCByZWN2X2V4cGVjdGVkID0gaW5fZmxpZ2h0KCk7CisKKwkJCS8qIElmIHdlIGFyZSBoZXJlLCByZWN2bXNnKCkgaXMgdW5hYmxlIHRvIHdhaXQgZm9yCisJCQkgKiByZXF1aXJlZCB0aW1lb3V0LiAqLworCQkJaWYgKDEwMDAgJSBIWiA9PSAwID8gbmV4dCA8PSAxMDAwIC8gSFogOiAobmV4dCA8IElOVF9NQVggLyBIWiAmJiBuZXh0ICogSFogPD0gMTAwMCkpIHsKKwkJCQkvKiBWZXJ5IHNob3J0IHRpbWVvdXQuLi4gU28sIGlmIHdlIHdhaXQgZm9yCisJCQkJICogc29tZXRoaW5nLCB3ZSBzbGVlcCBmb3IgTUlOSU5URVJWQUwuCisJCQkJICogT3RoZXJ3aXNlLCBzcGluISAqLworCQkJCWlmIChyZWN2X2V4cGVjdGVkKSB7CisJCQkJCW5leHQgPSBNSU5JTlRFUlZBTDsKKwkJCQl9IGVsc2UgeworCQkJCQluZXh0ID0gMDsKKwkJCQkJLyogV2hlbiBzcGlubmluZywgbm8gcmVhc29ucyB0byBwb2xsLgorCQkJCQkgKiBVc2Ugbm9uYmxvY2tpbmcgcmVjdm1zZygpIGluc3RlYWQuICovCisJCQkJCXBvbGxpbmcgPSBNU0dfRE9OVFdBSVQ7CisJCQkJCS8qIEJ1dCB5aWVsZCB5ZXQuICovCisJCQkJCXNjaGVkX3lpZWxkKCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIXBvbGxpbmcgJiYKKwkJCSAgICAoKG9wdGlvbnMgJiAoRl9BREFQVElWRXxGX0ZMT09EX1BPTEwpKSB8fCBpbnRlcnZhbCkpIHsKKwkJCQlzdHJ1Y3QgcG9sbGZkIHBzZXQ7CisJCQkJcHNldC5mZCA9IGljbXBfc29jazsKKwkJCQlwc2V0LmV2ZW50cyA9IFBPTExJTnxQT0xMRVJSOworCQkJCXBzZXQucmV2ZW50cyA9IDA7CisJCQkJaWYgKHBvbGwoJnBzZXQsIDEsIG5leHQpIDwgMSB8fAorCQkJCSAgICAhKHBzZXQucmV2ZW50cyYoUE9MTElOfFBPTExFUlIpKSkKKwkJCQkJY29udGludWU7CisJCQkJcG9sbGluZyA9IE1TR19ET05UV0FJVDsKKwkJCX0KKwkJfQorCisJCWZvciAoOzspIHsKKwkJCXN0cnVjdCB0aW1ldmFsICpyZWN2X3RpbWVwID0gTlVMTDsKKwkJCXN0cnVjdCB0aW1ldmFsIHJlY3ZfdGltZTsKKwkJCWludCBub3Rfb3VycyA9IDA7IC8qIFJhdyBzb2NrZXQgY2FuIHJlY2VpdmUgbWVzc2FnZXMKKwkJCQkJICAgKiBkZXN0aW5lZCB0byBvdGhlciBydW5uaW5nIHBpbmdzLiAqLworCisJCQlpb3YuaW92X2xlbiA9IHBhY2tsZW47CisJCQltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCQkJbXNnLm1zZ19uYW1lID0gYWRkcmJ1ZjsKKwkJCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihhZGRyYnVmKTsKKwkJCW1zZy5tc2dfaW92ID0gJmlvdjsKKwkJCW1zZy5tc2dfaW92bGVuID0gMTsKKwkJCW1zZy5tc2dfY29udHJvbCA9IGFuc19kYXRhOworCQkJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGFuc19kYXRhKTsKKworCQkJY2MgPSByZWN2bXNnKGljbXBfc29jaywgJm1zZywgcG9sbGluZyk7CisJCQlwb2xsaW5nID0gTVNHX0RPTlRXQUlUOworCisJCQlpZiAoY2MgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCFyZWNlaXZlX2Vycm9yX21zZygpKSB7CisJCQkJCWlmIChlcnJubykgeworCQkJCQkJcGVycm9yKCJwaW5nOiByZWN2bXNnIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlub3Rfb3VycyA9IDE7CisJCQkJfQorCQkJfSBlbHNlIHsKKworI2lmZGVmIFNPX1RJTUVTVEFNUAorCQkJCWZvciAoYyA9IENNU0dfRklSU1RIRFIoJm1zZyk7IGM7IGMgPSBDTVNHX05YVEhEUigmbXNnLCBjKSkgeworCQkJCQlpZiAoYy0+Y21zZ19sZXZlbCAhPSBTT0xfU09DS0VUIHx8CisJCQkJCSAgICBjLT5jbXNnX3R5cGUgIT0gU09fVElNRVNUQU1QKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChjLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpKQorCQkJCQkJY29udGludWU7CisJCQkJCXJlY3ZfdGltZXAgPSAoc3RydWN0IHRpbWV2YWwqKUNNU0dfREFUQShjKTsKKwkJCQl9CisjZW5kaWYKKworCQkJCWlmICgob3B0aW9ucyZGX0xBVEVOQ1kpIHx8IHJlY3ZfdGltZXAgPT0gTlVMTCkgeworCQkJCQlpZiAoKG9wdGlvbnMmRl9MQVRFTkNZKSB8fAorCQkJCQkgICAgaW9jdGwoaWNtcF9zb2NrLCBTSU9DR1NUQU1QLCAmcmVjdl90aW1lKSkKKwkJCQkJCWdldHRpbWVvZmRheSgmcmVjdl90aW1lLCBOVUxMKTsKKwkJCQkJcmVjdl90aW1lcCA9ICZyZWN2X3RpbWU7CisJCQkJfQorCisJCQkJbm90X291cnMgPSBwYXJzZV9yZXBseSgmbXNnLCBjYywgYWRkcmJ1ZiwgcmVjdl90aW1lcCk7CisJCQl9CisKKwkJCS8qIFNlZT8gLi4uIHNvbWVvbmUgcnVucyBhbm90aGVyIHBpbmcgb24gdGhpcyBob3N0LiAqLworCQkJaWYgKG5vdF9vdXJzICYmICF1c2luZ19waW5nX3NvY2tldCkKKwkJCQlpbnN0YWxsX2ZpbHRlcigpOworCisJCQkvKiBJZiBub3RoaW5nIGlzIGluIGZsaWdodCwgImJyZWFrIiByZXR1cm5zIHVzIHRvIHBpbmdlci4gKi8KKwkJCWlmIChpbl9mbGlnaHQoKSA9PSAwKQorCQkJCWJyZWFrOworCisJCQkvKiBPdGhlcndpc2UsIHRyeSB0byByZWN2bXNnKCkgYWdhaW4uIHJlY3Ztc2coKQorCQkJICogaXMgbm9uYmxvY2tpbmcgYWZ0ZXIgdGhlIGZpcnN0IGl0ZXJhdGlvbiwgc28gdGhhdAorCQkJICogaWYgbm90aGluZyBpcyBxdWV1ZWQsIGl0IHdpbGwgcmVjZWl2ZSBFQUdBSU4KKwkJCSAqIGFuZCByZXR1cm4gdG8gcGluZ2VyLiAqLworCQl9CisJfQorCWZpbmlzaCgpOworfQorCitpbnQgZ2F0aGVyX3N0YXRpc3RpY3MoX191OCAqaWNtcGgsIGludCBpY21wbGVuLAorCQkgICAgICBpbnQgY2MsIF9fdTE2IHNlcSwgaW50IGhvcHMsCisJCSAgICAgIGludCBjc2ZhaWxlZCwgc3RydWN0IHRpbWV2YWwgKnR2LCBjaGFyICpmcm9tLAorCQkgICAgICB2b2lkICgqcHJfcmVwbHkpKF9fdTggKmljbXBoLCBpbnQgY2MpKQoreworCWludCBkdXBmbGFnID0gMDsKKwlsb25nIHRyaXB0aW1lID0gMDsKKwlfX3U4ICpwdHIgPSBpY21waCArIGljbXBsZW47CisKKwkrK25yZWNlaXZlZDsKKwlpZiAoIWNzZmFpbGVkKQorCQlhY2tub3dsZWRnZShzZXEpOworCisJaWYgKHRpbWluZyAmJiBjYyA+PSA4K3NpemVvZihzdHJ1Y3QgdGltZXZhbCkpIHsKKwkJc3RydWN0IHRpbWV2YWwgdG1wX3R2OworCQltZW1jcHkoJnRtcF90diwgcHRyLCBzaXplb2YodG1wX3R2KSk7CisKK3Jlc3RhbXA6CisJCXR2c3ViKHR2LCAmdG1wX3R2KTsKKwkJdHJpcHRpbWUgPSB0di0+dHZfc2VjICogMTAwMDAwMCArIHR2LT50dl91c2VjOworCQlpZiAodHJpcHRpbWUgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHRpbWUgb2YgZGF5IGdvZXMgYmFjayAoJWxkdXMpLCB0YWtpbmcgY291bnRlcm1lYXN1cmVzLlxuIiwgdHJpcHRpbWUpOworCQkJdHJpcHRpbWUgPSAwOworCQkJaWYgKCEob3B0aW9ucyAmIEZfTEFURU5DWSkpIHsKKwkJCQlnZXR0aW1lb2ZkYXkodHYsIE5VTEwpOworCQkJCW9wdGlvbnMgfD0gRl9MQVRFTkNZOworCQkJCWdvdG8gcmVzdGFtcDsKKwkJCX0KKwkJfQorCQlpZiAoIWNzZmFpbGVkKSB7CisJCQl0c3VtICs9IHRyaXB0aW1lOworCQkJdHN1bTIgKz0gKGxvbmcgbG9uZyl0cmlwdGltZSAqIChsb25nIGxvbmcpdHJpcHRpbWU7CisJCQlpZiAodHJpcHRpbWUgPCB0bWluKQorCQkJCXRtaW4gPSB0cmlwdGltZTsKKwkJCWlmICh0cmlwdGltZSA+IHRtYXgpCisJCQkJdG1heCA9IHRyaXB0aW1lOworCQkJaWYgKCFydHQpCisJCQkJcnR0ID0gdHJpcHRpbWUqODsKKwkJCWVsc2UKKwkJCQlydHQgKz0gdHJpcHRpbWUtcnR0Lzg7CisJCQlpZiAob3B0aW9ucyZGX0FEQVBUSVZFKQorCQkJCXVwZGF0ZV9pbnRlcnZhbCgpOworCQl9CisJfQorCisJaWYgKGNzZmFpbGVkKSB7CisJCSsrbmNoZWNrc3VtOworCQktLW5yZWNlaXZlZDsKKwl9IGVsc2UgaWYgKHJjdmRfdGVzdChzZXEpKSB7CisJCSsrbnJlcGVhdHM7CisJCS0tbnJlY2VpdmVkOworCQlkdXBmbGFnID0gMTsKKwl9IGVsc2UgeworCQlyY3ZkX3NldChzZXEpOworCQlkdXBmbGFnID0gMDsKKwl9CisJY29uZmlybSA9IGNvbmZpcm1fZmxhZzsKKworCWlmIChvcHRpb25zICYgRl9RVUlFVCkKKwkJcmV0dXJuIDE7CisKKwlpZiAob3B0aW9ucyAmIEZfRkxPT0QpIHsKKwkJaWYgKCFjc2ZhaWxlZCkKKwkJCXdyaXRlX3N0ZG91dCgiXGIgXGIiLCAzKTsKKwkJZWxzZQorCQkJd3JpdGVfc3Rkb3V0KCJcYkMiLCAyKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKwkJX191OCAqY3AsICpkcDsKKworCQlwcmludF90aW1lc3RhbXAoKTsKKwkJcHJpbnRmKCIlZCBieXRlcyBmcm9tICVzOiIsIGNjLCBmcm9tKTsKKworCQlpZiAocHJfcmVwbHkpCisJCQlwcl9yZXBseShpY21waCwgY2MpOworCisJCWlmIChob3BzID49IDApCisJCQlwcmludGYoIiB0dGw9JWQiLCBob3BzKTsKKworCQlpZiAoY2MgPCBkYXRhbGVuKzgpIHsKKwkJCXByaW50ZigiICh0cnVuY2F0ZWQpXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICh0aW1pbmcpIHsKKwkJCWlmICh0cmlwdGltZSA+PSAxMDAwMDApCisJCQkJcHJpbnRmKCIgdGltZT0lbGQgbXMiLCB0cmlwdGltZS8xMDAwKTsKKwkJCWVsc2UgaWYgKHRyaXB0aW1lID49IDEwMDAwKQorCQkJCXByaW50ZigiIHRpbWU9JWxkLiUwMWxkIG1zIiwgdHJpcHRpbWUvMTAwMCwKKwkJCQkgICAgICAgKHRyaXB0aW1lJTEwMDApLzEwMCk7CisJCQllbHNlIGlmICh0cmlwdGltZSA+PSAxMDAwKQorCQkJCXByaW50ZigiIHRpbWU9JWxkLiUwMmxkIG1zIiwgdHJpcHRpbWUvMTAwMCwKKwkJCQkgICAgICAgKHRyaXB0aW1lJTEwMDApLzEwKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiB0aW1lPSVsZC4lMDNsZCBtcyIsIHRyaXB0aW1lLzEwMDAsCisJCQkJICAgICAgIHRyaXB0aW1lJTEwMDApOworCQl9CisJCWlmIChkdXBmbGFnKQorCQkJcHJpbnRmKCIgKERVUCEpIik7CisJCWlmIChjc2ZhaWxlZCkKKwkJCXByaW50ZigiIChCQUQgQ0hFQ0tTVU0hKSIpOworCisJCS8qIGNoZWNrIHRoZSBkYXRhICovCisJCWNwID0gKCh1X2NoYXIqKXB0cikgKyBzaXplb2Yoc3RydWN0IHRpbWV2YWwpOworCQlkcCA9ICZvdXRwYWNrWzggKyBzaXplb2Yoc3RydWN0IHRpbWV2YWwpXTsKKwkJZm9yIChpID0gc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKTsgaSA8IGRhdGFsZW47ICsraSwgKytjcCwgKytkcCkgeworCQkJaWYgKCpjcCAhPSAqZHApIHsKKwkJCQlwcmludGYoIlxud3JvbmcgZGF0YSBieXRlICMlZCBzaG91bGQgYmUgMHgleCBidXQgd2FzIDB4JXgiLAorCQkJCSAgICAgICBpLCAqZHAsICpjcCk7CisJCQkJY3AgPSAodV9jaGFyKilwdHIgKyBzaXplb2Yoc3RydWN0IHRpbWV2YWwpOworCQkJCWZvciAoaSA9IHNpemVvZihzdHJ1Y3QgdGltZXZhbCk7IGkgPCBkYXRhbGVuOyArK2ksICsrY3ApIHsKKwkJCQkJaWYgKChpICUgMzIpID09IHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpCisJCQkJCQlwcmludGYoIlxuIyVkXHQiLCBpKTsKKwkJCQkJcHJpbnRmKCIleCAiLCAqY3ApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgbGxzcXJ0KGxvbmcgbG9uZyBhKQoreworCWxvbmcgbG9uZyBwcmV2ID0gfigobG9uZyBsb25nKTEgPDwgNjMpOworCWxvbmcgbG9uZyB4ID0gYTsKKworCWlmICh4ID4gMCkgeworCQl3aGlsZSAoeCA8IHByZXYpIHsKKwkJCXByZXYgPSB4OworCQkJeCA9ICh4KyhhL3gpKS8yOworCQl9CisJfQorCisJcmV0dXJuIChsb25nKXg7Cit9CisKKy8qCisgKiBmaW5pc2ggLS0KKyAqCVByaW50IG91dCBzdGF0aXN0aWNzLCBhbmQgZ2l2ZSB1cC4KKyAqLwordm9pZCBmaW5pc2godm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0diA9IGN1cl90aW1lOworCWNoYXIgKmNvbW1hID0gIiI7CisKKwl0dnN1YigmdHYsICZzdGFydF90aW1lKTsKKworCXB1dGNoYXIoJ1xuJyk7CisJZmZsdXNoKHN0ZG91dCk7CisJcHJpbnRmKCItLS0gJXMgcGluZyBzdGF0aXN0aWNzIC0tLVxuIiwgaG9zdG5hbWUpOworCXByaW50ZigiJWxkIHBhY2tldHMgdHJhbnNtaXR0ZWQsICIsIG50cmFuc21pdHRlZCk7CisJcHJpbnRmKCIlbGQgcmVjZWl2ZWQiLCBucmVjZWl2ZWQpOworCWlmIChucmVwZWF0cykKKwkJcHJpbnRmKCIsICslbGQgZHVwbGljYXRlcyIsIG5yZXBlYXRzKTsKKwlpZiAobmNoZWNrc3VtKQorCQlwcmludGYoIiwgKyVsZCBjb3JydXB0ZWQiLCBuY2hlY2tzdW0pOworCWlmIChuZXJyb3JzKQorCQlwcmludGYoIiwgKyVsZCBlcnJvcnMiLCBuZXJyb3JzKTsKKwlpZiAobnRyYW5zbWl0dGVkKSB7CisJCXByaW50ZigiLCAlZCUlIHBhY2tldCBsb3NzIiwKKwkJICAgICAgIChpbnQpICgoKChsb25nIGxvbmcpKG50cmFuc21pdHRlZCAtIG5yZWNlaXZlZCkpICogMTAwKSAvCisJCQkgICAgICBudHJhbnNtaXR0ZWQpKTsKKwkJcHJpbnRmKCIsIHRpbWUgJWxkbXMiLCAxMDAwKnR2LnR2X3NlYyt0di50dl91c2VjLzEwMDApOworCX0KKwlwdXRjaGFyKCdcbicpOworCisJaWYgKG5yZWNlaXZlZCAmJiB0aW1pbmcpIHsKKwkJbG9uZyB0bWRldjsKKworCQl0c3VtIC89IG5yZWNlaXZlZCArIG5yZXBlYXRzOworCQl0c3VtMiAvPSBucmVjZWl2ZWQgKyBucmVwZWF0czsKKwkJdG1kZXYgPSBsbHNxcnQodHN1bTIgLSB0c3VtICogdHN1bSk7CisKKwkJcHJpbnRmKCJydHQgbWluL2F2Zy9tYXgvbWRldiA9ICVsZC4lMDNsZC8lbHUuJTAzbGQvJWxkLiUwM2xkLyVsZC4lMDNsZCBtcyIsCisJCSAgICAgICAobG9uZyl0bWluLzEwMDAsIChsb25nKXRtaW4lMTAwMCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSh0c3VtLzEwMDApLCAobG9uZykodHN1bSUxMDAwKSwKKwkJICAgICAgIChsb25nKXRtYXgvMTAwMCwgKGxvbmcpdG1heCUxMDAwLAorCQkgICAgICAgKGxvbmcpdG1kZXYvMTAwMCwgKGxvbmcpdG1kZXYlMTAwMAorCQkgICAgICAgKTsKKwkJY29tbWEgPSAiLCAiOworCX0KKwlpZiAocGlwZXNpemUgPiAxKSB7CisJCXByaW50ZigiJXNwaXBlICVkIiwgY29tbWEsIHBpcGVzaXplKTsKKwkJY29tbWEgPSAiLCAiOworCX0KKwlpZiAobnJlY2VpdmVkICYmICghaW50ZXJ2YWwgfHwgKG9wdGlvbnMmKEZfRkxPT0R8Rl9BREFQVElWRSkpKSAmJiBudHJhbnNtaXR0ZWQgPiAxKSB7CisJCWludCBpcGcgPSAoMTAwMDAwMCoobG9uZyBsb25nKXR2LnR2X3NlYyt0di50dl91c2VjKS8obnRyYW5zbWl0dGVkLTEpOworCQlwcmludGYoIiVzaXBnL2V3bWEgJWQuJTAzZC8lZC4lMDNkIG1zIiwKKwkJICAgICAgIGNvbW1hLCBpcGcvMTAwMCwgaXBnJTEwMDAsIHJ0dC84MDAwLCAocnR0LzgpJTEwMDApOworCX0KKwlwdXRjaGFyKCdcbicpOworCWV4aXQoIW5yZWNlaXZlZCB8fCAoZGVhZGxpbmUgJiYgbnJlY2VpdmVkIDwgbnBhY2tldHMpKTsKK30KKworCit2b2lkIHN0YXR1cyh2b2lkKQoreworCWludCBsb3NzID0gMDsKKwlsb25nIHRhdmcgPSAwOworCisJc3RhdHVzX3NuYXBzaG90ID0gMDsKKworCWlmIChudHJhbnNtaXR0ZWQpCisJCWxvc3MgPSAoKChsb25nIGxvbmcpKG50cmFuc21pdHRlZCAtIG5yZWNlaXZlZCkpICogMTAwKSAvIG50cmFuc21pdHRlZDsKKworCWZwcmludGYoc3RkZXJyLCAiXHIlbGQvJWxkIHBhY2tldHMsICVkJSUgbG9zcyIsIG50cmFuc21pdHRlZCwgbnJlY2VpdmVkLCBsb3NzKTsKKworCWlmIChucmVjZWl2ZWQgJiYgdGltaW5nKSB7CisJCXRhdmcgPSB0c3VtIC8gKG5yZWNlaXZlZCArIG5yZXBlYXRzKTsKKworCQlmcHJpbnRmKHN0ZGVyciwgIiwgbWluL2F2Zy9ld21hL21heCA9ICVsZC4lMDNsZC8lbHUuJTAzbGQvJWQuJTAzZC8lbGQuJTAzbGQgbXMiLAorCQkgICAgICAgKGxvbmcpdG1pbi8xMDAwLCAobG9uZyl0bWluJTEwMDAsCisJCSAgICAgICB0YXZnLzEwMDAsIHRhdmclMTAwMCwKKwkJICAgICAgIHJ0dC84MDAwLCAocnR0LzgpJTEwMDAsCisJCSAgICAgICAobG9uZyl0bWF4LzEwMDAsIChsb25nKXRtYXglMTAwMAorCQkgICAgICAgKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCitpbmxpbmUgaW50IGlzX291cnModWludDE2X3QgaWQpIHsKKwlyZXR1cm4gdXNpbmdfcGluZ19zb2NrZXQgfHwgaWQgPT0gaWRlbnQ7Cit9CisKZGlmZiAtLWdpdCBhL2lwdXRpbHMvcGluZ19jb21tb24uaCBiL2lwdXRpbHMvcGluZ19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU4NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9waW5nX2NvbW1vbi5oCkBAIC0wLDAgKzEsMjk3IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorCisjaWZkZWYgQ0FQQUJJTElUSUVTCisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL2NhcGFiaWxpdHkuaD4KKyNlbmRpZgorCisjaWZkZWYgVVNFX0lETgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPGlkbmEuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KKworI2lmZGVmIEFORFJPSUQKKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8c3lzL2F1eHYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU05BUFNIT1QuaCIKKworI2RlZmluZQlERUZEQVRBTEVOCSg2NCAtIDgpCS8qIGRlZmF1bHQgZGF0YSBsZW5ndGggKi8KKworI2RlZmluZQlNQVhXQUlUCQkxMAkJLyogbWF4IHNlY29uZHMgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKi8KKyNkZWZpbmUgTUlOSU5URVJWQUwJMTAJCS8qIE1pbmltYWwgaW50ZXJwYWNrZXQgZ2FwICovCisjZGVmaW5lIE1JTlVTRVJJTlRFUlZBTAkyMDAJCS8qIE1pbmltYWwgYWxsb3dlZCBpbnRlcnZhbCBmb3Igbm9uLXJvb3QgKi8KKworI2RlZmluZSBTQ0hJTlQoYSkJKCgoYSkgPD0gTUlOSU5URVJWQUwpID8gTUlOSU5URVJWQUwgOiAoYSkpCisKKy8qIHZhcmlvdXMgb3B0aW9ucyAqLworZXh0ZXJuIGludCBvcHRpb25zOworI2RlZmluZQlGX0ZMT09ECQkweDAwMQorI2RlZmluZQlGX0lOVEVSVkFMCTB4MDAyCisjZGVmaW5lCUZfTlVNRVJJQwkweDAwNAorI2RlZmluZQlGX1BJTkdGSUxMRUQJMHgwMDgKKyNkZWZpbmUJRl9RVUlFVAkJMHgwMTAKKyNkZWZpbmUJRl9SUk9VVEUJMHgwMjAKKyNkZWZpbmUJRl9TT19ERUJVRwkweDA0MAorI2RlZmluZQlGX1NPX0RPTlRST1VURQkweDA4MAorI2RlZmluZQlGX1ZFUkJPU0UJMHgxMDAKKyNkZWZpbmUJRl9USU1FU1RBTVAJMHgyMDAKKyNkZWZpbmUJRl9GTE9XSU5GTwkweDIwMAorI2RlZmluZQlGX1NPVVJDRVJPVVRFCTB4NDAwCisjZGVmaW5lCUZfVENMQVNTCTB4NDAwCisjZGVmaW5lCUZfRkxPT0RfUE9MTAkweDgwMAorI2RlZmluZQlGX0xBVEVOQ1kJMHgxMDAwCisjZGVmaW5lCUZfQVVESUJMRQkweDIwMDAKKyNkZWZpbmUJRl9BREFQVElWRQkweDQwMDAKKyNkZWZpbmUJRl9TVFJJQ1RTT1VSQ0UJMHg4MDAwCisjZGVmaW5lIEZfTk9MT09QCTB4MTAwMDAKKyNkZWZpbmUgRl9UVEwJCTB4MjAwMDAKKyNkZWZpbmUgRl9NQVJLCQkweDQwMDAwCisjZGVmaW5lIEZfUFRJTUVPRkRBWQkweDgwMDAwCisjZGVmaW5lIEZfT1VUU1RBTkRJTkcJMHgxMDAwMDAKKworLyoKKyAqIE1BWF9EVVBfQ0hLIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiByZWNlaXZlZCB0YWJsZSwgaS5lLiB0aGUgbWF4aW11bQorICogbnVtYmVyIG9mIHJlY2VpdmVkIHNlcXVlbmNlIG51bWJlcnMgd2UgY2FuIGtlZXAgdHJhY2sgb2YuCisgKi8KKyNkZWZpbmUJTUFYX0RVUF9DSEsJMHgxMDAwMAorCisjaWYgZGVmaW5lZChfX1dPUkRTSVpFKSAmJiBfX1dPUkRTSVpFID09IDY0CisjIGRlZmluZSBVU0VfQklUTUFQNjQKKyNlbmRpZgorCisjaWZkZWYgVVNFX0JJVE1BUDY0Cit0eXBlZGVmIF9fdTY0CWJpdG1hcF90OworIyBkZWZpbmUgQklUTUFQX1NISUZUCTYKKyNlbHNlCit0eXBlZGVmIF9fdTMyCWJpdG1hcF90OworIyBkZWZpbmUgQklUTUFQX1NISUZUCTUKKyNlbmRpZgorCisjaWYgKChNQVhfRFVQX0NISyA+PiAoQklUTUFQX1NISUZUICsgMykpIDw8IChCSVRNQVBfU0hJRlQgKyAzKSkgIT0gTUFYX0RVUF9DSEsKKyMgZXJyb3IgUGxlYXNlIE1BWF9EVVBfQ0hLIGFuZC9vciBCSVRNQVBfU0hJRlQKKyNlbmRpZgorCitzdHJ1Y3QgcmN2ZF90YWJsZSB7CisJYml0bWFwX3QgYml0bWFwW01BWF9EVVBfQ0hLIC8gKHNpemVvZihiaXRtYXBfdCkgKiA4KV07Cit9OworCitleHRlcm4gc3RydWN0IHJjdmRfdGFibGUgcmN2ZF90Ymw7CitleHRlcm4gaW50IHVzaW5nX3Bpbmdfc29ja2V0OworCisjZGVmaW5lCUEoYml0KQkocmN2ZF90YmwuYml0bWFwWyhiaXQpID4+IEJJVE1BUF9TSElGVF0pCS8qIGlkZW50aWZ5IHdvcmQgaW4gYXJyYXkgKi8KKyNkZWZpbmUJQihiaXQpCSgoKGJpdG1hcF90KTEpIDw8ICgoYml0KSAmICgoMSA8PCBCSVRNQVBfU0hJRlQpIC0gMSkpKQkvKiBpZGVudGlmeSBiaXQgaW4gd29yZCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcmN2ZF9zZXQoX191MTYgc2VxKQoreworCXVuc2lnbmVkIGJpdCA9IHNlcSAlIE1BWF9EVVBfQ0hLOworCUEoYml0KSB8PSBCKGJpdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY3ZkX2NsZWFyKF9fdTE2IHNlcSkKK3sKKwl1bnNpZ25lZCBiaXQgPSBzZXEgJSBNQVhfRFVQX0NISzsKKwlBKGJpdCkgJj0gfkIoYml0KTsKK30KKworc3RhdGljIGlubGluZSBiaXRtYXBfdCByY3ZkX3Rlc3QoX191MTYgc2VxKQoreworCXVuc2lnbmVkIGJpdCA9IHNlcSAlIE1BWF9EVVBfQ0hLOworCXJldHVybiBBKGJpdCkgJiBCKGJpdCk7Cit9CisKK2V4dGVybiB1X2NoYXIgb3V0cGFja1tdOworZXh0ZXJuIGludCBtYXhwYWNrZXQ7CisKK2V4dGVybiBpbnQgZGF0YWxlbjsKK2V4dGVybiBjaGFyICpob3N0bmFtZTsKK2V4dGVybiBpbnQgdWlkOworZXh0ZXJuIGludCBpZGVudDsJCQkvKiBwcm9jZXNzIGlkIHRvIGlkZW50aWZ5IG91ciBwYWNrZXRzICovCisKK2V4dGVybiBpbnQgc25kYnVmOworZXh0ZXJuIGludCB0dGw7CisKK2V4dGVybiBsb25nIG5wYWNrZXRzOwkJCS8qIG1heCBwYWNrZXRzIHRvIHRyYW5zbWl0ICovCitleHRlcm4gbG9uZyBucmVjZWl2ZWQ7CQkJLyogIyBvZiBwYWNrZXRzIHdlIGdvdCBiYWNrICovCitleHRlcm4gbG9uZyBucmVwZWF0czsJCQkvKiBudW1iZXIgb2YgZHVwbGljYXRlcyAqLworZXh0ZXJuIGxvbmcgbnRyYW5zbWl0dGVkOwkJLyogc2VxdWVuY2UgIyBmb3Igb3V0Ym91bmQgcGFja2V0cyA9ICNzZW50ICovCitleHRlcm4gbG9uZyBuY2hlY2tzdW07CQkJLyogcmVwbGllcyB3aXRoIGJhZCBjaGVja3N1bSAqLworZXh0ZXJuIGxvbmcgbmVycm9yczsJCQkvKiBpY21wIGVycm9ycyAqLworZXh0ZXJuIGludCBpbnRlcnZhbDsJCQkvKiBpbnRlcnZhbCBiZXR3ZWVuIHBhY2tldHMgKG1zZWMpICovCitleHRlcm4gaW50IHByZWxvYWQ7CitleHRlcm4gaW50IGRlYWRsaW5lOwkJCS8qIHRpbWUgdG8gZGllICovCitleHRlcm4gaW50IGxpbmdlcnRpbWU7CitleHRlcm4gc3RydWN0IHRpbWV2YWwgc3RhcnRfdGltZSwgY3VyX3RpbWU7CitleHRlcm4gdm9sYXRpbGUgaW50IGV4aXRpbmc7CitleHRlcm4gdm9sYXRpbGUgaW50IHN0YXR1c19zbmFwc2hvdDsKK2V4dGVybiBpbnQgY29uZmlybTsKK2V4dGVybiBpbnQgY29uZmlybV9mbGFnOworZXh0ZXJuIGludCB3b3JraW5nX3JlY3ZlcnI7CisKK2V4dGVybiB2b2xhdGlsZSBpbnQgaW5fcHJfYWRkcjsJCS8qIHByX2FkZHIoKSBpcyBleGVjdXRpbmcgKi8KK2V4dGVybiBqbXBfYnVmIHByX2FkZHJfam1wOworCisjaWZuZGVmIE1TR19DT05GSVJNCisjZGVmaW5lIE1TR19DT05GSVJNIDAKKyNlbmRpZgorCisKKy8qIHRpbWluZyAqLworZXh0ZXJuIGludCB0aW1pbmc7CQkJLyogZmxhZyB0byBkbyB0aW1pbmcgKi8KK2V4dGVybiBsb25nIHRtaW47CQkJLyogbWluaW11bSByb3VuZCB0cmlwIHRpbWUgKi8KK2V4dGVybiBsb25nIHRtYXg7CQkJLyogbWF4aW11bSByb3VuZCB0cmlwIHRpbWUgKi8KK2V4dGVybiBsb25nIGxvbmcgdHN1bTsJCQkvKiBzdW0gb2YgYWxsIHRpbWVzLCBmb3IgZG9pbmcgYXZlcmFnZSAqLworZXh0ZXJuIGxvbmcgbG9uZyB0c3VtMjsKK2V4dGVybiBpbnQgcnR0OworZXh0ZXJuIF9fdTE2IGFja2VkOworZXh0ZXJuIGludCBwaXBlc2l6ZTsKKworI2RlZmluZSBDT01NT05fT1BUSU9OUyBcCitjYXNlICdhJzogY2FzZSAnVSc6IGNhc2UgJ2MnOiBjYXNlICdkJzogXAorY2FzZSAnZic6IGNhc2UgJ2knOiBjYXNlICd3JzogY2FzZSAnbCc6IFwKK2Nhc2UgJ1MnOiBjYXNlICduJzogY2FzZSAncCc6IGNhc2UgJ3EnOiBcCitjYXNlICdyJzogY2FzZSAncyc6IGNhc2UgJ3YnOiBjYXNlICdMJzogXAorY2FzZSAndCc6IGNhc2UgJ0EnOiBjYXNlICdXJzogY2FzZSAnQic6IGNhc2UgJ20nOiBcCitjYXNlICdEJzogY2FzZSAnTyc6CisKKyNkZWZpbmUgQ09NTU9OX09QVFNUUiAiaD9WUTpJOk06YVVjOmRmaTp3Omw6UzpucDpxcnM6dkx0OkFXOkJtOkRPIgorCisvKgorICogV3JpdGUgdG8gc3Rkb3V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zdGRvdXQoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBvID0gMDsKKwlzc2l6ZV90IGNjOworCWRvIHsKKwkJY2MgPSB3cml0ZShTVERPVVRfRklMRU5PLCBzdHIgKyBvLCBsZW4gLSBvKTsKKwkJbyArPSBjYzsKKwl9IHdoaWxlIChsZW4gPiBvIHx8IGNjIDwgMCk7Cit9CisKKy8qCisgKiB0dnN1YiAtLQorICoJU3VidHJhY3QgMiB0aW1ldmFsIHN0cnVjdHM6ICBvdXQgPSBvdXQgLSBpbi4gIE91dCBpcyBhc3N1bWVkIHRvCisgKiBiZSA+PSBpbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHR2c3ViKHN0cnVjdCB0aW1ldmFsICpvdXQsIHN0cnVjdCB0aW1ldmFsICppbikKK3sKKwlpZiAoKG91dC0+dHZfdXNlYyAtPSBpbi0+dHZfdXNlYykgPCAwKSB7CisJCS0tb3V0LT50dl9zZWM7CisJCW91dC0+dHZfdXNlYyArPSAxMDAwMDAwOworCX0KKwlvdXQtPnR2X3NlYyAtPSBpbi0+dHZfc2VjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NpZ25hbChpbnQgc2lnbm8sIHZvaWQgKCpoYW5kbGVyKShpbnQpKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKworCXNhLnNhX2hhbmRsZXIgPSAodm9pZCAoKikoaW50KSloYW5kbGVyOworI2lmZGVmIFNBX0lOVEVSUlVQVAorCXNhLnNhX2ZsYWdzID0gU0FfSU5URVJSVVBUOworI2VuZGlmCisJc2lnYWN0aW9uKHNpZ25vLCAmc2EsIE5VTEwpOworfQorCitleHRlcm4gaW50IF9fc2NoZWR1bGVfZXhpdChpbnQgbmV4dCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNjaGVkdWxlX2V4aXQoaW50IG5leHQpCit7CisJaWYgKG5wYWNrZXRzICYmIG50cmFuc21pdHRlZCA+PSBucGFja2V0cyAmJiAhZGVhZGxpbmUpCisJCW5leHQgPSBfX3NjaGVkdWxlX2V4aXQobmV4dCk7CisJcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGluX2ZsaWdodCh2b2lkKQoreworCV9fdTE2IGRpZmYgPSAoX191MTYpbnRyYW5zbWl0dGVkIC0gYWNrZWQ7CisJcmV0dXJuIChkaWZmPD0weDdGRkYpID8gZGlmZiA6IG50cmFuc21pdHRlZC1ucmVjZWl2ZWQtbmVycm9yczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFja25vd2xlZGdlKF9fdTE2IHNlcSkKK3sKKwlfX3UxNiBkaWZmID0gKF9fdTE2KW50cmFuc21pdHRlZCAtIHNlcTsKKwlpZiAoZGlmZiA8PSAweDdGRkYpIHsKKwkJaWYgKChpbnQpZGlmZisxID4gcGlwZXNpemUpCisJCQlwaXBlc2l6ZSA9IChpbnQpZGlmZisxOworCQlpZiAoKF9fczE2KShzZXEgLSBhY2tlZCkgPiAwIHx8CisJCSAgICAoX191MTYpbnRyYW5zbWl0dGVkIC0gYWNrZWQgPiAweDdGRkYpCisJCQlhY2tlZCA9IHNlcTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZHZhbmNlX250cmFuc21pdHRlZCh2b2lkKQoreworCW50cmFuc21pdHRlZCsrOworCS8qIEludmFsaWRhdGUgYWNrZWQsIGlmIDE2IGJpdCBzZXEgb3ZlcmZsb3dzLiAqLworCWlmICgoX191MTYpbnRyYW5zbWl0dGVkIC0gYWNrZWQgPiAweDdGRkYpCisJCWFja2VkID0gKF9fdTE2KW50cmFuc21pdHRlZCArIDE7Cit9CisKK2V4dGVybiB2b2lkIGxpbWl0X2NhcGFiaWxpdGllcyh2b2lkKTsKK3N0YXRpYyBpbnQgZW5hYmxlX2NhcGFiaWxpdHlfcmF3KHZvaWQpOworc3RhdGljIGludCBkaXNhYmxlX2NhcGFiaWxpdHlfcmF3KHZvaWQpOworc3RhdGljIGludCBlbmFibGVfY2FwYWJpbGl0eV9hZG1pbih2b2lkKTsKK3N0YXRpYyBpbnQgZGlzYWJsZV9jYXBhYmlsaXR5X2FkbWluKHZvaWQpOworI2lmZGVmIENBUEFCSUxJVElFUworZXh0ZXJuIGludCBtb2RpZnlfY2FwYWJpbGl0eShjYXBfdmFsdWVfdCwgY2FwX2ZsYWdfdmFsdWVfdCk7CitzdGF0aWMgaW5saW5lIGludCBlbmFibGVfY2FwYWJpbGl0eV9yYXcodm9pZCkJCXsgcmV0dXJuIG1vZGlmeV9jYXBhYmlsaXR5KENBUF9ORVRfUkFXLCAgIENBUF9TRVQpOyAgIH07CitzdGF0aWMgaW5saW5lIGludCBkaXNhYmxlX2NhcGFiaWxpdHlfcmF3KHZvaWQpCQl7IHJldHVybiBtb2RpZnlfY2FwYWJpbGl0eShDQVBfTkVUX1JBVywgICBDQVBfQ0xFQVIpOyB9Oworc3RhdGljIGlubGluZSBpbnQgZW5hYmxlX2NhcGFiaWxpdHlfYWRtaW4odm9pZCkJCXsgcmV0dXJuIG1vZGlmeV9jYXBhYmlsaXR5KENBUF9ORVRfQURNSU4sIENBUF9TRVQpOyAgIH07CitzdGF0aWMgaW5saW5lIGludCBkaXNhYmxlX2NhcGFiaWxpdHlfYWRtaW4odm9pZCkJeyByZXR1cm4gbW9kaWZ5X2NhcGFiaWxpdHkoQ0FQX05FVF9BRE1JTiwgQ0FQX0NMRUFSKTsgfTsKKyNlbHNlCitleHRlcm4gaW50IG1vZGlmeV9jYXBhYmlsaXR5KGludCk7CitzdGF0aWMgaW5saW5lIGludCBlbmFibGVfY2FwYWJpbGl0eV9yYXcodm9pZCkJCXsgcmV0dXJuIG1vZGlmeV9jYXBhYmlsaXR5KDEpOyB9Oworc3RhdGljIGlubGluZSBpbnQgZGlzYWJsZV9jYXBhYmlsaXR5X3Jhdyh2b2lkKQkJeyByZXR1cm4gbW9kaWZ5X2NhcGFiaWxpdHkoMCk7IH07CitzdGF0aWMgaW5saW5lIGludCBlbmFibGVfY2FwYWJpbGl0eV9hZG1pbih2b2lkKQkJeyByZXR1cm4gbW9kaWZ5X2NhcGFiaWxpdHkoMSk7IH07CitzdGF0aWMgaW5saW5lIGludCBkaXNhYmxlX2NhcGFiaWxpdHlfYWRtaW4odm9pZCkJeyByZXR1cm4gbW9kaWZ5X2NhcGFiaWxpdHkoMCk7IH07CisjZW5kaWYKK2V4dGVybiB2b2lkIGRyb3BfY2FwYWJpbGl0aWVzKHZvaWQpOworZXh0ZXJuIHZvaWQgYW5kcm9pZF9jaGVja19zZWN1cml0eSh2b2lkKTsKKworZXh0ZXJuIGludCBzZW5kX3Byb2JlKHZvaWQpOworZXh0ZXJuIGludCByZWNlaXZlX2Vycm9yX21zZyh2b2lkKTsKK2V4dGVybiBpbnQgcGFyc2VfcmVwbHkoc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgbGVuLCB2b2lkICphZGRyLCBzdHJ1Y3QgdGltZXZhbCAqKTsKK2V4dGVybiB2b2lkIGluc3RhbGxfZmlsdGVyKHZvaWQpOworZXh0ZXJuIGludCBpc19vdXJzKHVpbnQxNl90IGlkKTsKKworZXh0ZXJuIGludCBwaW5nZXIodm9pZCk7CitleHRlcm4gdm9pZCBzb2NrX3NldGJ1ZnMoaW50IGljbXBfc29jaywgaW50IGFsbG9jKTsKK2V4dGVybiB2b2lkIHNvY2tfc2V0bWFyayhpbnQgaWNtcF9zb2NrKTsKK2V4dGVybiB2b2lkIHNldHVwKGludCBpY21wX3NvY2spOworZXh0ZXJuIHZvaWQgbWFpbl9sb29wKGludCBpY21wX3NvY2ssIF9fdTggKmJ1ZiwgaW50IGJ1ZmxlbikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK2V4dGVybiB2b2lkIGZpbmlzaCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworZXh0ZXJuIHZvaWQgc3RhdHVzKHZvaWQpOworZXh0ZXJuIHZvaWQgY29tbW9uX29wdGlvbnMoaW50IGNoKTsKK2V4dGVybiBpbnQgZ2F0aGVyX3N0YXRpc3RpY3MoX191OCAqcHRyLCBpbnQgaWNtcGxlbiwKKwkJCSAgICAgaW50IGNjLCBfX3UxNiBzZXEsIGludCBob3BzLAorCQkJICAgICBpbnQgY3NmYWlsZWQsIHN0cnVjdCB0aW1ldmFsICp0diwgY2hhciAqZnJvbSwKKwkJCSAgICAgdm9pZCAoKnByX3JlcGx5KShfX3U4ICpwdHIsIGludCBjYykpOworZXh0ZXJuIHZvaWQgcHJpbnRfdGltZXN0YW1wKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaXB1dGlscy9yYXJwZC5jIGIvaXB1dGlscy9yYXJwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDBlODcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL3JhcnBkLmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qCisgKiByYXJwZC5jCVJBUlAgZGFlbW9uLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKworaW50IGRvX3JlbG9hZCA9IDE7CisKK2ludCBkZWJ1ZzsKK2ludCB2ZXJib3NlOworaW50IGlmaWR4OworaW50IGFsbG93X29mZmxpbms7CitpbnQgb25seV9ldGhlcnM7CitpbnQgYWxsX2lmYWNlczsKK2ludCBsaXN0ZW5fYXJwOworY2hhciAqaWZuYW1lOworY2hhciAqdGZ0cF9kaXIgPSAiL2V0Yy90ZnRwYm9vdCI7CisKK2V4dGVybiBpbnQgZXRoZXJfbnRvaG9zdChjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICplYSk7Cit2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0cnVjdCBpZmxpbmsKK3sKKwlzdHJ1Y3QgaWZsaW5rCSpuZXh0OworCWludAkgICAgICAgCWluZGV4OworCWludAkJaGF0eXBlOworCXVuc2lnbmVkIGNoYXIJbGxhZGRyWzE2XTsKKwljaGFyCQluYW1lW0lGTkFNU0laXTsKKwlzdHJ1Y3QgaWZhZGRyIAkqaWZhX2xpc3Q7Cit9ICppZmxfbGlzdDsKKworc3RydWN0IGlmYWRkcgoreworCXN0cnVjdCBpZmFkZHIgCSpuZXh0OworCV9fdTMyCQlwcmVmaXg7CisJX191MzIJCW1hc2s7CisJX191MzIJCWxvY2FsOworfTsKKworc3RydWN0IHJhcnBfbWFwCit7CisJc3RydWN0IHJhcnBfbWFwICpuZXh0OworCisJaW50CQlpZmluZGV4OworCWludAkJYXJwX3R5cGU7CisJaW50CQlsbGFkZHJfbGVuOworCXVuc2lnbmVkIGNoYXIJbGxhZGRyWzE2XTsKKwlfX3UzMgkJaXBhZGRyOworfSAqcmFycF9kYjsKKwordm9pZCB1c2FnZSgpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogcmFycGQgWyAtZHZlYUEgXSBbIC1iIHRmdHBkaXIgXSBbIGludGVyZmFjZV1cbiIpOworCWV4aXQoMSk7Cit9CisKK3ZvaWQgbG9hZF9kYih2b2lkKQoreworfQorCit2b2lkIGxvYWRfaWYodm9pZCkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IGlmcmVxICppZnJwLCAqaWZlbmQ7CisJc3RydWN0IGlmbGluayAqaWZsOworCXN0cnVjdCBpZmFkZHIgKmlmYTsKKwlzdHJ1Y3QgaWZjb25mIGlmYzsKKwlzdHJ1Y3QgaWZyZXEgaWJ1ZlsyNTZdOworCisJaWYgKChmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAic29ja2V0OiAlbSIpOworCQlyZXR1cm47CisJfQorCisJaWZjLmlmY19sZW4gPSBzaXplb2YgaWJ1ZjsKKwlpZmMuaWZjX2J1ZiA9IChjYWRkcl90KWlidWY7CisJaWYgKGlvY3RsKGZkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDAgfHwKKwkgICAgaWZjLmlmY19sZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaWZyZXEpKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiU0lPQ0dJRkNPTkY6ICVtIik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICgoaWZsID0gaWZsX2xpc3QpICE9IE5VTEwpIHsKKwkJd2hpbGUgKChpZmEgPSBpZmwtPmlmYV9saXN0KSAhPSBOVUxMKSB7CisJCQlpZmwtPmlmYV9saXN0ID0gaWZhLT5uZXh0OworCQkJZnJlZShpZmEpOworCQl9CisJCWlmbF9saXN0ID0gaWZsLT5uZXh0OworCQlmcmVlKGlmbCk7CisJfQorCisJaWZlbmQgPSAoc3RydWN0IGlmcmVxICopKChjaGFyICopaWJ1ZiArIGlmYy5pZmNfbGVuKTsKKwlmb3IgKGlmcnAgPSBpYnVmOyBpZnJwIDwgaWZlbmQ7IGlmcnArKykgeworCQlfX3UzMiBhZGRyOworCQlfX3UzMiBtYXNrOworCQlfX3UzMiBwcmVmaXg7CisKKwkJaWYgKGlmcnAtPmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKQorCQkJY29udGludWU7CisJCWFkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopJmlmcnAtPmlmcl9hZGRyKS0+c2luX2FkZHIuc19hZGRyOworCQlpZiAoYWRkciA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRklOREVYLCBpZnJwKSkgeworCQkJc3lzbG9nKExPR19FUlIsICJpb2N0bChTSU9DR0lGTkFNRSk6ICVtIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaWZpZHggJiYgaWZycC0+aWZyX2lmaW5kZXggIT0gaWZpZHgpCisJCQljb250aW51ZTsKKwkJZm9yIChpZmwgPSBpZmxfbGlzdDsgaWZsOyBpZmwgPSBpZmwtPm5leHQpCisJCQlpZiAoaWZsLT5pbmRleCA9PSBpZnJwLT5pZnJfaWZpbmRleCkKKwkJCQlicmVhazsKKwkJaWYgKGlmbCA9PSBOVUxMKSB7CisJCQljaGFyICpwOworCQkJaW50IGluZGV4ID0gaWZycC0+aWZyX2lmaW5kZXg7CisKKwkJCWlmIChpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgaWZycCkpIHsKKwkJCQlzeXNsb2coTE9HX0VSUiwgImlvY3RsKFNJT0NHSUZIV0FERFIpOiAlbSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZmwgPSAoc3RydWN0IGlmbGluayopbWFsbG9jKHNpemVvZigqaWZsKSk7CisJCQlpZiAoaWZsID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQltZW1zZXQoaWZsLCAwLCBzaXplb2YoKmlmbCkpOworCQkJaWZsLT5uZXh0ID0gaWZsX2xpc3Q7CisJCQlpZmxfbGlzdCA9IGlmbDsKKwkJCWlmbC0+aW5kZXggPSBpbmRleDsKKwkJCWlmbC0+aGF0eXBlID0gaWZycC0+aWZyX2h3YWRkci5zYV9mYW1pbHk7CisJCQltZW1jcHkoaWZsLT5sbGFkZHIsIGlmcnAtPmlmcl9od2FkZHIuc2FfZGF0YSwgMTQpOworCQkJc3RybmNweShpZmwtPm5hbWUsIGlmcnAtPmlmcl9uYW1lLCBJRk5BTVNJWik7CisJCQlwID0gc3RyY2hyKGlmbC0+bmFtZSwgJzonKTsKKwkJCWlmIChwKQorCQkJCSpwID0gMDsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXN5c2xvZyhMT0dfSU5GTywgImxpbmsgJXMiLCBpZmwtPm5hbWUpOworCQl9CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRk5FVE1BU0ssIGlmcnApKSB7CisJCQlzeXNsb2coTE9HX0VSUiwgImlvY3RsKFNJT0NHSUZNQVNLKTogJW0iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1hc2sgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopJmlmcnAtPmlmcl9uZXRtYXNrKS0+c2luX2FkZHIuc19hZGRyOworCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZEU1RBRERSLCBpZnJwKSkgeworCQkJc3lzbG9nKExPR19FUlIsICJpb2N0bChTSU9DR0lGRFNUQUREUik6ICVtIik7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmVmaXggPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopJmlmcnAtPmlmcl9kc3RhZGRyKS0+c2luX2FkZHIuc19hZGRyOworCQlmb3IgKGlmYSA9IGlmbC0+aWZhX2xpc3Q7IGlmYTsgaWZhID0gaWZhLT5uZXh0KSB7CisJCQlpZiAoaWZhLT5sb2NhbCA9PSBhZGRyICYmCisJCQkgICAgaWZhLT5wcmVmaXggPT0gcHJlZml4ICYmCisJCQkgICAgaWZhLT5tYXNrID09IG1hc2spCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGlmYSA9PSBOVUxMKSB7CisJCQlpZiAobWFzayA9PSAwIHx8IHByZWZpeCA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWZhID0gKHN0cnVjdCBpZmFkZHIqKW1hbGxvYyhzaXplb2YoKmlmYSkpOworCQkJbWVtc2V0KGlmYSwgMCwgc2l6ZW9mKCppZmEpKTsKKwkJCWlmYS0+bG9jYWwgPSBhZGRyOworCQkJaWZhLT5wcmVmaXggPSBwcmVmaXg7CisJCQlpZmEtPm1hc2sgPSBtYXNrOworCQkJaWZhLT5uZXh0ID0gaWZsLT5pZmFfbGlzdDsKKwkJCWlmbC0+aWZhX2xpc3QgPSBpZmE7CisKKwkJCWlmICh2ZXJib3NlKSB7CisJCQkJaW50IGk7CisJCQkJX191MzIgbSA9IH4wVTsKKwkJCQlmb3IgKGk9MzI7IGk+PTA7IGktLSkgeworCQkJCQlpZiAoaHRvbmwobSkgPT0gbWFzaykKKwkJCQkJCWJyZWFrOworCQkJCQltIDw8PSAxOworCQkJCX0KKwkJCQlpZiAoYWRkciA9PSBwcmVmaXgpIHsKKwkJCQkJc3lzbG9nKExPR19JTkZPLCAiICBhZGRyICVzLyVkIG9uICVzXG4iLAorCQkJCQkgICAgICAgaW5ldF9udG9hKCooc3RydWN0IGluX2FkZHIqKSZhZGRyKSwgaSwgaWZsLT5uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQljaGFyIHRtcGFbNjRdOworCQkJCQlzcHJpbnRmKHRtcGEsICIlcyIsIGluZXRfbnRvYSgqKHN0cnVjdCBpbl9hZGRyKikmYWRkcikpOworCQkJCQlzeXNsb2coTE9HX0lORk8sICIgIGFkZHIgJXMgJXMvJWQgb24gJXNcbiIsIHRtcGEsCisJCQkJCSAgICAgICBpbmV0X250b2EoKihzdHJ1Y3QgaW5fYWRkciopJnByZWZpeCksIGksIGlmbC0+bmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCit2b2lkIGNvbmZpZ3VyZSh2b2lkKQoreworCWxvYWRfaWYoKTsKKwlsb2FkX2RiKCk7Cit9CisKK2ludCBib290YWJsZShfX3UzMiBhZGRyKQoreworCXN0cnVjdCBkaXJlbnQgKmRlbnQ7CisJRElSICpkOworCWNoYXIgbmFtZVs5XTsKKworCXNwcmludGYobmFtZSwgIiUwOFgiLCAoX191MzIpbnRvaGwoYWRkcikpOworCWQgPSBvcGVuZGlyKHRmdHBfZGlyKTsKKwlpZiAoZCA9PSBOVUxMKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAib3BlbmRpcjogJW0iKTsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlICgoZGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAoZGVudC0+ZF9uYW1lLCBuYW1lLCA4KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWNsb3NlZGlyKGQpOworCXJldHVybiBkZW50ICE9IE5VTEw7Cit9CisKK3N0cnVjdCBpZmFkZHIgKnNlbGVjdF9pcGFkZHIoaW50IGlmaW5kZXgsIF9fdTMyICpzZWxfYWRkciwgX191MzIgKiphbGlzdCkKK3sKKwlzdHJ1Y3QgaWZsaW5rICppZmw7CisJc3RydWN0IGlmYWRkciAqaWZhOworCWludCByZXRyeSA9IDA7CisJaW50IGk7CisKK3JldHJ5OgorCWZvciAoaWZsPWlmbF9saXN0OyBpZmw7IGlmbD1pZmwtPm5leHQpCisJCWlmIChpZmwtPmluZGV4ID09IGlmaW5kZXgpCisJCQlicmVhazsKKwlpZiAoaWZsID09IE5VTEwgJiYgIXJldHJ5KSB7CisJCXJldHJ5Kys7CisJCWxvYWRfaWYoKTsKKwkJZ290byByZXRyeTsKKwl9CisJaWYgKGlmbCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaT0wOyBhbGlzdFtpXTsgaSsrKSB7CisJCV9fdTMyIGFkZHIgPSAqKGFsaXN0W2ldKTsKKwkJZm9yIChpZmE9aWZsLT5pZmFfbGlzdDsgaWZhOyBpZmE9aWZhLT5uZXh0KSB7CisJCQlpZiAoISgoaWZhLT5wcmVmaXheYWRkcikmaWZhLT5tYXNrKSkgeworCQkJCSpzZWxfYWRkciA9IGFkZHI7CisJCQkJcmV0dXJuIGlmYTsKKwkJCX0KKwkJfQorCQlpZiAoaWZhID09IE5VTEwgJiYgcmV0cnk9PTApIHsKKwkJCXJldHJ5Kys7CisJCQlsb2FkX2lmKCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCWlmIChpPT0xICYmIGFsbG93X29mZmxpbmspIHsKKwkJKnNlbF9hZGRyID0gKihhbGlzdFswXSk7CisJCXJldHVybiBpZmwtPmlmYV9saXN0OworCX0KKwlzeXNsb2coTE9HX0VSUiwgIk9mZi1saW5rIHJlcXVlc3Qgb24gJXMiLCBpZmwtPm5hbWUpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgcmFycF9tYXAgKnJhcnBfbG9va3VwKGludCBpZmluZGV4LCBpbnQgaGF0eXBlLAorCQkJICAgICBpbnQgaGFsZW4sIHVuc2lnbmVkIGNoYXIgKmxsYWRkcikKK3sKKwlzdHJ1Y3QgcmFycF9tYXAgKnI7CisKKwlmb3IgKHI9cmFycF9kYjsgcjsgcj1yLT5uZXh0KSB7CisJCWlmIChyLT5hcnBfdHlwZSAhPSBoYXR5cGUgJiYgci0+YXJwX3R5cGUgIT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKHItPmxsYWRkcl9sZW4gIT0gaGFsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKHItPmlmaW5kZXggIT0gaWZpbmRleCAmJiByLT5pZmluZGV4ICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChyLT5sbGFkZHIsIGxsYWRkciwgaGFsZW4pID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAociA9PSBOVUxMKSB7CisJCWlmIChoYXR5cGUgPT0gQVJQSFJEX0VUSEVSICYmIGhhbGVuID09IDYpIHsKKwkJCXN0cnVjdCBpZmFkZHIgKmlmYTsKKwkJCXN0cnVjdCBob3N0ZW50ICpocDsKKwkJCWNoYXIgZW5hbWVbMjU2XTsKKwkJCXN0YXRpYyBzdHJ1Y3QgcmFycF9tYXAgZW1hcCA9IHsKKwkJCQlOVUxMLAorCQkJCTAsCisJCQkJQVJQSFJEX0VUSEVSLAorCQkJCTYsCisJCQl9OworCisJCQlpZiAoZXRoZXJfbnRvaG9zdChlbmFtZSwgbGxhZGRyKSAhPSAwIHx8CisJCQkgICAgKGhwID0gZ2V0aG9zdGJ5bmFtZShlbmFtZSkpID09IE5VTEwpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJc3lzbG9nKExPR19JTkZPLCAibm90IGZvdW5kIGluIC9ldGMvZXRoZXJzIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAoaHAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCkgeworCQkJCXN5c2xvZyhMT0dfRVJSLCAibm8gSVAgYWRkcmVzcyIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWZhID0gc2VsZWN0X2lwYWRkcihpZmluZGV4LCAmZW1hcC5pcGFkZHIsIChfX3UzMiAqKilocC0+aF9hZGRyX2xpc3QpOworCQkJaWYgKGlmYSkgeworCQkJCW1lbWNweShlbWFwLmxsYWRkciwgbGxhZGRyLCA2KTsKKwkJCQlpZiAob25seV9ldGhlcnMgfHwgYm9vdGFibGUoZW1hcC5pcGFkZHIpKQorCQkJCQlyZXR1cm4gJmVtYXA7CisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCXN5c2xvZyhMT0dfSU5GTywgIm5vdCBib290YWJsZSIpOworCQkJfQorCQl9CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGxvYWRfYXJwX2JwZmxldChpbnQgZmQpCit7CisJc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlciBpbnNuc1tdID0geworCQlCUEZfU1RNVChCUEZfTER8QlBGX0h8QlBGX0FCUywgNiksCisJCUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgQVJQT1BfUlJFUVVFU1QsIDAsIDEpLAorCQlCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCAxMDI0KSwKKwkJQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgMCksCisJfTsKKwlzdGF0aWMgc3RydWN0IHNvY2tfZnByb2cgZmlsdGVyID0geworCQlzaXplb2YgaW5zbnMgLyBzaXplb2YoaW5zbnNbMF0pLAorCQlpbnNucworCX07CisKKwlyZXR1cm4gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpOworfQorCitpbnQgcHV0X215bGxhZGRyKHVuc2lnbmVkIGNoYXIgKipwdHJfcCwgaW50IGlmaW5kZXgsIGludCBhbGVuKQoreworCXN0cnVjdCBpZmxpbmsgKmlmbDsKKworCWZvciAoaWZsPWlmbF9saXN0OyBpZmw7IGlmbCA9IGlmbC0+bmV4dCkKKwkJaWYgKGlmbC0+aW5kZXggPT0gaWZpbmRleCkKKwkJCWJyZWFrOworCisJaWYgKGlmbD09TlVMTCkKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KCpwdHJfcCwgaWZsLT5sbGFkZHIsIGFsZW4pOworCSpwdHJfcCArPSBhbGVuOworCXJldHVybiAwOworfQorCitpbnQgcHV0X215aXBhZGRyKHVuc2lnbmVkIGNoYXIgKipwdHJfcCwgaW50IGlmaW5kZXgsIF9fdTMyIGhpc2lwYWRkcikKK3sKKwlfX3UzMiBsYWRkciA9IDA7CisJc3RydWN0IGlmbGluayAqaWZsOworCXN0cnVjdCBpZmFkZHIgKmlmYTsKKworCWZvciAoaWZsPWlmbF9saXN0OyBpZmw7IGlmbCA9IGlmbC0+bmV4dCkKKwkJaWYgKGlmbC0+aW5kZXggPT0gaWZpbmRleCkKKwkJCWJyZWFrOworCisJaWYgKGlmbD09TlVMTCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpZmE9aWZsLT5pZmFfbGlzdDsgaWZhOyBpZmE9aWZhLT5uZXh0KSB7CisJCWlmICghKChpZmEtPnByZWZpeF5oaXNpcGFkZHIpJmlmYS0+bWFzaykpIHsKKwkJCWxhZGRyID0gaWZhLT5sb2NhbDsKKwkJCWJyZWFrOworCQl9CisJfQorCW1lbWNweSgqcHRyX3AsICZsYWRkciwgNCk7CisJKnB0cl9wICs9IDQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXJwX2FkdmlzZShpbnQgaWZpbmRleCwgdW5zaWduZWQgY2hhciAqbGxhZGRyLCBpbnQgbGxsZW4sIF9fdTMyIGlwYWRkcikKK3sKKwlpbnQgZmQ7CisJc3RydWN0IGFycHJlcSByZXE7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisJc3RydWN0IGlmbGluayAqaWZsOworCisJZm9yIChpZmw9aWZsX2xpc3Q7IGlmbDsgaWZsID0gaWZsLT5uZXh0KQorCQlpZiAoaWZsLT5pbmRleCA9PSBpZmluZGV4KQorCQkJYnJlYWs7CisKKwlpZiAoaWZsID09IE5VTEwpCisJCXJldHVybjsKKworCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLmFycF9mbGFncyA9IEFURl9DT007CisJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZyZXEuYXJwX3BhOworCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpcGFkZHI7CisJcmVxLmFycF9oYS5zYV9mYW1pbHkgPSBpZmwtPmhhdHlwZTsKKwltZW1jcHkocmVxLmFycF9oYS5zYV9kYXRhLCBsbGFkZHIsIGxsbGVuKTsKKwltZW1jcHkocmVxLmFycF9kZXYsIGlmbC0+bmFtZSwgSUZOQU1TSVopOworCisJaWYgKGlvY3RsKGZkLCBTSU9DU0FSUCwgJnJlcSkpCisJCXN5c2xvZyhMT0dfRVJSLCAiU0lPQ1NBUlA6ICVtIik7CisJY2xvc2UoZmQpOworfQorCit2b2lkIHNlcnZlX2l0KGludCBmZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI0XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgc2xsOworCXNvY2tsZW5fdCBzbGxfbGVuID0gc2l6ZW9mKHNsbCk7CisJc3RydWN0IGFycGhkciAqYSA9IChzdHJ1Y3QgYXJwaGRyKilidWY7CisJc3RydWN0IHJhcnBfbWFwICpybWFwOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlpbnQgbjsKKworCW4gPSByZWN2ZnJvbShmZCwgYnVmLCBzaXplb2YoYnVmKSwgTVNHX0RPTlRXQUlULCAoc3RydWN0IHNvY2thZGRyKikmc2xsLCAmc2xsX2xlbik7CisJaWYgKG48MCkgeworCQlpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKQorCQkJc3lzbG9nKExPR19FUlIsICJyZWN2ZnJvbTogJW0iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIERvIG5vdCBhY2NlcHQgcGFja2V0cyBmb3Igb3RoZXIgaG9zdHMgYW5kIG91ciBvd24gb25lcyAqLworCWlmIChzbGwuc2xsX3BrdHR5cGUgIT0gUEFDS0VUX0JST0FEQ0FTVCAmJgorCSAgICBzbGwuc2xsX3BrdHR5cGUgIT0gUEFDS0VUX01VTFRJQ0FTVCAmJgorCSAgICBzbGwuc2xsX3BrdHR5cGUgIT0gUEFDS0VUX0hPU1QpCisJCXJldHVybjsKKworCWlmIChpZmlkeCAmJiBzbGwuc2xsX2lmaW5kZXggIT0gaWZpZHgpCisJCXJldHVybjsKKworCWlmIChuPHNpemVvZigqYSkpIHsKKwkJc3lzbG9nKExPR19FUlIsICJ0cnVuY2F0ZWQgYXJwIHBhY2tldDsgbGVuPSVkIiwgbik7CisJCXJldHVybjsKKwl9CisKKwkvKiBBY2NlcHQgb25seSBSQVJQIHJlcXVlc3RzICovCisJaWYgKGEtPmFyX29wICE9IGh0b25zKEFSUE9QX1JSRVFVRVNUKSkKKwkJcmV0dXJuOworCisJaWYgKHZlcmJvc2UpIHsKKwkJaW50IGk7CisJCWNoYXIgdG1wYnVmWzE2KjNdOworCQljaGFyICpwdHIgPSB0bXBidWY7CisJCWZvciAoaT0wOyBpPHNsbC5zbGxfaGFsZW47IGkrKykgeworCQkJaWYgKGkpIHsKKwkJCQlzcHJpbnRmKHB0ciwgIjolMDJ4Iiwgc2xsLnNsbF9hZGRyW2ldKTsKKwkJCQlwdHIrKzsKKwkJCX0gZWxzZQorCQkJCXNwcmludGYocHRyLCAiJTAyeCIsIHNsbC5zbGxfYWRkcltpXSk7CisJCQlwdHIgKz0gMjsKKwkJfQorCQlzeXNsb2coTE9HX0lORk8sICJSQVJQIHJlcXVlc3QgZnJvbSAlcyBvbiBpZiVkIiwgdG1wYnVmLCBzbGwuc2xsX2lmaW5kZXgpOworCX0KKworCS8qIFNhbml0eSBjaGVja3MgKi8KKworCS8qIDEuIElQIG9ubHkgLT4gcGxuPT00ICovCisJaWYgKGEtPmFyX3BsbiAhPSA0KSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiaW50ZXJlc3RpbmcgcmFycF9yZXEgcGxlbj0lZCIsIGEtPmFyX3Bsbik7CisJCXJldHVybjsKKwl9CisJLyogMi4gQVJQIHByb3RvY29sIG11c3QgYmUgSVAgKi8KKwlpZiAoYS0+YXJfcHJvICE9IGh0b25zKEVUSF9QX0lQKSkgeworCQlzeXNsb2coTE9HX0VSUiwgInJhcnAgcHJvdG9jb2wgaXMgbm90IElQICUwNHgiLCBudG9ocyhhLT5hcl9wcm8pKTsKKwkJcmV0dXJuOworCX0KKwkvKiAzLiBBUlAgdHlwZXMgbXVzdCBtYXRjaCAqLworCWlmIChodG9ucyhzbGwuc2xsX2hhdHlwZSkgIT0gYS0+YXJfaHJkKSB7CisJCXN3aXRjaCAoc2xsLnNsbF9oYXR5cGUpIHsKKwkJY2FzZSBBUlBIUkRfRkRESToKKwkJCWlmIChhLT5hcl9ocmQgPT0gaHRvbnMoQVJQSFJEX0VUSEVSKSB8fAorCQkJICAgIGEtPmFyX2hyZCA9PSBodG9ucyhBUlBIUkRfSUVFRTgwMikpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzeXNsb2coTE9HX0VSUiwgInJhcnAgaHR5cGUgbWlzbWF0Y2giKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiAzLiBMTCBhZGRyZXNzIGxlbmd0aHMgbXVzdCBiZSBlcXVhbCAqLworCWlmIChhLT5hcl9obG4gIT0gc2xsLnNsbF9oYWxlbikgeworCQlzeXNsb2coTE9HX0VSUiwgInJhcnAgaGxlbiBtaXNtYXRjaCIpOworCQlyZXR1cm47CisJfQorCS8qIDQuIENoZWNrIHBhY2tldCBsZW5ndGggKi8KKwlpZiAoc2l6ZW9mKCphKSArIDIqNCArIDIqYS0+YXJfaGxuID4gbikgeworCQlzeXNsb2coTE9HX0VSUiwgInRydW5jYXRlZCByYXJwIHJlcXVlc3Q7IGxlbj0lZCIsIG4pOworCQlyZXR1cm47CisJfQorCS8qIDUuIFNpbGx5IGNoZWNrOiBpZiB0aGlzIGd1eSBzZXQgZGlmZmVyZW50IHNvdXJjZQorCSAgICAgIGFkZHJlc3NlcyBpbiBNQUMgaGVhZGVyIGFuZCBpbiBBUlAsIGhlIGlzIGluc2FuZQorCSAqLworCWlmIChtZW1jbXAoc2xsLnNsbF9hZGRyLCBhKzEsIHNsbC5zbGxfaGFsZW4pKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAidGhpcyBndXkgc2V0IGRpZmZlcmVudCBoaXMgbGxhZGRycyBpbiBhcnAgYW5kIGhlYWRlciIpOworCQlyZXR1cm47CisJfQorCS8qIEVuZCBvZiBzYW5pdHkgY2hlY2tzICovCisKKwkvKiBMb29rdXAgcmVxdWVzdGVkIHRhcmdldCBpbiBvdXIgZGF0YWJhc2UgKi8KKwlybWFwID0gcmFycF9sb29rdXAoc2xsLnNsbF9pZmluZGV4LCBzbGwuc2xsX2hhdHlwZSwKKwkJCSAgIHNsbC5zbGxfaGFsZW4sICh1bnNpZ25lZCBjaGFyKikoYSsxKSArIHNsbC5zbGxfaGFsZW4gKyA0KTsKKwlpZiAocm1hcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBQcmVwYXJlIHJlcGx5LiBJdCBpcyBhbG1vc3QgcmVhZHksIHdlIG9ubHkKKwkgICByZXBsYWNlIEFSUCBwYWNrZXQgdHlwZSwgcHV0IG91ciBsbGFkZHIgYW5kCisJICAgSVAgYWRkcmVzcyB0byBzb3VyY2UgZmlsZWRzLAorCSAgIGFuZCBmaWxsIHRhcmdldCBJUCBhZGRyZXNzLgorCSAqLworCWEtPmFyX29wID0gaHRvbnMoQVJQT1BfUlJFUExZKTsKKwlwdHIgPSAodW5zaWduZWQgY2hhciopKGErMSk7CisJaWYgKHB1dF9teWxsYWRkcigmcHRyLCBzbGwuc2xsX2lmaW5kZXgsIHJtYXAtPmxsYWRkcl9sZW4pKQorCQlyZXR1cm47CisJaWYgKHB1dF9teWlwYWRkcigmcHRyLCBzbGwuc2xsX2lmaW5kZXgsIHJtYXAtPmlwYWRkcikpCisJCXJldHVybjsKKwkvKiBJdCBpcyBhbHJlYWR5IGZpbGxlZCAqLworCXB0ciArPSBybWFwLT5sbGFkZHJfbGVuOworCW1lbWNweShwdHIsICZybWFwLT5pcGFkZHIsIDQpOworCXB0ciArPSA0OworCisJLyogVXBkYXRlIG91ciBBUlAgY2FjaGUuIFByb2JhYmx5LCB0aGlzIGd1eQorCSAgIHdpbGwgbm90IGFibGUgdG8gbWFrZSBBUlAgKGlmIGl0IGlzIGJyb2tlbikKKwkgKi8KKwlhcnBfYWR2aXNlKHNsbC5zbGxfaWZpbmRleCwgcm1hcC0+bGxhZGRyLCBybWFwLT5sbGFkZHJfbGVuLCBybWFwLT5pcGFkZHIpOworCisJLyogU2VuZHRvIGlzIGJsb2NraW5nLCBidXQgd2l0aCA1c2VjIHRpbWVvdXQgKi8KKwlhbGFybSg1KTsKKwlzZW5kdG8oZmQsIGJ1ZiwgcHRyIC0gYnVmLCAwLCAoc3RydWN0IHNvY2thZGRyKikmc2xsLCBzaXplb2Yoc2xsKSk7CisJYWxhcm0oMCk7Cit9CisKK3ZvaWQgY2F0Y2hfc2lnbmFsKGludCBzaWcsIHZvaWQgKCpoYW5kbGVyKShpbnQpKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gaGFuZGxlcjsKKyNpZmRlZiBTQV9JTlRFUlJVUFQKKwlzYS5zYV9mbGFncyA9IFNBX0lOVEVSUlVQVDsKKyNlbmRpZgorCXNpZ2FjdGlvbihzaWcsICZzYSwgTlVMTCk7Cit9CisKK3ZvaWQgc2lnX2FsYXJtKGludCBzaWdubykKK3sKK30KKwordm9pZCBzaWdfaHVwKGludCBzaWdubykKK3sKKwlkb19yZWxvYWQgPSAxOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHBvbGxmZCBwc2V0WzJdOworCWludCBwc2l6ZTsKKwlpbnQgb3B0OworCisKKwlvcHRlcnIgPSAwOworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhQWI6ZHZvZSIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnYSc6CisJCQkrK2FsbF9pZmFjZXM7CisJCQlicmVhazsKKworCQljYXNlICdBJzoKKwkJCSsrbGlzdGVuX2FycDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2QnOgorCQkJKytkZWJ1ZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3YnOgorCQkJKyt2ZXJib3NlOworCQkJYnJlYWs7CisKKwkJY2FzZSAnbyc6CisJCQkrK2FsbG93X29mZmxpbms7CisJCQlicmVhazsKKworCQljYXNlICdlJzoKKwkJCSsrb25seV9ldGhlcnM7CisJCQlicmVhazsKKworCQljYXNlICdiJzoKKwkJCXRmdHBfZGlyID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0KKwl9CisJaWYgKGFyZ2MgPiBvcHRpbmQpIHsKKwkJaWYgKGFyZ2MgPiBvcHRpbmQrMSkKKwkJCXVzYWdlKCk7CisJCWlmbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKwl9CisKKwlwc2l6ZSA9IDE7CisJcHNldFswXS5mZCA9IHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIDApOworCisJaWYgKGlmbmFtZSkgeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBJRk5BTVNJWik7CisJCWlmIChpb2N0bChwc2V0WzBdLmZkLCBTSU9DR0lGSU5ERVgsICZpZnIpKSB7CisJCQlwZXJyb3IoImlvY3RsKFNJT0NHSUZJTkRFWCkiKTsKKwkJCXVzYWdlKCk7CisJCX0KKwkJaWZpZHggPSBpZnIuaWZyX2lmaW5kZXg7CisJfQorCisJcHNldFsxXS5mZCA9IC0xOworCWlmIChsaXN0ZW5fYXJwKSB7CisJCXBzZXRbMV0uZmQgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCAwKTsKKwkJaWYgKHBzZXRbMV0uZmQgPj0gMCkgeworCQkJbG9hZF9hcnBfYnBmbGV0KHBzZXRbMV0uZmQpOworCQkJcHNpemUgPSAxOworCQl9CisJfQorCisJaWYgKHBzZXRbMV0uZmQgPj0gMCkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgc2xsOworCQltZW1zZXQoJnNsbCwgMCwgc2l6ZW9mKHNsbCkpOworCQlzbGwuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwkJc2xsLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FSUCk7CisJCXNsbC5zbGxfaWZpbmRleCA9IGFsbF9pZmFjZXMgPyAwIDogaWZpZHg7CisJCWlmIChiaW5kKHBzZXRbMV0uZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzbGwsIHNpemVvZihzbGwpKSA8IDApIHsKKwkJCWNsb3NlKHBzZXRbMV0uZmQpOworCQkJcHNldFsxXS5mZCA9IC0xOworCQkJcHNpemUgPSAxOworCQl9CisJfQorCWlmIChwc2V0WzBdLmZkID49IDApIHsKKwkJc3RydWN0IHNvY2thZGRyX2xsIHNsbDsKKwkJbWVtc2V0KCZzbGwsIDAsIHNpemVvZihzbGwpKTsKKwkJc2xsLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJCXNsbC5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9SQVJQKTsKKwkJc2xsLnNsbF9pZmluZGV4ID0gYWxsX2lmYWNlcyA/IDAgOiBpZmlkeDsKKwkJaWYgKGJpbmQocHNldFswXS5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNsbCwgc2l6ZW9mKHNsbCkpIDwgMCkgeworCQkJY2xvc2UocHNldFswXS5mZCk7CisJCQlwc2V0WzBdLmZkID0gLTE7CisJCX0KKwl9CisJaWYgKHBzZXRbMF0uZmQgPCAwKSB7CisJCXBzZXRbMF0gPSBwc2V0WzFdOworCQlwc2l6ZS0tOworCX0KKwlpZiAocHNpemUgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBiaW5kIGFueSBzb2NrZXQuIEFib3J0aW5nLlxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCFkZWJ1ZykgeworCQlpbnQgZmQ7CisJCXBpZF90IHBpZCA9IGZvcmsoKTsKKworCQlpZiAocGlkID4gMCkKKwkJCWV4aXQoMCk7CisJCWVsc2UgaWYgKHBpZCA9PSAtMSkgeworCQkJcGVycm9yKCJyYXJwZDogZm9yayIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChjaGRpcigiLyIpIDwgMCkgeworCQkJcGVycm9yKCJyYXJwZDogY2hkaXIiKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJCWlmIChmZCA+PSAwKSB7CisJCQlkdXAyKGZkLCAwKTsKKwkJCWR1cDIoZmQsIDEpOworCQkJZHVwMihmZCwgMik7CisJCQlpZiAoZmQgPiAyKQorCQkJCWNsb3NlKGZkKTsKKwkJfQorCQlzZXRzaWQoKTsKKwl9CisKKwlvcGVubG9nKCJyYXJwZCIsIExPR19QSUQgfCBMT0dfQ09OUywgTE9HX0RBRU1PTik7CisJY2F0Y2hfc2lnbmFsKFNJR0FMUk0sIHNpZ19hbGFybSk7CisJY2F0Y2hfc2lnbmFsKFNJR0hVUCwgc2lnX2h1cCk7CisKKwlmb3IgKDs7KSB7CisJCWludCBpOworCisJCWlmIChkb19yZWxvYWQpIHsKKwkJCWNvbmZpZ3VyZSgpOworCQkJZG9fcmVsb2FkID0gMDsKKwkJfQorCisjZGVmaW5lIEVWRU5UUyAoUE9MTElOfFBPTExQUkl8UE9MTEVSUnxQT0xMSFVQKQorCQlwc2V0WzBdLmV2ZW50cyA9IEVWRU5UUzsKKwkJcHNldFswXS5yZXZlbnRzID0gMDsKKwkJcHNldFsxXS5ldmVudHMgPSBFVkVOVFM7CisJCXBzZXRbMV0ucmV2ZW50cyA9IDA7CisKKwkJaSA9IHBvbGwocHNldCwgcHNpemUsIC0xKTsKKwkJaWYgKGkgPD0gMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSICYmIGk8MCkgeworCQkJCXN5c2xvZyhMT0dfRVJSLCAicG9sbCByZXR1cm5lZCBzb21lIGNyYXA6ICVtXG4iKTsKKwkJCQlzbGVlcCgxMCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlmb3IgKGk9MDsgaTxwc2l6ZTsgaSsrKSB7CisJCQlpZiAocHNldFtpXS5yZXZlbnRzJkVWRU5UUykKKwkJCQlzZXJ2ZV9pdChwc2V0W2ldLmZkKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2lwdXRpbHMvcmRpc2MuYyBiL2lwdXRpbHMvcmRpc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQyNzczCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy9yZGlzYy5jCkBAIC0wLDAgKzEsMTUzNCBAQAorLyoKKyAqIFJkaXNjICh0aGlzIHByb2dyYW0pIHdhcyBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMKKyAqIHByb3ZpZGVkIGZvciB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24KKyAqIGFsbCB0YXBlIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4KKyAqIFVzZXJzIG1heSBjb3B5IG9yIG1vZGlmeSBSZGlzYyB3aXRob3V0IGNoYXJnZSwgYW5kIHRoZXkgbWF5IGZyZWVseQorICogZGlzdHJpYnV0ZSBpdC4KKyAqCisgKiBSRElTQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogUmRpc2MgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgUkRJU0MKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorLyogRG8gbm90IHVzZSAiaW1wcm92ZWQiIGdsaWJjIHZlcnNpb24hICovCisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisKKy8qCisgKiBUaGUgbmV4dCBpbmNsdWRlIGNvbnRhaW5zIGFsbCBkZWZzIGFuZCBzdHJ1Y3R1cmVzIGZvciBtdWx0aWNhc3QKKyAqIHRoYXQgYXJlIG5vdCBpbiBTdW5PUyA0LjEueC4gT24gYSBTdW5PUyA0LjEueCBzeXN0ZW0gbm9uZSBvZiB0aGlzIGNvZGUKKyAqIGlzIGV2ZXIgdXNlZCBiZWNhdXNlIGl0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGljYXN0CisgKiBGcmFzZXIgR2FyZGluZXIgLSBTdW4gTWljcm9zeXN0ZW1zIEF1c3RyYWxpYQorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpbmNsdWRlICJTTkFQU0hPVC5oIgorCitzdHJ1Y3QgaW50ZXJmYWNlCit7CisJc3RydWN0IGluX2FkZHIgCWFkZHJlc3M7CS8qIFVzZWQgdG8gaWRlbnRpZnkgdGhlIGludGVyZmFjZSAqLworCXN0cnVjdCBpbl9hZGRyCWxvY2FsYWRkcjsJLyogQWN0dWFsIGFkZHJlc3MgaWYgdGhlIGludGVyZmFjZSAqLworCWludCAJCXByZWZlcmVuY2U7CisJaW50CQlmbGFnczsKKwlzdHJ1Y3QgaW5fYWRkcgliY2FzdGFkZHI7CisJc3RydWN0IGluX2FkZHIJcmVtb3RlYWRkcjsKKwlzdHJ1Y3QgaW5fYWRkcgluZXRtYXNrOworCWludAkJaWZpbmRleDsKKwljaGFyCQluYW1lW0lGTkFNU0laXTsKK307CisKKy8qCisgKiBUQkQKKyAqCVVzZSAyNTUuMjU1LjI1NS4yNTUgZm9yIGJyb2FkY2FzdHMgLSBub3QgdGhlIGludGVyZmFjZSBicm9hZGNhc3QKKyAqCWFkZHJlc3MuCisgKi8KKworI2RlZmluZSBBTExJR04ocHRyKQkocHRyKQorCitzdGF0aWMgaW50IGpvaW4oaW50IHNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKTsKK3N0YXRpYyB2b2lkIHNvbGljaXRvcihzdHJ1Y3Qgc29ja2FkZHJfaW4gKik7CisjaWZkZWYgUkRJU0NfU0VSVkVSCitzdGF0aWMgdm9pZCBhZHZlcnRpc2Uoc3RydWN0IHNvY2thZGRyX2luICosIGludCBsZnQpOworI2VuZGlmCitzdGF0aWMgY2hhciAqcHJfbmFtZShzdHJ1Y3QgaW5fYWRkciBhZGRyKTsKK3N0YXRpYyB2b2lkIHByX3BhY2soY2hhciAqYnVmLCBpbnQgY2MsIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSk7CitzdGF0aWMgdm9pZCBhZ2VfdGFibGUoaW50IHRpbWUpOworc3RhdGljIHZvaWQgcmVjb3JkX3JvdXRlcihzdHJ1Y3QgaW5fYWRkciByb3V0ZXIsIGludCBwcmVmZXJlbmNlLCBpbnQgdHRsKTsKK3N0YXRpYyB2b2lkIGFkZF9yb3V0ZShzdHJ1Y3QgaW5fYWRkciBhZGRyKTsKK3N0YXRpYyB2b2lkIGRlbF9yb3V0ZShzdHJ1Y3QgaW5fYWRkciBhZGRyKTsKK3N0YXRpYyB2b2lkIHJ0aW9jdGwoc3RydWN0IGluX2FkZHIgYWRkciwgaW50IG9wKTsKK3N0YXRpYyBpbnQgc3VwcG9ydF9tdWx0aWNhc3Qodm9pZCk7CitzdGF0aWMgaW50IHNlbmRiY2FzdChpbnQgcywgY2hhciAqcGFja2V0LCBpbnQgcGFja2V0bGVuKTsKK3N0YXRpYyBpbnQgc2VuZG1jYXN0KGludCBzLCBjaGFyICpwYWNrZXQsIGludCBwYWNrZXRsZW4sIHN0cnVjdCBzb2NrYWRkcl9pbiAqKTsKK3N0YXRpYyBpbnQgc2VuZGJjYXN0aWYoaW50IHMsIGNoYXIgKnBhY2tldCwgaW50IHBhY2tldGxlbiwgc3RydWN0IGludGVyZmFjZSAqaWZwKTsKK3N0YXRpYyBpbnQgc2VuZG1jYXN0aWYoaW50IHMsIGNoYXIgKnBhY2tldCwgaW50IHBhY2tldGxlbiwgc3RydWN0IHNvY2thZGRyX2luICpzaW4sIHN0cnVjdCBpbnRlcmZhY2UgKmlmcCk7CitzdGF0aWMgaW50IGlzX2RpcmVjdGx5X2Nvbm5lY3RlZChzdHJ1Y3QgaW5fYWRkciBpbik7CitzdGF0aWMgdm9pZCBpbml0bG9nKHZvaWQpOworc3RhdGljIHZvaWQgZGlzY2FyZF90YWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGluaXQodm9pZCk7CisKKyNkZWZpbmUgSUNNUF9ST1VURVJfQURWRVJUSVNFTUVOVAk5CisjZGVmaW5lIElDTVBfUk9VVEVSX1NPTElDSVRBVElPTgkxMAorCisjZGVmaW5lIEFMTF9IT1NUU19BRERSRVNTCQkiMjI0LjAuMC4xIgorI2RlZmluZSBBTExfUk9VVEVSU19BRERSRVNTCQkiMjI0LjAuMC4yIgorCisjZGVmaW5lIE1BWElGUyAzMgorCisjaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCBfX0dMSUJDX18gPCAyCisvKiBGb3Igcm91dGVyIGFkdmVydGlzZW1lbnQgKi8KK3N0cnVjdCBpY21wX3JhCit7CisJdV9jaGFyCWljbXBfdHlwZTsJCS8qIHR5cGUgb2YgbWVzc2FnZSwgc2VlIGJlbG93ICovCisJdV9jaGFyCWljbXBfY29kZTsJCS8qIHR5cGUgc3ViIGNvZGUgKi8KKwl1X3Nob3J0CWljbXBfY2tzdW07CQkvKiBvbmVzIGNvbXBsZW1lbnQgY2tzdW0gb2Ygc3RydWN0ICovCisJdV9jaGFyCWljbXBfbnVtX2FkZHJzOworCXVfY2hhcglpY21wX3dwYTsJCS8qIFdvcmRzIHBlciBhZGRyZXNzICovCisJc2hvcnQgCWljbXBfbGlmZXRpbWU7Cit9OworCitzdHJ1Y3QgaWNtcF9yYV9hZGRyCit7CisJX191MzIJaXJhX2FkZHI7CisJX191MzIJaXJhX3ByZWZlcmVuY2U7Cit9OworI2Vsc2UKKyNkZWZpbmUgaWNtcF9yYSBpY21wCisjZW5kaWYKKworLyogUm91dGVyIGNvbnN0YW50cyAqLworI2RlZmluZQlNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUwJMTYKKyNkZWZpbmUJTUFYX0lOSVRJQUxfQURWRVJUSVNFTUVOVFMgIAkzCisjZGVmaW5lCU1BWF9SRVNQT05TRV9ERUxBWQkJMgkvKiBOb3QgdXNlZCAqLworCisvKiBIb3N0IGNvbnN0YW50cyAqLworI2RlZmluZSBNQVhfU09MSUNJVEFUSU9OUyAJCTMKKyNkZWZpbmUgU09MSUNJVEFUSU9OX0lOVEVSVkFMIAkJMworI2RlZmluZSBNQVhfU09MSUNJVEFUSU9OX0RFTEFZCQkxCS8qIE5vdCB1c2VkICovCisKKyNkZWZpbmUgSU5FTElHSUJMRV9QUkVGCQkJMHg4MDAwMDAwMAkvKiBNYXhpbXVtIG5lZ2F0aXZlICovCisKKyNkZWZpbmUgTUFYX0FEVl9JTlQgNjAwCisKKy8qIFN0YXRpY3MgKi8KK3N0YXRpYyBpbnQgbnVtX2ludGVyZmFjZXM7CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJmYWNlICppbnRlcmZhY2VzOworc3RhdGljIGludCBpbnRlcmZhY2VzX3NpemU7CQkJLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGludGVyZmFjZXMgKi8KKworCisjZGVmaW5lCU1BWFBBQ0tFVAk0MDk2CS8qIG1heCBwYWNrZXQgc2l6ZSAqLworCisvKiBmcmFzZXIgKi8KK2ludCBkZWJ1Z2ZpbGU7CisKK2NvbnN0IGNoYXIgdXNhZ2VbXSA9CisiVXNhZ2U6CXJkaXNjIFstYl0gWy1kXSBbLXNdIFstdl0gWy1mXSBbLWFdIFstVl0gW3NlbmRfYWRkcmVzc10gW3JlY2VpdmVfYWRkcmVzc11cbiIKKyNpZmRlZiBSRElTQ19TRVJWRVIKKyIgICAgICAgcmRpc2MgLXIgWy1iXSBbLWRdIFstc10gWy12XSBbLWZdIFstYV0gWy1WXSBbLXAgPHByZWZlcmVuY2U+XSBbLVQgPHNlY3M+XVxuIgorIgkJIFtzZW5kX2FkZHJlc3NdIFtyZWNlaXZlX2FkZHJlc3NdXG4iCisjZW5kaWYKKzsKKworCitpbnQgczsJCQkvKiBTb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCitzdHJ1Y3Qgc29ja2FkZHJfaW4gd2hlcmV0bzsvKiBBZGRyZXNzIHRvIHNlbmQgdG8gKi8KKworLyogQ29tbW9uIHZhcmlhYmxlcyAqLworaW50IHZlcmJvc2UgPSAwOworaW50IGRlYnVnID0gMDsKK2ludCB0cmFjZSA9IDA7CitpbnQgc29saWNpdCA9IDA7CitpbnQgbnRyYW5zbWl0dGVkID0gMDsKK2ludCBucmVjZWl2ZWQgPSAwOworaW50IGZvcmV2ZXIgPSAwOwkvKiBOZXZlciBnaXZlIHVwIG9uIGhvc3QuIElmIDAgZGVmZXIgZm9yayB1bnRpbAorCQkJICogZmlyc3QgcmVzcG9uc2UuCisJCQkgKi8KKworI2lmZGVmIFJESVNDX1NFUlZFUgorLyogUm91dGVyIHZhcmlhYmxlcyAqLworaW50IHJlc3BvbmRlcjsKK2ludCBtYXhfYWR2X2ludCA9IE1BWF9BRFZfSU5UOworaW50IG1pbl9hZHZfaW50OworaW50IGxpZmV0aW1lOworaW50IGluaXRpYWxfYWR2ZXJ0X2ludGVydmFsID0gTUFYX0lOSVRJQUxfQURWRVJUX0lOVEVSVkFMOworaW50IGluaXRpYWxfYWR2ZXJ0aXNlbWVudHMgPSBNQVhfSU5JVElBTF9BRFZFUlRJU0VNRU5UUzsKK2ludCBwcmVmZXJlbmNlID0gMDsJCS8qIFNldGFibGUgd2l0aCAtcCBvcHRpb24gKi8KKyNlbmRpZgorCisvKiBIb3N0IHZhcmlhYmxlcyAqLworaW50IG1heF9zb2xpY2l0YXRpb25zID0gTUFYX1NPTElDSVRBVElPTlM7Cit1bnNpZ25lZCBpbnQgc29saWNpdGF0aW9uX2ludGVydmFsID0gU09MSUNJVEFUSU9OX0lOVEVSVkFMOworaW50IGJlc3RfcHJlZmVyZW5jZSA9IDE7ICAJLyogU2V0IHRvIHJlY29yZCBvbmx5IHRoZSByb3V0ZXIocykgd2l0aCB0aGUKKwkJCQkgICBiZXN0IHByZWZlcmVuY2UgaW4gdGhlIGtlcm5lbC4gTm90IHNldAorCQkJCSAgIHB1dHMgYWxsIHJvdXRlcyBpbiB0aGUga2VybmVsLiAqLworCisKK3N0YXRpYyB2b2lkIGdyYWNlZnVsX2ZpbmlzaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGZpbmlzaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHRpbWVyKHZvaWQpOworc3RhdGljIHZvaWQgaW5pdGlmcyh2b2lkKTsKK3N0YXRpYyB1X3Nob3J0IGluX2Nrc3VtKHVfc2hvcnQgKmFkZHIsIGludCBsZW4pOworCitzdGF0aWMgaW50IGxvZ2dpbmcgPSAwOworCisjZGVmaW5lIGxvZ2VycihmbXQuLi4pICh7IGlmIChsb2dnaW5nKSBzeXNsb2coTE9HX0VSUiwgZm10KTsgXAorCQkJICBlbHNlIGZwcmludGYoc3RkZXJyLCBmbXQpOyB9KQorI2RlZmluZSBsb2d0cmFjZShmbXQuLi4pICh7IGlmIChsb2dnaW5nKSBzeXNsb2coTE9HX0lORk8sIGZtdCk7IFwKKwkJCSAgZWxzZSBmcHJpbnRmKHN0ZGVyciwgZm10KTsgfSkKKyNkZWZpbmUgbG9nZGVidWcoZm10Li4uKSAoeyBpZiAobG9nZ2luZykgc3lzbG9nKExPR19ERUJVRywgZm10KTsgXAorCQkJICBlbHNlIGZwcmludGYoc3RkZXJyLCBmbXQpOyB9KQorc3RhdGljIHZvaWQgbG9ncGVycm9yKGNoYXIgKnN0cik7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBpc2Jyb2FkY2FzdChzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlyZXR1cm4gKHNpbi0+c2luX2FkZHIuc19hZGRyID09IElOQUREUl9CUk9BRENBU1QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgaXNtdWx0aWNhc3Qoc3RydWN0IHNvY2thZGRyX2luICpzaW4pCit7CisJcmV0dXJuIElOX0NMQVNTRChudG9obChzaW4tPnNpbl9hZGRyLnNfYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBwcnVzYWdlKHZvaWQpCit7CisJZnB1dHModXNhZ2UsIHN0ZGVycik7CisJZXhpdCgxKTsKK30KKwordm9pZCBkb19mb3JrKHZvaWQpCit7CisJaW50IHQ7CisJcGlkX3QgcGlkOworCWxvbmcgb3Blbl9tYXg7CisKKwlpZiAodHJhY2UpCisJCXJldHVybjsKKwlpZiAoKG9wZW5fbWF4ID0gc3lzY29uZihfU0NfT1BFTl9NQVgpKSA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gMCkgeworCQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiT1BFTl9NQVggaXMgbm90IHN1cHBvcnRlZFxuIik7CisJCX0gCisJCWVsc2UgeworCQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAic3lzY29uZigpIGVycm9yXG4iKTsKKwkJfQorCQlleGl0KDEpOworCX0KKworCisJaWYgKChwaWQ9Zm9yaygpKSAhPSAwKQorCQlleGl0KDApOworCisJZm9yICh0ID0gMDsgdCA8IG9wZW5fbWF4OyB0KyspCisJCWlmICh0ICE9IHMpCisJCQljbG9zZSh0KTsKKworCXNldHNpZCgpOworCWluaXRsb2coKTsKK30KKwordm9pZCBzaWduYWxfc2V0dXAoaW50IHNpZ25vLCB2b2lkICgqaGFuZGxlcikodm9pZCkpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCisJc2Euc2FfaGFuZGxlciA9ICh2b2lkICgqKShpbnQpKWhhbmRsZXI7CisjaWZkZWYgU0FfSU5URVJSVVBUCisJc2Euc2FfZmxhZ3MgPSBTQV9JTlRFUlJVUFQ7CisjZW5kaWYKKwlzaWdhY3Rpb24oc2lnbm8sICZzYSwgTlVMTCk7Cit9CisKKy8qCisgKiAJCQlNIEEgSSBOCisgKi8KK2NoYXIgICAgKnNlbmRhZGRyZXNzLCAqcmVjdmFkZHJlc3M7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbTsKKwljaGFyICoqYXYgPSBhcmd2OworCXN0cnVjdCBzb2NrYWRkcl9pbiAqdG8gPSAmd2hlcmV0bzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gam9pbmFkZHI7CisJc2lnc2V0X3Qgc3NldCwgc3NldF9lbXB0eTsKKyNpZmRlZiBSRElTQ19TRVJWRVIKKwlpbnQgdmFsOworCisJbWluX2Fkdl9pbnQgPSggbWF4X2Fkdl9pbnQgKiAzIC8gNCk7CisJbGlmZXRpbWUgPSAoMyptYXhfYWR2X2ludCk7CisjZW5kaWYKKworCWFyZ2MtLSwgYXYrKzsKKwl3aGlsZSAoYXJnYyA+IDAgJiYgKmF2WzBdID09ICctJykgeworCQl3aGlsZSAoKisrYXZbMF0pIHsKKwkJCXN3aXRjaCAoKmF2WzBdKSB7CisJCQljYXNlICdkJzoKKwkJCQlkZWJ1ZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzoKKwkJCQl0cmFjZSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICd2JzoKKwkJCQl2ZXJib3NlKys7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCQlzb2xpY2l0ID0gMTsKKwkJCQlicmVhazsKKyNpZmRlZiBSRElTQ19TRVJWRVIKKwkJCWNhc2UgJ3InOgorCQkJCXJlc3BvbmRlciA9IDE7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWNhc2UgJ2EnOgorCQkJCWJlc3RfcHJlZmVyZW5jZSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQliZXN0X3ByZWZlcmVuY2UgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnZic6CisJCQkJZm9yZXZlciA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdWJzoKKwkJCQlwcmludGYoInJkaXNjIHV0aWxpdHksIGlwdXRpbHMtJXNcbiIsIFNOQVBTSE9UKTsKKwkJCQlleGl0KDApOworI2lmZGVmIFJESVNDX1NFUlZFUgorCQkJY2FzZSAnVCc6CisJCQkJYXJnYy0tLCBhdisrOworCQkJCWlmIChhcmdjICE9IDApIHsKKwkJCQkJdmFsID0gc3RydG9sKGF2WzBdLCAoY2hhciAqKilOVUxMLCAwKTsKKwkJCQkJaWYgKHZhbCA8IDQgfHwgdmFsID4gMTgwMCkgeworCQkJCQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLAorCQkJCQkJCSAgICAgICAiQmFkIE1heCBBZHZlcnRpemVtZW50IEludGVydmFsXG4iKTsKKwkJCQkJCWV4aXQoMSk7CisJCQkJCX0KKwkJCQkJbWF4X2Fkdl9pbnQgPSB2YWw7CisJCQkJCW1pbl9hZHZfaW50ID0oIG1heF9hZHZfaW50ICogMyAvIDQpOworCQkJCQlsaWZldGltZSA9ICgzKm1heF9hZHZfaW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcnVzYWdlKCk7CisJCQkJCS8qIE5PVFJFQUNIRUQqLworCQkJCX0KKwkJCQlnb3RvIG5leHQ7CisJCQljYXNlICdwJzoKKwkJCQlhcmdjLS0sIGF2Kys7CisJCQkJaWYgKGFyZ2MgIT0gMCkgeworCQkJCQl2YWwgPSBzdHJ0b2woYXZbMF0sIChjaGFyICoqKU5VTEwsIDApOworCQkJCQlwcmVmZXJlbmNlID0gdmFsOworCQkJCX0gZWxzZSB7CisJCQkJCXBydXNhZ2UoKTsKKwkJCQkJLyogTk9UUkVBQ0hFRCovCisJCQkJfQorCQkJCWdvdG8gbmV4dDsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQlwcnVzYWdlKCk7CisJCQkJLyogTk9UUkVBQ0hFRCovCisJCQl9CisJCX0KKyNpZmRlZiBSRElTQ19TRVJWRVIKK25leHQ6CisjZW5kaWYKKwkJYXJnYy0tLCBhdisrOworCX0KKwlpZiggYXJnYyA8IDEpICB7CisJCWlmIChzdXBwb3J0X211bHRpY2FzdCgpKSB7CisJCQlzZW5kYWRkcmVzcyA9IEFMTF9ST1VURVJTX0FERFJFU1M7CisjaWZkZWYgUkRJU0NfU0VSVkVSCisJCQlpZiAocmVzcG9uZGVyKQorCQkJCXNlbmRhZGRyZXNzID0gQUxMX0hPU1RTX0FERFJFU1M7CisjZW5kaWYKKwkJfSBlbHNlCisJCQlzZW5kYWRkcmVzcyA9ICIyNTUuMjU1LjI1NS4yNTUiOworCX0gZWxzZSB7CisJCXNlbmRhZGRyZXNzID0gYXZbMF07CisJCWFyZ2MtLTsKKwl9CisKKwlpZiAoYXJnYyA8IDEpIHsKKwkJaWYgKHN1cHBvcnRfbXVsdGljYXN0KCkpIHsKKwkJCXJlY3ZhZGRyZXNzID0gQUxMX0hPU1RTX0FERFJFU1M7CisjaWZkZWYgUkRJU0NfU0VSVkVSCisJCQlpZiAocmVzcG9uZGVyKQorCQkJCXJlY3ZhZGRyZXNzID0gQUxMX1JPVVRFUlNfQUREUkVTUzsKKyNlbmRpZgorCQl9IGVsc2UKKwkJCXJlY3ZhZGRyZXNzID0gIjI1NS4yNTUuMjU1LjI1NSI7CisJfSBlbHNlIHsKKwkJcmVjdmFkZHJlc3MgPSBhdlswXTsKKwkJYXJnYy0tOworCX0KKwlpZiAoYXJnYyAhPSAwKSB7CisJCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwgIkV4dHJhIHBhcmFtZXRlcnNcbiIpOworCQlwcnVzYWdlKCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKyNpZmRlZiBSRElTQ19TRVJWRVIKKwlpZiAoc29saWNpdCAmJiByZXNwb25kZXIpIHsKKwkJcHJ1c2FnZSgpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorI2VuZGlmCisKKwlpZiAoIShzb2xpY2l0ICYmICFmb3JldmVyKSkgeworCQlkb19mb3JrKCk7CisvKgorICogQWRkZWQgdGhlIG5leHQgbGluZSB0byBzdG9wIGZvcmtpbmcgYSBzZWNvbmQgdGltZQorICogRnJhc2VyIEdhcmRpbmVyIC0gU3VuIE1pY3Jvc3lzdGVtcyBBdXN0cmFsaWEKKyAqLworCQlmb3JldmVyID0gMTsKKwl9CisKKwltZW1zZXQoIChjaGFyICopJndoZXJldG8sIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pICk7CisJdG8tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXRvLT5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoc2VuZGFkZHJlc3MpOworCisJbWVtc2V0KCAoY2hhciAqKSZqb2luYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgKTsKKwlqb2luYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlqb2luYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIocmVjdmFkZHJlc3MpOworCisjaWZkZWYgUkRJU0NfU0VSVkVSCisJaWYgKHJlc3BvbmRlcikKKwkJc3JhbmRvbSgoaW50KWdldGhvc3RpZCgpKTsKKyNlbmRpZgorCisJaWYgKChzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApKSA8IDApIHsKKwkJbG9ncGVycm9yKCJzb2NrZXQiKTsKKwkJZXhpdCg1KTsKKwl9CisKKwlzZXRsaW5lYnVmKCBzdGRvdXQgKTsKKworCXNpZ25hbF9zZXR1cChTSUdJTlQsIGZpbmlzaCApOworCXNpZ25hbF9zZXR1cChTSUdURVJNLCBncmFjZWZ1bF9maW5pc2ggKTsKKwlzaWduYWxfc2V0dXAoU0lHSFVQLCBpbml0aWZzICk7CisJc2lnbmFsX3NldHVwKFNJR0FMUk0sIHRpbWVyICk7CisKKwlzaWdlbXB0eXNldCgmc3NldCk7CisJc2lnZW1wdHlzZXQoJnNzZXRfZW1wdHkpOworCXNpZ2FkZHNldCgmc3NldCwgU0lHQUxSTSk7CisJc2lnYWRkc2V0KCZzc2V0LCBTSUdIVVApOworCXNpZ2FkZHNldCgmc3NldCwgU0lHVEVSTSk7CisJc2lnYWRkc2V0KCZzc2V0LCBTSUdJTlQpOworCisJaW5pdCgpOworCWlmIChqb2luKHMsICZqb2luYWRkcikgPCAwKSB7CisJCWxvZ2VycigiRmFpbGVkIGpvaW5pbmcgYWRkcmVzc2VzXG4iKTsKKwkJZXhpdCAoMik7CisJfQorCisJdGltZXIoKTsJLyogc3RhcnQgdGhpbmdzIGdvaW5nICovCisKKwlmb3IgKDs7KSB7CisJCXVfY2hhcglwYWNrZXRbTUFYUEFDS0VUXTsKKwkJaW50IGxlbiA9IHNpemVvZiAocGFja2V0KTsKKwkJc29ja2xlbl90IGZyb21sZW4gPSBzaXplb2YgKGZyb20pOworCQlpbnQgY2M7CisKKwkJY2M9cmVjdmZyb20ocywgKGNoYXIgKilwYWNrZXQsIGxlbiwgMCwKKwkJCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sICZmcm9tbGVuKTsKKwkJaWYgKGNjPDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWxvZ3BlcnJvcigicmVjdmZyb20iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzc2V0LCBOVUxMKTsKKwkJcHJfcGFjayggKGNoYXIgKilwYWNrZXQsIGNjLCAmZnJvbSApOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNzZXRfZW1wdHksIE5VTEwpOworCX0KKwkvKk5PVFJFQUNIRUQqLworfQorCisjZGVmaW5lIFRJTUVSX0lOVEVSVkFMIAkzCisjZGVmaW5lIEdFVElGQ09ORl9USU1FUgkzMAorCitzdGF0aWMgaW50IGxlZnRfdW50aWxfYWR2ZXJ0aXNlOworCisvKiBDYWxsZWQgZXZlcnkgVElNRVJfSU5URVJWQUwgKi8KK3ZvaWQgdGltZXIoKQoreworCXN0YXRpYyBpbnQgdGltZTsKKwlzdGF0aWMgaW50IGxlZnRfdW50aWxfZ2V0aWZjb25mOworCXN0YXRpYyBpbnQgbGVmdF91bnRpbF9zb2xpY2l0OworCisKKwl0aW1lICs9IFRJTUVSX0lOVEVSVkFMOworCisJbGVmdF91bnRpbF9nZXRpZmNvbmYgLT0gVElNRVJfSU5URVJWQUw7CisJbGVmdF91bnRpbF9hZHZlcnRpc2UgLT0gVElNRVJfSU5URVJWQUw7CisJbGVmdF91bnRpbF9zb2xpY2l0IC09IFRJTUVSX0lOVEVSVkFMOworCisJaWYgKGxlZnRfdW50aWxfZ2V0aWZjb25mIDwgMCkgeworCQlpbml0aWZzKCk7CisJCWxlZnRfdW50aWxfZ2V0aWZjb25mID0gR0VUSUZDT05GX1RJTUVSOworCX0KKyNpZmRlZiBSRElTQ19TRVJWRVIKKwlpZiAocmVzcG9uZGVyICYmIGxlZnRfdW50aWxfYWR2ZXJ0aXNlIDw9IDApIHsKKwkJbnRyYW5zbWl0dGVkKys7CisJCWFkdmVydGlzZSgmd2hlcmV0bywgbGlmZXRpbWUpOworCQlpZiAobnRyYW5zbWl0dGVkIDwgaW5pdGlhbF9hZHZlcnRpc2VtZW50cykKKwkJCWxlZnRfdW50aWxfYWR2ZXJ0aXNlID0gaW5pdGlhbF9hZHZlcnRfaW50ZXJ2YWw7CisJCWVsc2UKKwkJCWxlZnRfdW50aWxfYWR2ZXJ0aXNlID0gbWluX2Fkdl9pbnQgKworCQkJCSgobWF4X2Fkdl9pbnQgLSBtaW5fYWR2X2ludCkgKgorCQkJCSAocmFuZG9tKCkgJSAxMDAwKS8xMDAwKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmIChzb2xpY2l0ICYmIGxlZnRfdW50aWxfc29saWNpdCA8PSAwKSB7CisJCW50cmFuc21pdHRlZCsrOworCQlzb2xpY2l0b3IoJndoZXJldG8pOworCQlpZiAobnRyYW5zbWl0dGVkIDwgbWF4X3NvbGljaXRhdGlvbnMpCisJCQlsZWZ0X3VudGlsX3NvbGljaXQgPSBzb2xpY2l0YXRpb25faW50ZXJ2YWw7CisJCWVsc2UgeworCQkJc29saWNpdCA9IDA7CisJCQlpZiAoIWZvcmV2ZXIgJiYgbnJlY2VpdmVkID09IDApCisJCQkJZXhpdCg1KTsKKwkJfQorCX0KKwlhZ2VfdGFibGUoVElNRVJfSU5URVJWQUwpOworCWFsYXJtKFRJTUVSX0lOVEVSVkFMKTsKK30KKworLyoKKyAqIAkJCVMgTyBMIEkgQyBJIFQgTyBSCisgKgorICogQ29tcG9zZSBhbmQgdHJhbnNtaXQgYW4gSUNNUCBST1VURVIgU09MSUNJVEFUSU9OIFJFUVVFU1QgcGFja2V0LgorICogVGhlIElQIHBhY2tldCB3aWxsIGJlIGFkZGVkIG9uIGJ5IHRoZSBrZXJuZWwuCisgKi8KK3ZvaWQKK3NvbGljaXRvcihzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdGF0aWMgdV9jaGFyIG91dHBhY2tbTUFYUEFDS0VUXTsKKwlzdHJ1Y3QgaWNtcGhkciAqaWNwID0gKHN0cnVjdCBpY21waGRyICopIEFMTElHTihvdXRwYWNrKTsKKwlpbnQgcGFja2V0bGVuLCBpOworCisJaWYgKHZlcmJvc2UpIHsKKwkJbG9ndHJhY2UoIlNlbmRpbmcgc29saWNpdGF0aW9uIHRvICVzXG4iLAorCQkJIHByX25hbWUoc2luLT5zaW5fYWRkcikpOworCX0KKwlpY3AtPnR5cGUgPSBJQ01QX1JPVVRFUl9TT0xJQ0lUQVRJT047CisJaWNwLT5jb2RlID0gMDsKKwlpY3AtPmNoZWNrc3VtID0gMDsKKwlpY3AtPnVuLmdhdGV3YXkgPSAwOyAvKiBSZXNlcnZlZCAqLworCXBhY2tldGxlbiA9IDg7CisKKwkvKiBDb21wdXRlIElDTVAgY2hlY2tzdW0gaGVyZSAqLworCWljcC0+Y2hlY2tzdW0gPSBpbl9ja3N1bSggKHVfc2hvcnQgKilpY3AsIHBhY2tldGxlbiApOworCisJaWYgKGlzYnJvYWRjYXN0KHNpbikpCisJCWkgPSBzZW5kYmNhc3QocywgKGNoYXIgKilvdXRwYWNrLCBwYWNrZXRsZW4pOworCWVsc2UgaWYgKGlzbXVsdGljYXN0KHNpbikpCisJCWkgPSBzZW5kbWNhc3QocywgKGNoYXIgKilvdXRwYWNrLCBwYWNrZXRsZW4sIHNpbik7CisJZWxzZQorCQlpID0gc2VuZHRvKCBzLCAoY2hhciAqKW91dHBhY2ssIHBhY2tldGxlbiwgMCwKKwkJCSAgIChzdHJ1Y3Qgc29ja2FkZHIgKilzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKworCWlmKCBpIDwgMCB8fCBpICE9IHBhY2tldGxlbiApICB7CisJCWlmKCBpPDAgKSB7CisJCSAgICBsb2dwZXJyb3IoInNvbGljaXRvcjpzZW5kdG8iKTsKKwkJfQorCQlsb2dlcnIoIndyb3RlICVzICVkIGNoYXJzLCByZXQ9JWRcbiIsCisJCQlzZW5kYWRkcmVzcywgcGFja2V0bGVuLCBpICk7CisJfQorfQorCisjaWZkZWYgUkRJU0NfU0VSVkVSCisvKgorICogCQkJQSBWIEUgUiBUIEkgUyBFCisgKgorICogQ29tcG9zZSBhbmQgdHJhbnNtaXQgYW4gSUNNUCBST1VURVIgQURWRVJUSVNFTUVOVCBwYWNrZXQuCisgKiBUaGUgSVAgcGFja2V0IHdpbGwgYmUgYWRkZWQgb24gYnkgdGhlIGtlcm5lbC4KKyAqLwordm9pZAorYWR2ZXJ0aXNlKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBpbnQgbGZ0KQoreworCXN0YXRpYyB1X2NoYXIgb3V0cGFja1tNQVhQQUNLRVRdOworCXN0cnVjdCBpY21wX3JhICpyYXAgPSAoc3RydWN0IGljbXBfcmEgKikgQUxMSUdOKG91dHBhY2spOworCXN0cnVjdCBpY21wX3JhX2FkZHIgKmFwOworCWludCBwYWNrZXRsZW4sIGksIGNjOworCisJaWYgKHZlcmJvc2UpIHsKKwkJbG9ndHJhY2UoIlNlbmRpbmcgYWR2ZXJ0aXNlbWVudCB0byAlc1xuIiwKKwkJCSBwcl9uYW1lKHNpbi0+c2luX2FkZHIpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2ludGVyZmFjZXM7IGkrKykgeworCQlyYXAtPmljbXBfdHlwZSA9IElDTVBfUk9VVEVSX0FEVkVSVElTRU1FTlQ7CisJCXJhcC0+aWNtcF9jb2RlID0gMDsKKwkJcmFwLT5pY21wX2Nrc3VtID0gMDsKKwkJcmFwLT5pY21wX251bV9hZGRycyA9IDA7CisJCXJhcC0+aWNtcF93cGEgPSAyOworCQlyYXAtPmljbXBfbGlmZXRpbWUgPSBodG9ucyhsZnQpOworCQlwYWNrZXRsZW4gPSA4OworCisJCS8qCisJCSAqIFRPRE8gaGFuZGxlIG11bHRpcGxlIGxvZ2ljYWwgaW50ZXJmYWNlcyBwZXIKKwkJICogcGh5c2ljYWwgaW50ZXJmYWNlLiAoaW5jcmVtZW50IHdpdGggcmFwLT5pY21wX3dwYSAqIDQgZm9yCisJCSAqIGVhY2ggYWRkcmVzcy4pCisJCSAqLworCQlhcCA9IChzdHJ1Y3QgaWNtcF9yYV9hZGRyICopQUxMSUdOKG91dHBhY2sgKyBJQ01QX01JTkxFTik7CisJCWFwLT5pcmFfYWRkciA9IGludGVyZmFjZXNbaV0ubG9jYWxhZGRyLnNfYWRkcjsKKwkJYXAtPmlyYV9wcmVmZXJlbmNlID0gaHRvbmwoaW50ZXJmYWNlc1tpXS5wcmVmZXJlbmNlKTsKKwkJcGFja2V0bGVuICs9IHJhcC0+aWNtcF93cGEgKiA0OworCQlyYXAtPmljbXBfbnVtX2FkZHJzKys7CisKKwkJLyogQ29tcHV0ZSBJQ01QIGNoZWNrc3VtIGhlcmUgKi8KKwkJcmFwLT5pY21wX2Nrc3VtID0gaW5fY2tzdW0oICh1X3Nob3J0ICopcmFwLCBwYWNrZXRsZW4gKTsKKworCQlpZiAoaXNicm9hZGNhc3Qoc2luKSkKKwkJCWNjID0gc2VuZGJjYXN0aWYocywgKGNoYXIgKilvdXRwYWNrLCBwYWNrZXRsZW4sCisJCQkJCSZpbnRlcmZhY2VzW2ldKTsKKwkJZWxzZSBpZiAoaXNtdWx0aWNhc3Qoc2luKSkKKwkJCWNjID0gc2VuZG1jYXN0aWYoIHMsIChjaGFyICopb3V0cGFjaywgcGFja2V0bGVuLCBzaW4sCisJCQkJCSZpbnRlcmZhY2VzW2ldKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgaW50ZXJmYWNlICppZnAgPSAmaW50ZXJmYWNlc1tpXTsKKwkJCS8qCisJCQkgKiBWZXJpZnkgdGhhdCB0aGUgaW50ZXJmYWNlIG1hdGNoZXMgdGhlIGRlc3RpbmF0aW9uCisJCQkgKiBhZGRyZXNzLgorCQkJICovCisJCQlpZiAoKHNpbi0+c2luX2FkZHIuc19hZGRyICYgaWZwLT5uZXRtYXNrLnNfYWRkcikgPT0KKwkJCSAgICAoaWZwLT5hZGRyZXNzLnNfYWRkciAmIGlmcC0+bmV0bWFzay5zX2FkZHIpKSB7CisJCQkJaWYgKGRlYnVnKSB7CisJCQkJCWxvZ2RlYnVnKCJVbmljYXN0IHRvICVzICIsCisJCQkJCQkgcHJfbmFtZShzaW4tPnNpbl9hZGRyKSk7CisJCQkJCWxvZ2RlYnVnKCJvbiBpbnRlcmZhY2UgJXMsICVzXG4iLAorCQkJCQkJIGlmcC0+bmFtZSwKKwkJCQkJCSBwcl9uYW1lKGlmcC0+YWRkcmVzcykpOworCQkJCX0KKwkJCQljYyA9IHNlbmR0byggcywgKGNoYXIgKilvdXRwYWNrLCBwYWNrZXRsZW4sIDAsCisJCQkJCSAgICAoc3RydWN0IHNvY2thZGRyICopc2luLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCQkJfSBlbHNlCisJCQkJY2MgPSBwYWNrZXRsZW47CisJCX0KKwkJaWYoIGNjIDwgMCB8fCBjYyAhPSBwYWNrZXRsZW4gKSAgeworCQkJaWYgKGNjIDwgMCkgeworCQkJCWxvZ3BlcnJvcigic2VuZHRvIik7CisJCQl9IGVsc2UgeworCQkJCWxvZ2Vycigid3JvdGUgJXMgJWQgY2hhcnMsIHJldD0lZFxuIiwKKwkJCQkgICAgICAgc2VuZGFkZHJlc3MsIHBhY2tldGxlbiwgY2MgKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZgorCisvKgorICogCQkJUCBSIF8gVCBZIFAgRQorICoKKyAqIENvbnZlcnQgYW4gSUNNUCAidHlwZSIgZmllbGQgdG8gYSBwcmludGFibGUgc3RyaW5nLgorICovCitjaGFyICoKK3ByX3R5cGUoaW50IHQpCit7CisJc3RhdGljIGNoYXIgKnR0YWJbXSA9IHsKKwkJIkVjaG8gUmVwbHkiLAorCQkiSUNNUCAxIiwKKwkJIklDTVAgMiIsCisJCSJEZXN0IFVucmVhY2hhYmxlIiwKKwkJIlNvdXJjZSBRdWVuY2giLAorCQkiUmVkaXJlY3QiLAorCQkiSUNNUCA2IiwKKwkJIklDTVAgNyIsCisJCSJFY2hvIiwKKwkJIlJvdXRlciBBZHZlcnRpc2UiLAorCQkiUm91dGVyIFNvbGljaXRhdGlvbiIsCisJCSJUaW1lIEV4Y2VlZGVkIiwKKwkJIlBhcmFtZXRlciBQcm9ibGVtIiwKKwkJIlRpbWVzdGFtcCIsCisJCSJUaW1lc3RhbXAgUmVwbHkiLAorCQkiSW5mbyBSZXF1ZXN0IiwKKwkJIkluZm8gUmVwbHkiLAorCQkiTmV0bWFzayBSZXF1ZXN0IiwKKwkJIk5ldG1hc2sgUmVwbHkiCisJfTsKKworCWlmICggdCA8IDAgfHwgdCA+IDE2ICkKKwkJcmV0dXJuKCJPVVQtT0YtUkFOR0UiKTsKKworCXJldHVybih0dGFiW3RdKTsKK30KKworLyoKKyAqCQkJUCBSIF8gTiBBIE0gRQorICoKKyAqIFJldHVybiBhIHN0cmluZyBuYW1lIGZvciB0aGUgZ2l2ZW4gSVAgYWRkcmVzcy4KKyAqLworY2hhciAqcHJfbmFtZShzdHJ1Y3QgaW5fYWRkciBhZGRyKQoreworCXN0cnVjdCBob3N0ZW50ICpwaGU7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKworCXBoZSA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmYWRkci5zX2FkZHIsIDQsIEFGX0lORVQpOworCWlmIChwaGUgPT0gTlVMTCkKKwkJcmV0dXJuKCBpbmV0X250b2EoYWRkcikpOworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyAoJXMpIiwgcGhlLT5oX25hbWUsIGluZXRfbnRvYShhZGRyKSk7CisJcmV0dXJuKGJ1Zik7Cit9CisKKy8qCisgKgkJCVAgUiBfIFAgQSBDIEsKKyAqCisgKiBQcmludCBvdXQgdGhlIHBhY2tldCwgaWYgaXQgY2FtZSBmcm9tIHVzLiAgVGhpcyBsb2dpYyBpcyBuZWNlc3NhcnkKKyAqIGJlY2F1c2UgQUxMIHJlYWRlcnMgb2YgdGhlIElDTVAgc29ja2V0IGdldCBhIGNvcHkgb2YgQUxMIElDTVAgcGFja2V0cworICogd2hpY2ggYXJyaXZlICgndGlzIG9ubHkgZmFpcikuICBUaGlzIHBlcm1pdHMgbXVsdGlwbGUgY29waWVzIG9mIHRoaXMKKyAqIHByb2dyYW0gdG8gYmUgcnVuIHdpdGhvdXQgaGF2aW5nIGludGVybWluZ2xlZCBvdXRwdXQgKG9yIHN0YXRpc3RpY3MhKS4KKyAqLwordm9pZAorcHJfcGFjayhjaGFyICpidWYsIGludCBjYywgc3RydWN0IHNvY2thZGRyX2luICpmcm9tKQoreworCXN0cnVjdCBpcGhkciAqaXA7CisJc3RydWN0IGljbXBoZHIgKmljcDsKKwlpbnQgaTsKKwlpbnQgaGxlbjsKKworCWlwID0gKHN0cnVjdCBpcGhkciAqKSBBTExJR04oYnVmKTsKKwlobGVuID0gaXAtPmlobCA8PCAyOworCWlmIChjYyA8IGhsZW4gKyA4KSB7CisJCWlmICh2ZXJib3NlKQorCQkJbG9ndHJhY2UoInBhY2tldCB0b28gc2hvcnQgKCVkIGJ5dGVzKSBmcm9tICVzXG4iLCBjYywKKwkJCQkgcHJfbmFtZShmcm9tLT5zaW5fYWRkcikpOworCQlyZXR1cm47CisJfQorCWNjIC09IGhsZW47CisJaWNwID0gKHN0cnVjdCBpY21waGRyICopQUxMSUdOKGJ1ZiArIGhsZW4pOworCisJc3dpdGNoIChpY3AtPnR5cGUpIHsKKwljYXNlIElDTVBfUk9VVEVSX0FEVkVSVElTRU1FTlQ6CisJeworCQlzdHJ1Y3QgaWNtcF9yYSAqcmFwID0gKHN0cnVjdCBpY21wX3JhICopQUxMSUdOKGljcCk7CisJCXN0cnVjdCBpY21wX3JhX2FkZHIgKmFwOworCisjaWZkZWYgUkRJU0NfU0VSVkVSCisJCWlmIChyZXNwb25kZXIpCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8qIFRCRCB2ZXJpZnkgdGhhdCB0aGUgbGluayBpcyBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCisJCS8qIFhYWCBGaW5kIG91dCB0aGUgbGluayBpdCBjYW1lIGluIG92ZXI/ICovCisJCWlmIChpbl9ja3N1bSgodV9zaG9ydCAqKUFMTElHTihidWYraGxlbiksIGNjKSkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJbG9ndHJhY2UoIklDTVAgJXMgZnJvbSAlczogQmFkIGNoZWNrc3VtXG4iLAorCQkJCQkgcHJfdHlwZSgoaW50KXJhcC0+aWNtcF90eXBlKSwKKwkJCQkJIHByX25hbWUoZnJvbS0+c2luX2FkZHIpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocmFwLT5pY21wX2NvZGUgIT0gMCkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJbG9ndHJhY2UoIklDTVAgJXMgZnJvbSAlczogQ29kZSA9ICVkXG4iLAorCQkJCQkgcHJfdHlwZSgoaW50KXJhcC0+aWNtcF90eXBlKSwKKwkJCQkJIHByX25hbWUoZnJvbS0+c2luX2FkZHIpLAorCQkJCQkgcmFwLT5pY21wX2NvZGUpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChyYXAtPmljbXBfbnVtX2FkZHJzIDwgMSkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJbG9ndHJhY2UoIklDTVAgJXMgZnJvbSAlczogTm8gYWRkcmVzc2VzXG4iLAorCQkJCQkgcHJfdHlwZSgoaW50KXJhcC0+aWNtcF90eXBlKSwKKwkJCQkJIHByX25hbWUoZnJvbS0+c2luX2FkZHIpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocmFwLT5pY21wX3dwYSA8IDIpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCWxvZ3RyYWNlKCJJQ01QICVzIGZyb20gJXM6IFdvcmRzL2FkZHIgPSAlZFxuIiwKKwkJCQkJIHByX3R5cGUoKGludClyYXAtPmljbXBfdHlwZSksCisJCQkJCSBwcl9uYW1lKGZyb20tPnNpbl9hZGRyKSwKKwkJCQkJIHJhcC0+aWNtcF93cGEpOworCQkJcmV0dXJuOworCQl9CisJCWlmICgodW5zaWduZWQpY2MgPAorCQkgICAgOCArIHJhcC0+aWNtcF9udW1fYWRkcnMgKiByYXAtPmljbXBfd3BhICogNCkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJbG9ndHJhY2UoIklDTVAgJXMgZnJvbSAlczogVG9vIHNob3J0ICVkLCAlZFxuIiwKKwkJCQkJICAgICAgcHJfdHlwZSgoaW50KXJhcC0+aWNtcF90eXBlKSwKKwkJCQkJICAgICAgcHJfbmFtZShmcm9tLT5zaW5fYWRkciksCisJCQkJCSAgICAgIGNjLAorCQkJCQkgICAgICA4ICsgcmFwLT5pY21wX251bV9hZGRycyAqIHJhcC0+aWNtcF93cGEgKiA0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICh2ZXJib3NlKQorCQkJbG9ndHJhY2UoIklDTVAgJXMgZnJvbSAlcywgbGlmZXRpbWUgJWRcbiIsCisJCQkJICAgICAgcHJfdHlwZSgoaW50KXJhcC0+aWNtcF90eXBlKSwKKwkJCQkgICAgICBwcl9uYW1lKGZyb20tPnNpbl9hZGRyKSwKKwkJCQkgICAgICBudG9ocyhyYXAtPmljbXBfbGlmZXRpbWUpKTsKKworCQkvKiBDaGVjayB0aGF0IGF0IGxlYXN0IG9uZSByb3V0ZXIgYWRkcmVzcyBpcyBhIG5laWdoYm9vcgorCQkgKiBvbiB0aGUgYXJyaXZpbmcgbGluay4KKwkJICovCisJCWZvciAoaSA9IDA7ICh1bnNpZ25lZClpIDwgcmFwLT5pY21wX251bV9hZGRyczsgaSsrKSB7CisJCQlzdHJ1Y3QgaW5fYWRkciBpbmE7CisJCQlhcCA9IChzdHJ1Y3QgaWNtcF9yYV9hZGRyICopCisJCQkJQUxMSUdOKGJ1ZiArIGhsZW4gKyA4ICsKKwkJCQkgICAgICAgaSAqIHJhcC0+aWNtcF93cGEgKiA0KTsKKwkJCWluYS5zX2FkZHIgPSBhcC0+aXJhX2FkZHI7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlsb2d0cmFjZSgiXHRhZGRyZXNzICVzLCBwcmVmZXJlbmNlIDB4JXhcbiIsCisJCQkJCSAgICAgIHByX25hbWUoaW5hKSwKKwkJCQkJICAgICAgKHVuc2lnbmVkIGludCludG9obChhcC0+aXJhX3ByZWZlcmVuY2UpKTsKKwkJCWlmIChpc19kaXJlY3RseV9jb25uZWN0ZWQoaW5hKSkKKwkJCQlyZWNvcmRfcm91dGVyKGluYSwKKwkJCQkJICAgICAgbnRvaGwoYXAtPmlyYV9wcmVmZXJlbmNlKSwKKwkJCQkJICAgICAgbnRvaHMocmFwLT5pY21wX2xpZmV0aW1lKSk7CisJCX0KKwkJbnJlY2VpdmVkKys7CisJCWlmICghZm9yZXZlcikgeworCQkJZG9fZm9yaygpOworCQkJZm9yZXZlciA9IDE7CisvKgorICogVGhlIG5leHQgbGluZSB3YXMgYWRkZWQgc28gdGhhdCB0aGUgYWxhcm0gaXMgc2V0IGZvciB0aGUgbmV3IHByb2NjZXMKKyAqIEZyYXNlciBHYXJkaW5lciBTdW4gTWljcm9zeXN0ZW1zIEF1c3RyYWxpYQorICovCisJCQkodm9pZCkgYWxhcm0oVElNRVJfSU5URVJWQUwpOworCQl9CisJCWJyZWFrOworCX0KKworI2lmZGVmIFJESVNDX1NFUlZFUgorCWNhc2UgSUNNUF9ST1VURVJfU09MSUNJVEFUSU9OOgorCXsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCQlpZiAoIXJlc3BvbmRlcikKKwkJCWJyZWFrOworCisJCS8qIFRCRCB2ZXJpZnkgdGhhdCB0aGUgbGluayBpcyBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCisJCS8qIFhYWCBGaW5kIG91dCB0aGUgbGluayBpdCBjYW1lIGluIG92ZXI/ICovCisKKwkJaWYgKGluX2Nrc3VtKCh1X3Nob3J0ICopQUxMSUdOKGJ1ZitobGVuKSwgY2MpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlsb2d0cmFjZSgiSUNNUCAlcyBmcm9tICVzOiBCYWQgY2hlY2tzdW1cbiIsCisJCQkJCSAgICAgIHByX3R5cGUoKGludClpY3AtPnR5cGUpLAorCQkJCQkgICAgICBwcl9uYW1lKGZyb20tPnNpbl9hZGRyKSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGljcC0+Y29kZSAhPSAwKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlsb2d0cmFjZSgiSUNNUCAlcyBmcm9tICVzOiBDb2RlID0gJWRcbiIsCisJCQkJCSAgICAgIHByX3R5cGUoKGludClpY3AtPnR5cGUpLAorCQkJCQkgICAgICBwcl9uYW1lKGZyb20tPnNpbl9hZGRyKSwKKwkJCQkJICAgICAgaWNwLT5jb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjYyA8IElDTVBfTUlOTEVOKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlsb2d0cmFjZSgiSUNNUCAlcyBmcm9tICVzOiBUb28gc2hvcnQgJWQsICVkXG4iLAorCQkJCQkgICAgICBwcl90eXBlKChpbnQpaWNwLT50eXBlKSwKKwkJCQkJICAgICAgcHJfbmFtZShmcm9tLT5zaW5fYWRkciksCisJCQkJCSAgICAgIGNjLAorCQkJCQkgICAgICBJQ01QX01JTkxFTik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAodmVyYm9zZSkKKwkJCWxvZ3RyYWNlKCJJQ01QICVzIGZyb20gJXNcbiIsCisJCQkJICAgICAgcHJfdHlwZSgoaW50KWljcC0+dHlwZSksCisJCQkJICAgICAgcHJfbmFtZShmcm9tLT5zaW5fYWRkcikpOworCisJCS8qIENoZWNrIHRoYXQgaXBfc3JjIGlzIGVpdGhlciBhIG5laWdoYm9vcgorCQkgKiBvbiB0aGUgYXJyaXZpbmcgbGluayBvciAwLgorCQkgKi8KKwkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlpZiAoaXAtPnNhZGRyID09IDApIHsKKwkJCS8qIElmIGl0IHdhcyBzZW50IHRvIHRoZSBicm9hZGNhc3QgYWRkcmVzcyB3ZSByZXNwb25kCisJCQkgKiB0byB0aGUgYnJvYWRjYXN0IGFkZHJlc3MuCisJCQkgKi8KKwkJCWlmIChJTl9DTEFTU0QobnRvaGwoaXAtPmRhZGRyKSkpCisJCQkJc2luLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKDB4ZTAwMDAwMDEpOworCQkJZWxzZQorCQkJCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQlJPQURDQVNUOworCQkJLyogUmVzdGFydCB0aGUgdGltZXIgd2hlbiB3ZSBicm9hZGNhc3QgKi8KKwkJCWxlZnRfdW50aWxfYWR2ZXJ0aXNlID0gbWluX2Fkdl9pbnQgKworCQkJCSgobWF4X2Fkdl9pbnQgLSBtaW5fYWR2X2ludCkKKwkJCQkgKiAocmFuZG9tKCkgJSAxMDAwKS8xMDAwKTsKKwkJfSBlbHNlIHsKKwkJCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBpcC0+c2FkZHI7CisJCQlpZiAoIWlzX2RpcmVjdGx5X2Nvbm5lY3RlZChzaW4uc2luX2FkZHIpKSB7CisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCWxvZ3RyYWNlKCJJQ01QICVzIGZyb20gJXM6IHNvdXJjZSBub3QgZGlyZWN0bHkgY29ubmVjdGVkXG4iLAorCQkJCQkJICAgICAgcHJfdHlwZSgoaW50KWljcC0+dHlwZSksCisJCQkJCQkgICAgICBwcl9uYW1lKGZyb20tPnNpbl9hZGRyKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbnJlY2VpdmVkKys7CisJCW50cmFuc21pdHRlZCsrOworCQlhZHZlcnRpc2UoJnNpbiwgbGlmZXRpbWUpOworCQlicmVhazsKKwl9CisjZW5kaWYKKwl9Cit9CisKKworLyoKKyAqCQkJSSBOIF8gQyBLIFMgVSBNCisgKgorICogQ2hlY2tzdW0gcm91dGluZSBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgZmFtaWx5IGhlYWRlcnMgKEMgVmVyc2lvbikKKyAqCisgKi8KKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIE9EREJZVEUodikJKHYpCisjZWxpZiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKyMgZGVmaW5lIE9EREJZVEUodikJKCh1X3Nob3J0KSh2KSA8PCA4KQorI2Vsc2UKKyMgZGVmaW5lIE9EREJZVEUodikJaHRvbnMoKHVfc2hvcnQpKHYpIDw8IDgpCisjZW5kaWYKKwordV9zaG9ydCBpbl9ja3N1bSh1X3Nob3J0ICphZGRyLCBpbnQgbGVuKQoreworCXJlZ2lzdGVyIGludCBubGVmdCA9IGxlbjsKKwlyZWdpc3RlciB1X3Nob3J0ICp3ID0gYWRkcjsKKwlyZWdpc3RlciB1X3Nob3J0IGFuc3dlcjsKKwlyZWdpc3RlciBpbnQgc3VtID0gMDsKKworCS8qCisJICogIE91ciBhbGdvcml0aG0gaXMgc2ltcGxlLCB1c2luZyBhIDMyIGJpdCBhY2N1bXVsYXRvciAoc3VtKSwKKwkgKiAgd2UgYWRkIHNlcXVlbnRpYWwgMTYgYml0IHdvcmRzIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCwgZm9sZAorCSAqICBiYWNrIGFsbCB0aGUgY2FycnkgYml0cyBmcm9tIHRoZSB0b3AgMTYgYml0cyBpbnRvIHRoZSBsb3dlcgorCSAqICAxNiBiaXRzLgorCSAqLworCXdoaWxlKCBubGVmdCA+IDEgKSAgeworCQlzdW0gKz0gKncrKzsKKwkJbmxlZnQgLT0gMjsKKwl9CisKKwkvKiBtb3AgdXAgYW4gb2RkIGJ5dGUsIGlmIG5lY2Vzc2FyeSAqLworCWlmKCBubGVmdCA9PSAxICkKKwkJc3VtICs9IE9EREJZVEUoKih1X2NoYXIgKil3KTsJLyogbGUxNnRvaCgpIG1heSBiZSB1bmF2YWlsYWJsZSBvbiBvbGQgc3lzdGVtcyAqLworCisJLyoKKwkgKiBhZGQgYmFjayBjYXJyeSBvdXRzIGZyb20gdG9wIDE2IGJpdHMgdG8gbG93IDE2IGJpdHMKKwkgKi8KKwlzdW0gPSAoc3VtID4+IDE2KSArIChzdW0gJiAweGZmZmYpOwkvKiBhZGQgaGkgMTYgdG8gbG93IDE2ICovCisJc3VtICs9IChzdW0gPj4gMTYpOwkJCS8qIGFkZCBjYXJyeSAqLworCWFuc3dlciA9IH5zdW07CQkJCS8qIHRydW5jYXRlIHRvIDE2IGJpdHMgKi8KKwlyZXR1cm4gKGFuc3dlcik7Cit9CisKKy8qCisgKgkJCUYgSSBOIEkgUyBICisgKgorICogUHJpbnQgb3V0IHN0YXRpc3RpY3MsIGFuZCBnaXZlIHVwLgorICogSGVhdmlseSBidWZmZXJlZCBTVERJTyBpcyB1c2VkIGhlcmUsIHNvIHRoYXQgYWxsIHRoZSBzdGF0aXN0aWNzCisgKiB3aWxsIGJlIHdyaXR0ZW4gd2l0aCAxIHN5cy13cml0ZSBjYWxsLiAgVGhpcyBpcyBuaWNlIHdoZW4gbW9yZQorICogdGhhbiBvbmUgY29weSBvZiB0aGUgcHJvZ3JhbSBpcyBydW5uaW5nIG9uIGEgdGVybWluYWw7ICBpdCBwcmV2ZW50cworICogdGhlIHN0YXRpc3RpY3Mgb3V0cHV0IGZyb20gYmVjb21taW5nIGludGVybWluZ2xlZC4KKyAqLwordm9pZAorZmluaXNoKCkKK3sKKyNpZmRlZiBSRElTQ19TRVJWRVIKKwlpZiAocmVzcG9uZGVyKSB7CisJCS8qIFNlbmQgb3V0IGEgcGFja2V0IHdpdGggYSBwcmVmZXJlbmNlIHNvIHRoYXQgYWxsCisJCSAqIGhvc3RzIHdpbGwga25vdyB0aGF0IHdlIGFyZSBkZWFkLgorCQkgKgorCQkgKiBXcm9uZyBjb21tZW50LCB3cm9uZyBjb2RlLgorCQkgKgl0dGwgbXVzdCBiZSBzZXQgdG8gMCBpbnN0ZWFkLiAtLUFOSworCQkgKi8KKwkJbG9nZXJyKCJ0ZXJtaW5hdGVkXG4iKTsKKwkJbnRyYW5zbWl0dGVkKys7CisJCWFkdmVydGlzZSgmd2hlcmV0bywgMCk7CisJfQorI2VuZGlmCisJbG9ndHJhY2UoIlxuLS0tLSVzIHJkaXNjIFN0YXRpc3RpY3MtLS0tXG4iLCBzZW5kYWRkcmVzcyApOworCWxvZ3RyYWNlKCIlZCBwYWNrZXRzIHRyYW5zbWl0dGVkLCAiLCBudHJhbnNtaXR0ZWQgKTsKKwlsb2d0cmFjZSgiJWQgcGFja2V0cyByZWNlaXZlZCwgIiwgbnJlY2VpdmVkICk7CisJbG9ndHJhY2UoIlxuIik7CisJKHZvaWQpIGZmbHVzaChzdGRvdXQpOworCWV4aXQoMCk7Cit9CisKK3ZvaWQKK2dyYWNlZnVsX2ZpbmlzaCgpCit7CisJZGlzY2FyZF90YWJsZSgpOworCWZpbmlzaCgpOworCWV4aXQoMCk7Cit9CisKKworLyogRnJvbSBsaWJjL3JwYy9wbWFwX3JtdC5jICovCisKK2ludAorc2VuZGJjYXN0KGludCBzLCBjaGFyICpwYWNrZXQsIGludCBwYWNrZXRsZW4pCit7CisJaW50IGksIGNjOworCisJZm9yIChpID0gMDsgaSA8IG51bV9pbnRlcmZhY2VzOyBpKyspIHsKKwkJaWYgKChpbnRlcmZhY2VzW2ldLmZsYWdzICYgKElGRl9CUk9BRENBU1R8SUZGX1BPSU5UT1BPSU5UKSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQljYyA9IHNlbmRiY2FzdGlmKHMsIHBhY2tldCwgcGFja2V0bGVuLCAmaW50ZXJmYWNlc1tpXSk7CisJCWlmIChjYyE9IHBhY2tldGxlbikgeworCQkJcmV0dXJuIChjYyk7CisJCX0KKwl9CisJcmV0dXJuIChwYWNrZXRsZW4pOworfQorCitpbnQKK3NlbmRiY2FzdGlmKGludCBzLCBjaGFyICpwYWNrZXQsIGludCBwYWNrZXRsZW4sIHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKwlpbnQgb247CisJaW50IGNjOworCXN0cnVjdCBzb2NrYWRkcl9pbiBiYWRkcjsKKworCWJhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWJhZGRyLnNpbl9hZGRyID0gaWZwLT5iY2FzdGFkZHI7CisJaWYgKGRlYnVnKQorCQlsb2dkZWJ1ZygiQnJvYWRjYXN0IHRvICVzXG4iLAorCQkJIHByX25hbWUoYmFkZHIuc2luX2FkZHIpKTsKKwlvbiA9IDE7CisJc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsIChjaGFyKikmb24sIHNpemVvZihvbikpOworCWNjID0gc2VuZHRvKHMsIHBhY2tldCwgcGFja2V0bGVuLCAwLAorCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZiYWRkciwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpKTsKKwlpZiAoY2MhPSBwYWNrZXRsZW4pIHsKKwkJbG9ncGVycm9yKCJzZW5kYmNhc3Q6IHNlbmR0byIpOworCQlsb2dlcnIoIkNhbm5vdCBzZW5kIGJyb2FkY2FzdCBwYWNrZXQgdG8gJXNcbiIsCisJCSAgICAgICBwcl9uYW1lKGJhZGRyLnNpbl9hZGRyKSk7CisJfQorCW9uID0gMDsKKwlzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwgKGNoYXIqKSZvbiwgc2l6ZW9mKG9uKSk7CisJcmV0dXJuIChjYyk7Cit9CisKK2ludAorc2VuZG1jYXN0KGludCBzLCBjaGFyICpwYWNrZXQsIGludCBwYWNrZXRsZW4sIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCWludCBpLCBjYzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1faW50ZXJmYWNlczsgaSsrKSB7CisJCWlmICgoaW50ZXJmYWNlc1tpXS5mbGFncyAmIChJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVHxJRkZfTVVMVElDQVNUKSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQljYyA9IHNlbmRtY2FzdGlmKHMsIHBhY2tldCwgcGFja2V0bGVuLCBzaW4sICZpbnRlcmZhY2VzW2ldKTsKKwkJaWYgKGNjIT0gcGFja2V0bGVuKSB7CisJCQlyZXR1cm4gKGNjKTsKKwkJfQorCX0KKwlyZXR1cm4gKHBhY2tldGxlbik7Cit9CisKK2ludAorc2VuZG1jYXN0aWYoaW50IHMsIGNoYXIgKnBhY2tldCwgaW50IHBhY2tldGxlbiwJc3RydWN0IHNvY2thZGRyX2luICpzaW4sCisJICAgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKwlpbnQgY2M7CisJc3RydWN0IGlwX21yZXFuIG1yZXE7CisKKwltZW1zZXQoJm1yZXEsIDAsIHNpemVvZihtcmVxKSk7CisJbXJlcS5pbXJfaWZpbmRleCA9IGlmcC0+aWZpbmRleDsKKwltcmVxLmltcl9hZGRyZXNzID0gaWZwLT5sb2NhbGFkZHI7CisJaWYgKGRlYnVnKQorCQlsb2dkZWJ1ZygiTXVsdGljYXN0IHRvIGludGVyZmFjZSAlcywgJXNcbiIsCisJCQkgaWZwLT5uYW1lLAorCQkJIHByX25hbWUobXJlcS5pbXJfYWRkcmVzcykpOworCWlmIChzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9JRiwKKwkJICAgICAgIChjaGFyICopJm1yZXEsCisJCSAgICAgICBzaXplb2YobXJlcSkpIDwgMCkgeworCQlsb2dwZXJyb3IoInNldHNvY2tvcHQgKElQX01VTFRJQ0FTVF9JRikiKTsKKwkJbG9nZXJyKCJDYW5ub3Qgc2VuZCBtdWx0aWNhc3QgcGFja2V0IG92ZXIgaW50ZXJmYWNlICVzLCAlc1xuIiwKKwkJICAgICAgIGlmcC0+bmFtZSwKKwkJICAgICAgIHByX25hbWUobXJlcS5pbXJfYWRkcmVzcykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJY2MgPSBzZW5kdG8ocywgcGFja2V0LCBwYWNrZXRsZW4sIDAsCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopc2luLCBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikpOworCWlmIChjYyE9IHBhY2tldGxlbikgeworCQlsb2dwZXJyb3IoInNlbmRtY2FzdDogc2VuZHRvIik7CisJCWxvZ2VycigiQ2Fubm90IHNlbmQgbXVsdGljYXN0IHBhY2tldCBvdmVyIGludGVyZmFjZSAlcywgJXNcbiIsCisJCSAgICAgICBpZnAtPm5hbWUsIHByX25hbWUobXJlcS5pbXJfYWRkcmVzcykpOworCX0KKwlyZXR1cm4gKGNjKTsKK30KKwordm9pZAoraW5pdCgpCit7CisJaW5pdGlmcygpOworI2lmZGVmIFJESVNDX1NFUlZFUgorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2VzX3NpemU7IGkrKykKKwkJCWludGVyZmFjZXNbaV0ucHJlZmVyZW5jZSA9IHByZWZlcmVuY2U7CisJfQorI2VuZGlmCit9CisKK3ZvaWQKK2luaXRpZnMoKQoreworCWludAlzb2NrOworCXN0cnVjdCBpZmNvbmYgaWZjOworCXN0cnVjdCBpZnJlcSBpZnJlcSwgKmlmcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwlpbnQgbiwgaTsKKwljaGFyICpidWY7CisJaW50IG51bWlmczsKKwl1bnNpZ25lZCBidWZzaXplOworCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoc29jayA8IDApIHsKKwkJbG9ncGVycm9yKCJpbml0aWZzOiBzb2NrZXQiKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBTSU9DR0lGTlVNCisJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZOVU0sIChjaGFyICopJm51bWlmcykgPCAwKSB7CisJCW51bWlmcyA9IE1BWElGUzsKKwl9CisjZWxzZQorCW51bWlmcyA9IE1BWElGUzsKKyNlbmRpZgorCWJ1ZnNpemUgPSBudW1pZnMgKiBzaXplb2Yoc3RydWN0IGlmcmVxKTsKKwlidWYgPSAoY2hhciAqKW1hbGxvYyhidWZzaXplKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJbG9nZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJKHZvaWQpIGNsb3NlKHNvY2spOworCQlyZXR1cm47CisJfQorCWlmIChpbnRlcmZhY2VzICE9IE5VTEwpCisJCSh2b2lkKSBmcmVlKGludGVyZmFjZXMpOworCWludGVyZmFjZXMgPSAoc3RydWN0IGludGVyZmFjZSAqKUFMTElHTihtYWxsb2MobnVtaWZzICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpbnRlcmZhY2UpKSk7CisJaWYgKGludGVyZmFjZXMgPT0gTlVMTCkgeworCQlsb2dlcnIoIm91dCBvZiBtZW1vcnlcbiIpOworCQkodm9pZCkgY2xvc2Uoc29jayk7CisJCSh2b2lkKSBmcmVlKGJ1Zik7CisJCXJldHVybjsKKwl9CisJaW50ZXJmYWNlc19zaXplID0gbnVtaWZzOworCisJaWZjLmlmY19sZW4gPSBidWZzaXplOworCWlmYy5pZmNfYnVmID0gYnVmOworCWlmIChpb2N0bChzb2NrLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKKwkJbG9ncGVycm9yKCJpbml0aWZzOiBpb2N0bCAoZ2V0IGludGVyZmFjZSBjb25maWd1cmF0aW9uKSIpOworCQkodm9pZCkgY2xvc2Uoc29jayk7CisJCSh2b2lkKSBmcmVlKGJ1Zik7CisJCXJldHVybjsKKwl9CisJaWZyID0gaWZjLmlmY19yZXE7CisJZm9yIChpID0gMCwgbiA9IGlmYy5pZmNfbGVuL3NpemVvZiAoc3RydWN0IGlmcmVxKTsgbiA+IDA7IG4tLSwgaWZyKyspIHsKKwkJaWZyZXEgPSAqaWZyOworCQlpZiAoc3RybGVuKGlmcmVxLmlmcl9uYW1lKSA+PSBJRk5BTVNJWikKKwkJCWNvbnRpbnVlOworCQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnJlcSkgPCAwKSB7CisJCQlsb2dwZXJyb3IoImluaXRpZnM6IGlvY3RsIChnZXQgaW50ZXJmYWNlIGZsYWdzKSIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGlmci0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpCisJCQljb250aW51ZTsKKwkJaWYgKChpZnJlcS5pZnJfZmxhZ3MgJiBJRkZfVVApID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKGlmcmVxLmlmcl9mbGFncyAmIElGRl9MT09QQkFDSykKKwkJCWNvbnRpbnVlOworCQlpZiAoKGlmcmVxLmlmcl9mbGFncyAmIChJRkZfTVVMVElDQVNUfElGRl9CUk9BRENBU1R8SUZGX1BPSU5UT1BPSU5UKSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzdHJuY3B5KGludGVyZmFjZXNbaV0ubmFtZSwgaWZyLT5pZnJfbmFtZSwgSUZOQU1TSVotMSk7CisKKwkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKUFMTElHTigmaWZyLT5pZnJfYWRkcik7CisJCWludGVyZmFjZXNbaV0ubG9jYWxhZGRyID0gc2luLT5zaW5fYWRkcjsKKwkJaW50ZXJmYWNlc1tpXS5mbGFncyA9IGlmcmVxLmlmcl9mbGFnczsKKwkJaW50ZXJmYWNlc1tpXS5uZXRtYXNrLnNfYWRkciA9IChfX3UzMikweGZmZmZmZmZmOworCQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRklOREVYLCAoY2hhciAqKSZpZnJlcSkgPCAwKSB7CisJCQlsb2dwZXJyb3IoImluaXRpZnM6IGlvY3RsIChnZXQgaWZpbmRleCkiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWludGVyZmFjZXNbaV0uaWZpbmRleCA9IGlmcmVxLmlmcl9pZmluZGV4OworCQlpZiAoaWZyZXEuaWZyX2ZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSB7CisJCQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkRTVEFERFIsIChjaGFyICopJmlmcmVxKSA8IDApIHsKKwkJCQlsb2dwZXJyb3IoImluaXRpZnM6IGlvY3RsIChnZXQgZGVzdGluYXRpb24gYWRkcikiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilBTExJR04oJmlmcmVxLmlmcl9hZGRyKTsKKwkJCS8qIEEgcHQtcHQgbGluayBpcyBpZGVudGlmaWVkIGJ5IHRoZSByZW1vdGUgYWRkcmVzcyAqLworCQkJaW50ZXJmYWNlc1tpXS5hZGRyZXNzID0gc2luLT5zaW5fYWRkcjsKKwkJCWludGVyZmFjZXNbaV0ucmVtb3RlYWRkciA9IHNpbi0+c2luX2FkZHI7CisJCQkvKiBTaW11bGF0ZSBicm9hZGNhc3QgZm9yIHB0LXB0ICovCisJCQlpbnRlcmZhY2VzW2ldLmJjYXN0YWRkciA9IHNpbi0+c2luX2FkZHI7CisJCQlpbnRlcmZhY2VzW2ldLmZsYWdzIHw9IElGRl9CUk9BRENBU1Q7CisJCX0gZWxzZSB7CisJCQkvKiBOb24gcHQtcHQgbGlua3MgYXJlIGlkZW50aWZpZWQgYnkgdGhlIGxvY2FsIGFkZHJlc3MgKi8KKwkJCWludGVyZmFjZXNbaV0uYWRkcmVzcyA9IGludGVyZmFjZXNbaV0ubG9jYWxhZGRyOworCQkJaW50ZXJmYWNlc1tpXS5yZW1vdGVhZGRyID0gaW50ZXJmYWNlc1tpXS5hZGRyZXNzOworCQkJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZORVRNQVNLLCAoY2hhciAqKSZpZnJlcSkgPCAwKSB7CisJCQkJbG9ncGVycm9yKCJpbml0aWZzOiBpb2N0bCAoZ2V0IG5ldG1hc2spIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopQUxMSUdOKCZpZnJlcS5pZnJfYWRkcik7CisJCQlpbnRlcmZhY2VzW2ldLm5ldG1hc2sgPSBzaW4tPnNpbl9hZGRyOworCQkJaWYgKGlmcmVxLmlmcl9mbGFncyAmIElGRl9CUk9BRENBU1QpIHsKKwkJCQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkJSREFERFIsIChjaGFyICopJmlmcmVxKSA8IDApIHsKKwkJCQkJbG9ncGVycm9yKCJpbml0aWZzOiBpb2N0bCAoZ2V0IGJyb2FkY2FzdCBhZGRyZXNzKSIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKUFMTElHTigmaWZyZXEuaWZyX2FkZHIpOworCQkJCWludGVyZmFjZXNbaV0uYmNhc3RhZGRyID0gc2luLT5zaW5fYWRkcjsKKwkJCX0KKwkJfQorI2lmZGVmIG5vdGRlZgorCQlpZiAoZGVidWcpCisJCQlsb2dkZWJ1ZygiRm91bmQgaW50ZXJmYWNlICVzLCBmbGFncyAweCV4XG4iLAorCQkJCSBwcl9uYW1lKGludGVyZmFjZXNbaV0ubG9jYWxhZGRyKSwKKwkJCQkgaW50ZXJmYWNlc1tpXS5mbGFncyk7CisjZW5kaWYKKwkJaSsrOworCX0KKwludW1faW50ZXJmYWNlcyA9IGk7CisjaWZkZWYgbm90ZGVmCisJaWYgKGRlYnVnKQorCQlsb2dkZWJ1ZygiRm91bmQgJWQgaW50ZXJmYWNlc1xuIiwgbnVtX2ludGVyZmFjZXMpOworI2VuZGlmCisJKHZvaWQpIGNsb3NlKHNvY2spOworCSh2b2lkKSBmcmVlKGJ1Zik7Cit9CisKK2ludAoram9pbihpbnQgc29jaywgc3RydWN0IHNvY2thZGRyX2luICpzaW4pCit7CisJaW50IGksIGo7CisJc3RydWN0IGlwX21yZXFuIG1yZXE7CisJaW50IGpvaW5lZFtudW1faW50ZXJmYWNlc107CisKKwltZW1zZXQoam9pbmVkLCAwLCBzaXplb2Yoam9pbmVkKSk7CisKKwlpZiAoaXNicm9hZGNhc3Qoc2luKSkKKwkJcmV0dXJuICgwKTsKKworCW1yZXEuaW1yX211bHRpYWRkciA9IHNpbi0+c2luX2FkZHI7CisJZm9yIChpID0gMDsgaSA8IG51bV9pbnRlcmZhY2VzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJaWYgKGpvaW5lZFtqXSA9PSBpbnRlcmZhY2VzW2ldLmlmaW5kZXgpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogIT0gaSkKKwkJCWNvbnRpbnVlOworCisJCW1yZXEuaW1yX2lmaW5kZXggPSBpbnRlcmZhY2VzW2ldLmlmaW5kZXg7CisJCW1yZXEuaW1yX2FkZHJlc3Muc19hZGRyID0gMDsKKworCQlpZiAoc2V0c29ja29wdChzb2NrLCBJUFBST1RPX0lQLCBJUF9BRERfTUVNQkVSU0hJUCwKKwkJCSAgICAgICAoY2hhciAqKSZtcmVxLCBzaXplb2YobXJlcSkpIDwgMCkgeworCQkJbG9ncGVycm9yKCJzZXRzb2Nrb3B0IChJUF9BRERfTUVNQkVSU0hJUCkiKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisKKwkJam9pbmVkW2ldID0gaW50ZXJmYWNlc1tpXS5pZmluZGV4OworCX0KKwlyZXR1cm4gKDApOworfQorCitpbnQgc3VwcG9ydF9tdWx0aWNhc3QoKQoreworCWludCBzb2NrOworCXVfY2hhciB0dGwgPSAxOworCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKHNvY2sgPCAwKSB7CisJCWxvZ3BlcnJvcigic3VwcG9ydF9tdWx0aWNhc3Q6IHNvY2tldCIpOworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9UVEwsCisJCSAgICAgICAoY2hhciAqKSZ0dGwsIHNpemVvZih0dGwpKSA8IDApIHsKKwkJKHZvaWQpIGNsb3NlKHNvY2spOworCQlyZXR1cm4gKDApOworCX0KKwkodm9pZCkgY2xvc2Uoc29jayk7CisJcmV0dXJuICgxKTsKK30KKworaW50Citpc19kaXJlY3RseV9jb25uZWN0ZWQoc3RydWN0IGluX2FkZHIgaW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2ludGVyZmFjZXM7IGkrKykgeworCQkvKiBDaGVjayB0aGF0IHRoZSBzdWJuZXR3b3JrIG51bWJlcnMgbWF0Y2ggKi8KKworCQlpZiAoKGluLnNfYWRkciAmIGludGVyZmFjZXNbaV0ubmV0bWFzay5zX2FkZHIgKSA9PQorCQkgICAgKGludGVyZmFjZXNbaV0ucmVtb3RlYWRkci5zX2FkZHIgJiBpbnRlcmZhY2VzW2ldLm5ldG1hc2suc19hZGRyKSkKKwkJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUQUJMRVMKKyAqLworc3RydWN0IHRhYmxlIHsKKwlzdHJ1Y3QgaW5fYWRkcglyb3V0ZXI7CisJaW50CQlwcmVmZXJlbmNlOworCWludAkJcmVtYWluaW5nX3RpbWU7CisJaW50CQlpbl9rZXJuZWw7CisJc3RydWN0IHRhYmxlCSpuZXh0OworfTsKKworc3RydWN0IHRhYmxlICp0YWJsZTsKKworc3RydWN0IHRhYmxlICoKK2ZpbmRfcm91dGVyKHN0cnVjdCBpbl9hZGRyIGFkZHIpCit7CisJc3RydWN0IHRhYmxlICp0cDsKKworCXRwID0gdGFibGU7CisJd2hpbGUgKHRwKSB7CisJCWlmICh0cC0+cm91dGVyLnNfYWRkciA9PSBhZGRyLnNfYWRkcikKKwkJCXJldHVybiAodHApOworCQl0cCA9IHRwLT5uZXh0OworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitpbnQgbWF4X3ByZWZlcmVuY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgdGFibGUgKnRwOworCWludCBtYXggPSAoaW50KUlORUxJR0lCTEVfUFJFRjsKKworCXRwID0gdGFibGU7CisJd2hpbGUgKHRwKSB7CisJCWlmICh0cC0+cHJlZmVyZW5jZSA+IG1heCkKKwkJCW1heCA9IHRwLT5wcmVmZXJlbmNlOworCQl0cCA9IHRwLT5uZXh0OworCX0KKwlyZXR1cm4gKG1heCk7Cit9CisKKworLyogTm90ZTogdGhpcyBtaWdodCBsZWF2ZSB0aGUga2VybmVsIHdpdGggbm8gZGVmYXVsdCByb3V0ZSBmb3IgYSBzaG9ydCB0aW1lLiAqLwordm9pZAorYWdlX3RhYmxlKGludCB0aW1lKQoreworCXN0cnVjdCB0YWJsZSAqKnRwcCwgKnRwOworCWludCByZWNhbGN1bGF0ZV9tYXggPSAwOworCWludCBtYXggPSBtYXhfcHJlZmVyZW5jZSgpOworCisJdHBwID0gJnRhYmxlOworCXdoaWxlICgqdHBwICE9IE5VTEwpIHsKKwkJdHAgPSAqdHBwOworCQl0cC0+cmVtYWluaW5nX3RpbWUgLT0gdGltZTsKKwkJaWYgKHRwLT5yZW1haW5pbmdfdGltZSA8PSAwKSB7CisJCQkqdHBwID0gdHAtPm5leHQ7CisJCQlpZiAodHAtPmluX2tlcm5lbCkKKwkJCQlkZWxfcm91dGUodHAtPnJvdXRlcik7CisJCQlpZiAoYmVzdF9wcmVmZXJlbmNlICYmCisJCQkgICAgdHAtPnByZWZlcmVuY2UgPT0gbWF4KQorCQkJCXJlY2FsY3VsYXRlX21heCsrOworCQkJZnJlZSgoY2hhciAqKXRwKTsKKwkJfSBlbHNlIHsKKwkJCXRwcCA9ICZ0cC0+bmV4dDsKKwkJfQorCX0KKwlpZiAocmVjYWxjdWxhdGVfbWF4KSB7CisJCWludCBtYXggPSBtYXhfcHJlZmVyZW5jZSgpOworCisJCWlmIChtYXggIT0gSU5FTElHSUJMRV9QUkVGKSB7CisJCQl0cCA9IHRhYmxlOworCQkJd2hpbGUgKHRwKSB7CisJCQkJaWYgKHRwLT5wcmVmZXJlbmNlID09IG1heCAmJiAhdHAtPmluX2tlcm5lbCkgeworCQkJCQlhZGRfcm91dGUodHAtPnJvdXRlcik7CisJCQkJCXRwLT5pbl9rZXJuZWwrKzsKKwkJCQl9CisJCQkJdHAgPSB0cC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBkaXNjYXJkX3RhYmxlKHZvaWQpCit7CisJc3RydWN0IHRhYmxlICoqdHBwLCAqdHA7CisKKwl0cHAgPSAmdGFibGU7CisJd2hpbGUgKCp0cHAgIT0gTlVMTCkgeworCQl0cCA9ICp0cHA7CisJCSp0cHAgPSB0cC0+bmV4dDsKKwkJaWYgKHRwLT5pbl9rZXJuZWwpCisJCQlkZWxfcm91dGUodHAtPnJvdXRlcik7CisJCWZyZWUoKGNoYXIgKil0cCk7CisJfQorfQorCisKK3ZvaWQKK3JlY29yZF9yb3V0ZXIoc3RydWN0IGluX2FkZHIgcm91dGVyLCBpbnQgcHJlZmVyZW5jZSwgaW50IHR0bCkKK3sKKwlzdHJ1Y3QgdGFibGUgKnRwOworCWludCBvbGRfbWF4ID0gbWF4X3ByZWZlcmVuY2UoKTsKKwlpbnQgY2hhbmdlZF91cCA9IDA7CS8qIG1heCBwcmVmZXJlbmNlIGNvdWxkIGhhdmUgaW5jcmVhc2VkICovCisJaW50IGNoYW5nZWRfZG93biA9IDA7CS8qIG1heCBwcmVmZXJlbmNlIGNvdWxkIGhhdmUgZGVjcmVhc2VkICovCisKKwlpZiAodHRsIDwgNCkKKwkJcHJlZmVyZW5jZSA9IElORUxJR0lCTEVfUFJFRjsKKworCWlmIChkZWJ1ZykKKwkJbG9nZGVidWcoIlJlY29yZGluZyAlcywgdHRsICVkLCBwcmVmZXJlbmNlIDB4JXhcbiIsCisJCQkgcHJfbmFtZShyb3V0ZXIpLAorCQkJIHR0bCwKKwkJCSBwcmVmZXJlbmNlKTsKKwl0cCA9IGZpbmRfcm91dGVyKHJvdXRlcik7CisJaWYgKHRwKSB7CisJCWlmICh0cC0+cHJlZmVyZW5jZSA+IHByZWZlcmVuY2UgJiYKKwkJICAgIHRwLT5wcmVmZXJlbmNlID09IG9sZF9tYXgpCisJCQljaGFuZ2VkX2Rvd24rKzsKKwkJZWxzZSBpZiAocHJlZmVyZW5jZSA+IHRwLT5wcmVmZXJlbmNlKQorCQkJY2hhbmdlZF91cCsrOworCQl0cC0+cHJlZmVyZW5jZSA9IHByZWZlcmVuY2U7CisJCXRwLT5yZW1haW5pbmdfdGltZSA9IHR0bDsKKwl9IGVsc2UgeworCQlpZiAocHJlZmVyZW5jZSA+IG9sZF9tYXgpCisJCQljaGFuZ2VkX3VwKys7CisJCXRwID0gKHN0cnVjdCB0YWJsZSAqKUFMTElHTihtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0YWJsZSkpKTsKKwkJaWYgKHRwID09IE5VTEwpIHsKKwkJCWxvZ2VycigiT3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJdHAtPnJvdXRlciA9IHJvdXRlcjsKKwkJdHAtPnByZWZlcmVuY2UgPSBwcmVmZXJlbmNlOworCQl0cC0+cmVtYWluaW5nX3RpbWUgPSB0dGw7CisJCXRwLT5pbl9rZXJuZWwgPSAwOworCQl0cC0+bmV4dCA9IHRhYmxlOworCQl0YWJsZSA9IHRwOworCX0KKwlpZiAoIXRwLT5pbl9rZXJuZWwgJiYKKwkgICAgKCFiZXN0X3ByZWZlcmVuY2UgfHwgdHAtPnByZWZlcmVuY2UgPT0gbWF4X3ByZWZlcmVuY2UoKSkgJiYKKwkgICAgdHAtPnByZWZlcmVuY2UgIT0gSU5FTElHSUJMRV9QUkVGKSB7CisJCWFkZF9yb3V0ZSh0cC0+cm91dGVyKTsKKwkJdHAtPmluX2tlcm5lbCsrOworCX0KKwlpZiAodHAtPnByZWZlcmVuY2UgPT0gSU5FTElHSUJMRV9QUkVGICYmIHRwLT5pbl9rZXJuZWwpIHsKKwkJZGVsX3JvdXRlKHRwLT5yb3V0ZXIpOworCQl0cC0+aW5fa2VybmVsID0gMDsKKwl9CisJaWYgKGJlc3RfcHJlZmVyZW5jZSAmJiBjaGFuZ2VkX2Rvd24pIHsKKwkJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIGFkZCByb3V0ZXMgKi8KKwkJaW50IG5ld19tYXggPSBtYXhfcHJlZmVyZW5jZSgpOworCQlpZiAobmV3X21heCAhPSBJTkVMSUdJQkxFX1BSRUYpIHsKKwkJCXRwID0gdGFibGU7CisJCQl3aGlsZSAodHApIHsKKwkJCQlpZiAodHAtPnByZWZlcmVuY2UgPT0gbmV3X21heCAmJgorCQkJCSAgICAhdHAtPmluX2tlcm5lbCkgeworCQkJCQlhZGRfcm91dGUodHAtPnJvdXRlcik7CisJCQkJCXRwLT5pbl9rZXJuZWwrKzsKKwkJCQl9CisJCQkJdHAgPSB0cC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoYmVzdF9wcmVmZXJlbmNlICYmIChjaGFuZ2VkX3VwIHx8IGNoYW5nZWRfZG93bikpIHsKKwkJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHJlbW92ZSByb3V0ZXMgYWxyZWFkeSBpbiB0aGUga2VybmVsICovCisJCWludCBuZXdfbWF4ID0gbWF4X3ByZWZlcmVuY2UoKTsKKwkJdHAgPSB0YWJsZTsKKwkJd2hpbGUgKHRwKSB7CisJCQlpZiAodHAtPnByZWZlcmVuY2UgPCBuZXdfbWF4ICYmIHRwLT5pbl9rZXJuZWwpIHsKKwkJCQlkZWxfcm91dGUodHAtPnJvdXRlcik7CisJCQkJdHAtPmluX2tlcm5lbCA9IDA7CisJCQl9CisJCQl0cCA9IHRwLT5uZXh0OworCQl9CisJfQorfQorCit2b2lkCithZGRfcm91dGUoc3RydWN0IGluX2FkZHIgYWRkcikKK3sKKwlpZiAoZGVidWcpCisJCWxvZ2RlYnVnKCJBZGQgZGVmYXVsdCByb3V0ZSB0byAlc1xuIiwgcHJfbmFtZShhZGRyKSk7CisJcnRpb2N0bChhZGRyLCBTSU9DQUREUlQpOworfQorCit2b2lkCitkZWxfcm91dGUoc3RydWN0IGluX2FkZHIgYWRkcikKK3sKKwlpZiAoZGVidWcpCisJCWxvZ2RlYnVnKCJEZWxldGUgZGVmYXVsdCByb3V0ZSB0byAlc1xuIiwgcHJfbmFtZShhZGRyKSk7CisJcnRpb2N0bChhZGRyLCBTSU9DREVMUlQpOworfQorCit2b2lkCitydGlvY3RsKHN0cnVjdCBpbl9hZGRyIGFkZHIsIGludCBvcCkKK3sKKwlpbnQgc29jazsKKwlzdHJ1Y3QgcnRlbnRyeSBydDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKworCW1lbXNldCgoY2hhciAqKSZydCwgMCwgc2l6ZW9mKHN0cnVjdCBydGVudHJ5KSk7CisJcnQucnRfZHN0LnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJcnQucnRfZ2F0ZXdheS5zYV9mYW1pbHkgPSBBRl9JTkVUOworCXJ0LnJ0X2dlbm1hc2suc2FfZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopQUxMSUdOKCZydC5ydF9nYXRld2F5KTsKKwlzaW4tPnNpbl9hZGRyID0gYWRkcjsKKwlydC5ydF9mbGFncyA9IFJURl9VUCB8IFJURl9HQVRFV0FZOworCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKHNvY2sgPCAwKSB7CisJCWxvZ3BlcnJvcigicnRpb2N0bDogc29ja2V0Iik7CisJCXJldHVybjsKKwl9CisJaWYgKGlvY3RsKHNvY2ssIG9wLCAoY2hhciAqKSZydCkgPCAwKSB7CisJCWlmICghKG9wID09IFNJT0NBRERSVCAmJiBlcnJubyA9PSBFRVhJU1QpKQorCQkJbG9ncGVycm9yKCJpb2N0bCAoYWRkL2RlbGV0ZSByb3V0ZSkiKTsKKwl9CisJKHZvaWQpIGNsb3NlKHNvY2spOworfQorCisvKgorICogTE9HR0VSCisgKi8KKwordm9pZCBpbml0bG9nKHZvaWQpCit7CisJbG9nZ2luZysrOworCW9wZW5sb2coImluLnJkaXNjZCIsIExPR19QSUQgfCBMT0dfQ09OUywgTE9HX0RBRU1PTik7Cit9CisKKwordm9pZAorbG9ncGVycm9yKGNoYXIgKnN0cikKK3sKKwlpZiAobG9nZ2luZykKKwkJc3lzbG9nKExPR19FUlIsICIlczogJW0iLCBzdHIpOworCWVsc2UKKwkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBzdHIsIHN0cmVycm9yKGVycm5vKSk7Cit9CmRpZmYgLS1naXQgYS9pcHV0aWxzL3RmdHAuaCBiL2lwdXRpbHMvdGZ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWQ3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL3RmdHAuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0ZnRwLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfQVJQQV9URlRQX0gKKyNkZWZpbmUgX0FSUEFfVEZUUF9ICisvKgorICogVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIChJRU4tMTMzKQorICovCisjZGVmaW5lCVNFR1NJWkUJCTUxMgkJLyogZGF0YSBzZWdtZW50IHNpemUgKi8KKworLyoKKyAqIFBhY2tldCB0eXBlcy4KKyAqLworI2RlZmluZQlSUlEJMDEJCQkvKiByZWFkIHJlcXVlc3QgKi8KKyNkZWZpbmUJV1JRCTAyCQkJLyogd3JpdGUgcmVxdWVzdCAqLworI2RlZmluZQlEQVRBCTAzCQkJLyogZGF0YSBwYWNrZXQgKi8KKyNkZWZpbmUJQUNLCTA0CQkJLyogYWNrbm93bGVkZ2VtZW50ICovCisjZGVmaW5lCUVSUk9SCTA1CQkJLyogZXJyb3IgY29kZSAqLworCitzdHJ1Y3QJdGZ0cGhkciB7CisJc2hvcnQJdGhfb3Bjb2RlOwkJLyogcGFja2V0IHR5cGUgKi8KKwl1bmlvbiB7CisJCXNob3J0CXR1X2Jsb2NrOwkvKiBibG9jayAjICovCisJCXNob3J0CXR1X2NvZGU7CS8qIGVycm9yIGNvZGUgKi8KKwkJY2hhcgl0dV9zdHVmZlsxXTsJLyogcmVxdWVzdCBwYWNrZXQgc3R1ZmYgKi8KKwl9IHRoX3U7CisJY2hhcgl0aF9kYXRhWzFdOwkJLyogZGF0YSBvciBlcnJvciBzdHJpbmcgKi8KK307CisKKyNkZWZpbmUJdGhfYmxvY2sJdGhfdS50dV9ibG9jaworI2RlZmluZQl0aF9jb2RlCQl0aF91LnR1X2NvZGUKKyNkZWZpbmUJdGhfc3R1ZmYJdGhfdS50dV9zdHVmZgorI2RlZmluZQl0aF9tc2cJCXRoX2RhdGEKKworLyoKKyAqIEVycm9yIGNvZGVzLgorICovCisjZGVmaW5lCUVVTkRFRgkJMAkJLyogbm90IGRlZmluZWQgKi8KKyNkZWZpbmUJRU5PVEZPVU5ECTEJCS8qIGZpbGUgbm90IGZvdW5kICovCisjZGVmaW5lCUVBQ0NFU1MJCTIJCS8qIGFjY2VzcyB2aW9sYXRpb24gKi8KKyNkZWZpbmUJRU5PU1BBQ0UJMwkJLyogZGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KKyNkZWZpbmUJRUJBRE9QCQk0CQkvKiBpbGxlZ2FsIFRGVFAgb3BlcmF0aW9uICovCisjZGVmaW5lCUVCQURJRAkJNQkJLyogdW5rbm93biB0cmFuc2ZlciBJRCAqLworI2RlZmluZQlFRVhJU1RTCQk2CQkvKiBmaWxlIGFscmVhZHkgZXhpc3RzICovCisjZGVmaW5lCUVOT1VTRVIJCTcJCS8qIG5vIHN1Y2ggdXNlciAqLworCisKK2V4dGVybiBpbnQgcmVhZGl0KEZJTEUgKiBmaWxlLCBzdHJ1Y3QgdGZ0cGhkciAqKmRwcCwgaW50IGNvbnZlcnQpOworZXh0ZXJuIHZvaWQgcmVhZF9haGVhZChGSUxFICpmaWxlLCBpbnQgY29udmVydCk7CitleHRlcm4gaW50IHdyaXRlaXQoRklMRSAqZmlsZSwgc3RydWN0IHRmdHBoZHIgKipkcHAsIGludCBjdCwgaW50IGNvbnZlcnQpOworZXh0ZXJuIGludCB3cml0ZV9iZWhpbmQoRklMRSAqZmlsZSwgaW50IGNvbnZlcnQpOworZXh0ZXJuIGludCBzeW5jaG5ldChpbnQgZik7CitleHRlcm4gc3RydWN0IHRmdHBoZHIgKndfaW5pdCh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgdGZ0cGhkciAqcl9pbml0KHZvaWQpOworCisKKyNlbmRpZiAvKiBfQVJQQV9URlRQX0ggKi8KZGlmZiAtLWdpdCBhL2lwdXRpbHMvdGZ0cGQuYyBiL2lwdXRpbHMvdGZ0cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM5ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy90ZnRwZC5jCkBAIC0wLDAgKzEsNTM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK2NoYXIgY29weXJpZ2h0W10gPQorIkAoIykgQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cblwKKyBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworCisjaWZuZGVmIGxpbnQKKy8qc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiZnJvbTogQCgjKXRmdHBkLmMJNS4xMyAoQmVya2VsZXkpIDIvMjYvOTEiOyovCisvKnN0YXRpYyBjaGFyIHJjc2lkW10gPSAiJElkOiB0ZnRwZC5jLHYgMS4zIDE5OTMvMDgvMDEgMTg6Mjg6NTMgbXljcm9mdCBFeHAgJCI7Ki8KKyNlbmRpZiAvKiBub3QgbGludCAqLworCisvKgorICogVHJpdmlhbCBmaWxlIHRyYW5zZmVyIHByb3RvY29sIHNlcnZlci4KKyAqCisgKiBUaGlzIHZlcnNpb24gaW5jbHVkZXMgbWFueSBtb2RpZmljYXRpb25zIGJ5IEppbSBHdXl0b24gPGd1eXRvbkByYW5kLXVuaXg+CisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidGZ0cC5oIgorCisjaWZuZGVmIE1TR19DT05GSVJNCisjZGVmaW5lIE1TR19DT05GSVJNIDAKKyN3YXJuaW5nIFBsZWFzZSwgdXBncmFkZSBrZXJuZWwsIG90aGVyd2lzZSB0aGlzIHRmdHBkIGhhcyBubyBhZHZhbnRhZ2VzLgorI2VuZGlmCisKKyNkZWZpbmUJVElNRU9VVAkJNQorCitpbnQJcGVlcjsKK2ludAlyZXhtdHZhbCA9IFRJTUVPVVQ7CitpbnQJbWF4dGltZW91dCA9IDUqVElNRU9VVDsKKworI2RlZmluZQlQS1RTSVpFCVNFR1NJWkUrNAorY2hhcglidWZbUEtUU0laRV07CitjaGFyCWFja2J1ZltQS1RTSVpFXTsKK3VuaW9uIHsKKwlzdHJ1Y3QJc29ja2FkZHIgICAgIHNhOworCXN0cnVjdAlzb2NrYWRkcl9pbiAgc2luOworCXN0cnVjdAlzb2NrYWRkcl9pbjYgc2luNjsKK30gZnJvbTsKK3NvY2tsZW5fdAlmcm9tbGVuOworCisjZGVmaW5lIE1BWEFSRwkxCitjaGFyCSpkaXJzW01BWEFSRysxXTsKKwordm9pZCB0ZnRwKHN0cnVjdCB0ZnRwaGRyICp0cCwgaW50IHNpemUpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7Cit2b2lkIG5hayhpbnQgZXJyb3IpOworaW50IHZhbGlkYXRlX2FjY2VzcyhjaGFyICpmaWxlbmFtZSwgaW50IG1vZGUpOworCitzdHJ1Y3QgZm9ybWF0czsKKwordm9pZCBzZW5kZmlsZShzdHJ1Y3QgZm9ybWF0cyAqcGYpOwordm9pZCByZWN2ZmlsZShzdHJ1Y3QgZm9ybWF0cyAqcGYpOworCisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCXJlZ2lzdGVyIHN0cnVjdCB0ZnRwaGRyICp0cDsKKwlyZWdpc3RlciBpbnQgbiA9IDA7CisJaW50IG9uID0gMTsKKworCS8qIFNhbml0eS4gSWYgcGFyZW50IGZvcmdvdCB0byBzZXR1aWQoKSBvbiB1cy4gKi8KKwlpZiAoZ2V0ZXVpZCgpID09IDApIHsKKwkJc2V0Z2lkKDY1NTM0KTsKKwkJc2V0dWlkKDY1NTM0KTsKKwl9CisKKwlhYy0tOyBhdisrOworCXdoaWxlIChhYy0tID4gMCAmJiBuIDwgTUFYQVJHKQorCQlkaXJzW24rK10gPSAqYXYrKzsKKworCW9wZW5sb2coInRmdHBkIiwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJaWYgKGlvY3RsKDAsIEZJT05CSU8sICZvbikgPCAwKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiaW9jdGwoRklPTkJJTyk6ICVtXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJZnJvbWxlbiA9IHNpemVvZiAoZnJvbSk7CisJbiA9IHJlY3Zmcm9tKDAsIGJ1Ziwgc2l6ZW9mIChidWYpLCAwLAorCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sICZmcm9tbGVuKTsKKwlpZiAobiA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCXN5c2xvZyhMT0dfRVJSLCAicmVjdmZyb206ICVtXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHJlYWQgdGhlIG1lc3NhZ2Ugb3V0IG9mIHRoZSBVRFAKKwkgKiBzb2NrZXQsIHdlIGZvcmsgYW5kIGV4aXQuICBUaHVzLCBpbmV0ZCB3aWxsIGdvIGJhY2sKKwkgKiB0byBsaXN0ZW5pbmcgdG8gdGhlIHRmdHAgcG9ydCwgYW5kIHRoZSBuZXh0IHJlcXVlc3QKKwkgKiB0byBjb21lIGluIHdpbGwgc3RhcnQgdXAgYSBuZXcgaW5zdGFuY2Ugb2YgdGZ0cGQuCisJICoKKwkgKiBXZSBkbyB0aGlzIHNvIHRoYXQgaW5ldGQgY2FuIHJ1biB0ZnRwZCBpbiAid2FpdCIgbW9kZS4KKwkgKiBUaGUgcHJvYmxlbSB3aXRoIHRmdHBkIHJ1bm5pbmcgaW4gIm5vd2FpdCIgbW9kZSBpcyB0aGF0CisJICogaW5ldGQgbWF5IGdldCBvbmUgb3IgbW9yZSBzdWNjZXNzZnVsICJzZWxlY3RzIiBvbiB0aGUKKwkgKiB0ZnRwIHBvcnQgYmVmb3JlIHdlIGRvIG91ciByZWNlaXZlLCBzbyBtb3JlIHRoYW4gb25lCisJICogaW5zdGFuY2Ugb2YgdGZ0cGQgbWF5IGJlIHN0YXJ0ZWQgdXAuICBXb3JzZSwgaWYgdGZ0cGQKKwkgKiBicmVhayBiZWZvcmUgZG9pbmcgdGhlIGFib3ZlICJyZWN2ZnJvbSIsIGluZXRkIHdvdWxkCisJICogc3Bhd24gZW5kbGVzcyBpbnN0YW5jZXMsIGNsb2dnaW5nIHRoZSBzeXN0ZW0uCisJICovCisJeworCQlpbnQgcGlkOworCQlpbnQgaTsKKwkJc29ja2xlbl90IGo7CisKKwkJZm9yIChpID0gMTsgaSA8IDIwOyBpKyspIHsKKwkJICAgIHBpZCA9IGZvcmsoKTsKKwkJICAgIGlmIChwaWQgPCAwKSB7CisJCQkJc2xlZXAoaSk7CisJCQkJLyoKKwkJCQkgKiBmbHVzaCBvdXQgdG8gbW9zdCByZWNlbnRseSBzZW50IHJlcXVlc3QuCisJCQkJICoKKwkJCQkgKiBUaGlzIG1heSBkcm9wIHNvbWUgcmVxdWVzdCwgYnV0IHRob3NlCisJCQkJICogd2lsbCBiZSByZXNlbnQgYnkgdGhlIGNsaWVudHMgd2hlbgorCQkJCSAqIHRoZXkgdGltZW91dC4gIFRoZSBwb3NpdGl2ZSBlZmZlY3Qgb2YKKwkJCQkgKiB0aGlzIGZsdXNoIGlzIHRvICh0cnkgdG8pIHByZXZlbnQgbW9yZQorCQkJCSAqIHRoYW4gb25lIHRmdHBkIGJlaW5nIHN0YXJ0ZWQgdXAgdG8gc2VydmljZQorCQkJCSAqIGEgc2luZ2xlIHJlcXVlc3QgZnJvbSBhIHNpbmdsZSBjbGllbnQuCisJCQkJICovCisJCQkJaiA9IHNpemVvZiBmcm9tOworCQkJCWkgPSByZWN2ZnJvbSgwLCBidWYsIHNpemVvZiAoYnVmKSwgMCwKKwkJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmaik7CisJCQkJaWYgKGkgPiAwKSB7CisJCQkJCW4gPSBpOworCQkJCQlmcm9tbGVuID0gajsKKwkJCQl9CisJCSAgICB9IGVsc2UgeworCQkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCWlmIChwaWQgPCAwKSB7CisJCQlzeXNsb2coTE9HX0VSUiwgImZvcms6ICVtXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0gZWxzZSBpZiAocGlkICE9IDApIHsKKwkJCWV4aXQoMCk7CisJCX0KKwl9CisJYWxhcm0oMCk7CisJY2xvc2UoMCk7CisJY2xvc2UoMSk7CisJcGVlciA9IHNvY2tldChmcm9tLnNhLnNhX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJaWYgKHBlZXIgPCAwKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAic29ja2V0OiAlbVxuIik7CisJCWV4aXQoMSk7CisJfQorCWlmIChjb25uZWN0KHBlZXIsIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgc2l6ZW9mKGZyb20pKSA8IDApIHsKKwkJc3lzbG9nKExPR19FUlIsICJjb25uZWN0OiAlbVxuIik7CisJCWV4aXQoMSk7CisJfQorCXRwID0gKHN0cnVjdCB0ZnRwaGRyICopYnVmOworCXRwLT50aF9vcGNvZGUgPSBudG9ocyh0cC0+dGhfb3Bjb2RlKTsKKwlpZiAodHAtPnRoX29wY29kZSA9PSBSUlEgfHwgdHAtPnRoX29wY29kZSA9PSBXUlEpCisJCXRmdHAodHAsIG4pOworCWV4aXQoMSk7Cit9CisKK3N0cnVjdCBmb3JtYXRzIHsKKwljaGFyCSpmX21vZGU7CisJaW50CSgqZl92YWxpZGF0ZSkoY2hhciAqZmlsZW5hbWUsIGludCBtb2RlKTsKKwl2b2lkCSgqZl9zZW5kKShzdHJ1Y3QgZm9ybWF0cyopOworCXZvaWQJKCpmX3JlY3YpKHN0cnVjdCBmb3JtYXRzKik7CisJaW50CWZfY29udmVydDsKK30gZm9ybWF0c1tdID0geworCXsgIm5ldGFzY2lpIiwJdmFsaWRhdGVfYWNjZXNzLAlzZW5kZmlsZSwJcmVjdmZpbGUsIDEgfSwKKwl7ICJvY3RldCIsCXZhbGlkYXRlX2FjY2VzcywJc2VuZGZpbGUsCXJlY3ZmaWxlLCAwIH0sCisjaWZkZWYgbm90ZGVmCisJeyAibWFpbCIsCXZhbGlkYXRlX3VzZXIsCQlzZW5kbWFpbCwJcmVjdm1haWwsIDEgfSwKKyNlbmRpZgorCXsgMCB9Cit9OworCisvKgorICogSGFuZGxlIGluaXRpYWwgY29ubmVjdGlvbiBwcm90b2NvbC4KKyAqLwordm9pZCB0ZnRwKHN0cnVjdCB0ZnRwaGRyICp0cCwgaW50IHNpemUpCit7CisJcmVnaXN0ZXIgY2hhciAqY3A7CisJaW50IGZpcnN0ID0gMSwgZWNvZGU7CisJcmVnaXN0ZXIgc3RydWN0IGZvcm1hdHMgKnBmOworCWNoYXIgKmZpbGVuYW1lLCAqbW9kZSA9IE5VTEw7CisKKwlmaWxlbmFtZSA9IGNwID0gdHAtPnRoX3N0dWZmOworYWdhaW46CisJd2hpbGUgKGNwIDwgYnVmICsgc2l6ZSkgeworCQlpZiAoKmNwID09ICdcMCcpCisJCQlicmVhazsKKwkJY3ArKzsKKwl9CisJaWYgKCpjcCAhPSAnXDAnKSB7CisJCW5hayhFQkFET1ApOworCQlleGl0KDEpOworCX0KKwlpZiAoZmlyc3QpIHsKKwkJbW9kZSA9ICsrY3A7CisJCWZpcnN0ID0gMDsKKwkJZ290byBhZ2FpbjsKKwl9CisJZm9yIChjcCA9IG1vZGU7ICpjcDsgY3ArKykKKwkJaWYgKGlzdXBwZXIoKmNwKSkKKwkJCSpjcCA9IHRvbG93ZXIoKmNwKTsKKwlmb3IgKHBmID0gZm9ybWF0czsgcGYtPmZfbW9kZTsgcGYrKykKKwkJaWYgKHN0cmNtcChwZi0+Zl9tb2RlLCBtb2RlKSA9PSAwKQorCQkJYnJlYWs7CisJaWYgKHBmLT5mX21vZGUgPT0gMCkgeworCQluYWsoRUJBRE9QKTsKKwkJZXhpdCgxKTsKKwl9CisJZWNvZGUgPSAoKnBmLT5mX3ZhbGlkYXRlKShmaWxlbmFtZSwgdHAtPnRoX29wY29kZSk7CisJaWYgKGVjb2RlKSB7CisJCW5hayhlY29kZSk7CisJCWV4aXQoMSk7CisJfQorCWlmICh0cC0+dGhfb3Bjb2RlID09IFdSUSkKKwkJKCpwZi0+Zl9yZWN2KShwZik7CisJZWxzZQorCQkoKnBmLT5mX3NlbmQpKHBmKTsKKwlleGl0KDApOworfQorCisKK0ZJTEUgKmZpbGU7CisKKy8qCisgKiBWYWxpZGF0ZSBmaWxlIGFjY2Vzcy4gIFNpbmNlIHdlCisgKiBoYXZlIG5vIHVpZCBvciBnaWQsIGZvciBub3cgcmVxdWlyZQorICogZmlsZSB0byBleGlzdCBhbmQgYmUgcHVibGljbHkKKyAqIHJlYWRhYmxlL3dyaXRhYmxlLgorICogSWYgd2Ugd2VyZSBpbnZva2VkIHdpdGggYXJndW1lbnRzCisgKiBmcm9tIGluZXRkIHRoZW4gdGhlIGZpbGUgbXVzdCBhbHNvIGJlCisgKiBpbiBvbmUgb2YgdGhlIGdpdmVuIGRpcmVjdG9yeSBwcmVmaXhlcy4KKyAqIE5vdGUgYWxzbywgZnVsbCBwYXRoIG5hbWUgbXVzdCBiZQorICogZ2l2ZW4gYXMgd2UgaGF2ZSBubyBsb2dpbiBkaXJlY3RvcnkuCisgKi8KK2ludCB2YWxpZGF0ZV9hY2Nlc3MoY2hhciAqZmlsZW5hbWUsIGludCBtb2RlKQoreworCXN0cnVjdCBzdGF0IHN0YnVmOworCWludCAgICBmZDsKKwljaGFyICAqY3A7CisJY2hhciAgIGZuYW1lYnVmWzEwMjQrNTEyXTsKKworCWZvciAoY3AgPSBmaWxlbmFtZTsgKmNwOyBjcCsrKSB7CisJCWlmKCpjcCA9PSAnLicgJiYgKGNwID09IGZpbGVuYW1lIHx8IHN0cm5jbXAoY3AtMSwgIi8uLi8iLCA0KSA9PSAwKSkgeworCQkJc3lzbG9nKExPR19FUlIsICJiYWQgcGF0aCAlcyIsIGZpbGVuYW1lKTsKKwkJCXJldHVybihFQUNDRVNTKTsKKwkJfQorCX0KKworCWlmICgqZmlsZW5hbWUgPT0gJy8nKQorCQlmaWxlbmFtZSsrOworCisJaWYgKCEqZGlycykgeworCQlzeXNsb2coTE9HX0VSUiwgIm5vIGRpcnMiKTsKKwkJcmV0dXJuIEVBQ0NFU1M7CisJfQorCXNucHJpbnRmKGZuYW1lYnVmLCBzaXplb2YoZm5hbWVidWYpLTEsICIlcy8lcyIsICpkaXJzLCBmaWxlbmFtZSk7CisJZmlsZW5hbWUgPSBmbmFtZWJ1ZjsKKworCWlmIChzdGF0KGZpbGVuYW1lLCAmc3RidWYpIDwgMCkgeworCQlzeXNsb2coTE9HX0VSUiwgInN0YXQgJXMgOiAlbSIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIChlcnJubyA9PSBFTk9FTlQgPyBFTk9URk9VTkQgOiBFQUNDRVNTKTsKKwl9CisJaWYgKG1vZGUgPT0gUlJRKSB7CisJCWlmICgoc3RidWYuc3RfbW9kZSYoU19JUkVBRCA+PiA2KSkgPT0gMCkgeworCQkJc3lzbG9nKExPR19FUlIsICJub3QgcmVhZGFibGUgJXMiLCBmaWxlbmFtZSk7CisJCQlyZXR1cm4gKEVBQ0NFU1MpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChzdGJ1Zi5zdF9tb2RlJihTX0lXUklURSA+PiA2KSkgPT0gMCkgeworCQkJc3lzbG9nKExPR19FUlIsICJub3Qgd3JpdGFibGUgJXMiLCBmaWxlbmFtZSk7CisJCQlyZXR1cm4gKEVBQ0NFU1MpOworCQl9CisJfQorCWZkID0gb3BlbihmaWxlbmFtZSwgbW9kZSA9PSBSUlEgPyAwIDogMSk7CisJaWYgKGZkIDwgMCkgeworCQlzeXNsb2coTE9HX0VSUiwgImNhbm5vdCBvcGVuICVzOiAlbSIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIChlcnJubyArIDEwMCk7CisJfQorCWZpbGUgPSBmZG9wZW4oZmQsIChtb2RlID09IFJSUSk/ICJyIjoidyIpOworCWlmIChmaWxlID09IE5VTEwpIHsKKwkJcmV0dXJuIGVycm5vKzEwMDsKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CWNvbmZpcm1lZDsKK2ludAl0aW1lb3V0Oworam1wX2J1Zgl0aW1lb3V0YnVmOworCit2b2lkIHRpbWVyKGludCBzaWdubykKK3sKKwljb25maXJtZWQgPSAwOworCXRpbWVvdXQgKz0gcmV4bXR2YWw7CisJaWYgKHRpbWVvdXQgPj0gbWF4dGltZW91dCkKKwkJZXhpdCgxKTsKKwlsb25nam1wKHRpbWVvdXRidWYsIDEpOworfQorCisvKgorICogU2VuZCB0aGUgcmVxdWVzdGVkIGZpbGUuCisgKi8KK3ZvaWQgc2VuZGZpbGUoc3RydWN0IGZvcm1hdHMgKnBmKQoreworCXN0cnVjdCB0ZnRwaGRyICpkcDsKKwlyZWdpc3RlciBzdHJ1Y3QgdGZ0cGhkciAqYXA7ICAgIC8qIGFjayBwYWNrZXQgKi8KKwl2b2xhdGlsZSBpbnQgYmxvY2sgPSAxOworCWludCBzaXplLCBuOworCisJY29uZmlybWVkID0gMDsKKwlzaWduYWwoU0lHQUxSTSwgdGltZXIpOworCWRwID0gcl9pbml0KCk7CisJYXAgPSAoc3RydWN0IHRmdHBoZHIgKilhY2tidWY7CisJZG8geworCQlzaXplID0gcmVhZGl0KGZpbGUsICZkcCwgcGYtPmZfY29udmVydCk7CisJCWlmIChzaXplIDwgMCkgeworCQkJbmFrKGVycm5vICsgMTAwKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJZHAtPnRoX29wY29kZSA9IGh0b25zKCh1X3Nob3J0KURBVEEpOworCQlkcC0+dGhfYmxvY2sgPSBodG9ucygodV9zaG9ydClibG9jayk7CisJCXRpbWVvdXQgPSAwOworCQkodm9pZCkgc2V0am1wKHRpbWVvdXRidWYpOworCitzZW5kX2RhdGE6CisJCWlmIChzZW5kKHBlZXIsIGRwLCBzaXplICsgNCwgY29uZmlybWVkKSAhPSBzaXplICsgNCkgeworCQkJc3lzbG9nKExPR19FUlIsICJ0ZnRwZDogd3JpdGU6ICVtXG4iKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJY29uZmlybWVkID0gMDsKKwkJcmVhZF9haGVhZChmaWxlLCBwZi0+Zl9jb252ZXJ0KTsKKwkJZm9yICggOyA7ICkgeworCQkJYWxhcm0ocmV4bXR2YWwpOyAgICAgICAgLyogcmVhZCB0aGUgYWNrICovCisJCQluID0gcmVjdihwZWVyLCBhY2tidWYsIHNpemVvZiAoYWNrYnVmKSwgMCk7CisJCQlhbGFybSgwKTsKKwkJCWlmIChuIDwgMCkgeworCQkJCXN5c2xvZyhMT0dfRVJSLCAidGZ0cGQ6IHJlYWQ6ICVtXG4iKTsKKwkJCQlnb3RvIGFib3J0OworCQkJfQorCQkJYXAtPnRoX29wY29kZSA9IG50b2hzKCh1X3Nob3J0KWFwLT50aF9vcGNvZGUpOworCQkJYXAtPnRoX2Jsb2NrID0gbnRvaHMoKHVfc2hvcnQpYXAtPnRoX2Jsb2NrKTsKKworCQkJaWYgKGFwLT50aF9vcGNvZGUgPT0gRVJST1IpCisJCQkJZ290byBhYm9ydDsKKworCQkJaWYgKGFwLT50aF9vcGNvZGUgPT0gQUNLKSB7CisJCQkJaWYgKGFwLT50aF9ibG9jayA9PSBibG9jaykgeworCQkJCQljb25maXJtZWQgPSBNU0dfQ09ORklSTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFJlLXN5bmNocm9uaXplIHdpdGggdGhlIG90aGVyIHNpZGUgKi8KKwkJCQlzeW5jaG5ldChwZWVyKTsKKwkJCQlpZiAoYXAtPnRoX2Jsb2NrID09IChibG9jayAtMSkpIHsKKwkJCQkJZ290byBzZW5kX2RhdGE7CisJCQkJfQorCQkJfQorCisJCX0KKwkJYmxvY2srKzsKKwl9IHdoaWxlIChzaXplID09IFNFR1NJWkUpOworYWJvcnQ6CisJKHZvaWQpIGZjbG9zZShmaWxlKTsKK30KKwordm9pZCBqdXN0cXVpdChpbnQgc2lnbm8pCit7CisJZXhpdCgwKTsKK30KKworCisvKgorICogUmVjZWl2ZSBhIGZpbGUuCisgKi8KK3ZvaWQgcmVjdmZpbGUoc3RydWN0IGZvcm1hdHMgKnBmKQoreworCXN0cnVjdCB0ZnRwaGRyICpkcDsKKwlyZWdpc3RlciBzdHJ1Y3QgdGZ0cGhkciAqYXA7ICAgIC8qIGFjayBidWZmZXIgKi8KKwl2b2xhdGlsZSBpbnQgYmxvY2sgPSAwLCBuLCBzaXplOworCisJY29uZmlybWVkID0gMDsKKwlzaWduYWwoU0lHQUxSTSwgdGltZXIpOworCWRwID0gd19pbml0KCk7CisJYXAgPSAoc3RydWN0IHRmdHBoZHIgKilhY2tidWY7CisJZG8geworCQl0aW1lb3V0ID0gMDsKKwkJYXAtPnRoX29wY29kZSA9IGh0b25zKCh1X3Nob3J0KUFDSyk7CisJCWFwLT50aF9ibG9jayA9IGh0b25zKCh1X3Nob3J0KWJsb2NrKTsKKwkJYmxvY2srKzsKKwkJKHZvaWQpIHNldGptcCh0aW1lb3V0YnVmKTsKK3NlbmRfYWNrOgorCQlpZiAoc2VuZChwZWVyLCBhY2tidWYsIDQsIGNvbmZpcm1lZCkgIT0gNCkgeworCQkJc3lzbG9nKExPR19FUlIsICJ0ZnRwZDogd3JpdGU6ICVtXG4iKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJY29uZmlybWVkID0gMDsKKwkJd3JpdGVfYmVoaW5kKGZpbGUsIHBmLT5mX2NvbnZlcnQpOworCQlmb3IgKCA7IDsgKSB7CisJCQlhbGFybShyZXhtdHZhbCk7CisJCQluID0gcmVjdihwZWVyLCBkcCwgUEtUU0laRSwgMCk7CisJCQlhbGFybSgwKTsKKwkJCWlmIChuIDwgMCkgeyAgICAgICAgICAgIC8qIHJlYWxseT8gKi8KKwkJCQlzeXNsb2coTE9HX0VSUiwgInRmdHBkOiByZWFkOiAlbVxuIik7CisJCQkJZ290byBhYm9ydDsKKwkJCX0KKwkJCWRwLT50aF9vcGNvZGUgPSBudG9ocygodV9zaG9ydClkcC0+dGhfb3Bjb2RlKTsKKwkJCWRwLT50aF9ibG9jayA9IG50b2hzKCh1X3Nob3J0KWRwLT50aF9ibG9jayk7CisJCQlpZiAoZHAtPnRoX29wY29kZSA9PSBFUlJPUikKKwkJCQlnb3RvIGFib3J0OworCQkJaWYgKGRwLT50aF9vcGNvZGUgPT0gREFUQSkgeworCQkJCWlmIChkcC0+dGhfYmxvY2sgPT0gYmxvY2spIHsKKwkJCQkJY29uZmlybWVkID0gTVNHX0NPTkZJUk07CisJCQkJCWJyZWFrOyAgIC8qIG5vcm1hbCAqLworCQkJCX0KKwkJCQkvKiBSZS1zeW5jaHJvbml6ZSB3aXRoIHRoZSBvdGhlciBzaWRlICovCisJCQkJKHZvaWQpIHN5bmNobmV0KHBlZXIpOworCQkJCWlmIChkcC0+dGhfYmxvY2sgPT0gKGJsb2NrLTEpKQorCQkJCQlnb3RvIHNlbmRfYWNrOyAgICAgICAgICAvKiByZXhtaXQgKi8KKwkJCX0KKwkJfQorCQkvKiAgc2l6ZSA9IHdyaXRlKGZpbGUsIGRwLT50aF9kYXRhLCBuIC0gNCk7ICovCisJCXNpemUgPSB3cml0ZWl0KGZpbGUsICZkcCwgbiAtIDQsIHBmLT5mX2NvbnZlcnQpOworCQlpZiAoc2l6ZSAhPSAobi00KSkgeyAgICAgICAgICAgICAgICAgICAgLyogYWhlbSAqLworCQkJaWYgKHNpemUgPCAwKSBuYWsoZXJybm8gKyAxMDApOworCQkJZWxzZSBuYWsoRU5PU1BBQ0UpOworCQkJZ290byBhYm9ydDsKKwkJfQorCX0gd2hpbGUgKHNpemUgPT0gU0VHU0laRSk7CisJd3JpdGVfYmVoaW5kKGZpbGUsIHBmLT5mX2NvbnZlcnQpOworCSh2b2lkKSBmY2xvc2UoZmlsZSk7ICAgICAgICAgICAgLyogY2xvc2UgZGF0YSBmaWxlICovCisKKwlhcC0+dGhfb3Bjb2RlID0gaHRvbnMoKHVfc2hvcnQpQUNLKTsgICAgLyogc2VuZCB0aGUgImZpbmFsIiBhY2sgKi8KKwlhcC0+dGhfYmxvY2sgPSBodG9ucygodV9zaG9ydCkoYmxvY2spKTsKKwkodm9pZCkgc2VuZChwZWVyLCBhY2tidWYsIDQsIGNvbmZpcm1lZCk7CisKKwlzaWduYWwoU0lHQUxSTSwganVzdHF1aXQpOyAgICAgIC8qIGp1c3QgcXVpdCBvbiB0aW1lb3V0ICovCisJYWxhcm0ocmV4bXR2YWwpOworCW4gPSByZWN2KHBlZXIsIGJ1Ziwgc2l6ZW9mIChidWYpLCAwKTsgLyogbm9ybWFsbHkgdGltZXMgb3V0IGFuZCBxdWl0cyAqLworCWFsYXJtKDApOworCWlmIChuID49IDQgJiYgICAgICAgICAgICAgICAgICAgLyogaWYgcmVhZCBzb21lIGRhdGEgKi8KKwkgICAgZHAtPnRoX29wY29kZSA9PSBEQVRBICYmICAgIC8qIGFuZCBnb3QgYSBkYXRhIGJsb2NrICovCisJICAgIGJsb2NrID09IGRwLT50aF9ibG9jaykgewkvKiB0aGVuIG15IGxhc3QgYWNrIHdhcyBsb3N0ICovCisJCSh2b2lkKSBzZW5kKHBlZXIsIGFja2J1ZiwgNCwgMCk7ICAgICAvKiByZXNlbmQgZmluYWwgYWNrICovCisJfQorYWJvcnQ6CisJcmV0dXJuOworfQorCitzdHJ1Y3QgZXJybXNnIHsKKwlpbnQJZV9jb2RlOworCWNoYXIJKmVfbXNnOworfSBlcnJtc2dzW10gPSB7CisJeyBFVU5ERUYsCSJVbmRlZmluZWQgZXJyb3IgY29kZSIgfSwKKwl7IEVOT1RGT1VORCwJIkZpbGUgbm90IGZvdW5kIiB9LAorCXsgRUFDQ0VTUywJIkFjY2VzcyB2aW9sYXRpb24iIH0sCisJeyBFTk9TUEFDRSwJIkRpc2sgZnVsbCBvciBhbGxvY2F0aW9uIGV4Y2VlZGVkIiB9LAorCXsgRUJBRE9QLAkiSWxsZWdhbCBURlRQIG9wZXJhdGlvbiIgfSwKKwl7IEVCQURJRCwJIlVua25vd24gdHJhbnNmZXIgSUQiIH0sCisJeyBFRVhJU1RTLAkiRmlsZSBhbHJlYWR5IGV4aXN0cyIgfSwKKwl7IEVOT1VTRVIsCSJObyBzdWNoIHVzZXIiIH0sCisJeyAtMSwJCTAgfQorfTsKKworLyoKKyAqIFNlbmQgYSBuYWsgcGFja2V0IChlcnJvciBtZXNzYWdlKS4KKyAqIEVycm9yIGNvZGUgcGFzc2VkIGluIGlzIG9uZSBvZiB0aGUKKyAqIHN0YW5kYXJkIFRGVFAgY29kZXMsIG9yIGEgVU5JWCBlcnJubworICogb2Zmc2V0IGJ5IDEwMC4KKyAqLwordm9pZCBuYWsoaW50IGVycm9yKQoreworCXJlZ2lzdGVyIHN0cnVjdCB0ZnRwaGRyICp0cDsKKwlpbnQgbGVuZ3RoOworCXJlZ2lzdGVyIHN0cnVjdCBlcnJtc2cgKnBlOworCisJdHAgPSAoc3RydWN0IHRmdHBoZHIgKilidWY7CisJdHAtPnRoX29wY29kZSA9IGh0b25zKCh1X3Nob3J0KUVSUk9SKTsKKwl0cC0+dGhfY29kZSA9IGh0b25zKCh1X3Nob3J0KWVycm9yKTsKKwlmb3IgKHBlID0gZXJybXNnczsgcGUtPmVfY29kZSA+PSAwOyBwZSsrKQorCQlpZiAocGUtPmVfY29kZSA9PSBlcnJvcikKKwkJCWJyZWFrOworCWlmIChwZS0+ZV9jb2RlIDwgMCkgeworCQlwZS0+ZV9tc2cgPSBzdHJlcnJvcihlcnJvciAtIDEwMCk7CisJCXRwLT50aF9jb2RlID0gRVVOREVGOyAgIC8qIHNldCAndW5kZWYnIGVycm9yY29kZSAqLworCX0KKwlzdHJjcHkodHAtPnRoX21zZywgcGUtPmVfbXNnKTsKKwlsZW5ndGggPSBzdHJsZW4ocGUtPmVfbXNnKTsKKwl0cC0+dGhfbXNnW2xlbmd0aF0gPSAnXDAnOworCWxlbmd0aCArPSA1OworCWlmIChzZW5kKHBlZXIsIGJ1ZiwgbGVuZ3RoLCAwKSAhPSBsZW5ndGgpCisJCXN5c2xvZyhMT0dfRVJSLCAibmFrOiAlbVxuIik7Cit9CmRpZmYgLS1naXQgYS9pcHV0aWxzL3RmdHBzdWJzLmMgYi9pcHV0aWxzL3RmdHBzdWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2Mjc5NwotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvdGZ0cHN1YnMuYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CisvKnN0YXRpYyBjaGFyIHNjY3NpZFtdID0gImZyb206IEAoIyl0ZnRwc3Vicy5jCTUuNiAoQmVya2VsZXkpIDIvMjgvOTEiOyovCisvKiBzdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogdGZ0cHN1YnMuYyx2IDEuMiAxOTkzLzA4LzAxIDE4OjA3OjA0IG15Y3JvZnQgRXhwICQiOyAqLworI2VuZGlmIC8qIG5vdCBsaW50ICovCisKKy8qIFNpbXBsZSBtaW5kZWQgcmVhZC1haGVhZC93cml0ZS1iZWhpbmQgc3Vicm91dGluZXMgZm9yIHRmdHAgdXNlciBhbmQKKyAgIHNlcnZlci4gIFdyaXR0ZW4gb3JpZ2luYWxseSB3aXRoIG11bHRpcGxlIGJ1ZmZlcnMgaW4gbWluZCwgYnV0IGN1cnJlbnQKKyAgIGltcGxlbWVudGF0aW9uIGhhcyB0d28gYnVmZmVyIGxvZ2ljIHdpcmVkIGluLgorCisgICBUb2RvOiAgYWRkIHNvbWUgc29ydCBvZiBmaW5hbCBlcnJvciBjaGVjayBzbyB3aGVuIHRoZSB3cml0ZS1idWZmZXIKKyAgIGlzIGZpbmFsbHkgZmx1c2hlZCwgdGhlIGNhbGxlciBjYW4gZGV0ZWN0IGlmIHRoZSBkaXNrIGZpbGxlZCB1cAorICAgKG9yIGhhZCBhbiBpL28gZXJyb3IpIGFuZCByZXR1cm4gYSBuYWsgdG8gdGhlIG90aGVyIHNpZGUuCisKKwkJCUppbSBHdXl0b24gMTAvODUKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAidGZ0cC5oIgorCisjZGVmaW5lIFBLVFNJWkUgU0VHU0laRSs0ICAgICAgIC8qIHNob3VsZCBiZSBtb3ZlZCB0byB0ZnRwLmggKi8KKworc3RydWN0IGJmIHsKKwlpbnQgY291bnRlcjsgICAgICAgICAgICAvKiBzaXplIG9mIGRhdGEgaW4gYnVmZmVyLCBvciBmbGFnICovCisJY2hhciBidWZbUEtUU0laRV07ICAgICAgLyogcm9vbSBmb3IgZGF0YSBwYWNrZXQgKi8KK30gYmZzWzJdOworCisJCQkJLyogVmFsdWVzIGZvciBiZi5jb3VudGVyICAqLworI2RlZmluZSBCRl9BTExPQyAtMyAgICAgICAgICAgICAvKiBhbGxvYydkIGJ1dCBub3QgeWV0IGZpbGxlZCAqLworI2RlZmluZSBCRl9GUkVFICAtMiAgICAgICAgICAgICAvKiBmcmVlICovCisvKiBbLTEgLi4gU0VHU0laRV0gPSBzaXplIG9mIGRhdGEgaW4gdGhlIGRhdGEgYnVmZmVyICovCisKK3N0YXRpYyBpbnQgbmV4dG9uZTsgICAgIC8qIGluZGV4IG9mIG5leHQgYnVmZmVyIHRvIHVzZSAqLworc3RhdGljIGludCBjdXJyZW50OyAgICAgLyogaW5kZXggb2YgYnVmZmVyIGluIHVzZSAqLworCisJCQkvKiBjb250cm9sIGZsYWdzIGZvciBjcmxmIGNvbnZlcnNpb25zICovCitpbnQgbmV3bGluZSA9IDA7ICAgICAgICAvKiBmaWxsYnVmOiBpbiBtaWRkbGUgb2YgbmV3bGluZSBleHBhbnNpb24gKi8KK2ludCBwcmV2Y2hhciA9IC0xOyAgICAgIC8qIHB1dGJ1ZjogcHJldmlvdXMgY2hhciAoY3IgY2hlY2spICovCisKK3N0cnVjdCB0ZnRwaGRyICpyd19pbml0KGludCk7CisKK3N0cnVjdCB0ZnRwaGRyICp3X2luaXQoKSB7IHJldHVybiByd19pbml0KDApOyB9ICAgICAgICAgLyogd3JpdGUtYmVoaW5kICovCitzdHJ1Y3QgdGZ0cGhkciAqcl9pbml0KCkgeyByZXR1cm4gcndfaW5pdCgxKTsgfSAgICAgICAgIC8qIHJlYWQtYWhlYWQgKi8KKworLyogaW5pdCBmb3IgZWl0aGVyIHJlYWQtYWhlYWQgb3Igd3JpdGUtYmVoaW5kICovCisvKiB4IGlzIHplcm8gZm9yIHdyaXRlLWJlaGluZCwgb25lIGZvciByZWFkLWhlYWQgKi8KK3N0cnVjdCB0ZnRwaGRyICpyd19pbml0KGludCB4KQoreworCW5ld2xpbmUgPSAwOyAgICAgICAgICAgIC8qIGluaXQgY3JsZiBmbGFnICovCisJcHJldmNoYXIgPSAtMTsKKwliZnNbMF0uY291bnRlciA9ICBCRl9BTExPQzsgICAgIC8qIHBhc3Mgb3V0IHRoZSBmaXJzdCBidWZmZXIgKi8KKwljdXJyZW50ID0gMDsKKwliZnNbMV0uY291bnRlciA9IEJGX0ZSRUU7CisJbmV4dG9uZSA9IHg7ICAgICAgICAgICAgICAgICAgICAvKiBhaGVhZCBvciBiZWhpbmQ/ICovCisJcmV0dXJuIChzdHJ1Y3QgdGZ0cGhkciAqKWJmc1swXS5idWY7Cit9CisKKworLyogSGF2ZSBlbXB0aWVkIGN1cnJlbnQgYnVmZmVyIGJ5IHNlbmRpbmcgdG8gbmV0IGFuZCBnZXR0aW5nIGFjay4KKyAgIEZyZWUgaXQgYW5kIHJldHVybiBuZXh0IGJ1ZmZlciBmaWxsZWQgd2l0aCBkYXRhLgorICovCitpbnQgcmVhZGl0KEZJTEUgKiBmaWxlLCBzdHJ1Y3QgdGZ0cGhkciAqKmRwcCwgaW50IGNvbnZlcnQpCit7CisJc3RydWN0IGJmICpiOworCisJYmZzW2N1cnJlbnRdLmNvdW50ZXIgPSBCRl9GUkVFOyAvKiBmcmVlIG9sZCBvbmUgKi8KKwljdXJyZW50ID0gIWN1cnJlbnQ7ICAgICAgICAgICAgIC8qICJpbmNyIiBjdXJyZW50ICovCisKKwliID0gJmJmc1tjdXJyZW50XTsgICAgICAgICAgICAgIC8qIGxvb2sgYXQgbmV3IGJ1ZmZlciAqLworCWlmIChiLT5jb3VudGVyID09IEJGX0ZSRUUpICAgICAgLyogaWYgaXQncyBlbXB0eSAqLworCQlyZWFkX2FoZWFkKGZpbGUsIGNvbnZlcnQpOyAgICAgIC8qIGZpbGwgaXQgKi8KKyNpZiAwCisJYXNzZXJ0KGItPmNvdW50ZXIgIT0gQkZfRlJFRSk7ICAvKiBjaGVjayAqLworI2VuZGlmCisJKmRwcCA9IChzdHJ1Y3QgdGZ0cGhkciAqKWItPmJ1ZjsgICAgICAgIC8qIHNldCBjYWxsZXIncyBwdHIgKi8KKwlyZXR1cm4gYi0+Y291bnRlcjsKK30KKworLyoKKyAqIGZpbGwgdGhlIGlucHV0IGJ1ZmZlciwgZG9pbmcgYXNjaWkgY29udmVyc2lvbnMgaWYgcmVxdWVzdGVkCisgKiBjb252ZXJzaW9ucyBhcmUgIGxmIC0+IGNyLGxmICBhbmQgY3IgLT4gY3IsIG51bAorICovCit2b2lkIHJlYWRfYWhlYWQoRklMRSAqZmlsZSwgaW50IGNvbnZlcnQpCit7CisJcmVnaXN0ZXIgaW50IGk7CisJcmVnaXN0ZXIgY2hhciAqcDsKKwlyZWdpc3RlciBpbnQgYzsKKwlzdHJ1Y3QgYmYgKmI7CisJc3RydWN0IHRmdHBoZHIgKmRwOworCisJYiA9ICZiZnNbbmV4dG9uZV07ICAgICAgICAgICAgICAvKiBsb29rIGF0ICJuZXh0IiBidWZmZXIgKi8KKwlpZiAoYi0+Y291bnRlciAhPSBCRl9GUkVFKSAgICAgIC8qIG5vcCBpZiBub3QgZnJlZSAqLworCQlyZXR1cm47CisJbmV4dG9uZSA9ICFuZXh0b25lOyAgICAgICAgICAgICAvKiAiaW5jciIgbmV4dCBidWZmZXIgcHRyICovCisKKwlkcCA9IChzdHJ1Y3QgdGZ0cGhkciAqKWItPmJ1ZjsKKworCWlmIChjb252ZXJ0ID09IDApIHsKKwkJYi0+Y291bnRlciA9IHJlYWQoZmlsZW5vKGZpbGUpLCBkcC0+dGhfZGF0YSwgU0VHU0laRSk7CisJCXJldHVybjsKKwl9CisKKwlwID0gZHAtPnRoX2RhdGE7CisJZm9yIChpID0gMCA7IGkgPCBTRUdTSVpFOyBpKyspIHsKKwkJaWYgKG5ld2xpbmUpIHsKKwkJCWlmIChwcmV2Y2hhciA9PSAnXG4nKQorCQkJCWMgPSAnXG4nOyAgICAgICAvKiBsZiB0byBjcixsZiAqLworCQkJZWxzZSAgICBjID0gJ1wwJzsgICAgICAgLyogY3IgdG8gY3IsbnVsICovCisJCQluZXdsaW5lID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCWMgPSBnZXRjKGZpbGUpOworCQkJaWYgKGMgPT0gRU9GKSBicmVhazsKKwkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKSB7CisJCQkJcHJldmNoYXIgPSBjOworCQkJCWMgPSAnXHInOworCQkJCW5ld2xpbmUgPSAxOworCQkJfQorCQl9CisJICAgICAgICpwKysgPSBjOworCX0KKwliLT5jb3VudGVyID0gKGludCkocCAtIGRwLT50aF9kYXRhKTsKK30KKworLyogVXBkYXRlIGNvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyLCBnZXQgbmV3IGJ1ZmZlcgorICAgZnJvbSB0aGUgcXVldWUuICBDYWxscyB3cml0ZV9iZWhpbmQgb25seSBpZiBuZXh0IGJ1ZmZlciBub3QKKyAgIGF2YWlsYWJsZS4KKyAqLworaW50IHdyaXRlaXQoRklMRSAqZmlsZSwgc3RydWN0IHRmdHBoZHIgKipkcHAsIGludCBjdCwgaW50IGNvbnZlcnQpCit7CisJYmZzW2N1cnJlbnRdLmNvdW50ZXIgPSBjdDsgICAgICAvKiBzZXQgc2l6ZSBvZiBkYXRhIHRvIHdyaXRlICovCisJY3VycmVudCA9ICFjdXJyZW50OyAgICAgICAgICAgICAvKiBzd2l0Y2ggdG8gb3RoZXIgYnVmZmVyICovCisJaWYgKGJmc1tjdXJyZW50XS5jb3VudGVyICE9IEJGX0ZSRUUpICAgICAvKiBpZiBub3QgZnJlZSAqLworCQl3cml0ZV9iZWhpbmQoZmlsZSwgY29udmVydCk7ICAgICAvKiBmbHVzaCBpdCAqLworCWJmc1tjdXJyZW50XS5jb3VudGVyID0gQkZfQUxMT0M7ICAgICAgICAvKiBtYXJrIGFzIGFsbG9jJ2QgKi8KKwkqZHBwID0gIChzdHJ1Y3QgdGZ0cGhkciAqKWJmc1tjdXJyZW50XS5idWY7CisJcmV0dXJuIGN0OyAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIGEgbGllIG9mIGNvdXJzZSAqLworfQorCisvKgorICogT3V0cHV0IGEgYnVmZmVyIHRvIGEgZmlsZSwgY29udmVydGluZyBmcm9tIG5ldGFzY2lpIGlmIHJlcXVlc3RlZC4KKyAqIENSLE5VTCAtPiBDUiAgYW5kIENSLExGID0+IExGLgorICogTm90ZSBzcGVjIGlzIHVuZGVmaW5lZCBpZiB3ZSBnZXQgQ1IgYXMgbGFzdCBieXRlIG9mIGZpbGUgb3IgYQorICogQ1IgZm9sbG93ZWQgYnkgYW55dGhpbmcgZWxzZS4gIEluIHRoaXMgY2FzZSB3ZSBsZWF2ZSBpdCBhbG9uZS4KKyAqLworaW50IHdyaXRlX2JlaGluZChGSUxFICpmaWxlLCBpbnQgY29udmVydCkKK3sKKwljaGFyICpidWY7CisJaW50IGNvdW50OworCXJlZ2lzdGVyIGludCBjdDsKKwlyZWdpc3RlciBjaGFyICpwOworCXJlZ2lzdGVyIGludCBjOyAgICAgICAgICAgICAgICAgLyogY3VycmVudCBjaGFyYWN0ZXIgKi8KKwlzdHJ1Y3QgYmYgKmI7CisJc3RydWN0IHRmdHBoZHIgKmRwOworCisJYiA9ICZiZnNbbmV4dG9uZV07CisJaWYgKGItPmNvdW50ZXIgPCAtMSkgICAgICAgICAgICAvKiBhbnl0aGluZyB0byBmbHVzaD8gKi8KKwkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyoganVzdCBub3AgaWYgbm90aGluZyB0byBkbyAqLworCisJY291bnQgPSBiLT5jb3VudGVyOyAgICAgICAgICAgICAvKiByZW1lbWJlciBieXRlIGNvdW50ICovCisJYi0+Y291bnRlciA9IEJGX0ZSRUU7ICAgICAgICAgICAvKiByZXNldCBmbGFnICovCisJZHAgPSAoc3RydWN0IHRmdHBoZHIgKiliLT5idWY7CisJbmV4dG9uZSA9ICFuZXh0b25lOyAgICAgICAgICAgICAvKiBpbmNyIGZvciBuZXh0IHRpbWUgKi8KKwlidWYgPSBkcC0+dGhfZGF0YTsKKworCWlmIChjb3VudCA8PSAwKSByZXR1cm4gLTE7ICAgICAgLyogbmFrIGxvZ2ljPyAqLworCisJaWYgKGNvbnZlcnQgPT0gMCkKKwkJcmV0dXJuIHdyaXRlKGZpbGVubyhmaWxlKSwgYnVmLCBjb3VudCk7CisKKwlwID0gYnVmOworCWN0ID0gY291bnQ7CisJd2hpbGUgKGN0LS0pIHsgICAgICAgICAgICAgICAgICAvKiBsb29wIG92ZXIgdGhlIGJ1ZmZlciAqLworCSAgICBjID0gKnArKzsgICAgICAgICAgICAgICAgICAgLyogcGljayB1cCBhIGNoYXJhY3RlciAqLworCSAgICBpZiAocHJldmNoYXIgPT0gJ1xyJykgeyAgICAgLyogaWYgcHJldiBjaGFyIHdhcyBjciAqLworCQlpZiAoYyA9PSAnXG4nKSAgICAgICAgICAvKiBpZiBoYXZlIGNyLGxmIHRoZW4ganVzdCAqLworCQkgICBmc2VlayhmaWxlLCAtMSwgMSk7ICAvKiBzbWFzaCBsZiBvbiB0b3Agb2YgdGhlIGNyICovCisJCWVsc2UKKwkJICAgaWYgKGMgPT0gJ1wwJykgICAgICAgLyogaWYgaGF2ZSBjcixudWwgdGhlbiAqLworCQkJZ290byBza2lwaXQ7ICAgIC8qIGp1c3Qgc2tpcCBvdmVyIHRoZSBwdXRjICovCisJCS8qIGVsc2UganVzdCBmYWxsIHRocm91Z2ggYW5kIGFsbG93IGl0ICovCisJICAgIH0KKwkgICAgcHV0YyhjLCBmaWxlKTsKK3NraXBpdDoKKwkgICAgcHJldmNoYXIgPSBjOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKworLyogV2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHR3byBzaWRlcworICogYXJlIG91dCBvZiBzeW5jaC4gIEllOiB0aGF0IHdoYXQgSSB0aGluayBpcyB0aGUgb3RoZXIgc2lkZSdzCisgKiByZXNwb25zZSB0byBwYWNrZXQgTiBpcyByZWFsbHkgdGhlaXIgcmVzcG9uc2UgdG8gcGFja2V0IE4tMS4KKyAqCisgKiBTbywgdG8gdHJ5IHRvIHByZXZlbnQgdGhhdCwgd2UgZmx1c2ggYWxsIHRoZSBpbnB1dCBxdWV1ZWQgdXAKKyAqIGZvciB1cyBvbiB0aGUgbmV0d29yayBjb25uZWN0aW9uIG9uIG91ciBob3N0LgorICoKKyAqIFdlIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UgZmx1c2hlZCAobW9zdGx5IGZvciByZXBvcnRpbmcKKyAqIHdoZW4gdHJhY2UgaXMgYWN0aXZlKS4KKyAqLworCitpbnQgc3luY2huZXQoaW50IGYpCit7CisJaW50IGogPSAwOworCWNoYXIgZHVtbXk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocmVjdihmLCAmZHVtbXksIDEsIE1TR19ET05UV0FJVCkgPCAwKQorCQkJYnJlYWs7CisJCWorKzsKKwl9CisJcmV0dXJuIGo7Cit9CmRpZmYgLS1naXQgYS9pcHV0aWxzL3RyYWNlcGF0aC5jIGIvaXB1dGlscy90cmFjZXBhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTkwMjMxCi0tLSAvZGV2L251bGwKKysrIGIvaXB1dGlscy90cmFjZXBhdGguYwpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIHRyYWNlcGF0aC5jCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxyZXNvbHYuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpZmRlZiBVU0VfSUROCisjaW5jbHVkZSA8aWRuYS5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgSVBfUE1UVURJU0NfUFJPQkUKKyNkZWZpbmUgSVBfUE1UVURJU0NfUFJPQkUJMworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0hPUFNfTElNSVQJCTI1NQorI2RlZmluZSBNQVhfSE9QU19ERUZBVUxUCTMwCisKK3N0cnVjdCBoaGlzdG9yeQoreworCWludAlob3BzOworCXN0cnVjdCB0aW1ldmFsIHNlbmR0aW1lOworfTsKKworc3RydWN0IGhoaXN0b3J5IGhpc1s2NF07CitpbnQgaGlzcHRyOworCitzdHJ1Y3Qgc29ja2FkZHJfaW4gdGFyZ2V0OworX191MTYgYmFzZV9wb3J0OworaW50IG1heF9ob3BzID0gTUFYX0hPUFNfREVGQVVMVDsKKworY29uc3QgaW50IG92ZXJoZWFkID0gMjg7CitpbnQgbXR1ID0gNjU1MzU7Cit2b2lkICpwa3RidWY7CitpbnQgaG9wc190byA9IC0xOworaW50IGhvcHNfZnJvbSA9IC0xOworaW50IG5vX3Jlc29sdmUgPSAwOworaW50IHNob3dfYm90aCA9IDA7CisKKyNkZWZpbmUgSE9TVF9DT0xVTU5fU0laRQk1MgorCitzdHJ1Y3QgcHJvYmVoZHIKK3sKKwlfX3UzMiB0dGw7CisJc3RydWN0IHRpbWV2YWwgdHY7Cit9OworCit2b2lkIGRhdGFfd2FpdChpbnQgZmQpCit7CisJZmRfc2V0IGZkczsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlGRF9aRVJPKCZmZHMpOworCUZEX1NFVChmZCwgJmZkcyk7CisJdHYudHZfc2VjID0gMTsKKwl0di50dl91c2VjID0gMDsKKwlzZWxlY3QoZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKK30KKwordm9pZCBwcmludF9ob3N0KGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIGludCBib3RoKQoreworCWludCBwbGVuOworCXBsZW4gPSBwcmludGYoIiVzIiwgYSk7CisJaWYgKGJvdGgpCisJCXBsZW4gKz0gcHJpbnRmKCIgKCVzKSIsIGIpOworCWlmIChwbGVuID49IEhPU1RfQ09MVU1OX1NJWkUpCisJCXBsZW4gPSBIT1NUX0NPTFVNTl9TSVpFIC0gMTsKKwlwcmludGYoIiUqcyIsIEhPU1RfQ09MVU1OX1NJWkUgLSBwbGVuLCAiIik7Cit9CisKK2ludCByZWN2ZXJyKGludCBmZCwgaW50IHR0bCkKK3sKKwlpbnQgcmVzOworCXN0cnVjdCBwcm9iZWhkciByY3ZidWY7CisJY2hhciBjYnVmWzUxMl07CisJc3RydWN0IGlvdmVjICBpb3Y7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyICplOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCB0aW1ldmFsICpyZXR0djsKKwlpbnQgc2xvdDsKKwlpbnQgcmV0aG9wczsKKwlpbnQgc25kaG9wczsKKwlpbnQgcHJvZ3Jlc3MgPSAtMTsKKwlpbnQgYnJva2VuX3JvdXRlcjsKKworcmVzdGFydDoKKwltZW1zZXQoJnJjdmJ1ZiwgLTEsIHNpemVvZihyY3ZidWYpKTsKKwlpb3YuaW92X2Jhc2UgPSAmcmN2YnVmOworCWlvdi5pb3ZfbGVuID0gc2l6ZW9mKHJjdmJ1Zik7CisJbXNnLm1zZ19uYW1lID0gKF9fdTgqKSZhZGRyOworCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihhZGRyKTsKKwltc2cubXNnX2lvdiA9ICZpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCW1zZy5tc2dfY29udHJvbCA9IGNidWY7CisJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNidWYpOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJcmVzID0gcmVjdm1zZyhmZCwgJm1zZywgTVNHX0VSUlFVRVVFKTsKKwlpZiAocmVzIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJcmV0dXJuIHByb2dyZXNzOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJcHJvZ3Jlc3MgPSBtdHU7CisKKwlyZXRob3BzID0gLTE7CisJc25kaG9wcyA9IC0xOworCWUgPSBOVUxMOworCXJldHR2ID0gTlVMTDsKKwlzbG90ID0gbnRvaHMoYWRkci5zaW5fcG9ydCkgLSBiYXNlX3BvcnQ7CisJaWYgKHNsb3Q+PTAgJiYgc2xvdCA8IDYzICYmIGhpc1tzbG90XS5ob3BzKSB7CisJCXNuZGhvcHMgPSBoaXNbc2xvdF0uaG9wczsKKwkJcmV0dHYgPSAmaGlzW3Nsb3RdLnNlbmR0aW1lOworCQloaXNbc2xvdF0uaG9wcyA9IDA7CisJfQorCWJyb2tlbl9yb3V0ZXIgPSAwOworCWlmIChyZXMgPT0gc2l6ZW9mKHJjdmJ1ZikpIHsKKwkJaWYgKHJjdmJ1Zi50dGwgPT0gMCB8fCByY3ZidWYudHYudHZfc2VjID09IDApIHsKKwkJCWJyb2tlbl9yb3V0ZXIgPSAxOworCQl9IGVsc2UgeworCQkJc25kaG9wcyA9IHJjdmJ1Zi50dGw7CisJCQlyZXR0diA9ICZyY3ZidWYudHY7CisJCX0KKwl9CisKKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOyBjbXNnOyBjbXNnID0gQ01TR19OWFRIRFIoJm1zZywgY21zZykpIHsKKwkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgPT0gU09MX0lQKSB7CisJCQlpZiAoY21zZy0+Y21zZ190eXBlID09IElQX1JFQ1ZFUlIpIHsKKwkJCQllID0gKHN0cnVjdCBzb2NrX2V4dGVuZGVkX2VyciAqKSBDTVNHX0RBVEEoY21zZyk7CisJCQl9IGVsc2UgaWYgKGNtc2ctPmNtc2dfdHlwZSA9PSBJUF9UVEwpIHsKKwkJCQltZW1jcHkoJnJldGhvcHMsIENNU0dfREFUQShjbXNnKSwgc2l6ZW9mKHJldGhvcHMpKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJjbXNnOiVkXG4gIiwgY21zZy0+Y21zZ190eXBlKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZSA9PSBOVUxMKSB7CisJCXByaW50Zigibm8gaW5mb1xuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZS0+ZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9MT0NBTCkgeworCQlwcmludGYoIiUyZD86ICUqcyAiLCB0dGwsIC0oSE9TVF9DT0xVTU5fU0laRSAtIDEpLCAiW0xPQ0FMSE9TVF0iKTsKKwl9IGVsc2UgaWYgKGUtPmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUCkgeworCQljaGFyIGFidWZbMTI4XTsKKwkJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luKikoZSsxKTsKKwkJc3RydWN0IGhvc3RlbnQgKmggPSBOVUxMOworCQljaGFyICppZG4gPSBOVUxMOworCisJCWluZXRfbnRvcChBRl9JTkVULCAmc2luLT5zaW5fYWRkciwgYWJ1Ziwgc2l6ZW9mKGFidWYpKTsKKworCQlpZiAoc25kaG9wcz4wKQorCQkJcHJpbnRmKCIlMmQ6ICAiLCBzbmRob3BzKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlMmQ/OiAiLCB0dGwpOworCisJCWlmICghbm9fcmVzb2x2ZSB8fCBzaG93X2JvdGgpIHsKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJaCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikgJnNpbi0+c2luX2FkZHIsIHNpemVvZihzaW4tPnNpbl9hZGRyKSwgQUZfSU5FVCk7CisJCX0KKworI2lmZGVmIFVTRV9JRE4KKwkJaWYgKGggJiYgaWRuYV90b191bmljb2RlX2x6bHooaC0+aF9uYW1lLCAmaWRuLCAwKSAhPSBJRE5BX1NVQ0NFU1MpCisJCQlpZG4gPSBOVUxMOworI2VuZGlmCisJCWlmIChub19yZXNvbHZlKQorCQkJcHJpbnRfaG9zdChhYnVmLCBoID8gKGlkbiA/IGlkbiA6IGgtPmhfbmFtZSkgOiBhYnVmLCBzaG93X2JvdGgpOworCQllbHNlCisJCQlwcmludF9ob3N0KGggPyAoaWRuID8gaWRuIDogaC0+aF9uYW1lKSA6IGFidWYsIGFidWYsIHNob3dfYm90aCk7CisKKyNpZmRlZiBVU0VfSUROCisJCWZyZWUoaWRuKTsKKyNlbmRpZgorCX0KKworCWlmIChyZXR0dikgeworCQlpbnQgZGlmZiA9ICh0di50dl9zZWMtcmV0dHYtPnR2X3NlYykqMTAwMDAwMCsodHYudHZfdXNlYy1yZXR0di0+dHZfdXNlYyk7CisJCXByaW50ZigiJTNkLiUwM2RtcyAiLCBkaWZmLzEwMDAsIGRpZmYlMTAwMCk7CisJCWlmIChicm9rZW5fcm91dGVyKQorCQkJcHJpbnRmKCIoVGhpcyBicm9rZW4gcm91dGVyIHJldHVybmVkIGNvcnJ1cHRlZCBwYXlsb2FkKSAiKTsKKwl9CisKKwlzd2l0Y2ggKGUtPmVlX2Vycm5vKSB7CisJY2FzZSBFVElNRURPVVQ6CisJCXByaW50ZigiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFTVNHU0laRToKKwkJcHJpbnRmKCJwbXR1ICVkXG4iLCBlLT5lZV9pbmZvKTsKKwkJbXR1ID0gZS0+ZWVfaW5mbzsKKwkJcHJvZ3Jlc3MgPSBtdHU7CisJCWJyZWFrOworCWNhc2UgRUNPTk5SRUZVU0VEOgorCQlwcmludGYoInJlYWNoZWRcbiIpOworCQlob3BzX3RvID0gc25kaG9wczwwID8gdHRsIDogc25kaG9wczsKKwkJaG9wc19mcm9tID0gcmV0aG9wczsKKwkJcmV0dXJuIDA7CisJY2FzZSBFUFJPVE86CisJCXByaW50ZigiIVBcbiIpOworCQlyZXR1cm4gMDsKKwljYXNlIEVIT1NUVU5SRUFDSDoKKwkJaWYgKGUtPmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUCAmJgorCQkgICAgZS0+ZWVfdHlwZSA9PSAxMSAmJgorCQkgICAgZS0+ZWVfY29kZSA9PSAwKSB7CisJCQlpZiAocmV0aG9wcz49MCkgeworCQkJCWlmIChyZXRob3BzPD02NCkKKwkJCQkJcmV0aG9wcyA9IDY1LXJldGhvcHM7CisJCQkJZWxzZSBpZiAocmV0aG9wczw9MTI4KQorCQkJCQlyZXRob3BzID0gMTI5LXJldGhvcHM7CisJCQkJZWxzZQorCQkJCQlyZXRob3BzID0gMjU2LXJldGhvcHM7CisJCQkJaWYgKHNuZGhvcHM+PTAgJiYgcmV0aG9wcyAhPSBzbmRob3BzKQorCQkJCQlwcmludGYoImFzeW1tICUyZCAiLCByZXRob3BzKTsKKwkJCQllbHNlIGlmIChzbmRob3BzPDAgJiYgcmV0aG9wcyAhPSB0dGwpCisJCQkJCXByaW50ZigiYXN5bW0gJTJkICIsIHJldGhvcHMpOworCQkJfQorCQkJcHJpbnRmKCJcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCIhSFxuIik7CisJCXJldHVybiAwOworCWNhc2UgRU5FVFVOUkVBQ0g6CisJCXByaW50ZigiIU5cbiIpOworCQlyZXR1cm4gMDsKKwljYXNlIEVBQ0NFUzoKKwkJcHJpbnRmKCIhQVxuIik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXByaW50ZigiXG4iKTsKKwkJZXJybm8gPSBlLT5lZV9lcnJubzsKKwkJcGVycm9yKCJORVQgRVJST1IiKTsKKwkJcmV0dXJuIDA7CisJfQorCWdvdG8gcmVzdGFydDsKK30KKworaW50IHByb2JlX3R0bChpbnQgZmQsIGludCB0dGwpCit7CisJaW50IGk7CisJc3RydWN0IHByb2JlaGRyICpoZHIgPSBwa3RidWY7CisKKwltZW1zZXQocGt0YnVmLCAwLCBtdHUpOworcmVzdGFydDoKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKSB7CisJCWludCByZXM7CisKKwkJaGRyLT50dGwgPSB0dGw7CisJCXRhcmdldC5zaW5fcG9ydCA9IGh0b25zKGJhc2VfcG9ydCArIGhpc3B0cik7CisJCWdldHRpbWVvZmRheSgmaGRyLT50diwgTlVMTCk7CisJCWhpc1toaXNwdHJdLmhvcHMgPSB0dGw7CisJCWhpc1toaXNwdHJdLnNlbmR0aW1lID0gaGRyLT50djsKKwkJaWYgKHNlbmR0byhmZCwgcGt0YnVmLCBtdHUtb3ZlcmhlYWQsIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSZ0YXJnZXQsIHNpemVvZih0YXJnZXQpKSA+IDApCisJCQlicmVhazsKKwkJcmVzID0gcmVjdmVycihmZCwgdHRsKTsKKwkJaGlzW2hpc3B0cl0uaG9wcyA9IDA7CisJCWlmIChyZXM9PTApCisJCQlyZXR1cm4gMDsKKwkJaWYgKHJlcyA+IDApCisJCQlnb3RvIHJlc3RhcnQ7CisJfQorCWhpc3B0ciA9IChoaXNwdHIgKyAxKSY2MzsKKworCWlmIChpPDEwKSB7CisJCWRhdGFfd2FpdChmZCk7CisJCWlmIChyZWN2KGZkLCBwa3RidWYsIG10dSwgTVNHX0RPTlRXQUlUKSA+IDApIHsKKwkJCXByaW50ZigiJTJkPzogcmVwbHkgcmVjZWl2ZWQgOClcbiIsIHR0bCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gcmVjdmVycihmZCwgdHRsKTsKKwl9CisKKwlwcmludGYoIiUyZDogIHNlbmQgZmFpbGVkXG4iLCB0dGwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZSgobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0cmFjZXBhdGggWy1uXSBbLWJdIFstbCA8bGVuPl0gWy1wIHBvcnRdIDxkZXN0aW5hdGlvbj5cbiIpOworCWV4aXQoLTEpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBob3N0ZW50ICpoZTsKKwlpbnQgZmQ7CisJaW50IG9uOworCWludCB0dGw7CisJY2hhciAqcDsKKwlpbnQgY2g7CisjaWZkZWYgVVNFX0lETgorCWludCByYzsKKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisjZW5kaWYKKworCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIm5iaD9sOm06cDoiKSkgIT0gRU9GKSB7CisJCXN3aXRjaChjaCkgeworCQljYXNlICduJzoKKwkJCW5vX3Jlc29sdmUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJc2hvd19ib3RoID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWlmICgobXR1ID0gYXRvaShvcHRhcmcpKSA8PSBvdmVyaGVhZCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHBrdGxlbiBtdXN0IGJlID4gJWQgYW5kIDw9ICVkLlxuIiwKKwkJCQkJb3ZlcmhlYWQsIElOVF9NQVgpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQltYXhfaG9wcyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChtYXhfaG9wcyA8IDAgfHwgbWF4X2hvcHMgPiBNQVhfSE9QU19MSU1JVCkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiRXJyb3I6IG1heCBob3BzIG11c3QgYmUgMCAuLiAlZCAoaW5jbHVzaXZlKS5cbiIsCisJCQkJCU1BWF9IT1BTX0xJTUlUKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCWJhc2VfcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJfQorCX0KKworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGFyZ2MgIT0gMSkKKwkJdXNhZ2UoKTsKKworCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJzb2NrZXQiKTsKKwkJZXhpdCgxKTsKKwl9CisJdGFyZ2V0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisJLyogQmFja3dhcmQgY29tcGF0aWJsaXR5ICovCisJaWYgKCFiYXNlX3BvcnQpIHsKKwkJcCA9IHN0cmNocihhcmd2WzBdLCAnLycpOworCQlpZiAocCkgeworCQkJKnAgPSAwOworCQkJYmFzZV9wb3J0ID0gYXRvaShwKzEpOworCQl9IGVsc2UKKwkJCWJhc2VfcG9ydCA9IDQ0NDQ0OworCX0KKworCXAgPSBhcmd2WzBdOworI2lmZGVmIFVTRV9JRE4KKwlyYyA9IGlkbmFfdG9fYXNjaWlfbHooYXJndlswXSwgJnAsIDApOworCWlmIChyYyAhPSBJRE5BX1NVQ0NFU1MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJRE5BIGVuY29kaW5nIGZhaWxlZDogJXNcbiIsIGlkbmFfc3RyZXJyb3IocmMpKTsKKwkJZXhpdCgyKTsKKwl9CisjZW5kaWYKKworCWhlID0gZ2V0aG9zdGJ5bmFtZShwKTsKKwlpZiAoaGUgPT0gTlVMTCkgeworCQloZXJyb3IoImdldGhvc3RieW5hbWUiKTsKKwkJZXhpdCgxKTsKKwl9CisKKyNpZmRlZiBVU0VfSUROCisJZnJlZShwKTsKKyNlbmRpZgorCisJbWVtY3B5KCZ0YXJnZXQuc2luX2FkZHIsIGhlLT5oX2FkZHIsIDQpOworCisJb24gPSBJUF9QTVRVRElTQ19QUk9CRTsKKwlpZiAoc2V0c29ja29wdChmZCwgU09MX0lQLCBJUF9NVFVfRElTQ09WRVIsICZvbiwgc2l6ZW9mKG9uKSkgJiYKKwkgICAgKG9uID0gSVBfUE1UVURJU0NfRE8sCisJICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfSVAsIElQX01UVV9ESVNDT1ZFUiwgJm9uLCBzaXplb2Yob24pKSkpIHsKKwkJcGVycm9yKCJJUF9NVFVfRElTQ09WRVIiKTsKKwkJZXhpdCgxKTsKKwl9CisJb24gPSAxOworCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVAsIElQX1JFQ1ZFUlIsICZvbiwgc2l6ZW9mKG9uKSkpIHsKKwkJcGVycm9yKCJJUF9SRUNWRVJSIik7CisJCWV4aXQoMSk7CisJfQorCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVAsIElQX1JFQ1ZUVEwsICZvbiwgc2l6ZW9mKG9uKSkpIHsKKwkJcGVycm9yKCJJUF9SRUNWVFRMIik7CisJCWV4aXQoMSk7CisJfQorCisJcGt0YnVmID0gbWFsbG9jKG10dSk7CisJaWYgKCFwa3RidWYpIHsKKwkJcGVycm9yKCJtYWxsb2MiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlmb3IgKHR0bCA9IDE7IHR0bCA8PSBtYXhfaG9wczsgdHRsKyspIHsKKwkJaW50IHJlczsKKwkJaW50IGk7CisKKwkJb24gPSB0dGw7CisJCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVAsIElQX1RUTCwgJm9uLCBzaXplb2Yob24pKSkgeworCQkJcGVycm9yKCJJUF9UVEwiKTsKKwkJCWV4aXQoMSk7CisJCX0KKworcmVzdGFydDoKKwkJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCQlpbnQgb2xkX210dTsKKworCQkJb2xkX210dSA9IG10dTsKKwkJCXJlcyA9IHByb2JlX3R0bChmZCwgdHRsKTsKKwkJCWlmIChtdHUgIT0gb2xkX210dSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQlpZiAocmVzID09IDApCisJCQkJZ290byBkb25lOworCQkJaWYgKHJlcyA+IDApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVzIDwgMCkKKwkJCXByaW50ZigiJTJkOiAgbm8gcmVwbHlcbiIsIHR0bCk7CisJfQorCXByaW50ZigiICAgICBUb28gbWFueSBob3BzOiBwbXR1ICVkXG4iLCBtdHUpOworZG9uZToKKwlwcmludGYoIiAgICAgUmVzdW1lOiBwbXR1ICVkICIsIG10dSk7CisJaWYgKGhvcHNfdG8+PTApCisJCXByaW50ZigiaG9wcyAlZCAiLCBob3BzX3RvKTsKKwlpZiAoaG9wc19mcm9tPj0wKQorCQlwcmludGYoImJhY2sgJWQgIiwgaG9wc19mcm9tKTsKKwlwcmludGYoIlxuIik7CisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2lwdXRpbHMvdHJhY2VwYXRoNi5jIGIvaXB1dGlscy90cmFjZXBhdGg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhNWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2lwdXRpbHMvdHJhY2VwYXRoNi5jCkBAIC0wLDAgKzEsNTg4IEBACisvKgorICogdHJhY2VwYXRoNi5jCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJxdWV1ZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxyZXNvbHYuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2lmZGVmIFVTRV9JRE4KKyNpbmNsdWRlIDxpZG5hLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBTT0xfSVBWNgorI2RlZmluZSBTT0xfSVBWNiBJUFBST1RPX0lQVjYKKyNlbmRpZgorCisjaWZuZGVmIElQX1BNVFVESVNDX0RPCisjZGVmaW5lIElQX1BNVFVESVNDX0RPCQkzCisjZW5kaWYKKyNpZm5kZWYgSVBWNl9QTVRVRElTQ19ETworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPCTMKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9IT1BTX0xJTUlUCQkyNTUKKyNkZWZpbmUgTUFYX0hPUFNfREVGQVVMVAkzMAorCitzdHJ1Y3QgaGhpc3RvcnkKK3sKKwlpbnQJaG9wczsKKwlzdHJ1Y3QgdGltZXZhbCBzZW5kdGltZTsKK307CisKK3N0cnVjdCBoaGlzdG9yeSBoaXNbNjRdOworaW50IGhpc3B0cjsKKworc2FfZmFtaWx5X3QgZmFtaWx5ID0gQUZfSU5FVDY7CitzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB0YXJnZXQ7Citzb2NrbGVuX3QgdGFyZ2V0bGVuOworX191MTYgYmFzZV9wb3J0OworaW50IG1heF9ob3BzID0gTUFYX0hPUFNfREVGQVVMVDsKKworaW50IG92ZXJoZWFkOworaW50IG10dTsKK3ZvaWQgKnBrdGJ1ZjsKK2ludCBob3BzX3RvID0gLTE7CitpbnQgaG9wc19mcm9tID0gLTE7CitpbnQgbm9fcmVzb2x2ZSA9IDA7CitpbnQgc2hvd19ib3RoID0gMDsKK2ludCBtYXBwZWQ7CisKKyNkZWZpbmUgSE9TVF9DT0xVTU5fU0laRQk1MgorCitzdHJ1Y3QgcHJvYmVoZHIKK3sKKwlfX3UzMiB0dGw7CisJc3RydWN0IHRpbWV2YWwgdHY7Cit9OworCit2b2lkIGRhdGFfd2FpdChpbnQgZmQpCit7CisJZmRfc2V0IGZkczsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlGRF9aRVJPKCZmZHMpOworCUZEX1NFVChmZCwgJmZkcyk7CisJdHYudHZfc2VjID0gMTsKKwl0di50dl91c2VjID0gMDsKKwlzZWxlY3QoZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKK30KKwordm9pZCBwcmludF9ob3N0KGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIGludCBib3RoKQoreworCWludCBwbGVuOworCXBsZW4gPSBwcmludGYoIiVzIiwgYSk7CisJaWYgKGJvdGgpCisJCXBsZW4gKz0gcHJpbnRmKCIgKCVzKSIsIGIpOworCWlmIChwbGVuID49IEhPU1RfQ09MVU1OX1NJWkUpCisJCXBsZW4gPSBIT1NUX0NPTFVNTl9TSVpFIC0gMTsKKwlwcmludGYoIiUqcyIsIEhPU1RfQ09MVU1OX1NJWkUgLSBwbGVuLCAiIik7Cit9CisKK2ludCByZWN2ZXJyKGludCBmZCwgaW50IHR0bCkKK3sKKwlpbnQgcmVzOworCXN0cnVjdCBwcm9iZWhkciByY3ZidWY7CisJY2hhciBjYnVmWzUxMl07CisJc3RydWN0IGlvdmVjICBpb3Y7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyICplOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHRpbWV2YWwgKnJldHR2OworCWludCBzbG90ID0gMDsKKwlpbnQgcmV0aG9wczsKKwlpbnQgc25kaG9wczsKKwlpbnQgcHJvZ3Jlc3MgPSAtMTsKKwlpbnQgYnJva2VuX3JvdXRlcjsKKworcmVzdGFydDoKKwltZW1zZXQoJnJjdmJ1ZiwgLTEsIHNpemVvZihyY3ZidWYpKTsKKwlpb3YuaW92X2Jhc2UgPSAmcmN2YnVmOworCWlvdi5pb3ZfbGVuID0gc2l6ZW9mKHJjdmJ1Zik7CisJbXNnLm1zZ19uYW1lID0gKGNhZGRyX3QpJmFkZHI7CisJbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKGFkZHIpOworCW1zZy5tc2dfaW92ID0gJmlvdjsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisJbXNnLm1zZ19mbGFncyA9IDA7CisJbXNnLm1zZ19jb250cm9sID0gY2J1ZjsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY2J1Zik7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlyZXMgPSByZWN2bXNnKGZkLCAmbXNnLCBNU0dfRVJSUVVFVUUpOworCWlmIChyZXMgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQlyZXR1cm4gcHJvZ3Jlc3M7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwlwcm9ncmVzcyA9IG10dTsKKworCXJldGhvcHMgPSAtMTsKKwlzbmRob3BzID0gLTE7CisJZSA9IE5VTEw7CisJcmV0dHYgPSBOVUxMOworCisJc2xvdCA9IC1iYXNlX3BvcnQ7CisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ2OgorCQlzbG90ICs9IG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKSZhZGRyKS0+c2luNl9wb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUOgorCQlzbG90ICs9IG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luICopJmFkZHIpLT5zaW5fcG9ydCk7CisJCWJyZWFrOworCX0KKworCWlmIChzbG90ID49IDAgJiYgc2xvdCA8IDYzICYmIGhpc1tzbG90XS5ob3BzKSB7CisJCXNuZGhvcHMgPSBoaXNbc2xvdF0uaG9wczsKKwkJcmV0dHYgPSAmaGlzW3Nsb3RdLnNlbmR0aW1lOworCQloaXNbc2xvdF0uaG9wcyA9IDA7CisJfQorCWJyb2tlbl9yb3V0ZXIgPSAwOworCWlmIChyZXMgPT0gc2l6ZW9mKHJjdmJ1ZikpIHsKKwkJaWYgKHJjdmJ1Zi50dGwgPT0gMCB8fCByY3ZidWYudHYudHZfc2VjID09IDApCisJCQlicm9rZW5fcm91dGVyID0gMTsKKwkJZWxzZSB7CisJCQlzbmRob3BzID0gcmN2YnVmLnR0bDsKKwkJCXJldHR2ID0gJnJjdmJ1Zi50djsKKwkJfQorCX0KKworCWZvciAoY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUigmbXNnLCBjbXNnKSkgeworCQlzd2l0Y2ggKGNtc2ctPmNtc2dfbGV2ZWwpIHsKKwkJY2FzZSBTT0xfSVBWNjoKKwkJCXN3aXRjaChjbXNnLT5jbXNnX3R5cGUpIHsKKwkJCWNhc2UgSVBWNl9SRUNWRVJSOgorCQkJCWUgPSAoc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyICopQ01TR19EQVRBKGNtc2cpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFY2X0hPUExJTUlUOgorI2lmZGVmIElQVjZfMjI5MkhPUExJTUlUCisJCQljYXNlIElQVjZfMjI5MkhPUExJTUlUOgorI2VuZGlmCisJCQkJbWVtY3B5KCZyZXRob3BzLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZihyZXRob3BzKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiY21zZzY6JWRcbiAiLCBjbXNnLT5jbXNnX3R5cGUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU09MX0lQOgorCQkJc3dpdGNoKGNtc2ctPmNtc2dfdHlwZSkgeworCQkJY2FzZSBJUF9SRUNWRVJSOgorCQkJCWUgPSAoc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyICopQ01TR19EQVRBKGNtc2cpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUF9UVEw6CisJCQkJcmV0aG9wcyA9ICooX191OCopQ01TR19EQVRBKGNtc2cpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoImNtc2c0OiVkXG4gIiwgY21zZy0+Y21zZ190eXBlKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZSA9PSBOVUxMKSB7CisJCXByaW50Zigibm8gaW5mb1xuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZS0+ZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9MT0NBTCkKKwkJcHJpbnRmKCIlMmQ/OiAlLTMycyAiLCB0dGwsICJbTE9DQUxIT1NUXSIpOworCWVsc2UgaWYgKGUtPmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUDYgfHwKKwkJIGUtPmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUCkgeworCQljaGFyIGFidWZbTklfTUFYSE9TVF0sIGhidWZbTklfTUFYSE9TVF07CisJCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopKGUgKyAxKTsKKwkJc29ja2xlbl90IHNhbGVuOworCisJCWlmIChzbmRob3BzPjApCisJCQlwcmludGYoIiUyZDogICIsIHNuZGhvcHMpOworCQllbHNlCisJCQlwcmludGYoIiUyZD86ICIsIHR0bCk7CisKKwkJc3dpdGNoIChzYS0+c2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWJyZWFrOworCQljYXNlIEFGX0lORVQ6CisJCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzYWxlbiA9IDA7CisJCX0KKworCQlpZiAobm9fcmVzb2x2ZSB8fCBzaG93X2JvdGgpIHsKKwkJCWlmIChnZXRuYW1laW5mbyhzYSwgc2FsZW4sCisJCQkJCWFidWYsIHNpemVvZihhYnVmKSwgTlVMTCwgMCwKKwkJCQkJTklfTlVNRVJJQ0hPU1QpKQorCQkJCXN0cmNweShhYnVmLCAiPz8/Iik7CisJCX0gZWxzZQorCQkJYWJ1ZlswXSA9IDA7CisKKwkJaWYgKCFub19yZXNvbHZlIHx8IHNob3dfYm90aCkgeworCQkJZmZsdXNoKHN0ZG91dCk7CisJCQlpZiAoZ2V0bmFtZWluZm8oc2EsIHNhbGVuLAorCQkJCQloYnVmLCBzaXplb2YoaGJ1ZiksIE5VTEwsIDAsCisJCQkJCTAKKyNpZmRlZiBVU0VfSUROCisJCQkJCXwgTklfSUROCisjZW5kaWYKKwkJCQkgICAgICAgICkpCisJCQkJc3RyY3B5KGhidWYsICI/Pz8iKTsKKwkJfSBlbHNlCisJCQloYnVmWzBdID0gMDsKKworCQlpZiAobm9fcmVzb2x2ZSkKKwkJCXByaW50X2hvc3QoYWJ1ZiwgaGJ1Ziwgc2hvd19ib3RoKTsKKwkJZWxzZQorCQkJcHJpbnRfaG9zdChoYnVmLCBhYnVmLCBzaG93X2JvdGgpOworCX0KKworCWlmIChyZXR0dikgeworCQlpbnQgZGlmZiA9ICh0di50dl9zZWMtcmV0dHYtPnR2X3NlYykqMTAwMDAwMCsodHYudHZfdXNlYy1yZXR0di0+dHZfdXNlYyk7CisJCXByaW50ZigiJTNkLiUwM2RtcyAiLCBkaWZmLzEwMDAsIGRpZmYlMTAwMCk7CisJCWlmIChicm9rZW5fcm91dGVyKQorCQkJcHJpbnRmKCIoVGhpcyBicm9rZW4gcm91dGVyIHJldHVybmVkIGNvcnJ1cHRlZCBwYXlsb2FkKSAiKTsKKwl9CisKKwlzd2l0Y2ggKGUtPmVlX2Vycm5vKSB7CisJY2FzZSBFVElNRURPVVQ6CisJCXByaW50ZigiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFTVNHU0laRToKKwkJcHJpbnRmKCJwbXR1ICVkXG4iLCBlLT5lZV9pbmZvKTsKKwkJbXR1ID0gZS0+ZWVfaW5mbzsKKwkJcHJvZ3Jlc3MgPSBtdHU7CisJCWJyZWFrOworCWNhc2UgRUNPTk5SRUZVU0VEOgorCQlwcmludGYoInJlYWNoZWRcbiIpOworCQlob3BzX3RvID0gc25kaG9wczwwID8gdHRsIDogc25kaG9wczsKKwkJaG9wc19mcm9tID0gcmV0aG9wczsKKwkJcmV0dXJuIDA7CisJY2FzZSBFUFJPVE86CisJCXByaW50ZigiIVBcbiIpOworCQlyZXR1cm4gMDsKKwljYXNlIEVIT1NUVU5SRUFDSDoKKwkJaWYgKChlLT5lZV9vcmlnaW4gPT0gU09fRUVfT1JJR0lOX0lDTVAgJiYKKwkJICAgICBlLT5lZV90eXBlID09IDExICYmCisJCSAgICAgZS0+ZWVfY29kZSA9PSAwKSB8fAorCQkgICAgKGUtPmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUDYgJiYKKwkJICAgICBlLT5lZV90eXBlID09IDMgJiYKKwkJICAgICBlLT5lZV9jb2RlID09IDApKSB7CisJCQlpZiAocmV0aG9wcz49MCkgeworCQkJCWlmIChyZXRob3BzPD02NCkKKwkJCQkJcmV0aG9wcyA9IDY1LXJldGhvcHM7CisJCQkJZWxzZSBpZiAocmV0aG9wczw9MTI4KQorCQkJCQlyZXRob3BzID0gMTI5LXJldGhvcHM7CisJCQkJZWxzZQorCQkJCQlyZXRob3BzID0gMjU2LXJldGhvcHM7CisJCQkJaWYgKHNuZGhvcHM+PTAgJiYgcmV0aG9wcyAhPSBzbmRob3BzKQorCQkJCQlwcmludGYoImFzeW1tICUyZCAiLCByZXRob3BzKTsKKwkJCQllbHNlIGlmIChzbmRob3BzPDAgJiYgcmV0aG9wcyAhPSB0dGwpCisJCQkJCXByaW50ZigiYXN5bW0gJTJkICIsIHJldGhvcHMpOworCQkJfQorCQkJcHJpbnRmKCJcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCIhSFxuIik7CisJCXJldHVybiAwOworCWNhc2UgRU5FVFVOUkVBQ0g6CisJCXByaW50ZigiIU5cbiIpOworCQlyZXR1cm4gMDsKKwljYXNlIEVBQ0NFUzoKKwkJcHJpbnRmKCIhQVxuIik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXByaW50ZigiXG4iKTsKKwkJZXJybm8gPSBlLT5lZV9lcnJubzsKKwkJcGVycm9yKCJORVQgRVJST1IiKTsKKwkJcmV0dXJuIDA7CisJfQorCWdvdG8gcmVzdGFydDsKK30KKworaW50IHByb2JlX3R0bChpbnQgZmQsIGludCB0dGwpCit7CisJaW50IGk7CisJc3RydWN0IHByb2JlaGRyICpoZHIgPSBwa3RidWY7CisKKwltZW1zZXQocGt0YnVmLCAwLCBtdHUpOworcmVzdGFydDoKKworCWZvciAoaT0wOyBpPDEwOyBpKyspIHsKKwkJaW50IHJlczsKKworCQloZHItPnR0bCA9IHR0bDsKKwkJc3dpdGNoIChmYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKSZ0YXJnZXQpLT5zaW42X3BvcnQgPSBodG9ucyhiYXNlX3BvcnQgKyBoaXNwdHIpOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luICopJnRhcmdldCktPnNpbl9wb3J0ID0gaHRvbnMoYmFzZV9wb3J0ICsgaGlzcHRyKTsKKwkJCWJyZWFrOworCQl9CisJCWdldHRpbWVvZmRheSgmaGRyLT50diwgTlVMTCk7CisJCWhpc1toaXNwdHJdLmhvcHMgPSB0dGw7CisJCWhpc1toaXNwdHJdLnNlbmR0aW1lID0gaGRyLT50djsKKwkJaWYgKHNlbmR0byhmZCwgcGt0YnVmLCBtdHUtb3ZlcmhlYWQsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmdGFyZ2V0LCB0YXJnZXRsZW4pID4gMCkKKwkJCWJyZWFrOworCQlyZXMgPSByZWN2ZXJyKGZkLCB0dGwpOworCQloaXNbaGlzcHRyXS5ob3BzID0gMDsKKwkJaWYgKHJlcz09MCkKKwkJCXJldHVybiAwOworCQlpZiAocmVzID4gMCkKKwkJCWdvdG8gcmVzdGFydDsKKwl9CisJaGlzcHRyID0gKGhpc3B0ciArIDEpICYgNjM7CisKKwlpZiAoaTwxMCkgeworCQlkYXRhX3dhaXQoZmQpOworCQlpZiAocmVjdihmZCwgcGt0YnVmLCBtdHUsIE1TR19ET05UV0FJVCkgPiAwKSB7CisJCQlwcmludGYoIiUyZD86IHJlcGx5IHJlY2VpdmVkIDgpXG4iLCB0dGwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIHJlY3ZlcnIoZmQsIHR0bCk7CisJfQorCisJcHJpbnRmKCIlMmQ6ICBzZW5kIGZhaWxlZFxuIiwgdHRsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGUoKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogdHJhY2VwYXRoNiBbLW5dIFstYl0gWy1sIDxsZW4+XSBbLXAgcG9ydF0gPGRlc3RpbmF0aW9uPlxuIik7CisJZXhpdCgtMSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwlpbnQgb247CisJaW50IHR0bDsKKwljaGFyICpwOworCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpLCAqYWkwOworCWludCBjaDsKKwlpbnQgZ2FpOworCWNoYXIgcGJ1ZltOSV9NQVhTRVJWXTsKKworI2lmZGVmIFVTRV9JRE4KKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisjZW5kaWYKKworCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIm5iaD9sOm06cDoiKSkgIT0gRU9GKSB7CisJCXN3aXRjaChjaCkgeworCQljYXNlICduJzoKKwkJCW5vX3Jlc29sdmUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJc2hvd19ib3RoID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCW10dSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCW1heF9ob3BzID0gYXRvaShvcHRhcmcpOworCQkJaWYgKG1heF9ob3BzIDwgMCB8fCBtYXhfaG9wcyA+IE1BWF9IT1BTX0xJTUlUKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJFcnJvcjogbWF4IGhvcHMgbXVzdCBiZSAwIC4uICVkIChpbmNsdXNpdmUpLlxuIiwKKwkJCQkJTUFYX0hPUFNfTElNSVQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJYmFzZV9wb3J0ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CisJfQorCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoYXJnYyAhPSAxKQorCQl1c2FnZSgpOworCisJLyogQmFja3dhcmQgY29tcGF0aWJsaXR5ICovCisJaWYgKCFiYXNlX3BvcnQpIHsKKwkJcCA9IHN0cmNocihhcmd2WzBdLCAnLycpOworCQlpZiAocCkgeworCQkJKnAgPSAwOworCQkJYmFzZV9wb3J0ID0gKHVuc2lnbmVkKWF0b2kocCsxKTsKKwkJfSBlbHNlIHsKKwkJCWJhc2VfcG9ydCA9IDQ0NDQ0OworCQl9CisJfQorCXNwcmludGYocGJ1ZiwgIiV1IiwgYmFzZV9wb3J0KTsKKworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZhbWlseSA9IGZhbWlseTsKKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKKyNpZmRlZiBVU0VfSUROCisJaGludHMuYWlfZmxhZ3MgPSBBSV9JRE47CisjZW5kaWYKKwlnYWkgPSBnZXRhZGRyaW5mbyhhcmd2WzBdLCBwYnVmLCAmaGludHMsICZhaTApOworCWlmIChnYWkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJnZXRhZGRyaW5mbzogJXNcbiIsIGdhaV9zdHJlcnJvcihnYWkpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlmZCA9IC0xOworCWZvciAoYWkgPSBhaTA7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCS8qIHNhbml0eSBjaGVjayAqLworCQlpZiAoZmFtaWx5ICYmIGFpLT5haV9mYW1pbHkgIT0gZmFtaWx5KQorCQkJY29udGludWU7CisJCWlmIChhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2ICYmCisJCSAgICBhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQpCisJCQljb250aW51ZTsKKwkJZmFtaWx5ID0gYWktPmFpX2ZhbWlseTsKKwkJZmQgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCQlpZiAoZmQgPCAwKQorCQkJY29udGludWU7CisJCW1lbWNweSgmdGFyZ2V0LCBhaS0+YWlfYWRkciwgc2l6ZW9mKHRhcmdldCkpOworCQl0YXJnZXRsZW4gPSBhaS0+YWlfYWRkcmxlbjsKKwkJYnJlYWs7CisJfQorCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJzb2NrZXQvY29ubmVjdCIpOworCQlleGl0KDEpOworCX0KKwlmcmVlYWRkcmluZm8oYWkwKTsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUNjoKKwkJb3ZlcmhlYWQgPSA0ODsKKwkJaWYgKCFtdHUpCisJCQltdHUgPSAxMjgwMDA7CisJCWlmIChtdHUgPD0gb3ZlcmhlYWQpCisJCQlnb3RvIHBrdGxlbl9lcnJvcjsKKworCQlvbiA9IElQVjZfUE1UVURJU0NfRE87CisJCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVBWNiwgSVBWNl9NVFVfRElTQ09WRVIsICZvbiwgc2l6ZW9mKG9uKSkgJiYKKwkJICAgIChvbiA9IElQVjZfUE1UVURJU0NfRE8sCisJCSAgICAgc2V0c29ja29wdChmZCwgU09MX0lQVjYsIElQVjZfTVRVX0RJU0NPVkVSLCAmb24sIHNpemVvZihvbikpKSkgeworCQkJcGVycm9yKCJJUFY2X01UVV9ESVNDT1ZFUiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlvbiA9IDE7CisJCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVBWNiwgSVBWNl9SRUNWRVJSLCAmb24sIHNpemVvZihvbikpKSB7CisJCQlwZXJyb3IoIklQVjZfUkVDVkVSUiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoCisjaWZkZWYgSVBWNl9SRUNWSE9QTElNSVQKKwkJICAgIHNldHNvY2tvcHQoZmQsIFNPTF9JUFY2LCBJUFY2X0hPUExJTUlULCAmb24sIHNpemVvZihvbikpICYmCisJCSAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfSVBWNiwgSVBWNl8yMjkySE9QTElNSVQsICZvbiwgc2l6ZW9mKG9uKSkKKyNlbHNlCisJCSAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfSVBWNiwgSVBWNl9IT1BMSU1JVCwgJm9uLCBzaXplb2Yob24pKQorI2VuZGlmCisJCSAgICApIHsKKwkJCXBlcnJvcigiSVBWNl9IT1BMSU1JVCIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoIUlONl9JU19BRERSX1Y0TUFQUEVEKCYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnRhcmdldCktPnNpbjZfYWRkcikpKQorCQkJYnJlYWs7CisJCW1hcHBlZCA9IDE7CisJCS8qRkFMTFRIUk9VR0gqLworCWNhc2UgQUZfSU5FVDoKKwkJb3ZlcmhlYWQgPSAyODsKKwkJaWYgKCFtdHUpCisJCQltdHUgPSA2NTUzNTsKKwkJaWYgKG10dSA8PSBvdmVyaGVhZCkKKwkJCWdvdG8gcGt0bGVuX2Vycm9yOworCisJCW9uID0gSVBfUE1UVURJU0NfRE87CisJCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVAsIElQX01UVV9ESVNDT1ZFUiwgJm9uLCBzaXplb2Yob24pKSkgeworCQkJcGVycm9yKCJJUF9NVFVfRElTQ09WRVIiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJb24gPSAxOworCQlpZiAoc2V0c29ja29wdChmZCwgU09MX0lQLCBJUF9SRUNWRVJSLCAmb24sIHNpemVvZihvbikpKSB7CisJCQlwZXJyb3IoIklQX1JFQ1ZFUlIiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9JUCwgSVBfUkVDVlRUTCwgJm9uLCBzaXplb2Yob24pKSkgeworCQkJcGVycm9yKCJJUF9SRUNWVFRMIik7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJcGt0YnVmID0gbWFsbG9jKG10dSk7CisJaWYgKCFwa3RidWYpIHsKKwkJcGVycm9yKCJtYWxsb2MiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlmb3IgKHR0bCA9IDE7IHR0bCA8PSBtYXhfaG9wczsgdHRsKyspIHsKKwkJaW50IHJlczsKKwkJaW50IGk7CisKKwkJb24gPSB0dGw7CisJCXN3aXRjaCAoZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlpZiAoc2V0c29ja29wdChmZCwgU09MX0lQVjYsIElQVjZfVU5JQ0FTVF9IT1BTLCAmb24sIHNpemVvZihvbikpKSB7CisJCQkJcGVycm9yKCJJUFY2X1VOSUNBU1RfSE9QUyIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAoIW1hcHBlZCkKKwkJCQlicmVhazsKKwkJCS8qRkFMTFRIUk9VR0gqLworCQljYXNlIEFGX0lORVQ6CisJCQlpZiAoc2V0c29ja29wdChmZCwgU09MX0lQLCBJUF9UVEwsICZvbiwgc2l6ZW9mKG9uKSkpIHsKKwkJCQlwZXJyb3IoIklQX1RUTCIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCX0KKworcmVzdGFydDoKKwkJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCQlpbnQgb2xkX210dTsKKworCQkJb2xkX210dSA9IG10dTsKKwkJCXJlcyA9IHByb2JlX3R0bChmZCwgdHRsKTsKKwkJCWlmIChtdHUgIT0gb2xkX210dSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQlpZiAocmVzID09IDApCisJCQkJZ290byBkb25lOworCQkJaWYgKHJlcyA+IDApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVzIDwgMCkKKwkJCXByaW50ZigiJTJkOiAgbm8gcmVwbHlcbiIsIHR0bCk7CisJfQorCXByaW50ZigiICAgICBUb28gbWFueSBob3BzOiBwbXR1ICVkXG4iLCBtdHUpOworCitkb25lOgorCXByaW50ZigiICAgICBSZXN1bWU6IHBtdHUgJWQgIiwgbXR1KTsKKwlpZiAoaG9wc190bz49MCkKKwkJcHJpbnRmKCJob3BzICVkICIsIGhvcHNfdG8pOworCWlmIChob3BzX2Zyb20+PTApCisJCXByaW50ZigiYmFjayAlZCAiLCBob3BzX2Zyb20pOworCXByaW50ZigiXG4iKTsKKwlleGl0KDApOworCitwa3RsZW5fZXJyb3I6CisJZnByaW50ZihzdGRlcnIsICJFcnJvcjogcGt0bGVuIG11c3QgYmUgPiAlZCBhbmQgPD0gJWRcbiIsCisJCW92ZXJoZWFkLCBJTlRfTUFYKTsKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvaXB1dGlscy90cmFjZXJvdXRlNi5jIGIvaXB1dGlscy90cmFjZXJvdXRlNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzhkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHV0aWxzL3RyYWNlcm91dGU2LmMKQEAgLTAsMCArMSw5NTAgQEAKKy8qCisgKiAgICAgIE1vZGlmaWVkIGZvciBOUkwgNC40QlNEIElQdjYgcmVsZWFzZS4KKyAqICAgICAgMDcvMzEvOTYgYmdwCisgKgorICogICAgICBTZWFyY2ggZm9yICIjaWZkZWYgTlJMIiB0byBmaW5kIHRoZSBjaGFuZ2VzLgorICovCisKKy8qCisgKglNb2RpZmllZCBmb3IgTGludXggSVB2NiBieSBQZWRybyBSb3F1ZSA8cm9xdWVAZGkuZmMudWwucHQ+CisgKgkzMS8wNy8xOTk2CisgKgorICoJQXMgSUNNUCBlcnJvciBtZXNzYWdlcyBmb3IgSVB2NiBub3cgaW5jbHVkZSBtb3JlIHRoYW4gOCBieXRlcworICoJVURQIGRhdGFncmFtcyBhcmUgbm93IHNlbnQgdmlhIGFuIFVEUCBzb2NrZXQgaW5zdGVhZCBvZiBtYWdpYworICoJUkFXIHNvY2tldCB0cmlja3MuCisgKgorICoJT3JpZ2luYWwgY29weXJpZ2h0IGFuZCBjb21tZW50cyBsZWZ0IGludGFjdC4gVGhleSBtaWdodCBub3QKKyAqCW1hdGNoIHRoZSBjb2RlIGFueW1vcmUuCisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIFZhbiBKYWNvYnNvbi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGludAorY2hhciBjb3B5cmlnaHRbXSA9CisiQCgjKSBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTNcblwKKwlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CisjZW5kaWYgLyogbm90IGxpbnQgKi8KKworLyoKKyAqIHRyYWNlcm91dGUgaG9zdCAgLSB0cmFjZSB0aGUgcm91dGUgaXAgcGFja2V0cyBmb2xsb3cgZ29pbmcgdG8gImhvc3QiLgorICoKKyAqIEF0dGVtcHQgdG8gdHJhY2UgdGhlIHJvdXRlIGFuIGlwIHBhY2tldCB3b3VsZCBmb2xsb3cgdG8gc29tZQorICogaW50ZXJuZXQgaG9zdC4gIFdlIGZpbmQgb3V0IGludGVybWVkaWF0ZSBob3BzIGJ5IGxhdW5jaGluZyBwcm9iZQorICogcGFja2V0cyB3aXRoIGEgc21hbGwgdHRsICh0aW1lIHRvIGxpdmUpIHRoZW4gbGlzdGVuaW5nIGZvciBhbgorICogaWNtcCAidGltZSBleGNlZWRlZCIgcmVwbHkgZnJvbSBhIGdhdGV3YXkuICBXZSBzdGFydCBvdXIgcHJvYmVzCisgKiB3aXRoIGEgdHRsIG9mIG9uZSBhbmQgaW5jcmVhc2UgYnkgb25lIHVudGlsIHdlIGdldCBhbiBpY21wICJwb3J0CisgKiB1bnJlYWNoYWJsZSIgKHdoaWNoIG1lYW5zIHdlIGdvdCB0byAiaG9zdCIpIG9yIGhpdCBhIG1heCAod2hpY2gKKyAqIGRlZmF1bHRzIHRvIDMwIGhvcHMgJiBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZSAtbSBmbGFnKS4gIFRocmVlCisgKiBwcm9iZXMgKGNoYW5nZSB3aXRoIC1xIGZsYWcpIGFyZSBzZW50IGF0IGVhY2ggdHRsIHNldHRpbmcgYW5kIGEKKyAqIGxpbmUgaXMgcHJpbnRlZCBzaG93aW5nIHRoZSB0dGwsIGFkZHJlc3Mgb2YgdGhlIGdhdGV3YXkgYW5kCisgKiByb3VuZCB0cmlwIHRpbWUgb2YgZWFjaCBwcm9iZS4gIElmIHRoZSBwcm9iZSBhbnN3ZXJzIGNvbWUgZnJvbQorICogZGlmZmVyZW50IGdhdGV3YXlzLCB0aGUgYWRkcmVzcyBvZiBlYWNoIHJlc3BvbmRpbmcgc3lzdGVtIHdpbGwKKyAqIGJlIHByaW50ZWQuICBJZiB0aGVyZSBpcyBubyByZXNwb25zZSB3aXRoaW4gYSA1IHNlYy4gdGltZW91dAorICogaW50ZXJ2YWwgKGNoYW5nZWQgd2l0aCB0aGUgLXcgZmxhZyksIGEgIioiIGlzIHByaW50ZWQgZm9yIHRoYXQKKyAqIHByb2JlLgorICoKKyAqIFByb2JlIHBhY2tldHMgYXJlIFVEUCBmb3JtYXQuICBXZSBkb24ndCB3YW50IHRoZSBkZXN0aW5hdGlvbgorICogaG9zdCB0byBwcm9jZXNzIHRoZW0gc28gdGhlIGRlc3RpbmF0aW9uIHBvcnQgaXMgc2V0IHRvIGFuCisgKiB1bmxpa2VseSB2YWx1ZSAoaWYgc29tZSBjbG9kIG9uIHRoZSBkZXN0aW5hdGlvbiBpcyB1c2luZyB0aGF0CisgKiB2YWx1ZSwgaXQgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUgLXAgZmxhZykuCisgKgorICogQSBzYW1wbGUgdXNlIG1pZ2h0IGJlOgorICoKKyAqICAgICBbeWFrIDcxXSUgdHJhY2Vyb3V0ZSBuaXMubnNmLm5ldC4KKyAqICAgICB0cmFjZXJvdXRlIHRvIG5pcy5uc2YubmV0ICgzNS4xLjEuNDgpLCAzMCBob3BzIG1heCwgNTYgYnl0ZSBwYWNrZXQKKyAqICAgICAgMSAgaGVsaW9zLmVlLmxibC5nb3YgKDEyOC4zLjExMi4xKSAgMTkgbXMgIDE5IG1zICAwIG1zCisgKiAgICAgIDIgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDM5IG1zICAzOSBtcyAgMTkgbXMKKyAqICAgICAgMyAgbGlsYWMtZG1jLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjIxNi4xKSAgMzkgbXMgIDM5IG1zICAxOSBtcworICogICAgICA0ICBjY25ndy1uZXItY2MuQmVya2VsZXkuRURVICgxMjguMzIuMTM2LjIzKSAgMzkgbXMgIDQwIG1zICAzOSBtcworICogICAgICA1ICBjY24tbmVyaWYyMi5CZXJrZWxleS5FRFUgKDEyOC4zMi4xNjguMjIpICAzOSBtcyAgMzkgbXMgIDM5IG1zCisgKiAgICAgIDYgIDEyOC4zMi4xOTcuNCAoMTI4LjMyLjE5Ny40KSAgNDAgbXMgIDU5IG1zICA1OSBtcworICogICAgICA3ICAxMzEuMTE5LjIuNSAoMTMxLjExOS4yLjUpICA1OSBtcyAgNTkgbXMgIDU5IG1zCisgKiAgICAgIDggIDEyOS4xNDAuNzAuMTMgKDEyOS4xNDAuNzAuMTMpICA5OSBtcyAgOTkgbXMgIDgwIG1zCisgKiAgICAgIDkgIDEyOS4xNDAuNzEuNiAoMTI5LjE0MC43MS42KSAgMTM5IG1zICAyMzkgbXMgIDMxOSBtcworICogICAgIDEwICAxMjkuMTQwLjgxLjcgKDEyOS4xNDAuODEuNykgIDIyMCBtcyAgMTk5IG1zICAxOTkgbXMKKyAqICAgICAxMSAgbmljLm1lcml0LmVkdSAoMzUuMS4xLjQ4KSAgMjM5IG1zICAyMzkgbXMgIDIzOSBtcworICoKKyAqIE5vdGUgdGhhdCBsaW5lcyAyICYgMyBhcmUgdGhlIHNhbWUuICBUaGlzIGlzIGR1ZSB0byBhIGJ1Z2d5CisgKiBrZXJuZWwgb24gdGhlIDJuZCBob3Agc3lzdGVtIC0tIGxibC1jc2FtLmFycGEgLS0gdGhhdCBmb3J3YXJkcworICogcGFja2V0cyB3aXRoIGEgemVybyB0dGwuCisgKgorICogQSBtb3JlIGludGVyZXN0aW5nIGV4YW1wbGUgaXM6CisgKgorICogICAgIFt5YWsgNzJdJSB0cmFjZXJvdXRlIGFsbHNwaWNlLmxjcy5taXQuZWR1LgorICogICAgIHRyYWNlcm91dGUgdG8gYWxsc3BpY2UubGNzLm1pdC5lZHUgKDE4LjI2LjAuMTE1KSwgMzAgaG9wcyBtYXgKKyAqICAgICAgMSAgaGVsaW9zLmVlLmxibC5nb3YgKDEyOC4zLjExMi4xKSAgMCBtcyAgMCBtcyAgMCBtcworICogICAgICAyICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAxOSBtcyAgMTkgbXMgIDE5IG1zCisgKiAgICAgIDMgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDM5IG1zICAxOSBtcyAgMTkgbXMKKyAqICAgICAgNCAgY2NuZ3ctbmVyLWNjLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzNi4yMykgIDE5IG1zICAzOSBtcyAgMzkgbXMKKyAqICAgICAgNSAgY2NuLW5lcmlmMjIuQmVya2VsZXkuRURVICgxMjguMzIuMTY4LjIyKSAgMjAgbXMgIDM5IG1zICAzOSBtcworICogICAgICA2ICAxMjguMzIuMTk3LjQgKDEyOC4zMi4xOTcuNCkgIDU5IG1zICAxMTkgbXMgIDM5IG1zCisgKiAgICAgIDcgIDEzMS4xMTkuMi41ICgxMzEuMTE5LjIuNSkgIDU5IG1zICA1OSBtcyAgMzkgbXMKKyAqICAgICAgOCAgMTI5LjE0MC43MC4xMyAoMTI5LjE0MC43MC4xMykgIDgwIG1zICA3OSBtcyAgOTkgbXMKKyAqICAgICAgOSAgMTI5LjE0MC43MS42ICgxMjkuMTQwLjcxLjYpICAxMzkgbXMgIDEzOSBtcyAgMTU5IG1zCisgKiAgICAgMTAgIDEyOS4xNDAuODEuNyAoMTI5LjE0MC44MS43KSAgMTk5IG1zICAxODAgbXMgIDMwMCBtcworICogICAgIDExICAxMjkuMTQwLjcyLjE3ICgxMjkuMTQwLjcyLjE3KSAgMzAwIG1zICAyMzkgbXMgIDIzOSBtcworICogICAgIDEyICAqICogKgorICogICAgIDEzICAxMjguMTIxLjU0LjcyICgxMjguMTIxLjU0LjcyKSAgMjU5IG1zICA0OTkgbXMgIDI3OSBtcworICogICAgIDE0ICAqICogKgorICogICAgIDE1ICAqICogKgorICogICAgIDE2ICAqICogKgorICogICAgIDE3ICAqICogKgorICogICAgIDE4ICBBTExTUElDRS5MQ1MuTUlULkVEVSAoMTguMjYuMC4xMTUpICAzMzkgbXMgIDI3OSBtcyAgMjc5IG1zCisgKgorICogKEkgc3RhcnQgdG8gc2VlIHdoeSBJJ20gaGF2aW5nIHNvIG11Y2ggdHJvdWJsZSB3aXRoIG1haWwgdG8KKyAqIE1JVC4pICBOb3RlIHRoYXQgdGhlIGdhdGV3YXlzIDEyLCAxNCwgMTUsIDE2ICYgMTcgaG9wcyBhd2F5CisgKiBlaXRoZXIgZG9uJ3Qgc2VuZCBJQ01QICJ0aW1lIGV4Y2VlZGVkIiBtZXNzYWdlcyBvciBzZW5kIHRoZW0KKyAqIHdpdGggYSB0dGwgdG9vIHNtYWxsIHRvIHJlYWNoIHVzLiAgMTQgLSAxNyBhcmUgcnVubmluZyB0aGUKKyAqIE1JVCBDIEdhdGV3YXkgY29kZSB0aGF0IGRvZXNuJ3Qgc2VuZCAidGltZSBleGNlZWRlZCJzLiAgR29kCisgKiBvbmx5IGtub3dzIHdoYXQncyBnb2luZyBvbiB3aXRoIDEyLgorICoKKyAqIFRoZSBzaWxlbnQgZ2F0ZXdheSAxMiBpbiB0aGUgYWJvdmUgbWF5IGJlIHRoZSByZXN1bHQgb2YgYSBidWcgaW4KKyAqIHRoZSA0LlsyM11CU0QgbmV0d29yayBjb2RlIChhbmQgaXRzIGRlcml2YXRpdmVzKTogIDQueCAoeCA8PSAzKQorICogc2VuZHMgYW4gdW5yZWFjaGFibGUgbWVzc2FnZSB1c2luZyB3aGF0ZXZlciB0dGwgcmVtYWlucyBpbiB0aGUKKyAqIG9yaWdpbmFsIGRhdGFncmFtLiAgU2luY2UsIGZvciBnYXRld2F5cywgdGhlIHJlbWFpbmluZyB0dGwgaXMKKyAqIHplcm8sIHRoZSBpY21wICJ0aW1lIGV4Y2VlZGVkIiBpcyBndWFyYW50ZWVkIHRvIG5vdCBtYWtlIGl0IGJhY2sKKyAqIHRvIHVzLiAgVGhlIGJlaGF2aW9yIG9mIHRoaXMgYnVnIGlzIHNsaWdodGx5IG1vcmUgaW50ZXJlc3RpbmcKKyAqIHdoZW4gaXQgYXBwZWFycyBvbiB0aGUgZGVzdGluYXRpb24gc3lzdGVtOgorICoKKyAqICAgICAgMSAgaGVsaW9zLmVlLmxibC5nb3YgKDEyOC4zLjExMi4xKSAgMCBtcyAgMCBtcyAgMCBtcworICogICAgICAyICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAzOSBtcyAgMTkgbXMgIDM5IG1zCisgKiAgICAgIDMgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDE5IG1zICAzOSBtcyAgMTkgbXMKKyAqICAgICAgNCAgY2NuZ3ctbmVyLWNjLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzNi4yMykgIDM5IG1zICA0MCBtcyAgMTkgbXMKKyAqICAgICAgNSAgY2NuLW5lcmlmMzUuQmVya2VsZXkuRURVICgxMjguMzIuMTY4LjM1KSAgMzkgbXMgIDM5IG1zICAzOSBtcworICogICAgICA2ICBjc2d3LkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzMy4yNTQpICAzOSBtcyAgNTkgbXMgIDM5IG1zCisgKiAgICAgIDcgICogKiAqCisgKiAgICAgIDggICogKiAqCisgKiAgICAgIDkgICogKiAqCisgKiAgICAgMTAgICogKiAqCisgKiAgICAgMTEgICogKiAqCisgKiAgICAgMTIgICogKiAqCisgKiAgICAgMTMgIHJpcC5CZXJrZWxleS5FRFUgKDEyOC4zMi4xMzEuMjIpICA1OSBtcyAhICAzOSBtcyAhICAzOSBtcyAhCisgKgorICogTm90aWNlIHRoYXQgdGhlcmUgYXJlIDEyICJnYXRld2F5cyIgKDEzIGlzIHRoZSBmaW5hbAorICogZGVzdGluYXRpb24pIGFuZCBleGFjdGx5IHRoZSBsYXN0IGhhbGYgb2YgdGhlbSBhcmUgIm1pc3NpbmciLgorICogV2hhdCdzIHJlYWxseSBoYXBwZW5pbmcgaXMgdGhhdCByaXAgKGEgU3VuLTMgcnVubmluZyBTdW4gT1MzLjUpCisgKiBpcyB1c2luZyB0aGUgdHRsIGZyb20gb3VyIGFycml2aW5nIGRhdGFncmFtIGFzIHRoZSB0dGwgaW4gaXRzCisgKiBpY21wIHJlcGx5LiAgU28sIHRoZSByZXBseSB3aWxsIHRpbWUgb3V0IG9uIHRoZSByZXR1cm4gcGF0aAorICogKHdpdGggbm8gbm90aWNlIHNlbnQgdG8gYW55b25lIHNpbmNlIGljbXAncyBhcmVuJ3Qgc2VudCBmb3IKKyAqIGljbXAncykgdW50aWwgd2UgcHJvYmUgd2l0aCBhIHR0bCB0aGF0J3MgYXQgbGVhc3QgdHdpY2UgdGhlIHBhdGgKKyAqIGxlbmd0aC4gIEkuZS4sIHJpcCBpcyByZWFsbHkgb25seSA3IGhvcHMgYXdheS4gIEEgcmVwbHkgdGhhdAorICogcmV0dXJucyB3aXRoIGEgdHRsIG9mIDEgaXMgYSBjbHVlIHRoaXMgcHJvYmxlbSBleGlzdHMuCisgKiBUcmFjZXJvdXRlIHByaW50cyBhICIhIiBhZnRlciB0aGUgdGltZSBpZiB0aGUgdHRsIGlzIDw9IDEuCisgKiBTaW5jZSB2ZW5kb3JzIHNoaXAgYSBsb3Qgb2Ygb2Jzb2xldGUgKERFQydzIFVsdHJpeCwgU3VuIDMueCkgb3IKKyAqIG5vbi1zdGFuZGFyZCAoSFBVWCkgc29mdHdhcmUsIGV4cGVjdCB0byBzZWUgdGhpcyBwcm9ibGVtCisgKiBmcmVxdWVudGx5IGFuZC9vciB0YWtlIGNhcmUgcGlja2luZyB0aGUgdGFyZ2V0IGhvc3Qgb2YgeW91cgorICogcHJvYmVzLgorICoKKyAqIE90aGVyIHBvc3NpYmxlIGFubm90YXRpb25zIGFmdGVyIHRoZSB0aW1lIGFyZSAhSCwgIU4sICFQIChnb3QgYSBob3N0LAorICogbmV0d29yayBvciBwcm90b2NvbCB1bnJlYWNoYWJsZSwgcmVzcGVjdGl2ZWx5KSwgIVMgb3IgIUYgKHNvdXJjZQorICogcm91dGUgZmFpbGVkIG9yIGZyYWdtZW50YXRpb24gbmVlZGVkIC0tIG5laXRoZXIgb2YgdGhlc2Ugc2hvdWxkCisgKiBldmVyIG9jY3VyIGFuZCB0aGUgYXNzb2NpYXRlZCBnYXRld2F5IGlzIGJ1c3RlZCBpZiB5b3Ugc2VlIG9uZSkuICBJZgorICogYWxtb3N0IGFsbCB0aGUgcHJvYmVzIHJlc3VsdCBpbiBzb21lIGtpbmQgb2YgdW5yZWFjaGFibGUsIHRyYWNlcm91dGUKKyAqIHdpbGwgZ2l2ZSB1cCBhbmQgZXhpdC4KKyAqCisgKiBOb3RlcworICogLS0tLS0KKyAqIFRoaXMgcHJvZ3JhbSBtdXN0IGJlIHJ1biBieSByb290IG9yIGJlIHNldHVpZC4gIChJIHN1Z2dlc3QgdGhhdAorICogeW91ICpkb24ndCogbWFrZSBpdCBzZXR1aWQgLS0gY2FzdWFsIHVzZSBjb3VsZCByZXN1bHQgaW4gYSBsb3QKKyAqIG9mIHVubmVjZXNzYXJ5IHRyYWZmaWMgb24gb3VyIHBvb3IsIGNvbmdlc3RlZCBuZXRzLikKKyAqCisgKiBUaGlzIHByb2dyYW0gcmVxdWlyZXMgYSBrZXJuZWwgbW9kIHRoYXQgZG9lcyBub3QgYXBwZWFyIGluIGFueQorICogc3lzdGVtIGF2YWlsYWJsZSBmcm9tIEJlcmtlbGV5OiAgQSByYXcgaXAgc29ja2V0IHVzaW5nIHByb3RvCisgKiBJUFBST1RPX1JBVyBtdXN0IGludGVycHJldCB0aGUgZGF0YSBzZW50IGFzIGFuIGlwIGRhdGFncmFtIChhcworICogb3Bwb3NlZCB0byBkYXRhIHRvIGJlIHdyYXBwZWQgaW4gYSBpcCBkYXRhZ3JhbSkuICBTZWUgdGhlIFJFQURNRQorICogZmlsZSB0aGF0IGNhbWUgd2l0aCB0aGUgc291cmNlIHRvIHRoaXMgcHJvZ3JhbSBmb3IgYSBkZXNjcmlwdGlvbgorICogb2YgdGhlIG1vZHMgSSBtYWRlIHRvIC9zeXMvbmV0aW5ldC9yYXdfaXAuYy4gIFlvdXIgbWlsZWFnZSBtYXkKKyAqIHZhcnkuICBCdXQsIGFnYWluLCBBTlkgNC54ICh4IDwgNCkgQlNEIEtFUk5FTCBXSUxMIEhBVkUgVE8gQkUKKyAqIE1PRElGSUVEIFRPIFJVTiBUSElTIFBST0dSQU0uCisgKgorICogVGhlIHVkcCBwb3J0IHVzYWdlIG1heSBhcHBlYXIgYml6YXJyZSAod2VsbCwgb2ssIGl0IGlzIGJpemFycmUpLgorICogVGhlIHByb2JsZW0gaXMgdGhhdCBhbiBpY21wIG1lc3NhZ2Ugb25seSBjb250YWlucyA4IGJ5dGVzIG9mCisgKiBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIGRhdGFncmFtLiAgOCBieXRlcyBpcyB0aGUgc2l6ZSBvZiBhIHVkcAorICogaGVhZGVyIHNvLCBpZiB3ZSB3YW50IHRvIGFzc29jaWF0ZSByZXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsCisgKiBkYXRhZ3JhbSwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBtdXN0IGJlIGVuY29kZWQgaW50byB0aGUKKyAqIHVkcCBoZWFkZXIgKHRoZSBpcCBpZCBjb3VsZCBiZSB1c2VkIGJ1dCB0aGVyZSdzIG5vIHdheSB0bworICogaW50ZXJsb2NrIHdpdGggdGhlIGtlcm5lbCdzIGFzc2lnbm1lbnQgb2YgaXAgaWQncyBhbmQsIGFueXdheSwKKyAqIGl0IHdvdWxkIGhhdmUgdGFrZW4gYSBsb3QgbW9yZSBrZXJuZWwgaGFja2luZyB0byBhbGxvdyB0aGlzCisgKiBjb2RlIHRvIHNldCB0aGUgaXAgaWQpLiAgU28sIHRvIGFsbG93IHR3byBvciBtb3JlIHVzZXJzIHRvCisgKiB1c2UgdHJhY2Vyb3V0ZSBzaW11bHRhbmVvdXNseSwgd2UgdXNlIHRoaXMgdGFzaydzIHBpZCBhcyB0aGUKKyAqIHNvdXJjZSBwb3J0ICh0aGUgaGlnaCBiaXQgaXMgc2V0IHRvIG1vdmUgdGhlIHBvcnQgbnVtYmVyIG91dAorICogb2YgdGhlICJsaWtlbHkiIHJhbmdlKS4gIFRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcHJvYmUgaXMgYmVpbmcKKyAqIHJlcGxpZWQgdG8gKHNvIHRpbWVzIGFuZC9vciBob3AgY291bnRzIGRvbid0IGdldCBjb25mdXNlZCBieSBhCisgKiByZXBseSB0aGF0IHdhcyBkZWxheWVkIGluIHRyYW5zaXQpLCB3ZSBpbmNyZW1lbnQgdGhlIGRlc3RpbmF0aW9uCisgKiBwb3J0IG51bWJlciBiZWZvcmUgZWFjaCBwcm9iZS4KKyAqCisgKiBEb24ndCB1c2UgdGhpcyBhcyBhIGNvZGluZyBleGFtcGxlLiAgSSB3YXMgdHJ5aW5nIHRvIGZpbmQgYQorICogcm91dGluZyBwcm9ibGVtIGFuZCB0aGlzIGNvZGUgc29ydC1vZiBwb3BwZWQgb3V0IGFmdGVyIDQ4IGhvdXJzCisgKiB3aXRob3V0IHNsZWVwLiAgSSB3YXMgYW1hemVkIGl0IGV2ZXIgY29tcGlsZWQsIG11Y2ggbGVzcyByYW4uCisgKgorICogSSBzdG9sZSB0aGUgaWRlYSBmb3IgdGhpcyBwcm9ncmFtIGZyb20gU3RldmUgRGVlcmluZy4gIFNpbmNlCisgKiB0aGUgZmlyc3QgcmVsZWFzZSwgSSd2ZSBsZWFybmVkIHRoYXQgaGFkIEkgYXR0ZW5kZWQgdGhlIHJpZ2h0CisgKiBJRVRGIHdvcmtpbmcgZ3JvdXAgbWVldGluZ3MsIEkgYWxzbyBjb3VsZCBoYXZlIHN0b2xlbiBpdCBmcm9tIEd1eQorICogQWxtZXMgb3IgTWF0dCBNYXRoaXMuICBJIGRvbid0IGtub3cgKG9yIGNhcmUpIHdobyBjYW1lIHVwIHdpdGgKKyAqIHRoZSBpZGVhIGZpcnN0LiAgSSBlbnZ5IHRoZSBvcmlnaW5hdG9ycycgcGVyc3BpY2FjaXR5IGFuZCBJJ20KKyAqIGdsYWQgdGhleSBkaWRuJ3Qga2VlcCB0aGUgaWRlYSBhIHNlY3JldC4KKyAqCisgKiBUaW0gU2VhdmVyLCBLZW4gQWRlbG1hbiBhbmQgQy4gUGhpbGlwIFdvb2QgcHJvdmlkZWQgYnVnIGZpeGVzIGFuZC9vcgorICogZW5oYW5jZW1lbnRzIHRvIHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24uCisgKgorICogSSd2ZSBoYWNrZWQgdXAgYSByb3VuZC10cmlwLXJvdXRlIHZlcnNpb24gb2YgdGhpcyB0aGF0IHdvcmtzIGJ5CisgKiBzZW5kaW5nIGEgbG9vc2Utc291cmNlLXJvdXRlZCB1ZHAgZGF0YWdyYW0gdGhyb3VnaCB0aGUgZGVzdGluYXRpb24KKyAqIGJhY2sgdG8geW91cnNlbGYuICBVbmZvcnR1bmF0ZWx5LCBTTyBtYW55IGdhdGV3YXlzIGJvdGNoIHNvdXJjZQorICogcm91dGluZywgdGhlIHRoaW5nIGlzIGFsbW9zdCB3b3J0aGxlc3MuICBNYXliZSBvbmUgZGF5Li4uCisgKgorICogIC0tIFZhbiBKYWNvYnNvbiAodmFuQGhlbGlvcy5lZS5sYmwuZ292KQorICogICAgIFR1ZSBEZWMgMjAgMDM6NTA6MTMgUFNUIDE5ODgKKyAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworI2lmIF9fbGludXhfXworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaWZkZWYgQ0FQQUJJTElUSUVTCisjaW5jbHVkZSA8c3lzL2NhcGFiaWxpdHkuaD4KKyNlbmRpZgorCisjaWZkZWYgVVNFX0lETgorI2luY2x1ZGUgPGlkbmEuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlNOQVBTSE9ULmgiCisKKyNpZm5kZWYgU09MX0lQVjYKKyNkZWZpbmUgU09MX0lQVjYgSVBQUk9UT19JUFY2CisjZW5kaWYKKworI2RlZmluZQlNQVhQQUNLRVQJNjU1MzUKKyNkZWZpbmUgTUFYX0hPU1ROQU1FTEVOCU5JX01BWEhPU1QKKworI2lmbmRlZiBGRF9TRVQKKyNkZWZpbmUgTkZEQklUUyAgICAgICAgICg4KnNpemVvZihmZF9zZXQpKQorI2RlZmluZSBGRF9TRVRTSVpFICAgICAgTkZEQklUUworI2RlZmluZSBGRF9TRVQobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0NMUihuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2RlZmluZSBGRF9aRVJPKHApICAgICAgbWVtc2V0KChjaGFyICopKHApLCAwLCBzaXplb2YoKihwKSkpCisjZW5kaWYKKworI2RlZmluZSBGcHJpbnRmICh2b2lkKWZwcmludGYKKyNkZWZpbmUgUHJpbnRmICh2b2lkKXByaW50ZgorCit1X2NoYXIJcGFja2V0WzUxMl07CQkvKiBsYXN0IGluYm91bmQgKGljbXApIHBhY2tldCAqLworCitpbnQJd2FpdF9mb3JfcmVwbHkoaW50LCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICosIHN0cnVjdCBpbjZfYWRkciAqLCBpbnQpOworaW50CXBhY2tldF9vayh1X2NoYXIgKmJ1ZiwgaW50IGNjLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tLAorCQkgIHN0cnVjdCBpbjZfYWRkciAqdG8sIGludCBzZXEsIHN0cnVjdCB0aW1ldmFsICopOwordm9pZAlzZW5kX3Byb2JlKGludCBzZXEsIGludCB0dGwpOworZG91YmxlCWRlbHRhVCAoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV2YWwgKik7Cit2b2lkCXByaW50KHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNjLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tKTsKK3ZvaWQJdHZzdWIgKHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1ldmFsICopOwordm9pZAl1c2FnZSh2b2lkKTsKKworaW50IGljbXBfc29jazsJCQkvKiByZWNlaXZlIChpY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCitpbnQgc25kc29jazsJCQkvKiBzZW5kICh1ZHApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB0aW1lem9uZSB0ejsJCS8qIGxlZnRvdmVyICovCisKK3N0cnVjdCBzb2NrYWRkcl9pbjYgd2hlcmV0bzsJLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLworCitzdHJ1Y3Qgc29ja2FkZHJfaW42IHNhZGRyOworc3RydWN0IHNvY2thZGRyX2luNiBmaXJzdGhvcDsKK2NoYXIgKnNvdXJjZSA9IE5VTEw7CitjaGFyICpkZXZpY2UgPSBOVUxMOworY2hhciAqaG9zdG5hbWU7CisKK2ludCBucHJvYmVzID0gMzsKK2ludCBtYXhfdHRsID0gMzA7CitwaWRfdCBpZGVudDsKK3Vfc2hvcnQgcG9ydCA9IDMyNzY4KzY2NjsJLyogc3RhcnQgdWRwIGRlc3QgcG9ydCAjIGZvciBwcm9iZSBwYWNrZXRzICovCitpbnQgb3B0aW9uczsJCQkvKiBzb2NrZXQgb3B0aW9ucyAqLworaW50IHZlcmJvc2U7CitpbnQgd2FpdHRpbWUgPSA1OwkJLyogdGltZSB0byB3YWl0IGZvciByZXNwb25zZSAoaW4gc2Vjb25kcykgKi8KK2ludCBuZmxhZzsJCQkvKiBwcmludCBhZGRyZXNzZXMgbnVtZXJpY2FsbHkgKi8KKworCitzdHJ1Y3QgcGt0X2Zvcm1hdAoreworCV9fdTMyIGlkZW50OworCV9fdTMyIHNlcTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKK307CisKK2NoYXIgKnNlbmRidWZmOworaW50IGRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpOworCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyIHBhW01BWF9IT1NUTkFNRUxFTl07CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlleHRlcm4gaW50IG9wdGluZDsKKwlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJc3RydWN0IHNvY2thZGRyX2luNiBmcm9tLCAqdG87CisJaW50IGNoLCBpLCBvbiwgcHJvYmUsIHNlcSwgdG9zLCB0dGw7CisJaW50IHNvY2tldF9lcnJubzsKKworCWljbXBfc29jayA9IHNvY2tldChBRl9JTkVUNiwgU09DS19SQVcsIElQUFJPVE9fSUNNUFY2KTsKKwlzb2NrZXRfZXJybm8gPSBlcnJubzsKKworCWlmIChzZXR1aWQoZ2V0dWlkKCkpKSB7CisJCXBlcnJvcigidHJhY2Vyb3V0ZTY6IHNldHVpZCIpOworCQlleGl0KC0xKTsKKwl9CisjaWZkZWYgQ0FQQUJJTElUSUVTCisJeworCQljYXBfdCBjYXBzID0gY2FwX2luaXQoKTsKKwkJaWYgKGNhcF9zZXRfcHJvYyhjYXBzKSkgeworCQkJcGVycm9yKCJ0cmFjZXJvdXRlNjogY2FwX3NldF9wcm9jIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQljYXBfZnJlZShjYXBzKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIFVTRV9JRE4KKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisjZW5kaWYKKworCW9uID0gMTsKKwlzZXEgPSB0b3MgPSAwOworCXRvID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmd2hlcmV0bzsKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkbTpucDpxOnJzOnQ6dzp2aTpnOlYiKSkgIT0gRU9GKSB7CisJCXN3aXRjaChjaCkgeworCQljYXNlICdkJzoKKwkJCW9wdGlvbnMgfD0gU09fREVCVUc7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQltYXhfdHRsID0gYXRvaShvcHRhcmcpOworCQkJaWYgKG1heF90dGwgPD0gMSkgeworCQkJCUZwcmludGYoc3RkZXJyLAorCQkJCSAgICAidHJhY2Vyb3V0ZTogbWF4IHR0bCBtdXN0IGJlID4xLlxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5mbGFnKys7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwb3J0ID0gYXRvaShvcHRhcmcpOworCQkJaWYgKHBvcnQgPCAxKSB7CisJCQkJRnByaW50ZihzdGRlcnIsCisJCQkJICAgICJ0cmFjZXJvdXRlOiBwb3J0IG11c3QgYmUgPjAuXG4iKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJbnByb2JlcyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChucHJvYmVzIDwgMSkgeworCQkJCUZwcmludGYoc3RkZXJyLAorCQkJCSAgICAidHJhY2Vyb3V0ZTogbnByb2JlcyBtdXN0IGJlID4wLlxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCW9wdGlvbnMgfD0gU09fRE9OVFJPVVRFOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJLyoKKwkJCSAqIHNldCB0aGUgaXAgc291cmNlIGFkZHJlc3Mgb2YgdGhlIG91dGJvdW5kCisJCQkgKiBwcm9iZSAoZS5nLiwgb24gYSBtdWx0aS1ob21lZCBob3N0KS4KKwkJCSAqLworCQkJc291cmNlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJZGV2aWNlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJRnByaW50ZihzdGRlcnIsICJTb3JyeSwgcnRoZHIgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSsrOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJd2FpdHRpbWUgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAod2FpdHRpbWUgPD0gMSkgeworCQkJCUZwcmludGYoc3RkZXJyLAorCQkJCSAgICAidHJhY2Vyb3V0ZTogd2FpdCBtdXN0IGJlID4xIHNlYy5cbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlwcmludGYoInRyYWNlcm91dGU2IHV0aWxpdHksIGlwdXRpbHMtJXNcbiIsIFNOQVBTSE9UKTsKKwkJCWV4aXQoMCk7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CisJfQorCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGFyZ2MgPCAxKQorCQl1c2FnZSgpOworCisJc2V0bGluZWJ1ZiAoc3Rkb3V0KTsKKworCSh2b2lkKSBtZW1zZXQoKGNoYXIgKikmd2hlcmV0bywgMCwgc2l6ZW9mKHdoZXJldG8pKTsKKworCXRvLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCXRvLT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKKworCWlmIChpbmV0X3B0b24oQUZfSU5FVDYsICphcmd2LCAmdG8tPnNpbjZfYWRkcikgPiAwKSB7CisJCWhvc3RuYW1lID0gKmFyZ3Y7CisJfSBlbHNlIHsKKwkJY2hhciAqaWRuID0gTlVMTDsKKyNpZmRlZiBVU0VfSUROCisJCWlmIChpZG5hX3RvX2FzY2lpX2x6KCphcmd2LCAmaWRuLCAwKSAhPSBJRE5BX1NVQ0NFU1MpCisJCQlpZG4gPSBOVUxMOworI2VuZGlmCisJCWhwID0gZ2V0aG9zdGJ5bmFtZTIoaWRuID8gaWRuIDogKmFyZ3YsIEFGX0lORVQ2KTsKKwkJaWYgKGhwKSB7CisJCQltZW1tb3ZlKChjYWRkcl90KSZ0by0+c2luNl9hZGRyLCBocC0+aF9hZGRyLCBzaXplb2YodG8tPnNpbjZfYWRkcikpOworCQkJaG9zdG5hbWUgPSAoY2hhciAqKWhwLT5oX25hbWU7CisJCX0gZWxzZSB7CisJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKKwkJCSAgICAidHJhY2Vyb3V0ZTogdW5rbm93biBob3N0ICVzXG4iLCAqYXJndik7CisJCQlleGl0KDEpOworCQl9CisJfQorCWZpcnN0aG9wID0gKnRvOworCWlmICgqKythcmd2KSB7CisJCWRhdGFsZW4gPSBhdG9pKCphcmd2KTsKKwkJLyogTWVzc2FnZSBmb3IgcnBtIG1haW50YWluZXJzOiBoYXZlIF9zaGFtZV8uIElmIHlvdSB3YW50CisJCSAqIHRvIGZpeCBzb21ldGhpbmcgc2VuZCB0aGUgcGF0Y2ggdG8gbWUgZm9yIHNhbml0eSBjaGVja2luZy4KKwkJICogImRhdGFsZW4iIHBhdGNoIGlzIGEgc2hpdC4gKi8KKwkJaWYgKGRhdGFsZW4gPT0gMCkKKwkJCWRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpOworCQllbHNlIGlmIChkYXRhbGVuIDwgKGludClzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpIHx8CisJCQkgZGF0YWxlbiA+PSBNQVhQQUNLRVQpIHsKKwkJCUZwcmludGYoc3RkZXJyLAorCQkJICAgICJ0cmFjZXJvdXRlOiBwYWNrZXQgc2l6ZSBtdXN0IGJlICVkIDw9IHMgPCAlZC5cbiIsCisJCQkJKGludClzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpLCBNQVhQQUNLRVQpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWlkZW50ID0gZ2V0cGlkKCk7CisKKwlzZW5kYnVmZiA9IG1hbGxvYyhkYXRhbGVuKTsKKwlpZiAoc2VuZGJ1ZmYgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsZWRcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChpY21wX3NvY2sgPCAwKSB7CisJCWVycm5vID0gc29ja2V0X2Vycm5vOworCQlwZXJyb3IoInRyYWNlcm91dGU2OiBpY21wIHNvY2tldCIpOworCQlleGl0KDEpOworCX0KKworI2lmZGVmIElQVjZfUkVDVlBLVElORk8KKwlzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX0lQVjYsIElQVjZfUkVDVlBLVElORk8sICZvbiwgc2l6ZW9mKG9uKSk7CisJc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9JUFY2LCBJUFY2XzIyOTJQS1RJTkZPLCAmb24sIHNpemVvZihvbikpOworI2Vsc2UKKwlzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX0lQVjYsIElQVjZfUEtUSU5GTywgJm9uLCBzaXplb2Yob24pKTsKKyNlbmRpZgorCisJaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKKwkJc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0RFQlVHLAorCQkJICAgKGNoYXIgKikmb24sIHNpemVvZihvbikpOworCWlmIChvcHRpb25zICYgU09fRE9OVFJPVVRFKQorCQlzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAorCQkJICAgKGNoYXIgKikmb24sIHNpemVvZihvbikpOworCisjaWZkZWYgX19saW51eF9fCisJb24gPSAyOworCWlmIChzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgJm9uLCBzaXplb2Yob24pKSA8IDApIHsKKwkJLyogY2hlY2tzdW0gc2hvdWxkIGJlIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgc2V0dGluZyB0aGlzCisJCSAqIG9wdGlvbiBtaWdodCBmYWlsIGFueXdheS4KKwkJICovCisJCWZwcmludGYoc3RkZXJyLCAic2V0c29ja29wdChSQVdfQ0hFQ0tTVU0pIGZhaWxlZCAtIHRyeSB0byBjb250aW51ZS4iKTsKKwl9CisjZW5kaWYKKworCWlmICgoc25kc29jayA9IHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCkpIDwgMCkgeworCQlwZXJyb3IoInRyYWNlcm91dGU6IFVEUCBzb2NrZXQiKTsKKwkJZXhpdCg1KTsKKwl9CisjaWZkZWYgU09fU05EQlVGCisJaWYgKHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciAqKSZkYXRhbGVuLAorCQkgICAgICAgc2l6ZW9mKGRhdGFsZW4pKSA8IDApIHsKKwkJcGVycm9yKCJ0cmFjZXJvdXRlOiBTT19TTkRCVUYiKTsKKwkJZXhpdCg2KTsKKwl9CisjZW5kaWYgLyogU09fU05EQlVGICovCisKKwlpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQorCQkodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywKKwkJCQkgIChjaGFyICopJm9uLCBzaXplb2Yob24pKTsKKwlpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKKwkJKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAorCQkJCSAgKGNoYXIgKikmb24sIHNpemVvZihvbikpOworCisJaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisJCXNvY2tsZW5fdCBhbGVuOworCQlpbnQgcHJvYmVfZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworCisJCWlmIChwcm9iZV9mZCA8IDApIHsKKwkJCXBlcnJvcigic29ja2V0Iik7CisJCQlleGl0KDEpOworCQl9CisJCWlmIChkZXZpY2UpIHsKKwkJCWlmIChzZXRzb2Nrb3B0KHByb2JlX2ZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIGRldmljZSwgc3RybGVuKGRldmljZSkrMSkgPT0gLTEpCisJCQkJcGVycm9yKCJXQVJOSU5HOiBpbnRlcmZhY2UgaXMgaWdub3JlZCIpOworCQl9CisJCWZpcnN0aG9wLnNpbjZfcG9ydCA9IGh0b25zKDEwMjUpOworCQlpZiAoY29ubmVjdChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciopJmZpcnN0aG9wLCBzaXplb2YoZmlyc3Rob3ApKSA9PSAtMSkgeworCQkJcGVycm9yKCJjb25uZWN0Iik7CisJCQlleGl0KDEpOworCQl9CisJCWFsZW4gPSBzaXplb2Yoc2FkZHIpOworCQlpZiAoZ2V0c29ja25hbWUocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYWRkciwgJmFsZW4pID09IC0xKSB7CisJCQlwZXJyb3IoImdldHNvY2tuYW1lIik7CisJCQlleGl0KDEpOworCQl9CisJCXNhZGRyLnNpbjZfcG9ydCA9IDA7CisJCWNsb3NlKHByb2JlX2ZkKTsKKwl9IGVsc2UgeworCQkodm9pZCkgbWVtc2V0KChjaGFyICopJnNhZGRyLCAwLCBzaXplb2Yoc2FkZHIpKTsKKwkJc2FkZHIuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgc291cmNlLCAmc2FkZHIuc2luNl9hZGRyKSA8PSAwKQorCQl7CisJCQlQcmludGYoInRyYWNlcm91dGU6IHVua25vd24gYWRkciAlc1xuIiwgc291cmNlKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAoYmluZChzbmRzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKKwkJcGVycm9yICgidHJhY2Vyb3V0ZTogYmluZCBzZW5kaW5nIHNvY2tldCIpOworCQlleGl0ICgxKTsKKwl9CisJaWYgKGJpbmQoaWNtcF9zb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKKwkJcGVycm9yICgidHJhY2Vyb3V0ZTogYmluZCBpY21wNiBzb2NrZXQiKTsKKwkJZXhpdCAoMSk7CisJfQorCisJRnByaW50ZihzdGRlcnIsICJ0cmFjZXJvdXRlIHRvICVzICglcykiLCBob3N0bmFtZSwKKwkJaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIHNpemVvZihwYSkpKTsKKworCUZwcmludGYoc3RkZXJyLCAiIGZyb20gJXMiLAorCQlpbmV0X250b3AoQUZfSU5FVDYsICZzYWRkci5zaW42X2FkZHIsIHBhLCBzaXplb2YocGEpKSk7CisJRnByaW50ZihzdGRlcnIsICIsICVkIGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsIG1heF90dGwsIGRhdGFsZW4pOworCSh2b2lkKSBmZmx1c2goc3RkZXJyKTsKKworCWZvciAodHRsID0gMTsgdHRsIDw9IG1heF90dGw7ICsrdHRsKSB7CisJCXN0cnVjdCBpbjZfYWRkciBsYXN0YWRkciA9IHt7ezAsfX19OworCQlpbnQgZ290X3RoZXJlID0gMDsKKwkJaW50IHVucmVhY2hhYmxlID0gMDsKKworCQlQcmludGYoIiUyZCAiLCB0dGwpOworCQlmb3IgKHByb2JlID0gMDsgcHJvYmUgPCBucHJvYmVzOyArK3Byb2JlKSB7CisJCQlpbnQgY2MsIHJlc2V0X3RpbWVyOworCQkJc3RydWN0IHRpbWV2YWwgdDEsIHQyOworCQkJc3RydWN0IHRpbWV6b25lIHR6OworCQkJc3RydWN0IGluNl9hZGRyIHRvOworCisJCQlnZXR0aW1lb2ZkYXkoJnQxLCAmdHopOworCQkJc2VuZF9wcm9iZSgrK3NlcSwgdHRsKTsKKwkJCXJlc2V0X3RpbWVyID0gMTsKKworCQkJd2hpbGUgKChjYyA9IHdhaXRfZm9yX3JlcGx5KGljbXBfc29jaywgJmZyb20sICZ0bywgcmVzZXRfdGltZXIpKSAhPSAwKSB7CisJCQkJZ2V0dGltZW9mZGF5KCZ0MiwgJnR6KTsKKwkJCQlpZiAoKGkgPSBwYWNrZXRfb2socGFja2V0LCBjYywgJmZyb20sICZ0bywgc2VxLCAmdDEpKSkgeworCQkJCQlyZXNldF90aW1lciA9IDE7CisJCQkJCWlmIChtZW1jbXAoJmZyb20uc2luNl9hZGRyLCAmbGFzdGFkZHIsIHNpemVvZihmcm9tLnNpbjZfYWRkcikpKSB7CisJCQkJCQlwcmludChwYWNrZXQsIGNjLCAmZnJvbSk7CisJCQkJCQltZW1jcHkoJmxhc3RhZGRyLAorCQkJCQkJICAgICAgICZmcm9tLnNpbjZfYWRkciwKKwkJCQkJCSAgICAgICBzaXplb2YobGFzdGFkZHIpKTsKKwkJCQkJfQorCQkJCQlQcmludGYoIiAgJWcgbXMiLCBkZWx0YVQoJnQxLCAmdDIpKTsKKwkJCQkJc3dpdGNoKGkgLSAxKSB7CisJCQkJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUOgorCQkJCQkJKytnb3RfdGhlcmU7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEU6CisJCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQkJUHJpbnRmKCIgIU4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FERFI6CisJCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQkJUHJpbnRmKCIgIUgiKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQURNSU46CisJCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQkJUHJpbnRmKCIgIVMiKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZQorCQkJCQlyZXNldF90aW1lciA9IDA7CisJCQl9CisJCQlpZiAoY2MgPD0gMCkKKwkJCQlQcmludGYoIiAqIik7CisJCQkodm9pZCkgZmZsdXNoKHN0ZG91dCk7CisJCX0KKwkJcHV0Y2hhcignXG4nKTsKKwkJaWYgKGdvdF90aGVyZSB8fAorCQkgICAgKHVucmVhY2hhYmxlID4gMCAmJiB1bnJlYWNoYWJsZSA+PSBucHJvYmVzLTEpKQorCQkJZXhpdCgwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Cit3YWl0X2Zvcl9yZXBseShzb2NrLCBmcm9tLCB0bywgcmVzZXRfdGltZXIpCisJaW50IHNvY2s7CisJc3RydWN0IHNvY2thZGRyX2luNiAqZnJvbTsKKwlzdHJ1Y3QgaW42X2FkZHIgKnRvOworCWludCByZXNldF90aW1lcjsKK3sKKwlmZF9zZXQgZmRzOworCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB3YWl0OworCWludCBjYyA9IDA7CisJY2hhciBjYnVmWzUxMl07CisKKwlGRF9aRVJPKCZmZHMpOworCUZEX1NFVChzb2NrLCAmZmRzKTsKKwlpZiAocmVzZXRfdGltZXIpIHsKKwkJLyoKKwkJICogdHJhY2Vyb3V0ZSBjb3VsZCBoYW5nIGlmIHNvbWVvbmUgZWxzZSBoYXMgYSBwaW5nCisJCSAqIHJ1bm5pbmcgYW5kIG91ciBJQ01QIHJlcGx5IGdldHMgZHJvcHBlZCBidXQgd2UgZG9uJ3QKKwkJICogcmVhbGl6ZSBpdCBiZWNhdXNlIHdlIGtlZXAgd2FraW5nIHVwIHRvIGhhbmRsZSB0aG9zZQorCQkgKiBvdGhlciBJQ01QIHBhY2tldHMgdGhhdCBrZWVwIGNvbWluZyBpbi4gIFRvIGZpeCB0aGlzLAorCQkgKiAicmVzZXRfdGltZXIiIHdpbGwgb25seSBiZSB0cnVlIGlmIHRoZSBsYXN0IHBhY2tldCB0aGF0CisJCSAqIGNhbWUgaW4gd2FzIGZvciB1cyBvciBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlCisJCSAqIHdhaXRpbmcgZm9yIGEgcmVwbHkgc2luY2Ugc2VuZGluZyBvdXQgYSBwcm9iZS4gIE5vdGUKKwkJICogdGhhdCB0aGlzIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgc2VsZWN0KCkgZmVhdHVyZSBvbgorCQkgKiBMaW51eCB3aGVyZSB0aGUgcmVtYWluaW5nIHRpbWVvdXQgaXMgd3JpdHRlbiB0byB0aGUKKwkJICogc3RydWN0IHRpbWV2YWwgYXJlYS4KKwkJICovCisJCXdhaXQudHZfc2VjID0gd2FpdHRpbWU7CisJCXdhaXQudHZfdXNlYyA9IDA7CisJfQorCisJaWYgKHNlbGVjdChzb2NrKzEsICZmZHMsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJndhaXQpID4gMCkgeworCQlzdHJ1Y3QgaW92ZWMgaW92OworCQlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwkJaW92Lmlvdl9iYXNlID0gcGFja2V0OworCQlpb3YuaW92X2xlbiA9IHNpemVvZihwYWNrZXQpOworCQltc2cubXNnX25hbWUgPSAodm9pZCAqKWZyb207CisJCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZigqZnJvbSk7CisJCW1zZy5tc2dfaW92ID0gJmlvdjsKKwkJbXNnLm1zZ19pb3ZsZW4gPSAxOworCQltc2cubXNnX2ZsYWdzID0gMDsKKwkJbXNnLm1zZ19jb250cm9sID0gY2J1ZjsKKwkJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNidWYpOworCisJCWNjID0gcmVjdm1zZyhpY21wX3NvY2ssICZtc2csIDApOworCQlpZiAoY2MgPj0gMCkgeworCQkJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJCQlzdHJ1Y3QgaW42X3BrdGluZm8gKmlwaTsKKworCQkJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKwkJCSAgICAgY21zZzsKKwkJCSAgICAgY21zZyA9IENNU0dfTlhUSERSKCZtc2csIGNtc2cpKSB7CisJCQkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgIT0gU09MX0lQVjYpCisJCQkJCWNvbnRpbnVlOworCQkJCXN3aXRjaCAoY21zZy0+Y21zZ190eXBlKSB7CisJCQkJY2FzZSBJUFY2X1BLVElORk86CisjaWZkZWYgSVBWNl8yMjkyUEtUSU5GTworCQkJCWNhc2UgSVBWNl8yMjkyUEtUSU5GTzoKKyNlbmRpZgorCQkJCQlpcGkgPSAoc3RydWN0IGluNl9wa3RpbmZvICopQ01TR19EQVRBKGNtc2cpOworCQkJCQltZW1jcHkodG8sIGlwaSwgc2l6ZW9mKCp0bykpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybihjYyk7Cit9CisKKwordm9pZCBzZW5kX3Byb2JlKGludCBzZXEsIGludCB0dGwpCit7CisJc3RydWN0IHBrdF9mb3JtYXQgKnBrdCA9IChzdHJ1Y3QgcGt0X2Zvcm1hdCAqKSBzZW5kYnVmZjsKKwlpbnQgaTsKKworCXBrdC0+aWRlbnQgPSBodG9ubChpZGVudCk7CisJcGt0LT5zZXEgPSBodG9ubChzZXEpOworCWdldHRpbWVvZmRheSgmcGt0LT50diwgJnR6KTsKKworCWkgPSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9JUFY2LCBJUFY2X1VOSUNBU1RfSE9QUywgJnR0bCwgc2l6ZW9mKHR0bCkpOworCWlmIChpIDwgMCkKKwl7CisJCXBlcnJvcigic2V0c29ja29wdCIpOworCQlleGl0KDEpOworCX0KKworCWRvIHsKKwkJaSA9IHNlbmR0byhzbmRzb2NrLCBzZW5kYnVmZiwgZGF0YWxlbiwgMCwKKwkJCSAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmd2hlcmV0bywgc2l6ZW9mKHdoZXJldG8pKTsKKwl9IHdoaWxlIChpPDAgJiYgZXJybm8gPT0gRUNPTk5SRUZVU0VEKTsKKworCWlmIChpIDwgMCB8fCBpICE9IGRhdGFsZW4pICB7CisJCWlmIChpPDApCisJCQlwZXJyb3IoInNlbmR0byIpOworCQlQcmludGYoInRyYWNlcm91dGU6IHdyb3RlICVzICVkIGNoYXJzLCByZXQ9JWRcbiIsIGhvc3RuYW1lLAorCQkJZGF0YWxlbiwgaSk7CisJCSh2b2lkKSBmZmx1c2goc3Rkb3V0KTsKKwl9Cit9CisKKworZG91YmxlIGRlbHRhVChzdHJ1Y3QgdGltZXZhbCAqdDFwLCBzdHJ1Y3QgdGltZXZhbCAqdDJwKQoreworCXJlZ2lzdGVyIGRvdWJsZSBkdDsKKworCWR0ID0gKGRvdWJsZSkodDJwLT50dl9zZWMgLSB0MXAtPnR2X3NlYykgKiAxMDAwLjAgKworCSAgICAgKGRvdWJsZSkodDJwLT50dl91c2VjIC0gdDFwLT50dl91c2VjKSAvIDEwMDAuMDsKKwlyZXR1cm4gKGR0KTsKK30KKworCisvKgorICogQ29udmVydCBhbiBJQ01QICJ0eXBlIiBmaWVsZCB0byBhIHByaW50YWJsZSBzdHJpbmcuCisgKi8KK2NoYXIgKiBwcl90eXBlKHVuc2lnbmVkIGNoYXIgdCkKK3sKKwlzd2l0Y2godCkgeworCS8qIFVua25vd24gKi8KKwljYXNlIDA6CisJCXJldHVybiAiRXJyb3IiOworCWNhc2UgMToKKwkJLyogSUNNUDZfRFNUX1VOUkVBQ0g6ICovCisJCXJldHVybiAiRGVzdGluYXRpb24gVW5yZWFjaGFibGUiOworCWNhc2UgMjoKKwkJLyogSUNNUDZfUEFDS0VUX1RPT19CSUc6ICovCisJCXJldHVybiAiUGFja2V0IFRvbyBCaWciOworCWNhc2UgMzoKKwkJLyogSUNNUDZfVElNRV9FWENFRURFRCAqLworCQlyZXR1cm4gIlRpbWUgRXhjZWVkZWQgaW4gVHJhbnNpdCI7CisJY2FzZSA0OgorCQkvKiBJQ01QNl9QQVJBTV9QUk9CICovCisJCXJldHVybiAiUGFyYW1ldGVyIFByb2JsZW0iOworCWNhc2UgMTI4OgorCQkvKiBJQ01QNl9FQ0hPX1JFUVVFU1QgKi8KKwkJcmV0dXJuICJFY2hvIFJlcXVlc3QiOworCWNhc2UgMTI5OgorCQkvKiBJQ01QNl9FQ0hPX1JFUExZICovCisJCXJldHVybiAiRWNobyBSZXBseSI7CisJY2FzZSAxMzA6CisJCS8qIElDTVA2X01FTUJFUlNISVBfUVVFUlkgKi8KKwkJcmV0dXJuICJNZW1iZXJzaGlwIFF1ZXJ5IjsKKwljYXNlIDEzMToKKwkJLyogSUNNUDZfTUVNQkVSU0hJUF9SRVBPUlQgKi8KKwkJcmV0dXJuICJNZW1iZXJzaGlwIFJlcG9ydCI7CisJY2FzZSAxMzI6CisJCS8qIElDTVA2X01FTUJFUlNISVBfUkVEVUNUSU9OICovCisJCXJldHVybiAiTWVtYmVyc2hpcCBSZWR1Y3Rpb24iOworCWNhc2UgMTMzOgorCQkvKiBORF9ST1VURVJfU09MSUNJVCAqLworCQlyZXR1cm4gIlJvdXRlciBTb2xpY2l0YXRpb24iOworCWNhc2UgMTM0OgorCQkvKiBORF9ST1VURVJfQURWRVJUICovCisJCXJldHVybiAiUm91dGVyIEFkdmVydGlzZW1lbnQiOworCWNhc2UgMTM1OgorCQkvKiBORF9ORUlHSEJPUl9TT0xJQ0lUICovCisJCXJldHVybiAiTmVpZ2hib3IgU29saWNpdGF0aW9uIjsKKwljYXNlIDEzNjoKKwkJLyogTkRfTkVJR0hCT1JfQURWRVJUICovCisJCXJldHVybiAiTmVpZ2hib3IgQWR2ZXJ0aXNlbWVudCI7CisJY2FzZSAxMzc6CisJCS8qIE5EX1JFRElSRUNUICovCisJCXJldHVybiAiUmVkaXJlY3QiOworCX0KKworCXJldHVybigiT1VULU9GLVJBTkdFIik7Cit9CisKKworaW50IHBhY2tldF9vayh1X2NoYXIgKmJ1ZiwgaW50IGNjLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tLAorCSAgICAgIHN0cnVjdCBpbjZfYWRkciAqdG8sIGludCBzZXEsCisJICAgICAgc3RydWN0IHRpbWV2YWwgKnR2KQoreworCXN0cnVjdCBpY21wNl9oZHIgKmljcDsKKwl1X2NoYXIgdHlwZSwgY29kZTsKKworCWljcCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopIGJ1ZjsKKworCXR5cGUgPSBpY3AtPmljbXA2X3R5cGU7CisJY29kZSA9IGljcC0+aWNtcDZfY29kZTsKKworCWlmICgodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEICYmIGNvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCkgfHwKKwkgICAgdHlwZSA9PSBJQ01QNl9EU1RfVU5SRUFDSCkKKwl7CisJCXN0cnVjdCBpcDZfaGRyICpoaXA7CisJCXN0cnVjdCB1ZHBoZHIgKnVwOworCQlpbnQgbmV4dGhkcjsKKworCQloaXAgPSAoc3RydWN0IGlwNl9oZHIgKikgKGljcCArIDEpOworCQl1cCA9IChzdHJ1Y3QgdWRwaGRyICopKGhpcCsxKTsKKwkJbmV4dGhkciA9IGhpcC0+aXA2X254dDsKKworCQlpZiAobmV4dGhkciA9PSA0NCkgeworCQkJbmV4dGhkciA9ICoodW5zaWduZWQgY2hhciopdXA7CisJCQl1cCsrOworCQl9CisJCWlmIChuZXh0aGRyID09IElQUFJPVE9fVURQKQorCQl7CisJCQlzdHJ1Y3QgcGt0X2Zvcm1hdCAqcGt0OworCisJCQlwa3QgPSAoc3RydWN0IHBrdF9mb3JtYXQgKikgKHVwICsgMSk7CisKKwkJCWlmIChudG9obChwa3QtPmlkZW50KSA9PSBpZGVudCAmJgorCQkJICAgIG50b2hsKHBrdC0+c2VxKSA9PSBzZXEpCisJCQl7CisJCQkJKnR2ID0gcGt0LT50djsKKwkJCQlyZXR1cm4gKHR5cGUgPT0gSUNNUDZfVElNRV9FWENFRURFRCA/IC0xIDogY29kZSsxKTsKKwkJCX0KKwkJfQorCisJfQorCisJaWYgKHZlcmJvc2UpIHsKKwkJdW5zaWduZWQgY2hhciAqcDsKKwkJY2hhciBwYTFbTUFYX0hPU1ROQU1FTEVOXTsKKwkJY2hhciBwYTJbTUFYX0hPU1ROQU1FTEVOXTsKKwkJaW50IGk7CisKKwkJcCA9ICh1bnNpZ25lZCBjaGFyICopIChpY3AgKyAxKTsKKworCQlQcmludGYoIlxuJWQgYnl0ZXMgZnJvbSAlcyB0byAlcyIsIGNjLAorCQkgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmZnJvbS0+c2luNl9hZGRyLCBwYTEsIHNpemVvZihwYTEpKSwKKwkJICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwgdG8sIHBhMiwgc2l6ZW9mKHBhMikpKTsKKworCQlQcmludGYoIjogaWNtcCB0eXBlICVkICglcykgY29kZSAlZFxuIiwgdHlwZSwgcHJfdHlwZSh0eXBlKSwKKwkJICAgICAgIGljcC0+aWNtcDZfY29kZSk7CisKKwkJY2MgLT0gc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpOworCQlmb3IgKGkgPSAwOyBpIDwgY2MgOyBpKyspIHsKKwkJCWlmIChpICUgMTYgPT0gMCkKKwkJCQlQcmludGYoIiUwNHg6IiwgaSk7CisJCQlpZiAoaSAlIDQgPT0gMCkKKwkJCQlQcmludGYoIiAiKTsKKwkJCVByaW50ZigiJTAyeCIsIDB4ZmYgJiAodW5zaWduZWQpcFtpXSk7CisJCQlpZiAoaSAlIDE2ID09IDE1ICYmIGkgKyAxIDwgY2MpCisJCQkJUHJpbnRmKCJcbiIpOworCQl9CisJCVByaW50ZigiXG4iKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKwordm9pZCBwcmludCh1bnNpZ25lZCBjaGFyICpidWYsIGludCBjYywgc3RydWN0IHNvY2thZGRyX2luNiAqZnJvbSkKK3sKKwljaGFyIHBhW01BWF9IT1NUTkFNRUxFTl07CisKKwlpZiAobmZsYWcpCisJCVByaW50ZigiICVzIiwgaW5ldF9udG9wKEFGX0lORVQ2LCAmZnJvbS0+c2luNl9hZGRyLAorCQkJCQlwYSwgc2l6ZW9mKHBhKSkpOworCWVsc2UKKwl7CisJCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCQlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJCWNoYXIgKnMgPSBOVUxMOworCisJCWhvc3RuYW1lID0gaW5ldF9udG9wKEFGX0lORVQ2LCAmZnJvbS0+c2luNl9hZGRyLCBwYSwgc2l6ZW9mKHBhKSk7CisKKwkJaWYgKChocCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmZnJvbS0+c2luNl9hZGRyLAorCQkJCQlzaXplb2YoZnJvbS0+c2luNl9hZGRyKSwgQUZfSU5FVDYpKSkgeworI2lmZGVmIFVTRV9JRE4KKwkJCWlmIChpZG5hX3RvX3VuaWNvZGVfbHpseihocC0+aF9uYW1lLCAmcywgMCkgIT0gSUROQV9TVUNDRVNTKQorCQkJCXMgPSBOVUxMOworI2VuZGlmCisJCX0KKworCQlQcmludGYoIiAlcyAoJXMpIiwgaHAgPyAocyA/IHMgOiBocC0+aF9uYW1lKSA6IGhvc3RuYW1lLCBwYSk7CisKKwkJZnJlZShzKTsKKwl9Cit9CisKKworLyoKKyAqIFN1YnRyYWN0IDIgdGltZXZhbCBzdHJ1Y3RzOiAgb3V0ID0gb3V0IC0gaW4uCisgKiBPdXQgaXMgYXNzdW1lZCB0byBiZSA+PSBpbi4KKyAqLwordm9pZAordHZzdWIob3V0LCBpbikKKwlyZWdpc3RlciBzdHJ1Y3QgdGltZXZhbCAqb3V0LCAqaW47Cit7CisJaWYgKChvdXQtPnR2X3VzZWMgLT0gaW4tPnR2X3VzZWMpIDwgMCkgICB7CisJCW91dC0+dHZfc2VjLS07CisJCW91dC0+dHZfdXNlYyArPSAxMDAwMDAwOworCX0KKwlvdXQtPnR2X3NlYyAtPSBpbi0+dHZfc2VjOworfQorCit2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisiVXNhZ2U6IHRyYWNlcm91dGU2IFstZG5ydlZdIFstbSBtYXhfdHRsXSBbLXAgcG9ydCNdIFstcSBucXVlcmllc11cblx0XAorWy1zIHNyY19hZGRyXSBbLXQgdG9zXSBbLXcgd2FpdF0gaG9zdCBbZGF0YSBzaXplXVxuIik7CisJZXhpdCgxKTsKK30K