ZGlmZiAtLWdpdCBhL2pwZWcvQW5kcm9pZC5tayBiL2pwZWcvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzgwYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTU2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jIGptZW1ub2JzLmMKKworTE9DQUxfU1JDX0ZJTEVTX2FybSArPSBhcm12Nl9pZGN0LlMKKworaWZuZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSkKKyMgdW5idW5kbGVkIGJyYW5jaCwgYnVpbHQgYWdhaW5zdCBOREsuCitMT0NBTF9TREtfVkVSU0lPTiA6PSAxNworZW5kaWYKKworTE9DQUxfQ0ZMQUdTICs9IC1EQVZPSURfVEFCTEVTCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKKworIyBlbmFibGUgdGlsZSBiYXNlZCBkZWNvZGUKK0xPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKKworTE9DQUxfQ0ZMQUdTX3g4NiArPSAtREFORFJPSURfSU5URUxTU0UyX0lEQ1QKK0xPQ0FMX1NSQ19GSUxFU194ODYgKz0gamlkY3RpbnRlbHNzZS5jCisKK0xPQ0FMX1NSQ19GSUxFU19hcm02NCArPSBcCisgICAgICAgIGpzaW1kX2FybTY0X25lb24uUyBcCisgICAgICAgIGpzaW1kX25lb24uYworCitpZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKKyAgI3VzZSBORU9OIGFjY2VsZXJhdGlvbnMKKyAgTE9DQUxfQ0ZMQUdTX2FybSArPSAtRE5WX0FSTV9ORU9OIC1EX19BUk1fSEFWRV9ORU9OCisgIExPQ0FMX1NSQ19GSUxFU19hcm0gKz0gXAorICAgICAganNpbWRfYXJtX25lb24uUyBcCisgICAgICBqc2ltZF9uZW9uLmMKK2Vsc2UKKyAgIyBlbmFibGUgYXJtdjYgaWRjdCBhc3NlbWJseQorICBMT0NBTF9DRkxBR1NfYXJtICs9IC1EQU5EUk9JRF9BUk1WNl9JRENUCitlbmRpZgorCisjIHVzZSBtaXBzIGFzc2VtYmxlciBJRENUIGltcGxlbWVudGF0aW9uIGlmIE1JUFMgRFNQLUFTRSBpcyBwcmVzZW50CitpZmVxICgkKHN0cmlwICQoQVJDSF9NSVBTX0hBU19EU1ApKSx0cnVlKQorTE9DQUxfQ0ZMQUdTX21pcHMgKz0gLURBTkRST0lEX01JUFNfSURDVAorTE9DQUxfU1JDX0ZJTEVTX21pcHMgKz0gXAorICAgIG1pcHNfamlkY3Rmc3QuYyBcCisgICAgbWlwc19pZGN0X2xlLlMKK2VuZGlmCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJqcGVnX3N0YXRpYworCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKworIyBCdWlsZCBzaGFyZWQgbGlicmFyeQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJqcGVnCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTID0gbGlianBlZ19zdGF0aWMKKworaWZlcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzCitlbHNlCisjIHVuYnVuZGxlZCBicmFuY2gsIGJ1aWx0IGFnYWluc3QgTkRLLgorTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTcKK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworCisjIEJ1aWxkIHN0YXRpYyBsaWJyYXJ5IGFnYWluc3QgTkRLCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYyBqbWVtbm9icy5jCisKK0xPQ0FMX1NSQ19GSUxFU19hcm0gKz0gYXJtdjZfaWRjdC5TCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDE3CitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gbm9uZQorCitMT0NBTF9DRkxBR1MgKz0gLURBVk9JRF9UQUJMRVMKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCisjIGVuYWJsZSB0aWxlIGJhc2VkIGRlY29kZQorTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQorCitMT0NBTF9DRkxBR1NfeDg2ICs9IC1EQU5EUk9JRF9JTlRFTFNTRTJfSURDVAorTE9DQUxfU1JDX0ZJTEVTX3g4NiArPSBqaWRjdGludGVsc3NlLmMKKworTE9DQUxfU1JDX0ZJTEVTX2FybTY0ICs9IFwKKyAgICAgICAganNpbWRfYXJtNjRfbmVvbi5TIFwKKyAgICAgICAganNpbWRfbmVvbi5jCisKK2lmZXEgKCQoQVJDSF9BUk1fSEFWRV9ORU9OKSx0cnVlKQorICAjdXNlIE5FT04gYWNjZWxlcmF0aW9ucworICBMT0NBTF9DRkxBR1NfYXJtICs9IC1ETlZfQVJNX05FT04gLURfX0FSTV9IQVZFX05FT04KKyAgTE9DQUxfU1JDX0ZJTEVTX2FybSArPSBcCisgICAgICBqc2ltZF9hcm1fbmVvbi5TIFwKKyAgICAgIGpzaW1kX25lb24uYworZWxzZQorICAjIGVuYWJsZSBhcm12NiBpZGN0IGFzc2VtYmx5CisgIExPQ0FMX0NGTEFHU19hcm0gKz0gLURBTkRST0lEX0FSTVY2X0lEQ1QKK2VuZGlmCisKKyMgdXNlIG1pcHMgYXNzZW1ibGVyIElEQ1QgaW1wbGVtZW50YXRpb24gaWYgTUlQUyBEU1AtQVNFIGlzIHByZXNlbnQKK2lmZXEgKCQoc3RyaXAgJChBUkNIX01JUFNfSEFTX0RTUCkpLHRydWUpCitMT0NBTF9DRkxBR1NfbWlwcyArPSAtREFORFJPSURfTUlQU19JRENUCitMT0NBTF9TUkNfRklMRVNfbWlwcyArPSBcCisgICAgbWlwc19qaWRjdGZzdC5jIFwKKyAgICBtaXBzX2lkY3RfbGUuUworZW5kaWYKKworTE9DQUxfTU9EVUxFIDo9IGxpYmpwZWdfc3RhdGljX25kaworCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJY2pwZWcuYyByZHN3aXRjaC5jIGNkanBlZy5jIHJkdGFyZ2EuYyByZHBwbS5jIHJkZ2lmLmMgcmRibXAuYworTE9DQUxfTU9EVUxFOj0gY2pwZWcKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlianBlZworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCWRqcGVnLmMgY2RqcGVnLmMgd3JwcG0uYyB3cmdpZi5jIHdyYm1wLmMgcmRjb2xtYXAuYyB3cnRhcmdhLmMKK0xPQ0FMX01PRFVMRTo9IGRqcGVnCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmpwZWcKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvanBlZy9DbGVhblNwZWMubWsgYi9qcGVnL0NsZWFuU3BlYy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRlMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9DbGVhblNwZWMubWsKQEAgLTAsMCArMSw0OSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBJZiB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhIGZ1bGwgY2xlYW4gYnVpbGQgYnV0IHdvdWxkIGxpa2UgdG8gdG91Y2gKKyMgYSBmaWxlIG9yIGRlbGV0ZSBzb21lIGludGVybWVkaWF0ZSBmaWxlcywgYWRkIGEgY2xlYW4gc3RlcCB0byB0aGUgZW5kCisjIG9mIHRoZSBsaXN0LiAgVGhlc2Ugc3RlcHMgd2lsbCBvbmx5IGJlIHJ1biBvbmNlLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbgorIyBydW4gYmVmb3JlLgorIworIyBFLmcuOgorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCB0b3VjaCAtYyBleHRlcm5hbC9zcWxpdGUvc3FsaXRlMy5oKQorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliel9pbnRlcm1lZGlhdGVzKQorIworIyBBbHdheXMgdXNlICJ0b3VjaCAtYyIgYW5kICJybSAtZiIgb3IgInJtIC1yZiIgdG8gZ3JhY2VmdWxseSBkZWFsIHdpdGgKKyMgZmlsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBoYXZlIGJlZW4gbW92ZWQuCisjCisjIFVzZSAkKFBST0RVQ1RfT1VUKSB0byBnZXQgdG8gdGhlICJvdXQvdGFyZ2V0L3Byb2R1Y3QvYmxhaC8iIGRpcmVjdG9yeS4KKyMgVXNlICQoT1VUX0RJUikgdG8gcmVmZXIgdG8gdGhlICJvdXQiIGRpcmVjdG9yeS4KKyMKKyMgSWYgeW91IG5lZWQgdG8gcmUtZG8gc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IG1lbnRpb25lZCwganVzdCBjb3B5CisjIHRoZSBjb21tYW5kIGFuZCBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4gIEUuZy4sIGlmIGEgY2hhbmdlCisjIHRoYXQgeW91IG1hZGUgbGFzdCB3ZWVrIHJlcXVpcmVkIHRvdWNoaW5nIGEgZmlsZSBhbmQgYSBjaGFuZ2UgeW91CisjIG1hZGUgdG9kYXkgcmVxdWlyZXMgdG91Y2hpbmcgdGhlIHNhbWUgZmlsZSwganVzdCBjb3B5IHRoZSBvbGQKKyMgdG91Y2ggc3RlcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgRm9yIGV4YW1wbGU6CisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9BUFBTL0FuZHJvaWRUZXN0c19pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZV9pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIklHVGFsa1Nlc3Npb24qIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvZGF0YS8qKQorCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9qcGVnL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvanBlZy9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpkaWZmIC0tZ2l0IGEvanBlZy9OT1RJQ0UgYi9qcGVnL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGUzNTZmCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9OT1RJQ0UKQEAgLTAsMCArMSw5NCBAQAorVGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsCit3aXRoIHJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kIHlvdSwKK2l0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KKworVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitBbGwgUmlnaHRzIFJlc2VydmVkIGV4Y2VwdCBhcyBzcGVjaWZpZWQgYmVsb3cuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZXNlCitjb25kaXRpb25zOgorKDEpIElmIGFueSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGlzCitSRUFETUUgZmlsZSBtdXN0IGJlIGluY2x1ZGVkLCB3aXRoIHRoaXMgY29weXJpZ2h0IGFuZCBuby13YXJyYW50eSBub3RpY2UKK3VuYWx0ZXJlZDsgYW5kIGFueSBhZGRpdGlvbnMsIGRlbGV0aW9ucywgb3IgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZXMKK211c3QgYmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4gYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24uCisoMikgSWYgb25seSBleGVjdXRhYmxlIGNvZGUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhlIGFjY29tcGFueWluZworZG9jdW1lbnRhdGlvbiBtdXN0IHN0YXRlIHRoYXQgInRoaXMgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgd29yayBvZgordGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAiLgorKDMpIFBlcm1pc3Npb24gZm9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgb25seSBpZiB0aGUgdXNlciBhY2NlcHRzCitmdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzOyB0aGUgYXV0aG9ycyBhY2NlcHQKK05PIExJQUJJTElUWSBmb3IgZGFtYWdlcyBvZiBhbnkga2luZC4KKworVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcgY29kZSwKK25vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQgdG8KK2Fja25vd2xlZGdlIHVzLgorCitQZXJtaXNzaW9uIGlzIE5PVCBncmFudGVkIGZvciB0aGUgdXNlIG9mIGFueSBJSkcgYXV0aG9yJ3MgbmFtZSBvciBjb21wYW55IG5hbWUKK2luIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGlzIHNvZnR3YXJlIG9yIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQoraXQuICBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWZlcnJlZCB0byBvbmx5IGFzICJ0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzCitzb2Z0d2FyZSIuCisKK1dlIHNwZWNpZmljYWxseSBwZXJtaXQgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgYXMgdGhlIGJhc2lzIG9mCitjb21tZXJjaWFsIHByb2R1Y3RzLCBwcm92aWRlZCB0aGF0IGFsbCB3YXJyYW50eSBvciBsaWFiaWxpdHkgY2xhaW1zIGFyZQorYXNzdW1lZCBieSB0aGUgcHJvZHVjdCB2ZW5kb3IuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyBBUk0gTkVPTiBvcHRpbWl6YXRpb25zIGZvciBsaWJqcGVnLXR1cmJvCisKKyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyBDb250YWN0OiBBbGV4YW5kZXIgQm9rb3ZveSA8YWxleGFuZGVyLmJva292b3lAbm9raWEuY29tPgorCisgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIENvcHlyaWdodCAoYykgMjAxMSwgIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIE5WSURJQSBDT1JQT1JBVElPTiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9qcGVnL1JFQURNRSBiL2pwZWcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2MyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL1JFQURNRQpAQCAtMCwwICsxLDM4NSBAQAorVGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUkVBRE1FIGZvciByZWxlYXNlIDZiIG9mIDI3LU1hci0xOTk4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkaXN0cmlidXRpb24gY29udGFpbnMgdGhlIHNpeHRoIHB1YmxpYyByZWxlYXNlIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHCitHcm91cCdzIGZyZWUgSlBFRyBzb2Z0d2FyZS4gIFlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKK3RvIHVzZSBpdCBmb3IgYW55IHB1cnBvc2UsIHN1YmplY3QgdG8gdGhlIGNvbmRpdGlvbnMgdW5kZXIgTEVHQUwgSVNTVUVTLCBiZWxvdy4KKworU2VyaW91cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIChwYXJ0aWN1bGFybHkgdGhvc2UgaW5jb3Jwb3JhdGluZyBpdCBpbnRvCitsYXJnZXIgcHJvZ3JhbXMpIHNob3VsZCBjb250YWN0IElKRyBhdCBqcGVnLWluZm9AdXVuZXQudXUubmV0IHRvIGJlIGFkZGVkIHRvCitvdXIgZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3QuICBNYWlsaW5nIGxpc3QgbWVtYmVycyBhcmUgbm90aWZpZWQgb2YgdXBkYXRlcworYW5kIGhhdmUgYSBjaGFuY2UgdG8gcGFydGljaXBhdGUgaW4gdGVjaG5pY2FsIGRpc2N1c3Npb25zLCBldGMuCisKK1RoaXMgc29mdHdhcmUgaXMgdGhlIHdvcmsgb2YgVG9tIExhbmUsIFBoaWxpcCBHbGFkc3RvbmUsIEppbSBCb3VjaGVyLAorTGVlIENyb2NrZXIsIEp1bGlhbiBNaW5ndWlsbG9uLCBMdWlzIE9ydGl6LCBHZW9yZ2UgUGhpbGxpcHMsIERhdmlkZSBSb3NzaSwKK0d1aWRvIFZvbGxiZWRpbmcsIEdlJyBXZWlqZXJzLCBhbmQgb3RoZXIgbWVtYmVycyBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRworR3JvdXAuCisKK0lKRyBpcyBub3QgYWZmaWxpYXRlZCB3aXRoIHRoZSBvZmZpY2lhbCBJU08gSlBFRyBzdGFuZGFyZHMgY29tbWl0dGVlLgorCisKK0RPQ1VNRU5UQVRJT04gUk9BRE1BUAorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgorCitPVkVSVklFVyAgICAgICAgICAgIEdlbmVyYWwgZGVzY3JpcHRpb24gb2YgSlBFRyBhbmQgdGhlIElKRyBzb2Z0d2FyZS4KK0xFR0FMIElTU1VFUyAgICAgICAgQ29weXJpZ2h0LCBsYWNrIG9mIHdhcnJhbnR5LCB0ZXJtcyBvZiBkaXN0cmlidXRpb24uCitSRUZFUkVOQ0VTICAgICAgICAgIFdoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgSlBFRy4KK0FSQ0hJVkUgTE9DQVRJT05TICAgV2hlcmUgdG8gZmluZCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlLgorUkVMQVRFRCBTT0ZUV0FSRSAgICBPdGhlciBzdHVmZiB5b3Ugc2hvdWxkIGdldC4KK0ZJTEUgRk9STUFUIFdBUlMgICAgU29mdHdhcmUgKm5vdCogdG8gZ2V0LgorVE8gRE8gICAgICAgICAgICAgICBQbGFucyBmb3IgZnV0dXJlIElKRyByZWxlYXNlcy4KKworT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZToKKworVXNlciBkb2N1bWVudGF0aW9uOgorICBpbnN0YWxsLmRvYyAgICAgICBIb3cgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUuCisgIHVzYWdlLmRvYyAgICAgICAgIFVzYWdlIGluc3RydWN0aW9ucyBmb3IgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwKKyAgICAgICAgICAgICAgICAgICAgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbS4KKyAgKi4xICAgICAgICAgICAgICAgVW5peC1zdHlsZSBtYW4gcGFnZXMgZm9yIHByb2dyYW1zIChzYW1lIGluZm8gYXMgdXNhZ2UuZG9jKS4KKyAgd2l6YXJkLmRvYyAgICAgICAgQWR2YW5jZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciBKUEVHIHdpemFyZHMgb25seS4KKyAgY2hhbmdlLmxvZyAgICAgICAgVmVyc2lvbi10by12ZXJzaW9uIGNoYW5nZSBoaWdobGlnaHRzLgorUHJvZ3JhbW1lciBhbmQgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbjoKKyAgbGlianBlZy5kb2MgICAgICAgSG93IHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW1zLgorICBleGFtcGxlLmMgICAgICAgICBTYW1wbGUgY29kZSBmb3IgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgorICBzdHJ1Y3R1cmUuZG9jICAgICBPdmVydmlldyBvZiB0aGUgSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgc3RydWN0dXJlLgorICBmaWxlbGlzdC5kb2MgICAgICBSb2FkIG1hcCBvZiBJSkcgZmlsZXMuCisgIGNvZGVydWxlcy5kb2MgICAgIENvZGluZyBzdHlsZSBydWxlcyAtLS0gcGxlYXNlIHJlYWQgaWYgeW91IGNvbnRyaWJ1dGUgY29kZS4KKworUGxlYXNlIHJlYWQgYXQgbGVhc3QgdGhlIGZpbGVzIGluc3RhbGwuZG9jIGFuZCB1c2FnZS5kb2MuICBVc2VmdWwgaW5mb3JtYXRpb24KK2NhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBKUEVHIEZBUSAoRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMpIGFydGljbGUuICBTZWUKK0FSQ0hJVkUgTE9DQVRJT05TIGJlbG93IHRvIGZpbmQgb3V0IHdoZXJlIHRvIG9idGFpbiB0aGUgRkFRIGFydGljbGUuCisKK0lmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBKUEVHIGNvZGUgd29ya3MsIHdlIHN1Z2dlc3QgcmVhZGluZyBvbmUgb3IKK21vcmUgb2YgdGhlIFJFRkVSRU5DRVMsIHRoZW4gbG9va2luZyBhdCB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcyAoaW4gcm91Z2hseQordGhlIG9yZGVyIGxpc3RlZCkgYmVmb3JlIGRpdmluZyBpbnRvIHRoZSBjb2RlLgorCisKK09WRVJWSUVXCis9PT09PT09PQorCitUaGlzIHBhY2thZ2UgY29udGFpbnMgQyBzb2Z0d2FyZSB0byBpbXBsZW1lbnQgSlBFRyBpbWFnZSBjb21wcmVzc2lvbiBhbmQKK2RlY29tcHJlc3Npb24uICBKUEVHIChwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24KK21ldGhvZCBmb3IgZnVsbC1jb2xvciBhbmQgZ3JheS1zY2FsZSBpbWFnZXMuICBKUEVHIGlzIGludGVuZGVkIGZvciBjb21wcmVzc2luZworInJlYWwtd29ybGQiIHNjZW5lczsgbGluZSBkcmF3aW5ncywgY2FydG9vbnMgYW5kIG90aGVyIG5vbi1yZWFsaXN0aWMgaW1hZ2VzCithcmUgbm90IGl0cyBzdHJvbmcgc3VpdC4gIEpQRUcgaXMgbG9zc3ksIG1lYW5pbmcgdGhhdCB0aGUgb3V0cHV0IGltYWdlIGlzIG5vdAorZXhhY3RseSBpZGVudGljYWwgdG8gdGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IG11c3Qgbm90IHVzZSBKUEVHIGlmIHlvdQoraGF2ZSB0byBoYXZlIGlkZW50aWNhbCBvdXRwdXQgYml0cy4gIEhvd2V2ZXIsIG9uIHR5cGljYWwgcGhvdG9ncmFwaGljIGltYWdlcywKK3ZlcnkgZ29vZCBjb21wcmVzc2lvbiBsZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZAorcmVtYXJrYWJseSBoaWdoIGNvbXByZXNzaW9uIGxldmVscyBhcmUgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhCitsb3ctcXVhbGl0eSBpbWFnZS4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVmZXJlbmNlcywgb3IganVzdCBleHBlcmltZW50Cit3aXRoIHZhcmlvdXMgY29tcHJlc3Npb24gc2V0dGluZ3MuCisKK1RoaXMgc29mdHdhcmUgaW1wbGVtZW50cyBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZC1zZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUKK2NvbXByZXNzaW9uIHByb2Nlc3Nlcy4gIFByb3Zpc2lvbiBpcyBtYWRlIGZvciBzdXBwb3J0aW5nIGFsbCB2YXJpYW50cyBvZiB0aGVzZQorcHJvY2Vzc2VzLCBhbHRob3VnaCBzb21lIHVuY29tbW9uIHBhcmFtZXRlciBzZXR0aW5ncyBhcmVuJ3QgaW1wbGVtZW50ZWQgeWV0LgorRm9yIGxlZ2FsIHJlYXNvbnMsIHdlIGFyZSBub3QgZGlzdHJpYnV0aW5nIGNvZGUgZm9yIHRoZSBhcml0aG1ldGljLWNvZGluZwordmFyaWFudHMgb2YgSlBFRzsgc2VlIExFR0FMIElTU1VFUy4gIFdlIGhhdmUgbWFkZSBubyBwcm92aXNpb24gZm9yIHN1cHBvcnRpbmcKK3RoZSBoaWVyYXJjaGljYWwgb3IgbG9zc2xlc3MgcHJvY2Vzc2VzIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLgorCitXZSBwcm92aWRlIGEgc2V0IG9mIGxpYnJhcnkgcm91dGluZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgSlBFRyBpbWFnZSBmaWxlcywKK3BsdXMgdHdvIHNhbXBsZSBhcHBsaWNhdGlvbnMgImNqcGVnIiBhbmQgImRqcGVnIiwgd2hpY2ggdXNlIHRoZSBsaWJyYXJ5IHRvCitwZXJmb3JtIGNvbnZlcnNpb24gYmV0d2VlbiBKUEVHIGFuZCBzb21lIG90aGVyIHBvcHVsYXIgaW1hZ2UgZmlsZSBmb3JtYXRzLgorVGhlIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgcmV1c2VkIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KKworSW4gb3JkZXIgdG8gc3VwcG9ydCBmaWxlIGNvbnZlcnNpb24gYW5kIHZpZXdpbmcgc29mdHdhcmUsIHdlIGhhdmUgaW5jbHVkZWQKK2NvbnNpZGVyYWJsZSBmdW5jdGlvbmFsaXR5IGJleW9uZCB0aGUgYmFyZSBKUEVHIGNvZGluZy9kZWNvZGluZyBjYXBhYmlsaXR5OworZm9yIGV4YW1wbGUsIHRoZSBjb2xvciBxdWFudGl6YXRpb24gbW9kdWxlcyBhcmUgbm90IHN0cmljdGx5IHBhcnQgb2YgSlBFRworZGVjb2RpbmcsIGJ1dCB0aGV5IGFyZSBlc3NlbnRpYWwgZm9yIG91dHB1dCB0byBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdHMgb3IKK2NvbG9ybWFwcGVkIGRpc3BsYXlzLiAgVGhlc2UgZXh0cmEgZnVuY3Rpb25zIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlCitsaWJyYXJ5IGlmIG5vdCByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiAgV2UgaGF2ZSBhbHNvIGluY2x1ZGVkCisianBlZ3RyYW4iLCBhIHV0aWxpdHkgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50IEpQRUcKK3Byb2Nlc3NlcywgYW5kICJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIsIHR3byBzaW1wbGUgYXBwbGljYXRpb25zIGZvcgoraW5zZXJ0aW5nIGFuZCBleHRyYWN0aW5nIHRleHR1YWwgY29tbWVudHMgaW4gSkZJRiBmaWxlcy4KKworVGhlIGVtcGhhc2lzIGluIGRlc2lnbmluZyB0aGlzIHNvZnR3YXJlIGhhcyBiZWVuIG9uIGFjaGlldmluZyBwb3J0YWJpbGl0eSBhbmQKK2ZsZXhpYmlsaXR5LCB3aGlsZSBhbHNvIG1ha2luZyBpdCBmYXN0IGVub3VnaCB0byBiZSB1c2VmdWwuICBJbiBwYXJ0aWN1bGFyLAordGhlIHNvZnR3YXJlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWFkIGFzIGEgdHV0b3JpYWwgb24gSlBFRy4gIChTZWUgdGhlCitSRUZFUkVOQ0VTIHNlY3Rpb24gZm9yIGludHJvZHVjdG9yeSBtYXRlcmlhbC4pICBSYXRoZXIsIGl0IGlzIGludGVuZGVkIHRvCitiZSByZWxpYWJsZSwgcG9ydGFibGUsIGluZHVzdHJpYWwtc3RyZW5ndGggY29kZS4gIFdlIGRvIG5vdCBjbGFpbSB0byBoYXZlCithY2hpZXZlZCB0aGF0IGdvYWwgaW4gZXZlcnkgYXNwZWN0IG9mIHRoZSBzb2Z0d2FyZSwgYnV0IHdlIHN0cml2ZSBmb3IgaXQuCisKK1dlIHdlbGNvbWUgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIGEgY29tcG9uZW50IG9mIGNvbW1lcmNpYWwgcHJvZHVjdHMuCitObyByb3lhbHR5IGlzIHJlcXVpcmVkLCBidXQgd2UgZG8gYXNrIGZvciBhbiBhY2tub3dsZWRnZW1lbnQgaW4gcHJvZHVjdAorZG9jdW1lbnRhdGlvbiwgYXMgZGVzY3JpYmVkIHVuZGVyIExFR0FMIElTU1VFUy4KKworCitMRUdBTCBJU1NVRVMKKz09PT09PT09PT09PQorCitJbiBwbGFpbiBFbmdsaXNoOgorCisxLiBXZSBkb24ndCBwcm9taXNlIHRoYXQgdGhpcyBzb2Z0d2FyZSB3b3Jrcy4gIChCdXQgaWYgeW91IGZpbmQgYW55IGJ1Z3MsCisgICBwbGVhc2UgbGV0IHVzIGtub3chKQorMi4gWW91IGNhbiB1c2UgdGhpcyBzb2Z0d2FyZSBmb3Igd2hhdGV2ZXIgeW91IHdhbnQuICBZb3UgZG9uJ3QgaGF2ZSB0byBwYXkgdXMuCiszLiBZb3UgbWF5IG5vdCBwcmV0ZW5kIHRoYXQgeW91IHdyb3RlIHRoaXMgc29mdHdhcmUuICBJZiB5b3UgdXNlIGl0IGluIGEKKyAgIHByb2dyYW0sIHlvdSBtdXN0IGFja25vd2xlZGdlIHNvbWV3aGVyZSBpbiB5b3VyIGRvY3VtZW50YXRpb24gdGhhdAorICAgeW91J3ZlIHVzZWQgdGhlIElKRyBjb2RlLgorCitJbiBsZWdhbGVzZToKKworVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKK3dpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQgeW91LAoraXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgorCitUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgdG8gdGhlc2UKK2NvbmRpdGlvbnM6CisoMSkgSWYgYW55IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoaXMKK1JFQURNRSBmaWxlIG11c3QgYmUgaW5jbHVkZWQsIHdpdGggdGhpcyBjb3B5cmlnaHQgYW5kIG5vLXdhcnJhbnR5IG5vdGljZQordW5hbHRlcmVkOyBhbmQgYW55IGFkZGl0aW9ucywgZGVsZXRpb25zLCBvciBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBmaWxlcworbXVzdCBiZSBjbGVhcmx5IGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbi4KKygyKSBJZiBvbmx5IGV4ZWN1dGFibGUgY29kZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGUgYWNjb21wYW55aW5nCitkb2N1bWVudGF0aW9uIG11c3Qgc3RhdGUgdGhhdCAidGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mCit0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCIuCisoMykgUGVybWlzc2lvbiBmb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBvbmx5IGlmIHRoZSB1c2VyIGFjY2VwdHMKK2Z1bGwgcmVzcG9uc2liaWxpdHkgZm9yIGFueSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXM7IHRoZSBhdXRob3JzIGFjY2VwdAorTk8gTElBQklMSVRZIGZvciBkYW1hZ2VzIG9mIGFueSBraW5kLgorCitUaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRyBjb2RlLAorbm90IGp1c3QgdG8gdGhlIHVubW9kaWZpZWQgbGlicmFyeS4gIElmIHlvdSB1c2Ugb3VyIHdvcmssIHlvdSBvdWdodCB0bworYWNrbm93bGVkZ2UgdXMuCisKK1Blcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkgbmFtZQoraW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCitpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MKK3NvZnR3YXJlIi4KKworV2Ugc3BlY2lmaWNhbGx5IHBlcm1pdCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyB0aGUgYmFzaXMgb2YKK2NvbW1lcmNpYWwgcHJvZHVjdHMsIHByb3ZpZGVkIHRoYXQgYWxsIHdhcnJhbnR5IG9yIGxpYWJpbGl0eSBjbGFpbXMgYXJlCithc3N1bWVkIGJ5IHRoZSBwcm9kdWN0IHZlbmRvci4KKworCithbnNpMmtuci5jIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGJ5IHBlcm1pc3Npb24gb2YgTC4gUGV0ZXIgRGV1dHNjaCwKK3NvbGUgcHJvcHJpZXRvciBvZiBpdHMgY29weXJpZ2h0IGhvbGRlciwgQWxhZGRpbiBFbnRlcnByaXNlcyBvZiBNZW5sbyBQYXJrLCBDQS4KK2Fuc2kya25yLmMgaXMgTk9UIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgY29uZGl0aW9ucywgYnV0IGluc3RlYWQKK2J5IHRoZSB1c3VhbCBkaXN0cmlidXRpb24gdGVybXMgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgcHJpbmNpcGFsbHksCit0aGF0IHlvdSBtdXN0IGluY2x1ZGUgc291cmNlIGNvZGUgaWYgeW91IHJlZGlzdHJpYnV0ZSBpdC4gIChTZWUgdGhlIGZpbGUKK2Fuc2kya25yLmMgZm9yIGZ1bGwgZGV0YWlscy4pICBIb3dldmVyLCBzaW5jZSBhbnNpMmtuci5jIGlzIG5vdCBuZWVkZWQgYXMgcGFydAorb2YgYW55IHByb2dyYW0gZ2VuZXJhdGVkIGZyb20gdGhlIElKRyBjb2RlLCB0aGlzIGRvZXMgbm90IGxpbWl0IHlvdSBtb3JlIHRoYW4KK3RoZSBmb3JlZ29pbmcgcGFyYWdyYXBocyBkby4KKworVGhlIFVuaXggY29uZmlndXJhdGlvbiBzY3JpcHQgImNvbmZpZ3VyZSIgd2FzIHByb2R1Y2VkIHdpdGggR05VIEF1dG9jb25mLgorSXQgaXMgY29weXJpZ2h0IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYnV0IGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLgorVGhlIHNhbWUgaG9sZHMgZm9yIGl0cyBzdXBwb3J0aW5nIHNjcmlwdHMgKGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwKK2x0Y29uZmlnLCBsdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0CitieSBNLkkuVC4gYnV0IGlzIGFsc28gZnJlZWx5IGRpc3RyaWJ1dGFibGUuCisKK0l0IGFwcGVhcnMgdGhhdCB0aGUgYXJpdGhtZXRpYyBjb2Rpbmcgb3B0aW9uIG9mIHRoZSBKUEVHIHNwZWMgaXMgY292ZXJlZCBieQorcGF0ZW50cyBvd25lZCBieSBJQk0sIEFUJlQsIGFuZCBNaXRzdWJpc2hpLiAgSGVuY2UgYXJpdGhtZXRpYyBjb2RpbmcgY2Fubm90CitsZWdhbGx5IGJlIHVzZWQgd2l0aG91dCBvYnRhaW5pbmcgb25lIG9yIG1vcmUgbGljZW5zZXMuICBGb3IgdGhpcyByZWFzb24sCitzdXBwb3J0IGZvciBhcml0aG1ldGljIGNvZGluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGZyZWUgSlBFRyBzb2Z0d2FyZS4KKyhTaW5jZSBhcml0aG1ldGljIGNvZGluZyBwcm92aWRlcyBvbmx5IGEgbWFyZ2luYWwgZ2FpbiBvdmVyIHRoZSB1bnBhdGVudGVkCitIdWZmbWFuIG1vZGUsIGl0IGlzIHVubGlrZWx5IHRoYXQgdmVyeSBtYW55IGltcGxlbWVudGF0aW9ucyB3aWxsIHN1cHBvcnQgaXQuKQorU28gZmFyIGFzIHdlIGFyZSBhd2FyZSwgdGhlcmUgYXJlIG5vIHBhdGVudCByZXN0cmljdGlvbnMgb24gdGhlIHJlbWFpbmluZworY29kZS4KKworVGhlIElKRyBkaXN0cmlidXRpb24gZm9ybWVybHkgaW5jbHVkZWQgY29kZSB0byByZWFkIGFuZCB3cml0ZSBHSUYgZmlsZXMuCitUbyBhdm9pZCBlbnRhbmdsZW1lbnQgd2l0aCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIEdJRiByZWFkaW5nIHN1cHBvcnQgaGFzCitiZWVuIHJlbW92ZWQgYWx0b2dldGhlciwgYW5kIHRoZSBHSUYgd3JpdGVyIGhhcyBiZWVuIHNpbXBsaWZpZWQgdG8gcHJvZHVjZQorInVuY29tcHJlc3NlZCBHSUZzIi4gIFRoaXMgdGVjaG5pcXVlIGRvZXMgbm90IHVzZSB0aGUgTFpXIGFsZ29yaXRobTsgdGhlCityZXN1bHRpbmcgR0lGIGZpbGVzIGFyZSBsYXJnZXIgdGhhbiB1c3VhbCwgYnV0IGFyZSByZWFkYWJsZSBieSBhbGwgc3RhbmRhcmQKK0dJRiBkZWNvZGVycy4KKworV2UgYXJlIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKKyAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuICBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgorCisKK1JFRkVSRU5DRVMKKz09PT09PT09PT0KKworV2UgaGlnaGx5IHJlY29tbWVuZCByZWFkaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlZmVyZW5jZXMgYmVmb3JlIHRyeWluZyB0bwordW5kZXJzdGFuZCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBzb2Z0d2FyZS4KKworVGhlIGJlc3Qgc2hvcnQgdGVjaG5pY2FsIGludHJvZHVjdGlvbiB0byB0aGUgSlBFRyBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMKKwlXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCisJQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCBuby4gNCksIHBwLiAzMC00NC4KKyhBZGphY2VudCBhcnRpY2xlcyBpbiB0aGF0IGlzc3VlIGRpc2N1c3MgTVBFRyBtb3Rpb24gcGljdHVyZSBjb21wcmVzc2lvbiwKK2FwcGxpY2F0aW9ucyBvZiBKUEVHLCBhbmQgcmVsYXRlZCB0b3BpY3MuKSAgSWYgeW91IGRvbid0IGhhdmUgdGhlIENBQ00gaXNzdWUKK2hhbmR5LCBhIFBvc3RTY3JpcHQgZmlsZSBjb250YWluaW5nIGEgcmV2aXNlZCB2ZXJzaW9uIG9mIFdhbGxhY2UncyBhcnRpY2xlIGlzCithdmFpbGFibGUgYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL3dhbGxhY2UucHMuZ3ouICBUaGUgZmlsZSAoYWN0dWFsbHkKK2EgcHJlcHJpbnQgZm9yIGFuIGFydGljbGUgdGhhdCBhcHBlYXJlZCBpbiBJRUVFIFRyYW5zLiBDb25zdW1lciBFbGVjdHJvbmljcykKK29taXRzIHRoZSBzYW1wbGUgaW1hZ2VzIHRoYXQgYXBwZWFyZWQgaW4gQ0FDTSwgYnV0IGl0IGluY2x1ZGVzIGNvcnJlY3Rpb25zCithbmQgc29tZSBhZGRlZCBtYXRlcmlhbC4gIE5vdGU6IHRoZSBXYWxsYWNlIGFydGljbGUgaXMgY29weXJpZ2h0IEFDTSBhbmQgSUVFRSwKK2FuZCBpdCBtYXkgbm90IGJlIHVzZWQgZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMuCisKK0Egc29tZXdoYXQgbGVzcyB0ZWNobmljYWwsIG1vcmUgbGVpc3VyZWx5IGludHJvZHVjdGlvbiB0byBKUEVHIGNhbiBiZSBmb3VuZCBpbgorIlRoZSBEYXRhIENvbXByZXNzaW9uIEJvb2siIGJ5IE1hcmsgTmVsc29uIGFuZCBKZWFuLWxvdXAgR2FpbGx5LCBwdWJsaXNoZWQgYnkKK00mVCBCb29rcyAoTmV3IFlvcmspLCAybmQgZWQuIDE5OTYsIElTQk4gMS01NTg1MS00MzQtMS4gIFRoaXMgYm9vayBwcm92aWRlcworZ29vZCBleHBsYW5hdGlvbnMgYW5kIGV4YW1wbGUgQyBjb2RlIGZvciBhIG11bHRpdHVkZSBvZiBjb21wcmVzc2lvbiBtZXRob2RzCitpbmNsdWRpbmcgSlBFRy4gIEl0IGlzIGFuIGV4Y2VsbGVudCBzb3VyY2UgaWYgeW91IGFyZSBjb21mb3J0YWJsZSByZWFkaW5nIEMKK2NvZGUgYnV0IGRvbid0IGtub3cgbXVjaCBhYm91dCBkYXRhIGNvbXByZXNzaW9uIGluIGdlbmVyYWwuICBUaGUgYm9vaydzIEpQRUcKK3NhbXBsZSBjb2RlIGlzIGZhciBmcm9tIGluZHVzdHJpYWwtc3RyZW5ndGgsIGJ1dCB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbG9vaworYXQgYSBmdWxsIGltcGxlbWVudGF0aW9uLCB5b3UndmUgZ290IG9uZSBoZXJlLi4uCisKK1RoZSBiZXN0IGZ1bGwgZGVzY3JpcHRpb24gb2YgSlBFRyBpcyB0aGUgdGV4dGJvb2sgIkpQRUcgU3RpbGwgSW1hZ2UgRGF0YQorQ29tcHJlc3Npb24gU3RhbmRhcmQiIGJ5IFdpbGxpYW0gQi4gUGVubmViYWtlciBhbmQgSm9hbiBMLiBNaXRjaGVsbCwgcHVibGlzaGVkCitieSBWYW4gTm9zdHJhbmQgUmVpbmhvbGQsIDE5OTMsIElTQk4gMC00NDItMDEyNzItMS4gIFByaWNlIFVTJDU5Ljk1LCA2MzggcHAuCitUaGUgYm9vayBpbmNsdWRlcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgSVNPIEpQRUcgc3RhbmRhcmRzIChESVMgMTA5MTgtMQorYW5kIGRyYWZ0IERJUyAxMDkxOC0yKS4gIFRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbXBsZXRlIGV4cG9zaXRpb24gb2YgSlBFRworaW4gZXhpc3RlbmNlLCBhbmQgd2UgaGlnaGx5IHJlY29tbWVuZCBpdC4KKworVGhlIEpQRUcgc3RhbmRhcmQgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUgZWxlY3Ryb25pY2FsbHk7IHlvdSBtdXN0IG9yZGVyIGEKK3BhcGVyIGNvcHkgdGhyb3VnaCBJU08gb3IgSVRVLiAgKFVubGVzcyB5b3UgZmVlbCBhIG5lZWQgdG8gb3duIGEgY2VydGlmaWVkCitvZmZpY2lhbCBjb3B5LCB3ZSByZWNvbW1lbmQgYnV5aW5nIHRoZSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbCBib29rIGluc3RlYWQ7CitpdCdzIG11Y2ggY2hlYXBlciBhbmQgaW5jbHVkZXMgYSBncmVhdCBkZWFsIG9mIHVzZWZ1bCBleHBsYW5hdG9yeSBtYXRlcmlhbC4pCitJbiB0aGUgVVNBLCBjb3BpZXMgb2YgdGhlIHN0YW5kYXJkIG1heSBiZSBvcmRlcmVkIGZyb20gQU5TSSBTYWxlcyBhdCAoMjEyKQorNjQyLTQ5MDAsIG9yIGZyb20gR2xvYmFsIEVuZ2luZWVyaW5nIERvY3VtZW50cyBhdCAoODAwKSA4NTQtNzE3OS4gIChBTlNJCitkb2Vzbid0IHRha2UgY3JlZGl0IGNhcmQgb3JkZXJzLCBidXQgR2xvYmFsIGRvZXMuKSAgSXQncyBub3QgY2hlYXA6IGFzIG9mCisxOTkyLCBBTlNJIHdhcyBjaGFyZ2luZyAkOTUgZm9yIFBhcnQgMSBhbmQgJDQ3IGZvciBQYXJ0IDIsIHBsdXMgNyUKK3NoaXBwaW5nL2hhbmRsaW5nLiAgVGhlIHN0YW5kYXJkIGlzIGRpdmlkZWQgaW50byB0d28gcGFydHMsIFBhcnQgMSBiZWluZyB0aGUKK2FjdHVhbCBzcGVjaWZpY2F0aW9uLCB3aGlsZSBQYXJ0IDIgY292ZXJzIGNvbXBsaWFuY2UgdGVzdGluZyBtZXRob2RzLiAgUGFydCAxCitpcyB0aXRsZWQgIkRpZ2l0YWwgQ29tcHJlc3Npb24gYW5kIENvZGluZyBvZiBDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLAorUGFydCAxOiBSZXF1aXJlbWVudHMgYW5kIGd1aWRlbGluZXMiIGFuZCBoYXMgZG9jdW1lbnQgbnVtYmVycyBJU08vSUVDIElTCisxMDkxOC0xLCBJVFUtVCBULjgxLiAgUGFydCAyIGlzIHRpdGxlZCAiRGlnaXRhbCBDb21wcmVzc2lvbiBhbmQgQ29kaW5nIG9mCitDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLCBQYXJ0IDI6IENvbXBsaWFuY2UgdGVzdGluZyIgYW5kIGhhcyBkb2N1bWVudAorbnVtYmVycyBJU08vSUVDIElTIDEwOTE4LTIsIElUVS1UIFQuODMuCisKK1NvbWUgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgSlBFRyBzdGFuZGFyZCBhcmUgZGVmaW5lZCBpbiBKUEVHIFBhcnQgMywKK2EgbmV3ZXIgSVNPIHN0YW5kYXJkIG51bWJlcmVkIElTTy9JRUMgSVMgMTA5MTgtMyBhbmQgSVRVLVQgVC44NC4gIElKRworY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgYW55IFBhcnQgMyBleHRlbnNpb25zLgorCitUaGUgSlBFRyBzdGFuZGFyZCBkb2VzIG5vdCBzcGVjaWZ5IGFsbCBkZXRhaWxzIG9mIGFuIGludGVyY2hhbmdlYWJsZSBmaWxlCitmb3JtYXQuICBGb3IgdGhlIG9taXR0ZWQgZGV0YWlscyB3ZSBmb2xsb3cgdGhlICJKRklGIiBjb252ZW50aW9ucywgcmV2aXNpb24KKzEuMDIuICBBIGNvcHkgb2YgdGhlIEpGSUYgc3BlYyBpcyBhdmFpbGFibGUgZnJvbToKKwlMaXRlcmF0dXJlIERlcGFydG1lbnQKKwlDLUN1YmUgTWljcm9zeXN0ZW1zLCBJbmMuCisJMTc3OCBNY0NhcnRoeSBCbHZkLgorCU1pbHBpdGFzLCBDQSA5NTAzNQorCXBob25lICg0MDgpIDk0NC02MzAwLCAgZmF4ICg0MDgpIDk0NC02MzE0CitBIFBvc3RTY3JpcHQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBieSBGVFAgYXQKK2Z0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy9qZmlmLnBzLmd6LiAgVGhlcmUgaXMgYWxzbyBhIHBsYWluIHRleHQKK3ZlcnNpb24gYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pmaWYudHh0Lmd6LCBidXQgaXQgaXMgbWlzc2luZwordGhlIGZpZ3VyZXMuCisKK1RoZSBUSUZGIDYuMCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBGVFAgZnJvbQorZnRwOi8vZnRwLnNnaS5jb20vZ3JhcGhpY3MvdGlmZi9USUZGNi5wcy5nei4gIFRoZSBKUEVHIGluY29ycG9yYXRpb24gc2NoZW1lCitmb3VuZCBpbiB0aGUgVElGRiA2LjAgc3BlYyBvZiAzLUp1bmUtOTIgaGFzIGEgbnVtYmVyIG9mIHNlcmlvdXMgcHJvYmxlbXMuCitJSkcgZG9lcyBub3QgcmVjb21tZW5kIHVzZSBvZiB0aGUgVElGRiA2LjAgZGVzaWduIChUSUZGIENvbXByZXNzaW9uIHRhZyA2KS4KK0luc3RlYWQsIHdlIHJlY29tbWVuZCB0aGUgSlBFRyBkZXNpZ24gcHJvcG9zZWQgYnkgVElGRiBUZWNobmljYWwgTm90ZSAjMgorKENvbXByZXNzaW9uIHRhZyA3KS4gIENvcGllcyBvZiB0aGlzIE5vdGUgY2FuIGJlIG9idGFpbmVkIGZyb20gZnRwLnNnaS5jb20gb3IKK2Zyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnLy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIG5leHQgcmV2aXNpb24KK29mIHRoZSBUSUZGIHNwZWMgd2lsbCByZXBsYWNlIHRoZSA2LjAgSlBFRyBkZXNpZ24gd2l0aCB0aGUgTm90ZSdzIGRlc2lnbi4KK0FsdGhvdWdoIElKRydzIG93biBjb2RlIGRvZXMgbm90IHN1cHBvcnQgVElGRi9KUEVHLCB0aGUgZnJlZSBsaWJ0aWZmIGxpYnJhcnkKK3VzZXMgb3VyIGxpYnJhcnkgdG8gaW1wbGVtZW50IFRJRkYvSlBFRyBwZXIgdGhlIE5vdGUuICBsaWJ0aWZmIGlzIGF2YWlsYWJsZQorZnJvbSBmdHA6Ly9mdHAuc2dpLmNvbS9ncmFwaGljcy90aWZmLy4KKworCitBUkNISVZFIExPQ0FUSU9OUworPT09PT09PT09PT09PT09PT0KKworVGhlICJvZmZpY2lhbCIgYXJjaGl2ZSBzaXRlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGZ0cC51dS5uZXQgKEludGVybmV0CithZGRyZXNzIDE5Mi40OC45Ni45KS4gIFRoZSBtb3N0IHJlY2VudCByZWxlYXNlZCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQKK3RoZXJlIGluIGRpcmVjdG9yeSBncmFwaGljcy9qcGVnLiAgVGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24gd2lsbCBiZSBhcmNoaXZlZAorYXMgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pwZWdzcmMudjZiLnRhci5nei4gIElmIHlvdSBkb24ndCBoYXZlCitkaXJlY3QgSW50ZXJuZXQgYWNjZXNzLCBVVU5FVCdzIGFyY2hpdmVzIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgVVVDUDsgY29udGFjdAoraGVscEB1dW5ldC51dS5uZXQgZm9yIGluZm9ybWF0aW9uIG9uIHJldHJpZXZpbmcgZmlsZXMgdGhhdCB3YXkuCisKK051bWVyb3VzIEludGVybmV0IHNpdGVzIG1haW50YWluIGNvcGllcyBvZiB0aGUgVVVORVQgZmlsZXMuICBIb3dldmVyLCBvbmx5CitmdHAudXUubmV0IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IG9mZmljaWFsIHZlcnNpb24uCisKK1lvdSBjYW4gYWxzbyBvYnRhaW4gdGhpcyBzb2Z0d2FyZSBpbiBET1MtY29tcGF0aWJsZSAiemlwIiBhcmNoaXZlIGZvcm1hdCBmcm9tCit0aGUgU2ltVGVsIGFyY2hpdmVzIChmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L21zZG9zL2dyYXBoaWNzLyksIG9yCitvbiBDb21wdVNlcnZlIGluIHRoZSBHcmFwaGljcyBTdXBwb3J0IGZvcnVtIChHTyBDSVM6R1JBUEhTVVApLCBsaWJyYXJ5IDEyCisiSlBFRyBUb29scyIuICBBZ2FpbiwgdGhlc2UgdmVyc2lvbnMgbWF5IHNvbWV0aW1lcyBsYWcgYmVoaW5kIHRoZSBmdHAudXUubmV0CityZWxlYXNlLgorCitUaGUgSlBFRyBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zKSBhcnRpY2xlIGlzIGEgdXNlZnVsIHNvdXJjZSBvZgorZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBKUEVHLiAgSXQgaXMgdXBkYXRlZCBjb25zdGFudGx5IGFuZCB0aGVyZWZvcmUgaXMKK25vdCBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBGQVEgaXMgcG9zdGVkIGV2ZXJ5IHR3byB3ZWVrcyB0bworVXNlbmV0IG5ld3Nncm91cHMgY29tcC5ncmFwaGljcy5taXNjLCBuZXdzLmFuc3dlcnMsIGFuZCBvdGhlciBncm91cHMuCitJdCBpcyBhdmFpbGFibGUgb24gdGhlIFdvcmxkIFdpZGUgV2ViIGF0IGh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy9qcGVnLWZhcS8KK2FuZCBvdGhlciBuZXdzLmFuc3dlcnMgYXJjaGl2ZSBzaXRlcywgaW5jbHVkaW5nIHRoZSBvZmZpY2lhbCBuZXdzLmFuc3dlcnMKK2FyY2hpdmUgYXQgcnRmbS5taXQuZWR1OiBmdHA6Ly9ydGZtLm1pdC5lZHUvcHViL3VzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvLgorSWYgeW91IGRvbid0IGhhdmUgV2ViIG9yIEZUUCBhY2Nlc3MsIHNlbmQgZS1tYWlsIHRvIG1haWwtc2VydmVyQHJ0Zm0ubWl0LmVkdQord2l0aCBib2R5CisJc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQxCisJc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQyCisKKworUkVMQVRFRCBTT0ZUV0FSRQorPT09PT09PT09PT09PT09PQorCitOdW1lcm91cyB2aWV3aW5nIGFuZCBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMgbm93IHN1cHBvcnQgSlBFRy4gIChRdWl0ZSBhCitmZXcgb2YgdGhlbSB1c2UgdGhpcyBsaWJyYXJ5IHRvIGRvIHNvLikgIFRoZSBKUEVHIEZBUSBkZXNjcmliZWQgYWJvdmUgbGlzdHMKK3NvbWUgb2YgdGhlIG1vcmUgcG9wdWxhciBmcmVlIGFuZCBzaGFyZXdhcmUgdmlld2VycywgYW5kIHRlbGxzIHdoZXJlIHRvCitvYnRhaW4gdGhlbSBvbiBJbnRlcm5ldC4KKworSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgd2UgaGlnaGx5IHJlY29tbWVuZCBKZWYgUG9za2FuemVyJ3MgZnJlZQorUEJNUExVUyBzb2Z0d2FyZSwgd2hpY2ggcHJvdmlkZXMgbWFueSB1c2VmdWwgb3BlcmF0aW9ucyBvbiBQUE0tZm9ybWF0IGltYWdlCitmaWxlcy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBjb252ZXJ0IFBQTSBpbWFnZXMgdG8gYW5kIGZyb20gYSB3aWRlIHJhbmdlIG9mCitvdGhlciBmb3JtYXRzLCB0aHVzIG1ha2luZyBjanBlZy9kanBlZyBjb25zaWRlcmFibHkgbW9yZSB1c2VmdWwuICBUaGUgbGF0ZXN0Cit2ZXJzaW9uIGlzIGRpc3RyaWJ1dGVkIGJ5IHRoZSBOZXRQQk0gZ3JvdXAsIGFuZCBpcyBhdmFpbGFibGUgZnJvbSBudW1lcm91cworc2l0ZXMsIG5vdGFibHkgZnRwOi8vd3VhcmNoaXZlLnd1c3RsLmVkdS9ncmFwaGljcy9ncmFwaGljcy9wYWNrYWdlcy9OZXRQQk0vLgorVW5mb3J0dW5hdGVseSBQQk1QTFVTL05FVFBCTSBpcyBub3QgbmVhcmx5IGFzIHBvcnRhYmxlIGFzIHRoZSBJSkcgc29mdHdhcmUgaXM7Cit5b3UgYXJlIGxpa2VseSB0byBoYXZlIGRpZmZpY3VsdHkgbWFraW5nIGl0IHdvcmsgb24gYW55IG5vbi1Vbml4IG1hY2hpbmUuCisKK0EgZGlmZmVyZW50IGZyZWUgSlBFRyBpbXBsZW1lbnRhdGlvbiwgd3JpdHRlbiBieSB0aGUgUFZSRyBncm91cCBhdCBTdGFuZm9yZCwKK2lzIGF2YWlsYWJsZSBmcm9tIGZ0cDovL2hhdmVmdW4uc3RhbmZvcmQuZWR1L3B1Yi9qcGVnLy4gIFRoaXMgcHJvZ3JhbQoraXMgZGVzaWduZWQgZm9yIHJlc2VhcmNoIGFuZCBleHBlcmltZW50YXRpb24gcmF0aGVyIHRoYW4gcHJvZHVjdGlvbiB1c2U7CitpdCBpcyBzbG93ZXIsIGhhcmRlciB0byB1c2UsIGFuZCBsZXNzIHBvcnRhYmxlIHRoYW4gdGhlIElKRyBjb2RlLCBidXQgaXQKK2lzIGVhc2llciB0byByZWFkIGFuZCBtb2RpZnkuICBBbHNvLCB0aGUgUFZSRyBjb2RlIHN1cHBvcnRzIGxvc3NsZXNzIEpQRUcsCit3aGljaCB3ZSBkbyBub3QuICAoT24gdGhlIG90aGVyIGhhbmQsIGl0IGRvZXNuJ3QgZG8gcHJvZ3Jlc3NpdmUgSlBFRy4pCisKKworRklMRSBGT1JNQVQgV0FSUworPT09PT09PT09PT09PT09PQorCitTb21lIEpQRUcgcHJvZ3JhbXMgcHJvZHVjZSBmaWxlcyB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG91ciBsaWJyYXJ5LgorVGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgSVNPIEpQRUcgY29tbWl0dGVlIGZhaWxlZCB0byBzcGVjaWZ5IGEKK2NvbmNyZXRlIGZpbGUgZm9ybWF0LiAgU29tZSB2ZW5kb3JzICJmaWxsZWQgaW4gdGhlIGJsYW5rcyIgb24gdGhlaXIgb3duLAorY3JlYXRpbmcgcHJvcHJpZXRhcnkgZm9ybWF0cyB0aGF0IG5vIG9uZSBlbHNlIGNvdWxkIHJlYWQuICAoRm9yIGV4YW1wbGUsIG5vbmUKK29mIHRoZSBlYXJseSBjb21tZXJjaWFsIEpQRUcgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgTWFjaW50b3NoIHdlcmUgYWJsZSB0bworZXhjaGFuZ2UgY29tcHJlc3NlZCBmaWxlcy4pCisKK1RoZSBmaWxlIGZvcm1hdCB3ZSBoYXZlIGFkb3B0ZWQgaXMgY2FsbGVkIEpGSUYgKHNlZSBSRUZFUkVOQ0VTKS4gIFRoaXMgZm9ybWF0CitoYXMgYmVlbiBhZ3JlZWQgdG8gYnkgYSBudW1iZXIgb2YgbWFqb3IgY29tbWVyY2lhbCBKUEVHIHZlbmRvcnMsIGFuZCBpdCBoYXMKK2JlY29tZSB0aGUgZGUgZmFjdG8gc3RhbmRhcmQuICBKRklGIGlzIGEgbWluaW1hbCBvciAibG93IGVuZCIgcmVwcmVzZW50YXRpb24uCitXZSByZWNvbW1lbmQgdGhlIHVzZSBvZiBUSUZGL0pQRUcgKFRJRkYgcmV2aXNpb24gNi4wIGFzIG1vZGlmaWVkIGJ5IFRJRkYKK1RlY2huaWNhbCBOb3RlICMyKSBmb3IgImhpZ2ggZW5kIiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIHJlY29yZCBhIGxvdCBvZgorYWRkaXRpb25hbCBkYXRhIGFib3V0IGFuIGltYWdlLiAgVElGRi9KUEVHIGlzIGZhaXJseSBuZXcgYW5kIG5vdCB5ZXQgd2lkZWx5CitzdXBwb3J0ZWQsIHVuZm9ydHVuYXRlbHkuCisKK1RoZSB1cGNvbWluZyBKUEVHIFBhcnQgMyBzdGFuZGFyZCBkZWZpbmVzIGEgZmlsZSBmb3JtYXQgY2FsbGVkIFNQSUZGLgorU1BJRkYgaXMgaW50ZXJvcGVyYWJsZSB3aXRoIEpGSUYsIGluIHRoZSBzZW5zZSB0aGF0IG1vc3QgSkZJRiBkZWNvZGVycyBzaG91bGQKK2JlIGFibGUgdG8gcmVhZCB0aGUgbW9zdCBjb21tb24gdmFyaWFudCBvZiBTUElGRi4gIFNQSUZGIGhhcyBzb21lIHRlY2huaWNhbAorYWR2YW50YWdlcyBvdmVyIEpGSUYsIGJ1dCBpdHMgbWFqb3IgY2xhaW0gdG8gZmFtZSBpcyBzaW1wbHkgdGhhdCBpdCBpcyBhbgorb2ZmaWNpYWwgc3RhbmRhcmQgcmF0aGVyIHRoYW4gYW4gaW5mb3JtYWwgb25lLiAgQXQgdGhpcyBwb2ludCBpdCBpcyB1bmNsZWFyCit3aGV0aGVyIFNQSUZGIHdpbGwgc3VwZXJzZWRlIEpGSUYgb3Igd2hldGhlciBKRklGIHdpbGwgcmVtYWluIHRoZSBkZS1mYWN0bworc3RhbmRhcmQuICBJSkcgaW50ZW5kcyB0byBzdXBwb3J0IFNQSUZGIG9uY2UgdGhlIHN0YW5kYXJkIGlzIGZyb3plbiwgYnV0IHdlCitoYXZlIG5vdCBkZWNpZGVkIHdoZXRoZXIgaXQgc2hvdWxkIGJlY29tZSBvdXIgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IG9yIG5vdC4KKyhJbiBhbnkgY2FzZSwgb3VyIGRlY29kZXIgd2lsbCByZW1haW4gY2FwYWJsZSBvZiByZWFkaW5nIEpGSUYgaW5kZWZpbml0ZWx5LikKKworVmFyaW91cyBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdHMgaW5jb3Jwb3JhdGluZyBKUEVHIGNvbXByZXNzaW9uIGFsc28gZXhpc3QuCitXZSBoYXZlIGxpdHRsZSBvciBubyBzeW1wYXRoeSBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGVzZSBmb3JtYXRzLiAgSW5kZWVkLAorb25lIG9mIHRoZSBvcmlnaW5hbCByZWFzb25zIGZvciBkZXZlbG9waW5nIHRoaXMgZnJlZSBzb2Z0d2FyZSB3YXMgdG8gaGVscAorZm9yY2UgY29udmVyZ2VuY2Ugb24gY29tbW9uLCBvcGVuIGZvcm1hdCBzdGFuZGFyZHMgZm9yIEpQRUcgZmlsZXMuICBEb24ndAordXNlIGEgcHJvcHJpZXRhcnkgZmlsZSBmb3JtYXQhCisKKworVE8gRE8KKz09PT09CisKK1RoZSBtYWpvciB0aHJ1c3QgZm9yIHY3IHdpbGwgcHJvYmFibHkgYmUgaW1wcm92ZW1lbnQgb2YgdmlzdWFsIHF1YWxpdHkuCitUaGUgY3VycmVudCBtZXRob2QgZm9yIHNjYWxpbmcgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgaXMga25vd24gbm90IHRvIGJlCit2ZXJ5IGdvb2QgYXQgbG93IFEgdmFsdWVzLiAgV2UgYWxzbyBpbnRlbmQgdG8gaW52ZXN0aWdhdGUgYmxvY2sgYm91bmRhcnkKK3Ntb290aGluZywgInBvb3IgbWFuJ3MgdmFyaWFibGUgcXVhbnRpemF0aW9uIiwgYW5kIG90aGVyIG1lYW5zIG9mIGltcHJvdmluZworcXVhbGl0eS12cy1maWxlLXNpemUgcGVyZm9ybWFuY2Ugd2l0aG91dCBzYWNyaWZpY2luZyBjb21wYXRpYmlsaXR5LgorCitJbiBmdXR1cmUgdmVyc2lvbnMsIHdlIGFyZSBjb25zaWRlcmluZyBzdXBwb3J0aW5nIHNvbWUgb2YgdGhlIHVwY29taW5nIEpQRUcKK1BhcnQgMyBleHRlbnNpb25zIC0tLSBwcmluY2lwYWxseSwgdmFyaWFibGUgcXVhbnRpemF0aW9uIGFuZCB0aGUgU1BJRkYgZmlsZQorZm9ybWF0LgorCitBcyBhbHdheXMsIHNwZWVkaW5nIHRoaW5ncyB1cCBpcyBvZiBncmVhdCBpbnRlcmVzdC4KKworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIG9mZmVycyBvZiBoZWxwLCBldGMuIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCmRpZmYgLS1naXQgYS9qcGVnL2Fuc2kya25yLjEgYi9qcGVnL2Fuc2kya25yLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllZTVhNgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvYW5zaTJrbnIuMQpAQCAtMCwwICsxLDM2IEBACisuVEggQU5TSTJLTlIgMSAiMTkgSmFuIDE5OTYiCisuU0ggTkFNRQorYW5zaTJrbnIgXC0gY29udmVydCBBTlNJIEMgdG8gS2VybmlnaGFuICYgUml0Y2hpZSBDCisuU0ggU1lOT1BTSVMKKy5JIGFuc2kya25yCitbLS12YXJhcmdzXSBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV0KKy5TSCBERVNDUklQVElPTgorSWYgbm8gb3V0cHV0X2ZpbGUgaXMgc3VwcGxpZWQsIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKy5icgorVGhlcmUgYXJlIG5vIGVycm9yIG1lc3NhZ2VzLgorLnNwCisuSSBhbnNpMmtucgorcmVjb2duaXplcyBmdW5jdGlvbiBkZWZpbml0aW9ucyBieSBzZWVpbmcgYSBub24ta2V5d29yZCBpZGVudGlmaWVyIGF0IHRoZSBsZWZ0CittYXJnaW4sIGZvbGxvd2VkIGJ5IGEgbGVmdCBwYXJlbnRoZXNpcywgd2l0aCBhIHJpZ2h0IHBhcmVudGhlc2lzIGFzIHRoZSBsYXN0CitjaGFyYWN0ZXIgb24gdGhlIGxpbmUsIGFuZCB3aXRoIGEgbGVmdCBicmFjZSBhcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlCitmb2xsb3dpbmcgbGluZSAoaWdub3JpbmcgcG9zc2libGUgaW50ZXJ2ZW5pbmcgY29tbWVudHMpLiAgSXQgd2lsbCByZWNvZ25pemUgYQorbXVsdGktbGluZSBoZWFkZXIgcHJvdmlkZWQgdGhhdCBubyBpbnRlcnZlbmluZyBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQKK2JyYWNlIG9yIGEgc2VtaWNvbG9uLiAgVGhlc2UgYWxnb3JpdGhtcyBpZ25vcmUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMsIGV4Y2VwdAordGhhdCB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGluZS4KKy5zcAorVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHdpbGwgY29uZnVzZSBpdDoKKy5icgorICAgICAtIEFueSBvdGhlciBjb25zdHJ1Y3QgdGhhdCBzdGFydHMgYXQgdGhlIGxlZnQgbWFyZ2luIGFuZCBmb2xsb3dzIHRoZQorYWJvdmUgc3ludGF4IChzdWNoIGFzIGEgbWFjcm8gb3IgZnVuY3Rpb24gY2FsbCkuCisuYnIKKyAgICAgLSBTb21lIG1hY3JvcyB0aGF0IHRpbmtlciB3aXRoIHRoZSBzeW50YXggb2YgdGhlIGZ1bmN0aW9uIGhlYWRlci4KKy5zcAorVGhlIC0tdmFyYXJncyBzd2l0Y2ggaXMgb2Jzb2xldGUsIGFuZCBpcyByZWNvZ25pemVkIG9ubHkgZm9yCitiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIFRoZSBwcmVzZW50IHZlcnNpb24gb2YKKy5JIGFuc2kya25yCit3aWxsIGFsd2F5cyBhdHRlbXB0IHRvIGNvbnZlcnQgYSAuLi4gYXJndW1lbnQgdG8gdmFfYWxpc3QgYW5kIHZhX2RjbC4KKy5TSCBBVVRIT1IKK0wuIFBldGVyIERldXRzY2ggPGdob3N0QGFsYWRkaW4uY29tPiB3cm90ZSB0aGUgb3JpZ2luYWwgYW5zaTJrbnIgYW5kCitjb250aW51ZXMgdG8gbWFpbnRhaW4gdGhlIGN1cnJlbnQgdmVyc2lvbjsgbW9zdCBvZiB0aGUgY29kZSBpbiB0aGUgY3VycmVudAordmVyc2lvbiBpcyBoaXMgd29yay4gIGFuc2kya25yIGFsc28gaW5jbHVkZXMgY29udHJpYnV0aW9ucyBieSBGcmFuY29pcworUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4gYW5kIEppbSBBdmVyYSA8amltYUBuZXRjb20uY29tPi4KZGlmZiAtLWdpdCBhL2pwZWcvYW5zaTJrbnIuYyBiL2pwZWcvYW5zaTJrbnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA1ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9hbnNpMmtuci5jCkBAIC0wLDAgKzEsNjkzIEBACisvKiBhbnNpMmtuci5jICovCisvKiBDb252ZXJ0IEFOU0kgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBLJlIgKCJ0cmFkaXRpb25hbCBDIikgc3ludGF4ICovCisKKy8qCithbnNpMmtuciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yIGFjY2VwdHMgcmVzcG9uc2liaWxpdHkgdG8gYW55b25lIGZvciB0aGUKK2NvbnNlcXVlbmNlcyBvZiB1c2luZyBpdCBvciBmb3Igd2hldGhlciBpdCBzZXJ2ZXMgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvcgord29ya3MgYXQgYWxsLCB1bmxlc3MgaGUgc2F5cyBzbyBpbiB3cml0aW5nLiAgUmVmZXIgdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSAodGhlICJHUEwiKSBmb3IgZnVsbCBkZXRhaWxzLgorCitFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgYW5zaTJrbnIsCitidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlIEdQTC4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UKK2lzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCBhbnNpMmtuciBzbyB5b3UgY2FuIGtub3cKK3lvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlIGluIGEgZmlsZSBuYW1lZCBDT1BZTEVGVC4KK1tJbiB0aGUgSUpHIGRpc3RyaWJ1dGlvbiwgdGhlIEdQTCBhcHBlYXJzIGJlbG93LCBub3QgaW4gYSBzZXBhcmF0ZSBmaWxlLl0KK0Ftb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkCitvbiBhbGwgY29waWVzLgorCitXZSBleHBsaWNpdGx5IHN0YXRlIGhlcmUgd2hhdCB3ZSBiZWxpZXZlIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgR1BMOiBpZgordGhlIGFuc2kya25yIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgYXMgYSBzZXBhcmF0ZSBzZXQgb2Ygc291cmNlcyBhbmQgYQorc2VwYXJhdGUgZXhlY3V0YWJsZSBmaWxlIHdoaWNoIGFyZSBhZ2dyZWdhdGVkIG9uIGEgc3RvcmFnZSBtZWRpdW0gdG9nZXRoZXIKK3dpdGggYW5vdGhlciBwcm9ncmFtLCB0aGlzIGluIGl0c2VsZiBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgcHJvZ3JhbSB1bmRlcgordGhlIEdQTCwgbm9yIGRvZXMgdGhlIG1lcmUgZmFjdCB0aGF0IHN1Y2ggYSBwcm9ncmFtIG9yIHRoZSBwcm9jZWR1cmVzIGZvcgorY29uc3RydWN0aW5nIGl0IGludm9rZSB0aGUgYW5zaTJrbnIgZXhlY3V0YWJsZSBicmluZyBhbnkgb3RoZXIgcGFydCBvZiB0aGUKK3Byb2dyYW0gdW5kZXIgdGhlIEdQTC4KKyovCisKKy8qCistLS0tLS0tLS0tIEhlcmUgaXMgdGhlIEdOVSBHUEwgZmlsZSBDT1BZTEVGVCwgcmVmZXJyZWQgdG8gYWJvdmUgLS0tLS0tLS0tLQorLS0tLS0gVGhlc2UgdGVybXMgZG8gTk9UIGFwcGx5IHRvIHRoZSBKUEVHIHNvZnR3YXJlIGl0c2VsZjsgc2VlIFJFQURNRSAtLS0tLS0KKworCQkgICAgR0hPU1RTQ1JJUFQgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgKENsYXJpZmllZCAxMSBGZWIgMTk4OCkKKworIENvcHlyaWdodCAoQykgMTk4OCBSaWNoYXJkIE0uIFN0YWxsbWFuCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMKKyBsaWNlbnNlLCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgd29yZGluZworIHRvIG1ha2UgdGhlIHRlcm1zIGZvciBvdGhlciBwcm9ncmFtcy4KKworICBUaGUgbGljZW5zZSBhZ3JlZW1lbnRzIG9mIG1vc3Qgc29mdHdhcmUgY29tcGFuaWVzIGtlZXAgeW91IGF0IHRoZQorbWVyY3kgb2YgdGhvc2UgY29tcGFuaWVzLiAgQnkgY29udHJhc3QsIG91ciBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGlzCitpbnRlbmRlZCB0byBnaXZlIGV2ZXJ5b25lIHRoZSByaWdodCB0byBzaGFyZSBHaG9zdHNjcmlwdC4gIFRvIG1ha2Ugc3VyZQordGhhdCB5b3UgZ2V0IHRoZSByaWdodHMgd2Ugd2FudCB5b3UgdG8gaGF2ZSwgd2UgbmVlZCB0byBtYWtlCityZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91Cit0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIEhlbmNlIHRoaXMgbGljZW5zZSBhZ3JlZW1lbnQuCisKKyAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCithd2F5IGNvcGllcyBvZiBHaG9zdHNjcmlwdCwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBlbHNlIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIEdob3N0c2NyaXB0IG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBtYWtlIHN1cmUgdGhhdCBldmVyeW9uZSBoYXMgc3VjaCByaWdodHMsIHdlIGhhdmUgdG8gZm9yYmlkIHlvdSB0bworZGVwcml2ZSBhbnlvbmUgZWxzZSBvZiB0aGVzZSByaWdodHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUKK2NvcGllcyBvZiBHaG9zdHNjcmlwdCwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy4KKworICBBbHNvLCBmb3Igb3VyIG93biBwcm90ZWN0aW9uLCB3ZSBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGV2ZXJ5b25lIGZpbmRzCitvdXQgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgR2hvc3RzY3JpcHQuICBJZiBHaG9zdHNjcmlwdCBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3Qgd2hhdCB3ZSBkaXN0cmlidXRlZCwgc28gdGhhdCBhbnkgcHJvYmxlbXMKK2ludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gb3VyIHJlcHV0YXRpb24uCisKKyAgVGhlcmVmb3JlIHdlIChSaWNoYXJkIE0uIFN0YWxsbWFuIGFuZCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLikgbWFrZSB0aGUgZm9sbG93aW5nIHRlcm1zIHdoaWNoIHNheSB3aGF0IHlvdSBtdXN0IGRvIHRvIGJlIGFsbG93ZWQKK3RvIGRpc3RyaWJ1dGUgb3IgY2hhbmdlIEdob3N0c2NyaXB0LgorCisKKwkJCUNPUFlJTkcgUE9MSUNJRVMKKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIEdob3N0c2NyaXB0IHNvdXJjZQorY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseQorYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYSB2YWxpZCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UKK25vdGljZSAiQ29weXJpZ2h0IChDKSAxOTg5IEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorRGlzdHJpYnV0ZWQgYnkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIiAob3Igd2l0aCB3aGF0ZXZlciB5ZWFyIGlzCithcHByb3ByaWF0ZSk7IGtlZXAgaW50YWN0IHRoZSBub3RpY2VzIG9uIGFsbCBmaWxlcyB0aGF0IHJlZmVyIHRvIHRoaXMKK0xpY2Vuc2UgQWdyZWVtZW50IGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlcgorcmVjaXBpZW50cyBvZiB0aGUgR2hvc3RzY3JpcHQgcHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudAorYWxvbmcgd2l0aCB0aGUgcHJvZ3JhbS4gIFlvdSBtYXkgY2hhcmdlIGEgZGlzdHJpYnV0aW9uIGZlZSBmb3IgdGhlCitwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIEdob3N0c2NyaXB0IG9yIGFueSBwb3J0aW9uIG9mCitpdCwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBvZgorUGFyYWdyYXBoIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gdGhlIGZvbGxvd2luZzoKKworICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCisgICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2U7IGFuZAorCisgICAgYikgY2F1c2UgdGhlIHdob2xlIG9mIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwKKyAgICB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgYSBkZXJpdmF0aXZlIG9mIEdob3N0c2NyaXB0CisgICAgb3IgYW55IHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgb24gdGVybXMgaWRlbnRpY2FsIHRvIHRob3NlIGNvbnRhaW5lZCBpbiB0aGlzIExpY2Vuc2UKKyAgICBBZ3JlZW1lbnQgKGV4Y2VwdCB0aGF0IHlvdSBtYXkgY2hvb3NlIHRvIGdyYW50IG1vcmUgZXh0ZW5zaXZlCisgICAgd2FycmFudHkgcHJvdGVjdGlvbiB0byBzb21lIG9yIGFsbCB0aGlyZCBwYXJ0aWVzLCBhdCB5b3VyIG9wdGlvbikuCisKKyAgICBjKSBZb3UgbWF5IGNoYXJnZSBhIGRpc3RyaWJ1dGlvbiBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YKKyAgICB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eQorICAgIHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCitNZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgdW5yZWxhdGVkIHByb2dyYW0gd2l0aCB0aGlzIHByb2dyYW0gKG9yIGl0cworZGVyaXZhdGl2ZSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcKK3RoZSBvdGhlciBwcm9ncmFtIHVuZGVyIHRoZSBzY29wZSBvZiB0aGVzZSB0ZXJtcy4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgR2hvc3RzY3JpcHQgKG9yIGEgcG9ydGlvbiBvciBkZXJpdmF0aXZlCitvZiBpdCwgdW5kZXIgUGFyYWdyYXBoIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUKK3Rlcm1zIG9mIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUKK2ZvbGxvd2luZzoKKworICAgIGEpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLAorCisgICAgYikgYWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHkgZnJlZSAoZXhjZXB0IGZvciBhIG5vbWluYWwKKyAgICBzaGlwcGluZyBjaGFyZ2UpIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICAgIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZTsgb3IsCisKKyAgICBjKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHdoZXJlIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSBhbG9uZS4pCisKK0ZvciBhbiBleGVjdXRhYmxlIGZpbGUsIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yCithbGwgbW9kdWxlcyBpdCBjb250YWluczsgYnV0LCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpdCBuZWVkIG5vdCBpbmNsdWRlCitzb3VyY2UgY29kZSBmb3IgbW9kdWxlcyB3aGljaCBhcmUgc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgYWNjb21wYW55IHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBmaWxlIHJ1bnMuCisKKyAgNC4gWW91IG1heSBub3QgY29weSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2ZlciBHaG9zdHNjcmlwdAorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIEdob3N0c2NyaXB0IGlzCit2b2lkIGFuZCB5b3VyIHJpZ2h0cyB0byB1c2UgdGhlIHByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIGFncmVlbWVudAorc2hhbGwgYmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZAorY29tcHV0ZXIgc29mdHdhcmUgcHJvZ3JhbXMgZnJvbSB5b3Ugd2l0aCB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgbm90CitoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwKK2NvbXBsaWFuY2UuCisKKyAgNS4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgR2hvc3RzY3JpcHQgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiBhdCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzkuICBXZSBoYXZlIG5vdAoreWV0IHdvcmtlZCBvdXQgYSBzaW1wbGUgcnVsZSB0aGF0IGNhbiBiZSBzdGF0ZWQgaGVyZSwgYnV0IHdlIHdpbGwgb2Z0ZW4KK3Blcm1pdCB0aGlzLiAgV2Ugd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlCitzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlCitzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZS4KKworWW91ciBjb21tZW50cyBhbmQgc3VnZ2VzdGlvbnMgYWJvdXQgb3VyIGxpY2Vuc2luZyBwb2xpY2llcyBhbmQgb3VyCitzb2Z0d2FyZSBhcmUgd2VsY29tZSEgIFBsZWFzZSBjb250YWN0IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIG9yIGNhbGwgKDYxNykgODc2LTMyOTYuCisKKwkJICAgICAgIE5PIFdBUlJBTlRZCisKKyAgQkVDQVVTRSBHSE9TVFNDUklQVCBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgV0UgUFJPVklERSBBQlNPTFVURUxZCitOTyBXQVJSQU5UWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBTVEFURSBMQVcuICBFWENFUFQKK1dIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HLCBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQywgUklDSEFSRAorTS4gU1RBTExNQU4sIEFMQURESU4gRU5URVJQUklTRVMsIEwuIFBFVEVSIERFVVRTQ0gsIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIEdIT1NUU0NSSVBUICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSCitFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUKK0VOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBHSE9TVFNDUklQVCBJUyBXSVRICitZT1UuICBTSE9VTEQgR0hPU1RTQ1JJUFQgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAorTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIFdJTEwgUklDSEFSRCBNLgorU1RBTExNQU4sIFRIRSBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4sIEwuIFBFVEVSIERFVVRTQ0gsIEFMQURESU4KK0VOVEVSUFJJU0VTLCBBTkQvT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORCBSRURJU1RSSUJVVEUKK0dIT1NUU0NSSVBUIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HCitBTlkgTE9TVCBQUk9GSVRTLCBMT1NUIE1PTklFUywgT1IgT1RIRVIgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRQorKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQKK0lOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUKK1BST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUykgR0hPU1RTQ1JJUFQsIEVWRU4gSUYgWU9VCitIQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLCBPUiBGT1IgQU5ZIENMQUlNCitCWSBBTlkgT1RIRVIgUEFSVFkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvZiBmaWxlIENPUFlMRUZUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyAqIFVzYWdlOgorCWFuc2kya25yIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXQorICogSWYgbm8gb3V0cHV0X2ZpbGUgaXMgc3VwcGxpZWQsIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKyAqIFRoZXJlIGFyZSBubyBlcnJvciBtZXNzYWdlcy4KKyAqCisgKiBhbnNpMmtuciByZWNvZ25pemVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJ5IHNlZWluZyBhIG5vbi1rZXl3b3JkCisgKiBpZGVudGlmaWVyIGF0IHRoZSBsZWZ0IG1hcmdpbiwgZm9sbG93ZWQgYnkgYSBsZWZ0IHBhcmVudGhlc2lzLAorICogd2l0aCBhIHJpZ2h0IHBhcmVudGhlc2lzIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGluZSwKKyAqIGFuZCB3aXRoIGEgbGVmdCBicmFjZSBhcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlIGZvbGxvd2luZyBsaW5lCisgKiAoaWdub3JpbmcgcG9zc2libGUgaW50ZXJ2ZW5pbmcgY29tbWVudHMpLgorICogSXQgd2lsbCByZWNvZ25pemUgYSBtdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nCisgKiBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQgYnJhY2Ugb3IgYSBzZW1pY29sb24uCisgKiBUaGVzZSBhbGdvcml0aG1zIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgZXhjZXB0IHRoYXQKKyAqIHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLgorICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHdpbGwgY29uZnVzZSBpdDoKKyAqCS0gQW55IG90aGVyIGNvbnN0cnVjdCB0aGF0IHN0YXJ0cyBhdCB0aGUgbGVmdCBtYXJnaW4gYW5kCisgKgkgICAgZm9sbG93cyB0aGUgYWJvdmUgc3ludGF4IChzdWNoIGFzIGEgbWFjcm8gb3IgZnVuY3Rpb24gY2FsbCkuCisgKgktIFNvbWUgbWFjcm9zIHRoYXQgdGlua2VyIHdpdGggdGhlIHN5bnRheCBvZiB0aGUgZnVuY3Rpb24gaGVhZGVyLgorICovCisKKy8qCisgKiBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgYW5zaTJrbnIgaXMgTC4gUGV0ZXIgRGV1dHNjaAorICogPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQorICogdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCWxwZCA5Ni0wMS0yMSBhZGRlZCBjb2RlIHRvIGNvcGUgd2l0aCBub3QgSEFWRV9DT05GSUdfSCBhbmQgd2l0aAorCQljb21waWxlcnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIHZvaWQsIGFzIHN1Z2dlc3RlZCBieQorCQlUb20gTGFuZQorCWxwZCA5Ni0wMS0xNSBjaGFuZ2VkIHRvIHJlcXVpcmUgdGhhdCB0aGUgZmlyc3Qgbm9uLWNvbW1lbnQgdG9rZW4KKwkJb24gdGhlIGxpbmUgZm9sbG93aW5nIGEgZnVuY3Rpb24gaGVhZGVyIGJlIGEgbGVmdCBicmFjZSwKKwkJdG8gcmVkdWNlIHNlbnNpdGl2aXR5IHRvIG1hY3JvcywgYXMgc3VnZ2VzdGVkIGJ5IFRvbSBMYW5lCisJCTx0Z2xAc3NzLnBnaC5wYS51cz4KKwlscGQgOTUtMDYtMjIgcmVtb3ZlZCAjaWZuZGVmcyB3aG9zZSBzb2xlIHB1cnBvc2Ugd2FzIHRvIGRlZmluZQorCQl1bmRlZmluZWQgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYXMgMDsgY2hhbmdlZCBhbGwgI2lmZGVmcworCQlmb3IgY29uZmlndXJhdGlvbiBzeW1ib2xzIHRvICNpZnMKKwlscGQgOTUtMDQtMDUgY2hhbmdlZCBjb3B5cmlnaHQgbm90aWNlIHRvIG1ha2UgaXQgY2xlYXIgdGhhdAorCQlpbmNsdWRpbmcgYW5zaTJrbnIgaW4gYSBwcm9ncmFtIGRvZXMgbm90IGJyaW5nIHRoZSBlbnRpcmUKKwkJcHJvZ3JhbSB1bmRlciB0aGUgR1BMCisJbHBkIDk0LTEyLTE4IGFkZGVkIGNvbmRpdGlvbmFscyBmb3Igc3lzdGVtcyB3aGVyZSBjdHlwZSBtYWNyb3MKKwkJZG9uJ3QgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgcHJvcGVybHksIHN1Z2dlc3RlZCBieQorCQlGcmFuY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPjsKKwkJcmVtb3ZlZCAtLXZhcmFyZ3Mgc3dpdGNoICh0aGlzIGlzIG5vdyB0aGUgZGVmYXVsdCkKKwlscGQgOTQtMTAtMTAgcmVtb3ZlZCBDT05GSUdfQlJPS0VUUyBjb25kaXRpb25hbAorCWxwZCA5NC0wNy0xNiBhZGRlZCBzb21lIGNvbmRpdGlvbmFscyB0byBoZWxwIEdOVSBgY29uZmlndXJlJywKKwkJc3VnZ2VzdGVkIGJ5IEZyYW5jb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+OworCQlwcm9wZXJseSBlcmFzZSBwcm90b3R5cGUgYXJncyBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzLAorCQljb250cmlidXRlZCBieSBKaW0gQXZlcmEgPGppbWFAbmV0Y29tLmNvbT47CisJCWNvcnJlY3QgZXJyb3IgaW4gd3JpdGVibGFua3MgKGl0IHNob3VsZG4ndCBlcmFzZSBFT0xzKQorCWxwZCA4OS14eC14eCBvcmlnaW5hbCB2ZXJzaW9uCisgKi8KKworLyogTW9zdCBvZiB0aGUgY29uZGl0aW9uYWxzIGhlcmUgYXJlIHRvIG1ha2UgYW5zaTJrbnIgd29yayB3aXRoICovCisvKiBvciB3aXRob3V0IHRoZSBHTlUgY29uZmlndXJlIG1hY2hpbmVyeS4gKi8KKworI2lmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmIEhBVkVfQ09ORklHX0gKKworLyoKKyAgIEZvciBwcm9wZXJseSBhdXRvY29uZmlndXJpbmcgYW5zaTJrbnIsIHVzZSBBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oKS4KKyAgIFRoaXMgd2lsbCBkZWZpbmUgSEFWRV9DT05GSUdfSCBhbmQgc28sIGFjdGl2YXRlIHRoZSBmb2xsb3dpbmcgbGluZXMuCisgKi8KKworIyBpZiBTVERDX0hFQURFUlMgfHwgSEFWRV9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgZW5kaWYKKworI2Vsc2UgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KKworLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBoYXJkIHdheSAqLworCisjIGlmZGVmIEJTRAorIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgorIyBlbHNlCisjICBpZmRlZiBWTVMKKyAgICBleHRlcm4gaW50IHN0cmxlbigpLCBzdHJuY21wKCk7CisjICBlbHNlCisjICAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KKworI2lmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCisvKgorICAgbWFsbG9jIGFuZCBmcmVlIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBzdGRsaWIuaCwKKyAgIGJ1dCBpZiB5b3UndmUgZ290IGEgSyZSIGNvbXBpbGVyLCB0aGV5IHByb2JhYmx5IGFyZW4ndC4KKyAqLworIyBpZmRlZiBNU0RPUworIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjIGVsc2UKKyMgIGlmZGVmIFZNUworICAgICBleHRlcm4gY2hhciAqbWFsbG9jKCk7CisgICAgIGV4dGVybiB2b2lkIGZyZWUoKTsKKyMgIGVsc2UKKyAgICAgZXh0ZXJuIGNoYXIgKm1hbGxvYygpOworICAgICBleHRlcm4gaW50IGZyZWUoKTsKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZgorCisvKgorICogVGhlIGN0eXBlIG1hY3JvcyBkb24ndCBhbHdheXMgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgY29ycmVjdGx5LgorICogQ29tcGVuc2F0ZSBmb3IgdGhpcyBoZXJlLgorICovCisjaWZkZWYgaXNhc2NpaQorIyAgdW5kZWYgSEFWRV9JU0FTQ0lJCQkvKiBqdXN0IGluIGNhc2UgKi8KKyMgIGRlZmluZSBIQVZFX0lTQVNDSUkgMQorI2Vsc2UKKyNlbmRpZgorI2lmIFNURENfSEVBREVSUyB8fCAhSEFWRV9JU0FTQ0lJCisjICBkZWZpbmUgaXNfYXNjaWkoYykgMQorI2Vsc2UKKyMgIGRlZmluZSBpc19hc2NpaShjKSBpc2FzY2lpKGMpCisjZW5kaWYKKworI2RlZmluZSBpc19zcGFjZShjKSAoaXNfYXNjaWkoYykgJiYgaXNzcGFjZShjKSkKKyNkZWZpbmUgaXNfYWxwaGEoYykgKGlzX2FzY2lpKGMpICYmIGlzYWxwaGEoYykpCisjZGVmaW5lIGlzX2FsbnVtKGMpIChpc19hc2NpaShjKSAmJiBpc2FsbnVtKGMpKQorCisvKiBTY2FubmluZyBtYWNyb3MgKi8KKyNkZWZpbmUgaXNpZGNoYXIoY2gpIChpc19hbG51bShjaCkgfHwgKGNoKSA9PSAnXycpCisjZGVmaW5lIGlzaWRmaXJzdGNoYXIoY2gpIChpc19hbHBoYShjaCkgfHwgKGNoKSA9PSAnXycpCisKKy8qIEZvcndhcmQgcmVmZXJlbmNlcyAqLworY2hhciAqc2tpcHNwYWNlKCk7CitpbnQgd3JpdGVibGFua3MoKTsKK2ludCB0ZXN0MSgpOworaW50IGNvbnZlcnQxKCk7CisKKy8qIFRoZSBtYWluIHByb2dyYW0gKi8KK2ludAorbWFpbihhcmdjLCBhcmd2KQorICAgIGludCBhcmdjOworICAgIGNoYXIgKmFyZ3ZbXTsKK3sJRklMRSAqaW4sICpvdXQ7CisjZGVmaW5lIGJ1ZnNpemUgNTAwMAkJCS8qIGFyYml0cmFyeSBzaXplICovCisJY2hhciAqYnVmOworCWNoYXIgKmxpbmU7CisJY2hhciAqbW9yZTsKKwkvKgorCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCBhbnNpMmtuciByZWNvZ25pemVkIGEgLS12YXJhcmdzIHN3aXRjaC4KKwkgKiBJZiB0aGlzIHN3aXRjaCB3YXMgc3VwcGxpZWQsIGFuc2kya25yIHdvdWxkIGF0dGVtcHQgdG8gY29udmVydAorCSAqIGEgLi4uIGFyZ3VtZW50IHRvIHZhX2FsaXN0IGFuZCB2YV9kY2w7IGlmIHRoaXMgc3dpdGNoIHdhcyBub3QKKwkgKiBzdXBwbGllZCwgYW5zaTJrbnIgd291bGQgc2ltcGx5IGRyb3AgYW55IHN1Y2ggYXJndW1lbnRzLgorCSAqIE5vdywgYW5zaTJrbnIgYWx3YXlzIGRvZXMgdGhpcyBjb252ZXJzaW9uLCBhbmQgd2Ugb25seQorCSAqIGNoZWNrIGZvciB0aGlzIHN3aXRjaCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlpbnQgY29udmVydF92YXJhcmdzID0gMTsKKworCWlmICggYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScgKQorCSAgewlpZiAoICFzdHJjbXAoYXJndlsxXSwgIi0tdmFyYXJncyIpICkKKwkJICB7CWNvbnZlcnRfdmFyYXJncyA9IDE7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCSAgfQorCQllbHNlCisJCSAgewlmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBzd2l0Y2g6ICVzXG4iLCBhcmd2WzFdKTsKKwkJCWV4aXQoMSk7CisJCSAgfQorCSAgfQorCXN3aXRjaCAoIGFyZ2MgKQorCSAgIHsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVzYWdlOiBhbnNpMmtuciBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV1cbiIpOworCQlleGl0KDApOworCWNhc2UgMjoKKwkJb3V0ID0gc3Rkb3V0OworCQlicmVhazsKKwljYXNlIDM6CisJCW91dCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7CisJCWlmICggb3V0ID09IE5VTEwgKQorCQkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOworCQkJZXhpdCgxKTsKKwkJICAgfQorCSAgIH0KKwlpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CisJaWYgKCBpbiA9PSBOVUxMICkKKwkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgYXJndlsxXSk7CisJCWV4aXQoMSk7CisJICAgfQorCWZwcmludGYob3V0LCAiI2xpbmUgMSBcIiVzXCJcbiIsIGFyZ3ZbMV0pOworCWJ1ZiA9IG1hbGxvYyhidWZzaXplKTsKKwlsaW5lID0gYnVmOworCXdoaWxlICggZmdldHMobGluZSwgKHVuc2lnbmVkKShidWYgKyBidWZzaXplIC0gbGluZSksIGluKSAhPSBOVUxMICkKKwkgICB7Cit0ZXN0OgkJbGluZSArPSBzdHJsZW4obGluZSk7CisJCXN3aXRjaCAoIHRlc3QxKGJ1ZikgKQorCQkgICB7CisJCWNhc2UgMjoJCQkvKiBhIGZ1bmN0aW9uIGhlYWRlciAqLworCQkJY29udmVydDEoYnVmLCBvdXQsIDEsIGNvbnZlcnRfdmFyYXJncyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgkJCS8qIGEgZnVuY3Rpb24gKi8KKwkJCS8qIENoZWNrIGZvciBhIHsgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUuICovCisJCQltb3JlID0gKytsaW5lOworZjoJCQlpZiAoIGxpbmUgPj0gYnVmICsgKGJ1ZnNpemUgLSAxKSApIC8qIG92ZXJmbG93IGNoZWNrICovCisJCQkgIGdvdG8gd2w7CisJCQlpZiAoIGZnZXRzKGxpbmUsICh1bnNpZ25lZCkoYnVmICsgYnVmc2l6ZSAtIGxpbmUpLCBpbikgPT0gTlVMTCApCisJCQkgIGdvdG8gd2w7CisJCQlzd2l0Y2ggKCAqc2tpcHNwYWNlKG1vcmUsIDEpICkKKwkJCSAgeworCQkJICBjYXNlICd7JzoKKwkJCSAgICAvKiBEZWZpbml0ZWx5IGEgZnVuY3Rpb24gaGVhZGVyLiAqLworCQkJICAgIGNvbnZlcnQxKGJ1Ziwgb3V0LCAwLCBjb252ZXJ0X3ZhcmFyZ3MpOworCQkJICAgIGZwdXRzKG1vcmUsIG91dCk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgMDoKKwkJCSAgICAvKiBUaGUgbmV4dCBsaW5lIHdhcyBibGFuayBvciBhIGNvbW1lbnQ6ICovCisJCQkgICAgLyoga2VlcCBzY2FubmluZyBmb3IgYSBub24tY29tbWVudC4gKi8KKwkJCSAgICBsaW5lICs9IHN0cmxlbihsaW5lKTsKKwkJCSAgICBnb3RvIGY7CisJCQkgIGRlZmF1bHQ6CisJCQkgICAgLyogYnVmIGlzbid0IGEgZnVuY3Rpb24gaGVhZGVyLCBidXQgKi8KKwkJCSAgICAvKiBtb3JlIG1pZ2h0IGJlLiAqLworCQkJICAgIGZwdXRzKGJ1Ziwgb3V0KTsKKwkJCSAgICBzdHJjcHkoYnVmLCBtb3JlKTsKKwkJCSAgICBsaW5lID0gYnVmOworCQkJICAgIGdvdG8gdGVzdDsKKwkJCSAgfQorCQkJYnJlYWs7CisJCWNhc2UgLTE6CQkvKiBtYXliZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiAqLworCQkJaWYgKCBsaW5lICE9IGJ1ZiArIChidWZzaXplIC0gMSkgKSAvKiBvdmVyZmxvdyBjaGVjayAqLworCQkJICBjb250aW51ZTsKKwkJCS8qIGZhbGxzIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoJCS8qIG5vdCBhIGZ1bmN0aW9uICovCit3bDoJCQlmcHV0cyhidWYsIG91dCk7CisJCQlicmVhazsKKwkJICAgfQorCQlsaW5lID0gYnVmOworCSAgIH0KKwlpZiAoIGxpbmUgIT0gYnVmICkKKwkgIGZwdXRzKGJ1Ziwgb3V0KTsKKwlmcmVlKGJ1Zik7CisJZmNsb3NlKG91dCk7CisJZmNsb3NlKGluKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2tpcCBvdmVyIHNwYWNlIGFuZCBjb21tZW50cywgaW4gZWl0aGVyIGRpcmVjdGlvbi4gKi8KK2NoYXIgKgorc2tpcHNwYWNlKHAsIGRpcikKKyAgICByZWdpc3RlciBjaGFyICpwOworICAgIHJlZ2lzdGVyIGludCBkaXI7CQkJLyogMSBmb3IgZm9yd2FyZCwgLTEgZm9yIGJhY2t3YXJkICovCit7CWZvciAoIDsgOyApCisJICAgewl3aGlsZSAoIGlzX3NwYWNlKCpwKSApCisJCSAgcCArPSBkaXI7CisJCWlmICggISgqcCA9PSAnLycgJiYgcFtkaXJdID09ICcqJykgKQorCQkgIGJyZWFrOworCQlwICs9IGRpcjsgIHAgKz0gZGlyOworCQl3aGlsZSAoICEoKnAgPT0gJyonICYmIHBbZGlyXSA9PSAnLycpICkKKwkJICAgewlpZiAoICpwID09IDAgKQorCQkJICByZXR1cm4gcDsJLyogbXVsdGktbGluZSBjb21tZW50Pz8gKi8KKwkJCXAgKz0gZGlyOworCQkgICB9CisJCXAgKz0gZGlyOyAgcCArPSBkaXI7CisJICAgfQorCXJldHVybiBwOworfQorCisvKgorICogV3JpdGUgYmxhbmtzIG92ZXIgcGFydCBvZiBhIHN0cmluZy4KKyAqIERvbid0IG92ZXJ3cml0ZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLgorICovCitpbnQKK3dyaXRlYmxhbmtzKHN0YXJ0LCBlbmQpCisgICAgY2hhciAqc3RhcnQ7CisgICAgY2hhciAqZW5kOworewljaGFyICpwOworCWZvciAoIHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrICkKKwkgIGlmICggKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nICkKKwkgICAgKnAgPSAnICc7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgdGhlIHN0cmluZyBpbiBidWYgaXMgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgorICogVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbmQvb3IgZW5kIHdpdGggYSBuZXdsaW5lLgorICogUmV0dXJuIGFzIGZvbGxvd3M6CisgKgkwIC0gZGVmaW5pdGVseSBub3QgYSBmdW5jdGlvbiBkZWZpbml0aW9uOworICoJMSAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBkZWZpbml0aW9uOworICoJMiAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBwcm90b3R5cGUgKE5PVCBVU0VEKTsKKyAqCS0xIC0gbWF5IGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbiBkZWZpbml0aW9uLAorICoJCWFwcGVuZCBhbm90aGVyIGxpbmUgYW5kIGxvb2sgYWdhaW4uCisgKiBUaGUgcmVhc29uIHdlIGRvbid0IGF0dGVtcHQgdG8gY29udmVydCBmdW5jdGlvbiBwcm90b3R5cGVzIGlzIHRoYXQKKyAqIEdob3N0c2NyaXB0J3MgZGVjbGFyYXRpb24tZ2VuZXJhdGluZyBtYWNyb3MgbG9vayB0b28gbXVjaCBsaWtlCisgKiBwcm90b3R5cGVzLCBhbmQgY29uZnVzZSB0aGUgYWxnb3JpdGhtcy4KKyAqLworaW50Cit0ZXN0MShidWYpCisgICAgY2hhciAqYnVmOworewlyZWdpc3RlciBjaGFyICpwID0gYnVmOworCWNoYXIgKmJlbmQ7CisJY2hhciAqZW5kZm47CisJaW50IGNvbnRpbjsKKworCWlmICggIWlzaWRmaXJzdGNoYXIoKnApICkKKwkgIHJldHVybiAwOwkJLyogbm8gbmFtZSBhdCBsZWZ0IG1hcmdpbiAqLworCWJlbmQgPSBza2lwc3BhY2UoYnVmICsgc3RybGVuKGJ1ZikgLSAxLCAtMSk7CisJc3dpdGNoICggKmJlbmQgKQorCSAgIHsKKwkgICBjYXNlICc7JzogY29udGluID0gMCAvKjIqLzsgYnJlYWs7CisJICAgY2FzZSAnKSc6IGNvbnRpbiA9IDE7IGJyZWFrOworCSAgIGNhc2UgJ3snOiByZXR1cm4gMDsJCS8qIG5vdCBhIGZ1bmN0aW9uICovCisJICAgY2FzZSAnfSc6IHJldHVybiAwOwkJLyogbm90IGEgZnVuY3Rpb24gKi8KKwkgICBkZWZhdWx0OiBjb250aW4gPSAtMTsKKwkgICB9CisJd2hpbGUgKCBpc2lkY2hhcigqcCkgKQorCSAgcCsrOworCWVuZGZuID0gcDsKKwlwID0gc2tpcHNwYWNlKHAsIDEpOworCWlmICggKnArKyAhPSAnKCcgKQorCSAgcmV0dXJuIDA7CQkvKiBub3QgYSBmdW5jdGlvbiAqLworCXAgPSBza2lwc3BhY2UocCwgMSk7CisJaWYgKCAqcCA9PSAnKScgKQorCSAgcmV0dXJuIDA7CQkvKiBubyBwYXJhbWV0ZXJzICovCisJLyogQ2hlY2sgdGhhdCB0aGUgYXBwYXJlbnQgZnVuY3Rpb24gbmFtZSBpc24ndCBhIGtleXdvcmQuICovCisJLyogV2Ugb25seSBuZWVkIHRvIGNoZWNrIGZvciBrZXl3b3JkcyB0aGF0IGNvdWxkIGJlIGZvbGxvd2VkICovCisJLyogYnkgYSBsZWZ0IHBhcmVudGhlc2lzICh3aGljaCwgdW5mb3J0dW5hdGVseSwgaXMgbW9zdCBvZiB0aGVtKS4gKi8KKwkgICB7CXN0YXRpYyBjaGFyICp3b3Jkc1tdID0KKwkJICAgewkiYXNtIiwgImF1dG8iLCAiY2FzZSIsICJjaGFyIiwgImNvbnN0IiwgImRvdWJsZSIsCisJCQkiZXh0ZXJuIiwgImZsb2F0IiwgImZvciIsICJpZiIsICJpbnQiLCAibG9uZyIsCisJCQkicmVnaXN0ZXIiLCAicmV0dXJuIiwgInNob3J0IiwgInNpZ25lZCIsICJzaXplb2YiLAorCQkJInN0YXRpYyIsICJzd2l0Y2giLCAidHlwZWRlZiIsICJ1bnNpZ25lZCIsCisJCQkidm9pZCIsICJ2b2xhdGlsZSIsICJ3aGlsZSIsIDAKKwkJICAgfTsKKwkJY2hhciAqKmtleSA9IHdvcmRzOworCQljaGFyICprcDsKKwkJaW50IGxlbiA9IGVuZGZuIC0gYnVmOworCisJCXdoaWxlICggKGtwID0gKmtleSkgIT0gMCApCisJCSAgIHsJaWYgKCBzdHJsZW4oa3ApID09IGxlbiAmJiAhc3RybmNtcChrcCwgYnVmLCBsZW4pICkKKwkJCSAgcmV0dXJuIDA7CS8qIG5hbWUgaXMgYSBrZXl3b3JkICovCisJCQlrZXkrKzsKKwkJICAgfQorCSAgIH0KKwlyZXR1cm4gY29udGluOworfQorCisvKiBDb252ZXJ0IGEgcmVjb2duaXplZCBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGhlYWRlciB0byBLJlIgc3ludGF4LiAqLworaW50Citjb252ZXJ0MShidWYsIG91dCwgaGVhZGVyLCBjb252ZXJ0X3ZhcmFyZ3MpCisgICAgY2hhciAqYnVmOworICAgIEZJTEUgKm91dDsKKyAgICBpbnQgaGVhZGVyOwkJCS8qIEJvb2xlYW4gKi8KKyAgICBpbnQgY29udmVydF92YXJhcmdzOwkvKiBCb29sZWFuICovCit7CWNoYXIgKmVuZGZuOworCXJlZ2lzdGVyIGNoYXIgKnA7CisJY2hhciAqKmJyZWFrczsKKwl1bnNpZ25lZCBudW1fYnJlYWtzID0gMjsJLyogZm9yIHRlc3RpbmcgKi8KKwljaGFyICoqYnRvcDsKKwljaGFyICoqYnA7CisJY2hhciAqKmFwOworCWNoYXIgKnZhcmFyZyA9IDA7CisKKwkvKiBQcmUtQU5TSSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWdyZWUgb24gd2hldGhlciBzdHJjaHIgKi8KKwkvKiBpcyBjYWxsZWQgc3RyY2hyIG9yIGluZGV4LCBzbyB3ZSBvcGVuLWNvZGUgaXQgaGVyZS4gKi8KKwlmb3IgKCBlbmRmbiA9IGJ1ZjsgKihlbmRmbisrKSAhPSAnKCc7ICkKKwkgIDsKK3RvcDoJcCA9IGVuZGZuOworCWJyZWFrcyA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIG51bV9icmVha3MgKiAyKTsKKwlpZiAoIGJyZWFrcyA9PSAwICkKKwkgICB7CS8qIENvdWxkbid0IGFsbG9jYXRlIGJyZWFrIHRhYmxlLCBnaXZlIHVwICovCisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJyZWFrIHRhYmxlIVxuIik7CisJCWZwdXRzKGJ1Ziwgb3V0KTsKKwkJcmV0dXJuIC0xOworCSAgIH0KKwlidG9wID0gYnJlYWtzICsgbnVtX2JyZWFrcyAqIDIgLSAyOworCWJwID0gYnJlYWtzOworCS8qIFBhcnNlIHRoZSBhcmd1bWVudCBsaXN0ICovCisJZG8KKwkgICB7CWludCBsZXZlbCA9IDA7CisJCWNoYXIgKmxwID0gTlVMTDsKKwkJY2hhciAqcnA7CisJCWNoYXIgKmVuZCA9IE5VTEw7CisKKwkJaWYgKCBicCA+PSBidG9wICkKKwkJICAgewkvKiBGaWxsZWQgdXAgYnJlYWsgdGFibGUuICovCisJCQkvKiBBbGxvY2F0ZSBhIGJpZ2dlciBvbmUgYW5kIHN0YXJ0IG92ZXIuICovCisJCQlmcmVlKChjaGFyICopYnJlYWtzKTsKKwkJCW51bV9icmVha3MgPDw9IDE7CisJCQlnb3RvIHRvcDsKKwkJICAgfQorCQkqYnArKyA9IHA7CisJCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgKi8KKwkJZm9yICggOyBlbmQgPT0gTlVMTDsgcCsrICkKKwkJICAgewlzd2l0Y2goKnApCisJCQkgICB7CisJCQkgICBjYXNlICcsJzoKKwkJCQlpZiAoICFsZXZlbCApIGVuZCA9IHA7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlICcoJzoKKwkJCQlpZiAoICFsZXZlbCApIGxwID0gcDsKKwkJCQlsZXZlbCsrOworCQkJCWJyZWFrOworCQkJICAgY2FzZSAnKSc6CisJCQkJaWYgKCAtLWxldmVsIDwgMCApIGVuZCA9IHA7CisJCQkJZWxzZSBycCA9IHA7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlICcvJzoKKwkJCQlwID0gc2tpcHNwYWNlKHAsIDEpIC0gMTsKKwkJCQlicmVhazsKKwkJCSAgIGRlZmF1bHQ6CisJCQkJOworCQkJICAgfQorCQkgICB9CisJCS8qIEVyYXNlIGFueSBlbWJlZGRlZCBwcm90b3R5cGUgcGFyYW1ldGVycy4gKi8KKwkJaWYgKCBscCApCisJCSAgd3JpdGVibGFua3MobHAgKyAxLCBycCk7CisJCXAtLTsJCQkvKiBiYWNrIHVwIG92ZXIgdGVybWluYXRvciAqLworCQkvKiBGaW5kIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkLiAqLworCQkvKiBUaGlzIGlzIGNvbXBsaWNhdGVkIGJlY2F1c2Ugb2YgcHJvY2VkdXJlIGFuZCAqLworCQkvKiBhcnJheSBtb2RpZmllcnMuICovCisJCWZvciAoIDsgOyApCisJCSAgIHsJcCA9IHNraXBzcGFjZShwIC0gMSwgLTEpOworCQkJc3dpdGNoICggKnAgKQorCQkJICAgeworCQkJICAgY2FzZSAnXSc6CS8qIHNraXAgYXJyYXkgZGltZW5zaW9uKHMpICovCisJCQkgICBjYXNlICcpJzoJLyogc2tpcCBwcm9jZWR1cmUgYXJncyBPUiBuYW1lICovCisJCQkgICB7CWludCBsZXZlbCA9IDE7CisJCQkJd2hpbGUgKCBsZXZlbCApCisJCQkJIHN3aXRjaCAoICotLXAgKQorCQkJCSAgIHsKKwkJCQkgICBjYXNlICddJzogY2FzZSAnKSc6IGxldmVsKys7IGJyZWFrOworCQkJCSAgIGNhc2UgJ1snOiBjYXNlICcoJzogbGV2ZWwtLTsgYnJlYWs7CisJCQkJICAgY2FzZSAnLyc6IHAgPSBza2lwc3BhY2UocCwgLTEpICsgMTsgYnJlYWs7CisJCQkJICAgZGVmYXVsdDogOworCQkJCSAgIH0KKwkJCSAgIH0KKwkJCQlpZiAoICpwID09ICcoJyAmJiAqc2tpcHNwYWNlKHAgKyAxLCAxKSA9PSAnKicgKQorCQkJCSAgIHsJLyogV2UgZm91bmQgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgKi8KKwkJCQkJd2hpbGUgKCAhaXNpZGZpcnN0Y2hhcigqcCkgKQorCQkJCQkgIHAgPSBza2lwc3BhY2UocCwgMSkgKyAxOworCQkJCQlnb3RvIGZvdW5kOworCQkJCSAgIH0KKwkJCQlicmVhazsKKwkJCSAgIGRlZmF1bHQ6CisJCQkJZ290byBmb3VuZDsKKwkJCSAgIH0KKwkJICAgfQorZm91bmQ6CQlpZiAoICpwID09ICcuJyAmJiBwWy0xXSA9PSAnLicgJiYgcFstMl0gPT0gJy4nICkKKwkJICB7CWlmICggY29udmVydF92YXJhcmdzICkKKwkJCSAgewkqYnArKyA9ICJ2YV9hbGlzdCI7CisJCQkJdmFyYXJnID0gcC0yOworCQkJICB9CisJCQllbHNlCisJCQkgIHsJcCsrOworCQkJCWlmICggYnAgPT0gYnJlYWtzICsgMSApCS8qIHNvbGUgYXJndW1lbnQgKi8KKwkJCQkgIHdyaXRlYmxhbmtzKGJyZWFrc1swXSwgcCk7CisJCQkJZWxzZQorCQkJCSAgd3JpdGVibGFua3MoYnBbLTFdIC0gMSwgcCk7CisJCQkJYnAtLTsKKwkJCSAgfQorCQkgICB9CisJCWVsc2UKKwkJICAgewl3aGlsZSAoIGlzaWRjaGFyKCpwKSApIHAtLTsKKwkJCSpicCsrID0gcCsxOworCQkgICB9CisJCXAgPSBlbmQ7CisJICAgfQorCXdoaWxlICggKnArKyA9PSAnLCcgKTsKKwkqYnAgPSBwOworCS8qIE1ha2UgYSBzcGVjaWFsIGNoZWNrIGZvciAndm9pZCcgYXJnbGlzdCAqLworCWlmICggYnAgPT0gYnJlYWtzKzIgKQorCSAgIHsJcCA9IHNraXBzcGFjZShicmVha3NbMF0sIDEpOworCQlpZiAoICFzdHJuY21wKHAsICJ2b2lkIiwgNCkgKQorCQkgICB7CXAgPSBza2lwc3BhY2UocCs0LCAxKTsKKwkJCWlmICggcCA9PSBicmVha3NbMl0gLSAxICkKKwkJCSAgIHsJYnAgPSBicmVha3M7CS8qIHl1cCwgcHJldGVuZCBhcmdsaXN0IGlzIGVtcHR5ICovCisJCQkJd3JpdGVibGFua3MoYnJlYWtzWzBdLCBwICsgMSk7CisJCQkgICB9CisJCSAgIH0KKwkgICB9CisJLyogUHV0IG91dCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgbGVmdCBwYXJlbnRoZXNpcy4gKi8KKwlwID0gYnVmOworCXdoaWxlICggcCAhPSBlbmRmbiApIHB1dGMoKnAsIG91dCksIHArKzsKKwkvKiBQdXQgb3V0IHRoZSBkZWNsYXJhdGlvbi4gKi8KKwlpZiAoIGhlYWRlciApCisJICB7CWZwdXRzKCIpOyIsIG91dCk7CisJCWZvciAoIHAgPSBicmVha3NbMF07ICpwOyBwKysgKQorCQkgIGlmICggKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nICkKKwkJICAgIHB1dGMoKnAsIG91dCk7CisJICB9CisJZWxzZQorCSAgewlmb3IgKCBhcCA9IGJyZWFrcysxOyBhcCA8IGJwOyBhcCArPSAyICkKKwkJICB7CXAgPSAqYXA7CisJCQl3aGlsZSAoIGlzaWRjaGFyKCpwKSApCisJCQkgIHB1dGMoKnAsIG91dCksIHArKzsKKwkJCWlmICggYXAgPCBicCAtIDEgKQorCQkJICBmcHV0cygiLCAiLCBvdXQpOworCQkgIH0KKwkJZnB1dHMoIikgICIsIG91dCk7CisJCS8qIFB1dCBvdXQgdGhlIGFyZ3VtZW50IGRlY2xhcmF0aW9ucyAqLworCQlmb3IgKCBhcCA9IGJyZWFrcysyOyBhcCA8PSBicDsgYXAgKz0gMiApCisJCSAgKCphcClbLTFdID0gJzsnOworCQlpZiAoIHZhcmFyZyAhPSAwICkKKwkJICB7CSp2YXJhcmcgPSAwOworCQkJZnB1dHMoYnJlYWtzWzBdLCBvdXQpOwkJLyogYW55IHByaW9yIGFyZ3MgKi8KKwkJCWZwdXRzKCJ2YV9kY2wiLCBvdXQpOwkJLyogdGhlIGZpbmFsIGFyZyAqLworCQkJZnB1dHMoYnBbMF0sIG91dCk7CisJCSAgfQorCQllbHNlCisJCSAgZnB1dHMoYnJlYWtzWzBdLCBvdXQpOworCSAgfQorCWZyZWUoKGNoYXIgKilicmVha3MpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvanBlZy9hcm12Nl9pZGN0LlMgYi9qcGVnL2FybXY2X2lkY3QuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ2MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9hcm12Nl9pZGN0LlMKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBpcyBhIGZhc3QtYW5kLWFjY3VyYXRlIGltcGxlbWVudGF0aW9uIG9mIGludmVyc2UgRGlzY3JldGUgQ29zaW5lCisgKiBUcmFuc2Zvcm0gKElEQ1QpIGZvciBBUk12NisuIEl0IGFsc28gcGVyZm9ybXMgZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0CisgKiBjb2VmZmljaWVudHMganVzdCBsaWtlIG90aGVyIG1ldGhvZHMuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgc2NhbGVkIDEtRCBEQ1QgYWxnb3JpdGhtIHByb3Bvc2VkIGJ5CisgKiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBiYXNlZCBvbiB0aGUgZmlndXJlIDQtOAorICogb24gcGFnZSA1MiBvZiB0aGUgSlBFRyB0ZXh0Ym9vayBieSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbC4gQ29lZmZpY2llbnRzCisgKiBhcmUgKGFsbW9zdCkgZGlyZWN0bHkgbWFwcGVkIGludG8gcmVnaXN0ZXJzLgorICoKKyAqIFRoZSBhY2N1cmFjeSBpcyBhY2hpZXZlZCBieSB1c2luZyBTTVVMV3kgYW5kIFNNTEFXeSBpbnN0cnVjdGlvbnMuIEJvdGgKKyAqIG11bHRpcGx5IDMyIGJpdHMgYnkgMTYgYml0cyBhbmQgc3RvcmUgdGhlIHRvcCAzMiBiaXRzIG9mIHRoZSByZXN1bHQuIEl0CisgKiBtYWtlcyAzMi1iaXQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYyBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93LiBUaGF0IGlzCisgKiB3aHkganBlZ19pZGN0X2lmYXN0KCksIHdoaWNoIGlzIHdyaXR0ZW4gaW4gQywgY2Fubm90IGJlIGltcHJvdmVkLgorICoKKyAqIE1vcmUgdHJpY2tzIGFyZSB1c2VkIHRvIGdhaW4gbW9yZSBzcGVlZC4gRmlyc3Qgb2YgYWxsLCB3ZSB1c2UgYXMgbWFueQorICogcmVnaXN0ZXJzIGFzIHBvc3NpYmxlLiBBUk0gcHJvY2Vzc29yIGhhcyAxNiByZWdpc3RlcnMgaW5jbHVkaW5nIHNwIChyMTMpCisgKiBhbmQgcGMgKHIxNSksIHNvIG9ubHkgMTQgcmVnaXN0ZXJzIGNhbiBiZSB1c2VkIHdpdGhvdXQgbGltaXRhdGlvbnMuIEluCisgKiBnZW5lcmFsLCB3ZSBsZXQgcjAgdG8gcjcgaG9sZCB0aGUgY29lZmZpY2llbnRzOyByMTAgYW5kIHIxMSBob2xkIGZvdXIKKyAqIDE2LWJpdCBjb25zdGFudHM7IHIxMiBhbmQgcjE0IGhvbGQgdHdvIG9mIHRoZSBmb3VyIGFyZ3VtZW50czsgYW5kIHI4IGhvbGQKKyAqIGludGVybWVkaWF0ZSB2YWx1ZS4gSW4gdGhlIHNlY29uZCBwYXNzLCByOSBpcyB0aGUgbG9vcCBjb3VudGVyLiBJbiB0aGUKKyAqIGZpcnN0IHBhc3MsIHI4IHRvIHIxMSBhcmUgdXNlZCB0byBob2xkIHF1YW50aXphdGlvbiB2YWx1ZXMsIHNvIHRoZSBsb29wCisgKiBjb3VudGVyIGlzIGhlbGQgYnkgc3AuIFllcywgdGhlIHN0YWNrIHBvaW50ZXIuIFNpbmNlIGl0IG11c3QgYmUgYWxpZ25lZAorICogdG8gNC1ieXRlIGJvdW5kYXJ5IGFsbCB0aGUgdGltZSwgd2UgYWxpZ24gaXQgdG8gMzItYnl0ZSBib3VuZGFyeSBhbmQgdXNlCisgKiBiaXQgMyB0byBiaXQgNS4gQXMgdGhlIHJlc3VsdCwgd2UgYWN0dWFsbHkgdXNlIDE0LjEgcmVnaXN0ZXJzLiA6LSkKKyAqCisgKiBTZWNvbmQsIHdlIHJlYXJyYW5nZSBxdWFudGl6YXRpb24gdmFsdWVzIHRvIGFjY2VzcyB0aGVtIHNlcXVlbnRpYWxseS4gVGhlCisgKiB0YWJsZSBpcyBmaXJzdCB0cmFuc3Bvc2VkLCBhbmQgdGhlIG5ldyBjb2x1bW5zIGFyZSBwbGFjZWQgaW4gdGhlIG9yZGVyIG9mCisgKiA3LCA1LCAxLCAzLCAwLCAyLCA0LCA2LiBUaHVzIHdlIGNhbiB1c2UgTERNREIgdG8gbG9hZCBmb3VyIHZhbHVlcyBhdCBhCisgKiB0aW1lLiBSZWFycmFuZ2luZyBjb2VmZmljaWVudHMgYWxzbyBoZWxwcywgYnV0IHRoYXQgcmVxdWlyZXMgdG8gY2hhbmdlIGEKKyAqIGRvemVuIG9mIGZpbGVzLCB3aGljaCBzZWVtcyBub3Qgd29ydGggaXQuIEluIGFkZGl0aW9uLCB3ZSBjaG9vc2UgdG8gc2NhbGUKKyAqIHVwIHF1YW50aXphdGlvbiB2YWx1ZXMgYnkgMTMgYml0cywgc28gdGhlIGNvZWZmaWNpZW50cyBhcmUgc2NhbGVkIHVwIGJ5CisgKiAxNiBiaXRzIGFmdGVyIGJvdGggcGFzc2VzLiBUaGVuIHdlIGNhbiBwYWNrIGFuZCBzYXR1cmF0ZSB0aGVtIHR3byBhdCBhCisgKiB0aW1lIHVzaW5nIFBLSFRCIGFuZCBVU0FUMTYgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIFRoaXJkLCB3ZSByZW9yZGVyIHRoZSBpbnN0cnVjdGlvbnMgdG8gYXZvaWQgYnViYmxlcyBpbiB0aGUgcGlwZWxpbmUuIFRoaXMKKyAqIGlzIGRvbmUgYnkgaGFuZCBhY2Nyb2RpbmcgdG8gdGhlIGN5Y2xlIHRpbWluZ3MgYW5kIHRoZSBpbnRlcmxvY2sgYmVoYXZpb3IKKyAqIGRlc2NyaWJlZCBpbiB0aGUgdGVjaG5pY2FsIHJlZmVyZW5jZSBtYW51YWwgb2YgQVJNMTEzNkpGLVMuIFdlIGFsc28gdGFrZQorICogYWR2YW50YWdlIG9mIGR1YWwgaXNzdWUgcHJvY2Vzc29ycyBieSBpbnRlcmxlYXZpbmcgaW5zdHJ1Y3Rpb25zIHdpdGgKKyAqIGRlcGVuZGVuY2llcy4gSXQgaGFzIGJlZW4gYmVuY2htYXJrZWQgb24gZm91ciBkZXZpY2VzIGFuZCBhbGwgdGhlIHJlc3VsdHMKKyAqIHNob3dlZCBkaXN0aW5ndWlzaGFibGUgaW1wcm92ZW1lbnRzLiBOb3RlIHRoYXQgUExEIGluc3RydWN0aW9ucyBhY3R1YWxseQorICogc2xvdyB0aGluZ3MgZG93biwgc28gdGhleSBhcmUgcmVtb3ZlZCBhdCB0aGUgbGFzdCBtaW51dGUuIEluIHRoZSBmdXR1cmUsCisgKiB0aGlzIG1pZ2h0IGJlIGZ1dGhlciBpbXByb3ZlZCB1c2luZyBhIHN5c3RlbSBwcm9maWxlci4KKyAqLworCisvLyB2b2lkIGFybXY2X2lkY3Qoc2hvcnQgKmNvZWZzLCBpbnQgKnF1YW5zLCB1bnNpZ25lZCBjaGFyICpyb3dzLCBpbnQgY29sKQorICAgIC5hcm0KKyAgICAuc3ludGF4IHVuaWZpZWQKKyAgICAudGV4dAorICAgIC5hbGlnbgorICAgIC5nbG9iYWwgYXJtdjZfaWRjdAorCithcm12Nl9pZGN0OgorICAgIC8vIFB1c2ggZXZlcnl0aGluZyBleGNlcHQgc3AgKHIxMykgYW5kIHBjIChyMTUpLgorICAgIHN0bWRiICAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgcjE0fQorCisgICAgLy8gcjEyID0gcXVhbnMsIHIxNCA9IGNvZWZzLgorICAgIHN1YiAgICAgcjQsIHNwLCAjMjM2CisgICAgYmljICAgICBzcCwgcjQsICMzMQorICAgIGFkZCAgICAgcjUsIHNwLCAjMjI0CisgICAgYWRkICAgICByMTIsIHIxLCAjMjU2CisgICAgc3RtICAgICByNSwge3IyLCByMywgcjR9CisgICAgYWRkICAgICByMTQsIHIwLCAjMTYKKworcGFzczFfaGVhZDoKKyAgICAvLyBMb2FkIHF1YW50aXphdGlvbiB2YWx1ZXMuIChxWzAsIDIsIDQsIDZdKQorICAgIGxkbWRiICAgcjEyISwge3I4LCByOSwgcjEwLCByMTF9CisKKyAgICAvLyBMb2FkIGNvZWZmaWNpZW50cy4gKGNbNCwgMSwgMiwgMywgMCwgNSwgNiwgN10pCisgICAgbGRyc2ggICByNCwgW3IxNCwgIy0yXSAhCisgICAgbGRyc2ggICByMSwgW3IxNCwgIzE2XQorICAgIGxkcnNoICAgcjIsIFtyMTQsICMzMl0KKyAgICBsZHJzaCAgIHIzLCBbcjE0LCAjNDhdCisgICAgbGRyc2ggICByMCwgW3IxNCwgIzY0XQorICAgIGxkcnNoICAgcjUsIFtyMTQsICM4MF0KKyAgICBsZHJzaCAgIHI2LCBbcjE0LCAjOTZdCisgICAgbGRyc2ggICByNywgW3IxNCwgIzExMl0KKworICAgIC8vIHI0ID0gcVswXSAqIGNbMF07CisgICAgbXVsICAgICByNCwgcjgsIHI0CisKKyAgICAvLyBDaGVjayBpZiBBQ3MgYXJlIGFsbCB6ZXJvLgorICAgIGNtcCAgICAgcjAsICMwCisgICAgb3Jyc2VxICByOCwgcjEsIHIyCisgICAgb3Jyc2VxICByOCwgcjMsIHI1CisgICAgb3Jyc2VxICByOCwgcjYsIHI3CisgICAgYmVxICAgICBwYXNzMV96ZXJvCisKKyAgICAvLyBTdGVwIDE6IERlcXVhbnRpemF0aW9ucy4KKworICAgIC8vIHIyID0gcVsyXSAqIGNbMl07CisgICAgLy8gcjAgPSBxWzRdICogY1s0XSArIHI0OworICAgIC8vIHI2ID0gcVs2XSAqIGNbNl0gKyByMjsKKyAgICBtdWwgICAgIHIyLCByOSwgcjIKKyAgICBtbGEgICAgIHIwLCByMTAsIHIwLCByNAorICAgIG1sYSAgICAgcjYsIHIxMSwgcjYsIHIyCisKKyAgICAvLyBMb2FkIHF1YW50aXphdGlvbiB2YWx1ZXMuIChxWzcsIDUsIDEsIDNdKQorICAgIGxkbWRiICAgcjEyISwge3I4LCByOSwgcjEwLCByMTF9CisKKyAgICAvLyByNCA9IHI0ICogMiAtIHIwID0gLShyMCAtIHI0ICogMik7CisgICAgLy8gcjIgPSByMiAqIDIgLSByNiA9IC0ocjYgLSByMiAqIDIpOworICAgIHJzYiAgICAgcjQsIHIwLCByNCwgbHNsICMxCisgICAgcnNiICAgICByMiwgcjYsIHIyLCBsc2wgIzEKKworICAgIC8vIHI3ID0gcVs3XSAqIGNbN107CisgICAgLy8gcjUgPSBxWzVdICogY1s1XTsKKyAgICAvLyByMSA9IHFbMV0gKiBjWzFdICsgcjc7CisgICAgLy8gcjMgPSBxWzNdICogY1szXSArIHI1OworICAgIG11bCAgICAgcjcsIHI4LCByNworICAgIG11bCAgICAgcjUsIHI5LCByNQorICAgIG1sYSAgICAgcjEsIHIxMCwgcjEsIHI3CisgICAgbWxhICAgICByMywgcjExLCByMywgcjUKKworICAgIC8vIExvYWQgY29uc3RhbnRzIHRvIHIxMCwgcjExLgorICAgIGxkcmQgICAgcjEwLCByMTEsIGNvbnN0YW50cworCisgICAgLy8gU3RlcCAyOiBSb3RhdGlvbnMgYW5kIEJ1dHRlcmZsaWVzLgorCisgICAgLy8gcjcgPSByMSAtIHI3ICogMjsKKyAgICAvLyByMSA9IHIxIC0gcjM7CisgICAgLy8gcjUgPSByNSAqIDIgLSByMyA9IC0ocjMgLSByNSAqIDIpOworICAgIC8vIHIzID0gcjEgKyByMyAqIDI7CisgICAgLy8gcjggPSByNSArIHI3OworICAgIHN1YiAgICAgcjcsIHIxLCByNywgbHNsICMxCisgICAgc3ViICAgICByMSwgcjEsIHIzCisgICAgcnNiICAgICByNSwgcjMsIHI1LCBsc2wgIzEKKyAgICBhZGQgICAgIHIzLCByMSwgcjMsIGxzbCAjMQorICAgIGFkZCAgICAgcjgsIHI1LCByNworCisgICAgLy8gcjIgPSByMiAqIDEuNDE0MjEgPSByMiAqIDI3MTQ2IC8gNjU1MzYgKyByMjsKKyAgICAvLyByOCA9IHI4ICogMS44NDc3NiAvIDggPSByOCAqIDE1MTM3IC8gNjU1MzY7CisgICAgLy8gcjEgPSByMSAqIDEuNDE0MjEgPSByMSAqIDI3MTQ2IC8gNjU1MzYgKyByMTsKKyAgICBzbWxhd3QgIHIyLCByMiwgcjEwLCByMgorICAgIHNtdWx3YiAgcjgsIHI4LCByMTAKKyAgICBzbWxhd3QgIHIxLCByMSwgcjEwLCByMQorCisgICAgLy8gcjAgPSByMCArIHI2OworICAgIC8vIHIyID0gcjIgLSByNjsKKyAgICAvLyByNiA9IHIwIC0gcjYgKiAyOworICAgIGFkZCAgICAgcjAsIHIwLCByNgorICAgIHN1YiAgICAgcjIsIHIyLCByNgorICAgIHN1YiAgICAgcjYsIHIwLCByNiwgbHNsICMxCisKKyAgICAvLyByNSA9IHI1ICogLTIuNjEzMTMgLyA4ICsgcjggPSByNSAqIC0yMTQwNyAvIDY1NTM2ICsgcjg7CisgICAgLy8gcjggPSByNyAqIC0xLjA4MjM5IC8gOCArIHI4ID0gcjcgKiAtODg2NyAvIDY1NTM2ICsgcjg7CisgICAgc21sYXd0ICByNSwgcjUsIHIxMSwgcjgKKyAgICBzbWxhd2IgIHI4LCByNywgcjExLCByOAorCisgICAgLy8gcjQgPSByNCArIHIyOworICAgIC8vIHIwID0gcjAgKyByMzsKKyAgICAvLyByMiA9IHI0IC0gcjIgKiAyOworICAgIGFkZCAgICAgcjQsIHI0LCByMgorICAgIGFkZCAgICAgcjAsIHIwLCByMworICAgIHN1YiAgICAgcjIsIHI0LCByMiwgbHNsICMxCisKKyAgICAvLyByNyA9IHI1ICogOCAtIHIzID0gLShyMyAtIHI1ICogOCk7CisgICAgLy8gcjMgPSByMCAtIHIzICogMjsKKyAgICAvLyByMSA9IHIxIC0gcjc7CisgICAgLy8gcjQgPSByNCArIHI3OworICAgIC8vIHI1ID0gcjggKiA4IC0gcjEgPSAtKHIxIC0gcjggKiA4KTsKKyAgICAvLyByNyA9IHI0IC0gcjcgKiAyOworICAgIHJzYiAgICAgcjcsIHIzLCByNSwgbHNsICMzCisgICAgc3ViICAgICByMywgcjAsIHIzLCBsc2wgIzEKKyAgICBzdWIgICAgIHIxLCByMSwgcjcKKyAgICBhZGQgICAgIHI0LCByNCwgcjcKKyAgICByc2IgICAgIHI1LCByMSwgcjgsIGxzbCAjMworICAgIHN1YiAgICAgcjcsIHI0LCByNywgbHNsICMxCisKKyAgICAvLyByMiA9IHIyICsgcjE7CisgICAgLy8gcjYgPSByNiArIHI1OworICAgIC8vIHIxID0gcjIgLSByMSAqIDI7CisgICAgLy8gcjUgPSByNiAtIHI1ICogMjsKKyAgICBhZGQgICAgIHIyLCByMiwgcjEKKyAgICBhZGQgICAgIHI2LCByNiwgcjUKKyAgICBzdWIgICAgIHIxLCByMiwgcjEsIGxzbCAjMQorICAgIHN1YiAgICAgcjUsIHI2LCByNSwgbHNsICMxCisKKyAgICAvLyBTdGVwIDM6IFJlb3JkZXIgYW5kIFNhdmUuCisKKyAgICBzdHIgICAgIHIwLCBbc3AsICMtNF0gIQorICAgIHN0ciAgICAgcjQsIFtzcCwgIzMyXQorICAgIHN0ciAgICAgcjIsIFtzcCwgIzY0XQorICAgIHN0ciAgICAgcjYsIFtzcCwgIzk2XQorICAgIHN0ciAgICAgcjUsIFtzcCwgIzEyOF0KKyAgICBzdHIgICAgIHIxLCBbc3AsICMxNjBdCisgICAgc3RyICAgICByNywgW3NwLCAjMTkyXQorICAgIHN0ciAgICAgcjMsIFtzcCwgIzIyNF0KKyAgICBiICAgICAgIHBhc3MxX3RhaWwKKworICAgIC8vIFByZWNvbXB1dGVkIDE2LWJpdCBjb25zdGFudHM6IDI3MTQ2LCAxNTEzNywgLTIxNDA3LCAtODg2Ny4KKyAgICAvLyBQdXQgdGhlbSBpbiB0aGUgbWlkZGxlIHNpbmNlIExEUkQgb25seSBhY2NlcHRzIG9mZnNldHMgZnJvbSAtMjU1IHRvIDI1NS4KKyAgICAuYWxpZ24gIDMKK2NvbnN0YW50czoKKyAgICAud29yZCAgIDB4NmEwYTNiMjEKKyAgICAud29yZCAgIDB4YWM2MWRkNWQKKworcGFzczFfemVybzoKKyAgICBzdHIgICAgIHI0LCBbc3AsICMtNF0gIQorICAgIHN0ciAgICAgcjQsIFtzcCwgIzMyXQorICAgIHN0ciAgICAgcjQsIFtzcCwgIzY0XQorICAgIHN0ciAgICAgcjQsIFtzcCwgIzk2XQorICAgIHN0ciAgICAgcjQsIFtzcCwgIzEyOF0KKyAgICBzdHIgICAgIHI0LCBbc3AsICMxNjBdCisgICAgc3RyICAgICByNCwgW3NwLCAjMTkyXQorICAgIHN0ciAgICAgcjQsIFtzcCwgIzIyNF0KKyAgICBzdWIgICAgIHIxMiwgcjEyLCAjMTYKKworcGFzczFfdGFpbDoKKyAgICBhbmRzICAgIHI5LCBzcCwgIzMxCisgICAgYm5lICAgICBwYXNzMV9oZWFkCisKKyAgICAvLyByMTIgPSByb3dzLCByMTQgPSBjb2wuCisgICAgbGRyICAgICByMTIsIFtzcCwgIzI1Nl0KKyAgICBsZHIgICAgIHIxNCwgW3NwLCAjMjYwXQorCisgICAgLy8gTG9hZCBjb25zdGFudHMgdG8gcjEwLCByMTEuCisgICAgbGRyZCAgICByMTAsIHIxMSwgY29uc3RhbnRzCisKK3Bhc3MyX2hlYWQ6CisgICAgLy8gTG9hZCBjb2VmZmljaWVudHMuIChjWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDddKQorICAgIGxkbWlhICAgc3AhLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3fQorCisgICAgLy8gcjAgPSByMCArIDB4MDA4MDgwMDA7CisgICAgYWRkICAgICByMCwgcjAsICMweDAwODAwMDAwCisgICAgYWRkICAgICByMCwgcjAsICMweDAwMDA4MDAwCisKKyAgICAvLyBTdGVwIDE6IEFuYWxvZyB0byB0aGUgZmlyc3QgcGFzcy4KKworICAgIC8vIHIwID0gcjAgKyByNDsKKyAgICAvLyByNiA9IHI2ICsgcjI7CisgICAgYWRkICAgICByMCwgcjAsIHI0CisgICAgYWRkICAgICByNiwgcjYsIHIyCisKKyAgICAvLyByNCA9IHIwIC0gcjQgKiAyOworICAgIC8vIHIyID0gcjIgKiAyIC0gcjYgPSAtKHI2IC0gcjIgKiAyKTsKKyAgICBzdWIgICAgIHI0LCByMCwgcjQsIGxzbCAjMQorICAgIHJzYiAgICAgcjIsIHI2LCByMiwgbHNsICMxCisKKyAgICAvLyByMSA9IHIxICsgcjc7CisgICAgLy8gcjMgPSByMyArIHI1OworICAgIGFkZCAgICAgcjEsIHIxLCByNworICAgIGFkZCAgICAgcjMsIHIzLCByNQorCisgICAgLy8gU3RlcCAyOiBSb3RhdGlvbnMgYW5kIEJ1dHRlcmZsaWVzLgorCisgICAgLy8gcjcgPSByMSAtIHI3ICogMjsKKyAgICAvLyByMSA9IHIxIC0gcjM7CisgICAgLy8gcjUgPSByNSAqIDIgLSByMyA9IC0ocjMgLSByNSAqIDIpOworICAgIC8vIHIzID0gcjEgKyByMyAqIDI7CisgICAgLy8gcjggPSByNSArIHI3OworICAgIHN1YiAgICAgcjcsIHIxLCByNywgbHNsICMxCisgICAgc3ViICAgICByMSwgcjEsIHIzCisgICAgcnNiICAgICByNSwgcjMsIHI1LCBsc2wgIzEKKyAgICBhZGQgICAgIHIzLCByMSwgcjMsIGxzbCAjMQorICAgIGFkZCAgICAgcjgsIHI1LCByNworCisgICAgLy8gcjIgPSByMiAqIDEuNDE0MjEgPSByMiAqIDI3MTQ2IC8gNjU1MzYgKyByMjsKKyAgICAvLyByOCA9IHI4ICogMS44NDc3NiAvIDggPSByOCAqIDE1MTM3IC8gNjU1MzY7CisgICAgLy8gcjEgPSByMSAqIDEuNDE0MjEgPSByMSAqIDI3MTQ2IC8gNjU1MzYgKyByMTsKKyAgICBzbWxhd3QgIHIyLCByMiwgcjEwLCByMgorICAgIHNtdWx3YiAgcjgsIHI4LCByMTAKKyAgICBzbWxhd3QgIHIxLCByMSwgcjEwLCByMQorCisgICAgLy8gcjAgPSByMCArIHI2OworICAgIC8vIHIyID0gcjIgLSByNjsKKyAgICAvLyByNiA9IHIwIC0gcjYgKiAyOworICAgIGFkZCAgICAgcjAsIHIwLCByNgorICAgIHN1YiAgICAgcjIsIHIyLCByNgorICAgIHN1YiAgICAgcjYsIHIwLCByNiwgbHNsICMxCisKKyAgICAvLyByNSA9IHI1ICogLTIuNjEzMTMgLyA4ICsgcjggPSByNSAqIC0yMTQwNyAvIDY1NTM2ICsgcjg7CisgICAgLy8gcjggPSByNyAqIC0xLjA4MjM5IC8gOCArIHI4ID0gcjcgKiAtODg2NyAvIDY1NTM2ICsgcjg7CisgICAgc21sYXd0ICByNSwgcjUsIHIxMSwgcjgKKyAgICBzbWxhd2IgIHI4LCByNywgcjExLCByOAorCisgICAgLy8gcjQgPSByNCArIHIyOworICAgIC8vIHIwID0gcjAgKyByMzsKKyAgICAvLyByMiA9IHI0IC0gcjIgKiAyOworICAgIGFkZCAgICAgcjQsIHI0LCByMgorICAgIGFkZCAgICAgcjAsIHIwLCByMworICAgIHN1YiAgICAgcjIsIHI0LCByMiwgbHNsICMxCisKKyAgICAvLyByNyA9IHI1ICogOCAtIHIzID0gLShyMyAtIHI1ICogOCk7CisgICAgLy8gcjMgPSByMCAtIHIzICogMjsKKyAgICAvLyByMSA9IHIxIC0gcjc7CisgICAgLy8gcjQgPSByNCArIHI3OworICAgIC8vIHI1ID0gcjggKiA4IC0gcjEgPSAtKHIxIC0gcjggKiA4KTsKKyAgICAvLyByNyA9IHI0IC0gcjcgKiAyOworICAgIHJzYiAgICAgcjcsIHIzLCByNSwgbHNsICMzCisgICAgc3ViICAgICByMywgcjAsIHIzLCBsc2wgIzEKKyAgICBzdWIgICAgIHIxLCByMSwgcjcKKyAgICBhZGQgICAgIHI0LCByNCwgcjcKKyAgICByc2IgICAgIHI1LCByMSwgcjgsIGxzbCAjMworICAgIHN1YiAgICAgcjcsIHI0LCByNywgbHNsICMxCisKKyAgICAvLyByMiA9IHIyICsgcjE7CisgICAgLy8gcjYgPSByNiArIHI1OworICAgIC8vIHIxID0gcjIgLSByMSAqIDI7CisgICAgLy8gcjUgPSByNiAtIHI1ICogMjsKKyAgICBhZGQgICAgIHIyLCByMiwgcjEKKyAgICBhZGQgICAgIHI2LCByNiwgcjUKKyAgICBzdWIgICAgIHIxLCByMiwgcjEsIGxzbCAjMQorICAgIHN1YiAgICAgcjUsIHI2LCByNSwgbHNsICMxCisKKyAgICAvLyBTdGVwIDM6IFJlb3JkZXIgYW5kIFNhdmUuCisKKyAgICAvLyBMb2FkIG91dHB1dCBwb2ludGVyLgorICAgIGxkciAgICAgcjgsIFtyMTJdLCAjNAorCisgICAgLy8gRm9yIGxpdHRsZSBlbmRpYW46IHI2LCByMiwgcjQsIHIwLCByMywgcjcsIHIxLCByNS4KKyAgICBwa2h0YiAgIHI2LCByNiwgcjQsIGFzciAjMTYKKyAgICBwa2h0YiAgIHIyLCByMiwgcjAsIGFzciAjMTYKKyAgICBwa2h0YiAgIHIzLCByMywgcjEsIGFzciAjMTYKKyAgICBwa2h0YiAgIHI3LCByNywgcjUsIGFzciAjMTYKKyAgICB1c2F0MTYgIHI2LCAjOCwgcjYKKyAgICB1c2F0MTYgIHIyLCAjOCwgcjIKKyAgICB1c2F0MTYgIHIzLCAjOCwgcjMKKyAgICB1c2F0MTYgIHI3LCAjOCwgcjcKKyAgICBvcnIgICAgIHIwLCByMiwgcjYsIGxzbCAjOAorICAgIG9yciAgICAgcjEsIHI3LCByMywgbHNsICM4CisKKyNpZmRlZiBfX0FSTUVCX18KKyAgICAvLyBSZXZlcnNlIGJ5dGVzIGZvciBiaWcgZW5kaWFuLgorICAgIHJldiAgICAgcjAsIHIwCisgICAgcmV2ICAgICByMSwgcjEKKyNlbmRpZgorCisgICAgLy8gVXNlIFNUUiBpbnN0ZWFkIG9mIFNUUkQgdG8gc3VwcG9ydCB1bmFsaWduZWQgYWNjZXNzLgorICAgIHN0ciAgICAgcjAsIFtyOCwgcjE0XSAhCisgICAgc3RyICAgICByMSwgW3I4LCAjNF0KKworcGFzczJfdGFpbDoKKyAgICBhZGRzICAgIHI5LCByOSwgIzB4MTAwMDAwMDAKKyAgICBicGwgICAgIHBhc3MyX2hlYWQKKworICAgIGxkciAgICAgc3AsIFtzcCwgIzhdCisgICAgYWRkICAgICBzcCwgc3AsICMyMzYKKworICAgIGxkbWlhICAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgcjE0fQorICAgIGJ4ICAgICAgbHIKZGlmZiAtLWdpdCBhL2pwZWcvY2RlcnJvci5oIGIvanBlZy9jZGVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0MzVlMQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvY2RlcnJvci5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogY2RlcnJvci5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZXJyb3IgYW5kIG1lc3NhZ2UgY29kZXMgZm9yIHRoZSBjanBlZy9kanBlZworICogYXBwbGljYXRpb25zLiAgVGhlc2Ugc3RyaW5ncyBhcmUgbm90IG5lZWRlZCBhcyBwYXJ0IG9mIHRoZSBKUEVHIGxpYnJhcnkKKyAqIHByb3Blci4KKyAqIEVkaXQgdGhpcyBmaWxlIHRvIGFkZCBuZXcgY29kZXMsIG9yIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBzdHJpbmdzIHRvCisgKiBzb21lIG90aGVyIGxhbmd1YWdlLgorICovCisKKy8qCisgKiBUbyBkZWZpbmUgdGhlIGVudW0gbGlzdCBvZiBtZXNzYWdlIGNvZGVzLCBpbmNsdWRlIHRoaXMgZmlsZSB3aXRob3V0CisgKiBkZWZpbmluZyBtYWNybyBKTUVTU0FHRS4gIFRvIGNyZWF0ZSBhIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLCBpbmNsdWRlIGl0CisgKiBhZ2FpbiB3aXRoIGEgc3VpdGFibGUgSk1FU1NBR0UgZGVmaW5pdGlvbiAoc2VlIGplcnJvci5jIGZvciBhbiBleGFtcGxlKS4KKyAqLworI2lmbmRlZiBKTUVTU0FHRQorI2lmbmRlZiBDREVSUk9SX0gKKyNkZWZpbmUgQ0RFUlJPUl9ICisvKiBGaXJzdCB0aW1lIHRocm91Z2gsIGRlZmluZSB0aGUgZW51bSBsaXN0ICovCisjZGVmaW5lIEpNQUtFX0VOVU1fTElTVAorI2Vsc2UKKy8qIFJlcGVhdGVkIGluY2x1c2lvbnMgb2YgdGhpcyBmaWxlIGFyZSBuby1vcHMgdW5sZXNzIEpNRVNTQUdFIGlzIGRlZmluZWQgKi8KKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCisjZW5kaWYgLyogQ0RFUlJPUl9IICovCisjZW5kaWYgLyogSk1FU1NBR0UgKi8KKworI2lmZGVmIEpNQUtFX0VOVU1fTElTVAorCit0eXBlZGVmIGVudW0geworCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQljb2RlICwKKworI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLworCitKTUVTU0FHRShKTVNHX0ZJUlNUQURET05DT0RFPTEwMDAsIE5VTEwpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCisKKyNpZmRlZiBCTVBfU1VQUE9SVEVECitKTUVTU0FHRShKRVJSX0JNUF9CQURDTUFQLCAiVW5zdXBwb3J0ZWQgQk1QIGNvbG9ybWFwIGZvcm1hdCIpCitKTUVTU0FHRShKRVJSX0JNUF9CQURERVBUSCwgIk9ubHkgOC0gYW5kIDI0LWJpdCBCTVAgZmlsZXMgYXJlIHN1cHBvcnRlZCIpCitKTUVTU0FHRShKRVJSX0JNUF9CQURIRUFERVIsICJJbnZhbGlkIEJNUCBmaWxlOiBiYWQgaGVhZGVyIGxlbmd0aCIpCitKTUVTU0FHRShKRVJSX0JNUF9CQURQTEFORVMsICJJbnZhbGlkIEJNUCBmaWxlOiBiaVBsYW5lcyBub3QgZXF1YWwgdG8gMSIpCitKTUVTU0FHRShKRVJSX0JNUF9DT0xPUlNQQUNFLCAiQk1QIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQorSk1FU1NBR0UoSkVSUl9CTVBfQ09NUFJFU1NFRCwgIlNvcnJ5LCBjb21wcmVzc2VkIEJNUHMgbm90IHlldCBzdXBwb3J0ZWQiKQorSk1FU1NBR0UoSkVSUl9CTVBfTk9ULCAiTm90IGEgQk1QIGZpbGUgLSBkb2VzIG5vdCBzdGFydCB3aXRoIEJNIikKK0pNRVNTQUdFKEpUUkNfQk1QLCAiJXV4JXUgMjQtYml0IEJNUCBpbWFnZSIpCitKTUVTU0FHRShKVFJDX0JNUF9NQVBQRUQsICIldXgldSA4LWJpdCBjb2xvcm1hcHBlZCBCTVAgaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19CTVBfT1MyLCAiJXV4JXUgMjQtYml0IE9TMiBCTVAgaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19CTVBfT1MyX01BUFBFRCwgIiV1eCV1IDgtYml0IGNvbG9ybWFwcGVkIE9TMiBCTVAgaW1hZ2UiKQorI2VuZGlmIC8qIEJNUF9TVVBQT1JURUQgKi8KKworI2lmZGVmIEdJRl9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfR0lGX0JVRywgIkdJRiBvdXRwdXQgZ290IGNvbmZ1c2VkIikKK0pNRVNTQUdFKEpFUlJfR0lGX0NPREVTSVpFLCAiQm9ndXMgR0lGIGNvZGVzaXplICVkIikKK0pNRVNTQUdFKEpFUlJfR0lGX0NPTE9SU1BBQ0UsICJHSUYgb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCitKTUVTU0FHRShKRVJSX0dJRl9JTUFHRU5PVEZPVU5ELCAiVG9vIGZldyBpbWFnZXMgaW4gR0lGIGZpbGUiKQorSk1FU1NBR0UoSkVSUl9HSUZfTk9ULCAiTm90IGEgR0lGIGZpbGUiKQorSk1FU1NBR0UoSlRSQ19HSUYsICIldXgldXglZCBHSUYgaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19HSUZfQkFEVkVSU0lPTiwKKwkgIldhcm5pbmc6IHVuZXhwZWN0ZWQgR0lGIHZlcnNpb24gbnVtYmVyICclYyVjJWMnIikKK0pNRVNTQUdFKEpUUkNfR0lGX0VYVEVOU0lPTiwgIklnbm9yaW5nIEdJRiBleHRlbnNpb24gYmxvY2sgb2YgdHlwZSAweCUwMngiKQorSk1FU1NBR0UoSlRSQ19HSUZfTk9OU1FVQVJFLCAiQ2F1dGlvbjogbm9uc3F1YXJlIHBpeGVscyBpbiBpbnB1dCIpCitKTUVTU0FHRShKV1JOX0dJRl9CQUREQVRBLCAiQ29ycnVwdCBkYXRhIGluIEdJRiBmaWxlIikKK0pNRVNTQUdFKEpXUk5fR0lGX0NIQVIsICJCb2d1cyBjaGFyIDB4JTAyeCBpbiBHSUYgZmlsZSwgaWdub3JpbmciKQorSk1FU1NBR0UoSldSTl9HSUZfRU5EQ09ERSwgIlByZW1hdHVyZSBlbmQgb2YgR0lGIGltYWdlIikKK0pNRVNTQUdFKEpXUk5fR0lGX05PTU9SRURBVEEsICJSYW4gb3V0IG9mIEdJRiBiaXRzIikKKyNlbmRpZiAvKiBHSUZfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQUE1fU1VQUE9SVEVECitKTUVTU0FHRShKRVJSX1BQTV9DT0xPUlNQQUNFLCAiUFBNIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQorSk1FU1NBR0UoSkVSUl9QUE1fTk9OTlVNRVJJQywgIk5vbm51bWVyaWMgZGF0YSBpbiBQUE0gZmlsZSIpCitKTUVTU0FHRShKRVJSX1BQTV9OT1QsICJOb3QgYSBQUE0vUEdNIGZpbGUiKQorSk1FU1NBR0UoSlRSQ19QR00sICIldXgldSBQR00gaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19QR01fVEVYVCwgIiV1eCV1IHRleHQgUEdNIGltYWdlIikKK0pNRVNTQUdFKEpUUkNfUFBNLCAiJXV4JXUgUFBNIGltYWdlIikKK0pNRVNTQUdFKEpUUkNfUFBNX1RFWFQsICIldXgldSB0ZXh0IFBQTSBpbWFnZSIpCisjZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUkxFX1NVUFBPUlRFRAorSk1FU1NBR0UoSkVSUl9STEVfQkFERVJST1IsICJCb2d1cyBlcnJvciBjb2RlIGZyb20gUkxFIGxpYnJhcnkiKQorSk1FU1NBR0UoSkVSUl9STEVfQ09MT1JTUEFDRSwgIlJMRSBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKK0pNRVNTQUdFKEpFUlJfUkxFX0RJTUVOU0lPTlMsICJJbWFnZSBkaW1lbnNpb25zICgldXgldSkgdG9vIGxhcmdlIGZvciBSTEUiKQorSk1FU1NBR0UoSkVSUl9STEVfRU1QVFksICJFbXB0eSBSTEUgZmlsZSIpCitKTUVTU0FHRShKRVJSX1JMRV9FT0YsICJQcmVtYXR1cmUgRU9GIGluIFJMRSBoZWFkZXIiKQorSk1FU1NBR0UoSkVSUl9STEVfTUVNLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgUkxFIGhlYWRlciIpCitKTUVTU0FHRShKRVJSX1JMRV9OT1QsICJOb3QgYW4gUkxFIGZpbGUiKQorSk1FU1NBR0UoSkVSUl9STEVfVE9PTUFOWUNIQU5ORUxTLCAiQ2Fubm90IGhhbmRsZSAlZCBvdXRwdXQgY2hhbm5lbHMgZm9yIFJMRSIpCitKTUVTU0FHRShKRVJSX1JMRV9VTlNVUFBPUlRFRCwgIkNhbm5vdCBoYW5kbGUgdGhpcyBSTEUgc2V0dXAiKQorSk1FU1NBR0UoSlRSQ19STEUsICIldXgldSBmdWxsLWNvbG9yIFJMRSBmaWxlIikKK0pNRVNTQUdFKEpUUkNfUkxFX0ZVTExNQVAsICIldXgldSBmdWxsLWNvbG9yIFJMRSBmaWxlIHdpdGggbWFwIG9mIGxlbmd0aCAlZCIpCitKTUVTU0FHRShKVFJDX1JMRV9HUkFZLCAiJXV4JXUgZ3JheXNjYWxlIFJMRSBmaWxlIikKK0pNRVNTQUdFKEpUUkNfUkxFX01BUEdSQVksICIldXgldSBncmF5c2NhbGUgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKK0pNRVNTQUdFKEpUUkNfUkxFX01BUFBFRCwgIiV1eCV1IGNvbG9ybWFwcGVkIFJMRSBmaWxlIHdpdGggbWFwIG9mIGxlbmd0aCAlZCIpCisjZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLworCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECitKTUVTU0FHRShKRVJSX1RHQV9CQURDTUFQLCAiVW5zdXBwb3J0ZWQgVGFyZ2EgY29sb3JtYXAgZm9ybWF0IikKK0pNRVNTQUdFKEpFUlJfVEdBX0JBRFBBUk1TLCAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBUYXJnYSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfVEdBX0NPTE9SU1BBQ0UsICJUYXJnYSBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKK0pNRVNTQUdFKEpUUkNfVEdBLCAiJXV4JXUgUkdCIFRhcmdhIGltYWdlIikKK0pNRVNTQUdFKEpUUkNfVEdBX0dSQVksICIldXgldSBncmF5c2NhbGUgVGFyZ2EgaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19UR0FfTUFQUEVELCAiJXV4JXUgY29sb3JtYXBwZWQgVGFyZ2EgaW1hZ2UiKQorI2Vsc2UKK0pNRVNTQUdFKEpFUlJfVEdBX05PVENPTVAsICJUYXJnYSBzdXBwb3J0IHdhcyBub3QgY29tcGlsZWQiKQorI2VuZGlmIC8qIFRBUkdBX1NVUFBPUlRFRCAqLworCitKTUVTU0FHRShKRVJSX0JBRF9DTUFQX0ZJTEUsCisJICJDb2xvciBtYXAgZmlsZSBpcyBpbnZhbGlkIG9yIG9mIHVuc3VwcG9ydGVkIGZvcm1hdCIpCitKTUVTU0FHRShKRVJSX1RPT19NQU5ZX0NPTE9SUywKKwkgIk91dHB1dCBmaWxlIGZvcm1hdCBjYW5ub3QgaGFuZGxlICVkIGNvbG9ybWFwIGVudHJpZXMiKQorSk1FU1NBR0UoSkVSUl9VTkdFVENfRkFJTEVELCAidW5nZXRjIGZhaWxlZCIpCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECitKTUVTU0FHRShKRVJSX1VOS05PV05fRk9STUFULAorCSAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgZm9ybWF0IC0tLSBwZXJoYXBzIHlvdSBuZWVkIC10YXJnYSIpCisjZWxzZQorSk1FU1NBR0UoSkVSUl9VTktOT1dOX0ZPUk1BVCwgIlVucmVjb2duaXplZCBpbnB1dCBmaWxlIGZvcm1hdCIpCisjZW5kaWYKK0pNRVNTQUdFKEpFUlJfVU5TVVBQT1JURURfRk9STUFULCAiVW5zdXBwb3J0ZWQgb3V0cHV0IGZpbGUgZm9ybWF0IikKKworI2lmZGVmIEpNQUtFX0VOVU1fTElTVAorCisgIEpNU0dfTEFTVEFERE9OQ09ERQorfSBBRERPTl9NRVNTQUdFX0NPREU7CisKKyN1bmRlZiBKTUFLRV9FTlVNX0xJU1QKKyNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KKworLyogWmFwIEpNRVNTQUdFIG1hY3JvIHNvIHRoYXQgZnV0dXJlIHJlLWluY2x1c2lvbnMgZG8gbm90aGluZyBieSBkZWZhdWx0ICovCisjdW5kZWYgSk1FU1NBR0UKZGlmZiAtLWdpdCBhL2pwZWcvY2RqcGVnLmMgYi9qcGVnL2NkanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjUwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2NkanBlZy5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogY2RqcGVnLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gc3VwcG9ydCByb3V0aW5lcyB1c2VkIGJ5IHRoZSBJSkcgYXBwbGljYXRpb24KKyAqIHByb2dyYW1zIChjanBlZywgZGpwZWcsIGpwZWd0cmFuKS4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzdXBwZXIoKSwgdG9sb3dlcigpICovCisjaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorI2luY2x1ZGUgPHNpZ25hbC5oPgkJLyogdG8gZGVjbGFyZSBzaWduYWwoKSAqLworI2VuZGlmCisjaWZkZWYgVVNFX1NFVE1PREUKKyNpbmNsdWRlIDxmY250bC5oPgkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkncyBwYXJhbWV0ZXIgbWFjcm9zICovCisvKiBJZiB5b3UgaGF2ZSBzZXRtb2RlKCkgYnV0IG5vdCA8aW8uaD4sIGp1c3QgZGVsZXRlIHRoaXMgbGluZTogKi8KKyNpbmNsdWRlIDxpby5oPgkJCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpICovCisjZW5kaWYKKworCisvKgorICogU2lnbmFsIGNhdGNoZXIgdG8gZW5zdXJlIHRoYXQgdGVtcG9yYXJ5IGZpbGVzIGFyZSByZW1vdmVkIGJlZm9yZSBhYm9ydGluZy4KKyAqIE5COiBmb3IgQW1pZ2EgTWFueCBDIHRoaXMgaXMgYWN0dWFsbHkgYSBnbG9iYWwgcm91dGluZSBuYW1lZCBfYWJvcnQoKTsKKyAqIHdlIHB1dCAiI2RlZmluZSBzaWduYWxfY2F0Y2hlciBfYWJvcnQiIGluIGpjb25maWcuaC4gIFRhbGsgYWJvdXQgYm9ndXMuLi4KKyAqLworCisjaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCitzdGF0aWMgal9jb21tb25fcHRyIHNpZ19jaW5mbzsKKwordm9pZAkJCQkvKiBtdXN0IGJlIGdsb2JhbCBmb3IgTWFueCBDICovCitzaWduYWxfY2F0Y2hlciAoaW50IHNpZ251bSkKK3sKKyAgaWYgKHNpZ19jaW5mbyAhPSBOVUxMKSB7CisgICAgaWYgKHNpZ19jaW5mby0+ZXJyICE9IE5VTEwpIC8qIHR1cm4gb2ZmIHRyYWNlIG91dHB1dCAqLworICAgICAgc2lnX2NpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKKyAgICBqcGVnX2Rlc3Ryb3koc2lnX2NpbmZvKTsJLyogY2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRpb24gJiB0ZW1wIGZpbGVzICovCisgIH0KKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKK0dMT0JBTCh2b2lkKQorZW5hYmxlX3NpZ25hbF9jYXRjaGVyIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIHNpZ19jaW5mbyA9IGNpbmZvOworI2lmZGVmIFNJR0lOVAkJCS8qIG5vdCBhbGwgc3lzdGVtcyBoYXZlIFNJR0lOVCAqLworICBzaWduYWwoU0lHSU5ULCBzaWduYWxfY2F0Y2hlcik7CisjZW5kaWYKKyNpZmRlZiBTSUdURVJNCQkJLyogbm90IGFsbCBzeXN0ZW1zIGhhdmUgU0lHVEVSTSAqLworICBzaWduYWwoU0lHVEVSTSwgc2lnbmFsX2NhdGNoZXIpOworI2VuZGlmCit9CisKKyNlbmRpZgorCisKKy8qCisgKiBPcHRpb25hbCBwcm9ncmVzcyBtb25pdG9yOiBkaXNwbGF5IGEgcGVyY2VudC1kb25lIGZpZ3VyZSBvbiBzdGRlcnIuCisgKi8KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorCitNRVRIT0RERUYodm9pZCkKK3Byb2dyZXNzX21vbml0b3IgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2cgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisgIGludCB0b3RhbF9wYXNzZXMgPSBwcm9nLT5wdWIudG90YWxfcGFzc2VzICsgcHJvZy0+dG90YWxfZXh0cmFfcGFzc2VzOworICBpbnQgcGVyY2VudF9kb25lID0gKGludCkgKHByb2ctPnB1Yi5wYXNzX2NvdW50ZXIqMTAwTC9wcm9nLT5wdWIucGFzc19saW1pdCk7CisKKyAgaWYgKHBlcmNlbnRfZG9uZSAhPSBwcm9nLT5wZXJjZW50X2RvbmUpIHsKKyAgICBwcm9nLT5wZXJjZW50X2RvbmUgPSBwZXJjZW50X2RvbmU7CisgICAgaWYgKHRvdGFsX3Bhc3NlcyA+IDEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXHJQYXNzICVkLyVkOiAlM2QlJSAiLAorCSAgICAgIHByb2ctPnB1Yi5jb21wbGV0ZWRfcGFzc2VzICsgcHJvZy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcyArIDEsCisJICAgICAgdG90YWxfcGFzc2VzLCBwZXJjZW50X2RvbmUpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxyICUzZCUlICIsIHBlcmNlbnRfZG9uZSk7CisgICAgfQorICAgIGZmbHVzaChzdGRlcnIpOworICB9Cit9CisKKworR0xPQkFMKHZvaWQpCitzdGFydF9wcm9ncmVzc19tb25pdG9yIChqX2NvbW1vbl9wdHIgY2luZm8sIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcykKK3sKKyAgLyogRW5hYmxlIHByb2dyZXNzIGRpc3BsYXksIHVubGVzcyB0cmFjZSBvdXRwdXQgaXMgb24gKi8KKyAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID09IDApIHsKKyAgICBwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IgPSBwcm9ncmVzc19tb25pdG9yOworICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzID0gMDsKKyAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzID0gMDsKKyAgICBwcm9ncmVzcy0+cGVyY2VudF9kb25lID0gLTE7CisgICAgY2luZm8tPnByb2dyZXNzID0gJnByb2dyZXNzLT5wdWI7CisgIH0KK30KKworCitHTE9CQUwodm9pZCkKK2VuZF9wcm9ncmVzc19tb25pdG9yIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIENsZWFyIGF3YXkgcHJvZ3Jlc3MgZGlzcGxheSAqLworICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiXHIgICAgICAgICAgICAgICAgXHIiKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgfQorfQorCisjZW5kaWYKKworCisvKgorICogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiBwb3NzaWJseS1hYmJyZXZpYXRlZCBrZXl3b3JkIHN3aXRjaGVzLgorICoga2V5d29yZCBpcyB0aGUgY29uc3RhbnQga2V5d29yZCAobXVzdCBiZSBsb3dlciBjYXNlIGFscmVhZHkpLAorICogbWluY2hhcnMgaXMgbGVuZ3RoIG9mIG1pbmltdW0gbGVnYWwgYWJicmV2aWF0aW9uLgorICovCisKK0dMT0JBTChib29sZWFuKQora2V5bWF0Y2ggKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpCit7CisgIHJlZ2lzdGVyIGludCBjYSwgY2s7CisgIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7CisKKyAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgeworICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQorICAgICAgcmV0dXJuIEZBTFNFOwkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KKyAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLworICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKKyAgICBpZiAoY2EgIT0gY2spCisgICAgICByZXR1cm4gRkFMU0U7CQkvKiBubyBnb29kICovCisgICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KKyAgfQorICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLworICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKKyAgICByZXR1cm4gRkFMU0U7CisgIHJldHVybiBUUlVFOwkJCS8qIEEtT0sgKi8KK30KKworCisvKgorICogUm91dGluZXMgdG8gZXN0YWJsaXNoIGJpbmFyeSBJL08gbW9kZSBmb3Igc3RkaW4gYW5kIHN0ZG91dC4KKyAqIE5vbi1Vbml4IHN5c3RlbXMgb2Z0ZW4gcmVxdWlyZSBzb21lIGhhY2tpbmcgdG8gZ2V0IG91dCBvZiB0ZXh0IG1vZGUuCisgKi8KKworR0xPQkFMKEZJTEUgKikKK3JlYWRfc3RkaW4gKHZvaWQpCit7CisgIEZJTEUgKiBpbnB1dF9maWxlID0gc3RkaW47CisKKyNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KKyAgc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCisgIGlmICgoaW5wdXRfZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZW9wZW4gc3RkaW5cbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBpbnB1dF9maWxlOworfQorCisKK0dMT0JBTChGSUxFICopCit3cml0ZV9zdGRvdXQgKHZvaWQpCit7CisgIEZJTEUgKiBvdXRwdXRfZmlsZSA9IHN0ZG91dDsKKworI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLworICBzZXRtb2RlKGZpbGVubyhzdGRvdXQpLCBPX0JJTkFSWSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCisgIGlmICgob3V0cHV0X2ZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZG91dCksIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZW9wZW4gc3Rkb3V0XG4iKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gb3V0cHV0X2ZpbGU7Cit9CmRpZmYgLS1naXQgYS9qcGVnL2NkanBlZy5oIGIvanBlZy9jZGpwZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM4N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9jZGpwZWcuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIGNkanBlZy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMKKyAqIGNqcGVnIGFuZCBkanBlZy4gIEl0IGlzIE5PVCB1c2VkIGJ5IHRoZSBjb3JlIEpQRUcgbGlicmFyeS4KKyAqLworCisjZGVmaW5lIEpQRUdfQ0pQRUdfREpQRUcJLyogZGVmaW5lIHByb3BlciBvcHRpb25zIGluIGpjb25maWcuaCAqLworI2RlZmluZSBKUEVHX0lOVEVSTkFMX09QVElPTlMJLyogY2pwZWcuYyxkanBlZy5jIG5lZWQgdG8gc2VlIHh4eF9TVVBQT1JURUQgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIJCS8qIGdldCBsaWJyYXJ5IGVycm9yIGNvZGVzIHRvbyAqLworI2luY2x1ZGUgImNkZXJyb3IuaCIJCS8qIGdldCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBjb2RlcyAqLworCisKKy8qCisgKiBPYmplY3QgaW50ZXJmYWNlIGZvciBjanBlZydzIHNvdXJjZSBmaWxlIGRlY29kaW5nIG1vZHVsZXMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0ICogY2pwZWdfc291cmNlX3B0cjsKKworc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X2lucHV0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7CisgIEpNRVRIT0QoSkRJTUVOU0lPTiwgZ2V0X3BpeGVsX3Jvd3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9pbnB1dCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKKworICBGSUxFICppbnB1dF9maWxlOworCisgIEpTQU1QQVJSQVkgYnVmZmVyOworICBKRElNRU5TSU9OIGJ1ZmZlcl9oZWlnaHQ7Cit9OworCisKKy8qCisgKiBPYmplY3QgaW50ZXJmYWNlIGZvciBkanBlZydzIG91dHB1dCBmaWxlIGVuY29kaW5nIG1vZHVsZXMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCAqIGRqcGVnX2Rlc3RfcHRyOworCitzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgeworICAvKiBzdGFydF9vdXRwdXQgaXMgY2FsbGVkIGFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBmaW5pc2hlcy4KKyAgICogVGhlIGNvbG9yIG1hcCB3aWxsIGJlIHJlYWR5IGF0IHRoaXMgdGltZSwgaWYgb25lIGlzIG5lZWRlZC4KKyAgICovCisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfb3V0cHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgICBkanBlZ19kZXN0X3B0ciBkaW5mbykpOworICAvKiBFbWl0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBpeGVsIHJvd3MgZnJvbSB0aGUgYnVmZmVyLiAqLworICBKTUVUSE9EKHZvaWQsIHB1dF9waXhlbF9yb3dzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCQkJIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkpOworICAvKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICovCisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX291dHB1dCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJZGpwZWdfZGVzdF9wdHIgZGluZm8pKTsKKworICAvKiBUYXJnZXQgZmlsZSBzcGVjOyBmaWxsZWQgaW4gYnkgZGpwZWcuYyBhZnRlciBvYmplY3QgaXMgY3JlYXRlZC4gKi8KKyAgRklMRSAqIG91dHB1dF9maWxlOworCisgIC8qIE91dHB1dCBwaXhlbC1yb3cgYnVmZmVyLiAgQ3JlYXRlZCBieSBtb2R1bGUgaW5pdCBvciBzdGFydF9vdXRwdXQuCisgICAqIFdpZHRoIGlzIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHM7CisgICAqIGhlaWdodCBpcyBidWZmZXJfaGVpZ2h0LgorICAgKi8KKyAgSlNBTVBBUlJBWSBidWZmZXI7CisgIEpESU1FTlNJT04gYnVmZmVyX2hlaWdodDsKK307CisKKworLyoKKyAqIGNqcGVnL2RqcGVnIG1heSBuZWVkIHRvIHBlcmZvcm0gZXh0cmEgcGFzc2VzIHRvIGNvbnZlcnQgdG8gb3IgZnJvbQorICogdGhlIHNvdXJjZS9kZXN0aW5hdGlvbiBmaWxlIGZvcm1hdC4gIFRoZSBKUEVHIGxpYnJhcnkgZG9lcyBub3Qga25vdworICogYWJvdXQgdGhlc2UgcGFzc2VzLCBidXQgd2UnZCBsaWtlIHRoZW0gdG8gYmUgY291bnRlZCBieSB0aGUgcHJvZ3Jlc3MKKyAqIG1vbml0b3IuICBXZSB1c2UgYW4gZXhwYW5kZWQgcHJvZ3Jlc3MgbW9uaXRvciBvYmplY3QgdG8gaG9sZCB0aGUKKyAqIGFkZGl0aW9uYWwgcGFzcyBjb3VudC4KKyAqLworCitzdHJ1Y3QgY2RqcGVnX3Byb2dyZXNzX21nciB7CisgIHN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciBwdWI7CS8qIGZpZWxkcyBrbm93biB0byBKUEVHIGxpYnJhcnkgKi8KKyAgaW50IGNvbXBsZXRlZF9leHRyYV9wYXNzZXM7CS8qIGV4dHJhIHBhc3NlcyBjb21wbGV0ZWQgKi8KKyAgaW50IHRvdGFsX2V4dHJhX3Bhc3NlczsJLyogdG90YWwgZXh0cmEgKi8KKyAgLyogbGFzdCBwcmludGVkIHBlcmNlbnRhZ2Ugc3RvcmVkIGhlcmUgdG8gYXZvaWQgbXVsdGlwbGUgcHJpbnRvdXRzICovCisgIGludCBwZXJjZW50X2RvbmU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyICogY2RfcHJvZ3Jlc3NfcHRyOworCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqaW5pdF9yZWFkX2JtcAkJaklSZEJNUAorI2RlZmluZSBqaW5pdF93cml0ZV9ibXAJCWpJV3JCTVAKKyNkZWZpbmUgamluaXRfcmVhZF9naWYJCWpJUmRHSUYKKyNkZWZpbmUgamluaXRfd3JpdGVfZ2lmCQlqSVdyR0lGCisjZGVmaW5lIGppbml0X3JlYWRfcHBtCQlqSVJkUFBNCisjZGVmaW5lIGppbml0X3dyaXRlX3BwbQkJaklXclBQTQorI2RlZmluZSBqaW5pdF9yZWFkX3JsZQkJaklSZFJMRQorI2RlZmluZSBqaW5pdF93cml0ZV9ybGUJCWpJV3JSTEUKKyNkZWZpbmUgamluaXRfcmVhZF90YXJnYQlqSVJkVGFyZ2EKKyNkZWZpbmUgamluaXRfd3JpdGVfdGFyZ2EJaklXclRhcmdhCisjZGVmaW5lIHJlYWRfcXVhbnRfdGFibGVzCVJkUVRhYmxlcworI2RlZmluZSByZWFkX3NjYW5fc2NyaXB0CVJkU2NuU2NyaXB0CisjZGVmaW5lIHNldF9xdWFudF9zbG90cwkJU2V0UVNsb3RzCisjZGVmaW5lIHNldF9zYW1wbGVfZmFjdG9ycwlTZXRTRmFjdHMKKyNkZWZpbmUgcmVhZF9jb2xvcl9tYXAJCVJkQ01hcAorI2RlZmluZSBlbmFibGVfc2lnbmFsX2NhdGNoZXIJRW5TaWdDYXRjaGVyCisjZGVmaW5lIHN0YXJ0X3Byb2dyZXNzX21vbml0b3IJU3RQcm9nTW9uCisjZGVmaW5lIGVuZF9wcm9ncmVzc19tb25pdG9yCUVuUHJvZ01vbgorI2RlZmluZSByZWFkX3N0ZGluCQlSZFN0ZGluCisjZGVmaW5lIHdyaXRlX3N0ZG91dAkJV3JTdGRvdXQKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKy8qIE1vZHVsZSBzZWxlY3Rpb24gcm91dGluZXMgZm9yIEkvTyBtb2R1bGVzLiAqLworCitFWFRFUk4oY2pwZWdfc291cmNlX3B0cikgamluaXRfcmVhZF9ibXAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV9ibXAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgYm9vbGVhbiBpc19vczIpKTsKK0VYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX2dpZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX2dpZiBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX3BwbSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX3BwbSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX3JsZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX3JsZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX3RhcmdhIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfdGFyZ2EgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIGNqcGVnIHN1cHBvcnQgcm91dGluZXMgKGluIHJkc3dpdGNoLmMpICovCisKK0VYVEVSTihib29sZWFuKSByZWFkX3F1YW50X3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICogZmlsZW5hbWUsCisJCQkJICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKK0VYVEVSTihib29sZWFuKSByZWFkX3NjYW5fc2NyaXB0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSkpOworRVhURVJOKGJvb2xlYW4pIHNldF9xdWFudF9zbG90cyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpKTsKK0VYVEVSTihib29sZWFuKSBzZXRfc2FtcGxlX2ZhY3RvcnMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKSk7CisKKy8qIGRqcGVnIHN1cHBvcnQgcm91dGluZXMgKGluIHJkY29sbWFwLmMpICovCisKK0VYVEVSTih2b2lkKSByZWFkX2NvbG9yX21hcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpKTsKKworLyogY29tbW9uIHN1cHBvcnQgcm91dGluZXMgKGluIGNkanBlZy5jKSAqLworCitFWFRFUk4odm9pZCkgZW5hYmxlX3NpZ25hbF9jYXRjaGVyIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvciBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkJIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcykpOworRVhURVJOKHZvaWQpIGVuZF9wcm9ncmVzc19tb25pdG9yIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CitFWFRFUk4oYm9vbGVhbikga2V5bWF0Y2ggSlBQKChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKSk7CitFWFRFUk4oRklMRSAqKSByZWFkX3N0ZGluIEpQUCgodm9pZCkpOworRVhURVJOKEZJTEUgKikgd3JpdGVfc3Rkb3V0IEpQUCgodm9pZCkpOworCisvKiBtaXNjZWxsYW5lb3VzIHVzZWZ1bCBtYWNyb3MgKi8KKworI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKKyNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3IgorI2Vsc2UKKyNpZmRlZiBWTVMJCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiLCAiY3R4PXN0bSIKKyNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIsICJjdHg9c3RtIgorI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCisjZGVmaW5lIFdSSVRFX0JJTkFSWQkid2IiCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KKyNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCisjZW5kaWYKKyNpZm5kZWYgRVhJVF9TVUNDRVNTCisjaWZkZWYgVk1TCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KKyNlbHNlCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMAorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgRVhJVF9XQVJOSU5HCisjaWZkZWYgVk1TCisjZGVmaW5lIEVYSVRfV0FSTklORyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KKyNlbHNlCisjZGVmaW5lIEVYSVRfV0FSTklORyAgMgorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2pwZWcvY2hhbmdlLmxvZyBiL2pwZWcvY2hhbmdlLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEwMmMwCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9jaGFuZ2UubG9nCkBAIC0wLDAgKzEsMjE3IEBACitDSEFOR0UgTE9HIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQorCisKK1ZlcnNpb24gNmIgIDI3LU1hci0xOTk4CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitqcGVndHJhbiBoYXMgbmV3IGZlYXR1cmVzIGZvciBsb3NzbGVzcyBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMgKHJvdGF0aW9uCithbmQgZmxpcHBpbmcpIGFzIHdlbGwgYXMgImxvc3NsZXNzIiByZWR1Y3Rpb24gdG8gZ3JheXNjYWxlLgorCitqcGVndHJhbiBub3cgY29waWVzIGNvbW1lbnRzIGJ5IGRlZmF1bHQ7IGl0IGhhcyBhIC1jb3B5IHN3aXRjaCB0byBlbmFibGUKK2NvcHlpbmcgYWxsIEFQUG4gYmxvY2tzIGFzIHdlbGwsIG9yIHRvIHN1cHByZXNzIGNvbW1lbnRzLiAgKEZvcm1lcmx5IGl0CithbHdheXMgc3VwcHJlc3NlZCBjb21tZW50cyBhbmQgQVBQbiBibG9ja3MuKSAganBlZ3RyYW4gbm93IGFsc28gcHJlc2VydmVzCitKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24uCisKK05ldyBkZWNvbXByZXNzb3IgbGlicmFyeSBmZWF0dXJlOiBDT00gYW5kIEFQUG4gbWFya2VycyBmb3VuZCBpbiB0aGUgaW5wdXQKK2ZpbGUgY2FuIGJlIHNhdmVkIGluIG1lbW9yeSBmb3IgbGF0ZXIgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIChCZWZvcmUsCit5b3UgaGFkIHRvIGNvZGUgdGhpcyB1cCB5b3Vyc2VsZiB3aXRoIGEgY3VzdG9tIG1hcmtlciBwcm9jZXNzb3IuKQorCitUaGVyZSBpcyBhbiB1bnVzZWQgZmllbGQgInZvaWQgKiBjbGllbnRfZGF0YSIgbm93IGluIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzCitwYXJhbWV0ZXIgc3RydWN0czsgdGhpcyBtYXkgYmUgdXNlZnVsIGluIHNvbWUgYXBwbGljYXRpb25zLgorCitKRklGIHZlcnNpb24gbnVtYmVyIGluZm9ybWF0aW9uIGlzIG5vdyBzYXZlZCBieSB0aGUgZGVjb2RlciBhbmQgYWNjZXB0ZWQgYnkKK3RoZSBlbmNvZGVyLiAganBlZ3RyYW4gdXNlcyB0aGlzIHRvIGNvcHkgdGhlIHNvdXJjZSBmaWxlJ3MgdmVyc2lvbiBudW1iZXIsCit0byBlbnN1cmUgImpwZWd0cmFuIC1jb3B5IGFsbCIgd29uJ3QgY3JlYXRlIGJvZ3VzIGZpbGVzIHRoYXQgY29udGFpbiBKRlhYCitleHRlbnNpb25zIGJ1dCBjbGFpbSB0byBiZSB2ZXJzaW9uIDEuMDEuICBBcHBsaWNhdGlvbnMgdGhhdCBnZW5lcmF0ZSB0aGVpcgorb3duIEpGWFggZXh0ZW5zaW9uIG1hcmtlcnMgYWxzbyAoZmluYWxseSkgaGF2ZSBhIHN1cHBvcnRlZCB3YXkgdG8gY2F1c2UgdGhlCitlbmNvZGVyIHRvIGVtaXQgSkZJRiB2ZXJzaW9uIG51bWJlciAxLjAyLgorCitkanBlZydzIHRyYWNlIG1vZGUgcmVwb3J0cyBKRklGIDEuMDIgdGh1bWJuYWlsIGltYWdlcyBhcyBzdWNoLCByYXRoZXIKK3RoYW4gYXMgdW5rbm93biBBUFAwIG1hcmtlcnMuCisKK0luIC12ZXJib3NlIG1vZGUsIGRqcGVnIGFuZCByZGpwZ2NvbSB3aWxsIHRyeSB0byBwcmludCB0aGUgY29udGVudHMgb2YKK0FQUDEyIG1hcmtlcnMgYXMgdGV4dC4gIFNvbWUgZGlnaXRhbCBjYW1lcmFzIHN0b3JlIHVzZWZ1bCB0ZXh0IGluZm9ybWF0aW9uCitpbiBBUFAxMiBtYXJrZXJzLgorCitIYW5kbGluZyBvZiB0cnVuY2F0ZWQgZGF0YSBzdHJlYW1zIGlzIG1vcmUgcm9idXN0OiBibG9ja3MgYmV5b25kIHRoZSBvbmUgaW4KK3doaWNoIHRoZSBlcnJvciBvY2N1cnMgd2lsbCBiZSBvdXRwdXQgYXMgdW5pZm9ybSBncmF5LCBvciBsZWZ0IHVuY2hhbmdlZAoraWYgZGVjb2RpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHLiAgVGhlIGFwcGVhcmFuY2Ugbm8gbG9uZ2VyIGRlcGVuZHMgb24gdGhlCitIdWZmbWFuIHRhYmxlcyBiZWluZyB1c2VkLgorCitIdWZmbWFuIHRhYmxlcyBhcmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkgbXVjaCBtb3JlIGNhcmVmdWxseSB0aGFuIGJlZm9yZS4KKworVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LCBkanBlZydzIEdJRiBvdXRwdXQgY2FwYWJpbGl0eSBoYXMgYmVlbgorY2hhbmdlZCB0byBwcm9kdWNlICJ1bmNvbXByZXNzZWQgR0lGcyIsIGFuZCBjanBlZydzIEdJRiBpbnB1dCBjYXBhYmlsaXR5CitoYXMgYmVlbiByZW1vdmVkIGFsdG9nZXRoZXIuICBXZSdyZSBub3QgaGFwcHkgYWJvdXQgaXQgZWl0aGVyLCBidXQgdGhlcmUKK3NlZW1zIHRvIGJlIG5vIGdvb2QgYWx0ZXJuYXRpdmUuCisKK1RoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBzdXBwb3J0cyBidWlsZGluZyBsaWJqcGVnIGFzIGEgc2hhcmVkIGxpYnJhcnkKK29uIG1hbnkgZmxhdm9ycyBvZiBVbml4IChhbGwgdGhlIG9uZXMgdGhhdCBHTlUgbGlidG9vbCBrbm93cyBob3cgdG8KK2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgZm9yKS4gIFVzZSAiLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIiB0bwordHJ5IHRoaXMgb3V0LgorCitOZXcgamNvbmZpZyBmaWxlIGFuZCBtYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIGFuZCBEZXZlbG9wZXIgU3R1ZGlvLgorQWxzbywgYSBqY29uZmlnIGZpbGUgYW5kIGEgYnVpbGQgc2NyaXB0IGZvciBNZXRyb3dlcmtzIENvZGVXYXJyaW9yCitvbiBBcHBsZSBNYWNpbnRvc2guICBtYWtlZmlsZS5kaiBoYXMgYmVlbiB1cGRhdGVkIGZvciBESkdQUCB2MiwgYW5kIHRoZXJlCithcmUgbWlzY2VsbGFuZW91cyBvdGhlciBtaW5vciBpbXByb3ZlbWVudHMgaW4gdGhlIG1ha2VmaWxlcy4KKworam1lbW1hYy5jIG5vdyBrbm93cyBob3cgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBmb2xsb3dpbmcgTWFjIFN5c3RlbSA3Citjb252ZW50aW9ucy4KKworZGpwZWcncyAtbWFwIHN3aXRjaCBpcyBub3cgYWJsZSB0byByZWFkIHJhdy1mb3JtYXQgUFBNIGZpbGVzIHJlbGlhYmx5LgorCitjanBlZyAtcHJvZ3Jlc3NpdmUgLXJlc3RhcnQgbm8gbG9uZ2VyIGdlbmVyYXRlcyBhbnkgdW5uZWNlc3NhcnkgRFJJIG1hcmtlcnMuCisKK011bHRpcGxlIGNhbGxzIHRvIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGZvciBhIHNpbmdsZSBKUEVHIG9iamVjdAorbm8gbG9uZ2VyIGxlYWsgbWVtb3J5LgorCisKK1ZlcnNpb24gNmEgIDctRmViLTk2CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWJyYXJ5IGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIG1vZGlmaWVkIHRvIGRldGVjdCB2ZXJzaW9uIG1pc21hdGNoZXMKK2FuZCBzdHJ1Y3QgZmllbGQgcGFja2luZyBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGluZyBhcHBsaWNhdGlvbi4KK1RoaXMgY2hhbmdlIHJlcXVpcmVzIGFwcGxpY2F0aW9ucyB0byBiZSByZWNvbXBpbGVkLCBidXQgZG9lcyBub3QgcmVxdWlyZQorYW55IGFwcGxpY2F0aW9uIHNvdXJjZSBjb2RlIGNoYW5nZS4KKworQWxsIHJvdXRpbmUgZGVjbGFyYXRpb25zIGNoYW5nZWQgdG8gdGhlIHN0eWxlICJHTE9CQUwodHlwZSkgbmFtZSAuLi4iLAordGhhdCBpcywgR0xPQkFMLCBMT0NBTCwgTUVUSE9EREVGLCBFWFRFUk4gYXJlIG5vdyBtYWNyb3MgdGFraW5nIHRoZQorcm91dGluZSdzIHJldHVybiB0eXBlIGFzIGFuIGFyZ3VtZW50LiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBhZGQKK01pY3Jvc29mdC1zdHlsZSBsaW5rYWdlIGtleXdvcmRzIHRvIGFsbCB0aGUgcm91dGluZXMgYnkgY2hhbmdpbmcganVzdAordGhlc2UgbWFjcm9zLiAgTm90ZSB0aGF0IGFueSBhcHBsaWNhdGlvbiBjb2RlIHRoYXQgd2FzIHVzaW5nIHRoZXNlIG1hY3Jvcword2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQuCisKK0RDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzIGFyZSBub3cgc3RvcmVkIGluIG5vcm1hbCBhcnJheSBvcmRlcgorcmF0aGVyIHRoYW4gemlnemFnIG9yZGVyLiAgQXBwbGljYXRpb24gY29kZSB0aGF0IGNhbGxzIGpwZWdfYWRkX3F1YW50X3RhYmxlLAorb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGVzIHF1YW50aXphdGlvbiB0YWJsZXMgZGlyZWN0bHksIHdpbGwgbmVlZCB0byBiZQorY2hhbmdlZC4gIElmIHlvdSBuZWVkIHRvIG1ha2Ugc3VjaCBjb2RlIHdvcmsgd2l0aCBlaXRoZXIgb2xkZXIgb3IgbmV3ZXIKK3ZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LCBhIHRlc3QgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjEiIGlzCityZWNvbW1lbmRlZC4KKworZGpwZWcncyB0cmFjZSBjYXBhYmlsaXR5IG5vdyBkdW1wcyBEUVQgdGFibGVzIGluIG5hdHVyYWwgb3JkZXIsIG5vdCB6aWd6YWcKK29yZGVyLiAgVGhpcyBhbGxvd3MgdGhlIHRyYWNlIG91dHB1dCB0byBiZSBtYWRlIGludG8gYSAiLXF0YWJsZXMiIGZpbGUKK21vcmUgZWFzaWx5LgorCitOZXcgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlciBtb2R1bGUgZm9yIHVzZSBvbiBBcHBsZSBNYWNpbnRvc2guCisKK0ZpeCBidWcgaW4gY2pwZWcncyAtc21vb3RoIG9wdGlvbjogbGFzdCBvbmUgb3IgdHdvIHNjYW5saW5lcyB3b3VsZCBiZQorZHVwbGljYXRlcyBvZiB0aGUgcHJpb3IgbGluZSB1bmxlc3MgdGhlIGltYWdlIGhlaWdodCBtb2QgMTYgd2FzIDEgb3IgMi4KKworUmVwYWlyIG1pbm9yIHByb2JsZW1zIGluIFZNUywgQkNDLCBNQzYgbWFrZWZpbGVzLgorCitOZXcgY29uZmlndXJlIHNjcmlwdCBiYXNlZCBvbiBsYXRlc3QgR05VIEF1dG9jb25mLgorCitDb3JyZWN0IHRoZSBsaXN0IG9mIGluY2x1ZGUgZmlsZXMgbmVlZGVkIGJ5IE1ldHJvV2Vya3MgQyBmb3IgY2NvbW1hbmQoKS4KKworTnVtZXJvdXMgc21hbGwgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorCisKK1ZlcnNpb24gNiAgMi1BdWctOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0OiBsaWJyYXJ5IGNhbiByZWFkIGFuZCB3cml0ZSBmdWxsIHByb2dyZXNzaXZlIEpQRUcKK2ZpbGVzLiAgQSAiYnVmZmVyZWQgaW1hZ2UiIG1vZGUgc3VwcG9ydHMgaW5jcmVtZW50YWwgZGVjb2RpbmcgZm9yIG9uLXRoZS1mbHkKK2Rpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgaW1hZ2VzLiAgU2ltcGx5IHJlY29tcGlsaW5nIGFuIGV4aXN0aW5nIElKRy12NS1iYXNlZAorZGVjb2RlciB3aXRoIHY2IHNob3VsZCBhbGxvdyBpdCB0byByZWFkIHByb2dyZXNzaXZlIGZpbGVzLCB0aG91Z2ggb2YgY291cnNlCit3aXRob3V0IGFueSBzcGVjaWFsIHByb2dyZXNzaXZlIGRpc3BsYXkuCisKK05ldyAianBlZ3RyYW4iIGFwcGxpY2F0aW9uIHBlcmZvcm1zIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50CitKUEVHIGZvcm1hdHM7IHByaW1hcmlseSwgaXQgY2FuIGJlIHVzZWQgdG8gY29udmVydCBiYXNlbGluZSB0byBwcm9ncmVzc2l2ZQorSlBFRyBhbmQgdmljZSB2ZXJzYS4gIEluIHN1cHBvcnQgb2YganBlZ3RyYW4sIHRoZSBsaWJyYXJ5IG5vdyBhbGxvd3MgbG9zc2xlc3MKK3JlYWRpbmcgYW5kIHdyaXRpbmcgb2YgSlBFRyBmaWxlcyBhcyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzLiAgVGhpcyBhYmlsaXR5CittYXkgYmUgb2YgdXNlIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KKworTm90ZXMgZm9yIHByb2dyYW1tZXJzOgorKiBXZSBjaGFuZ2VkIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRvIGJlIGFibGUgdG8gc3VzcGVuZDsgdGhpcyBtYWtlcyBhbGwKK2RlY29kaW5nIG1vZGVzIGF2YWlsYWJsZSB0byBzdXNwZW5kaW5nLWlucHV0IGFwcGxpY2F0aW9ucy4gIEhvd2V2ZXIsCitleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCB1c2Ugc3VzcGVuZGluZyBpbnB1dCB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZAordG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgWW91IGRvbid0IG5lZWQgdG8KK2RvIGFueXRoaW5nIGlmIHlvdSBkb24ndCB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLgorKiBXZSBjaGFuZ2VkIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHZpcnR1YWwgYXJyYXkgcm91dGluZXM6IGFjY2Vzc192aXJ0X2FycmF5Cityb3V0aW5lcyBub3cgdGFrZSBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygcm93cyB0byBhY2Nlc3MgdGhpcyB0aW1lLiAgVGhlCitsYXN0IHBhcmFtZXRlciB0byByZXF1ZXN0X3ZpcnRfYXJyYXkgcm91dGluZXMgaXMgbm93IGludGVycHJldGVkIGFzIHRoZQorbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IG1heSBiZSBhY2Nlc3NlZCBhdCBvbmNlLCBidXQgbm90IG5lY2Vzc2FyaWx5Cit0aGUgaGVpZ2h0IG9mIGV2ZXJ5IGFjY2Vzcy4KKworCitWZXJzaW9uIDViICAxNS1NYXItOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb3JyZWN0IGJ1Z3Mgd2l0aCBncmF5c2NhbGUgaW1hZ2VzIGhhdmluZyB2X3NhbXBfZmFjdG9yID4gMS4KKworanBlZ193cml0ZV9yYXdfZGF0YSgpIG5vdyBzdXBwb3J0cyBvdXRwdXQgc3VzcGVuc2lvbi4KKworQ29ycmVjdCBidWdzIGluICJjb25maWd1cmUiIHNjcmlwdCBmb3IgY2FzZSBvZiBjb21waWxpbmcgaW4KK2EgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIG9uZSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMuCisKK1JlcGFpciBidWcgaW4ganF1YW50MS5jOiBzb21ldGltZXMgZGlkbid0IHVzZSBhcyBtYW55IGNvbG9ycyBhcyBpdCBjb3VsZC4KKworQm9ybGFuZCBDIG1ha2VmaWxlIGFuZCBqY29uZmlnIGZpbGUgd29yayB1bmRlciBlaXRoZXIgTVMtRE9TIG9yIE9TLzIuCisKK01pc2NlbGxhbmVvdXMgaW1wcm92ZW1lbnRzIHRvIGRvY3VtZW50YXRpb24uCisKKworVmVyc2lvbiA1YSAgNy1EZWMtOTQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NoYW5nZWQgY29sb3IgY29udmVyc2lvbiByb3VuZG9mZiBiZWhhdmlvciBzbyB0aGF0IGdyYXlzY2FsZSB2YWx1ZXMgYXJlCityZXByZXNlbnRlZCBleGFjdGx5LiAgKFRoaXMgY2F1c2VzIHRlc3QgaW1hZ2UgZmlsZXMgdG8gY2hhbmdlLikKKworTWFrZSBvcmRlcmVkIGRpdGhlciB1c2UgMTZ4MTYgaW5zdGVhZCBvZiA0eDQgcGF0dGVybiBmb3IgYSBzbWFsbCBxdWFsaXR5CitpbXByb3ZlbWVudC4KKworTmV3IGNvbmZpZ3VyZSBzY3JpcHQgYmFzZWQgb24gbGF0ZXN0IEdOVSBBdXRvY29uZi4KK0ZpeCBjb25maWd1cmUgc2NyaXB0IHRvIGhhbmRsZSBDRkxBR1MgY29ycmVjdGx5LgorUmVuYW1lICouYXV0byBmaWxlcyB0byAqLmNmZywgc28gdGhhdCBjb25maWd1cmUgc2NyaXB0IHN0aWxsIHdvcmtzIGlmCitmaWxlIG5hbWVzIGhhdmUgYmVlbiB0cnVuY2F0ZWQgZm9yIERPUy4KKworRml4IGJ1ZyBpbiByZGJtcC5jOiBkaWRuJ3QgYWxsb3cgZm9yIGV4dHJhIGRhdGEgYmV0d2VlbiBoZWFkZXIgYW5kIGltYWdlLgorCitNb2RpZnkgcmRwcG0uYy93cnBwbS5jIHRvIGhhbmRsZSAyLWJ5dGUgcmF3IFBQTS9QR00gZm9ybWF0cyBmb3IgMTItYml0IGRhdGEuCisKK0ZpeCBzZXZlcmFsIGJ1Z3MgaW4gcmRybGUuYy4KKworTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyBvcHRpb24gd2FzIGJyb2tlbi4KKworUmV2aXNlIGplcnJvci5oL2plcnJvci5jIGZvciBtb3JlIGZsZXhpYmlsaXR5IGluIG1lc3NhZ2UgdGFibGUuCisKK1JlcGFpciBvdmVyc2lnaHQgaW4gam1lbW5hbWUuYyBOT19NS1RFTVAgY2FzZTogZmlsZSBjb3VsZCBiZSB0aGVyZQorYnV0IHVucmVhZGFibGUuCisKKworVmVyc2lvbiA1ICAyNC1TZXAtOTQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZlcnNpb24gNSByZXByZXNlbnRzIGEgbmVhcmx5IGNvbXBsZXRlIHJlZGVzaWduIGFuZCByZXdyaXRlIG9mIHRoZSBJSkcKK3NvZnR3YXJlLiAgTWFqb3IgdXNlci12aXNpYmxlIGNoYW5nZXMgaW5jbHVkZToKKyAgKiBBdXRvbWF0aWMgY29uZmlndXJhdGlvbiBzaW1wbGlmaWVzIGluc3RhbGxhdGlvbiBmb3IgbW9zdCBVbml4IHN5c3RlbXMuCisgICogQSByYW5nZSBvZiBzcGVlZCB2cy4gaW1hZ2UgcXVhbGl0eSB0cmFkZW9mZnMgYXJlIHN1cHBvcnRlZC4KKyAgICBUaGlzIGluY2x1ZGVzIHJlc2l6aW5nIG9mIGFuIGltYWdlIGR1cmluZyBkZWNvbXByZXNzaW9uOiBzY2FsaW5nIGRvd24KKyAgICBieSBhIGZhY3RvciBvZiAxLzIsIDEvNCwgb3IgMS84IGlzIGhhbmRsZWQgdmVyeSBlZmZpY2llbnRseS4KKyAgKiBOZXcgcHJvZ3JhbXMgcmRqcGdjb20gYW5kIHdyanBnY29tIGFsbG93IGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbgorICAgIG9mIHRleHQgY29tbWVudHMgaW4gYSBKUEVHIGZpbGUuCisKK1RoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyJ3MgaW50ZXJmYWNlIHRvIHRoZSBsaWJyYXJ5IGhhcyBjaGFuZ2VkIGNvbXBsZXRlbHkuCitOb3RhYmxlIGltcHJvdmVtZW50cyBpbmNsdWRlOgorICAqIFdlIGhhdmUgZWxpbWluYXRlZCB0aGUgdXNlIG9mIGNhbGxiYWNrIHJvdXRpbmVzIGZvciBoYW5kbGluZyB0aGUKKyAgICB1bmNvbXByZXNzZWQgaW1hZ2UgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBub3cgc2VlcyB0aGUgbGlicmFyeSBhcyBhCisgICAgc2V0IG9mIHJvdXRpbmVzIHRoYXQgaXQgY2FsbHMgdG8gcmVhZCBvciB3cml0ZSBpbWFnZSBkYXRhIG9uIGEKKyAgICBzY2FubGluZS1ieS1zY2FubGluZSBiYXNpcy4KKyAgKiBUaGUgYXBwbGljYXRpb24gaW1hZ2UgZGF0YSBpcyByZXByZXNlbnRlZCBpbiBhIGNvbnZlbnRpb25hbCBpbnRlcmxlYXZlZC0KKyAgICBwaXhlbCBmb3JtYXQsIHJhdGhlciB0aGFuIGFzIGEgc2VwYXJhdGUgYXJyYXkgZm9yIGVhY2ggY29sb3IgY2hhbm5lbC4KKyAgICBUaGlzIGNhbiBzYXZlIGEgY29weWluZyBzdGVwIGluIG1hbnkgcHJvZ3JhbXMuCisgICogVGhlIGhhbmRsaW5nIG9mIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBjbGVhbmVkIHVwOiB0aGUgYXBwbGljYXRpb24gY2FuCisgICAgc3VwcGx5IHJvdXRpbmVzIHRvIHNvdXJjZSBvciBzaW5rIHRoZSBjb21wcmVzc2VkIGRhdGEuICBJdCBpcyBwb3NzaWJsZSB0bworICAgIHN1c3BlbmQgcHJvY2Vzc2luZyBvbiBzb3VyY2Uvc2luayBidWZmZXIgb3ZlcnJ1biwgYWx0aG91Z2ggdGhpcyBpcyBub3QKKyAgICBzdXBwb3J0ZWQgaW4gYWxsIG9wZXJhdGluZyBtb2Rlcy4KKyAgKiBBbGwgc3RhdGljIHN0YXRlIGhhcyBiZWVuIGVsaW1pbmF0ZWQgZnJvbSB0aGUgbGlicmFyeSwgc28gdGhhdCBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBvZiBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGNhbiBiZSBhY3RpdmUgY29uY3VycmVudGx5LgorICAqIEpQRUcgYWJicmV2aWF0ZWQgZGF0YXN0cmVhbSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGllLCBxdWFudGl6YXRpb24gYW5kCisgICAgSHVmZm1hbiB0YWJsZXMgY2FuIGJlIHN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGltYWdlIGRhdGEuCisgICogQW5kIG5vdCBvbmx5IHRoYXQsIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBoYXMgaW1wcm92ZWQKKyAgICBjb25zaWRlcmFibHkhCisKKworVGhlIGxhc3Qgd2lkZWx5IHVzZWQgcmVsZWFzZSBiZWZvcmUgdGhlIHZlcnNpb24gNSByZXdyaXRlIHdhcyB2ZXJzaW9uIDRBIG9mCisxOC1GZWItOTMuICBDaGFuZ2UgbG9ncyBiZWZvcmUgdGhhdCBwb2ludCBoYXZlIGJlZW4gZGlzY2FyZGVkLCBzaW5jZSB0aGV5CithcmUgbm90IG9mIG11Y2ggaW50ZXJlc3QgYWZ0ZXIgdGhlIHJld3JpdGUuCmRpZmYgLS1naXQgYS9qcGVnL2NqcGVnLjEgYi9qcGVnL2NqcGVnLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NWE5NgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvY2pwZWcuMQpAQCAtMCwwICsxLDI5MiBAQAorLlRIIENKUEVHIDEgIjIwIE1hcmNoIDE5OTgiCisuU0ggTkFNRQorY2pwZWcgXC0gY29tcHJlc3MgYW4gaW1hZ2UgZmlsZSB0byBhIEpQRUcgZmlsZQorLlNIIFNZTk9QU0lTCisuQiBjanBlZworWworLkkgb3B0aW9ucworXQorWworLkkgZmlsZW5hbWUKK10KKy5MUAorLlNIIERFU0NSSVBUSU9OCisuTFAKKy5CIGNqcGVnCitjb21wcmVzc2VzIHRoZSBuYW1lZCBpbWFnZSBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcworbmFtZWQsIGFuZCBwcm9kdWNlcyBhIEpQRUcvSkZJRiBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCitUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBpbnB1dCBmaWxlIGZvcm1hdHMgYXJlOiBQUE0gKFBCTVBMVVMgY29sb3IKK2Zvcm1hdCksIFBHTSAoUEJNUExVUyBncmF5LXNjYWxlIGZvcm1hdCksIEJNUCwgVGFyZ2EsIGFuZCBSTEUgKFV0YWggUmFzdGVyCitUb29sa2l0IGZvcm1hdCkuICAoUkxFIGlzIHN1cHBvcnRlZCBvbmx5IGlmIHRoZSBVUlQgbGlicmFyeSBpcyBhdmFpbGFibGUuKQorLlNIIE9QVElPTlMKK0FsbCBzd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkOyBmb3IgZXhhbXBsZSwKKy5CIFwtZ3JheXNjYWxlCittYXkgYmUgd3JpdHRlbgorLkIgXC1ncmF5CitvcgorLkJSIFwtZ3IgLgorTW9zdCBvZiB0aGUgImJhc2ljIiBzd2l0Y2hlcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gYXMgbGl0dGxlIGFzIG9uZSBsZXR0ZXIuCitVcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudCAodGh1cworLkIgXC1CTVAKK2lzIHRoZSBzYW1lIGFzCisuQlIgXC1ibXAgKS4KK0JyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLAorLkJSIFwtZ3JleXNjYWxlICksCit0aG91Z2ggZm9yIGJyZXZpdHkgdGhlc2UgYXJlIG5vdCBtZW50aW9uZWQgYmVsb3cuCisuUFAKK1RoZSBiYXNpYyBzd2l0Y2hlcyBhcmU6CisuVFAKKy5CSSBcLXF1YWxpdHkgIiBOIgorU2NhbGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBhZGp1c3QgaW1hZ2UgcXVhbGl0eS4gIFF1YWxpdHkgaXMgMCAod29yc3QpIHRvCisxMDAgKGJlc3QpOyBkZWZhdWx0IGlzIDc1LiAgKFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKKy5UUAorLkIgXC1ncmF5c2NhbGUKK0NyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZSBmcm9tIGNvbG9yIGlucHV0LiAgQmUgc3VyZSB0byB1c2UgdGhpcyBzd2l0Y2ggd2hlbgorY29tcHJlc3NpbmcgYSBncmF5c2NhbGUgQk1QIGZpbGUsIGJlY2F1c2UKKy5CIGNqcGVnCitpc24ndCBicmlnaHQgZW5vdWdoIHRvIG5vdGljZSB3aGV0aGVyIGEgQk1QIGZpbGUgdXNlcyBvbmx5IHNoYWRlcyBvZiBncmF5LgorQnkgc2F5aW5nCisuQlIgXC1ncmF5c2NhbGUgLAoreW91J2xsIGdldCBhIHNtYWxsZXIgSlBFRyBmaWxlIHRoYXQgdGFrZXMgbGVzcyB0aW1lIHRvIHByb2Nlc3MuCisuVFAKKy5CIFwtb3B0aW1pemUKK1BlcmZvcm0gb3B0aW1pemF0aW9uIG9mIGVudHJvcHkgZW5jb2RpbmcgcGFyYW1ldGVycy4gIFdpdGhvdXQgdGhpcywgZGVmYXVsdAorZW5jb2RpbmcgcGFyYW1ldGVycyBhcmUgdXNlZC4KKy5CIFwtb3B0aW1pemUKK3VzdWFsbHkgbWFrZXMgdGhlIEpQRUcgZmlsZSBhIGxpdHRsZSBzbWFsbGVyLCBidXQKKy5CIGNqcGVnCitydW5zIHNvbWV3aGF0IHNsb3dlciBhbmQgbmVlZHMgbXVjaCBtb3JlIG1lbW9yeS4gIEltYWdlIHF1YWxpdHkgYW5kIHNwZWVkIG9mCitkZWNvbXByZXNzaW9uIGFyZSB1bmFmZmVjdGVkIGJ5CisuQlIgXC1vcHRpbWl6ZSAuCisuVFAKKy5CIFwtcHJvZ3Jlc3NpdmUKK0NyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKHNlZSBiZWxvdykuCisuVFAKKy5CIFwtdGFyZ2EKK0lucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAgVGFyZ2EgZmlsZXMgdGhhdCBjb250YWluIGFuICJpZGVudGlmaWNhdGlvbiIKK2ZpZWxkIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplZCBieQorLkJSIGNqcGVnIDsKK2ZvciBzdWNoIGZpbGVzIHlvdSBtdXN0IHNwZWNpZnkKKy5CIFwtdGFyZ2EKK3RvIG1ha2UKKy5CIGNqcGVnCit0cmVhdCB0aGUgaW5wdXQgYXMgVGFyZ2EgZm9ybWF0LgorRm9yIG1vc3QgVGFyZ2EgZmlsZXMsIHlvdSB3b24ndCBuZWVkIHRoaXMgc3dpdGNoLgorLlBQCitUaGUKKy5CIFwtcXVhbGl0eQorc3dpdGNoIGxldHMgeW91IHRyYWRlIG9mZiBjb21wcmVzc2VkIGZpbGUgc2l6ZSBhZ2FpbnN0IHF1YWxpdHkgb2YgdGhlCityZWNvbnN0cnVjdGVkIGltYWdlOiB0aGUgaGlnaGVyIHRoZSBxdWFsaXR5IHNldHRpbmcsIHRoZSBsYXJnZXIgdGhlIEpQRUcgZmlsZSwKK2FuZCB0aGUgY2xvc2VyIHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB0byB0aGUgb3JpZ2luYWwgaW5wdXQuICBOb3JtYWxseSB5b3UKK3dhbnQgdG8gdXNlIHRoZSBsb3dlc3QgcXVhbGl0eSBzZXR0aW5nIChzbWFsbGVzdCBmaWxlKSB0aGF0IGRlY29tcHJlc3NlcyBpbnRvCitzb21ldGhpbmcgdmlzdWFsbHkgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgb3JpZ2luYWwgaW1hZ2UuICBGb3IgdGhpcworcHVycG9zZSB0aGUgcXVhbGl0eSBzZXR0aW5nIHNob3VsZCBiZSBiZXR3ZWVuIDUwIGFuZCA5NTsgdGhlIGRlZmF1bHQgb2YgNzUgaXMKK29mdGVuIGFib3V0IHJpZ2h0LiAgSWYgeW91IHNlZSBkZWZlY3RzIGF0CisuQiBcLXF1YWxpdHkKKzc1LCB0aGVuIGdvIHVwIDUgb3IgMTAgY291bnRzIGF0IGEgdGltZSB1bnRpbCB5b3UgYXJlIGhhcHB5IHdpdGggdGhlIG91dHB1dAoraW1hZ2UuICAoVGhlIG9wdGltYWwgc2V0dGluZyB3aWxsIHZhcnkgZnJvbSBvbmUgaW1hZ2UgdG8gYW5vdGhlci4pCisuUFAKKy5CIFwtcXVhbGl0eQorMTAwIHdpbGwgZ2VuZXJhdGUgYSBxdWFudGl6YXRpb24gdGFibGUgb2YgYWxsIDEncywgbWluaW1pemluZyBsb3NzIGluIHRoZQorcXVhbnRpemF0aW9uIHN0ZXAgKGJ1dCB0aGVyZSBpcyBzdGlsbCBpbmZvcm1hdGlvbiBsb3NzIGluIHN1YnNhbXBsaW5nLCBhcyB3ZWxsCithcyByb3VuZG9mZiBlcnJvcikuICBUaGlzIHNldHRpbmcgaXMgbWFpbmx5IG9mIGludGVyZXN0IGZvciBleHBlcmltZW50YWwKK3B1cnBvc2VzLiAgUXVhbGl0eSB2YWx1ZXMgYWJvdmUgYWJvdXQgOTUgYXJlCisuQiBub3QKK3JlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlOyB0aGUgY29tcHJlc3NlZCBmaWxlIHNpemUgZ29lcyB1cCBkcmFtYXRpY2FsbHkgZm9yCitoYXJkbHkgYW55IGdhaW4gaW4gb3V0cHV0IGltYWdlIHF1YWxpdHkuCisuUFAKK0luIHRoZSBvdGhlciBkaXJlY3Rpb24sIHF1YWxpdHkgdmFsdWVzIGJlbG93IDUwIHdpbGwgcHJvZHVjZSB2ZXJ5IHNtYWxsIGZpbGVzCitvZiBsb3cgaW1hZ2UgcXVhbGl0eS4gIFNldHRpbmdzIGFyb3VuZCA1IHRvIDEwIG1pZ2h0IGJlIHVzZWZ1bCBpbiBwcmVwYXJpbmcgYW4KK2luZGV4IG9mIGEgbGFyZ2UgaW1hZ2UgbGlicmFyeSwgZm9yIGV4YW1wbGUuICBUcnkKKy5CIFwtcXVhbGl0eQorMiAob3Igc28pIGZvciBzb21lIGFtdXNpbmcgQ3ViaXN0IGVmZmVjdHMuICAoTm90ZTogcXVhbGl0eQordmFsdWVzIGJlbG93IGFib3V0IDI1IGdlbmVyYXRlIDItYnl0ZSBxdWFudGl6YXRpb24gdGFibGVzLCB3aGljaCBhcmUKK2NvbnNpZGVyZWQgb3B0aW9uYWwgaW4gdGhlIEpQRUcgc3RhbmRhcmQuCisuQiBjanBlZworZW1pdHMgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB5b3UgZ2l2ZSBzdWNoIGEgcXVhbGl0eSB2YWx1ZSwgYmVjYXVzZSBzb21lCitvdGhlciBKUEVHIHByb2dyYW1zIG1heSBiZSB1bmFibGUgdG8gZGVjb2RlIHRoZSByZXN1bHRpbmcgZmlsZS4gIFVzZQorLkIgXC1iYXNlbGluZQoraWYgeW91IG5lZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYXQgbG93IHF1YWxpdHkgdmFsdWVzLikKKy5QUAorVGhlCisuQiBcLXByb2dyZXNzaXZlCitzd2l0Y2ggY3JlYXRlcyBhICJwcm9ncmVzc2l2ZSBKUEVHIiBmaWxlLiAgSW4gdGhpcyB0eXBlIG9mIEpQRUcgZmlsZSwgdGhlIGRhdGEKK2lzIHN0b3JlZCBpbiBtdWx0aXBsZSBzY2FucyBvZiBpbmNyZWFzaW5nIHF1YWxpdHkuICBJZiB0aGUgZmlsZSBpcyBiZWluZwordHJhbnNtaXR0ZWQgb3ZlciBhIHNsb3cgY29tbXVuaWNhdGlvbnMgbGluaywgdGhlIGRlY29kZXIgY2FuIHVzZSB0aGUgZmlyc3QKK3NjYW4gdG8gZGlzcGxheSBhIGxvdy1xdWFsaXR5IGltYWdlIHZlcnkgcXVpY2tseSwgYW5kIGNhbiB0aGVuIGltcHJvdmUgdGhlCitkaXNwbGF5IHdpdGggZWFjaCBzdWJzZXF1ZW50IHNjYW4uICBUaGUgZmluYWwgaW1hZ2UgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGEKK3N0YW5kYXJkIEpQRUcgZmlsZSBvZiB0aGUgc2FtZSBxdWFsaXR5IHNldHRpbmcsIGFuZCB0aGUgdG90YWwgZmlsZSBzaXplIGlzCithYm91dCB0aGUgc2FtZSAtLS0gb2Z0ZW4gYSBsaXR0bGUgc21hbGxlci4KKy5CIENhdXRpb246Citwcm9ncmVzc2l2ZSBKUEVHIGlzIG5vdCB5ZXQgd2lkZWx5IGltcGxlbWVudGVkLCBzbyBtYW55IGRlY29kZXJzIHdpbGwgYmUKK3VuYWJsZSB0byB2aWV3IGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIGF0IGFsbC4KKy5QUAorU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgorLlRQCisuQiBcLWRjdCBpbnQKK1VzZSBpbnRlZ2VyIERDVCBtZXRob2QgKGRlZmF1bHQpLgorLlRQCisuQiBcLWRjdCBmYXN0CitVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSkuCisuVFAKKy5CIFwtZGN0IGZsb2F0CitVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZC4KK1RoZSBmbG9hdCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIGludCBtZXRob2QsIGJ1dCBpcworbXVjaCBzbG93ZXIgdW5sZXNzIHlvdXIgbWFjaGluZSBoYXMgdmVyeSBmYXN0IGZsb2F0aW5nLXBvaW50IGhhcmR3YXJlLiAgQWxzbworbm90ZSB0aGF0IHJlc3VsdHMgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgdmFyeSBzbGlnaHRseSBhY3Jvc3MKK21hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4KK1RoZSBmYXN0IGludGVnZXIgbWV0aG9kIGlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCisuVFAKKy5CSSBcLXJlc3RhcnQgIiBOIgorRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkgTiBNQ1UgYmxvY2tzIGlmICJCIiBpcworYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KKy5CIFwtcmVzdGFydCAwCisodGhlIGRlZmF1bHQpIG1lYW5zIG5vIHJlc3RhcnQgbWFya2Vycy4KKy5UUAorLkJJIFwtc21vb3RoICIgTiIKK1Ntb290aCB0aGUgaW5wdXQgaW1hZ2UgdG8gZWxpbWluYXRlIGRpdGhlcmluZyBub2lzZS4gIE4sIHJhbmdpbmcgZnJvbSAxIHRvCisxMDAsIGluZGljYXRlcyB0aGUgc3RyZW5ndGggb2Ygc21vb3RoaW5nLiAgMCAodGhlIGRlZmF1bHQpIG1lYW5zIG5vIHNtb290aGluZy4KKy5UUAorLkJJIFwtbWF4bWVtb3J5ICIgTiIKK1NldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZyBsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcworaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvciBtaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlCitudW1iZXIuICBGb3IgZXhhbXBsZSwKKy5CIFwtbWF4IDRtCitzZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KKy5UUAorLkJJIFwtb3V0ZmlsZSAiIG5hbWUiCitTZW5kIG91dHB1dCBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZSwgbm90IHRvIHN0YW5kYXJkIG91dHB1dC4KKy5UUAorLkIgXC12ZXJib3NlCitFbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlCisuQlIgXC12ICdzCitnaXZlIG1vcmUgb3V0cHV0LiAgQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCisuVFAKKy5CIFwtZGVidWcKK1NhbWUgYXMKKy5CUiBcLXZlcmJvc2UgLgorLlBQCitUaGUKKy5CIFwtcmVzdGFydAorb3B0aW9uIGluc2VydHMgZXh0cmEgbWFya2VycyB0aGF0IGFsbG93IGEgSlBFRyBkZWNvZGVyIHRvIHJlc3luY2hyb25pemUgYWZ0ZXIKK2EgdHJhbnNtaXNzaW9uIGVycm9yLiAgV2l0aG91dCByZXN0YXJ0IG1hcmtlcnMsIGFueSBkYW1hZ2UgdG8gYSBjb21wcmVzc2VkCitmaWxlIHdpbGwgdXN1YWxseSBydWluIHRoZSBpbWFnZSBmcm9tIHRoZSBwb2ludCBvZiB0aGUgZXJyb3IgdG8gdGhlIGVuZCBvZiB0aGUKK2ltYWdlOyB3aXRoIHJlc3RhcnQgbWFya2VycywgdGhlIGRhbWFnZSBpcyB1c3VhbGx5IGNvbmZpbmVkIHRvIHRoZSBwb3J0aW9uIG9mCit0aGUgaW1hZ2UgdXAgdG8gdGhlIG5leHQgcmVzdGFydCBtYXJrZXIuICBPZiBjb3Vyc2UsIHRoZSByZXN0YXJ0IG1hcmtlcnMKK29jY3VweSBleHRyYSBzcGFjZS4gIFdlIHJlY29tbWVuZAorLkIgXC1yZXN0YXJ0IDEKK2ZvciBpbWFnZXMgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIGFjcm9zcyB1bnJlbGlhYmxlIG5ldHdvcmtzIHN1Y2ggYXMgVXNlbmV0LgorLlBQCitUaGUKKy5CIFwtc21vb3RoCitvcHRpb24gZmlsdGVycyB0aGUgaW5wdXQgdG8gZWxpbWluYXRlIGZpbmUtc2NhbGUgbm9pc2UuICBUaGlzIGlzIG9mdGVuIHVzZWZ1bAord2hlbiBjb252ZXJ0aW5nIGRpdGhlcmVkIGltYWdlcyB0byBKUEVHOiBhIG1vZGVyYXRlIHNtb290aGluZyBmYWN0b3Igb2YgMTAgdG8KKzUwIGdldHMgcmlkIG9mIGRpdGhlcmluZyBwYXR0ZXJucyBpbiB0aGUgaW5wdXQgZmlsZSwgcmVzdWx0aW5nIGluIGEgc21hbGxlcgorSlBFRyBmaWxlIGFuZCBhIGJldHRlci1sb29raW5nIGltYWdlLiAgVG9vIGxhcmdlIGEgc21vb3RoaW5nIGZhY3RvciB3aWxsCit2aXNpYmx5IGJsdXIgdGhlIGltYWdlLCBob3dldmVyLgorLlBQCitTd2l0Y2hlcyBmb3Igd2l6YXJkczoKKy5UUAorLkIgXC1iYXNlbGluZQorRm9yY2UgYmFzZWxpbmUtY29tcGF0aWJsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGJlIGdlbmVyYXRlZC4gIFRoaXMgY2xhbXBzCitxdWFudGl6YXRpb24gdmFsdWVzIHRvIDggYml0cyBldmVuIGF0IGxvdyBxdWFsaXR5IHNldHRpbmdzLiAgKFRoaXMgc3dpdGNoIGlzCitwb29ybHkgbmFtZWQsIHNpbmNlIGl0IGRvZXMgbm90IGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgaXMgYWN0dWFsbHkgYmFzZWxpbmUKK0pQRUcuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UKKy5CIFwtYmFzZWxpbmUKK2FuZAorLkIgXC1wcm9ncmVzc2l2ZQordG9nZXRoZXIuKQorLlRQCisuQkkgXC1xdGFibGVzICIgZmlsZSIKK1VzZSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KKy5UUAorLkJJIFwtcXNsb3RzICIgTlssLi4uXSIKK1NlbGVjdCB3aGljaCBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudC4KKy5UUAorLkJJIFwtc2FtcGxlICIgSHhWWywuLi5dIgorU2V0IEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCisuVFAKKy5CSSBcLXNjYW5zICIgZmlsZSIKK1VzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCisuUFAKK1RoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcuICBJZiB5b3UKK2Rvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBcZkJkb24ndCB1c2UgdGhlbVxmUi4gIFRoZXNlIHN3aXRjaGVzIGFyZQorZG9jdW1lbnRlZCBmdXJ0aGVyIGluIHRoZSBmaWxlIHdpemFyZC5kb2MuCisuU0ggRVhBTVBMRVMKKy5MUAorVGhpcyBleGFtcGxlIGNvbXByZXNzZXMgdGhlIFBQTSBmaWxlIGZvby5wcG0gd2l0aCBhIHF1YWxpdHkgZmFjdG9yIG9mCis2MCBhbmQgc2F2ZXMgdGhlIG91dHB1dCBhcyBmb28uanBnOgorLklQCisuQiBjanBlZyBcLXF1YWxpdHkKKy5JIDYwIGZvby5wcG0KKy5CID4KKy5JIGZvby5qcGcKKy5TSCBISU5UUworQ29sb3IgR0lGIGZpbGVzIGFyZSBub3QgdGhlIGlkZWFsIGlucHV0IGZvciBKUEVHOyBKUEVHIGlzIHJlYWxseSBpbnRlbmRlZCBmb3IKK2NvbXByZXNzaW5nIGZ1bGwtY29sb3IgKDI0LWJpdCkgaW1hZ2VzLiAgSW4gcGFydGljdWxhciwgZG9uJ3QgdHJ5IHRvIGNvbnZlcnQKK2NhcnRvb25zLCBsaW5lIGRyYXdpbmdzLCBhbmQgb3RoZXIgaW1hZ2VzIHRoYXQgaGF2ZSBvbmx5IGEgZmV3IGRpc3RpbmN0Citjb2xvcnMuICBHSUYgd29ya3MgZ3JlYXQgb24gdGhlc2UsIEpQRUcgZG9lcyBub3QuICBJZiB5b3Ugd2FudCB0byBjb252ZXJ0IGEKK0dJRiB0byBKUEVHLCB5b3Ugc2hvdWxkIGV4cGVyaW1lbnQgd2l0aAorLkJSIGNqcGVnICdzCisuQiBcLXF1YWxpdHkKK2FuZAorLkIgXC1zbW9vdGgKK29wdGlvbnMgdG8gZ2V0IGEgc2F0aXNmYWN0b3J5IGNvbnZlcnNpb24uCisuQiBcLXNtb290aCAxMAorb3Igc28gaXMgb2Z0ZW4gaGVscGZ1bC4KKy5QUAorQXZvaWQgcnVubmluZyBhbiBpbWFnZSB0aHJvdWdoIGEgc2VyaWVzIG9mIEpQRUcgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbgorY3ljbGVzLiAgSW1hZ2UgcXVhbGl0eSBsb3NzIHdpbGwgYWNjdW11bGF0ZTsgYWZ0ZXIgdGVuIG9yIHNvIGN5Y2xlcyB0aGUgaW1hZ2UKK21heSBiZSBub3RpY2VhYmx5IHdvcnNlIHRoYW4gaXQgd2FzIGFmdGVyIG9uZSBjeWNsZS4gIEl0J3MgYmVzdCB0byB1c2UgYQorbG9zc2xlc3MgZm9ybWF0IHdoaWxlIG1hbmlwdWxhdGluZyBhbiBpbWFnZSwgdGhlbiBjb252ZXJ0IHRvIEpQRUcgZm9ybWF0IHdoZW4KK3lvdSBhcmUgcmVhZHkgdG8gZmlsZSB0aGUgaW1hZ2UgYXdheS4KKy5QUAorVGhlCisuQiBcLW9wdGltaXplCitvcHRpb24gdG8KKy5CIGNqcGVnCitpcyB3b3J0aCB1c2luZyB3aGVuIHlvdSBhcmUgbWFraW5nIGEgImZpbmFsIiB2ZXJzaW9uIGZvciBwb3N0aW5nIG9yIGFyY2hpdmluZy4KK0l0J3MgYWxzbyBhIHdpbiB3aGVuIHlvdSBhcmUgdXNpbmcgbG93IHF1YWxpdHkgc2V0dGluZ3MgdG8gbWFrZSB2ZXJ5IHNtYWxsCitKUEVHIGZpbGVzOyB0aGUgcGVyY2VudGFnZSBpbXByb3ZlbWVudCBpcyBvZnRlbiBhIGxvdCBtb3JlIHRoYW4gaXQgaXMgb24KK2xhcmdlciBmaWxlcy4gIChBdCBwcmVzZW50LAorLkIgXC1vcHRpbWl6ZQorbW9kZSBpcyBhbHdheXMgc2VsZWN0ZWQgd2hlbiBnZW5lcmF0aW5nIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMuKQorLlNIIEVOVklST05NRU5UCisuVFAKKy5CIEpQRUdNRU0KK0lmIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdHMgdmFsdWUgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGxpbWl0LgorVGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgZm9yIHRoZQorLkIgXC1tYXhtZW1vcnkKK3N3aXRjaC4KKy5CIEpQRUdNRU0KK292ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBzcGVjaWZpZWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQsIGFuZAoraXRzZWxmIGlzIG92ZXJyaWRkZW4gYnkgYW4gZXhwbGljaXQKKy5CUiBcLW1heG1lbW9yeSAuCisuU0ggU0VFIEFMU08KKy5CUiBkanBlZyAoMSksCisuQlIganBlZ3RyYW4gKDEpLAorLkJSIHJkanBnY29tICgxKSwKKy5CUiB3cmpwZ2NvbSAoMSkKKy5icgorLkJSIHBwbSAoNSksCisuQlIgcGdtICg1KQorLmJyCitXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCitDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkxICh2b2wuIDM0LCBuby4gNCksIHBwLiAzMC00NC4KKy5TSCBBVVRIT1IKK0luZGVwZW5kZW50IEpQRUcgR3JvdXAKKy5TSCBCVUdTCitBcml0aG1ldGljIGNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLgorLlBQCitHSUYgaW5wdXQgZmlsZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHRvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudC4KK1VzZSBhIFVuaXN5cy1saWNlbnNlZCBwcm9ncmFtIGlmIHlvdSBuZWVkIHRvIHJlYWQgYSBHSUYgZmlsZS4gIChDb252ZXJzaW9uCitvZiBHSUYgZmlsZXMgdG8gSlBFRyBpcyB1c3VhbGx5IGEgYmFkIGlkZWEgYW55d2F5LikKKy5QUAorTm90IGFsbCB2YXJpYW50cyBvZiBCTVAgYW5kIFRhcmdhIGZpbGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLgorLlBQCitUaGUKKy5CIFwtdGFyZ2EKK3N3aXRjaCBpcyBub3QgYSBidWcsIGl0J3MgYSBmZWF0dXJlLiAgKEl0IHdvdWxkIGJlIGEgYnVnIGlmIHRoZSBUYXJnYSBmb3JtYXQKK2Rlc2lnbmVycyBoYWQgbm90IGJlZW4gY2x1ZWxlc3MuKQorLlBQCitTdGlsbCBub3QgYXMgZmFzdCBhcyB3ZSdkIGxpa2UuCmRpZmYgLS1naXQgYS9qcGVnL2NqcGVnLmMgYi9qcGVnL2NqcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhOTI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvY2pwZWcuYwpAQCAtMCwwICsxLDYwNiBAQAorLyoKKyAqIGNqcGVnLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvbW1hbmQtbGluZSB1c2VyIGludGVyZmFjZSBmb3IgdGhlIEpQRUcgY29tcHJlc3Nvci4KKyAqIEl0IHNob3VsZCB3b3JrIG9uIGFueSBzeXN0ZW0gd2l0aCBVbml4LSBvciBNUy1ET1Mtc3R5bGUgY29tbWFuZCBsaW5lcy4KKyAqCisgKiBUd28gZGlmZmVyZW50IGNvbW1hbmQgbGluZSBzdHlsZXMgYXJlIHBlcm1pdHRlZCwgZGVwZW5kaW5nIG9uIHRoZQorICogY29tcGlsZS10aW1lIHN3aXRjaCBUV09fRklMRV9DT01NQU5ETElORToKKyAqCWNqcGVnIFtvcHRpb25zXSAgaW5wdXRmaWxlIG91dHB1dGZpbGUKKyAqCWNqcGVnIFtvcHRpb25zXSAgW2lucHV0ZmlsZV0KKyAqIEluIHRoZSBzZWNvbmQgc3R5bGUsIG91dHB1dCBpcyBhbHdheXMgdG8gc3RhbmRhcmQgb3V0cHV0LCB3aGljaCB5b3UnZAorICogbm9ybWFsbHkgcmVkaXJlY3QgdG8gYSBmaWxlIG9yIHBpcGUgdG8gc29tZSBvdGhlciBwcm9ncmFtLiAgSW5wdXQgaXMKKyAqIGVpdGhlciBmcm9tIGEgbmFtZWQgZmlsZSBvciBmcm9tIHN0YW5kYXJkIGlucHV0ICh0eXBpY2FsbHkgcmVkaXJlY3RlZCkuCisgKiBUaGUgc2Vjb25kIHN0eWxlIGlzIGNvbnZlbmllbnQgb24gVW5peCBidXQgaXMgdW5oZWxwZnVsIG9uIHN5c3RlbXMgdGhhdAorICogZG9uJ3Qgc3VwcG9ydCBwaXBlcy4gIEFsc28sIHlvdSBNVVNUIHVzZSB0aGUgZmlyc3Qgc3R5bGUgaWYgeW91ciBzeXN0ZW0KKyAqIGRvZXNuJ3QgZG8gYmluYXJ5IEkvTyB0byBzdGRpbi9zdGRvdXQuCisgKiBUbyBzaW1wbGlmeSBzY3JpcHQgd3JpdGluZywgdGhlICItb3V0ZmlsZSIgc3dpdGNoIGlzIHByb3ZpZGVkLiAgVGhlIHN5bnRheAorICoJY2pwZWcgW29wdGlvbnNdICAtb3V0ZmlsZSBvdXRwdXRmaWxlICBpbnB1dGZpbGUKKyAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY29tbWFuZCBsaW5lIHN0eWxlIGlzIHVzZWQuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKyNpbmNsdWRlICJqdmVyc2lvbi5oIgkJLyogZm9yIHZlcnNpb24gbWVzc2FnZSAqLworCisjaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KKyNpZmRlZiBfX01XRVJLU19fCisjaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLworI2VuZGlmCisjaWZkZWYgVEhJTktfQworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KKyNlbmRpZgorI2VuZGlmCisKKworLyogQ3JlYXRlIHRoZSBhZGQtb24gbWVzc2FnZSBzdHJpbmcgdGFibGUuICovCisKKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCXN0cmluZyAsCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RqcGVnX21lc3NhZ2VfdGFibGVbXSA9IHsKKyNpbmNsdWRlICJjZGVycm9yLmgiCisgIE5VTEwKK307CisKKworLyoKKyAqIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHdoYXQgZm9ybWF0IHRoZSBpbnB1dCBmaWxlIGlzLAorICogYW5kIHNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIGlucHV0LXJlYWRpbmcgbW9kdWxlLgorICoKKyAqIFRvIGRldGVybWluZSB3aGljaCBmYW1pbHkgb2YgaW5wdXQgZm9ybWF0cyB0aGUgZmlsZSBiZWxvbmdzIHRvLAorICogd2UgbWF5IGxvb2sgb25seSBhdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlsZSwgc2luY2UgQyBkb2VzIG5vdAorICogZ3VhcmFudGVlIHRoYXQgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgY2FuIGJlIHB1c2hlZCBiYWNrIHdpdGggdW5nZXRjLgorICogTG9va2luZyBhdCBhZGRpdGlvbmFsIGJ5dGVzIHdvdWxkIHJlcXVpcmUgb25lIG9mIHRoZXNlIGFwcHJvYWNoZXM6CisgKiAgICAgMSkgYXNzdW1lIHdlIGNhbiBmc2VlaygpIHRoZSBpbnB1dCBmaWxlIChmYWlscyBmb3IgcGlwZWQgaW5wdXQpOworICogICAgIDIpIGFzc3VtZSB3ZSBjYW4gcHVzaCBiYWNrIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyICh3b3JrcyBpbgorICogICAgICAgIHNvbWUgQyBpbXBsZW1lbnRhdGlvbnMsIGJ1dCB1bnBvcnRhYmxlKTsKKyAqICAgICAzKSBwcm92aWRlIG91ciBvd24gYnVmZmVyaW5nIChicmVha3MgaW5wdXQgcmVhZGVycyB0aGF0IHdhbnQgdG8gdXNlCisgKiAgICAgICAgc3RkaW8gZGlyZWN0bHksIHN1Y2ggYXMgdGhlIFJMRSBsaWJyYXJ5KTsKKyAqIG9yICA0KSBkb24ndCBwdXQgYmFjayB0aGUgZGF0YSwgYW5kIG1vZGlmeSB0aGUgaW5wdXRfaW5pdCBtZXRob2RzIHRvIGFzc3VtZQorICogICAgICAgIHRoZXkgc3RhcnQgcmVhZGluZyBhZnRlciB0aGUgc3RhcnQgb2YgZmlsZSAoYWxzbyBicmVha3MgUkxFIGxpYnJhcnkpLgorICogIzEgaXMgYXR0cmFjdGl2ZSBmb3IgTVMtRE9TIGJ1dCBpcyB1bnRlbmFibGUgb24gVW5peC4KKyAqCisgKiBUaGUgbW9zdCBwb3J0YWJsZSBzb2x1dGlvbiBmb3IgZmlsZSB0eXBlcyB0aGF0IGNhbid0IGJlIGlkZW50aWZpZWQgYnkgdGhlaXIKKyAqIGZpcnN0IGJ5dGUgaXMgdG8gbWFrZSB0aGUgdXNlciB0ZWxsIHVzIHdoYXQgdGhleSBhcmUuICBUaGlzIGlzIGFsc28gdGhlCisgKiBvbmx5IGFwcHJvYWNoIGZvciAicmF3IiBmaWxlIHR5cGVzIHRoYXQgY29udGFpbiBvbmx5IGFyYml0cmFyeSB2YWx1ZXMuCisgKiBXZSBwcmVzZW50bHkgYXBwbHkgdGhpcyBtZXRob2QgZm9yIFRhcmdhIGZpbGVzLiAgTW9zdCBvZiB0aGUgdGltZSBUYXJnYQorICogZmlsZXMgc3RhcnQgd2l0aCAweDAwLCBzbyB3ZSByZWNvZ25pemUgdGhhdCBjYXNlLiAgUG90ZW50aWFsbHksIGhvd2V2ZXIsCisgKiBhIFRhcmdhIGZpbGUgY291bGQgc3RhcnQgd2l0aCBhbnkgYnl0ZSB2YWx1ZSAoYnl0ZSAwIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgKiBzZWxkb20tdXNlZCBJRCBmaWVsZCksIHNvIHdlIHByb3ZpZGUgYSBzd2l0Y2ggdG8gZm9yY2UgVGFyZ2EgaW5wdXQgbW9kZS4KKyAqLworCitzdGF0aWMgYm9vbGVhbiBpc190YXJnYTsJLyogcmVjb3JkcyB1c2VyIC10YXJnYSBzd2l0Y2ggKi8KKworCitMT0NBTChjanBlZ19zb3VyY2VfcHRyKQorc2VsZWN0X2ZpbGVfdHlwZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCit7CisgIGludCBjOworCisgIGlmIChpc190YXJnYSkgeworI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAorICAgIHJldHVybiBqaW5pdF9yZWFkX3RhcmdhKGNpbmZvKTsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfTk9UQ09NUCk7CisjZW5kaWYKKyAgfQorCisgIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOworICBpZiAodW5nZXRjKGMsIGluZmlsZSkgPT0gRU9GKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVU5HRVRDX0ZBSUxFRCk7CisKKyAgc3dpdGNoIChjKSB7CisjaWZkZWYgQk1QX1NVUFBPUlRFRAorICBjYXNlICdCJzoKKyAgICByZXR1cm4gamluaXRfcmVhZF9ibXAoY2luZm8pOworI2VuZGlmCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorICBjYXNlICdHJzoKKyAgICByZXR1cm4gamluaXRfcmVhZF9naWYoY2luZm8pOworI2VuZGlmCisjaWZkZWYgUFBNX1NVUFBPUlRFRAorICBjYXNlICdQJzoKKyAgICByZXR1cm4gamluaXRfcmVhZF9wcG0oY2luZm8pOworI2VuZGlmCisjaWZkZWYgUkxFX1NVUFBPUlRFRAorICBjYXNlICdSJzoKKyAgICByZXR1cm4gamluaXRfcmVhZF9ybGUoY2luZm8pOworI2VuZGlmCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgIGNhc2UgMHgwMDoKKyAgICByZXR1cm4gamluaXRfcmVhZF90YXJnYShjaW5mbyk7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1VOS05PV05fRk9STUFUKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBOVUxMOwkJCS8qIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmdzICovCit9CisKKworLyoKKyAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KKyAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKKyAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCisgKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCisgKiBUaGUgbWFpbiBwcm9ncmFtIGluIHRoaXMgZmlsZSBkb2Vzbid0IGFjdHVhbGx5IHVzZSB0aGlzIGNhcGFiaWxpdHkuLi4KKyAqLworCisKK3N0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KK3N0YXRpYyBjaGFyICogb3V0ZmlsZW5hbWU7CS8qIGZvciAtb3V0ZmlsZSBzd2l0Y2ggKi8KKworCitMT0NBTCh2b2lkKQordXNhZ2UgKHZvaWQpCisvKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCit7CisgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOworI2Vsc2UKKyAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7CisjZW5kaWYKKworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcXVhbGl0eSBOICAgICBDb21wcmVzc2lvbiBxdWFsaXR5ICgwLi4xMDA7IDUtOTUgaXMgdXNlZnVsIHJhbmdlKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZ3JheXNjYWxlICAgICBDcmVhdGUgbW9ub2Nocm9tZSBKUEVHIGZpbGVcbiIpOworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9wdGltaXplICAgICAgT3B0aW1pemUgSHVmZm1hbiB0YWJsZSAoc21hbGxlciBmaWxlLCBidXQgc2xvdyBjb21wcmVzc2lvbilcbiIpOworI2VuZGlmCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1wcm9ncmVzc2l2ZSAgIENyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVcbiIpOworI2VuZGlmCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtdGFyZ2EgICAgICAgICBJbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdCAodXN1YWxseSBub3QgbmVlZGVkKVxuIik7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6XG4iKTsKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGludCAgICAgICBVc2UgaW50ZWdlciBEQ1QgbWV0aG9kJXNcbiIsCisJICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSVNMT1cgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmYXN0ICAgICAgVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpJXNcbiIsCisJICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSUZBU1QgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmbG9hdCAgICAgVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2Qlc1xuIiwKKwkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9GTE9BVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1yZXN0YXJ0IE4gICAgIFNldCByZXN0YXJ0IGludGVydmFsIGluIHJvd3MsIG9yIGluIGJsb2NrcyB3aXRoIEJcbiIpOworI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1zbW9vdGggTiAgICAgIFNtb290aCBkaXRoZXJlZCBpbnB1dCAoTj0xLi4xMDAgaXMgc3RyZW5ndGgpXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1heG1lbW9yeSBOICAgTWF4aW11bSBtZW1vcnkgdG8gdXNlIChpbiBrYnl0ZXMpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vdXRmaWxlIG5hbWUgIFNwZWNpZnkgbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgIG9yICAtZGVidWcgICBFbWl0IGRlYnVnIG91dHB1dFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIHdpemFyZHM6XG4iKTsKKyNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1hcml0aG1ldGljICAgIFVzZSBhcml0aG1ldGljIGNvZGluZ1xuIik7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1iYXNlbGluZSAgICAgIEZvcmNlIGJhc2VsaW5lIHF1YW50aXphdGlvbiB0YWJsZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXF0YWJsZXMgZmlsZSAgVXNlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcXNsb3RzIE5bLC4uLl0gICAgU2V0IGNvbXBvbmVudCBxdWFudGl6YXRpb24gdGFibGVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1zYW1wbGUgSHhWWywuLi5dICBTZXQgY29tcG9uZW50IHNhbXBsaW5nIGZhY3RvcnNcbiIpOworI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNjYW5zIGZpbGUgICAgQ3JlYXRlIG11bHRpLXNjYW4gSlBFRyBwZXIgc2NyaXB0IGZpbGVcbiIpOworI2VuZGlmCisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCitMT0NBTChpbnQpCitwYXJzZV9zd2l0Y2hlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKKy8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgorICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgorICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKKyAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgorICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCisgKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCisgKiBwcm9jZXNzaW5nLgorICovCit7CisgIGludCBhcmduOworICBjaGFyICogYXJnOworICBpbnQgcXVhbGl0eTsJCQkvKiAtcXVhbGl0eSBwYXJhbWV0ZXIgKi8KKyAgaW50IHFfc2NhbGVfZmFjdG9yOwkJLyogc2NhbGluZyBwZXJjZW50YWdlIGZvciAtcXRhYmxlcyAqLworICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lOworICBib29sZWFuIHNpbXBsZV9wcm9ncmVzc2l2ZTsKKyAgY2hhciAqIHF0YWJsZWZpbGUgPSBOVUxMOwkvKiBzYXZlcyAtcXRhYmxlcyBmaWxlbmFtZSBpZiBhbnkgKi8KKyAgY2hhciAqIHFzbG90c2FyZyA9IE5VTEw7CS8qIHNhdmVzIC1xc2xvdHMgcGFybSBpZiBhbnkgKi8KKyAgY2hhciAqIHNhbXBsZWFyZyA9IE5VTEw7CS8qIHNhdmVzIC1zYW1wbGUgcGFybSBpZiBhbnkgKi8KKyAgY2hhciAqIHNjYW5zYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNjYW5zIHBhcm0gaWYgYW55ICovCisKKyAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLworICAvKiBOb3RlIHRoYXQgZGVmYXVsdCAtcXVhbGl0eSBsZXZlbCBuZWVkIG5vdCwgYW5kIGRvZXMgbm90LAorICAgKiBtYXRjaCB0aGUgZGVmYXVsdCBzY2FsaW5nIGZvciBhbiBleHBsaWNpdCAtcXRhYmxlcyBhcmd1bWVudC4KKyAgICovCisgIHF1YWxpdHkgPSA3NTsJCQkvKiBkZWZhdWx0IC1xdWFsaXR5IHZhbHVlICovCisgIHFfc2NhbGVfZmFjdG9yID0gMTAwOwkJLyogZGVmYXVsdCB0byBubyBzY2FsaW5nIGZvciAtcXRhYmxlcyAqLworICBmb3JjZV9iYXNlbGluZSA9IEZBTFNFOwkvKiBieSBkZWZhdWx0LCBhbGxvdyAxNi1iaXQgcXVhbnRpemVycyAqLworICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBGQUxTRTsKKyAgaXNfdGFyZ2EgPSBGQUxTRTsKKyAgb3V0ZmlsZW5hbWUgPSBOVUxMOworICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7CisKKyAgLyogU2NhbiBjb21tYW5kIGxpbmUgb3B0aW9ucywgYWRqdXN0IHBhcmFtZXRlcnMgKi8KKworICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7CisgICAgYXJnID0gYXJndlthcmduXTsKKyAgICBpZiAoKmFyZyAhPSAnLScpIHsKKyAgICAgIC8qIE5vdCBhIHN3aXRjaCwgbXVzdCBiZSBhIGZpbGUgbmFtZSBhcmd1bWVudCAqLworICAgICAgaWYgKGFyZ24gPD0gbGFzdF9maWxlX2FyZ19zZWVuKSB7CisJb3V0ZmlsZW5hbWUgPSBOVUxMOwkvKiAtb3V0ZmlsZSBhcHBsaWVzIHRvIGp1c3Qgb25lIGlucHV0IGZpbGUgKi8KKwljb250aW51ZTsJCS8qIGlnbm9yZSB0aGlzIG5hbWUgaWYgcHJldmlvdXNseSBwcm9jZXNzZWQgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOwkJCS8qIGVsc2UgZG9uZSBwYXJzaW5nIHN3aXRjaGVzICovCisgICAgfQorICAgIGFyZysrOwkJCS8qIGFkdmFuY2UgcGFzdCBzd2l0Y2ggbWFya2VyIGNoYXJhY3RlciAqLworCisgICAgaWYgKGtleW1hdGNoKGFyZywgImFyaXRobWV0aWMiLCAxKSkgeworICAgICAgLyogVXNlIGFyaXRobWV0aWMgY29kaW5nLiAqLworI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAorICAgICAgY2luZm8tPmFyaXRoX2NvZGUgPSBUUlVFOworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBhcml0aG1ldGljIGNvZGluZyBub3Qgc3VwcG9ydGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJiYXNlbGluZSIsIDEpKSB7CisgICAgICAvKiBGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIG91dHB1dCAoOC1iaXQgcXVhbnRpemVyIHZhbHVlcykuICovCisgICAgICBmb3JjZV9iYXNlbGluZSA9IFRSVUU7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRjdCIsIDIpKSB7CisgICAgICAvKiBTZWxlY3QgRENUIGFsZ29yaXRobS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiaW50IiwgMSkpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSVNMT1c7CisgICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmYXN0IiwgMikpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisgICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmbG9hdCIsIDIpKSB7CisJY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0ZMT0FUOworICAgICAgfSBlbHNlCisJdXNhZ2UoKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGVidWciLCAxKSB8fCBrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKKyAgICAgIC8qIEVuYWJsZSBkZWJ1ZyBwcmludG91dHMuICovCisgICAgICAvKiBPbiBmaXJzdCAtZCwgcHJpbnQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiAqLworICAgICAgc3RhdGljIGJvb2xlYW4gcHJpbnRlZF92ZXJzaW9uID0gRkFMU0U7CisKKyAgICAgIGlmICghIHByaW50ZWRfdmVyc2lvbikgeworCWZwcmludGYoc3RkZXJyLCAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIENKUEVHLCB2ZXJzaW9uICVzXG4lc1xuIiwKKwkJSlZFUlNJT04sIEpDT1BZUklHSFQpOworCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7CisgICAgICB9CisgICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAyKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDIpKSB7CisgICAgICAvKiBGb3JjZSBhIG1vbm9jaHJvbWUgSlBFRyBmaWxlIHRvIGJlIGdlbmVyYXRlZC4gKi8KKyAgICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXhtZW1vcnkiLCAzKSkgeworICAgICAgLyogTWF4aW11bSBtZW1vcnkgaW4gS2IgKG9yIE1iIHdpdGggJ20nKS4gKi8KKyAgICAgIGxvbmcgbHZhbDsKKyAgICAgIGNoYXIgY2ggPSAneCc7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQorCXVzYWdlKCk7CisgICAgICBpZiAoY2ggPT0gJ20nIHx8IGNoID09ICdNJykKKwlsdmFsICo9IDEwMDBMOworICAgICAgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBsdmFsICogMTAwMEw7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm9wdGltaXplIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAib3B0aW1pc2UiLCAxKSkgeworICAgICAgLyogRW5hYmxlIGVudHJvcHkgcGFybSBvcHRpbWl6YXRpb24uICovCisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgICAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsKKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgZW50cm9weSBvcHRpbWl6YXRpb24gd2FzIG5vdCBjb21waWxlZFxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3V0ZmlsZSIsIDQpKSB7CisgICAgICAvKiBTZXQgb3V0cHV0IGZpbGUgbmFtZS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicHJvZ3Jlc3NpdmUiLCAxKSkgeworICAgICAgLyogU2VsZWN0IHNpbXBsZSBwcm9ncmVzc2l2ZSBtb2RlLiAqLworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBUUlVFOworICAgICAgLyogV2UgbXVzdCBwb3N0cG9uZSBleGVjdXRpb24gdW50aWwgbnVtX2NvbXBvbmVudHMgaXMga25vd24uICovCisjZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIHByb2dyZXNzaXZlIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJxdWFsaXR5IiwgMSkpIHsKKyAgICAgIC8qIFF1YWxpdHkgZmFjdG9yIChxdWFudGl6YXRpb24gdGFibGUgc2NhbGluZyBmYWN0b3IpLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWQiLCAmcXVhbGl0eSkgIT0gMSkKKwl1c2FnZSgpOworICAgICAgLyogQ2hhbmdlIHNjYWxlIGZhY3RvciBpbiBjYXNlIC1xdGFibGVzIGlzIHByZXNlbnQuICovCisgICAgICBxX3NjYWxlX2ZhY3RvciA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJxc2xvdHMiLCAyKSkgeworICAgICAgLyogUXVhbnRpemF0aW9uIHRhYmxlIHNsb3QgbnVtYmVycy4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIHFzbG90c2FyZyA9IGFyZ3ZbYXJnbl07CisgICAgICAvKiBNdXN0IGRlbGF5IHNldHRpbmcgcXNsb3RzIHVudGlsIGFmdGVyIHdlIGhhdmUgcHJvY2Vzc2VkIGFueQorICAgICAgICogY29sb3JzcGFjZS1kZXRlcm1pbmluZyBzd2l0Y2hlcywgc2luY2UganBlZ19zZXRfY29sb3JzcGFjZSBzZXRzCisgICAgICAgKiBkZWZhdWx0IHF1YW50IHRhYmxlIG51bWJlcnMuCisgICAgICAgKi8KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXRhYmxlcyIsIDIpKSB7CisgICAgICAvKiBRdWFudGl6YXRpb24gdGFibGVzIGZldGNoZWQgZnJvbSBmaWxlLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgcXRhYmxlZmlsZSA9IGFyZ3ZbYXJnbl07CisgICAgICAvKiBXZSBwb3N0cG9uZSBhY3R1YWxseSByZWFkaW5nIHRoZSBmaWxlIGluIGNhc2UgLXF1YWxpdHkgY29tZXMgbGF0ZXIuICovCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInJlc3RhcnQiLCAxKSkgeworICAgICAgLyogUmVzdGFydCBpbnRlcnZhbCBpbiBNQ1Ugcm93cyAob3IgaW4gTUNVcyB3aXRoICdiJykuICovCisgICAgICBsb25nIGx2YWw7CisgICAgICBjaGFyIGNoID0gJ3gnOworCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKKwl1c2FnZSgpOworICAgICAgaWYgKGx2YWwgPCAwIHx8IGx2YWwgPiA2NTUzNUwpCisJdXNhZ2UoKTsKKyAgICAgIGlmIChjaCA9PSAnYicgfHwgY2ggPT0gJ0InKSB7CisJY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAodW5zaWduZWQgaW50KSBsdmFsOworCWNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAwOyAvKiBlbHNlIHByaW9yICctcmVzdGFydCBuJyBvdmVycmlkZXMgbWUgKi8KKyAgICAgIH0gZWxzZSB7CisJY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IChpbnQpIGx2YWw7CisJLyogcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGNvbXB1dGVkIGR1cmluZyBzdGFydHVwICovCisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNhbXBsZSIsIDIpKSB7CisgICAgICAvKiBTZXQgc2FtcGxpbmcgZmFjdG9ycy4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIHNhbXBsZWFyZyA9IGFyZ3ZbYXJnbl07CisgICAgICAvKiBNdXN0IGRlbGF5IHNldHRpbmcgc2FtcGxlIGZhY3RvcnMgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBwcm9jZXNzZWQgYW55CisgICAgICAgKiBjb2xvcnNwYWNlLWRldGVybWluaW5nIHN3aXRjaGVzLCBzaW5jZSBqcGVnX3NldF9jb2xvcnNwYWNlIHNldHMKKyAgICAgICAqIGRlZmF1bHQgc2FtcGxpbmcgZmFjdG9ycy4KKyAgICAgICAqLworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzY2FucyIsIDIpKSB7CisgICAgICAvKiBTZXQgc2NhbiBzY3JpcHQuICovCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBzY2Fuc2FyZyA9IGFyZ3ZbYXJnbl07CisgICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIHJlYWRpbmcgdGhlIGZpbGUgaW4gY2FzZSAtcHJvZ3Jlc3NpdmUgYXBwZWFycy4gKi8KKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgbXVsdGktc2NhbiBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic21vb3RoIiwgMikpIHsKKyAgICAgIC8qIFNldCBpbnB1dCBzbW9vdGhpbmcgZmFjdG9yLiAqLworICAgICAgaW50IHZhbDsKKworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWQiLCAmdmFsKSAhPSAxKQorCXVzYWdlKCk7CisgICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiAxMDApCisJdXNhZ2UoKTsKKyAgICAgIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yID0gdmFsOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0YXJnYSIsIDEpKSB7CisgICAgICAvKiBJbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdC4gKi8KKyAgICAgIGlzX3RhcmdhID0gVFJVRTsKKworICAgIH0gZWxzZSB7CisgICAgICB1c2FnZSgpOwkJCS8qIGJvZ3VzIHN3aXRjaCAqLworICAgIH0KKyAgfQorCisgIC8qIFBvc3Qtc3dpdGNoLXNjYW5uaW5nIGNsZWFudXAgKi8KKworICBpZiAoZm9yX3JlYWwpIHsKKworICAgIC8qIFNldCBxdWFudGl6YXRpb24gdGFibGVzIGZvciBzZWxlY3RlZCBxdWFsaXR5LiAqLworICAgIC8qIFNvbWUgb3IgYWxsIG1heSBiZSBvdmVycmlkZGVuIGlmIC1xdGFibGVzIGlzIHByZXNlbnQuICovCisgICAganBlZ19zZXRfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOworCisgICAgaWYgKHF0YWJsZWZpbGUgIT0gTlVMTCkJLyogcHJvY2VzcyAtcXRhYmxlcyBpZiBpdCB3YXMgcHJlc2VudCAqLworICAgICAgaWYgKCEgcmVhZF9xdWFudF90YWJsZXMoY2luZm8sIHF0YWJsZWZpbGUsCisJCQkgICAgICBxX3NjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpKQorCXVzYWdlKCk7CisKKyAgICBpZiAocXNsb3RzYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXFzbG90cyBpZiBpdCB3YXMgcHJlc2VudCAqLworICAgICAgaWYgKCEgc2V0X3F1YW50X3Nsb3RzKGNpbmZvLCBxc2xvdHNhcmcpKQorCXVzYWdlKCk7CisKKyAgICBpZiAoc2FtcGxlYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNhbXBsZSBpZiBpdCB3YXMgcHJlc2VudCAqLworICAgICAgaWYgKCEgc2V0X3NhbXBsZV9mYWN0b3JzKGNpbmZvLCBzYW1wbGVhcmcpKQorCXVzYWdlKCk7CisKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgIGlmIChzaW1wbGVfcHJvZ3Jlc3NpdmUpCS8qIHByb2Nlc3MgLXByb2dyZXNzaXZlOyAtc2NhbnMgY2FuIG92ZXJyaWRlICovCisgICAgICBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbihjaW5mbyk7CisjZW5kaWYKKworI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgIGlmIChzY2Fuc2FyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1zY2FucyBpZiBpdCB3YXMgcHJlc2VudCAqLworICAgICAgaWYgKCEgcmVhZF9zY2FuX3NjcmlwdChjaW5mbywgc2NhbnNhcmcpKQorCXVzYWdlKCk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiBhcmduOwkJCS8qIHJldHVybiBpbmRleCBvZiBuZXh0IGFyZyAoZmlsZSBuYW1lKSAqLworfQorCisKKy8qCisgKiBUaGUgbWFpbiBwcm9ncmFtLgorICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBzdHJ1Y3QgY2RqcGVnX3Byb2dyZXNzX21nciBwcm9ncmVzczsKKyNlbmRpZgorICBpbnQgZmlsZV9pbmRleDsKKyAgY2pwZWdfc291cmNlX3B0ciBzcmNfbWdyOworICBGSUxFICogaW5wdXRfZmlsZTsKKyAgRklMRSAqIG91dHB1dF9maWxlOworICBKRElNRU5TSU9OIG51bV9zY2FubGluZXM7CisKKyAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KKyNpZmRlZiBVU0VfQ0NPTU1BTkQKKyAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKKyNlbmRpZgorCisgIHByb2duYW1lID0gYXJndlswXTsKKyAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKKyAgICBwcm9nbmFtZSA9ICJjanBlZyI7CQkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KKworICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCisgIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKKyAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKyAgLyogQWRkIHNvbWUgYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgKGZyb20gY2RlcnJvci5oKSAqLworICBqZXJyLmFkZG9uX21lc3NhZ2VfdGFibGUgPSBjZGpwZWdfbWVzc2FnZV90YWJsZTsKKyAgamVyci5maXJzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19GSVJTVEFERE9OQ09ERTsKKyAgamVyci5sYXN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0xBU1RBRERPTkNPREU7CisKKyAgLyogTm93IHNhZmUgdG8gZW5hYmxlIHNpZ25hbCBjYXRjaGVyLiAqLworI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKKyAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIEpQRUcgcGFyYW1ldGVycy4KKyAgICogTXVjaCBvZiB0aGlzIG1heSBiZSBvdmVycmlkZGVuIGxhdGVyLgorICAgKiBJbiBwYXJ0aWN1bGFyLCB3ZSBkb24ndCB5ZXQga25vdyB0aGUgaW5wdXQgZmlsZSdzIGNvbG9yIHNwYWNlLAorICAgKiBidXQgd2UgbmVlZCB0byBwcm92aWRlIHNvbWUgdmFsdWUgZm9yIGpwZWdfc2V0X2RlZmF1bHRzKCkgdG8gd29yay4KKyAgICovCisKKyAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBhcmJpdHJhcnkgZ3Vlc3MgKi8KKyAganBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSB0byBmaW5kIGZpbGUgbmFtZXMuCisgICAqIEl0IGlzIGNvbnZlbmllbnQgdG8gdXNlIGp1c3Qgb25lIHN3aXRjaC1wYXJzaW5nIHJvdXRpbmUsIGJ1dCB0aGUgc3dpdGNoCisgICAqIHZhbHVlcyByZWFkIGhlcmUgYXJlIGlnbm9yZWQ7IHdlIHdpbGwgcmVzY2FuIHRoZSBzd2l0Y2hlcyBhZnRlciBvcGVuaW5nCisgICAqIHRoZSBpbnB1dCBmaWxlLgorICAgKi8KKworICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmNpbmZvLCBhcmdjLCBhcmd2LCAwLCBGQUxTRSk7CisKKyNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQorICAvKiBNdXN0IGhhdmUgZWl0aGVyIC1vdXRmaWxlIHN3aXRjaCBvciBleHBsaWNpdCBvdXRwdXQgZmlsZSBuYW1lICovCisgIGlmIChvdXRmaWxlbmFtZSA9PSBOVUxMKSB7CisgICAgaWYgKGZpbGVfaW5kZXggIT0gYXJnYy0yKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2ZpbGVfaW5kZXgrMV07CisgIH0gZWxzZSB7CisgICAgaWYgKGZpbGVfaW5kZXggIT0gYXJnYy0xKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KKyAgaWYgKGZpbGVfaW5kZXggPCBhcmdjLTEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7CisgICAgdXNhZ2UoKTsKKyAgfQorI2VuZGlmIC8qIFRXT19GSUxFX0NPTU1BTkRMSU5FICovCisKKyAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZS4gKi8KKyAgaWYgKGZpbGVfaW5kZXggPCBhcmdjKSB7CisgICAgaWYgKChpbnB1dF9maWxlID0gZm9wZW4oYXJndltmaWxlX2luZGV4XSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndltmaWxlX2luZGV4XSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGRlZmF1bHQgaW5wdXQgZmlsZSBpcyBzdGRpbiAqLworICAgIGlucHV0X2ZpbGUgPSByZWFkX3N0ZGluKCk7CisgIH0KKworICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KKyAgaWYgKG91dGZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICBpZiAoKG91dHB1dF9maWxlID0gZm9wZW4ob3V0ZmlsZW5hbWUsIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBvdXRmaWxlbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgaXMgc3Rkb3V0ICovCisgICAgb3V0cHV0X2ZpbGUgPSB3cml0ZV9zdGRvdXQoKTsKKyAgfQorCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIHN0YXJ0X3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmNpbmZvLCAmcHJvZ3Jlc3MpOworI2VuZGlmCisKKyAgLyogRmlndXJlIG91dCB0aGUgaW5wdXQgZmlsZSBmb3JtYXQsIGFuZCBzZXQgdXAgdG8gcmVhZCBpdC4gKi8KKyAgc3JjX21nciA9IHNlbGVjdF9maWxlX3R5cGUoJmNpbmZvLCBpbnB1dF9maWxlKTsKKyAgc3JjX21nci0+aW5wdXRfZmlsZSA9IGlucHV0X2ZpbGU7CisKKyAgLyogUmVhZCB0aGUgaW5wdXQgZmlsZSBoZWFkZXIgdG8gb2J0YWluIGZpbGUgc2l6ZSAmIGNvbG9yc3BhY2UuICovCisgICgqc3JjX21nci0+c3RhcnRfaW5wdXQpICgmY2luZm8sIHNyY19tZ3IpOworCisgIC8qIE5vdyB0aGF0IHdlIGtub3cgaW5wdXQgY29sb3JzcGFjZSwgZml4IGNvbG9yc3BhY2UtZGVwZW5kZW50IGRlZmF1bHRzICovCisgIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlKCZjaW5mbyk7CisKKyAgLyogQWRqdXN0IGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycyBieSByZS1wYXJzaW5nIHRoZSBvcHRpb25zICovCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmY2luZm8sIGFyZ2MsIGFyZ3YsIDAsIFRSVUUpOworCisgIC8qIFNwZWNpZnkgZGF0YSBkZXN0aW5hdGlvbiBmb3IgY29tcHJlc3Npb24gKi8KKyAganBlZ19zdGRpb19kZXN0KCZjaW5mbywgb3V0cHV0X2ZpbGUpOworCisgIC8qIFN0YXJ0IGNvbXByZXNzb3IgKi8KKyAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOworCisgIC8qIFByb2Nlc3MgZGF0YSAqLworICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgeworICAgIG51bV9zY2FubGluZXMgPSAoKnNyY19tZ3ItPmdldF9waXhlbF9yb3dzKSAoJmNpbmZvLCBzcmNfbWdyKTsKKyAgICAodm9pZCkganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCBzcmNfbWdyLT5idWZmZXIsIG51bV9zY2FubGluZXMpOworICB9CisKKyAgLyogRmluaXNoIGNvbXByZXNzaW9uIGFuZCByZWxlYXNlIG1lbW9yeSAqLworICAoKnNyY19tZ3ItPmZpbmlzaF9pbnB1dCkgKCZjaW5mbywgc3JjX21ncik7CisgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisgIGpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOworCisgIC8qIENsb3NlIGZpbGVzLCBpZiB3ZSBvcGVuZWQgdGhlbSAqLworICBpZiAoaW5wdXRfZmlsZSAhPSBzdGRpbikKKyAgICBmY2xvc2UoaW5wdXRfZmlsZSk7CisgIGlmIChvdXRwdXRfZmlsZSAhPSBzdGRvdXQpCisgICAgZmNsb3NlKG91dHB1dF9maWxlKTsKKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBlbmRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8pOworI2VuZGlmCisKKyAgLyogQWxsIGRvbmUuICovCisgIGV4aXQoamVyci5udW1fd2FybmluZ3MgPyBFWElUX1dBUk5JTkcgOiBFWElUX1NVQ0NFU1MpOworICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KK30KZGlmZiAtLWdpdCBhL2pwZWcvY2tjb25maWcuYyBiL2pwZWcvY2tjb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGJhZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9ja2NvbmZpZy5jCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogY2tjb25maWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBpbnRlbmRlZCB0byBoZWxwIHlvdSBkZXRlcm1pbmUgaG93IHRvIGNvbmZpZ3VyZSB0aGUgSlBFRworICogc29mdHdhcmUgZm9yIGluc3RhbGxhdGlvbiBvbiBhIHBhcnRpY3VsYXIgc3lzdGVtLiAgVGhlIGlkZWEgaXMgdG8gdHJ5IHRvCisgKiBjb21waWxlIGFuZCBleGVjdXRlIHRoaXMgcHJvZ3JhbS4gIElmIHlvdXIgY29tcGlsZXIgZmFpbHMgdG8gY29tcGlsZSB0aGUKKyAqIHByb2dyYW0sIG1ha2UgY2hhbmdlcyBhcyBpbmRpY2F0ZWQgaW4gdGhlIGNvbW1lbnRzIGJlbG93LiAgT25jZSB5b3UgY2FuCisgKiBjb21waWxlIHRoZSBwcm9ncmFtLCBydW4gaXQsIGFuZCBpdCB3aWxsIHByb2R1Y2UgYSAiamNvbmZpZy5oIiBmaWxlIGZvcgorICogeW91ciBzeXN0ZW0uCisgKgorICogQXMgYSBnZW5lcmFsIHJ1bGUsIGVhY2ggdGltZSB5b3UgdHJ5IHRvIGNvbXBpbGUgdGhpcyBwcm9ncmFtLAorICogcGF5IGF0dGVudGlvbiBvbmx5IHRvIHRoZSAqZmlyc3QqIGVycm9yIG1lc3NhZ2UgeW91IGdldCBmcm9tIHRoZSBjb21waWxlci4KKyAqIE1hbnkgQyBjb21waWxlcnMgd2lsbCBpc3N1ZSBsb3RzIG9mIHNwdXJpb3VzIGVycm9yIG1lc3NhZ2VzIG9uY2UgdGhleQorICogaGF2ZSBnb3R0ZW4gY29uZnVzZWQuICBHbyB0byB0aGUgbGluZSBpbmRpY2F0ZWQgaW4gdGhlIGZpcnN0IGVycm9yIG1lc3NhZ2UsCisgKiBhbmQgcmVhZCB0aGUgY29tbWVudHMgcHJlY2VkaW5nIHRoYXQgbGluZSB0byBzZWUgd2hhdCB0byBjaGFuZ2UuCisgKgorICogQWxtb3N0IGFsbCBvZiB0aGUgZWRpdHMgeW91IG1heSBuZWVkIHRvIG1ha2UgdG8gdGhpcyBwcm9ncmFtIGNvbnNpc3Qgb2YKKyAqIGNoYW5naW5nIGEgbGluZSB0aGF0IHJlYWRzICIjZGVmaW5lIFNPTUVfU1lNQk9MIiB0byAiI3VuZGVmIFNPTUVfU1lNQk9MIiwKKyAqIG9yIHZpY2UgdmVyc2EuICBUaGlzIGlzIGNhbGxlZCBkZWZpbmluZyBvciB1bmRlZmluaW5nIHRoYXQgc3ltYm9sLgorICovCisKKworLyogRmlyc3Qgd2UgbXVzdCBzZWUgaWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBpbmNsdWRlIGZpbGVzIHdlIG5lZWQuCisgKiBXZSBzdGFydCBvdXQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHlvdXIgc3lzdGVtIGhhcyBhbGwgdGhlIEFOU0ktc3RhbmRhcmQKKyAqIGluY2x1ZGUgZmlsZXMuICBJZiB5b3UgZ2V0IGFueSBlcnJvciB0cnlpbmcgdG8gaW5jbHVkZSBvbmUgb2YgdGhlc2UgZmlsZXMsCisgKiB1bmRlZmluZSB0aGUgY29ycmVzcG9uZGluZyBIQVZFX3h4eCBzeW1ib2wuCisgKi8KKworI2RlZmluZSBIQVZFX1NURERFRl9ICQkvKiByZXBsYWNlICdkZWZpbmUnIGJ5ICd1bmRlZicgaWYgZXJyb3IgaGVyZSAqLworI2lmZGVmIEhBVkVfU1REREVGX0gJCS8qIG5leHQgbGluZSB3aWxsIGJlIHNraXBwZWQgaWYgeW91IHVuZGVmLi4uICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworI2RlZmluZSBIQVZFX1NURExJQl9ICQkvKiBzYW1lIHRoaW5nIGZvciBzdGRsaWIuaCAqLworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIElmIHlvdSBhaW4ndCBnb3QgdGhpcywgeW91IGFpbid0IGdvdCBDLiAqLworCisvKiBXZSBoYXZlIHRvIHNlZSBpZiB5b3VyIHN0cmluZyBmdW5jdGlvbnMgYXJlIGRlZmluZWQgYnkKKyAqIHN0cmluZ3MuaCAob2xkIEJTRCBjb252ZW50aW9uKSBvciBzdHJpbmcuaCAoZXZlcnlib2R5IGVsc2UpLgorICogV2UgdHJ5IHRoZSBub24tQlNEIGNvbnZlbnRpb24gZmlyc3Q7IGRlZmluZSBORUVEX0JTRF9TVFJJTkdTCisgKiBpZiB0aGUgY29tcGlsZXIgc2F5cyBpdCBjYW4ndCBmaW5kIHN0cmluZy5oLgorICovCisKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisKKyNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvKiBPbiBzb21lIHN5c3RlbXMgKGVzcGVjaWFsbHkgb2xkZXIgVW5peCBtYWNoaW5lcyksIHR5cGUgc2l6ZV90IGlzCisgKiBkZWZpbmVkIG9ubHkgaW4gdGhlIGluY2x1ZGUgZmlsZSA8c3lzL3R5cGVzLmg+LiAgSWYgeW91IGdldCBhIGZhaWx1cmUKKyAqIG9uIHRoZSBzaXplX3QgdGVzdCBiZWxvdywgdHJ5IGRlZmluaW5nIE5FRURfU1lTX1RZUEVTX0guCisgKi8KKworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gJCS8qIHN0YXJ0IGJ5IGFzc3VtaW5nIHdlIGRvbid0IG5lZWQgaXQgKi8KKyNpZmRlZiBORUVEX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworCisvKiBVc3VhbGx5IHR5cGUgc2l6ZV90IGlzIGRlZmluZWQgaW4gb25lIG9mIHRoZSBpbmNsdWRlIGZpbGVzIHdlJ3ZlIGluY2x1ZGVkCisgKiBhYm92ZS4gIElmIG5vdCwgeW91J2xsIGdldCBhbiBlcnJvciBvbiB0aGUgInR5cGVkZWYgc2l6ZV90IG15X3NpemVfdDsiIGxpbmUuCisgKiBJbiB0aGF0IGNhc2UsIGZpcnN0IHRyeSBkZWZpbmluZyBORUVEX1NZU19UWVBFU19IIGp1c3QgYWJvdmUuCisgKiBJZiB0aGF0IGRvZXNuJ3Qgd29yaywgeW91J2xsIGhhdmUgdG8gc2VhcmNoIHRocm91Z2ggeW91ciBzeXN0ZW0gbGlicmFyeQorICogdG8gZmlndXJlIG91dCB3aGljaCBpbmNsdWRlIGZpbGUgZGVmaW5lcyAic2l6ZV90Ii4gIExvb2sgZm9yIGEgbGluZSB0aGF0CisgKiBzYXlzICJ0eXBlZGVmIHNvbWV0aGluZy1vci1vdGhlciBzaXplX3Q7Ii4gIFRoZW4sIGNoYW5nZSB0aGUgbGluZSBiZWxvdworICogdGhhdCBzYXlzICIjaW5jbHVkZSA8c29tZWluY2x1ZGVmaWxlLmg+IiB0byBpbnN0ZWFkIGluY2x1ZGUgdGhlIGZpbGUKKyAqIHlvdSBmb3VuZCBzaXplX3QgaW4sIGFuZCBkZWZpbmUgTkVFRF9TUEVDSUFMX0lOQ0xVREUuICBJZiB5b3UgY2FuJ3QgZmluZAorICogdHlwZSBzaXplX3QgYW55d2hlcmUsIHRyeSByZXBsYWNpbmcgIiNpbmNsdWRlIDxzb21laW5jbHVkZWZpbGUuaD4iIHdpdGgKKyAqICJ0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7Ii4KKyAqLworCisjdW5kZWYgTkVFRF9TUEVDSUFMX0lOQ0xVREUJLyogYXNzdW1lIHdlIERPTidUIG5lZWQgaXQsIGZvciBzdGFydGVycyAqLworCisjaWZkZWYgTkVFRF9TUEVDSUFMX0lOQ0xVREUKKyNpbmNsdWRlIDxzb21laW5jbHVkZWZpbGUuaD4KKyNlbmRpZgorCit0eXBlZGVmIHNpemVfdCBteV9zaXplX3Q7CS8qIFRoZSBwYXlvZmY6IGRvIHdlIGhhdmUgc2l6ZV90IG5vdz8gKi8KKworCisvKiBUaGUgbmV4dCBxdWVzdGlvbiBpcyB3aGV0aGVyIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgQU5TSS1zdHlsZSBmdW5jdGlvbgorICogcHJvdG90eXBlcy4gIFlvdSBuZWVkIHRvIGtub3cgdGhpcyBpbiBvcmRlciB0byBjaG9vc2UgYmV0d2VlbiB1c2luZworICogbWFrZWZpbGUuYW5zaSBhbmQgdXNpbmcgbWFrZWZpbGUudW5peC4KKyAqIFRoZSAjZGVmaW5lIGxpbmUgYmVsb3cgaXMgc2V0IHRvIGFzc3VtZSB5b3UgaGF2ZSBBTlNJIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKiBJZiB5b3UgZ2V0IGFuIGVycm9yIGluIHRoaXMgZ3JvdXAgb2YgbGluZXMsIHVuZGVmaW5lIEhBVkVfUFJPVE9UWVBFUy4KKyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMik7IC8qIGNoZWNrIHByb3RvdHlwZXMgKi8KKworc3RydWN0IG1ldGhvZHNfc3RydWN0IHsJCS8qIGNoZWNrIG1ldGhvZC1wb2ludGVyIGRlY2xhcmF0aW9ucyAqLworICBpbnQgKCplcnJvcl9leGl0KSAoY2hhciAqbXNndGV4dCk7CisgIGludCAoKnRyYWNlX21lc3NhZ2UpIChjaGFyICptc2d0ZXh0KTsKKyAgaW50ICgqYW5vdGhlcl9tZXRob2QpICh2b2lkKTsKK307CisKK2ludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKSAvKiBjaGVjayBkZWZpbml0aW9ucyAqLworeworICByZXR1cm4gYXJnMlthcmcxXTsKK30KKworaW50IHRlc3QyZnVuY3Rpb24gKHZvaWQpCS8qIGNoZWNrIHZvaWQgYXJnIGxpc3QgKi8KK3sKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisvKiBOb3cgd2Ugd2FudCB0byBmaW5kIG91dCBpZiB5b3VyIGNvbXBpbGVyIGtub3dzIHdoYXQgInVuc2lnbmVkIGNoYXIiIG1lYW5zLgorICogSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgInVuc2lnbmVkIGNoYXIgdW5fY2hhcjsiIGxpbmUsCisgKiB0aGVuIHVuZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUi4KKyAqLworCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCit1bnNpZ25lZCBjaGFyIHVuX2NoYXI7CisjZW5kaWYKKworCisvKiBOb3cgd2Ugd2FudCB0byBmaW5kIG91dCBpZiB5b3VyIGNvbXBpbGVyIGtub3dzIHdoYXQgInVuc2lnbmVkIHNob3J0IiBtZWFucy4KKyAqIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlICJ1bnNpZ25lZCBzaG9ydCB1bl9zaG9ydDsiIGxpbmUsCisgKiB0aGVuIHVuZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQuCisgKi8KKworI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCit1bnNpZ25lZCBzaG9ydCB1bl9zaG9ydDsKKyNlbmRpZgorCisKKy8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIgdW5kZXJzdGFuZHMgdHlwZSAidm9pZCIuCisgKiBJZiB5b3UgZ2V0IGFuIGVycm9yIGFueXdoZXJlIGluIGhlcmUsIHVuZGVmaW5lIEhBVkVfVk9JRC4KKyAqLworCisjZGVmaW5lIEhBVkVfVk9JRAorCisjaWZkZWYgSEFWRV9WT0lECisvKiBDYXV0aW9uOiBhIEMrKyBjb21waWxlciB3aWxsIGluc2lzdCBvbiBjb21wbGV0ZSBwcm90b3R5cGVzICovCit0eXBlZGVmIHZvaWQgKiB2b2lkX3B0cjsJLyogY2hlY2sgdm9pZCAqICovCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayBwdHIgdG8gZnVuY3Rpb24gcmV0dXJuaW5nIHZvaWQgKi8KK3R5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKGludCBhLCBpbnQgYik7CisjZWxzZQordHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayB2b2lkIGZ1bmN0aW9uIHJlc3VsdCAqLwordm9pZCB0ZXN0M2Z1bmN0aW9uICh2b2lkX3B0ciBhcmcxLCB2b2lkX2Z1bmMgYXJnMikKKyNlbHNlCit2b2lkIHRlc3QzZnVuY3Rpb24gKGFyZzEsIGFyZzIpCisgICAgIHZvaWRfcHRyIGFyZzE7CisgICAgIHZvaWRfZnVuYyBhcmcyOworI2VuZGlmCit7CisgIGNoYXIgKiBsb2NwdHIgPSAoY2hhciAqKSBhcmcxOyAvKiBjaGVjayBjYXN0aW5nIHRvIGFuZCBmcm9tIHZvaWQgKiAqLworICBhcmcxID0gKHZvaWQgKikgbG9jcHRyOworICAoKmFyZzIpICgxLCAyKTsJCS8qIGNoZWNrIGNhbGwgb2YgZmNuIHJldHVybmluZyB2b2lkICovCit9CisjZW5kaWYKKworCisvKiBOb3cgd2Ugd2FudCB0byBmaW5kIG91dCBpZiB5b3VyIGNvbXBpbGVyIGtub3dzIHdoYXQgImNvbnN0IiBtZWFucy4KKyAqIElmIHlvdSBnZXQgYW4gZXJyb3IgaGVyZSwgdW5kZWZpbmUgSEFWRV9DT05TVC4KKyAqLworCisjZGVmaW5lIEhBVkVfQ09OU1QKKworI2lmZGVmIEhBVkVfQ09OU1QKK3N0YXRpYyBjb25zdCBpbnQgY2FycmF5WzNdID0gezEsIDIsIDN9OworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgdGVzdDRmdW5jdGlvbiAoY29uc3QgaW50IGFyZzEpCisjZWxzZQoraW50IHRlc3Q0ZnVuY3Rpb24gKGFyZzEpCisgICAgIGNvbnN0IGludCBhcmcxOworI2VuZGlmCit7CisgIHJldHVybiBjYXJyYXlbYXJnMV07Cit9CisjZW5kaWYKKworCisvKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG9yIHdhcm5pbmcgYWJvdXQgdGhpcyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiwKKyAqIGRlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTi4KKyAqLworCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmbmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgordHlwZWRlZiBzdHJ1Y3QgdW5kZWZpbmVkX3N0cnVjdHVyZSAqIHVuZGVmX3N0cnVjdF9wdHI7CisjZW5kaWYKKworCisvKiBJZiB5b3UgZ2V0IGFuIGVycm9yIGFib3V0IGR1cGxpY2F0ZSBuYW1lcywKKyAqIGRlZmluZSBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTLgorICovCisKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKyNpZm5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworCitpbnQgcG9zc2libHlfZHVwbGljYXRlX2Z1bmN0aW9uICgpCit7CisgIHJldHVybiAwOworfQorCitpbnQgcG9zc2libHlfZHVwbGlfZnVuY3Rpb24gKCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE9LLCB0aGF0J3MgaXQuICBZb3Ugc2hvdWxkIG5vdCBoYXZlIHRvIGNoYW5nZSBhbnl0aGluZyBiZXlvbmQgdGhpcworICogIHBvaW50IGluIG9yZGVyIHRvIGNvbXBpbGUgYW5kIGV4ZWN1dGUgdGhpcyBwcm9ncmFtLiAgKFlvdSBtaWdodCBnZXQKKyAqICBzb21lIHdhcm5pbmdzLCBidXQgeW91IGNhbiBpZ25vcmUgdGhlbS4pCisgKiAgV2hlbiB5b3UgcnVuIHRoZSBwcm9ncmFtLCBpdCB3aWxsIG1ha2UgYSBjb3VwbGUgbW9yZSB0ZXN0cyB0aGF0IGl0CisgKiAgY2FuIGRvIGF1dG9tYXRpY2FsbHksIGFuZCB0aGVuIGl0IHdpbGwgY3JlYXRlIGpjb25maWcuaCBhbmQgcHJpbnQgb3V0CisgKiAgYW55IGFkZGl0aW9uYWwgc3VnZ2VzdGlvbnMgaXQgaGFzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworaW50IGlzX2NoYXJfc2lnbmVkIChpbnQgYXJnKQorI2Vsc2UKK2ludCBpc19jaGFyX3NpZ25lZCAoYXJnKQorICAgICBpbnQgYXJnOworI2VuZGlmCit7CisgIGlmIChhcmcgPT0gMTg5KSB7CQkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHVuc2lnbmVkIGNoYXIgKi8KKyAgICByZXR1cm4gMDsJCQkvKiB0eXBlIGNoYXIgaXMgdW5zaWduZWQgKi8KKyAgfQorICBlbHNlIGlmIChhcmcgIT0gLTY3KSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIGNoYXIgKi8KKyAgICBwcmludGYoIkhtbSwgaXQgc2VlbXMgJ2NoYXInIGlzIG5vdCBlaWdodCBiaXRzIHdpZGUgb24geW91ciBtYWNoaW5lLlxuIik7CisgICAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOworICB9CisgIHJldHVybiAxOwkJCS8qIGFzc3VtZSBjaGFyIGlzIHNpZ25lZCBvdGhlcndpc2UgKi8KK30KKworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChsb25nIGFyZykKKyNlbHNlCitpbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChhcmcpCisgICAgIGxvbmcgYXJnOworI2VuZGlmCisvKiBTZWUgd2hldGhlciByaWdodC1zaGlmdCBvbiBhIGxvbmcgaXMgc2lnbmVkIG9yIG5vdC4gKi8KK3sKKyAgbG9uZyByZXMgPSBhcmcgPj4gNDsKKworICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIHNoaWZ0ICovCisgICAgcmV0dXJuIDE7CQkJLyogcmlnaHQgc2hpZnQgaXMgc2lnbmVkICovCisgIH0KKyAgLyogc2VlIGlmIHVuc2lnbmVkLXNoaWZ0IGhhY2sgd2lsbCBmaXggaXQuICovCisgIC8qIHdlIGNhbid0IGp1c3QgdGVzdCBleGFjdCB2YWx1ZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHdpZHRoIG9mIGxvbmcuLi4gKi8KKyAgcmVzIHw9ICh+MEwpIDw8ICgzMi00KTsKKyAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgbm93PyAqLworICAgIHJldHVybiAwOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkICovCisgIH0KKyAgcHJpbnRmKCJSaWdodCBzaGlmdCBpc24ndCBhY3RpbmcgYXMgSSBleHBlY3QgaXQgdG8uXG4iKTsKKyAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOworICByZXR1cm4gMDsJCQkvKiB0cnkgaXQgd2l0aCB1bnNpZ25lZCBhbnl3YXkgKi8KK30KKworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKKyNlbHNlCitpbnQgbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiogYXJndjsKKyNlbmRpZgoreworICBjaGFyIHNpZ25lZF9jaGFyX2NoZWNrID0gKGNoYXIpICgtNjcpOworICBGSUxFICpvdXRmaWxlOworCisgIC8qIEF0dGVtcHQgdG8gd3JpdGUgamNvbmZpZy5oICovCisgIGlmICgob3V0ZmlsZSA9IGZvcGVuKCJqY29uZmlnLmgiLCAidyIpKSA9PSBOVUxMKSB7CisgICAgcHJpbnRmKCJGYWlsZWQgdG8gd3JpdGUgamNvbmZpZy5oXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIFdyaXRlIG91dCBhbGwgdGhlIGluZm8gKi8KKyAgZnByaW50ZihvdXRmaWxlLCAiLyogamNvbmZpZy5oIC0tLSBnZW5lcmF0ZWQgYnkgY2tjb25maWcuYyAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIi8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovXG5cbiIpOworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfUFJPVE9UWVBFU1xuIik7CisjZWxzZQorICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSEFWRV9QUk9UT1RZUEVTXG4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUlxuIik7CisjZWxzZQorICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSEFWRV9VTlNJR05FRF9DSEFSXG4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUXG4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfVk9JRAorICBmcHJpbnRmKG91dGZpbGUsICIvKiAjZGVmaW5lIHZvaWQgY2hhciAqL1xuIik7CisjZWxzZQorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIHZvaWQgY2hhclxuIik7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0NPTlNUCisgIGZwcmludGYob3V0ZmlsZSwgIi8qICNkZWZpbmUgY29uc3QgKi9cbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBjb25zdFxuIik7CisjZW5kaWYKKyAgaWYgKGlzX2NoYXJfc2lnbmVkKChpbnQpIHNpZ25lZF9jaGFyX2NoZWNrKSkKKyAgICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgQ0hBUl9JU19VTlNJR05FRFxuIik7CisgIGVsc2UKKyAgICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIENIQVJfSVNfVU5TSUdORURcbiIpOworI2lmZGVmIEhBVkVfU1REREVGX0gKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1NURERFRl9IXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1NURERFRl9IXG4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1NURExJQl9IXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1NURExJQl9IXG4iKTsKKyNlbmRpZgorI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBORUVEX0JTRF9TVFJJTkdTXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX0JTRF9TVFJJTkdTXG4iKTsKKyNlbmRpZgorI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBORUVEX1NZU19UWVBFU19IXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX1NZU19UWVBFU19IXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlNcbiIpOworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTXG4iKTsKKyNlbmRpZgorI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU5cbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKG91dGZpbGUsICJcbiNpZmRlZiBKUEVHX0lOVEVSTkFMU1xuXG4iKTsKKyAgaWYgKGlzX3NoaWZ0aW5nX3NpZ25lZCgtMHg3RjdFODBCMUwpKQorICAgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRFxuIik7CisgIGVsc2UKKyAgICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiXG4jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICJcbiNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHXG5cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cblxuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQkvKiBZb3UgbWF5IG5lZWQgdGhpcyBvbiBub24tVW5peCBzeXN0ZW1zICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIERPTlRfVVNFX0JfTU9ERVxuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIi8qICNkZWZpbmUgUFJPR1JFU1NfUkVQT1JUICovCS8qIG9wdGlvbmFsICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiXG4jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqL1xuIik7CisKKyAgLyogQ2xvc2UgdGhlIGpjb25maWcuaCBmaWxlICovCisgIGZjbG9zZShvdXRmaWxlKTsKKworICAvKiBVc2VyIHJlcG9ydCAqLworICBwcmludGYoIkNvbmZpZ3VyYXRpb24gY2hlY2sgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZSBkb25lLlxuIik7CisgIHByaW50ZigiXG5JIGhhdmUgd3JpdHRlbiB0aGUgamNvbmZpZy5oIGZpbGUgZm9yIHlvdS5cblxuIik7CisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisgIHByaW50ZigiWW91IHNob3VsZCB1c2UgbWFrZWZpbGUuYW5zaSBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgTWFrZWZpbGUuXG4iKTsKKyNlbHNlCisgIHByaW50ZigiWW91IHNob3VsZCB1c2UgbWFrZWZpbGUudW5peCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgTWFrZWZpbGUuXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9TUEVDSUFMX0lOQ0xVREUKKyAgcHJpbnRmKCJcbllvdSdsbCBuZWVkIHRvIGNoYW5nZSBqY29uZmlnLmggdG8gaW5jbHVkZSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZVxuIik7CisgIHByaW50ZigidGhhdCB5b3UgZm91bmQgdHlwZSBzaXplX3QgaW4sIG9yIGFkZCBhIGRpcmVjdCBkZWZpbml0aW9uIG9mIHR5cGVcbiIpOworICBwcmludGYoInNpemVfdCBpZiB0aGF0J3Mgd2hhdCB5b3UgdXNlZC4gIEp1c3QgYWRkIGl0IHRvIHRoZSBlbmQuXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvanBlZy9jb2RlcnVsZXMuZG9jIGIvanBlZy9jb2RlcnVsZXMuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjVkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2NvZGVydWxlcy5kb2MKQEAgLTAsMCArMSwxMTggQEAKK0lKRyBKUEVHIExJQlJBUlk6ICBDT0RJTkcgUlVMRVMKKworQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KK0ZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKworCitTaW5jZSBudW1lcm91cyBwZW9wbGUgd2lsbCBiZSBjb250cmlidXRpbmcgY29kZSBhbmQgYnVnIGZpeGVzLCBpdCdzIGltcG9ydGFudAordG8gZXN0YWJsaXNoIGEgY29tbW9uIGNvZGluZyBzdHlsZS4gIFRoZSBnb2FsIG9mIHVzaW5nIHNpbWlsYXIgY29kaW5nIHN0eWxlcworaXMgbXVjaCBtb3JlIGltcG9ydGFudCB0aGFuIHRoZSBkZXRhaWxzIG9mIGp1c3Qgd2hhdCB0aGF0IHN0eWxlIGlzLgorCitJbiBnZW5lcmFsIHdlIGZvbGxvdyB0aGUgcmVjb21tZW5kYXRpb25zIG9mICJSZWNvbW1lbmRlZCBDIFN0eWxlIGFuZCBDb2RpbmcKK1N0YW5kYXJkcyIgcmV2aXNpb24gNi4xIChDYW5ub24gZXQgYWwuIGFzIG1vZGlmaWVkIGJ5IFNwZW5jZXIsIEtlcHBlbCBhbmQKK0JyYWRlcikuICBUaGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBpbiB0aGUgSUpHIEZUUCBhcmNoaXZlIChzZWUKK2pwZWcvZG9jL2NzdHlsZS5tcy50YmwuWiwgb3IgY3N0eWxlLnR4dC5aIGZvciB0aG9zZSB3aXRob3V0IG5yb2ZmL3RibCkuCisKK0Jsb2NrIGNvbW1lbnRzIHNob3VsZCBiZSBsYWlkIG91dCB0aHVzbHk6CisKKy8qCisgKiAgQmxvY2sgY29tbWVudHMgaW4gdGhpcyBzdHlsZS4KKyAqLworCitXZSBpbmRlbnQgc3RhdGVtZW50cyBpbiBLJlIgc3R5bGUsIGUuZy4sCisJaWYgKHRlc3QpIHsKKwkgIHRoZW4tcGFydDsKKwl9IGVsc2UgeworCSAgZWxzZS1wYXJ0OworCX0KK3dpdGggdHdvIHNwYWNlcyBwZXIgaW5kZW50YXRpb24gbGV2ZWwuICAoVGhpcyBpbmRlbnRhdGlvbiBjb252ZW50aW9uIGlzCitoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgR05VIEVtYWNzIGFuZCBtYW55IG90aGVyIHRleHQgZWRpdG9ycy4pCisKK011bHRpLXdvcmQgbmFtZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gbG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzLCBlLmcuLAorbXVsdGlfd29yZF9uYW1lIChub3QgbXVsdGlXb3JkTmFtZSkuICBQcmVwcm9jZXNzb3Igc3ltYm9scyBhbmQgZW51bSBjb25zdGFudHMKK2FyZSBzaW1pbGFyIGJ1dCB1cHBlciBjYXNlIChNVUxUSV9XT1JEX05BTUUpLiAgTmFtZXMgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4KK3RoZSBmaXJzdCBmaWZ0ZWVuIGNoYXJhY3RlcnMuICAoT24gc29tZSBvbGRlciBzeXN0ZW1zLCBnbG9iYWwgbmFtZXMgbXVzdCBiZQordW5pcXVlIHdpdGhpbiBzaXggY2hhcmFjdGVycy4gIFdlIGFjY29tbW9kYXRlIHRoaXMgd2l0aG91dCBjbHV0dGVyaW5nIHRoZQorc291cmNlIGNvZGUgYnkgdXNpbmcgbWFjcm9zIHRvIHN1YnN0aXR1dGUgc2hvcnRlciBuYW1lcy4pCisKK1dlIHVzZSBmdW5jdGlvbiBwcm90b3R5cGVzIGV2ZXJ5d2hlcmU7IHdlIHJlbHkgb24gYXV0b21hdGljIHNvdXJjZSBjb2RlCit0cmFuc2Zvcm1hdGlvbiB0byBmZWVkIHByb3RvdHlwZS1sZXNzIEMgY29tcGlsZXJzLiAgVHJhbnNmb3JtYXRpb24gaXMgZG9uZQorYnkgdGhlIHNpbXBsZSBhbmQgcG9ydGFibGUgdG9vbCAnYW5zaTJrbnIuYycgKGNvdXJ0ZXN5IG9mIEdob3N0c2NyaXB0KS4KK2Fuc2kya25yIGlzIG5vdCB2ZXJ5IGJyaWdodCwgc28gaXQgaW1wb3NlcyBhIGZvcm1hdCByZXF1aXJlbWVudCBvbiBmdW5jdGlvbgorZGVjbGFyYXRpb25zOiB0aGUgZnVuY3Rpb24gbmFtZSBNVVNUIEJFR0lOIElOIENPTFVNTiAxLiAgVGh1cyBhbGwgZnVuY3Rpb25zCitzaG91bGQgYmUgd3JpdHRlbiBpbiB0aGUgZm9sbG93aW5nIHN0eWxlOgorCitMT0NBTChpbnQgKikKK2Z1bmN0aW9uX25hbWUgKGludCBhLCBjaGFyICpiKQoreworICAgIGNvZGUuLi4KK30KKworTm90ZSB0aGF0IGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbiBtdXN0IGJlZ2luIHdpdGggR0xPQkFMKHR5cGUpLCBMT0NBTCh0eXBlKSwKK29yIE1FVEhPRERFRih0eXBlKS4gIFRoZXNlIG1hY3JvcyBleHBhbmQgdG8gInN0YXRpYyB0eXBlIiBvciBqdXN0ICJ0eXBlIiBhcworYXBwcm9wcmlhdGUuICBUaGV5IHByb3ZpZGUgYSByZWFkYWJsZSBpbmRpY2F0aW9uIG9mIHRoZSByb3V0aW5lJ3MgdXNhZ2UgYW5kCitjYW4gcmVhZGlseSBiZSBjaGFuZ2VkIGZvciBzcGVjaWFsIG5lZWRzLiAgKEZvciBpbnN0YW5jZSwgc3BlY2lhbCBsaW5rYWdlCitrZXl3b3JkcyBjYW4gYmUgaW5zZXJ0ZWQgZm9yIHVzZSBpbiBXaW5kb3dzIERMTHMuKQorCithbnNpMmtuciBkb2VzIG5vdCB0cmFuc2Zvcm0gbWV0aG9kIGRlY2xhcmF0aW9ucyAoZnVuY3Rpb24gcG9pbnRlcnMgaW4KK3N0cnVjdHMpLiAgV2UgaGFuZGxlIHRoZXNlIHdpdGggYSBtYWNybyBKTUVUSE9ELCBkZWZpbmVkIGFzCisJI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworCSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSBhcmdsaXN0CisJI2Vsc2UKKwkjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgKCkKKwkjZW5kaWYKK3doaWNoIGlzIHVzZWQgbGlrZSB0aGlzOgorCXN0cnVjdCBmdW5jdGlvbl9wb2ludGVycyB7CisJICBKTUVUSE9EKHZvaWQsIGluaXRfZW50cm9weV9lbmNvZGVyLCAoaW50IHNvbWVhcmcsIGpwYXJtcyAqanApKTsKKwkgIEpNRVRIT0Qodm9pZCwgdGVybV9lbnRyb3B5X2VuY29kZXIsICh2b2lkKSk7CisJfTsKK05vdGUgdGhlIHNldCBvZiBwYXJlbnRoZXNlcyBzdXJyb3VuZGluZyB0aGUgcGFyYW1ldGVyIGxpc3QuCisKK0Egc2ltaWxhciBzb2x1dGlvbiBpcyB1c2VkIGZvciBmb3J3YXJkIGFuZCBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyhzZWUgdGhlIEVYVEVSTiBhbmQgSlBQIG1hY3JvcykuCisKK0lmIHRoZSBjb2RlIGlzIHRvIHdvcmsgb24gbm9uLUFOU0kgY29tcGlsZXJzLCB3ZSBjYW5ub3QgcmVseSBvbiBhIHByb3RvdHlwZQorZGVjbGFyYXRpb24gdG8gY29lcmNlIGFjdHVhbCBwYXJhbWV0ZXJzIGludG8gdGhlIHJpZ2h0IHR5cGVzLiAgVGhlcmVmb3JlLCB1c2UKK2V4cGxpY2l0IGNhc3RzIG9uIGFjdHVhbCBwYXJhbWV0ZXJzIHdoZW5ldmVyIHRoZSBhY3R1YWwgcGFyYW1ldGVyIHR5cGUgaXMgbm90CitpZGVudGljYWwgdG8gdGhlIGZvcm1hbCBwYXJhbWV0ZXIuICBCZXdhcmUgb2YgaW1wbGljaXQgY29udmVyc2lvbnMgdG8gImludCIuCisKK0l0IHNlZW1zIHRoZXJlIGFyZSBzb21lIG5vbi1BTlNJIGNvbXBpbGVycyBpbiB3aGljaCB0aGUgc2l6ZW9mKCkgb3BlcmF0b3IKK2lzIGRlZmluZWQgdG8gcmV0dXJuIGludCwgeWV0IHNpemVfdCBpcyBkZWZpbmVkIGFzIGxvbmcuICBOZWVkbGVzcyB0byBzYXksCit0aGlzIGlzIGJyYWluLWRhbWFnZWQuICBBbHdheXMgdXNlIHRoZSBTSVpFT0YoKSBtYWNybyBpbiBwbGFjZSBvZiBzaXplb2YoKSwKK3NvIHRoYXQgdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9mIHR5cGUgc2l6ZV90LgorCisKK1RoZSBKUEVHIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoaW4gbGFyZ2VyIHByb2dyYW1zLiAgRnVydGhlcm1vcmUsCit3ZSB3YW50IGl0IHRvIGJlIHJlZW50cmFudCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHByb2Nlc3MKK211bHRpcGxlIGltYWdlcyBjb25jdXJyZW50bHkuICBUaGUgZm9sbG93aW5nIHJ1bGVzIHN1cHBvcnQgdGhlc2UgcmVxdWlyZW1lbnRzOgorCisxLiBBdm9pZCBkaXJlY3QgdXNlIG9mIGZpbGUgSS9PLCAibWFsbG9jIiwgZXJyb3IgcmVwb3J0IHByaW50b3V0cywgZXRjOworcGFzcyB0aGVzZSB0aHJvdWdoIHRoZSBjb21tb24gcm91dGluZXMgcHJvdmlkZWQuCisKKzIuIE1pbmltaXplIGdsb2JhbCBuYW1lc3BhY2UgcG9sbHV0aW9uLiAgRnVuY3Rpb25zIHNob3VsZCBiZSBkZWNsYXJlZCBzdGF0aWMKK3doZXJldmVyIHBvc3NpYmxlLiAgKE5vdGUgdGhhdCBvdXIgbWV0aG9kLWJhc2VkIGNhbGxpbmcgY29udmVudGlvbnMgaGVscCB0aGlzCithIGxvdDogaW4gbWFueSBtb2R1bGVzIG9ubHkgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHdpbGwgZXZlciBuZWVkIHRvIGJlCitjYWxsZWQgZGlyZWN0bHksIHNvIG9ubHkgdGhhdCBmdW5jdGlvbiBuZWVkIGJlIGV4dGVybmFsbHkgdmlzaWJsZS4pICBBbGwKK2dsb2JhbCBmdW5jdGlvbiBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCAianBlZ18iLCBhbmQgc2hvdWxkIGhhdmUgYW4KK2FiYnJldmlhdGVkIG5hbWUgKHVuaXF1ZSBpbiB0aGUgZmlyc3Qgc2l4IGNoYXJhY3RlcnMpIHN1YnN0aXR1dGVkIGJ5IG1hY3JvCit3aGVuIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgaXMgc2V0LgorCiszLiBEb24ndCB1c2UgZ2xvYmFsIHZhcmlhYmxlczsgYW55dGhpbmcgdGhhdCBtdXN0IGJlIHVzZWQgaW4gYW5vdGhlciBtb2R1bGUKK3Nob3VsZCBiZSBpbiB0aGUgY29tbW9uIGRhdGEgc3RydWN0dXJlcy4KKworNC4gRG9uJ3QgdXNlIHN0YXRpYyB2YXJpYWJsZXMgZXhjZXB0IGZvciByZWFkLW9ubHkgY29uc3RhbnQgdGFibGVzLiAgVmFyaWFibGVzCit0aGF0IHNob3VsZCBiZSBwcml2YXRlIHRvIGEgbW9kdWxlIGNhbiBiZSBwbGFjZWQgaW50byBwcml2YXRlIHN0cnVjdHVyZXMgKHNlZQordGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgZG9jdW1lbnQsIHN0cnVjdHVyZS5kb2MpLgorCis1LiBTb3VyY2UgZmlsZSBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCAiaiIgZm9yIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlCitsaWJyYXJ5IHByb3Blcjsgc291cmNlIGZpbGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LCBzdWNoIGFzIGNqcGVnLmMKK2FuZCBkanBlZy5jLCBkbyBub3QgYmVnaW4gd2l0aCAiaiIuICBLZWVwIHNvdXJjZSBmaWxlIG5hbWVzIHRvIGVpZ2h0CitjaGFyYWN0ZXJzIChwbHVzICIuYyIgb3IgIi5oIiwgZXRjKSB0byBtYWtlIGxpZmUgZWFzeSBmb3IgTVMtRE9TZXJzLiAgS2VlcAorY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZSBpbiBzZXBhcmF0ZSBzb3VyY2UgZmlsZXMgLS0tIHNvbWUKK2FwcGxpY2F0aW9ucyBtYXkgd2FudCBvbmx5IG9uZSBoYWxmIG9mIHRoZSBsaWJyYXJ5LgorCitOb3RlOiB0aGVzZSBydWxlcyAocGFydGljdWxhcmx5ICM0KSBhcmUgbm90IGZvbGxvd2VkIHJlbGlnaW91c2x5IGluIHRoZQorbW9kdWxlcyB0aGF0IGFyZSB1c2VkIGluIGNqcGVnL2RqcGVnIGJ1dCBhcmUgbm90IHBhcnQgb2YgdGhlIEpQRUcgbGlicmFyeQorcHJvcGVyLiAgVGhvc2UgbW9kdWxlcyBhcmUgbm90IHJlYWxseSBpbnRlbmRlZCB0byBiZSB1c2VkIGluIG90aGVyCithcHBsaWNhdGlvbnMuCmRpZmYgLS1naXQgYS9qcGVnL2NvbmZpZy5ndWVzcyBiL2pwZWcvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxM2VkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDg4MyBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBXcml0dGVuIGJ5IFBlciBCb3RobmVyIDxib3RobmVyQGN5Z251cy5jb20+LgorIyBUaGUgbWFzdGVyIHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGF0IHRoZSBGU0YgaW4gL2hvbWUvZ2QvZ251L2xpYi4KKyMKKyMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bworIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKKyMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjCisjIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQorIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IHN5c3RlbSB0eXBlIChob3N0L3RhcmdldCBuYW1lKS4KKyMKKyMgT25seSBhIGZldyBzeXN0ZW1zIGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIGxpc3Q7IHBsZWFzZSBhZGQgb3RoZXJzCisjIChidXQgdHJ5IHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBjbGVhbikuCisjCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCisjIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgOC8yNC85NC4pCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgorCit0cmFwICdybSAtZiBkdW1teS5jIGR1bW15Lm8gZHVtbXk7IGV4aXQgMScgMSAyIDE1CisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgIGFscGhhOk9TRjE6KjoqKQorCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwlmaQorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJY2F0IDw8RU9GID5kdW1teS5zCisJLmdsb2JsIG1haW4KKwkuZW50IG1haW4KK21haW46CisJLmZyYW1lIFwkMzAsMCxcJDI2LDAKKwkucHJvbG9ndWUgMAorCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCisJbGRhIFwkMiwyNTkKKwkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgJDIsJDEKKwlzcmwgXCQxLDgsXCQyCisJc2xsIFwkMiwyLFwkMgorCXNsbCBcJDAsMyxcJDAKKwlhZGRsIFwkMSxcJDAsXCQwCisJYWRkbCBcJDIsXCQwLFwkMAorCXJldCBcJDMxLChcJDI2KSwxCisJLmVuZCBtYWluCitFT0YKKwkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCisJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KKwkJLi9kdW1teQorCQljYXNlICIkPyIgaW4KKwkJCTcpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCisJCQkJOzsKKwkJCTE1KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgorCQkJCTs7CisJCQkxNCkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCisJCQkJOzsKKwkJCTEwKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCisJCQkJOzsKKwkJCTE2KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgorCQkJCTs7CisJCWVzYWMKKwlmaQorCXJtIC1mIGR1bW15LnMgZHVtbXkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltWVFhdLy8nIHwgdHIgW1tBLVpdXSBbW2Etel1dYAorCWV4aXQgMCA7OworICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKKwllY2hvIGFscGhhLWRlYy13aW5udDMuNQorCWV4aXQgMCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay1jYm0tc3lzdjQKKwlleGl0IDA7OworICAgIGFtaWdhOk5ldEJTRDoqOiopCisgICAgICBlY2hvIG02OGstY2JtLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgIGV4aXQgMCA7OworICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXJjNjQ6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzNjRlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXJjOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBoa21pcHM6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBwbWF4Ok9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzZ2k6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICB3Z3Jpc2M6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwOzsKKyAgICBhcm0zMjpOZXRCU0Q6KjoqKQorCWVjaG8gYXJtLXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJZXhpdCAwIDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgMDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOip8TUlTKjpPU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCAwIDs7CisgICAgTklMRToqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KikKKwllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKGhlYWQgLTEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCAwIDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGF0YXJpKjpOZXRCU0Q6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXRhcmkqOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuMyo6TmV0QlNEOio6KikKKwllY2hvIG02OGstc3VuLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4zKjpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hYzY4azpOZXRCU0Q6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCisJZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDAgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAyMDIwOkNMSVg6KjoqKQorCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJc2VkICdzL14JLy8nIDw8IEVPRiA+ZHVtbXkuYworCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7IHsKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSBcCisJICAmJiAuL2R1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKKwkgICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCisJcm0gLWYgZHVtbXkuYyBkdW1teQorCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCAwIDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDAgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgMCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorICAgICAgICBpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIC1vICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0gOyB0aGVuCisJaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXAorCSAgICAgLW8gJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdIDsgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGVsc2UgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGZpCisgCWV4aXQgMCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDAgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgMCA7OworICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQorCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCAwIDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgMCA7OworICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDAgOzsgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGk/ODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgMCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPmR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwkJcm0gLWYgZHVtbXkuYyBkdW1teQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgMCA7OworICAgICo6QUlYOio6NCkKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FSGwgcHJvYzAgfCBncmVwIFBPV0VSID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj00LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDAgOzsKKyAgICAqOkFJWDoqOiopCisJZWNobyByczYwMDAtaWJtLWFpeAorCWV4aXQgMCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIE5ldEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgMCA7OworICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCisJZWNobyBtNjhrLWJ1bGwtc3lzdjMKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgMCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgMCA7OworICAgIDkwMDAvWzM0NzhdPz86SFAtVVg6KjoqKQorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvNz8/IHwgOTAwMC84P1sxNjc5XSApIEhQX0FSQ0g9aHBwYTEuMSA7OworCSAgICA5MDAwLzg/PyApICAgICAgICAgICAgSFBfQVJDSD1ocHBhMS4wIDs7CisJZXNhYworCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDAgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJc2VkICdzL14JLy8nIDw8IEVPRiA+ZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCisJcm0gLWYgZHVtbXkuYyBkdW1teQorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDAgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgMCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgMCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaT84NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCAwIDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgMCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDUkFZKlgtTVA6KjoqOiopCisJZWNobyB4bXAtY3JheS11bmljb3MKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LworCWV4aXQgMCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgQ1JBWS0yOio6KjoqKQorCWVjaG8gY3JheTItY3JheS11bmljb3MKKyAgICAgICAgZXhpdCAwIDs7CisgICAgRjMwMDpVTklYX1N5c3RlbV9WOio6KikKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgW0EtWl0gW2Etel0gfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gImYzMDAtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDAgOzsKKyAgICBGMzAxOlVOSVhfU3lzdGVtX1Y6KjoqKQorICAgICAgIGVjaG8gZjMwMS1mdWppdHN1LXV4cHZgZWNobyAkVU5BTUVfUkVMRUFTRSB8IHNlZCAncy8gLiovLydgCisgICAgICAgZXhpdCAwIDs7CisgICAgaHAzWzAtOV1bMDVdOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWhwLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBocDMwMDpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGk/ODY6QlNELzM4NjoqOiogfCAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpGcmVlQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgMCA7OworICAgICo6TmV0QlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwlleGl0IDAgOzsKKyAgICAqOk9wZW5CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9wZW5ic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwlleGl0IDAgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyBpMzg2LXBjLWN5Z3dpbjMyCisJZXhpdCAwIDs7CisgICAgaSo6TUlOR1cqOiopCisJZWNobyBpMzg2LXBjLW1pbmd3MzIKKwlleGl0IDAgOzsKKyAgICBwKjpDWUdXSU4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4zMgorCWV4aXQgMCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICAqOkdOVToqOiopCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCAwIDs7CisgICAgKjpMaW51eDoqOiopCisJIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KKwkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuCisJbGRfaGVscF9zdHJpbmc9YGxkIC0taGVscCAyPiYxYAorCWxkX3N1cHBvcnRlZF9lbXVsYXRpb25zPWBlY2hvICRsZF9oZWxwX3N0cmluZyBcCisJCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIGVtdWxhdGlvbnM6LyFkCisJCQkJICAgIHMvWyAJXVsgCV0qLyAvZworCQkJCSAgICBzLy4qc3VwcG9ydGVkIGVtdWxhdGlvbnM6ICovLworCQkJCSAgICBzLyAuKi8vCisJCQkJICAgIHAnYAorICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnMiIGluCisJICBpPzg2bGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiICAgICAgOyBleGl0IDAgOzsKKwkgIGk/ODZjb2ZmKSAgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIgICAgICA7IGV4aXQgMCA7OworCSAgc3BhcmNsaW51eCkgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7CisJICBtNjhrbGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKKwkgIGVsZjMycHBjKSAgIGVjaG8gInBvd2VycGMtdW5rbm93bi1saW51eC1nbnUiICAgICAgICAgICAgICA7IGV4aXQgMCA7OworCWVzYWMKKworCWlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gImFscGhhIiA7IHRoZW4KKwkJc2VkICdzL14JLy8nICA8PEVPRiA+ZHVtbXkucworCQkuZ2xvYmwgbWFpbgorCQkuZW50IG1haW4KKwltYWluOgorCQkuZnJhbWUgXCQzMCwwLFwkMjYsMAorCQkucHJvbG9ndWUgMAorCQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAorCQlsZGEgXCQyLDI1OQorCQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgJDIsJDEKKwkJc3JsIFwkMSw4LFwkMgorCQlzbGwgXCQyLDIsXCQyCisJCXNsbCBcJDAsMyxcJDAKKwkJYWRkbCBcJDEsXCQwLFwkMAorCQlhZGRsIFwkMixcJDAsXCQwCisJCXJldCBcJDMxLChcJDI2KSwxCisJCS5lbmQgbWFpbgorRU9GCisJCUxJQkM9IiIKKwkJJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAorCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgorCQkJLi9kdW1teQorCQkJY2FzZSAiJD8iIGluCisJCQk3KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgorCQkJCTs7CisJCQkxNSkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKKwkJCQk7OworCQkJMTQpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgorCQkJCTs7CisJCQkxMCkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgorCQkJCTs7CisJCQkxNikKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKKwkJCQk7OworCQkJZXNhYwkKKworCQkJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyBkdW1teSB8IFwKKwkJCSAgZ3JlcCBsZC5zby4xID4gL2Rldi9udWxsCisJCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgorCQkJCUxJQkM9ImxpYmMxIgorCQkJZmkKKwkJZmkJCisJCXJtIC1mIGR1bW15LnMgZHVtbXkKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfSA7IGV4aXQgMAorCWVsaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAibWlwcyIgOyB0aGVuCisJICBjYXQgPmR1bW15LmMgPDxFT0YKK21haW4oYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyNpZmRlZiBfX01JUFNFQl9fCisgIHByaW50ZiAoIiVzLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKKyNlbmRpZgorI2lmZGVmIF9fTUlQU0VMX18KKyAgcHJpbnRmICgiJXNlbC11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CitFT0YKKwkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwkgIHJtIC1mIGR1bW15LmMgZHVtbXkKKwllbHNlCisJICAjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkKKwkgICMgb3Igb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgorCSAgIyBHQ0Mgd2FudHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBsaW51eC1nbnVvbGRsZCBhbmQgbGludXgtZ251YW91dC4KKwkgICMgSWYgbGQgZG9lcyBub3QgcHJvdmlkZSAqYW55KiAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgorCSAgIyB0aGF0IG1lYW5zIGl0IGlzIGdudW9sZGxkLgorCSAgZWNobyAiJGxkX2hlbHBfc3RyaW5nIiB8IGdyZXAgPi9kZXYvbnVsbCAyPiYxICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCisJICB0ZXN0ICQ/ICE9IDAgJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIgJiYgZXhpdCAwCisKKwkgIGNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICBpPzg2KQorCSAgICBWRU5ET1I9cGM7CisJICAgIDs7CisJICAqKQorCSAgICBWRU5ET1I9dW5rbm93bjsKKwkgICAgOzsKKwkgIGVzYWMKKwkgICMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCisJICBjYXQgPmR1bW15LmMgPDxFT0YKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorbWFpbihhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqYXJndltdOworeworI2lmZGVmIF9fRUxGX18KKyMgaWZkZWYgX19HTElCQ19fCisjICBpZiBfX0dMSUJDX18gPj0gMgorICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOworIyAgZWxzZQorICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7CisjICBlbmRpZgorIyBlbHNlCisgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOworIyBlbmRpZgorI2Vsc2UKKyAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWFvdXRcbiIsIGFyZ3ZbMV0pOworI2VuZGlmCisgIHJldHVybiAwOworfQorRU9GCisJICAke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgIiR7VU5BTUVfTUFDSElORX0iICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCisJICBybSAtZiBkdW1teS5jIGR1bW15CisJZmkgOzsKKyMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuICBlYXJsaWVyIHZlcnNpb25zCisjIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aCBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKyAgICBpPzg2OkRZTklYL3B0eDo0KjoqKQorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCAwIDs7CisgICAgaT84NjpVTklYX1NWOjQuMk1QOjIuKikKKyAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCisgICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKKwkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCisgICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCAwIDs7CisgICAgaT84NjoqOjQuKjoqIHwgaT84NjpTWVNURU1fVjo0Lio6KikKKwlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKwlleGl0IDAgOzsKKyAgICBpPzg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8ZWdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGVncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKKwkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgMCA7OworICAgIHBjOio6KjoqKQorICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAorICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpMzg2LgorCWVjaG8gaTM4Ni1wYy1tc2Rvc2RqZ3BwCisgICAgICAgIGV4aXQgMCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDAgOzsKKyAgICBwYXJhZ29uOio6KjoqKQorCWVjaG8gaTg2MC1pbnRlbC1vc2YxCisJZXhpdCAwIDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgMCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCAwIDs7CisgICAgTTY4KjoqOlIzVls1NjddKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OworICAgIDNbMzRdPz86Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisgICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBpPzg2Okx5bnhPUzoyLio6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCisJZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgMCA7OworICAgIFBFTlRJVU06Q1B1bml4OjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KKyAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAorICAgICAgICBleGl0IDAgOzsKKyAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKKwkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCisJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCisJZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOio6KjpGVFgqKQorCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgorCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBuZXdzKjpORVdTLU9TOio6NiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgMCA7OworICAgIFIzMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgMCA7OworZXNhYworCisjZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKKyNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKKworY2F0ID5kdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQorI2lmIGRlZmluZWQgKFVNQVhWKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpZiBkZWZpbmVkIChDTVUpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQorICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChzZXF1ZW50KQorI2lmIGRlZmluZWQgKGkzODYpCisgIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjaWYgZGVmaW5lZCAobnMzMjAwMCkKKyAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKKyAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKKworICAgIHVuYW1lKCZ1bik7CisKKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7CisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAodmF4KQorI2lmICFkZWZpbmVkICh1bHRyaXgpCisgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCisgIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisgIGV4aXQgKDEpOworfQorRU9GCisKKyR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorcm0gLWYgZHVtbXkuYyBkdW1teQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBlc2FjCitmaQorCisjZWNobyAnKFVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZSknIDE+JjIKKworZXhpdCAxCmRpZmYgLS1naXQgYS9qcGVnL2NvbmZpZy5zdWIgYi9qcGVnL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjEzYTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvY29uZmlnLnN1YgpAQCAtMCwwICsxLDk1NCBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQsIHZlcnNpb24gMS4xLgorIyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCisjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKKyMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCisjIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KKyMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCisjIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK2lmIFsgeCQxID0geCBdCit0aGVuCisJZWNobyBDb25maWd1cmF0aW9uIG5hbWUgbWlzc2luZy4gMT4mMgorCWVjaG8gIlVzYWdlOiAkMCBDUFUtTUZSLU9QU1lTIiAxPiYyCisJZWNobyAib3IgICAgICQwIEFMSUFTIiAxPiYyCisJZWNobyB3aGVyZSBBTElBUyBpcyBhIHJlY29nbml6ZWQgY29uZmlndXJhdGlvbiB0eXBlLiAxPiYyCisJZXhpdCAxCitmaQorCisjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KK2Nhc2UgJDEgaW4KKwkqbG9jYWwqKQorCQllY2hvICQxCisJCWV4aXQgMAorCQk7OworCSopCisJOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbGludXgtZ251KikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktaGl1eCopCisJCW9zPS1oaXV4d2UyCisJCTs7CisJLXNjbzUpCisJCW9zPXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktaXNjKQorCQlvcz0taXNjMi4yCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktY2xpeCopCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCisJCTs7CisJLWlzYyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktbHlueCopCisJCW9zPS1seW54b3MKKwkJOzsKKwktcHR4KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCisJCTs7CisJLXdpbmRvd3NudCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKKwkJOzsKKwktcHNvcyopCisJCW9zPS1wc29zCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCisJIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KKwl0YWhvZSB8IGk4NjAgfCBtMzJyIHwgbTY4ayB8IG02ODAwMCB8IG04OGsgfCBuczMyayB8IGFyYyB8IGFybSBcCisJCXwgYXJtZVtsYl0gfCBweXJhbWlkIHwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCQl8IHRyb24gfCBhMjlrIHwgNTgwIHwgaTk2MCB8IGg4MzAwIHwgaHBwYSB8IGhwcGExLjAgfCBocHBhMS4xIFwKKwkJfCBhbHBoYSB8IGFscGhhZXY1IHwgYWxwaGFldjU2IHwgd2UzMmsgfCBuczE2ayB8IGNsaXBwZXIgXAorCQl8IGkzNzAgfCBzaCB8IHBvd2VycGMgfCBwb3dlcnBjbGUgfCAxNzUwYSB8IGRzcDE2eHggfCBwZHAxMSBcCisJCXwgbWlwczY0IHwgbWlwc2VsIHwgbWlwczY0ZWwgfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCQl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJCXwgc3BhcmMgfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjNjQgfCB2ODUwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpWzM0NTZdODYpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCXZheC0qIHwgdGFob2UtKiB8IGlbMzQ1Nl04Ni0qIHwgaTg2MC0qIHwgbTMyci0qIHwgbTY4ay0qIHwgbTY4MDAwLSogXAorCSAgICAgIHwgbTg4ay0qIHwgc3BhcmMtKiB8IG5zMzJrLSogfCBmeDgwLSogfCBhcmMtKiB8IGFybS0qIHwgY1sxMjNdKiBcCisJICAgICAgfCBtaXBzLSogfCBweXJhbWlkLSogfCB0cm9uLSogfCBhMjlrLSogfCByb21wLSogfCByczYwMDAtKiBcCisJICAgICAgfCBwb3dlci0qIHwgbm9uZS0qIHwgNTgwLSogfCBjcmF5Mi0qIHwgaDgzMDAtKiB8IGk5NjAtKiBcCisJICAgICAgfCB4bXAtKiB8IHltcC0qIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIFwKKwkgICAgICB8IGFscGhhLSogfCBhbHBoYWV2NS0qIHwgYWxwaGFldjU2LSogfCB3ZTMyay0qIHwgY3lkcmEtKiBcCisJICAgICAgfCBuczE2ay0qIHwgcG4tKiB8IG5wMS0qIHwgeHBzMTAwLSogfCBjbGlwcGVyLSogfCBvcmlvbi0qIFwKKwkgICAgICB8IHNwYXJjbGl0ZS0qIHwgcGRwMTEtKiB8IHNoLSogfCBwb3dlcnBjLSogfCBwb3dlcnBjbGUtKiBcCisJICAgICAgfCBzcGFyYzY0LSogfCBtaXBzNjQtKiB8IG1pcHNlbC0qIFwKKwkgICAgICB8IG1pcHM2NGVsLSogfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qICBcCisJICAgICAgfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwkgICAgICB8IGYzMDEtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWFsbGlhbnQgfCBmeDgwKQorCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAorCQk7OworCWFsdG9zIHwgYWx0b3MzMDY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKKwkJOzsKKwlhbTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKKwkJb3M9LWJzZAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstY2JtCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY2JtCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IHltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheTIpCisJCWJhc2ljX21hY2hpbmU9Y3JheTItY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJW2N0al05MC1jcmF5KQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrN1swLTldWzAtOV0gfCBocDdbMC05XVswLTldIHwgaHA5azhbMC05XTcgfCBocDhbMC05XTcpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaVszNDU2XTg2djMyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YzMgorCQk7OworCWlbMzQ1Nl04NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWlbMzQ1Nl04NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWlbMzQ1Nl04NnNvbDIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTg4ay1vbXJvbiopCisJCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgorCQk7OworCW1hZ251bSB8IG0zMjMwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlvcz0tc3lzdgorCQk7OworCW1lcmxpbikKKwkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCisJCW9zPS1zeXN2CisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJbWlwc2VsKi1saW51eCopCisJCWJhc2ljX21hY2hpbmU9bWlwc2VsLXVua25vd24KKwkJb3M9LWxpbnV4LWdudQorCQk7OworCW1pcHMqLWxpbnV4KikKKwkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KKwkJb3M9LWxpbnV4LWdudQorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXh0IHwgbSotbmV4dCApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0CisJCWNhc2UgJG9zIGluCisJCSAgICAtbmV4dHN0ZXAqICkKKwkJCTs7CisJCSAgICAtbnMyKikKKwkJICAgICAgb3M9LW5leHRzdGVwMgorCQkJOzsKKwkJICAgICopCisJCSAgICAgIG9zPS1uZXh0c3RlcDMKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwluaDMwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaFs0NV0wMDApCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaW5keTk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1uaW5keQorCQk7OworCW5wMSkKKwkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworICAgICAgICBwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwZW50aXVtIHwgcDUpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1pbnRlbAorCQk7OworCXBlbnRpdW1wcm8gfCBwNikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWludGVsCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bXByby0qIHwgcDYtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJazUpCisJCSMgV2UgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBBTUQncyBLNSB5ZXQsIHNvIGp1c3QgY2FsbCBpdCBhIFBlbnRpdW0KKwkJYmFzaWNfbWFjaGluZT1pNTg2LWFtZAorCQk7OworCW5leGVuKQorCQkjIFdlIGRvbid0IGhhdmUgc3BlY2lmaWMgc3VwcG9ydCBmb3IgTmV4Z2VuIHlldCwgc28ganVzdCBjYWxsIGl0IGEgUGVudGl1bQorCQliYXNpY19tYWNoaW5lPWk1ODYtbmV4Z2VuCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCSAgICAgICAgOzsKKwlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkgICAgICAgIDs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN1bjIpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQk7OworCXN1bjJvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuMm9zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW4zb3MzKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4zb3M0KQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40b3MzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuNG9zNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRzb2wyKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlzdW4zIHwgc3VuMy0qKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCTs7CisJc3VuNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgorCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG93ZXIgfCB0b3dlci0zMikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgorCQk7OworCXVkaTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJdWx0cmEzKQorCQliYXNpY19tYWNoaW5lPWEyOWstbnl1CisJCW9zPS1zeW0xCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKyAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisgICAgICAgICAgICAgICA7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJeG1wKQorCQliYXNpY19tYWNoaW5lPXhtcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKyAgICAgICAgeHBzIHwgeHBzMTAwKQorCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJbWlwcykKKwkJaWYgWyB4JG9zID0geC1saW51eC1nbnUgXTsgdGhlbgorCQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KKwkJZWxzZQorCQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJZmkKKwkJOzsKKwlyb21wKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJcnM2MDAwKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwl2YXgpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQk7OworCXBkcDExKQorCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYworCQk7OworCXdlMzJrKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCXNwYXJjKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworICAgICAgICBjeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCisJICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWN5Z3dpbjMyKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtdXhwdiopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1uczIgKQorCSAgICAgICAgb3M9LW5leHRzdGVwMgorCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIHBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKKwkJIyBkZWZhdWx0LgorCQkjIG9zPS1zdW5vczQKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKyAgICAgICAgKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKyAgICAgICAgKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworICAgICAgICAqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKyAgICAgICAgKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwMS1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCmRpZmYgLS1naXQgYS9qcGVnL2NvbmZpZ3VyZSBiL2pwZWcvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1YzlkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDIwMTEgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICBidWlsZCBzaGFyZWQgbGlicmFyeSB1c2luZyBHTlUgbGlidG9vbCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXN0YXRpYyAgICAgICAgIGJ1aWxkIHN0YXRpYyBsaWJyYXJ5IHVzaW5nIEdOVSBsaWJ0b29sIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWF4bWVtWz1OXSAgICAgZW5hYmxlIHVzZSBvZiB0ZW1wIGZpbGVzLCBzZXQgbWF4IG1lbSB1c2FnZSB0byBOIE1CIgorYWNfaGVscD0iJGFjX2hlbHAKKyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICo9KikKKyAgICB2YXJuYW1lPWBlY2hvICIkYWNfb3B0aW9uInxzZWQgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlbid0IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICR2YXJuYW1lfCBzZWQgJ3MvW2EtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICR2YXJuYW1lOiBpbnZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgdmFsPSJgZWNobyAiJGFjX29wdGlvbiJ8c2VkICdzL1tePV0qPS8vJ2AiCisgICAgdGVzdCAtbiAiJHZlcmJvc2UiICYmIGVjaG8gIglzZXR0aW5nIHNoZWxsIHZhcmlhYmxlICR2YXJuYW1lIHRvICR2YWwiCisgICAgZXZhbCAiJHZhcm5hbWU9JyR2YWwnIgorICAgIGV2YWwgImV4cG9ydCAkdmFybmFtZSIgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9amNtYXN0ZXIuYworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1Mzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDYyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2Mjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NDk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NTQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjY2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1PMiIKK2Vsc2UKKyAgR0NDPQorICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1PIgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY4MTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2OTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcwMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NDI6IGNoZWNraW5nIGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydpamdfY3ZfaGF2ZV9wcm90b3R5cGVzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzQ3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpOyAvKiBjaGVjayBwcm90b3R5cGVzICovCitzdHJ1Y3QgbWV0aG9kc19zdHJ1Y3QgewkJLyogY2hlY2sgbWV0aG9kLXBvaW50ZXIgZGVjbGFyYXRpb25zICovCisgIGludCAoKmVycm9yX2V4aXQpIChjaGFyICptc2d0ZXh0KTsKKyAgaW50ICgqdHJhY2VfbWVzc2FnZSkgKGNoYXIgKm1zZ3RleHQpOworICBpbnQgKCphbm90aGVyX21ldGhvZCkgKHZvaWQpOworfTsKK2ludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKSAvKiBjaGVjayBkZWZpbml0aW9ucyAqLworeyByZXR1cm4gYXJnMlthcmcxXTsgfQoraW50IHRlc3QyZnVuY3Rpb24gKHZvaWQpCS8qIGNoZWNrIHZvaWQgYXJnIGxpc3QgKi8KK3sgcmV0dXJuIDA7IH0KKworaW50IG1haW4oKSB7CisgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX2N2X2hhdmVfcHJvdG90eXBlcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX2N2X2hhdmVfcHJvdG90eXBlcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzIiAxPiY2CitpZiB0ZXN0ICRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1BST1RPVFlQRVMgCitFT0YKKworZWxzZQorICBlY2hvIFlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc2VlbSB0byBrbm93IGFib3V0IGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgIGVjaG8gUGVyaGFwcyBpdCBuZWVkcyBhIHNwZWNpYWwgc3dpdGNoIHRvIGVuYWJsZSBBTlNJIEMgbW9kZS4KKyAgZWNobyBJZiBzbywgd2UgcmVjb21tZW5kIHJ1bm5pbmcgY29uZmlndXJlIGxpa2UgdGhpczoKKyAgZWNobyAiICAgLi9jb25maWd1cmUgIENDPSdjYyAtc3dpdGNoJyIKKyAgZWNobyB3aGVyZSAtc3dpdGNoIGlzIHRoZSBwcm9wZXIgc3dpdGNoLgorZmkKK2FjX3NhZmU9YGVjaG8gInN0ZGRlZi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdGRkZWYuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzkyOiBjaGVja2luZyBmb3Igc3RkZGVmLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDc5NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkZGVmLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjgwMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1REREVGX0ggCitFT0YKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2FjX3NhZmU9YGVjaG8gInN0ZGxpYi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdGRsaWIuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODI4OiBjaGVja2luZyBmb3Igc3RkbGliLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjgzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RETElCX0ggCitFT0YKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2FjX3NhZmU9YGVjaG8gInN0cmluZy5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJpbmcuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODY0OiBjaGVja2luZyBmb3Igc3RyaW5nLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjg3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgOgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0JTRF9TVFJJTkdTIAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkwMDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MDIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9TVERERUZfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgordHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OworCitpbnQgbWFpbigpIHsKKyBteV9zaXplX3QgZm9vdmFyOyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfc2l6ZV90X29rPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfc2l6ZV90X29rPSJub3QgQU5TSSwgcGVyaGFwcyBpdCBpcyBpbiBzeXMvdHlwZXMuaCIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gIiRhY190IiIkaWpnX3NpemVfdF9vayIgMT4mNgoraWYgdGVzdCAiJGlqZ19zaXplX3Rfb2siICE9IHllczsgdGhlbgorYWNfc2FmZT1gZWNobyAic3lzL3R5cGVzLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5Mzc6IGNoZWNraW5nIGZvciBzeXMvdHlwZXMuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTQyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6OTQ3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9TWVNfVFlQRVNfSCAKK0VPRgorCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5NjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJzaXplX3QiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19zaXplX3Rfb2s9InNpemVfdCBpcyBpbiBzeXMvdHlwZXMuaCIKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfc2l6ZV90X29rPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Citpamdfc2l6ZV90X29rPW5vCitmaQorCitlY2hvICIkYWNfdCIiJGlqZ19zaXplX3Rfb2siIDE+JjYKK2lmIHRlc3QgIiRpamdfc2l6ZV90X29rIiA9IG5vOyB0aGVuCisgIGVjaG8gVHlwZSBzaXplX3QgaXMgbm90IGRlZmluZWQgaW4gYW55IG9mIHRoZSB1c3VhbCBwbGFjZXMuCisgIGVjaG8gVHJ5IHB1dHRpbmcgJyJ0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7IicgaW4gamNvbmZpZy5oLgorZmkKK2ZpCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBjaGFyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5OTQ6IGNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIGNoYXIiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTk2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisgdW5zaWduZWQgY2hhciB1bl9jaGFyOyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUiAKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgc2hvcnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMTg6IGNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIHNob3J0IiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKyB1bnNpZ25lZCBzaG9ydCB1bl9zaG9ydDsgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAyNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUIAorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB2b2lkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDQyOiBjaGVja2luZyBmb3IgdHlwZSB2b2lkIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwNDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBDYXV0aW9uOiBhIEMrKyBjb21waWxlciB3aWxsIGluc2lzdCBvbiB2YWxpZCBwcm90b3R5cGVzICovCit0eXBlZGVmIHZvaWQgKiB2b2lkX3B0cjsJLyogY2hlY2sgdm9pZCAqICovCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayBwdHIgdG8gZnVuY3Rpb24gcmV0dXJuaW5nIHZvaWQgKi8KK3R5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKGludCBhLCBpbnQgYik7CisjZWxzZQordHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCQkvKiBjaGVjayB2b2lkIGZ1bmN0aW9uIHJlc3VsdCAqLwordm9pZCB0ZXN0M2Z1bmN0aW9uICh2b2lkX3B0ciBhcmcxLCB2b2lkX2Z1bmMgYXJnMikKKyNlbHNlCit2b2lkIHRlc3QzZnVuY3Rpb24gKGFyZzEsIGFyZzIpCisgICAgIHZvaWRfcHRyIGFyZzE7CisgICAgIHZvaWRfZnVuYyBhcmcyOworI2VuZGlmCit7CisgIGNoYXIgKiBsb2NwdHIgPSAoY2hhciAqKSBhcmcxOyAvKiBjaGVjayBjYXN0aW5nIHRvIGFuZCBmcm9tIHZvaWQgKiAqLworICBhcmcxID0gKHZvaWQgKikgbG9jcHRyOworICAoKmFyZzIpICgxLCAyKTsJCS8qIGNoZWNrIGNhbGwgb2YgZmNuIHJldHVybmluZyB2b2lkICovCit9CisKK2ludCBtYWluKCkgeworIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwNzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHZvaWQgY2hhcgorRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwODg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA5MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNjM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWpnX2N2X2lubGluZT0iIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE2NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSBfX2lubGluZV9fIGludCBmb28oKSB7IHJldHVybiAwOyB9CitpbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19jdl9pbmxpbmU9Il9faW5saW5lX18iCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExODIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gX19pbmxpbmUgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK2ludCBiYXIoKSB7IHJldHVybiBmb28oKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTkwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX2N2X2lubGluZT0iX19pbmxpbmUiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExOTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gaW5saW5lIGludCBmb28oKSB7IHJldHVybiAwOyB9CitpbnQgYmFyKCkgeyByZXR1cm4gZm9vKCk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIwNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19jdl9pbmxpbmU9ImlubGluZSIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICIkYWNfdCIiJGlqZ19jdl9pbmxpbmUiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIElOTElORSAkaWpnX2N2X2lubGluZQorRU9GCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBicm9rZW4gaW5jb21wbGV0ZSB0eXBlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyNDogY2hlY2tpbmcgZm9yIGJyb2tlbiBpbmNvbXBsZXRlIHR5cGVzIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorIHR5cGVkZWYgc3RydWN0IHVuZGVmaW5lZF9zdHJ1Y3R1cmUgKiB1bmRlZl9zdHJ1Y3RfcHRyOyAKK2ludCBtYWluKCkgeworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIzMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJvayIgMT4mNgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIiYnJva2VuIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU4gCitFT0YKKworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNob3J0IGV4dGVybmFsIG5hbWVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjQ4OiBjaGVja2luZyBmb3Igc2hvcnQgZXh0ZXJuYWwgbmFtZXMiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfQoraW50IHBvc3NpYmx5X2R1cGxpX2Z1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0KKworaW50IG1haW4oKSB7CisgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm9rIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJzaG9ydCIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgCitFT0YKKworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIGNoYXIgaXMgc2lnbmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjc1OiBjaGVja2luZyB0byBzZWUgaWYgY2hhciBpcyBzaWduZWQiID4mNQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZWNobyBBc3N1bWluZyB0aGF0IGNoYXIgaXMgc2lnbmVkIG9uIHRhcmdldCBtYWNoaW5lLgorZWNobyBJZiBpdCBpcyB1bnNpZ25lZCwgdGhpcyB3aWxsIGJlIGEgbGl0dGxlIGJpdCBpbmVmZmljaWVudC4KKworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjgyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworaW50IGlzX2NoYXJfc2lnbmVkIChpbnQgYXJnKQorI2Vsc2UKK2ludCBpc19jaGFyX3NpZ25lZCAoYXJnKQorICAgICBpbnQgYXJnOworI2VuZGlmCit7CisgIGlmIChhcmcgPT0gMTg5KSB7CQkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHVuc2lnbmVkIGNoYXIgKi8KKyAgICByZXR1cm4gMDsJCQkvKiB0eXBlIGNoYXIgaXMgdW5zaWduZWQgKi8KKyAgfQorICBlbHNlIGlmIChhcmcgIT0gLTY3KSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIGNoYXIgKi8KKyAgICBwcmludGYoIkhtbSwgaXQgc2VlbXMgJ2NoYXInIGlzIG5vdCBlaWdodCBiaXRzIHdpZGUgb24geW91ciBtYWNoaW5lLlxuIik7CisgICAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOworICB9CisgIHJldHVybiAxOwkJCS8qIGFzc3VtZSBjaGFyIGlzIHNpZ25lZCBvdGhlcndpc2UgKi8KK30KK2NoYXIgc2lnbmVkX2NoYXJfY2hlY2sgPSAoY2hhcikgKC02Nyk7CittYWluKCkgeworICBleGl0KGlzX2NoYXJfc2lnbmVkKChpbnQpIHNpZ25lZF9jaGFyX2NoZWNrKSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDSEFSX0lTX1VOU0lHTkVEIAorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRvIHNlZSBpZiByaWdodCBzaGlmdCBpcyBzaWduZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMjM6IGNoZWNraW5nIHRvIHNlZSBpZiByaWdodCBzaGlmdCBpcyBzaWduZWQiID4mNQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFjX3QiIkFzc3VtaW5nIHRoYXQgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIG9uIHRhcmdldCBtYWNoaW5lLiIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzI4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworaW50IGlzX3NoaWZ0aW5nX3NpZ25lZCAobG9uZyBhcmcpCisjZWxzZQoraW50IGlzX3NoaWZ0aW5nX3NpZ25lZCAoYXJnKQorICAgICBsb25nIGFyZzsKKyNlbmRpZgorLyogU2VlIHdoZXRoZXIgcmlnaHQtc2hpZnQgb24gYSBsb25nIGlzIHNpZ25lZCBvciBub3QuICovCit7CisgIGxvbmcgcmVzID0gYXJnID4+IDQ7CisKKyAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgZm9yIHNpZ25lZCBzaGlmdCAqLworICAgIHJldHVybiAxOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCAqLworICB9CisgIC8qIHNlZSBpZiB1bnNpZ25lZC1zaGlmdCBoYWNrIHdpbGwgZml4IGl0LiAqLworICAvKiB3ZSBjYW4ndCBqdXN0IHRlc3QgZXhhY3QgdmFsdWUgc2luY2UgaXQgZGVwZW5kcyBvbiB3aWR0aCBvZiBsb25nLi4uICovCisgIHJlcyB8PSAofjBMKSA8PCAoMzItNCk7CisgIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IG5vdz8gKi8KKyAgICByZXR1cm4gMDsJCQkvKiByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCAqLworICB9CisgIHByaW50ZigiUmlnaHQgc2hpZnQgaXNuJ3QgYWN0aW5nIGFzIEkgZXhwZWN0IGl0IHRvLlxuIik7CisgIHByaW50ZigiSSBmZWFyIHRoZSBKUEVHIHNvZnR3YXJlIHdpbGwgbm90IHdvcmsgYXQgYWxsLlxuXG4iKTsKKyAgcmV0dXJuIDA7CQkJLyogdHJ5IGl0IHdpdGggdW5zaWduZWQgYW55d2F5ICovCit9CittYWluKCkgeworICBleGl0KGlzX3NoaWZ0aW5nX3NpZ25lZCgtMHg3RjdFODBCMUwpKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEIAorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRvIHNlZSBpZiBmb3BlbiBhY2NlcHRzIGIgc3BlYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM3NTogY2hlY2tpbmcgdG8gc2VlIGlmIGZvcGVuIGFjY2VwdHMgYiBzcGVjIiA+JjUKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGVjaG8gIiRhY190IiJBc3N1bWluZyB0aGF0IGl0IGRvZXMuIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzODAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KK21haW4oKSB7CisgIGlmIChmb3BlbigiY29uZnRlc3RkYXRhIiwgIndiIikgIT0gTlVMTCkKKyAgICBleGl0KDApOworICBleGl0KDEpOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzOTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBET05UX1VTRV9CX01PREUgCitFT0YKKworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDM2OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIGluc3RhbGxic2Qgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgICMgT1NGLzEgaW5zdGFsbGJzZCBhbHNvIHVzZXMgZHNwbXNnLCBidXQgaXMgdXNhYmxlLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQ4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworIyBEZWNpZGUgd2hldGhlciB0byB1c2UgbGlidG9vbCwKKyMgYW5kIGlmIHNvIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkLCBzdGF0aWMsIG9yIGJvdGggZmxhdm9ycyBvZiBsaWJyYXJ5LgorTFRTSEFSRUQ9Im5vIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorICBMVFNIQVJFRD0iJGVuYWJsZXZhbCIKK2ZpCisKK0xUU1RBVElDPSJubyIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKKyAgTFRTVEFUSUM9IiRlbmFibGV2YWwiCitmaQorCitpZiB0ZXN0ICJ4JExUU0hBUkVEIiAhPSB4bm8gIC1vICAieCRMVFNUQVRJQyIgIT0geG5vOyB0aGVuCisgIFVTRUxJQlRPT0w9InllcyIKKyAgTElCVE9PTD0iLi9saWJ0b29sIgorICBPPSJsbyIKKyAgQT0ibGEiCisgIExOPSckKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpJworICBJTlNUQUxMX0xJQj0nJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAke0lOU1RBTEx9JworICBJTlNUQUxMX1BST0dSQU09IlwkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICRJTlNUQUxMX1BST0dSQU0iCitlbHNlCisgIFVTRUxJQlRPT0w9Im5vIgorICBMSUJUT09MPSIiCisgIE89Im8iCisgIEE9ImEiCisgIExOPSckKENDKScKKyAgSU5TVEFMTF9MSUI9IiRJTlNUQUxMX0RBVEEiCitmaQorCisKKworCisKKworIyBDb25maWd1cmUgbGlidG9vbCBpZiBuZWVkZWQuCitpZiB0ZXN0ICRVU0VMSUJUT09MID0geWVzOyB0aGVuCisgIGRpc2FibGVfc2hhcmVkPQorICBkaXNhYmxlX3N0YXRpYz0KKyAgaWYgdGVzdCAieCRMVFNIQVJFRCIgPSB4bm87IHRoZW4KKyAgICBkaXNhYmxlX3NoYXJlZD0iLS1kaXNhYmxlLXNoYXJlZCIKKyAgZmkKKyAgaWYgdGVzdCAieCRMVFNUQVRJQyIgPSB4bm87IHRoZW4KKyAgICBkaXNhYmxlX3N0YXRpYz0iLS1kaXNhYmxlLXN0YXRpYyIKKyAgZmkKKyAgJHNyY2Rpci9sdGNvbmZpZyAkZGlzYWJsZV9zaGFyZWQgJGRpc2FibGVfc3RhdGljICRzcmNkaXIvbHRtYWluLnNoCitmaQorCisjIFNlbGVjdCBtZW1vcnkgbWFuYWdlciBkZXBlbmRpbmcgb24gdXNlciBpbnB1dC4KKyMgSWYgbm8gIi1lbmFibGUtbWF4bWVtIiwgdXNlIGptZW1ub2JzCitNRU1PUllNR1I9J2ptZW1ub2JzLiQoTyknCitNQVhNRU09Im5vIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1heG1lbSBvciAtLWRpc2FibGUtbWF4bWVtIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21heG1lbStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWF4bWVtIgorICBNQVhNRU09IiRlbmFibGV2YWwiCitmaQorCisjIHN1cHBvcnQgLS13aXRoLW1heG1lbSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBJSkcgVjUuCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLW1heG1lbSBvciAtLXdpdGhvdXQtbWF4bWVtIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9tYXhtZW0rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfbWF4bWVtIgorICBNQVhNRU09IiR3aXRodmFsIgorZmkKKworaWYgdGVzdCAieCRNQVhNRU0iID0geHllczsgdGhlbgorICBNQVhNRU09MQorZmkKK2lmIHRlc3QgIngkTUFYTUVNIiAhPSB4bm87IHRoZW4KKyAgaWYgdGVzdCAtbiAiYGVjaG8gJE1BWE1FTSB8IHNlZCAncy9bMC05XS8vZydgIjsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gLS1lbmFibGUtbWF4bWVtIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgREVGQVVMVE1BWE1FTT1gZXhwciAkTUFYTUVNIFwqIDEwNDg1NzZgCitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBERUZBVUxUX01BWF9NRU0gJHtERUZBVUxUTUFYTUVNfQorRU9GCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAndG1wZmlsZSgpJyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTU5NjogY2hlY2tpbmcgZm9yICd0bXBmaWxlKCknIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE1OTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbigpIHsKKyBGSUxFICogdGZpbGUgPSB0bXBmaWxlKCk7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK01FTU9SWU1HUj0nam1lbWFuc2kuJChPKScKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitNRU1PUllNR1I9J2ptZW1uYW1lLiQoTyknCitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUiAKK0VPRgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJ21rdGVtcCgpJyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTYyMDogY2hlY2tpbmcgZm9yICdta3RlbXAoKSciID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTYyMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworIGNoYXIgZm5hbWVbODBdOyBta3RlbXAoZm5hbWUpOyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5PX01LVEVNUCAKK0VPRgorCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCisKKyMgRXh0cmFjdCB0aGUgbGlicmFyeSB2ZXJzaW9uIElEIGZyb20ganBlZ2xpYi5oLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgbGlianBlZyB2ZXJzaW9uIG51bWJlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY1MDogY2hlY2tpbmcgbGlianBlZyB2ZXJzaW9uIG51bWJlciIgPiY1CitKUEVHX0xJQl9WRVJTSU9OPWBzZWQgLWUgJy9eI2RlZmluZSBKUEVHX0xJQl9WRVJTSU9OLyFkJyAtZSAncy9eW14wLTldKlwoWzAtOV1bMC05XSpcKS4qJC9cMS8nICRzcmNkaXIvanBlZ2xpYi5oYAorZWNobyAiJGFjX3QiIiRKUEVHX0xJQl9WRVJTSU9OIiAxPiY2CisKKworIyBQcmVwYXJlIHRvIG1hc3NhZ2UgbWFrZWZpbGUuY2ZnIGNvcnJlY3RseS4KK2lmIHRlc3QgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KKyAgQTJLX0RFUFM9IiIKKyAgQ09NX0EySz0iIyAiCitlbHNlCisgIEEyS19ERVBTPSJhbnNpMmtuciIKKyAgQ09NX0EySz0iIgorZmkKKworCisjIGFuc2kya25yIG5lZWRzIC1EQlNEIGlmIHN0cmluZy5oIGlzIG1pc3NpbmcKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdHJpbmdfaCA9IG5vOyB0aGVuCisgIEFOU0kyS05SRkxBR1M9Ii1EQlNEIgorZWxzZQorICBBTlNJMktOUkZMQUdTPSIiCitmaQorCisjIFN1YnN0aXR1dGlvbnMgdG8gZW5hYmxlIG9yIGRpc2FibGUgbGlidG9vbC1yZWxhdGVkIHN0dWZmCitpZiB0ZXN0ICRVU0VMSUJUT09MID0geWVzIC1hICRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzID0geWVzOyB0aGVuCisgIENPTV9MVD0iIgorZWxzZQorICBDT01fTFQ9IiMgIgorZmkKKworaWYgdGVzdCAieCRMVFNIQVJFRCIgIT0geG5vOyB0aGVuCisgIEZPUkNFX0lOU1RBTExfTElCPSJpbnN0YWxsLWxpYiIKK2Vsc2UKKyAgRk9SQ0VfSU5TVEFMTF9MSUI9IiIKK2ZpCisKKyMgU2V0IHVwIC1JIGRpcmVjdGl2ZXMKK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIElOQ0xVREVGTEFHUz0nLUkkKHNyY2RpciknCitlbHNlCisgIElOQ0xVREVGTEFHUz0nLUkuIC1JJChzcmNkaXIpJworZmkKKwordHJhcCAnJyAxIDIgMTUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGU6bWFrZWZpbGUuY2ZnIGpjb25maWcuaDpqY29uZmlnLmNmZyIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAQ0NAJSRDQyVnCitzJUBDUFBAJSRDUFAlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVATElCVE9PTEAlJExJQlRPT0wlZworcyVAT0AlJE8lZworcyVAQUAlJEElZworcyVATE5AJSRMTiVnCitzJUBJTlNUQUxMX0xJQkAlJElOU1RBTExfTElCJWcKK3MlQE1FTU9SWU1HUkAlJE1FTU9SWU1HUiVnCitzJUBKUEVHX0xJQl9WRVJTSU9OQCUkSlBFR19MSUJfVkVSU0lPTiVnCitzJUBBMktfREVQU0AlJEEyS19ERVBTJWcKK3MlQENPTV9BMktAJSRDT01fQTJLJWcKK3MlQEFOU0kyS05SRkxBR1NAJSRBTlNJMktOUkZMQUdTJWcKK3MlQENPTV9MVEAlJENPTV9MVCVnCitzJUBGT1JDRV9JTlNUQUxMX0xJQkAlJEZPUkNFX0lOU1RBTExfTElCJWcKK3MlQElOQ0xVREVGTEFHU0AlJElOQ0xVREVGTEFHUyVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZTptYWtlZmlsZS5jZmcifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9Impjb25maWcuaDpqY29uZmlnLmNmZyIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9qcGVnL2RqcGVnLjEgYi9qcGVnL2RqcGVnLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiZWI2YQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvZGpwZWcuMQpAQCAtMCwwICsxLDI1MyBAQAorLlRIIERKUEVHIDEgIjIyIEF1Z3VzdCAxOTk3IgorLlNIIE5BTUUKK2RqcGVnIFwtIGRlY29tcHJlc3MgYSBKUEVHIGZpbGUgdG8gYW4gaW1hZ2UgZmlsZQorLlNIIFNZTk9QU0lTCisuQiBkanBlZworWworLkkgb3B0aW9ucworXQorWworLkkgZmlsZW5hbWUKK10KKy5MUAorLlNIIERFU0NSSVBUSU9OCisuTFAKKy5CIGRqcGVnCitkZWNvbXByZXNzZXMgdGhlIG5hbWVkIEpQRUcgZmlsZSwgb3IgdGhlIHN0YW5kYXJkIGlucHV0IGlmIG5vIGZpbGUgaXMgbmFtZWQsCithbmQgcHJvZHVjZXMgYW4gaW1hZ2UgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgUEJNUExVUyAoUFBNL1BHTSksIEJNUCwKK0dJRiwgVGFyZ2EsIG9yIFJMRSAoVXRhaCBSYXN0ZXIgVG9vbGtpdCkgb3V0cHV0IGZvcm1hdCBjYW4gYmUgc2VsZWN0ZWQuCisoUkxFIGlzIHN1cHBvcnRlZCBvbmx5IGlmIHRoZSBVUlQgbGlicmFyeSBpcyBhdmFpbGFibGUuKQorLlNIIE9QVElPTlMKK0FsbCBzd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkOyBmb3IgZXhhbXBsZSwKKy5CIFwtZ3JheXNjYWxlCittYXkgYmUgd3JpdHRlbgorLkIgXC1ncmF5CitvcgorLkJSIFwtZ3IgLgorTW9zdCBvZiB0aGUgImJhc2ljIiBzd2l0Y2hlcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gYXMgbGl0dGxlIGFzIG9uZSBsZXR0ZXIuCitVcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudCAodGh1cworLkIgXC1CTVAKK2lzIHRoZSBzYW1lIGFzCisuQlIgXC1ibXAgKS4KK0JyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLAorLkJSIFwtZ3JleXNjYWxlICksCit0aG91Z2ggZm9yIGJyZXZpdHkgdGhlc2UgYXJlIG5vdCBtZW50aW9uZWQgYmVsb3cuCisuUFAKK1RoZSBiYXNpYyBzd2l0Y2hlcyBhcmU6CisuVFAKKy5CSSBcLWNvbG9ycyAiIE4iCitSZWR1Y2UgaW1hZ2UgdG8gYXQgbW9zdCBOIGNvbG9ycy4gIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbG9ycyB1c2VkIGluCit0aGUgb3V0cHV0IGltYWdlLCBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgb24gYSBjb2xvcm1hcHBlZCBkaXNwbGF5IG9yCitzdG9yZWQgaW4gYSBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdC4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhbiA4LWJpdAorZGlzcGxheSwgeW91J2QgbmVlZCB0byByZWR1Y2UgdG8gMjU2IG9yIGZld2VyIGNvbG9ycy4KKy5UUAorLkJJIFwtcXVhbnRpemUgIiBOIgorU2FtZSBhcworLkJSIFwtY29sb3JzIC4KKy5CIFwtY29sb3JzCitpcyB0aGUgcmVjb21tZW5kZWQgbmFtZSwKKy5CIFwtcXVhbnRpemUKK2lzIHByb3ZpZGVkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorLlRQCisuQiBcLWZhc3QKK1NlbGVjdCByZWNvbW1lbmRlZCBwcm9jZXNzaW5nIG9wdGlvbnMgZm9yIGZhc3QsIGxvdyBxdWFsaXR5IG91dHB1dC4gIChUaGUKK2RlZmF1bHQgb3B0aW9ucyBhcmUgY2hvc2VuIGZvciBoaWdoZXN0IHF1YWxpdHkgb3V0cHV0LikgIEN1cnJlbnRseSwgdGhpcyBpcworZXF1aXZhbGVudCB0byBcZkJcLWRjdCBmYXN0IFwtbm9zbW9vdGggXC1vbmVwYXNzIFwtZGl0aGVyIG9yZGVyZWRcZlIuCisuVFAKKy5CIFwtZ3JheXNjYWxlCitGb3JjZSBncmF5LXNjYWxlIG91dHB1dCBldmVuIGlmIEpQRUcgZmlsZSBpcyBjb2xvci4gIFVzZWZ1bCBmb3Igdmlld2luZyBvbgorbW9ub2Nocm9tZSBkaXNwbGF5czsgYWxzbywKKy5CIGRqcGVnCitydW5zIG5vdGljZWFibHkgZmFzdGVyIGluIHRoaXMgbW9kZS4KKy5UUAorLkJJIFwtc2NhbGUgIiBNL04iCitTY2FsZSB0aGUgb3V0cHV0IGltYWdlIGJ5IGEgZmFjdG9yIE0vTi4gIEN1cnJlbnRseSB0aGUgc2NhbGUgZmFjdG9yIG11c3QgYmUKKzEvMSwgMS8yLCAxLzQsIG9yIDEvOC4gIFNjYWxpbmcgaXMgaGFuZHkgaWYgdGhlIGltYWdlIGlzIGxhcmdlciB0aGFuIHlvdXIKK3NjcmVlbjsgYWxzbywKKy5CIGRqcGVnCitydW5zIG11Y2ggZmFzdGVyIHdoZW4gc2NhbGluZyBkb3duIHRoZSBvdXRwdXQuCisuVFAKKy5CIFwtYm1wCitTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKFdpbmRvd3MgZmxhdm9yKS4gIDgtYml0IGNvbG9ybWFwcGVkIGZvcm1hdCBpcworZW1pdHRlZCBpZgorLkIgXC1jb2xvcnMKK29yCisuQiBcLWdyYXlzY2FsZQoraXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IKK2Zvcm1hdCBpcyBlbWl0dGVkLgorLlRQCisuQiBcLWdpZgorU2VsZWN0IEdJRiBvdXRwdXQgZm9ybWF0LiAgU2luY2UgR0lGIGRvZXMgbm90IHN1cHBvcnQgbW9yZSB0aGFuIDI1NiBjb2xvcnMsCisuQiBcLWNvbG9ycyAyNTYKK2lzIGFzc3VtZWQgKHVubGVzcyB5b3Ugc3BlY2lmeSBhIHNtYWxsZXIgbnVtYmVyIG9mIGNvbG9ycykuCisuVFAKKy5CIFwtb3MyCitTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgMS54IGZsYXZvcikuICA4LWJpdCBjb2xvcm1hcHBlZCBmb3JtYXQgaXMKK2VtaXR0ZWQgaWYKKy5CIFwtY29sb3JzCitvcgorLkIgXC1ncmF5c2NhbGUKK2lzIHNwZWNpZmllZCwgb3IgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlOyBvdGhlcndpc2UsIDI0LWJpdCBmdWxsLWNvbG9yCitmb3JtYXQgaXMgZW1pdHRlZC4KKy5UUAorLkIgXC1wbm0KK1NlbGVjdCBQQk1QTFVTIChQUE0vUEdNKSBvdXRwdXQgZm9ybWF0ICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvcm1hdCkuCitQR00gaXMgZW1pdHRlZCBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGUgb3IgaWYKKy5CIFwtZ3JheXNjYWxlCitpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBQUE0gaXMgZW1pdHRlZC4KKy5UUAorLkIgXC1ybGUKK1NlbGVjdCBSTEUgb3V0cHV0IGZvcm1hdC4gIChSZXF1aXJlcyBVUlQgbGlicmFyeS4pCisuVFAKKy5CIFwtdGFyZ2EKK1NlbGVjdCBUYXJnYSBvdXRwdXQgZm9ybWF0LiAgR3JheS1zY2FsZSBmb3JtYXQgaXMgZW1pdHRlZCBpZiB0aGUgSlBFRyBmaWxlIGlzCitncmF5LXNjYWxlIG9yIGlmCisuQiBcLWdyYXlzY2FsZQoraXMgc3BlY2lmaWVkOyBvdGhlcndpc2UsIGNvbG9ybWFwcGVkIGZvcm1hdCBpcyBlbWl0dGVkIGlmCisuQiBcLWNvbG9ycworaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UsIDI0LWJpdCBmdWxsLWNvbG9yIGZvcm1hdCBpcyBlbWl0dGVkLgorLlBQCitTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6CisuVFAKKy5CIFwtZGN0IGludAorVXNlIGludGVnZXIgRENUIG1ldGhvZCAoZGVmYXVsdCkuCisuVFAKKy5CIFwtZGN0IGZhc3QKK1VzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKS4KKy5UUAorLkIgXC1kY3QgZmxvYXQKK1VzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kLgorVGhlIGZsb2F0IG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgaW50IG1ldGhvZCwgYnV0IGlzCittdWNoIHNsb3dlciB1bmxlc3MgeW91ciBtYWNoaW5lIGhhcyB2ZXJ5IGZhc3QgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuICBBbHNvCitub3RlIHRoYXQgcmVzdWx0cyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSB2YXJ5IHNsaWdodGx5IGFjcm9zcworbWFjaGluZXMsIHdoaWxlIHRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLgorVGhlIGZhc3QgaW50ZWdlciBtZXRob2QgaXMgbXVjaCBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3by4KKy5UUAorLkIgXC1kaXRoZXIgZnMKK1VzZSBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KKy5UUAorLkIgXC1kaXRoZXIgb3JkZXJlZAorVXNlIG9yZGVyZWQgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KKy5UUAorLkIgXC1kaXRoZXIgbm9uZQorRG8gbm90IHVzZSBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorQnkgZGVmYXVsdCwgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyBpcyBhcHBsaWVkIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7IHRoaXMKK2lzIHNsb3cgYnV0IHVzdWFsbHkgcHJvZHVjZXMgdGhlIGJlc3QgcmVzdWx0cy4gIE9yZGVyZWQgZGl0aGVyIGlzIGEgY29tcHJvbWlzZQorYmV0d2VlbiBzcGVlZCBhbmQgcXVhbGl0eTsgbm8gZGl0aGVyaW5nIGlzIGZhc3QgYnV0IHVzdWFsbHkgbG9va3MgYXdmdWwuICBOb3RlCit0aGF0IHRoZXNlIHN3aXRjaGVzIGhhdmUgbm8gZWZmZWN0IHVubGVzcyBjb2xvciBxdWFudGl6YXRpb24gaXMgYmVpbmcgZG9uZS4KK09yZGVyZWQgZGl0aGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluCisuQiBcLW9uZXBhc3MKK21vZGUuCisuVFAKKy5CSSBcLW1hcCAiIGZpbGUiCitRdWFudGl6ZSB0byB0aGUgY29sb3JzIHVzZWQgaW4gdGhlIHNwZWNpZmllZCBpbWFnZSBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yCitwcm9kdWNpbmcgbXVsdGlwbGUgZmlsZXMgd2l0aCBpZGVudGljYWwgY29sb3IgbWFwcywgb3IgZm9yIGZvcmNpbmcgYQorcHJlZGVmaW5lZCBzZXQgb2YgY29sb3JzIHRvIGJlIHVzZWQuICBUaGUKKy5JIGZpbGUKK211c3QgYmUgYSBHSUYgb3IgUFBNIGZpbGUuIFRoaXMgb3B0aW9uIG92ZXJyaWRlcworLkIgXC1jb2xvcnMKK2FuZAorLkJSIFwtb25lcGFzcyAuCisuVFAKKy5CIFwtbm9zbW9vdGgKK1VzZSBhIGZhc3RlciwgbG93ZXItcXVhbGl0eSB1cHNhbXBsaW5nIHJvdXRpbmUuCisuVFAKKy5CIFwtb25lcGFzcworVXNlIG9uZS1wYXNzIGluc3RlYWQgb2YgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLiAgVGhlIG9uZS1wYXNzIG1ldGhvZCBpcworZmFzdGVyIGFuZCBuZWVkcyBsZXNzIG1lbW9yeSwgYnV0IGl0IHByb2R1Y2VzIGEgbG93ZXItcXVhbGl0eSBpbWFnZS4KKy5CIFwtb25lcGFzcworaXMgaWdub3JlZCB1bmxlc3MgeW91IGFsc28gc2F5CisuQiBcLWNvbG9ycworLklSIE4gLgorQWxzbywgdGhlIG9uZS1wYXNzIG1ldGhvZCBpcyBhbHdheXMgdXNlZCBmb3IgZ3JheS1zY2FsZSBvdXRwdXQgKHRoZSB0d28tcGFzcworbWV0aG9kIGlzIG5vIGltcHJvdmVtZW50IHRoZW4pLgorLlRQCisuQkkgXC1tYXhtZW1vcnkgIiBOIgorU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nIGxhcmdlIGltYWdlcy4gIFZhbHVlIGlzCitpbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yIG1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUKK251bWJlci4gIEZvciBleGFtcGxlLAorLkIgXC1tYXggNG0KK3NlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUgc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgorLlRQCisuQkkgXC1vdXRmaWxlICIgbmFtZSIKK1NlbmQgb3V0cHV0IGltYWdlIHRvIHRoZSBuYW1lZCBmaWxlLCBub3QgdG8gc3RhbmRhcmQgb3V0cHV0LgorLlRQCisuQiBcLXZlcmJvc2UKK0VuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUKKy5CUiBcLXYgJ3MKK2dpdmUgbW9yZSBvdXRwdXQuICBBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KKy5UUAorLkIgXC1kZWJ1ZworU2FtZSBhcworLkJSIFwtdmVyYm9zZSAuCisuU0ggRVhBTVBMRVMKKy5MUAorVGhpcyBleGFtcGxlIGRlY29tcHJlc3NlcyB0aGUgSlBFRyBmaWxlIGZvby5qcGcsIHF1YW50aXplcyBpdCB0bworMjU2IGNvbG9ycywgYW5kIHNhdmVzIHRoZSBvdXRwdXQgaW4gOC1iaXQgQk1QIGZvcm1hdCBpbiBmb28uYm1wOgorLklQCisuQiBkanBlZyBcLWNvbG9ycyAyNTYgXC1ibXAKKy5JIGZvby5qcGcKKy5CID4KKy5JIGZvby5ibXAKKy5TSCBISU5UUworVG8gZ2V0IGEgcXVpY2sgcHJldmlldyBvZiBhbiBpbWFnZSwgdXNlIHRoZQorLkIgXC1ncmF5c2NhbGUKK2FuZC9vcgorLkIgXC1zY2FsZQorc3dpdGNoZXMuCisuQiBcLWdyYXlzY2FsZSBcLXNjYWxlIDEvOAoraXMgdGhlIGZhc3Rlc3QgY2FzZS4KKy5QUAorU2V2ZXJhbCBvcHRpb25zIGFyZSBhdmFpbGFibGUgdGhhdCB0cmFkZSBvZmYgaW1hZ2UgcXVhbGl0eSB0byBnYWluIHNwZWVkLgorLkIgXC1mYXN0Cit0dXJucyBvbiB0aGUgcmVjb21tZW5kZWQgc2V0dGluZ3MuCisuUFAKKy5CIFwtZGN0IGZhc3QKK2FuZC9vcgorLkIgXC1ub3Ntb290aAorZ2FpbiBzcGVlZCBhdCBhIHNtYWxsIHNhY3JpZmljZSBpbiBxdWFsaXR5LgorV2hlbiBwcm9kdWNpbmcgYSBjb2xvci1xdWFudGl6ZWQgaW1hZ2UsCisuQiBcLW9uZXBhc3MgXC1kaXRoZXIgb3JkZXJlZAoraXMgZmFzdCBidXQgbXVjaCBsb3dlciBxdWFsaXR5IHRoYW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisuQiBcLWRpdGhlciBub25lCittYXkgZ2l2ZSBhY2NlcHRhYmxlIHJlc3VsdHMgaW4gdHdvLXBhc3MgbW9kZSwgYnV0IGlzIHNlbGRvbSB0b2xlcmFibGUgaW4KK29uZS1wYXNzIG1vZGUuCisuUFAKK0lmIHlvdSBhcmUgZm9ydHVuYXRlIGVub3VnaCB0byBoYXZlIHZlcnkgZmFzdCBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSwKK1xmQlwtZGN0IGZsb2F0XGZSIG1heSBiZSBldmVuIGZhc3RlciB0aGFuIFxmQlwtZGN0IGZhc3RcZlIuICBCdXQgb24gbW9zdAorbWFjaGluZXMgXGZCXC1kY3QgZmxvYXRcZlIgaXMgc2xvd2VyIHRoYW4gXGZCXC1kY3QgaW50XGZSOyBpbiB0aGlzIGNhc2UgaXQgaXMKK25vdCB3b3J0aCB1c2luZywgYmVjYXVzZSBpdHMgdGhlb3JldGljYWwgYWNjdXJhY3kgYWR2YW50YWdlIGlzIHRvbyBzbWFsbCB0byBiZQorc2lnbmlmaWNhbnQgaW4gcHJhY3RpY2UuCisuU0ggRU5WSVJPTk1FTlQKKy5UUAorLkIgSlBFR01FTQorSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0cyB2YWx1ZSBpcyB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuCitUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBmb3IgdGhlCisuQiBcLW1heG1lbW9yeQorc3dpdGNoLgorLkIgSlBFR01FTQorb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kCitpdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbiBleHBsaWNpdAorLkJSIFwtbWF4bWVtb3J5IC4KKy5TSCBTRUUgQUxTTworLkJSIGNqcGVnICgxKSwKKy5CUiBqcGVndHJhbiAoMSksCisuQlIgcmRqcGdjb20gKDEpLAorLkJSIHdyanBnY29tICgxKQorLmJyCisuQlIgcHBtICg1KSwKKy5CUiBwZ20gKDUpCisuYnIKK1dhbGxhY2UsIEdyZWdvcnkgSy4gICJUaGUgSlBFRyBTdGlsbCBQaWN0dXJlIENvbXByZXNzaW9uIFN0YW5kYXJkIiwKK0NvbW11bmljYXRpb25zIG9mIHRoZSBBQ00sIEFwcmlsIDE5OTEgKHZvbC4gMzQsIG5vLiA0KSwgcHAuIDMwLTQ0LgorLlNIIEFVVEhPUgorSW5kZXBlbmRlbnQgSlBFRyBHcm91cAorLlNIIEJVR1MKK0FyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuCisuUFAKK1RvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudCwKKy5CIGRqcGVnCitwcm9kdWNlcyB1bmNvbXByZXNzZWQgR0lGIGZpbGVzLiAgVGhlc2UgYXJlIGxhcmdlciB0aGFuIHRoZXkgc2hvdWxkIGJlLCBidXQKK2FyZSByZWFkYWJsZSBieSBzdGFuZGFyZCBHSUYgZGVjb2RlcnMuCisuUFAKK1N0aWxsIG5vdCBhcyBmYXN0IGFzIHdlJ2QgbGlrZS4KZGlmZiAtLWdpdCBhL2pwZWcvZGpwZWcuYyBiL2pwZWcvZGpwZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDk5ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9kanBlZy5jCkBAIC0wLDAgKzEsNjE2IEBACisvKgorICogZGpwZWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCisgKiBJdCBzaG91bGQgd29yayBvbiBhbnkgc3lzdGVtIHdpdGggVW5peC0gb3IgTVMtRE9TLXN0eWxlIGNvbW1hbmQgbGluZXMuCisgKgorICogVHdvIGRpZmZlcmVudCBjb21tYW5kIGxpbmUgc3R5bGVzIGFyZSBwZXJtaXR0ZWQsIGRlcGVuZGluZyBvbiB0aGUKKyAqIGNvbXBpbGUtdGltZSBzd2l0Y2ggVFdPX0ZJTEVfQ09NTUFORExJTkU6CisgKglkanBlZyBbb3B0aW9uc10gIGlucHV0ZmlsZSBvdXRwdXRmaWxlCisgKglkanBlZyBbb3B0aW9uc10gIFtpbnB1dGZpbGVdCisgKiBJbiB0aGUgc2Vjb25kIHN0eWxlLCBvdXRwdXQgaXMgYWx3YXlzIHRvIHN0YW5kYXJkIG91dHB1dCwgd2hpY2ggeW91J2QKKyAqIG5vcm1hbGx5IHJlZGlyZWN0IHRvIGEgZmlsZSBvciBwaXBlIHRvIHNvbWUgb3RoZXIgcHJvZ3JhbS4gIElucHV0IGlzCisgKiBlaXRoZXIgZnJvbSBhIG5hbWVkIGZpbGUgb3IgZnJvbSBzdGFuZGFyZCBpbnB1dCAodHlwaWNhbGx5IHJlZGlyZWN0ZWQpLgorICogVGhlIHNlY29uZCBzdHlsZSBpcyBjb252ZW5pZW50IG9uIFVuaXggYnV0IGlzIHVuaGVscGZ1bCBvbiBzeXN0ZW1zIHRoYXQKKyAqIGRvbid0IHN1cHBvcnQgcGlwZXMuICBBbHNvLCB5b3UgTVVTVCB1c2UgdGhlIGZpcnN0IHN0eWxlIGlmIHlvdXIgc3lzdGVtCisgKiBkb2Vzbid0IGRvIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LgorICogVG8gc2ltcGxpZnkgc2NyaXB0IHdyaXRpbmcsIHRoZSAiLW91dGZpbGUiIHN3aXRjaCBpcyBwcm92aWRlZC4gIFRoZSBzeW50YXgKKyAqCWRqcGVnIFtvcHRpb25zXSAgLW91dGZpbGUgb3V0cHV0ZmlsZSAgaW5wdXRmaWxlCisgKiB3b3JrcyByZWdhcmRsZXNzIG9mIHdoaWNoIGNvbW1hbmQgbGluZSBzdHlsZSBpcyB1c2VkLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisjaW5jbHVkZSAianZlcnNpb24uaCIJCS8qIGZvciB2ZXJzaW9uIG1lc3NhZ2UgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzcHJpbnQoKSAqLworCisjaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KKyNpZmRlZiBfX01XRVJLU19fCisjaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLworI2VuZGlmCisjaWZkZWYgVEhJTktfQworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KKyNlbmRpZgorI2VuZGlmCisKKworLyogQ3JlYXRlIHRoZSBhZGQtb24gbWVzc2FnZSBzdHJpbmcgdGFibGUuICovCisKKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCXN0cmluZyAsCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RqcGVnX21lc3NhZ2VfdGFibGVbXSA9IHsKKyNpbmNsdWRlICJjZGVycm9yLmgiCisgIE5VTEwKK307CisKKworLyoKKyAqIFRoaXMgbGlzdCBkZWZpbmVzIHRoZSBrbm93biBvdXRwdXQgaW1hZ2UgZm9ybWF0cworICogKG5vdCBhbGwgb2Ygd2hpY2ggbmVlZCBiZSBzdXBwb3J0ZWQgYnkgYSBnaXZlbiB2ZXJzaW9uKS4KKyAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgYnkgZGVmaW5pbmcgREVGQVVMVF9GTVQ7CisgKiBpbmRlZWQsIHlvdSBoYWQgYmV0dGVyIGRvIHNvIGlmIHlvdSB1bmRlZmluZSBQUE1fU1VQUE9SVEVELgorICovCisKK3R5cGVkZWYgZW51bSB7CisJRk1UX0JNUCwJCS8qIEJNUCBmb3JtYXQgKFdpbmRvd3MgZmxhdm9yKSAqLworCUZNVF9HSUYsCQkvKiBHSUYgZm9ybWF0ICovCisJRk1UX09TMiwJCS8qIEJNUCBmb3JtYXQgKE9TLzIgZmxhdm9yKSAqLworCUZNVF9QUE0sCQkvKiBQUE0vUEdNIChQQk1QTFVTIGZvcm1hdHMpICovCisJRk1UX1JMRSwJCS8qIFJMRSBmb3JtYXQgKi8KKwlGTVRfVEFSR0EsCQkvKiBUYXJnYSBmb3JtYXQgKi8KKwlGTVRfVElGRgkJLyogVElGRiBmb3JtYXQgKi8KK30gSU1BR0VfRk9STUFUUzsKKworI2lmbmRlZiBERUZBVUxUX0ZNVAkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gQ0ZMQUdTIGluIE1ha2VmaWxlICovCisjZGVmaW5lIERFRkFVTFRfRk1UCUZNVF9QUE0KKyNlbmRpZgorCitzdGF0aWMgSU1BR0VfRk9STUFUUyByZXF1ZXN0ZWRfZm10OworCisKKy8qCisgKiBBcmd1bWVudC1wYXJzaW5nIGNvZGUuCisgKiBUaGUgc3dpdGNoIHBhcnNlciBpcyBkZXNpZ25lZCB0byBiZSB1c2VmdWwgd2l0aCBET1Mtc3R5bGUgY29tbWFuZCBsaW5lCisgKiBzeW50YXgsIGllLCBpbnRlcm1peGVkIHN3aXRjaGVzIGFuZCBmaWxlIG5hbWVzLCB3aGVyZSBvbmx5IHRoZSBzd2l0Y2hlcworICogdG8gdGhlIGxlZnQgb2YgYSBnaXZlbiBmaWxlIG5hbWUgYWZmZWN0IHByb2Nlc3Npbmcgb2YgdGhhdCBmaWxlLgorICogVGhlIG1haW4gcHJvZ3JhbSBpbiB0aGlzIGZpbGUgZG9lc24ndCBhY3R1YWxseSB1c2UgdGhpcyBjYXBhYmlsaXR5Li4uCisgKi8KKworCitzdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCitzdGF0aWMgY2hhciAqIG91dGZpbGVuYW1lOwkvKiBmb3IgLW91dGZpbGUgc3dpdGNoICovCisKKworTE9DQUwodm9pZCkKK3VzYWdlICh2b2lkKQorLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLworeworICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbc3dpdGNoZXNdICIsIHByb2duYW1lKTsKKyNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQorICBmcHJpbnRmKHN0ZGVyciwgImlucHV0ZmlsZSBvdXRwdXRmaWxlXG4iKTsKKyNlbHNlCisgIGZwcmludGYoc3RkZXJyLCAiW2lucHV0ZmlsZV1cbiIpOworI2VuZGlmCisKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvbG9ycyBOICAgICAgUmVkdWNlIGltYWdlIHRvIG5vIG1vcmUgdGhhbiBOIGNvbG9yc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZmFzdCAgICAgICAgICBGYXN0LCBsb3ctcXVhbGl0eSBwcm9jZXNzaW5nXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIEZvcmNlIGdyYXlzY2FsZSBvdXRwdXRcbiIpOworI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1zY2FsZSBNL04gICAgIFNjYWxlIG91dHB1dCBpbWFnZSBieSBmcmFjdGlvbiBNL04sIGVnLCAxLzhcbiIpOworI2VuZGlmCisjaWZkZWYgQk1QX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJtcCAgICAgICAgICAgU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChXaW5kb3dzIHN0eWxlKSVzXG4iLAorCSAgKERFRkFVTFRfRk1UID09IEZNVF9CTVAgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdpZiAgICAgICAgICAgU2VsZWN0IEdJRiBvdXRwdXQgZm9ybWF0JXNcbiIsCisJICAoREVGQVVMVF9GTVQgPT0gRk1UX0dJRiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBCTVBfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtb3MyICAgICAgICAgICBTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgc3R5bGUpJXNcbiIsCisJICAoREVGQVVMVF9GTVQgPT0gRk1UX09TMiA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBQUE1fU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtcG5tICAgICAgICAgICBTZWxlY3QgUEJNUExVUyAoUFBNL1BHTSkgb3V0cHV0IGZvcm1hdCVzXG4iLAorCSAgKERFRkFVTFRfRk1UID09IEZNVF9QUE0gPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgUkxFX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJsZSAgICAgICAgICAgU2VsZWN0IFV0YWggUkxFIG91dHB1dCBmb3JtYXQlc1xuIiwKKwkgIChERUZBVUxUX0ZNVCA9PSBGTVRfUkxFID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRhcmdhICAgICAgICAgU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQlc1xuIiwKKwkgIChERUZBVUxUX0ZNVCA9PSBGTVRfVEFSR0EgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOlxuIik7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBpbnQgICAgICAgVXNlIGludGVnZXIgRENUIG1ldGhvZCVzXG4iLAorCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lTTE9XID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmFzdCAgICAgIFVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKSVzXG4iLAorCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0lGQVNUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgZmxvYXQgICAgIFVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kJXNcbiIsCisJICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfRkxPQVQgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisgIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIGZzICAgICBVc2UgRi1TIGRpdGhlcmluZyAoZGVmYXVsdClcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBub25lICAgRG9uJ3QgdXNlIGRpdGhlcmluZyBpbiBxdWFudGl6YXRpb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRpdGhlciBvcmRlcmVkICBVc2Ugb3JkZXJlZCBkaXRoZXIgKG1lZGl1bSBzcGVlZCwgcXVhbGl0eSlcbiIpOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1hcCBGSUxFICAgICAgTWFwIHRvIGNvbG9ycyB1c2VkIGluIG5hbWVkIGltYWdlIGZpbGVcbiIpOworI2VuZGlmCisgIGZwcmludGYoc3RkZXJyLCAiICAtbm9zbW9vdGggICAgICBEb24ndCB1c2UgaGlnaC1xdWFsaXR5IHVwc2FtcGxpbmdcbiIpOworI2lmZGVmIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9uZXBhc3MgICAgICAgVXNlIDEtcGFzcyBxdWFudGl6YXRpb24gKGZhc3QsIGxvdyBxdWFsaXR5KVxuIik7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1tYXhtZW1vcnkgTiAgIE1heGltdW0gbWVtb3J5IHRvIHVzZSAoaW4ga2J5dGVzKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtb3V0ZmlsZSBuYW1lICBTcGVjaWZ5IG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJib3NlICBvciAgLWRlYnVnICAgRW1pdCBkZWJ1ZyBvdXRwdXRcbiIpOworICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworTE9DQUwoaW50KQorcGFyc2Vfc3dpdGNoZXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKKy8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgorICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgorICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKKyAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgorICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCisgKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCisgKiBwcm9jZXNzaW5nLgorICovCit7CisgIGludCBhcmduOworICBjaGFyICogYXJnOworCisgIC8qIFNldCB1cCBkZWZhdWx0IEpQRUcgcGFyYW1ldGVycy4gKi8KKyAgcmVxdWVzdGVkX2ZtdCA9IERFRkFVTFRfRk1UOwkvKiBzZXQgZGVmYXVsdCBvdXRwdXQgZmlsZSBmb3JtYXQgKi8KKyAgb3V0ZmlsZW5hbWUgPSBOVUxMOworICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDA7CisKKyAgLyogU2NhbiBjb21tYW5kIGxpbmUgb3B0aW9ucywgYWRqdXN0IHBhcmFtZXRlcnMgKi8KKworICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7CisgICAgYXJnID0gYXJndlthcmduXTsKKyAgICBpZiAoKmFyZyAhPSAnLScpIHsKKyAgICAgIC8qIE5vdCBhIHN3aXRjaCwgbXVzdCBiZSBhIGZpbGUgbmFtZSBhcmd1bWVudCAqLworICAgICAgaWYgKGFyZ24gPD0gbGFzdF9maWxlX2FyZ19zZWVuKSB7CisJb3V0ZmlsZW5hbWUgPSBOVUxMOwkvKiAtb3V0ZmlsZSBhcHBsaWVzIHRvIGp1c3Qgb25lIGlucHV0IGZpbGUgKi8KKwljb250aW51ZTsJCS8qIGlnbm9yZSB0aGlzIG5hbWUgaWYgcHJldmlvdXNseSBwcm9jZXNzZWQgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOwkJCS8qIGVsc2UgZG9uZSBwYXJzaW5nIHN3aXRjaGVzICovCisgICAgfQorICAgIGFyZysrOwkJCS8qIGFkdmFuY2UgcGFzdCBzd2l0Y2ggbWFya2VyIGNoYXJhY3RlciAqLworCisgICAgaWYgKGtleW1hdGNoKGFyZywgImJtcCIsIDEpKSB7CisgICAgICAvKiBCTVAgb3V0cHV0IGZvcm1hdC4gKi8KKyAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfQk1QOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjb2xvcnMiLCAxKSB8fCBrZXltYXRjaChhcmcsICJjb2xvdXJzIiwgMSkgfHwKKwkgICAgICAga2V5bWF0Y2goYXJnLCAicXVhbnRpemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJxdWFudGlzZSIsIDEpKSB7CisgICAgICAvKiBEbyBjb2xvciBxdWFudGl6YXRpb24uICovCisgICAgICBpbnQgdmFsOworCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZ2YWwpICE9IDEpCisJdXNhZ2UoKTsKKyAgICAgIGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSB2YWw7CisgICAgICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGN0IiwgMikpIHsKKyAgICAgIC8qIFNlbGVjdCBJRENUIGFsZ29yaXRobS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiaW50IiwgMSkpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSVNMT1c7CisgICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmYXN0IiwgMikpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisgICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmbG9hdCIsIDIpKSB7CisJY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0ZMT0FUOworICAgICAgfSBlbHNlCisJdXNhZ2UoKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGl0aGVyIiwgMikpIHsKKyAgICAgIC8qIFNlbGVjdCBkaXRoZXJpbmcgYWxnb3JpdGhtLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJmcyIsIDIpKSB7CisJY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIm5vbmUiLCAyKSkgeworCWNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfTk9ORTsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIm9yZGVyZWQiLCAyKSkgeworCWNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfT1JERVJFRDsKKyAgICAgIH0gZWxzZQorCXVzYWdlKCk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImRlYnVnIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAidmVyYm9zZSIsIDEpKSB7CisgICAgICAvKiBFbmFibGUgZGVidWcgcHJpbnRvdXRzLiAqLworICAgICAgLyogT24gZmlyc3QgLWQsIHByaW50IHZlcnNpb24gaWRlbnRpZmljYXRpb24gKi8KKyAgICAgIHN0YXRpYyBib29sZWFuIHByaW50ZWRfdmVyc2lvbiA9IEZBTFNFOworCisgICAgICBpZiAoISBwcmludGVkX3ZlcnNpb24pIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBESlBFRywgdmVyc2lvbiAlc1xuJXNcbiIsCisJCUpWRVJTSU9OLCBKQ09QWVJJR0hUKTsKKwlwcmludGVkX3ZlcnNpb24gPSBUUlVFOworICAgICAgfQorICAgICAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwrKzsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZmFzdCIsIDEpKSB7CisgICAgICAvKiBTZWxlY3QgcmVjb21tZW5kZWQgcHJvY2Vzc2luZyBvcHRpb25zIGZvciBxdWljay1hbmQtZGlydHkgb3V0cHV0LiAqLworICAgICAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7CisgICAgICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX09SREVSRUQ7CisgICAgICBpZiAoISBjaW5mby0+cXVhbnRpemVfY29sb3JzKSAvKiBkb24ndCBvdmVycmlkZSBhbiBlYXJsaWVyIC1jb2xvcnMgKi8KKwljaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gMjE2OworICAgICAgY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0ZBU1RFU1Q7CisgICAgICBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA9IEZBTFNFOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJnaWYiLCAxKSkgeworICAgICAgLyogR0lGIG91dHB1dCBmb3JtYXQuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX0dJRjsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZ3JheXNjYWxlIiwgMikgfHwga2V5bWF0Y2goYXJnLCAiZ3JleXNjYWxlIiwyKSkgeworICAgICAgLyogRm9yY2UgbW9ub2Nocm9tZSBvdXRwdXQuICovCisgICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWFwIiwgMykpIHsKKyAgICAgIC8qIFF1YW50aXplIHRvIGEgY29sb3IgbWFwIHRha2VuIGZyb20gYW4gaW5wdXQgZmlsZS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChmb3JfcmVhbCkgewkJLyogdG9vIGV4cGVuc2l2ZSB0byBkbyB0d2ljZSEgKi8KKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQJLyogb3RoZXJ3aXNlIGNhbid0IHF1YW50aXplIHRvIHN1cHBsaWVkIG1hcCAqLworCUZJTEUgKiBtYXBmaWxlOworCisJaWYgKChtYXBmaWxlID0gZm9wZW4oYXJndlthcmduXSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7CisJICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduXSk7CisJICBleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCXJlYWRfY29sb3JfbWFwKGNpbmZvLCBtYXBmaWxlKTsKKwlmY2xvc2UobWFwZmlsZSk7CisJY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IFRSVUU7CisjZWxzZQorCUVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXhtZW1vcnkiLCAzKSkgeworICAgICAgLyogTWF4aW11bSBtZW1vcnkgaW4gS2IgKG9yIE1iIHdpdGggJ20nKS4gKi8KKyAgICAgIGxvbmcgbHZhbDsKKyAgICAgIGNoYXIgY2ggPSAneCc7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQorCXVzYWdlKCk7CisgICAgICBpZiAoY2ggPT0gJ20nIHx8IGNoID09ICdNJykKKwlsdmFsICo9IDEwMDBMOworICAgICAgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBsdmFsICogMTAwMEw7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm5vc21vb3RoIiwgMykpIHsKKyAgICAgIC8qIFN1cHByZXNzIGZhbmN5IHVwc2FtcGxpbmcgKi8KKyAgICAgIGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0U7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm9uZXBhc3MiLCAzKSkgeworICAgICAgLyogVXNlIGZhc3Qgb25lLXBhc3MgcXVhbnRpemF0aW9uLiAqLworICAgICAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm9zMiIsIDMpKSB7CisgICAgICAvKiBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiBmbGF2b3IpLiAqLworICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9PUzI7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm91dGZpbGUiLCA0KSkgeworICAgICAgLyogU2V0IG91dHB1dCBmaWxlIG5hbWUuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbYXJnbl07CS8qIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlICovCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInBubSIsIDEpIHx8IGtleW1hdGNoKGFyZywgInBwbSIsIDEpKSB7CisgICAgICAvKiBQUE0vUEdNIG91dHB1dCBmb3JtYXQuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1BQTTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmxlIiwgMSkpIHsKKyAgICAgIC8qIFJMRSBvdXRwdXQgZm9ybWF0LiAqLworICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9STEU7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYWxlIiwgMSkpIHsKKyAgICAgIC8qIFNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmcmFjdGlvbiBNL04uICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZC8lZCIsCisJCSAmY2luZm8tPnNjYWxlX251bSwgJmNpbmZvLT5zY2FsZV9kZW5vbSkgIT0gMikKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0YXJnYSIsIDEpKSB7CisgICAgICAvKiBUYXJnYSBvdXRwdXQgZm9ybWF0LiAqLworICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9UQVJHQTsKKworICAgIH0gZWxzZSB7CisgICAgICB1c2FnZSgpOwkJCS8qIGJvZ3VzIHN3aXRjaCAqLworICAgIH0KKyAgfQorCisgIHJldHVybiBhcmduOwkJCS8qIHJldHVybiBpbmRleCBvZiBuZXh0IGFyZyAoZmlsZSBuYW1lKSAqLworfQorCisKKy8qCisgKiBNYXJrZXIgcHJvY2Vzc29yIGZvciBDT00gYW5kIGludGVyZXN0aW5nIEFQUG4gbWFya2Vycy4KKyAqIFRoaXMgcmVwbGFjZXMgdGhlIGxpYnJhcnkncyBidWlsdC1pbiBwcm9jZXNzb3IsIHdoaWNoIGp1c3Qgc2tpcHMgdGhlIG1hcmtlci4KKyAqIFdlIHdhbnQgdG8gcHJpbnQgb3V0IHRoZSBtYXJrZXIgYXMgdGV4dCwgdG8gdGhlIGV4dGVudCBwb3NzaWJsZS4KKyAqIE5vdGUgdGhpcyBjb2RlIHJlbGllcyBvbiBhIG5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlLgorICovCisKK0xPQ0FMKHVuc2lnbmVkIGludCkKK2pwZWdfZ2V0YyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFJlYWQgbmV4dCBieXRlICovCit7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBkYXRhc3JjID0gY2luZm8tPnNyYzsKKworICBpZiAoZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyID09IDApIHsKKyAgICBpZiAoISAoKmRhdGFzcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworICB9CisgIGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlci0tOworICByZXR1cm4gR0VUSk9DVEVUKCpkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUrKyk7Cit9CisKKworTUVUSE9EREVGKGJvb2xlYW4pCitwcmludF90ZXh0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgYm9vbGVhbiB0cmFjZWl0ID0gKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID49IDEpOworICBJTlQzMiBsZW5ndGg7CisgIHVuc2lnbmVkIGludCBjaDsKKyAgdW5zaWduZWQgaW50IGxhc3RjaCA9IDA7CisKKyAgbGVuZ3RoID0ganBlZ19nZXRjKGNpbmZvKSA8PCA4OworICBsZW5ndGggKz0ganBlZ19nZXRjKGNpbmZvKTsKKyAgbGVuZ3RoIC09IDI7CQkJLyogZGlzY291bnQgdGhlIGxlbmd0aCB3b3JkIGl0c2VsZiAqLworCisgIGlmICh0cmFjZWl0KSB7CisgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IEpQRUdfQ09NKQorICAgICAgZnByaW50ZihzdGRlcnIsICJDb21tZW50LCBsZW5ndGggJWxkOlxuIiwgKGxvbmcpIGxlbmd0aCk7CisgICAgZWxzZQkJCS8qIGFzc3VtZSBpdCBpcyBhbiBBUFBuIG90aGVyd2lzZSAqLworICAgICAgZnByaW50ZihzdGRlcnIsICJBUFAlZCwgbGVuZ3RoICVsZDpcbiIsCisJICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgLSBKUEVHX0FQUDAsIChsb25nKSBsZW5ndGgpOworICB9CisKKyAgd2hpbGUgKC0tbGVuZ3RoID49IDApIHsKKyAgICBjaCA9IGpwZWdfZ2V0YyhjaW5mbyk7CisgICAgaWYgKHRyYWNlaXQpIHsKKyAgICAgIC8qIEVtaXQgdGhlIGNoYXJhY3RlciBpbiBhIHJlYWRhYmxlIGZvcm0uCisgICAgICAgKiBOb25wcmludGFibGVzIGFyZSBjb252ZXJ0ZWQgdG8gXG5ubiBmb3JtLAorICAgICAgICogd2hpbGUgXCBpcyBjb252ZXJ0ZWQgdG8gXFwuCisgICAgICAgKiBOZXdsaW5lcyBpbiBDUiwgQ1IvTEYsIG9yIExGIGZvcm0gd2lsbCBiZSBwcmludGVkIGFzIG9uZSBuZXdsaW5lLgorICAgICAgICovCisgICAgICBpZiAoY2ggPT0gJ1xyJykgeworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgeworCWlmIChsYXN0Y2ggIT0gJ1xyJykKKwkgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgeworCWZwcmludGYoc3RkZXJyLCAiXFxcXCIpOworICAgICAgfSBlbHNlIGlmIChpc3ByaW50KGNoKSkgeworCXB1dGMoY2gsIHN0ZGVycik7CisgICAgICB9IGVsc2UgeworCWZwcmludGYoc3RkZXJyLCAiXFwlMDNvIiwgY2gpOworICAgICAgfQorICAgICAgbGFzdGNoID0gY2g7CisgICAgfQorICB9CisKKyAgaWYgKHRyYWNlaXQpCisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBUaGUgbWFpbiBwcm9ncmFtLgorICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHByb2dyZXNzOworI2VuZGlmCisgIGludCBmaWxlX2luZGV4OworICBkanBlZ19kZXN0X3B0ciBkZXN0X21nciA9IE5VTEw7CisgIEZJTEUgKiBpbnB1dF9maWxlOworICBGSUxFICogb3V0cHV0X2ZpbGU7CisgIEpESU1FTlNJT04gbnVtX3NjYW5saW5lczsKKworICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLworI2lmZGVmIFVTRV9DQ09NTUFORAorICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOworI2VuZGlmCisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQorICAgIHByb2duYW1lID0gImRqcGVnIjsJCS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLworCisgIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLworICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgLyogQWRkIHNvbWUgYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgKGZyb20gY2RlcnJvci5oKSAqLworICBqZXJyLmFkZG9uX21lc3NhZ2VfdGFibGUgPSBjZGpwZWdfbWVzc2FnZV90YWJsZTsKKyAgamVyci5maXJzdF9hZGRvbl9tZXNzYWdlID0gSk1TR19GSVJTVEFERE9OQ09ERTsKKyAgamVyci5sYXN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0xBU1RBRERPTkNPREU7CisKKyAgLyogSW5zZXJ0IGN1c3RvbSBtYXJrZXIgcHJvY2Vzc29yIGZvciBDT00gYW5kIEFQUDEyLgorICAgKiBBUFAxMiBpcyB1c2VkIGJ5IHNvbWUgZGlnaXRhbCBjYW1lcmEgbWFrZXJzIGZvciB0ZXh0dWFsIGluZm8sCisgICAqIHNvIHdlIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gZGlzcGxheSBpdCBhcyB0ZXh0LgorICAgKiBJZiB5b3UgbGlrZSwgYWRkaXRpb25hbCBBUFBuIG1hcmtlciB0eXBlcyBjYW4gYmUgc2VsZWN0ZWQgZm9yIGRpc3BsYXksCisgICAqIGJ1dCBkb24ndCB0cnkgdG8gb3ZlcnJpZGUgQVBQMCBvciBBUFAxNCB0aGlzIHdheSAoc2VlIGxpYmpwZWcuZG9jKS4KKyAgICovCisgIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoJmNpbmZvLCBKUEVHX0NPTSwgcHJpbnRfdGV4dF9tYXJrZXIpOworICBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCZjaW5mbywgSlBFR19BUFAwKzEyLCBwcmludF90ZXh0X21hcmtlcik7CisKKyAgLyogTm93IHNhZmUgdG8gZW5hYmxlIHNpZ25hbCBjYXRjaGVyLiAqLworI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKKyAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisjZW5kaWYKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSB0byBmaW5kIGZpbGUgbmFtZXMuICovCisgIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gdXNlIGp1c3Qgb25lIHN3aXRjaC1wYXJzaW5nIHJvdXRpbmUsIGJ1dCB0aGUgc3dpdGNoCisgICAqIHZhbHVlcyByZWFkIGhlcmUgYXJlIGlnbm9yZWQ7IHdlIHdpbGwgcmVzY2FuIHRoZSBzd2l0Y2hlcyBhZnRlciBvcGVuaW5nCisgICAqIHRoZSBpbnB1dCBmaWxlLgorICAgKiAoRXhjZXB0aW9uOiB0cmFjaW5nIGxldmVsIHNldCBoZXJlIGNvbnRyb2xzIHZlcmJvc2l0eSBmb3IgQ09NIG1hcmtlcnMKKyAgICogZm91bmQgZHVyaW5nIGpwZWdfcmVhZF9oZWFkZXIuLi4pCisgICAqLworCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmY2luZm8sIGFyZ2MsIGFyZ3YsIDAsIEZBTFNFKTsKKworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIC8qIE11c3QgaGF2ZSBlaXRoZXIgLW91dGZpbGUgc3dpdGNoIG9yIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KKyAgaWYgKG91dGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTIpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleCsxXTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKKyAgICB1c2FnZSgpOworICB9CisjZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KKworICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MpIHsKKyAgICBpZiAoKGlucHV0X2ZpbGUgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCisgICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKKyAgfQorCisgIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLworICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgeworICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KKyAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOworICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8sICZwcm9ncmVzcyk7CisjZW5kaWYKKworICAvKiBTcGVjaWZ5IGRhdGEgc291cmNlIGZvciBkZWNvbXByZXNzaW9uICovCisgIGpwZWdfc3RkaW9fc3JjKCZjaW5mbywgaW5wdXRfZmlsZSk7CisKKyAgLyogUmVhZCBmaWxlIGhlYWRlciwgc2V0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzICovCisgICh2b2lkKSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7CisKKyAgLyogQWRqdXN0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KKyAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgb3V0cHV0IG1vZHVsZSBub3cgdG8gbGV0IGl0IG92ZXJyaWRlIGFueSBjcnVjaWFsCisgICAqIG9wdGlvbiBzZXR0aW5ncyAoZm9yIGluc3RhbmNlLCBHSUYgd2FudHMgdG8gZm9yY2UgY29sb3IgcXVhbnRpemF0aW9uKS4KKyAgICovCisgIHN3aXRjaCAocmVxdWVzdGVkX2ZtdCkgeworI2lmZGVmIEJNUF9TVVBQT1JURUQKKyAgY2FzZSBGTVRfQk1QOgorICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfYm1wKCZjaW5mbywgRkFMU0UpOworICAgIGJyZWFrOworICBjYXNlIEZNVF9PUzI6CisgICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9ibXAoJmNpbmZvLCBUUlVFKTsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEdJRl9TVVBQT1JURUQKKyAgY2FzZSBGTVRfR0lGOgorICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfZ2lmKCZjaW5mbyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBQUE1fU1VQUE9SVEVECisgIGNhc2UgRk1UX1BQTToKKyAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX3BwbSgmY2luZm8pOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgUkxFX1NVUFBPUlRFRAorICBjYXNlIEZNVF9STEU6CisgICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9ybGUoJmNpbmZvKTsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAorICBjYXNlIEZNVF9UQVJHQToKKyAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX3RhcmdhKCZjaW5mbyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKCZjaW5mbywgSkVSUl9VTlNVUFBPUlRFRF9GT1JNQVQpOworICAgIGJyZWFrOworICB9CisgIGRlc3RfbWdyLT5vdXRwdXRfZmlsZSA9IG91dHB1dF9maWxlOworCisgIC8qIFN0YXJ0IGRlY29tcHJlc3NvciAqLworICAodm9pZCkganBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogV3JpdGUgb3V0cHV0IGZpbGUgaGVhZGVyICovCisgICgqZGVzdF9tZ3ItPnN0YXJ0X291dHB1dCkgKCZjaW5mbywgZGVzdF9tZ3IpOworCisgIC8qIFByb2Nlc3MgZGF0YSAqLworICB3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkgeworICAgIG51bV9zY2FubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgZGVzdF9tZ3ItPmJ1ZmZlciwKKwkJCQkJZGVzdF9tZ3ItPmJ1ZmZlcl9oZWlnaHQpOworICAgICgqZGVzdF9tZ3ItPnB1dF9waXhlbF9yb3dzKSAoJmNpbmZvLCBkZXN0X21nciwgbnVtX3NjYW5saW5lcyk7CisgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICAvKiBIYWNrOiBjb3VudCBmaW5hbCBwYXNzIGFzIGRvbmUgaW4gY2FzZSBmaW5pc2hfb3V0cHV0IGRvZXMgYW4gZXh0cmEgcGFzcy4KKyAgICogVGhlIGxpYnJhcnkgd29uJ3QgaGF2ZSB1cGRhdGVkIGNvbXBsZXRlZF9wYXNzZXMuCisgICAqLworICBwcm9ncmVzcy5wdWIuY29tcGxldGVkX3Bhc3NlcyA9IHByb2dyZXNzLnB1Yi50b3RhbF9wYXNzZXM7CisjZW5kaWYKKworICAvKiBGaW5pc2ggZGVjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkuCisgICAqIEkgbXVzdCBkbyBpdCBpbiB0aGlzIG9yZGVyIGJlY2F1c2Ugb3V0cHV0IG1vZHVsZSBoYXMgYWxsb2NhdGVkIG1lbW9yeQorICAgKiBvZiBsaWZlc3BhbiBKUE9PTF9JTUFHRTsgaXQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSByZWxlYXNpbmcgbWVtb3J5LgorICAgKi8KKyAgKCpkZXN0X21nci0+ZmluaXNoX291dHB1dCkgKCZjaW5mbywgZGVzdF9tZ3IpOworICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworCisgIC8qIENsb3NlIGZpbGVzLCBpZiB3ZSBvcGVuZWQgdGhlbSAqLworICBpZiAoaW5wdXRfZmlsZSAhPSBzdGRpbikKKyAgICBmY2xvc2UoaW5wdXRfZmlsZSk7CisgIGlmIChvdXRwdXRfZmlsZSAhPSBzdGRvdXQpCisgICAgZmNsb3NlKG91dHB1dF9maWxlKTsKKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBlbmRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8pOworI2VuZGlmCisKKyAgLyogQWxsIGRvbmUuICovCisgIGV4aXQoamVyci5udW1fd2FybmluZ3MgPyBFWElUX1dBUk5JTkcgOiBFWElUX1NVQ0NFU1MpOworICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KK30KZGlmZiAtLWdpdCBhL2pwZWcvZXhhbXBsZS5jIGIvanBlZy9leGFtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjMzU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvZXhhbXBsZS5jCkBAIC0wLDAgKzEsNDMzIEBACisvKgorICogZXhhbXBsZS5jCisgKgorICogVGhpcyBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgdGhlIElKRyBjb2RlIGFzIGEgc3Vicm91dGluZSBsaWJyYXJ5CisgKiB0byByZWFkIG9yIHdyaXRlIEpQRUcgaW1hZ2UgZmlsZXMuICBZb3Ugc2hvdWxkIGxvb2sgYXQgdGhpcyBjb2RlIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSBkb2N1bWVudGF0aW9uIGZpbGUgbGlianBlZy5kb2MuCisgKgorICogVGhpcyBjb2RlIHdpbGwgbm90IGRvIGFueXRoaW5nIHVzZWZ1bCBhcy1pcywgYnV0IGl0IG1heSBiZSBoZWxwZnVsIGFzIGEKKyAqIHNrZWxldG9uIGZvciBjb25zdHJ1Y3Rpbmcgcm91dGluZXMgdGhhdCBjYWxsIHRoZSBKUEVHIGxpYnJhcnkuICAKKyAqCisgKiBXZSBwcmVzZW50IHRoZXNlIHJvdXRpbmVzIGluIHRoZSBzYW1lIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSBKUEVHIGNvZGUKKyAqIChBTlNJIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldGMpOyBidXQgeW91IGFyZSBvZiBjb3Vyc2UgZnJlZSB0byBjb2RlIHlvdXIKKyAqIHJvdXRpbmVzIGluIGEgZGlmZmVyZW50IHN0eWxlIGlmIHlvdSBwcmVmZXIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIHVzZXJzIG9mIEpQRUcgbGlicmFyeS4KKyAqIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBpbmNsdWRlZCBzeXN0ZW0gaGVhZGVycyB0aGF0IGRlZmluZSBhdCBsZWFzdAorICogdGhlIHR5cGVkZWZzIEZJTEUgYW5kIHNpemVfdCBiZWZvcmUgeW91IGNhbiBpbmNsdWRlIGpwZWdsaWIuaC4KKyAqIChzdGRpby5oIGlzIHN1ZmZpY2llbnQgb24gQU5TSS1jb25mb3JtaW5nIHN5c3RlbXMuKQorICogWW91IG1heSBhbHNvIHdpc2ggdG8gaW5jbHVkZSAiamVycm9yLmgiLgorICovCisKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKy8qCisgKiA8c2V0am1wLmg+IGlzIHVzZWQgZm9yIHRoZSBvcHRpb25hbCBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20gc2hvd24gaW4KKyAqIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgZXhhbXBsZS4KKyAqLworCisjaW5jbHVkZSA8c2V0am1wLmg+CisKKworCisvKioqKioqKioqKioqKioqKioqKiogSlBFRyBDT01QUkVTU0lPTiBTQU1QTEUgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaGFsZiBvZiB0aGUgZXhhbXBsZSBzaG93cyBob3cgdG8gZmVlZCBkYXRhIGludG8gdGhlIEpQRUcgY29tcHJlc3Nvci4KKyAqIFdlIHByZXNlbnQgYSBtaW5pbWFsIHZlcnNpb24gdGhhdCBkb2VzIG5vdCB3b3JyeSBhYm91dCByZWZpbmVtZW50cyBzdWNoCisgKiBhcyBlcnJvciByZWNvdmVyeSAodGhlIEpQRUcgY29kZSB3aWxsIGp1c3QgZXhpdCgpIGlmIGl0IGdldHMgYW4gZXJyb3IpLgorICovCisKKworLyoKKyAqIElNQUdFIERBVEEgRk9STUFUUzoKKyAqCisgKiBUaGUgc3RhbmRhcmQgaW5wdXQgaW1hZ2UgZm9ybWF0IGlzIGEgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgcGl4ZWxzLCB3aXRoCisgKiBlYWNoIHBpeGVsIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2YgImNvbXBvbmVudCIgdmFsdWVzIChjb2xvciBjaGFubmVscykuCisgKiBFYWNoIHBpeGVsIHJvdyBpcyBhbiBhcnJheSBvZiBKU0FNUExFcyAod2hpY2ggdHlwaWNhbGx5IGFyZSB1bnNpZ25lZCBjaGFycykuCisgKiBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBjb2xvciBkYXRhLCB0aGVuIHRoZSBjb2xvciB2YWx1ZXMgZm9yIGVhY2ggcGl4ZWwKKyAqIG11c3QgYmUgYWRqYWNlbnQgaW4gdGhlIHJvdzsgZm9yIGV4YW1wbGUsIFIsRyxCLFIsRyxCLFIsRyxCLC4uLiBmb3IgMjQtYml0CisgKiBSR0IgY29sb3IuCisgKgorICogRm9yIHRoaXMgZXhhbXBsZSwgd2UnbGwgYXNzdW1lIHRoYXQgdGhpcyBkYXRhIHN0cnVjdHVyZSBtYXRjaGVzIHRoZSB3YXkKKyAqIG91ciBhcHBsaWNhdGlvbiBoYXMgc3RvcmVkIHRoZSBpbWFnZSBpbiBtZW1vcnksIHNvIHdlIGNhbiBqdXN0IHBhc3MgYQorICogcG9pbnRlciB0byBvdXIgaW1hZ2UgYnVmZmVyLiAgSW4gcGFydGljdWxhciwgbGV0J3Mgc2F5IHRoYXQgdGhlIGltYWdlIGlzCisgKiBSR0IgY29sb3IgYW5kIGlzIGRlc2NyaWJlZCBieToKKyAqLworCitleHRlcm4gSlNBTVBMRSAqIGltYWdlX2J1ZmZlcjsJLyogUG9pbnRzIHRvIGxhcmdlIGFycmF5IG9mIFIsRyxCLW9yZGVyIGRhdGEgKi8KK2V4dGVybiBpbnQgaW1hZ2VfaGVpZ2h0OwkvKiBOdW1iZXIgb2Ygcm93cyBpbiBpbWFnZSAqLworZXh0ZXJuIGludCBpbWFnZV93aWR0aDsJCS8qIE51bWJlciBvZiBjb2x1bW5zIGluIGltYWdlICovCisKKworLyoKKyAqIFNhbXBsZSByb3V0aW5lIGZvciBKUEVHIGNvbXByZXNzaW9uLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBmaWxlIG5hbWUKKyAqIGFuZCBhIGNvbXByZXNzaW9uIHF1YWxpdHkgZmFjdG9yIGFyZSBwYXNzZWQgaW4uCisgKi8KKworR0xPQkFMKHZvaWQpCit3cml0ZV9KUEVHX2ZpbGUgKGNoYXIgKiBmaWxlbmFtZSwgaW50IHF1YWxpdHkpCit7CisgIC8qIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBKUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHBvaW50ZXJzIHRvCisgICAqIHdvcmtpbmcgc3BhY2UgKHdoaWNoIGlzIGFsbG9jYXRlZCBhcyBuZWVkZWQgYnkgdGhlIEpQRUcgbGlicmFyeSkuCisgICAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc2V2ZXJhbCBzdWNoIHN0cnVjdHVyZXMsIHJlcHJlc2VudGluZyBtdWx0aXBsZQorICAgKiBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIHByb2Nlc3NlcywgaW4gZXhpc3RlbmNlIGF0IG9uY2UuICBXZSByZWZlcgorICAgKiB0byBhbnkgb25lIHN0cnVjdCAoYW5kIGl0cyBhc3NvY2lhdGVkIHdvcmtpbmcgZGF0YSkgYXMgYSAiSlBFRyBvYmplY3QiLgorICAgKi8KKyAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOworICAvKiBUaGlzIHN0cnVjdCByZXByZXNlbnRzIGEgSlBFRyBlcnJvciBoYW5kbGVyLiAgSXQgaXMgZGVjbGFyZWQgc2VwYXJhdGVseQorICAgKiBiZWNhdXNlIGFwcGxpY2F0aW9ucyBvZnRlbiB3YW50IHRvIHN1cHBseSBhIHNwZWNpYWxpemVkIGVycm9yIGhhbmRsZXIKKyAgICogKHNlZSB0aGUgc2Vjb25kIGhhbGYgb2YgdGhpcyBmaWxlIGZvciBhbiBleGFtcGxlKS4gIEJ1dCBoZXJlIHdlIGp1c3QKKyAgICogdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGFuZCB1c2UgdGhlIHN0YW5kYXJkIGVycm9yIGhhbmRsZXIsIHdoaWNoIHdpbGwKKyAgICogcHJpbnQgYSBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgY2FsbCBleGl0KCkgaWYgY29tcHJlc3Npb24gZmFpbHMuCisgICAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdCBtdXN0IGxpdmUgYXMgbG9uZyBhcyB0aGUgbWFpbiBKUEVHIHBhcmFtZXRlcgorICAgKiBzdHJ1Y3QsIHRvIGF2b2lkIGRhbmdsaW5nLXBvaW50ZXIgcHJvYmxlbXMuCisgICAqLworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKKyAgLyogTW9yZSBzdHVmZiAqLworICBGSUxFICogb3V0ZmlsZTsJCS8qIHRhcmdldCBmaWxlICovCisgIEpTQU1QUk9XIHJvd19wb2ludGVyWzFdOwkvKiBwb2ludGVyIHRvIEpTQU1QTEUgcm93W3NdICovCisgIGludCByb3dfc3RyaWRlOwkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIGltYWdlIGJ1ZmZlciAqLworCisgIC8qIFN0ZXAgMTogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgKi8KKworICAvKiBXZSBoYXZlIHRvIHNldCB1cCB0aGUgZXJyb3IgaGFuZGxlciBmaXJzdCwgaW4gY2FzZSB0aGUgaW5pdGlhbGl6YXRpb24KKyAgICogc3RlcCBmYWlscy4gIChVbmxpa2VseSwgYnV0IGl0IGNvdWxkIGhhcHBlbiBpZiB5b3UgYXJlIG91dCBvZiBtZW1vcnkuKQorICAgKiBUaGlzIHJvdXRpbmUgZmlsbHMgaW4gdGhlIGNvbnRlbnRzIG9mIHN0cnVjdCBqZXJyLCBhbmQgcmV0dXJucyBqZXJyJ3MKKyAgICogYWRkcmVzcyB3aGljaCB3ZSBwbGFjZSBpbnRvIHRoZSBsaW5rIGZpZWxkIGluIGNpbmZvLgorICAgKi8KKyAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworICAvKiBOb3cgd2UgY2FuIGluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LiAqLworICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOworCisgIC8qIFN0ZXAgMjogc3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIChlZywgYSBmaWxlKSAqLworICAvKiBOb3RlOiBzdGVwcyAyIGFuZCAzIGNhbiBiZSBkb25lIGluIGVpdGhlciBvcmRlci4gKi8KKworICAvKiBIZXJlIHdlIHVzZSB0aGUgbGlicmFyeS1zdXBwbGllZCBjb2RlIHRvIHNlbmQgY29tcHJlc3NlZCBkYXRhIHRvIGEKKyAgICogc3RkaW8gc3RyZWFtLiAgWW91IGNhbiBhbHNvIHdyaXRlIHlvdXIgb3duIGNvZGUgdG8gZG8gc29tZXRoaW5nIGVsc2UuCisgICAqIFZFUlkgSU1QT1JUQU5UOiB1c2UgImIiIG9wdGlvbiB0byBmb3BlbigpIGlmIHlvdSBhcmUgb24gYSBtYWNoaW5lIHRoYXQKKyAgICogcmVxdWlyZXMgaXQgaW4gb3JkZXIgdG8gd3JpdGUgYmluYXJ5IGZpbGVzLgorICAgKi8KKyAgaWYgKChvdXRmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisgICAgZXhpdCgxKTsKKyAgfQorICBqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRmaWxlKTsKKworICAvKiBTdGVwIDM6IHNldCBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2lvbiAqLworCisgIC8qIEZpcnN0IHdlIHN1cHBseSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnB1dCBpbWFnZS4KKyAgICogRm91ciBmaWVsZHMgb2YgdGhlIGNpbmZvIHN0cnVjdCBtdXN0IGJlIGZpbGxlZCBpbjoKKyAgICovCisgIGNpbmZvLmltYWdlX3dpZHRoID0gaW1hZ2Vfd2lkdGg7IAkvKiBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0LCBpbiBwaXhlbHMgKi8KKyAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gaW1hZ2VfaGVpZ2h0OworICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBwZXIgcGl4ZWwgKi8KKyAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAJLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLworICAvKiBOb3cgdXNlIHRoZSBsaWJyYXJ5J3Mgcm91dGluZSB0byBzZXQgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorICAgKiAoWW91IG11c3Qgc2V0IGF0IGxlYXN0IGNpbmZvLmluX2NvbG9yX3NwYWNlIGJlZm9yZSBjYWxsaW5nIHRoaXMsCisgICAqIHNpbmNlIHRoZSBkZWZhdWx0cyBkZXBlbmQgb24gdGhlIHNvdXJjZSBjb2xvciBzcGFjZS4pCisgICAqLworICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOworICAvKiBOb3cgeW91IGNhbiBzZXQgYW55IG5vbi1kZWZhdWx0IHBhcmFtZXRlcnMgeW91IHdpc2ggdG8uCisgICAqIEhlcmUgd2UganVzdCBpbGx1c3RyYXRlIHRoZSB1c2Ugb2YgcXVhbGl0eSAocXVhbnRpemF0aW9uIHRhYmxlKSBzY2FsaW5nOgorICAgKi8KKyAganBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIHF1YWxpdHksIFRSVUUgLyogbGltaXQgdG8gYmFzZWxpbmUtSlBFRyB2YWx1ZXMgKi8pOworCisgIC8qIFN0ZXAgNDogU3RhcnQgY29tcHJlc3NvciAqLworCisgIC8qIFRSVUUgZW5zdXJlcyB0aGF0IHdlIHdpbGwgd3JpdGUgYSBjb21wbGV0ZSBpbnRlcmNoYW5nZS1KUEVHIGZpbGUuCisgICAqIFBhc3MgVFJVRSB1bmxlc3MgeW91IGFyZSB2ZXJ5IHN1cmUgb2Ygd2hhdCB5b3UncmUgZG9pbmcuCisgICAqLworICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisKKyAgLyogU3RlcCA1OiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgd3JpdHRlbikgKi8KKyAgLyogICAgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7ICovCisKKyAgLyogSGVyZSB3ZSB1c2UgdGhlIGxpYnJhcnkncyBzdGF0ZSB2YXJpYWJsZSBjaW5mby5uZXh0X3NjYW5saW5lIGFzIHRoZQorICAgKiBsb29wIGNvdW50ZXIsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHRyYWNrIG91cnNlbHZlcy4KKyAgICogVG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCB3ZSBwYXNzIG9uZSBzY2FubGluZSBwZXIgY2FsbDsgeW91IGNhbiBwYXNzCisgICAqIG1vcmUgaWYgeW91IHdpc2gsIHRob3VnaC4KKyAgICovCisgIHJvd19zdHJpZGUgPSBpbWFnZV93aWR0aCAqIDM7CS8qIEpTQU1QTEVzIHBlciByb3cgaW4gaW1hZ2VfYnVmZmVyICovCisKKyAgd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKKyAgICAvKiBqcGVnX3dyaXRlX3NjYW5saW5lcyBleHBlY3RzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcy4KKyAgICAgKiBIZXJlIHRoZSBhcnJheSBpcyBvbmx5IG9uZSBlbGVtZW50IGxvbmcsIGJ1dCB5b3UgY291bGQgcGFzcworICAgICAqIG1vcmUgdGhhbiBvbmUgc2NhbmxpbmUgYXQgYSB0aW1lIGlmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuCisgICAgICovCisgICAgcm93X3BvaW50ZXJbMF0gPSAmIGltYWdlX2J1ZmZlcltjaW5mby5uZXh0X3NjYW5saW5lICogcm93X3N0cmlkZV07CisgICAgKHZvaWQpIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgcm93X3BvaW50ZXIsIDEpOworICB9CisKKyAgLyogU3RlcCA2OiBGaW5pc2ggY29tcHJlc3Npb24gKi8KKworICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOworICAvKiBBZnRlciBmaW5pc2hfY29tcHJlc3MsIHdlIGNhbiBjbG9zZSB0aGUgb3V0cHV0IGZpbGUuICovCisgIGZjbG9zZShvdXRmaWxlKTsKKworICAvKiBTdGVwIDc6IHJlbGVhc2UgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgKi8KKworICAvKiBUaGlzIGlzIGFuIGltcG9ydGFudCBzdGVwIHNpbmNlIGl0IHdpbGwgcmVsZWFzZSBhIGdvb2QgZGVhbCBvZiBtZW1vcnkuICovCisgIGpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOworCisgIC8qIEFuZCB3ZSdyZSBkb25lISAqLworfQorCisKKy8qCisgKiBTT01FIEZJTkUgUE9JTlRTOgorICoKKyAqIEluIHRoZSBhYm92ZSBsb29wLCB3ZSBpZ25vcmVkIHRoZSByZXR1cm4gdmFsdWUgb2YganBlZ193cml0ZV9zY2FubGluZXMsCisgKiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhY3R1YWxseSB3cml0dGVuLiAgV2UgY291bGQgZ2V0IGF3YXkKKyAqIHdpdGggdGhpcyBiZWNhdXNlIHdlIHdlcmUgb25seSByZWx5aW5nIG9uIHRoZSB2YWx1ZSBvZiBjaW5mby5uZXh0X3NjYW5saW5lLAorICogd2hpY2ggd2lsbCBiZSBpbmNyZW1lbnRlZCBjb3JyZWN0bHkuICBJZiB5b3UgbWFpbnRhaW4gYWRkaXRpb25hbCBsb29wCisgKiB2YXJpYWJsZXMgdGhlbiB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgdG8gaW5jcmVtZW50IHRoZW0gcHJvcGVybHkuCisgKiBBY3R1YWxseSwgZm9yIG91dHB1dCB0byBhIHN0ZGlvIHN0cmVhbSB5b3UgbmVlZG4ndCB3b3JyeSwgYmVjYXVzZQorICogdGhlbiBqcGVnX3dyaXRlX3NjYW5saW5lcyB3aWxsIHdyaXRlIGFsbCB0aGUgbGluZXMgcGFzc2VkIChvciBlbHNlIGV4aXQKKyAqIHdpdGggYSBmYXRhbCBlcnJvcikuICBQYXJ0aWFsIHdyaXRlcyBjYW4gb25seSBvY2N1ciBpZiB5b3UgdXNlIGEgZGF0YQorICogZGVzdGluYXRpb24gbW9kdWxlIHRoYXQgY2FuIGRlbWFuZCBzdXNwZW5zaW9uIG9mIHRoZSBjb21wcmVzc29yLgorICogKElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhhdCdzIGZvciwgeW91IGRvbid0IG5lZWQgaXQuKQorICoKKyAqIElmIHRoZSBjb21wcmVzc29yIHJlcXVpcmVzIGZ1bGwtaW1hZ2UgYnVmZmVycyAoZm9yIGVudHJvcHktY29kaW5nCisgKiBvcHRpbWl6YXRpb24gb3IgYSBtdWx0aS1zY2FuIEpQRUcgZmlsZSksIGl0IHdpbGwgY3JlYXRlIHRlbXBvcmFyeQorICogZmlsZXMgZm9yIGFueXRoaW5nIHRoYXQgZG9lc24ndCBmaXQgd2l0aGluIHRoZSBtYXhpbXVtLW1lbW9yeSBzZXR0aW5nLgorICogKE5vdGUgdGhhdCB0ZW1wIGZpbGVzIGFyZSBOT1QgbmVlZGVkIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQgcGFyYW1ldGVycy4pCisgKiBPbiBzb21lIHN5c3RlbXMgeW91IG1heSBuZWVkIHRvIHNldCB1cCBhIHNpZ25hbCBoYW5kbGVyIHRvIGVuc3VyZSB0aGF0CisgKiB0ZW1wb3JhcnkgZmlsZXMgYXJlIGRlbGV0ZWQgaWYgdGhlIHByb2dyYW0gaXMgaW50ZXJydXB0ZWQuICBTZWUgbGlianBlZy5kb2MuCisgKgorICogU2NhbmxpbmVzIE1VU1QgYmUgc3VwcGxpZWQgaW4gdG9wLXRvLWJvdHRvbSBvcmRlciBpZiB5b3Ugd2FudCB5b3VyIEpQRUcKKyAqIGZpbGVzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBldmVyeW9uZSBlbHNlJ3MuICBJZiB5b3UgY2Fubm90IHJlYWRpbHkgcmVhZAorICogeW91ciBkYXRhIGluIHRoYXQgb3JkZXIsIHlvdSdsbCBuZWVkIGFuIGludGVybWVkaWF0ZSBhcnJheSB0byBob2xkIHRoZQorICogaW1hZ2UuICBTZWUgcmR0YXJnYS5jIG9yIHJkYm1wLmMgZm9yIGV4YW1wbGVzIG9mIGhhbmRsaW5nIGJvdHRvbS10by10b3AKKyAqIHNvdXJjZSBkYXRhIHVzaW5nIHRoZSBKUEVHIGNvZGUncyBpbnRlcm5hbCB2aXJ0dWFsLWFycmF5IG1lY2hhbmlzbXMuCisgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKiBKUEVHIERFQ09NUFJFU1NJT04gU0FNUExFIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGhhbGYgb2YgdGhlIGV4YW1wbGUgc2hvd3MgaG93IHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqIEl0J3MgYSBiaXQgbW9yZSByZWZpbmVkIHRoYW4gdGhlIGFib3ZlLCBpbiB0aGF0IHdlIHNob3c6CisgKiAgIChhKSBob3cgdG8gbW9kaWZ5IHRoZSBKUEVHIGxpYnJhcnkncyBzdGFuZGFyZCBlcnJvci1yZXBvcnRpbmcgYmVoYXZpb3I7CisgKiAgIChiKSBob3cgdG8gYWxsb2NhdGUgd29ya3NwYWNlIHVzaW5nIHRoZSBsaWJyYXJ5J3MgbWVtb3J5IG1hbmFnZXIuCisgKgorICogSnVzdCB0byBtYWtlIHRoaXMgZXhhbXBsZSBhIGxpdHRsZSBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCB3ZSdsbAorICogYXNzdW1lIHRoYXQgd2UgZG8gbm90IGludGVuZCB0byBwdXQgdGhlIHdob2xlIGltYWdlIGludG8gYW4gaW4tbWVtb3J5CisgKiBidWZmZXIsIGJ1dCB0byBzZW5kIGl0IGxpbmUtYnktbGluZSBzb21lcGxhY2UgZWxzZS4gIFdlIG5lZWQgYSBvbmUtCisgKiBzY2FubGluZS1oaWdoIEpTQU1QTEUgYXJyYXkgYXMgYSB3b3JrIGJ1ZmZlciwgYW5kIHdlIHdpbGwgbGV0IHRoZSBKUEVHCisgKiBtZW1vcnkgbWFuYWdlciBhbGxvY2F0ZSBpdCBmb3IgdXMuICBUaGlzIGFwcHJvYWNoIGlzIGFjdHVhbGx5IHF1aXRlIHVzZWZ1bAorICogYmVjYXVzZSB3ZSBkb24ndCBuZWVkIHRvIHJlbWVtYmVyIHRvIGRlYWxsb2NhdGUgdGhlIGJ1ZmZlciBzZXBhcmF0ZWx5OiBpdAorICogd2lsbCBnbyBhd2F5IGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgSlBFRyBvYmplY3QgaXMgY2xlYW5lZCB1cC4KKyAqLworCisKKy8qCisgKiBFUlJPUiBIQU5ETElORzoKKyAqCisgKiBUaGUgSlBFRyBsaWJyYXJ5J3Mgc3RhbmRhcmQgZXJyb3IgaGFuZGxlciAoamVycm9yLmMpIGlzIGRpdmlkZWQgaW50bworICogc2V2ZXJhbCAibWV0aG9kcyIgd2hpY2ggeW91IGNhbiBvdmVycmlkZSBpbmRpdmlkdWFsbHkuICBUaGlzIGxldHMgeW91CisgKiBhZGp1c3QgdGhlIGJlaGF2aW9yIHdpdGhvdXQgZHVwbGljYXRpbmcgYSBsb3Qgb2YgY29kZSwgd2hpY2ggeW91IG1pZ2h0CisgKiBoYXZlIHRvIHVwZGF0ZSB3aXRoIGVhY2ggZnV0dXJlIHJlbGVhc2UuCisgKgorICogT3VyIGV4YW1wbGUgaGVyZSBzaG93cyBob3cgdG8gb3ZlcnJpZGUgdGhlICJlcnJvcl9leGl0IiBtZXRob2Qgc28gdGhhdAorICogY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgbGlicmFyeSdzIGNhbGxlciB3aGVuIGEgZmF0YWwgZXJyb3Igb2NjdXJzLAorICogcmF0aGVyIHRoYW4gY2FsbGluZyBleGl0KCkgYXMgdGhlIHN0YW5kYXJkIGVycm9yX2V4aXQgbWV0aG9kIGRvZXMuCisgKgorICogV2UgdXNlIEMncyBzZXRqbXAvbG9uZ2ptcCBmYWNpbGl0eSB0byByZXR1cm4gY29udHJvbC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAqIHJvdXRpbmUgd2hpY2ggY2FsbHMgdGhlIEpQRUcgbGlicmFyeSBtdXN0IGZpcnN0IGV4ZWN1dGUgYSBzZXRqbXAoKSBjYWxsIHRvCisgKiBlc3RhYmxpc2ggdGhlIHJldHVybiBwb2ludC4gIFdlIHdhbnQgdGhlIHJlcGxhY2VtZW50IGVycm9yX2V4aXQgdG8gZG8gYQorICogbG9uZ2ptcCgpLiAgQnV0IHdlIG5lZWQgdG8gbWFrZSB0aGUgc2V0am1wIGJ1ZmZlciBhY2Nlc3NpYmxlIHRvIHRoZQorICogZXJyb3JfZXhpdCByb3V0aW5lLiAgVG8gZG8gdGhpcywgd2UgbWFrZSBhIHByaXZhdGUgZXh0ZW5zaW9uIG9mIHRoZQorICogc3RhbmRhcmQgSlBFRyBlcnJvciBoYW5kbGVyIG9iamVjdC4gIChJZiB3ZSB3ZXJlIHVzaW5nIEMrKywgd2UnZCBzYXkgd2UKKyAqIHdlcmUgbWFraW5nIGEgc3ViY2xhc3Mgb2YgdGhlIHJlZ3VsYXIgZXJyb3IgaGFuZGxlci4pCisgKgorICogSGVyZSdzIHRoZSBleHRlbmRlZCBlcnJvciBoYW5kbGVyIHN0cnVjdDoKKyAqLworCitzdHJ1Y3QgbXlfZXJyb3JfbWdyIHsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIHB1YjsJLyogInB1YmxpYyIgZmllbGRzICovCisKKyAgam1wX2J1ZiBzZXRqbXBfYnVmZmVyOwkvKiBmb3IgcmV0dXJuIHRvIGNhbGxlciAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbXlfZXJyb3JfbWdyICogbXlfZXJyb3JfcHRyOworCisvKgorICogSGVyZSdzIHRoZSByb3V0aW5lIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzdGFuZGFyZCBlcnJvcl9leGl0IG1ldGhvZDoKKyAqLworCitNRVRIT0RERUYodm9pZCkKK215X2Vycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogY2luZm8tPmVyciByZWFsbHkgcG9pbnRzIHRvIGEgbXlfZXJyb3JfbWdyIHN0cnVjdCwgc28gY29lcmNlIHBvaW50ZXIgKi8KKyAgbXlfZXJyb3JfcHRyIG15ZXJyID0gKG15X2Vycm9yX3B0cikgY2luZm8tPmVycjsKKworICAvKiBBbHdheXMgZGlzcGxheSB0aGUgbWVzc2FnZS4gKi8KKyAgLyogV2UgY291bGQgcG9zdHBvbmUgdGhpcyB1bnRpbCBhZnRlciByZXR1cm5pbmcsIGlmIHdlIGNob3NlLiAqLworICAoKmNpbmZvLT5lcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOworCisgIC8qIFJldHVybiBjb250cm9sIHRvIHRoZSBzZXRqbXAgcG9pbnQgKi8KKyAgbG9uZ2ptcChteWVyci0+c2V0am1wX2J1ZmZlciwgMSk7Cit9CisKKworLyoKKyAqIFNhbXBsZSByb3V0aW5lIGZvciBKUEVHIGRlY29tcHJlc3Npb24uICBXZSBhc3N1bWUgdGhhdCB0aGUgc291cmNlIGZpbGUgbmFtZQorICogaXMgcGFzc2VkIGluLiAgV2Ugd2FudCB0byByZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yLgorICovCisKKworR0xPQkFMKGludCkKK3JlYWRfSlBFR19maWxlIChjaGFyICogZmlsZW5hbWUpCit7CisgIC8qIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgcG9pbnRlcnMgdG8KKyAgICogd29ya2luZyBzcGFjZSAod2hpY2ggaXMgYWxsb2NhdGVkIGFzIG5lZWRlZCBieSB0aGUgSlBFRyBsaWJyYXJ5KS4KKyAgICovCisgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOworICAvKiBXZSB1c2Ugb3VyIHByaXZhdGUgZXh0ZW5zaW9uIEpQRUcgZXJyb3IgaGFuZGxlci4KKyAgICogTm90ZSB0aGF0IHRoaXMgc3RydWN0IG11c3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBtYWluIEpQRUcgcGFyYW1ldGVyCisgICAqIHN0cnVjdCwgdG8gYXZvaWQgZGFuZ2xpbmctcG9pbnRlciBwcm9ibGVtcy4KKyAgICovCisgIHN0cnVjdCBteV9lcnJvcl9tZ3IgamVycjsKKyAgLyogTW9yZSBzdHVmZiAqLworICBGSUxFICogaW5maWxlOwkJLyogc291cmNlIGZpbGUgKi8KKyAgSlNBTVBBUlJBWSBidWZmZXI7CQkvKiBPdXRwdXQgcm93IGJ1ZmZlciAqLworICBpbnQgcm93X3N0cmlkZTsJCS8qIHBoeXNpY2FsIHJvdyB3aWR0aCBpbiBvdXRwdXQgYnVmZmVyICovCisKKyAgLyogSW4gdGhpcyBleGFtcGxlIHdlIHdhbnQgdG8gb3BlbiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSwKKyAgICogc28gdGhhdCB0aGUgc2V0am1wKCkgZXJyb3IgcmVjb3ZlcnkgYmVsb3cgY2FuIGFzc3VtZSB0aGUgZmlsZSBpcyBvcGVuLgorICAgKiBWRVJZIElNUE9SVEFOVDogdXNlICJiIiBvcHRpb24gdG8gZm9wZW4oKSBpZiB5b3UgYXJlIG9uIGEgbWFjaGluZSB0aGF0CisgICAqIHJlcXVpcmVzIGl0IGluIG9yZGVyIHRvIHJlYWQgYmluYXJ5IGZpbGVzLgorICAgKi8KKworICBpZiAoKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogU3RlcCAxOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0ICovCisKKyAgLyogV2Ugc2V0IHVwIHRoZSBub3JtYWwgSlBFRyBlcnJvciByb3V0aW5lcywgdGhlbiBvdmVycmlkZSBlcnJvcl9leGl0LiAqLworICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVyci5wdWIpOworICBqZXJyLnB1Yi5lcnJvcl9leGl0ID0gbXlfZXJyb3JfZXhpdDsKKyAgLyogRXN0YWJsaXNoIHRoZSBzZXRqbXAgcmV0dXJuIGNvbnRleHQgZm9yIG15X2Vycm9yX2V4aXQgdG8gdXNlLiAqLworICBpZiAoc2V0am1wKGplcnIuc2V0am1wX2J1ZmZlcikpIHsKKyAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIEpQRUcgY29kZSBoYXMgc2lnbmFsZWQgYW4gZXJyb3IuCisgICAgICogV2UgbmVlZCB0byBjbGVhbiB1cCB0aGUgSlBFRyBvYmplY3QsIGNsb3NlIHRoZSBpbnB1dCBmaWxlLCBhbmQgcmV0dXJuLgorICAgICAqLworICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CisgICAgZmNsb3NlKGluZmlsZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogTm93IHdlIGNhbiBpbml0aWFsaXplIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LiAqLworICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogU3RlcCAyOiBzcGVjaWZ5IGRhdGEgc291cmNlIChlZywgYSBmaWxlKSAqLworCisgIGpwZWdfc3RkaW9fc3JjKCZjaW5mbywgaW5maWxlKTsKKworICAvKiBTdGVwIDM6IHJlYWQgZmlsZSBwYXJhbWV0ZXJzIHdpdGgganBlZ19yZWFkX2hlYWRlcigpICovCisKKyAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKyAgLyogV2UgY2FuIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20ganBlZ19yZWFkX2hlYWRlciBzaW5jZQorICAgKiAgIChhKSBzdXNwZW5zaW9uIGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoZSBzdGRpbyBkYXRhIHNvdXJjZSwgYW5kCisgICAqICAgKGIpIHdlIHBhc3NlZCBUUlVFIHRvIHJlamVjdCBhIHRhYmxlcy1vbmx5IEpQRUcgZmlsZSBhcyBhbiBlcnJvci4KKyAgICogU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGluZm8uCisgICAqLworCisgIC8qIFN0ZXAgNDogc2V0IHBhcmFtZXRlcnMgZm9yIGRlY29tcHJlc3Npb24gKi8KKworICAvKiBJbiB0aGlzIGV4YW1wbGUsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueSBvZiB0aGUgZGVmYXVsdHMgc2V0IGJ5CisgICAqIGpwZWdfcmVhZF9oZWFkZXIoKSwgc28gd2UgZG8gbm90aGluZyBoZXJlLgorICAgKi8KKworICAvKiBTdGVwIDU6IFN0YXJ0IGRlY29tcHJlc3NvciAqLworCisgICh2b2lkKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgLyogV2UgY2FuIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIHN1c3BlbnNpb24gaXMgbm90IHBvc3NpYmxlCisgICAqIHdpdGggdGhlIHN0ZGlvIGRhdGEgc291cmNlLgorICAgKi8KKworICAvKiBXZSBtYXkgbmVlZCB0byBkbyBzb21lIHNldHVwIG9mIG91ciBvd24gYXQgdGhpcyBwb2ludCBiZWZvcmUgcmVhZGluZworICAgKiB0aGUgZGF0YS4gIEFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHdlIGhhdmUgdGhlIGNvcnJlY3Qgc2NhbGVkCisgICAqIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyB0aGUgb3V0cHV0IGNvbG9ybWFwCisgICAqIGlmIHdlIGFza2VkIGZvciBjb2xvciBxdWFudGl6YXRpb24uCisgICAqIEluIHRoaXMgZXhhbXBsZSwgd2UgbmVlZCB0byBtYWtlIGFuIG91dHB1dCB3b3JrIGJ1ZmZlciBvZiB0aGUgcmlnaHQgc2l6ZS4KKyAgICovIAorICAvKiBKU0FNUExFcyBwZXIgcm93IGluIG91dHB1dCBidWZmZXIgKi8KKyAgcm93X3N0cmlkZSA9IGNpbmZvLm91dHB1dF93aWR0aCAqIGNpbmZvLm91dHB1dF9jb21wb25lbnRzOworICAvKiBNYWtlIGEgb25lLXJvdy1oaWdoIHNhbXBsZSBhcnJheSB0aGF0IHdpbGwgZ28gYXdheSB3aGVuIGRvbmUgd2l0aCBpbWFnZSAqLworICBidWZmZXIgPSAoKmNpbmZvLm1lbS0+YWxsb2Nfc2FycmF5KQorCQkoKGpfY29tbW9uX3B0cikgJmNpbmZvLCBKUE9PTF9JTUFHRSwgcm93X3N0cmlkZSwgMSk7CisKKyAgLyogU3RlcCA2OiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkgKi8KKyAgLyogICAgICAgICAgIGpwZWdfcmVhZF9zY2FubGluZXMoLi4uKTsgKi8KKworICAvKiBIZXJlIHdlIHVzZSB0aGUgbGlicmFyeSdzIHN0YXRlIHZhcmlhYmxlIGNpbmZvLm91dHB1dF9zY2FubGluZSBhcyB0aGUKKyAgICogbG9vcCBjb3VudGVyLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8ga2VlcCB0cmFjayBvdXJzZWx2ZXMuCisgICAqLworICB3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkgeworICAgIC8qIGpwZWdfcmVhZF9zY2FubGluZXMgZXhwZWN0cyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMuCisgICAgICogSGVyZSB0aGUgYXJyYXkgaXMgb25seSBvbmUgZWxlbWVudCBsb25nLCBidXQgeW91IGNvdWxkIGFzayBmb3IKKyAgICAgKiBtb3JlIHRoYW4gb25lIHNjYW5saW5lIGF0IGEgdGltZSBpZiB0aGF0J3MgbW9yZSBjb252ZW5pZW50LgorICAgICAqLworICAgICh2b2lkKSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgYnVmZmVyLCAxKTsKKyAgICAvKiBBc3N1bWUgcHV0X3NjYW5saW5lX3NvbWVwbGFjZSB3YW50cyBhIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudC4gKi8KKyAgICBwdXRfc2NhbmxpbmVfc29tZXBsYWNlKGJ1ZmZlclswXSwgcm93X3N0cmlkZSk7CisgIH0KKworICAvKiBTdGVwIDc6IEZpbmlzaCBkZWNvbXByZXNzaW9uICovCisKKyAgKHZvaWQpIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgLyogV2UgY2FuIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIHN1c3BlbnNpb24gaXMgbm90IHBvc3NpYmxlCisgICAqIHdpdGggdGhlIHN0ZGlvIGRhdGEgc291cmNlLgorICAgKi8KKworICAvKiBTdGVwIDg6IFJlbGVhc2UgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCAqLworCisgIC8qIFRoaXMgaXMgYW4gaW1wb3J0YW50IHN0ZXAgc2luY2UgaXQgd2lsbCByZWxlYXNlIGEgZ29vZCBkZWFsIG9mIG1lbW9yeS4gKi8KKyAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKworICAvKiBBZnRlciBmaW5pc2hfZGVjb21wcmVzcywgd2UgY2FuIGNsb3NlIHRoZSBpbnB1dCBmaWxlLgorICAgKiBIZXJlIHdlIHBvc3Rwb25lIGl0IHVudGlsIGFmdGVyIG5vIG1vcmUgSlBFRyBlcnJvcnMgYXJlIHBvc3NpYmxlLAorICAgKiBzbyBhcyB0byBzaW1wbGlmeSB0aGUgc2V0am1wIGVycm9yIGxvZ2ljIGFib3ZlLiAgKEFjdHVhbGx5LCBJIGRvbid0CisgICAqIHRoaW5rIHRoYXQganBlZ19kZXN0cm95IGNhbiBkbyBhbiBlcnJvciBleGl0LCBidXQgd2h5IGFzc3VtZSBhbnl0aGluZy4uLikKKyAgICovCisgIGZjbG9zZShpbmZpbGUpOworCisgIC8qIEF0IHRoaXMgcG9pbnQgeW91IG1heSB3YW50IHRvIGNoZWNrIHRvIHNlZSB3aGV0aGVyIGFueSBjb3JydXB0LWRhdGEKKyAgICogd2FybmluZ3Mgb2NjdXJyZWQgKHRlc3Qgd2hldGhlciBqZXJyLnB1Yi5udW1fd2FybmluZ3MgaXMgbm9uemVybykuCisgICAqLworCisgIC8qIEFuZCB3ZSdyZSBkb25lISAqLworICByZXR1cm4gMTsKK30KKworCisvKgorICogU09NRSBGSU5FIFBPSU5UUzoKKyAqCisgKiBJbiB0aGUgYWJvdmUgY29kZSwgd2UgaWdub3JlZCB0aGUgcmV0dXJuIHZhbHVlIG9mIGpwZWdfcmVhZF9zY2FubGluZXMsCisgKiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhY3R1YWxseSByZWFkLiAgV2UgY291bGQgZ2V0IGF3YXkgd2l0aAorICogdGhpcyBiZWNhdXNlIHdlIGFza2VkIGZvciBvbmx5IG9uZSBsaW5lIGF0IGEgdGltZSBhbmQgd2Ugd2VyZW4ndCB1c2luZworICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLiAgU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGluZm8uCisgKgorICogV2UgY2hlYXRlZCBhIGJpdCBieSBjYWxsaW5nIGFsbG9jX3NhcnJheSgpIGFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpOworICogd2Ugc2hvdWxkIGhhdmUgZG9uZSBpdCBiZWZvcmVoYW5kIHRvIGVuc3VyZSB0aGF0IHRoZSBzcGFjZSB3b3VsZCBiZQorICogY291bnRlZCBhZ2FpbnN0IHRoZSBKUEVHIG1heF9tZW1vcnkgc2V0dGluZy4gIEluIHNvbWUgc3lzdGVtcyB0aGUgYWJvdmUKKyAqIGNvZGUgd291bGQgcmlzayBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLiAgSG93ZXZlciwgaW4gZ2VuZXJhbCB3ZSBkb24ndAorICoga25vdyB0aGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYmVmb3JlIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLCB1bmxlc3Mgd2UKKyAqIGNhbGwganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkuICBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgYWJvdXQgdGhpcy4KKyAqCisgKiBTY2FubGluZXMgYXJlIHJldHVybmVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBKUEVHIGZpbGUsCisgKiB3aGljaCBpcyBzdGFuZGFyZGx5IHRvcC10by1ib3R0b20uICBJZiB5b3UgbXVzdCBlbWl0IGRhdGEgYm90dG9tLXRvLXRvcCwKKyAqIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgdmlydHVhbCBhcnJheXMgcHJvdmlkZWQgYnkgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIKKyAqIHRvIGludmVydCB0aGUgZGF0YS4gIFNlZSB3cmJtcC5jIGZvciBhbiBleGFtcGxlLgorICoKKyAqIEFzIHdpdGggY29tcHJlc3Npb24sIHNvbWUgb3BlcmF0aW5nIG1vZGVzIG1heSByZXF1aXJlIHRlbXBvcmFyeSBmaWxlcy4KKyAqIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQKKyAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLmRvYy4KKyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9maWxlbGlzdC5kb2MgYi9qcGVnL2ZpbGVsaXN0LmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ5ODJjCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9maWxlbGlzdC5kb2MKQEAgLTAsMCArMSwyMTAgQEAKK0lKRyBKUEVHIExJQlJBUlk6ICBGSUxFIExJU1QKKworQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KK0ZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKworCitIZXJlIGlzIGEgcm9hZCBtYXAgdG8gdGhlIGZpbGVzIGluIHRoZSBJSkcgSlBFRyBkaXN0cmlidXRpb24uICBUaGUKK2Rpc3RyaWJ1dGlvbiBpbmNsdWRlcyB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwgcGx1cyB0d28gYXBwbGljYXRpb24KK3Byb2dyYW1zICgiY2pwZWciIGFuZCAiZGpwZWciKSB3aGljaCB1c2UgdGhlIGxpYnJhcnkgdG8gY29udmVydCBKUEVHCitmaWxlcyB0byBhbmQgZnJvbSBzb21lIG90aGVyIHBvcHVsYXIgaW1hZ2UgZm9ybWF0cy4gIEEgdGhpcmQgYXBwbGljYXRpb24KKyJqcGVndHJhbiIgdXNlcyB0aGUgbGlicmFyeSB0byBkbyBsb3NzbGVzcyBjb252ZXJzaW9uIGJldHdlZW4gZGlmZmVyZW50Cit2YXJpYW50cyBvZiBKUEVHLiAgVGhlcmUgYXJlIGFsc28gdHdvIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9ucywKKyJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIuCisKKworVEhFIEpQRUcgTElCUkFSWQorPT09PT09PT09PT09PT09PQorCitJbmNsdWRlIGZpbGVzOgorCitqcGVnbGliLmgJSlBFRyBsaWJyYXJ5J3MgZXhwb3J0ZWQgZGF0YSBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgoramNvbmZpZy5oCUNvbmZpZ3VyYXRpb24gZGVjbGFyYXRpb25zLiAgTm90ZTogdGhpcyBmaWxlIGlzIG5vdCBwcmVzZW50CisJCWluIHRoZSBkaXN0cmlidXRpb247IGl0IGlzIGdlbmVyYXRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uLgoram1vcmVjZmcuaAlBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZGVjbGFyYXRpb25zOyBuZWVkIG5vdCBiZSBjaGFuZ2VkCisJCWZvciBhIHN0YW5kYXJkIGluc3RhbGxhdGlvbi4KK2plcnJvci5oCURlY2xhcmVzIEpQRUcgbGlicmFyeSdzIGVycm9yIGFuZCB0cmFjZSBtZXNzYWdlIGNvZGVzLgoramluY2x1ZGUuaAlDZW50cmFsIGluY2x1ZGUgZmlsZSB1c2VkIGJ5IGFsbCBJSkcgLmMgZmlsZXMgdG8gcmVmZXJlbmNlCisJCXN5c3RlbSBpbmNsdWRlIGZpbGVzLgoranBlZ2ludC5oCUpQRUcgbGlicmFyeSdzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KK2pjaHVmZi5oCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVuY29kZXIgbW9kdWxlcy4KK2pkaHVmZi5oCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGRlY29kZXIgbW9kdWxlcy4KK2pkY3QuaAkJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIGZvcndhcmQgJiByZXZlcnNlIERDVCBzdWJzeXN0ZW1zLgoram1lbXN5cy5oCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uCitqdmVyc2lvbi5oCVZlcnNpb24gaW5mb3JtYXRpb24uCisKK0FwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGQgaW5jbHVkZSBqcGVnbGliLmggKHdoaWNoIGluIHR1cm4KK2luY2x1ZGVzIGpjb25maWcuaCBhbmQgam1vcmVjZmcuaCkuICBPcHRpb25hbGx5LCBqZXJyb3IuaCBtYXkgYmUgaW5jbHVkZWQKK2lmIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWZlcmVuY2UgaW5kaXZpZHVhbCBKUEVHIGVycm9yIGNvZGVzLiAgVGhlCitvdGhlciBpbmNsdWRlIGZpbGVzIGFyZSBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIGFuZCB3b3VsZCBub3Qgbm9ybWFsbHkKK2JlIGluY2x1ZGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0uICAoY2pwZWcvZGpwZWcvZXRjIGRvIHVzZSBqaW5jbHVkZS5oLAorc2luY2UgaXRzIGZ1bmN0aW9uIGlzIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgb2YgdGhlIHdob2xlIElKRyBkaXN0cmlidXRpb24uCitNb3N0IG90aGVyIGFwcGxpY2F0aW9ucyB3aWxsIGRpcmVjdGx5IGluY2x1ZGUgdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHRoZXkKK3dhbnQsIGFuZCBoZW5jZSB3b24ndCBuZWVkIGppbmNsdWRlLmguKQorCisKK0Mgc291cmNlIGNvZGUgZmlsZXM6CisKK1RoZXNlIGZpbGVzIGNvbnRhaW4gbW9zdCBvZiB0aGUgZnVuY3Rpb25zIGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBieQorYW4gYXBwbGljYXRpb24gcHJvZ3JhbToKKworamNhcGltaW4uYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZTogY29yZSByb3V0aW5lcyBmb3IgY29tcHJlc3Npb24uCitqY2FwaXN0ZC5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBzdGFuZGFyZCBjb21wcmVzc2lvbi4KK2pkYXBpbWluLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IGNvcmUgcm91dGluZXMgZm9yIGRlY29tcHJlc3Npb24uCitqZGFwaXN0ZC5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBzdGFuZGFyZCBkZWNvbXByZXNzaW9uLgoramNvbWFwaS5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlIHJvdXRpbmVzIGNvbW1vbiB0byBjb21wcmVzc2lvbgorCQlhbmQgZGVjb21wcmVzc2lvbi4KK2pjcGFyYW0uYwlDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2V0dGluZyBoZWxwZXIgcm91dGluZXMuCitqY3RyYW5zLmMJQVBJIGFuZCBsaWJyYXJ5IHJvdXRpbmVzIGZvciB0cmFuc2NvZGluZyBjb21wcmVzc2lvbi4KK2pkdHJhbnMuYwlBUEkgYW5kIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGRlY29tcHJlc3Npb24uCisKK0NvbXByZXNzaW9uIHNpZGUgb2YgdGhlIGxpYnJhcnk6CisKK2pjaW5pdC5jCUluaXRpYWxpemF0aW9uOiBkZXRlcm1pbmVzIHdoaWNoIG90aGVyIG1vZHVsZXMgdG8gdXNlLgoramNtYXN0ZXIuYwlNYXN0ZXIgY29udHJvbDogc2V0dXAgYW5kIGludGVyLXBhc3Mgc2VxdWVuY2luZyBsb2dpYy4KK2pjbWFpbmN0LmMJTWFpbiBidWZmZXIgY29udHJvbGxlciAocHJlcHJvY2Vzc29yID0+IEpQRUcgY29tcHJlc3NvcikuCitqY3ByZXBjdC5jCVByZXByb2Nlc3NvciBidWZmZXIgY29udHJvbGxlci4KK2pjY29lZmN0LmMJQnVmZmVyIGNvbnRyb2xsZXIgZm9yIERDVCBjb2VmZmljaWVudCBidWZmZXIuCitqY2NvbG9yLmMJQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KK2pjc2FtcGxlLmMJRG93bnNhbXBsaW5nLgoramNkY3RtZ3IuYwlEQ1QgbWFuYWdlciAoRENUIGltcGxlbWVudGF0aW9uIHNlbGVjdGlvbiAmIGNvbnRyb2wpLgoramZkY3RpbnQuYwlGb3J3YXJkIERDVCB1c2luZyBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KK2pmZGN0ZnN0LmMJRm9yd2FyZCBEQ1QgdXNpbmcgZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgoramZkY3RmbHQuYwlGb3J3YXJkIERDVCB1c2luZyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgoramNodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGNvZGluZyBmb3Igc2VxdWVudGlhbCBKUEVHLgoramNwaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBjb2RpbmcgZm9yIHByb2dyZXNzaXZlIEpQRUcuCitqY21hcmtlci5jCUpQRUcgbWFya2VyIHdyaXRpbmcuCitqZGF0YWRzdC5jCURhdGEgZGVzdGluYXRpb24gbWFuYWdlciBmb3Igc3RkaW8gb3V0cHV0LgorCitEZWNvbXByZXNzaW9uIHNpZGUgb2YgdGhlIGxpYnJhcnk6CisKK2pkbWFzdGVyLmMJTWFzdGVyIGNvbnRyb2w6IGRldGVybWluZXMgd2hpY2ggb3RoZXIgbW9kdWxlcyB0byB1c2UuCitqZGlucHV0LmMJSW5wdXQgY29udHJvbGxlcjogY29udHJvbHMgaW5wdXQgcHJvY2Vzc2luZyBtb2R1bGVzLgoramRtYWluY3QuYwlNYWluIGJ1ZmZlciBjb250cm9sbGVyIChKUEVHIGRlY29tcHJlc3NvciA9PiBwb3N0cHJvY2Vzc29yKS4KK2pkY29lZmN0LmMJQnVmZmVyIGNvbnRyb2xsZXIgZm9yIERDVCBjb2VmZmljaWVudCBidWZmZXIuCitqZHBvc3RjdC5jCVBvc3Rwcm9jZXNzb3IgYnVmZmVyIGNvbnRyb2xsZXIuCitqZG1hcmtlci5jCUpQRUcgbWFya2VyIHJlYWRpbmcuCitqZGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcgZm9yIHNlcXVlbnRpYWwgSlBFRy4KK2pkcGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcgZm9yIHByb2dyZXNzaXZlIEpQRUcuCitqZGRjdG1nci5jCUlEQ1QgbWFuYWdlciAoSURDVCBpbXBsZW1lbnRhdGlvbiBzZWxlY3Rpb24gJiBjb250cm9sKS4KK2ppZGN0aW50LmMJSW52ZXJzZSBEQ1QgdXNpbmcgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCitqaWRjdGZzdC5jCUludmVyc2UgRENUIHVzaW5nIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KK2ppZGN0Zmx0LmMJSW52ZXJzZSBEQ1QgdXNpbmcgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4KK2ppZGN0cmVkLmMJSW52ZXJzZSBEQ1RzIHdpdGggcmVkdWNlZC1zaXplIG91dHB1dHMuCitqZHNhbXBsZS5jCVVwc2FtcGxpbmcuCitqZGNvbG9yLmMJQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KK2pkbWVyZ2UuYwlNZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uIChmYXN0ZXIsIGxvd2VyIHF1YWxpdHkpLgoranF1YW50MS5jCU9uZS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiB1c2luZyBhIGZpeGVkLXNwYWNpbmcgY29sb3JtYXAuCitqcXVhbnQyLmMJVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIHVzaW5nIGEgY3VzdG9tLWdlbmVyYXRlZCBjb2xvcm1hcC4KKwkJQWxzbyBoYW5kbGVzIG9uZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBleHRlcm5hbGx5IGdpdmVuIG1hcC4KK2pkYXRhc3JjLmMJRGF0YSBzb3VyY2UgbWFuYWdlciBmb3Igc3RkaW8gaW5wdXQuCisKK1N1cHBvcnQgZmlsZXMgZm9yIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb246CisKK2plcnJvci5jCVN0YW5kYXJkIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIChhcHBsaWNhdGlvbiByZXBsYWNlYWJsZSkuCitqbWVtbWdyLmMJU3lzdGVtLWluZGVwZW5kZW50IChtb3JlIG9yIGxlc3MpIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuCitqdXRpbHMuYwlNaXNjZWxsYW5lb3VzIHV0aWxpdHkgcm91dGluZXMuCisKK2ptZW1tZ3IuYyByZWxpZXMgb24gYSBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VtZW50IG1vZHVsZS4gIFRoZSBJSkcKK2Rpc3RyaWJ1dGlvbiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudAorbW9kdWxlOgorCitqbWVtbm9icy5jCSJObyBiYWNraW5nIHN0b3JlIjogYXNzdW1lcyBhZGVxdWF0ZSB2aXJ0dWFsIG1lbW9yeSBleGlzdHMuCitqbWVtYW5zaS5jCU1ha2VzIHRlbXBvcmFyeSBmaWxlcyB3aXRoIEFOU0ktc3RhbmRhcmQgcm91dGluZSB0bXBmaWxlKCkuCitqbWVtbmFtZS5jCU1ha2VzIHRlbXBvcmFyeSBmaWxlcyB3aXRoIHByb2dyYW0tZ2VuZXJhdGVkIGZpbGUgbmFtZXMuCitqbWVtZG9zLmMJQ3VzdG9tIGltcGxlbWVudGF0aW9uIGZvciBNUy1ET1MgKDE2LWJpdCBlbnZpcm9ubWVudCBvbmx5KToKKwkJY2FuIHVzZSBleHRlbmRlZCBhbmQgZXhwYW5kZWQgbWVtb3J5IGFzIHdlbGwgYXMgdGVtcCBmaWxlcy4KK2ptZW1tYWMuYwlDdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIEFwcGxlIE1hY2ludG9zaC4KKworRXhhY3RseSBvbmUgb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQgbW9kdWxlcyBzaG91bGQgYmUgY29uZmlndXJlZCBpbnRvIGFuCitpbnN0YWxsZWQgSlBFRyBsaWJyYXJ5IChzZWUgaW5zdGFsbC5kb2MgZm9yIGhpbnRzIGFib3V0IHdoaWNoIG9uZSB0byB1c2UpLgorT24gdW51c3VhbCBzeXN0ZW1zIHlvdSBtYXkgZmluZCBpdCB3b3J0aHdoaWxlIHRvIG1ha2UgYSBzcGVjaWFsCitzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VyLgorCisKK05vbi1DIHNvdXJjZSBjb2RlIGZpbGVzOgorCitqbWVtZG9zYS5hc20JODB4ODYgYXNzZW1ibHkgY29kZSBzdXBwb3J0IGZvciBqbWVtZG9zLmM7IHVzZWQgb25seSBpbgorCQlNUy1ET1Mtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgb2YgdGhlIEpQRUcgbGlicmFyeS4KKworCitDSlBFRy9ESlBFRy9KUEVHVFJBTgorPT09PT09PT09PT09PT09PT09PT0KKworSW5jbHVkZSBmaWxlczoKKworY2RqcGVnLmgJRGVjbGFyYXRpb25zIHNoYXJlZCBieSBjanBlZy9kanBlZy9qcGVndHJhbiBtb2R1bGVzLgorY2RlcnJvci5oCUFkZGl0aW9uYWwgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2UgY29kZXMgZm9yIGNqcGVnIGV0IGFsLgordHJhbnN1cHAuaAlEZWNsYXJhdGlvbnMgZm9yIGpwZWd0cmFuIHN1cHBvcnQgcm91dGluZXMgaW4gdHJhbnN1cHAuYy4KKworQyBzb3VyY2UgY29kZSBmaWxlczoKKworY2pwZWcuYwkJTWFpbiBwcm9ncmFtIGZvciBjanBlZy4KK2RqcGVnLmMJCU1haW4gcHJvZ3JhbSBmb3IgZGpwZWcuCitqcGVndHJhbi5jCU1haW4gcHJvZ3JhbSBmb3IganBlZ3RyYW4uCitjZGpwZWcuYwlVdGlsaXR5IHJvdXRpbmVzIHVzZWQgYnkgYWxsIHRocmVlIHByb2dyYW1zLgorcmRjb2xtYXAuYwlDb2RlIHRvIHJlYWQgYSBjb2xvcm1hcCBmaWxlIGZvciBkanBlZydzICItbWFwIiBzd2l0Y2guCityZHN3aXRjaC5jCUNvZGUgdG8gcHJvY2VzcyBzb21lIG9mIGNqcGVnJ3MgbW9yZSBjb21wbGV4IHN3aXRjaGVzLgorCQlBbHNvIHVzZWQgYnkganBlZ3RyYW4uCit0cmFuc3VwcC5jCVN1cHBvcnQgY29kZSBmb3IganBlZ3RyYW46IGxvc3NsZXNzIGltYWdlIG1hbmlwdWxhdGlvbnMuCisKK0ltYWdlIGZpbGUgcmVhZGVyIG1vZHVsZXMgZm9yIGNqcGVnOgorCityZGJtcC5jCQlCTVAgZmlsZSBpbnB1dC4KK3JkZ2lmLmMJCUdJRiBmaWxlIGlucHV0IChub3cganVzdCBhIHN0dWIpLgorcmRwcG0uYwkJUFBNL1BHTSBmaWxlIGlucHV0LgorcmRybGUuYwkJVXRhaCBSTEUgZmlsZSBpbnB1dC4KK3JkdGFyZ2EuYwlUYXJnYSBmaWxlIGlucHV0LgorCitJbWFnZSBmaWxlIHdyaXRlciBtb2R1bGVzIGZvciBkanBlZzoKKword3JibXAuYwkJQk1QIGZpbGUgb3V0cHV0Lgord3JnaWYuYwkJR0lGIGZpbGUgb3V0cHV0IChhIG1lcmUgc2hhZG93IG9mIGl0cyBmb3JtZXIgc2VsZikuCit3cnBwbS5jCQlQUE0vUEdNIGZpbGUgb3V0cHV0Lgord3JybGUuYwkJVXRhaCBSTEUgZmlsZSBvdXRwdXQuCit3cnRhcmdhLmMJVGFyZ2EgZmlsZSBvdXRwdXQuCisKKworUkRKUEdDT00vV1JKUEdDT00KKz09PT09PT09PT09PT09PT09CisKK0Mgc291cmNlIGNvZGUgZmlsZXM6CisKK3JkanBnY29tLmMJU3RhbmQtYWxvbmUgcmRqcGdjb20gYXBwbGljYXRpb24uCit3cmpwZ2NvbS5jCVN0YW5kLWFsb25lIHdyanBnY29tIGFwcGxpY2F0aW9uLgorCitUaGVzZSBwcm9ncmFtcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBJSkcgbGlicmFyeS4gIFRoZXkgZG8gdXNlCitqY29uZmlnLmggYW5kIGppbmNsdWRlLmgsIG9ubHkgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eS4KKworCitBRERJVElPTkFMIEZJTEVTCis9PT09PT09PT09PT09PT09CisKK0RvY3VtZW50YXRpb24gKHNlZSBSRUFETUUgZm9yIGEgZ3VpZGUgdG8gdGhlIGRvY3VtZW50YXRpb24gZmlsZXMpOgorCitSRUFETUUJCU1hc3RlciBkb2N1bWVudGF0aW9uIGZpbGUuCisqLmRvYwkJT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcy4KKyouMQkJRG9jdW1lbnRhdGlvbiBpbiBVbml4IG1hbiBwYWdlIGZvcm1hdC4KK2NoYW5nZS5sb2cJVmVyc2lvbi10by12ZXJzaW9uIGNoYW5nZSBoaWdobGlnaHRzLgorZXhhbXBsZS5jCVNhbXBsZSBjb2RlIGZvciBjYWxsaW5nIEpQRUcgbGlicmFyeS4KKworQ29uZmlndXJhdGlvbi9pbnN0YWxsYXRpb24gZmlsZXMgYW5kIHByb2dyYW1zIChzZWUgaW5zdGFsbC5kb2MgZm9yIG1vcmUgaW5mbyk6CisKK2NvbmZpZ3VyZQlVbml4IHNoZWxsIHNjcmlwdCB0byBwZXJmb3JtIGF1dG9tYXRpYyBjb25maWd1cmF0aW9uLgorbHRjb25maWcJU3VwcG9ydCBzY3JpcHRzIGZvciBjb25maWd1cmUgKGZyb20gR05VIGxpYnRvb2wpLgorbHRtYWluLnNoCitjb25maWcuZ3Vlc3MKK2NvbmZpZy5zdWIKK2luc3RhbGwtc2gJSW5zdGFsbCBzaGVsbCBzY3JpcHQgZm9yIHRob3NlIFVuaXggc3lzdGVtcyBsYWNraW5nIG9uZS4KK2NrY29uZmlnLmMJUHJvZ3JhbSB0byBnZW5lcmF0ZSBqY29uZmlnLmggb24gbm9uLVVuaXggc3lzdGVtcy4KK2pjb25maWcuZG9jCVRlbXBsYXRlIGZvciBtYWtpbmcgamNvbmZpZy5oIGJ5IGhhbmQuCittYWtlZmlsZS4qCVNhbXBsZSBtYWtlZmlsZXMgZm9yIHBhcnRpY3VsYXIgc3lzdGVtcy4KK2pjb25maWcuKglTYW1wbGUgamNvbmZpZy5oIGZvciBwYXJ0aWN1bGFyIHN5c3RlbXMuCithbnNpMmtuci5jCURlLUFOU0lmaWVyIGZvciBwcmUtQU5TSSBDIGNvbXBpbGVycyAoY291cnRlc3kgb2YKKwkJTC4gUGV0ZXIgRGV1dHNjaCBhbmQgQWxhZGRpbiBFbnRlcnByaXNlcykuCisKK1Rlc3QgZmlsZXMgKHNlZSBpbnN0YWxsLmRvYyBmb3IgdGVzdCBwcm9jZWR1cmUpOgorCit0ZXN0Ki4qCQlTb3VyY2UgYW5kIGNvbXBhcmlzb24gZmlsZXMgZm9yIGNvbmZpZGVuY2UgdGVzdC4KKwkJVGhlc2UgYXJlIGJpbmFyeSBpbWFnZSBmaWxlcywgTk9UIHRleHQgZmlsZXMuCmRpZmYgLS1naXQgYS9qcGVnL2luc3RhbGwtc2ggYi9qcGVnL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTg0MzY2OQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvaW5zdGFsbC1zaApAQCAtMCwwICsxLDI1MCBAQAorIyEvYmluL3NoCisjCisjIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQorIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCisjCisjIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KKyMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCisKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKwordHJhbnNmb3JtYmFzZW5hbWU9IiIKK3RyYW5zZm9ybV9hcmc9IiIKK2luc3RjbWQ9IiRtdnByb2ciCitjaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgorY2hvd25jbWQ9IiIKK2NoZ3JwY21kPSIiCitzdHJpcGNtZD0iIgorcm1jbWQ9IiRybXByb2cgLWYiCittdmNtZD0iJG12cHJvZyIKK3NyYz0iIgorZHN0PSIiCitkaXJfYXJnPSIiCisKK3doaWxlIFsgeCIkMSIgIT0geCBdOyBkbworICAgIGNhc2UgJDEgaW4KKwktYykgaW5zdGNtZD0iJGNwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWQpIGRpcl9hcmc9dHJ1ZQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJKikgIGlmIFsgeCIkc3JjIiA9IHggXQorCSAgICB0aGVuCisJCXNyYz0kMQorCSAgICBlbHNlCisJCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZworCQk6CisJCWRzdD0kMQorCSAgICBmaQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisgICAgZXNhYworZG9uZQorCitpZiBbIHgiJHNyYyIgPSB4IF0KK3RoZW4KKwllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKKwlleGl0IDEKK2Vsc2UKKwl0cnVlCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgorCWRzdD0kc3JjCisJc3JjPSIiCisJCisJaWYgWyAtZCAkZHN0IF07IHRoZW4KKwkJaW5zdGNtZD06CisJZWxzZQorCQlpbnN0Y21kPW1rZGlyCisJZmkKK2Vsc2UKKworIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisjIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAorIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCisKKwlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCisJdGhlbgorCQl0cnVlCisJZWxzZQorCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKKwkJZXhpdCAxCisJZmkKKwkKKwlpZiBbIHgiJGRzdCIgPSB4IF0KKwl0aGVuCisJCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKKwkJZXhpdCAxCisJZWxzZQorCQl0cnVlCisJZmkKKworIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KKyMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYworCisJaWYgWyAtZCAkZHN0IF0KKwl0aGVuCisJCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCisJZWxzZQorCQl0cnVlCisJZmkKK2ZpCisKKyMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAorZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgorIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0CisKKyMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCitpZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KK2RlZmF1bHRJRlM9JwkKKycKK0lGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCisKK29JRlM9IiR7SUZTfSIKKyMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCitJRlM9JyUnCitzZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKK0lGUz0iJHtvSUZTfSIKKworcGF0aGNvbXA9JycKKword2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KKwlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgorCXNoaWZ0CisKKwlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKKyAgICAgICAgdGhlbgorCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKKwllbHNlCisJCXRydWUKKwlmaQorCisJcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKK2RvbmUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdCit0aGVuCisJJGRvaXQgJGluc3RjbWQgJGRzdCAmJgorCisJaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQorZWxzZQorCisjIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KKworCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAorCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCisJZmkKKworIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCisKKwlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCXRydWUKKwlmaQorCisjIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKworCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIworCisjIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKKworCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgorCisJdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCisKKyMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cworCisjIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCisjIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKKyMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCisjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisKKwkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgorCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCisKK2ZpICYmCisKKworZXhpdCAwCmRpZmYgLS1naXQgYS9qcGVnL2luc3RhbGwuZG9jIGIvanBlZy9pbnN0YWxsLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzAyYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9pbnN0YWxsLmRvYwpAQCAtMCwwICsxLDEwNjMgQEAKK0lOU1RBTExBVElPTiBJTlNUUlVDVElPTlMgZm9yIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQorCitDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorCisKK1RoaXMgZmlsZSBleHBsYWlucyBob3cgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUuICBXZSBoYXZlCit0cmllZCB0byBtYWtlIHRoaXMgc29mdHdhcmUgZXh0cmVtZWx5IHBvcnRhYmxlIGFuZCBmbGV4aWJsZSwgc28gdGhhdCBpdCBjYW4gYmUKK2FkYXB0ZWQgdG8gYWxtb3N0IGFueSBlbnZpcm9ubWVudC4gIFRoZSBkb3duc2lkZSBvZiB0aGlzIGRlY2lzaW9uIGlzIHRoYXQgdGhlCitpbnN0YWxsYXRpb24gcHJvY2VzcyBpcyBjb21wbGljYXRlZC4gIFdlIGhhdmUgcHJvdmlkZWQgc2hvcnRjdXRzIHRvIHNpbXBsaWZ5Cit0aGUgdGFzayBvbiBjb21tb24gc3lzdGVtcy4gIEJ1dCBpbiBhbnkgY2FzZSwgeW91IHdpbGwgbmVlZCBhdCBsZWFzdCBhIGxpdHRsZQorZmFtaWxpYXJpdHkgd2l0aCBDIHByb2dyYW1taW5nIGFuZCBwcm9ncmFtIGJ1aWxkIHByb2NlZHVyZXMgZm9yIHlvdXIgc3lzdGVtLgorCitJZiB5b3UgYXJlIG9ubHkgdXNpbmcgdGhpcyBzb2Z0d2FyZSBhcyBwYXJ0IG9mIGEgbGFyZ2VyIHByb2dyYW0sIHRoZSBsYXJnZXIKK3Byb2dyYW0ncyBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIG1heSB0YWtlIGNhcmUgb2YgY29uZmlndXJpbmcgdGhlIElKRyBjb2RlLgorRm9yIGV4YW1wbGUsIEdob3N0c2NyaXB0J3MgaW5zdGFsbGF0aW9uIHNjcmlwdCB3aWxsIGNvbmZpZ3VyZSB0aGUgSUpHIGNvZGUuCitZb3UgZG9uJ3QgbmVlZCB0byByZWFkIHRoaXMgZmlsZSBpZiB5b3UganVzdCB3YW50IHRvIGNvbXBpbGUgR2hvc3RzY3JpcHQuCisKK0lmIHlvdSBhcmUgb24gYSBVbml4IG1hY2hpbmUsIHlvdSBtYXkgbm90IG5lZWQgdG8gcmVhZCB0aGlzIGZpbGUgYXQgYWxsLgorVHJ5IGRvaW5nCisJLi9jb25maWd1cmUKKwltYWtlCisJbWFrZSB0ZXN0CitJZiB0aGF0IGRvZXNuJ3QgY29tcGxhaW4sIGRvCisJbWFrZSBpbnN0YWxsCisoYmV0dGVyIGRvICJtYWtlIC1uIGluc3RhbGwiIGZpcnN0IHRvIHNlZSBpZiB0aGUgbWFrZWZpbGUgd2lsbCBwdXQgdGhlIGZpbGVzCit3aGVyZSB5b3Ugd2FudCB0aGVtKS4gIFJlYWQgZnVydGhlciBpZiB5b3UgcnVuIGludG8gc25hZ3Mgb3Igd2FudCB0byBjdXN0b21pemUKK3RoZSBjb2RlIGZvciB5b3VyIHN5c3RlbS4KKworCitUQUJMRSBPRiBDT05URU5UUworLS0tLS0tLS0tLS0tLS0tLS0KKworQmVmb3JlIHlvdSBzdGFydAorQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlOgorCXVzaW5nIHRoZSBhdXRvbWF0aWMgImNvbmZpZ3VyZSIgc2NyaXB0CisJdXNpbmcgb25lIG9mIHRoZSBzdXBwbGllZCBqY29uZmlnIGFuZCBtYWtlZmlsZSBmaWxlcworCWJ5IGhhbmQKK0J1aWxkaW5nIHRoZSBzb2Z0d2FyZQorVGVzdGluZyB0aGUgc29mdHdhcmUKK0luc3RhbGxpbmcgdGhlIHNvZnR3YXJlCitPcHRpb25hbCBzdHVmZgorT3B0aW1pemF0aW9uCitIaW50cyBmb3Igc3BlY2lmaWMgc3lzdGVtcworCisKK0JFRk9SRSBZT1UgU1RBUlQKKz09PT09PT09PT09PT09PT0KKworQmVmb3JlIGluc3RhbGxpbmcgdGhlIHNvZnR3YXJlIHlvdSBtdXN0IHVucGFjayB0aGUgZGlzdHJpYnV0ZWQgc291cmNlIGNvZGUuCitTaW5jZSB5b3UgYXJlIHJlYWRpbmcgdGhpcyBmaWxlLCB5b3UgaGF2ZSBwcm9iYWJseSBhbHJlYWR5IHN1Y2NlZWRlZCBpbiB0aGlzCit0YXNrLiAgSG93ZXZlciwgdGhlcmUgaXMgYSBwb3RlbnRpYWwgZm9yIGVycm9yIGlmIHlvdSBuZWVkZWQgdG8gY29udmVydCB0aGUKK2ZpbGVzIHRvIHRoZSBsb2NhbCBzdGFuZGFyZCB0ZXh0IGZpbGUgZm9ybWF0IChmb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBvbgorTVMtRE9TIHlvdSBtYXkgaGF2ZSBjb252ZXJ0ZWQgTEYgZW5kLW9mLWxpbmUgdG8gQ1IvTEYpLiAgWW91IG11c3QgYXBwbHkKK3N1Y2ggY29udmVyc2lvbiB0byBhbGwgdGhlIGZpbGVzIEVYQ0VQVCB0aG9zZSB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICJ0ZXN0Ii4KK1RoZSB0ZXN0IGZpbGVzIGNvbnRhaW4gYmluYXJ5IGRhdGE7IGlmIHlvdSBjaGFuZ2UgdGhlbSBpbiBhbnkgd2F5IHRoZW4gdGhlCitzZWxmLXRlc3Qgd2lsbCBnaXZlIGJhZCByZXN1bHRzLgorCitQbGVhc2UgY2hlY2sgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGlzIGZpbGUgdG8gc2VlIGlmIHRoZXJlIGFyZSBoaW50cyBmb3IgdGhlCitzcGVjaWZpYyBtYWNoaW5lIG9yIGNvbXBpbGVyIHlvdSBhcmUgdXNpbmcuCisKKworQ09ORklHVVJJTkcgVEhFIFNPRlRXQVJFCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworVG8gY29uZmlndXJlIHRoZSBJSkcgY29kZSBmb3IgeW91ciBzeXN0ZW0sIHlvdSBuZWVkIHRvIGNyZWF0ZSB0d28gZmlsZXM6CisgICogamNvbmZpZy5oOiBjb250YWlucyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgI2RlZmluZSBzeW1ib2xzLgorICAqIE1ha2VmaWxlOiBjb250cm9scyB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4KKyhPbiBhIG5vbi1Vbml4IG1hY2hpbmUsIHlvdSBtYXkgY3JlYXRlICJwcm9qZWN0IGZpbGVzIiBvciBzb21lIG90aGVyCitzdWJzdGl0dXRlIGZvciBhIE1ha2VmaWxlLiAgamNvbmZpZy5oIGlzIG5lZWRlZCBpbiBhbnkgZW52aXJvbm1lbnQuKQorCitXZSBwcm92aWRlIHRocmVlIGRpZmZlcmVudCB3YXlzIHRvIGdlbmVyYXRlIHRoZXNlIGZpbGVzOgorICAqIE9uIGEgVW5peCBzeXN0ZW0sIHlvdSBjYW4ganVzdCBydW4gdGhlICJjb25maWd1cmUiIHNjcmlwdC4KKyAgKiBXZSBwcm92aWRlIHNhbXBsZSBqY29uZmlnIGZpbGVzIGFuZCBtYWtlZmlsZXMgZm9yIHBvcHVsYXIgbWFjaGluZXM7CisgICAgaWYgeW91ciBtYWNoaW5lIG1hdGNoZXMgb25lIG9mIHRoZSBzYW1wbGVzLCBqdXN0IGNvcHkgdGhlIHJpZ2h0IHNhbXBsZQorICAgIGZpbGVzIHRvIGpjb25maWcuaCBhbmQgTWFrZWZpbGUuCisgICogSWYgYWxsIGVsc2UgZmFpbHMsIHJlYWQgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbmQgbWFrZSB5b3VyIG93biBmaWxlcy4KKworCitDb25maWd1cmluZyB0aGUgc29mdHdhcmUgdXNpbmcgdGhlIGF1dG9tYXRpYyAiY29uZmlndXJlIiBzY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lLCB5b3UgY2FuIGp1c3QgdHlwZQorCS4vY29uZmlndXJlCithbmQgbGV0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbnN0cnVjdCBhcHByb3ByaWF0ZSBjb25maWd1cmF0aW9uIGZpbGVzLgorSWYgeW91J3JlIHVzaW5nICJjc2giIG9uIGFuIG9sZCB2ZXJzaW9uIG9mIFN5c3RlbSBWLCB5b3UgbWlnaHQgbmVlZCB0byB0eXBlCisJc2ggY29uZmlndXJlCitpbnN0ZWFkIHRvIHByZXZlbnQgY3NoIGZyb20gdHJ5aW5nIHRvIGV4ZWN1dGUgY29uZmlndXJlIGl0c2VsZi4KK0V4cGVjdCBjb25maWd1cmUgdG8gcnVuIGZvciBhIGZldyBtaW51dGVzLCBwYXJ0aWN1bGFybHkgb24gc2xvd2VyIG1hY2hpbmVzOworaXQgd29ya3MgYnkgY29tcGlsaW5nIGEgc2VyaWVzIG9mIHRlc3QgcHJvZ3JhbXMuCisKK0NvbmZpZ3VyZSB3YXMgY3JlYXRlZCB3aXRoIEdOVSBBdXRvY29uZiBhbmQgaXQgZm9sbG93cyB0aGUgdXN1YWwgY29udmVudGlvbnMKK2ZvciBHTlUgY29uZmlndXJlIHNjcmlwdHMuICBJdCBtYWtlcyBhIGZldyBhc3N1bXB0aW9ucyB0aGF0IHlvdSBtYXkgd2FudCB0bworb3ZlcnJpZGUuICBZb3UgY2FuIGRvIHRoaXMgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIHN3aXRjaGVzIHRvIGNvbmZpZ3VyZToKKworKiBJZiB5b3Ugd2FudCB0byBidWlsZCBsaWJqcGVnIGFzIGEgc2hhcmVkIGxpYnJhcnksIHNheQorCS4vY29uZmlndXJlIC0tZW5hYmxlLXNoYXJlZAorVG8gZ2V0IGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLCBzYXkKKwkuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQgLS1lbmFibGUtc3RhdGljCitOb3RlIHRoYXQgdGhlc2Ugc3dpdGNoZXMgaW52b2tlIEdOVSBsaWJ0b29sIHRvIHRha2UgY2FyZSBvZiBzeXN0ZW0tZGVwZW5kZW50CitzaGFyZWQgbGlicmFyeSBidWlsZGluZyBtZXRob2RzLiAgSWYgdGhpbmdzIGRvbid0IHdvcmsgdGhpcyB3YXksIHBsZWFzZSB0cnkKK3J1bm5pbmcgY29uZmlndXJlIHdpdGhvdXQgZWl0aGVyIHN3aXRjaDsgdGhhdCBzaG91bGQgYnVpbGQgYSBzdGF0aWMgbGlicmFyeQord2l0aG91dCB1c2luZyBsaWJ0b29sLiAgSWYgdGhhdCB3b3JrcywgeW91ciBwcm9ibGVtIGlzIHByb2JhYmx5IHdpdGggbGlidG9vbAorbm90IHdpdGggdGhlIElKRyBjb2RlLiAgbGlidG9vbCBpcyBmYWlybHkgbmV3IGFuZCBkb2Vzbid0IHN1cHBvcnQgYWxsIGZsYXZvcnMKK29mIFVuaXggeWV0LiAgKFlvdSBtaWdodCBiZSBhYmxlIHRvIGZpbmQgYSBuZXdlciB2ZXJzaW9uIG9mIGxpYnRvb2wgdGhhbiB0aGUKK29uZSBpbmNsdWRlZCB3aXRoIGxpYmpwZWc7IHNlZSBmdHAuZ251Lm9yZy4gIFJlcG9ydCBsaWJ0b29sIHByb2JsZW1zIHRvCitidWctbGlidG9vbEBnbnUub3JnLikKKworKiBDb25maWd1cmUgd2lsbCB1c2UgZ2NjIChHTlUgQyBjb21waWxlcikgaWYgaXQncyBhdmFpbGFibGUsIG90aGVyd2lzZSBjYy4KK1RvIGZvcmNlIGEgcGFydGljdWxhciBjb21waWxlciB0byBiZSBzZWxlY3RlZCwgdXNlIHRoZSBDQyBvcHRpb24sIGZvciBleGFtcGxlCisJLi9jb25maWd1cmUgQ0M9J2NjJworVGhlIHNhbWUgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgYW55IHVudXN1YWwgY29tcGlsZXIgc3dpdGNoZXMuCitGb3IgZXhhbXBsZSwgb24gSFAtVVggeW91IHByb2JhYmx5IHdhbnQgdG8gc2F5CisJLi9jb25maWd1cmUgQ0M9J2NjIC1BYScKK3RvIGdldCBIUCdzIGNvbXBpbGVyIHRvIHJ1biBpbiBBTlNJIG1vZGUuCisKKyogVGhlIGRlZmF1bHQgQ0ZMQUdTIHNldHRpbmcgaXMgIi1PIiBmb3Igbm9uLWdjYyBjb21waWxlcnMsICItTzIiIGZvciBnY2MuCitZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgc2F5aW5nLCBmb3IgZXhhbXBsZSwKKwkuL2NvbmZpZ3VyZSBDRkxBR1M9Jy1nJworaWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRoIGRlYnVnZ2luZyBzdXBwb3J0LgorCisqIENvbmZpZ3VyZSB3aWxsIHNldCB1cCB0aGUgbWFrZWZpbGUgc28gdGhhdCAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgZmlsZXMKK2ludG8gL3Vzci9sb2NhbC9iaW4sIC91c3IvbG9jYWwvbWFuLCBldGMuICBZb3UgY2FuIHNwZWNpZnkgYW4gaW5zdGFsbGF0aW9uCitwcmVmaXggb3RoZXIgdGhhbiAiL3Vzci9sb2NhbCIgYnkgZ2l2aW5nIGNvbmZpZ3VyZSB0aGUgb3B0aW9uICItLXByZWZpeD1QQVRIIi4KKworKiBJZiB5b3UgZG9uJ3QgaGF2ZSBhIGxvdCBvZiBzd2FwIHNwYWNlLCB5b3UgbWF5IG5lZWQgdG8gZW5hYmxlIHRoZSBJSkcKK3NvZnR3YXJlJ3MgaW50ZXJuYWwgdmlydHVhbCBtZW1vcnkgbWVjaGFuaXNtLiAgVG8gZG8gdGhpcywgZ2l2ZSB0aGUgb3B0aW9uCisiLS1lbmFibGUtbWF4bWVtPU4iIHdoZXJlIE4gaXMgdGhlIGRlZmF1bHQgbWF4bWVtb3J5IGxpbWl0IGluIG1lZ2FieXRlcy4KK1RoaXMgaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsIHVuZGVyICJTZWxlY3RpbmcgYSBtZW1vcnkgbWFuYWdlciIsIGJlbG93LgorWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyBvbiByZWFzb25hYmx5LXNpemVkIFVuaXggbWFjaGluZXMsCit1bmxlc3MgeW91IHBsYW4gdG8gcHJvY2VzcyB2ZXJ5IGxhcmdlIGltYWdlcy4KKworQ29uZmlndXJlIGhhcyBzb21lIG90aGVyIGZlYXR1cmVzIHRoYXQgYXJlIHVzZWZ1bCBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZworb3Igd29ya2luZyBpbiBhIG5ldHdvcmsgb2YgbXVsdGlwbGUgbWFjaGluZSB0eXBlczsgYnV0IGlmIHlvdSBuZWVkIHRob3NlCitmZWF0dXJlcywgeW91IHByb2JhYmx5IGFscmVhZHkga25vdyBob3cgdG8gdXNlIHRoZW0uCisKKworQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlIHVzaW5nIG9uZSBvZiB0aGUgc3VwcGxpZWQgamNvbmZpZyBhbmQgbWFrZWZpbGUgZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzeXN0ZW1zLCB5b3UgY2FuIGp1c3QgdXNlIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uCitmaWxlczoKKworTWFrZWZpbGUJamNvbmZpZyBmaWxlCVN5c3RlbSBhbmQvb3IgY29tcGlsZXIKKworbWFrZWZpbGUubWFueAlqY29uZmlnLm1hbngJQW1pZ2EsIE1hbnggQXp0ZWMgQworbWFrZWZpbGUuc2FzCWpjb25maWcuc2FzCUFtaWdhLCBTQVMgQworbWFrZXByb2oubWFjCWpjb25maWcubWFjCUFwcGxlIE1hY2ludG9zaCwgTWV0cm93ZXJrcyBDb2RlV2FycmlvcgorbWFrKmpwZWcuc3QJamNvbmZpZy5zdAlBdGFyaSBTVC9TVEUvVFQsIFB1cmUgQyBvciBUdXJibyBDCittYWtlZmlsZS5iY2MJamNvbmZpZy5iY2MJTVMtRE9TIG9yIE9TLzIsIEJvcmxhbmQgQworbWFrZWZpbGUuZGoJamNvbmZpZy5kaglNUy1ET1MsIERKR1BQIChEZWxvcmllJ3MgcG9ydCBvZiBHTlUgQykKK21ha2VmaWxlLm1jNglqY29uZmlnLm1jNglNUy1ET1MsIE1pY3Jvc29mdCBDICgxNi1iaXQgb25seSkKK21ha2VmaWxlLndhdAlqY29uZmlnLndhdAlNUy1ET1MsIE9TLzIsIG9yIFdpbmRvd3MgTlQsIFdhdGNvbSBDCittYWtlZmlsZS52YwlqY29uZmlnLnZjCVdpbmRvd3MgTlQvOTUsIE1TIFZpc3VhbCBDKysKK21ha2UqLmRzCWpjb25maWcudmMJV2luZG93cyBOVC85NSwgTVMgRGV2ZWxvcGVyIFN0dWRpbworbWFrZWZpbGUubW1zCWpjb25maWcudm1zCURpZ2l0YWwgVk1TLCB3aXRoIE1NUyBzb2Z0d2FyZQorbWFrZWZpbGUudm1zCWpjb25maWcudm1zCURpZ2l0YWwgVk1TLCB3aXRob3V0IE1NUyBzb2Z0d2FyZQorCitDb3B5IHRoZSBwcm9wZXIgamNvbmZpZyBmaWxlIHRvIGpjb25maWcuaCBhbmQgdGhlIG1ha2VmaWxlIHRvIE1ha2VmaWxlIChvcgord2hhdGV2ZXIgeW91ciBzeXN0ZW0gdXNlcyBhcyB0aGUgc3RhbmRhcmQgbWFrZWZpbGUgbmFtZSkuICBGb3IgbW9yZSBpbmZvIHNlZQordGhlIGFwcHJvcHJpYXRlIHN5c3RlbS1zcGVjaWZpYyBoaW50cyBzZWN0aW9uIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisKKworQ29uZmlndXJpbmcgdGhlIHNvZnR3YXJlIGJ5IGhhbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpcnN0LCBnZW5lcmF0ZSBhIGpjb25maWcuaCBmaWxlLiAgSWYgeW91IGFyZSBtb2RlcmF0ZWx5IGZhbWlsaWFyIHdpdGggQywKK3RoZSBjb21tZW50cyBpbiBqY29uZmlnLmRvYyBzaG91bGQgYmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRvIHRoaXM7IGp1c3QKK2NvcHkgamNvbmZpZy5kb2MgdG8gamNvbmZpZy5oIGFuZCBlZGl0IGl0IGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIHlvdSBtYXkKK3ByZWZlciB0byB1c2UgdGhlIGNrY29uZmlnLmMgcHJvZ3JhbS4gIFlvdSB3aWxsIG5lZWQgdG8gY29tcGlsZSBhbmQgZXhlY3V0ZQorY2tjb25maWcuYyBieSBoYW5kIC0tLSB3ZSBob3BlIHlvdSBrbm93IGF0IGxlYXN0IGVub3VnaCB0byBkbyB0aGF0LgorY2tjb25maWcuYyBtYXkgbm90IGNvbXBpbGUgdGhlIGZpcnN0IHRyeSAoaW4gZmFjdCwgdGhlIHdob2xlIGlkZWEgaXMgZm9yIGl0Cit0byBmYWlsIGlmIGFueXRoaW5nIGlzIGdvaW5nIHRvKS4gIElmIHlvdSBnZXQgY29tcGlsZSBlcnJvcnMsIGZpeCB0aGVtIGJ5CitlZGl0aW5nIGNrY29uZmlnLmMgYWNjb3JkaW5nIHRvIHRoZSBkaXJlY3Rpb25zIGdpdmVuIGluIGNrY29uZmlnLmMuICBPbmNlCit5b3UgZ2V0IGl0IHRvIHJ1biwgaXQgd2lsbCB3cml0ZSBhIHN1aXRhYmxlIGpjb25maWcuaCBmaWxlLCBhbmQgd2lsbCBhbHNvCitwcmludCBvdXQgc29tZSBhZHZpY2UgYWJvdXQgd2hpY2ggbWFrZWZpbGUgdG8gdXNlLgorCitZb3UgbWF5IGFsc28gd2FudCB0byBsb29rIGF0IHRoZSBjYW5uZWQgamNvbmZpZyBmaWxlcywgaWYgdGhlcmUgaXMgb25lIGZvciBhCitzeXN0ZW0gc2ltaWxhciB0byB5b3Vycy4KKworU2Vjb25kLCBzZWxlY3QgYSBtYWtlZmlsZSBhbmQgY29weSBpdCB0byBNYWtlZmlsZSAob3Igd2hhdGV2ZXIgeW91ciBzeXN0ZW0KK3VzZXMgYXMgdGhlIHN0YW5kYXJkIG1ha2VmaWxlIG5hbWUpLiAgVGhlIG1vc3QgZ2VuZXJpYyBtYWtlZmlsZXMgd2UgcHJvdmlkZQorYXJlCisJbWFrZWZpbGUuYW5zaToJaWYgeW91ciBDIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIHByb3RvdHlwZXMKKwltYWtlZmlsZS51bml4OglpZiBub3QuCisoWW91IGhhdmUgZnVuY3Rpb24gcHJvdG90eXBlcyBpZiBja2NvbmZpZy5jIHB1dCAiI2RlZmluZSBIQVZFX1BST1RPVFlQRVMiCitpbiBqY29uZmlnLmguKSAgWW91IG1heSB3YW50IHRvIHN0YXJ0IGZyb20gb25lIG9mIHRoZSBvdGhlciBtYWtlZmlsZXMgaWYKK3RoZXJlIGlzIG9uZSBmb3IgYSBzeXN0ZW0gc2ltaWxhciB0byB5b3Vycy4KKworTG9vayBvdmVyIHRoZSBzZWxlY3RlZCBNYWtlZmlsZSBhbmQgYWRqdXN0IG9wdGlvbnMgYXMgbmVlZGVkLiAgSW4gcGFydGljdWxhcgoreW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgQ0MgYW5kIENGTEFHUyBkZWZpbml0aW9ucy4gIEZvciBpbnN0YW5jZSwgaWYgeW91CithcmUgdXNpbmcgR0NDLCBzZXQgQ0M9Z2NjLiAgSWYgeW91IGhhZCB0byB1c2UgYW55IGNvbXBpbGVyIHN3aXRjaGVzIHRvIGdldAorY2tjb25maWcuYyB0byB3b3JrLCBtYWtlIHN1cmUgdGhlIHNhbWUgc3dpdGNoZXMgYXJlIGluIENGTEFHUy4KKworSWYgeW91IGFyZSBvbiBhIHN5c3RlbSB0aGF0IGRvZXNuJ3QgdXNlIG1ha2VmaWxlcywgeW91J2xsIG5lZWQgdG8gc2V0IHVwCitwcm9qZWN0IGZpbGVzIChvciB3aGF0ZXZlciB5b3UgZG8gdXNlKSB0byBjb21waWxlIGFsbCB0aGUgc291cmNlIGZpbGVzIGFuZAorbGluayB0aGVtIGludG8gZXhlY3V0YWJsZSBmaWxlcyBjanBlZywgZGpwZWcsIGpwZWd0cmFuLCByZGpwZ2NvbSwgYW5kIHdyanBnY29tLgorU2VlIHRoZSBmaWxlIGxpc3RzIGluIGFueSBvZiB0aGUgbWFrZWZpbGVzIHRvIGZpbmQgb3V0IHdoaWNoIGZpbGVzIGdvIGludG8KK2VhY2ggcHJvZ3JhbS4gIE5vdGUgdGhhdCB0aGUgcHJvdmlkZWQgbWFrZWZpbGVzIGFsbCBtYWtlIGEgImxpYnJhcnkiIGZpbGUKK2xpYmpwZWcgZmlyc3QsIGJ1dCB5b3UgZG9uJ3QgaGF2ZSB0byBkbyB0aGF0IGlmIHlvdSBkb24ndCB3YW50IHRvOyB0aGUgZmlsZQorbGlzdHMgaWRlbnRpZnkgd2hpY2ggc291cmNlIGZpbGVzIGFyZSBhY3R1YWxseSBuZWVkZWQgZm9yIGNvbXByZXNzaW9uLAorZGVjb21wcmVzc2lvbiwgb3IgYm90aC4gIEFzIGEgbGFzdCByZXNvcnQsIHlvdSBjYW4gbWFrZSBhIGJhdGNoIHNjcmlwdCB0aGF0CitqdXN0IGNvbXBpbGVzIGV2ZXJ5dGhpbmcgYW5kIGxpbmtzIGl0IGFsbCB0b2dldGhlcjsgbWFrZWZpbGUudm1zIGlzIGFuIGV4YW1wbGUKK29mIHRoaXMgKGl0J3MgZm9yIFZNUyBzeXN0ZW1zIHRoYXQgaGF2ZSBubyBtYWtlLWxpa2UgdXRpbGl0eSkuCisKK0hlcmUgYXJlIGNvbW1lbnRzIGFib3V0IHNvbWUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkZWNpc2lvbnMgeW91J2xsCituZWVkIHRvIG1ha2U6CisKK0NvbW1hbmQgbGluZSBzdHlsZQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIHByb2dyYW1zIGNhbiB1c2UgYSBVbml4LWxpa2UgY29tbWFuZCBsaW5lIHN0eWxlIHdoaWNoIHN1cHBvcnRzCityZWRpcmVjdGlvbiBhbmQgcGlwaW5nLCBsaWtlIHRoaXM6CisJY2pwZWcgaW5wdXRmaWxlID5vdXRwdXRmaWxlCisJY2pwZWcgPGlucHV0ZmlsZSA+b3V0cHV0ZmlsZQorCXNvdXJjZSBwcm9ncmFtIHwgY2pwZWcgPm91dHB1dGZpbGUKK1RoZSBzaW1wbGVyICJ0d28gZmlsZSIgY29tbWFuZCBsaW5lIHN0eWxlIGlzIGp1c3QKKwljanBlZyBpbnB1dGZpbGUgb3V0cHV0ZmlsZQorWW91IG1heSBwcmVmZXIgdGhlIHR3by1maWxlIHN0eWxlLCBwYXJ0aWN1bGFybHkgaWYgeW91IGRvbid0IGhhdmUgcGlwZXMuCisKK1lvdSBNVVNUIHVzZSB0d28tZmlsZSBzdHlsZSBvbiBhbnkgc3lzdGVtIHRoYXQgZG9lc24ndCBjb3BlIHdlbGwgd2l0aCBiaW5hcnkKK2RhdGEgZmVkIHRocm91Z2ggc3RkaW4vc3Rkb3V0OyB0aGlzIGlzIHRydWUgZm9yIHNvbWUgTVMtRE9TIGNvbXBpbGVycywgZm9yCitleGFtcGxlLiAgSWYgeW91J3JlIG5vdCBvbiBhIFVuaXggc3lzdGVtLCBpdCdzIHNhZmVzdCB0byBhc3N1bWUgeW91IG5lZWQKK3R3by1maWxlIHN0eWxlLiAgKEJ1dCBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIGVpdGhlciB0aGUgUG9zaXgtc3RhbmRhcmQKK2Zkb3BlbigpIGxpYnJhcnkgcm91dGluZSBvciBhIE1pY3Jvc29mdC1jb21wYXRpYmxlIHNldG1vZGUoKSByb3V0aW5lLCB5b3UKK2NhbiBzYWZlbHkgdXNlIHRoZSBVbml4IGNvbW1hbmQgbGluZSBzdHlsZSwgYnkgZGVmaW5pbmcgVVNFX0ZET1BFTiBvcgorVVNFX1NFVE1PREUgcmVzcGVjdGl2ZWx5LikKKworVG8gdXNlIHRoZSB0d28tZmlsZSBzdHlsZSwgbWFrZSBqY29uZmlnLmggc2F5ICIjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FIi4KKworU2VsZWN0aW5nIGEgbWVtb3J5IG1hbmFnZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBJSkcgY29kZSBpcyBjYXBhYmxlIG9mIHdvcmtpbmcgb24gaW1hZ2VzIHRoYXQgYXJlIHRvbyBiaWcgdG8gZml0IGluIG1haW4KK21lbW9yeTsgZGF0YSBpcyBzd2FwcGVkIG91dCB0byB0ZW1wb3JhcnkgZmlsZXMgYXMgbmVjZXNzYXJ5LiAgSG93ZXZlciwgdGhlCitjb2RlIHRvIGRvIHRoaXMgaXMgcmF0aGVyIHN5c3RlbS1kZXBlbmRlbnQuICBXZSBwcm92aWRlIGZpdmUgZGlmZmVyZW50CittZW1vcnkgbWFuYWdlcnM6CisKKyogam1lbWFuc2kuYwlUaGlzIHZlcnNpb24gdXNlcyB0aGUgQU5TSS1zdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmUgdG1wZmlsZSgpLAorCQl3aGljaCBub3QgYWxsIG5vbi1BTlNJIHN5c3RlbXMgaGF2ZS4gIE9uIHNvbWUgc3lzdGVtcworCQl0bXBmaWxlKCkgbWF5IHB1dCB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gYSBub24tb3B0aW1hbAorCQlsb2NhdGlvbjsgaWYgeW91IGRvbid0IGxpa2Ugd2hhdCBpdCBkb2VzLCB1c2Ugam1lbW5hbWUuYy4KKworKiBqbWVtbmFtZS5jCVRoaXMgdmVyc2lvbiBjcmVhdGVzIG5hbWVkIHRlbXBvcmFyeSBmaWxlcy4gIEZvciBhbnl0aGluZworCQlleGNlcHQgYSBVbml4IG1hY2hpbmUsIHlvdSdsbCBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUKKwkJc2VsZWN0X2ZpbGVfbmFtZSgpIHJvdXRpbmUgYXBwcm9wcmlhdGVseTsgc2VlIHRoZSBjb21tZW50cworCQluZWFyIHRoZSBoZWFkIG9mIGptZW1uYW1lLmMuICBJZiB5b3UgdXNlIHRoaXMgdmVyc2lvbiwgZGVmaW5lCisJCU5FRURfU0lHTkFMX0NBVENIRVIgaW4gamNvbmZpZy5oIHRvIG1ha2Ugc3VyZSB0aGUgdGVtcCBmaWxlcworCQlhcmUgcmVtb3ZlZCBpZiB0aGUgcHJvZ3JhbSBpcyBhYm9ydGVkLgorCisqIGptZW1ub2JzLmMJKFRoYXQgc3RhbmRzIGZvciBObyBCYWNraW5nIFN0b3JlIDotKS4pICBUaGlzIHdpbGwgY29tcGlsZSBvbgorCQlhbG1vc3QgYW55IHN5c3RlbSwgYnV0IGl0IGFzc3VtZXMgeW91IGhhdmUgZW5vdWdoIG1haW4gbWVtb3J5CisJCW9yIHZpcnR1YWwgbWVtb3J5IHRvIGhvbGQgdGhlIGJpZ2dlc3QgaW1hZ2VzIHlvdSB3b3JrIHdpdGguCisKKyogam1lbWRvcy5jCVRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBtb3N0IDE2LWJpdCBNUy1ET1MgY29tcGlsZXJzLgorCQlTZWUgdGhlIHN5c3RlbS1zcGVjaWZpYyBub3RlcyBhYm91dCBNUy1ET1MgZm9yIG1vcmUgaW5mby4KKwkJSU1QT1JUQU5UOiBpZiB5b3UgdXNlIHRoaXMsIGRlZmluZSBVU0VfTVNET1NfTUVNTUdSIGluCisJCWpjb25maWcuaCwgYW5kIGluY2x1ZGUgdGhlIGFzc2VtYmx5IGZpbGUgam1lbWRvc2EuYXNtIGluIHRoZQorCQlwcm9ncmFtcy4gIFRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYW5kIGpjb25maWcgZmlsZXMgZm9yCisJCTE2LWJpdCBNUy1ET1MgY29tcGlsZXJzIGFscmVhZHkgZG8gYm90aC4KKworKiBqbWVtbWFjLmMJQ3VzdG9tIHZlcnNpb24gZm9yIEFwcGxlIE1hY2ludG9zaDsgc2VlIHRoZSBzeXN0ZW0tc3BlY2lmaWMKKwkJbm90ZXMgZm9yIE1hY2ludG9zaCBmb3IgbW9yZSBpbmZvLgorCitUbyB1c2UgYSBwYXJ0aWN1bGFyIG1lbW9yeSBtYW5hZ2VyLCBjaGFuZ2UgdGhlIFNZU0RFUE1FTSB2YXJpYWJsZSBpbiB5b3VyCittYWtlZmlsZSB0byBlcXVhbCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QgZmlsZSBuYW1lIChmb3IgZXhhbXBsZSwgam1lbWFuc2kubworb3Igam1lbWFuc2kub2JqIGZvciBqbWVtYW5zaS5jKS4KKworSWYgeW91IGhhdmUgcGxlbnR5IG9mIChyZWFsIG9yIHZpcnR1YWwpIG1haW4gbWVtb3J5LCBqdXN0IHVzZSBqbWVtbm9icy5jLgorIlBsZW50eSIgbWVhbnMgYWJvdXQgdGVuIGJ5dGVzIGZvciBldmVyeSBwaXhlbCBpbiB0aGUgbGFyZ2VzdCBpbWFnZXMKK3lvdSBwbGFuIHRvIHByb2Nlc3MsIHNvIGEgbG90IG9mIHN5c3RlbXMgZG9uJ3QgbWVldCB0aGlzIGNyaXRlcmlvbi4KK0lmIHlvdXJzIGRvZXNuJ3QsIHRyeSBqbWVtYW5zaS5jIGZpcnN0LiAgSWYgdGhhdCBkb2Vzbid0IGNvbXBpbGUsIHlvdSdsbCBoYXZlCit0byB1c2Ugam1lbW5hbWUuYzsgYmUgc3VyZSB0byBhZGp1c3Qgc2VsZWN0X2ZpbGVfbmFtZSgpIGZvciBsb2NhbCBjb25kaXRpb25zLgorWW91IG1heSBhbHNvIG5lZWQgdG8gY2hhbmdlIHVubGluaygpIHRvIHJlbW92ZSgpIGluIGNsb3NlX2JhY2tpbmdfc3RvcmUoKS4KKworRXhjZXB0IHdpdGggam1lbW5vYnMuYyBvciBqbWVtbWFjLmMsIHlvdSBuZWVkIHRvIGFkanVzdCB0aGUgREVGQVVMVF9NQVhfTUVNCitzZXR0aW5nIHRvIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgeW91ciBzeXN0ZW0gKGVpdGhlciBieSBhZGRpbmcgYSAjZGVmaW5lIGZvcgorREVGQVVMVF9NQVhfTUVNIHRvIGpjb25maWcuaCwgb3IgYnkgYWRkaW5nIGEgLUQgc3dpdGNoIHRvIHRoZSBNYWtlZmlsZSkuCitUaGlzIHZhbHVlIGxpbWl0cyB0aGUgYW1vdW50IG9mIGRhdGEgc3BhY2UgdGhlIHByb2dyYW0gd2lsbCBhdHRlbXB0IHRvCithbGxvY2F0ZS4gIENvZGUgYW5kIHN0YXRpYyBkYXRhIHNwYWNlIGlzbid0IGNvdW50ZWQsIHNvIHRoZSBhY3R1YWwgbWVtb3J5CituZWVkcyBmb3IgY2pwZWcgb3IgZGpwZWcgYXJlIHR5cGljYWxseSAxMDAgdG8gMTUwS2IgbW9yZSB0aGFuIHRoZSBtYXgtbWVtb3J5CitzZXR0aW5nLiAgTGFyZ2VyIG1heC1tZW1vcnkgc2V0dGluZ3MgcmVkdWNlIHRoZSBhbW91bnQgb2YgSS9PIG5lZWRlZCB0bworcHJvY2VzcyBhIGxhcmdlIGltYWdlLCBidXQgdG9vIGxhcmdlIGEgdmFsdWUgY2FuIHJlc3VsdCBpbiAiaW5zdWZmaWNpZW50CittZW1vcnkiIGZhaWx1cmVzLiAgT24gbW9zdCBVbml4IG1hY2hpbmVzIChhbmQgb3RoZXIgc3lzdGVtcyB3aXRoIHZpcnR1YWwKK21lbW9yeSksIGp1c3Qgc2V0IERFRkFVTFRfTUFYX01FTSB0byBzZXZlcmFsIG1pbGxpb24gYW5kIGZvcmdldCBpdC4gIEF0IHRoZQorb3RoZXIgZW5kIG9mIHRoZSBzcGVjdHJ1bSwgZm9yIE1TLURPUyBtYWNoaW5lcyB5b3UgcHJvYmFibHkgY2FuJ3QgZ28gbXVjaAorYWJvdmUgMzAwSyB0byA0MDBLLiAgKE9uIE1TLURPUyB0aGUgdmFsdWUgcmVmZXJzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkgb25seS4KK0V4dGVuZGVkL2V4cGFuZGVkIG1lbW9yeSBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgam1lbWRvcy5jLikKKworCitCVUlMRElORyBUSEUgU09GVFdBUkUKKz09PT09PT09PT09PT09PT09PT09PQorCitOb3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIGNvbXBpbGUgdGhlIHNvZnR3YXJlLiAgSnVzdCBzYXkgIm1ha2UiIChvcgord2hhdGV2ZXIncyBuZWNlc3NhcnkgdG8gc3RhcnQgdGhlIGNvbXBpbGF0aW9uKS4gIEhhdmUgYSBjdXAgb2YgY29mZmVlLgorCitIZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGNvdWxkIGdvIHdyb25nOgorCitJZiB5b3VyIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCB1bmRlZmluZWQgc3RydWN0dXJlcywgeW91IHNob3VsZCBiZSBhYmxlIHRvCitzaHV0IGl0IHVwIGJ5IHB1dHRpbmcgIiNkZWZpbmUgSU5DT01QTEVURV9UWVBFU19CUk9LRU4iIGluIGpjb25maWcuaC4KKworSWYgeW91IGhhdmUgdHJvdWJsZSB3aXRoIG1pc3Npbmcgc3lzdGVtIGluY2x1ZGUgZmlsZXMgb3IgaW5jbHVzaW9uIG9mIHRoZQord3Jvbmcgb25lcywgcmVhZCBqaW5jbHVkZS5oLiAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGlmIHlvdSB1c2VkIGNvbmZpZ3VyZQorb3IgY2tjb25maWcuYyB0byBzZXQgdXAgamNvbmZpZy5oLgorCitUaGVyZSBhcmUgYSBmYWlyIG51bWJlciBvZiByb3V0aW5lcyB0aGF0IGRvIG5vdCB1c2UgYWxsIG9mIHRoZWlyIHBhcmFtZXRlcnM7Citzb21lIGNvbXBpbGVycyB3aWxsIGlzc3VlIHdhcm5pbmdzIGFib3V0IHRoaXMsIHdoaWNoIHlvdSBjYW4gaWdub3JlLiAgVGhlcmUKK2FyZSBhbHNvIGEgZmV3IGNvbmZpZ3VyYXRpb24gY2hlY2tzIHRoYXQgbWF5IGdpdmUgInVucmVhY2hhYmxlIGNvZGUiIHdhcm5pbmdzLgorQW55IG90aGVyIHdhcm5pbmcgZGVzZXJ2ZXMgaW52ZXN0aWdhdGlvbi4KKworSWYgeW91IGRvbid0IGhhdmUgYSBnZXRlbnYoKSBsaWJyYXJ5IHJvdXRpbmUsIGRlZmluZSBOT19HRVRFTlYuCisKK0Fsc28gc2VlIHRoZSBzeXN0ZW0tc3BlY2lmaWMgaGludHMsIGJlbG93LgorCisKK1RFU1RJTkcgVEhFIFNPRlRXQVJFCis9PT09PT09PT09PT09PT09PT09PQorCitBcyBhIHF1aWNrIHRlc3Qgb2YgZnVuY3Rpb25hbGl0eSB3ZSd2ZSBpbmNsdWRlZCBhIHNtYWxsIHNhbXBsZSBpbWFnZSBpbgorc2V2ZXJhbCBmb3JtczoKKwl0ZXN0b3JpZy5qcGcJU3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBkanBlZyB0ZXN0cy4KKwl0ZXN0aW1nLnBwbQlUaGUgb3V0cHV0IG9mIGRqcGVnIHRlc3RvcmlnLmpwZworCXRlc3RpbWcuYm1wCVRoZSBvdXRwdXQgb2YgZGpwZWcgLWJtcCAtY29sb3JzIDI1NiB0ZXN0b3JpZy5qcGcKKwl0ZXN0aW1nLmpwZwlUaGUgb3V0cHV0IG9mIGNqcGVnIHRlc3RpbWcucHBtCisJdGVzdHByb2cuanBnCVByb2dyZXNzaXZlLW1vZGUgZXF1aXZhbGVudCBvZiB0ZXN0b3JpZy5qcGcuCisJdGVzdGltZ3AuanBnCVRoZSBvdXRwdXQgb2YgY2pwZWcgLXByb2dyZXNzaXZlIC1vcHRpbWl6ZSB0ZXN0aW1nLnBwbQorKFRoZSBmaXJzdC0gYW5kIHNlY29uZC1nZW5lcmF0aW9uIC5qcGcgZmlsZXMgYXJlbid0IGlkZW50aWNhbCBzaW5jZSBKUEVHIGlzCitsb3NzeS4pICBJZiB5b3UgY2FuIGdlbmVyYXRlIGR1cGxpY2F0ZXMgb2YgdGhlIHRlc3RpbWcqIGZpbGVzIHRoZW4geW91Citwcm9iYWJseSBoYXZlIHdvcmtpbmcgcHJvZ3JhbXMuCisKK1dpdGggbW9zdCBvZiB0aGUgbWFrZWZpbGVzLCAibWFrZSB0ZXN0IiB3aWxsIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeQorY29tcGFyaXNvbnMuCisKK0lmIHlvdSdyZSB1c2luZyBhIG1ha2VmaWxlIHRoYXQgZG9lc24ndCBwcm92aWRlIHRoZSB0ZXN0IG9wdGlvbiwgcnVuIGRqcGVnCithbmQgY2pwZWcgYnkgaGFuZCBhbmQgY29tcGFyZSB0aGUgb3V0cHV0IGZpbGVzIHRvIHRlc3RpbWcqIHdpdGggd2hhdGV2ZXIKK2JpbmFyeSBmaWxlIGNvbXBhcmlzb24gdG9vbCB5b3UgaGF2ZS4gIFRoZSBmaWxlcyBzaG91bGQgYmUgYml0LWZvci1iaXQKK2lkZW50aWNhbC4KKworSWYgdGhlIHByb2dyYW1zIGNvbXBsYWluICJNQVhfQUxMT0NfQ0hVTksgaXMgd3JvbmcsIHBsZWFzZSBmaXgiLCB0aGVuIHlvdQorbmVlZCB0byByZWR1Y2UgTUFYX0FMTE9DX0NIVU5LIHRvIGEgdmFsdWUgdGhhdCBmaXRzIGluIHR5cGUgc2l6ZV90LgorVHJ5IGFkZGluZyAiI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMIiB0byBqY29uZmlnLmguICBBIGxlc3MgbGlrZWx5Citjb25maWd1cmF0aW9uIGVycm9yIGlzICJBTElHTl9UWVBFIGlzIHdyb25nLCBwbGVhc2UgZml4IjogZGVmaW5pbmcgQUxJR05fVFlQRQorYXMgbG9uZyBzaG91bGQgdGFrZSBjYXJlIG9mIHRoYXQgb25lLgorCitJZiB0aGUgY2pwZWcgdGVzdCBydW4gZmFpbHMgd2l0aCAiTWlzc2luZyBIdWZmbWFuIGNvZGUgdGFibGUgZW50cnkiLCBpdCdzIGEKK2dvb2QgYmV0IHRoYXQgeW91IG5lZWRlZCB0byBkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQuICBHbyBiYWNrIHRvIHRoZQorY29uZmlndXJhdGlvbiBzdGVwIGFuZCBydW4gY2tjb25maWcuYy4gIChUaGlzIGlzIGEgZ29vZCBwbGFuIGZvciBhbnkgb3RoZXIKK3Rlc3QgZmFpbHVyZSwgdG9vLikKKworSWYgeW91IGFyZSB1c2luZyBVbml4IChvbmUtZmlsZSkgY29tbWFuZCBsaW5lIHN0eWxlIG9uIGEgbm9uLVVuaXggc3lzdGVtLAoraXQncyBhIGdvb2QgaWRlYSB0byBjaGVjayB0aGF0IGJpbmFyeSBJL08gdGhyb3VnaCBzdGRpbi9zdGRvdXQgYWN0dWFsbHkKK3dvcmtzLiAgWW91IHNob3VsZCBnZXQgdGhlIHNhbWUgcmVzdWx0cyBmcm9tICJkanBlZyA8dGVzdG9yaWcuanBnID5vdXQucHBtIgorYXMgZnJvbSAiZGpwZWcgLW91dGZpbGUgb3V0LnBwbSB0ZXN0b3JpZy5qcGciLiAgTm90ZSB0aGF0IHRoZSBtYWtlZmlsZXMgYWxsCit1c2UgdGhlIGxhdHRlciBzdHlsZSBhbmQgdGhlcmVmb3JlIGRvIG5vdCBleGVyY2lzZSBzdGRpbi9zdGRvdXQhICBJZiB0aGlzCitjaGVjayBmYWlscywgdHJ5IHJlY29tcGlsaW5nIHdpdGggVVNFX1NFVE1PREUgb3IgVVNFX0ZET1BFTiBkZWZpbmVkLgorSWYgaXQgc3RpbGwgZG9lc24ndCB3b3JrLCBiZXR0ZXIgdXNlIHR3by1maWxlIHN0eWxlLgorCitJZiB5b3UgY2hvc2UgYSBtZW1vcnkgbWFuYWdlciBvdGhlciB0aGFuIGptZW1ub2JzLmMsIHlvdSBzaG91bGQgdGVzdCB0aGF0Cit0ZW1wb3JhcnktZmlsZSB1c2FnZSB3b3Jrcy4gIFRyeSAiZGpwZWcgLWJtcCAtY29sb3JzIDI1NiAtbWF4IDAgdGVzdG9yaWcuanBnIgorYW5kIG1ha2Ugc3VyZSBpdHMgb3V0cHV0IG1hdGNoZXMgdGVzdGltZy5ibXAuICBJZiB5b3UgaGF2ZSBhbnkgcmVhbGx5IGxhcmdlCitpbWFnZXMgaGFuZHksIHRyeSBjb21wcmVzc2luZyB0aGVtIHdpdGggLW9wdGltaXplIGFuZC9vciBkZWNvbXByZXNzaW5nIHdpdGgKKy1jb2xvcnMgMjU2IHRvIG1ha2Ugc3VyZSB5b3VyIERFRkFVTFRfTUFYX01FTSBzZXR0aW5nIGlzIG5vdCB0b28gbGFyZ2UuCisKK05PVEU6IHRoaXMgaXMgZmFyIGZyb20gYW4gZXhoYXVzdGl2ZSB0ZXN0IG9mIHRoZSBKUEVHIHNvZnR3YXJlOyBzb21lIG1vZHVsZXMsCitzdWNoIGFzIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24sIGFyZSBub3QgZXhlcmNpc2VkIGF0IGFsbC4gIEl0J3MganVzdCBhCitxdWljayB0ZXN0IHRvIGdpdmUgeW91IHNvbWUgY29uZmlkZW5jZSB0aGF0IHlvdSBoYXZlbid0IG1pc3NlZCBzb21ldGhpbmcKK21ham9yLgorCisKK0lOU1RBTExJTkcgVEhFIFNPRlRXQVJFCis9PT09PT09PT09PT09PT09PT09PT09PQorCitPbmNlIHlvdSdyZSBkb25lIHdpdGggdGhlIGFib3ZlIHN0ZXBzLCB5b3UgY2FuIGluc3RhbGwgdGhlIHNvZnR3YXJlIGJ5Citjb3B5aW5nIHRoZSBleGVjdXRhYmxlIGZpbGVzIChjanBlZywgZGpwZWcsIGpwZWd0cmFuLCByZGpwZ2NvbSwgYW5kIHdyanBnY29tKQordG8gd2hlcmV2ZXIgeW91IG5vcm1hbGx5IGluc3RhbGwgcHJvZ3JhbXMuICBPbiBVbml4IHN5c3RlbXMsIHlvdSdsbCBhbHNvIHdhbnQKK3RvIHB1dCB0aGUgbWFuIHBhZ2VzIChjanBlZy4xLCBkanBlZy4xLCBqcGVndHJhbi4xLCByZGpwZ2NvbS4xLCB3cmpwZ2NvbS4xKQoraW4gdGhlIG1hbi1wYWdlIGRpcmVjdG9yeS4gIFRoZSBwcmUtZmFiIG1ha2VmaWxlcyBkb24ndCBzdXBwb3J0IHRoaXMgc3RlcAorc2luY2UgdGhlcmUncyBzdWNoIGEgd2lkZSB2YXJpZXR5IG9mIGluc3RhbGxhdGlvbiBwcm9jZWR1cmVzIG9uIGRpZmZlcmVudAorc3lzdGVtcy4KKworSWYgeW91IGdlbmVyYXRlZCBhIE1ha2VmaWxlIHdpdGggdGhlICJjb25maWd1cmUiIHNjcmlwdCwgeW91IGNhbiBqdXN0IHNheQorCW1ha2UgaW5zdGFsbAordG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIHRoZWlyIG1hbiBwYWdlcyBpbnRvIHRoZSBzdGFuZGFyZCBwbGFjZXMuCisoWW91J2xsIHByb2JhYmx5IG5lZWQgdG8gYmUgcm9vdCB0byBkbyB0aGlzLikgIFdlIHJlY29tbWVuZCBmaXJzdCBzYXlpbmcKKwltYWtlIC1uIGluc3RhbGwKK3RvIHNlZSB3aGVyZSBjb25maWd1cmUgdGhvdWdodCB0aGUgZmlsZXMgc2hvdWxkIGdvLiAgWW91IG1heSBuZWVkIHRvIGVkaXQKK3RoZSBNYWtlZmlsZSwgcGFydGljdWxhcmx5IGlmIHlvdXIgc3lzdGVtJ3MgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlCitmaWxlbmFtZXMgZG9uJ3QgbWF0Y2ggd2hhdCBjb25maWd1cmUgZXhwZWN0cy4KKworSWYgeW91IHdhbnQgdG8gaW5zdGFsbCB0aGUgSUpHIGxpYnJhcnkgaXRzZWxmLCBmb3IgdXNlIGluIGNvbXBpbGluZyBvdGhlcgorcHJvZ3JhbXMgYmVzaWRlcyBvdXJzLCB0aGVuIHlvdSBuZWVkIHRvIHB1dCB0aGUgZm91ciBpbmNsdWRlIGZpbGVzCisJanBlZ2xpYi5oIGplcnJvci5oIGpjb25maWcuaCBqbW9yZWNmZy5oCitpbnRvIHlvdXIgaW5jbHVkZS1maWxlIGRpcmVjdG9yeSwgYW5kIHB1dCB0aGUgbGlicmFyeSBmaWxlIGxpYmpwZWcuYQorKGV4dGVuc2lvbiBtYXkgdmFyeSBkZXBlbmRpbmcgb24gc3lzdGVtKSB3aGVyZXZlciBsaWJyYXJ5IGZpbGVzIGdvLgorSWYgeW91IGdlbmVyYXRlZCBhIE1ha2VmaWxlIHdpdGggImNvbmZpZ3VyZSIsIGl0IHdpbGwgZG8gd2hhdCBpdCB0aGlua3MKK2lzIHRoZSByaWdodCB0aGluZyBpZiB5b3Ugc2F5CisJbWFrZSBpbnN0YWxsLWxpYgorCisKK09QVElPTkFMIFNUVUZGCis9PT09PT09PT09PT09PQorCitQcm9ncmVzcyBtb25pdG9yOgorCitJZiB5b3UgbGlrZSwgeW91IGNhbiAjZGVmaW5lIFBST0dSRVNTX1JFUE9SVCAoaW4gamNvbmZpZy5oKSB0byBlbmFibGUgZGlzcGxheQorb2YgcGVyY2VudC1kb25lIHByb2dyZXNzIHJlcG9ydHMuICBUaGUgcm91dGluZSBwcm92aWRlZCBpbiBjZGpwZWcuYyBtZXJlbHkKK3ByaW50cyBwZXJjZW50YWdlcyB0byBzdGRlcnIsIGJ1dCB5b3UgY2FuIGN1c3RvbWl6ZSBpdCB0byBkbyBzb21ldGhpbmcKK2ZhbmNpZXIuCisKK1V0YWggUkxFIGZpbGUgZm9ybWF0IHN1cHBvcnQ6CisKK1dlIGRpc3RyaWJ1dGUgdGhlIHNvZnR3YXJlIHdpdGggc3VwcG9ydCBmb3IgUkxFIGltYWdlIGZpbGVzIChVdGFoIFJhc3RlcgorVG9vbGtpdCBmb3JtYXQpIGRpc2FibGVkLCBiZWNhdXNlIHRoZSBSTEUgc3VwcG9ydCB3b24ndCBjb21waWxlIHdpdGhvdXQgdGhlCitVdGFoIGxpYnJhcnkuICBJZiB5b3UgaGF2ZSBVUlQgdmVyc2lvbiAzLjEgb3IgbGF0ZXIsIHlvdSBjYW4gZW5hYmxlIFJMRQorc3VwcG9ydCBhcyBmb2xsb3dzOgorCTEuICAjZGVmaW5lIFJMRV9TVVBQT1JURUQgaW4gamNvbmZpZy5oLgorCTIuICBBZGQgYSAtSSBvcHRpb24gdG8gQ0ZMQUdTIGluIHRoZSBNYWtlZmlsZSBmb3IgdGhlIGRpcmVjdG9yeQorCSAgICBjb250YWluaW5nIHRoZSBVUlQgLmggZmlsZXMgKHR5cGljYWxseSB0aGUgImluY2x1ZGUiCisJICAgIHN1YmRpcmVjdG9yeSBvZiB0aGUgVVJUIGRpc3RyaWJ1dGlvbikuCisJMy4gIEFkZCAtTC4uLiAtbHJsZSB0byBMRExJQlMgaW4gdGhlIE1ha2VmaWxlLCB3aGVyZSAuLi4gc3BlY2lmaWVzCisJICAgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgVVJUICJsaWJybGUuYSIgZmlsZSAodHlwaWNhbGx5IHRoZQorCSAgICAibGliIiBzdWJkaXJlY3Rvcnkgb2YgdGhlIFVSVCBkaXN0cmlidXRpb24pLgorCitTdXBwb3J0IGZvciAxMi1iaXQtZGVlcCBwaXhlbCBkYXRhOgorCitUaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgZWl0aGVyIDgtYml0IG9yIDEyLWJpdCBkYXRhIHByZWNpc2lvbi4gIChGb3IgY29sb3IsCit0aGlzIG1lYW5zIDggb3IgMTIgYml0cyBwZXIgY2hhbm5lbCwgb2YgY291cnNlLikgIElmIHlvdSBuZWVkIHRvIHdvcmsgd2l0aAorZGVlcGVyIHRoYW4gOC1iaXQgZGF0YSwgeW91IGNhbiBjb21waWxlIHRoZSBJSkcgY29kZSBmb3IgMTItYml0IG9wZXJhdGlvbi4KK1RvIGRvIHNvOgorICAxLiBJbiBqbW9yZWNmZy5oLCBkZWZpbmUgQklUU19JTl9KU0FNUExFIGFzIDEyIHJhdGhlciB0aGFuIDguCisgIDIuIEluIGpjb25maWcuaCwgdW5kZWZpbmUgQk1QX1NVUFBPUlRFRCwgUkxFX1NVUFBPUlRFRCwgYW5kIFRBUkdBX1NVUFBPUlRFRCwKKyAgICAgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhvc2UgZm9ybWF0cyBkb2Vzbid0IGhhbmRsZSAxMi1iaXQgZGF0YSBhbmQgd29uJ3QKKyAgICAgZXZlbiBjb21waWxlLiAgKFRoZSBQUE0gY29kZSBkb2VzIHdvcmssIGFzIGV4cGxhaW5lZCBiZWxvdy4gIFRoZSBHSUYKKyAgICAgY29kZSB3b3JrcyB0b287IGl0IHNjYWxlcyA4LWJpdCBHSUYgZGF0YSB0byBhbmQgZnJvbSAxMi1iaXQgZGVwdGgKKyAgICAgYXV0b21hdGljYWxseS4pCisgIDMuIENvbXBpbGUuICBEb24ndCBleHBlY3QgIm1ha2UgdGVzdCIgdG8gcGFzcywgc2luY2UgdGhlIHN1cHBsaWVkIHRlc3QKKyAgICAgZmlsZXMgYXJlIGZvciA4LWJpdCBkYXRhLgorCitDdXJyZW50bHksIDEyLWJpdCBzdXBwb3J0IGRvZXMgbm90IHdvcmsgb24gMTYtYml0LWludCBtYWNoaW5lcy4KKworTm90ZSB0aGF0IGEgMTItYml0IHZlcnNpb24gd2lsbCBub3QgcmVhZCA4LWJpdCBKUEVHIGZpbGVzLCBub3IgdmljZSB2ZXJzYTsKK3NvIHlvdSdsbCB3YW50IHRvIGtlZXAgYXJvdW5kIGEgcmVndWxhciA4LWJpdCBjb21waWxhdGlvbiBhcyB3ZWxsLgorKFJ1bi10aW1lIHNlbGVjdGlvbiBvZiBkYXRhIGRlcHRoLCB0byBhbGxvdyBhIHNpbmdsZSBjb3B5IHRoYXQgZG9lcyBib3RoLAoraXMgcG9zc2libGUgYnV0IHdvdWxkIHByb2JhYmx5IHNsb3cgdGhpbmdzIGRvd24gY29uc2lkZXJhYmx5OyBpdCdzIHZlcnkgbG93CitvbiBvdXIgdG8tZG8gbGlzdC4pCisKK1RoZSBQUE0gcmVhZGVyIChyZHBwbS5jKSBjYW4gcmVhZCAxMi1iaXQgZGF0YSBmcm9tIGVpdGhlciB0ZXh0LWZvcm1hdCBvcgorYmluYXJ5LWZvcm1hdCBQUE0gYW5kIFBHTSBmaWxlcy4gIEJpbmFyeS1mb3JtYXQgUFBNL1BHTSBmaWxlcyB3aGljaCBoYXZlIGEKK21heHZhbCBncmVhdGVyIHRoYW4gMjU1IGFyZSBhc3N1bWVkIHRvIHVzZSAyIGJ5dGVzIHBlciBzYW1wbGUsIExTQiBmaXJzdAorKGxpdHRsZS1lbmRpYW4gb3JkZXIpLiAgQXMgb2YgZWFybHkgMTk5NSwgMi1ieXRlIGJpbmFyeSBmb3JtYXQgaXMgbm90CitvZmZpY2lhbGx5IHN1cHBvcnRlZCBieSB0aGUgUEJNUExVUyBsaWJyYXJ5LCBidXQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBhCitmdXR1cmUgcmVsZWFzZSBvZiBQQk1QTFVTIHdpbGwgc3VwcG9ydCBpdC4gIE5vdGUgdGhhdCB0aGUgUFBNIHJlYWRlciB3aWxsCityZWFkIGZpbGVzIG9mIGFueSBtYXh2YWwgcmVnYXJkbGVzcyBvZiB0aGUgQklUU19JTl9KU0FNUExFIHNldHRpbmc7IGluY29taW5nCitkYXRhIGlzIGF1dG9tYXRpY2FsbHkgcmVzY2FsZWQgdG8gZWl0aGVyIG1heHZhbD0yNTUgb3IgbWF4dmFsPTQwOTUgYXMKK2FwcHJvcHJpYXRlIGZvciB0aGUgY2pwZWcgYml0IGRlcHRoLgorCitUaGUgUFBNIHdyaXRlciAod3JwcG0uYykgd2lsbCBub3JtYWxseSB3cml0ZSAyLWJ5dGUgYmluYXJ5IFBQTSBvciBQR00KK2Zvcm1hdCwgbWF4dmFsIDQwOTUsIHdoZW4gY29tcGlsZWQgd2l0aCBCSVRTX0lOX0pTQU1QTEU9MTIuICBTaW5jZSB0aGlzCitmb3JtYXQgaXMgbm90IHlldCB3aWRlbHkgc3VwcG9ydGVkLCB5b3UgY2FuIGRpc2FibGUgaXQgYnkgY29tcGlsaW5nIHdycHBtLmMKK3dpdGggUFBNX05PUkFXV09SRCBkZWZpbmVkOyB0aGVuIHRoZSBkYXRhIGlzIHNjYWxlZCBkb3duIHRvIDggYml0cyB0byBtYWtlIGEKK3N0YW5kYXJkIDEtYnl0ZS9zYW1wbGUgUFBNIG9yIFBHTSBmaWxlLiAgKFllcywgdGhpcyBtZWFucyBzdGlsbCBhbm90aGVyIGNvcHkKK29mIGRqcGVnIHRvIGtlZXAgYXJvdW5kLiAgQnV0IGhvcGVmdWxseSB5b3Ugd29uJ3QgbmVlZCBpdCBmb3IgdmVyeSBsb25nLgorUG9za2FuemVyJ3Mgc3VwcG9zZWQgdG8gZ2V0IHRoYXQgbmV3IFBCTVBMVVMgcmVsZWFzZSBvdXQgUmVhbCBTb29uIE5vdy4pCisKK09mIGNvdXJzZSwgaWYgeW91IGFyZSB3b3JraW5nIHdpdGggMTItYml0IGRhdGEsIHlvdSBwcm9iYWJseSBoYXZlIGl0IHN0b3JlZAoraW4gc29tZSBvdGhlciwgbm9uc3RhbmRhcmQgZm9ybWF0LiAgSW4gdGhhdCBjYXNlIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvCit3cml0ZSB5b3VyIG93biBJL08gbW9kdWxlcyB0byByZWFkIGFuZCB3cml0ZSB5b3VyIGZvcm1hdC4KKworTm90ZSB0aGF0IGEgMTItYml0IHZlcnNpb24gb2YgY2pwZWcgYWx3YXlzIHJ1bnMgaW4gIi1vcHRpbWl6ZSIgbW9kZSwgaW4KK29yZGVyIHRvIGdlbmVyYXRlIHZhbGlkIEh1ZmZtYW4gdGFibGVzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdXIKK2RlZmF1bHQgSHVmZm1hbiB0YWJsZXMgb25seSBjb3ZlciA4LWJpdCBkYXRhLgorCitSZW1vdmluZyBjb2RlOgorCitJZiB5b3UgbmVlZCB0byBtYWtlIGEgc21hbGxlciB2ZXJzaW9uIG9mIHRoZSBKUEVHIHNvZnR3YXJlLCBzb21lIG9wdGlvbmFsCitmdW5jdGlvbnMgY2FuIGJlIHJlbW92ZWQgYXQgY29tcGlsZSB0aW1lLiAgU2VlIHRoZSB4eHhfU1VQUE9SVEVEICNkZWZpbmVzIGluCitqY29uZmlnLmggYW5kIGptb3JlY2ZnLmguICBJZiBhdCBhbGwgcG9zc2libGUsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBsZWF2ZSBpbgorZGVjb2RlciBzdXBwb3J0IGZvciBhbGwgdmFsaWQgSlBFRyBmaWxlcywgdG8gZW5zdXJlIHRoYXQgeW91IGNhbiByZWFkIGFueW9uZSdzCitvdXRwdXQuICBUYWtpbmcgb3V0IHN1cHBvcnQgZm9yIGltYWdlIGZpbGUgZm9ybWF0cyB0aGF0IHlvdSBkb24ndCB1c2UgaXMgdGhlCittb3N0IHBhaW5sZXNzIHdheSB0byBtYWtlIHRoZSBwcm9ncmFtcyBzbWFsbGVyLiAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0bworcmVtb3ZlIHNvbWUgb2YgdGhlIERDVCBtZXRob2RzOiBpbiBwYXJ0aWN1bGFyLCB0aGUgIklGQVNUIiBtZXRob2QgbWF5IG5vdCBiZQorZW5vdWdoIGZhc3RlciB0aGFuIHRoZSBvdGhlcnMgdG8gYmUgd29ydGgga2VlcGluZyBvbiB5b3VyIG1hY2hpbmUuICAoSWYgeW91CitkbyByZW1vdmUgSVNMT1cgb3IgSUZBU1QsIGJlIHN1cmUgdG8gcmVkZWZpbmUgSkRDVF9ERUZBVUxUIG9yIEpEQ1RfRkFTVEVTVAordG8gYSBzdXBwb3J0ZWQgbWV0aG9kLCBieSBhZGRpbmcgYSAjZGVmaW5lIGluIGpjb25maWcuaC4pCisKKworT1BUSU1JWkFUSU9OCis9PT09PT09PT09PT0KKworVW5sZXNzIHlvdSBvd24gYSBDcmF5LCB5b3UnbGwgcHJvYmFibHkgYmUgaW50ZXJlc3RlZCBpbiBtYWtpbmcgdGhlIEpQRUcKK3NvZnR3YXJlIGdvIGFzIGZhc3QgYXMgcG9zc2libGUuICBUaGlzIHNlY3Rpb24gY292ZXJzIHNvbWUgbWFjaGluZS1kZXBlbmRlbnQKK29wdGltaXphdGlvbnMgeW91IG1heSB3YW50IHRvIHRyeS4gIFdlIHN1Z2dlc3QgdGhhdCBiZWZvcmUgdHJ5aW5nIGFueSBvZgordGhpcywgeW91IGZpcnN0IGdldCB0aGUgYmFzaWMgaW5zdGFsbGF0aW9uIHRvIHBhc3MgdGhlIHNlbGYtdGVzdCBzdGVwLgorUmVwZWF0IHRoZSBzZWxmLXRlc3QgYWZ0ZXIgYW55IG9wdGltaXphdGlvbiB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZW4ndAorYnJva2VuIGFueXRoaW5nLgorCitUaGUgaW50ZWdlciBEQ1Qgcm91dGluZXMgcGVyZm9ybSBhIGxvdCBvZiBtdWx0aXBsaWNhdGlvbnMuICBUaGVzZQorbXVsdGlwbGljYXRpb25zIG11c3QgeWllbGQgMzItYml0IHJlc3VsdHMsIGJ1dCBub25lIG9mIHRoZWlyIGlucHV0IHZhbHVlcworYXJlIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUuICBPbiBtYW55IG1hY2hpbmVzLCBub3RhYmx5IHRoZSA2ODB4MCBhbmQgODB4ODYKK0NQVXMsIGEgMTZ4MTY9PjMyIGJpdCBtdWx0aXBseSBpbnN0cnVjdGlvbiBpcyBmYXN0ZXIgdGhhbiBhIGZ1bGwgMzJ4MzI9PjMyCitiaXQgbXVsdGlwbHkuICBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHBvcnRhYmxlIHdheSB0byBzcGVjaWZ5IHN1Y2ggYQorbXVsdGlwbGljYXRpb24gaW4gQywgYnV0IHNvbWUgY29tcGlsZXJzIGNhbiBnZW5lcmF0ZSBvbmUgd2hlbiB5b3UgdXNlIHRoZQorcmlnaHQgY29tYmluYXRpb24gb2YgY2FzdHMuICBTZWUgdGhlIE1VTFRJUExZeHh4IG1hY3JvIGRlZmluaXRpb25zIGluCitqZGN0LmguICBJZiB5b3VyIGNvbXBpbGVyIG1ha2VzICJpbnQiIGJlIDMyIGJpdHMgYW5kICJzaG9ydCIgYmUgMTYgYml0cywKK2RlZmluaW5nIFNIT1JUeFNIT1JUXzMyIGlzIGZhaXJseSBsaWtlbHkgdG8gd29yay4gIFdoZW4gZXhwZXJpbWVudGluZyB3aXRoCithbHRlcm5hdGUgZGVmaW5pdGlvbnMsIGJlIHN1cmUgdG8gdGVzdCBub3Qgb25seSB3aGV0aGVyIHRoZSBjb2RlIHN0aWxsIHdvcmtzCisodXNlIHRoZSBzZWxmLXRlc3QpLCBidXQgYWxzbyB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGZhc3RlciAtLS0gb24gc29tZQorY29tcGlsZXJzLCBhbHRlcm5hdGUgZGVmaW5pdGlvbnMgbWF5IGNvbXB1dGUgdGhlIHJpZ2h0IGFuc3dlciwgeWV0IGJlIHNsb3dlcgordGhhbiB0aGUgZGVmYXVsdC4gIFRpbWluZyBjanBlZyBvbiBhIGxhcmdlIFBHTSAoZ3JheXNjYWxlKSBpbnB1dCBmaWxlIGlzIHRoZQorYmVzdCB3YXkgdG8gY2hlY2sgdGhpcywgYXMgdGhlIERDVCB3aWxsIGJlIHRoZSBsYXJnZXN0IGZyYWN0aW9uIG9mIHRoZSBydW50aW1lCitpbiB0aGF0IG1vZGUuICAoTm90ZTogc29tZSBvZiB0aGUgZGlzdHJpYnV0ZWQgY29tcGlsZXItc3BlY2lmaWMgamNvbmZpZyBmaWxlcworYWxyZWFkeSBjb250YWluICNkZWZpbmUgc3dpdGNoZXMgdG8gc2VsZWN0IGFwcHJvcHJpYXRlIE1VTFRJUExZeHh4CitkZWZpbml0aW9ucy4pCisKK0lmIHlvdXIgbWFjaGluZSBoYXMgc3VmZmljaWVudGx5IGZhc3QgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUsIHlvdSBtYXkgZmluZAordGhhdCB0aGUgZmxvYXQgRENUIG1ldGhvZCBpcyBmYXN0ZXIgdGhhbiB0aGUgaW50ZWdlciBEQ1QgbWV0aG9kcywgZXZlbgorYWZ0ZXIgdHdlYWtpbmcgdGhlIGludGVnZXIgbXVsdGlwbHkgbWFjcm9zLiAgSW4gdGhhdCBjYXNlIHlvdSBtYXkgd2FudCB0bworbWFrZSB0aGUgZmxvYXQgRENUIGJlIHRoZSBkZWZhdWx0IG1ldGhvZC4gIChUaGUgb25seSBvYmplY3Rpb24gdG8gdGhpcyBpcwordGhhdCBmbG9hdCBEQ1QgcmVzdWx0cyBtYXkgdmFyeSBzbGlnaHRseSBhY3Jvc3MgbWFjaGluZXMuKSAgVG8gZG8gdGhhdCwgYWRkCisiI2RlZmluZSBKRENUX0RFRkFVTFQgSkRDVF9GTE9BVCIgdG8gamNvbmZpZy5oLiAgRXZlbiBpZiB5b3UgZG9uJ3QgY2hhbmdlCit0aGUgZGVmYXVsdCwgeW91IHNob3VsZCByZWRlZmluZSBKRENUX0ZBU1RFU1QsIHdoaWNoIGlzIHRoZSBtZXRob2Qgc2VsZWN0ZWQKK2J5IGRqcGVnJ3MgLWZhc3Qgc3dpdGNoLiAgRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcworKHVzYWdlLmRvYyBhbmQvb3IgY2pwZWcuMSwgZGpwZWcuMSkgdG8gYWdyZWUgd2l0aCB3aGF0IHlvdSd2ZSBkb25lLgorCitJZiBhY2Nlc3MgdG8gInNob3J0IiBhcnJheXMgaXMgc2xvdyBvbiB5b3VyIG1hY2hpbmUsIGl0IG1heSBiZSBhIHdpbiB0bworZGVmaW5lIHR5cGUgSkNPRUYgYXMgaW50IHJhdGhlciB0aGFuIHNob3J0LiAgVGhpcyB3aWxsIGNvc3QgYSBnb29kIGRlYWwgb2YKK21lbW9yeSB0aG91Z2gsIHBhcnRpY3VsYXJseSBpbiBzb21lIG11bHRpLXBhc3MgbW9kZXMsIHNvIGRvbid0IGRvIGl0IHVubGVzcworeW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kIHNob3J0IGlzIFJFQUxMWSBzbG93LgorCitJZiB5b3VyIGNvbXBpbGVyIGNhbiBjb21waWxlIGZ1bmN0aW9uIGNhbGxzIGluLWxpbmUsIG1ha2Ugc3VyZSB0aGUgSU5MSU5FCittYWNybyBpbiBqbW9yZWNmZy5oIGlzIGRlZmluZWQgYXMgdGhlIGtleXdvcmQgdGhhdCBtYXJrcyBhIGZ1bmN0aW9uCitpbmxpbmUtYWJsZS4gIFNvbWUgY29tcGlsZXJzIGhhdmUgYSBzd2l0Y2ggdGhhdCB0ZWxscyB0aGUgY29tcGlsZXIgdG8gaW5saW5lCithbnkgZnVuY3Rpb24gaXQgdGhpbmtzIGlzIHByb2ZpdGFibGUgKGUuZy4sIC1maW5saW5lLWZ1bmN0aW9ucyBmb3IgZ2NjKS4KK0VuYWJsaW5nIHN1Y2ggYSBzd2l0Y2ggaXMgbGlrZWx5IHRvIG1ha2UgdGhlIGNvbXBpbGVkIGNvZGUgYmlnZ2VyIGJ1dCBmYXN0ZXIuCisKK0luIGdlbmVyYWwsIGl0J3Mgd29ydGggdHJ5aW5nIHRoZSBtYXhpbXVtIG9wdGltaXphdGlvbiBsZXZlbCBvZiB5b3VyIGNvbXBpbGVyLAorYW5kIGV4cGVyaW1lbnRpbmcgd2l0aCBhbnkgb3B0aW9uYWwgb3B0aW1pemF0aW9ucyBzdWNoIGFzIGxvb3AgdW5yb2xsaW5nLgorKFVuZm9ydHVuYXRlbHksIGZhciB0b28gbWFueSBjb21waWxlcnMgaGF2ZSBvcHRpbWl6ZXIgYnVncyAuLi4gYmUgcHJlcGFyZWQgdG8KK2JhY2sgb2ZmIGlmIHRoZSBjb2RlIGZhaWxzIHNlbGYtdGVzdC4pICBJZiB5b3UgZG8gYW55IGV4cGVyaW1lbnRhdGlvbiBhbG9uZwordGhlc2UgbGluZXMsIHBsZWFzZSByZXBvcnQgdGhlIG9wdGltYWwgc2V0dGluZ3MgdG8ganBlZy1pbmZvQHV1bmV0LnV1Lm5ldCBzbword2UgY2FuIG1lbnRpb24gdGhlbSBpbiBmdXR1cmUgcmVsZWFzZXMuICBCZSBzdXJlIHRvIHNwZWNpZnkgeW91ciBtYWNoaW5lIGFuZAorY29tcGlsZXIgdmVyc2lvbi4KKworCitISU5UUyBGT1IgU1BFQ0lGSUMgU1lTVEVNUworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2Ugd2VsY29tZSByZXBvcnRzIG9uIGNoYW5nZXMgbmVlZGVkIGZvciBzeXN0ZW1zIG5vdCBtZW50aW9uZWQgaGVyZS4gIFN1Ym1pdAorJ2VtIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuICBBbHNvLCBpZiBjb25maWd1cmUgb3IgY2tjb25maWcuYyBpcyB3cm9uZworYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSB0aGUgSlBFRyBzb2Z0d2FyZSBmb3IgeW91ciBzeXN0ZW0sIHBsZWFzZSBsZXQgdXMga25vdy4KKworCitBY29ybiBSSVNDIE9TOgorCisoVGhhbmtzIHRvIFNpbW9uIE1pZGRsZXRvbiBmb3IgdGhlc2UgaGludHMgb24gY29tcGlsaW5nIHdpdGggRGVza3RvcCBDLikKK0FmdGVyIHJlbmFtaW5nIHRoZSBmaWxlcyBhY2NvcmRpbmcgdG8gQWNvcm4gY29udmVudGlvbnMsIHRha2UgYSBjb3B5IG9mCittYWtlZmlsZS5hbnNpLCBjaGFuZ2UgYWxsIG9jY3VycmVuY2VzIG9mICdsaWJqcGVnLmEnIHRvICdsaWJqcGVnLm8nIGFuZAorY2hhbmdlIHRoZXNlIGRlZmluaXRpb25zIGFzIGluZGljYXRlZDoKKworQ0ZMQUdTPSAtdGhyb3diYWNrIC1JQzogLVduCitMRExJQlM9QzpvLlN0dWJzCitTWVNERVBNRU09am1lbWFuc2kubworTE49TGluaworQVI9TGliRmlsZSAtYyAtbworCitBbHNvIGFkZCBhIG5ldyBsaW5lICcuYy5vOjsgJChjYykgJDwgJChjZmxhZ3MpIC1jIC1vICRAJy4gIFJlbW92ZSB0aGUKK2xpbmVzICckKFJNKSBsaWJqcGVnLm8nIGFuZCAnJChBUjIpIGxpYmpwZWcubycgYW5kIHRoZSAnamNvbmZpZy5oJworZGVwZW5kZW5jeSBzZWN0aW9uLgorCitDb3B5IGpjb25maWcuZG9jIHRvIGpjb25maWcuaC4gIEVkaXQgamNvbmZpZy5oIHRvIGRlZmluZSBUV09fRklMRV9DT01NQU5ETElORQorYW5kIENIQVJfSVNfVU5TSUdORUQuCisKK1J1biB0aGUgbWFrZWZpbGUgdXNpbmcgIUFNVSBub3QgIU1ha2UuICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlICdjbGVhbicgYW5kCisndGVzdCcgbWFrZWZpbGUgZW50cmllcyB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIHN5bnRheCBhIGJpdAorYW5kIHJlbmFtZSB0aGUgdGVzdCBmaWxlcy4KKworCitBbWlnYToKKworU0FTIEMgNi41MCByZXBvcnRlZGx5IGlzIHRvbyBidWdneSB0byBjb21waWxlIHRoZSBJSkcgY29kZSBwcm9wZXJseS4KK0EgcGF0Y2ggdG8gdXBkYXRlIHRvIDYuNTEgaXMgYXZhaWxhYmxlIGZyb20gU0FTIG9yIEFtaU5ldCBGVFAgc2l0ZXMuCisKK1RoZSBzdXBwbGllZCBjb25maWcgZmlsZXMgYXJlIHNldCB1cCB0byB1c2Ugam1lbW5hbWUuYyBhcyB0aGUgbWVtb3J5CittYW5hZ2VyLCB3aXRoIHRlbXBvcmFyeSBmaWxlcyBiZWluZyBjcmVhdGVkIG9uIHRoZSBkZXZpY2UgbmFtZWQgYnkKKyJKUEVHVE1QOiIuCisKKworQXRhcmkgU1QvU1RFL1RUOgorIAorQ29weSB0aGUgcHJvamVjdCBmaWxlcyBtYWtjanBlZy5zdCwgbWFrZGpwZWcuc3QsIG1ha3RqcGVnLnN0LCBhbmQgbWFrbGpwZWcuc3QKK3RvIGNqcGVnLnByaiwgZGpwZWcucHJqLCBqcGVndHJhbi5wcmosIGFuZCBsaWJqcGVnLnByaiByZXNwZWN0aXZlbHkuICBUaGUKK3Byb2plY3QgZmlsZXMgc2hvdWxkIHdvcmsgYXMtaXMgd2l0aCBQdXJlIEMuICBGb3IgVHVyYm8gQywgY2hhbmdlIGxpYnJhcnkKK2ZpbGVuYW1lcyAicGMuLi4iIHRvICJ0Yy4uLiIgaW4gZWFjaCBwcm9qZWN0IGZpbGUuICBOb3RlIHRoYXQgbGlianBlZy5wcmoKK3NlbGVjdHMgam1lbWFuc2kuYyBhcyB0aGUgcmVjb21tZW5kZWQgbWVtb3J5IG1hbmFnZXIuICBZb3UnbGwgcHJvYmFibHkgd2FudCB0bworYWRqdXN0IHRoZSBERUZBVUxUX01BWF9NRU0gc2V0dGluZyAtLS0geW91IHdhbnQgaXQgdG8gYmUgYSBjb3VwbGUgaHVuZHJlZCBLCitsZXNzIHRoYW4geW91ciBub3JtYWwgZnJlZSBtZW1vcnkuICBQdXQgIiNkZWZpbmUgREVGQVVMVF9NQVhfTUVNIG5ubm4iIGludG8KK2pjb25maWcuaCB0byBkbyB0aGlzLgorCitUbyB1c2UgdGhlIDY4ODgxLzY4ODgyIGNvcHJvY2Vzc29yIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgRENULCBhZGQgdGhlCitjb21waWxlciBvcHRpb24gIi04IiB0byB0aGUgcHJvamVjdCBmaWxlcyBhbmQgcmVwbGFjZSBwY2ZsdGxpYi5saWIgd2l0aAorcGM4ODFsaWIubGliIGluIGNqcGVnLnByaiBhbmQgZGpwZWcucHJqLiAgT3IgaWYgeW91IGRvbid0IGhhdmUgYQorY29wcm9jZXNzb3IsIHlvdSBtYXkgcHJlZmVyIHRvIHJlbW92ZSB0aGUgZmxvYXQgRENUIGNvZGUgYnkgdW5kZWZpbmluZworRENUX0ZMT0FUX1NVUFBPUlRFRCBpbiBqbW9yZWNmZy5oIChzaW5jZSB3aXRob3V0IGEgY29wcm9jZXNzb3IsIHRoZSBmbG9hdAorY29kZSB3aWxsIGJlIHRvbyBzbG93IHRvIGJlIHVzZWZ1bCkuICBJbiB0aGF0IGNhc2UsIHlvdSBjYW4gZGVsZXRlCitwY2ZsdGxpYi5saWIgZnJvbSB0aGUgcHJvamVjdCBmaWxlcy4KKworTm90ZSB0aGF0IHlvdSBtdXN0IG1ha2UgbGlianBlZy5saWIgYmVmb3JlIG1ha2luZyBjanBlZy50dHAsIGRqcGVnLnR0cCwKK29yIGpwZWd0cmFuLnR0cC4gIFlvdSdsbCBoYXZlIHRvIHBlcmZvcm0gdGhlIHNlbGYtdGVzdCBieSBoYW5kLgorCitXZSBoYXZlbid0IGJvdGhlcmVkIHRvIGluY2x1ZGUgcHJvamVjdCBmaWxlcyBmb3IgcmRqcGdjb20gYW5kIHdyanBnY29tLgorVGhvc2Ugc291cmNlIGZpbGVzIHNob3VsZCBqdXN0IGJlIGNvbXBpbGVkIGJ5IHRoZW1zZWx2ZXM7IHRoZXkgZG9uJ3QKK2RlcGVuZCBvbiB0aGUgSlBFRyBsaWJyYXJ5LgorCitUaGVyZSBpcyBhIGJ1ZyBpbiBzb21lIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBUdXJibyBDIGxpYnJhcnkgd2hpY2ggY2F1c2VzIHRoZQorc3BhY2UgdXNlZCBieSB0ZW1wb3JhcnkgZmlsZXMgY3JlYXRlZCB3aXRoICJ0bXBmaWxlKCkiIG5vdCB0byBiZSBmcmVlZCBhZnRlcgorYW4gYWJub3JtYWwgcHJvZ3JhbSBleGl0LiAgSWYgeW91IGNoZWNrIHlvdXIgZGlzayBhZnRlcndhcmRzLCB5b3Ugd2lsbCBmaW5kCitjbHVzdGVyIGNoYWlucyB0aGF0IGFyZSBhbGxvY2F0ZWQgYnV0IG5vdCB1c2VkIGJ5IGEgZmlsZS4gIFRoaXMgc2hvdWxkIG5vdAoraGFwcGVuIGluIGNqcGVnL2RqcGVnL2pwZWd0cmFuLCBzaW5jZSB3ZSBlbmFibGUgYSBzaWduYWwgY2F0Y2hlciB0byBleHBsaWNpdGx5CitjbG9zZSB0ZW1wIGZpbGVzIGJlZm9yZSBleGl0aW5nLiAgQnV0IGlmIHlvdSB1c2UgdGhlIEpQRUcgbGlicmFyeSB3aXRoIHlvdXIKK293biBjb2RlLCBiZSBzdXJlIHRvIHN1cHBseSBhIHNpZ25hbCBjYXRjaGVyLCBvciBlbHNlIHVzZSBhIGRpZmZlcmVudAorc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlci4KKworCitDcmF5OgorCitTaG91bGQgeW91IGJlIHNvIGZvcnR1bmF0ZSBhcyB0byBiZSBydW5uaW5nIEpQRUcgb24gYSBDcmF5IFlNUCwgdGhlcmUgaXMgYQorY29tcGlsZXIgYnVnIGluIG9sZCB2ZXJzaW9ucyBvZiBDcmF5J3MgU3RhbmRhcmQgQyAocHJpb3IgdG8gMy4xKS4gIElmIHlvdQorc3RpbGwgaGF2ZSBhbiBvbGQgY29tcGlsZXIsIHlvdSdsbCBuZWVkIHRvIGluc2VydCBhIGxpbmUgcmVhZGluZworIiNwcmFnbWEgbm92ZWN0b3IiIGp1c3QgYmVmb3JlIHRoZSBsb29wCQorICAgIGZvciAoaSA9IDE7IGkgPD0gKGludCkgaHRibC0+Yml0c1tsXTsgaSsrKQorICAgICAgaHVmZnNpemVbcCsrXSA9IChjaGFyKSBsOworaW4gZml4X2h1ZmZfdGJsIChpbiBWNWJldGExLCBsaW5lIDIwNCBvZiBqY2h1ZmYuYyBhbmQgbGluZSAxNzYgb2YgamRodWZmLmMpLgorW1RoaXMgYnVnIG1heSBvciBtYXkgbm90IHN0aWxsIG9jY3VyIHdpdGggdGhlIGN1cnJlbnQgSUpHIGNvZGUsIGJ1dCBpdCdzCitwcm9iYWJseSBhIGRlYWQgaXNzdWUgYW55d2F5Li4uXQorCisKK0hQLVVYOgorCitJZiB5b3UgaGF2ZSBIUC1VWCA3LjA1IG9yIGxhdGVyIHdpdGggdGhlICJzb2Z0d2FyZSBkZXZlbG9wbWVudCIgQyBjb21waWxlciwKK3lvdSBzaG91bGQgcnVuIHRoZSBjb21waWxlciBpbiBBTlNJIG1vZGUuICBJZiB1c2luZyB0aGUgY29uZmlndXJlIHNjcmlwdCwKK3NheQorCS4vY29uZmlndXJlIENDPSdjYyAtQWEnCisob3IgLUFlIGlmIHlvdSBwcmVmZXIpLiAgSWYgY29uZmlndXJpbmcgYnkgaGFuZCwgdXNlIG1ha2VmaWxlLmFuc2kgYW5kIGFkZAorIi1BYSIgdG8gdGhlIENGTEFHUyBsaW5lIGluIHRoZSBtYWtlZmlsZS4KKworSWYgeW91IGhhdmUgYSBwcmUtNy4wNSBzeXN0ZW0sIG9yIGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5vbi1BTlNJIEMgY29tcGlsZXIKK2RlbGl2ZXJlZCB3aXRoIGEgbWluaW11bSBIUC1VWCBzeXN0ZW0sIHRoZW4geW91IG11c3QgdXNlIG1ha2VmaWxlLnVuaXgKKyhhbmQgZG8gTk9UIGFkZCAtQWEpOyBvciBqdXN0IHJ1biBjb25maWd1cmUgd2l0aG91dCB0aGUgQ0Mgb3B0aW9uLgorCitPbiBIUCA5MDAwIHNlcmllcyA4MDAgbWFjaGluZXMsIHRoZSBIUCBDIGNvbXBpbGVyIGlzIGJ1Z2d5IGluIHJldmlzaW9ucyBwcmlvcgordG8gQS4wOC4wNy4gIElmIHlvdSBnZXQgY29tcGxhaW50cyBhYm91dCAibm90IGEgdHlwZWRlZiBuYW1lIiwgeW91J2xsIGhhdmUgdG8KK3VzZSBtYWtlZmlsZS51bml4LCBvciBydW4gY29uZmlndXJlIHdpdGhvdXQgdGhlIENDIG9wdGlvbi4KKworCitNYWNpbnRvc2gsIGdlbmVyaWMgY29tbWVudHM6CisKK1RoZSBzdXBwbGllZCB1c2VyLWludGVyZmFjZSBmaWxlcyAoY2pwZWcuYywgZGpwZWcuYywgZXRjKSBhcmUgc2V0IHVwIHRvCitwcm92aWRlIGEgVW5peC1zdHlsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLiAgWW91IGNhbiB1c2UgdGhpcyBpbnRlcmZhY2Ugb24KK3RoZSBNYWMgYnkgbWVhbnMgb2YgdGhlIGNjb21tYW5kKCkgbGlicmFyeSByb3V0aW5lIHByb3ZpZGVkIGJ5IE1ldHJvd2Vya3MKK0NvZGVXYXJyaW9yIG9yIFRoaW5rIEMuICBUaGlzIGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIHRlc3RpbmcgdGhlIGxpYnJhcnksCitob3dldmVyOyB0byBtYWtlIGEgdXNlci1mcmllbmRseSBlcXVpdmFsZW50IG9mIGNqcGVnL2RqcGVnIHlvdSdkIHJlYWxseSB3YW50Cit0byBkZXZlbG9wIGEgTWFjLXN0eWxlIHVzZXIgaW50ZXJmYWNlLiAgVGhlcmUgaXNuJ3QgYSBjb21wbGV0ZSBleGFtcGxlCithdmFpbGFibGUgYXQgdGhlIG1vbWVudCwgYnV0IHRoZXJlIGFyZSBzb21lIGhlbHBmdWwgc3RhcnRpbmcgcG9pbnRzOgorMS4gU2FtIEJ1c2hlbGwncyBmcmVlICJUbyBKUEVHIiBhcHBsZXQgcHJvdmlkZXMgZHJhZy1hbmQtZHJvcCBjb252ZXJzaW9uIHRvCitKUEVHIHVuZGVyIFN5c3RlbSA3IGFuZCBsYXRlci4gIFRoaXMgb25seSBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIHRoZQorY29tcHJlc3Npb24gaGFsZiBvZiB0aGUgbGlicmFyeSwgYnV0IGl0IGRvZXMgYSB2ZXJ5IG5pY2Ugam9iIG9mIHRoYXQgcGFydC4KK1RoZSBDb2RlV2FycmlvciBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LnBvYm94LmNvbS9+anNhbS4KKzIuIEppbSBCcnVubmVyIHByZXBhcmVkIGEgTWFjLXN0eWxlIHVzZXIgaW50ZXJmYWNlIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZAorZGVjb21wcmVzc2lvbi4gIFVuZm9ydHVuYXRlbHksIGl0IGhhc24ndCBiZWVuIHVwZGF0ZWQgc2luY2UgSUpHIHY0LCBhbmQKK3RoZSBsaWJyYXJ5J3MgQVBJIGhhcyBjaGFuZ2VkIGNvbnNpZGVyYWJseSBzaW5jZSB0aGVuLiAgU3RpbGwgaXQgbWF5IGJlIG9mCitzb21lIGhlbHAsIHBhcnRpY3VsYXJseSBhcyBhIGd1aWRlIHRvIGNvbXBpbGluZyB0aGUgSUpHIGNvZGUgdW5kZXIgVGhpbmsgQy4KK0ppbSdzIGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gdGhlIEluZm8tTWFjIGFyY2hpdmVzLCBhdCBzdW1leC1haW0uc3RhbmZvcmQuZWR1CitvciBtaXJyb3JzIHRoZXJlb2Y7IHNlZSBmaWxlIC9pbmZvLW1hYy9kZXYvc3JjL2pwZWctY29udmVydC1jLmhxeC4KKworam1lbW1hYy5jIGlzIHRoZSByZWNvbW1lbmRlZCBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCBmb3IgTWFjaW50b3NoLiAgSXQgdXNlcworTmV3UHRyL0Rpc3Bvc2VQdHIgaW5zdGVhZCBvZiBtYWxsb2MvZnJlZSwgYW5kIGhhcyBhIE1hYy1zcGVjaWZpYworaW1wbGVtZW50YXRpb24gb2YganBlZ19tZW1fYXZhaWxhYmxlKCkuICBJdCBhbHNvIGNyZWF0ZXMgdGVtcG9yYXJ5IGZpbGVzIHRoYXQKK2ZvbGxvdyBNYWMgY29udmVudGlvbnMuICAoVGhhdCBwYXJ0IG9mIHRoZSBjb2RlIHJlbGllcyBvbiBTeXN0ZW0tNy1vci1sYXRlciBPUworZnVuY3Rpb25zLiAgU2VlIHRoZSBjb21tZW50cyBpbiBqbWVtbWFjLmMgaWYgeW91IG5lZWQgdG8gcnVuIGl0IG9uIFN5c3RlbSA2LikKK05PVEUgdGhhdCBVU0VfTUFDX01FTU1HUiBtdXN0IGJlIGRlZmluZWQgaW4gamNvbmZpZy5oIHRvIHVzZSBqbWVtbWFjLmMuCisKK1lvdSBjYW4gYWxzbyB1c2Ugam1lbW5vYnMuYywgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGFuZGxpbmcgaW1hZ2VzIGxhcmdlcgordGhhbiBhdmFpbGFibGUgbWVtb3J5LiAgSWYgeW91IHVzZSBhbnkgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgb3RoZXIgdGhhbgoram1lbW1hYy5jLCB3ZSByZWNvbW1lbmQgcmVwbGFjaW5nICJtYWxsb2MiIGFuZCAiZnJlZSIgYnkgIk5ld1B0ciIgYW5kCisiRGlzcG9zZVB0ciIsIGJlY2F1c2UgTWFjIEMgbGlicmFyaWVzIG9mdGVuIGhhdmUgcGVjdWxpYXIgaW1wbGVtZW50YXRpb25zIG9mCittYWxsb2MvZnJlZS4gIChGb3IgaW5zdGFuY2UsIGZyZWUoKSBtYXkgbm90IHJldHVybiB0aGUgZnJlZWQgc3BhY2UgdG8gdGhlCitNYWMgTWVtb3J5IE1hbmFnZXIuICBUaGlzIGlzIHVuZGVzaXJhYmxlIGZvciB0aGUgSUpHIGNvZGUgYmVjYXVzZSBqbWVtbWdyLmMKK2FscmVhZHkgY2x1bXBzIHNwYWNlIHJlcXVlc3RzLikKKworCitNYWNpbnRvc2gsIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6CisKK1RoZSBVbml4LWNvbW1hbmQtbGluZS1zdHlsZSBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgYnkgZGVmaW5pbmcgVVNFX0NDT01NQU5ELgorWW91J2xsIGFsc28gbmVlZCB0byBkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUgdG8gYXZvaWQgc3RkaW4vc3Rkb3V0LgorVGhpcyBtZWFucyB0aGF0IHdoZW4gdXNpbmcgdGhlIGNqcGVnL2RqcGVnIHByb2dyYW1zLCB5b3UnbGwgaGF2ZSB0byB0eXBlIHRoZQoraW5wdXQgYW5kIG91dHB1dCBmaWxlIG5hbWVzIGluIHRoZSAiQXJndW1lbnRzIiB0ZXh0LWVkaXQgYm94LCByYXRoZXIgdGhhbgordXNpbmcgdGhlIGZpbGUgcmFkaW8gYnV0dG9ucy4gIChQZXJoYXBzIFVTRV9GRE9QRU4gb3IgVVNFX1NFVE1PREUgd291bGQKK2VsaW1pbmF0ZSB0aGUgcHJvYmxlbSwgYnV0IEkgaGF2ZW4ndCBoZWFyZCBmcm9tIGFueW9uZSB3aG8ncyB0cmllZCBpdC4pCisKK09uIDY4MHgwIE1hY3MsIE1ldHJvd2Vya3MgZGVmaW5lcyB0eXBlICJkb3VibGUiIGFzIGEgMTAtYnl0ZSBJRUVFIGV4dGVuZGVkCitmbG9hdC4gIGptZW1tZ3IuYyB3b24ndCBsaWtlIHRoaXM6IGl0IHdhbnRzIHNpemVvZihBTElHTl9UWVBFKSB0byBiZSBhIHBvd2VyCitvZiAyLiAgQWRkICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgdG8gamNvbmZpZy5oIHRvIGVsaW1pbmF0ZSB0aGUgY29tcGxhaW50LgorCitUaGUgc3VwcGxpZWQgY29uZmlndXJhdGlvbiBmaWxlIGpjb25maWcubWFjIGNhbiBiZSB1c2VkIGZvciB5b3VyIGpjb25maWcuaDsKK2l0IGluY2x1ZGVzIGFsbCB0aGUgcmVjb21tZW5kZWQgc3ltYm9sIGRlZmluaXRpb25zLiAgSWYgeW91IGhhdmUgQXBwbGVTY3JpcHQKK2luc3RhbGxlZCwgeW91IGNhbiBydW4gdGhlIHN1cHBsaWVkIHNjcmlwdCBtYWtlcHJvai5tYWMgdG8gY3JlYXRlIENvZGVXYXJyaW9yCitwcm9qZWN0IGZpbGVzIGZvciB0aGUgbGlicmFyeSBhbmQgdGhlIHRlc3RiZWQgYXBwbGljYXRpb25zLCB0aGVuIGJ1aWxkIHRoZQorbGlicmFyeSBhbmQgYXBwbGljYXRpb25zLiAgKFRoYW5rcyB0byBEYW4gU2VhcnMgYW5kIERvbiBBZ3JvIGZvciB0aGlzIG5pZnR5CitoYWNrLCB3aGljaCBzYXZlcyB1cyBmcm9tIHRyeWluZyB0byBtYWludGFpbiBDb2RlV2FycmlvciBwcm9qZWN0IGZpbGVzIGFzIHBhcnQKK29mIHRoZSBJSkcgZGlzdHJpYnV0aW9uLi4uKQorCisKK01hY2ludG9zaCwgVGhpbmsgQzoKKworVGhlIGRvY3VtZW50YXRpb24gaW4gSmltIEJydW5uZXIncyAiSlBFRyBDb252ZXJ0IiBzb3VyY2UgY29kZSAoc2VlIGFib3ZlKQoraW5jbHVkZXMgZGV0YWlsZWQgYnVpbGQgaW5zdHJ1Y3Rpb25zIGZvciBUaGluayBDOyBpdCdzIHByb2JhYmx5IHNvbWV3aGF0CitvdXQgb2YgZGF0ZSBmb3IgdGhlIGN1cnJlbnQgcmVsZWFzZSwgYnV0IG1heSBiZSBoZWxwZnVsLgorCitJZiB5b3Ugd2FudCB0byBidWlsZCB0aGUgbWluaW1hbCBjb21tYW5kIGxpbmUgdmVyc2lvbiwgcHJvY2VlZCBhcyBmb2xsb3dzLgorWW91J2xsIGhhdmUgdG8gcHJlcGFyZSBwcm9qZWN0IGZpbGVzIGZvciB0aGUgcHJvZ3JhbXM7IHdlIGRvbid0IGluY2x1ZGUgYW55CitpbiB0aGUgZGlzdHJpYnV0aW9uIHNpbmNlIHRoZXkgYXJlIG5vdCB0ZXh0IGZpbGVzLiAgVXNlIHRoZSBmaWxlIGxpc3RzIGluCithbnkgb2YgdGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBhcyBhIGd1aWRlLiAgQWxzbyBhZGQgdGhlIEFOU0kgYW5kIFVuaXggQworbGlicmFyaWVzIGluIGEgc2VwYXJhdGUgc2VnbWVudC4gIFlvdSBtYXkgbmVlZCB0byBkaXZpZGUgdGhlIEpQRUcgZmlsZXMgaW50bworbW9yZSB0aGFuIG9uZSBzZWdtZW50OyB3ZSByZWNvbW1lbmQgZGl2aWRpbmcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK21vZHVsZXMuICBEZWZpbmUgVVNFX0NDT01NQU5EIGluIGpjb25maWcuaCBzbyB0aGF0IHRoZSBjY29tbWFuZCgpIHJvdXRpbmUgaXMKK2NhbGxlZC4gIFlvdSBtdXN0IGFsc28gZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FIGJlY2F1c2Ugc3RkaW4vc3Rkb3V0Citkb24ndCBoYW5kbGUgYmluYXJ5IGRhdGEgY29ycmVjdGx5LgorCitPbiA2ODB4MCBNYWNzLCBUaGluayBDIGRlZmluZXMgdHlwZSAiZG91YmxlIiBhcyBhIDEyLWJ5dGUgSUVFRSBleHRlbmRlZCBmbG9hdC4KK2ptZW1tZ3IuYyB3b24ndCBsaWtlIHRoaXM6IGl0IHdhbnRzIHNpemVvZihBTElHTl9UWVBFKSB0byBiZSBhIHBvd2VyIG9mIDIuCitBZGQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiB0byBqY29uZmlnLmggdG8gZWxpbWluYXRlIHRoZSBjb21wbGFpbnQuCisKK2pjb25maWcubWFjIHNob3VsZCB3b3JrIGFzIGEgamNvbmZpZy5oIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgVGhpbmsgQywKK2J1dCB0aGUgbWFrZXByb2oubWFjIEFwcGxlU2NyaXB0IHNjcmlwdCBpcyBzcGVjaWZpYyB0byBDb2RlV2Fycmlvci4gIFNvcnJ5LgorCisKK01JUFMgUjMwMDA6CisKK01JUFMncyBjYyB2ZXJzaW9uIDEuMzEgaGFzIGEgcmF0aGVyIG5hc3R5IG9wdGltaXphdGlvbiBidWcuICBEb24ndCB1c2UgLU8KK2lmIHlvdSBoYXZlIHRoYXQgY29tcGlsZXIgdmVyc2lvbi4gIChVc2UgImNjIC1WIiB0byBjaGVjayB0aGUgdmVyc2lvbi4pCitOb3RlIHRoYXQgdGhlIFIzMDAwIGNoaXAgaXMgZm91bmQgaW4gd29ya3N0YXRpb25zIGZyb20gREVDIGFuZCBvdGhlcnMuCisKKworTVMtRE9TLCBnZW5lcmljIGNvbW1lbnRzIGZvciAxNi1iaXQgY29tcGlsZXJzOgorCitUaGUgSUpHIGNvZGUgaXMgZGVzaWduZWQgdG8gd29yayB3ZWxsIGluIDgweDg2ICJzbWFsbCIgb3IgIm1lZGl1bSIgbWVtb3J5Cittb2RlbHMgKGkuZS4sIGRhdGEgcG9pbnRlcnMgYXJlIDE2IGJpdHMgdW5sZXNzIGV4cGxpY2l0bHkgZGVjbGFyZWQgImZhciI7Citjb2RlIHBvaW50ZXJzIGNhbiBiZSBlaXRoZXIgc2l6ZSkuICBZb3UgbWF5IGJlIGFibGUgdG8gdXNlIHNtYWxsIG1vZGVsIHRvCitjb21waWxlIGNqcGVnIG9yIGRqcGVnIGJ5IGl0c2VsZiwgYnV0IHlvdSB3aWxsIHByb2JhYmx5IGhhdmUgdG8gdXNlIG1lZGl1bQorbW9kZWwgZm9yIGFueSBsYXJnZXIgYXBwbGljYXRpb24uICBUaGlzIHdvbid0IG1ha2UgbXVjaCBkaWZmZXJlbmNlIGluCitwZXJmb3JtYW5jZS4gIFlvdSAqd2lsbCogdGFrZSBhIG5vdGljZWFibGUgcGVyZm9ybWFuY2UgaGl0IGlmIHlvdSB1c2UgYQorbGFyZ2UtZGF0YSBtZW1vcnkgbW9kZWwsIGFuZCB5b3Ugc2hvdWxkIGF2b2lkICJodWdlIiBtb2RlbCBpZiBhdCBhbGwKK3Bvc3NpYmxlLiAgQmUgc3VyZSB0aGF0IE5FRURfRkFSX1BPSU5URVJTIGlzIGRlZmluZWQgaW4gamNvbmZpZy5oIGlmIHlvdSB1c2UKK2Egc21hbGwtZGF0YSBtZW1vcnkgbW9kZWw7IGJlIHN1cmUgaXQgaXMgTk9UIGRlZmluZWQgaWYgeW91IHVzZSBhIGxhcmdlLWRhdGEKK21vZGVsLiAgKFRoZSBzdXBwbGllZCBtYWtlZmlsZXMgYW5kIGpjb25maWcgZmlsZXMgZm9yIEJvcmxhbmQgYW5kIE1pY3Jvc29mdCBDCitjb21waWxlIGluIG1lZGl1bSBtb2RlbCBhbmQgZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLikKKworVGhlIERPUy1zcGVjaWZpYyBtZW1vcnkgbWFuYWdlciwgam1lbWRvcy5jLCBzaG91bGQgYmUgdXNlZCBpZiBwb3NzaWJsZS4KK0l0IG5lZWRzIHNvbWUgYXNzZW1ibHktY29kZSByb3V0aW5lcyB3aGljaCBhcmUgaW4gam1lbWRvc2EuYXNtOyBtYWtlIHN1cmUKK3lvdXIgbWFrZWZpbGUgYXNzZW1ibGVzIHRoYXQgZmlsZSBhbmQgaW5jbHVkZXMgaXQgaW4gdGhlIGxpYnJhcnkuICBJZiB5b3UKK2Rvbid0IGhhdmUgYSBzdWl0YWJsZSBhc3NlbWJsZXIsIHlvdSBjYW4gZ2V0IHByZS1hc3NlbWJsZWQgb2JqZWN0IGZpbGVzIGZvcgoram1lbWRvc2EgYnkgRlRQIGZyb20gZnRwLnV1Lm5ldDovZ3JhcGhpY3MvanBlZy9qZG9zYW9iai56aXAuICAoRE9TLW9yaWVudGVkCitkaXN0cmlidXRpb25zIG9mIHRoZSBJSkcgc291cmNlIGNvZGUgb2Z0ZW4gaW5jbHVkZSB0aGVzZSBvYmplY3QgZmlsZXMuKQorCitXaGVuIHVzaW5nIGptZW1kb3MuYywgamNvbmZpZy5oIG11c3QgZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgYW5kIG11c3Qgc2V0CitNQVhfQUxMT0NfQ0hVTksgdG8gbGVzcyB0aGFuIDY0SyAoNjU1MjBMIGlzIGEgdHlwaWNhbCB2YWx1ZSkuICBJZiB5b3VyCitDIGxpYnJhcnkncyBmYXItaGVhcCBtYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBibG9ja3MgdGhhdCBsYXJnZSwgcmVkdWNlCitNQVhfQUxMT0NfQ0hVTksgdG8gd2hhdGV2ZXIgaXQgY2FuIGhhbmRsZS4KKworSWYgeW91IGNhbid0IHVzZSBqbWVtZG9zLmMgZm9yIHNvbWUgcmVhc29uIC0tLSBmb3IgZXhhbXBsZSwgYmVjYXVzZSB5b3UKK2Rvbid0IGhhdmUgYW4gYXNzZW1ibGVyIHRvIGFzc2VtYmxlIGptZW1kb3NhLmFzbSAtLS0geW91J2xsIGhhdmUgdG8gZmFsbAorYmFjayB0byBqbWVtYW5zaS5jIG9yIGptZW1uYW1lLmMuICBZb3UnbGwgcHJvYmFibHkgc3RpbGwgbmVlZCB0byBzZXQKK01BWF9BTExPQ19DSFVOSyBpbiBqY29uZmlnLmgsIGJlY2F1c2UgbW9zdCBET1MgQyBsaWJyYXJpZXMgd29uJ3QgbWFsbG9jKCkKK21vcmUgdGhhbiA2NEsgYXQgYSB0aW1lLiAgSU1QT1JUQU5UOiBpZiB5b3UgdXNlIGptZW1hbnNpLmMgb3Igam1lbW5hbWUuYywKK3lvdSB3aWxsIGhhdmUgdG8gY29tcGlsZSBpbiBhIGxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsIGluIG9yZGVyIHRvIGdldCB0aGUKK3JpZ2h0IHN0ZGlvIGxpYnJhcnkuICBUb28gYmFkLgorCit3cmpwZ2NvbSBuZWVkcyB0byBiZSBjb21waWxlZCBpbiBsYXJnZSBtb2RlbCwgYmVjYXVzZSBpdCBtYWxsb2MoKXMgYSA2NEtCCit3b3JrIGFyZWEgdG8gaG9sZCB0aGUgY29tbWVudCB0ZXh0LiAgSWYgeW91ciBDIGxpYnJhcnkncyBtYWxsb2MgY2FuJ3QKK2hhbmRsZSB0aGF0LCByZWR1Y2UgTUFYX0NPTV9MRU5HVEggYXMgbmVjZXNzYXJ5IGluIHdyanBnY29tLmMuCisKK01vc3QgTVMtRE9TIGNvbXBpbGVycyB0cmVhdCBzdGRpbi9zdGRvdXQgYXMgdGV4dCBmaWxlcywgc28geW91IG11c3QgdXNlCit0d28tZmlsZSBjb21tYW5kIGxpbmUgc3R5bGUuICBCdXQgaWYgeW91ciBjb21waWxlciBoYXMgZWl0aGVyIGZkb3BlbigpIG9yCitzZXRtb2RlKCksIHlvdSBjYW4gdXNlIG9uZS1maWxlIHN0eWxlIGlmIHlvdSBsaWtlLiAgVG8gZG8gdGhpcywgZGVmaW5lCitVU0VfU0VUTU9ERSBvciBVU0VfRkRPUEVOIHNvIHRoYXQgc3RkaW4vc3Rkb3V0IHdpbGwgYmUgc2V0IHRvIGJpbmFyeSBtb2RlLgorKFVTRV9TRVRNT0RFIHNlZW1zIHRvIHdvcmsgd2l0aCBtb3JlIERPUyBjb21waWxlcnMgdGhhbiBVU0VfRkRPUEVOLikgIFlvdQorc2hvdWxkIHRlc3QgdGhhdCBJL08gdGhyb3VnaCBzdGRpbi9zdGRvdXQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0cyBhcyBJL08KK3RvIGV4cGxpY2l0bHkgbmFtZWQgZmlsZXMuLi4gdGhlICJtYWtlIHRlc3QiIHByb2NlZHVyZXMgaW4gdGhlIHN1cHBsaWVkCittYWtlZmlsZXMgZG8gTk9UIHVzZSBzdGRpbi9zdGRvdXQuCisKKworTVMtRE9TLCBnZW5lcmljIGNvbW1lbnRzIGZvciAzMi1iaXQgY29tcGlsZXJzOgorCitOb25lIG9mIHRoZSBhYm92ZSBjb21tZW50cyBhYm91dCBtZW1vcnkgbW9kZWxzIGFwcGx5IGlmIHlvdSBhcmUgdXNpbmcgYQorMzItYml0IGZsYXQtbWVtb3J5LXNwYWNlIGVudmlyb25tZW50LCBzdWNoIGFzIERKR1BQIG9yIFdhdGNvbSBDLiAgKEFuZCB5b3UKK3Nob3VsZCB1c2Ugb25lIGlmIHlvdSBoYXZlIGl0LCBhcyBwZXJmb3JtYW5jZSB3aWxsIGJlIG11Y2ggYmV0dGVyIHRoYW4KKzgwODYtY29tcGF0aWJsZSBjb2RlISkgIEZvciBmbGF0LW1lbW9yeS1zcGFjZSBjb21waWxlcnMsIGRvIE5PVCBkZWZpbmUKK05FRURfRkFSX1BPSU5URVJTLCBhbmQgZG8gTk9UIHVzZSBqbWVtZG9zLmMuICBVc2Ugam1lbW5vYnMuYyBpZiB0aGUKK2Vudmlyb25tZW50IHN1cHBsaWVzIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5LCBvdGhlcndpc2UgdXNlIGptZW1hbnNpLmMgb3IKK2ptZW1uYW1lLmMuCisKK1lvdSdsbCBzdGlsbCBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgYmluYXJ5IEkvTyB0aHJvdWdoIHN0ZGluL3N0ZG91dC4KK1NlZSB0aGUgbGFzdCBwYXJhZ3JhcGggb2YgdGhlIHByZXZpb3VzIHNlY3Rpb24uCisKKworTVMtRE9TLCBCb3JsYW5kIEM6CisKK0JlIHN1cmUgdG8gY29udmVydCBhbGwgdGhlIHNvdXJjZSBmaWxlcyB0byBET1MgdGV4dCBmb3JtYXQgKENSL0xGIG5ld2xpbmVzKS4KK0FsdGhvdWdoIEJvcmxhbmQgQyB3aWxsIG9mdGVuIHdvcmsgT0sgd2l0aCB1bm1vZGlmaWVkIFVuaXggKExGIG5ld2xpbmVzKQorc291cmNlIGZpbGVzLCBzb21ldGltZXMgaXQgd2lsbCBnaXZlIGJvZ3VzIGNvbXBpbGUgZXJyb3JzLgorIklsbGVnYWwgY2hhcmFjdGVyICcjJyIgaXMgdGhlIG1vc3QgY29tbW9uIHN1Y2ggZXJyb3IuICAoVGhpcyBpcyB0cnVlIHdpdGgKK0JvcmxhbmQgQyAzLjEsIGJ1dCBwZXJoYXBzIGlzIGZpeGVkIGluIG5ld2VyIHJlbGVhc2VzLikKKworSWYgeW91IHdhbnQgb25lLWZpbGUgY29tbWFuZCBsaW5lIHN0eWxlLCBqdXN0IHVuZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FLgoramNvbmZpZy5iY2MgYWxyZWFkeSBpbmNsdWRlcyAjZGVmaW5lIFVTRV9TRVRNT0RFIHRvIG1ha2UgdGhpcyB3b3JrLgorKGZkb3BlbiBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseS4pCisKKworTVMtRE9TLCBNaWNyb3NvZnQgQzoKKworbWFrZWZpbGUubWM2IHdvcmtzIHdpdGggTWljcm9zb2Z0IEMsIERPUyBWaXN1YWwgQysrLCBldGMuICBJdCBzaG91bGQgb25seQorYmUgdXNlZCBpZiB5b3Ugd2FudCB0byBidWlsZCBhIDE2LWJpdCAoc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCkgcHJvZ3JhbS4KKworSWYgeW91IHdhbnQgb25lLWZpbGUgY29tbWFuZCBsaW5lIHN0eWxlLCBqdXN0IHVuZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FLgoramNvbmZpZy5tYzYgYWxyZWFkeSBpbmNsdWRlcyAjZGVmaW5lIFVTRV9TRVRNT0RFIHRvIG1ha2UgdGhpcyB3b3JrLgorKGZkb3BlbiBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseS4pCisKK05vdGUgdGhhdCB0aGlzIG1ha2VmaWxlIGFzc3VtZXMgdGhhdCB0aGUgd29ya2luZyBjb3B5IG9mIGl0c2VsZiBpcyBjYWxsZWQKKyJtYWtlZmlsZSIuICBJZiB5b3Ugd2FudCB0byBjYWxsIGl0IHNvbWV0aGluZyBlbHNlLCBzYXkgIm1ha2VmaWxlLm1hayIsCitiZSBzdXJlIHRvIGFkanVzdCB0aGUgZGVwZW5kZW5jeSBsaW5lIHRoYXQgcmVhZHMgIiQoUkZJTEUpIDogbWFrZWZpbGUiLgorT3RoZXJ3aXNlIHRoZSBtYWtlIHdpbGwgZmFpbCBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgdG8gY3JlYXRlICJtYWtlZmlsZSIuCitXb3JzZSwgc29tZSByZWxlYXNlcyBvZiBNaWNyb3NvZnQncyBtYWtlIHV0aWxpdGllcyBnaXZlIGFuIGluY29ycmVjdCBlcnJvcgorbWVzc2FnZSBpbiB0aGlzIHNpdHVhdGlvbi4KKworT2xkIHZlcnNpb25zIG9mIE1TIEMgZmFpbCB3aXRoIGFuICJvdXQgb2YgbWFjcm8gZXhwYW5zaW9uIHNwYWNlIiBlcnJvcgorYmVjYXVzZSB0aGV5IGNhbid0IGNvcGUgd2l0aCB0aGUgbWFjcm8gVFJBQ0VNUzggKGRlZmluZWQgaW4gamVycm9yLmgpLgorSWYgdGhpcyBoYXBwZW5zIHRvIHlvdSwgdGhlIGVhc2llc3Qgc29sdXRpb24gaXMgdG8gY2hhbmdlIFRSQUNFTVM4IHRvCitleHBhbmQgdG8gbm90aGluZy4gIFlvdSdsbCBsb3NlIHRoZSBhYmlsaXR5IHRvIGR1bXAgb3V0IEpQRUcgY29lZmZpY2llbnQKK3RhYmxlcyB3aXRoIGRqcGVnIC1kZWJ1ZyAtZGVidWcsIGJ1dCBhdCBsZWFzdCB5b3UgY2FuIGNvbXBpbGUuCisKK09yaWdpbmFsIE1TIEMgNi4wIGlzIHZlcnkgYnVnZ3k7IGl0IGNvbXBpbGVzIGluY29ycmVjdCBjb2RlIHVubGVzcyB5b3UgdHVybgorb2ZmIG9wdGltaXphdGlvbiBlbnRpcmVseSAocmVtb3ZlIC1PIGZyb20gQ0ZMQUdTKS4gIDYuMDBBIGlzIGJldHRlciwgYnV0IGl0CitzdGlsbCBnZW5lcmF0ZXMgYmFkIGNvZGUgaWYgeW91IGVuYWJsZSBsb29wIG9wdGltaXphdGlvbnMgKC1PbCBvciAtT3gpLgorCitNUyBDIDguMCBjcmFzaGVzIHdoZW4gY29tcGlsaW5nIGpxdWFudDEuYyB3aXRoIG9wdGltaXphdGlvbiBzd2l0Y2ggL09vIC4uLgord2hpY2ggaXMgb24gYnkgZGVmYXVsdC4gIFRvIHdvcmsgYXJvdW5kIHRoaXMgYnVnLCBjb21waWxlIHRoYXQgb25lIGZpbGUKK3dpdGggL09vLS4KKworCitNaWNyb3NvZnQgV2luZG93cyAoYWxsIHZlcnNpb25zKSwgZ2VuZXJpYyBjb21tZW50czoKKworU29tZSBXaW5kb3dzIHN5c3RlbSBpbmNsdWRlIGZpbGVzIGRlZmluZSB0eXBlZGVmIGJvb2xlYW4gYXMgInVuc2lnbmVkIGNoYXIiLgorVGhlIElKRyBjb2RlIGFsc28gZGVmaW5lcyB0eXBlZGVmIGJvb2xlYW4sIGJ1dCB3ZSBtYWtlIGl0ICJpbnQiIGJ5IGRlZmF1bHQuCitUaGlzIGRvZXNuJ3QgYWZmZWN0IHRoZSBJSkcgcHJvZ3JhbXMgYmVjYXVzZSB3ZSBkb24ndCBpbXBvcnQgdGhvc2UgV2luZG93cworaW5jbHVkZSBmaWxlcy4gIEJ1dCBpZiB5b3UgdXNlIHRoZSBKUEVHIGxpYnJhcnkgaW4geW91ciBvd24gcHJvZ3JhbSwgYW5kIHNvbWUKK29mIHlvdXIgcHJvZ3JhbSdzIGZpbGVzIGltcG9ydCBvbmUgZGVmaW5pdGlvbiBvZiBib29sZWFuIHdoaWxlIHNvbWUgaW1wb3J0IHRoZQorb3RoZXIsIHlvdSBjYW4gZ2V0IGFsbCBzb3J0cyBvZiBteXN0ZXJpb3VzIHByb2JsZW1zLiAgQSBnb29kIHByZXZlbnRpdmUgc3RlcAoraXMgdG8gbWFrZSB0aGUgSUpHIGxpYnJhcnkgdXNlICJ1bnNpZ25lZCBjaGFyIiBmb3IgYm9vbGVhbi4gIFRvIGRvIHRoYXQsCithZGQgc29tZXRoaW5nIGxpa2UgdGhpcyB0byB5b3VyIGpjb25maWcuaCBmaWxlOgorCS8qIERlZmluZSAiYm9vbGVhbiIgYXMgdW5zaWduZWQgY2hhciwgbm90IGludCwgcGVyIFdpbmRvd3MgY3VzdG9tICovCisJI2lmbmRlZiBfX1JQQ05EUl9IX18JLyogZG9uJ3QgY29uZmxpY3QgaWYgcnBjbmRyLmggYWxyZWFkeSByZWFkICovCisJdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJvb2xlYW47CisJI2VuZGlmCisJI2RlZmluZSBIQVZFX0JPT0xFQU4JLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLworKFRoaXMgaXMgYWxyZWFkeSBpbiBqY29uZmlnLnZjLCBieSB0aGUgd2F5LikKKword2luZGVmLmggY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucworCSNkZWZpbmUgZmFyCisJI2RlZmluZSBGQVIgZmFyCitTaW5jZSBqbW9yZWNmZy5oIHRyaWVzIHRvIGRlZmluZSBGQVIgYXMgZW1wdHksIHlvdSBtYXkgZ2V0IGEgY29tcGlsZXIKK3dhcm5pbmcgaWYgeW91IGluY2x1ZGUgYm90aCBqcGVnbGliLmggYW5kIHdpbmRlZi5oICh3aGljaCB3aW5kb3dzLmgKK2luY2x1ZGVzKS4gIFRvIHN1cHByZXNzIHRoZSB3YXJuaW5nLCB5b3UgY2FuIHB1dCAiI2lmbmRlZiBGQVIiLyIjZW5kaWYiCithcm91bmQgdGhlIGxpbmUgIiNkZWZpbmUgRkFSIiBpbiBqbW9yZWNmZy5oLgorCitXaGVuIHVzaW5nIHRoZSBsaWJyYXJ5IGluIGEgV2luZG93cyBhcHBsaWNhdGlvbiwgeW91IHdpbGwgYWxtb3N0IGNlcnRhaW5seQord2FudCB0byBtb2RpZnkgb3IgcmVwbGFjZSB0aGUgZXJyb3IgaGFuZGxlciBtb2R1bGUgamVycm9yLmMsIHNpbmNlIG91cgorZGVmYXVsdCBlcnJvciBoYW5kbGVyIGRvZXMgYSBjb3VwbGUgb2YgaW5hcHByb3ByaWF0ZSB0aGluZ3M6CisgIDEuIGl0IHRyaWVzIHRvIHdyaXRlIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIG9uIHN0ZGVycjsKKyAgMi4gaW4gZXZlbnQgb2YgYSBmYXRhbCBlcnJvciwgaXQgZXhpdHMgYnkgY2FsbGluZyBleGl0KCkuCisKK0Egc2ltcGxlIHN0b3BnYXAgc29sdXRpb24gZm9yIHByb2JsZW0gMSBpcyB0byByZXBsYWNlIHRoZSBsaW5lCisJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVmZmVyKTsKKyhpbiBvdXRwdXRfbWVzc2FnZSBpbiBqZXJyb3IuYykgd2l0aAorCU1lc3NhZ2VCb3goR2V0QWN0aXZlV2luZG93KCksYnVmZmVyLCJKUEVHIEVycm9yIixNQl9PS3xNQl9JQ09ORVJST1IpOworSXQncyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXQgbGVhc3QgZG8gdGhhdCBtdWNoLCBzaW5jZSBvdGhlcndpc2UKK2Vycm9yIG1lc3NhZ2VzIHdpbGwgZGlzYXBwZWFyIGludG8gbm93aGVyZS4gIChCZWdpbm5pbmcgd2l0aCBJSkcgdjZiLCB0aGlzCitjb2RlIGlzIGFscmVhZHkgcHJlc2VudCBpbiBqZXJyb3IuYzsganVzdCBkZWZpbmUgVVNFX1dJTkRPV1NfTUVTU0FHRUJPWCBpbgoramNvbmZpZy5oIHRvIGVuYWJsZSBpdC4pCisKK1RoZSBwcm9wZXIgc29sdXRpb24gZm9yIHByb2JsZW0gMiBpcyB0byByZXR1cm4gY29udHJvbCB0byB5b3VyIGNhbGxpbmcKK2FwcGxpY2F0aW9uIGFmdGVyIGEgbGlicmFyeSBlcnJvci4gIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgc2V0am1wL2xvbmdqbXAKK3RlY2huaXF1ZSBkaXNjdXNzZWQgaW4gbGlianBlZy5kb2MgYW5kIGlsbHVzdHJhdGVkIGluIGV4YW1wbGUuYy4gIChOT1RFOgorc29tZSBvbGRlciBXaW5kb3dzIEMgY29tcGlsZXJzIHByb3ZpZGUgdmVyc2lvbnMgb2Ygc2V0am1wL2xvbmdqbXAgdGhhdAorZG9uJ3QgYWN0dWFsbHkgd29yayB1bmRlciBXaW5kb3dzLiAgWW91IG1heSBuZWVkIHRvIHVzZSB0aGUgV2luZG93cyBzeXN0ZW0KK2Z1bmN0aW9ucyBDYXRjaCBhbmQgVGhyb3cgaW5zdGVhZC4pCisKK1RoZSByZWNvbW1lbmRlZCBtZW1vcnkgbWFuYWdlciB1bmRlciBXaW5kb3dzIGlzIGptZW1ub2JzLmM7IGluIG90aGVyIHdvcmRzLAorbGV0IFdpbmRvd3MgZG8gYW55IHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQgbmVlZGVkLiAgWW91IHNob3VsZCBOT1QgdXNlCitqbWVtZG9zLmMgbm9yIGptZW1kb3NhLmFzbSB1bmRlciBXaW5kb3dzLgorCitGb3IgV2luZG93cyAzLjEsIHdlIHJlY29tbWVuZCBjb21waWxpbmcgaW4gbWVkaXVtIG9yIGxhcmdlIG1lbW9yeSBtb2RlbDsKK2ZvciBuZXdlciBXaW5kb3dzIHZlcnNpb25zLCB1c2UgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwuICAoU2VlIHRoZSBNUy1ET1MKK3NlY3Rpb25zIGFib3ZlIGZvciBtb3JlIGluZm8gYWJvdXQgbWVtb3J5IG1vZGVscy4pICBJbiB0aGUgMTYtYml0IG1lbW9yeQorbW9kZWxzIG9ubHksIHlvdSdsbCBuZWVkIHRvIHB1dAorCSNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LIDY1NTIwTAkvKiBNYXhpbXVtIHJlcXVlc3QgdG8gbWFsbG9jKCkgKi8KK2ludG8gamNvbmZpZy5oIHRvIGxpbWl0IGFsbG9jYXRpb24gY2h1bmtzIHRvIDY0S2IuICAoV2l0aG91dCB0aGF0LCB5b3UnZAoraGF2ZSB0byB1c2UgaHVnZSBtZW1vcnkgbW9kZWwsIHdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIHVubmVjZXNzYXJpbHkuKQoram1lbW5vYnMuYyB3b3JrcyB3aXRob3V0IG1vZGlmaWNhdGlvbiBpbiBsYXJnZSBvciBmbGF0IG1lbW9yeSBtb2RlbHMsIGJ1dCB0bwordXNlIG1lZGl1bSBtb2RlbCwgeW91IG5lZWQgdG8gbW9kaWZ5IGl0cyBqcGVnX2dldF9sYXJnZSBhbmQganBlZ19mcmVlX2xhcmdlCityb3V0aW5lcyB0byBhbGxvY2F0ZSBmYXIgbWVtb3J5LiAgSW4gYW55IGNhc2UsIHlvdSBtaWdodCBsaWtlIHRvIHJlcGxhY2UKK2l0cyBjYWxscyB0byBtYWxsb2MgYW5kIGZyZWUgd2l0aCBkaXJlY3QgY2FsbHMgb24gV2luZG93cyBtZW1vcnkgYWxsb2NhdGlvbgorZnVuY3Rpb25zLgorCitZb3UgbWF5IGFsc28gd2FudCB0byBtb2RpZnkgamRhdGFzcmMuYyBhbmQgamRhdGFkc3QuYyB0byB1c2UgV2luZG93cyBmaWxlCitvcGVyYXRpb25zIHJhdGhlciB0aGFuIGZyZWFkL2Z3cml0ZS4gIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgeW91ciBDCitjb21waWxlciBkb2Vzbid0IHByb3ZpZGUgYSBjb21wZXRlbnQgaW1wbGVtZW50YXRpb24gb2YgQyBzdGRpbyBmdW5jdGlvbnMuCisKK1lvdSBtaWdodCB3YW50IHRvIHR3ZWFrIHRoZSBSR0JfeHh4IG1hY3JvcyBpbiBqbW9yZWNmZy5oIHNvIHRoYXQgdGhlIGxpYnJhcnkKK3dpbGwgYWNjZXB0IG9yIGRlbGl2ZXIgY29sb3IgcGl4ZWxzIGluIEJHUiBzYW1wbGUgb3JkZXIsIG5vdCBSR0I7IEJHUiBvcmRlcgoraXMgdXN1YWxseSBtb3JlIGNvbnZlbmllbnQgdW5kZXIgV2luZG93cy4gIE5vdGUgdGhhdCB0aGlzIGNoYW5nZSB3aWxsIGJyZWFrCit0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZy9kanBlZywgYnV0IHRoZSBsaWJyYXJ5IGl0c2VsZiB3b3JrcyBmaW5lLgorCisKK01hbnkgcGVvcGxlIHdhbnQgdG8gY29udmVydCB0aGUgSUpHIGxpYnJhcnkgaW50byBhIERMTC4gIFRoaXMgaXMgcmVhc29uYWJseQorc3RyYWlnaHRmb3J3YXJkLCBidXQgd2F0Y2ggb3V0IGZvciB0aGUgZm9sbG93aW5nOgorCisgIDEuIERvbid0IHRyeSB0byBjb21waWxlIGFzIGEgRExMIGluIHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWw7IHVzZQorbGFyZ2UgbW9kZWwsIG9yIGV2ZW4gYmV0dGVyLCAzMi1iaXQgZmxhdCBtb2RlbC4gIE1hbnkgcGxhY2VzIGluIHRoZSBJSkcgY29kZQorYXNzdW1lIHRoZSBhZGRyZXNzIG9mIGEgbG9jYWwgdmFyaWFibGUgaXMgYW4gb3JkaW5hcnkgKG5vdCBGQVIpIHBvaW50ZXI7Cit0aGF0IGlzbid0IHRydWUgaW4gYSBtZWRpdW0tbW9kZWwgRExMLgorCisgIDIuIE1pY3Jvc29mdCBDIGNhbm5vdCBwYXNzIGZpbGUgcG9pbnRlcnMgYmV0d2VlbiBhcHBsaWNhdGlvbnMgYW5kIERMTHMuCisoU2VlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZSwgUFNTIElEIE51bWJlciBRNTAzMzYuKSAgU28gamRhdGFzcmMuYyBhbmQKK2pkYXRhZHN0LmMgZG9uJ3Qgd29yayBpZiB5b3Ugb3BlbiBhIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlbiBwYXNzCit0aGUgcG9pbnRlciB0byB0aGUgRExMLiAgT25lIHdvcmthcm91bmQgaXMgdG8gbWFrZSBqZGF0YXNyYy5jL2pkYXRhZHN0LmMKK3BhcnQgb2YgeW91ciBtYWluIGFwcGxpY2F0aW9uIHJhdGhlciB0aGFuIHBhcnQgb2YgdGhlIERMTC4KKworICAzLiBZb3UnbGwgcHJvYmFibHkgbmVlZCB0byBtb2RpZnkgdGhlIG1hY3JvcyBHTE9CQUwoKSBhbmQgRVhURVJOKCkgdG8KK2F0dGFjaCBzdWl0YWJsZSBsaW5rYWdlIGtleXdvcmRzIHRvIHRoZSBleHBvcnRlZCByb3V0aW5lIG5hbWVzLiAgU2ltaWxhcmx5LAoreW91J2xsIHdhbnQgdG8gbW9kaWZ5IE1FVEhPRERFRigpIGFuZCBKTUVUSE9EKCkgdG8gZW5zdXJlIGZ1bmN0aW9uIHBvaW50ZXJzCithcmUgZGVjbGFyZWQgaW4gYSB3YXkgdGhhdCBsZXRzIGFwcGxpY2F0aW9uIHJvdXRpbmVzIGJlIGNhbGxlZCBiYWNrIHRocm91Z2gKK3RoZSBmdW5jdGlvbiBwb2ludGVycy4gIFRoZXNlIG1hY3JvcyBhcmUgaW4gam1vcmVjZmcuaC4gIFR5cGljYWwgZGVmaW5pdGlvbnMKK2ZvciBhIDE2LWJpdCBETEwgYXJlOgorCSNkZWZpbmUgR0xPQkFMKHR5cGUpCQl0eXBlIF9mYXIgX3Bhc2NhbCBfbG9hZGRzIF9leHBvcnQKKwkjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIHR5cGUgX2ZhciBfcGFzY2FsIF9sb2FkZHMKKwkjZGVmaW5lIE1FVEhPRERFRih0eXBlKQkJc3RhdGljIHR5cGUgX2ZhciBfcGFzY2FsCisJI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgXAorCQl0eXBlIChfZmFyIF9wYXNjYWwgKm1ldGhvZG5hbWUpIGFyZ2xpc3QKK0ZvciBhIDMyLWJpdCBETEwgeW91IG1heSB3YW50IHNvbWV0aGluZyBsaWtlCisJI2RlZmluZSBHTE9CQUwodHlwZSkJCV9fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlCisJI2RlZmluZSBFWFRFUk4odHlwZSkJCWV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZQorQWx0aG91Z2ggbm90IGFsbCB0aGUgR0xPQkFMIHJvdXRpbmVzIGFyZSBhY3R1YWxseSBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkKK3RoZSBhcHBsaWNhdGlvbiwgdGhlIHBlcmZvcm1hbmNlIGNvc3Qgb2YgbWFraW5nIHRoZW0gYWxsIERMTCBlbnRyeSBwb2ludHMgaXMKK25lZ2xpZ2libGUuCisKK1RoZSB1bm1vZGlmaWVkIElKRyBsaWJyYXJ5IHByZXNlbnRzIGEgdmVyeSBDLXNwZWNpZmljIGFwcGxpY2F0aW9uIGludGVyZmFjZSwKK3NvIHRoZSByZXN1bHRpbmcgRExMIGlzIG9ubHkgdXNhYmxlIGZyb20gQyBvciBDKysgYXBwbGljYXRpb25zLiAgVGhlcmUgaGFzCitiZWVuIHNvbWUgdGFsayBvZiB3cml0aW5nIHdyYXBwZXIgY29kZSB0aGF0IHdvdWxkIHByZXNlbnQgYSBzaW1wbGVyIGludGVyZmFjZQordXNhYmxlIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLCBzdWNoIGFzIFZpc3VhbCBCYXNpYy4gIFRoaXMgaXMgb24gb3VyIHRvLWRvIGxpc3QKK2J1dCBoYXNuJ3QgYmVlbiB2ZXJ5IGhpZ2ggcHJpb3JpdHkgLS0tIGFueSB2b2x1bnRlZXJzIG91dCB0aGVyZT8KKworCitNaWNyb3NvZnQgV2luZG93cywgQm9ybGFuZCBDOgorCitUaGUgcHJvdmlkZWQgamNvbmZpZy5iY2Mgc2hvdWxkIHdvcmsgT0sgaW4gYSAzMi1iaXQgV2luZG93cyBlbnZpcm9ubWVudCwKK2J1dCB5b3UnbGwgbmVlZCB0byB0d2VhayBpdCBpbiBhIDE2LWJpdCBlbnZpcm9ubWVudCAoeW91J2QgbmVlZCB0byBkZWZpbmUKK05FRURfRkFSX1BPSU5URVJTIGFuZCBNQVhfQUxMT0NfQ0hVTkspLiAgQmV3YXJlIHRoYXQgbWFrZWZpbGUuYmNjIHdpbGwgbmVlZAorYWx0ZXJhdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgaXQgZm9yIFdpbmRvd3MgLS0tIGluIHBhcnRpY3VsYXIsIHlvdSBzaG91bGQKK3VzZSBqbWVtbm9icy5jIG5vdCBqbWVtZG9zLmMgdW5kZXIgV2luZG93cy4KKworQm9ybGFuZCBDKysgNC41IGZhaWxzIHdpdGggYW4gaW50ZXJuYWwgY29tcGlsZXIgZXJyb3Igd2hlbiB0cnlpbmcgdG8gY29tcGlsZQoramRtZXJnZS5jIGluIDMyLWJpdCBtb2RlLiAgSWYgZW5vdWdoIHBlb3BsZSBjb21wbGFpbiwgcGVyaGFwcyBCb3JsYW5kIHdpbGwgZml4CitpdC4gIEluIHRoZSBtZWFudGltZSwgdGhlIHNpbXBsZXN0IGtub3duIHdvcmthcm91bmQgaXMgdG8gYWRkIGEgcmVkdW5kYW50CitkZWZpbml0aW9uIG9mIHRoZSB2YXJpYWJsZSByYW5nZV9saW1pdCBpbiBoMnYxX21lcmdlZF91cHNhbXBsZSgpLCBhdCB0aGUgaGVhZAorb2YgdGhlIGJsb2NrIHRoYXQgaGFuZGxlcyBvZGQgaW1hZ2Ugd2lkdGggKGFib3V0IGxpbmUgMjY4IGluIHY2IGpkbWVyZ2UuYyk6CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7IC8qIEFERCBUSElTICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworUHJldHR5IGJpemFycmUsIGVzcGVjaWFsbHkgc2luY2UgdGhlIHZlcnkgc2ltaWxhciByb3V0aW5lIGgydjJfbWVyZ2VkX3Vwc2FtcGxlCitkb2Vzbid0IHRyaWdnZXIgdGhlIGJ1Zy4KK1JlY2VudCByZXBvcnRzIHN1Z2dlc3QgdGhhdCB0aGlzIGJ1ZyBkb2VzIG5vdCBvY2N1ciB3aXRoICJiY2MzMmEiICh0aGUKK1BlbnRpdW0tb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGNvbXBpbGVyKS4KKworQW5vdGhlciByZXBvcnQgZnJvbSBhIHVzZXIgb2YgQm9ybGFuZCBDIDQuNSB3YXMgdGhhdCBpbmNvcnJlY3QgY29kZSAobGVhZGluZwordG8gYSBjb2xvciBzaGlmdCBpbiBwcm9jZXNzZWQgaW1hZ2VzKSB3YXMgcHJvZHVjZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcKK29wdGltaXphdGlvbiBzd2l0Y2ggY29tYmluYXRpb25zIHdlcmUgdXNlZDogCisJLU90IC1PZworCS1PdCAtT3AKKwktT3QgLU9tCitTbyB0cnkgYmFja2luZyBvZmYgb24gb3B0aW1pemF0aW9uIGlmIHlvdSBzZWUgc3VjaCBhIHByb2JsZW0uICAoQXJlIHRoZXJlCitzZXZlcmFsIGRpZmZlcmVudCByZWxlYXNlcyBhbGwgbnVtYmVyZWQgIjQuNSI/PykKKworCitNaWNyb3NvZnQgV2luZG93cywgTWljcm9zb2Z0IFZpc3VhbCBDKys6CisKK2pjb25maWcudmMgc2hvdWxkIHdvcmsgT0sgd2l0aCBhbnkgTWljcm9zb2Z0IGNvbXBpbGVyIGZvciBhIDMyLWJpdCBtZW1vcnkKK21vZGVsLiAgbWFrZWZpbGUudmMgaXMgaW50ZW5kZWQgZm9yIGNvbW1hbmQtbGluZSB1c2UuICAoSWYgeW91IGFyZSB1c2luZwordGhlIERldmVsb3BlciBTdHVkaW8gZW52aXJvbm1lbnQsIHlvdSBtYXkgcHJlZmVyIHRoZSBEZXZTdHVkaW8gcHJvamVjdAorZmlsZXM7IHNlZSBiZWxvdy4pCisKK1NvbWUgdXNlcnMgZmVlbCB0aGF0IGl0J3MgZWFzaWVyIHRvIGNhbGwgdGhlIGxpYnJhcnkgZnJvbSBDKysgY29kZSBpZiB5b3UKK2ZvcmNlIFZDKysgdG8gdHJlYXQgdGhlIGxpYnJhcnkgYXMgQysrIGNvZGUsIHdoaWNoIHlvdSBjYW4gZG8gYnkgcmVuYW1pbmcKK2FsbCB0aGUgKi5jIGZpbGVzIHRvICouY3BwIChhbmQgYWRqdXN0aW5nIHRoZSBtYWtlZmlsZSB0byBtYXRjaCkuICBUaGlzCithdm9pZHMgdGhlIG5lZWQgdG8gcHV0IGV4dGVybiAiQyIgeyAuLi4gfSBhcm91bmQgI2luY2x1ZGUgImpwZWdsaWIuaCIgaW4KK3lvdXIgQysrIGFwcGxpY2F0aW9uLgorCisKK01pY3Jvc29mdCBXaW5kb3dzLCBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbzoKKworV2UgaW5jbHVkZSBtYWtlZmlsZXMgdGhhdCBzaG91bGQgd29yayBhcyBwcm9qZWN0IGZpbGVzIGluIERldlN0dWRpbyA0LjIgb3IKK2xhdGVyLiAgVGhlcmUgaXMgYSBsaWJyYXJ5IG1ha2VmaWxlIHRoYXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIHN0YXRpYworV2luMzIgbGlicmFyeSwgYW5kIGFuIGFwcGxpY2F0aW9uIG1ha2VmaWxlIHRoYXQgYnVpbGRzIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zCithcyBXaW4zMiBjb25zb2xlIGFwcGxpY2F0aW9ucy4gIChFdmVuIGlmIHlvdSBvbmx5IHdhbnQgdGhlIGxpYnJhcnksIHdlCityZWNvbW1lbmQgYnVpbGRpbmcgdGhlIGFwcGxpY2F0aW9ucyBzbyB0aGF0IHlvdSBjYW4gcnVuIHRoZSBzZWxmLXRlc3QuKQorCitUbyB1c2U6CisxLiBDb3B5IGpjb25maWcudmMgdG8gamNvbmZpZy5oLCBtYWtlbGliLmRzIHRvIGpwZWcubWFrLCBhbmQKKyAgIG1ha2VhcHBzLmRzIHRvIGFwcHMubWFrLiAgKE5vdGUgdGhhdCB0aGUgcmVuYW1pbmcgaXMgY3JpdGljYWwhKQorMi4gQ2xpY2sgb24gdGhlIC5tYWsgZmlsZXMgdG8gY29uc3RydWN0IHByb2plY3Qgd29ya3NwYWNlcy4KKyAgIChJZiB5b3UgYXJlIHVzaW5nIERldlN0dWRpbyBtb3JlIHJlY2VudCB0aGFuIDQuMiwgeW91J2xsIHByb2JhYmx5CisgICBnZXQgYSBtZXNzYWdlIHNheWluZyB0aGF0IHRoZSBtYWtlZmlsZXMgYXJlIGJlaW5nIHVwZGF0ZWQuKQorMy4gQnVpbGQgdGhlIGxpYnJhcnkgcHJvamVjdCwgdGhlbiB0aGUgYXBwbGljYXRpb25zIHByb2plY3QuCis0LiBNb3ZlIHRoZSBhcHBsaWNhdGlvbiAuZXhlIGZpbGVzIGZyb20gYGFwcGBcUmVsZWFzZSB0byBhbgorICAgYXBwcm9wcmlhdGUgbG9jYXRpb24gb24geW91ciBwYXRoLgorNS4gVG8gcGVyZm9ybSB0aGUgc2VsZi10ZXN0LCBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUKKwlOTUFLRSAvZiBtYWtlZmlsZS52YyAgdGVzdAorCisKK09TLzIsIEJvcmxhbmQgQysrOgorCitXYXRjaCBvdXQgZm9yIG9wdGltaXphdGlvbiBidWdzIGluIG9sZGVyIEJvcmxhbmQgY29tcGlsZXJzOyB5b3UgbWF5IG5lZWQKK3RvIGJhY2sgb2ZmIHRoZSBvcHRpbWl6YXRpb24gc3dpdGNoIHNldHRpbmdzLiAgU2VlIHRoZSBjb21tZW50cyBpbgorbWFrZWZpbGUuYmNjLgorCisKK1NHSToKKworT24gc29tZSBTR0kgc3lzdGVtcywgeW91IG1heSBuZWVkIHRvIHNldCAiQVIyPSBhciAtdHMiIGluIHRoZSBNYWtlZmlsZS4KK0lmIHlvdSBhcmUgdXNpbmcgY29uZmlndXJlLCB5b3UgY2FuIGRvIHRoaXMgYnkgc2F5aW5nCisJLi9jb25maWd1cmUgUkFOTElCPSdhciAtdHMnCitUaGlzIGNoYW5nZSBpcyBub3QgbmVlZGVkIG9uIGFsbCBTR0lzLiAgVXNlIGl0IG9ubHkgaWYgdGhlIG1ha2UgZmFpbHMgYXQgdGhlCitzdGFnZSBvZiBsaW5raW5nIHRoZSBjb21wbGV0ZWQgcHJvZ3JhbXMuCisKK09uIHRoZSBNSVBTIFI0MDAwIGFyY2hpdGVjdHVyZSAoSW5keSwgZXRjLiksIHRoZSBjb21waWxlciBvcHRpb24gIi1taXBzMiIKK3JlcG9ydGVkbHkgc3BlZWRzIHVwIHRoZSBmbG9hdCBEQ1QgbWV0aG9kIHN1YnN0YW50aWFsbHksIGVub3VnaCB0byBtYWtlIGl0CitmYXN0ZXIgdGhhbiB0aGUgZGVmYXVsdCBpbnQgbWV0aG9kIChidXQgc3RpbGwgc2xvd2VyIHRoYW4gdGhlIGZhc3QgaW50CittZXRob2QpLiAgSWYgeW91IHVzZSAtbWlwczIsIHlvdSBtYXkgd2FudCB0byBhbHRlciB0aGUgZGVmYXVsdCBEQ1QgbWV0aG9kIHRvCitiZSBmbG9hdC4gIFRvIGRvIHRoaXMsIHB1dCAiI2RlZmluZSBKRENUX0RFRkFVTFQgSkRDVF9GTE9BVCIgaW4gamNvbmZpZy5oLgorCisKK1ZNUzoKKworT24gYW4gQWxwaGEvVk1TIHN5c3RlbSB3aXRoIE1NUywgYmUgc3VyZSB0byB1c2UgdGhlICIvTWFyY289QWxwaGE9MSIKK3F1YWxpZmllciB3aXRoIE1NUyB3aGVuIGJ1aWxkaW5nIHRoZSBKUEVHIHBhY2thZ2UuCisKK1ZBWC9WTVMgdjUuNS0xIG1heSBoYXZlIHByb2JsZW1zIHdpdGggdGhlIHRlc3Qgc3RlcCBvZiB0aGUgYnVpbGQgcHJvY2VkdXJlCityZXBvcnRpbmcgZGlmZmVyZW5jZXMgd2hlbiBpdCBjb21wYXJlcyB0aGUgb3JpZ2luYWwgYW5kIHRlc3QgaW1hZ2VzLiAgSWYgdGhlCitlcnJvciBwb2ludHMgdG8gdGhlIGxhc3QgYmxvY2sgb2YgdGhlIGZpbGVzLCBpdCBpcyBtb3N0IGxpa2VseSBib2d1cyBhbmQgbWF5CitiZSBzYWZlbHkgaWdub3JlZC4gIEl0IHNlZW1zIHRvIGJlIGJlY2F1c2UgdGhlIGZpbGVzIGFyZSBTdHJlYW1fTEYgYW5kCitCYWNrdXAvQ29tcGFyZSBoYXMgZGlmZmljdWx0eSB3aXRoIHRoZSAocHJlc3VtYWJseSkgbnVsbCBwYWRkZWQgZmlsZXMuCitUaGlzIHByb2JsZW0gd2FzIG5vdCBvYnNlcnZlZCBvbiBWQVgvVk1TIHY2LjEgb3IgQVhQL1ZNUyB2Ni4xLgpkaWZmIC0tZ2l0IGEvanBlZy9qY2FwaW1pbi5jIGIvanBlZy9qY2FwaW1pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZmI4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjYXBpbWluLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBqY2FwaW1pbi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCisgKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1jb21wcmVzc2lvbiBjYXNlIG9yIHRoZSB0cmFuc2NvZGluZy1vbmx5CisgKiBjYXNlLgorICoKKyAqIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbgorICogYXJlIGluIHRoaXMgZmlsZSBvciBpbiBqY2FwaXN0ZC5jLiAgQnV0IGFsc28gc2VlIGpjcGFyYW0uYyBmb3IKKyAqIHBhcmFtZXRlci1zZXR1cCBoZWxwZXIgcm91dGluZXMsIGpjb21hcGkuYyBmb3Igcm91dGluZXMgc2hhcmVkIGJ5CisgKiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiwgYW5kIGpjdHJhbnMuYyBmb3IgdGhlIHRyYW5zY29kaW5nIGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LgorICogVGhlIGVycm9yIG1hbmFnZXIgbXVzdCBhbHJlYWR5IGJlIHNldCB1cCAoaW4gY2FzZSBtZW1vcnkgbWFuYWdlciBmYWlscykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX0NyZWF0ZUNvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQoreworICBpbnQgaTsKKworICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCisgIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKKyAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX1NUUlVDVF9TSVpFLCAKKwkgICAgIChpbnQpIFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpLCAoaW50KSBzdHJ1Y3RzaXplKTsKKworICAvKiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCB3ZSB6ZXJvIHRoZSB3aG9sZSBtYXN0ZXIgc3RydWN0dXJlLgorICAgKiBCdXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IHNldCB0aGUgZXJyIHBvaW50ZXIsIGFuZCBtYXkgaGF2ZSBzZXQKKyAgICogY2xpZW50X2RhdGEsIHNvIHdlIGhhdmUgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aG9zZSBmaWVsZHMuCisgICAqIE5vdGU6IGlmIGFwcGxpY2F0aW9uIGhhc24ndCBzZXQgY2xpZW50X2RhdGEsIHRvb2xzIGxpa2UgUHVyaWZ5IG1heQorICAgKiBjb21wbGFpbiBoZXJlLgorICAgKi8KKyAgeworICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVyciA9IGNpbmZvLT5lcnI7CisgICAgdm9pZCAqIGNsaWVudF9kYXRhID0gY2luZm8tPmNsaWVudF9kYXRhOyAvKiBpZ25vcmUgUHVyaWZ5IGNvbXBsYWludCBoZXJlICovCisgICAgTUVNWkVSTyhjaW5mbywgU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpOworICAgIGNpbmZvLT5lcnIgPSBlcnI7CisgICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisgIH0KKyAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgYSBtZW1vcnkgbWFuYWdlciBpbnN0YW5jZSBmb3IgdGhpcyBvYmplY3QgKi8KKyAgamluaXRfbWVtb3J5X21ncigoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogWmVybyBvdXQgcG9pbnRlcnMgdG8gcGVybWFuZW50IHN0cnVjdHVyZXMuICovCisgIGNpbmZvLT5wcm9ncmVzcyA9IE5VTEw7CisgIGNpbmZvLT5kZXN0ID0gTlVMTDsKKworICBjaW5mby0+Y29tcF9pbmZvID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykKKyAgICBjaW5mby0+cXVhbnRfdGJsX3B0cnNbaV0gPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7CisgICAgY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOworICB9CisKKyAgY2luZm8tPnNjcmlwdF9zcGFjZSA9IE5VTEw7CisKKyAgY2luZm8tPmlucHV0X2dhbW1hID0gMS4wOwkvKiBpbiBjYXNlIGFwcGxpY2F0aW9uIGZvcmdldHMgKi8KKworICAvKiBPSywgSSdtIHJlYWR5ICovCisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBDU1RBVEVfU1RBUlQ7Cit9CisKKworLyoKKyAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QKKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVzdHJveV9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLworfQorCisKKy8qCisgKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvcGVyYXRpb24sCisgKiBidXQgZG9uJ3QgZGVzdHJveSB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfYWJvcnRfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIEZvcmNpYmx5IHN1cHByZXNzIG9yIHVuLXN1cHByZXNzIGFsbCBxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzLgorICogTWFya3MgYWxsIGN1cnJlbnRseSBkZWZpbmVkIHRhYmxlcyBhcyBhbHJlYWR5IHdyaXR0ZW4gKGlmIHN1cHByZXNzKQorICogb3Igbm90IHdyaXR0ZW4gKGlmICFzdXBwcmVzcykuICBUaGlzIHdpbGwgY29udHJvbCB3aGV0aGVyIHRoZXkgZ2V0IGVtaXR0ZWQKKyAqIGJ5IGEgc3Vic2VxdWVudCBqcGVnX3N0YXJ0X2NvbXByZXNzIGNhbGwuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBwcm9kdWNlCisgKiBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLiAgSXQgbG9naWNhbGx5IGJlbG9uZ3MgaW4gamNwYXJhbS5jLCBidXQKKyAqIHNpbmNlIGl0IGlzIGNhbGxlZCBieSBqcGVnX3N0YXJ0X2NvbXByZXNzLCB3ZSBwdXQgaXQgaGVyZSAtLS0gb3RoZXJ3aXNlCisgKiBqY3BhcmFtLm8gd291bGQgYmUgbGlua2VkIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHVzZWQgaXQgb3Igbm90LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19zdXBwcmVzc190YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHN1cHByZXNzKQoreworICBpbnQgaTsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisgIEpIVUZGX1RCTCAqIGh0Ymw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBpZiAoKHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbaV0pICE9IE5VTEwpCisgICAgICBxdGJsLT5zZW50X3RhYmxlID0gc3VwcHJlc3M7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgaWYgKChodGJsID0gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0pICE9IE5VTEwpCisgICAgICBodGJsLT5zZW50X3RhYmxlID0gc3VwcHJlc3M7CisgICAgaWYgKChodGJsID0gY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaV0pICE9IE5VTEwpCisgICAgICBodGJsLT5zZW50X3RhYmxlID0gc3VwcHJlc3M7CisgIH0KK30KKworCisvKgorICogRmluaXNoIEpQRUcgY29tcHJlc3Npb24uCisgKgorICogSWYgYSBtdWx0aXBhc3Mgb3BlcmF0aW5nIG1vZGUgd2FzIHNlbGVjdGVkLCB0aGlzIG1heSBkbyBhIGdyZWF0IGRlYWwgb2YKKyAqIHdvcmsgaW5jbHVkaW5nIG1vc3Qgb2YgdGhlIGFjdHVhbCBvdXRwdXQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZpbmlzaF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIEpESU1FTlNJT04gaU1DVV9yb3c7CisKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gQ1NUQVRFX1NDQU5OSU5HIHx8CisgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IENTVEFURV9SQVdfT0spIHsKKyAgICAvKiBUZXJtaW5hdGUgZmlyc3QgcGFzcyAqLworICAgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA8IGNpbmZvLT5pbWFnZV9oZWlnaHQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RPT19MSVRUTEVfREFUQSk7CisgICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIFBlcmZvcm0gYW55IHJlbWFpbmluZyBwYXNzZXMgKi8KKyAgd2hpbGUgKCEgY2luZm8tPm1hc3Rlci0+aXNfbGFzdF9wYXNzKSB7CisgICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9wYXNzKSAoY2luZm8pOworICAgIGZvciAoaU1DVV9yb3cgPSAwOyBpTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7IGlNQ1Vfcm93KyspIHsKKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGlNQ1Vfcm93OworCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworCSgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorICAgICAgLyogV2UgYnlwYXNzIHRoZSBtYWluIGNvbnRyb2xsZXIgYW5kIGludm9rZSBjb2VmIGNvbnRyb2xsZXIgZGlyZWN0bHk7CisgICAgICAgKiBhbGwgd29yayBpcyBiZWluZyBkb25lIGZyb20gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4KKyAgICAgICAqLworICAgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCAoSlNBTVBJTUFHRSkgTlVMTCkpCisJRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworICAgIH0KKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9wYXNzKSAoY2luZm8pOworICB9CisgIC8qIFdyaXRlIEVPSSwgZG8gZmluYWwgY2xlYW51cCAqLworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZpbGVfdHJhaWxlcikgKGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+dGVybV9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogV2UgY2FuIHVzZSBqcGVnX2Fib3J0IHRvIHJlbGVhc2UgbWVtb3J5IGFuZCByZXNldCBnbG9iYWxfc3RhdGUgKi8KKyAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7Cit9CisKKworLyoKKyAqIFdyaXRlIGEgc3BlY2lhbCBtYXJrZXIuCisgKiBUaGlzIGlzIG9ubHkgcmVjb21tZW5kZWQgZm9yIHdyaXRpbmcgQ09NIG9yIEFQUG4gbWFya2Vycy4KKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQgYmVmb3JlCisgKiBmaXJzdCBjYWxsIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgb3IganBlZ193cml0ZV9yYXdfZGF0YSgpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ193cml0ZV9tYXJrZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAorCQkgICBjb25zdCBKT0NURVQgKmRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworICBKTUVUSE9EKHZvaWQsIHdyaXRlX21hcmtlcl9ieXRlLCAoal9jb21wcmVzc19wdHIgaW5mbywgaW50IHZhbCkpOworCisgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSAhPSAwIHx8CisgICAgICAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU0NBTk5JTkcgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0sgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2hlYWRlcikgKGNpbmZvLCBtYXJrZXIsIGRhdGFsZW4pOworICB3cml0ZV9tYXJrZXJfYnl0ZSA9IGNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9ieXRlOwkvKiBjb3B5IGZvciBzcGVlZCAqLworICB3aGlsZSAoZGF0YWxlbi0tKSB7CisgICAgKCp3cml0ZV9tYXJrZXJfYnl0ZSkgKGNpbmZvLCAqZGF0YXB0cik7CisgICAgZGF0YXB0cisrOworICB9Cit9CisKKy8qIFNhbWUsIGJ1dCBwaWVjZW1lYWwuICovCisKK0dMT0JBTCh2b2lkKQoranBlZ193cml0ZV9tX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgIT0gMCB8fAorICAgICAgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HICYmCisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfUkFXX09LICYmCisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9oZWFkZXIpIChjaW5mbywgbWFya2VyLCBkYXRhbGVuKTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX21fYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCit7CisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2J5dGUpIChjaW5mbywgdmFsKTsKK30KKworCisvKgorICogQWx0ZXJuYXRlIGNvbXByZXNzaW9uIGZ1bmN0aW9uOiBqdXN0IHdyaXRlIGFuIGFiYnJldmlhdGVkIHRhYmxlIGZpbGUuCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICoKKyAqIFRvIHByb2R1Y2UgYSBwYWlyIG9mIGZpbGVzIGNvbnRhaW5pbmcgYWJicmV2aWF0ZWQgdGFibGVzIGFuZCBhYmJyZXZpYXRlZAorICogaW1hZ2UgZGF0YSwgb25lIHdvdWxkIHByb2NlZWQgYXMgZm9sbG93czoKKyAqCisgKgkJaW5pdGlhbGl6ZSBKUEVHIG9iamVjdAorICoJCXNldCBKUEVHIHBhcmFtZXRlcnMKKyAqCQlzZXQgZGVzdGluYXRpb24gdG8gdGFibGUgZmlsZQorICoJCWpwZWdfd3JpdGVfdGFibGVzKGNpbmZvKTsKKyAqCQlzZXQgZGVzdGluYXRpb24gdG8gaW1hZ2UgZmlsZQorICoJCWpwZWdfc3RhcnRfY29tcHJlc3MoY2luZm8sIEZBTFNFKTsKKyAqCQl3cml0ZSBkYXRhLi4uCisgKgkJanBlZ19maW5pc2hfY29tcHJlc3MoY2luZm8pOworICoKKyAqIGpwZWdfd3JpdGVfdGFibGVzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgbWFya2luZyBhbGwgdGFibGVzIHdyaXR0ZW4KKyAqIChzYW1lIGFzIGpwZWdfc3VwcHJlc3NfdGFibGVzKC4uLiwgVFJVRSkpLiAgVGh1cyBhIHN1YnNlcXVlbnQgc3RhcnRfY29tcHJlc3MKKyAqIHdpbGwgbm90IHJlLWVtaXQgdGhlIHRhYmxlcyB1bmxlc3MgaXQgaXMgcGFzc2VkIHdyaXRlX2FsbF90YWJsZXM9VFJVRS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfd3JpdGVfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgLyogKFJlKWluaXRpYWxpemUgZXJyb3IgbWdyIGFuZCBkZXN0aW5hdGlvbiBtb2R1bGVzICovCisgICgqY2luZm8tPmVyci0+cmVzZXRfZXJyb3JfbWdyKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAoKmNpbmZvLT5kZXN0LT5pbml0X2Rlc3RpbmF0aW9uKSAoY2luZm8pOworICAvKiBJbml0aWFsaXplIHRoZSBtYXJrZXIgd3JpdGVyIC4uLiBiaXQgb2YgYSBjcm9jayB0byBkbyBpdCBoZXJlLiAqLworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKyAgLyogV3JpdGUgdGhlbSB0YWJsZXMhICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfdGFibGVzX29ubHkpIChjaW5mbyk7CisgIC8qIEFuZCBjbGVhbiB1cC4gKi8KKyAgKCpjaW5mby0+ZGVzdC0+dGVybV9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyoKKyAgICogSW4gbGlicmFyeSByZWxlYXNlcyB1cCB0aHJvdWdoIHY2YSwgd2UgY2FsbGVkIGpwZWdfYWJvcnQoKSBoZXJlIHRvIGZyZWUKKyAgICogYW55IHdvcmtpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgZGVzdGluYXRpb24gbWFuYWdlciBhbmQgbWFya2VyCisgICAqIHdyaXRlci4gIFNvbWUgYXBwbGljYXRpb25zIGhhZCBhIHByb2JsZW0gd2l0aCB0aGF0OiB0aGV5IGFsbG9jYXRlZCBzcGFjZQorICAgKiBvZiB0aGVpciBvd24gZnJvbSB0aGUgbGlicmFyeSBtZW1vcnkgbWFuYWdlciwgYW5kIGRpZG4ndCB3YW50IGl0IHRvIGdvCisgICAqIGF3YXkgZHVyaW5nIHdyaXRlX3RhYmxlcy4gIFNvIG5vdyB3ZSBkbyBub3RoaW5nLiAgVGhpcyB3aWxsIGNhdXNlIGEKKyAgICogbWVtb3J5IGxlYWsgaWYgYW4gYXBwIGNhbGxzIHdyaXRlX3RhYmxlcyByZXBlYXRlZGx5IHdpdGhvdXQgZG9pbmcgYSBmdWxsCisgICAqIGNvbXByZXNzaW9uIGN5Y2xlIG9yIG90aGVyd2lzZSByZXNldHRpbmcgdGhlIEpQRUcgb2JqZWN0LiAgSG93ZXZlciwgdGhhdAorICAgKiBzZWVtcyBsZXNzIGJhZCB0aGFuIHVuZXhwZWN0ZWRseSBmcmVlaW5nIG1lbW9yeSBpbiB0aGUgbm9ybWFsIGNhc2UuCisgICAqIEFuIGFwcCB0aGF0IHByZWZlcnMgdGhlIG9sZCBiZWhhdmlvciBjYW4gY2FsbCBqcGVnX2Fib3J0IGZvciBpdHNlbGYgYWZ0ZXIKKyAgICogZWFjaCBjYWxsIHRvIGpwZWdfd3JpdGVfdGFibGVzKCkuCisgICAqLworfQpkaWZmIC0tZ2l0IGEvanBlZy9qY2FwaXN0ZC5jIGIvanBlZy9qY2FwaXN0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzIwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjYXBpc3RkLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBqY2FwaXN0ZC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAic3RhbmRhcmQiIEFQSSByb3V0aW5lcyB0aGF0IGFyZQorICogdXNlZCBpbiB0aGUgbm9ybWFsIGZ1bGwtY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKKyAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KKyAqIGpwZWdfc3RhcnRfY29tcHJlc3MsIGl0IHdpbGwgZW5kIHVwIGxpbmtpbmcgaW4gdGhlIGVudGlyZSBjb21wcmVzc29yLgorICogV2UgdGh1cyBtdXN0IHNlcGFyYXRlIHRoaXMgZmlsZSBmcm9tIGpjYXBpbWluLmMgdG8gYXZvaWQgbGlua2luZyB0aGUKKyAqIHdob2xlIGNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBDb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KKyAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCisgKgorICogV2UgcmVxdWlyZSBhIHdyaXRlX2FsbF90YWJsZXMgcGFyYW1ldGVyIGFzIGEgZmFpbHNhZmUgY2hlY2sgd2hlbiB3cml0aW5nCisgKiBtdWx0aXBsZSBkYXRhc3RyZWFtcyBmcm9tIHRoZSBzYW1lIGNvbXByZXNzaW9uIG9iamVjdC4gIFNpbmNlIHByaW9yIHJ1bnMKKyAqIHdpbGwgaGF2ZSBsZWZ0IGFsbCB0aGUgdGFibGVzIG1hcmtlZCBzZW50X3RhYmxlPVRSVUUsIGEgc3Vic2VxdWVudCBydW4KKyAqIHdvdWxkIGVtaXQgYW4gYWJicmV2aWF0ZWQgc3RyZWFtIChubyB0YWJsZXMpIGJ5IGRlZmF1bHQuICBUaGlzIG1heSBiZSB3aGF0CisgKiBpcyB3YW50ZWQsIGJ1dCBmb3Igc2FmZXR5J3Mgc2FrZSBpdCBzaG91bGQgbm90IGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yOgorICogcHJvZ3JhbW1lcnMgc2hvdWxkIGhhdmUgdG8gbWFrZSBhIGRlbGliZXJhdGUgY2hvaWNlIHRvIGVtaXQgYWJicmV2aWF0ZWQKKyAqIGltYWdlcy4gIFRoZXJlZm9yZSB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgc2hvdWxkIGVuY291cmFnZSBwZW9wbGUKKyAqIHRvIHBhc3Mgd3JpdGVfYWxsX3RhYmxlcz1UUlVFOyB0aGVuIGl0IHdpbGwgdGFrZSBhY3RpdmUgdGhvdWdodCB0byBkbyB0aGUKKyAqIHdyb25nIHRoaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19zdGFydF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gd3JpdGVfYWxsX3RhYmxlcykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgaWYgKHdyaXRlX2FsbF90YWJsZXMpCisgICAganBlZ19zdXBwcmVzc190YWJsZXMoY2luZm8sIEZBTFNFKTsJLyogbWFyayBhbGwgdGFibGVzIHRvIGJlIHdyaXR0ZW4gKi8KKworICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KKyAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7CisgIC8qIFBlcmZvcm0gbWFzdGVyIHNlbGVjdGlvbiBvZiBhY3RpdmUgbW9kdWxlcyAqLworICBqaW5pdF9jb21wcmVzc19tYXN0ZXIoY2luZm8pOworICAvKiBTZXQgdXAgZm9yIHRoZSBmaXJzdCBwYXNzICovCisgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3JfcGFzcykgKGNpbmZvKTsKKyAgLyogUmVhZHkgZm9yIGFwcGxpY2F0aW9uIHRvIGRyaXZlIGZpcnN0IHBhc3MgdGhyb3VnaCBqcGVnX3dyaXRlX3NjYW5saW5lcworICAgKiBvciBqcGVnX3dyaXRlX3Jhd19kYXRhLgorICAgKi8KKyAgY2luZm8tPm5leHRfc2NhbmxpbmUgPSAwOworICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gKGNpbmZvLT5yYXdfZGF0YV9pbiA/IENTVEFURV9SQVdfT0sgOiBDU1RBVEVfU0NBTk5JTkcpOworfQorCisKKy8qCisgKiBXcml0ZSBzb21lIHNjYW5saW5lcyBvZiBkYXRhIHRvIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgd3JpdHRlbi4KKyAqIFRoaXMgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgc3VwcGxpZWQgbnVtX2xpbmVzIG9ubHkgaW4gY2FzZSB0aGF0CisgKiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgaGFzIHJlcXVlc3RlZCBzdXNwZW5zaW9uIG9mIHRoZSBjb21wcmVzc29yLAorICogb3IgaWYgbW9yZSB0aGFuIGltYWdlX2hlaWdodCBzY2FubGluZXMgYXJlIHBhc3NlZCBpbi4KKyAqCisgKiBOb3RlOiB3ZSB3YXJuIGFib3V0IGV4Y2VzcyBjYWxscyB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpIHNpbmNlCisgKiB0aGlzIGxpa2VseSBzaWduYWxzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgZXJyb3IuICBIb3dldmVyLAorICogZXhjZXNzIHNjYW5saW5lcyBwYXNzZWQgaW4gdGhlIGxhc3QgdmFsaWQgY2FsbCBhcmUgKnNpbGVudGx5KiBpZ25vcmVkLAorICogc28gdGhhdCB0aGUgYXBwbGljYXRpb24gbmVlZCBub3QgYWRqdXN0IG51bV9saW5lcyBmb3IgZW5kLW9mLWltYWdlCisgKiB3aGVuIHVzaW5nIGEgbXVsdGlwbGUtc2NhbmxpbmUgYnVmZmVyLgorICovCisKK0dMT0JBTChKRElNRU5TSU9OKQoranBlZ193cml0ZV9zY2FubGluZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIHNjYW5saW5lcywKKwkJICAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpCit7CisgIEpESU1FTlNJT04gcm93X2N0ciwgcm93c19sZWZ0OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisKKyAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+bmV4dF9zY2FubGluZTsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgfQorCisgIC8qIEdpdmUgbWFzdGVyIGNvbnRyb2wgbW9kdWxlIGFub3RoZXIgY2hhbmNlIGlmIHRoaXMgaXMgZmlyc3QgY2FsbCB0bworICAgKiBqcGVnX3dyaXRlX3NjYW5saW5lcy4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQorICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KKyAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9zY2FubGluZXMuCisgICAqLworICBpZiAoY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXApCisgICAgKCpjaW5mby0+bWFzdGVyLT5wYXNzX3N0YXJ0dXApIChjaW5mbyk7CisKKyAgLyogSWdub3JlIGFueSBleHRyYSBzY2FubGluZXMgYXQgYm90dG9tIG9mIGltYWdlLiAqLworICByb3dzX2xlZnQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0IC0gY2luZm8tPm5leHRfc2NhbmxpbmU7CisgIGlmIChudW1fbGluZXMgPiByb3dzX2xlZnQpCisgICAgbnVtX2xpbmVzID0gcm93c19sZWZ0OworCisgIHJvd19jdHIgPSAwOworICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgc2NhbmxpbmVzLCAmcm93X2N0ciwgbnVtX2xpbmVzKTsKKyAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gcm93X2N0cjsKKyAgcmV0dXJuIHJvd19jdHI7Cit9CisKKworLyoKKyAqIEFsdGVybmF0ZSBlbnRyeSBwb2ludCB0byB3cml0ZSByYXcgZGF0YS4KKyAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfd3JpdGVfcmF3X2RhdGEgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGRhdGEsCisJCSAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpCit7CisgIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0spCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lID49IGNpbmZvLT5pbWFnZV9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCisgICAqIGpwZWdfd3JpdGVfcmF3X2RhdGEuICBUaGlzIGxldHMgb3V0cHV0IG9mIHRoZSBmcmFtZS9zY2FuIGhlYWRlcnMgYmUKKyAgICogZGVsYXllZCBzbyB0aGF0IGFwcGxpY2F0aW9uIGNhbiB3cml0ZSBDT00sIGV0YywgbWFya2VycyBiZXR3ZWVuCisgICAqIGpwZWdfc3RhcnRfY29tcHJlc3MgYW5kIGpwZWdfd3JpdGVfcmF3X2RhdGEuCisgICAqLworICBpZiAoY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXApCisgICAgKCpjaW5mby0+bWFzdGVyLT5wYXNzX3N0YXJ0dXApIChjaW5mbyk7CisKKyAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGhhcyBiZWVuIHBhc3NlZC4gKi8KKyAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKyAgaWYgKG51bV9saW5lcyA8IGxpbmVzX3Blcl9pTUNVX3JvdykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JVRkZFUl9TSVpFKTsKKworICAvKiBEaXJlY3RseSBjb21wcmVzcyB0aGUgcm93LiAqLworICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIGRhdGEpKSB7CisgICAgLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgc3VzcGVuZCBwcm9jZXNzaW5nLiAqLworICAgIHJldHVybiAwOworICB9CisKKyAgLyogT0ssIHdlIHByb2Nlc3NlZCBvbmUgaU1DVSByb3cuICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKK30KZGlmZiAtLWdpdCBhL2pwZWcvamNjb2VmY3QuYyBiL2pwZWcvamNjb2VmY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYzZGRiCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qY2NvZWZjdC5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogamNjb2VmY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCisgKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBjb21wcmVzc29yIHByb3Blci4KKyAqIFRoZSBjb2VmZmljaWVudCBidWZmZXIgbGllcyBiZXR3ZWVuIGZvcndhcmQtRENUIGFuZCBlbnRyb3B5IGVuY29kaW5nIHN0ZXBzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBXZSB1c2UgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGVuIGRvaW5nIEh1ZmZtYW4gb3B0aW1pemF0aW9uLAorICogYW5kIGFsc28gZm9yIHdyaXRpbmcgbXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzLiAgSW4gYWxsIGNhc2VzLCB0aGUgRENUCisgKiBzdGVwIGlzIHJ1biBkdXJpbmcgdGhlIGZpcnN0IHBhc3MsIGFuZCBzdWJzZXF1ZW50IHBhc3NlcyBuZWVkIG9ubHkgcmVhZAorICogdGhlIGJ1ZmZlcmVkIGNvZWZmaWNpZW50cy4KKyAqLworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorI2RlZmluZSBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorI2Vsc2UKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyNkZWZpbmUgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKyNlbmRpZgorI2VuZGlmCisKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBKRElNRU5TSU9OIGlNQ1Vfcm93X251bTsJLyogaU1DVSByb3cgIyB3aXRoaW4gaW1hZ2UgKi8KKyAgSkRJTUVOU0lPTiBtY3VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCisgIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCisgIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCisKKyAgLyogRm9yIHNpbmdsZS1wYXNzIGNvbXByZXNzaW9uLCBpdCdzIHN1ZmZpY2llbnQgdG8gYnVmZmVyIGp1c3Qgb25lIE1DVQorICAgKiAoYWx0aG91Z2ggdGhpcyBtYXkgcHJvdmUgYSBiaXQgc2xvdyBpbiBwcmFjdGljZSkuICBXZSBhbGxvY2F0ZSBhCisgICAqIHdvcmtzcGFjZSBvZiBDX01BWF9CTE9DS1NfSU5fTUNVIGNvZWZmaWNpZW50IGJsb2NrcywgYW5kIHJldXNlIGl0IGZvciBlYWNoCisgICAqIE1DVSBjb25zdHJ1Y3RlZCBhbmQgc2VudC4gIChPbiA4MHg4NiwgdGhlIHdvcmtzcGFjZSBpcyBGQVIgZXZlbiB0aG91Z2gKKyAgICogaXQncyBub3QgcmVhbGx5IHZlcnkgYmlnOyB0aGlzIGlzIHRvIGtlZXAgdGhlIG1vZHVsZSBpbnRlcmZhY2VzIHVuY2hhbmdlZAorICAgKiB3aGVuIGEgbGFyZ2UgY29lZmZpY2llbnQgYnVmZmVyIGlzIG5lY2Vzc2FyeS4pCisgICAqIEluIG11bHRpLXBhc3MgbW9kZXMsIHRoaXMgYXJyYXkgcG9pbnRzIHRvIHRoZSBjdXJyZW50IE1DVSdzIGJsb2NrcworICAgKiB3aXRoaW4gdGhlIHZpcnR1YWwgYXJyYXlzLgorICAgKi8KKyAgSkJMT0NLUk9XIE1DVV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07CisKKyAgLyogSW4gbXVsdGktcGFzcyBtb2Rlcywgd2UgbmVlZCBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICBqdmlydF9iYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKK30gbXlfY29lZl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3NfZGF0YQorICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7CisjaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKK01FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19maXJzdF9wYXNzCisgICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKK01FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19vdXRwdXQKKyAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOworI2VuZGlmCisKKworTE9DQUwodm9pZCkKK3N0YXJ0X2lNQ1Vfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93ICovCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCisgICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCisgICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgeworICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7CisgIH0gZWxzZSB7CisgICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7CisgICAgZWxzZQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKKyAgfQorCisgIGNvZWYtPm1jdV9jdHIgPSAwOworICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfY29lZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKworICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gIT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX2RhdGE7CisgICAgYnJlYWs7CisjaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19maXJzdF9wYXNzOworICAgIGJyZWFrOworICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKKyAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KKyAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCisgKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGltYWdlLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBpTUNVIHJvdyBpcyBjb21wbGV0ZWQsIEZBTFNFIGlmIHN1c3BlbmRlZC4KKyAqCisgKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLAorICogd2hpY2ggd2UgaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQncyBTT0YgcG9zaXRpb24uCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitjb21wcmVzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgYmksIGNpLCB5aW5kZXgsIHlvZmZzZXQsIGJsb2NrY250OworICBKRElNRU5TSU9OIHlwb3MsIHhwb3M7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogTG9vcCB0byB3cml0ZSBhcyBtdWNoIGFzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLworICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgICAgICAgeW9mZnNldCsrKSB7CisgICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPm1jdV9jdHI7IE1DVV9jb2xfbnVtIDw9IGxhc3RfTUNVX2NvbDsKKwkgTUNVX2NvbF9udW0rKykgeworICAgICAgLyogRGV0ZXJtaW5lIHdoZXJlIGRhdGEgY29tZXMgZnJvbSBpbiBpbnB1dF9idWYgYW5kIGRvIHRoZSBEQ1QgdGhpbmcuCisgICAgICAgKiBFYWNoIGNhbGwgb24gZm9yd2FyZF9EQ1QgcHJvY2Vzc2VzIGEgaG9yaXpvbnRhbCByb3cgb2YgRENUIGJsb2NrcworICAgICAgICogYXMgd2lkZSBhcyBhbiBNQ1U7IHdlIHJlbHkgb24gaGF2aW5nIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcworICAgICAgICogc2VxdWVudGlhbGx5LiAgRHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZSBhcmUgZmlsbGVkIGluCisgICAgICAgKiBzcGVjaWFsbHkuICBUaGUgZGF0YSBpbiB0aGVtIGRvZXMgbm90IG1hdHRlciBmb3IgaW1hZ2UgcmVjb25zdHJ1Y3Rpb24sCisgICAgICAgKiBzbyB3ZSBmaWxsIHRoZW0gd2l0aCB2YWx1ZXMgdGhhdCB3aWxsIGVuY29kZSB0byB0aGUgc21hbGxlc3QgYW1vdW50IG9mCisgICAgICAgKiBkYXRhLCB2aXo6IGFsbCB6ZXJvZXMgaW4gdGhlIEFDIGVudHJpZXMsIERDIGVudHJpZXMgZXF1YWwgdG8gcHJldmlvdXMKKyAgICAgICAqIGJsb2NrJ3MgREMgdmFsdWUuICAoVGhhbmtzIHRvIFRob21hcyBLaW5zbWFuIGZvciB0aGlzIGlkZWEuKQorICAgICAgICovCisgICAgICBibGtuID0gMDsKKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwlibG9ja2NudCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKKwkJCQkJCTogY29tcHB0ci0+bGFzdF9jb2xfd2lkdGg7CisJeHBvcyA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aDsKKwl5cG9zID0geW9mZnNldCAqIERDVFNJWkU7IC8qIHlwb3MgPT0gKHlvZmZzZXQreWluZGV4KSAqIERDVFNJWkUgKi8KKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlvZmZzZXQreWluZGV4IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgICgqY2luZm8tPmZkY3QtPmZvcndhcmRfRENUKSAoY2luZm8sIGNvbXBwdHIsCisJCQkJCSBpbnB1dF9idWZbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKwkJCQkJIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCisJCQkJCSB5cG9zLCB4cG9zLCAoSkRJTUVOU0lPTikgYmxvY2tjbnQpOworCSAgICBpZiAoYmxvY2tjbnQgPCBjb21wcHRyLT5NQ1Vfd2lkdGgpIHsKKwkgICAgICAvKiBDcmVhdGUgc29tZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLworCSAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuICsgYmxvY2tjbnRdLAorCQkJKGNvbXBwdHItPk1DVV93aWR0aCAtIGJsb2NrY250KSAqIFNJWkVPRihKQkxPQ0spKTsKKwkgICAgICBmb3IgKGJpID0gYmxvY2tjbnQ7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7CisJCWNvZWYtPk1DVV9idWZmZXJbYmxrbitiaV1bMF1bMF0gPSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmktMV1bMF1bMF07CisJICAgICAgfQorCSAgICB9CisJICB9IGVsc2UgeworCSAgICAvKiBDcmVhdGUgYSByb3cgb2YgZHVtbXkgYmxvY2tzIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLiAqLworCSAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCisJCSAgICAgIGNvbXBwdHItPk1DVV93aWR0aCAqIFNJWkVPRihKQkxPQ0spKTsKKwkgICAgZm9yIChiaSA9IDA7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7CisJICAgICAgY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpXVswXVswXSA9IGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKKwkgICAgfQorCSAgfQorCSAgYmxrbiArPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisJICB5cG9zICs9IERDVFNJWkU7CisJfQorICAgICAgfQorICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICBJbiBldmVudCBvZiBhIHN1c3BlbnNpb24gZmFpbHVyZSwgd2Ugd2lsbAorICAgICAgICogcmUtRENUIHRoZSBNQ1Ugb24gcmVzdGFydCAoYSBiaXQgaW5lZmZpY2llbnQsIGNvdWxkIGJlIGZpeGVkLi4uKQorICAgICAgICovCisgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisJY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPm1jdV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGNvZWYtPmlNQ1Vfcm93X251bSsrOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgYSBtdWx0aS1wYXNzIGNhc2UuCisgKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQorICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBpbWFnZS4KKyAqIFRoaXMgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLCBEQ1QnZCBhbmQgcXVhbnRpemVkLAorICogYW5kIHNhdmVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzLiAgV2UgYWxzbyBnZW5lcmF0ZSBzdWl0YWJsZSBkdW1teSBibG9ja3MKKyAqIGFzIG5lZWRlZCBhdCB0aGUgcmlnaHQgYW5kIGxvd2VyIGVkZ2VzLiAgKFRoZSBkdW1teSBibG9ja3MgYXJlIGNvbnN0cnVjdGVkCisgKiBpbiB0aGUgdmlydHVhbCBhcnJheXMsIHdoaWNoIGhhdmUgYmVlbiBwYWRkZWQgYXBwcm9wcmlhdGVseS4pICBUaGlzIG1ha2VzCisgKiBpdCBwb3NzaWJsZSBmb3Igc3Vic2VxdWVudCBwYXNzZXMgbm90IHRvIHdvcnJ5IGFib3V0IHJlYWwgdnMuIGR1bW15IGJsb2Nrcy4KKyAqCisgKiBXZSBtdXN0IGFsc28gZW1pdCB0aGUgZGF0YSB0byB0aGUgZW50cm9weSBlbmNvZGVyLiAgVGhpcyBpcyBjb252ZW5pZW50bHkKKyAqIGRvbmUgYnkgY2FsbGluZyBjb21wcmVzc19vdXRwdXQoKSBhZnRlciB3ZSd2ZSBsb2FkZWQgdGhlIGN1cnJlbnQgc3RyaXAKKyAqIG9mIHRoZSB2aXJ0dWFsIGFycmF5cy4KKyAqCisgKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLiAgQWxsCisgKiBjb21wb25lbnRzIGFyZSBEQ1QnZCBhbmQgbG9hZGVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzIGluIHRoaXMgcGFzcy4KKyAqIEhvd2V2ZXIsIGl0IG1heSBiZSB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGVtaXR0ZWQgdG8KKyAqIHRoZSBlbnRyb3B5IGVuY29kZXIgZHVyaW5nIHRoaXMgZmlyc3QgcGFzczsgYmUgY2FyZWZ1bCBhYm91dCBsb29raW5nCisgKiBhdCB0aGUgc2Nhbi1kZXBlbmRlbnQgdmFyaWFibGVzIChNQ1UgZGltZW5zaW9ucywgZXRjKS4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2NvbXByZXNzX2ZpcnN0X3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBKRElNRU5TSU9OIGJsb2Nrc19hY3Jvc3MsIE1DVXNfYWNyb3NzLCBNQ1VpbmRleDsKKyAgaW50IGJpLCBjaSwgaF9zYW1wX2ZhY3RvciwgYmxvY2tfcm93LCBibG9ja19yb3dzLCBuZHVtbXk7CisgIEpDT0VGIGxhc3REQzsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyOworICBKQkxPQ0tST1cgdGhpc2Jsb2Nrcm93LCBsYXN0YmxvY2tyb3c7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLworICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCisgICAgICAgY29lZi0+aU1DVV9yb3dfbnVtICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKyAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCisgICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IGxhc3RfaU1DVV9yb3cpCisgICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlIHsKKyAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmUsIHNpbmNlIG1heSBub3QgYmUgc2V0ISAqLworICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgICAgYmxvY2tzX2Fjcm9zcyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKyAgICBoX3NhbXBfZmFjdG9yID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAvKiBDb3VudCBudW1iZXIgb2YgZHVtbXkgYmxvY2tzIHRvIGJlIGFkZGVkIGF0IHRoZSByaWdodCBtYXJnaW4uICovCisgICAgbmR1bW15ID0gKGludCkgKGJsb2Nrc19hY3Jvc3MgJSBoX3NhbXBfZmFjdG9yKTsKKyAgICBpZiAobmR1bW15ID4gMCkKKyAgICAgIG5kdW1teSA9IGhfc2FtcF9mYWN0b3IgLSBuZHVtbXk7CisgICAgLyogUGVyZm9ybSBEQ1QgZm9yIGFsbCBub24tZHVtbXkgYmxvY2tzIGluIHRoaXMgaU1DVSByb3cuICBFYWNoIGNhbGwKKyAgICAgKiBvbiBmb3J3YXJkX0RDVCBwcm9jZXNzZXMgYSBjb21wbGV0ZSBob3Jpem9udGFsIHJvdyBvZiBEQ1QgYmxvY2tzLgorICAgICAqLworICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKKyAgICAgIHRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOworICAgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKKwkJCQkgICBpbnB1dF9idWZbY2ldLCB0aGlzYmxvY2tyb3csCisJCQkJICAgKEpESU1FTlNJT04pIChibG9ja19yb3cgKiBEQ1RTSVpFKSwKKwkJCQkgICAoSkRJTUVOU0lPTikgMCwgYmxvY2tzX2Fjcm9zcyk7CisgICAgICBpZiAobmR1bW15ID4gMCkgeworCS8qIENyZWF0ZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLworCXRoaXNibG9ja3JvdyArPSBibG9ja3NfYWNyb3NzOyAvKiA9PiBmaXJzdCBkdW1teSBibG9jayAqLworCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgdGhpc2Jsb2Nrcm93LCBuZHVtbXkgKiBTSVpFT0YoSkJMT0NLKSk7CisJbGFzdERDID0gdGhpc2Jsb2Nrcm93Wy0xXVswXTsKKwlmb3IgKGJpID0gMDsgYmkgPCBuZHVtbXk7IGJpKyspIHsKKwkgIHRoaXNibG9ja3Jvd1tiaV1bMF0gPSBsYXN0REM7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBJZiBhdCBlbmQgb2YgaW1hZ2UsIGNyZWF0ZSBkdW1teSBibG9jayByb3dzIGFzIG5lZWRlZC4KKyAgICAgKiBUaGUgdHJpY2t5IHBhcnQgaGVyZSBpcyB0aGF0IHdpdGhpbiBlYWNoIE1DVSwgd2Ugd2FudCB0aGUgREMgdmFsdWVzCisgICAgICogb2YgdGhlIGR1bW15IGJsb2NrcyB0byBtYXRjaCB0aGUgbGFzdCByZWFsIGJsb2NrJ3MgREMgdmFsdWUuCisgICAgICogVGhpcyBzcXVlZXplcyBhIGZldyBtb3JlIGJ5dGVzIG91dCBvZiB0aGUgcmVzdWx0aW5nIGZpbGUuLi4KKyAgICAgKi8KKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtID09IGxhc3RfaU1DVV9yb3cpIHsKKyAgICAgIGJsb2Nrc19hY3Jvc3MgKz0gbmR1bW15OwkvKiBpbmNsdWRlIGxvd2VyIHJpZ2h0IGNvcm5lciAqLworICAgICAgTUNVc19hY3Jvc3MgPSBibG9ja3NfYWNyb3NzIC8gaF9zYW1wX2ZhY3RvcjsKKyAgICAgIGZvciAoYmxvY2tfcm93ID0gYmxvY2tfcm93czsgYmxvY2tfcm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkgICBibG9ja19yb3crKykgeworCXRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOworCWxhc3RibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ctMV07CisJanplcm9fZmFyKCh2b2lkIEZBUiAqKSB0aGlzYmxvY2tyb3csCisJCSAgKHNpemVfdCkgKGJsb2Nrc19hY3Jvc3MgKiBTSVpFT0YoSkJMT0NLKSkpOworCWZvciAoTUNVaW5kZXggPSAwOyBNQ1VpbmRleCA8IE1DVXNfYWNyb3NzOyBNQ1VpbmRleCsrKSB7CisJICBsYXN0REMgPSBsYXN0YmxvY2tyb3dbaF9zYW1wX2ZhY3Rvci0xXVswXTsKKwkgIGZvciAoYmkgPSAwOyBiaSA8IGhfc2FtcF9mYWN0b3I7IGJpKyspIHsKKwkgICAgdGhpc2Jsb2Nrcm93W2JpXVswXSA9IGxhc3REQzsKKwkgIH0KKwkgIHRoaXNibG9ja3JvdyArPSBoX3NhbXBfZmFjdG9yOyAvKiBhZHZhbmNlIHRvIG5leHQgTUNVIGluIHJvdyAqLworCSAgbGFzdGJsb2Nrcm93ICs9IGhfc2FtcF9mYWN0b3I7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKiBOQjogY29tcHJlc3Nfb3V0cHV0IHdpbGwgaW5jcmVtZW50IGlNQ1Vfcm93X251bSBpZiBzdWNjZXNzZnVsLgorICAgKiBBIHN1c3BlbnNpb24gcmV0dXJuIHdpbGwgcmVzdWx0IGluIHJlZG9pbmcgYWxsIHRoZSB3b3JrIGFib3ZlIG5leHQgdGltZS4KKyAgICovCisKKyAgLyogRW1pdCBkYXRhIHRvIHRoZSBlbnRyb3B5IGVuY29kZXIsIHNoYXJpbmcgY29kZSB3aXRoIHN1YnNlcXVlbnQgcGFzc2VzICovCisgIHJldHVybiBjb21wcmVzc19vdXRwdXQoY2luZm8sIGlucHV0X2J1Zik7Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHN1YnNlcXVlbnQgcGFzc2VzIG9mIGEgbXVsdGktcGFzcyBjYXNlLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7CisgIEpESU1FTlNJT04gc3RhcnRfY29sOworICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4KKyAgICogTkI6IGR1cmluZyBmaXJzdCBwYXNzLCB0aGlzIGlzIHNhZmUgb25seSBiZWNhdXNlIHRoZSBidWZmZXJzIHdpbGwKKyAgICogYWxyZWFkeSBiZSBhbGlnbmVkIHByb3Blcmx5LCBzbyBqbWVtbWdyLmMgd29uJ3QgbmVlZCB0byBkbyBhbnkgSS9PLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKKwkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgeworCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9CisJfQorICAgICAgfQorICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICovCisgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisJY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPm1jdV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGNvZWYtPmlNQ1Vfcm93X251bSsrOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NfY29lZl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9jb2VmX3B0ciBjb2VmOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOworCisgIC8qIENyZWF0ZSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLiAqLworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisgICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLworICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCisgICAgaW50IGNpOworICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICB9CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLworICAgIEpCTE9DS1JPVyBidWZmZXI7CisgICAgaW50IGk7CisKKyAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIENfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7CisgICAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgICAgfQorICAgIGNvZWYtPndob2xlX2ltYWdlWzBdID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KKyAgfQorfQpkaWZmIC0tZ2l0IGEvanBlZy9qY2NvbG9yLmMgYi9qcGVnL2pjY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThiNDhmCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qY2NvbG9yLmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBqY2NvbG9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisvLyB0aGlzIGVuYWJsZXMgdW5yb2xsaW5nIG51bGxfY29udmVydCdzIGxvb3AsIGFuZCByZWFkaW5nL3dyaXRlIGludHMgZm9yIHNwZWVkCisjZGVmaW5lIEVOQUJMRV9BTkRST0lEX05VTExfQ09OVkVSVAorCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBQcml2YXRlIHN0YXRlIGZvciBSR0ItPllDQyBjb252ZXJzaW9uICovCisgIElOVDMyICogcmdiX3ljY190YWI7CQkvKiA9PiB0YWJsZSBmb3IgUkdCIHRvIFlDYkNyIGNvbnZlcnNpb24gKi8KK30gbXlfY29sb3JfY29udmVydGVyOworCit0eXBlZGVmIG15X2NvbG9yX2NvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKKworCisvKioqKioqKioqKioqKioqKiBSR0IgLT4gWUNiQ3IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KKworLyoKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICoJWSAgPSAgMC4yOTkwMCAqIFIgKyAwLjU4NzAwICogRyArIDAuMTE0MDAgKiBCCisgKglDYiA9IC0wLjE2ODc0ICogUiAtIDAuMzMxMjYgKiBHICsgMC41MDAwMCAqIEIgICsgQ0VOVEVSSlNBTVBMRQorICoJQ3IgPSAgMC41MDAwMCAqIFIgLSAwLjQxODY5ICogRyAtIDAuMDgxMzEgKiBCICArIENFTlRFUkpTQU1QTEUKKyAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKKyAqIE5vdGU6IG9sZGVyIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSB1c2VkIGEgemVybyBvZmZzZXQgb2YgTUFYSlNBTVBMRS8yLAorICogcmF0aGVyIHRoYW4gQ0VOVEVSSlNBTVBMRSwgZm9yIENiIGFuZCBDci4gIFRoaXMgZ2F2ZSBlcXVhbCBwb3NpdGl2ZSBhbmQKKyAqIG5lZ2F0aXZlIHN3aW5ncyBmb3IgQ2IvQ3IsIGJ1dCBtZWFudCB0aGF0IGdyYXlzY2FsZSB2YWx1ZXMgKENiPUNyPTApCisgKiB3ZXJlIG5vdCByZXByZXNlbnRlZCBleGFjdGx5LiAgTm93IHdlIHNhY3JpZmljZSBleGFjdCByZXByZXNlbnRhdGlvbiBvZgorICogbWF4aW11bSByZWQgYW5kIG1heGltdW0gYmx1ZSBpbiBvcmRlciB0byBnZXQgZXhhY3QgZ3JheXNjYWxlcy4KKyAqCisgKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCisgKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKKyAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgorICoKKyAqIEZvciBldmVuIG1vcmUgc3BlZWQsIHdlIGF2b2lkIGRvaW5nIGFueSBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIGlubmVyIGxvb3AKKyAqIGJ5IHByZWNhbGN1bGF0aW5nIHRoZSBjb25zdGFudHMgdGltZXMgUixHLEIgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCisgKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKKyAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgorICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKKyAqIGNvbG9yc3BhY2UgYW55d2F5LgorICogVGhlIENFTlRFUkpTQU1QTEUgb2Zmc2V0cyBhbmQgdGhlIHJvdW5kaW5nIGZ1ZGdlLWZhY3RvciBvZiAwLjUgYXJlIGluY2x1ZGVkCisgKiBpbiB0aGUgdGFibGVzIHRvIHNhdmUgYWRkaW5nIHRoZW0gc2VwYXJhdGVseSBpbiB0aGUgaW5uZXIgbG9vcC4KKyAqLworCisjZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLworI2RlZmluZSBDQkNSX09GRlNFVAkoKElOVDMyKSBDRU5URVJKU0FNUExFIDw8IFNDQUxFQklUUykKKyNkZWZpbmUgT05FX0hBTEYJKChJTlQzMikgMSA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkJCSgoSU5UMzIpICgoeCkgKiAoMUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisvKiBXZSBhbGxvY2F0ZSBvbmUgYmlnIHRhYmxlIGFuZCBkaXZpZGUgaXQgdXAgaW50byBlaWdodCBwYXJ0cywgaW5zdGVhZCBvZgorICogZG9pbmcgZWlnaHQgYWxsb2Nfc21hbGwgcmVxdWVzdHMuICBUaGlzIGxldHMgdXMgdXNlIGEgc2luZ2xlIHRhYmxlIGJhc2UKKyAqIGFkZHJlc3MsIHdoaWNoIGNhbiBiZSBoZWxkIGluIGEgcmVnaXN0ZXIgaW4gdGhlIGlubmVyIGxvb3BzIG9uIG1hbnkKKyAqIG1hY2hpbmVzIChtb3JlIHRoYW4gY2FuIGhvbGQgYWxsIGVpZ2h0IGFkZHJlc3NlcywgYW55d2F5KS4KKyAqLworCisjZGVmaW5lIFJfWV9PRkYJCTAJCQkvKiBvZmZzZXQgdG8gUiA9PiBZIHNlY3Rpb24gKi8KKyNkZWZpbmUgR19ZX09GRgkJKDEqKE1BWEpTQU1QTEUrMSkpCS8qIG9mZnNldCB0byBHID0+IFkgc2VjdGlvbiAqLworI2RlZmluZSBCX1lfT0ZGCQkoMiooTUFYSlNBTVBMRSsxKSkJLyogZXRjLiAqLworI2RlZmluZSBSX0NCX09GRgkoMyooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgR19DQl9PRkYJKDQqKE1BWEpTQU1QTEUrMSkpCisjZGVmaW5lIEJfQ0JfT0ZGCSg1KihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBSX0NSX09GRglCX0NCX09GRgkJLyogQj0+Q2IsIFI9PkNyIGFyZSB0aGUgc2FtZSAqLworI2RlZmluZSBHX0NSX09GRgkoNiooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgQl9DUl9PRkYJKDcqKE1BWEpTQU1QTEUrMSkpCisjZGVmaW5lIFRBQkxFX1NJWkUJKDgqKE1BWEpTQU1QTEUrMSkpCisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIFJHQi0+WUNDIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3JnYl95Y2Nfc3RhcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIElOVDMyICogcmdiX3ljY190YWI7CisgIElOVDMyIGk7CisKKyAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGNvbnZlcnNpb24gdGFibGVzLiAqLworICBjY29udmVydC0+cmdiX3ljY190YWIgPSByZ2JfeWNjX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKFRBQkxFX1NJWkUgKiBTSVpFT0YoSU5UMzIpKSk7CisKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhKU0FNUExFOyBpKyspIHsKKyAgICByZ2JfeWNjX3RhYltpK1JfWV9PRkZdID0gRklYKDAuMjk5MDApICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0dfWV9PRkZdID0gRklYKDAuNTg3MDApICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0JfWV9PRkZdID0gRklYKDAuMTE0MDApICogaSAgICAgKyBPTkVfSEFMRjsKKyAgICByZ2JfeWNjX3RhYltpK1JfQ0JfT0ZGXSA9ICgtRklYKDAuMTY4NzQpKSAqIGk7CisgICAgcmdiX3ljY190YWJbaStHX0NCX09GRl0gPSAoLUZJWCgwLjMzMTI2KSkgKiBpOworICAgIC8qIFdlIHVzZSBhIHJvdW5kaW5nIGZ1ZGdlLWZhY3RvciBvZiAwLjUtZXBzaWxvbiBmb3IgQ2IgYW5kIENyLgorICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtYXhpbXVtIG91dHB1dCB3aWxsIHJvdW5kIHRvIE1BWEpTQU1QTEUKKyAgICAgKiBub3QgTUFYSlNBTVBMRSsxLCBhbmQgdGh1cyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmFuZ2UtbGltaXQuCisgICAgICovCisgICAgcmdiX3ljY190YWJbaStCX0NCX09GRl0gPSBGSVgoMC41MDAwMCkgKiBpICAgICsgQ0JDUl9PRkZTRVQgKyBPTkVfSEFMRi0xOworLyogIEI9PkNiIGFuZCBSPT5DciB0YWJsZXMgYXJlIHRoZSBzYW1lCisgICAgcmdiX3ljY190YWJbaStSX0NSX09GRl0gPSBGSVgoMC41MDAwMCkgKiBpICAgICsgQ0JDUl9PRkZTRVQgKyBPTkVfSEFMRi0xOworKi8KKyAgICByZ2JfeWNjX3RhYltpK0dfQ1JfT0ZGXSA9ICgtRklYKDAuNDE4NjkpKSAqIGk7CisgICAgcmdiX3ljY190YWJbaStCX0NSX09GRl0gPSAoLUZJWCgwLjA4MTMxKSkgKiBpOworICB9Cit9CisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqCisgKiBOb3RlIHRoYXQgd2UgY2hhbmdlIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgaW50ZXJsZWF2ZWQtcGl4ZWwgZm9ybWF0CisgKiB0byBvdXIgaW50ZXJuYWwgbm9uaW50ZXJsZWF2ZWQsIG9uZS1wbGFuZS1wZXItY29tcG9uZW50IGZvcm1hdC4KKyAqIFRoZSBpbnB1dCBidWZmZXIgaXMgdGhlcmVmb3JlIHRocmVlIHRpbWVzIGFzIHdpZGUgYXMgdGhlIG91dHB1dCBidWZmZXIuCisgKgorICogQSBzdGFydGluZyByb3cgb2Zmc2V0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgorICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBpbnB1dF9idWYgdmFsdWUgdG8gYWNjb21tb2RhdGUgYW55IHJvdworICogb2Zmc2V0IHJlcXVpcmVkIG9uIHRoYXQgc2lkZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3JnYl95Y2NfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7CisgIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjEsIG91dHB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKKyAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9SRURdKTsKKyAgICAgIGcgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9HUkVFTl0pOworICAgICAgYiA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0JMVUVdKTsKKyAgICAgIGlucHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKKyAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCisgICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0CisgICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgorICAgICAgICovCisgICAgICAvKiBZICovCisgICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgICAgLyogQ2IgKi8KKyAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDciAqLworICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICB9CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKiBDYXNlcyBvdGhlciB0aGFuIFJHQiAtPiBZQ2JDciAqKioqKioqKioqKioqKi8KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgUkdCLT5ncmF5c2NhbGUgY29udmVyc2lvbiwgd2hpY2ggaXMgdGhlIHNhbWUKKyAqIGFzIHRoZSBSR0ItPlkgcG9ydGlvbiBvZiBSR0ItPllDYkNyLgorICogV2UgYXNzdW1lIHJnYl95Y2Nfc3RhcnQgaGFzIGJlZW4gY2FsbGVkICh3ZSBvbmx5IHVzZSB0aGUgWSB0YWJsZXMpLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX2dyYXlfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgciwgZywgYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9SRURdKTsKKyAgICAgIGcgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9HUkVFTl0pOworICAgICAgYiA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0JMVUVdKTsKKyAgICAgIGlucHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgICAvKiBZICovCisgICAgICBvdXRwdHJbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIEFkb2JlLXN0eWxlIENNWUstPllDQ0sgY29udmVyc2lvbiwKKyAqIHdoZXJlIHdlIGNvbnZlcnQgUj0xLUMsIEc9MS1NLCBhbmQgQj0xLVkgdG8gWUNiQ3IgdXNpbmcgdGhlIHNhbWUKKyAqIGNvbnZlcnNpb24gYXMgYWJvdmUsIHdoaWxlIHBhc3NpbmcgSyAoYmxhY2spIHVuY2hhbmdlZC4KKyAqIFdlIGFzc3VtZSByZ2JfeWNjX3N0YXJ0IGhhcyBiZWVuIGNhbGxlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2NteWtfeWNja19jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7CisgIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjEsIG91dHB0cjIsIG91dHB0cjM7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKKyAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIzID0gb3V0cHV0X2J1ZlszXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHIgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clswXSk7CisgICAgICBnID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMV0pOworICAgICAgYiA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzJdKTsKKyAgICAgIC8qIEsgcGFzc2VzIHRocm91Z2ggYXMtaXMgKi8KKyAgICAgIG91dHB0cjNbY29sXSA9IGlucHRyWzNdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUgaGVyZSAqLworICAgICAgaW5wdHIgKz0gNDsKKyAgICAgIC8qIElmIHRoZSBpbnB1dHMgYXJlIDAuLk1BWEpTQU1QTEUsIHRoZSBvdXRwdXRzIG9mIHRoZXNlIGVxdWF0aW9ucworICAgICAgICogbXVzdCBiZSB0b287IHdlIGRvIG5vdCBuZWVkIGFuIGV4cGxpY2l0IHJhbmdlLWxpbWl0aW5nIG9wZXJhdGlvbi4KKyAgICAgICAqIEhlbmNlIHRoZSB2YWx1ZSBiZWluZyBzaGlmdGVkIGlzIG5ldmVyIG5lZ2F0aXZlLCBhbmQgd2UgZG9uJ3QKKyAgICAgICAqIG5lZWQgdGhlIGdlbmVyYWwgUklHSFRfU0hJRlQgbWFjcm8uCisgICAgICAgKi8KKyAgICAgIC8qIFkgKi8KKyAgICAgIG91dHB0cjBbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDYiAqLworICAgICAgb3V0cHRyMVtjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ0JfT0ZGXSArIGN0YWJbZytHX0NCX09GRl0gKyBjdGFiW2IrQl9DQl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICAgIC8qIENyICovCisgICAgICBvdXRwdHIyW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9DUl9PRkZdICsgY3RhYltnK0dfQ1JfT0ZGXSArIGN0YWJbYitCX0NSX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBncmF5c2NhbGUgb3V0cHV0IHdpdGggbm8gY29udmVyc2lvbi4KKyAqIFRoZSBzb3VyY2UgY2FuIGJlIGVpdGhlciBwbGFpbiBncmF5c2NhbGUgb3IgWUNiQ3IgKHNpbmNlIFkgPT0gZ3JheSkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitncmF5c2NhbGVfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJCSAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKyAgaW50IGluc3RyaWRlID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0ciA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107CisgICAgb3V0cHV0X3JvdysrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICBvdXRwdHJbY29sXSA9IGlucHRyWzBdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICBpbnB0ciArPSBpbnN0cmlkZTsKKyAgICB9CisgIH0KK30KKworI2lmZGVmIEVOQUJMRV9BTkRST0lEX05VTExfQ09OVkVSVAorCit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzI7CisKKyNkZWZpbmUgQjAobikgICAoKG4pICYgMHhGRikKKyNkZWZpbmUgQjEobikgICAoKChuKSA+PiA4KSAmIDB4RkYpCisjZGVmaW5lIEIyKG4pICAgKCgobikgPj4gMTYpICYgMHhGRikKKyNkZWZpbmUgQjMobikgICAoKG4pID4+IDI0KQorCisjZGVmaW5lIFBBQ0soYSwgYiwgYywgZCkgICAgKChhKSB8ICgoYikgPDwgOCkgfCAoKGMpIDw8IDE2KSB8ICgoZCkgPDwgMjQpKQorCitzdGF0aWMgaW50IHB0cl9pc19xdWFkKGNvbnN0IHZvaWQqIHApCit7CisgICAgcmV0dXJuICgoKGNvbnN0IGNoYXIqKXAgLSAoY29uc3QgY2hhciopMCkgJiAzKSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBjb3B5cXVhZHMoY29uc3QgVUlOVDMyIGluW10sIFVJTlQzMiBvdXQwW10sIFVJTlQzMiBvdXQxW10sIFVJTlQzMiBvdXQyW10sIGludCBjb2w0KQoreworICAgIGRvIHsKKyAgICAgICAgVUlOVDMyIHNyYzAgPSAqaW4rKzsKKyAgICAgICAgVUlOVDMyIHNyYzEgPSAqaW4rKzsKKyAgICAgICAgVUlOVDMyIHNyYzIgPSAqaW4rKzsKKyAgICAgICAgLy8gTEVuZGlhbgorICAgICAgICAqb3V0MCsrID0gUEFDSyhCMChzcmMwKSwgQjMoc3JjMCksIEIyKHNyYzEpLCBCMShzcmMyKSk7CisgICAgICAgICpvdXQxKysgPSBQQUNLKEIxKHNyYzApLCBCMChzcmMxKSwgQjMoc3JjMSksIEIyKHNyYzIpKTsKKyAgICAgICAgKm91dDIrKyA9IFBBQ0soQjIoc3JjMCksIEIxKHNyYzEpLCBCMChzcmMyKSwgQjMoc3JjMikpOworICAgIH0gd2hpbGUgKC0tY29sNCAhPSAwKTsKK30KKworI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBtdWx0aS1jb21wb25lbnQgY29sb3JzcGFjZXMgd2l0aG91dCBjb252ZXJzaW9uLgorICogV2UgYXNzdW1lIGlucHV0X2NvbXBvbmVudHMgPT0gbnVtX2NvbXBvbmVudHMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitudWxsX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICByZWdpc3RlciBpbnQgY2k7CisgIGludCBuYyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKworI2lmZGVmIEVOQUJMRV9BTkRST0lEX05VTExfQ09OVkVSVAorICAgIGlmICgxID09IG51bV9yb3dzICYmIDMgPT0gbmMgJiYgbnVtX2NvbHMgPiAwKSB7CisgICAgICAgIEpTQU1QUk9XIGlucHRyID0gKmlucHV0X2J1ZjsKKyAgICAgICAgSlNBTVBST1cgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107CisgICAgICAgIEpTQU1QUk9XIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOworICAgICAgICBKU0FNUFJPVyBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICAgICAgCisgICAgICAgIGludCBjb2wgPSBudW1fY29sczsKKyAgICAgICAgaW50IGNvbDQgPSBjb2wgPj4gMjsKKyAgICAgICAgaWYgKGNvbDQgPiAwICYmIHB0cl9pc19xdWFkKGlucHRyKSAmJiBwdHJfaXNfcXVhZChvdXRwdHIwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2lzX3F1YWQob3V0cHRyMSkgJiYgcHRyX2lzX3F1YWQob3V0cHRyMikpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgVUlOVDMyKiBpbiA9IChjb25zdCBVSU5UMzIqKWlucHRyOworICAgICAgICAgICAgVUlOVDMyKiBvdXQwID0gKFVJTlQzMiopb3V0cHRyMDsKKyAgICAgICAgICAgIFVJTlQzMiogb3V0MSA9IChVSU5UMzIqKW91dHB0cjE7CisgICAgICAgICAgICBVSU5UMzIqIG91dDIgPSAoVUlOVDMyKilvdXRwdHIyOworICAgICAgICAgICAgY29weXF1YWRzKGluLCBvdXQwLCBvdXQxLCBvdXQyLCBjb2w0KTsKKyAgICAgICAgICAgIGNvbCAmPSAzOworICAgICAgICAgICAgaWYgKDAgPT0gY29sKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNvbDQgPDw9IDI7CisgICAgICAgICAgICBpbnB0ciArPSBjb2w0ICogMzsgIC8qIHdlIHJlYWQgdGhpcyAzIHRpbWVzIHBlciBpbiBjb3B5cXVhZHMgKi8KKyAgICAgICAgICAgIG91dHB0cjAgKz0gY29sNDsKKyAgICAgICAgICAgIG91dHB0cjEgKz0gY29sNDsKKyAgICAgICAgICAgIG91dHB0cjIgKz0gY29sNDsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byB3aGlsZS1sb29wICovCisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgICAgKm91dHB0cjArKyA9ICppbnB0cisrOworICAgICAgICAgICAgKm91dHB0cjErKyA9ICppbnB0cisrOworICAgICAgICAgICAgKm91dHB0cjIrKyA9ICppbnB0cisrOworICAgICAgICB9IHdoaWxlICgtLWNvbCAhPSAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK1NMT1c6CisjZW5kaWYKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIC8qIEl0IHNlZW1zIGZhc3Rlc3QgdG8gbWFrZSBhIHNlcGFyYXRlIHBhc3MgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7CisgICAgICBpbnB0ciA9ICppbnB1dF9idWY7CisgICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2NpXVtvdXRwdXRfcm93XTsKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisJb3V0cHRyW2NvbF0gPSBpbnB0cltjaV07IC8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKwlpbnB0ciArPSBuYzsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfYnVmKys7CisgICAgb3V0cHV0X3JvdysrOworICB9Cit9CisKKworLyoKKyAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK251bGxfbWV0aG9kIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBuZWVkZWQgKi8KK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NvbG9yX2NvbnZlcnRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKKworICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29sb3JfY29udmVydGVyKSk7CisgIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKikgY2NvbnZlcnQ7CisgIC8qIHNldCBzdGFydF9wYXNzIHRvIG51bGwgbWV0aG9kIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCisgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IG51bGxfbWV0aG9kOworCisgIC8qIE1ha2Ugc3VyZSBpbnB1dF9jb21wb25lbnRzIGFncmVlcyB3aXRoIGluX2NvbG9yX3NwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyNpZiBSR0JfUElYRUxTSVpFICE9IDMKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCisKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICBjYXNlIEpDU19ZQ0NLOgorICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBKQ1NfVU5LTk9XTiBjYW4gYmUgYW55dGhpbmcgKi8KKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPCAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBDaGVjayBudW1fY29tcG9uZW50cywgc2V0IGNvbnZlcnNpb24gbWV0aG9kIGJhc2VkIG9uIHJlcXVlc3RlZCBzcGFjZSAqLworICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OworICAgIGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX2dyYXlfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCICYmIFJHQl9QSVhFTFNJWkUgPT0gMykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfeWNjX2NvbnZlcnQ7CisgICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBjbXlrX3ljY2tfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBhbGxvdyBudWxsIGNvbnZlcnNpb24gb2YgSkNTX1VOS05PV04gKi8KKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gY2luZm8tPmluX2NvbG9yX3NwYWNlIHx8CisJY2luZm8tPm51bV9jb21wb25lbnRzICE9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvanBlZy9qY2RjdG1nci5jIGIvanBlZy9qY2RjdG1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmE3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjZGN0bWdyLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBqY2RjdG1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvcndhcmQtRENUIG1hbmFnZW1lbnQgbG9naWMuCisgKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCisgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzIGluY2x1ZGluZyBjb2VmZmljaWVudAorICogcXVhbnRpemF0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gdGhlIERDVCByb3V0aW5lIGFjdHVhbGx5IGluIHVzZSAqLworICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdDsKKworICAvKiBUaGUgYWN0dWFsIHBvc3QtRENUIGRpdmlzb3JzIC0tLSBub3QgaWRlbnRpY2FsIHRvIHRoZSBxdWFudCB0YWJsZQorICAgKiBlbnRyaWVzLCBiZWNhdXNlIG9mIHNjYWxpbmcgKGVzcGVjaWFsbHkgZm9yIGFuIHVubm9ybWFsaXplZCBEQ1QpLgorICAgKiBFYWNoIHRhYmxlIGlzIGdpdmVuIGluIG5vcm1hbCBhcnJheSBvcmRlci4KKyAgICovCisgIERDVEVMRU0gKiBkaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIC8qIFNhbWUgYXMgYWJvdmUgZm9yIHRoZSBmbG9hdGluZy1wb2ludCBjYXNlLiAqLworICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19mbG9hdF9kY3Q7CisgIEZBU1RfRkxPQVQgKiBmbG9hdF9kaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisjZW5kaWYKK30gbXlfZmRjdF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2ZkY3RfY29udHJvbGxlciAqIG15X2ZkY3RfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqIFZlcmlmeSB0aGF0IGFsbCByZWZlcmVuY2VkIFEtdGFibGVzIGFyZSBwcmVzZW50LCBhbmQgc2V0IHVwCisgKiB0aGUgZGl2aXNvciB0YWJsZSBmb3IgZWFjaCBvbmUuCisgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgRENUIG9mIGFsbCBjb21wb25lbnRzIGlzIGRvbmUgZHVyaW5nCisgKiB0aGUgZmlyc3QgcGFzcywgZXZlbiBpZiBvbmx5IHNvbWUgY29tcG9uZW50cyB3aWxsIGJlIG91dHB1dCBpbiB0aGUKKyAqIGZpcnN0IHNjYW4uICBIZW5jZSBhbGwgY29tcG9uZW50cyBzaG91bGQgYmUgZXhhbWluZWQgaGVyZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfZmRjdG1nciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OworICBpbnQgY2ksIHF0YmxubywgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisgIERDVEVMRU0gKiBkdGJsOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOworICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KKyAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7CisgICAgcXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dOworICAgIC8qIENvbXB1dGUgZGl2aXNvcnMgZm9yIHRoaXMgcXVhbnQgdGFibGUgKi8KKyAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3Igc2FtZSB0YWJsZSwgYnV0IGl0J3Mgbm90IGEgYmlnIGRlYWwgKi8KKyAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JU0xPVzoKKyAgICAgIC8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgorICAgICAgICogY29lZmZpY2llbnRzIG11bHRpcGxpZWQgYnkgOCAodG8gY291bnRlcmFjdCBzY2FsaW5nKS4KKyAgICAgICAqLworICAgICAgaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCWZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7CisgICAgICB9CisgICAgICBkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJZHRibFtpXSA9ICgoRENURUxFTSkgcXRibC0+cXVhbnR2YWxbaV0pIDw8IDM7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfSUZBU1Q6CisgICAgICB7CisJLyogRm9yIEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCisJICovCisjZGVmaW5lIENPTlNUX0JJVFMgMTQKKwlzdGF0aWMgY29uc3QgSU5UMTYgYWFuc2NhbGVzW0RDVFNJWkUyXSA9IHsKKwkgIC8qIHByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTQgYml0cyAqLworCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAorCSAgMjE0MDcsIDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsICA1OTA2LAorCSAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAorCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMTI4NzMsIDE3ODU1LCAxNjgxOSwgMTUxMzcsIDEyODczLCAxMDExNCwgIDY5NjcsICAzNTUyLAorCSAgIDg4NjcsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAorCSAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3CisJfTsKKwlTSElGVF9URU1QUworCisJaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCSAgZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCisJICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJCURDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKKwl9CisJZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107CisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGR0YmxbaV0gPSAoRENURUxFTSkKKwkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCisJCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCisJCSAgICBDT05TVF9CSVRTLTMpOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9GTE9BVDoKKyAgICAgIHsKKwkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KKwkgKiBXaGF0J3MgYWN0dWFsbHkgc3RvcmVkIGlzIDEvZGl2aXNvciBzbyB0aGF0IHRoZSBpbm5lciBsb29wIGNhbgorCSAqIHVzZSBhIG11bHRpcGxpY2F0aW9uIHJhdGhlciB0aGFuIGEgZGl2aXNpb24uCisJICovCisJRkFTVF9GTE9BVCAqIGZkdGJsOworCWludCByb3csIGNvbDsKKwlzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yW0RDVFNJWkVdID0geworCSAgMS4wLCAxLjM4NzAzOTg0NSwgMS4zMDY1NjI5NjUsIDEuMTc1ODc1NjAyLAorCSAgMS4wLCAwLjc4NTY5NDk1OCwgMC41NDExOTYxMDAsIDAuMjc1ODk5Mzc5CisJfTsKKworCWlmIChmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKKwkgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPSAoRkFTVF9GTE9BVCAqKQorCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihGQVNUX0ZMT0FUKSk7CisJfQorCWZkdGJsID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXTsKKwlpID0gMDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7CisJICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7CisJICAgIGZkdGJsW2ldID0gKEZBU1RfRkxPQVQpCisJICAgICAgKDEuMCAvICgoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgorCQkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0gKiA4LjApKSk7CisJICAgIGkrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBmb3J3YXJkIERDVCBvbiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgYSBjb21wb25lbnQuCisgKgorICogVGhlIGlucHV0IHNhbXBsZXMgYXJlIHRha2VuIGZyb20gdGhlIHNhbXBsZV9kYXRhW10gYXJyYXkgc3RhcnRpbmcgYXQKKyAqIHBvc2l0aW9uIHN0YXJ0X3Jvdy9zdGFydF9jb2wsIGFuZCBtb3ZpbmcgdG8gdGhlIHJpZ2h0IGZvciBhbnkgYWRkaXRpb25hbAorICogYmxvY2tzLiBUaGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gY29lZl9ibG9ja3NbXS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZvcndhcmRfRENUIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCisJICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCisvKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgaW50ZWdlciBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19kY3Q7CisgIERDVEVMRU0gKiBkaXZpc29ycyA9IGZkY3QtPmRpdmlzb3JzW2NvbXBwdHItPnF1YW50X3RibF9ub107CisgIERDVEVMRU0gd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogd29yayBhcmVhIGZvciBGRENUIHN1YnJvdXRpbmUgKi8KKyAgSkRJTUVOU0lPTiBiaTsKKworICBzYW1wbGVfZGF0YSArPSBzdGFydF9yb3c7CS8qIGZvbGQgaW4gdGhlIHZlcnRpY2FsIG9mZnNldCBvbmNlICovCisKKyAgZm9yIChiaSA9IDA7IGJpIDwgbnVtX2Jsb2NrczsgYmkrKywgc3RhcnRfY29sICs9IERDVFNJWkUpIHsKKyAgICAvKiBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UsIGFwcGx5aW5nIHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSAqd29ya3NwYWNlcHRyOworICAgICAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKKyAgICAgIHJlZ2lzdGVyIGludCBlbGVtcjsKKworICAgICAgd29ya3NwYWNlcHRyID0gd29ya3NwYWNlOworICAgICAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgeworCWVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7CisjaWYgRENUU0laRSA9PSA4CQkvKiB1bnJvbGwgdGhlIGlubmVyIGxvb3AgKi8KKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKyNlbHNlCisJeyByZWdpc3RlciBpbnQgZWxlbWM7CisJICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7CisJICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSAgfQorCX0KKyNlbmRpZgorICAgICAgfQorICAgIH0KKworICAgIC8qIFBlcmZvcm0gdGhlIERDVCAqLworICAgICgqZG9fZGN0KSAod29ya3NwYWNlKTsKKworICAgIC8qIFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9ja3NbXSAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSB0ZW1wLCBxdmFsOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICByZWdpc3RlciBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9ja3NbYmldOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCXF2YWwgPSBkaXZpc29yc1tpXTsKKwl0ZW1wID0gd29ya3NwYWNlW2ldOworCS8qIERpdmlkZSB0aGUgY29lZmZpY2llbnQgdmFsdWUgYnkgcXZhbCwgZW5zdXJpbmcgcHJvcGVyIHJvdW5kaW5nLgorCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQorCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgorCSAqCisJICogSW4gbW9zdCBmaWxlcywgYXQgbGVhc3QgaGFsZiBvZiB0aGUgb3V0cHV0IHZhbHVlcyB3aWxsIGJlIHplcm8KKwkgKiAoYXQgZGVmYXVsdCBxdWFudGl6YXRpb24gc2V0dGluZ3MsIG1vcmUgbGlrZSB0aHJlZS1xdWFydGVycy4uLikKKwkgKiBzbyB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhpcyBjYXNlIGlzIGZhc3QuICBPbiBtYW55IG1hY2hpbmVzLAorCSAqIGEgY29tcGFyaXNvbiBpcyBlbm91Z2ggY2hlYXBlciB0aGFuIGEgZGl2aWRlIHRvIG1ha2UgYSBzcGVjaWFsIHRlc3QKKwkgKiBhIHdpbi4gIFNpbmNlIGJvdGggaW5wdXRzIHdpbGwgYmUgbm9ubmVnYXRpdmUsIHdlIG5lZWQgb25seSB0ZXN0CisJICogZm9yIGEgPCBiIHRvIGRpc2NvdmVyIHdoZXRoZXIgYS9iIGlzIDAuCisJICogSWYgeW91ciBtYWNoaW5lJ3MgZGl2aXNpb24gaXMgZmFzdCBlbm91Z2gsIGRlZmluZSBGQVNUX0RJVklERS4KKwkgKi8KKyNpZmRlZiBGQVNUX0RJVklERQorI2RlZmluZSBESVZJREVfQlkoYSxiKQlhIC89IGIKKyNlbHNlCisjZGVmaW5lIERJVklERV9CWShhLGIpCWlmIChhID49IGIpIGEgLz0gYjsgZWxzZSBhID0gMAorI2VuZGlmCisJaWYgKHRlbXAgPCAwKSB7CisJICB0ZW1wID0gLXRlbXA7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCSAgdGVtcCA9IC10ZW1wOworCX0gZWxzZSB7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCX0KKwlvdXRwdXRfcHRyW2ldID0gKEpDT0VGKSB0ZW1wOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisKK01FVEhPRERFRih2b2lkKQorZm9yd2FyZF9EQ1RfZmxvYXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAorCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJCSAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykKKy8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciBmbG9hdGluZy1wb2ludCBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZmxvYXRfZGN0OworICBGQVNUX0ZMT0FUICogZGl2aXNvcnMgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOworICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCisgIEpESU1FTlNJT04gYmk7CisKKyAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLworCisgIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7CisgICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgKndvcmtzcGFjZXB0cjsKKyAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7CisgICAgICByZWdpc3RlciBpbnQgZWxlbXI7CisKKyAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKKyAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKKwllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOworI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworI2Vsc2UKKwl7IHJlZ2lzdGVyIGludCBlbGVtYzsKKwkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKKwkgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpCisJICAgICAgKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkgIH0KKwl9CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KKyAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7CisKKyAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgdGVtcDsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkvKiBBcHBseSB0aGUgcXVhbnRpemF0aW9uIGFuZCBzY2FsaW5nIGZhY3RvciAqLworCXRlbXAgPSB3b3Jrc3BhY2VbaV0gKiBkaXZpc29yc1tpXTsKKwkvKiBSb3VuZCB0byBuZWFyZXN0IGludGVnZXIuCisJICogU2luY2UgQyBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2Ygcm91bmRpbmcgZm9yIG5lZ2F0aXZlCisJICogcXVvdGllbnRzLCB3ZSBoYXZlIHRvIGZvcmNlIHRoZSBkaXZpZGVuZCBwb3NpdGl2ZSBmb3IgcG9ydGFiaWxpdHkuCisJICogVGhlIG1heGltdW0gY29lZmZpY2llbnQgc2l6ZSBpcyArLTE2SyAoZm9yIDEyLWJpdCBkYXRhKSwgc28gdGhpcworCSAqIGNvZGUgc2hvdWxkIHdvcmsgZm9yIGVpdGhlciAxNi1iaXQgb3IgMzItYml0IGludHMuCisJICovCisJb3V0cHV0X3B0cltpXSA9IChKQ09FRikgKChpbnQpICh0ZW1wICsgKEZBU1RfRkxPQVQpIDE2Mzg0LjUpIC0gMTYzODQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIEZEQ1QgbWFuYWdlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2ZvcndhcmRfZGN0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZmRjdF9wdHIgZmRjdDsKKyAgaW50IGk7CisKKyAgZmRjdCA9IChteV9mZGN0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9mZGN0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmZkY3QgPSAoc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKikgZmRjdDsKKyAgZmRjdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2ZkY3RtZ3I7CisKKyAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgeworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lTTE9XOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pc2xvdzsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lGQVNUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pZmFzdDsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0ZMT0FUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUX2Zsb2F0OworICAgIGZkY3QtPmRvX2Zsb2F0X2RjdCA9IGpwZWdfZmRjdF9mbG9hdDsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIE1hcmsgZGl2aXNvciB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBmZGN0LT5kaXZpc29yc1tpXSA9IE5VTEw7CisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW2ldID0gTlVMTDsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS9qcGVnL2pjaHVmZi5jIGIvanBlZy9qY2h1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM1MjUwCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qY2h1ZmYuYwpAQCAtMCwwICsxLDkwOSBAQAorLyoKKyAqIGpjaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIG91dHB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCisgKiBiYWNrIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlCisgKiB2YXJpYWJsZXMgaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZQorICogcGVybWFuZW50IEpQRUcgb2JqZWN0cyBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamNodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamNwaHVmZi5jICovCisKKworLyogRXhwYW5kZWQgZW50cm9weSBlbmNvZGVyIG9iamVjdCBmb3IgSHVmZm1hbiBlbmNvZGluZy4KKyAqCisgKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCisgKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UMzIgcHV0X2J1ZmZlcjsJCS8qIGN1cnJlbnQgYml0LWFjY3VtdWxhdGlvbiBidWZmZXIgKi8KKyAgaW50IHB1dF9iaXRzOwkJCS8qICMgb2YgYml0cyBub3cgaW4gaXQgKi8KKyAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLworfSBzYXZhYmxlX3N0YXRlOworCisvKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCisgKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KKyAqLworCisjaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQorI2Vsc2UKKyNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0CisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKKwkoKGRlc3QpLnB1dF9idWZmZXIgPSAoc3JjKS5wdXRfYnVmZmVyLCBcCisJIChkZXN0KS5wdXRfYml0cyA9IChzcmMpLnB1dF9iaXRzLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQorI2VuZGlmCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogQml0IGJ1ZmZlciAmIERDIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLworICBjX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworICBjX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECS8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb24gKi8KKyAgbG9uZyAqIGRjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107CisgIGxvbmcgKiBhY19jb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworI2VuZGlmCit9IGh1ZmZfZW50cm9weV9lbmNvZGVyOworCit0eXBlZGVmIGh1ZmZfZW50cm9weV9lbmNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKKworLyogV29ya2luZyBzdGF0ZSB3aGlsZSB3cml0aW5nIGFuIE1DVS4KKyAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGFsbCB0aGUgZmllbGRzIHRoYXQgYXJlIG5lZWRlZCBieSBzdWJyb3V0aW5lcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KKyAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKyAgc2F2YWJsZV9zdGF0ZSBjdXI7CQkvKiBDdXJyZW50IGJpdCBidWZmZXIgJiBEQyBzdGF0ZSAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGR1bXBfYnVmZmVyIG5lZWRzIGFjY2VzcyB0byB0aGlzICovCit9IHdvcmtpbmdfc3RhdGU7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2dhdGhlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqIElmIGdhdGhlcl9zdGF0aXN0aWNzIGlzIFRSVUUsIHdlIGRvIG5vdCBvdXRwdXQgYW55dGhpbmcgZHVyaW5nIHRoZSBzY2FuLAorICoganVzdCBjb3VudCB0aGUgSHVmZm1hbiBzeW1ib2xzIHVzZWQgYW5kIGdlbmVyYXRlIEh1ZmZtYW4gY29kZSB0YWJsZXMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaSwgZGN0YmwsIGFjdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfZ2F0aGVyOworICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2dhdGhlcjsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2h1ZmY7CisgICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfaHVmZjsKKyAgfQorCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIHRhYmxlIGluZGV4ZXMgKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKGRjdGJsIDwgMCB8fCBkY3RibCA+PSBOVU1fSFVGRl9UQkxTKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGRjdGJsKTsKKyAgICAgIGlmIChhY3RibCA8IDAgfHwgYWN0YmwgPj0gTlVNX0hVRkZfVEJMUykKKwlFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBhY3RibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9PSBOVUxMKQorCWVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID0gKGxvbmcgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKKyAgICAgIE1FTVpFUk8oZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgICBpZiAoZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9IChsb25nICopCisJICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgICBNRU1aRVJPKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCisgICAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLworICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKKyAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgYWN0YmwsCisJCQkgICAgICAmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOworICAgIH0KKyAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnNhdmVkLnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5zYXZlZC5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qCisgKiBDb21wdXRlIHRoZSBkZXJpdmVkIHZhbHVlcyBmb3IgYSBIdWZmbWFuIHRhYmxlLgorICogVGhpcyByb3V0aW5lIGFsc28gcGVyZm9ybXMgc29tZSB2YWxpZGF0aW9uIGNoZWNrcyBvbiB0aGUgdGFibGUuCisgKgorICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX21ha2VfY19kZXJpdmVkX3RibCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCQkJIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpCit7CisgIEpIVUZGX1RCTCAqaHRibDsKKyAgY19kZXJpdmVkX3RibCAqZHRibDsKKyAgaW50IHAsIGksIGwsIGxhc3RwLCBzaSwgbWF4c3ltYm9sOworICBjaGFyIGh1ZmZzaXplWzI1N107CisgIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOworICB1bnNpZ25lZCBpbnQgY29kZTsKKworICAvKiBOb3RlIHRoYXQgaHVmZnNpemVbXSBhbmQgaHVmZmNvZGVbXSBhcmUgZmlsbGVkIGluIGNvZGUtbGVuZ3RoIG9yZGVyLAorICAgKiBwYXJhbGxlbGluZyB0aGUgb3JkZXIgb2YgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpbiBodGJsLT5odWZmdmFsW10uCisgICAqLworCisgIC8qIEZpbmQgdGhlIGlucHV0IEh1ZmZtYW4gdGFibGUgKi8KKyAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fSFVGRl9UQkxTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKyAgaHRibCA9CisgICAgaXNEQyA/IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibG5vXSA6IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibG5vXTsKKyAgaWYgKGh0YmwgPT0gTlVMTCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7CisKKyAgLyogQWxsb2NhdGUgYSB3b3Jrc3BhY2UgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uICovCisgIGlmICgqcGR0YmwgPT0gTlVMTCkKKyAgICAqcGR0YmwgPSAoY19kZXJpdmVkX3RibCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihjX2Rlcml2ZWRfdGJsKSk7CisgIGR0YmwgPSAqcGR0Ymw7CisgIAorICAvKiBGaWd1cmUgQy4xOiBtYWtlIHRhYmxlIG9mIEh1ZmZtYW4gY29kZSBsZW5ndGggZm9yIGVhY2ggc3ltYm9sICovCisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgeworICAgIGkgPSAoaW50KSBodGJsLT5iaXRzW2xdOworICAgIGlmIChpIDwgMCB8fCBwICsgaSA+IDI1NikJLyogcHJvdGVjdCBhZ2FpbnN0IHRhYmxlIG92ZXJydW4gKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIHdoaWxlIChpLS0pCisgICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7CisgIH0KKyAgaHVmZnNpemVbcF0gPSAwOworICBsYXN0cCA9IHA7CisgIAorICAvKiBGaWd1cmUgQy4yOiBnZW5lcmF0ZSB0aGUgY29kZXMgdGhlbXNlbHZlcyAqLworICAvKiBXZSBhbHNvIHZhbGlkYXRlIHRoYXQgdGhlIGNvdW50cyByZXByZXNlbnQgYSBsZWdhbCBIdWZmbWFuIGNvZGUgdHJlZS4gKi8KKworICBjb2RlID0gMDsKKyAgc2kgPSBodWZmc2l6ZVswXTsKKyAgcCA9IDA7CisgIHdoaWxlIChodWZmc2l6ZVtwXSkgeworICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IHNpKSB7CisgICAgICBodWZmY29kZVtwKytdID0gY29kZTsKKyAgICAgIGNvZGUrKzsKKyAgICB9CisgICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKKyAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBzaSkpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBjb2RlIDw8PSAxOworICAgIHNpKys7CisgIH0KKyAgCisgIC8qIEZpZ3VyZSBDLjM6IGdlbmVyYXRlIGVuY29kaW5nIHRhYmxlcyAqLworICAvKiBUaGVzZSBhcmUgY29kZSBhbmQgc2l6ZSBpbmRleGVkIGJ5IHN5bWJvbCB2YWx1ZSAqLworCisgIC8qIFNldCBhbGwgY29kZWxlc3Mgc3ltYm9scyB0byBoYXZlIGNvZGUgbGVuZ3RoIDA7CisgICAqIHRoaXMgbGV0cyB1cyBkZXRlY3QgZHVwbGljYXRlIFZBTCBlbnRyaWVzIGhlcmUsIGFuZCBsYXRlcgorICAgKiBhbGxvd3MgZW1pdF9iaXRzIHRvIGRldGVjdCBhbnkgYXR0ZW1wdCB0byBlbWl0IHN1Y2ggc3ltYm9scy4KKyAgICovCisgIE1FTVpFUk8oZHRibC0+ZWh1ZnNpLCBTSVpFT0YoZHRibC0+ZWh1ZnNpKSk7CisKKyAgLyogVGhpcyBpcyBhbHNvIGEgY29udmVuaWVudCBwbGFjZSB0byBjaGVjayBmb3Igb3V0LW9mLXJhbmdlCisgICAqIGFuZCBkdXBsaWNhdGVkIFZBTCBlbnRyaWVzLiAgV2UgYWxsb3cgMC4uMjU1IGZvciBBQyBzeW1ib2xzCisgICAqIGJ1dCBvbmx5IDAuLjE1IGZvciBEQy4gIChXZSBjb3VsZCBjb25zdHJhaW4gdGhlbSBmdXJ0aGVyCisgICAqIGJhc2VkIG9uIGRhdGEgZGVwdGggYW5kIG1vZGUsIGJ1dCB0aGlzIHNlZW1zIGVub3VnaC4pCisgICAqLworICBtYXhzeW1ib2wgPSBpc0RDID8gMTUgOiAyNTU7CisKKyAgZm9yIChwID0gMDsgcCA8IGxhc3RwOyBwKyspIHsKKyAgICBpID0gaHRibC0+aHVmZnZhbFtwXTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+IG1heHN5bWJvbCB8fCBkdGJsLT5laHVmc2lbaV0pCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBkdGJsLT5laHVmY29baV0gPSBodWZmY29kZVtwXTsKKyAgICBkdGJsLT5laHVmc2lbaV0gPSBodWZmc2l6ZVtwXTsKKyAgfQorfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUgKi8KKworLyogRW1pdCBhIGJ5dGUsIHRha2luZyAnYWN0aW9uJyBpZiBtdXN0IHN1c3BlbmQuICovCisjZGVmaW5lIGVtaXRfYnl0ZShzdGF0ZSx2YWwsYWN0aW9uKSAgXAorCXsgKihzdGF0ZSktPm5leHRfb3V0cHV0X2J5dGUrKyA9IChKT0NURVQpICh2YWwpOyAgXAorCSAgaWYgKC0tKHN0YXRlKS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgaWYgKCEgZHVtcF9idWZmZXIoc3RhdGUpKSAgXAorCSAgICAgIHsgYWN0aW9uOyB9IH0KKworCitMT0NBTChib29sZWFuKQorZHVtcF9idWZmZXIgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKKy8qIEVtcHR5IHRoZSBvdXRwdXQgYnVmZmVyOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IHN0YXRlLT5jaW5mby0+ZGVzdDsKKworICBpZiAoISAoKmRlc3QtPmVtcHR5X291dHB1dF9idWZmZXIpIChzdGF0ZS0+Y2luZm8pKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogQWZ0ZXIgYSBzdWNjZXNzZnVsIGJ1ZmZlciBkdW1wLCBtdXN0IHJlc2V0IGJ1ZmZlciBwb2ludGVycyAqLworICBzdGF0ZS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIHN0YXRlLT5mcmVlX2luX2J1ZmZlciA9IGRlc3QtPmZyZWVfaW5fYnVmZmVyOworICByZXR1cm4gVFJVRTsKK30KKworCisvKiBPdXRwdXR0aW5nIGJpdHMgdG8gdGhlIGZpbGUgKi8KKworLyogT25seSB0aGUgcmlnaHQgMjQgYml0cyBvZiBwdXRfYnVmZmVyIGFyZSB1c2VkOyB0aGUgdmFsaWQgYml0cyBhcmUKKyAqIGxlZnQtanVzdGlmaWVkIGluIHRoaXMgcGFydC4gIEF0IG1vc3QgMTYgYml0cyBjYW4gYmUgcGFzc2VkIHRvIGVtaXRfYml0cworICogaW4gb25lIGNhbGwsIGFuZCB3ZSBuZXZlciByZXRhaW4gbW9yZSB0aGFuIDcgYml0cyBpbiBwdXRfYnVmZmVyCisgKiBiZXR3ZWVuIGNhbGxzLCBzbyAyNCBiaXRzIGFyZSBzdWZmaWNpZW50LgorICovCisKK0lOTElORQorTE9DQUwoYm9vbGVhbikKK2VtaXRfYml0cyAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHNpemUpCisvKiBFbWl0IHNvbWUgYml0czsgcmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgbXVzdCBzdXNwZW5kICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IHN0YXRlLT5jdXIucHV0X2JpdHM7CisKKyAgLyogaWYgc2l6ZSBpcyAwLCBjYWxsZXIgdXNlZCBhbiBpbnZhbGlkIEh1ZmZtYW4gdGFibGUgZW50cnkgKi8KKyAgaWYgKHNpemUgPT0gMCkKKyAgICBFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgcHV0X2J1ZmZlciAmPSAoKChJTlQzMikgMSk8PHNpemUpIC0gMTsgLyogbWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gY29kZSAqLworICAKKyAgcHV0X2JpdHMgKz0gc2l6ZTsJCS8qIG5ldyBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KKyAgCisgIHB1dF9idWZmZXIgPDw9IDI0IC0gcHV0X2JpdHM7IC8qIGFsaWduIGluY29taW5nIGJpdHMgKi8KKworICBwdXRfYnVmZmVyIHw9IHN0YXRlLT5jdXIucHV0X2J1ZmZlcjsgLyogYW5kIG1lcmdlIHdpdGggb2xkIGJ1ZmZlciBjb250ZW50cyAqLworICAKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoc3RhdGUsIGMsIHJldHVybiBGQUxTRSk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShzdGF0ZSwgMCwgcmV0dXJuIEZBTFNFKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gcHV0X2J1ZmZlcjsgLyogdXBkYXRlIHN0YXRlIHZhcmlhYmxlcyAqLworICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gcHV0X2JpdHM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2ZsdXNoX2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKK3sKKyAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAweDdGLCA3KSkgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLworICAgIHJldHVybiBGQUxTRTsKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gMDsJLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgc3RhdGUtPmN1ci5wdXRfYml0cyA9IDA7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qIEVuY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCitMT0NBTChib29sZWFuKQorZW5jb2RlX29uZV9ibG9jayAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCBKQ09FRlBUUiBibG9jaywgaW50IGxhc3RfZGNfdmFsLAorCQkgIGNfZGVyaXZlZF90YmwgKmRjdGJsLCBjX2Rlcml2ZWRfdGJsICphY3RibCkKK3sKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCBrLCByLCBpOworICAKKyAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEYuMS4yLjEgKi8KKyAgCisgIHRlbXAgPSB0ZW1wMiA9IGJsb2NrWzBdIC0gbGFzdF9kY192YWw7CisKKyAgaWYgKHRlbXAgPCAwKSB7CisgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KKyAgICAvKiBGb3IgYSBuZWdhdGl2ZSBpbnB1dCwgd2FudCB0ZW1wMiA9IGJpdHdpc2UgY29tcGxlbWVudCBvZiBhYnMoaW5wdXQpICovCisgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgdGVtcDItLTsKKyAgfQorICAKKyAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICBuYml0cyA9IDA7CisgIHdoaWxlICh0ZW1wKSB7CisgICAgbmJpdHMrKzsKKyAgICB0ZW1wID4+PSAxOworICB9CisgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgorICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgorICAgKi8KKyAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQorICAgIEVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgIAorICAvKiBFbWl0IHRoZSBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmb3IgdGhlIG51bWJlciBvZiBiaXRzICovCisgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgZGN0YmwtPmVodWZjb1tuYml0c10sIGRjdGJsLT5laHVmc2lbbmJpdHNdKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCisgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICBpZiAobmJpdHMpCQkJLyogZW1pdF9iaXRzIHJlamVjdHMgY2FsbHMgd2l0aCBzaXplIDAgKi8KKyAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzB4RjBdLCBhY3RibC0+ZWh1ZnNpWzB4RjBdKSkKKwkgIHJldHVybiBGQUxTRTsKKwlyIC09IDE2OworICAgICAgfQorCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgICBpZiAodGVtcCA8IDApIHsKKwl0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworCS8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLworCXRlbXAyLS07CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgICAgIG5iaXRzID0gMTsJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCisgICAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorCW5iaXRzKys7CisgICAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLworICAgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKwlFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOworICAgICAgCisgICAgICAvKiBFbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KKyAgICAgIGkgPSAociA8PCA0KSArIG5iaXRzOworICAgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvW2ldLCBhY3RibC0+ZWh1ZnNpW2ldKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCisgICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisJcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICByID0gMDsKKyAgICB9CisgIH0KKworICAvKiBJZiB0aGUgbGFzdCBjb2VmKHMpIHdlcmUgemVybywgZW1pdCBhbiBlbmQtb2YtYmxvY2sgY29kZSAqLworICBpZiAociA+IDApCisgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzBdLCBhY3RibC0+ZWh1ZnNpWzBdKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTChib29sZWFuKQorZW1pdF9yZXN0YXJ0ICh3b3JraW5nX3N0YXRlICogc3RhdGUsIGludCByZXN0YXJ0X251bSkKK3sKKyAgaW50IGNpOworCisgIGlmICghIGZsdXNoX2JpdHMoc3RhdGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBlbWl0X2J5dGUoc3RhdGUsIDB4RkYsIHJldHVybiBGQUxTRSk7CisgIGVtaXRfYnl0ZShzdGF0ZSwgSlBFR19SU1QwICsgcmVzdGFydF9udW0sIHJldHVybiBGQUxTRSk7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IHN0YXRlLT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICBzdGF0ZS0+Y3VyLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisKKyAgLyogVGhlIHJlc3RhcnQgY291bnRlciBpcyBub3QgdXBkYXRlZCB1bnRpbCB3ZSBzdWNjZXNzZnVsbHkgd3JpdGUgdGhlIE1DVS4gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW5jb2RlIGFuZCBvdXRwdXQgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitlbmNvZGVfbWN1X2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIGVtaXRfcmVzdGFydCgmc3RhdGUsIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoISBlbmNvZGVfb25lX2Jsb2NrKCZzdGF0ZSwKKwkJCSAgIE1DVV9kYXRhW2Jsa25dWzBdLCBzdGF0ZS5jdXIubGFzdF9kY192YWxbY2ldLAorCQkJICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub10sCisJCQkgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbY29tcHB0ci0+YWNfdGJsX25vXSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogVXBkYXRlIGxhc3RfZGNfdmFsICovCisgICAgc3RhdGUuY3VyLmxhc3RfZGNfdmFsW2NpXSA9IE1DVV9kYXRhW2Jsa25dWzBdWzBdOworICB9CisKKyAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gc3RhdGUubmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gc3RhdGUuZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlIC4uLiBmbHVzaF9iaXRzIG5lZWRzIGl0ICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBGbHVzaCBvdXQgdGhlIGxhc3QgZGF0YSAqLworICBpZiAoISBmbHVzaF9iaXRzKCZzdGF0ZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworCisgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IHN0YXRlLm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IHN0YXRlLmZyZWVfaW5fYnVmZmVyOworICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlLmN1cik7Cit9CisKKworLyoKKyAqIEh1ZmZtYW4gY29kaW5nIG9wdGltaXphdGlvbi4KKyAqCisgKiBXZSBmaXJzdCBzY2FuIHRoZSBzdXBwbGllZCBkYXRhIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgZWFjaCBzeW1ib2wKKyAqIHRoYXQgaXMgdG8gYmUgSHVmZm1hbi1jb2RlZC4gKFRoaXMgcHJvY2VzcyBNVVNUIGFncmVlIHdpdGggdGhlIGNvZGUgYWJvdmUuKQorICogVGhlbiB3ZSBidWlsZCBhIEh1ZmZtYW4gY29kaW5nIHRyZWUgZm9yIHRoZSBvYnNlcnZlZCBjb3VudHMuCisgKiBTeW1ib2xzIHdoaWNoIGFyZSBub3QgbmVlZGVkIGF0IGFsbCBmb3IgdGhlIHBhcnRpY3VsYXIgaW1hZ2UgYXJlIG5vdAorICogYXNzaWduZWQgYW55IGNvZGUsIHdoaWNoIHNhdmVzIHNwYWNlIGluIHRoZSBESFQgbWFya2VyIGFzIHdlbGwgYXMgaW4KKyAqIHRoZSBjb21wcmVzc2VkIGRhdGEuCisgKi8KKworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorCisKKy8qIFByb2Nlc3MgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KKworTE9DQUwodm9pZCkKK2h0ZXN0X29uZV9ibG9jayAoal9jb21wcmVzc19wdHIgY2luZm8sIEpDT0VGUFRSIGJsb2NrLCBpbnQgbGFzdF9kY192YWwsCisJCSBsb25nIGRjX2NvdW50c1tdLCBsb25nIGFjX2NvdW50c1tdKQoreworICByZWdpc3RlciBpbnQgdGVtcDsKKyAgcmVnaXN0ZXIgaW50IG5iaXRzOworICByZWdpc3RlciBpbnQgaywgcjsKKyAgCisgIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBGLjEuMi4xICovCisgIAorICB0ZW1wID0gYmxvY2tbMF0gLSBsYXN0X2RjX3ZhbDsKKyAgaWYgKHRlbXAgPCAwKQorICAgIHRlbXAgPSAtdGVtcDsKKyAgCisgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgbmJpdHMgPSAwOworICB3aGlsZSAodGVtcCkgeworICAgIG5iaXRzKys7CisgICAgdGVtcCA+Pj0gMTsKKyAgfQorICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcy4KKyAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICovCisgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMrMSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisKKyAgLyogQ291bnQgdGhlIEh1ZmZtYW4gc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KKyAgZGNfY291bnRzW25iaXRzXSsrOworICAKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJYWNfY291bnRzWzB4RjBdKys7CisJciAtPSAxNjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgaWYgKHRlbXAgPCAwKQorCXRlbXAgPSAtdGVtcDsKKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KKyAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisJbmJpdHMrKzsKKyAgICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKyAgICAgIAorICAgICAgLyogQ291bnQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgICAgYWNfY291bnRzWyhyIDw8IDQpICsgbmJpdHNdKys7CisgICAgICAKKyAgICAgIHIgPSAwOworICAgIH0KKyAgfQorCisgIC8qIElmIHRoZSBsYXN0IGNvZWYocykgd2VyZSB6ZXJvLCBlbWl0IGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChyID4gMCkKKyAgICBhY19jb3VudHNbMF0rKzsKK30KKworCisvKgorICogVHJpYWwtZW5jb2RlIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogTm8gZGF0YSBpcyBhY3R1YWxseSBvdXRwdXQsIHNvIG5vIHN1c3BlbnNpb24gcmV0dXJuIGlzIHBvc3NpYmxlLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogVGFrZSBjYXJlIG9mIHJlc3RhcnQgaW50ZXJ2YWxzIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKwllbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICAgICAgLyogVXBkYXRlIHJlc3RhcnQgc3RhdGUgKi8KKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgaHRlc3Rfb25lX2Jsb2NrKGNpbmZvLCBNQ1VfZGF0YVtibGtuXVswXSwgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldLAorCQkgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tjb21wcHRyLT5kY190Ymxfbm9dLAorCQkgICAgZW50cm9weS0+YWNfY291bnRfcHRyc1tjb21wcHRyLT5hY190Ymxfbm9dKTsKKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSBNQ1VfZGF0YVtibGtuXVswXVswXTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBHZW5lcmF0ZSB0aGUgYmVzdCBIdWZmbWFuIGNvZGUgdGFibGUgZm9yIHRoZSBnaXZlbiBjb3VudHMsIGZpbGwgaHRibC4KKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamNwaHVmZi5jLgorICoKKyAqIFRoZSBKUEVHIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgbm8gc3ltYm9sIGJlIGFzc2lnbmVkIGEgY29kZXdvcmQgb2YgYWxsCisgKiBvbmUgYml0cyAoc28gdGhhdCBwYWRkaW5nIGJpdHMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgc2VnbWVudAorICogY2FuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY29kZSkuICBCZWNhdXNlIG9mIHRoZSBjYW5vbmljYWwgb3JkZXJpbmcgb2YKKyAqIGNvZGV3b3JkcywgdGhpcyBqdXN0IG1lYW5zIHRoYXQgdGhlcmUgbXVzdCBiZSBhbiB1bnVzZWQgc2xvdCBpbiB0aGUKKyAqIGxvbmdlc3QgY29kZXdvcmQgbGVuZ3RoIGNhdGVnb3J5LiAgU2VjdGlvbiBLLjIgb2YgdGhlIEpQRUcgc3BlYyBzdWdnZXN0cworICogcmVzZXJ2aW5nIHN1Y2ggYSBzbG90IGJ5IHByZXRlbmRpbmcgdGhhdCBzeW1ib2wgMjU2IGlzIGEgdmFsaWQgc3ltYm9sCisgKiB3aXRoIGNvdW50IDEuICBJbiB0aGVvcnkgdGhhdCdzIG5vdCBvcHRpbWFsOyBnaXZpbmcgaXQgY291bnQgemVybyBidXQKKyAqIGluY2x1ZGluZyBpdCBpbiB0aGUgc3ltYm9sIHNldCBhbnl3YXkgc2hvdWxkIGdpdmUgYSBiZXR0ZXIgSHVmZm1hbiBjb2RlLgorICogQnV0IHRoZSB0aGVvcmV0aWNhbGx5IGJldHRlciBjb2RlIGFjdHVhbGx5IHNlZW1zIHRvIGNvbWUgb3V0IHdvcnNlIGluCisgKiBwcmFjdGljZSwgYmVjYXVzZSBpdCBwcm9kdWNlcyBtb3JlIGFsbC1vbmVzIGJ5dGVzICh3aGljaCBpbmN1ciBzdHVmZmVkCisgKiB6ZXJvIGJ5dGVzIGluIHRoZSBmaW5hbCBmaWxlKS4gIEluIGFueSBjYXNlIHRoZSBkaWZmZXJlbmNlIGlzIHRpbnkuCisgKgorICogVGhlIEpQRUcgc3RhbmRhcmQgcmVxdWlyZXMgSHVmZm1hbiBjb2RlcyB0byBiZSBubyBtb3JlIHRoYW4gMTYgYml0cyBsb25nLgorICogSWYgc29tZSBzeW1ib2xzIGhhdmUgYSB2ZXJ5IHNtYWxsIGJ1dCBub256ZXJvIHByb2JhYmlsaXR5LCB0aGUgSHVmZm1hbiB0cmVlCisgKiBtdXN0IGJlIGFkanVzdGVkIHRvIG1lZXQgdGhlIGNvZGUgbGVuZ3RoIHJlc3RyaWN0aW9uLiAgV2UgY3VycmVudGx5IHVzZQorICogdGhlIGFkanVzdG1lbnQgbWV0aG9kIHN1Z2dlc3RlZCBpbiBKUEVHIHNlY3Rpb24gSy4yLiAgVGhpcyBtZXRob2QgaXMgKm5vdCoKKyAqIG9wdGltYWw7IGl0IG1heSBub3QgY2hvb3NlIHRoZSBiZXN0IHBvc3NpYmxlIGxpbWl0ZWQtbGVuZ3RoIGNvZGUuICBCdXQKKyAqIHR5cGljYWxseSBvbmx5IHZlcnktbG93LWZyZXF1ZW5jeSBzeW1ib2xzIHdpbGwgYmUgZ2l2ZW4gbGVzcy10aGFuLW9wdGltYWwKKyAqIGxlbmd0aHMsIHNvIHRoZSBjb2RlIGlzIGFsbW9zdCBvcHRpbWFsLiAgRXhwZXJpbWVudGFsIGNvbXBhcmlzb25zIGFnYWluc3QKKyAqIGFuIG9wdGltYWwgbGltaXRlZC1sZW5ndGgtY29kZSBhbGdvcml0aG0gaW5kaWNhdGUgdGhhdCB0aGUgZGlmZmVyZW5jZSBpcworICogbWljcm9zY29waWMgLS0tIHVzdWFsbHkgbGVzcyB0aGFuIGEgaHVuZHJlZHRoIG9mIGEgcGVyY2VudCBvZiB0b3RhbCBzaXplLgorICogU28gdGhlIGV4dHJhIGNvbXBsZXhpdHkgb2YgYW4gb3B0aW1hbCBhbGdvcml0aG0gZG9lc24ndCBzZWVtIHdvcnRod2hpbGUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkhVRkZfVEJMICogaHRibCwgbG9uZyBmcmVxW10pCit7CisjZGVmaW5lIE1BWF9DTEVOIDMyCQkvKiBhc3N1bWVkIG1heGltdW0gaW5pdGlhbCBjb2RlIGxlbmd0aCAqLworICBVSU5UOCBiaXRzW01BWF9DTEVOKzFdOwkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZSBsZW5ndGggayAqLworICBpbnQgY29kZXNpemVbMjU3XTsJCS8qIGNvZGVzaXplW2tdID0gY29kZSBsZW5ndGggb2Ygc3ltYm9sIGsgKi8KKyAgaW50IG90aGVyc1syNTddOwkJLyogbmV4dCBzeW1ib2wgaW4gY3VycmVudCBicmFuY2ggb2YgdHJlZSAqLworICBpbnQgYzEsIGMyOworICBpbnQgcCwgaSwgajsKKyAgbG9uZyB2OworCisgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIEsuMiBvZiB0aGUgSlBFRyBzdGFuZGFyZCAqLworCisgIE1FTVpFUk8oYml0cywgU0laRU9GKGJpdHMpKTsKKyAgTUVNWkVSTyhjb2Rlc2l6ZSwgU0laRU9GKGNvZGVzaXplKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTc7IGkrKykKKyAgICBvdGhlcnNbaV0gPSAtMTsJCS8qIGluaXQgbGlua3MgdG8gZW1wdHkgKi8KKyAgCisgIGZyZXFbMjU2XSA9IDE7CQkvKiBtYWtlIHN1cmUgMjU2IGhhcyBhIG5vbnplcm8gY291bnQgKi8KKyAgLyogSW5jbHVkaW5nIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBpbiB0aGUgSHVmZm1hbiBwcm9jZWR1cmUgZ3VhcmFudGVlcworICAgKiB0aGF0IG5vIHJlYWwgc3ltYm9sIGlzIGdpdmVuIGNvZGUtdmFsdWUgb2YgYWxsIG9uZXMsIGJlY2F1c2UgMjU2CisgICAqIHdpbGwgYmUgcGxhY2VkIGxhc3QgaW4gdGhlIGxhcmdlc3QgY29kZXdvcmQgY2F0ZWdvcnkuCisgICAqLworCisgIC8qIEh1ZmZtYW4ncyBiYXNpYyBhbGdvcml0aG0gdG8gYXNzaWduIG9wdGltYWwgY29kZSBsZW5ndGhzIHRvIHN5bWJvbHMgKi8KKworICBmb3IgKDs7KSB7CisgICAgLyogRmluZCB0aGUgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMSA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzEgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2KSB7CisJdiA9IGZyZXFbaV07CisJYzEgPSBpOworICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmQgdGhlIG5leHQgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMiA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzIgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2ICYmIGkgIT0gYzEpIHsKKwl2ID0gZnJlcVtpXTsKKwljMiA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgLyogRG9uZSBpZiB3ZSd2ZSBtZXJnZWQgZXZlcnl0aGluZyBpbnRvIG9uZSBmcmVxdWVuY3kgKi8KKyAgICBpZiAoYzIgPCAwKQorICAgICAgYnJlYWs7CisgICAgCisgICAgLyogRWxzZSBtZXJnZSB0aGUgdHdvIGNvdW50cy90cmVlcyAqLworICAgIGZyZXFbYzFdICs9IGZyZXFbYzJdOworICAgIGZyZXFbYzJdID0gMDsKKworICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMSdzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzFdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMV0gPj0gMCkgeworICAgICAgYzEgPSBvdGhlcnNbYzFdOworICAgICAgY29kZXNpemVbYzFdKys7CisgICAgfQorICAgIAorICAgIG90aGVyc1tjMV0gPSBjMjsJCS8qIGNoYWluIGMyIG9udG8gYzEncyB0cmVlIGJyYW5jaCAqLworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMidzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzJdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMl0gPj0gMCkgeworICAgICAgYzIgPSBvdGhlcnNbYzJdOworICAgICAgY29kZXNpemVbYzJdKys7CisgICAgfQorICB9CisKKyAgLyogTm93IGNvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZiBlYWNoIGNvZGUgbGVuZ3RoICovCisgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKKyAgICBpZiAoY29kZXNpemVbaV0pIHsKKyAgICAgIC8qIFRoZSBKUEVHIHN0YW5kYXJkIHNlZW1zIHRvIHRoaW5rIHRoYXQgdGhpcyBjYW4ndCBoYXBwZW4sICovCisgICAgICAvKiBidXQgSSdtIHBhcmFub2lkLi4uICovCisgICAgICBpZiAoY29kZXNpemVbaV0gPiBNQVhfQ0xFTikKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0hVRkZfQ0xFTl9PVkVSRkxPVyk7CisKKyAgICAgIGJpdHNbY29kZXNpemVbaV1dKys7CisgICAgfQorICB9CisKKyAgLyogSlBFRyBkb2Vzbid0IGFsbG93IHN5bWJvbHMgd2l0aCBjb2RlIGxlbmd0aHMgb3ZlciAxNiBiaXRzLCBzbyBpZiB0aGUgcHVyZQorICAgKiBIdWZmbWFuIHByb2NlZHVyZSBhc3NpZ25lZCBhbnkgc3VjaCBsZW5ndGhzLCB3ZSBtdXN0IGFkanVzdCB0aGUgY29kaW5nLgorICAgKiBIZXJlIGlzIHdoYXQgdGhlIEpQRUcgc3BlYyBzYXlzIGFib3V0IGhvdyB0aGlzIG5leHQgYml0IHdvcmtzOgorICAgKiBTaW5jZSBzeW1ib2xzIGFyZSBwYWlyZWQgZm9yIHRoZSBsb25nZXN0IEh1ZmZtYW4gY29kZSwgdGhlIHN5bWJvbHMgYXJlCisgICAqIHJlbW92ZWQgZnJvbSB0aGlzIGxlbmd0aCBjYXRlZ29yeSB0d28gYXQgYSB0aW1lLiAgVGhlIHByZWZpeCBmb3IgdGhlIHBhaXIKKyAgICogKHdoaWNoIGlzIG9uZSBiaXQgc2hvcnRlcikgaXMgYWxsb2NhdGVkIHRvIG9uZSBvZiB0aGUgcGFpcjsgdGhlbiwKKyAgICogc2tpcHBpbmcgdGhlIEJJVFMgZW50cnkgZm9yIHRoYXQgcHJlZml4IGxlbmd0aCwgYSBjb2RlIHdvcmQgZnJvbSB0aGUgbmV4dAorICAgKiBzaG9ydGVzdCBub256ZXJvIEJJVFMgZW50cnkgaXMgY29udmVydGVkIGludG8gYSBwcmVmaXggZm9yIHR3byBjb2RlIHdvcmRzCisgICAqIG9uZSBiaXQgbG9uZ2VyLgorICAgKi8KKyAgCisgIGZvciAoaSA9IE1BWF9DTEVOOyBpID4gMTY7IGktLSkgeworICAgIHdoaWxlIChiaXRzW2ldID4gMCkgeworICAgICAgaiA9IGkgLSAyOwkJLyogZmluZCBsZW5ndGggb2YgbmV3IHByZWZpeCB0byBiZSB1c2VkICovCisgICAgICB3aGlsZSAoYml0c1tqXSA9PSAwKQorCWotLTsKKyAgICAgIAorICAgICAgYml0c1tpXSAtPSAyOwkJLyogcmVtb3ZlIHR3byBzeW1ib2xzICovCisgICAgICBiaXRzW2ktMV0rKzsJCS8qIG9uZSBnb2VzIGluIHRoaXMgbGVuZ3RoICovCisgICAgICBiaXRzW2orMV0gKz0gMjsJCS8qIHR3byBuZXcgc3ltYm9scyBpbiB0aGlzIGxlbmd0aCAqLworICAgICAgYml0c1tqXS0tOwkJLyogc3ltYm9sIG9mIHRoaXMgbGVuZ3RoIGlzIG5vdyBhIHByZWZpeCAqLworICAgIH0KKyAgfQorCisgIC8qIFJlbW92ZSB0aGUgY291bnQgZm9yIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBmcm9tIHRoZSBsYXJnZXN0IGNvZGVsZW5ndGggKi8KKyAgd2hpbGUgKGJpdHNbaV0gPT0gMCkJCS8qIGZpbmQgbGFyZ2VzdCBjb2RlbGVuZ3RoIHN0aWxsIGluIHVzZSAqLworICAgIGktLTsKKyAgYml0c1tpXS0tOworICAKKyAgLyogUmV0dXJuIGZpbmFsIHN5bWJvbCBjb3VudHMgKG9ubHkgZm9yIGxlbmd0aHMgMC4uMTYpICovCisgIE1FTUNPUFkoaHRibC0+Yml0cywgYml0cywgU0laRU9GKGh0YmwtPmJpdHMpKTsKKyAgCisgIC8qIFJldHVybiBhIGxpc3Qgb2YgdGhlIHN5bWJvbHMgc29ydGVkIGJ5IGNvZGUgbGVuZ3RoICovCisgIC8qIEl0J3Mgbm90IHJlYWwgY2xlYXIgdG8gbWUgd2h5IHdlIGRvbid0IG5lZWQgdG8gY29uc2lkZXIgdGhlIGNvZGVsZW5ndGgKKyAgICogY2hhbmdlcyBtYWRlIGFib3ZlLCBidXQgdGhlIEpQRUcgc3BlYyBzZWVtcyB0byB0aGluayB0aGlzIHdvcmtzLgorICAgKi8KKyAgcCA9IDA7CisgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0NMRU47IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspIHsKKyAgICAgIGlmIChjb2Rlc2l6ZVtqXSA9PSBpKSB7CisJaHRibC0+aHVmZnZhbFtwXSA9IChVSU5UOCkgajsKKwlwKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU2V0IHNlbnRfdGFibGUgRkFMU0Ugc28gdXBkYXRlZCB0YWJsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gSlBFRyBmaWxlLiAqLworICBodGJsLT5zZW50X3RhYmxlID0gRkFMU0U7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHBhc3MgYW5kIGNyZWF0ZSB0aGUgbmV3IEh1ZmZtYW4gdGFibGVzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfZ2F0aGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2ksIGRjdGJsLCBhY3RibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpIVUZGX1RCTCAqKmh0YmxwdHI7CisgIGJvb2xlYW4gZGlkX2RjW05VTV9IVUZGX1RCTFNdOworICBib29sZWFuIGRpZF9hY1tOVU1fSFVGRl9UQkxTXTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZF9kYywgU0laRU9GKGRpZF9kYykpOworICBNRU1aRVJPKGRpZF9hYywgU0laRU9GKGRpZF9hYykpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoISBkaWRfZGNbZGN0YmxdKSB7CisgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tkY3RibF07CisgICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKwkqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0pOworICAgICAgZGlkX2RjW2RjdGJsXSA9IFRSVUU7CisgICAgfQorICAgIGlmICghIGRpZF9hY1thY3RibF0pIHsKKyAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2FjdGJsXTsKKyAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSk7CisgICAgICBkaWRfYWNbYWN0YmxdID0gVFJVRTsKKyAgICB9CisgIH0KK30KKworCisjZW5kaWYgLyogRU5UUk9QWV9PUFRfU1VQUE9SVEVEICovCisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2RpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9odWZmX2VuY29kZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZW5jb2RlcikpOworICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKikgZW50cm9weTsKKyAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tpXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tpXSA9IGVudHJvcHktPmFjX2NvdW50X3B0cnNbaV0gPSBOVUxMOworI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL2pwZWcvamNodWZmLmggYi9qcGVnL2pjaHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTk5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjaHVmZi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBqY2h1ZmYuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzCisgKiB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgc2VxdWVudGlhbCBlbmNvZGVyIChqY2h1ZmYuYykgYW5kIHRoZQorICogcHJvZ3Jlc3NpdmUgZW5jb2RlciAoamNwaHVmZi5jKS4gIE5vIG90aGVyIG1vZHVsZXMgbmVlZCB0byBzZWUgdGhlc2UuCisgKi8KKworLyogVGhlIGxlZ2FsIHJhbmdlIG9mIGEgRENUIGNvZWZmaWNpZW50IGlzCisgKiAgLTEwMjQgLi4gKzEwMjMgIGZvciA4LWJpdCBkYXRhOworICogLTE2Mzg0IC4uICsxNjM4MyBmb3IgMTItYml0IGRhdGEuCisgKiBIZW5jZSB0aGUgbWFnbml0dWRlIHNob3VsZCBhbHdheXMgZml0IGluIDEwIG9yIDE0IGJpdHMgcmVzcGVjdGl2ZWx5LgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDEwCisjZWxzZQorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDE0CisjZW5kaWYKKworLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZWh1ZmNvWzI1Nl07CS8qIGNvZGUgZm9yIGVhY2ggc3ltYm9sICovCisgIGNoYXIgZWh1ZnNpWzI1Nl07CQkvKiBsZW5ndGggb2YgY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KKyAgLyogSWYgbm8gY29kZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIGEgc3ltYm9sIFMsIGVodWZzaVtTXSBjb250YWlucyAwICovCit9IGNfZGVyaXZlZF90Ymw7CisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX21ha2VfY19kZXJpdmVkX3RibAlqTWtDRGVyaXZlZAorI2RlZmluZSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlCWpHZW5PcHRUYmwKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKy8qIEV4cGFuZCBhIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXJpdmVkIGZvcm1hdCAqLworRVhURVJOKHZvaWQpIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCisJICAgICBjX2Rlcml2ZWRfdGJsICoqIHBkdGJsKSk7CisKKy8qIEdlbmVyYXRlIGFuIG9wdGltYWwgdGFibGUgZGVmaW5pdGlvbiBnaXZlbiB0aGUgc3BlY2lmaWVkIGNvdW50cyAqLworRVhURVJOKHZvaWQpIGpwZWdfZ2VuX29wdGltYWxfdGFibGUKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkpOwpkaWZmIC0tZ2l0IGEvanBlZy9qY2luaXQuYyBiL2pwZWcvamNpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmZmZlMwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamNpbml0LmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGpjaW5pdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBUaGlzIHJvdXRpbmUgaXMgaW4gY2hhcmdlIG9mIHNlbGVjdGluZyB0aGUgbW9kdWxlcyB0byBiZSBleGVjdXRlZCBhbmQKKyAqIG1ha2luZyBhbiBpbml0aWFsaXphdGlvbiBjYWxsIHRvIGVhY2ggb25lLgorICoKKyAqIExvZ2ljYWxseSwgdGhpcyBjb2RlIGJlbG9uZ3MgaW4gamNtYXN0ZXIuYy4gIEl0J3Mgc3BsaXQgb3V0IGJlY2F1c2UKKyAqIGxpbmtpbmcgdGhpcyByb3V0aW5lIGltcGxpZXMgbGlua2luZyB0aGUgZW50aXJlIGNvbXByZXNzaW9uIGxpYnJhcnkuCisgKiBGb3IgYSB0cmFuc2NvZGluZy1vbmx5IGFwcGxpY2F0aW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIGpjbWFzdGVyLmMKKyAqIHdpdGhvdXQgbGlua2luZyBpbiB0aGUgd2hvbGUgbGlicmFyeS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcy4KKyAqIFRoaXMgaXMgZG9uZSBvbmNlIGF0IHRoZSBzdGFydCBvZiBwcm9jZXNzaW5nIGFuIGltYWdlLiAgV2UgZGV0ZXJtaW5lCisgKiB3aGljaCBtb2R1bGVzIHdpbGwgYmUgdXNlZCBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uIGNhbGxzLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY29tcHJlc3NfbWFzdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogSW5pdGlhbGl6ZSBtYXN0ZXIgY29udHJvbCAoaW5jbHVkZXMgcGFyYW1ldGVyIGNoZWNraW5nL3Byb2Nlc3NpbmcpICovCisgIGppbml0X2NfbWFzdGVyX2NvbnRyb2woY2luZm8sIEZBTFNFIC8qIGZ1bGwgY29tcHJlc3Npb24gKi8pOworCisgIC8qIFByZXByb2Nlc3NpbmcgKi8KKyAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7CisgICAgamluaXRfY29sb3JfY29udmVydGVyKGNpbmZvKTsKKyAgICBqaW5pdF9kb3duc2FtcGxlcihjaW5mbyk7CisgICAgamluaXRfY19wcmVwX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisgIH0KKyAgLyogRm9yd2FyZCBEQ1QgKi8KKyAgamluaXRfZm9yd2FyZF9kY3QoY2luZm8pOworICAvKiBFbnRyb3B5IGVuY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgamluaXRfcGh1ZmZfZW5jb2RlcihjaW5mbyk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfSBlbHNlCisgICAgICBqaW5pdF9odWZmX2VuY29kZXIoY2luZm8pOworICB9CisKKyAgLyogTmVlZCBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyIGluIGFueSBtdWx0aS1wYXNzIG1vZGUuICovCisgIGppbml0X2NfY29lZl9jb250cm9sbGVyKGNpbmZvLAorCQkoYm9vbGVhbikgKGNpbmZvLT5udW1fc2NhbnMgPiAxIHx8IGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpKTsKKyAgamluaXRfY19tYWluX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisKKyAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7CisKKyAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIFdyaXRlIHRoZSBkYXRhc3RyZWFtIGhlYWRlciAoU09JKSBpbW1lZGlhdGVseS4KKyAgICogRnJhbWUgYW5kIHNjYW4gaGVhZGVycyBhcmUgcG9zdHBvbmVkIHRpbGwgbGF0ZXIuCisgICAqIFRoaXMgbGV0cyBhcHBsaWNhdGlvbiBpbnNlcnQgc3BlY2lhbCBtYXJrZXJzIGFmdGVyIHRoZSBTT0kuCisgICAqLworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZpbGVfaGVhZGVyKSAoY2luZm8pOworfQpkaWZmIC0tZ2l0IGEvanBlZy9qY21haW5jdC5jIGIvanBlZy9qY21haW5jdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjc5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjbWFpbmN0LmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBqY21haW5jdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGNvbXByZXNzaW9uLgorICogVGhlIG1haW4gYnVmZmVyIGxpZXMgYmV0d2VlbiB0aGUgcHJlLXByb2Nlc3NvciBhbmQgdGhlIEpQRUcKKyAqIGNvbXByZXNzb3IgcHJvcGVyOyBpdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhIGluIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIE5vdGU6IGN1cnJlbnRseSwgdGhlcmUgaXMgbm8gb3BlcmF0aW5nIG1vZGUgaW4gd2hpY2ggYSBmdWxsLWltYWdlIGJ1ZmZlcgorICogaXMgbmVlZGVkIGF0IHRoaXMgc3RlcC4gIElmIHRoZXJlIHdlcmUsIHRoYXQgbW9kZSBjb3VsZCBub3QgYmUgdXNlZCB3aXRoCisgKiAicmF3IGRhdGEiIGlucHV0LCBzaW5jZSB0aGlzIG1vZHVsZSBpcyBieXBhc3NlZCBpbiB0aGF0IGNhc2UuICBIb3dldmVyLAorICogd2UndmUgbGVmdCB0aGUgY29kZSBoZXJlIGZvciBwb3NzaWJsZSB1c2UgaW4gc3BlY2lhbCBhcHBsaWNhdGlvbnMuCisgKi8KKyN1bmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgSkRJTUVOU0lPTiBjdXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBjdXJyZW50IGlNQ1Ugcm93ICovCisgIEpESU1FTlNJT04gcm93Z3JvdXBfY3RyOwkvKiBjb3VudHMgcm93IGdyb3VwcyByZWNlaXZlZCBpbiBpTUNVIHJvdyAqLworICBib29sZWFuIHN1c3BlbmRlZDsJCS8qIHJlbWVtYmVyIGlmIHdlIHN1c3BlbmRlZCBvdXRwdXQgKi8KKyAgSl9CVUZfTU9ERSBwYXNzX21vZGU7CQkvKiBjdXJyZW50IG9wZXJhdGluZyBtb2RlICovCisKKyAgLyogSWYgdXNpbmcganVzdCBhIHN0cmlwIGJ1ZmZlciwgdGhpcyBwb2ludHMgdG8gdGhlIGVudGlyZSBzZXQgb2YgYnVmZmVycworICAgKiAod2UgYWxsb2NhdGUgb25lIGZvciBlYWNoIGNvbXBvbmVudCkuICBJbiB0aGUgZnVsbC1pbWFnZSBjYXNlLCB0aGlzCisgICAqIHBvaW50cyB0byB0aGUgY3VycmVudGx5IGFjY2Vzc2libGUgc3RyaXBzIG9mIHRoZSB2aXJ0dWFsIGFycmF5cy4KKyAgICovCisgIEpTQU1QQVJSQVkgYnVmZmVyW01BWF9DT01QT05FTlRTXTsKKworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgIC8qIElmIHVzaW5nIGZ1bGwtaW1hZ2Ugc3RvcmFnZSwgdGhpcyBhcnJheSBob2xkcyBwb2ludGVycyB0byB2aXJ0dWFsLWFycmF5CisgICAqIGNvbnRyb2wgYmxvY2tzIGZvciBlYWNoIGNvbXBvbmVudC4gIFVudXNlZCBpZiBub3QgZnVsbC1pbWFnZSBzdG9yYWdlLgorICAgKi8KKyAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107CisjZW5kaWYKK30gbXlfbWFpbl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X21haW5fY29udHJvbGxlciAqIG15X21haW5fcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLCBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgLyogRG8gbm90aGluZyBpbiByYXctZGF0YSBtb2RlLiAqLworICBpZiAoY2luZm8tPnJhd19kYXRhX2luKQorICAgIHJldHVybjsKKworICBtYWluLT5jdXJfaU1DVV9yb3cgPSAwOwkvKiBpbml0aWFsaXplIGNvdW50ZXJzICovCisgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgIG1haW4tPnN1c3BlbmRlZCA9IEZBTFNFOworICBtYWluLT5wYXNzX21vZGUgPSBwYXNzX21vZGU7CS8qIHNhdmUgbW9kZSBmb3IgdXNlIGJ5IHByb2Nlc3NfZGF0YSAqLworCisgIHN3aXRjaCAocGFzc19tb2RlKSB7CisgIGNhc2UgSkJVRl9QQVNTX1RIUlU6CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgICBpZiAobWFpbi0+d2hvbGVfaW1hZ2VbMF0gIT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW47CisgICAgYnJlYWs7CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfU09VUkNFOgorICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgaWYgKG1haW4tPndob2xlX2ltYWdlWzBdID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbjsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIFRoaXMgcm91dGluZSBoYW5kbGVzIHRoZSBzaW1wbGUgcGFzcy10aHJvdWdoIG1vZGUsCisgKiB3aGVyZSB3ZSBoYXZlIG9ubHkgYSBzdHJpcCBidWZmZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICB3aGlsZSAobWFpbi0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IERDVFNJWkUpCisgICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCisJCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKKwkJCQkJbWFpbi0+YnVmZmVyLCAmbWFpbi0+cm93Z3JvdXBfY3RyLAorCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7CisKKyAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgZnVsbCBpTUNVIHJvdyBidWZmZXJlZCwgcmV0dXJuIHRvIGFwcGxpY2F0aW9uIGZvcgorICAgICAqIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCBwcmVwcm9jZXNzb3Igd2lsbCBhbHdheXMgcGFkIHRvIGZpbGwgdGhlIGlNQ1Ugcm93CisgICAgICogYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuCisgICAgICovCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciAhPSBEQ1RTSVpFKQorICAgICAgcmV0dXJuOworCisgICAgLyogU2VuZCB0aGUgY29tcGxldGVkIHJvdyB0byB0aGUgY29tcHJlc3NvciAqLworICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkgeworICAgICAgLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgdGhlbiB3ZSBtdXN0IG5lZWQgdG8KKyAgICAgICAqIHN1c3BlbmQgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEluIHRoaXMgc2l0dWF0aW9uCisgICAgICAgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKKyAgICAgICAqIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW1hZ2UsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAorICAgICAgICogdGhpbmsgd2Ugd2VyZSBkb25lLgorICAgICAgICovCisgICAgICBpZiAoISBtYWluLT5zdXNwZW5kZWQpIHsKKwkoKmluX3Jvd19jdHIpLS07CisJbWFpbi0+c3VzcGVuZGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogV2UgZGlkIGZpbmlzaCB0aGUgcm93LiAgVW5kbyBvdXIgbGl0dGxlIHN1c3BlbnNpb24gaGFjayBpZiBhIHByZXZpb3VzCisgICAgICogY2FsbCBzdXNwZW5kZWQ7IHRoZW4gbWFyayB0aGUgbWFpbiBidWZmZXIgZW1wdHkuCisgICAgICovCisgICAgaWYgKG1haW4tPnN1c3BlbmRlZCkgeworICAgICAgKCppbl9yb3dfY3RyKSsrOworICAgICAgbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7CisgICAgfQorICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgICAgbWFpbi0+Y3VyX2lNQ1Vfcm93Kys7CisgIH0KK30KKworCisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgYWxsIG9mIHRoZSBtb2RlcyB0aGF0IHVzZSBhIGZ1bGwtc2l6ZSBidWZmZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfYnVmZmVyX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBib29sZWFuIHdyaXRpbmcgPSAobWFpbi0+cGFzc19tb2RlICE9IEpCVUZfQ1JBTktfREVTVCk7CisKKyAgd2hpbGUgKG1haW4tPmN1cl9pTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKKyAgICAvKiBSZWFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgaWYgYXQgdGhlIHN0YXJ0IG9mIGFuIGlNQ1Ugcm93LiAqLworICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPT0gMCkgeworICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgICBjaSsrLCBjb21wcHRyKyspIHsKKwltYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisJICAoKGpfY29tbW9uX3B0cikgY2luZm8sIG1haW4tPndob2xlX2ltYWdlW2NpXSwKKwkgICBtYWluLT5jdXJfaU1DVV9yb3cgKiAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLAorCSAgIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLCB3cml0aW5nKTsKKyAgICAgIH0KKyAgICAgIC8qIEluIGEgcmVhZCBwYXNzLCBwcmV0ZW5kIHdlIGp1c3QgcmVhZCBzb21lIHNvdXJjZSBkYXRhLiAqLworICAgICAgaWYgKCEgd3JpdGluZykgeworCSppbl9yb3dfY3RyICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7CisJbWFpbi0+cm93Z3JvdXBfY3RyID0gRENUU0laRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiBhIHdyaXRlIHBhc3MsIHJlYWQgaW5wdXQgZGF0YSB1bnRpbCB0aGUgY3VycmVudCBpTUNVIHJvdyBpcyBmdWxsLiAqLworICAgIC8qIE5vdGU6IHByZXByb2Nlc3NvciB3aWxsIHBhZCBpZiBuZWNlc3NhcnkgdG8gZmlsbCB0aGUgbGFzdCBpTUNVIHJvdy4gKi8KKyAgICBpZiAod3JpdGluZykgeworICAgICAgKCpjaW5mby0+cHJlcC0+cHJlX3Byb2Nlc3NfZGF0YSkgKGNpbmZvLAorCQkJCQlpbnB1dF9idWYsIGluX3Jvd19jdHIsIGluX3Jvd3NfYXZhaWwsCisJCQkJCW1haW4tPmJ1ZmZlciwgJm1haW4tPnJvd2dyb3VwX2N0ciwKKwkJCQkJKEpESU1FTlNJT04pIERDVFNJWkUpOworICAgICAgLyogUmV0dXJuIHRvIGFwcGxpY2F0aW9uIGlmIHdlIG5lZWQgbW9yZSBkYXRhIHRvIGZpbGwgdGhlIGlNQ1Ugcm93LiAqLworICAgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IERDVFNJWkUpCisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEVtaXQgZGF0YSwgdW5sZXNzIHRoaXMgaXMgYSBzaW5rLW9ubHkgcGFzcy4gKi8KKyAgICBpZiAobWFpbi0+cGFzc19tb2RlICE9IEpCVUZfU0FWRV9TT1VSQ0UpIHsKKyAgICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkgeworCS8qIElmIGNvbXByZXNzb3IgZGlkIG5vdCBjb25zdW1lIHRoZSB3aG9sZSByb3csIHRoZW4gd2UgbXVzdCBuZWVkIHRvCisJICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KKwkgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKKwkgKiBpdCBoYXBwZW5lZCB0byBiZSB0aGUgbGFzdCByb3cgb2YgdGhlIGltYWdlLCB0aGUgYXBwbGljYXRpb24gd291bGQKKwkgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCisJICovCisJaWYgKCEgbWFpbi0+c3VzcGVuZGVkKSB7CisJICAoKmluX3Jvd19jdHIpLS07CisJICBtYWluLT5zdXNwZW5kZWQgPSBUUlVFOworCX0KKwlyZXR1cm47CisgICAgICB9CisgICAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKKyAgICAgICAqIGNhbGwgc3VzcGVuZGVkOyB0aGVuIG1hcmsgdGhlIG1haW4gYnVmZmVyIGVtcHR5LgorICAgICAgICovCisgICAgICBpZiAobWFpbi0+c3VzcGVuZGVkKSB7CisJKCppbl9yb3dfY3RyKSsrOworCW1haW4tPnN1c3BlbmRlZCA9IEZBTFNFOworICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGdldCBoZXJlLCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgaU1DVSByb3cuICBNYXJrIGJ1ZmZlciBlbXB0eS4gKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICAgIG1haW4tPmN1cl9pTUNVX3JvdysrOworICB9Cit9CisKKyNlbmRpZiAvKiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9jX21haW5fY29udHJvbGxlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbjsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIG1haW4gPSAobXlfbWFpbl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfbWFpbl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5tYWluID0gKHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyICopIG1haW47CisgIG1haW4tPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tYWluOworCisgIC8qIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgYnVmZmVyIGluIHJhdy1kYXRhIG1vZGUuICovCisgIGlmIChjaW5mby0+cmF3X2RhdGFfaW4pCisgICAgcmV0dXJuOworCisgIC8qIENyZWF0ZSB0aGUgYnVmZmVyLiAgSXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSwgc28gZWFjaCBjb21wb25lbnQKKyAgICogbWF5IGJlIG9mIGEgZGlmZmVyZW50IHNpemUuCisgICAqLworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgLyogTm90ZSB3ZSBwYWQgdGhlIGJvdHRvbSB0byBhIG11bHRpcGxlIG9mIHRoZSBpTUNVIGhlaWdodCAqLworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgbWFpbi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSAqIERDVFNJWkUsCisJIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICB9CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICB9IGVsc2UgeworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgICAgbWFpbi0+d2hvbGVfaW1hZ2VbMF0gPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworI2VuZGlmCisgICAgLyogQWxsb2NhdGUgYSBzdHJpcCBidWZmZXIgZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBtYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSwKKwkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvanBlZy9qY21hcmtlci5jIGIvanBlZy9qY21hcmtlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMWU2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjbWFya2VyLmMKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisgKiBqY21hcmtlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKK3R5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KKyAgTV9TT0YwICA9IDB4YzAsCisgIE1fU09GMSAgPSAweGMxLAorICBNX1NPRjIgID0gMHhjMiwKKyAgTV9TT0YzICA9IDB4YzMsCisgIAorICBNX1NPRjUgID0gMHhjNSwKKyAgTV9TT0Y2ICA9IDB4YzYsCisgIE1fU09GNyAgPSAweGM3LAorICAKKyAgTV9KUEcgICA9IDB4YzgsCisgIE1fU09GOSAgPSAweGM5LAorICBNX1NPRjEwID0gMHhjYSwKKyAgTV9TT0YxMSA9IDB4Y2IsCisgIAorICBNX1NPRjEzID0gMHhjZCwKKyAgTV9TT0YxNCA9IDB4Y2UsCisgIE1fU09GMTUgPSAweGNmLAorICAKKyAgTV9ESFQgICA9IDB4YzQsCisgIAorICBNX0RBQyAgID0gMHhjYywKKyAgCisgIE1fUlNUMCAgPSAweGQwLAorICBNX1JTVDEgID0gMHhkMSwKKyAgTV9SU1QyICA9IDB4ZDIsCisgIE1fUlNUMyAgPSAweGQzLAorICBNX1JTVDQgID0gMHhkNCwKKyAgTV9SU1Q1ICA9IDB4ZDUsCisgIE1fUlNUNiAgPSAweGQ2LAorICBNX1JTVDcgID0gMHhkNywKKyAgCisgIE1fU09JICAgPSAweGQ4LAorICBNX0VPSSAgID0gMHhkOSwKKyAgTV9TT1MgICA9IDB4ZGEsCisgIE1fRFFUICAgPSAweGRiLAorICBNX0ROTCAgID0gMHhkYywKKyAgTV9EUkkgICA9IDB4ZGQsCisgIE1fREhQICAgPSAweGRlLAorICBNX0VYUCAgID0gMHhkZiwKKyAgCisgIE1fQVBQMCAgPSAweGUwLAorICBNX0FQUDEgID0gMHhlMSwKKyAgTV9BUFAyICA9IDB4ZTIsCisgIE1fQVBQMyAgPSAweGUzLAorICBNX0FQUDQgID0gMHhlNCwKKyAgTV9BUFA1ICA9IDB4ZTUsCisgIE1fQVBQNiAgPSAweGU2LAorICBNX0FQUDcgID0gMHhlNywKKyAgTV9BUFA4ICA9IDB4ZTgsCisgIE1fQVBQOSAgPSAweGU5LAorICBNX0FQUDEwID0gMHhlYSwKKyAgTV9BUFAxMSA9IDB4ZWIsCisgIE1fQVBQMTIgPSAweGVjLAorICBNX0FQUDEzID0gMHhlZCwKKyAgTV9BUFAxNCA9IDB4ZWUsCisgIE1fQVBQMTUgPSAweGVmLAorICAKKyAgTV9KUEcwICA9IDB4ZjAsCisgIE1fSlBHMTMgPSAweGZkLAorICBNX0NPTSAgID0gMHhmZSwKKyAgCisgIE1fVEVNICAgPSAweDAxLAorICAKKyAgTV9FUlJPUiA9IDB4MTAwCit9IEpQRUdfTUFSS0VSOworCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIHVuc2lnbmVkIGludCBsYXN0X3Jlc3RhcnRfaW50ZXJ2YWw7IC8qIGxhc3QgRFJJIHZhbHVlIGVtaXR0ZWQ7IDAgYWZ0ZXIgU09JICovCit9IG15X21hcmtlcl93cml0ZXI7CisKK3R5cGVkZWYgbXlfbWFya2VyX3dyaXRlciAqIG15X21hcmtlcl9wdHI7CisKKworLyoKKyAqIEJhc2ljIG91dHB1dCByb3V0aW5lcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiB3aGlsZSB3cml0aW5nIGEgbWFya2VyLgorICogVGhlcmVmb3JlLCBhbiBhcHBsaWNhdGlvbiB1c2luZyBzdXNwZW5zaW9uIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMKKyAqIGVub3VnaCBidWZmZXIgc3BhY2UgZm9yIHRoZSBpbml0aWFsIG1hcmtlcnMgKHR5cC4gNjAwLTcwMCBieXRlcykgYmVmb3JlCisgKiBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MsIGFuZCBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHRyYWlsaW5nIEVPSQorICogKGEgZmV3IGJ5dGVzKSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcy4gIE11bHRpcGFzcyBjb21wcmVzc2lvbgorICogbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIHdpdGggc3VzcGVuc2lvbiwgc28gdGhvc2UgdHdvIGFyZSB0aGUgb25seQorICogcG9pbnRzIHdoZXJlIG1hcmtlcnMgd2lsbCBiZSB3cml0dGVuLgorICovCisKK0xPQ0FMKHZvaWQpCitlbWl0X2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQorLyogRW1pdCBhIGJ5dGUgKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGNpbmZvLT5kZXN0OworCisgICooZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSkrKyA9IChKT0NURVQpIHZhbDsKKyAgaWYgKC0tZGVzdC0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgeworICAgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGNpbmZvKSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIG1hcmspCisvKiBFbWl0IGEgbWFya2VyIGNvZGUgKi8KK3sKKyAgZW1pdF9ieXRlKGNpbmZvLCAweEZGKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSBtYXJrKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF8yYnl0ZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsdWUpCisvKiBFbWl0IGEgMi1ieXRlIGludGVnZXI7IHRoZXNlIGFyZSBhbHdheXMgTVNCIGZpcnN0IGluIEpQRUcgZmlsZXMgKi8KK3sKKyAgZW1pdF9ieXRlKGNpbmZvLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCB2YWx1ZSAmIDB4RkYpOworfQorCisKKy8qCisgKiBSb3V0aW5lcyB0byB3cml0ZSBzcGVjaWZpYyBtYXJrZXIgdHlwZXMuCisgKi8KKworTE9DQUwoaW50KQorZW1pdF9kcXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgpCisvKiBFbWl0IGEgRFFUIG1hcmtlciAqLworLyogUmV0dXJucyB0aGUgcHJlY2lzaW9uIHVzZWQgKDAgPSA4Yml0cywgMSA9IDE2Yml0cykgZm9yIGJhc2VsaW5lIGNoZWNraW5nICovCit7CisgIEpRVUFOVF9UQkwgKiBxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2luZGV4XTsKKyAgaW50IHByZWM7CisgIGludCBpOworCisgIGlmIChxdGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIGluZGV4KTsKKworICBwcmVjID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICBpZiAocXRibC0+cXVhbnR2YWxbaV0gPiAyNTUpCisgICAgICBwcmVjID0gMTsKKyAgfQorCisgIGlmICghIHF0YmwtPnNlbnRfdGFibGUpIHsKKyAgICBlbWl0X21hcmtlcihjaW5mbywgTV9EUVQpOworCisgICAgZW1pdF8yYnl0ZXMoY2luZm8sIHByZWMgPyBEQ1RTSVpFMioyICsgMSArIDIgOiBEQ1RTSVpFMiArIDEgKyAyKTsKKworICAgIGVtaXRfYnl0ZShjaW5mbywgaW5kZXggKyAocHJlYzw8NCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICAgIC8qIFRoZSB0YWJsZSBlbnRyaWVzIG11c3QgYmUgZW1pdHRlZCBpbiB6aWd6YWcgb3JkZXIuICovCisgICAgICB1bnNpZ25lZCBpbnQgcXZhbCA9IHF0YmwtPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV07CisgICAgICBpZiAocHJlYykKKwllbWl0X2J5dGUoY2luZm8sIChpbnQpIChxdmFsID4+IDgpKTsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgJiAweEZGKSk7CisgICAgfQorCisgICAgcXRibC0+c2VudF90YWJsZSA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcHJlYzsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9kaHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNfYWMpCisvKiBFbWl0IGEgREhUIG1hcmtlciAqLworeworICBKSFVGRl9UQkwgKiBodGJsOworICBpbnQgbGVuZ3RoLCBpOworICAKKyAgaWYgKGlzX2FjKSB7CisgICAgaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgICBpbmRleCArPSAweDEwOwkJLyogb3V0cHV0IGluZGV4IGhhcyBBQyBiaXQgc2V0ICovCisgIH0gZWxzZSB7CisgICAgaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgfQorCisgIGlmIChodGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgaW5kZXgpOworICAKKyAgaWYgKCEgaHRibC0+c2VudF90YWJsZSkgeworICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RIVCk7CisgICAgCisgICAgbGVuZ3RoID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCisgICAgICBsZW5ndGggKz0gaHRibC0+Yml0c1tpXTsKKyAgICAKKyAgICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoICsgMiArIDEgKyAxNik7CisgICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCk7CisgICAgCisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKQorICAgICAgZW1pdF9ieXRlKGNpbmZvLCBodGJsLT5iaXRzW2ldKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmh1ZmZ2YWxbaV0pOworICAgIAorICAgIGh0YmwtPnNlbnRfdGFibGUgPSBUUlVFOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfZGFjIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBEQUMgbWFya2VyICovCisvKiBTaW5jZSB0aGUgdXNlZnVsIGluZm8gaXMgc28gc21hbGwsIHdlIHdhbnQgdG8gZW1pdCBhbGwgdGhlIHRhYmxlcyBpbiAqLworLyogb25lIERBQyBtYXJrZXIuICBUaGVyZWZvcmUgdGhpcyByb3V0aW5lIGRvZXMgaXRzIG93biBzY2FuIG9mIHRoZSB0YWJsZS4gKi8KK3sKKyNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKyAgY2hhciBkY19pbl91c2VbTlVNX0FSSVRIX1RCTFNdOworICBjaGFyIGFjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107CisgIGludCBsZW5ndGgsIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKKyAgICBkY19pbl91c2VbaV0gPSBhY19pbl91c2VbaV0gPSAwOworICAKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07CisgICAgZGNfaW5fdXNlW2NvbXBwdHItPmRjX3RibF9ub10gPSAxOworICAgIGFjX2luX3VzZVtjb21wcHRyLT5hY190Ymxfbm9dID0gMTsKKyAgfQorICAKKyAgbGVuZ3RoID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspCisgICAgbGVuZ3RoICs9IGRjX2luX3VzZVtpXSArIGFjX2luX3VzZVtpXTsKKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RBQyk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoKjIgKyAyKTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgaWYgKGRjX2luX3VzZVtpXSkgeworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpKTsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2RjX0xbaV0gKyAoY2luZm8tPmFyaXRoX2RjX1VbaV08PDQpKTsKKyAgICB9CisgICAgaWYgKGFjX2luX3VzZVtpXSkgeworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpICsgMHgxMCk7CisgICAgICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5hcml0aF9hY19LW2ldKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9kcmkgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIERSSSBtYXJrZXIgKi8KK3sKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRFJJKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCA0KTsJLyogZml4ZWQgbGVuZ3RoICovCisKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9zb2YgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKUEVHX01BUktFUiBjb2RlKQorLyogRW1pdCBhIFNPRiBtYXJrZXIgKi8KK3sKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgZW1pdF9tYXJrZXIoY2luZm8sIGNvZGUpOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHMgKyAyICsgNSArIDEpOyAvKiBsZW5ndGggKi8KKworICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gU09GIGZpZWxkIGNhbiBoYW5kbGUgKi8KKyAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gNjU1MzVMIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gNjU1MzVMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIDY1NTM1KTsKKworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCk7CisKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOworICAgIGVtaXRfYnl0ZShjaW5mbywgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPDwgNCkgKyBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubyk7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9zb3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIFNPUyBtYXJrZXIgKi8KK3sKKyAgaW50IGksIHRkLCB0YTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPUyk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMiAqIGNpbmZvLT5jb21wc19pbl9zY2FuICsgMiArIDEgKyAzKTsgLyogbGVuZ3RoICovCisgIAorICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5jb21wc19pbl9zY2FuKTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOworICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkKTsKKyAgICB0ZCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICB0YSA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyAgICAgIC8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW47CisgICAgICAgKiBmdXJ0aGVybW9yZSwgSHVmZm1hbiBjb2Rpbmcgb2YgREMgcmVmaW5lbWVudCB1c2VzIG5vIHRhYmxlIGF0IGFsbC4KKyAgICAgICAqIFdlIGVtaXQgMCBmb3IgdW51c2VkIGZpZWxkKHMpOyB0aGlzIGlzIHJlY29tbWVuZGVkIGJ5IHRoZSBQJk0gdGV4dAorICAgICAgICogYnV0IGRvZXMgbm90IHNlZW0gdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZC4KKyAgICAgICAqLworICAgICAgaWYgKGNpbmZvLT5TcyA9PSAwKSB7CisJdGEgPSAwOwkJCS8qIERDIHNjYW4gKi8KKwlpZiAoY2luZm8tPkFoICE9IDAgJiYgIWNpbmZvLT5hcml0aF9jb2RlKQorCSAgdGQgPSAwOwkJLyogbm8gREMgdGFibGUgZWl0aGVyICovCisgICAgICB9IGVsc2UgeworCXRkID0gMDsJCQkvKiBBQyBzY2FuICovCisgICAgICB9CisgICAgfQorICAgIGVtaXRfYnl0ZShjaW5mbywgKHRkIDw8IDQpICsgdGEpOworICB9CisKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+U3MpOworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5TZSk7CisgIGVtaXRfYnl0ZShjaW5mbywgKGNpbmZvLT5BaCA8PCA0KSArIGNpbmZvLT5BbCk7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfamZpZl9hcHAwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBKRklGLWNvbXBsaWFudCBBUFAwIG1hcmtlciAqLworeworICAvKgorICAgKiBMZW5ndGggb2YgQVBQMCBibG9jawkoMiBieXRlcykKKyAgICogQmxvY2sgSUQJCQkoNCBieXRlcyAtIEFTQ0lJICJKRklGIikKKyAgICogWmVybyBieXRlCQkJKDEgYnl0ZSB0byB0ZXJtaW5hdGUgdGhlIElEIHN0cmluZykKKyAgICogVmVyc2lvbiBNYWpvciwgTWlub3IJKDIgYnl0ZXMgLSBtYWpvciBmaXJzdCkKKyAgICogVW5pdHMJCQkoMSBieXRlIC0gMHgwMCA9IG5vbmUsIDB4MDEgPSBpbmNoLCAweDAyID0gY20pCisgICAqIFhkcHUJCQkoMiBieXRlcyAtIGRvdHMgcGVyIHVuaXQgaG9yaXpvbnRhbCkKKyAgICogWWRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCB2ZXJ0aWNhbCkKKyAgICogVGh1bWJuYWlsIFggc2l6ZQkJKDEgYnl0ZSkKKyAgICogVGh1bWJuYWlsIFkgc2l6ZQkJKDEgYnl0ZSkKKyAgICovCisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAwKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNCArIDEgKyAyICsgMSArIDIgKyAyICsgMSArIDEpOyAvKiBsZW5ndGggKi8KKworICBlbWl0X2J5dGUoY2luZm8sIDB4NEEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiSkZJRiIgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ5KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAwKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uKTsgLyogVmVyc2lvbiBmaWVsZHMgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+ZGVuc2l0eV91bml0KTsgLyogUGl4ZWwgc2l6ZSBpbmZvcm1hdGlvbiAqLworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPlhfZGVuc2l0eSk7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WV9kZW5zaXR5KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJCS8qIE5vIHRodW1ibmFpbCBpbWFnZSAqLworICBlbWl0X2J5dGUoY2luZm8sIDApOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2Fkb2JlX2FwcDE0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYW4gQWRvYmUgQVBQMTQgbWFya2VyICovCit7CisgIC8qCisgICAqIExlbmd0aCBvZiBBUFAxNCBibG9jawkoMiBieXRlcykKKyAgICogQmxvY2sgSUQJCQkoNSBieXRlcyAtIEFTQ0lJICJBZG9iZSIpCisgICAqIFZlcnNpb24gTnVtYmVyCQkoMiBieXRlcyAtIGN1cnJlbnRseSAxMDApCisgICAqIEZsYWdzMAkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCisgICAqIEZsYWdzMQkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCisgICAqIENvbG9yIHRyYW5zZm9ybQkJKDEgYnl0ZSkKKyAgICoKKyAgICogQWx0aG91Z2ggQWRvYmUgVE4gNTExNiBtZW50aW9ucyBWZXJzaW9uID0gMTAxLCBhbGwgdGhlIEFkb2JlIGZpbGVzCisgICAqIG5vdyBpbiBjaXJjdWxhdGlvbiBzZWVtIHRvIHVzZSBWZXJzaW9uID0gMTAwLCBzbyB0aGF0J3Mgd2hhdCB3ZSB3cml0ZS4KKyAgICoKKyAgICogV2Ugd3JpdGUgdGhlIGNvbG9yIHRyYW5zZm9ybSBieXRlIGFzIDEgaWYgdGhlIEpQRUcgY29sb3Igc3BhY2UgaXMKKyAgICogWUNiQ3IsIDIgaWYgaXQncyBZQ0NLLCAwIG90aGVyd2lzZS4gIEFkb2JlJ3MgZGVmaW5pdGlvbiBoYXMgdG8gZG8gd2l0aAorICAgKiB3aGV0aGVyIHRoZSBlbmNvZGVyIHBlcmZvcm1lZCBhIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcyBwcmV0dHkgdXNlbGVzcy4KKyAgICovCisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAxNCk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMiArIDUgKyAyICsgMiArIDIgKyAxKTsgLyogbGVuZ3RoICovCisKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQxKTsJLyogSWRlbnRpZmllcjogQVNDSUkgIkFkb2JlIiAqLworICBlbWl0X2J5dGUoY2luZm8sIDB4NjQpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NkYpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NjIpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NjUpOworICBlbWl0XzJieXRlcyhjaW5mbywgMTAwKTsJLyogVmVyc2lvbiAqLworICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMCAqLworICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMSAqLworICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX1lDYkNyOgorICAgIGVtaXRfYnl0ZShjaW5mbywgMSk7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDEgKi8KKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBlbWl0X2J5dGUoY2luZm8sIDIpOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAyICovCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMCAqLworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIGFsbG93IHdyaXRpbmcgYW4gYXJiaXRyYXJ5IG1hcmtlciB3aXRoIHBhcmFtZXRlcnMuCisgKiBUaGUgb25seSBpbnRlbmRlZCB1c2UgaXMgdG8gZW1pdCBDT00gb3IgQVBQbiBtYXJrZXJzIGFmdGVyIGNhbGxpbmcKKyAqIHdyaXRlX2ZpbGVfaGVhZGVyIGFuZCBiZWZvcmUgY2FsbGluZyB3cml0ZV9mcmFtZV9oZWFkZXIuCisgKiBPdGhlciB1c2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGRlc2lyYWJsZSByZXN1bHRzLgorICogQ291bnRpbmcgdGhlIHBhcmFtZXRlciBieXRlcyBwcm9wZXJseSBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9tYXJrZXJfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCisvKiBFbWl0IGFuIGFyYml0cmFyeSBtYXJrZXIgaGVhZGVyICovCit7CisgIGlmIChkYXRhbGVuID4gKHVuc2lnbmVkIGludCkgNjU1MzMpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCAoSlBFR19NQVJLRVIpIG1hcmtlcik7CisKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIChkYXRhbGVuICsgMikpOwkvKiB0b3RhbCBsZW5ndGggKi8KK30KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9tYXJrZXJfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCisvKiBFbWl0IG9uZSBieXRlIG9mIG1hcmtlciBwYXJhbWV0ZXJzIGZvbGxvd2luZyB3cml0ZV9tYXJrZXJfaGVhZGVyICovCit7CisgIGVtaXRfYnl0ZShjaW5mbywgdmFsKTsKK30KKworCisvKgorICogV3JpdGUgZGF0YXN0cmVhbSBoZWFkZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIGFuIFNPSSBhbmQgb3B0aW9uYWwgQVBQbiBtYXJrZXJzLgorICogV2UgcmVjb21tZW5kIHVzZSBvZiB0aGUgSkZJRiBtYXJrZXIsIGJ1dCBub3QgdGhlIEFkb2JlIG1hcmtlciwKKyAqIHdoZW4gdXNpbmcgWUNiQ3Igb3IgZ3JheXNjYWxlIGRhdGEuICBUaGUgSkZJRiBtYXJrZXIgc2hvdWxkIE5PVAorICogYmUgdXNlZCBmb3IgYW55IG90aGVyIEpQRUcgY29sb3JzcGFjZS4gIFRoZSBBZG9iZSBtYXJrZXIgaXMgaGVscGZ1bAorICogdG8gZGlzdGluZ3Vpc2ggUkdCLCBDTVlLLCBhbmQgWUNDSyBjb2xvcnNwYWNlcy4KKyAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgYWRkaXRpb25hbCBoZWFkZXIgbWFya2VycyBhZnRlcgorICoganBlZ19zdGFydF9jb21wcmVzcyByZXR1cm5zLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CS8qIGZpcnN0IHRoZSBTT0kgKi8KKworICAvKiBTT0kgaXMgZGVmaW5lZCB0byByZXNldCByZXN0YXJ0IGludGVydmFsIHRvIDAgKi8KKyAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOworCisgIGlmIChjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIpCS8qIG5leHQgYW4gb3B0aW9uYWwgSkZJRiBBUFAwICovCisgICAgZW1pdF9qZmlmX2FwcDAoY2luZm8pOworICBpZiAoY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlcikgLyogbmV4dCBhbiBvcHRpb25hbCBBZG9iZSBBUFAxNCAqLworICAgIGVtaXRfYWRvYmVfYXBwMTQoY2luZm8pOworfQorCisKKy8qCisgKiBXcml0ZSBmcmFtZSBoZWFkZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIERRVCBhbmQgU09GbiBtYXJrZXJzLgorICogTm90ZSB0aGF0IHdlIGRvIG5vdCBlbWl0IHRoZSBTT0YgdW50aWwgd2UgaGF2ZSBlbWl0dGVkIHRoZSBEUVQocykuCisgKiBUaGlzIGF2b2lkcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdpdGggaW5jb3JyZWN0IGltcGxlbWVudGF0aW9ucyB0aGF0CisgKiB0cnkgdG8gZXJyb3ItY2hlY2sgdGhlIHF1YW50IHRhYmxlIG51bWJlcnMgYXMgc29vbiBhcyB0aGV5IHNlZSB0aGUgU09GLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZnJhbWVfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGNpLCBwcmVjOworICBib29sZWFuIGlzX2Jhc2VsaW5lOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgLyogRW1pdCBEUVQgZm9yIGVhY2ggcXVhbnRpemF0aW9uIHRhYmxlLgorICAgKiBOb3RlIHRoYXQgZW1pdF9kcXQoKSBzdXBwcmVzc2VzIGFueSBkdXBsaWNhdGUgdGFibGVzLgorICAgKi8KKyAgcHJlYyA9IDA7CisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcHJlYyArPSBlbWl0X2RxdChjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKKyAgfQorICAvKiBub3cgcHJlYyBpcyBub256ZXJvIGlmZiB0aGVyZSBhcmUgYW55IDE2LWJpdCBxdWFudCB0YWJsZXMuICovCisKKyAgLyogQ2hlY2sgZm9yIGEgbm9uLWJhc2VsaW5lIHNwZWNpZmljYXRpb24uCisgICAqIE5vdGUgd2UgYXNzdW1lIHRoYXQgSHVmZm1hbiB0YWJsZSBudW1iZXJzIHdvbid0IGJlIGNoYW5nZWQgbGF0ZXIuCisgICAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUgfHwgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwKKyAgICAgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSA4KSB7CisgICAgaXNfYmFzZWxpbmUgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBpc19iYXNlbGluZSA9IFRSVUU7CisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBpZiAoY29tcHB0ci0+ZGNfdGJsX25vID4gMSB8fCBjb21wcHRyLT5hY190Ymxfbm8gPiAxKQorCWlzX2Jhc2VsaW5lID0gRkFMU0U7CisgICAgfQorICAgIGlmIChwcmVjICYmIGlzX2Jhc2VsaW5lKSB7CisgICAgICBpc19iYXNlbGluZSA9IEZBTFNFOworICAgICAgLyogSWYgaXQncyBiYXNlbGluZSBleGNlcHQgZm9yIHF1YW50aXplciBzaXplLCB3YXJuIHRoZSB1c2VyICovCisgICAgICBUUkFDRU1TKGNpbmZvLCAwLCBKVFJDXzE2QklUX1RBQkxFUyk7CisgICAgfQorICB9CisKKyAgLyogRW1pdCB0aGUgcHJvcGVyIFNPRiBtYXJrZXIgKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GOSk7CS8qIFNPRiBjb2RlIGZvciBhcml0aG1ldGljIGNvZGluZyAqLworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKyAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjIpOwkvKiBTT0YgY29kZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiAqLworICAgIGVsc2UgaWYgKGlzX2Jhc2VsaW5lKQorICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMCk7CS8qIFNPRiBjb2RlIGZvciBiYXNlbGluZSBpbXBsZW1lbnRhdGlvbiAqLworICAgIGVsc2UKKyAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjEpOwkvKiBTT0YgY29kZSBmb3Igbm9uLWJhc2VsaW5lIEh1ZmZtYW4gZmlsZSAqLworICB9Cit9CisKKworLyoKKyAqIFdyaXRlIHNjYW4gaGVhZGVyLgorICogVGhpcyBjb25zaXN0cyBvZiBESFQgb3IgREFDIG1hcmtlcnMsIG9wdGlvbmFsIERSSSwgYW5kIFNPUy4KKyAqIENvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gZm9sbG93aW5nIHRoZSBTT1MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9zY2FuX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisgIGludCBpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIC8qIEVtaXQgYXJpdGggY29uZGl0aW9uaW5nIGluZm8uICBXZSBtYXkgaGF2ZSBzb21lIGR1cGxpY2F0aW9uCisgICAgICogaWYgdGhlIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zLCBidXQgaXQncyBzbyBzbWFsbCBpdCdzIGhhcmRseQorICAgICAqIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgorICAgICAqLworICAgIGVtaXRfZGFjKGNpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBFbWl0IEh1ZmZtYW4gdGFibGVzLgorICAgICAqIE5vdGUgdGhhdCBlbWl0X2RodCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworCS8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW4gKi8KKwlpZiAoY2luZm8tPlNzID09IDApIHsKKwkgIGlmIChjaW5mby0+QWggPT0gMCkJLyogREMgbmVlZHMgbm8gdGFibGUgZm9yIHJlZmluZW1lbnQgc2NhbiAqLworCSAgICBlbWl0X2RodChjaW5mbywgY29tcHB0ci0+ZGNfdGJsX25vLCBGQUxTRSk7CisJfSBlbHNlIHsKKwkgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOworCX0KKyAgICAgIH0gZWxzZSB7CisJLyogU2VxdWVudGlhbCBtb2RlOiBuZWVkIGJvdGggREMgYW5kIEFDIHRhYmxlcyAqLworCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKKwllbWl0X2RodChjaW5mbywgY29tcHB0ci0+YWNfdGJsX25vLCBUUlVFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBFbWl0IERSSSBpZiByZXF1aXJlZCAtLS0gbm90ZSB0aGF0IERSSSB2YWx1ZSBjb3VsZCBjaGFuZ2UgZm9yIGVhY2ggc2Nhbi4KKyAgICogV2UgYXZvaWQgd2FzdGluZyBzcGFjZSB3aXRoIHVubmVjZXNzYXJ5IERSSXMsIGhvd2V2ZXIuCisgICAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgIT0gbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBlbWl0X2RyaShjaW5mbyk7CisgICAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgfQorCisgIGVtaXRfc29zKGNpbmZvKTsKK30KKworCisvKgorICogV3JpdGUgZGF0YXN0cmVhbSB0cmFpbGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV90cmFpbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKK30KKworCisvKgorICogV3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUtc3BlY2lmaWNhdGlvbiBkYXRhc3RyZWFtLgorICogVGhpcyBjb25zaXN0cyBvZiBTT0ksIERRVCBhbmQgREhUIHRhYmxlcywgYW5kIEVPSS4KKyAqIEFueSB0YWJsZSB0aGF0IGlzIGRlZmluZWQgYW5kIG5vdCBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgd2lsbCBiZQorICogZW1pdHRlZC4gIE5vdGUgdGhhdCBhbGwgdGFibGVzIHdpbGwgYmUgbWFya2VkIHNlbnRfdGFibGUgPSBUUlVFIGF0IGV4aXQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV90YWJsZXNfb25seSAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW2ldICE9IE5VTEwpCisgICAgICAodm9pZCkgZW1pdF9kcXQoY2luZm8sIGkpOworICB9CisKKyAgaWYgKCEgY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgICBpZiAoY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKKwllbWl0X2RodChjaW5mbywgaSwgRkFMU0UpOworICAgICAgaWYgKGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldICE9IE5VTEwpCisJZW1pdF9kaHQoY2luZm8sIGksIFRSVUUpOworICAgIH0KKyAgfQorCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0VPSSk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgbW9kdWxlLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWFya2VyX3dyaXRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyOworCisgIC8qIENyZWF0ZSB0aGUgc3Vib2JqZWN0ICovCisgIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X21hcmtlcl93cml0ZXIpKTsKKyAgY2luZm8tPm1hcmtlciA9IChzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICopIG1hcmtlcjsKKyAgLyogSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMgKi8KKyAgbWFya2VyLT5wdWIud3JpdGVfZmlsZV9oZWFkZXIgPSB3cml0ZV9maWxlX2hlYWRlcjsKKyAgbWFya2VyLT5wdWIud3JpdGVfZnJhbWVfaGVhZGVyID0gd3JpdGVfZnJhbWVfaGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9zY2FuX2hlYWRlciA9IHdyaXRlX3NjYW5faGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX3RyYWlsZXIgPSB3cml0ZV9maWxlX3RyYWlsZXI7CisgIG1hcmtlci0+cHViLndyaXRlX3RhYmxlc19vbmx5ID0gd3JpdGVfdGFibGVzX29ubHk7CisgIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9oZWFkZXIgPSB3cml0ZV9tYXJrZXJfaGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9tYXJrZXJfYnl0ZSA9IHdyaXRlX21hcmtlcl9ieXRlOworICAvKiBJbml0aWFsaXplIHByaXZhdGUgc3RhdGUgKi8KKyAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOworfQpkaWZmIC0tZ2l0IGEvanBlZy9qY21hc3Rlci5jIGIvanBlZy9qY21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjQwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjbWFzdGVyLmMKQEAgLTAsMCArMSw1OTAgQEAKKy8qCisgKiBqY21hc3Rlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggcGFyYW1ldGVyIHZhbGlkYXRpb24sIGluaXRpYWwgc2V0dXAsCisgKiBhbmQgaW50ZXItcGFzcyBjb250cm9sIChkZXRlcm1pbmluZyB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbmQgdGhlIHdvcmsgCisgKiB0byBiZSBkb25lIGluIGVhY2ggcGFzcykuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBlbnVtIHsKKwltYWluX3Bhc3MsCQkvKiBpbnB1dCBkYXRhLCBhbHNvIGRvIGZpcnN0IG91dHB1dCBzdGVwICovCisJaHVmZl9vcHRfcGFzcywJCS8qIEh1ZmZtYW4gY29kZSBvcHRpbWl6YXRpb24gcGFzcyAqLworCW91dHB1dF9wYXNzCQkvKiBkYXRhIG91dHB1dCBwYXNzICovCit9IGNfcGFzc190eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIGNfcGFzc190eXBlIHBhc3NfdHlwZTsJLyogdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgcGFzcyAqLworCisgIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLworICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgIyBvZiBwYXNzZXMgbmVlZGVkICovCisKKyAgaW50IHNjYW5fbnVtYmVyOwkJLyogY3VycmVudCBpbmRleCBpbiBzY2FuX2luZm9bXSAqLworfSBteV9jb21wX21hc3RlcjsKKwordHlwZWRlZiBteV9jb21wX21hc3RlciAqIG15X21hc3Rlcl9wdHI7CisKKworLyoKKyAqIFN1cHBvcnQgcm91dGluZXMgdGhhdCBkbyB2YXJpb3VzIGVzc2VudGlhbCBjYWxjdWxhdGlvbnMuCisgKi8KKworTE9DQUwodm9pZCkKK2luaXRpYWxfc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgbWFzdGVyIHNlbGVjdGlvbiBwaGFzZSAqLworeworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGxvbmcgc2FtcGxlc3BlcnJvdzsKKyAgSkRJTUVOU0lPTiBqZF9zYW1wbGVzcGVycm93OworCisgIC8qIFNhbml0eSBjaGVjayBvbiBpbWFnZSBkaW1lbnNpb25zICovCisgIGlmIChjaW5mby0+aW1hZ2VfaGVpZ2h0IDw9IDAgfHwgY2luZm8tPmltYWdlX3dpZHRoIDw9IDAKKyAgICAgIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA8PSAwIHx8IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzIDw9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9FTVBUWV9JTUFHRSk7CisKKyAgLyogTWFrZSBzdXJlIGltYWdlIGlzbid0IGJpZ2dlciB0aGFuIEkgY2FuIGhhbmRsZSAqLworICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSBKUEVHX01BWF9ESU1FTlNJT04pOworCisgIC8qIFdpZHRoIG9mIGFuIGlucHV0IHNjYW5saW5lIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBKRElNRU5TSU9OLiAqLworICBzYW1wbGVzcGVycm93ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKKyAgamRfc2FtcGxlc3BlcnJvdyA9IChKRElNRU5TSU9OKSBzYW1wbGVzcGVycm93OworICBpZiAoKGxvbmcpIGpkX3NhbXBsZXNwZXJyb3cgIT0gc2FtcGxlc3BlcnJvdykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKworICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLworICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOworCisgIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCisgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgIE1BWF9DT01QT05FTlRTKTsKKworICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCisgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7CisgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7CisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKKwljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOworICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCisJCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7CisgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKwkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgfQorCisgIC8qIENvbXB1dGUgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogRmlsbCBpbiB0aGUgY29ycmVjdCBjb21wb25lbnRfaW5kZXggdmFsdWU7IGRvbid0IHJlbHkgb24gYXBwbGljYXRpb24gKi8KKyAgICBjb21wcHRyLT5jb21wb25lbnRfaW5kZXggPSBjaTsKKyAgICAvKiBGb3IgY29tcHJlc3Npb24sIHdlIG5ldmVyIGRvIERDVCBzY2FsaW5nLiAqLworICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisgICAgLyogU2l6ZSBpbiBEQ1QgYmxvY2tzICovCisgICAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkICh0aGlzIGZsYWcgaXNuJ3QgYWN0dWFsbHkgdXNlZCBmb3IgY29tcHJlc3Npb24pICovCisgICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7CisgIH0KKworICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cyAobnVtYmVyIG9mIHRpbWVzIHRoYXQKKyAgICogbWFpbiBjb250cm9sbGVyIHdpbGwgY2FsbCBjb2VmZmljaWVudCBjb250cm9sbGVyKS4KKyAgICovCisgIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgPSAoSkRJTUVOU0lPTikKKyAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKK30KKworCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKK0xPQ0FMKHZvaWQpCit2YWxpZGF0ZV9zY3JpcHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogVmVyaWZ5IHRoYXQgdGhlIHNjYW4gc2NyaXB0IGluIGNpbmZvLT5zY2FuX2luZm9bXSBpcyB2YWxpZDsgYWxzbworICogZGV0ZXJtaW5lIHdoZXRoZXIgaXQgdXNlcyBwcm9ncmVzc2l2ZSBKUEVHLCBhbmQgc2V0IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlLgorICovCit7CisgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKyAgaW50IHNjYW5ubywgbmNvbXBzLCBjaSwgY29lZmksIHRoaXNpOworICBpbnQgU3MsIFNlLCBBaCwgQWw7CisgIGJvb2xlYW4gY29tcG9uZW50X3NlbnRbTUFYX0NPTVBPTkVOVFNdOworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgIGludCAqIGxhc3RfYml0cG9zX3B0cjsKKyAgaW50IGxhc3RfYml0cG9zW01BWF9DT01QT05FTlRTXVtEQ1RTSVpFMl07CisgIC8qIC0xIHVudGlsIHRoYXQgY29lZmZpY2llbnQgaGFzIGJlZW4gc2VlbjsgdGhlbiBsYXN0IEFsIGZvciBpdCAqLworI2VuZGlmCisKKyAgaWYgKGNpbmZvLT5udW1fc2NhbnMgPD0gMCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIDApOworCisgIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBzY2FucyBtdXN0IGhhdmUgU3M9MCwgU2U9RENUU0laRTItMTsKKyAgICogZm9yIHByb2dyZXNzaXZlIEpQRUcsIG5vIHNjYW4gY2FuIGhhdmUgdGhpcy4KKyAgICovCisgIHNjYW5wdHIgPSBjaW5mby0+c2Nhbl9pbmZvOworICBpZiAoc2NhbnB0ci0+U3MgIT0gMCB8fCBzY2FucHRyLT5TZSAhPSBEQ1RTSVpFMi0xKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IFRSVUU7CisgICAgbGFzdF9iaXRwb3NfcHRyID0gJiBsYXN0X2JpdHBvc1swXVswXTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAorICAgICAgZm9yIChjb2VmaSA9IDA7IGNvZWZpIDwgRENUU0laRTI7IGNvZWZpKyspCisJKmxhc3RfYml0cG9zX3B0cisrID0gLTE7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gRkFMU0U7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKKyAgICAgIGNvbXBvbmVudF9zZW50W2NpXSA9IEZBTFNFOworICB9CisKKyAgZm9yIChzY2Fubm8gPSAxOyBzY2Fubm8gPD0gY2luZm8tPm51bV9zY2Fuczsgc2NhbnB0cisrLCBzY2Fubm8rKykgeworICAgIC8qIFZhbGlkYXRlIGNvbXBvbmVudCBpbmRleGVzICovCisgICAgbmNvbXBzID0gc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsKKyAgICBpZiAobmNvbXBzIDw9IDAgfHwgbmNvbXBzID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIG5jb21wcywgTUFYX0NPTVBTX0lOX1NDQU4pOworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgeworICAgICAgdGhpc2kgPSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldOworICAgICAgaWYgKHRoaXNpIDwgMCB8fCB0aGlzaSA+PSBjaW5mby0+bnVtX2NvbXBvbmVudHMpCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworICAgICAgLyogQ29tcG9uZW50cyBtdXN0IGFwcGVhciBpbiBTT0Ygb3JkZXIgd2l0aGluIGVhY2ggc2NhbiAqLworICAgICAgaWYgKGNpID4gMCAmJiB0aGlzaSA8PSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ktMV0pCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworICAgIH0KKyAgICAvKiBWYWxpZGF0ZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzICovCisgICAgU3MgPSBzY2FucHRyLT5TczsKKyAgICBTZSA9IHNjYW5wdHItPlNlOworICAgIEFoID0gc2NhbnB0ci0+QWg7CisgICAgQWwgPSBzY2FucHRyLT5BbDsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgLyogVGhlIEpQRUcgc3BlYyBzaW1wbHkgZ2l2ZXMgdGhlIHJhbmdlcyAwLi4xMyBmb3IgQWggYW5kIEFsLCBidXQgdGhhdAorICAgICAgICogc2VlbXMgd3Jvbmc6IHRoZSB1cHBlciBib3VuZCBvdWdodCB0byBkZXBlbmQgb24gZGF0YSBwcmVjaXNpb24uCisgICAgICAgKiBQZXJoYXBzIHRoZXkgcmVhbGx5IG1lYW50IDAuLk4rMSBmb3IgTi1iaXQgcHJlY2lzaW9uLgorICAgICAgICogSGVyZSB3ZSBhbGxvdyAwLi4xMCBmb3IgOC1iaXQgZGF0YTsgQWwgbGFyZ2VyIHRoYW4gMTAgcmVzdWx0cyBpbgorICAgICAgICogb3V0LW9mLXJhbmdlIHJlY29uc3RydWN0ZWQgREMgdmFsdWVzIGR1cmluZyB0aGUgZmlyc3QgREMgc2NhbiwKKyAgICAgICAqIHdoaWNoIG1pZ2h0IGNhdXNlIHByb2JsZW1zIGZvciBzb21lIGRlY29kZXJzLgorICAgICAgICovCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTUFYX0FIX0FMIDEwCisjZWxzZQorI2RlZmluZSBNQVhfQUhfQUwgMTMKKyNlbmRpZgorICAgICAgaWYgKFNzIDwgMCB8fCBTcyA+PSBEQ1RTSVpFMiB8fCBTZSA8IFNzIHx8IFNlID49IERDVFNJWkUyIHx8CisJICBBaCA8IDAgfHwgQWggPiBNQVhfQUhfQUwgfHwgQWwgPCAwIHx8IEFsID4gTUFYX0FIX0FMKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKyAgICAgIGlmIChTcyA9PSAwKSB7CisJaWYgKFNlICE9IDApCQkvKiBEQyBhbmQgQUMgdG9nZXRoZXIgbm90IE9LICovCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICB9IGVsc2UgeworCWlmIChuY29tcHMgIT0gMSkJLyogQUMgc2NhbnMgbXVzdCBiZSBmb3Igb25seSBvbmUgY29tcG9uZW50ICovCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICB9CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKKwlsYXN0X2JpdHBvc19wdHIgPSAmIGxhc3RfYml0cG9zW3NjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV1dWzBdOworCWlmIChTcyAhPSAwICYmIGxhc3RfYml0cG9zX3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLworCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworCWZvciAoY29lZmkgPSBTczsgY29lZmkgPD0gU2U7IGNvZWZpKyspIHsKKwkgIGlmIChsYXN0X2JpdHBvc19wdHJbY29lZmldIDwgMCkgeworCSAgICAvKiBmaXJzdCBzY2FuIG9mIHRoaXMgY29lZmZpY2llbnQgKi8KKwkgICAgaWYgKEFoICE9IDApCisJICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworCSAgfSBlbHNlIHsKKwkgICAgLyogbm90IGZpcnN0IHNjYW4gKi8KKwkgICAgaWYgKEFoICE9IGxhc3RfYml0cG9zX3B0cltjb2VmaV0gfHwgQWwgIT0gQWgtMSkKKwkgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisJICB9CisJICBsYXN0X2JpdHBvc19wdHJbY29lZmldID0gQWw7CisJfQorICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIG11c3QgYmUgdGhlc2U6ICovCisgICAgICBpZiAoU3MgIT0gMCB8fCBTZSAhPSBEQ1RTSVpFMi0xIHx8IEFoICE9IDAgfHwgQWwgIT0gMCkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICAvKiBNYWtlIHN1cmUgY29tcG9uZW50cyBhcmUgbm90IHNlbnQgdHdpY2UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgeworCXRoaXNpID0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXTsKKwlpZiAoY29tcG9uZW50X3NlbnRbdGhpc2ldKQorCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworCWNvbXBvbmVudF9zZW50W3RoaXNpXSA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogTm93IHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgZ290IHNlbnQuICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgLyogRm9yIHByb2dyZXNzaXZlIG1vZGUsIHdlIG9ubHkgY2hlY2sgdGhhdCBhdCBsZWFzdCBzb21lIERDIGRhdGEKKyAgICAgKiBnb3Qgc2VudCBmb3IgZWFjaCBjb21wb25lbnQ7IHRoZSBzcGVjIGRvZXMgbm90IHJlcXVpcmUgdGhhdCBhbGwgYml0cworICAgICAqIG9mIGFsbCBjb2VmZmljaWVudHMgYmUgdHJhbnNtaXR0ZWQuICBXb3VsZCBpdCBiZSB3aXNlciB0byBlbmZvcmNlCisgICAgICogdHJhbnNtaXNzaW9uIG9mIGFsbCBjb2VmZmljaWVudCBiaXRzPz8KKyAgICAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlmIChsYXN0X2JpdHBvc1tjaV1bMF0gPCAwKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfTUlTU0lOR19EQVRBKTsKKyAgICB9CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlmICghIGNvbXBvbmVudF9zZW50W2NpXSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX01JU1NJTkdfREFUQSk7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X3NjYW5fcGFyYW1ldGVycyAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBTZXQgdXAgdGhlIHNjYW4gcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnQgc2NhbiAqLworeworICBpbnQgY2k7CisKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgaWYgKGNpbmZvLT5zY2FuX2luZm8gIT0gTlVMTCkgeworICAgIC8qIFByZXBhcmUgZm9yIGN1cnJlbnQgc2NhbiAtLS0gdGhlIHNjcmlwdCBpcyBhbHJlYWR5IHZhbGlkYXRlZCAqLworICAgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisgICAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FucHRyID0gY2luZm8tPnNjYW5faW5mbyArIG1hc3Rlci0+c2Nhbl9udW1iZXI7CisKKyAgICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IHNjYW5wdHItPmNvbXBzX2luX3NjYW47CisgICAgZm9yIChjaSA9IDA7IGNpIDwgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgICAgY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID0KKwkmY2luZm8tPmNvbXBfaW5mb1tzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldXTsKKyAgICB9CisgICAgY2luZm8tPlNzID0gc2NhbnB0ci0+U3M7CisgICAgY2luZm8tPlNlID0gc2NhbnB0ci0+U2U7CisgICAgY2luZm8tPkFoID0gc2NhbnB0ci0+QWg7CisgICAgY2luZm8tPkFsID0gc2NhbnB0ci0+QWw7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsKKyAgICAvKiBQcmVwYXJlIGZvciBzaW5nbGUgc2VxdWVudGlhbC1KUEVHIHNjYW4gY29udGFpbmluZyBhbGwgY29tcG9uZW50cyAqLworICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKKyAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPSAmY2luZm8tPmNvbXBfaW5mb1tjaV07CisgICAgfQorICAgIGNpbmZvLT5TcyA9IDA7CisgICAgY2luZm8tPlNlID0gRENUU0laRTItMTsKKyAgICBjaW5mby0+QWggPSAwOworICAgIGNpbmZvLT5BbCA9IDA7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorcGVyX3NjYW5fc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLworLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gYXJlIGFscmVhZHkgc2V0ICovCit7CisgIGludCBjaSwgbWN1YmxrcywgdG1wOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKKyAgICAKKyAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKKyAgICAKKyAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLworICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworICAgIAorICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KKyAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOworICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOworICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOworICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBEQ1RTSVpFOworICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gMTsKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbnMsIGl0IGlzIGNvbnZlbmllbnQgdG8gZGVmaW5lIGxhc3Rfcm93X2hlaWdodAorICAgICAqIGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgcm93cyBwcmVzZW50IGluIHRoZSBsYXN0IGlNQ1Ugcm93LgorICAgICAqLworICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKKyAgICAKKyAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAxOworICAgIGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFswXSA9IDA7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgICAgLyogSW50ZXJsZWF2ZWQgKG11bHRpLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8PSAwIHx8IGNpbmZvLT5jb21wc19pbl9zY2FuID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5jb21wc19pbl9zY2FuLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOworICAgIAorICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgLyogU2FtcGxpbmcgZmFjdG9ycyBnaXZlICMgb2YgYmxvY2tzIG9mIGNvbXBvbmVudCBpbiBlYWNoIE1DVSAqLworICAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+TUNVX3dpZHRoICogRENUU0laRTsKKyAgICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygbm9uLWR1bW15IGJsb2NrcyBpbiBsYXN0IE1DVSBjb2x1bW4gJiByb3cgKi8KKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX2hlaWdodCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgICBtY3VibGtzID0gY29tcHB0ci0+TUNVX2Jsb2NrczsKKyAgICAgIGlmIChjaW5mby0+YmxvY2tzX2luX01DVSArIG1jdWJsa3MgPiBDX01BWF9CTE9DS1NfSU5fTUNVKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX01DVV9TSVpFKTsKKyAgICAgIHdoaWxlIChtY3VibGtzLS0gPiAwKSB7CisJY2luZm8tPk1DVV9tZW1iZXJzaGlwW2NpbmZvLT5ibG9ja3NfaW5fTUNVKytdID0gY2k7CisgICAgICB9CisgICAgfQorICAgIAorICB9CisKKyAgLyogQ29udmVydCByZXN0YXJ0IHNwZWNpZmllZCBpbiByb3dzIHRvIGFjdHVhbCBNQ1UgY291bnQuICovCisgIC8qIE5vdGUgdGhhdCBjb3VudCBtdXN0IGZpdCBpbiAxNiBiaXRzLCBzbyB3ZSBwcm92aWRlIGxpbWl0aW5nLiAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW5fcm93cyA+IDApIHsKKyAgICBsb25nIG5vbWluYWwgPSAobG9uZykgY2luZm8tPnJlc3RhcnRfaW5fcm93cyAqIChsb25nKSBjaW5mby0+TUNVc19wZXJfcm93OworICAgIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gKHVuc2lnbmVkIGludCkgTUlOKG5vbWluYWwsIDY1NTM1TCk7CisgIH0KK30KKworCisvKgorICogUGVyLXBhc3Mgc2V0dXAuCisgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4gIFdlIGRldGVybWluZSB3aGljaCBtb2R1bGVzCisgKiB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgc3RhcnRfcGFzcyBjYWxscy4KKyAqIFdlIGFsc28gc2V0IGlzX2xhc3RfcGFzcyB0byBpbmRpY2F0ZSB3aGV0aGVyIGFueSBtb3JlIHBhc3NlcyB3aWxsIGJlCisgKiByZXF1aXJlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ByZXBhcmVfZm9yX3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIHN3aXRjaCAobWFzdGVyLT5wYXNzX3R5cGUpIHsKKyAgY2FzZSBtYWluX3Bhc3M6CisgICAgLyogSW5pdGlhbCBwYXNzOiB3aWxsIGNvbGxlY3QgaW5wdXQgZGF0YSwgYW5kIGRvIGVpdGhlciBIdWZmbWFuCisgICAgICogb3B0aW1pemF0aW9uIG9yIGRhdGEgb3V0cHV0IGZvciB0aGUgZmlyc3Qgc2Nhbi4KKyAgICAgKi8KKyAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKKyAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgICAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAgICgqY2luZm8tPmRvd25zYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICAoKmNpbmZvLT5wcmVwLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKKyAgICB9CisgICAgKCpjaW5mby0+ZmRjdC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpOworICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywKKwkJCQkobWFzdGVyLT50b3RhbF9wYXNzZXMgPiAxID8KKwkJCQkgSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKKyAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKKyAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykgeworICAgICAgLyogTm8gaW1tZWRpYXRlIGRhdGEgb3V0cHV0OyBwb3N0cG9uZSB3cml0aW5nIGZyYW1lL3NjYW4gaGVhZGVycyAqLworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgLyogV2lsbCB3cml0ZSBmcmFtZS9zY2FuIGhlYWRlcnMgYXQgZmlyc3QganBlZ193cml0ZV9zY2FubGluZXMgY2FsbCAqLworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBUUlVFOworICAgIH0KKyAgICBicmVhazsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgY2FzZSBodWZmX29wdF9wYXNzOgorICAgIC8qIERvIEh1ZmZtYW4gb3B0aW1pemF0aW9uIGZvciBhIHNjYW4gYWZ0ZXIgdGhlIGZpcnN0IG9uZS4gKi8KKyAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKKyAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgICAgaWYgKGNpbmZvLT5TcyAhPSAwIHx8IGNpbmZvLT5BaCA9PSAwIHx8IGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIFRSVUUpOworICAgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBTcGVjaWFsIGNhc2U6IEh1ZmZtYW4gREMgcmVmaW5lbWVudCBzY2FucyBuZWVkIG5vIEh1ZmZtYW4gdGFibGUKKyAgICAgKiBhbmQgdGhlcmVmb3JlIHdlIGNhbiBza2lwIHRoZSBvcHRpbWl6YXRpb24gcGFzcyBmb3IgdGhlbS4KKyAgICAgKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKKyAgICAvKkZBTExUSFJPVUdIKi8KKyNlbmRpZgorICBjYXNlIG91dHB1dF9wYXNzOgorICAgIC8qIERvIGEgZGF0YS1vdXRwdXQgcGFzcy4gKi8KKyAgICAvKiBXZSBuZWVkIG5vdCByZXBlYXQgcGVyLXNjYW4gc2V0dXAgaWYgcHJpb3Igb3B0aW1pemF0aW9uIHBhc3MgZGlkIGl0LiAqLworICAgIGlmICghIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpIHsKKyAgICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOworICAgICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOworICAgIH0KKyAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIEZBTFNFKTsKKyAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7CisgICAgLyogV2UgZW1pdCBmcmFtZS9zY2FuIGhlYWRlcnMgbm93ICovCisgICAgaWYgKG1hc3Rlci0+c2Nhbl9udW1iZXIgPT0gMCkKKyAgICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZnJhbWVfaGVhZGVyKSAoY2luZm8pOworICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7CisgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgIH0KKworICBtYXN0ZXItPnB1Yi5pc19sYXN0X3Bhc3MgPSAobWFzdGVyLT5wYXNzX251bWJlciA9PSBtYXN0ZXItPnRvdGFsX3Bhc3Nlcy0xKTsKKworICAvKiBTZXQgdXAgcHJvZ3Jlc3MgbW9uaXRvcidzIHBhc3MgaW5mbyBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXI7CisgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSBtYXN0ZXItPnRvdGFsX3Bhc3NlczsKKyAgfQorfQorCisKKy8qCisgKiBTcGVjaWFsIHN0YXJ0LW9mLXBhc3MgaG9vay4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfd3JpdGVfc2NhbmxpbmVzIGlmIGNhbGxfcGFzc19zdGFydHVwIGlzIFRSVUUuCisgKiBJbiBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nLCB3ZSBuZWVkIHRoaXMgaG9vayBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KKyAqIHdyaXRlIGZyYW1lL3NjYW4gaGVhZGVycyBkdXJpbmcganBlZ19zdGFydF9jb21wcmVzczsgd2Ugd2FudCB0byBsZXQgdGhlCisgKiBhcHBsaWNhdGlvbiB3cml0ZSBDT00gbWFya2VycyBldGMuIGJldHdlZW4ganBlZ19zdGFydF9jb21wcmVzcyBhbmQgdGhlCisgKiBqcGVnX3dyaXRlX3NjYW5saW5lcyBsb29wLgorICogSW4gbXVsdGktcGFzcyBwcm9jZXNzaW5nLCB0aGlzIHJvdXRpbmUgaXMgbm90IHVzZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwYXNzX3N0YXJ0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOyAvKiByZXNldCBmbGFnIHNvIGNhbGwgb25seSBvbmNlICovCisKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9mcmFtZV9oZWFkZXIpIChjaW5mbyk7CisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCBlbmQgb2YgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX21hc3RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgLyogVGhlIGVudHJvcHkgY29kZXIgYWx3YXlzIG5lZWRzIGFuIGVuZC1vZi1wYXNzIGNhbGwsCisgICAqIGVpdGhlciB0byBhbmFseXplIHN0YXRpc3RpY3Mgb3IgdG8gZmx1c2ggaXRzIG91dHB1dCBidWZmZXIuCisgICAqLworICAoKmNpbmZvLT5lbnRyb3B5LT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKworICAvKiBVcGRhdGUgc3RhdGUgZm9yIG5leHQgcGFzcyAqLworICBzd2l0Y2ggKG1hc3Rlci0+cGFzc190eXBlKSB7CisgIGNhc2UgbWFpbl9wYXNzOgorICAgIC8qIG5leHQgcGFzcyBpcyBlaXRoZXIgb3V0cHV0IG9mIHNjYW4gMCAoYWZ0ZXIgb3B0aW1pemF0aW9uKQorICAgICAqIG9yIG91dHB1dCBvZiBzY2FuIDEgKGlmIG5vIG9wdGltaXphdGlvbikuCisgICAgICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgICBpZiAoISBjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgICAgbWFzdGVyLT5zY2FuX251bWJlcisrOworICAgIGJyZWFrOworICBjYXNlIGh1ZmZfb3B0X3Bhc3M6CisgICAgLyogbmV4dCBwYXNzIGlzIGFsd2F5cyBvdXRwdXQgb2YgY3VycmVudCBzY2FuICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBvdXRwdXRfcGFzczoKKyAgICAvKiBuZXh0IHBhc3MgaXMgZWl0aGVyIG9wdGltaXphdGlvbiBvciBvdXRwdXQgb2YgbmV4dCBzY2FuICovCisgICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCisgICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IGh1ZmZfb3B0X3Bhc3M7CisgICAgbWFzdGVyLT5zY2FuX251bWJlcisrOworICAgIGJyZWFrOworICB9CisKKyAgbWFzdGVyLT5wYXNzX251bWJlcisrOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIG1hc3RlciBjb21wcmVzc2lvbiBjb250cm9sLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19tYXN0ZXJfY29udHJvbCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gdHJhbnNjb2RlX29ubHkpCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyOworCisgIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihteV9jb21wX21hc3RlcikpOworICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyICopIG1hc3RlcjsKKyAgbWFzdGVyLT5wdWIucHJlcGFyZV9mb3JfcGFzcyA9IHByZXBhcmVfZm9yX3Bhc3M7CisgIG1hc3Rlci0+cHViLnBhc3Nfc3RhcnR1cCA9IHBhc3Nfc3RhcnR1cDsKKyAgbWFzdGVyLT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19tYXN0ZXI7CisgIG1hc3Rlci0+cHViLmlzX2xhc3RfcGFzcyA9IEZBTFNFOworCisgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMsIGRldGVybWluZSBkZXJpdmVkIHZhbHVlcyAqLworICBpbml0aWFsX3NldHVwKGNpbmZvKTsKKworICBpZiAoY2luZm8tPnNjYW5faW5mbyAhPSBOVUxMKSB7CisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgdmFsaWRhdGVfc2NyaXB0KGNpbmZvKTsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBGQUxTRTsKKyAgICBjaW5mby0+bnVtX3NjYW5zID0gMTsKKyAgfQorCisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkJLyogIFRFTVBPUkFSWSBIQUNLID8/PyAqLworICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOyAvKiBhc3N1bWUgZGVmYXVsdCB0YWJsZXMgbm8gZ29vZCBmb3IgcHJvZ3Jlc3NpdmUgbW9kZSAqLworCisgIC8qIEluaXRpYWxpemUgbXkgcHJpdmF0ZSBzdGF0ZSAqLworICBpZiAodHJhbnNjb2RlX29ubHkpIHsKKyAgICAvKiBubyBtYWluIHBhc3MgaW4gdHJhbnNjb2RpbmcgKi8KKyAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKKyAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gaHVmZl9vcHRfcGFzczsKKyAgICBlbHNlCisgICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICB9IGVsc2UgeworICAgIC8qIGZvciBub3JtYWwgY29tcHJlc3Npb24sIGZpcnN0IHBhc3MgaXMgYWx3YXlzIHRoaXMgdHlwZTogKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG1haW5fcGFzczsKKyAgfQorICBtYXN0ZXItPnNjYW5fbnVtYmVyID0gMDsKKyAgbWFzdGVyLT5wYXNzX251bWJlciA9IDA7CisgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgIG1hc3Rlci0+dG90YWxfcGFzc2VzID0gY2luZm8tPm51bV9zY2FucyAqIDI7CisgIGVsc2UKKyAgICBtYXN0ZXItPnRvdGFsX3Bhc3NlcyA9IGNpbmZvLT5udW1fc2NhbnM7Cit9CmRpZmYgLS1naXQgYS9qcGVnL2pjb21hcGkuYyBiL2pwZWcvamNvbWFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMWZhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjb21hcGkuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIGpjb21hcGkuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSByb3V0aW5lcyB0aGF0IGFyZSB1c2VkIGZvciBib3RoCisgKiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLAorICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCisgKgorICogRm9yIHRoaXMsIHdlIG1lcmVseSBjbGVhbiB1cCBhbGwgdGhlIG5vbnBlcm1hbmVudCBtZW1vcnkgcG9vbHMuCisgKiBOb3RlIHRoYXQgdGVtcCBmaWxlcyAodmlydHVhbCBhcnJheXMpIGFyZSBub3QgYWxsb3dlZCB0byBiZWxvbmcgdG8KKyAqIHRoZSBwZXJtYW5lbnQgcG9vbCwgc28gd2Ugd2lsbCBiZSBhYmxlIHRvIGNsb3NlIGFsbCB0ZW1wIGZpbGVzIGhlcmUuCisgKiBDbG9zaW5nIGEgZGF0YSBzb3VyY2Ugb3IgZGVzdGluYXRpb24sIGlmIG5lY2Vzc2FyeSwgaXMgdGhlIGFwcGxpY2F0aW9uJ3MKKyAqIHJlc3BvbnNpYmlsaXR5LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19hYm9ydCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBpbnQgcG9vbDsKKworICAvKiBEbyBub3RoaW5nIGlmIGNhbGxlZCBvbiBhIG5vdC1pbml0aWFsaXplZCBvciBkZXN0cm95ZWQgSlBFRyBvYmplY3QuICovCisgIGlmIChjaW5mby0+bWVtID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIFJlbGVhc2luZyBwb29scyBpbiByZXZlcnNlIG9yZGVyIG1pZ2h0IGhlbHAgYXZvaWQgZnJhZ21lbnRhdGlvbgorICAgKiB3aXRoIHNvbWUgKGJyYWluLWRhbWFnZWQpIG1hbGxvYyBsaWJyYXJpZXMuCisgICAqLworICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID4gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKKyAgICAoKmNpbmZvLT5tZW0tPmZyZWVfcG9vbCkgKGNpbmZvLCBwb29sKTsKKyAgfQorCisgIC8qIFJlc2V0IG92ZXJhbGwgc3RhdGUgZm9yIHBvc3NpYmxlIHJldXNlIG9mIG9iamVjdCAqLworICBpZiAoY2luZm8tPmlzX2RlY29tcHJlc3NvcikgeworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7CisgICAgLyogVHJ5IHRvIGtlZXAgYXBwbGljYXRpb24gZnJvbSBhY2Nlc3Npbmcgbm93LWRlbGV0ZWQgbWFya2VyIGxpc3QuCisgICAgICogQSBiaXQga2x1ZGd5IHRvIGRvIGl0IGhlcmUsIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IGNlbnRyYWwgcGxhY2UuCisgICAgICovCisgICAgKChqX2RlY29tcHJlc3NfcHRyKSBjaW5mbyktPm1hcmtlcl9saXN0ID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gQ1NUQVRFX1NUQVJUOworICB9Cit9CisKKworLyoKKyAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBvYmplY3QuCisgKgorICogRXZlcnl0aGluZyBnZXRzIGRlYWxsb2NhdGVkIGV4Y2VwdCB0aGUgbWFzdGVyIGpwZWdfY29tcHJlc3Nfc3RydWN0IGl0c2VsZgorICogYW5kIHRoZSBlcnJvciBtYW5hZ2VyIHN0cnVjdC4gIEJvdGggb2YgdGhlc2UgYXJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbgorICogYW5kIG11c3QgYmUgZnJlZWQsIGlmIG5lY2Vzc2FyeSwgYnkgdGhlIGFwcGxpY2F0aW9uLiAgKE9mdGVuIHRoZXkgYXJlIG9uCisgKiB0aGUgc3RhY2sgYW5kIHNvIGRvbid0IG5lZWQgdG8gYmUgZnJlZWQgYW55d2F5LikKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiwgaWYgbmVjZXNzYXJ5LCBpcyB0aGUgYXBwbGljYXRpb24ncworICogcmVzcG9uc2liaWxpdHkuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3kgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogV2UgbmVlZCBvbmx5IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIHJlbGVhc2UgZXZlcnl0aGluZy4gKi8KKyAgLyogTkI6IG1lbSBwb2ludGVyIGlzIE5VTEwgaWYgbWVtb3J5IG1nciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKi8KKyAgaWYgKGNpbmZvLT5tZW0gIT0gTlVMTCkKKyAgICAoKmNpbmZvLT5tZW0tPnNlbGZfZGVzdHJ1Y3QpIChjaW5mbyk7CisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogYmUgc2FmZSBpZiBqcGVnX2Rlc3Ryb3kgaXMgY2FsbGVkIHR3aWNlICovCisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAwOwkvKiBtYXJrIGl0IGRlc3Ryb3llZCAqLworfQorCisKKy8qCisgKiBDb252ZW5pZW5jZSByb3V0aW5lcyBmb3IgYWxsb2NhdGluZyBxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzLgorICogKFdvdWxkIGp1dGlscy5jIGJlIGEgbW9yZSByZWFzb25hYmxlIHBsYWNlIHRvIHB1dCB0aGVzZT8pCisgKi8KKworR0xPQkFMKEpRVUFOVF9UQkwgKikKK2pwZWdfYWxsb2NfcXVhbnRfdGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqdGJsOworCisgIHRibCA9IChKUVVBTlRfVEJMICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsIFNJWkVPRihKUVVBTlRfVEJMKSk7CisgIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCisgIHJldHVybiB0Ymw7Cit9CisKKworR0xPQkFMKEpIVUZGX1RCTCAqKQoranBlZ19hbGxvY19odWZmX3RhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIEpIVUZGX1RCTCAqdGJsOworCisgIHRibCA9IChKSFVGRl9UQkwgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgU0laRU9GKEpIVUZGX1RCTCkpOworICB0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsJLyogbWFrZSBzdXJlIHRoaXMgaXMgZmFsc2UgaW4gYW55IG5ldyB0YWJsZSAqLworICByZXR1cm4gdGJsOworfQpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLmJjYyBiL2pwZWcvamNvbmZpZy5iY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjNTNmZgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamNvbmZpZy5iY2MKQEAgLTAsMCArMSw0OCBAQAorLyogamNvbmZpZy5iY2MgLS0tIGpjb25maWcuaCBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSBvbiBNUy1ET1Mgb3IgT1MvMi4gKi8KKy8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworLyogI2RlZmluZSBjb25zdCAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMJLyogZm9yIHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWwgKi8KKyNlbmRpZgorI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgkvKiB0aGlzIGFzc3VtZXMgeW91IGhhdmUgLXctc3R1IGluIENGTEFHUyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMCS8qIE1heGltdW0gcmVxdWVzdCB0byBtYWxsb2MoKSAqLworI2RlZmluZSBVU0VfRk1FTQkJLyogQm9ybGFuZCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCisjZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBCb3JsYW5kIGhhcyBzZXRtb2RlKCkgKi8KKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworI2VuZGlmCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLmNmZyBiL2pwZWcvamNvbmZpZy5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMDRmYQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamNvbmZpZy5jZmcKQEAgLTAsMCArMSw0NCBAQAorLyogamNvbmZpZy5jZmcgLS0tIHNvdXJjZSBmaWxlIGVkaXRlZCBieSBjb25maWd1cmUgc2NyaXB0ICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjdW5kZWYgSEFWRV9QUk9UT1RZUEVTCisjdW5kZWYgSEFWRV9VTlNJR05FRF9DSEFSCisjdW5kZWYgSEFWRV9VTlNJR05FRF9TSE9SVAorI3VuZGVmIHZvaWQKKyN1bmRlZiBjb25zdAorI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyN1bmRlZiBIQVZFX1NURERFRl9ICisjdW5kZWYgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgZ2V0IHdhcm5pbmdzIGFib3V0IHVuZGVmaW5lZCBzdHJ1Y3R1cmVzLiAqLworI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKyN1bmRlZiBJTkxJTkUKKy8qIFRoZXNlIGFyZSBmb3IgY29uZmlndXJpbmcgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICovCisjdW5kZWYgREVGQVVMVF9NQVhfTUVNCisjdW5kZWYgTk9fTUtURU1QCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuICovCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCisKKyNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9qcGVnL2pjb25maWcuZGogYi9qcGVnL2pjb25maWcuZGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1OWE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamNvbmZpZy5kagpAQCAtMCwwICsxLDM4IEBACisvKiBqY29uZmlnLmRqIC0tLSBqY29uZmlnLmggZm9yIERKR1BQIChEZWxvcmllJ3MgR05VIEMgcG9ydCkgb24gTVMtRE9TLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIERKR1BQIHVzZXMgZmxhdCAzMi1iaXQgYWRkcmVzc2luZyAqLworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE5lZWRlZCB0byBtYWtlIG9uZS1maWxlIHN0eWxlIHdvcmsgaW4gREpHUFAgKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLworI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamNvbmZpZy5kb2MgYi9qcGVnL2pjb25maWcuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGQxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjb25maWcuZG9jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogamNvbmZpZy5kb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bworICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgorICoKKyAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKKyAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKKyAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgorICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KKyAqCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCisgKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCisgKi8KKworCisvKgorICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCisgKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCisgKi8KKworLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCisgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKy8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPworICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPworICovCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KKyAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAorICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgorICovCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworCisvKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgorICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisKKy8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgorICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KKyAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCisgKi8KKyNkZWZpbmUgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KKyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCisgKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgorICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKKyAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCisgKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisKKy8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAorICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgorICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KKyAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAorICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCisgKi8KKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKKyAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCisgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bworICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCisgKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQorICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKKyAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgorICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworCisvKgorICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKKyAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKKyAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCisgKi8KKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKKyAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCisgKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KKyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisvKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAorICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgorICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0CisgKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KKyAqLworI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgorICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcworICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgorICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCisvKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAorICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCisgKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgorICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCisgKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLmggYi9qcGVnL2pjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE5ODE3Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qY29uZmlnLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIGFuZHJvaWQgamNvbmZpZy5oICovCisvKgorICogamNvbmZpZy5kb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bworICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgorICoKKyAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKKyAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKKyAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgorICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KKyAqCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCisgKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCisgKi8KKworCisvKgorICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCisgKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCisgKi8KKworLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCisgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKy8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPworICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPworICovCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KKyAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAorICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgorICovCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworCisvKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgorICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisKKy8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgorICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KKyAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCisgKi8KKyNkZWZpbmUgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KKyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCisgKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgorICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKKyAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCisgKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisKKy8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAorICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgorICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KKyAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAorICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCisgKi8KKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKKyAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCisgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bworICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCisgKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQorICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKKyAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgorICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworCisvKgorICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKKyAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKKyAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCisgKi8KKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKKyAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCisgKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KKyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisvKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAorICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgorICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0CisgKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KKyAqLworI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgorICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcworICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgorICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCisvKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAorICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCisgKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgorICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCisgKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLm1hYyBiL2pwZWcvamNvbmZpZy5tYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlM2VmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamNvbmZpZy5tYWMKQEAgLTAsMCArMSw0MyBAQAorLyogamNvbmZpZy5tYWMgLS0tIGpjb25maWcuaCBmb3IgQ29kZVdhcnJpb3Igb24gQXBwbGUgTWFjaW50b3NoICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFVTRV9NQUNfTUVNTUdSCQkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1tYWMuYyAqLworCisjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZwkJLyogTmVlZGVkIGZvciA2ODB4MCBNYWNzICovCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFVTRV9DQ09NTUFORAkJLyogQ29tbWFuZCBsaW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIEJpbmFyeSBJL08gdGhydSBzdGRpbi9zdGRvdXQgZG9lc24ndCB3b3JrICovCisKKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLm1hbnggYi9qcGVnL2pjb25maWcubWFueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQwZDAwCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qY29uZmlnLm1hbngKQEAgLTAsMCArMSw0MyBAQAorLyogamNvbmZpZy5tYW54IC0tLSBqY29uZmlnLmggZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgTWFueCBBenRlYyBDIHZlciA1LnguICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KKworI2RlZmluZSBTSE9SVHhTSE9SVF8zMgkJLyogcHJvZHVjZXMgYmV0dGVyIERDVCBjb2RlIHdpdGggQXp0ZWMgQyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZGVmaW5lIHNpZ25hbF9jYXRjaGVyIF9hYm9ydAkvKiBoYWNrIGZvciBBenRlYyBDIG5hbWluZyByZXF1aXJlbWVudHMgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamNvbmZpZy5tYzYgYi9qcGVnL2pjb25maWcubWM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NTA4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjb25maWcubWM2CkBAIC0wLDAgKzEsNTIgQEAKKy8qIGpjb25maWcubWM2IC0tLSBqY29uZmlnLmggZm9yIE1pY3Jvc29mdCBDIG9uIE1TLURPUywgdmVyc2lvbiA2LjAwQSAmIHVwLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI2RlZmluZSBORUVEX0ZBUl9QT0lOVEVSUwkvKiBmb3Igc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCAqLworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworCisjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCisKKyNkZWZpbmUgVVNFX0ZNRU0JCS8qIE1pY3Jvc29mdCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLworCisjZGVmaW5lIE5FRURfRkhFQVBNSU4JCS8qIGZhciBoZWFwIG1hbmFnZW1lbnQgcm91dGluZXMgYXJlIGJyb2tlbiAqLworCisjZGVmaW5lIFNIT1JUeExDT05TVF8zMgkJLyogZW5hYmxlIGNvbXBpbGVyLXNwZWNpZmljIERDVCBvcHRpbWl6YXRpb24gKi8KKy8qIE5vdGU6IHRoZSBhYm92ZSBkZWZpbmUgaXMga25vd24gdG8gaW1wcm92ZSB0aGUgY29kZSB3aXRoIE1pY3Jvc29mdCBDIDYuMDBBLgorICogSSBkbyBub3Qga25vdyB3aGV0aGVyIGl0IGlzIGdvb2QgZm9yIGxhdGVyIGNvbXBpbGVyIHZlcnNpb25zLgorICogUGxlYXNlIHJlcG9ydCBhbnkgaW5mbyBvbiB0aGlzIHBvaW50IHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCisgKi8KKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCisjZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtZG9zLmMgKi8KKyN1bmRlZiBET05UX1VTRV9CX01PREUKKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCisKKyNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9qcGVnL2pjb25maWcuc2FzIGIvanBlZy9qY29uZmlnLnNhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRhYzIyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qY29uZmlnLnNhcwpAQCAtMCwwICsxLDQzIEBACisvKiBqY29uZmlnLnNhcyAtLS0gamNvbmZpZy5oIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIFNBUyBDIDYuMCBhbmQgdXAuICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KKworI2RlZmluZSBOT19NS1RFTVAJCS8qIFNBUyBDIGRvZXNuJ3QgaGF2ZSBta3RlbXAoKSAqLworCisjZGVmaW5lIFNIT1JUeFNIT1JUXzMyCQkvKiBwcm9kdWNlcyBiZXR0ZXIgRENUIGNvZGUgd2l0aCBTQVMgQyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLnN0IGIvanBlZy9qY29uZmlnLnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MjFiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjb25maWcuc3QKQEAgLTAsMCArMSw0MiBAQAorLyogamNvbmZpZy5zdCAtLS0gamNvbmZpZy5oIGZvciBBdGFyaSBTVC9TVEUvVFQgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCS8qIHN1cHByZXNzIHVuZGVmaW5lZC1zdHJ1Y3R1cmUgd2FybmluZ3MgKi8KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIEFMSUdOX1RZUEUgIGxvbmcJLyogYXBwYXJlbnRseSBkb3VibGUgaXMgYSB3ZWlyZCBzaXplPyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAtLSB1bmRlZiBpZiB5b3UgbGlrZSBVbml4IHN0eWxlICovCisvKiBOb3RlOiBpZiB5b3UgdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUsIHlvdSBtYXkgbmVlZCB0byBkZWZpbmUKKyAqIFVTRV9TRVRNT0RFLiAgU29tZSBBdGFyaSBjb21waWxlcnMgcmVxdWlyZSBpdCwgc29tZSBkbyBub3QuCisgKi8KKyNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBuZWVkZWQgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLnZjIGIvanBlZy9qY29uZmlnLnZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjkxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjb25maWcudmMKQEAgLTAsMCArMSw0NSBAQAorLyogamNvbmZpZy52YyAtLS0gamNvbmZpZy5oIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIDk1IG9yIE5ULiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIHdlIHByZXN1bWUgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KKyNpZm5kZWYgX19SUENORFJfSF9fCQkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOworI2VuZGlmCisjZGVmaW5lIEhBVkVfQk9PTEVBTgkJLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLworCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamNvbmZpZy52bXMgYi9qcGVnL2pjb25maWcudm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YTZmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjb25maWcudm1zCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGpjb25maWcudm1zIC0tLSBqY29uZmlnLmggZm9yIHVzZSBvbiBEaWdpdGFsIFZNUy4gKi8KKy8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworLyogI2RlZmluZSBjb25zdCAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIE5lZWRlZCBvbiBWTVMgKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qY29uZmlnLndhdCBiL2pwZWcvamNvbmZpZy53YXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjNTQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamNvbmZpZy53YXQKQEAgLTAsMCArMSwzOCBAQAorLyogamNvbmZpZy53YXQgLS0tIGpjb25maWcuaCBmb3IgV2F0Y29tIEMvQysrIG9uIE1TLURPUyBvciBPUy8yLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjZGVmaW5lIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBXYXRjb20gdXNlcyBmbGF0IDMyLWJpdCBhZGRyZXNzaW5nICovCisjdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAqLworI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTmVlZGVkIHRvIG1ha2Ugb25lLWZpbGUgc3R5bGUgd29yayBpbiBXYXRjb20gKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLworI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamNwYXJhbS5jIGIvanBlZy9qY3BhcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjNDhmNQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamNwYXJhbS5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogamNwYXJhbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgb3B0aW9uYWwgZGVmYXVsdC1zZXR0aW5nIGNvZGUgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBBcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZmlsZSwgYnV0IHRob3NlIHRoYXQgZG9uJ3QgdXNlIGl0CisgKiBtdXN0IGtub3cgYSBsb3QgbW9yZSBhYm91dCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBjb2RlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogUXVhbnRpemF0aW9uIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisvKiBEZWZpbmUgYSBxdWFudGl6YXRpb24gdGFibGUgZXF1YWwgdG8gdGhlIGJhc2ljX3RhYmxlIHRpbWVzCisgKiBhIHNjYWxlIGZhY3RvciAoZ2l2ZW4gYXMgYSBwZXJjZW50YWdlKS4KKyAqIElmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUsIHRoZSBjb21wdXRlZCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcworICogYXJlIGxpbWl0ZWQgdG8gMS4uMjU1IGZvciBKUEVHIGJhc2VsaW5lIGNvbXBhdGliaWxpdHkuCisgKi8KK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBpbnQgaTsKKyAgbG9uZyB0ZW1wOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIGlmICh3aGljaF90YmwgPCAwIHx8IHdoaWNoX3RibCA+PSBOVU1fUVVBTlRfVEJMUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIHdoaWNoX3RibCk7CisKKyAgcXRibHB0ciA9ICYgY2luZm8tPnF1YW50X3RibF9wdHJzW3doaWNoX3RibF07CisKKyAgaWYgKCpxdGJscHRyID09IE5VTEwpCisgICAgKnF0YmxwdHIgPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIHRlbXAgPSAoKGxvbmcpIGJhc2ljX3RhYmxlW2ldICogc2NhbGVfZmFjdG9yICsgNTBMKSAvIDEwMEw7CisgICAgLyogbGltaXQgdGhlIHZhbHVlcyB0byB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICBpZiAodGVtcCA8PSAwTCkgdGVtcCA9IDFMOworICAgIGlmICh0ZW1wID4gMzI3NjdMKSB0ZW1wID0gMzI3NjdMOyAvKiBtYXggcXVhbnRpemVyIG5lZWRlZCBmb3IgMTIgYml0cyAqLworICAgIGlmIChmb3JjZV9iYXNlbGluZSAmJiB0ZW1wID4gMjU1TCkKKyAgICAgIHRlbXAgPSAyNTVMOwkJLyogbGltaXQgdG8gYmFzZWxpbmUgcmFuZ2UgaWYgcmVxdWVzdGVkICovCisgICAgKCpxdGJscHRyKS0+cXVhbnR2YWxbaV0gPSAoVUlOVDE2KSB0ZW1wOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCisgICgqcXRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKK30KKworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKKwkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzCisgKiBhbmQgYSBzdHJhaWdodCBwZXJjZW50YWdlLXNjYWxpbmcgcXVhbGl0eSBzY2FsZS4gIEluIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIKKyAqIHRvIHVzZSBqcGVnX3NldF9xdWFsaXR5IChiZWxvdyk7IHRoaXMgZW50cnkgcG9pbnQgaXMgcHJvdmlkZWQgZm9yCisgKiBhcHBsaWNhdGlvbnMgdGhhdCBpbnNpc3Qgb24gYSBsaW5lYXIgcGVyY2VudGFnZSBzY2FsaW5nLgorICovCit7CisgIC8qIFRoZXNlIGFyZSB0aGUgc2FtcGxlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjIHNlY3Rpb24gSy4xLgorICAgKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBwcm9kdWNlICJnb29kIiBxdWFsaXR5LCBhbmQKKyAgICogd2hlbiBkaXZpZGVkIGJ5IDIsICJ2ZXJ5IGdvb2QiIHF1YWxpdHkuCisgICAqLworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAorICAgIDEyLCAgMTIsICAxNCwgIDE5LCAgMjYsICA1OCwgIDYwLCAgNTUsCisgICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKKyAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAorICAgIDE4LCAgMjIsICAzNywgIDU2LCAgNjgsIDEwOSwgMTAzLCAgNzcsCisgICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgMTA0LCAxMTMsICA5MiwKKyAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICAgIDcyLCAgOTIsICA5NSwgIDk4LCAxMTIsIDEwMCwgMTAzLCAgOTkKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKKyAgfTsKKworICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2FsaW5nICovCisgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAwLCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMSwgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKK0dMT0JBTChpbnQpCitqcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCisvKiBDb252ZXJ0IGEgdXNlci1zcGVjaWZpZWQgcXVhbGl0eSByYXRpbmcgdG8gYSBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCisgKiBmb3IgYW4gdW5kZXJseWluZyBxdWFudGl6YXRpb24gdGFibGUsIHVzaW5nIG91ciByZWNvbW1lbmRlZCBzY2FsaW5nIGN1cnZlLgorICogVGhlIGlucHV0ICdxdWFsaXR5JyBmYWN0b3Igc2hvdWxkIGJlIDAgKHRlcnJpYmxlKSB0byAxMDAgKHZlcnkgZ29vZCkuCisgKi8KK3sKKyAgLyogU2FmZXR5IGxpbWl0IG9uIHF1YWxpdHkgZmFjdG9yLiAgQ29udmVydCAwIHRvIDEgdG8gYXZvaWQgemVybyBkaXZpZGUuICovCisgIGlmIChxdWFsaXR5IDw9IDApIHF1YWxpdHkgPSAxOworICBpZiAocXVhbGl0eSA+IDEwMCkgcXVhbGl0eSA9IDEwMDsKKworICAvKiBUaGUgYmFzaWMgdGFibGUgaXMgdXNlZCBhcy1pcyAoc2NhbGluZyAxMDApIGZvciBhIHF1YWxpdHkgb2YgNTAuCisgICAqIFF1YWxpdGllcyA1MC4uMTAwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDIwMCAtIDIqUTsKKyAgICogbm90ZSB0aGF0IGF0IFE9MTAwIHRoZSBzY2FsaW5nIGlzIDAsIHdoaWNoIHdpbGwgY2F1c2UganBlZ19hZGRfcXVhbnRfdGFibGUKKyAgICogdG8gbWFrZSBhbGwgdGhlIHRhYmxlIGVudHJpZXMgMSAoaGVuY2UsIG1pbmltdW0gcXVhbnRpemF0aW9uIGxvc3MpLgorICAgKiBRdWFsaXRpZXMgMS4uNTAgYXJlIGNvbnZlcnRlZCB0byBzY2FsaW5nIHBlcmNlbnRhZ2UgNTAwMC9RLgorICAgKi8KKyAgaWYgKHF1YWxpdHkgPCA1MCkKKyAgICBxdWFsaXR5ID0gNTAwMCAvIHF1YWxpdHk7CisgIGVsc2UKKyAgICBxdWFsaXR5ID0gMjAwIC0gcXVhbGl0eSoyOworCisgIHJldHVybiBxdWFsaXR5OworfQorCisKK0dMT0JBTCh2b2lkKQoranBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzLgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcXVhbGl0eS1hZGp1c3RpbmcgZW50cnkgcG9pbnQgZm9yIHR5cGljYWwgdXNlcgorICogaW50ZXJmYWNlczsgb25seSB0aG9zZSB3aG8gd2FudCBkZXRhaWxlZCBjb250cm9sIG92ZXIgcXVhbnRpemF0aW9uIHRhYmxlcworICogd291bGQgdXNlIHRoZSBwcmVjZWRpbmcgdGhyZWUgcm91dGluZXMgZGlyZWN0bHkuCisgKi8KK3sKKyAgLyogQ29udmVydCB1c2VyIDAtMTAwIHJhdGluZyB0byBwZXJjZW50YWdlIHNjYWxpbmcgKi8KKyAgcXVhbGl0eSA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOworCisgIC8qIFNldCB1cCBzdGFuZGFyZCBxdWFsaXR5IHRhYmxlcyAqLworICBqcGVnX3NldF9saW5lYXJfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKKy8qCisgKiBIdWZmbWFuIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworTE9DQUwodm9pZCkKK2FkZF9odWZmX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJSkhVRkZfVEJMICoqaHRibHB0ciwgY29uc3QgVUlOVDggKmJpdHMsIGNvbnN0IFVJTlQ4ICp2YWwpCisvKiBEZWZpbmUgYSBIdWZmbWFuIHRhYmxlICovCit7CisgIGludCBuc3ltYm9scywgbGVuOworCisgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBDb3B5IHRoZSBudW1iZXItb2Ytc3ltYm9scy1vZi1lYWNoLWNvZGUtbGVuZ3RoIGNvdW50cyAqLworICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7CisKKyAgLyogVmFsaWRhdGUgdGhlIGNvdW50cy4gIFdlIGRvIHRoaXMgaGVyZSBtYWlubHkgc28gd2UgY2FuIGNvcHkgdGhlIHJpZ2h0CisgICAqIG51bWJlciBvZiBzeW1ib2xzIGZyb20gdGhlIHZhbFtdIGFycmF5LCB3aXRob3V0IHJpc2tpbmcgbWFyY2hpbmcgb2ZmCisgICAqIHRoZSBlbmQgb2YgbWVtb3J5LiAgamNodWZmLmMgd2lsbCBkbyBhIG1vcmUgdGhvcm91Z2ggdGVzdCBsYXRlci4KKyAgICovCisgIG5zeW1ib2xzID0gMDsKKyAgZm9yIChsZW4gPSAxOyBsZW4gPD0gMTY7IGxlbisrKQorICAgIG5zeW1ib2xzICs9IGJpdHNbbGVuXTsKKyAgaWYgKG5zeW1ib2xzIDwgMSB8fCBuc3ltYm9scyA+IDI1NikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIHZhbCwgbnN5bWJvbHMgKiBTSVpFT0YoVUlOVDgpKTsKKworICAvKiBJbml0aWFsaXplIHNlbnRfdGFibGUgRkFMU0Ugc28gdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KKyAgKCpodGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCisKK0xPQ0FMKHZvaWQpCitzdGRfaHVmZl90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCisvKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbiEgKi8KK3sKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfbHVtaW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9OworICAKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KKyAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfY2hyb21pbmFuY2VbXSA9CisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2x1bWluYW5jZVsxN10gPQorICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N2QgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19sdW1pbmFuY2VbXSA9CisgICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgICAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKKyAgICAgIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4MDgsCisgICAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKKyAgICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKKyAgICAgIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCisgICAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgICAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgICAgIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCisgICAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgICAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCisgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgICAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCisgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgICAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgICAgIDB4ZjksIDB4ZmEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NyB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2FjX2Nocm9taW5hbmNlW10gPQorICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKKyAgICAgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgICAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKKyAgICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCisgICAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgICAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgICAgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAgICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKKyAgICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCisgICAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKKyAgICAgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgICAweGY5LCAweGZhIH07CisgIAorICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19kY19sdW1pbmFuY2UsIHZhbF9kY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzFdLAorCQkgYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlKTsKKyAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1sxXSwKKwkJIGJpdHNfYWNfY2hyb21pbmFuY2UsIHZhbF9hY19jaHJvbWluYW5jZSk7Cit9CisKKworLyoKKyAqIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbi4KKyAqCisgKiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjaG9vc2UgdG8gdXNlIHRoaXMgcm91dGluZSBtdXN0IGRvIHRoZWlyCisgKiBvd24gc2V0dXAgb2YgYWxsIHRoZXNlIHBhcmFtZXRlcnMuICBBbHRlcm5hdGVseSwgeW91IGNhbiBjYWxsIHRoaXMKKyAqIHRvIGVzdGFibGlzaCBkZWZhdWx0cyBhbmQgdGhlbiBhbHRlciBwYXJhbWV0ZXJzIHNlbGVjdGl2ZWx5LiAgVGhpcworICogaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIHNpbmNlLCBpZiB3ZSBhZGQgYW55IG5ldyBwYXJhbWV0ZXJzLAorICogeW91ciBjb2RlIHdpbGwgc3RpbGwgd29yayAodGhleSdsbCBiZSBzZXQgdG8gcmVhc29uYWJsZSBkZWZhdWx0cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEFsbG9jYXRlIGNvbXBfaW5mbyBhcnJheSBsYXJnZSBlbm91Z2ggZm9yIG1heGltdW0gY29tcG9uZW50IGNvdW50LgorICAgKiBBcnJheSBpcyBtYWRlIHBlcm1hbmVudCBpbiBjYXNlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNvbXByZXNzCisgICAqIG11bHRpcGxlIGltYWdlcyBhdCBzYW1lIHBhcmFtIHNldHRpbmdzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkKKyAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCSAgTUFYX0NPTVBPTkVOVFMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOworCisgIC8qIEluaXRpYWxpemUgZXZlcnl0aGluZyBub3QgZGVwZW5kZW50IG9uIHRoZSBjb2xvciBzcGFjZSAqLworCisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsKKyAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIGRlZmF1bHQgcXVhbGl0eSBvZiA3NSAqLworICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCA3NSwgVFJVRSk7CisgIC8qIFNldCB1cCB0d28gSHVmZm1hbiB0YWJsZXMgKi8KKyAgc3RkX2h1ZmZfdGFibGVzKGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGRlZmF1bHQgYXJpdGhtZXRpYyBjb2RpbmcgY29uZGl0aW9uaW5nICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOworICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKKyAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7CisgIH0KKworICAvKiBEZWZhdWx0IGlzIG5vIG11bHRpcGxlLXNjYW4gb3V0cHV0ICovCisgIGNpbmZvLT5zY2FuX2luZm8gPSBOVUxMOworICBjaW5mby0+bnVtX3NjYW5zID0gMDsKKworICAvKiBFeHBlY3Qgbm9ybWFsIHNvdXJjZSBpbWFnZSwgbm90IHJhdyBkb3duc2FtcGxlZCBkYXRhICovCisgIGNpbmZvLT5yYXdfZGF0YV9pbiA9IEZBTFNFOworCisgIC8qIFVzZSBIdWZmbWFuIGNvZGluZywgbm90IGFyaXRobWV0aWMgY29kaW5nLCBieSBkZWZhdWx0ICovCisgIGNpbmZvLT5hcml0aF9jb2RlID0gRkFMU0U7CisKKyAgLyogQnkgZGVmYXVsdCwgZG9uJ3QgZG8gZXh0cmEgcGFzc2VzIHRvIG9wdGltaXplIGVudHJvcHkgY29kaW5nICovCisgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBGQUxTRTsKKyAgLyogVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbi4KKyAgICogSWYgdGhlIHByZWNpc2lvbiBpcyBoaWdoZXIsIGZvcmNlIG9wdGltaXphdGlvbiBvbiBzbyB0aGF0IHVzYWJsZQorICAgKiB0YWJsZXMgd2lsbCBiZSBjb21wdXRlZC4gIFRoaXMgdGVzdCBjYW4gYmUgcmVtb3ZlZCBpZiBkZWZhdWx0IHRhYmxlcworICAgKiBhcmUgc3VwcGxpZWQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KKyAgICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KQorICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworCisgIC8qIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2ltcGxlciBub24tY29zaXRlZCBzYW1wbGluZyBhbGlnbm1lbnQgKi8KKyAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsKKworICAvKiBObyBpbnB1dCBzbW9vdGhpbmcgKi8KKyAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSAwOworCisgIC8qIERDVCBhbGdvcml0aG0gcHJlZmVyZW5jZSAqLworICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKKworICAvKiBObyByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworICBjaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsKKworICAvKiBGaWxsIGluIGRlZmF1bHQgSkZJRiBtYXJrZXIgcGFyYW1ldGVycy4gIE5vdGUgdGhhdCB3aGV0aGVyIHRoZSBtYXJrZXIKKyAgICogd2lsbCBhY3R1YWxseSBiZSB3cml0dGVuIGlzIGRldGVybWluZWQgYnkganBlZ19zZXRfY29sb3JzcGFjZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgZW1pdHMgSkZJRiB2ZXJzaW9uIGNvZGUgMS4wMS4KKyAgICogQW4gYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBlbWl0IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBzaG91bGQgc2V0CisgICAqIEpGSUZfbWlub3JfdmVyc2lvbiB0byAyLiAgV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcKKyAgICogdG8gMS4wMiwgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBzb21lIGRlY29kZXJzIGluIHVzZSB0aGF0IHdpbGwgY29tcGxhaW4KKyAgICogYWJvdXQgdGhhdDsgc2F5aW5nIDEuMDEgc2hvdWxkIG1pbmltaXplIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCisgICAqLworICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogRGVmYXVsdCBKRklGIHZlcnNpb24gPSAxLjAxICovCisgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOworICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsJLyogUGl4ZWwgc2l6ZSBpcyB1bmtub3duIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPlhfZGVuc2l0eSA9IDE7CQkvKiBQaXhlbCBhc3BlY3QgcmF0aW8gaXMgc3F1YXJlIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPllfZGVuc2l0eSA9IDE7CisKKyAgLyogQ2hvb3NlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBpbnB1dCBzcGFjZSwgc2V0IGRlZmF1bHRzIGFjY29yZGluZ2x5ICovCisKKyAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoY2luZm8pOworfQorCisKKy8qCisgKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGZvciBpbl9jb2xvcl9zcGFjZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfQ01ZSyk7IC8qIEJ5IGRlZmF1bHQsIG5vIHRyYW5zbGF0aW9uICovCisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1lDQ0s6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDQ0spOworICAgIGJyZWFrOworICBjYXNlIEpDU19VTktOT1dOOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19VTktOT1dOKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgfQorfQorCisKKy8qCisgKiBTZXQgdGhlIEpQRUcgY29sb3JzcGFjZSwgYW5kIGNob29zZSBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0IHZhbHVlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCit7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBpbnQgY2k7CisKKyNkZWZpbmUgU0VUX0NPTVAoaW5kZXgsaWQsaHNhbXAsdnNhbXAscXVhbnQsZGN0YmwsYWN0YmwpICBcCisgIChjb21wcHRyID0gJmNpbmZvLT5jb21wX2luZm9baW5kZXhdLCBcCisgICBjb21wcHRyLT5jb21wb25lbnRfaWQgPSAoaWQpLCBcCisgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGhzYW1wKSwgXAorICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9ICh2c2FtcCksIFwKKyAgIGNvbXBwdHItPnF1YW50X3RibF9ubyA9IChxdWFudCksIFwKKyAgIGNvbXBwdHItPmRjX3RibF9ubyA9IChkY3RibCksIFwKKyAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChhY3RibCkgKQorCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEZvciBhbGwgY29sb3JzcGFjZXMsIHdlIHVzZSBRIGFuZCBIdWZmIHRhYmxlcyAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cywKKyAgICogdGFibGVzIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisgICAqLworCisgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gY29sb3JzcGFjZTsKKworICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBGQUxTRTsgLyogTm8gbWFya2VyIGZvciBub24tSkZJRiBjb2xvcnNwYWNlcyAqLworICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gRkFMU0U7IC8qIHdyaXRlIG5vIEFkb2JlIG1hcmtlciBieSBkZWZhdWx0ICovCisKKyAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMTsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSUQgMSAqLworICAgIFNFVF9DT01QKDAsIDEsIDEsMSwgMCwgMCwwKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBSR0IgKi8KKyAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAzOworICAgIFNFVF9DT01QKDAsIDB4NTIgLyogJ1InICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMHg0NyAvKiAnRycgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgyLCAweDQyIC8qICdCJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSURzIDEsMiwzICovCisgICAgLyogV2UgZGVmYXVsdCB0byAyeDIgc3Vic2FtcGxlcyBvZiBjaHJvbWluYW5jZSAqLworICAgIFNFVF9DT01QKDAsIDEsIDIsMiwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgxLCAyLCAxLDEsIDEsIDEsMSk7CisgICAgU0VUX0NPTVAoMiwgMywgMSwxLCAxLCAxLDEpOworICAgIGJyZWFrOworICBjYXNlIEpDU19DTVlLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBDTVlLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAweDQzIC8qICdDJyAqLywgMSwxLCAwLCAwLDApOworICAgIFNFVF9DT01QKDEsIDB4NEQgLyogJ00nICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMiwgMHg1OSAvKiAnWScgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgzLCAweDRCIC8qICdLJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ0NLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBZQ0NLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOworICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKKyAgICBTRVRfQ09NUCgzLCA0LCAyLDIsIDAsIDAsMCk7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1VOS05PV046CisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEgfHwgY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgICAgTUFYX0NPTVBPTkVOVFMpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgU0VUX0NPTVAoY2ksIGNpLCAxLDEsIDAsIDAsMCk7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgIH0KK30KKworCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKworTE9DQUwoanBlZ19zY2FuX2luZm8gKikKK2ZpbGxfYV9zY2FuIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBjaSwKKwkgICAgIGludCBTcywgaW50IFNlLCBpbnQgQWgsIGludCBBbCkKKy8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgb25lIHNjYW4gZm9yIHNwZWNpZmllZCBjb21wb25lbnQgKi8KK3sKKyAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOworICBzY2FucHRyLT5TcyA9IFNzOworICBzY2FucHRyLT5TZSA9IFNlOworICBzY2FucHRyLT5BaCA9IEFoOworICBzY2FucHRyLT5BbCA9IEFsOworICBzY2FucHRyKys7CisgIHJldHVybiBzY2FucHRyOworfQorCitMT0NBTChqcGVnX3NjYW5faW5mbyAqKQorZmlsbF9zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLAorCSAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCisvKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBlYWNoIGNvbXBvbmVudCAqLworeworICBpbnQgY2k7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisgICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gY2k7CisgICAgc2NhbnB0ci0+U3MgPSBTczsKKyAgICBzY2FucHRyLT5TZSA9IFNlOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKK0xPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCitmaWxsX2RjX3NjYW5zIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBuY29tcHMsIGludCBBaCwgaW50IEFsKQorLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBpbnRlcmxlYXZlZCBEQyBzY2FuIGlmIHBvc3NpYmxlLCBlbHNlIE4gc2NhbnMgKi8KK3sKKyAgaW50IGNpOworCisgIGlmIChuY29tcHMgPD0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKKyAgICAvKiBTaW5nbGUgaW50ZXJsZWF2ZWQgREMgc2NhbiAqLworICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKQorICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXSA9IGNpOworICAgIHNjYW5wdHItPlNzID0gc2NhbnB0ci0+U2UgPSAwOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0gZWxzZSB7CisgICAgLyogTm9uaW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDAsIEFoLCBBbCk7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKKworLyoKKyAqIENyZWF0ZSBhIHJlY29tbWVuZGVkIHByb2dyZXNzaXZlLUpQRUcgc2NyaXB0LgorICogY2luZm8tPm51bV9jb21wb25lbnRzIGFuZCBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSBtdXN0IGJlIGNvcnJlY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBuY29tcHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgIGludCBuc2NhbnM7CisgIGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKworICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAvKiBGaWd1cmUgc3BhY2UgbmVlZGVkIGZvciBzY3JpcHQuICBDYWxjdWxhdGlvbiBtdXN0IG1hdGNoIGNvZGUgYmVsb3chICovCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgbnNjYW5zID0gMTA7CisgIH0gZWxzZSB7CisgICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCisgICAgaWYgKG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgbnNjYW5zID0gNiAqIG5jb21wczsJLyogMiBEQyArIDQgQUMgc2NhbnMgcGVyIGNvbXBvbmVudCAqLworICAgIGVsc2UKKyAgICAgIG5zY2FucyA9IDIgKyA0ICogbmNvbXBzOwkvKiAyIERDIHNjYW5zOyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KKyAgfQorCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBzY3JpcHQuCisgICAqIFdlIG5lZWQgdG8gcHV0IGl0IGluIHRoZSBwZXJtYW5lbnQgcG9vbCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBwZXJmb3JtcworICAgKiBtdWx0aXBsZSBjb21wcmVzc2lvbnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuICBUbyBhdm9pZCBhIG1lbW9yeQorICAgKiBsZWFrIGlmIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5IGZvciB0aGUgc2FtZSBKUEVHCisgICAqIG9iamVjdCwgd2UgdHJ5IHRvIHJlLXVzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGFjZSwgYW5kIHdlIGFsbG9jYXRlCisgICAqIGVub3VnaCBzcGFjZSB0byBoYW5kbGUgWUNiQ3IgZXZlbiBpZiBpbml0aWFsbHkgYXNrZWQgZm9yIGdyYXlzY2FsZS4KKyAgICovCisgIGlmIChjaW5mby0+c2NyaXB0X3NwYWNlID09IE5VTEwgfHwgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplIDwgbnNjYW5zKSB7CisgICAgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplID0gTUFYKG5zY2FucywgMTApOworICAgIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSAoanBlZ19zY2FuX2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7CisgIH0KKyAgc2NhbnB0ciA9IGNpbmZvLT5zY3JpcHRfc3BhY2U7CisgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOworICBjaW5mby0+bnVtX3NjYW5zID0gbnNjYW5zOworCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgLyogSW5pdGlhbCBEQyBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAxKTsKKyAgICAvKiBJbml0aWFsIEFDIHNjYW46IGdldCBzb21lIGx1bWEgZGF0YSBvdXQgaW4gYSBodXJyeSAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA1LCAwLCAyKTsKKyAgICAvKiBDaHJvbWEgZGF0YSBpcyB0b28gc21hbGwgdG8gYmUgd29ydGggZXhwZW5kaW5nIG1hbnkgc2NhbnMgb24gKi8KKyAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDAsIDEpOworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMCwgMSk7CisgICAgLyogQ29tcGxldGUgc3BlY3RyYWwgc2VsZWN0aW9uIGZvciBsdW1hIEFDICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBSZWZpbmUgbmV4dCBiaXQgb2YgbHVtYSBBQyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMiwgMSk7CisgICAgLyogRmluaXNoIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgLyogRmluaXNoIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAyLCAxLCA2MywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDEsIDEsIDYzLCAxLCAwKTsKKyAgICAvKiBMdW1hIGJvdHRvbSBiaXQgY29tZXMgbGFzdCBzaW5jZSBpdCdzIHVzdWFsbHkgbGFyZ2VzdCBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDYzLCAxLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBBbGwtcHVycG9zZSBzY3JpcHQgZm9yIG90aGVyIGNvbG9yIHNwYWNlcy4gKi8KKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmlyc3QgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA1LCAwLCAyKTsKKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gc2Vjb25kIHBhc3MgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDYzLCAyLCAxKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmluYWwgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMSwgMCk7CisgIH0KK30KKworI2VuZGlmIC8qIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL2pjcGh1ZmYuYyBiL2pwZWcvamNwaHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjkxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjcGh1ZmYuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqIGpjcGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KKyAqCisgKiBXZSBkbyBub3Qgc3VwcG9ydCBvdXRwdXQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIGxpYnJhcnkKKyAqIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZS1zY2FuIGZpbGVzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvdXRwdXQKKyAqIHN1c3BlbnNpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjaHVmZi5jICovCisKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorCisvKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVuY29kaW5nLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBNb2RlIGZsYWc6IFRSVUUgZm9yIG9wdGltaXphdGlvbiwgRkFMU0UgZm9yIGFjdHVhbCBkYXRhIG91dHB1dCAqLworICBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzOworCisgIC8qIEJpdC1sZXZlbCBjb2Rpbmcgc3RhdHVzLgorICAgKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgorICAgKi8KKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLworICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgREMgY29tcG9uZW50cyAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLworICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCisgIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KKyAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KKyAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLworCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKS4KKyAgICogU2luY2UgYW55IG9uZSBzY2FuIGNvZGVzIG9ubHkgREMgb3Igb25seSBBQywgd2Ugb25seSBuZWVkIG9uZSBzZXQKKyAgICogb2YgdGFibGVzLCBub3Qgb25lIGZvciBEQyBhbmQgb25lIGZvciBBQy4KKyAgICovCisgIGNfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbjsgYWdhaW4sIG9uZSBzZXQgaXMgZW5vdWdoICovCisgIGxvbmcgKiBjb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworfSBwaHVmZl9lbnRyb3B5X2VuY29kZXI7CisKK3R5cGVkZWYgcGh1ZmZfZW50cm9weV9lbmNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7CisKKy8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0CisgKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAorICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCisgKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KKyAqLworCisjZGVmaW5lIE1BWF9DT1JSX0JJVFMgIDEwMDAJLyogTWF4ICMgb2YgY29ycmVjdGlvbiBiaXRzIEkgY2FuIGJ1ZmZlciAqLworCisvKiBJUklHSFRfU0hJRlQgaXMgbGlrZSBSSUdIVF9TSElGVCwgYnV0IHdvcmtzIG9uIGludCByYXRoZXIgdGhhbiBJTlQzMi4KKyAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcywKKyAqIHdoaWNoIHNob3VsZCBiZSBzYWZlLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJaW50IGlzaGlmdF90ZW1wOworI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorCSgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKwkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4wKSA8PCAoMTYtKHNoZnQpKSkgOiBcCisJIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2NhbiB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCit7ICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGJvb2xlYW4gaXNfRENfYmFuZDsKKyAgaW50IGNpLCB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIGVudHJvcHktPmNpbmZvID0gY2luZm87CisgIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID0gZ2F0aGVyX3N0YXRpc3RpY3M7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KKworICAvKiBTZWxlY3QgZXhlY3V0aW9uIHJvdXRpbmVzICovCisgIGlmIChjaW5mby0+QWggPT0gMCkgeworICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX2ZpcnN0OworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19maXJzdDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19yZWZpbmU7CisgICAgZWxzZSB7CisgICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfcmVmaW5lOworICAgICAgLyogQUMgcmVmaW5lbWVudCBuZWVkcyBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciAqLworICAgICAgaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKKwllbnRyb3B5LT5iaXRfYnVmZmVyID0gKGNoYXIgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgTUFYX0NPUlJfQklUUyAqIFNJWkVPRihjaGFyKSk7CisgICAgfQorICB9CisgIGlmIChnYXRoZXJfc3RhdGlzdGljcykKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmY7CisgIGVsc2UKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19waHVmZjsKKworICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQorICAgKiBmb3IgQUMgY29lZmZpY2llbnRzLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgLyogR2V0IHRhYmxlIGluZGV4ICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLworCWNvbnRpbnVlOworICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgfQorICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgeworICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXggKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKHRibCA8IDAgfHwgdGJsID49IE5VTV9IVUZGX1RCTFMpCisgICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPSAobG9uZyAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgTUVNWkVSTyhlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGUgKi8KKyAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgaXNfRENfYmFuZCwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLworICBlbnRyb3B5LT5FT0JSVU4gPSAwOworICBlbnRyb3B5LT5CRSA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUuCisgKiBOQjogdGhlc2UgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGFjdHVhbGx5IG91dHB1dHRpbmcsCisgKiB0aGF0IGlzLCBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9PSBGQUxTRS4KKyAqLworCisvKiBFbWl0IGEgYnl0ZSAqLworI2RlZmluZSBlbWl0X2J5dGUoZW50cm9weSx2YWwpICBcCisJeyAqKGVudHJvcHkpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKKwkgIGlmICgtLShlbnRyb3B5KS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgZHVtcF9idWZmZXIoZW50cm9weSk7IH0KKworCitMT0NBTCh2b2lkKQorZHVtcF9idWZmZXIgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCisvKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZS4gKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGVudHJvcHktPmNpbmZvLT5kZXN0OworCisgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGVudHJvcHktPmNpbmZvKSkKKyAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Cit9CisKKworLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCisKKy8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCisgKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKKyAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgorICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KKyAqLworCitJTkxJTkUKK0xPQ0FMKHZvaWQpCitlbWl0X2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKKy8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IGVudHJvcHktPnB1dF9iaXRzOworCisgIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCisgIGlmIChzaXplID09IDApCisgICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQorICAgIHJldHVybjsJCQkvKiBkbyBub3RoaW5nIGlmIHdlJ3JlIG9ubHkgZ2V0dGluZyBzdGF0cyAqLworCisgIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KKyAgCisgIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCisgIAorICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCisKKyAgcHV0X2J1ZmZlciB8PSBlbnRyb3B5LT5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCisKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoZW50cm9weSwgYyk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAwKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgZW50cm9weS0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSBwdXRfYml0czsKK30KKworCitMT0NBTCh2b2lkKQorZmx1c2hfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKK3sKKyAgZW1pdF9iaXRzKGVudHJvcHksIDB4N0YsIDcpOyAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOyAgICAgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSAwOworfQorCisKKy8qCisgKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgorICovCisKK0lOTElORQorTE9DQUwodm9pZCkKK2VtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQoreworICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCisgICAgZW50cm9weS0+Y291bnRfcHRyc1t0Ymxfbm9dW3N5bWJvbF0rKzsKKyAgZWxzZSB7CisgICAgY19kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0Ymxfbm9dOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCB0YmwtPmVodWZjb1tzeW1ib2xdLCB0YmwtPmVodWZzaVtzeW1ib2xdKTsKKyAgfQorfQorCisKKy8qCisgKiBFbWl0IGJpdHMgZnJvbSBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlci4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9idWZmZXJlZF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKKyAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCisKKyAgd2hpbGUgKG5iaXRzID4gMCkgeworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAoKmJ1ZnN0YXJ0KSwgMSk7CisgICAgYnVmc3RhcnQrKzsKKyAgICBuYml0cy0tOworICB9Cit9CisKKworLyoKKyAqIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIHN5bWJvbC4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9lb2JydW4gKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCit7CisgIHJlZ2lzdGVyIGludCB0ZW1wLCBuYml0czsKKworICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkgewkvKiBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBFT0JSVU4gKi8KKyAgICB0ZW1wID0gZW50cm9weS0+RU9CUlVOOworICAgIG5iaXRzID0gMDsKKyAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorICAgICAgbmJpdHMrKzsKKyAgICAvKiBzYWZldHkgY2hlY2s6IHNob3VsZG4ndCBoYXBwZW4gZ2l2ZW4gbGltaXRlZCBjb3JyZWN0aW9uLWJpdCBidWZmZXIgKi8KKyAgICBpZiAobmJpdHMgPiAxNCkKKyAgICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOworCisgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCBuYml0cyA8PCA0KTsKKyAgICBpZiAobmJpdHMpCisgICAgICBlbWl0X2JpdHMoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7CisKKyAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOworCisgICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCisgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKKyAgICBlbnRyb3B5LT5CRSA9IDA7CisgIH0KK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9yZXN0YXJ0IChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCit7CisgIGludCBjaTsKKworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgeworICAgIGZsdXNoX2JpdHMoZW50cm9weSk7CisgICAgZW1pdF9ieXRlKGVudHJvcHksIDB4RkYpOworICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7CisgIH0KKworICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKKyAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLworICAgIGVudHJvcHktPkVPQlJVTiA9IDA7CisgICAgZW50cm9weS0+QkUgPSAwOworICB9Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7CisgIHJlZ2lzdGVyIGludCBuYml0czsKKyAgaW50IGJsa24sIGNpOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElTSElGVF9URU1QUworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCisgICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KKyAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgICAqLworICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKKworICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCisgICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+bGFzdF9kY192YWxbY2ldOworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOworCisgICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KKyAgICB0ZW1wMiA9IHRlbXA7CisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLworICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgICB0ZW1wMi0tOworICAgIH0KKyAgICAKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgbmJpdHMgPSAwOworICAgIHdoaWxlICh0ZW1wKSB7CisgICAgICBuYml0cysrOworICAgICAgdGVtcCA+Pj0gMTsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCisgICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICAgKi8KKyAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgICAgCisgICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOworICAgIAorICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLworICAgICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKKyAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfQUNfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgSkJMT0NLUk9XIGJsb2NrOworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KKyAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKworICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4yLCBmaWcuIEcuMyAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgIAorICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIGlmICgodGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKKyAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQorICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWU7IHNvIHRoZSBjb2RlIGlzCisgICAgICogaW50ZXJ3b3ZlbiB3aXRoIGZpbmRpbmcgdGhlIGFicyB2YWx1ZSAodGVtcCkgYW5kIG91dHB1dCBiaXRzICh0ZW1wMikuCisgICAgICovCisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBjb2VmLCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhjb2VmKSAqLworICAgICAgdGVtcDIgPSB+dGVtcDsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgfQorICAgIC8qIFdhdGNoIG91dCBmb3IgY2FzZSB0aGF0IG5vbnplcm8gY29lZiBpcyB6ZXJvIGFmdGVyIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGlmICh0ZW1wID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOICovCisgICAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApCisgICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgd2hpbGUgKHIgPiAxNSkgeworICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKKyAgICAgIHIgLT0gMTY7CisgICAgfQorCisgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgIG5iaXRzID0gMTsJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLworICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisgICAgICBuYml0cysrOworICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyBuYml0cyk7CisKKyAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KKyAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKKworICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLworICB9CisKKyAgaWYgKHIgPiAwKSB7CQkJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CS8qIGZvcmNlIGl0IG91dCB0byBhdm9pZCBvdmVyZmxvdyAqLworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKKyAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfRENfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICBpbnQgYmxrbjsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICBKQkxPQ0tST1cgYmxvY2s7CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworCisgICAgLyogV2Ugc2ltcGx5IGVtaXQgdGhlIEFsJ3RoIGJpdCBvZiB0aGUgREMgY29lZmZpY2llbnQgdmFsdWUuICovCisgICAgdGVtcCA9ICgqYmxvY2spWzBdOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgRU9COworICBjaGFyICpCUl9idWZmZXI7CisgIHVuc2lnbmVkIGludCBCUjsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAgaW50IGFic3ZhbHVlc1tEQ1RTSVpFMl07CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLworICBibG9jayA9IE1DVV9kYXRhWzBdOworCisgIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKKyAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCisgICAqLworICBFT0IgPSAwOworICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOworICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcworICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5CisgICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAodGVtcCA8IDApCisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KKyAgICBpZiAodGVtcCA9PSAxKQorICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLworICB9CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KKyAgCisgIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCisgIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCisgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCisKKyAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCisgICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgeworICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgICAgLyogRW1pdCBaUkwgKi8KKyAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7CisgICAgICByIC09IDE2OworICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KKyAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCisgICAgICBCUiA9IDA7CisgICAgfQorCisgICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgorICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKKyAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCisgICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCisgICAgICovCisgICAgaWYgKHRlbXAgPiAxKSB7CisgICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKKworICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCisgICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcCwgMSk7CisKKyAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLworICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLworICAgIEJSID0gMDsKKyAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KKyAgfQorCisgIGlmIChyID4gMCB8fCBCUiA+IDApIHsJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGVudHJvcHktPkJFICs9IEJSOwkJLyogY29uY2F0IG15IGNvcnJlY3Rpb24gYml0cyB0byBvbGRlciBvbmVzICovCisgICAgLyogV2UgZm9yY2Ugb3V0IHRoZSBFT0IgaWYgd2UgcmlzayBlaXRoZXI6CisgICAgICogMS4gb3ZlcmZsb3cgb2YgdGhlIEVPQiBjb3VudGVyOworICAgICAqIDIuIG92ZXJmbG93IG9mIHRoZSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgZHVyaW5nIHRoZSBuZXh0IE1DVS4KKyAgICAgKi8KKyAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRiB8fCBlbnRyb3B5LT5CRSA+IChNQVhfQ09SUl9CSVRTLURDVFNJWkUyKzEpKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBwcm9ncmVzc2l2ZSBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgZmx1c2hfYml0cyhlbnRyb3B5KTsKKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQ7CisgIGludCBjaSwgdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSkhVRkZfVEJMICoqaHRibHB0cjsKKyAgYm9vbGVhbiBkaWRbTlVNX0hVRkZfVEJMU107CisKKyAgLyogRmx1c2ggb3V0IGJ1ZmZlcmVkIGRhdGEgKGFsbCB3ZSBjYXJlIGFib3V0IGlzIGNvdW50aW5nIHRoZSBFT0Igc3ltYm9sKSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoaXNfRENfYmFuZCkgeworICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJY29udGludWU7CisgICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICB9CisgICAgaWYgKCEgZGlkW3RibF0pIHsKKyAgICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgZWxzZQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0pOworICAgICAgZGlkW3RibF0gPSBUUlVFOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfcGh1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7CisgIH0KKyAgZW50cm9weS0+Yml0X2J1ZmZlciA9IE5VTEw7CS8qIG5lZWRlZCBvbmx5IGluIEFDIHJlZmluZW1lbnQgc2NhbiAqLworfQorCisjZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamNwcmVwY3QuYyBiL2pwZWcvamNwcmVwY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTkzMzMzCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qY3ByZXBjdC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogamNwcmVwY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgY29sb3IgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nLAorICogYW5kIGVkZ2UgZXhwYW5zaW9uIHN0ZXBzLgorICoKKyAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyaW5nIGlucHV0IHJvd3MKKyAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBkb3duc2FtcGxlci4gIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGhlYWQgb2YKKyAqIGpjc2FtcGxlLmMgZm9yIHRoZSBkb3duc2FtcGxlcidzIG5lZWRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBBdCBwcmVzZW50LCBqY3NhbXBsZS5jIGNhbiByZXF1ZXN0IGNvbnRleHQgcm93cyBvbmx5IGZvciBzbW9vdGhpbmcuCisgKiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhbHNvIG5lZWQgY29udGV4dCByb3dzIGZvciBDQ0lSNjAxIHNhbXBsaW5nCisgKiBvciBvdGhlciBtb3JlLWNvbXBsZXggZG93bnNhbXBsaW5nIHByb2NlZHVyZXMuICBUaGUgY29kZSB0byBzdXBwb3J0CisgKiBjb250ZXh0IHJvd3Mgc2hvdWxkIGJlIGNvbXBpbGVkIG9ubHkgaWYgbmVlZGVkLgorICovCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorI2RlZmluZSBDT05URVhUX1JPV1NfU1VQUE9SVEVECisjZW5kaWYKKworCisvKgorICogRm9yIHRoZSBzaW1wbGUgKG5vLWNvbnRleHQtcm93KSBjYXNlLCB3ZSBqdXN0IG5lZWQgdG8gYnVmZmVyIG9uZQorICogcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGZvciB0aGUgZG93bnNhbXBsaW5nIHN0ZXAuICBBdCB0aGUgYm90dG9tIG9mCisgKiB0aGUgaW1hZ2UsIHdlIHBhZCB0byBhIGZ1bGwgcm93IGdyb3VwIGJ5IHJlcGxpY2F0aW5nIHRoZSBsYXN0IHBpeGVsIHJvdy4KKyAqIFRoZSBkb3duc2FtcGxlcidzIGxhc3Qgb3V0cHV0IHJvdyBpcyB0aGVuIHJlcGxpY2F0ZWQgaWYgbmVlZGVkIHRvIHBhZAorICogb3V0IHRvIGEgZnVsbCBpTUNVIHJvdy4KKyAqCisgKiBXaGVuIHByb3ZpZGluZyBjb250ZXh0IHJvd3MsIHdlIG11c3QgYnVmZmVyIHRocmVlIHJvdyBncm91cHMnIHdvcnRoIG9mCisgKiBwaXhlbHMuICBUaHJlZSByb3cgZ3JvdXBzIGFyZSBwaHlzaWNhbGx5IGFsbG9jYXRlZCwgYnV0IHRoZSByb3cgcG9pbnRlcgorICogYXJyYXlzIGFyZSBtYWRlIGZpdmUgcm93IGdyb3VwcyBoaWdoLCB3aXRoIHRoZSBleHRyYSBwb2ludGVycyBhYm92ZSBhbmQKKyAqIGJlbG93ICJ3cmFwcGluZyBhcm91bmQiIHRvIHBvaW50IHRvIHRoZSBsYXN0IGFuZCBmaXJzdCByZWFsIHJvdyBncm91cHMuCisgKiBUaGlzIGFsbG93cyB0aGUgZG93bnNhbXBsZXIgdG8gYWNjZXNzIHRoZSBwcm9wZXIgY29udGV4dCByb3dzLgorICogQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgY3JlYXRlIGR1bW15IGNvbnRleHQgcm93cyBieQorICogY29weWluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4gIFRoaXMgY29weWluZyBjb3VsZCBiZSBhdm9pZGVkCisgKiBieSBwb2ludGVyIGhhY2tpbmcgYXMgaXMgZG9uZSBpbiBqZG1haW5jdC5jLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZQorICogdHJvdWJsZSBvbiB0aGUgY29tcHJlc3Npb24gc2lkZS4KKyAqLworCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGhvbGRzIGNvbG9yLWNvbnZlcnRlZCBkYXRhCisgICAqIHVudGlsIHdlIGhhdmUgZW5vdWdoIHRvIGRvIGEgZG93bnNhbXBsZSBzdGVwLgorICAgKi8KKyAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOworCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIHNvdXJjZSBpbWFnZSAqLworICBpbnQgbmV4dF9idWZfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gc3RvcmUgaW4gY29sb3JfYnVmICovCisKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECS8qIG9ubHkgbmVlZGVkIGZvciBjb250ZXh0IGNhc2UgKi8KKyAgaW50IHRoaXNfcm93X2dyb3VwOwkJLyogc3RhcnRpbmcgcm93IGluZGV4IG9mIGdyb3VwIHRvIHByb2Nlc3MgKi8KKyAgaW50IG5leHRfYnVmX3N0b3A7CQkvKiBkb3duc2FtcGxlIHdoZW4gd2UgcmVhY2ggdGhpcyBpbmRleCAqLworI2VuZGlmCit9IG15X3ByZXBfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wcmVwX2NvbnRyb2xsZXIgKiBteV9wcmVwX3B0cjsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3ByZXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7CisKKyAgaWYgKHBhc3NfbW9kZSAhPSBKQlVGX1BBU1NfVEhSVSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICBwcmVwLT5yb3dzX3RvX2dvID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgIC8qIFByZXNldCBhZGRpdGlvbmFsIHN0YXRlIHZhcmlhYmxlcyBmb3IgY29udGV4dCBtb2RlLgorICAgKiBUaGVzZSBhcmVuJ3QgdXNlZCBpbiBub24tY29udGV4dCBtb2RlLCBzbyB3ZSBuZWVkbid0IHRlc3Qgd2hpY2ggbW9kZS4KKyAgICovCisgIHByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgLyogU2V0IG5leHRfYnVmX3N0b3AgdG8gc3RvcCBhZnRlciB0d28gcm93IGdyb3VwcyBoYXZlIGJlZW4gcmVhZCBpbi4gKi8KKyAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IDIgKiBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisjZW5kaWYKK30KKworCisvKgorICogRXhwYW5kIGFuIGltYWdlIHZlcnRpY2FsbHkgZnJvbSBoZWlnaHQgaW5wdXRfcm93cyB0byBoZWlnaHQgb3V0cHV0X3Jvd3MsCisgKiBieSBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHJvdy4KKyAqLworCitMT0NBTCh2b2lkKQorZXhwYW5kX2JvdHRvbV9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIEpESU1FTlNJT04gbnVtX2NvbHMsCisJCSAgICBpbnQgaW5wdXRfcm93cywgaW50IG91dHB1dF9yb3dzKQoreworICByZWdpc3RlciBpbnQgcm93OworCisgIGZvciAocm93ID0gaW5wdXRfcm93czsgcm93IDwgb3V0cHV0X3Jvd3M7IHJvdysrKSB7CisgICAgamNvcHlfc2FtcGxlX3Jvd3MoaW1hZ2VfZGF0YSwgaW5wdXRfcm93cy0xLCBpbWFnZV9kYXRhLCByb3csCisJCSAgICAgIDEsIG51bV9jb2xzKTsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2ltcGxlIG5vLWNvbnRleHQgY2FzZS4KKyAqCisgKiBQcmVwcm9jZXNzb3Igb3V0cHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAorICogaXMgZGVmaW5lZCB0byBiZSB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LgorICogRG93bnNhbXBsaW5nIHdpbGwgcHJvZHVjZSB0aGlzIG11Y2ggZGF0YSBmcm9tIGVhY2ggbWF4X3Zfc2FtcF9mYWN0b3IKKyAqIGlucHV0IHJvd3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBKRElNRU5TSU9OIGlucm93czsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgd2hpbGUgKCppbl9yb3dfY3RyIDwgaW5fcm93c19hdmFpbCAmJgorCSAqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOworICAgIG51bXJvd3MgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7CisgICAgbnVtcm93cyA9IChpbnQpIE1JTigoSkRJTUVOU0lPTikgbnVtcm93cywgaW5yb3dzKTsKKyAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkgICAgICAgcHJlcC0+Y29sb3JfYnVmLAorCQkJCSAgICAgICAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAorCQkJCSAgICAgICBudW1yb3dzKTsKKyAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOworICAgIHByZXAtPm5leHRfYnVmX3JvdyArPSBudW1yb3dzOworICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICBpZiAocHJlcC0+cm93c190b19nbyA9PSAwICYmCisJcHJlcC0+bmV4dF9idWZfcm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKwlleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgcHJlcC0+bmV4dF9idWZfcm93LCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgICAgfQorICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBlbXB0eSBpdC4gKi8KKyAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAorCQkJCQlwcmVwLT5jb2xvcl9idWYsIChKRElNRU5TSU9OKSAwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7CisgICAgfQorICAgIC8qIElmIGF0IGJvdHRvbSBvZiBpbWFnZSwgcGFkIHRoZSBvdXRwdXQgdG8gYSBmdWxsIGlNQ1UgaGVpZ2h0LgorICAgICAqIE5vdGUgd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIGEgb25lLWlNQ1UtaGVpZ2h0IG91dHB1dCBidWZmZXIhCisgICAgICovCisgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgorCSpvdXRfcm93X2dyb3VwX2N0ciA8IG91dF9yb3dfZ3JvdXBzX2F2YWlsKSB7CisgICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSAgIGNpKyssIGNvbXBwdHIrKykgeworCWV4cGFuZF9ib3R0b21fZWRnZShvdXRwdXRfYnVmW2NpXSwKKwkJCSAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJCQkgICAoaW50KSAoKm91dF9yb3dfZ3JvdXBfY3RyICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJCQkgICAoaW50KSAob3V0X3Jvd19ncm91cHNfYXZhaWwgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSk7CisgICAgICB9CisgICAgICAqb3V0X3Jvd19ncm91cF9jdHIgPSBvdXRfcm93X2dyb3Vwc19hdmFpbDsKKyAgICAgIGJyZWFrOwkJCS8qIGNhbiBleGl0IG91dGVyIGxvb3Agd2l0aG91dCB0ZXN0ICovCisgICAgfQorICB9Cit9CisKKworI2lmZGVmIENPTlRFWFRfUk9XU19TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBjb250ZXh0IGNhc2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19jb250ZXh0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBpbnQgYnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIDM7CisgIEpESU1FTlNJT04gaW5yb3dzOworCisgIHdoaWxlICgqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIGlmICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwpIHsKKyAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgICBpbnJvd3MgPSBpbl9yb3dzX2F2YWlsIC0gKmluX3Jvd19jdHI7CisgICAgICBudW1yb3dzID0gcHJlcC0+bmV4dF9idWZfc3RvcCAtIHByZXAtPm5leHRfYnVmX3JvdzsKKyAgICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkJIHByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJIChKRElNRU5TSU9OKSBwcmVwLT5uZXh0X2J1Zl9yb3csCisJCQkJCSBudW1yb3dzKTsKKyAgICAgIC8qIFBhZCBhdCB0b3Agb2YgaW1hZ2UsIGlmIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gY2luZm8tPmltYWdlX2hlaWdodCkgeworCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworCSAgaW50IHJvdzsKKwkgIGZvciAocm93ID0gMTsgcm93IDw9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcjsgcm93KyspIHsKKwkgICAgamNvcHlfc2FtcGxlX3Jvd3MocHJlcC0+Y29sb3JfYnVmW2NpXSwgMCwKKwkJCSAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0sIC1yb3csCisJCQkgICAgICAxLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgICppbl9yb3dfY3RyICs9IG51bXJvd3M7CisgICAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKKyAgICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICB9IGVsc2UgeworICAgICAgLyogUmV0dXJuIGZvciBtb3JlIGRhdGEsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCisgICAgICBpZiAocHJlcC0+cm93c190b19nbyAhPSAwKQorCWJyZWFrOworICAgICAgLyogV2hlbiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPCBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisJZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisJICBleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgICBwcmVwLT5uZXh0X2J1Zl9yb3csIHByZXAtPm5leHRfYnVmX3N0b3ApOworCX0KKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSBwcmVwLT5uZXh0X2J1Zl9zdG9wOworICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gZW5vdWdoIGRhdGEsIGRvd25zYW1wbGUgYSByb3cgZ3JvdXAuICovCisgICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisgICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5kb3duc2FtcGxlKSAoY2luZm8sCisJCQkJCXByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJKEpESU1FTlNJT04pIHByZXAtPnRoaXNfcm93X2dyb3VwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgKCpvdXRfcm93X2dyb3VwX2N0cikrKzsKKyAgICAgIC8qIEFkdmFuY2UgcG9pbnRlcnMgd2l0aCB3cmFwYXJvdW5kIGFzIG5lY2Vzc2FyeS4gKi8KKyAgICAgIHByZXAtPnRoaXNfcm93X2dyb3VwICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICAgIGlmIChwcmVwLT50aGlzX3Jvd19ncm91cCA+PSBidWZfaGVpZ2h0KQorCXByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPj0gYnVmX2hlaWdodCkKKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSAwOworICAgICAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IHByZXAtPm5leHRfYnVmX3JvdyArIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ3JlYXRlIHRoZSB3cmFwcGVkLWFyb3VuZCBkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIG5lZWRlZCBmb3IgY29udGV4dCBtb2RlLgorICovCisKK0xPQ0FMKHZvaWQpCitjcmVhdGVfY29udGV4dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IHJncm91cF9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisgIGludCBjaSwgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpTQU1QQVJSQVkgdHJ1ZV9idWZmZXIsIGZha2VfYnVmZmVyOworCisgIC8qIEdyYWIgZW5vdWdoIHNwYWNlIGZvciBmYWtlIHJvdyBwb2ludGVycyBmb3IgYWxsIHRoZSBjb21wb25lbnRzOworICAgKiB3ZSBuZWVkIGZpdmUgcm93IGdyb3Vwcycgd29ydGggb2YgcG9pbnRlcnMgZm9yIGVhY2ggY29tcG9uZW50LgorICAgKi8KKyAgZmFrZV9idWZmZXIgPSAoSlNBTVBBUlJBWSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShjaW5mby0+bnVtX2NvbXBvbmVudHMgKiA1ICogcmdyb3VwX2hlaWdodCkgKgorCQkJCVNJWkVPRihKU0FNUFJPVykpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgc3BhY2UgKDMgcm93IGdyb3VwcykgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqIFdlIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBhbGxvdyB0aGUgZG93bnNhbXBsZXIgdG8gZWRnZS1leHBhbmQKKyAgICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCisgICAgICovCisgICAgdHJ1ZV9idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgorCQkgICAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisgICAgICAgKEpESU1FTlNJT04pICgzICogcmdyb3VwX2hlaWdodCkpOworICAgIC8qIENvcHkgdHJ1ZSBidWZmZXIgcm93IHBvaW50ZXJzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgZmFrZSByb3cgYXJyYXkgKi8KKyAgICBNRU1DT1BZKGZha2VfYnVmZmVyICsgcmdyb3VwX2hlaWdodCwgdHJ1ZV9idWZmZXIsCisJICAgIDMgKiByZ3JvdXBfaGVpZ2h0ICogU0laRU9GKEpTQU1QUk9XKSk7CisgICAgLyogRmlsbCBpbiB0aGUgYWJvdmUgYW5kIGJlbG93IHdyYXBhcm91bmQgcG9pbnRlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwX2hlaWdodDsgaSsrKSB7CisgICAgICBmYWtlX2J1ZmZlcltpXSA9IHRydWVfYnVmZmVyWzIgKiByZ3JvdXBfaGVpZ2h0ICsgaV07CisgICAgICBmYWtlX2J1ZmZlcls0ICogcmdyb3VwX2hlaWdodCArIGldID0gdHJ1ZV9idWZmZXJbaV07CisgICAgfQorICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSBmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQ7CisgICAgZmFrZV9idWZmZXIgKz0gNSAqIHJncm91cF9oZWlnaHQ7IC8qIHBvaW50IHRvIHNwYWNlIGZvciBuZXh0IGNvbXBvbmVudCAqLworICB9Cit9CisKKyNlbmRpZiAvKiBDT05URVhUX1JPV1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19wcmVwX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X3ByZXBfcHRyIHByZXA7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgcHJlcCA9IChteV9wcmVwX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9wcmVwX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPnByZXAgPSAoc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKikgcHJlcDsKKyAgcHJlcC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3ByZXA7CisKKyAgLyogQWxsb2NhdGUgdGhlIGNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLgorICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCisgICAqIGhvcml6b250YWxseSB3aXRoaW4gdGhlIGJ1ZmZlciwgaWYgaXQgc28gY2hvb3Nlcy4KKyAgICovCisgIGlmIChjaW5mby0+ZG93bnNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKKyAgICAvKiBTZXQgdXAgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgKi8KKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgICAgcHJlcC0+cHViLnByZV9wcm9jZXNzX2RhdGEgPSBwcmVfcHJvY2Vzc19jb250ZXh0OworICAgIGNyZWF0ZV9jb250ZXh0X2J1ZmZlcihjaW5mbyk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIE5vIGNvbnRleHQsIGp1c3QgbWFrZSBpdCB0YWxsIGVub3VnaCBmb3Igb25lIHJvdyBncm91cCAqLworICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfZGF0YTsKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSAoSkRJTUVOU0lPTikgKCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSAqCisJCQljaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvanBlZy9qY3NhbXBsZS5jIGIvanBlZy9qY3NhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMmVjODcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjc2FtcGxlLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBqY3NhbXBsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZG93bnNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIERvd25zYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBvZiBlYWNoIGNvbXBvbmVudCwKKyAqIGZyb20gd2hpY2ggdGhlIGRvd25zYW1wbGVyIHByb2R1Y2VzIHZfc2FtcF9mYWN0b3Igc2FtcGxlIHJvd3MuCisgKiBBIHNpbmdsZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIGluIGVhY2ggY2FsbCB0byB0aGUgZG93bnNhbXBsZXIgbW9kdWxlLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWRnZS1leHBhbnNpb24gb2YgaXRzIG91dHB1dCBkYXRhCisgKiB0byBmaWxsIGFuIGludGVncmFsIG51bWJlciBvZiBEQ1QgYmxvY2tzIGhvcml6b250YWxseS4gIFRoZSBzb3VyY2UgYnVmZmVyCisgKiBtYXkgYmUgbW9kaWZpZWQgaWYgaXQgaXMgaGVscGZ1bCBmb3IgdGhpcyBwdXJwb3NlICh0aGUgc291cmNlIGJ1ZmZlciBpcworICogYWxsb2NhdGVkIHdpZGUgZW5vdWdoIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IHdpZHRoKS4KKyAqIFRoZSBjYWxsZXIgKHRoZSBwcmVwIGNvbnRyb2xsZXIpIGlzIHJlc3BvbnNpYmxlIGZvciB2ZXJ0aWNhbCBwYWRkaW5nLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBtYXkgcmVxdWVzdCAiY29udGV4dCByb3dzIiBieSBzZXR0aW5nIG5lZWRfY29udGV4dF9yb3dzCisgKiBkdXJpbmcgc3RhcnR1cC4gIEluIHRoaXMgY2FzZSwgdGhlIGlucHV0IGFycmF5cyB3aWxsIGNvbnRhaW4gYXQgbGVhc3QKKyAqIG9uZSByb3cgZ3JvdXAncyB3b3J0aCBvZiBwaXhlbHMgYWJvdmUgYW5kIGJlbG93IHRoZSBwYXNzZWQtaW4gZGF0YTsKKyAqIHRoZSBjYWxsZXIgd2lsbCBjcmVhdGUgZHVtbXkgcm93cyBhdCBpbWFnZSB0b3AgYW5kIGJvdHRvbSBieSByZXBsaWNhdGluZworICogdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuCisgKgorICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBmb3IgaW1hZ2UgcmVzYW1wbGluZyBpcworICogICBEaWdpdGFsIEltYWdlIFdhcnBpbmcsIEdlb3JnZSBXb2xiZXJnLCAxOTkwLgorICogICBQdWIuIGJ5IElFRUUgQ29tcHV0ZXIgU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQS4gSVNCTiAwLTgxODYtODk0NC03LgorICoKKyAqIFRoZSBkb3duc2FtcGxpbmcgYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBhIHNpbXBsZSBhdmVyYWdlIG9mIHRoZSBzb3VyY2UKKyAqIHBpeGVscyBjb3ZlcmVkIGJ5IHRoZSBvdXRwdXQgcGl4ZWwuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlCisgKiByZWZlcnMgdG8gdGhpcyBhcyBhICJib3ggZmlsdGVyIi4gIEluIGdlbmVyYWwgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIGJveAorICogZmlsdGVyIGFyZSBub3QgdmVyeSBnb29kLCBidXQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlcyB3ZSBub3JtYWxseSB1c2UgKDE6MQorICogYW5kIDI6MSByYXRpb3MpIHRoZSBib3ggaXMgZXF1aXZhbGVudCB0byBhICJ0cmlhbmdsZSBmaWx0ZXIiIHdoaWNoIGlzIG5vdAorICogbmVhcmx5IHNvIGJhZC4gIElmIHlvdSBpbnRlbmQgdG8gdXNlIG90aGVyIHNhbXBsaW5nIHJhdGlvcywgeW91J2QgYmUgd2VsbAorICogYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqCisgKiBBIHNpbXBsZSBpbnB1dC1zbW9vdGhpbmcgY2FwYWJpbGl0eSBpcyBwcm92aWRlZC4gIFRoaXMgaXMgbWFpbmx5IGludGVuZGVkCisgKiBmb3IgY2xlYW5pbmcgdXAgY29sb3ItZGl0aGVyZWQgR0lGIGlucHV0IGZpbGVzIChpZiB5b3UgZmluZCBpdCBpbmFkZXF1YXRlLAorICogd2Ugc3VnZ2VzdCB1c2luZyBhbiBleHRlcm5hbCBmaWx0ZXJpbmcgcHJvZ3JhbSBzdWNoIGFzIHBubWNvbnZvbCkuICBXaGVuCisgKiBlbmFibGVkLCBlYWNoIGlucHV0IHBpeGVsIFAgaXMgcmVwbGFjZWQgYnkgYSB3ZWlnaHRlZCBzdW0gb2YgaXRzZWxmIGFuZCBpdHMKKyAqIGVpZ2h0IG5laWdoYm9ycy4gIFAncyB3ZWlnaHQgaXMgMS04KlNGIGFuZCBlYWNoIG5laWdoYm9yJ3Mgd2VpZ2h0IGlzIFNGLAorICogd2hlcmUgU0YgPSAoc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQpLgorICogQ3VycmVudGx5LCBzbW9vdGhpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIDJoMnYgc2FtcGxpbmcgZmFjdG9ycy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvd25zYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZTFfcHRyLAorCQkoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7CisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIG1ldGhvZCBwb2ludGVycywgb25lIHBlciBjb21wb25lbnQgKi8KKyAgZG93bnNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworfSBteV9kb3duc2FtcGxlcjsKKwordHlwZWRlZiBteV9kb3duc2FtcGxlciAqIG15X2Rvd25zYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIGRvd25zYW1wbGluZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBmb3Igbm93ICovCit9CisKKworLyoKKyAqIEV4cGFuZCBhIGNvbXBvbmVudCBob3Jpem9udGFsbHkgZnJvbSB3aWR0aCBpbnB1dF9jb2xzIHRvIHdpZHRoIG91dHB1dF9jb2xzLAorICogYnkgZHVwbGljYXRpbmcgdGhlIHJpZ2h0bW9zdCBzYW1wbGVzLgorICovCisKK0xPQ0FMKHZvaWQpCitleHBhbmRfcmlnaHRfZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBpbnQgbnVtX3Jvd3MsCisJCSAgIEpESU1FTlNJT04gaW5wdXRfY29scywgSkRJTUVOU0lPTiBvdXRwdXRfY29scykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUExFIHBpeHZhbDsKKyAgcmVnaXN0ZXIgaW50IGNvdW50OworICBpbnQgcm93OworICBpbnQgbnVtY29scyA9IChpbnQpIChvdXRwdXRfY29scyAtIGlucHV0X2NvbHMpOworCisgIGlmIChudW1jb2xzID4gMCkgeworICAgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgICBwdHIgPSBpbWFnZV9kYXRhW3Jvd10gKyBpbnB1dF9jb2xzOworICAgICAgcGl4dmFsID0gcHRyWy0xXTsJCS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoY291bnQgPSBudW1jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCisJKnB0cisrID0gcGl4dmFsOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEbyBkb3duc2FtcGxpbmcgZm9yIGEgd2hvbGUgcm93IGdyb3VwIChhbGwgY29tcG9uZW50cykuCisgKgorICogSW4gdGhpcyB2ZXJzaW9uIHdlIHNpbXBseSBkb3duc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKKwkJSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpCit7CisgIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpIGNpbmZvLT5kb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKU0FNUEFSUkFZIGluX3B0ciwgb3V0X3B0cjsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGluX3B0ciA9IGlucHV0X2J1ZltjaV0gKyBpbl9yb3dfaW5kZXg7CisgICAgb3V0X3B0ciA9IG91dHB1dF9idWZbY2ldICsgKG91dF9yb3dfZ3JvdXBfaW5kZXggKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAoKmRvd25zYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsIGluX3B0ciwgb3V0X3B0cik7CisgIH0KK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBhcmJpdHJhcnkgaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zLCB3aXRob3V0IHNtb290aGluZy4KKyAqIE5vdGUgdGhhdCB0aGlzIHZlcnNpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGN1c3RvbWFyeSBzYW1wbGluZyByYXRpb3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbnRfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93LCBoX2V4cGFuZCwgdl9leHBhbmQsIG51bXBpeCwgbnVtcGl4MiwgaCwgdjsKKyAgSkRJTUVOU0lPTiBvdXRjb2wsIG91dGNvbF9oOwkvKiBvdXRjb2xfaCA9PSBvdXRjb2wqaF9leHBhbmQgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIElOVDMyIG91dHZhbHVlOworCisgIGhfZXhwYW5kID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgdl9leHBhbmQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICBudW1waXggPSBoX2V4cGFuZCAqIHZfZXhwYW5kOworICBudW1waXgyID0gbnVtcGl4LzI7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogaF9leHBhbmQpOworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgZm9yIChvdXRjb2wgPSAwLCBvdXRjb2xfaCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOworCSBvdXRjb2wrKywgb3V0Y29sX2ggKz0gaF9leHBhbmQpIHsKKyAgICAgIG91dHZhbHVlID0gMDsKKyAgICAgIGZvciAodiA9IDA7IHYgPCB2X2V4cGFuZDsgdisrKSB7CisJaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93K3ZdICsgb3V0Y29sX2g7CisJZm9yIChoID0gMDsgaCA8IGhfZXhwYW5kOyBoKyspIHsKKwkgIG91dHZhbHVlICs9IChJTlQzMikgR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisJfQorICAgICAgfQorICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgob3V0dmFsdWUgKyBudW1waXgyKSAvIG51bXBpeCk7CisgICAgfQorICAgIGlucm93ICs9IHZfZXhwYW5kOworICB9Cit9CisKKworLyoKKyAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBmdWxsLXNpemUgY29tcG9uZW50LAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQoreworICAvKiBDb3B5IHRoZSBkYXRhICovCisgIGpjb3B5X3NhbXBsZV9yb3dzKGlucHV0X2RhdGEsIDAsIG91dHB1dF9kYXRhLCAwLAorCQkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworICAvKiBFZGdlLWV4cGFuZCAqLworICBleHBhbmRfcmlnaHRfZWRnZShvdXRwdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFKTsKK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwsCisgKiB3aXRob3V0IHNtb290aGluZy4KKyAqCisgKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KKyAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KKyAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCisgKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKKyAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYmlhcyA9IDA7CQkJLyogYmlhcyA9IDAsMSwwLDEsLi4uIGZvciBzdWNjZXNzaXZlIHNhbXBsZXMgKi8KKyAgICBmb3IgKG91dGNvbCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOyBvdXRjb2wrKykgeworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoR0VUSlNBTVBMRSgqaW5wdHIpICsgR0VUSlNBTVBMRShpbnB0clsxXSkKKwkJCSAgICAgICsgYmlhcykgPj4gMSk7CisgICAgICBiaWFzIF49IDE7CQkvKiAwPT4xLCAxPT4wICovCisgICAgICBpbnB0ciArPSAyOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IGlucm93LCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgaW5yb3cgPSAwOworICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKKyAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOworICAgIGJpYXMgPSAxOwkJCS8qIGJpYXMgPSAxLDIsMSwyLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCisgICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQkJICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKQorCQkJICAgICAgKyBiaWFzKSA+PiAyKTsKKyAgICAgIGJpYXMgXj0gMzsJCS8qIDE9PjIsIDI9PjEgKi8KKyAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsKKyAgICB9CisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aCBzbW9vdGhpbmcuICBPbmUgcm93IG9mIGNvbnRleHQgaXMgcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX3Ntb290aF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93OworICBKRElNRU5TSU9OIGNvbGN0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBhYm92ZV9wdHIsIGJlbG93X3B0ciwgb3V0cHRyOworICBJTlQzMiBtZW1iZXJzdW0sIG5laWdoc3VtLCBtZW1iZXJzY2FsZSwgbmVpZ2hzY2FsZTsKKworICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCisgICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCisgICAqIGVmZmljaWVudC4KKyAgICovCisgIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEgLSAxLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKyAyLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOworCisgIC8qIFdlIGRvbid0IGJvdGhlciB0byBmb3JtIHRoZSBpbmRpdmlkdWFsICJzbW9vdGhlZCIgaW5wdXQgcGl4ZWwgdmFsdWVzOworICAgKiB3ZSBjYW4gZGlyZWN0bHkgY29tcHV0ZSB0aGUgb3V0cHV0IHdoaWNoIGlzIHRoZSBhdmVyYWdlIG9mIHRoZSBmb3VyCisgICAqIHNtb290aGVkIHZhbHVlcy4gIEVhY2ggb2YgdGhlIGZvdXIgbWVtYmVyIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uCisgICAqICgxLTgqU0YpIHRvIGl0cyBvd24gc21vb3RoZWQgaW1hZ2UgYW5kIGEgZnJhY3Rpb24gU0YgdG8gZWFjaCBvZiB0aGUgdGhyZWUKKyAgICogb3RoZXIgc21vb3RoZWQgcGl4ZWxzLCB0aGVyZWZvcmUgYSB0b3RhbCBmcmFjdGlvbiAoMS01KlNGKS80IHRvIHRoZSBmaW5hbAorICAgKiBvdXRwdXQuICBUaGUgZm91ciBjb3JuZXItYWRqYWNlbnQgbmVpZ2hib3IgcGl4ZWxzIGNvbnRyaWJ1dGUgYSBmcmFjdGlvbgorICAgKiBTRiB0byBqdXN0IG9uZSBzbW9vdGhlZCBwaXhlbCwgb3IgU0YvNCB0byB0aGUgZmluYWwgb3V0cHV0OyB3aGlsZSB0aGUKKyAgICogZWlnaHQgZWRnZS1hZGphY2VudCBuZWlnaGJvcnMgY29udHJpYnV0ZSBTRiB0byBlYWNoIG9mIHR3byBzbW9vdGhlZAorICAgKiBwaXhlbHMsIG9yIFNGLzIgb3ZlcmFsbC4gIEluIG9yZGVyIHRvIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXNlCisgICAqIGZhY3RvcnMgYXJlIHNjYWxlZCBieSAyXjE2ID0gNjU1MzYuCisgICAqIEFsc28gcmVjYWxsIHRoYXQgU0YgPSBzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNC4KKyAgICovCisKKyAgbWVtYmVyc2NhbGUgPSAxNjM4NCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogODA7IC8qIHNjYWxlZCAoMS01KlNGKS80ICovCisgIG5laWdoc2NhbGUgPSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDE2OyAvKiBzY2FsZWQgU0YvNCAqLworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbaW5yb3crMl07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbjogcHJldGVuZCBjb2x1bW4gLTEgaXMgc2FtZSBhcyBjb2x1bW4gMCAqLworICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQlHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzJdKTsKKyAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMl0pICsKKwkJR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsgYWJvdmVfcHRyICs9IDI7IGJlbG93X3B0ciArPSAyOworCisgICAgZm9yIChjb2xjdHIgPSBvdXRwdXRfY29scyAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7CisgICAgICAvKiBzdW0gb2YgcGl4ZWxzIGRpcmVjdGx5IG1hcHBlZCB0byB0aGlzIG91dHB1dCBlbGVtZW50ICovCisgICAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKKwkJICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgICAgLyogc3VtIG9mIGVkZ2UtbmVpZ2hib3IgcGl4ZWxzICovCisgICAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQkgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJCSBHRVRKU0FNUExFKGlucHRyMFstMV0pICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkJIEdFVEpTQU1QTEUoaW5wdHIxWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMVsyXSk7CisgICAgICAvKiBUaGUgZWRnZS1uZWlnaGJvcnMgY291bnQgdHdpY2UgYXMgbXVjaCBhcyBjb3JuZXItbmVpZ2hib3JzICovCisgICAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICAgIC8qIEFkZCBpbiB0aGUgY29ybmVyLW5laWdoYm9ycyAqLworICAgICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRShhYm92ZV9wdHJbLTFdKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzJdKSArCisJCSAgR0VUSlNBTVBMRShiZWxvd19wdHJbLTFdKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICAgIC8qIGZvcm0gZmluYWwgb3V0cHV0IHNjYWxlZCB1cCBieSAyXjE2ICovCisgICAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAgIC8qIHJvdW5kLCBkZXNjYWxlIGFuZCBvdXRwdXQgaXQgKi8KKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7CisgICAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7IGFib3ZlX3B0ciArPSAyOyBiZWxvd19wdHIgKz0gMjsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCisJCUdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7CisgICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoaW5wdHIwWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKGlucHRyMVstMV0pICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtICs9IG5laWdoc3VtOworICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoYWJvdmVfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQlHRVRKU0FNUExFKGJlbG93X3B0clstMV0pICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgZnVsbC1zaXplIGNvbXBvbmVudCwKKyAqIHdpdGggc21vb3RoaW5nLiAgT25lIHJvdyBvZiBjb250ZXh0IGlzIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyLAorCQkJICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IG91dHJvdzsKKyAgSkRJTUVOU0lPTiBjb2xjdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKKyAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7CisgIGludCBjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhIC0gMSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICsgMiwKKwkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMpOworCisgIC8qIEVhY2ggb2YgdGhlIGVpZ2h0IG5laWdoYm9yIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uIFNGIHRvIHRoZQorICAgKiBzbW9vdGhlZCBwaXhlbCwgd2hpbGUgdGhlIG1haW4gcGl4ZWwgY29udHJpYnV0ZXMgKDEtOCpTRikuICBJbiBvcmRlcgorICAgKiB0byB1c2UgaW50ZWdlciBhcml0aG1ldGljLCB0aGVzZSBmYWN0b3JzIGFyZSBtdWx0aXBsaWVkIGJ5IDJeMTYgPSA2NTUzNi4KKyAgICogQWxzbyByZWNhbGwgdGhhdCBTRiA9IHNtb290aGluZ19mYWN0b3IgLyAxMDI0LgorICAgKi8KKworICBtZW1iZXJzY2FsZSA9IDY1NTM2TCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNTEyTDsgLyogc2NhbGVkIDEtOCpTRiAqLworICBuZWlnaHNjYWxlID0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA2NDsgLyogc2NhbGVkIFNGICovCisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYWJvdmVfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3ctMV07CisgICAgYmVsb3dfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3crMV07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLworICAgIGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cisrKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cisrKSArCisJICAgICBHRVRKU0FNUExFKCppbnB0cik7CisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJIEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICBuZWlnaHN1bSA9IGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgbmV4dGNvbHN1bTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGxhc3Rjb2xzdW0gPSBjb2xzdW07IGNvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICBmb3IgKGNvbGN0ciA9IG91dHB1dF9jb2xzIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICAgYWJvdmVfcHRyKys7IGJlbG93X3B0cisrOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJICAgR0VUSlNBTVBMRSgqaW5wdHIpOworICAgICAgbmVpZ2hzdW0gPSBsYXN0Y29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBuZXh0Y29sc3VtOworICAgICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgICAgbGFzdGNvbHN1bSA9IGNvbHN1bTsgY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIpOworICAgIG5laWdoc3VtID0gbGFzdGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgY29sc3VtOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgIH0KK30KKworI2VuZGlmIC8qIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgKi8KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGRvd25zYW1wbGluZy4KKyAqIE5vdGUgdGhhdCB3ZSBtdXN0IHNlbGVjdCBhIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50LgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZG93bnNhbXBsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9kb3duc2FtcGxlX3B0ciBkb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBib29sZWFuIHNtb290aG9rID0gVFJVRTsKKworICBkb3duc2FtcGxlID0gKG15X2Rvd25zYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2Rvd25zYW1wbGVyKSk7CisgIGNpbmZvLT5kb3duc2FtcGxlID0gKHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICopIGRvd25zYW1wbGU7CisgIGRvd25zYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIuZG93bnNhbXBsZSA9IHNlcF9kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKKworICBpZiAoY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQ0lSNjAxX05PVElNUEwpOworCisgIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBhbmQgc2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7CisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV9zbW9vdGhfZG93bnNhbXBsZTsKKwlkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOworICAgICAgfSBlbHNlCisjZW5kaWYKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKKwkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAgIHNtb290aG9rID0gRkFMU0U7CisgICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZG93bnNhbXBsZTsKKyAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisgICAgICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IpIHsKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfc21vb3RoX2Rvd25zYW1wbGU7CisJZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKKyAgICAgIH0gZWxzZQorI2VuZGlmCisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmICgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICUgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgPT0gMCAmJgorCSAgICAgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgPT0gMCkgeworICAgICAgc21vb3Rob2sgPSBGQUxTRTsKKyAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X2Rvd25zYW1wbGU7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgfQorCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IgJiYgIXNtb290aG9rKQorICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfU01PT1RIX05PVElNUEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9qcGVnL2pjdHJhbnMuYyBiL2pwZWcvamN0cmFucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQ3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pjdHJhbnMuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGpjdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLAorICogdGhhdCBpcywgd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyB0byBhbiBvdXRwdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpjYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7CitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKKworCisvKgorICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24gZm9yIHdyaXRpbmcgcmF3LWNvZWZmaWNpZW50IGRhdGEuCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICogQ2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBkYXRhLgorICoKKyAqIFRoZSBudW1iZXIgb2YgcGFzc2VkIHZpcnR1YWwgYXJyYXlzIG11c3QgbWF0Y2ggY2luZm8tPm51bV9jb21wb25lbnRzLgorICogTm90ZSB0aGF0IHRoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG5vdCBiZSBmaWxsZWQgb3IgZXZlbiByZWFsaXplZCBhdAorICogdGhlIHRpbWUgd3JpdGVfY29lZmZpY2llbnRzIGlzIGNhbGxlZDsgaW5kZWVkLCBpZiB0aGUgdmlydHVhbCBhcnJheXMKKyAqIHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlciwgdGhleQorICogdHlwaWNhbGx5IHdpbGwgYmUgcmVhbGl6ZWQgZHVyaW5nIHRoaXMgcm91dGluZSBhbmQgZmlsbGVkIGFmdGVyd2FyZHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIE1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCisgIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7CisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCisgIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8sIGNvZWZfYXJyYXlzKTsKKyAgLyogV2FpdCBmb3IganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYWxsICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsJLyogc28ganBlZ193cml0ZV9tYXJrZXIgd29ya3MgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9XUkNPRUZTOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMsCisgKiB0aGVuIGNvcHkgZnJvbSB0aGUgc291cmNlIG9iamVjdCBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGxvc3NsZXNzCisgKiB0cmFuc2NvZGluZy4gIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdmFyaWVkIHdpdGhvdXQgbG9zcyAoc3VjaCBhcworICogc2NhbiBzY3JpcHQgYW5kIEh1ZmZtYW4gb3B0aW1pemF0aW9uKSBhcmUgbGVmdCBpbiB0aGVpciBkZWZhdWx0IHN0YXRlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkgICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICppbmNvbXAsICpvdXRjb21wOworICBKUVVBTlRfVEJMICpjX3F1YW50LCAqc2xvdF9xdWFudDsKKyAgaW50IHRibG5vLCBjaSwgY29lZmk7CisKKyAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KKyAgaWYgKGRzdGluZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9CQURfU1RBVEUsIGRzdGluZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIENvcHkgZnVuZGFtZW50YWwgaW1hZ2UgZGltZW5zaW9ucyAqLworICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOworICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIGRzdGluZm8tPmlucHV0X2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgZHN0aW5mby0+aW5fY29sb3Jfc3BhY2UgPSBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlOworICAvKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIGpwZWdfc2V0X2RlZmF1bHRzKGRzdGluZm8pOworICAvKiBqcGVnX3NldF9kZWZhdWx0cyBtYXkgY2hvb3NlIHdyb25nIGNvbG9yc3BhY2UsIGVnIFlDYkNyIGlmIGlucHV0IGlzIFJHQi4KKyAgICogRml4IGl0IHRvIGdldCB0aGUgcmlnaHQgaGVhZGVyIG1hcmtlcnMgZm9yIHRoZSBpbWFnZSBjb2xvcnNwYWNlLgorICAgKi8KKyAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKTsKKyAgZHN0aW5mby0+ZGF0YV9wcmVjaXNpb24gPSBzcmNpbmZvLT5kYXRhX3ByZWNpc2lvbjsKKyAgZHN0aW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IHNyY2luZm8tPkNDSVI2MDFfc2FtcGxpbmc7CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZXMuICovCisgIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7CisgICAgaWYgKHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSAhPSBOVUxMKSB7CisgICAgICBxdGJscHRyID0gJiBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107CisgICAgICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKKwkqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgZHN0aW5mbyk7CisgICAgICBNRU1DT1BZKCgqcXRibHB0ciktPnF1YW50dmFsLAorCSAgICAgIHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXS0+cXVhbnR2YWwsCisJICAgICAgU0laRU9GKCgqcXRibHB0ciktPnF1YW50dmFsKSk7CisgICAgICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7CisgICAgfQorICB9CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHBlci1jb21wb25lbnQgaW5mby4KKyAgICogTm90ZSB3ZSBhc3N1bWUganBlZ19zZXRfZGVmYXVsdHMgaGFzIGFsbG9jYXRlZCB0aGUgZGVzdCBjb21wX2luZm8gYXJyYXkuCisgICAqLworICBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOworICBpZiAoZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGRzdGluZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoZHN0aW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGRzdGluZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworICBmb3IgKGNpID0gMCwgaW5jb21wID0gc3JjaW5mby0+Y29tcF9pbmZvLCBvdXRjb21wID0gZHN0aW5mby0+Y29tcF9pbmZvOworICAgICAgIGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyssIGluY29tcCsrLCBvdXRjb21wKyspIHsKKyAgICBvdXRjb21wLT5jb21wb25lbnRfaWQgPSBpbmNvbXAtPmNvbXBvbmVudF9pZDsKKyAgICBvdXRjb21wLT5oX3NhbXBfZmFjdG9yID0gaW5jb21wLT5oX3NhbXBfZmFjdG9yOworICAgIG91dGNvbXAtPnZfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPnZfc2FtcF9mYWN0b3I7CisgICAgb3V0Y29tcC0+cXVhbnRfdGJsX25vID0gaW5jb21wLT5xdWFudF90Ymxfbm87CisgICAgLyogTWFrZSBzdXJlIHNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50IG1hdGNoZXMgdGhlIHF0YWJsZQorICAgICAqIHNsb3QuICBJZiBub3QsIHRoZSBpbnB1dCBmaWxlIHJlLXVzZWQgdGhpcyBxdGFibGUgc2xvdC4KKyAgICAgKiBJSkcgZW5jb2RlciBjdXJyZW50bHkgY2Fubm90IGR1cGxpY2F0ZSB0aGlzLgorICAgICAqLworICAgIHRibG5vID0gb3V0Y29tcC0+cXVhbnRfdGJsX25vOworICAgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwlzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICBzbG90X3F1YW50ID0gc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOworICAgIGNfcXVhbnQgPSBpbmNvbXAtPnF1YW50X3RhYmxlOworICAgIGlmIChjX3F1YW50ICE9IE5VTEwpIHsKKyAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKSB7CisJaWYgKGNfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSAhPSBzbG90X3F1YW50LT5xdWFudHZhbFtjb2VmaV0pCisJICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogTm90ZTogd2UgZG8gbm90IGNvcHkgdGhlIHNvdXJjZSdzIEh1ZmZtYW4gdGFibGUgYXNzaWdubWVudHM7CisgICAgICogaW5zdGVhZCB3ZSByZWx5IG9uIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gaGF2ZSBtYWRlIGEgc3VpdGFibGUgY2hvaWNlLgorICAgICAqLworICB9CisgIC8qIEFsc28gY29weSBKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KKyAgICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCAiY3JpdGljYWwiIGluZm8sIGJ1dCBpdCdzIG5lYXJseQorICAgKiBhbHdheXMgYXBwcm9wcmlhdGUgdG8gY29weSBpdCBpZiBhdmFpbGFibGUuICBJbiBwYXJ0aWN1bGFyLAorICAgKiBpZiB0aGUgYXBwbGljYXRpb24gY2hvb3NlcyB0byBjb3B5IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBmcm9tCisgICAqIHRoZSBzb3VyY2UgZmlsZSwgd2UgbmVlZCB0byBjb3B5IHRoZSB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAorICAgKiBlbWl0IGEgZmlsZSB0aGF0IGhhcyAxLjAyIGV4dGVuc2lvbnMgYnV0IGEgY2xhaW1lZCB2ZXJzaW9uIG9mIDEuMDEuCisgICAqIFdlIHdpbGwgKm5vdCosIGhvd2V2ZXIsIGNvcHkgdmVyc2lvbiBpbmZvIGZyb20gbWlzbGFiZWxlZCAiMi4wMSIgZmlsZXMuCisgICAqLworICBpZiAoc3JjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7CisgICAgaWYgKHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9PSAxKSB7CisgICAgICBkc3RpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb247CisgICAgICBkc3RpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb247CisgICAgfQorICAgIGRzdGluZm8tPmRlbnNpdHlfdW5pdCA9IHNyY2luZm8tPmRlbnNpdHlfdW5pdDsKKyAgICBkc3RpbmZvLT5YX2RlbnNpdHkgPSBzcmNpbmZvLT5YX2RlbnNpdHk7CisgICAgZHN0aW5mby0+WV9kZW5zaXR5ID0gc3JjaW5mby0+WV9kZW5zaXR5OworICB9Cit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqY2luaXQuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGNvbXByZXNzb3IuCisgKi8KKworTE9DQUwodm9pZCkKK3RyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQoreworICAvKiBBbHRob3VnaCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgaW5wdXRfY29tcG9uZW50cyBmb3IgdHJhbnNjb2RpbmcsCisgICAqIGpjbWFzdGVyLmMncyBpbml0aWFsX3NldHVwIHdpbGwgY29tcGxhaW4gaWYgaW5wdXRfY29tcG9uZW50cyBpcyAwLgorICAgKi8KKyAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KKyAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgVFJVRSAvKiB0cmFuc2NvZGUgb25seSAqLyk7CisKKyAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLworICB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIGNvZWZfYXJyYXlzKTsKKworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0ksIEpGSUYpIGltbWVkaWF0ZWx5LgorICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KKyAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KKyAgICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBhIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50CisgKiBidWZmZXIgY29udHJvbGxlci4gIFRoaXMgaXMgc2ltaWxhciB0byBqY2NvZWZjdC5jLCBidXQgaXQgaGFuZGxlcyBvbmx5CisgKiBvdXRwdXQgZnJvbSBwcmVzdXBwbGllZCB2aXJ0dWFsIGFycmF5cy4gIEZ1cnRoZXJtb3JlLCB3ZSBnZW5lcmF0ZSBhbnkKKyAqIGR1bW15IHBhZGRpbmcgYmxvY2tzIG9uLXRoZS1mbHkgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoZW0gdG8gYmUgcHJlc2VudAorICogaW4gdGhlIGFycmF5cy4KKyAqLworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLworICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBWaXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciAqIHdob2xlX2ltYWdlOworCisgIC8qIFdvcmtzcGFjZSBmb3IgY29uc3RydWN0aW5nIGR1bW15IGJsb2NrcyBhdCByaWdodC9ib3R0b20gZWRnZXMuICovCisgIEpCTE9DS1JPVyBkdW1teV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Cit9IG15X2NvZWZfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+bWN1X2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIGlmIChwYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKworICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlpbmRleCt5b2Zmc2V0IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgIC8qIEZpbGwgaW4gcG9pbnRlcnMgdG8gcmVhbCBibG9ja3MgaW4gdGhpcyByb3cgKi8KKwkgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGJsb2NrY250OyB4aW5kZXgrKykKKwkgICAgICBNQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9IGVsc2UgeworCSAgICAvKiBBdCBib3R0b20gb2YgaW1hZ2UsIG5lZWQgYSB3aG9sZSByb3cgb2YgZHVtbXkgYmxvY2tzICovCisJICAgIHhpbmRleCA9IDA7CisJICB9CisJICAvKiBGaWxsIGluIGFueSBkdW1teSBibG9ja3MgbmVlZGVkIGluIHRoaXMgcm93LgorCSAgICogRHVtbXkgYmxvY2tzIGFyZSBmaWxsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGpjY29lZmN0LmM6CisJICAgKiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCisJICAgKiBibG9jaydzIERDIHZhbHVlLiAgVGhlIGluaXQgcm91dGluZSBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlCisJICAgKiBBQyBlbnRyaWVzLCBzbyB3ZSBuZWVkIG9ubHkgc2V0IHRoZSBEQyBlbnRyaWVzIGNvcnJlY3RseS4KKwkgICAqLworCSAgZm9yICg7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKKwkgICAgTUNVX2J1ZmZlcltibGtuXSA9IGNvZWYtPmR1bW15X2J1ZmZlcltibGtuXTsKKwkgICAgTUNVX2J1ZmZlcltibGtuXVswXVswXSA9IE1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKKwkgICAgYmxrbisrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBNQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KKyAgICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLworICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqCisgKiBFYWNoIHBhc3NlZCBjb2VmZmljaWVudCBhcnJheSBtdXN0IGJlIHRoZSByaWdodCBzaXplIGZvciB0aGF0CisgKiBjb2VmZmljaWVudDogd2lkdGhfaW5fYmxvY2tzIHdpZGUgYW5kIGhlaWdodF9pbl9ibG9ja3MgaGlnaCwKKyAqIHdpdGggdW5pdGhlaWdodCBhdCBsZWFzdCB2X3NhbXBfZmFjdG9yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisgIEpCTE9DS1JPVyBidWZmZXI7CisgIGludCBpOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOworICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKKworICAvKiBTYXZlIHBvaW50ZXIgdG8gdmlydHVhbCBhcnJheXMgKi8KKyAgY29lZi0+d2hvbGVfaW1hZ2UgPSBjb2VmX2FycmF5czsKKworICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gc3BhY2UgZm9yIGR1bW15IERDVCBibG9ja3MuICovCisgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICBqemVyb19mYXIoKHZvaWQgRkFSICopIGJ1ZmZlciwgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKKyAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgIGNvZWYtPmR1bW15X2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pwZWcvamRhcGltaW4uYyBiL2pwZWcvamRhcGltaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzk2MDdlCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qZGFwaW1pbi5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogamRhcGltaW4uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGVjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCisgKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlCisgKiB0cmFuc2NvZGluZy1vbmx5IGNhc2UuCisgKgorICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpkYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNvbWFwaS5jIGZvciByb3V0aW5lcworICogc2hhcmVkIGJ5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamR0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcKKyAqIGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCisgKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfQ3JlYXRlRGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQoreworICBpbnQgaTsKKworICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCisgIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKKyAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAorCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7CisKKyAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KKyAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0CisgICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgorICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKKyAgICogY29tcGxhaW4gaGVyZS4KKyAgICovCisgIHsKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLworICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpOworICAgIGNpbmZvLT5lcnIgPSBlcnI7CisgICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisgIH0KKyAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IFRSVUU7CisgIGNpbmZvLT50aWxlX2RlY29kZSA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgYSBtZW1vcnkgbWFuYWdlciBpbnN0YW5jZSBmb3IgdGhpcyBvYmplY3QgKi8KKyAgamluaXRfbWVtb3J5X21ncigoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogWmVybyBvdXQgcG9pbnRlcnMgdG8gcGVybWFuZW50IHN0cnVjdHVyZXMuICovCisgIGNpbmZvLT5wcm9ncmVzcyA9IE5VTEw7CisgIGNpbmZvLT5zcmMgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQorICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7CisgIH0KKworICAvKiBJbml0aWFsaXplIG1hcmtlciBwcm9jZXNzb3Igc28gYXBwbGljYXRpb24gY2FuIG92ZXJyaWRlIG1ldGhvZHMKKyAgICogZm9yIENPTSwgQVBQbiBtYXJrZXJzIGJlZm9yZSBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIuCisgICAqLworICBjaW5mby0+bWFya2VyX2xpc3QgPSBOVUxMOworICBqaW5pdF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKKworICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgb3ZlcmFsbCBpbnB1dCBjb250cm9sbGVyLiAqLworICBqaW5pdF9pbnB1dF9jb250cm9sbGVyKGNpbmZvKTsKKworICAvKiBPSywgSSdtIHJlYWR5ICovCisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7Cit9CisKKworLyoKKyAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19kZXN0cm95X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLworfQorCisKKy8qCisgKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiwKKyAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19hYm9ydF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIFNldCBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4KKyAqLworCitMT0NBTCh2b2lkKQorZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBHdWVzcyB0aGUgaW5wdXQgY29sb3JzcGFjZSwgYW5kIHNldCBvdXRwdXQgY29sb3JzcGFjZSBhY2NvcmRpbmdseS4gKi8KKyAgLyogKFdpc2ggSlBFRyBjb21taXR0ZWUgaGFkIHByb3ZpZGVkIGEgcmVhbCB3YXkgdG8gc3BlY2lmeSB0aGlzLi4uKSAqLworICAvKiBOb3RlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSBvdXIgZ3Vlc3Nlcy4gKi8KKyAgc3dpdGNoIChjaW5mby0+bnVtX2NvbXBvbmVudHMpIHsKKyAgY2FzZSAxOgorICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSAzOgorICAgIGlmIChjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7CisgICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogSkZJRiBpbXBsaWVzIFlDYkNyICovCisgICAgfSBlbHNlIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgeworICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7CisgICAgICBjYXNlIDA6CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCWJyZWFrOworICAgICAgY2FzZSAxOgorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogYXNzdW1lIGl0J3MgWUNiQ3IgKi8KKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogU2F3IG5vIHNwZWNpYWwgbWFya2VycywgdHJ5IHRvIGd1ZXNzIGZyb20gdGhlIGNvbXBvbmVudCBJRHMgKi8KKyAgICAgIGludCBjaWQwID0gY2luZm8tPmNvbXBfaW5mb1swXS5jb21wb25lbnRfaWQ7CisgICAgICBpbnQgY2lkMSA9IGNpbmZvLT5jb21wX2luZm9bMV0uY29tcG9uZW50X2lkOworICAgICAgaW50IGNpZDIgPSBjaW5mby0+Y29tcF9pbmZvWzJdLmNvbXBvbmVudF9pZDsKKworICAgICAgaWYgKGNpZDAgPT0gMSAmJiBjaWQxID09IDIgJiYgY2lkMiA9PSAzKQorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgSkZJRiB3L291dCBtYXJrZXIgKi8KKyAgICAgIGVsc2UgaWYgKGNpZDAgPT0gODIgJiYgY2lkMSA9PSA3MSAmJiBjaWQyID09IDY2KQorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogQVNDSUkgJ1InLCAnRycsICdCJyAqLworICAgICAgZWxzZSB7CisJVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfVU5LTk9XTl9JRFMsIGNpZDAsIGNpZDEsIGNpZDIpOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLworICAgICAgfQorICAgIH0KKyAgICAvKiBBbHdheXMgZ3Vlc3MgUkdCIGlzIHByb3BlciBvdXRwdXQgY29sb3JzcGFjZS4gKi8KKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSA0OgorICAgIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgeworICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7CisgICAgICBjYXNlIDA6CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKwlicmVhazsKKyAgICAgIGNhc2UgMjoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOyAvKiBhc3N1bWUgaXQncyBZQ0NLICovCisJYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vIHNwZWNpYWwgbWFya2VycywgYXNzdW1lIHN0cmFpZ2h0IENNWUsuICovCisgICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOworICAgIH0KKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7CisgICAgYnJlYWs7CisgICAgCisgIGRlZmF1bHQ6CisgICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047CisgICAgYnJlYWs7CisgIH0KKworICAvKiBTZXQgZGVmYXVsdHMgZm9yIG90aGVyIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KKyAgY2luZm8tPnNjYWxlX251bSA9IDE7CQkvKiAxOjEgc2NhbGluZyAqLworICBjaW5mby0+c2NhbGVfZGVub20gPSAxOworICBjaW5mby0+b3V0cHV0X2dhbW1hID0gMS4wOworICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBGQUxTRTsKKyAgY2luZm8tPnJhd19kYXRhX291dCA9IEZBTFNFOworICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKKyAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBUUlVFOworICBjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nID0gVFJVRTsKKyAgY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IEZBTFNFOworICAvKiBXZSBzZXQgdGhlc2UgaW4gY2FzZSBhcHBsaWNhdGlvbiBvbmx5IHNldHMgcXVhbnRpemVfY29sb3JzLiAqLworICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBUUlVFOworI2Vsc2UKKyAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7CisjZW5kaWYKKyAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKKyAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKKyAgLyogSW5pdGlhbGl6ZSBmb3Igbm8gbW9kZSBjaGFuZ2UgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKyAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IEZBTFNFOworICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7CisgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKK30KKworCisvKgorICogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlLgorICogTmVlZCBvbmx5IGluaXRpYWxpemUgSlBFRyBvYmplY3QgYW5kIHN1cHBseSBhIGRhdGEgc291cmNlIGJlZm9yZSBjYWxsaW5nLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHJlYWQgYXMgZmFyIGFzIHRoZSBmaXJzdCBTT1MgbWFya2VyIChpZSwgYWN0dWFsIHN0YXJ0IG9mCisgKiBjb21wcmVzc2VkIGRhdGEpLCBhbmQgd2lsbCBzYXZlIGFsbCB0YWJsZXMgYW5kIHBhcmFtZXRlcnMgaW4gdGhlIEpQRUcKKyAqIG9iamVjdC4gIEl0IHdpbGwgYWxzbyBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gZGVmYXVsdAorICogdmFsdWVzLCBhbmQgZmluYWxseSByZXR1cm4gSlBFR19IRUFERVJfT0suICBPbiByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtYXkKKyAqIGFkanVzdCB0aGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzLgorICogKE9yLCBpZiB0aGUgYXBwbGljYXRpb24gb25seSB3YW50ZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSBwYXJhbWV0ZXJzLAorICogdGhlIGRhdGEgbmVlZCBub3QgYmUgZGVjb21wcmVzc2VkLiAgSW4gdGhhdCBjYXNlLCBjYWxsIGpwZWdfYWJvcnQgb3IKKyAqIGpwZWdfZGVzdHJveSB0byByZWxlYXNlIGFueSB0ZW1wb3Jhcnkgc3BhY2UuKQorICogSWYgYW4gYWJicmV2aWF0ZWQgKHRhYmxlcyBvbmx5KSBkYXRhc3RyZWFtIGlzIHByZXNlbnRlZCwgdGhlIHJvdXRpbmUgd2lsbAorICogcmV0dXJuIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZIHVwb24gcmVhY2hpbmcgRU9JLiAgVGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCisgKiByZS11c2UgdGhlIEpQRUcgb2JqZWN0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW0ocykuCisgKiBJdCBpcyB1bm5lY2Vzc2FyeSAoYnV0IE9LKSB0byBjYWxsIGpwZWdfYWJvcnQgaW4gdGhpcyBjYXNlLgorICogVGhlIEpQRUdfU1VTUEVOREVEIHJldHVybiBjb2RlIG9ubHkgb2NjdXJzIGlmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUKKyAqIHJlcXVlc3RzIHN1c3BlbnNpb24gb2YgdGhlIGRlY29tcHJlc3Nvci4gIEluIHRoaXMgY2FzZSB0aGUgYXBwbGljYXRpb24KKyAqIHNob3VsZCBsb2FkIG1vcmUgc291cmNlIGRhdGEgYW5kIHRoZW4gcmUtY2FsbCBqcGVnX3JlYWRfaGVhZGVyIHRvIHJlc3VtZQorICogcHJvY2Vzc2luZy4KKyAqIElmIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZCBhbmQgcmVxdWlyZV9pbWFnZSBpcyBUUlVFLCB0aGVuIHRoZQorICogcmV0dXJuIGNvZGUgbmVlZCBub3QgYmUgaW5zcGVjdGVkIHNpbmNlIG9ubHkgSlBFR19IRUFERVJfT0sgaXMgcG9zc2libGUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIG5vdyBqdXN0IGEgZnJvbnQgZW5kIHRvIGpwZWdfY29uc3VtZV9pbnB1dCwgd2l0aCBzb21lCisgKiBleHRyYSBlcnJvciBjaGVja2luZy4KKyAqLworCitHTE9CQUwoaW50KQoranBlZ19yZWFkX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiByZXF1aXJlX2ltYWdlKQoreworICBpbnQgcmV0Y29kZTsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RBUlQgJiYKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0lOSEVBREVSKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgcmV0Y29kZSA9IGpwZWdfY29uc3VtZV9pbnB1dChjaW5mbyk7CisKKyAgc3dpdGNoIChyZXRjb2RlKSB7CisgIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoKKyAgICByZXRjb2RlID0gSlBFR19IRUFERVJfT0s7CisgICAgYnJlYWs7CisgIGNhc2UgSlBFR19SRUFDSEVEX0VPSToKKyAgICBpZiAocmVxdWlyZV9pbWFnZSkJCS8qIENvbXBsYWluIGlmIGFwcGxpY2F0aW9uIHdhbnRlZCBhbiBpbWFnZSAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19JTUFHRSk7CisgICAgLyogUmVzZXQgdG8gc3RhcnQgc3RhdGU7IGl0IHdvdWxkIGJlIHNhZmVyIHRvIHJlcXVpcmUgdGhlIGFwcGxpY2F0aW9uIHRvCisgICAgICogY2FsbCBqcGVnX2Fib3J0LCBidXQgd2UgY2FuJ3QgY2hhbmdlIGl0IG5vdyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgorICAgICAqIEEgc2lkZSBlZmZlY3QgaXMgdG8gZnJlZSBhbnkgdGVtcG9yYXJ5IG1lbW9yeSAodGhlcmUgc2hvdWxkbid0IGJlIGFueSkuCisgICAgICovCisgICAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHNldHMgc3RhdGUgPSBEU1RBVEVfU1RBUlQgKi8KKyAgICByZXRjb2RlID0gSlBFR19IRUFERVJfVEFCTEVTX09OTFk7CisgICAgYnJlYWs7CisgIGNhc2UgSlBFR19TVVNQRU5ERUQ6CisgICAgLyogbm8gd29yayAqLworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldGNvZGU7Cit9CisKKworLyoKKyAqIENvbnN1bWUgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgdGhlIGRlY29tcHJlc3NvciByZXF1aXJlcy4KKyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBvbmNlIHRoZSBkZWNvbXByZXNzb3Igb2JqZWN0IGhhcworICogYmVlbiBjcmVhdGVkIGFuZCBhIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB1cC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZXNzZW50aWFsbHkgYSBzdGF0ZSBtYWNoaW5lIHRoYXQgaGFuZGxlcyBhIGNvdXBsZQorICogb2YgY3JpdGljYWwgc3RhdGUtdHJhbnNpdGlvbiBhY3Rpb25zLCBuYW1lbHkgaW5pdGlhbCBzZXR1cCBhbmQKKyAqIHRyYW5zaXRpb24gZnJvbSBoZWFkZXIgc2Nhbm5pbmcgdG8gcmVhZHktZm9yLXN0YXJ0X2RlY29tcHJlc3MuCisgKiBBbGwgdGhlIGFjdHVhbCBpbnB1dCBpcyBkb25lIHZpYSB0aGUgaW5wdXQgY29udHJvbGxlcidzIGNvbnN1bWVfaW5wdXQKKyAqIG1ldGhvZC4KKyAqLworCitHTE9CQUwoaW50KQoranBlZ19jb25zdW1lX2lucHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpbnQgcmV0Y29kZSA9IEpQRUdfU1VTUEVOREVEOworCisgIC8qIE5COiBldmVyeSBwb3NzaWJsZSBEU1RBVEUgdmFsdWUgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGlzIHN3aXRjaCAqLworICBzd2l0Y2ggKGNpbmZvLT5nbG9iYWxfc3RhdGUpIHsKKyAgY2FzZSBEU1RBVEVfU1RBUlQ6CisgICAgLyogU3RhcnQtb2YtZGF0YXN0cmVhbSBhY3Rpb25zOiByZXNldCBhcHByb3ByaWF0ZSBtb2R1bGVzICovCisgICAgKCpjaW5mby0+aW5wdXRjdGwtPnJlc2V0X2lucHV0X2NvbnRyb2xsZXIpIChjaW5mbyk7CisgICAgLyogSW5pdGlhbGl6ZSBhcHBsaWNhdGlvbidzIGRhdGEgc291cmNlIG1vZHVsZSAqLworICAgICgqY2luZm8tPnNyYy0+aW5pdF9zb3VyY2UpIChjaW5mbyk7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9JTkhFQURFUjsKKyAgICAvKkZBTExUSFJPVUdIKi8KKyAgY2FzZSBEU1RBVEVfSU5IRUFERVI6CisgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpIHsgLyogRm91bmQgU09TLCBwcmVwYXJlIHRvIGRlY29tcHJlc3MgKi8KKyAgICAgIC8qIFNldCB1cCBkZWZhdWx0IHBhcmFtZXRlcnMgYmFzZWQgb24gaGVhZGVyIGRhdGEgKi8KKyAgICAgIGRlZmF1bHRfZGVjb21wcmVzc19wYXJtcyhjaW5mbyk7CisgICAgICAvKiBTZXQgZ2xvYmFsIHN0YXRlOiByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLworICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRUFEWTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgRFNUQVRFX1JFQURZOgorICAgIC8qIENhbid0IGFkdmFuY2UgcGFzdCBmaXJzdCBTT1MgdW50aWwgc3RhcnRfZGVjb21wcmVzcyBpcyBjYWxsZWQgKi8KKyAgICByZXRjb2RlID0gSlBFR19SRUFDSEVEX1NPUzsKKyAgICBicmVhazsKKyAgY2FzZSBEU1RBVEVfUFJFTE9BRDoKKyAgY2FzZSBEU1RBVEVfUFJFU0NBTjoKKyAgY2FzZSBEU1RBVEVfU0NBTk5JTkc6CisgIGNhc2UgRFNUQVRFX1JBV19PSzoKKyAgY2FzZSBEU1RBVEVfQlVGSU1BR0U6CisgIGNhc2UgRFNUQVRFX0JVRlBPU1Q6CisgIGNhc2UgRFNUQVRFX1NUT1BQSU5HOgorICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICB9CisgIHJldHVybiByZXRjb2RlOworfQorCisKKy8qCisgKiBIYXZlIHdlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGlucHV0IGZpbGU/CisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2lucHV0X2NvbXBsZXRlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBDaGVjayBmb3IgdmFsaWQganBlZyBvYmplY3QgKi8KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfU1RBUlQgfHwKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQ7Cit9CisKKworLyoKKyAqIElzIHRoZXJlIG1vcmUgdGhhbiBvbmUgc2Nhbj8KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfaGFzX211bHRpcGxlX3NjYW5zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBPbmx5IHZhbGlkIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIgY29tcGxldGVzICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlIDwgRFNUQVRFX1JFQURZIHx8CisgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID4gRFNUQVRFX1NUT1BQSU5HKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIHJldHVybiBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FuczsKK30KKworCisvKgorICogRmluaXNoIEpQRUcgZGVjb21wcmVzc2lvbi4KKyAqCisgKiBUaGlzIHdpbGwgbm9ybWFsbHkganVzdCB2ZXJpZnkgdGhlIGZpbGUgdHJhaWxlciBhbmQgcmVsZWFzZSB0ZW1wIHN0b3JhZ2UuCisgKgorICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKKyAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgorICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19maW5pc2hfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICAvKiBUZXJtaW5hdGUgZmluYWwgcGFzcyBvZiBub24tYnVmZmVyZWQgbW9kZSAqLworI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKKyAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7CisjZW5kaWYKKyAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UT09fTElUVExFX0RBVEEpOworICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpIHsKKyAgICAvKiBGaW5pc2hpbmcgYWZ0ZXIgYSBidWZmZXJlZC1pbWFnZSBvcGVyYXRpb24gKi8KKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1NUT1BQSU5HKSB7CisgICAgLyogU1RPUFBJTkcgPSByZXBlYXQgY2FsbCBhZnRlciBhIHN1c3BlbnNpb24sIGFueXRoaW5nIGVsc2UgaXMgZXJyb3IgKi8KKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICB9CisgIC8qIFJlYWQgdW50aWwgRU9JICovCisjaWZuZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKKyAgd2hpbGUgKCEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLworICB9CisjZW5kaWYKKyAgLyogRG8gZmluYWwgY2xlYW51cCAqLworICAoKmNpbmZvLT5zcmMtPnRlcm1fc291cmNlKSAoY2luZm8pOworICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9qcGVnL2pkYXBpc3RkLmMgYi9qcGVnL2pkYXBpc3RkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyMzNkZgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRhcGlzdGQuYwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIGpkYXBpc3RkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgorICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgInN0YW5kYXJkIiBBUEkgcm91dGluZXMgdGhhdCBhcmUKKyAqIHVzZWQgaW4gdGhlIG5vcm1hbCBmdWxsLWRlY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKKyAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KKyAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGRlY29tcHJlc3Nvci4KKyAqIFdlIHRodXMgbXVzdCBzZXBhcmF0ZSB0aGlzIGZpbGUgZnJvbSBqZGFwaW1pbi5jIHRvIGF2b2lkIGxpbmtpbmcgdGhlCisgKiB3aG9sZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTChib29sZWFuKSBvdXRwdXRfcGFzc19zZXR1cCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogRGVjb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgd2lsbCBkbyBhbGwgYnV0IHRoZQorICogbGFzdCBwYXNzLCBhbmQgdGh1cyBtYXkgdGFrZSBhIGdyZWF0IGRlYWwgb2YgdGltZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgeworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLworICAgIGppbml0X21hc3Rlcl9kZWNvbXByZXNzKGNpbmZvKTsKKyAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgICAvKiBObyBtb3JlIHdvcmsgaGVyZTsgZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0IG5leHQgKi8KKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7CisgICAgLyogSWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGFic29yYiB0aGVtIGFsbCBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLworICAgIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgICAgZm9yICg7OykgeworCWludCByZXRjb2RlOworCS8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisJICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKwkvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisJcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworCWlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorCSAgcmV0dXJuIEZBTFNFOworCWlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisJICBicmVhazsKKwkvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKKwkgICAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKwkgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgeworCSAgICAvKiBqZG1hc3RlciB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KKwkgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworCSAgfQorCX0KKyAgICAgIH0KKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisgICAgfQorICAgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgZmluYWwgcGFzcyAqLworICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOworfQorCisvKgorICogVGlsZSBkZWNvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgorICoganBlZ19yZWFkX2hlYWRlciBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzLgorICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19zdGFydF90aWxlX2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgeworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLworICAgIGNpbmZvLT50aWxlX2RlY29kZSA9IFRSVUU7CisgICAgamluaXRfbWFzdGVyX2RlY29tcHJlc3MoY2luZm8pOworICAgIGlmIChjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7CisgICAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIFBlcmZvcm0gYW55IGR1bW15IG91dHB1dCBwYXNzZXMsIGFuZCBzZXQgdXAgZm9yIHRoZSBmaW5hbCBwYXNzICovCisgIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Cit9CisKKworLyoKKyAqIFNldCB1cCBmb3IgYW4gb3V0cHV0IHBhc3MsIGFuZCBwZXJmb3JtIGFueSBkdW1teSBwYXNzKGVzKSBuZWVkZWQuCisgKiBDb21tb24gc3Vicm91dGluZSBmb3IganBlZ19zdGFydF9kZWNvbXByZXNzIGFuZCBqcGVnX3N0YXJ0X291dHB1dC4KKyAqIEVudHJ5OiBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTiBvbmx5IGlmIHByZXZpb3VzbHkgc3VzcGVuZGVkLgorICogRXhpdDogSWYgZG9uZSwgcmV0dXJucyBUUlVFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSBmb3IgcHJvcGVyIG91dHB1dCBtb2RlLgorICogICAgICAgSWYgc3VzcGVuZGVkLCByZXR1cm5zIEZBTFNFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCitvdXRwdXRfcGFzc19zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pIHsKKyAgICAvKiBGaXJzdCBjYWxsOiBkbyBwYXNzIHNldHVwICovCisgICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU47CisgIH0KKyAgLyogTG9vcCBvdmVyIGFueSByZXF1aXJlZCBkdW1teSBwYXNzZXMgKi8KKyAgd2hpbGUgKGNpbmZvLT5tYXN0ZXItPmlzX2R1bW15X3Bhc3MpIHsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgICAvKiBDcmFuayB0aHJvdWdoIHRoZSBkdW1teSBwYXNzICovCisgICAgd2hpbGUgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkgeworICAgICAgSkRJTUVOU0lPTiBsYXN0X3NjYW5saW5lOworICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKKwljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7CisJKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisgICAgICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLworICAgICAgbGFzdF9zY2FubGluZSA9IGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QQVJSQVkpIE5VTEwsCisJCQkJICAgICZjaW5mby0+b3V0cHV0X3NjYW5saW5lLCAoSkRJTUVOU0lPTikgMCk7CisgICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA9PSBsYXN0X3NjYW5saW5lKQorCXJldHVybiBGQUxTRTsJCS8qIE5vIHByb2dyZXNzIG1hZGUsIG11c3Qgc3VzcGVuZCAqLworICAgIH0KKyAgICAvKiBGaW5pc2ggdXAgZHVtbXkgcGFzcywgYW5kIHNldCB1cCBmb3IgYW5vdGhlciBvbmUgKi8KKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPSAwOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgIH0KKyAgLyogUmVhZHkgZm9yIGFwcGxpY2F0aW9uIHRvIGRyaXZlIG91dHB1dCBwYXNzIHRocm91Z2gKKyAgICoganBlZ19yZWFkX3NjYW5saW5lcyBvciBqcGVnX3JlYWRfcmF3X2RhdGEuCisgICAqLworICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gY2luZm8tPnJhd19kYXRhX291dCA/IERTVEFURV9SQVdfT0sgOiBEU1RBVEVfU0NBTk5JTkc7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBSZWFkIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgZnJvbSB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgcmVhZC4KKyAqIFRoaXMgbWF5IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHJlcXVlc3RlZCBpbiBzZXZlcmFsIGNhc2VzLAorICogaW5jbHVkaW5nIGJvdHRvbSBvZiBpbWFnZSwgZGF0YSBzb3VyY2Ugc3VzcGVuc2lvbiwgYW5kIG9wZXJhdGluZworICogbW9kZXMgdGhhdCBlbWl0IG11bHRpcGxlIHNjYW5saW5lcyBhdCBhIHRpbWUuCisgKgorICogTm90ZTogd2Ugd2FybiBhYm91dCBleGNlc3MgY2FsbHMgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpIHNpbmNlCisgKiB0aGlzIGxpa2VseSBzaWduYWxzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgZXJyb3IuICBIb3dldmVyLAorICogYW4gb3ZlcnNpemUgYnVmZmVyIChtYXhfbGluZXMgPiBzY2FubGluZXMgcmVtYWluaW5nKSBpcyBub3QgYW4gZXJyb3IuCisgKi8KKworR0xPQkFMKEpESU1FTlNJT04pCitqcGVnX3JlYWRfc2NhbmxpbmVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIHNjYW5saW5lcywKKwkJICAgICBKRElNRU5TSU9OIG1heF9saW5lcykKK3sKKyAgSkRJTUVOU0lPTiByb3dfY3RyOworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TQ0FOTklORykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA+PSBjaW5mby0+b3V0cHV0X2hlaWdodCkgeworICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7CisgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIH0KKworICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLworICByb3dfY3RyID0gMDsKKyAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIG1heF9saW5lcyk7CisgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gcm93X2N0cjsKKyAgcmV0dXJuIHJvd19jdHI7Cit9CisvKgorICogSW5pdGlhbGl6ZSB0aGUganBlZyBkZWNvZGVyIHRvIGRlY29tcHJlc3NpbmcgYSByZWN0YW5nbGUgd2l0aCBzaXplIG9mICh3aWR0aCwgaGVpZ2h0KQorICogYW5kIGl0cyB1cHBlci1sZWZ0IGNvcm5lciBsb2NhdGVkIGF0IChzdGFydF94LCBzdGFydF95KS4KKyAqIEFsaWduIHN0YXJ0X3ggYW5kIHN0YXJ0X3kgdG8gbXVsdGlwbGllcyBvZiBpTUNVIHdpZHRoIGFuZCBoZWlnaHQsIHJlc3BlY3RpdmVseS4KKyAqIEFsc28sIHRoZSBuZXcgcmVhZGVyIHBvc2l0aW9uIGFuZCBzYW1wbGVkIGltYWdlIHNpemUgd2lsbCBiZSByZXR1cm5lZCBpbgorICogKHN0YXJ0X3gsIHN0YXJ0X3kpIGFuZCAod2lkdGgsIGhlaWdodCksIHJlc3BlY3RpdmVseS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaW5pdF9yZWFkX3RpbGVfc2NhbmxpbmUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgsCisJCSAgICAgaW50ICpzdGFydF94LCBpbnQgKnN0YXJ0X3ksIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KQoreworICAvLyBDYWxjdWxhdGVzIHRoZSBib3VuZGFyeSBvZiBpTUNVCisgIGludCBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworICBpbnQgbGluZXNfcGVyX2lNQ1VfY29sID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRTsKKyAgaW50IHJvd19vZmZzZXQgPSAqc3RhcnRfeSAvIGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgaW50IGNvbF9sZWZ0X2JvdW5kYXJ5ID0gKCgqc3RhcnRfeCAvIGxpbmVzX3Blcl9pTUNVX2NvbCkKKyAgICAgICAgICAgIC8gaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZSkgKiBpbmRleC0+TUNVX3NhbXBsZV9zaXplOworICBpbnQgY29sX3JpZ2h0X2JvdW5kYXJ5ID0KKyAgICAgICAgICAgICAgICAgIGpkaXZfcm91bmRfdXAoKnN0YXJ0X3ggKyAqd2lkdGgsIGxpbmVzX3Blcl9pTUNVX2NvbCk7CisKKyAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5zX3RvX3NraXAgPQorICAgICAgKnN0YXJ0X3ggLyBsaW5lc19wZXJfaU1DVV9jb2wgLSBjb2xfbGVmdF9ib3VuZGFyeTsKKworICAqaGVpZ2h0ID0gKCpzdGFydF95IC0gcm93X29mZnNldCAqIGxpbmVzX3Blcl9pTUNVX3JvdykgKyAqaGVpZ2h0OworICAqc3RhcnRfeCA9IGNvbF9sZWZ0X2JvdW5kYXJ5ICogbGluZXNfcGVyX2lNQ1VfY29sOworICAqc3RhcnRfeSA9IHJvd19vZmZzZXQgKiBsaW5lc19wZXJfaU1DVV9yb3c7CisgIGNpbmZvLT5pbWFnZV93aWR0aCA9IGptaW4oY2luZm8tPm9yaWdpbmFsX2ltYWdlX3dpZHRoLAorICAgICAgICAgIGNvbF9yaWdodF9ib3VuZGFyeSAqIGxpbmVzX3Blcl9pTUNVX2NvbCkgLQorICAgICAgICAgIGNvbF9sZWZ0X2JvdW5kYXJ5ICogbGluZXNfcGVyX2lNQ1VfY29sOworICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSByb3dfb2Zmc2V0OworICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID0gcm93X29mZnNldDsKKworICAvLyBVcGRhdGVzIEpQRUcgZGVjb2RlciBwYXJhbWV0ZXIKKyAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworICBqaW5pdF91cHNhbXBsZXIoY2luZm8pOworICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOworICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisgICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgZWxzZQorICAgIGpwZWdfZGVjb21wcmVzc19wZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisKKyAgaW50IHNhbXBsZV9zaXplID0gRENUU0laRSAvIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworCisgICpoZWlnaHQgPSBqZGl2X3JvdW5kX3VwKCpoZWlnaHQsIHNhbXBsZV9zaXplKTsKKyAgKndpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IGxpbmVzX3Blcl9pTUNVX3JvdyAqIHJvd19vZmZzZXQgLyBzYW1wbGVfc2l6ZTsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YTsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQorICAgICAgY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4OworICBjaW5mby0+ZW50cm9weS0+aW5kZXggPSBpbmRleDsKKyAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gcm93X29mZnNldDsKKyAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IHJvd19vZmZzZXQ7CisgIGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX2xlZnRfYm91bmRhcnkgPSBjb2xfbGVmdF9ib3VuZGFyeTsKKyAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fcmlnaHRfYm91bmRhcnkgPSBjb2xfcmlnaHRfYm91bmRhcnk7CisgIGNpbmZvLT5jb2VmLT5jb2x1bW5fbGVmdF9ib3VuZGFyeSA9CisgICAgICBjb2xfbGVmdF9ib3VuZGFyeSAvIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemU7CisgIGNpbmZvLT5jb2VmLT5jb2x1bW5fcmlnaHRfYm91bmRhcnkgPQorICAgICAgamRpdl9yb3VuZF91cChjb2xfcmlnaHRfYm91bmRhcnksIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUpOworfQorCisvKgorICogUmVhZCBhIHNjYW5saW5lIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgcmVhZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfcmVhZF90aWxlX3NjYW5saW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCwKKyAgICAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMpCit7CisgIC8vIENhbGN1bGF0ZXMgdGhlIGJvdW5kYXJ5IG9mIGlNQ1UKKyAgaW50IGxpbmVzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7CisgIGludCBsaW5lc19wZXJfaU1DVV9jb2wgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworICBpbnQgc2FtcGxlX3NpemUgPSBEQ1RTSVpFIC8gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIEpESU1FTlNJT04gcm93X2N0ciA9IDA7CisKKyAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIDEpOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lICUgKGxpbmVzX3Blcl9pTUNVX3JvdyAvIHNhbXBsZV9zaXplKSA9PSAwKSB7CisgICAgICAvLyBTZXQgdGhlIHJlYWQgaGVhZCB0byB0aGUgbmV4dCBpTUNVIHJvdworICAgICAgaW50IGlNQ1Vfcm93X29mZnNldCA9IGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgLworICAgICAgICAgICAgKGxpbmVzX3Blcl9pTUNVX3JvdyAvIHNhbXBsZV9zaXplKTsKKyAgICAgIGludCBvZmZzZXRfZGF0YV9jb2xfcG9zaXRpb24gPSBjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5IC8KKyAgICAgICAgICAgIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemU7CisgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldF9kYXRhID0KKyAgICAgICAgICBpbmRleC0+c2NhblswXS5vZmZzZXRbaU1DVV9yb3dfb2Zmc2V0XVtvZmZzZXRfZGF0YV9jb2xfcG9zaXRpb25dOworICAgICAgKCpjaW5mby0+ZW50cm9weS0+Y29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcikgKGNpbmZvLCBvZmZzZXRfZGF0YSk7CisgICAgfQorICAgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCAxKTsKKyAgfQorCisgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gcm93X2N0cjsKKyAgcmV0dXJuIHJvd19jdHI7Cit9CisKKy8qCisgKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQgdG8gcmVhZCByYXcgZGF0YS4KKyAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfcmVhZF9yYXdfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBkYXRhLAorCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCit7CisgIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SQVdfT0spCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGNhbiBiZSByZXR1cm5lZC4gKi8KKyAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGlmIChtYXhfbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7CisKKyAgLyogRGVjb21wcmVzcyBkaXJlY3RseSBpbnRvIHVzZXIncyBidWZmZXIuICovCisgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBkYXRhKSkKKyAgICByZXR1cm4gMDsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLworCisgIC8qIE9LLCB3ZSBwcm9jZXNzZWQgb25lIGlNQ1Ugcm93LiAqLworICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKK30KKworCisvKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfc3RhcnRfb3V0cHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2Nhbl9udW1iZXIpCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSAmJgorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBMaW1pdCBzY2FuIG51bWJlciB0byB2YWxpZCByYW5nZSAqLworICBpZiAoc2Nhbl9udW1iZXIgPD0gMCkKKyAgICBzY2FuX251bWJlciA9IDE7CisgIGlmIChjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkICYmCisgICAgICBzY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKKyAgICBzY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKKyAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IHNjYW5fbnVtYmVyOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgcmVhbCBwYXNzICovCisgIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhZnRlciBhbiBvdXRwdXQgcGFzcyBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLgorICoKKyAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuZGVkLiAgVGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlIGluc3BlY3RlZCBvbmx5IGlmCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfZmluaXNoX291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgLyogVGVybWluYXRlIHRoaXMgcGFzcy4gKi8KKyAgICAvKiBXZSBkbyBub3QgcmVxdWlyZSB0aGUgd2hvbGUgcGFzcyB0byBoYXZlIGJlZW4gY29tcGxldGVkLiAqLworICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGUE9TVDsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZQT1NUKSB7CisgICAgLyogQlVGUE9TVCA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIH0KKyAgLyogUmVhZCBtYXJrZXJzIGxvb2tpbmcgZm9yIFNPUyBvciBFT0kgKi8KKyAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCisJICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLworICB9CisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL2pkYXRhZHN0LmMgYi9qcGVnL2pkYXRhZHN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmNmZiMAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRhdGFkc3QuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIGpkYXRhZHN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21wcmVzc2lvbiBkYXRhIGRlc3RpbmF0aW9uIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogZW1pdHRpbmcgSlBFRyBkYXRhIHRvIGEgZmlsZSAob3IgYW55IHN0ZGlvIHN0cmVhbSkuICBXaGlsZSB0aGVzZSByb3V0aW5lcworICogYXJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgYXBwbGljYXRpb25zLCBzb21lIHdpbGwgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQKKyAqIGRlc3RpbmF0aW9uIG1hbmFnZXIuCisgKiBJTVBPUlRBTlQ6IHdlIGFzc3VtZSB0aGF0IGZ3cml0ZSgpIHdpbGwgY29ycmVjdGx5IHRyYW5zY3JpYmUgYW4gYXJyYXkgb2YKKyAqIEpPQ1RFVHMgaW50byA4LWJpdC13aWRlIGVsZW1lbnRzIG9uIGV4dGVybmFsIHN0b3JhZ2UuICBJZiBjaGFyIGlzIHdpZGVyCisgKiB0aGFuIDggYml0cyBvbiB5b3VyIG1hY2hpbmUsIHlvdSBtYXkgbmVlZCB0byBkbyBzb21lIHR3ZWFraW5nLgorICovCisKKy8qIHRoaXMgaXMgbm90IGEgY29yZSBsaWJyYXJ5IG1vZHVsZSwgc28gaXQgZG9lc24ndCBkZWZpbmUgSlBFR19JTlRFUk5BTFMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIKKworCisvKiBFeHBhbmRlZCBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3Igc3RkaW8gb3V0cHV0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEZJTEUgKiBvdXRmaWxlOwkJLyogdGFyZ2V0IHN0cmVhbSAqLworICBKT0NURVQgKiBidWZmZXI7CQkvKiBzdGFydCBvZiBidWZmZXIgKi8KK30gbXlfZGVzdGluYXRpb25fbWdyOworCit0eXBlZGVmIG15X2Rlc3RpbmF0aW9uX21nciAqIG15X2Rlc3RfcHRyOworCisjZGVmaW5lIE9VVFBVVF9CVUZfU0laRSAgNDA5NgkvKiBjaG9vc2UgYW4gZWZmaWNpZW50bHkgZndyaXRlJ2FibGUgc2l6ZSAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcworICogYmVmb3JlIGFueSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbml0X2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdCA9IChteV9kZXN0X3B0cikgY2luZm8tPmRlc3Q7CisKKyAgLyogQWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIgLS0tIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiBkb25lIHdpdGggaW1hZ2UgKi8KKyAgZGVzdC0+YnVmZmVyID0gKEpPQ1RFVCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIE9VVFBVVF9CVUZfU0laRSAqIFNJWkVPRihKT0NURVQpKTsKKworICBkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPmJ1ZmZlcjsKKyAgZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyID0gT1VUUFVUX0JVRl9TSVpFOworfQorCisKKy8qCisgKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBmaWxscyB1cC4KKyAqCisgKiBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgdGhpcyBzaG91bGQgd3JpdGUgdGhlIGVudGlyZSBvdXRwdXQgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9vdXRwdXRfYnl0ZSAmIGZyZWVfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZHVtcGVkLgorICoKKyAqIEluIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYWJsZSB0byBzdXNwZW5kIGNvbXByZXNzaW9uIGR1ZSB0byBvdXRwdXQKKyAqIG92ZXJydW4sIGEgRkFMU0UgcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgY2Fubm90IGJlIGVtcHRpZWQgbm93LgorICogSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjb21wcmVzc29yIHdpbGwgcmV0dXJuIHRvIGl0cyBjYWxsZXIgKHBvc3NpYmx5IHdpdGgKKyAqIGFuIGluZGljYXRpb24gdGhhdCBpdCBoYXMgbm90IGFjY2VwdGVkIGFsbCB0aGUgc3VwcGxpZWQgc2NhbmxpbmVzKS4gIFRoZQorICogYXBwbGljYXRpb24gc2hvdWxkIHJlc3VtZSBjb21wcmVzc2lvbiBhZnRlciBpdCBoYXMgbWFkZSBtb3JlIHJvb20gaW4gdGhlCisgKiBvdXRwdXQgYnVmZmVyLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzdWJzdGFudGlhbCByZXN0cmljdGlvbnMgb24gdGhlIHVzZSBvZgorICogc3VzcGVuc2lvbiAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorICoKKyAqIFdoZW4gc3VzcGVuZGluZywgdGhlIGNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X291dHB1dF9ieXRlICYgZnJlZV9pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGFmdGVyIHJlc3VtcHRpb24sIHNvIGRvIG5vdAorICogd3JpdGUgaXQgb3V0IHdoZW4gZW1wdHlpbmcgdGhlIGJ1ZmZlciBleHRlcm5hbGx5LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW1wdHlfb3V0cHV0X2J1ZmZlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworCisgIGlmIChKRldSSVRFKGRlc3QtPm91dGZpbGUsIGRlc3QtPmJ1ZmZlciwgT1VUUFVUX0JVRl9TSVpFKSAhPQorICAgICAgKHNpemVfdCkgT1VUUFVUX0JVRl9TSVpFKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisKKyAgZGVzdC0+cHViLm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5idWZmZXI7CisgIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlciA9IE9VVFBVVF9CVUZfU0laRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogVGVybWluYXRlIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfY29tcHJlc3MKKyAqIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uICBVc3VhbGx5IG5lZWRzIHRvIGZsdXNoIGJ1ZmZlci4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworICBzaXplX3QgZGF0YWNvdW50ID0gT1VUUFVUX0JVRl9TSVpFIC0gZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFdyaXRlIGFueSBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyICovCisgIGlmIChkYXRhY291bnQgPiAwKSB7CisgICAgaWYgKEpGV1JJVEUoZGVzdC0+b3V0ZmlsZSwgZGVzdC0+YnVmZmVyLCBkYXRhY291bnQpICE9IGRhdGFjb3VudCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisgIH0KKyAgZmZsdXNoKGRlc3QtPm91dGZpbGUpOworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGlmIChmZXJyb3IoZGVzdC0+b3V0ZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtLgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBvcGVuZWQgdGhlIHN0cmVhbSwgYW5kIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgY2xvc2luZyBpdCBhZnRlciBmaW5pc2hpbmcgY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX2Rlc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogb3V0ZmlsZSkKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdDsKKworICAvKiBUaGUgZGVzdGluYXRpb24gb2JqZWN0IGlzIG1hZGUgcGVybWFuZW50IHNvIHRoYXQgbXVsdGlwbGUgSlBFRyBpbWFnZXMKKyAgICogY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgZmlsZSB3aXRob3V0IHJlLWV4ZWN1dGluZyBqcGVnX3N0ZGlvX2Rlc3QuCisgICAqIFRoaXMgbWFrZXMgaXQgZGFuZ2Vyb3VzIHRvIHVzZSB0aGlzIG1hbmFnZXIgYW5kIGEgZGlmZmVyZW50IGRlc3RpbmF0aW9uCisgICAqIG1hbmFnZXIgc2VyaWFsbHkgd2l0aCB0aGUgc2FtZSBKUEVHIG9iamVjdCwgYmVjYXVzZSB0aGVpciBwcml2YXRlIG9iamVjdAorICAgKiBzaXplcyBtYXkgYmUgZGlmZmVyZW50LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPmRlc3QgPT0gTlVMTCkgewkvKiBmaXJzdCB0aW1lIGZvciB0aGlzIEpQRUcgb2JqZWN0PyAqLworICAgIGNpbmZvLT5kZXN0ID0gKHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCisJCQkJICBTSVpFT0YobXlfZGVzdGluYXRpb25fbWdyKSk7CisgIH0KKworICBkZXN0ID0gKG15X2Rlc3RfcHRyKSBjaW5mby0+ZGVzdDsKKyAgZGVzdC0+cHViLmluaXRfZGVzdGluYXRpb24gPSBpbml0X2Rlc3RpbmF0aW9uOworICBkZXN0LT5wdWIuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IGVtcHR5X291dHB1dF9idWZmZXI7CisgIGRlc3QtPnB1Yi50ZXJtX2Rlc3RpbmF0aW9uID0gdGVybV9kZXN0aW5hdGlvbjsKKyAgZGVzdC0+b3V0ZmlsZSA9IG91dGZpbGU7Cit9CmRpZmYgLS1naXQgYS9qcGVnL2pkYXRhc3JjLmMgYi9qcGVnL2pkYXRhc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjNzUyYgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRhdGFzcmMuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIGpkYXRhc3JjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNvbXByZXNzaW9uIGRhdGEgc291cmNlIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogcmVhZGluZyBKUEVHIGRhdGEgZnJvbSBhIGZpbGUgKG9yIGFueSBzdGRpbyBzdHJlYW0pLiAgV2hpbGUgdGhlc2Ugcm91dGluZXMKKyAqIGFyZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgc29tZSB3aWxsIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50CisgKiBzb3VyY2UgbWFuYWdlci4KKyAqIElNUE9SVEFOVDogd2UgYXNzdW1lIHRoYXQgZnJlYWQoKSB3aWxsIGNvcnJlY3RseSB0cmFuc2NyaWJlIGFuIGFycmF5IG9mCisgKiBKT0NURVRzIGZyb20gOC1iaXQtd2lkZSBlbGVtZW50cyBvbiBleHRlcm5hbCBzdG9yYWdlLiAgSWYgY2hhciBpcyB3aWRlcgorICogdGhhbiA4IGJpdHMgb24geW91ciBtYWNoaW5lLCB5b3UgbWF5IG5lZWQgdG8gZG8gc29tZSB0d2Vha2luZy4KKyAqLworCisvKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamVycm9yLmgiCisKKworLyogRXhwYW5kZWQgZGF0YSBzb3VyY2Ugb2JqZWN0IGZvciBzdGRpbyBpbnB1dCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgRklMRSAqIGluZmlsZTsJCS8qIHNvdXJjZSBzdHJlYW0gKi8KKyAgSk9DVEVUICogYnVmZmVyOwkJLyogc3RhcnQgb2YgYnVmZmVyICovCisgIGJvb2xlYW4gc3RhcnRfb2ZfZmlsZTsJLyogaGF2ZSB3ZSBnb3R0ZW4gYW55IGRhdGEgeWV0PyAqLworfSBteV9zb3VyY2VfbWdyOworCit0eXBlZGVmIG15X3NvdXJjZV9tZ3IgKiBteV9zcmNfcHRyOworCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICA0MDk2CS8qIGNob29zZSBhbiBlZmZpY2llbnRseSBmcmVhZCdhYmxlIHNpemUgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyCisgKiBiZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgcmVhZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2luaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9zcmNfcHRyIHNyYyA9IChteV9zcmNfcHRyKSBjaW5mby0+c3JjOworCisgIC8qIFdlIHJlc2V0IHRoZSBlbXB0eS1pbnB1dC1maWxlIGZsYWcgZm9yIGVhY2ggaW1hZ2UsCisgICAqIGJ1dCB3ZSBkb24ndCBjbGVhciB0aGUgaW5wdXQgYnVmZmVyLgorICAgKiBUaGlzIGlzIGNvcnJlY3QgYmVoYXZpb3IgZm9yIHJlYWRpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gb25lIHNvdXJjZS4KKyAgICovCisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IFRSVUU7Cit9CisKKworLyoKKyAqIEZpbGwgdGhlIGlucHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBpcyBlbXB0aWVkLgorICoKKyAqIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCB0aGlzIHNob3VsZCByZWFkIGZyZXNoIGRhdGEgaW50byB0aGUgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9pbnB1dF9ieXRlICYgYnl0ZXNfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcmVsb2FkZWQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvCisgKiBmaWxsIHRoZSBidWZmZXIgZW50aXJlbHksIG9ubHkgdG8gb2J0YWluIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUuCisgKgorICogVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBFT0YgcmV0dXJuLiAgSWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbgorICogcmVhY2hlZCwgdGhlIHJvdXRpbmUgaGFzIGEgY2hvaWNlIG9mIEVSUkVYSVQoKSBvciBpbnNlcnRpbmcgZmFrZSBkYXRhIGludG8KKyAqIHRoZSBidWZmZXIuICBJbiBtb3N0IGNhc2VzLCBnZW5lcmF0aW5nIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpbnNlcnRpbmcgYQorICogZmFrZSBFT0kgbWFya2VyIGlzIHRoZSBiZXN0IGNvdXJzZSBvZiBhY3Rpb24gLS0tIHRoaXMgd2lsbCBhbGxvdyB0aGUKKyAqIGRlY29tcHJlc3NvciB0byBvdXRwdXQgaG93ZXZlciBtdWNoIG9mIHRoZSBpbWFnZSBpcyB0aGVyZS4gIEhvd2V2ZXIsCisgKiB0aGUgcmVzdWx0aW5nIGVycm9yIG1lc3NhZ2UgaXMgbWlzbGVhZGluZyBpZiB0aGUgcmVhbCBwcm9ibGVtIGlzIGFuIGVtcHR5CisgKiBpbnB1dCBmaWxlLCBzbyB3ZSBoYW5kbGUgdGhhdCBjYXNlIHNwZWNpYWxseS4KKyAqCisgKiBJbiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFibGUgdG8gc3VzcGVuZCBjb21wcmVzc2lvbiBkdWUgdG8gaW5wdXQKKyAqIG5vdCBiZWluZyBhdmFpbGFibGUgeWV0LCBhIEZBTFNFIHJldHVybiBpbmRpY2F0ZXMgdGhhdCBubyBtb3JlIGRhdGEgY2FuIGJlCisgKiBvYnRhaW5lZCByaWdodCBub3csIGJ1dCBtb3JlIG1heSBiZSBmb3J0aGNvbWluZyBsYXRlci4gIEluIHRoaXMgc2l0dWF0aW9uLAorICogdGhlIGRlY29tcHJlc3NvciB3aWxsIHJldHVybiB0byBpdHMgY2FsbGVyICh3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlCisgKiBudW1iZXIgb2Ygc2NhbmxpbmVzIGl0IGhhcyByZWFkLCBpZiBhbnkpLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXN1bWUKKyAqIGRlY29tcHJlc3Npb24gYWZ0ZXIgaXQgaGFzIGxvYWRlZCBtb3JlIGRhdGEgaW50byB0aGUgaW5wdXQgYnVmZmVyLiAgTm90ZQorICogdGhhdCB0aGVyZSBhcmUgc3Vic3RhbnRpYWwgcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ugb2Ygc3VzcGVuc2lvbiAtLS0gc2VlCisgKiB0aGUgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBXaGVuIHN1c3BlbmRpbmcsIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X2lucHV0X2J5dGUgJiBieXRlc19pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCBtdXN0IGJlIHJlc2Nhbm5lZCBhZnRlciByZXN1bXB0aW9uLCBzbyBtb3ZlIGl0IHRvCisgKiB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlciByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGl0LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNpemVfdCBuYnl0ZXM7CisKKyAgbmJ5dGVzID0gSkZSRUFEKHNyYy0+aW5maWxlLCBzcmMtPmJ1ZmZlciwgSU5QVVRfQlVGX1NJWkUpOworCisgIGlmIChuYnl0ZXMgPD0gMCkgeworICAgIGlmIChzcmMtPnN0YXJ0X29mX2ZpbGUpCS8qIFRyZWF0IGVtcHR5IGlucHV0IGZpbGUgYXMgZmF0YWwgZXJyb3IgKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOworICAgIFdBUk5NUyhjaW5mbywgSldSTl9KUEVHX0VPRik7CisgICAgLyogSW5zZXJ0IGEgZmFrZSBFT0kgbWFya2VyICovCisgICAgc3JjLT5idWZmZXJbMF0gPSAoSk9DVEVUKSAweEZGOworICAgIHNyYy0+YnVmZmVyWzFdID0gKEpPQ1RFVCkgSlBFR19FT0k7CisgICAgbmJ5dGVzID0gMjsKKyAgfQorCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IHNyYy0+YnVmZmVyOworICBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXIgPSBuYnl0ZXM7CisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBTa2lwIGRhdGEgLS0tIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCisgKiB1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLgorICoKKyAqIFdyaXRlcnMgb2Ygc3VzcGVuZGFibGUtaW5wdXQgYXBwbGljYXRpb25zIG11c3Qgbm90ZSB0aGF0IHNraXBfaW5wdXRfZGF0YQorICogaXMgbm90IGdyYW50ZWQgdGhlIHJpZ2h0IHRvIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybi4gIElmIHRoZSBza2lwIGV4dGVuZHMKKyAqIGJleW9uZCB0aGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciwgdGhlIGJ1ZmZlciBjYW4gYmUgbWFya2VkIGVtcHR5IHNvCisgKiB0aGF0IHRoZSBuZXh0IHJlYWQgd2lsbCBjYXVzZSBhIGZpbGxfaW5wdXRfYnVmZmVyIGNhbGwgdGhhdCBjYW4gc3VzcGVuZC4KKyAqIEFycmFuZ2luZyBmb3IgYWRkaXRpb25hbCBieXRlcyB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIHJlbG9hZGluZyB0aGUgaW5wdXQKKyAqIGJ1ZmZlciBpcyB0aGUgYXBwbGljYXRpb24gd3JpdGVyJ3MgcHJvYmxlbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3NraXBfaW5wdXRfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisKKyAgLyogSnVzdCBhIGR1bWIgaW1wbGVtZW50YXRpb24gZm9yIG5vdy4gIENvdWxkIHVzZSBmc2VlaygpIGV4Y2VwdAorICAgKiBpdCBkb2Vzbid0IHdvcmsgb24gcGlwZXMuICBOb3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aAorICAgKiBhbnkgdHJvdWJsZSBhbnl3YXkgLS0tIGxhcmdlIHNraXBzIGFyZSBpbmZyZXF1ZW50LgorICAgKi8KKyAgaWYgKG51bV9ieXRlcyA+IDApIHsKKyAgICB3aGlsZSAobnVtX2J5dGVzID4gKGxvbmcpIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlcikgeworICAgICAgbnVtX2J5dGVzIC09IChsb25nKSBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXI7CisgICAgICAodm9pZCkgZmlsbF9pbnB1dF9idWZmZXIoY2luZm8pOworICAgICAgLyogbm90ZSB3ZSBhc3N1bWUgdGhhdCBmaWxsX2lucHV0X2J1ZmZlciB3aWxsIG5ldmVyIHJldHVybiBGQUxTRSwKKyAgICAgICAqIHNvIHN1c3BlbnNpb24gbmVlZCBub3QgYmUgaGFuZGxlZC4KKyAgICAgICAqLworICAgIH0KKyAgICBzcmMtPnB1Yi5uZXh0X2lucHV0X2J5dGUgKz0gKHNpemVfdCkgbnVtX2J5dGVzOworICAgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciAtPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisgIH0KK30KKworCisvKgorICogQW4gYWRkaXRpb25hbCBtZXRob2QgdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyBpcyB0aGUKKyAqIHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gdGhlIHByZXNlbmNlIG9mIFJTVCBtYXJrZXJzLgorICogRm9yIHRoZSBtb21lbnQsIHRoaXMgc291cmNlIG1vZHVsZSBqdXN0IHVzZXMgdGhlIGRlZmF1bHQgcmVzeW5jIG1ldGhvZAorICogcHJvdmlkZWQgYnkgdGhlIEpQRUcgbGlicmFyeS4gIFRoYXQgbWV0aG9kIGFzc3VtZXMgdGhhdCBubyBiYWNrdHJhY2tpbmcKKyAqIGlzIHBvc3NpYmxlLgorICovCisKKworLyoKKyAqIFRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCisgKiBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgbmVjZXNzYXJ5IGhlcmUgKi8KK30KKworCisvKgorICogUHJlcGFyZSBmb3IgaW5wdXQgZnJvbSBhIHN0ZGlvIHN0cmVhbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBzdHJlYW0sIGFuZCBpcyByZXNwb25zaWJsZQorICogZm9yIGNsb3NpbmcgaXQgYWZ0ZXIgZmluaXNoaW5nIGRlY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX3NyYyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgbXlfc3JjX3B0ciBzcmM7CisKKyAgLyogVGhlIHNvdXJjZSBvYmplY3QgYW5kIGlucHV0IGJ1ZmZlciBhcmUgbWFkZSBwZXJtYW5lbnQgc28gdGhhdCBhIHNlcmllcworICAgKiBvZiBKUEVHIGltYWdlcyBjYW4gYmUgcmVhZCBmcm9tIHRoZSBzYW1lIGZpbGUgYnkgY2FsbGluZyBqcGVnX3N0ZGlvX3NyYworICAgKiBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgb25lLiAgKElmIHdlIGRpc2NhcmRlZCB0aGUgYnVmZmVyIGF0IHRoZSBlbmQgb2YKKyAgICogb25lIGltYWdlLCB3ZSdkIGxpa2VseSBsb3NlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBvbmUuKQorICAgKiBUaGlzIG1ha2VzIGl0IHVuc2FmZSB0byB1c2UgdGhpcyBtYW5hZ2VyIGFuZCBhIGRpZmZlcmVudCBzb3VyY2UKKyAgICogbWFuYWdlciBzZXJpYWxseSB3aXRoIHRoZSBzYW1lIEpQRUcgb2JqZWN0LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPnNyYyA9PSBOVUxMKSB7CS8qIGZpcnN0IHRpbWUgZm9yIHRoaXMgSlBFRyBvYmplY3Q/ICovCisgICAgY2luZm8tPnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIFNJWkVPRihteV9zb3VyY2VfbWdyKSk7CisgICAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgICAgc3JjLT5idWZmZXIgPSAoSk9DVEVUICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIElOUFVUX0JVRl9TSVpFICogU0laRU9GKEpPQ1RFVCkpOworICB9CisKKyAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNyYy0+cHViLmluaXRfc291cmNlID0gaW5pdF9zb3VyY2U7CisgIHNyYy0+cHViLmZpbGxfaW5wdXRfYnVmZmVyID0gZmlsbF9pbnB1dF9idWZmZXI7CisgIHNyYy0+cHViLnNraXBfaW5wdXRfZGF0YSA9IHNraXBfaW5wdXRfZGF0YTsKKyAgc3JjLT5wdWIucmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OyAvKiB1c2UgZGVmYXVsdCBtZXRob2QgKi8KKyAgc3JjLT5wdWIudGVybV9zb3VyY2UgPSB0ZXJtX3NvdXJjZTsKKyAgc3JjLT5pbmZpbGUgPSBpbmZpbGU7CisgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IDA7IC8qIGZvcmNlcyBmaWxsX2lucHV0X2J1ZmZlciBvbiBmaXJzdCByZWFkICovCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7IC8qIHVudGlsIGJ1ZmZlciBsb2FkZWQgKi8KK30KZGlmZiAtLWdpdCBhL2pwZWcvamRjb2VmY3QuYyBiL2pwZWcvamRjb2VmY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU5NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qZGNvZWZjdC5jCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoKKyAqIGpkY29lZmN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGRlY29tcHJlc3Npb24uCisgKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBkZWNvbXByZXNzb3IgcHJvcGVyLgorICogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBsaWVzIGJldHdlZW4gZW50cm9weSBkZWNvZGluZyBhbmQgaW52ZXJzZS1EQ1Qgc3RlcHMuCisgKgorICogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhpcyBjb250cm9sbGVyIGlzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbgorICogaW5wdXQtb3JpZW50ZWQgcHJvY2Vzc2luZyBhbmQgb3V0cHV0LW9yaWVudGVkIHByb2Nlc3NpbmcuCisgKiBBbHNvLCB0aGUgaW5wdXQgc2lkZSAob25seSkgaXMgdXNlZCB3aGVuIHJlYWRpbmcgYSBmaWxlIGZvciB0cmFuc2NvZGluZy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKy8qIEJsb2NrIHNtb290aGluZyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHByb2dyZXNzaXZlIEpQRUcsIHNvOiAqLworI2lmbmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorI3VuZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyNlbmRpZgorCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFRoZXNlIHZhcmlhYmxlcyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBpbnB1dCBzaWRlLiAqLworICAvKiBjaW5mby0+aW5wdXRfaU1DVV9yb3cgaXMgYWxzbyB1c2VkIGZvciB0aGlzLiAqLworICBKRElNRU5TSU9OIE1DVV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBUaGUgb3V0cHV0IHNpZGUncyBsb2NhdGlvbiBpcyByZXByZXNlbnRlZCBieSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93LiAqLworCisgIC8qIEluIHNpbmdsZS1wYXNzIG1vZGVzLCBpdCdzIHN1ZmZpY2llbnQgdG8gYnVmZmVyIGp1c3Qgb25lIE1DVS4KKyAgICogV2UgYWxsb2NhdGUgYSB3b3Jrc3BhY2Ugb2YgRF9NQVhfQkxPQ0tTX0lOX01DVSBjb2VmZmljaWVudCBibG9ja3MsCisgICAqIGFuZCBsZXQgdGhlIGVudHJvcHkgZGVjb2RlciB3cml0ZSBpbnRvIHRoYXQgd29ya3NwYWNlIGVhY2ggdGltZS4KKyAgICogKE9uIDgweDg2LCB0aGUgd29ya3NwYWNlIGlzIEZBUiBldmVuIHRob3VnaCBpdCdzIG5vdCByZWFsbHkgdmVyeSBiaWc7CisgICAqIHRoaXMgaXMgdG8ga2VlcCB0aGUgbW9kdWxlIGludGVyZmFjZXMgdW5jaGFuZ2VkIHdoZW4gYSBsYXJnZSBjb2VmZmljaWVudAorICAgKiBidWZmZXIgaXMgbmVjZXNzYXJ5LikKKyAgICogSW4gbXVsdGktcGFzcyBtb2RlcywgdGhpcyBhcnJheSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgTUNVJ3MgYmxvY2tzCisgICAqIHdpdGhpbiB0aGUgdmlydHVhbCBhcnJheXM7IGl0IGlzIHVzZWQgb25seSBieSB0aGUgaW5wdXQgc2lkZS4KKyAgICovCisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgIC8qIEluIG11bHRpLXBhc3MgbW9kZXMsIHdlIG5lZWQgYSB2aXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107CisjZW5kaWYKKworI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyAgLyogV2hlbiBkb2luZyBibG9jayBzbW9vdGhpbmcsIHdlIGxhdGNoIGNvZWZmaWNpZW50IEFsIHZhbHVlcyBoZXJlICovCisgIGludCAqIGNvZWZfYml0c19sYXRjaDsKKyNkZWZpbmUgU0FWRURfQ09FRlMgIDYJCS8qIHdlIHNhdmUgY29lZl9iaXRzWzAuLjVdICovCisjZW5kaWYKK30gbXlfY29lZl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19vbmVwYXNzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKK01FVEhPRERFRihpbnQpIGRlY29tcHJlc3NfZGF0YQorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7CisjZW5kaWYKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECitMT0NBTChib29sZWFuKSBzbW9vdGhpbmdfb2sgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX3Ntb290aF9kYXRhCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKKyNlbmRpZgorCisKK0xPQ0FMKHZvaWQpCitzdGFydF9pTUNVX3JvdyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93IChpbnB1dCBzaWRlKSAqLworeworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKworICAvKiBJbiBhbiBpbnRlcmxlYXZlZCBzY2FuLCBhbiBNQ1Ugcm93IGlzIHRoZSBzYW1lIGFzIGFuIGlNQ1Ugcm93LgorICAgKiBJbiBhIG5vbmludGVybGVhdmVkIHNjYW4sIGFuIGlNQ1Ugcm93IGhhcyB2X3NhbXBfZmFjdG9yIE1DVSByb3dzLgorICAgKiBCdXQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHByb2Nlc3Mgb25seSB3aGF0J3MgbGVmdC4KKyAgICovCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA+IDEpIHsKKyAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSAxOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCAoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cy0xKSkKKyAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT52X3NhbXBfZmFjdG9yOworICAgIGVsc2UKKyAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT5sYXN0X3Jvd19oZWlnaHQ7CisgIH0KKworICBjb2VmLT5NQ1VfY3RyID0gMDsKKyAgY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0gMDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gaW5wdXQgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfaW5wdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gMDsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiBvdXRwdXQgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfb3V0cHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKworICAvKiBJZiBtdWx0aXBhc3MsIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRvIHVzZSBibG9jayBzbW9vdGhpbmcgb24gdGhpcyBwYXNzICovCisgIGlmIChjb2VmLT5wdWIuY29lZl9hcnJheXMgIT0gTlVMTCkgeworICAgIGlmIChjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nICYmIHNtb290aGluZ19vayhjaW5mbykpCisgICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19zbW9vdGhfZGF0YTsKKyAgICBlbHNlCisgICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19kYXRhOworICB9CisjZW5kaWYKKyAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IDA7Cit9CisKKworLyoKKyAqIERlY29tcHJlc3MgYW5kIHJldHVybiBzb21lIGRhdGEgaW4gdGhlIHNpbmdsZS1wYXNzIGNhc2UuCisgKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCisgKiBJbnB1dCBhbmQgb3V0cHV0IG11c3QgcnVuIGluIGxvY2tzdGVwIHNpbmNlIHdlIGhhdmUgb25seSBhIG9uZS1NQ1UgYnVmZmVyLgorICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfUk9XX0NPTVBMRVRFRCwgSlBFR19TQ0FOX0NPTVBMRVRFRCwgb3IgSlBFR19TVVNQRU5ERUQuCisgKgorICogTkI6IG91dHB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UsCisgKiB3aGljaCB3ZSBpbmRleCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIFNPRiBwb3NpdGlvbi4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19vbmVwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCB1c2VmdWxfd2lkdGg7CisgIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2wsIG91dHB1dF9jb2w7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7CisKKyNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKKyAgICBsYXN0X01DVV9jb2wgPQorICAgICAgICAoY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fcmlnaHRfYm91bmRhcnkgLQorICAgICAgICAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fbGVmdF9ib3VuZGFyeSkgLSAxOworICB9CisjZW5kaWYKKworICAvKiBMb29wIHRvIHByb2Nlc3MgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIFRyeSB0byBmZXRjaCBhbiBNQ1UuICBFbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLiAqLworICAgICAgaWYgKE1DVV9jb2xfbnVtIDwgY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXApIHsKKyAgICAgICAgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYpIChjaW5mbyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyWzBdLAorCQkoc2l6ZV90KSAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSkpOworICAgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJICAvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCSAgY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOworCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCisgICAgICAgKiBXZSBza2lwIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyAoYnV0IGJsa24gZ2V0cworICAgICAgICogaW5jcmVtZW50ZWQgcGFzdCB0aGVtISkuICBOb3RlIHRoZSBpbm5lciBsb29wIHJlbGllcyBvbiBoYXZpbmcKKyAgICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCisgICAgICAgKi8KKyAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwkvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKwlpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisJICBibGtuICs9IGNvbXBwdHItPk1DVV9ibG9ja3M7CisJICBjb250aW51ZTsKKwl9CisJaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKwl1c2VmdWxfd2lkdGggPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCisJCQkJCQkgICAgOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdICsKKwkgIHlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93IHx8CisJICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKKwkgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2NvbDsKKwkgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCB1c2VmdWxfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgICAgKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLAorCQkgICAgICAgIChKQ09FRlBUUikgY29lZi0+TUNVX2J1ZmZlcltibGtuK3hpbmRleF0sCisJCSAgICAgICAgb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7CisJICAgICAgb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJICAgIH0KKwkgIH0KKwkgIGJsa24gKz0gY29tcHB0ci0+TUNVX3dpZHRoOworCSAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgY2luZm8tPm91dHB1dF9pTUNVX3JvdysrOworICBpZiAoKysoY2luZm8tPmlucHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKKyAgICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisgICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIHNjYW4gKi8KKyAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOworICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKK30KKworCisvKgorICogRHVtbXkgY29uc3VtZS1pbnB1dCByb3V0aW5lIGZvciBzaW5nbGUtcGFzcyBvcGVyYXRpb24uCisgKi8KKworTUVUSE9EREVGKGludCkKK2R1bW15X2NvbnN1bWVfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwkvKiBBbHdheXMgaW5kaWNhdGUgbm90aGluZyB3YXMgZG9uZSAqLworfQorCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisvKgorICogQ29uc3VtZSBpbnB1dCBkYXRhIGFuZCBzdG9yZSBpdCBpbiB0aGUgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIuCisgKiBXZSByZWFkIGFzIG11Y2ggYXMgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpIHBlciBjYWxsLAorICogaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjYW4uCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqLworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OworICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBmb3IgdGhlIGNvbXBvbmVudHMgdXNlZCBpbiB0aGlzIHNjYW4uICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBidWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCisgICAgICAgY2luZm8tPnRpbGVfZGVjb2RlID8gMCA6IGNpbmZvLT5pbnB1dF9pTUNVX3JvdyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgIC8qIE5vdGU6IGVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQsCisgICAgICogYnV0IHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBtZW1vcnkgbWFuYWdlcgorICAgICAqIGJlY2F1c2Ugd2UgcmVxdWVzdGVkIGEgcHJlLXplcm9lZCBhcnJheS4KKyAgICAgKi8KKyAgfQorICB1bnNpZ25lZCBpbnQgTUNVc19wZXJfcm93ID0gY2luZm8tPk1DVXNfcGVyX3JvdzsKKyNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKKyAgICBpbnQgaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGg7CisgICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgeworICAgICAgLy8gSW50ZXJsZWF2ZWQKKyAgICAgIGlNQ1Vfd2lkdGhfVG9fTUNVX3dpZHRoID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm9uLWludGVydmxlYXZlZAorICAgICAgaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGggPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+aF9zYW1wX2ZhY3RvcjsKKyAgICB9CisgICAgTUNVc19wZXJfcm93ID0gam1pbihNQ1VzX3Blcl9yb3csCisgICAgICAgIChjaW5mby0+Y29lZi0+Y29sdW1uX3JpZ2h0X2JvdW5kYXJ5IC0gY2luZm8tPmNvZWYtPmNvbHVtbl9sZWZ0X2JvdW5kYXJ5KQorICAgICAgICAqIGNpbmZvLT5lbnRyb3B5LT5pbmRleC0+TUNVX3NhbXBsZV9zaXplICogaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGgpOworICB9CisjZW5kaWYKKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgIC8vIGNvbmZpZ3VyZSBodWZmbWFuIGRlY29kZXIKKyNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgeworICAgICAgaHVmZm1hbl9zY2FuX2hlYWRlciBzY2FuX2hlYWRlciA9CisgICAgICAgICAgICBjaW5mby0+ZW50cm9weS0+aW5kZXgtPnNjYW5bY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyXTsKKyAgICAgIGludCBjb2xfb2Zmc2V0ID0gY2luZm8tPmNvZWYtPmNvbHVtbl9sZWZ0X2JvdW5kYXJ5OworICAgICAgKCpjaW5mby0+ZW50cm9weS0+Y29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcikgKGNpbmZvLAorICAgICAgICAgICAgICBzY2FuX2hlYWRlci5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XQorICAgICAgICAgICAgICBbY29sX29mZnNldCArIHlvZmZzZXQgKiBzY2FuX2hlYWRlci5NQ1VzX3Blcl9yb3ddKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIHplcm8gYWxsIGJsb2NrcworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IE1DVXNfcGVyX3JvdzsKKyAgICAgICAgICBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAgICAgc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICAgIGZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKyAgICAgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7CisgICAgICAgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisgICAgICAgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisjaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQorICAgICAgICAgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSAmJiBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gMCkgeworICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHByZS16ZXJvIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24tMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoU0laRU9GKEpCTE9DSykpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisKKyAgICAgIC8qIFRyeSB0byBmZXRjaCB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgeworICAgICAgICAvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisgICAgICAgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisgICAgICAgIGNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKKyAgICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKy8qCisgKiBDb25zdW1lIGlucHV0IGRhdGEgYW5kIHN0b3JlIGl0IGluIHRoZSBjb2VmZmljaWVudCBidWZmZXIuCisgKiBSZWFkIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KSBwZXIgY2FsbC4KKyAqLworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9kYXRhX211bHRpX3NjYW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZtYW5faW5kZXggKmluZGV4ID0gY2luZm8tPmVudHJvcHktPmluZGV4OworICBpbnQgaSwgcmV0Y29kZSwgY2k7CisgIGludCBtY3UgPSBjaW5mby0+aW5wdXRfaU1DVV9yb3c7CisgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOworICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPnNjYW5fY291bnQ7IGkrKykgeworICAgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbywgaW5kZXgtPnNjYW5baV0uYml0c3RyZWFtX29mZnNldCk7CisgICAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IG1jdTsKKyAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgICAgLy8gQ29uc3VtZSBTT1MgYW5kIERIVCBoZWFkZXJzCisgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX21hcmtlcnMpIChjaW5mbywgaW5kZXgsIGkpOworICAgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IG1jdTsKKyAgICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSBpOworICAgIGNpbmZvLT5lbnRyb3B5LT5pbmRleCA9IGluZGV4OworICAgIC8vIENvbnN1bWUgc2NhbiBibG9jayBkYXRhCisgICAgY29uc3VtZV9kYXRhKGNpbmZvKTsKKyAgfQorICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSBtY3UgKyAxOworICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSAwOworICBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gMDsKKyAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKK30KKworLyoKKyAqIFNhbWUgYXMgY29uc3VtZV9kYXRhLCBleHBlY3QgZm9yIHNhdmluZyB0aGUgSHVmZm1hbiBkZWNvZGUgaW5mb3JtYXRpb24KKyAqIC0gYml0c3RyZWFtIG9mZnNldCBhbmQgREMgY29lZmZpY2llbnQgdG8gaW5kZXguCisgKi8KKworTUVUSE9EREVGKGludCkKK2NvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4X2Jhc2VsaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IGN1cnJlbnRfc2NhbikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgaW50IGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworCisgIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW5faGVhZGVyID0gaW5kZXgtPnNjYW4gKyBjdXJyZW50X3NjYW47CisgIHNjYW5faGVhZGVyLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisKKyAgc2l6ZV90IGFsbG9jYXRlX3NpemUgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cKKyAgICAgICogamRpdl9yb3VuZF91cChjaW5mby0+TUNVc19wZXJfcm93LCBpbmRleC0+TUNVX3NhbXBsZV9zaXplKQorICAgICAgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSk7CisgIHNjYW5faGVhZGVyLT5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XSA9CisgICAgICAgIChodWZmbWFuX29mZnNldF9kYXRhKiltYWxsb2MoYWxsb2NhdGVfc2l6ZSk7CisgIGluZGV4LT5tZW1fdXNlZCArPSBhbGxvY2F0ZV9zaXplOworCisgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldF9kYXRhID0gc2Nhbl9oZWFkZXItPm9mZnNldFtjaW5mby0+aW5wdXRfaU1DVV9yb3ddOworCisgIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8vIFJlY29yZCBodWZmbWFuIGJpdCBvZmZzZXQKKyAgICAgIGlmIChNQ1VfY29sX251bSAlIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUgPT0gMCkgeworICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgKGNpbmZvLCBvZmZzZXRfZGF0YSk7CisgICAgICAgICsrb2Zmc2V0X2RhdGE7CisgICAgICB9CisKKyAgICAgIC8qIFRyeSB0byBmZXRjaCB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYpIChjaW5mbykpIHsKKyAgICAgICAgLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworICAgICAgICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworICAgICAgICBjb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07CisgICAgICAgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPk1DVV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGlmICgrKyhjaW5mby0+aW5wdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgc2NhbiAqLworICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7CisgIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOworfQorCisvKgorICogU2FtZSBhcyBjb25zdW1lX2RhdGEsIGV4cGVjdCBmb3Igc2F2aW5nIHRoZSBIdWZmbWFuIGRlY29kZSBpbmZvcm1hdGlvbgorICogLSBiaXRzdHJlYW0gb2Zmc2V0IGFuZCBEQyBjb2VmZmljaWVudCB0byBpbmRleC4KKyAqLworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXhfcHJvZ3Jlc3NpdmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgY3VycmVudF9zY2FuKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OworICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgaW50IGZhY3RvciA9IDQ7IC8vIG1heGltdW0gZmFjdG9yIGlzIDQuCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGZhY3RvciA9IGptaW4oZmFjdG9yLCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0tPmhfc2FtcF9mYWN0b3IpOworCisgIGludCBzYW1wbGVfc2l6ZSA9IGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUgKiBmYWN0b3I7CisgIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW5faGVhZGVyID0gaW5kZXgtPnNjYW4gKyBjdXJyZW50X3NjYW47CisgIHNjYW5faGVhZGVyLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgIHNjYW5faGVhZGVyLT5NQ1VzX3Blcl9yb3cgPSBqZGl2X3JvdW5kX3VwKGNpbmZvLT5NQ1VzX3Blcl9yb3csIHNhbXBsZV9zaXplKTsKKyAgc2Nhbl9oZWFkZXItPmNvbXBzX2luX3NjYW4gPSBjaW5mby0+Y29tcHNfaW5fc2NhbjsKKworICBzaXplX3QgYWxsb2NhdGVfc2l6ZSA9IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdworICAgICAgKiBzY2FuX2hlYWRlci0+TUNVc19wZXJfcm93ICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEpOworICBzY2FuX2hlYWRlci0+b2Zmc2V0W2NpbmZvLT5pbnB1dF9pTUNVX3Jvd10gPQorICAgICAgICAoaHVmZm1hbl9vZmZzZXRfZGF0YSopbWFsbG9jKGFsbG9jYXRlX3NpemUpOworICBpbmRleC0+bWVtX3VzZWQgKz0gYWxsb2NhdGVfc2l6ZTsKKworICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXRfZGF0YSA9IHNjYW5faGVhZGVyLT5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XTsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICAwLCAvLyBPbmx5IG5lZWQgb25lIHJvdyBidWZmZXIKKyAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgIH0KKyAgLyogTG9vcCB0byBwcm9jZXNzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLworICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgICAgICAgeW9mZnNldCsrKSB7CisgICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDwgY2luZm8tPk1DVXNfcGVyX3JvdzsKKwkgTUNVX2NvbF9udW0rKykgeworICAgICAgLyogRm9yIGVhY2ggTUNVLCB3ZSBsb29wIHRocm91Z2ggZGlmZmVyZW50IGNvbG9yIGNvbXBvbmVudHMuCisgICAgICAgKiBUaGVuLCBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQgd2Ugd2lsbCBnZXQgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVAorICAgICAgICogYmxvY2tzIGluIHRoZSB2aXJ0dWFsIGJ1ZmZlci4KKyAgICAgICAqLworICAgICAgYmxrbiA9IDA7IC8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICAgIHN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworICAgICAgICAvKiBHZXQgdGhlIGxpc3Qgb2YgcG9pbnRlcnMgdG8gRENUIGJsb2NrcyBpbgorICAgICAgICAgKiB0aGUgdmlydHVhbCBidWZmZXIgaW4gYSBjb2xvciBjb21wb25lbnQgb2YgdGhlIE1DVS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKyAgICAgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7CisgICAgICAgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisgICAgICAgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisgICAgICAgICAgICBpZiAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IDApIHsKKyAgICAgICAgICAgICAgLy8gbmVlZCB0byBkbyBwcmUtemVybyBieSBvdXJzZWxmLgorICAgICAgICAgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIChTSVpFT0YoSkJMT0NLKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gUmVjb3JkIGh1ZmZtYW4gYml0IG9mZnNldAorICAgICAgaWYgKE1DVV9jb2xfbnVtICUgc2FtcGxlX3NpemUgPT0gMCkgeworICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgKGNpbmZvLCBvZmZzZXRfZGF0YSk7CisgICAgICAgICsrb2Zmc2V0X2RhdGE7CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gZmV0Y2ggdGhlIE1DVS4gKi8KKyAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmRlY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKKwkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKKwljb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07CisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgKCpjaW5mby0+ZW50cm9weS0+Z2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKQorICAgICAgICAoY2luZm8sICZzY2FuX2hlYWRlci0+cHJldl9NQ1Vfb2Zmc2V0KTsKKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKy8qCisgKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBtdWx0aS1wYXNzIGNhc2UuCisgKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqCisgKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgSkRJTUVOU0lPTiBibG9ja19udW07CisgIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKKworICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLworICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDwgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciB8fAorCSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKKwkgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8PSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICB9CisKKyAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQorICAgICAgY29udGludWU7CisgICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KKyAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorICAgICAgIGNpbmZvLT50aWxlX2RlY29kZSA/IDAgOiBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKyAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOworICAgIC8qIENvdW50IG5vbi1kdW1teSBEQ1QgYmxvY2sgcm93cyBpbiB0aGlzIGlNQ1Ugcm93LiAqLworICAgIGlmIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IDwgbGFzdF9pTUNVX3JvdykKKyAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGVsc2UgeworICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZTsgaXQgaXMgaW5wdXQtc2lkZS1kZXBlbmRlbnQhICovCisgICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICBpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjaV07CisgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY2ldOworICAgIGludCB3aWR0aF9pbl9ibG9ja3MgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisgICAgaW50IHN0YXJ0X2Jsb2NrID0gMDsKKyNpZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgeworICAgICAgLy8gd2lkdGhfaW5fYmxvY2tzIGZvciBhIGNvbXBvbmVudCBkZXBlbmRzIG9uIGl0cyBoX3NhbXBfZmFjdG9yLgorICAgICAgd2lkdGhfaW5fYmxvY2tzID0gam1pbih3aWR0aF9pbl9ibG9ja3MsCisgICAgICAgIChjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9yaWdodF9ib3VuZGFyeSAtCisgICAgICAgICBjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5KSAqCisgICAgICAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKKyAgICAgIHN0YXJ0X2Jsb2NrID0gY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXAgKgorICAgICAgICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgIH0KKyNlbmRpZgorICAgIC8qIExvb3Agb3ZlciBhbGwgRENUIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQuICovCisgICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgeworICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltibG9ja19yb3ddOworICAgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2Jsb2NrICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgYnVmZmVyX3B0ciArPSBzdGFydF9ibG9jazsKKyAgICAgIGZvciAoYmxvY2tfbnVtID0gc3RhcnRfYmxvY2s7IGJsb2NrX251bSA8IHdpZHRoX2luX2Jsb2NrczsgYmxvY2tfbnVtKyspIHsKKwkoKmludmVyc2VfRENUKSAoY2luZm8sIGNvbXBwdHIsIChKQ09FRlBUUikgYnVmZmVyX3B0ciwKKwkJCW91dHB1dF9wdHIsIG91dHB1dF9jb2wpOworCWJ1ZmZlcl9wdHIrKzsKKwlvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIH0KKyAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIH0KKyAgfQorCisgIGlmICgrKyhjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCisgICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKyNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorCisvKgorICogVGhpcyBjb2RlIGFwcGxpZXMgaW50ZXJibG9jayBzbW9vdGhpbmcgYXMgZGVzY3JpYmVkIGJ5IHNlY3Rpb24gSy44CisgKiBvZiB0aGUgSlBFRyBzdGFuZGFyZDogdGhlIGZpcnN0IDUgQUMgY29lZmZpY2llbnRzIGFyZSBlc3RpbWF0ZWQgZnJvbQorICogdGhlIERDIHZhbHVlcyBvZiBhIERDVCBibG9jayBhbmQgaXRzIDggbmVpZ2hib3JpbmcgYmxvY2tzLgorICogV2UgYXBwbHkgc21vb3RoaW5nIG9ubHkgZm9yIHByb2dyZXNzaXZlIEpQRUcgZGVjb2RpbmcsIGFuZCBvbmx5IGlmCisgKiB0aGUgY29lZmZpY2llbnRzIGl0IGNhbiBlc3RpbWF0ZSBhcmUgbm90IHlldCBrbm93biB0byBmdWxsIHByZWNpc2lvbi4KKyAqLworCisvKiBOYXR1cmFsLW9yZGVyIGFycmF5IHBvc2l0aW9ucyBvZiB0aGUgZmlyc3QgNSB6aWd6YWctb3JkZXIgY29lZmZpY2llbnRzICovCisjZGVmaW5lIFEwMV9QT1MgIDEKKyNkZWZpbmUgUTEwX1BPUyAgOAorI2RlZmluZSBRMjBfUE9TICAxNgorI2RlZmluZSBRMTFfUE9TICA5CisjZGVmaW5lIFEwMl9QT1MgIDIKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIGJsb2NrIHNtb290aGluZyBpcyBhcHBsaWNhYmxlIGFuZCBzYWZlLgorICogV2UgYWxzbyBsYXRjaCB0aGUgY3VycmVudCBzdGF0ZXMgb2YgdGhlIGNvZWZfYml0c1tdIGVudHJpZXMgZm9yIHRoZQorICogQUMgY29lZmZpY2llbnRzOyBvdGhlcndpc2UsIGlmIHRoZSBpbnB1dCBzaWRlIG9mIHRoZSBkZWNvbXByZXNzb3IKKyAqIGFkdmFuY2VzIGludG8gYSBuZXcgc2Nhbiwgd2UgbWlnaHQgdGhpbmsgdGhlIGNvZWZmaWNpZW50cyBhcmUga25vd24KKyAqIG1vcmUgYWNjdXJhdGVseSB0aGFuIHRoZXkgcmVhbGx5IGFyZS4KKyAqLworCitMT0NBTChib29sZWFuKQorc21vb3RoaW5nX29rIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgYm9vbGVhbiBzbW9vdGhpbmdfdXNlZnVsID0gRkFMU0U7CisgIGludCBjaSwgY29lZmk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpRVUFOVF9UQkwgKiBxdGFibGU7CisgIGludCAqIGNvZWZfYml0czsKKyAgaW50ICogY29lZl9iaXRzX2xhdGNoOworCisgIGlmICghIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlIHx8IGNpbmZvLT5jb2VmX2JpdHMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQWxsb2NhdGUgbGF0Y2ggYXJlYSBpZiBub3QgYWxyZWFkeSBkb25lICovCisgIGlmIChjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPT0gTlVMTCkKKyAgICBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPSAoaW50ICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgY2luZm8tPm51bV9jb21wb25lbnRzICoKKwkJCQkgIChTQVZFRF9DT0VGUyAqIFNJWkVPRihpbnQpKSk7CisgIGNvZWZfYml0c19sYXRjaCA9IGNvZWYtPmNvZWZfYml0c19sYXRjaDsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIEFsbCBjb21wb25lbnRzJyBxdWFudGl6YXRpb24gdmFsdWVzIG11c3QgYWxyZWFkeSBiZSBsYXRjaGVkLiAqLworICAgIGlmICgocXRhYmxlID0gY29tcHB0ci0+cXVhbnRfdGFibGUpID09IE5VTEwpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogVmVyaWZ5IERDICYgZmlyc3QgNSBBQyBxdWFudGl6ZXJzIGFyZSBub256ZXJvIHRvIGF2b2lkIHplcm8tZGl2aWRlLiAqLworICAgIGlmIChxdGFibGUtPnF1YW50dmFsWzBdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1EwMV9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1ExMF9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1EyMF9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1ExMV9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1EwMl9QT1NdID09IDApCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogREMgdmFsdWVzIG11c3QgYmUgYXQgbGVhc3QgcGFydGx5IGtub3duIGZvciBhbGwgY29tcG9uZW50cy4gKi8KKyAgICBjb2VmX2JpdHMgPSBjaW5mby0+Y29lZl9iaXRzW2NpXTsKKyAgICBpZiAoY29lZl9iaXRzWzBdIDwgMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBCbG9jayBzbW9vdGhpbmcgaXMgaGVscGZ1bCBpZiBzb21lIEFDIGNvZWZmaWNpZW50cyByZW1haW4gaW5hY2N1cmF0ZS4gKi8KKyAgICBmb3IgKGNvZWZpID0gMTsgY29lZmkgPD0gNTsgY29lZmkrKykgeworICAgICAgY29lZl9iaXRzX2xhdGNoW2NvZWZpXSA9IGNvZWZfYml0c1tjb2VmaV07CisgICAgICBpZiAoY29lZl9iaXRzW2NvZWZpXSAhPSAwKQorCXNtb290aGluZ191c2VmdWwgPSBUUlVFOworICAgIH0KKyAgICBjb2VmX2JpdHNfbGF0Y2ggKz0gU0FWRURfQ09FRlM7CisgIH0KKworICByZXR1cm4gc21vb3RoaW5nX3VzZWZ1bDsKK30KKworCisvKgorICogVmFyaWFudCBvZiBkZWNvbXByZXNzX2RhdGEgZm9yIHVzZSB3aGVuIGRvaW5nIGJsb2NrIHNtb290aGluZy4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19zbW9vdGhfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIEpESU1FTlNJT04gYmxvY2tfbnVtLCBsYXN0X2Jsb2NrX2NvbHVtbjsKKyAgaW50IGNpLCBibG9ja19yb3csIGJsb2NrX3Jvd3MsIGFjY2Vzc19yb3dzOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyLCBwcmV2X2Jsb2NrX3JvdywgbmV4dF9ibG9ja19yb3c7CisgIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29sOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOworICBib29sZWFuIGZpcnN0X3JvdywgbGFzdF9yb3c7CisgIEpCTE9DSyB3b3Jrc3BhY2U7CisgIGludCAqY29lZl9iaXRzOworICBKUVVBTlRfVEJMICpxdWFudHRibDsKKyAgSU5UMzIgUTAwLFEwMSxRMDIsUTEwLFExMSxRMjAsIG51bTsKKyAgaW50IERDMSxEQzIsREMzLERDNCxEQzUsREM2LERDNyxEQzgsREM5OworICBpbnQgQWwsIHByZWQ7CisKKyAgLyogRm9yY2Ugc29tZSBpbnB1dCB0byBiZSBkb25lIGlmIHdlIGFyZSBnZXR0aW5nIGFoZWFkIG9mIHRoZSBpbnB1dC4gKi8KKyAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCisJICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlcikgeworICAgICAgLyogSWYgaW5wdXQgaXMgd29ya2luZyBvbiBjdXJyZW50IHNjYW4sIHdlIG9yZGluYXJpbHkgd2FudCBpdCB0bworICAgICAgICogaGF2ZSBjb21wbGV0ZWQgdGhlIGN1cnJlbnQgcm93LiAgQnV0IGlmIGlucHV0IHNjYW4gaXMgREMsCisgICAgICAgKiB3ZSB3YW50IGl0IHRvIGtlZXAgb25lIHJvdyBhaGVhZCBzbyB0aGF0IG5leHQgYmxvY2sgcm93J3MgREMKKyAgICAgICAqIHZhbHVlcyBhcmUgdXAgdG8gZGF0ZS4KKyAgICAgICAqLworICAgICAgSkRJTUVOU0lPTiBkZWx0YSA9IChjaW5mby0+U3MgPT0gMCkgPyAxIDogMDsKKyAgICAgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPiBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93K2RlbHRhKQorCWJyZWFrOworICAgIH0KKyAgICBpZiAoKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgfQorCisgIC8qIE9LLCBvdXRwdXQgZnJvbSB0aGUgdmlydHVhbCBhcnJheXMuICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogRG9uJ3QgYm90aGVyIHRvIElEQ1QgYW4gdW5pbnRlcmVzdGluZyBjb21wb25lbnQuICovCisgICAgaWYgKCEgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCkKKyAgICAgIGNvbnRpbnVlOworICAgIC8qIENvdW50IG5vbi1kdW1teSBEQ1QgYmxvY2sgcm93cyBpbiB0aGlzIGlNQ1Ugcm93LiAqLworICAgIGlmIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IDwgbGFzdF9pTUNVX3JvdykgeworICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgICBhY2Nlc3Nfcm93cyA9IGJsb2NrX3Jvd3MgKiAyOyAvKiB0aGlzIGFuZCBuZXh0IGlNQ1Ugcm93ICovCisgICAgICBsYXN0X3JvdyA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlOyBpdCBpcyBpbnB1dC1zaWRlLWRlcGVuZGVudCEgKi8KKyAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgICBhY2Nlc3Nfcm93cyA9IGJsb2NrX3Jvd3M7IC8qIHRoaXMgaU1DVSByb3cgb25seSAqLworICAgICAgbGFzdF9yb3cgPSBUUlVFOworICAgIH0KKyAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLworICAgIGlmIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID4gMCkgeworICAgICAgYWNjZXNzX3Jvd3MgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsgLyogcHJpb3IgaU1DVSByb3cgdG9vICovCisgICAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKKwkgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgLSAxKSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cywgRkFMU0UpOworICAgICAgYnVmZmVyICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CS8qIHBvaW50IHRvIGN1cnJlbnQgaU1DVSByb3cgKi8KKyAgICAgIGZpcnN0X3JvdyA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKKwkgKEpESU1FTlNJT04pIDAsIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cywgRkFMU0UpOworICAgICAgZmlyc3Rfcm93ID0gVFJVRTsKKyAgICB9CisgICAgLyogRmV0Y2ggY29tcG9uZW50LWRlcGVuZGVudCBpbmZvICovCisgICAgY29lZl9iaXRzID0gY29lZi0+Y29lZl9iaXRzX2xhdGNoICsgKGNpICogU0FWRURfQ09FRlMpOworICAgIHF1YW50dGJsID0gY29tcHB0ci0+cXVhbnRfdGFibGU7CisgICAgUTAwID0gcXVhbnR0YmwtPnF1YW50dmFsWzBdOworICAgIFEwMSA9IHF1YW50dGJsLT5xdWFudHZhbFtRMDFfUE9TXTsKKyAgICBRMTAgPSBxdWFudHRibC0+cXVhbnR2YWxbUTEwX1BPU107CisgICAgUTIwID0gcXVhbnR0YmwtPnF1YW50dmFsW1EyMF9QT1NdOworICAgIFExMSA9IHF1YW50dGJsLT5xdWFudHZhbFtRMTFfUE9TXTsKKyAgICBRMDIgPSBxdWFudHRibC0+cXVhbnR2YWxbUTAyX1BPU107CisgICAgaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY2ldOworICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NpXTsKKyAgICAvKiBMb29wIG92ZXIgYWxsIERDVCBibG9ja3MgdG8gYmUgcHJvY2Vzc2VkLiAqLworICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKKyAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbYmxvY2tfcm93XTsKKyAgICAgIGlmIChmaXJzdF9yb3cgJiYgYmxvY2tfcm93ID09IDApCisJcHJldl9ibG9ja19yb3cgPSBidWZmZXJfcHRyOworICAgICAgZWxzZQorCXByZXZfYmxvY2tfcm93ID0gYnVmZmVyW2Jsb2NrX3Jvdy0xXTsKKyAgICAgIGlmIChsYXN0X3JvdyAmJiBibG9ja19yb3cgPT0gYmxvY2tfcm93cy0xKQorCW5leHRfYmxvY2tfcm93ID0gYnVmZmVyX3B0cjsKKyAgICAgIGVsc2UKKwluZXh0X2Jsb2NrX3JvdyA9IGJ1ZmZlcltibG9ja19yb3crMV07CisgICAgICAvKiBXZSBmZXRjaCB0aGUgc3Vycm91bmRpbmcgREMgdmFsdWVzIHVzaW5nIGEgc2xpZGluZy1yZWdpc3RlciBhcHByb2FjaC4KKyAgICAgICAqIEluaXRpYWxpemUgYWxsIG5pbmUgaGVyZSBzbyBhcyB0byBkbyB0aGUgcmlnaHQgdGhpbmcgb24gbmFycm93IHBpY3MuCisgICAgICAgKi8KKyAgICAgIERDMSA9IERDMiA9IERDMyA9IChpbnQpIHByZXZfYmxvY2tfcm93WzBdWzBdOworICAgICAgREM0ID0gREM1ID0gREM2ID0gKGludCkgYnVmZmVyX3B0clswXVswXTsKKyAgICAgIERDNyA9IERDOCA9IERDOSA9IChpbnQpIG5leHRfYmxvY2tfcm93WzBdWzBdOworICAgICAgb3V0cHV0X2NvbCA9IDA7CisgICAgICBsYXN0X2Jsb2NrX2NvbHVtbiA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAtIDE7CisgICAgICBmb3IgKGJsb2NrX251bSA9IDA7IGJsb2NrX251bSA8PSBsYXN0X2Jsb2NrX2NvbHVtbjsgYmxvY2tfbnVtKyspIHsKKwkvKiBGZXRjaCBjdXJyZW50IERDVCBibG9jayBpbnRvIHdvcmtzcGFjZSBzbyB3ZSBjYW4gbW9kaWZ5IGl0LiAqLworCWpjb3B5X2Jsb2NrX3JvdyhidWZmZXJfcHRyLCAoSkJMT0NLUk9XKSB3b3Jrc3BhY2UsIChKRElNRU5TSU9OKSAxKTsKKwkvKiBVcGRhdGUgREMgdmFsdWVzICovCisJaWYgKGJsb2NrX251bSA8IGxhc3RfYmxvY2tfY29sdW1uKSB7CisJICBEQzMgPSAoaW50KSBwcmV2X2Jsb2NrX3Jvd1sxXVswXTsKKwkgIERDNiA9IChpbnQpIGJ1ZmZlcl9wdHJbMV1bMF07CisJICBEQzkgPSAoaW50KSBuZXh0X2Jsb2NrX3Jvd1sxXVswXTsKKwl9CisJLyogQ29tcHV0ZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgcGVyIEsuOC4KKwkgKiBBbiBlc3RpbWF0ZSBpcyBhcHBsaWVkIG9ubHkgaWYgY29lZmZpY2llbnQgaXMgc3RpbGwgemVybywKKwkgKiBhbmQgaXMgbm90IGtub3duIHRvIGJlIGZ1bGx5IGFjY3VyYXRlLgorCSAqLworCS8qIEFDMDEgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1sxXSkgIT0gMCAmJiB3b3Jrc3BhY2VbMV0gPT0gMCkgeworCSAgbnVtID0gMzYgKiBRMDAgKiAoREM0IC0gREM2KTsKKwkgIGlmIChudW0gPj0gMCkgeworCSAgICBwcmVkID0gKGludCkgKCgoUTAxPDw3KSArIG51bSkgLyAoUTAxPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICB9IGVsc2UgeworCSAgICBwcmVkID0gKGludCkgKCgoUTAxPDw3KSAtIG51bSkgLyAoUTAxPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICAgIHByZWQgPSAtcHJlZDsKKwkgIH0KKwkgIHdvcmtzcGFjZVsxXSA9IChKQ09FRikgcHJlZDsKKwl9CisJLyogQUMxMCAqLworCWlmICgoQWw9Y29lZl9iaXRzWzJdKSAhPSAwICYmIHdvcmtzcGFjZVs4XSA9PSAwKSB7CisJICBudW0gPSAzNiAqIFEwMCAqIChEQzIgLSBEQzgpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTA8PDcpICsgbnVtKSAvIChRMTA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTA8PDcpIC0gbnVtKSAvIChRMTA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzhdID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBBQzIwICovCisJaWYgKChBbD1jb2VmX2JpdHNbM10pICE9IDAgJiYgd29ya3NwYWNlWzE2XSA9PSAwKSB7CisJICBudW0gPSA5ICogUTAwICogKERDMiArIERDOCAtIDIqREM1KTsKKwkgIGlmIChudW0gPj0gMCkgeworCSAgICBwcmVkID0gKGludCkgKCgoUTIwPDw3KSArIG51bSkgLyAoUTIwPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICB9IGVsc2UgeworCSAgICBwcmVkID0gKGludCkgKCgoUTIwPDw3KSAtIG51bSkgLyAoUTIwPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICAgIHByZWQgPSAtcHJlZDsKKwkgIH0KKwkgIHdvcmtzcGFjZVsxNl0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIEFDMTEgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1s0XSkgIT0gMCAmJiB3b3Jrc3BhY2VbOV0gPT0gMCkgeworCSAgbnVtID0gNSAqIFEwMCAqIChEQzEgLSBEQzMgLSBEQzcgKyBEQzkpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTE8PDcpICsgbnVtKSAvIChRMTE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTE8PDcpIC0gbnVtKSAvIChRMTE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzldID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBBQzAyICovCisJaWYgKChBbD1jb2VmX2JpdHNbNV0pICE9IDAgJiYgd29ya3NwYWNlWzJdID09IDApIHsKKwkgIG51bSA9IDkgKiBRMDAgKiAoREM0ICsgREM2IC0gMipEQzUpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDI8PDcpICsgbnVtKSAvIChRMDI8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDI8PDcpIC0gbnVtKSAvIChRMDI8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzJdID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBPSywgZG8gdGhlIElEQ1QgKi8KKwkoKmludmVyc2VfRENUKSAoY2luZm8sIGNvbXBwdHIsIChKQ09FRlBUUikgd29ya3NwYWNlLAorCQkJb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7CisJLyogQWR2YW5jZSBmb3IgbmV4dCBjb2x1bW4gKi8KKwlEQzEgPSBEQzI7IERDMiA9IERDMzsKKwlEQzQgPSBEQzU7IERDNSA9IERDNjsKKwlEQzcgPSBEQzg7IERDOCA9IERDOTsKKwlidWZmZXJfcHRyKyssIHByZXZfYmxvY2tfcm93KyssIG5leHRfYmxvY2tfcm93Kys7CisJb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgICB9CisgICAgICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICB9CisgIH0KKworICBpZiAoKysoY2luZm8tPm91dHB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQorICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOworfQorCisjZW5kaWYgLyogQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZF9jb2VmX2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfY29lZl9wdHIgY29lZjsKKworICBjb2VmID0gKG15X2NvZWZfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2NvZWZfY29udHJvbGxlcikpOworICBjaW5mby0+Y29lZiA9IChzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciAqKSBjb2VmOworICBjb2VmLT5wdWIuc3RhcnRfaW5wdXRfcGFzcyA9IHN0YXJ0X2lucHV0X3Bhc3M7CisgIGNvZWYtPnB1Yi5zdGFydF9vdXRwdXRfcGFzcyA9IHN0YXJ0X291dHB1dF9wYXNzOworICBjb2VmLT5wdWIuY29sdW1uX2xlZnRfYm91bmRhcnkgPSAwOworICBjb2VmLT5wdWIuY29sdW1uX3JpZ2h0X2JvdW5kYXJ5ID0gMDsKKyAgY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXAgPSAwOworI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyAgY29lZi0+Y29lZl9iaXRzX2xhdGNoID0gTlVMTDsKKyNlbmRpZgorCisjaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQorICBpZiAoY2luZm8tPnRpbGVfZGVjb2RlKSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBBbGxvY2F0ZSBvbmUgaU1DVSByb3cgdmlydHVhbCBhcnJheSwgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorICAgICAgICogZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LCBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiBoX3NhbXBfZmFjdG9yCisgICAgICAgKiBEQ1QgYmxvY2tzIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbi4KKyAgICAgICAqLworICAgICAgaW50IGNpLCBhY2Nlc3Nfcm93czsKKyAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJICAgY2krKywgY29tcHB0cisrKSB7CisgICAgICAgIGFjY2Vzc19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgICAgY29lZi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgVFJVRSwKKwkgICAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAorCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCAvLyBvbmUgaU1DVSByb3cKKwkgICAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MpOworICAgICAgfQorICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgICAgIGNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4X3Byb2dyZXNzaXZlOworICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGNvbnN1bWVfZGF0YV9tdWx0aV9zY2FuOworICAgICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gY29lZi0+d2hvbGVfaW1hZ2U7IC8qIGxpbmsgdG8gdmlydHVhbCBhcnJheXMgKi8KKyAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX29uZXBhc3M7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLworICAgICAgSkJMT0NLUk9XIGJ1ZmZlcjsKKyAgICAgIGludCBpOworCisgICAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIERfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRF9NQVhfQkxPQ0tTX0lOX01DVTsgaSsrKSB7CisgICAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOworICAgICAgfQorICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgICAgIGNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4X2Jhc2VsaW5lOworICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGR1bW15X2NvbnN1bWVfZGF0YTsKKyAgICAgIGNvZWYtPnB1Yi5jb2VmX2FycmF5cyA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCisgICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19vbmVwYXNzOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIC8qIENyZWF0ZSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLiAqLworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgIC8qIEFsbG9jYXRlIGEgZnVsbC1pbWFnZSB2aXJ0dWFsIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudCwgKi8KKyAgICAvKiBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiBzYW1wX2ZhY3RvciBEQ1QgYmxvY2tzIGluIGVhY2ggZGlyZWN0aW9uLiAqLworICAgIC8qIE5vdGUgd2UgYXNrIGZvciBhIHByZS16ZXJvZWQgYXJyYXkuICovCisgICAgaW50IGNpLCBhY2Nlc3Nfcm93czsKKyAgICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBhY2Nlc3Nfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICAgICAgLyogSWYgYmxvY2sgc21vb3RoaW5nIGNvdWxkIGJlIHVzZWQsIG5lZWQgYSBiaWdnZXIgd2luZG93ICovCisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisJYWNjZXNzX3Jvd3MgKj0gMzsKKyNlbmRpZgorICAgICAgY29lZi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIFRSVUUsCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MpOworICAgIH0KKyAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gY29uc3VtZV9kYXRhOworICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX2RhdGE7CisgICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gY29lZi0+d2hvbGVfaW1hZ2U7IC8qIGxpbmsgdG8gdmlydHVhbCBhcnJheXMgKi8KKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgLyogV2Ugb25seSBuZWVkIGEgc2luZ2xlLU1DVSBidWZmZXIuICovCisgICAgSkJMT0NLUk9XIGJ1ZmZlcjsKKyAgICBpbnQgaTsKKworICAgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkgIERfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7CisgICAgZm9yIChpID0gMDsgaSA8IERfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgICAgfQorICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBkdW1teV9jb25zdW1lX2RhdGE7CisgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfb25lcGFzczsKKyAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICB9Cit9CmRpZmYgLS1naXQgYS9qcGVnL2pkY29sb3IuYyBiL2pwZWcvamRjb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGY3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pkY29sb3IuYwpAQCAtMCwwICsxLDkxMCBAQAorLyoKKyAqIGpkY29sb3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG91dHB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2lmIGRlZmluZWQoTlZfQVJNX05FT04pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pCisjaW5jbHVkZSAianNpbWRfbmVvbi5oIgorI2VuZGlmCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogUHJpdmF0ZSBzdGF0ZSBmb3IgWUNDLT5SR0IgY29udmVyc2lvbiAqLworICBpbnQgKiBDcl9yX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBSIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ2JfYl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gQiBjb252ZXJzaW9uICovCisgIElOVDMyICogQ3JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gRyBjb252ZXJzaW9uICovCisgIElOVDMyICogQ2JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gRyBjb252ZXJzaW9uICovCit9IG15X2NvbG9yX2RlY29udmVydGVyOworCit0eXBlZGVmIG15X2NvbG9yX2RlY29udmVydGVyICogbXlfY2NvbnZlcnRfcHRyOworCisKKyNpZmRlZiBBTkRST0lEX1JHQgorCisvKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgorICogCisgKiBXZSB1c2UgNHg0IG9yZGVyZWQgZGl0aGVyIGFycmF5IHBhY2tlZCBpbnRvIDMyIGJpdHMuIFRoaXMgYXJyYXkgaXMKKyAqIHN1ZmZpY2VudCBmb3IgZGl0aGVyaW5nIFJHQl84ODggdG8gUkdCXzU2NS4KKyAqLworCisjZGVmaW5lIERJVEhFUl9NQVNLICAgICAgICAgMHgzCisjZGVmaW5lIERJVEhFUl9ST1RBVEUoeCkgICAgKCgoeCk8PDI0KSB8ICgoKHgpPj44KSYweDAwRkZGRkZGKSkKK3N0YXRpYyBjb25zdCBJTlQzMiBkaXRoZXJfbWF0cml4WzRdID0geworICAweDAwMDgwMjBBLAorICAweDBDMDQwRTA2LAorICAweDAzMEIwMTA5LAorICAweDBGMDcwRDA1Cit9OworCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKiBZQ2JDciAtPiBSR0IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KKworLyoKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICoJUiA9IFkgICAgICAgICAgICAgICAgKyAxLjQwMjAwICogQ3IKKyAqCUcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCisgKglCID0gWSArIDEuNzcyMDAgKiBDYgorICogd2hlcmUgQ2IgYW5kIENyIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgdmFsdWVzIGxlc3MgQ0VOVEVSSlNBTVBMRS4KKyAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKKyAqCisgKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCisgKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKKyAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgorICogTm90aWNlIHRoYXQgWSwgYmVpbmcgYW4gaW50ZWdyYWwgaW5wdXQsIGRvZXMgbm90IGNvbnRyaWJ1dGUgYW55IGZyYWN0aW9uCisgKiBzbyBpdCBuZWVkIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgcm91bmRpbmcuCisgKgorICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAorICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBDYiBhbmQgQ3IgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCisgKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKKyAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgorICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKKyAqIGNvbG9yc3BhY2UgYW55d2F5LgorICogVGhlIENyPT5SIGFuZCBDYj0+QiB2YWx1ZXMgY2FuIGJlIHJvdW5kZWQgdG8gaW50ZWdlcnMgaW4gYWR2YW5jZTsgdGhlCisgKiB2YWx1ZXMgZm9yIHRoZSBHIGNhbGN1bGF0aW9uIGFyZSBsZWZ0IHNjYWxlZCB1cCwgc2luY2Ugd2UgbXVzdCBhZGQgdGhlbQorICogdG9nZXRoZXIgYmVmb3JlIHJvdW5kaW5nLgorICovCisKKyNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCisjZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworCisvKgorICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitMT0NBTCh2b2lkKQorYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICBpbnQgaTsKKyAgSU5UMzIgeDsKKyAgU0hJRlRfVEVNUFMKKworICBjY29udmVydC0+Q3Jfcl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7CisgIGNjb252ZXJ0LT5DYl9iX3RhYiA9IChpbnQgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKKyAgY2NvbnZlcnQtPkNyX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKyAgY2NvbnZlcnQtPkNiX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKworICBmb3IgKGkgPSAwLCB4ID0gLUNFTlRFUkpTQU1QTEU7IGkgPD0gTUFYSlNBTVBMRTsgaSsrLCB4KyspIHsKKyAgICAvKiBpIGlzIHRoZSBhY3R1YWwgaW5wdXQgcGl4ZWwgdmFsdWUsIGluIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFICovCisgICAgLyogVGhlIENiIG9yIENyIHZhbHVlIHdlIGFyZSB0aGlua2luZyBvZiBpcyB4ID0gaSAtIENFTlRFUkpTQU1QTEUgKi8KKyAgICAvKiBDcj0+UiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjQwMjAwICogeCAqLworICAgIGNjb252ZXJ0LT5Dcl9yX3RhYltpXSA9IChpbnQpCisgICAgICAgICAgICAgICAgICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLworICAgIGNjb252ZXJ0LT5DYl9iX3RhYltpXSA9IChpbnQpCisgICAgICAgICAgICAgICAgICAgIFJJR0hUX1NISUZUKEZJWCgxLjc3MjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDcj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuNzE0MTQgKiB4ICovCisgICAgY2NvbnZlcnQtPkNyX2dfdGFiW2ldID0gKC0gRklYKDAuNzE0MTQpKSAqIHg7CisgICAgLyogQ2I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjM0NDE0ICogeCAqLworICAgIC8qIFdlIGFsc28gYWRkIGluIE9ORV9IQUxGIHNvIHRoYXQgbmVlZCBub3QgZG8gaXQgaW4gaW5uZXIgbG9vcCAqLworICAgIGNjb252ZXJ0LT5DYl9nX3RhYltpXSA9ICgtIEZJWCgwLjM0NDE0KSkgKiB4ICsgT05FX0hBTEY7CisgIH0KK30KKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0CisgKiB0byBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQuICBUaGUgb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMKKyAqIGFzIHdpZGUgYXMgdGhlIGlucHV0IGJ1ZmZlci4KKyAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgorICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBvdXRwdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKKyAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit5Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7CisgIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOworICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7CisgICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KKyAgICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRUJJVFMpKV07CisgICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKKyAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICAgIH0KKyAgfQorfQorCisjaWZkZWYgQU5EUk9JRF9SR0IKK01FVEhPRERFRih2b2lkKQoreWNjX3JnYmFfODg4OF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOworICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgeSAgPSBHRVRKU0FNUExFKGlucHRyMFtjb2xdKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRShpbnB0cjFbY29sXSk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoaW5wdHIyW2NvbF0pOworICAgICAgLyogUmFuZ2UtbGltaXRpbmcgaXMgZXNzZW50aWFsIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IERDVCBsb3NzZXMuICovCisgICAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKKyAgICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVCSVRTKSldOworICAgICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICBvdXRwdHJbUkdCX0FMUEhBXSA9ICAweEZGOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICB9Cit9CisKK01FVEhPRERFRih2b2lkKQoreWNjX3JnYl81NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKKyAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIElOVDMyIHJnYjsKKyAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIAorICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKKyAgICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKKyAgICAgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKKyAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgICAgIG91dHB0ciArPSAyOworICAgICAgICBudW1fY29scy0tOworICAgIH0KKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisKKyAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKKyAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICAgIGlmIChudW1fY29scyYxKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgfQorICB9Cit9CisKK01FVEhPRERFRih2b2lkKQoreWNjX3JnYl81NjVEX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7CisgIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOworICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgSU5UMzIgcmdiOworICAgIHVuc2lnbmVkIGludCByLCBnLCBiOworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgaWYgKFBBQ0tfTkVFRF9BTElHTk1FTlQob3V0cHRyKSkgeworICAgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOworICAgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpLCBkMCldOworICAgICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBDYmJ0YWJbY2JdLCBkMCldOworICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICAgICAgb3V0cHRyICs9IDI7CisgICAgICAgIG51bV9jb2xzLS07CisgICAgfQorICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIENycnRhYltjcl0sIGQwKV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpLCBkMCldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgQ2JidGFiW2NiXSwgZDApXTsKKyAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIENiYnRhYltjYl0sIGQwKV07CisgICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7CisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgICAgaWYgKG51bV9jb2xzJjEpIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIENycnRhYltjcl0sIGQwKV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpLCBkMCldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgQ2JidGFiW2NiXSwgZDApXTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICB9CisgIH0KK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gWUNiQ3IgLT4gUkdCKEEpICoqKioqKioqKioqKioqLworCisjaWZkZWYgQU5EUk9JRF9SR0IKK01FVEhPRERFRih2b2lkKQorcmdiX3JnYmFfODg4OF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIwKys7CisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIxKys7CisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIyKys7CisgICAgICAqb3V0cHRyKysgPSAweEZGOworICAgIH0KKyAgfQorfQorCitNRVRIT0RERUYodm9pZCkKK3JnYl9yZ2JfNTY1X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIElOVDMyIHJnYjsKKyAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgICAgYiA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgICAgIG91dHB0ciArPSAyOworICAgICAgICBudW1fY29scy0tOworICAgIH0KKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7CisgICAgICByID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICByID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgICBnID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorCisKK01FVEhPRERFRih2b2lkKQorcmdiX3JnYl81NjVEX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIElOVDMyIGQwID0gZGl0aGVyX21hdHJpeFtjaW5mby0+b3V0cHV0X3NjYW5saW5lICYgRElUSEVSX01BU0tdOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBJTlQzMiByZ2I7CisgICAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7CisgICAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKyspLCBkMCldOworICAgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKEdFVEpTQU1QTEUoKmlucHRyMSsrKSwgZDApXTsKKyAgICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQihHRVRKU0FNUExFKCppbnB0cjIrKyksIGQwKV07CisgICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgICAgICBvdXRwdHIgKz0gMjsKKyAgICAgICAgbnVtX2NvbHMtLTsKKyAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgeworICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihHRVRKU0FNUExFKCppbnB0cjArKyksIGQwKV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKEdFVEpTQU1QTEUoKmlucHRyMSsrKSwgZDApXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoR0VUSlNBTVBMRSgqaW5wdHIyKyspLCBkMCldOworICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKyspLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjErKyksIGQwKV07CisgICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKEdFVEpTQU1QTEUoKmlucHRyMisrKSwgZDApXTsKKyAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihHRVRKU0FNUExFKCppbnB0cjApLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjEpLCBkMCldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQihHRVRKU0FNUExFKCppbnB0cjIpLCBkMCldOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorCisjZW5kaWYKKworLyoKKyAqIENvbG9yIGNvbnZlcnNpb24gZm9yIG5vIGNvbG9yc3BhY2UgY2hhbmdlOiBqdXN0IGNvcHkgdGhlIGRhdGEsCisgKiBjb252ZXJ0aW5nIGZyb20gc2VwYXJhdGUtcGxhbmVzIHRvIGludGVybGVhdmVkIHJlcHJlc2VudGF0aW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorbnVsbF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKwkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb3VudDsKKyAgcmVnaXN0ZXIgaW50IG51bV9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgaW50IGNpOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBudW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgaW5wdHIgPSBpbnB1dF9idWZbY2ldW2lucHV0X3Jvd107CisgICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdICsgY2k7CisgICAgICBmb3IgKGNvdW50ID0gbnVtX2NvbHM7IGNvdW50ID4gMDsgY291bnQtLSkgeworCSpvdXRwdHIgPSAqaW5wdHIrKzsJLyogbmVlZG4ndCBib3RoZXIgd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLworCW91dHB0ciArPSBudW1fY29tcG9uZW50czsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHV0X2J1ZisrOworICB9Cit9CisKKworLyoKKyAqIENvbG9yIGNvbnZlcnNpb24gZm9yIGdyYXlzY2FsZToganVzdCBjb3B5IHRoZSBkYXRhLgorICogVGhpcyBhbHNvIHdvcmtzIGZvciBZQ2JDciAtPiBncmF5c2NhbGUgY29udmVyc2lvbiwgaW4gd2hpY2gKKyAqIHdlIGp1c3QgY29weSB0aGUgWSAobHVtaW5hbmNlKSBjb21wb25lbnQgYW5kIGlnbm9yZSBjaHJvbWluYW5jZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2dyYXlzY2FsZV9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBqY29weV9zYW1wbGVfcm93cyhpbnB1dF9idWZbMF0sIChpbnQpIGlucHV0X3Jvdywgb3V0cHV0X2J1ZiwgMCwKKwkJICAgIG51bV9yb3dzLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKK30KKworCisvKgorICogQ29udmVydCBncmF5c2NhbGUgdG8gUkdCOiBqdXN0IGR1cGxpY2F0ZSB0aGUgZ3JheWxldmVsIHRocmVlIHRpbWVzLgorICogVGhpcyBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgdG8gY29wZQorICogd2l0aCBncmF5c2NhbGUgYXMgYSBzZXBhcmF0ZSBjYXNlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZ3JheV9yZ2JfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93KytdOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIC8qIFdlIGNhbiBkaXNwZW5zZSB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICBvdXRwdHJbUkdCX1JFRF0gPSBvdXRwdHJbUkdCX0dSRUVOXSA9IG91dHB0cltSR0JfQkxVRV0gPSBpbnB0cltjb2xdOworICAgICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgfQorICB9Cit9CisKKyNpZmRlZiBBTkRST0lEX1JHQgorTUVUSE9EREVGKHZvaWQpCitncmF5X3JnYmFfODg4OF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3crK107CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgLyogV2UgY2FuIGRpc3BlbnNlIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIG91dHB0cltSR0JfUkVEXSA9IG91dHB0cltSR0JfR1JFRU5dID0gb3V0cHRyW1JHQl9CTFVFXSA9IGlucHRyW2NvbF07CisgICAgICBvdXRwdHJbUkdCX0FMUEhBXSA9IDB4ZmY7CisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgIH0KK30KKworTUVUSE9EREVGKHZvaWQpCitncmF5X3JnYl81NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgSU5UMzIgcmdiOworICAgIHVuc2lnbmVkIGludCBnOworICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgZyA9ICppbnB0cisrOworICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKKyAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgICAgICBvdXRwdHIgKz0gMjsKKyAgICAgICAgbnVtX2NvbHMtLTsKKyAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgeworICAgICAgZyA9ICppbnB0cisrOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7CisgICAgICBnID0gKmlucHRyKys7CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKSk7CisgICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICAgIGlmIChudW1fY29scyYxKSB7CisgICAgICBnID0gKmlucHRyOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7CisgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgfQorICB9Cit9CisKK01FVEhPRERFRih2b2lkKQorZ3JheV9yZ2JfNTY1RF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgSU5UMzIgcmdiOworICAgIHVuc2lnbmVkIGludCBnOworICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgZyA9ICppbnB0cisrOworICAgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07CisgICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOworICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgICAgIG91dHB0ciArPSAyOworICAgICAgICBudW1fY29scy0tOworICAgIH0KKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7CisgICAgICBnID0gKmlucHRyKys7CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKKyAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgICBnID0gKmlucHRyKys7CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKSk7CisgICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgZyA9ICppbnB0cjsKKyAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoZywgZDApXTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qCisgKiBBZG9iZS1zdHlsZSBZQ0NLLT5DTVlLIGNvbnZlcnNpb24uCisgKiBXZSBjb252ZXJ0IFlDYkNyIHRvIFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHVzaW5nIHRoZSBzYW1lCisgKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCisgKiBXZSBhc3N1bWUgYnVpbGRfeWNjX3JnYl90YWJsZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit5Y2NrX2NteWtfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjIsIGlucHRyMzsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKKyAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHRyMyA9IGlucHV0X2J1ZlszXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOworICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKKyAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLworICAgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ3JydGFiW2NyXSldOyAgIC8qIHJlZCAqLworICAgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgICAgICAgICAgICAgICAgIC8qIGdyZWVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVCSVRTKSkpXTsKKyAgICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArIENiYnRhYltjYl0pXTsgICAvKiBibHVlICovCisgICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZCAqLworICAgICAgb3V0cHRyWzNdID0gaW5wdHIzW2NvbF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgIH0KK30KKworCisvKgorICogRW1wdHkgbWV0aG9kIGZvciBzdGFydF9wYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgbmVlZGVkICovCit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY29sb3JfZGVjb252ZXJ0ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKKyAgaW50IGNpOworCisgIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jb2xvcl9kZWNvbnZlcnRlcikpOworICBjaW5mby0+Y2NvbnZlcnQgPSAoc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKikgY2NvbnZlcnQ7CisgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZGNvbG9yOworCisgIC8qIE1ha2Ugc3VyZSBudW1fY29tcG9uZW50cyBhZ3JlZXMgd2l0aCBqcGVnX2NvbG9yX3NwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX0NNWUs6CisgIGNhc2UgSkNTX1lDQ0s6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgkJCS8qIEpDU19VTktOT1dOIGNhbiBiZSBhbnl0aGluZyAqLworICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPCAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFNldCBvdXRfY29sb3JfY29tcG9uZW50cyBhbmQgY29udmVyc2lvbiBtZXRob2QgYmFzZWQgb24gcmVxdWVzdGVkIHNwYWNlLgorICAgKiBBbHNvIGNsZWFyIHRoZSBjb21wb25lbnRfbmVlZGVkIGZsYWdzIGZvciBhbnkgdW51c2VkIGNvbXBvbmVudHMsCisgICAqIHNvIHRoYXQgZWFybGllciBwaXBlbGluZSBzdGFnZXMgY2FuIGF2b2lkIHVzZWxlc3MgY29tcHV0YXRpb24uCisgICAqLworCisgIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSB8fAorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7CisgICAgICAvKiBGb3IgY29sb3ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCBvbmx5IHRoZSBZICgwKSBjb21wb25lbnQgaXMgbmVlZGVkICovCisgICAgICBmb3IgKGNpID0gMTsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspCisJY2luZm8tPmNvbXBfaW5mb1tjaV0uY29tcG9uZW50X25lZWRlZCA9IEZBTFNFOworICAgIH0gZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAgICAgaWYgKGNhcF9uZW9uX3ljY19yZ2IoKSkgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBqc2ltZF95Y2NfcmdiX2NvbnZlcnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiX2NvbnZlcnQ7CisgICAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworICAgICAgfQorI2Vsc2UKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfY29udmVydDsKKyAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworI2VuZGlmCisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5X3JnYl9jb252ZXJ0OworICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiAmJiBSR0JfUElYRUxTSVpFID09IDMpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICB9IGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworI2lmZGVmIEFORFJPSURfUkdCCisgIGNhc2UgSkNTX1JHQkFfODg4ODoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyNpZiAoZGVmaW5lZChOVl9BUk1fTkVPTikgJiYgZGVmaW5lZChfX0FSTV9IQVZFX05FT04pKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAgICAgaWYgKGNhcF9uZW9uX3ljY19yZ2IoKSkgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBqc2ltZF95Y2NfcmdiYTg4ODhfY29udmVydDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JhXzg4ODhfY29udmVydDsKKyAgICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisgICAgICB9CisjZWxzZQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYmFfODg4OF9jb252ZXJ0OworICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiYV84ODg4X2NvbnZlcnQ7CisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiYV84ODg4X2NvbnZlcnQ7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCXzU2NToKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOworICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9OT05FKSB7CisgICAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7CisjaWYgKGRlZmluZWQoTlZfQVJNX05FT04pICYmIGRlZmluZWQoX19BUk1fSEFWRV9ORU9OKSkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgICAgICAgaWYgKGNhcF9uZW9uX3ljY19yZ2IoKSkgIHsKKyAgICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBqc2ltZF95Y2NfcmdiNTY1X2NvbnZlcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl81NjVfY29udmVydDsKKyAgICAgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl81NjVfY29udmVydDsKKyAgICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisjZW5kaWYKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5X3JnYl81NjVfY29udmVydDsKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiXzU2NV9jb252ZXJ0OworICAgICAgfSBlbHNlCisgICAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogb25seSBvcmRlcmVkIGRpdGhlciBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl81NjVEX2NvbnZlcnQ7CisgICAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiXzU2NURfY29udmVydDsKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiXzU2NURfY29udmVydDsKKyAgICAgIH0gZWxzZQorICAgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgfQorICAgIGJyZWFrOworI2VuZGlmCisgICAgCisgIGNhc2UgSkNTX0NNWUs6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDQ0spIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY2tfY215a19jb252ZXJ0OworICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIH0gZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogUGVybWl0IG51bGwgY29udmVyc2lvbiB0byBzYW1lIG91dHB1dCBzcGFjZSAqLworICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgfSBlbHNlCQkJLyogdW5zdXBwb3J0ZWQgbm9uLW51bGwgY29udmVyc2lvbiAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gMTsgLyogc2luZ2xlIGNvbG9ybWFwcGVkIG91dHB1dCBjb21wb25lbnQgKi8KKyAgZWxzZQorICAgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKK30KZGlmZiAtLWdpdCBhL2pwZWcvamRjdC5oIGIvanBlZy9qZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkODY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRjdC5oCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogamRjdC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGluY2x1ZGUgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgZm9yd2FyZCBhbmQKKyAqIGludmVyc2UgRENUIG1vZHVsZXMuICBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIHByaXZhdGUgdG8gdGhlIERDVCBtYW5hZ2VycworICogKGpjZGN0bWdyLmMsIGpkZGN0bWdyLmMpIGFuZCB0aGUgaW5kaXZpZHVhbCBEQ1QgYWxnb3JpdGhtcy4KKyAqIFRoZSBpbmRpdmlkdWFsIERDVCBhbGdvcml0aG1zIGFyZSBrZXB0IGluIHNlcGFyYXRlIGZpbGVzIHRvIGVhc2UgCisgKiBtYWNoaW5lLWRlcGVuZGVudCB0dW5pbmcgKGUuZy4sIGFzc2VtYmx5IGNvZGluZykuCisgKi8KKworCisvKgorICogQSBmb3J3YXJkIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byBhIHdvcmsgYXJlYSBvZiB0eXBlIERDVEVMRU1bXTsKKyAqIHRoZSBEQ1QgaXMgdG8gYmUgcGVyZm9ybWVkIGluLXBsYWNlIGluIHRoYXQgYnVmZmVyLiAgVHlwZSBEQ1RFTEVNIGlzIGludAorICogZm9yIDgtYml0IHNhbXBsZXMsIElOVDMyIGZvciAxMi1iaXQgc2FtcGxlcy4gIChOT1RFOiBGbG9hdGluZy1wb2ludCBEQ1QKKyAqIGltcGxlbWVudGF0aW9ucyB1c2UgYW4gYXJyYXkgb2YgdHlwZSBGQVNUX0ZMT0FULCBpbnN0ZWFkLikKKyAqIFRoZSBEQ1QgaW5wdXRzIGFyZSBleHBlY3RlZCB0byBiZSBzaWduZWQgKHJhbmdlICstQ0VOVEVSSlNBTVBMRSkuCisgKiBUaGUgRENUIG91dHB1dHMgYXJlIHJldHVybmVkIHNjYWxlZCB1cCBieSBhIGZhY3RvciBvZiA4OyB0aGV5IHRoZXJlZm9yZQorICogaGF2ZSBhIHJhbmdlIG9mICstOEsgZm9yIDgtYml0IGRhdGEsICstMTI4SyBmb3IgMTItYml0IGRhdGEuICBUaGlzCisgKiBjb252ZW50aW9uIGltcHJvdmVzIGFjY3VyYWN5IGluIGludGVnZXIgaW1wbGVtZW50YXRpb25zIGFuZCBzYXZlcyBzb21lCisgKiB3b3JrIGluIGZsb2F0aW5nLXBvaW50IG9uZXMuCisgKiBRdWFudGl6YXRpb24gb2YgdGhlIG91dHB1dCBjb2VmZmljaWVudHMgaXMgZG9uZSBieSBqY2RjdG1nci5jLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2lmZGVmIEFORFJPSURfTUlQU19JRENUCit0eXBlZGVmIHNob3J0IERDVEVMRU07CQkvKiAxNiBvciAzMiBiaXRzIGlzIGZpbmUgKi8KKyNlbHNlCit0eXBlZGVmIGludCBEQ1RFTEVNOwkJLyogMTYgb3IgMzIgYml0cyBpcyBmaW5lICovCisjZW5kaWYKKyNlbHNlCit0eXBlZGVmIElOVDMyIERDVEVMRU07CQkvKiBtdXN0IGhhdmUgMzIgYml0cyAqLworI2VuZGlmCisKK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBmb3J3YXJkX0RDVF9tZXRob2RfcHRyLCAoRENURUxFTSAqIGRhdGEpKTsKK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBmbG9hdF9EQ1RfbWV0aG9kX3B0ciwgKEZBU1RfRkxPQVQgKiBkYXRhKSk7CisKKworLyoKKyAqIEFuIGludmVyc2UgRENUIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBKQkxPQ0sgYW5kIGEgcG9pbnRlcgorICogdG8gYW4gb3V0cHV0IHNhbXBsZSBhcnJheS4gIFRoZSByb3V0aW5lIG11c3QgZGVxdWFudGl6ZSB0aGUgaW5wdXQgZGF0YSBhcworICogd2VsbCBhcyBwZXJmb3JtIHRoZSBJRENUOyBmb3IgZGVxdWFudGl6YXRpb24sIGl0IHVzZXMgdGhlIG11bHRpcGxpZXIgdGFibGUKKyAqIHBvaW50ZWQgdG8gYnkgY29tcHB0ci0+ZGN0X3RhYmxlLiAgVGhlIG91dHB1dCBkYXRhIGlzIHRvIGJlIHBsYWNlZCBpbnRvIHRoZQorICogc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkIGNvbHVtbi4gIChBbnkgcm93IG9mZnNldCBuZWVkZWQgd2lsbAorICogYmUgYXBwbGllZCB0byB0aGUgYXJyYXkgcG9pbnRlciBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIHRoZSBJRENUIGNvZGUuKQorICogTm90ZSB0aGF0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBlbWl0dGVkIGJ5IHRoZSBJRENUIHJvdXRpbmUgaXMKKyAqIERDVF9zY2FsZWRfc2l6ZSAqIERDVF9zY2FsZWRfc2l6ZS4KKyAqLworCisvKiB0eXBlZGVmIGludmVyc2VfRENUX21ldGhvZF9wdHIgaXMgZGVjbGFyZWQgaW4ganBlZ2ludC5oICovCisKKy8qCisgKiBFYWNoIElEQ1Qgcm91dGluZSBoYXMgaXRzIG93biBpZGVhcyBhYm91dCB0aGUgYmVzdCBkY3RfdGFibGUgZWxlbWVudCB0eXBlLgorICovCisKK3R5cGVkZWYgTVVMVElQTElFUiBJU0xPV19NVUxUX1RZUEU7IC8qIHNob3J0IG9yIGludCwgd2hpY2hldmVyIGlzIGZhc3RlciAqLworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIE1VTFRJUExJRVIgSUZBU1RfTVVMVF9UWVBFOyAvKiAxNiBiaXRzIGlzIE9LLCB1c2Ugc2hvcnQgaWYgZmFzdGVyICovCisjZGVmaW5lIElGQVNUX1NDQUxFX0JJVFMgIDIJLyogZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMgKi8KKyNlbHNlCit0eXBlZGVmIElOVDMyIElGQVNUX01VTFRfVFlQRTsJLyogbmVlZCAzMiBiaXRzIGZvciBzY2FsZWQgcXVhbnRpemVycyAqLworI2RlZmluZSBJRkFTVF9TQ0FMRV9CSVRTICAxMwkvKiBmcmFjdGlvbmFsIGJpdHMgaW4gc2NhbGUgZmFjdG9ycyAqLworI2VuZGlmCit0eXBlZGVmIEZBU1RfRkxPQVQgRkxPQVRfTVVMVF9UWVBFOyAvKiBwcmVmZXJyZWQgZmxvYXRpbmcgdHlwZSAqLworCisKKy8qCisgKiBFYWNoIElEQ1Qgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcmFuZ2UtbGltaXRpbmcgaXRzIHJlc3VsdHMgYW5kCisgKiBjb252ZXJ0aW5nIHRoZW0gdG8gdW5zaWduZWQgZm9ybSAoMC4uTUFYSlNBTVBMRSkuICBUaGUgcmF3IG91dHB1dHMgY291bGQKKyAqIGJlIHF1aXRlIGZhciBvdXQgb2YgcmFuZ2UgaWYgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdCwgc28gYSBidWxsZXRwcm9vZgorICogcmFuZ2UtbGltaXRpbmcgc3RlcCBpcyByZXF1aXJlZC4gIFdlIHVzZSBhIG1hc2stYW5kLXRhYmxlLWxvb2t1cCBtZXRob2QKKyAqIHRvIGRvIHRoZSBjb21iaW5lZCBvcGVyYXRpb25zIHF1aWNrbHkuICBTZWUgdGhlIGNvbW1lbnRzIHdpdGgKKyAqIHByZXBhcmVfcmFuZ2VfbGltaXRfdGFibGUgKGluIGpkbWFzdGVyLmMpIGZvciBtb3JlIGluZm8uCisgKi8KKworI2RlZmluZSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKSAgKChjaW5mbyktPnNhbXBsZV9yYW5nZV9saW1pdCArIENFTlRFUkpTQU1QTEUpCisKKyNkZWZpbmUgUkFOR0VfTUFTSyAgKE1BWEpTQU1QTEUgKiA0ICsgMykgLyogMiBiaXRzIHdpZGVyIHRoYW4gbGVnYWwgc2FtcGxlcyAqLworCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX2ZkY3RfaXNsb3cJCWpGRGlzbG93CisjZGVmaW5lIGpwZWdfZmRjdF9pZmFzdAkJakZEaWZhc3QKKyNkZWZpbmUganBlZ19mZGN0X2Zsb2F0CQlqRkRmbG9hdAorI2RlZmluZSBqcGVnX2lkY3RfaXNsb3cJCWpSRGlzbG93CisjZGVmaW5lIGpwZWdfaWRjdF9pZmFzdAkJalJEaWZhc3QKKyNkZWZpbmUganBlZ19pZGN0X2Zsb2F0CQlqUkRmbG9hdAorI2RlZmluZSBqcGVnX2lkY3RfNHg0CQlqUkQ0eDQKKyNkZWZpbmUganBlZ19pZGN0XzJ4MgkJalJEMngyCisjZGVmaW5lIGpwZWdfaWRjdF8xeDEJCWpSRDF4MQorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworLyogRXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZvcndhcmQgYW5kIGludmVyc2UgRENUIHJvdXRpbmVzLiAqLworCitFWFRFUk4odm9pZCkganBlZ19mZGN0X2lzbG93IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfaWZhc3QgSlBQKChEQ1RFTEVNICogZGF0YSkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9mbG9hdCBKUFAoKEZBU1RfRkxPQVQgKiBkYXRhKSk7CisKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfaXNsb3cKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF9pZmFzdAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0X2Zsb2F0CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfNHg0CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfMngyCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfMXgxCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKKworCisvKgorICogTWFjcm9zIGZvciBoYW5kbGluZyBmaXhlZC1wb2ludCBhcml0aG1ldGljOyB0aGVzZSBhcmUgdXNlZCBieSBtYW55CisgKiBidXQgbm90IGFsbCBvZiB0aGUgRENUL0lEQ1QgbW9kdWxlcy4KKyAqCisgKiBBbGwgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBvZiB0eXBlIElOVDMyLgorICogRnJhY3Rpb25hbCBjb25zdGFudHMgYXJlIHNjYWxlZCBsZWZ0IGJ5IENPTlNUX0JJVFMgYml0cy4KKyAqIENPTlNUX0JJVFMgaXMgZGVmaW5lZCB3aXRoaW4gZWFjaCBtb2R1bGUgdXNpbmcgdGhlc2UgbWFjcm9zLAorICogYW5kIG1heSBkaWZmZXIgZnJvbSBvbmUgbW9kdWxlIHRvIHRoZSBuZXh0LgorICovCisKKyNkZWZpbmUgT05FCSgoSU5UMzIpIDEpCisjZGVmaW5lIENPTlNUX1NDQUxFIChPTkUgPDwgQ09OU1RfQklUUykKKworLyogQ29udmVydCBhIHBvc2l0aXZlIHJlYWwgY29uc3RhbnQgdG8gYW4gaW50ZWdlciBzY2FsZWQgYnkgQ09OU1RfU0NBTEUuCisgKiBDYXV0aW9uOiBzb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsCisgKiB0aHVzIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgorICovCisKKyNkZWZpbmUgRklYKHgpCSgoSU5UMzIpICgoeCkgKiBDT05TVF9TQ0FMRSArIDAuNSkpCisKKy8qIERlc2NhbGUgYW5kIGNvcnJlY3RseSByb3VuZCBhbiBJTlQzMiB2YWx1ZSB0aGF0J3Mgc2NhbGVkIGJ5IE4gYml0cy4KKyAqIFdlIGFzc3VtZSBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nCisgKiB0aGUgZnVkZ2UgZmFjdG9yIGlzIGNvcnJlY3QgZm9yIGVpdGhlciBzaWduIG9mIFguCisgKi8KKworI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKCh4KSArIChPTkUgPDwgKChuKS0xKSksIG4pCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIFRoaXMgbWFjcm8gaXMgdXNlZCBvbmx5IHdoZW4gdGhlIHR3byBpbnB1dHMgd2lsbCBhY3R1YWxseSBiZSBubyBtb3JlIHRoYW4KKyAqIDE2IGJpdHMgd2lkZSwgc28gdGhhdCBhIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhCisgKiBmdWxsIDMyeDMyIG11bHRpcGx5LiAgVGhpcyBwcm92aWRlcyBhIHVzZWZ1bCBzcGVlZHVwIG9uIG1hbnkgbWFjaGluZXMuCisgKiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IGEgMTZ4MTYtPjMyIG11bHRpcGx5IHBvcnRhYmx5CisgKiBpbiBDLCBidXQgc29tZSBDIGNvbXBpbGVycyB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBpZiB5b3UgcHJvdmlkZSB0aGUKKyAqIGNvcnJlY3QgY29tYmluYXRpb24gb2YgY2FzdHMuCisgKi8KKworI2lmZGVmIFNIT1JUeFNIT1JUXzMyCQkvKiBtYXkgd29yayBpZiAnaW50JyBpcyAzMiBiaXRzICovCisjZGVmaW5lIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KSAgKCgoSU5UMTYpICh2YXIpKSAqICgoSU5UMTYpIChjb25zdCkpKQorI2VuZGlmCisjaWZkZWYgU0hPUlR4TENPTlNUXzMyCQkvKiBrbm93biB0byB3b3JrIHdpdGggTWljcm9zb2Z0IEMgNi4wICovCisjZGVmaW5lIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KSAgKCgoSU5UMTYpICh2YXIpKSAqICgoSU5UMzIpIChjb25zdCkpKQorI2VuZGlmCisKKyNpZm5kZWYgTVVMVElQTFkxNkMxNgkJLyogZGVmYXVsdCBkZWZpbml0aW9uICovCisjZGVmaW5lIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisvKiBTYW1lIGV4Y2VwdCBib3RoIGlucHV0cyBhcmUgdmFyaWFibGVzLiAqLworCisjaWZkZWYgU0hPUlR4U0hPUlRfMzIJCS8qIG1heSB3b3JrIGlmICdpbnQnIGlzIDMyIGJpdHMgKi8KKyNkZWZpbmUgTVVMVElQTFkxNlYxNih2YXIxLHZhcjIpICAoKChJTlQxNikgKHZhcjEpKSAqICgoSU5UMTYpICh2YXIyKSkpCisjZW5kaWYKKworI2lmbmRlZiBNVUxUSVBMWTE2VjE2CQkvKiBkZWZhdWx0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTVVMVElQTFkxNlYxNih2YXIxLHZhcjIpICAoKHZhcjEpICogKHZhcjIpKQorI2VuZGlmCmRpZmYgLS1naXQgYS9qcGVnL2pkZGN0bWdyLmMgYi9qcGVnL2pkZGN0bWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzMjhmMwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRkY3RtZ3IuYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIGpkZGN0bWdyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW52ZXJzZS1EQ1QgbWFuYWdlbWVudCBsb2dpYy4KKyAqIFRoaXMgY29kZSBzZWxlY3RzIGEgcGFydGljdWxhciBJRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCisgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzLiAgTm8gY29kZSBpbiB0aGlzIGZpbGUKKyAqIGlzIGV4ZWN1dGVkIHBlciBJRENUIHN0ZXAsIG9ubHkgZHVyaW5nIG91dHB1dCBwYXNzIHNldHVwLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgSURDVCByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgY29lZmZpY2llbnQKKyAqIGRlcXVhbnRpemF0aW9uIGFzIHdlbGwgYXMgdGhlIElEQ1QgcHJvcGVyLiAgVGhpcyBtb2R1bGUgc2V0cyB1cCB0aGUKKyAqIGRlcXVhbnRpemF0aW9uIG11bHRpcGxpZXIgdGFibGUgbmVlZGVkIGJ5IHRoZSBJRENUIHJvdXRpbmUuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZiBkZWZpbmVkKE5WX0FSTV9ORU9OKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKQorI2luY2x1ZGUgImpzaW1kX25lb24uaCIKKyNlbmRpZgorCisjaWZkZWYgQU5EUk9JRF9BUk1WNl9JRENUCisKKy8qIEludGVudGlvbmFsbHkgZGVjbGFyZSB0aGUgcHJvdG90eXBlIHdpdGggYXJndW1lbnRzIG9mIHByaW1pdGl2ZSB0eXBlcyBpbnN0ZWFkCisgKiBvZiB0eXBlLWRlZmluZWQgb25lcy4gVGhpcyB3aWxsIGF0IGxlYXN0IGdlbmVyYXRlIHNvbWUgd2FybmluZ3MgaWYgam1vcmVjZmcuaAorICogaXMgY2hhbmdlZCBhbmQgYmVjb21lcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYXNzZW1ibHkgY29kZS4KKyAqLworZXh0ZXJuIHZvaWQgYXJtdjZfaWRjdChzaG9ydCAqY29lZnMsIGludCAqcXVhbnMsIHVuc2lnbmVkIGNoYXIgKipyb3dzLCBpbnQgY29sKTsKKwordm9pZCBqcGVnX2lkY3RfYXJtdjYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJRkFTVF9NVUxUX1RZUEUgKmRjdF90YWJsZSA9IChJRkFTVF9NVUxUX1RZUEUgKiljb21wcHRyLT5kY3RfdGFibGU7CisgIGFybXY2X2lkY3QoY29lZl9ibG9jaywgZGN0X3RhYmxlLCBvdXRwdXRfYnVmLCBvdXRwdXRfY29sKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBBTkRST0lEX0lOVEVMU1NFMl9JRENUCitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSBxdWFudHB0clNTRVtEQ1RTSVpFMl07CitleHRlcm4gdm9pZCBqcGVnX2lkY3RfaW50ZWxzc2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCk7CisjZW5kaWYKKworI2lmZGVmIEFORFJPSURfTUlQU19JRENUCitleHRlcm4gdm9pZCBqcGVnX2lkY3RfbWlwcyhqX2RlY29tcHJlc3NfcHRyLCBqcGVnX2NvbXBvbmVudF9pbmZvICosIEpDT0VGUFRSLCBKU0FNUEFSUkFZLCBKRElNRU5TSU9OKTsKKyNlbmRpZgorCisvKgorICogVGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIChqZGlucHV0LmMpIHNhdmVzIGF3YXkgdGhlIGFwcHJvcHJpYXRlCisgKiBxdWFudGl6YXRpb24gdGFibGUgZm9yIGVhY2ggY29tcG9uZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbgorICogaW52b2x2aW5nIHRoYXQgY29tcG9uZW50LiAgKFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGNvcnJlY3RseQorICogZGVjb2RlIGZpbGVzIHRoYXQgcmV1c2UgUS10YWJsZSBzbG90cy4pCisgKiBXaGVuIHdlIGFyZSByZWFkeSB0byBtYWtlIGFuIG91dHB1dCBwYXNzLCB0aGUgc2F2ZWQgUS10YWJsZSBpcyBjb252ZXJ0ZWQKKyAqIHRvIGEgbXVsdGlwbGllciB0YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBieSB0aGUgSURDVCByb3V0aW5lLgorICogVGhlIG11bHRpcGxpZXIgdGFibGUgY29udGVudHMgYXJlIElEQ1QtbWV0aG9kLWRlcGVuZGVudC4gIFRvIHN1cHBvcnQKKyAqIGFwcGxpY2F0aW9uIGNoYW5nZXMgaW4gSURDVCBtZXRob2QgYmV0d2VlbiBzY2Fucywgd2UgY2FuIHJlbWFrZSB0aGUKKyAqIG11bHRpcGxpZXIgdGFibGVzIGlmIG5lY2Vzc2FyeS4KKyAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBmaXJzdCBvdXRwdXQgcGFzcyBtYXkgb2NjdXIgYmVmb3JlIGFueSBkYXRhCisgKiBoYXMgYmVlbiBzZWVuIGZvciBzb21lIGNvbXBvbmVudHMsIGFuZCB0aHVzIGJlZm9yZSB0aGVpciBRLXRhYmxlcyBoYXZlCisgKiBiZWVuIHNhdmVkIGF3YXkuICBUbyBoYW5kbGUgdGhpcyBjYXNlLCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcHJlc2V0CisgKiB0byB6ZXJvZXM7IHRoZSByZXN1bHQgb2YgdGhlIElEQ1Qgd2lsbCBiZSBhIG5ldXRyYWwgZ3JheSBsZXZlbC4KKyAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIElEQ1QgbWV0aG9kIGNvZGUgdGhhdCBlYWNoIG11bHRpcGxpZXIgdGFibGUKKyAgICogaXMgY3VycmVudGx5IHNldCB1cCBmb3IsIG9yIC0xIGlmIGl0J3Mgbm90IHlldCBzZXQgdXAuCisgICAqIFRoZSBhY3R1YWwgbXVsdGlwbGllciB0YWJsZXMgYXJlIHBvaW50ZWQgdG8gYnkgZGN0X3RhYmxlIGluIHRoZQorICAgKiBwZXItY29tcG9uZW50IGNvbXBfaW5mbyBzdHJ1Y3R1cmVzLgorICAgKi8KKyAgaW50IGN1cl9tZXRob2RbTUFYX0NPTVBPTkVOVFNdOworfSBteV9pZGN0X2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfaWRjdF9jb250cm9sbGVyICogbXlfaWRjdF9wdHI7CisKKworLyogQWxsb2NhdGVkIG11bHRpcGxpZXIgdGFibGVzOiBiaWcgZW5vdWdoIGZvciBhbnkgc3VwcG9ydGVkIHZhcmlhbnQgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgIElTTE9XX01VTFRfVFlQRSBpc2xvd19hcnJheVtEQ1RTSVpFMl07CisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICBJRkFTVF9NVUxUX1RZUEUgaWZhc3RfYXJyYXlbRENUU0laRTJdOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICBGTE9BVF9NVUxUX1RZUEUgZmxvYXRfYXJyYXlbRENUU0laRTJdOworI2VuZGlmCit9IG11bHRpcGxpZXJfdGFibGU7CisKKworLyogVGhlIGN1cnJlbnQgc2NhbGVkLUlEQ1Qgcm91dGluZXMgcmVxdWlyZSBJU0xPVy1zdHlsZSBtdWx0aXBsaWVyIHRhYmxlcywKKyAqIHNvIGJlIHN1cmUgdG8gY29tcGlsZSB0aGF0IGNvZGUgaWYgZWl0aGVyIElTTE9XIG9yIFNDQUxJTkcgaXMgcmVxdWVzdGVkLgorICovCisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorI2RlZmluZSBQUk9WSURFX0lTTE9XX1RBQkxFUworI2Vsc2UKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisjZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBQcmVwYXJlIGZvciBhbiBvdXRwdXQgcGFzcy4KKyAqIEhlcmUgd2Ugc2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciBlYWNoIGNvbXBvbmVudCBhbmQgYnVpbGQKKyAqIGEgbWF0Y2hpbmcgbXVsdGlwbGllciB0YWJsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lkY3RfcHRyIGlkY3QgPSAobXlfaWRjdF9wdHIpIGNpbmZvLT5pZGN0OworICBpbnQgY2ksIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludCBtZXRob2QgPSAwOworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIG1ldGhvZF9wdHIgPSBOVUxMOworICBKUVVBTlRfVEJMICogcXRibDsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIFNlbGVjdCB0aGUgcHJvcGVyIElEQ1Qgcm91dGluZSBmb3IgdGhpcyBjb21wb25lbnQncyBzY2FsaW5nICovCisgICAgc3dpdGNoIChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIHsKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisgICAgY2FzZSAxOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xeDE7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisjaWYgKGRlZmluZWQoTlZfQVJNX05FT04pICYmIGRlZmluZWQoX19BUk1fSEFWRV9ORU9OKSkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgICAgIGlmIChjYXBfbmVvbl9pZGN0XzJ4MigpKSB7CisgICAgICAgIG1ldGhvZF9wdHIgPSBqc2ltZF9pZGN0XzJ4MjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMngyOworICAgICAgfQorI2Vsc2UKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMngyOworI2VuZGlmCisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisjaWYgKGRlZmluZWQoTlZfQVJNX05FT04pICYmIGRlZmluZWQoX19BUk1fSEFWRV9ORU9OKSkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykKKwkgIGlmIChjYXBfbmVvbl9pZGN0XzR4NCgpKSB7CisgICAgICAgIG1ldGhvZF9wdHIgPSBqc2ltZF9pZGN0XzR4NDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0OworICAgICAgfQorI2Vsc2UKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0OworI2VuZGlmCisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgRENUU0laRToKKyAgICAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKKyNpZmRlZiBBTkRST0lEX0FSTVY2X0lEQ1QKKyAgICAgIGNhc2UgSkRDVF9JU0xPVzoKKyAgICAgIGNhc2UgSkRDVF9JRkFTVDoKKwltZXRob2RfcHRyID0ganBlZ19pZGN0X2FybXY2OworCW1ldGhvZCA9IEpEQ1RfSUZBU1Q7CisJYnJlYWs7CisjZWxzZSAvKiBBTkRST0lEX0FSTVY2X0lEQ1QgKi8KKyNpZmRlZiBBTkRST0lEX0lOVEVMU1NFMl9JRENUCisgICAgICBjYXNlIEpEQ1RfSVNMT1c6CisgICAgICBjYXNlIEpEQ1RfSUZBU1Q6CisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pbnRlbHNzZTsKKwltZXRob2QgPSBKRENUX0lTTE9XOyAvKiBVc2UgcXVhbnQgdGFibGUgb2YgSVNMT1cuKi8KKwlicmVhazsKKyNlbHNlIC8qIEFORFJPSURfSU5URUxTU0UyX0lEQ1QgKi8KKyNpZmRlZiBBTkRST0lEX01JUFNfSURDVAorICAgICAgY2FzZSBKRENUX0lTTE9XOgorICAgICAgY2FzZSBKRENUX0lGQVNUOgorCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfbWlwczsKKwltZXRob2QgPSBKRENUX0lGQVNUOworCWJyZWFrOworI2Vsc2UgLyogQU5EUk9JRF9NSVBTX0lEQ1QgKi8KKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisgICAgICBjYXNlIEpEQ1RfSVNMT1c6CisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgICAgICAgaWYgKGNhcF9uZW9uX2lkY3RfaXNsb3coKSkKKyAgICAgICAgICBtZXRob2RfcHRyID0ganNpbWRfaWRjdF9pc2xvdzsKKyAgICAgICAgZWxzZQorI2VuZGlmCisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pc2xvdzsKKwltZXRob2QgPSBKRENUX0lTTE9XOworCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICAgICAgY2FzZSBKRENUX0lGQVNUOgorI2lmIChkZWZpbmVkKE5WX0FSTV9ORU9OKSAmJiBkZWZpbmVkKF9fQVJNX0hBVkVfTkVPTikpIHx8IGRlZmluZWQoX19hYXJjaDY0X18pCisgICAgICAgIGlmIChjYXBfbmVvbl9pZGN0X2lmYXN0KCkpIHsKKyAgICAgICAgICBtZXRob2RfcHRyID0ganNpbWRfaWRjdF9pZmFzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0X2lmYXN0OworICAgICAgICB9CisjZWxzZQorICAgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0X2lmYXN0OworI2VuZGlmCisJbWV0aG9kID0gSkRDVF9JRkFTVDsKKwlicmVhazsKKyNlbmRpZgorI2VuZGlmIC8qIEFORFJPSURfTUlQU19JRENUICovCisjZW5kaWYgLyogQU5EUk9JRF9JTlRFTFNTRTJfSURDVCovCisjZW5kaWYgLyogQU5EUk9JRF9BUk1WNl9JRENUICovCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgICAgY2FzZSBKRENUX0ZMT0FUOgorCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfZmxvYXQ7CisJbWV0aG9kID0gSkRDVF9GTE9BVDsKKwlicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKwlFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisJYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX0RDVFNJWkUsIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWRjdC0+cHViLmludmVyc2VfRENUW2NpXSA9IG1ldGhvZF9wdHI7CisgICAgLyogQ3JlYXRlIG11bHRpcGxpZXIgdGFibGUgZnJvbSBxdWFudCB0YWJsZS4KKyAgICAgKiBIb3dldmVyLCB3ZSBjYW4gc2tpcCB0aGlzIGlmIHRoZSBjb21wb25lbnQgaXMgdW5pbnRlcmVzdGluZworICAgICAqIG9yIGlmIHdlIGFscmVhZHkgYnVpbHQgdGhlIHRhYmxlLiAgQWxzbywgaWYgbm8gcXVhbnQgdGFibGUKKyAgICAgKiBoYXMgeWV0IGJlZW4gc2F2ZWQgZm9yIHRoZSBjb21wb25lbnQsIHdlIGxlYXZlIHRoZQorICAgICAqIG11bHRpcGxpZXIgdGFibGUgYWxsLXplcm87IHdlJ2xsIGJlIHJlYWRpbmcgemVyb2VzIGZyb20gdGhlCisgICAgICogY29lZmZpY2llbnQgY29udHJvbGxlcidzIGJ1ZmZlciBhbnl3YXkuCisgICAgICovCisgICAgaWYgKCEgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCB8fCBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9PSBtZXRob2QpCisgICAgICBjb250aW51ZTsKKyAgICBxdGJsID0gY29tcHB0ci0+cXVhbnRfdGFibGU7CisgICAgaWYgKHF0YmwgPT0gTlVMTCkJCS8qIGhhcHBlbnMgaWYgbm8gZGF0YSB5ZXQgZm9yIGNvbXBvbmVudCAqLworICAgICAgY29udGludWU7CisgICAgaWRjdC0+Y3VyX21ldGhvZFtjaV0gPSBtZXRob2Q7CisgICAgc3dpdGNoIChtZXRob2QpIHsKKyNpZmRlZiBQUk9WSURFX0lTTE9XX1RBQkxFUworICAgIGNhc2UgSkRDVF9JU0xPVzoKKyAgICAgIHsKKwkvKiBGb3IgTEwmTSBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHJhdyBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMsIGJ1dCBhcmUgc3RvcmVkIGFzIGludHMgdG8gZW5zdXJlIGFjY2VzcyBlZmZpY2llbmN5LgorCSAqLworCUlTTE9XX01VTFRfVFlQRSAqIGlzbXRibCA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJICBpc210YmxbaV0gPSAoSVNMT1dfTVVMVF9UWVBFKSBxdGJsLT5xdWFudHZhbFtpXTsKKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfSUZBU1Q6CisgICAgICB7CisJLyogRm9yIEFBJk4gSURDVCBtZXRob2QsIG11bHRpcGxpZXJzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKiBGb3IgaW50ZWdlciBvcGVyYXRpb24sIHRoZSBtdWx0aXBsaWVyIHRhYmxlIGlzIHRvIGJlIHNjYWxlZCBieQorCSAqIElGQVNUX1NDQUxFX0JJVFMuCisJICovCisJSUZBU1RfTVVMVF9UWVBFICogaWZtdGJsID0gKElGQVNUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisjaWZkZWYgQU5EUk9JRF9BUk1WNl9JRENUCisJLyogUHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNSBiaXRzLiAqLworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzY2FsZXNbRENUU0laRTJdID0geworCSAgMzI3NjgsIDQ1NDUxLCA0MjgxMywgMzg1MzEsIDMyNzY4LCAyNTc0NiwgMTc3MzQsICA5MDQxLAorCSAgNDU0NTEsIDYzMDQyLCA1OTM4NCwgNTM0NDQsIDQ1NDUxLCAzNTcxMCwgMjQ1OTgsIDEyNTQwLAorCSAgNDI4MTMsIDU5Mzg0LCA1NTkzOCwgNTAzNDMsIDQyODEzLCAzMzYzOCwgMjMxNzAsIDExODEyLAorCSAgMzg1MzEsIDUzNDQ0LCA1MDM0MywgNDUzMDgsIDM4NTMxLCAzMDI3NCwgMjA4NTMsIDEwNjMxLAorCSAgMzI3NjgsIDQ1NDUxLCA0MjgxMywgMzg1MzEsIDMyNzY4LCAyNTc0NiwgMTc3MzQsICA5MDQxLAorCSAgMjU3NDYsIDM1NzEwLCAzMzYzOCwgMzAyNzQsIDI1NzQ2LCAyMDIyOCwgMTM5MzMsICA3MTAzLAorCSAgMTc3MzQsIDI0NTk4LCAyMzE3MCwgMjA4NTMsIDE3NzM0LCAxMzkzMywgIDk1OTgsICA0ODkzLAorCSAgIDkwNDEsIDEyNTQwLCAxMTgxMiwgMTA2MzEsICA5MDQxLCAgNzEwMywgIDQ4OTMsICAyNDk0LAorCX07CisJLyogSW52ZXJzZSBtYXAgb2YgWzcsIDUsIDEsIDMsIDAsIDIsIDQsIDZdLiAqLworCXN0YXRpYyBjb25zdCBjaGFyIG9yZGVyc1tEQ1RTSVpFXSA9IHs0LCAyLCA1LCAzLCA2LCAxLCA3LCAwfTsKKwkvKiBSZW9yZGVyIHRoZSBjb2x1bW5zIGFmdGVyIHRyYW5zcG9zaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgKytpKSB7CisJICBpbnQgaiA9ICgoaSAmIDcpIDw8IDMpICsgb3JkZXJzW2kgPj4gM107CisJICBpZm10Ymxbal0gPSAocXRibC0+cXVhbnR2YWxbaV0gKiBzY2FsZXNbaV0gKyAyKSA+PiAyOworCX0KKyNlbHNlIC8qIEFORFJPSURfQVJNVjZfSURDVCAqLworCisjZGVmaW5lIENPTlNUX0JJVFMgMTQKKwlzdGF0aWMgY29uc3QgSU5UMTYgYWFuc2NhbGVzW0RDVFNJWkUyXSA9IHsKKwkgIC8qIHByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTQgYml0cyAqLworCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAorCSAgMjE0MDcsIDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsICA1OTA2LAorCSAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAorCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMTI4NzMsIDE3ODU1LCAxNjgxOSwgMTUxMzcsIDEyODczLCAxMDExNCwgIDY5NjcsICAzNTUyLAorCSAgIDg4NjcsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAorCSAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3CisJfTsKKwlTSElGVF9URU1QUworCisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGlmbXRibFtpXSA9IChJRkFTVF9NVUxUX1RZUEUpCisJICAgIERFU0NBTEUoTVVMVElQTFkxNlYxNigoSU5UMzIpIHF0YmwtPnF1YW50dmFsW2ldLAorCQkJCSAgKElOVDMyKSBhYW5zY2FsZXNbaV0pLAorCQkgICAgQ09OU1RfQklUUy1JRkFTVF9TQ0FMRV9CSVRTKTsKKwl9CisjZW5kaWYgLyogQU5EUk9JRF9BUk1WNl9JRENUICovCisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfRkxPQVQ6CisgICAgICB7CisJLyogRm9yIGZsb2F0IEFBJk4gSURDVCBtZXRob2QsIG11bHRpcGxpZXJzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKi8KKwlGTE9BVF9NVUxUX1RZUEUgKiBmbXRibCA9IChGTE9BVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworCWludCByb3csIGNvbDsKKwlzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yW0RDVFNJWkVdID0geworCSAgMS4wLCAxLjM4NzAzOTg0NSwgMS4zMDY1NjI5NjUsIDEuMTc1ODc1NjAyLAorCSAgMS4wLCAwLjc4NTY5NDk1OCwgMC41NDExOTYxMDAsIDAuMjc1ODk5Mzc5CisJfTsKKworCWkgPSAwOworCWZvciAocm93ID0gMDsgcm93IDwgRENUU0laRTsgcm93KyspIHsKKwkgIGZvciAoY29sID0gMDsgY29sIDwgRENUU0laRTsgY29sKyspIHsKKwkgICAgZm10YmxbaV0gPSAoRkxPQVRfTVVMVF9UWVBFKQorCSAgICAgICgoZG91YmxlKSBxdGJsLT5xdWFudHZhbFtpXSAqCisJICAgICAgIGFhbnNjYWxlZmFjdG9yW3Jvd10gKiBhYW5zY2FsZWZhY3Rvcltjb2xdKTsKKwkgICAgaSsrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIElEQ1QgbWFuYWdlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2ludmVyc2VfZGN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9pZGN0X3B0ciBpZGN0OworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgaWRjdCA9IChteV9pZGN0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9pZGN0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmlkY3QgPSAoc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgKikgaWRjdDsKKyAgaWRjdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsb2NhdGUgYW5kIHByZS16ZXJvIGEgbXVsdGlwbGllciB0YWJsZSBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBjb21wcHRyLT5kY3RfdGFibGUgPQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihtdWx0aXBsaWVyX3RhYmxlKSk7CisgICAgTUVNWkVSTyhjb21wcHRyLT5kY3RfdGFibGUsIFNJWkVPRihtdWx0aXBsaWVyX3RhYmxlKSk7CisgICAgLyogTWFyayBtdWx0aXBsaWVyIHRhYmxlIG5vdCB5ZXQgc2V0IHVwIGZvciBhbnkgbWV0aG9kICovCisgICAgaWRjdC0+Y3VyX21ldGhvZFtjaV0gPSAtMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvanBlZy9qZGh1ZmYuYyBiL2pwZWcvamRodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1ZDRmZAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRodWZmLmMKQEAgLTAsMCArMSw4OTQgQEAKKy8qCisgKiBqZGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcy4KKyAqCisgKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBpbnB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBiYWNrCisgKiB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZSB2YXJpYWJsZXMKKyAqIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUgcGVybWFuZW50CisgKiBzdG9yYWdlIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGh1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqZHBodWZmLmMgKi8KKworTE9DQUwoYm9vbGVhbikgcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKTsKKworCisvKgorICogRXhwYW5kZWQgZW50cm9weSBkZWNvZGVyIG9iamVjdCBmb3IgSHVmZm1hbiBkZWNvZGluZy4KKyAqCisgKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCisgKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLworfSBzYXZhYmxlX3N0YXRlOworCisvKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCisgKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KKyAqLworCisjaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQorI2Vsc2UKKyNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0CisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKKwkoKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCisjZW5kaWYKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgbG9hZGVkIGludG8gbG9jYWwgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGVhY2ggTUNVLgorICAgKiBJbiBjYXNlIG9mIHN1c3BlbnNpb24sIHdlIGV4aXQgV0lUSE9VVCB1cGRhdGluZyB0aGVtLgorICAgKi8KKyAgYml0cmVhZF9wZXJtX3N0YXRlIGJpdHN0YXRlOwkvKiBCaXQgYnVmZmVyIGF0IHN0YXJ0IG9mIE1DVSAqLworICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogT3RoZXIgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KKyAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCisKKyAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikgKi8KKyAgZF9kZXJpdmVkX3RibCAqIGRjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKKyAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKKworICAvKiBQcmVjYWxjdWxhdGVkIGluZm8gc2V0IHVwIGJ5IHN0YXJ0X3Bhc3MgZm9yIHVzZSBpbiBkZWNvZGVfbWN1OiAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzIHRvIGJlIHVzZWQgZm9yIGVhY2ggYmxvY2sgd2l0aGluIGFuIE1DVSAqLworICBkX2Rlcml2ZWRfdGJsICogZGNfY3VyX3RibHNbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisgIGRfZGVyaXZlZF90YmwgKiBhY19jdXJfdGJsc1tEX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgLyogV2hldGhlciB3ZSBjYXJlIGFib3V0IHRoZSBEQyBhbmQgQUMgY29lZmZpY2llbnQgdmFsdWVzIGZvciBlYWNoIGJsb2NrICovCisgIGJvb2xlYW4gZGNfbmVlZGVkW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworICBib29sZWFuIGFjX25lZWRlZFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKK30gaHVmZl9lbnRyb3B5X2RlY29kZXI7CisKK3R5cGVkZWYgaHVmZl9lbnRyb3B5X2RlY29kZXIgKiBodWZmX2VudHJvcHlfcHRyOworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaSwgYmxrbiwgZGN0YmwsIGFjdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICAvKiBDaGVjayB0aGF0IHRoZSBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbCBhcmUgT0sgZm9yIHNlcXVlbnRpYWwgSlBFRy4KKyAgICogVGhpcyBvdWdodCB0byBiZSBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCB3ZSBtYWtlIGl0IGEgd2FybmluZyBiZWNhdXNlCisgICAqIHRoZXJlIGFyZSBzb21lIGJhc2VsaW5lIGZpbGVzIG91dCB0aGVyZSB3aXRoIGFsbCB6ZXJvZXMgaW4gdGhlc2UgYnl0ZXMuCisgICAqLworICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPlNlICE9IERDVFNJWkUyLTEgfHwKKyAgICAgIGNpbmZvLT5BaCAhPSAwIHx8IGNpbmZvLT5BbCAhPSAwKQorICAgIFdBUk5NUyhjaW5mbywgSldSTl9OT1RfU0VRVUVOVElBTCk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCisgICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KKyAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCisJCQkgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKKyAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAorCQkJICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIFByZWNhbGN1bGF0ZSBkZWNvZGluZyBpbmZvIGZvciBlYWNoIGJsb2NrIGluIGFuIE1DVSBvZiB0aGlzIHNjYW4gKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIFByZWNhbGN1bGF0ZSB3aGljaCB0YWJsZSB0byB1c2UgZm9yIGVhY2ggYmxvY2sgKi8KKyAgICBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOworICAgIGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub107CisgICAgLyogRGVjaWRlIHdoZXRoZXIgd2UgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyAqLworICAgIGlmIChjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisgICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBUUlVFOworICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgQUNzIGlmIHByb2R1Y2luZyBhIDEvOHRoLXNpemUgaW1hZ2UgKi8KKyAgICAgIGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPiAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOworICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KKyAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKK30KKworCisvKgorICogQ29tcHV0ZSB0aGUgZGVyaXZlZCB2YWx1ZXMgZm9yIGEgSHVmZm1hbiB0YWJsZS4KKyAqIFRoaXMgcm91dGluZSBhbHNvIHBlcmZvcm1zIHNvbWUgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHRhYmxlLgorICoKKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamRwaHVmZi5jLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19tYWtlX2RfZGVyaXZlZF90YmwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCQkJIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpCit7CisgIEpIVUZGX1RCTCAqaHRibDsKKyAgZF9kZXJpdmVkX3RibCAqZHRibDsKKyAgaW50IHAsIGksIGwsIHNpLCBudW1zeW1ib2xzOworICBpbnQgbG9va2JpdHMsIGN0cjsKKyAgY2hhciBodWZmc2l6ZVsyNTddOworICB1bnNpZ25lZCBpbnQgaHVmZmNvZGVbMjU3XTsKKyAgdW5zaWduZWQgaW50IGNvZGU7CisKKyAgLyogTm90ZSB0aGF0IGh1ZmZzaXplW10gYW5kIGh1ZmZjb2RlW10gYXJlIGZpbGxlZCBpbiBjb2RlLWxlbmd0aCBvcmRlciwKKyAgICogcGFyYWxsZWxpbmcgdGhlIG9yZGVyIG9mIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaW4gaHRibC0+aHVmZnZhbFtdLgorICAgKi8KKworICAvKiBGaW5kIHRoZSBpbnB1dCBIdWZmbWFuIHRhYmxlICovCisgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX0hVRkZfVEJMUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7CisgIGh0YmwgPQorICAgIGlzREMgPyBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0Ymxub10gOiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0Ymxub107CisgIGlmIChodGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOworCisgIC8qIEFsbG9jYXRlIGEgd29ya3NwYWNlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLiAqLworICBpZiAoKnBkdGJsID09IE5VTEwpCisgICAgKnBkdGJsID0gKGRfZGVyaXZlZF90YmwgKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YoZF9kZXJpdmVkX3RibCkpOworICBkdGJsID0gKnBkdGJsOworICBkdGJsLT5wdWIgPSBodGJsOwkJLyogZmlsbCBpbiBiYWNrIGxpbmsgKi8KKyAgCisgIC8qIEZpZ3VyZSBDLjE6IG1ha2UgdGFibGUgb2YgSHVmZm1hbiBjb2RlIGxlbmd0aCBmb3IgZWFjaCBzeW1ib2wgKi8KKworICBwID0gMDsKKyAgZm9yIChsID0gMTsgbCA8PSAxNjsgbCsrKSB7CisgICAgaSA9IChpbnQpIGh0YmwtPmJpdHNbbF07CisgICAgaWYgKGkgPCAwIHx8IHAgKyBpID4gMjU2KQkvKiBwcm90ZWN0IGFnYWluc3QgdGFibGUgb3ZlcnJ1biAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgd2hpbGUgKGktLSkKKyAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKKyAgfQorICBodWZmc2l6ZVtwXSA9IDA7CisgIG51bXN5bWJvbHMgPSBwOworICAKKyAgLyogRmlndXJlIEMuMjogZ2VuZXJhdGUgdGhlIGNvZGVzIHRoZW1zZWx2ZXMgKi8KKyAgLyogV2UgYWxzbyB2YWxpZGF0ZSB0aGF0IHRoZSBjb3VudHMgcmVwcmVzZW50IGEgbGVnYWwgSHVmZm1hbiBjb2RlIHRyZWUuICovCisgIAorICBjb2RlID0gMDsKKyAgc2kgPSBodWZmc2l6ZVswXTsKKyAgcCA9IDA7CisgIHdoaWxlIChodWZmc2l6ZVtwXSkgeworICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IHNpKSB7CisgICAgICBodWZmY29kZVtwKytdID0gY29kZTsKKyAgICAgIGNvZGUrKzsKKyAgICB9CisgICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKKyAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBzaSkpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBjb2RlIDw8PSAxOworICAgIHNpKys7CisgIH0KKworICAvKiBGaWd1cmUgRi4xNTogZ2VuZXJhdGUgZGVjb2RpbmcgdGFibGVzIGZvciBiaXQtc2VxdWVudGlhbCBkZWNvZGluZyAqLworCisgIHAgPSAwOworICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKKyAgICBpZiAoaHRibC0+Yml0c1tsXSkgeworICAgICAgLyogdmFsb2Zmc2V0W2xdID0gaHVmZnZhbFtdIGluZGV4IG9mIDFzdCBzeW1ib2wgb2YgY29kZSBsZW5ndGggbCwKKyAgICAgICAqIG1pbnVzIHRoZSBtaW5pbXVtIGNvZGUgb2YgbGVuZ3RoIGwKKyAgICAgICAqLworICAgICAgZHRibC0+dmFsb2Zmc2V0W2xdID0gKElOVDMyKSBwIC0gKElOVDMyKSBodWZmY29kZVtwXTsKKyAgICAgIHAgKz0gaHRibC0+Yml0c1tsXTsKKyAgICAgIGR0YmwtPm1heGNvZGVbbF0gPSBodWZmY29kZVtwLTFdOyAvKiBtYXhpbXVtIGNvZGUgb2YgbGVuZ3RoIGwgKi8KKyAgICB9IGVsc2UgeworICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IC0xOwkvKiAtMSBpZiBubyBjb2RlcyBvZiB0aGlzIGxlbmd0aCAqLworICAgIH0KKyAgfQorICBkdGJsLT5tYXhjb2RlWzE3XSA9IDB4RkZGRkZMOyAvKiBlbnN1cmVzIGpwZWdfaHVmZl9kZWNvZGUgdGVybWluYXRlcyAqLworCisgIC8qIENvbXB1dGUgbG9va2FoZWFkIHRhYmxlcyB0byBzcGVlZCB1cCBkZWNvZGluZy4KKyAgICogRmlyc3Qgd2Ugc2V0IGFsbCB0aGUgdGFibGUgZW50cmllcyB0byAwLCBpbmRpY2F0aW5nICJ0b28gbG9uZyI7CisgICAqIHRoZW4gd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlIHNob3J0IGVub3VnaCBhbmQKKyAgICogZmlsbCBpbiBhbGwgdGhlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIGJpdCBzZXF1ZW5jZXMgc3RhcnRpbmcKKyAgICogd2l0aCB0aGF0IGNvZGUuCisgICAqLworCisgIE1FTVpFUk8oZHRibC0+bG9va19uYml0cywgU0laRU9GKGR0YmwtPmxvb2tfbmJpdHMpKTsKKworICBwID0gMDsKKyAgZm9yIChsID0gMTsgbCA8PSBIVUZGX0xPT0tBSEVBRDsgbCsrKSB7CisgICAgZm9yIChpID0gMTsgaSA8PSAoaW50KSBodGJsLT5iaXRzW2xdOyBpKyssIHArKykgeworICAgICAgLyogbCA9IGN1cnJlbnQgY29kZSdzIGxlbmd0aCwgcCA9IGl0cyBpbmRleCBpbiBodWZmY29kZVtdICYgaHVmZnZhbFtdLiAqLworICAgICAgLyogR2VuZXJhdGUgbGVmdC1qdXN0aWZpZWQgY29kZSBmb2xsb3dlZCBieSBhbGwgcG9zc2libGUgYml0IHNlcXVlbmNlcyAqLworICAgICAgbG9va2JpdHMgPSBodWZmY29kZVtwXSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7CisgICAgICBmb3IgKGN0ciA9IDEgPDwgKEhVRkZfTE9PS0FIRUFELWwpOyBjdHIgPiAwOyBjdHItLSkgeworCWR0YmwtPmxvb2tfbmJpdHNbbG9va2JpdHNdID0gbDsKKwlkdGJsLT5sb29rX3N5bVtsb29rYml0c10gPSBodGJsLT5odWZmdmFsW3BdOworCWxvb2tiaXRzKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogVmFsaWRhdGUgc3ltYm9scyBhcyBiZWluZyByZWFzb25hYmxlLgorICAgKiBGb3IgQUMgdGFibGVzLCB3ZSBtYWtlIG5vIGNoZWNrLCBidXQgYWNjZXB0IGFsbCBieXRlIHZhbHVlcyAwLi4yNTUuCisgICAqIEZvciBEQyB0YWJsZXMsIHdlIHJlcXVpcmUgdGhlIHN5bWJvbHMgdG8gYmUgaW4gcmFuZ2UgMC4uMTUuCisgICAqIChUaWdodGVyIGJvdW5kcyBjb3VsZCBiZSBhcHBsaWVkIGRlcGVuZGluZyBvbiB0aGUgZGF0YSBkZXB0aCBhbmQgbW9kZSwKKyAgICogYnV0IHRoaXMgaXMgc3VmZmljaWVudCB0byBlbnN1cmUgc2FmZSBkZWNvZGluZy4pCisgICAqLworICBpZiAoaXNEQykgeworICAgIGZvciAoaSA9IDA7IGkgPCBudW1zeW1ib2xzOyBpKyspIHsKKyAgICAgIGludCBzeW0gPSBodGJsLT5odWZmdmFsW2ldOworICAgICAgaWYgKHN5bSA8IDAgfHwgc3ltID4gMTUpCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIE91dC1vZi1saW5lIGNvZGUgZm9yIGJpdCBmZXRjaGluZyAoc2hhcmVkIHdpdGggamRwaHVmZi5jKS4KKyAqIFNlZSBqZGh1ZmYuaCBmb3IgaW5mbyBhYm91dCB1c2FnZS4KKyAqIE5vdGU6IGN1cnJlbnQgdmFsdWVzIG9mIGdldF9idWZmZXIgYW5kIGJpdHNfbGVmdCBhcmUgcGFzc2VkIGFzIHBhcmFtZXRlcnMsCisgKiBidXQgYXJlIHJldHVybmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgc3RhdGUgc3RydWN0LgorICoKKyAqIE9uIG1vc3QgbWFjaGluZXMgTUlOX0dFVF9CSVRTIHNob3VsZCBiZSAyNSB0byBhbGxvdyB0aGUgZnVsbCAzMi1iaXQgd2lkdGgKKyAqIG9mIGdldF9idWZmZXIgdG8gYmUgdXNlZC4gIChPbiBtYWNoaW5lcyB3aXRoIHdpZGVyIHdvcmRzLCBhbiBldmVuIGxhcmdlcgorICogYnVmZmVyIGNvdWxkIGJlIHVzZWQuKSAgSG93ZXZlciwgb24gc29tZSBtYWNoaW5lcyAzMi1iaXQgc2hpZnRzIGFyZQorICogcXVpdGUgc2xvdyBhbmQgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHBsYWNlcyBzaGlmdGVkLgorICogKFRoaXMgaXMgdHJ1ZSB3aXRoIG1vc3QgUEMgY29tcGlsZXJzLCBmb3IgaW5zdGFuY2UuKSAgSW4gdGhpcyBjYXNlIGl0IG1heQorICogYmUgYSB3aW4gdG8gc2V0IE1JTl9HRVRfQklUUyB0byB0aGUgbWluaW11bSB2YWx1ZSBvZiAxNS4gIFRoaXMgcmVkdWNlcyB0aGUKKyAqIGF2ZXJhZ2Ugc2hpZnQgZGlzdGFuY2UgYXQgdGhlIGNvc3Qgb2YgbW9yZSBjYWxscyB0byBqcGVnX2ZpbGxfYml0X2J1ZmZlci4KKyAqLworCisjaWZkZWYgU0xPV19TSElGVF8zMgorI2RlZmluZSBNSU5fR0VUX0JJVFMgIDE1CS8qIG1pbmltdW0gYWxsb3dhYmxlIHZhbHVlICovCisjZWxzZQorI2RlZmluZSBNSU5fR0VUX0JJVFMgIChCSVRfQlVGX1NJWkUtNykKKyNlbmRpZgorCisKK0dMT0JBTChib29sZWFuKQoranBlZ19maWxsX2JpdF9idWZmZXIgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAorCQkgICAgICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKKwkJICAgICAgaW50IG5iaXRzKQorLyogTG9hZCB1cCB0aGUgYml0IGJ1ZmZlciB0byBhIGRlcHRoIG9mIGF0IGxlYXN0IG5iaXRzICovCit7CisgIC8qIENvcHkgaGVhdmlseSB1c2VkIHN0YXRlIGZpZWxkcyBpbnRvIGxvY2FscyAoaG9wZWZ1bGx5IHJlZ2lzdGVycykgKi8KKyAgcmVnaXN0ZXIgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gc3RhdGUtPm5leHRfaW5wdXRfYnl0ZTsKKyAgcmVnaXN0ZXIgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IHN0YXRlLT5ieXRlc19pbl9idWZmZXI7CisgIGpfZGVjb21wcmVzc19wdHIgY2luZm8gPSBzdGF0ZS0+Y2luZm87CisKKyAgLyogQXR0ZW1wdCB0byBsb2FkIGF0IGxlYXN0IE1JTl9HRVRfQklUUyBiaXRzIGludG8gZ2V0X2J1ZmZlci4gKi8KKyAgLyogKEl0IGlzIGFzc3VtZWQgdGhhdCBubyByZXF1ZXN0IHdpbGwgYmUgZm9yIG1vcmUgdGhhbiB0aGF0IG1hbnkgYml0cy4pICovCisgIC8qIFdlIGZhaWwgdG8gZG8gc28gb25seSBpZiB3ZSBoaXQgYSBtYXJrZXIgb3IgYXJlIGZvcmNlZCB0byBzdXNwZW5kLiAqLworCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7CS8qIGNhbm5vdCBhZHZhbmNlIHBhc3QgYSBtYXJrZXIgKi8KKyAgICB3aGlsZSAoYml0c19sZWZ0IDwgTUlOX0dFVF9CSVRTKSB7CisgICAgICByZWdpc3RlciBpbnQgYzsKKworICAgICAgLyogQXR0ZW1wdCB0byByZWFkIGEgYnl0ZSAqLworICAgICAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7CisJaWYgKCEgKCpjaW5mby0+c3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkKKwkgIHJldHVybiBGQUxTRTsKKwluZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisJYnl0ZXNfaW5fYnVmZmVyID0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOworICAgICAgfQorICAgICAgYnl0ZXNfaW5fYnVmZmVyLS07CisgICAgICBjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7CisKKyAgICAgIC8qIElmIGl0J3MgMHhGRiwgY2hlY2sgYW5kIGRpc2NhcmQgc3R1ZmZlZCB6ZXJvIGJ5dGUgKi8KKyAgICAgIGlmIChjID09IDB4RkYpIHsKKwkvKiBMb29wIGhlcmUgdG8gZGlzY2FyZCBhbnkgcGFkZGluZyBGRidzIG9uIHRlcm1pbmF0aW5nIG1hcmtlciwKKwkgKiBzbyB0aGF0IHdlIGNhbiBzYXZlIGEgdmFsaWQgdW5yZWFkX21hcmtlciB2YWx1ZS4gIE5PVEU6IHdlIHdpbGwKKwkgKiBhY2NlcHQgbXVsdGlwbGUgRkYncyBmb2xsb3dlZCBieSBhIDAgYXMgbWVhbmluZyBhIHNpbmdsZSBGRiBkYXRhCisJICogYnl0ZS4gIFRoaXMgZGF0YSBwYXR0ZXJuIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkLgorCSAqLworCWRvIHsKKwkgIGlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgeworCSAgICBpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQorCSAgICAgIHJldHVybiBGQUxTRTsKKwkgICAgbmV4dF9pbnB1dF9ieXRlID0gY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlOworCSAgICBieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7CisJICB9CisJICBieXRlc19pbl9idWZmZXItLTsKKwkgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKKwl9IHdoaWxlIChjID09IDB4RkYpOworCisJaWYgKGMgPT0gMCkgeworCSAgLyogRm91bmQgRkYvMDAsIHdoaWNoIHJlcHJlc2VudHMgYW4gRkYgZGF0YSBieXRlICovCisJICBjID0gMHhGRjsKKwl9IGVsc2UgeworCSAgLyogT29wcywgaXQncyBhY3R1YWxseSBhIG1hcmtlciBpbmRpY2F0aW5nIGVuZCBvZiBjb21wcmVzc2VkIGRhdGEuCisJICAgKiBTYXZlIHRoZSBtYXJrZXIgY29kZSBmb3IgbGF0ZXIgdXNlLgorCSAgICogRmluZSBwb2ludDogaXQgbWlnaHQgYXBwZWFyIHRoYXQgd2Ugc2hvdWxkIHNhdmUgdGhlIG1hcmtlciBpbnRvCisJICAgKiBiaXRyZWFkIHdvcmtpbmcgc3RhdGUsIG5vdCBzdHJhaWdodCBpbnRvIHBlcm1hbmVudCBzdGF0ZS4gIEJ1dAorCSAgICogb25jZSB3ZSBoYXZlIGhpdCBhIG1hcmtlciwgd2UgY2Fubm90IG5lZWQgdG8gc3VzcGVuZCB3aXRoaW4gdGhlCisJICAgKiBjdXJyZW50IE1DVSwgYmVjYXVzZSB3ZSB3aWxsIHJlYWQgbm8gbW9yZSBieXRlcyBmcm9tIHRoZSBkYXRhCisJICAgKiBzb3VyY2UuICBTbyBpdCBpcyBPSyB0byB1cGRhdGUgcGVybWFuZW50IHN0YXRlIHJpZ2h0IGF3YXkuCisJICAgKi8KKwkgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzsKKwkgIC8qIFNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBzb21lIGZha2UgemVybyBiaXRzLiAqLworCSAgZ290byBub19tb3JlX2J5dGVzOworCX0KKyAgICAgIH0KKworICAgICAgLyogT0ssIGxvYWQgYyBpbnRvIGdldF9idWZmZXIgKi8KKyAgICAgIGdldF9idWZmZXIgPSAoZ2V0X2J1ZmZlciA8PCA4KSB8IGM7CisgICAgICBiaXRzX2xlZnQgKz0gODsKKyAgICB9IC8qIGVuZCB3aGlsZSAqLworICB9IGVsc2UgeworICBub19tb3JlX2J5dGVzOgorICAgIC8qIFdlIGdldCBoZXJlIGlmIHdlJ3ZlIHJlYWQgdGhlIG1hcmtlciB0aGF0IHRlcm1pbmF0ZXMgdGhlIGNvbXByZXNzZWQKKyAgICAgKiBkYXRhIHNlZ21lbnQuICBUaGVyZSBzaG91bGQgYmUgZW5vdWdoIGJpdHMgaW4gdGhlIGJ1ZmZlciByZWdpc3RlcgorICAgICAqIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3Q7IGlmIHNvLCBubyBwcm9ibGVtLgorICAgICAqLworICAgIGlmIChuYml0cyA+IGJpdHNfbGVmdCkgeworICAgICAgLyogVWgtb2guICBSZXBvcnQgY29ycnVwdGVkIGRhdGEgdG8gdXNlciBhbmQgc3R1ZmYgemVyb2VzIGludG8KKyAgICAgICAqIHRoZSBkYXRhIHN0cmVhbSwgc28gdGhhdCB3ZSBjYW4gcHJvZHVjZSBzb21lIGtpbmQgb2YgaW1hZ2UuCisgICAgICAgKiBXZSB1c2UgYSBub252b2xhdGlsZSBmbGFnIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHdhcm5pbmcgbWVzc2FnZQorICAgICAgICogYXBwZWFycyBwZXIgZGF0YSBzZWdtZW50LgorICAgICAgICovCisgICAgICBpZiAoISBjaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEpIHsKKwlXQVJOTVMoY2luZm8sIEpXUk5fSElUX01BUktFUik7CisJY2luZm8tPmVudHJvcHktPmluc3VmZmljaWVudF9kYXRhID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIC8qIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHplcm8gYml0cyAqLworICAgICAgZ2V0X2J1ZmZlciA8PD0gTUlOX0dFVF9CSVRTIC0gYml0c19sZWZ0OworICAgICAgYml0c19sZWZ0ID0gTUlOX0dFVF9CSVRTOworICAgIH0KKyAgfQorCisgIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCisgIHN0YXRlLT5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7CisgIHN0YXRlLT5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7CisgIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKKyAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogT3V0LW9mLWxpbmUgY29kZSBmb3IgSHVmZm1hbiBjb2RlIGRlY29kaW5nLgorICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX2h1ZmZfZGVjb2RlIChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwKKwkJICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKKwkJICBkX2Rlcml2ZWRfdGJsICogaHRibCwgaW50IG1pbl9iaXRzKQoreworICByZWdpc3RlciBpbnQgbCA9IG1pbl9iaXRzOworICByZWdpc3RlciBJTlQzMiBjb2RlOworCisgIC8qIEhVRkZfREVDT0RFIGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGNvZGUgaXMgYXQgbGVhc3QgbWluX2JpdHMgKi8KKyAgLyogYml0cyBsb25nLCBzbyBmZXRjaCB0aGF0IG1hbnkgYml0cyBpbiBvbmUgc3dvb3AuICovCisKKyAgQ0hFQ0tfQklUX0JVRkZFUigqc3RhdGUsIGwsIHJldHVybiAtMSk7CisgIGNvZGUgPSBHRVRfQklUUyhsKTsKKworICAvKiBDb2xsZWN0IHRoZSByZXN0IG9mIHRoZSBIdWZmbWFuIGNvZGUgb25lIGJpdCBhdCBhIHRpbWUuICovCisgIC8qIFRoaXMgaXMgcGVyIEZpZ3VyZSBGLjE2IGluIHRoZSBKUEVHIHNwZWMuICovCisKKyAgd2hpbGUgKGNvZGUgPiBodGJsLT5tYXhjb2RlW2xdKSB7CisgICAgY29kZSA8PD0gMTsKKyAgICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgMSwgcmV0dXJuIC0xKTsKKyAgICBjb2RlIHw9IEdFVF9CSVRTKDEpOworICAgIGwrKzsKKyAgfQorCisgIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCisgIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKKyAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKKworICAvKiBXaXRoIGdhcmJhZ2UgaW5wdXQgd2UgbWF5IHJlYWNoIHRoZSBzZW50aW5lbCB2YWx1ZSBsID0gMTcuICovCisKKyAgaWYgKGwgPiAxNikgeworICAgIFdBUk5NUyhzdGF0ZS0+Y2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7CisgICAgcmV0dXJuIDA7CQkJLyogZmFrZSBhIHplcm8gYXMgdGhlIHNhZmVzdCByZXN1bHQgKi8KKyAgfQorCisgIHJldHVybiBodGJsLT5wdWItPmh1ZmZ2YWxbIChpbnQpIChjb2RlICsgaHRibC0+dmFsb2Zmc2V0W2xdKSBdOworfQorCisKKy8qCisgKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgorICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCisgKi8KKworI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLworICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCisgIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKKyAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAorICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCisgICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OworCisjZW5kaWYgLyogQVZPSURfVEFCTEVTICovCisKKworLyoKKyAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgorICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3Byb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2k7CisKKyAgLyogVGhyb3cgYXdheSBhbnkgdW51c2VkIGJpdHMgcmVtYWluaW5nIGluIGJpdCBidWZmZXI7ICovCisgIC8qIGluY2x1ZGUgYW55IGZ1bGwgYnl0ZXMgaW4gbmV4dF9tYXJrZXIncyBjb3VudCBvZiBkaXNjYXJkZWQgYnl0ZXMgKi8KKyAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCAvIDg7CisgIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7CisKKyAgLyogQWR2YW5jZSBwYXN0IHRoZSBSU1RuIG1hcmtlciAqLworICBpZiAoISAoKmNpbmZvLT5tYXJrZXItPnJlYWRfcmVzdGFydF9tYXJrZXIpIChjaW5mbykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworCisgIC8qIFJlc2V0IHJlc3RhcnQgY291bnRlciAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworCisgIC8qIFJlc2V0IG91dC1vZi1kYXRhIGZsYWcsIHVubGVzcyByZWFkX3Jlc3RhcnRfbWFya2VyIGxlZnQgdXMgc21hY2sgdXAKKyAgICogYWdhaW5zdCBhIG1hcmtlci4gIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGVuZCB1cCB0cmVhdGluZyB0aGUgbmV4dCBkYXRhCisgICAqIHNlZ21lbnQgYXMgZW1wdHksIGFuZCB3ZSBjYW4gYXZvaWQgcHJvZHVjaW5nIGJvZ3VzIG91dHB1dCBwaXhlbHMgYnkKKyAgICogbGVhdmluZyB0aGUgZmxhZyBzZXQuCisgICAqLworICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkKKyAgICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFNhdmUgdGhlIGN1cnJlbnQgSHVmZm1hbiBkZW9jZGUgcG9zaXRpb24gYW5kIHRoZSBEQyBjb2VmZmljaWVudHMKKyAqIGZvciBlYWNoIGNvbXBvbmVudCBpbnRvIGJpdHN0cmVhbV9vZmZzZXQgYW5kIGRjX2luZm9bXSwgcmVzcGVjdGl2ZWx5LgorICovCitNRVRIT0RERUYodm9pZCkKK2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgc2hvcnQgaW50ICpkY19pbmZvID0gb2Zmc2V0LT5wcmV2X2RjOworICBpbnQgaTsKKyAganBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oY2luZm8sIG9mZnNldCk7CisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7CisgICAgZGNfaW5mb1tpXSA9IGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2ldOworICB9Cit9CisKKy8qCisgKiBTYXZlIHRoZSBjdXJyZW50IEh1ZmZtYW4gZGVjb2RlciBwb3NpdGlvbiBhbmQgdGhlIGJpdCBidWZmZXIKKyAqIGludG8gYml0c3RyZWFtX29mZnNldCBhbmQgZ2V0X2J1ZmZlciwgcmVzcGVjdGl2ZWx5LgorICovCitHTE9CQUwodm9pZCkKK2pwZWdfZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCkKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgZGF0YSBzZWdtZW50CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybjsKKyAgfQorCisgIC8vIFNhdmUgcmVzdGFydHNfdG9fZ28gYW5kIG5leHRfcmVzdGFydF9udW0KKyAgb2Zmc2V0LT5yZXN0YXJ0c190b19nbyA9ICh1bnNpZ25lZCBzaG9ydCkgZW50cm9weS0+cmVzdGFydHNfdG9fZ287CisgIG9mZnNldC0+bmV4dF9yZXN0YXJ0X251bSA9IGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW07CisKKyAgb2Zmc2V0LT5iaXRzdHJlYW1fb2Zmc2V0ID0KKyAgICAgIChqZ2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbykgPDwgTE9HX1RXT19CSVRfQlVGX1NJWkUpCisgICAgICArIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdDsKKworICBvZmZzZXQtPmdldF9idWZmZXIgPSBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgdG8gZGVjb2RlIHRoZSBpbWFnZQorICogc3RhcnRpbmcgZnJvbSB0aGUgYml0c3RyZWFtIHBvc2l0aW9uIHJlY29yZGVkIGluIG9mZnNldC4KKyAqLworTUVUSE9EREVGKHZvaWQpCitjb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHNob3J0IGludCAqZGNfaW5mbyA9IG9mZnNldC5wcmV2X2RjOworICBpbnQgaTsKKyAganBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGNpbmZvLCBvZmZzZXQpOworICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgeworICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2ldID0gZGNfaW5mb1tpXTsKKyAgfQorfQorCisvKgorICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgcmVhZGVyIHBvc2l0aW9uIGFuZCBiaXQgYnVmZmVyLgorICovCitHTE9CQUwodm9pZCkKK2pwZWdfY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCkKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworCisgIC8vIFJlc3RvcmUgcmVzdGFydHNfdG9fZ28gYW5kIG5leHRfcmVzdGFydF9udW0KKyAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IG9mZnNldC5yZXN0YXJ0c190b19nbzsKKyAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IG9mZnNldC5uZXh0X3Jlc3RhcnRfbnVtOworCisgIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fb2Zmc2V0ID0gb2Zmc2V0LmJpdHN0cmVhbV9vZmZzZXQ7CisgIGludCBibGtuLCBpOworCisgIHVuc2lnbmVkIGludCBieXRlX29mZnNldCA9IGJpdHN0cmVhbV9vZmZzZXQgPj4gTE9HX1RXT19CSVRfQlVGX1NJWkU7CisgIHVuc2lnbmVkIGludCBiaXRfaW5fYml0X2J1ZmZlciA9CisgICAgICBiaXRzdHJlYW1fb2Zmc2V0ICYgKCgxIDw8IExPR19UV09fQklUX0JVRl9TSVpFKSAtIDEpOworCisgIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uX2JpdChjaW5mbywgYnl0ZV9vZmZzZXQsCisgICAgICAgICAgYml0X2luX2JpdF9idWZmZXIsIG9mZnNldC5nZXRfYnVmZmVyKTsKK30KKworLyoKKyAqIERlY29kZSBhbmQgcmV0dXJuIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKKyAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgorICoKKyAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKKyAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBIQVMgQkVFTiBaRVJPRUQgQlkgVEhFIENBTExFUi4KKyAqIChXaG9sZXNhbGUgemVyb2luZyBpcyB1c3VhbGx5IGEgbGl0dGxlIGZhc3RlciB0aGFuIHJldGFpbC4uLikKKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCisgKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0CisgKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKKyAqIHRoaXMgbW9kdWxlLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuKQorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgYmxrbjsKKyAgQklUUkVBRF9TVEFURV9WQVJTOworICBzYXZhYmxlX3N0YXRlIHN0YXRlOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLworICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7CisKKyAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCisKKyAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgICAgSkJMT0NLUk9XIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07CisgICAgICBkX2Rlcml2ZWRfdGJsICogZGN0YmwgPSBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXTsKKyAgICAgIGRfZGVyaXZlZF90YmwgKiBhY3RibCA9IGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dOworICAgICAgcmVnaXN0ZXIgaW50IHMsIGssIHI7CisKKyAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGRjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7CisgICAgICBpZiAocykgeworCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJciA9IEdFVF9CSVRTKHMpOworCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKKyAgICAgIH0KKworICAgICAgaWYgKGVudHJvcHktPmRjX25lZWRlZFtibGtuXSkgeworCS8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworCWludCBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKwlzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKKwlzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworCS8qIE91dHB1dCB0aGUgREMgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdID0gMCkgKi8KKwkoKmJsb2NrKVswXSA9IChKQ09FRikgczsKKyAgICAgIH0KKworICAgICAgaWYgKGVudHJvcHktPmFjX25lZWRlZFtibGtuXSkgeworCisJLyogU2VjdGlvbiBGLjIuMi4yOiBkZWNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyAqLworCS8qIFNpbmNlIHplcm9lcyBhcmUgc2tpcHBlZCwgb3V0cHV0IGFyZWEgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZWhhbmQgKi8KKwlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgeworCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7CisgICAgICAKKwkgIHIgPSBzID4+IDQ7CisJICBzICY9IDE1OworICAgICAgCisJICBpZiAocykgeworCSAgICBrICs9IHI7CisJICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJICAgIHIgPSBHRVRfQklUUyhzKTsKKwkgICAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOworCSAgICAvKiBPdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyLgorCSAgICAgKiBOb3RlOiB0aGUgZXh0cmEgZW50cmllcyBpbiBqcGVnX25hdHVyYWxfb3JkZXJbXSB3aWxsIHNhdmUgdXMKKwkgICAgICogaWYgayA+PSBEQ1RTSVpFMiwgd2hpY2ggY291bGQgaGFwcGVuIGlmIHRoZSBkYXRhIGlzIGNvcnJ1cHRlZC4KKwkgICAgICovCisJICAgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIHM7CisJICB9IGVsc2UgeworCSAgICBpZiAociAhPSAxNSkKKwkgICAgICBicmVhazsKKwkgICAgayArPSAxNTsKKwkgIH0KKwl9CisKKyAgICAgIH0gZWxzZSB7CisKKwkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCisJLyogSW4gdGhpcyBwYXRoIHdlIGp1c3QgZGlzY2FyZCB0aGUgdmFsdWVzICovCisJZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKKwkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDMpOworICAgICAgCisJICByID0gcyA+PiA0OworCSAgcyAmPSAxNTsKKyAgICAgIAorCSAgaWYgKHMpIHsKKwkgICAgayArPSByOworCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgICBEUk9QX0JJVFMocyk7CisJICB9IGVsc2UgeworCSAgICBpZiAociAhPSAxNSkKKwkgICAgICBicmVhazsKKwkgICAgayArPSAxNTsKKwkgIH0KKwl9CisKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogRGVjb2RlIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogVGhlIHByb3Bvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsY3VsYXRlIHRoZQorICogZGF0YSBsZW5ndGggb2Ygb25lIE1DVSBpbiBIdWZmbWFuLWNvZGVkIGZvcm1hdC4KKyAqIFRoZXJlZm9yZSwgYWxsIGNvZWZmaWNpZW50cyBhcmUgZGlzY2FyZGVkLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGJsa247CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKyAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKKworICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOworCisgICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLworCisgICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICAgIGRfZGVyaXZlZF90YmwgKiBkY3RibCA9IGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dOworICAgICAgZF9kZXJpdmVkX3RibCAqIGFjdGJsID0gZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl07CisgICAgICByZWdpc3RlciBpbnQgcywgaywgcjsKKworICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCisKKyAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCisgICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgZGN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKKyAgICAgIGlmIChzKSB7CisJQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwlyID0gR0VUX0JJVFMocyk7CisJcyA9IEhVRkZfRVhURU5EKHIsIHMpOworICAgICAgfQorCisgICAgICAvKiBkaXNjYXJkIGFsbCBjb2VmZmljaWVudHMgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0pIHsKKwkvKiBDb252ZXJ0IERDIGRpZmZlcmVuY2UgdG8gYWN0dWFsIHZhbHVlLCB1cGRhdGUgbGFzdF9kY192YWwgKi8KKwlpbnQgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisJcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07CisJc3RhdGUubGFzdF9kY192YWxbY2ldID0gczsKKyAgICAgIH0KKyAgICAgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDMpOworCisgICAgICAgIHIgPSBzID4+IDQ7CisgICAgICAgIHMgJj0gMTU7CisKKyAgICAgICAgaWYgKHMpIHsKKyAgICAgICAgICBrICs9IHI7CisgICAgICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKyAgICAgICAgICBEUk9QX0JJVFMocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHIgIT0gMTUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBrICs9IDE1OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKKyAgfQorCisgIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2h1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OworICBpbnQgaTsKKworICBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YoaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKKyAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7CisgIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19odWZmX2RlY29kZXI7CisgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdTsKKyAgZW50cm9weS0+cHViLmRlY29kZV9tY3VfZGlzY2FyZF9jb2VmID0gZGVjb2RlX21jdV9kaXNjYXJkX2NvZWY7CisgIGVudHJvcHktPnB1Yi5jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyID0gY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcjsKKyAgZW50cm9weS0+cHViLmdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbiA9CisgICAgICAgIGdldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbjsKKyAgZW50cm9weS0+cHViLmluZGV4ID0gTlVMTDsKKworICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKKyAgfQorfQorCisvKgorICogQ2FsbCBhZnRlciBqcGVnX3JlYWRfaGVhZGVyCisgKi8KK0dMT0JBTCh2b2lkKQoranBlZ19jcmVhdGVfaHVmZm1hbl9pbmRleChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkKK3sKKyAgaW50IGksIHM7CisgIGluZGV4LT5zY2FuX2NvdW50ID0gMTsKKyAgaW5kZXgtPnRvdGFsX2lNQ1Vfcm93cyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7CisgIGluZGV4LT5zY2FuID0gKGh1ZmZtYW5fc2Nhbl9oZWFkZXIqKW1hbGxvYyhpbmRleC0+c2Nhbl9jb3VudAorICAgICAgICAgICogc2l6ZW9mKGh1ZmZtYW5fc2Nhbl9oZWFkZXIpKTsKKyAgaW5kZXgtPnNjYW5bMF0ub2Zmc2V0ID0gKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKiltYWxsb2MoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cworICAgICAgICAgICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKSk7CisgIGluZGV4LT5zY2FuWzBdLnByZXZfTUNVX29mZnNldC5iaXRzdHJlYW1fb2Zmc2V0ID0gMDsKKyAgaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZSA9IERFRkFVTFRfTUNVX1NBTVBMRV9TSVpFOworCisgIGluZGV4LT5tZW1fdXNlZCA9IHNpemVvZihodWZmbWFuX3NjYW5faGVhZGVyKQorICAgICAgKyBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3lfaHVmZm1hbl9pbmRleChodWZmbWFuX2luZGV4ICppbmRleCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPnNjYW5fY291bnQ7IGkrKykgeworICAgICAgICBmb3IoaiA9IDA7IGogPCBpbmRleC0+dG90YWxfaU1DVV9yb3dzOyBqKyspIHsKKyAgICAgICAgICAgIGZyZWUoaW5kZXgtPnNjYW5baV0ub2Zmc2V0W2pdKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGluZGV4LT5zY2FuW2ldLm9mZnNldCk7CisgICAgfQorICAgIGZyZWUoaW5kZXgtPnNjYW4pOworfQorCisvKgorICogU2V0IHRoZSByZWFkZXIgYnl0ZSBwb3NpdGlvbiB0byBvZmZzZXQKKyAqLworR0xPQkFMKHZvaWQpCitqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgb2Zmc2V0KQoreworICBpZiAoY2luZm8tPnNyYy0+c2Vla19pbnB1dF9kYXRhKSB7CisgICAgY2luZm8tPnNyYy0+c2Vla19pbnB1dF9kYXRhKGNpbmZvLCBvZmZzZXQpOworICB9IGVsc2UgeworICAgIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvLT5zcmMtPmN1cnJlbnRfb2Zmc2V0IC0gb2Zmc2V0OworICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvLT5zcmMtPnN0YXJ0X2lucHV0X2J5dGUgKyBvZmZzZXQ7CisgIH0KK30KKworLyoKKyAqIFNldCB0aGUgcmVhZGVyIGJ5dGUgcG9zaXRpb24gdG8gb2Zmc2V0IGFuZCBiaXQgcG9zaXRpb24gdG8gYml0X2xlZnQKKyAqIHdpdGggYml0IGJ1ZmZlciBzZXQgdG8gYnVmLgorICovCitHTE9CQUwodm9pZCkKK2pzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uX2JpdChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBpbnQgYnl0ZV9vZmZzZXQsIGludCBiaXRfbGVmdCwgSU5UMzIgYnVmKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisKKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gYml0X2xlZnQ7CisgIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIgPSBidWY7CisKKyAganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8sIGJ5dGVfb2Zmc2V0KTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCByZWFkZXIgYnl0ZSBwb3NpdGlvbi4KKyAqLworR0xPQkFMKGludCkKK2pnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHJldHVybiBjaW5mby0+c3JjLT5jdXJyZW50X29mZnNldCAtIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKK30KZGlmZiAtLWdpdCBhL2pwZWcvamRodWZmLmggYi9qcGVnL2pkaHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjBhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pkaHVmZi5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogamRodWZmLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcworICogdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIHNlcXVlbnRpYWwgZGVjb2RlciAoamRodWZmLmMpIGFuZCB0aGUKKyAqIHByb2dyZXNzaXZlIGRlY29kZXIgKGpkcGh1ZmYuYykuICBObyBvdGhlciBtb2R1bGVzIG5lZWQgdG8gc2VlIHRoZXNlLgorICovCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX21ha2VfZF9kZXJpdmVkX3RibAlqTWtERGVyaXZlZAorI2RlZmluZSBqcGVnX2ZpbGxfYml0X2J1ZmZlcglqRmlsQml0QnVmCisjZGVmaW5lIGpwZWdfaHVmZl9kZWNvZGUJakh1ZkRlY29kZQorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLworCisjZGVmaW5lIEhVRkZfTE9PS0FIRUFECTgJLyogIyBvZiBiaXRzIG9mIGxvb2thaGVhZCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIEJhc2ljIHRhYmxlczogKGVsZW1lbnQgWzBdIG9mIGVhY2ggYXJyYXkgaXMgdW51c2VkKSAqLworICBJTlQzMiBtYXhjb2RlWzE4XTsJCS8qIGxhcmdlc3QgY29kZSBvZiBsZW5ndGggayAoLTEgaWYgbm9uZSkgKi8KKyAgLyogKG1heGNvZGVbMTddIGlzIGEgc2VudGluZWwgdG8gZW5zdXJlIGpwZWdfaHVmZl9kZWNvZGUgdGVybWluYXRlcykgKi8KKyAgSU5UMzIgdmFsb2Zmc2V0WzE3XTsJCS8qIGh1ZmZ2YWxbXSBvZmZzZXQgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCisgIC8qIHZhbG9mZnNldFtrXSA9IGh1ZmZ2YWxbXSBpbmRleCBvZiAxc3Qgc3ltYm9sIG9mIGNvZGUgbGVuZ3RoIGssIGxlc3MKKyAgICogdGhlIHNtYWxsZXN0IGNvZGUgb2YgbGVuZ3RoIGs7IHNvIGdpdmVuIGEgY29kZSBvZiBsZW5ndGggaywgdGhlCisgICAqIGNvcnJlc3BvbmRpbmcgc3ltYm9sIGlzIGh1ZmZ2YWxbY29kZSArIHZhbG9mZnNldFtrXV0KKyAgICovCisKKyAgLyogTGluayB0byBwdWJsaWMgSHVmZm1hbiB0YWJsZSAobmVlZGVkIG9ubHkgaW4ganBlZ19odWZmX2RlY29kZSkgKi8KKyAgSkhVRkZfVEJMICpwdWI7CisKKyAgLyogTG9va2FoZWFkIHRhYmxlczogaW5kZXhlZCBieSB0aGUgbmV4dCBIVUZGX0xPT0tBSEVBRCBiaXRzIG9mCisgICAqIHRoZSBpbnB1dCBkYXRhIHN0cmVhbS4gIElmIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBpcyBubyBtb3JlCisgICAqIHRoYW4gSFVGRl9MT09LQUhFQUQgYml0cyBsb25nLCB3ZSBjYW4gb2J0YWluIGl0cyBsZW5ndGggYW5kCisgICAqIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCBkaXJlY3RseSBmcm9tIHRoZXNlIHRhYmxlcy4KKyAgICovCisgIGludCBsb29rX25iaXRzWzE8PEhVRkZfTE9PS0FIRUFEXTsgLyogIyBiaXRzLCBvciAwIGlmIHRvbyBsb25nICovCisgIFVJTlQ4IGxvb2tfc3ltWzE8PEhVRkZfTE9PS0FIRUFEXTsgLyogc3ltYm9sLCBvciB1bnVzZWQgKi8KK30gZF9kZXJpdmVkX3RibDsKKworLyogRXhwYW5kIGEgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIGludG8gdGhlIGRlcml2ZWQgZm9ybWF0ICovCitFWFRFUk4odm9pZCkganBlZ19tYWtlX2RfZGVyaXZlZF90YmwKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCSAgICAgZF9kZXJpdmVkX3RibCAqKiBwZHRibCkpOworCisKKy8qCisgKiBGZXRjaGluZyB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGlzIGEgdGltZS1jcml0aWNhbCBvcGVyYXRpb24KKyAqIGZvciB0aGUgSHVmZm1hbiBkZWNvZGVycy4gIFdlIGltcGxlbWVudCBpdCB3aXRoIGEgY29tYmluYXRpb24gb2YgaW5saW5lCisgKiBtYWNyb3MgYW5kIG91dC1vZi1saW5lIHN1YnJvdXRpbmVzLiAgTm90ZSB0aGF0IE4gKHRoZSBudW1iZXIgb2YgYml0cworICogZGVtYW5kZWQgYXQgb25lIHRpbWUpIG5ldmVyIGV4Y2VlZHMgMTUgZm9yIEpQRUcgdXNlLgorICoKKyAqIFdlIHJlYWQgc291cmNlIGJ5dGVzIGludG8gZ2V0X2J1ZmZlciBhbmQgZG9sZSBvdXQgYml0cyBhcyBuZWVkZWQuCisgKiBJZiBnZXRfYnVmZmVyIGFscmVhZHkgY29udGFpbnMgZW5vdWdoIGJpdHMsIHRoZXkgYXJlIGZldGNoZWQgaW4tbGluZQorICogYnkgdGhlIG1hY3JvcyBDSEVDS19CSVRfQlVGRkVSIGFuZCBHRVRfQklUUy4gIFdoZW4gdGhlcmUgYXJlbid0IGVub3VnaAorICogYml0cywganBlZ19maWxsX2JpdF9idWZmZXIgaXMgY2FsbGVkOyBpdCB3aWxsIGF0dGVtcHQgdG8gZmlsbCBnZXRfYnVmZmVyCisgKiBhcyBmdWxsIGFzIHBvc3NpYmxlIChub3QganVzdCB0byB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkOyB0aGlzCisgKiBwcmVmZXRjaGluZyByZWR1Y2VzIHRoZSBvdmVyaGVhZCBjb3N0IG9mIGNhbGxpbmcganBlZ19maWxsX2JpdF9idWZmZXIpLgorICogTm90ZSB0aGF0IGpwZWdfZmlsbF9iaXRfYnVmZmVyIG1heSByZXR1cm4gRkFMU0UgdG8gaW5kaWNhdGUgc3VzcGVuc2lvbi4KKyAqIE9uIFRSVUUgcmV0dXJuLCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBndWFyYW50ZWVzIHRoYXQgZ2V0X2J1ZmZlciBjb250YWlucworICogYXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYml0cyAtLS0gZHVtbXkgemVyb2VzIGFyZSBpbnNlcnRlZCBpZgorICogbmVjZXNzYXJ5LgorICovCisKK3R5cGVkZWYgSU5UMzIgYml0X2J1Zl90eXBlOwkvKiB0eXBlIG9mIGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLworI2RlZmluZSBCSVRfQlVGX1NJWkUgIDMyCS8qIHNpemUgb2YgYnVmZmVyIGluIGJpdHMgKi8KKyNkZWZpbmUgTE9HX1RXT19CSVRfQlVGX1NJWkUgIDUJLyogbG9nXzIoQklUX0JVRl9TSVpFKSAqLworCisvKiBJZiBsb25nIGlzID4gMzIgYml0cyBvbiB5b3VyIG1hY2hpbmUsIGFuZCBzaGlmdGluZy9tYXNraW5nIGxvbmdzIGlzCisgKiByZWFzb25hYmx5IGZhc3QsIG1ha2luZyBiaXRfYnVmX3R5cGUgYmUgbG9uZyBhbmQgc2V0dGluZyBCSVRfQlVGX1NJWkUKKyAqIGFwcHJvcHJpYXRlbHkgc2hvdWxkIGJlIGEgd2luLiAgVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBkZWZpbmUgdGhlIHNpemUKKyAqIHdpdGggc29tZXRoaW5nIGxpa2UgICNkZWZpbmUgQklUX0JVRl9TSVpFIChzaXplb2YoYml0X2J1Zl90eXBlKSo4KQorICogYmVjYXVzZSBub3QgYWxsIG1hY2hpbmVzIG1lYXN1cmUgc2l6ZW9mIGluIDgtYml0IGJ5dGVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsJCS8qIEJpdHJlYWRpbmcgc3RhdGUgc2F2ZWQgYWNyb3NzIE1DVXMgKi8KKyAgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7CS8qIGN1cnJlbnQgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCisgIGludCBiaXRzX2xlZnQ7CQkvKiAjIG9mIHVudXNlZCBiaXRzIGluIGl0ICovCit9IGJpdHJlYWRfcGVybV9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogQml0cmVhZGluZyB3b3JraW5nIHN0YXRlIHdpdGhpbiBhbiBNQ1UgKi8KKyAgLyogQ3VycmVudCBkYXRhIHNvdXJjZSBsb2NhdGlvbiAqLworICAvKiBXZSBuZWVkIGEgY29weSwgcmF0aGVyIHRoYW4gbXVuZ2luZyB0aGUgb3JpZ2luYWwsIGluIGNhc2Ugb2Ygc3VzcGVuc2lvbiAqLworICBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gc291cmNlICovCisgIHNpemVfdCBieXRlc19pbl9idWZmZXI7CS8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHNvdXJjZSBidWZmZXIgKi8KKyAgLyogQml0IGlucHV0IGJ1ZmZlciAtLS0gbm90ZSB0aGVzZSB2YWx1ZXMgYXJlIGtlcHQgaW4gcmVnaXN0ZXIgdmFyaWFibGVzLAorICAgKiBub3QgaW4gdGhpcyBzdHJ1Y3QsIGluc2lkZSB0aGUgaW5uZXIgbG9vcHMuCisgICAqLworICBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsJLyogY3VycmVudCBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KKyAgaW50IGJpdHNfbGVmdDsJCS8qICMgb2YgdW51c2VkIGJpdHMgaW4gaXQgKi8KKyAgLyogUG9pbnRlciBuZWVkZWQgYnkganBlZ19maWxsX2JpdF9idWZmZXIuICovCisgIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayB0byBkZWNvbXByZXNzIG1hc3RlciByZWNvcmQgKi8KK30gYml0cmVhZF93b3JraW5nX3N0YXRlOworCisvKiBNYWNyb3MgdG8gZGVjbGFyZSBhbmQgbG9hZC9zYXZlIGJpdHJlYWQgbG9jYWwgdmFyaWFibGVzLiAqLworI2RlZmluZSBCSVRSRUFEX1NUQVRFX1ZBUlMgIFwKKwlyZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsgIFwKKwlyZWdpc3RlciBpbnQgYml0c19sZWZ0OyAgXAorCWJpdHJlYWRfd29ya2luZ19zdGF0ZSBicl9zdGF0ZQorCisjZGVmaW5lIEJJVFJFQURfTE9BRF9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAorCWJyX3N0YXRlLmNpbmZvID0gY2luZm9wOyBcCisJYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlID0gY2luZm9wLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsgXAorCWJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvcC0+c3JjLT5ieXRlc19pbl9idWZmZXI7IFwKKwlnZXRfYnVmZmVyID0gcGVybXN0YXRlLmdldF9idWZmZXI7IFwKKwliaXRzX2xlZnQgPSBwZXJtc3RhdGUuYml0c19sZWZ0OworCisjZGVmaW5lIEJJVFJFQURfU0FWRV9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAorCWNpbmZvcC0+c3JjLT5uZXh0X2lucHV0X2J5dGUgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7IFwKKwljaW5mb3AtPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyOyBcCisJcGVybXN0YXRlLmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOyBcCisJcGVybXN0YXRlLmJpdHNfbGVmdCA9IGJpdHNfbGVmdAorCisvKgorICogVGhlc2UgbWFjcm9zIHByb3ZpZGUgdGhlIGluLWxpbmUgcG9ydGlvbiBvZiBiaXQgZmV0Y2hpbmcuCisgKiBVc2UgQ0hFQ0tfQklUX0JVRkZFUiB0byBlbnN1cmUgdGhlcmUgYXJlIE4gYml0cyBpbiBnZXRfYnVmZmVyCisgKiBiZWZvcmUgdXNpbmcgR0VUX0JJVFMsIFBFRUtfQklUUywgb3IgRFJPUF9CSVRTLgorICogVGhlIHZhcmlhYmxlcyBnZXRfYnVmZmVyIGFuZCBiaXRzX2xlZnQgYXJlIGFzc3VtZWQgdG8gYmUgbG9jYWxzLAorICogYnV0IHRoZSBzdGF0ZSBzdHJ1Y3QgbWlnaHQgbm90IGJlIChqcGVnX2h1ZmZfZGVjb2RlIG5lZWRzIHRoaXMpLgorICoJQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuLGFjdGlvbik7CisgKgkJRW5zdXJlIHRoZXJlIGFyZSBOIGJpdHMgaW4gZ2V0X2J1ZmZlcjsgaWYgc3VzcGVuZCwgdGFrZSBhY3Rpb24uCisgKiAgICAgIHZhbCA9IEdFVF9CSVRTKG4pOworICoJCUZldGNoIG5leHQgTiBiaXRzLgorICogICAgICB2YWwgPSBQRUVLX0JJVFMobik7CisgKgkJRmV0Y2ggbmV4dCBOIGJpdHMgd2l0aG91dCByZW1vdmluZyB0aGVtIGZyb20gdGhlIGJ1ZmZlci4KKyAqCURST1BfQklUUyhuKTsKKyAqCQlEaXNjYXJkIG5leHQgTiBiaXRzLgorICogVGhlIHZhbHVlIE4gc2hvdWxkIGJlIGEgc2ltcGxlIHZhcmlhYmxlLCBub3QgYW4gZXhwcmVzc2lvbiwgYmVjYXVzZSBpdAorICogaXMgZXZhbHVhdGVkIG11bHRpcGxlIHRpbWVzLgorICovCisKKyNkZWZpbmUgQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuYml0cyxhY3Rpb24pIFwKKwl7IGlmIChiaXRzX2xlZnQgPCAobmJpdHMpKSB7ICBcCisJICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCYoc3RhdGUpLGdldF9idWZmZXIsYml0c19sZWZ0LG5iaXRzKSkgIFwKKwkgICAgICB7IGFjdGlvbjsgfSAgXAorCSAgICBnZXRfYnVmZmVyID0gKHN0YXRlKS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSAoc3RhdGUpLmJpdHNfbGVmdDsgfSB9CisKKyNkZWZpbmUgR0VUX0JJVFMobmJpdHMpIFwKKwkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLT0gKG5iaXRzKSkpKSAmICgoMTw8KG5iaXRzKSktMSkpCisKKyNkZWZpbmUgUEVFS19CSVRTKG5iaXRzKSBcCisJKCgoaW50KSAoZ2V0X2J1ZmZlciA+PiAoYml0c19sZWZ0IC0gIChuYml0cykpKSkgJiAoKDE8PChuYml0cykpLTEpKQorCisjZGVmaW5lIERST1BfQklUUyhuYml0cykgXAorCShiaXRzX2xlZnQgLT0gKG5iaXRzKSkKKworLyogTG9hZCB1cCB0aGUgYml0IGJ1ZmZlciB0byBhIGRlcHRoIG9mIGF0IGxlYXN0IG5iaXRzICovCitFWFRFUk4oYm9vbGVhbikganBlZ19maWxsX2JpdF9idWZmZXIKKwlKUFAoKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLCByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwKKwkgICAgIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsIGludCBuYml0cykpOworCisKKy8qCisgKiBDb2RlIGZvciBleHRyYWN0aW5nIG5leHQgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZnJvbSBpbnB1dCBiaXQgc3RyZWFtLgorICogQWdhaW4sIHRoaXMgaXMgdGltZS1jcml0aWNhbCBhbmQgd2UgbWFrZSB0aGUgbWFpbiBwYXRocyBiZSBtYWNyb3MuCisgKgorICogV2UgdXNlIGEgbG9va2FoZWFkIHRhYmxlIHRvIHByb2Nlc3MgY29kZXMgb2YgdXAgdG8gSFVGRl9MT09LQUhFQUQgYml0cworICogd2l0aG91dCBsb29waW5nLiAgVXN1YWxseSwgbW9yZSB0aGFuIDk1JSBvZiB0aGUgSHVmZm1hbiBjb2RlcyB3aWxsIGJlIDgKKyAqIG9yIGZld2VyIGJpdHMgbG9uZy4gIFRoZSBmZXcgb3Zlcmxlbmd0aCBjb2RlcyBhcmUgaGFuZGxlZCB3aXRoIGEgbG9vcCwKKyAqIHdoaWNoIG5lZWQgbm90IGJlIGlubGluZSBjb2RlLgorICoKKyAqIE5vdGVzIGFib3V0IHRoZSBIVUZGX0RFQ09ERSBtYWNybzoKKyAqIDEuIE5lYXIgdGhlIGVuZCBvZiB0aGUgZGF0YSBzZWdtZW50LCB3ZSBtYXkgZmFpbCB0byBnZXQgZW5vdWdoIGJpdHMKKyAqICAgIGZvciBhIGxvb2thaGVhZC4gIEluIHRoYXQgY2FzZSwgd2UgZG8gaXQgdGhlIGhhcmQgd2F5LgorICogMi4gSWYgdGhlIGxvb2thaGVhZCB0YWJsZSBjb250YWlucyBubyBlbnRyeSwgdGhlIG5leHQgY29kZSBtdXN0IGJlCisgKiAgICBtb3JlIHRoYW4gSFVGRl9MT09LQUhFQUQgYml0cyBsb25nLgorICogMy4ganBlZ19odWZmX2RlY29kZSByZXR1cm5zIC0xIGlmIGZvcmNlZCB0byBzdXNwZW5kLgorICovCisKKyNkZWZpbmUgSFVGRl9ERUNPREUocmVzdWx0LHN0YXRlLGh0YmwsZmFpbGFjdGlvbixzbG93bGFiZWwpIFwKK3sgcmVnaXN0ZXIgaW50IG5iLCBsb29rOyBcCisgIGlmIChiaXRzX2xlZnQgPCBIVUZGX0xPT0tBSEVBRCkgeyBcCisgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJnN0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LCAwKSkge2ZhaWxhY3Rpb247fSBcCisgICAgZ2V0X2J1ZmZlciA9IHN0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IHN0YXRlLmJpdHNfbGVmdDsgXAorICAgIGlmIChiaXRzX2xlZnQgPCBIVUZGX0xPT0tBSEVBRCkgeyBcCisgICAgICBuYiA9IDE7IGdvdG8gc2xvd2xhYmVsOyBcCisgICAgfSBcCisgIH0gXAorICBsb29rID0gUEVFS19CSVRTKEhVRkZfTE9PS0FIRUFEKTsgXAorICBpZiAoKG5iID0gaHRibC0+bG9va19uYml0c1tsb29rXSkgIT0gMCkgeyBcCisgICAgRFJPUF9CSVRTKG5iKTsgXAorICAgIHJlc3VsdCA9IGh0YmwtPmxvb2tfc3ltW2xvb2tdOyBcCisgIH0gZWxzZSB7IFwKKyAgICBuYiA9IEhVRkZfTE9PS0FIRUFEKzE7IFwKK3Nsb3dsYWJlbDogXAorICAgIGlmICgocmVzdWx0PWpwZWdfaHVmZl9kZWNvZGUoJnN0YXRlLGdldF9idWZmZXIsYml0c19sZWZ0LGh0YmwsbmIpKSA8IDApIFwKKwl7IGZhaWxhY3Rpb247IH0gXAorICAgIGdldF9idWZmZXIgPSBzdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBzdGF0ZS5iaXRzX2xlZnQ7IFwKKyAgfSBcCit9CisKKy8qIE91dC1vZi1saW5lIGNhc2UgZm9yIEh1ZmZtYW4gY29kZSBmZXRjaGluZyAqLworRVhURVJOKGludCkganBlZ19odWZmX2RlY29kZQorCUpQUCgoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLAorCSAgICAgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwgZF9kZXJpdmVkX3RibCAqIGh0YmwsIGludCBtaW5fYml0cykpOwpkaWZmIC0tZ2l0IGEvanBlZy9qZGlucHV0LmMgYi9qcGVnL2pkaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjYxYzFhCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qZGlucHV0LmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBqZGlucHV0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggY29udHJvbGxpbmcgdGhlIGRlY29tcHJlc3NvcidzIGlucHV0CisgKiBwcm9jZXNzaW5nIChtYXJrZXIgcmVhZGluZyBhbmQgY29lZmZpY2llbnQgZGVjb2RpbmcpLiAgVGhlIGFjdHVhbCBpbnB1dAorICogcmVhZGluZyBpcyBkb25lIGluIGpkbWFya2VyLmMsIGpkaHVmZi5jLCBhbmQgamRwaHVmZi5jLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBQcml2YXRlIHN0YXRlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBib29sZWFuIGluaGVhZGVyczsJCS8qIFRSVUUgdW50aWwgZmlyc3QgU09TIGlzIHJlYWNoZWQgKi8KK30gbXlfaW5wdXRfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9pbnB1dF9jb250cm9sbGVyICogbXlfaW5wdXRjdGxfcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoaW50KSBjb25zdW1lX21hcmtlcnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYoaW50KSBjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBjdXJyZW50X3NjYW4pKTsKKworCisvKgorICogUm91dGluZXMgdG8gY2FsY3VsYXRlIHZhcmlvdXMgcXVhbnRpdGllcyByZWxhdGVkIHRvIHRoZSBzaXplIG9mIHRoZSBpbWFnZS4KKyAqLworCitMT0NBTCh2b2lkKQoraW5pdGlhbF9zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIENhbGxlZCBvbmNlLCB3aGVuIGZpcnN0IFNPUyBtYXJrZXIgaXMgcmVhY2hlZCAqLworeworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogTWFrZSBzdXJlIGltYWdlIGlzbid0IGJpZ2dlciB0aGFuIEkgY2FuIGhhbmRsZSAqLworICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSBKUEVHX01BWF9ESU1FTlNJT04pOworCisgIC8qIEZvciBub3csIHByZWNpc2lvbiBtdXN0IG1hdGNoIGNvbXBpbGVkLWluIHZhbHVlLi4uICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gIT0gQklUU19JTl9KU0FNUExFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUkVDSVNJT04sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7CisKKyAgLyogQ2hlY2sgdGhhdCBudW1iZXIgb2YgY29tcG9uZW50cyB3b24ndCBleGNlZWQgaW50ZXJuYWwgYXJyYXkgc2l6ZXMgKi8KKyAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QT05FTlRTKQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworCisgIC8qIENvbXB1dGUgbWF4aW11bSBzYW1wbGluZyBmYWN0b3JzOyBjaGVjayBmYWN0b3IgdmFsaWRpdHkgKi8KKyAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gMTsKKyAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gMTsKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUiB8fAorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9TQU1QTElORyk7CisgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciwKKwkJCQkgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKKyAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkJCSAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICB9CisKKyAgLyogV2UgaW5pdGlhbGl6ZSBEQ1Rfc2NhbGVkX3NpemUgYW5kIG1pbl9EQ1Rfc2NhbGVkX3NpemUgdG8gRENUU0laRS4KKyAgICogSW4gdGhlIGZ1bGwgZGVjb21wcmVzc29yLCB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBqZG1hc3Rlci5jOworICAgKiBidXQgaW4gdGhlIHRyYW5zY29kZXIsIGpkbWFzdGVyLmMgaXMgbm90IHVzZWQsIHNvIHdlIG11c3QgZG8gaXQgaGVyZS4KKyAgICovCisgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKworICAvKiBDb21wdXRlIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50cyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisgICAgLyogU2l6ZSBpbiBEQ1QgYmxvY2tzICovCisgICAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIC8qIGRvd25zYW1wbGVkX3dpZHRoIGFuZCBkb3duc2FtcGxlZF9oZWlnaHQgd2lsbCBhbHNvIGJlIG92ZXJyaWRkZW4gYnkKKyAgICAgKiBqZG1hc3Rlci5jIGlmIHdlIGFyZSBkb2luZyBmdWxsIGRlY29tcHJlc3Npb24uICBUaGUgdHJhbnNjb2RlciBsaWJyYXJ5CisgICAgICogZG9lc24ndCB1c2UgdGhlc2UgdmFsdWVzLCBidXQgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gbWlnaHQuCisgICAgICovCisgICAgLyogU2l6ZSBpbiBzYW1wbGVzICovCisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3Rvcik7CisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKKyAgICAvKiBNYXJrIGNvbXBvbmVudCBuZWVkZWQsIHVudGlsIGNvbG9yIGNvbnZlcnNpb24gc2F5cyBvdGhlcndpc2UgKi8KKyAgICBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkID0gVFJVRTsKKyAgICAvKiBNYXJrIG5vIHF1YW50aXphdGlvbiB0YWJsZSB5ZXQgc2F2ZWQgZm9yIGNvbXBvbmVudCAqLworICAgIGNvbXBwdHItPnF1YW50X3RhYmxlID0gTlVMTDsKKyAgfQorCisgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3dzLiAqLworICBjaW5mby0+dG90YWxfaU1DVV9yb3dzID0gKEpESU1FTlNJT04pCisgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKKwkJICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisKKyAgLyogRGVjaWRlIHdoZXRoZXIgZmlsZSBjb250YWlucyBtdWx0aXBsZSBzY2FucyAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPCBjaW5mby0+bnVtX2NvbXBvbmVudHMgfHwgY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisgICAgY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgPSBUUlVFOworICBlbHNlCisgICAgY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgPSBGQUxTRTsKKyAgY2luZm8tPm9yaWdpbmFsX2ltYWdlX3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOworfQorCitMT0NBTCh2b2lkKQorcGVyX3NjYW5fc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBwcm9jZXNzaW5nIGEgSlBFRyBzY2FuICovCisvKiBjaW5mby0+Y29tcHNfaW5fc2NhbiBhbmQgY2luZm8tPmN1cl9jb21wX2luZm9bXSB3ZXJlIHNldCBmcm9tIFNPUyBtYXJrZXIgKi8KK3sKKyAgaW50IGNpLCBtY3VibGtzLCB0bXA7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPT0gMSkgeworICAgIAorICAgIC8qIE5vbmludGVybGVhdmVkIChzaW5nbGUtY29tcG9uZW50KSBzY2FuICovCisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdOworICAgIAorICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCisgICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKyAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisgICAgCisgICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW4sIGFsd2F5cyBvbmUgYmxvY2sgcGVyIE1DVSAqLworICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IDE7CisgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IDE7CisgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IDE7CisgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IDE7CisgICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW5zLCBpdCBpcyBjb252ZW5pZW50IHRvIGRlZmluZSBsYXN0X3Jvd19oZWlnaHQKKyAgICAgKiBhcyB0aGUgbnVtYmVyIG9mIGJsb2NrIHJvd3MgcHJlc2VudCBpbiB0aGUgbGFzdCBpTUNVIHJvdy4KKyAgICAgKi8KKyAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgCisgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLworICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMTsKKyAgICBjaW5mby0+TUNVX21lbWJlcnNoaXBbMF0gPSAwOworICAgIAorICB9IGVsc2UgeworICAgIAorICAgIC8qIEludGVybGVhdmVkIChtdWx0aS1jb21wb25lbnQpIHNjYW4gKi8KKyAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPD0gMCB8fCBjaW5mby0+Y29tcHNfaW5fc2NhbiA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+Y29tcHNfaW5fc2NhbiwKKwkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOworICAgIAorICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCisgICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IqRENUU0laRSkpOworICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOworICAgIAorICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMDsKKyAgICAKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAgIC8qIFNhbXBsaW5nIGZhY3RvcnMgZ2l2ZSAjIG9mIGJsb2NrcyBvZiBjb21wb25lbnQgaW4gZWFjaCBNQ1UgKi8KKyAgICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5NQ1VfaGVpZ2h0OworICAgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygbm9uLWR1bW15IGJsb2NrcyBpbiBsYXN0IE1DVSBjb2x1bW4gJiByb3cgKi8KKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IHRtcDsKKyNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgICAgICBpZiAoY2luZm8tPnRpbGVfZGVjb2RlKSB7CisgICAgICAgIHRtcCA9IChpbnQpIChqZGl2X3JvdW5kX3VwKGNpbmZvLT5pbWFnZV93aWR0aCwgOCkKKyAgICAgICAgICAgICAgICAlIGNvbXBwdHItPk1DVV93aWR0aCk7CisgICAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOworICAgICAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IHRtcDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV9oZWlnaHQpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1VfaGVpZ2h0OworICAgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOworICAgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLworICAgICAgbWN1YmxrcyA9IGNvbXBwdHItPk1DVV9ibG9ja3M7CisgICAgICBpZiAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKyBtY3VibGtzID4gRF9NQVhfQkxPQ0tTX0lOX01DVSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9NQ1VfU0laRSk7CisgICAgICB3aGlsZSAobWN1Ymxrcy0tID4gMCkgeworCWNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtjaW5mby0+YmxvY2tzX2luX01DVSsrXSA9IGNpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZGVjb21wcmVzc19wZXJfc2Nhbl9zZXR1cChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKK30KKworCisKKy8qCisgKiBTYXZlIGF3YXkgYSBjb3B5IG9mIHRoZSBRLXRhYmxlIHJlZmVyZW5jZWQgYnkgZWFjaCBjb21wb25lbnQgcHJlc2VudAorICogaW4gdGhlIGN1cnJlbnQgc2NhbiwgdW5sZXNzIGFscmVhZHkgc2F2ZWQgZHVyaW5nIGEgcHJpb3Igc2Nhbi4KKyAqCisgKiBJbiBhIG11bHRpcGxlLXNjYW4gSlBFRyBmaWxlLCB0aGUgZW5jb2RlciBjb3VsZCBhc3NpZ24gZGlmZmVyZW50IGNvbXBvbmVudHMKKyAqIHRoZSBzYW1lIFEtdGFibGUgc2xvdCBudW1iZXIsIGJ1dCBjaGFuZ2UgdGFibGUgZGVmaW5pdGlvbnMgYmV0d2VlbiBzY2FucworICogc28gdGhhdCBlYWNoIGNvbXBvbmVudCB1c2VzIGEgZGlmZmVyZW50IFEtdGFibGUuICAoVGhlIElKRyBlbmNvZGVyIGlzIG5vdAorICogY3VycmVudGx5IGNhcGFibGUgb2YgZG9pbmcgdGhpcywgYnV0IG90aGVyIGVuY29kZXJzIG1pZ2h0LikgIFNpbmNlIHdlIHdhbnQKKyAqIHRvIGJlIGFibGUgdG8gZGVxdWFudGl6ZSBhbGwgdGhlIGNvbXBvbmVudHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgdGhpcworICogbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIHNhdmUgYXdheSB0aGUgdGFibGUgYWN0dWFsbHkgdXNlZCBmb3IgZWFjaCBjb21wb25lbnQuCisgKiBXZSBkbyB0aGlzIGJ5IGNvcHlpbmcgdGhlIHRhYmxlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbiBjb250YWluaW5nCisgKiB0aGUgY29tcG9uZW50LgorICogVGhlIEpQRUcgc3BlYyBwcm9oaWJpdHMgdGhlIGVuY29kZXIgZnJvbSBjaGFuZ2luZyB0aGUgY29udGVudHMgb2YgYSBRLXRhYmxlCisgKiBzbG90IGJldHdlZW4gc2NhbnMgb2YgYSBjb21wb25lbnQgdXNpbmcgdGhhdCBzbG90LiAgSWYgdGhlIGVuY29kZXIgZG9lcyBzbworICogYW55d2F5LCB0aGlzIGRlY29kZXIgd2lsbCBzaW1wbHkgdXNlIHRoZSBRLXRhYmxlIHZhbHVlcyB0aGF0IHdlcmUgY3VycmVudAorICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuIGZvciB0aGUgY29tcG9uZW50LgorICoKKyAqIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbG9va3Mgb25seSBhdCB0aGUgc2F2ZWQgcXVhbnQgdGFibGVzLAorICogbm90IGF0IHRoZSBjdXJyZW50IFEtdGFibGUgc2xvdHMuCisgKi8KKworTE9DQUwodm9pZCkKK2xhdGNoX3F1YW50X3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGNpLCBxdGJsbm87CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpRVUFOVF9UQkwgKiBxdGJsOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAvKiBObyB3b3JrIGlmIHdlIGFscmVhZHkgc2F2ZWQgUS10YWJsZSBmb3IgdGhpcyBjb21wb25lbnQgKi8KKyAgICBpZiAoY29tcHB0ci0+cXVhbnRfdGFibGUgIT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KKyAgICBxdGJsbm8gPSBjb21wcHRyLT5xdWFudF90Ymxfbm87CisgICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8CisJY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOworICAgIC8qIE9LLCBzYXZlIGF3YXkgdGhlIHF1YW50aXphdGlvbiB0YWJsZSAqLworICAgIHF0YmwgPSAoSlFVQU5UX1RCTCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihKUVVBTlRfVEJMKSk7CisgICAgTUVNQ09QWShxdGJsLCBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSwgU0laRU9GKEpRVUFOVF9UQkwpKTsKKyAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IHF0Ymw7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgbW9kdWxlcyB0byByZWFkIGEgc2NhbiBvZiBjb21wcmVzc2VkIGRhdGEuCisgKiBUaGUgZmlyc3QgY2FsbCB0byB0aGlzIGlzIGRvbmUgYnkgamRtYXN0ZXIuYyBhZnRlciBpbml0aWFsaXppbmcKKyAqIHRoZSBlbnRpcmUgZGVjb21wcmVzc29yIChkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKS4KKyAqIFN1YnNlcXVlbnQgY2FsbHMgY29tZSBmcm9tIGNvbnN1bWVfbWFya2VycywgYmVsb3cuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgIGxhdGNoX3F1YW50X3RhYmxlcyhjaW5mbyk7CisgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICgqY2luZm8tPmNvZWYtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7CisgIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNpbmZvLT5jb2VmLT5jb25zdW1lX2RhdGE7CisgIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4OworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYWZ0ZXIgaW5wdXR0aW5nIGEgY29tcHJlc3NlZC1kYXRhIHNjYW4uCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBhZnRlciBpdCdzIHJlYWQgYWxsCisgKiB0aGUgZXhwZWN0ZWQgZGF0YSBvZiB0aGUgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7CisgIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgY29uc3VtZV9tYXJrZXJzX3dpdGhfaHVmZm1hbl9pbmRleDsKK30KKworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9tYXJrZXJzX3dpdGhfaHVmZm1hbl9pbmRleCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBjdXJyZW50X3NjYW4pCit7CisgICAgcmV0dXJuIGNvbnN1bWVfbWFya2VycyhjaW5mbyk7Cit9CisvKgorICogUmVhZCBKUEVHIG1hcmtlcnMgYmVmb3JlLCBiZXR3ZWVuLCBvciBhZnRlciBjb21wcmVzc2VkLWRhdGEgc2NhbnMuCisgKiBDaGFuZ2Ugc3RhdGUgYXMgbmVjZXNzYXJ5IHdoZW4gYSBuZXcgc2NhbiBpcyByZWFjaGVkLgorICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgorICoKKyAqIFRoZSBjb25zdW1lX2lucHV0IG1ldGhvZCBwb2ludGVyIHBvaW50cyBlaXRoZXIgaGVyZSBvciB0byB0aGUKKyAqIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBjb25zdW1lX2RhdGEgcm91dGluZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAqIHdlIGFyZSByZWFkaW5nIGEgY29tcHJlc3NlZCBkYXRhIHNlZ21lbnQgb3IgaW50ZXItc2VnbWVudCBtYXJrZXJzLgorICovCisKK01FVEhPRERFRihpbnQpCitjb25zdW1lX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKKyAgaW50IHZhbDsKKworICBpZiAoaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCkgLyogQWZ0ZXIgaGl0dGluZyBFT0ksIHJlYWQgbm8gZnVydGhlciAqLworICAgIHJldHVybiBKUEVHX1JFQUNIRURfRU9JOworCisgIHZhbCA9ICgqY2luZm8tPm1hcmtlci0+cmVhZF9tYXJrZXJzKSAoY2luZm8pOworCisgIHN3aXRjaCAodmFsKSB7CisgIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoJLyogRm91bmQgU09TICovCisgICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogMXN0IFNPUyAqLworICAgICAgaW5pdGlhbF9zZXR1cChjaW5mbyk7CisgICAgICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gRkFMU0U7CisgICAgICAvKiBOb3RlOiBzdGFydF9pbnB1dF9wYXNzIG11c3QgYmUgY2FsbGVkIGJ5IGpkbWFzdGVyLmMKKyAgICAgICAqIGJlZm9yZSBhbnkgbW9yZSBpbnB1dCBjYW4gYmUgY29uc3VtZWQuICBqZGFwaW1pbi5jIGlzCisgICAgICAgKiByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIHRoaXMgc2VxdWVuY2luZy4KKyAgICAgICAqLworICAgIH0gZWxzZSB7CQkJLyogMm5kIG9yIGxhdGVyIFNPUyBtYXJrZXIgKi8KKyAgICAgIGlmICghIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfRU9JX0VYUEVDVEVEKTsgLyogT29wcywgSSB3YXNuJ3QgZXhwZWN0aW5nIHRoaXMhICovCisgICAgICBzdGFydF9pbnB1dF9wYXNzKGNpbmZvKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSlBFR19SRUFDSEVEX0VPSToJLyogRm91bmQgRU9JICovCisgICAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IFRSVUU7CisgICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogVGFibGVzLW9ubHkgZGF0YXN0cmVhbSwgYXBwYXJlbnRseSAqLworICAgICAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCisJRVJSRVhJVChjaW5mbywgSkVSUl9TT0ZfTk9fU09TKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNvZWYgY3RscidzIGRlY29tcHJlc3NfZGF0YSByb3V0aW5lCisgICAgICAgKiBpZiB1c2VyIHNldCBvdXRwdXRfc2Nhbl9udW1iZXIgbGFyZ2VyIHRoYW4gbnVtYmVyIG9mIHNjYW5zLgorICAgICAgICovCisgICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKKwljaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB2YWw7Cit9CisKKworLyoKKyAqIFJlc2V0IHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Jlc2V0X2lucHV0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKKworICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7CisgIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgY29uc3VtZV9tYXJrZXJzX3dpdGhfaHVmZm1hbl9pbmRleDsKKyAgaW5wdXRjdGwtPnB1Yi5oYXNfbXVsdGlwbGVfc2NhbnMgPSBGQUxTRTsgLyogInVua25vd24iIHdvdWxkIGJlIGJldHRlciAqLworICBpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkID0gRkFMU0U7CisgIGlucHV0Y3RsLT5pbmhlYWRlcnMgPSBUUlVFOworICAvKiBSZXNldCBvdGhlciBtb2R1bGVzICovCisgICgqY2luZm8tPmVyci0+cmVzZXRfZXJyb3JfbWdyKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAoKmNpbmZvLT5tYXJrZXItPnJlc2V0X21hcmtlcl9yZWFkZXIpIChjaW5mbyk7CisgIC8qIFJlc2V0IHByb2dyZXNzaW9uIHN0YXRlIC0tIHdvdWxkIGJlIGNsZWFuZXIgaWYgZW50cm9weSBkZWNvZGVyIGRpZCB0aGlzICovCisgIGNpbmZvLT5jb2VmX2JpdHMgPSBOVUxMOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBpbnB1dCBjb250cm9sbGVyIG1vZHVsZS4KKyAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgd2hlbiB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2lucHV0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bDsKKworICAvKiBDcmVhdGUgc3Vib2JqZWN0IGluIHBlcm1hbmVudCBwb29sICovCisgIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQlTSVpFT0YobXlfaW5wdXRfY29udHJvbGxlcikpOworICBjaW5mby0+aW5wdXRjdGwgPSAoc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciAqKSBpbnB1dGN0bDsKKyAgLyogSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMgKi8KKyAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX2lucHV0ID0gY29uc3VtZV9tYXJrZXJzOworICBpbnB1dGN0bC0+cHViLnJlc2V0X2lucHV0X2NvbnRyb2xsZXIgPSByZXNldF9pbnB1dF9jb250cm9sbGVyOworICBpbnB1dGN0bC0+cHViLnN0YXJ0X2lucHV0X3Bhc3MgPSBzdGFydF9pbnB1dF9wYXNzOworICBpbnB1dGN0bC0+cHViLmZpbmlzaF9pbnB1dF9wYXNzID0gZmluaXNoX2lucHV0X3Bhc3M7CisKKyAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX21hcmtlcnMgPSBjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4OworICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCA9CisgICAgICAgIGNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXg7CisgIC8qIEluaXRpYWxpemUgc3RhdGU6IGNhbid0IHVzZSByZXNldF9pbnB1dF9jb250cm9sbGVyIHNpbmNlIHdlIGRvbid0CisgICAqIHdhbnQgdG8gdHJ5IHRvIHJlc2V0IG90aGVyIG1vZHVsZXMgeWV0LgorICAgKi8KKyAgaW5wdXRjdGwtPnB1Yi5oYXNfbXVsdGlwbGVfc2NhbnMgPSBGQUxTRTsgLyogInVua25vd24iIHdvdWxkIGJlIGJldHRlciAqLworICBpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkID0gRkFMU0U7CisgIGlucHV0Y3RsLT5pbmhlYWRlcnMgPSBUUlVFOworfQpkaWZmIC0tZ2l0IGEvanBlZy9qZG1haW5jdC5jIGIvanBlZy9qZG1haW5jdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzk1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pkbWFpbmN0LmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qCisgKiBqZG1haW5jdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGRlY29tcHJlc3Npb24uCisgKiBUaGUgbWFpbiBidWZmZXIgbGllcyBiZXR3ZWVuIHRoZSBKUEVHIGRlY29tcHJlc3NvciBwcm9wZXIgYW5kIHRoZQorICogcG9zdC1wcm9jZXNzb3I7IGl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEgaW4gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGJ5cGFzc2VkIGluIHJhdy1kYXRhIG1vZGUsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbgorICogc3VwcGxpZXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG1haW4gYnVmZmVyIGluIHRoYXQgY2FzZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIEluIHRoZSBjdXJyZW50IHN5c3RlbSBkZXNpZ24sIHRoZSBtYWluIGJ1ZmZlciBuZWVkIG5ldmVyIGJlIGEgZnVsbC1pbWFnZQorICogYnVmZmVyOyBhbnkgZnVsbC1oZWlnaHQgYnVmZmVycyB3aWxsIGJlIGZvdW5kIGluc2lkZSB0aGUgY29lZmZpY2llbnQgb3IKKyAqIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXJzLiAgTm9uZXRoZWxlc3MsIHRoZSBtYWluIGNvbnRyb2xsZXIgaXMgbm90CisgKiB0cml2aWFsLiAgSXRzIHJlc3BvbnNpYmlsaXR5IGlzIHRvIHByb3ZpZGUgY29udGV4dCByb3dzIGZvciB1cHNhbXBsaW5nLworICogcmVzY2FsaW5nLCBhbmQgZG9pbmcgdGhpcyBpbiBhbiBlZmZpY2llbnQgZmFzaGlvbiBpcyBhIGJpdCB0cmlja3kuCisgKgorICogUG9zdHByb2Nlc3NvciBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgKHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplKQorICogc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICAoV2UgcmVxdWlyZSBEQ1Rfc2NhbGVkX3NpemUgdmFsdWVzIHRvIGJlCisgKiBjaG9zZW4gc3VjaCB0aGF0IHRoZXNlIG51bWJlcnMgYXJlIGludGVnZXJzLiAgSW4gcHJhY3RpY2UgRENUX3NjYWxlZF9zaXplCisgKiB2YWx1ZXMgd2lsbCBsaWtlbHkgYmUgcG93ZXJzIG9mIHR3bywgc28gd2UgYWN0dWFsbHkgaGF2ZSB0aGUgc3Ryb25nZXIKKyAqIGNvbmRpdGlvbiB0aGF0IERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgYW4gaW50ZWdlci4pCisgKiBVcHNhbXBsaW5nIHdpbGwgdHlwaWNhbGx5IHByb2R1Y2UgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBmcm9tIGVhY2gKKyAqIHJvdyBncm91cCAodGltZXMgYW55IGFkZGl0aW9uYWwgc2NhbGUgZmFjdG9yIHRoYXQgdGhlIHVwc2FtcGxlciBpcworICogYXBwbHlpbmcpLgorICoKKyAqIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHdpbGwgZGVsaXZlciBkYXRhIHRvIHVzIG9uZSBpTUNVIHJvdyBhdCBhIHRpbWU7CisgKiBlYWNoIGlNQ1Ugcm93IGNvbnRhaW5zIHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgc2FtcGxlIHJvd3MsIG9yCisgKiBleGFjdGx5IG1pbl9EQ1Rfc2NhbGVkX3NpemUgcm93IGdyb3Vwcy4gIChUaGlzIGFtb3VudCBvZiBkYXRhIGNvcnJlc3BvbmRzCisgKiB0byBvbmUgcm93IG9mIE1DVXMgd2hlbiB0aGUgaW1hZ2UgaXMgZnVsbHkgaW50ZXJsZWF2ZWQuKSAgTm90ZSB0aGF0IHRoZQorICogbnVtYmVyIG9mIHNhbXBsZSByb3dzIHZhcmllcyBhY3Jvc3MgY29tcG9uZW50cywgYnV0IHRoZSBudW1iZXIgb2Ygcm93CisgKiBncm91cHMgZG9lcyBub3QuICBTb21lIGdhcmJhZ2Ugc2FtcGxlIHJvd3MgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBsYXN0IGlNQ1UKKyAqIHJvdyBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4KKyAqCisgKiBEZXBlbmRpbmcgb24gdGhlIHZlcnRpY2FsIHNjYWxpbmcgYWxnb3JpdGhtIHVzZWQsIHRoZSB1cHNhbXBsZXIgbWF5IG5lZWQKKyAqIGFjY2VzcyB0byB0aGUgc2FtcGxlIHJvdyhzKSBhYm92ZSBhbmQgYmVsb3cgaXRzIGN1cnJlbnQgaW5wdXQgcm93IGdyb3VwLgorICogVGhlIHVwc2FtcGxlciBpcyByZXF1aXJlZCB0byBzZXQgbmVlZF9jb250ZXh0X3Jvd3MgVFJVRSBhdCBnbG9iYWwgc2VsZWN0aW9uCisgKiB0aW1lIGlmIHNvLiAgV2hlbiBuZWVkX2NvbnRleHRfcm93cyBpcyBGQUxTRSwgdGhpcyBjb250cm9sbGVyIGNhbiBzaW1wbHkKKyAqIG9idGFpbiBvbmUgaU1DVSByb3cgYXQgYSB0aW1lIGZyb20gdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgYW5kIGRvbGUgaXQKKyAqIG91dCBhcyByb3cgZ3JvdXBzIHRvIHRoZSBwb3N0cHJvY2Vzc29yLgorICoKKyAqIFdoZW4gbmVlZF9jb250ZXh0X3Jvd3MgaXMgVFJVRSwgdGhpcyBjb250cm9sbGVyIGd1YXJhbnRlZXMgdGhhdCB0aGUgYnVmZmVyCisgKiBwYXNzZWQgdG8gcG9zdHByb2Nlc3NpbmcgY29udGFpbnMgYXQgbGVhc3Qgb25lIHJvdyBncm91cCdzIHdvcnRoIG9mIHNhbXBsZXMKKyAqIGFib3ZlIGFuZCBiZWxvdyB0aGUgcm93IGdyb3VwKHMpIGJlaW5nIHByb2Nlc3NlZC4gIE5vdGUgdGhhdCB0aGUgY29udGV4dAorICogcm93cyAiYWJvdmUiIHRoZSBmaXJzdCBwYXNzZWQgcm93IGdyb3VwIGFwcGVhciBhdCBuZWdhdGl2ZSByb3cgb2Zmc2V0cyBpbgorICogdGhlIHBhc3NlZCBidWZmZXIuICBBdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGltYWdlLCB0aGUgcmVxdWlyZWQKKyAqIGNvbnRleHQgcm93cyBhcmUgbWFudWZhY3R1cmVkIGJ5IGR1cGxpY2F0aW5nIHRoZSBmaXJzdCBvciBsYXN0IHJlYWwgc2FtcGxlCisgKiByb3c7IHRoaXMgYXZvaWRzIGhhdmluZyBzcGVjaWFsIGNhc2VzIGluIHRoZSB1cHNhbXBsaW5nIGlubmVyIGxvb3BzLgorICoKKyAqIFRoZSBhbW91bnQgb2YgY29udGV4dCBpcyBmaXhlZCBhdCBvbmUgcm93IGdyb3VwIGp1c3QgYmVjYXVzZSB0aGF0J3MgYQorICogY29udmVuaWVudCBudW1iZXIgZm9yIHRoaXMgY29udHJvbGxlciB0byB3b3JrIHdpdGguICBUaGUgZXhpc3RpbmcKKyAqIHVwc2FtcGxlcnMgcmVhbGx5IG9ubHkgbmVlZCBvbmUgc2FtcGxlIHJvdyBvZiBjb250ZXh0LiAgQW4gdXBzYW1wbGVyCisgKiBzdXBwb3J0aW5nIGFyYml0cmFyeSBvdXRwdXQgcmVzY2FsaW5nIG1pZ2h0IHdpc2ggZm9yIG1vcmUgdGhhbiBvbmUgcm93CisgKiBncm91cCBvZiBjb250ZXh0IHdoZW4gc2hyaW5raW5nIHRoZSBpbWFnZTsgdG91Z2gsIHdlIGRvbid0IGhhbmRsZSB0aGF0LgorICogKFRoaXMgaXMganVzdGlmaWVkIGJ5IHRoZSBhc3N1bXB0aW9uIHRoYXQgZG93bnNpemluZyB3aWxsIGJlIGhhbmRsZWQgbW9zdGx5CisgKiBieSBhZGp1c3RpbmcgdGhlIERDVF9zY2FsZWRfc2l6ZSB2YWx1ZXMsIHNvIHRoYXQgdGhlIGFjdHVhbCBzY2FsZSBmYWN0b3IgYXQKKyAqIHRoZSB1cHNhbXBsZSBzdGVwIG5lZWRuJ3QgYmUgbXVjaCBsZXNzIHRoYW4gb25lLikKKyAqCisgKiBUbyBwcm92aWRlIHRoZSBkZXNpcmVkIGNvbnRleHQsIHdlIGhhdmUgdG8gcmV0YWluIHRoZSBsYXN0IHR3byByb3cgZ3JvdXBzCisgKiBvZiBvbmUgaU1DVSByb3cgd2hpbGUgcmVhZGluZyBpbiB0aGUgbmV4dCBpTUNVIHJvdy4gIChUaGUgbGFzdCByb3cgZ3JvdXAKKyAqIGNhbid0IGJlIHByb2Nlc3NlZCB1bnRpbCB3ZSBoYXZlIGFub3RoZXIgcm93IGdyb3VwIGZvciBpdHMgYmVsb3ctY29udGV4dCwKKyAqIGFuZCBzbyB3ZSBoYXZlIHRvIHNhdmUgdGhlIG5leHQtdG8tbGFzdCBncm91cCB0b28gZm9yIGl0cyBhYm92ZS1jb250ZXh0LikKKyAqIFdlIGNvdWxkIGRvIHRoaXMgbW9zdCBzaW1wbHkgYnkgY29weWluZyBkYXRhIGFyb3VuZCBpbiBvdXIgYnVmZmVyLCBidXQKKyAqIHRoYXQnZCBiZSB2ZXJ5IHNsb3cuICBXZSBjYW4gYXZvaWQgY29weWluZyBhbnkgZGF0YSBieSBjcmVhdGluZyBhIHJhdGhlcgorICogc3RyYW5nZSBwb2ludGVyIHN0cnVjdHVyZS4gIEhlcmUncyBob3cgaXQgd29ya3MuICBXZSBhbGxvY2F0ZSBhIHdvcmtzcGFjZQorICogY29uc2lzdGluZyBvZiBNKzIgcm93IGdyb3VwcyAod2hlcmUgTSA9IG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgdGhlIG51bWJlcgorICogb2Ygcm93IGdyb3VwcyBwZXIgaU1DVSByb3cpLiAgV2UgY3JlYXRlIHR3byBzZXRzIG9mIHJlZHVuZGFudCBwb2ludGVycyB0bworICogdGhlIHdvcmtzcGFjZS4gIExhYmVsaW5nIHRoZSBwaHlzaWNhbCByb3cgZ3JvdXBzIDAgdG8gTSsxLCB0aGUgc3ludGhlc2l6ZWQKKyAqIHBvaW50ZXIgbGlzdHMgbG9vayBsaWtlIHRoaXM6CisgKiAgICAgICAgICAgICAgICAgICBNKzEgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMQorICogbWFzdGVyIHBvaW50ZXIgLS0+IDAgICAgICAgICBtYXN0ZXIgcG9pbnRlciAtLT4gMAorICogICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICogICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAqICAgICAgICAgICAgICAgICAgIE0tMyAgICAgICAgICAgICAgICAgICAgICAgICAgTS0zCisgKiAgICAgICAgICAgICAgICAgICBNLTIgICAgICAgICAgICAgICAgICAgICAgICAgICBNCisgKiAgICAgICAgICAgICAgICAgICBNLTEgICAgICAgICAgICAgICAgICAgICAgICAgIE0rMQorICogICAgICAgICAgICAgICAgICAgIE0gICAgICAgICAgICAgICAgICAgICAgICAgICBNLTIKKyAqICAgICAgICAgICAgICAgICAgIE0rMSAgICAgICAgICAgICAgICAgICAgICAgICAgTS0xCisgKiAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisgKiBXZSByZWFkIGFsdGVybmF0ZSBpTUNVIHJvd3MgdXNpbmcgZWFjaCBtYXN0ZXIgcG9pbnRlcjsgdGh1cyB0aGUgbGFzdCB0d28KKyAqIHJvdyBncm91cHMgb2YgdGhlIHByZXZpb3VzIGlNQ1Ugcm93IHJlbWFpbiB1bi1vdmVyd3JpdHRlbiBpbiB0aGUgd29ya3NwYWNlLgorICogVGhlIHBvaW50ZXIgbGlzdHMgYXJlIHNldCB1cCBzbyB0aGF0IHRoZSByZXF1aXJlZCBjb250ZXh0IHJvd3MgYXBwZWFyIHRvCisgKiBiZSBhZGphY2VudCB0byB0aGUgcHJvcGVyIHBsYWNlcyB3aGVuIHdlIHBhc3MgdGhlIHBvaW50ZXIgbGlzdHMgdG8gdGhlCisgKiB1cHNhbXBsZXIuCisgKgorICogVGhlIGFib3ZlIHBpY3R1cmVzIGRlc2NyaWJlIHRoZSBub3JtYWwgc3RhdGUgb2YgdGhlIHBvaW50ZXIgbGlzdHMuCisgKiBBdCB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIGRpZGRsZSB0aGUgcG9pbnRlciBsaXN0cyB0byBkdXBsaWNhdGUKKyAqIHRoZSBmaXJzdCBvciBsYXN0IHNhbXBsZSByb3cgYXMgbmVjZXNzYXJ5ICh0aGlzIGlzIGNoZWFwZXIgdGhhbiBjb3B5aW5nCisgKiBzYW1wbGUgcm93cyBhcm91bmQpLgorICoKKyAqIFRoaXMgc2NoZW1lIGJyZWFrcyBkb3duIGlmIE0gPCAyLCBpZSwgbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyAxLiAgSW4gdGhhdAorICogc2l0dWF0aW9uIGVhY2ggaU1DVSByb3cgcHJvdmlkZXMgb25seSBvbmUgcm93IGdyb3VwIHNvIHRoZSBidWZmZXJpbmcgbG9naWMKKyAqIG11c3QgYmUgZGlmZmVyZW50IChlZywgd2UgbXVzdCByZWFkIHR3byBpTUNVIHJvd3MgYmVmb3JlIHdlIGNhbiBlbWl0IHRoZQorICogZmlyc3Qgcm93IGdyb3VwKS4gIEZvciBub3csIHdlIHNpbXBseSBkbyBub3Qgc3VwcG9ydCBwcm92aWRpbmcgY29udGV4dAorICogcm93cyB3aGVuIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgMS4gIFRoYXQgY29tYmluYXRpb24gc2VlbXMgdW5saWtlbHkgdG8KKyAqIGJlIHdvcnRoIHByb3ZpZGluZyAtLS0gaWYgc29tZW9uZSB3YW50cyBhIDEvOHRoLXNpemUgcHJldmlldywgdGhleSBwcm9iYWJseQorICogd2FudCBpdCBxdWljayBhbmQgZGlydHksIHNvIGEgY29udGV4dC1mcmVlIHVwc2FtcGxlciBpcyBzdWZmaWNpZW50LgorICovCisKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBQb2ludGVyIHRvIGFsbG9jYXRlZCB3b3Jrc3BhY2UgKE0gb3IgTSsyIHJvdyBncm91cHMpLiAqLworICBKU0FNUEFSUkFZIGJ1ZmZlcltNQVhfQ09NUE9ORU5UU107CisKKyAgYm9vbGVhbiBidWZmZXJfZnVsbDsJCS8qIEhhdmUgd2UgZ290dGVuIGFuIGlNQ1Ugcm93IGZyb20gZGVjb2Rlcj8gKi8KKyAgSkRJTUVOU0lPTiByb3dncm91cF9jdHI7CS8qIGNvdW50cyByb3cgZ3JvdXBzIG91dHB1dCB0byBwb3N0cHJvY2Vzc29yICovCisKKyAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUgb25seSB1c2VkIGluIHRoZSBjb250ZXh0IGNhc2UuICovCisKKyAgLyogVGhlc2UgYXJlIHRoZSBtYXN0ZXIgcG9pbnRlcnMgdG8gdGhlIGZ1bm55LW9yZGVyIHBvaW50ZXIgbGlzdHMuICovCisgIEpTQU1QSU1BR0UgeGJ1ZmZlclsyXTsJLyogcG9pbnRlcnMgdG8gd2VpcmQgcG9pbnRlciBsaXN0cyAqLworCisgIGludCB3aGljaHB0cjsJCQkvKiBpbmRpY2F0ZXMgd2hpY2ggcG9pbnRlciBzZXQgaXMgbm93IGluIHVzZSAqLworICBpbnQgY29udGV4dF9zdGF0ZTsJCS8qIHByb2Nlc3NfZGF0YSBzdGF0ZSBtYWNoaW5lIHN0YXR1cyAqLworICBKRElNRU5TSU9OIHJvd2dyb3Vwc19hdmFpbDsJLyogcm93IGdyb3VwcyBhdmFpbGFibGUgdG8gcG9zdHByb2Nlc3NvciAqLworICBKRElNRU5TSU9OIGlNQ1Vfcm93X2N0cjsJLyogY291bnRzIGlNQ1Ugcm93cyB0byBkZXRlY3QgaW1hZ2UgdG9wL2JvdCAqLworfSBteV9tYWluX2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfbWFpbl9jb250cm9sbGVyICogbXlfbWFpbl9wdHI7CisKKy8qIGNvbnRleHRfc3RhdGUgdmFsdWVzOiAqLworI2RlZmluZSBDVFhfUFJFUEFSRV9GT1JfSU1DVQkwCS8qIG5lZWQgdG8gcHJlcGFyZSBmb3IgTUNVIHJvdyAqLworI2RlZmluZSBDVFhfUFJPQ0VTU19JTUNVCTEJLyogZmVlZGluZyBpTUNVIHRvIHBvc3Rwcm9jZXNzb3IgKi8KKyNkZWZpbmUgQ1RYX1BPU1RQT05FRF9ST1cJMgkvKiBmZWVkaW5nIHBvc3Rwb25lZCByb3cgZ3JvdXAgKi8KKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbgorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKK01FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfY29udGV4dF9tYWluCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9jcmFua19wb3N0CisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworI2VuZGlmCisKKworTE9DQUwodm9pZCkKK2FsbG9jX2Z1bm55X3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBmdW5ueSBwb2ludGVyIGxpc3RzLgorICogVGhpcyBpcyBkb25lIG9ubHkgb25jZSwgbm90IG9uY2UgcGVyIHBhc3MuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgcmdyb3VwOworICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIHhidWY7CisKKyAgLyogR2V0IHRvcC1sZXZlbCBzcGFjZSBmb3IgY29tcG9uZW50IGFycmF5IHBvaW50ZXJzLgorICAgKiBXZSBhbGxvYyBib3RoIGFycmF5cyB3aXRoIG9uZSBjYWxsIHRvIHNhdmUgYSBmZXcgY3ljbGVzLgorICAgKi8KKyAgbWFpbi0+eGJ1ZmZlclswXSA9IChKU0FNUElNQUdFKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJY2luZm8tPm51bV9jb21wb25lbnRzICogMiAqIFNJWkVPRihKU0FNUEFSUkFZKSk7CisgIG1haW4tPnhidWZmZXJbMV0gPSBtYWluLT54YnVmZmVyWzBdICsgY2luZm8tPm51bV9jb21wb25lbnRzOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgLyogR2V0IHNwYWNlIGZvciBwb2ludGVyIGxpc3RzIC0tLSBNKzQgcm93IGdyb3VwcyBpbiBlYWNoIGxpc3QuCisgICAgICogV2UgYWxsb2MgYm90aCBwb2ludGVyIGxpc3RzIHdpdGggb25lIGNhbGwgdG8gc2F2ZSBhIGZldyBjeWNsZXMuCisgICAgICovCisgICAgeGJ1ZiA9IChKU0FNUEFSUkFZKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIDIgKiAocmdyb3VwICogKE0gKyA0KSkgKiBTSVpFT0YoSlNBTVBST1cpKTsKKyAgICB4YnVmICs9IHJncm91cDsJCS8qIHdhbnQgb25lIHJvdyBncm91cCBhdCBuZWdhdGl2ZSBvZmZzZXRzICovCisgICAgbWFpbi0+eGJ1ZmZlclswXVtjaV0gPSB4YnVmOworICAgIHhidWYgKz0gcmdyb3VwICogKE0gKyA0KTsKKyAgICBtYWluLT54YnVmZmVyWzFdW2NpXSA9IHhidWY7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorbWFrZV9mdW5ueV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIENyZWF0ZSB0aGUgZnVubnkgcG9pbnRlciBsaXN0cyBkaXNjdXNzZWQgaW4gdGhlIGNvbW1lbnRzIGFib3ZlLgorICogVGhlIGFjdHVhbCB3b3Jrc3BhY2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKGluIG1haW4tPmJ1ZmZlciksCisgKiBhbmQgdGhlIHNwYWNlIGZvciB0aGUgcG9pbnRlciBsaXN0cyBpcyBhbGxvY2F0ZWQgdG9vLgorICogVGhpcyByb3V0aW5lIGp1c3QgZmlsbHMgaW4gdGhlIGN1cmlvdXNseSBvcmRlcmVkIGxpc3RzLgorICogVGhpcyB3aWxsIGJlIHJlcGVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzLgorICovCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2ksIGksIHJncm91cDsKKyAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlNBTVBBUlJBWSBidWYsIHhidWYwLCB4YnVmMTsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIHhidWYwID0gbWFpbi0+eGJ1ZmZlclswXVtjaV07CisgICAgeGJ1ZjEgPSBtYWluLT54YnVmZmVyWzFdW2NpXTsKKyAgICAvKiBGaXJzdCBjb3B5IHRoZSB3b3Jrc3BhY2UgcG9pbnRlcnMgYXMtaXMgKi8KKyAgICBidWYgPSBtYWluLT5idWZmZXJbY2ldOworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAoTSArIDIpOyBpKyspIHsKKyAgICAgIHhidWYwW2ldID0geGJ1ZjFbaV0gPSBidWZbaV07CisgICAgfQorICAgIC8qIEluIHRoZSBzZWNvbmQgbGlzdCwgcHV0IHRoZSBsYXN0IGZvdXIgcm93IGdyb3VwcyBpbiBzd2FwcGVkIG9yZGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIDI7IGkrKykgeworICAgICAgeGJ1ZjFbcmdyb3VwKihNLTIpICsgaV0gPSBidWZbcmdyb3VwKk0gKyBpXTsKKyAgICAgIHhidWYxW3Jncm91cCpNICsgaV0gPSBidWZbcmdyb3VwKihNLTIpICsgaV07CisgICAgfQorICAgIC8qIFRoZSB3cmFwYXJvdW5kIHBvaW50ZXJzIGF0IHRvcCBhbmQgYm90dG9tIHdpbGwgYmUgZmlsbGVkIGxhdGVyCisgICAgICogKHNlZSBzZXRfd3JhcGFyb3VuZF9wb2ludGVycywgYmVsb3cpLiAgSW5pdGlhbGx5IHdlIHdhbnQgdGhlICJhYm92ZSIKKyAgICAgKiBwb2ludGVycyB0byBkdXBsaWNhdGUgdGhlIGZpcnN0IGFjdHVhbCBkYXRhIGxpbmUuICBUaGlzIG9ubHkgbmVlZHMKKyAgICAgKiB0byBoYXBwZW4gaW4geGJ1ZmZlclswXS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwOyBpKyspIHsKKyAgICAgIHhidWYwW2kgLSByZ3JvdXBdID0geGJ1ZjBbMF07CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK3NldF93cmFwYXJvdW5kX3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSAid3JhcGFyb3VuZCIgcG9pbnRlcnMgYXQgdG9wIGFuZCBib3R0b20gb2YgdGhlIHBvaW50ZXIgbGlzdHMuCisgKiBUaGlzIGNoYW5nZXMgdGhlIHBvaW50ZXIgbGlzdCBzdGF0ZSBmcm9tIHRvcC1vZi1pbWFnZSB0byB0aGUgbm9ybWFsIHN0YXRlLgorICovCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2ksIGksIHJncm91cDsKKyAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlNBTVBBUlJBWSB4YnVmMCwgeGJ1ZjE7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KKyAgICB4YnVmMCA9IG1haW4tPnhidWZmZXJbMF1bY2ldOworICAgIHhidWYxID0gbWFpbi0+eGJ1ZmZlclsxXVtjaV07CisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cDsgaSsrKSB7CisgICAgICB4YnVmMFtpIC0gcmdyb3VwXSA9IHhidWYwW3Jncm91cCooTSsxKSArIGldOworICAgICAgeGJ1ZjFbaSAtIHJncm91cF0gPSB4YnVmMVtyZ3JvdXAqKE0rMSkgKyBpXTsKKyAgICAgIHhidWYwW3Jncm91cCooTSsyKSArIGldID0geGJ1ZjBbaV07CisgICAgICB4YnVmMVtyZ3JvdXAqKE0rMikgKyBpXSA9IHhidWYxW2ldOworICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitzZXRfYm90dG9tX3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQ2hhbmdlIHRoZSBwb2ludGVyIGxpc3RzIHRvIGR1cGxpY2F0ZSB0aGUgbGFzdCBzYW1wbGUgcm93IGF0IHRoZSBib3R0b20KKyAqIG9mIHRoZSBpbWFnZS4gIHdoaWNocHRyIGluZGljYXRlcyB3aGljaCB4YnVmZmVyIGhvbGRzIHRoZSBmaW5hbCBpTUNVIHJvdy4KKyAqIEFsc28gc2V0cyByb3dncm91cHNfYXZhaWwgdG8gaW5kaWNhdGUgbnVtYmVyIG9mIG5vbmR1bW15IHJvdyBncm91cHMgaW4gcm93LgorICovCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2ksIGksIHJncm91cCwgaU1DVWhlaWdodCwgcm93c19sZWZ0OworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIHhidWY7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBDb3VudCBzYW1wbGUgcm93cyBpbiBvbmUgaU1DVSByb3cgYW5kIGluIG9uZSByb3cgZ3JvdXAgKi8KKyAgICBpTUNVaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICByZ3JvdXAgPSBpTUNVaGVpZ2h0IC8gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgLyogQ291bnQgbm9uZHVtbXkgc2FtcGxlIHJvd3MgcmVtYWluaW5nIGZvciB0aGlzIGNvbXBvbmVudCAqLworICAgIHJvd3NfbGVmdCA9IChpbnQpIChjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgJSAoSkRJTUVOU0lPTikgaU1DVWhlaWdodCk7CisgICAgaWYgKHJvd3NfbGVmdCA9PSAwKSByb3dzX2xlZnQgPSBpTUNVaGVpZ2h0OworICAgIC8qIENvdW50IG5vbmR1bW15IHJvdyBncm91cHMuICBTaG91bGQgZ2V0IHNhbWUgYW5zd2VyIGZvciBlYWNoIGNvbXBvbmVudCwKKyAgICAgKiBzbyB3ZSBuZWVkIG9ubHkgZG8gaXQgb25jZS4KKyAgICAgKi8KKyAgICBpZiAoY2kgPT0gMCkgeworICAgICAgbWFpbi0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pICgocm93c19sZWZ0LTEpIC8gcmdyb3VwICsgMSk7CisgICAgfQorICAgIC8qIER1cGxpY2F0ZSB0aGUgbGFzdCByZWFsIHNhbXBsZSByb3cgcmdyb3VwKjIgdGltZXM7IHRoaXMgcGFkcyBvdXQgdGhlCisgICAgICogbGFzdCBwYXJ0aWFsIHJvd2dyb3VwIGFuZCBlbnN1cmVzIGF0IGxlYXN0IG9uZSBmdWxsIHJvd2dyb3VwIG9mIGNvbnRleHQuCisgICAgICovCisgICAgeGJ1ZiA9IG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdW2NpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogMjsgaSsrKSB7CisgICAgICB4YnVmW3Jvd3NfbGVmdCArIGldID0geGJ1Zltyb3dzX2xlZnQtMV07CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19tYWluIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyAgICBpZiAoY2luZm8tPnVwc2FtcGxlLT5uZWVkX2NvbnRleHRfcm93cykgeworICAgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9jb250ZXh0X21haW47CisgICAgICBtYWtlX2Z1bm55X3BvaW50ZXJzKGNpbmZvKTsgLyogQ3JlYXRlIHRoZSB4YnVmZmVyW10gbGlzdHMgKi8KKyAgICAgIG1haW4tPndoaWNocHRyID0gMDsJLyogUmVhZCBmaXJzdCBpTUNVIHJvdyBpbnRvIHhidWZmZXJbMF0gKi8KKyAgICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJFUEFSRV9GT1JfSU1DVTsKKyAgICAgIG1haW4tPmlNQ1Vfcm93X2N0ciA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNpbXBsZSBjYXNlIHdpdGggbm8gY29udGV4dCBuZWVkZWQgKi8KKyAgICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW47CisgICAgfQorICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gRkFMU0U7CS8qIE1hcmsgYnVmZmVyIGVtcHR5ICovCisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgICBicmVhazsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6CisgICAgLyogRm9yIGxhc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLCBqdXN0IGNyYW5rIHRoZSBwb3N0cHJvY2Vzc29yICovCisgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9jcmFua19wb3N0OworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyBoYW5kbGVzIHRoZSBzaW1wbGUgY2FzZSB3aGVyZSBubyBjb250ZXh0IGlzIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgSkRJTUVOU0lPTiByb3dncm91cHNfYXZhaWw7CisKKyAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KKyAgaWYgKCEgbWFpbi0+YnVmZmVyX2Z1bGwpIHsKKyAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkKKyAgICAgIHJldHVybjsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLworICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gVFJVRTsJLyogT0ssIHdlIGhhdmUgYW4gaU1DVSByb3cgdG8gd29yayB3aXRoICovCisgIH0KKworICAvKiBUaGVyZSBhcmUgYWx3YXlzIG1pbl9EQ1Rfc2NhbGVkX3NpemUgcm93IGdyb3VwcyBpbiBhbiBpTUNVIHJvdy4gKi8KKyAgcm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAvKiBOb3RlOiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgbWF5IHBhc3MgZXh0cmEgZ2FyYmFnZSByb3cgZ3JvdXBzCisgICAqIHRvIHRoZSBwb3N0cHJvY2Vzc29yLiAgVGhlIHBvc3Rwcm9jZXNzb3IgaGFzIHRvIGNoZWNrIGZvciBib3R0b20KKyAgICogb2YgaW1hZ2UgYW55d2F5IChhdCByb3cgcmVzb2x1dGlvbiksIHNvIG5vIHBvaW50IGluIHVzIGRvaW5nIGl0IHRvby4KKyAgICovCisKKyAgLyogRmVlZCB0aGUgcG9zdHByb2Nlc3NvciAqLworICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIsCisJCQkJICAgICAmbWFpbi0+cm93Z3JvdXBfY3RyLCByb3dncm91cHNfYXZhaWwsCisJCQkJICAgICBvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOworCisgIC8qIEhhcyBwb3N0cHJvY2Vzc29yIGNvbnN1bWVkIGFsbCB0aGUgZGF0YSB5ZXQ/IElmIHNvLCBtYXJrIGJ1ZmZlciBlbXB0eSAqLworICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyID49IHJvd2dyb3Vwc19hdmFpbCkgeworICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gRkFMU0U7CisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBjb250ZXh0IHJvd3MgbXVzdCBiZSBwcm92aWRlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Byb2Nlc3NfZGF0YV9jb250ZXh0X21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KKyAgaWYgKCEgbWFpbi0+YnVmZmVyX2Z1bGwpIHsKKyAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywKKwkJCQkJICAgbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl0pKQorICAgICAgcmV0dXJuOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBUUlVFOwkvKiBPSywgd2UgaGF2ZSBhbiBpTUNVIHJvdyB0byB3b3JrIHdpdGggKi8KKyAgICBtYWluLT5pTUNVX3Jvd19jdHIrKzsJLyogY291bnQgcm93cyByZWNlaXZlZCAqLworICB9CisKKyAgLyogUG9zdHByb2Nlc3NvciB0eXBpY2FsbHkgd2lsbCBub3Qgc3dhbGxvdyBhbGwgdGhlIGlucHV0IGRhdGEgaXQgaXMgaGFuZGVkCisgICAqIGluIG9uZSBjYWxsIChkdWUgdG8gZmlsbGluZyB0aGUgb3V0cHV0IGJ1ZmZlciBmaXJzdCkuICBNdXN0IGJlIHByZXBhcmVkCisgICAqIHRvIGV4aXQgYW5kIHJlc3RhcnQuICBUaGlzIHN3aXRjaCBsZXRzIHVzIGtlZXAgdHJhY2sgb2YgaG93IGZhciB3ZSBnb3QuCisgICAqIE5vdGUgdGhhdCBlYWNoIGNhc2UgZmFsbHMgdGhyb3VnaCB0byB0aGUgbmV4dCBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCisgICAqLworICBzd2l0Y2ggKG1haW4tPmNvbnRleHRfc3RhdGUpIHsKKyAgY2FzZSBDVFhfUE9TVFBPTkVEX1JPVzoKKyAgICAvKiBDYWxsIHBvc3Rwcm9jZXNzb3IgdXNpbmcgcHJldmlvdXNseSBzZXQgcG9pbnRlcnMgZm9yIHBvc3Rwb25lZCByb3cgKi8KKyAgICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXSwKKwkJCSZtYWluLT5yb3dncm91cF9jdHIsIG1haW4tPnJvd2dyb3Vwc19hdmFpbCwKKwkJCW91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7CisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IG1haW4tPnJvd2dyb3Vwc19hdmFpbCkKKyAgICAgIHJldHVybjsJCQkvKiBOZWVkIHRvIHN1c3BlbmQgKi8KKyAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BSRVBBUkVfRk9SX0lNQ1U7CisgICAgaWYgKCpvdXRfcm93X2N0ciA+PSBvdXRfcm93c19hdmFpbCkKKyAgICAgIHJldHVybjsJCQkvKiBQb3N0cHJvY2Vzc29yIGV4YWN0bHkgZmlsbGVkIG91dHB1dCBidWYgKi8KKyAgICAvKkZBTExUSFJPVUdIKi8KKyAgY2FzZSBDVFhfUFJFUEFSRV9GT1JfSU1DVToKKyAgICAvKiBQcmVwYXJlIHRvIHByb2Nlc3MgZmlyc3QgTS0xIHJvdyBncm91cHMgb2YgdGhpcyBpTUNVIHJvdyAqLworICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgICAgbWFpbi0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSAtIDEpOworICAgIC8qIENoZWNrIGZvciBib3R0b20gb2YgaW1hZ2U6IGlmIHNvLCB0d2VhayBwb2ludGVycyB0byAiZHVwbGljYXRlIgorICAgICAqIHRoZSBsYXN0IHNhbXBsZSByb3csIGFuZCBhZGp1c3Qgcm93Z3JvdXBzX2F2YWlsIHRvIGlnbm9yZSBwYWRkaW5nIHJvd3MuCisgICAgICovCisgICAgaWYgKG1haW4tPmlNQ1Vfcm93X2N0ciA9PSBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQorICAgICAgc2V0X2JvdHRvbV9wb2ludGVycyhjaW5mbyk7CisgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUk9DRVNTX0lNQ1U7CisgICAgLypGQUxMVEhST1VHSCovCisgIGNhc2UgQ1RYX1BST0NFU1NfSU1DVToKKyAgICAvKiBDYWxsIHBvc3Rwcm9jZXNzb3IgdXNpbmcgcHJldmlvdXNseSBzZXQgcG9pbnRlcnMgKi8KKyAgICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXSwKKwkJCSZtYWluLT5yb3dncm91cF9jdHIsIG1haW4tPnJvd2dyb3Vwc19hdmFpbCwKKwkJCW91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7CisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IG1haW4tPnJvd2dyb3Vwc19hdmFpbCkKKyAgICAgIHJldHVybjsJCQkvKiBOZWVkIHRvIHN1c3BlbmQgKi8KKyAgICAvKiBBZnRlciB0aGUgZmlyc3QgaU1DVSwgY2hhbmdlIHdyYXBhcm91bmQgcG9pbnRlcnMgdG8gbm9ybWFsIHN0YXRlICovCisgICAgaWYgKG1haW4tPmlNQ1Vfcm93X2N0ciA9PSAxKQorICAgICAgc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMoY2luZm8pOworICAgIC8qIFByZXBhcmUgdG8gbG9hZCBuZXcgaU1DVSByb3cgdXNpbmcgb3RoZXIgeGJ1ZmZlciBsaXN0ICovCisgICAgbWFpbi0+d2hpY2hwdHIgXj0gMTsJLyogMD0+MSBvciAxPT4wICovCisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsKKyAgICAvKiBTdGlsbCBuZWVkIHRvIHByb2Nlc3MgbGFzdCByb3cgZ3JvdXAgb2YgdGhpcyBpTUNVIHJvdywgKi8KKyAgICAvKiB3aGljaCBpcyBzYXZlZCBhdCBpbmRleCBNKzEgb2YgdGhlIG90aGVyIHhidWZmZXIgKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMSk7CisgICAgbWFpbi0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDIpOworICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUE9TVFBPTkVEX1JPVzsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIEZpbmFsIHBhc3Mgb2YgdHdvLXBhc3MgcXVhbnRpemF0aW9uOiBqdXN0IGNhbGwgdGhlIHBvc3Rwcm9jZXNzb3IuCisgKiBTb3VyY2UgZGF0YSB3aWxsIGJlIHRoZSBwb3N0cHJvY2Vzc29yIGNvbnRyb2xsZXIncyBpbnRlcm5hbCBidWZmZXIuCisgKi8KKworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorCitNRVRIT0RERUYodm9pZCkKK3Byb2Nlc3NfZGF0YV9jcmFua19wb3N0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QSU1BR0UpIE5VTEwsCisJCQkJICAgICAoSkRJTUVOU0lPTiAqKSBOVUxMLCAoSkRJTUVOU0lPTikgMCwKKwkJCQkgICAgIG91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7Cit9CisKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZF9tYWluX2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbjsKKyAgaW50IGNpLCByZ3JvdXAsIG5ncm91cHM7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgbWFpbiA9IChteV9tYWluX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9tYWluX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPm1haW4gPSAoc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgKikgbWFpbjsKKyAgbWFpbi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21haW47CisKKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworCisgIC8qIEFsbG9jYXRlIHRoZSB3b3Jrc3BhY2UuCisgICAqIG5ncm91cHMgaXMgdGhlIG51bWJlciBvZiByb3cgZ3JvdXBzIHdlIG5lZWQuCisgICAqLworICBpZiAoY2luZm8tPnVwc2FtcGxlLT5uZWVkX2NvbnRleHRfcm93cykgeworICAgIGlmIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA8IDIpIC8qIHVuc3VwcG9ydGVkLCBzZWUgY29tbWVudHMgYWJvdmUgKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9USU1QTCk7CisgICAgYWxsb2NfZnVubnlfcG9pbnRlcnMoY2luZm8pOyAvKiBBbGxvYyBzcGFjZSBmb3IgeGJ1ZmZlcltdIGxpc3RzICovCisgICAgbmdyb3VwcyA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMjsKKyAgfSBlbHNlIHsKKyAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIH0KKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIG1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkJCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplLAorCQkJIChKRElNRU5TSU9OKSAocmdyb3VwICogbmdyb3VwcykpOworICB9Cit9CmRpZmYgLS1naXQgYS9qcGVnL2pkbWFya2VyLmMgYi9qcGVnL2pkbWFya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3ODA0OQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRtYXJrZXIuYwpAQCAtMCwwICsxLDE0MTAgQEAKKy8qCisgKiBqZG1hcmtlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gZGVjb2RlIEpQRUcgZGF0YXN0cmVhbSBtYXJrZXJzLgorICogTW9zdCBvZiB0aGUgY29tcGxleGl0eSBhcmlzZXMgZnJvbSBvdXIgZGVzaXJlIHRvIHN1cHBvcnQgaW5wdXQKKyAqIHN1c3BlbnNpb246IGlmIG5vdCBhbGwgb2YgdGhlIGRhdGEgZm9yIGEgbWFya2VyIGlzIGF2YWlsYWJsZSwKKyAqIHdlIG11c3QgZXhpdCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbi4gIE9uIHJlc3VtcHRpb24sIHdlIHJlcHJvY2VzcworICogdGhlIG1hcmtlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKwordHlwZWRlZiBlbnVtIHsJCQkvKiBKUEVHIG1hcmtlciBjb2RlcyAqLworICBNX1NPRjAgID0gMHhjMCwKKyAgTV9TT0YxICA9IDB4YzEsCisgIE1fU09GMiAgPSAweGMyLAorICBNX1NPRjMgID0gMHhjMywKKyAgCisgIE1fU09GNSAgPSAweGM1LAorICBNX1NPRjYgID0gMHhjNiwKKyAgTV9TT0Y3ICA9IDB4YzcsCisgIAorICBNX0pQRyAgID0gMHhjOCwKKyAgTV9TT0Y5ICA9IDB4YzksCisgIE1fU09GMTAgPSAweGNhLAorICBNX1NPRjExID0gMHhjYiwKKyAgCisgIE1fU09GMTMgPSAweGNkLAorICBNX1NPRjE0ID0gMHhjZSwKKyAgTV9TT0YxNSA9IDB4Y2YsCisgIAorICBNX0RIVCAgID0gMHhjNCwKKyAgCisgIE1fREFDICAgPSAweGNjLAorICAKKyAgTV9SU1QwICA9IDB4ZDAsCisgIE1fUlNUMSAgPSAweGQxLAorICBNX1JTVDIgID0gMHhkMiwKKyAgTV9SU1QzICA9IDB4ZDMsCisgIE1fUlNUNCAgPSAweGQ0LAorICBNX1JTVDUgID0gMHhkNSwKKyAgTV9SU1Q2ICA9IDB4ZDYsCisgIE1fUlNUNyAgPSAweGQ3LAorICAKKyAgTV9TT0kgICA9IDB4ZDgsCisgIE1fRU9JICAgPSAweGQ5LAorICBNX1NPUyAgID0gMHhkYSwKKyAgTV9EUVQgICA9IDB4ZGIsCisgIE1fRE5MICAgPSAweGRjLAorICBNX0RSSSAgID0gMHhkZCwKKyAgTV9ESFAgICA9IDB4ZGUsCisgIE1fRVhQICAgPSAweGRmLAorICAKKyAgTV9BUFAwICA9IDB4ZTAsCisgIE1fQVBQMSAgPSAweGUxLAorICBNX0FQUDIgID0gMHhlMiwKKyAgTV9BUFAzICA9IDB4ZTMsCisgIE1fQVBQNCAgPSAweGU0LAorICBNX0FQUDUgID0gMHhlNSwKKyAgTV9BUFA2ICA9IDB4ZTYsCisgIE1fQVBQNyAgPSAweGU3LAorICBNX0FQUDggID0gMHhlOCwKKyAgTV9BUFA5ICA9IDB4ZTksCisgIE1fQVBQMTAgPSAweGVhLAorICBNX0FQUDExID0gMHhlYiwKKyAgTV9BUFAxMiA9IDB4ZWMsCisgIE1fQVBQMTMgPSAweGVkLAorICBNX0FQUDE0ID0gMHhlZSwKKyAgTV9BUFAxNSA9IDB4ZWYsCisgIAorICBNX0pQRzAgID0gMHhmMCwKKyAgTV9KUEcxMyA9IDB4ZmQsCisgIE1fQ09NICAgPSAweGZlLAorICAKKyAgTV9URU0gICA9IDB4MDEsCisgIAorICBNX0VSUk9SID0gMHgxMDAKK30gSlBFR19NQVJLRVI7CisKKworLyogUHJpdmF0ZSBzdGF0ZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQXBwbGljYXRpb24tb3ZlcnJpZGFibGUgbWFya2VyIHByb2Nlc3NpbmcgbWV0aG9kcyAqLworICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NfQ09NOworICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NfQVBQblsxNl07CisKKyAgLyogTGltaXQgb24gbWFya2VyIGRhdGEgbGVuZ3RoIHRvIHNhdmUgZm9yIGVhY2ggbWFya2VyIHR5cGUgKi8KKyAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdF9DT007CisgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXRfQVBQblsxNl07CisKKyAgLyogU3RhdHVzIG9mIENPTS9BUFBuIG1hcmtlciBzYXZpbmcgKi8KKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXI7CS8qIE5VTEwgaWYgbm90IHByb2Nlc3NpbmcgYSBtYXJrZXIgKi8KKyAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7CQkvKiBkYXRhIGJ5dGVzIHJlYWQgc28gZmFyIGluIG1hcmtlciAqLworICAvKiBOb3RlOiBjdXJfbWFya2VyIGlzIG5vdCBsaW5rZWQgaW50byBtYXJrZXJfbGlzdCB1bnRpbCBpdCdzIGFsbCByZWFkLiAqLworfSBteV9tYXJrZXJfcmVhZGVyOworCit0eXBlZGVmIG15X21hcmtlcl9yZWFkZXIgKiBteV9tYXJrZXJfcHRyOworCisKKy8qCisgKiBNYWNyb3MgZm9yIGZldGNoaW5nIGRhdGEgZnJvbSB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlLgorICoKKyAqIEF0IGFsbCB0aW1lcywgY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlIGFuZCAtPmJ5dGVzX2luX2J1ZmZlciByZWZsZWN0CisgKiB0aGUgY3VycmVudCByZXN0YXJ0IHBvaW50OyB3ZSB1cGRhdGUgdGhlbSBvbmx5IHdoZW4gd2UgaGF2ZSByZWFjaGVkIGEKKyAqIHN1aXRhYmxlIHBsYWNlIHRvIHJlc3RhcnQgaWYgYSBzdXNwZW5zaW9uIG9jY3Vycy4KKyAqLworCisvKiBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGxvY2FsIGNvcGllcyBvZiBpbnB1dCBwb2ludGVyL2NvdW50ICovCisjZGVmaW5lIElOUFVUX1ZBUlMoY2luZm8pICBcCisJc3RydWN0IGpwZWdfc291cmNlX21nciAqIGRhdGFzcmMgPSAoY2luZm8pLT5zcmM7ICBcCisJY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlOyAgXAorCXNpemVfdCBieXRlc19pbl9idWZmZXIgPSBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIKKworLyogVW5sb2FkIHRoZSBsb2NhbCBjb3BpZXMgLS0tIGRvIHRoaXMgb25seSBhdCBhIHJlc3RhcnQgYm91bmRhcnkgKi8KKyNkZWZpbmUgSU5QVVRfU1lOQyhjaW5mbykgIFwKKwkoIGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZSwgIFwKKwkgIGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlciApCisKKy8qIFJlbG9hZCB0aGUgbG9jYWwgY29waWVzIC0tLSB1c2VkIG9ubHkgaW4gTUFLRV9CWVRFX0FWQUlMICovCisjZGVmaW5lIElOUFVUX1JFTE9BRChjaW5mbykgIFwKKwkoIG5leHRfaW5wdXRfYnl0ZSA9IGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSwgIFwKKwkgIGJ5dGVzX2luX2J1ZmZlciA9IGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlciApCisKKy8qIEludGVybmFsIG1hY3JvIGZvciBJTlBVVF9CWVRFIGFuZCBJTlBVVF8yQllURVM6IG1ha2UgYSBieXRlIGF2YWlsYWJsZS4KKyAqIE5vdGUgd2UgZG8gKm5vdCogZG8gSU5QVVRfU1lOQyBiZWZvcmUgY2FsbGluZyBmaWxsX2lucHV0X2J1ZmZlciwKKyAqIGJ1dCB3ZSBtdXN0IHJlbG9hZCB0aGUgbG9jYWwgY29waWVzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxsLgorICovCisjZGVmaW5lIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pICBcCisJaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7ICBcCisJICBpZiAoISAoKmRhdGFzcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKSAgXAorCSAgICB7IGFjdGlvbjsgfSAgXAorCSAgSU5QVVRfUkVMT0FEKGNpbmZvKTsgIFwKKwl9CisKKy8qIFJlYWQgYSBieXRlIGludG8gdmFyaWFibGUgVi4KKyAqIElmIG11c3Qgc3VzcGVuZCwgdGFrZSB0aGUgc3BlY2lmaWVkIGFjdGlvbiAodHlwaWNhbGx5ICJyZXR1cm4gRkFMU0UiKS4KKyAqLworI2RlZmluZSBJTlBVVF9CWVRFKGNpbmZvLFYsYWN0aW9uKSAgXAorCU1BS0VTVE1UKCBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAorCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCisJCSAgViA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOyApCisKKy8qIEFzIGFib3ZlLCBidXQgcmVhZCB0d28gYnl0ZXMgaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIuCisgKiBWIHNob3VsZCBiZSBkZWNsYXJlZCB1bnNpZ25lZCBpbnQgb3IgcGVyaGFwcyBJTlQzMi4KKyAqLworI2RlZmluZSBJTlBVVF8yQllURVMoY2luZm8sVixhY3Rpb24pICBcCisJTUFLRVNUTVQoIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCisJCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKKwkJICBWID0gKCh1bnNpZ25lZCBpbnQpIEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspKSA8PCA4OyBcCisJCSAgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKKwkJICBieXRlc19pbl9idWZmZXItLTsgXAorCQkgIFYgKz0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7ICkKKworCisvKgorICogUm91dGluZXMgdG8gcHJvY2VzcyBKUEVHIG1hcmtlcnMuCisgKgorICogRW50cnkgY29uZGl0aW9uOiBKUEVHIG1hcmtlciBpdHNlbGYgaGFzIGJlZW4gcmVhZCBhbmQgaXRzIGNvZGUgc2F2ZWQKKyAqICAgaW4gY2luZm8tPnVucmVhZF9tYXJrZXI7IGlucHV0IHJlc3RhcnQgcG9pbnQgaXMganVzdCBhZnRlciB0aGUgbWFya2VyLgorICoKKyAqIEV4aXQ6IGlmIHJldHVybiBUUlVFLCBoYXZlIHJlYWQgYW5kIHByb2Nlc3NlZCBhbnkgcGFyYW1ldGVycywgYW5kIGhhdmUKKyAqICAgdXBkYXRlZCB0aGUgcmVzdGFydCBwb2ludCB0byBwb2ludCBhZnRlciB0aGUgcGFyYW1ldGVycy4KKyAqICAgSWYgcmV0dXJuIEZBTFNFLCB3YXMgZm9yY2VkIHRvIHN1c3BlbmQgYmVmb3JlIHJlYWNoaW5nIGVuZCBvZgorICogICBtYXJrZXIgcGFyYW1ldGVyczsgcmVzdGFydCBwb2ludCBoYXMgbm90IGJlZW4gbW92ZWQuICBTYW1lIHJvdXRpbmUKKyAqICAgd2lsbCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgYXBwbGljYXRpb24gc3VwcGxpZXMgbW9yZSBpbnB1dCBkYXRhLgorICoKKyAqIFRoaXMgYXBwcm9hY2ggdG8gc3VzcGVuc2lvbiBhc3N1bWVzIHRoYXQgYWxsIG9mIGEgbWFya2VyJ3MgcGFyYW1ldGVycworICogY2FuIGZpdCBpbnRvIGEgc2luZ2xlIGlucHV0IGJ1ZmZlcmxvYWQuICBUaGlzIHNob3VsZCBob2xkIGZvciAibm9ybWFsIgorICogbWFya2Vycy4gIFNvbWUgQ09NL0FQUG4gbWFya2VycyBtaWdodCBoYXZlIGxhcmdlIHBhcmFtZXRlciBzZWdtZW50cworICogdGhhdCBtaWdodCBub3QgZml0LiAgSWYgd2UgYXJlIHNpbXBseSBkcm9wcGluZyBzdWNoIGEgbWFya2VyLCB3ZSB1c2UKKyAqIHNraXBfaW5wdXRfZGF0YSB0byBnZXQgcGFzdCBpdCwgYW5kIHRoZXJlYnkgcHV0IHRoZSBwcm9ibGVtIG9uIHRoZQorICogc291cmNlIG1hbmFnZXIncyBzaG91bGRlcnMuICBJZiB3ZSBhcmUgc2F2aW5nIHRoZSBtYXJrZXIncyBjb250ZW50cworICogaW50byBtZW1vcnksIHdlIHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudCBjb252ZW50aW9uOiB3aGVuIGZvcmNlZCB0bworICogc3VzcGVuZCwgdGhlIG1hcmtlciBwcm9jZXNzb3IgdXBkYXRlcyB0aGUgcmVzdGFydCBwb2ludCB0byB0aGUgZW5kIG9mCisgKiB3aGF0IGl0J3MgY29uc3VtZWQgKGllLCB0aGUgZW5kIG9mIHRoZSBidWZmZXIpIGJlZm9yZSByZXR1cm5pbmcgRkFMU0UuCisgKiBPbiByZXN1bXB0aW9uLCBjaW5mby0+dW5yZWFkX21hcmtlciBzdGlsbCBjb250YWlucyB0aGUgbWFya2VyIGNvZGUsCisgKiBidXQgdGhlIGRhdGEgc291cmNlIHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgY2h1bmsgb2YgbWFya2VyIGRhdGEuCisgKiBUaGUgbWFya2VyIHByb2Nlc3NvciBtdXN0IHJldGFpbiBpbnRlcm5hbCBzdGF0ZSB0byBkZWFsIHdpdGggdGhpcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIGF2b2lkIGR1cGxpY2F0ZSB0cmFjZSBtZXNzYWdlcyBpZiBhCisgKiBzdXNwZW5zaW9uIG9jY3VycyB3aXRoaW4gbWFya2VyIHBhcmFtZXRlcnMuICBPdGhlciBzaWRlIGVmZmVjdHMKKyAqIHJlcXVpcmUgbW9yZSBjYXJlLgorICovCisKKworTE9DQUwoYm9vbGVhbikKK2dldF9zb2kgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGFuIFNPSSBtYXJrZXIgKi8KK3sKKyAgaW50IGk7CisgIAorICBUUkFDRU1TKGNpbmZvLCAxLCBKVFJDX1NPSSk7CisKKyAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0kpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT0lfRFVQTElDQVRFKTsKKworICAvKiBSZXNldCBhbGwgcGFyYW1ldGVycyB0aGF0IGFyZSBkZWZpbmVkIHRvIGJlIHJlc2V0IGJ5IFNPSSAqLworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOworICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKKyAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7CisgIH0KKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworCisgIC8qIFNldCBpbml0aWFsIGFzc3VtcHRpb25zIGZvciBjb2xvcnNwYWNlIGV0YyAqLworCisgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047CisgIGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nID0gRkFMU0U7IC8qIEFzc3VtZSBub24tQ0NJUiBzYW1wbGluZz8/PyAqLworCisgIGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIgPSBGQUxTRTsKKyAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IDE7IC8qIHNldCBkZWZhdWx0IEpGSUYgQVBQMCB2YWx1ZXMgKi8KKyAgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IDE7CisgIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSAwOworICBjaW5mby0+WF9kZW5zaXR5ID0gMTsKKyAgY2luZm8tPllfZGVuc2l0eSA9IDE7CisgIGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyID0gRkFMU0U7CisgIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0gPSAwOworCisgIGNpbmZvLT5tYXJrZXItPnNhd19TT0kgPSBUUlVFOworCisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfc29mIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3Byb2csIGJvb2xlYW4gaXNfYXJpdGgpCisvKiBQcm9jZXNzIGEgU09GbiBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgYywgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IGlzX3Byb2c7CisgIGNpbmZvLT5hcml0aF9jb2RlID0gaXNfYXJpdGg7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisKKyAgSU5QVVRfQllURShjaW5mbywgY2luZm8tPmRhdGFfcHJlY2lzaW9uLCByZXR1cm4gRkFMU0UpOworICBJTlBVVF8yQllURVMoY2luZm8sIGNpbmZvLT5pbWFnZV9oZWlnaHQsIHJldHVybiBGQUxTRSk7CisgIElOUFVUXzJCWVRFUyhjaW5mbywgY2luZm8tPmltYWdlX3dpZHRoLCByZXR1cm4gRkFMU0UpOworICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMsIHJldHVybiBGQUxTRSk7CisKKyAgbGVuZ3RoIC09IDg7CisKKyAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09GLCBjaW5mby0+dW5yZWFkX21hcmtlciwKKwkgICAoaW50KSBjaW5mby0+aW1hZ2Vfd2lkdGgsIChpbnQpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJICAgY2luZm8tPm51bV9jb21wb25lbnRzKTsKKworICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPRikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPRl9EVVBMSUNBVEUpOworCisgIC8qIFdlIGRvbid0IHN1cHBvcnQgZmlsZXMgaW4gd2hpY2ggdGhlIGltYWdlIGhlaWdodCBpcyBpbml0aWFsbHkgc3BlY2lmaWVkICovCisgIC8qIGFzIDAgYW5kIGlzIGxhdGVyIHJlZGVmaW5lZCBieSBETkwuICBBcyBsb25nIGFzIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCwgICovCisgIC8qIG1pZ2h0IGFzIHdlbGwgaGF2ZSBhIGdlbmVyYWwgc2FuaXR5IGNoZWNrLiAqLworICBpZiAoY2luZm8tPmltYWdlX2hlaWdodCA8PSAwIHx8IGNpbmZvLT5pbWFnZV93aWR0aCA8PSAwCisgICAgICB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPD0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNUFRZX0lNQUdFKTsKKworICBpZiAobGVuZ3RoICE9IChjaW5mby0+bnVtX2NvbXBvbmVudHMgKiAzKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIGlmIChjaW5mby0+Y29tcF9pbmZvID09IE5VTEwpCS8qIGRvIG9ubHkgb25jZSwgZXZlbiBpZiBzdXNwZW5kICovCisgICAgY2luZm8tPmNvbXBfaW5mbyA9IChqcGVnX2NvbXBvbmVudF9pbmZvICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCisJCQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJIGNpbmZvLT5udW1fY29tcG9uZW50cyAqIFNJWkVPRihqcGVnX2NvbXBvbmVudF9pbmZvKSk7CisgIAorICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGNvbXBwdHItPmNvbXBvbmVudF9pbmRleCA9IGNpOworICAgIElOUFVUX0JZVEUoY2luZm8sIGNvbXBwdHItPmNvbXBvbmVudF9pZCwgcmV0dXJuIEZBTFNFKTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPSAoYyA+PiA0KSAmIDE1OworICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPSAoYyAgICAgKSAmIDE1OworICAgIElOUFVUX0JZVEUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubywgcmV0dXJuIEZBTFNFKTsKKworICAgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPRl9DT01QT05FTlQsCisJICAgICBjb21wcHRyLT5jb21wb25lbnRfaWQsIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBjb21wcHRyLT5xdWFudF90Ymxfbm8pOworICB9CisKKyAgY2luZm8tPm1hcmtlci0+c2F3X1NPRiA9IFRSVUU7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfc29zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIFNPUyBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgaSwgY2ksIG4sIGMsIGNjLCBwaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGlmICghIGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT1NfTk9fU09GKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKworICBJTlBVVF9CWVRFKGNpbmZvLCBuLCByZXR1cm4gRkFMU0UpOyAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLworCisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1NPUywgbik7CisKKyAgaWYgKGxlbmd0aCAhPSAobiAqIDIgKyA2KSB8fCBuIDwgMSB8fCBuID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IG47CisKKyAgLyogQ29sbGVjdCB0aGUgY29tcG9uZW50LXNwZWMgcGFyYW1ldGVycyAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjYywgcmV0dXJuIEZBTFNFKTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIAorICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgaWYgKGNjID09IGNvbXBwdHItPmNvbXBvbmVudF9pZCkKKwlnb3RvIGlkX2ZvdW5kOworICAgIH0KKworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9DT01QT05FTlRfSUQsIGNjKTsKKworICBpZF9mb3VuZDoKKworICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldID0gY29tcHB0cjsKKyAgICBjb21wcHRyLT5kY190Ymxfbm8gPSAoYyA+PiA0KSAmIDE1OworICAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChjICAgICApICYgMTU7CisgICAgCisgICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfU09TX0NPTVBPTkVOVCwgY2MsCisJICAgICBjb21wcHRyLT5kY190Ymxfbm8sIGNvbXBwdHItPmFjX3RibF9ubyk7CisKKyAgICAvKiBUaGlzIENTaSAoY2MpIHNob3VsZCBkaWZmZXIgZnJvbSB0aGUgcHJldmlvdXMgQ1NpICovCisgICAgZm9yIChwaSA9IDA7IHBpIDwgaTsgcGkrKykgeworICAgICAgaWYgKGNpbmZvLT5jdXJfY29tcF9pbmZvW3BpXSA9PSBjb21wcHRyKQorICAgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfQ09NUE9ORU5UX0lELCBjYyk7CisgICAgfQorICB9CisKKyAgLyogQ29sbGVjdCB0aGUgYWRkaXRpb25hbCBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbC4gKi8KKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPlNzID0gYzsKKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPlNlID0gYzsKKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPkFoID0gKGMgPj4gNCkgJiAxNTsKKyAgY2luZm8tPkFsID0gKGMgICAgICkgJiAxNTsKKworICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT1NfUEFSQU1TLCBjaW5mby0+U3MsIGNpbmZvLT5TZSwKKwkgICBjaW5mby0+QWgsIGNpbmZvLT5BbCk7CisKKyAgLyogUHJlcGFyZSB0byBzY2FuIGRhdGEgJiByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IDA7CisKKyAgLyogQ291bnQgYW5vdGhlciBTT1MgbWFya2VyICovCisgIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcisrOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisjaWZkZWYgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVECisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZGFjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERBQyBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgaW5kZXgsIHZhbDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworICAKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBpbmRleCwgcmV0dXJuIEZBTFNFKTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCB2YWwsIHJldHVybiBGQUxTRSk7CisKKyAgICBsZW5ndGggLT0gMjsKKworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0RBQywgaW5kZXgsIHZhbCk7CisKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49ICgyKk5VTV9BUklUSF9UQkxTKSkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RBQ19JTkRFWCwgaW5kZXgpOworCisgICAgaWYgKGluZGV4ID49IE5VTV9BUklUSF9UQkxTKSB7IC8qIGRlZmluZSBBQyB0YWJsZSAqLworICAgICAgY2luZm8tPmFyaXRoX2FjX0tbaW5kZXgtTlVNX0FSSVRIX1RCTFNdID0gKFVJTlQ4KSB2YWw7CisgICAgfSBlbHNlIHsJCQkvKiBkZWZpbmUgREMgdGFibGUgKi8KKyAgICAgIGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA9IChVSU5UOCkgKHZhbCAmIDB4MEYpOworICAgICAgY2luZm8tPmFyaXRoX2RjX1VbaW5kZXhdID0gKFVJTlQ4KSAodmFsID4+IDQpOworICAgICAgaWYgKGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA+IGNpbmZvLT5hcml0aF9kY19VW2luZGV4XSkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9EQUNfVkFMVUUsIHZhbCk7CisgICAgfQorICB9CisKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisjZWxzZSAvKiAhIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLworCisjZGVmaW5lIGdldF9kYWMoY2luZm8pICBza2lwX3ZhcmlhYmxlKGNpbmZvKQorCisjZW5kaWYgLyogRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCisKKworTE9DQUwoYm9vbGVhbikKK2dldF9kaHQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgREhUIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIFVJTlQ4IGJpdHNbMTddOworICBVSU5UOCBodWZmdmFsWzI1Nl07CisgIGludCBpLCBpbmRleCwgY291bnQ7CisgIEpIVUZGX1RCTCAqKmh0YmxwdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKyAgCisgIHdoaWxlIChsZW5ndGggPiAxNikgeworICAgIElOUFVUX0JZVEUoY2luZm8sIGluZGV4LCByZXR1cm4gRkFMU0UpOworCisgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfREhULCBpbmRleCk7CisgICAgICAKKyAgICBiaXRzWzBdID0gMDsKKyAgICBjb3VudCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKSB7CisgICAgICBJTlBVVF9CWVRFKGNpbmZvLCBiaXRzW2ldLCByZXR1cm4gRkFMU0UpOworICAgICAgY291bnQgKz0gYml0c1tpXTsKKyAgICB9CisKKyAgICBsZW5ndGggLT0gMSArIDE2OworCisgICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCisJICAgICBiaXRzWzFdLCBiaXRzWzJdLCBiaXRzWzNdLCBiaXRzWzRdLAorCSAgICAgYml0c1s1XSwgYml0c1s2XSwgYml0c1s3XSwgYml0c1s4XSk7CisgICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCisJICAgICBiaXRzWzldLCBiaXRzWzEwXSwgYml0c1sxMV0sIGJpdHNbMTJdLAorCSAgICAgYml0c1sxM10sIGJpdHNbMTRdLCBiaXRzWzE1XSwgYml0c1sxNl0pOworCisgICAgLyogSGVyZSB3ZSBqdXN0IGRvIG1pbmltYWwgdmFsaWRhdGlvbiBvZiB0aGUgY291bnRzIHRvIGF2b2lkIHdhbGtpbmcKKyAgICAgKiBvZmYgdGhlIGVuZCBvZiBvdXIgdGFibGUgc3BhY2UuICBqZGh1ZmYuYyB3aWxsIGNoZWNrIG1vcmUgY2FyZWZ1bGx5LgorICAgICAqLworICAgIGlmIChjb3VudCA+IDI1NiB8fCAoKElOVDMyKSBjb3VudCkgPiBsZW5ndGgpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgSU5QVVRfQllURShjaW5mbywgaHVmZnZhbFtpXSwgcmV0dXJuIEZBTFNFKTsKKworICAgIE1FTVpFUk8oJmh1ZmZ2YWxbY291bnRdLCAoMjU2IC0gY291bnQpICogU0laRU9GKFVJTlQ4KSk7CisKKyAgICBsZW5ndGggLT0gY291bnQ7CisKKyAgICBpZiAoaW5kZXggJiAweDEwKSB7CQkvKiBBQyB0YWJsZSBkZWZpbml0aW9uICovCisgICAgICBpbmRleCAtPSAweDEwOworICAgICAgaHRibHB0ciA9ICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpbmRleF07CisgICAgfSBlbHNlIHsJCQkvKiBEQyB0YWJsZSBkZWZpbml0aW9uICovCisgICAgICBodGJscHRyID0gJmNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgICB9CisKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE5VTV9IVUZGX1RCTFMpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9ESFRfSU5ERVgsIGluZGV4KTsKKworICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorICAgICAgKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAKKyAgICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7CisgICAgTUVNQ09QWSgoKmh0YmxwdHIpLT5odWZmdmFsLCBodWZmdmFsLCBTSVpFT0YoKCpodGJscHRyKS0+aHVmZnZhbCkpOworICB9CisKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZHF0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERRVCBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgbiwgaSwgcHJlYzsKKyAgdW5zaWduZWQgaW50IHRtcDsKKyAgSlFVQU5UX1RCTCAqcXVhbnRfcHRyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBuLCByZXR1cm4gRkFMU0UpOworICAgIHByZWMgPSBuID4+IDQ7CisgICAgbiAmPSAweDBGOworCisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfRFFULCBuLCBwcmVjKTsKKworICAgIGlmIChuID49IE5VTV9RVUFOVF9UQkxTKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfRFFUX0lOREVYLCBuKTsKKyAgICAgIAorICAgIGlmIChjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl0gPT0gTlVMTCkKKyAgICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgIHF1YW50X3B0ciA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisgICAgICBpZiAocHJlYykKKwlJTlBVVF8yQllURVMoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKKyAgICAgIGVsc2UKKwlJTlBVVF9CWVRFKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7CisgICAgICAvKiBXZSBjb252ZXJ0IHRoZSB6aWd6YWctb3JkZXIgdGFibGUgdG8gbmF0dXJhbCBhcnJheSBvcmRlci4gKi8KKyAgICAgIHF1YW50X3B0ci0+cXVhbnR2YWxbanBlZ19uYXR1cmFsX29yZGVyW2ldXSA9IChVSU5UMTYpIHRtcDsKKyAgICB9CisKKyAgICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPj0gMikgeworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDgpIHsKKwlUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19RVUFOVFZBTFMsCisJCSBxdWFudF9wdHItPnF1YW50dmFsW2ldLCAgIHF1YW50X3B0ci0+cXVhbnR2YWxbaSsxXSwKKwkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSsyXSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzNdLAorCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzRdLCBxdWFudF9wdHItPnF1YW50dmFsW2krNV0sCisJCSBxdWFudF9wdHItPnF1YW50dmFsW2krNl0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs3XSk7CisgICAgICB9CisgICAgfQorCisgICAgbGVuZ3RoIC09IERDVFNJWkUyKzE7CisgICAgaWYgKHByZWMpIGxlbmd0aCAtPSBEQ1RTSVpFMjsKKyAgfQorCisgIGlmIChsZW5ndGggIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZ2V0X2RyaSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYSBEUkkgbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IHRtcDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIAorICBpZiAobGVuZ3RoICE9IDQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKKworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19EUkksIHRtcCk7CisKKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSB0bXA7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBSb3V0aW5lcyBmb3IgcHJvY2Vzc2luZyBBUFBuIGFuZCBDT00gbWFya2Vycy4KKyAqIFRoZXNlIGFyZSBlaXRoZXIgc2F2ZWQgaW4gbWVtb3J5IG9yIGRpc2NhcmRlZCwgcGVyIGFwcGxpY2F0aW9uIHJlcXVlc3QuCisgKiBBUFAwIGFuZCBBUFAxNCBhcmUgc3BlY2lhbGx5IGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgYXJlCisgKiBKRklGIGFuZCBBZG9iZSBtYXJrZXJzLCByZXNwZWN0aXZlbHkuCisgKi8KKworI2RlZmluZSBBUFAwX0RBVEFfTEVOCTE0CS8qIExlbmd0aCBvZiBpbnRlcmVzdGluZyBkYXRhIGluIEFQUDAgKi8KKyNkZWZpbmUgQVBQMTRfREFUQV9MRU4JMTIJLyogTGVuZ3RoIG9mIGludGVyZXN0aW5nIGRhdGEgaW4gQVBQMTQgKi8KKyNkZWZpbmUgQVBQTl9EQVRBX0xFTgkxNAkvKiBNdXN0IGJlIHRoZSBsYXJnZXN0IG9mIHRoZSBhYm92ZSEhICovCisKKworTE9DQUwodm9pZCkKK2V4YW1pbmVfYXBwMCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSk9DVEVUIEZBUiAqIGRhdGEsCisJICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4sIElOVDMyIHJlbWFpbmluZykKKy8qIEV4YW1pbmUgZmlyc3QgZmV3IGJ5dGVzIGZyb20gYW4gQVBQMC4KKyAqIFRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGlmIGl0IGlzIGEgSkZJRiBtYXJrZXIuCisgKiBkYXRhbGVuIGlzICMgb2YgYnl0ZXMgYXQgZGF0YVtdLCByZW1haW5pbmcgaXMgbGVuZ3RoIG9mIHJlc3Qgb2YgbWFya2VyIGRhdGEuCisgKi8KK3sKKyAgSU5UMzIgdG90YWxsZW4gPSAoSU5UMzIpIGRhdGFsZW4gKyByZW1haW5pbmc7CisKKyAgaWYgKGRhdGFsZW4gPj0gQVBQMF9EQVRBX0xFTiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NEEgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDQ2ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg0OSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAwKSB7CisgICAgLyogRm91bmQgSkZJRiBBUFAwIG1hcmtlcjogc2F2ZSBpbmZvICovCisgICAgY2luZm8tPnNhd19KRklGX21hcmtlciA9IFRSVUU7CisgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IEdFVEpPQ1RFVChkYXRhWzVdKTsKKyAgICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gR0VUSk9DVEVUKGRhdGFbNl0pOworICAgIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSBHRVRKT0NURVQoZGF0YVs3XSk7CisgICAgY2luZm8tPlhfZGVuc2l0eSA9IChHRVRKT0NURVQoZGF0YVs4XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs5XSk7CisgICAgY2luZm8tPllfZGVuc2l0eSA9IChHRVRKT0NURVQoZGF0YVsxMF0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbMTFdKTsKKyAgICAvKiBDaGVjayB2ZXJzaW9uLgorICAgICAqIE1ham9yIHZlcnNpb24gbXVzdCBiZSAxLCBhbnl0aGluZyBlbHNlIHNpZ25hbHMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZS4KKyAgICAgKiAoV2UgdXNlZCB0byB0cmVhdCB0aGlzIGFzIGFuIGVycm9yLCBidXQgbm93IGl0J3MgYSBub25mYXRhbCB3YXJuaW5nLAorICAgICAqIGJlY2F1c2Ugc29tZSBib3pvIGF0IEhpamFhayBjb3VsZG4ndCByZWFkIHRoZSBzcGVjLikKKyAgICAgKiBNaW5vciB2ZXJzaW9uIHNob3VsZCBiZSAwLi4yLCBidXQgcHJvY2VzcyBhbnl3YXkgaWYgbmV3ZXIuCisgICAgICovCisgICAgaWYgKGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gIT0gMSkKKyAgICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fSkZJRl9NQUpPUiwKKwkgICAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKKyAgICAvKiBHZW5lcmF0ZSB0cmFjZSBtZXNzYWdlcyAqLworICAgIFRSQUNFTVM1KGNpbmZvLCAxLCBKVFJDX0pGSUYsCisJICAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uLAorCSAgICAgY2luZm8tPlhfZGVuc2l0eSwgY2luZm8tPllfZGVuc2l0eSwgY2luZm8tPmRlbnNpdHlfdW5pdCk7CisgICAgLyogVmFsaWRhdGUgdGh1bWJuYWlsIGRpbWVuc2lvbnMgYW5kIGlzc3VlIGFwcHJvcHJpYXRlIG1lc3NhZ2VzICovCisgICAgaWYgKEdFVEpPQ1RFVChkYXRhWzEyXSkgfCBHRVRKT0NURVQoZGF0YVsxM10pKQorICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfSkZJRl9USFVNQk5BSUwsCisJICAgICAgIEdFVEpPQ1RFVChkYXRhWzEyXSksIEdFVEpPQ1RFVChkYXRhWzEzXSkpOworICAgIHRvdGFsbGVuIC09IEFQUDBfREFUQV9MRU47CisgICAgaWYgKHRvdGFsbGVuICE9CisJKChJTlQzMilHRVRKT0NURVQoZGF0YVsxMl0pICogKElOVDMyKUdFVEpPQ1RFVChkYXRhWzEzXSkgKiAoSU5UMzIpIDMpKQorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfSkZJRl9CQURUSFVNQk5BSUxTSVpFLCAoaW50KSB0b3RhbGxlbik7CisgIH0gZWxzZSBpZiAoZGF0YWxlbiA+PSA2ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0QSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDU4ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg1OCAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDApIHsKKyAgICAvKiBGb3VuZCBKRklGICJKRlhYIiBleHRlbnNpb24gQVBQMCBtYXJrZXIgKi8KKyAgICAvKiBUaGUgbGlicmFyeSBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIHdpdGggdGhlc2UsCisgICAgICogYnV0IHdlIHRyeSB0byBwcm9kdWNlIGEgaGVscGZ1bCB0cmFjZSBtZXNzYWdlLgorICAgICAqLworICAgIHN3aXRjaCAoR0VUSk9DVEVUKGRhdGFbNV0pKSB7CisgICAgY2FzZSAweDEwOgorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfSlBFRywgKGludCkgdG90YWxsZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDExOgorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfUEFMRVRURSwgKGludCkgdG90YWxsZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEzOgorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfUkdCLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfSkZJRl9FWFRFTlNJT04sCisJICAgICAgIEdFVEpPQ1RFVChkYXRhWzVdKSwgKGludCkgdG90YWxsZW4pOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIFN0YXJ0IG9mIEFQUDAgZG9lcyBub3QgbWF0Y2ggIkpGSUYiIG9yICJKRlhYIiwgb3IgdG9vIHNob3J0ICovCisgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfQVBQMCwgKGludCkgdG90YWxsZW4pOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2V4YW1pbmVfYXBwMTQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpPQ1RFVCBGQVIgKiBkYXRhLAorCSAgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbiwgSU5UMzIgcmVtYWluaW5nKQorLyogRXhhbWluZSBmaXJzdCBmZXcgYnl0ZXMgZnJvbSBhbiBBUFAxNC4KKyAqIFRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGlmIGl0IGlzIGFuIEFkb2JlIG1hcmtlci4KKyAqIGRhdGFsZW4gaXMgIyBvZiBieXRlcyBhdCBkYXRhW10sIHJlbWFpbmluZyBpcyBsZW5ndGggb2YgcmVzdCBvZiBtYXJrZXIgZGF0YS4KKyAqLworeworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiwgZmxhZ3MwLCBmbGFnczEsIHRyYW5zZm9ybTsKKworICBpZiAoZGF0YWxlbiA+PSBBUFAxNF9EQVRBX0xFTiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NDEgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDY0ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg2RiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NjIgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAweDY1KSB7CisgICAgLyogRm91bmQgQWRvYmUgQVBQMTQgbWFya2VyICovCisgICAgdmVyc2lvbiA9IChHRVRKT0NURVQoZGF0YVs1XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs2XSk7CisgICAgZmxhZ3MwID0gKEdFVEpPQ1RFVChkYXRhWzddKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzhdKTsKKyAgICBmbGFnczEgPSAoR0VUSk9DVEVUKGRhdGFbOV0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbMTBdKTsKKyAgICB0cmFuc2Zvcm0gPSBHRVRKT0NURVQoZGF0YVsxMV0pOworICAgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX0FET0JFLCB2ZXJzaW9uLCBmbGFnczAsIGZsYWdzMSwgdHJhbnNmb3JtKTsKKyAgICBjaW5mby0+c2F3X0Fkb2JlX21hcmtlciA9IFRSVUU7CisgICAgY2luZm8tPkFkb2JlX3RyYW5zZm9ybSA9IChVSU5UOCkgdHJhbnNmb3JtOworICB9IGVsc2UgeworICAgIC8qIFN0YXJ0IG9mIEFQUDE0IGRvZXMgbm90IG1hdGNoICJBZG9iZSIsIG9yIHRvbyBzaG9ydCAqLworICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0FQUDE0LCAoaW50KSAoZGF0YWxlbiArIHJlbWFpbmluZykpOworICB9Cit9CisKKworTUVUSE9EREVGKGJvb2xlYW4pCitnZXRfaW50ZXJlc3RpbmdfYXBwbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYW4gQVBQMCBvciBBUFAxNCBtYXJrZXIgd2l0aG91dCBzYXZpbmcgaXQgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBKT0NURVQgYltBUFBOX0RBVEFfTEVOXTsKKyAgdW5zaWduZWQgaW50IGksIG51bXRvcmVhZDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworCisgIC8qIGdldCB0aGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgbWFya2VyIGRhdGEgKi8KKyAgaWYgKGxlbmd0aCA+PSBBUFBOX0RBVEFfTEVOKQorICAgIG51bXRvcmVhZCA9IEFQUE5fREFUQV9MRU47CisgIGVsc2UgaWYgKGxlbmd0aCA+IDApCisgICAgbnVtdG9yZWFkID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOworICBlbHNlCisgICAgbnVtdG9yZWFkID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG51bXRvcmVhZDsgaSsrKQorICAgIElOUFVUX0JZVEUoY2luZm8sIGJbaV0sIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSBudW10b3JlYWQ7CisKKyAgLyogcHJvY2VzcyBpdCAqLworICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7CisgIGNhc2UgTV9BUFAwOgorICAgIGV4YW1pbmVfYXBwMChjaW5mbywgKEpPQ1RFVCBGQVIgKikgYiwgbnVtdG9yZWFkLCBsZW5ndGgpOworICAgIGJyZWFrOworICBjYXNlIE1fQVBQMTQ6CisgICAgZXhhbWluZV9hcHAxNChjaW5mbywgKEpPQ1RFVCBGQVIgKikgYiwgbnVtdG9yZWFkLCBsZW5ndGgpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIC8qIGNhbid0IGdldCBoZXJlIHVubGVzcyBqcGVnX3NhdmVfbWFya2VycyBjaG9vc2VzIHdyb25nIHByb2Nlc3NvciAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBza2lwIGFueSByZW1haW5pbmcgZGF0YSAtLSBjb3VsZCBiZSBsb3RzICovCisgIElOUFVUX1NZTkMoY2luZm8pOworICBpZiAobGVuZ3RoID4gMCkKKyAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisjaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAorCitNRVRIT0RERUYoYm9vbGVhbikKK3NhdmVfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2F2ZSBhbiBBUFBuIG9yIENPTSBtYXJrZXIgaW50byB0aGUgbWFya2VyIGxpc3QgKi8KK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXIgPSBtYXJrZXItPmN1cl9tYXJrZXI7CisgIHVuc2lnbmVkIGludCBieXRlc19yZWFkLCBkYXRhX2xlbmd0aDsKKyAgSk9DVEVUIEZBUiAqIGRhdGE7CisgIElOVDMyIGxlbmd0aCA9IDA7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGlmIChjdXJfbWFya2VyID09IE5VTEwpIHsKKyAgICAvKiBiZWdpbiByZWFkaW5nIGEgbWFya2VyICovCisgICAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgICAgbGVuZ3RoIC09IDI7CisgICAgaWYgKGxlbmd0aCA+PSAwKSB7CQkvKiB3YXRjaCBvdXQgZm9yIGJvZ3VzIGxlbmd0aCB3b3JkICovCisgICAgICAvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHdlIHdhbnQgdG8gc2F2ZSAqLworICAgICAgdW5zaWduZWQgaW50IGxpbWl0OworICAgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IChpbnQpIE1fQ09NKQorCWxpbWl0ID0gbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NOworICAgICAgZWxzZQorCWxpbWl0ID0gbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQbltjaW5mby0+dW5yZWFkX21hcmtlciAtIChpbnQpIE1fQVBQMF07CisgICAgICBpZiAoKHVuc2lnbmVkIGludCkgbGVuZ3RoIDwgbGltaXQpCisJbGltaXQgPSAodW5zaWduZWQgaW50KSBsZW5ndGg7CisgICAgICAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbWFya2VyIGl0ZW0gKi8KKyAgICAgIGN1cl9tYXJrZXIgPSAoanBlZ19zYXZlZF9tYXJrZXJfcHRyKQorCSgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgIFNJWkVPRihzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0KSArIGxpbWl0KTsKKyAgICAgIGN1cl9tYXJrZXItPm5leHQgPSBOVUxMOworICAgICAgY3VyX21hcmtlci0+bWFya2VyID0gKFVJTlQ4KSBjaW5mby0+dW5yZWFkX21hcmtlcjsKKyAgICAgIGN1cl9tYXJrZXItPm9yaWdpbmFsX2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKKyAgICAgIGN1cl9tYXJrZXItPmRhdGFfbGVuZ3RoID0gbGltaXQ7CisgICAgICAvKiBkYXRhIGFyZWEgaXMganVzdCBiZXlvbmQgdGhlIGpwZWdfbWFya2VyX3N0cnVjdCAqLworICAgICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGEgPSAoSk9DVEVUIEZBUiAqKSAoY3VyX21hcmtlciArIDEpOworICAgICAgbWFya2VyLT5jdXJfbWFya2VyID0gY3VyX21hcmtlcjsKKyAgICAgIG1hcmtlci0+Ynl0ZXNfcmVhZCA9IDA7CisgICAgICBieXRlc19yZWFkID0gMDsKKyAgICAgIGRhdGFfbGVuZ3RoID0gbGltaXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGRlYWwgd2l0aCBib2d1cyBsZW5ndGggd29yZCAqLworICAgICAgYnl0ZXNfcmVhZCA9IGRhdGFfbGVuZ3RoID0gMDsKKyAgICAgIGRhdGEgPSBOVUxMOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiByZXN1bWUgcmVhZGluZyBhIG1hcmtlciAqLworICAgIGJ5dGVzX3JlYWQgPSBtYXJrZXItPmJ5dGVzX3JlYWQ7CisgICAgZGF0YV9sZW5ndGggPSBjdXJfbWFya2VyLT5kYXRhX2xlbmd0aDsKKyAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YSArIGJ5dGVzX3JlYWQ7CisgIH0KKworICB3aGlsZSAoYnl0ZXNfcmVhZCA8IGRhdGFfbGVuZ3RoKSB7CisgICAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBtb3ZlIHRoZSByZXN0YXJ0IHBvaW50IHRvIGhlcmUgKi8KKyAgICBtYXJrZXItPmJ5dGVzX3JlYWQgPSBieXRlc19yZWFkOworICAgIC8qIElmIHRoZXJlJ3Mgbm90IGF0IGxlYXN0IG9uZSBieXRlIGluIGJ1ZmZlciwgc3VzcGVuZCAqLworICAgIE1BS0VfQllURV9BVkFJTChjaW5mbywgcmV0dXJuIEZBTFNFKTsKKyAgICAvKiBDb3B5IGJ5dGVzIHdpdGggcmVhc29uYWJsZSByYXBpZGl0eSAqLworICAgIHdoaWxlIChieXRlc19yZWFkIDwgZGF0YV9sZW5ndGggJiYgYnl0ZXNfaW5fYnVmZmVyID4gMCkgeworICAgICAgKmRhdGErKyA9ICpuZXh0X2lucHV0X2J5dGUrKzsKKyAgICAgIGJ5dGVzX2luX2J1ZmZlci0tOworICAgICAgYnl0ZXNfcmVhZCsrOworICAgIH0KKyAgfQorCisgIC8qIERvbmUgcmVhZGluZyB3aGF0IHdlIHdhbnQgdG8gcmVhZCAqLworICBpZiAoY3VyX21hcmtlciAhPSBOVUxMKSB7CS8qIHdpbGwgYmUgTlVMTCBpZiBib2d1cyBsZW5ndGggd29yZCAqLworICAgIC8qIEFkZCBuZXcgbWFya2VyIHRvIGVuZCBvZiBsaXN0ICovCisgICAgaWYgKGNpbmZvLT5tYXJrZXJfbGlzdCA9PSBOVUxMKSB7CisgICAgICBjaW5mby0+bWFya2VyX2xpc3QgPSBjdXJfbWFya2VyOworICAgIH0gZWxzZSB7CisgICAgICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgcHJldiA9IGNpbmZvLT5tYXJrZXJfbGlzdDsKKyAgICAgIHdoaWxlIChwcmV2LT5uZXh0ICE9IE5VTEwpCisJcHJldiA9IHByZXYtPm5leHQ7CisgICAgICBwcmV2LT5uZXh0ID0gY3VyX21hcmtlcjsKKyAgICB9CisgICAgLyogUmVzZXQgcG9pbnRlciAmIGNhbGMgcmVtYWluaW5nIGRhdGEgbGVuZ3RoICovCisgICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGE7CisgICAgbGVuZ3RoID0gY3VyX21hcmtlci0+b3JpZ2luYWxfbGVuZ3RoIC0gZGF0YV9sZW5ndGg7CisgIH0KKyAgLyogUmVzZXQgdG8gaW5pdGlhbCBzdGF0ZSBmb3IgbmV4dCBtYXJrZXIgKi8KKyAgbWFya2VyLT5jdXJfbWFya2VyID0gTlVMTDsKKworICAvKiBQcm9jZXNzIHRoZSBtYXJrZXIgaWYgaW50ZXJlc3Rpbmc7IGVsc2UganVzdCBtYWtlIGEgZ2VuZXJpYyB0cmFjZSBtc2cgKi8KKyAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgeworICBjYXNlIE1fQVBQMDoKKyAgICBleGFtaW5lX2FwcDAoY2luZm8sIGRhdGEsIGRhdGFfbGVuZ3RoLCBsZW5ndGgpOworICAgIGJyZWFrOworICBjYXNlIE1fQVBQMTQ6CisgICAgZXhhbWluZV9hcHAxNChjaW5mbywgZGF0YSwgZGF0YV9sZW5ndGgsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfTUlTQ19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyLAorCSAgICAgKGludCkgKGRhdGFfbGVuZ3RoICsgbGVuZ3RoKSk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBza2lwIGFueSByZW1haW5pbmcgZGF0YSAtLSBjb3VsZCBiZSBsb3RzICovCisgIElOUFVUX1NZTkMoY2luZm8pOwkJLyogZG8gYmVmb3JlIHNraXBfaW5wdXRfZGF0YSAqLworICBpZiAobGVuZ3RoID4gMCkKKyAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIFNBVkVfTUFSS0VSU19TVVBQT1JURUQgKi8KKworCitNRVRIT0RERUYoYm9vbGVhbikKK3NraXBfdmFyaWFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBTa2lwIG92ZXIgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisgIAorICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19NSVNDX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIsIChpbnQpIGxlbmd0aCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBkbyBiZWZvcmUgc2tpcF9pbnB1dF9kYXRhICovCisgIGlmIChsZW5ndGggPiAwKQorICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyLCBzYXZlIGl0IGluIGNpbmZvLT51bnJlYWRfbWFya2VyLgorICogUmV0dXJucyBGQUxTRSBpZiBoYWQgdG8gc3VzcGVuZCBiZWZvcmUgcmVhY2hpbmcgYSBtYXJrZXI7CisgKiBpbiB0aGF0IGNhc2UgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMgdW5jaGFuZ2VkLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgcmVzdWx0IG1pZ2h0IG5vdCBiZSBhIHZhbGlkIG1hcmtlciBjb2RlLAorICogYnV0IGl0IHdpbGwgbmV2ZXIgYmUgMCBvciBGRi4KKyAqLworCitMT0NBTChib29sZWFuKQorbmV4dF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBjOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBmb3IgKDs7KSB7CisgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICAvKiBTa2lwIGFueSBub24tRkYgYnl0ZXMuCisgICAgICogVGhpcyBtYXkgbG9vayBhIGJpdCBpbmVmZmljaWVudCwgYnV0IGl0IHdpbGwgbm90IG9jY3VyIGluIGEgdmFsaWQgZmlsZS4KKyAgICAgKiBXZSBzeW5jIGFmdGVyIGVhY2ggZGlzY2FyZGVkIGJ5dGUgc28gdGhhdCBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UKKyAgICAgKiBjYW4gZGlzY2FyZCB0aGUgYnl0ZSBmcm9tIGl0cyBidWZmZXIuCisgICAgICovCisgICAgd2hpbGUgKGMgIT0gMHhGRikgeworICAgICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzKys7CisgICAgICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgfQorICAgIC8qIFRoaXMgbG9vcCBzd2FsbG93cyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzIGFyZSBsZWdhbCBhcworICAgICAqIHBhZCBieXRlcywgc28gZG9uJ3QgY291bnQgdGhlbSBpbiBkaXNjYXJkZWRfYnl0ZXMuICBXZSBhc3N1bWUgdGhlcmUKKyAgICAgKiB3aWxsIG5vdCBiZSBzbyBtYW55IGNvbnNlY3V0aXZlIEZGIGJ5dGVzIGFzIHRvIG92ZXJmbG93IGEgc3VzcGVuZGluZworICAgICAqIGRhdGEgc291cmNlJ3MgaW5wdXQgYnVmZmVyLgorICAgICAqLworICAgIGRvIHsKKyAgICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgfSB3aGlsZSAoYyA9PSAweEZGKTsKKyAgICBpZiAoYyAhPSAwKQorICAgICAgYnJlYWs7CQkJLyogZm91bmQgYSB2YWxpZCBtYXJrZXIsIGV4aXQgbG9vcCAqLworICAgIC8qIFJlYWNoIGhlcmUgaWYgd2UgZm91bmQgYSBzdHVmZmVkLXplcm8gZGF0YSBzZXF1ZW5jZSAoRkYvMDApLgorICAgICAqIERpc2NhcmQgaXQgYW5kIGxvb3AgYmFjayB0byB0cnkgYWdhaW4uCisgICAgICovCisgICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IDI7CisgICAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIH0KKworICBpZiAoY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICE9IDApIHsKKyAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0VYVFJBTkVPVVNfREFUQSwgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzLCBjKTsKKyAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgPSAwOworICB9CisKKyAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZmlyc3RfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogTGlrZSBuZXh0X21hcmtlciwgYnV0IHVzZWQgdG8gb2J0YWluIHRoZSBpbml0aWFsIFNPSSBtYXJrZXIuICovCisvKiBGb3IgdGhpcyBtYXJrZXIsIHdlIGRvIG5vdCBhbGxvdyBwcmVjZWRpbmcgZ2FyYmFnZSBvciBmaWxsOyBvdGhlcndpc2UsCisgKiB3ZSBtaWdodCB3ZWxsIHNjYW4gYW4gZW50aXJlIGlucHV0IGZpbGUgYmVmb3JlIHJlYWxpemluZyBpdCBhaW4ndCBKUEVHLgorICogSWYgYW4gYXBwbGljYXRpb24gd2FudHMgdG8gcHJvY2VzcyBub24tSkZJRiBmaWxlcywgaXQgbXVzdCBzZWVrIHRvIHRoZQorICogU09JIGJlZm9yZSBjYWxsaW5nIHRoZSBKUEVHIGxpYnJhcnkuCisgKi8KK3sKKyAgaW50IGMsIGMyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICBJTlBVVF9CWVRFKGNpbmZvLCBjMiwgcmV0dXJuIEZBTFNFKTsKKyAgaWYgKGMgIT0gMHhGRiB8fCBjMiAhPSAoaW50KSBNX1NPSSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9OT19TT0ksIGMsIGMyKTsKKworICBjaW5mby0+dW5yZWFkX21hcmtlciA9IGMyOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUmVhZCBtYXJrZXJzIHVudGlsIFNPUyBvciBFT0kuCisgKgorICogUmV0dXJucyBzYW1lIGNvZGVzIGFzIGFyZSBkZWZpbmVkIGZvciBqcGVnX2NvbnN1bWVfaW5wdXQ6CisgKiBKUEVHX1NVU1BFTkRFRCwgSlBFR19SRUFDSEVEX1NPUywgb3IgSlBFR19SRUFDSEVEX0VPSS4KKyAqLworCitNRVRIT0RERUYoaW50KQorcmVhZF9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBPdXRlciBsb29wIHJlcGVhdHMgb25jZSBmb3IgZWFjaCBtYXJrZXIuICovCisgIGZvciAoOzspIHsKKyAgICAvKiBDb2xsZWN0IHRoZSBtYXJrZXIgcHJvcGVyLCB1bmxlc3Mgd2UgYWxyZWFkeSBkaWQuICovCisgICAgLyogTkI6IGZpcnN0X21hcmtlcigpIGVuZm9yY2VzIHRoZSByZXF1aXJlbWVudCB0aGF0IFNPSSBhcHBlYXIgZmlyc3QuICovCisgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKKyAgICAgIGlmICghIGNpbmZvLT5tYXJrZXItPnNhd19TT0kpIHsKKwlpZiAoISBmaXJzdF9tYXJrZXIoY2luZm8pKQorCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfSBlbHNlIHsKKwlpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCisJICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlzdCBtYXJrZXIgYWZ0ZXIgU09GLgorICAgICAqLworICAgIGlmIChjaW5mby0+bWFya2VyLT5jdXJyZW50X3Nvc19tYXJrZXJfcG9zaXRpb24gPT0gLTEpCisgICAgICBjaW5mby0+bWFya2VyLT5jdXJyZW50X3Nvc19tYXJrZXJfcG9zaXRpb24gPQorICAgICAgICAgIGpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvKSAtIDI7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IGNpbmZvLT51bnJlYWRfbWFya2VyIGNvbnRhaW5zIHRoZSBtYXJrZXIgY29kZSBhbmQgdGhlCisgICAgICogaW5wdXQgcG9pbnQgaXMganVzdCBwYXN0IHRoZSBtYXJrZXIgcHJvcGVyLCBidXQgYmVmb3JlIGFueSBwYXJhbWV0ZXJzLgorICAgICAqIEEgc3VzcGVuc2lvbiB3aWxsIGNhdXNlIHVzIHRvIHJldHVybiB3aXRoIHRoaXMgc3RhdGUgc3RpbGwgdHJ1ZS4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7CisgICAgY2FzZSBNX1NPSToKKyAgICAgIGlmICghIGdldF9zb2koY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPRjA6CQkvKiBCYXNlbGluZSAqLworICAgIGNhc2UgTV9TT0YxOgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgSHVmZm1hbiAqLworICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgRkFMU0UsIEZBTFNFKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT0YyOgkJLyogUHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICAgIGNpbmZvLT5tYXJrZXItPmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbiA9IC0xOworICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgVFJVRSwgRkFMU0UpKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBGQUxTRSwgVFJVRSkpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09GMTA6CQkvKiBQcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgVFJVRSwgVFJVRSkpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICAvKiBDdXJyZW50bHkgdW5zdXBwb3J0ZWQgU09GbiB0eXBlcyAqLworICAgIGNhc2UgTV9TT0YzOgkJLyogTG9zc2xlc3MsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNToJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjY6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNzoJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9KUEc6CQkJLyogUmVzZXJ2ZWQgZm9yIEpQRUcgZXh0ZW5zaW9ucyAqLworICAgIGNhc2UgTV9TT0YxMToJCS8qIExvc3NsZXNzLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjEzOgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTQ6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTU6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1NPRl9VTlNVUFBPUlRFRCwgY2luZm8tPnVucmVhZF9tYXJrZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09TOgorICAgICAgaWYgKCEgZ2V0X3NvcyhjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkvKiBwcm9jZXNzZWQgdGhlIG1hcmtlciAqLworICAgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9TT1M7CisgICAgCisgICAgY2FzZSBNX0VPSToKKyAgICAgIFRSQUNFTVMoY2luZm8sIDEsIEpUUkNfRU9JKTsKKyAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJLyogcHJvY2Vzc2VkIHRoZSBtYXJrZXIgKi8KKyAgICAgIHJldHVybiBKUEVHX1JFQUNIRURfRU9JOworICAgICAgCisgICAgY2FzZSBNX0RBQzoKKyAgICAgIGlmICghIGdldF9kYWMoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0RIVDoKKyAgICAgIGlmICghIGdldF9kaHQoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0RRVDoKKyAgICAgIGlmICghIGdldF9kcXQoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0RSSToKKyAgICAgIGlmICghIGdldF9kcmkoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0FQUDA6CisgICAgY2FzZSBNX0FQUDE6CisgICAgY2FzZSBNX0FQUDI6CisgICAgY2FzZSBNX0FQUDM6CisgICAgY2FzZSBNX0FQUDQ6CisgICAgY2FzZSBNX0FQUDU6CisgICAgY2FzZSBNX0FQUDY6CisgICAgY2FzZSBNX0FQUDc6CisgICAgY2FzZSBNX0FQUDg6CisgICAgY2FzZSBNX0FQUDk6CisgICAgY2FzZSBNX0FQUDEwOgorICAgIGNhc2UgTV9BUFAxMToKKyAgICBjYXNlIE1fQVBQMTI6CisgICAgY2FzZSBNX0FQUDEzOgorICAgIGNhc2UgTV9BUFAxNDoKKyAgICBjYXNlIE1fQVBQMTU6CisgICAgICBpZiAoISAoKigobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlciktPnByb2Nlc3NfQVBQblsKKwkJY2luZm8tPnVucmVhZF9tYXJrZXIgLSAoaW50KSBNX0FQUDBdKSAoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0NPTToKKyAgICAgIGlmICghICgqKChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyKS0+cHJvY2Vzc19DT00pIChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fUlNUMDoJCS8qIHRoZXNlIGFyZSBhbGwgcGFyYW1ldGVybGVzcyAqLworICAgIGNhc2UgTV9SU1QxOgorICAgIGNhc2UgTV9SU1QyOgorICAgIGNhc2UgTV9SU1QzOgorICAgIGNhc2UgTV9SU1Q0OgorICAgIGNhc2UgTV9SU1Q1OgorICAgIGNhc2UgTV9SU1Q2OgorICAgIGNhc2UgTV9SU1Q3OgorICAgIGNhc2UgTV9URU06CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19QQVJNTEVTU19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0ROTDoJCQkvKiBJZ25vcmUgRE5MIC4uLiBwZXJoYXBzIHRoZSB3cm9uZyB0aGluZyAqLworICAgICAgaWYgKCEgc2tpcF92YXJpYWJsZShjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgkJCS8qIG11c3QgYmUgREhQLCBFWFAsIEpQR24sIG9yIFJFU24gKi8KKyAgICAgIC8qIEZvciBub3csIHdlIHRyZWF0IHRoZSByZXNlcnZlZCBtYXJrZXJzIGFzIGZhdGFsIGVycm9ycyBzaW5jZSB0aGV5IGFyZQorICAgICAgICogbGlrZWx5IHRvIGJlIHVzZWQgdG8gc2lnbmFsIGluY29tcGF0aWJsZSBKUEVHIFBhcnQgMyBleHRlbnNpb25zLgorICAgICAgICogT25jZSB0aGUgSlBFRyAzIHZlcnNpb24tbnVtYmVyIG1hcmtlciBpcyB3ZWxsIGRlZmluZWQsIHRoaXMgY29kZQorICAgICAgICogb3VnaHQgdG8gY2hhbmdlIQorICAgICAgICovCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIFN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgbWFya2VyLCBzbyByZXNldCBzdGF0ZSB2YXJpYWJsZSAqLworICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKKyAgfSAvKiBlbmQgbG9vcCAqLworfQorCisKKy8qCisgKiBSZWFkIGEgcmVzdGFydCBtYXJrZXIsIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGFwcGVhciBuZXh0IGluIHRoZSBkYXRhc3RyZWFtOworICogaWYgdGhlIG1hcmtlciBpcyBub3QgdGhlcmUsIHRha2UgYXBwcm9wcmlhdGUgcmVjb3ZlcnkgYWN0aW9uLgorICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5zaW9uIGlzIHJlcXVpcmVkLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBlbnRyb3B5IGRlY29kZXIgYWZ0ZXIgaXQgaGFzIHJlYWQgYW4gYXBwcm9wcmlhdGUKKyAqIG51bWJlciBvZiBNQ1VzLiAgY2luZm8tPnVucmVhZF9tYXJrZXIgbWF5IGJlIG5vbnplcm8gaWYgdGhlIGVudHJvcHkgZGVjb2RlcgorICogaGFzIGFscmVhZHkgcmVhZCBhIG1hcmtlciBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gIFVuZGVyIG5vcm1hbCBjb25kaXRpb25zCisgKiBjaW5mby0+dW5yZWFkX21hcmtlciB3aWxsIGJlIHJlc2V0IHRvIDAgYmVmb3JlIHJldHVybmluZzsgaWYgbm90IHJlc2V0LAorICogaXQgaG9sZHMgYSBtYXJrZXIgd2hpY2ggdGhlIGRlY29kZXIgd2lsbCBiZSB1bmFibGUgdG8gcmVhZCBwYXN0LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorcmVhZF9yZXN0YXJ0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogT2J0YWluIGEgbWFya2VyIHVubGVzcyB3ZSBhbHJlYWR5IGRpZC4gKi8KKyAgLyogTm90ZSB0aGF0IG5leHRfbWFya2VyIHdpbGwgY29tcGxhaW4gaWYgaXQgc2tpcHMgYW55IGRhdGEuICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7CisgICAgaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09CisgICAgICAoKGludCkgTV9SU1QwICsgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSkpIHsKKyAgICAvKiBOb3JtYWwgY2FzZSAtLS0gc3dhbGxvdyB0aGUgbWFya2VyIGFuZCBsZXQgZW50cm9weSBkZWNvZGVyIGNvbnRpbnVlICovCisgICAgVFJBQ0VNUzEoY2luZm8sIDMsIEpUUkNfUlNULCBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKTsKKyAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogVWgtb2gsIHRoZSByZXN0YXJ0IG1hcmtlcnMgaGF2ZSBiZWVuIG1lc3NlZCB1cC4gKi8KKyAgICAvKiBMZXQgdGhlIGRhdGEgc291cmNlIG1hbmFnZXIgZGV0ZXJtaW5lIGhvdyB0byByZXN5bmMuICovCisgICAgaWYgKCEgKCpjaW5mby0+c3JjLT5yZXN5bmNfdG9fcmVzdGFydCkgKGNpbmZvLAorCQkJCQkgICAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBVcGRhdGUgbmV4dC1yZXN0YXJ0IHN0YXRlICovCisgIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gPSAoY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSArIDEpICYgNzsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCByZXN5bmNfdG9fcmVzdGFydCBtZXRob2QgZm9yIGRhdGEgc291cmNlIG1hbmFnZXJzCisgKiB0byB1c2UgaWYgdGhleSBkb24ndCBoYXZlIGFueSBiZXR0ZXIgYXBwcm9hY2guICBTb21lIGRhdGEgc291cmNlIG1hbmFnZXJzCisgKiBtYXkgYmUgYWJsZSB0byBiYWNrIHVwLCBvciBtYXkgaGF2ZSBhZGRpdGlvbmFsIGtub3dsZWRnZSBhYm91dCB0aGUgZGF0YQorICogd2hpY2ggcGVybWl0cyBhIG1vcmUgaW50ZWxsaWdlbnQgcmVjb3Zlcnkgc3RyYXRlZ3k7IHN1Y2ggbWFuYWdlcnMgd291bGQKKyAqIHByZXN1bWFibHkgc3VwcGx5IHRoZWlyIG93biByZXN5bmMgbWV0aG9kLgorICoKKyAqIHJlYWRfcmVzdGFydF9tYXJrZXIgY2FsbHMgcmVzeW5jX3RvX3Jlc3RhcnQgaWYgaXQgZmluZHMgYSBtYXJrZXIgb3RoZXIgdGhhbgorICogdGhlIHJlc3RhcnQgbWFya2VyIGl0IHdhcyBleHBlY3RpbmcuICAoVGhpcyBjb2RlIGlzICpub3QqIHVzZWQgdW5sZXNzCisgKiBhIG5vbnplcm8gcmVzdGFydCBpbnRlcnZhbCBoYXMgYmVlbiBkZWNsYXJlZC4pICBjaW5mby0+dW5yZWFkX21hcmtlciBpcworICogdGhlIG1hcmtlciBjb2RlIGFjdHVhbGx5IGZvdW5kIChtaWdodCBiZSBhbnl0aGluZywgZXhjZXB0IDAgb3IgRkYpLgorICogVGhlIGRlc2lyZWQgcmVzdGFydCBtYXJrZXIgbnVtYmVyICgwLi43KSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuCisgKiBUaGlzIHJvdXRpbmUgaXMgc3VwcG9zZWQgdG8gYXBwbHkgd2hhdGV2ZXIgZXJyb3IgcmVjb3Zlcnkgc3RyYXRlZ3kgc2VlbXMKKyAqIGFwcHJvcHJpYXRlIGluIG9yZGVyIHRvIHBvc2l0aW9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG5leHQgZGF0YSBzZWdtZW50LgorICogTm90ZSB0aGF0IGNpbmZvLT51bnJlYWRfbWFya2VyIGlzIHRyZWF0ZWQgYXMgYSBtYXJrZXIgYXBwZWFyaW5nIGJlZm9yZQorICogdGhlIGN1cnJlbnQgZGF0YS1zb3VyY2UgaW5wdXQgcG9pbnQ7IHVzdWFsbHkgaXQgc2hvdWxkIGJlIHJlc2V0IHRvIHplcm8KKyAqIGJlZm9yZSByZXR1cm5pbmcuCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbnNpb24gaXMgcmVxdWlyZWQuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzdWJzdGFudGlhbGx5IGNvbnN0cmFpbmVkIGJ5IHdhbnRpbmcgdG8gdHJlYXQgdGhlCisgKiBpbnB1dCBhcyBhIGRhdGEgc3RyZWFtOyB0aGlzIG1lYW5zIHdlIGNhbid0IGJhY2sgdXAuICBUaGVyZWZvcmUsIHdlIGhhdmUKKyAqIG9ubHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zIHRvIHdvcmsgd2l0aDoKKyAqICAgMS4gU2ltcGx5IGRpc2NhcmQgdGhlIG1hcmtlciBhbmQgbGV0IHRoZSBlbnRyb3B5IGRlY29kZXIgcmVzdW1lIGF0IG5leHQKKyAqICAgICAgYnl0ZSBvZiBmaWxlLgorICogICAyLiBSZWFkIGZvcndhcmQgdW50aWwgd2UgZmluZCBhbm90aGVyIG1hcmtlciwgZGlzY2FyZGluZyBpbnRlcnZlbmluZworICogICAgICBkYXRhLiAgKEluIHRoZW9yeSB3ZSBjb3VsZCBsb29rIGFoZWFkIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXJsb2FkLAorICogICAgICB3aXRob3V0IGhhdmluZyB0byBkaXNjYXJkIGRhdGEgaWYgd2UgZG9uJ3QgZmluZCB0aGUgZGVzaXJlZCBtYXJrZXIuCisgKiAgICAgIFRoaXMgaWRlYSBpcyBub3QgaW1wbGVtZW50ZWQgaGVyZSwgaW4gcGFydCBiZWNhdXNlIGl0IG1ha2VzIGJlaGF2aW9yCisgKiAgICAgIGRlcGVuZGVudCBvbiBidWZmZXIgc2l6ZSBhbmQgY2hhbmNlIGJ1ZmZlci1ib3VuZGFyeSBwb3NpdGlvbnMuKQorICogICAzLiBMZWF2ZSB0aGUgbWFya2VyIHVucmVhZCAoYnkgZmFpbGluZyB0byB6ZXJvIGNpbmZvLT51bnJlYWRfbWFya2VyKS4KKyAqICAgICAgVGhpcyB3aWxsIGNhdXNlIHRoZSBlbnRyb3B5IGRlY29kZXIgdG8gcHJvY2VzcyBhbiBlbXB0eSBkYXRhIHNlZ21lbnQsCisgKiAgICAgIGluc2VydGluZyBkdW1teSB6ZXJvZXMsIGFuZCB0aGVuIHdlIHdpbGwgcmVwcm9jZXNzIHRoZSBtYXJrZXIuCisgKgorICogIzIgaXMgYXBwcm9wcmlhdGUgaWYgd2UgdGhpbmsgdGhlIGRlc2lyZWQgbWFya2VyIGxpZXMgYWhlYWQsIHdoaWxlICMzIGlzCisgKiBhcHByb3ByaWF0ZSBpZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgZnV0dXJlIHJlc3RhcnQgbWFya2VyIChpbmRpY2F0aW5nCisgKiB0aGF0IHdlIGhhdmUgbWlzc2VkIHRoZSBkZXNpcmVkIHJlc3RhcnQgbWFya2VyLCBwcm9iYWJseSBiZWNhdXNlIGl0IGdvdAorICogY29ycnVwdGVkKS4KKyAqIFdlIGFwcGx5ICMyIG9yICMzIGlmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSByZXN0YXJ0IG1hcmtlciBubyBtb3JlIHRoYW4KKyAqIHR3byBjb3VudHMgYmVoaW5kIG9yIGFoZWFkIG9mIHRoZSBleHBlY3RlZCBvbmUuICBXZSBhbHNvIGFwcGx5ICMyIGlmIHRoZQorICogZm91bmQgbWFya2VyIGlzIG5vdCBhIGxlZ2FsIEpQRUcgbWFya2VyIGNvZGUgKGl0J3MgY2VydGFpbmx5IGJvZ3VzIGRhdGEpLgorICogSWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIHJlc3RhcnQgbWFya2VyIG1vcmUgdGhhbiAyIGNvdW50cyBhd2F5LCB3ZSBkbyAjMQorICogKHRvbyBtdWNoIHJpc2sgdGhhdCB0aGUgbWFya2VyIGlzIGVycm9uZW91czsgd2l0aCBsdWNrIHdlIHdpbGwgYmUgYWJsZSB0bworICogcmVzeW5jIGF0IHNvbWUgZnV0dXJlIHBvaW50KS4KKyAqIEZvciBhbnkgdmFsaWQgbm9uLXJlc3RhcnQgSlBFRyBtYXJrZXIsIHdlIGFwcGx5ICMzLiAgVGhpcyBrZWVwcyB1cyBmcm9tCisgKiBvdmVycnVubmluZyB0aGUgZW5kIG9mIGEgc2Nhbi4gIEFuIGltcGxlbWVudGF0aW9uIGxpbWl0ZWQgdG8gc2luZ2xlLXNjYW4KKyAqIGZpbGVzIG1pZ2h0IGZpbmQgaXQgYmV0dGVyIHRvIGFwcGx5ICMyIGZvciBtYXJrZXJzIG90aGVyIHRoYW4gRU9JLCBzaW5jZQorICogYW55IG90aGVyIG1hcmtlciB3b3VsZCBoYXZlIHRvIGJlIGJvZ3VzIGRhdGEgaW4gdGhhdCBjYXNlLgorICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19yZXN5bmNfdG9fcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpCit7CisgIGludCBtYXJrZXIgPSBjaW5mby0+dW5yZWFkX21hcmtlcjsKKyAgaW50IGFjdGlvbiA9IDE7CisgIAorICAvKiBBbHdheXMgcHV0IHVwIGEgd2FybmluZy4gKi8KKyAgV0FSTk1TMihjaW5mbywgSldSTl9NVVNUX1JFU1lOQywgbWFya2VyLCBkZXNpcmVkKTsKKyAgCisgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyByZXBlYXRlZCBkZWNpc2lvbiBhZnRlciBzY2FubmluZyBmb3J3YXJkLiAqLworICBmb3IgKDs7KSB7CisgICAgaWYgKG1hcmtlciA8IChpbnQpIE1fU09GMCkKKyAgICAgIGFjdGlvbiA9IDI7CQkvKiBpbnZhbGlkIG1hcmtlciAqLworICAgIGVsc2UgaWYgKG1hcmtlciA8IChpbnQpIE1fUlNUMCB8fCBtYXJrZXIgPiAoaW50KSBNX1JTVDcpCisgICAgICBhY3Rpb24gPSAzOwkJLyogdmFsaWQgbm9uLXJlc3RhcnQgbWFya2VyICovCisgICAgZWxzZSB7CisgICAgICBpZiAobWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQrMSkgJiA3KSkgfHwKKwkgIG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkKzIpICYgNykpKQorCWFjdGlvbiA9IDM7CQkvKiBvbmUgb2YgdGhlIG5leHQgdHdvIGV4cGVjdGVkIHJlc3RhcnRzICovCisgICAgICBlbHNlIGlmIChtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZC0xKSAmIDcpKSB8fAorCSAgICAgICBtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZC0yKSAmIDcpKSkKKwlhY3Rpb24gPSAyOwkJLyogYSBwcmlvciByZXN0YXJ0LCBzbyBhZHZhbmNlICovCisgICAgICBlbHNlCisJYWN0aW9uID0gMTsJCS8qIGRlc2lyZWQgcmVzdGFydCBvciB0b28gZmFyIGF3YXkgKi8KKyAgICB9CisgICAgVFJBQ0VNUzIoY2luZm8sIDQsIEpUUkNfUkVDT1ZFUllfQUNUSU9OLCBtYXJrZXIsIGFjdGlvbik7CisgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICBjYXNlIDE6CisgICAgICAvKiBEaXNjYXJkIG1hcmtlciBhbmQgbGV0IGVudHJvcHkgZGVjb2RlciByZXN1bWUgcHJvY2Vzc2luZy4gKi8KKyAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgMjoKKyAgICAgIC8qIFNjYW4gdG8gdGhlIG5leHQgbWFya2VyLCBhbmQgcmVwZWF0IHRoZSBkZWNpc2lvbiBsb29wLiAqLworICAgICAgaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgICAgIG1hcmtlciA9IGNpbmZvLT51bnJlYWRfbWFya2VyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgLyogUmV0dXJuIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgdGhpcyBtYXJrZXIuICovCisgICAgICAvKiBFbnRyb3B5IGRlY29kZXIgd2lsbCBiZSBmb3JjZWQgdG8gcHJvY2VzcyBhbiBlbXB0eSBzZWdtZW50LiAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IC8qIGVuZCBsb29wICovCit9CisKKy8qCisgKiBHZXQgdGhlIHBvc2l0aW9uIGZvciBhbGwgU09TIG1hcmtlcnMgaW4gdGhlIGltYWdlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZ2V0X3Nvc19tYXJrZXJfcG9zaXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgpCit7CisgIHVuc2lnbmVkIGNoYXIgKmhlYWQ7CisgIGludCBjb3VudCA9IDA7CisgIGludCByZXRjb2RlID0gSlBFR19SRUFDSEVEX1NPUzsKKworICB3aGlsZSAoY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID4gMCkgeworICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpIHsKKyAgICAgIGpwZWdfY29uZmlndXJlX2h1ZmZtYW5faW5kZXhfc2NhbihjaW5mbywgaW5kZXgsIGNvdW50KyssCisgICAgICAgICAgICAgIGNpbmZvLT5tYXJrZXItPmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbik7CisgICAgICAvLyBTa2lwcyBzY2FuIGNvbnRlbnQgdG8gdGhlIG5leHQgbm9uLVJTVCBKUEVHIG1hcmtlci4KKyAgICAgIHdoaWxlKG5leHRfbWFya2VyKGNpbmZvKSAmJgorICAgICAgICAgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA+PSBNX1JTVDAgJiYgY2luZm8tPnVucmVhZF9tYXJrZXIgPD0gTV9SU1Q3KQorICAgICAgICAgIDsKKyAgICAgIGNpbmZvLT5tYXJrZXItPmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbiA9CisgICAgICAgIGpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvKSAtIDI7CisgICAgICByZXRjb2RlID0gcmVhZF9tYXJrZXJzKGNpbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8qCisgKiBSZXNldCBtYXJrZXIgcHJvY2Vzc2luZyBzdGF0ZSB0byBiZWdpbiBhIGZyZXNoIGRhdGFzdHJlYW0uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZXNldF9tYXJrZXJfcmVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworCisgIGNpbmZvLT5jb21wX2luZm8gPSBOVUxMOwkJLyogdW50aWwgYWxsb2NhdGVkIGJ5IGdldF9zb2YgKi8KKyAgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID0gMDsJCS8qIG5vIFNPUyBzZWVuIHlldCAqLworICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CQkvKiBubyBwZW5kaW5nIG1hcmtlciAqLworICBtYXJrZXItPnB1Yi5zYXdfU09JID0gRkFMU0U7CQkvKiBzZXQgaW50ZXJuYWwgc3RhdGUgdG9vICovCisgIG1hcmtlci0+cHViLnNhd19TT0YgPSBGQUxTRTsKKyAgbWFya2VyLT5wdWIuZGlzY2FyZGVkX2J5dGVzID0gMDsKKyAgbWFya2VyLT5jdXJfbWFya2VyID0gTlVMTDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHJlYWRlciBtb2R1bGUuCisgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9tYXJrZXJfcmVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlcjsKKyAgaW50IGk7CisKKyAgLyogQ3JlYXRlIHN1Ym9iamVjdCBpbiBwZXJtYW5lbnQgcG9vbCAqLworICBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQlTSVpFT0YobXlfbWFya2VyX3JlYWRlcikpOworICBjaW5mby0+bWFya2VyID0gKHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgKikgbWFya2VyOworICAvKiBJbml0aWFsaXplIHB1YmxpYyBtZXRob2QgcG9pbnRlcnMgKi8KKyAgbWFya2VyLT5wdWIucmVzZXRfbWFya2VyX3JlYWRlciA9IHJlc2V0X21hcmtlcl9yZWFkZXI7CisgIG1hcmtlci0+cHViLnJlYWRfbWFya2VycyA9IHJlYWRfbWFya2VyczsKKyAgbWFya2VyLT5wdWIucmVhZF9yZXN0YXJ0X21hcmtlciA9IHJlYWRfcmVzdGFydF9tYXJrZXI7CisgIG1hcmtlci0+cHViLmdldF9zb3NfbWFya2VyX3Bvc2l0aW9uID0gZ2V0X3Nvc19tYXJrZXJfcG9zaXRpb247CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgU09TIG1hcmtlciBwb3NpdGlvbiB0byBhdm9pZCB1bmRlcmRlZmluZWQgYmVoYXZpb3IgZHVlIHRvCisgIC8vIHVzaW5nIGEgdW5kZWZpbmVkIGZpZWxkLgorICBtYXJrZXItPnB1Yi5jdXJyZW50X3Nvc19tYXJrZXJfcG9zaXRpb24gPSAwOworCisgIC8qIEluaXRpYWxpemUgQ09NL0FQUG4gcHJvY2Vzc2luZy4KKyAgICogQnkgZGVmYXVsdCwgd2UgZXhhbWluZSBhbmQgdGhlbiBkaXNjYXJkIEFQUDAgYW5kIEFQUDE0LAorICAgKiBidXQgc2ltcGx5IGRpc2NhcmQgQ09NIGFuZCBhbGwgb3RoZXIgQVBQbi4KKyAgICovCisgIG1hcmtlci0+cHJvY2Vzc19DT00gPSBza2lwX3ZhcmlhYmxlOworICBtYXJrZXItPmxlbmd0aF9saW1pdF9DT00gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW2ldID0gc2tpcF92YXJpYWJsZTsKKyAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW2ldID0gMDsKKyAgfQorICBtYXJrZXItPnByb2Nlc3NfQVBQblswXSA9IGdldF9pbnRlcmVzdGluZ19hcHBuOworICBtYXJrZXItPnByb2Nlc3NfQVBQblsxNF0gPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKKyAgLyogUmVzZXQgbWFya2VyIHByb2Nlc3Npbmcgc3RhdGUgKi8KKyAgcmVzZXRfbWFya2VyX3JlYWRlcihjaW5mbyk7Cit9CisKKworLyoKKyAqIENvbnRyb2wgc2F2aW5nIG9mIENPTSBhbmQgQVBQbiBtYXJrZXJzIGludG8gbWFya2VyX2xpc3QuCisgKi8KKworI2lmZGVmIFNBVkVfTUFSS0VSU19TVVBQT1JURUQKKworR0xPQkFMKHZvaWQpCitqcGVnX3NhdmVfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAorCQkgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0KQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworICBsb25nIG1heGxlbmd0aDsKKyAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzb3I7CisKKyAgLyogTGVuZ3RoIGxpbWl0IG11c3RuJ3QgYmUgbGFyZ2VyIHRoYW4gd2hhdCB3ZSBjYW4gYWxsb2NhdGUKKyAgICogKHNob3VsZCBvbmx5IGJlIGEgY29uY2VybiBpbiBhIDE2LWJpdCBlbnZpcm9ubWVudCkuCisgICAqLworICBtYXhsZW5ndGggPSBjaW5mby0+bWVtLT5tYXhfYWxsb2NfY2h1bmsgLSBTSVpFT0Yoc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCk7CisgIGlmICgoKGxvbmcpIGxlbmd0aF9saW1pdCkgPiBtYXhsZW5ndGgpCisgICAgbGVuZ3RoX2xpbWl0ID0gKHVuc2lnbmVkIGludCkgbWF4bGVuZ3RoOworCisgIC8qIENob29zZSBwcm9jZXNzb3Igcm91dGluZSB0byB1c2UuCisgICAqIEFQUDAvQVBQMTQgaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cy4KKyAgICovCisgIGlmIChsZW5ndGhfbGltaXQpIHsKKyAgICBwcm9jZXNzb3IgPSBzYXZlX21hcmtlcjsKKyAgICAvKiBJZiBzYXZpbmcgQVBQMC9BUFAxNCwgc2F2ZSBhdCBsZWFzdCBlbm91Z2ggZm9yIG91ciBpbnRlcm5hbCB1c2UuICovCisgICAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMCAmJiBsZW5ndGhfbGltaXQgPCBBUFAwX0RBVEFfTEVOKQorICAgICAgbGVuZ3RoX2xpbWl0ID0gQVBQMF9EQVRBX0xFTjsKKyAgICBlbHNlIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDE0ICYmIGxlbmd0aF9saW1pdCA8IEFQUDE0X0RBVEFfTEVOKQorICAgICAgbGVuZ3RoX2xpbWl0ID0gQVBQMTRfREFUQV9MRU47CisgIH0gZWxzZSB7CisgICAgcHJvY2Vzc29yID0gc2tpcF92YXJpYWJsZTsKKyAgICAvKiBJZiBkaXNjYXJkaW5nIEFQUDAvQVBQMTQsIHVzZSBvdXIgcmVndWxhciBvbi10aGUtZmx5IHByb2Nlc3Nvci4gKi8KKyAgICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAwIHx8IG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMTQpCisgICAgICBwcm9jZXNzb3IgPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKKyAgfQorCisgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0NPTSkgeworICAgIG1hcmtlci0+cHJvY2Vzc19DT00gPSBwcm9jZXNzb3I7CisgICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NID0gbGVuZ3RoX2xpbWl0OworICB9IGVsc2UgaWYgKG1hcmtlcl9jb2RlID49IChpbnQpIE1fQVBQMCAmJiBtYXJrZXJfY29kZSA8PSAoaW50KSBNX0FQUDE1KSB7CisgICAgbWFya2VyLT5wcm9jZXNzX0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gcHJvY2Vzc29yOworICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gbGVuZ3RoX2xpbWl0OworICB9IGVsc2UKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgbWFya2VyX2NvZGUpOworfQorCisjZW5kaWYgLyogU0FWRV9NQVJLRVJTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbnN0YWxsIGEgc3BlY2lhbCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgQ09NIG9yIEFQUG4gbWFya2Vycy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKKwkJCSAgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2Qgcm91dGluZSkKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKworICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9DT00pCisgICAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHJvdXRpbmU7CisgIGVsc2UgaWYgKG1hcmtlcl9jb2RlID49IChpbnQpIE1fQVBQMCAmJiBtYXJrZXJfY29kZSA8PSAoaW50KSBNX0FQUDE1KQorICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW21hcmtlcl9jb2RlIC0gKGludCkgTV9BUFAwXSA9IHJvdXRpbmU7CisgIGVsc2UKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgbWFya2VyX2NvZGUpOworfQpkaWZmIC0tZ2l0IGEvanBlZy9qZG1hc3Rlci5jIGIvanBlZy9qZG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZGE3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pkbWFzdGVyLmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBqZG1hc3Rlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQKKyAqIGFuZCB3aXRoIGRldGVybWluaW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFuZCB0aGUgd29yayB0byBiZSBkb25lIGluIGVhY2gKKyAqIHBhc3MuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLworCisgIGJvb2xlYW4gdXNpbmdfbWVyZ2VkX3Vwc2FtcGxlOyAvKiBUUlVFIGlmIHVzaW5nIG1lcmdlZCB1cHNhbXBsZS9jY29udmVydCAqLworCisgIC8qIFNhdmVkIHJlZmVyZW5jZXMgdG8gaW5pdGlhbGl6ZWQgcXVhbnRpemVyIG1vZHVsZXMsCisgICAqIGluIGNhc2Ugd2UgbmVlZCB0byBzd2l0Y2ggbW9kZXMuCisgICAqLworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBxdWFudGl6ZXJfMXBhc3M7CisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8ycGFzczsKK30gbXlfZGVjb21wX21hc3RlcjsKKwordHlwZWRlZiBteV9kZWNvbXBfbWFzdGVyICogbXlfbWFzdGVyX3B0cjsKKworCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgbWVyZ2VkIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gc2hvdWxkIGJlIHVzZWQuCisgKiBDUlVDSUFMOiB0aGlzIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMgb2YgamRtZXJnZS5jIQorICovCisKK0xPQ0FMKGJvb2xlYW4pCit1c2VfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECisgIC8qIE1lcmdpbmcgaXMgdGhlIGVxdWl2YWxlbnQgb2YgcGxhaW4gYm94LWZpbHRlciB1cHNhbXBsaW5nICovCisgIGlmIChjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyB8fCBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBBTkRST0lEX1JHQgorICAvKiBqZG1lcmdlLmMgb25seSBzdXBwb3J0cyBZQ0M9PlJHQjU2NSBhbmQgWUNDPT5SR0IgY29sb3IgY29udmVyc2lvbiAqLworICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gSkNTX1lDYkNyIHx8IAorICAgICAgY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMgfHwKKyAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAhPSAzIHx8CisgICAgICAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCXzU2NSAmJiAKKyAgICAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNlbHNlCisgIC8qIGpkbWVyZ2UuYyBvbmx5IHN1cHBvcnRzIFlDQz0+UkdCIGNvbG9yIGNvbnZlcnNpb24gKi8KKyAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMyB8fAorICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCIHx8CisgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKKyAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKworICAvKiBhbmQgaXQgb25seSBoYW5kbGVzIDJoMXYgb3IgMmgydiBzYW1wbGluZyByYXRpb3MgKi8KKyAgaWYgKGNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciAhPSAyIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgIT0gMSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA+ICAyIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgIT0gMSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yICE9IDEpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiBmdXJ0aGVybW9yZSwgaXQgZG9lc24ndCB3b3JrIGlmIHdlJ3ZlIHNjYWxlZCB0aGUgSURDVHMgZGlmZmVyZW50bHkgKi8KKyAgaWYgKGNpbmZvLT5jb21wX2luZm9bMF0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1syXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiA/Pz8gYWxzbyBuZWVkIHRvIHRlc3QgZm9yIHVwc2FtcGxlLXRpbWUgcmVzY2FsaW5nLCB3aGVuICYgaWYgc3VwcG9ydGVkICovCisgIHJldHVybiBUUlVFOwkJCS8qIGJ5IGdvbGx5LCBpdCdsbCB3b3JrLi4uICovCisjZWxzZQorICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworCisvKgorICogQ29tcHV0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgcmVsYXRlZCB2YWx1ZXMuCisgKiBOT1RFOiB0aGlzIGlzIGV4cG9ydGVkIGZvciBwb3NzaWJsZSB1c2UgYnkgYXBwbGljYXRpb24uCisgKiBIZW5jZSBpdCBtdXN0bid0IGRvIGFueXRoaW5nIHRoYXQgY2FuJ3QgYmUgZG9uZSB0d2ljZS4KKyAqIEFsc28gbm90ZSB0aGF0IGl0IG1heSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBtYXN0ZXIgbW9kdWxlIGlzIGluaXRpYWxpemVkIQorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgbWFzdGVyIHNlbGVjdGlvbiBwaGFzZSAqLworeworI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworI2VuZGlmCisKKyAgLyogUHJldmVudCBhcHBsaWNhdGlvbiBmcm9tIGNhbGxpbmcgbWUgYXQgd3JvbmcgdGltZXMgKi8KKyNpZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgIC8vIFRpbGUgYmFzZWQgZGVjb2RpbmcgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzLgorICBpZiAoIWNpbmZvLT50aWxlX2RlY29kZSkKKyNlbmRpZgorICAgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SRUFEWSkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisKKyAgLyogQ29tcHV0ZSBhY3R1YWwgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYW5kIERDVCBzY2FsaW5nIGNob2ljZXMuICovCisgIGlmIChjaW5mby0+c2NhbGVfbnVtICogOCA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKKyAgICAvKiBQcm92aWRlIDEvOCBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA4TCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDhMKTsKKyAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDE7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDQgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CisgICAgLyogUHJvdmlkZSAxLzQgc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgNEwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCA0TCk7CisgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSAyOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiAyIDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgeworICAgIC8qIFByb3ZpZGUgMS8yIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDJMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgMkwpOworICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gNDsKKyAgfSBlbHNlIHsKKyAgICAvKiBQcm92aWRlIDEvMSBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICB9CisgIC8qIEluIHNlbGVjdGluZyB0aGUgYWN0dWFsIERDVCBzY2FsaW5nIGZvciBlYWNoIGNvbXBvbmVudCwgd2UgdHJ5IHRvCisgICAqIHNjYWxlIHVwIHRoZSBjaHJvbWEgY29tcG9uZW50cyB2aWEgSURDVCBzY2FsaW5nIHJhdGhlciB0aGFuIHVwc2FtcGxpbmcuCisgICAqIFRoaXMgc2F2ZXMgdGltZSBpZiB0aGUgdXBzYW1wbGVyIGdldHMgdG8gdXNlIDE6MSBzY2FsaW5nLgorICAgKiBOb3RlIHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHN1cHBvcnRlZCBEQ1Qgc2NhbGluZ3MgYXJlIHBvd2VycyBvZiAyLgorICAgKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBpbnQgc3NpemUgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICB3aGlsZSAoc3NpemUgPCBEQ1RTSVpFICYmCisJICAgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIgPD0KKwkgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpICYmCisJICAgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIgPD0KKwkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpKSB7CisgICAgICBzc2l6ZSA9IHNzaXplICogMjsKKyAgICB9CisgICAgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID0gc3NpemU7CisgIH0KKworICAvKiBSZWNvbXB1dGUgZG93bnNhbXBsZWQgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzOworICAgKiBhcHBsaWNhdGlvbiBuZWVkcyB0byBrbm93IHRoZXNlIGlmIHVzaW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLgorICAgKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBTaXplIGluIHNhbXBsZXMsIGFmdGVyIElEQ1Qgc2NhbGluZyAqLworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKgorCQkgICAgKGxvbmcpIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqCisJCSAgICAobG9uZykgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgIH0KKworI2Vsc2UgLyogIUlEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KKworICAvKiBIYXJkd2lyZSBpdCB0byAibm8gc2NhbGluZyIgKi8KKyAgY2luZm8tPm91dHB1dF93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKyAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAvKiBqZGlucHV0LmMgaGFzIGFscmVhZHkgaW5pdGlhbGl6ZWQgRENUX3NjYWxlZF9zaXplIHRvIERDVFNJWkUsCisgICAqIGFuZCBoYXMgY29tcHV0ZWQgdW5zY2FsZWQgZG93bnNhbXBsZWRfd2lkdGggYW5kIGRvd25zYW1wbGVkX2hlaWdodC4KKyAgICovCisKKyNlbmRpZiAvKiBJRENUX1NDQUxJTkdfU1VQUE9SVEVEICovCisKKyAgLyogUmVwb3J0IG51bWJlciBvZiBjb21wb25lbnRzIGluIHNlbGVjdGVkIGNvbG9yc3BhY2UuICovCisgIC8qIFByb2JhYmx5IHRoaXMgc2hvdWxkIGJlIGluIHRoZSBjb2xvciBjb252ZXJzaW9uIG1vZHVsZS4uLiAqLworICBzd2l0Y2ggKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDE7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1JHQjoKKyNpZiBSR0JfUElYRUxTSVpFICE9IDMKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOworICAgIGJyZWFrOworI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgY2FzZSBKQ1NfUkdCXzU2NToKKyNlbmRpZgorICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSAzOworICAgIGJyZWFrOworICBjYXNlIEpDU19DTVlLOgorICBjYXNlIEpDU19ZQ0NLOgorI2lmZGVmIEFORFJPSURfUkdCCisgIGNhc2UgSkNTX1JHQkFfODg4ODoKKyNlbmRpZgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CQkJLyogZWxzZSBtdXN0IGJlIHNhbWUgY29sb3JzcGFjZSBhcyBpbiBmaWxlICovCisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIGJyZWFrOworICB9CisgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IChjaW5mby0+cXVhbnRpemVfY29sb3JzID8gMSA6CisJCQkgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOworCisgIC8qIFNlZSBpZiB1cHNhbXBsZXIgd2lsbCB3YW50IHRvIGVtaXQgbW9yZSB0aGFuIG9uZSByb3cgYXQgYSB0aW1lICovCisgIGlmICh1c2VfbWVyZ2VkX3Vwc2FtcGxlKGNpbmZvKSkKKyAgICBjaW5mby0+cmVjX291dGJ1Zl9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisgIGVsc2UKKyAgICBjaW5mby0+cmVjX291dGJ1Zl9oZWlnaHQgPSAxOworfQorCisKKy8qCisgKiBTZXZlcmFsIGRlY29tcHJlc3Npb24gcHJvY2Vzc2VzIG5lZWQgdG8gcmFuZ2UtbGltaXQgdmFsdWVzIHRvIHRoZSByYW5nZQorICogMC4uTUFYSlNBTVBMRTsgdGhlIGlucHV0IHZhbHVlIG1heSBmYWxsIHNvbWV3aGF0IG91dHNpZGUgdGhpcyByYW5nZQorICogZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgcXVhbnRpemF0aW9uLCByb3VuZG9mZiBlcnJvciwgZXRjLiAgVGhlc2UKKyAqIHByb2Nlc3NlcyBhcmUgaW5uZXIgbG9vcHMgYW5kIG5lZWQgdG8gYmUgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIE9uIG1vc3QKKyAqIG1hY2hpbmVzLCBwYXJ0aWN1bGFybHkgQ1BVcyB3aXRoIHBpcGVsaW5lcyBvciBpbnN0cnVjdGlvbiBwcmVmZXRjaCwKKyAqIGEgKHN1YnNjcmlwdC1jaGVjay1sZXNzKSBDIHRhYmxlIGxvb2t1cAorICoJCXggPSBzYW1wbGVfcmFuZ2VfbGltaXRbeF07CisgKiBpcyBmYXN0ZXIgdGhhbiBleHBsaWNpdCB0ZXN0cworICoJCWlmICh4IDwgMCkgIHggPSAwOworICoJCWVsc2UgaWYgKHggPiBNQVhKU0FNUExFKSAgeCA9IE1BWEpTQU1QTEU7CisgKiBUaGVzZSBwcm9jZXNzZXMgYWxsIHVzZSBhIGNvbW1vbiB0YWJsZSBwcmVwYXJlZCBieSB0aGUgcm91dGluZSBiZWxvdy4KKyAqCisgKiBGb3IgbW9zdCBzdGVwcyB3ZSBjYW4gbWF0aGVtYXRpY2FsbHkgZ3VhcmFudGVlIHRoYXQgdGhlIGluaXRpYWwgdmFsdWUKKyAqIG9mIHggaXMgd2l0aGluIE1BWEpTQU1QTEUrMSBvZiB0aGUgbGVnYWwgcmFuZ2UsIHNvIGEgdGFibGUgcnVubmluZyBmcm9tCisgKiAtKE1BWEpTQU1QTEUrMSkgdG8gMipNQVhKU0FNUExFKzEgaXMgc3VmZmljaWVudC4gIEJ1dCBmb3IgdGhlIGluaXRpYWwKKyAqIGxpbWl0aW5nIHN0ZXAgKGp1c3QgYWZ0ZXIgdGhlIElEQ1QpLCBhIHdpbGRseSBvdXQtb2YtcmFuZ2UgdmFsdWUgaXMKKyAqIHBvc3NpYmxlIGlmIHRoZSBpbnB1dCBkYXRhIGlzIGNvcnJ1cHQuICBUbyBhdm9pZCBhbnkgY2hhbmNlIG9mIGluZGV4aW5nCisgKiBvZmYgdGhlIGVuZCBvZiBtZW1vcnkgYW5kIGdldHRpbmcgYSBiYWQtcG9pbnRlciB0cmFwLCB3ZSBwZXJmb3JtIHRoZQorICogcG9zdC1JRENUIGxpbWl0aW5nIHRodXM6CisgKgkJeCA9IHJhbmdlX2xpbWl0W3ggJiBNQVNLXTsKKyAqIHdoZXJlIE1BU0sgaXMgMiBiaXRzIHdpZGVyIHRoYW4gbGVnYWwgc2FtcGxlIGRhdGEsIGllIDEwIGJpdHMgZm9yIDgtYml0CisgKiBzYW1wbGVzLiAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgdGhpcyBpcyBtb3JlIHRoYW4gZW5vdWdoIHJhbmdlIGFuZAorICogYSBjb3JyZWN0IG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZDsgd2l0aCBib2d1cyBpbnB1dCBkYXRhIHRoZSBtYXNrIHdpbGwKKyAqIGNhdXNlIHdyYXBhcm91bmQsIGFuZCB3ZSB3aWxsIHNhZmVseSBnZW5lcmF0ZSBhIGJvZ3VzLWJ1dC1pbi1yYW5nZSBvdXRwdXQuCisgKiBGb3IgdGhlIHBvc3QtSURDVCBzdGVwLCB3ZSB3YW50IHRvIGNvbnZlcnQgdGhlIGRhdGEgZnJvbSBzaWduZWQgdG8gdW5zaWduZWQKKyAqIHJlcHJlc2VudGF0aW9uIGJ5IGFkZGluZyBDRU5URVJKU0FNUExFIGF0IHRoZSBzYW1lIHRpbWUgdGhhdCB3ZSBsaW1pdCBpdC4KKyAqIFNvIHRoZSBwb3N0LUlEQ1QgbGltaXRpbmcgdGFibGUgZW5kcyB1cCBsb29raW5nIGxpa2UgdGhpczoKKyAqICAgQ0VOVEVSSlNBTVBMRSxDRU5URVJKU0FNUExFKzEsLi4uLE1BWEpTQU1QTEUsCisgKiAgIE1BWEpTQU1QTEUgKHJlcGVhdCAyKihNQVhKU0FNUExFKzEpLUNFTlRFUkpTQU1QTEUgdGltZXMpLAorICogICAwICAgICAgICAgIChyZXBlYXQgMiooTUFYSlNBTVBMRSsxKS1DRU5URVJKU0FNUExFIHRpbWVzKSwKKyAqICAgMCwxLC4uLixDRU5URVJKU0FNUExFLTEKKyAqIE5lZ2F0aXZlIGlucHV0cyBzZWxlY3QgdmFsdWVzIGZyb20gdGhlIHVwcGVyIGhhbGYgb2YgdGhlIHRhYmxlIGFmdGVyCisgKiBtYXNraW5nLgorICoKKyAqIFdlIGNhbiBzYXZlIHNvbWUgc3BhY2UgYnkgb3ZlcmxhcHBpbmcgdGhlIHN0YXJ0IG9mIHRoZSBwb3N0LUlEQ1QgdGFibGUKKyAqIHdpdGggdGhlIHNpbXBsZXIgcmFuZ2UgbGltaXRpbmcgdGFibGUuICBUaGUgcG9zdC1JRENUIHRhYmxlIGJlZ2lucyBhdAorICogc2FtcGxlX3JhbmdlX2xpbWl0ICsgQ0VOVEVSSlNBTVBMRS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHRhYmxlIGlzIGFsbG9jYXRlZCBpbiBuZWFyIGRhdGEgc3BhY2Ugb24gUENzOyBpdCdzIHNtYWxsCisgKiBlbm91Z2ggYW5kIHVzZWQgb2Z0ZW4gZW5vdWdoIHRvIGp1c3RpZnkgdGhpcy4KKyAqLworCitMT0NBTCh2b2lkKQorcHJlcGFyZV9yYW5nZV9saW1pdF90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIEFsbG9jYXRlIGFuZCBmaWxsIGluIHRoZSBzYW1wbGVfcmFuZ2VfbGltaXQgdGFibGUgKi8KK3sKKyAgSlNBTVBMRSAqIHRhYmxlOworICBpbnQgaTsKKworICB0YWJsZSA9IChKU0FNUExFICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJKDUgKiAoTUFYSlNBTVBMRSsxKSArIENFTlRFUkpTQU1QTEUpICogU0laRU9GKEpTQU1QTEUpKTsKKyAgdGFibGUgKz0gKE1BWEpTQU1QTEUrMSk7CS8qIGFsbG93IG5lZ2F0aXZlIHN1YnNjcmlwdHMgb2Ygc2ltcGxlIHRhYmxlICovCisgIGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQgPSB0YWJsZTsKKyAgLyogRmlyc3Qgc2VnbWVudCBvZiAic2ltcGxlIiB0YWJsZTogbGltaXRbeF0gPSAwIGZvciB4IDwgMCAqLworICBNRU1aRVJPKHRhYmxlIC0gKE1BWEpTQU1QTEUrMSksIChNQVhKU0FNUExFKzEpICogU0laRU9GKEpTQU1QTEUpKTsKKyAgLyogTWFpbiBwYXJ0IG9mICJzaW1wbGUiIHRhYmxlOiBsaW1pdFt4XSA9IHggKi8KKyAgZm9yIChpID0gMDsgaSA8PSBNQVhKU0FNUExFOyBpKyspCisgICAgdGFibGVbaV0gPSAoSlNBTVBMRSkgaTsKKyAgdGFibGUgKz0gQ0VOVEVSSlNBTVBMRTsJLyogUG9pbnQgdG8gd2hlcmUgcG9zdC1JRENUIHRhYmxlIHN0YXJ0cyAqLworICAvKiBFbmQgb2Ygc2ltcGxlIHRhYmxlLCByZXN0IG9mIGZpcnN0IGhhbGYgb2YgcG9zdC1JRENUIHRhYmxlICovCisgIGZvciAoaSA9IENFTlRFUkpTQU1QTEU7IGkgPCAyKihNQVhKU0FNUExFKzEpOyBpKyspCisgICAgdGFibGVbaV0gPSBNQVhKU0FNUExFOworICAvKiBTZWNvbmQgaGFsZiBvZiBwb3N0LUlEQ1QgdGFibGUgKi8KKyAgTUVNWkVSTyh0YWJsZSArICgyICogKE1BWEpTQU1QTEUrMSkpLAorCSAgKDIgKiAoTUFYSlNBTVBMRSsxKSAtIENFTlRFUkpTQU1QTEUpICogU0laRU9GKEpTQU1QTEUpKTsKKyAgTUVNQ09QWSh0YWJsZSArICg0ICogKE1BWEpTQU1QTEUrMSkgLSBDRU5URVJKU0FNUExFKSwKKwkgIGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQsIENFTlRFUkpTQU1QTEUgKiBTSVpFT0YoSlNBTVBMRSkpOworfQorCisKKy8qCisgKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGRlY29tcHJlc3Npb24gbW9kdWxlcy4KKyAqIFRoaXMgaXMgZG9uZSBvbmNlIGF0IGpwZWdfc3RhcnRfZGVjb21wcmVzcyB0aW1lLiAgV2UgZGV0ZXJtaW5lCisgKiB3aGljaCBtb2R1bGVzIHdpbGwgYmUgdXNlZCBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uIGNhbGxzLgorICogV2UgYWxzbyBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzb3IgaW5wdXQgc2lkZSB0byBiZWdpbiBjb25zdW1pbmcgZGF0YS4KKyAqCisgKiBTaW5jZSBqcGVnX3JlYWRfaGVhZGVyIGhhcyBmaW5pc2hlZCwgd2Uga25vdyB3aGF0IGlzIGluIHRoZSBTT0YKKyAqIGFuZCAoZmlyc3QpIFNPUyBtYXJrZXJzLiAgV2UgYWxzbyBoYXZlIGFsbCB0aGUgYXBwbGljYXRpb24gcGFyYW1ldGVyCisgKiBzZXR0aW5ncy4KKyAqLworCitMT0NBTCh2b2lkKQorbWFzdGVyX3NlbGVjdGlvbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKyAgYm9vbGVhbiB1c2VfY19idWZmZXI7CisgIGxvbmcgc2FtcGxlc3BlcnJvdzsKKyAgSkRJTUVOU0lPTiBqZF9zYW1wbGVzcGVycm93OworCisgIC8qIEluaXRpYWxpemUgZGltZW5zaW9ucyBhbmQgb3RoZXIgc3R1ZmYgKi8KKyAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKKyAgcHJlcGFyZV9yYW5nZV9saW1pdF90YWJsZShjaW5mbyk7CisKKyAgLyogV2lkdGggb2YgYW4gb3V0cHV0IHNjYW5saW5lIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBKRElNRU5TSU9OLiAqLworICBzYW1wbGVzcGVycm93ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfd2lkdGggKiAobG9uZykgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOworICBqZF9zYW1wbGVzcGVycm93ID0gKEpESU1FTlNJT04pIHNhbXBsZXNwZXJyb3c7CisgIGlmICgobG9uZykgamRfc2FtcGxlc3BlcnJvdyAhPSBzYW1wbGVzcGVycm93KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOworCisgIC8qIEluaXRpYWxpemUgbXkgcHJpdmF0ZSBzdGF0ZSAqLworICBtYXN0ZXItPnBhc3NfbnVtYmVyID0gMDsKKyAgbWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUgPSB1c2VfbWVyZ2VkX3Vwc2FtcGxlKGNpbmZvKTsKKworICAvKiBDb2xvciBxdWFudGl6ZXIgc2VsZWN0aW9uICovCisgIG1hc3Rlci0+cXVhbnRpemVyXzFwYXNzID0gTlVMTDsKKyAgbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3MgPSBOVUxMOworICAvKiBObyBtb2RlIGNoYW5nZXMgaWYgbm90IHVzaW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICovCisgIGlmICghIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgfHwgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gRkFMU0U7CisgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IEZBTFNFOworICAgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKKyAgfQorICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgIGlmIChjaW5mby0+cmF3X2RhdGFfb3V0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKKyAgICAvKiAyLXBhc3MgcXVhbnRpemVyIG9ubHkgd29ya3MgaW4gMy1jb21wb25lbnQgY29sb3Igc3BhY2UuICovCisgICAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAhPSAzKSB7CisgICAgICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gVFJVRTsKKyAgICAgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKKyAgICAgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKKyAgICAgIGNpbmZvLT5jb2xvcm1hcCA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChjaW5mby0+Y29sb3JtYXAgIT0gTlVMTCkgeworICAgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IFRSVUU7CisgICAgfSBlbHNlIGlmIChjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUpIHsKKyAgICAgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCkgeworI2lmZGVmIFFVQU5UXzFQQVNTX1NVUFBPUlRFRAorICAgICAgamluaXRfMXBhc3NfcXVhbnRpemVyKGNpbmZvKTsKKyAgICAgIG1hc3Rlci0+cXVhbnRpemVyXzFwYXNzID0gY2luZm8tPmNxdWFudGl6ZTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBXZSB1c2UgdGhlIDItcGFzcyBjb2RlIHRvIG1hcCB0byBleHRlcm5hbCBjb2xvcm1hcHMuICovCisgICAgaWYgKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgfHwgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCkgeworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICAgICAgamluaXRfMnBhc3NfcXVhbnRpemVyKGNpbmZvKTsKKyAgICAgIG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzID0gY2luZm8tPmNxdWFudGl6ZTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9CisgICAgLyogSWYgYm90aCBxdWFudGl6ZXJzIGFyZSBpbml0aWFsaXplZCwgdGhlIDItcGFzcyBvbmUgaXMgbGVmdCBhY3RpdmU7CisgICAgICogdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHN0YXJ0aW5nIHdpdGggcXVhbnRpemF0aW9uIHRvIGFuIGV4dGVybmFsIG1hcC4KKyAgICAgKi8KKyAgfQorCisgIC8qIFBvc3QtcHJvY2Vzc2luZzogaW4gcGFydGljdWxhciwgY29sb3IgY29udmVyc2lvbiBmaXJzdCAqLworICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KSB7CisgICAgaWYgKG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlKSB7CisjaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKKyAgICAgIGppbml0X21lcmdlZF91cHNhbXBsZXIoY2luZm8pOyAvKiBkb2VzIGNvbG9yIGNvbnZlcnNpb24gdG9vICovCisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIGppbml0X2NvbG9yX2RlY29udmVydGVyKGNpbmZvKTsKKyAgICAgIGppbml0X3Vwc2FtcGxlcihjaW5mbyk7CisgICAgfQorICAgIGppbml0X2RfcG9zdF9jb250cm9sbGVyKGNpbmZvLCBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50KTsKKyAgfQorICAvKiBJbnZlcnNlIERDVCAqLworICBqaW5pdF9pbnZlcnNlX2RjdChjaW5mbyk7CisgIC8qIEVudHJvcHkgZGVjb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgICBqaW5pdF9waHVmZl9kZWNvZGVyKGNpbmZvKTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgIGppbml0X2h1ZmZfZGVjb2RlcihjaW5mbyk7CisgIH0KKworICAvKiBJbml0aWFsaXplIHByaW5jaXBhbCBidWZmZXIgY29udHJvbGxlcnMuICovCisgIHVzZV9jX2J1ZmZlciA9IGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zIHx8IGNpbmZvLT5idWZmZXJlZF9pbWFnZTsKKyAgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIHVzZV9jX2J1ZmZlcik7CisKKyAgaWYgKCEgY2luZm8tPnJhd19kYXRhX291dCkKKyAgICBqaW5pdF9kX21haW5fY29udHJvbGxlcihjaW5mbywgRkFMU0UgLyogbmV2ZXIgbmVlZCBmdWxsIGJ1ZmZlciBoZXJlICovKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogSW5pdGlhbGl6ZSBpbnB1dCBzaWRlIG9mIGRlY29tcHJlc3NvciB0byBjb25zdW1lIGZpcnN0IHNjYW4uICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5zdGFydF9pbnB1dF9wYXNzKSAoY2luZm8pOworCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgIC8qIElmIGpwZWdfc3RhcnRfZGVjb21wcmVzcyB3aWxsIHJlYWQgdGhlIHdob2xlIGZpbGUsIGluaXRpYWxpemUKKyAgICogcHJvZ3Jlc3MgbW9uaXRvcmluZyBhcHByb3ByaWF0ZWx5LiAgVGhlIGlucHV0IHN0ZXAgaXMgY291bnRlZAorICAgKiBhcyBvbmUgcGFzcy4KKyAgICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJiAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSAmJgorICAgICAgY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMpIHsKKyAgICBpbnQgbnNjYW5zOworICAgIC8qIEVzdGltYXRlIG51bWJlciBvZiBzY2FucyB0byBzZXQgcGFzc19saW1pdC4gKi8KKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyAgICAgIC8qIEFyYml0cmFyaWx5IGVzdGltYXRlIDIgaW50ZXJsZWF2ZWQgREMgc2NhbnMgKyAzIEFDIHNjYW5zL2NvbXBvbmVudC4gKi8KKyAgICAgIG5zY2FucyA9IDIgKyAzICogY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIH0gZWxzZSB7CisgICAgICAvKiBGb3IgYSBub25wcm9ncmVzc2l2ZSBtdWx0aXNjYW4gZmlsZSwgZXN0aW1hdGUgMSBzY2FuIHBlciBjb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgfQorICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gMEw7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBuc2NhbnM7CisgICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gMDsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID8gMyA6IDIpOworICAgIC8qIENvdW50IHRoZSBpbnB1dCBwYXNzIGFzIGRvbmUgKi8KKyAgICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7CisgIH0KKyNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KK30KKworCisvKgorICogUGVyLXBhc3Mgc2V0dXAuCisgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggb3V0cHV0IHBhc3MuICBXZSBkZXRlcm1pbmUgd2hpY2gKKyAqIG1vZHVsZXMgd2lsbCBiZSBhY3RpdmUgZHVyaW5nIHRoaXMgcGFzcyBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlCisgKiBzdGFydF9wYXNzIGNhbGxzLiAgV2UgYWxzbyBzZXQgaXNfZHVtbXlfcGFzcyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMKKyAqIGlzIGEgInJlYWwiIG91dHB1dCBwYXNzIG9yIGEgZHVtbXkgcGFzcyBmb3IgY29sb3IgcXVhbnRpemF0aW9uLgorICogKEluIHRoZSBsYXR0ZXIgY2FzZSwgamRhcGlzdGQuYyB3aWxsIGNyYW5rIHRoZSBwYXNzIHRvIGNvbXBsZXRpb24uKQorICovCisKK01FVEhPRERFRih2b2lkKQorcHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgaWYgKG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MpIHsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgICAvKiBGaW5hbCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KKyAgICBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gRkFMU0U7CisgICAgKCpjaW5mby0+Y3F1YW50aXplLT5zdGFydF9wYXNzKSAoY2luZm8sIEZBTFNFKTsKKyAgICAoKmNpbmZvLT5wb3N0LT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7CisgICAgKCpjaW5mby0+bWFpbi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgJiYgY2luZm8tPmNvbG9ybWFwID09IE5VTEwpIHsKKyAgICAgIC8qIFNlbGVjdCBuZXcgcXVhbnRpemF0aW9uIG1ldGhvZCAqLworICAgICAgaWYgKGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSAmJiBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50KSB7CisJY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzOworCW1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBUUlVFOworICAgICAgfSBlbHNlIGlmIChjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50KSB7CisJY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzFwYXNzOworICAgICAgfSBlbHNlIHsKKwlFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKKyAgICAgIH0KKyAgICB9CisgICAgKCpjaW5mby0+aWRjdC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KSB7CisgICAgICBpZiAoISBtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSkKKwkoKmNpbmZvLT5jY29udmVydC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAgICgqY2luZm8tPnVwc2FtcGxlLT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisJKCpjaW5mby0+Y3F1YW50aXplLT5zdGFydF9wYXNzKSAoY2luZm8sIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MpOworICAgICAgKCpjaW5mby0+cG9zdC0+c3RhcnRfcGFzcykgKGNpbmZvLAorCSAgICAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA/IEpCVUZfU0FWRV9BTkRfUEFTUyA6IEpCVUZfUEFTU19USFJVKSk7CisgICAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKKyAgICB9CisgIH0KKworICAvKiBTZXQgdXAgcHJvZ3Jlc3MgbW9uaXRvcidzIHBhc3MgaW5mbyBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXI7CisgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSBtYXN0ZXItPnBhc3NfbnVtYmVyICsKKwkJCQkgICAgKG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPyAyIDogMSk7CisgICAgLyogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgd2UgYXNzdW1lIG9uZSBtb3JlIG91dHB1dCBwYXNzIGlmIEVPSSBub3QKKyAgICAgKiB5ZXQgcmVhY2hlZCwgYnV0IG5vIG1vcmUgcGFzc2VzIGlmIEVPSSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqLworICAgIGlmIChjaW5mby0+YnVmZmVyZWRfaW1hZ2UgJiYgISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7CisgICAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyArPSAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA/IDIgOiAxKTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IGVuZCBvZiBhbiBvdXRwdXQgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPmZpbmlzaF9wYXNzKSAoY2luZm8pOworICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7Cit9CisKKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorCisvKgorICogU3dpdGNoIHRvIGEgbmV3IGV4dGVybmFsIGNvbG9ybWFwIGJldHdlZW4gb3V0cHV0IHBhc3Nlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfbmV3X2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIC8qIFByZXZlbnQgYXBwbGljYXRpb24gZnJvbSBjYWxsaW5nIG1lIGF0IHdyb25nIHRpbWVzICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzICYmIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgJiYKKyAgICAgIGNpbmZvLT5jb2xvcm1hcCAhPSBOVUxMKSB7CisgICAgLyogU2VsZWN0IDItcGFzcyBxdWFudGl6ZXIgZm9yIGV4dGVybmFsIGNvbG9ybWFwIHVzZSAqLworICAgIGNpbmZvLT5jcXVhbnRpemUgPSBtYXN0ZXItPnF1YW50aXplcl8ycGFzczsKKyAgICAvKiBOb3RpZnkgcXVhbnRpemVyIG9mIGNvbG9ybWFwIGNoYW5nZSAqLworICAgICgqY2luZm8tPmNxdWFudGl6ZS0+bmV3X2NvbG9yX21hcCkgKGNpbmZvKTsKKyAgICBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gRkFMU0U7IC8qIGp1c3QgaW4gY2FzZSAqLworICB9IGVsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKK30KKworI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIG1hc3RlciBkZWNvbXByZXNzaW9uIGNvbnRyb2wgYW5kIHNlbGVjdCBhY3RpdmUgbW9kdWxlcy4KKyAqIFRoaXMgaXMgcGVyZm9ybWVkIGF0IHRoZSBzdGFydCBvZiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXI7CisKKyAgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKG15X2RlY29tcF9tYXN0ZXIpKTsKKyAgY2luZm8tPm1hc3RlciA9IChzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyICopIG1hc3RlcjsKKyAgbWFzdGVyLT5wdWIucHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MgPSBwcmVwYXJlX2Zvcl9vdXRwdXRfcGFzczsKKyAgbWFzdGVyLT5wdWIuZmluaXNoX291dHB1dF9wYXNzID0gZmluaXNoX291dHB1dF9wYXNzOworCisgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsKKworICBtYXN0ZXJfc2VsZWN0aW9uKGNpbmZvKTsKK30KZGlmZiAtLWdpdCBhL2pwZWcvamRtZXJnZS5jIGIvanBlZy9qZG1lcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMzMwOAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRtZXJnZS5jCkBAIC0wLDAgKzEsNzU3IEBACisvKgorICogamRtZXJnZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgbWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgY29tYmluZXMgZnVuY3Rpb25zIGZyb20gamRzYW1wbGUuYyBhbmQgamRjb2xvci5jOworICogcmVhZCB0aG9zZSBmaWxlcyBmaXJzdCB0byB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbi4KKyAqCisgKiBXaGVuIHRoZSBjaHJvbWEgY29tcG9uZW50cyBhcmUgdG8gYmUgdXBzYW1wbGVkIGJ5IHNpbXBsZSByZXBsaWNhdGlvbgorICogKGllLCBib3ggZmlsdGVyaW5nKSwgd2UgY2FuIHNhdmUgc29tZSB3b3JrIGluIGNvbG9yIGNvbnZlcnNpb24gYnkKKyAqIGNhbGN1bGF0aW5nIGFsbCB0aGUgb3V0cHV0IHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIGEgcGFpciBvZiBjaHJvbWEKKyAqIHNhbXBsZXMgYXQgb25lIHRpbWUuICBJbiB0aGUgY29udmVyc2lvbiBlcXVhdGlvbnMKKyAqCVIgPSBZICAgICAgICAgICArIEsxICogQ3IKKyAqCUcgPSBZICsgSzIgKiBDYiArIEszICogQ3IKKyAqCUIgPSBZICsgSzQgKiBDYgorICogb25seSB0aGUgWSB0ZXJtIHZhcmllcyBhbW9uZyB0aGUgZ3JvdXAgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gYSBwYWlyCisgKiBvZiBjaHJvbWEgc2FtcGxlcywgc28gdGhlIHJlc3Qgb2YgdGhlIHRlcm1zIGNhbiBiZSBjYWxjdWxhdGVkIGp1c3Qgb25jZS4KKyAqIEF0IHR5cGljYWwgc2FtcGxpbmcgcmF0aW9zLCB0aGlzIGVsaW1pbmF0ZXMgaGFsZiBvciB0aHJlZS1xdWFydGVycyBvZiB0aGUKKyAqIG11bHRpcGxpY2F0aW9ucyBuZWVkZWQgZm9yIGNvbG9yIGNvbnZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGN1cnJlbnRseSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisgKglZQ2JDciA9PiBSR0IgY29sb3IgY29udmVyc2lvbiBvbmx5LgorICoJU2FtcGxpbmcgcmF0aW9zIG9mIDJoMXYgb3IgMmgydi4KKyAqCU5vIHNjYWxpbmcgbmVlZGVkIGF0IHVwc2FtcGxlIHRpbWUuCisgKglDb3JuZXItYWxpZ25lZCAobm9uLUNDSVI2MDEpIHNhbXBsaW5nIGFsaWdubWVudC4KKyAqIE90aGVyIHNwZWNpYWwgY2FzZXMgY291bGQgYmUgYWRkZWQsIGJ1dCBpbiBtb3N0IGFwcGxpY2F0aW9ucyB0aGVzZSBhcmUKKyAqIHRoZSBvbmx5IGNvbW1vbiBjYXNlcy4gIChGb3IgdW5jb21tb24gY2FzZXMgd2UgZmFsbCBiYWNrIG9uIHRoZSBtb3JlCisgKiBnZW5lcmFsIGNvZGUgaW4gamRzYW1wbGUuYyBhbmQgamRjb2xvci5jLikKKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKyNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAorCisjaWZkZWYgQU5EUk9JRF9SR0IKKworLyogRGVjbGFyYXRpb25zIGZvciBvcmRlcmVkIGRpdGhlcmluZy4KKyAqIAorICogV2UgdXNlIDR4NCBvcmRlcmVkIGRpdGhlciBhcnJheSBwYWNrZWQgaW50byAzMiBiaXRzLiBUaGlzIGFycmF5IGlzCisgKiBzdWZmaWNlbnQgZm9yIGRpdGhlcmluZyBSR0JfODg4IHRvIFJHQl81NjUuCisgKi8KKworI2RlZmluZSBESVRIRVJfTUFTSyAgICAgICAgIDB4MworI2RlZmluZSBESVRIRVJfUk9UQVRFKHgpICAgICgoKHgpPDwyNCkgfCAoKCh4KT4+OCkmMHgwMEZGRkZGRikpCitzdGF0aWMgY29uc3QgSU5UMzIgZGl0aGVyX21hdHJpeFs0XSA9IHsKKyAgMHgwMDA4MDIwQSwKKyAgMHgwQzA0MEUwNiwKKyAgMHgwMzBCMDEwOSwKKyAgMHgwRjA3MEQwNQorfTsKKworI2VuZGlmCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfdXBzYW1wbGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gcm91dGluZSB0byBkbyBhY3R1YWwgdXBzYW1wbGluZy9jb252ZXJzaW9uIG9mIG9uZSByb3cgZ3JvdXAgKi8KKyAgSk1FVEhPRCh2b2lkLCB1cG1ldGhvZCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorCQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKSk7CisKKyAgLyogUHJpdmF0ZSBzdGF0ZSBmb3IgWUNDLT5SR0IgY29udmVyc2lvbiAqLworICBpbnQgKiBDcl9yX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBSIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ2JfYl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gQiBjb252ZXJzaW9uICovCisgIElOVDMyICogQ3JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gRyBjb252ZXJzaW9uICovCisgIElOVDMyICogQ2JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gRyBjb252ZXJzaW9uICovCisKKyAgLyogRm9yIDI6MSB2ZXJ0aWNhbCBzYW1wbGluZywgd2UgcHJvZHVjZSB0d28gb3V0cHV0IHJvd3MgYXQgYSB0aW1lLgorICAgKiBXZSBuZWVkIGEgInNwYXJlIiByb3cgYnVmZmVyIHRvIGhvbGQgdGhlIHNlY29uZCBvdXRwdXQgcm93IGlmIHRoZQorICAgKiBhcHBsaWNhdGlvbiBwcm92aWRlcyBqdXN0IGEgb25lLXJvdyBidWZmZXI7IHdlIGFsc28gdXNlIHRoZSBzcGFyZQorICAgKiB0byBkaXNjYXJkIHRoZSBkdW1teSBsYXN0IHJvdyBpZiB0aGUgaW1hZ2UgaGVpZ2h0IGlzIG9kZC4KKyAgICovCisgIEpTQU1QUk9XIHNwYXJlX3JvdzsKKyAgYm9vbGVhbiBzcGFyZV9mdWxsOwkJLyogVCBpZiBzcGFyZSBidWZmZXIgaXMgb2NjdXBpZWQgKi8KKworICBKRElNRU5TSU9OIG91dF9yb3dfd2lkdGg7CS8qIHNhbXBsZXMgcGVyIG91dHB1dCByb3cgKi8KKyAgSkRJTUVOU0lPTiByb3dzX3RvX2dvOwkvKiBjb3VudHMgcm93cyByZW1haW5pbmcgaW4gaW1hZ2UgKi8KK30gbXlfdXBzYW1wbGVyOworCit0eXBlZGVmIG15X3Vwc2FtcGxlciAqIG15X3Vwc2FtcGxlX3B0cjsKKworI2RlZmluZSBTQ0FMRUJJVFMJMTYJLyogc3BlZWRpZXN0IHJpZ2h0LXNoaWZ0IG9uIHNvbWUgbWFjaGluZXMgKi8KKyNkZWZpbmUgT05FX0hBTEYJKChJTlQzMikgMSA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkJCSgoSU5UMzIpICgoeCkgKiAoMUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisKKy8qCisgKiBJbml0aWFsaXplIHRhYmxlcyBmb3IgWUNDLT5SR0IgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICogVGhpcyBpcyB0YWtlbiBkaXJlY3RseSBmcm9tIGpkY29sb3IuYzsgc2VlIHRoYXQgZmlsZSBmb3IgbW9yZSBpbmZvLgorICovCisKK0xPQ0FMKHZvaWQpCitidWlsZF95Y2NfcmdiX3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIGludCBpOworICBJTlQzMiB4OworICBTSElGVF9URU1QUworCisgIHVwc2FtcGxlLT5Dcl9yX3RhYiA9IChpbnQgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOworICB1cHNhbXBsZS0+Q2JfYl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKKyAgdXBzYW1wbGUtPkNyX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOworICB1cHNhbXBsZS0+Q2JfZ190YWIgPSAoSU5UMzIgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7CisKKyAgZm9yIChpID0gMCwgeCA9IC1DRU5URVJKU0FNUExFOyBpIDw9IE1BWEpTQU1QTEU7IGkrKywgeCsrKSB7CisgICAgLyogaSBpcyB0aGUgYWN0dWFsIGlucHV0IHBpeGVsIHZhbHVlLCBpbiB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSAqLworICAgIC8qIFRoZSBDYiBvciBDciB2YWx1ZSB3ZSBhcmUgdGhpbmtpbmcgb2YgaXMgeCA9IGkgLSBDRU5URVJKU0FNUExFICovCisgICAgLyogQ3I9PlIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS40MDIwMCAqIHggKi8KKyAgICB1cHNhbXBsZS0+Q3Jfcl90YWJbaV0gPSAoaW50KQorCQkgICAgUklHSFRfU0hJRlQoRklYKDEuNDAyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOworICAgIC8qIENiPT5CIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNzcyMDAgKiB4ICovCisgICAgdXBzYW1wbGUtPkNiX2JfdGFiW2ldID0gKGludCkKKwkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjc3MjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDcj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuNzE0MTQgKiB4ICovCisgICAgdXBzYW1wbGUtPkNyX2dfdGFiW2ldID0gKC0gRklYKDAuNzE0MTQpKSAqIHg7CisgICAgLyogQ2I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjM0NDE0ICogeCAqLworICAgIC8qIFdlIGFsc28gYWRkIGluIE9ORV9IQUxGIHNvIHRoYXQgbmVlZCBub3QgZG8gaXQgaW4gaW5uZXIgbG9vcCAqLworICAgIHVwc2FtcGxlLT5DYl9nX3RhYltpXSA9ICgtIEZJWCgwLjM0NDE0KSkgKiB4ICsgT05FX0hBTEY7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gdXBzYW1wbGluZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKworICAvKiBNYXJrIHRoZSBzcGFyZSBidWZmZXIgZW1wdHkgKi8KKyAgdXBzYW1wbGUtPnNwYXJlX2Z1bGwgPSBGQUxTRTsKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICB1cHNhbXBsZS0+cm93c190b19nbyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworfQorCisKKy8qCisgKiBDb250cm9sIHJvdXRpbmUgdG8gZG8gdXBzYW1wbGluZyAoYW5kIGNvbG9yIGNvbnZlcnNpb24pLgorICoKKyAqIFRoZSBjb250cm9sIHJvdXRpbmUganVzdCBoYW5kbGVzIHRoZSByb3cgYnVmZmVyaW5nIGNvbnNpZGVyYXRpb25zLgorICovCisKK01FVEhPRERFRih2b2lkKQorbWVyZ2VkXzJ2X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKKy8qIDI6MSB2ZXJ0aWNhbCBzYW1wbGluZyBjYXNlOiBtYXkgbmVlZCBhIHNwYXJlIHJvdy4gKi8KK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICBKU0FNUFJPVyB3b3JrX3B0cnNbMl07CisgIEpESU1FTlNJT04gbnVtX3Jvd3M7CQkvKiBudW1iZXIgb2Ygcm93cyByZXR1cm5lZCB0byBjYWxsZXIgKi8KKworICBpZiAodXBzYW1wbGUtPnNwYXJlX2Z1bGwpIHsKKyAgICAvKiBJZiB3ZSBoYXZlIGEgc3BhcmUgcm93IHNhdmVkIGZyb20gYSBwcmV2aW91cyBjeWNsZSwganVzdCByZXR1cm4gaXQuICovCisgICAgICBKRElNRU5TSU9OIHNpemUgPSB1cHNhbXBsZS0+b3V0X3Jvd193aWR0aDsKKyNpZmRlZiBBTkRST0lEX1JHQgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0JfNTY1KQorICAgICAgc2l6ZSA9IGNpbmZvLT5vdXRwdXRfd2lkdGgqMjsKKyNlbmRpZgorICAgIGpjb3B5X3NhbXBsZV9yb3dzKCYgdXBzYW1wbGUtPnNwYXJlX3JvdywgMCwgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwgMCwKKwkJICAgICAgMSwgc2l6ZSk7CisKKyAgICBudW1fcm93cyA9IDE7CisgICAgdXBzYW1wbGUtPnNwYXJlX2Z1bGwgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuIHRvIGNhbGxlci4gKi8KKyAgICBudW1fcm93cyA9IDI7CisgICAgLyogTm90IG1vcmUgdGhhbiB0aGUgZGlzdGFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICovCisgICAgaWYgKG51bV9yb3dzID4gdXBzYW1wbGUtPnJvd3NfdG9fZ28pCisgICAgICBudW1fcm93cyA9IHVwc2FtcGxlLT5yb3dzX3RvX2dvOworICAgIC8qIEFuZCBub3QgbW9yZSB0aGFuIHdoYXQgdGhlIGNsaWVudCBjYW4gYWNjZXB0OiAqLworICAgIG91dF9yb3dzX2F2YWlsIC09ICpvdXRfcm93X2N0cjsKKyAgICBpZiAobnVtX3Jvd3MgPiBvdXRfcm93c19hdmFpbCkKKyAgICAgIG51bV9yb3dzID0gb3V0X3Jvd3NfYXZhaWw7CisgICAgLyogQ3JlYXRlIG91dHB1dCBwb2ludGVyIGFycmF5IGZvciB1cHNhbXBsZXIuICovCisgICAgd29ya19wdHJzWzBdID0gb3V0cHV0X2J1Zlsqb3V0X3Jvd19jdHJdOworICAgIGlmIChudW1fcm93cyA+IDEpIHsKKyAgICAgIHdvcmtfcHRyc1sxXSA9IG91dHB1dF9idWZbKm91dF9yb3dfY3RyICsgMV07CisgICAgfSBlbHNlIHsKKyAgICAgIHdvcmtfcHRyc1sxXSA9IHVwc2FtcGxlLT5zcGFyZV9yb3c7CisgICAgICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IFRSVUU7CisgICAgfQorICAgIC8qIE5vdyBkbyB0aGUgdXBzYW1wbGluZy4gKi8KKyAgICAoKnVwc2FtcGxlLT51cG1ldGhvZCkgKGNpbmZvLCBpbnB1dF9idWYsICppbl9yb3dfZ3JvdXBfY3RyLCB3b3JrX3B0cnMpOworICB9CisKKyAgLyogQWRqdXN0IGNvdW50cyAqLworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7CisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvIC09IG51bV9yb3dzOworICAvKiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdGllZCwgZGVjbGFyZSB0aGlzIGlucHV0IHJvdyBncm91cCBjb25zdW1lZCAqLworICBpZiAoISB1cHNhbXBsZS0+c3BhcmVfZnVsbCkKKyAgICAoKmluX3Jvd19ncm91cF9jdHIpKys7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCittZXJnZWRfMXZfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQorLyogMToxIHZlcnRpY2FsIHNhbXBsaW5nIGNhc2U6IG11Y2ggZWFzaWVyLCBuZXZlciBuZWVkIGEgc3BhcmUgcm93LiAqLworeworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisKKyAgLyogSnVzdCBkbyB0aGUgdXBzYW1wbGluZy4gKi8KKyAgKCp1cHNhbXBsZS0+dXBtZXRob2QpIChjaW5mbywgaW5wdXRfYnVmLCAqaW5fcm93X2dyb3VwX2N0ciwKKwkJCSBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyKTsKKyAgLyogQWRqdXN0IGNvdW50cyAqLworICAoKm91dF9yb3dfY3RyKSsrOworICAoKmluX3Jvd19ncm91cF9jdHIpKys7Cit9CisKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcm91dGluZXMgaW52b2tlZCBieSB0aGUgY29udHJvbCByb3V0aW5lcyB0byBkbworICogdGhlIGFjdHVhbCB1cHNhbXBsaW5nL2NvbnZlcnNpb24uICBPbmUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBwZXIgY2FsbC4KKyAqCisgKiBOb3RlOiBzaW5jZSB3ZSBtYXkgYmUgd3JpdGluZyBkaXJlY3RseSBpbnRvIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGJ1ZmZlcnMsCisgKiB3ZSBoYXZlIHRvIGJlIGhvbmVzdCBhYm91dCB0aGUgb3V0cHV0IHdpZHRoOyB3ZSBjYW4ndCBhc3N1bWUgdGhlIGJ1ZmZlcgorICogaGFzIGJlZW4gcm91bmRlZCB1cCB0byBhbiBldmVuIHdpZHRoLgorICovCisKKworLyoKKyAqIFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisJCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKKyAgaW50IGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0ciA9IG91dHB1dF9idWZbMF07CisgIC8qIExvb3AgZm9yIGVhY2ggcGFpciBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggMiBZIHZhbHVlcyBhbmQgZW1pdCAyIHBpeGVscyAqLworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIG91dHB0cltSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cltSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIG91dHB0cltSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cltSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKKyAgICBvdXRwdHJbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHJbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgfQorfQorCisKKyNpZmRlZiBBTkRST0lEX1JHQgorTUVUSE9EREVGKHZvaWQpCitoMnYxX21lcmdlZF91cHNhbXBsZV81NjUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKKyAgaW50IGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgSU5UMzIgcmdiOworICBTSElGVF9URU1QUworCisgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0ciA9IG91dHB1dF9idWZbMF07CisgIC8qIExvb3AgZm9yIGVhY2ggcGFpciBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggMiBZIHZhbHVlcyBhbmQgZW1pdCAyIHBpeGVscyAqLworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyLCByZ2IpOworICAgIG91dHB0ciArPSA0OworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitoMnYxX21lcmdlZF91cHNhbXBsZV81NjVEIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgSkRJTUVOU0lPTiBjb2xfaW5kZXggPSAwOworICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKKyAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgIElOVDMyIHJnYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdOworICAvKiBMb29wIGZvciBlYWNoIHBhaXIgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDIgWSB2YWx1ZXMgYW5kIGVtaXQgMiBwaXhlbHMgKi8KKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKKyAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKKyAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIsIHJnYik7CisgICAgb3V0cHRyICs9IDQ7CisgIH0KKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgIH0KK30KKworCisjZW5kaWYKKworLyoKKyAqIFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisJCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKKyAgaW50IGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKKyAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7CisgIEpESU1FTlNJT04gY29sOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKKyAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOworICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKKyAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOworICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOworICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07CisgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOworICAvKiBMb29wIGZvciBlYWNoIGdyb3VwIG9mIG91dHB1dCBwaXhlbHMgKi8KKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICAvKiBGZXRjaCA0IFkgdmFsdWVzIGFuZCBlbWl0IDQgcGl4ZWxzICovCisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOworICAgIG91dHB0cjBbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0cjAgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7CisgICAgb3V0cHRyMFtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIwW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyMCArPSBSR0JfUElYRUxTSVpFOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKKyAgICBvdXRwdHIxW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjFbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIxICs9IFJHQl9QSVhFTFNJWkU7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOworICAgIG91dHB0cjFbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMVtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0cjEgKz0gUkdCX1BJWEVMU0laRTsKKyAgfQorICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDApOworICAgIG91dHB0cjBbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSk7CisgICAgb3V0cHRyMVtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIxW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgIH0KK30KKworCisjaWZkZWYgQU5EUk9JRF9SR0IKKworTUVUSE9EREVGKHZvaWQpCitoMnYyX21lcmdlZF91cHNhbXBsZV81NjUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKKyAgaW50IGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKKyAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7CisgIEpESU1FTlNJT04gY29sOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKKyAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOworICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKKyAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7CisgIHVuc2lnbmVkIGludCByLCBnLCBiOworICBJTlQzMiByZ2I7CisgIFNISUZUX1RFTVBTCisKKyAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOworICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOworICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07CisgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOworICAvKiBMb29wIGZvciBlYWNoIGdyb3VwIG9mIG91dHB1dCBwaXhlbHMgKi8KKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICAvKiBGZXRjaCA0IFkgdmFsdWVzIGFuZCBlbWl0IDQgcGl4ZWxzICovCisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICBXUklURV9UV09fUElYRUxTKG91dHB0cjAsIHJnYik7CisgICAgb3V0cHRyMCArPSA0OworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIxLCByZ2IpOworICAgIG91dHB0cjEgKz0gNDsKKyAgfQorICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDApOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAqKElOVDE2KilvdXRwdHIwID0gcmdiOworICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKTsKKyAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICooSU5UMTYqKW91dHB0cjEgPSByZ2I7CisgIH0KK30KKworCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml9tZXJnZWRfdXBzYW1wbGVfNTY1RCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKyAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOworICBpbnQgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxOworICBKU0FNUFJPVyBpbnB0cjAwLCBpbnB0cjAxLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgSkRJTUVOU0lPTiBjb2xfaW5kZXggPSAwOworICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKKyAgSU5UMzIgZDEgPSBkaXRoZXJfbWF0cml4WyhjaW5mby0+b3V0cHV0X3NjYW5saW5lKzEpICYgRElUSEVSX01BU0tdOworICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgSU5UMzIgcmdiOworICBTSElGVF9URU1QUworCisgIGlucHRyMDAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyXTsKKyAgaW5wdHIwMSA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjIgKyAxXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdOworICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXTsKKyAgLyogTG9vcCBmb3IgZWFjaCBncm91cCBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIAorICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggNCBZIHZhbHVlcyBhbmQgZW1pdCA0IHBpeGVscyAqLyAgICAKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07CisgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQxKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMSldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMSldOworICAgIGQxID0gRElUSEVSX1JPVEFURShkMSk7CisgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICBXUklURV9UV09fUElYRUxTKG91dHB0cjAsIHJnYik7CisgICAgb3V0cHRyMCArPSA0OworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKKyAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDEpXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQxKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQxKV07CisgICAgZDEgPSBESVRIRVJfUk9UQVRFKGQxKTsKKyAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyMSwgcmdiKTsKKyAgICBvdXRwdHIxICs9IDQ7CisgIH0KKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgKihJTlQxNiopb3V0cHRyMCA9IHJnYjsKKyAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSk7CisgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMSldOworICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMSldOworICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQxKV07CisgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAqKElOVDE2KilvdXRwdHIxID0gcmdiOworICB9Cit9CisKKyNlbmRpZgorCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIG1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24uCisgKgorICogTkI6IHRoaXMgaXMgY2FsbGVkIHVuZGVyIHRoZSBjb25kaXRpb25zIGRldGVybWluZWQgYnkgdXNlX21lcmdlZF91cHNhbXBsZSgpCisgKiBpbiBqZG1hc3Rlci5jLiAgVGhhdCByb3V0aW5lIE1VU1QgY29ycmVzcG9uZCB0byB0aGUgYWN0dWFsIGNhcGFiaWxpdGllcworICogb2YgdGhpcyBtb2R1bGU7IG5vIHNhZmV0eSBjaGVja3MgYXJlIG1hZGUgaGVyZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21lcmdlZF91cHNhbXBsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZTsKKworICB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfdXBzYW1wbGVyKSk7CisgIGNpbmZvLT51cHNhbXBsZSA9IChzdHJ1Y3QganBlZ191cHNhbXBsZXIgKikgdXBzYW1wbGU7CisgIHVwc2FtcGxlLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWVyZ2VkX3Vwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7CisKKyAgdXBzYW1wbGUtPm91dF9yb3dfd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOworICAKKyAgaWYgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9PSAyKSB7CisgICAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IG1lcmdlZF8ydl91cHNhbXBsZTsKKyAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYyX21lcmdlZF91cHNhbXBsZTsKKyNpZmRlZiBBTkRST0lEX1JHQgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0JfNTY1KSB7CisgICAgICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9OT05FKSB7CisgICAgICAgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYyX21lcmdlZF91cHNhbXBsZV81NjU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYyX21lcmdlZF91cHNhbXBsZV81NjVEOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLyogQWxsb2NhdGUgYSBzcGFyZSByb3cgYnVmZmVyICovCisgICAgdXBzYW1wbGUtPnNwYXJlX3JvdyA9IChKU0FNUFJPVykKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCShzaXplX3QpICh1cHNhbXBsZS0+b3V0X3Jvd193aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOworICB9IGVsc2UgeworICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMXZfdXBzYW1wbGU7CisgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2MV9tZXJnZWRfdXBzYW1wbGU7CisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCXzU2NSkgeworICAgICAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfTk9ORSkgeworICAgICAgICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2MV9tZXJnZWRfdXBzYW1wbGVfNTY1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2MV9tZXJnZWRfdXBzYW1wbGVfNTY1RDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIE5vIHNwYXJlIHJvdyBuZWVkZWQgKi8KKyAgICB1cHNhbXBsZS0+c3BhcmVfcm93ID0gTlVMTDsKKyAgfQorCisgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworfQorCisjZW5kaWYgLyogVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamRwaHVmZi5jIGIvanBlZy9qZHBodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4NTZlMAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamRwaHVmZi5jCkBAIC0wLDAgKzEsNzcwIEBACisvKgorICogamRwaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCisgKiBJZiB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGJhY2sKKyAqIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlIHZhcmlhYmxlcworICogaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZSBwZXJtYW5lbnQKKyAqIHN0b3JhZ2Ugb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpkaHVmZi5jICovCisKKworI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisKKy8qCisgKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGRlY29kaW5nLgorICoKKyAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKKyAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJCS8qIHJlbWFpbmluZyBFT0JzIGluIEVPQlJVTiAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOwkvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCit9IHNhdmFibGVfc3RhdGU7CisKKy8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KKyAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQorICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgorICovCisKKyNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCisjZWxzZQorI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAorCSgoZGVzdCkuRU9CUlVOID0gKHNyYykuRU9CUlVOLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQorI2VuZGlmCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIGxvYWRlZCBpbnRvIGxvY2FsIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBlYWNoIE1DVS4KKyAgICogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCB3ZSBleGl0IFdJVEhPVVQgdXBkYXRpbmcgdGhlbS4KKyAgICovCisgIGJpdHJlYWRfcGVybV9zdGF0ZSBiaXRzdGF0ZTsJLyogQml0IGJ1ZmZlciBhdCBzdGFydCBvZiBNQ1UgKi8KKyAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIE90aGVyIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCisgIGRfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsOyAvKiBhY3RpdmUgdGFibGUgZHVyaW5nIGFuIEFDIHNjYW4gKi8KK30gcGh1ZmZfZW50cm9weV9kZWNvZGVyOworCit0eXBlZGVmIHBodWZmX2VudHJvcHlfZGVjb2RlciAqIHBodWZmX2VudHJvcHlfcHRyOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfcmVmaW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CitNRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9BQ19yZWZpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3BodWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQsIGJhZDsKKyAgaW50IGNpLCBjb2VmaSwgdGJsOworICBpbnQgKmNvZWZfYml0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogVmFsaWRhdGUgc2NhbiBwYXJhbWV0ZXJzICovCisgIGJhZCA9IEZBTFNFOworICBpZiAoaXNfRENfYmFuZCkgeworICAgIGlmIChjaW5mby0+U2UgIT0gMCkKKyAgICAgIGJhZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgLyogbmVlZCBub3QgY2hlY2sgU3MvU2UgPCAwIHNpbmNlIHRoZXkgY2FtZSBmcm9tIHVuc2lnbmVkIGJ5dGVzICovCisgICAgaWYgKGNpbmZvLT5TcyA+IGNpbmZvLT5TZSB8fCBjaW5mby0+U2UgPj0gRENUU0laRTIpCisgICAgICBiYWQgPSBUUlVFOworICAgIC8qIEFDIHNjYW5zIG1heSBoYXZlIG9ubHkgb25lIGNvbXBvbmVudCAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiAhPSAxKQorICAgICAgYmFkID0gVFJVRTsKKyAgfQorICBpZiAoY2luZm8tPkFoICE9IDApIHsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuOiBtdXN0IGhhdmUgQWwgPSBBaC0xLiAqLworICAgIGlmIChjaW5mby0+QWwgIT0gY2luZm8tPkFoLTEpCisgICAgICBiYWQgPSBUUlVFOworICB9CisgIGlmIChjaW5mby0+QWwgPiAxMykJCS8qIG5lZWQgbm90IGNoZWNrIGZvciA8IDAgKi8KKyAgICBiYWQgPSBUUlVFOworICAvKiBBcmd1YWJseSB0aGUgbWF4aW11bSBBbCB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEzIGZvciA4LWJpdCBwcmVjaXNpb24sCisgICAqIGJ1dCB0aGUgc3BlYyBkb2Vzbid0IHNheSBzbywgYW5kIHdlIHRyeSB0byBiZSBsaWJlcmFsIGFib3V0IHdoYXQgd2UKKyAgICogYWNjZXB0LiAgTm90ZTogbGFyZ2UgQWwgdmFsdWVzIGNvdWxkIHJlc3VsdCBpbiBvdXQtb2YtcmFuZ2UgREMKKyAgICogY29lZmZpY2llbnRzIGR1cmluZyBlYXJseSBzY2FucywgbGVhZGluZyB0byBiaXphcnJlIGRpc3BsYXlzIGR1ZSB0bworICAgKiBvdmVyZmxvd3MgaW4gdGhlIElEQ1QgbWF0aC4gIEJ1dCB3ZSB3b24ndCBjcmFzaC4KKyAgICovCisgIGlmIChiYWQpCisgICAgRVJSRVhJVDQoY2luZm8sIEpFUlJfQkFEX1BST0dSRVNTSU9OLAorCSAgICAgY2luZm8tPlNzLCBjaW5mby0+U2UsIGNpbmZvLT5BaCwgY2luZm8tPkFsKTsKKyAgLyogVXBkYXRlIHByb2dyZXNzaW9uIHN0YXR1cywgYW5kIHZlcmlmeSB0aGF0IHNjYW4gb3JkZXIgaXMgbGVnYWwuCisgICAqIE5vdGUgdGhhdCBpbnRlci1zY2FuIGluY29uc2lzdGVuY2llcyBhcmUgdHJlYXRlZCBhcyB3YXJuaW5ncworICAgKiBub3QgZmF0YWwgZXJyb3JzIC4uLiBub3QgY2xlYXIgaWYgdGhpcyBpcyByaWdodCB3YXkgdG8gYmVoYXZlLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBpbnQgY2luZGV4ID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldLT5jb21wb25lbnRfaW5kZXg7CisgICAgY29lZl9iaXRfcHRyID0gJiBjaW5mby0+Y29lZl9iaXRzW2NpbmRleF1bMF07CisgICAgaWYgKCFpc19EQ19iYW5kICYmIGNvZWZfYml0X3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLworICAgICAgV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCAwKTsKKyAgICBmb3IgKGNvZWZpID0gY2luZm8tPlNzOyBjb2VmaSA8PSBjaW5mby0+U2U7IGNvZWZpKyspIHsKKyAgICAgIGludCBleHBlY3RlZCA9IChjb2VmX2JpdF9wdHJbY29lZmldIDwgMCkgPyAwIDogY29lZl9iaXRfcHRyW2NvZWZpXTsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gZXhwZWN0ZWQpCisJV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCBjb2VmaSk7CisgICAgICBjb2VmX2JpdF9wdHJbY29lZmldID0gY2luZm8tPkFsOworICAgIH0KKyAgfQorCisgIC8qIFNlbGVjdCBNQ1UgZGVjb2Rpbmcgcm91dGluZSAqLworICBpZiAoY2luZm8tPkFoID09IDApIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19maXJzdDsKKyAgICBlbHNlCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfQUNfZmlyc3Q7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX0RDX2JhbmQpCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfRENfcmVmaW5lOworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19yZWZpbmU7CisgIH0KKworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgLyogTWFrZSBzdXJlIHJlcXVlc3RlZCB0YWJsZXMgYXJlIHByZXNlbnQsIGFuZCBjb21wdXRlIGRlcml2ZWQgdGFibGVzLgorICAgICAqIFdlIG1heSBidWlsZCBzYW1lIGRlcml2ZWQgdGFibGUgbW9yZSB0aGFuIG9uY2UsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUuCisgICAgICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggPT0gMCkgewkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworCWpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCB0YmwsCisJCQkJJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICAvKiByZW1lbWJlciB0aGUgc2luZ2xlIGFjdGl2ZSB0YWJsZSAqLworICAgICAgZW50cm9weS0+YWNfZGVyaXZlZF90YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgYml0cmVhZCBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKyAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IDA7IC8qIHVubmVjZXNzYXJ5LCBidXQga2VlcHMgUHVyaWZ5IHF1aWV0ICovCisgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKKworICAvKiBJbml0aWFsaXplIHJlc3RhcnQgY291bnRlciAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworfQorCisKKy8qCisgKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgorICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCisgKi8KKworI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLworICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCisgIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKKyAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAorICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCisgICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OworCisjZW5kaWYgLyogQVZPSURfVEFCTEVTICovCisKKworLyoKKyAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgorICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3Byb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaTsKKworICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KKyAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLworICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKworICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCisgIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIC8qIFJlLWluaXQgRU9CIHJ1biBjb3VudCwgdG9vICovCisgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IDA7CisKKyAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisKKyAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAorICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKKyAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQorICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KKyAgICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQorICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBIdWZmbWFuIE1DVSBkZWNvZGluZy4KKyAqIEVhY2ggb2YgdGhlc2Ugcm91dGluZXMgZGVjb2RlcyBhbmQgcmV0dXJucyBvbmUgTUNVJ3Mgd29ydGggb2YKKyAqIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuIAorICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKKyAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgorICoKKyAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKKyAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBJUyBJTklUSUFMTFkgWkVST0VEIEJZIFRIRSBDQUxMRVIuCisgKgorICogV2UgcmV0dXJuIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCisgKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0CisgKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKKyAqIHNwZWN0cmFsIHNlbGVjdGlvbiwgc2luY2Ugd2UnbGwganVzdCByZS1hc3NpZ24gdGhlbSBvbiB0aGUgbmV4dCBjYWxsLgorICogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIEFDIHJlZmluZW1lbnQgaGFzIHRvIGJlIG1vcmUgY2FyZWZ1bCwgaG93ZXZlci4pCisgKi8KKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgcmVnaXN0ZXIgaW50IHMsIHI7CisgIGludCBibGtuLCBjaTsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIHNhdmFibGVfc3RhdGUgc3RhdGU7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworCisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKKworICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KKworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworICAgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub107CisKKyAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOworICAgICAgaWYgKHMpIHsKKwlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCXIgPSBHRVRfQklUUyhzKTsKKwlzID0gSFVGRl9FWFRFTkQociwgcyk7CisgICAgICB9CisKKyAgICAgIC8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworICAgICAgcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07CisgICAgICBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworICAgICAgLyogU2NhbGUgYW5kIG91dHB1dCB0aGUgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdPTApICovCisgICAgICAoKmJsb2NrKVswXSA9IChKQ09FRikgKHMgPDwgQWwpOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7CisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9BQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBTZSA9IGNpbmZvLT5TZTsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICByZWdpc3RlciBpbnQgcywgaywgcjsKKyAgdW5zaWduZWQgaW50IEVPQlJVTjsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCisgICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUuCisgICAgICogV2UgY2FuIGF2b2lkIGxvYWRpbmcvc2F2aW5nIGJpdHJlYWQgc3RhdGUgaWYgaW4gYW4gRU9CIHJ1bi4KKyAgICAgKi8KKyAgICBFT0JSVU4gPSBlbnRyb3B5LT5zYXZlZC5FT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCisKKyAgICAvKiBUaGVyZSBpcyBhbHdheXMgb25seSBvbmUgYmxvY2sgcGVyIE1DVSAqLworCisgICAgaWYgKEVPQlJVTiA+IDApCQkvKiBpZiBpdCdzIGEgYmFuZCBvZiB6ZXJvZXMuLi4gKi8KKyAgICAgIEVPQlJVTi0tOwkJCS8qIC4uLnByb2Nlc3MgaXQgbm93ICh3ZSBkbyBub3RoaW5nKSAqLworICAgIGVsc2UgeworICAgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICAgIGJsb2NrID0gTUNVX2RhdGFbMF07CisgICAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgICAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7CisJciA9IHMgPj4gNDsKKwlzICY9IDE1OworCWlmIChzKSB7CisJICBrICs9IHI7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgciA9IEdFVF9CSVRTKHMpOworCSAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOworCSAgLyogU2NhbGUgYW5kIG91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIgKi8KKwkgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIChzIDw8IEFsKTsKKwl9IGVsc2UgeworCSAgaWYgKHIgPT0gMTUpIHsJLyogWlJMICovCisJICAgIGsgKz0gMTU7CQkvKiBza2lwIDE1IHplcm9lcyBpbiBiYW5kICovCisJICB9IGVsc2UgewkJLyogRU9CciwgcnVuIGxlbmd0aCBpcyAyXnIgKyBhcHBlbmRlZCBiaXRzICovCisJICAgIEVPQlJVTiA9IDEgPDwgcjsKKwkgICAgaWYgKHIpIHsJCS8qIEVPQnIsIHIgPiAwICovCisJICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgciwgcmV0dXJuIEZBTFNFKTsKKwkgICAgICByID0gR0VUX0JJVFMocik7CisJICAgICAgRU9CUlVOICs9IHI7CisJICAgIH0KKwkgICAgRU9CUlVOLS07CQkvKiB0aGlzIGJhbmQgaXMgcHJvY2Vzc2VkIGF0IHRoaXMgbW9tZW50ICovCisJICAgIGJyZWFrOwkJLyogZm9yY2UgZW5kLW9mLWJhbmQgKi8KKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOwkvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZGVjb2RpbmcgZm9yIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCisgKiBOb3RlOiB3ZSBhc3N1bWUgc3VjaCBzY2FucyBjYW4gYmUgbXVsdGktY29tcG9uZW50LCBhbHRob3VnaCB0aGUgc3BlYworICogaXMgbm90IHZlcnkgY2xlYXIgb24gdGhlIHBvaW50LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7ICAgCisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBibGtuOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKworICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogTm90IHdvcnRoIHRoZSBjeWNsZXMgdG8gY2hlY2sgaW5zdWZmaWNpZW50X2RhdGEgaGVyZSwKKyAgICogc2luY2Ugd2Ugd2lsbCBub3QgY2hhbmdlIHRoZSBkYXRhIGFueXdheSBpZiB3ZSByZWFkIHplcm9lcy4KKyAgICovCisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisKKyAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLworCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKworICAgIC8qIEVuY29kZWQgZGF0YSBpcyBzaW1wbHkgdGhlIG5leHQgYml0IG9mIHRoZSB0d28ncy1jb21wbGVtZW50IERDIHZhbHVlICovCisgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgcmV0dXJuIEZBTFNFKTsKKyAgICBpZiAoR0VUX0JJVFMoMSkpCisgICAgICAoKmJsb2NrKVswXSB8PSBwMTsKKyAgICAvKiBOb3RlOiBzaW5jZSB3ZSB1c2UgfD0sIHJlcGVhdGluZyB0aGUgYXNzaWdubWVudCBsYXRlciBpcyBzYWZlICovCisgIH0KKworICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2RlY29kZV9tY3VfQUNfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBtMSA9ICgtMSkgPDwgY2luZm8tPkFsOwkvKiAtMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIHJlZ2lzdGVyIGludCBzLCBrLCByOworICB1bnNpZ25lZCBpbnQgRU9CUlVOOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEpDT0VGUFRSIHRoaXNjb2VmOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGludCBudW1fbmV3bno7CisgIGludCBuZXduel9wb3NbRENUU0laRTJdOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGRvbid0IG1vZGlmeSB0aGUgTUNVLgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsgLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KKworICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCisgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKyAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgIC8qIElmIHdlIGFyZSBmb3JjZWQgdG8gc3VzcGVuZCwgd2UgbXVzdCB1bmRvIHRoZSBhc3NpZ25tZW50cyB0byBhbnkgbmV3bHkKKyAgICAgKiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2ssIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlJ2QgZ2V0IGNvbmZ1c2VkCisgICAgICogbmV4dCB0aW1lIGFib3V0IHdoaWNoIGNvZWZmaWNpZW50cyB3ZXJlIGFscmVhZHkgbm9uemVyby4KKyAgICAgKiBCdXQgd2UgbmVlZCBub3QgdW5kbyBhZGRpdGlvbiBvZiBiaXRzIHRvIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudHM7CisgICAgICogaW5zdGVhZCwgd2UgY2FuIHRlc3QgdGhlIGN1cnJlbnQgYml0IHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGRpZCBpdC4KKyAgICAgKi8KKyAgICBudW1fbmV3bnogPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBjb2VmZmljaWVudCBsb29wIGNvdW50ZXIgdG8gc3RhcnQgb2YgYmFuZCAqLworICAgIGsgPSBjaW5mby0+U3M7CisKKyAgICBpZiAoRU9CUlVOID09IDApIHsKKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCBnb3RvIHVuZG9pdCwgbGFiZWwzKTsKKwlyID0gcyA+PiA0OworCXMgJj0gMTU7CisJaWYgKHMpIHsKKwkgIGlmIChzICE9IDEpCQkvKiBzaXplIG9mIG5ldyBjb2VmIHNob3VsZCBhbHdheXMgYmUgMSAqLworCSAgICBXQVJOTVMoY2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7CisJICBpZiAoR0VUX0JJVFMoMSkpCisJICAgIHMgPSBwMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBwb3NpdGl2ZSAqLworCSAgZWxzZQorCSAgICBzID0gbTE7CQkvKiBuZXdseSBub256ZXJvIGNvZWYgaXMgbmVnYXRpdmUgKi8KKwl9IGVsc2UgeworCSAgaWYgKHIgIT0gMTUpIHsKKwkgICAgRU9CUlVOID0gMSA8PCByOwkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KKwkgICAgaWYgKHIpIHsKKwkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCBnb3RvIHVuZG9pdCk7CisJICAgICAgciA9IEdFVF9CSVRTKHIpOworCSAgICAgIEVPQlJVTiArPSByOworCSAgICB9CisJICAgIGJyZWFrOwkJLyogcmVzdCBvZiBibG9jayBpcyBoYW5kbGVkIGJ5IEVPQiBsb2dpYyAqLworCSAgfQorCSAgLyogbm90ZSBzID0gMCBmb3IgcHJvY2Vzc2luZyBaUkwgKi8KKwl9CisJLyogQWR2YW5jZSBvdmVyIGFscmVhZHktbm9uemVybyBjb2VmcyBhbmQgciBzdGlsbC16ZXJvIGNvZWZzLAorCSAqIGFwcGVuZGluZyBjb3JyZWN0aW9uIGJpdHMgdG8gdGhlIG5vbnplcm9lcy4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQorCSAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisJICovCisJZG8geworCSAgdGhpc2NvZWYgPSAqYmxvY2sgKyBqcGVnX25hdHVyYWxfb3JkZXJba107CisJICBpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOworCSAgICBpZiAoR0VUX0JJVFMoMSkpIHsKKwkgICAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBzZXQgaXQgKi8KKwkJaWYgKCp0aGlzY29lZiA+PSAwKQorCQkgICp0aGlzY29lZiArPSBwMTsKKwkJZWxzZQorCQkgICp0aGlzY29lZiArPSBtMTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIGlmICgtLXIgPCAwKQorCSAgICAgIGJyZWFrOwkJLyogcmVhY2hlZCB0YXJnZXQgemVybyBjb2VmZmljaWVudCAqLworCSAgfQorCSAgaysrOworCX0gd2hpbGUgKGsgPD0gU2UpOworCWlmIChzKSB7CisJICBpbnQgcG9zID0ganBlZ19uYXR1cmFsX29yZGVyW2tdOworCSAgLyogT3V0cHV0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQgKi8KKwkgICgqYmxvY2spW3Bvc10gPSAoSkNPRUYpIHM7CisJICAvKiBSZW1lbWJlciBpdHMgcG9zaXRpb24gaW4gY2FzZSB3ZSBoYXZlIHRvIHN1c3BlbmQgKi8KKwkgIG5ld256X3Bvc1tudW1fbmV3bnorK10gPSBwb3M7CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChFT0JSVU4gPiAwKSB7CisgICAgICAvKiBTY2FuIGFueSByZW1haW5pbmcgY29lZmZpY2llbnQgcG9zaXRpb25zIGFmdGVyIHRoZSBlbmQtb2YtYmFuZAorICAgICAgICogKHRoZSBsYXN0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQsIGlmIGFueSkuICBBcHBlbmQgYSBjb3JyZWN0aW9uCisgICAgICAgKiBiaXQgdG8gZWFjaCBhbHJlYWR5LW5vbnplcm8gY29lZmZpY2llbnQuICBBIGNvcnJlY3Rpb24gYml0IGlzIDEKKyAgICAgICAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisgICAgICAgKi8KKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwl0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKKwlpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKKwkgIGlmIChHRVRfQklUUygxKSkgeworCSAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBjaGFuZ2VkIGl0ICovCisJICAgICAgaWYgKCp0aGlzY29lZiA+PSAwKQorCQkqdGhpc2NvZWYgKz0gcDE7CisJICAgICAgZWxzZQorCQkqdGhpc2NvZWYgKz0gbTE7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBDb3VudCBvbmUgYmxvY2sgY29tcGxldGVkIGluIEVPQiBydW4gKi8KKyAgICAgIEVPQlJVTi0tOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworCit1bmRvaXQ6CisgIC8qIFJlLXplcm8gYW55IG91dHB1dCBjb2VmZmljaWVudHMgdGhhdCB3ZSBtYWRlIG5ld2x5IG5vbnplcm8gKi8KKyAgd2hpbGUgKG51bV9uZXdueiA+IDApCisgICAgKCpibG9jaylbbmV3bnpfcG9zWy0tbnVtX25ld256XV0gPSAwOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFNhdmUgdGhlIGN1cnJlbnQgSHVmZm1hbiBkZWNvZGVyIHBvc2l0aW9uIGFuZCB0aGUgYml0IGJ1ZmZlcgorICogaW50byBiaXRzdHJlYW1fb2Zmc2V0IGFuZCBnZXRfYnVmZmVyLCByZXNwZWN0aXZlbHkuCisgKi8KK0dMT0JBTCh2b2lkKQoranBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb25fcHJvZ3Jlc3NpdmUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZCBvZiBhIGRhdGEgc2VnbWVudAorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm47CisgIH0KKworICAvLyBTYXZlIHJlc3RhcnRzX3RvX2dvIGFuZCBuZXh0X3Jlc3RhcnRfbnVtLgorICBvZmZzZXQtPnJlc3RhcnRzX3RvX2dvID0gKHVuc2lnbmVkIHNob3J0KSBlbnRyb3B5LT5yZXN0YXJ0c190b19nbzsKKyAgb2Zmc2V0LT5uZXh0X3Jlc3RhcnRfbnVtID0gY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bTsKKworICBvZmZzZXQtPmJpdHN0cmVhbV9vZmZzZXQgPQorICAgICAgKGpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvKSA8PCBMT0dfVFdPX0JJVF9CVUZfU0laRSkKKyAgICAgICsgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0OworCisgIG9mZnNldC0+Z2V0X2J1ZmZlciA9IGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXI7Cit9CisKKy8qCisgKiBTYXZlIHRoZSBjdXJyZW50IEh1ZmZtYW4gZGVvY2RlIHBvc2l0aW9uIGFuZCB0aGUgREMgY29lZmZpY2llbnRzCisgKiBmb3IgZWFjaCBjb21wb25lbnQgaW50byBiaXRzdHJlYW1fb2Zmc2V0IGFuZCBkY19pbmZvW10sIHJlc3BlY3RpdmVseS4KKyAqLworTUVUSE9EREVGKHZvaWQpCitnZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KQoreworICBpbnQgaTsKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGpwZWdfZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uX3Byb2dyZXNzaXZlKGNpbmZvLCBvZmZzZXQpOworICBvZmZzZXQtPkVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspCisgICAgb2Zmc2V0LT5wcmV2X2RjW2ldID0gZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbaV07Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIEh1ZmZtYW4gZGVjb2RlciByZWFkZXIgcG9zaXRpb24gYW5kIGJpdCBidWZmZXIuCisgKi8KK0dMT0JBTCh2b2lkKQoranBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyX3Byb2dyZXNzaXZlKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KQoreworCXBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworCisgIC8vIFJlc3RvcmUgcmVzdGFydHNfdG9fZ28gYW5kIG5leHRfcmVzdGFydF9udW0KKyAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IG9mZnNldC5yZXN0YXJ0c190b19nbzsKKyAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IG9mZnNldC5uZXh0X3Jlc3RhcnRfbnVtOworCisgIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fb2Zmc2V0ID0gb2Zmc2V0LmJpdHN0cmVhbV9vZmZzZXQ7CisgIGludCBibGtuLCBpOworCisgIHVuc2lnbmVkIGludCBieXRlX29mZnNldCA9IGJpdHN0cmVhbV9vZmZzZXQgPj4gTE9HX1RXT19CSVRfQlVGX1NJWkU7CisgIHVuc2lnbmVkIGludCBiaXRfaW5fYml0X2J1ZmZlciA9CisgICAgICBiaXRzdHJlYW1fb2Zmc2V0ICYgKCgxIDw8IExPR19UV09fQklUX0JVRl9TSVpFKSAtIDEpOworCisgIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uX2JpdChjaW5mbywgYnl0ZV9vZmZzZXQsCisgICAgICAgICAgYml0X2luX2JpdF9idWZmZXIsIG9mZnNldC5nZXRfYnVmZmVyKTsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgSHVmZm1hbiBkZWNvZGVyIHRvIGRlY29kZSB0aGUgaW1hZ2UKKyAqIHN0YXJ0aW5nIGZyb20gKGlNQ1Vfcm93X29mZnNldCwgaU1DVV9jb2xfb2Zmc2V0KS4KKyAqLworTUVUSE9EREVGKHZvaWQpCitjb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KQoreworICBpbnQgaTsKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGpwZWdfY29uZmlndXJlX2h1ZmZtYW5fZGVjb2Rlcl9wcm9ncmVzc2l2ZShjaW5mbywgb2Zmc2V0KTsKKyAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gb2Zmc2V0LkVPQlJVTjsKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbaV0gPSBvZmZzZXQucHJldl9kY1tpXTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2luZGV4X3NjYW4oal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBzY2FuX25vLCBpbnQgb2Zmc2V0KQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaWYgKHNjYW5fbm8gPj0gaW5kZXgtPnNjYW5fY291bnQpIHsKKyAgICBpbmRleC0+c2NhbiA9IHJlYWxsb2MoaW5kZXgtPnNjYW4sCisgICAgICAgICAgICAgICAgICAgIChzY2FuX25vICsgMSkgKiBzaXplb2YoaHVmZm1hbl9zY2FuX2hlYWRlcikpOworICAgIGluZGV4LT5tZW1fdXNlZCArPSAoc2Nhbl9ubyAtIGluZGV4LT5zY2FuX2NvdW50ICsgMSkKKyAgICAgICogKHNpemVvZihodWZmbWFuX3NjYW5faGVhZGVyKSArIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MKKyAgICAgICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKSk7CisgICAgaW5kZXgtPnNjYW5fY291bnQgPSBzY2FuX25vICsgMTsKKyAgfQorICBpbmRleC0+c2NhbltzY2FuX25vXS5vZmZzZXQgPSAoaHVmZm1hbl9vZmZzZXRfZGF0YSoqKW1hbGxvYygKKyAgICAgICAgICBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKSk7CisgIGluZGV4LT5zY2FuW3NjYW5fbm9dLmJpdHN0cmVhbV9vZmZzZXQgPSBvZmZzZXQ7Cit9CisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgorICovCitHTE9CQUwodm9pZCkKK2ppbml0X3BodWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCAqY29lZl9iaXRfcHRyOworICBpbnQgY2ksIGk7CisKKyAgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihwaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKKyAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7CisgIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19waHVmZl9kZWNvZGVyOworICBlbnRyb3B5LT5wdWIuY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlciA9IGNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXI7CisgIGVudHJvcHktPnB1Yi5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24gPQorICAgICAgICBnZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb247CisKKyAgLyogTWFyayBkZXJpdmVkIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKKyAgfQorCisgIC8qIENyZWF0ZSBwcm9ncmVzc2lvbiBzdGF0dXMgdGFibGUgKi8KKyAgY2luZm8tPmNvZWZfYml0cyA9IChpbnQgKCopW0RDVFNJWkUyXSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCWNpbmZvLT5udW1fY29tcG9uZW50cypEQ1RTSVpFMipTSVpFT0YoaW50KSk7CisgIGNvZWZfYml0X3B0ciA9ICYgY2luZm8tPmNvZWZfYml0c1swXVswXTsKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKKyAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykKKyAgICAgICpjb2VmX2JpdF9wdHIrKyA9IC0xOworfQorCisjZW5kaWYgLyogRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamRwb3N0Y3QuYyBiL2pwZWcvamRwb3N0Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzE1NjNkCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qZHBvc3RjdC5jCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogamRwb3N0Y3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgdXBzYW1wbGluZywgY29sb3IgY29udmVyc2lvbiwgYW5kIGNvbG9yCisgKiBxdWFudGl6YXRpb24vcmVkdWN0aW9uIHN0ZXBzOyBzcGVjaWZpY2FsbHksIGl0IGNvbnRyb2xzIHRoZSBidWZmZXJpbmcKKyAqIGJldHdlZW4gdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBhbmQgY29sb3IgcXVhbnRpemF0aW9uL3JlZHVjdGlvbi4KKyAqCisgKiBJZiBubyBjb2xvciBxdWFudGl6YXRpb24vcmVkdWN0aW9uIGlzIHJlcXVpcmVkLCB0aGVuIHRoaXMgbW9kdWxlIGhhcyBubworICogd29yayB0byBkbywgYW5kIGl0IGp1c3QgaGFuZHMgb2ZmIHRvIHRoZSB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIGNvZGUuCisgKiBBbiBpbnRlZ3JhdGVkIHVwc2FtcGxlL2NvbnZlcnQvcXVhbnRpemUgcHJvY2VzcyB3b3VsZCByZXBsYWNlIHRoaXMgbW9kdWxlCisgKiBlbnRpcmVseS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBDb2xvciBxdWFudGl6YXRpb24gc291cmNlIGJ1ZmZlcjogdGhpcyBob2xkcyBvdXRwdXQgZGF0YSBmcm9tCisgICAqIHRoZSB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIHN0ZXAgdG8gYmUgcGFzc2VkIHRvIHRoZSBxdWFudGl6ZXIuCisgICAqIEZvciB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24sIHdlIG5lZWQgYSBmdWxsLWltYWdlIGJ1ZmZlcjsKKyAgICogZm9yIG9uZS1wYXNzIG9wZXJhdGlvbiwgYSBzdHJpcCBidWZmZXIgaXMgc3VmZmljaWVudC4KKyAgICovCisgIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIHZpcnR1YWwgYXJyYXksIG9yIE5VTEwgaWYgb25lLXBhc3MgKi8KKyAgSlNBTVBBUlJBWSBidWZmZXI7CQkvKiBzdHJpcCBidWZmZXIsIG9yIGN1cnJlbnQgc3RyaXAgb2YgdmlydHVhbCAqLworICBKRElNRU5TSU9OIHN0cmlwX2hlaWdodDsJLyogYnVmZmVyIHNpemUgaW4gcm93cyAqLworICAvKiBmb3IgdHdvLXBhc3MgbW9kZSBvbmx5OiAqLworICBKRElNRU5TSU9OIHN0YXJ0aW5nX3JvdzsJLyogcm93ICMgb2YgZmlyc3Qgcm93IGluIGN1cnJlbnQgc3RyaXAgKi8KKyAgSkRJTUVOU0lPTiBuZXh0X3JvdzsJCS8qIGluZGV4IG9mIG5leHQgcm93IHRvIGZpbGwvZW1wdHkgaW4gc3RyaXAgKi8KK30gbXlfcG9zdF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X3Bvc3RfY29udHJvbGxlciAqIG15X3Bvc3RfcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcG9zdF9wcm9jZXNzXzFwYXNzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc19wcmVwYXNzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc18ycGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKyNlbmRpZgorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfZHBvc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKworICBzd2l0Y2ggKHBhc3NfbW9kZSkgeworICBjYXNlIEpCVUZfUEFTU19USFJVOgorICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgICAvKiBTaW5nbGUtcGFzcyBwcm9jZXNzaW5nIHdpdGggY29sb3IgcXVhbnRpemF0aW9uLiAqLworICAgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzXzFwYXNzOworICAgICAgLyogV2UgY291bGQgYmUgZG9pbmcgYnVmZmVyZWQtaW1hZ2Ugb3V0cHV0IGJlZm9yZSBzdGFydGluZyBhIDItcGFzcworICAgICAgICogY29sb3IgcXVhbnRpemF0aW9uOyBpbiB0aGF0IGNhc2UsIGppbml0X2RfcG9zdF9jb250cm9sbGVyIGRpZCBub3QKKyAgICAgICAqIGFsbG9jYXRlIGEgc3RyaXAgYnVmZmVyLiAgVXNlIHRoZSB2aXJ0dWFsLWFycmF5IGJ1ZmZlciBhcyB3b3Jrc3BhY2UuCisgICAgICAgKi8KKyAgICAgIGlmIChwb3N0LT5idWZmZXIgPT0gTlVMTCkgeworCXBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKKwkgICAoSkRJTUVOU0lPTikgMCwgcG9zdC0+c3RyaXBfaGVpZ2h0LCBUUlVFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogRm9yIHNpbmdsZS1wYXNzIHByb2Nlc3Npbmcgd2l0aG91dCBjb2xvciBxdWFudGl6YXRpb24sCisgICAgICAgKiBJIGhhdmUgbm8gd29yayB0byBkbzsganVzdCBjYWxsIHRoZSB1cHNhbXBsZXIgZGlyZWN0bHkuCisgICAgICAgKi8KKyAgICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IGNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGU7CisgICAgfQorICAgIGJyZWFrOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKKyAgICAvKiBGaXJzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KKyAgICBpZiAocG9zdC0+d2hvbGVfaW1hZ2UgPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfcHJlcGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6CisgICAgLyogU2Vjb25kIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLworICAgIGlmIChwb3N0LT53aG9sZV9pbWFnZSA9PSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc18ycGFzczsKKyAgICBicmVhazsKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgYnJlYWs7CisgIH0KKyAgcG9zdC0+c3RhcnRpbmdfcm93ID0gcG9zdC0+bmV4dF9yb3cgPSAwOworfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgb25lLXBhc3MgKHN0cmlwIGJ1ZmZlcikgY2FzZS4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiBhcyB3ZWxsIGFzIG9uZS1wYXNzIHF1YW50aXphdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bvc3RfcHJvY2Vzc18xcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OworICBKRElNRU5TSU9OIG51bV9yb3dzLCBtYXhfcm93czsKKworICAvKiBGaWxsIHRoZSBidWZmZXIsIGJ1dCBub3QgbW9yZSB0aGFuIHdoYXQgd2UgY2FuIGR1bXAgb3V0IGluIG9uZSBnby4gKi8KKyAgLyogTm90ZSB3ZSByZWx5IG9uIHRoZSB1cHNhbXBsZXIgdG8gZGV0ZWN0IGJvdHRvbSBvZiBpbWFnZS4gKi8KKyAgbWF4X3Jvd3MgPSBvdXRfcm93c19hdmFpbCAtICpvdXRfcm93X2N0cjsKKyAgaWYgKG1heF9yb3dzID4gcG9zdC0+c3RyaXBfaGVpZ2h0KQorICAgIG1heF9yb3dzID0gcG9zdC0+c3RyaXBfaGVpZ2h0OworICBudW1fcm93cyA9IDA7CisgICgqY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZSkgKGNpbmZvLAorCQlpbnB1dF9idWYsIGluX3Jvd19ncm91cF9jdHIsIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCXBvc3QtPmJ1ZmZlciwgJm51bV9yb3dzLCBtYXhfcm93cyk7CisgIC8qIFF1YW50aXplIGFuZCBlbWl0IGRhdGEuICovCisgICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywKKwkJcG9zdC0+YnVmZmVyLCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLCAoaW50KSBudW1fcm93cyk7CisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKK30KKworCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgZmlyc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorcG9zdF9wcm9jZXNzX3ByZXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OworICBKRElNRU5TSU9OIG9sZF9uZXh0X3JvdywgbnVtX3Jvd3M7CisKKyAgLyogUmVwb3NpdGlvbiB2aXJ0dWFsIGJ1ZmZlciBpZiBhdCBzdGFydCBvZiBzdHJpcC4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID09IDApIHsKKyAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAorCSBwb3N0LT5zdGFydGluZ19yb3csIHBvc3QtPnN0cmlwX2hlaWdodCwgVFJVRSk7CisgIH0KKworICAvKiBVcHNhbXBsZSBzb21lIGRhdGEgKHVwIHRvIGEgc3RyaXAgaGVpZ2h0J3Mgd29ydGgpLiAqLworICBvbGRfbmV4dF9yb3cgPSBwb3N0LT5uZXh0X3JvdzsKKyAgKCpjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlKSAoY2luZm8sCisJCWlucHV0X2J1ZiwgaW5fcm93X2dyb3VwX2N0ciwgaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJcG9zdC0+YnVmZmVyLCAmcG9zdC0+bmV4dF9yb3csIHBvc3QtPnN0cmlwX2hlaWdodCk7CisKKyAgLyogQWxsb3cgcXVhbnRpemVyIHRvIHNjYW4gbmV3IGRhdGEuICBObyBkYXRhIGlzIGVtaXR0ZWQsICovCisgIC8qIGJ1dCB3ZSBhZHZhbmNlIG91dF9yb3dfY3RyIHNvIG91dGVyIGxvb3AgY2FuIHRlbGwgd2hlbiB3ZSdyZSBkb25lLiAqLworICBpZiAocG9zdC0+bmV4dF9yb3cgPiBvbGRfbmV4dF9yb3cpIHsKKyAgICBudW1fcm93cyA9IHBvc3QtPm5leHRfcm93IC0gb2xkX25leHRfcm93OworICAgICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywgcG9zdC0+YnVmZmVyICsgb2xkX25leHRfcm93LAorCQkJCQkgKEpTQU1QQVJSQVkpIE5VTEwsIChpbnQpIG51bV9yb3dzKTsKKyAgICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7CisgIH0KKworICAvKiBBZHZhbmNlIGlmIHdlIGZpbGxlZCB0aGUgc3RyaXAuICovCisgIGlmIChwb3N0LT5uZXh0X3JvdyA+PSBwb3N0LT5zdHJpcF9oZWlnaHQpIHsKKyAgICBwb3N0LT5zdGFydGluZ19yb3cgKz0gcG9zdC0+c3RyaXBfaGVpZ2h0OworICAgIHBvc3QtPm5leHRfcm93ID0gMDsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2Vjb25kIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bvc3RfcHJvY2Vzc18ycGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OworICBKRElNRU5TSU9OIG51bV9yb3dzLCBtYXhfcm93czsKKworICAvKiBSZXBvc2l0aW9uIHZpcnR1YWwgYnVmZmVyIGlmIGF0IHN0YXJ0IG9mIHN0cmlwLiAqLworICBpZiAocG9zdC0+bmV4dF9yb3cgPT0gMCkgeworICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCisJIHBvc3QtPnN0YXJ0aW5nX3JvdywgcG9zdC0+c3RyaXBfaGVpZ2h0LCBGQUxTRSk7CisgIH0KKworICAvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIHJvd3MgdG8gZW1pdC4gKi8KKyAgbnVtX3Jvd3MgPSBwb3N0LT5zdHJpcF9oZWlnaHQgLSBwb3N0LT5uZXh0X3JvdzsgLyogYXZhaWxhYmxlIGluIHN0cmlwICovCisgIG1heF9yb3dzID0gb3V0X3Jvd3NfYXZhaWwgLSAqb3V0X3Jvd19jdHI7IC8qIGF2YWlsYWJsZSBpbiBvdXRwdXQgYXJlYSAqLworICBpZiAobnVtX3Jvd3MgPiBtYXhfcm93cykKKyAgICBudW1fcm93cyA9IG1heF9yb3dzOworICAvKiBXZSBoYXZlIHRvIGNoZWNrIGJvdHRvbSBvZiBpbWFnZSBoZXJlLCBjYW4ndCBkZXBlbmQgb24gdXBzYW1wbGVyLiAqLworICBtYXhfcm93cyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gcG9zdC0+c3RhcnRpbmdfcm93OworICBpZiAobnVtX3Jvd3MgPiBtYXhfcm93cykKKyAgICBudW1fcm93cyA9IG1heF9yb3dzOworCisgIC8qIFF1YW50aXplIGFuZCBlbWl0IGRhdGEuICovCisgICgqY2luZm8tPmNxdWFudGl6ZS0+Y29sb3JfcXVhbnRpemUpIChjaW5mbywKKwkJcG9zdC0+YnVmZmVyICsgcG9zdC0+bmV4dF9yb3csIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsCisJCShpbnQpIG51bV9yb3dzKTsKKyAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOworCisgIC8qIEFkdmFuY2UgaWYgd2UgZmlsbGVkIHRoZSBzdHJpcC4gKi8KKyAgcG9zdC0+bmV4dF9yb3cgKz0gbnVtX3Jvd3M7CisgIGlmIChwb3N0LT5uZXh0X3JvdyA+PSBwb3N0LT5zdHJpcF9oZWlnaHQpIHsKKyAgICBwb3N0LT5zdGFydGluZ19yb3cgKz0gcG9zdC0+c3RyaXBfaGVpZ2h0OworICAgIHBvc3QtPm5leHRfcm93ID0gMDsKKyAgfQorfQorCisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2RfcG9zdF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X3Bvc3RfcHRyIHBvc3Q7CisKKyAgcG9zdCA9IChteV9wb3N0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9wb3N0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPnBvc3QgPSAoc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgKikgcG9zdDsKKyAgcG9zdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2Rwb3N0OworICBwb3N0LT53aG9sZV9pbWFnZSA9IE5VTEw7CS8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCisgIHBvc3QtPmJ1ZmZlciA9IE5VTEw7CQkvKiBmbGFnIGZvciBubyBzdHJpcCBidWZmZXIgKi8KKworICAvKiBDcmVhdGUgdGhlIHF1YW50aXphdGlvbiBidWZmZXIsIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgIC8qIFRoZSBidWZmZXIgc3RyaXAgaGVpZ2h0IGlzIG1heF92X3NhbXBfZmFjdG9yLCB3aGljaCBpcyB0eXBpY2FsbHkKKyAgICAgKiBhbiBlZmZpY2llbnQgbnVtYmVyIG9mIHJvd3MgZm9yIHVwc2FtcGxpbmcgdG8gcmV0dXJuLgorICAgICAqIChJbiB0aGUgcHJlc2VuY2Ugb2Ygb3V0cHV0IHJlc2NhbGluZywgd2UgbWlnaHQgd2FudCB0byBiZSBzbWFydGVyPykKKyAgICAgKi8KKyAgICBwb3N0LT5zdHJpcF9oZWlnaHQgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7CisgICAgICAvKiBUd28tcGFzcyBjb2xvciBxdWFudGl6YXRpb246IG5lZWQgZnVsbC1pbWFnZSBzdG9yYWdlLiAqLworICAgICAgLyogV2Ugcm91bmQgdXAgdGhlIG51bWJlciBvZiByb3dzIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHN0cmlwIGhlaWdodC4gKi8KKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgICAgIHBvc3QtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodCwKKwkJCQkobG9uZykgcG9zdC0+c3RyaXBfaGVpZ2h0KSwKKwkgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE9uZS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbjoganVzdCBtYWtlIGEgc3RyaXAgYnVmZmVyLiAqLworICAgICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cywKKwkgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2pwZWcvamRzYW1wbGUuYyBiL2pwZWcvamRzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZmZWZiCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qZHNhbXBsZS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogamRzYW1wbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHVwc2FtcGxpbmcgcm91dGluZXMuCisgKgorICogVXBzYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgKHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplKQorICogc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBVcHNhbXBsaW5nIHdpbGwgbm9ybWFsbHkgcHJvZHVjZQorICogbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBmcm9tIGVhY2ggcm93IGdyb3VwIChidXQgdGhpcyBjb3VsZCB2YXJ5CisgKiBpZiB0aGUgdXBzYW1wbGVyIGlzIGFwcGx5aW5nIGEgc2NhbGUgZmFjdG9yIG9mIGl0cyBvd24pLgorICoKKyAqIEFuIGV4Y2VsbGVudCByZWZlcmVuY2UgZm9yIGltYWdlIHJlc2FtcGxpbmcgaXMKKyAqICAgRGlnaXRhbCBJbWFnZSBXYXJwaW5nLCBHZW9yZ2UgV29sYmVyZywgMTk5MC4KKyAqICAgUHViLiBieSBJRUVFIENvbXB1dGVyIFNvY2lldHkgUHJlc3MsIExvcyBBbGFtaXRvcywgQ0EuIElTQk4gMC04MTg2LTg5NDQtNy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUG9pbnRlciB0byByb3V0aW5lIHRvIHVwc2FtcGxlIGEgc2luZ2xlIGNvbXBvbmVudCAqLwordHlwZWRlZiBKTUVUSE9EKHZvaWQsIHVwc2FtcGxlMV9wdHIsCisJCShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikpOworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBDb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4gIFdoZW4gdXNpbmcgc2VwYXJhdGUgdXBzYW1wbGluZyBhbmQgY29sb3IKKyAgICogY29udmVyc2lvbiBzdGVwcywgdGhpcyBidWZmZXIgaG9sZHMgb25lIHVwc2FtcGxlZCByb3cgZ3JvdXAgdW50aWwgaXQKKyAgICogaGFzIGJlZW4gY29sb3IgY29udmVydGVkIGFuZCBvdXRwdXQuCisgICAqIE5vdGU6IHdlIGRvIG5vdCBhbGxvY2F0ZSBhbnkgc3RvcmFnZSBmb3IgY29tcG9uZW50KHMpIHdoaWNoIGFyZSBmdWxsLXNpemUsCisgICAqIGllIGRvIG5vdCBuZWVkIHJlc2NhbGluZy4gIFRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IG9mIGNvbG9yX2J1ZltdIGlzCisgICAqIHNpbXBseSBzZXQgdG8gcG9pbnQgdG8gdGhlIGlucHV0IGRhdGEgYXJyYXksIHRoZXJlYnkgYXZvaWRpbmcgY29weWluZy4KKyAgICovCisgIEpTQU1QQVJSQVkgY29sb3JfYnVmW01BWF9DT01QT05FTlRTXTsKKworICAvKiBQZXItY29tcG9uZW50IHVwc2FtcGxpbmcgbWV0aG9kIHBvaW50ZXJzICovCisgIHVwc2FtcGxlMV9wdHIgbWV0aG9kc1tNQVhfQ09NUE9ORU5UU107CisKKyAgaW50IG5leHRfcm93X291dDsJCS8qIGNvdW50cyByb3dzIGVtaXR0ZWQgZnJvbSBjb2xvcl9idWYgKi8KKyAgSkRJTUVOU0lPTiByb3dzX3RvX2dvOwkvKiBjb3VudHMgcm93cyByZW1haW5pbmcgaW4gaW1hZ2UgKi8KKworICAvKiBIZWlnaHQgb2YgYW4gaW5wdXQgcm93IGdyb3VwIGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAgaW50IHJvd2dyb3VwX2hlaWdodFtNQVhfQ09NUE9ORU5UU107CisKKyAgLyogVGhlc2UgYXJyYXlzIHNhdmUgcGl4ZWwgZXhwYW5zaW9uIGZhY3RvcnMgc28gdGhhdCBpbnRfZXhwYW5kIG5lZWQgbm90CisgICAqIHJlY29tcHV0ZSB0aGVtIGVhY2ggdGltZS4gIFRoZXkgYXJlIHVudXNlZCBmb3Igb3RoZXIgdXBzYW1wbGluZyBtZXRob2RzLgorICAgKi8KKyAgVUlOVDggaF9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOworICBVSU5UOCB2X2V4cGFuZFtNQVhfQ09NUE9ORU5UU107Cit9IG15X3Vwc2FtcGxlcjsKKwordHlwZWRlZiBteV91cHNhbXBsZXIgKiBteV91cHNhbXBsZV9wdHI7CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGFuIHVwc2FtcGxpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKworICAvKiBNYXJrIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciBlbXB0eSAqLworICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAvKiBJbml0aWFsaXplIHRvdGFsLWhlaWdodCBjb3VudGVyIGZvciBkZXRlY3RpbmcgYm90dG9tIG9mIGltYWdlICovCisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7Cit9CisKKworLyoKKyAqIENvbnRyb2wgcm91dGluZSB0byBkbyB1cHNhbXBsaW5nIChhbmQgY29sb3IgY29udmVyc2lvbikuCisgKgorICogSW4gdGhpcyB2ZXJzaW9uIHdlIHVwc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCisgKiBXZSB1cHNhbXBsZSBvbmUgcm93IGdyb3VwIGludG8gdGhlIGNvbnZlcnNpb24gYnVmZmVyLCB0aGVuIGFwcGx5CisgKiBjb2xvciBjb252ZXJzaW9uIGEgcm93IGF0IGEgdGltZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3NlcF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkgICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpESU1FTlNJT04gbnVtX3Jvd3M7CisKKyAgLyogRmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIsIGlmIGl0J3MgZW1wdHkgKi8KKyAgaWYgKHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPj0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICAvKiBJbnZva2UgcGVyLWNvbXBvbmVudCB1cHNhbXBsZSBtZXRob2QuICBOb3RpY2Ugd2UgcGFzcyBhIFBPSU5URVIKKyAgICAgICAqIHRvIGNvbG9yX2J1ZltjaV0sIHNvIHRoYXQgZnVsbHNpemVfdXBzYW1wbGUgY2FuIGNoYW5nZSBpdC4KKyAgICAgICAqLworICAgICAgKCp1cHNhbXBsZS0+bWV0aG9kc1tjaV0pIChjaW5mbywgY29tcHB0ciwKKwlpbnB1dF9idWZbY2ldICsgKCppbl9yb3dfZ3JvdXBfY3RyICogdXBzYW1wbGUtPnJvd2dyb3VwX2hlaWdodFtjaV0pLAorCXVwc2FtcGxlLT5jb2xvcl9idWYgKyBjaSk7CisgICAgfQorICAgIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPSAwOworICB9CisKKyAgLyogQ29sb3ItY29udmVydCBhbmQgZW1pdCByb3dzICovCisKKyAgLyogSG93IG1hbnkgd2UgaGF2ZSBpbiB0aGUgYnVmZmVyOiAqLworICBudW1fcm93cyA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC0gdXBzYW1wbGUtPm5leHRfcm93X291dCk7CisgIC8qIE5vdCBtb3JlIHRoYW4gdGhlIGRpc3RhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAgTmVlZCB0aGlzIHRlc3QKKyAgICogaW4gY2FzZSB0aGUgaW1hZ2UgaGVpZ2h0IGlzIG5vdCBhIG11bHRpcGxlIG9mIG1heF92X3NhbXBfZmFjdG9yOgorICAgKi8KKyAgaWYgKG51bV9yb3dzID4gdXBzYW1wbGUtPnJvd3NfdG9fZ28pIAorICAgIG51bV9yb3dzID0gdXBzYW1wbGUtPnJvd3NfdG9fZ287CisgIC8qIEFuZCBub3QgbW9yZSB0aGFuIHdoYXQgdGhlIGNsaWVudCBjYW4gYWNjZXB0OiAqLworICBvdXRfcm93c19hdmFpbCAtPSAqb3V0X3Jvd19jdHI7CisgIGlmIChudW1fcm93cyA+IG91dF9yb3dzX2F2YWlsKQorICAgIG51bV9yb3dzID0gb3V0X3Jvd3NfYXZhaWw7CisKKyAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgdXBzYW1wbGUtPmNvbG9yX2J1ZiwKKwkJCQkgICAgIChKRElNRU5TSU9OKSB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0LAorCQkJCSAgICAgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwKKwkJCQkgICAgIChpbnQpIG51bV9yb3dzKTsKKworICAvKiBBZGp1c3QgY291bnRzICovCisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKKyAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gLT0gbnVtX3Jvd3M7CisgIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgKz0gbnVtX3Jvd3M7CisgIC8qIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0aWVkLCBkZWNsYXJlIHRoaXMgaW5wdXQgcm93IGdyb3VwIGNvbnN1bWVkICovCisgIGlmICh1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID49IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikKKyAgICAoKmluX3Jvd19ncm91cF9jdHIpKys7Cit9CisKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcm91dGluZXMgaW52b2tlZCBieSBzZXBfdXBzYW1wbGUgdG8gdXBzYW1wbGUgcGl4ZWwgdmFsdWVzCisgKiBvZiBhIHNpbmdsZSBjb21wb25lbnQuICBPbmUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBwZXIgY2FsbC4KKyAqLworCisKKy8qCisgKiBGb3IgZnVsbC1zaXplIGNvbXBvbmVudHMsIHdlIGp1c3QgbWFrZSBjb2xvcl9idWZbY2ldIHBvaW50IGF0IHRoZQorICogaW5wdXQgYnVmZmVyLCBhbmQgdGh1cyBhdm9pZCBjb3B5aW5nIGFueSBkYXRhLiAgTm90ZSB0aGF0IHRoaXMgaXMKKyAqIHNhZmUgb25seSBiZWNhdXNlIHNlcF91cHNhbXBsZSBkb2Vzbid0IGRlY2xhcmUgdGhlIGlucHV0IHJvdyBncm91cAorICogImNvbnN1bWVkIiB1bnRpbCB3ZSBhcmUgZG9uZSBjb2xvciBjb252ZXJ0aW5nIGFuZCBlbWl0dGluZyBpdC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2Z1bGxzaXplX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICAqb3V0cHV0X2RhdGFfcHRyID0gaW5wdXRfZGF0YTsKK30KKworCisvKgorICogVGhpcyBpcyBhIG5vLW9wIHZlcnNpb24gdXNlZCBmb3IgInVuaW50ZXJlc3RpbmciIGNvbXBvbmVudHMuCisgKiBUaGVzZSBjb21wb25lbnRzIHdpbGwgbm90IGJlIHJlZmVyZW5jZWQgYnkgY29sb3IgY29udmVyc2lvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK25vb3BfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgICpvdXRwdXRfZGF0YV9wdHIgPSBOVUxMOwkvKiBzYWZldHkgY2hlY2sgKi8KK30KKworCisvKgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgYW55IGludGVncmFsIHNhbXBsaW5nIHJhdGlvcy4KKyAqIFRoaXMgaXMgbm90IHVzZWQgZm9yIHR5cGljYWwgSlBFRyBmaWxlcywgc28gaXQgbmVlZCBub3QgYmUgZmFzdC4KKyAqIE5vciwgZm9yIHRoYXQgbWF0dGVyLCBpcyBpdCBwYXJ0aWN1bGFybHkgYWNjdXJhdGU6IHRoZSBhbGdvcml0aG0gaXMKKyAqIHNpbXBsZSByZXBsaWNhdGlvbiBvZiB0aGUgaW5wdXQgcGl4ZWwgb250byB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKKyAqIHBpeGVscy4gIFRoZSBoaS1mYWx1dGluIHNhbXBsaW5nIGxpdGVyYXR1cmUgcmVmZXJzIHRvIHRoaXMgYXMgYQorICogImJveCBmaWx0ZXIiLiAgQSBib3ggZmlsdGVyIHRlbmRzIHRvIGludHJvZHVjZSB2aXNpYmxlIGFydGlmYWN0cywKKyAqIHNvIGlmIHlvdSBhcmUgYWN0dWFsbHkgZ29pbmcgdG8gdXNlIDM6MSBvciA0OjEgc2FtcGxpbmcgcmF0aW9zCisgKiB5b3Ugd291bGQgYmUgd2VsbCBhZHZpc2VkIHRvIGltcHJvdmUgdGhpcyBjb2RlLgorICovCisKK01FVEhPRERFRih2b2lkKQoraW50X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKKyAgcmVnaXN0ZXIgaW50IGg7CisgIEpTQU1QUk9XIG91dGVuZDsKKyAgaW50IGhfZXhwYW5kLCB2X2V4cGFuZDsKKyAgaW50IGlucm93LCBvdXRyb3c7CisKKyAgaF9leHBhbmQgPSB1cHNhbXBsZS0+aF9leHBhbmRbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKyAgdl9leHBhbmQgPSB1cHNhbXBsZS0+dl9leHBhbmRbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKworICBpbnJvdyA9IG91dHJvdyA9IDA7CisgIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAvKiBHZW5lcmF0ZSBvbmUgb3V0cHV0IHJvdyB3aXRoIHByb3BlciBob3Jpem9udGFsIGV4cGFuc2lvbiAqLworICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKKyAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOworICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKKyAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgZm9yIChoID0gaF9leHBhbmQ7IGggPiAwOyBoLS0pIHsKKwkqb3V0cHRyKysgPSBpbnZhbHVlOworICAgICAgfQorICAgIH0KKyAgICAvKiBHZW5lcmF0ZSBhbnkgYWRkaXRpb25hbCBvdXRwdXQgcm93cyBieSBkdXBsaWNhdGluZyB0aGUgZmlyc3Qgb25lICovCisgICAgaWYgKHZfZXhwYW5kID4gMSkgeworICAgICAgamNvcHlfc2FtcGxlX3Jvd3Mob3V0cHV0X2RhdGEsIG91dHJvdywgb3V0cHV0X2RhdGEsIG91dHJvdysxLAorCQkJdl9leHBhbmQtMSwgY2luZm8tPm91dHB1dF93aWR0aCk7CisgICAgfQorICAgIGlucm93Kys7CisgICAgb3V0cm93ICs9IHZfZXhwYW5kOworICB9Cit9CisKKworLyoKKyAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCisgKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjFfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIEpTQU1QUk9XIG91dGVuZDsKKyAgaW50IGlucm93OworCisgIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgeworICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOworICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgeworICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogRmFzdCBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KKyAqIEl0J3Mgc3RpbGwgYSBib3ggZmlsdGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKKyAgSlNBTVBST1cgb3V0ZW5kOworICBpbnQgaW5yb3csIG91dHJvdzsKKworICBpbnJvdyA9IG91dHJvdyA9IDA7CisgIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKKyAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7CisgICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7CisgICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOworICAgIH0KKyAgICBqY29weV9zYW1wbGVfcm93cyhvdXRwdXRfZGF0YSwgb3V0cm93LCBvdXRwdXRfZGF0YSwgb3V0cm93KzEsCisJCSAgICAgIDEsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOworICAgIGlucm93Kys7CisgICAgb3V0cm93ICs9IDI7CisgIH0KK30KKworCisvKgorICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCisgKgorICogVGhlIHVwc2FtcGxpbmcgYWxnb3JpdGhtIGlzIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gcGl4ZWwgY2VudGVycywKKyAqIGFsc28ga25vd24gYXMgYSAidHJpYW5nbGUgZmlsdGVyIi4gIFRoaXMgaXMgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbgorICogc3BlZWQgYW5kIHZpc3VhbCBxdWFsaXR5LiAgVGhlIGNlbnRlcnMgb2YgdGhlIG91dHB1dCBwaXhlbHMgYXJlIDEvNCBhbmQgMy80CisgKiBvZiB0aGUgd2F5IGJldHdlZW4gaW5wdXQgcGl4ZWwgY2VudGVycy4KKyAqCisgKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KKyAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KKyAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCisgKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKKyAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGludmFsdWU7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sY3RyOworICBpbnQgaW5yb3c7CisKKyAgZm9yIChpbnJvdyA9IDA7IGlucm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOyBpbnJvdysrKSB7CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtpbnJvd107CisgICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KKyAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgKm91dHB0cisrID0gKEpTQU1QTEUpIGludmFsdWU7CisgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cikgKyAyKSA+PiAyKTsKKworICAgIGZvciAoY29sY3RyID0gY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgeworICAgICAgLyogR2VuZXJhbCBjYXNlOiAzLzQgKiBuZWFyZXIgcGl4ZWwgKyAxLzQgKiBmdXJ0aGVyIHBpeGVsICovCisgICAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgKiAzOworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSArIEdFVEpTQU1QTEUoaW5wdHJbLTJdKSArIDEpID4+IDIpOworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSArIEdFVEpTQU1QTEUoKmlucHRyKSArIDIpID4+IDIpOworICAgIH0KKworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KKyAgICBpbnZhbHVlID0gR0VUSlNBTVBMRSgqaW5wdHIpOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKiAzICsgR0VUSlNBTVBMRShpbnB0clstMV0pICsgMSkgPj4gMik7CisgICAgKm91dHB0cisrID0gKEpTQU1QTEUpIGludmFsdWU7CisgIH0KK30KKworCisvKgorICogRmFuY3kgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCisgKiBBZ2FpbiBhIHRyaWFuZ2xlIGZpbHRlcjsgc2VlIGNvbW1lbnRzIGZvciBoMnYxIGNhc2UsIGFib3ZlLgorICoKKyAqIEl0IGlzIE9LIGZvciB1cyB0byByZWZlcmVuY2UgdGhlIGFkamFjZW50IGlucHV0IHJvd3MgYmVjYXVzZSB3ZSBkZW1hbmRlZAorICogY29udGV4dCBmcm9tIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIChzZWUgaW5pdGlhbGl6YXRpb24gY29kZSkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX2ZhbmN5X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgb3V0cHRyOworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisgIHJlZ2lzdGVyIGludCB0aGlzY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOworI2Vsc2UKKyAgcmVnaXN0ZXIgSU5UMzIgdGhpc2NvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKKyNlbmRpZgorICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKKyAgaW50IGlucm93LCBvdXRyb3csIHY7CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgZm9yICh2ID0gMDsgdiA8IDI7IHYrKykgeworICAgICAgLyogaW5wdHIwIHBvaW50cyB0byBuZWFyZXN0IGlucHV0IHJvdywgaW5wdHIxIHBvaW50cyB0byBuZXh0IG5lYXJlc3QgKi8KKyAgICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgICAgaWYgKHYgPT0gMCkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYWJvdmUgKi8KKwlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgICAgZWxzZQkJCS8qIG5leHQgbmVhcmVzdCBpcyByb3cgYmVsb3cgKi8KKwlpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOworICAgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93KytdOworCisgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLworICAgICAgdGhpc2NvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBuZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiA0ICsgOCkgPj4gNCk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIG5leHRjb2xzdW0gKyA3KSA+PiA0KTsKKyAgICAgIGxhc3Rjb2xzdW0gPSB0aGlzY29sc3VtOyB0aGlzY29sc3VtID0gbmV4dGNvbHN1bTsKKworICAgICAgZm9yIChjb2xjdHIgPSBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7CisJLyogR2VuZXJhbCBjYXNlOiAzLzQgKiBuZWFyZXIgcGl4ZWwgKyAxLzQgKiBmdXJ0aGVyIHBpeGVsIGluIGVhY2ggKi8KKwkvKiBkaW1lbnNpb24sIHRodXMgOS8xNiwgMy8xNiwgMy8xNiwgMS8xNiBvdmVyYWxsICovCisJbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7CisJKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBsYXN0Y29sc3VtICsgOCkgPj4gNCk7CisJKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBuZXh0Y29sc3VtICsgNykgPj4gNCk7CisJbGFzdGNvbHN1bSA9IHRoaXNjb2xzdW07IHRoaXNjb2xzdW0gPSBuZXh0Y29sc3VtOworICAgICAgfQorCisgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIGxhc3Rjb2xzdW0gKyA4KSA+PiA0KTsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiA0ICsgNykgPj4gNCk7CisgICAgfQorICAgIGlucm93Kys7CisgIH0KK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHVwc2FtcGxpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF91cHNhbXBsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZTsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgYm9vbGVhbiBuZWVkX2J1ZmZlciwgZG9fZmFuY3k7CisgIGludCBoX2luX2dyb3VwLCB2X2luX2dyb3VwLCBoX291dF9ncm91cCwgdl9vdXRfZ3JvdXA7CisKKyAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X3Vwc2FtcGxlcikpOworICBjaW5mby0+dXBzYW1wbGUgPSAoc3RydWN0IGpwZWdfdXBzYW1wbGVyICopIHVwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3Vwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gc2VwX3Vwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7IC8qIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCisKKyAgaWYgKGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQkvKiB0aGlzIGlzbid0IHN1cHBvcnRlZCAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0NJUjYwMV9OT1RJTVBMKTsKKworICAvKiBqZG1haW5jdC5jIGRvZXNuJ3Qgc3VwcG9ydCBjb250ZXh0IHJvd3Mgd2hlbiBtaW5fRENUX3NjYWxlZF9zaXplID0gMSwKKyAgICogc28gZG9uJ3QgYXNrIGZvciBpdC4KKyAgICovCisgIGRvX2ZhbmN5ID0gY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgJiYgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPiAxOworCisgIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBzZWxlY3QgcGVyLWNvbXBvbmVudCBtZXRob2RzLAorICAgKiBhbmQgY3JlYXRlIHN0b3JhZ2UgYXMgbmVlZGVkLgorICAgKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBDb21wdXRlIHNpemUgb2YgYW4gImlucHV0IGdyb3VwIiBhZnRlciBJRENUIHNjYWxpbmcuICBUaGlzIG1hbnkgc2FtcGxlcworICAgICAqIGFyZSB0byBiZSBjb252ZXJ0ZWQgdG8gbWF4X2hfc2FtcF9mYWN0b3IgKiBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbHMuCisgICAgICovCisgICAgaF9pbl9ncm91cCA9IChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisJCSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICB2X2luX2dyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKwkJIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAgIGhfb3V0X2dyb3VwID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yOworICAgIHZfb3V0X2dyb3VwID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIHVwc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldID0gdl9pbl9ncm91cDsgLyogc2F2ZSBmb3IgdXNlIGxhdGVyICovCisgICAgbmVlZF9idWZmZXIgPSBUUlVFOworICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKKyAgICAgIC8qIERvbid0IGJvdGhlciB0byB1cHNhbXBsZSBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IG5vb3BfdXBzYW1wbGU7CisgICAgICBuZWVkX2J1ZmZlciA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCA9PSBoX291dF9ncm91cCAmJiB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7CisgICAgICAvKiBGdWxsc2l6ZSBjb21wb25lbnRzIGNhbiBiZSBwcm9jZXNzZWQgd2l0aG91dCBhbnkgd29yay4gKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX3Vwc2FtcGxlOworICAgICAgbmVlZF9idWZmZXIgPSBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgKiAyID09IGhfb3V0X2dyb3VwICYmCisJICAgICAgIHZfaW5fZ3JvdXAgPT0gdl9vdXRfZ3JvdXApIHsKKyAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMXYgdXBzYW1wbGluZyAqLworICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX2ZhbmN5X3Vwc2FtcGxlOworICAgICAgZWxzZQorCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfdXBzYW1wbGU7CisgICAgfSBlbHNlIGlmIChoX2luX2dyb3VwICogMiA9PSBoX291dF9ncm91cCAmJgorCSAgICAgICB2X2luX2dyb3VwICogMiA9PSB2X291dF9ncm91cCkgeworICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgMmgydiB1cHNhbXBsaW5nICovCisgICAgICBpZiAoZG9fZmFuY3kgJiYgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPiAyKSB7CisJdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9mYW5jeV91cHNhbXBsZTsKKwl1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKKyAgICAgIH0gZWxzZQorCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfdXBzYW1wbGU7CisgICAgfSBlbHNlIGlmICgoaF9vdXRfZ3JvdXAgJSBoX2luX2dyb3VwKSA9PSAwICYmCisJICAgICAgICh2X291dF9ncm91cCAlIHZfaW5fZ3JvdXApID09IDApIHsKKyAgICAgIC8qIEdlbmVyaWMgaW50ZWdyYWwtZmFjdG9ycyB1cHNhbXBsaW5nIG1ldGhvZCAqLworICAgICAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X3Vwc2FtcGxlOworICAgICAgdXBzYW1wbGUtPmhfZXhwYW5kW2NpXSA9IChVSU5UOCkgKGhfb3V0X2dyb3VwIC8gaF9pbl9ncm91cCk7CisgICAgICB1cHNhbXBsZS0+dl9leHBhbmRbY2ldID0gKFVJTlQ4KSAodl9vdXRfZ3JvdXAgLyB2X2luX2dyb3VwKTsKKyAgICB9IGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwpOworICAgIGlmIChuZWVkX2J1ZmZlcikgeworICAgICAgdXBzYW1wbGUtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLAorCQkJCShsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2pwZWcvamR0cmFucy5jIGIvanBlZy9qZHRyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2OTA5YwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamR0cmFucy5jCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogamR0cmFucy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgZGVjb21wcmVzc2lvbiwKKyAqIHRoYXQgaXMsIHJlYWRpbmcgcmF3IERDVCBjb2VmZmljaWVudCBhcnJheXMgZnJvbSBhbiBpbnB1dCBKUEVHIGZpbGUuCisgKiBUaGUgcm91dGluZXMgaW4gamRhcGltaW4uYyB3aWxsIGFsc28gYmUgbmVlZGVkIGJ5IGEgdHJhbnNjb2Rlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK0xPQ0FMKHZvaWQpIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24gSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKworLyoKKyAqIFJlYWQgdGhlIGNvZWZmaWNpZW50IGFycmF5cyBmcm9tIGEgSlBFRyBmaWxlLgorICoganBlZ19yZWFkX2hlYWRlciBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzLgorICoKKyAqIFRoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbnRvIGEgc2V0IG9mIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLAorICogb25lIHBlciBjb21wb25lbnQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YKKyAqIHZpcnR1YWwtYXJyYXkgZGVzY3JpcHRvcnMuICBUaGVzZSBjYW4gYmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgdmlhIHRoZQorICogSlBFRyBtZW1vcnkgbWFuYWdlciwgb3IgaGFuZGVkIG9mZiB0byBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgorICogVG8gcmVsZWFzZSB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSB2aXJ0dWFsIGFycmF5cywgY2FsbAorICoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHdoZW4gZG9uZSB3aXRoIHRoZSBkYXRhLgorICoKKyAqIEFuIGFsdGVybmF0aXZlIHVzYWdlIGlzIHRvIHNpbXBseSBvYnRhaW4gYWNjZXNzIHRvIHRoZSBjb2VmZmljaWVudCBhcnJheXMKKyAqIGR1cmluZyBhIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24uICBUaGlzIGlzIGFsbG93ZWQKKyAqIGFmdGVyIGFueSBqcGVnX2ZpbmlzaF9vdXRwdXQoKSBjYWxsLiAgVGhlIGFycmF5cyBjYW4gYmUgYWNjZXNzZWQgdW50aWwKKyAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBpcyBjYWxsZWQuICAoTm90ZSB0aGF0IGFueSBjYWxsIHRvIHRoZSBsaWJyYXJ5CisgKiBtYXkgcmVwb3NpdGlvbiB0aGUgYXJyYXlzLCBzbyBkb24ndCByZWx5IG9uIGFjY2Vzc192aXJ0X2JhcnJheSgpIHJlc3VsdHMKKyAqIHRvIHN0YXkgdmFsaWQgYWNyb3NzIGxpYnJhcnkgY2FsbHMuKQorICoKKyAqIFJldHVybnMgTlVMTCBpZiBzdXNwZW5kZWQuICBUaGlzIGNhc2UgbmVlZCBiZSBjaGVja2VkIG9ubHkgaWYKKyAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgorICovCisKK0dMT0JBTChqdmlydF9iYXJyYXlfcHRyICopCitqcGVnX3JlYWRfY29lZmZpY2llbnRzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKKyAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIGFjdGl2ZSBtb2R1bGVzICovCisgICAgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRENPRUZTOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRENPRUZTKSB7CisgICAgLyogQWJzb3JiIHdob2xlIGZpbGUgaW50byB0aGUgY29lZiBidWZmZXIgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICBpbnQgcmV0Y29kZTsKKyAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICAgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICAvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfRU9JKQorICAgICAgICBicmVhazsKKyAgICAgIC8qIEFkdmFuY2UgcHJvZ3Jlc3MgY291bnRlciBpZiBhcHByb3ByaWF0ZSAqLworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmCisJICAocmV0Y29kZSA9PSBKUEVHX1JPV19DT01QTEVURUQgfHwgcmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfU09TKSkgeworICAgICAgICBpZiAoKytjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA+PSBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQpIHsKKwkgIC8qIHN0YXJ0dXAgdW5kZXJlc3RpbWF0ZWQgbnVtYmVyIG9mIHNjYW5zOyByYXRjaGV0IHVwIG9uZSBzY2FuICovCisgICAgICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBTZXQgc3RhdGUgc28gdGhhdCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nICovCisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKKyAgfQorICAvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBiZSBpbiBzdGF0ZSBEU1RBVEVfU1RPUFBJTkcgaWYgYmVpbmcgdXNlZAorICAgKiBzdGFuZGFsb25lLCBvciBpbiBzdGF0ZSBEU1RBVEVfQlVGSU1BR0UgaWYgYmVpbmcgaW52b2tlZCB0byBnZXQgYWNjZXNzCisgICAqIHRvIHRoZSBjb2VmZmljaWVudHMgZHVyaW5nIGEgZnVsbCBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24uCisgICAqLworICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NUT1BQSU5HIHx8CisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpICYmIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIHJldHVybiBjaW5mby0+Y29lZi0+Y29lZl9hcnJheXM7CisgIH0KKyAgLyogT29wcywgaW1wcm9wZXIgdXNhZ2UgKi8KKyAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIE5VTEw7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLworfQorCitMT0NBTChib29sZWFuKQoranBlZ19idWlsZF9odWZmbWFuX2luZGV4X3Byb2dyZXNzaXZlKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4KQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKKyAgICBwcmludGYoIlByb2dyZXNzaXZlIE1vZGVcbiIpOworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgYWN0aXZlIG1vZHVsZXMgKi8KKyAgICB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JEQ09FRlM7CisgIH0KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JEQ09FRlMpIHsKKyAgICBpbnQgbWN1LCBpOworICAgIGNpbmZvLT5tYXJrZXItPmdldF9zb3NfbWFya2VyX3Bvc2l0aW9uKGNpbmZvLCBpbmRleCk7CisKKyAgICAvKiBBYnNvcmIgd2hvbGUgZmlsZSBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLworICAgIGZvciAobWN1ID0gMDsgbWN1IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsgbWN1KyspIHsKKyAgICAgIGludCByZXRjb2RlID0gMDsKKyAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICAgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICAvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisgICAgICBqaW5pdF9waHVmZl9kZWNvZGVyKGNpbmZvKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRleC0+c2Nhbl9jb3VudDsgaSsrKSB7CisgICAgICAgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgICAgICAganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8sIGluZGV4LT5zY2FuW2ldLmJpdHN0cmVhbV9vZmZzZXQpOworICAgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgICAgICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4KQorICAgICAgICAgICAgICAgICAgICAoY2luZm8sIGluZGV4LCBpKTsKKyAgICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gbWN1OworICAgICAgICBpZiAobWN1ICE9IDApCisgICAgICAgICAgKCpjaW5mby0+ZW50cm9weS0+Y29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcikKKyAgICAgICAgICAgICAgICAoY2luZm8sIGluZGV4LT5zY2FuW2ldLnByZXZfTUNVX29mZnNldCk7CisgICAgICAgIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9IGk7CisgICAgICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4KQorICAgICAgICAgICAgICAgICAgICAoY2luZm8sIGluZGV4LCBpKTsKKyAgICAgIH0KKyAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfRU9JKQorICAgICAgICBicmVhazsKKyAgICAgIC8qIEFkdmFuY2UgcHJvZ3Jlc3MgY291bnRlciBpZiBhcHByb3ByaWF0ZSAqLworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmCisJICAocmV0Y29kZSA9PSBKUEVHX1JPV19DT01QTEVURUQgfHwgcmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfU09TKSkgeworICAgICAgICBpZiAoKytjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA+PSBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQpIHsKKwkgIC8qIHN0YXJ0dXAgdW5kZXJlc3RpbWF0ZWQgbnVtYmVyIG9mIHNjYW5zOyByYXRjaGV0IHVwIG9uZSBzY2FuICovCisgICAgICAgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7CisgIH0KKyAgLyogQXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgYmUgaW4gc3RhdGUgRFNUQVRFX1NUT1BQSU5HIGlmIGJlaW5nIHVzZWQKKyAgICogc3RhbmRhbG9uZSwgb3IgaW4gc3RhdGUgRFNUQVRFX0JVRklNQUdFIGlmIGJlaW5nIGludm9rZWQgdG8gZ2V0IGFjY2VzcworICAgKiB0byB0aGUgY29lZmZpY2llbnRzIGR1cmluZyBhIGZ1bGwgYnVmZmVyZWQtaW1hZ2UtbW9kZSBkZWNvbXByZXNzaW9uLgorICAgKi8KKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TVE9QUElORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSAmJiBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAvKiBPb3BzLCBpbXByb3BlciB1c2FnZSAqLworICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICByZXR1cm4gRkFMU0U7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLworfQorCitMT0NBTChib29sZWFuKQoranBlZ19idWlsZF9odWZmbWFuX2luZGV4X2Jhc2VsaW5lKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4KQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKKyAgICBwcmludGYoIkJhc2VsaW5lIE1vZGVcbiIpOworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgYWN0aXZlIG1vZHVsZXMgKi8KKyAgICB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JEQ09FRlM7CisgIH0KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JEQ09FRlMpIHsKKyAgICAvKiBBYnNvcmIgd2hvbGUgZmlsZSBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLworICAgIGZvciAoOzspIHsKKyAgICAgIGludCByZXRjb2RlOworICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKQorICAgICAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIC8qIEFic29yYiBzb21lIG1vcmUgaW5wdXQgKi8KKyAgICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4KQorICAgICAgICAgICAgICAgICAgICAoY2luZm8sIGluZGV4LCAwKTsKKyAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfRU9JKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfU0NBTl9DT01QTEVURUQpCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgorCSAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKyAgICAgICAgaWYgKCsrY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPj0gY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0KSB7CisJICAvKiBzdGFydHVwIHVuZGVyZXN0aW1hdGVkIG51bWJlciBvZiBzY2FuczsgcmF0Y2hldCB1cCBvbmUgc2NhbiAqLworICAgICAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgKz0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogU2V0IHN0YXRlIHNvIHRoYXQganBlZ19maW5pc2hfZGVjb21wcmVzcyBkb2VzIHRoZSByaWdodCB0aGluZyAqLworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7CisgIH0KKyAgLyogQXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgYmUgaW4gc3RhdGUgRFNUQVRFX1NUT1BQSU5HIGlmIGJlaW5nIHVzZWQKKyAgICogc3RhbmRhbG9uZSwgb3IgaW4gc3RhdGUgRFNUQVRFX0JVRklNQUdFIGlmIGJlaW5nIGludm9rZWQgdG8gZ2V0IGFjY2VzcworICAgKiB0byB0aGUgY29lZmZpY2llbnRzIGR1cmluZyBhIGZ1bGwgYnVmZmVyZWQtaW1hZ2UtbW9kZSBkZWNvbXByZXNzaW9uLgorICAgKi8KKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TVE9QUElORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSAmJiBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAvKiBPb3BzLCBpbXByb3BlciB1c2FnZSAqLworICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICByZXR1cm4gRkFMU0U7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLworfQorCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfYnVpbGRfaHVmZm1hbl9pbmRleChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkKK3sKKyAgICBjaW5mby0+dGlsZV9kZWNvZGUgPSBUUlVFOworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKyAgICAgIHJldHVybiBqcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXhfcHJvZ3Jlc3NpdmUoY2luZm8sIGluZGV4KTsKKyAgICBlbHNlCisgICAgICByZXR1cm4ganBlZ19idWlsZF9odWZmbWFuX2luZGV4X2Jhc2VsaW5lKGNpbmZvLCBpbmRleCk7Cit9CisKKy8qCisgKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGRlY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqZG1hc3Rlci5jJ3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZ1bGwgZGVjb21wcmVzc29yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgYnVmZmVyZWQtaW1hZ2Ugb3BlcmF0aW9uLiAqLworICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBUUlVFOworCisgIC8qIEVudHJvcHkgZGVjb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgICBqaW5pdF9waHVmZl9kZWNvZGVyKGNpbmZvKTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKKyAgICB9CisgIH0KKworICAvKiBBbHdheXMgZ2V0IGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIuICovCisgIGppbml0X2RfY29lZl9jb250cm9sbGVyKGNpbmZvLCBUUlVFKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogSW5pdGlhbGl6ZSBpbnB1dCBzaWRlIG9mIGRlY29tcHJlc3NvciB0byBjb25zdW1lIGZpcnN0IHNjYW4uICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5zdGFydF9pbnB1dF9wYXNzKSAoY2luZm8pOworCisgIC8qIEluaXRpYWxpemUgcHJvZ3Jlc3MgbW9uaXRvcmluZy4gKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgaW50IG5zY2FuczsKKyAgICAvKiBFc3RpbWF0ZSBudW1iZXIgb2Ygc2NhbnMgdG8gc2V0IHBhc3NfbGltaXQuICovCisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBBcmJpdHJhcmlseSBlc3RpbWF0ZSAyIGludGVybGVhdmVkIERDIHNjYW5zICsgMyBBQyBzY2Fucy9jb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSAyICsgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zKSB7CisgICAgICAvKiBGb3IgYSBub25wcm9ncmVzc2l2ZSBtdWx0aXNjYW4gZmlsZSwgZXN0aW1hdGUgMSBzY2FuIHBlciBjb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgfSBlbHNlIHsKKyAgICAgIG5zY2FucyA9IDE7CisgICAgfQorICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gMEw7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBuc2NhbnM7CisgICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gMDsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IDE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pwZWcvamVycm9yLmMgYi9qcGVnL2plcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTdiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2plcnJvci5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogamVycm9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgZXJyb3ItcmVwb3J0aW5nIGFuZCB0cmFjZS1tZXNzYWdlIHJvdXRpbmVzLgorICogVGhlc2UgYXJlIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyBhbmQgb3RoZXJzIHdoZXJlIHdyaXRpbmcgdG8KKyAqIHN0ZGVyciBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIHdhbnQgdG8gcmVwbGFjZQorICogc29tZSBvciBhbGwgb2YgdGhlc2Ugcm91dGluZXMuCisgKgorICogSWYgeW91IGRlZmluZSBVU0VfV0lORE9XU19NRVNTQUdFQk9YIGluIGpjb25maWcuaCBvciBpbiB0aGUgbWFrZWZpbGUsCisgKiB5b3UgZ2V0IGEgV2luZG93cy1zcGVjaWZpYyBoYWNrIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMgaW4gYSBkaWFsb2cgYm94LgorICogSXQgYWluJ3QgbXVjaCwgYnV0IGl0IGJlYXRzIGRyb3BwaW5nIGVycm9yIG1lc3NhZ2VzIGludG8gdGhlIGJpdCBidWNrZXQsCisgKiB3aGljaCBpcyB3aGF0IGhhcHBlbnMgdG8gb3V0cHV0IHRvIHN0ZGVyciB1bmRlciBtb3N0IFdpbmRvd3MgQyBjb21waWxlcnMuCisgKgorICogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgYm90aCB0aGUgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZS4KKyAqLworCisvKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAianZlcnNpb24uaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIKKworI2lmZGVmIFVTRV9XSU5ET1dTX01FU1NBR0VCT1gKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCisjZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQorI2VuZGlmCisKKworLyoKKyAqIENyZWF0ZSB0aGUgbWVzc2FnZSBzdHJpbmcgdGFibGUuCisgKiBXZSBkbyB0aGlzIGZyb20gdGhlIG1hc3RlciBtZXNzYWdlIGxpc3QgaW4gamVycm9yLmggYnkgcmUtcmVhZGluZworICogamVycm9yLmggd2l0aCBhIHN1aXRhYmxlIGRlZmluaXRpb24gZm9yIG1hY3JvIEpNRVNTQUdFLgorICogVGhlIG1lc3NhZ2UgdGFibGUgaXMgbWFkZSBhbiBleHRlcm5hbCBzeW1ib2wganVzdCBpbiBjYXNlIGFueSBhcHBsaWNhdGlvbnMKKyAqIHdhbnQgdG8gcmVmZXIgdG8gaXQgZGlyZWN0bHkuCisgKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19zdGRfbWVzc2FnZV90YWJsZQlqTXNnVGFibGUKKyNlbmRpZgorCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQlzdHJpbmcgLAorCitjb25zdCBjaGFyICogY29uc3QganBlZ19zdGRfbWVzc2FnZV90YWJsZVtdID0geworI2luY2x1ZGUgImplcnJvci5oIgorICBOVUxMCit9OworCisKKy8qCisgKiBFcnJvciBleGl0IGhhbmRsZXI6IG11c3Qgbm90IHJldHVybiB0byBjYWxsZXIuCisgKgorICogQXBwbGljYXRpb25zIG1heSBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2FudCB0byBnZXQgY29udHJvbCBiYWNrIGFmdGVyCisgKiBhbiBlcnJvci4gIFR5cGljYWxseSBvbmUgd291bGQgbG9uZ2ptcCBzb21ld2hlcmUgaW5zdGVhZCBvZiBleGl0aW5nLgorICogVGhlIHNldGptcCBidWZmZXIgY2FuIGJlIG1hZGUgYSBwcml2YXRlIGZpZWxkIHdpdGhpbiBhbiBleHBhbmRlZCBlcnJvcgorICogaGFuZGxlciBvYmplY3QuICBOb3RlIHRoYXQgdGhlIGluZm8gbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UKKyAqIGlzIHN0b3JlZCBpbiB0aGUgZXJyb3Igb2JqZWN0LCBzbyB5b3UgY2FuIGdlbmVyYXRlIHRoZSBtZXNzYWdlIG5vdyBvcgorICogbGF0ZXIsIGF0IHlvdXIgY29udmVuaWVuY2UuCisgKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwICh3aXRoIGpwZWdfYWJvcnQKKyAqIG9yIGpwZWdfZGVzdHJveSkgYXQgc29tZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2Vycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogQWx3YXlzIGRpc3BsYXkgdGhlIG1lc3NhZ2UgKi8KKyAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKKworICAvKiBMZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllICovCisgIGpwZWdfZGVzdHJveShjaW5mbyk7CisKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKKy8qCisgKiBBY3R1YWwgb3V0cHV0IG9mIGFuIGVycm9yIG9yIHRyYWNlIG1lc3NhZ2UuCisgKiBBcHBsaWNhdGlvbnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHNlbmQgSlBFRyBtZXNzYWdlcyBzb21ld2hlcmUKKyAqIG90aGVyIHRoYW4gc3RkZXJyLgorICoKKyAqIE9uIFdpbmRvd3MsIHByaW50aW5nIHRvIHN0ZGVyciBpcyBnZW5lcmFsbHkgY29tcGxldGVseSB1c2VsZXNzLAorICogc28gd2UgcHJvdmlkZSBvcHRpb25hbCBjb2RlIHRvIHByb2R1Y2UgYW4gZXJyb3ItZGlhbG9nIHBvcHVwLgorICogTW9zdCBXaW5kb3dzIGFwcGxpY2F0aW9ucyB3aWxsIHN0aWxsIHByZWZlciB0byBvdmVycmlkZSB0aGlzIHJvdXRpbmUsCisgKiBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgZG8gc29tZXRoaW5nIGF0IGxlYXN0IG1hcmdpbmFsbHkgdXNlZnVsLgorICoKKyAqIE5PVEU6IHRvIHVzZSB0aGUgbGlicmFyeSBpbiBhbiBlbnZpcm9ubWVudCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKKyAqIEMgc3RkaW8gbGlicmFyeSwgeW91IG1heSBoYXZlIHRvIGRlbGV0ZSB0aGUgY2FsbCB0byBmcHJpbnRmKCkgZW50aXJlbHksCisgKiBub3QganVzdCBub3QgdXNlIHRoaXMgcm91dGluZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK291dHB1dF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIGNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKyAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCisgICgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpIChjaW5mbywgYnVmZmVyKTsKKworI2lmZGVmIFVTRV9XSU5ET1dTX01FU1NBR0VCT1gKKyAgLyogRGlzcGxheSBpdCBpbiBhIG1lc3NhZ2UgZGlhbG9nIGJveCAqLworICBNZXNzYWdlQm94KEdldEFjdGl2ZVdpbmRvdygpLCBidWZmZXIsICJKUEVHIExpYnJhcnkgRXJyb3IiLAorCSAgICAgTUJfT0sgfCBNQl9JQ09ORVJST1IpOworI2Vsc2UKKyAgLyogU2VuZCBpdCB0byBzdGRlcnIsIGFkZGluZyBhIG5ld2xpbmUgKi8KKyAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVmZmVyKTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBEZWNpZGUgd2hldGhlciB0byBlbWl0IGEgdHJhY2Ugb3Igd2FybmluZyBtZXNzYWdlLgorICogbXNnX2xldmVsIGlzIG9uZSBvZjoKKyAqICAgLTE6IHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSB3YXJuaW5nLCBtYXkgd2FudCB0byBhYm9ydC4KKyAqICAgIDA6IGltcG9ydGFudCBhZHZpc29yeSBtZXNzYWdlcyAoYWx3YXlzIGRpc3BsYXkgdG8gdXNlcikuCisgKiAgICAxOiBmaXJzdCBsZXZlbCBvZiB0cmFjaW5nIGRldGFpbC4KKyAqICAgIDIsMywuLi46IHN1Y2Nlc3NpdmVseSBtb3JlIGRldGFpbGVkIHRyYWNpbmcgbWVzc2FnZXMuCisgKiBBbiBhcHBsaWNhdGlvbiBtaWdodCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBpdCB3YW50ZWQgdG8gYWJvcnQgb24gd2FybmluZ3MKKyAqIG9yIGNoYW5nZSB0aGUgcG9saWN5IGFib3V0IHdoaWNoIG1lc3NhZ2VzIHRvIGRpc3BsYXkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitlbWl0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkKK3sKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKKworICBpZiAobXNnX2xldmVsIDwgMCkgeworICAgIC8qIEl0J3MgYSB3YXJuaW5nIG1lc3NhZ2UuICBTaW5jZSBjb3JydXB0IGZpbGVzIG1heSBnZW5lcmF0ZSBtYW55IHdhcm5pbmdzLAorICAgICAqIHRoZSBwb2xpY3kgaW1wbGVtZW50ZWQgaGVyZSBpcyB0byBzaG93IG9ubHkgdGhlIGZpcnN0IHdhcm5pbmcsCisgICAgICogdW5sZXNzIHRyYWNlX2xldmVsID49IDMuCisgICAgICovCisgICAgaWYgKGVyci0+bnVtX3dhcm5pbmdzID09IDAgfHwgZXJyLT50cmFjZV9sZXZlbCA+PSAzKQorICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOworICAgIC8qIEFsd2F5cyBjb3VudCB3YXJuaW5ncyBpbiBudW1fd2FybmluZ3MuICovCisgICAgZXJyLT5udW1fd2FybmluZ3MrKzsKKyAgfSBlbHNlIHsKKyAgICAvKiBJdCdzIGEgdHJhY2UgbWVzc2FnZS4gIFNob3cgaXQgaWYgdHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsLiAqLworICAgIGlmIChlcnItPnRyYWNlX2xldmVsID49IG1zZ19sZXZlbCkKKyAgICAgICgqZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKKyAgfQorfQorCisKKy8qCisgKiBGb3JtYXQgYSBtZXNzYWdlIHN0cmluZyBmb3IgdGhlIG1vc3QgcmVjZW50IEpQRUcgZXJyb3Igb3IgbWVzc2FnZS4KKyAqIFRoZSBtZXNzYWdlIGlzIHN0b3JlZCBpbnRvIGJ1ZmZlciwgd2hpY2ggc2hvdWxkIGJlIGF0IGxlYXN0IEpNU0dfTEVOR1RIX01BWAorICogY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBubyAnXG4nIGNoYXJhY3RlciBpcyBhZGRlZCB0byB0aGUgc3RyaW5nLgorICogRmV3IGFwcGxpY2F0aW9ucyBzaG91bGQgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2Zvcm1hdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpCit7CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVyciA9IGNpbmZvLT5lcnI7CisgIGludCBtc2dfY29kZSA9IGVyci0+bXNnX2NvZGU7CisgIGNvbnN0IGNoYXIgKiBtc2d0ZXh0ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqIG1zZ3B0cjsKKyAgY2hhciBjaDsKKyAgYm9vbGVhbiBpc3N0cmluZzsKKworICAvKiBMb29rIHVwIG1lc3NhZ2Ugc3RyaW5nIGluIHByb3BlciB0YWJsZSAqLworICBpZiAobXNnX2NvZGUgPiAwICYmIG1zZ19jb2RlIDw9IGVyci0+bGFzdF9qcGVnX21lc3NhZ2UpIHsKKyAgICBtc2d0ZXh0ID0gZXJyLT5qcGVnX21lc3NhZ2VfdGFibGVbbXNnX2NvZGVdOworICB9IGVsc2UgaWYgKGVyci0+YWRkb25fbWVzc2FnZV90YWJsZSAhPSBOVUxMICYmCisJICAgICBtc2dfY29kZSA+PSBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgJiYKKwkgICAgIG1zZ19jb2RlIDw9IGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlKSB7CisgICAgbXNndGV4dCA9IGVyci0+YWRkb25fbWVzc2FnZV90YWJsZVttc2dfY29kZSAtIGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZV07CisgIH0KKworICAvKiBEZWZlbmQgYWdhaW5zdCBib2d1cyBtZXNzYWdlIG51bWJlciAqLworICBpZiAobXNndGV4dCA9PSBOVUxMKSB7CisgICAgZXJyLT5tc2dfcGFybS5pWzBdID0gbXNnX2NvZGU7CisgICAgbXNndGV4dCA9IGVyci0+anBlZ19tZXNzYWdlX3RhYmxlWzBdOworICB9CisKKyAgLyogQ2hlY2sgZm9yIHN0cmluZyBwYXJhbWV0ZXIsIGFzIGluZGljYXRlZCBieSAlcyBpbiB0aGUgbWVzc2FnZSB0ZXh0ICovCisgIGlzc3RyaW5nID0gRkFMU0U7CisgIG1zZ3B0ciA9IG1zZ3RleHQ7CisgIHdoaWxlICgoY2ggPSAqbXNncHRyKyspICE9ICdcMCcpIHsKKyAgICBpZiAoY2ggPT0gJyUnKSB7CisgICAgICBpZiAoKm1zZ3B0ciA9PSAncycpIGlzc3RyaW5nID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEZvcm1hdCB0aGUgbWVzc2FnZSBpbnRvIHRoZSBwYXNzZWQgYnVmZmVyICovCisgIGlmIChpc3N0cmluZykKKyAgICBzcHJpbnRmKGJ1ZmZlciwgbXNndGV4dCwgZXJyLT5tc2dfcGFybS5zKTsKKyAgZWxzZQorICAgIHNwcmludGYoYnVmZmVyLCBtc2d0ZXh0LAorCSAgICBlcnItPm1zZ19wYXJtLmlbMF0sIGVyci0+bXNnX3Bhcm0uaVsxXSwKKwkgICAgZXJyLT5tc2dfcGFybS5pWzJdLCBlcnItPm1zZ19wYXJtLmlbM10sCisJICAgIGVyci0+bXNnX3Bhcm0uaVs0XSwgZXJyLT5tc2dfcGFybS5pWzVdLAorCSAgICBlcnItPm1zZ19wYXJtLmlbNl0sIGVyci0+bXNnX3Bhcm0uaVs3XSk7Cit9CisKKworLyoKKyAqIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZS4KKyAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwIHRvIHJlc2V0IHRyYWNlL2Vycm9yCisgKiBwcm9jZXNzaW5nIHRvIGRlZmF1bHQgc3RhdGUsIHdpdGhvdXQgbG9zaW5nIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYworICogbWV0aG9kIHBvaW50ZXJzLiAgQW4gYXBwbGljYXRpb24gbWlnaHQgcG9zc2libHkgd2FudCB0byBvdmVycmlkZQorICogdGhpcyBtZXRob2QgaWYgaXQgaGFzIGFkZGl0aW9uYWwgZXJyb3IgcHJvY2Vzc2luZyBzdGF0ZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Jlc2V0X2Vycm9yX21nciAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBjaW5mby0+ZXJyLT5udW1fd2FybmluZ3MgPSAwOworICAvKiB0cmFjZV9sZXZlbCBpcyBub3QgcmVzZXQgc2luY2UgaXQgaXMgYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgcGFyYW1ldGVyICovCisgIGNpbmZvLT5lcnItPm1zZ19jb2RlID0gMDsJLyogbWF5IGJlIHVzZWZ1bCBhcyBhIGZsYWcgZm9yICJubyBlcnJvciIgKi8KK30KKworCisvKgorICogRmlsbCBpbiB0aGUgc3RhbmRhcmQgZXJyb3ItaGFuZGxpbmcgbWV0aG9kcyBpbiBhIGpwZWdfZXJyb3JfbWdyIG9iamVjdC4KKyAqIFR5cGljYWwgY2FsbCBpczoKKyAqCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAqCXN0cnVjdCBqcGVnX2Vycm9yX21nciBlcnI7CisgKgorICoJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmVycik7CisgKiBhZnRlciB3aGljaCB0aGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHNvbWUgb2YgdGhlIG1ldGhvZHMuCisgKi8KKworR0xPQkFMKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKQoranBlZ19zdGRfZXJyb3IgKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikKK3sKKyAgZXJyLT5lcnJvcl9leGl0ID0gZXJyb3JfZXhpdDsKKyAgZXJyLT5lbWl0X21lc3NhZ2UgPSBlbWl0X21lc3NhZ2U7CisgIGVyci0+b3V0cHV0X21lc3NhZ2UgPSBvdXRwdXRfbWVzc2FnZTsKKyAgZXJyLT5mb3JtYXRfbWVzc2FnZSA9IGZvcm1hdF9tZXNzYWdlOworICBlcnItPnJlc2V0X2Vycm9yX21nciA9IHJlc2V0X2Vycm9yX21ncjsKKworICBlcnItPnRyYWNlX2xldmVsID0gMDsJCS8qIGRlZmF1bHQgPSBubyB0cmFjaW5nICovCisgIGVyci0+bnVtX3dhcm5pbmdzID0gMDsJLyogbm8gd2FybmluZ3MgZW1pdHRlZCB5ZXQgKi8KKyAgZXJyLT5tc2dfY29kZSA9IDA7CQkvKiBtYXkgYmUgdXNlZnVsIGFzIGEgZmxhZyBmb3IgIm5vIGVycm9yIiAqLworCisgIC8qIEluaXRpYWxpemUgbWVzc2FnZSB0YWJsZSBwb2ludGVycyAqLworICBlcnItPmpwZWdfbWVzc2FnZV90YWJsZSA9IGpwZWdfc3RkX21lc3NhZ2VfdGFibGU7CisgIGVyci0+bGFzdF9qcGVnX21lc3NhZ2UgPSAoaW50KSBKTVNHX0xBU1RNU0dDT0RFIC0gMTsKKworICBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgPSBOVUxMOworICBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgPSAwOwkvKiBmb3Igc2FmZXR5ICovCisgIGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlID0gMDsKKworICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvanBlZy9qZXJyb3IuaCBiL2pwZWcvamVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyZmZmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamVycm9yLmgKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBqZXJyb3IuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGVycm9yIGFuZCBtZXNzYWdlIGNvZGVzIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgorICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KKyAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCisgKiBBIHNldCBvZiBlcnJvci1yZXBvcnRpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIHRvby4gIFNvbWUgYXBwbGljYXRpb25zIHVzaW5nCisgKiB0aGUgSlBFRyBsaWJyYXJ5IG1heSB3aXNoIHRvIGluY2x1ZGUgdGhpcyBmaWxlIHRvIGdldCB0aGUgZXJyb3IgY29kZXMKKyAqIGFuZC9vciB0aGUgbWFjcm9zLgorICovCisKKy8qCisgKiBUbyBkZWZpbmUgdGhlIGVudW0gbGlzdCBvZiBtZXNzYWdlIGNvZGVzLCBpbmNsdWRlIHRoaXMgZmlsZSB3aXRob3V0CisgKiBkZWZpbmluZyBtYWNybyBKTUVTU0FHRS4gIFRvIGNyZWF0ZSBhIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLCBpbmNsdWRlIGl0CisgKiBhZ2FpbiB3aXRoIGEgc3VpdGFibGUgSk1FU1NBR0UgZGVmaW5pdGlvbiAoc2VlIGplcnJvci5jIGZvciBhbiBleGFtcGxlKS4KKyAqLworI2lmbmRlZiBKTUVTU0FHRQorI2lmbmRlZiBKRVJST1JfSAorLyogRmlyc3QgdGltZSB0aHJvdWdoLCBkZWZpbmUgdGhlIGVudW0gbGlzdCAqLworI2RlZmluZSBKTUFLRV9FTlVNX0xJU1QKKyNlbHNlCisvKiBSZXBlYXRlZCBpbmNsdXNpb25zIG9mIHRoaXMgZmlsZSBhcmUgbm8tb3BzIHVubGVzcyBKTUVTU0FHRSBpcyBkZWZpbmVkICovCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQorI2VuZGlmIC8qIEpFUlJPUl9IICovCisjZW5kaWYgLyogSk1FU1NBR0UgKi8KKworI2lmZGVmIEpNQUtFX0VOVU1fTElTVAorCit0eXBlZGVmIGVudW0geworCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQljb2RlICwKKworI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLworCitKTUVTU0FHRShKTVNHX05PTUVTU0FHRSwgIkJvZ3VzIG1lc3NhZ2UgY29kZSAlZCIpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCisKKy8qIEZvciBtYWludGVuYW5jZSBjb252ZW5pZW5jZSwgbGlzdCBpcyBhbHBoYWJldGljYWwgYnkgbWVzc2FnZSBjb2RlIG5hbWUgKi8KK0pNRVNTQUdFKEpFUlJfQVJJVEhfTk9USU1QTCwKKwkgIlNvcnJ5LCB0aGVyZSBhcmUgbGVnYWwgcmVzdHJpY3Rpb25zIG9uIGFyaXRobWV0aWMgY29kaW5nIikKK0pNRVNTQUdFKEpFUlJfQkFEX0FMSUdOX1RZUEUsICJBTElHTl9UWVBFIGlzIHdyb25nLCBwbGVhc2UgZml4IikKK0pNRVNTQUdFKEpFUlJfQkFEX0FMTE9DX0NIVU5LLCAiTUFYX0FMTE9DX0NIVU5LIGlzIHdyb25nLCBwbGVhc2UgZml4IikKK0pNRVNTQUdFKEpFUlJfQkFEX0JVRkZFUl9NT0RFLCAiQm9ndXMgYnVmZmVyIGNvbnRyb2wgbW9kZSIpCitKTUVTU0FHRShKRVJSX0JBRF9DT01QT05FTlRfSUQsICJJbnZhbGlkIGNvbXBvbmVudCBJRCAlZCBpbiBTT1MiKQorSk1FU1NBR0UoSkVSUl9CQURfRENUX0NPRUYsICJEQ1QgY29lZmZpY2llbnQgb3V0IG9mIHJhbmdlIikKK0pNRVNTQUdFKEpFUlJfQkFEX0RDVFNJWkUsICJJRENUIG91dHB1dCBibG9jayBzaXplICVkIG5vdCBzdXBwb3J0ZWQiKQorSk1FU1NBR0UoSkVSUl9CQURfSFVGRl9UQUJMRSwgIkJvZ3VzIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiIpCitKTUVTU0FHRShKRVJSX0JBRF9JTl9DT0xPUlNQQUNFLCAiQm9ndXMgaW5wdXQgY29sb3JzcGFjZSIpCitKTUVTU0FHRShKRVJSX0JBRF9KX0NPTE9SU1BBQ0UsICJCb2d1cyBKUEVHIGNvbG9yc3BhY2UiKQorSk1FU1NBR0UoSkVSUl9CQURfTEVOR1RILCAiQm9ndXMgbWFya2VyIGxlbmd0aCIpCitKTUVTU0FHRShKRVJSX0JBRF9MSUJfVkVSU0lPTiwKKwkgIldyb25nIEpQRUcgbGlicmFyeSB2ZXJzaW9uOiBsaWJyYXJ5IGlzICVkLCBjYWxsZXIgZXhwZWN0cyAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9NQ1VfU0laRSwgIlNhbXBsaW5nIGZhY3RvcnMgdG9vIGxhcmdlIGZvciBpbnRlcmxlYXZlZCBzY2FuIikKK0pNRVNTQUdFKEpFUlJfQkFEX1BPT0xfSUQsICJJbnZhbGlkIG1lbW9yeSBwb29sIGNvZGUgJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfUFJFQ0lTSU9OLCAiVW5zdXBwb3J0ZWQgSlBFRyBkYXRhIHByZWNpc2lvbiAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9QUk9HUkVTU0lPTiwKKwkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBTcz0lZCBTZT0lZCBBaD0lZCBBbD0lZCIpCitKTUVTU0FHRShKRVJSX0JBRF9QUk9HX1NDUklQVCwKKwkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBhdCBzY2FuIHNjcmlwdCBlbnRyeSAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9TQU1QTElORywgIkJvZ3VzIHNhbXBsaW5nIGZhY3RvcnMiKQorSk1FU1NBR0UoSkVSUl9CQURfU0NBTl9TQ1JJUFQsICJJbnZhbGlkIHNjYW4gc2NyaXB0IGF0IGVudHJ5ICVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX1NUQVRFLCAiSW1wcm9wZXIgY2FsbCB0byBKUEVHIGxpYnJhcnkgaW4gc3RhdGUgJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfU1RSVUNUX1NJWkUsCisJICJKUEVHIHBhcmFtZXRlciBzdHJ1Y3QgbWlzbWF0Y2g6IGxpYnJhcnkgdGhpbmtzIHNpemUgaXMgJXUsIGNhbGxlciBleHBlY3RzICV1IikKK0pNRVNTQUdFKEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTLCAiQm9ndXMgdmlydHVhbCBhcnJheSBhY2Nlc3MiKQorSk1FU1NBR0UoSkVSUl9CVUZGRVJfU0laRSwgIkJ1ZmZlciBwYXNzZWQgdG8gSlBFRyBsaWJyYXJ5IGlzIHRvbyBzbWFsbCIpCitKTUVTU0FHRShKRVJSX0NBTlRfU1VTUEVORCwgIlN1c3BlbnNpb24gbm90IGFsbG93ZWQgaGVyZSIpCitKTUVTU0FHRShKRVJSX0NDSVI2MDFfTk9USU1QTCwgIkNDSVI2MDEgc2FtcGxpbmcgbm90IGltcGxlbWVudGVkIHlldCIpCitKTUVTU0FHRShKRVJSX0NPTVBPTkVOVF9DT1VOVCwgIlRvbyBtYW55IGNvbG9yIGNvbXBvbmVudHM6ICVkLCBtYXggJWQiKQorSk1FU1NBR0UoSkVSUl9DT05WRVJTSU9OX05PVElNUEwsICJVbnN1cHBvcnRlZCBjb2xvciBjb252ZXJzaW9uIHJlcXVlc3QiKQorSk1FU1NBR0UoSkVSUl9EQUNfSU5ERVgsICJCb2d1cyBEQUMgaW5kZXggJWQiKQorSk1FU1NBR0UoSkVSUl9EQUNfVkFMVUUsICJCb2d1cyBEQUMgdmFsdWUgMHgleCIpCitKTUVTU0FHRShKRVJSX0RIVF9JTkRFWCwgIkJvZ3VzIERIVCBpbmRleCAlZCIpCitKTUVTU0FHRShKRVJSX0RRVF9JTkRFWCwgIkJvZ3VzIERRVCBpbmRleCAlZCIpCitKTUVTU0FHRShKRVJSX0VNUFRZX0lNQUdFLCAiRW1wdHkgSlBFRyBpbWFnZSAoRE5MIG5vdCBzdXBwb3J0ZWQpIikKK0pNRVNTQUdFKEpFUlJfRU1TX1JFQUQsICJSZWFkIGZyb20gRU1TIGZhaWxlZCIpCitKTUVTU0FHRShKRVJSX0VNU19XUklURSwgIldyaXRlIHRvIEVNUyBmYWlsZWQiKQorSk1FU1NBR0UoSkVSUl9FT0lfRVhQRUNURUQsICJEaWRuJ3QgZXhwZWN0IG1vcmUgdGhhbiBvbmUgc2NhbiIpCitKTUVTU0FHRShKRVJSX0ZJTEVfUkVBRCwgIklucHV0IGZpbGUgcmVhZCBlcnJvciIpCitKTUVTU0FHRShKRVJSX0ZJTEVfV1JJVEUsICJPdXRwdXQgZmlsZSB3cml0ZSBlcnJvciAtLS0gb3V0IG9mIGRpc2sgc3BhY2U/IikKK0pNRVNTQUdFKEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwsICJGcmFjdGlvbmFsIHNhbXBsaW5nIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKQorSk1FU1NBR0UoSkVSUl9IVUZGX0NMRU5fT1ZFUkZMT1csICJIdWZmbWFuIGNvZGUgc2l6ZSB0YWJsZSBvdmVyZmxvdyIpCitKTUVTU0FHRShKRVJSX0hVRkZfTUlTU0lOR19DT0RFLCAiTWlzc2luZyBIdWZmbWFuIGNvZGUgdGFibGUgZW50cnkiKQorSk1FU1NBR0UoSkVSUl9JTUFHRV9UT09fQklHLCAiTWF4aW11bSBzdXBwb3J0ZWQgaW1hZ2UgZGltZW5zaW9uIGlzICV1IHBpeGVscyIpCitKTUVTU0FHRShKRVJSX0lOUFVUX0VNUFRZLCAiRW1wdHkgaW5wdXQgZmlsZSIpCitKTUVTU0FHRShKRVJSX0lOUFVUX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgaW5wdXQgZmlsZSIpCitKTUVTU0FHRShKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsCisJICJDYW5ub3QgdHJhbnNjb2RlIGR1ZSB0byBtdWx0aXBsZSB1c2Ugb2YgcXVhbnRpemF0aW9uIHRhYmxlICVkIikKK0pNRVNTQUdFKEpFUlJfTUlTU0lOR19EQVRBLCAiU2NhbiBzY3JpcHQgZG9lcyBub3QgdHJhbnNtaXQgYWxsIGRhdGEiKQorSk1FU1NBR0UoSkVSUl9NT0RFX0NIQU5HRSwgIkludmFsaWQgY29sb3IgcXVhbnRpemF0aW9uIG1vZGUgY2hhbmdlIikKK0pNRVNTQUdFKEpFUlJfTk9USU1QTCwgIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKQorSk1FU1NBR0UoSkVSUl9OT1RfQ09NUElMRUQsICJSZXF1ZXN0ZWQgZmVhdHVyZSB3YXMgb21pdHRlZCBhdCBjb21waWxlIHRpbWUiKQorSk1FU1NBR0UoSkVSUl9OT19CQUNLSU5HX1NUT1JFLCAiQmFja2luZyBzdG9yZSBub3Qgc3VwcG9ydGVkIikKK0pNRVNTQUdFKEpFUlJfTk9fSFVGRl9UQUJMRSwgIkh1ZmZtYW4gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCitKTUVTU0FHRShKRVJSX05PX0lNQUdFLCAiSlBFRyBkYXRhc3RyZWFtIGNvbnRhaW5zIG5vIGltYWdlIikKK0pNRVNTQUdFKEpFUlJfTk9fUVVBTlRfVEFCTEUsICJRdWFudGl6YXRpb24gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCitKTUVTU0FHRShKRVJSX05PX1NPSSwgIk5vdCBhIEpQRUcgZmlsZTogc3RhcnRzIHdpdGggMHglMDJ4IDB4JTAyeCIpCitKTUVTU0FHRShKRVJSX09VVF9PRl9NRU1PUlksICJJbnN1ZmZpY2llbnQgbWVtb3J5IChjYXNlICVkKSIpCitKTUVTU0FHRShKRVJSX1FVQU5UX0NPTVBPTkVOVFMsCisJICJDYW5ub3QgcXVhbnRpemUgbW9yZSB0aGFuICVkIGNvbG9yIGNvbXBvbmVudHMiKQorSk1FU1NBR0UoSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCAiQ2Fubm90IHF1YW50aXplIHRvIGZld2VyIHRoYW4gJWQgY29sb3JzIikKK0pNRVNTQUdFKEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsICJDYW5ub3QgcXVhbnRpemUgdG8gbW9yZSB0aGFuICVkIGNvbG9ycyIpCitKTUVTU0FHRShKRVJSX1NPRl9EVVBMSUNBVEUsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IHR3byBTT0YgbWFya2VycyIpCitKTUVTU0FHRShKRVJSX1NPRl9OT19TT1MsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IG1pc3NpbmcgU09TIG1hcmtlciIpCitKTUVTU0FHRShKRVJSX1NPRl9VTlNVUFBPUlRFRCwgIlVuc3VwcG9ydGVkIEpQRUcgcHJvY2VzczogU09GIHR5cGUgMHglMDJ4IikKK0pNRVNTQUdFKEpFUlJfU09JX0RVUExJQ0FURSwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogdHdvIFNPSSBtYXJrZXJzIikKK0pNRVNTQUdFKEpFUlJfU09TX05PX1NPRiwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogU09TIGJlZm9yZSBTT0YiKQorSk1FU1NBR0UoSkVSUl9URklMRV9DUkVBVEUsICJGYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIikKK0pNRVNTQUdFKEpFUlJfVEZJTEVfUkVBRCwgIlJlYWQgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfVEZJTEVfU0VFSywgIlNlZWsgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfVEZJTEVfV1JJVEUsCisJICJXcml0ZSBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUgLS0tIG91dCBvZiBkaXNrIHNwYWNlPyIpCitKTUVTU0FHRShKRVJSX1RPT19MSVRUTEVfREFUQSwgIkFwcGxpY2F0aW9uIHRyYW5zZmVycmVkIHRvbyBmZXcgc2NhbmxpbmVzIikKK0pNRVNTQUdFKEpFUlJfVU5LTk9XTl9NQVJLRVIsICJVbnN1cHBvcnRlZCBtYXJrZXIgdHlwZSAweCUwMngiKQorSk1FU1NBR0UoSkVSUl9WSVJUVUFMX0JVRywgIlZpcnR1YWwgYXJyYXkgY29udHJvbGxlciBtZXNzZWQgdXAiKQorSk1FU1NBR0UoSkVSUl9XSURUSF9PVkVSRkxPVywgIkltYWdlIHRvbyB3aWRlIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIikKK0pNRVNTQUdFKEpFUlJfWE1TX1JFQUQsICJSZWFkIGZyb20gWE1TIGZhaWxlZCIpCitKTUVTU0FHRShKRVJSX1hNU19XUklURSwgIldyaXRlIHRvIFhNUyBmYWlsZWQiKQorSk1FU1NBR0UoSk1TR19DT1BZUklHSFQsIEpDT1BZUklHSFQpCitKTUVTU0FHRShKTVNHX1ZFUlNJT04sIEpWRVJTSU9OKQorSk1FU1NBR0UoSlRSQ18xNkJJVF9UQUJMRVMsCisJICJDYXV0aW9uOiBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB0b28gY29hcnNlIGZvciBiYXNlbGluZSBKUEVHIikKK0pNRVNTQUdFKEpUUkNfQURPQkUsCisJICJBZG9iZSBBUFAxNCBtYXJrZXI6IHZlcnNpb24gJWQsIGZsYWdzIDB4JTA0eCAweCUwNHgsIHRyYW5zZm9ybSAlZCIpCitKTUVTU0FHRShKVFJDX0FQUDAsICJVbmtub3duIEFQUDAgbWFya2VyIChub3QgSkZJRiksIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX0FQUDE0LCAiVW5rbm93biBBUFAxNCBtYXJrZXIgKG5vdCBBZG9iZSksIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX0RBQywgIkRlZmluZSBBcml0aG1ldGljIFRhYmxlIDB4JTAyeDogMHglMDJ4IikKK0pNRVNTQUdFKEpUUkNfREhULCAiRGVmaW5lIEh1ZmZtYW4gVGFibGUgMHglMDJ4IikKK0pNRVNTQUdFKEpUUkNfRFFULCAiRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZSAlZCAgcHJlY2lzaW9uICVkIikKK0pNRVNTQUdFKEpUUkNfRFJJLCAiRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwgJXUiKQorSk1FU1NBR0UoSlRSQ19FTVNfQ0xPU0UsICJGcmVlZCBFTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpUUkNfRU1TX09QRU4sICJPYnRhaW5lZCBFTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpUUkNfRU9JLCAiRW5kIE9mIEltYWdlIikKK0pNRVNTQUdFKEpUUkNfSFVGRkJJVFMsICIgICAgICAgICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QiKQorSk1FU1NBR0UoSlRSQ19KRklGLCAiSkZJRiBBUFAwIG1hcmtlcjogdmVyc2lvbiAlZC4lMDJkLCBkZW5zaXR5ICVkeCVkICAlZCIpCitKTUVTU0FHRShKVFJDX0pGSUZfQkFEVEhVTUJOQUlMU0laRSwKKwkgIldhcm5pbmc6IHRodW1ibmFpbCBpbWFnZSBzaXplIGRvZXMgbm90IG1hdGNoIGRhdGEgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfSkZJRl9FWFRFTlNJT04sCisJICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IHR5cGUgMHglMDJ4LCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19KRklGX1RIVU1CTkFJTCwgIiAgICB3aXRoICVkIHggJWQgdGh1bWJuYWlsIGltYWdlIikKK0pNRVNTQUdFKEpUUkNfTUlTQ19NQVJLRVIsICJNaXNjZWxsYW5lb3VzIG1hcmtlciAweCUwMngsIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX1BBUk1MRVNTX01BUktFUiwgIlVuZXhwZWN0ZWQgbWFya2VyIDB4JTAyeCIpCitKTUVTU0FHRShKVFJDX1FVQU5UVkFMUywgIiAgICAgICAgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSIpCitKTUVTU0FHRShKVFJDX1FVQU5UXzNfTkNPTE9SUywgIlF1YW50aXppbmcgdG8gJWQgPSAlZColZColZCBjb2xvcnMiKQorSk1FU1NBR0UoSlRSQ19RVUFOVF9OQ09MT1JTLCAiUXVhbnRpemluZyB0byAlZCBjb2xvcnMiKQorSk1FU1NBR0UoSlRSQ19RVUFOVF9TRUxFQ1RFRCwgIlNlbGVjdGVkICVkIGNvbG9ycyBmb3IgcXVhbnRpemF0aW9uIikKK0pNRVNTQUdFKEpUUkNfUkVDT1ZFUllfQUNUSU9OLCAiQXQgbWFya2VyIDB4JTAyeCwgcmVjb3ZlcnkgYWN0aW9uICVkIikKK0pNRVNTQUdFKEpUUkNfUlNULCAiUlNUJWQiKQorSk1FU1NBR0UoSlRSQ19TTU9PVEhfTk9USU1QTCwKKwkgIlNtb290aGluZyBub3Qgc3VwcG9ydGVkIHdpdGggbm9uc3RhbmRhcmQgc2FtcGxpbmcgcmF0aW9zIikKK0pNRVNTQUdFKEpUUkNfU09GLCAiU3RhcnQgT2YgRnJhbWUgMHglMDJ4OiB3aWR0aD0ldSwgaGVpZ2h0PSV1LCBjb21wb25lbnRzPSVkIikKK0pNRVNTQUdFKEpUUkNfU09GX0NPTVBPTkVOVCwgIiAgICBDb21wb25lbnQgJWQ6ICVkaHglZHYgcT0lZCIpCitKTUVTU0FHRShKVFJDX1NPSSwgIlN0YXJ0IG9mIEltYWdlIikKK0pNRVNTQUdFKEpUUkNfU09TLCAiU3RhcnQgT2YgU2NhbjogJWQgY29tcG9uZW50cyIpCitKTUVTU0FHRShKVFJDX1NPU19DT01QT05FTlQsICIgICAgQ29tcG9uZW50ICVkOiBkYz0lZCBhYz0lZCIpCitKTUVTU0FHRShKVFJDX1NPU19QQVJBTVMsICIgIFNzPSVkLCBTZT0lZCwgQWg9JWQsIEFsPSVkIikKK0pNRVNTQUdFKEpUUkNfVEZJTEVfQ0xPU0UsICJDbG9zZWQgdGVtcG9yYXJ5IGZpbGUgJXMiKQorSk1FU1NBR0UoSlRSQ19URklMRV9PUEVOLCAiT3BlbmVkIHRlbXBvcmFyeSBmaWxlICVzIikKK0pNRVNTQUdFKEpUUkNfVEhVTUJfSlBFRywKKwkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogSlBFRy1jb21wcmVzc2VkIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfVEhVTUJfUEFMRVRURSwKKwkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogcGFsZXR0ZSB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX1RIVU1CX1JHQiwKKwkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogUkdCIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfVU5LTk9XTl9JRFMsCisJICJVbnJlY29nbml6ZWQgY29tcG9uZW50IElEcyAlZCAlZCAlZCwgYXNzdW1pbmcgWUNiQ3IiKQorSk1FU1NBR0UoSlRSQ19YTVNfQ0xPU0UsICJGcmVlZCBYTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpUUkNfWE1TX09QRU4sICJPYnRhaW5lZCBYTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpXUk5fQURPQkVfWEZPUk0sICJVbmtub3duIEFkb2JlIGNvbG9yIHRyYW5zZm9ybSBjb2RlICVkIikKK0pNRVNTQUdFKEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sCisJICJJbmNvbnNpc3RlbnQgcHJvZ3Jlc3Npb24gc2VxdWVuY2UgZm9yIGNvbXBvbmVudCAlZCBjb2VmZmljaWVudCAlZCIpCitKTUVTU0FHRShKV1JOX0VYVFJBTkVPVVNfREFUQSwKKwkgIkNvcnJ1cHQgSlBFRyBkYXRhOiAldSBleHRyYW5lb3VzIGJ5dGVzIGJlZm9yZSBtYXJrZXIgMHglMDJ4IikKK0pNRVNTQUdFKEpXUk5fSElUX01BUktFUiwgIkNvcnJ1cHQgSlBFRyBkYXRhOiBwcmVtYXR1cmUgZW5kIG9mIGRhdGEgc2VnbWVudCIpCitKTUVTU0FHRShKV1JOX0hVRkZfQkFEX0NPREUsICJDb3JydXB0IEpQRUcgZGF0YTogYmFkIEh1ZmZtYW4gY29kZSIpCitKTUVTU0FHRShKV1JOX0pGSUZfTUFKT1IsICJXYXJuaW5nOiB1bmtub3duIEpGSUYgcmV2aXNpb24gbnVtYmVyICVkLiUwMmQiKQorSk1FU1NBR0UoSldSTl9KUEVHX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgSlBFRyBmaWxlIikKK0pNRVNTQUdFKEpXUk5fTVVTVF9SRVNZTkMsCisJICJDb3JydXB0IEpQRUcgZGF0YTogZm91bmQgbWFya2VyIDB4JTAyeCBpbnN0ZWFkIG9mIFJTVCVkIikKK0pNRVNTQUdFKEpXUk5fTk9UX1NFUVVFTlRJQUwsICJJbnZhbGlkIFNPUyBwYXJhbWV0ZXJzIGZvciBzZXF1ZW50aWFsIEpQRUciKQorSk1FU1NBR0UoSldSTl9UT09fTVVDSF9EQVRBLCAiQXBwbGljYXRpb24gdHJhbnNmZXJyZWQgdG9vIG1hbnkgc2NhbmxpbmVzIikKKworI2lmZGVmIEpNQUtFX0VOVU1fTElTVAorCisgIEpNU0dfTEFTVE1TR0NPREUKK30gSl9NRVNTQUdFX0NPREU7CisKKyN1bmRlZiBKTUFLRV9FTlVNX0xJU1QKKyNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KKworLyogWmFwIEpNRVNTQUdFIG1hY3JvIHNvIHRoYXQgZnV0dXJlIHJlLWluY2x1c2lvbnMgZG8gbm90aGluZyBieSBkZWZhdWx0ICovCisjdW5kZWYgSk1FU1NBR0UKKworCisjaWZuZGVmIEpFUlJPUl9ICisjZGVmaW5lIEpFUlJPUl9ICisKKy8qIE1hY3JvcyB0byBzaW1wbGlmeSB1c2luZyB0aGUgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2Ugc3R1ZmYgKi8KKy8qIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgZWl0aGVyIHR5cGUgb2YgY2luZm8gcG9pbnRlciAqLworCisvKiBGYXRhbCBlcnJvcnMgKHByaW50IG1lc3NhZ2UgYW5kIGV4aXQpICovCisjZGVmaW5lIEVSUkVYSVQoY2luZm8sY29kZSkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisjZGVmaW5lIEVSUkVYSVQxKGNpbmZvLGNvZGUscDEpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorI2RlZmluZSBFUlJFWElUMihjaW5mbyxjb2RlLHAxLHAyKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKyNkZWZpbmUgRVJSRVhJVDMoY2luZm8sY29kZSxwMSxwMixwMykgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsyXSA9IChwMyksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisjZGVmaW5lIEVSUkVYSVQ0KGNpbmZvLGNvZGUscDEscDIscDMscDQpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMl0gPSAocDMpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbM10gPSAocDQpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorI2RlZmluZSBFUlJFWElUUyhjaW5mbyxjb2RlLHN0cikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIHN0cm5jcHkoKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5zLCAoc3RyKSwgSk1TR19TVFJfUEFSTV9NQVgpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorCisjZGVmaW5lIE1BS0VTVE1UKHN0dWZmKQkJZG8geyBzdHVmZiB9IHdoaWxlICgwKQorCisvKiBOb25mYXRhbCBlcnJvcnMgKHdlIGNhbiBrZWVwIGdvaW5nLCBidXQgdGhlIGRhdGEgaXMgcHJvYmFibHkgY29ycnVwdCkgKi8KKyNkZWZpbmUgV0FSTk1TKGNpbmZvLGNvZGUpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQorI2RlZmluZSBXQVJOTVMxKGNpbmZvLGNvZGUscDEpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQorI2RlZmluZSBXQVJOTVMyKGNpbmZvLGNvZGUscDEscDIpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQorCisvKiBJbmZvcm1hdGlvbmFsL2RlYnVnZ2luZyBtZXNzYWdlcyAqLworI2RlZmluZSBUUkFDRU1TKGNpbmZvLGx2bCxjb2RlKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKKyNkZWZpbmUgVFJBQ0VNUzEoY2luZm8sbHZsLGNvZGUscDEpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQorI2RlZmluZSBUUkFDRU1TMihjaW5mbyxsdmwsY29kZSxwMSxwMikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCisjZGVmaW5lIFRSQUNFTVMzKGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzKSAgXAorICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKKwkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBcCisJICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAorCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKKyNkZWZpbmUgVFJBQ0VNUzQoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQpICBcCisgIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAorCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKKwkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCisJICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQorI2RlZmluZSBUUkFDRU1TNShjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSkgIFwKKyAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCisJICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAorCSAgIF9tcFs0XSA9IChwNSk7IFwKKwkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCisJICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQorI2RlZmluZSBUUkFDRU1TOChjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSxwNixwNyxwOCkgIFwKKyAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCisJICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAorCSAgIF9tcFs0XSA9IChwNSk7IF9tcFs1XSA9IChwNik7IF9tcFs2XSA9IChwNyk7IF9tcFs3XSA9IChwOCk7IFwKKwkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCisJICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQorI2RlZmluZSBUUkFDRU1TUyhjaW5mbyxsdmwsY29kZSxzdHIpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICBzdHJuY3B5KChjaW5mbyktPmVyci0+bXNnX3Bhcm0ucywgKHN0ciksIEpNU0dfU1RSX1BBUk1fTUFYKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKKworI2VuZGlmIC8qIEpFUlJPUl9IICovCmRpZmYgLS1naXQgYS9qcGVnL2pmZGN0Zmx0LmMgYi9qcGVnL2pmZGN0Zmx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkN2EwMAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamZkY3RmbHQuYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIGpmZGN0Zmx0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZsb2F0aW5nLXBvaW50IGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIG1vcmUgYWNjdXJhdGUgdGhhbiBlaXRoZXIgb2YgdGhlIGludGVnZXIKKyAqIERDVCBpbXBsZW1lbnRhdGlvbnMuICBIb3dldmVyLCBpdCBtYXkgbm90IGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBvbiBhbGwKKyAqIG1hY2hpbmVzIGJlY2F1c2Ugb2YgZGlmZmVyZW5jZXMgaW4gcm91bmRvZmYgYmVoYXZpb3IuICBTcGVlZCB3aWxsIGRlcGVuZAorICogb24gdGhlIGhhcmR3YXJlJ3MgZmxvYXRpbmcgcG9pbnQgY2FwYWNpdHkuCisgKgorICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAorICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQorICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCisgKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgorICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCisgKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQorICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCisgKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKKyAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKKyAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgorICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKKyAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCisgKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGEgZml4ZWQtcG9pbnQKKyAqIGltcGxlbWVudGF0aW9uLCBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgKiBzY2FsZWQgcXVhbnRpemF0aW9uIHZhbHVlcy4gIEhvd2V2ZXIsIHRoYXQgcHJvYmxlbSBkb2VzIG5vdCBhcmlzZSBpZgorICogd2UgdXNlIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0X2Zsb2F0IChGQVNUX0ZMT0FUICogZGF0YSkKK3sKKyAgRkFTVF9GTE9BVCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBGQVNUX0ZMT0FUIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBGQVNUX0ZMT0FUIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7CisgIEZBU1RfRkxPQVQgKmRhdGFwdHI7CisgIGludCBjdHI7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107CisgICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOworICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKKyAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07CisgICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOworICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKKyAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07CisgICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLworICAgIGRhdGFwdHJbNF0gPSB0bXAxMCAtIHRtcDExOworICAgIAorICAgIHoxID0gKHRtcDEyICsgdG1wMTMpICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCisgICAgZGF0YXB0clsyXSA9IHRtcDEzICsgejE7CS8qIHBoYXNlIDUgKi8KKyAgICBkYXRhcHRyWzZdID0gdG1wMTMgLSB6MTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSAodG1wMTAgLSB0bXAxMikgKiAoKEZBU1RfRkxPQVQpIDAuMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9ICgoRkFTVF9GTE9BVCkgMC41NDExOTYxMDApICogdG1wMTAgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9ICgoRkFTVF9GTE9BVCkgMS4zMDY1NjI5NjUpICogdG1wMTIgKyB6NTsgLyogYzIrYzYgKi8KKyAgICB6MyA9IHRtcDExICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCisKKyAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cls1XSA9IHoxMyArIHoyOwkvKiBwaGFzZSA2ICovCisgICAgZGF0YXB0clszXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyWzddID0gejExIC0gejQ7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gdG1wMTAgLSB0bXAxMTsKKyAgICAKKyAgICB6MSA9ICh0bXAxMiArIHRtcDEzKSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCisgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OworCisgICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KKyAgICB6NSA9ICh0bXAxMCAtIHRtcDEyKSAqICgoRkFTVF9GTE9BVCkgMC4zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gKChGQVNUX0ZMT0FUKSAwLjU0MTE5NjEwMCkgKiB0bXAxMCArIHo1OyAvKiBjMi1jNiAqLworICAgIHo0ID0gKChGQVNUX0ZMT0FUKSAxLjMwNjU2Mjk2NSkgKiB0bXAxMiArIHo1OyAvKiBjMitjNiAqLworICAgIHozID0gdG1wMTEgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KKyAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSB6MTMgKyB6MjsgLyogcGhhc2UgNiAqLworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IHoxMSAtIHo0OworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfRkxPQVRfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL2pmZGN0ZnN0LmMgYi9qcGVnL2pmZGN0ZnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiMzc4YQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamZkY3Rmc3QuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIGpmZGN0ZnN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgorICoKKyAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKKyAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKKyAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgorICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KKyAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAorICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKKyAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgorICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCisgKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCisgKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCisgKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KKyAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCisgKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgorICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBmaXhlZC1wb2ludCBtYXRoLAorICogYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsZWQKKyAqIHF1YW50aXphdGlvbiB2YWx1ZXMuICBUaGUgc21hbGxlciB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJ5LCB0aGUgbGVzcworICogcHJlY2lzZSB0aGUgc2NhbGVkIHZhbHVlLCBzbyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgd29yc2Ugd2l0aCBoaWdoLQorICogcXVhbGl0eS1zZXR0aW5nIGZpbGVzIHRoYW4gd2l0aCBsb3ctcXVhbGl0eSBvbmVzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qIFNjYWxpbmcgZGVjaXNpb25zIGFyZSBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgaW4gdGhlIExMJk0gYWxnb3JpdGhtOworICogc2VlIGpmZGN0aW50LmMgZm9yIG1vcmUgZGV0YWlscy4gIEhvd2V2ZXIsIHdlIGNob29zZSB0byBkZXNjYWxlCisgKiAocmlnaHQgc2hpZnQpIG11bHRpcGxpY2F0aW9uIHByb2R1Y3RzIGFzIHNvb24gYXMgdGhleSBhcmUgZm9ybWVkLAorICogcmF0aGVyIHRoYW4gY2FycnlpbmcgYWRkaXRpb25hbCBmcmFjdGlvbmFsIGJpdHMgaW50byBzdWJzZXF1ZW50IGFkZGl0aW9ucy4KKyAqIFRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgc2xpZ2h0bHksIGJ1dCBpdCBsZXRzIHVzIHNhdmUgYSBmZXcgc2hpZnRzLgorICogTW9yZSBpbXBvcnRhbnRseSwgMTYtYml0IGFyaXRobWV0aWMgaXMgdGhlbiBhZGVxdWF0ZSAoZm9yIDgtYml0IHNhbXBsZXMpCisgKiBldmVyeXdoZXJlIGV4Y2VwdCBpbiB0aGUgbXVsdGlwbGljYXRpb25zIHByb3BlcjsgdGhpcyBzYXZlcyBhIGdvb2QgZGVhbAorICogb2Ygd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgorICoKKyAqIEFnYWluIHRvIHNhdmUgYSBmZXcgc2hpZnRzLCB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgYmV0d2VlbiBwYXNzIDEgYW5kCisgKiBwYXNzIDIgYXJlIG5vdCB1cHNjYWxlZCwgYnV0IGFyZSByZXByZXNlbnRlZCBvbmx5IHRvIGludGVncmFsIHByZWNpc2lvbi4KKyAqCisgKiBBIGZpbmFsIGNvbXByb21pc2UgaXMgdG8gcmVwcmVzZW50IHRoZSBtdWx0aXBsaWNhdGl2ZSBjb25zdGFudHMgdG8gb25seQorICogOCBmcmFjdGlvbmFsIGJpdHMsIHJhdGhlciB0aGFuIDEzLiAgVGhpcyBzYXZlcyBzb21lIHNoaWZ0aW5nIHdvcmsgb24gc29tZQorICogbWFjaGluZXMsIGFuZCBtYXkgYWxzbyByZWR1Y2UgdGhlIGNvc3Qgb2YgbXVsdGlwbGljYXRpb24gKHNpbmNlIHRoZXJlCisgKiBhcmUgZmV3ZXIgb25lLWJpdHMgaW4gdGhlIGNvbnN0YW50cykuCisgKi8KKworI2RlZmluZSBDT05TVF9CSVRTICA4CisKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDgKKyNkZWZpbmUgRklYXzBfMzgyNjgzNDMzICAoKElOVDMyKSAgIDk4KQkJLyogRklYKDAuMzgyNjgzNDMzKSAqLworI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoSU5UMzIpICAxMzkpCQkvKiBGSVgoMC41NDExOTYxMDApICovCisjZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgKChJTlQzMikgIDE4MSkJCS8qIEZJWCgwLjcwNzEwNjc4MSkgKi8KKyNkZWZpbmUgRklYXzFfMzA2NTYyOTY1ICAoKElOVDMyKSAgMzM0KQkJLyogRklYKDEuMzA2NTYyOTY1KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMzgyNjgzNDMzICBGSVgoMC4zODI2ODM0MzMpCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQorI2RlZmluZSBGSVhfMF83MDcxMDY3ODEgIEZJWCgwLjcwNzEwNjc4MSkKKyNkZWZpbmUgRklYXzFfMzA2NTYyOTY1ICBGSVgoMS4zMDY1NjI5NjUpCisjZW5kaWYKKworCisvKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAorICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKKyAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KKyAqLworCisjaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI3VuZGVmIERFU0NBTEUKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYSBEQ1RFTEVNIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50LCBhbmQgaW1tZWRpYXRlbHkKKyAqIGRlc2NhbGUgdG8geWllbGQgYSBEQ1RFTEVNIHJlc3VsdC4KKyAqLworCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoRENURUxFTSkgREVTQ0FMRSgodmFyKSAqIChjb25zdCksIENPTlNUX0JJVFMpKQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF9pZmFzdCAoRENURUxFTSAqIGRhdGEpCit7CisgIERDVEVMRU0gdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgRENURUxFTSB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgRENURUxFTSB6MSwgejIsIHozLCB6NCwgejUsIHoxMSwgejEzOworICBEQ1RFTEVNICpkYXRhcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOworICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKKyAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07CisgICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOworICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKKyAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07CisgICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOworICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0clswXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KKyAgICBkYXRhcHRyWzRdID0gdG1wMTAgLSB0bXAxMTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisgICAgZGF0YXB0clsyXSA9IHRtcDEzICsgejE7CS8qIHBoYXNlIDUgKi8KKyAgICBkYXRhcHRyWzZdID0gdG1wMTMgLSB6MTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVhfMF8zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9IE1VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxMSwgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KKyAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICBkYXRhcHRyWzVdID0gejEzICsgejI7CS8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyWzNdID0gejEzIC0gejI7CisgICAgZGF0YXB0clsxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbRENUU0laRSowXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSB0bXAxMCAtIHRtcDExOworICAgIAorICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSB0bXAxMyArIHoxOyAvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gdG1wMTMgLSB6MTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVhfMF8zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9IE1VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxMSwgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KKyAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSB6MTMgKyB6MjsgLyogcGhhc2UgNiAqLworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IHoxMSAtIHo0OworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfSUZBU1RfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL2pmZGN0aW50LmMgYi9qcGVnL2pmZGN0aW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3OGI2NAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamZkY3RpbnQuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIGpmZGN0aW50LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCisgKgorICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAorICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQorICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCisgKiAgIEMuIExvZWZmbGVyLCBBLiBMaWd0ZW5iZXJnIGFuZCBHLiBNb3NjaHl0eiwgIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QKKyAqICAgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucyIsIFByb2MuIEludCdsLiBDb25mLiBvbiBBY291c3RpY3MsCisgKiAgIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nIDE5ODkgKElDQVNTUCAnODkpLCBwcC4gOTg4LTk5MS4KKyAqIFRoZSBwcmltYXJ5IGFsZ29yaXRobSBkZXNjcmliZWQgdGhlcmUgdXNlcyAxMSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzLgorICogV2UgdXNlIHRoZWlyIGFsdGVybmF0ZSBtZXRob2Qgd2l0aCAxMiBtdWx0aXBsaWVzIGFuZCAzMiBhZGRzLgorICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCisgKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KKyAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qCisgKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKKyAqCisgKiBFYWNoIDEtRCBEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCisgKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBEQ1Qgb3V0cHV0cy4gIFRoZSBmaW5hbCBvdXRwdXRzIGFyZSB0aGVyZWZvcmUKKyAqIGEgZmFjdG9yIG9mIE4gbGFyZ2VyIHRoYW4gZGVzaXJlZDsgc2luY2UgTj04IHRoaXMgY2FuIGJlIGN1cmVkIGJ5CisgKiBhIHNpbXBsZSByaWdodCBzaGlmdCBhdCB0aGUgZW5kIG9mIHRoZSBhbGdvcml0aG0uICBUaGUgYWR2YW50YWdlIG9mCisgKiB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgd2Ugc2F2ZSB0d28gbXVsdGlwbGljYXRpb25zIHBlciAxLUQgRENULAorICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IG91dHB1dHMgbmVlZCBub3QgYmUgZGl2aWRlZCBieSBzcXJ0KE4pLgorICogSW4gdGhlIElKRyBjb2RlLCB0aGlzIGZhY3RvciBvZiA4IGlzIHJlbW92ZWQgYnkgdGhlIHF1YW50aXphdGlvbiBzdGVwCisgKiAoaW4gamNkY3RtZ3IuYyksIE5PVCBpbiB0aGlzIG1vZHVsZS4KKyAqCisgKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCisgKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCisgKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKKyAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCisgKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQorICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCisgKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCisgKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKKyAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKKyAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCisgKgorICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAorICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cworICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAorICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChGb3IgMTItYml0IHNhbXBsZSBkYXRhLCB0aGUgaW50ZXJtZWRpYXRlCisgKiBhcnJheSBpcyBJTlQzMiBhbnl3YXkuKQorICoKKyAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0CisgKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKKyAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLworI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLworI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQorI2Vsc2UKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF9pc2xvdyAoRENURUxFTSAqIGRhdGEpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7CisgIERDVEVMRU0gKmRhdGFwdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107CisgICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOworICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKKyAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07CisgICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOworICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKKyAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07CisgICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OworICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCisgICAgICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pICgodG1wMTAgKyB0bXAxMSkgPDwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSAoKHRtcDEwIC0gdG1wMTEpIDw8IFBBU1MxX0JJVFMpOworICAgIAorICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKKwkJCQkgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCisJCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCisgICAgICogY0sgcmVwcmVzZW50cyBjb3MoSypwaS8xNikuCisgICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wNC4udG1wNyBoZXJlLgorICAgICAqLworICAgIAorICAgIHoxID0gdG1wNCArIHRtcDc7CisgICAgejIgPSB0bXA1ICsgdG1wNjsKKyAgICB6MyA9IHRtcDQgKyB0bXA2OworICAgIHo0ID0gdG1wNSArIHRtcDc7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICAKKyAgICB0bXA0ID0gTVVMVElQTFkodG1wNCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wNSA9IE1VTFRJUExZKHRtcDUsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDYgPSBNVUxUSVBMWSh0bXA2LCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXA3ID0gTVVMVElQTFkodG1wNywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgCisgICAgejMgKz0gejU7CisgICAgejQgKz0gejU7CisgICAgCisgICAgZGF0YXB0cls3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNiArIHoyICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIAorICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIHJlbW92ZSB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLCBidXQgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwCisgICAqIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OworICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCisgICAgICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCArIHRtcDExLCBQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCAtIHRtcDExLCBQQVNTMV9CSVRTKTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgorICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KKyAgICAgKi8KKyAgICAKKyAgICB6MSA9IHRtcDQgKyB0bXA3OworICAgIHoyID0gdG1wNSArIHRtcDY7CisgICAgejMgPSB0bXA0ICsgdG1wNjsKKyAgICB6NCA9IHRtcDUgKyB0bXA3OworICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCisgICAgCisgICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLworICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KKyAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCisgICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLworICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIAorICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworICAgIAorICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIAorICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qaWRjdGZsdC5jIGIvanBlZy9qaWRjdGZsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxODhjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2ppZGN0Zmx0LmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBqaWRjdGZsdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIG1vcmUgYWNjdXJhdGUgdGhhbiBlaXRoZXIgb2YgdGhlIGludGVnZXIKKyAqIElEQ1QgaW1wbGVtZW50YXRpb25zLiAgSG93ZXZlciwgaXQgbWF5IG5vdCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgb24gYWxsCisgKiBtYWNoaW5lcyBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGluIHJvdW5kb2ZmIGJlaGF2aW9yLiAgU3BlZWQgd2lsbCBkZXBlbmQKKyAqIG9uIHRoZSBoYXJkd2FyZSdzIGZsb2F0aW5nIHBvaW50IGNhcGFjaXR5LgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggYSBmaXhlZC1wb2ludAorICogaW1wbGVtZW50YXRpb24sIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqIHNjYWxlZCBxdWFudGl6YXRpb24gdmFsdWVzLiAgSG93ZXZlciwgdGhhdCBwcm9ibGVtIGRvZXMgbm90IGFyaXNlIGlmCisgKiB3ZSB1c2UgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKKyAqIGVudHJ5OyBwcm9kdWNlIGEgZmxvYXQgcmVzdWx0LgorICovCisKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoRkFTVF9GTE9BVCkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfZmxvYXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBGQVNUX0ZMT0FUIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIEZBU1RfRkxPQVQgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIEZBU1RfRkxPQVQgejUsIHoxMCwgejExLCB6MTIsIHoxMzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIEZMT0FUX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBGQVNUX0ZMT0FUICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgRkFTVF9GTE9BVCB3b3Jrc3BhY2VbRENUU0laRTJdOyAvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChGTE9BVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBjdHItLSkgeworICAgIC8qIER1ZSB0byBxdWFudGl6YXRpb24sIHdlIHdpbGwgdXN1YWxseSBmaW5kIHRoYXQgbWFueSBvZiB0aGUgaW5wdXQKKyAgICAgKiBjb2VmZmljaWVudHMgYXJlIHplcm8sIGVzcGVjaWFsbHkgdGhlIEFDIHRlcm1zLiAgV2UgY2FuIGV4cGxvaXQgdGhpcworICAgICAqIGJ5IHNob3J0LWNpcmN1aXRpbmcgdGhlIElEQ1QgY2FsY3VsYXRpb24gZm9yIGFueSBjb2x1bW4gaW4gd2hpY2ggYWxsCisgICAgICogdGhlIEFDIHRlcm1zIGFyZSB6ZXJvLiAgSW4gdGhhdCBjYXNlIGVhY2ggb3V0cHV0IGlzIGVxdWFsIHRvIHRoZQorICAgICAqIERDIGNvZWZmaWNpZW50ICh3aXRoIHNjYWxlIGZhY3RvciBhcyBuZWVkZWQpLgorICAgICAqIFdpdGggdHlwaWNhbCBpbWFnZXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMsIGhhbGYgb3IgbW9yZSBvZiB0aGUKKyAgICAgKiBjb2x1bW4gRENUIGNhbGN1bGF0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCB0aGlzIHdheS4KKyAgICAgKi8KKyAgICAKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgRkFTVF9GTE9BVCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgICAKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsJLyogcGhhc2UgMyAqLworICAgIHRtcDExID0gdG1wMCAtIHRtcDI7CisKKyAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOwkvKiBwaGFzZXMgNS0zICovCisgICAgdG1wMTIgPSAodG1wMSAtIHRtcDMpICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2MikgLSB0bXAxMzsgLyogMipjNCAqLworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKKyAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wNCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgdG1wNSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wNiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wNyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisKKyAgICB6MTMgPSB0bXA2ICsgdG1wNTsJCS8qIHBoYXNlIDYgKi8KKyAgICB6MTAgPSB0bXA2IC0gdG1wNTsKKyAgICB6MTEgPSB0bXA0ICsgdG1wNzsKKyAgICB6MTIgPSB0bXA0IC0gdG1wNzsKKworICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCisgICAgdG1wMTEgPSAoejExIC0gejEzKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpOyAvKiAyKmM0ICovCisKKyAgICB6NSA9ICh6MTAgKyB6MTIpICogKChGQVNUX0ZMT0FUKSAxLjg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9ICgoRkFTVF9GTE9BVCkgMS4wODIzOTIyMDApICogejEyIC0gejU7IC8qIDIqKGMyLWM2KSAqLworICAgIHRtcDEyID0gKChGQVNUX0ZMT0FUKSAtMi42MTMxMjU5MzApICogejEwICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gdG1wMCArIHRtcDc7CisgICAgd3NwdHJbRENUU0laRSo3XSA9IHRtcDAgLSB0bXA3OworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSB0bXAxICsgdG1wNjsKKyAgICB3c3B0cltEQ1RTSVpFKjZdID0gdG1wMSAtIHRtcDY7CisgICAgd3NwdHJbRENUU0laRSoyXSA9IHRtcDIgKyB0bXA1OworICAgIHdzcHRyW0RDVFNJWkUqNV0gPSB0bXAyIC0gdG1wNTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gdG1wMyArIHRtcDQ7CisgICAgd3NwdHJbRENUU0laRSozXSA9IHRtcDMgLSB0bXA0OworCisgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgcXVhbnRwdHIrKzsKKyAgICB3c3B0cisrOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMy4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KKyAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KKyAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KKyAgICAgKiBBbmQgdGVzdGluZyBmbG9hdHMgZm9yIHplcm8gaXMgcmVsYXRpdmVseSBleHBlbnNpdmUsIHNvIHdlIGRvbid0IGJvdGhlci4KKyAgICAgKi8KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDEwID0gd3NwdHJbMF0gKyB3c3B0cls0XTsKKyAgICB0bXAxMSA9IHdzcHRyWzBdIC0gd3NwdHJbNF07CisKKyAgICB0bXAxMyA9IHdzcHRyWzJdICsgd3NwdHJbNl07CisgICAgdG1wMTIgPSAod3NwdHJbMl0gLSB3c3B0cls2XSkgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKSAtIHRtcDEzOworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEzID0gd3NwdHJbNV0gKyB3c3B0clszXTsKKyAgICB6MTAgPSB3c3B0cls1XSAtIHdzcHRyWzNdOworICAgIHoxMSA9IHdzcHRyWzFdICsgd3NwdHJbN107CisgICAgejEyID0gd3NwdHJbMV0gLSB3c3B0cls3XTsKKworICAgIHRtcDcgPSB6MTEgKyB6MTM7CisgICAgdG1wMTEgPSAoejExIC0gejEzKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpOworCisgICAgejUgPSAoejEwICsgejEyKSAqICgoRkFTVF9GTE9BVCkgMS44NDc3NTkwNjUpOyAvKiAyKmMyICovCisgICAgdG1wMTAgPSAoKEZBU1RfRkxPQVQpIDEuMDgyMzkyMjAwKSAqIHoxMiAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9ICgoRkFTVF9GTE9BVCkgLTIuNjEzMTI1OTMwKSAqIHoxMCArIHo1OyAvKiAtMiooYzIrYzYpICovCisKKyAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OworICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7CisgICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogc2NhbGUgZG93biBieSBhIGZhY3RvciBvZiA4IGFuZCByYW5nZS1saW1pdCAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAwICsgdG1wNyksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDAgLSB0bXA3KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMSArIHRtcDYpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAxIC0gdG1wNiksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDIgKyB0bXA1KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMiAtIHRtcDUpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAzICsgdG1wNCksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDMgLSB0bXA0KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIAorICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qaWRjdGZzdC5jIGIvanBlZy9qaWRjdGZzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTQyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2ppZGN0ZnN0LmMKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBqaWRjdGZzdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmYXN0LCBub3Qgc28gYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggZml4ZWQtcG9pbnQgbWF0aCwKKyAqIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGVkCisgKiBxdWFudGl6YXRpb24gdmFsdWVzLiAgVGhlIHNtYWxsZXIgdGhlIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyeSwgdGhlIGxlc3MKKyAqIHByZWNpc2UgdGhlIHNjYWxlZCB2YWx1ZSwgc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIHdvcnNlIHdpdGggaGlnaC0KKyAqIHF1YWxpdHktc2V0dGluZyBmaWxlcyB0aGFuIHdpdGggbG93LXF1YWxpdHkgb25lcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKiBTY2FsaW5nIGRlY2lzaW9ucyBhcmUgZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIGluIHRoZSBMTCZNIGFsZ29yaXRobTsKKyAqIHNlZSBqaWRjdGludC5jIGZvciBtb3JlIGRldGFpbHMuICBIb3dldmVyLCB3ZSBjaG9vc2UgdG8gZGVzY2FsZQorICogKHJpZ2h0IHNoaWZ0KSBtdWx0aXBsaWNhdGlvbiBwcm9kdWN0cyBhcyBzb29uIGFzIHRoZXkgYXJlIGZvcm1lZCwKKyAqIHJhdGhlciB0aGFuIGNhcnJ5aW5nIGFkZGl0aW9uYWwgZnJhY3Rpb25hbCBiaXRzIGludG8gc3Vic2VxdWVudCBhZGRpdGlvbnMuCisgKiBUaGlzIGNvbXByb21pc2VzIGFjY3VyYWN5IHNsaWdodGx5LCBidXQgaXQgbGV0cyB1cyBzYXZlIGEgZmV3IHNoaWZ0cy4KKyAqIE1vcmUgaW1wb3J0YW50bHksIDE2LWJpdCBhcml0aG1ldGljIGlzIHRoZW4gYWRlcXVhdGUgKGZvciA4LWJpdCBzYW1wbGVzKQorICogZXZlcnl3aGVyZSBleGNlcHQgaW4gdGhlIG11bHRpcGxpY2F0aW9ucyBwcm9wZXI7IHRoaXMgc2F2ZXMgYSBnb29kIGRlYWwKKyAqIG9mIHdvcmsgb24gMTYtYml0LWludCBtYWNoaW5lcy4KKyAqCisgKiBUaGUgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIGFyZSBub3QgaW50ZWdlcnMgYmVjYXVzZSB0aGUgQUEmTiBzY2FsaW5nCisgKiBmYWN0b3JzIGhhdmUgYmVlbiBpbmNvcnBvcmF0ZWQuICBXZSByZXByZXNlbnQgdGhlbSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUywKKyAqIHNvIHRoYXQgdGhlIGZpcnN0IGFuZCBzZWNvbmQgSURDVCByb3VuZHMgaGF2ZSB0aGUgc2FtZSBpbnB1dCBzY2FsaW5nLgorICogRm9yIDgtYml0IEpTQU1QTEVzLCB3ZSBjaG9vc2UgSUZBU1RfU0NBTEVfQklUUyA9IFBBU1MxX0JJVFMgc28gYXMgdG8KKyAqIGF2b2lkIGEgZGVzY2FsaW5nIHNoaWZ0OyB0aGlzIGNvbXByb21pc2VzIGFjY3VyYWN5IHJhdGhlciBkcmFzdGljYWxseQorICogZm9yIHNtYWxsIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyaWVzLCBidXQgaXQgc2F2ZXMgYSBsb3Qgb2Ygc2hpZnRzLgorICogRm9yIDEyLWJpdCBKU0FNUExFcywgdGhlcmUncyBubyBob3BlIG9mIHVzaW5nIDE2eDE2IG11bHRpcGxpZXMgYW55d2F5LAorICogc28gd2UgdXNlIGEgbXVjaCBsYXJnZXIgc2NhbGluZyBmYWN0b3IgdG8gcHJlc2VydmUgYWNjdXJhY3kuCisgKgorICogQSBmaW5hbCBjb21wcm9taXNlIGlzIHRvIHJlcHJlc2VudCB0aGUgbXVsdGlwbGljYXRpdmUgY29uc3RhbnRzIHRvIG9ubHkKKyAqIDggZnJhY3Rpb25hbCBiaXRzLCByYXRoZXIgdGhhbiAxMy4gIFRoaXMgc2F2ZXMgc29tZSBzaGlmdGluZyB3b3JrIG9uIHNvbWUKKyAqIG1hY2hpbmVzLCBhbmQgbWF5IGFsc28gcmVkdWNlIHRoZSBjb3N0IG9mIG11bHRpcGxpY2F0aW9uIChzaW5jZSB0aGVyZQorICogYXJlIGZld2VyIG9uZS1iaXRzIGluIHRoZSBjb25zdGFudHMpLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICA4CisjZGVmaW5lIFBBU1MxX0JJVFMgIDIKKyNlbHNlCisjZGVmaW5lIENPTlNUX0JJVFMgIDgKKyNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyNlbmRpZgorCisvKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKKyAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgorICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KKyAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KKyAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCisgKi8KKworI2lmIENPTlNUX0JJVFMgPT0gOAorI2RlZmluZSBGSVhfMV8wODIzOTIyMDAgICgoSU5UMzIpICAyNzcpCQkvKiBGSVgoMS4wODIzOTIyMDApICovCisjZGVmaW5lIEZJWF8xXzQxNDIxMzU2MiAgKChJTlQzMikgIDM2MikJCS8qIEZJWCgxLjQxNDIxMzU2MikgKi8KKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgNDczKQkJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMl82MTMxMjU5MzAgICgoSU5UMzIpICA2NjkpCQkvKiBGSVgoMi42MTMxMjU5MzApICovCisjZWxzZQorI2RlZmluZSBGSVhfMV8wODIzOTIyMDAgIEZJWCgxLjA4MjM5MjIwMCkKKyNkZWZpbmUgRklYXzFfNDE0MjEzNTYyICBGSVgoMS40MTQyMTM1NjIpCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMl82MTMxMjU5MzAgIEZJWCgyLjYxMzEyNTkzMCkKKyNlbmRpZgorCisKKy8qIFdlIGNhbiBnYWluIGEgbGl0dGxlIG1vcmUgc3BlZWQsIHdpdGggYSBmdXJ0aGVyIGNvbXByb21pc2UgaW4gYWNjdXJhY3ksCisgKiBieSBvbWl0dGluZyB0aGUgYWRkaXRpb24gaW4gYSBkZXNjYWxpbmcgc2hpZnQuICBUaGlzIHlpZWxkcyBhbiBpbmNvcnJlY3RseQorICogcm91bmRlZCByZXN1bHQgaGFsZiB0aGUgdGltZS4uLgorICovCisKKyNpZm5kZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCisjdW5kZWYgREVTQ0FMRQorI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCisjZW5kaWYKKworCisvKiBNdWx0aXBseSBhIERDVEVMRU0gdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQsIGFuZCBpbW1lZGlhdGVseQorICogZGVzY2FsZSB0byB5aWVsZCBhIERDVEVMRU0gcmVzdWx0LgorICovCisKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKChEQ1RFTEVNKSBERVNDQUxFKCh2YXIpICogKGNvbnN0KSwgQ09OU1RfQklUUykpCisKKworLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCisgKiBlbnRyeTsgcHJvZHVjZSBhIERDVEVMRU0gcmVzdWx0LiAgRm9yIDgtYml0IGRhdGEgYSAxNngxNi0+MTYKKyAqIG11bHRpcGxpY2F0aW9uIHdpbGwgZG8uICBGb3IgMTItYml0IGRhdGEsIHRoZSBtdWx0aXBsaWVyIHRhYmxlIGlzCisgKiBkZWNsYXJlZCBJTlQzMiwgc28gYSAzMi1iaXQgbXVsdGlwbHkgd2lsbCBiZSB1c2VkLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChJRkFTVF9NVUxUX1RZUEUpIChjb2VmKSkgKiAocXVhbnR2YWwpKQorI2Vsc2UKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgXAorCURFU0NBTEUoKGNvZWYpKihxdWFudHZhbCksIElGQVNUX1NDQUxFX0JJVFMtUEFTUzFfQklUUykKKyNlbmRpZgorCisKKy8qIExpa2UgREVTQ0FMRSwgYnV0IGFwcGxpZXMgdG8gYSBEQ1RFTEVNIGFuZCBwcm9kdWNlcyBhbiBpbnQuCisgKiBXZSBhc3N1bWUgdGhhdCBpbnQgcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgaWYgSU5UMzIgcmlnaHQgc2hpZnQgaXMuCisgKi8KKworI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisjZGVmaW5lIElTSElGVF9URU1QUwlEQ1RFTEVNIGlzaGlmdF90ZW1wOworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIERDVEVMRU1CSVRTICAxNgkJLyogRENURUxFTSBtYXkgYmUgMTYgb3IgMzIgYml0cyAqLworI2Vsc2UKKyNkZWZpbmUgRENURUxFTUJJVFMgIDMyCQkvKiBEQ1RFTEVNIG11c3QgYmUgMzIgYml0cyAqLworI2VuZGlmCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpICBcCisgICAgKChpc2hpZnRfdGVtcCA9ICh4KSkgPCAwID8gXAorICAgICAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSB8ICgofigoRENURUxFTSkgMCkpIDw8IChEQ1RFTEVNQklUUy0oc2hmdCkpKSA6IFwKKyAgICAgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkpCisjZWxzZQorI2RlZmluZSBJU0hJRlRfVEVNUFMKKyNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkJKCh4KSA+PiAoc2hmdCkpCisjZW5kaWYKKworI2lmZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI2RlZmluZSBJREVTQ0FMRSh4LG4pICAoKGludCkgSVJJR0hUX1NISUZUKCh4KSArICgxIDw8ICgobiktMSkpLCBuKSkKKyNlbHNlCisjZGVmaW5lIElERVNDQUxFKHgsbikgICgoaW50KSBJUklHSFRfU0hJRlQoeCwgbikpCisjZW5kaWYKKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF9pZmFzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIERDVEVMRU0gdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgRENURUxFTSB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgRENURUxFTSB6NSwgejEwLCB6MTEsIHoxMiwgejEzOworICBKQ09FRlBUUiBpbnB0cjsKKyAgSUZBU1RfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMJCQkvKiBmb3IgREVTQ0FMRSAqLworICBJU0hJRlRfVEVNUFMJCQkvKiBmb3IgSURFU0NBTEUgKi8KKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJRkFTVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBjdHItLSkgeworICAgIC8qIER1ZSB0byBxdWFudGl6YXRpb24sIHdlIHdpbGwgdXN1YWxseSBmaW5kIHRoYXQgbWFueSBvZiB0aGUgaW5wdXQKKyAgICAgKiBjb2VmZmljaWVudHMgYXJlIHplcm8sIGVzcGVjaWFsbHkgdGhlIEFDIHRlcm1zLiAgV2UgY2FuIGV4cGxvaXQgdGhpcworICAgICAqIGJ5IHNob3J0LWNpcmN1aXRpbmcgdGhlIElEQ1QgY2FsY3VsYXRpb24gZm9yIGFueSBjb2x1bW4gaW4gd2hpY2ggYWxsCisgICAgICogdGhlIEFDIHRlcm1zIGFyZSB6ZXJvLiAgSW4gdGhhdCBjYXNlIGVhY2ggb3V0cHV0IGlzIGVxdWFsIHRvIHRoZQorICAgICAqIERDIGNvZWZmaWNpZW50ICh3aXRoIHNjYWxlIGZhY3RvciBhcyBuZWVkZWQpLgorICAgICAqIFdpdGggdHlwaWNhbCBpbWFnZXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMsIGhhbGYgb3IgbW9yZSBvZiB0aGUKKyAgICAgKiBjb2x1bW4gRENUIGNhbGN1bGF0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCB0aGlzIHdheS4KKyAgICAgKi8KKyAgICAKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgaW50IGRjdmFsID0gKGludCkgREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKworICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOworICAgICAgCisgICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICAgIHF1YW50cHRyKys7CisgICAgICB3c3B0cisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7CisgICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwkvKiBwaGFzZSAzICovCisgICAgdG1wMTEgPSB0bXAwIC0gdG1wMjsKKworICAgIHRtcDEzID0gdG1wMSArIHRtcDM7CS8qIHBoYXNlcyA1LTMgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEgLSB0bXAzLCBGSVhfMV80MTQyMTM1NjIpIC0gdG1wMTM7IC8qIDIqYzQgKi8KKworICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwkvKiBwaGFzZSAyICovCisgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHRtcDUgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHRtcDYgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDcgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgejEzID0gdG1wNiArIHRtcDU7CQkvKiBwaGFzZSA2ICovCisgICAgejEwID0gdG1wNiAtIHRtcDU7CisgICAgejExID0gdG1wNCArIHRtcDc7CisgICAgejEyID0gdG1wNCAtIHRtcDc7CisKKyAgICB0bXA3ID0gejExICsgejEzOwkJLyogcGhhc2UgNSAqLworICAgIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOyAvKiAyKmM0ICovCisKKyAgICB6NSA9IE1VTFRJUExZKHoxMCArIHoxMiwgRklYXzFfODQ3NzU5MDY1KTsgLyogMipjMiAqLworICAgIHRtcDEwID0gTVVMVElQTFkoejEyLCBGSVhfMV8wODIzOTIyMDApIC0gejU7IC8qIDIqKGMyLWM2KSAqLworICAgIHRtcDEyID0gTVVMVElQTFkoejEwLCAtIEZJWF8yXzYxMzEyNTkzMCkgKyB6NTsgLyogLTIqKGMyK2M2KSAqLworCisgICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsJLyogcGhhc2UgMiAqLworICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7CisgICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKKworICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSAodG1wMCArIHRtcDcpOworICAgIHdzcHRyW0RDVFNJWkUqN10gPSAoaW50KSAodG1wMCAtIHRtcDcpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSAodG1wMSArIHRtcDYpOworICAgIHdzcHRyW0RDVFNJWkUqNl0gPSAoaW50KSAodG1wMSAtIHRtcDYpOworICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSAodG1wMiArIHRtcDUpOworICAgIHdzcHRyW0RDVFNJWkUqNV0gPSAoaW50KSAodG1wMiAtIHRtcDUpOworICAgIHdzcHRyW0RDVFNJWkUqNF0gPSAoaW50KSAodG1wMyArIHRtcDQpOworICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSAodG1wMyAtIHRtcDQpOworCisgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgcXVhbnRwdHIrKzsKKyAgICB3c3B0cisrOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMywgKi8KKyAgLyogYW5kIGFsc28gdW5kbyB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgorICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbworICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgorICAgICAqIE9uIG1hY2hpbmVzIHdpdGggdmVyeSBmYXN0IG11bHRpcGxpY2F0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCisgICAgICogdGVzdCB0YWtlcyBtb3JlIHRpbWUgdGhhbiBpdCdzIHdvcnRoLiAgSW4gdGhhdCBjYXNlIHRoaXMgc2VjdGlvbgorICAgICAqIG1heSBiZSBjb21tZW50ZWQgb3V0LgorICAgICAqLworICAgIAorI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzRdID09IDAgJiYKKwl3c3B0cls1XSA9PSAwICYmIHdzcHRyWzZdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFtJREVTQ0FMRSh3c3B0clswXSwgUEFTUzFfQklUUyszKQorCQkJCSAgJiBSQU5HRV9NQVNLXTsKKyAgICAgIAorICAgICAgb3V0cHRyWzBdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsyXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzNdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls1XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzZdID0gZGN2YWw7CisgICAgICBvdXRwdHJbN10gPSBkY3ZhbDsKKworICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgICAgY29udGludWU7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMCA9ICgoRENURUxFTSkgd3NwdHJbMF0gKyAoRENURUxFTSkgd3NwdHJbNF0pOworICAgIHRtcDExID0gKChEQ1RFTEVNKSB3c3B0clswXSAtIChEQ1RFTEVNKSB3c3B0cls0XSk7CisKKyAgICB0bXAxMyA9ICgoRENURUxFTSkgd3NwdHJbMl0gKyAoRENURUxFTSkgd3NwdHJbNl0pOworICAgIHRtcDEyID0gTVVMVElQTFkoKERDVEVMRU0pIHdzcHRyWzJdIC0gKERDVEVMRU0pIHdzcHRyWzZdLCBGSVhfMV80MTQyMTM1NjIpCisJICAgIC0gdG1wMTM7CisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsKKyAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKKyAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MTMgPSAoRENURUxFTSkgd3NwdHJbNV0gKyAoRENURUxFTSkgd3NwdHJbM107CisgICAgejEwID0gKERDVEVMRU0pIHdzcHRyWzVdIC0gKERDVEVMRU0pIHdzcHRyWzNdOworICAgIHoxMSA9IChEQ1RFTEVNKSB3c3B0clsxXSArIChEQ1RFTEVNKSB3c3B0cls3XTsKKyAgICB6MTIgPSAoRENURUxFTSkgd3NwdHJbMV0gLSAoRENURUxFTSkgd3NwdHJbN107CisKKyAgICB0bXA3ID0gejExICsgejEzOwkJLyogcGhhc2UgNSAqLworICAgIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOyAvKiAyKmM0ICovCisKKyAgICB6NSA9IE1VTFRJUExZKHoxMCArIHoxMiwgRklYXzFfODQ3NzU5MDY1KTsgLyogMipjMiAqLworICAgIHRtcDEwID0gTVVMVElQTFkoejEyLCBGSVhfMV8wODIzOTIyMDApIC0gejU7IC8qIDIqKGMyLWM2KSAqLworICAgIHRtcDEyID0gTVVMVElQTFkoejEwLCAtIEZJWF8yXzYxMzEyNTkzMCkgKyB6NTsgLyogLTIqKGMyK2M2KSAqLworCisgICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsJLyogcGhhc2UgMiAqLworICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7CisgICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogc2NhbGUgZG93biBieSBhIGZhY3RvciBvZiA4IGFuZCByYW5nZS1saW1pdCAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMCArIHRtcDcsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDAgLSB0bXA3LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxICsgdG1wNiwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMSAtIHRtcDYsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDIgKyB0bXA1LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAyIC0gdG1wNSwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMyArIHRtcDQsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDMgLSB0bXA0LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0lGQVNUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qaWRjdGludC5jIGIvanBlZy9qaWRjdGludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2ppZGN0aW50LmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBqaWRjdGludC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiAgSW4gdGhlIElKRyBjb2RlLCB0aGlzIHJvdXRpbmUKKyAqIG11c3QgYWxzbyBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dCBjb2VmZmljaWVudHMuCisgKgorICogQSAyLUQgSURDVCBjYW4gYmUgZG9uZSBieSAxLUQgSURDVCBvbiBlYWNoIGNvbHVtbiBmb2xsb3dlZCBieSAxLUQgSURDVAorICogb24gZWFjaCByb3cgKG9yIHZpY2UgdmVyc2EsIGJ1dCBpdCdzIG1vcmUgY29udmVuaWVudCB0byBlbWl0IGEgcm93IGF0CisgKiBhIHRpbWUpLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUgbXVjaCBtb3JlCisgKiBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgorICogICBDLiBMb2VmZmxlciwgQS4gTGlndGVuYmVyZyBhbmQgRy4gTW9zY2h5dHosICJQcmFjdGljYWwgRmFzdCAxLUQgRENUCisgKiAgIEFsZ29yaXRobXMgd2l0aCAxMSBNdWx0aXBsaWNhdGlvbnMiLCBQcm9jLiBJbnQnbC4gQ29uZi4gb24gQWNvdXN0aWNzLAorICogICBTcGVlY2gsIGFuZCBTaWduYWwgUHJvY2Vzc2luZyAxOTg5IChJQ0FTU1AgJzg5KSwgcHAuIDk4OC05OTEuCisgKiBUaGUgcHJpbWFyeSBhbGdvcml0aG0gZGVzY3JpYmVkIHRoZXJlIHVzZXMgMTEgbXVsdGlwbGllcyBhbmQgMjkgYWRkcy4KKyAqIFdlIHVzZSB0aGVpciBhbHRlcm5hdGUgbWV0aG9kIHdpdGggMTIgbXVsdGlwbGllcyBhbmQgMzIgYWRkcy4KKyAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCBubyBkYXRhIHBhdGggY29udGFpbnMgbW9yZSB0aGFuIG9uZQorICogbXVsdGlwbGljYXRpb247IHRoaXMgYWxsb3dzIGEgdmVyeSBzaW1wbGUgYW5kIGFjY3VyYXRlIGltcGxlbWVudGF0aW9uIGluCisgKiBzY2FsZWQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYywgd2l0aCBhIG1pbmltYWwgbnVtYmVyIG9mIHNoaWZ0cy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKgorICogVGhlIHBvb3Agb24gdGhpcyBzY2FsaW5nIHN0dWZmIGlzIGFzIGZvbGxvd3M6CisgKgorICogRWFjaCAxLUQgSURDVCBzdGVwIHByb2R1Y2VzIG91dHB1dHMgd2hpY2ggYXJlIGEgZmFjdG9yIG9mIHNxcnQoTikKKyAqIGxhcmdlciB0aGFuIHRoZSB0cnVlIElEQ1Qgb3V0cHV0cy4gIFRoZSBmaW5hbCBvdXRwdXRzIGFyZSB0aGVyZWZvcmUKKyAqIGEgZmFjdG9yIG9mIE4gbGFyZ2VyIHRoYW4gZGVzaXJlZDsgc2luY2UgTj04IHRoaXMgY2FuIGJlIGN1cmVkIGJ5CisgKiBhIHNpbXBsZSByaWdodCBzaGlmdCBhdCB0aGUgZW5kIG9mIHRoZSBhbGdvcml0aG0uICBUaGUgYWR2YW50YWdlIG9mCisgKiB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgd2Ugc2F2ZSB0d28gbXVsdGlwbGljYXRpb25zIHBlciAxLUQgSURDVCwKKyAqIGJlY2F1c2UgdGhlIHkwIGFuZCB5NCBpbnB1dHMgbmVlZCBub3QgYmUgZGl2aWRlZCBieSBzcXJ0KE4pLgorICoKKyAqIFdlIGhhdmUgdG8gZG8gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIG9mIHRoZSBpbnRlZ2VyIGlucHV0cywgd2hpY2gKKyAqIGlzIG5vIHByb2JsZW0sIGFuZCBtdWx0aXBsaWNhdGlvbiBieSBmcmFjdGlvbmFsIGNvbnN0YW50cywgd2hpY2ggaXMKKyAqIGEgcHJvYmxlbSB0byBkbyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMuICBXZSBtdWx0aXBseSBhbGwgdGhlIGNvbnN0YW50cworICogYnkgQ09OU1RfU0NBTEUgYW5kIGNvbnZlcnQgdGhlbSB0byBpbnRlZ2VyIGNvbnN0YW50cyAodGh1cyByZXRhaW5pbmcKKyAqIENPTlNUX0JJVFMgYml0cyBvZiBwcmVjaXNpb24gaW4gdGhlIGNvbnN0YW50cykuICBBZnRlciBkb2luZyBhCisgKiBtdWx0aXBsaWNhdGlvbiB3ZSBoYXZlIHRvIGRpdmlkZSB0aGUgcHJvZHVjdCBieSBDT05TVF9TQ0FMRSwgd2l0aCBwcm9wZXIKKyAqIHJvdW5kaW5nLCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dC4gIFRoaXMgZGl2aXNpb24gY2FuIGJlIGRvbmUKKyAqIGNoZWFwbHkgYXMgYSByaWdodCBzaGlmdCBvZiBDT05TVF9CSVRTIGJpdHMuICBXZSBwb3N0cG9uZSBzaGlmdGluZworICogYXMgbG9uZyBhcyBwb3NzaWJsZSBzbyB0aGF0IHBhcnRpYWwgc3VtcyBjYW4gYmUgYWRkZWQgdG9nZXRoZXIgd2l0aAorICogZnVsbCBmcmFjdGlvbmFsIHByZWNpc2lvbi4KKyAqCisgKiBUaGUgb3V0cHV0cyBvZiB0aGUgZmlyc3QgcGFzcyBhcmUgc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMgYml0cyBzbyB0aGF0CisgKiB0aGV5IGFyZSByZXByZXNlbnRlZCB0byBiZXR0ZXItdGhhbi1pbnRlZ3JhbCBwcmVjaXNpb24uICBUaGVzZSBvdXRwdXRzCisgKiByZXF1aXJlIEJJVFNfSU5fSlNBTVBMRSArIFBBU1MxX0JJVFMgKyAzIGJpdHM7IHRoaXMgZml0cyBpbiBhIDE2LWJpdCB3b3JkCisgKiB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLiAgKFRvIHNjYWxlIHVwIDEyLWJpdCBzYW1wbGUgZGF0YSBmdXJ0aGVyLCBhbgorICogaW50ZXJtZWRpYXRlIElOVDMyIGFycmF5IHdvdWxkIGJlIG5lZWRlZC4pCisgKgorICogVG8gYXZvaWQgb3ZlcmZsb3cgb2YgdGhlIDMyLWJpdCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpbiBwYXNzIDIsIHdlIG11c3QKKyAqIGhhdmUgQklUU19JTl9KU0FNUExFICsgQ09OU1RfQklUUyArIFBBU1MxX0JJVFMgPD0gMjYuICBFcnJvciBhbmFseXNpcworICogc2hvd3MgdGhhdCB0aGUgdmFsdWVzIGdpdmVuIGJlbG93IGFyZSB0aGUgbW9zdCBlZmZlY3RpdmUuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDIKKyNlbHNlCisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDEzCisjZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgKChJTlQzMikgIDI0NDYpCS8qIEZJWCgwLjI5ODYzMTMzNikgKi8KKyNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICAoKElOVDMyKSAgMzE5NikJLyogRklYKDAuMzkwMTgwNjQ0KSAqLworI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoSU5UMzIpICA0NDMzKQkvKiBGSVgoMC41NDExOTYxMDApICovCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICAoKElOVDMyKSAgNzM3MykJLyogRklYKDAuODk5OTc2MjIzKSAqLworI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgICgoSU5UMzIpICA5NjMzKQkvKiBGSVgoMS4xNzU4NzU2MDIpICovCisjZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgKChJTlQzMikgIDEyMjk5KQkvKiBGSVgoMS41MDEzMjExMTApICovCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDE1MTM3KQkvKiBGSVgoMS44NDc3NTkwNjUpICovCisjZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgKChJTlQzMikgIDE2MDY5KQkvKiBGSVgoMS45NjE1NzA1NjApICovCisjZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgKChJTlQzMikgIDE2ODE5KQkvKiBGSVgoMi4wNTMxMTk4NjkpICovCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgKChJTlQzMikgIDIwOTk1KQkvKiBGSVgoMi41NjI5MTU0NDcpICovCisjZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgKChJTlQzMikgIDI1MTcyKQkvKiBGSVgoMy4wNzI3MTEwMjYpICovCisjZWxzZQorI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgIEZJWCgwLjI5ODYzMTMzNikKKyNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICBGSVgoMC4zOTAxODA2NDQpCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQorI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCisjZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgRklYKDEuMTc1ODc1NjAyKQorI2RlZmluZSBGSVhfMV81MDEzMjExMTAgIEZJWCgxLjUwMTMyMTExMCkKKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCisjZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgRklYKDEuOTYxNTcwNTYwKQorI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgIEZJWCgyLjA1MzExOTg2OSkKKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCisjZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgRklYKDMuMDcyNzExMDI2KQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgorICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQorICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQorICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KKyAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCisjZWxzZQorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKworLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCisgKiBlbnRyeTsgcHJvZHVjZSBhbiBpbnQgcmVzdWx0LiAgSW4gdGhpcyBtb2R1bGUsIGJvdGggaW5wdXRzIGFuZCByZXN1bHQKKyAqIGFyZSAxNiBiaXRzIG9yIGxlc3MsIHNvIGVpdGhlciBpbnQgb3Igc2hvcnQgbXVsdGlwbHkgd2lsbCB3b3JrLgorICovCisKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSVNMT1dfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF9pc2xvdyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgSURDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBjdHItLSkgeworICAgIC8qIER1ZSB0byBxdWFudGl6YXRpb24sIHdlIHdpbGwgdXN1YWxseSBmaW5kIHRoYXQgbWFueSBvZiB0aGUgaW5wdXQKKyAgICAgKiBjb2VmZmljaWVudHMgYXJlIHplcm8sIGVzcGVjaWFsbHkgdGhlIEFDIHRlcm1zLiAgV2UgY2FuIGV4cGxvaXQgdGhpcworICAgICAqIGJ5IHNob3J0LWNpcmN1aXRpbmcgdGhlIElEQ1QgY2FsY3VsYXRpb24gZm9yIGFueSBjb2x1bW4gaW4gd2hpY2ggYWxsCisgICAgICogdGhlIEFDIHRlcm1zIGFyZSB6ZXJvLiAgSW4gdGhhdCBjYXNlIGVhY2ggb3V0cHV0IGlzIGVxdWFsIHRvIHRoZQorICAgICAqIERDIGNvZWZmaWNpZW50ICh3aXRoIHNjYWxlIGZhY3RvciBhcyBuZWVkZWQpLgorICAgICAqIFdpdGggdHlwaWNhbCBpbWFnZXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMsIGhhbGYgb3IgbW9yZSBvZiB0aGUKKyAgICAgKiBjb2x1bW4gRENUIGNhbGN1bGF0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCB0aGlzIHdheS4KKyAgICAgKi8KKyAgICAKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOworICAgICAgCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7CisgICAgICAKKyAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgICAgcXVhbnRwdHIrKzsKKyAgICAgIHdzcHRyKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLyogRXZlbiBwYXJ0OiByZXZlcnNlIHRoZSBldmVuIHBhcnQgb2YgdGhlIGZvcndhcmQgRENULiAqLworICAgIC8qIFRoZSByb3RhdG9yIGlzIHNxcnQoMikqYygtNikuICovCisgICAgCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejMsIC0gRklYXzFfODQ3NzU5MDY1KTsKKyAgICB0bXAzID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworCisgICAgdG1wMCA9ICh6MiArIHozKSA8PCBDT05TVF9CSVRTOworICAgIHRtcDEgPSAoejIgLSB6MykgPDwgQ09OU1RfQklUUzsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgODsgdGhlIG1hdHJpeCBpcyB1bml0YXJ5IGFuZCBoZW5jZSBpdHMKKyAgICAgKiB0cmFuc3Bvc2UgaXMgaXRzIGludmVyc2UuICBpMC4uaTMgYXJlIHk3LHk1LHkzLHkxIHJlc3BlY3RpdmVseS4KKyAgICAgKi8KKyAgICAKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKKyAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICAKKyAgICB6MSA9IHRtcDAgKyB0bXAzOworICAgIHoyID0gdG1wMSArIHRtcDI7CisgICAgejMgPSB0bXAwICsgdG1wMjsKKyAgICB6NCA9IHRtcDEgKyB0bXAzOworICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHRtcDAsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLworICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxLCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KKyAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCisgICAgdG1wMyA9IE1VTFRJUExZKHRtcDMsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLworICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIAorICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworICAgIAorICAgIHRtcDAgKz0gejEgKyB6MzsKKyAgICB0bXAxICs9IHoyICsgejQ7CisgICAgdG1wMiArPSB6MiArIHozOworICAgIHRtcDMgKz0gejEgKyB6NDsKKyAgICAKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCisgICAgCisgICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqN10gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMSArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo2XSA9IChpbnQpIERFU0NBTEUodG1wMTEgLSB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpIERFU0NBTEUodG1wMTMgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqNF0gPSAoaW50KSBERVNDQUxFKHRtcDEzIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICAKKyAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICBxdWFudHB0cisrOworICAgIHdzcHRyKys7CisgIH0KKyAgCisgIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisgIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLCAqLworICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCisgICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCisgICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCisgICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCisgICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCisgICAgICovCisgICAgCisjaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKKyAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clsyXSA9PSAwICYmIHdzcHRyWzNdID09IDAgJiYgd3NwdHJbNF0gPT0gMCAmJgorCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQorCQkJCSAgJiBSQU5HRV9NQVNLXTsKKyAgICAgIAorICAgICAgb3V0cHRyWzBdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsyXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzNdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls1XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzZdID0gZGN2YWw7CisgICAgICBvdXRwdHJbN10gPSBkY3ZhbDsKKworICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgICAgY29udGludWU7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLyogRXZlbiBwYXJ0OiByZXZlcnNlIHRoZSBldmVuIHBhcnQgb2YgdGhlIGZvcndhcmQgRENULiAqLworICAgIC8qIFRoZSByb3RhdG9yIGlzIHNxcnQoMikqYygtNikuICovCisgICAgCisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHozID0gKElOVDMyKSB3c3B0cls2XTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejMsIC0gRklYXzFfODQ3NzU5MDY1KTsKKyAgICB0bXAzID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB0bXAwID0gKChJTlQzMikgd3NwdHJbMF0gKyAoSU5UMzIpIHdzcHRyWzRdKSA8PCBDT05TVF9CSVRTOworICAgIHRtcDEgPSAoKElOVDMyKSB3c3B0clswXSAtIChJTlQzMikgd3NwdHJbNF0pIDw8IENPTlNUX0JJVFM7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCisgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgCisgICAgdG1wMCA9IChJTlQzMikgd3NwdHJbN107CisgICAgdG1wMSA9IChJTlQzMikgd3NwdHJbNV07CisgICAgdG1wMiA9IChJTlQzMikgd3NwdHJbM107CisgICAgdG1wMyA9IChJTlQzMikgd3NwdHJbMV07CisgICAgCisgICAgejEgPSB0bXAwICsgdG1wMzsKKyAgICB6MiA9IHRtcDEgKyB0bXAyOworICAgIHozID0gdG1wMCArIHRtcDI7CisgICAgejQgPSB0bXAxICsgdG1wMzsKKyAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAxID0gTVVMVElQTFkodG1wMSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDIsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICAKKyAgICB6MyArPSB6NTsKKyAgICB6NCArPSB6NTsKKyAgICAKKyAgICB0bXAwICs9IHoxICsgejM7CisgICAgdG1wMSArPSB6MiArIHo0OworICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICB0bXAzICs9IHoxICsgejQ7CisgICAgCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLworICAgIAorICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAzLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDExICsgdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTEgLSB0bXAyLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMSwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTMgKyB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICAKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9JU0xPV19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvamlkY3RpbnRlbHNzZS5jIGIvanBlZy9qaWRjdGludGVsc3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1YzkzYgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamlkY3RpbnRlbHNzZS5jCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBBTkRST0lEX0lOVEVMU1NFMl9JRENUCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKyNkZWZpbmUgQklUU19JTlZfQUNDIDQKKyNkZWZpbmUgU0hJRlRfSU5WX1JPVyAxMgorI2RlZmluZSBTSElGVF9JTlZfQ09MIDUKK2NvbnN0IHNob3J0IFJORF9JTlZfUk9XID0gMjA0ODsKK2NvbnN0IHNob3J0IFJORF9JTlZfQ09MID0gMTY7Citjb25zdCBzaG9ydCBSTkRfSU5WX0NPUlIgPSAxNTsKKworc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfb25lX2NvcnJbOF0gPSB7MSwxLDEsMSwxLDEsMSwxfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBNMTI4X3JvdW5kX2ludl9yb3dbOF0gPSB7MjA0OCwwLDIwNDgsMCwyMDQ4LDAsMjA0OCwwfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBNMTI4X3JvdW5kX2ludl9jb2xbOF0gPSB7MTYsMTYsMTYsMTYsMTYsMTYsMTYsMTZ9Oworc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfcm91bmRfaW52X2NvcnJbOF0gPSB7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF90Z18xXzE2WzhdID0gezEzMDM2LCAxMzAzNiwgMTMwMzYsIDEzMDM2LCAxMzAzNiwgMTMwMzYsIDEzMDM2LCAxMzAzNn07CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF90Z18yXzE2WzhdID0gezI3MTQ2LCAyNzE0NiwgMjcxNDYsIDI3MTQ2LCAyNzE0NiwgMjcxNDYsIDI3MTQ2LCAyNzE0Nn07CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF90Z18zXzE2WzhdID0gey0yMTc0NiwgLTIxNzQ2LCAtMjE3NDYsIC0yMTc0NiwgLTIxNzQ2LCAtMjE3NDYsIC0yMTc0NiwgLTIxNzQ2fTsKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBNMTI4X2Nvc180XzE2WzhdID0gey0xOTE5NSwgLTE5MTk1LCAtMTkxOTUsIC0xOTE5NSwgLTE5MTk1LCAtMTkxOTUsIC0xOTE5NSwgLTE5MTk1fTsKKworc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIGpwZWdfYWRqdXN0WzhdID0gezEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fTsKKworLy8gVGFibGUgZm9yIHJvd3MgMCw0CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF90YWJfaV8wNFszMl0gPSB7CisxNjM4NCwgMjE0MDcsIDE2Mzg0LCA4ODY3LAorMTYzODQsIC04ODY3LCAxNjM4NCwgLTIxNDA3LAorMTYzODQsIDg4NjcsIC0xNjM4NCwgLTIxNDA3LAorLTE2Mzg0LCAyMTQwNywgMTYzODQsIC04ODY3LAorMjI3MjUsIDE5MjY2LCAxOTI2NiwgLTQ1MjAsCisxMjg3MywgLTIyNzI1LCA0NTIwLCAtMTI4NzMsCisxMjg3MywgNDUyMCwgLTIyNzI1LCAtMTI4NzMsCis0NTIwLCAxOTI2NiwgMTkyNjYsIC0yMjcyNQorfTsKKworLy8gVGFibGUgZm9yIHJvd3MgMSw3CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF90YWJfaV8xN1szMl0gPSB7CisyMjcyNSwgMjk2OTIsIDIyNzI1LCAxMjI5OSwKKzIyNzI1LCAtMTIyOTksIDIyNzI1LCAtMjk2OTIsCisyMjcyNSwgMTIyOTksIC0yMjcyNSwgLTI5NjkyLAorLTIyNzI1LCAyOTY5MiwgMjI3MjUsIC0xMjI5OSwKKzMxNTIxLCAyNjcyMiwgMjY3MjIsIC02MjcwLAorMTc4NTUsIC0zMTUyMSwgNjI3MCwgLTE3ODU1LAorMTc4NTUsIDYyNzAsIC0zMTUyMSwgLTE3ODU1LAorNjI3MCwgMjY3MjIsIDI2NzIyLCAtMzE1MjEKK307CisKKy8vIFRhYmxlIGZvciByb3dzIDIsNgorc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfdGFiX2lfMjZbMzJdID0geworMjE0MDcsIDI3OTY5LCAyMTQwNywgMTE1ODUsCisyMTQwNywgLTExNTg1LCAyMTQwNywgLTI3OTY5LAorMjE0MDcsIDExNTg1LCAtMjE0MDcsIC0yNzk2OSwKKy0yMTQwNywgMjc5NjksIDIxNDA3LCAtMTE1ODUsCisyOTY5MiwgMjUxNzIsIDI1MTcyLCAtNTkwNiwKKzE2ODE5LCAtMjk2OTIsIDU5MDYsIC0xNjgxOSwKKzE2ODE5LCA1OTA2LCAtMjk2OTIsIC0xNjgxOSwKKzU5MDYsIDI1MTcyLCAyNTE3MiwgLTI5NjkyCit9OworCisvLyBUYWJsZSBmb3Igcm93cyAzLDUKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBNMTI4X3RhYl9pXzM1WzMyXSA9IHsKKzE5MjY2LCAyNTE3MiwgMTkyNjYsIDEwNDI2LAorMTkyNjYsIC0xMDQyNiwgMTkyNjYsIC0yNTE3MiwKKzE5MjY2LCAxMDQyNiwgLTE5MjY2LCAtMjUxNzIsCistMTkyNjYsIDI1MTcyLCAxOTI2NiwgLTEwNDI2LAorMjY3MjIsIDIyNjU0LCAyMjY1NCwgLTUzMTUsCisxNTEzNywgLTI2NzIyLCA1MzE1LCAtMTUxMzcsCisxNTEzNywgNTMxNSwgLTI2NzIyLCAtMTUxMzcsCis1MzE1LCAyMjY1NCwgMjI2NTQsIC0yNjcyMgorfTsKKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cyBieSBTU0UuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfaW50ZWxzc2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBfX20xMjhpIHJvdzAsIHRtcDEsIHRtcDIsIHRtcDMsIHJvdzIsIHRtcDUsIHRtcDYsIHRtcDc7CisgIGludCBjdHI7CisgIEpTQU1QUk9XICBvdXRwdHJUZW1wOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBzaG9ydCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpIHF1YW50cHRyU1NFW0RDVFNJWkUyXTsKKyAgc2hvcnQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSB3b3Jrc3BhY2VTU0VbRENUU0laRTJdOworICBzaG9ydCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpIGNvZWZfYmxvY2tTU0VbRENUU0laRTJdOworICBfX20xMjhpIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NzsKKyAgX19tMTI4aSogdGczLCAqdGcxLCAqdGcyLCAqY29zNDsKKyAgX19tMTI4aSB0bTc2NSwgdHA3NjUsIHRtNDY1LCB0cDQ2NSwgdHAwMywgdG0wMywgdHAxMiwgdG0xMiwgdHA2NSwgdG02NTsKKyAgX19tMTI4aSB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDc7CisgIF9fbTEyOGkgdGVtcCwgdGVtcDI7CisgIHNob3J0ICogd3NwdHI7CisgIHVuc2lnbmVkIGNoYXIgKiBvdXRwdHI7CisKKyNkZWZpbmUgaURDVF84XzJST1dzKHRhYmxlMSwgdGFibGUyKSAgIFwKKyAgICByb3cwID0gX21tX3NodWZmbGVsb19lcGkxNihyb3cwLCAweEQ4KTsgLyp4NywgeDYsIHg1LCB4NCwgeDMsIHgxLCB4MiwgeDAqLyAgICBcCisgICAgcm93MiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYocm93MiwgMHhEOCk7ICAgXAorICAgIHRtcDEgPSBfbW1fc2h1ZmZsZV9lcGkzMihyb3cwLCAwKTsgICAgICAvKngyLCB4MCwgeDIsIHgwLCB4MiwgeDAsIHgyLCB4MCovICAgIFwKKyAgICB0bXA1ID0gX21tX3NodWZmbGVfZXBpMzIocm93MiwgMCk7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDMgPSBfbW1fc2h1ZmZsZV9lcGkzMihyb3cwLCAweDU1KTsgICAvKngzLCB4MSwgeDMsIHgxLCB4MywgeDEsIHgzLCB4MSovICAgIFwKKyAgICB0bXA3ID0gX21tX3NodWZmbGVfZXBpMzIocm93MiwgMHg1NSk7ICAgICBcCisgICAgcm93MCA9IF9tbV9zaHVmZmxlaGlfZXBpMTYocm93MCwgMHhEOCk7IC8qeDcsIHg1LCB4NiwgeDQsIHgzLCB4MSwgeDIsIHgwKi8gICAgXAorICAgIHJvdzIgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KHJvdzIsIDB4RDgpOyAgIFwKKwkJCQkJCVwKKyAgICB0bXAxID0gX21tX21hZGRfZXBpMTYodG1wMSwgKiAoIF9fbTEyOGkqKXRhYmxlMSk7ICAgICAgLyp4Mip3MTMreDAqdzEyLCB4Mip3OSt4MCp3OCwgeDIqdzUreDAqdzQsIHgyKncxK3gwKncwKi8gICBcCisgICAgdG1wNSA9IF9tbV9tYWRkX2VwaTE2KHRtcDUsICogKCBfX20xMjhpKil0YWJsZTIpOyAgICAgICBcCisJCQkJCQlcCisgICAgdG1wMiA9ICBfbW1fc2h1ZmZsZV9lcGkzMihyb3cwLCAweEFBKTsgIC8qeDYsIHg0LCB4NiwgeDQsIHg2LCB4NCwgeDYsIHg0Ki8gICAgXAorICAgIHRtcDYgPSBfbW1fc2h1ZmZsZV9lcGkzMihyb3cyLCAweEFBKTsgICAgIFwKKyAgICByb3cwID0gX21tX3NodWZmbGVfZXBpMzIocm93MCwgMHhGRik7ICAgLyp4NywgeDUsIHg3LCB4NSwgeDcsIHg1LCB4NywgeDUqLyAgICBcCisgICAgcm93MiA9IF9tbV9zaHVmZmxlX2VwaTMyKHJvdzIsIDB4RkYpOyAgICAgXAorXAorICAgIHRtcDMgPSBfbW1fbWFkZF9lcGkxNih0bXAzLCAqICggX19tMTI4aSopKHRhYmxlMSsxNikpOyAvKngzKncyOSt4MSp3MjgsIHgzKncyNSt4MSp3MjQsIHgzKncyMSt4MSp3MjAsIHgzKncxNyt4MSp3MTYqLyAgXAorICAgIHRtcDcgPSBfbW1fbWFkZF9lcGkxNih0bXA3LCAqICggX19tMTI4aSopKHRhYmxlMisxNikgKTsgXAorICAgIHJvdzAgPSBfbW1fbWFkZF9lcGkxNihyb3cwLCAqICggX19tMTI4aSopKHRhYmxlMSsyNCkpOyAvKng3KnczMSt4NSp3MzAsIHg3KncyNyt4NSp3MjYsIHg3KncyMyt4NSp3MjIsIHg3KncxOSt4NSp3MTgqLyAgXAorICAgIHJvdzIgPSBfbW1fbWFkZF9lcGkxNihyb3cyLCAqICggX19tMTI4aSopKHRhYmxlMisyNCkgKTsgXAorICAgIHRtcDIgPSBfbW1fbWFkZF9lcGkxNih0bXAyLCAqICggX19tMTI4aSopKHRhYmxlMSs4KSApOyAvKng2KncxNSt4NCp3MTQsIHg2KncxMSt4NCp3MTAsIHg2Knc3K3g0Knc2LCB4Nip3Myt4NCp3MiovICBcCisgICAgdG1wNiA9IF9tbV9tYWRkX2VwaTE2KHRtcDYsICogKCBfX20xMjhpKikodGFibGUyKzgpICk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDEgPSBfbW1fYWRkX2VwaTMyKHRtcDEsICogKCBfX20xMjhpKilNMTI4X3JvdW5kX2ludl9yb3cpOyAgICAgICBcCisgICAgdG1wNSA9IF9tbV9hZGRfZXBpMzIodG1wNSwgKiAoIF9fbTEyOGkqKU0xMjhfcm91bmRfaW52X3Jvdyk7ICAgICAgXAorICAgIHJvdzAgPSBfbW1fYWRkX2VwaTMyKHJvdzAsIHRtcDMpOyAgICAvKmIzLCBiMiwgYjEsIGIwKi8gIFwKKyAgICByb3cyID0gX21tX2FkZF9lcGkzMihyb3cyLCB0bXA3KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAxID0gX21tX2FkZF9lcGkzMih0bXAxLCB0bXAyKTsgICAgLyphMywgYTIsIGExLCBhMCovICBcCisgICAgdG1wNSA9IF9tbV9hZGRfZXBpMzIodG1wNSwgdG1wNik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDIgPSB0bXAxOyAgXAorICAgIHRtcDYgPSB0bXA1OyAgXAorICAgIHRtcDIgPSBfbW1fc3ViX2VwaTMyKHRtcDIsIHJvdzApOyAvKmZvciByb3cwLiB5ND0gYTMtYjMsIHk1PWEyLWIyLCB5Nj1hMS1iMSwgeTc9YTAtYjAgKi8gICBcCisgICAgdG1wNiA9IF9tbV9zdWJfZXBpMzIodG1wNiwgcm93Mik7ICBcCisgICAgcm93MCA9IF9tbV9hZGRfZXBpMzIocm93MCwgdG1wMSk7IC8qeTM9YTMrYjMseTI9YTIrYjIseTE9YTErYjEseTA9YTArYjAqLyAgIFwKKyAgICByb3cyID0gX21tX2FkZF9lcGkzMihyb3cyLCB0bXA1KTsgIFwKKyAgICB0bXAyID0gX21tX3NyYWlfZXBpMzIodG1wMiwgU0hJRlRfSU5WX1JPVyk7ICAgICAgICAgICAgIFwKKyAgICB0bXA2ID0gX21tX3NyYWlfZXBpMzIodG1wNiwgU0hJRlRfSU5WX1JPVyk7ICBcCisgICAgcm93MCA9IF9tbV9zcmFpX2VwaTMyKHJvdzAsIFNISUZUX0lOVl9ST1cpOyAgICAgICAgICAgICBcCisgICAgcm93MiA9IF9tbV9zcmFpX2VwaTMyKHJvdzIsIFNISUZUX0lOVl9ST1cpOyAgXAorICAgIHRtcDIgPSBfbW1fc2h1ZmZsZV9lcGkzMih0bXAyLCAweDFCKTsgLyp5NywgeTYsIHk1LCB5NCovICAgXAorICAgIHRtcDYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0bXA2LCAweDFCKTsgIFwKKyAgICByb3cwID0gX21tX3BhY2tzX2VwaTMyKHJvdzAsIHRtcDIpOyAvKnJvdzAgPSB5Nyx5Nix5NSx5NCx5Myx5Mix5MSx5MCovICBcCisgICAgcm93MiA9IF9tbV9wYWNrc19lcGkzMihyb3cyLCB0bXA2KTsgIC8qcm93MiA9IHk3LC4uLnkwKi8KKworCisjZGVmaW5lIGlEQ1RfOF9DT0woKSAgXAorICAgIHgzID0gX21tX2xvYWRfc2kxMjgoKCBfX20xMjhpKikod3NwdHIrMjQpKTtcCisgICAgeDEgPSBfbW1fbG9hZF9zaTEyOCgoIF9fbTEyOGkqKSh3c3B0cis4KSk7XAorICAgIHg1ID0gcm93MDtcCisgICAgeDcgPSByb3cyO1wKK1wKKyAgICB0ZzMgPSAoIF9fbTEyOGkqKShNMTI4X3RnXzNfMTYpO1wKKyAgICB0ZzEgPSAoIF9fbTEyOGkqKShNMTI4X3RnXzFfMTYpO1wKKyAgICB0ZzIgPSAoIF9fbTEyOGkqKShNMTI4X3RnXzJfMTYpO1wKKyAgICBjb3M0ID0oX19tMTI4aSopKE0xMjhfY29zXzRfMTYpO1wKK1wKKyAgICB0ZW1wID0gX21tX211bGhpX2VwaTE2KHg1LCAqdGczKTsgIC8qcm93NSp0ZzMqLyBcCisgICAgdGVtcDIgPSBfbW1fbXVsaGlfZXBpMTYoeDMsICp0ZzMpO1wKKyAgICB0ZW1wID0gX21tX2FkZHNfZXBpMTYodGVtcCwgeDUpOyAvKmNvZWYgYWRqdXN0bWVudCovIFwKKyAgICB0ZW1wMiA9IF9tbV9hZGRzX2VwaTE2KHRlbXAyLCB4Myk7XAorICAgIHRtNzY1ID0gX21tX2FkZHNfZXBpMTYodGVtcCwgeDMpO1wKKyAgICB0bTQ2NSA9IF9tbV9zdWJzX2VwaTE2KHg1LCB0ZW1wMik7XAorXAorICAgIHRlbXAgPSBfbW1fbXVsaGlfZXBpMTYoeDcsICp0ZzEpOyAgLypyb3c3KnRnMSovIFwKKyAgICB0ZW1wMiA9IF9tbV9tdWxoaV9lcGkxNih4MSwgKnRnMSk7XAorICAgIHRwNzY1ID0gX21tX2FkZHNfZXBpMTYodGVtcCwgeDEpO1wKKyAgICB0cDQ2NSA9IF9tbV9zdWJzX2VwaTE2KHRlbXAyLCB4Nyk7ICAvKnJvdzEqdGcxIC0gcm93NyovIFwKK1wKKyAgICB0NyA9IF9tbV9hZGRzX2VwaTE2KHRwNzY1LCB0bTc2NSk7XAorICAgIHQ3ID0gX21tX2FkZHNfZXBpMTYodDcsICooIF9fbTEyOGkqKU0xMjhfb25lX2NvcnIpO1wKKyAgICB0cDY1ID0gX21tX3N1YnNfZXBpMTYodHA3NjUsIHRtNzY1KTtcCisgICAgdDQgPSAgX21tX2FkZHNfZXBpMTYodHA0NjUsIHRtNDY1KTtcCisgICAgdG02NSA9IF9tbV9zdWJzX2VwaTE2KHRwNDY1LCB0bTQ2NSk7XAorICAgIHRtNjUgPSBfbW1fYWRkc19lcGkxNih0bTY1LCAqKCBfX20xMjhpKilNMTI4X29uZV9jb3JyKTtcCitcCisgICAgeDAgPSBfbW1fbG9hZF9zaTEyOCgoIF9fbTEyOGkqKSh3c3B0cikpO1wKKyAgICB4NCA9IF9tbV9sb2FkX3NpMTI4KCggX19tMTI4aSopKHdzcHRyKzMyKSk7XAorICAgIHgyID0gX21tX2xvYWRfc2kxMjgoKCBfX20xMjhpKikod3NwdHIrMTYpKTtcCisgICAgeDYgPSBfbW1fbG9hZF9zaTEyOCgoIF9fbTEyOGkqKSh3c3B0cis0OCkpO1wKK1wKKyAgICAvKnQ2ID0gKCB0cDY1ICsgdG02NSApICogY29zXzRfMTY7Ki8gXAorICAgIHRlbXAgPSBfbW1fYWRkc19lcGkxNih0cDY1LCB0bTY1KTtcCisgICAgdGVtcDIgPSBfbW1fc3Vic19lcGkxNih0cDY1LCB0bTY1KTtcCisgICAgdDYgPSBfbW1fbXVsaGlfZXBpMTYodGVtcCwgKmNvczQpO1wKKyAgICB0NSA9IF9tbV9tdWxoaV9lcGkxNih0ZW1wMiwgKmNvczQpO1wKKyAgICB0NiA9IF9tbV9hZGRzX2VwaTE2KHQ2LCB0ZW1wKTtcCisgICAgdDYgPSBfbW1fb3Jfc2kxMjgodDYsICooIF9fbTEyOGkqKU0xMjhfb25lX2NvcnIpO1wKKyAgICB0NSA9IF9tbV9hZGRzX2VwaTE2KHQ1LCB0ZW1wMik7XAorICAgIHQ1ID0gX21tX29yX3NpMTI4KHQ1LCAqKCBfX20xMjhpKilNMTI4X29uZV9jb3JyKTtcCitcCisgICAgdHAwMyA9IF9tbV9hZGRzX2VwaTE2KHgwLCB4NCk7XAorICAgIHRwMTIgPSBfbW1fc3Vic19lcGkxNih4MCwgeDQpO1wKK1wKKyAgICB0ZW1wID0gX21tX211bGhpX2VwaTE2KHg2LCAqdGcyKTtcCisgICAgdGVtcDIgPSBfbW1fbXVsaGlfZXBpMTYoeDIsICp0ZzIpO1wKKyAgICB0bTAzID0gX21tX2FkZHNfZXBpMTYodGVtcCwgeDIpO1wKKyAgICB0bTEyID0gX21tX3N1YnNfZXBpMTYodGVtcDIsIHg2KTtcCitcCisgICAgdDAgPSBfbW1fYWRkc19lcGkxNih0cDAzLCB0bTAzKTtcCisgICAgdDAgPSBfbW1fYWRkc19lcGkxNih0MCwgKiggX19tMTI4aSopTTEyOF9yb3VuZF9pbnZfY29sKTtcCisgICAgdDMgPSBfbW1fc3Vic19lcGkxNih0cDAzLCB0bTAzKTtcCisgICAgdDMgPSBfbW1fYWRkc19lcGkxNih0MywgKiggX19tMTI4aSopTTEyOF9yb3VuZF9pbnZfY29ycik7XAorICAgIHQxID0gX21tX2FkZHNfZXBpMTYodHAxMiwgdG0xMik7XAorICAgIHQxID0gX21tX2FkZHNfZXBpMTYodDEsICooIF9fbTEyOGkqKU0xMjhfcm91bmRfaW52X2NvbCk7XAorICAgIHQyID0gX21tX3N1YnNfZXBpMTYodHAxMiwgdG0xMik7XAorICAgIHQyID0gX21tX2FkZHNfZXBpMTYodDIsICooIF9fbTEyOGkqKU0xMjhfcm91bmRfaW52X2NvcnIpO1wKK1wKKyAgICB0ZW1wID0gX21tX2FkZHNfZXBpMTYodDAsIHQ3KTsgICAvKnkwKi8gXAorICAgIHRlbXAyID0gX21tX2FkZHNfZXBpMTYodDEsIHQ2KTsgIC8qeTEqLyBcCisgICAgdGVtcCA9IF9tbV9zcmFpX2VwaTE2KHRlbXAsIFNISUZUX0lOVl9DT0wpO1wKKyAgICB0ZW1wMiA9IF9tbV9zcmFpX2VwaTE2KHRlbXAyLCBTSElGVF9JTlZfQ09MKTtcCisgICAgdGVtcCA9IF9tbV9hZGRzX2VwaTE2KHRlbXAsICooIF9fbTEyOGkqKWpwZWdfYWRqdXN0KTsgLypBZGQgMTI4IGZvciBqcGVnIGRlY29kaW5nKi8gXAorICAgIHRlbXAyID0gX21tX2FkZHNfZXBpMTYodGVtcDIsICooIF9fbTEyOGkqKWpwZWdfYWRqdXN0KTtcCitcCisgICAgdGVtcCA9IF9tbV9wYWNrdXNfZXBpMTYodGVtcCwgdGVtcDIpO1wKKyAgICBfbW1fc3RvcmVfc2kxMjgoKCBfX20xMjhpKikob3V0cHRyKSwgdGVtcCk7ICAvKnN0b3JlIHkwLCB5MSovIFwKK1wKKyAgICB0ZW1wID0gX21tX2FkZHNfZXBpMTYodDIsIHQ1KTtcCisgICAgdGVtcDIgPSBfbW1fYWRkc19lcGkxNih0MywgdDQpO1wKKyAgICB0ZW1wID0gX21tX3NyYWlfZXBpMTYodGVtcCwgU0hJRlRfSU5WX0NPTCk7XAorICAgIHRlbXAyID0gX21tX3NyYWlfZXBpMTYodGVtcDIsIFNISUZUX0lOVl9DT0wpO1wKKyAgICB0ZW1wID0gX21tX2FkZHNfZXBpMTYodGVtcCwgKiggX19tMTI4aSopanBlZ19hZGp1c3QpO1wKKyAgICB0ZW1wMiA9IF9tbV9hZGRzX2VwaTE2KHRlbXAyLCAqKCBfX20xMjhpKilqcGVnX2FkanVzdCk7XAorXAorICAgIHRlbXAgPSBfbW1fcGFja3VzX2VwaTE2KHRlbXAsIHRlbXAyKTtcCisgICAgX21tX3N0b3JlX3NpMTI4KCggX19tMTI4aSopKG91dHB0cisxNiksIHRlbXApOyAgLypzdG9yZSB5MiwgeTMqLyBcCitcCisgICAgdGVtcCA9IF9tbV9zdWJzX2VwaTE2KHQzLCB0NCk7XAorICAgIHRlbXAyID0gX21tX3N1YnNfZXBpMTYodDIsIHQ1KTtcCisgICAgdGVtcCA9IF9tbV9zcmFpX2VwaTE2KHRlbXAsIFNISUZUX0lOVl9DT0wpO1wKKyAgICB0ZW1wMiA9IF9tbV9zcmFpX2VwaTE2KHRlbXAyLCBTSElGVF9JTlZfQ09MKTtcCisgICAgdGVtcCA9IF9tbV9hZGRzX2VwaTE2KHRlbXAsICooIF9fbTEyOGkqKWpwZWdfYWRqdXN0KTtcCisgICAgdGVtcDIgPSBfbW1fYWRkc19lcGkxNih0ZW1wMiwgKiggX19tMTI4aSopanBlZ19hZGp1c3QpO1wKK1wKKyAgICB0ZW1wID0gX21tX3BhY2t1c19lcGkxNih0ZW1wLCB0ZW1wMik7XAorICAgIF9tbV9zdG9yZV9zaTEyOCgoIF9fbTEyOGkqKShvdXRwdHIrMzIpLCB0ZW1wKTsgIC8qc3RvcmUgeTQsIHk1Ki8gXAorXAorICAgIHRlbXAgPSBfbW1fc3Vic19lcGkxNih0MSwgdDYpO1wKKyAgICB0ZW1wMiA9IF9tbV9zdWJzX2VwaTE2KHQwLCB0Nyk7XAorICAgIHRlbXAgPSBfbW1fc3JhaV9lcGkxNih0ZW1wLCBTSElGVF9JTlZfQ09MKTtcCisgICAgdGVtcDIgPSBfbW1fc3JhaV9lcGkxNih0ZW1wMiwgU0hJRlRfSU5WX0NPTCk7XAorICAgIHRlbXAgPSBfbW1fYWRkc19lcGkxNih0ZW1wLCAqKCBfX20xMjhpKilqcGVnX2FkanVzdCk7XAorICAgIHRlbXAyID0gX21tX2FkZHNfZXBpMTYodGVtcDIsICooIF9fbTEyOGkqKWpwZWdfYWRqdXN0KTtcCitcCisgICAgdGVtcCA9IF9tbV9wYWNrdXNfZXBpMTYodGVtcCwgdGVtcDIpO1wKKyAgICBfbW1fc3RvcmVfc2kxMjgoKCBfX20xMjhpKikob3V0cHRyKzQ4KSwgdGVtcCk7ICAvKnN0b3JlIHk2LCB5NyovCisKKworICAvKk1lbWNweSB0byBkbyAxNmJ5dGUgYWxpZ25tZW50LiAqLworICBtZW1jcHkoKGNoYXIqKXF1YW50cHRyU1NFLCAoY2hhciopY29tcHB0ci0+ZGN0X3RhYmxlLCBzaXplb2YocXVhbnRwdHJTU0UpKTsKKyAgbWVtY3B5KChjaGFyKiljb2VmX2Jsb2NrU1NFLCAoY2hhciopY29lZl9ibG9jaywgc2l6ZW9mKGNvZWZfYmxvY2tTU0UpKTsKKworICB3c3B0ciA9IChzaG9ydCAqKXdvcmtzcGFjZVNTRTsKKyAgb3V0cHRyID0gKHVuc2lnbmVkIGNoYXIqKXdvcmtzcGFjZVNTRTsKKworICAvLyByb3cgMCBhbmQgcm93IDIKKyAgcm93MCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpIGNvbnN0KikoY29lZl9ibG9ja1NTRSkpOworICByb3cyID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkgY29uc3QqKShjb2VmX2Jsb2NrU1NFKzgqMikpOworICByb3cwID0gX21tX211bGxvX2VwaTE2KCByb3cwLCAqKF9fbTEyOGkgY29uc3QqKXF1YW50cHRyU1NFICk7CisgIHJvdzIgPSBfbW1fbXVsbG9fZXBpMTYoIHJvdzIsICooX19tMTI4aSBjb25zdCopKHF1YW50cHRyU1NFKzgqMikgKTsKKworICBpRENUXzhfMlJPV3MoTTEyOF90YWJfaV8wNCwgTTEyOF90YWJfaV8yNik7CisKKyAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikod3NwdHIpLCByb3cwKTsKKyAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikod3NwdHIrOCoyKSwgcm93Mik7CisKKyAgLy8gcm93IDQgYW5kIHJvdyA2CisgIHJvdzAgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSBjb25zdCopKGNvZWZfYmxvY2tTU0UrOCo0KSk7CisgIHJvdzIgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSBjb25zdCopKGNvZWZfYmxvY2tTU0UrOCo2KSk7CisgIHJvdzAgPSBfbW1fbXVsbG9fZXBpMTYocm93MCwgKihfX20xMjhpIGNvbnN0KikocXVhbnRwdHJTU0UrOCo0KSApOworICByb3cyID0gX21tX211bGxvX2VwaTE2KHJvdzIsICooX19tMTI4aSBjb25zdCopKHF1YW50cHRyU1NFKzgqNikgKTsKKworICBpRENUXzhfMlJPV3MoTTEyOF90YWJfaV8wNCwgTTEyOF90YWJfaV8yNik7CisKKyAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikod3NwdHIrMzIpLCByb3cwKTsKKyAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikod3NwdHIrNDgpLCByb3cyKTsKKworICAvLyByb3cgMyBhbmQgcm93IDEKKyAgcm93MCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpIGNvbnN0KikoY29lZl9ibG9ja1NTRSs4KjMpKTsKKyAgcm93MiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpIGNvbnN0KikoY29lZl9ibG9ja1NTRSs4KjEpKTsKKyAgcm93MCA9IF9tbV9tdWxsb19lcGkxNihyb3cwLCAqKF9fbTEyOGkgY29uc3QqKShxdWFudHB0clNTRSsyNCkgKTsKKyAgcm93MiA9IF9tbV9tdWxsb19lcGkxNihyb3cyLCAqKF9fbTEyOGkgY29uc3QqKShxdWFudHB0clNTRSs4KSApOworCisgIGlEQ1RfOF8yUk9XcyhNMTI4X3RhYl9pXzM1LCBNMTI4X3RhYl9pXzE3KTsKKworICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKSh3c3B0cisyNCksIHJvdzApOworICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKSh3c3B0cis4KSwgcm93Mik7CisKKyAgLy8gcm93IDUgYW5kIHJvdyA3CisgIHJvdzAgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSBjb25zdCopKGNvZWZfYmxvY2tTU0UrOCo1KSk7CisgIHJvdzIgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSBjb25zdCopKGNvZWZfYmxvY2tTU0UrOCo3KSk7CisgIHJvdzAgPSBfbW1fbXVsbG9fZXBpMTYocm93MCwgKihfX20xMjhpIGNvbnN0KikocXVhbnRwdHJTU0UrNDApICk7CisgIHJvdzIgPSBfbW1fbXVsbG9fZXBpMTYocm93MiwgKihfX20xMjhpIGNvbnN0KikocXVhbnRwdHJTU0UrNTYpKTsKKworICBpRENUXzhfMlJPV3MoIE0xMjhfdGFiX2lfMzUsIE0xMjhfdGFiX2lfMTcpOworCisgIGlEQ1RfOF9DT0woKTsKKworICBmb3IoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspCisgIHsKKyAgICBvdXRwdHJUZW1wID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICBtZW1jcHkob3V0cHRyVGVtcCwgb3V0cHRyLCBEQ1RTSVpFKTsKKyAgICBvdXRwdHIgKz0gRENUU0laRTsgICAvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIHJldHVybjsKK30KKyNlbmRpZiAvKiBBTkRST0lEX0lOVEVMU1NFMl9JRENUICovCmRpZmYgLS1naXQgYS9qcGVnL2ppZGN0cmVkLmMgYi9qcGVnL2ppZGN0cmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxZjNjNwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvamlkY3RyZWQuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIGppZGN0cmVkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbnZlcnNlLURDVCByb3V0aW5lcyB0aGF0IHByb2R1Y2UgcmVkdWNlZC1zaXplIG91dHB1dDoKKyAqIGVpdGhlciA0eDQsIDJ4Miwgb3IgMXgxIHBpeGVscyBmcm9tIGFuIDh4OCBEQ1QgYmxvY2suCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBMb2VmZmxlciwgTGlndGVuYmVyZyBhbmQgTW9zY2h5dHogKExMJk0pCisgKiBhbGdvcml0aG0gdXNlZCBpbiBqaWRjdGludC5jLiAgV2Ugc2ltcGx5IHJlcGxhY2UgZWFjaCA4LXRvLTggMS1EIElEQ1Qgc3RlcAorICogd2l0aCBhbiA4LXRvLTQgc3RlcCB0aGF0IHByb2R1Y2VzIHRoZSBmb3VyIGF2ZXJhZ2VzIG9mIHR3byBhZGphY2VudCBvdXRwdXRzCisgKiAob3IgYW4gOC10by0yIHN0ZXAgcHJvZHVjaW5nIHR3byBhdmVyYWdlcyBvZiBmb3VyIG91dHB1dHMsIGZvciAyeDIgb3V0cHV0KS4KKyAqIFRoZXNlIHN0ZXBzIHdlcmUgZGVyaXZlZCBieSBjb21wdXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBub3JtYWwgTEwmTSBjb2RlLCB0aGVuIHNpbXBsaWZ5aW5nIGFzIG11Y2ggYXMgcG9zc2libGUuCisgKgorICogMXgxIGlzIHRyaXZpYWw6IGp1c3QgdGFrZSB0aGUgREMgY29lZmZpY2llbnQgZGl2aWRlZCBieSA4LgorICoKKyAqIFNlZSBqaWRjdGludC5jIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qIFNjYWxpbmcgaXMgdGhlIHNhbWUgYXMgaW4gamlkY3RpbnQuYy4gKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDIKKyNlbHNlCisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDEzCisjZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgKChJTlQzMikgIDE3MzApCS8qIEZJWCgwLjIxMTE2NDI0MykgKi8KKyNkZWZpbmUgRklYXzBfNTA5Nzk1NTc5ICAoKElOVDMyKSAgNDE3NikJLyogRklYKDAuNTA5Nzk1NTc5KSAqLworI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgICgoSU5UMzIpICA0OTI2KQkvKiBGSVgoMC42MDEzNDQ4ODcpICovCisjZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgKChJTlQzMikgIDU5MDYpCS8qIEZJWCgwLjcyMDk1OTgyMikgKi8KKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgICgoSU5UMzIpICA2OTY3KQkvKiBGSVgoMC44NTA0MzAwOTUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMDYxNTk0MzM3ICAoKElOVDMyKSAgODY5NykJLyogRklYKDEuMDYxNTk0MzM3KSAqLworI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgICgoSU5UMzIpICAxMDQyNikJLyogRklYKDEuMjcyNzU4NTgwKSAqLworI2RlZmluZSBGSVhfMV80NTE3NzQ5ODEgICgoSU5UMzIpICAxMTg5MykJLyogRklYKDEuNDUxNzc0OTgxKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgICgoSU5UMzIpICAxNzc5OSkJLyogRklYKDIuMTcyNzM0ODAzKSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgICgoSU5UMzIpICAyOTY5MikJLyogRklYKDMuNjI0NTA5Nzg1KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjExMTY0MjQzICBGSVgoMC4yMTExNjQyNDMpCisjZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgRklYKDAuNTA5Nzk1NTc5KQorI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgIEZJWCgwLjYwMTM0NDg4NykKKyNkZWZpbmUgRklYXzBfNzIwOTU5ODIyICBGSVgoMC43MjA5NTk4MjIpCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQorI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgIEZJWCgwLjg1MDQzMDA5NSkKKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCisjZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgRklYKDEuMDYxNTk0MzM3KQorI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgIEZJWCgxLjI3Mjc1ODU4MCkKKyNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICBGSVgoMS40NTE3NzQ5ODEpCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgIEZJWCgyLjE3MjczNDgwMykKKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCisjZGVmaW5lIEZJWF8zXzYyNDUwOTc4NSAgRklYKDMuNjI0NTA5Nzg1KQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgorICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQorICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQorICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KKyAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCisjZWxzZQorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKworLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCisgKiBlbnRyeTsgcHJvZHVjZSBhbiBpbnQgcmVzdWx0LiAgSW4gdGhpcyBtb2R1bGUsIGJvdGggaW5wdXRzIGFuZCByZXN1bHQKKyAqIGFyZSAxNiBiaXRzIG9yIGxlc3MsIHNvIGVpdGhlciBpbnQgb3Igc2hvcnQgbXVsdGlwbHkgd2lsbCB3b3JrLgorICovCisKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSVNMT1dfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA0eDQgb3V0cHV0IGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzR4NCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAyLCB0bXAxMCwgdG1wMTI7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRSo0XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW4gNCwgYmVjYXVzZSBzZWNvbmQgcGFzcyB3b24ndCB1c2UgaXQgKi8KKyAgICBpZiAoY3RyID09IERDVFNJWkUtNCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCisJaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm0gNCBmb3IgNHg0IG91dHB1dCAqLworICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOworICAgICAgCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7CisgICAgICAKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSAoQ09OU1RfQklUUysxKTsKKyAgICAKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMiA9IE1VTFRJUExZKHoyLCBGSVhfMV84NDc3NTkwNjUpICsgTVVMVElQTFkoejMsIC0gRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLworCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCisJICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KKwkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3MgNCByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KKworI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworICAgICAgCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzJdID0gZGN2YWw7CisgICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgICAgY29udGludWU7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysxKTsKKyAgICAKKyAgICB0bXAyID0gTVVMVElQTFkoKElOVDMyKSB3c3B0clsyXSwgRklYXzFfODQ3NzU5MDY1KQorCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNl0sIC0gRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbN107CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHozID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbMV07CisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLworCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCisJICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KKwkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAyLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICAKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSAyeDIgb3V0cHV0IGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzJ4MiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxMCwgejE7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFKjJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrLCBjdHItLSkgeworICAgIC8qIERvbid0IGJvdGhlciB0byBwcm9jZXNzIGNvbHVtbnMgMiw0LDYgKi8KKyAgICBpZiAoY3RyID09IERDVFNJWkUtMiB8fCBjdHIgPT0gRENUU0laRS00IHx8IGN0ciA9PSBEQ1RTSVpFLTYpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqM10gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm1zIDIsNCw2IGZvciAyeDIgb3V0cHV0ICovCisgICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7CisgICAgICAKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAxMCA9IHoxIDw8IChDT05TVF9CSVRTKzIpOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzcyMDk1OTgyMik7IC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDAgKz0gTVVMVElQTFkoejEsIEZJWF8wXzg1MDQzMDA5NSk7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1K2M3KSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCAtIEZJWF8xXzI3Mjc1ODU4MCk7IC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfM182MjQ1MDk3ODUpOyAvKiBzcXJ0KDIpICogKGMxK2MzK2M1K2M3KSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisgICAgCisgICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7CisgIH0KKyAgCisgIC8qIFBhc3MgMjogcHJvY2VzcyAyIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAyOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogSXQncyBub3QgY2xlYXIgd2hldGhlciBhIHplcm8gcm93IHRlc3QgaXMgd29ydGh3aGlsZSBoZXJlIC4uLiAqLworCisjaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKKyAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzVdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICAKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gKChJTlQzMikgd3NwdHJbMF0pIDw8IChDT05TVF9CSVRTKzIpOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAwID0gTVVMVElQTFkoKElOVDMyKSB3c3B0cls3XSwgLSBGSVhfMF83MjA5NTk4MjIpIC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0cls1XSwgRklYXzBfODUwNDMwMDk1KSAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KKwkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzNdLCAtIEZJWF8xXzI3Mjc1ODU4MCkgLyogc3FydCgyKSAqICgtYzErYzMtYzUtYzcpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clsxXSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzIpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMXgxIG91dHB1dCBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xeDEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgaW50IGRjdmFsOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBXZSBoYXJkbHkgbmVlZCBhbiBpbnZlcnNlIERDVCByb3V0aW5lIGZvciB0aGlzOiBqdXN0IHRha2UgdGhlCisgICAqIGF2ZXJhZ2UgcGl4ZWwgdmFsdWUsIHdoaWNoIGlzIG9uZS1laWdodGggb2YgdGhlIERDIGNvZWZmaWNpZW50LgorICAgKi8KKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgZGN2YWwgPSBERVFVQU5USVpFKGNvZWZfYmxvY2tbMF0sIHF1YW50cHRyWzBdKTsKKyAgZGN2YWwgPSAoaW50KSBERVNDQUxFKChJTlQzMikgZGN2YWwsIDMpOworCisgIG91dHB1dF9idWZbMF1bb3V0cHV0X2NvbF0gPSByYW5nZV9saW1pdFtkY3ZhbCAmIFJBTkdFX01BU0tdOworfQorCisjZW5kaWYgLyogSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qaW5jbHVkZS5oIGIvanBlZy9qaW5jbHVkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNGYxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2ppbmNsdWRlLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGppbmNsdWRlLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBleGlzdHMgdG8gcHJvdmlkZSBhIHNpbmdsZSBwbGFjZSB0byBmaXggYW55IHByb2JsZW1zIHdpdGgKKyAqIGluY2x1ZGluZyB0aGUgd3Jvbmcgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAoQ29tbW9uIHByb2JsZW1zIGFyZSB0YWtlbgorICogY2FyZSBvZiBieSB0aGUgc3RhbmRhcmQgamNvbmZpZyBzeW1ib2xzLCBidXQgb24gcmVhbGx5IHdlaXJkIHN5c3RlbXMKKyAqIHlvdSBtYXkgaGF2ZSB0byBlZGl0IHRoaXMgZmlsZS4pCisgKgorICogTk9URTogdGhpcyBmaWxlIGlzIE5PVCBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCisgKiBKUEVHIGxpYnJhcnkuICBNb3N0IGFwcGxpY2F0aW9ucyBuZWVkIG9ubHkgaW5jbHVkZSBqcGVnbGliLmguCisgKi8KKworCisvKiBJbmNsdWRlIGF1dG8tY29uZmlnIGZpbGUgdG8gZmluZCBvdXQgd2hpY2ggc3lzdGVtIGluY2x1ZGUgZmlsZXMgd2UgbmVlZC4gKi8KKworI2luY2x1ZGUgImpjb25maWcuaCIJCS8qIGF1dG8gY29uZmlndXJhdGlvbiBvcHRpb25zICovCisjZGVmaW5lIEpDT05GSUdfSU5DTFVERUQJLyogc28gdGhhdCBqcGVnbGliLmggZG9lc24ndCBkbyBpdCBhZ2FpbiAqLworCisvKgorICogV2UgbmVlZCB0aGUgTlVMTCBtYWNybyBhbmQgc2l6ZV90IHR5cGVkZWYuCisgKiBPbiBhbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtIGl0IGlzIHN1ZmZpY2llbnQgdG8gaW5jbHVkZSA8c3RkZGVmLmg+LgorICogT3RoZXJ3aXNlLCB3ZSBnZXQgdGhlbSBmcm9tIDxzdGRsaWIuaD4gb3IgPHN0ZGlvLmg+OyB3ZSBtYXkgaGF2ZSB0bworICogcHVsbCBpbiA8c3lzL3R5cGVzLmg+IGFzIHdlbGwuCisgKiBOb3RlIHRoYXQgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IHJlcXVpcmUgPHN0ZGlvLmg+OworICogb25seSB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGFuZCBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGVzIGRvLgorICogQnV0IHdlIG11c3QgcHVsbCBpdCBpbiBiZWNhdXNlIG9mIHRoZSByZWZlcmVuY2VzIHRvIEZJTEUgaW4ganBlZ2xpYi5oLgorICogWW91IGNhbiByZW1vdmUgdGhvc2UgcmVmZXJlbmNlcyBpZiB5b3Ugd2FudCB0byBjb21waWxlIHdpdGhvdXQgPHN0ZGlvLmg+LgorICovCisKKyNpZmRlZiBIQVZFX1NURERFRl9ICisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgTkVFRF9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICogV2UgbmVlZCBtZW1vcnkgY29weWluZyBhbmQgemVyb2luZyBmdW5jdGlvbnMsIHBsdXMgc3RybmNweSgpLgorICogQU5TSSBhbmQgU3lzdGVtIFYgaW1wbGVtZW50YXRpb25zIGRlY2xhcmUgdGhlc2UgaW4gPHN0cmluZy5oPi4KKyAqIEJTRCBkb2Vzbid0IGhhdmUgdGhlIG1lbSgpIGZ1bmN0aW9ucywgYnV0IGl0IGRvZXMgaGF2ZSBiY29weSgpL2J6ZXJvKCkuCisgKiBTb21lIHN5c3RlbXMgbWF5IGRlY2xhcmUgbWVtc2V0IGFuZCBtZW1jcHkgaW4gPG1lbW9yeS5oPi4KKyAqCisgKiBOT1RFOiB3ZSBhc3N1bWUgdGhlIHNpemUgcGFyYW1ldGVycyB0byB0aGVzZSBmdW5jdGlvbnMgYXJlIG9mIHR5cGUgc2l6ZV90LgorICogQ2hhbmdlIHRoZSBjYXN0cyBpbiB0aGVzZSBtYWNyb3MgaWYgbm90IQorICovCisKKyNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZGVmaW5lIE1FTVpFUk8odGFyZ2V0LHNpemUpCWJ6ZXJvKCh2b2lkICopKHRhcmdldCksIChzaXplX3QpKHNpemUpKQorI2RlZmluZSBNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCWJjb3B5KChjb25zdCB2b2lkICopKHNyYyksICh2b2lkICopKGRlc3QpLCAoc2l6ZV90KShzaXplKSkKKworI2Vsc2UgLyogbm90IEJTRCwgYXNzdW1lIEFOU0kvU3lzViBzdHJpbmcgbGliICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNkZWZpbmUgTUVNWkVSTyh0YXJnZXQsc2l6ZSkJbWVtc2V0KCh2b2lkICopKHRhcmdldCksIDAsIChzaXplX3QpKHNpemUpKQorI2RlZmluZSBNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCW1lbWNweSgodm9pZCAqKShkZXN0KSwgKGNvbnN0IHZvaWQgKikoc3JjKSwgKHNpemVfdCkoc2l6ZSkpCisKKyNlbmRpZgorCisvKgorICogSW4gQU5TSSBDLCBhbmQgaW5kZWVkIGFueSByYXRpb25hbCBpbXBsZW1lbnRhdGlvbiwgc2l6ZV90IGlzIGFsc28gdGhlCisgKiB0eXBlIHJldHVybmVkIGJ5IHNpemVvZigpLiAgSG93ZXZlciwgaXQgc2VlbXMgdGhlcmUgYXJlIHNvbWUgaXJyYXRpb25hbAorICogaW1wbGVtZW50YXRpb25zIG91dCB0aGVyZSwgaW4gd2hpY2ggc2l6ZW9mKCkgcmV0dXJucyBhbiBpbnQgZXZlbiB0aG91Z2gKKyAqIHNpemVfdCBpcyBkZWZpbmVkIGFzIGxvbmcgb3IgdW5zaWduZWQgbG9uZy4gIFRvIGVuc3VyZSBjb25zaXN0ZW50IHJlc3VsdHMKKyAqIHdlIGFsd2F5cyB1c2UgdGhpcyBTSVpFT0YoKSBtYWNybyBpbiBwbGFjZSBvZiB1c2luZyBzaXplb2YoKSBkaXJlY3RseS4KKyAqLworCisjZGVmaW5lIFNJWkVPRihvYmplY3QpCSgoc2l6ZV90KSBzaXplb2Yob2JqZWN0KSkKKworLyoKKyAqIFRoZSBtb2R1bGVzIHRoYXQgdXNlIGZyZWFkKCkgYW5kIGZ3cml0ZSgpIGFsd2F5cyBpbnZva2UgdGhlbSB0aHJvdWdoCisgKiB0aGVzZSBtYWNyb3MuICBPbiBzb21lIHN5c3RlbXMgeW91IG1heSBuZWVkIHRvIHR3aWRkbGUgdGhlIGFyZ3VtZW50IGNhc3RzLgorICogQ0FVVElPTjogYXJndW1lbnQgb3JkZXIgaXMgZGlmZmVyZW50IGZyb20gdW5kZXJseWluZyBmdW5jdGlvbnMhCisgKi8KKworI2RlZmluZSBKRlJFQUQoZmlsZSxidWYsc2l6ZW9mYnVmKSAgXAorICAoKHNpemVfdCkgZnJlYWQoKHZvaWQgKikgKGJ1ZiksIChzaXplX3QpIDEsIChzaXplX3QpIChzaXplb2ZidWYpLCAoZmlsZSkpKQorI2RlZmluZSBKRldSSVRFKGZpbGUsYnVmLHNpemVvZmJ1ZikgIFwKKyAgKChzaXplX3QpIGZ3cml0ZSgoY29uc3Qgdm9pZCAqKSAoYnVmKSwgKHNpemVfdCkgMSwgKHNpemVfdCkgKHNpemVvZmJ1ZiksIChmaWxlKSkpCmRpZmYgLS1naXQgYS9qcGVnL2ptZW1hbnNpLmMgYi9qcGVnL2ptZW1hbnNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5M2U0OQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvam1lbWFuc2kuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIGptZW1hbnNpLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIHNpbXBsZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXN0ZW0tCisgKiBkZXBlbmRlbnQgcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSB0aGUgQU5TSS1zdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmUgdG1wZmlsZSgpLgorICogQWxzbywgdGhlIHByb2JsZW0gb2YgZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlCisgKiBpcyBzaG92ZWQgb250byB0aGUgdXNlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCitleHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7CitleHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7CisjZW5kaWYKKworI2lmbmRlZiBTRUVLX1NFVAkJLyogcHJlLUFOU0kgc3lzdGVtcyBtYXkgbm90IGRlZmluZSB0aGlzOyAqLworI2RlZmluZSBTRUVLX1NFVCAgMAkJLyogaWYgbm90LCBhc3N1bWUgMCBpcyBjb3JyZWN0ICovCisjZW5kaWYKKworCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQorICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KKyAqLworCitHTE9CQUwodm9pZCAqKQoranBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBmcmVlKG9iamVjdCk7Cit9CisKKworLyoKKyAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCisgKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAorICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKKyAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KKyAqLworCitHTE9CQUwodm9pZCBGQVIgKikKK2pwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBmcmVlKG9iamVjdCk7Cit9CisKKworLyoKKyAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAqIEl0J3MgaW1wb3NzaWJsZSB0byBkbyB0aGlzIGluIGEgcG9ydGFibGUgd2F5OyBvdXIgY3VycmVudCBzb2x1dGlvbiBpcworICogdG8gbWFrZSB0aGUgdXNlciB0ZWxsIHVzICh3aXRoIGEgZGVmYXVsdCB2YWx1ZSBzZXQgYXQgY29tcGlsZSB0aW1lKS4KKyAqIElmIHlvdSBjYW4gYWN0dWFsbHkgZ2V0IHRoZSBhdmFpbGFibGUgc3BhY2UsIGl0J3MgYSBnb29kIGlkZWEgdG8gc3VidHJhY3QKKyAqIGEgc2xvcCBmYWN0b3Igb2YgNSUgb3Igc28uCisgKi8KKworI2lmbmRlZiBERUZBVUxUX01BWF9NRU0JCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIG1ha2VmaWxlICovCisjZGVmaW5lIERFRkFVTFRfTUFYX01FTQkJMTAwMDAwMEwgLyogZGVmYXVsdDogb25lIG1lZ2FieXRlICovCisjZW5kaWYKKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKK30KKworCisvKgorICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCisgKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQorICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgorICovCisKKworTUVUSE9EREVGKHZvaWQpCityZWFkX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgaWYgKEpGUkVBRChpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQorICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisgIGlmIChKRldSSVRFKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCisgICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfV1JJVEUpOworfQorCisKK01FVEhPRERFRih2b2lkKQorY2xvc2VfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQoreworICBmY2xvc2UoaW5mby0+dGVtcF9maWxlKTsKKyAgLyogU2luY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRtcGZpbGUoKSB0byBjcmVhdGUgdGhlIGZpbGUsCisgICAqIG5vIGV4cGxpY2l0IGZpbGUgZGVsZXRpb24gaXMgbmVlZGVkLgorICAgKi8KK30KKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKgorICogVGhpcyB2ZXJzaW9uIHVzZXMgdG1wZmlsZSgpLCB3aGljaCBjb25zdHJ1Y3RzIGEgc3VpdGFibGUgZmlsZSBuYW1lCisgKiBiZWhpbmQgdGhlIHNjZW5lcy4gIFdlIGRvbid0IGhhdmUgdG8gdXNlIGluZm8tPnRlbXBfbmFtZVtdIGF0IGFsbDsKKyAqIGluZGVlZCwgd2UgY2FuJ3QgZXZlbiBmaW5kIG91dCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHRlbXAgZmlsZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIGlmICgoaW5mby0+dGVtcF9maWxlID0gdG1wZmlsZSgpKSA9PSBOVUxMKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOworICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KK30KKworR0xPQkFMKHZvaWQpCitqcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KZGlmZiAtLWdpdCBhL2pwZWcvam1lbWRvcy5jIGIvanBlZy9qbWVtZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiNDVjNgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvam1lbWRvcy5jCkBAIC0wLDAgKzEsNjM4IEBACisvKgorICogam1lbWRvcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gTVMtRE9TLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KKyAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGVtcG9yYXJ5IGRhdGEgY2FuIGJlCisgKiBzdG9yZWQgaW4gZXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGFzIHdlbGwgYXMgaW4gcmVndWxhciBET1MgZmlsZXMuCisgKgorICogSWYgeW91IHVzZSB0aGlzIGZpbGUsIHlvdSBtdXN0IGJlIHN1cmUgdGhhdCBORUVEX0ZBUl9QT0lOVEVSUyBpcyBkZWZpbmVkCisgKiBpZiB5b3UgY29tcGlsZSBpbiBhIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsOyBpdCBzaG91bGQgTk9UIGJlIGRlZmluZWQgaWYKKyAqIHlvdSB1c2UgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbC4gIFRoaXMgZmlsZSBpcyBub3QgcmVjb21tZW5kZWQgaWYgeW91CisgKiBhcmUgdXNpbmcgYSBmbGF0LW1lbW9yeS1zcGFjZSAzODYgZW52aXJvbm1lbnQgc3VjaCBhcyBESkdDQyBvciBXYXRjb20gQy4KKyAqIEFsc28sIHRoaXMgY29kZSB3aWxsIE5PVCB3b3JrIGlmIHN0cnVjdCBmaWVsZHMgYXJlIGFsaWduZWQgb24gZ3JlYXRlciB0aGFuCisgKiAyLWJ5dGUgYm91bmRhcmllcy4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEdlJyBXZWlqZXJzLgorICovCisKKy8qCisgKiBJZiB5b3UgaGF2ZSBib3RoIGV4dGVuZGVkIGFuZCBleHBhbmRlZCBtZW1vcnksIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlCisgKiBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSB0cmllZCBpbiBqb3Blbl9iYWNraW5nX3N0b3JlLiAgT24gYSAyODYgbWFjaGluZQorICogZXhwYW5kZWQgbWVtb3J5IGlzIHVzdWFsbHkgZmFzdGVyLCBzaW5jZSBleHRlbmRlZCBtZW1vcnkgYWNjZXNzIGludm9sdmVzCisgKiBhbiBleHBlbnNpdmUgcHJvdGVjdGVkLW1vZGUtYW5kLWJhY2sgc3dpdGNoLiAgT24gMzg2IGFuZCBiZXR0ZXIsIGV4dGVuZGVkCisgKiBtZW1vcnkgaXMgdXN1YWxseSBmYXN0ZXIuICBBcyBkaXN0cmlidXRlZCwgdGhlIGNvZGUgdHJpZXMgZXh0ZW5kZWQgbWVtb3J5CisgKiBmaXJzdCAod2hhdD8gbm90IGV2ZXJ5b25lIGhhcyBhIDM4Nj8gOi0pLgorICoKKyAqIFlvdSBjYW4gZGlzYWJsZSB1c2Ugb2YgZXh0ZW5kZWQvZXhwYW5kZWQgbWVtb3J5IGVudGlyZWx5IGJ5IGFsdGVyaW5nIHRoZXNlCisgKiBkZWZpbml0aW9ucyBvciBvdmVycmlkaW5nIHRoZW0gZnJvbSB0aGUgTWFrZWZpbGUgKGVnLCAtREVNU19TVVBQT1JURUQ9MCkuCisgKi8KKworI2lmbmRlZiBYTVNfU1VQUE9SVEVECisjZGVmaW5lIFhNU19TVVBQT1JURUQgIDEKKyNlbmRpZgorI2lmbmRlZiBFTVNfU1VQUE9SVEVECisjZGVmaW5lIEVNU19TVVBQT1JURUQgIDEKKyNlbmRpZgorCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSB0aGVzZSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOworZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOworZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisjaWZkZWYgX19UVVJCT0NfXworLyogVGhlc2UgZGVmaW5pdGlvbnMgd29yayBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSAqLworI2luY2x1ZGUgPGFsbG9jLmg+CQkvKiBuZWVkIGZhcm1hbGxvYygpLCBmYXJmcmVlKCkgKi8KKyNkZWZpbmUgZmFyX21hbGxvYyh4KQlmYXJtYWxsb2MoeCkKKyNkZWZpbmUgZmFyX2ZyZWUoeCkJZmFyZnJlZSh4KQorI2Vsc2UKKy8qIFRoZXNlIGRlZmluaXRpb25zIHdvcmsgZm9yIE1pY3Jvc29mdCBDIGFuZCBjb21wYXRpYmxlIGNvbXBpbGVycyAqLworI2luY2x1ZGUgPG1hbGxvYy5oPgkJLyogbmVlZCBfZm1hbGxvYygpLCBfZmZyZWUoKSAqLworI2RlZmluZSBmYXJfbWFsbG9jKHgpCV9mbWFsbG9jKHgpCisjZGVmaW5lIGZhcl9mcmVlKHgpCV9mZnJlZSh4KQorI2VuZGlmCisKKyNlbHNlIC8qIG5vdCBORUVEX0ZBUl9QT0lOVEVSUyAqLworCisjZGVmaW5lIGZhcl9tYWxsb2MoeCkJbWFsbG9jKHgpCisjZGVmaW5lIGZhcl9mcmVlKHgpCWZyZWUoeCkKKworI2VuZGlmIC8qIE5FRURfRkFSX1BPSU5URVJTICovCisKKyNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCisjZWxzZQorI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCisjZW5kaWYKKworI2lmbmRlZiBVU0VfTVNET1NfTUVNTUdSCS8qIG1ha2Ugc3VyZSB1c2VyIGdvdCBjb25maWd1cmF0aW9uIHJpZ2h0ICovCisgIFlvdSBmb3Jnb3QgdG8gZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgaW4gamNvbmZpZy5oLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLworI2VuZGlmCisKKyNpZiBNQVhfQUxMT0NfQ0hVTksgPj0gNjU1MzVMCS8qIG1ha2Ugc3VyZSBqY29uZmlnLmggZ290IHRoaXMgcmlnaHQgKi8KKyAgTUFYX0FMTE9DX0NIVU5LIHNob3VsZCBiZSBsZXNzIHRoYW4gNjRLLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLworI2VuZGlmCisKKworLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgYXNzZW1ibHktbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyAoc2VlIGptZW1kb3NhLmFzbSkuCisgKgorICogVGhlIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgImZhciIgYXMgYXJlIGFsbCB0aGVpciBwb2ludGVyIGFyZ3VtZW50czsKKyAqIHRoaXMgZW5zdXJlcyB0aGUgYXNzZW1ibHkgc291cmNlIGNvZGUgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhlCisgKiBjb21waWxlciBtZW1vcnkgbW9kZWwuICBXZSBhc3N1bWUgInNob3J0IiBpcyAxNiBiaXRzLCAibG9uZyIgaXMgMzIuCisgKi8KKwordHlwZWRlZiB2b2lkIGZhciAqIFhNU0RSSVZFUjsJLyogYWN0dWFsbHkgYSBwb2ludGVyIHRvIGNvZGUgKi8KK3R5cGVkZWYgc3RydWN0IHsJCS8qIHJlZ2lzdGVycyBmb3IgY2FsbGluZyBYTVMgZHJpdmVyICovCisJdW5zaWduZWQgc2hvcnQgYXgsIGR4LCBieDsKKwl2b2lkIGZhciAqIGRzX3NpOworICAgICAgfSBYTVNjb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgewkJLyogcmVnaXN0ZXJzIGZvciBjYWxsaW5nIEVNUyBkcml2ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBheCwgZHgsIGJ4OworCXZvaWQgZmFyICogZHNfc2k7CisgICAgICB9IEVNU2NvbnRleHQ7CisKK2V4dGVybiBzaG9ydCBmYXIgamRvc19vcGVuIEpQUCgoc2hvcnQgZmFyICogaGFuZGxlLCBjaGFyIGZhciAqIGZpbGVuYW1lKSk7CitleHRlcm4gc2hvcnQgZmFyIGpkb3NfY2xvc2UgSlBQKChzaG9ydCBoYW5kbGUpKTsKK2V4dGVybiBzaG9ydCBmYXIgamRvc19zZWVrIEpQUCgoc2hvcnQgaGFuZGxlLCBsb25nIG9mZnNldCkpOworZXh0ZXJuIHNob3J0IGZhciBqZG9zX3JlYWQgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAorCQkJCXVuc2lnbmVkIHNob3J0IGNvdW50KSk7CitleHRlcm4gc2hvcnQgZmFyIGpkb3Nfd3JpdGUgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAorCQkJCSB1bnNpZ25lZCBzaG9ydCBjb3VudCkpOworZXh0ZXJuIHZvaWQgZmFyIGp4bXNfZ2V0ZHJpdmVyIEpQUCgoWE1TRFJJVkVSIGZhciAqKSk7CitleHRlcm4gdm9pZCBmYXIganhtc19jYWxsZHJpdmVyIEpQUCgoWE1TRFJJVkVSLCBYTVNjb250ZXh0IGZhciAqKSk7CitleHRlcm4gc2hvcnQgZmFyIGplbXNfYXZhaWxhYmxlIEpQUCgodm9pZCkpOworZXh0ZXJuIHZvaWQgZmFyIGplbXNfY2FsbGRyaXZlciBKUFAoKEVNU2NvbnRleHQgZmFyICopKTsKKworCisvKgorICogU2VsZWN0aW9uIG9mIGEgZmlsZSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgorICogVGhpcyBpcyBoaWdobHkgc3lzdGVtLWRlcGVuZGVudCwgYW5kIHlvdSBtYXkgd2FudCB0byBjdXN0b21pemUgaXQuCisgKi8KKworc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KKworTE9DQUwodm9pZCkKK3NlbGVjdF9maWxlX25hbWUgKGNoYXIgKiBmbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqIGVudjsKKyAgY2hhciAqIHB0cjsKKyAgRklMRSAqIHRmaWxlOworCisgIC8qIEtlZXAgZ2VuZXJhdGluZyBmaWxlIG5hbWVzIHRpbGwgd2UgZmluZCBvbmUgdGhhdCdzIG5vdCBpbiB1c2UgKi8KKyAgZm9yICg7OykgeworICAgIC8qIEdldCB0ZW1wIGRpcmVjdG9yeSBuYW1lIGZyb20gZW52aXJvbm1lbnQgVE1QIG9yIFRFTVAgdmFyaWFibGU7CisgICAgICogaWYgbm9uZSwgdXNlICIuIgorICAgICAqLworICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJUTVAiKSkgPT0gTlVMTCkKKyAgICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJURU1QIikpID09IE5VTEwpCisJZW52ID0gIi4iOworICAgIGlmICgqZW52ID09ICdcMCcpCQkvKiBudWxsIHN0cmluZyBtZWFucyAiLiIgKi8KKyAgICAgIGVudiA9ICIuIjsKKyAgICBwdHIgPSBmbmFtZTsJCS8qIGNvcHkgbmFtZSB0byBmbmFtZSAqLworICAgIHdoaWxlICgqZW52ICE9ICdcMCcpCisgICAgICAqcHRyKysgPSAqZW52Kys7CisgICAgaWYgKHB0clstMV0gIT0gJ1xcJyAmJiBwdHJbLTFdICE9ICcvJykKKyAgICAgICpwdHIrKyA9ICdcXCc7CQkvKiBhcHBlbmQgYmFja3NsYXNoIGlmIG5vdCBpbiBlbnYgdmFyaWFibGUgKi8KKyAgICAvKiBBcHBlbmQgYSBzdWl0YWJsZSBmaWxlIG5hbWUgKi8KKyAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KKyAgICBzcHJpbnRmKHB0ciwgIkpQRyUwM2QuVE1QIiwgbmV4dF9maWxlX251bSk7CisgICAgLyogUHJvYmUgdG8gc2VlIGlmIGZpbGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSAqLworICAgIGlmICgodGZpbGUgPSBmb3BlbihmbmFtZSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKQorICAgICAgYnJlYWs7CisgICAgZmNsb3NlKHRmaWxlKTsJCS8qIG9vcHMsIGl0J3MgdGhlcmU7IGNsb3NlIHRmaWxlICYgdHJ5IGFnYWluICovCisgIH0KK30KKworCisvKgorICogTmVhci1tZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgaW4gZmFyIG1lbW9yeSwgaWYgcG9zc2libGUKKyAqLworCitHTE9CQUwodm9pZCBGQVIgKikKK2pwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCBGQVIgKikgZmFyX21hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZmFyX2ZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCisgKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgorICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAorICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KKyAqLworCisjaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkzMDAwMDBMIC8qIGZvciB0b3RhbCB1c2FnZSBhYm91dCA0NTBLICovCisjZW5kaWYKKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKK30KKworCisvKgorICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCisgKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQorICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgorICovCisKKy8qCisgKiBGb3IgTVMtRE9TIHdlIHN1cHBvcnQgdGhyZWUgdHlwZXMgb2YgYmFja2luZyBzdG9yYWdlOgorICogICAxLiBDb252ZW50aW9uYWwgRE9TIGZpbGVzLiAgV2UgYWNjZXNzIHRoZXNlIGJ5IGRpcmVjdCBET1MgY2FsbHMgcmF0aGVyCisgKiAgICAgIHRoYW4gdmlhIHRoZSBzdGRpbyBwYWNrYWdlLiAgVGhpcyBwcm92aWRlcyBhIGJpdCBiZXR0ZXIgcGVyZm9ybWFuY2UsCisgKiAgICAgIGJ1dCB0aGUgcmVhbCByZWFzb24gaXMgdGhhdCB0aGUgYnVmZmVycyB0byBiZSByZWFkIG9yIHdyaXR0ZW4gYXJlIEZBUi4KKyAqICAgICAgVGhlIHN0ZGlvIGxpYnJhcnkgZm9yIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVscyBjYW4ndCBjb3BlIHdpdGggdGhhdC4KKyAqICAgMi4gRXh0ZW5kZWQgbWVtb3J5LCBhY2Nlc3NlZCBwZXIgdGhlIFhNUyBWMi4wIHNwZWNpZmljYXRpb24uCisgKiAgIDMuIEV4cGFuZGVkIG1lbW9yeSwgYWNjZXNzZWQgcGVyIHRoZSBMSU0vRU1TIDQuMCBzcGVjaWZpY2F0aW9uLgorICogWW91J2xsIG5lZWQgY29waWVzIG9mIHRob3NlIHNwZWNzIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIHJlbGF0ZWQgY29kZS4KKyAqIFRoZSBzcGVjcyBhcmUgYXZhaWxhYmxlIGJ5IEludGVybmV0IEZUUCBmcm9tIHRoZSBTSU1URUwgYXJjaGl2ZXMgCisgKiAob2FrLm9ha2xhbmQuZWR1IGFuZCBpdHMgdmFyaW91cyBtaXJyb3Igc2l0ZXMpLiAgU2VlIGZpbGVzCisgKiBwdWIvbXNkb3MvbWljcm9zb2Z0L3htczIwLmFyYyBhbmQgcHViL21zZG9zL2luZm8vbGltZW1zNDEuemlwLgorICovCisKKworLyoKKyAqIEFjY2VzcyBtZXRob2RzIGZvciBhIERPUyBmaWxlLgorICovCisKKworTUVUSE9EREVGKHZvaWQpCityZWFkX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChqZG9zX3NlZWsoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBmaWxlX29mZnNldCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgLyogU2luY2UgTUFYX0FMTE9DX0NIVU5LIGlzIGxlc3MgdGhhbiA2NEssIGJ5dGVfY291bnQgd2lsbCBiZSB0b28uICovCisgIGlmIChieXRlX2NvdW50ID4gNjU1MzVMKQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTExPQ19DSFVOSyk7CisgIGlmIChqZG9zX3JlYWQoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBidWZmZXJfYWRkcmVzcywKKwkJKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBpZiAoamRvc19zZWVrKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSwgZmlsZV9vZmZzZXQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisgIC8qIFNpbmNlIE1BWF9BTExPQ19DSFVOSyBpcyBsZXNzIHRoYW4gNjRLLCBieXRlX2NvdW50IHdpbGwgYmUgdG9vLiAqLworICBpZiAoYnl0ZV9jb3VudCA+IDY1NTM1TCkJLyogc2FmZXR5IGNoZWNrICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOworICBpZiAoamRvc193cml0ZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGJ1ZmZlcl9hZGRyZXNzLAorCQkgKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK2Nsb3NlX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgamRvc19jbG9zZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUpOwkvKiBjbG9zZSB0aGUgZmlsZSAqLworICByZW1vdmUoaW5mby0+dGVtcF9uYW1lKTsJLyogZGVsZXRlIHRoZSBmaWxlICovCisvKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgcmVtb3ZlKCksIHRyeSB1bmxpbmsoKSBpbnN0ZWFkLgorICogcmVtb3ZlKCkgaXMgdGhlIEFOU0ktc3RhbmRhcmQgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiwgYnV0CisgKiB1bmxpbmsoKSB3YXMgbW9yZSBjb21tb24gaW4gcHJlLUFOU0kgc3lzdGVtcy4KKyAqLworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9DTE9TRSwgaW5mby0+dGVtcF9uYW1lKTsKK30KKworCitMT0NBTChib29sZWFuKQorb3Blbl9maWxlX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgc2hvcnQgaGFuZGxlOworCisgIHNlbGVjdF9maWxlX25hbWUoaW5mby0+dGVtcF9uYW1lKTsKKyAgaWYgKGpkb3Nfb3Blbigoc2hvcnQgZmFyICopICYgaGFuZGxlLCAoY2hhciBmYXIgKikgaW5mby0+dGVtcF9uYW1lKSkgeworICAgIC8qIG1pZ2h0IGFzIHdlbGwgZXhpdCBzaW5jZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZSB3aWxsIGZhaWwgYW55d2F5ICovCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUgPSBoYW5kbGU7CisgIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfZmlsZV9zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2ZpbGVfc3RvcmU7CisgIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9maWxlX3N0b3JlOworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9PUEVOLCBpbmZvLT50ZW1wX25hbWUpOworICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KK30KKworCisvKgorICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4dGVuZGVkIG1lbW9yeS4KKyAqLworCisjaWYgWE1TX1NVUFBPUlRFRAorCitzdGF0aWMgWE1TRFJJVkVSIHhtc19kcml2ZXI7CS8qIHNhdmVkIGFkZHJlc3Mgb2YgWE1TIGRyaXZlciAqLworCit0eXBlZGVmIHVuaW9uIHsJCQkvKiBlaXRoZXIgbG9uZyBvZmZzZXQgb3IgcmVhbC1tb2RlIHBvaW50ZXIgKi8KKwlsb25nIG9mZnNldDsKKwl2b2lkIGZhciAqIHB0cjsKKyAgICAgIH0gWE1TUFRSOworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBYTVMgbW92ZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqLworCWxvbmcgbGVuZ3RoOworCVhNU0ggc3JjX2hhbmRsZTsKKwlYTVNQVFIgc3JjOworCVhNU0ggZHN0X2hhbmRsZTsKKwlYTVNQVFIgZHN0OworICAgICAgfSBYTVNzcGVjOworCisjZGVmaW5lIE9ERChYKQkoKChYKSAmIDFMKSAhPSAwKQorCisKK01FVEhPRERFRih2b2lkKQorcmVhZF94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBYTVNjb250ZXh0IGN0eDsKKyAgWE1Tc3BlYyBzcGVjOworICBjaGFyIGVuZGJ1ZmZlclsyXTsKKworICAvKiBUaGUgWE1TIGRyaXZlciBjYW4ndCBjb3BlIHdpdGggYW4gb2RkIGxlbmd0aCwgc28gaGFuZGxlIHRoZSBsYXN0IGJ5dGUKKyAgICogc3BlY2lhbGx5IGlmIGJ5dGVfY291bnQgaXMgb2RkLiAgV2UgZG9uJ3QgZXhwZWN0IHRoaXMgdG8gYmUgY29tbW9uLgorICAgKi8KKworICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQgJiAofiAxTCk7CisgIHNwZWMuc3JjX2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOworICBzcGVjLnNyYy5vZmZzZXQgPSBmaWxlX29mZnNldDsKKyAgc3BlYy5kc3RfaGFuZGxlID0gMDsKKyAgc3BlYy5kc3QucHRyID0gYnVmZmVyX2FkZHJlc3M7CisgIAorICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOworICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCAhPSAxKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1JFQUQpOworCisgIGlmIChPREQoYnl0ZV9jb3VudCkpIHsKKyAgICByZWFkX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKKwkJICAgZmlsZV9vZmZzZXQgKyBieXRlX2NvdW50IC0gMUwsIDJMKTsKKyAgICAoKGNoYXIgRkFSICopIGJ1ZmZlcl9hZGRyZXNzKVtieXRlX2NvdW50IC0gMUxdID0gZW5kYnVmZmVyWzBdOworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIFhNU2NvbnRleHQgY3R4OworICBYTVNzcGVjIHNwZWM7CisgIGNoYXIgZW5kYnVmZmVyWzJdOworCisgIC8qIFRoZSBYTVMgZHJpdmVyIGNhbid0IGNvcGUgd2l0aCBhbiBvZGQgbGVuZ3RoLCBzbyBoYW5kbGUgdGhlIGxhc3QgYnl0ZQorICAgKiBzcGVjaWFsbHkgaWYgYnl0ZV9jb3VudCBpcyBvZGQuICBXZSBkb24ndCBleHBlY3QgdGhpcyB0byBiZSBjb21tb24uCisgICAqLworCisgIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudCAmICh+IDFMKTsKKyAgc3BlYy5zcmNfaGFuZGxlID0gMDsKKyAgc3BlYy5zcmMucHRyID0gYnVmZmVyX2FkZHJlc3M7CisgIHNwZWMuZHN0X2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOworICBzcGVjLmRzdC5vZmZzZXQgPSBmaWxlX29mZnNldDsKKworICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOworICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCAhPSAxKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1dSSVRFKTsKKworICBpZiAoT0REKGJ5dGVfY291bnQpKSB7CisgICAgcmVhZF94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCisJCSAgIGZpbGVfb2Zmc2V0ICsgYnl0ZV9jb3VudCAtIDFMLCAyTCk7CisgICAgZW5kYnVmZmVyWzBdID0gKChjaGFyIEZBUiAqKSBidWZmZXJfYWRkcmVzcylbYnl0ZV9jb3VudCAtIDFMXTsKKyAgICB3cml0ZV94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCisJCSAgICBmaWxlX29mZnNldCArIGJ5dGVfY291bnQgLSAxTCwgMkwpOworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgWE1TY29udGV4dCBjdHg7CisKKyAgY3R4LmR4ID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7CisgIGN0eC5heCA9IDB4MGEwMDsKKyAganhtc19jYWxsZHJpdmVyKHhtc19kcml2ZXIsIChYTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7CisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19DTE9TRSwgaW5mby0+aGFuZGxlLnhtc19oYW5kbGUpOworICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KK30KKworCitMT0NBTChib29sZWFuKQorb3Blbl94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIFhNU2NvbnRleHQgY3R4OworCisgIC8qIEdldCBhZGRyZXNzIG9mIFhNUyBkcml2ZXIgKi8KKyAganhtc19nZXRkcml2ZXIoKFhNU0RSSVZFUiBmYXIgKikgJiB4bXNfZHJpdmVyKTsKKyAgaWYgKHhtc19kcml2ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CQkvKiBubyBkcml2ZXIgdG8gYmUgaGFkICovCisKKyAgLyogR2V0IHZlcnNpb24gbnVtYmVyLCBtdXN0IGJlID49IDIuMDAgKi8KKyAgY3R4LmF4ID0gMHgwMDAwOworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCA8ICh1bnNpZ25lZCBzaG9ydCkgMHgwMjAwKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBUcnkgdG8gZ2V0IHNwYWNlIChleHByZXNzZWQgaW4ga2lsb2J5dGVzKSAqLworICBjdHguZHggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgMTAyM0wpID4+IDEwKTsKKyAgY3R4LmF4ID0gMHgwOTAwOworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCAhPSAxKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBTdWNjZWVkZWQsIHNhdmUgdGhlIGhhbmRsZSBhbmQgYXdheSB3ZSBnbyAqLworICBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZSA9IGN0eC5keDsKKyAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF94bXNfc3RvcmU7CisgIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV94bXNfc3RvcmU7CisgIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV94bXNfc3RvcmU7CisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19PUEVOLCBjdHguZHgpOworICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KK30KKworI2VuZGlmIC8qIFhNU19TVVBQT1JURUQgKi8KKworCisvKgorICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4cGFuZGVkIG1lbW9yeS4KKyAqLworCisjaWYgRU1TX1NVUFBPUlRFRAorCisvKiBUaGUgRU1TIG1vdmUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZXMgd29yZCBhbmQgbG9uZyBmaWVsZHMgYWxpZ25lZAorICogYXQgb2RkIGJ5dGUgYm91bmRhcmllcy4gIFNvbWUgY29tcGlsZXJzIHdpbGwgYWxpZ24gc3RydWN0IGZpZWxkcyBhdCBldmVuCisgKiBieXRlIGJvdW5kYXJpZXMuICBXaGlsZSBpdCdzIHVzdWFsbHkgcG9zc2libGUgdG8gZm9yY2UgYnl0ZSBhbGlnbm1lbnQsCisgKiB0aGF0IGNhdXNlcyBhbiBvdmVyYWxsIHBlcmZvcm1hbmNlIHBlbmFsdHkgYW5kIG1heSBwb3NlIHByb2JsZW1zIGluIG1lcmdpbmcKKyAqIEpQRUcgaW50byBhIGxhcmdlciBhcHBsaWNhdGlvbi4gIEluc3RlYWQgd2UgYWNjZXB0IHNvbWUgcmF0aGVyIGRpcnR5IGNvZGUKKyAqIGhlcmUuICBOb3RlIHRoaXMgY29kZSB3b3VsZCBmYWlsIGlmIHRoZSBoYXJkd2FyZSBkaWQgbm90IGFsbG93IG9kZC1ieXRlCisgKiB3b3JkICYgbG9uZyBhY2Nlc3NlcywgYnV0IGFsbCA4MHg4NiBDUFVzIGRvLgorICovCisKK3R5cGVkZWYgdm9pZCBmYXIgKiBFTVNQVFI7CisKK3R5cGVkZWYgdW5pb24gewkJCS8qIEVNUyBtb3ZlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCisJbG9uZyBsZW5ndGg7CQkvKiBJdCdzIGVhc3kgdG8gYWNjZXNzIGZpcnN0IDQgYnl0ZXMgKi8KKwljaGFyIGJ5dGVzWzE4XTsJCS8qIE1pc2FsaWduZWQgZmllbGRzIGluIGhlcmUhICovCisgICAgICB9IEVNU3NwZWM7CisKKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIG1pc2FsaWduZWQgZmllbGRzICovCisjZGVmaW5lIEZJRUxEX0FUKHNwZWMsb2Zmc2V0LHR5cGUpICAoKigodHlwZSAqKSAmKHNwZWMuYnl0ZXNbb2Zmc2V0XSkpKQorI2RlZmluZSBTUkNfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYyw0LGNoYXIpCisjZGVmaW5lIFNSQ19IQU5ETEUoc3BlYykJRklFTERfQVQoc3BlYyw1LEVNU0gpCisjZGVmaW5lIFNSQ19PRkZTRVQoc3BlYykJRklFTERfQVQoc3BlYyw3LHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBTUkNfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYyw5LHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBTUkNfUFRSKHNwZWMpCQlGSUVMRF9BVChzcGVjLDcsRU1TUFRSKQorI2RlZmluZSBEU1RfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYywxMSxjaGFyKQorI2RlZmluZSBEU1RfSEFORExFKHNwZWMpCUZJRUxEX0FUKHNwZWMsMTIsRU1TSCkKKyNkZWZpbmUgRFNUX09GRlNFVChzcGVjKQlGSUVMRF9BVChzcGVjLDE0LHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBEU1RfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYywxNix1bnNpZ25lZCBzaG9ydCkKKyNkZWZpbmUgRFNUX1BUUihzcGVjKQkJRklFTERfQVQoc3BlYywxNCxFTVNQVFIpCisKKyNkZWZpbmUgRU1TUEFHRVNJWkUJMTYzODRMCS8qIGdvc3BlbCwgc2VlIHRoZSBFTVMgc3BlY3MgKi8KKworI2RlZmluZSBISUJZVEUoVykgICgoKFcpID4+IDgpICYgMHhGRikKKyNkZWZpbmUgTE9CWVRFKFcpICAoKFcpICYgMHhGRikKKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfZW1zX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCXZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCWxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgRU1TY29udGV4dCBjdHg7CisgIEVNU3NwZWMgc3BlYzsKKworICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7CisgIFNSQ19UWVBFKHNwZWMpID0gMTsKKyAgU1JDX0hBTkRMRShzcGVjKSA9IGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlOworICBTUkNfUEFHRShzcGVjKSAgID0gKHVuc2lnbmVkIHNob3J0KSAoZmlsZV9vZmZzZXQgLyBFTVNQQUdFU0laRSk7CisgIFNSQ19PRkZTRVQoc3BlYykgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAlIEVNU1BBR0VTSVpFKTsKKyAgRFNUX1RZUEUoc3BlYykgPSAwOworICBEU1RfSEFORExFKHNwZWMpID0gMDsKKyAgRFNUX1BUUihzcGVjKSAgICA9IGJ1ZmZlcl9hZGRyZXNzOworICAKKyAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKKyAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19SRUFEKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgRU1TY29udGV4dCBjdHg7CisgIEVNU3NwZWMgc3BlYzsKKworICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7CisgIFNSQ19UWVBFKHNwZWMpID0gMDsKKyAgU1JDX0hBTkRMRShzcGVjKSA9IDA7CisgIFNSQ19QVFIoc3BlYykgICAgPSBidWZmZXJfYWRkcmVzczsKKyAgRFNUX1RZUEUoc3BlYykgPSAxOworICBEU1RfSEFORExFKHNwZWMpID0gaW5mby0+aGFuZGxlLmVtc19oYW5kbGU7CisgIERTVF9QQUdFKHNwZWMpICAgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAvIEVNU1BBR0VTSVpFKTsKKyAgRFNUX09GRlNFVChzcGVjKSA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0ICUgRU1TUEFHRVNJWkUpOworICAKKyAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKKyAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgRU1TY29udGV4dCBjdHg7CisKKyAgY3R4LmF4ID0gMHg0NTAwOworICBjdHguZHggPSBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZTsKKyAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7CisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0VNU19DTE9TRSwgaW5mby0+aGFuZGxlLmVtc19oYW5kbGUpOworICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KK30KKworCitMT0NBTChib29sZWFuKQorb3Blbl9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIEVNU2NvbnRleHQgY3R4OworCisgIC8qIElzIEVNUyBkcml2ZXIgdGhlcmU/ICovCisgIGlmICghIGplbXNfYXZhaWxhYmxlKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEdldCBzdGF0dXMsIG1ha2Ugc3VyZSBFTVMgaXMgT0sgKi8KKyAgY3R4LmF4ID0gMHg0MDAwOworICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKEhJQllURShjdHguYXgpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEdldCB2ZXJzaW9uLCBtdXN0IGJlID49IDQuMCAqLworICBjdHguYXggPSAweDQ2MDA7CisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCB8fCBMT0JZVEUoY3R4LmF4KSA8IDB4NDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFRyeSB0byBhbGxvY2F0ZSByZXF1ZXN0ZWQgc3BhY2UgKi8KKyAgY3R4LmF4ID0gMHg0MzAwOworICBjdHguYnggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgRU1TUEFHRVNJWkUtMUwpIC8gRU1TUEFHRVNJWkUpOworICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKEhJQllURShjdHguYXgpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFN1Y2NlZWRlZCwgc2F2ZSB0aGUgaGFuZGxlIGFuZCBhd2F5IHdlIGdvICovCisgIGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlID0gY3R4LmR4OworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2Vtc19zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2Vtc19zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2Vtc19zdG9yZTsKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRU1TX09QRU4sIGN0eC5keCk7CisgIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLworfQorCisjZW5kaWYgLyogRU1TX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIC8qIFRyeSBleHRlbmRlZCBtZW1vcnksIHRoZW4gZXhwYW5kZWQgbWVtb3J5LCB0aGVuIHJlZ3VsYXIgZmlsZS4gKi8KKyNpZiBYTVNfU1VQUE9SVEVECisgIGlmIChvcGVuX3htc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKKyAgICByZXR1cm47CisjZW5kaWYKKyNpZiBFTVNfU1VQUE9SVEVECisgIGlmIChvcGVuX2Vtc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKKyAgICByZXR1cm47CisjZW5kaWYKKyAgaWYgKG9wZW5fZmlsZV9zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKKyAgICByZXR1cm47CisgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBuZXh0X2ZpbGVfbnVtID0gMDsJCS8qIGluaXRpYWxpemUgdGVtcCBmaWxlIG5hbWUgZ2VuZXJhdG9yICovCisgIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBNaWNyb3NvZnQgQywgYXQgbGVhc3QgaW4gdjYuMDBBLCB3aWxsIG5vdCBzdWNjZXNzZnVsbHkgcmVjbGFpbSBmcmVlZAorICAgKiBibG9ja3Mgb2Ygc2l6ZSA+IDMyS2J5dGVzIHVubGVzcyB3ZSBnaXZlIGl0IGEga2ljayBpbiB0aGUgcmVhciwgbGlrZSBzbzoKKyAgICovCisjaWZkZWYgTkVFRF9GSEVBUE1JTgorICBfZmhlYXBtaW4oKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvanBlZy9qbWVtZG9zYS5hc20gYi9qcGVnL2ptZW1kb3NhLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Q0MzcyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qbWVtZG9zYS5hc20KQEAgLTAsMCArMSwzNzkgQEAKKzsKKzsgam1lbWRvc2EuYXNtCis7Cis7IENvcHlyaWdodCAoQykgMTk5MiwgVGhvbWFzIEcuIExhbmUuCis7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCis7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKzsKKzsgVGhpcyBmaWxlIGNvbnRhaW5zIGxvdy1sZXZlbCBpbnRlcmZhY2Ugcm91dGluZXMgdG8gc3VwcG9ydCB0aGUgTVMtRE9TCis7IGJhY2tpbmcgc3RvcmUgbWFuYWdlciAoam1lbWRvcy5jKS4gIFJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byBhY2Nlc3MgZGlzaworOyBmaWxlcyB0aHJvdWdoIGRpcmVjdCBET1MgY2FsbHMsIGFuZCB0byBhY2Nlc3MgWE1TIGFuZCBFTVMgZHJpdmVycy4KKzsKKzsgVGhpcyBmaWxlIHNob3VsZCBhc3NlbWJsZSB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKKzsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuICBJZiB5b3UgaGF2ZW4ndCBnb3QKKzsgYSBjb21wYXRpYmxlIGFzc2VtYmxlciwgYmV0dGVyIGZhbGwgYmFjayB0byBqbWVtYW5zaS5jIG9yIGptZW1uYW1lLmMuCis7Cis7IFRvIG1pbmltaXplIGRlcGVuZGVuY2Ugb24gdGhlIEMgY29tcGlsZXIncyByZWdpc3RlciB1c2FnZSBjb252ZW50aW9ucywKKzsgd2Ugc2F2ZSBhbmQgcmVzdG9yZSBhbGwgODA4NiByZWdpc3RlcnMsIGV2ZW4gdGhvdWdoIG1vc3QgY29tcGlsZXJzIG9ubHkKKzsgcmVxdWlyZSBTSSxESSxEUyB0byBiZSBwcmVzZXJ2ZWQuICBBbHNvLCB3ZSB1c2Ugb25seSAxNi1iaXQtd2lkZSByZXR1cm4KKzsgdmFsdWVzLCB3aGljaCBldmVyeWJvZHkgcmV0dXJucyBpbiBBWC4KKzsKKzsgQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBHZScgV2VpamVycy4KKzsKKworSk1FTURPU0FfVFhUCXNlZ21lbnQgYnl0ZSBwdWJsaWMgJ0NPREUnCisKKwkJYXNzdW1lCWNzOkpNRU1ET1NBX1RYVAorCisJCXB1YmxpYwlfamRvc19vcGVuCisJCXB1YmxpYwlfamRvc19jbG9zZQorCQlwdWJsaWMJX2pkb3Nfc2VlaworCQlwdWJsaWMJX2pkb3NfcmVhZAorCQlwdWJsaWMJX2pkb3Nfd3JpdGUKKwkJcHVibGljCV9qeG1zX2dldGRyaXZlcgorCQlwdWJsaWMJX2p4bXNfY2FsbGRyaXZlcgorCQlwdWJsaWMJX2plbXNfYXZhaWxhYmxlCisJCXB1YmxpYwlfamVtc19jYWxsZHJpdmVyCisKKzsKKzsgc2hvcnQgZmFyIGpkb3Nfb3BlbiAoc2hvcnQgZmFyICogaGFuZGxlLCBjaGFyIGZhciAqIGZpbGVuYW1lKQorOworOyBDcmVhdGUgYW5kIG9wZW4gYSB0ZW1wb3JhcnkgZmlsZQorOworX2pkb3Nfb3Blbglwcm9jCWZhcgorCQlwdXNoCWJwCQkJOyBsaW5rYWdlCisJCW1vdiAJYnAsc3AKKwkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKKwkJcHVzaAlkaQorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCWVzCisJCXB1c2gJZHMKKwkJbW92CWN4LDAJCQk7IG5vcm1hbCBmaWxlIGF0dHJpYnV0ZXMKKwkJbGRzCWR4LGR3b3JkIHB0ciBbYnArMTBdCTsgZ2V0IGZpbGVuYW1lIHBvaW50ZXIKKwkJbW92CWFoLDNjaAkJCTsgY3JlYXRlIGZpbGUKKwkJaW50CTIxaAorCQlqYwlvcGVuX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCisJCWxkcwlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IGhhbmRsZSBwb2ludGVyCisJCW1vdgl3b3JkIHB0ciBbYnhdLGF4CTsgc2F2ZSB0aGUgaGFuZGxlCisJCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCitvcGVuX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2pkb3Nfb3BlbgllbmRwCisKKworOworOyBzaG9ydCBmYXIgamRvc19jbG9zZSAoc2hvcnQgaGFuZGxlKQorOworOyBDbG9zZSB0aGUgZmlsZSBoYW5kbGUKKzsKK19qZG9zX2Nsb3NlCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKKwkJbW92CWFoLDNlaAkJCTsgY2xvc2UgZmlsZQorCQlpbnQJMjFoCisJCWpjCWNsb3NlX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCisJCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCitjbG9zZV9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wIAlicAorCQlyZXQKK19qZG9zX2Nsb3NlCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZG9zX3NlZWsgKHNob3J0IGhhbmRsZSwgbG9uZyBvZmZzZXQpCis7Cis7IFNldCBmaWxlIHBvc2l0aW9uCis7CitfamRvc19zZWVrCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKKwkJbW92CWR4LHdvcmQgcHRyIFticCs4XQk7IExTIG9mZnNldAorCQltb3YJY3gsd29yZCBwdHIgW2JwKzEwXQk7IE1TIG9mZnNldAorCQltb3YJYXgsNDIwMGgJCTsgYWJzb2x1dGUgc2VlaworCQlpbnQJMjFoCisJCWpjCXNlZWtfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKKwkJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKK3NlZWtfZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0CisJCXBvcAllcworCQlwb3AJZHgKKwkJcG9wCWN4CisJCXBvcAlieAorCQlwb3AJZGkKKwkJcG9wCXNpCisJCXBvcCAJYnAKKwkJcmV0CitfamRvc19zZWVrCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZG9zX3JlYWQgKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsIHVuc2lnbmVkIHNob3J0IGNvdW50KQorOworOyBSZWFkIGZyb20gZmlsZQorOworX2pkb3NfcmVhZAlwcm9jCWZhcgorCQlwdXNoCWJwCQkJOyBsaW5rYWdlCisJCW1vdiAJYnAsc3AKKwkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKKwkJcHVzaAlkaQorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCWVzCisJCXB1c2gJZHMKKwkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCisJCWxkcwlkeCxkd29yZCBwdHIgW2JwKzhdCTsgYnVmZmVyIGFkZHJlc3MKKwkJbW92CWN4LHdvcmQgcHRyIFticCsxMl0JOyBudW1iZXIgb2YgYnl0ZXMKKwkJbW92CWFoLDNmaAkJCTsgcmVhZCBmaWxlCisJCWludAkyMWgKKwkJamMJcmVhZF9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQorCQljbXAJYXgsd29yZCBwdHIgW2JwKzEyXQk7IG1ha2Ugc3VyZSBhbGwgYnl0ZXMgd2VyZSByZWFkCisJCWplCXJlYWRfb2sKKwkJbW92CWF4LDEJCQk7IGVsc2UgcmV0dXJuIDEgZm9yIG5vdCBPSworCQlqbXAJc2hvcnQgcmVhZF9lcnIKK3JlYWRfb2s6CXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCityZWFkX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2pkb3NfcmVhZAllbmRwCisKKworOworOyBzaG9ydCBmYXIgamRvc193cml0ZSAoc2hvcnQgaGFuZGxlLCB2b2lkIGZhciAqIGJ1ZmZlciwgdW5zaWduZWQgc2hvcnQgY291bnQpCis7Cis7IFdyaXRlIHRvIGZpbGUKKzsKK19qZG9zX3dyaXRlCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKKwkJbGRzCWR4LGR3b3JkIHB0ciBbYnArOF0JOyBidWZmZXIgYWRkcmVzcworCQltb3YJY3gsd29yZCBwdHIgW2JwKzEyXQk7IG51bWJlciBvZiBieXRlcworCQltb3YJYWgsNDBoCQkJOyB3cml0ZSBmaWxlCisJCWludAkyMWgKKwkJamMJd3JpdGVfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKKwkJY21wCWF4LHdvcmQgcHRyIFticCsxMl0JOyBtYWtlIHN1cmUgYWxsIGJ5dGVzIHdyaXR0ZW4KKwkJamUJd3JpdGVfb2sKKwkJbW92CWF4LDEJCQk7IGVsc2UgcmV0dXJuIDEgZm9yIG5vdCBPSworCQlqbXAJc2hvcnQgd3JpdGVfZXJyCit3cml0ZV9vazoJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKK3dyaXRlX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2pkb3Nfd3JpdGUJZW5kcAorCisKKzsKKzsgdm9pZCBmYXIganhtc19nZXRkcml2ZXIgKFhNU0RSSVZFUiBmYXIgKikKKzsKKzsgR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBYTVMgZHJpdmVyLCBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKzsKK19qeG1zX2dldGRyaXZlcglwcm9jCWZhcgorCQlwdXNoCWJwCQkJOyBsaW5rYWdlCisJCW1vdiAJYnAsc3AKKwkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKKwkJcHVzaAlkaQorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCWVzCisJCXB1c2gJZHMKKwkJbW92IAlheCw0MzAwaAkJOyBjYWxsIG11bHRpcGxleCBpbnRlcnJ1cHQgd2l0aAorCQlpbnQJMmZoCQkJOyBhIG1hZ2ljIGNvb2tpZSwgaGV4IDQzMDAKKwkJY21wIAlhbCw4MGgJCQk7IEFMIHNob3VsZCBjb250YWluIGhleCA4MAorCQlqZQl4bXNhdmFpbAorCQl4b3IgCWR4LGR4CQkJOyBubyBYTVMgZHJpdmVyIGF2YWlsYWJsZQorCQl4b3IgCWF4LGF4CQkJOyByZXR1cm4gYSBuaWwgcG9pbnRlcgorCQlqbXAJc2hvcnQgeG1zYXZhaWxfZG9uZQoreG1zYXZhaWw6CW1vdiAJYXgsNDMxMGgJCTsgZmV0Y2ggZHJpdmVyIGFkZHJlc3Mgd2l0aAorCQlpbnQJMmZoCQkJOyBhbm90aGVyIG1hZ2ljIGNvb2tpZQorCQltb3YgCWR4LGVzCQkJOyBjb3B5IGFkZHJlc3MgdG8gZHg6YXgKKwkJbW92IAlheCxieAoreG1zYXZhaWxfZG9uZToJbGVzIAlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IHBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlCisJCW1vdgl3b3JkIHB0ciBlczpbYnhdLGF4CisJCW1vdgl3b3JkIHB0ciBlczpbYngrMl0sZHgKKwkJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AJYnAKKwkJcmV0Citfanhtc19nZXRkcml2ZXIJZW5kcAorCisKKzsKKzsgdm9pZCBmYXIganhtc19jYWxsZHJpdmVyIChYTVNEUklWRVIsIFhNU2NvbnRleHQgZmFyICopCis7Cis7IFRoZSBYTVNjb250ZXh0IHN0cnVjdHVyZSBjb250YWlucyB2YWx1ZXMgZm9yIHRoZSBBWCxEWCxCWCxTSSxEUyByZWdpc3RlcnMuCis7IFRoZXNlIGFyZSBsb2FkZWQsIHRoZSBYTVMgY2FsbCBpcyBwZXJmb3JtZWQsIGFuZCB0aGUgbmV3IHZhbHVlcyBvZiB0aGUKKzsgQVgsRFgsQlggcmVnaXN0ZXJzIGFyZSB3cml0dGVuIGJhY2sgdG8gdGhlIGNvbnRleHQgc3RydWN0dXJlLgorOworX2p4bXNfY2FsbGRyaXZlciAJcHJvYwlmYXIKKwkJcHVzaAlicAkJCTsgbGlua2FnZQorCQltb3YgCWJwLHNwCisJCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5CisJCXB1c2gJZGkKKwkJcHVzaAlieAorCQlwdXNoCWN4CisJCXB1c2gJZHgKKwkJcHVzaAllcworCQlwdXNoCWRzCisJCWxlcyAJYngsZHdvcmQgcHRyIFticCsxMF0JOyBnZXQgWE1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJYXgsd29yZCBwdHIgZXM6W2J4XQk7IGxvYWQgcmVnaXN0ZXJzCisJCW1vdiAJZHgsd29yZCBwdHIgZXM6W2J4KzJdCisJCW1vdiAJc2ksd29yZCBwdHIgZXM6W2J4KzZdCisJCW1vdiAJZHMsd29yZCBwdHIgZXM6W2J4KzhdCisJCW1vdiAJYngsd29yZCBwdHIgZXM6W2J4KzRdCisJCWNhbGwJZHdvcmQgcHRyIFticCs2XQk7IGNhbGwgdGhlIGRyaXZlcgorCQltb3YJY3gsYngJCQk7IHNhdmUgcmV0dXJuZWQgQlggZm9yIGEgc2VjCisJCWxlcyAJYngsZHdvcmQgcHRyIFticCsxMF0JOyBnZXQgWE1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJd29yZCBwdHIgZXM6W2J4XSxheAk7IHB1dCBiYWNrIGF4LGR4LGJ4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzJdLGR4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzRdLGN4CisJCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wIAlicAorCQlyZXQKK19qeG1zX2NhbGxkcml2ZXIgCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZW1zX2F2YWlsYWJsZSAodm9pZCkKKzsKKzsgSGF2ZSB3ZSBnb3QgYW4gRU1TIGRyaXZlcj8gKHRoaXMgY29tZXMgc3RyYWlnaHQgZnJvbSB0aGUgRU1TIDQuMCBzcGVjcykKKzsKK19qZW1zX2F2YWlsYWJsZQlwcm9jCWZhcgorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYXgsMzU2N2gJCTsgZ2V0IGludGVycnVwdCB2ZWN0b3IgNjdoCisJCWludAkyMWgKKwkJcHVzaAljcworCQlwb3AJZHMKKwkJbW92CWRpLDAwMGFoCQk7IGNoZWNrIG9mZnMgMTAgaW4gcmV0dXJuZWQgc2VnCisJCWxlYQlzaSxBU0NJSV9kZXZpY2VfbmFtZQk7IGFnYWluc3QgbGl0ZXJhbCBzdHJpbmcKKwkJbW92CWN4LDgKKwkJY2xkCisJCXJlcGUgY21wc2IKKwkJam5lCW5vX2VtcworCQltb3YJYXgsMQkJCTsgbWF0Y2gsIGl0J3MgdGhlcmUKKwkJam1wCXNob3J0IGF2YWlsX2RvbmUKK25vX2VtczoJCXhvcglheCxheAkJCTsgaXQncyBub3QgdGhlcmUKK2F2YWlsX2RvbmU6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcmV0CisKK0FTQ0lJX2RldmljZV9uYW1lCWRiCSJFTU1YWFhYMCIKKworX2plbXNfYXZhaWxhYmxlCWVuZHAKKworCis7Cis7IHZvaWQgZmFyIGplbXNfY2FsbGRyaXZlciAoRU1TY29udGV4dCBmYXIgKikKKzsKKzsgVGhlIEVNU2NvbnRleHQgc3RydWN0dXJlIGNvbnRhaW5zIHZhbHVlcyBmb3IgdGhlIEFYLERYLEJYLFNJLERTIHJlZ2lzdGVycy4KKzsgVGhlc2UgYXJlIGxvYWRlZCwgdGhlIEVNUyB0cmFwIGlzIHBlcmZvcm1lZCwgYW5kIHRoZSBuZXcgdmFsdWVzIG9mIHRoZQorOyBBWCxEWCxCWCByZWdpc3RlcnMgYXJlIHdyaXR0ZW4gYmFjayB0byB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCis7CitfamVtc19jYWxsZHJpdmVyCXByb2MgZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgRU1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJYXgsd29yZCBwdHIgZXM6W2J4XQk7IGxvYWQgcmVnaXN0ZXJzCisJCW1vdiAJZHgsd29yZCBwdHIgZXM6W2J4KzJdCisJCW1vdiAJc2ksd29yZCBwdHIgZXM6W2J4KzZdCisJCW1vdiAJZHMsd29yZCBwdHIgZXM6W2J4KzhdCisJCW1vdiAJYngsd29yZCBwdHIgZXM6W2J4KzRdCisJCWludAk2N2gJCQk7IGNhbGwgdGhlIEVNUyBkcml2ZXIKKwkJbW92CWN4LGJ4CQkJOyBzYXZlIHJldHVybmVkIEJYIGZvciBhIHNlYworCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgRU1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJd29yZCBwdHIgZXM6W2J4XSxheAk7IHB1dCBiYWNrIGF4LGR4LGJ4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzJdLGR4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzRdLGN4CisJCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wIAlicAorCQlyZXQKK19qZW1zX2NhbGxkcml2ZXIJZW5kcAorCitKTUVNRE9TQV9UWFQJZW5kcworCisJCWVuZApkaWZmIC0tZ2l0IGEvanBlZy9qbWVtbWFjLmMgYi9qcGVnL2ptZW1tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZmOWJlCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qbWVtbWFjLmMKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBqbWVtbWFjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIGptZW1tYWMuYyBwcm92aWRlcyBhbiBBcHBsZSBNYWNpbnRvc2ggaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KKyAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLgorICoKKyAqIElmIHlvdSB1c2Ugam1lbW1hYy5jLCB0aGVuIHlvdSBtdXN0IGRlZmluZSBVU0VfTUFDX01FTU1HUiBpbiB0aGUKKyAqIEpQRUdfSU5URVJOQUxTIHBhcnQgb2YgamNvbmZpZy5oLgorICoKKyAqIGptZW1tYWMuYyB1c2VzIHRoZSBNYWNpbnRvc2ggdG9vbGJveCByb3V0aW5lcyBOZXdQdHIgYW5kIERpc3Bvc2VQdHIKKyAqIGluc3RlYWQgb2YgbWFsbG9jIGFuZCBmcmVlLiAgSXQgYWNjdXJhdGVseSBkZXRlcm1pbmVzIHRoZSBhbW91bnQgb2YKKyAqIG1lbW9yeSBhdmFpbGFibGUgYnkgdXNpbmcgQ29tcGFjdE1lbS4gIE5vdGljZSB0aGF0IGlmIGxlZnQgdG8gaXRzCisgKiBvd24gZGV2aWNlcywgdGhpcyBjb2RlIGNhbiBjaGV3IHVwIGFsbCBhdmFpbGFibGUgc3BhY2UgaW4gdGhlCisgKiBhcHBsaWNhdGlvbidzIHpvbmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcmF0aGVyIHNtYWxsICJzbG9wIgorICogZmFjdG9yIGNvbXB1dGVkIGluIGpwZWdfbWVtX2F2YWlsYWJsZSgpLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBlbnN1cmUKKyAqIHRoYXQgbW9yZSBzcGFjZSBpcyBsZWZ0IG92ZXIgYnkgcmVkdWNpbmcgbWF4X21lbW9yeV90b191c2UuCisgKgorICogTGFyZ2UgaW1hZ2VzIGFyZSBzd2FwcGVkIHRvIGRpc2sgdXNpbmcgdGVtcG9yYXJ5IGZpbGVzIGFuZCBTeXN0ZW0gNy4wKydzCisgKiB0ZW1wb3JhcnkgZm9sZGVyIGZ1bmN0aW9uYWxpdHkuCisgKgorICogTm90ZSB0aGF0IGptZW1tYWMuYyBkZXBlbmRzIG9uIHR3byBmZWF0dXJlcyBvZiBNYWNPUyB0aGF0IHdlcmUgZmlyc3QKKyAqIGludHJvZHVjZWQgaW4gU3lzdGVtIDc6IEZpbmRGb2xkZXIgYW5kIHRoZSBGU1NwZWMtYmFzZWQgY2FsbHMuCisgKiBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgam1lbW1hYy5jIGFuZCBpcyBydW4gdW5kZXIgU3lzdGVtIDYgb3IgZWFybGllciwKKyAqIGFuZCB0aGUganBlZyBsaWJyYXJ5IGRlY2lkZXMgaXQgbmVlZHMgYSB0ZW1wb3JhcnkgZmlsZSwgaXQgd2lsbCBhYm9ydCwKKyAqIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzIGFib3V0IHJlcXVpcmluZyBTeXN0ZW0gNy4gIChJZiBubyB0ZW1wb3JhcnkgZmlsZXMKKyAqIGFyZSBjcmVhdGVkLCBpdCB3aWxsIHJ1biBmaW5lLikKKyAqCisgKiBJZiB5b3Ugd2FudCB0byB1c2Ugam1lbW1hYy5jIGluIGFuIGFwcGxpY2F0aW9uIHRoYXQgbWlnaHQgYmUgdXNlZCB3aXRoCisgKiBTeXN0ZW0gNiBvciBlYXJsaWVyLCB0aGVuIHlvdSBzaG91bGQgcmVtb3ZlIGRlcGVuZGVuY2llcyBvbiBGaW5kRm9sZGVyCisgKiBhbmQgdGhlIEZTU3BlYyBjYWxscy4gIFlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSBGaW5kRm9sZGVyIHdpdGggc29tZQorICogb3RoZXIgbWVjaGFuaXNtIGZvciBmaW5kaW5nIGEgcGxhY2UgdG8gcHV0IHRlbXBvcmFyeSBmaWxlcywgYW5kIHlvdQorICogc2hvdWxkIHJlcGxhY2UgdGhlIEZTU3BlYyBjYWxscyB3aXRoIHRoZWlyIEhGUyBlcXVpdmFsZW50czoKKyAqCisgKiAgICAgRlNwRGVsZXRlICAgICAtPiAgSERlbGV0ZQorICogICAgIEZTcEdldEZJbmZvICAgLT4gIEhHZXRGSW5mbworICogICAgIEZTcENyZWF0ZSAgICAgLT4gIEhDcmVhdGUKKyAqICAgICBGU3BPcGVuREYgICAgIC0+ICBIT3BlbiAgICAgICoqKiBOb3RlOiBub3QgSE9wZW5ERiAqKioKKyAqICAgICBGU01ha2VGU1NwZWMgIC0+ICAoZmlsbCBpbiBzcGVjIGJ5IGhhbmQuKQorICoKKyAqIChVc2UgSE9wZW4gaW5zdGVhZCBvZiBIT3BlbkRGLiAgSE9wZW4gaXMganVzdCBhIGdsdWUtaW50ZXJmYWNlIHRvIFBCSE9wZW4sCisgKiB3aGljaCBpcyBvbiBhbGwgSEZTIG1hY3MuICBIT3BlbkRGIGlzIGEgU3lzdGVtIDcgYWRkaXRpb24gd2hpY2ggYXZvaWRzIHRoZQorICogYWdlcy1vbGQgcHJvYmxlbSBvZiBuYW1lcyBzdGFydGluZyB3aXRoIGEgcGVyaW9kLikKKyAqCisgKiBDb250cmlidXRlZCBieSBTYW0gQnVzaGVsbCAoanNhbUBpYWd1Lm9uLm5ldCkgYW5kCisgKiBEYW4gR2lsZG9yIChneWxkQGluLXRvdWNoLmNvbSkuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIgICAgLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIFVTRV9NQUNfTUVNTUdSCS8qIG1ha2Ugc3VyZSB1c2VyIGdvdCBjb25maWd1cmF0aW9uIHJpZ2h0ICovCisgIFlvdSBmb3Jnb3QgdG8gZGVmaW5lIFVTRV9NQUNfTUVNTUdSIGluIGpjb25maWcuaC4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyb3IgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8TWVtb3J5Lmg+ICAgICAvKiB3ZSB1c2UgdGhlIE1hY09TIG1lbW9yeSBtYW5hZ2VyICovCisjaW5jbHVkZSA8RmlsZXMuaD4gICAgICAvKiB3ZSB1c2UgdGhlIE1hY09TIEZpbGUgc3R1ZmYgKi8KKyNpbmNsdWRlIDxGb2xkZXJzLmg+ICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgSEZTIHN0dWZmICovCisjaW5jbHVkZSA8U2NyaXB0Lmg+ICAgICAvKiBmb3Igc21TeXN0ZW1TY3JpcHQgKi8KKyNpbmNsdWRlIDxHZXN0YWx0Lmg+ICAgIC8qIHdlIHVzZSBHZXN0YWx0IHRvIHRlc3QgZm9yIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgKi8KKworI2lmbmRlZiBURU1QX0ZJTEVfTkFNRQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCisjZGVmaW5lIFRFTVBfRklMRV9OQU1FICAiSlBHJTAzZC5UTVAiCisjZW5kaWYKKworc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KKworCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIE1hY09TIGxpYnJhcnkKKyAqIHJvdXRpbmVzIE5ld1B0cigpIGFuZCBEaXNwb3NlUHRyKCksIHdoaWNoIGFsbG9jYXRlIGZpeGVkLWFkZHJlc3MKKyAqIHN0b3JhZ2UuICBVbmZvcnR1bmF0ZWx5LCB0aGUgSUpHIGxpYnJhcnkgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGNvcGUKKyAqIHdpdGggcmVsb2NhdGFibGUgc3RvcmFnZS4KKyAqLworCitHTE9CQUwodm9pZCAqKQoranBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkICopIE5ld1B0cihzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBEaXNwb3NlUHRyKChQdHIpIG9iamVjdCk7Cit9CisKKworLyoKKyAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCisgKiBOQjogd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zIHNpbXBseSBmb3IKKyAqIGNvbnNpc3RlbmN5IHdpdGggdGhlIHJlc3Qgb2YgdGhlIElKRyBjb2RlOyBGQVIgc2hvdWxkIGV4cGFuZCB0byBlbXB0eQorICogb24gcmF0aW9uYWwgYXJjaGl0ZWN0dXJlcyBsaWtlIHRoZSBNYWMuCisgKi8KKworR0xPQkFMKHZvaWQgRkFSICopCitqcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgRkFSICopIE5ld1B0cihzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgRGlzcG9zZVB0cigoUHRyKSBvYmplY3QpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICBsb25nIGxpbWl0ID0gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKKyAgbG9uZyBzbG9wLCBtZW07CisKKyAgLyogRG9uJ3QgYXNrIGZvciBtb3JlIHRoYW4gd2hhdCBhcHBsaWNhdGlvbiBoYXMgdG9sZCB1cyB3ZSBtYXkgdXNlICovCisgIGlmIChtYXhfYnl0ZXNfbmVlZGVkID4gbGltaXQgJiYgbGltaXQgPiAwKQorICAgIG1heF9ieXRlc19uZWVkZWQgPSBsaW1pdDsKKyAgLyogRmluZCB3aGV0aGVyIHRoZXJlJ3MgYSBiaWcgZW5vdWdoIGZyZWUgYmxvY2sgaW4gdGhlIGhlYXAuCisgICAqIENvbXBhY3RNZW0gdHJpZXMgdG8gY3JlYXRlIGEgY29udGlndW91cyBibG9jayBvZiB0aGUgcmVxdWVzdGVkIHNpemUsCisgICAqIGFuZCB0aGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgZnJlZSBibG9jayAod2hpY2ggY291bGQgYmUKKyAgICogbXVjaCBtb3JlIG9yIG11Y2ggbGVzcyB0aGFuIHdlIGFza2VkIGZvcikuCisgICAqIFdlIGFkZCBzb21lIHNsb3AgdG8gZW5zdXJlIHdlIGRvbid0IHVzZSB1cCBhbGwgYXZhaWxhYmxlIG1lbW9yeS4KKyAgICovCisgIHNsb3AgPSBtYXhfYnl0ZXNfbmVlZGVkIC8gMTYgKyAzMjc2OEw7CisgIG1lbSA9IENvbXBhY3RNZW0obWF4X2J5dGVzX25lZWRlZCArIHNsb3ApIC0gc2xvcDsKKyAgaWYgKG1lbSA8IDApCisgICAgbWVtID0gMDsJCQkvKiBzaWdoLCBjb3VsZG4ndCBldmVuIGdldCB0aGUgc2xvcCAqLworICAvKiBEb24ndCB0YWtlIG1vcmUgdGhhbiB0aGUgYXBwbGljYXRpb24gc2F5cyB3ZSBjYW4gaGF2ZSAqLworICBpZiAobWVtID4gbGltaXQgJiYgbGltaXQgPiAwKQorICAgIG1lbSA9IGxpbWl0OworICByZXR1cm4gbWVtOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgbG9uZyBieXRlcyA9IGJ5dGVfY291bnQ7CisgIGxvbmcgcmV0VmFsOworCisgIGlmICggU2V0RlBvcyAoIGluZm8tPnRlbXBfZmlsZSwgZnNGcm9tU3RhcnQsIGZpbGVfb2Zmc2V0ICkgIT0gbm9FcnIgKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisKKyAgcmV0VmFsID0gRlNSZWFkICggaW5mby0+dGVtcF9maWxlLCAmYnl0ZXMsCisJCSAgICAodW5zaWduZWQgY2hhciAqKSBidWZmZXJfYWRkcmVzcyApOworICBpZiAoIHJldFZhbCAhPSBub0VyciB8fCBieXRlcyAhPSBieXRlX2NvdW50ICkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBsb25nIGJ5dGVzID0gYnl0ZV9jb3VudDsKKyAgbG9uZyByZXRWYWw7CisKKyAgaWYgKCBTZXRGUG9zICggaW5mby0+dGVtcF9maWxlLCBmc0Zyb21TdGFydCwgZmlsZV9vZmZzZXQgKSAhPSBub0VyciApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKworICByZXRWYWwgPSBGU1dyaXRlICggaW5mby0+dGVtcF9maWxlLCAmYnl0ZXMsCisJCSAgICAgKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyX2FkZHJlc3MgKTsKKyAgaWYgKCByZXRWYWwgIT0gbm9FcnIgfHwgYnl0ZXMgIT0gYnl0ZV9jb3VudCApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCit7CisgIEZTQ2xvc2UgKCBpbmZvLT50ZW1wX2ZpbGUgKTsKKyAgRlNwRGVsZXRlICggJihpbmZvLT50ZW1wU3BlYykgKTsKK30KKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKgorICogVGhpcyB2ZXJzaW9uIHVzZXMgRmluZEZvbGRlciB0byBmaW5kIHRoZSBUZW1wb3JhcnkgSXRlbXMgZm9sZGVyLAorICogYW5kIHB1dHMgdGhlIHRlbXBvcmFyeSBmaWxlIGluIHRoZXJlLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgc2hvcnQgICAgICAgICB0bXBSZWYsIHZSZWZOdW07CisgIGxvbmcgICAgICAgICAgZGlySUQ7CisgIEZJbmZvICAgICAgICAgZmluZGVySW5mbzsKKyAgRlNTcGVjICAgICAgICB0aGVTcGVjOworICBTdHIyNTUgICAgICAgIGZOYW1lOworICBPU0VyciAgICAgICAgIG9zRXJyOworICBsb25nICAgICAgICAgIGdlc3RhbHRSZXNwb25zZSA9IDA7CisKKyAgLyogQ2hlY2sgdGhhdCBGU1NwZWMgY2FsbHMgYXJlIGF2YWlsYWJsZS4gKi8KKyAgb3NFcnIgPSBHZXN0YWx0KCBnZXN0YWx0RlNBdHRyLCAmZ2VzdGFsdFJlc3BvbnNlICk7CisgIGlmICggKCBvc0VyciAhPSBub0VyciApCisgICAgICAgfHwgISggZ2VzdGFsdFJlc3BvbnNlICYgKDE8PGdlc3RhbHRIYXNGU1NwZWNDYWxscykgKSApCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSBTeXN0ZW0gNy4wIG9yIGxhdGVyIHJlcXVpcmVkIik7CisgIC8qIFRPIERPOiBhZGQgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSB0byBqZXJyb3IuaC4gKi8KKworICAvKiBDaGVjayB0aGF0IEZpbmRGb2xkZXIgaXMgYXZhaWxhYmxlLiAqLworICBvc0VyciA9IEdlc3RhbHQoIGdlc3RhbHRGaW5kRm9sZGVyQXR0ciwgJmdlc3RhbHRSZXNwb25zZSApOworICBpZiAoICggb3NFcnIgIT0gbm9FcnIgKQorICAgICAgIHx8ICEoIGdlc3RhbHRSZXNwb25zZSAmICgxPDxnZXN0YWx0RmluZEZvbGRlclByZXNlbnQpICkgKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIi0gU3lzdGVtIDcuMCBvciBsYXRlciByZXF1aXJlZC4iKTsKKyAgLyogVE8gRE86IGFkZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIHRvIGplcnJvci5oLiAqLworCisgIG9zRXJyID0gRmluZEZvbGRlciAoIGtPblN5c3RlbURpc2ssIGtUZW1wb3JhcnlGb2xkZXJUeXBlLCBrQ3JlYXRlRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwgJmRpcklEICk7CisgIGlmICggb3NFcnIgIT0gbm9FcnIgKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIi0gdGVtcG9yYXJ5IGl0ZW1zIGZvbGRlciB1bmF2YWlsYWJsZSIpOworICAvKiBUTyBETzogVHJ5IHB1dHRpbmcgdGhlIHRlbXAgZmlsZXMgc29tZXdoZXJlIGVsc2UuICovCisKKyAgLyogS2VlcCBnZW5lcmF0aW5nIGZpbGUgbmFtZXMgdGlsbCB3ZSBmaW5kIG9uZSB0aGF0J3Mgbm90IGluIHVzZSAqLworICBmb3IgKDs7KSB7CisgICAgbmV4dF9maWxlX251bSsrOwkJLyogYWR2YW5jZSBjb3VudGVyICovCisKKyAgICBzcHJpbnRmKGluZm8tPnRlbXBfbmFtZSwgVEVNUF9GSUxFX05BTUUsIG5leHRfZmlsZV9udW0pOworICAgIHN0cmNweSAoIChQdHIpZk5hbWUrMSwgaW5mby0+dGVtcF9uYW1lICk7CisgICAgKmZOYW1lID0gc3RybGVuIChpbmZvLT50ZW1wX25hbWUpOworICAgIG9zRXJyID0gRlNNYWtlRlNTcGVjICggdlJlZk51bSwgZGlySUQsIGZOYW1lLCAmdGhlU3BlYyApOworCisgICAgaWYgKCAob3NFcnIgPSBGU3BHZXRGSW5mbyAoICZ0aGVTcGVjLCAmZmluZGVySW5mbyApICkgIT0gbm9FcnIgKQorICAgICAgYnJlYWs7CisgIH0KKworICBvc0VyciA9IEZTcENyZWF0ZSAoICZ0aGVTcGVjLCAnPz8/PycsICc/Pz8/Jywgc21TeXN0ZW1TY3JpcHQgKTsKKyAgaWYgKCBvc0VyciAhPSBub0VyciApCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOworCisgIG9zRXJyID0gRlNwT3BlbkRGICggJnRoZVNwZWMsIGZzUmRXclBlcm0sICYoaW5mby0+dGVtcF9maWxlKSApOworICBpZiAoIG9zRXJyICE9IG5vRXJyICkKKyAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7CisKKyAgaW5mby0+dGVtcFNwZWMgPSB0aGVTcGVjOworCisgIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfYmFja2luZ19zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9iYWNraW5nX3N0b3JlOworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9PUEVOLCBpbmZvLT50ZW1wX25hbWUpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBuZXh0X2ZpbGVfbnVtID0gMDsKKworICAvKiBtYXhfbWVtb3J5X3RvX3VzZSB3aWxsIGJlIGluaXRpYWxpemVkIHRvIEZyZWVNZW0oKSdzIHJlc3VsdDsKKyAgICogdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gbWlnaHQgbGF0ZXIgcmVkdWNlIGl0LCBmb3IgZXhhbXBsZQorICAgKiB0byBsZWF2ZSByb29tIHRvIGludm9rZSBtdWx0aXBsZSBKUEVHIG9iamVjdHMuCisgICAqIE5vdGUgdGhhdCBGcmVlTWVtIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBmcmVlIGJ5dGVzOworICAgKiBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIGFsbG9jYXRlIGEgc2luZ2xlIGJsb2NrIG9mIHRoaXMgc2l6ZS4KKyAgICovCisgIHJldHVybiBGcmVlTWVtKCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CmRpZmYgLS1naXQgYS9qcGVnL2ptZW1tZ3IuYyBiL2pwZWcvam1lbW1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDFiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2ptZW1tZ3IuYwpAQCAtMCwwICsxLDExMTggQEAKKy8qCisgKiBqbWVtbWdyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlBFRyBzeXN0ZW0taW5kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZW1lbnQKKyAqIHJvdXRpbmVzLiAgVGhpcyBjb2RlIGlzIHVzYWJsZSBhY3Jvc3MgYSB3aWRlIHZhcmlldHkgb2YgbWFjaGluZXM7IG1vc3QKKyAqIG9mIHRoZSBzeXN0ZW0gZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBpc29sYXRlZCBpbiBhIHNlcGFyYXRlIGZpbGUuCisgKiBUaGUgbWFqb3IgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUgYXJlOgorICogICAqIHBvb2wtYmFzZWQgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBvZiBtZW1vcnk7CisgKiAgICogcG9saWN5IGRlY2lzaW9ucyBhYm91dCBob3cgdG8gZGl2aWRlIGF2YWlsYWJsZSBtZW1vcnkgYW1vbmcgdGhlCisgKiAgICAgdmlydHVhbCBhcnJheXM7CisgKiAgICogY29udHJvbCBsb2dpYyBmb3Igc3dhcHBpbmcgdmlydHVhbCBhcnJheXMgYmV0d2VlbiBtYWluIG1lbW9yeSBhbmQKKyAqICAgICBiYWNraW5nIHN0b3JhZ2UuCisgKiBUaGUgc2VwYXJhdGUgc3lzdGVtLWRlcGVuZGVudCBmaWxlIHByb3ZpZGVzIHRoZSBhY3R1YWwgYmFja2luZy1zdG9yYWdlCisgKiBhY2Nlc3MgY29kZSwgYW5kIGl0IGNvbnRhaW5zIHRoZSBwb2xpY3kgZGVjaXNpb24gYWJvdXQgaG93IG11Y2ggdG90YWwKKyAqIG1haW4gbWVtb3J5IHRvIHVzZS4KKyAqIFRoaXMgZmlsZSBpcyBzeXN0ZW0tZGVwZW5kZW50IGluIHRoZSBzZW5zZSB0aGF0IHNvbWUgb2YgaXRzIGZ1bmN0aW9ucworICogYXJlIHVubmVjZXNzYXJ5IGluIHNvbWUgc3lzdGVtcy4gIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBlbm91Z2ggdmlydHVhbAorICogbWVtb3J5IHNvIHRoYXQgYmFja2luZyBzdG9yYWdlIHdpbGwgbmV2ZXIgYmUgdXNlZCwgbXVjaCBvZiB0aGUgdmlydHVhbAorICogYXJyYXkgY29udHJvbCBsb2dpYyBjb3VsZCBiZSByZW1vdmVkLiAgKE9mIGNvdXJzZSwgaWYgeW91IGhhdmUgdGhhdCBtdWNoCisgKiBtZW1vcnkgdGhlbiB5b3Ugc2hvdWxkbid0IGNhcmUgYWJvdXQgYSBsaXR0bGUgYml0IG9mIHVudXNlZCBjb2RlLi4uKQorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNkZWZpbmUgQU1fTUVNT1JZX01BTkFHRVIJLyogd2UgZGVmaW5lIGp2aXJ0X1hhcnJheV9jb250cm9sIHN0cnVjdHMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgTk9fR0VURU5WCisjaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgZ2V0ZW52KCkgKi8KK2V4dGVybiBjaGFyICogZ2V0ZW52IEpQUCgoY29uc3QgY2hhciAqIG5hbWUpKTsKKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIFNvbWUgaW1wb3J0YW50IG5vdGVzOgorICogICBUaGUgYWxsb2NhdGlvbiByb3V0aW5lcyBwcm92aWRlZCBoZXJlIG11c3QgbmV2ZXIgcmV0dXJuIE5VTEwuCisgKiAgIFRoZXkgc2hvdWxkIGV4aXQgdG8gZXJyb3JfZXhpdCBpZiB1bnN1Y2Nlc3NmdWwuCisgKgorICogICBJdCdzIG5vdCBhIGdvb2QgaWRlYSB0byB0cnkgdG8gbWVyZ2UgdGhlIHNhcnJheSBhbmQgYmFycmF5IHJvdXRpbmVzLAorICogICBldmVuIHRob3VnaCB0aGV5IGFyZSB0ZXh0dWFsbHkgYWxtb3N0IHRoZSBzYW1lLCBiZWNhdXNlIHNhbXBsZXMgYXJlCisgKiAgIHVzdWFsbHkgc3RvcmVkIGFzIGJ5dGVzIHdoaWxlIGNvZWZmaWNpZW50cyBhcmUgc2hvcnRzIG9yIGludHMuICBUaHVzLAorICogICBpbiBtYWNoaW5lcyB3aGVyZSBieXRlIHBvaW50ZXJzIGhhdmUgYSBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb24gZnJvbQorICogICB3b3JkIHBvaW50ZXJzLCB0aGUgcmVzdWx0aW5nIG1hY2hpbmUgY29kZSBjb3VsZCBub3QgYmUgdGhlIHNhbWUuCisgKi8KKworCisvKgorICogTWFueSBtYWNoaW5lcyByZXF1aXJlIHN0b3JhZ2UgYWxpZ25tZW50OiBsb25ncyBtdXN0IHN0YXJ0IG9uIDQtYnl0ZQorICogYm91bmRhcmllcywgZG91YmxlcyBvbiA4LWJ5dGUgYm91bmRhcmllcywgZXRjLiAgT24gc3VjaCBtYWNoaW5lcywgbWFsbG9jKCkKKyAqIGFsd2F5cyByZXR1cm5zIHBvaW50ZXJzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKKyAqIHJlcXVpcmVtZW50LCBhbmQgd2UgaGFkIGJldHRlciBkbyBzbyB0b28uCisgKiBUaGVyZSBpc24ndCBhbnkgcmVhbGx5IHBvcnRhYmxlIHdheSB0byBkZXRlcm1pbmUgdGhlIHdvcnN0LWNhc2UgYWxpZ25tZW50CisgKiByZXF1aXJlbWVudC4gIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhhdCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGlzCisgKiBtdWx0aXBsZXMgb2Ygc2l6ZW9mKEFMSUdOX1RZUEUpLgorICogQnkgZGVmYXVsdCwgd2UgZGVmaW5lIEFMSUdOX1RZUEUgYXMgZG91YmxlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgb24gc29tZQorICogd29ya3N0YXRpb25zICh3aGVyZSBkb3VibGVzIHJlYWxseSBkbyBuZWVkIDgtYnl0ZSBhbGlnbm1lbnQpIGFuZCB3aWxsIHdvcmsKKyAqIGZpbmUgb24gbmVhcmx5IGV2ZXJ5dGhpbmcuICBJZiB5b3VyIG1hY2hpbmUgaGFzIGxlc3NlciBhbGlnbm1lbnQgbmVlZHMsCisgKiB5b3UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgYnkgbWFraW5nIEFMSUdOX1RZUEUgc21hbGxlci4KKyAqIFRoZSBvbmx5IHBsYWNlIEkga25vdyBvZiB3aGVyZSB0aGlzIHdpbGwgTk9UIHdvcmsgaXMgY2VydGFpbiBNYWNpbnRvc2gKKyAqIDY4MHgwIGNvbXBpbGVycyB0aGF0IGRlZmluZSBkb3VibGUgYXMgYSAxMC1ieXRlIElFRUUgZXh0ZW5kZWQgZmxvYXQuCisgKiBEb2luZyAxMC1ieXRlIGFsaWdubWVudCBpcyBjb3VudGVycHJvZHVjdGl2ZSBiZWNhdXNlIGxvbmd3b3JkcyB3b24ndCBiZQorICogYWxpZ25lZCB3ZWxsLiAgUHV0ICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgaW4gamNvbmZpZy5oIGlmIHlvdSBoYXZlCisgKiBzdWNoIGEgY29tcGlsZXIuCisgKi8KKworI2lmbmRlZiBBTElHTl9UWVBFCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggKi8KKyNkZWZpbmUgQUxJR05fVFlQRSAgZG91YmxlCisjZW5kaWYKKworCisvKgorICogV2UgYWxsb2NhdGUgb2JqZWN0cyBmcm9tICJwb29scyIsIHdoZXJlIGVhY2ggcG9vbCBpcyBnb3R0ZW4gd2l0aCBhIHNpbmdsZQorICogcmVxdWVzdCB0byBqcGVnX2dldF9zbWFsbCgpIG9yIGpwZWdfZ2V0X2xhcmdlKCkuICBUaGVyZSBpcyBubyBwZXItb2JqZWN0CisgKiBvdmVyaGVhZCB3aXRoaW4gYSBwb29sLCBleGNlcHQgZm9yIGFsaWdubWVudCBwYWRkaW5nLiAgRWFjaCBwb29sIGhhcyBhCisgKiBoZWFkZXIgd2l0aCBhIGxpbmsgdG8gdGhlIG5leHQgcG9vbCBvZiB0aGUgc2FtZSBjbGFzcy4KKyAqIFNtYWxsIGFuZCBsYXJnZSBwb29sIGhlYWRlcnMgYXJlIGlkZW50aWNhbCBleGNlcHQgdGhhdCB0aGUgbGF0dGVyJ3MKKyAqIGxpbmsgcG9pbnRlciBtdXN0IGJlIEZBUiBvbiA4MHg4NiBtYWNoaW5lcy4KKyAqIE5vdGljZSB0aGF0IHRoZSAicmVhbCIgaGVhZGVyIGZpZWxkcyBhcmUgdW5pb24nZWQgd2l0aCBhIGR1bW15IEFMSUdOX1RZUEUKKyAqIGZpZWxkLiAgVGhpcyBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIG1ha2UgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKSBhIG11bHRpcGxlCisgKiBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIEFMSUdOX1RZUEUuCisgKi8KKwordHlwZWRlZiB1bmlvbiBzbWFsbF9wb29sX3N0cnVjdCAqIHNtYWxsX3Bvb2xfcHRyOworCit0eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0IHsKKyAgc3RydWN0IHsKKyAgICBzbWFsbF9wb29sX3B0ciBuZXh0OwkvKiBuZXh0IGluIGxpc3Qgb2YgcG9vbHMgKi8KKyAgICBzaXplX3QgYnl0ZXNfdXNlZDsJCS8qIGhvdyBtYW55IGJ5dGVzIGFscmVhZHkgdXNlZCB3aXRoaW4gcG9vbCAqLworICAgIHNpemVfdCBieXRlc19sZWZ0OwkJLyogYnl0ZXMgc3RpbGwgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCAqLworICB9IGhkcjsKKyAgQUxJR05fVFlQRSBkdW1teTsJCS8qIGluY2x1ZGVkIGluIHVuaW9uIHRvIGVuc3VyZSBhbGlnbm1lbnQgKi8KK30gc21hbGxfcG9vbF9oZHI7CisKK3R5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgRkFSICogbGFyZ2VfcG9vbF9wdHI7CisKK3R5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgeworICBzdHJ1Y3QgeworICAgIGxhcmdlX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLworICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCisgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCisgIH0gaGRyOworICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLworfSBsYXJnZV9wb29sX2hkcjsKKworCisvKgorICogSGVyZSBpcyB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIGEgbWVtb3J5IG1hbmFnZXIgb2JqZWN0LgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfbWVtb3J5X21nciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBFYWNoIHBvb2wgaWRlbnRpZmllciAobGlmZXRpbWUgY2xhc3MpIG5hbWVzIGEgbGlua2VkIGxpc3Qgb2YgcG9vbHMuICovCisgIHNtYWxsX3Bvb2xfcHRyIHNtYWxsX2xpc3RbSlBPT0xfTlVNUE9PTFNdOworICBsYXJnZV9wb29sX3B0ciBsYXJnZV9saXN0W0pQT09MX05VTVBPT0xTXTsKKworICAvKiBTaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGxpZmV0aW1lIGNsYXNzIG9mIHZpcnR1YWwgYXJyYXlzLCBvbmx5IG9uZQorICAgKiBsaW5rZWQgbGlzdCBpcyBuZWNlc3NhcnkgKGZvciBlYWNoIGRhdGF0eXBlKS4gIE5vdGUgdGhhdCB0aGUgdmlydHVhbAorICAgKiBhcnJheSBjb250cm9sIGJsb2NrcyBiZWluZyBsaW5rZWQgdG9nZXRoZXIgYXJlIGFjdHVhbGx5IHN0b3JlZCBzb21ld2hlcmUKKyAgICogaW4gdGhlIHNtYWxsLXBvb2wgbGlzdC4KKyAgICovCisgIGp2aXJ0X3NhcnJheV9wdHIgdmlydF9zYXJyYXlfbGlzdDsKKyAganZpcnRfYmFycmF5X3B0ciB2aXJ0X2JhcnJheV9saXN0OworCisgIC8qIFRoaXMgY291bnRzIHRvdGFsIHNwYWNlIG9idGFpbmVkIGZyb20ganBlZ19nZXRfc21hbGwvbGFyZ2UgKi8KKyAgbG9uZyB0b3RhbF9zcGFjZV9hbGxvY2F0ZWQ7CisKKyAgLyogYWxsb2Nfc2FycmF5IGFuZCBhbGxvY19iYXJyYXkgc2V0IHRoaXMgdmFsdWUgZm9yIHVzZSBieSB2aXJ0dWFsCisgICAqIGFycmF5IHJvdXRpbmVzLgorICAgKi8KKyAgSkRJTUVOU0lPTiBsYXN0X3Jvd3NwZXJjaHVuazsJLyogZnJvbSBtb3N0IHJlY2VudCBhbGxvY19zYXJyYXkvYmFycmF5ICovCit9IG15X21lbW9yeV9tZ3I7CisKK3R5cGVkZWYgbXlfbWVtb3J5X21nciAqIG15X21lbV9wdHI7CisKKworLyoKKyAqIFRoZSBjb250cm9sIGJsb2NrcyBmb3IgdmlydHVhbCBhcnJheXMuCisgKiBOb3RlIHRoYXQgdGhlc2UgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlICJzbWFsbCIgcG9vbCBhcmVhLgorICogU3lzdGVtLWRlcGVuZGVudCBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCBiYWNraW5nIHN0b3JlIChpZiBhbnkpIGlzIGhpZGRlbgorICogaW5zaWRlIHRoZSBiYWNraW5nX3N0b3JlX2luZm8gc3RydWN0LgorICovCisKK3N0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7CisgIEpTQU1QQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLworICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3c7CS8qIHdpZHRoIG9mIGFycmF5IChhbmQgb2YgbWVtb3J5IGJ1ZmZlcikgKi8KKyAgSkRJTUVOU0lPTiBtYXhhY2Nlc3M7CQkvKiBtYXggcm93cyBhY2Nlc3NlZCBieSBhY2Nlc3NfdmlydF9zYXJyYXkgKi8KKyAgSkRJTUVOU0lPTiByb3dzX2luX21lbTsJLyogaGVpZ2h0IG9mIG1lbW9yeSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dzcGVyY2h1bms7CS8qIGFsbG9jYXRpb24gY2h1bmsgc2l6ZSBpbiBtZW1fYnVmZmVyICovCisgIEpESU1FTlNJT04gY3VyX3N0YXJ0X3JvdzsJLyogZmlyc3QgbG9naWNhbCByb3cgIyBpbiB0aGUgYnVmZmVyICovCisgIEpESU1FTlNJT04gZmlyc3RfdW5kZWZfcm93OwkvKiByb3cgIyBvZiBmaXJzdCB1bmluaXRpYWxpemVkIHJvdyAqLworICBib29sZWFuIHByZV96ZXJvOwkJLyogcHJlLXplcm8gbW9kZSByZXF1ZXN0ZWQ/ICovCisgIGJvb2xlYW4gZGlydHk7CQkvKiBkbyBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBuZWVkIHdyaXR0ZW4/ICovCisgIGJvb2xlYW4gYl9zX29wZW47CQkvKiBpcyBiYWNraW5nLXN0b3JlIGRhdGEgdmFsaWQ/ICovCisgIGp2aXJ0X3NhcnJheV9wdHIgbmV4dDsJLyogbGluayB0byBuZXh0IHZpcnR1YWwgc2FycmF5IGNvbnRyb2wgYmxvY2sgKi8KKyAgYmFja2luZ19zdG9yZV9pbmZvIGJfc19pbmZvOwkvKiBTeXN0ZW0tZGVwZW5kZW50IGNvbnRyb2wgaW5mbyAqLworfTsKKworc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsKKyAgSkJMT0NLQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLworICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLworICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X2JhcnJheSAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCisgIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KKyAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KKyAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KKyAganZpcnRfYmFycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBiYXJyYXkgY29udHJvbCBibG9jayAqLworICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCit9OworCisKKyNpZmRlZiBNRU1fU1RBVFMJCS8qIG9wdGlvbmFsIGV4dHJhIHN0dWZmIGZvciBzdGF0aXN0aWNzICovCisKK0xPQ0FMKHZvaWQpCitwcmludF9tZW1fc3RhdHMgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOworICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKKworICAvKiBTaW5jZSB0aGlzIGlzIG9ubHkgYSBkZWJ1Z2dpbmcgc3R1Yiwgd2UgY2FuIGNoZWF0IGEgbGl0dGxlIGJ5IHVzaW5nCisgICAqIGZwcmludGYgZGlyZWN0bHkgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaCB0aGUgdHJhY2UgbWVzc2FnZSBjb2RlLgorICAgKiBUaGlzIGlzIGhlbHBmdWwgYmVjYXVzZSBtZXNzYWdlIHBhcm0gYXJyYXkgY2FuJ3QgaGFuZGxlIGxvbmdzLgorICAgKi8KKyAgZnByaW50ZihzdGRlcnIsICJGcmVlaW5nIHBvb2wgJWQsIHRvdGFsIHNwYWNlID0gJWxkXG4iLAorCSAgcG9vbF9pZCwgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOworCisgIGZvciAobGhkcl9wdHIgPSBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF07IGxoZHJfcHRyICE9IE5VTEw7CisgICAgICAgbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgTGFyZ2UgY2h1bmsgdXNlZCAlbGRcbiIsCisJICAgIChsb25nKSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQpOworICB9CisKKyAgZm9yIChzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsgc2hkcl9wdHIgIT0gTlVMTDsKKyAgICAgICBzaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiICBTbWFsbCBjaHVuayB1c2VkICVsZCBmcmVlICVsZFxuIiwKKwkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCwKKwkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCk7CisgIH0KK30KKworI2VuZGlmIC8qIE1FTV9TVEFUUyAqLworCisKK0xPQ0FMKHZvaWQpCitvdXRfb2ZfbWVtb3J5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCB3aGljaCkKKy8qIFJlcG9ydCBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIGFuZCBzdG9wIGV4ZWN1dGlvbiAqLworLyogSWYgd2UgY29tcGlsZWQgTUVNX1NUQVRTIHN1cHBvcnQsIHJlcG9ydCBhbGxvYyByZXF1ZXN0cyBiZWZvcmUgZHlpbmcgKi8KK3sKKyNpZmRlZiBNRU1fU1RBVFMKKyAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAyOwkvKiBmb3JjZSBzZWxmX2Rlc3RydWN0IHRvIHJlcG9ydCBzdGF0cyAqLworI2VuZGlmCisgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIHdoaWNoKTsKK30KKworCisvKgorICogQWxsb2NhdGlvbiBvZiAic21hbGwiIG9iamVjdHMuCisgKgorICogRm9yIHRoZXNlLCB3ZSB1c2UgcG9vbGVkIHN0b3JhZ2UuICBXaGVuIGEgbmV3IHBvb2wgbXVzdCBiZSBjcmVhdGVkLAorICogd2UgdHJ5IHRvIGdldCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgcGx1cyBhICJzbG9wIiBmYWN0b3IsCisgKiB3aGVyZSB0aGUgc2xvcCB3aWxsIGJlIHRoZSBhbW91bnQgb2YgbGVmdG92ZXIgc3BhY2UgaW4gdGhlIG5ldyBwb29sLgorICogVGhlIHNwZWVkIHZzLiBzcGFjZSB0cmFkZW9mZiBpcyBsYXJnZWx5IGRldGVybWluZWQgYnkgdGhlIHNsb3AgdmFsdWVzLgorICogQSBkaWZmZXJlbnQgc2xvcCB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgZWFjaCBwb29sIGNsYXNzIChsaWZldGltZSksCisgKiBhbmQgd2UgYWxzbyBkaXN0aW5ndWlzaCB0aGUgZmlyc3QgcG9vbCBvZiBhIGNsYXNzIGZyb20gbGF0ZXIgb25lcy4KKyAqIE5PVEU6IHRoZSB2YWx1ZXMgZ2l2ZW4gd29yayBmYWlybHkgd2VsbCBvbiBib3RoIDE2LSBhbmQgMzItYml0LWludAorICogbWFjaGluZXMsIGJ1dCBtYXkgYmUgdG9vIHNtYWxsIGlmIGxvbmdzIGFyZSA2NCBiaXRzIG9yIG1vcmUuCisgKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBmaXJzdF9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCit7CisJMTYwMCwJCQkvKiBmaXJzdCBQRVJNQU5FTlQgcG9vbCAqLworCTE2MDAwCQkJLyogZmlyc3QgSU1BR0UgcG9vbCAqLworfTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBleHRyYV9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCit7CisJMCwJCQkvKiBhZGRpdGlvbmFsIFBFUk1BTkVOVCBwb29scyAqLworCTUwMDAJCQkvKiBhZGRpdGlvbmFsIElNQUdFIHBvb2xzICovCit9OworCisjZGVmaW5lIE1JTl9TTE9QICA1MAkJLyogZ3JlYXRlciB0aGFuIDAgdG8gYXZvaWQgZnV0aWxlIGxvb3BpbmcgKi8KKworCitNRVRIT0RERUYodm9pZCAqKQorYWxsb2Nfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCisvKiBBbGxvY2F0ZSBhICJzbWFsbCIgb2JqZWN0ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIHNtYWxsX3Bvb2xfcHRyIGhkcl9wdHIsIHByZXZfaGRyX3B0cjsKKyAgY2hhciAqIGRhdGFfcHRyOworICBzaXplX3Qgb2RkX2J5dGVzLCBtaW5fcmVxdWVzdCwgc2xvcDsKKworICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLworICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0Yoc21hbGxfcG9vbF9oZHIpKSkKKyAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAxKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KKworICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KKyAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOworICBpZiAob2RkX2J5dGVzID4gMCkKKyAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOworCisgIC8qIFNlZSBpZiBzcGFjZSBpcyBhdmFpbGFibGUgaW4gYW55IGV4aXN0aW5nIHBvb2wgKi8KKyAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKyAgcHJldl9oZHJfcHRyID0gTlVMTDsKKyAgaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKKyAgd2hpbGUgKGhkcl9wdHIgIT0gTlVMTCkgeworICAgIGlmIChoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA+PSBzaXplb2ZvYmplY3QpCisgICAgICBicmVhazsJCQkvKiBmb3VuZCBwb29sIHdpdGggZW5vdWdoIHNwYWNlICovCisgICAgcHJldl9oZHJfcHRyID0gaGRyX3B0cjsKKyAgICBoZHJfcHRyID0gaGRyX3B0ci0+aGRyLm5leHQ7CisgIH0KKworICAvKiBUaW1lIHRvIG1ha2UgYSBuZXcgcG9vbD8gKi8KKyAgaWYgKGhkcl9wdHIgPT0gTlVMTCkgeworICAgIC8qIG1pbl9yZXF1ZXN0IGlzIHdoYXQgd2UgbmVlZCBub3csIHNsb3AgaXMgd2hhdCB3aWxsIGJlIGxlZnRvdmVyICovCisgICAgbWluX3JlcXVlc3QgPSBzaXplb2ZvYmplY3QgKyBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOworICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KKyAgICAgIHNsb3AgPSBmaXJzdF9wb29sX3Nsb3BbcG9vbF9pZF07CisgICAgZWxzZQorICAgICAgc2xvcCA9IGV4dHJhX3Bvb2xfc2xvcFtwb29sX2lkXTsKKyAgICAvKiBEb24ndCBhc2sgZm9yIG1vcmUgdGhhbiBNQVhfQUxMT0NfQ0hVTksgKi8KKyAgICBpZiAoc2xvcCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpKQorICAgICAgc2xvcCA9IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpOworICAgIC8qIFRyeSB0byBnZXQgc3BhY2UsIGlmIGZhaWwgcmVkdWNlIHNsb3AgYW5kIHRyeSBhZ2FpbiAqLworICAgIGZvciAoOzspIHsKKyAgICAgIGhkcl9wdHIgPSAoc21hbGxfcG9vbF9wdHIpIGpwZWdfZ2V0X3NtYWxsKGNpbmZvLCBtaW5fcmVxdWVzdCArIHNsb3ApOworICAgICAgaWYgKGhkcl9wdHIgIT0gTlVMTCkKKwlicmVhazsKKyAgICAgIHNsb3AgLz0gMjsKKyAgICAgIGlmIChzbG9wIDwgTUlOX1NMT1ApCS8qIGdpdmUgdXAgd2hlbiBpdCBnZXRzIHJlYWwgc21hbGwgKi8KKwlvdXRfb2ZfbWVtb3J5KGNpbmZvLCAyKTsgLyoganBlZ19nZXRfc21hbGwgZmFpbGVkICovCisgICAgfQorICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IG1pbl9yZXF1ZXN0ICsgc2xvcDsKKyAgICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBlbmQgb2YgbGlzdCAqLworICAgIGhkcl9wdHItPmhkci5uZXh0ID0gTlVMTDsKKyAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IDA7CisgICAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSBzaXplb2ZvYmplY3QgKyBzbG9wOworICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KKyAgICAgIG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXSA9IGhkcl9wdHI7CisgICAgZWxzZQorICAgICAgcHJldl9oZHJfcHRyLT5oZHIubmV4dCA9IGhkcl9wdHI7CisgIH0KKworICAvKiBPSywgYWxsb2NhdGUgdGhlIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IHBvb2wgKi8KKyAgZGF0YV9wdHIgPSAoY2hhciAqKSAoaGRyX3B0ciArIDEpOyAvKiBwb2ludCB0byBmaXJzdCBkYXRhIGJ5dGUgaW4gcG9vbCAqLworICBkYXRhX3B0ciArPSBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZDsgLyogcG9pbnQgdG8gcGxhY2UgZm9yIG9iamVjdCAqLworICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArPSBzaXplb2ZvYmplY3Q7CisgIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0IC09IHNpemVvZm9iamVjdDsKKworICByZXR1cm4gKHZvaWQgKikgZGF0YV9wdHI7Cit9CisKKworLyoKKyAqIEFsbG9jYXRpb24gb2YgImxhcmdlIiBvYmplY3RzLgorICoKKyAqIFRoZSBleHRlcm5hbCBzZW1hbnRpY3Mgb2YgdGhlc2UgYXJlIHRoZSBzYW1lIGFzICJzbWFsbCIgb2JqZWN0cywKKyAqIGV4Y2VwdCB0aGF0IEZBUiBwb2ludGVycyBhcmUgdXNlZCBvbiA4MHg4Ni4gIEhvd2V2ZXIgdGhlIHBvb2wKKyAqIG1hbmFnZW1lbnQgaGV1cmlzdGljcyBhcmUgcXVpdGUgZGlmZmVyZW50LiAgV2UgYXNzdW1lIHRoYXQgZWFjaAorICogcmVxdWVzdCBpcyBsYXJnZSBlbm91Z2ggdGhhdCBpdCBtYXkgYXMgd2VsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KKyAqIGpwZWdfZ2V0X2xhcmdlOyB0aGUgcG9vbCBtYW5hZ2VtZW50IGp1c3QgbGlua3MgZXZlcnl0aGluZyB0b2dldGhlcgorICogc28gdGhhdCB3ZSBjYW4gZnJlZSBpdCBhbGwgb24gZGVtYW5kLgorICogTm90ZTogdGhlIG1ham9yIHVzZSBvZiAibGFyZ2UiIG9iamVjdHMgaXMgaW4gSlNBTVBBUlJBWSBhbmQgSkJMT0NLQVJSQVkKKyAqIHN0cnVjdHVyZXMuICBUaGUgcm91dGluZXMgdGhhdCBjcmVhdGUgdGhlc2Ugc3RydWN0dXJlcyAoc2VlIGJlbG93KQorICogZGVsaWJlcmF0ZWx5IGJ1bmNoIHJvd3MgdG9nZXRoZXIgdG8gZW5zdXJlIGEgbGFyZ2UgcmVxdWVzdCBzaXplLgorICovCisKK01FVEhPRERFRih2b2lkIEZBUiAqKQorYWxsb2NfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCisvKiBBbGxvY2F0ZSBhICJsYXJnZSIgb2JqZWN0ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGxhcmdlX3Bvb2xfcHRyIGhkcl9wdHI7CisgIHNpemVfdCBvZGRfYnl0ZXM7CisKKyAgLyogQ2hlY2sgZm9yIHVuc2F0aXNmaWFibGUgcmVxdWVzdCAoZG8gbm93IHRvIGVuc3VyZSBubyBvdmVyZmxvdyBiZWxvdykgKi8KKyAgaWYgKHNpemVvZm9iamVjdCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkpCisgICAgb3V0X29mX21lbW9yeShjaW5mbywgMyk7CS8qIHJlcXVlc3QgZXhjZWVkcyBtYWxsb2MncyBhYmlsaXR5ICovCisKKyAgLyogUm91bmQgdXAgdGhlIHJlcXVlc3RlZCBzaXplIHRvIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpICovCisgIG9kZF9ieXRlcyA9IHNpemVvZm9iamVjdCAlIFNJWkVPRihBTElHTl9UWVBFKTsKKyAgaWYgKG9kZF9ieXRlcyA+IDApCisgICAgc2l6ZW9mb2JqZWN0ICs9IFNJWkVPRihBTElHTl9UWVBFKSAtIG9kZF9ieXRlczsKKworICAvKiBBbHdheXMgbWFrZSBhIG5ldyBwb29sICovCisgIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisKKyAgaGRyX3B0ciA9IChsYXJnZV9wb29sX3B0cikganBlZ19nZXRfbGFyZ2UoY2luZm8sIHNpemVvZm9iamVjdCArCisJCQkJCSAgICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpKTsKKyAgaWYgKGhkcl9wdHIgPT0gTlVMTCkKKyAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCA0KTsJLyoganBlZ19nZXRfbGFyZ2UgZmFpbGVkICovCisgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IHNpemVvZm9iamVjdCArIFNJWkVPRihsYXJnZV9wb29sX2hkcik7CisKKyAgLyogU3VjY2VzcywgaW5pdGlhbGl6ZSB0aGUgbmV3IHBvb2wgaGVhZGVyIGFuZCBhZGQgdG8gbGlzdCAqLworICBoZHJfcHRyLT5oZHIubmV4dCA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKKyAgLyogV2UgbWFpbnRhaW4gc3BhY2UgY291bnRzIGluIGVhY2ggcG9vbCBoZWFkZXIgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzLAorICAgKiBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QgbmVlZGVkIGZvciBhbGxvY2F0aW9uLgorICAgKi8KKyAgaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgPSBzaXplb2ZvYmplY3Q7CisgIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID0gMDsKKyAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKKworICByZXR1cm4gKHZvaWQgRkFSICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCit9CisKKworLyoKKyAqIENyZWF0aW9uIG9mIDItRCBzYW1wbGUgYXJyYXlzLgorICogVGhlIHBvaW50ZXJzIGFyZSBpbiBuZWFyIGhlYXAsIHRoZSBzYW1wbGVzIHRoZW1zZWx2ZXMgaW4gRkFSIGhlYXAuCisgKgorICogVG8gbWluaW1pemUgYWxsb2NhdGlvbiBvdmVyaGVhZCBhbmQgdG8gYWxsb3cgSS9PIG9mIGxhcmdlIGNvbnRpZ3VvdXMKKyAqIGJsb2Nrcywgd2UgYWxsb2NhdGUgdGhlIHNhbXBsZSByb3dzIGluIGdyb3VwcyBvZiBhcyBtYW55IHJvd3MgYXMgcG9zc2libGUKKyAqIHdpdGhvdXQgZXhjZWVkaW5nIE1BWF9BTExPQ19DSFVOSyB0b3RhbCBieXRlcyBwZXIgYWxsb2NhdGlvbiByZXF1ZXN0LgorICogTkI6IHRoZSB2aXJ0dWFsIGFycmF5IGNvbnRyb2wgcm91dGluZXMsIGxhdGVyIGluIHRoaXMgZmlsZSwga25vdyBhYm91dAorICogdGhpcyBjaHVua2luZyBvZiByb3dzLiAgVGhlIHJvd3NwZXJjaHVuayB2YWx1ZSBpcyBsZWZ0IGluIHRoZSBtZW0gbWFuYWdlcgorICogb2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIHNhdmVkIGF3YXkgaWYgdGhpcyBzYXJyYXkgaXMgdGhlIHdvcmtzcGFjZSBmb3IKKyAqIGEgdmlydHVhbCBhcnJheS4KKyAqLworCitNRVRIT0RERUYoSlNBTVBBUlJBWSkKK2FsbG9jX3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkgICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cykKKy8qIEFsbG9jYXRlIGEgMi1EIHNhbXBsZSBhcnJheSAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBKU0FNUEFSUkFZIHJlc3VsdDsKKyAgSlNBTVBST1cgd29ya3NwYWNlOworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOworICBsb25nIGx0ZW1wOworCisgIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KKyAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KKwkgICgobG9uZykgc2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKSk7CisgIGlmIChsdGVtcCA8PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOworICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKKyAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgIGVsc2UKKyAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOworICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOworCisgIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCisgIHJlc3VsdCA9IChKU0FNUEFSUkFZKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKKwkJCQkgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSlNBTVBST1cpKSk7CisKKyAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCisgIGN1cnJvdyA9IDA7CisgIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7CisgICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7CisgICAgd29ya3NwYWNlID0gKEpTQU1QUk9XKSBhbGxvY19sYXJnZShjaW5mbywgcG9vbF9pZCwKKwkoc2l6ZV90KSAoKHNpemVfdCkgcm93c3BlcmNodW5rICogKHNpemVfdCkgc2FtcGxlc3BlcnJvdworCQkgICogU0laRU9GKEpTQU1QTEUpKSk7CisgICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7CisgICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOworICAgICAgd29ya3NwYWNlICs9IHNhbXBsZXNwZXJyb3c7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQ3JlYXRpb24gb2YgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4KKyAqIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIGNvZGUgZm9yIHNhbXBsZSBhcnJheXMsIGFib3ZlLgorICovCisKK01FVEhPRERFRihKQkxPQ0tBUlJBWSkKK2FsbG9jX2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkgICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQorLyogQWxsb2NhdGUgYSAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgSkJMT0NLQVJSQVkgcmVzdWx0OworICBKQkxPQ0tST1cgd29ya3NwYWNlOworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOworICBsb25nIGx0ZW1wOworCisgIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KKyAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KKwkgICgobG9uZykgYmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSykpOworICBpZiAobHRlbXAgPD0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKyAgaWYgKGx0ZW1wIDwgKGxvbmcpIG51bXJvd3MpCisgICAgcm93c3BlcmNodW5rID0gKEpESU1FTlNJT04pIGx0ZW1wOworICBlbHNlCisgICAgcm93c3BlcmNodW5rID0gbnVtcm93czsKKyAgbWVtLT5sYXN0X3Jvd3NwZXJjaHVuayA9IHJvd3NwZXJjaHVuazsKKworICAvKiBHZXQgc3BhY2UgZm9yIHJvdyBwb2ludGVycyAoc21hbGwgb2JqZWN0KSAqLworICByZXN1bHQgPSAoSkJMT0NLQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAorCQkJCSAgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSkJMT0NLUk9XKSkpOworCisgIC8qIEdldCB0aGUgcm93cyB0aGVtc2VsdmVzIChsYXJnZSBvYmplY3RzKSAqLworICBjdXJyb3cgPSAwOworICB3aGlsZSAoY3Vycm93IDwgbnVtcm93cykgeworICAgIHJvd3NwZXJjaHVuayA9IE1JTihyb3dzcGVyY2h1bmssIG51bXJvd3MgLSBjdXJyb3cpOworICAgIHdvcmtzcGFjZSA9IChKQkxPQ0tST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAorCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBibG9ja3NwZXJyb3cKKwkJICAqIFNJWkVPRihKQkxPQ0spKSk7CisgICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7CisgICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOworICAgICAgd29ya3NwYWNlICs9IGJsb2Nrc3BlcnJvdzsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBBYm91dCB2aXJ0dWFsIGFycmF5IG1hbmFnZW1lbnQ6CisgKgorICogVGhlIGFib3ZlICJub3JtYWwiIGFycmF5IHJvdXRpbmVzIGFyZSBvbmx5IHVzZWQgdG8gYWxsb2NhdGUgc3RyaXAgYnVmZmVycworICogKGFzIHdpZGUgYXMgdGhlIGltYWdlLCBidXQganVzdCBhIGZldyByb3dzIGhpZ2gpLiAgRnVsbC1pbWFnZS1zaXplZCBidWZmZXJzCisgKiBhcmUgaGFuZGxlZCBhcyAidmlydHVhbCIgYXJyYXlzLiAgVGhlIGFycmF5IGlzIHN0aWxsIGFjY2Vzc2VkIGEgc3RyaXAgYXQgYQorICogdGltZSwgYnV0IHRoZSBtZW1vcnkgbWFuYWdlciBtdXN0IHNhdmUgdGhlIHdob2xlIGFycmF5IGZvciByZXBlYXRlZAorICogYWNjZXNzZXMuICBUaGUgaW50ZW5kZWQgaW1wbGVtZW50YXRpb24gaXMgdGhhdCB0aGVyZSBpcyBhIHN0cmlwIGJ1ZmZlciBpbgorICogbWVtb3J5IChhcyBoaWdoIGFzIGlzIHBvc3NpYmxlIGdpdmVuIHRoZSBkZXNpcmVkIG1lbW9yeSBsaW1pdCksIHBsdXMgYQorICogYmFja2luZyBmaWxlIHRoYXQgaG9sZHMgdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgorICoKKyAqIFRoZSByZXF1ZXN0X3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHRvbGQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGltYWdlIGFuZAorICogdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCB3aWxsIGJlIGFjY2Vzc2VkIGF0IG9uY2UuICBUaGUgaW4tbWVtb3J5CisgKiBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbWF4YWNjZXNzIHZhbHVlLgorICoKKyAqIFRoZSByZXF1ZXN0IHJvdXRpbmVzIGNyZWF0ZSBjb250cm9sIGJsb2NrcyBidXQgbm90IHRoZSBpbi1tZW1vcnkgYnVmZmVycy4KKyAqIFRoYXQgaXMgcG9zdHBvbmVkIHVudGlsIHJlYWxpemVfdmlydF9hcnJheXMgaXMgY2FsbGVkLiAgQXQgdGhhdCB0aW1lIHRoZQorICogdG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBpcyBrbm93biAoYXBwcm94aW1hdGVseSwgYW55d2F5KSwgc28gZnJlZQorICogbWVtb3J5IGNhbiBiZSBkaXZpZGVkIHVwIGZhaXJseS4KKyAqCisgKiBUaGUgYWNjZXNzX3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBzcGVjaWZpYyBzdHJpcAorICogYXJlYSBhY2Nlc3NpYmxlIChhZnRlciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGJhY2tpbmcgZmlsZSwgaWYgbmVjZXNzYXJ5KS4KKyAqIE5vdGUgdGhhdCB0aGUgYWNjZXNzIHJvdXRpbmVzIGFyZSB0b2xkIHdoZXRoZXIgdGhlIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeQorICogdGhlIGFjY2Vzc2VkIHN0cmlwOyBkdXJpbmcgYSByZWFkLW9ubHkgcGFzcyB0aGlzIHNhdmVzIGhhdmluZyB0byByZXdyaXRlCisgKiBkYXRhIHRvIGRpc2suICBUaGUgYWNjZXNzIHJvdXRpbmVzIGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBwcmUtemVyb2luZworICogYW55IG5ld2x5IGFjY2Vzc2VkIHJvd3MsIGlmIHByZS16ZXJvaW5nIHdhcyByZXF1ZXN0ZWQuCisgKgorICogSW4gY3VycmVudCB1c2FnZSwgdGhlIGFjY2VzcyByZXF1ZXN0cyBhcmUgdXN1YWxseSBmb3Igbm9ub3ZlcmxhcHBpbmcKKyAqIHN0cmlwczsgdGhhdCBpcywgc3VjY2Vzc2l2ZSBhY2Nlc3Mgc3RhcnRfcm93IG51bWJlcnMgZGlmZmVyIGJ5IGV4YWN0bHkKKyAqIG51bV9yb3dzID0gbWF4YWNjZXNzLiAgVGhpcyBtZWFucyB3ZSBjYW4gZ2V0IGdvb2QgcGVyZm9ybWFuY2Ugd2l0aCBzaW1wbGUKKyAqIGJ1ZmZlciBkdW1wL3JlbG9hZCBsb2dpYywgYnkgbWFraW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVyIGJlIGEgbXVsdGlwbGUKKyAqIG9mIHRoZSBhY2Nlc3MgaGVpZ2h0OyB0aGVuIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYWNjZXNzZXMgYWNyb3NzIGJ1ZmZlcmxvYWQKKyAqIGJvdW5kYXJpZXMuICBUaGUgY29kZSB3aWxsIHN0aWxsIHdvcmsgd2l0aCBvdmVybGFwcGluZyBhY2Nlc3MgcmVxdWVzdHMsCisgKiBidXQgaXQgZG9lc24ndCBoYW5kbGUgYnVmZmVybG9hZCBvdmVybGFwcyB2ZXJ5IGVmZmljaWVudGx5LgorICovCisKKworTUVUSE9EREVGKGp2aXJ0X3NhcnJheV9wdHIpCityZXF1ZXN0X3ZpcnRfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAorCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQorLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIHNhbXBsZSBhcnJheSAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBqdmlydF9zYXJyYXlfcHRyIHJlc3VsdDsKKworICAvKiBPbmx5IElNQUdFLWxpZmV0aW1lIHZpcnR1YWwgYXJyYXlzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkICovCisgIGlmIChwb29sX2lkICE9IEpQT09MX0lNQUdFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisKKyAgLyogZ2V0IGNvbnRyb2wgYmxvY2sgKi8KKyAgcmVzdWx0ID0gKGp2aXJ0X3NhcnJheV9wdHIpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAorCQkJCQkgIFNJWkVPRihzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wpKTsKKworICByZXN1bHQtPm1lbV9idWZmZXIgPSBOVUxMOwkvKiBtYXJrcyBhcnJheSBub3QgeWV0IHJlYWxpemVkICovCisgIHJlc3VsdC0+cm93c19pbl9hcnJheSA9IG51bXJvd3M7CisgIHJlc3VsdC0+c2FtcGxlc3BlcnJvdyA9IHNhbXBsZXNwZXJyb3c7CisgIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOworICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87CisgIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLworICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCisgIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IHJlc3VsdDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK01FVEhPRERFRihqdmlydF9iYXJyYXlfcHRyKQorcmVxdWVzdF92aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgYm9vbGVhbiBwcmVfemVybywKKwkJICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQorLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGp2aXJ0X2JhcnJheV9wdHIgcmVzdWx0OworCisgIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKyAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworICAvKiBnZXQgY29udHJvbCBibG9jayAqLworICByZXN1bHQgPSAoanZpcnRfYmFycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCisJCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCkpOworCisgIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KKyAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKKyAgcmVzdWx0LT5ibG9ja3NwZXJyb3cgPSBibG9ja3NwZXJyb3c7CisgIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOworICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87CisgIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLworICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCisgIG1lbS0+dmlydF9iYXJyYXlfbGlzdCA9IHJlc3VsdDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK01FVEhPRERFRih2b2lkKQorcmVhbGl6ZV92aXJ0X2FycmF5cyAoal9jb21tb25fcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgdGhlIGluLW1lbW9yeSBidWZmZXJzIGZvciBhbnkgdW5yZWFsaXplZCB2aXJ0dWFsIGFycmF5cyAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBsb25nIHNwYWNlX3Blcl9taW5oZWlnaHQsIG1heGltdW1fc3BhY2UsIGF2YWlsX21lbTsKKyAgbG9uZyBtaW5oZWlnaHRzLCBtYXhfbWluaGVpZ2h0czsKKyAganZpcnRfc2FycmF5X3B0ciBzcHRyOworICBqdmlydF9iYXJyYXlfcHRyIGJwdHI7CisKKyAgLyogQ29tcHV0ZSB0aGUgbWluaW11bSBzcGFjZSBuZWVkZWQgKG1heGFjY2VzcyByb3dzIGluIGVhY2ggYnVmZmVyKQorICAgKiBhbmQgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIChmdWxsIGltYWdlIGhlaWdodCBpbiBlYWNoIGJ1ZmZlcikuCisgICAqIFRoZXNlIG1heSBiZSBvZiB1c2UgdG8gdGhlIHN5c3RlbS1kZXBlbmRlbnQganBlZ19tZW1fYXZhaWxhYmxlIHJvdXRpbmUuCisgICAqLworICBzcGFjZV9wZXJfbWluaGVpZ2h0ID0gMDsKKyAgbWF4aW11bV9zcGFjZSA9IDA7CisgIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgeworICAgIGlmIChzcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLworICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgc3B0ci0+bWF4YWNjZXNzICoKKwkJCSAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7CisgICAgICBtYXhpbXVtX3NwYWNlICs9IChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5ICoKKwkJICAgICAgIChsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOworICAgIH0KKyAgfQorICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKKyAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KKyAgICAgIHNwYWNlX3Blcl9taW5oZWlnaHQgKz0gKGxvbmcpIGJwdHItPm1heGFjY2VzcyAqCisJCQkgICAgIChsb25nKSBicHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKKyAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgKgorCQkgICAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOworICAgIH0KKyAgfQorCisgIGlmIChzcGFjZV9wZXJfbWluaGVpZ2h0IDw9IDApCisgICAgcmV0dXJuOwkJCS8qIG5vIHVucmVhbGl6ZWQgYXJyYXlzLCBubyB3b3JrICovCisKKyAgLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBtZW1vcnkgdG8gYWN0dWFsbHkgdXNlOyB0aGlzIGlzIHN5c3RlbS1kZXBlbmRlbnQuICovCisgIGF2YWlsX21lbSA9IGpwZWdfbWVtX2F2YWlsYWJsZShjaW5mbywgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwKKwkJCQkgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOworCisgIC8qIElmIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCBpcyBhdmFpbGFibGUsIG1ha2UgYWxsIHRoZSBidWZmZXJzIGZ1bGwKKyAgICogaGVpZ2h0OyBvdGhlcndpc2UgcGFyY2VsIGl0IG91dCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBtaW5oZWlnaHRzCisgICAqIGluIGVhY2ggYnVmZmVyLgorICAgKi8KKyAgaWYgKGF2YWlsX21lbSA+PSBtYXhpbXVtX3NwYWNlKQorICAgIG1heF9taW5oZWlnaHRzID0gMTAwMDAwMDAwMEw7CisgIGVsc2UgeworICAgIG1heF9taW5oZWlnaHRzID0gYXZhaWxfbWVtIC8gc3BhY2VfcGVyX21pbmhlaWdodDsKKyAgICAvKiBJZiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgZW5vdWdoIHNwYWNlLCB0cnkgdG8gZ2V0IHRoZSBtaW5pbXVtCisgICAgICogYW55d2F5LiAgVGhpcyBhbGxvd3MgYSAic3R1YiIgaW1wbGVtZW50YXRpb24gb2YganBlZ19tZW1fYXZhaWxhYmxlKCkuCisgICAgICovCisgICAgaWYgKG1heF9taW5oZWlnaHRzIDw9IDApCisgICAgICBtYXhfbWluaGVpZ2h0cyA9IDE7CisgIH0KKworICAvKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgYW5kIGluaXRpYWxpemUgYmFja2luZyBzdG9yZSBhcyBuZWVkZWQuICovCisKKyAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7CisgICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCisgICAgICBtaW5oZWlnaHRzID0gKChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5IC0gMUwpIC8gc3B0ci0+bWF4YWNjZXNzICsgMUw7CisgICAgICBpZiAobWluaGVpZ2h0cyA8PSBtYXhfbWluaGVpZ2h0cykgeworCS8qIFRoaXMgYnVmZmVyIGZpdHMgaW4gbWVtb3J5ICovCisJc3B0ci0+cm93c19pbl9tZW0gPSBzcHRyLT5yb3dzX2luX2FycmF5OworICAgICAgfSBlbHNlIHsKKwkvKiBJdCBkb2Vzbid0IGZpdCBpbiBtZW1vcnksIGNyZWF0ZSBiYWNraW5nIHN0b3JlLiAqLworCXNwdHItPnJvd3NfaW5fbWVtID0gKEpESU1FTlNJT04pIChtYXhfbWluaGVpZ2h0cyAqIHNwdHItPm1heGFjY2Vzcyk7CisJanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUoY2luZm8sICYgc3B0ci0+Yl9zX2luZm8sCisJCQkJKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgorCQkJCShsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICoKKwkJCQkobG9uZykgU0laRU9GKEpTQU1QTEUpKTsKKwlzcHRyLT5iX3Nfb3BlbiA9IFRSVUU7CisgICAgICB9CisgICAgICBzcHRyLT5tZW1fYnVmZmVyID0gYWxsb2Nfc2FycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBzcHRyLT5zYW1wbGVzcGVycm93LCBzcHRyLT5yb3dzX2luX21lbSk7CisgICAgICBzcHRyLT5yb3dzcGVyY2h1bmsgPSBtZW0tPmxhc3Rfcm93c3BlcmNodW5rOworICAgICAgc3B0ci0+Y3VyX3N0YXJ0X3JvdyA9IDA7CisgICAgICBzcHRyLT5maXJzdF91bmRlZl9yb3cgPSAwOworICAgICAgc3B0ci0+ZGlydHkgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKKyAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KKyAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBicHRyLT5tYXhhY2Nlc3MgKyAxTDsKKyAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7CisJLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KKwlicHRyLT5yb3dzX2luX21lbSA9IGJwdHItPnJvd3NfaW5fYXJyYXk7CisgICAgICB9IGVsc2UgeworCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCisJYnB0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogYnB0ci0+bWF4YWNjZXNzKTsKKwlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBicHRyLT5iX3NfaW5mbywKKwkJCQkobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCisJCQkJKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqCisJCQkJKGxvbmcpIFNJWkVPRihKQkxPQ0spKTsKKwlicHRyLT5iX3Nfb3BlbiA9IFRSVUU7CisgICAgICB9CisgICAgICBicHRyLT5tZW1fYnVmZmVyID0gYWxsb2NfYmFycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBicHRyLT5ibG9ja3NwZXJyb3csIGJwdHItPnJvd3NfaW5fbWVtKTsKKyAgICAgIGJwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7CisgICAgICBicHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKKyAgICAgIGJwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7CisgICAgICBicHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19zYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKKy8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5ICovCit7CisgIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOworCisgIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKKyAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKKyAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCisgIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgeworICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCisgICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCisgICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOworICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCisgICAgICBicmVhazsKKyAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OworICAgIGlmICh3cml0aW5nKQorICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAorCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKKyAgICBlbHNlCisgICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKKwkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOworICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fYmFycmF5X2lvIChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLCBib29sZWFuIHdyaXRpbmcpCisvKiBEbyBiYWNraW5nIHN0b3JlIHJlYWQgb3Igd3JpdGUgb2YgYSB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCit7CisgIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOworCisgIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7CisgIGZpbGVfb2Zmc2V0ID0gcHRyLT5jdXJfc3RhcnRfcm93ICogYnl0ZXNwZXJyb3c7CisgIC8qIExvb3AgdG8gcmVhZCBvciB3cml0ZSBlYWNoIGFsbG9jYXRpb24gY2h1bmsgaW4gbWVtX2J1ZmZlciAqLworICBmb3IgKGkgPSAwOyBpIDwgKGxvbmcpIHB0ci0+cm93c19pbl9tZW07IGkgKz0gcHRyLT5yb3dzcGVyY2h1bmspIHsKKyAgICAvKiBPbmUgY2h1bmssIGJ1dCBjaGVjayBmb3Igc2hvcnQgY2h1bmsgYXQgZW5kIG9mIGJ1ZmZlciAqLworICAgIHJvd3MgPSBNSU4oKGxvbmcpIHB0ci0+cm93c3BlcmNodW5rLCAobG9uZykgcHRyLT5yb3dzX2luX21lbSAtIGkpOworICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBpcyBjdXJyZW50bHkgZGVmaW5lZCAqLworICAgIHRoaXNyb3cgPSAobG9uZykgcHRyLT5jdXJfc3RhcnRfcm93ICsgaTsKKyAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPmZpcnN0X3VuZGVmX3JvdyAtIHRoaXNyb3cpOworICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBmaXRzIGluIGZpbGUgKi8KKyAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPnJvd3NfaW5fYXJyYXkgLSB0aGlzcm93KTsKKyAgICBpZiAocm93cyA8PSAwKQkJLyogdGhpcyBjaHVuayBtaWdodCBiZSBwYXN0IGVuZCBvZiBmaWxlISAqLworICAgICAgYnJlYWs7CisgICAgYnl0ZV9jb3VudCA9IHJvd3MgKiBieXRlc3BlcnJvdzsKKyAgICBpZiAod3JpdGluZykKKyAgICAgICgqcHRyLT5iX3NfaW5mby53cml0ZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKKwkJCQkJICAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCisJCQkJCSAgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7CisgICAgZWxzZQorICAgICAgKCpwdHItPmJfc19pbmZvLnJlYWRfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCisJCQkJCSAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCisJCQkJCSAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKKyAgICBmaWxlX29mZnNldCArPSBieXRlX2NvdW50OworICB9Cit9CisKKworTUVUSE9EREVGKEpTQU1QQVJSQVkpCithY2Nlc3NfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsCisJCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBudW1fcm93cywKKwkJICAgIGJvb2xlYW4gd3JpdGFibGUpCisvKiBBY2Nlc3MgdGhlIHBhcnQgb2YgYSB2aXJ0dWFsIHNhbXBsZSBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KKy8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLworLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLworeworICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKKyAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7CisKKyAgLyogZGVidWdnaW5nIGNoZWNrICovCisgIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKKyAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKworICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLworICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8CisgICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKKyAgICBpZiAoISBwdHItPmJfc19vcGVuKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7CisgICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAocHRyLT5kaXJ0eSkgeworICAgICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOworICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgorICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKKyAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKKyAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCisgICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQorICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7CisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCisgICAgICBsb25nIGx0ZW1wOworCisgICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07CisgICAgICBpZiAobHRlbXAgPCAwKQorCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgICAgfQorICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgorICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCisgICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgorICAgICAqLworICAgIGRvX3NhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7CisgIH0KKyAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KKyAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKKyAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgorICAgKi8KKyAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgeworICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgeworICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisgICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCisgICAgfSBlbHNlIHsKKyAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OworICAgIH0KKyAgICBpZiAod3JpdGFibGUpCisgICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7CisgICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKKyAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKKyAgICAgIHVuZGVmX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7IC8qIG1ha2UgaW5kZXhlcyByZWxhdGl2ZSB0byBidWZmZXIgKi8KKyAgICAgIGVuZF9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OworICAgICAgd2hpbGUgKHVuZGVmX3JvdyA8IGVuZF9yb3cpIHsKKwlqemVyb19mYXIoKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlclt1bmRlZl9yb3ddLCBieXRlc3BlcnJvdyk7CisJdW5kZWZfcm93Kys7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghIHdyaXRhYmxlKQkJLyogcmVhZGVyIGxvb2tpbmcgYXQgdW5kZWZpbmVkIGRhdGEgKi8KKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisgICAgfQorICB9CisgIC8qIEZsYWcgdGhlIGJ1ZmZlciBkaXJ0eSBpZiBjYWxsZXIgd2lsbCB3cml0ZSBpbiBpdCAqLworICBpZiAod3JpdGFibGUpCisgICAgcHRyLT5kaXJ0eSA9IFRSVUU7CisgIC8qIFJldHVybiBhZGRyZXNzIG9mIHByb3BlciBwYXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgcmV0dXJuIHB0ci0+bWVtX2J1ZmZlciArIChzdGFydF9yb3cgLSBwdHItPmN1cl9zdGFydF9yb3cpOworfQorCisKK01FVEhPRERFRihKQkxPQ0tBUlJBWSkKK2FjY2Vzc192aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyIHB0ciwKKwkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAorCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKKy8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgc3RhcnRpbmcgYXQgc3RhcnRfcm93ICovCisvKiBhbmQgZXh0ZW5kaW5nIGZvciBudW1fcm93cyByb3dzLiAgd3JpdGFibGUgaXMgdHJ1ZSBpZiAgKi8KKy8qIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeSB0aGUgYWNjZXNzZWQgYXJlYS4gKi8KK3sKKyAgSkRJTUVOU0lPTiBlbmRfcm93ID0gc3RhcnRfcm93ICsgbnVtX3Jvd3M7CisgIEpESU1FTlNJT04gdW5kZWZfcm93OworCisgIC8qIGRlYnVnZ2luZyBjaGVjayAqLworICBpZiAoZW5kX3JvdyA+IHB0ci0+cm93c19pbl9hcnJheSB8fCBudW1fcm93cyA+IHB0ci0+bWF4YWNjZXNzIHx8CisgICAgICBwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisKKyAgLyogTWFrZSB0aGUgZGVzaXJlZCBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGFycmF5IGFjY2Vzc2libGUgKi8KKyAgaWYgKHN0YXJ0X3JvdyA8IHB0ci0+Y3VyX3N0YXJ0X3JvdyB8fAorICAgICAgZW5kX3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdytwdHItPnJvd3NfaW5fbWVtKSB7CisgICAgaWYgKCEgcHRyLT5iX3Nfb3BlbikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVklSVFVBTF9CVUcpOworICAgIC8qIEZsdXNoIG9sZCBidWZmZXIgY29udGVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHB0ci0+ZGlydHkpIHsKKyAgICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBUUlVFKTsKKyAgICAgIHB0ci0+ZGlydHkgPSBGQUxTRTsKKyAgICB9CisgICAgLyogRGVjaWRlIHdoYXQgcGFydCBvZiB2aXJ0dWFsIGFycmF5IHRvIGFjY2Vzcy4KKyAgICAgKiBBbGdvcml0aG06IGlmIHRhcmdldCBhZGRyZXNzID4gY3VycmVudCB3aW5kb3csIGFzc3VtZSBmb3J3YXJkIHNjYW4sCisgICAgICogbG9hZCBzdGFydGluZyBhdCB0YXJnZXQgYWRkcmVzcy4gIElmIHRhcmdldCBhZGRyZXNzIDwgY3VycmVudCB3aW5kb3csCisgICAgICogYXNzdW1lIGJhY2t3YXJkIHNjYW4sIGxvYWQgc28gdGhhdCB0YXJnZXQgYXJlYSBpcyB0b3Agb2Ygd2luZG93LgorICAgICAqIE5vdGUgdGhhdCB3aGVuIHN3aXRjaGluZyBmcm9tIGZvcndhcmQgd3JpdGUgdG8gZm9yd2FyZCByZWFkLCB3aWxsIGhhdmUKKyAgICAgKiBzdGFydF9yb3cgPSAwLCBzbyB0aGUgbGltaXRpbmcgY2FzZSBhcHBsaWVzIGFuZCB3ZSBsb2FkIGZyb20gMCBhbnl3YXkuCisgICAgICovCisgICAgaWYgKHN0YXJ0X3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdykgeworICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gc3RhcnRfcm93OworICAgIH0gZWxzZSB7CisgICAgICAvKiB1c2UgbG9uZyBhcml0aG1ldGljIGhlcmUgdG8gYXZvaWQgb3ZlcmZsb3cgJiB1bnNpZ25lZCBwcm9ibGVtcyAqLworICAgICAgbG9uZyBsdGVtcDsKKworICAgICAgbHRlbXAgPSAobG9uZykgZW5kX3JvdyAtIChsb25nKSBwdHItPnJvd3NfaW5fbWVtOworICAgICAgaWYgKGx0ZW1wIDwgMCkKKwlsdGVtcCA9IDA7CQkvKiBkb24ndCBmYWxsIG9mZiBmcm9udCBlbmQgb2YgZmlsZSAqLworICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gKEpESU1FTlNJT04pIGx0ZW1wOworICAgIH0KKyAgICAvKiBSZWFkIGluIHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBhcnJheS4KKyAgICAgKiBEdXJpbmcgdGhlIGluaXRpYWwgd3JpdGUgcGFzcywgd2Ugd2lsbCBkbyBubyBhY3R1YWwgcmVhZAorICAgICAqIGJlY2F1c2UgdGhlIHNlbGVjdGVkIHBhcnQgaXMgYWxsIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBkb19iYXJyYXlfaW8oY2luZm8sIHB0ciwgRkFMU0UpOworICB9CisgIC8qIEVuc3VyZSB0aGUgYWNjZXNzZWQgcGFydCBvZiB0aGUgYXJyYXkgaXMgZGVmaW5lZDsgcHJlemVybyBpZiBuZWVkZWQuCisgICAqIFRvIGltcHJvdmUgbG9jYWxpdHkgb2YgYWNjZXNzLCB3ZSBvbmx5IHByZXplcm8gdGhlIHBhcnQgb2YgdGhlIGFycmF5CisgICAqIHRoYXQgdGhlIGNhbGxlciBpcyBhYm91dCB0byBhY2Nlc3MsIG5vdCB0aGUgZW50aXJlIGluLW1lbW9yeSBhcnJheS4KKyAgICovCisgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IGVuZF9yb3cpIHsKKyAgICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBzdGFydF9yb3cpIHsKKyAgICAgIGlmICh3cml0YWJsZSkJCS8qIHdyaXRlciBza2lwcGVkIG92ZXIgYSBzZWN0aW9uIG9mIGFycmF5ICovCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworICAgICAgdW5kZWZfcm93ID0gc3RhcnRfcm93OwkvKiBidXQgcmVhZGVyIGlzIGFsbG93ZWQgdG8gcmVhZCBhaGVhZCAqLworICAgIH0gZWxzZSB7CisgICAgICB1bmRlZl9yb3cgPSBwdHItPmZpcnN0X3VuZGVmX3JvdzsKKyAgICB9CisgICAgaWYgKHdyaXRhYmxlKQorICAgICAgcHRyLT5maXJzdF91bmRlZl9yb3cgPSBlbmRfcm93OworICAgIGlmIChwdHItPnByZV96ZXJvKSB7CisgICAgICBzaXplX3QgYnl0ZXNwZXJyb3cgPSAoc2l6ZV90KSBwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOworICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLworICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7CisgICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgeworCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKKwl1bmRlZl9yb3crKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLworCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKyAgICB9CisgIH0KKyAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCisgIGlmICh3cml0YWJsZSkKKyAgICBwdHItPmRpcnR5ID0gVFJVRTsKKyAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLworICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIHBvb2wuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmcmVlX3Bvb2wgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOworICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKKyAgc2l6ZV90IHNwYWNlX2ZyZWVkOworCisgIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisKKyNpZmRlZiBNRU1fU1RBVFMKKyAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID4gMSkKKyAgICBwcmludF9tZW1fc3RhdHMoY2luZm8sIHBvb2xfaWQpOyAvKiBwcmludCBwb29sJ3MgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorCisgIC8qIElmIGZyZWVpbmcgSU1BR0UgcG9vbCwgY2xvc2UgYW55IHZpcnR1YWwgYXJyYXlzIGZpcnN0ICovCisgIGlmIChwb29sX2lkID09IEpQT09MX0lNQUdFKSB7CisgICAganZpcnRfc2FycmF5X3B0ciBzcHRyOworICAgIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKKworICAgIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgeworICAgICAgaWYgKHNwdHItPmJfc19vcGVuKSB7CS8qIHRoZXJlIG1heSBiZSBubyBiYWNraW5nIHN0b3JlICovCisJc3B0ci0+Yl9zX29wZW4gPSBGQUxTRTsJLyogcHJldmVudCByZWN1cnNpdmUgY2xvc2UgaWYgZXJyb3IgKi8KKwkoKnNwdHItPmJfc19pbmZvLmNsb3NlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBzcHRyLT5iX3NfaW5mbyk7CisgICAgICB9CisgICAgfQorICAgIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IE5VTEw7CisgICAgZm9yIChicHRyID0gbWVtLT52aXJ0X2JhcnJheV9saXN0OyBicHRyICE9IE5VTEw7IGJwdHIgPSBicHRyLT5uZXh0KSB7CisgICAgICBpZiAoYnB0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KKwlicHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLworCSgqYnB0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvKTsKKyAgICAgIH0KKyAgICB9CisgICAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKKyAgfQorCisgIC8qIFJlbGVhc2UgbGFyZ2Ugb2JqZWN0cyAqLworICBsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKKyAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gTlVMTDsKKworICB3aGlsZSAobGhkcl9wdHIgIT0gTlVMTCkgeworICAgIGxhcmdlX3Bvb2xfcHRyIG5leHRfbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQ7CisgICAgc3BhY2VfZnJlZWQgPSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKworCQkgIGxoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCisJCSAgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKKyAgICBqcGVnX2ZyZWVfbGFyZ2UoY2luZm8sICh2b2lkIEZBUiAqKSBsaGRyX3B0ciwgc3BhY2VfZnJlZWQpOworICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkIC09IHNwYWNlX2ZyZWVkOworICAgIGxoZHJfcHRyID0gbmV4dF9saGRyX3B0cjsKKyAgfQorCisgIC8qIFJlbGVhc2Ugc21hbGwgb2JqZWN0cyAqLworICBzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKKyAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gTlVMTDsKKworICB3aGlsZSAoc2hkcl9wdHIgIT0gTlVMTCkgeworICAgIHNtYWxsX3Bvb2xfcHRyIG5leHRfc2hkcl9wdHIgPSBzaGRyX3B0ci0+aGRyLm5leHQ7CisgICAgc3BhY2VfZnJlZWQgPSBzaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKworCQkgIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCisJCSAgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKTsKKyAgICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIHNoZHJfcHRyLCBzcGFjZV9mcmVlZCk7CisgICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7CisgICAgc2hkcl9wdHIgPSBuZXh0X3NoZHJfcHRyOworICB9Cit9CisKKworLyoKKyAqIENsb3NlIHVwIHNob3AgZW50aXJlbHkuCisgKiBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgY2FsbGVkIHVubGVzcyBjaW5mby0+bWVtIGlzIG5vbi1OVUxMLgorICovCisKK01FVEhPRERFRih2b2lkKQorc2VsZl9kZXN0cnVjdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBpbnQgcG9vbDsKKworICAvKiBDbG9zZSBhbGwgYmFja2luZyBzdG9yZSwgcmVsZWFzZSBhbGwgbWVtb3J5LgorICAgKiBSZWxlYXNpbmcgcG9vbHMgaW4gcmV2ZXJzZSBvcmRlciBtaWdodCBoZWxwIGF2b2lkIGZyYWdtZW50YXRpb24KKyAgICogd2l0aCBzb21lIChicmFpbi1kYW1hZ2VkKSBtYWxsb2MgbGlicmFyaWVzLgorICAgKi8KKyAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgeworICAgIGZyZWVfcG9vbChjaW5mbywgcG9vbCk7CisgIH0KKworICAvKiBSZWxlYXNlIHRoZSBtZW1vcnkgbWFuYWdlciBjb250cm9sIGJsb2NrIHRvby4gKi8KKyAganBlZ19mcmVlX3NtYWxsKGNpbmZvLCAodm9pZCAqKSBjaW5mby0+bWVtLCBTSVpFT0YobXlfbWVtb3J5X21ncikpOworICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGVuc3VyZXMgSSB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UgKi8KKworICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJCS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLworfQorCisKKy8qCisgKiBNZW1vcnkgbWFuYWdlciBpbml0aWFsaXphdGlvbi4KKyAqIFdoZW4gdGhpcyBpcyBjYWxsZWQsIG9ubHkgdGhlIGVycm9yIG1hbmFnZXIgcG9pbnRlciBpcyB2YWxpZCBpbiBjaW5mbyEKKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21lbW9yeV9tZ3IgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgbXlfbWVtX3B0ciBtZW07CisgIGxvbmcgbWF4X3RvX3VzZTsKKyAgaW50IHBvb2w7CisgIHNpemVfdCB0ZXN0X21hYzsKKworICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGZvciBzYWZldHkgaWYgaW5pdCBmYWlscyAqLworCisgIC8qIENoZWNrIGZvciBjb25maWd1cmF0aW9uIGVycm9ycy4KKyAgICogU0laRU9GKEFMSUdOX1RZUEUpIHNob3VsZCBiZSBhIHBvd2VyIG9mIDI7IG90aGVyd2lzZSwgaXQgcHJvYmFibHkKKyAgICogZG9lc24ndCByZWZsZWN0IGFueSByZWFsIGhhcmR3YXJlIGFsaWdubWVudCByZXF1aXJlbWVudC4KKyAgICogVGhlIHRlc3QgaXMgYSBsaXR0bGUgdHJpY2t5OiBmb3IgWD4wLCBYIGFuZCBYLTEgaGF2ZSBubyBvbmUtYml0cworICAgKiBpbiBjb21tb24gaWYgYW5kIG9ubHkgaWYgWCBpcyBhIHBvd2VyIG9mIDIsIGllIGhhcyBvbmx5IG9uZSBvbmUtYml0LgorICAgKiBTb21lIGNvbXBpbGVycyBtYXkgZ2l2ZSBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBoZXJlOyBpZ25vcmUgaXQuCisgICAqLworICBpZiAoKFNJWkVPRihBTElHTl9UWVBFKSAmIChTSVpFT0YoQUxJR05fVFlQRSktMSkpICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxJR05fVFlQRSk7CisgIC8qIE1BWF9BTExPQ19DSFVOSyBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZSBzaXplX3QsIGFuZCBtdXN0IGJlCisgICAqIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpLgorICAgKiBBZ2FpbiwgYW4gInVucmVhY2hhYmxlIGNvZGUiIHdhcm5pbmcgbWF5IGJlIGlnbm9yZWQgaGVyZS4KKyAgICogQnV0IGEgImNvbnN0YW50IHRvbyBsYXJnZSIgd2FybmluZyBtZWFucyB5b3UgbmVlZCB0byBmaXggTUFYX0FMTE9DX0NIVU5LLgorICAgKi8KKyAgdGVzdF9tYWMgPSAoc2l6ZV90KSBNQVhfQUxMT0NfQ0hVTks7CisgIGlmICgobG9uZykgdGVzdF9tYWMgIT0gTUFYX0FMTE9DX0NIVU5LIHx8CisgICAgICAoTUFYX0FMTE9DX0NIVU5LICUgU0laRU9GKEFMSUdOX1RZUEUpKSAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0FMTE9DX0NIVU5LKTsKKworICBtYXhfdG9fdXNlID0ganBlZ19tZW1faW5pdChjaW5mbyk7IC8qIHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gKi8KKworICAvKiBBdHRlbXB0IHRvIGFsbG9jYXRlIG1lbW9yeSBtYW5hZ2VyJ3MgY29udHJvbCBibG9jayAqLworICBtZW0gPSAobXlfbWVtX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7CisKKyAgaWYgKG1lbSA9PSBOVUxMKSB7CisgICAganBlZ19tZW1fdGVybShjaW5mbyk7CS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIDApOworICB9CisKKyAgLyogT0ssIGZpbGwgaW4gdGhlIG1ldGhvZCBwb2ludGVycyAqLworICBtZW0tPnB1Yi5hbGxvY19zbWFsbCA9IGFsbG9jX3NtYWxsOworICBtZW0tPnB1Yi5hbGxvY19sYXJnZSA9IGFsbG9jX2xhcmdlOworICBtZW0tPnB1Yi5hbGxvY19zYXJyYXkgPSBhbGxvY19zYXJyYXk7CisgIG1lbS0+cHViLmFsbG9jX2JhcnJheSA9IGFsbG9jX2JhcnJheTsKKyAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X3NhcnJheSA9IHJlcXVlc3RfdmlydF9zYXJyYXk7CisgIG1lbS0+cHViLnJlcXVlc3RfdmlydF9iYXJyYXkgPSByZXF1ZXN0X3ZpcnRfYmFycmF5OworICBtZW0tPnB1Yi5yZWFsaXplX3ZpcnRfYXJyYXlzID0gcmVhbGl6ZV92aXJ0X2FycmF5czsKKyAgbWVtLT5wdWIuYWNjZXNzX3ZpcnRfc2FycmF5ID0gYWNjZXNzX3ZpcnRfc2FycmF5OworICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9iYXJyYXkgPSBhY2Nlc3NfdmlydF9iYXJyYXk7CisgIG1lbS0+cHViLmZyZWVfcG9vbCA9IGZyZWVfcG9vbDsKKyAgbWVtLT5wdWIuc2VsZl9kZXN0cnVjdCA9IHNlbGZfZGVzdHJ1Y3Q7CisKKyAgLyogTWFrZSBNQVhfQUxMT0NfQ0hVTksgYWNjZXNzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCisgIG1lbS0+cHViLm1heF9hbGxvY19jaHVuayA9IE1BWF9BTExPQ19DSFVOSzsKKworICAvKiBJbml0aWFsaXplIHdvcmtpbmcgc3RhdGUgKi8KKyAgbWVtLT5wdWIubWF4X21lbW9yeV90b191c2UgPSBtYXhfdG9fdXNlOworCisgIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPj0gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKKyAgICBtZW0tPnNtYWxsX2xpc3RbcG9vbF0gPSBOVUxMOworICAgIG1lbS0+bGFyZ2VfbGlzdFtwb29sXSA9IE5VTEw7CisgIH0KKyAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKKyAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKKworICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCA9IFNJWkVPRihteV9tZW1vcnlfbWdyKTsKKworICAvKiBEZWNsYXJlIG91cnNlbHZlcyBvcGVuIGZvciBidXNpbmVzcyAqLworICBjaW5mby0+bWVtID0gJiBtZW0tPnB1YjsKKworICAvKiBDaGVjayBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgSlBFR01FTTsgaWYgZm91bmQsIG92ZXJyaWRlIHRoZQorICAgKiBkZWZhdWx0IG1heF9tZW1vcnkgc2V0dGluZyBmcm9tIGpwZWdfbWVtX2luaXQuICBOb3RlIHRoYXQgdGhlCisgICAqIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBhZ2FpbiBvdmVycmlkZSB0aGlzIHZhbHVlLgorICAgKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgZ2V0ZW52KCksIGRlZmluZSBOT19HRVRFTlYgdG8gZGlzYWJsZQorICAgKiB0aGlzIGZlYXR1cmUuCisgICAqLworI2lmbmRlZiBOT19HRVRFTlYKKyAgeyBjaGFyICogbWVtZW52OworCisgICAgaWYgKChtZW1lbnYgPSBnZXRlbnYoIkpQRUdNRU0iKSkgIT0gTlVMTCkgeworICAgICAgY2hhciBjaCA9ICd4JzsKKworICAgICAgaWYgKHNzY2FuZihtZW1lbnYsICIlbGQlYyIsICZtYXhfdG9fdXNlLCAmY2gpID4gMCkgeworCWlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQorCSAgbWF4X3RvX3VzZSAqPSAxMDAwTDsKKwltZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2UgKiAxMDAwTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorCit9CmRpZmYgLS1naXQgYS9qcGVnL2ptZW1uYW1lLmMgYi9qcGVnL2ptZW1uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5NmRlZQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvam1lbW5hbWUuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIGptZW1uYW1lLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQKKyAqIHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdAorICogeW91IG11c3QgZXhwbGljaXRseSBjb25zdHJ1Y3QgYSBuYW1lIGZvciBlYWNoIHRlbXAgZmlsZS4KKyAqIEFsc28sIHRoZSBwcm9ibGVtIG9mIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZQorICogaXMgc2hvdmVkIG9udG8gdGhlIHVzZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOworZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOworI2VuZGlmCisKKyNpZm5kZWYgU0VFS19TRVQJCS8qIHByZS1BTlNJIHN5c3RlbXMgbWF5IG5vdCBkZWZpbmUgdGhpczsgKi8KKyNkZWZpbmUgU0VFS19TRVQgIDAJCS8qIGlmIG5vdCwgYXNzdW1lIDAgaXMgY29ycmVjdCAqLworI2VuZGlmCisKKyNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCisjZGVmaW5lIFJXX0JJTkFSWQkidysiCisjZWxzZQorI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgorI2RlZmluZSBSV19CSU5BUlkJIncrYiIsICJjdHg9c3RtIgorI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCisjZGVmaW5lIFJXX0JJTkFSWQkidytiIgorI2VuZGlmCisjZW5kaWYKKworCisvKgorICogU2VsZWN0aW9uIG9mIGEgZmlsZSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgorICogVGhpcyBpcyBzeXN0ZW0tZGVwZW5kZW50IQorICoKKyAqIFRoZSBjb2RlIGFzIGdpdmVuIGlzIHN1aXRhYmxlIGZvciBtb3N0IFVuaXggc3lzdGVtcywgYW5kIGl0IGlzIGVhc2lseQorICogbW9kaWZpZWQgZm9yIG1vc3Qgbm9uLVVuaXggc3lzdGVtcy4gIFNvbWUgbm90ZXM6CisgKiAgMS4gIFRoZSB0ZW1wIGZpbGUgaXMgY3JlYXRlZCBpbiB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5IFRFTVBfRElSRUNUT1JZLgorICogICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAvdXNyL3RtcCwgd2hpY2ggaXMgdGhlIGNvbnZlbnRpb25hbCBwbGFjZSBmb3IKKyAqICAgICAgY3JlYXRpbmcgbGFyZ2UgdGVtcCBmaWxlcyBvbiBVbml4LiAgT24gb3RoZXIgc3lzdGVtcyB5b3UnbGwgcHJvYmFibHkKKyAqICAgICAgd2FudCB0byBjaGFuZ2UgdGhlIGZpbGUgbG9jYXRpb24uICBZb3UgY2FuIGRvIHRoaXMgYnkgZWRpdGluZyB0aGUKKyAqICAgICAgI2RlZmluZSwgb3IgKHByZWZlcnJlZCkgYnkgZGVmaW5pbmcgVEVNUF9ESVJFQ1RPUlkgaW4gamNvbmZpZy5oLgorICoKKyAqICAyLiAgSWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBmaWxlIG5hbWUgYXMgd2VsbCBhcyBpdHMgbG9jYXRpb24sCisgKiAgICAgIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIFRFTVBfRklMRV9OQU1FIG1hY3JvLiAgKE5vdGUgdGhhdCB0aGlzIGlzCisgKiAgICAgIGFjdHVhbGx5IGEgcHJpbnRmIGZvcm1hdCBzdHJpbmc7IGl0IG11c3QgY29udGFpbiAlcyBhbmQgJWQuKQorICogICAgICBGZXcgcGVvcGxlIHNob3VsZCBuZWVkIHRvIGRvIHRoaXMuCisgKgorICogIDMuICBta3RlbXAoKSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG11bHRpcGxlIHByb2Nlc3NlcyBydW5uaW5nCisgKiAgICAgIHNpbXVsdGFuZW91c2x5IHdvbid0IHNlbGVjdCB0aGUgc2FtZSBmaWxlIG5hbWVzLiAgSWYgeW91ciBzeXN0ZW0KKyAqICAgICAgZG9lc24ndCBoYXZlIG1rdGVtcCgpLCBkZWZpbmUgTk9fTUtURU1QIHRvIGRvIGl0IHRoZSBoYXJkIHdheS4KKyAqICAgICAgKElmIHlvdSBkb24ndCBoYXZlIDxlcnJuby5oPiwgYWxzbyBkZWZpbmUgTk9fRVJSTk9fSC4pCisgKgorICogIDQuICBZb3UgcHJvYmFibHkgd2FudCB0byBkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUiBzbyB0aGF0IGNqcGVnLmMvZGpwZWcuYworICogICAgICB3aWxsIGNhdXNlIHRoZSB0ZW1wIGZpbGVzIHRvIGJlIHJlbW92ZWQgaWYgeW91IHN0b3AgdGhlIHByb2dyYW0gZWFybHkuCisgKi8KKworI2lmbmRlZiBURU1QX0RJUkVDVE9SWQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICAiL3Vzci90bXAvIiAvKiByZWNvbW1lbmRlZCBzZXR0aW5nIGZvciBVbml4ICovCisjZW5kaWYKKworc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KKworI2lmZGVmIE5PX01LVEVNUAorCisjaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KKyNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICIlc0pQRyUwM2QuVE1QIgorI2VuZGlmCisKKyNpZm5kZWYgTk9fRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CQkvKiB0byBkZWZpbmUgRU5PRU5UICovCisjZW5kaWYKKworLyogQU5TSSBDIHNwZWNpZmllcyB0aGF0IGVycm5vIGlzIGEgbWFjcm8sIGJ1dCBvbiBvbGRlciBzeXN0ZW1zIGl0J3MgbW9yZQorICogbGlrZWx5IHRvIGJlIGEgcGxhaW4gaW50IHZhcmlhYmxlLiAgQW5kIG5vdCBhbGwgdmVyc2lvbnMgb2YgZXJybm8uaAorICogYm90aGVyIHRvIGRlY2xhcmUgaXQsIHNvIHdlIGhhdmUgdG8gaW4gb3JkZXIgdG8gYmUgbW9zdCBwb3J0YWJsZS4gIFRodXM6CisgKi8KKyNpZm5kZWYgZXJybm8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworCitMT0NBTCh2b2lkKQorc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQoreworICBGSUxFICogdGZpbGU7CisKKyAgLyogS2VlcCBnZW5lcmF0aW5nIGZpbGUgbmFtZXMgdGlsbCB3ZSBmaW5kIG9uZSB0aGF0J3Mgbm90IGluIHVzZSAqLworICBmb3IgKDs7KSB7CisgICAgbmV4dF9maWxlX251bSsrOwkJLyogYWR2YW5jZSBjb3VudGVyICovCisgICAgc3ByaW50ZihmbmFtZSwgVEVNUF9GSUxFX05BTUUsIFRFTVBfRElSRUNUT1JZLCBuZXh0X2ZpbGVfbnVtKTsKKyAgICBpZiAoKHRmaWxlID0gZm9wZW4oZm5hbWUsIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgLyogZm9wZW4gY291bGQgaGF2ZSBmYWlsZWQgZm9yIGEgcmVhc29uIG90aGVyIHRoYW4gdGhlIGZpbGUgbm90CisgICAgICAgKiBiZWluZyB0aGVyZTsgZm9yIGV4YW1wbGUsIGZpbGUgdGhlcmUgYnV0IHVucmVhZGFibGUuCisgICAgICAgKiBJZiA8ZXJybm8uaD4gaXNuJ3QgYXZhaWxhYmxlLCB0aGVuIHdlIGNhbm5vdCB0ZXN0IHRoZSBjYXVzZS4KKyAgICAgICAqLworI2lmZGVmIEVOT0VOVAorICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKKwljb250aW51ZTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorICAgIGZjbG9zZSh0ZmlsZSk7CQkvKiBvb3BzLCBpdCdzIHRoZXJlOyBjbG9zZSB0ZmlsZSAmIHRyeSBhZ2FpbiAqLworICB9Cit9CisKKyNlbHNlIC8qICEgTk9fTUtURU1QICovCisKKy8qIE5vdGUgdGhhdCBta3RlbXAoKSByZXF1aXJlcyB0aGUgaW5pdGlhbCBmaWxlbmFtZSB0byBlbmQgaW4gc2l4IFgncyAqLworI2lmbmRlZiBURU1QX0ZJTEVfTkFNRQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCisjZGVmaW5lIFRFTVBfRklMRV9OQU1FICAiJXNKUEclZFhYWFhYWCIKKyNlbmRpZgorCitMT0NBTCh2b2lkKQorc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQoreworICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KKyAgc3ByaW50ZihmbmFtZSwgVEVNUF9GSUxFX05BTUUsIFRFTVBfRElSRUNUT1JZLCBuZXh0X2ZpbGVfbnVtKTsKKyAgbWt0ZW1wKGZuYW1lKTsJCS8qIG1ha2Ugc3VyZSBmaWxlIG5hbWUgaXMgdW5pcXVlICovCisgIC8qIG1rdGVtcCByZXBsYWNlcyB0aGUgdHJhaWxpbmcgWFhYWFhYIHdpdGggYSB1bmlxdWUgc3RyaW5nIG9mIGNoYXJhY3RlcnMgKi8KK30KKworI2VuZGlmIC8qIE5PX01LVEVNUCAqLworCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KKyAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCisgKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAorICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgorICovCisKK0dMT0JBTCh2b2lkIEZBUiAqKQoranBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCisgKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgorICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAorICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KKyAqLworCisjaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwTCAvKiBkZWZhdWx0OiBvbmUgbWVnYWJ5dGUgKi8KKyNlbmRpZgorCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCisJCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCit7CisgIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOworICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCisgICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKKyAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCit7CisgIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOwkvKiBjbG9zZSB0aGUgZmlsZSAqLworICB1bmxpbmsoaW5mby0+dGVtcF9uYW1lKTsJLyogZGVsZXRlIHRoZSBmaWxlICovCisvKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgdW5saW5rKCksIHVzZSByZW1vdmUoKSBpbnN0ZWFkLgorICogcmVtb3ZlKCkgaXMgdGhlIEFOU0ktc3RhbmRhcmQgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiwgYnV0IGlmCisgKiB5b3VyIHN5c3RlbSB3YXMgQU5TSSB5b3UnZCBiZSB1c2luZyBqbWVtYW5zaS5jLCByaWdodD8KKyAqLworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9DTE9TRSwgaW5mby0+dGVtcF9uYW1lKTsKK30KKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQoreworICBzZWxlY3RfZmlsZV9uYW1lKGluZm8tPnRlbXBfbmFtZSk7CisgIGlmICgoaW5mby0+dGVtcF9maWxlID0gZm9wZW4oaW5mby0+dGVtcF9uYW1lLCBSV19CSU5BUlkpKSA9PSBOVUxMKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgaW5mby0+dGVtcF9uYW1lKTsKKyAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOworICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7CisgIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKKyAqIGNsZWFudXAgcmVxdWlyZWQuCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIG5leHRfZmlsZV9udW0gPSAwOwkJLyogaW5pdGlhbGl6ZSB0ZW1wIGZpbGUgbmFtZSBnZW5lcmF0b3IgKi8KKyAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KK30KKworR0xPQkFMKHZvaWQpCitqcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KZGlmZiAtLWdpdCBhL2pwZWcvam1lbW5vYnMuYyBiL2pwZWcvam1lbW5vYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjhjMzM3Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qbWVtbm9icy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogam1lbW5vYnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgcmVhbGx5IHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQorICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUaGlzIGltcGxlbWVudGF0aW9uCisgKiBhc3N1bWVzIHRoYXQgbm8gYmFja2luZy1zdG9yZSBmaWxlcyBhcmUgbmVlZGVkOiBhbGwgcmVxdWlyZWQgc3BhY2UKKyAqIGNhbiBiZSBvYnRhaW5lZCBmcm9tIG1hbGxvYygpLgorICogVGhpcyBpcyB2ZXJ5IHBvcnRhYmxlIGluIHRoZSBzZW5zZSB0aGF0IGl0J2xsIGNvbXBpbGUgb24gYWxtb3N0IGFueXRoaW5nLAorICogYnV0IHlvdSdkIGJldHRlciBoYXZlIGxvdHMgb2YgbWFpbiBtZW1vcnkgKG9yIHZpcnR1YWwgbWVtb3J5KSBpZiB5b3Ugd2FudAorICogdG8gcHJvY2VzcyBiaWcgaW1hZ2VzLgorICogTm90ZSB0aGF0IHRoZSBtYXhfbWVtb3J5X3RvX3VzZSBvcHRpb24gaXMgaWdub3JlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KK2V4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKK2V4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKKyNlbmRpZgorCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KKyAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCisgKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAorICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgorICovCisKK0dMT0JBTCh2b2lkIEZBUiAqKQoranBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSGVyZSB3ZSBhbHdheXMgc2F5LCAid2UgZ290IGFsbCB5b3Ugd2FudCBidWQhIgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKKwkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKK3sKKyAgcmV0dXJuIG1heF9ieXRlc19uZWVkZWQ7Cit9CisKKworLyoKKyAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgorICogU2luY2UganBlZ19tZW1fYXZhaWxhYmxlIGFsd2F5cyBwcm9taXNlZCB0aGUgbW9vbiwKKyAqIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBhbmQgd2UgY2FuIGp1c3QgZXJyb3Igb3V0LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19CQUNLSU5HX1NUT1JFKTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4gIEhlcmUsIHRoZXJlIGlzbid0IGFueS4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIDA7CQkJLyoganVzdCBzZXQgbWF4X21lbW9yeV90b191c2UgdG8gMCAqLworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQpkaWZmIC0tZ2l0IGEvanBlZy9qbWVtc3lzLmggYi9qcGVnL2ptZW1zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQxYzYzCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qbWVtc3lzLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBqbWVtc3lzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgaW5jbHVkZSBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQKKyAqIGFuZCBzeXN0ZW0tZGVwZW5kZW50IHBvcnRpb25zIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgTm8gb3RoZXIKKyAqIG1vZHVsZXMgbmVlZCBpbmNsdWRlIGl0LiAgKFRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgcG9ydGlvbiBpcyBqbWVtbWdyLmM7CisgKiB0aGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQgcG9ydGlvbi4pCisgKgorICogVGhpcyBmaWxlIHdvcmtzIGFzLWlzIGZvciB0aGUgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlcnMgc3VwcGxpZWQKKyAqIGluIHRoZSBJSkcgZGlzdHJpYnV0aW9uLiAgWW91IG1heSBuZWVkIHRvIG1vZGlmeSBpdCBpZiB5b3Ugd3JpdGUgYQorICogY3VzdG9tIG1lbW9yeSBtYW5hZ2VyLiAgSWYgc3lzdGVtLWRlcGVuZGVudCBjaGFuZ2VzIGFyZSBuZWVkZWQgaW4KKyAqIHRoaXMgZmlsZSwgdGhlIGJlc3QgbWV0aG9kIGlzIHRvICNpZmRlZiB0aGVtIGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbgorICogc3ltYm9sIHN1cHBsaWVkIGluIGpjb25maWcuaCwgYXMgd2UgaGF2ZSBkb25lIHdpdGggVVNFX01TRE9TX01FTU1HUgorICogYW5kIFVTRV9NQUNfTUVNTUdSLgorICovCisKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfZ2V0X3NtYWxsCQlqR2V0U21hbGwKKyNkZWZpbmUganBlZ19mcmVlX3NtYWxsCQlqRnJlZVNtYWxsCisjZGVmaW5lIGpwZWdfZ2V0X2xhcmdlCQlqR2V0TGFyZ2UKKyNkZWZpbmUganBlZ19mcmVlX2xhcmdlCQlqRnJlZUxhcmdlCisjZGVmaW5lIGpwZWdfbWVtX2F2YWlsYWJsZQlqTWVtQXZhaWwKKyNkZWZpbmUganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUJak9wZW5CYWNrU3RvcmUKKyNkZWZpbmUganBlZ19tZW1faW5pdAkJak1lbUluaXQKKyNkZWZpbmUganBlZ19tZW1fdGVybQkJak1lbVRlcm0KKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKworLyoKKyAqIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gYWxsb2NhdGUgYW5kIHJlbGVhc2Ugc21hbGwgY2h1bmtzIG9mCisgKiBtZW1vcnkuICAoVHlwaWNhbGx5IHRoZSB0b3RhbCBhbW91bnQgcmVxdWVzdGVkIHRocm91Z2gganBlZ19nZXRfc21hbGwgaXMKKyAqIG5vIG1vcmUgdGhhbiAyMEsgb3Igc287IHRoaXMgd2lsbCBiZSByZXF1ZXN0ZWQgaW4gY2h1bmtzIG9mIGEgZmV3IEsgZWFjaC4pCisgKiBCZWhhdmlvciBzaG91bGQgYmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBtYWxsb2MKKyAqIGFuZCBmcmVlOyBpbiBwYXJ0aWN1bGFyLCBqcGVnX2dldF9zbWFsbCBtdXN0IHJldHVybiBOVUxMIG9uIGZhaWx1cmUuCisgKiBPbiBtb3N0IHN5c3RlbXMsIHRoZXNlIEFSRSBtYWxsb2MgYW5kIGZyZWUuICBqcGVnX2ZyZWVfc21hbGwgaXMgcGFzc2VkIHRoZQorICogc2l6ZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGZyZWVkLCBqdXN0IGluIGNhc2UgaXQncyBuZWVkZWQuCisgKiBPbiBhbiA4MHg4NiBtYWNoaW5lIHVzaW5nIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsLCB0aGVzZSBtYW5hZ2UgbmVhciBoZWFwLgorICovCisKK0VYVEVSTih2b2lkICopIGpwZWdfZ2V0X3NtYWxsIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CitFWFRFUk4odm9pZCkganBlZ19mcmVlX3NtYWxsIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LAorCQkJCSAgc2l6ZV90IHNpemVvZm9iamVjdCkpOworCisvKgorICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBsYXJnZSBjaHVua3Mgb2YKKyAqIG1lbW9yeSAodXAgdG8gdGhlIHRvdGFsIGZyZWUgc3BhY2UgZGVzaWduYXRlZCBieSBqcGVnX21lbV9hdmFpbGFibGUpLgorICogVGhlIGludGVyZmFjZSBpcyB0aGUgc2FtZSBhcyBhYm92ZSwgZXhjZXB0IHRoYXQgb24gYW4gODB4ODYgbWFjaGluZSwKKyAqIGZhciBwb2ludGVycyBhcmUgdXNlZC4gIE9uIG1vc3Qgb3RoZXIgbWFjaGluZXMgdGhlc2UgYXJlIGlkZW50aWNhbCB0bworICogdGhlIGpwZWdfZ2V0L2ZyZWVfc21hbGwgcm91dGluZXM7IGJ1dCB3ZSBrZWVwIHRoZW0gc2VwYXJhdGUgYW55d2F5LAorICogaW4gY2FzZSBhIGRpZmZlcmVudCBhbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIGRlc2lyYWJsZSBmb3IgbGFyZ2UgY2h1bmtzLgorICovCisKK0VYVEVSTih2b2lkIEZBUiAqKSBqcGVnX2dldF9sYXJnZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgICAgc2l6ZV90IHNpemVvZm9iamVjdCkpOworRVhURVJOKHZvaWQpIGpwZWdfZnJlZV9sYXJnZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsCisJCQkJICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CisKKy8qCisgKiBUaGUgbWFjcm8gTUFYX0FMTE9DX0NIVU5LIGRlc2lnbmF0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5CisgKiBiZSByZXF1ZXN0ZWQgaW4gYSBzaW5nbGUgY2FsbCB0byBqcGVnX2dldF9sYXJnZSAoYW5kIGpwZWdfZ2V0X3NtYWxsIGZvciB0aGF0CisgKiBtYXR0ZXIsIGJ1dCB0aGF0IGNhc2Ugc2hvdWxkIG5ldmVyIGNvbWUgaW50byBwbGF5KS4gIFRoaXMgbWFjcm8gaXMgbmVlZGVkCisgKiB0byBtb2RlbCB0aGUgNjRLYi1zZWdtZW50LXNpemUgbGltaXQgb2YgZmFyIGFkZHJlc3Npbmcgb24gODB4ODYgbWFjaGluZXMuCisgKiBPbiB0aG9zZSBtYWNoaW5lcywgd2UgZXhwZWN0IHRoYXQgamNvbmZpZy5oIHdpbGwgcHJvdmlkZSBhIHByb3BlciB2YWx1ZS4KKyAqIE9uIG1hY2hpbmVzIHdpdGggMzItYml0IGZsYXQgYWRkcmVzcyBzcGFjZXMsIGFueSBsYXJnZSBjb25zdGFudCBtYXkgYmUgdXNlZC4KKyAqCisgKiBOQjogam1lbW1nci5jIGV4cGVjdHMgdGhhdCBNQVhfQUxMT0NfQ0hVTksgd2lsbCBiZSByZXByZXNlbnRhYmxlIGFzIHR5cGUKKyAqIHNpemVfdCBhbmQgd2lsbCBiZSBhIG11bHRpcGxlIG9mIHNpemVvZihhbGlnbl90eXBlKS4KKyAqLworCisjaWZuZGVmIE1BWF9BTExPQ19DSFVOSwkJLyogbWF5IGJlIG92ZXJyaWRkZW4gaW4gamNvbmZpZy5oICovCisjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyAgMTAwMDAwMDAwMEwKKyNlbmRpZgorCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBzcGFjZSBzdGlsbCBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gYnkKKyAqIGpwZWdfZ2V0X2xhcmdlLiAgSWYgbW9yZSBzcGFjZSB0aGFuIHRoaXMgaXMgbmVlZGVkLCBiYWNraW5nIHN0b3JlIHdpbGwgYmUKKyAqIHVzZWQuICBOT1RFOiBhbnkgbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkIG11c3Qgbm90IGJlIGNvdW50ZWQuCisgKgorICogVGhlcmUgaXMgYSBtaW5pbXVtIHNwYWNlIHJlcXVpcmVtZW50LCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaW5pbXVtCisgKiBmZWFzaWJsZSBidWZmZXIgc2l6ZXM7IGptZW1tZ3IuYyB3aWxsIHJlcXVlc3QgdGhhdCBtdWNoIHNwYWNlIGV2ZW4gaWYKKyAqIGpwZWdfbWVtX2F2YWlsYWJsZSByZXR1cm5zIHplcm8uICBUaGUgbWF4aW11bSBzcGFjZSBuZWVkZWQsIGVub3VnaCB0byBob2xkCisgKiBhbGwgd29ya2luZyBzdG9yYWdlIGluIG1lbW9yeSwgaXMgYWxzbyBwYXNzZWQgaW4gY2FzZSBpdCBpcyB1c2VmdWwuCisgKiBGaW5hbGx5LCB0aGUgdG90YWwgc3BhY2UgYWxyZWFkeSBhbGxvY2F0ZWQgaXMgcGFzc2VkLiAgSWYgbm8gYmV0dGVyCisgKiBtZXRob2QgaXMgYXZhaWxhYmxlLCBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkCisgKiBpcyBvZnRlbiBhIHN1aXRhYmxlIGNhbGN1bGF0aW9uLgorICoKKyAqIEl0IGlzIE9LIGZvciBqcGVnX21lbV9hdmFpbGFibGUgdG8gdW5kZXJlc3RpbWF0ZSB0aGUgc3BhY2UgYXZhaWxhYmxlCisgKiAodGhhdCdsbCBqdXN0IGxlYWQgdG8gbW9yZSBiYWNraW5nLXN0b3JlIGFjY2VzcyB0aGFuIGlzIHJlYWxseSBuZWNlc3NhcnkpLgorICogSG93ZXZlciwgYW4gb3ZlcmVzdGltYXRlIHdpbGwgbGVhZCB0byBmYWlsdXJlLiAgSGVuY2UgaXQncyB3aXNlIHRvIHN1YnRyYWN0CisgKiBhIHNsb3AgZmFjdG9yIGZyb20gdGhlIHRydWUgYXZhaWxhYmxlIHNwYWNlLiAgNSUgc2hvdWxkIGJlIGVub3VnaC4KKyAqCisgKiBPbiBtYWNoaW5lcyB3aXRoIGxvdHMgb2YgdmlydHVhbCBtZW1vcnksIGFueSBsYXJnZSBjb25zdGFudCBtYXkgYmUgcmV0dXJuZWQuCisgKiBDb252ZXJzZWx5LCB6ZXJvIG1heSBiZSByZXR1cm5lZCB0byBhbHdheXMgdXNlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkuCisgKi8KKworRVhURVJOKGxvbmcpIGpwZWdfbWVtX2F2YWlsYWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKKwkJCQkgICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwKKwkJCQkgICAgIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpKTsKKworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgd2hhdGV2ZXIgc3RhdGUgaXMgbmVlZGVkIHRvIGFjY2VzcyBhIHNpbmdsZQorICogYmFja2luZy1zdG9yZSBvYmplY3QuICBUaGUgcmVhZC93cml0ZS9jbG9zZSBtZXRob2QgcG9pbnRlcnMgYXJlIGNhbGxlZAorICogYnkgam1lbW1nci5jIHRvIG1hbmlwdWxhdGUgdGhlIGJhY2tpbmctc3RvcmUgb2JqZWN0OyBhbGwgb3RoZXIgZmllbGRzCisgKiBhcmUgcHJpdmF0ZSB0byB0aGUgc3lzdGVtLWRlcGVuZGVudCBiYWNraW5nIHN0b3JlIHJvdXRpbmVzLgorICovCisKKyNkZWZpbmUgVEVNUF9OQU1FX0xFTkdUSCAgIDY0CS8qIG1heCBsZW5ndGggb2YgYSB0ZW1wb3JhcnkgZmlsZSdzIG5hbWUgKi8KKworCisjaWZkZWYgVVNFX01TRE9TX01FTU1HUgkJLyogRE9TLXNwZWNpZmljIGp1bmsgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBYTVNIOwkvKiB0eXBlIG9mIGV4dGVuZGVkLW1lbW9yeSBoYW5kbGVzICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEVNU0g7CS8qIHR5cGUgb2YgZXhwYW5kZWQtbWVtb3J5IGhhbmRsZXMgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgIHNob3J0IGZpbGVfaGFuZGxlOwkJLyogRE9TIGZpbGUgaGFuZGxlIGlmIGl0J3MgYSB0ZW1wIGZpbGUgKi8KKyAgWE1TSCB4bXNfaGFuZGxlOwkJLyogaGFuZGxlIGlmIGl0J3MgYSBjaHVuayBvZiBYTVMgKi8KKyAgRU1TSCBlbXNfaGFuZGxlOwkJLyogaGFuZGxlIGlmIGl0J3MgYSBjaHVuayBvZiBFTVMgKi8KK30gaGFuZGxlX3VuaW9uOworCisjZW5kaWYgLyogVVNFX01TRE9TX01FTU1HUiAqLworCisjaWZkZWYgVVNFX01BQ19NRU1NR1IJCS8qIE1hYy1zcGVjaWZpYyBqdW5rICovCisjaW5jbHVkZSA8RmlsZXMuaD4KKyNlbmRpZiAvKiBVU0VfTUFDX01FTU1HUiAqLworCisKK3R5cGVkZWYgc3RydWN0IGJhY2tpbmdfc3RvcmVfc3RydWN0ICogYmFja2luZ19zdG9yZV9wdHI7CisKK3R5cGVkZWYgc3RydWN0IGJhY2tpbmdfc3RvcmVfc3RydWN0IHsKKyAgLyogTWV0aG9kcyBmb3IgcmVhZGluZy93cml0aW5nL2Nsb3NpbmcgdGhpcyBiYWNraW5nLXN0b3JlIG9iamVjdCAqLworICBKTUVUSE9EKHZvaWQsIHJlYWRfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAorCQkJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgICBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJCSAgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCQkJICAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KSk7CisgIEpNRVRIT0Qodm9pZCwgY2xvc2VfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgICBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKSk7CisKKyAgLyogUHJpdmF0ZSBmaWVsZHMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgYmFja2luZy1zdG9yZSBtYW5hZ2VtZW50ICovCisjaWZkZWYgVVNFX01TRE9TX01FTU1HUgorICAvKiBGb3IgdGhlIE1TLURPUyBtYW5hZ2VyIChqbWVtZG9zLmMpLCB3ZSBuZWVkOiAqLworICBoYW5kbGVfdW5pb24gaGFuZGxlOwkJLyogcmVmZXJlbmNlIHRvIGJhY2tpbmctc3RvcmUgc3RvcmFnZSBvYmplY3QgKi8KKyAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgaWYgaXQncyBhIGZpbGUgKi8KKyNlbHNlCisjaWZkZWYgVVNFX01BQ19NRU1NR1IKKyAgLyogRm9yIHRoZSBNYWMgbWFuYWdlciAoam1lbW1hYy5jKSwgd2UgbmVlZDogKi8KKyAgc2hvcnQgdGVtcF9maWxlOwkJLyogZmlsZSByZWZlcmVuY2UgbnVtYmVyIHRvIHRlbXAgZmlsZSAqLworICBGU1NwZWMgdGVtcFNwZWM7CQkvKiB0aGUgRlNTcGVjIGZvciB0aGUgdGVtcCBmaWxlICovCisgIGNoYXIgdGVtcF9uYW1lW1RFTVBfTkFNRV9MRU5HVEhdOyAvKiBuYW1lIGlmIGl0J3MgYSBmaWxlICovCisjZWxzZQorI2lmZGVmIFVTRV9BTkRST0lEX0FTSE1FTQorICBzaG9ydCB0ZW1wX2ZpbGU7CQkvKiBmaWxlIHJlZmVyZW5jZSBudW1iZXIgdG8gdGVtcCBmaWxlICovCisgIHVuc2lnbmVkIGNoYXIqIGFkZHI7ICAvKiB0aGUgbWVtb3J5IGFkZHJlc3MgbWFwcGVkIHRvIGFzaG1lbSAqLworICBsb25nIHNpemU7ICAgICAgICAgICAgLyogdGhlIHJlcXVlc3RlZCBhc2htZW0gc2l6ZSAqLworI2Vsc2UKKyAgLyogRm9yIGEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHRlbXAgZmlsZXMsIHdlIG5lZWQ6ICovCisgIEZJTEUgKiB0ZW1wX2ZpbGU7CQkvKiBzdGRpbyByZWZlcmVuY2UgdG8gdGVtcCBmaWxlICovCisgIGNoYXIgdGVtcF9uYW1lW1RFTVBfTkFNRV9MRU5HVEhdOyAvKiBuYW1lIG9mIHRlbXAgZmlsZSAqLworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorfSBiYWNraW5nX3N0b3JlX2luZm87CisKKworLyoKKyAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LiAgVGhpcyBtdXN0IGZpbGwgaW4gdGhlCisgKiByZWFkL3dyaXRlL2Nsb3NlIHBvaW50ZXJzIGluIHRoZSBvYmplY3QuICBUaGUgcmVhZC93cml0ZSByb3V0aW5lcworICogbWF5IHRha2UgYW4gZXJyb3IgZXhpdCBpZiB0aGUgc3BlY2lmaWVkIG1heGltdW0gZmlsZSBzaXplIGlzIGV4Y2VlZGVkLgorICogKElmIGpwZWdfbWVtX2F2YWlsYWJsZSBhbHdheXMgcmV0dXJucyBhIGxhcmdlIHZhbHVlLCB0aGlzIHJvdXRpbmUgY2FuCisgKiBqdXN0IHRha2UgYW4gZXJyb3IgZXhpdC4pCisgKi8KKworRVhURVJOKHZvaWQpIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkJCSAgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpKTsKKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4gIGpwZWdfbWVtX2luaXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGlzCisgKiBhbGxvY2F0ZWQgKGFuZCwgdGhlcmVmb3JlLCBub3RoaW5nIGluIGNpbmZvIGlzIG9mIHVzZSBleGNlcHQgdGhlIGVycm9yCisgKiBtYW5hZ2VyIHBvaW50ZXIpLiAgSXQgc2hvdWxkIHJldHVybiBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgZm9yCisgKiBtYXhfbWVtb3J5X3RvX3VzZTsgdGhpcyBtYXkgc3Vic2VxdWVudGx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIHN1cnJvdW5kaW5nCisgKiBhcHBsaWNhdGlvbi4gIChOb3RlIHRoYXQgbWF4X21lbW9yeV90b191c2UgaXMgb25seSBpbXBvcnRhbnQgaWYKKyAqIGpwZWdfbWVtX2F2YWlsYWJsZSBjaG9vc2VzIHRvIGNvbnN1bHQgaXQgLi4uIG5vIG9uZSBlbHNlIHdpbGwuKQorICoganBlZ19tZW1fdGVybSBtYXkgYXNzdW1lIHRoYXQgYWxsIHJlcXVlc3RlZCBtZW1vcnkgaGFzIGJlZW4gZnJlZWQgYW5kIHRoYXQKKyAqIGFsbCBvcGVuZWQgYmFja2luZy1zdG9yZSBvYmplY3RzIGhhdmUgYmVlbiBjbG9zZWQuCisgKi8KKworRVhURVJOKGxvbmcpIGpwZWdfbWVtX2luaXQgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX21lbV90ZXJtIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CmRpZmYgLS1naXQgYS9qcGVnL2ptb3JlY2ZnLmggYi9qcGVnL2ptb3JlY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhNTZkNwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvam1vcmVjZmcuaApAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIGptb3JlY2ZnLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGN1c3RvbWl6ZSB0aGUKKyAqIEpQRUcgc29mdHdhcmUgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIG9yIHN1cHBvcnQgbWFjaGluZS1kZXBlbmRlbnQKKyAqIG9wdGltaXphdGlvbnMuICBNb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gdG91Y2ggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgSk1PUkVDRkdfSAorI2RlZmluZSBKTU9SRUNGR19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoKKyAqIERlZmluZSBBTkRST0lEX1JHQiB0byBlbmFibGUgc3BlY2lmaWMgb3B0aW1pemF0aW9ucyBmb3IgQW5kcm9pZAorICogICBKQ1NfUkdCQV84ODg4IHN1cHBvcnQKKyAqICAgSkNTX1JHQl81NjUgc3VwcG9ydAorICogCisgKi8KKworI2RlZmluZSBBTkRST0lEX1JHQgorCisjaWZkZWYgQU5EUk9JRF9SR0IKKyNkZWZpbmUgUEFDS19TSE9SVF81NjUocixnLGIpICAoKCgocik8PDgpJjB4ZjgwMCl8KCgoZyk8PDMpJjB4N0UwKXwoKGIpPj4zKSkKKyNkZWZpbmUgUEFDS19UV09fUElYRUxTKGwscikgICAoKHI8PDE2KSB8IGwpCisjZGVmaW5lIFBBQ0tfTkVFRF9BTElHTk1FTlQocHRyKSAoKCh1aW50cHRyX3QpKHB0cikpJjMpCisjZGVmaW5lIFdSSVRFX1RXT19QSVhFTFMoYWRkciwgcGl4ZWxzKSBkbyB7ICAgICBcCisgICAgICAgICAoKElOVDE2KikoYWRkcikpWzBdID0gKHBpeGVscyk7ICAgICAgICBcCisgICAgICAgICAoKElOVDE2KikoYWRkcikpWzFdID0gKHBpeGVscyk+PjE2OyAgICBcCisgICAgfSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9UV09fQUxJR05FRF9QSVhFTFMoYWRkciwgcGl4ZWxzKSAgKCgqKElOVDMyKikoYWRkcikpID0gcGl4ZWxzKQorI2RlZmluZSBESVRIRVJfNTY1X1IociwgZGl0aGVyKSAoKHIpICsgKChkaXRoZXIpJjB4RkYpKQorI2RlZmluZSBESVRIRVJfNTY1X0coZywgZGl0aGVyKSAoKGcpICsgKCgoZGl0aGVyKSYweEZGKT4+MSkpCisjZGVmaW5lIERJVEhFUl81NjVfQihiLCBkaXRoZXIpICgoYikgKyAoKGRpdGhlcikmMHhGRikpCisjZW5kaWYKKworLyoKKyAqIERlZmluZSBCSVRTX0lOX0pTQU1QTEUgYXMgZWl0aGVyCisgKiAgIDggICBmb3IgOC1iaXQgc2FtcGxlIHZhbHVlcyAodGhlIHVzdWFsIHNldHRpbmcpCisgKiAgIDEyICBmb3IgMTItYml0IHNhbXBsZSB2YWx1ZXMKKyAqIE9ubHkgOCBhbmQgMTIgYXJlIGxlZ2FsIGRhdGEgcHJlY2lzaW9ucyBmb3IgbG9zc3kgSlBFRyBhY2NvcmRpbmcgdG8gdGhlCisgKiBKUEVHIHN0YW5kYXJkLCBhbmQgdGhlIElKRyBjb2RlIGRvZXMgbm90IHN1cHBvcnQgYW55dGhpbmcgZWxzZSEKKyAqIFdlIGRvIG5vdCBzdXBwb3J0IHJ1bi10aW1lIHNlbGVjdGlvbiBvZiBkYXRhIHByZWNpc2lvbiwgc29ycnkuCisgKi8KKworI2RlZmluZSBCSVRTX0lOX0pTQU1QTEUgIDgJLyogdXNlIDggb3IgMTIgKi8KKworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgY29tcG9uZW50cyAoY29sb3IgY2hhbm5lbHMpIGFsbG93ZWQgaW4gSlBFRyBpbWFnZS4KKyAqIFRvIG1lZXQgdGhlIGxldHRlciBvZiB0aGUgSlBFRyBzcGVjLCBzZXQgdGhpcyB0byAyNTUuICBIb3dldmVyLCBkYXJuCisgKiBmZXcgYXBwbGljYXRpb25zIG5lZWQgbW9yZSB0aGFuIDQgY2hhbm5lbHMgKG1heWJlIDUgZm9yIENNWUsgKyBhbHBoYQorICogbWFzaykuICBXZSByZWNvbW1lbmQgMTAgYXMgYSByZWFzb25hYmxlIGNvbXByb21pc2U7IHVzZSA0IGlmIHlvdSBhcmUKKyAqIHJlYWxseSBzaG9ydCBvbiBtZW1vcnkuICAoRWFjaCBhbGxvd2VkIGNvbXBvbmVudCBjb3N0cyBhIGh1bmRyZWQgb3Igc28KKyAqIGJ5dGVzIG9mIHN0b3JhZ2UsIHdoZXRoZXIgYWN0dWFsbHkgdXNlZCBpbiBhbiBpbWFnZSBvciBub3QuKQorICovCisKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVFMgIDEwCS8qIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIGNvbXBvbmVudHMgKi8KKworCisvKgorICogQmFzaWMgZGF0YSB0eXBlcy4KKyAqIFlvdSBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlc2UgaWYgeW91IGhhdmUgYSBtYWNoaW5lIHdpdGggdW51c3VhbCBkYXRhCisgKiB0eXBlIHNpemVzOyBmb3IgZXhhbXBsZSwgImNoYXIiIG5vdCA4IGJpdHMsICJzaG9ydCIgbm90IDE2IGJpdHMsCisgKiBvciAibG9uZyIgbm90IDMyIGJpdHMuICBXZSBkb24ndCBjYXJlIHdoZXRoZXIgImludCIgaXMgMTYgb3IgMzIgYml0cywKKyAqIGJ1dCBpdCBoYWQgYmV0dGVyIGJlIGF0IGxlYXN0IDE2LgorICovCisKKy8qIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHNhbXBsZSAocGl4ZWwgZWxlbWVudCB2YWx1ZSkuCisgKiBXZSBmcmVxdWVudGx5IGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgc28gaXQncyBpbXBvcnRhbnQgdG8ga2VlcAorICogdGhlbSBzbWFsbC4gIEJ1dCBpZiB5b3UgaGF2ZSBtZW1vcnkgdG8gYnVybiBhbmQgYWNjZXNzIHRvIGNoYXIgb3Igc2hvcnQKKyAqIGFycmF5cyBpcyB2ZXJ5IHNsb3cgb24geW91ciBoYXJkd2FyZSwgeW91IG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoZXNlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorLyogSlNBTVBMRSBzaG91bGQgYmUgdGhlIHNtYWxsZXN0IHR5cGUgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbHVlcyAwLi4yNTUuCisgKiBZb3UgY2FuIHVzZSBhIHNpZ25lZCBjaGFyIGJ5IGhhdmluZyBHRVRKU0FNUExFIG1hc2sgaXQgd2l0aCAweEZGLgorICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKKwordHlwZWRlZiB1aW50OF90IEpTQU1QTEU7CisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKKworI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfQ0hBUiAqLworCit0eXBlZGVmIGNoYXIgSlNBTVBMRTsKKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKKyNlbHNlCisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSAmIDB4RkYpCisjZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLworCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKyNkZWZpbmUgTUFYSlNBTVBMRQkyNTUKKyNkZWZpbmUgQ0VOVEVSSlNBTVBMRQkxMjgKKworI2VuZGlmIC8qIEJJVFNfSU5fSlNBTVBMRSA9PSA4ICovCisKKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSAxMgorLyogSlNBTVBMRSBzaG91bGQgYmUgdGhlIHNtYWxsZXN0IHR5cGUgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbHVlcyAwLi40MDk1LgorICogT24gbmVhcmx5IGFsbCBtYWNoaW5lcyAic2hvcnQiIHdpbGwgZG8gbmljZWx5LgorICovCisKK3R5cGVkZWYgaW50MTZfdCBKU0FNUExFOworI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkpCisKKyNkZWZpbmUgTUFYSlNBTVBMRQk0MDk1CisjZGVmaW5lIENFTlRFUkpTQU1QTEUJMjA0OAorCisjZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDEyICovCisKKworLyogUmVwcmVzZW50YXRpb24gb2YgYSBEQ1QgZnJlcXVlbmN5IGNvZWZmaWNpZW50LgorICogVGhpcyBzaG91bGQgYmUgYSBzaWduZWQgdmFsdWUgb2YgYXQgbGVhc3QgMTYgYml0czsgInNob3J0IiBpcyB1c3VhbGx5IE9LLgorICogQWdhaW4sIHdlIGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgYnV0IHlvdSBjYW4gY2hhbmdlIHRvIGludAorICogaWYgeW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kICJzaG9ydCIgaXMgcmVhbGx5IHNsb3cuCisgKi8KKwordHlwZWRlZiBpbnQxNl90IEpDT0VGOworCisKKy8qIENvbXByZXNzZWQgZGF0YXN0cmVhbXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBKT0NURVQuCisgKiBUaGVzZSBtdXN0IGJlIEVYQUNUTFkgOCBiaXRzIHdpZGUsIGF0IGxlYXN0IG9uY2UgdGhleSBhcmUgd3JpdHRlbiB0bworICogZXh0ZXJuYWwgc3RvcmFnZS4gIE5vdGUgdGhhdCB3aGVuIHVzaW5nIHRoZSBzdGRpbyBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbgorICogbWFuYWdlcnMsIHRoaXMgaXMgYWxzbyB0aGUgZGF0YSB0eXBlIHBhc3NlZCB0byBmcmVhZC9md3JpdGUuCisgKi8KKworI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgorCit0eXBlZGVmIHVpbnQ4X3QgSk9DVEVUOworI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAodmFsdWUpCisKKyNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKwordHlwZWRlZiBjaGFyIEpPQ1RFVDsKKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEdFVEpPQ1RFVCh2YWx1ZSkgICh2YWx1ZSkKKyNlbHNlCisjZGVmaW5lIEdFVEpPQ1RFVCh2YWx1ZSkgICgodmFsdWUpICYgMHhGRikKKyNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCisKKyNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKworCisvKiBUaGVzZSB0eXBlZGVmcyBhcmUgdXNlZCBmb3IgdmFyaW91cyB0YWJsZSBlbnRyaWVzIGFuZCBzbyBmb3J0aC4KKyAqIFRoZXkgbXVzdCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIHNwZWNpZmllZDsgYnV0IG1ha2luZyB0aGVtIHRvbyBiaWcKKyAqIHdvbid0IGNvc3QgYSBodWdlIGFtb3VudCBvZiBtZW1vcnksIHNvIHdlIGRvbid0IHByb3ZpZGUgc3BlY2lhbAorICogZXh0cmFjdGlvbiBjb2RlIGxpa2Ugd2UgZGlkIGZvciBKU0FNUExFLiAgKEluIG90aGVyIHdvcmRzLCB0aGVzZQorICogdHlwZWRlZnMgbGl2ZSBhdCBhIGRpZmZlcmVudCBwb2ludCBvbiB0aGUgc3BlZWQvc3BhY2UgdHJhZGVvZmYgY3VydmUuKQorICovCisKKy8qIFVJTlQ4IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIDAuLjI1NS4gKi8KKworI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgordHlwZWRlZiB1aW50OF90IFVJTlQ4OworI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfQ0hBUiAqLworI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKK3R5cGVkZWYgY2hhciBVSU5UODsKKyNlbHNlIC8qIG5vdCBDSEFSX0lTX1VOU0lHTkVEICovCit0eXBlZGVmIHNob3J0IFVJTlQ4OworI2VuZGlmIC8qIENIQVJfSVNfVU5TSUdORUQgKi8KKyNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKworLyogVUlOVDE2IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIDAuLjY1NTM1LiAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9TSE9SVAordHlwZWRlZiB1aW50MTZfdCBVSU5UMTY7CisjZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9TSE9SVCAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDE2OworI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfU0hPUlQgKi8KKworLyogSU5UMTYgbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgLTMyNzY4Li4zMjc2Ny4gKi8KKworI2lmbmRlZiBYTURfSAkJCS8qIFgxMS94bWQuaCBjb3JyZWN0bHkgZGVmaW5lcyBJTlQxNiAqLwordHlwZWRlZiBpbnQxNl90IElOVDE2OworI2VuZGlmCisKKy8qIElOVDMyIG11c3QgaG9sZCBhdCBsZWFzdCBzaWduZWQgMzItYml0IHZhbHVlcy4gKi8KKworI2lmbmRlZiBYTURfSAkJCS8qIFgxMS94bWQuaCBjb3JyZWN0bHkgZGVmaW5lcyBJTlQzMiAqLwordHlwZWRlZiBpbnQzMl90IElOVDMyOworI2VuZGlmCisKKy8qIERhdGF0eXBlIHVzZWQgZm9yIGltYWdlIGRpbWVuc2lvbnMuICBUaGUgSlBFRyBzdGFuZGFyZCBvbmx5IHN1cHBvcnRzCisgKiBpbWFnZXMgdXAgdG8gNjRLKjY0SyBkdWUgdG8gMTYtYml0IGZpZWxkcyBpbiBTT0YgbWFya2Vycy4gIFRoZXJlZm9yZQorICogInVuc2lnbmVkIGludCIgaXMgc3VmZmljaWVudCBvbiBhbGwgbWFjaGluZXMuICBIb3dldmVyLCBpZiB5b3UgbmVlZCB0bworICogaGFuZGxlIGxhcmdlciBpbWFnZXMgYW5kIHlvdSBkb24ndCBtaW5kIGRldmlhdGluZyBmcm9tIHRoZSBzcGVjLCB5b3UKKyAqIGNhbiBjaGFuZ2UgdGhpcyBkYXRhdHlwZS4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBKRElNRU5TSU9OOworCisjZGVmaW5lIEpQRUdfTUFYX0RJTUVOU0lPTiAgNjU1MDBMICAvKiBhIHRhZCB1bmRlciA2NEsgdG8gcHJldmVudCBvdmVyZmxvd3MgKi8KKworCisvKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zLgorICogWW91IGNvdWxkIG1vZGlmeSB0aGVtIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSBmdW5jdGlvbiBsaW5rYWdlIGNvbnZlbnRpb25zOworICogaW4gcGFydGljdWxhciwgeW91J2xsIG5lZWQgdG8gZG8gdGhhdCB0byBtYWtlIHRoZSBsaWJyYXJ5IGEgV2luZG93cyBETEwuCisgKiBBbm90aGVyIGFwcGxpY2F0aW9uIGlzIHRvIG1ha2UgYWxsIGZ1bmN0aW9ucyBnbG9iYWwgZm9yIHVzZSB3aXRoIGRlYnVnZ2VycworICogb3IgY29kZSBwcm9maWxlcnMgdGhhdCByZXF1aXJlIGl0LgorICovCisKKy8qIGEgZnVuY3Rpb24gY2FsbGVkIHRocm91Z2ggbWV0aG9kIHBvaW50ZXJzOiAqLworI2RlZmluZSBNRVRIT0RERUYodHlwZSkJCXN0YXRpYyB0eXBlCisvKiBhIGZ1bmN0aW9uIHVzZWQgb25seSBpbiBpdHMgbW9kdWxlOiAqLworI2RlZmluZSBMT0NBTCh0eXBlKQkJc3RhdGljIHR5cGUKKy8qIGEgZnVuY3Rpb24gcmVmZXJlbmNlZCB0aHJ1IEVYVEVSTnM6ICovCisjZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZQorLyogYSByZWZlcmVuY2UgdG8gYSBHTE9CQUwgZnVuY3Rpb246ICovCisjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIHR5cGUKKworCisvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVjbGFyZSBhICJtZXRob2QiLCB0aGF0IGlzLCBhIGZ1bmN0aW9uIHBvaW50ZXIuCisgKiBXZSB3YW50IHRvIHN1cHBseSBwcm90b3R5cGUgcGFyYW1ldGVycyBpZiB0aGUgY29tcGlsZXIgY2FuIGNvcGUuCisgKiBOb3RlIHRoYXQgdGhlIGFyZ2xpc3QgcGFyYW1ldGVyIG11c3QgYmUgcGFyZW50aGVzaXplZCEKKyAqIEFnYWluLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGlmIHlvdSBuZWVkIHNwZWNpYWwgbGlua2FnZSBrZXl3b3Jkcy4KKyAqLworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgYXJnbGlzdAorI2Vsc2UKKyNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSAoKQorI2VuZGlmCisKKworLyogSGVyZSBpcyB0aGUgcHNldWRvLWtleXdvcmQgZm9yIGRlY2xhcmluZyBwb2ludGVycyB0aGF0IG11c3QgYmUgImZhciIKKyAqIG9uIDgweDg2IG1hY2hpbmVzLiAgTW9zdCBvZiB0aGUgc3BlY2lhbGl6ZWQgY29kaW5nIGZvciA4MHg4NiBpcyBoYW5kbGVkCisgKiBieSBqdXN0IHNheWluZyAiRkFSICoiIHdoZXJlIHN1Y2ggYSBwb2ludGVyIGlzIG5lZWRlZC4gIEluIGEgZmV3IHBsYWNlcworICogZXhwbGljaXQgY29kaW5nIGlzIG5lZWRlZDsgc2VlIHVzZXMgb2YgdGhlIE5FRURfRkFSX1BPSU5URVJTIHN5bWJvbC4KKyAqLworCisjaWZkZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyNkZWZpbmUgRkFSICBmYXIKKyNlbHNlCisjZGVmaW5lIEZBUgorI2VuZGlmCisKKworLyoKKyAqIE9uIGEgZmV3IHN5c3RlbXMsIHR5cGUgYm9vbGVhbiBhbmQvb3IgaXRzIHZhbHVlcyBGQUxTRSwgVFJVRSBtYXkgYXBwZWFyCisgKiBpbiBzdGFuZGFyZCBoZWFkZXIgZmlsZXMuICBPciB5b3UgbWF5IGhhdmUgY29uZmxpY3RzIHdpdGggYXBwbGljYXRpb24tCisgKiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIHRvZ2V0aGVyIHdpdGggdGhlc2UgZmlsZXMuCisgKiBEZWZpbmluZyBIQVZFX0JPT0xFQU4gYmVmb3JlIGluY2x1ZGluZyBqcGVnbGliLmggc2hvdWxkIG1ha2UgaXQgd29yay4KKyAqLworCisjaWZuZGVmIEhBVkVfQk9PTEVBTgordHlwZWRlZiBpbnQgYm9vbGVhbjsKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQkJCS8qIGluIGNhc2UgdGhlc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QgKi8KKyNkZWZpbmUgRkFMU0UJMAkJLyogdmFsdWVzIG9mIGJvb2xlYW4gKi8KKyNlbmRpZgorI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUJMQorI2VuZGlmCisKKworLyoKKyAqIFRoZSByZW1haW5pbmcgb3B0aW9ucyBhZmZlY3QgY29kZSBzZWxlY3Rpb24gd2l0aGluIHRoZSBKUEVHIGxpYnJhcnksCisgKiBidXQgdGhleSBkb24ndCBuZWVkIHRvIGJlIHZpc2libGUgdG8gbW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgb3IgSlBFR19JTlRFUk5BTF9PUFRJT05TIGhhcyBiZWVuIGRlZmluZWQuCisgKi8KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisjZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUworI2VuZGlmCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMX09QVElPTlMKKworCisvKgorICogVGhlc2UgZGVmaW5lcyBpbmRpY2F0ZSB3aGV0aGVyIHRvIGluY2x1ZGUgdmFyaW91cyBvcHRpb25hbCBmdW5jdGlvbnMuCisgKiBVbmRlZmluaW5nIHNvbWUgb2YgdGhlc2Ugc3ltYm9scyB3aWxsIHByb2R1Y2UgYSBzbWFsbGVyIGJ1dCBsZXNzIGNhcGFibGUKKyAqIGxpYnJhcnkuICBOb3RlIHRoYXQgeW91IGNhbiBsZWF2ZSBjZXJ0YWluIHNvdXJjZSBmaWxlcyBvdXQgb2YgdGhlCisgKiBjb21waWxhdGlvbi9saW5raW5nIHByb2Nlc3MgaWYgeW91J3ZlICN1bmRlZidkIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbHMuCisgKiAoWW91IG1heSBIQVZFIHRvIGRvIHRoYXQgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGxpa2UgbnVsbCBzb3VyY2UgZmlsZXMuKQorICovCisKKy8qIEFyaXRobWV0aWMgY29kaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLiAgQ29tcGxhaW50cyB0byBJQk0uICovCisKKy8qIENhcGFiaWxpdHkgb3B0aW9ucyBjb21tb24gdG8gZW5jb2RlciBhbmQgZGVjb2RlcjogKi8KKworI2RlZmluZSBEQ1RfSVNMT1dfU1VQUE9SVEVECS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCisjZGVmaW5lIERDVF9JRkFTVF9TVVBQT1JURUQJLyogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kICovCisjZGVmaW5lIERDVF9GTE9BVF9TVVBQT1JURUQJLyogZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFcgKi8KKworLyogRW5jb2RlciBjYXBhYmlsaXR5IG9wdGlvbnM6ICovCisKKyN1bmRlZiAgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVEICAgIC8qIEFyaXRobWV0aWMgY29kaW5nIGJhY2sgZW5kPyAqLworI2RlZmluZSBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgLyogTXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzPyAqLworI2RlZmluZSBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAkgICAgLyogUHJvZ3Jlc3NpdmUgSlBFRz8gKFJlcXVpcmVzIE1VTFRJU0NBTikqLworI2RlZmluZSBFTlRST1BZX09QVF9TVVBQT1JURUQJICAgIC8qIE9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGNvZGluZyBwYXJtcz8gKi8KKy8qIE5vdGU6IGlmIHlvdSBzZWxlY3RlZCAxMi1iaXQgZGF0YSBwcmVjaXNpb24sIGl0IGlzIGRhbmdlcm91cyB0byB0dXJuIG9mZgorICogRU5UUk9QWV9PUFRfU1VQUE9SVEVELiAgVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IGdvb2QgZm9yIDgtYml0CisgKiBwcmVjaXNpb24sIHNvIGpjaHVmZi5jIG5vcm1hbGx5IHVzZXMgZW50cm9weSBvcHRpbWl6YXRpb24gdG8gY29tcHV0ZQorICogdXNhYmxlIHRhYmxlcyBmb3IgaGlnaGVyIHByZWNpc2lvbi4gIElmIHlvdSBkb24ndCB3YW50IHRvIGRvIG9wdGltaXphdGlvbiwKKyAqIHlvdSdsbCBoYXZlIHRvIHN1cHBseSBkaWZmZXJlbnQgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KKyAqIFRoZSBleGFjdCBzYW1lIHN0YXRlbWVudHMgYXBwbHkgZm9yIHByb2dyZXNzaXZlIEpQRUc6IHRoZSBkZWZhdWx0IHRhYmxlcworICogZG9uJ3Qgd29yayBmb3IgcHJvZ3Jlc3NpdmUgbW9kZS4gIChUaGlzIG1heSBnZXQgZml4ZWQsIGhvd2V2ZXIuKQorICovCisjZGVmaW5lIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgICAvKiBJbnB1dCBpbWFnZSBzbW9vdGhpbmcgb3B0aW9uPyAqLworCisvKiBEZWNvZGVyIGNhcGFiaWxpdHkgb3B0aW9uczogKi8KKworI3VuZGVmICBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCisjZGVmaW5lIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCisjZGVmaW5lIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCisjZGVmaW5lIFNBVkVfTUFSS0VSU19TVVBQT1JURUQJICAgIC8qIGpwZWdfc2F2ZV9tYXJrZXJzKCkgbmVlZGVkPyAqLworI2RlZmluZSBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICAgLyogQmxvY2sgc21vb3RoaW5nPyAoUHJvZ3Jlc3NpdmUgb25seSkgKi8KKyNkZWZpbmUgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAkgICAgLyogT3V0cHV0IHJlc2NhbGluZyB2aWEgSURDVD8gKi8KKyN1bmRlZiAgVVBTQU1QTEVfU0NBTElOR19TVVBQT1JURUQgIC8qIE91dHB1dCByZXNjYWxpbmcgYXQgdXBzYW1wbGUgc3RhZ2U/ICovCisjZGVmaW5lIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICAvKiBGYXN0IHBhdGggZm9yIHNsb3BweSB1cHNhbXBsaW5nPyAqLworI2RlZmluZSBRVUFOVF8xUEFTU19TVVBQT1JURUQJICAgIC8qIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24/ICovCisjZGVmaW5lIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkgICAgLyogMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbj8gKi8KKworLyogbW9yZSBjYXBhYmlsaXR5IG9wdGlvbnMgbGF0ZXIsIG5vIGRvdWJ0ICovCisKKworLyoKKyAqIE9yZGVyaW5nIG9mIFJHQiBkYXRhIGluIHNjYW5saW5lcyBwYXNzZWQgdG8gb3IgZnJvbSB0aGUgYXBwbGljYXRpb24uCisgKiBJZiB5b3VyIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRlYWwgd2l0aCBkYXRhIGluIHRoZSBvcmRlciBCLEcsUiwganVzdAorICogY2hhbmdlIHRoZXNlIG1hY3Jvcy4gIFlvdSBjYW4gYWxzbyBkZWFsIHdpdGggZm9ybWF0cyBzdWNoIGFzIFIsRyxCLFgKKyAqIChvbmUgZXh0cmEgYnl0ZSBwZXIgcGl4ZWwpIGJ5IGNoYW5naW5nIFJHQl9QSVhFTFNJWkUuICBOb3RlIHRoYXQgY2hhbmdpbmcKKyAqIHRoZSBvZmZzZXRzIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIGNvbG9ybWFwIGRhdGEgaXMgb3JnYW5pemVkLgorICogUkVTVFJJQ1RJT05TOgorICogMS4gVGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcsZGpwZWcgZG8gTk9UIHN1cHBvcnQgbW9kaWZpZWQgUkdCIGZvcm1hdHMuCisgKiAyLiBUaGVzZSBtYWNyb3Mgb25seSBhZmZlY3QgUkdCPD0+WUNiQ3IgY29sb3IgY29udmVyc2lvbiwgc28gdGhleSBhcmUgbm90CisgKiAgICB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBKUEVHIGNvbG9yIHNwYWNlcyBvdGhlciB0aGFuIFlDYkNyIG9yIGdyYXlzY2FsZS4KKyAqIDMuIFRoZSBjb2xvciBxdWFudGl6ZXIgbW9kdWxlcyB3aWxsIG5vdCBiZWhhdmUgZGVzaXJhYmx5IGlmIFJHQl9QSVhFTFNJWkUKKyAqICAgIGlzIG5vdCAzICh0aGV5IGRvbid0IHVuZGVyc3RhbmQgYWJvdXQgZHVtbXkgY29sb3IgY29tcG9uZW50cyEpLiAgU28geW91CisgKiAgICBjYW4ndCB1c2UgY29sb3IgcXVhbnRpemF0aW9uIGlmIHlvdSBjaGFuZ2UgdGhhdCB2YWx1ZS4KKyAqLworCisjZGVmaW5lIFJHQl9SRUQJCTAJLyogT2Zmc2V0IG9mIFJlZCBpbiBhbiBSR0Igc2NhbmxpbmUgZWxlbWVudCAqLworI2RlZmluZSBSR0JfR1JFRU4JMQkvKiBPZmZzZXQgb2YgR3JlZW4gKi8KKyNkZWZpbmUgUkdCX0JMVUUJMgkvKiBPZmZzZXQgb2YgQmx1ZSAqLworI2lmZGVmIEFORFJPSURfUkdCCisjZGVmaW5lIFJHQl9BTFBIQSAgIDMgICAvKiBPZmZzZXQgb2YgQWxwaGEgKi8KKyNlbmRpZgorI2RlZmluZSBSR0JfUElYRUxTSVpFICAgMyAgIC8qIEpTQU1QTEVzIHBlciBSR0Igc2NhbmxpbmUgZWxlbWVudCAqLworCisvKiBEZWZpbml0aW9ucyBmb3Igc3BlZWQtcmVsYXRlZCBvcHRpbWl6YXRpb25zLiAqLworCisKKy8qIElmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lIGZ1bmN0aW9ucywgZGVmaW5lIElOTElORQorICogYXMgdGhlIGlubGluZSBrZXl3b3JkOyBvdGhlcndpc2UgZGVmaW5lIGl0IGFzIGVtcHR5LgorICovCisKKyNpZm5kZWYgSU5MSU5FCisjaWZkZWYgX19HTlVDX18JCQkvKiBmb3IgaW5zdGFuY2UsIEdOVSBDIGtub3dzIGFib3V0IGlubGluZSAqLworI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2VuZGlmCisjaWZuZGVmIElOTElORQorI2RlZmluZSBJTkxJTkUJCQkvKiBkZWZhdWx0IGlzIHRvIGRlZmluZSBpdCBhcyBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBPbiBzb21lIG1hY2hpbmVzIChub3RhYmx5IDY4MDAwIHNlcmllcykgImludCIgaXMgMzIgYml0cywgYnV0IG11bHRpcGx5aW5nCisgKiB0d28gMTYtYml0IHNob3J0cyBpcyBmYXN0ZXIgdGhhbiBtdWx0aXBseWluZyB0d28gaW50cy4gIERlZmluZSBNVUxUSVBMSUVSCisgKiBhcyBzaG9ydCBvbiBzdWNoIGEgbWFjaGluZS4gIE1VTFRJUExJRVIgbXVzdCBiZSBhdCBsZWFzdCAxNiBiaXRzIHdpZGUuCisgKi8KKworI2lmbmRlZiBNVUxUSVBMSUVSCisjaWZkZWYgQU5EUk9JRF9JTlRFTFNTRTJfSURDVAorICAjZGVmaW5lIE1VTFRJUExJRVIgc2hvcnQKKyNlbGlmIEFORFJPSURfTUlQU19JRENUCisgICNkZWZpbmUgTVVMVElQTElFUiAgc2hvcnQKKyNlbGlmIGRlZmluZWQoTlZfQVJNX05FT04pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pCisgICNkZWZpbmUgTVVMVElQTElFUiBzaG9ydAorI2Vsc2UKKyAgI2RlZmluZSBNVUxUSVBMSUVSICBpbnQJCS8qIHR5cGUgZm9yIGZhc3Rlc3QgaW50ZWdlciBtdWx0aXBseSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBGQVNUX0ZMT0FUIHNob3VsZCBiZSBlaXRoZXIgZmxvYXQgb3IgZG91YmxlLCB3aGljaGV2ZXIgaXMgZG9uZSBmYXN0ZXIKKyAqIGJ5IHlvdXIgY29tcGlsZXIuICAoTm90ZSB0aGF0IHRoaXMgdHlwZSBpcyBvbmx5IHVzZWQgaW4gdGhlIGZsb2F0aW5nIHBvaW50CisgKiBEQ1Qgcm91dGluZXMsIHNvIGl0IG9ubHkgbWF0dGVycyBpZiB5b3UndmUgZGVmaW5lZCBEQ1RfRkxPQVRfU1VQUE9SVEVELikKKyAqIFR5cGljYWxseSwgZmxvYXQgaXMgZmFzdGVyIGluIEFOU0kgQyBjb21waWxlcnMsIHdoaWxlIGRvdWJsZSBpcyBmYXN0ZXIgaW4KKyAqIHByZS1BTlNJIGNvbXBpbGVycyAoYmVjYXVzZSB0aGV5IGluc2lzdCBvbiBjb252ZXJ0aW5nIHRvIGRvdWJsZSBhbnl3YXkpLgorICogVGhlIGNvZGUgYmVsb3cgdGhlcmVmb3JlIGNob29zZXMgZmxvYXQgaWYgd2UgaGF2ZSBBTlNJLXN0eWxlIHByb3RvdHlwZXMuCisgKi8KKworI2lmbmRlZiBGQVNUX0ZMT0FUCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEZBU1RfRkxPQVQgIGZsb2F0CisjZWxzZQorI2RlZmluZSBGQVNUX0ZMT0FUICBkb3VibGUKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMX09QVElPTlMgKi8KKworI2VuZGlmIC8qIEpNT1JFQ0ZHX0ggKi8KZGlmZiAtLWdpdCBhL2pwZWcvanBlZ2ludC5oIGIvanBlZy9qcGVnaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NTExZQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvanBlZ2ludC5oCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICoganBlZ2ludC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHZhcmlvdXMgSlBFRyBtb2R1bGVzLgorICogVGhlc2UgZGVjbGFyYXRpb25zIGFyZSBjb25zaWRlcmVkIGludGVybmFsIHRvIHRoZSBKUEVHIGxpYnJhcnk7IG1vc3QKKyAqIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGRuJ3QgbmVlZCB0byBpbmNsdWRlIHRoaXMgZmlsZS4KKyAqLworCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgYm90aCBjb21wcmVzc2lvbiAmIGRlY29tcHJlc3Npb24gKi8KKwordHlwZWRlZiBlbnVtIHsJCQkvKiBPcGVyYXRpbmcgbW9kZXMgZm9yIGJ1ZmZlciBjb250cm9sbGVycyAqLworCUpCVUZfUEFTU19USFJVLAkJLyogUGxhaW4gc3RyaXB3aXNlIG9wZXJhdGlvbiAqLworCS8qIFJlbWFpbmluZyBtb2RlcyByZXF1aXJlIGEgZnVsbC1pbWFnZSBidWZmZXIgdG8gaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KKwlKQlVGX1NBVkVfU09VUkNFLAkvKiBSdW4gc291cmNlIHN1Ym9iamVjdCBvbmx5LCBzYXZlIG91dHB1dCAqLworCUpCVUZfQ1JBTktfREVTVCwJLyogUnVuIGRlc3Qgc3Vib2JqZWN0IG9ubHksIHVzaW5nIHNhdmVkIGRhdGEgKi8KKwlKQlVGX1NBVkVfQU5EX1BBU1MJLyogUnVuIGJvdGggc3Vib2JqZWN0cywgc2F2ZSBvdXRwdXQgKi8KK30gSl9CVUZfTU9ERTsKKworLyogVmFsdWVzIG9mIGdsb2JhbF9zdGF0ZSBmaWVsZCAoamRhcGkuYyBoYXMgc29tZSBkZXBlbmRlbmNpZXMgb24gb3JkZXJpbmchKSAqLworI2RlZmluZSBDU1RBVEVfU1RBUlQJMTAwCS8qIGFmdGVyIGNyZWF0ZV9jb21wcmVzcyAqLworI2RlZmluZSBDU1RBVEVfU0NBTk5JTkcJMTAxCS8qIHN0YXJ0X2NvbXByZXNzIGRvbmUsIHdyaXRlX3NjYW5saW5lcyBPSyAqLworI2RlZmluZSBDU1RBVEVfUkFXX09LCTEwMgkvKiBzdGFydF9jb21wcmVzcyBkb25lLCB3cml0ZV9yYXdfZGF0YSBPSyAqLworI2RlZmluZSBDU1RBVEVfV1JDT0VGUwkxMDMJLyoganBlZ193cml0ZV9jb2VmZmljaWVudHMgZG9uZSAqLworI2RlZmluZSBEU1RBVEVfU1RBUlQJMjAwCS8qIGFmdGVyIGNyZWF0ZV9kZWNvbXByZXNzICovCisjZGVmaW5lIERTVEFURV9JTkhFQURFUgkyMDEJLyogcmVhZGluZyBoZWFkZXIgbWFya2Vycywgbm8gU09TIHlldCAqLworI2RlZmluZSBEU1RBVEVfUkVBRFkJMjAyCS8qIGZvdW5kIFNPUywgcmVhZHkgZm9yIHN0YXJ0X2RlY29tcHJlc3MgKi8KKyNkZWZpbmUgRFNUQVRFX1BSRUxPQUQJMjAzCS8qIHJlYWRpbmcgbXVsdGlzY2FuIGZpbGUgaW4gc3RhcnRfZGVjb21wcmVzcyovCisjZGVmaW5lIERTVEFURV9QUkVTQ0FOCTIwNAkvKiBwZXJmb3JtaW5nIGR1bW15IHBhc3MgZm9yIDItcGFzcyBxdWFudCAqLworI2RlZmluZSBEU1RBVEVfU0NBTk5JTkcJMjA1CS8qIHN0YXJ0X2RlY29tcHJlc3MgZG9uZSwgcmVhZF9zY2FubGluZXMgT0sgKi8KKyNkZWZpbmUgRFNUQVRFX1JBV19PSwkyMDYJLyogc3RhcnRfZGVjb21wcmVzcyBkb25lLCByZWFkX3Jhd19kYXRhIE9LICovCisjZGVmaW5lIERTVEFURV9CVUZJTUFHRQkyMDcJLyogZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0ICovCisjZGVmaW5lIERTVEFURV9CVUZQT1NUCTIwOAkvKiBsb29raW5nIGZvciBTT1MvRU9JIGluIGpwZWdfZmluaXNoX291dHB1dCAqLworI2RlZmluZSBEU1RBVEVfUkRDT0VGUwkyMDkJLyogcmVhZGluZyBmaWxlIGluIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgRFNUQVRFX1NUT1BQSU5HCTIxMAkvKiBsb29raW5nIGZvciBFT0kgaW4ganBlZ19maW5pc2hfZGVjb21wcmVzcyAqLworCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgY29tcHJlc3Npb24gbW9kdWxlcyAqLworCisvKiBNYXN0ZXIgY29udHJvbCBtb2R1bGUgKi8KK3N0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBwcmVwYXJlX2Zvcl9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBwYXNzX3N0YXJ0dXAsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgYm9vbGVhbiBjYWxsX3Bhc3Nfc3RhcnR1cDsJLyogVHJ1ZSBpZiBwYXNzX3N0YXJ0dXAgbXVzdCBiZSBjYWxsZWQgKi8KKyAgYm9vbGVhbiBpc19sYXN0X3Bhc3M7CQkvKiBUcnVlIGR1cmluZyBsYXN0IHBhc3MgKi8KK307CisKKy8qIE1haW4gYnVmZmVyIGNvbnRyb2wgKGRvd25zYW1wbGVkLWRhdGEgYnVmZmVyKSAqLworc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKKyAgSk1FVEhPRCh2b2lkLCBwcm9jZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKK307CisKKy8qIENvbXByZXNzaW9uIHByZXByb2Nlc3NpbmcgKGRvd25zYW1wbGluZyBpbnB1dCBidWZmZXIgY29udHJvbCkgKi8KK3N0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7CisgIEpNRVRIT0Qodm9pZCwgcHJlX3Byb2Nlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkJCSAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCisJCQkJICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAorCQkJCSAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJCQkgICBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJCQkgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKSk7Cit9OworCisvKiBDb2VmZmljaWVudCBidWZmZXIgY29udHJvbCAqLworc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKKyAgSk1FVEhPRChib29sZWFuLCBjb21wcmVzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKK307CisKKy8qIENvbG9yc3BhY2UgY29udmVyc2lvbiAqLworc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBjb2xvcl9jb252ZXJ0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJCQlKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykpOworfTsKKworLyogRG93bnNhbXBsaW5nICovCitzdHJ1Y3QganBlZ19kb3duc2FtcGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfaW5kZXgsCisJCQkgICAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3VwX2luZGV4KSk7CisKKyAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogVFJVRSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLworfTsKKworLyogRm9yd2FyZCBEQ1QgKGFsc28gY29udHJvbHMgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uKSAqLworc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICAvKiBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIGFuIGFycmF5Pz8/ICovCisgIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1QsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkJICAgICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAorCQkJICAgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAorCQkJICAgICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKSk7Cit9OworCisvKiBFbnRyb3B5IGVuY29kaW5nICovCitzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljcykpOworICBKTUVUSE9EKGJvb2xlYW4sIGVuY29kZV9tY3UsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK307CisKKy8qIE1hcmtlciB3cml0aW5nICovCitzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9maWxlX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfZnJhbWVfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9zY2FuX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfZmlsZV90cmFpbGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV90YWJsZXNfb25seSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIFRoZXNlIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0byBhbGxvdyBpbnNlcnRpb24gb2YgZXh0cmEgbWFya2VycyAqLworICAvKiBQcm9iYWJseSBvbmx5IENPTSBhbmQgQVBQbiBtYXJrZXJzIHNob3VsZCBiZSB3cml0dGVuIHRoaXMgd2F5ICovCisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2J5dGUsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkpOworfTsKKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIGRlY29tcHJlc3Npb24gbW9kdWxlcyAqLworCisvKiBNYXN0ZXIgY29udHJvbCBtb2R1bGUgKi8KK3N0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgeworICBKTUVUSE9EKHZvaWQsIHByZXBhcmVfZm9yX291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgYm9vbGVhbiBpc19kdW1teV9wYXNzOwkvKiBUcnVlIGR1cmluZyAxc3QgcGFzcyBmb3IgMi1wYXNzIHF1YW50ICovCit9OworCisvKiBJbnB1dCBjb250cm9sIG1vZHVsZSAqLworc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciB7CisgIEpNRVRIT0QoaW50LCBjb25zdW1lX2lucHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGludCwgY29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBzY2FuX2NvdW50KSk7CisgIEpNRVRIT0QoaW50LCBjb25zdW1lX21hcmtlcnMsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IHNjYW5fY291bnQpKTsKKyAgSk1FVEhPRCh2b2lkLCByZXNldF9pbnB1dF9jb250cm9sbGVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKyAgLyogU3RhdGUgdmFyaWFibGVzIG1hZGUgdmlzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCisgIGJvb2xlYW4gaGFzX211bHRpcGxlX3NjYW5zOwkvKiBUcnVlIGlmIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zICovCisgIGJvb2xlYW4gZW9pX3JlYWNoZWQ7CQkvKiBUcnVlIHdoZW4gRU9JIGhhcyBiZWVuIGNvbnN1bWVkICovCit9OworCisvKiBNYWluIGJ1ZmZlciBjb250cm9sIChkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlcikgKi8KK3N0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKKyAgSk1FVEhPRCh2b2lkLCBwcm9jZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworfTsKKworLyogQ29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2wgKi8KK3N0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGludCwgY29uc3VtZV9kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGludCwgY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXgsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4KiBpbmRleCwgaW50IHNjYW5fY291bnQpKTsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChpbnQsIGRlY29tcHJlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOworICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGNvZWZmaWNpZW50IHZpcnR1YWwgYXJyYXlzLCBvciBOVUxMIGlmIG5vbmUgKi8KKyAganZpcnRfYmFycmF5X3B0ciAqY29lZl9hcnJheXM7CisKKyAgLyogY29sdW1uIG51bWJlciBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgdGlsZSwgcmVzcGVjdGl2ZWx5ICovCisgIGludCBjb2x1bW5fbGVmdF9ib3VuZGFyeTsKKyAgaW50IGNvbHVtbl9yaWdodF9ib3VuZGFyeTsKKworICAvKiBjb2x1bW4gbnVtYmVyIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBNQ1UsIHJlc3BlY3RpdmVseSAqLworICBpbnQgTUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5OworICBpbnQgTUNVX2NvbHVtbl9yaWdodF9ib3VuZGFyeTsKKworICAvKiB0aGUgbnVtYmVyIG9mIE1DVSBjb2x1bW5zIHRvIHNraXAgZnJvbSB0aGUgaW5kZXhlZCBNQ1UsIGlNLAorICAgKiB0byB0aGUgcmVxdWVzdGVkIE1DVSBib3VuZGFyeSwgck0sIHdoZXJlIGlNIGlzIHRoZSBNQ1UgdGhhdCB3ZSBzYW1wbGUKKyAgICogaW50byBvdXIgaW5kZXggYW5kIGlzIHRoZSBuZWFyZXN0IG9uZSB0byB0aGUgbGVmdCBvZiByTS4KKyAgICovCisgIGludCBNQ1VfY29sdW1uc190b19za2lwOworfTsKKworLyogRGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZyAoY29sb3IgcXVhbnRpemF0aW9uIGJ1ZmZlciBjb250cm9sKSAqLworc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKHZvaWQsIHBvc3RfcHJvY2Vzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsCisJCQkJICAgIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJCQkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCQkJCSAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworfTsKKworLyogTWFya2VyIHJlYWRpbmcgJiBwYXJzaW5nICovCitzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHsKKyAgSk1FVEhPRCh2b2lkLCByZXNldF9tYXJrZXJfcmVhZGVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICAvKiBSZWFkIG1hcmtlcnMgdW50aWwgU09TIG9yIEVPSS4KKyAgICogUmV0dXJucyBzYW1lIGNvZGVzIGFzIGFyZSBkZWZpbmVkIGZvciBqcGVnX2NvbnN1bWVfaW5wdXQ6CisgICAqIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgorICAgKi8KKyAgSk1FVEhPRChpbnQsIHJlYWRfbWFya2VycywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBnZXRfc29zX21hcmtlcl9wb3NpdGlvbiwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4KSk7CisgIC8qIFJlYWQgYSByZXN0YXJ0IG1hcmtlciAtLS0gZXhwb3J0ZWQgZm9yIHVzZSBieSBlbnRyb3B5IGRlY29kZXIgb25seSAqLworICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJlYWRfcmVzdGFydF9tYXJrZXI7CisKKyAgLyogU3RhdGUgb2YgbWFya2VyIHJlYWRlciAtLS0gbm9taW5hbGx5IGludGVybmFsLCBidXQgYXBwbGljYXRpb25zCisgICAqIHN1cHBseWluZyBDT00gb3IgQVBQbiBoYW5kbGVycyBtaWdodCBsaWtlIHRvIGtub3cgdGhlIHN0YXRlLgorICAgKi8KKyAgYm9vbGVhbiBzYXdfU09JOwkJLyogZm91bmQgU09JPyAqLworICBib29sZWFuIHNhd19TT0Y7CQkvKiBmb3VuZCBTT0Y/ICovCisgIGludCBuZXh0X3Jlc3RhcnRfbnVtOwkJLyogbmV4dCByZXN0YXJ0IG51bWJlciBleHBlY3RlZCAoMC03KSAqLworICBpbnQgY3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uOworICB1bnNpZ25lZCBpbnQgZGlzY2FyZGVkX2J5dGVzOwkvKiAjIG9mIGJ5dGVzIHNraXBwZWQgbG9va2luZyBmb3IgYSBtYXJrZXIgKi8KK307CisKKy8qIEVudHJvcHkgZGVjb2RpbmcgKi8KK3N0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChib29sZWFuLCBkZWNvZGVfbWN1LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQlKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KSk7CisgIEpNRVRIT0Qodm9pZCwgZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KSk7CisKKyAgLyogVGhpcyBpcyBoZXJlIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiBiYXNlbGluZSBhbmQgcHJvZ3Jlc3NpdmUgZGVjb2RlcnM7ICovCisgIC8qIG90aGVyIG1vZHVsZXMgcHJvYmFibHkgc2hvdWxkIG5vdCB1c2UgaXQgKi8KKyAgYm9vbGVhbiBpbnN1ZmZpY2llbnRfZGF0YTsJLyogc2V0IFRSVUUgYWZ0ZXIgZW1pdHRpbmcgd2FybmluZyAqLworCisgIGh1ZmZtYW5faW5kZXggKmluZGV4OworfTsKKworLyogSW52ZXJzZSBEQ1QgKGFsc28gcGVyZm9ybXMgZGVxdWFudGl6YXRpb24pICovCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciwKKwkJKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CisKK3N0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICAvKiBJdCBpcyB1c2VmdWwgdG8gYWxsb3cgZWFjaCBjb21wb25lbnQgdG8gaGF2ZSBhIHNlcGFyYXRlIElEQ1QgbWV0aG9kLiAqLworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUW01BWF9DT01QT05FTlRTXTsKK307CisKKy8qIFVwc2FtcGxpbmcgKG5vdGUgdGhhdCB1cHNhbXBsZXIgbXVzdCBhbHNvIGNhbGwgY29sb3IgY29udmVydGVyKSAqLworc3RydWN0IGpwZWdfdXBzYW1wbGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHVwc2FtcGxlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAorCQkJICAgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJCSAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKwkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworCisgIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KK307CisKKy8qIENvbG9yc3BhY2UgY29udmVyc2lvbiAqLworc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgY29sb3JfY29udmVydCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKSk7Cit9OworCisvKiBDb2xvciBxdWFudGl6YXRpb24gb3IgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiAqLworc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19wcmVfc2NhbikpOworICBKTUVUSE9EKHZvaWQsIGNvbG9yX3F1YW50aXplLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKwkJCQkgaW50IG51bV9yb3dzKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgbmV3X2NvbG9yX21hcCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK307CisKKworLyogTWlzY2VsbGFuZW91cyB1c2VmdWwgbWFjcm9zICovCisKKyN1bmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKKyN1bmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKKworCisvKiBXZSBhc3N1bWUgdGhhdCByaWdodCBzaGlmdCBjb3JyZXNwb25kcyB0byBzaWduZWQgZGl2aXNpb24gYnkgMiB3aXRoCisgKiByb3VuZGluZyB0b3dhcmRzIG1pbnVzIGluZmluaXR5LiAgVGhpcyBpcyBjb3JyZWN0IGZvciB0eXBpY2FsICJhcml0aG1ldGljCisgKiBzaGlmdCIgaW5zdHJ1Y3Rpb25zIHRoYXQgc2hpZnQgaW4gY29waWVzIG9mIHRoZSBzaWduIGJpdC4gIEJ1dCBzb21lCisgKiBDIGNvbXBpbGVycyBpbXBsZW1lbnQgPj4gd2l0aCBhbiB1bnNpZ25lZCBzaGlmdC4gIEZvciB0aGVzZSBtYWNoaW5lcyB5b3UKKyAqIG11c3QgZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVELgorICogUklHSFRfU0hJRlQgcHJvdmlkZXMgYSBwcm9wZXIgc2lnbmVkIHJpZ2h0IHNoaWZ0IG9mIGFuIElOVDMyIHF1YW50aXR5LgorICogSXQgaXMgb25seSBhcHBsaWVkIHdpdGggY29uc3RhbnQgc2hpZnQgY291bnRzLiAgU0hJRlRfVEVNUFMgbXVzdCBiZQorICogaW5jbHVkZWQgaW4gdGhlIHZhcmlhYmxlcyBvZiBhbnkgcm91dGluZSB1c2luZyBSSUdIVF9TSElGVC4KKyAqLworCisjaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKyNkZWZpbmUgU0hJRlRfVEVNUFMJSU5UMzIgc2hpZnRfdGVtcDsKKyNkZWZpbmUgUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorCSgoc2hpZnRfdGVtcCA9ICh4KSkgPCAwID8gXAorCSAoc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+KChJTlQzMikgMCkpIDw8ICgzMi0oc2hmdCkpKSA6IFwKKwkgKHNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKKyNlbHNlCisjZGVmaW5lIFNISUZUX1RFTVBTCisjZGVmaW5lIFJJR0hUX1NISUZUKHgsc2hmdCkJKCh4KSA+PiAoc2hmdCkpCisjZW5kaWYKKworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUgamluaXRfY29tcHJlc3NfbWFzdGVyCWpJQ29tcHJlc3MKKyNkZWZpbmUgamluaXRfY19tYXN0ZXJfY29udHJvbAlqSUNNYXN0ZXIKKyNkZWZpbmUgamluaXRfY19tYWluX2NvbnRyb2xsZXIJaklDTWFpbkMKKyNkZWZpbmUgamluaXRfY19wcmVwX2NvbnRyb2xsZXIJaklDUHJlcEMKKyNkZWZpbmUgamluaXRfY19jb2VmX2NvbnRyb2xsZXIJaklDQ29lZkMKKyNkZWZpbmUgamluaXRfY29sb3JfY29udmVydGVyCWpJQ0NvbG9yCisjZGVmaW5lIGppbml0X2Rvd25zYW1wbGVyCWpJRG93bnNhbXBsZXIKKyNkZWZpbmUgamluaXRfZm9yd2FyZF9kY3QJaklGRENUCisjZGVmaW5lIGppbml0X2h1ZmZfZW5jb2RlcglqSUhFbmNvZGVyCisjZGVmaW5lIGppbml0X3BodWZmX2VuY29kZXIJaklQSEVuY29kZXIKKyNkZWZpbmUgamluaXRfbWFya2VyX3dyaXRlcglqSU1Xcml0ZXIKKyNkZWZpbmUgamluaXRfbWFzdGVyX2RlY29tcHJlc3MJaklETWFzdGVyCisjZGVmaW5lIGppbml0X2RfbWFpbl9jb250cm9sbGVyCWpJRE1haW5DCisjZGVmaW5lIGppbml0X2RfY29lZl9jb250cm9sbGVyCWpJRENvZWZDCisjZGVmaW5lIGppbml0X2RfcG9zdF9jb250cm9sbGVyCWpJRFBvc3RDCisjZGVmaW5lIGppbml0X2lucHV0X2NvbnRyb2xsZXIJaklJbkN0bHIKKyNkZWZpbmUgamluaXRfbWFya2VyX3JlYWRlcglqSU1SZWFkZXIKKyNkZWZpbmUgamluaXRfaHVmZl9kZWNvZGVyCWpJSERlY29kZXIKKyNkZWZpbmUgamluaXRfcGh1ZmZfZGVjb2RlcglqSVBIRGVjb2RlcgorI2RlZmluZSBqaW5pdF9pbnZlcnNlX2RjdAlqSUlEQ1QKKyNkZWZpbmUgamluaXRfdXBzYW1wbGVyCQlqSVVwc2FtcGxlcgorI2RlZmluZSBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlcglqSURDb2xvcgorI2RlZmluZSBqaW5pdF8xcGFzc19xdWFudGl6ZXIJakkxUXVhbnQKKyNkZWZpbmUgamluaXRfMnBhc3NfcXVhbnRpemVyCWpJMlF1YW50CisjZGVmaW5lIGppbml0X21lcmdlZF91cHNhbXBsZXIJaklNVXBzYW1wbGVyCisjZGVmaW5lIGppbml0X21lbW9yeV9tZ3IJaklNZW1NZ3IKKyNkZWZpbmUgamRpdl9yb3VuZF91cAkJakRpdlJvdW5kCisjZGVmaW5lIGpyb3VuZF91cAkJalJvdW5kCisjZGVmaW5lIGpjb3B5X3NhbXBsZV9yb3dzCWpDb3B5U2FtcGxlcworI2RlZmluZSBqY29weV9ibG9ja19yb3cJCWpDb3B5QmxvY2tzCisjZGVmaW5lIGp6ZXJvX2ZhcgkJalplcm9GYXIKKyNkZWZpbmUganBlZ196aWd6YWdfb3JkZXIJalpJR1RhYmxlCisjZGVmaW5lIGpwZWdfbmF0dXJhbF9vcmRlcglqWkFHVGFibGUKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKworLyogQ29tcHJlc3Npb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitFWFRFUk4odm9pZCkgamluaXRfY29tcHJlc3NfbWFzdGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jX21hc3Rlcl9jb250cm9sIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSBib29sZWFuIHRyYW5zY29kZV9vbmx5KSk7CitFWFRFUk4odm9pZCkgamluaXRfY19tYWluX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jX3ByZXBfY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2NfY29lZl9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfY29sb3JfY29udmVydGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9kb3duc2FtcGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfZm9yd2FyZF9kY3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2h1ZmZfZW5jb2RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfcGh1ZmZfZW5jb2RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfbWFya2VyX3dyaXRlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisvKiBEZWNvbXByZXNzaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAqLworRVhURVJOKHZvaWQpIGppbml0X21hc3Rlcl9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2RfbWFpbl9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9kX2NvZWZfY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2lucHV0X2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfbWFya2VyX3JlYWRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9odWZmX2RlY29kZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfaHVmZl9kZWNvZGVyX25vX2RhdGEgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfcGh1ZmZfZGVjb2RlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9pbnZlcnNlX2RjdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF91cHNhbXBsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfMXBhc3NfcXVhbnRpemVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0XzJwYXNzX3F1YW50aXplciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfZGVjb21wcmVzc19wZXJfc2Nhbl9zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbyk7CisvKiBNZW1vcnkgbWFuYWdlciBpbml0aWFsaXphdGlvbiAqLworRVhURVJOKHZvaWQpIGppbml0X21lbW9yeV9tZ3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworLyogVXRpbGl0eSByb3V0aW5lcyBpbiBqdXRpbHMuYyAqLworRVhURVJOKGxvbmcpIGpkaXZfcm91bmRfdXAgSlBQKChsb25nIGEsIGxvbmcgYikpOworRVhURVJOKGxvbmcpIGpyb3VuZF91cCBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7CitFWFRFUk4obG9uZykgam1pbiBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7CitFWFRFUk4odm9pZCkgamNvcHlfc2FtcGxlX3Jvd3MgSlBQKChKU0FNUEFSUkFZIGlucHV0X2FycmF5LCBpbnQgc291cmNlX3JvdywKKwkJCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYXJyYXksIGludCBkZXN0X3JvdywKKwkJCQkgICAgaW50IG51bV9yb3dzLCBKRElNRU5TSU9OIG51bV9jb2xzKSk7CitFWFRFUk4odm9pZCkgamNvcHlfYmxvY2tfcm93IEpQUCgoSkJMT0NLUk9XIGlucHV0X3JvdywgSkJMT0NLUk9XIG91dHB1dF9yb3csCisJCQkJICBKRElNRU5TSU9OIG51bV9ibG9ja3MpKTsKK0VYVEVSTih2b2lkKSBqemVyb19mYXIgSlBQKCh2b2lkIEZBUiAqIHRhcmdldCwgc2l6ZV90IGJ5dGVzdG96ZXJvKSk7CisKK0VYVEVSTih2b2lkKSBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbiBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQpKTsKK0VYVEVSTih2b2lkKSBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbl9iaXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZV9vZmZzZXQsIGludCBiaXRfbGVmdCwgSU5UMzIgYnVmKSk7CisKK0VYVEVSTihpbnQpIGpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworLyogQ29uc3RhbnQgdGFibGVzIGluIGp1dGlscy5jICovCisjaWYgMAkJCQkvKiBUaGlzIHRhYmxlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQgaW4gdjZhICovCitleHRlcm4gY29uc3QgaW50IGpwZWdfemlnemFnX29yZGVyW107IC8qIG5hdHVyYWwgY29lZiBvcmRlciB0byB6aWd6YWcgb3JkZXIgKi8KKyNlbmRpZgorZXh0ZXJuIGNvbnN0IGludCBqcGVnX25hdHVyYWxfb3JkZXJbXTsgLyogemlnemFnIGNvZWYgb3JkZXIgdG8gbmF0dXJhbCBvcmRlciAqLworCisvKiBTdXBwcmVzcyB1bmRlZmluZWQtc3RydWN0dXJlIGNvbXBsYWludHMgaWYgbmVjZXNzYXJ5LiAqLworCisjaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKyNpZm5kZWYgQU1fTUVNT1JZX01BTkFHRVIJLyogb25seSBqbWVtbWdyLmMgZGVmaW5lcyB0aGVzZSAqLworc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07CisjZW5kaWYKKyNlbmRpZiAvKiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qcGVnbGliLmggYi9qcGVnL2pwZWdsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U2ODcyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qcGVnbGliLmgKQEAgLTAsMCArMSwxMTg0IEBACisvKgorICoganBlZ2xpYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgorICogTW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgbmVlZCBvbmx5IGluY2x1ZGUgdGhpcyBmaWxlLAorICogYW5kIHBlcmhhcHMgamVycm9yLmggaWYgdGhleSB3YW50IHRvIGtub3cgdGhlIGV4YWN0IGVycm9yIGNvZGVzLgorICovCisKKyNpZm5kZWYgSlBFR0xJQl9ICisjZGVmaW5lIEpQRUdMSUJfSAorCisvKgorICogRmlyc3Qgd2UgaW5jbHVkZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB0aGF0IHJlY29yZCBob3cgdGhpcworICogaW5zdGFsbGF0aW9uIG9mIHRoZSBKUEVHIGxpYnJhcnkgaXMgc2V0IHVwLiAgamNvbmZpZy5oIGNhbiBiZQorICogZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZm9yIG1hbnkgc3lzdGVtcy4gIGptb3JlY2ZnLmggY29udGFpbnMKKyAqIG1hbnVhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBtb3N0IHBlb3BsZSBuZWVkIG5vdCB3b3JyeSBhYm91dC4KKyAqLworCisjaWZuZGVmIEpDT05GSUdfSU5DTFVERUQJLyogaW4gY2FzZSBqaW5jbHVkZS5oIGFscmVhZHkgZGlkICovCisjaW5jbHVkZSAiamNvbmZpZy5oIgkJLyogd2lkZWx5IHVzZWQgY29uZmlndXJhdGlvbiBvcHRpb25zICovCisjZW5kaWYKKyNpbmNsdWRlICJqbW9yZWNmZy5oIgkJLyogc2VsZG9tIGNoYW5nZWQgb3B0aW9ucyAqLworCisKKy8qIFZlcnNpb24gSUQgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCisgKiBNaWdodCBiZSB1c2VmdWwgZm9yIHRlc3RzIGxpa2UgIiNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDYwIi4KKyAqLworCisjZGVmaW5lIEpQRUdfTElCX1ZFUlNJT04gIDYyCS8qIFZlcnNpb24gNmIgKi8KKworCisvKiBWYXJpb3VzIGNvbnN0YW50cyBkZXRlcm1pbmluZyB0aGUgc2l6ZXMgb2YgdGhpbmdzLgorICogQWxsIG9mIHRoZXNlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIEpQRUcgc3RhbmRhcmQsIHNvIGRvbid0IGNoYW5nZSB0aGVtCisgKiBpZiB5b3Ugd2FudCB0byBiZSBjb21wYXRpYmxlLgorICovCisKKyNkZWZpbmUgRENUU0laRQkJICAgIDgJLyogVGhlIGJhc2ljIERDVCBibG9jayBpcyA4eDggc2FtcGxlcyAqLworI2RlZmluZSBEQ1RTSVpFMgkgICAgNjQJLyogRENUU0laRSBzcXVhcmVkOyAjIG9mIGVsZW1lbnRzIGluIGEgYmxvY2sgKi8KKyNkZWZpbmUgTlVNX1FVQU5UX1RCTFMgICAgICA0CS8qIFF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjMgKi8KKyNkZWZpbmUgTlVNX0hVRkZfVEJMUyAgICAgICA0CS8qIEh1ZmZtYW4gdGFibGVzIGFyZSBudW1iZXJlZCAwLi4zICovCisjZGVmaW5lIE5VTV9BUklUSF9UQkxTICAgICAgMTYJLyogQXJpdGgtY29kaW5nIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMTUgKi8KKyNkZWZpbmUgTUFYX0NPTVBTX0lOX1NDQU4gICA0CS8qIEpQRUcgbGltaXQgb24gIyBvZiBjb21wb25lbnRzIGluIG9uZSBzY2FuICovCisjZGVmaW5lIE1BWF9TQU1QX0ZBQ1RPUiAgICAgNAkvKiBKUEVHIGxpbWl0IG9uIHNhbXBsaW5nIGZhY3RvcnMgKi8KKy8qIFVuZm9ydHVuYXRlbHksIHNvbWUgYm96byBhdCBBZG9iZSBzYXcgbm8gcmVhc29uIHRvIGJlIGJvdW5kIGJ5IHRoZSBzdGFuZGFyZDsKKyAqIHRoZSBQb3N0U2NyaXB0IERDVCBmaWx0ZXIgY2FuIGVtaXQgZmlsZXMgd2l0aCBtYW55IG1vcmUgdGhhbiAxMCBibG9ja3MvTUNVLgorICogSWYgeW91IGhhcHBlbiB0byBydW4gYWNyb3NzIHN1Y2ggYSBmaWxlLCB5b3UgY2FuIHVwIERfTUFYX0JMT0NLU19JTl9NQ1UKKyAqIHRvIGhhbmRsZSBpdC4gIFdlIGV2ZW4gbGV0IHlvdSBkbyB0aGlzIGZyb20gdGhlIGpjb25maWcuaCBmaWxlLiAgSG93ZXZlciwKKyAqIHdlIHN0cm9uZ2x5IGRpc2NvdXJhZ2UgY2hhbmdpbmcgQ19NQVhfQkxPQ0tTX0lOX01DVTsganVzdCBiZWNhdXNlIEFkb2JlCisgKiBzb21ldGltZXMgZW1pdHMgbm9uY29tcGxpYW50IGZpbGVzIGRvZXNuJ3QgbWVhbiB5b3Ugc2hvdWxkIHRvby4KKyAqLworI2RlZmluZSBDX01BWF9CTE9DS1NfSU5fTUNVICAgMTAgLyogY29tcHJlc3NvcidzIGxpbWl0IG9uIGJsb2NrcyBwZXIgTUNVICovCisjaWZuZGVmIERfTUFYX0JMT0NLU19JTl9NQ1UKKyNkZWZpbmUgRF9NQVhfQkxPQ0tTX0lOX01DVSAgIDEwIC8qIGRlY29tcHJlc3NvcidzIGxpbWl0IG9uIGJsb2NrcyBwZXIgTUNVICovCisjZW5kaWYKKworCisvKiBEYXRhIHN0cnVjdHVyZXMgZm9yIGltYWdlcyAoYXJyYXlzIG9mIHNhbXBsZXMgYW5kIG9mIERDVCBjb2VmZmljaWVudHMpLgorICogT24gODB4ODYgbWFjaGluZXMsIHRoZSBpbWFnZSBhcnJheXMgYXJlIHRvbyBiaWcgZm9yIG5lYXIgcG9pbnRlcnMsCisgKiBidXQgdGhlIHBvaW50ZXIgYXJyYXlzIGNhbiBmaXQgaW4gbmVhciBtZW1vcnkuCisgKi8KKwordHlwZWRlZiBKU0FNUExFIEZBUiAqSlNBTVBST1c7CS8qIHB0ciB0byBvbmUgaW1hZ2Ugcm93IG9mIHBpeGVsIHNhbXBsZXMuICovCit0eXBlZGVmIEpTQU1QUk9XICpKU0FNUEFSUkFZOwkvKiBwdHIgdG8gc29tZSByb3dzIChhIDItRCBzYW1wbGUgYXJyYXkpICovCit0eXBlZGVmIEpTQU1QQVJSQVkgKkpTQU1QSU1BR0U7CS8qIGEgMy1EIHNhbXBsZSBhcnJheTogdG9wIGluZGV4IGlzIGNvbG9yICovCisKK3R5cGVkZWYgSkNPRUYgSkJMT0NLW0RDVFNJWkUyXTsJLyogb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cyAqLwordHlwZWRlZiBKQkxPQ0sgRkFSICpKQkxPQ0tST1c7CS8qIHBvaW50ZXIgdG8gb25lIHJvdyBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KK3R5cGVkZWYgSkJMT0NLUk9XICpKQkxPQ0tBUlJBWTsJCS8qIGEgMi1EIGFycmF5IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwordHlwZWRlZiBKQkxPQ0tBUlJBWSAqSkJMT0NLSU1BR0U7CS8qIGEgMy1EIGFycmF5IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLworCit0eXBlZGVmIEpDT0VGIEZBUiAqSkNPRUZQVFI7CS8qIHVzZWZ1bCBpbiBhIGNvdXBsZSBvZiBwbGFjZXMgKi8KKworCisvKiBUeXBlcyBmb3IgSlBFRyBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCB3b3JraW5nIHRhYmxlcy4gKi8KKworCisvKiBEQ1QgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGlzIGFycmF5IGdpdmVzIHRoZSBjb2VmZmljaWVudCBxdWFudGl6ZXJzIGluIG5hdHVyYWwgYXJyYXkgb3JkZXIKKyAgICogKG5vdCB0aGUgemlnemFnIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHN0b3JlZCBpbiBhIEpQRUcgRFFUIG1hcmtlcikuCisgICAqIENBVVRJT046IElKRyB2ZXJzaW9ucyBwcmlvciB0byB2NmEga2VwdCB0aGlzIGFycmF5IGluIHppZ3phZyBvcmRlci4KKyAgICovCisgIFVJTlQxNiBxdWFudHZhbFtEQ1RTSVpFMl07CS8qIHF1YW50aXphdGlvbiBzdGVwIGZvciBlYWNoIGNvZWZmaWNpZW50ICovCisgIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgRkFMU0Ugd2hlbgorICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCBUUlVFIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KKyAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byBUUlVFLgorICAgKiAoU2VlIGpwZWdfc3VwcHJlc3NfdGFibGVzIGZvciBhbiBleGFtcGxlLikKKyAgICovCisgIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KK30gSlFVQU5UX1RCTDsKKworCisvKiBIdWZmbWFuIGNvZGluZyB0YWJsZXMuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhlc2UgdHdvIGZpZWxkcyBkaXJlY3RseSByZXByZXNlbnQgdGhlIGNvbnRlbnRzIG9mIGEgSlBFRyBESFQgbWFya2VyICovCisgIFVJTlQ4IGJpdHNbMTddOwkJLyogYml0c1trXSA9ICMgb2Ygc3ltYm9scyB3aXRoIGNvZGVzIG9mICovCisJCQkJLyogbGVuZ3RoIGsgYml0czsgYml0c1swXSBpcyB1bnVzZWQgKi8KKyAgVUlOVDggaHVmZnZhbFsyNTZdOwkJLyogVGhlIHN5bWJvbHMsIGluIG9yZGVyIG9mIGluY3IgY29kZSBsZW5ndGggKi8KKyAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCisgICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgorICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCisgICAqIChTZWUganBlZ19zdXBwcmVzc190YWJsZXMgZm9yIGFuIGV4YW1wbGUuKQorICAgKi8KKyAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogVFJVRSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLworfSBKSFVGRl9UQkw7CisKKworLyogQmFzaWMgaW5mbyBhYm91dCBvbmUgY29tcG9uZW50IChjb2xvciBjaGFubmVsKS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGZpeGVkIG92ZXIgdGhlIHdob2xlIGltYWdlLiAqLworICAvKiBGb3IgY29tcHJlc3Npb24sIHRoZXkgbXVzdCBiZSBzdXBwbGllZCBieSBwYXJhbWV0ZXIgc2V0dXA7ICovCisgIC8qIGZvciBkZWNvbXByZXNzaW9uLCB0aGV5IGFyZSByZWFkIGZyb20gdGhlIFNPRiBtYXJrZXIuICovCisgIGludCBjb21wb25lbnRfaWQ7CQkvKiBpZGVudGlmaWVyIGZvciB0aGlzIGNvbXBvbmVudCAoMC4uMjU1KSAqLworICBpbnQgY29tcG9uZW50X2luZGV4OwkJLyogaXRzIGluZGV4IGluIFNPRiBvciBjaW5mby0+Y29tcF9pbmZvW10gKi8KKyAgaW50IGhfc2FtcF9mYWN0b3I7CQkvKiBob3Jpem9udGFsIHNhbXBsaW5nIGZhY3RvciAoMS4uNCkgKi8KKyAgaW50IHZfc2FtcF9mYWN0b3I7CQkvKiB2ZXJ0aWNhbCBzYW1wbGluZyBmYWN0b3IgKDEuLjQpICovCisgIGludCBxdWFudF90Ymxfbm87CQkvKiBxdWFudGl6YXRpb24gdGFibGUgc2VsZWN0b3IgKDAuLjMpICovCisgIC8qIFRoZXNlIHZhbHVlcyBtYXkgdmFyeSBiZXR3ZWVuIHNjYW5zLiAqLworICAvKiBGb3IgY29tcHJlc3Npb24sIHRoZXkgbXVzdCBiZSBzdXBwbGllZCBieSBwYXJhbWV0ZXIgc2V0dXA7ICovCisgIC8qIGZvciBkZWNvbXByZXNzaW9uLCB0aGV5IGFyZSByZWFkIGZyb20gdGhlIFNPUyBtYXJrZXIuICovCisgIC8qIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UgdGhlc2UgdmFyaWFibGVzLiAqLworICBpbnQgZGNfdGJsX25vOwkJLyogREMgZW50cm9weSB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KKyAgaW50IGFjX3RibF9ubzsJCS8qIEFDIGVudHJvcHkgdGFibGUgc2VsZWN0b3IgKDAuLjMpICovCisKKyAgLyogUmVtYWluaW5nIGZpZWxkcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBwcml2YXRlIGJ5IGFwcGxpY2F0aW9ucy4gKi8KKworICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIGR1cmluZyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHN0YXJ0dXA6ICovCisgIC8qIENvbXBvbmVudCdzIHNpemUgaW4gRENUIGJsb2Nrcy4KKyAgICogQW55IGR1bW15IGJsb2NrcyBhZGRlZCB0byBjb21wbGV0ZSBhbiBNQ1UgYXJlIG5vdCBjb3VudGVkOyB0aGVyZWZvcmUKKyAgICogdGhlc2UgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gd2hldGhlciBhIHNjYW4gaXMgaW50ZXJsZWF2ZWQgb3Igbm90LgorICAgKi8KKyAgSkRJTUVOU0lPTiB3aWR0aF9pbl9ibG9ja3M7CisgIEpESU1FTlNJT04gaGVpZ2h0X2luX2Jsb2NrczsKKyAgLyogU2l6ZSBvZiBhIERDVCBibG9jayBpbiBzYW1wbGVzLiAgQWx3YXlzIERDVFNJWkUgZm9yIGNvbXByZXNzaW9uLgorICAgKiBGb3IgZGVjb21wcmVzc2lvbiB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgZnJvbSBvbmUgRENUIGJsb2NrLAorICAgKiByZWZsZWN0aW5nIGFueSBzY2FsaW5nIHdlIGNob29zZSB0byBhcHBseSBkdXJpbmcgdGhlIElEQ1Qgc3RlcC4KKyAgICogVmFsdWVzIG9mIDEsMiw0LDggYXJlIGxpa2VseSB0byBiZSBzdXBwb3J0ZWQuICBOb3RlIHRoYXQgZGlmZmVyZW50CisgICAqIGNvbXBvbmVudHMgbWF5IHJlY2VpdmUgZGlmZmVyZW50IElEQ1Qgc2NhbGluZ3MuCisgICAqLworICBpbnQgRENUX3NjYWxlZF9zaXplOworICAvKiBUaGUgZG93bnNhbXBsZWQgZGltZW5zaW9ucyBhcmUgdGhlIGNvbXBvbmVudCdzIGFjdHVhbCwgdW5wYWRkZWQgbnVtYmVyCisgICAqIG9mIHNhbXBsZXMgYXQgdGhlIG1haW4gYnVmZmVyIChwcmVwcm9jZXNzaW5nL2NvbXByZXNzaW9uIGludGVyZmFjZSksIHRodXMKKyAgICogZG93bnNhbXBsZWRfd2lkdGggPSBjZWlsKGltYWdlX3dpZHRoICogSGkvSG1heCkKKyAgICogYW5kIHNpbWlsYXJseSBmb3IgaGVpZ2h0LiAgRm9yIGRlY29tcHJlc3Npb24sIElEQ1Qgc2NhbGluZyBpcyBpbmNsdWRlZCwgc28KKyAgICogZG93bnNhbXBsZWRfd2lkdGggPSBjZWlsKGltYWdlX3dpZHRoICogSGkvSG1heCAqIERDVF9zY2FsZWRfc2l6ZS9EQ1RTSVpFKQorICAgKi8KKyAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF93aWR0aDsJIC8qIGFjdHVhbCB3aWR0aCBpbiBzYW1wbGVzICovCisgIEpESU1FTlNJT04gZG93bnNhbXBsZWRfaGVpZ2h0OyAvKiBhY3R1YWwgaGVpZ2h0IGluIHNhbXBsZXMgKi8KKyAgLyogVGhpcyBmbGFnIGlzIHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4gIEluIGNhc2VzIHdoZXJlIHNvbWUgb2YgdGhlCisgICAqIGNvbXBvbmVudHMgd2lsbCBiZSBpZ25vcmVkIChlZyBncmF5c2NhbGUgb3V0cHV0IGZyb20gWUNiQ3IgaW1hZ2UpLAorICAgKiB3ZSBjYW4gc2tpcCBtb3N0IGNvbXB1dGF0aW9ucyBmb3IgdGhlIHVudXNlZCBjb21wb25lbnRzLgorICAgKi8KKyAgYm9vbGVhbiBjb21wb25lbnRfbmVlZGVkOwkvKiBkbyB3ZSBuZWVkIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudD8gKi8KKworICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIGJlZm9yZSBzdGFydGluZyBhIHNjYW4gb2YgdGhlIGNvbXBvbmVudC4gKi8KKyAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCisgIGludCBNQ1Vfd2lkdGg7CQkvKiBudW1iZXIgb2YgYmxvY2tzIHBlciBNQ1UsIGhvcml6b250YWxseSAqLworICBpbnQgTUNVX2hlaWdodDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgdmVydGljYWxseSAqLworICBpbnQgTUNVX2Jsb2NrczsJCS8qIE1DVV93aWR0aCAqIE1DVV9oZWlnaHQgKi8KKyAgaW50IE1DVV9zYW1wbGVfd2lkdGg7CQkvKiBNQ1Ugd2lkdGggaW4gc2FtcGxlcywgTUNVX3dpZHRoKkRDVF9zY2FsZWRfc2l6ZSAqLworICBpbnQgbGFzdF9jb2xfd2lkdGg7CQkvKiAjIG9mIG5vbi1kdW1teSBibG9ja3MgYWNyb3NzIGluIGxhc3QgTUNVICovCisgIGludCBsYXN0X3Jvd19oZWlnaHQ7CQkvKiAjIG9mIG5vbi1kdW1teSBibG9ja3MgZG93biBpbiBsYXN0IE1DVSAqLworCisgIC8qIFNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50OyBOVUxMIGlmIG5vbmUgeWV0IHNhdmVkLgorICAgKiBTZWUgamRpbnB1dC5jIGNvbW1lbnRzIGFib3V0IHRoZSBuZWVkIGZvciB0aGlzIGluZm9ybWF0aW9uLgorICAgKiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIGRlY29tcHJlc3Npb24uCisgICAqLworICBKUVVBTlRfVEJMICogcXVhbnRfdGFibGU7CisKKyAgLyogUHJpdmF0ZSBwZXItY29tcG9uZW50IHN0b3JhZ2UgZm9yIERDVCBvciBJRENUIHN1YnN5c3RlbS4gKi8KKyAgdm9pZCAqIGRjdF90YWJsZTsKK30ganBlZ19jb21wb25lbnRfaW5mbzsKKworCisvKiBUaGUgc2NyaXB0IGZvciBlbmNvZGluZyBhIG11bHRpcGxlLXNjYW4gZmlsZSBpcyBhbiBhcnJheSBvZiB0aGVzZTogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qIG51bWJlciBvZiBjb21wb25lbnRzIGVuY29kZWQgaW4gdGhpcyBzY2FuICovCisgIGludCBjb21wb25lbnRfaW5kZXhbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiB0aGVpciBTT0YvY29tcF9pbmZvW10gaW5kZXhlcyAqLworICBpbnQgU3MsIFNlOwkJCS8qIHByb2dyZXNzaXZlIEpQRUcgc3BlY3RyYWwgc2VsZWN0aW9uIHBhcm1zICovCisgIGludCBBaCwgQWw7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzdWNjZXNzaXZlIGFwcHJveC4gcGFybXMgKi8KK30ganBlZ19zY2FuX2luZm87CisKKy8qIFRoZSBkZWNvbXByZXNzb3IgY2FuIHNhdmUgQVBQbiBhbmQgQ09NIG1hcmtlcnMgaW4gYSBsaXN0IG9mIHRoZXNlOiAqLworCit0eXBlZGVmIHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgRkFSICoganBlZ19zYXZlZF9tYXJrZXJfcHRyOworCitzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0IHsKKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCwgb3IgTlVMTCAqLworICBVSU5UOCBtYXJrZXI7CQkJLyogbWFya2VyIGNvZGU6IEpQRUdfQ09NLCBvciBKUEVHX0FQUDArbiAqLworICB1bnNpZ25lZCBpbnQgb3JpZ2luYWxfbGVuZ3RoOwkvKiAjIGJ5dGVzIG9mIGRhdGEgaW4gdGhlIGZpbGUgKi8KKyAgdW5zaWduZWQgaW50IGRhdGFfbGVuZ3RoOwkvKiAjIGJ5dGVzIG9mIGRhdGEgc2F2ZWQgYXQgZGF0YVtdICovCisgIEpPQ1RFVCBGQVIgKiBkYXRhOwkJLyogdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBtYXJrZXIgKi8KKyAgLyogdGhlIG1hcmtlciBsZW5ndGggd29yZCBpcyBub3QgY291bnRlZCBpbiBkYXRhX2xlbmd0aCBvciBvcmlnaW5hbF9sZW5ndGggKi8KK307CisKKy8qIEtub3duIGNvbG9yIHNwYWNlcy4gKi8KKwordHlwZWRlZiBlbnVtIHsKKwlKQ1NfVU5LTk9XTiwJCS8qIGVycm9yL3Vuc3BlY2lmaWVkICovCisJSkNTX0dSQVlTQ0FMRSwJCS8qIG1vbm9jaHJvbWUgKi8KKwlKQ1NfUkdCLAkJLyogcmVkL2dyZWVuL2JsdWUgKi8KKwlKQ1NfWUNiQ3IsCQkvKiBZL0NiL0NyIChhbHNvIGtub3duIGFzIFlVVikgKi8KKwlKQ1NfQ01ZSywJCS8qIEMvTS9ZL0sgKi8KKwlKQ1NfWUNDSywJCS8qIFkvQ2IvQ3IvSyAqLworI2lmZGVmIEFORFJPSURfUkdCCisgICAgSkNTX1JHQkFfODg4OCwgIC8qIHJlZC9ncmVlbi9ibHVlL2FscGhhICovCisgICAgSkNTX1JHQl81NjUgICAgIC8qIHJlZC9ncmVlbi9ibHVlIGluIDU2NSBmb3JtYXQgKi8KKyNlbmRpZgorfSBKX0NPTE9SX1NQQUNFOworCisvKiBEQ1QvSURDVCBhbGdvcml0aG0gb3B0aW9ucy4gKi8KKwordHlwZWRlZiBlbnVtIHsKKwlKRENUX0lTTE9XLAkJLyogc2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0gKi8KKwlKRENUX0lGQVNULAkJLyogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kICovCisJSkRDVF9GTE9BVAkJLyogZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFcgKi8KK30gSl9EQ1RfTUVUSE9EOworCisjaWZuZGVmIEpEQ1RfREVGQVVMVAkJLyogbWF5IGJlIG92ZXJyaWRkZW4gaW4gamNvbmZpZy5oICovCisjZGVmaW5lIEpEQ1RfREVGQVVMVCAgSkRDVF9JU0xPVworI2VuZGlmCisjaWZuZGVmIEpEQ1RfRkFTVEVTVAkJLyogbWF5IGJlIG92ZXJyaWRkZW4gaW4gamNvbmZpZy5oICovCisjZGVmaW5lIEpEQ1RfRkFTVEVTVCAgSkRDVF9JRkFTVAorI2VuZGlmCisKKy8qIERpdGhlcmluZyBvcHRpb25zIGZvciBkZWNvbXByZXNzaW9uLiAqLworCit0eXBlZGVmIGVudW0geworCUpESVRIRVJfTk9ORSwJCS8qIG5vIGRpdGhlcmluZyAqLworCUpESVRIRVJfT1JERVJFRCwJLyogc2ltcGxlIG9yZGVyZWQgZGl0aGVyICovCisJSkRJVEhFUl9GUwkJLyogRmxveWQtU3RlaW5iZXJnIGVycm9yIGRpZmZ1c2lvbiBkaXRoZXIgKi8KK30gSl9ESVRIRVJfTU9ERTsKKworCisvKiBDb21tb24gZmllbGRzIGJldHdlZW4gSlBFRyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBtYXN0ZXIgc3RydWN0cy4gKi8KKworI2RlZmluZSBqcGVnX2NvbW1vbl9maWVsZHMgXAorICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnI7CS8qIEVycm9yIGhhbmRsZXIgbW9kdWxlICovXAorICBzdHJ1Y3QganBlZ19tZW1vcnlfbWdyICogbWVtOwkvKiBNZW1vcnkgbWFuYWdlciBtb2R1bGUgKi9cCisgIHN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciAqIHByb2dyZXNzOyAvKiBQcm9ncmVzcyBtb25pdG9yLCBvciBOVUxMIGlmIG5vbmUgKi9cCisgIHZvaWQgKiBjbGllbnRfZGF0YTsJCS8qIEF2YWlsYWJsZSBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9uICovXAorICBib29sZWFuIGlzX2RlY29tcHJlc3NvcjsJLyogU28gY29tbW9uIGNvZGUgY2FuIHRlbGwgd2hpY2ggaXMgd2hpY2ggKi9cCisgIGludCBnbG9iYWxfc3RhdGUJCS8qIEZvciBjaGVja2luZyBjYWxsIHNlcXVlbmNlIHZhbGlkaXR5ICovCisKKy8qIFJvdXRpbmVzIHRoYXQgYXJlIHRvIGJlIHVzZWQgYnkgYm90aCBoYWx2ZXMgb2YgdGhlIGxpYnJhcnkgYXJlIGRlY2xhcmVkCisgKiB0byByZWNlaXZlIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZS4gIFRoZXJlIGFyZSBubyBhY3R1YWwgaW5zdGFuY2VzIG9mCisgKiBqcGVnX2NvbW1vbl9zdHJ1Y3QsIG9ubHkgb2YganBlZ19jb21wcmVzc19zdHJ1Y3QgYW5kIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QuCisgKi8KK3N0cnVjdCBqcGVnX2NvbW1vbl9zdHJ1Y3QgeworICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgY29tbW9uIHRvIGJvdGggbWFzdGVyIHN0cnVjdCB0eXBlcyAqLworICAvKiBBZGRpdGlvbmFsIGZpZWxkcyBmb2xsb3cgaW4gYW4gYWN0dWFsIGpwZWdfY29tcHJlc3Nfc3RydWN0IG9yCisgICAqIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QuICBBbGwgdGhyZWUgc3RydWN0cyBtdXN0IGFncmVlIG9uIHRoZXNlCisgICAqIGluaXRpYWwgZmllbGRzISAgKFRoaXMgd291bGQgYmUgYSBsb3QgY2xlYW5lciBpbiBDKysuKQorICAgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCAqIGpfY29tbW9uX3B0cjsKK3R5cGVkZWYgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0ICogal9jb21wcmVzc19wdHI7Cit0eXBlZGVmIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0ICogal9kZWNvbXByZXNzX3B0cjsKKworCisvKiBNYXN0ZXIgcmVjb3JkIGZvciBhIGNvbXByZXNzaW9uIGluc3RhbmNlICovCisKK3N0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCB7CisgIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBzaGFyZWQgd2l0aCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0ICovCisKKyAgLyogRGVzdGluYXRpb24gZm9yIGNvbXByZXNzZWQgZGF0YSAqLworICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0OworCisgIC8qIERlc2NyaXB0aW9uIG9mIHNvdXJjZSBpbWFnZSAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgZmlsbGVkIGluIGJ5CisgICAqIG91dGVyIGFwcGxpY2F0aW9uIGJlZm9yZSBzdGFydGluZyBjb21wcmVzc2lvbi4gIGluX2NvbG9yX3NwYWNlIG11c3QKKyAgICogYmUgY29ycmVjdCBiZWZvcmUgeW91IGNhbiBldmVuIGNhbGwganBlZ19zZXRfZGVmYXVsdHMoKS4KKyAgICovCisKKyAgSkRJTUVOU0lPTiBpbWFnZV93aWR0aDsJLyogaW5wdXQgaW1hZ2Ugd2lkdGggKi8KKyAgSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQ7CS8qIGlucHV0IGltYWdlIGhlaWdodCAqLworICBpbnQgaW5wdXRfY29tcG9uZW50czsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBpbnB1dCBpbWFnZSAqLworICBKX0NPTE9SX1NQQUNFIGluX2NvbG9yX3NwYWNlOwkvKiBjb2xvcnNwYWNlIG9mIGlucHV0IGltYWdlICovCisKKyAgZG91YmxlIGlucHV0X2dhbW1hOwkJLyogaW1hZ2UgZ2FtbWEgb2YgaW5wdXQgaW1hZ2UgKi8KKworICAvKiBDb21wcmVzc2lvbiBwYXJhbWV0ZXJzIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcKKyAgICoganBlZ19zdGFydF9jb21wcmVzcygpLiAgV2UgcmVjb21tZW5kIGNhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKSB0bworICAgKiBpbml0aWFsaXplIGV2ZXJ5dGhpbmcgdG8gcmVhc29uYWJsZSBkZWZhdWx0cywgdGhlbiBjaGFuZ2luZyBhbnl0aGluZworICAgKiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhbGx5IHdhbnRzIHRvIGNoYW5nZS4gIFRoYXQgd2F5IHlvdSB3b24ndCBnZXQKKyAgICogYnVybnQgd2hlbiBuZXcgcGFyYW1ldGVycyBhcmUgYWRkZWQuICBBbHNvIG5vdGUgdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbAorICAgKiBoZWxwZXIgcm91dGluZXMgdG8gc2ltcGxpZnkgY2hhbmdpbmcgcGFyYW1ldGVycy4KKyAgICovCisKKyAgaW50IGRhdGFfcHJlY2lzaW9uOwkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gaW1hZ2UgZGF0YSAqLworCisgIGludCBudW1fY29tcG9uZW50czsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBKUEVHIGltYWdlICovCisgIEpfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBvZiBKUEVHIGltYWdlICovCisKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBfaW5mbzsKKyAgLyogY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09GICovCisKKyAgSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXTsKKyAgLyogcHRycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCisKKyAgSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyAgSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyAgLyogcHRycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KKworICBVSU5UOCBhcml0aF9kY19MW05VTV9BUklUSF9UQkxTXTsgLyogTCB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKyAgVUlOVDggYXJpdGhfZGNfVVtOVU1fQVJJVEhfVEJMU107IC8qIFUgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisgIFVJTlQ4IGFyaXRoX2FjX0tbTlVNX0FSSVRIX1RCTFNdOyAvKiBLeCB2YWx1ZXMgZm9yIEFDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKworICBpbnQgbnVtX3NjYW5zOwkJLyogIyBvZiBlbnRyaWVzIGluIHNjYW5faW5mbyBhcnJheSAqLworICBjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5faW5mbzsgLyogc2NyaXB0IGZvciBtdWx0aS1zY2FuIGZpbGUsIG9yIE5VTEwgKi8KKyAgLyogVGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2Nhbl9pbmZvIGlzIE5VTEwsIHdoaWNoIGNhdXNlcyBhIHNpbmdsZS1zY2FuCisgICAqIHNlcXVlbnRpYWwgSlBFRyBmaWxlIHRvIGJlIGVtaXR0ZWQuICBUbyBjcmVhdGUgYSBtdWx0aS1zY2FuIGZpbGUsCisgICAqIHNldCBudW1fc2NhbnMgYW5kIHNjYW5faW5mbyB0byBwb2ludCB0byBhbiBhcnJheSBvZiBzY2FuIGRlZmluaXRpb25zLgorICAgKi8KKworICBib29sZWFuIHJhd19kYXRhX2luOwkJLyogVFJVRT1jYWxsZXIgc3VwcGxpZXMgZG93bnNhbXBsZWQgZGF0YSAqLworICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCisgIGJvb2xlYW4gb3B0aW1pemVfY29kaW5nOwkvKiBUUlVFPW9wdGltaXplIGVudHJvcHkgZW5jb2RpbmcgcGFybXMgKi8KKyAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiBUUlVFPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KKyAgaW50IHNtb290aGluZ19mYWN0b3I7CQkvKiAxLi4xMDAsIG9yIDAgZm9yIG5vIGlucHV0IHNtb290aGluZyAqLworICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogRENUIGFsZ29yaXRobSBzZWxlY3RvciAqLworCisgIC8qIFRoZSByZXN0YXJ0IGludGVydmFsIGNhbiBiZSBzcGVjaWZpZWQgaW4gYWJzb2x1dGUgTUNVcyBieSBzZXR0aW5nCisgICAqIHJlc3RhcnRfaW50ZXJ2YWwsIG9yIGluIE1DVSByb3dzIGJ5IHNldHRpbmcgcmVzdGFydF9pbl9yb3dzCisgICAqIChpbiB3aGljaCBjYXNlIHRoZSBjb3JyZWN0IHJlc3RhcnRfaW50ZXJ2YWwgd2lsbCBiZSBmaWd1cmVkCisgICAqIGZvciBlYWNoIHNjYW4pLgorICAgKi8KKyAgdW5zaWduZWQgaW50IHJlc3RhcnRfaW50ZXJ2YWw7IC8qIE1DVXMgcGVyIHJlc3RhcnQsIG9yIDAgZm9yIG5vIHJlc3RhcnQgKi8KKyAgaW50IHJlc3RhcnRfaW5fcm93czsJCS8qIGlmID4gMCwgTUNVIHJvd3MgcGVyIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKworICAvKiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIGVtaXNzaW9uIG9mIHNwZWNpYWwgbWFya2Vycy4gKi8KKworICBib29sZWFuIHdyaXRlX0pGSUZfaGVhZGVyOwkvKiBzaG91bGQgYSBKRklGIG1hcmtlciBiZSB3cml0dGVuPyAqLworICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb247CS8qIFdoYXQgdG8gd3JpdGUgZm9yIHRoZSBKRklGIHZlcnNpb24gbnVtYmVyICovCisgIFVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbjsKKyAgLyogVGhlc2UgdGhyZWUgdmFsdWVzIGFyZSBub3QgdXNlZCBieSB0aGUgSlBFRyBjb2RlLCBtZXJlbHkgY29waWVkICovCisgIC8qIGludG8gdGhlIEpGSUYgQVBQMCBtYXJrZXIuICBkZW5zaXR5X3VuaXQgY2FuIGJlIDAgZm9yIHVua25vd24sICovCisgIC8qIDEgZm9yIGRvdHMvaW5jaCwgb3IgMiBmb3IgZG90cy9jbS4gIE5vdGUgdGhhdCB0aGUgcGl4ZWwgYXNwZWN0ICovCisgIC8qIHJhdGlvIGlzIGRlZmluZWQgYnkgWF9kZW5zaXR5L1lfZGVuc2l0eSBldmVuIHdoZW4gZGVuc2l0eV91bml0PTAuICovCisgIFVJTlQ4IGRlbnNpdHlfdW5pdDsJCS8qIEpGSUYgY29kZSBmb3IgcGl4ZWwgc2l6ZSB1bml0cyAqLworICBVSU5UMTYgWF9kZW5zaXR5OwkJLyogSG9yaXpvbnRhbCBwaXhlbCBkZW5zaXR5ICovCisgIFVJTlQxNiBZX2RlbnNpdHk7CQkvKiBWZXJ0aWNhbCBwaXhlbCBkZW5zaXR5ICovCisgIGJvb2xlYW4gd3JpdGVfQWRvYmVfbWFya2VyOwkvKiBzaG91bGQgYW4gQWRvYmUgbWFya2VyIGJlIHdyaXR0ZW4/ICovCisKKyAgLyogU3RhdGUgdmFyaWFibGU6IGluZGV4IG9mIG5leHQgc2NhbmxpbmUgdG8gYmUgd3JpdHRlbiB0bworICAgKiBqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgQXBwbGljYXRpb24gbWF5IHVzZSB0aGlzIHRvIGNvbnRyb2wgaXRzCisgICAqIHByb2Nlc3NpbmcgbG9vcCwgZS5nLiwgIndoaWxlIChuZXh0X3NjYW5saW5lIDwgaW1hZ2VfaGVpZ2h0KSIuCisgICAqLworCisgIEpESU1FTlNJT04gbmV4dF9zY2FubGluZTsJLyogMCAuLiBpbWFnZV9oZWlnaHQtMSAgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBrbm93biB0aHJvdWdob3V0IGNvbXByZXNzb3IsIGJ1dCBnZW5lcmFsbHkKKyAgICogc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCisgICAqLworCisgIC8qCisgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIHN0YXJ0dXAKKyAgICovCisgIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBzY2FuIHNjcmlwdCB1c2VzIHByb2dyZXNzaXZlIG1vZGUgKi8KKyAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IGhfc2FtcF9mYWN0b3IgKi8KKyAgaW50IG1heF92X3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IHZfc2FtcF9mYWN0b3IgKi8KKworICBKRElNRU5TSU9OIHRvdGFsX2lNQ1Vfcm93czsJLyogIyBvZiBpTUNVIHJvd3MgdG8gYmUgaW5wdXQgdG8gY29lZiBjdGxyICovCisgIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHJlY2VpdmVzIGRhdGEgaW4gdW5pdHMgb2YgTUNVIHJvd3MgYXMgZGVmaW5lZAorICAgKiBmb3IgZnVsbHkgaW50ZXJsZWF2ZWQgc2NhbnMgKHdoZXRoZXIgdGhlIEpQRUcgZmlsZSBpcyBpbnRlcmxlYXZlZCBvciBub3QpLgorICAgKiBUaGVyZSBhcmUgdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUgc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQgaW4gYW4KKyAgICogImlNQ1UiIChpbnRlcmxlYXZlZCBNQ1UpIHJvdy4KKyAgICovCisKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSB2YWxpZCBkdXJpbmcgYW55IG9uZSBzY2FuLgorICAgKiBUaGV5IGRlc2NyaWJlIHRoZSBjb21wb25lbnRzIGFuZCBNQ1VzIGFjdHVhbGx5IGFwcGVhcmluZyBpbiB0aGUgc2Nhbi4KKyAgICovCisgIGludCBjb21wc19pbl9zY2FuOwkJLyogIyBvZiBKUEVHIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuICovCisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjdXJfY29tcF9pbmZvW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgLyogKmN1cl9jb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT1MgKi8KKworICBKRElNRU5TSU9OIE1DVXNfcGVyX3JvdzsJLyogIyBvZiBNQ1VzIGFjcm9zcyB0aGUgaW1hZ2UgKi8KKyAgSkRJTUVOU0lPTiBNQ1Vfcm93c19pbl9zY2FuOwkvKiAjIG9mIE1DVSByb3dzIGluIHRoZSBpbWFnZSAqLworCisgIGludCBibG9ja3NfaW5fTUNVOwkJLyogIyBvZiBEQ1QgYmxvY2tzIHBlciBNQ1UgKi8KKyAgaW50IE1DVV9tZW1iZXJzaGlwW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworICAvKiBNQ1VfbWVtYmVyc2hpcFtpXSBpcyBpbmRleCBpbiBjdXJfY29tcF9pbmZvIG9mIGNvbXBvbmVudCBvd25pbmcgKi8KKyAgLyogaSd0aCBibG9jayBpbiBhbiBNQ1UgKi8KKworICBpbnQgU3MsIFNlLCBBaCwgQWw7CQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHBhcmFtZXRlcnMgZm9yIHNjYW4gKi8KKworICAvKgorICAgKiBMaW5rcyB0byBjb21wcmVzc2lvbiBzdWJvYmplY3RzIChtZXRob2RzIGFuZCBwcml2YXRlIHZhcmlhYmxlcyBvZiBtb2R1bGVzKQorICAgKi8KKyAgc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgKiBtYXN0ZXI7CisgIHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyICogbWFpbjsKKyAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKiBwcmVwOworICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciAqIGNvZWY7CisgIHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgKiBtYXJrZXI7CisgIHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciAqIGNjb252ZXJ0OworICBzdHJ1Y3QganBlZ19kb3duc2FtcGxlciAqIGRvd25zYW1wbGU7CisgIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICogZmRjdDsKKyAgc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyICogZW50cm9weTsKKyAganBlZ19zY2FuX2luZm8gKiBzY3JpcHRfc3BhY2U7IC8qIHdvcmtzcGFjZSBmb3IganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gKi8KKyAgaW50IHNjcmlwdF9zcGFjZV9zaXplOworfTsKKworCisvKiBNYXN0ZXIgcmVjb3JkIGZvciBhIGRlY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KKworc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgeworICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgc2hhcmVkIHdpdGgganBlZ19jb21wcmVzc19zdHJ1Y3QgKi8KKworICAvKiBTb3VyY2Ugb2YgY29tcHJlc3NlZCBkYXRhICovCisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBzcmM7CisKKyAgLyogQmFzaWMgZGVzY3JpcHRpb24gb2YgaW1hZ2UgLS0tIGZpbGxlZCBpbiBieSBqcGVnX3JlYWRfaGVhZGVyKCkuICovCisgIC8qIEFwcGxpY2F0aW9uIG1heSBpbnNwZWN0IHRoZXNlIHZhbHVlcyB0byBkZWNpZGUgaG93IHRvIHByb2Nlc3MgaW1hZ2UuICovCisKKyAgSkRJTUVOU0lPTiBvcmlnaW5hbF9pbWFnZV93aWR0aDsJLyogbm9taW5hbCBpbWFnZSB3aWR0aCAoZnJvbSBTT0YgbWFya2VyKSAqLworCisgIEpESU1FTlNJT04gaW1hZ2Vfd2lkdGg7CS8qIG5vbWluYWwgaW1hZ2Ugd2lkdGggKGZyb20gU09GIG1hcmtlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgY2hhbmdlZCBieSB0aWxlIGRlY29kZSAqLworICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogbm9taW5hbCBpbWFnZSBoZWlnaHQgKi8KKyAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KKyAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KKworICAvKiBEZWNvbXByZXNzaW9uIHByb2Nlc3NpbmcgcGFyYW1ldGVycyAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgc2V0IGJlZm9yZQorICAgKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgTm90ZSB0aGF0IGpwZWdfcmVhZF9oZWFkZXIoKSBpbml0aWFsaXplcworICAgKiB0aGVtIHRvIGRlZmF1bHQgdmFsdWVzLgorICAgKi8KKworICBKX0NPTE9SX1NQQUNFIG91dF9jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBmb3Igb3V0cHV0ICovCisKKyAgdW5zaWduZWQgaW50IHNjYWxlX251bSwgc2NhbGVfZGVub207IC8qIGZyYWN0aW9uIGJ5IHdoaWNoIHRvIHNjYWxlIGltYWdlICovCisKKyAgZG91YmxlIG91dHB1dF9nYW1tYTsJCS8qIGltYWdlIGdhbW1hIHdhbnRlZCBpbiBvdXRwdXQgKi8KKworICBib29sZWFuIGJ1ZmZlcmVkX2ltYWdlOwkvKiBUUlVFPW11bHRpcGxlIG91dHB1dCBwYXNzZXMgKi8KKyAgYm9vbGVhbiByYXdfZGF0YV9vdXQ7CQkvKiBUUlVFPWRvd25zYW1wbGVkIGRhdGEgd2FudGVkICovCisKKyAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIElEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCisgIGJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZzsJLyogVFJVRT1hcHBseSBmYW5jeSB1cHNhbXBsaW5nICovCisgIGJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nOwkvKiBUUlVFPWFwcGx5IGludGVyYmxvY2sgc21vb3RoaW5nICovCisKKyAgYm9vbGVhbiBxdWFudGl6ZV9jb2xvcnM7CS8qIFRSVUU9Y29sb3JtYXBwZWQgb3V0cHV0IHdhbnRlZCAqLworICAvKiB0aGUgZm9sbG93aW5nIGFyZSBpZ25vcmVkIGlmIG5vdCBxdWFudGl6ZV9jb2xvcnM6ICovCisgIEpfRElUSEVSX01PREUgZGl0aGVyX21vZGU7CS8qIHR5cGUgb2YgY29sb3IgZGl0aGVyaW5nIHRvIHVzZSAqLworICBib29sZWFuIHR3b19wYXNzX3F1YW50aXplOwkvKiBUUlVFPXVzZSB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKi8KKyAgaW50IGRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsJLyogbWF4ICMgY29sb3JzIHRvIHVzZSBpbiBjcmVhdGVkIGNvbG9ybWFwICovCisgIC8qIHRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGU6ICovCisgIGJvb2xlYW4gZW5hYmxlXzFwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAxLXBhc3MgcXVhbnRpemVyICovCisgIGJvb2xlYW4gZW5hYmxlX2V4dGVybmFsX3F1YW50Oy8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIGV4dGVybmFsIGNvbG9ybWFwICovCisgIGJvb2xlYW4gZW5hYmxlXzJwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAyLXBhc3MgcXVhbnRpemVyICovCisKKyAgLyogRGVzY3JpcHRpb24gb2YgYWN0dWFsIG91dHB1dCBpbWFnZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gYXBwbGljYXRpb24uCisgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgYnkganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisgICAqIFlvdSBjYW4gYWxzbyB1c2UganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkgdG8gZGV0ZXJtaW5lIHRoZXNlIHZhbHVlcworICAgKiBpbiBhZHZhbmNlIG9mIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisgICAqLworCisgIEpESU1FTlNJT04gb3V0cHV0X3dpZHRoOwkvKiBzY2FsZWQgaW1hZ2Ugd2lkdGggKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfaGVpZ2h0OwkvKiBzY2FsZWQgaW1hZ2UgaGVpZ2h0ICovCisgIGludCBvdXRfY29sb3JfY29tcG9uZW50czsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIG91dF9jb2xvcl9zcGFjZSAqLworICBpbnQgb3V0cHV0X2NvbXBvbmVudHM7CS8qICMgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZCAqLworICAvKiBvdXRwdXRfY29tcG9uZW50cyBpcyAxIChhIGNvbG9ybWFwIGluZGV4KSB3aGVuIHF1YW50aXppbmcgY29sb3JzOworICAgKiBvdGhlcndpc2UgaXQgZXF1YWxzIG91dF9jb2xvcl9jb21wb25lbnRzLgorICAgKi8KKyAgaW50IHJlY19vdXRidWZfaGVpZ2h0OwkvKiBtaW4gcmVjb21tZW5kZWQgaGVpZ2h0IG9mIHNjYW5saW5lIGJ1ZmZlciAqLworICAvKiBJZiB0aGUgYnVmZmVyIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkgaXMgbGVzcyB0aGFuIHRoaXMgbWFueSByb3dzCisgICAqIGhpZ2gsIHNwYWNlIGFuZCB0aW1lIHdpbGwgYmUgd2FzdGVkIGR1ZSB0byB1bm5lY2Vzc2FyeSBkYXRhIGNvcHlpbmcuCisgICAqIFVzdWFsbHkgcmVjX291dGJ1Zl9oZWlnaHQgd2lsbCBiZSAxIG9yIDIsIGF0IG1vc3QgNC4KKyAgICovCisKKyAgLyogV2hlbiBxdWFudGl6aW5nIGNvbG9ycywgdGhlIG91dHB1dCBjb2xvcm1hcCBpcyBkZXNjcmliZWQgYnkgdGhlc2UgZmllbGRzLgorICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIHN1cHBseSBhIGNvbG9ybWFwIGJ5IHNldHRpbmcgY29sb3JtYXAgbm9uLU5VTEwgYmVmb3JlCisgICAqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzOyBvdGhlcndpc2UgYSBjb2xvcm1hcCBpcyBjcmVhdGVkIGR1cmluZworICAgKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3Mgb3IganBlZ19zdGFydF9vdXRwdXQuCisgICAqIFRoZSBtYXAgaGFzIG91dF9jb2xvcl9jb21wb25lbnRzIHJvd3MgYW5kIGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzIGNvbHVtbnMuCisgICAqLworICBpbnQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnM7CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLworICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogVGhlIGNvbG9yIG1hcCBhcyBhIDItRCBwaXhlbCBhcnJheSAqLworCisgIC8qIFN0YXRlIHZhcmlhYmxlczogdGhlc2UgdmFyaWFibGVzIGluZGljYXRlIHRoZSBwcm9ncmVzcyBvZiBkZWNvbXByZXNzaW9uLgorICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IGV4YW1pbmUgdGhlc2UgYnV0IG11c3Qgbm90IG1vZGlmeSB0aGVtLgorICAgKi8KKworICAvKiBSb3cgaW5kZXggb2YgbmV4dCBzY2FubGluZSB0byBiZSByZWFkIGZyb20ganBlZ19yZWFkX3NjYW5saW5lcygpLgorICAgKiBBcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgdG8gY29udHJvbCBpdHMgcHJvY2Vzc2luZyBsb29wLCBlLmcuLAorICAgKiAid2hpbGUgKG91dHB1dF9zY2FubGluZSA8IG91dHB1dF9oZWlnaHQpIi4KKyAgICovCisgIEpESU1FTlNJT04gb3V0cHV0X3NjYW5saW5lOwkvKiAwIC4uIG91dHB1dF9oZWlnaHQtMSAgKi8KKworICAvKiBDdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGFuZCBudW1iZXIgb2YgaU1DVSByb3dzIGNvbXBsZXRlZCBpbiBzY2FuLgorICAgKiBUaGVzZSBpbmRpY2F0ZSB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlLgorICAgKi8KKyAgaW50IGlucHV0X3NjYW5fbnVtYmVyOwkvKiBOdW1iZXIgb2YgU09TIG1hcmtlcnMgc2VlbiBzbyBmYXIgKi8KKyAgSkRJTUVOU0lPTiBpbnB1dF9pTUNVX3JvdzsJLyogTnVtYmVyIG9mIGlNQ1Ugcm93cyBjb21wbGV0ZWQgKi8KKworICAvKiBUaGUgIm91dHB1dCBzY2FuIG51bWJlciIgaXMgdGhlIG5vdGlvbmFsIHNjYW4gYmVpbmcgZGlzcGxheWVkIGJ5IHRoZQorICAgKiBvdXRwdXQgc2lkZS4gIFRoZSBkZWNvbXByZXNzb3Igd2lsbCBub3QgYWxsb3cgb3V0cHV0IHNjYW4vcm93IG51bWJlcgorICAgKiB0byBnZXQgYWhlYWQgb2YgaW5wdXQgc2Nhbi9yb3csIGJ1dCBpdCBjYW4gZmFsbCBhcmJpdHJhcmlseSBmYXIgYmVoaW5kLgorICAgKi8KKyAgaW50IG91dHB1dF9zY2FuX251bWJlcjsJLyogTm9taW5hbCBzY2FuIG51bWJlciBiZWluZyBkaXNwbGF5ZWQgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfaU1DVV9yb3c7CS8qIE51bWJlciBvZiBpTUNVIHJvd3MgcmVhZCAqLworCisgIC8qIEN1cnJlbnQgcHJvZ3Jlc3Npb24gc3RhdHVzLiAgY29lZl9iaXRzW2NdW2ldIGluZGljYXRlcyB0aGUgcHJlY2lzaW9uCisgICAqIHdpdGggd2hpY2ggY29tcG9uZW50IGMncyBEQ1QgY29lZmZpY2llbnQgaSAoaW4gemlnemFnIG9yZGVyKSBpcyBrbm93bi4KKyAgICogSXQgaXMgLTEgd2hlbiBubyBkYXRhIGhhcyB5ZXQgYmVlbiByZWNlaXZlZCwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBwb2ludAorICAgKiB0cmFuc2Zvcm0gKHNoaWZ0KSB2YWx1ZSBmb3IgdGhlIG1vc3QgcmVjZW50IHNjYW4gb2YgdGhlIGNvZWZmaWNpZW50CisgICAqICh0aHVzLCAwIGF0IGNvbXBsZXRpb24gb2YgdGhlIHByb2dyZXNzaW9uKS4KKyAgICogVGhpcyBwb2ludGVyIGlzIE5VTEwgd2hlbiByZWFkaW5nIGEgbm9uLXByb2dyZXNzaXZlIGZpbGUuCisgICAqLworICBpbnQgKCpjb2VmX2JpdHMpW0RDVFNJWkUyXTsJLyogLTEgb3IgY3VycmVudCBBbCB2YWx1ZSBmb3IgZWFjaCBjb2VmICovCisKKyAgLyogSW50ZXJuYWwgSlBFRyBwYXJhbWV0ZXJzIC0tLSB0aGUgYXBwbGljYXRpb24gdXN1YWxseSBuZWVkIG5vdCBsb29rIGF0CisgICAqIHRoZXNlIGZpZWxkcy4gIE5vdGUgdGhhdCB0aGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlCisgICAqIGFueSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGNoYW5nZSBiZXR3ZWVuIHNjYW5zLgorICAgKi8KKworICAvKiBRdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzIGFyZSBjYXJyaWVkIGZvcndhcmQgYWNyb3NzIGlucHV0CisgICAqIGRhdGFzdHJlYW1zIHdoZW4gcHJvY2Vzc2luZyBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLgorICAgKi8KKworICBKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdOworICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KKworICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworCisgIC8qIFRoZXNlIHBhcmFtZXRlcnMgYXJlIG5ldmVyIGNhcnJpZWQgYWNyb3NzIGRhdGFzdHJlYW1zLCBzaW5jZSB0aGV5CisgICAqIGFyZSBnaXZlbiBpbiBTT0YvU09TIG1hcmtlcnMgb3IgZGVmaW5lZCB0byBiZSByZXNldCBieSBTT0kuCisgICAqLworCisgIGludCBkYXRhX3ByZWNpc2lvbjsJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIGltYWdlIGRhdGEgKi8KKworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOworICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KKworICBib29sZWFuIHRpbGVfZGVjb2RlOyAgICAgICAgIC8qIFRSVUUgaWYgdXNpbmcgdGlsZSBiYXNlZCBkZWNvZGluZyAqLworICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgU09GbiBzcGVjaWZpZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLworICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCisKKyAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisgIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworICBVSU5UOCBhcml0aF9hY19LW05VTV9BUklUSF9UQkxTXTsgLyogS3ggdmFsdWVzIGZvciBBQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisKKyAgdW5zaWduZWQgaW50IHJlc3RhcnRfaW50ZXJ2YWw7IC8qIE1DVXMgcGVyIHJlc3RhcnQgaW50ZXJ2YWwsIG9yIDAgZm9yIG5vIHJlc3RhcnQgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgcmVjb3JkIGRhdGEgb2J0YWluZWQgZnJvbSBvcHRpb25hbCBtYXJrZXJzIHJlY29nbml6ZWQgYnkKKyAgICogdGhlIEpQRUcgbGlicmFyeS4KKyAgICovCisgIGJvb2xlYW4gc2F3X0pGSUZfbWFya2VyOwkvKiBUUlVFIGlmZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIGZvdW5kICovCisgIC8qIERhdGEgY29waWVkIGZyb20gSkZJRiBtYXJrZXI7IG9ubHkgdmFsaWQgaWYgc2F3X0pGSUZfbWFya2VyIGlzIFRSVUU6ICovCisgIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogSkZJRiB2ZXJzaW9uIG51bWJlciAqLworICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb247CisgIFVJTlQ4IGRlbnNpdHlfdW5pdDsJCS8qIEpGSUYgY29kZSBmb3IgcGl4ZWwgc2l6ZSB1bml0cyAqLworICBVSU5UMTYgWF9kZW5zaXR5OwkJLyogSG9yaXpvbnRhbCBwaXhlbCBkZW5zaXR5ICovCisgIFVJTlQxNiBZX2RlbnNpdHk7CQkvKiBWZXJ0aWNhbCBwaXhlbCBkZW5zaXR5ICovCisgIGJvb2xlYW4gc2F3X0Fkb2JlX21hcmtlcjsJLyogVFJVRSBpZmYgYW4gQWRvYmUgQVBQMTQgbWFya2VyIHdhcyBmb3VuZCAqLworICBVSU5UOCBBZG9iZV90cmFuc2Zvcm07CS8qIENvbG9yIHRyYW5zZm9ybSBjb2RlIGZyb20gQWRvYmUgbWFya2VyICovCisKKyAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiBUUlVFPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KKworICAvKiBBc2lkZSBmcm9tIHRoZSBzcGVjaWZpYyBkYXRhIHJldGFpbmVkIGZyb20gQVBQbiBtYXJrZXJzIGtub3duIHRvIHRoZQorICAgKiBsaWJyYXJ5LCB0aGUgdW5pbnRlcnByZXRlZCBjb250ZW50cyBvZiBhbnkgb3IgYWxsIEFQUG4gYW5kIENPTSBtYXJrZXJzCisgICAqIGNhbiBiZSBzYXZlZCBpbiBhIGxpc3QgZm9yIGV4YW1pbmF0aW9uIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICovCisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXJfbGlzdDsgLyogSGVhZCBvZiBsaXN0IG9mIHNhdmVkIG1hcmtlcnMgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBrbm93biB0aHJvdWdob3V0IGRlY29tcHJlc3NvciwgYnV0IGdlbmVyYWxseQorICAgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAgICovCisKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgZGVjb21wcmVzc2lvbiBzdGFydHVwCisgICAqLworICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLworICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLworCisgIGludCBtaW5fRENUX3NjYWxlZF9zaXplOwkvKiBzbWFsbGVzdCBEQ1Rfc2NhbGVkX3NpemUgb2YgYW55IGNvbXBvbmVudCAqLworCisgIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyBpbiBpbWFnZSAqLworICAvKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlcidzIGlucHV0IGFuZCBvdXRwdXQgcHJvZ3Jlc3MgaXMgbWVhc3VyZWQgaW4KKyAgICogdW5pdHMgb2YgImlNQ1UiIChpbnRlcmxlYXZlZCBNQ1UpIHJvd3MuICBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgTUNVIHJvd3MKKyAgICogaW4gZnVsbHkgaW50ZXJsZWF2ZWQgSlBFRyBzY2FucywgYnV0IGFyZSB1c2VkIHdoZXRoZXIgdGhlIHNjYW4gaXMKKyAgICogaW50ZXJsZWF2ZWQgb3Igbm90LiAgV2UgZGVmaW5lIGFuIGlNQ1Ugcm93IGFzIHZfc2FtcF9mYWN0b3IgRENUIGJsb2NrCisgICAqIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBUaGVyZWZvcmUsIHRoZSBJRENUIG91dHB1dCBjb250YWlucworICAgKiB2X3NhbXBfZmFjdG9yKkRDVF9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cyBvZiBhIGNvbXBvbmVudCBwZXIgaU1DVSByb3cuCisgICAqLworCisgIEpTQU1QTEUgKiBzYW1wbGVfcmFuZ2VfbGltaXQ7IC8qIHRhYmxlIGZvciBmYXN0IHJhbmdlLWxpbWl0aW5nICovCisKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSB2YWxpZCBkdXJpbmcgYW55IG9uZSBzY2FuLgorICAgKiBUaGV5IGRlc2NyaWJlIHRoZSBjb21wb25lbnRzIGFuZCBNQ1VzIGFjdHVhbGx5IGFwcGVhcmluZyBpbiB0aGUgc2Nhbi4KKyAgICogTm90ZSB0aGF0IHRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbXVzdCBub3QgdXNlIHRoZXNlIGZpZWxkcy4KKyAgICovCisgIGludCBjb21wc19pbl9zY2FuOwkJLyogIyBvZiBKUEVHIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuICovCisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjdXJfY29tcF9pbmZvW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgLyogKmN1cl9jb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT1MgKi8KKworICBKRElNRU5TSU9OIE1DVXNfcGVyX3JvdzsJLyogIyBvZiBNQ1VzIGFjcm9zcyB0aGUgaW1hZ2UgKi8KKyAgSkRJTUVOU0lPTiBNQ1Vfcm93c19pbl9zY2FuOwkvKiAjIG9mIE1DVSByb3dzIGluIHRoZSBpbWFnZSAqLworCisgIGludCBibG9ja3NfaW5fTUNVOwkJLyogIyBvZiBEQ1QgYmxvY2tzIHBlciBNQ1UgKi8KKyAgaW50IE1DVV9tZW1iZXJzaGlwW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworICAvKiBNQ1VfbWVtYmVyc2hpcFtpXSBpcyBpbmRleCBpbiBjdXJfY29tcF9pbmZvIG9mIGNvbXBvbmVudCBvd25pbmcgKi8KKyAgLyogaSd0aCBibG9jayBpbiBhbiBNQ1UgKi8KKworICBpbnQgU3MsIFNlLCBBaCwgQWw7CQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHBhcmFtZXRlcnMgZm9yIHNjYW4gKi8KKworICAvKiBUaGlzIGZpZWxkIGlzIHNoYXJlZCBiZXR3ZWVuIGVudHJvcHkgZGVjb2RlciBhbmQgbWFya2VyIHBhcnNlci4KKyAgICogSXQgaXMgZWl0aGVyIHplcm8gb3IgdGhlIGNvZGUgb2YgYSBKUEVHIG1hcmtlciB0aGF0IGhhcyBiZWVuCisgICAqIHJlYWQgZnJvbSB0aGUgZGF0YSBzb3VyY2UsIGJ1dCBoYXMgbm90IHlldCBiZWVuIHByb2Nlc3NlZC4KKyAgICovCisgIGludCB1bnJlYWRfbWFya2VyOworCisgIC8qCisgICAqIExpbmtzIHRvIGRlY29tcHJlc3Npb24gc3Vib2JqZWN0cyAobWV0aG9kcywgcHJpdmF0ZSB2YXJpYWJsZXMgb2YgbW9kdWxlcykKKyAgICovCisgIHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKiBtYXN0ZXI7CisgIHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyICogbWFpbjsKKyAgc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgKiBjb2VmOworICBzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciAqIHBvc3Q7CisgIHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgKiBpbnB1dGN0bDsKKyAgc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciAqIG1hcmtlcjsKKyAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICogZW50cm9weTsKKyAgc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgKiBpZGN0OworICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgKiB1cHNhbXBsZTsKKyAgc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKiBjY29udmVydDsKKyAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICogY3F1YW50aXplOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgIC8vIHwtLS0gYnl0ZV9vZmZzZXQgLS0tfC0gYml0X2xlZnQgLXwKKyAgLy8gIFwtLS0tLS0gMjcgLS0tLS0tLS8gXC0tLS0gNSAtLS0tLworICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX29mZnNldDsKKyAgc2hvcnQgcHJldl9kY1szXTsKKworICAvLyByZW1haW5pbmcgRU9CcyBpbiBFT0JSVU4KKyAgdW5zaWduZWQgc2hvcnQgRU9CUlVOOworCisgIC8vIHNhdmUgdGhlIGRlY29kZXIgY3VycmVudCBiaXQgYnVmZmVyLCBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyLgorICBJTlQzMiBnZXRfYnVmZmVyOworCisgIC8vIHNhdmUgdGhlIHJlc3RhcnQgaW5mby4KKyAgdW5zaWduZWQgc2hvcnQgcmVzdGFydHNfdG9fZ287CisgIHVuc2lnbmVkIGNoYXIgbmV4dF9yZXN0YXJ0X251bTsKK30gaHVmZm1hbl9vZmZzZXRfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgIC8vIFRoZSBoZWFkZXIgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhpcyBzY2FuCisgIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fb2Zmc2V0OworCisgIC8vIE51bWJlciBvZiBjb21wb25lbnRzIGluIHRoaXMgc2NhbgorICBpbnQgY29tcHNfaW5fc2NhbjsKKworICAvLyBOdW1iZXIgb2YgTUNVcyBpbiBlYWNoIHJvdworICBpbnQgTUNVc19wZXJfcm93OworICBpbnQgTUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworCisgIC8vIFRoZSBsYXN0IE1DVSBwb3NpdGlvbiBhbmQgaXRzIGRjIHZhbHVlIGluIHRoaXMgc2NhbgorICBodWZmbWFuX29mZnNldF9kYXRhIHByZXZfTUNVX29mZnNldDsKKworICBodWZmbWFuX29mZnNldF9kYXRhICoqb2Zmc2V0OworfSBodWZmbWFuX3NjYW5faGVhZGVyOworCisjZGVmaW5lIERFRkFVTFRfTUNVX1NBTVBMRV9TSVpFIDE2CisKK3R5cGVkZWYgc3RydWN0IHsKKworICAvLyBUaGUgbnVtYmVyIG9mIE1DVXMgdGhhdCB3ZSBzYW1wbGUgZWFjaCB0aW1lIGFzIGFuIGluZGV4IHBvaW50CisgIGludCBNQ1Vfc2FtcGxlX3NpemU7CisKKyAgLy8gTnVtYmVyIG9mIHNjYW4gaW4gdGhpcyBpbWFnZQorICBpbnQgc2Nhbl9jb3VudDsKKworICAvLyBOdW1iZXIgb2YgaU1DVXMgcm93cyBpbiB0aGlzIGltYWdlCisgIGludCB0b3RhbF9pTUNVX3Jvd3M7CisKKyAgLy8gTWVtb3J5IHVzZWQgYnkgc2NhbiBzdHJ1Y3QKKyAgc2l6ZV90IG1lbV91c2VkOworICBodWZmbWFuX3NjYW5faGVhZGVyICpzY2FuOworfSBodWZmbWFuX2luZGV4OworCisvKiAiT2JqZWN0IiBkZWNsYXJhdGlvbnMgZm9yIEpQRUcgbW9kdWxlcyB0aGF0IG1heSBiZSBzdXBwbGllZCBvciBjYWxsZWQKKyAqIGRpcmVjdGx5IGJ5IHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAqIEFzIHdpdGggYWxsIG9iamVjdHMgaW4gdGhlIEpQRUcgbGlicmFyeSwgdGhlc2Ugc3RydWN0cyBvbmx5IGRlZmluZSB0aGUKKyAqIHB1YmxpY2x5IHZpc2libGUgbWV0aG9kcyBhbmQgc3RhdGUgdmFyaWFibGVzIG9mIGEgbW9kdWxlLiAgQWRkaXRpb25hbAorICogcHJpdmF0ZSBmaWVsZHMgbWF5IGV4aXN0IGFmdGVyIHRoZSBwdWJsaWMgb25lcy4KKyAqLworCisKKy8qIEVycm9yIGhhbmRsZXIgb2JqZWN0ICovCisKK3N0cnVjdCBqcGVnX2Vycm9yX21nciB7CisgIC8qIEVycm9yIGV4aXQgaGFuZGxlcjogZG9lcyBub3QgcmV0dXJuIHRvIGNhbGxlciAqLworICBKTUVUSE9EKHZvaWQsIGVycm9yX2V4aXQsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKyAgLyogQ29uZGl0aW9uYWxseSBlbWl0IGEgdHJhY2Ugb3Igd2FybmluZyBtZXNzYWdlICovCisgIEpNRVRIT0Qodm9pZCwgZW1pdF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKSk7CisgIC8qIFJvdXRpbmUgdGhhdCBhY3R1YWxseSBvdXRwdXRzIGEgdHJhY2Ugb3IgZXJyb3IgbWVzc2FnZSAqLworICBKTUVUSE9EKHZvaWQsIG91dHB1dF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisgIC8qIEZvcm1hdCBhIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGUgbW9zdCByZWNlbnQgSlBFRyBlcnJvciBvciBtZXNzYWdlICovCisgIEpNRVRIT0Qodm9pZCwgZm9ybWF0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpKTsKKyNkZWZpbmUgSk1TR19MRU5HVEhfTUFYICAyMDAJLyogcmVjb21tZW5kZWQgc2l6ZSBvZiBmb3JtYXRfbWVzc2FnZSBidWZmZXIgKi8KKyAgLyogUmVzZXQgZXJyb3Igc3RhdGUgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGEgbmV3IGltYWdlICovCisgIEpNRVRIT0Qodm9pZCwgcmVzZXRfZXJyb3JfbWdyLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisKKyAgLyogVGhlIG1lc3NhZ2UgSUQgY29kZSBhbmQgYW55IHBhcmFtZXRlcnMgYXJlIHNhdmVkIGhlcmUuCisgICAqIEEgbWVzc2FnZSBjYW4gaGF2ZSBvbmUgc3RyaW5nIHBhcmFtZXRlciBvciB1cCB0byA4IGludCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgaW50IG1zZ19jb2RlOworI2RlZmluZSBKTVNHX1NUUl9QQVJNX01BWCAgODAKKyAgdW5pb24geworICAgIGludCBpWzhdOworICAgIGNoYXIgc1tKTVNHX1NUUl9QQVJNX01BWF07CisgIH0gbXNnX3Bhcm07CisKKyAgLyogU3RhbmRhcmQgc3RhdGUgdmFyaWFibGVzIGZvciBlcnJvciBmYWNpbGl0eSAqLworCisgIGludCB0cmFjZV9sZXZlbDsJCS8qIG1heCBtc2dfbGV2ZWwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCAqLworCisgIC8qIEZvciByZWNvdmVyYWJsZSBjb3JydXB0LWRhdGEgZXJyb3JzLCB3ZSBlbWl0IGEgd2FybmluZyBtZXNzYWdlLAorICAgKiBidXQga2VlcCBnb2luZyB1bmxlc3MgZW1pdF9tZXNzYWdlIGNob29zZXMgdG8gYWJvcnQuICBlbWl0X21lc3NhZ2UKKyAgICogc2hvdWxkIGNvdW50IHdhcm5pbmdzIGluIG51bV93YXJuaW5ncy4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbgorICAgKiBjYW4gY2hlY2sgZm9yIGJhZCBkYXRhIGJ5IHNlZWluZyBpZiBudW1fd2FybmluZ3MgaXMgbm9uemVybyBhdCB0aGUKKyAgICogZW5kIG9mIHByb2Nlc3NpbmcuCisgICAqLworICBsb25nIG51bV93YXJuaW5nczsJCS8qIG51bWJlciBvZiBjb3JydXB0LWRhdGEgd2FybmluZ3MgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgcG9pbnQgdG8gdGhlIHRhYmxlKHMpIG9mIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncy4KKyAgICogQW4gYXBwbGljYXRpb24gY2FuIGNoYW5nZSB0aGUgdGFibGUgcG9pbnRlciB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQKKyAgICogbWVzc2FnZSBsaXN0ICh0eXBpY2FsbHksIHRvIGNoYW5nZSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggZXJyb3JzIGFyZQorICAgKiByZXBvcnRlZCkuICBTb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBhZGQgYWRkaXRpb25hbCBlcnJvciBjb2RlcworICAgKiB0aGF0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgSlBFRyBsaWJyYXJ5IGVycm9yIG1lY2hhbmlzbTsgdGhlIHNlY29uZAorICAgKiB0YWJsZSBwb2ludGVyIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KKyAgICoKKyAgICogRmlyc3QgdGFibGUgaW5jbHVkZXMgYWxsIGVycm9ycyBnZW5lcmF0ZWQgYnkgSlBFRyBsaWJyYXJ5IGl0c2VsZi4KKyAgICogRXJyb3IgY29kZSAwIGlzIHJlc2VydmVkIGZvciBhICJubyBzdWNoIGVycm9yIHN0cmluZyIgbWVzc2FnZS4KKyAgICovCisgIGNvbnN0IGNoYXIgKiBjb25zdCAqIGpwZWdfbWVzc2FnZV90YWJsZTsgLyogTGlicmFyeSBlcnJvcnMgKi8KKyAgaW50IGxhc3RfanBlZ19tZXNzYWdlOyAgICAvKiBUYWJsZSBjb250YWlucyBzdHJpbmdzIDAuLmxhc3RfanBlZ19tZXNzYWdlICovCisgIC8qIFNlY29uZCB0YWJsZSBjYW4gYmUgYWRkZWQgYnkgYXBwbGljYXRpb24gKHNlZSBjanBlZy9kanBlZyBmb3IgZXhhbXBsZSkuCisgICAqIEl0IGNvbnRhaW5zIHN0cmluZ3MgbnVtYmVyZWQgZmlyc3RfYWRkb25fbWVzc2FnZS4ubGFzdF9hZGRvbl9tZXNzYWdlLgorICAgKi8KKyAgY29uc3QgY2hhciAqIGNvbnN0ICogYWRkb25fbWVzc2FnZV90YWJsZTsgLyogTm9uLWxpYnJhcnkgZXJyb3JzICovCisgIGludCBmaXJzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBmaXJzdCBzdHJpbmcgaW4gYWRkb24gdGFibGUgKi8KKyAgaW50IGxhc3RfYWRkb25fbWVzc2FnZTsJLyogY29kZSBmb3IgbGFzdCBzdHJpbmcgaW4gYWRkb24gdGFibGUgKi8KK307CisKKworLyogUHJvZ3Jlc3MgbW9uaXRvciBvYmplY3QgKi8KKworc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHsKKyAgSk1FVEhPRCh2b2lkLCBwcm9ncmVzc19tb25pdG9yLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisKKyAgbG9uZyBwYXNzX2NvdW50ZXI7CQkvKiB3b3JrIHVuaXRzIGNvbXBsZXRlZCBpbiB0aGlzIHBhc3MgKi8KKyAgbG9uZyBwYXNzX2xpbWl0OwkJLyogdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgaW4gdGhpcyBwYXNzICovCisgIGludCBjb21wbGV0ZWRfcGFzc2VzOwkJLyogcGFzc2VzIGNvbXBsZXRlZCBzbyBmYXIgKi8KKyAgaW50IHRvdGFsX3Bhc3NlczsJCS8qIHRvdGFsIG51bWJlciBvZiBwYXNzZXMgZXhwZWN0ZWQgKi8KK307CisKKworLyogRGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGNvbXByZXNzaW9uICovCisKK3N0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciB7CisgIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KKyAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKworICBKTUVUSE9EKHZvaWQsIGluaXRfZGVzdGluYXRpb24sIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIGVtcHR5X291dHB1dF9idWZmZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHRlcm1fZGVzdGluYXRpb24sIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworCisvKiBEYXRhIHNvdXJjZSBvYmplY3QgZm9yIGRlY29tcHJlc3Npb24gKi8KKworc3RydWN0IGpwZWdfc291cmNlX21nciB7CisgIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBidWZmZXIgKi8KKyAgY29uc3QgSk9DVEVUICogc3RhcnRfaW5wdXRfYnl0ZTsgLyogPT4gZmlyc3QgYnl0ZSB0byByZWFkIGZyb20gaW5wdXQgKi8KKyAgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCisgIHNpemVfdCBjdXJyZW50X29mZnNldDsgLyogY3VycmVudCByZWFkZWQgaW5wdXQgb2Zmc2V0ICovCisKKyAgSk1FVEhPRCh2b2lkLCBpbml0X3NvdXJjZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChib29sZWFuLCBmaWxsX2lucHV0X2J1ZmZlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBza2lwX2lucHV0X2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykpOworICBKTUVUSE9EKGJvb2xlYW4sIHJlc3luY190b19yZXN0YXJ0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpKTsKKyAgSk1FVEhPRCh2b2lkLCB0ZXJtX3NvdXJjZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChib29sZWFuLCBzZWVrX2lucHV0X2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIGJ5dGVfb2Zmc2V0KSk7Cit9OworCisKKy8qIE1lbW9yeSBtYW5hZ2VyIG9iamVjdC4KKyAqIEFsbG9jYXRlcyAic21hbGwiIG9iamVjdHMgKGEgZmV3IEsgdG90YWwpLCAibGFyZ2UiIG9iamVjdHMgKHRlbnMgb2YgSyksCisgKiBhbmQgInJlYWxseSBiaWciIG9iamVjdHMgKHZpcnR1YWwgYXJyYXlzIHdpdGggYmFja2luZyBzdG9yZSBpZiBuZWVkZWQpLgorICogVGhlIG1lbW9yeSBtYW5hZ2VyIGRvZXMgbm90IGFsbG93IGluZGl2aWR1YWwgb2JqZWN0cyB0byBiZSBmcmVlZDsgcmF0aGVyLAorICogZWFjaCBjcmVhdGVkIG9iamVjdCBpcyBhc3NpZ25lZCB0byBhIHBvb2wsIGFuZCB3aG9sZSBwb29scyBjYW4gYmUgZnJlZWQKKyAqIGF0IG9uY2UuICBUaGlzIGlzIGZhc3RlciBhbmQgbW9yZSBjb252ZW5pZW50IHRoYW4gcmVtZW1iZXJpbmcgZXhhY3RseSB3aGF0CisgKiB0byBmcmVlLCBlc3BlY2lhbGx5IHdoZXJlIG1hbGxvYygpL2ZyZWUoKSBhcmUgbm90IHRvbyBzcGVlZHkuCisgKiBOQjogYWxsb2Mgcm91dGluZXMgbmV2ZXIgcmV0dXJuIE5VTEwuICBUaGV5IGV4aXQgdG8gZXJyb3JfZXhpdCBpZiBub3QKKyAqIHN1Y2Nlc3NmdWwuCisgKi8KKworI2RlZmluZSBKUE9PTF9QRVJNQU5FTlQJMAkvKiBsYXN0cyB1bnRpbCBtYXN0ZXIgcmVjb3JkIGlzIGRlc3Ryb3llZCAqLworI2RlZmluZSBKUE9PTF9JTUFHRQkxCS8qIGxhc3RzIHVudGlsIGRvbmUgd2l0aCBpbWFnZS9kYXRhc3RyZWFtICovCisjZGVmaW5lIEpQT09MX05VTVBPT0xTCTIKKwordHlwZWRlZiBzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgKiBqdmlydF9zYXJyYXlfcHRyOwordHlwZWRlZiBzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgKiBqdmlydF9iYXJyYXlfcHRyOworCisKK3N0cnVjdCBqcGVnX21lbW9yeV9tZ3IgeworICAvKiBNZXRob2QgcG9pbnRlcnMgKi8KKyAgSk1FVEhPRCh2b2lkICosIGFsbG9jX3NtYWxsLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkJCQlzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CisgIEpNRVRIT0Qodm9pZCBGQVIgKiwgYWxsb2NfbGFyZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCQkJCSAgICAgc2l6ZV90IHNpemVvZm9iamVjdCkpOworICBKTUVUSE9EKEpTQU1QQVJSQVksIGFsbG9jX3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJCQkJICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csCisJCQkJICAgICBKRElNRU5TSU9OIG51bXJvd3MpKTsKKyAgSk1FVEhPRChKQkxPQ0tBUlJBWSwgYWxsb2NfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkJCQkgICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywKKwkJCQkgICAgICBKRElNRU5TSU9OIG51bXJvd3MpKTsKKyAgSk1FVEhPRChqdmlydF9zYXJyYXlfcHRyLCByZXF1ZXN0X3ZpcnRfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkJICBpbnQgcG9vbF9pZCwKKwkJCQkJCSAgYm9vbGVhbiBwcmVfemVybywKKwkJCQkJCSAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LAorCQkJCQkJICBKRElNRU5TSU9OIG51bXJvd3MsCisJCQkJCQkgIEpESU1FTlNJT04gbWF4YWNjZXNzKSk7CisgIEpNRVRIT0QoanZpcnRfYmFycmF5X3B0ciwgcmVxdWVzdF92aXJ0X2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkJCSAgaW50IHBvb2xfaWQsCisJCQkJCQkgIGJvb2xlYW4gcHJlX3plcm8sCisJCQkJCQkgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LAorCQkJCQkJICBKRElNRU5TSU9OIG51bXJvd3MsCisJCQkJCQkgIEpESU1FTlNJT04gbWF4YWNjZXNzKSk7CisgIEpNRVRIT0Qodm9pZCwgcmVhbGl6ZV92aXJ0X2FycmF5cywgKGpfY29tbW9uX3B0ciBjaW5mbykpOworICBKTUVUSE9EKEpTQU1QQVJSQVksIGFjY2Vzc192aXJ0X3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkJICAganZpcnRfc2FycmF5X3B0ciBwdHIsCisJCQkJCSAgIEpESU1FTlNJT04gc3RhcnRfcm93LAorCQkJCQkgICBKRElNRU5TSU9OIG51bV9yb3dzLAorCQkJCQkgICBib29sZWFuIHdyaXRhYmxlKSk7CisgIEpNRVRIT0QoSkJMT0NLQVJSQVksIGFjY2Vzc192aXJ0X2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkJICAgIGp2aXJ0X2JhcnJheV9wdHIgcHRyLAorCQkJCQkgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csCisJCQkJCSAgICBKRElNRU5TSU9OIG51bV9yb3dzLAorCQkJCQkgICAgYm9vbGVhbiB3cml0YWJsZSkpOworICBKTUVUSE9EKHZvaWQsIGZyZWVfcG9vbCwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpKTsKKyAgSk1FVEhPRCh2b2lkLCBzZWxmX2Rlc3RydWN0LCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisKKyAgLyogTGltaXQgb24gbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoaXMgSlBFRyBvYmplY3QuICAoTm90ZSB0aGF0IHRoaXMgaXMKKyAgICogbWVyZWx5IGFkdmlzb3J5LCBub3QgYSBndWFyYW50ZWVkIG1heGltdW07IGl0IG9ubHkgYWZmZWN0cyB0aGUgc3BhY2UKKyAgICogdXNlZCBmb3IgdmlydHVhbC1hcnJheSBidWZmZXJzLikgIE1heSBiZSBjaGFuZ2VkIGJ5IG91dGVyIGFwcGxpY2F0aW9uCisgICAqIGFmdGVyIGNyZWF0aW5nIHRoZSBKUEVHIG9iamVjdC4KKyAgICovCisgIGxvbmcgbWF4X21lbW9yeV90b191c2U7CisKKyAgLyogTWF4aW11bSBhbGxvY2F0aW9uIHJlcXVlc3QgYWNjZXB0ZWQgYnkgYWxsb2NfbGFyZ2UuICovCisgIGxvbmcgbWF4X2FsbG9jX2NodW5rOworfTsKKworCisvKiBSb3V0aW5lIHNpZ25hdHVyZSBmb3IgYXBwbGljYXRpb24tc3VwcGxpZWQgbWFya2VyIHByb2Nlc3NpbmcgbWV0aG9kcy4KKyAqIE5lZWQgbm90IHBhc3MgbWFya2VyIGNvZGUgc2luY2UgaXQgaXMgc3RvcmVkIGluIGNpbmZvLT51bnJlYWRfbWFya2VyLgorICovCit0eXBlZGVmIEpNRVRIT0QoYm9vbGVhbiwganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIHJvdXRpbmVzIGNhbGxlZCBieSBhcHBsaWNhdGlvbi4KKyAqIFRoZSBKUFAgbWFjcm8gaGlkZXMgcHJvdG90eXBlIHBhcmFtZXRlcnMgZnJvbSBjb21waWxlcnMgdGhhdCBjYW4ndCBjb3BlLgorICogTm90ZSBKUFAgcmVxdWlyZXMgZG91YmxlIHBhcmVudGhlc2VzLgorICovCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSlBQKGFyZ2xpc3QpCWFyZ2xpc3QKKyNlbHNlCisjZGVmaW5lIEpQUChhcmdsaXN0KQkoKQorI2VuZGlmCisKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuCisgKiBXZSBzaG9ydGVuIGV4dGVybmFsIG5hbWVzIHRvIGJlIHVuaXF1ZSBpbiB0aGUgZmlyc3Qgc2l4IGxldHRlcnMsIHdoaWNoCisgKiBpcyBnb29kIGVub3VnaCBmb3IgYWxsIGtub3duIHN5c3RlbXMuCisgKiAoSWYgeW91ciBjb21waWxlciBpdHNlbGYgbmVlZHMgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MgdGhhbiAxNQorICogY2hhcmFjdGVycywgeW91IGFyZSBvdXQgb2YgbHVjay4gIEdldCBhIGJldHRlciBjb21waWxlci4pCisgKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19zdGRfZXJyb3IJCWpTdGRFcnJvcgorI2RlZmluZSBqcGVnX0NyZWF0ZUNvbXByZXNzCWpDcmVhQ29tcHJlc3MKKyNkZWZpbmUganBlZ19DcmVhdGVEZWNvbXByZXNzCWpDcmVhRGVjb21wcmVzcworI2RlZmluZSBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MJakRlc3RDb21wcmVzcworI2RlZmluZSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcwlqRGVzdERlY29tcHJlc3MKKyNkZWZpbmUganBlZ19zdGRpb19kZXN0CQlqU3RkRGVzdAorI2RlZmluZSBqcGVnX3N0ZGlvX3NyYwkJalN0ZFNyYworI2RlZmluZSBqcGVnX3NldF9kZWZhdWx0cwlqU2V0RGVmYXVsdHMKKyNkZWZpbmUganBlZ19zZXRfY29sb3JzcGFjZQlqU2V0Q29sb3JzcGFjZQorI2RlZmluZSBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZQlqRGVmQ29sb3JzcGFjZQorI2RlZmluZSBqcGVnX3NldF9xdWFsaXR5CWpTZXRRdWFsaXR5CisjZGVmaW5lIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5CWpTZXRMUXVhbGl0eQorI2RlZmluZSBqcGVnX2FkZF9xdWFudF90YWJsZQlqQWRkUXVhbnRUYWJsZQorI2RlZmluZSBqcGVnX3F1YWxpdHlfc2NhbGluZwlqUXVhbGl0eVNjYWxpbmcKKyNkZWZpbmUganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24JalNpbVByb2dyZXNzCisjZGVmaW5lIGpwZWdfc3VwcHJlc3NfdGFibGVzCWpTdXBwcmVzc1RhYmxlcworI2RlZmluZSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlCWpBbGNRVGFibGUKKyNkZWZpbmUganBlZ19hbGxvY19odWZmX3RhYmxlCWpBbGNIVGFibGUKKyNkZWZpbmUganBlZ19zdGFydF9jb21wcmVzcwlqU3RydENvbXByZXNzCisjZGVmaW5lIGpwZWdfd3JpdGVfc2NhbmxpbmVzCWpXcnRTY2FubGluZXMKKyNkZWZpbmUganBlZ19maW5pc2hfY29tcHJlc3MJakZpbkNvbXByZXNzCisjZGVmaW5lIGpwZWdfd3JpdGVfcmF3X2RhdGEJaldydFJhd0RhdGEKKyNkZWZpbmUganBlZ193cml0ZV9tYXJrZXIJaldydE1hcmtlcgorI2RlZmluZSBqcGVnX3dyaXRlX21faGVhZGVyCWpXcnRNSGVhZGVyCisjZGVmaW5lIGpwZWdfd3JpdGVfbV9ieXRlCWpXcnRNQnl0ZQorI2RlZmluZSBqcGVnX3dyaXRlX3RhYmxlcwlqV3J0VGFibGVzCisjZGVmaW5lIGpwZWdfcmVhZF9oZWFkZXIJalJlYWRIZWFkZXIKKyNkZWZpbmUganBlZ19zdGFydF9kZWNvbXByZXNzCWpTdHJ0RGVjb21wcmVzcworI2RlZmluZSBqcGVnX3JlYWRfc2NhbmxpbmVzCWpSZWFkU2NhbmxpbmVzCisjZGVmaW5lIGpwZWdfZmluaXNoX2RlY29tcHJlc3MJakZpbkRlY29tcHJlc3MKKyNkZWZpbmUganBlZ19yZWFkX3Jhd19kYXRhCWpSZWFkUmF3RGF0YQorI2RlZmluZSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucwlqSGFzTXVsdFNjbgorI2RlZmluZSBqcGVnX3N0YXJ0X291dHB1dAlqU3RydE91dHB1dAorI2RlZmluZSBqcGVnX2ZpbmlzaF9vdXRwdXQJakZpbk91dHB1dAorI2RlZmluZSBqcGVnX2lucHV0X2NvbXBsZXRlCWpJbkNvbXBsZXRlCisjZGVmaW5lIGpwZWdfbmV3X2NvbG9ybWFwCWpOZXdDTWFwCisjZGVmaW5lIGpwZWdfY29uc3VtZV9pbnB1dAlqQ29uc3VtZUlucHV0CisjZGVmaW5lIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucwlqQ2FsY0RpbWVuc2lvbnMKKyNkZWZpbmUganBlZ19zYXZlX21hcmtlcnMJalNhdmVNYXJrZXJzCisjZGVmaW5lIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IJalNldE1hcmtlcgorI2RlZmluZSBqcGVnX3JlYWRfY29lZmZpY2llbnRzCWpSZWFkQ29lZnMKKyNkZWZpbmUganBlZ193cml0ZV9jb2VmZmljaWVudHMJaldydENvZWZzCisjZGVmaW5lIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzCWpDb3B5Q3JpdAorI2RlZmluZSBqcGVnX2Fib3J0X2NvbXByZXNzCWpBYnJ0Q29tcHJlc3MKKyNkZWZpbmUganBlZ19hYm9ydF9kZWNvbXByZXNzCWpBYnJ0RGVjb21wcmVzcworI2RlZmluZSBqcGVnX2Fib3J0CQlqQWJvcnQKKyNkZWZpbmUganBlZ19kZXN0cm95CQlqRGVzdHJveQorI2RlZmluZSBqcGVnX3Jlc3luY190b19yZXN0YXJ0CWpSZXN5bmNSZXN0YXJ0CisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisKKy8qIERlZmF1bHQgZXJyb3ItbWFuYWdlbWVudCBzZXR1cCAqLworRVhURVJOKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKSBqcGVnX3N0ZF9lcnJvcgorCUpQUCgoc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyKSk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0cy4KKyAqIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgYW5kIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoKSBhcmUgdGhlIGV4cG9ydGVkCisgKiBuYW1lcyB0aGF0IGFwcGxpY2F0aW9ucyBzaG91bGQgY2FsbC4gIFRoZXNlIGV4cGFuZCB0byBjYWxscyBvbgorICoganBlZ19DcmVhdGVDb21wcmVzcyBhbmQganBlZ19DcmVhdGVEZWNvbXByZXNzIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcGFzc2VkIGZvciB2ZXJzaW9uIG1pc21hdGNoIGNoZWNraW5nLgorICogTkI6IHlvdSBtdXN0IHNldCB1cCB0aGUgZXJyb3ItbWFuYWdlciBCRUZPUkUgY2FsbGluZyBqcGVnX2NyZWF0ZV94eHguCisgKi8KKyNkZWZpbmUganBlZ19jcmVhdGVfY29tcHJlc3MoY2luZm8pIFwKKyAgICBqcGVnX0NyZWF0ZUNvbXByZXNzKChjaW5mbyksIEpQRUdfTElCX1ZFUlNJT04sIFwKKwkJCShzaXplX3QpIHNpemVvZihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKQorI2RlZmluZSBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKGNpbmZvKSBcCisgICAganBlZ19DcmVhdGVEZWNvbXByZXNzKChjaW5mbyksIEpQRUdfTElCX1ZFUlNJT04sIFwKKwkJCSAgKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKK0VYVEVSTih2b2lkKSBqcGVnX0NyZWF0ZUNvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKSk7CitFWFRFUk4odm9pZCkganBlZ19DcmVhdGVEZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKSk7CisvKiBEZXN0cnVjdGlvbiBvZiBKUEVHIGNvbXByZXNzaW9uIG9iamVjdHMgKi8KK0VYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBTdGFuZGFyZCBkYXRhIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWFuYWdlcnM6IHN0ZGlvIHN0cmVhbXMuICovCisvKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUgYmVmb3JlIGFuZCBjbG9zaW5nIGFmdGVyLiAqLworRVhURVJOKHZvaWQpIGpwZWdfc3RkaW9fZGVzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogb3V0ZmlsZSkpOworRVhURVJOKHZvaWQpIGpwZWdfc3RkaW9fc3JjIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkpOworCisvKiBEZWZhdWx0IHBhcmFtZXRlciBzZXR1cCBmb3IgY29tcHJlc3Npb24gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3NldF9kZWZhdWx0cyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisvKiBDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2V0dXAgYWlkcyAqLworRVhURVJOKHZvaWQpIGpwZWdfc2V0X2NvbG9yc3BhY2UgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19zZXRfcXVhbGl0eSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgcXVhbGl0eSwKKwkJCQkgICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7CitFWFRFUk4odm9pZCkganBlZ19zZXRfbGluZWFyX3F1YWxpdHkgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBpbnQgc2NhbGVfZmFjdG9yLAorCQkJCQkgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2FkZF9xdWFudF90YWJsZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAorCQkJCSAgICAgICBpbnQgc2NhbGVfZmFjdG9yLAorCQkJCSAgICAgICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7CitFWFRFUk4oaW50KSBqcGVnX3F1YWxpdHlfc2NhbGluZyBKUFAoKGludCBxdWFsaXR5KSk7CitFWFRFUk4odm9pZCkganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfc3VwcHJlc3NfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgIGJvb2xlYW4gc3VwcHJlc3MpKTsKK0VYVEVSTihKUVVBTlRfVEJMICopIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTihKSFVGRl9UQkwgKikganBlZ19hbGxvY19odWZmX3RhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CisKKy8qIE1haW4gZW50cnkgcG9pbnRzIGZvciBjb21wcmVzc2lvbiAqLworRVhURVJOKHZvaWQpIGpwZWdfc3RhcnRfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICBib29sZWFuIHdyaXRlX2FsbF90YWJsZXMpKTsKK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3NjYW5saW5lcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAorCQkJCQkgICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKSk7CitFWFRFUk4odm9pZCkganBlZ19maW5pc2hfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBSZXBsYWNlcyBqcGVnX3dyaXRlX3NjYW5saW5lcyB3aGVuIHdyaXRpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuICovCitFWFRFUk4oSkRJTUVOU0lPTikganBlZ193cml0ZV9yYXdfZGF0YSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSlNBTVBJTUFHRSBkYXRhLAorCQkJCQkgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpKTsKKworLyogV3JpdGUgYSBzcGVjaWFsIG1hcmtlci4gIFNlZSBsaWJqcGVnLmRvYyBjb25jZXJuaW5nIHNhZmUgdXNhZ2UuICovCitFWFRFUk4odm9pZCkganBlZ193cml0ZV9tYXJrZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAorCSAgICAgY29uc3QgSk9DVEVUICogZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKKy8qIFNhbWUsIGJ1dCBwaWVjZW1lYWwuICovCitFWFRFUk4odm9pZCkganBlZ193cml0ZV9tX2hlYWRlcgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7CitFWFRFUk4odm9pZCkganBlZ193cml0ZV9tX2J5dGUKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKSk7CisKKy8qIEFsdGVybmF0ZSBjb21wcmVzc2lvbiBmdW5jdGlvbjoganVzdCB3cml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZSBmaWxlICovCitFWFRFUk4odm9pZCkganBlZ193cml0ZV90YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBEZWNvbXByZXNzaW9uIHN0YXJ0dXA6IHJlYWQgc3RhcnQgb2YgSlBFRyBkYXRhc3RyZWFtIHRvIHNlZSB3aGF0J3MgdGhlcmUgKi8KK0VYVEVSTihpbnQpIGpwZWdfcmVhZF9oZWFkZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgYm9vbGVhbiByZXF1aXJlX2ltYWdlKSk7CisvKiBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiAqLworI2RlZmluZSBKUEVHX1NVU1BFTkRFRAkJMCAvKiBTdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgaW5wdXQgZGF0YSAqLworI2RlZmluZSBKUEVHX0hFQURFUl9PSwkJMSAvKiBGb3VuZCB2YWxpZCBpbWFnZSBkYXRhc3RyZWFtICovCisjZGVmaW5lIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZCTIgLyogRm91bmQgdmFsaWQgdGFibGUtc3BlY3Mtb25seSBkYXRhc3RyZWFtICovCisvKiBJZiB5b3UgcGFzcyByZXF1aXJlX2ltYWdlID0gVFJVRSAobm9ybWFsIGNhc2UpLCB5b3UgbmVlZCBub3QgY2hlY2sgZm9yCisgKiBhIFRBQkxFU19PTkxZIHJldHVybiBjb2RlOyBhbiBhYmJyZXZpYXRlZCBmaWxlIHdpbGwgY2F1c2UgYW4gZXJyb3IgZXhpdC4KKyAqIEpQRUdfU1VTUEVOREVEIGlzIG9ubHkgcG9zc2libGUgaWYgeW91IHVzZSBhIGRhdGEgc291cmNlIG1vZHVsZSB0aGF0IGNhbgorICogZ2l2ZSBhIHN1c3BlbnNpb24gcmV0dXJuICh0aGUgc3RkaW8gc291cmNlIG1vZHVsZSBkb2Vzbid0KS4KKyAqLworCisvKiBNYWluIGVudHJ5IHBvaW50cyBmb3IgZGVjb21wcmVzc2lvbiAqLworRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X3RpbGVfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfc2NhbmxpbmVzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAorCQkJCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpKTsKK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfc2NhbmxpbmVzX2Zyb20gSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCQkJCSAgICBpbnQgbGluZV9vZmZzZXQsCisJCQkJCSAgICBKRElNRU5TSU9OIG1heF9saW5lcykpOworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF90aWxlX3NjYW5saW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2luaXRfcmVhZF90aWxlX3NjYW5saW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LAorCQkgICAgICAgICAgICAgICAgaW50ICpzdGFydF94LCBpbnQgKnN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkpOworRVhURVJOKGJvb2xlYW4pIGpwZWdfZmluaXNoX2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIFJlcGxhY2VzIGpwZWdfcmVhZF9zY2FubGluZXMgd2hlbiByZWFkaW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLiAqLworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9yYXdfZGF0YSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgIEpTQU1QSU1BR0UgZGF0YSwKKwkJCQkJICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpKTsKKworLyogQWRkaXRpb25hbCBlbnRyeSBwb2ludHMgZm9yIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICovCitFWFRFUk4oYm9vbGVhbikganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF9vdXRwdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgICBpbnQgc2Nhbl9udW1iZXIpKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX2ZpbmlzaF9vdXRwdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19pbnB1dF9jb21wbGV0ZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX25ld19jb2xvcm1hcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihpbnQpIGpwZWdfY29uc3VtZV9pbnB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKy8qIFJldHVybiB2YWx1ZSBpcyBvbmUgb2Y6ICovCisvKiAjZGVmaW5lIEpQRUdfU1VTUEVOREVECTAgICAgU3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGlucHV0IGRhdGEgKi8KKyNkZWZpbmUgSlBFR19SRUFDSEVEX1NPUwkxIC8qIFJlYWNoZWQgc3RhcnQgb2YgbmV3IHNjYW4gKi8KKyNkZWZpbmUgSlBFR19SRUFDSEVEX0VPSQkyIC8qIFJlYWNoZWQgZW5kIG9mIGltYWdlICovCisjZGVmaW5lIEpQRUdfUk9XX0NPTVBMRVRFRAkzIC8qIENvbXBsZXRlZCBvbmUgaU1DVSByb3cgKi8KKyNkZWZpbmUgSlBFR19TQ0FOX0NPTVBMRVRFRAk0IC8qIENvbXBsZXRlZCBsYXN0IGlNQ1Ugcm93IG9mIGEgc2NhbiAqLworCisvKiBQcmVjYWxjdWxhdGUgb3V0cHV0IGRpbWVuc2lvbnMgZm9yIGN1cnJlbnQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAqLworRVhURVJOKHZvaWQpIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogQ29udHJvbCBzYXZpbmcgb2YgQ09NIGFuZCBBUFBuIG1hcmtlcnMgaW50byBtYXJrZXJfbGlzdC4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3NhdmVfbWFya2VycworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAorCSAgICAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdCkpOworCisvKiBJbnN0YWxsIGEgc3BlY2lhbCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgQ09NIG9yIEFQUG4gbWFya2Vycy4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCisJICAgICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJvdXRpbmUpKTsKKworLyogUmVhZCBvciB3cml0ZSByYXcgRENUIGNvZWZmaWNpZW50cyAtLS0gdXNlZnVsIGZvciBsb3NzbGVzcyB0cmFuc2NvZGluZy4gKi8KK0VYVEVSTihqdmlydF9iYXJyYXlfcHRyICopIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19idWlsZF9odWZmbWFuX2luZGV4CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkpOworRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7CitFWFRFUk4odm9pZCkganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkJCQlqX2NvbXByZXNzX3B0ciBkc3RpbmZvKSk7CisKKy8qIElmIHlvdSBjaG9vc2UgdG8gYWJvcnQgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBiZWZvcmUgY29tcGxldGluZworICoganBlZ19maW5pc2hfKGRlKWNvbXByZXNzLCB0aGVuIHlvdSBuZWVkIHRvIGNsZWFuIHVwIHRvIHJlbGVhc2UgbWVtb3J5LAorICogdGVtcG9yYXJ5IGZpbGVzLCBldGMuICBZb3UgY2FuIGp1c3QgY2FsbCBqcGVnX2Rlc3Ryb3lfKGRlKWNvbXByZXNzCisgKiBpZiB5b3UncmUgZG9uZSB3aXRoIHRoZSBKUEVHIG9iamVjdCwgYnV0IGlmIHlvdSB3YW50IHRvIGNsZWFuIGl0IHVwIGFuZAorICogcmV1c2UgaXQsIGNhbGwgdGhpczoKKyAqLworRVhURVJOKHZvaWQpIGpwZWdfYWJvcnRfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfYWJvcnRfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogR2VuZXJpYyB2ZXJzaW9ucyBvZiBqcGVnX2Fib3J0IGFuZCBqcGVnX2Rlc3Ryb3kgdGhhdCB3b3JrIG9uIGVpdGhlcgorICogZmxhdm9yIG9mIEpQRUcgb2JqZWN0LiAgVGhlc2UgbWF5IGJlIG1vcmUgY29udmVuaWVudCBpbiBzb21lIHBsYWNlcy4KKyAqLworRVhURVJOKHZvaWQpIGpwZWdfYWJvcnQgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3kgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworLyogRGVmYXVsdCByZXN0YXJ0LW1hcmtlci1yZXN5bmMgcHJvY2VkdXJlIGZvciB1c2UgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyAqLworRVhURVJOKGJvb2xlYW4pIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgaW50IGRlc2lyZWQpKTsKKworRVhURVJOKHZvaWQpIGpwZWdfY29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpOworRVhURVJOKHZvaWQpIGpwZWdfZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpOworRVhURVJOKHZvaWQpIGpwZWdfY3JlYXRlX2h1ZmZtYW5faW5kZXgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4KTsKK0VYVEVSTih2b2lkKSBqcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2luZGV4X3NjYW4oal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgc2Nhbl9ubywgaW50IG9mZnNldCk7CitFWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2h1ZmZtYW5faW5kZXgoaHVmZm1hbl9pbmRleCAqaW5kZXgpOworCisKKy8qIFRoZXNlIG1hcmtlciBjb2RlcyBhcmUgZXhwb3J0ZWQgc2luY2UgYXBwbGljYXRpb25zIGFuZCBkYXRhIHNvdXJjZSBtb2R1bGVzCisgKiBhcmUgbGlrZWx5IHRvIHdhbnQgdG8gdXNlIHRoZW0uCisgKi8KKworI2RlZmluZSBKUEVHX1JTVDAJMHhEMAkvKiBSU1QwIG1hcmtlciBjb2RlICovCisjZGVmaW5lIEpQRUdfRU9JCTB4RDkJLyogRU9JIG1hcmtlciBjb2RlICovCisjZGVmaW5lIEpQRUdfQVBQMAkweEUwCS8qIEFQUDAgbWFya2VyIGNvZGUgKi8KKyNkZWZpbmUgSlBFR19DT00JMHhGRQkvKiBDT00gbWFya2VyIGNvZGUgKi8KKworCisvKiBJZiB3ZSBoYXZlIGEgYnJhaW4tZGFtYWdlZCBjb21waWxlciB0aGF0IGVtaXRzIHdhcm5pbmdzIChvciB3b3JzZSwgZXJyb3JzKQorICogZm9yIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0aGF0IGFyZSBuZXZlciBmaWxsZWQgaW4sIGtlZXAgaXQgcXVpZXQgYnkKKyAqIHN1cHBseWluZyBkdW1teSBkZWZpbml0aW9ucyBmb3IgdGhlIHZhcmlvdXMgc3Vic3RydWN0dXJlcy4KKyAqLworCisjaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKyNpZm5kZWYgSlBFR19JTlRFUk5BTFMJCS8qIHdpbGwgYmUgZGVmaW5lZCBpbiBqcGVnaW50LmggKi8KK3N0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ191cHNhbXBsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyIHsgbG9uZyBkdW1teTsgfTsKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworI2VuZGlmIC8qIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOICovCisKKworLyoKKyAqIFRoZSBKUEVHIGxpYnJhcnkgbW9kdWxlcyBkZWZpbmUgSlBFR19JTlRFUk5BTFMgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUuCisgKiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBhcmUgcmVhZCBvbmx5IHdoZW4gdGhhdCBpcyB0cnVlLgorICogQXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgaW5jbHVkZSBqcGVnaW50LmgsIGJ1dCBtYXkgd2lzaAorICogdG8gaW5jbHVkZSBqZXJyb3IuaC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqcGVnaW50LmgiCQkvKiBmZXRjaCBwcml2YXRlIGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImplcnJvci5oIgkJLyogZmV0Y2ggZXJyb3IgY29kZXMgdG9vICovCisjZW5kaWYKKworI2VuZGlmIC8qIEpQRUdMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9qcGVndHJhbi4xIGIvanBlZy9qcGVndHJhbi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTE4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pwZWd0cmFuLjEKQEAgLTAsMCArMSwyMzggQEAKKy5USCBKUEVHVFJBTiAxICIzIEF1Z3VzdCAxOTk3IgorLlNIIE5BTUUKK2pwZWd0cmFuIFwtIGxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIG9mIEpQRUcgZmlsZXMKKy5TSCBTWU5PUFNJUworLkIganBlZ3RyYW4KK1sKKy5JIG9wdGlvbnMKK10KK1sKKy5JIGZpbGVuYW1lCitdCisuTFAKKy5TSCBERVNDUklQVElPTgorLkxQCisuQiBqcGVndHJhbgorcGVyZm9ybXMgdmFyaW91cyB1c2VmdWwgdHJhbnNmb3JtYXRpb25zIG9mIEpQRUcgZmlsZXMuCitJdCBjYW4gdHJhbnNsYXRlIHRoZSBjb2RlZCByZXByZXNlbnRhdGlvbiBmcm9tIG9uZSB2YXJpYW50IG9mIEpQRUcgdG8gYW5vdGhlciwKK2ZvciBleGFtcGxlIGZyb20gYmFzZWxpbmUgSlBFRyB0byBwcm9ncmVzc2l2ZSBKUEVHIG9yIHZpY2UgdmVyc2EuICBJdCBjYW4gYWxzbworcGVyZm9ybSBzb21lIHJlYXJyYW5nZW1lbnRzIG9mIHRoZSBpbWFnZSBkYXRhLCBmb3IgZXhhbXBsZSB0dXJuaW5nIGFuIGltYWdlCitmcm9tIGxhbmRzY2FwZSB0byBwb3J0cmFpdCBmb3JtYXQgYnkgcm90YXRpb24uCisuUFAKKy5CIGpwZWd0cmFuCit3b3JrcyBieSByZWFycmFuZ2luZyB0aGUgY29tcHJlc3NlZCBkYXRhIChEQ1QgY29lZmZpY2llbnRzKSwgd2l0aG91dAorZXZlciBmdWxseSBkZWNvZGluZyB0aGUgaW1hZ2UuICBUaGVyZWZvcmUsIGl0cyB0cmFuc2Zvcm1hdGlvbnMgYXJlIGxvc3NsZXNzOgordGhlcmUgaXMgbm8gaW1hZ2UgZGVncmFkYXRpb24gYXQgYWxsLCB3aGljaCB3b3VsZCBub3QgYmUgdHJ1ZSBpZiB5b3UgdXNlZAorLkIgZGpwZWcKK2ZvbGxvd2VkIGJ5CisuQiBjanBlZwordG8gYWNjb21wbGlzaCB0aGUgc2FtZSBjb252ZXJzaW9uLiAgQnV0IGJ5IHRoZSBzYW1lIHRva2VuLAorLkIganBlZ3RyYW4KK2Nhbm5vdCBwZXJmb3JtIGxvc3N5IG9wZXJhdGlvbnMgc3VjaCBhcyBjaGFuZ2luZyB0aGUgaW1hZ2UgcXVhbGl0eS4KKy5QUAorLkIganBlZ3RyYW4KK3JlYWRzIHRoZSBuYW1lZCBKUEVHL0pGSUYgZmlsZSwgb3IgdGhlIHN0YW5kYXJkIGlucHV0IGlmIG5vIGZpbGUgaXMKK25hbWVkLCBhbmQgcHJvZHVjZXMgYSBKUEVHL0pGSUYgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorLlNIIE9QVElPTlMKK0FsbCBzd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkOyBmb3IgZXhhbXBsZSwKKy5CIFwtb3B0aW1pemUKK21heSBiZSB3cml0dGVuCisuQiBcLW9wdAorb3IKKy5CUiBcLW8gLgorVXBwZXIgYW5kIGxvd2VyIGNhc2UgYXJlIGVxdWl2YWxlbnQuCitCcml0aXNoIHNwZWxsaW5ncyBhcmUgYWxzbyBhY2NlcHRlZCAoZS5nLiwKKy5CUiBcLW9wdGltaXNlICksCit0aG91Z2ggZm9yIGJyZXZpdHkgdGhlc2UgYXJlIG5vdCBtZW50aW9uZWQgYmVsb3cuCisuUFAKK1RvIHNwZWNpZnkgdGhlIGNvZGVkIEpQRUcgcmVwcmVzZW50YXRpb24gdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUsCisuQiBqcGVndHJhbgorYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgc3dpdGNoZXMgcmVjb2duaXplZCBieQorLkJSIGNqcGVnIDoKKy5UUAorLkIgXC1vcHRpbWl6ZQorUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLgorLlRQCisuQiBcLXByb2dyZXNzaXZlCitDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLgorLlRQCisuQkkgXC1yZXN0YXJ0ICIgTiIKK0VtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5IE4gTUNVIGJsb2NrcyBpZiAiQiIgaXMKK2F0dGFjaGVkIHRvIHRoZSBudW1iZXIuCisuVFAKKy5CSSBcLXNjYW5zICIgZmlsZSIKK1VzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCisuUFAKK1NlZQorLkJSIGNqcGVnICgxKQorZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGVzZSBzd2l0Y2hlcy4KK0lmIHlvdSBzcGVjaWZ5IG5vbmUgb2YgdGhlc2Ugc3dpdGNoZXMsIHlvdSBnZXQgYSBwbGFpbiBiYXNlbGluZS1KUEVHIG91dHB1dAorZmlsZS4gIFRoZSBxdWFsaXR5IHNldHRpbmcgYW5kIHNvIGZvcnRoIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnB1dCBmaWxlLgorLlBQCitUaGUgaW1hZ2UgY2FuIGJlIGxvc3NsZXNzbHkgdHJhbnNmb3JtZWQgYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSBzd2l0Y2hlczoKKy5UUAorLkIgXC1mbGlwIGhvcml6b250YWwKK01pcnJvciBpbWFnZSBob3Jpem9udGFsbHkgKGxlZnQtcmlnaHQpLgorLlRQCisuQiBcLWZsaXAgdmVydGljYWwKK01pcnJvciBpbWFnZSB2ZXJ0aWNhbGx5ICh0b3AtYm90dG9tKS4KKy5UUAorLkIgXC1yb3RhdGUgOTAKK1JvdGF0ZSBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZS4KKy5UUAorLkIgXC1yb3RhdGUgMTgwCitSb3RhdGUgaW1hZ2UgMTgwIGRlZ3JlZXMuCisuVFAKKy5CIFwtcm90YXRlIDI3MAorUm90YXRlIGltYWdlIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZSAob3IgOTAgY2N3KS4KKy5UUAorLkIgXC10cmFuc3Bvc2UKK1RyYW5zcG9zZSBpbWFnZSAoYWNyb3NzIFVMLXRvLUxSIGF4aXMpLgorLlRQCisuQiBcLXRyYW5zdmVyc2UKK1RyYW5zdmVyc2UgdHJhbnNwb3NlIChhY3Jvc3MgVVItdG8tTEwgYXhpcykuCisuUFAKK1RoZSB0cmFuc3Bvc2UgdHJhbnNmb3JtYXRpb24gaGFzIG5vIHJlc3RyaWN0aW9ucyByZWdhcmRpbmcgaW1hZ2UgZGltZW5zaW9ucy4KK1RoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgb3BlcmF0ZSByYXRoZXIgb2RkbHkgaWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdAorYSBtdWx0aXBsZSBvZiB0aGUgaU1DVSBzaXplICh1c3VhbGx5IDggb3IgMTYgcGl4ZWxzKSwgYmVjYXVzZSB0aGV5IGNhbiBvbmx5Cit0cmFuc2Zvcm0gY29tcGxldGUgYmxvY2tzIG9mIERDVCBjb2VmZmljaWVudCBkYXRhIGluIHRoZSBkZXNpcmVkIHdheS4KKy5QUAorLkJSIGpwZWd0cmFuICdzCitkZWZhdWx0IGJlaGF2aW9yIHdoZW4gdHJhbnNmb3JtaW5nIGFuIG9kZC1zaXplIGltYWdlIGlzIGRlc2lnbmVkCit0byBwcmVzZXJ2ZSBleGFjdCByZXZlcnNpYmlsaXR5IGFuZCBtYXRoZW1hdGljYWwgY29uc2lzdGVuY3kgb2YgdGhlCit0cmFuc2Zvcm1hdGlvbiBzZXQuICBBcyBzdGF0ZWQsIHRyYW5zcG9zZSBpcyBhYmxlIHRvIGZsaXAgdGhlIGVudGlyZSBpbWFnZQorYXJlYS4gIEhvcml6b250YWwgbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIGNvbHVtbiBhdCB0aGUgcmlnaHQgZWRnZQordW50b3VjaGVkLCBidXQgaXMgYWJsZSB0byBmbGlwIGFsbCByb3dzIG9mIHRoZSBpbWFnZS4gIFNpbWlsYXJseSwgdmVydGljYWwKK21pcnJvcmluZyBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVSByb3cgYXQgdGhlIGJvdHRvbSBlZGdlIHVudG91Y2hlZCwgYnV0IGlzCithYmxlIHRvIGZsaXAgYWxsIGNvbHVtbnMuICBUaGUgb3RoZXIgdHJhbnNmb3JtcyBjYW4gYmUgYnVpbHQgdXAgYXMgc2VxdWVuY2VzCitvZiB0cmFuc3Bvc2UgYW5kIGZsaXAgb3BlcmF0aW9uczsgZm9yIGNvbnNpc3RlbmN5LCB0aGVpciBhY3Rpb25zIG9uIGVkZ2UKK3BpeGVscyBhcmUgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgZW5kIHJlc3VsdCBvZiB0aGUgY29ycmVzcG9uZGluZwordHJhbnNwb3NlLWFuZC1mbGlwIHNlcXVlbmNlLgorLlBQCitGb3IgcHJhY3RpY2FsIHVzZSwgeW91IG1heSBwcmVmZXIgdG8gZGlzY2FyZCBhbnkgdW50cmFuc2Zvcm1hYmxlIGVkZ2UgcGl4ZWxzCityYXRoZXIgdGhhbiBoYXZpbmcgYSBzdHJhbmdlLWxvb2tpbmcgc3RyaXAgYWxvbmcgdGhlIHJpZ2h0IGFuZC9vciBib3R0b20gZWRnZXMKK29mIGEgdHJhbnNmb3JtZWQgaW1hZ2UuICBUbyBkbyB0aGlzLCBhZGQgdGhlCisuQiBcLXRyaW0KK3N3aXRjaDoKKy5UUAorLkIgXC10cmltCitEcm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzLgorLlBQCitPYnZpb3VzbHksIGEgdHJhbnNmb3JtYXRpb24gd2l0aAorLkIgXC10cmltCitpcyBub3QgcmV2ZXJzaWJsZSwgc28gc3RyaWN0bHkgc3BlYWtpbmcKKy5CIGpwZWd0cmFuCit3aXRoIHRoaXMgc3dpdGNoIGlzIG5vdCBsb3NzbGVzcy4gIEFsc28sIHRoZSBleHBlY3RlZCBtYXRoZW1hdGljYWwKK2VxdWl2YWxlbmNlcyBiZXR3ZWVuIHRoZSB0cmFuc2Zvcm1hdGlvbnMgbm8gbG9uZ2VyIGhvbGQuICBGb3IgZXhhbXBsZSwKKy5CIFwtcm90IDI3MCAtdHJpbQordHJpbXMgb25seSB0aGUgYm90dG9tIGVkZ2UsIGJ1dAorLkIgXC1yb3QgOTAgLXRyaW0KK2ZvbGxvd2VkIGJ5CisuQiBcLXJvdCAxODAgLXRyaW0KK3RyaW1zIGJvdGggZWRnZXMuCisuUFAKK0Fub3RoZXIgbm90LXN0cmljdGx5LWxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIHN3aXRjaCBpczoKKy5UUAorLkIgXC1ncmF5c2NhbGUKK0ZvcmNlIGdyYXlzY2FsZSBvdXRwdXQuCisuUFAKK1RoaXMgb3B0aW9uIGRpc2NhcmRzIHRoZSBjaHJvbWluYW5jZSBjaGFubmVscyBpZiB0aGUgaW5wdXQgaW1hZ2UgaXMgWUNiQ3IKKyhpZSwgYSBzdGFuZGFyZCBjb2xvciBKUEVHKSwgcmVzdWx0aW5nIGluIGEgZ3JheXNjYWxlIEpQRUcgZmlsZS4gIFRoZQorbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHksIHNvIHRoaXMgaXMgYSBiZXR0ZXIgbWV0aG9kIG9mIHJlZHVjaW5nCit0byBncmF5c2NhbGUgdGhhbiBkZWNvbXByZXNzaW9uLCBjb252ZXJzaW9uLCBhbmQgcmVjb21wcmVzc2lvbi4gIFRoaXMgc3dpdGNoCitpcyBwYXJ0aWN1bGFybHkgaGFuZHkgZm9yIGZpeGluZyBhIG1vbm9jaHJvbWUgcGljdHVyZSB0aGF0IHdhcyBtaXN0YWtlbmx5CitlbmNvZGVkIGFzIGEgY29sb3IgSlBFRy4gIChJbiBzdWNoIGEgY2FzZSwgdGhlIHNwYWNlIHNhdmluZ3MgZnJvbSBnZXR0aW5nIHJpZAorb2YgdGhlIG5lYXItZW1wdHkgY2hyb21hIGNoYW5uZWxzIHdvbid0IGJlIGxhcmdlOyBidXQgdGhlIGRlY29kaW5nIHRpbWUgZm9yCithIGdyYXlzY2FsZSBKUEVHIGlzIHN1YnN0YW50aWFsbHkgbGVzcyB0aGFuIHRoYXQgZm9yIGEgY29sb3IgSlBFRy4pCisuUFAKKy5CIGpwZWd0cmFuCithbHNvIHJlY29nbml6ZXMgdGhlc2Ugc3dpdGNoZXMgdGhhdCBjb250cm9sIHdoYXQgdG8gZG8gd2l0aCAiZXh0cmEiIG1hcmtlcnMsCitzdWNoIGFzIGNvbW1lbnQgYmxvY2tzOgorLlRQCisuQiBcLWNvcHkgbm9uZQorQ29weSBubyBleHRyYSBtYXJrZXJzIGZyb20gc291cmNlIGZpbGUuICBUaGlzIHNldHRpbmcgc3VwcHJlc3NlcyBhbGwKK2NvbW1lbnRzIGFuZCBvdGhlciBleGNlc3MgYmFnZ2FnZSBwcmVzZW50IGluIHRoZSBzb3VyY2UgZmlsZS4KKy5UUAorLkIgXC1jb3B5IGNvbW1lbnRzCitDb3B5IG9ubHkgY29tbWVudCBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIGNvcGllcyBjb21tZW50cyBmcm9tIHRoZSBzb3VyY2UgZmlsZSwKK2J1dCBkaXNjYXJkcyBhbnkgb3RoZXIgaW5lc3NlbnRpYWwgZGF0YS4KKy5UUAorLkIgXC1jb3B5IGFsbAorQ29weSBhbGwgZXh0cmEgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBwcmVzZXJ2ZXMgbWlzY2VsbGFuZW91cyBtYXJrZXJzCitmb3VuZCBpbiB0aGUgc291cmNlIGZpbGUsIHN1Y2ggYXMgSkZJRiB0aHVtYm5haWxzIGFuZCBQaG90b3Nob3Agc2V0dGluZ3MuCitJbiBzb21lIGZpbGVzIHRoZXNlIGV4dHJhIG1hcmtlcnMgY2FuIGJlIHNpemFibGUuCisuUFAKK1RoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCisuQlIgIlwtY29weSBjb21tZW50cyIgLgorKE5vdGU6IGluIElKRyByZWxlYXNlcyB2NiBhbmQgdjZhLAorLkIganBlZ3RyYW4KK2Fsd2F5cyBkaWQgdGhlIGVxdWl2YWxlbnQgb2YKKy5CUiAiXC1jb3B5IG5vbmUiIC4pCisuUFAKK0FkZGl0aW9uYWwgc3dpdGNoZXMgcmVjb2duaXplZCBieSBqcGVndHJhbiBhcmU6CisuVFAKKy5CSSBcLW1heG1lbW9yeSAiIE4iCitTZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKK2luIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQorbnVtYmVyLiAgRm9yIGV4YW1wbGUsCisuQiBcLW1heCA0bQorc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCisuVFAKKy5CSSBcLW91dGZpbGUgIiBuYW1lIgorU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCisuVFAKKy5CIFwtdmVyYm9zZQorRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQorLkJSIFwtdiAncworZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgorLlRQCisuQiBcLWRlYnVnCitTYW1lIGFzCisuQlIgXC12ZXJib3NlIC4KKy5TSCBFWEFNUExFUworLkxQCitUaGlzIGV4YW1wbGUgY29udmVydHMgYSBiYXNlbGluZSBKUEVHIGZpbGUgdG8gcHJvZ3Jlc3NpdmUgZm9ybToKKy5JUAorLkIganBlZ3RyYW4gXC1wcm9ncmVzc2l2ZQorLkkgZm9vLmpwZworLkIgPgorLkkgZm9vcHJvZy5qcGcKKy5QUAorVGhpcyBleGFtcGxlIHJvdGF0ZXMgYW4gaW1hZ2UgOTAgZGVncmVlcyBjbG9ja3dpc2UsIGRpc2NhcmRpbmcgYW55Cit1bnJvdGF0YWJsZSBlZGdlIHBpeGVsczoKKy5JUAorLkIganBlZ3RyYW4gXC1yb3QgOTAgLXRyaW0KKy5JIGZvby5qcGcKKy5CID4KKy5JIGZvbzkwLmpwZworLlNIIEVOVklST05NRU5UCisuVFAKKy5CIEpQRUdNRU0KK0lmIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdHMgdmFsdWUgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGxpbWl0LgorVGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgZm9yIHRoZQorLkIgXC1tYXhtZW1vcnkKK3N3aXRjaC4KKy5CIEpQRUdNRU0KK292ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBzcGVjaWZpZWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQsIGFuZAoraXRzZWxmIGlzIG92ZXJyaWRkZW4gYnkgYW4gZXhwbGljaXQKKy5CUiBcLW1heG1lbW9yeSAuCisuU0ggU0VFIEFMU08KKy5CUiBjanBlZyAoMSksCisuQlIgZGpwZWcgKDEpLAorLkJSIHJkanBnY29tICgxKSwKKy5CUiB3cmpwZ2NvbSAoMSkKKy5icgorV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAorQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCisuU0ggQVVUSE9SCitJbmRlcGVuZGVudCBKUEVHIEdyb3VwCisuU0ggQlVHUworQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KKy5QUAorVGhlIHRyYW5zZm9ybSBvcHRpb25zIGNhbid0IHRyYW5zZm9ybSBvZGQtc2l6ZSBpbWFnZXMgcGVyZmVjdGx5LiAgVXNlCisuQiBcLXRyaW0KK2lmIHlvdSBkb24ndCBsaWtlIHRoZSByZXN1bHRzIHdpdGhvdXQgaXQuCisuUFAKK1RoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbnRvIG1lbW9yeSBhbmQgdGhlbiB3cml0dGVuIG91dCBhZ2FpbiwgZXZlbiBpbgorY2FzZXMgd2hlcmUgdGhpcyBpc24ndCByZWFsbHkgbmVjZXNzYXJ5LiAgRXhwZWN0IHN3YXBwaW5nIG9uIGxhcmdlIGltYWdlcywKK2VzcGVjaWFsbHkgd2hlbiB1c2luZyB0aGUgbW9yZSBjb21wbGV4IHRyYW5zZm9ybSBvcHRpb25zLgpkaWZmIC0tZ2l0IGEvanBlZy9qcGVndHJhbi5jIGIvanBlZy9qcGVndHJhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWYxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pwZWd0cmFuLmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBqcGVndHJhbi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBjb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgZm9yIEpQRUcgdHJhbnNjb2RpbmcuCisgKiBJdCBpcyB2ZXJ5IHNpbWlsYXIgdG8gY2pwZWcuYywgYnV0IHByb3ZpZGVzIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4KKyAqIGRpZmZlcmVudCBKUEVHIGZpbGUgZm9ybWF0cy4gIEl0IGFsc28gcHJvdmlkZXMgc29tZSBsb3NzbGVzcyBhbmQgc29ydC1vZi0KKyAqIGxvc3NsZXNzIHRyYW5zZm9ybWF0aW9ucyBvZiBKUEVHIGRhdGEuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKyNpbmNsdWRlICJ0cmFuc3VwcC5oIgkJLyogU3VwcG9ydCByb3V0aW5lcyBmb3IganBlZ3RyYW4gKi8KKyNpbmNsdWRlICJqdmVyc2lvbi5oIgkJLyogZm9yIHZlcnNpb24gbWVzc2FnZSAqLworCisjaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KKyNpZmRlZiBfX01XRVJLU19fCisjaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLworI2VuZGlmCisjaWZkZWYgVEhJTktfQworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KKyAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKKyAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCisgKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCisgKiBUaGUgbWFpbiBwcm9ncmFtIGluIHRoaXMgZmlsZSBkb2Vzbid0IGFjdHVhbGx5IHVzZSB0aGlzIGNhcGFiaWxpdHkuLi4KKyAqLworCisKK3N0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KK3N0YXRpYyBjaGFyICogb3V0ZmlsZW5hbWU7CS8qIGZvciAtb3V0ZmlsZSBzd2l0Y2ggKi8KK3N0YXRpYyBKQ09QWV9PUFRJT04gY29weW9wdGlvbjsJLyogLWNvcHkgc3dpdGNoICovCitzdGF0aWMganBlZ190cmFuc2Zvcm1faW5mbyB0cmFuc2Zvcm1vcHRpb247IC8qIGltYWdlIHRyYW5zZm9ybWF0aW9uIG9wdGlvbnMgKi8KKworCitMT0NBTCh2b2lkKQordXNhZ2UgKHZvaWQpCisvKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCit7CisgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOworI2Vsc2UKKyAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7CisjZW5kaWYKKworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtY29weSBub25lICAgICBDb3B5IG5vIGV4dHJhIG1hcmtlcnMgZnJvbSBzb3VyY2UgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtY29weSBjb21tZW50cyBDb3B5IG9ubHkgY29tbWVudCBtYXJrZXJzIChkZWZhdWx0KVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtY29weSBhbGwgICAgICBDb3B5IGFsbCBleHRyYSBtYXJrZXJzXG4iKTsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vcHRpbWl6ZSAgICAgIE9wdGltaXplIEh1ZmZtYW4gdGFibGUgKHNtYWxsZXIgZmlsZSwgYnV0IHNsb3cgY29tcHJlc3Npb24pXG4iKTsKKyNlbmRpZgorI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtcHJvZ3Jlc3NpdmUgICBDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlXG4iKTsKKyNlbmRpZgorI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIG1vZGlmeWluZyB0aGUgaW1hZ2U6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIFJlZHVjZSB0byBncmF5c2NhbGUgKG9taXQgY29sb3IgZGF0YSlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWZsaXAgW2hvcml6b250YWx8dmVydGljYWxdICBNaXJyb3IgaW1hZ2UgKGxlZnQtcmlnaHQgb3IgdG9wLWJvdHRvbSlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJvdGF0ZSBbOTB8MTgwfDI3MF0gICAgICAgICBSb3RhdGUgaW1hZ2UgKGRlZ3JlZXMgY2xvY2t3aXNlKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdHJhbnNwb3NlICAgICBUcmFuc3Bvc2UgaW1hZ2VcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRyYW5zdmVyc2UgICAgVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgaW1hZ2VcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRyaW0gICAgICAgICAgRHJvcCBub24tdHJhbnNmb3JtYWJsZSBlZGdlIGJsb2Nrc1xuIik7CisjZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1yZXN0YXJ0IE4gICAgIFNldCByZXN0YXJ0IGludGVydmFsIGluIHJvd3MsIG9yIGluIGJsb2NrcyB3aXRoIEJcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1heG1lbW9yeSBOICAgTWF4aW11bSBtZW1vcnkgdG8gdXNlIChpbiBrYnl0ZXMpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vdXRmaWxlIG5hbWUgIFNwZWNpZnkgbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgIG9yICAtZGVidWcgICBFbWl0IGRlYnVnIG91dHB1dFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgZm9yIHdpemFyZHM6XG4iKTsKKyNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1hcml0aG1ldGljICAgIFVzZSBhcml0aG1ldGljIGNvZGluZ1xuIik7CisjZW5kaWYKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1zY2FucyBmaWxlICAgIENyZWF0ZSBtdWx0aS1zY2FuIEpQRUcgcGVyIHNjcmlwdCBmaWxlXG4iKTsKKyNlbmRpZgorICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworTE9DQUwodm9pZCkKK3NlbGVjdF90cmFuc2Zvcm0gKEpYRk9STV9DT0RFIHRyYW5zZm9ybSkKKy8qIFNpbGx5IGxpdHRsZSByb3V0aW5lIHRvIGRldGVjdCBtdWx0aXBsZSB0cmFuc2Zvcm0gb3B0aW9ucywKKyAqIHdoaWNoIHdlIGNhbid0IGhhbmRsZS4KKyAqLworeworI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECisgIGlmICh0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID09IEpYRk9STV9OT05FIHx8CisgICAgICB0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID09IHRyYW5zZm9ybSkgeworICAgIHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuIG9ubHkgZG8gb25lIGltYWdlIHRyYW5zZm9ybWF0aW9uIGF0IGEgdGltZVxuIiwKKwkgICAgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyNlbHNlCisgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBpbWFnZSB0cmFuc2Zvcm1hdGlvbiB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgcHJvZ25hbWUpOworICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKK30KKworCitMT0NBTChpbnQpCitwYXJzZV9zd2l0Y2hlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJaW50IGxhc3RfZmlsZV9hcmdfc2VlbiwgYm9vbGVhbiBmb3JfcmVhbCkKKy8qIFBhcnNlIG9wdGlvbmFsIHN3aXRjaGVzLgorICogUmV0dXJucyBhcmd2W10gaW5kZXggb2YgZmlyc3QgZmlsZS1uYW1lIGFyZ3VtZW50ICg9PSBhcmdjIGlmIG5vbmUpLgorICogQW55IGZpbGUgbmFtZXMgd2l0aCBpbmRleGVzIDw9IGxhc3RfZmlsZV9hcmdfc2VlbiBhcmUgaWdub3JlZDsKKyAqIHRoZXkgaGF2ZSBwcmVzdW1hYmx5IGJlZW4gcHJvY2Vzc2VkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLgorICogKFBhc3MgMCBmb3IgbGFzdF9maWxlX2FyZ19zZWVuIG9uIHRoZSBmaXJzdCBvciBvbmx5IGl0ZXJhdGlvbi4pCisgKiBmb3JfcmVhbCBpcyBGQUxTRSBvbiB0aGUgZmlyc3QgKGR1bW15KSBwYXNzOyB3ZSBtYXkgc2tpcCBhbnkgZXhwZW5zaXZlCisgKiBwcm9jZXNzaW5nLgorICovCit7CisgIGludCBhcmduOworICBjaGFyICogYXJnOworICBib29sZWFuIHNpbXBsZV9wcm9ncmVzc2l2ZTsKKyAgY2hhciAqIHNjYW5zYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNjYW5zIHBhcm0gaWYgYW55ICovCisKKyAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLworICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBGQUxTRTsKKyAgb3V0ZmlsZW5hbWUgPSBOVUxMOworICBjb3B5b3B0aW9uID0gSkNPUFlPUFRfREVGQVVMVDsKKyAgdHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9IEpYRk9STV9OT05FOworICB0cmFuc2Zvcm1vcHRpb24udHJpbSA9IEZBTFNFOworICB0cmFuc2Zvcm1vcHRpb24uZm9yY2VfZ3JheXNjYWxlID0gRkFMU0U7CisgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLworCisgIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKKyAgICBhcmcgPSBhcmd2W2FyZ25dOworICAgIGlmICgqYXJnICE9ICctJykgeworICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCisgICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKKwlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLworCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLworICAgICAgfQorICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KKyAgICB9CisgICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCisKKyAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYXJpdGhtZXRpYyIsIDEpKSB7CisgICAgICAvKiBVc2UgYXJpdGhtZXRpYyBjb2RpbmcuICovCisjaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECisgICAgICBjaW5mby0+YXJpdGhfY29kZSA9IFRSVUU7CisjZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGFyaXRobWV0aWMgY29kaW5nIG5vdCBzdXBwb3J0ZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvcHkiLCAxKSkgeworICAgICAgLyogU2VsZWN0IHdoaWNoIGV4dHJhIG1hcmtlcnMgdG8gY29weS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAibm9uZSIsIDEpKSB7CisJY29weW9wdGlvbiA9IEpDT1BZT1BUX05PTkU7CisgICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJjb21tZW50cyIsIDEpKSB7CisJY29weW9wdGlvbiA9IEpDT1BZT1BUX0NPTU1FTlRTOworICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiYWxsIiwgMSkpIHsKKwljb3B5b3B0aW9uID0gSkNPUFlPUFRfQUxMOworICAgICAgfSBlbHNlCisJdXNhZ2UoKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGVidWciLCAxKSB8fCBrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKKyAgICAgIC8qIEVuYWJsZSBkZWJ1ZyBwcmludG91dHMuICovCisgICAgICAvKiBPbiBmaXJzdCAtZCwgcHJpbnQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiAqLworICAgICAgc3RhdGljIGJvb2xlYW4gcHJpbnRlZF92ZXJzaW9uID0gRkFMU0U7CisKKyAgICAgIGlmICghIHByaW50ZWRfdmVyc2lvbikgeworCWZwcmludGYoc3RkZXJyLCAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUdUUkFOLCB2ZXJzaW9uICVzXG4lc1xuIiwKKwkJSlZFUlNJT04sIEpDT1BZUklHSFQpOworCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7CisgICAgICB9CisgICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJmbGlwIiwgMSkpIHsKKyAgICAgIC8qIE1pcnJvciBsZWZ0LXJpZ2h0IG9yIHRvcC1ib3R0b20uICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImhvcml6b250YWwiLCAxKSkKKwlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9GTElQX0gpOworICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgInZlcnRpY2FsIiwgMSkpCisJc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fRkxJUF9WKTsKKyAgICAgIGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDEpKSB7CisgICAgICAvKiBGb3JjZSB0byBncmF5c2NhbGUuICovCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgICAgIHRyYW5zZm9ybW9wdGlvbi5mb3JjZV9ncmF5c2NhbGUgPSBUUlVFOworI2Vsc2UKKyAgICAgIHNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX05PTkUpOwkvKiBmb3JjZSBhbiBlcnJvciAqLworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7CisgICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLworICAgICAgbG9uZyBsdmFsOworICAgICAgY2hhciBjaCA9ICd4JzsKKworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCisJdXNhZ2UoKTsKKyAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQorCWx2YWwgKj0gMTAwMEw7CisgICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3B0aW1pemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJvcHRpbWlzZSIsIDEpKSB7CisgICAgICAvKiBFbmFibGUgZW50cm9weSBwYXJtIG9wdGltaXphdGlvbi4gKi8KKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBlbnRyb3B5IG9wdGltaXphdGlvbiB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvdXRmaWxlIiwgNCkpIHsKKyAgICAgIC8qIFNldCBvdXRwdXQgZmlsZSBuYW1lLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2FyZ25dOwkvKiBzYXZlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZSAqLworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJwcm9ncmVzc2l2ZSIsIDEpKSB7CisgICAgICAvKiBTZWxlY3Qgc2ltcGxlIHByb2dyZXNzaXZlIG1vZGUuICovCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IFRSVUU7CisgICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIGV4ZWN1dGlvbiB1bnRpbCBudW1fY29tcG9uZW50cyBpcyBrbm93bi4gKi8KKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgcHJvZ3Jlc3NpdmUgb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInJlc3RhcnQiLCAxKSkgeworICAgICAgLyogUmVzdGFydCBpbnRlcnZhbCBpbiBNQ1Ugcm93cyAob3IgaW4gTUNVcyB3aXRoICdiJykuICovCisgICAgICBsb25nIGx2YWw7CisgICAgICBjaGFyIGNoID0gJ3gnOworCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKKwl1c2FnZSgpOworICAgICAgaWYgKGx2YWwgPCAwIHx8IGx2YWwgPiA2NTUzNUwpCisJdXNhZ2UoKTsKKyAgICAgIGlmIChjaCA9PSAnYicgfHwgY2ggPT0gJ0InKSB7CisJY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAodW5zaWduZWQgaW50KSBsdmFsOworCWNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAwOyAvKiBlbHNlIHByaW9yICctcmVzdGFydCBuJyBvdmVycmlkZXMgbWUgKi8KKyAgICAgIH0gZWxzZSB7CisJY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IChpbnQpIGx2YWw7CisJLyogcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGNvbXB1dGVkIGR1cmluZyBzdGFydHVwICovCisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInJvdGF0ZSIsIDIpKSB7CisgICAgICAvKiBSb3RhdGUgOTAsIDE4MCwgb3IgMjcwIGRlZ3JlZXMgKG1lYXN1cmVkIGNsb2Nrd2lzZSkuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjkwIiwgMikpCisJc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fUk9UXzkwKTsKKyAgICAgIGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICIxODAiLCAzKSkKKwlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9ST1RfMTgwKTsKKyAgICAgIGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICIyNzAiLCAzKSkKKwlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9ST1RfMjcwKTsKKyAgICAgIGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzY2FucyIsIDEpKSB7CisgICAgICAvKiBTZXQgc2NhbiBzY3JpcHQuICovCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBzY2Fuc2FyZyA9IGFyZ3ZbYXJnbl07CisgICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIHJlYWRpbmcgdGhlIGZpbGUgaW4gY2FzZSAtcHJvZ3Jlc3NpdmUgYXBwZWFycy4gKi8KKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgbXVsdGktc2NhbiBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidHJhbnNwb3NlIiwgMSkpIHsKKyAgICAgIC8qIFRyYW5zcG9zZSAoYWNyb3NzIFVMLXRvLUxSIGF4aXMpLiAqLworICAgICAgc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fVFJBTlNQT1NFKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidHJhbnN2ZXJzZSIsIDYpKSB7CisgICAgICAvKiBUcmFuc3ZlcnNlIHRyYW5zcG9zZSAoYWNyb3NzIFVSLXRvLUxMIGF4aXMpLiAqLworICAgICAgc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fVFJBTlNWRVJTRSk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRyaW0iLCAzKSkgeworICAgICAgLyogVHJpbSBvZmYgYW55IHBhcnRpYWwgZWRnZSBNQ1VzIHRoYXQgdGhlIHRyYW5zZm9ybSBjYW4ndCBoYW5kbGUuICovCisgICAgICB0cmFuc2Zvcm1vcHRpb24udHJpbSA9IFRSVUU7CisKKyAgICB9IGVsc2UgeworICAgICAgdXNhZ2UoKTsJCQkvKiBib2d1cyBzd2l0Y2ggKi8KKyAgICB9CisgIH0KKworICAvKiBQb3N0LXN3aXRjaC1zY2FubmluZyBjbGVhbnVwICovCisKKyAgaWYgKGZvcl9yZWFsKSB7CisKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgIGlmIChzaW1wbGVfcHJvZ3Jlc3NpdmUpCS8qIHByb2Nlc3MgLXByb2dyZXNzaXZlOyAtc2NhbnMgY2FuIG92ZXJyaWRlICovCisgICAgICBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbihjaW5mbyk7CisjZW5kaWYKKworI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgIGlmIChzY2Fuc2FyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1zY2FucyBpZiBpdCB3YXMgcHJlc2VudCAqLworICAgICAgaWYgKCEgcmVhZF9zY2FuX3NjcmlwdChjaW5mbywgc2NhbnNhcmcpKQorCXVzYWdlKCk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiBhcmduOwkJCS8qIHJldHVybiBpbmRleCBvZiBuZXh0IGFyZyAoZmlsZSBuYW1lKSAqLworfQorCisKKy8qCisgKiBUaGUgbWFpbiBwcm9ncmFtLgorICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBzcmNpbmZvOworICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgZHN0aW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGpzcmNlcnIsIGpkc3RlcnI7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHByb2dyZXNzOworI2VuZGlmCisgIGp2aXJ0X2JhcnJheV9wdHIgKiBzcmNfY29lZl9hcnJheXM7CisgIGp2aXJ0X2JhcnJheV9wdHIgKiBkc3RfY29lZl9hcnJheXM7CisgIGludCBmaWxlX2luZGV4OworICBGSUxFICogaW5wdXRfZmlsZTsKKyAgRklMRSAqIG91dHB1dF9maWxlOworCisgIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCisjaWZkZWYgVVNFX0NDT01NQU5ECisgIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7CisjZW5kaWYKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisgIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCisgICAgcHJvZ25hbWUgPSAianBlZ3RyYW4iOwkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KKworICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KKyAgc3JjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmanNyY2Vycik7CisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJnNyY2luZm8pOworICAvKiBJbml0aWFsaXplIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCisgIGRzdGluZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmpkc3RlcnIpOworICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmZHN0aW5mbyk7CisKKyAgLyogTm93IHNhZmUgdG8gZW5hYmxlIHNpZ25hbCBjYXRjaGVyLgorICAgKiBOb3RlOiB3ZSBhc3N1bWUgb25seSB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2lsbCBoYXZlIHZpcnR1YWwgYXJyYXlzLgorICAgKi8KKyNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisgIGVuYWJsZV9zaWduYWxfY2F0Y2hlcigoal9jb21tb25fcHRyKSAmc3JjaW5mbyk7CisjZW5kaWYKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSB0byBmaW5kIGZpbGUgbmFtZXMuCisgICAqIEl0IGlzIGNvbnZlbmllbnQgdG8gdXNlIGp1c3Qgb25lIHN3aXRjaC1wYXJzaW5nIHJvdXRpbmUsIGJ1dCB0aGUgc3dpdGNoCisgICAqIHZhbHVlcyByZWFkIGhlcmUgYXJlIG1vc3RseSBpZ25vcmVkOyB3ZSB3aWxsIHJlc2NhbiB0aGUgc3dpdGNoZXMgYWZ0ZXIKKyAgICogb3BlbmluZyB0aGUgaW5wdXQgZmlsZS4gIEFsc28gbm90ZSB0aGF0IG1vc3Qgb2YgdGhlIHN3aXRjaGVzIGFmZmVjdCB0aGUKKyAgICogZGVzdGluYXRpb24gSlBFRyBvYmplY3QsIHNvIHdlIHBhcnNlIGludG8gdGhhdCBhbmQgdGhlbiBjb3B5IG92ZXIgd2hhdAorICAgKiBuZWVkcyB0byBhZmZlY3RzIHRoZSBzb3VyY2UgdG9vLgorICAgKi8KKworICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmRzdGluZm8sIGFyZ2MsIGFyZ3YsIDAsIEZBTFNFKTsKKyAganNyY2Vyci50cmFjZV9sZXZlbCA9IGpkc3RlcnIudHJhY2VfbGV2ZWw7CisgIHNyY2luZm8ubWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGRzdGluZm8ubWVtLT5tYXhfbWVtb3J5X3RvX3VzZTsKKworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIC8qIE11c3QgaGF2ZSBlaXRoZXIgLW91dGZpbGUgc3dpdGNoIG9yIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KKyAgaWYgKG91dGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTIpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleCsxXTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKKyAgICB1c2FnZSgpOworICB9CisjZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KKworICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MpIHsKKyAgICBpZiAoKGlucHV0X2ZpbGUgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCisgICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKKyAgfQorCisgIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLworICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgeworICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KKyAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOworICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmZHN0aW5mbywgJnByb2dyZXNzKTsKKyNlbmRpZgorCisgIC8qIFNwZWNpZnkgZGF0YSBzb3VyY2UgZm9yIGRlY29tcHJlc3Npb24gKi8KKyAganBlZ19zdGRpb19zcmMoJnNyY2luZm8sIGlucHV0X2ZpbGUpOworCisgIC8qIEVuYWJsZSBzYXZpbmcgb2YgZXh0cmEgbWFya2VycyB0aGF0IHdlIHdhbnQgdG8gY29weSAqLworICBqY29weV9tYXJrZXJzX3NldHVwKCZzcmNpbmZvLCBjb3B5b3B0aW9uKTsKKworICAvKiBSZWFkIGZpbGUgaGVhZGVyICovCisgICh2b2lkKSBqcGVnX3JlYWRfaGVhZGVyKCZzcmNpbmZvLCBUUlVFKTsKKworICAvKiBBbnkgc3BhY2UgbmVlZGVkIGJ5IGEgdHJhbnNmb3JtIG9wdGlvbiBtdXN0IGJlIHJlcXVlc3RlZCBiZWZvcmUKKyAgICoganBlZ19yZWFkX2NvZWZmaWNpZW50cyBzbyB0aGF0IG1lbW9yeSBhbGxvY2F0aW9uIHdpbGwgYmUgZG9uZSByaWdodC4KKyAgICovCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAganRyYW5zZm9ybV9yZXF1ZXN0X3dvcmtzcGFjZSgmc3JjaW5mbywgJnRyYW5zZm9ybW9wdGlvbik7CisjZW5kaWYKKworICAvKiBSZWFkIHNvdXJjZSBmaWxlIGFzIERDVCBjb2VmZmljaWVudHMgKi8KKyAgc3JjX2NvZWZfYXJyYXlzID0ganBlZ19yZWFkX2NvZWZmaWNpZW50cygmc3JjaW5mbyk7CisKKyAgLyogSW5pdGlhbGl6ZSBkZXN0aW5hdGlvbiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGZyb20gc291cmNlIHZhbHVlcyAqLworICBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygmc3JjaW5mbywgJmRzdGluZm8pOworCisgIC8qIEFkanVzdCBkZXN0aW5hdGlvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkIGJ5IHRyYW5zZm9ybSBvcHRpb25zOworICAgKiBhbHNvIGZpbmQgb3V0IHdoaWNoIHNldCBvZiBjb2VmZmljaWVudCBhcnJheXMgd2lsbCBob2xkIHRoZSBvdXRwdXQuCisgICAqLworI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECisgIGRzdF9jb2VmX2FycmF5cyA9IGp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMoJnNyY2luZm8sICZkc3RpbmZvLAorCQkJCQkJIHNyY19jb2VmX2FycmF5cywKKwkJCQkJCSAmdHJhbnNmb3Jtb3B0aW9uKTsKKyNlbHNlCisgIGRzdF9jb2VmX2FycmF5cyA9IHNyY19jb2VmX2FycmF5czsKKyNlbmRpZgorCisgIC8qIEFkanVzdCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLworICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmRzdGluZm8sIGFyZ2MsIGFyZ3YsIDAsIFRSVUUpOworCisgIC8qIFNwZWNpZnkgZGF0YSBkZXN0aW5hdGlvbiBmb3IgY29tcHJlc3Npb24gKi8KKyAganBlZ19zdGRpb19kZXN0KCZkc3RpbmZvLCBvdXRwdXRfZmlsZSk7CisKKyAgLyogU3RhcnQgY29tcHJlc3NvciAobm90ZSBubyBpbWFnZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4gaGVyZSkgKi8KKyAganBlZ193cml0ZV9jb2VmZmljaWVudHMoJmRzdGluZm8sIGRzdF9jb2VmX2FycmF5cyk7CisKKyAgLyogQ29weSB0byB0aGUgb3V0cHV0IGZpbGUgYW55IGV4dHJhIG1hcmtlcnMgdGhhdCB3ZSB3YW50IHRvIHByZXNlcnZlICovCisgIGpjb3B5X21hcmtlcnNfZXhlY3V0ZSgmc3JjaW5mbywgJmRzdGluZm8sIGNvcHlvcHRpb24pOworCisgIC8qIEV4ZWN1dGUgaW1hZ2UgdHJhbnNmb3JtYXRpb24sIGlmIGFueSAqLworI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECisgIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbigmc3JjaW5mbywgJmRzdGluZm8sCisJCQkJICAgIHNyY19jb2VmX2FycmF5cywKKwkJCQkgICAgJnRyYW5zZm9ybW9wdGlvbik7CisjZW5kaWYKKworICAvKiBGaW5pc2ggY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5ICovCisgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZkc3RpbmZvKTsKKyAganBlZ19kZXN0cm95X2NvbXByZXNzKCZkc3RpbmZvKTsKKyAgKHZvaWQpIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoJnNyY2luZm8pOworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmc3JjaW5mbyk7CisKKyAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCisgIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQorICAgIGZjbG9zZShpbnB1dF9maWxlKTsKKyAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKKyAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZkc3RpbmZvKTsKKyNlbmRpZgorCisgIC8qIEFsbCBkb25lLiAqLworICBleGl0KGpzcmNlcnIubnVtX3dhcm5pbmdzICsgamRzdGVyci5udW1fd2FybmluZ3MgP0VYSVRfV0FSTklORzpFWElUX1NVQ0NFU1MpOworICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KK30KZGlmZiAtLWdpdCBhL2pwZWcvanF1YW50MS5jIGIvanBlZy9qcXVhbnQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmOTZhYQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvanF1YW50MS5jCkBAIC0wLDAgKzEsODU2IEBACisvKgorICoganF1YW50MS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgMS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAoY29sb3IgbWFwcGluZykgcm91dGluZXMuCisgKiBUaGVzZSByb3V0aW5lcyBwcm92aWRlIG1hcHBpbmcgdG8gYSBmaXhlZCBjb2xvciBtYXAgdXNpbmcgZXF1YWxseSBzcGFjZWQKKyAqIGNvbG9yIHZhbHVlcy4gIE9wdGlvbmFsIEZsb3lkLVN0ZWluYmVyZyBvciBvcmRlcmVkIGRpdGhlcmluZyBpcyBhdmFpbGFibGUuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisjaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECisKKworLyoKKyAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgMS1wYXNzIHF1YW50aXphdGlvbiBpcyB0byBwcm92aWRlIGEgZmFzdCwgaWYgbm90IHZlcnkKKyAqIGhpZ2ggcXVhbGl0eSwgY29sb3JtYXBwZWQgb3V0cHV0IGNhcGFiaWxpdHkuICBBIDItcGFzcyBxdWFudGl6ZXIgdXN1YWxseQorICogZ2l2ZXMgYmV0dGVyIHZpc3VhbCBxdWFsaXR5OyBob3dldmVyLCBmb3IgcXVhbnRpemVkIGdyYXlzY2FsZSBvdXRwdXQgdGhpcworICogcXVhbnRpemVyIGlzIHBlcmZlY3RseSBhZGVxdWF0ZS4gIERpdGhlcmluZyBpcyBoaWdobHkgcmVjb21tZW5kZWQgd2l0aCB0aGlzCisgKiBxdWFudGl6ZXIsIHRob3VnaCB5b3UgY2FuIHR1cm4gaXQgb2ZmIGlmIHlvdSByZWFsbHkgd2FudCB0by4KKyAqCisgKiBJbiAxLXBhc3MgcXVhbnRpemF0aW9uIHRoZSBjb2xvcm1hcCBtdXN0IGJlIGNob3NlbiBpbiBhZHZhbmNlIG9mIHNlZWluZyB0aGUKKyAqIGltYWdlLiAgV2UgdXNlIGEgbWFwIGNvbnNpc3Rpbmcgb2YgYWxsIGNvbWJpbmF0aW9ucyBvZiBOY29sb3JzW2ldIGNvbG9yCisgKiB2YWx1ZXMgZm9yIHRoZSBpJ3RoIGNvbXBvbmVudC4gIFRoZSBOY29sb3JzW10gdmFsdWVzIGFyZSBjaG9zZW4gc28gdGhhdAorICogdGhlaXIgcHJvZHVjdCwgdGhlIHRvdGFsIG51bWJlciBvZiBjb2xvcnMsIGlzIG5vIG1vcmUgdGhhbiB0aGF0IHJlcXVlc3RlZC4KKyAqIChJbiBtb3N0IGNhc2VzLCB0aGUgcHJvZHVjdCB3aWxsIGJlIHNvbWV3aGF0IGxlc3MuKQorICoKKyAqIFNpbmNlIHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLCB0aGUgcmVwcmVzZW50YXRpdmUgdmFsdWUgZm9yIGVhY2ggY29sb3IKKyAqIGNvbXBvbmVudCBjYW4gYmUgZGV0ZXJtaW5lZCB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBvdGhlciBjb21wb25lbnRzOworICogdGhlbiB0aGVzZSBpbmRleGVzIGNhbiBiZSBjb21iaW5lZCBpbnRvIGEgY29sb3JtYXAgaW5kZXggYnkgYSBzdGFuZGFyZAorICogTi1kaW1lbnNpb25hbC1hcnJheS1zdWJzY3JpcHQgY2FsY3VsYXRpb24uICBNb3N0IG9mIHRoZSBhcml0aG1ldGljIGludm9sdmVkCisgKiBjYW4gYmUgcHJlY2FsY3VsYXRlZCBhbmQgc3RvcmVkIGluIHRoZSBsb29rdXAgdGFibGUgY29sb3JpbmRleFtdLgorICogY29sb3JpbmRleFtpXVtqXSBtYXBzIHBpeGVsIHZhbHVlIGogaW4gY29tcG9uZW50IGkgdG8gdGhlIG5lYXJlc3QKKyAqIHJlcHJlc2VudGF0aXZlIHZhbHVlIChncmlkIHBsYW5lKSBmb3IgdGhhdCBjb21wb25lbnQ7IHRoaXMgaW5kZXggaXMKKyAqIG11bHRpcGxpZWQgYnkgdGhlIGFycmF5IHN0cmlkZSBmb3IgY29tcG9uZW50IGksIHNvIHRoYXQgdGhlCisgKiBpbmRleCBvZiB0aGUgY29sb3JtYXAgZW50cnkgY2xvc2VzdCB0byBhIGdpdmVuIHBpeGVsIHZhbHVlIGlzIGp1c3QKKyAqICAgIHN1bSggY29sb3JpbmRleFtjb21wb25lbnQtbnVtYmVyXVtwaXhlbC1jb21wb25lbnQtdmFsdWVdICkKKyAqIEFzaWRlIGZyb20gYmVpbmcgZmFzdCwgdGhpcyBzY2hlbWUgYWxsb3dzIGZvciB2YXJpYWJsZSBzcGFjaW5nIGJldHdlZW4KKyAqIHJlcHJlc2VudGF0aXZlIHZhbHVlcyB3aXRoIG5vIGFkZGl0aW9uYWwgbG9va3VwIGNvc3QuCisgKgorICogSWYgZ2FtbWEgY29ycmVjdGlvbiBoYXMgYmVlbiBhcHBsaWVkIGluIGNvbG9yIGNvbnZlcnNpb24sIGl0IG1pZ2h0IGJlIHdpc2UKKyAqIHRvIGFkanVzdCB0aGUgY29sb3IgZ3JpZCBzcGFjaW5nIHNvIHRoYXQgdGhlIHJlcHJlc2VudGF0aXZlIGNvbG9ycyBhcmUKKyAqIGVxdWlkaXN0YW50IGluIGxpbmVhciBzcGFjZS4gIEF0IHRoaXMgd3JpdGluZywgZ2FtbWEgY29ycmVjdGlvbiBpcyBub3QKKyAqIGltcGxlbWVudGVkIGJ5IGpkY29sb3IsIHNvIG5vdGhpbmcgaXMgZG9uZSBoZXJlLgorICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBvcmRlcmVkIGRpdGhlcmluZy4KKyAqCisgKiBXZSB1c2UgYSBzdGFuZGFyZCAxNngxNiBvcmRlcmVkIGRpdGhlciBhcnJheS4gIFRoZSBiYXNpYyBjb25jZXB0IG9mIG9yZGVyZWQKKyAqIGRpdGhlcmluZyBpcyBkZXNjcmliZWQgaW4gbWFueSByZWZlcmVuY2VzLCBmb3IgaW5zdGFuY2UgRGFsZSBTY2h1bWFjaGVyJ3MKKyAqIGNoYXB0ZXIgSUkuMiBvZiBHcmFwaGljcyBHZW1zIElJIChKYW1lcyBBcnZvLCBlZC4gQWNhZGVtaWMgUHJlc3MsIDE5OTEpLgorICogSW4gcGxhY2Ugb2YgU2NodW1hY2hlcidzIGNvbXBhcmlzb25zIGFnYWluc3QgYSAidGhyZXNob2xkIiB2YWx1ZSwgd2UgYWRkIGEKKyAqICJkaXRoZXIiIHZhbHVlIHRvIHRoZSBpbnB1dCBwaXhlbCBhbmQgdGhlbiByb3VuZCB0aGUgcmVzdWx0IHRvIHRoZSBuZWFyZXN0CisgKiBvdXRwdXQgdmFsdWUuICBUaGUgZGl0aGVyIHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gKDAuNSAtIHRocmVzaG9sZCkgdGltZXMKKyAqIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIG91dHB1dCB2YWx1ZXMuICBGb3Igb3JkZXJlZCBkaXRoZXJpbmcsIHdlIGFzc3VtZSB0aGF0CisgKiB0aGUgb3V0cHV0IGNvbG9ycyBhcmUgZXF1YWxseSBzcGFjZWQ7IGlmIG5vdCwgcmVzdWx0cyB3aWxsIHByb2JhYmx5IGJlCisgKiB3b3JzZSwgc2luY2UgdGhlIGRpdGhlciBtYXkgYmUgdG9vIG11Y2ggb3IgdG9vIGxpdHRsZSBhdCBhIGdpdmVuIHBvaW50LgorICoKKyAqIFRoZSBub3JtYWwgY2FsY3VsYXRpb24gd291bGQgYmUgdG8gZm9ybSBwaXhlbCB2YWx1ZSArIGRpdGhlciwgcmFuZ2UtbGltaXQKKyAqIHRoaXMgdG8gMC4uTUFYSlNBTVBMRSwgYW5kIHRoZW4gaW5kZXggaW50byB0aGUgY29sb3JpbmRleCB0YWJsZSBhcyB1c3VhbC4KKyAqIFdlIGNhbiBza2lwIHRoZSBzZXBhcmF0ZSByYW5nZS1saW1pdGluZyBzdGVwIGJ5IGV4dGVuZGluZyB0aGUgY29sb3JpbmRleAorICogdGFibGUgaW4gYm90aCBkaXJlY3Rpb25zLgorICovCisKKyNkZWZpbmUgT0RJVEhFUl9TSVpFICAxNgkvKiBkaW1lbnNpb24gb2YgZGl0aGVyIG1hdHJpeCAqLworLyogTkI6IGlmIE9ESVRIRVJfU0laRSBpcyBub3QgYSBwb3dlciBvZiAyLCBPRElUSEVSX01BU0sgdXNlcyB3aWxsIGJyZWFrICovCisjZGVmaW5lIE9ESVRIRVJfQ0VMTFMgKE9ESVRIRVJfU0laRSpPRElUSEVSX1NJWkUpCS8qICMgY2VsbHMgaW4gbWF0cml4ICovCisjZGVmaW5lIE9ESVRIRVJfTUFTSyAgKE9ESVRIRVJfU0laRS0xKSAvKiBtYXNrIGZvciB3cmFwcGluZyBhcm91bmQgY291bnRlcnMgKi8KKwordHlwZWRlZiBpbnQgT0RJVEhFUl9NQVRSSVhbT0RJVEhFUl9TSVpFXVtPRElUSEVSX1NJWkVdOwordHlwZWRlZiBpbnQgKCpPRElUSEVSX01BVFJJWF9QVFIpW09ESVRIRVJfU0laRV07CisKK3N0YXRpYyBjb25zdCBVSU5UOCBiYXNlX2RpdGhlcl9tYXRyaXhbT0RJVEhFUl9TSVpFXVtPRElUSEVSX1NJWkVdID0geworICAvKiBCYXllcidzIG9yZGVyLTQgZGl0aGVyIGFycmF5LiAgR2VuZXJhdGVkIGJ5IHRoZSBjb2RlIGdpdmVuIGluCisgICAqIFN0ZXBoZW4gSGF3bGV5J3MgYXJ0aWNsZSAiT3JkZXJlZCBEaXRoZXJpbmciIGluIEdyYXBoaWNzIEdlbXMgSS4KKyAgICogVGhlIHZhbHVlcyBpbiB0aGlzIGFycmF5IG11c3QgcmFuZ2UgZnJvbSAwIHRvIE9ESVRIRVJfQ0VMTFMtMS4KKyAgICovCisgIHsgICAwLDE5MiwgNDgsMjQwLCAxMiwyMDQsIDYwLDI1MiwgIDMsMTk1LCA1MSwyNDMsIDE1LDIwNywgNjMsMjU1IH0sCisgIHsgMTI4LCA2NCwxNzYsMTEyLDE0MCwgNzYsMTg4LDEyNCwxMzEsIDY3LDE3OSwxMTUsMTQzLCA3OSwxOTEsMTI3IH0sCisgIHsgIDMyLDIyNCwgMTYsMjA4LCA0NCwyMzYsIDI4LDIyMCwgMzUsMjI3LCAxOSwyMTEsIDQ3LDIzOSwgMzEsMjIzIH0sCisgIHsgMTYwLCA5NiwxNDQsIDgwLDE3MiwxMDgsMTU2LCA5MiwxNjMsIDk5LDE0NywgODMsMTc1LDExMSwxNTksIDk1IH0sCisgIHsgICA4LDIwMCwgNTYsMjQ4LCAgNCwxOTYsIDUyLDI0NCwgMTEsMjAzLCA1OSwyNTEsICA3LDE5OSwgNTUsMjQ3IH0sCisgIHsgMTM2LCA3MiwxODQsMTIwLDEzMiwgNjgsMTgwLDExNiwxMzksIDc1LDE4NywxMjMsMTM1LCA3MSwxODMsMTE5IH0sCisgIHsgIDQwLDIzMiwgMjQsMjE2LCAzNiwyMjgsIDIwLDIxMiwgNDMsMjM1LCAyNywyMTksIDM5LDIzMSwgMjMsMjE1IH0sCisgIHsgMTY4LDEwNCwxNTIsIDg4LDE2NCwxMDAsMTQ4LCA4NCwxNzEsMTA3LDE1NSwgOTEsMTY3LDEwMywxNTEsIDg3IH0sCisgIHsgICAyLDE5NCwgNTAsMjQyLCAxNCwyMDYsIDYyLDI1NCwgIDEsMTkzLCA0OSwyNDEsIDEzLDIwNSwgNjEsMjUzIH0sCisgIHsgMTMwLCA2NiwxNzgsMTE0LDE0MiwgNzgsMTkwLDEyNiwxMjksIDY1LDE3NywxMTMsMTQxLCA3NywxODksMTI1IH0sCisgIHsgIDM0LDIyNiwgMTgsMjEwLCA0NiwyMzgsIDMwLDIyMiwgMzMsMjI1LCAxNywyMDksIDQ1LDIzNywgMjksMjIxIH0sCisgIHsgMTYyLCA5OCwxNDYsIDgyLDE3NCwxMTAsMTU4LCA5NCwxNjEsIDk3LDE0NSwgODEsMTczLDEwOSwxNTcsIDkzIH0sCisgIHsgIDEwLDIwMiwgNTgsMjUwLCAgNiwxOTgsIDU0LDI0NiwgIDksMjAxLCA1NywyNDksICA1LDE5NywgNTMsMjQ1IH0sCisgIHsgMTM4LCA3NCwxODYsMTIyLDEzNCwgNzAsMTgyLDExOCwxMzcsIDczLDE4NSwxMjEsMTMzLCA2OSwxODEsMTE3IH0sCisgIHsgIDQyLDIzNCwgMjYsMjE4LCAzOCwyMzAsIDIyLDIxNCwgNDEsMjMzLCAyNSwyMTcsIDM3LDIyOSwgMjEsMjEzIH0sCisgIHsgMTcwLDEwNiwxNTQsIDkwLDE2NiwxMDIsMTUwLCA4NiwxNjksMTA1LDE1MywgODksMTY1LDEwMSwxNDksIDg1IH0KK307CisKKworLyogRGVjbGFyYXRpb25zIGZvciBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nLgorICoKKyAqIEVycm9ycyBhcmUgYWNjdW11bGF0ZWQgaW50byB0aGUgYXJyYXkgZnNlcnJvcnNbXSwgYXQgYSByZXNvbHV0aW9uIG9mCisgKiAxLzE2dGggb2YgYSBwaXhlbCBjb3VudC4gIFRoZSBlcnJvciBhdCBhIGdpdmVuIHBpeGVsIGlzIHByb3BhZ2F0ZWQKKyAqIHRvIGl0cyBub3QteWV0LXByb2Nlc3NlZCBuZWlnaGJvcnMgdXNpbmcgdGhlIHN0YW5kYXJkIEYtUyBmcmFjdGlvbnMsCisgKgkJLi4uCShoZXJlKQk3LzE2CisgKgkJMy8xNgk1LzE2CTEvMTYKKyAqIFdlIHdvcmsgbGVmdC10by1yaWdodCBvbiBldmVuIHJvd3MsIHJpZ2h0LXRvLWxlZnQgb24gb2RkIHJvd3MuCisgKgorICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzaW5nbGUgYXJyYXkgKGhvbGRpbmcgb25lIHJvdydzIHdvcnRoIG9mIGVycm9ycykKKyAqIGJ5IHVzaW5nIGl0IHRvIHN0b3JlIHRoZSBjdXJyZW50IHJvdydzIGVycm9ycyBhdCBwaXhlbCBjb2x1bW5zIG5vdCB5ZXQKKyAqIHByb2Nlc3NlZCwgYnV0IHRoZSBuZXh0IHJvdydzIGVycm9ycyBhdCBjb2x1bW5zIGFscmVhZHkgcHJvY2Vzc2VkLiAgV2UKKyAqIG5lZWQgb25seSBhIGZldyBleHRyYSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgZXJyb3JzIGltbWVkaWF0ZWx5IGFyb3VuZCB0aGUKKyAqIGN1cnJlbnQgY29sdW1uLiAgKElmIHdlIGFyZSBsdWNreSwgdGhvc2UgdmFyaWFibGVzIGFyZSBpbiByZWdpc3RlcnMsIGJ1dAorICogZXZlbiBpZiBub3QsIHRoZXkncmUgcHJvYmFibHkgY2hlYXBlciB0byBhY2Nlc3MgdGhhbiBhcnJheSBlbGVtZW50cyBhcmUuKQorICoKKyAqIFRoZSBmc2Vycm9yc1tdIGFycmF5IGlzIGluZGV4ZWQgW2NvbXBvbmVudCNdW3Bvc2l0aW9uXS4KKyAqIFdlIHByb3ZpZGUgKCNjb2x1bW5zICsgMikgZW50cmllcyBwZXIgY29tcG9uZW50OyB0aGUgZXh0cmEgZW50cnkgYXQgZWFjaAorICogZW5kIHNhdmVzIHVzIGZyb20gc3BlY2lhbC1jYXNpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHBpeGVscy4KKyAqCisgKiBOb3RlOiBvbiBhIHdpZGUgaW1hZ2UsIHdlIG1pZ2h0IG5vdCBoYXZlIGVub3VnaCByb29tIGluIGEgUEMncyBuZWFyIGRhdGEKKyAqIHNlZ21lbnQgdG8gaG9sZCB0aGUgZXJyb3IgYXJyYXk7IHNvIGl0IGlzIGFsbG9jYXRlZCB3aXRoIGFsbG9jX2xhcmdlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAordHlwZWRlZiBJTlQxNiBGU0VSUk9SOwkJLyogMTYgYml0cyBzaG91bGQgYmUgZW5vdWdoICovCit0eXBlZGVmIGludCBMT0NGU0VSUk9SOwkJLyogdXNlICdpbnQnIGZvciBjYWxjdWxhdGlvbiB0ZW1wcyAqLworI2Vsc2UKK3R5cGVkZWYgSU5UMzIgRlNFUlJPUjsJCS8qIG1heSBuZWVkIG1vcmUgdGhhbiAxNiBiaXRzICovCit0eXBlZGVmIElOVDMyIExPQ0ZTRVJST1I7CS8qIGJlIHN1cmUgY2FsY3VsYXRpb24gdGVtcHMgYXJlIGJpZyBlbm91Z2ggKi8KKyNlbmRpZgorCit0eXBlZGVmIEZTRVJST1IgRkFSICpGU0VSUlBUUjsJLyogcG9pbnRlciB0byBlcnJvciBhcnJheSAoaW4gRkFSIHN0b3JhZ2UhKSAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKKyNkZWZpbmUgTUFYX1FfQ09NUFMgNAkJLyogbWF4IGNvbXBvbmVudHMgSSBjYW4gaGFuZGxlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIEluaXRpYWxseSBhbGxvY2F0ZWQgY29sb3JtYXAgaXMgc2F2ZWQgaGVyZSAqLworICBKU0FNUEFSUkFZIHN2X2NvbG9ybWFwOwkvKiBUaGUgY29sb3IgbWFwIGFzIGEgMi1EIHBpeGVsIGFycmF5ICovCisgIGludCBzdl9hY3R1YWw7CQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB1c2UgKi8KKworICBKU0FNUEFSUkFZIGNvbG9yaW5kZXg7CS8qIFByZWNvbXB1dGVkIG1hcHBpbmcgZm9yIHNwZWVkICovCisgIC8qIGNvbG9yaW5kZXhbaV1bal0gPSBpbmRleCBvZiBjb2xvciBjbG9zZXN0IHRvIHBpeGVsIHZhbHVlIGogaW4gY29tcG9uZW50IGksCisgICAqIHByZW11bHRpcGxpZWQgYXMgZGVzY3JpYmVkIGFib3ZlLiAgU2luY2UgY29sb3JtYXAgaW5kZXhlcyBtdXN0IGZpdCBpbnRvCisgICAqIEpTQU1QTEVzLCB0aGUgZW50cmllcyBvZiB0aGlzIGFycmF5IHdpbGwgdG9vLgorICAgKi8KKyAgYm9vbGVhbiBpc19wYWRkZWQ7CQkvKiBpcyB0aGUgY29sb3JpbmRleCBwYWRkZWQgZm9yIG9kaXRoZXI/ICovCisKKyAgaW50IE5jb2xvcnNbTUFYX1FfQ09NUFNdOwkvKiAjIG9mIHZhbHVlcyBhbGxvY2VkIHRvIGVhY2ggY29tcG9uZW50ICovCisKKyAgLyogVmFyaWFibGVzIGZvciBvcmRlcmVkIGRpdGhlcmluZyAqLworICBpbnQgcm93X2luZGV4OwkJLyogY3VyIHJvdydzIHZlcnRpY2FsIGluZGV4IGluIGRpdGhlciBtYXRyaXggKi8KKyAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXJbTUFYX1FfQ09NUFNdOyAvKiBvbmUgZGl0aGVyIGFycmF5IHBlciBjb21wb25lbnQgKi8KKworICAvKiBWYXJpYWJsZXMgZm9yIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgKi8KKyAgRlNFUlJQVFIgZnNlcnJvcnNbTUFYX1FfQ09NUFNdOyAvKiBhY2N1bXVsYXRlZCBlcnJvcnMgKi8KKyAgYm9vbGVhbiBvbl9vZGRfcm93OwkJLyogZmxhZyB0byByZW1lbWJlciB3aGljaCByb3cgd2UgYXJlIG9uICovCit9IG15X2NxdWFudGl6ZXI7CisKK3R5cGVkZWYgbXlfY3F1YW50aXplciAqIG15X2NxdWFudGl6ZV9wdHI7CisKKworLyoKKyAqIFBvbGljeS1tYWtpbmcgc3Vicm91dGluZXMgZm9yIGNyZWF0ZV9jb2xvcm1hcCBhbmQgY3JlYXRlX2NvbG9yaW5kZXguCisgKiBUaGVzZSByb3V0aW5lcyBkZXRlcm1pbmUgdGhlIGNvbG9ybWFwIHRvIGJlIHVzZWQuICBUaGUgcmVzdCBvZiB0aGUgbW9kdWxlCisgKiBvbmx5IGFzc3VtZXMgdGhhdCB0aGUgY29sb3JtYXAgaXMgb3J0aG9nb25hbC4KKyAqCisgKiAgKiBzZWxlY3RfbmNvbG9ycyBkZWNpZGVzIGhvdyB0byBkaXZ2eSB1cCB0aGUgYXZhaWxhYmxlIGNvbG9ycworICogICAgYW1vbmcgdGhlIGNvbXBvbmVudHMuCisgKiAgKiBvdXRwdXRfdmFsdWUgZGVmaW5lcyB0aGUgc2V0IG9mIHJlcHJlc2VudGF0aXZlIHZhbHVlcyBmb3IgYSBjb21wb25lbnQuCisgKiAgKiBsYXJnZXN0X2lucHV0X3ZhbHVlIGRlZmluZXMgdGhlIG1hcHBpbmcgZnJvbSBpbnB1dCB2YWx1ZXMgdG8KKyAqICAgIHJlcHJlc2VudGF0aXZlIHZhbHVlcyBmb3IgYSBjb21wb25lbnQuCisgKiBOb3RlIHRoYXQgdGhlIGxhdHRlciB0d28gcm91dGluZXMgbWF5IGltcG9zZSBkaWZmZXJlbnQgcG9saWNpZXMgZm9yCisgKiBkaWZmZXJlbnQgY29tcG9uZW50cywgdGhvdWdoIHRoaXMgaXMgbm90IGN1cnJlbnRseSBkb25lLgorICovCisKKworTE9DQUwoaW50KQorc2VsZWN0X25jb2xvcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBOY29sb3JzW10pCisvKiBEZXRlcm1pbmUgYWxsb2NhdGlvbiBvZiBkZXNpcmVkIGNvbG9ycyB0byBjb21wb25lbnRzLCAqLworLyogYW5kIGZpbGwgaW4gTmNvbG9yc1tdIGFycmF5IHRvIGluZGljYXRlIGNob2ljZS4gKi8KKy8qIFJldHVybiB2YWx1ZSBpcyB0b3RhbCBudW1iZXIgb2YgY29sb3JzIChwcm9kdWN0IG9mIE5jb2xvcnNbXSB2YWx1ZXMpLiAqLworeworICBpbnQgbmMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IC8qIG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzICovCisgIGludCBtYXhfY29sb3JzID0gY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsKKyAgaW50IHRvdGFsX2NvbG9ycywgaXJvb3QsIGksIGo7CisgIGJvb2xlYW4gY2hhbmdlZDsKKyAgbG9uZyB0ZW1wOworICBzdGF0aWMgY29uc3QgaW50IFJHQl9vcmRlclszXSA9IHsgUkdCX0dSRUVOLCBSR0JfUkVELCBSR0JfQkxVRSB9OworCisgIC8qIFdlIGNhbiBhbGxvY2F0ZSBhdCBsZWFzdCB0aGUgbmMndGggcm9vdCBvZiBtYXhfY29sb3JzIHBlciBjb21wb25lbnQuICovCisgIC8qIENvbXB1dGUgZmxvb3IobmMndGggcm9vdCBvZiBtYXhfY29sb3JzKS4gKi8KKyAgaXJvb3QgPSAxOworICBkbyB7CisgICAgaXJvb3QrKzsKKyAgICB0ZW1wID0gaXJvb3Q7CQkvKiBzZXQgdGVtcCA9IGlyb290ICoqIG5jICovCisgICAgZm9yIChpID0gMTsgaSA8IG5jOyBpKyspCisgICAgICB0ZW1wICo9IGlyb290OworICB9IHdoaWxlICh0ZW1wIDw9IChsb25nKSBtYXhfY29sb3JzKTsgLyogcmVwZWF0IHRpbGwgaXJvb3QgZXhjZWVkcyByb290ICovCisgIGlyb290LS07CQkJLyogbm93IGlyb290ID0gZmxvb3Iocm9vdCkgKi8KKworICAvKiBNdXN0IGhhdmUgYXQgbGVhc3QgMiBjb2xvciB2YWx1ZXMgcGVyIGNvbXBvbmVudCAqLworICBpZiAoaXJvb3QgPCAyKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX0ZFV19DT0xPUlMsIChpbnQpIHRlbXApOworCisgIC8qIEluaXRpYWxpemUgdG8gaXJvb3QgY29sb3IgdmFsdWVzIGZvciBlYWNoIGNvbXBvbmVudCAqLworICB0b3RhbF9jb2xvcnMgPSAxOworICBmb3IgKGkgPSAwOyBpIDwgbmM7IGkrKykgeworICAgIE5jb2xvcnNbaV0gPSBpcm9vdDsKKyAgICB0b3RhbF9jb2xvcnMgKj0gaXJvb3Q7CisgIH0KKyAgLyogV2UgbWF5IGJlIGFibGUgdG8gaW5jcmVtZW50IHRoZSBjb3VudCBmb3Igb25lIG9yIG1vcmUgY29tcG9uZW50cyB3aXRob3V0CisgICAqIGV4Y2VlZGluZyBtYXhfY29sb3JzLCB0aG91Z2ggd2Uga25vdyBub3QgYWxsIGNhbiBiZSBpbmNyZW1lbnRlZC4KKyAgICogU29tZXRpbWVzLCB0aGUgZmlyc3QgY29tcG9uZW50IGNhbiBiZSBpbmNyZW1lbnRlZCBtb3JlIHRoYW4gb25jZSEKKyAgICogKEV4YW1wbGU6IGZvciAxNiBjb2xvcnMsIHdlIHN0YXJ0IGF0IDIqMioyLCBnbyB0byAzKjIqMiwgdGhlbiA0KjIqMi4pCisgICAqIEluIFJHQiBjb2xvcnNwYWNlLCB0cnkgdG8gaW5jcmVtZW50IEcgZmlyc3QsIHRoZW4gUiwgdGhlbiBCLgorICAgKi8KKyAgZG8geworICAgIGNoYW5nZWQgPSBGQUxTRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmM7IGkrKykgeworICAgICAgaiA9IChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IgPyBSR0Jfb3JkZXJbaV0gOiBpKTsKKyAgICAgIC8qIGNhbGN1bGF0ZSBuZXcgdG90YWxfY29sb3JzIGlmIE5jb2xvcnNbal0gaXMgaW5jcmVtZW50ZWQgKi8KKyAgICAgIHRlbXAgPSB0b3RhbF9jb2xvcnMgLyBOY29sb3JzW2pdOworICAgICAgdGVtcCAqPSBOY29sb3JzW2pdKzE7CS8qIGRvbmUgaW4gbG9uZyBhcml0aCB0byBhdm9pZCBvZmxvICovCisgICAgICBpZiAodGVtcCA+IChsb25nKSBtYXhfY29sb3JzKQorCWJyZWFrOwkJCS8qIHdvbid0IGZpdCwgZG9uZSB3aXRoIHRoaXMgcGFzcyAqLworICAgICAgTmNvbG9yc1tqXSsrOwkJLyogT0ssIGFwcGx5IHRoZSBpbmNyZW1lbnQgKi8KKyAgICAgIHRvdGFsX2NvbG9ycyA9IChpbnQpIHRlbXA7CisgICAgICBjaGFuZ2VkID0gVFJVRTsKKyAgICB9CisgIH0gd2hpbGUgKGNoYW5nZWQpOworCisgIHJldHVybiB0b3RhbF9jb2xvcnM7Cit9CisKKworTE9DQUwoaW50KQorb3V0cHV0X3ZhbHVlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgY2ksIGludCBqLCBpbnQgbWF4aikKKy8qIFJldHVybiBqJ3RoIG91dHB1dCB2YWx1ZSwgd2hlcmUgaiB3aWxsIHJhbmdlIGZyb20gMCB0byBtYXhqICovCisvKiBUaGUgb3V0cHV0IHZhbHVlcyBtdXN0IGZhbGwgaW4gMC4uTUFYSlNBTVBMRSBpbiBpbmNyZWFzaW5nIG9yZGVyICovCit7CisgIC8qIFdlIGFsd2F5cyBwcm92aWRlIHZhbHVlcyAwIGFuZCBNQVhKU0FNUExFIGZvciBlYWNoIGNvbXBvbmVudDsKKyAgICogYW55IGFkZGl0aW9uYWwgdmFsdWVzIGFyZSBlcXVhbGx5IHNwYWNlZCBiZXR3ZWVuIHRoZXNlIGxpbWl0cy4KKyAgICogKEZvcmNpbmcgdGhlIHVwcGVyIGFuZCBsb3dlciB2YWx1ZXMgdG8gdGhlIGxpbWl0cyBlbnN1cmVzIHRoYXQKKyAgICogZGl0aGVyaW5nIGNhbid0IHByb2R1Y2UgYSBjb2xvciBvdXRzaWRlIHRoZSBzZWxlY3RlZCBnYW11dC4pCisgICAqLworICByZXR1cm4gKGludCkgKCgoSU5UMzIpIGogKiBNQVhKU0FNUExFICsgbWF4ai8yKSAvIG1heGopOworfQorCisKK0xPQ0FMKGludCkKK2xhcmdlc3RfaW5wdXRfdmFsdWUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBjaSwgaW50IGosIGludCBtYXhqKQorLyogUmV0dXJuIGxhcmdlc3QgaW5wdXQgdmFsdWUgdGhhdCBzaG91bGQgbWFwIHRvIGondGggb3V0cHV0IHZhbHVlICovCisvKiBNdXN0IGhhdmUgbGFyZ2VzdChqPTApID49IDAsIGFuZCBsYXJnZXN0KGo9bWF4aikgPj0gTUFYSlNBTVBMRSAqLworeworICAvKiBCcmVha3BvaW50cyBhcmUgaGFsZndheSBiZXR3ZWVuIHZhbHVlcyByZXR1cm5lZCBieSBvdXRwdXRfdmFsdWUgKi8KKyAgcmV0dXJuIChpbnQpICgoKElOVDMyKSAoMipqICsgMSkgKiBNQVhKU0FNUExFICsgbWF4aikgLyAoMiptYXhqKSk7Cit9CisKKworLyoKKyAqIENyZWF0ZSB0aGUgY29sb3JtYXAuCisgKi8KKworTE9DQUwodm9pZCkKK2NyZWF0ZV9jb2xvcm1hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIENyZWF0ZWQgY29sb3JtYXAgKi8KKyAgaW50IHRvdGFsX2NvbG9yczsJCS8qIE51bWJlciBvZiBkaXN0aW5jdCBvdXRwdXQgY29sb3JzICovCisgIGludCBpLGosaywgbmNpLCBibGtzaXplLCBibGtkaXN0LCBwdHIsIHZhbDsKKworICAvKiBTZWxlY3QgbnVtYmVyIG9mIGNvbG9ycyBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgdG90YWxfY29sb3JzID0gc2VsZWN0X25jb2xvcnMoY2luZm8sIGNxdWFudGl6ZS0+TmNvbG9ycyk7CisKKyAgLyogUmVwb3J0IHNlbGVjdGVkIGNvbG9yIGNvdW50cyAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID09IDMpCisgICAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfUVVBTlRfM19OQ09MT1JTLAorCSAgICAgdG90YWxfY29sb3JzLCBjcXVhbnRpemUtPk5jb2xvcnNbMF0sCisJICAgICBjcXVhbnRpemUtPk5jb2xvcnNbMV0sIGNxdWFudGl6ZS0+TmNvbG9yc1syXSk7CisgIGVsc2UKKyAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19RVUFOVF9OQ09MT1JTLCB0b3RhbF9jb2xvcnMpOworCisgIC8qIEFsbG9jYXRlIGFuZCBmaWxsIGluIHRoZSBjb2xvcm1hcC4gKi8KKyAgLyogVGhlIGNvbG9ycyBhcmUgb3JkZXJlZCBpbiB0aGUgbWFwIGluIHN0YW5kYXJkIHJvdy1tYWpvciBvcmRlciwgKi8KKyAgLyogaS5lLiByaWdodG1vc3QgKGhpZ2hlc3QtaW5kZXhlZCkgY29sb3IgY2hhbmdlcyBtb3N0IHJhcGlkbHkuICovCisKKyAgY29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAoSkRJTUVOU0lPTikgdG90YWxfY29sb3JzLCAoSkRJTUVOU0lPTikgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzKTsKKworICAvKiBibGtzaXplIGlzIG51bWJlciBvZiBhZGphY2VudCByZXBlYXRlZCBlbnRyaWVzIGZvciBhIGNvbXBvbmVudCAqLworICAvKiBibGtkaXN0IGlzIGRpc3RhbmNlIGJldHdlZW4gZ3JvdXBzIG9mIGlkZW50aWNhbCBlbnRyaWVzIGZvciBhIGNvbXBvbmVudCAqLworICBibGtkaXN0ID0gdG90YWxfY29sb3JzOworCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykgeworICAgIC8qIGZpbGwgaW4gY29sb3JtYXAgZW50cmllcyBmb3IgaSd0aCBjb2xvciBjb21wb25lbnQgKi8KKyAgICBuY2kgPSBjcXVhbnRpemUtPk5jb2xvcnNbaV07IC8qICMgb2YgZGlzdGluY3QgdmFsdWVzIGZvciB0aGlzIGNvbG9yICovCisgICAgYmxrc2l6ZSA9IGJsa2Rpc3QgLyBuY2k7CisgICAgZm9yIChqID0gMDsgaiA8IG5jaTsgaisrKSB7CisgICAgICAvKiBDb21wdXRlIGondGggb3V0cHV0IHZhbHVlIChvdXQgb2YgbmNpKSBmb3IgY29tcG9uZW50ICovCisgICAgICB2YWwgPSBvdXRwdXRfdmFsdWUoY2luZm8sIGksIGosIG5jaS0xKTsKKyAgICAgIC8qIEZpbGwgaW4gYWxsIGNvbG9ybWFwIGVudHJpZXMgdGhhdCBoYXZlIHRoaXMgdmFsdWUgb2YgdGhpcyBjb21wb25lbnQgKi8KKyAgICAgIGZvciAocHRyID0gaiAqIGJsa3NpemU7IHB0ciA8IHRvdGFsX2NvbG9yczsgcHRyICs9IGJsa2Rpc3QpIHsKKwkvKiBmaWxsIGluIGJsa3NpemUgZW50cmllcyBiZWdpbm5pbmcgYXQgcHRyICovCisJZm9yIChrID0gMDsgayA8IGJsa3NpemU7IGsrKykKKwkgIGNvbG9ybWFwW2ldW3B0citrXSA9IChKU0FNUExFKSB2YWw7CisgICAgICB9CisgICAgfQorICAgIGJsa2Rpc3QgPSBibGtzaXplOwkJLyogYmxrc2l6ZSBvZiB0aGlzIGNvbG9yIGlzIGJsa2Rpc3Qgb2YgbmV4dCAqLworICB9CisKKyAgLyogU2F2ZSB0aGUgY29sb3JtYXAgaW4gcHJpdmF0ZSBzdG9yYWdlLAorICAgKiB3aGVyZSBpdCB3aWxsIHN1cnZpdmUgY29sb3IgcXVhbnRpemF0aW9uIG1vZGUgY2hhbmdlcy4KKyAgICovCisgIGNxdWFudGl6ZS0+c3ZfY29sb3JtYXAgPSBjb2xvcm1hcDsKKyAgY3F1YW50aXplLT5zdl9hY3R1YWwgPSB0b3RhbF9jb2xvcnM7Cit9CisKKworLyoKKyAqIENyZWF0ZSB0aGUgY29sb3IgaW5kZXggdGFibGUuCisgKi8KKworTE9DQUwodm9pZCkKK2NyZWF0ZV9jb2xvcmluZGV4IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBKU0FNUFJPVyBpbmRleHB0cjsKKyAgaW50IGksaixrLCBuY2ksIGJsa3NpemUsIHZhbCwgcGFkOworCisgIC8qIEZvciBvcmRlcmVkIGRpdGhlciwgd2UgcGFkIHRoZSBjb2xvciBpbmRleCB0YWJsZXMgYnkgTUFYSlNBTVBMRSBpbgorICAgKiBlYWNoIGRpcmVjdGlvbiAoaW5wdXQgaW5kZXggdmFsdWVzIGNhbiBiZSAtTUFYSlNBTVBMRSAuLiAyKk1BWEpTQU1QTEUpLgorICAgKiBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgaW4gdGhlIG90aGVyIGRpdGhlcmluZyBtb2Rlcy4gIEhvd2V2ZXIsIHdlCisgICAqIGZsYWcgd2hldGhlciBpdCB3YXMgZG9uZSBpbiBjYXNlIHVzZXIgY2hhbmdlcyBkaXRoZXJpbmcgbW9kZS4KKyAgICovCisgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9PUkRFUkVEKSB7CisgICAgcGFkID0gTUFYSlNBTVBMRSoyOworICAgIGNxdWFudGl6ZS0+aXNfcGFkZGVkID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBwYWQgPSAwOworICAgIGNxdWFudGl6ZS0+aXNfcGFkZGVkID0gRkFMU0U7CisgIH0KKworICBjcXVhbnRpemUtPmNvbG9yaW5kZXggPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAoSkRJTUVOU0lPTikgKE1BWEpTQU1QTEUrMSArIHBhZCksCisgICAgIChKRElNRU5TSU9OKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOworCisgIC8qIGJsa3NpemUgaXMgbnVtYmVyIG9mIGFkamFjZW50IHJlcGVhdGVkIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCisgIGJsa3NpemUgPSBjcXVhbnRpemUtPnN2X2FjdHVhbDsKKworICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAvKiBmaWxsIGluIGNvbG9yaW5kZXggZW50cmllcyBmb3IgaSd0aCBjb2xvciBjb21wb25lbnQgKi8KKyAgICBuY2kgPSBjcXVhbnRpemUtPk5jb2xvcnNbaV07IC8qICMgb2YgZGlzdGluY3QgdmFsdWVzIGZvciB0aGlzIGNvbG9yICovCisgICAgYmxrc2l6ZSA9IGJsa3NpemUgLyBuY2k7CisKKyAgICAvKiBhZGp1c3QgY29sb3JpbmRleCBwb2ludGVycyB0byBwcm92aWRlIHBhZGRpbmcgYXQgbmVnYXRpdmUgaW5kZXhlcy4gKi8KKyAgICBpZiAocGFkKQorICAgICAgY3F1YW50aXplLT5jb2xvcmluZGV4W2ldICs9IE1BWEpTQU1QTEU7CisKKyAgICAvKiBpbiBsb29wLCB2YWwgPSBpbmRleCBvZiBjdXJyZW50IG91dHB1dCB2YWx1ZSwgKi8KKyAgICAvKiBhbmQgayA9IGxhcmdlc3QgaiB0aGF0IG1hcHMgdG8gY3VycmVudCB2YWwgKi8KKyAgICBpbmRleHB0ciA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFtpXTsKKyAgICB2YWwgPSAwOworICAgIGsgPSBsYXJnZXN0X2lucHV0X3ZhbHVlKGNpbmZvLCBpLCAwLCBuY2ktMSk7CisgICAgZm9yIChqID0gMDsgaiA8PSBNQVhKU0FNUExFOyBqKyspIHsKKyAgICAgIHdoaWxlIChqID4gaykJCS8qIGFkdmFuY2UgdmFsIGlmIHBhc3QgYm91bmRhcnkgKi8KKwlrID0gbGFyZ2VzdF9pbnB1dF92YWx1ZShjaW5mbywgaSwgKyt2YWwsIG5jaS0xKTsKKyAgICAgIC8qIHByZW11bHRpcGx5IHNvIHRoYXQgbm8gbXVsdGlwbGljYXRpb24gbmVlZGVkIGluIG1haW4gcHJvY2Vzc2luZyAqLworICAgICAgaW5kZXhwdHJbal0gPSAoSlNBTVBMRSkgKHZhbCAqIGJsa3NpemUpOworICAgIH0KKyAgICAvKiBQYWQgYXQgYm90aCBlbmRzIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChwYWQpCisgICAgICBmb3IgKGogPSAxOyBqIDw9IE1BWEpTQU1QTEU7IGorKykgeworCWluZGV4cHRyWy1qXSA9IGluZGV4cHRyWzBdOworCWluZGV4cHRyW01BWEpTQU1QTEUral0gPSBpbmRleHB0cltNQVhKU0FNUExFXTsKKyAgICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBDcmVhdGUgYW4gb3JkZXJlZC1kaXRoZXIgYXJyYXkgZm9yIGEgY29tcG9uZW50IGhhdmluZyBuY29sb3JzCisgKiBkaXN0aW5jdCBvdXRwdXQgdmFsdWVzLgorICovCisKK0xPQ0FMKE9ESVRIRVJfTUFUUklYX1BUUikKK21ha2Vfb2RpdGhlcl9hcnJheSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG5jb2xvcnMpCit7CisgIE9ESVRIRVJfTUFUUklYX1BUUiBvZGl0aGVyOworICBpbnQgaixrOworICBJTlQzMiBudW0sZGVuOworCisgIG9kaXRoZXIgPSAoT0RJVEhFUl9NQVRSSVhfUFRSKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKE9ESVRIRVJfTUFUUklYKSk7CisgIC8qIFRoZSBpbnRlci12YWx1ZSBkaXN0YW5jZSBmb3IgdGhpcyBjb2xvciBpcyBNQVhKU0FNUExFLyhuY29sb3JzLTEpLgorICAgKiBIZW5jZSB0aGUgZGl0aGVyIHZhbHVlIGZvciB0aGUgbWF0cml4IGNlbGwgd2l0aCBmaWxsIG9yZGVyIGYKKyAgICogKGY9MC4uTi0xKSBzaG91bGQgYmUgKE4tMS0yKmYpLygyKk4pICogTUFYSlNBTVBMRS8obmNvbG9ycy0xKS4KKyAgICogT24gMTYtYml0LWludCBtYWNoaW5lLCBiZSBjYXJlZnVsIHRvIGF2b2lkIG92ZXJmbG93LgorICAgKi8KKyAgZGVuID0gMiAqIE9ESVRIRVJfQ0VMTFMgKiAoKElOVDMyKSAobmNvbG9ycyAtIDEpKTsKKyAgZm9yIChqID0gMDsgaiA8IE9ESVRIRVJfU0laRTsgaisrKSB7CisgICAgZm9yIChrID0gMDsgayA8IE9ESVRIRVJfU0laRTsgaysrKSB7CisgICAgICBudW0gPSAoKElOVDMyKSAoT0RJVEhFUl9DRUxMUy0xIC0gMiooKGludCliYXNlX2RpdGhlcl9tYXRyaXhbal1ba10pKSkKKwkgICAgKiBNQVhKU0FNUExFOworICAgICAgLyogRW5zdXJlIHJvdW5kIHRvd2FyZHMgemVybyBkZXNwaXRlIEMncyBsYWNrIG9mIGNvbnNpc3RlbmN5CisgICAgICAgKiBhYm91dCByb3VuZGluZyBuZWdhdGl2ZSB2YWx1ZXMgaW4gaW50ZWdlciBkaXZpc2lvbi4uLgorICAgICAgICovCisgICAgICBvZGl0aGVyW2pdW2tdID0gKGludCkgKG51bTwwID8gLSgoLW51bSkvZGVuKSA6IG51bS9kZW4pOworICAgIH0KKyAgfQorICByZXR1cm4gb2RpdGhlcjsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBvcmRlcmVkLWRpdGhlciB0YWJsZXMuCisgKiBDb21wb25lbnRzIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2YgcmVwcmVzZW50YXRpdmUgY29sb3JzIG1heSAKKyAqIHNoYXJlIGEgZGl0aGVyIHRhYmxlLgorICovCisKK0xPQ0FMKHZvaWQpCitjcmVhdGVfb2RpdGhlcl90YWJsZXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIE9ESVRIRVJfTUFUUklYX1BUUiBvZGl0aGVyOworICBpbnQgaSwgaiwgbmNpOworCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykgeworICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KKyAgICBvZGl0aGVyID0gTlVMTDsJCS8qIHNlYXJjaCBmb3IgbWF0Y2hpbmcgcHJpb3IgY29tcG9uZW50ICovCisgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgaWYgKG5jaSA9PSBjcXVhbnRpemUtPk5jb2xvcnNbal0pIHsKKwlvZGl0aGVyID0gY3F1YW50aXplLT5vZGl0aGVyW2pdOworCWJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAob2RpdGhlciA9PSBOVUxMKQkvKiBuZWVkIGEgbmV3IHRhYmxlPyAqLworICAgICAgb2RpdGhlciA9IG1ha2Vfb2RpdGhlcl9hcnJheShjaW5mbywgbmNpKTsKKyAgICBjcXVhbnRpemUtPm9kaXRoZXJbaV0gPSBvZGl0aGVyOworICB9Cit9CisKKworLyoKKyAqIE1hcCBzb21lIHJvd3Mgb2YgcGl4ZWxzIHRvIHRoZSBvdXRwdXQgY29sb3JtYXBwZWQgcmVwcmVzZW50YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitjb2xvcl9xdWFudGl6ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQorLyogR2VuZXJhbCBjYXNlLCBubyBkaXRoZXJpbmcgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgSlNBTVBBUlJBWSBjb2xvcmluZGV4ID0gY3F1YW50aXplLT5jb2xvcmluZGV4OworICByZWdpc3RlciBpbnQgcGl4Y29kZSwgY2k7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cmluLCBwdHJvdXQ7CisgIGludCByb3c7CisgIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgcmVnaXN0ZXIgaW50IG5jID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOworCisgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgcHRyaW4gPSBpbnB1dF9idWZbcm93XTsKKyAgICBwdHJvdXQgPSBvdXRwdXRfYnVmW3Jvd107CisgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgIHBpeGNvZGUgPSAwOworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgbmM7IGNpKyspIHsKKwlwaXhjb2RlICs9IEdFVEpTQU1QTEUoY29sb3JpbmRleFtjaV1bR0VUSlNBTVBMRSgqcHRyaW4rKyldKTsKKyAgICAgIH0KKyAgICAgICpwdHJvdXQrKyA9IChKU0FNUExFKSBwaXhjb2RlOworICAgIH0KKyAgfQorfQorCisKK01FVEhPRERFRih2b2lkKQorY29sb3JfcXVhbnRpemUzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQorLyogRmFzdCBwYXRoIGZvciBvdXRfY29sb3JfY29tcG9uZW50cz09Mywgbm8gZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIGludCBwaXhjb2RlOworICByZWdpc3RlciBKU0FNUFJPVyBwdHJpbiwgcHRyb3V0OworICBKU0FNUFJPVyBjb2xvcmluZGV4MCA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFswXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDEgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMV07CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgyID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzJdOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBwdHJpbiA9IGlucHV0X2J1Zltyb3ddOworICAgIHB0cm91dCA9IG91dHB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcGl4Y29kZSAgPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgwW0dFVEpTQU1QTEUoKnB0cmluKyspXSk7CisgICAgICBwaXhjb2RlICs9IEdFVEpTQU1QTEUoY29sb3JpbmRleDFbR0VUSlNBTVBMRSgqcHRyaW4rKyldKTsKKyAgICAgIHBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4MltHRVRKU0FNUExFKCpwdHJpbisrKV0pOworICAgICAgKnB0cm91dCsrID0gKEpTQU1QTEUpIHBpeGNvZGU7CisgICAgfQorICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitxdWFudGl6ZV9vcmRfZGl0aGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIEdlbmVyYWwgY2FzZSwgd2l0aCBvcmRlcmVkIGRpdGhlcmluZyAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB1dF9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB1dF9wdHI7CisgIEpTQU1QUk9XIGNvbG9yaW5kZXhfY2k7CisgIGludCAqIGRpdGhlcjsJCQkvKiBwb2ludHMgdG8gYWN0aXZlIHJvdyBvZiBkaXRoZXIgbWF0cml4ICovCisgIGludCByb3dfaW5kZXgsIGNvbF9pbmRleDsJLyogY3VycmVudCBpbmRleGVzIGludG8gZGl0aGVyIG1hdHJpeCAqLworICBpbnQgbmMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisgIGludCBjaTsKKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworCisgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgLyogSW5pdGlhbGl6ZSBvdXRwdXQgdmFsdWVzIHRvIDAgc28gY2FuIHByb2Nlc3MgY29tcG9uZW50cyBzZXBhcmF0ZWx5ICovCisgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBvdXRwdXRfYnVmW3Jvd10sCisJICAgICAgKHNpemVfdCkgKHdpZHRoICogU0laRU9GKEpTQU1QTEUpKSk7CisgICAgcm93X2luZGV4ID0gY3F1YW50aXplLT5yb3dfaW5kZXg7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmM7IGNpKyspIHsKKyAgICAgIGlucHV0X3B0ciA9IGlucHV0X2J1Zltyb3ddICsgY2k7CisgICAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgICAgY29sb3JpbmRleF9jaSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFtjaV07CisgICAgICBkaXRoZXIgPSBjcXVhbnRpemUtPm9kaXRoZXJbY2ldW3Jvd19pbmRleF07CisgICAgICBjb2xfaW5kZXggPSAwOworCisgICAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworCS8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBkaXRoZXIsIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUsCisJICogc2VsZWN0IG91dHB1dCB2YWx1ZSwgYWNjdW11bGF0ZSBpbnRvIG91dHB1dCBjb2RlIGZvciB0aGlzIHBpeGVsLgorCSAqIFJhbmdlLWxpbWl0aW5nIG5lZWQgbm90IGJlIGRvbmUgZXhwbGljaXRseSwgYXMgd2UgaGF2ZSBleHRlbmRlZAorCSAqIHRoZSBjb2xvcmluZGV4IHRhYmxlIHRvIHByb2R1Y2UgdGhlIHJpZ2h0IGFuc3dlcnMgZm9yIG91dC1vZi1yYW5nZQorCSAqIGlucHV0cy4gIFRoZSBtYXhpbXVtIGRpdGhlciBpcyArLSBNQVhKU0FNUExFOyB0aGlzIHNldHMgdGhlCisJICogcmVxdWlyZWQgYW1vdW50IG9mIHBhZGRpbmcuCisJICovCisJKm91dHB1dF9wdHIgKz0gY29sb3JpbmRleF9jaVtHRVRKU0FNUExFKCppbnB1dF9wdHIpK2RpdGhlcltjb2xfaW5kZXhdXTsKKwlpbnB1dF9wdHIgKz0gbmM7CisJb3V0cHV0X3B0cisrOworCWNvbF9pbmRleCA9IChjb2xfaW5kZXggKyAxKSAmIE9ESVRIRVJfTUFTSzsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQWR2YW5jZSByb3cgaW5kZXggZm9yIG5leHQgcm93ICovCisgICAgcm93X2luZGV4ID0gKHJvd19pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgIGNxdWFudGl6ZS0+cm93X2luZGV4ID0gcm93X2luZGV4OworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitxdWFudGl6ZTNfb3JkX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQorLyogRmFzdCBwYXRoIGZvciBvdXRfY29sb3JfY29tcG9uZW50cz09Mywgd2l0aCBvcmRlcmVkIGRpdGhlcmluZyAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICByZWdpc3RlciBpbnQgcGl4Y29kZTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdXRfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdXRfcHRyOworICBKU0FNUFJPVyBjb2xvcmluZGV4MCA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFswXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDEgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMV07CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgyID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzJdOworICBpbnQgKiBkaXRoZXIwOwkJLyogcG9pbnRzIHRvIGFjdGl2ZSByb3cgb2YgZGl0aGVyIG1hdHJpeCAqLworICBpbnQgKiBkaXRoZXIxOworICBpbnQgKiBkaXRoZXIyOworICBpbnQgcm93X2luZGV4LCBjb2xfaW5kZXg7CS8qIGN1cnJlbnQgaW5kZXhlcyBpbnRvIGRpdGhlciBtYXRyaXggKi8KKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworCisgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgcm93X2luZGV4ID0gY3F1YW50aXplLT5yb3dfaW5kZXg7CisgICAgaW5wdXRfcHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbcm93XTsKKyAgICBkaXRoZXIwID0gY3F1YW50aXplLT5vZGl0aGVyWzBdW3Jvd19pbmRleF07CisgICAgZGl0aGVyMSA9IGNxdWFudGl6ZS0+b2RpdGhlclsxXVtyb3dfaW5kZXhdOworICAgIGRpdGhlcjIgPSBjcXVhbnRpemUtPm9kaXRoZXJbMl1bcm93X2luZGV4XTsKKyAgICBjb2xfaW5kZXggPSAwOworCisgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgIHBpeGNvZGUgID0gR0VUSlNBTVBMRShjb2xvcmluZGV4MFtHRVRKU0FNUExFKCppbnB1dF9wdHIrKykgKworCQkJCQlkaXRoZXIwW2NvbF9pbmRleF1dKTsKKyAgICAgIHBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4MVtHRVRKU0FNUExFKCppbnB1dF9wdHIrKykgKworCQkJCQlkaXRoZXIxW2NvbF9pbmRleF1dKTsKKyAgICAgIHBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4MltHRVRKU0FNUExFKCppbnB1dF9wdHIrKykgKworCQkJCQlkaXRoZXIyW2NvbF9pbmRleF1dKTsKKyAgICAgICpvdXRwdXRfcHRyKysgPSAoSlNBTVBMRSkgcGl4Y29kZTsKKyAgICAgIGNvbF9pbmRleCA9IChjb2xfaW5kZXggKyAxKSAmIE9ESVRIRVJfTUFTSzsKKyAgICB9CisgICAgcm93X2luZGV4ID0gKHJvd19pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgIGNxdWFudGl6ZS0+cm93X2luZGV4ID0gcm93X2luZGV4OworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitxdWFudGl6ZV9mc19kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBHZW5lcmFsIGNhc2UsIHdpdGggRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICByZWdpc3RlciBMT0NGU0VSUk9SIGN1cjsJLyogY3VycmVudCBlcnJvciBvciBwaXhlbCB2YWx1ZSAqLworICBMT0NGU0VSUk9SIGJlbG93ZXJyOwkJLyogZXJyb3IgZm9yIHBpeGVsIGJlbG93IGN1ciAqLworICBMT0NGU0VSUk9SIGJwcmV2ZXJyOwkJLyogZXJyb3IgZm9yIGJlbG93L3ByZXYgY29sICovCisgIExPQ0ZTRVJST1IgYm5leHRlcnI7CQkvKiBlcnJvciBmb3IgYmVsb3cvbmV4dCBjb2wgKi8KKyAgTE9DRlNFUlJPUiBkZWx0YTsKKyAgcmVnaXN0ZXIgRlNFUlJQVFIgZXJyb3JwdHI7CS8qID0+IGZzZXJyb3JzW10gYXQgY29sdW1uIGJlZm9yZSBjdXJyZW50ICovCisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHV0X3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHV0X3B0cjsKKyAgSlNBTVBST1cgY29sb3JpbmRleF9jaTsKKyAgSlNBTVBST1cgY29sb3JtYXBfY2k7CisgIGludCBwaXhjb2RlOworICBpbnQgbmMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisgIGludCBkaXI7CQkJLyogMSBmb3IgbGVmdC10by1yaWdodCwgLTEgZm9yIHJpZ2h0LXRvLWxlZnQgKi8KKyAgaW50IGRpcm5jOwkJCS8qIGRpciAqIG5jICovCisgIGludCBjaTsKKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIFNISUZUX1RFTVBTCisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICAvKiBJbml0aWFsaXplIG91dHB1dCB2YWx1ZXMgdG8gMCBzbyBjYW4gcHJvY2VzcyBjb21wb25lbnRzIHNlcGFyYXRlbHkgKi8KKyAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIG91dHB1dF9idWZbcm93XSwKKwkgICAgICAoc2l6ZV90KSAod2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgeworICAgICAgaW5wdXRfcHRyID0gaW5wdXRfYnVmW3Jvd10gKyBjaTsKKyAgICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW3Jvd107CisgICAgICBpZiAoY3F1YW50aXplLT5vbl9vZGRfcm93KSB7CisJLyogd29yayByaWdodCB0byBsZWZ0IGluIHRoaXMgcm93ICovCisJaW5wdXRfcHRyICs9ICh3aWR0aC0xKSAqIG5jOyAvKiBzbyBwb2ludCB0byByaWdodG1vc3QgcGl4ZWwgKi8KKwlvdXRwdXRfcHRyICs9IHdpZHRoLTE7CisJZGlyID0gLTE7CisJZGlybmMgPSAtbmM7CisJZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzW2NpXSArICh3aWR0aCsxKTsgLyogPT4gZW50cnkgYWZ0ZXIgbGFzdCBjb2x1bW4gKi8KKyAgICAgIH0gZWxzZSB7CisJLyogd29yayBsZWZ0IHRvIHJpZ2h0IGluIHRoaXMgcm93ICovCisJZGlyID0gMTsKKwlkaXJuYyA9IG5jOworCWVycm9ycHRyID0gY3F1YW50aXplLT5mc2Vycm9yc1tjaV07IC8qID0+IGVudHJ5IGJlZm9yZSBmaXJzdCBjb2x1bW4gKi8KKyAgICAgIH0KKyAgICAgIGNvbG9yaW5kZXhfY2kgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbY2ldOworICAgICAgY29sb3JtYXBfY2kgPSBjcXVhbnRpemUtPnN2X2NvbG9ybWFwW2NpXTsKKyAgICAgIC8qIFByZXNldCBlcnJvciB2YWx1ZXM6IG5vIGVycm9yIHByb3BhZ2F0ZWQgdG8gZmlyc3QgcGl4ZWwgZnJvbSBsZWZ0ICovCisgICAgICBjdXIgPSAwOworICAgICAgLyogYW5kIG5vIGVycm9yIHByb3BhZ2F0ZWQgdG8gcm93IGJlbG93IHlldCAqLworICAgICAgYmVsb3dlcnIgPSBicHJldmVyciA9IDA7CisKKyAgICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisJLyogY3VyIGhvbGRzIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIHBpeGVsIG9uIHRoZQorCSAqIGN1cnJlbnQgbGluZS4gIEFkZCB0aGUgZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lCisJICogdG8gZm9ybSB0aGUgY29tcGxldGUgZXJyb3IgY29ycmVjdGlvbiB0ZXJtIGZvciB0aGlzIHBpeGVsLCBhbmQKKwkgKiByb3VuZCB0aGUgZXJyb3IgdGVybSAod2hpY2ggaXMgZXhwcmVzc2VkICogMTYpIHRvIGFuIGludGVnZXIuCisJICogUklHSFRfU0hJRlQgcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHksIHNvIGFkZGluZyA4IGlzIGNvcnJlY3QKKwkgKiBmb3IgZWl0aGVyIHNpZ24gb2YgdGhlIGVycm9yIHZhbHVlLgorCSAqIE5vdGU6IGVycm9ycHRyIHBvaW50cyB0byAqcHJldmlvdXMqIGNvbHVtbidzIGFycmF5IGVudHJ5LgorCSAqLworCWN1ciA9IFJJR0hUX1NISUZUKGN1ciArIGVycm9ycHRyW2Rpcl0gKyA4LCA0KTsKKwkvKiBGb3JtIHBpeGVsIHZhbHVlICsgZXJyb3IsIGFuZCByYW5nZS1saW1pdCB0byAwLi5NQVhKU0FNUExFLgorCSAqIFRoZSBtYXhpbXVtIGVycm9yIGlzICstIE1BWEpTQU1QTEU7IHRoaXMgc2V0cyB0aGUgcmVxdWlyZWQgc2l6ZQorCSAqIG9mIHRoZSByYW5nZV9saW1pdCBhcnJheS4KKwkgKi8KKwljdXIgKz0gR0VUSlNBTVBMRSgqaW5wdXRfcHRyKTsKKwljdXIgPSBHRVRKU0FNUExFKHJhbmdlX2xpbWl0W2N1cl0pOworCS8qIFNlbGVjdCBvdXRwdXQgdmFsdWUsIGFjY3VtdWxhdGUgaW50byBvdXRwdXQgY29kZSBmb3IgdGhpcyBwaXhlbCAqLworCXBpeGNvZGUgPSBHRVRKU0FNUExFKGNvbG9yaW5kZXhfY2lbY3VyXSk7CisJKm91dHB1dF9wdHIgKz0gKEpTQU1QTEUpIHBpeGNvZGU7CisJLyogQ29tcHV0ZSBhY3R1YWwgcmVwcmVzZW50YXRpb24gZXJyb3IgYXQgdGhpcyBwaXhlbCAqLworCS8qIE5vdGU6IHdlIGNhbiBkbyB0aGlzIGV2ZW4gdGhvdWdoIHdlIGRvbid0IGhhdmUgdGhlIGZpbmFsICovCisJLyogcGl4ZWwgY29kZSwgYmVjYXVzZSB0aGUgY29sb3JtYXAgaXMgb3J0aG9nb25hbC4gKi8KKwljdXIgLT0gR0VUSlNBTVBMRShjb2xvcm1hcF9jaVtwaXhjb2RlXSk7CisJLyogQ29tcHV0ZSBlcnJvciBmcmFjdGlvbnMgdG8gYmUgcHJvcGFnYXRlZCB0byBhZGphY2VudCBwaXhlbHMuCisJICogQWRkIHRoZXNlIGludG8gdGhlIHJ1bm5pbmcgc3VtcywgYW5kIHNpbXVsdGFuZW91c2x5IHNoaWZ0IHRoZQorCSAqIG5leHQtbGluZSBlcnJvciBzdW1zIGxlZnQgYnkgMSBjb2x1bW4uCisJICovCisJYm5leHRlcnIgPSBjdXI7CisJZGVsdGEgPSBjdXIgKiAyOworCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiAzICovCisJZXJyb3JwdHJbMF0gPSAoRlNFUlJPUikgKGJwcmV2ZXJyICsgY3VyKTsKKwljdXIgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNSAqLworCWJwcmV2ZXJyID0gYmVsb3dlcnIgKyBjdXI7CisJYmVsb3dlcnIgPSBibmV4dGVycjsKKwljdXIgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNyAqLworCS8qIEF0IHRoaXMgcG9pbnQgY3VyIGNvbnRhaW5zIHRoZSA3LzE2IGVycm9yIHZhbHVlIHRvIGJlIHByb3BhZ2F0ZWQKKwkgKiB0byB0aGUgbmV4dCBwaXhlbCBvbiB0aGUgY3VycmVudCBsaW5lLCBhbmQgYWxsIHRoZSBlcnJvcnMgZm9yIHRoZQorCSAqIG5leHQgbGluZSBoYXZlIGJlZW4gc2hpZnRlZCBvdmVyLiBXZSBhcmUgdGhlcmVmb3JlIHJlYWR5IHRvIG1vdmUgb24uCisJICovCisJaW5wdXRfcHRyICs9IGRpcm5jOwkvKiBhZHZhbmNlIGlucHV0IHB0ciB0byBuZXh0IGNvbHVtbiAqLworCW91dHB1dF9wdHIgKz0gZGlyOwkvKiBhZHZhbmNlIG91dHB1dCBwdHIgdG8gbmV4dCBjb2x1bW4gKi8KKwllcnJvcnB0ciArPSBkaXI7CS8qIGFkdmFuY2UgZXJyb3JwdHIgdG8gY3VycmVudCBjb2x1bW4gKi8KKyAgICAgIH0KKyAgICAgIC8qIFBvc3QtbG9vcCBjbGVhbnVwOiB3ZSBtdXN0IHVubG9hZCB0aGUgZmluYWwgZXJyb3IgdmFsdWUgaW50byB0aGUKKyAgICAgICAqIGZpbmFsIGZzZXJyb3JzW10gZW50cnkuICBOb3RlIHdlIG5lZWQgbm90IHVubG9hZCBiZWxvd2VyciBiZWNhdXNlCisgICAgICAgKiBpdCBpcyBmb3IgdGhlIGR1bW15IGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbCBhcnJheS4KKyAgICAgICAqLworICAgICAgZXJyb3JwdHJbMF0gPSAoRlNFUlJPUikgYnByZXZlcnI7IC8qIHVubG9hZCBwcmV2IGVyciBpbnRvIGFycmF5ICovCisgICAgfQorICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IChjcXVhbnRpemUtPm9uX29kZF9yb3cgPyBGQUxTRSA6IFRSVUUpOworICB9Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIHdvcmtzcGFjZSBmb3IgRmxveWQtU3RlaW5iZXJnIGVycm9ycy4KKyAqLworCitMT0NBTCh2b2lkKQorYWxsb2NfZnNfd29ya3NwYWNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBzaXplX3QgYXJyYXlzaXplOworICBpbnQgaTsKKworICBhcnJheXNpemUgPSAoc2l6ZV90KSAoKGNpbmZvLT5vdXRwdXRfd2lkdGggKyAyKSAqIFNJWkVPRihGU0VSUk9SKSk7CisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykgeworICAgIGNxdWFudGl6ZS0+ZnNlcnJvcnNbaV0gPSAoRlNFUlJQVFIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGFycmF5c2l6ZSk7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3Igb25lLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc18xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3ByZV9zY2FuKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBzaXplX3QgYXJyYXlzaXplOworICBpbnQgaTsKKworICAvKiBJbnN0YWxsIG15IGNvbG9ybWFwLiAqLworICBjaW5mby0+Y29sb3JtYXAgPSBjcXVhbnRpemUtPnN2X2NvbG9ybWFwOworICBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMgPSBjcXVhbnRpemUtPnN2X2FjdHVhbDsKKworICAvKiBJbml0aWFsaXplIGZvciBkZXNpcmVkIGRpdGhlcmluZyBtb2RlLiAqLworICBzd2l0Y2ggKGNpbmZvLT5kaXRoZXJfbW9kZSkgeworICBjYXNlIEpESVRIRVJfTk9ORToKKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID09IDMpCisgICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IGNvbG9yX3F1YW50aXplMzsKKyAgICBlbHNlCisgICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IGNvbG9yX3F1YW50aXplOworICAgIGJyZWFrOworICBjYXNlIEpESVRIRVJfT1JERVJFRDoKKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID09IDMpCisgICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IHF1YW50aXplM19vcmRfZGl0aGVyOworICAgIGVsc2UKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcXVhbnRpemVfb3JkX2RpdGhlcjsKKyAgICBjcXVhbnRpemUtPnJvd19pbmRleCA9IDA7CS8qIGluaXRpYWxpemUgc3RhdGUgZm9yIG9yZGVyZWQgZGl0aGVyICovCisgICAgLyogSWYgdXNlciBjaGFuZ2VkIHRvIG9yZGVyZWQgZGl0aGVyIGZyb20gYW5vdGhlciBtb2RlLAorICAgICAqIHdlIG11c3QgcmVjcmVhdGUgdGhlIGNvbG9yIGluZGV4IHRhYmxlIHdpdGggcGFkZGluZy4KKyAgICAgKiBUaGlzIHdpbGwgY29zdCBleHRyYSBzcGFjZSwgYnV0IHByb2JhYmx5IGlzbid0IHZlcnkgbGlrZWx5LgorICAgICAqLworICAgIGlmICghIGNxdWFudGl6ZS0+aXNfcGFkZGVkKQorICAgICAgY3JlYXRlX2NvbG9yaW5kZXgoY2luZm8pOworICAgIC8qIENyZWF0ZSBvcmRlcmVkLWRpdGhlciB0YWJsZXMgaWYgd2UgZGlkbid0IGFscmVhZHkuICovCisgICAgaWYgKGNxdWFudGl6ZS0+b2RpdGhlclswXSA9PSBOVUxMKQorICAgICAgY3JlYXRlX29kaXRoZXJfdGFibGVzKGNpbmZvKTsKKyAgICBicmVhazsKKyAgY2FzZSBKRElUSEVSX0ZTOgorICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcXVhbnRpemVfZnNfZGl0aGVyOworICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IEZBTFNFOyAvKiBpbml0aWFsaXplIHN0YXRlIGZvciBGLVMgZGl0aGVyICovCisgICAgLyogQWxsb2NhdGUgRmxveWQtU3RlaW5iZXJnIHdvcmtzcGFjZSBpZiBkaWRuJ3QgYWxyZWFkeS4gKi8KKyAgICBpZiAoY3F1YW50aXplLT5mc2Vycm9yc1swXSA9PSBOVUxMKQorICAgICAgYWxsb2NfZnNfd29ya3NwYWNlKGNpbmZvKTsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9wYWdhdGVkIGVycm9ycyB0byB6ZXJvLiAqLworICAgIGFycmF5c2l6ZSA9IChzaXplX3QpICgoY2luZm8tPm91dHB1dF93aWR0aCArIDIpICogU0laRU9GKEZTRVJST1IpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBpKyspCisgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNxdWFudGl6ZS0+ZnNlcnJvcnNbaV0sIGFycmF5c2l6ZSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfMV9xdWFudCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBpbiAxLXBhc3MgY2FzZSAqLworfQorCisKKy8qCisgKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgorICogU2hvdWxkbid0IGdldCB0byB0aGlzIG1vZHVsZSEKKyAqLworCitNRVRIT0RERUYodm9pZCkKK25ld19jb2xvcl9tYXBfMV9xdWFudCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgRVJSRVhJVChjaW5mbywgSkVSUl9NT0RFX0NIQU5HRSk7Cit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfMXBhc3NfcXVhbnRpemVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZTsKKworICBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jcXVhbnRpemVyKSk7CisgIGNpbmZvLT5jcXVhbnRpemUgPSAoc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICopIGNxdWFudGl6ZTsKKyAgY3F1YW50aXplLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfMV9xdWFudDsKKyAgY3F1YW50aXplLT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc18xX3F1YW50OworICBjcXVhbnRpemUtPnB1Yi5uZXdfY29sb3JfbWFwID0gbmV3X2NvbG9yX21hcF8xX3F1YW50OworICBjcXVhbnRpemUtPmZzZXJyb3JzWzBdID0gTlVMTDsgLyogRmxhZyBGUyB3b3Jrc3BhY2Ugbm90IGFsbG9jYXRlZCAqLworICBjcXVhbnRpemUtPm9kaXRoZXJbMF0gPSBOVUxMOwkvKiBBbHNvIGZsYWcgb2RpdGhlciBhcnJheXMgbm90IGFsbG9jYXRlZCAqLworCisgIC8qIE1ha2Ugc3VyZSBteSBpbnRlcm5hbCBhcnJheXMgd29uJ3Qgb3ZlcmZsb3cgKi8KKyAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA+IE1BWF9RX0NPTVBTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX0NPTVBPTkVOVFMsIE1BWF9RX0NPTVBTKTsKKyAgLyogTWFrZSBzdXJlIGNvbG9ybWFwIGluZGV4ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IEpTQU1QTEVzICovCisgIGlmIChjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID4gKE1BWEpTQU1QTEUrMSkpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsIE1BWEpTQU1QTEUrMSk7CisKKyAgLyogQ3JlYXRlIHRoZSBjb2xvcm1hcCBhbmQgY29sb3IgaW5kZXggdGFibGUuICovCisgIGNyZWF0ZV9jb2xvcm1hcChjaW5mbyk7CisgIGNyZWF0ZV9jb2xvcmluZGV4KGNpbmZvKTsKKworICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIG5vdyBpZiByZXF1ZXN0ZWQuCisgICAqIFdlIGRvIHRoaXMgbm93IHNpbmNlIGl0IGlzIEZBUiBzdG9yYWdlIGFuZCBtYXkgYWZmZWN0IHRoZSBtZW1vcnkKKyAgICogbWFuYWdlcidzIHNwYWNlIGNhbGN1bGF0aW9ucy4gIElmIHRoZSB1c2VyIGNoYW5nZXMgdG8gRlMgZGl0aGVyCisgICAqIG1vZGUgaW4gYSBsYXRlciBwYXNzLCB3ZSB3aWxsIGFsbG9jYXRlIHRoZSBzcGFjZSB0aGVuLCBhbmQgd2lsbAorICAgKiBwb3NzaWJseSBvdmVycnVuIHRoZSBtYXhfbWVtb3J5X3RvX3VzZSBzZXR0aW5nLgorICAgKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX0ZTKQorICAgIGFsbG9jX2ZzX3dvcmtzcGFjZShjaW5mbyk7Cit9CisKKyNlbmRpZiAvKiBRVUFOVF8xUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvanF1YW50Mi5jIGIvanBlZy9qcXVhbnQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2MDFlMwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvanF1YW50Mi5jCkBAIC0wLDAgKzEsMTMxMCBAQAorLyoKKyAqIGpxdWFudDIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKGNvbG9yIG1hcHBpbmcpIHJvdXRpbmVzLgorICogVGhlc2Ugcm91dGluZXMgcHJvdmlkZSBzZWxlY3Rpb24gb2YgYSBjdXN0b20gY29sb3IgbWFwIGZvciBhbiBpbWFnZSwKKyAqIGZvbGxvd2VkIGJ5IG1hcHBpbmcgb2YgdGhlIGltYWdlIHRvIHRoYXQgY29sb3IgbWFwLCB3aXRoIG9wdGlvbmFsCisgKiBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nLgorICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UganVzdCB0aGUgc2Vjb25kIHBhc3MgdG8gbWFwIHRvIGFuIGFyYml0cmFyeQorICogZXh0ZXJuYWxseS1naXZlbiBjb2xvciBtYXAuCisgKgorICogTm90ZTogb3JkZXJlZCBkaXRoZXJpbmcgaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgdGhlcmUgaXNuJ3QgYW55IGZhc3QKKyAqIHdheSB0byBjb21wdXRlIGludGVyY29sb3IgZGlzdGFuY2VzOyBpdCdzIHVuY2xlYXIgdGhhdCBvcmRlcmVkIGRpdGhlcidzCisgKiBmdW5kYW1lbnRhbCBhc3N1bXB0aW9ucyBldmVuIGhvbGQgd2l0aCBhbiBpcnJlZ3VsYXJseSBzcGFjZWQgY29sb3IgbWFwLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSB3ZWxsLWtub3duIEhlY2tiZXJ0IHBhcmFkaWdtIGZvciBjb2xvcgorICogcXVhbnRpemF0aW9uLiAgTW9zdCBvZiB0aGUgaWRlYXMgdXNlZCBoZXJlIGNhbiBiZSB0cmFjZWQgYmFjayB0bworICogSGVja2JlcnQncyBzZW1pbmFsIHBhcGVyCisgKiAgIEhlY2tiZXJ0LCBQYXVsLiAgIkNvbG9yIEltYWdlIFF1YW50aXphdGlvbiBmb3IgRnJhbWUgQnVmZmVyIERpc3BsYXkiLAorICogICBQcm9jLiBTSUdHUkFQSCAnODIsIENvbXB1dGVyIEdyYXBoaWNzIHYuMTYgIzMgKEp1bHkgMTk4MiksIHBwIDI5Ny0zMDQuCisgKgorICogSW4gdGhlIGZpcnN0IHBhc3Mgb3ZlciB0aGUgaW1hZ2UsIHdlIGFjY3VtdWxhdGUgYSBoaXN0b2dyYW0gc2hvd2luZyB0aGUKKyAqIHVzYWdlIGNvdW50IG9mIGVhY2ggcG9zc2libGUgY29sb3IuICBUbyBrZWVwIHRoZSBoaXN0b2dyYW0gdG8gYSByZWFzb25hYmxlCisgKiBzaXplLCB3ZSByZWR1Y2UgdGhlIHByZWNpc2lvbiBvZiB0aGUgaW5wdXQ7IHR5cGljYWwgcHJhY3RpY2UgaXMgdG8gcmV0YWluCisgKiA1IG9yIDYgYml0cyBwZXIgY29sb3IsIHNvIHRoYXQgOCBvciA0IGRpZmZlcmVudCBpbnB1dCB2YWx1ZXMgYXJlIGNvdW50ZWQKKyAqIGluIHRoZSBzYW1lIGhpc3RvZ3JhbSBjZWxsLgorICoKKyAqIE5leHQsIHRoZSBjb2xvci1zZWxlY3Rpb24gc3RlcCBiZWdpbnMgd2l0aCBhIGJveCByZXByZXNlbnRpbmcgdGhlIHdob2xlCisgKiBjb2xvciBzcGFjZSwgYW5kIHJlcGVhdGVkbHkgc3BsaXRzIHRoZSAibGFyZ2VzdCIgcmVtYWluaW5nIGJveCB1bnRpbCB3ZQorICogaGF2ZSBhcyBtYW55IGJveGVzIGFzIGRlc2lyZWQgY29sb3JzLiAgVGhlbiB0aGUgbWVhbiBjb2xvciBpbiBlYWNoCisgKiByZW1haW5pbmcgYm94IGJlY29tZXMgb25lIG9mIHRoZSBwb3NzaWJsZSBvdXRwdXQgY29sb3JzLgorICogCisgKiBUaGUgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgaW1hZ2UgbWFwcyBlYWNoIGlucHV0IHBpeGVsIHRvIHRoZSBjbG9zZXN0IG91dHB1dAorICogY29sb3IgKG9wdGlvbmFsbHkgYWZ0ZXIgYXBwbHlpbmcgYSBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGNvcnJlY3Rpb24pLgorICogVGhpcyBtYXBwaW5nIGlzIGxvZ2ljYWxseSB0cml2aWFsLCBidXQgbWFraW5nIGl0IGdvIGZhc3QgZW5vdWdoIHJlcXVpcmVzCisgKiBjb25zaWRlcmFibGUgY2FyZS4KKyAqCisgKiBIZWNrYmVydC1zdHlsZSBxdWFudGl6ZXJzIHZhcnkgYSBnb29kIGRlYWwgaW4gdGhlaXIgcG9saWNpZXMgZm9yIGNob29zaW5nCisgKiB0aGUgImxhcmdlc3QiIGJveCBhbmQgZGVjaWRpbmcgd2hlcmUgdG8gY3V0IGl0LiAgVGhlIHBhcnRpY3VsYXIgcG9saWNpZXMKKyAqIHVzZWQgaGVyZSBoYXZlIHByb3ZlZCBvdXQgd2VsbCBpbiBleHBlcmltZW50YWwgY29tcGFyaXNvbnMsIGJ1dCBiZXR0ZXIgb25lcworICogbWF5IHlldCBiZSBmb3VuZC4KKyAqCisgKiBJbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSwgdGhpcyBtb2R1bGUgcXVhbnRpemVkIGluIFlDYkNyIGNvbG9yCisgKiBzcGFjZSwgcHJvY2Vzc2luZyB0aGUgcmF3IHVwc2FtcGxlZCBkYXRhIHdpdGhvdXQgYSBjb2xvciBjb252ZXJzaW9uIHN0ZXAuCisgKiBUaGlzIGFsbG93ZWQgdGhlIGNvbG9yIGNvbnZlcnNpb24gbWF0aCB0byBiZSBkb25lIG9ubHkgb25jZSBwZXIgY29sb3JtYXAKKyAqIGVudHJ5LCBub3Qgb25jZSBwZXIgcGl4ZWwuICBIb3dldmVyLCB0aGF0IG9wdGltaXphdGlvbiBwcmVjbHVkZWQgb3RoZXIKKyAqIHVzZWZ1bCBvcHRpbWl6YXRpb25zIChzdWNoIGFzIG1lcmdpbmcgY29sb3IgY29udmVyc2lvbiB3aXRoIHVwc2FtcGxpbmcpCisgKiBhbmQgaXQgYWxzbyBpbnRlcmZlcmVkIHdpdGggZGVzaXJlZCBjYXBhYmlsaXRpZXMgc3VjaCBhcyBxdWFudGl6aW5nIHRvIGFuCisgKiBleHRlcm5hbGx5LXN1cHBsaWVkIGNvbG9ybWFwLiAgV2UgaGF2ZSB0aGVyZWZvcmUgYWJhbmRvbmVkIHRoYXQgYXBwcm9hY2guCisgKiBUaGUgcHJlc2VudCBjb2RlIHdvcmtzIGluIHRoZSBwb3N0LWNvbnZlcnNpb24gY29sb3Igc3BhY2UsIHR5cGljYWxseSBSR0IuCisgKgorICogVG8gaW1wcm92ZSB0aGUgdmlzdWFsIHF1YWxpdHkgb2YgdGhlIHJlc3VsdHMsIHdlIGFjdHVhbGx5IHdvcmsgaW4gc2NhbGVkCisgKiBSR0Igc3BhY2UsIGdpdmluZyBHIGRpc3RhbmNlcyBtb3JlIHdlaWdodCB0aGFuIFIsIGFuZCBSIGluIHR1cm4gbW9yZSB0aGFuCisgKiBCLiAgVG8gZG8gZXZlcnl0aGluZyBpbiBpbnRlZ2VyIG1hdGgsIHdlIG11c3QgdXNlIGludGVnZXIgc2NhbGUgZmFjdG9ycy4KKyAqIFRoZSAyLzMvMSBzY2FsZSBmYWN0b3JzIHVzZWQgaGVyZSBjb3JyZXNwb25kIGxvb3NlbHkgdG8gdGhlIHJlbGF0aXZlCisgKiB3ZWlnaHRzIG9mIHRoZSBjb2xvcnMgaW4gdGhlIE5UU0MgZ3JheXNjYWxlIGVxdWF0aW9uLgorICogSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29kZSB0byBxdWFudGl6ZSBhIG5vbi1SR0IgY29sb3Igc3BhY2UsIHlvdSdsbAorICogcHJvYmFibHkgbmVlZCB0byBjaGFuZ2UgdGhlc2Ugc2NhbGUgZmFjdG9ycy4KKyAqLworCisjZGVmaW5lIFJfU0NBTEUgMgkJLyogc2NhbGUgUiBkaXN0YW5jZXMgYnkgdGhpcyBtdWNoICovCisjZGVmaW5lIEdfU0NBTEUgMwkJLyogc2NhbGUgRyBkaXN0YW5jZXMgYnkgdGhpcyBtdWNoICovCisjZGVmaW5lIEJfU0NBTEUgMQkJLyogYW5kIEIgYnkgdGhpcyBtdWNoICovCisKKy8qIFJlbGFiZWwgUi9HL0IgYXMgY29tcG9uZW50cyAwLzEvMiwgcmVzcGVjdGluZyB0aGUgUkdCIG9yZGVyaW5nIGRlZmluZWQKKyAqIGluIGptb3JlY2ZnLmguICBBcyB0aGUgY29kZSBzdGFuZHMsIGl0IHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBSLEcsQgorICogYW5kIEIsRyxSIG9yZGVycy4gIElmIHlvdSBkZWZpbmUgc29tZSBvdGhlciB3ZWlyZCBvcmRlciBpbiBqbW9yZWNmZy5oLAorICogeW91J2xsIGdldCBjb21waWxlIGVycm9ycyB1bnRpbCB5b3UgZXh0ZW5kIHRoaXMgbG9naWMuICBJbiB0aGF0IGNhc2UKKyAqIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHR3ZWFrIHRoZSBoaXN0b2dyYW0gc2l6ZXMgdG9vLgorICovCisKKyNpZiBSR0JfUkVEID09IDAKKyNkZWZpbmUgQzBfU0NBTEUgUl9TQ0FMRQorI2VuZGlmCisjaWYgUkdCX0JMVUUgPT0gMAorI2RlZmluZSBDMF9TQ0FMRSBCX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfR1JFRU4gPT0gMQorI2RlZmluZSBDMV9TQ0FMRSBHX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfUkVEID09IDIKKyNkZWZpbmUgQzJfU0NBTEUgUl9TQ0FMRQorI2VuZGlmCisjaWYgUkdCX0JMVUUgPT0gMgorI2RlZmluZSBDMl9TQ0FMRSBCX1NDQUxFCisjZW5kaWYKKworCisvKgorICogRmlyc3Qgd2UgaGF2ZSB0aGUgaGlzdG9ncmFtIGRhdGEgc3RydWN0dXJlIGFuZCByb3V0aW5lcyBmb3IgY3JlYXRpbmcgaXQuCisgKgorICogVGhlIG51bWJlciBvZiBiaXRzIG9mIHByZWNpc2lvbiBjYW4gYmUgYWRqdXN0ZWQgYnkgY2hhbmdpbmcgdGhlc2Ugc3ltYm9scy4KKyAqIFdlIHJlY29tbWVuZCBrZWVwaW5nIDYgYml0cyBmb3IgRyBhbmQgNSBlYWNoIGZvciBSIGFuZCBCLgorICogSWYgeW91IGhhdmUgcGxlbnR5IG9mIG1lbW9yeSBhbmQgY3ljbGVzLCA2IGJpdHMgYWxsIGFyb3VuZCBnaXZlcyBtYXJnaW5hbGx5CisgKiBiZXR0ZXIgcmVzdWx0czsgaWYgeW91IGFyZSBzaG9ydCBvZiBtZW1vcnksIDUgYml0cyBhbGwgYXJvdW5kIHdpbGwgc2F2ZQorICogc29tZSBzcGFjZSBidXQgZGVncmFkZSB0aGUgcmVzdWx0cy4KKyAqIFRvIG1haW50YWluIGEgZnVsbHkgYWNjdXJhdGUgaGlzdG9ncmFtLCB3ZSdkIG5lZWQgdG8gYWxsb2NhdGUgYSAibG9uZyIKKyAqIChwcmVmZXJhYmx5IHVuc2lnbmVkIGxvbmcpIGZvciBlYWNoIGNlbGwuICBJbiBwcmFjdGljZSB0aGlzIGlzIG92ZXJraWxsOworICogd2UgY2FuIGdldCBieSB3aXRoIDE2IGJpdHMgcGVyIGNlbGwuICBGZXcgb2YgdGhlIGNlbGwgY291bnRzIHdpbGwgb3ZlcmZsb3csCisgKiBhbmQgY2xhbXBpbmcgdGhvc2UgdGhhdCBkbyBvdmVyZmxvdyB0byB0aGUgbWF4aW11bSB2YWx1ZSB3aWxsIGdpdmUgY2xvc2UtCisgKiBlbm91Z2ggcmVzdWx0cy4gIFRoaXMgcmVkdWNlcyB0aGUgcmVjb21tZW5kZWQgaGlzdG9ncmFtIHNpemUgZnJvbSAyNTZLYgorICogdG8gMTI4S2IsIHdoaWNoIGlzIGEgdXNlZnVsIHNhdmluZ3Mgb24gUEMtY2xhc3MgbWFjaGluZXMuCisgKiAoSW4gdGhlIHNlY29uZCBwYXNzIHRoZSBoaXN0b2dyYW0gc3BhY2UgaXMgcmUtdXNlZCBmb3IgcGl4ZWwgbWFwcGluZyBkYXRhOworICogaW4gdGhhdCBjYXBhY2l0eSwgZWFjaCBjZWxsIG11c3QgYmUgYWJsZSB0byBzdG9yZSB6ZXJvIHRvIHRoZSBudW1iZXIgb2YKKyAqIGRlc2lyZWQgY29sb3JzLiAgMTYgYml0cy9jZWxsIGlzIHBsZW50eSBmb3IgdGhhdCB0b28uKQorICogU2luY2UgdGhlIEpQRUcgY29kZSBpcyBpbnRlbmRlZCB0byBydW4gaW4gc21hbGwgbWVtb3J5IG1vZGVsIG9uIDgweDg2CisgKiBtYWNoaW5lcywgd2UgY2FuJ3QganVzdCBhbGxvY2F0ZSB0aGUgaGlzdG9ncmFtIGluIG9uZSBjaHVuay4gIEluc3RlYWQKKyAqIG9mIGEgdHJ1ZSAzLUQgYXJyYXksIHdlIHVzZSBhIHJvdyBvZiBwb2ludGVycyB0byAyLUQgYXJyYXlzLiAgRWFjaAorICogcG9pbnRlciBjb3JyZXNwb25kcyB0byBhIEMwIHZhbHVlICh0eXBpY2FsbHkgMl41ID0gMzIgcG9pbnRlcnMpIGFuZAorICogZWFjaCAyLUQgYXJyYXkgaGFzIDJeNioyXjUgPSAyMDQ4IG9yIDJeNioyXjYgPSA0MDk2IGVudHJpZXMuICBOb3RlIHRoYXQKKyAqIG9uIDgweDg2IG1hY2hpbmVzLCB0aGUgcG9pbnRlciByb3cgaXMgaW4gbmVhciBtZW1vcnkgYnV0IHRoZSBhY3R1YWwKKyAqIGFycmF5cyBhcmUgaW4gZmFyIG1lbW9yeSAoc2FtZSBhcnJhbmdlbWVudCBhcyB3ZSB1c2UgZm9yIGltYWdlIGFycmF5cykuCisgKi8KKworI2RlZmluZSBNQVhOVU1DT0xPUlMgIChNQVhKU0FNUExFKzEpIC8qIG1heGltdW0gc2l6ZSBvZiBjb2xvcm1hcCAqLworCisvKiBUaGVzZSB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBmb3IgZWl0aGVyIFIsRyxCIG9yIEIsRyxSIGNvbG9yIG9yZGVyLAorICogYnV0IHlvdSBtYXkgbm90IGxpa2UgdGhlIHJlc3VsdHMgZm9yIG90aGVyIGNvbG9yIG9yZGVycy4KKyAqLworI2RlZmluZSBISVNUX0MwX0JJVFMgIDUJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIFIvQiBoaXN0b2dyYW0gKi8KKyNkZWZpbmUgSElTVF9DMV9CSVRTICA2CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBHIGhpc3RvZ3JhbSAqLworI2RlZmluZSBISVNUX0MyX0JJVFMgIDUJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIEIvUiBoaXN0b2dyYW0gKi8KKworLyogTnVtYmVyIG9mIGVsZW1lbnRzIGFsb25nIGhpc3RvZ3JhbSBheGVzLiAqLworI2RlZmluZSBISVNUX0MwX0VMRU1TICAoMTw8SElTVF9DMF9CSVRTKQorI2RlZmluZSBISVNUX0MxX0VMRU1TICAoMTw8SElTVF9DMV9CSVRTKQorI2RlZmluZSBISVNUX0MyX0VMRU1TICAoMTw8SElTVF9DMl9CSVRTKQorCisvKiBUaGVzZSBhcmUgdGhlIGFtb3VudHMgdG8gc2hpZnQgYW4gaW5wdXQgdmFsdWUgdG8gZ2V0IGEgaGlzdG9ncmFtIGluZGV4LiAqLworI2RlZmluZSBDMF9TSElGVCAgKEJJVFNfSU5fSlNBTVBMRS1ISVNUX0MwX0JJVFMpCisjZGVmaW5lIEMxX1NISUZUICAoQklUU19JTl9KU0FNUExFLUhJU1RfQzFfQklUUykKKyNkZWZpbmUgQzJfU0hJRlQgIChCSVRTX0lOX0pTQU1QTEUtSElTVF9DMl9CSVRTKQorCisKK3R5cGVkZWYgVUlOVDE2IGhpc3RjZWxsOwkvKiBoaXN0b2dyYW0gY2VsbDsgcHJlZmVyIGFuIHVuc2lnbmVkIHR5cGUgKi8KKwordHlwZWRlZiBoaXN0Y2VsbCBGQVIgKiBoaXN0cHRyOwkvKiBmb3IgcG9pbnRlcnMgdG8gaGlzdG9ncmFtIGNlbGxzICovCisKK3R5cGVkZWYgaGlzdGNlbGwgaGlzdDFkW0hJU1RfQzJfRUxFTVNdOyAvKiB0eXBlZGVmcyBmb3IgdGhlIGFycmF5ICovCit0eXBlZGVmIGhpc3QxZCBGQVIgKiBoaXN0MmQ7CS8qIHR5cGUgZm9yIHRoZSAybmQtbGV2ZWwgcG9pbnRlcnMgKi8KK3R5cGVkZWYgaGlzdDJkICogaGlzdDNkOwkvKiB0eXBlIGZvciB0b3AtbGV2ZWwgcG9pbnRlciAqLworCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZy4KKyAqCisgKiBFcnJvcnMgYXJlIGFjY3VtdWxhdGVkIGludG8gdGhlIGFycmF5IGZzZXJyb3JzW10sIGF0IGEgcmVzb2x1dGlvbiBvZgorICogMS8xNnRoIG9mIGEgcGl4ZWwgY291bnQuICBUaGUgZXJyb3IgYXQgYSBnaXZlbiBwaXhlbCBpcyBwcm9wYWdhdGVkCisgKiB0byBpdHMgbm90LXlldC1wcm9jZXNzZWQgbmVpZ2hib3JzIHVzaW5nIHRoZSBzdGFuZGFyZCBGLVMgZnJhY3Rpb25zLAorICoJCS4uLgkoaGVyZSkJNy8xNgorICoJCTMvMTYJNS8xNgkxLzE2CisgKiBXZSB3b3JrIGxlZnQtdG8tcmlnaHQgb24gZXZlbiByb3dzLCByaWdodC10by1sZWZ0IG9uIG9kZCByb3dzLgorICoKKyAqIFdlIGNhbiBnZXQgYXdheSB3aXRoIGEgc2luZ2xlIGFycmF5IChob2xkaW5nIG9uZSByb3cncyB3b3J0aCBvZiBlcnJvcnMpCisgKiBieSB1c2luZyBpdCB0byBzdG9yZSB0aGUgY3VycmVudCByb3cncyBlcnJvcnMgYXQgcGl4ZWwgY29sdW1ucyBub3QgeWV0CisgKiBwcm9jZXNzZWQsIGJ1dCB0aGUgbmV4dCByb3cncyBlcnJvcnMgYXQgY29sdW1ucyBhbHJlYWR5IHByb2Nlc3NlZC4gIFdlCisgKiBuZWVkIG9ubHkgYSBmZXcgZXh0cmEgdmFyaWFibGVzIHRvIGhvbGQgdGhlIGVycm9ycyBpbW1lZGlhdGVseSBhcm91bmQgdGhlCisgKiBjdXJyZW50IGNvbHVtbi4gIChJZiB3ZSBhcmUgbHVja3ksIHRob3NlIHZhcmlhYmxlcyBhcmUgaW4gcmVnaXN0ZXJzLCBidXQKKyAqIGV2ZW4gaWYgbm90LCB0aGV5J3JlIHByb2JhYmx5IGNoZWFwZXIgdG8gYWNjZXNzIHRoYW4gYXJyYXkgZWxlbWVudHMgYXJlLikKKyAqCisgKiBUaGUgZnNlcnJvcnNbXSBhcnJheSBoYXMgKCNjb2x1bW5zICsgMikgZW50cmllczsgdGhlIGV4dHJhIGVudHJ5IGF0CisgKiBlYWNoIGVuZCBzYXZlcyB1cyBmcm9tIHNwZWNpYWwtY2FzaW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBwaXhlbHMuCisgKiBFYWNoIGVudHJ5IGlzIHRocmVlIHZhbHVlcyBsb25nLCBvbmUgdmFsdWUgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgorICoKKyAqIE5vdGU6IG9uIGEgd2lkZSBpbWFnZSwgd2UgbWlnaHQgbm90IGhhdmUgZW5vdWdoIHJvb20gaW4gYSBQQydzIG5lYXIgZGF0YQorICogc2VnbWVudCB0byBob2xkIHRoZSBlcnJvciBhcnJheTsgc28gaXQgaXMgYWxsb2NhdGVkIHdpdGggYWxsb2NfbGFyZ2UuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIElOVDE2IEZTRVJST1I7CQkvKiAxNiBiaXRzIHNob3VsZCBiZSBlbm91Z2ggKi8KK3R5cGVkZWYgaW50IExPQ0ZTRVJST1I7CQkvKiB1c2UgJ2ludCcgZm9yIGNhbGN1bGF0aW9uIHRlbXBzICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBGU0VSUk9SOwkJLyogbWF5IG5lZWQgbW9yZSB0aGFuIDE2IGJpdHMgKi8KK3R5cGVkZWYgSU5UMzIgTE9DRlNFUlJPUjsJLyogYmUgc3VyZSBjYWxjdWxhdGlvbiB0ZW1wcyBhcmUgYmlnIGVub3VnaCAqLworI2VuZGlmCisKK3R5cGVkZWYgRlNFUlJPUiBGQVIgKkZTRVJSUFRSOwkvKiBwb2ludGVyIHRvIGVycm9yIGFycmF5IChpbiBGQVIgc3RvcmFnZSEpICovCisKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogU3BhY2UgZm9yIHRoZSBldmVudHVhbGx5IGNyZWF0ZWQgY29sb3JtYXAgaXMgc3Rhc2hlZCBoZXJlICovCisgIEpTQU1QQVJSQVkgc3ZfY29sb3JtYXA7CS8qIGNvbG9ybWFwIGFsbG9jYXRlZCBhdCBpbml0IHRpbWUgKi8KKyAgaW50IGRlc2lyZWQ7CQkJLyogZGVzaXJlZCAjIG9mIGNvbG9ycyA9IHNpemUgb2YgY29sb3JtYXAgKi8KKworICAvKiBWYXJpYWJsZXMgZm9yIGFjY3VtdWxhdGluZyBpbWFnZSBzdGF0aXN0aWNzICovCisgIGhpc3QzZCBoaXN0b2dyYW07CQkvKiBwb2ludGVyIHRvIHRoZSBoaXN0b2dyYW0gKi8KKworICBib29sZWFuIG5lZWRzX3plcm9lZDsJCS8qIFRSVUUgaWYgbmV4dCBwYXNzIG11c3QgemVybyBoaXN0b2dyYW0gKi8KKworICAvKiBWYXJpYWJsZXMgZm9yIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgKi8KKyAgRlNFUlJQVFIgZnNlcnJvcnM7CQkvKiBhY2N1bXVsYXRlZCBlcnJvcnMgKi8KKyAgYm9vbGVhbiBvbl9vZGRfcm93OwkJLyogZmxhZyB0byByZW1lbWJlciB3aGljaCByb3cgd2UgYXJlIG9uICovCisgIGludCAqIGVycm9yX2xpbWl0ZXI7CQkvKiB0YWJsZSBmb3IgY2xhbXBpbmcgdGhlIGFwcGxpZWQgZXJyb3IgKi8KK30gbXlfY3F1YW50aXplcjsKKwordHlwZWRlZiBteV9jcXVhbnRpemVyICogbXlfY3F1YW50aXplX3B0cjsKKworCisvKgorICogUHJlc2NhbiBzb21lIHJvd3Mgb2YgcGl4ZWxzLgorICogSW4gdGhpcyBtb2R1bGUgdGhlIHByZXNjYW4gc2ltcGx5IHVwZGF0ZXMgdGhlIGhpc3RvZ3JhbSwgd2hpY2ggaGFzIGJlZW4KKyAqIGluaXRpYWxpemVkIHRvIHplcm9lcyBieSBzdGFydF9wYXNzLgorICogQW4gb3V0cHV0X2J1ZiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgYnkgdGhlIG1ldGhvZCBzaWduYXR1cmUsIGJ1dCBubyBkYXRhCisgKiBpcyBhY3R1YWxseSBvdXRwdXQgKGluIGZhY3QgdGhlIGJ1ZmZlciBjb250cm9sbGVyIGlzIHByb2JhYmx5IHBhc3NpbmcgYQorICogTlVMTCBwb2ludGVyKS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ByZXNjYW5fcXVhbnRpemUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIGhpc3RwdHIgaGlzdHA7CisgIHJlZ2lzdGVyIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworCisgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgcHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgIC8qIGdldCBwaXhlbCB2YWx1ZSBhbmQgaW5kZXggaW50byB0aGUgaGlzdG9ncmFtICovCisgICAgICBoaXN0cCA9ICYgaGlzdG9ncmFtW0dFVEpTQU1QTEUocHRyWzBdKSA+PiBDMF9TSElGVF0KKwkJCSBbR0VUSlNBTVBMRShwdHJbMV0pID4+IEMxX1NISUZUXQorCQkJIFtHRVRKU0FNUExFKHB0clsyXSkgPj4gQzJfU0hJRlRdOworICAgICAgLyogaW5jcmVtZW50LCBjaGVjayBmb3Igb3ZlcmZsb3cgYW5kIHVuZG8gaW5jcmVtZW50IGlmIHNvLiAqLworICAgICAgaWYgKCsrKCpoaXN0cCkgPD0gMCkKKwkoKmhpc3RwKS0tOworICAgICAgcHRyICs9IDM7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIE5leHQgd2UgaGF2ZSB0aGUgcmVhbGx5IGludGVyZXN0aW5nIHJvdXRpbmVzOiBzZWxlY3Rpb24gb2YgYSBjb2xvcm1hcAorICogZ2l2ZW4gdGhlIGNvbXBsZXRlZCBoaXN0b2dyYW0uCisgKiBUaGVzZSByb3V0aW5lcyB3b3JrIHdpdGggYSBsaXN0IG9mICJib3hlcyIsIGVhY2ggcmVwcmVzZW50aW5nIGEgcmVjdGFuZ3VsYXIKKyAqIHN1YnNldCBvZiB0aGUgaW5wdXQgY29sb3Igc3BhY2UgKHRvIGhpc3RvZ3JhbSBwcmVjaXNpb24pLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhlIGJvdW5kcyBvZiB0aGUgYm94IChpbmNsdXNpdmUpOyBleHByZXNzZWQgYXMgaGlzdG9ncmFtIGluZGV4ZXMgKi8KKyAgaW50IGMwbWluLCBjMG1heDsKKyAgaW50IGMxbWluLCBjMW1heDsKKyAgaW50IGMybWluLCBjMm1heDsKKyAgLyogVGhlIHZvbHVtZSAoYWN0dWFsbHkgMi1ub3JtKSBvZiB0aGUgYm94ICovCisgIElOVDMyIHZvbHVtZTsKKyAgLyogVGhlIG51bWJlciBvZiBub256ZXJvIGhpc3RvZ3JhbSBjZWxscyB3aXRoaW4gdGhpcyBib3ggKi8KKyAgbG9uZyBjb2xvcmNvdW50OworfSBib3g7CisKK3R5cGVkZWYgYm94ICogYm94cHRyOworCisKK0xPQ0FMKGJveHB0cikKK2ZpbmRfYmlnZ2VzdF9jb2xvcl9wb3AgKGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMpCisvKiBGaW5kIHRoZSBzcGxpdHRhYmxlIGJveCB3aXRoIHRoZSBsYXJnZXN0IGNvbG9yIHBvcHVsYXRpb24gKi8KKy8qIFJldHVybnMgTlVMTCBpZiBubyBzcGxpdHRhYmxlIGJveGVzIHJlbWFpbiAqLworeworICByZWdpc3RlciBib3hwdHIgYm94cDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGxvbmcgbWF4YyA9IDA7CisgIGJveHB0ciB3aGljaCA9IE5VTEw7CisgIAorICBmb3IgKGkgPSAwLCBib3hwID0gYm94bGlzdDsgaSA8IG51bWJveGVzOyBpKyssIGJveHArKykgeworICAgIGlmIChib3hwLT5jb2xvcmNvdW50ID4gbWF4YyAmJiBib3hwLT52b2x1bWUgPiAwKSB7CisgICAgICB3aGljaCA9IGJveHA7CisgICAgICBtYXhjID0gYm94cC0+Y29sb3Jjb3VudDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdoaWNoOworfQorCisKK0xPQ0FMKGJveHB0cikKK2ZpbmRfYmlnZ2VzdF92b2x1bWUgKGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMpCisvKiBGaW5kIHRoZSBzcGxpdHRhYmxlIGJveCB3aXRoIHRoZSBsYXJnZXN0IChzY2FsZWQpIHZvbHVtZSAqLworLyogUmV0dXJucyBOVUxMIGlmIG5vIHNwbGl0dGFibGUgYm94ZXMgcmVtYWluICovCit7CisgIHJlZ2lzdGVyIGJveHB0ciBib3hwOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgSU5UMzIgbWF4diA9IDA7CisgIGJveHB0ciB3aGljaCA9IE5VTEw7CisgIAorICBmb3IgKGkgPSAwLCBib3hwID0gYm94bGlzdDsgaSA8IG51bWJveGVzOyBpKyssIGJveHArKykgeworICAgIGlmIChib3hwLT52b2x1bWUgPiBtYXh2KSB7CisgICAgICB3aGljaCA9IGJveHA7CisgICAgICBtYXh2ID0gYm94cC0+dm9sdW1lOworICAgIH0KKyAgfQorICByZXR1cm4gd2hpY2g7Cit9CisKKworTE9DQUwodm9pZCkKK3VwZGF0ZV9ib3ggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hwKQorLyogU2hyaW5rIHRoZSBtaW4vbWF4IGJvdW5kcyBvZiBhIGJveCB0byBlbmNsb3NlIG9ubHkgbm9uemVybyBlbGVtZW50cywgKi8KKy8qIGFuZCByZWNvbXB1dGUgaXRzIHZvbHVtZSBhbmQgcG9wdWxhdGlvbiAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07CisgIGhpc3RwdHIgaGlzdHA7CisgIGludCBjMCxjMSxjMjsKKyAgaW50IGMwbWluLGMwbWF4LGMxbWluLGMxbWF4LGMybWluLGMybWF4OworICBJTlQzMiBkaXN0MCxkaXN0MSxkaXN0MjsKKyAgbG9uZyBjY291bnQ7CisgIAorICBjMG1pbiA9IGJveHAtPmMwbWluOyAgYzBtYXggPSBib3hwLT5jMG1heDsKKyAgYzFtaW4gPSBib3hwLT5jMW1pbjsgIGMxbWF4ID0gYm94cC0+YzFtYXg7CisgIGMybWluID0gYm94cC0+YzJtaW47ICBjMm1heCA9IGJveHAtPmMybWF4OworICAKKyAgaWYgKGMwbWF4ID4gYzBtaW4pCisgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykKKyAgICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKKwloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOworCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisJICBpZiAoKmhpc3RwKysgIT0gMCkgeworCSAgICBib3hwLT5jMG1pbiA9IGMwbWluID0gYzA7CisJICAgIGdvdG8gaGF2ZV9jMG1pbjsKKwkgIH0KKyAgICAgIH0KKyBoYXZlX2MwbWluOgorICBpZiAoYzBtYXggPiBjMG1pbikKKyAgICBmb3IgKGMwID0gYzBtYXg7IGMwID49IGMwbWluOyBjMC0tKQorICAgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisJZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKKwkgIGlmICgqaGlzdHArKyAhPSAwKSB7CisJICAgIGJveHAtPmMwbWF4ID0gYzBtYXggPSBjMDsKKwkgICAgZ290byBoYXZlX2MwbWF4OworCSAgfQorICAgICAgfQorIGhhdmVfYzBtYXg6CisgIGlmIChjMW1heCA+IGMxbWluKQorICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspCisgICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKKwlmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQorCSAgaWYgKCpoaXN0cCsrICE9IDApIHsKKwkgICAgYm94cC0+YzFtaW4gPSBjMW1pbiA9IGMxOworCSAgICBnb3RvIGhhdmVfYzFtaW47CisJICB9CisgICAgICB9CisgaGF2ZV9jMW1pbjoKKyAgaWYgKGMxbWF4ID4gYzFtaW4pCisgICAgZm9yIChjMSA9IGMxbWF4OyBjMSA+PSBjMW1pbjsgYzEtLSkKKyAgICAgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspIHsKKwloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOworCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisJICBpZiAoKmhpc3RwKysgIT0gMCkgeworCSAgICBib3hwLT5jMW1heCA9IGMxbWF4ID0gYzE7CisJICAgIGdvdG8gaGF2ZV9jMW1heDsKKwkgIH0KKyAgICAgIH0KKyBoYXZlX2MxbWF4OgorICBpZiAoYzJtYXggPiBjMm1pbikKKyAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQorICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxbWluXVtjMl07CisJZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKywgaGlzdHAgKz0gSElTVF9DMl9FTEVNUykKKwkgIGlmICgqaGlzdHAgIT0gMCkgeworCSAgICBib3hwLT5jMm1pbiA9IGMybWluID0gYzI7CisJICAgIGdvdG8gaGF2ZV9jMm1pbjsKKwkgIH0KKyAgICAgIH0KKyBoYXZlX2MybWluOgorICBpZiAoYzJtYXggPiBjMm1pbikKKyAgICBmb3IgKGMyID0gYzJtYXg7IGMyID49IGMybWluOyBjMi0tKQorICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxbWluXVtjMl07CisJZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKywgaGlzdHAgKz0gSElTVF9DMl9FTEVNUykKKwkgIGlmICgqaGlzdHAgIT0gMCkgeworCSAgICBib3hwLT5jMm1heCA9IGMybWF4ID0gYzI7CisJICAgIGdvdG8gaGF2ZV9jMm1heDsKKwkgIH0KKyAgICAgIH0KKyBoYXZlX2MybWF4OgorCisgIC8qIFVwZGF0ZSBib3ggdm9sdW1lLgorICAgKiBXZSB1c2UgMi1ub3JtIHJhdGhlciB0aGFuIHJlYWwgdm9sdW1lIGhlcmU7IHRoaXMgYmlhc2VzIHRoZSBtZXRob2QKKyAgICogYWdhaW5zdCBtYWtpbmcgbG9uZyBuYXJyb3cgYm94ZXMsIGFuZCBpdCBoYXMgdGhlIHNpZGUgYmVuZWZpdCB0aGF0CisgICAqIGEgYm94IGlzIHNwbGl0dGFibGUgaWZmIG5vcm0gPiAwLgorICAgKiBTaW5jZSB0aGUgZGlmZmVyZW5jZXMgYXJlIGV4cHJlc3NlZCBpbiBoaXN0b2dyYW0tY2VsbCB1bml0cywKKyAgICogd2UgaGF2ZSB0byBzaGlmdCBiYWNrIHRvIEpTQU1QTEUgdW5pdHMgdG8gZ2V0IGNvbnNpc3RlbnQgZGlzdGFuY2VzOworICAgKiBhZnRlciB3aGljaCwgd2Ugc2NhbGUgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBkaXN0YW5jZSBzY2FsZSBmYWN0b3JzLgorICAgKi8KKyAgZGlzdDAgPSAoKGMwbWF4IC0gYzBtaW4pIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFOworICBkaXN0MSA9ICgoYzFtYXggLSBjMW1pbikgPDwgQzFfU0hJRlQpICogQzFfU0NBTEU7CisgIGRpc3QyID0gKChjMm1heCAtIGMybWluKSA8PCBDMl9TSElGVCkgKiBDMl9TQ0FMRTsKKyAgYm94cC0+dm9sdW1lID0gZGlzdDAqZGlzdDAgKyBkaXN0MSpkaXN0MSArIGRpc3QyKmRpc3QyOworICAKKyAgLyogTm93IHNjYW4gcmVtYWluaW5nIHZvbHVtZSBvZiBib3ggYW5kIGNvbXB1dGUgcG9wdWxhdGlvbiAqLworICBjY291bnQgPSAwOworICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQorICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKKyAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisgICAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrLCBoaXN0cCsrKQorCWlmICgqaGlzdHAgIT0gMCkgeworCSAgY2NvdW50Kys7CisJfQorICAgIH0KKyAgYm94cC0+Y29sb3Jjb3VudCA9IGNjb3VudDsKK30KKworCitMT0NBTChpbnQpCittZWRpYW5fY3V0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib3hwdHIgYm94bGlzdCwgaW50IG51bWJveGVzLAorCSAgICBpbnQgZGVzaXJlZF9jb2xvcnMpCisvKiBSZXBlYXRlZGx5IHNlbGVjdCBhbmQgc3BsaXQgdGhlIGxhcmdlc3QgYm94IHVudGlsIHdlIGhhdmUgZW5vdWdoIGJveGVzICovCit7CisgIGludCBuLGxiOworICBpbnQgYzAsYzEsYzIsY21heDsKKyAgcmVnaXN0ZXIgYm94cHRyIGIxLGIyOworCisgIHdoaWxlIChudW1ib3hlcyA8IGRlc2lyZWRfY29sb3JzKSB7CisgICAgLyogU2VsZWN0IGJveCB0byBzcGxpdC4KKyAgICAgKiBDdXJyZW50IGFsZ29yaXRobTogYnkgcG9wdWxhdGlvbiBmb3IgZmlyc3QgaGFsZiwgdGhlbiBieSB2b2x1bWUuCisgICAgICovCisgICAgaWYgKG51bWJveGVzKjIgPD0gZGVzaXJlZF9jb2xvcnMpIHsKKyAgICAgIGIxID0gZmluZF9iaWdnZXN0X2NvbG9yX3BvcChib3hsaXN0LCBudW1ib3hlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGIxID0gZmluZF9iaWdnZXN0X3ZvbHVtZShib3hsaXN0LCBudW1ib3hlcyk7CisgICAgfQorICAgIGlmIChiMSA9PSBOVUxMKQkJLyogbm8gc3BsaXR0YWJsZSBib3hlcyBsZWZ0ISAqLworICAgICAgYnJlYWs7CisgICAgYjIgPSAmYm94bGlzdFtudW1ib3hlc107CS8qIHdoZXJlIG5ldyBib3ggd2lsbCBnbyAqLworICAgIC8qIENvcHkgdGhlIGNvbG9yIGJvdW5kcyB0byB0aGUgbmV3IGJveC4gKi8KKyAgICBiMi0+YzBtYXggPSBiMS0+YzBtYXg7IGIyLT5jMW1heCA9IGIxLT5jMW1heDsgYjItPmMybWF4ID0gYjEtPmMybWF4OworICAgIGIyLT5jMG1pbiA9IGIxLT5jMG1pbjsgYjItPmMxbWluID0gYjEtPmMxbWluOyBiMi0+YzJtaW4gPSBiMS0+YzJtaW47CisgICAgLyogQ2hvb3NlIHdoaWNoIGF4aXMgdG8gc3BsaXQgdGhlIGJveCBvbi4KKyAgICAgKiBDdXJyZW50IGFsZ29yaXRobTogbG9uZ2VzdCBzY2FsZWQgYXhpcy4KKyAgICAgKiBTZWUgbm90ZXMgaW4gdXBkYXRlX2JveCBhYm91dCBzY2FsaW5nIGRpc3RhbmNlcy4KKyAgICAgKi8KKyAgICBjMCA9ICgoYjEtPmMwbWF4IC0gYjEtPmMwbWluKSA8PCBDMF9TSElGVCkgKiBDMF9TQ0FMRTsKKyAgICBjMSA9ICgoYjEtPmMxbWF4IC0gYjEtPmMxbWluKSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRTsKKyAgICBjMiA9ICgoYjEtPmMybWF4IC0gYjEtPmMybWluKSA8PCBDMl9TSElGVCkgKiBDMl9TQ0FMRTsKKyAgICAvKiBXZSB3YW50IHRvIGJyZWFrIGFueSB0aWVzIGluIGZhdm9yIG9mIGdyZWVuLCB0aGVuIHJlZCwgYmx1ZSBsYXN0LgorICAgICAqIFRoaXMgY29kZSBkb2VzIHRoZSByaWdodCB0aGluZyBmb3IgUixHLEIgb3IgQixHLFIgY29sb3Igb3JkZXJzIG9ubHkuCisgICAgICovCisjaWYgUkdCX1JFRCA9PSAwCisgICAgY21heCA9IGMxOyBuID0gMTsKKyAgICBpZiAoYzAgPiBjbWF4KSB7IGNtYXggPSBjMDsgbiA9IDA7IH0KKyAgICBpZiAoYzIgPiBjbWF4KSB7IG4gPSAyOyB9CisjZWxzZQorICAgIGNtYXggPSBjMTsgbiA9IDE7CisgICAgaWYgKGMyID4gY21heCkgeyBjbWF4ID0gYzI7IG4gPSAyOyB9CisgICAgaWYgKGMwID4gY21heCkgeyBuID0gMDsgfQorI2VuZGlmCisgICAgLyogQ2hvb3NlIHNwbGl0IHBvaW50IGFsb25nIHNlbGVjdGVkIGF4aXMsIGFuZCB1cGRhdGUgYm94IGJvdW5kcy4KKyAgICAgKiBDdXJyZW50IGFsZ29yaXRobTogc3BsaXQgYXQgaGFsZndheSBwb2ludC4KKyAgICAgKiAoU2luY2UgdGhlIGJveCBoYXMgYmVlbiBzaHJ1bmsgdG8gbWluaW11bSB2b2x1bWUsCisgICAgICogYW55IHNwbGl0IHdpbGwgcHJvZHVjZSB0d28gbm9uZW1wdHkgc3ViYm94ZXMuKQorICAgICAqIE5vdGUgdGhhdCBsYiB2YWx1ZSBpcyBtYXggZm9yIGxvd2VyIGJveCwgc28gbXVzdCBiZSA8IG9sZCBtYXguCisgICAgICovCisgICAgc3dpdGNoIChuKSB7CisgICAgY2FzZSAwOgorICAgICAgbGIgPSAoYjEtPmMwbWF4ICsgYjEtPmMwbWluKSAvIDI7CisgICAgICBiMS0+YzBtYXggPSBsYjsKKyAgICAgIGIyLT5jMG1pbiA9IGxiKzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBsYiA9IChiMS0+YzFtYXggKyBiMS0+YzFtaW4pIC8gMjsKKyAgICAgIGIxLT5jMW1heCA9IGxiOworICAgICAgYjItPmMxbWluID0gbGIrMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGxiID0gKGIxLT5jMm1heCArIGIxLT5jMm1pbikgLyAyOworICAgICAgYjEtPmMybWF4ID0gbGI7CisgICAgICBiMi0+YzJtaW4gPSBsYisxOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIFVwZGF0ZSBzdGF0cyBmb3IgYm94ZXMgKi8KKyAgICB1cGRhdGVfYm94KGNpbmZvLCBiMSk7CisgICAgdXBkYXRlX2JveChjaW5mbywgYjIpOworICAgIG51bWJveGVzKys7CisgIH0KKyAgcmV0dXJuIG51bWJveGVzOworfQorCisKK0xPQ0FMKHZvaWQpCitjb21wdXRlX2NvbG9yIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib3hwdHIgYm94cCwgaW50IGljb2xvcikKKy8qIENvbXB1dGUgcmVwcmVzZW50YXRpdmUgY29sb3IgZm9yIGEgYm94LCBwdXQgaXQgaW4gY29sb3JtYXBbaWNvbG9yXSAqLworeworICAvKiBDdXJyZW50IGFsZ29yaXRobTogbWVhbiB3ZWlnaHRlZCBieSBwaXhlbHMgKG5vdCBjb2xvcnMpICovCisgIC8qIE5vdGUgaXQgaXMgaW1wb3J0YW50IHRvIGdldCB0aGUgcm91bmRpbmcgY29ycmVjdCEgKi8KKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICBoaXN0cHRyIGhpc3RwOworICBpbnQgYzAsYzEsYzI7CisgIGludCBjMG1pbixjMG1heCxjMW1pbixjMW1heCxjMm1pbixjMm1heDsKKyAgbG9uZyBjb3VudDsKKyAgbG9uZyB0b3RhbCA9IDA7CisgIGxvbmcgYzB0b3RhbCA9IDA7CisgIGxvbmcgYzF0b3RhbCA9IDA7CisgIGxvbmcgYzJ0b3RhbCA9IDA7CisgIAorICBjMG1pbiA9IGJveHAtPmMwbWluOyAgYzBtYXggPSBib3hwLT5jMG1heDsKKyAgYzFtaW4gPSBib3hwLT5jMW1pbjsgIGMxbWF4ID0gYm94cC0+YzFtYXg7CisgIGMybWluID0gYm94cC0+YzJtaW47ICBjMm1heCA9IGJveHAtPmMybWF4OworICAKKyAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykKKyAgICBmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrKSB7CisgICAgICBoaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOworICAgICAgZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykgeworCWlmICgoY291bnQgPSAqaGlzdHArKykgIT0gMCkgeworCSAgdG90YWwgKz0gY291bnQ7CisJICBjMHRvdGFsICs9ICgoYzAgPDwgQzBfU0hJRlQpICsgKCgxPDxDMF9TSElGVCk+PjEpKSAqIGNvdW50OworCSAgYzF0b3RhbCArPSAoKGMxIDw8IEMxX1NISUZUKSArICgoMTw8QzFfU0hJRlQpPj4xKSkgKiBjb3VudDsKKwkgIGMydG90YWwgKz0gKChjMiA8PCBDMl9TSElGVCkgKyAoKDE8PEMyX1NISUZUKT4+MSkpICogY291bnQ7CisJfQorICAgICAgfQorICAgIH0KKyAgCisgIGNpbmZvLT5jb2xvcm1hcFswXVtpY29sb3JdID0gKEpTQU1QTEUpICgoYzB0b3RhbCArICh0b3RhbD4+MSkpIC8gdG90YWwpOworICBjaW5mby0+Y29sb3JtYXBbMV1baWNvbG9yXSA9IChKU0FNUExFKSAoKGMxdG90YWwgKyAodG90YWw+PjEpKSAvIHRvdGFsKTsKKyAgY2luZm8tPmNvbG9ybWFwWzJdW2ljb2xvcl0gPSAoSlNBTVBMRSkgKChjMnRvdGFsICsgKHRvdGFsPj4xKSkgLyB0b3RhbCk7Cit9CisKKworTE9DQUwodm9pZCkKK3NlbGVjdF9jb2xvcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkX2NvbG9ycykKKy8qIE1hc3RlciByb3V0aW5lIGZvciBjb2xvciBzZWxlY3Rpb24gKi8KK3sKKyAgYm94cHRyIGJveGxpc3Q7CisgIGludCBudW1ib3hlczsKKyAgaW50IGk7CisKKyAgLyogQWxsb2NhdGUgd29ya3NwYWNlIGZvciBib3ggbGlzdCAqLworICBib3hsaXN0ID0gKGJveHB0cikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBkZXNpcmVkX2NvbG9ycyAqIFNJWkVPRihib3gpKTsKKyAgLyogSW5pdGlhbGl6ZSBvbmUgYm94IGNvbnRhaW5pbmcgd2hvbGUgc3BhY2UgKi8KKyAgbnVtYm94ZXMgPSAxOworICBib3hsaXN0WzBdLmMwbWluID0gMDsKKyAgYm94bGlzdFswXS5jMG1heCA9IE1BWEpTQU1QTEUgPj4gQzBfU0hJRlQ7CisgIGJveGxpc3RbMF0uYzFtaW4gPSAwOworICBib3hsaXN0WzBdLmMxbWF4ID0gTUFYSlNBTVBMRSA+PiBDMV9TSElGVDsKKyAgYm94bGlzdFswXS5jMm1pbiA9IDA7CisgIGJveGxpc3RbMF0uYzJtYXggPSBNQVhKU0FNUExFID4+IEMyX1NISUZUOworICAvKiBTaHJpbmsgaXQgdG8gYWN0dWFsbHktdXNlZCB2b2x1bWUgYW5kIHNldCBpdHMgc3RhdGlzdGljcyAqLworICB1cGRhdGVfYm94KGNpbmZvLCAmIGJveGxpc3RbMF0pOworICAvKiBQZXJmb3JtIG1lZGlhbi1jdXQgdG8gcHJvZHVjZSBmaW5hbCBib3ggbGlzdCAqLworICBudW1ib3hlcyA9IG1lZGlhbl9jdXQoY2luZm8sIGJveGxpc3QsIG51bWJveGVzLCBkZXNpcmVkX2NvbG9ycyk7CisgIC8qIENvbXB1dGUgdGhlIHJlcHJlc2VudGF0aXZlIGNvbG9yIGZvciBlYWNoIGJveCwgZmlsbCBjb2xvcm1hcCAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtYm94ZXM7IGkrKykKKyAgICBjb21wdXRlX2NvbG9yKGNpbmZvLCAmIGJveGxpc3RbaV0sIGkpOworICBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMgPSBudW1ib3hlczsKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfUVVBTlRfU0VMRUNURUQsIG51bWJveGVzKTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHRoZSB0aW1lLWNyaXRpY2FsIHRhc2sgb2YgbWFwcGluZyBpbnB1dAorICogY29sb3JzIHRvIHRoZSBuZWFyZXN0IGNvbG9yIGluIHRoZSBzZWxlY3RlZCBjb2xvcm1hcC4KKyAqCisgKiBXZSByZS11c2UgdGhlIGhpc3RvZ3JhbSBzcGFjZSBhcyBhbiAiaW52ZXJzZSBjb2xvciBtYXAiLCBlc3NlbnRpYWxseSBhCisgKiBjYWNoZSBmb3IgdGhlIHJlc3VsdHMgb2YgbmVhcmVzdC1jb2xvciBzZWFyY2hlcy4gIEFsbCBjb2xvcnMgd2l0aGluIGEKKyAqIGhpc3RvZ3JhbSBjZWxsIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBzYW1lIGNvbG9ybWFwIGVudHJ5LCBuYW1lbHkgdGhlIG9uZQorICogY2xvc2VzdCB0byB0aGUgY2VsbCdzIGNlbnRlci4gIFRoaXMgbWF5IG5vdCBiZSBxdWl0ZSB0aGUgY2xvc2VzdCBlbnRyeSB0bworICogdGhlIGFjdHVhbCBpbnB1dCBjb2xvciwgYnV0IGl0J3MgYWxtb3N0IGFzIGdvb2QuICBBIHplcm8gaW4gdGhlIGNhY2hlCisgKiBpbmRpY2F0ZXMgd2UgaGF2ZW4ndCBmb3VuZCB0aGUgbmVhcmVzdCBjb2xvciBmb3IgdGhhdCBjZWxsIHlldDsgdGhlIGFycmF5CisgKiBpcyBjbGVhcmVkIHRvIHplcm9lcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG1hcHBpbmcgcGFzcy4gIFdoZW4gd2UgZmluZCB0aGUKKyAqIG5lYXJlc3QgY29sb3IgZm9yIGEgY2VsbCwgaXRzIGNvbG9ybWFwIGluZGV4IHBsdXMgb25lIGlzIHJlY29yZGVkIGluIHRoZQorICogY2FjaGUgZm9yIGZ1dHVyZSB1c2UuICBUaGUgcGFzczIgc2Nhbm5pbmcgcm91dGluZXMgY2FsbCBmaWxsX2ludmVyc2VfY21hcAorICogd2hlbiB0aGV5IG5lZWQgdG8gdXNlIGFuIHVuZmlsbGVkIGVudHJ5IGluIHRoZSBjYWNoZS4KKyAqCisgKiBPdXIgbWV0aG9kIG9mIGVmZmljaWVudGx5IGZpbmRpbmcgbmVhcmVzdCBjb2xvcnMgaXMgYmFzZWQgb24gdGhlICJsb2NhbGx5CisgKiBzb3J0ZWQgc2VhcmNoIiBpZGVhIGRlc2NyaWJlZCBieSBIZWNrYmVydCBhbmQgb24gdGhlIGluY3JlbWVudGFsIGRpc3RhbmNlCisgKiBjYWxjdWxhdGlvbiBkZXNjcmliZWQgYnkgU3BlbmNlciBXLiBUaG9tYXMgaW4gY2hhcHRlciBJSUkuMSBvZiBHcmFwaGljcworICogR2VtcyBJSSAoSmFtZXMgQXJ2bywgZWQuICBBY2FkZW1pYyBQcmVzcywgMTk5MSkuICBUaG9tYXMgcG9pbnRzIG91dCB0aGF0CisgKiB0aGUgZGlzdGFuY2VzIGZyb20gYSBnaXZlbiBjb2xvcm1hcCBlbnRyeSB0byBlYWNoIGNlbGwgb2YgdGhlIGhpc3RvZ3JhbSBjYW4KKyAqIGJlIGNvbXB1dGVkIHF1aWNrbHkgdXNpbmcgYW4gaW5jcmVtZW50YWwgbWV0aG9kOiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorICogZGlzdGFuY2VzIHRvIGFkamFjZW50IGNlbGxzIHRoZW1zZWx2ZXMgZGlmZmVyIGJ5IGEgY29uc3RhbnQuICBUaGlzIGFsbG93cyBhCisgKiBmYWlybHkgZmFzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgImJydXRlIGZvcmNlIiBhcHByb2FjaCBvZiBjb21wdXRpbmcgdGhlCisgKiBkaXN0YW5jZSBmcm9tIGV2ZXJ5IGNvbG9ybWFwIGVudHJ5IHRvIGV2ZXJ5IGhpc3RvZ3JhbSBjZWxsLiAgVW5mb3J0dW5hdGVseSwKKyAqIGl0IG5lZWRzIGEgd29yayBhcnJheSB0byBob2xkIHRoZSBiZXN0LWRpc3RhbmNlLXNvLWZhciBmb3IgZWFjaCBoaXN0b2dyYW0KKyAqIGNlbGwgKGJlY2F1c2UgdGhlIGlubmVyIGxvb3AgaGFzIHRvIGJlIG92ZXIgY2VsbHMsIG5vdCBjb2xvcm1hcCBlbnRyaWVzKS4KKyAqIFRoZSB3b3JrIGFycmF5IGVsZW1lbnRzIGhhdmUgdG8gYmUgSU5UMzJzLCBzbyB0aGUgd29yayBhcnJheSB3b3VsZCBuZWVkCisgKiAyNTZLYiBhdCBvdXIgcmVjb21tZW5kZWQgcHJlY2lzaW9uLiAgVGhpcyBpcyBub3QgZmVhc2libGUgaW4gRE9TIG1hY2hpbmVzLgorICoKKyAqIFRvIGdldCBhcm91bmQgdGhlc2UgcHJvYmxlbXMsIHdlIGFwcGx5IFRob21hcycgbWV0aG9kIHRvIGNvbXB1dGUgdGhlCisgKiBuZWFyZXN0IGNvbG9ycyBmb3Igb25seSB0aGUgY2VsbHMgd2l0aGluIGEgc21hbGwgc3ViYm94IG9mIHRoZSBoaXN0b2dyYW0uCisgKiBUaGUgd29yayBhcnJheSBuZWVkIGJlIG9ubHkgYXMgYmlnIGFzIHRoZSBzdWJib3gsIHNvIHRoZSBtZW1vcnkgdXNhZ2UKKyAqIHByb2JsZW0gaXMgc29sdmVkLiAgRnVydGhlcm1vcmUsIHdlIG5lZWQgbm90IGZpbGwgc3ViYm94ZXMgdGhhdCBhcmUgbmV2ZXIKKyAqIHJlZmVyZW5jZWQgaW4gcGFzczI7IG1hbnkgaW1hZ2VzIHVzZSBvbmx5IHBhcnQgb2YgdGhlIGNvbG9yIGdhbXV0LCBzbyBhCisgKiBmYWlyIGFtb3VudCBvZiB3b3JrIGlzIHNhdmVkLiAgQW4gYWRkaXRpb25hbCBhZHZhbnRhZ2Ugb2YgdGhpcworICogYXBwcm9hY2ggaXMgdGhhdCB3ZSBjYW4gYXBwbHkgSGVja2JlcnQncyBsb2NhbGl0eSBjcml0ZXJpb24gdG8gcXVpY2tseQorICogZWxpbWluYXRlIGNvbG9ybWFwIGVudHJpZXMgdGhhdCBhcmUgZmFyIGF3YXkgZnJvbSB0aGUgc3ViYm94OyB0eXBpY2FsbHkKKyAqIHRocmVlLWZvdXJ0aHMgb2YgdGhlIGNvbG9ybWFwIGVudHJpZXMgYXJlIHJlamVjdGVkIGJ5IEhlY2tiZXJ0J3MgY3JpdGVyaW9uLAorICogYW5kIHdlIG5lZWQgbm90IGNvbXB1dGUgdGhlaXIgZGlzdGFuY2VzIHRvIGluZGl2aWR1YWwgY2VsbHMgaW4gdGhlIHN1YmJveC4KKyAqIFRoZSBzcGVlZCBvZiB0aGlzIGFwcHJvYWNoIGlzIGhlYXZpbHkgaW5mbHVlbmNlZCBieSB0aGUgc3ViYm94IHNpemU6IHRvbworICogc21hbGwgbWVhbnMgdG9vIG11Y2ggb3ZlcmhlYWQsIHRvbyBiaWcgbG9zZXMgYmVjYXVzZSBIZWNrYmVydCdzIGNyaXRlcmlvbgorICogY2FuJ3QgZWxpbWluYXRlIGFzIG1hbnkgY29sb3JtYXAgZW50cmllcy4gIEVtcGlyaWNhbGx5IHRoZSBiZXN0IHN1YmJveAorICogc2l6ZSBzZWVtcyB0byBiZSBhYm91dCAxLzUxMnRoIG9mIHRoZSBoaXN0b2dyYW0gKDEvOHRoIGluIGVhY2ggZGlyZWN0aW9uKS4KKyAqCisgKiBUaG9tYXMnIGFydGljbGUgYWxzbyBkZXNjcmliZXMgYSByZWZpbmVkIG1ldGhvZCB3aGljaCBpcyBhc3ltcHRvdGljYWxseQorICogZmFzdGVyIHRoYW4gdGhlIGJydXRlLWZvcmNlIG1ldGhvZCwgYnV0IGl0IGlzIGFsc28gZmFyIG1vcmUgY29tcGxleCBhbmQKKyAqIGNhbm5vdCBlZmZpY2llbnRseSBiZSBhcHBsaWVkIHRvIHNtYWxsIHN1YmJveGVzLiAgSXQgaXMgdGhlcmVmb3JlIG5vdAorICogdXNlZnVsIGZvciBwcm9ncmFtcyBpbnRlbmRlZCB0byBiZSBwb3J0YWJsZSB0byBET1MgbWFjaGluZXMuICBPbiBtYWNoaW5lcworICogd2l0aCBwbGVudHkgb2YgbWVtb3J5LCBmaWxsaW5nIHRoZSB3aG9sZSBoaXN0b2dyYW0gaW4gb25lIHNob3Qgd2l0aCBUaG9tYXMnCisgKiByZWZpbmVkIG1ldGhvZCBtaWdodCBiZSBmYXN0ZXIgdGhhbiB0aGUgcHJlc2VudCBjb2RlIC0tLSBidXQgdGhlbiBhZ2FpbiwKKyAqIGl0IG1pZ2h0IG5vdCBiZSBhbnkgZmFzdGVyLCBhbmQgaXQncyBjZXJ0YWlubHkgbW9yZSBjb21wbGljYXRlZC4KKyAqLworCisKKy8qIGxvZzIoaGlzdG9ncmFtIGNlbGxzIGluIHVwZGF0ZSBib3gpIGZvciBlYWNoIGF4aXM7IHRoaXMgY2FuIGJlIGFkanVzdGVkICovCisjZGVmaW5lIEJPWF9DMF9MT0cgIChISVNUX0MwX0JJVFMtMykKKyNkZWZpbmUgQk9YX0MxX0xPRyAgKEhJU1RfQzFfQklUUy0zKQorI2RlZmluZSBCT1hfQzJfTE9HICAoSElTVF9DMl9CSVRTLTMpCisKKyNkZWZpbmUgQk9YX0MwX0VMRU1TICAoMTw8Qk9YX0MwX0xPRykgLyogIyBvZiBoaXN0IGNlbGxzIGluIHVwZGF0ZSBib3ggKi8KKyNkZWZpbmUgQk9YX0MxX0VMRU1TICAoMTw8Qk9YX0MxX0xPRykKKyNkZWZpbmUgQk9YX0MyX0VMRU1TICAoMTw8Qk9YX0MyX0xPRykKKworI2RlZmluZSBCT1hfQzBfU0hJRlQgIChDMF9TSElGVCArIEJPWF9DMF9MT0cpCisjZGVmaW5lIEJPWF9DMV9TSElGVCAgKEMxX1NISUZUICsgQk9YX0MxX0xPRykKKyNkZWZpbmUgQk9YX0MyX1NISUZUICAoQzJfU0hJRlQgKyBCT1hfQzJfTE9HKQorCisKKy8qCisgKiBUaGUgbmV4dCB0aHJlZSByb3V0aW5lcyBpbXBsZW1lbnQgaW52ZXJzZSBjb2xvcm1hcCBmaWxsaW5nLiAgVGhleSBjb3VsZAorICogYWxsIGJlIGZvbGRlZCBpbnRvIG9uZSBiaWcgcm91dGluZSwgYnV0IHNwbGl0dGluZyB0aGVtIHVwIHRoaXMgd2F5IHNhdmVzCisgKiBzb21lIHN0YWNrIHNwYWNlICh0aGUgbWluZGlzdFtdIGFuZCBiZXN0ZGlzdFtdIGFycmF5cyBuZWVkIG5vdCBjb2V4aXN0KQorICogYW5kIG1heSBhbGxvdyBzb21lIGNvbXBpbGVycyB0byBwcm9kdWNlIGJldHRlciBjb2RlIGJ5IHJlZ2lzdGVyaXppbmcgbW9yZQorICogaW5uZXItbG9vcCB2YXJpYWJsZXMuCisgKi8KKworTE9DQUwoaW50KQorZmluZF9uZWFyYnlfY29sb3JzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWluYzAsIGludCBtaW5jMSwgaW50IG1pbmMyLAorCQkgICAgSlNBTVBMRSBjb2xvcmxpc3RbXSkKKy8qIExvY2F0ZSB0aGUgY29sb3JtYXAgZW50cmllcyBjbG9zZSBlbm91Z2ggdG8gYW4gdXBkYXRlIGJveCB0byBiZSBjYW5kaWRhdGVzCisgKiBmb3IgdGhlIG5lYXJlc3QgZW50cnkgdG8gc29tZSBjZWxsKHMpIGluIHRoZSB1cGRhdGUgYm94LiAgVGhlIHVwZGF0ZSBib3gKKyAqIGlzIHNwZWNpZmllZCBieSB0aGUgY2VudGVyIGNvb3JkaW5hdGVzIG9mIGl0cyBmaXJzdCBjZWxsLiAgVGhlIG51bWJlciBvZgorICogY2FuZGlkYXRlIGNvbG9ybWFwIGVudHJpZXMgaXMgcmV0dXJuZWQsIGFuZCB0aGVpciBjb2xvcm1hcCBpbmRleGVzIGFyZQorICogcGxhY2VkIGluIGNvbG9ybGlzdFtdLgorICogVGhpcyByb3V0aW5lIHVzZXMgSGVja2JlcnQncyAibG9jYWxseSBzb3J0ZWQgc2VhcmNoIiBjcml0ZXJpb24gdG8gc2VsZWN0CisgKiB0aGUgY29sb3JzIHRoYXQgbmVlZCBmdXJ0aGVyIGNvbnNpZGVyYXRpb24uCisgKi8KK3sKKyAgaW50IG51bWNvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKKyAgaW50IG1heGMwLCBtYXhjMSwgbWF4YzI7CisgIGludCBjZW50ZXJjMCwgY2VudGVyYzEsIGNlbnRlcmMyOworICBpbnQgaSwgeCwgbmNvbG9yczsKKyAgSU5UMzIgbWlubWF4ZGlzdCwgbWluX2Rpc3QsIG1heF9kaXN0LCB0ZGlzdDsKKyAgSU5UMzIgbWluZGlzdFtNQVhOVU1DT0xPUlNdOwkvKiBtaW4gZGlzdGFuY2UgdG8gY29sb3JtYXAgZW50cnkgaSAqLworCisgIC8qIENvbXB1dGUgdHJ1ZSBjb29yZGluYXRlcyBvZiB1cGRhdGUgYm94J3MgdXBwZXIgY29ybmVyIGFuZCBjZW50ZXIuCisgICAqIEFjdHVhbGx5IHdlIGNvbXB1dGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHVwcGVyLWNvcm5lcgorICAgKiBoaXN0b2dyYW0gY2VsbCwgd2hpY2ggYXJlIHRoZSB1cHBlciBib3VuZHMgb2YgdGhlIHZvbHVtZSB3ZSBjYXJlIGFib3V0LgorICAgKiBOb3RlIHRoYXQgc2luY2UgIj4+IiByb3VuZHMgZG93biwgdGhlICJjZW50ZXIiIHZhbHVlcyBtYXkgYmUgY2xvc2VyIHRvCisgICAqIG1pbiB0aGFuIHRvIG1heDsgaGVuY2UgY29tcGFyaXNvbnMgdG8gdGhlbSBtdXN0IGJlICI8PSIsIG5vdCAiPCIuCisgICAqLworICBtYXhjMCA9IG1pbmMwICsgKCgxIDw8IEJPWF9DMF9TSElGVCkgLSAoMSA8PCBDMF9TSElGVCkpOworICBjZW50ZXJjMCA9IChtaW5jMCArIG1heGMwKSA+PiAxOworICBtYXhjMSA9IG1pbmMxICsgKCgxIDw8IEJPWF9DMV9TSElGVCkgLSAoMSA8PCBDMV9TSElGVCkpOworICBjZW50ZXJjMSA9IChtaW5jMSArIG1heGMxKSA+PiAxOworICBtYXhjMiA9IG1pbmMyICsgKCgxIDw8IEJPWF9DMl9TSElGVCkgLSAoMSA8PCBDMl9TSElGVCkpOworICBjZW50ZXJjMiA9IChtaW5jMiArIG1heGMyKSA+PiAxOworCisgIC8qIEZvciBlYWNoIGNvbG9yIGluIGNvbG9ybWFwLCBmaW5kOgorICAgKiAgMS4gaXRzIG1pbmltdW0gc3F1YXJlZC1kaXN0YW5jZSB0byBhbnkgcG9pbnQgaW4gdGhlIHVwZGF0ZSBib3gKKyAgICogICAgICh6ZXJvIGlmIGNvbG9yIGlzIHdpdGhpbiB1cGRhdGUgYm94KTsKKyAgICogIDIuIGl0cyBtYXhpbXVtIHNxdWFyZWQtZGlzdGFuY2UgdG8gYW55IHBvaW50IGluIHRoZSB1cGRhdGUgYm94LgorICAgKiBCb3RoIG9mIHRoZXNlIGNhbiBiZSBmb3VuZCBieSBjb25zaWRlcmluZyBvbmx5IHRoZSBjb3JuZXJzIG9mIHRoZSBib3guCisgICAqIFdlIHNhdmUgdGhlIG1pbmltdW0gZGlzdGFuY2UgZm9yIGVhY2ggY29sb3IgaW4gbWluZGlzdFtdOworICAgKiBvbmx5IHRoZSBzbWFsbGVzdCBtYXhpbXVtIGRpc3RhbmNlIGlzIG9mIGludGVyZXN0LgorICAgKi8KKyAgbWlubWF4ZGlzdCA9IDB4N0ZGRkZGRkZMOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgeworICAgIC8qIFdlIGNvbXB1dGUgdGhlIHNxdWFyZWQtYzAtZGlzdGFuY2UgdGVybSwgdGhlbiBhZGQgaW4gdGhlIG90aGVyIHR3by4gKi8KKyAgICB4ID0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMF1baV0pOworICAgIGlmICh4IDwgbWluYzApIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtaW5jMCkgKiBDMF9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzApICogQzBfU0NBTEU7CisgICAgICBtYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgIH0gZWxzZSBpZiAoeCA+IG1heGMwKSB7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzApICogQzBfU0NBTEU7CisgICAgICBtaW5fZGlzdCA9IHRkaXN0KnRkaXN0OworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMwKSAqIEMwX1NDQUxFOworICAgICAgbWF4X2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCisgICAgICBtaW5fZGlzdCA9IDA7CisgICAgICBpZiAoeCA8PSBjZW50ZXJjMCkgeworCXRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKKwltYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgICAgfSBlbHNlIHsKKwl0ZGlzdCA9ICh4IC0gbWluYzApICogQzBfU0NBTEU7CisJbWF4X2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB4ID0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMV1baV0pOworICAgIGlmICh4IDwgbWluYzEpIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtaW5jMSkgKiBDMV9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgdGRpc3QgPSAoeCAtIG1heGMxKSAqIEMxX1NDQUxFOworICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgfSBlbHNlIGlmICh4ID4gbWF4YzEpIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMSkgKiBDMV9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOworICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHdpdGhpbiBjZWxsIHJhbmdlIHNvIG5vIGNvbnRyaWJ1dGlvbiB0byBtaW5fZGlzdCAqLworICAgICAgaWYgKHggPD0gY2VudGVyYzEpIHsKKwl0ZGlzdCA9ICh4IC0gbWF4YzEpICogQzFfU0NBTEU7CisJbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB9IGVsc2UgeworCXRkaXN0ID0gKHggLSBtaW5jMSkgKiBDMV9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB4ID0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMl1baV0pOworICAgIGlmICh4IDwgbWluYzIpIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtaW5jMikgKiBDMl9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgdGRpc3QgPSAoeCAtIG1heGMyKSAqIEMyX1NDQUxFOworICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgfSBlbHNlIGlmICh4ID4gbWF4YzIpIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMikgKiBDMl9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOworICAgICAgbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHdpdGhpbiBjZWxsIHJhbmdlIHNvIG5vIGNvbnRyaWJ1dGlvbiB0byBtaW5fZGlzdCAqLworICAgICAgaWYgKHggPD0gY2VudGVyYzIpIHsKKwl0ZGlzdCA9ICh4IC0gbWF4YzIpICogQzJfU0NBTEU7CisJbWF4X2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB9IGVsc2UgeworCXRkaXN0ID0gKHggLSBtaW5jMikgKiBDMl9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtaW5kaXN0W2ldID0gbWluX2Rpc3Q7CS8qIHNhdmUgYXdheSB0aGUgcmVzdWx0cyAqLworICAgIGlmIChtYXhfZGlzdCA8IG1pbm1heGRpc3QpCisgICAgICBtaW5tYXhkaXN0ID0gbWF4X2Rpc3Q7CisgIH0KKworICAvKiBOb3cgd2Uga25vdyB0aGF0IG5vIGNlbGwgaW4gdGhlIHVwZGF0ZSBib3ggaXMgbW9yZSB0aGFuIG1pbm1heGRpc3QKKyAgICogYXdheSBmcm9tIHNvbWUgY29sb3JtYXAgZW50cnkuICBUaGVyZWZvcmUsIG9ubHkgY29sb3JzIHRoYXQgYXJlCisgICAqIHdpdGhpbiBtaW5tYXhkaXN0IG9mIHNvbWUgcGFydCBvZiB0aGUgYm94IG5lZWQgYmUgY29uc2lkZXJlZC4KKyAgICovCisgIG5jb2xvcnMgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbnVtY29sb3JzOyBpKyspIHsKKyAgICBpZiAobWluZGlzdFtpXSA8PSBtaW5tYXhkaXN0KQorICAgICAgY29sb3JsaXN0W25jb2xvcnMrK10gPSAoSlNBTVBMRSkgaTsKKyAgfQorICByZXR1cm4gbmNvbG9yczsKK30KKworCitMT0NBTCh2b2lkKQorZmluZF9iZXN0X2NvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1pbmMwLCBpbnQgbWluYzEsIGludCBtaW5jMiwKKwkJICBpbnQgbnVtY29sb3JzLCBKU0FNUExFIGNvbG9ybGlzdFtdLCBKU0FNUExFIGJlc3Rjb2xvcltdKQorLyogRmluZCB0aGUgY2xvc2VzdCBjb2xvcm1hcCBlbnRyeSBmb3IgZWFjaCBjZWxsIGluIHRoZSB1cGRhdGUgYm94LAorICogZ2l2ZW4gdGhlIGxpc3Qgb2YgY2FuZGlkYXRlIGNvbG9ycyBwcmVwYXJlZCBieSBmaW5kX25lYXJieV9jb2xvcnMuCisgKiBSZXR1cm4gdGhlIGluZGV4ZXMgb2YgdGhlIGNsb3Nlc3QgZW50cmllcyBpbiB0aGUgYmVzdGNvbG9yW10gYXJyYXkuCisgKiBUaGlzIHJvdXRpbmUgdXNlcyBUaG9tYXMnIGluY3JlbWVudGFsIGRpc3RhbmNlIGNhbGN1bGF0aW9uIG1ldGhvZCB0bworICogZmluZCB0aGUgZGlzdGFuY2UgZnJvbSBhIGNvbG9ybWFwIGVudHJ5IHRvIHN1Y2Nlc3NpdmUgY2VsbHMgaW4gdGhlIGJveC4KKyAqLworeworICBpbnQgaWMwLCBpYzEsIGljMjsKKyAgaW50IGksIGljb2xvcjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBicHRyOwkvKiBwb2ludGVyIGludG8gYmVzdGRpc3RbXSBhcnJheSAqLworICBKU0FNUExFICogY3B0cjsJCS8qIHBvaW50ZXIgaW50byBiZXN0Y29sb3JbXSBhcnJheSAqLworICBJTlQzMiBkaXN0MCwgZGlzdDE7CQkvKiBpbml0aWFsIGRpc3RhbmNlIHZhbHVlcyAqLworICByZWdpc3RlciBJTlQzMiBkaXN0MjsJCS8qIGN1cnJlbnQgZGlzdGFuY2UgaW4gaW5uZXIgbG9vcCAqLworICBJTlQzMiB4eDAsIHh4MTsJCS8qIGRpc3RhbmNlIGluY3JlbWVudHMgKi8KKyAgcmVnaXN0ZXIgSU5UMzIgeHgyOworICBJTlQzMiBpbmMwLCBpbmMxLCBpbmMyOwkvKiBpbml0aWFsIHZhbHVlcyBmb3IgaW5jcmVtZW50cyAqLworICAvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBkaXN0YW5jZSB0byB0aGUgbmVhcmVzdC1zby1mYXIgY29sb3IgZm9yIGVhY2ggY2VsbCAqLworICBJTlQzMiBiZXN0ZGlzdFtCT1hfQzBfRUxFTVMgKiBCT1hfQzFfRUxFTVMgKiBCT1hfQzJfRUxFTVNdOworCisgIC8qIEluaXRpYWxpemUgYmVzdC1kaXN0YW5jZSBmb3IgZWFjaCBjZWxsIG9mIHRoZSB1cGRhdGUgYm94ICovCisgIGJwdHIgPSBiZXN0ZGlzdDsKKyAgZm9yIChpID0gQk9YX0MwX0VMRU1TKkJPWF9DMV9FTEVNUypCT1hfQzJfRUxFTVMtMTsgaSA+PSAwOyBpLS0pCisgICAgKmJwdHIrKyA9IDB4N0ZGRkZGRkZMOworICAKKyAgLyogRm9yIGVhY2ggY29sb3Igc2VsZWN0ZWQgYnkgZmluZF9uZWFyYnlfY29sb3JzLAorICAgKiBjb21wdXRlIGl0cyBkaXN0YW5jZSB0byB0aGUgY2VudGVyIG9mIGVhY2ggY2VsbCBpbiB0aGUgYm94LgorICAgKiBJZiB0aGF0J3MgbGVzcyB0aGFuIGJlc3Qtc28tZmFyLCB1cGRhdGUgYmVzdCBkaXN0YW5jZSBhbmQgY29sb3IgbnVtYmVyLgorICAgKi8KKyAgCisgIC8qIE5vbWluYWwgc3RlcHMgYmV0d2VlbiBjZWxsIGNlbnRlcnMgKCJ4IiBpbiBUaG9tYXMgYXJ0aWNsZSkgKi8KKyNkZWZpbmUgU1RFUF9DMCAgKCgxIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFKQorI2RlZmluZSBTVEVQX0MxICAoKDEgPDwgQzFfU0hJRlQpICogQzFfU0NBTEUpCisjZGVmaW5lIFNURVBfQzIgICgoMSA8PCBDMl9TSElGVCkgKiBDMl9TQ0FMRSkKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgeworICAgIGljb2xvciA9IEdFVEpTQU1QTEUoY29sb3JsaXN0W2ldKTsKKyAgICAvKiBDb21wdXRlIChzcXVhcmUgb2YpIGRpc3RhbmNlIGZyb20gbWluYzAvYzEvYzIgdG8gdGhpcyBjb2xvciAqLworICAgIGluYzAgPSAobWluYzAgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFswXVtpY29sb3JdKSkgKiBDMF9TQ0FMRTsKKyAgICBkaXN0MCA9IGluYzAqaW5jMDsKKyAgICBpbmMxID0gKG1pbmMxIC0gR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMV1baWNvbG9yXSkpICogQzFfU0NBTEU7CisgICAgZGlzdDAgKz0gaW5jMSppbmMxOworICAgIGluYzIgPSAobWluYzIgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpY29sb3JdKSkgKiBDMl9TQ0FMRTsKKyAgICBkaXN0MCArPSBpbmMyKmluYzI7CisgICAgLyogRm9ybSB0aGUgaW5pdGlhbCBkaWZmZXJlbmNlIGluY3JlbWVudHMgKi8KKyAgICBpbmMwID0gaW5jMCAqICgyICogU1RFUF9DMCkgKyBTVEVQX0MwICogU1RFUF9DMDsKKyAgICBpbmMxID0gaW5jMSAqICgyICogU1RFUF9DMSkgKyBTVEVQX0MxICogU1RFUF9DMTsKKyAgICBpbmMyID0gaW5jMiAqICgyICogU1RFUF9DMikgKyBTVEVQX0MyICogU1RFUF9DMjsKKyAgICAvKiBOb3cgbG9vcCBvdmVyIGFsbCBjZWxscyBpbiBib3gsIHVwZGF0aW5nIGRpc3RhbmNlIHBlciBUaG9tYXMgbWV0aG9kICovCisgICAgYnB0ciA9IGJlc3RkaXN0OworICAgIGNwdHIgPSBiZXN0Y29sb3I7CisgICAgeHgwID0gaW5jMDsKKyAgICBmb3IgKGljMCA9IEJPWF9DMF9FTEVNUy0xOyBpYzAgPj0gMDsgaWMwLS0pIHsKKyAgICAgIGRpc3QxID0gZGlzdDA7CisgICAgICB4eDEgPSBpbmMxOworICAgICAgZm9yIChpYzEgPSBCT1hfQzFfRUxFTVMtMTsgaWMxID49IDA7IGljMS0tKSB7CisJZGlzdDIgPSBkaXN0MTsKKwl4eDIgPSBpbmMyOworCWZvciAoaWMyID0gQk9YX0MyX0VMRU1TLTE7IGljMiA+PSAwOyBpYzItLSkgeworCSAgaWYgKGRpc3QyIDwgKmJwdHIpIHsKKwkgICAgKmJwdHIgPSBkaXN0MjsKKwkgICAgKmNwdHIgPSAoSlNBTVBMRSkgaWNvbG9yOworCSAgfQorCSAgZGlzdDIgKz0geHgyOworCSAgeHgyICs9IDIgKiBTVEVQX0MyICogU1RFUF9DMjsKKwkgIGJwdHIrKzsKKwkgIGNwdHIrKzsKKwl9CisJZGlzdDEgKz0geHgxOworCXh4MSArPSAyICogU1RFUF9DMSAqIFNURVBfQzE7CisgICAgICB9CisgICAgICBkaXN0MCArPSB4eDA7CisgICAgICB4eDAgKz0gMiAqIFNURVBfQzAgKiBTVEVQX0MwOworICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitmaWxsX2ludmVyc2VfY21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGMwLCBpbnQgYzEsIGludCBjMikKKy8qIEZpbGwgdGhlIGludmVyc2UtY29sb3JtYXAgZW50cmllcyBpbiB0aGUgdXBkYXRlIGJveCB0aGF0IGNvbnRhaW5zICovCisvKiBoaXN0b2dyYW0gY2VsbCBjMC9jMS9jMi4gIChPbmx5IHRoYXQgb25lIGNlbGwgTVVTVCBiZSBmaWxsZWQsIGJ1dCAqLworLyogd2UgY2FuIGZpbGwgYXMgbWFueSBvdGhlcnMgYXMgd2Ugd2lzaC4pICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaW50IG1pbmMwLCBtaW5jMSwgbWluYzI7CS8qIGxvd2VyIGxlZnQgY29ybmVyIG9mIHVwZGF0ZSBib3ggKi8KKyAgaW50IGljMCwgaWMxLCBpYzI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKiBjcHRyOwkvKiBwb2ludGVyIGludG8gYmVzdGNvbG9yW10gYXJyYXkgKi8KKyAgcmVnaXN0ZXIgaGlzdHB0ciBjYWNoZXA7CS8qIHBvaW50ZXIgaW50byBtYWluIGNhY2hlIGFycmF5ICovCisgIC8qIFRoaXMgYXJyYXkgbGlzdHMgdGhlIGNhbmRpZGF0ZSBjb2xvcm1hcCBpbmRleGVzLiAqLworICBKU0FNUExFIGNvbG9ybGlzdFtNQVhOVU1DT0xPUlNdOworICBpbnQgbnVtY29sb3JzOwkJLyogbnVtYmVyIG9mIGNhbmRpZGF0ZSBjb2xvcnMgKi8KKyAgLyogVGhpcyBhcnJheSBob2xkcyB0aGUgYWN0dWFsbHkgY2xvc2VzdCBjb2xvcm1hcCBpbmRleCBmb3IgZWFjaCBjZWxsLiAqLworICBKU0FNUExFIGJlc3Rjb2xvcltCT1hfQzBfRUxFTVMgKiBCT1hfQzFfRUxFTVMgKiBCT1hfQzJfRUxFTVNdOworCisgIC8qIENvbnZlcnQgY2VsbCBjb29yZGluYXRlcyB0byB1cGRhdGUgYm94IElEICovCisgIGMwID4+PSBCT1hfQzBfTE9HOworICBjMSA+Pj0gQk9YX0MxX0xPRzsKKyAgYzIgPj49IEJPWF9DMl9MT0c7CisKKyAgLyogQ29tcHV0ZSB0cnVlIGNvb3JkaW5hdGVzIG9mIHVwZGF0ZSBib3gncyBvcmlnaW4gY29ybmVyLgorICAgKiBBY3R1YWxseSB3ZSBjb21wdXRlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSBjb3JuZXIKKyAgICogaGlzdG9ncmFtIGNlbGwsIHdoaWNoIGFyZSB0aGUgbG93ZXIgYm91bmRzIG9mIHRoZSB2b2x1bWUgd2UgY2FyZSBhYm91dC4KKyAgICovCisgIG1pbmMwID0gKGMwIDw8IEJPWF9DMF9TSElGVCkgKyAoKDEgPDwgQzBfU0hJRlQpID4+IDEpOworICBtaW5jMSA9IChjMSA8PCBCT1hfQzFfU0hJRlQpICsgKCgxIDw8IEMxX1NISUZUKSA+PiAxKTsKKyAgbWluYzIgPSAoYzIgPDwgQk9YX0MyX1NISUZUKSArICgoMSA8PCBDMl9TSElGVCkgPj4gMSk7CisgIAorICAvKiBEZXRlcm1pbmUgd2hpY2ggY29sb3JtYXAgZW50cmllcyBhcmUgY2xvc2UgZW5vdWdoIHRvIGJlIGNhbmRpZGF0ZXMKKyAgICogZm9yIHRoZSBuZWFyZXN0IGVudHJ5IHRvIHNvbWUgY2VsbCBpbiB0aGUgdXBkYXRlIGJveC4KKyAgICovCisgIG51bWNvbG9ycyA9IGZpbmRfbmVhcmJ5X2NvbG9ycyhjaW5mbywgbWluYzAsIG1pbmMxLCBtaW5jMiwgY29sb3JsaXN0KTsKKworICAvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbGx5IG5lYXJlc3QgY29sb3JzLiAqLworICBmaW5kX2Jlc3RfY29sb3JzKGNpbmZvLCBtaW5jMCwgbWluYzEsIG1pbmMyLCBudW1jb2xvcnMsIGNvbG9ybGlzdCwKKwkJICAgYmVzdGNvbG9yKTsKKworICAvKiBTYXZlIHRoZSBiZXN0IGNvbG9yIG51bWJlcnMgKHBsdXMgMSkgaW4gdGhlIG1haW4gY2FjaGUgYXJyYXkgKi8KKyAgYzAgPDw9IEJPWF9DMF9MT0c7CQkvKiBjb252ZXJ0IElEIGJhY2sgdG8gYmFzZSBjZWxsIGluZGV4ZXMgKi8KKyAgYzEgPDw9IEJPWF9DMV9MT0c7CisgIGMyIDw8PSBCT1hfQzJfTE9HOworICBjcHRyID0gYmVzdGNvbG9yOworICBmb3IgKGljMCA9IDA7IGljMCA8IEJPWF9DMF9FTEVNUzsgaWMwKyspIHsKKyAgICBmb3IgKGljMSA9IDA7IGljMSA8IEJPWF9DMV9FTEVNUzsgaWMxKyspIHsKKyAgICAgIGNhY2hlcCA9ICYgaGlzdG9ncmFtW2MwK2ljMF1bYzEraWMxXVtjMl07CisgICAgICBmb3IgKGljMiA9IDA7IGljMiA8IEJPWF9DMl9FTEVNUzsgaWMyKyspIHsKKwkqY2FjaGVwKysgPSAoaGlzdGNlbGwpIChHRVRKU0FNUExFKCpjcHRyKyspICsgMSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIE1hcCBzb21lIHJvd3Mgb2YgcGl4ZWxzIHRvIHRoZSBvdXRwdXQgY29sb3JtYXBwZWQgcmVwcmVzZW50YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwYXNzMl9ub19kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBUaGlzIHZlcnNpb24gcGVyZm9ybXMgbm8gZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaGlzdHB0ciBjYWNoZXA7CisgIHJlZ2lzdGVyIGludCBjMCwgYzEsIGMyOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBpbnB0ciA9IGlucHV0X2J1Zltyb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgLyogZ2V0IHBpeGVsIHZhbHVlIGFuZCBpbmRleCBpbnRvIHRoZSBjYWNoZSAqLworICAgICAgYzAgPSBHRVRKU0FNUExFKCppbnB0cisrKSA+PiBDMF9TSElGVDsKKyAgICAgIGMxID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgPj4gQzFfU0hJRlQ7CisgICAgICBjMiA9IEdFVEpTQU1QTEUoKmlucHRyKyspID4+IEMyX1NISUZUOworICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMl07CisgICAgICAvKiBJZiB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgY29sb3IgYmVmb3JlLCBmaW5kIG5lYXJlc3QgY29sb3JtYXAgZW50cnkgKi8KKyAgICAgIC8qIGFuZCB1cGRhdGUgdGhlIGNhY2hlICovCisgICAgICBpZiAoKmNhY2hlcCA9PSAwKQorCWZpbGxfaW52ZXJzZV9jbWFwKGNpbmZvLCBjMCxjMSxjMik7CisgICAgICAvKiBOb3cgZW1pdCB0aGUgY29sb3JtYXAgaW5kZXggZm9yIHRoaXMgY2VsbCAqLworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgqY2FjaGVwIC0gMSk7CisgICAgfQorICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitwYXNzMl9mc19kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBUaGlzIHZlcnNpb24gcGVyZm9ybXMgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07CisgIHJlZ2lzdGVyIExPQ0ZTRVJST1IgY3VyMCwgY3VyMSwgY3VyMjsJLyogY3VycmVudCBlcnJvciBvciBwaXhlbCB2YWx1ZSAqLworICBMT0NGU0VSUk9SIGJlbG93ZXJyMCwgYmVsb3dlcnIxLCBiZWxvd2VycjI7IC8qIGVycm9yIGZvciBwaXhlbCBiZWxvdyBjdXIgKi8KKyAgTE9DRlNFUlJPUiBicHJldmVycjAsIGJwcmV2ZXJyMSwgYnByZXZlcnIyOyAvKiBlcnJvciBmb3IgYmVsb3cvcHJldiBjb2wgKi8KKyAgcmVnaXN0ZXIgRlNFUlJQVFIgZXJyb3JwdHI7CS8qID0+IGZzZXJyb3JzW10gYXQgY29sdW1uIGJlZm9yZSBjdXJyZW50ICovCisgIEpTQU1QUk9XIGlucHRyOwkJLyogPT4gY3VycmVudCBpbnB1dCBwaXhlbCAqLworICBKU0FNUFJPVyBvdXRwdHI7CQkvKiA9PiBjdXJyZW50IG91dHB1dCBwaXhlbCAqLworICBoaXN0cHRyIGNhY2hlcDsKKyAgaW50IGRpcjsJCQkvKiArMSBvciAtMSBkZXBlbmRpbmcgb24gZGlyZWN0aW9uICovCisgIGludCBkaXIzOwkJCS8qIDMqZGlyLCBmb3IgYWR2YW5jaW5nIGlucHRyICYgZXJyb3JwdHIgKi8KKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIGludCAqZXJyb3JfbGltaXQgPSBjcXVhbnRpemUtPmVycm9yX2xpbWl0ZXI7CisgIEpTQU1QUk9XIGNvbG9ybWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKKyAgSlNBTVBST1cgY29sb3JtYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOworICBKU0FNUFJPVyBjb2xvcm1hcDIgPSBjaW5mby0+Y29sb3JtYXBbMl07CisgIFNISUZUX1RFTVBTCisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBpbnB0ciA9IGlucHV0X2J1Zltyb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9idWZbcm93XTsKKyAgICBpZiAoY3F1YW50aXplLT5vbl9vZGRfcm93KSB7CisgICAgICAvKiB3b3JrIHJpZ2h0IHRvIGxlZnQgaW4gdGhpcyByb3cgKi8KKyAgICAgIGlucHRyICs9ICh3aWR0aC0xKSAqIDM7CS8qIHNvIHBvaW50IHRvIHJpZ2h0bW9zdCBwaXhlbCAqLworICAgICAgb3V0cHRyICs9IHdpZHRoLTE7CisgICAgICBkaXIgPSAtMTsKKyAgICAgIGRpcjMgPSAtMzsKKyAgICAgIGVycm9ycHRyID0gY3F1YW50aXplLT5mc2Vycm9ycyArICh3aWR0aCsxKSozOyAvKiA9PiBlbnRyeSBhZnRlciBsYXN0IGNvbHVtbiAqLworICAgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7IC8qIGZsaXAgZm9yIG5leHQgdGltZSAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiB3b3JrIGxlZnQgdG8gcmlnaHQgaW4gdGhpcyByb3cgKi8KKyAgICAgIGRpciA9IDE7CisgICAgICBkaXIzID0gMzsKKyAgICAgIGVycm9ycHRyID0gY3F1YW50aXplLT5mc2Vycm9yczsgLyogPT4gZW50cnkgYmVmb3JlIGZpcnN0IHJlYWwgY29sdW1uICovCisgICAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSBUUlVFOyAvKiBmbGlwIGZvciBuZXh0IHRpbWUgKi8KKyAgICB9CisgICAgLyogUHJlc2V0IGVycm9yIHZhbHVlczogbm8gZXJyb3IgcHJvcGFnYXRlZCB0byBmaXJzdCBwaXhlbCBmcm9tIGxlZnQgKi8KKyAgICBjdXIwID0gY3VyMSA9IGN1cjIgPSAwOworICAgIC8qIGFuZCBubyBlcnJvciBwcm9wYWdhdGVkIHRvIHJvdyBiZWxvdyB5ZXQgKi8KKyAgICBiZWxvd2VycjAgPSBiZWxvd2VycjEgPSBiZWxvd2VycjIgPSAwOworICAgIGJwcmV2ZXJyMCA9IGJwcmV2ZXJyMSA9IGJwcmV2ZXJyMiA9IDA7CisKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgLyogY3VyTiBob2xkcyB0aGUgZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBwaXhlbCBvbiB0aGUKKyAgICAgICAqIGN1cnJlbnQgbGluZS4gIEFkZCB0aGUgZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lCisgICAgICAgKiB0byBmb3JtIHRoZSBjb21wbGV0ZSBlcnJvciBjb3JyZWN0aW9uIHRlcm0gZm9yIHRoaXMgcGl4ZWwsIGFuZAorICAgICAgICogcm91bmQgdGhlIGVycm9yIHRlcm0gKHdoaWNoIGlzIGV4cHJlc3NlZCAqIDE2KSB0byBhbiBpbnRlZ2VyLgorICAgICAgICogUklHSFRfU0hJRlQgcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHksIHNvIGFkZGluZyA4IGlzIGNvcnJlY3QKKyAgICAgICAqIGZvciBlaXRoZXIgc2lnbiBvZiB0aGUgZXJyb3IgdmFsdWUuCisgICAgICAgKiBOb3RlOiBlcnJvcnB0ciBwb2ludHMgdG8gKnByZXZpb3VzKiBjb2x1bW4ncyBhcnJheSBlbnRyeS4KKyAgICAgICAqLworICAgICAgY3VyMCA9IFJJR0hUX1NISUZUKGN1cjAgKyBlcnJvcnB0cltkaXIzKzBdICsgOCwgNCk7CisgICAgICBjdXIxID0gUklHSFRfU0hJRlQoY3VyMSArIGVycm9ycHRyW2RpcjMrMV0gKyA4LCA0KTsKKyAgICAgIGN1cjIgPSBSSUdIVF9TSElGVChjdXIyICsgZXJyb3JwdHJbZGlyMysyXSArIDgsIDQpOworICAgICAgLyogTGltaXQgdGhlIGVycm9yIHVzaW5nIHRyYW5zZmVyIGZ1bmN0aW9uIHNldCBieSBpbml0X2Vycm9yX2xpbWl0LgorICAgICAgICogU2VlIGNvbW1lbnRzIHdpdGggaW5pdF9lcnJvcl9saW1pdCBmb3IgcmF0aW9uYWxlLgorICAgICAgICovCisgICAgICBjdXIwID0gZXJyb3JfbGltaXRbY3VyMF07CisgICAgICBjdXIxID0gZXJyb3JfbGltaXRbY3VyMV07CisgICAgICBjdXIyID0gZXJyb3JfbGltaXRbY3VyMl07CisgICAgICAvKiBGb3JtIHBpeGVsIHZhbHVlICsgZXJyb3IsIGFuZCByYW5nZS1saW1pdCB0byAwLi5NQVhKU0FNUExFLgorICAgICAgICogVGhlIG1heGltdW0gZXJyb3IgaXMgKy0gTUFYSlNBTVBMRSAob3IgbGVzcyB3aXRoIGVycm9yIGxpbWl0aW5nKTsKKyAgICAgICAqIHRoaXMgc2V0cyB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgcmFuZ2VfbGltaXQgYXJyYXkuCisgICAgICAgKi8KKyAgICAgIGN1cjAgKz0gR0VUSlNBTVBMRShpbnB0clswXSk7CisgICAgICBjdXIxICs9IEdFVEpTQU1QTEUoaW5wdHJbMV0pOworICAgICAgY3VyMiArPSBHRVRKU0FNUExFKGlucHRyWzJdKTsKKyAgICAgIGN1cjAgPSBHRVRKU0FNUExFKHJhbmdlX2xpbWl0W2N1cjBdKTsKKyAgICAgIGN1cjEgPSBHRVRKU0FNUExFKHJhbmdlX2xpbWl0W2N1cjFdKTsKKyAgICAgIGN1cjIgPSBHRVRKU0FNUExFKHJhbmdlX2xpbWl0W2N1cjJdKTsKKyAgICAgIC8qIEluZGV4IGludG8gdGhlIGNhY2hlIHdpdGggYWRqdXN0ZWQgcGl4ZWwgdmFsdWUgKi8KKyAgICAgIGNhY2hlcCA9ICYgaGlzdG9ncmFtW2N1cjA+PkMwX1NISUZUXVtjdXIxPj5DMV9TSElGVF1bY3VyMj4+QzJfU0hJRlRdOworICAgICAgLyogSWYgd2UgaGF2ZSBub3Qgc2VlbiB0aGlzIGNvbG9yIGJlZm9yZSwgZmluZCBuZWFyZXN0IGNvbG9ybWFwICovCisgICAgICAvKiBlbnRyeSBhbmQgdXBkYXRlIHRoZSBjYWNoZSAqLworICAgICAgaWYgKCpjYWNoZXAgPT0gMCkKKwlmaWxsX2ludmVyc2VfY21hcChjaW5mbywgY3VyMD4+QzBfU0hJRlQsY3VyMT4+QzFfU0hJRlQsY3VyMj4+QzJfU0hJRlQpOworICAgICAgLyogTm93IGVtaXQgdGhlIGNvbG9ybWFwIGluZGV4IGZvciB0aGlzIGNlbGwgKi8KKyAgICAgIHsgcmVnaXN0ZXIgaW50IHBpeGNvZGUgPSAqY2FjaGVwIC0gMTsKKwkqb3V0cHRyID0gKEpTQU1QTEUpIHBpeGNvZGU7CisJLyogQ29tcHV0ZSByZXByZXNlbnRhdGlvbiBlcnJvciBmb3IgdGhpcyBwaXhlbCAqLworCWN1cjAgLT0gR0VUSlNBTVBMRShjb2xvcm1hcDBbcGl4Y29kZV0pOworCWN1cjEgLT0gR0VUSlNBTVBMRShjb2xvcm1hcDFbcGl4Y29kZV0pOworCWN1cjIgLT0gR0VUSlNBTVBMRShjb2xvcm1hcDJbcGl4Y29kZV0pOworICAgICAgfQorICAgICAgLyogQ29tcHV0ZSBlcnJvciBmcmFjdGlvbnMgdG8gYmUgcHJvcGFnYXRlZCB0byBhZGphY2VudCBwaXhlbHMuCisgICAgICAgKiBBZGQgdGhlc2UgaW50byB0aGUgcnVubmluZyBzdW1zLCBhbmQgc2ltdWx0YW5lb3VzbHkgc2hpZnQgdGhlCisgICAgICAgKiBuZXh0LWxpbmUgZXJyb3Igc3VtcyBsZWZ0IGJ5IDEgY29sdW1uLgorICAgICAgICovCisgICAgICB7IHJlZ2lzdGVyIExPQ0ZTRVJST1IgYm5leHRlcnIsIGRlbHRhOworCisJYm5leHRlcnIgPSBjdXIwOwkvKiBQcm9jZXNzIGNvbXBvbmVudCAwICovCisJZGVsdGEgPSBjdXIwICogMjsKKwljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KKwllcnJvcnB0clswXSA9IChGU0VSUk9SKSAoYnByZXZlcnIwICsgY3VyMCk7CisJY3VyMCArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCisJYnByZXZlcnIwID0gYmVsb3dlcnIwICsgY3VyMDsKKwliZWxvd2VycjAgPSBibmV4dGVycjsKKwljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDcgKi8KKwlibmV4dGVyciA9IGN1cjE7CS8qIFByb2Nlc3MgY29tcG9uZW50IDEgKi8KKwlkZWx0YSA9IGN1cjEgKiAyOworCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogMyAqLworCWVycm9ycHRyWzFdID0gKEZTRVJST1IpIChicHJldmVycjEgKyBjdXIxKTsKKwljdXIxICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDUgKi8KKwlicHJldmVycjEgPSBiZWxvd2VycjEgKyBjdXIxOworCWJlbG93ZXJyMSA9IGJuZXh0ZXJyOworCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNyAqLworCWJuZXh0ZXJyID0gY3VyMjsJLyogUHJvY2VzcyBjb21wb25lbnQgMiAqLworCWRlbHRhID0gY3VyMiAqIDI7CisJY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiAzICovCisJZXJyb3JwdHJbMl0gPSAoRlNFUlJPUikgKGJwcmV2ZXJyMiArIGN1cjIpOworCWN1cjIgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNSAqLworCWJwcmV2ZXJyMiA9IGJlbG93ZXJyMiArIGN1cjI7CisJYmVsb3dlcnIyID0gYm5leHRlcnI7CisJY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCisgICAgICB9CisgICAgICAvKiBBdCB0aGlzIHBvaW50IGN1ck4gY29udGFpbnMgdGhlIDcvMTYgZXJyb3IgdmFsdWUgdG8gYmUgcHJvcGFnYXRlZAorICAgICAgICogdG8gdGhlIG5leHQgcGl4ZWwgb24gdGhlIGN1cnJlbnQgbGluZSwgYW5kIGFsbCB0aGUgZXJyb3JzIGZvciB0aGUKKyAgICAgICAqIG5leHQgbGluZSBoYXZlIGJlZW4gc2hpZnRlZCBvdmVyLiAgV2UgYXJlIHRoZXJlZm9yZSByZWFkeSB0byBtb3ZlIG9uLgorICAgICAgICovCisgICAgICBpbnB0ciArPSBkaXIzOwkJLyogQWR2YW5jZSBwaXhlbCBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgICAgb3V0cHRyICs9IGRpcjsKKyAgICAgIGVycm9ycHRyICs9IGRpcjM7CQkvKiBhZHZhbmNlIGVycm9ycHRyIHRvIGN1cnJlbnQgY29sdW1uICovCisgICAgfQorICAgIC8qIFBvc3QtbG9vcCBjbGVhbnVwOiB3ZSBtdXN0IHVubG9hZCB0aGUgZmluYWwgZXJyb3IgdmFsdWVzIGludG8gdGhlCisgICAgICogZmluYWwgZnNlcnJvcnNbXSBlbnRyeS4gIE5vdGUgd2UgbmVlZCBub3QgdW5sb2FkIGJlbG93ZXJyTiBiZWNhdXNlCisgICAgICogaXQgaXMgZm9yIHRoZSBkdW1teSBjb2x1bW4gYmVmb3JlIG9yIGFmdGVyIHRoZSBhY3R1YWwgYXJyYXkuCisgICAgICovCisgICAgZXJyb3JwdHJbMF0gPSAoRlNFUlJPUikgYnByZXZlcnIwOyAvKiB1bmxvYWQgcHJldiBlcnJzIGludG8gYXJyYXkgKi8KKyAgICBlcnJvcnB0clsxXSA9IChGU0VSUk9SKSBicHJldmVycjE7CisgICAgZXJyb3JwdHJbMl0gPSAoRlNFUlJPUikgYnByZXZlcnIyOworICB9Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGVycm9yLWxpbWl0aW5nIHRyYW5zZmVyIGZ1bmN0aW9uIChsb29rdXAgdGFibGUpLgorICogVGhlIHJhdyBGLVMgZXJyb3IgY29tcHV0YXRpb24gY2FuIHBvdGVudGlhbGx5IGNvbXB1dGUgZXJyb3IgdmFsdWVzIG9mIHVwIHRvCisgKiArLSBNQVhKU0FNUExFLiAgQnV0IHdlIHdhbnQgdGhlIG1heGltdW0gY29ycmVjdGlvbiBhcHBsaWVkIHRvIGEgcGl4ZWwgdG8gYmUKKyAqIG11Y2ggbGVzcywgb3RoZXJ3aXNlIG9idmlvdXNseSB3cm9uZyBwaXhlbHMgd2lsbCBiZSBjcmVhdGVkLiAgKFR5cGljYWwKKyAqIGVmZmVjdHMgaW5jbHVkZSB3ZWlyZCBmcmluZ2VzIGF0IGNvbG9yLWFyZWEgYm91bmRhcmllcywgaXNvbGF0ZWQgYnJpZ2h0CisgKiBwaXhlbHMgaW4gYSBkYXJrIGFyZWEsIGV0Yy4pICBUaGUgc3RhbmRhcmQgYWR2aWNlIGZvciBhdm9pZGluZyB0aGlzIHByb2JsZW0KKyAqIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSAiY29ybmVycyIgb2YgdGhlIGNvbG9yIGN1YmUgYXJlIGFsbG9jYXRlZCBhcyBvdXRwdXQKKyAqIGNvbG9yczsgdGhlbiByZXBlYXRlZCBlcnJvcnMgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGNhbm5vdCBjYXVzZSBjYXNjYWRpbmcKKyAqIGVycm9yIGJ1aWxkdXAuICBIb3dldmVyLCB0aGF0IG9ubHkgcHJldmVudHMgdGhlIGVycm9yIGZyb20gZ2V0dGluZworICogY29tcGxldGVseSBvdXQgb2YgaGFuZDsgQWFyb24gR2lsZXMgcmVwb3J0cyB0aGF0IGVycm9yIGxpbWl0aW5nIGltcHJvdmVzCisgKiB0aGUgcmVzdWx0cyBldmVuIHdpdGggY29ybmVyIGNvbG9ycyBhbGxvY2F0ZWQuCisgKiBBIHNpbXBsZSBjbGFtcGluZyBvZiB0aGUgZXJyb3IgdmFsdWVzIHRvIGFib3V0ICstIE1BWEpTQU1QTEUvOCB3b3JrcyBwcmV0dHkKKyAqIHdlbGwsIGJ1dCB0aGUgc21vb3RoZXIgdHJhbnNmZXIgZnVuY3Rpb24gdXNlZCBiZWxvdyBpcyBldmVuIGJldHRlci4gIFRoYW5rcworICogdG8gQWFyb24gR2lsZXMgZm9yIHRoaXMgaWRlYS4KKyAqLworCitMT0NBTCh2b2lkKQoraW5pdF9lcnJvcl9saW1pdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIEFsbG9jYXRlIGFuZCBmaWxsIGluIHRoZSBlcnJvcl9saW1pdGVyIHRhYmxlICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGludCAqIHRhYmxlOworICBpbnQgaW4sIG91dDsKKworICB0YWJsZSA9IChpbnQgKikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCAoTUFYSlNBTVBMRSoyKzEpICogU0laRU9GKGludCkpOworICB0YWJsZSArPSBNQVhKU0FNUExFOwkJLyogc28gY2FuIGluZGV4IC1NQVhKU0FNUExFIC4uICtNQVhKU0FNUExFICovCisgIGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9IHRhYmxlOworCisjZGVmaW5lIFNURVBTSVpFICgoTUFYSlNBTVBMRSsxKS8xNikKKyAgLyogTWFwIGVycm9ycyAxOjEgdXAgdG8gKy0gTUFYSlNBTVBMRS8xNiAqLworICBvdXQgPSAwOworICBmb3IgKGluID0gMDsgaW4gPCBTVEVQU0laRTsgaW4rKywgb3V0KyspIHsKKyAgICB0YWJsZVtpbl0gPSBvdXQ7IHRhYmxlWy1pbl0gPSAtb3V0OworICB9CisgIC8qIE1hcCBlcnJvcnMgMToyIHVwIHRvICstIDMqTUFYSlNBTVBMRS8xNiAqLworICBmb3IgKDsgaW4gPCBTVEVQU0laRSozOyBpbisrLCBvdXQgKz0gKGluJjEpID8gMCA6IDEpIHsKKyAgICB0YWJsZVtpbl0gPSBvdXQ7IHRhYmxlWy1pbl0gPSAtb3V0OworICB9CisgIC8qIENsYW1wIHRoZSByZXN0IHRvIGZpbmFsIG91dCB2YWx1ZSAod2hpY2ggaXMgKE1BWEpTQU1QTEUrMSkvOCkgKi8KKyAgZm9yICg7IGluIDw9IE1BWEpTQU1QTEU7IGluKyspIHsKKyAgICB0YWJsZVtpbl0gPSBvdXQ7IHRhYmxlWy1pbl0gPSAtb3V0OworICB9CisjdW5kZWYgU1RFUFNJWkUKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgZWFjaCBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3MxIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworCisgIC8qIFNlbGVjdCB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3JzIGFuZCBmaWxsIGluIGNpbmZvLT5jb2xvcm1hcCAqLworICBjaW5mby0+Y29sb3JtYXAgPSBjcXVhbnRpemUtPnN2X2NvbG9ybWFwOworICBzZWxlY3RfY29sb3JzKGNpbmZvLCBjcXVhbnRpemUtPmRlc2lyZWQpOworICAvKiBGb3JjZSBuZXh0IHBhc3MgdG8gemVybyB0aGUgY29sb3IgaW5kZXggdGFibGUgKi8KKyAgY3F1YW50aXplLT5uZWVkc196ZXJvZWQgPSBUUlVFOworfQorCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3MyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGVhY2ggcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc18yX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3ByZV9zY2FuKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07CisgIGludCBpOworCisgIC8qIE9ubHkgRi1TIGRpdGhlcmluZyBvciBubyBkaXRoZXJpbmcgaXMgc3VwcG9ydGVkLiAqLworICAvKiBJZiB1c2VyIGFza3MgZm9yIG9yZGVyZWQgZGl0aGVyLCBnaXZlIGhpbSBGLVMuICovCisgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgIT0gSkRJVEhFUl9OT05FKQorICAgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfRlM7CisKKyAgaWYgKGlzX3ByZV9zY2FuKSB7CisgICAgLyogU2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcHJlc2Nhbl9xdWFudGl6ZTsKKyAgICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzMTsKKyAgICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7IC8qIEFsd2F5cyB6ZXJvIGhpc3RvZ3JhbSAqLworICB9IGVsc2UgeworICAgIC8qIFNldCB1cCBtZXRob2QgcG9pbnRlcnMgKi8KKyAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpCisgICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IHBhc3MyX2ZzX2RpdGhlcjsKKyAgICBlbHNlCisgICAgICBjcXVhbnRpemUtPnB1Yi5jb2xvcl9xdWFudGl6ZSA9IHBhc3MyX25vX2RpdGhlcjsKKyAgICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzMjsKKworICAgIC8qIE1ha2Ugc3VyZSBjb2xvciBjb3VudCBpcyBhY2NlcHRhYmxlICovCisgICAgaSA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKKyAgICBpZiAoaSA8IDEpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCAxKTsKKyAgICBpZiAoaSA+IE1BWE5VTUNPTE9SUykKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCBNQVhOVU1DT0xPUlMpOworCisgICAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX0ZTKSB7CisgICAgICBzaXplX3QgYXJyYXlzaXplID0gKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKgorCQkJCSAgICgzICogU0laRU9GKEZTRVJST1IpKSk7CisgICAgICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIHdlIGRpZG4ndCBhbHJlYWR5LiAqLworICAgICAgaWYgKGNxdWFudGl6ZS0+ZnNlcnJvcnMgPT0gTlVMTCkKKwljcXVhbnRpemUtPmZzZXJyb3JzID0gKEZTRVJSUFRSKSAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKQorCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgYXJyYXlzaXplKTsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHByb3BhZ2F0ZWQgZXJyb3JzIHRvIHplcm8uICovCisgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNxdWFudGl6ZS0+ZnNlcnJvcnMsIGFycmF5c2l6ZSk7CisgICAgICAvKiBNYWtlIHRoZSBlcnJvci1saW1pdCB0YWJsZSBpZiB3ZSBkaWRuJ3QgYWxyZWFkeS4gKi8KKyAgICAgIGlmIChjcXVhbnRpemUtPmVycm9yX2xpbWl0ZXIgPT0gTlVMTCkKKwlpbml0X2Vycm9yX2xpbWl0KGNpbmZvKTsKKyAgICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IEZBTFNFOworICAgIH0KKworICB9CisgIC8qIFplcm8gdGhlIGhpc3RvZ3JhbSBvciBpbnZlcnNlIGNvbG9yIG1hcCwgaWYgbmVjZXNzYXJ5ICovCisgIGlmIChjcXVhbnRpemUtPm5lZWRzX3plcm9lZCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBISVNUX0MwX0VMRU1TOyBpKyspIHsKKyAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgaGlzdG9ncmFtW2ldLAorCQlISVNUX0MxX0VMRU1TKkhJU1RfQzJfRUxFTVMgKiBTSVpFT0YoaGlzdGNlbGwpKTsKKyAgICB9CisgICAgY3F1YW50aXplLT5uZWVkc196ZXJvZWQgPSBGQUxTRTsKKyAgfQorfQorCisKKy8qCisgKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgorICovCisKK01FVEhPRERFRih2b2lkKQorbmV3X2NvbG9yX21hcF8yX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworCisgIC8qIFJlc2V0IHRoZSBpbnZlcnNlIGNvbG9yIG1hcCAqLworICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7Cit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfMnBhc3NfcXVhbnRpemVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZTsKKyAgaW50IGk7CisKKyAgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY3F1YW50aXplcikpOworICBjaW5mby0+Y3F1YW50aXplID0gKHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqKSBjcXVhbnRpemU7CisgIGNxdWFudGl6ZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzXzJfcXVhbnQ7CisgIGNxdWFudGl6ZS0+cHViLm5ld19jb2xvcl9tYXAgPSBuZXdfY29sb3JfbWFwXzJfcXVhbnQ7CisgIGNxdWFudGl6ZS0+ZnNlcnJvcnMgPSBOVUxMOwkvKiBmbGFnIG9wdGlvbmFsIGFycmF5cyBub3QgYWxsb2NhdGVkICovCisgIGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9IE5VTEw7CisKKyAgLyogTWFrZSBzdXJlIGpkbWFzdGVyIGRpZG4ndCBnaXZlIG1lIGEgY2FzZSBJIGNhbid0IGhhbmRsZSAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKKworICAvKiBBbGxvY2F0ZSB0aGUgaGlzdG9ncmFtL2ludmVyc2UgY29sb3JtYXAgc3RvcmFnZSAqLworICBjcXVhbnRpemUtPmhpc3RvZ3JhbSA9IChoaXN0M2QpICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgSElTVF9DMF9FTEVNUyAqIFNJWkVPRihoaXN0MmQpKTsKKyAgZm9yIChpID0gMDsgaSA8IEhJU1RfQzBfRUxFTVM7IGkrKykgeworICAgIGNxdWFudGl6ZS0+aGlzdG9ncmFtW2ldID0gKGhpc3QyZCkgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgSElTVF9DMV9FTEVNUypISVNUX0MyX0VMRU1TICogU0laRU9GKGhpc3RjZWxsKSk7CisgIH0KKyAgY3F1YW50aXplLT5uZWVkc196ZXJvZWQgPSBUUlVFOyAvKiBoaXN0b2dyYW0gaXMgZ2FyYmFnZSBub3cgKi8KKworICAvKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciB0aGUgY29tcGxldGVkIGNvbG9ybWFwLCBpZiByZXF1aXJlZC4KKyAgICogV2UgZG8gdGhpcyBub3cgc2luY2UgaXQgaXMgRkFSIHN0b3JhZ2UgYW5kIG1heSBhZmZlY3QKKyAgICogdGhlIG1lbW9yeSBtYW5hZ2VyJ3Mgc3BhY2UgY2FsY3VsYXRpb25zLgorICAgKi8KKyAgaWYgKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpIHsKKyAgICAvKiBNYWtlIHN1cmUgY29sb3IgY291bnQgaXMgYWNjZXB0YWJsZSAqLworICAgIGludCBkZXNpcmVkID0gY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsKKyAgICAvKiBMb3dlciBib3VuZCBvbiAjIG9mIGNvbG9ycyAuLi4gc29tZXdoYXQgYXJiaXRyYXJ5IGFzIGxvbmcgYXMgPiAwICovCisgICAgaWYgKGRlc2lyZWQgPCA4KQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgOCk7CisgICAgLyogTWFrZSBzdXJlIGNvbG9ybWFwIGluZGV4ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IEpTQU1QTEVzICovCisgICAgaWYgKGRlc2lyZWQgPiBNQVhOVU1DT0xPUlMpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgTUFYTlVNQ09MT1JTKTsKKyAgICBjcXVhbnRpemUtPnN2X2NvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sSlBPT0xfSU1BR0UsIChKRElNRU5TSU9OKSBkZXNpcmVkLCAoSkRJTUVOU0lPTikgMyk7CisgICAgY3F1YW50aXplLT5kZXNpcmVkID0gZGVzaXJlZDsKKyAgfSBlbHNlCisgICAgY3F1YW50aXplLT5zdl9jb2xvcm1hcCA9IE5VTEw7CisKKyAgLyogT25seSBGLVMgZGl0aGVyaW5nIG9yIG5vIGRpdGhlcmluZyBpcyBzdXBwb3J0ZWQuICovCisgIC8qIElmIHVzZXIgYXNrcyBmb3Igb3JkZXJlZCBkaXRoZXIsIGdpdmUgaGltIEYtUy4gKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpCisgICAgY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKKworICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIG5lY2Vzc2FyeS4KKyAgICogVGhpcyBpc24ndCByZWFsbHkgbmVlZGVkIHVudGlsIHBhc3MgMiwgYnV0IGFnYWluIGl0IGlzIEZBUiBzdG9yYWdlLgorICAgKiBBbHRob3VnaCB3ZSB3aWxsIGNvcGUgd2l0aCBhIGxhdGVyIGNoYW5nZSBpbiBkaXRoZXJfbW9kZSwKKyAgICogd2UgZG8gbm90IHByb21pc2UgdG8gaG9ub3IgbWF4X21lbW9yeV90b191c2UgaWYgZGl0aGVyX21vZGUgY2hhbmdlcy4KKyAgICovCisgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9GUykgeworICAgIGNxdWFudGl6ZS0+ZnNlcnJvcnMgPSAoRlNFUlJQVFIpICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgIChzaXplX3QpICgoY2luZm8tPm91dHB1dF93aWR0aCArIDIpICogKDMgKiBTSVpFT0YoRlNFUlJPUikpKSk7CisgICAgLyogTWlnaHQgYXMgd2VsbCBjcmVhdGUgdGhlIGVycm9yLWxpbWl0aW5nIHRhYmxlIHRvby4gKi8KKyAgICBpbml0X2Vycm9yX2xpbWl0KGNpbmZvKTsKKyAgfQorfQorCisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL2pzaW1kX2FybTY0X25lb24uUyBiL2pwZWcvanNpbWRfYXJtNjRfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YThiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pzaW1kX2FybTY0X25lb24uUwpAQCAtMCwwICsxLDE4ODEgQEAKKy8qCisgKiBBUk12OCBORU9OIG9wdGltaXphdGlvbnMgZm9yIGxpYmpwZWctdHVyYm8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBTaWFyaGVpIFNpYW1hc2hrYSA8c2lhcmhlaS5zaWFtYXNoa2FAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQsIExpbmFybyBMaW1pdGVkCisgKiBBdXRob3I6IFJhZ2VzaCBSYWRoYWtyaXNobmFuIDxyYWdlc2guckBsaW5hcm8ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBELiBSLiBDb21tYW5kZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fRUxGX18pCisuc2VjdGlvbiAubm90ZS5HTlUtc3RhY2ssIiIsJXByb2diaXRzIC8qIG1hcmsgc3RhY2sgYXMgbm9uLWV4ZWN1dGFibGUgKi8KKyNlbmRpZgorCisudGV4dAorCisKKyNkZWZpbmUgUkVTUEVDVF9TVFJJQ1RfQUxJR05NRU5UIDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN1cHBsZW1lbnRhcnkgbWFjcm8gZm9yIHNldHRpbmcgZnVuY3Rpb24gYXR0cmlidXRlcyAqLworLm1hY3JvIGFzbV9mdW5jdGlvbiBmbmFtZQorI2lmZGVmIF9fQVBQTEVfXworICAgIC5nbG9ibCBfXGZuYW1lCitfXGZuYW1lOgorI2Vsc2UKKyAgICAuZ2xvYmFsIFxmbmFtZQorI2lmZGVmIF9fRUxGX18KKyAgICAuaGlkZGVuIFxmbmFtZQorICAgIC50eXBlIFxmbmFtZSwgJWZ1bmN0aW9uCisjZW5kaWYKK1xmbmFtZToKKyNlbmRpZgorLmVuZG0KKworLyogVHJhbnNwb3NlIGVsZW1lbnRzIG9mIHNpbmdsZSAxMjggYml0IHJlZ2lzdGVycyAqLworLm1hY3JvIHRyYW5zcG9zZV9zaW5nbGUgeDAseDEseGkseGlsZW4sbGl0ZXJhbAorICAgIGlucyAgXHhpXHhpbGVuWzBdLCAgXHgwXHhpbGVuWzBdCisgICAgaW5zICBceDFceGlsZW5bMF0sICBceDBceGlsZW5bMV0KKyAgICB0cm4xIFx4MFxsaXRlcmFsLCAgIFx4MFxsaXRlcmFsLCBceDFcbGl0ZXJhbAorICAgIHRybjIgXHgxXGxpdGVyYWwsICAgXHhpXGxpdGVyYWwsIFx4MVxsaXRlcmFsCisuZW5kbQorCisvKiBUcmFuc3Bvc2UgZWxlbWVudHMgb2YgMiBkaWZmZXJuZXQgcmVnaXN0ZXJzICovCisubWFjcm8gdHJhbnNwb3NlIHgwLHgxLHhpLHhpbGVuLGxpdGVyYWwKKyAgICBtb3YgIFx4aVx4aWxlbiwgICAgIFx4MFx4aWxlbgorICAgIHRybjEgXHgwXGxpdGVyYWwsICAgXHgwXGxpdGVyYWwsIFx4MVxsaXRlcmFsCisgICAgdHJuMiBceDFcbGl0ZXJhbCwgICBceGlcbGl0ZXJhbCwgXHgxXGxpdGVyYWwKKy5lbmRtCisKKy8qIFRyYW5zcG9zZSBhIGJsb2NrIG9mIDR4NCBjb2VmZmljaWVudHMgaW4gZm91ciA2NC1iaXQgcmVnaXN0ZXJzICovCisubWFjcm8gdHJhbnNwb3NlXzR4NF8zMiB4MCx4MGxlbiB4MSx4MWxlbiB4Mix4MmxlbiB4Myx4M2xlbix4aSx4aWxlbgorICAgIG1vdiAgXHhpXHhpbGVuLCBceDBceGlsZW4KKyAgICB0cm4xIFx4MFx4MGxlbiwgXHgwXHgwbGVuLCBceDJceDJsZW4KKyAgICB0cm4yIFx4Mlx4MmxlbiwgXHhpXHgwbGVuLCBceDJceDJsZW4KKyAgICBtb3YgIFx4aVx4aWxlbiwgXHgxXHhpbGVuCisgICAgdHJuMSBceDFceDFsZW4sIFx4MVx4MWxlbiwgXHgzXHgzbGVuCisgICAgdHJuMiBceDNceDNsZW4sIFx4aVx4MWxlbiwgXHgzXHgzbGVuCisuZW5kbQorCisubWFjcm8gdHJhbnNwb3NlXzR4NF8xNiB4MCx4MGxlbiB4MSx4MWxlbiwgeDIseDJsZW4sIHgzLHgzbGVuLHhpLHhpbGVuCisgICAgbW92ICBceGlceGlsZW4sIFx4MFx4aWxlbgorICAgIHRybjEgXHgwXHgwbGVuLCBceDBceDBsZW4sIFx4MVx4MWxlbgorICAgIHRybjIgXHgxXHgybGVuLCBceGlceDBsZW4sIFx4MVx4MmxlbgorICAgIG1vdiAgXHhpXHhpbGVuLCBceDJceGlsZW4KKyAgICB0cm4xIFx4Mlx4MmxlbiwgXHgyXHgybGVuLCBceDNceDNsZW4KKyAgICB0cm4yIFx4M1x4MmxlbiwgXHhpXHgxbGVuLCBceDNceDNsZW4KKy5lbmRtCisKKy5tYWNybyB0cmFuc3Bvc2VfNHg0IHgwLCB4MSwgeDIsIHgzLHg1CisgICAgdHJhbnNwb3NlXzR4NF8xNiBceDAsLjRoLCBceDEsLjRoLCBceDIsLjRoLFx4MywuNGgsXHg1LC4xNmIKKyAgICB0cmFuc3Bvc2VfNHg0XzMyIFx4MCwuMnMsIFx4MSwuMnMsIFx4MiwuMnMsXHgzLC4ycyxceDUsLjE2YgorLmVuZG0KKworCisjZGVmaW5lIENFTlRFUkpTQU1QTEUgMTI4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKgorICogR0xPQkFMKHZvaWQpCisgKiBqc2ltZF9pZGN0X2lzbG93X25lb24gKHZvaWQgKiBkY3RfdGFibGUsIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQorICovCisKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICAoMjQ0NikKKyNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICAoMzE5NikKKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoNDQzMykKKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoNjI3MCkKKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICAoNzM3MykKKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoOTYzMykKKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICAoMTIyOTkpCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKDE1MTM3KQorI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgxNjA2OSkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICAoMTY4MTkpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgKDIwOTk1KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgyNTE3MikKKworI2RlZmluZSBGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMV85NjE1NzA1NjAgKEZJWF8xXzE3NTg3NTYwMiAtIEZJWF8xXzk2MTU3MDU2MCkKKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyX01JTlVTXzBfMzkwMTgwNjQ0IChGSVhfMV8xNzU4NzU2MDIgLSBGSVhfMF8zOTAxODA2NDQpCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMF9NSU5VU18xXzg0Nzc1OTA2NSAoRklYXzBfNTQxMTk2MTAwIC0gRklYXzFfODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjZfTUlOVVNfMl81NjI5MTU0NDcgKEZJWF8zXzA3MjcxMTAyNiAtIEZJWF8yXzU2MjkxNTQ0NykKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2X01JTlVTXzBfODk5OTc2MjIzIChGSVhfMF8yOTg2MzEzMzYgLSBGSVhfMF84OTk5NzYyMjMpCisjZGVmaW5lIEZJWF8xXzUwMTMyMTExMF9NSU5VU18wXzg5OTk3NjIyMyAoRklYXzFfNTAxMzIxMTEwIC0gRklYXzBfODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMl8wNTMxMTk4NjlfTUlOVVNfMl81NjI5MTU0NDcgKEZJWF8yXzA1MzExOTg2OSAtIEZJWF8yXzU2MjkxNTQ0NykKKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwX1BMVVNfMF83NjUzNjY4NjUgIChGSVhfMF81NDExOTYxMDAgKyBGSVhfMF83NjUzNjY4NjUpCisKKy8qCisgKiBSZWZlcmVuY2UgU0lNRC1mcmllbmRseSAxLUQgSVNMT1cgaURDVCBDIGltcGxlbWVudGF0aW9uLgorICogVXNlcyBzb21lIGlkZWFzIGZyb20gdGhlIGNvbW1lbnRzIGluICdzaW1kL2ppc3MyaW50LTY0LmFzbScKKyAqLworI2RlZmluZSBSRUZfMURfSURDVCh4cm93MCwgeHJvdzEsIHhyb3cyLCB4cm93MywgeHJvdzQsIHhyb3c1LCB4cm93NiwgeHJvdzcpICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERDVEVMRU0gcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NzsgICAgICAgICAgICAgICAgICAgXAorICAgIElOVDMyICAgcTEsIHEyLCBxMywgcTQsIHE1LCBxNiwgcTc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVDMyICAgdG1wMTFfcGx1c190bXAyLCB0bXAxMV9taW51c190bXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIDEtRCBpRENUIGlucHV0IGRhdGEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzAgPSB4cm93MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzEgPSB4cm93MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzIgPSB4cm93MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzMgPSB4cm93MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzQgPSB4cm93NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzUgPSB4cm93NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzYgPSB4cm93NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzcgPSB4cm93NzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE1ID0gcm93NyArIHJvdzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE0ID0gcm93NSArIHJvdzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE2ID0gTVVMVElQTFkocTUsIEZJWF8xXzE3NTg3NTYwMl9NSU5VU18xXzk2MTU3MDU2MCkgKyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgTVVMVElQTFkocTQsIEZJWF8xXzE3NTg3NTYwMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE3ID0gTVVMVElQTFkocTUsIEZJWF8xXzE3NTg3NTYwMikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgTVVMVElQTFkocTQsIEZJWF8xXzE3NTg3NTYwMl9NSU5VU18wXzM5MDE4MDY0NCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHEyID0gTVVMVElQTFkocm93MiwgRklYXzBfNTQxMTk2MTAwKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgTVVMVElQTFkocm93NiwgRklYXzBfNTQxMTk2MTAwX01JTlVTXzFfODQ3NzU5MDY1KTsgICAgICAgICAgICAgICAgICAgXAorICAgIHE0ID0gcTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHEzID0gKChJTlQzMikgcm93MCAtIChJTlQzMikgcm93NCkgPDwgMTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE2ICs9IE1VTFRJUExZKHJvdzUsIC1GSVhfMl81NjI5MTU0NDcpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE1VTFRJUExZKHJvdzMsIEZJWF8zXzA3MjcxMTAyNl9NSU5VU18yXzU2MjkxNTQ0Nyk7ICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG5vdyB3ZSBjYW4gdXNlIHExIChyZWxvYWRhYmxlIGNvbnN0YW50cyBoYXZlIGJlZW4gdXNlZCB1cCkgKi8gICAgICAgICAgXAorICAgIHExID0gcTMgKyBxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE0ICs9IE1VTFRJUExZKHJvdzcsIEZJWF8wXzI5ODYzMTMzNl9NSU5VU18wXzg5OTk3NjIyMykgKyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE1VTFRJUExZKHJvdzEsIC1GSVhfMF84OTk5NzYyMjMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE1ID0gcTc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHExID0gcTEgKyBxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE3ICs9IE1VTFRJUExZKHJvdzcsIC1GSVhfMF84OTk5NzYyMjMpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE1VTFRJUExZKHJvdzEsIEZJWF8xXzUwMTMyMTExMF9NSU5VU18wXzg5OTk3NjIyMyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qICh0bXAxMSArIHRtcDIpIGhhcyBiZWVuIGNhbGN1bGF0ZWQgKG91dF9yb3cxIGJlZm9yZSBkZXNjYWxlKSAqLyAgICAgICAgXAorICAgIHRtcDExX3BsdXNfdG1wMiA9IHExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJvdzEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHExID0gcTEgLSBxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE1ICs9IE1VTFRJUExZKHJvdzUsIEZJWF8yXzA1MzExOTg2OV9NSU5VU18yXzU2MjkxNTQ0NykgKyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIE1VTFRJUExZKHJvdzMsIC1GSVhfMl81NjI5MTU0NDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHExID0gcTEgLSBxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHE2ID0gTVVMVElQTFkocm93MiwgRklYXzBfNTQxMTk2MTAwX1BMVVNfMF83NjUzNjY4NjUpICsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgTVVMVElQTFkocm93NiwgRklYXzBfNTQxMTk2MTAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHEzID0gcTMgLSBxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qICh0bXAxMSAtIHRtcDIpIGhhcyBiZWVuIGNhbGN1bGF0ZWQgKG91dF9yb3c2IGJlZm9yZSBkZXNjYWxlKSAqLyAgICAgICAgXAorICAgIHRtcDExX21pbnVzX3RtcDIgPSBxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHExID0gKChJTlQzMikgcm93MCArIChJTlQzMikgcm93NCkgPDwgMTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHEyID0gcTEgKyBxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHExID0gcTEgLSBxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHBpY2sgdXAgdGhlIHJlc3VsdHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDAgID0gcTQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDEgID0gcTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDIgID0gKHRtcDExX3BsdXNfdG1wMiAtIHRtcDExX21pbnVzX3RtcDIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDMgID0gcTc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDEwID0gcTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDExID0gKHRtcDExX3BsdXNfdG1wMiArIHRtcDExX21pbnVzX3RtcDIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDEyID0gcTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDEzID0gcTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFhGSVhfMF84OTk5NzYyMjMgICAgICAgICAgICAgICAgICAgIHYwLmhbMF0KKyNkZWZpbmUgWEZJWF8wXzU0MTE5NjEwMCAgICAgICAgICAgICAgICAgICAgdjAuaFsxXQorI2RlZmluZSBYRklYXzJfNTYyOTE1NDQ3ICAgICAgICAgICAgICAgICAgICB2MC5oWzJdCisjZGVmaW5lIFhGSVhfMF8yOTg2MzEzMzZfTUlOVVNfMF84OTk5NzYyMjMgIHYwLmhbM10KKyNkZWZpbmUgWEZJWF8xXzUwMTMyMTExMF9NSU5VU18wXzg5OTk3NjIyMyAgdjEuaFswXQorI2RlZmluZSBYRklYXzJfMDUzMTE5ODY5X01JTlVTXzJfNTYyOTE1NDQ3ICB2MS5oWzFdCisjZGVmaW5lIFhGSVhfMF81NDExOTYxMDBfUExVU18wXzc2NTM2Njg2NSAgIHYxLmhbMl0KKyNkZWZpbmUgWEZJWF8xXzE3NTg3NTYwMiAgICAgICAgICAgICAgICAgICAgdjEuaFszXQorI2RlZmluZSBYRklYXzFfMTc1ODc1NjAyX01JTlVTXzBfMzkwMTgwNjQ0ICB2Mi5oWzBdCisjZGVmaW5lIFhGSVhfMF81NDExOTYxMDBfTUlOVVNfMV84NDc3NTkwNjUgIHYyLmhbMV0KKyNkZWZpbmUgWEZJWF8zXzA3MjcxMTAyNl9NSU5VU18yXzU2MjkxNTQ0NyAgdjIuaFsyXQorI2RlZmluZSBYRklYXzFfMTc1ODc1NjAyX01JTlVTXzFfOTYxNTcwNTYwICB2Mi5oWzNdCisKKy5iYWxpZ24gMTYKK0xqc2ltZF9pZGN0X2lzbG93X25lb25fY29uc3RzOgorICAgIC5zaG9ydCBGSVhfMF84OTk5NzYyMjMgICAgICAgICAgICAgICAgICAgIC8qIGQwWzBdICovCisgICAgLnNob3J0IEZJWF8wXzU0MTE5NjEwMCAgICAgICAgICAgICAgICAgICAgLyogZDBbMV0gKi8KKyAgICAuc2hvcnQgRklYXzJfNTYyOTE1NDQ3ICAgICAgICAgICAgICAgICAgICAvKiBkMFsyXSAqLworICAgIC5zaG9ydCBGSVhfMF8yOTg2MzEzMzZfTUlOVVNfMF84OTk5NzYyMjMgIC8qIGQwWzNdICovCisgICAgLnNob3J0IEZJWF8xXzUwMTMyMTExMF9NSU5VU18wXzg5OTk3NjIyMyAgLyogZDFbMF0gKi8KKyAgICAuc2hvcnQgRklYXzJfMDUzMTE5ODY5X01JTlVTXzJfNTYyOTE1NDQ3ICAvKiBkMVsxXSAqLworICAgIC5zaG9ydCBGSVhfMF81NDExOTYxMDBfUExVU18wXzc2NTM2Njg2NSAgIC8qIGQxWzJdICovCisgICAgLnNob3J0IEZJWF8xXzE3NTg3NTYwMiAgICAgICAgICAgICAgICAgICAgLyogZDFbM10gKi8KKyAgICAvKiByZWxvYWRhYmxlIGNvbnN0YW50cyAqLworICAgIC5zaG9ydCBGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMF8zOTAxODA2NDQgIC8qIGQyWzBdICovCisgICAgLnNob3J0IEZJWF8wXzU0MTE5NjEwMF9NSU5VU18xXzg0Nzc1OTA2NSAgLyogZDJbMV0gKi8KKyAgICAuc2hvcnQgRklYXzNfMDcyNzExMDI2X01JTlVTXzJfNTYyOTE1NDQ3ICAvKiBkMlsyXSAqLworICAgIC5zaG9ydCBGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMV85NjE1NzA1NjAgIC8qIGQyWzNdICovCisKK2FzbV9mdW5jdGlvbiBqc2ltZF9pZGN0X2lzbG93X25lb24KKworICAgIERDVF9UQUJMRSAgICAgICAucmVxIHgwCisgICAgQ09FRl9CTE9DSyAgICAgIC5yZXEgeDEKKyAgICBPVVRQVVRfQlVGICAgICAgLnJlcSB4MgorICAgIE9VVFBVVF9DT0wgICAgICAucmVxIHgzCisgICAgVE1QMSAgICAgICAgICAgIC5yZXEgeDAKKyAgICBUTVAyICAgICAgICAgICAgLnJlcSB4MQorICAgIFRNUDMgICAgICAgICAgICAucmVxIHgyCisgICAgVE1QNCAgICAgICAgICAgIC5yZXEgeDE1CisKKyAgICAvKiBPVVRQVVRfQ09MIGlzIGEgSkRJTUVOU0lPTiAodW5zaWduZWQgaW50KSBhcmd1bWVudCwgc28gdGhlIEFCSSBkb2Vzbid0CisgICAgICAgZ3VhcmFudGVlIHRoYXQgdGhlIHVwcGVyICh1bnVzZWQpIDMyIGJpdHMgb2YgeDMgYXJlIHZhbGlkLiAgVGhpcworICAgICAgIGluc3RydWN0aW9uIGVuc3VyZXMgdGhhdCB0aG9zZSBiaXRzIGFyZSBzZXQgdG8gemVyby4gKi8KKyAgICB1eHR3IHgzLCB3MworCisgICAgUk9XMEwgICAgICAgICAgIC5yZXEgdjE2CisgICAgUk9XMFIgICAgICAgICAgIC5yZXEgdjE3CisgICAgUk9XMUwgICAgICAgICAgIC5yZXEgdjE4CisgICAgUk9XMVIgICAgICAgICAgIC5yZXEgdjE5CisgICAgUk9XMkwgICAgICAgICAgIC5yZXEgdjIwCisgICAgUk9XMlIgICAgICAgICAgIC5yZXEgdjIxCisgICAgUk9XM0wgICAgICAgICAgIC5yZXEgdjIyCisgICAgUk9XM1IgICAgICAgICAgIC5yZXEgdjIzCisgICAgUk9XNEwgICAgICAgICAgIC5yZXEgdjI0CisgICAgUk9XNFIgICAgICAgICAgIC5yZXEgdjI1CisgICAgUk9XNUwgICAgICAgICAgIC5yZXEgdjI2CisgICAgUk9XNVIgICAgICAgICAgIC5yZXEgdjI3CisgICAgUk9XNkwgICAgICAgICAgIC5yZXEgdjI4CisgICAgUk9XNlIgICAgICAgICAgIC5yZXEgdjI5CisgICAgUk9XN0wgICAgICAgICAgIC5yZXEgdjMwCisgICAgUk9XN1IgICAgICAgICAgIC5yZXEgdjMxCisgICAgLyogU2F2ZSBhbGwgTkVPTiByZWdpc3RlcnMgYW5kIHgxNSAoMzIgTkVPTiByZWdpc3RlcnMgKiA4IGJ5dGVzICsgMTYpICovCisgICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgMjcyCisgICAgc3RyICAgICAgICAgICAgIHgxNSwgW3NwXSwgMTYKKyAgICBhZHIgICAgICAgICAgICAgeDE1LCBManNpbWRfaWRjdF9pc2xvd19uZW9uX2NvbnN0cworICAgIHN0MSAgICAgICAgICAgICB7djAuOGIsIHYxLjhiLCB2Mi44YiwgdjMuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djQuOGIsIHY1LjhiLCB2Ni44YiwgdjcuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djguOGIsIHY5LjhiLCB2MTAuOGIsIHYxMS44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MTIuOGIsIHYxMy44YiwgdjE0LjhiLCB2MTUuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djE2LjhiLCB2MTcuOGIsIHYxOC44YiwgdjE5LjhifSwgW3NwXSwgMzIKKyAgICBzdDEgICAgICAgICAgICAge3YyMC44YiwgdjIxLjhiLCB2MjIuOGIsIHYyMy44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGIsIHYyNS44YiwgdjI2LjhiLCB2MjcuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djI4LjhiLCB2MjkuOGIsIHYzMC44YiwgdjMxLjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YxNi40aCwgdjE3LjRoLCB2MTguNGgsIHYxOS40aH0sIFtDT0VGX0JMT0NLXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YwLjRoLCB2MS40aCwgdjIuNGgsIHYzLjRofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2MjAuNGgsIHYyMS40aCwgdjIyLjRoLCB2MjMuNGh9LCBbQ09FRl9CTE9DS10sIDMyCisgICAgbXVsICAgICAgICAgICAgIHYxNi40aCwgdjE2LjRoLCB2MC40aAorICAgIG11bCAgICAgICAgICAgICB2MTcuNGgsIHYxNy40aCwgdjEuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjE2LmRbMV0sIHYxNy5kWzBdICAvKiAxMjggYml0IHE4ICovCisgICAgbGQxICAgICAgICAgICAgIHt2NC40aCwgdjUuNGgsIHY2LjRoLCB2Ny40aH0sIFtEQ1RfVEFCTEVdLCAzMgorICAgIG11bCAgICAgICAgICAgICB2MTguNGgsIHYxOC40aCwgdjIuNGgKKyAgICBtdWwgICAgICAgICAgICAgdjE5LjRoLCB2MTkuNGgsIHYzLjRoCisgICAgaW5zICAgICAgICAgICAgIHYxOC5kWzFdLCB2MTkuZFswXSAgLyogMTI4IGJpdCBxOSAqLworICAgIGxkMSAgICAgICAgICAgICB7djI0LjRoLCB2MjUuNGgsIHYyNi40aCwgdjI3LjRofSwgW0NPRUZfQkxPQ0tdLCAzMgorICAgIG11bCAgICAgICAgICAgICB2MjAuNGgsIHYyMC40aCwgdjQuNGgKKyAgICBtdWwgICAgICAgICAgICAgdjIxLjRoLCB2MjEuNGgsIHY1LjRoCisgICAgaW5zICAgICAgICAgICAgIHYyMC5kWzFdLCB2MjEuZFswXSAgLyogMTI4IGJpdCBxMTAgKi8KKyAgICBsZDEgICAgICAgICAgICAge3YwLjRoLCB2MS40aCwgdjIuNGgsIHYzLjRofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbXVsICAgICAgICAgICAgIHYyMi40aCwgdjIyLjRoLCB2Ni40aAorICAgIG11bCAgICAgICAgICAgICB2MjMuNGgsIHYyMy40aCwgdjcuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjIyLmRbMV0sIHYyMy5kWzBdICAvKiAxMjggYml0IHExMSAqLworICAgIGxkMSAgICAgICAgICAgICB7djI4LjRoLCB2MjkuNGgsIHYzMC40aCwgdjMxLjRofSwgW0NPRUZfQkxPQ0tdCisgICAgbXVsICAgICAgICAgICAgIHYyNC40aCwgdjI0LjRoLCB2MC40aAorICAgIG11bCAgICAgICAgICAgICB2MjUuNGgsIHYyNS40aCwgdjEuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjI0LmRbMV0sIHYyNS5kWzBdICAvKiAxMjggYml0IHExMiAqLworICAgIGxkMSAgICAgICAgICAgICB7djQuNGgsIHY1LjRoLCB2Ni40aCwgdjcuNGh9LCBbRENUX1RBQkxFXSwgMzIKKyAgICBtdWwgICAgICAgICAgICAgdjI4LjRoLCB2MjguNGgsIHY0LjRoCisgICAgbXVsICAgICAgICAgICAgIHYyOS40aCwgdjI5LjRoLCB2NS40aAorICAgIGlucyAgICAgICAgICAgICB2MjguZFsxXSwgdjI5LmRbMF0gIC8qIDEyOCBiaXQgcTE0ICovCisgICAgbXVsICAgICAgICAgICAgIHYyNi40aCwgdjI2LjRoLCB2Mi40aAorICAgIG11bCAgICAgICAgICAgICB2MjcuNGgsIHYyNy40aCwgdjMuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjI2LmRbMV0sIHYyNy5kWzBdICAvKiAxMjggYml0IHExMyAqLworICAgIGxkMSAgICAgICAgICAgICB7djAuNGgsIHYxLjRoLCB2Mi40aCwgdjMuNGh9LCBbeDE1XSAgLyogbG9hZCBjb25zdGFudHMgKi8KKyAgICBhZGQgICAgICAgICAgICAgeDE1LCB4MTUsICMxNgorICAgIG11bCAgICAgICAgICAgICB2MzAuNGgsIHYzMC40aCwgdjYuNGgKKyAgICBtdWwgICAgICAgICAgICAgdjMxLjRoLCB2MzEuNGgsIHY3LjRoCisgICAgaW5zICAgICAgICAgICAgIHYzMC5kWzFdLCB2MzEuZFswXSAgLyogMTI4IGJpdCBxMTUgKi8KKyAgICAvKiBHbyB0byB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLworICAgIHN1YiAgICAgICAgICAgICBzcCwgc3AsIDM1MgorICAgIHN0cCAgICAgICAgICAgICB4NCwgeDUsIFtzcF0sIDE2CisgICAgc3QxICAgICAgICAgICAgIHt2OC40aCwgdjkuNGgsIHYxMC40aCwgdjExLjRofSwgW3NwXSwgMzIgIC8qIHNhdmUgTkVPTiByZWdpc3RlcnMgKi8KKyAgICBzdDEgICAgICAgICAgICAge3YxMi40aCwgdjEzLjRoLCB2MTQuNGgsIHYxNS40aH0sIFtzcF0sIDMyCisgICAgLyogMS1EIElEQ1QsIHBhc3MgMSwgbGVmdCA0eDggaGFsZiAqLworICAgIGFkZCAgICAgICAgICAgICB2NC40aCwgICAgUk9XN0wuNGgsIFJPVzNMLjRoCisgICAgYWRkICAgICAgICAgICAgIHY1LjRoLCAgICBST1c1TC40aCwgUk9XMUwuNGgKKyAgICBzbXVsbCAgICAgICAgICAgdjEyLjRzLCAgIHY0LjRoLCAgICBYRklYXzFfMTc1ODc1NjAyX01JTlVTXzFfOTYxNTcwNTYwCisgICAgc21sYWwgICAgICAgICAgIHYxMi40cywgICB2NS40aCwgICAgWEZJWF8xXzE3NTg3NTYwMgorICAgIHNtdWxsICAgICAgICAgICB2MTQuNHMsICAgdjQuNGgsICAgIFhGSVhfMV8xNzU4NzU2MDIKKyAgICAvKiBDaGVjayBmb3IgdGhlIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSByaWdodCA0eDggaGFsZiAqLworICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgdjUuNGgsICAgIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMF8zOTAxODA2NDQKKyAgICBzc3VibCAgICAgICAgICAgdjYuNHMsICAgIFJPVzBMLjRoLCBST1c0TC40aAorICAgICAgbGRwICAgICAgICAgICB3NCwgICAgICAgdzUsICAgICAgIFtDT0VGX0JMT0NLLCAjKC05NiArIDIgKiAoNCArIDEgKiA4KSldCisgICAgc211bGwgICAgICAgICAgIHY0LjRzLCAgICBST1cyTC40aCwgWEZJWF8wXzU0MTE5NjEwMAorICAgIHNtbGFsICAgICAgICAgICB2NC40cywgICAgUk9XNkwuNGgsIFhGSVhfMF81NDExOTYxMDBfTUlOVVNfMV84NDc3NTkwNjUKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHg0LCAgICAgICB4NQorICAgIG1vdiAgICAgICAgICAgICB2OC4xNmIsICAgdjEyLjE2YgorICAgIHNtbHNsICAgICAgICAgICB2MTIuNHMsICAgUk9XNUwuNGgsIFhGSVhfMl81NjI5MTU0NDcKKyAgICAgIGxkcCAgICAgICAgICAgdzQsICAgICAgIHc1LCAgICAgICBbQ09FRl9CTE9DSywgIygtOTYgKyAyICogKDQgKyAyICogOCkpXQorICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XM0wuNGgsIFhGSVhfM18wNzI3MTEwMjZfTUlOVVNfMl81NjI5MTU0NDcKKyAgICBzaGwgICAgICAgICAgICAgdjYuNHMsICAgIHY2LjRzLCAgICAjMTMKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NAorICAgIHNtbHNsICAgICAgICAgICB2OC40cywgICAgUk9XMUwuNGgsIFhGSVhfMF84OTk5NzYyMjMKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwICwgICAgICB4NQorICAgIGFkZCAgICAgICAgICAgICB2Mi40cywgICAgdjYuNHMsICAgIHY0LjRzCisgICAgICBsZHAgICAgICAgICAgIHc0LCAgICAgICB3NSwgICAgICAgW0NPRUZfQkxPQ0ssICMoLTk2ICsgMiAqICg0ICsgMyAqIDgpKV0KKyAgICBtb3YgICAgICAgICAgICAgdjEwLjE2YiwgIHYxNC4xNmIKKyAgICBhZGQgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NAorICAgIHNtbHNsICAgICAgICAgICB2MTQuNHMsICAgUk9XN0wuNGgsIFhGSVhfMF84OTk5NzYyMjMKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NQorICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XMUwuNGgsIFhGSVhfMV81MDEzMjExMTBfTUlOVVNfMF84OTk5NzYyMjMKKyAgICByc2hybiAgICAgICAgICAgUk9XMUwuNGgsIHYyLjRzLCAgICAjMTEKKyAgICAgIGxkcCAgICAgICAgICAgdzQsICAgICAgIHc1LCAgICAgICBbQ09FRl9CTE9DSywgIygtOTYgKyAyICogKDQgKyA0ICogOCkpXQorICAgIHN1YiAgICAgICAgICAgICB2Mi40cywgICAgdjIuNHMsICAgIHYxMi40cworICAgIHNtbGFsICAgICAgICAgICB2MTAuNHMsICAgUk9XNUwuNGgsIFhGSVhfMl8wNTMxMTk4NjlfTUlOVVNfMl81NjI5MTU0NDcKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NAorICAgIHNtbHNsICAgICAgICAgICB2MTAuNHMsICAgUk9XM0wuNGgsIFhGSVhfMl81NjI5MTU0NDcKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NQorICAgIHN1YiAgICAgICAgICAgICB2Mi40cywgICAgdjIuNHMsICAgIHYxMi40cworICAgIHNtdWxsICAgICAgICAgICB2MTIuNHMsICAgUk9XMkwuNGgsIFhGSVhfMF81NDExOTYxMDBfUExVU18wXzc2NTM2Njg2NQorICAgICAgbGRwICAgICAgICAgICB3NCwgICAgICAgdzUsICAgICAgIFtDT0VGX0JMT0NLLCAjKC05NiArIDIgKiAoNCArIDUgKiA4KSldCisgICAgc21sYWwgICAgICAgICAgIHYxMi40cywgICBST1c2TC40aCwgWEZJWF8wXzU0MTE5NjEwMAorICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHY0LjRzCisgICAgICBvcnIgICAgICAgICAgIHgwLCAgICAgICB4MCwgICAgICAgeDQKKyAgICByc2hybiAgICAgICAgICAgUk9XNkwuNGgsIHYyLjRzLCAgICAjMTEKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NQorICAgIGFkZCAgICAgICAgICAgICB2Mi40cywgICAgdjYuNHMsICAgIHYxMC40cworICAgICAgbGRwICAgICAgICAgICB3NCwgICAgICAgdzUsICAgICAgIFtDT0VGX0JMT0NLLCAjKC05NiArIDIgKiAoNCArIDYgKiA4KSldCisgICAgc3ViICAgICAgICAgICAgIHY2LjRzLCAgICB2Ni40cywgICAgdjEwLjRzCisgICAgc2FkZGwgICAgICAgICAgIHYxMC40cywgICBST1cwTC40aCwgUk9XNEwuNGgKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NAorICAgIHJzaHJuICAgICAgICAgICBST1cyTC40aCwgdjIuNHMsICAgICMxMQorICAgICAgb3JyICAgICAgICAgICB4MCwgICAgICAgeDAsICAgICAgIHg1CisgICAgcnNocm4gICAgICAgICAgIFJPVzVMLjRoLCB2Ni40cywgICAgIzExCisgICAgICBsZHAgICAgICAgICAgIHc0LCAgICAgICB3NSwgICAgICAgW0NPRUZfQkxPQ0ssICMoLTk2ICsgMiAqICg0ICsgNyAqIDgpKV0KKyAgICBzaGwgICAgICAgICAgICAgdjEwLjRzLCAgIHYxMC40cywgICAjMTMKKyAgICBzbWxhbCAgICAgICAgICAgdjguNHMsICAgIFJPVzdMLjRoLCBYRklYXzBfMjk4NjMxMzM2X01JTlVTXzBfODk5OTc2MjIzCisgICAgICBvcnIgICAgICAgICAgIHgwLCAgICAgICB4MCwgICAgICAgeDQKKyAgICBhZGQgICAgICAgICAgICAgdjQuNHMsICAgIHYxMC40cywgICB2MTIuNHMKKyAgICAgIG9yciAgICAgICAgICAgeDAsICAgICAgIHgwLCAgICAgICB4NQorICAgIGNtcCAgICAgICAgICAgICB4MCwgIzAgLyogb3JycyBpbnN0cnVjdGlvbiByZW1vdmVkICovCisgICAgc3ViICAgICAgICAgICAgIHYyLjRzLCAgICB2MTAuNHMsICAgdjEyLjRzCisgICAgYWRkICAgICAgICAgICAgIHYxMi40cywgICB2NC40cywgICAgdjE0LjRzCisgICAgICBsZHAgICAgICAgICAgIHc0LCAgICAgICB3NSwgICAgICAgW0NPRUZfQkxPQ0ssICMoLTk2ICsgMiAqICg0ICsgMCAqIDgpKV0KKyAgICBzdWIgICAgICAgICAgICAgdjQuNHMsICAgIHY0LjRzLCAgICB2MTQuNHMKKyAgICBhZGQgICAgICAgICAgICAgdjEwLjRzLCAgIHYyLjRzLCAgICB2OC40cworICAgICAgb3JyICAgICAgICAgICB4MCwgICAgICAgeDQsICAgICAgIHg1CisgICAgc3ViICAgICAgICAgICAgIHY2LjRzLCAgICB2Mi40cywgICAgdjguNHMKKyAgICAgIC8qIHBvcCAgICAgICAgICAgICB7eDQsIHg1fSAqLworICAgICAgc3ViICAgICAgICAgICBzcCwgc3AsIDgwCisgICAgICBsZHAgICAgICAgICAgIHg0LCB4NSwgW3NwXSwgMTYKKyAgICByc2hybiAgICAgICAgICAgUk9XN0wuNGgsIHY0LjRzLCAgICAjMTEKKyAgICByc2hybiAgICAgICAgICAgUk9XM0wuNGgsIHYxMC40cywgICAjMTEKKyAgICByc2hybiAgICAgICAgICAgUk9XMEwuNGgsIHYxMi40cywgICAjMTEKKyAgICByc2hybiAgICAgICAgICAgUk9XNEwuNGgsIHY2LjRzLCAgICAjMTEKKworICAgICAgYi5lcSAgICAgICAgICAzZiAvKiBHbyB0byBkbyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBzcGFyc2UgcmlnaHQgNHg4IGhhbGYgKi8KKworICAgIC8qIDEtRCBJRENULCBwYXNzIDEsIHJpZ2h0IDR4OCBoYWxmICovCisgICAgbGQxICAgICAgICAgICAgIHt2Mi40aH0sICBbeDE1XSAgICAvKiByZWxvYWQgY29uc3RhbnRzICovCisgICAgYWRkICAgICAgICAgICAgIHYxMC40aCwgICBST1c3Ui40aCwgUk9XM1IuNGgKKyAgICBhZGQgICAgICAgICAgICAgdjguNGgsICAgIFJPVzVSLjRoLCBST1cxUi40aAorICAgIC8qIFRyYW5zcG9zZSBST1c2TCA8LT4gUk9XN0wgICAodjMgYXZhaWxhYmxlIGZyZWUgcmVnaXN0ZXIpICovCisgICAgdHJhbnNwb3NlICAgICAgIFJPVzZMLCBST1c3TCwgdjMsIC4xNmIsIC40aAorICAgIHNtdWxsICAgICAgICAgICB2MTIuNHMsICAgdjEwLjRoLCAgIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMV85NjE1NzA1NjAKKyAgICBzbWxhbCAgICAgICAgICAgdjEyLjRzLCAgIHY4LjRoLCAgICBYRklYXzFfMTc1ODc1NjAyCisgICAgLyogVHJhbnNwb3NlIFJPVzJMIDwtPiBST1czTCAgICh2MyBhdmFpbGFibGUgZnJlZSByZWdpc3RlcikgKi8KKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XMkwsIFJPVzNMLCB2MywgLjE2YiwgLjRoCisgICAgc211bGwgICAgICAgICAgIHYxNC40cywgICB2MTAuNGgsICAgWEZJWF8xXzE3NTg3NTYwMgorICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgdjguNGgsICAgIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMF8zOTAxODA2NDQKKyAgICAvKiBUcmFuc3Bvc2UgUk9XMEwgPC0+IFJPVzFMICAgKHYzIGF2YWlsYWJsZSBmcmVlIHJlZ2lzdGVyKSAqLworICAgIHRyYW5zcG9zZSAgICAgICBST1cwTCwgUk9XMUwsIHYzLCAuMTZiLCAuNGgKKyAgICBzc3VibCAgICAgICAgICAgdjYuNHMsICAgIFJPVzBSLjRoLCBST1c0Ui40aAorICAgIHNtdWxsICAgICAgICAgICB2NC40cywgICAgUk9XMlIuNGgsIFhGSVhfMF81NDExOTYxMDAKKyAgICBzbWxhbCAgICAgICAgICAgdjQuNHMsICAgIFJPVzZSLjRoLCBYRklYXzBfNTQxMTk2MTAwX01JTlVTXzFfODQ3NzU5MDY1CisgICAgLyogVHJhbnNwb3NlIFJPVzRMIDwtPiBST1c1TCAgICh2MyBhdmFpbGFibGUgZnJlZSByZWdpc3RlcikgKi8KKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XNEwsIFJPVzVMLCB2MywgLjE2YiwgLjRoCisgICAgbW92ICAgICAgICAgICAgIHY4LjE2YiwgICB2MTIuMTZiCisgICAgc21sc2wgICAgICAgICAgIHYxMi40cywgICBST1c1Ui40aCwgWEZJWF8yXzU2MjkxNTQ0NworICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XM1IuNGgsIFhGSVhfM18wNzI3MTEwMjZfTUlOVVNfMl81NjI5MTU0NDcKKyAgICAvKiBUcmFuc3Bvc2UgUk9XMUwgPC0+IFJPVzNMICAgKHYzIGF2YWlsYWJsZSBmcmVlIHJlZ2lzdGVyKSAqLworICAgIHRyYW5zcG9zZSAgICAgICBST1cxTCwgUk9XM0wsIHYzLCAuMTZiLCAuMnMKKyAgICBzaGwgICAgICAgICAgICAgdjYuNHMsICAgIHY2LjRzLCAgICAjMTMKKyAgICBzbWxzbCAgICAgICAgICAgdjguNHMsICAgIFJPVzFSLjRoLCBYRklYXzBfODk5OTc2MjIzCisgICAgLyogVHJhbnNwb3NlIFJPVzRMIDwtPiBST1c2TCAgICh2MyBhdmFpbGFibGUgZnJlZSByZWdpc3RlcikgKi8KKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XNEwsIFJPVzZMLCB2MywgLjE2YiwgLjJzCisgICAgYWRkICAgICAgICAgICAgIHYyLjRzLCAgICB2Ni40cywgICAgdjQuNHMKKyAgICBtb3YgICAgICAgICAgICAgdjEwLjE2YiwgIHYxNC4xNmIKKyAgICBhZGQgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICAvKiBUcmFuc3Bvc2UgUk9XMEwgPC0+IFJPVzJMICAgKHYzIGF2YWlsYWJsZSBmcmVlIHJlZ2lzdGVyKSAqLworICAgIHRyYW5zcG9zZSAgICAgICBST1cwTCwgUk9XMkwsIHYzLCAuMTZiLCAuMnMKKyAgICBzbWxzbCAgICAgICAgICAgdjE0LjRzLCAgIFJPVzdSLjRoLCBYRklYXzBfODk5OTc2MjIzCisgICAgc21sYWwgICAgICAgICAgIHYxNC40cywgICBST1cxUi40aCwgWEZJWF8xXzUwMTMyMTExMF9NSU5VU18wXzg5OTk3NjIyMworICAgIHJzaHJuICAgICAgICAgICBST1cxUi40aCwgdjIuNHMsICAgICMxMQorICAgIC8qIFRyYW5zcG9zZSBST1c1TCA8LT4gUk9XN0wgICAodjMgYXZhaWxhYmxlIGZyZWUgcmVnaXN0ZXIpICovCisgICAgdHJhbnNwb3NlICAgICAgIFJPVzVMLCBST1c3TCwgdjMsIC4xNmIsIC4ycworICAgIHN1YiAgICAgICAgICAgICB2Mi40cywgICAgdjIuNHMsICAgIHYxMi40cworICAgIHNtbGFsICAgICAgICAgICB2MTAuNHMsICAgUk9XNVIuNGgsIFhGSVhfMl8wNTMxMTk4NjlfTUlOVVNfMl81NjI5MTU0NDcKKyAgICBzbWxzbCAgICAgICAgICAgdjEwLjRzLCAgIFJPVzNSLjRoLCBYRklYXzJfNTYyOTE1NDQ3CisgICAgc3ViICAgICAgICAgICAgIHYyLjRzLCAgICB2Mi40cywgICAgdjEyLjRzCisgICAgc211bGwgICAgICAgICAgIHYxMi40cywgICBST1cyUi40aCwgWEZJWF8wXzU0MTE5NjEwMF9QTFVTXzBfNzY1MzY2ODY1CisgICAgc21sYWwgICAgICAgICAgIHYxMi40cywgICBST1c2Ui40aCwgWEZJWF8wXzU0MTE5NjEwMAorICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHY0LjRzCisgICAgcnNocm4gICAgICAgICAgIFJPVzZSLjRoLCB2Mi40cywgICAgIzExCisgICAgYWRkICAgICAgICAgICAgIHYyLjRzLCAgICB2Ni40cywgICAgdjEwLjRzCisgICAgc3ViICAgICAgICAgICAgIHY2LjRzLCAgICB2Ni40cywgICAgdjEwLjRzCisgICAgc2FkZGwgICAgICAgICAgIHYxMC40cywgICBST1cwUi40aCwgUk9XNFIuNGgKKyAgICByc2hybiAgICAgICAgICAgUk9XMlIuNGgsIHYyLjRzLCAgICAjMTEKKyAgICByc2hybiAgICAgICAgICAgUk9XNVIuNGgsIHY2LjRzLCAgICAjMTEKKyAgICBzaGwgICAgICAgICAgICAgdjEwLjRzLCAgIHYxMC40cywgICAjMTMKKyAgICBzbWxhbCAgICAgICAgICAgdjguNHMsICAgIFJPVzdSLjRoLCBYRklYXzBfMjk4NjMxMzM2X01JTlVTXzBfODk5OTc2MjIzCisgICAgYWRkICAgICAgICAgICAgIHY0LjRzLCAgICB2MTAuNHMsICAgdjEyLjRzCisgICAgc3ViICAgICAgICAgICAgIHYyLjRzLCAgICB2MTAuNHMsICAgdjEyLjRzCisgICAgYWRkICAgICAgICAgICAgIHYxMi40cywgICB2NC40cywgICAgdjE0LjRzCisgICAgc3ViICAgICAgICAgICAgIHY0LjRzLCAgICB2NC40cywgICAgdjE0LjRzCisgICAgYWRkICAgICAgICAgICAgIHYxMC40cywgICB2Mi40cywgICAgdjguNHMKKyAgICBzdWIgICAgICAgICAgICAgdjYuNHMsICAgIHYyLjRzLCAgICB2OC40cworICAgIHJzaHJuICAgICAgICAgICBST1c3Ui40aCwgdjQuNHMsICAgICMxMQorICAgIHJzaHJuICAgICAgICAgICBST1czUi40aCwgdjEwLjRzLCAgICMxMQorICAgIHJzaHJuICAgICAgICAgICBST1cwUi40aCwgdjEyLjRzLCAgICMxMQorICAgIHJzaHJuICAgICAgICAgICBST1c0Ui40aCwgdjYuNHMsICAgICMxMQorICAgIC8qIFRyYW5zcG9zZSByaWdodCA0eDggaGFsZiAqLworICAgIHRyYW5zcG9zZSAgICAgICBST1c2UiwgUk9XN1IsIHYzLCAuMTZiLCAuNGgKKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XMlIsIFJPVzNSLCB2MywgLjE2YiwgLjRoCisgICAgdHJhbnNwb3NlICAgICAgIFJPVzBSLCBST1cxUiwgdjMsIC4xNmIsIC40aAorICAgIHRyYW5zcG9zZSAgICAgICBST1c0UiwgUk9XNVIsIHYzLCAuMTZiLCAuNGgKKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XMVIsIFJPVzNSLCB2MywgLjE2YiwgLjJzCisgICAgdHJhbnNwb3NlICAgICAgIFJPVzRSLCBST1c2UiwgdjMsIC4xNmIsIC4ycworICAgIHRyYW5zcG9zZSAgICAgICBST1cwUiwgUk9XMlIsIHYzLCAuMTZiLCAuMnMKKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XNVIsIFJPVzdSLCB2MywgLjE2YiwgLjJzCisKKzE6ICAvKiAxLUQgSURDVCwgcGFzcyAyIChub3JtYWwgdmFyaWFudCksIGxlZnQgNHg4IGhhbGYgKi8KKyAgICBsZDEgICAgICAgICAgICAge3YyLjRofSwgIFt4MTVdICAgIC8qIHJlbG9hZCBjb25zdGFudHMgKi8KKyAgICBzbXVsbCAgICAgICAgICAgdjEyLjRTLCAgIFJPVzFSLjRoLCBYRklYXzFfMTc1ODc1NjAyIC8qIFJPVzVMLjRoIDwtPiBST1cxUi40aCAqLworICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XMUwuNGgsIFhGSVhfMV8xNzU4NzU2MDIKKyAgICBzbWxhbCAgICAgICAgICAgdjEyLjRzLCAgIFJPVzNSLjRoLCBYRklYXzFfMTc1ODc1NjAyX01JTlVTXzFfOTYxNTcwNTYwIC8qIFJPVzdMLjRoIDwtPiBST1czUi40aCAqLworICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XM0wuNGgsIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMV85NjE1NzA1NjAKKyAgICBzbXVsbCAgICAgICAgICAgdjE0LjRzLCAgIFJPVzNSLjRoLCBYRklYXzFfMTc1ODc1NjAyIC8qIFJPVzdMLjRoIDwtPiBST1czUi40aCAqLworICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XM0wuNGgsIFhGSVhfMV8xNzU4NzU2MDIKKyAgICBzbWxhbCAgICAgICAgICAgdjE0LjRzLCAgIFJPVzFSLjRoLCBYRklYXzFfMTc1ODc1NjAyX01JTlVTXzBfMzkwMTgwNjQ0IC8qIFJPVzVMLjRoIDwtPiBST1cxUi40aCAqLworICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XMUwuNGgsIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMF8zOTAxODA2NDQKKyAgICBzc3VibCAgICAgICAgICAgdjYuNHMsICAgIFJPVzBMLjRoLCBST1cwUi40aCAvKiBST1c0TC40aCA8LT4gUk9XMFIuNGggKi8KKyAgICBzbXVsbCAgICAgICAgICAgdjQuNHMsICAgIFJPVzJMLjRoLCBYRklYXzBfNTQxMTk2MTAwCisgICAgc21sYWwgICAgICAgICAgIHY0LjRzLCAgICBST1cyUi40aCwgWEZJWF8wXzU0MTE5NjEwMF9NSU5VU18xXzg0Nzc1OTA2NSAvKiBST1c2TC40aCA8LT4gUk9XMlIuNGggKi8KKyAgICBtb3YgICAgICAgICAgICAgdjguMTZiLCAgIHYxMi4xNmIKKyAgICBzbWxzbCAgICAgICAgICAgdjEyLjRzLCAgIFJPVzFSLjRoLCBYRklYXzJfNTYyOTE1NDQ3IC8qIFJPVzVMLjRoIDwtPiBST1cxUi40aCAqLworICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XM0wuNGgsIFhGSVhfM18wNzI3MTEwMjZfTUlOVVNfMl81NjI5MTU0NDcKKyAgICBzaGwgICAgICAgICAgICAgdjYuNHMsICAgIHY2LjRzLCAgICAjMTMKKyAgICBzbWxzbCAgICAgICAgICAgdjguNHMsICAgIFJPVzFMLjRoLCBYRklYXzBfODk5OTc2MjIzCisgICAgYWRkICAgICAgICAgICAgIHYyLjRzLCAgICB2Ni40cywgICAgdjQuNHMKKyAgICBtb3YgICAgICAgICAgICAgdjEwLjE2YiwgIHYxNC4xNmIKKyAgICBhZGQgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICBzbWxzbCAgICAgICAgICAgdjE0LjRzLCAgIFJPVzNSLjRoLCBYRklYXzBfODk5OTc2MjIzIC8qIFJPVzdMLjRoIDwtPiBST1czUi40aCAqLworICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XMUwuNGgsIFhGSVhfMV81MDEzMjExMTBfTUlOVVNfMF84OTk5NzYyMjMKKyAgICBzaHJuICAgICAgICAgICAgUk9XMUwuNGgsIHYyLjRzLCAgICAjMTYKKyAgICBzdWIgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICBzbWxhbCAgICAgICAgICAgdjEwLjRzLCAgIFJPVzFSLjRoLCBYRklYXzJfMDUzMTE5ODY5X01JTlVTXzJfNTYyOTE1NDQ3IC8qIFJPVzVMLjRoIDwtPiBST1cxUi40aCAqLworICAgIHNtbHNsICAgICAgICAgICB2MTAuNHMsICAgUk9XM0wuNGgsIFhGSVhfMl81NjI5MTU0NDcKKyAgICBzdWIgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICBzbXVsbCAgICAgICAgICAgdjEyLjRzLCAgIFJPVzJMLjRoLCBYRklYXzBfNTQxMTk2MTAwX1BMVVNfMF83NjUzNjY4NjUKKyAgICBzbWxhbCAgICAgICAgICAgdjEyLjRzLCAgIFJPVzJSLjRoLCBYRklYXzBfNTQxMTk2MTAwIC8qIFJPVzZMLjRoIDwtPiBST1cyUi40aCAqLworICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHY0LjRzCisgICAgc2hybiAgICAgICAgICAgIFJPVzJSLjRoLCB2Mi40cywgICAgIzE2IC8qIFJPVzZMLjRoIDwtPiBST1cyUi40aCAqLworICAgIGFkZCAgICAgICAgICAgICB2Mi40cywgICAgdjYuNHMsICAgIHYxMC40cworICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHYxMC40cworICAgIHNhZGRsICAgICAgICAgICB2MTAuNHMsICAgUk9XMEwuNGgsIFJPVzBSLjRoIC8qIFJPVzRMLjRoIDwtPiBST1cwUi40aCAqLworICAgIHNocm4gICAgICAgICAgICBST1cyTC40aCwgdjIuNHMsICAgICMxNgorICAgIHNocm4gICAgICAgICAgICBST1cxUi40aCwgdjYuNHMsICAgICMxNiAvKiBST1c1TC40aCA8LT4gUk9XMVIuNGggKi8KKyAgICBzaGwgICAgICAgICAgICAgdjEwLjRzLCAgIHYxMC40cywgICAjMTMKKyAgICBzbWxhbCAgICAgICAgICAgdjguNHMsICAgIFJPVzNSLjRoLCBYRklYXzBfMjk4NjMxMzM2X01JTlVTXzBfODk5OTc2MjIzIC8qIFJPVzdMLjRoIDwtPiBST1czUi40aCAqLworICAgIGFkZCAgICAgICAgICAgICB2NC40cywgICAgdjEwLjRzLCAgIHYxMi40cworICAgIHN1YiAgICAgICAgICAgICB2Mi40cywgICAgdjEwLjRzLCAgIHYxMi40cworICAgIGFkZCAgICAgICAgICAgICB2MTIuNHMsICAgdjQuNHMsICAgIHYxNC40cworICAgIHN1YiAgICAgICAgICAgICB2NC40cywgICAgdjQuNHMsICAgIHYxNC40cworICAgIGFkZCAgICAgICAgICAgICB2MTAuNHMsICAgdjIuNHMsICAgIHY4LjRzCisgICAgc3ViICAgICAgICAgICAgIHY2LjRzLCAgICB2Mi40cywgICAgdjguNHMKKyAgICBzaHJuICAgICAgICAgICAgUk9XM1IuNGgsIHY0LjRzLCAgICAjMTYgLyogUk9XN0wuNGggPC0+IFJPVzNSLjRoICovCisgICAgc2hybiAgICAgICAgICAgIFJPVzNMLjRoLCB2MTAuNHMsICAgIzE2CisgICAgc2hybiAgICAgICAgICAgIFJPVzBMLjRoLCB2MTIuNHMsICAgIzE2CisgICAgc2hybiAgICAgICAgICAgIFJPVzBSLjRoLCB2Ni40cywgICAgIzE2IC8qIFJPVzRMLjRoIDwtPiBST1cwUi40aCAqLworICAgIC8qIDEtRCBJRENULCBwYXNzIDIsIHJpZ2h0IDR4OCBoYWxmICovCisgICAgbGQxICAgICAgICAgICAgIHt2Mi40aH0sICBbeDE1XSAgICAvKiByZWxvYWQgY29uc3RhbnRzICovCisgICAgc211bGwgICAgICAgICAgIHYxMi40cywgICBST1c1Ui40aCwgWEZJWF8xXzE3NTg3NTYwMgorICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XNUwuNGgsIFhGSVhfMV8xNzU4NzU2MDIgLyogUk9XNUwuNGggPC0+IFJPVzFSLjRoICovCisgICAgc21sYWwgICAgICAgICAgIHYxMi40cywgICBST1c3Ui40aCwgWEZJWF8xXzE3NTg3NTYwMl9NSU5VU18xXzk2MTU3MDU2MAorICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XN0wuNGgsIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMV85NjE1NzA1NjAgLyogUk9XN0wuNGggPC0+IFJPVzNSLjRoICovCisgICAgc211bGwgICAgICAgICAgIHYxNC40cywgICBST1c3Ui40aCwgWEZJWF8xXzE3NTg3NTYwMgorICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XN0wuNGgsIFhGSVhfMV8xNzU4NzU2MDIgLyogUk9XN0wuNGggPC0+IFJPVzNSLjRoICovCisgICAgc21sYWwgICAgICAgICAgIHYxNC40cywgICBST1c1Ui40aCwgWEZJWF8xXzE3NTg3NTYwMl9NSU5VU18wXzM5MDE4MDY0NAorICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XNUwuNGgsIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMF8zOTAxODA2NDQgLyogUk9XNUwuNGggPC0+IFJPVzFSLjRoICovCisgICAgc3N1YmwgICAgICAgICAgIHY2LjRzLCAgICBST1c0TC40aCwgUk9XNFIuNGggLyogUk9XNEwuNGggPC0+IFJPVzBSLjRoICovCisgICAgc211bGwgICAgICAgICAgIHY0LjRzLCAgICBST1c2TC40aCwgWEZJWF8wXzU0MTE5NjEwMCAvKiBST1c2TC40aCA8LT4gUk9XMlIuNGggKi8KKyAgICBzbWxhbCAgICAgICAgICAgdjQuNHMsICAgIFJPVzZSLjRoLCBYRklYXzBfNTQxMTk2MTAwX01JTlVTXzFfODQ3NzU5MDY1CisgICAgbW92ICAgICAgICAgICAgIHY4LjE2YiwgICB2MTIuMTZiCisgICAgc21sc2wgICAgICAgICAgIHYxMi40cywgICBST1c1Ui40aCwgWEZJWF8yXzU2MjkxNTQ0NworICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XN0wuNGgsIFhGSVhfM18wNzI3MTEwMjZfTUlOVVNfMl81NjI5MTU0NDcgLyogUk9XN0wuNGggPC0+IFJPVzNSLjRoICovCisgICAgc2hsICAgICAgICAgICAgIHY2LjRzLCAgICB2Ni40cywgICAgIzEzCisgICAgc21sc2wgICAgICAgICAgIHY4LjRzLCAgICBST1c1TC40aCwgWEZJWF8wXzg5OTk3NjIyMyAvKiBST1c1TC40aCA8LT4gUk9XMVIuNGggKi8KKyAgICBhZGQgICAgICAgICAgICAgdjIuNHMsICAgIHY2LjRzLCAgICB2NC40cworICAgIG1vdiAgICAgICAgICAgICB2MTAuMTZiLCAgdjE0LjE2YgorICAgIGFkZCAgICAgICAgICAgICB2Mi40cywgICAgdjIuNHMsICAgIHYxMi40cworICAgIHNtbHNsICAgICAgICAgICB2MTQuNHMsICAgUk9XN1IuNGgsIFhGSVhfMF84OTk5NzYyMjMKKyAgICBzbWxhbCAgICAgICAgICAgdjE0LjRzLCAgIFJPVzVMLjRoLCBYRklYXzFfNTAxMzIxMTEwX01JTlVTXzBfODk5OTc2MjIzIC8qIFJPVzVMLjRoIDwtPiBST1cxUi40aCAqLworICAgIHNocm4gICAgICAgICAgICBST1c1TC40aCwgdjIuNHMsICAgICMxNiAvKiBST1c1TC40aCA8LT4gUk9XMVIuNGggKi8KKyAgICBzdWIgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICBzbWxhbCAgICAgICAgICAgdjEwLjRzLCAgIFJPVzVSLjRoLCBYRklYXzJfMDUzMTE5ODY5X01JTlVTXzJfNTYyOTE1NDQ3CisgICAgc21sc2wgICAgICAgICAgIHYxMC40cywgICBST1c3TC40aCwgWEZJWF8yXzU2MjkxNTQ0NyAvKiBST1c3TC40aCA8LT4gUk9XM1IuNGggKi8KKyAgICBzdWIgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICBzbXVsbCAgICAgICAgICAgdjEyLjRzLCAgIFJPVzZMLjRoLCBYRklYXzBfNTQxMTk2MTAwX1BMVVNfMF83NjUzNjY4NjUgLyogUk9XNkwuNGggPC0+IFJPVzJSLjRoICovCisgICAgc21sYWwgICAgICAgICAgIHYxMi40cywgICBST1c2Ui40aCwgWEZJWF8wXzU0MTE5NjEwMAorICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHY0LjRzCisgICAgc2hybiAgICAgICAgICAgIFJPVzZSLjRoLCB2Mi40cywgICAgIzE2CisgICAgYWRkICAgICAgICAgICAgIHYyLjRzLCAgICB2Ni40cywgICAgdjEwLjRzCisgICAgc3ViICAgICAgICAgICAgIHY2LjRzLCAgICB2Ni40cywgICAgdjEwLjRzCisgICAgc2FkZGwgICAgICAgICAgIHYxMC40cywgICBST1c0TC40aCwgUk9XNFIuNGggLyogUk9XNEwuNGggPC0+IFJPVzBSLjRoICovCisgICAgc2hybiAgICAgICAgICAgIFJPVzZMLjRoLCB2Mi40cywgICAgIzE2IC8qIFJPVzZMLjRoIDwtPiBST1cyUi40aCAqLworICAgIHNocm4gICAgICAgICAgICBST1c1Ui40aCwgdjYuNHMsICAgICMxNgorICAgIHNobCAgICAgICAgICAgICB2MTAuNHMsICAgdjEwLjRzLCAgICMxMworICAgIHNtbGFsICAgICAgICAgICB2OC40cywgICAgUk9XN1IuNGgsIFhGSVhfMF8yOTg2MzEzMzZfTUlOVVNfMF84OTk5NzYyMjMKKyAgICBhZGQgICAgICAgICAgICAgdjQuNHMsICAgIHYxMC40cywgICB2MTIuNHMKKyAgICBzdWIgICAgICAgICAgICAgdjIuNHMsICAgIHYxMC40cywgICB2MTIuNHMKKyAgICBhZGQgICAgICAgICAgICAgdjEyLjRzLCAgIHY0LjRzLCAgICB2MTQuNHMKKyAgICBzdWIgICAgICAgICAgICAgdjQuNHMsICAgIHY0LjRzLCAgICB2MTQuNHMKKyAgICBhZGQgICAgICAgICAgICAgdjEwLjRzLCAgIHYyLjRzLCAgICB2OC40cworICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjIuNHMsICAgIHY4LjRzCisgICAgc2hybiAgICAgICAgICAgIFJPVzdSLjRoLCB2NC40cywgICAgIzE2CisgICAgc2hybiAgICAgICAgICAgIFJPVzdMLjRoLCB2MTAuNHMsICAgIzE2IC8qIFJPVzdMLjRoIDwtPiBST1czUi40aCAqLworICAgIHNocm4gICAgICAgICAgICBST1c0TC40aCwgdjEyLjRzLCAgICMxNiAvKiBST1c0TC40aCA8LT4gUk9XMFIuNGggKi8KKyAgICBzaHJuICAgICAgICAgICAgUk9XNFIuNGgsIHY2LjRzLCAgICAjMTYKKworMjogIC8qIERlc2NhbGUgdG8gOC1iaXQgYW5kIHJhbmdlIGxpbWl0ICovCisgICAgaW5zICAgICAgICAgICAgIHYxNi5kWzFdLCB2MTcuZFswXQorICAgIGlucyAgICAgICAgICAgICB2MTguZFsxXSwgdjE5LmRbMF0KKyAgICBpbnMgICAgICAgICAgICAgdjIwLmRbMV0sIHYyMS5kWzBdCisgICAgaW5zICAgICAgICAgICAgIHYyMi5kWzFdLCB2MjMuZFswXQorICAgIHNxcnNocm4gICAgICAgICB2MTYuOGIsICAgdjE2LjhoLCAgICMyCisgICAgc3Fyc2hybjIgICAgICAgIHYxNi4xNmIsICB2MTguOGgsICAgIzIKKyAgICBzcXJzaHJuICAgICAgICAgdjE4LjhiLCAgIHYyMC44aCwgICAjMgorICAgIHNxcnNocm4yICAgICAgICB2MTguMTZiLCAgdjIyLjhoLCAgICMyCisKKyAgICAvKiB2cG9wICAgICAgICAgICAge3Y4LjRoIC0gZDE1LjRofSAqLyAvKiByZXN0b3JlIE5FT04gcmVnaXN0ZXJzICovCisgICAgbGQxICAgICAgICAgICAgIHt2OC40aCwgdjkuNGgsIHYxMC40aCwgdjExLjRofSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YxMi40aCwgdjEzLjRoLCB2MTQuNGgsIHYxNS40aH0sIFtzcF0sIDMyCisgICAgaW5zICAgICAgICAgICAgIHYyNC5kWzFdLCB2MjUuZFswXQorCisgICAgc3Fyc2hybiAgICAgICAgIHYyMC44YiwgICB2MjQuOGgsICAgIzIKKyAgICAgIC8qIFRyYW5zcG9zZSB0aGUgZmluYWwgOC1iaXQgc2FtcGxlcyBhbmQgZG8gc2lnbmVkLT51bnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgLyogdHJuMSAgICAgICAgICAgIHYxNi44aCwgICAgdjE2LjhoLCAgdjE4LjhoICovCisgICAgdHJhbnNwb3NlICAgICAgIHYxNiwgdjE4LCB2MywgLjE2YiwgLjhoCisgICAgaW5zICAgICAgICAgICAgIHYyNi5kWzFdLCB2MjcuZFswXQorICAgIGlucyAgICAgICAgICAgICB2MjguZFsxXSwgdjI5LmRbMF0KKyAgICBpbnMgICAgICAgICAgICAgdjMwLmRbMV0sIHYzMS5kWzBdCisgICAgc3Fyc2hybjIgICAgICAgIHYyMC4xNmIsICB2MjYuOGgsICAgIzIKKyAgICBzcXJzaHJuICAgICAgICAgdjIyLjhiLCAgIHYyOC44aCwgICAjMgorICAgIG1vdmkgICAgICAgICAgICB2MC4xNmIsICAgIyhDRU5URVJKU0FNUExFKQorICAgIHNxcnNocm4yICAgICAgICB2MjIuMTZiLCAgdjMwLjhoLCAgICMyCisgICAgdHJhbnNwb3NlX3NpbmdsZSB2MTYsIHYxNywgdjMsIC5kLCAuOGIKKyAgICB0cmFuc3Bvc2Vfc2luZ2xlIHYxOCwgdjE5LCB2MywgLmQsIC44YgorICAgIGFkZCAgICAgICAgICAgICB2MTYuOGIsICAgdjE2LjhiLCAgIHYwLjhiCisgICAgYWRkICAgICAgICAgICAgIHYxNy44YiwgICB2MTcuOGIsICAgdjAuOGIKKyAgICBhZGQgICAgICAgICAgICAgdjE4LjhiLCAgIHYxOC44YiwgICB2MC44YgorICAgIGFkZCAgICAgICAgICAgICB2MTkuOGIsICAgdjE5LjhiLCAgIHYwLjhiCisgICAgdHJhbnNwb3NlICAgICAgIHYyMCwgdjIyLCB2MywgLjE2YiwgLjhoCisgICAgLyogU3RvcmUgcmVzdWx0cyB0byB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIGxkcCAgICAgICAgICAgICBUTVAxLCAgICAgVE1QMiwgICAgIFtPVVRQVVRfQlVGXSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgVE1QMSwgICAgIFRNUDEsICAgICBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDIsICAgICBUTVAyLCAgICAgT1VUUFVUX0NPTAorICAgIHN0MSAgICAgICAgICAgICB7djE2LjhifSwgW1RNUDFdCisgICAgdHJhbnNwb3NlX3NpbmdsZSB2MjAsIHYyMSwgdjMsIC5kLCAuOGIKKyAgICBzdDEgICAgICAgICAgICAge3YxNy44Yn0sIFtUTVAyXQorICAgIGxkcCAgICAgICAgICAgICBUTVAxLCAgICAgVE1QMiwgICAgIFtPVVRQVVRfQlVGXSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgVE1QMSwgICAgIFRNUDEsICAgICBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDIsICAgICBUTVAyLCAgICAgT1VUUFVUX0NPTAorICAgIHN0MSAgICAgICAgICAgICB7djE4LjhifSwgW1RNUDFdCisgICAgYWRkICAgICAgICAgICAgIHYyMC44YiwgICB2MjAuOGIsICAgdjAuOGIKKyAgICBhZGQgICAgICAgICAgICAgdjIxLjhiLCAgIHYyMS44YiwgICB2MC44YgorICAgIHN0MSAgICAgICAgICAgICB7djE5LjhifSwgW1RNUDJdCisgICAgbGRwICAgICAgICAgICAgIFRNUDEsICAgICBUTVAyLCAgICAgW09VVFBVVF9CVUZdLCAxNgorICAgIGxkcCAgICAgICAgICAgICBUTVAzLCAgICAgVE1QNCwgICAgIFtPVVRQVVRfQlVGXQorICAgIGFkZCAgICAgICAgICAgICBUTVAxLCAgICAgVE1QMSwgICAgIE9VVFBVVF9DT0wKKyAgICBhZGQgICAgICAgICAgICAgVE1QMiwgICAgIFRNUDIsICAgICBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDMsICAgICBUTVAzLCAgICAgT1VUUFVUX0NPTAorICAgIGFkZCAgICAgICAgICAgICBUTVA0LCAgICAgVE1QNCwgICAgIE9VVFBVVF9DT0wKKyAgICB0cmFuc3Bvc2Vfc2luZ2xlIHYyMiwgdjIzLCB2MywgLmQsIC44YgorICAgIHN0MSAgICAgICAgICAgICB7djIwLjhifSwgW1RNUDFdCisgICAgYWRkICAgICAgICAgICAgIHYyMi44YiwgICB2MjIuOGIsICAgdjAuOGIKKyAgICBhZGQgICAgICAgICAgICAgdjIzLjhiLCAgIHYyMy44YiwgICB2MC44YgorICAgIHN0MSAgICAgICAgICAgICB7djIxLjhifSwgW1RNUDJdCisgICAgc3QxICAgICAgICAgICAgIHt2MjIuOGJ9LCBbVE1QM10KKyAgICBzdDEgICAgICAgICAgICAge3YyMy44Yn0sIFtUTVA0XQorICAgIGxkciAgICAgICAgICAgICB4MTUsIFtzcF0sIDE2CisgICAgbGQxICAgICAgICAgICAgIHt2MC44YiwgdjEuOGIsIHYyLjhiLCB2My44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2NC44YiwgdjUuOGIsIHY2LjhiLCB2Ny44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2OC44YiwgdjkuOGIsIHYxMC44YiwgdjExLjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YxMi44YiwgdjEzLjhiLCB2MTQuOGIsIHYxNS44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2MTYuOGIsIHYxNy44YiwgdjE4LjhiLCB2MTkuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djIwLjhiLCB2MjEuOGIsIHYyMi44YiwgdjIzLjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YyNC44YiwgdjI1LjhiLCB2MjYuOGIsIHYyNy44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2MjguOGIsIHYyOS44YiwgdjMwLjhiLCB2MzEuOGJ9LCBbc3BdLCAzMgorICAgIGJsciAgICAgICAgICAgICB4MzAKKworMzogIC8qIExlZnQgNHg4IGhhbGYgaXMgZG9uZSwgcmlnaHQgNHg4IGhhbGYgY29udGFpbnMgbW9zdGx5IHplcm9zICovCisKKyAgICAvKiBUcmFuc3Bvc2UgbGVmdCA0eDggaGFsZiAqLworICAgIHRyYW5zcG9zZSAgICAgICBST1c2TCwgUk9XN0wsIHYzLCAuMTZiLCAuNGgKKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XMkwsIFJPVzNMLCB2MywgLjE2YiwgLjRoCisgICAgdHJhbnNwb3NlICAgICAgIFJPVzBMLCBST1cxTCwgdjMsIC4xNmIsIC40aAorICAgIHRyYW5zcG9zZSAgICAgICBST1c0TCwgUk9XNUwsIHYzLCAuMTZiLCAuNGgKKyAgICBzaGwgICAgICAgICAgICAgUk9XMFIuNGgsIFJPVzBSLjRoLCAjMiAvKiBQQVNTMV9CSVRTICovCisgICAgdHJhbnNwb3NlICAgICAgIFJPVzFMLCBST1czTCwgdjMsIC4xNmIsIC4ycworICAgIHRyYW5zcG9zZSAgICAgICBST1c0TCwgUk9XNkwsIHYzLCAuMTZiLCAuMnMKKyAgICB0cmFuc3Bvc2UgICAgICAgUk9XMEwsIFJPVzJMLCB2MywgLjE2YiwgLjJzCisgICAgdHJhbnNwb3NlICAgICAgIFJPVzVMLCBST1c3TCwgdjMsIC4xNmIsIC4ycworICAgIGNtcCAgICAgICAgICAgICB4MCwgIzAKKyAgICBiLmVxICAgICAgICAgICAgNGYgLyogUmlnaHQgNHg4IGhhbGYgaGFzIGFsbCB6ZXJvcywgZ28gdG8gJ3NwYXJzZScgc2Vjb25kIHBhc3MgKi8KKworICAgIC8qIE9ubHkgcm93IDAgaXMgbm9uLXplcm8gZm9yIHRoZSByaWdodCA0eDggaGFsZiAgKi8KKyAgICBkdXAgICAgICAgICAgICAgUk9XMVIuNGgsIFJPVzBSLmhbMV0KKyAgICBkdXAgICAgICAgICAgICAgUk9XMlIuNGgsIFJPVzBSLmhbMl0KKyAgICBkdXAgICAgICAgICAgICAgUk9XM1IuNGgsIFJPVzBSLmhbM10KKyAgICBkdXAgICAgICAgICAgICAgUk9XNFIuNGgsIFJPVzBSLmhbMF0KKyAgICBkdXAgICAgICAgICAgICAgUk9XNVIuNGgsIFJPVzBSLmhbMV0KKyAgICBkdXAgICAgICAgICAgICAgUk9XNlIuNGgsIFJPVzBSLmhbMl0KKyAgICBkdXAgICAgICAgICAgICAgUk9XN1IuNGgsIFJPVzBSLmhbM10KKyAgICBkdXAgICAgICAgICAgICAgUk9XMFIuNGgsIFJPVzBSLmhbMF0KKyAgICBiICAgICAgICAgICAgICAgMWIgLyogR28gdG8gJ25vcm1hbCcgc2Vjb25kIHBhc3MgKi8KKworNDogIC8qIDEtRCBJRENULCBwYXNzIDIgKHNwYXJzZSB2YXJpYW50IHdpdGggemVybyByb3dzIDQtNyksIGxlZnQgNHg4IGhhbGYgKi8KKyAgICBsZDEgICAgICAgICAgICAge3YyLjRofSwgIFt4MTVdICAgIC8qIHJlbG9hZCBjb25zdGFudHMgKi8KKyAgICBzbXVsbCAgICAgICAgICAgdjEyLjRzLCAgIFJPVzFMLjRoLCBYRklYXzFfMTc1ODc1NjAyCisgICAgc21sYWwgICAgICAgICAgIHYxMi40cywgICBST1czTC40aCwgWEZJWF8xXzE3NTg3NTYwMl9NSU5VU18xXzk2MTU3MDU2MAorICAgIHNtdWxsICAgICAgICAgICB2MTQuNHMsICAgUk9XM0wuNGgsIFhGSVhfMV8xNzU4NzU2MDIKKyAgICBzbWxhbCAgICAgICAgICAgdjE0LjRzLCAgIFJPVzFMLjRoLCBYRklYXzFfMTc1ODc1NjAyX01JTlVTXzBfMzkwMTgwNjQ0CisgICAgc211bGwgICAgICAgICAgIHY0LjRzLCAgICBST1cyTC40aCwgWEZJWF8wXzU0MTE5NjEwMAorICAgIHNzaGxsICAgICAgICAgICB2Ni40cywgICAgUk9XMEwuNGgsICMxMworICAgIG1vdiAgICAgICAgICAgICB2OC4xNmIsICAgdjEyLjE2YgorICAgIHNtbGFsICAgICAgICAgICB2MTIuNHMsICAgUk9XM0wuNGgsIFhGSVhfM18wNzI3MTEwMjZfTUlOVVNfMl81NjI5MTU0NDcKKyAgICBzbWxzbCAgICAgICAgICAgdjguNHMsICAgIFJPVzFMLjRoLCBYRklYXzBfODk5OTc2MjIzCisgICAgYWRkICAgICAgICAgICAgIHYyLjRzLCAgICB2Ni40cywgICAgdjQuNHMKKyAgICBtb3YgICAgICAgICAgICAgdjEwLjE2YiwgIHYxNC4xNmIKKyAgICBzbWxhbCAgICAgICAgICAgdjE0LjRzLCAgIFJPVzFMLjRoLCBYRklYXzFfNTAxMzIxMTEwX01JTlVTXzBfODk5OTc2MjIzCisgICAgYWRkICAgICAgICAgICAgIHYyLjRzLCAgICB2Mi40cywgICAgdjEyLjRzCisgICAgYWRkICAgICAgICAgICAgIHYxMi40cywgICB2MTIuNHMsICAgdjEyLjRzCisgICAgc21sc2wgICAgICAgICAgIHYxMC40cywgICBST1czTC40aCwgWEZJWF8yXzU2MjkxNTQ0NworICAgIHNocm4gICAgICAgICAgICBST1cxTC40aCwgdjIuNHMsICAgICMxNgorICAgIHN1YiAgICAgICAgICAgICB2Mi40cywgICAgdjIuNHMsICAgIHYxMi40cworICAgIHNtdWxsICAgICAgICAgICB2MTIuNHMsICAgUk9XMkwuNGgsIFhGSVhfMF81NDExOTYxMDBfUExVU18wXzc2NTM2Njg2NQorICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHY0LjRzCisgICAgc2hybiAgICAgICAgICAgIFJPVzJSLjRoLCB2Mi40cywgICAgIzE2IC8qIFJPVzZMLjRoIDwtPiBST1cyUi40aCAqLworICAgIGFkZCAgICAgICAgICAgICB2Mi40cywgICAgdjYuNHMsICAgIHYxMC40cworICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHYxMC40cworICAgIHNzaGxsICAgICAgICAgICB2MTAuNHMsICAgUk9XMEwuNGgsICMxMworICAgIHNocm4gICAgICAgICAgICBST1cyTC40aCwgdjIuNHMsICAgICMxNgorICAgIHNocm4gICAgICAgICAgICBST1cxUi40aCwgdjYuNHMsICAgICMxNiAvKiBST1c1TC40aCA8LT4gUk9XMVIuNGggKi8KKyAgICBhZGQgICAgICAgICAgICAgdjQuNHMsICAgIHYxMC40cywgICB2MTIuNHMKKyAgICBzdWIgICAgICAgICAgICAgdjIuNHMsICAgIHYxMC40cywgICB2MTIuNHMKKyAgICBhZGQgICAgICAgICAgICAgdjEyLjRzLCAgIHY0LjRzLCAgICB2MTQuNHMKKyAgICBzdWIgICAgICAgICAgICAgdjQuNHMsICAgIHY0LjRzLCAgICB2MTQuNHMKKyAgICBhZGQgICAgICAgICAgICAgdjEwLjRzLCAgIHYyLjRzLCAgICB2OC40cworICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjIuNHMsICAgIHY4LjRzCisgICAgc2hybiAgICAgICAgICAgIFJPVzNSLjRoLCB2NC40cywgICAgIzE2IC8qIFJPVzdMLjRoIDwtPiBST1czUi40aCAqLworICAgIHNocm4gICAgICAgICAgICBST1czTC40aCwgdjEwLjRzLCAgICMxNgorICAgIHNocm4gICAgICAgICAgICBST1cwTC40aCwgdjEyLjRzLCAgICMxNgorICAgIHNocm4gICAgICAgICAgICBST1cwUi40aCwgdjYuNHMsICAgICMxNiAvKiBST1c0TC40aCA8LT4gUk9XMFIuNGggKi8KKyAgICAvKiAxLUQgSURDVCwgcGFzcyAyIChzcGFyc2UgdmFyaWFudCB3aXRoIHplcm8gcm93cyA0LTcpLCByaWdodCA0eDggaGFsZiAqLworICAgIGxkMSAgICAgICAgICAgICB7djIuNGh9LCAgW3gxNV0gICAgLyogcmVsb2FkIGNvbnN0YW50cyAqLworICAgIHNtdWxsICAgICAgICAgICB2MTIuNHMsICAgUk9XNUwuNGgsIFhGSVhfMV8xNzU4NzU2MDIKKyAgICBzbWxhbCAgICAgICAgICAgdjEyLjRzLCAgIFJPVzdMLjRoLCBYRklYXzFfMTc1ODc1NjAyX01JTlVTXzFfOTYxNTcwNTYwCisgICAgc211bGwgICAgICAgICAgIHYxNC40cywgICBST1c3TC40aCwgWEZJWF8xXzE3NTg3NTYwMgorICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XNUwuNGgsIFhGSVhfMV8xNzU4NzU2MDJfTUlOVVNfMF8zOTAxODA2NDQKKyAgICBzbXVsbCAgICAgICAgICAgdjQuNHMsICAgIFJPVzZMLjRoLCBYRklYXzBfNTQxMTk2MTAwCisgICAgc3NobGwgICAgICAgICAgIHY2LjRzLCAgICBST1c0TC40aCwgIzEzCisgICAgbW92ICAgICAgICAgICAgIHY4LjE2YiwgICB2MTIuMTZiCisgICAgc21sYWwgICAgICAgICAgIHYxMi40cywgICBST1c3TC40aCwgWEZJWF8zXzA3MjcxMTAyNl9NSU5VU18yXzU2MjkxNTQ0NworICAgIHNtbHNsICAgICAgICAgICB2OC40cywgICAgUk9XNUwuNGgsIFhGSVhfMF84OTk5NzYyMjMKKyAgICBhZGQgICAgICAgICAgICAgdjIuNHMsICAgIHY2LjRzLCAgICB2NC40cworICAgIG1vdiAgICAgICAgICAgICB2MTAuMTZiLCAgdjE0LjE2YgorICAgIHNtbGFsICAgICAgICAgICB2MTQuNHMsICAgUk9XNUwuNGgsIFhGSVhfMV81MDEzMjExMTBfTUlOVVNfMF84OTk5NzYyMjMKKyAgICBhZGQgICAgICAgICAgICAgdjIuNHMsICAgIHYyLjRzLCAgICB2MTIuNHMKKyAgICBhZGQgICAgICAgICAgICAgdjEyLjRzLCAgIHYxMi40cywgICB2MTIuNHMKKyAgICBzbWxzbCAgICAgICAgICAgdjEwLjRzLCAgIFJPVzdMLjRoLCBYRklYXzJfNTYyOTE1NDQ3CisgICAgc2hybiAgICAgICAgICAgIFJPVzVMLjRoLCB2Mi40cywgICAgIzE2IC8qIFJPVzVMLjRoIDwtPiBST1cxUi40aCAqLworICAgIHN1YiAgICAgICAgICAgICB2Mi40cywgICAgdjIuNHMsICAgIHYxMi40cworICAgIHNtdWxsICAgICAgICAgICB2MTIuNHMsICAgUk9XNkwuNGgsIFhGSVhfMF81NDExOTYxMDBfUExVU18wXzc2NTM2Njg2NQorICAgIHN1YiAgICAgICAgICAgICB2Ni40cywgICAgdjYuNHMsICAgIHY0LjRzCisgICAgc2hybiAgICAgICAgICAgIFJPVzZSLjRoLCB2Mi40cywgICAgIzE2CisgICAgYWRkICAgICAgICAgICAgIHYyLjRzLCAgICB2Ni40cywgICAgdjEwLjRzCisgICAgc3ViICAgICAgICAgICAgIHY2LjRzLCAgICB2Ni40cywgICAgdjEwLjRzCisgICAgc3NobGwgICAgICAgICAgIHYxMC40cywgICBST1c0TC40aCwgIzEzCisgICAgc2hybiAgICAgICAgICAgIFJPVzZMLjRoLCB2Mi40cywgICAgIzE2IC8qIFJPVzZMLjRoIDwtPiBST1cyUi40aCAqLworICAgIHNocm4gICAgICAgICAgICBST1c1Ui40aCwgdjYuNHMsICAgICMxNgorICAgIGFkZCAgICAgICAgICAgICB2NC40cywgICAgdjEwLjRzLCAgIHYxMi40cworICAgIHN1YiAgICAgICAgICAgICB2Mi40cywgICAgdjEwLjRzLCAgIHYxMi40cworICAgIGFkZCAgICAgICAgICAgICB2MTIuNHMsICAgdjQuNHMsICAgIHYxNC40cworICAgIHN1YiAgICAgICAgICAgICB2NC40cywgICAgdjQuNHMsICAgIHYxNC40cworICAgIGFkZCAgICAgICAgICAgICB2MTAuNHMsICAgdjIuNHMsICAgIHY4LjRzCisgICAgc3ViICAgICAgICAgICAgIHY2LjRzLCAgICB2Mi40cywgICAgdjguNHMKKyAgICBzaHJuICAgICAgICAgICAgUk9XN1IuNGgsIHY0LjRzLCAgICAjMTYKKyAgICBzaHJuICAgICAgICAgICAgUk9XN0wuNGgsIHYxMC40cywgICAjMTYgLyogUk9XN0wuNGggPC0+IFJPVzNSLjRoICovCisgICAgc2hybiAgICAgICAgICAgIFJPVzRMLjRoLCB2MTIuNHMsICAgIzE2IC8qIFJPVzRMLjRoIDwtPiBST1cwUi40aCAqLworICAgIHNocm4gICAgICAgICAgICBST1c0Ui40aCwgdjYuNHMsICAgICMxNgorICAgIGIgICAgICAgICAgICAgICAyYiAvKiBHbyB0byBlcGlsb2d1ZSAqLworCisgICAgLnVucmVxICAgICAgICAgIERDVF9UQUJMRQorICAgIC51bnJlcSAgICAgICAgICBDT0VGX0JMT0NLCisgICAgLnVucmVxICAgICAgICAgIE9VVFBVVF9CVUYKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0NPTAorICAgIC51bnJlcSAgICAgICAgICBUTVAxCisgICAgLnVucmVxICAgICAgICAgIFRNUDIKKyAgICAudW5yZXEgICAgICAgICAgVE1QMworICAgIC51bnJlcSAgICAgICAgICBUTVA0CisKKyAgICAudW5yZXEgICAgICAgICAgUk9XMEwKKyAgICAudW5yZXEgICAgICAgICAgUk9XMFIKKyAgICAudW5yZXEgICAgICAgICAgUk9XMUwKKyAgICAudW5yZXEgICAgICAgICAgUk9XMVIKKyAgICAudW5yZXEgICAgICAgICAgUk9XMkwKKyAgICAudW5yZXEgICAgICAgICAgUk9XMlIKKyAgICAudW5yZXEgICAgICAgICAgUk9XM0wKKyAgICAudW5yZXEgICAgICAgICAgUk9XM1IKKyAgICAudW5yZXEgICAgICAgICAgUk9XNEwKKyAgICAudW5yZXEgICAgICAgICAgUk9XNFIKKyAgICAudW5yZXEgICAgICAgICAgUk9XNUwKKyAgICAudW5yZXEgICAgICAgICAgUk9XNVIKKyAgICAudW5yZXEgICAgICAgICAgUk9XNkwKKyAgICAudW5yZXEgICAgICAgICAgUk9XNlIKKyAgICAudW5yZXEgICAgICAgICAgUk9XN0wKKyAgICAudW5yZXEgICAgICAgICAgUk9XN1IKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBqc2ltZF9pZGN0X2lmYXN0X25lb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YKKyAqIHRoZSBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuIEl0IHVzZXMgdGhlIHNhbWUgY2FsY3VsYXRpb25zCisgKiBhbmQgcHJvZHVjZXMgZXhhY3RseSB0aGUgc2FtZSBvdXRwdXQgYXMgSUpHJ3Mgb3JpZ2luYWwgJ2pwZWdfaWRjdF9pZmFzdCcKKyAqIGZ1bmN0aW9uIGZyb20gamlkY3Rmc3QuYworICoKKyAqIE5vcm1hbGx5IDEtRCBBQU4gRENUIG5lZWRzIDUgbXVsdGlwbGljYXRpb25zIGFuZCAyOSBhZGRpdGlvbnMuCisgKiBCdXQgaW4gQVJNIE5FT04gY2FzZSBzb21lIGV4dHJhIGFkZGl0aW9ucyBhcmUgcmVxdWlyZWQgYmVjYXVzZSBWUURNVUxICisgKiBpbnN0cnVjdGlvbiBjYW4ndCBoYW5kbGUgdGhlIGNvbnN0YW50cyBsYXJnZXIgdGhhbiAxLiBTbyB0aGUgZXhwcmVzc2lvbnMKKyAqIGxpa2UgInggKiAxLjA4MjM5MjIwMCIgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgdG8gInggKiAwLjA4MjM5MjIwMCArIHgiLAorICogd2hpY2ggaW50cm9kdWNlcyBhbiBleHRyYSBhZGRpdGlvbi4gT3ZlcmFsbCwgdGhlcmUgYXJlIDYgZXh0cmEgYWRkaXRpb25zCisgKiBwZXIgMS1EIElEQ1QgcGFzcywgdG90YWxsaW5nIHRvIDUgVlFETVVMSCBhbmQgMzUgVkFERC9WU1VCIGluc3RydWN0aW9ucy4KKyAqLworCisjZGVmaW5lIFhGSVhfMV8wODIzOTIyMDAgdjAuaFswXQorI2RlZmluZSBYRklYXzFfNDE0MjEzNTYyIHYwLmhbMV0KKyNkZWZpbmUgWEZJWF8xXzg0Nzc1OTA2NSB2MC5oWzJdCisjZGVmaW5lIFhGSVhfMl82MTMxMjU5MzAgdjAuaFszXQorCisuYmFsaWduIDE2CitManNpbWRfaWRjdF9pZmFzdF9uZW9uX2NvbnN0czoKKyAgICAuc2hvcnQgKDI3NyAqIDEyOCAtIDI1NiAqIDEyOCkgLyogWEZJWF8xXzA4MjM5MjIwMCAqLworICAgIC5zaG9ydCAoMzYyICogMTI4IC0gMjU2ICogMTI4KSAvKiBYRklYXzFfNDE0MjEzNTYyICovCisgICAgLnNob3J0ICg0NzMgKiAxMjggLSAyNTYgKiAxMjgpIC8qIFhGSVhfMV84NDc3NTkwNjUgKi8KKyAgICAuc2hvcnQgKDY2OSAqIDEyOCAtIDUxMiAqIDEyOCkgLyogWEZJWF8yXzYxMzEyNTkzMCAqLworCithc21fZnVuY3Rpb24ganNpbWRfaWRjdF9pZmFzdF9uZW9uCisKKyAgICBEQ1RfVEFCTEUgICAgICAgLnJlcSB4MAorICAgIENPRUZfQkxPQ0sgICAgICAucmVxIHgxCisgICAgT1VUUFVUX0JVRiAgICAgIC5yZXEgeDIKKyAgICBPVVRQVVRfQ09MICAgICAgLnJlcSB4MworICAgIFRNUDEgICAgICAgICAgICAucmVxIHgwCisgICAgVE1QMiAgICAgICAgICAgIC5yZXEgeDEKKyAgICBUTVAzICAgICAgICAgICAgLnJlcSB4MgorICAgIFRNUDQgICAgICAgICAgICAucmVxIHgyMgorICAgIFRNUDUgICAgICAgICAgICAucmVxIHgyMworCisgICAgLyogT1VUUFVUX0NPTCBpcyBhIEpESU1FTlNJT04gKHVuc2lnbmVkIGludCkgYXJndW1lbnQsIHNvIHRoZSBBQkkgZG9lc24ndAorICAgICAgIGd1YXJhbnRlZSB0aGF0IHRoZSB1cHBlciAodW51c2VkKSAzMiBiaXRzIG9mIHgzIGFyZSB2YWxpZC4gIFRoaXMKKyAgICAgICBpbnN0cnVjdGlvbiBlbnN1cmVzIHRoYXQgdGhvc2UgYml0cyBhcmUgc2V0IHRvIHplcm8uICovCisgICAgdXh0dyB4MywgdzMKKworICAgIC8qIExvYWQgYW5kIGRlcXVhbnRpemUgY29lZmZpY2llbnRzIGludG8gTkVPTiByZWdpc3RlcnMKKyAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgYWxsb2NhdGlvbjoKKyAgICAgKiAgICAgICAwIDEgMiAzIHwgNCA1IDYgNworICAgICAqICAgICAgLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICogICAwIHwgZDE2ICAgICB8IGQxNyAgICAgKCB2OC44aCAgKQorICAgICAqICAgMSB8IGQxOCAgICAgfCBkMTkgICAgICggdjkuOGggICkKKyAgICAgKiAgIDIgfCBkMjAgICAgIHwgZDIxICAgICAoIHYxMC44aCApCisgICAgICogICAzIHwgZDIyICAgICB8IGQyMyAgICAgKCB2MTEuOGggKQorICAgICAqICAgNCB8IGQyNCAgICAgfCBkMjUgICAgICggdjEyLjhoICkKKyAgICAgKiAgIDUgfCBkMjYgICAgIHwgZDI3ICAgICAoIHYxMy44aCApCisgICAgICogICA2IHwgZDI4ICAgICB8IGQyOSAgICAgKCB2MTQuOGggKQorICAgICAqICAgNyB8IGQzMCAgICAgfCBkMzEgICAgICggdjE1LjhoICkKKyAgICAgKi8KKyAgICAvKiBTYXZlIE5FT04gcmVnaXN0ZXJzIHVzZWQgaW4gZmFzdCBJRENUICovCisgICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgIzE3NgorICAgIHN0cCAgICAgICAgICAgICB4MjIsIHgyMywgW3NwXSwgMTYKKyAgICBhZHIgICAgICAgICAgICAgeDIzLCBManNpbWRfaWRjdF9pZmFzdF9uZW9uX2NvbnN0cworICAgIHN0MSAgICAgICAgICAgICB7djAuOGIsIHYxLjhiLCB2Mi44YiwgdjMuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djQuOGIsIHY1LjhiLCB2Ni44YiwgdjcuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djguOGIsIHY5LjhiLCB2MTAuOGIsIHYxMS44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MTIuOGIsIHYxMy44YiwgdjE0LjhiLCB2MTUuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djE2LjhiLCB2MTcuOGIsIHYxOC44YiwgdjE5LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3Y4LjhoLCB2OS44aH0sIFtDT0VGX0JMT0NLXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YwLjhoLCB2MS44aH0sIFtEQ1RfVEFCTEVdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djEwLjhoLCB2MTEuOGh9LCBbQ09FRl9CTE9DS10sIDMyCisgICAgbXVsICAgICAgICAgICAgIHY4LjhoLCAgdjguOGgsICB2MC44aAorICAgIGxkMSAgICAgICAgICAgICB7djIuOGgsIHYzLjhofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbXVsICAgICAgICAgICAgIHY5LjhoLCAgdjkuOGgsICB2MS44aAorICAgIGxkMSAgICAgICAgICAgICB7djEyLjhoLCB2MTMuOGh9LCBbQ09FRl9CTE9DS10sIDMyCisgICAgbXVsICAgICAgICAgICAgIHYxMC44aCwgdjEwLjhoLCB2Mi44aAorICAgIGxkMSAgICAgICAgICAgICB7djAuOGgsIHYxLjhofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbXVsICAgICAgICAgICAgIHYxMS44aCwgdjExLjhoLCB2My44aAorICAgIGxkMSAgICAgICAgICAgICB7djE0LjhoLCB2MTUuOGh9LCBbQ09FRl9CTE9DS10sIDMyCisgICAgbXVsICAgICAgICAgICAgIHYxMi44aCwgdjEyLjhoLCB2MC44aAorICAgIGxkMSAgICAgICAgICAgICB7djIuOGgsIHYzLjhofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbXVsICAgICAgICAgICAgIHYxNC44aCwgdjE0LjhoLCB2Mi44aAorICAgIG11bCAgICAgICAgICAgICB2MTMuOGgsIHYxMy44aCwgdjEuOGgKKyAgICBsZDEgICAgICAgICAgICAge3YwLjRofSwgW3gyM10gICAgICAvKiBsb2FkIGNvbnN0YW50cyAqLworICAgIG11bCAgICAgICAgICAgICB2MTUuOGgsIHYxNS44aCwgdjMuOGgKKworICAgIC8qIDEtRCBJRENULCBwYXNzIDEgKi8KKyAgICBzdWIgICAgICAgICAgICAgdjIuOGgsICAgIHYxMC44aCwgICB2MTQuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjE0LjhoLCAgIHYxMC44aCwgICB2MTQuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjEuOGgsICAgIHYxMS44aCwgICB2MTMuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjEzLjhoLCAgIHYxMS44aCwgICB2MTMuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjUuOGgsICAgIHY5LjhoLCAgICB2MTUuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjE1LjhoLCAgIHY5LjhoLCAgICB2MTUuOGgKKyAgICBzcWRtdWxoICAgICAgICAgdjQuOGgsICAgIHYyLjhoLCAgICBYRklYXzFfNDE0MjEzNTYyCisgICAgc3FkbXVsaCAgICAgICAgIHY2LjhoLCAgICB2MS44aCwgICAgWEZJWF8yXzYxMzEyNTkzMAorICAgIGFkZCAgICAgICAgICAgICB2My44aCwgICAgdjEuOGgsICAgIHYxLjhoCisgICAgc3ViICAgICAgICAgICAgIHYxLjhoLCAgICB2NS44aCwgICAgdjEuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjEwLjhoLCAgIHYyLjhoLCAgICB2NC44aAorICAgIHNxZG11bGggICAgICAgICB2NC44aCwgICAgdjEuOGgsICAgIFhGSVhfMV84NDc3NTkwNjUKKyAgICBzdWIgICAgICAgICAgICAgdjIuOGgsICAgIHYxNS44aCwgICB2MTMuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjMuOGgsICAgIHYzLjhoLCAgICB2Ni44aAorICAgIHNxZG11bGggICAgICAgICB2Ni44aCwgICAgdjIuOGgsICAgIFhGSVhfMV80MTQyMTM1NjIKKyAgICBhZGQgICAgICAgICAgICAgdjEuOGgsICAgIHYxLjhoLCAgICB2NC44aAorICAgIHNxZG11bGggICAgICAgICB2NC44aCwgICAgdjUuOGgsICAgIFhGSVhfMV8wODIzOTIyMDAKKyAgICBzdWIgICAgICAgICAgICAgdjEwLjhoLCAgIHYxMC44aCwgICB2MTQuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjIuOGgsICAgIHYyLjhoLCAgICB2Ni44aAorICAgIHN1YiAgICAgICAgICAgICB2Ni44aCwgICAgdjguOGgsICAgIHYxMi44aAorICAgIGFkZCAgICAgICAgICAgICB2MTIuOGgsICAgdjguOGgsICAgIHYxMi44aAorICAgIGFkZCAgICAgICAgICAgICB2OS44aCwgICAgdjUuOGgsICAgIHY0LjhoCisgICAgYWRkICAgICAgICAgICAgIHY1LjhoLCAgICB2Ni44aCwgICAgdjEwLjhoCisgICAgc3ViICAgICAgICAgICAgIHYxMC44aCwgICB2Ni44aCwgICAgdjEwLjhoCisgICAgYWRkICAgICAgICAgICAgIHY2LjhoLCAgICB2MTUuOGgsICAgdjEzLjhoCisgICAgYWRkICAgICAgICAgICAgIHY4LjhoLCAgICB2MTIuOGgsICAgdjE0LjhoCisgICAgc3ViICAgICAgICAgICAgIHYzLjhoLCAgICB2Ni44aCwgICAgdjMuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjEyLjhoLCAgIHYxMi44aCwgICB2MTQuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjMuOGgsICAgIHYzLjhoLCAgICB2MS44aAorICAgIHN1YiAgICAgICAgICAgICB2MS44aCwgICAgdjkuOGgsICAgIHYxLjhoCisgICAgYWRkICAgICAgICAgICAgIHYyLjhoLCAgICB2My44aCwgICAgdjIuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjE1LjhoLCAgIHY4LjhoLCAgICB2Ni44aAorICAgIGFkZCAgICAgICAgICAgICB2MS44aCwgICAgdjEuOGgsICAgIHYyLjhoCisgICAgYWRkICAgICAgICAgICAgIHY4LjhoLCAgICB2OC44aCwgICAgdjYuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjE0LjhoLCAgIHY1LjhoLCAgICB2My44aAorICAgIHN1YiAgICAgICAgICAgICB2OS44aCwgICAgdjUuOGgsICAgIHYzLjhoCisgICAgc3ViICAgICAgICAgICAgIHYxMy44aCwgICB2MTAuOGgsICAgdjIuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjEwLjhoLCAgIHYxMC44aCwgICB2Mi44aAorICAgIC8qIFRyYW5zcG9zZSAgcTgtcTkgKi8KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHY4LjE2YgorICAgIHRybjEgICAgICAgICAgICB2OC44aCwgICAgdjguOGgsICAgIHY5LjhoCisgICAgdHJuMiAgICAgICAgICAgIHY5LjhoLCAgICB2MTguOGgsICAgdjkuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjExLjhoLCAgIHYxMi44aCwgICB2MS44aAorICAgIC8qIFRyYW5zcG9zZSAgcTE0LXExNSAqLworICAgIG1vdiAgICAgICAgICAgICB2MTguMTZiLCAgdjE0LjE2YgorICAgIHRybjEgICAgICAgICAgICB2MTQuOGgsICAgdjE0LjhoLCAgIHYxNS44aAorICAgIHRybjIgICAgICAgICAgICB2MTUuOGgsICAgdjE4LjhoLCAgIHYxNS44aAorICAgIGFkZCAgICAgICAgICAgICB2MTIuOGgsICAgdjEyLjhoLCAgIHYxLjhoCisgICAgLyogVHJhbnNwb3NlICBxMTAtcTExICovCisgICAgbW92ICAgICAgICAgICAgIHYxOC4xNmIsICB2MTAuMTZiCisgICAgdHJuMSAgICAgICAgICAgIHYxMC44aCwgICB2MTAuOGgsICAgdjExLjhoCisgICAgdHJuMiAgICAgICAgICAgIHYxMS44aCwgICB2MTguOGgsICAgdjExLjhoCisgICAgLyogVHJhbnNwb3NlICBxMTItcTEzICovCisgICAgbW92ICAgICAgICAgICAgIHYxOC4xNmIsICB2MTIuMTZiCisgICAgdHJuMSAgICAgICAgICAgIHYxMi44aCwgICB2MTIuOGgsICAgdjEzLjhoCisgICAgdHJuMiAgICAgICAgICAgIHYxMy44aCwgICB2MTguOGgsICAgdjEzLjhoCisgICAgLyogVHJhbnNwb3NlICBxOS1xMTEgKi8KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHY5LjE2YgorICAgIHRybjEgICAgICAgICAgICB2OS40cywgICAgdjkuNHMsICAgIHYxMS40cworICAgIHRybjIgICAgICAgICAgICB2MTEuNHMsICAgdjE4LjRzLCAgIHYxMS40cworICAgIC8qIFRyYW5zcG9zZSAgcTEyLXExNCAqLworICAgIG1vdiAgICAgICAgICAgICB2MTguMTZiLCAgdjEyLjE2YgorICAgIHRybjEgICAgICAgICAgICB2MTIuNHMsICAgdjEyLjRzLCAgIHYxNC40cworICAgIHRybjIgICAgICAgICAgICB2MTQuNHMsICAgdjE4LjRzLCAgIHYxNC40cworICAgIC8qIFRyYW5zcG9zZSAgcTgtcTEwICovCisgICAgbW92ICAgICAgICAgICAgIHYxOC4xNmIsICB2OC4xNmIKKyAgICB0cm4xICAgICAgICAgICAgdjguNHMsICAgIHY4LjRzLCAgICB2MTAuNHMKKyAgICB0cm4yICAgICAgICAgICAgdjEwLjRzLCAgIHYxOC40cywgICB2MTAuNHMKKyAgICAvKiBUcmFuc3Bvc2UgIHExMy1xMTUgKi8KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHYxMy4xNmIKKyAgICB0cm4xICAgICAgICAgICAgdjEzLjRzLCAgIHYxMy40cywgICB2MTUuNHMKKyAgICB0cm4yICAgICAgICAgICAgdjE1LjRzLCAgIHYxOC40cywgICB2MTUuNHMKKyAgICAvKiB2c3dwICAgICAgICAgICAgdjE0LjRoLCAgIHYxMC1NU0IuNGggKi8KKyAgICB1bW92ICAgICAgICAgICAgeDIyLCB2MTQuZFswXQorICAgIGlucyAgICAgICAgICAgICB2MTQuZFswXSwgdjEwLmRbMV0KKyAgICBpbnMgICAgICAgICAgICAgdjEwLmRbMV0sIHgyMgorICAgIC8qIHZzd3AgICAgICAgICAgICB2MTMuNGgsICAgdjlNU0IuNGggKi8KKworICAgIHVtb3YgICAgICAgICAgICB4MjIsIHYxMy5kWzBdCisgICAgaW5zICAgICAgICAgICAgIHYxMy5kWzBdLCB2OS5kWzFdCisgICAgaW5zICAgICAgICAgICAgIHY5LmRbMV0sIHgyMgorICAgIC8qIDEtRCBJRENULCBwYXNzIDIgKi8KKyAgICBzdWIgICAgICAgICAgICAgdjIuOGgsICAgIHYxMC44aCwgICB2MTQuOGgKKyAgICAvKiB2c3dwICAgICAgICAgICAgdjE1LjRoLCAgIHYxMU1TQi40aCAqLworICAgIHVtb3YgICAgICAgICAgICB4MjIsIHYxNS5kWzBdCisgICAgaW5zICAgICAgICAgICAgIHYxNS5kWzBdLCB2MTEuZFsxXQorICAgIGlucyAgICAgICAgICAgICB2MTEuZFsxXSwgeDIyCisgICAgYWRkICAgICAgICAgICAgIHYxNC44aCwgICB2MTAuOGgsICAgdjE0LjhoCisgICAgLyogdnN3cCAgICAgICAgICAgIHYxMi40aCwgICB2OC1NU0IuNGggKi8KKyAgICB1bW92ICAgICAgICAgICAgeDIyLCB2MTIuZFswXQorICAgIGlucyAgICAgICAgICAgICB2MTIuZFswXSwgdjguZFsxXQorICAgIGlucyAgICAgICAgICAgICB2OC5kWzFdLCAgeDIyCisgICAgc3ViICAgICAgICAgICAgIHYxLjhoLCAgICB2MTEuOGgsICAgdjEzLjhoCisgICAgYWRkICAgICAgICAgICAgIHYxMy44aCwgICB2MTEuOGgsICAgdjEzLjhoCisgICAgc3ViICAgICAgICAgICAgIHY1LjhoLCAgICB2OS44aCwgICAgdjE1LjhoCisgICAgYWRkICAgICAgICAgICAgIHYxNS44aCwgICB2OS44aCwgICAgdjE1LjhoCisgICAgc3FkbXVsaCAgICAgICAgIHY0LjhoLCAgICB2Mi44aCwgICAgWEZJWF8xXzQxNDIxMzU2MgorICAgIHNxZG11bGggICAgICAgICB2Ni44aCwgICAgdjEuOGgsICAgIFhGSVhfMl82MTMxMjU5MzAKKyAgICBhZGQgICAgICAgICAgICAgdjMuOGgsICAgIHYxLjhoLCAgICB2MS44aAorICAgIHN1YiAgICAgICAgICAgICB2MS44aCwgICAgdjUuOGgsICAgIHYxLjhoCisgICAgYWRkICAgICAgICAgICAgIHYxMC44aCwgICB2Mi44aCwgICAgdjQuOGgKKyAgICBzcWRtdWxoICAgICAgICAgdjQuOGgsICAgIHYxLjhoLCAgICBYRklYXzFfODQ3NzU5MDY1CisgICAgc3ViICAgICAgICAgICAgIHYyLjhoLCAgICB2MTUuOGgsICAgdjEzLjhoCisgICAgYWRkICAgICAgICAgICAgIHYzLjhoLCAgICB2My44aCwgICAgdjYuOGgKKyAgICBzcWRtdWxoICAgICAgICAgdjYuOGgsICAgIHYyLjhoLCAgICBYRklYXzFfNDE0MjEzNTYyCisgICAgYWRkICAgICAgICAgICAgIHYxLjhoLCAgICB2MS44aCwgICAgdjQuOGgKKyAgICBzcWRtdWxoICAgICAgICAgdjQuOGgsICAgIHY1LjhoLCAgICBYRklYXzFfMDgyMzkyMjAwCisgICAgc3ViICAgICAgICAgICAgIHYxMC44aCwgICB2MTAuOGgsICAgdjE0LjhoCisgICAgYWRkICAgICAgICAgICAgIHYyLjhoLCAgICB2Mi44aCwgICAgdjYuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjYuOGgsICAgIHY4LjhoLCAgICB2MTIuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjEyLjhoLCAgIHY4LjhoLCAgICB2MTIuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjkuOGgsICAgIHY1LjhoLCAgICB2NC44aAorICAgIGFkZCAgICAgICAgICAgICB2NS44aCwgICAgdjYuOGgsICAgIHYxMC44aAorICAgIHN1YiAgICAgICAgICAgICB2MTAuOGgsICAgdjYuOGgsICAgIHYxMC44aAorICAgIGFkZCAgICAgICAgICAgICB2Ni44aCwgICAgdjE1LjhoLCAgIHYxMy44aAorICAgIGFkZCAgICAgICAgICAgICB2OC44aCwgICAgdjEyLjhoLCAgIHYxNC44aAorICAgIHN1YiAgICAgICAgICAgICB2My44aCwgICAgdjYuOGgsICAgIHYzLjhoCisgICAgc3ViICAgICAgICAgICAgIHYxMi44aCwgICB2MTIuOGgsICAgdjE0LjhoCisgICAgc3ViICAgICAgICAgICAgIHYzLjhoLCAgICB2My44aCwgICAgdjEuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjEuOGgsICAgIHY5LjhoLCAgICB2MS44aAorICAgIGFkZCAgICAgICAgICAgICB2Mi44aCwgICAgdjMuOGgsICAgIHYyLjhoCisgICAgc3ViICAgICAgICAgICAgIHYxNS44aCwgICB2OC44aCwgICAgdjYuOGgKKyAgICBhZGQgICAgICAgICAgICAgdjEuOGgsICAgIHYxLjhoLCAgICB2Mi44aAorICAgIGFkZCAgICAgICAgICAgICB2OC44aCwgICAgdjguOGgsICAgIHY2LjhoCisgICAgYWRkICAgICAgICAgICAgIHYxNC44aCwgICB2NS44aCwgICAgdjMuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjkuOGgsICAgIHY1LjhoLCAgICB2My44aAorICAgIHN1YiAgICAgICAgICAgICB2MTMuOGgsICAgdjEwLjhoLCAgIHYyLjhoCisgICAgYWRkICAgICAgICAgICAgIHYxMC44aCwgICB2MTAuOGgsICAgdjIuOGgKKyAgICBzdWIgICAgICAgICAgICAgdjExLjhoLCAgIHYxMi44aCwgICB2MS44aAorICAgIGFkZCAgICAgICAgICAgICB2MTIuOGgsICAgdjEyLjhoLCAgIHYxLjhoCisgICAgLyogRGVzY2FsZSB0byA4LWJpdCBhbmQgcmFuZ2UgbGltaXQgKi8KKyAgICBtb3ZpICAgICAgICAgICAgdjAuMTZiLCAgICMweDgwCisgICAgc3FzaHJuICAgICAgICAgIHY4LjhiLCAgICB2OC44aCwgICAgIzUKKyAgICBzcXNocm4yICAgICAgICAgdjguMTZiLCAgIHY5LjhoLCAgICAjNQorICAgIHNxc2hybiAgICAgICAgICB2OS44YiwgICAgdjEwLjhoLCAgICM1CisgICAgc3FzaHJuMiAgICAgICAgIHY5LjE2YiwgICB2MTEuOGgsICAgIzUKKyAgICBzcXNocm4gICAgICAgICAgdjEwLjhiLCAgIHYxMi44aCwgICAjNQorICAgIHNxc2hybjIgICAgICAgICB2MTAuMTZiLCAgdjEzLjhoLCAgICM1CisgICAgc3FzaHJuICAgICAgICAgIHYxMS44YiwgICB2MTQuOGgsICAgIzUKKyAgICBzcXNocm4yICAgICAgICAgdjExLjE2YiwgIHYxNS44aCwgICAjNQorICAgIGFkZCAgICAgICAgICAgICB2OC4xNmIsICAgdjguMTZiLCAgIHYwLjE2YgorICAgIGFkZCAgICAgICAgICAgICB2OS4xNmIsICAgdjkuMTZiLCAgIHYwLjE2YgorICAgIGFkZCAgICAgICAgICAgICB2MTAuMTZiLCAgdjEwLjE2YiwgIHYwLjE2YgorICAgIGFkZCAgICAgICAgICAgICB2MTEuMTZiLCAgdjExLjE2YiwgIHYwLjE2YgorICAgIC8qIFRyYW5zcG9zZSB0aGUgZmluYWwgOC1iaXQgc2FtcGxlcyAqLworICAgIC8qIFRyYW5zcG9zZSAgcTgtcTkgKi8KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHY4LjE2YgorICAgIHRybjEgICAgICAgICAgICB2OC44aCwgICAgdjguOGgsICAgIHY5LjhoCisgICAgdHJuMiAgICAgICAgICAgIHY5LjhoLCAgICB2MTguOGgsICAgdjkuOGgKKyAgICAvKiBUcmFuc3Bvc2UgIHExMC1xMTEgKi8KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHYxMC4xNmIKKyAgICB0cm4xICAgICAgICAgICAgdjEwLjhoLCAgIHYxMC44aCwgICB2MTEuOGgKKyAgICB0cm4yICAgICAgICAgICAgdjExLjhoLCAgIHYxOC44aCwgICB2MTEuOGgKKyAgICAvKiBUcmFuc3Bvc2UgIHE4LXExMCAqLworICAgIG1vdiAgICAgICAgICAgICB2MTguMTZiLCAgdjguMTZiCisgICAgdHJuMSAgICAgICAgICAgIHY4LjRzLCAgICB2OC40cywgICAgdjEwLjRzCisgICAgdHJuMiAgICAgICAgICAgIHYxMC40cywgICB2MTguNHMsICAgdjEwLjRzCisgICAgLyogVHJhbnNwb3NlICBxOS1xMTEgKi8KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHY5LjE2YgorICAgIHRybjEgICAgICAgICAgICB2OS40cywgICAgdjkuNHMsICAgIHYxMS40cworICAgIHRybjIgICAgICAgICAgICB2MTEuNHMsICAgdjE4LjRzLCAgIHYxMS40cworICAgIC8qIG1ha2UgY29weSAqLworICAgIGlucyAgICAgICAgICAgICB2MTcuZFswXSwgdjguZFsxXQorICAgIC8qIFRyYW5zcG9zZSAgZDE2LWQxNy1tc2IgKi8KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHY4LjE2YgorICAgIHRybjEgICAgICAgICAgICB2OC44YiwgICAgdjguOGIsICAgIHYxNy44YgorICAgIHRybjIgICAgICAgICAgICB2MTcuOGIsICAgdjE4LjhiLCAgIHYxNy44YgorICAgIC8qIG1ha2UgY29weSAqLworICAgIGlucyAgICAgICAgICAgICB2MTkuZFswXSwgdjkuZFsxXQorICAgIG1vdiAgICAgICAgICAgICB2MTguMTZiLCAgdjkuMTZiCisgICAgdHJuMSAgICAgICAgICAgIHY5LjhiLCAgICB2OS44YiwgICAgdjE5LjhiCisgICAgdHJuMiAgICAgICAgICAgIHYxOS44YiwgICB2MTguOGIsICAgdjE5LjhiCisgICAgLyogU3RvcmUgcmVzdWx0cyB0byB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIGxkcCAgICAgICAgICAgICBUTVAxLCAgICAgVE1QMiwgICAgIFtPVVRQVVRfQlVGXSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgVE1QMSwgICAgIFRNUDEsICAgICBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDIsICAgICBUTVAyLCAgICAgT1VUUFVUX0NPTAorICAgIHN0MSAgICAgICAgICAgICB7djguOGJ9LCAgW1RNUDFdCisgICAgc3QxICAgICAgICAgICAgIHt2MTcuOGJ9LCBbVE1QMl0KKyAgICBsZHAgICAgICAgICAgICAgVE1QMSwgICAgIFRNUDIsICAgICBbT1VUUFVUX0JVRl0sIDE2CisgICAgYWRkICAgICAgICAgICAgIFRNUDEsICAgICBUTVAxLCAgICAgT1VUUFVUX0NPTAorICAgIGFkZCAgICAgICAgICAgICBUTVAyLCAgICAgVE1QMiwgICAgIE9VVFBVVF9DT0wKKyAgICBzdDEgICAgICAgICAgICAge3Y5LjhifSwgIFtUTVAxXQorICAgIC8qIG1ha2UgY29weSAqLworICAgIGlucyAgICAgICAgICAgICB2Ny5kWzBdLCAgdjEwLmRbMV0KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHYxMC4xNmIKKyAgICB0cm4xICAgICAgICAgICAgdjEwLjhiLCAgIHYxMC44YiwgICB2Ny44YgorICAgIHRybjIgICAgICAgICAgICB2Ny44YiwgICAgdjE4LjhiLCAgIHY3LjhiCisgICAgc3QxICAgICAgICAgICAgIHt2MTkuOGJ9LCBbVE1QMl0KKyAgICBsZHAgICAgICAgICAgICAgVE1QMSwgICAgIFRNUDIsICAgICBbT1VUUFVUX0JVRl0sIDE2CisgICAgbGRwICAgICAgICAgICAgIFRNUDQsICAgICBUTVA1LCAgICAgW09VVFBVVF9CVUZdLCAxNgorICAgIGFkZCAgICAgICAgICAgICBUTVAxLCAgICAgVE1QMSwgICAgIE9VVFBVVF9DT0wKKyAgICBhZGQgICAgICAgICAgICAgVE1QMiwgICAgIFRNUDIsICAgICBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDQsICAgICBUTVA0LCAgICAgT1VUUFVUX0NPTAorICAgIGFkZCAgICAgICAgICAgICBUTVA1LCAgICAgVE1QNSwgICAgIE9VVFBVVF9DT0wKKyAgICBzdDEgICAgICAgICAgICAge3YxMC44Yn0sIFtUTVAxXQorICAgIC8qIG1ha2UgY29weSAqLworICAgIGlucyAgICAgICAgICAgICB2MTYuZFswXSwgdjExLmRbMV0KKyAgICBtb3YgICAgICAgICAgICAgdjE4LjE2YiwgIHYxMS4xNmIKKyAgICB0cm4xICAgICAgICAgICAgdjExLjhiLCAgIHYxMS44YiwgICB2MTYuOGIKKyAgICB0cm4yICAgICAgICAgICAgdjE2LjhiLCAgIHYxOC44YiwgICB2MTYuOGIKKyAgICBzdDEgICAgICAgICAgICAge3Y3LjhifSwgIFtUTVAyXQorICAgIHN0MSAgICAgICAgICAgICB7djExLjhifSwgW1RNUDRdCisgICAgc3QxICAgICAgICAgICAgIHt2MTYuOGJ9LCBbVE1QNV0KKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMTc2CisgICAgbGRwICAgICAgICAgICAgIHgyMiwgeDIzLCBbc3BdLCAxNgorICAgIGxkMSAgICAgICAgICAgICB7djAuOGIsIHYxLjhiLCB2Mi44YiwgdjMuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djQuOGIsIHY1LjhiLCB2Ni44YiwgdjcuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djguOGIsIHY5LjhiLCB2MTAuOGIsIHYxMS44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2MTIuOGIsIHYxMy44YiwgdjE0LjhiLCB2MTUuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djE2LjhiLCB2MTcuOGIsIHYxOC44YiwgdjE5LjhifSwgW3NwXSwgMzIKKyAgICBibHIgICAgICAgICAgICAgeDMwCisKKyAgICAudW5yZXEgICAgICAgICAgRENUX1RBQkxFCisgICAgLnVucmVxICAgICAgICAgIENPRUZfQkxPQ0sKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0JVRgorICAgIC51bnJlcSAgICAgICAgICBPVVRQVVRfQ09MCisgICAgLnVucmVxICAgICAgICAgIFRNUDEKKyAgICAudW5yZXEgICAgICAgICAgVE1QMgorICAgIC51bnJlcSAgICAgICAgICBUTVAzCisgICAgLnVucmVxICAgICAgICAgIFRNUDQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBqc2ltZF9pZGN0XzR4NF9uZW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjb250YWlucyBpbnZlcnNlLURDVCBjb2RlIGZvciBnZXR0aW5nIHJlZHVjZWQtc2l6ZQorICogNHg0IHBpeGVscyBvdXRwdXQgZnJvbSBhbiA4eDggRENUIGJsb2NrLiBJdCB1c2VzIHRoZSBzYW1lICBjYWxjdWxhdGlvbnMKKyAqIGFuZCBwcm9kdWNlcyBleGFjdGx5IHRoZSBzYW1lIG91dHB1dCBhcyBJSkcncyBvcmlnaW5hbCAnanBlZ19pZGN0XzR4NCcKKyAqIGZ1bmN0aW9uIGZyb20ganBlZy02YiAoamlkY3RyZWQuYykuCisgKgorICogTk9URToganBlZy04IGhhcyBhbiBpbXByb3ZlZCBpbXBsZW1lbnRhdGlvbiBvZiA0eDQgaW52ZXJzZS1EQ1QsIHdoaWNoCisgKiAgICAgICByZXF1aXJlcyBtdWNoIGxlc3MgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGFuZCBoZW5jZSBzaG91bGQgYmUgZmFzdGVyLgorICogICAgICAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIHBhcnRpY3VsYXIgTkVPTiBvcHRpbWl6ZWQgZnVuY3Rpb24gaXMKKyAqICAgICAgIGJpdCBleGFjdCBjb21wYXRpYmlsaXR5IHdpdGgganBlZy02Yi4KKyAqCisgKiBUT0RPOiBhIGJpdCBiZXR0ZXIgaW5zdHJ1Y3Rpb25zIHNjaGVkdWxpbmcgY2FuIGJlIGFjaGlldmVkIGJ5IGV4cGFuZGluZworICogICAgICAgaWRjdF9oZWxwZXIvdHJhbnNwb3NlXzR4NCBtYWNyb3MgYW5kIHJlb3JkZXJpbmcgaW5zdHJ1Y3Rpb25zLAorICogICAgICAgYnV0IHJlYWRhYmlsaXR5IHdpbGwgc3VmZmVyIHNvbWV3aGF0LgorICovCisKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKworI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgICgxNzMwKSAgLyogRklYKDAuMjExMTY0MjQzKSAqLworI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgICg0MTc2KSAgLyogRklYKDAuNTA5Nzk1NTc5KSAqLworI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgICg0OTI2KSAgLyogRklYKDAuNjAxMzQ0ODg3KSAqLworI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgICg1OTA2KSAgLyogRklYKDAuNzIwOTU5ODIyKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICg2MjcwKSAgLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgICg2OTY3KSAgLyogRklYKDAuODUwNDMwMDk1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICg3MzczKSAgLyogRklYKDAuODk5OTc2MjIzKSAqLworI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgICg4Njk3KSAgLyogRklYKDEuMDYxNTk0MzM3KSAqLworI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgICgxMDQyNikgLyogRklYKDEuMjcyNzU4NTgwKSAqLworI2RlZmluZSBGSVhfMV80NTE3NzQ5ODEgICgxMTg5MykgLyogRklYKDEuNDUxNzc0OTgxKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgxNTEzNykgLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgICgxNzc5OSkgLyogRklYKDIuMTcyNzM0ODAzKSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgyMDk5NSkgLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgICgyOTY5MikgLyogRklYKDMuNjI0NTA5Nzg1KSAqLworCisuYmFsaWduIDE2CitManNpbWRfaWRjdF80eDRfbmVvbl9jb25zdHM6CisgICAgLnNob3J0ICAgICBGSVhfMV84NDc3NTkwNjUgICAgIC8qIHYwLmhbMF0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMF83NjUzNjY4NjUgICAgLyogdjAuaFsxXSAqLworICAgIC5zaG9ydCAgICAgLUZJWF8wXzIxMTE2NDI0MyAgICAvKiB2MC5oWzJdICovCisgICAgLnNob3J0ICAgICBGSVhfMV80NTE3NzQ5ODEgICAgIC8qIHYwLmhbM10gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMl8xNzI3MzQ4MDMgICAgLyogZDFbMF0gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8xXzA2MTU5NDMzNyAgICAgLyogZDFbMV0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMF81MDk3OTU1NzkgICAgLyogZDFbMl0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMF82MDEzNDQ4ODcgICAgLyogZDFbM10gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8wXzg5OTk3NjIyMyAgICAgLyogdjIuaFswXSAqLworICAgIC5zaG9ydCAgICAgRklYXzJfNTYyOTE1NDQ3ICAgICAvKiB2Mi5oWzFdICovCisgICAgLnNob3J0ICAgICAxIDw8IChDT05TVF9CSVRTKzEpIC8qIHYyLmhbMl0gKi8KKyAgICAuc2hvcnQgICAgIDAgICAgICAgICAgICAgICAgICAgLyogdjIuaFszXSAqLworCisubWFjcm8gaWRjdF9oZWxwZXIgeDQsIHg2LCB4OCwgeDEwLCB4MTIsIHgxNCwgeDE2LCBzaGlmdCwgeTI2LCB5MjcsIHkyOCwgeTI5CisgICAgc211bGwgICAgICAgICAgIHYyOC40cywgXHg0LCAgICB2Mi5oWzJdCisgICAgc21sYWwgICAgICAgICAgIHYyOC40cywgXHg4LCAgICB2MC5oWzBdCisgICAgc21sYWwgICAgICAgICAgIHYyOC40cywgXHgxNCwgICB2MC5oWzFdCisKKyAgICBzbXVsbCAgICAgICAgICAgdjI2LjRzLCBceDE2LCAgIHYxLmhbMl0KKyAgICBzbWxhbCAgICAgICAgICAgdjI2LjRzLCBceDEyLCAgIHYxLmhbM10KKyAgICBzbWxhbCAgICAgICAgICAgdjI2LjRzLCBceDEwLCAgIHYyLmhbMF0KKyAgICBzbWxhbCAgICAgICAgICAgdjI2LjRzLCBceDYsICAgIHYyLmhbMV0KKworICAgIHNtdWxsICAgICAgICAgICB2MzAuNHMsIFx4NCwgICAgdjIuaFsyXQorICAgIHNtbHNsICAgICAgICAgICB2MzAuNHMsIFx4OCwgICAgdjAuaFswXQorICAgIHNtbHNsICAgICAgICAgICB2MzAuNHMsIFx4MTQsICAgdjAuaFsxXQorCisgICAgc211bGwgICAgICAgICAgIHYyNC40cywgXHgxNiwgICB2MC5oWzJdCisgICAgc21sYWwgICAgICAgICAgIHYyNC40cywgXHgxMiwgICB2MC5oWzNdCisgICAgc21sYWwgICAgICAgICAgIHYyNC40cywgXHgxMCwgICB2MS5oWzBdCisgICAgc21sYWwgICAgICAgICAgIHYyNC40cywgXHg2LCAgICB2MS5oWzFdCisKKyAgICBhZGQgICAgICAgICAgICAgdjIwLjRzLCB2MjguNHMsIHYyNi40cworICAgIHN1YiAgICAgICAgICAgICB2MjguNHMsIHYyOC40cywgdjI2LjRzCisKKy5pZiBcc2hpZnQgPiAxNgorICAgIHNyc2hyICAgICAgICAgICB2MjAuNHMsIHYyMC40cywgI1xzaGlmdAorICAgIHNyc2hyICAgICAgICAgICB2MjguNHMsIHYyOC40cywgI1xzaGlmdAorICAgIHh0biAgICAgICAgICAgICBceTI2LCAgIHYyMC40cworICAgIHh0biAgICAgICAgICAgICBceTI5LCAgIHYyOC40cworLmVsc2UKKyAgICByc2hybiAgICAgICAgICAgXHkyNiwgICB2MjAuNHMsICNcc2hpZnQKKyAgICByc2hybiAgICAgICAgICAgXHkyOSwgICB2MjguNHMsICNcc2hpZnQKKy5lbmRpZgorCisgICAgYWRkICAgICAgICAgICAgIHYyMC40cywgdjMwLjRzLCB2MjQuNHMKKyAgICBzdWIgICAgICAgICAgICAgdjMwLjRzLCB2MzAuNHMsIHYyNC40cworCisuaWYgXHNoaWZ0ID4gMTYKKyAgICBzcnNociAgICAgICAgICAgdjIwLjRzLCB2MjAuNHMsICNcc2hpZnQKKyAgICBzcnNociAgICAgICAgICAgdjMwLjRzLCB2MzAuNHMsICNcc2hpZnQKKyAgICB4dG4gICAgICAgICAgICAgXHkyNywgICB2MjAuNHMKKyAgICB4dG4gICAgICAgICAgICAgXHkyOCwgICB2MzAuNHMKKy5lbHNlCisgICAgcnNocm4gICAgICAgICAgIFx5MjcsICAgdjIwLjRzLCAjXHNoaWZ0CisgICAgcnNocm4gICAgICAgICAgIFx5MjgsICAgdjMwLjRzLCAjXHNoaWZ0CisuZW5kaWYKKworLmVuZG0KKworYXNtX2Z1bmN0aW9uIGpzaW1kX2lkY3RfNHg0X25lb24KKworICAgIERDVF9UQUJMRSAgICAgICAucmVxIHgwCisgICAgQ09FRl9CTE9DSyAgICAgIC5yZXEgeDEKKyAgICBPVVRQVVRfQlVGICAgICAgLnJlcSB4MgorICAgIE9VVFBVVF9DT0wgICAgICAucmVxIHgzCisgICAgVE1QMSAgICAgICAgICAgIC5yZXEgeDAKKyAgICBUTVAyICAgICAgICAgICAgLnJlcSB4MQorICAgIFRNUDMgICAgICAgICAgICAucmVxIHgyCisgICAgVE1QNCAgICAgICAgICAgIC5yZXEgeDE1CisKKyAgICAvKiBPVVRQVVRfQ09MIGlzIGEgSkRJTUVOU0lPTiAodW5zaWduZWQgaW50KSBhcmd1bWVudCwgc28gdGhlIEFCSSBkb2Vzbid0CisgICAgICAgZ3VhcmFudGVlIHRoYXQgdGhlIHVwcGVyICh1bnVzZWQpIDMyIGJpdHMgb2YgeDMgYXJlIHZhbGlkLiAgVGhpcworICAgICAgIGluc3RydWN0aW9uIGVuc3VyZXMgdGhhdCB0aG9zZSBiaXRzIGFyZSBzZXQgdG8gemVyby4gKi8KKyAgICB1eHR3IHgzLCB3MworCisgICAgLyogU2F2ZSBhbGwgdXNlZCBORU9OIHJlZ2lzdGVycyAqLworICAgIHN1YiAgICAgICAgICAgICBzcCwgc3AsIDI3MgorICAgIHN0ciAgICAgICAgICAgICB4MTUsIFtzcF0sIDE2CisgICAgLyogTG9hZCBjb25zdGFudHMgKHYzLjRoIGlzIGp1c3QgdXNlZCBmb3IgcGFkZGluZykgKi8KKyAgICBhZHIgICAgICAgICAgICAgVE1QNCwgTGpzaW1kX2lkY3RfNHg0X25lb25fY29uc3RzCisgICAgc3QxICAgICAgICAgICAgIHt2MC44YiwgdjEuOGIsIHYyLjhiLCB2My44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2NC44YiwgdjUuOGIsIHY2LjhiLCB2Ny44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2OC44YiwgdjkuOGIsIHYxMC44YiwgdjExLjhifSwgW3NwXSwgMzIKKyAgICBzdDEgICAgICAgICAgICAge3YxMi44YiwgdjEzLjhiLCB2MTQuOGIsIHYxNS44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MTYuOGIsIHYxNy44YiwgdjE4LjhiLCB2MTkuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djIwLjhiLCB2MjEuOGIsIHYyMi44YiwgdjIzLjhifSwgW3NwXSwgMzIKKyAgICBzdDEgICAgICAgICAgICAge3YyNC44YiwgdjI1LjhiLCB2MjYuOGIsIHYyNy44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MjguOGIsIHYyOS44YiwgdjMwLjhiLCB2MzEuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djAuNGgsIHYxLjRoLCB2Mi40aCwgdjMuNGh9LCBbVE1QNF0KKworICAgIC8qIExvYWQgYWxsIENPRUZfQkxPQ0sgaW50byBORU9OIHJlZ2lzdGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgYWxsb2NhdGlvbjoKKyAgICAgKiAgICAgICAwIDEgMiAzIHwgNCA1IDYgNworICAgICAqICAgICAgLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICogICAwIHwgdjQuNGggICB8IHY1LjRoCisgICAgICogICAxIHwgdjYuNGggICB8IHY3LjRoCisgICAgICogICAyIHwgdjguNGggICB8IHY5LjRoCisgICAgICogICAzIHwgdjEwLjRoICB8IHYxMS40aAorICAgICAqICAgNCB8IC0gICAgICAgfCAtCisgICAgICogICA1IHwgdjEyLjRoICB8IHYxMy40aAorICAgICAqICAgNiB8IHYxNC40aCAgfCB2MTUuNGgKKyAgICAgKiAgIDcgfCB2MTYuNGggIHwgdjE3LjRoCisgICAgICovCisgICAgbGQxICAgICAgICAgICAgIHt2NC40aCwgdjUuNGgsIHY2LjRoLCB2Ny40aH0sIFtDT0VGX0JMT0NLXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3Y4LjRoLCB2OS40aCwgdjEwLjRoLCB2MTEuNGh9LCBbQ09FRl9CTE9DS10sIDMyCisgICAgYWRkICAgICAgICAgICAgIENPRUZfQkxPQ0ssIENPRUZfQkxPQ0ssICMxNgorICAgIGxkMSAgICAgICAgICAgICB7djEyLjRoLCB2MTMuNGgsIHYxNC40aCwgdjE1LjRofSwgW0NPRUZfQkxPQ0tdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djE2LjRoLCB2MTcuNGh9LCBbQ09FRl9CTE9DS10sIDE2CisgICAgLyogZGVxdWFudGl6ZSAqLworICAgIGxkMSAgICAgICAgICAgICB7djE4LjRoLCB2MTkuNGgsIHYyMC40aCwgdjIxLjRofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbXVsICAgICAgICAgICAgIHY0LjRoLCB2NC40aCwgdjE4LjRoCisgICAgbXVsICAgICAgICAgICAgIHY1LjRoLCB2NS40aCwgdjE5LjRoCisgICAgaW5zICAgICAgICAgICAgIHY0LmRbMV0sIHY1LmRbMF0gICAgLyogMTI4IGJpdCBxNCAqLworICAgIGxkMSAgICAgICAgICAgICB7djIyLjRoLCB2MjMuNGgsIHYyNC40aCwgdjI1LjRofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbXVsICAgICAgICAgICAgIHY2LjRoLCB2Ni40aCwgdjIwLjRoCisgICAgbXVsICAgICAgICAgICAgIHY3LjRoLCB2Ny40aCwgdjIxLjRoCisgICAgaW5zICAgICAgICAgICAgIHY2LmRbMV0sIHY3LmRbMF0gICAgLyogMTI4IGJpdCBxNiAqLworICAgIG11bCAgICAgICAgICAgICB2OC40aCwgdjguNGgsIHYyMi40aAorICAgIG11bCAgICAgICAgICAgICB2OS40aCwgdjkuNGgsIHYyMy40aAorICAgIGlucyAgICAgICAgICAgICB2OC5kWzFdLCB2OS5kWzBdICAgIC8qIDEyOCBiaXQgcTggKi8KKyAgICBhZGQgICAgICAgICAgICAgRENUX1RBQkxFLCBEQ1RfVEFCTEUsICMxNgorICAgIGxkMSAgICAgICAgICAgICB7djI2LjRoLCB2MjcuNGgsIHYyOC40aCwgdjI5LjRofSwgW0RDVF9UQUJMRV0sIDMyCisgICAgbXVsICAgICAgICAgICAgIHYxMC40aCwgdjEwLjRoLCB2MjQuNGgKKyAgICBtdWwgICAgICAgICAgICAgdjExLjRoLCB2MTEuNGgsIHYyNS40aAorICAgIGlucyAgICAgICAgICAgICB2MTAuZFsxXSwgdjExLmRbMF0gIC8qIDEyOCBiaXQgcTEwICovCisgICAgbXVsICAgICAgICAgICAgIHYxMi40aCwgdjEyLjRoLCB2MjYuNGgKKyAgICBtdWwgICAgICAgICAgICAgdjEzLjRoLCB2MTMuNGgsIHYyNy40aAorICAgIGlucyAgICAgICAgICAgICB2MTIuZFsxXSwgdjEzLmRbMF0gIC8qIDEyOCBiaXQgcTEyICovCisgICAgbGQxICAgICAgICAgICAgIHt2MzAuNGgsIHYzMS40aH0sIFtEQ1RfVEFCTEVdLCAxNgorICAgIG11bCAgICAgICAgICAgICB2MTQuNGgsIHYxNC40aCwgdjI4LjRoCisgICAgbXVsICAgICAgICAgICAgIHYxNS40aCwgdjE1LjRoLCB2MjkuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjE0LmRbMV0sIHYxNS5kWzBdICAvKiAxMjggYml0IHExNCAqLworICAgIG11bCAgICAgICAgICAgICB2MTYuNGgsIHYxNi40aCwgdjMwLjRoCisgICAgbXVsICAgICAgICAgICAgIHYxNy40aCwgdjE3LjRoLCB2MzEuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjE2LmRbMV0sIHYxNy5kWzBdICAvKiAxMjggYml0IHExNiAqLworCisgICAgLyogUGFzcyAxICovCisgICAgaWRjdF9oZWxwZXIgICAgIHY0LjRoLCB2Ni40aCwgdjguNGgsIHYxMC40aCwgdjEyLjRoLCB2MTQuNGgsIHYxNi40aCwgMTIsIHY0LjRoLCB2Ni40aCwgdjguNGgsIHYxMC40aAorICAgIHRyYW5zcG9zZV80eDQgICB2NCwgdjYsIHY4LCB2MTAsIHYzCisgICAgaW5zICAgICAgICAgICAgIHYxMC5kWzFdLCB2MTEuZFswXQorICAgIGlkY3RfaGVscGVyICAgICB2NS40aCwgdjcuNGgsIHY5LjRoLCB2MTEuNGgsIHYxMy40aCwgdjE1LjRoLCB2MTcuNGgsIDEyLCB2NS40aCwgdjcuNGgsIHY5LjRoLCB2MTEuNGgKKyAgICB0cmFuc3Bvc2VfNHg0ICAgdjUsIHY3LCB2OSwgdjExLCB2MworICAgIGlucyAgICAgICAgICAgICB2MTAuZFsxXSwgdjExLmRbMF0KKyAgICAvKiBQYXNzIDIgKi8KKyAgICBpZGN0X2hlbHBlciAgICAgdjQuNGgsIHY2LjRoLCB2OC40aCwgdjEwLjRoLCB2Ny40aCwgdjkuNGgsIHYxMS40aCwgMTksIHYyNi40aCwgdjI3LjRoLCB2MjguNGgsIHYyOS40aAorICAgIHRyYW5zcG9zZV80eDQgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzCisKKyAgICAvKiBSYW5nZSBsaW1pdCAqLworICAgIG1vdmkgICAgICAgICAgICB2MzAuOGgsICMweDgwCisgICAgaW5zICAgICAgICAgICAgIHYyNi5kWzFdLCB2MjcuZFswXQorICAgIGlucyAgICAgICAgICAgICB2MjguZFsxXSwgdjI5LmRbMF0KKyAgICBhZGQgICAgICAgICAgICAgdjI2LjhoLCB2MjYuOGgsIHYzMC44aAorICAgIGFkZCAgICAgICAgICAgICB2MjguOGgsIHYyOC44aCwgdjMwLjhoCisgICAgc3F4dHVuICAgICAgICAgIHYyNi44YiwgdjI2LjhoCisgICAgc3F4dHVuICAgICAgICAgIHYyNy44YiwgdjI4LjhoCisKKyAgICAvKiBTdG9yZSByZXN1bHRzIHRvIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgbGRwICAgICAgICAgICAgIFRNUDEsIFRNUDIsIFtPVVRQVVRfQlVGXSwgMTYKKyAgICBsZHAgICAgICAgICAgICAgVE1QMywgVE1QNCwgW09VVFBVVF9CVUZdCisgICAgYWRkICAgICAgICAgICAgIFRNUDEsIFRNUDEsIE9VVFBVVF9DT0wKKyAgICBhZGQgICAgICAgICAgICAgVE1QMiwgVE1QMiwgT1VUUFVUX0NPTAorICAgIGFkZCAgICAgICAgICAgICBUTVAzLCBUTVAzLCBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDQsIFRNUDQsIE9VVFBVVF9DT0wKKworI2lmIGRlZmluZWQoX19BUk1FTF9fKSAmJiAhUkVTUEVDVF9TVFJJQ1RfQUxJR05NRU5UCisgICAgLyogV2UgY2FuIHVzZSBtdWNoIGxlc3MgaW5zdHJ1Y3Rpb25zIG9uIGxpdHRsZSBlbmRpYW4gc3lzdGVtcyBpZiB0aGUKKyAgICAgKiBPUyBrZXJuZWwgaXMgbm90IGNvbmZpZ3VyZWQgdG8gdHJhcCB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzCisgICAgICovCisgICAgc3QxICAgICAgICAgICAgIHt2MjYuc31bMF0sIFtUTVAxXSwgNAorICAgIHN0MSAgICAgICAgICAgICB7djI3LnN9WzBdLCBbVE1QM10sIDQKKyAgICBzdDEgICAgICAgICAgICAge3YyNi5zfVsxXSwgW1RNUDJdLCA0CisgICAgc3QxICAgICAgICAgICAgIHt2Mjcuc31bMV0sIFtUTVA0XSwgNAorI2Vsc2UKKyAgICBzdDEgICAgICAgICAgICAge3YyNi5ifVswXSwgW1RNUDFdLCAxCisgICAgc3QxICAgICAgICAgICAgIHt2MjcuYn1bMF0sIFtUTVAzXSwgMQorICAgIHN0MSAgICAgICAgICAgICB7djI2LmJ9WzFdLCBbVE1QMV0sIDEKKyAgICBzdDEgICAgICAgICAgICAge3YyNy5ifVsxXSwgW1RNUDNdLCAxCisgICAgc3QxICAgICAgICAgICAgIHt2MjYuYn1bMl0sIFtUTVAxXSwgMQorICAgIHN0MSAgICAgICAgICAgICB7djI3LmJ9WzJdLCBbVE1QM10sIDEKKyAgICBzdDEgICAgICAgICAgICAge3YyNi5ifVszXSwgW1RNUDFdLCAxCisgICAgc3QxICAgICAgICAgICAgIHt2MjcuYn1bM10sIFtUTVAzXSwgMQorCisgICAgc3QxICAgICAgICAgICAgIHt2MjYuYn1bNF0sIFtUTVAyXSwgMQorICAgIHN0MSAgICAgICAgICAgICB7djI3LmJ9WzRdLCBbVE1QNF0sIDEKKyAgICBzdDEgICAgICAgICAgICAge3YyNi5ifVs1XSwgW1RNUDJdLCAxCisgICAgc3QxICAgICAgICAgICAgIHt2MjcuYn1bNV0sIFtUTVA0XSwgMQorICAgIHN0MSAgICAgICAgICAgICB7djI2LmJ9WzZdLCBbVE1QMl0sIDEKKyAgICBzdDEgICAgICAgICAgICAge3YyNy5ifVs2XSwgW1RNUDRdLCAxCisgICAgc3QxICAgICAgICAgICAgIHt2MjYuYn1bN10sIFtUTVAyXSwgMQorICAgIHN0MSAgICAgICAgICAgICB7djI3LmJ9WzddLCBbVE1QNF0sIDEKKyNlbmRpZgorCisgICAgLyogdnBvcCAgICAgICAgICAgIHt2OC40aCAtIHYxNS40aH0gICAgO25vdCBhdmFpbGFibGUgKi8KKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMjcyCisgICAgbGRyICAgICAgICAgICAgIHgxNSwgW3NwXSwgMTYKKyAgICBsZDEgICAgICAgICAgICAge3YwLjhiLCB2MS44YiwgdjIuOGIsIHYzLjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3Y0LjhiLCB2NS44YiwgdjYuOGIsIHY3LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3Y4LjhiLCB2OS44YiwgdjEwLjhiLCB2MTEuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djEyLjhiLCB2MTMuOGIsIHYxNC44YiwgdjE1LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YxNi44YiwgdjE3LjhiLCB2MTguOGIsIHYxOS44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGIsIHYyMS44YiwgdjIyLjhiLCB2MjMuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djI0LjhiLCB2MjUuOGIsIHYyNi44YiwgdjI3LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YyOC44YiwgdjI5LjhiLCB2MzAuOGIsIHYzMS44Yn0sIFtzcF0sIDMyCisgICAgYmxyICAgICAgICAgICAgIHgzMAorCisgICAgLnVucmVxICAgICAgICAgIERDVF9UQUJMRQorICAgIC51bnJlcSAgICAgICAgICBDT0VGX0JMT0NLCisgICAgLnVucmVxICAgICAgICAgIE9VVFBVVF9CVUYKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0NPTAorICAgIC51bnJlcSAgICAgICAgICBUTVAxCisgICAgLnVucmVxICAgICAgICAgIFRNUDIKKyAgICAudW5yZXEgICAgICAgICAgVE1QMworICAgIC51bnJlcSAgICAgICAgICBUTVA0CisKKy5wdXJnZW0gaWRjdF9oZWxwZXIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBqc2ltZF9pZGN0XzJ4Ml9uZW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjb250YWlucyBpbnZlcnNlLURDVCBjb2RlIGZvciBnZXR0aW5nIHJlZHVjZWQtc2l6ZQorICogMngyIHBpeGVscyBvdXRwdXQgZnJvbSBhbiA4eDggRENUIGJsb2NrLiBJdCB1c2VzIHRoZSBzYW1lICBjYWxjdWxhdGlvbnMKKyAqIGFuZCBwcm9kdWNlcyBleGFjdGx5IHRoZSBzYW1lIG91dHB1dCBhcyBJSkcncyBvcmlnaW5hbCAnanBlZ19pZGN0XzJ4MicKKyAqIGZ1bmN0aW9uIGZyb20ganBlZy02YiAoamlkY3RyZWQuYykuCisgKgorICogTk9URToganBlZy04IGhhcyBhbiBpbXByb3ZlZCBpbXBsZW1lbnRhdGlvbiBvZiAyeDIgaW52ZXJzZS1EQ1QsIHdoaWNoCisgKiAgICAgICByZXF1aXJlcyBtdWNoIGxlc3MgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGFuZCBoZW5jZSBzaG91bGQgYmUgZmFzdGVyLgorICogICAgICAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIHBhcnRpY3VsYXIgTkVPTiBvcHRpbWl6ZWQgZnVuY3Rpb24gaXMKKyAqICAgICAgIGJpdCBleGFjdCBjb21wYXRpYmlsaXR5IHdpdGgganBlZy02Yi4KKyAqLworCisuYmFsaWduIDgKK0xqc2ltZF9pZGN0XzJ4Ml9uZW9uX2NvbnN0czoKKyAgICAuc2hvcnQgICAgIC1GSVhfMF83MjA5NTk4MjIgICAgLyogdjE0WzBdICovCisgICAgLnNob3J0ICAgICBGSVhfMF84NTA0MzAwOTUgICAgIC8qIHYxNFsxXSAqLworICAgIC5zaG9ydCAgICAgLUZJWF8xXzI3Mjc1ODU4MCAgICAvKiB2MTRbMl0gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8zXzYyNDUwOTc4NSAgICAgLyogdjE0WzNdICovCisKKy5tYWNybyBpZGN0X2hlbHBlciB4NCwgeDYsIHgxMCwgeDEyLCB4MTYsIHNoaWZ0LCB5MjYsIHkyNworICAgIHNzaGxsICAgICAgdjE1LjRzLCBceDQsICAgICMxNQorICAgIHNtdWxsICAgICAgdjI2LjRzLCBceDYsICAgIHYxNC5oWzNdCisgICAgc21sYWwgICAgICB2MjYuNHMsIFx4MTAsICAgdjE0LmhbMl0KKyAgICBzbWxhbCAgICAgIHYyNi40cywgXHgxMiwgICB2MTQuaFsxXQorICAgIHNtbGFsICAgICAgdjI2LjRzLCBceDE2LCAgIHYxNC5oWzBdCisKKyAgICBhZGQgICAgICAgIHYyMC40cywgdjE1LjRzLCB2MjYuNHMKKyAgICBzdWIgICAgICAgIHYxNS40cywgdjE1LjRzLCB2MjYuNHMKKworLmlmIFxzaGlmdCA+IDE2CisgICAgc3JzaHIgICAgICB2MjAuNHMsIHYyMC40cywgI1xzaGlmdAorICAgIHNyc2hyICAgICAgdjE1LjRzLCB2MTUuNHMsICNcc2hpZnQKKyAgICB4dG4gICAgICAgIFx5MjYsICAgdjIwLjRzCisgICAgeHRuICAgICAgICBceTI3LCAgIHYxNS40cworLmVsc2UKKyAgICByc2hybiAgICAgIFx5MjYsICAgdjIwLjRzLCAjXHNoaWZ0CisgICAgcnNocm4gICAgICBceTI3LCAgIHYxNS40cywgI1xzaGlmdAorLmVuZGlmCisKKy5lbmRtCisKK2FzbV9mdW5jdGlvbiBqc2ltZF9pZGN0XzJ4Ml9uZW9uCisKKyAgICBEQ1RfVEFCTEUgICAgICAgLnJlcSB4MAorICAgIENPRUZfQkxPQ0sgICAgICAucmVxIHgxCisgICAgT1VUUFVUX0JVRiAgICAgIC5yZXEgeDIKKyAgICBPVVRQVVRfQ09MICAgICAgLnJlcSB4MworICAgIFRNUDEgICAgICAgICAgICAucmVxIHgwCisgICAgVE1QMiAgICAgICAgICAgIC5yZXEgeDE1CisKKyAgIC8qIE9VVFBVVF9DT0wgaXMgYSBKRElNRU5TSU9OICh1bnNpZ25lZCBpbnQpIGFyZ3VtZW50LCBzbyB0aGUgQUJJIGRvZXNuJ3QKKyAgICAgICBndWFyYW50ZWUgdGhhdCB0aGUgdXBwZXIgKHVudXNlZCkgMzIgYml0cyBvZiB4MyBhcmUgdmFsaWQuICBUaGlzCisgICAgICAgaW5zdHJ1Y3Rpb24gZW5zdXJlcyB0aGF0IHRob3NlIGJpdHMgYXJlIHNldCB0byB6ZXJvLiAqLworICAgIHV4dHcgeDMsIHczCisKKworICAgIC8qIHZwdXNoICAgICAgICAgICB7djguNGggLSB2MTUuNGh9ICAgICAgICAgICAgOyBub3QgYXZhaWxhYmxlICovCisgICAgc3ViICAgICAgICAgICAgIHNwLCBzcCwgMjA4CisgICAgc3RyICAgICAgICAgICAgIHgxNSwgW3NwXSwgMTYKKworICAgIC8qIExvYWQgY29uc3RhbnRzICovCisgICAgYWRyICAgICAgICAgICAgIFRNUDIsIExqc2ltZF9pZGN0XzJ4Ml9uZW9uX2NvbnN0cworICAgIHN0MSAgICAgICAgICAgICB7djQuOGIsIHY1LjhiLCB2Ni44YiwgdjcuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djguOGIsIHY5LjhiLCB2MTAuOGIsIHYxMS44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MTIuOGIsIHYxMy44YiwgdjE0LjhiLCB2MTUuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djE2LjhiLCB2MTcuOGIsIHYxOC44YiwgdjE5LjhifSwgW3NwXSwgMzIKKyAgICBzdDEgICAgICAgICAgICAge3YyMS44YiwgdjIyLjhifSwgW3NwXSwgMTYKKyAgICBzdDEgICAgICAgICAgICAge3YyNC44YiwgdjI1LjhiLCB2MjYuOGIsIHYyNy44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MzAuOGIsIHYzMS44Yn0sIFtzcF0sIDE2CisgICAgbGQxICAgICAgICAgICAgIHt2MTQuNGh9LCBbVE1QMl0KKworICAgIC8qIExvYWQgYWxsIENPRUZfQkxPQ0sgaW50byBORU9OIHJlZ2lzdGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgYWxsb2NhdGlvbjoKKyAgICAgKiAgICAgICAwIDEgMiAzIHwgNCA1IDYgNworICAgICAqICAgICAgLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICogICAwIHwgdjQuNGggICB8IHY1LjRoCisgICAgICogICAxIHwgdjYuNGggICB8IHY3LjRoCisgICAgICogICAyIHwgLSAgICAgICB8IC0KKyAgICAgKiAgIDMgfCB2MTAuNGggIHwgdjExLjRoCisgICAgICogICA0IHwgLSAgICAgICB8IC0KKyAgICAgKiAgIDUgfCB2MTIuNGggIHwgdjEzLjRoCisgICAgICogICA2IHwgLSAgICAgICB8IC0KKyAgICAgKiAgIDcgfCB2MTYuNGggIHwgdjE3LjRoCisgICAgICovCisgICAgbGQxICAgICAgICAgICAgIHt2NC40aCwgdjUuNGgsIHY2LjRoLCB2Ny40aH0sIFtDT0VGX0JMT0NLXSwgMzIKKyAgICBhZGQgICAgICAgICAgICAgQ09FRl9CTE9DSywgQ09FRl9CTE9DSywgIzE2CisgICAgbGQxICAgICAgICAgICAgIHt2MTAuNGgsIHYxMS40aH0sIFtDT0VGX0JMT0NLXSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgQ09FRl9CTE9DSywgQ09FRl9CTE9DSywgIzE2CisgICAgbGQxICAgICAgICAgICAgIHt2MTIuNGgsIHYxMy40aH0sIFtDT0VGX0JMT0NLXSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgQ09FRl9CTE9DSywgQ09FRl9CTE9DSywgIzE2CisgICAgbGQxICAgICAgICAgICAgIHt2MTYuNGgsIHYxNy40aH0sIFtDT0VGX0JMT0NLXSwgMTYKKyAgICAvKiBEZXF1YW50aXplICovCisgICAgbGQxICAgICAgICAgICAgIHt2MTguNGgsIHYxOS40aCwgdjIwLjRoLCB2MjEuNGh9LCBbRENUX1RBQkxFXSwgMzIKKyAgICBtdWwgICAgICAgICAgICAgdjQuNGgsIHY0LjRoLCB2MTguNGgKKyAgICBtdWwgICAgICAgICAgICAgdjUuNGgsIHY1LjRoLCB2MTkuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjQuZFsxXSwgdjUuZFswXQorICAgIG11bCAgICAgICAgICAgICB2Ni40aCwgdjYuNGgsIHYyMC40aAorICAgIG11bCAgICAgICAgICAgICB2Ny40aCwgdjcuNGgsIHYyMS40aAorICAgIGlucyAgICAgICAgICAgICB2Ni5kWzFdLCB2Ny5kWzBdCisgICAgYWRkICAgICAgICAgICAgIERDVF9UQUJMRSwgRENUX1RBQkxFLCAjMTYKKyAgICBsZDEgICAgICAgICAgICAge3YyNC40aCwgdjI1LjRofSwgW0RDVF9UQUJMRV0sIDE2CisgICAgbXVsICAgICAgICAgICAgIHYxMC40aCwgdjEwLjRoLCB2MjQuNGgKKyAgICBtdWwgICAgICAgICAgICAgdjExLjRoLCB2MTEuNGgsIHYyNS40aAorICAgIGlucyAgICAgICAgICAgICB2MTAuZFsxXSwgdjExLmRbMF0KKyAgICBhZGQgICAgICAgICAgICAgRENUX1RBQkxFLCBEQ1RfVEFCTEUsICMxNgorICAgIGxkMSAgICAgICAgICAgICB7djI2LjRoLCB2MjcuNGh9LCBbRENUX1RBQkxFXSwgMTYKKyAgICBtdWwgICAgICAgICAgICAgdjEyLjRoLCB2MTIuNGgsIHYyNi40aAorICAgIG11bCAgICAgICAgICAgICB2MTMuNGgsIHYxMy40aCwgdjI3LjRoCisgICAgaW5zICAgICAgICAgICAgIHYxMi5kWzFdLCB2MTMuZFswXQorICAgIGFkZCAgICAgICAgICAgICBEQ1RfVEFCTEUsIERDVF9UQUJMRSwgIzE2CisgICAgbGQxICAgICAgICAgICAgIHt2MzAuNGgsIHYzMS40aH0sIFtEQ1RfVEFCTEVdLCAxNgorICAgIG11bCAgICAgICAgICAgICB2MTYuNGgsIHYxNi40aCwgdjMwLjRoCisgICAgbXVsICAgICAgICAgICAgIHYxNy40aCwgdjE3LjRoLCB2MzEuNGgKKyAgICBpbnMgICAgICAgICAgICAgdjE2LmRbMV0sIHYxNy5kWzBdCisKKyAgICAvKiBQYXNzIDEgKi8KKyNpZiAwCisgICAgaWRjdF9oZWxwZXIgICAgIHY0LjRoLCB2Ni40aCwgdjEwLjRoLCB2MTIuNGgsIHYxNi40aCwgMTMsIHY0LjRoLCB2Ni40aAorICAgIHRyYW5zcG9zZV80eDQgICB2NC40aCwgdjYuNGgsIHY4LjRoLCAgdjEwLjRoCisgICAgaWRjdF9oZWxwZXIgICAgIHY1LjRoLCB2Ny40aCwgdjExLjRoLCB2MTMuNGgsIHYxNy40aCwgMTMsIHY1LjRoLCB2Ny40aAorICAgIHRyYW5zcG9zZV80eDQgICB2NS40aCwgdjcuNGgsIHY5LjRoLCAgdjExLjRoCisjZWxzZQorICAgIHNtdWxsICAgICAgICAgICB2MjYuNHMsIHY2LjRoLCAgdjE0LmhbM10KKyAgICBzbWxhbCAgICAgICAgICAgdjI2LjRzLCB2MTAuNGgsIHYxNC5oWzJdCisgICAgc21sYWwgICAgICAgICAgIHYyNi40cywgdjEyLjRoLCB2MTQuaFsxXQorICAgIHNtbGFsICAgICAgICAgICB2MjYuNHMsIHYxNi40aCwgdjE0LmhbMF0KKyAgICBzbXVsbCAgICAgICAgICAgdjI0LjRzLCB2Ny40aCwgIHYxNC5oWzNdCisgICAgc21sYWwgICAgICAgICAgIHYyNC40cywgdjExLjRoLCB2MTQuaFsyXQorICAgIHNtbGFsICAgICAgICAgICB2MjQuNHMsIHYxMy40aCwgdjE0LmhbMV0KKyAgICBzbWxhbCAgICAgICAgICAgdjI0LjRzLCB2MTcuNGgsIHYxNC5oWzBdCisgICAgc3NobGwgICAgICAgICAgIHYxNS40cywgdjQuNGgsICAjMTUKKyAgICBzc2hsbCAgICAgICAgICAgdjMwLjRzLCB2NS40aCwgICMxNQorICAgIGFkZCAgICAgICAgICAgICB2MjAuNHMsIHYxNS40cywgdjI2LjRzCisgICAgc3ViICAgICAgICAgICAgIHYxNS40cywgdjE1LjRzLCB2MjYuNHMKKyAgICByc2hybiAgICAgICAgICAgdjQuNGgsICB2MjAuNHMsICMxMworICAgIHJzaHJuICAgICAgICAgICB2Ni40aCwgIHYxNS40cywgIzEzCisgICAgYWRkICAgICAgICAgICAgIHYyMC40cywgdjMwLjRzLCB2MjQuNHMKKyAgICBzdWIgICAgICAgICAgICAgdjE1LjRzLCB2MzAuNHMsIHYyNC40cworICAgIHJzaHJuICAgICAgICAgICB2NS40aCwgIHYyMC40cywgIzEzCisgICAgcnNocm4gICAgICAgICAgIHY3LjRoLCAgdjE1LjRzLCAjMTMKKyAgICBpbnMgICAgICAgICAgICAgdjQuZFsxXSwgdjUuZFswXQorICAgIGlucyAgICAgICAgICAgICB2Ni5kWzFdLCB2Ny5kWzBdCisgICAgdHJhbnNwb3NlICAgICAgIHY0LCB2NiwgdjMsIC4xNmIsIC44aAorICAgIHRyYW5zcG9zZSAgICAgICB2NiwgdjEwLCB2MywgLjE2YiwgLjRzCisgICAgaW5zICAgICAgICAgICAgIHYxMS5kWzBdLCB2MTAuZFsxXQorICAgIGlucyAgICAgICAgICAgICB2Ny5kWzBdLCB2Ni5kWzFdCisjZW5kaWYKKworICAgIC8qIFBhc3MgMiAqLworICAgIGlkY3RfaGVscGVyICAgICB2NC40aCwgdjYuNGgsIHYxMC40aCwgdjcuNGgsIHYxMS40aCwgMjAsIHYyNi40aCwgdjI3LjRoCisKKyAgICAvKiBSYW5nZSBsaW1pdCAqLworICAgIG1vdmkgICAgICAgICAgICB2MzAuOGgsICMweDgwCisgICAgaW5zICAgICAgICAgICAgIHYyNi5kWzFdLCB2MjcuZFswXQorICAgIGFkZCAgICAgICAgICAgICB2MjYuOGgsIHYyNi44aCwgdjMwLjhoCisgICAgc3F4dHVuICAgICAgICAgIHYzMC44YiwgdjI2LjhoCisgICAgaW5zICAgICAgICAgICAgIHYyNi5kWzBdLCB2MzAuZFswXQorICAgIHNxeHR1biAgICAgICAgICB2MjcuOGIsIHYyNi44aAorCisgICAgLyogU3RvcmUgcmVzdWx0cyB0byB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIGxkcCAgICAgICAgICAgICBUTVAxLCBUTVAyLCBbT1VUUFVUX0JVRl0KKyAgICBhZGQgICAgICAgICAgICAgVE1QMSwgVE1QMSwgT1VUUFVUX0NPTAorICAgIGFkZCAgICAgICAgICAgICBUTVAyLCBUTVAyLCBPVVRQVVRfQ09MCisKKyAgICBzdDEgICAgICAgICAgICAge3YyNi5ifVswXSwgW1RNUDFdLCAxCisgICAgc3QxICAgICAgICAgICAgIHt2MjcuYn1bNF0sIFtUTVAxXSwgMQorICAgIHN0MSAgICAgICAgICAgICB7djI2LmJ9WzFdLCBbVE1QMl0sIDEKKyAgICBzdDEgICAgICAgICAgICAge3YyNy5ifVs1XSwgW1RNUDJdLCAxCisKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMjA4CisgICAgbGRyICAgICAgICAgICAgIHgxNSwgW3NwXSwgMTYKKyAgICBsZDEgICAgICAgICAgICAge3Y0LjhiLCB2NS44YiwgdjYuOGIsIHY3LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3Y4LjhiLCB2OS44YiwgdjEwLjhiLCB2MTEuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djEyLjhiLCB2MTMuOGIsIHYxNC44YiwgdjE1LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YxNi44YiwgdjE3LjhiLCB2MTguOGIsIHYxOS44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGIsIHYyMi44Yn0sIFtzcF0sIDE2CisgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGIsIHYyNS44YiwgdjI2LjhiLCB2MjcuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djMwLjhiLCB2MzEuOGJ9LCBbc3BdLCAxNgorICAgIGJsciAgICAgICAgICAgICB4MzAKKworICAgIC51bnJlcSAgICAgICAgICBEQ1RfVEFCTEUKKyAgICAudW5yZXEgICAgICAgICAgQ09FRl9CTE9DSworICAgIC51bnJlcSAgICAgICAgICBPVVRQVVRfQlVGCisgICAgLnVucmVxICAgICAgICAgIE9VVFBVVF9DT0wKKyAgICAudW5yZXEgICAgICAgICAgVE1QMQorICAgIC51bnJlcSAgICAgICAgICBUTVAyCisKKy5wdXJnZW0gaWRjdF9oZWxwZXIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBqc2ltZF95Y2NfZXh0cmdiX2NvbnZlcnRfbmVvbgorICoganNpbWRfeWNjX2V4dGJncl9jb252ZXJ0X25lb24KKyAqIGpzaW1kX3ljY19leHRyZ2J4X2NvbnZlcnRfbmVvbgorICoganNpbWRfeWNjX2V4dGJncnhfY29udmVydF9uZW9uCisgKiBqc2ltZF95Y2NfZXh0eGJncl9jb252ZXJ0X25lb24KKyAqIGpzaW1kX3ljY19leHR4cmdiX2NvbnZlcnRfbmVvbgorICoKKyAqIENvbG9yc3BhY2UgY29udmVyc2lvbiBZQ2JDciAtPiBSR0IKKyAqLworCisKKy5tYWNybyBkb19sb2FkIHNpemUKKyAgICAuaWYgXHNpemUgPT0gOAorICAgICAgICBsZDEgIHt2NC44Yn0sIFtVXSwgOAorICAgICAgICBsZDEgIHt2NS44Yn0sIFtWXSwgOAorICAgICAgICBsZDEgIHt2MC44Yn0sIFtZXSwgOAorICAgICAgICBwcmZtIHBsZGwxa2VlcCwgW1UsICM2NF0KKyAgICAgICAgcHJmbSBwbGRsMWtlZXAsIFtWLCAjNjRdCisgICAgICAgIHByZm0gcGxkbDFrZWVwLCBbWSwgIzY0XQorICAgIC5lbHNlaWYgXHNpemUgPT0gNAorICAgICAgICBsZDEgIHt2NC5ifVswXSwgW1VdLCAxCisgICAgICAgIGxkMSAge3Y0LmJ9WzFdLCBbVV0sIDEKKyAgICAgICAgbGQxICB7djQuYn1bMl0sIFtVXSwgMQorICAgICAgICBsZDEgIHt2NC5ifVszXSwgW1VdLCAxCisgICAgICAgIGxkMSAge3Y1LmJ9WzBdLCBbVl0sIDEKKyAgICAgICAgbGQxICB7djUuYn1bMV0sIFtWXSwgMQorICAgICAgICBsZDEgIHt2NS5ifVsyXSwgW1ZdLCAxCisgICAgICAgIGxkMSAge3Y1LmJ9WzNdLCBbVl0sIDEKKyAgICAgICAgbGQxICB7djAuYn1bMF0sIFtZXSwgMQorICAgICAgICBsZDEgIHt2MC5ifVsxXSwgW1ldLCAxCisgICAgICAgIGxkMSAge3YwLmJ9WzJdLCBbWV0sIDEKKyAgICAgICAgbGQxICB7djAuYn1bM10sIFtZXSwgMQorICAgIC5lbHNlaWYgXHNpemUgPT0gMgorICAgICAgICBsZDEgIHt2NC5ifVs0XSwgW1VdLCAxCisgICAgICAgIGxkMSAge3Y0LmJ9WzVdLCBbVV0sIDEKKyAgICAgICAgbGQxICB7djUuYn1bNF0sIFtWXSwgMQorICAgICAgICBsZDEgIHt2NS5ifVs1XSwgW1ZdLCAxCisgICAgICAgIGxkMSAge3YwLmJ9WzRdLCBbWV0sIDEKKyAgICAgICAgbGQxICB7djAuYn1bNV0sIFtZXSwgMQorICAgIC5lbHNlaWYgXHNpemUgPT0gMQorICAgICAgICBsZDEgIHt2NC5ifVs2XSwgW1VdLCAxCisgICAgICAgIGxkMSAge3Y1LmJ9WzZdLCBbVl0sIDEKKyAgICAgICAgbGQxICB7djAuYn1bNl0sIFtZXSwgMQorICAgIC5lbHNlCisgICAgICAgIC5lcnJvciB1bnN1cHBvcnRlZCBtYWNyb2Jsb2NrIHNpemUKKyAgICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBkb19zdG9yZSBicHAsIHNpemUKKyAgICAuaWYgXGJwcCA9PSAyNAorICAgICAgICAuaWYgXHNpemUgPT0gOAorICAgICAgICAgICAgc3QzICB7djEwLjhiLCB2MTEuOGIsIHYxMi44Yn0sIFtSR0JdLCAyNAorICAgICAgICAuZWxzZWlmIFxzaXplID09IDQKKyAgICAgICAgICAgIHN0MyAge3YxMC5iLCB2MTEuYiwgdjEyLmJ9WzBdLCBbUkdCXSwgMworICAgICAgICAgICAgc3QzICB7djEwLmIsIHYxMS5iLCB2MTIuYn1bMV0sIFtSR0JdLCAzCisgICAgICAgICAgICBzdDMgIHt2MTAuYiwgdjExLmIsIHYxMi5ifVsyXSwgW1JHQl0sIDMKKyAgICAgICAgICAgIHN0MyAge3YxMC5iLCB2MTEuYiwgdjEyLmJ9WzNdLCBbUkdCXSwgMworICAgICAgICAuZWxzZWlmIFxzaXplID09IDIKKyAgICAgICAgICAgIHN0MyAge3YxMC5iLCB2MTEuYiwgdjEyLmJ9WzRdLCBbUkdCXSwgMworICAgICAgICAgICAgc3QzICB7djEwLmIsIHYxMS5iLCB2MTIuYn1bNV0sIFtSR0JdLCAzCisgICAgICAgIC5lbHNlaWYgXHNpemUgPT0gMQorICAgICAgICAgICAgc3QzICB7djEwLmIsIHYxMS5iLCB2MTIuYn1bNl0sIFtSR0JdLCAzCisgICAgICAgIC5lbHNlCisgICAgICAgICAgICAuZXJyb3IgdW5zdXBwb3J0ZWQgbWFjcm9ibG9jayBzaXplCisgICAgICAgIC5lbmRpZgorICAgIC5lbHNlaWYgXGJwcCA9PSAzMgorICAgICAgICAuaWYgXHNpemUgPT0gOAorICAgICAgICAgICAgc3Q0ICB7djEwLjhiLCB2MTEuOGIsIHYxMi44YiwgdjEzLjhifSwgW1JHQl0sIDMyCisgICAgICAgIC5lbHNlaWYgXHNpemUgPT0gNAorICAgICAgICAgICAgc3Q0ICB7djEwLmIsIHYxMS5iLCB2MTIuYiwgdjEzLmJ9WzBdLCBbUkdCXSwgNAorICAgICAgICAgICAgc3Q0ICB7djEwLmIsIHYxMS5iLCB2MTIuYiwgdjEzLmJ9WzFdLCBbUkdCXSwgNAorICAgICAgICAgICAgc3Q0ICB7djEwLmIsIHYxMS5iLCB2MTIuYiwgdjEzLmJ9WzJdLCBbUkdCXSwgNAorICAgICAgICAgICAgc3Q0ICB7djEwLmIsIHYxMS5iLCB2MTIuYiwgdjEzLmJ9WzNdLCBbUkdCXSwgNAorICAgICAgICAuZWxzZWlmIFxzaXplID09IDIKKyAgICAgICAgICAgIHN0NCAge3YxMC5iLCB2MTEuYiwgdjEyLmIsIHYxMy5ifVs0XSwgW1JHQl0sIDQKKyAgICAgICAgICAgIHN0NCAge3YxMC5iLCB2MTEuYiwgdjEyLmIsIHYxMy5ifVs1XSwgW1JHQl0sIDQKKyAgICAgICAgLmVsc2VpZiBcc2l6ZSA9PSAxCisgICAgICAgICAgICBzdDQgIHt2MTAuYiwgdjExLmIsIHYxMi5iLCB2MTMuYn1bNl0sIFtSR0JdLCA0CisgICAgICAgIC5lbHNlCisgICAgICAgICAgICAuZXJyb3IgdW5zdXBwb3J0ZWQgbWFjcm9ibG9jayBzaXplCisgICAgICAgIC5lbmRpZgorICAgIC5lbHNlaWYgXGJwcD09MTYKKyAgICAgICAgLmlmIFxzaXplID09IDgKKyAgICAgICAgICAgIHN0MSAge3YyNS44aH0sIFtSR0JdLDE2CisgICAgICAgIC5lbHNlaWYgXHNpemUgPT0gNAorICAgICAgICAgICAgc3QxICB7djI1LjRofSwgW1JHQl0sOAorICAgICAgICAuZWxzZWlmIFxzaXplID09IDIKKyAgICAgICAgICAgIHN0MSAge3YyNS5ofVs0XSwgW1JHQl0sMgorICAgICAgICAgICAgc3QxICB7djI1Lmh9WzVdLCBbUkdCXSwyCisgICAgICAgIC5lbHNlaWYgXHNpemUgPT0gMQorICAgICAgICAgICAgc3QxICB7djI1Lmh9WzZdLCBbUkdCXSwyCisgICAgICAgIC5lbHNlCisgICAgICAgICAgICAuZXJyb3IgdW5zdXBwb3J0ZWQgbWFjcm9ibG9jayBzaXplCisgICAgICAgIC5lbmRpZgorICAgICAuZWxzZQorICAgICAgICAuZXJyb3IgdW5zdXBwb3J0ZWQgYnBwCisgICAgLmVuZGlmCisuZW5kbQorCisubWFjcm8gZ2VuZXJhdGVfanNpbWRfeWNjX3JnYl9jb252ZXJ0X25lb24gY29sb3JpZCwgYnBwLCByX29mZnMsIHJzaXplLCBnX29mZnMsIGdzaXplLCBiX29mZnMsIGJzaXplLCBkZWZzaXplCisKKy8qCisgKiAyLXN0YWdlIHBpcGVsaW5lZCBZQ2JDci0+UkdCIGNvbnZlcnNpb24KKyAqLworCisubWFjcm8gZG9feXV2X3RvX3JnYl9zdGFnZTEKKyAgICB1YWRkdyAgICAgICAgdjYuOGgsIHYyLjhoLCB2NC44YiAgICAgLyogcTMgPSB1IC0gMTI4ICovCisgICAgdWFkZHcgICAgICAgIHY4LjhoLCB2Mi44aCwgdjUuOGIgICAgIC8qIHEyID0gdiAtIDEyOCAqLworICAgIHNtdWxsICAgICAgICB2MjAuNHMsIHY2LjRoLCB2MS5oWzFdICAvKiBtdWx0aXBseSBieSAtMTEyNzcgKi8KKyAgICBzbWxhbCAgICAgICAgdjIwLjRzLCB2OC40aCwgdjEuaFsyXSAgLyogbXVsdGlwbHkgYnkgLTIzNDAxICovCisgICAgc211bGwyICAgICAgIHYyMi40cywgdjYuOGgsIHYxLmhbMV0gIC8qIG11bHRpcGx5IGJ5IC0xMTI3NyAqLworICAgIHNtbGFsMiAgICAgICB2MjIuNHMsIHY4LjhoLCB2MS5oWzJdICAvKiBtdWx0aXBseSBieSAtMjM0MDEgKi8KKyAgICBzbXVsbCAgICAgICAgdjI0LjRzLCB2OC40aCwgdjEuaFswXSAgLyogbXVsdGlwbHkgYnkgMjI5NzEgKi8KKyAgICBzbXVsbDIgICAgICAgdjI2LjRzLCB2OC44aCwgdjEuaFswXSAgLyogbXVsdGlwbHkgYnkgMjI5NzEgKi8KKyAgICBzbXVsbCAgICAgICAgdjI4LjRzLCB2Ni40aCwgdjEuaFszXSAgLyogbXVsdGlwbHkgYnkgMjkwMzMgKi8KKyAgICBzbXVsbDIgICAgICAgdjMwLjRzLCB2Ni44aCwgdjEuaFszXSAgLyogbXVsdGlwbHkgYnkgMjkwMzMgKi8KKy5lbmRtCisKKy5tYWNybyBkb195dXZfdG9fcmdiX3N0YWdlMgorICAgIHJzaHJuICAgICAgICB2MjAuNGgsIHYyMC40cywgIzE1CisgICAgcnNocm4yICAgICAgIHYyMC44aCwgdjIyLjRzLCAjMTUKKyAgICByc2hybiAgICAgICAgdjI0LjRoLCB2MjQuNHMsICMxNAorICAgIHJzaHJuMiAgICAgICB2MjQuOGgsIHYyNi40cywgIzE0CisgICAgcnNocm4gICAgICAgIHYyOC40aCwgdjI4LjRzLCAjMTQKKyAgICByc2hybjIgICAgICAgdjI4LjhoLCB2MzAuNHMsICMxNAorICAgIHVhZGR3ICAgICAgICB2MjAuOGgsIHYyMC44aCwgdjAuOGIKKyAgICB1YWRkdyAgICAgICAgdjI0LjhoLCB2MjQuOGgsIHYwLjhiCisgICAgdWFkZHcgICAgICAgIHYyOC44aCwgdjI4LjhoLCB2MC44YgorLmlmIFxicHAgIT0gMTYKKyAgICBzcXh0dW4gICAgICAgdjFcZ19vZmZzXGRlZnNpemUsIHYyMC44aAorICAgIHNxeHR1biAgICAgICB2MVxyX29mZnNcZGVmc2l6ZSwgdjI0LjhoCisgICAgc3F4dHVuICAgICAgIHYxXGJfb2Zmc1xkZWZzaXplLCB2MjguOGgKKy5lbHNlCisgICAgc3FzaGx1ICAgICAgIHYyMS44aCwgdjIwLjhoLCAjOAorICAgIHNxc2hsdSAgICAgICB2MjUuOGgsIHYyNC44aCwgIzgKKyAgICBzcXNobHUgICAgICAgdjI5LjhoLCB2MjguOGgsICM4CisgICAgc3JpICAgICAgICAgIHYyNS44aCwgdjIxLjhoLCAjNQorICAgIHNyaSAgICAgICAgICB2MjUuOGgsIHYyOS44aCwgIzExCisuZW5kaWYKKworLmVuZG0KKworLm1hY3JvIGRvX3l1dl90b19yZ2Jfc3RhZ2UyX3N0b3JlX2xvYWRfc3RhZ2UxCisgICAgcnNocm4gICAgICAgIHYyMC40aCwgdjIwLjRzLCAjMTUKKyAgICByc2hybiAgICAgICAgdjI0LjRoLCB2MjQuNHMsICMxNAorICAgIHJzaHJuICAgICAgICB2MjguNGgsIHYyOC40cywgIzE0CisgICAgbGQxICAgICAgICAgIHt2NC44Yn0sIFtVXSwgOAorICAgIHJzaHJuMiAgICAgICB2MjAuOGgsIHYyMi40cywgIzE1CisgICAgcnNocm4yICAgICAgIHYyNC44aCwgdjI2LjRzLCAjMTQKKyAgICByc2hybjIgICAgICAgdjI4LjhoLCB2MzAuNHMsICMxNAorICAgIGxkMSAgICAgICAgICB7djUuOGJ9LCBbVl0sIDgKKyAgICB1YWRkdyAgICAgICAgdjIwLjhoLCB2MjAuOGgsIHYwLjhiCisgICAgdWFkZHcgICAgICAgIHYyNC44aCwgdjI0LjhoLCB2MC44YgorICAgIHVhZGR3ICAgICAgICB2MjguOGgsIHYyOC44aCwgdjAuOGIKKy5pZiBcYnBwICE9IDE2IC8qKioqKioqKioqKioqKioqIHJnYjI0L3JnYjMyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBzcXh0dW4gICAgICAgdjFcZ19vZmZzXGRlZnNpemUsIHYyMC44aAorICAgIGxkMSAgICAgICAgICB7djAuOGJ9LCBbWV0sIDgKKyAgICBzcXh0dW4gICAgICAgdjFccl9vZmZzXGRlZnNpemUsIHYyNC44aAorICAgIHByZm0gICAgICAgICBwbGRsMWtlZXAsIFtVLCAjNjRdCisgICAgcHJmbSAgICAgICAgIHBsZGwxa2VlcCwgW1YsICM2NF0KKyAgICBwcmZtICAgICAgICAgcGxkbDFrZWVwLCBbWSwgIzY0XQorICAgIHNxeHR1biAgICAgICB2MVxiX29mZnNcZGVmc2l6ZSwgdjI4LjhoCisgICAgdWFkZHcgICAgICAgIHY2LjhoLCB2Mi44aCwgdjQuOGIgICAgIC8qIHY2LjE2YiA9IHUgLSAxMjggKi8KKyAgICB1YWRkdyAgICAgICAgdjguOGgsIHYyLjhoLCB2NS44YiAgICAgLyogcTIgPSB2IC0gMTI4ICovCisgICAgc211bGwgICAgICAgIHYyMC40cywgdjYuNGgsIHYxLmhbMV0gIC8qIG11bHRpcGx5IGJ5IC0xMTI3NyAqLworICAgIHNtbGFsICAgICAgICB2MjAuNHMsIHY4LjRoLCB2MS5oWzJdICAvKiBtdWx0aXBseSBieSAtMjM0MDEgKi8KKyAgICBzbXVsbDIgICAgICAgdjIyLjRzLCB2Ni44aCwgdjEuaFsxXSAgLyogbXVsdGlwbHkgYnkgLTExMjc3ICovCisgICAgc21sYWwyICAgICAgIHYyMi40cywgdjguOGgsIHYxLmhbMl0gIC8qIG11bHRpcGx5IGJ5IC0yMzQwMSAqLworICAgIHNtdWxsICAgICAgICB2MjQuNHMsIHY4LjRoLCB2MS5oWzBdICAvKiBtdWx0aXBseSBieSAyMjk3MSAqLworICAgIHNtdWxsMiAgICAgICB2MjYuNHMsIHY4LjhoLCB2MS5oWzBdICAvKiBtdWx0aXBseSBieSAyMjk3MSAqLworLmVsc2UgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogcmdiNTY1ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHNxc2hsdSAgICAgICB2MjEuOGgsIHYyMC44aCwgIzgKKyAgICBzcXNobHUgICAgICAgdjI1LjhoLCB2MjQuOGgsICM4CisgICAgc3FzaGx1ICAgICAgIHYyOS44aCwgdjI4LjhoLCAjOAorICAgIHVhZGR3ICAgICAgICB2Ni44aCwgdjIuOGgsIHY0LjhiICAgICAvKiB2Ni4xNmIgPSB1IC0gMTI4ICovCisgICAgdWFkZHcgICAgICAgIHY4LjhoLCB2Mi44aCwgdjUuOGIgICAgIC8qIHEyID0gdiAtIDEyOCAqLworICAgIGxkMSAgICAgICAgICB7djAuOGJ9LCBbWV0sIDgKKyAgICBzbXVsbCAgICAgICAgdjIwLjRzLCB2Ni40aCwgdjEuaFsxXSAgLyogbXVsdGlwbHkgYnkgLTExMjc3ICovCisgICAgc21sYWwgICAgICAgIHYyMC40cywgdjguNGgsIHYxLmhbMl0gIC8qIG11bHRpcGx5IGJ5IC0yMzQwMSAqLworICAgIHNtdWxsMiAgICAgICB2MjIuNHMsIHY2LjhoLCB2MS5oWzFdICAvKiBtdWx0aXBseSBieSAtMTEyNzcgKi8KKyAgICBzbWxhbDIgICAgICAgdjIyLjRzLCB2OC44aCwgdjEuaFsyXSAgLyogbXVsdGlwbHkgYnkgLTIzNDAxICovCisgICAgc3JpICAgICAgICAgIHYyNS44aCwgdjIxLjhoLCAjNQorICAgIHNtdWxsICAgICAgICB2MjQuNHMsIHY4LjRoLCB2MS5oWzBdICAvKiBtdWx0aXBseSBieSAyMjk3MSAqLworICAgIHNtdWxsMiAgICAgICB2MjYuNHMsIHY4LjhoLCB2MS5oWzBdICAvKiBtdWx0aXBseSBieSAyMjk3MSAqLworICAgIHByZm0gICAgICAgICBwbGRsMWtlZXAsIFtVLCAjNjRdCisgICAgcHJmbSAgICAgICAgIHBsZGwxa2VlcCwgW1YsICM2NF0KKyAgICBwcmZtICAgICAgICAgcGxkbDFrZWVwLCBbWSwgIzY0XQorICAgIHNyaSAgICAgICAgICB2MjUuOGgsIHYyOS44aCwgIzExCisuZW5kaWYKKyAgICBkb19zdG9yZSAgICAgXGJwcCwgOAorICAgIHNtdWxsICAgICAgICB2MjguNHMsIHY2LjRoLCB2MS5oWzNdICAvKiBtdWx0aXBseSBieSAyOTAzMyAqLworICAgIHNtdWxsMiAgICAgICB2MzAuNHMsIHY2LjhoLCB2MS5oWzNdICAvKiBtdWx0aXBseSBieSAyOTAzMyAqLworLmVuZG0KKworLm1hY3JvIGRvX3l1dl90b19yZ2IKKyAgICBkb195dXZfdG9fcmdiX3N0YWdlMQorICAgIGRvX3l1dl90b19yZ2Jfc3RhZ2UyCisuZW5kbQorCisvKiBBcHBsZSBnYXMgY3Jhc2hlcyBvbiBhZHJsLCB3b3JrIGFyb3VuZCB0aGF0IGJ5IHVzaW5nIGFkci4KKyAqIEJ1dCB0aGlzIHJlcXVpcmVzIGEgY29weSBvZiB0aGVzZSBjb25zdGFudHMgZm9yIGVhY2ggZnVuY3Rpb24uCisgKi8KKworLmJhbGlnbiAxNgorTGpzaW1kX3ljY19cY29sb3JpZFwoKV9uZW9uX2NvbnN0czoKKyAgICAuc2hvcnQgICAgICAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwCisgICAgLnNob3J0ICAgICAgICAgIDIyOTcxLCAtMTEyNzcsIC0yMzQwMSwgMjkwMzMKKyAgICAuc2hvcnQgICAgICAgICAgLTEyOCwgIC0xMjgsICAgLTEyOCwgICAtMTI4CisgICAgLnNob3J0ICAgICAgICAgIC0xMjgsICAtMTI4LCAgIC0xMjgsICAgLTEyOAorCithc21fZnVuY3Rpb24ganNpbWRfeWNjX1xjb2xvcmlkXCgpX2NvbnZlcnRfbmVvbgorICAgIE9VVFBVVF9XSURUSCAgICAucmVxIHcwCisgICAgSU5QVVRfQlVGICAgICAgIC5yZXEgeDEKKyAgICBJTlBVVF9ST1cgICAgICAgLnJlcSB3MgorICAgIE9VVFBVVF9CVUYgICAgICAucmVxIHgzCisgICAgTlVNX1JPV1MgICAgICAgIC5yZXEgdzQKKworICAgIElOUFVUX0JVRjAgICAgICAucmVxIHg1CisgICAgSU5QVVRfQlVGMSAgICAgIC5yZXEgeDYKKyAgICBJTlBVVF9CVUYyICAgICAgLnJlcSB4MQorCisgICAgUkdCICAgICAgICAgICAgIC5yZXEgeDcKKyAgICBZICAgICAgICAgICAgICAgLnJlcSB4OAorICAgIFUgICAgICAgICAgICAgICAucmVxIHg5CisgICAgViAgICAgICAgICAgICAgIC5yZXEgeDEwCisgICAgTiAgICAgICAgICAgICAgIC5yZXEgdzE1CisKKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAzMzYKKyAgICBzdHIgICAgICAgICAgICAgeDE1LCBbc3BdLCAxNgorICAgIC8qIExvYWQgY29uc3RhbnRzIHRvIGQxLCBkMiwgZDMgKHYwLjRoIGlzIGp1c3QgdXNlZCBmb3IgcGFkZGluZykgKi8KKyAgICBhZHIgICAgICAgICAgICAgeDE1LCBManNpbWRfeWNjX1xjb2xvcmlkXCgpX25lb25fY29uc3RzCisgICAgLyogU2F2ZSBORU9OIHJlZ2lzdGVycyAqLworICAgIHN0MSAgICAgICAgICAgICB7djAuOGIsIHYxLjhiLCB2Mi44YiwgdjMuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djQuOGIsIHY1LjhiLCB2Ni44YiwgdjcuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djguOGIsIHY5LjhiLCB2MTAuOGIsIHYxMS44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MTIuOGIsIHYxMy44YiwgdjE0LjhiLCB2MTUuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djE2LjhiLCB2MTcuOGIsIHYxOC44YiwgdjE5LjhifSwgW3NwXSwgMzIKKyAgICBzdDEgICAgICAgICAgICAge3YyMC44YiwgdjIxLjhiLCB2MjIuOGIsIHYyMy44Yn0sIFtzcF0sIDMyCisgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGIsIHYyNS44YiwgdjI2LjhiLCB2MjcuOGJ9LCBbc3BdLCAzMgorICAgIHN0MSAgICAgICAgICAgICB7djI4LjhiLCB2MjkuOGIsIHYzMC44YiwgdjMxLjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YwLjRoLCB2MS40aH0sIFt4MTVdLCAxNgorICAgIGxkMSAgICAgICAgICAgICB7djIuOGh9LCBbeDE1XQorCisgICAgLyogU2F2ZSBBUk0gcmVnaXN0ZXJzIGFuZCBoYW5kbGUgaW5wdXQgYXJndW1lbnRzICovCisgICAgLyogcHVzaCAgICAgICAgICAgIHt4NCwgeDUsIHg2LCB4NywgeDgsIHg5LCB4MTAsIHgzMH0gKi8KKyAgICBzdHAgICAgICAgICAgICAgeDQsIHg1LCBbc3BdLCAxNgorICAgIHN0cCAgICAgICAgICAgICB4NiwgeDcsIFtzcF0sIDE2CisgICAgc3RwICAgICAgICAgICAgIHg4LCB4OSwgW3NwXSwgMTYKKyAgICBzdHAgICAgICAgICAgICAgeDEwLCB4MzAsIFtzcF0sIDE2CisgICAgbGRyICAgICAgICAgICAgIElOUFVUX0JVRjAsIFtJTlBVVF9CVUZdCisgICAgbGRyICAgICAgICAgICAgIElOUFVUX0JVRjEsIFtJTlBVVF9CVUYsICM4XQorICAgIGxkciAgICAgICAgICAgICBJTlBVVF9CVUYyLCBbSU5QVVRfQlVGLCAjMTZdCisgICAgLnVucmVxICAgICAgICAgIElOUFVUX0JVRgorCisgICAgLyogSW5pdGlhbGx5IHNldCB2MTAsIHYxMS40aCwgdjEyLjhiLCBkMTMgdG8gMHhGRiAqLworICAgIG1vdmkgICAgICAgICAgICB2MTAuMTZiLCAjMjU1CisgICAgbW92aSAgICAgICAgICAgIHYxMy4xNmIsICMyNTUKKworICAgIC8qIE91dGVyIGxvb3Agb3ZlciBzY2FubGluZXMgKi8KKyAgICBjbXAgICAgICAgICAgICAgTlVNX1JPV1MsICMxCisgICAgYi5sdCAgICAgICAgICAgIDlmCiswOgorICAgIGxkciAgICAgICAgICAgICBZLCBbSU5QVVRfQlVGMCwgSU5QVVRfUk9XLCB1eHR3ICMzXQorICAgIGxkciAgICAgICAgICAgICBVLCBbSU5QVVRfQlVGMSwgSU5QVVRfUk9XLCB1eHR3ICMzXQorICAgIG1vdiAgICAgICAgICAgICBOLCBPVVRQVVRfV0lEVEgKKyAgICBsZHIgICAgICAgICAgICAgViwgW0lOUFVUX0JVRjIsIElOUFVUX1JPVywgdXh0dyAjM10KKyAgICBhZGQgICAgICAgICAgICAgSU5QVVRfUk9XLCBJTlBVVF9ST1csICMxCisgICAgbGRyICAgICAgICAgICAgIFJHQiwgW09VVFBVVF9CVUZdLCAjOAorCisgICAgLyogSW5uZXIgbG9vcCBvdmVyIHBpeGVscyAqLworICAgIHN1YnMgICAgICAgICAgICBOLCBOLCAjOAorICAgIGIubHQgICAgICAgICAgICAzZgorICAgIGRvX2xvYWQgICAgICAgICA4CisgICAgZG9feXV2X3RvX3JnYl9zdGFnZTEKKyAgICBzdWJzICAgICAgICAgICAgTiwgTiwgIzgKKyAgICBiLmx0ICAgICAgICAgICAgMmYKKzE6CisgICAgZG9feXV2X3RvX3JnYl9zdGFnZTJfc3RvcmVfbG9hZF9zdGFnZTEKKyAgICBzdWJzICAgICAgICAgICAgTiwgTiwgIzgKKyAgICBiLmdlICAgICAgICAgICAgMWIKKzI6CisgICAgZG9feXV2X3RvX3JnYl9zdGFnZTIKKyAgICBkb19zdG9yZSAgICAgICAgXGJwcCwgOAorICAgIHRzdCAgICAgICAgICAgICBOLCAjNworICAgIGIuZXEgICAgICAgICAgICA4ZgorMzoKKyAgICB0c3QgICAgICAgICAgICAgTiwgIzQKKyAgICBiLmVxICAgICAgICAgICAgM2YKKyAgICBkb19sb2FkICAgICAgICAgNAorMzoKKyAgICB0c3QgICAgICAgICAgICAgTiwgIzIKKyAgICBiLmVxICAgICAgICAgICAgNGYKKyAgICBkb19sb2FkICAgICAgICAgMgorNDoKKyAgICB0c3QgICAgICAgICAgICAgTiwgIzEKKyAgICBiLmVxICAgICAgICAgICAgNWYKKyAgICBkb19sb2FkICAgICAgICAgMQorNToKKyAgICBkb195dXZfdG9fcmdiCisgICAgdHN0ICAgICAgICAgICAgIE4sICM0CisgICAgYi5lcSAgICAgICAgICAgIDZmCisgICAgZG9fc3RvcmUgICAgICAgIFxicHAsIDQKKzY6CisgICAgdHN0ICAgICAgICAgICAgIE4sICMyCisgICAgYi5lcSAgICAgICAgICAgIDdmCisgICAgZG9fc3RvcmUgICAgICAgIFxicHAsIDIKKzc6CisgICAgdHN0ICAgICAgICAgICAgIE4sICMxCisgICAgYi5lcSAgICAgICAgICAgIDhmCisgICAgZG9fc3RvcmUgICAgICAgIFxicHAsIDEKKzg6CisgICAgc3VicyAgICAgICAgICAgIE5VTV9ST1dTLCBOVU1fUk9XUywgIzEKKyAgICBiLmd0ICAgICAgICAgICAgMGIKKzk6CisgICAgLyogUmVzdG9yZSBhbGwgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKyAgICBzdWIgICAgICAgICAgICAgc3AsIHNwLCAjMzM2CisgICAgbGRyICAgICAgICAgICAgIHgxNSwgW3NwXSwgMTYKKyAgICBsZDEgICAgICAgICAgICAge3YwLjhiLCB2MS44YiwgdjIuOGIsIHYzLjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3Y0LjhiLCB2NS44YiwgdjYuOGIsIHY3LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3Y4LjhiLCB2OS44YiwgdjEwLjhiLCB2MTEuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djEyLjhiLCB2MTMuOGIsIHYxNC44YiwgdjE1LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YxNi44YiwgdjE3LjhiLCB2MTguOGIsIHYxOS44Yn0sIFtzcF0sIDMyCisgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGIsIHYyMS44YiwgdjIyLjhiLCB2MjMuOGJ9LCBbc3BdLCAzMgorICAgIGxkMSAgICAgICAgICAgICB7djI0LjhiLCB2MjUuOGIsIHYyNi44YiwgdjI3LjhifSwgW3NwXSwgMzIKKyAgICBsZDEgICAgICAgICAgICAge3YyOC44YiwgdjI5LjhiLCB2MzAuOGIsIHYzMS44Yn0sIFtzcF0sIDMyCisgICAgLyogcG9wICAgICAgICAgICAgIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHBjfSAqLworICAgIGxkcCAgICAgICAgICAgICB4NCwgeDUsIFtzcF0sIDE2CisgICAgbGRwICAgICAgICAgICAgIHg2LCB4NywgW3NwXSwgMTYKKyAgICBsZHAgICAgICAgICAgICAgeDgsIHg5LCBbc3BdLCAxNgorICAgIGxkcCAgICAgICAgICAgICB4MTAsIHgzMCwgW3NwXSwgMTYKKyAgICBiciAgICAgICAgICAgICAgeDMwCisgICAgLnVucmVxICAgICAgICAgIE9VVFBVVF9XSURUSAorICAgIC51bnJlcSAgICAgICAgICBJTlBVVF9ST1cKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0JVRgorICAgIC51bnJlcSAgICAgICAgICBOVU1fUk9XUworICAgIC51bnJlcSAgICAgICAgICBJTlBVVF9CVUYwCisgICAgLnVucmVxICAgICAgICAgIElOUFVUX0JVRjEKKyAgICAudW5yZXEgICAgICAgICAgSU5QVVRfQlVGMgorICAgIC51bnJlcSAgICAgICAgICBSR0IKKyAgICAudW5yZXEgICAgICAgICAgWQorICAgIC51bnJlcSAgICAgICAgICBVCisgICAgLnVucmVxICAgICAgICAgIFYKKyAgICAudW5yZXEgICAgICAgICAgTgorCisucHVyZ2VtIGRvX3l1dl90b19yZ2IKKy5wdXJnZW0gZG9feXV2X3RvX3JnYl9zdGFnZTEKKy5wdXJnZW0gZG9feXV2X3RvX3JnYl9zdGFnZTIKKy5wdXJnZW0gZG9feXV2X3RvX3JnYl9zdGFnZTJfc3RvcmVfbG9hZF9zdGFnZTEKKy5lbmRtCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGlkIC0tLS0tIGJwcCBSICByc2l6ZSAgRyAgZ3NpemUgIEIgIGJzaXplICBkZWZzaXplICAgKi8KK2dlbmVyYXRlX2pzaW1kX3ljY19yZ2JfY29udmVydF9uZW9uIGV4dHJnYiwgIDI0LCAwLCAuNGgsICAgMSwgLjRoLCAgIDIsIC40aCwgICAuOGIKK2dlbmVyYXRlX2pzaW1kX3ljY19yZ2JfY29udmVydF9uZW9uIGV4dGJnciwgIDI0LCAyLCAuNGgsICAgMSwgLjRoLCAgIDAsIC40aCwgICAuOGIKK2dlbmVyYXRlX2pzaW1kX3ljY19yZ2JfY29udmVydF9uZW9uIHJnYmE4ODg4LCAzMiwgMCwgLjRoLCAgIDEsIC40aCwgICAyLCAuNGgsICAgLjhiCitnZW5lcmF0ZV9qc2ltZF95Y2NfcmdiX2NvbnZlcnRfbmVvbiBleHRiZ3J4LCAzMiwgMiwgLjRoLCAgIDEsIC40aCwgICAwLCAuNGgsICAgLjhiCitnZW5lcmF0ZV9qc2ltZF95Y2NfcmdiX2NvbnZlcnRfbmVvbiBleHR4YmdyLCAzMiwgMywgLjRoLCAgIDIsIC40aCwgICAxLCAuNGgsICAgLjhiCitnZW5lcmF0ZV9qc2ltZF95Y2NfcmdiX2NvbnZlcnRfbmVvbiBleHR4cmdiLCAzMiwgMSwgLjRoLCAgIDIsIC40aCwgICAzLCAuNGgsICAgLjhiCitnZW5lcmF0ZV9qc2ltZF95Y2NfcmdiX2NvbnZlcnRfbmVvbiByZ2I1NjUsICAxNiwgMCwgLjRoLCAgIDAsIC40aCwgICAwLCAuNGgsICAgLjhiCisucHVyZ2VtIGRvX2xvYWQKKy5wdXJnZW0gZG9fc3RvcmUKZGlmZiAtLWdpdCBhL2pwZWcvanNpbWRfYXJtX25lb24uUyBiL2pwZWcvanNpbWRfYXJtX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGZkOWIyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qc2ltZF9hcm1fbmVvbi5TCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogQVJNIE5FT04gb3B0aW1pemF0aW9ucyBmb3IgbGlianBlZy10dXJibworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb250YWN0OiBBbGV4YW5kZXIgQm9rb3ZveSA8YWxleGFuZGVyLmJva292b3lAbm9raWEuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKy8qIENvcHlyaWdodCAoYykgMjAxMSwgIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBOVklESUEgQ09SUE9SQVRJT04gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfX0VMRl9fKQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLCVwcm9nYml0cyAvKiBtYXJrIHN0YWNrIGFzIG5vbi1leGVjdXRhYmxlICovCisjZW5kaWYKKworLnRleHQKKy5mcHUgbmVvbgorLmFyY2ggYXJtdjdhCisub2JqZWN0X2FyY2ggYXJtdjdhCisuYXJtCisKKworI2RlZmluZSBSRVNQRUNUX1NUUklDVF9BTElHTk1FTlQgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN1cHBsZW1lbnRhcnkgbWFjcm8gZm9yIHNldHRpbmcgZnVuY3Rpb24gYXR0cmlidXRlcyAqLworLm1hY3JvIGFzbV9mdW5jdGlvbiBmbmFtZQorICAgIC5nbG9iYWwgXGZuYW1lCisjaWZkZWYgX19FTEZfXworICAgIC5oaWRkZW4gXGZuYW1lCisgICAgLnR5cGUgXGZuYW1lLCAlZnVuY3Rpb24KKyNlbmRpZgorXGZuYW1lOgorLmVuZG0KKworLyogVHJhbnNwb3NlIGEgYmxvY2sgb2YgNHg0IGNvZWZmaWNpZW50cyBpbiBmb3VyIDY0LWJpdCByZWdpc3RlcnMgKi8KKy5tYWNybyB0cmFuc3Bvc2VfNHg0IHgwLCB4MSwgeDIsIHgzCisgICAgdnRybi4xNiBceDAsIFx4MQorICAgIHZ0cm4uMTYgXHgyLCBceDMKKyAgICB2dHJuLjMyIFx4MCwgXHgyCisgICAgdnRybi4zMiBceDEsIFx4MworLmVuZG0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoganNpbWRfaWRjdF9pZmFzdF9uZW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mCisgKiB0aGUgaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiBJdCB1c2VzIHRoZSBzYW1lIGNhbGN1bGF0aW9ucworICogYW5kIHByb2R1Y2VzIGV4YWN0bHkgdGhlIHNhbWUgb3V0cHV0IGFzIElKRydzIG9yaWdpbmFsICdqcGVnX2lkY3RfZmFzdCcKKyAqIGZ1bmN0aW9uIGZyb20gamlkY3Rmc3QuYworICoKKyAqIFRPRE86IGEgYml0IGJldHRlciBpbnN0cnVjdGlvbnMgc2NoZWR1bGluZyBpcyBuZWVkZWQuCisgKi8KKworI2RlZmluZSBYRklYXzFfMDgyMzkyMjAwIGQwWzBdCisjZGVmaW5lIFhGSVhfMV80MTQyMTM1NjIgZDBbMV0KKyNkZWZpbmUgWEZJWF8xXzg0Nzc1OTA2NSBkMFsyXQorI2RlZmluZSBYRklYXzJfNjEzMTI1OTMwIGQwWzNdCisKKy5iYWxpZ24gMTYKK2pzaW1kX2lkY3RfaWZhc3RfbmVvbl9jb25zdHM6CisgICAgLnNob3J0ICgyNzcgKiAxMjggLSAyNTYgKiAxMjgpIC8qIFhGSVhfMV8wODIzOTIyMDAgKi8KKyAgICAuc2hvcnQgKDM2MiAqIDEyOCAtIDI1NiAqIDEyOCkgLyogWEZJWF8xXzQxNDIxMzU2MiAqLworICAgIC5zaG9ydCAoNDczICogMTI4IC0gMjU2ICogMTI4KSAvKiBYRklYXzFfODQ3NzU5MDY1ICovCisgICAgLnNob3J0ICg2NjkgKiAxMjggLSA1MTIgKiAxMjgpIC8qIFhGSVhfMl82MTMxMjU5MzAgKi8KKworLyogMS1EIElEQ1QgaGVscGVyIG1hY3JvICovCisKKy5tYWNybyBpZGN0X2hlbHBlciAgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCBcCisgICAgICAgICAgICAgICAgICAgIHQxMCwgdDExLCB0MTIsIHQxMywgdDE0CisKKyAgICB2c3ViLnMxNiAgICAgICAgXHQxMCwgXHgwLCBceDQKKyAgICB2YWRkLnMxNiAgICAgICAgXHg0LCAgXHgwLCBceDQKKyAgICB2c3dwLnMxNiAgICAgICAgXHQxMCwgXHgwCisgICAgdnN1Yi5zMTYgICAgICAgIFx0MTEsIFx4MiwgXHg2CisgICAgdmFkZC5zMTYgICAgICAgIFx4NiwgIFx4MiwgXHg2CisgICAgdnN3cC5zMTYgICAgICAgIFx0MTEsIFx4MgorICAgIHZzdWIuczE2ICAgICAgICBcdDEwLCBceDMsIFx4NQorICAgIHZhZGQuczE2ICAgICAgICBceDUsICBceDMsIFx4NQorICAgIHZzd3AuczE2ICAgICAgICBcdDEwLCBceDMKKyAgICB2c3ViLnMxNiAgICAgICAgXHQxMSwgXHgxLCBceDcKKyAgICB2YWRkLnMxNiAgICAgICAgXHg3LCAgXHgxLCBceDcKKyAgICB2c3dwLnMxNiAgICAgICAgXHQxMSwgXHgxCisKKyAgICB2cWRtdWxoLnMxNiAgICAgXHQxMywgXHgyLCAgZDBbMV0KKyAgICB2YWRkLnMxNiAgICAgICAgXHQxMiwgXHgzLCAgXHgzCisgICAgdmFkZC5zMTYgICAgICAgIFx4MiwgIFx4MiwgIFx0MTMKKyAgICB2cWRtdWxoLnMxNiAgICAgXHQxMywgXHgzLCAgZDBbM10KKyAgICB2c3ViLnMxNiAgICAgICAgXHQxMCwgIFx4MSwgXHgzCisgICAgdmFkZC5zMTYgICAgICAgIFx0MTIsIFx0MTIsIFx0MTMKKyAgICB2cWRtdWxoLnMxNiAgICAgXHQxMywgXHQxMCwgZDBbMl0KKyAgICB2c3ViLnMxNiAgICAgICAgXHQxMSwgXHg3LCAgXHg1CisgICAgdmFkZC5zMTYgICAgICAgIFx0MTAsIFx0MTAsIFx0MTMKKyAgICB2cWRtdWxoLnMxNiAgICAgXHQxMywgXHQxMSwgZDBbMV0KKyAgICB2YWRkLnMxNiAgICAgICAgXHQxMSwgXHQxMSwgXHQxMworCisgICAgdnFkbXVsaC5zMTYgICAgIFx0MTMsIFx4MSwgIGQwWzBdCisgICAgdnN1Yi5zMTYgICAgICAgIFx4MiwgIFx4NiwgIFx4MgorICAgIHZzdWIuczE2ICAgICAgICBcdDE0LCBceDAsICBceDIKKyAgICB2YWRkLnMxNiAgICAgICAgXHgyLCAgXHgwLCAgXHgyCisgICAgdmFkZC5zMTYgICAgICAgIFx4MCwgIFx4NCwgIFx4NgorICAgIHZzdWIuczE2ICAgICAgICBceDQsICBceDQsICBceDYKKyAgICB2YWRkLnMxNiAgICAgICAgXHgxLCAgXHgxLCAgXHQxMworICAgIHZhZGQuczE2ICAgICAgICBcdDEzLCBceDcsICBceDUKKyAgICB2c3ViLnMxNiAgICAgICAgXHQxMiwgXHQxMywgXHQxMgorICAgIHZzdWIuczE2ICAgICAgICBcdDEyLCBcdDEyLCBcdDEwCisgICAgdmFkZC5zMTYgICAgICAgIFx0MTEsIFx0MTIsIFx0MTEKKyAgICB2c3ViLnMxNiAgICAgICAgXHQxMCwgXHgxLCAgXHQxMAorICAgIHZhZGQuczE2ICAgICAgICBcdDEwLCBcdDEwLCBcdDExCisKKyAgICB2c3ViLnMxNiAgICAgICAgXHg3LCAgXHgwLCAgXHQxMworICAgIHZhZGQuczE2ICAgICAgICBceDAsICBceDAsICBcdDEzCisgICAgdmFkZC5zMTYgICAgICAgIFx4NiwgIFx0MTQsIFx0MTIKKyAgICB2c3ViLnMxNiAgICAgICAgXHgxLCAgXHQxNCwgXHQxMgorICAgIHZzdWIuczE2ICAgICAgICBceDUsICBceDIsICBcdDExCisgICAgdmFkZC5zMTYgICAgICAgIFx4MiwgIFx4MiwgIFx0MTEKKyAgICB2c3ViLnMxNiAgICAgICAgXHgzLCAgXHg0LCAgXHQxMAorICAgIHZhZGQuczE2ICAgICAgICBceDQsICBceDQsICBcdDEwCisuZW5kbQorCithc21fZnVuY3Rpb24ganNpbWRfaWRjdF9pZmFzdF9uZW9uCisKKyAgICBEQ1RfVEFCTEUgICAgICAgLnJlcSByMAorICAgIENPRUZfQkxPQ0sgICAgICAucmVxIHIxCisgICAgT1VUUFVUX0JVRiAgICAgIC5yZXEgcjIKKyAgICBPVVRQVVRfQ09MICAgICAgLnJlcSByMworICAgIFRNUCAgICAgICAgICAgICAucmVxIGlwCisKKyAgICB2cHVzaCAgICAgICAgICAge2Q4LWQxNX0KKworICAgIC8qIExvYWQgY29uc3RhbnRzICovCisgICAgYWRyICAgICAgICAgICAgIFRNUCwganNpbWRfaWRjdF9pZmFzdF9uZW9uX2NvbnN0cworICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbVE1QLCA6NjRdCisKKyAgICAvKiBMb2FkIGFsbCBDT0VGX0JMT0NLIGludG8gTkVPTiByZWdpc3RlcnMgd2l0aCB0aGUgZm9sbG93aW5nIGFsbG9jYXRpb246CisgICAgICogICAgICAgMCAxIDIgMyB8IDQgNSA2IDcKKyAgICAgKiAgICAgIC0tLS0tLS0tLSstLS0tLS0tLQorICAgICAqICAgMCB8IGQ0ICAgICAgfCBkNQorICAgICAqICAgMSB8IGQ2ICAgICAgfCBkNworICAgICAqICAgMiB8IGQ4ICAgICAgfCBkOQorICAgICAqICAgMyB8IGQxMCAgICAgfCBkMTEKKyAgICAgKiAgIDQgfCBkMTIgICAgIHwgZDEzCisgICAgICogICA1IHwgZDE0ICAgICB8IGQxNQorICAgICAqICAgNiB8IGQxNiAgICAgfCBkMTcKKyAgICAgKiAgIDcgfCBkMTggICAgIHwgZDE5CisgICAgICovCisgICAgdmxkMS4xNiAgICAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFtDT0VGX0JMT0NLXSEKKyAgICB2bGQxLjE2ICAgICAgICAge2Q4LCBkOSwgZDEwLCBkMTF9LCBbQ09FRl9CTE9DS10hCisgICAgdmxkMS4xNiAgICAgICAgIHtkMTIsIGQxMywgZDE0LCBkMTV9LCBbQ09FRl9CTE9DS10hCisgICAgdmxkMS4xNiAgICAgICAgIHtkMTYsIGQxNywgZDE4LCBkMTl9LCBbQ09FRl9CTE9DS10hCisgICAgLyogRGVxdWFudGl6ZSAqLworICAgIHZsZDEuMTYgICAgICAgICB7ZDIwLCBkMjEsIGQyMiwgZDIzfSwgW0RDVF9UQUJMRV0hCisgICAgdm11bC5zMTYgICAgICAgIHEyLCBxMiwgcTEwCisgICAgdmxkMS4xNiAgICAgICAgIHtkMjQsIGQyNSwgZDI2LCBkMjd9LCBbRENUX1RBQkxFXSEKKyAgICB2bXVsLnMxNiAgICAgICAgcTMsIHEzLCBxMTEKKyAgICB2bXVsLnMxNiAgICAgICAgcTQsIHE0LCBxMTIKKyAgICB2bGQxLjE2ICAgICAgICAge2QyOCwgZDI5LCBkMzAsIGQzMX0sIFtEQ1RfVEFCTEVdIQorICAgIHZtdWwuczE2ICAgICAgICBxNSwgcTUsIHExMworICAgIHZtdWwuczE2ICAgICAgICBxNiwgcTYsIHExNAorICAgIHZsZDEuMTYgICAgICAgICB7ZDIwLCBkMjEsIGQyMiwgZDIzfSwgW0RDVF9UQUJMRV0hCisgICAgdm11bC5zMTYgICAgICAgIHE3LCBxNywgcTE1CisgICAgdm11bC5zMTYgICAgICAgIHE4LCBxOCwgcTEwCisgICAgdm11bC5zMTYgICAgICAgIHE5LCBxOSwgcTExCisKKyAgICAvKiBQYXNzIDEgOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiovCisgICAgaWRjdF9oZWxwZXIgICAgIHEyLCBxMywgcTQsIHE1LCBxNiwgcTcsIHE4LCBxOSwgcTEwLCBxMTEsIHExMiwgcTEzLCBxMTQKKyAgICAvKiBUcmFuc3Bvc2UgKi8KKyAgICB2dHJuLjE2IHEyLCBxMworICAgIHZ0cm4uMTYgcTQsIHE1CisgICAgdnRybi4zMiBxMiwgcTQKKyAgICB2dHJuLjMyIHEzLCBxNQorCisgICAgdnRybi4xNiBxNiwgcTcKKyAgICB2dHJuLjE2IHE4LCBxOQorICAgIHZ0cm4uMzIgcTYsIHE4CisgICAgdnRybi4zMiBxNywgcTkKKworICAgIHZzd3AgICAgICAgICAgICBkMTIsIGQ1CisgICAgdnN3cCAgICAgICAgICAgIGQxNCwgZDcKKyAgICB2c3dwICAgICAgICAgICAgZDE2LCBkOQorICAgIHZzd3AgICAgICAgICAgICBkMTgsIGQxMQorCisgICAgLyogUGFzcyAyICovCisgICAgaWRjdF9oZWxwZXIgICAgIHEyLCBxMywgcTQsIHE1LCBxNiwgcTcsIHE4LCBxOSwgcTEwLCBxMTEsIHExMiwgcTEzLCBxMTQKKyAgICAvKiBUcmFuc3Bvc2UgKi8KKworICAgIHZ0cm4uMTYgcTIsIHEzCisgICAgdnRybi4xNiBxNCwgcTUKKyAgICB2dHJuLjMyIHEyLCBxNAorICAgIHZ0cm4uMzIgcTMsIHE1CisKKyAgICB2dHJuLjE2IHE2LCBxNworICAgIHZ0cm4uMTYgcTgsIHE5CisgICAgdnRybi4zMiBxNiwgcTgKKyAgICB2dHJuLjMyIHE3LCBxOQorCisgICAgdnN3cCAgICAgICAgICAgIGQxMiwgZDUKKyAgICB2c3dwICAgICAgICAgICAgZDE0LCBkNworICAgIHZzd3AgICAgICAgICAgICBkMTYsIGQ5CisgICAgdnN3cCAgICAgICAgICAgIGQxOCwgZDExCisKKyAgICAvKiBEZXNjYWxlIGFuZCByYW5nZSBsaW1pdCAqLworICAgIHZtb3YuczE2ICAgICAgICBxMTUsICMoMHg4MCA8PCA1KQorICAgIHZxYWRkLnMxNiAgICAgICBxMiwgcTIsIHExNQorICAgIHZxYWRkLnMxNiAgICAgICBxMywgcTMsIHExNQorICAgIHZxYWRkLnMxNiAgICAgICBxNCwgcTQsIHExNQorICAgIHZxYWRkLnMxNiAgICAgICBxNSwgcTUsIHExNQorICAgIHZxYWRkLnMxNiAgICAgICBxNiwgcTYsIHExNQorICAgIHZxYWRkLnMxNiAgICAgICBxNywgcTcsIHExNQorICAgIHZxYWRkLnMxNiAgICAgICBxOCwgcTgsIHExNQorICAgIHZxYWRkLnMxNiAgICAgICBxOSwgcTksIHExNQorICAgIHZxc2hydW4uczE2ICAgICBkNCwgcTIsICM1CisgICAgdnFzaHJ1bi5zMTYgICAgIGQ2LCBxMywgIzUKKyAgICB2cXNocnVuLnMxNiAgICAgZDgsIHE0LCAjNQorICAgIHZxc2hydW4uczE2ICAgICBkMTAsIHE1LCAjNQorICAgIHZxc2hydW4uczE2ICAgICBkMTIsIHE2LCAjNQorICAgIHZxc2hydW4uczE2ICAgICBkMTQsIHE3LCAjNQorICAgIHZxc2hydW4uczE2ICAgICBkMTYsIHE4LCAjNQorICAgIHZxc2hydW4uczE2ICAgICBkMTgsIHE5LCAjNQorCisgICAgLyogU3RvcmUgcmVzdWx0cyB0byB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIC5pcnAgICAgICAgICAgICB4LCBkNCwgZDYsIGQ4LCBkMTAsIGQxMiwgZDE0LCBkMTYsIGQxOAorICAgIGxkciAgICAgICAgICAgICBUTVAsIFtPVVRQVVRfQlVGXSwgIzQKKyAgICBhZGQgICAgICAgICAgICAgVE1QLCBUTVAsIE9VVFBVVF9DT0wKKyAgICB2c3QxLjggICAgICAgICAge1x4fSwgW1RNUF0hCisgICAgLmVuZHIKKworICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgLnVucmVxICAgICAgICAgIERDVF9UQUJMRQorICAgIC51bnJlcSAgICAgICAgICBDT0VGX0JMT0NLCisgICAgLnVucmVxICAgICAgICAgIE9VVFBVVF9CVUYKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0NPTAorICAgIC51bnJlcSAgICAgICAgICBUTVAKKworLnB1cmdlbSBpZGN0X2hlbHBlcgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBqc2ltZF9pZGN0XzR4NF9uZW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjb250YWlucyBpbnZlcnNlLURDVCBjb2RlIGZvciBnZXR0aW5nIHJlZHVjZWQtc2l6ZQorICogNHg0IHBpeGVscyBvdXRwdXQgZnJvbSBhbiA4eDggRENUIGJsb2NrLiBJdCB1c2VzIHRoZSBzYW1lICBjYWxjdWxhdGlvbnMKKyAqIGFuZCBwcm9kdWNlcyBleGFjdGx5IHRoZSBzYW1lIG91dHB1dCBhcyBJSkcncyBvcmlnaW5hbCAnanBlZ19pZGN0XzR4NCcKKyAqIGZ1bmN0aW9uIGZyb20ganBlZy02YiAoamlkY3RyZWQuYykuCisgKgorICogTk9URToganBlZy04IGhhcyBhbiBpbXByb3ZlZCBpbXBsZW1lbnRhdGlvbiBvZiA0eDQgaW52ZXJzZS1EQ1QsIHdoaWNoCisgKiAgICAgICByZXF1aXJlcyBtdWNoIGxlc3MgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGFuZCBoZW5jZSBzaG91bGQgYmUgZmFzdGVyLgorICogICAgICAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIHBhcnRpY3VsYXIgTkVPTiBvcHRpbWl6ZWQgZnVuY3Rpb24gaXMKKyAqICAgICAgIGJpdCBleGFjdCBjb21wYXRpYmlsaXR5IHdpdGgganBlZy02Yi4KKyAqCisgKiBUT0RPOiBhIGJpdCBiZXR0ZXIgaW5zdHJ1Y3Rpb25zIHNjaGVkdWxpbmcgY2FuIGJlIGFjaGlldmVkIGJ5IGV4cGFuZGluZworICogICAgICAgaWRjdF9oZWxwZXIvdHJhbnNwb3NlXzR4NCBtYWNyb3MgYW5kIHJlb3JkZXJpbmcgaW5zdHJ1Y3Rpb25zLAorICogICAgICAgYnV0IHJlYWRhYmlsaXR5IHdpbGwgc3VmZmVyIHNvbWV3aGF0LgorICovCisKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKworI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgICgxNzMwKSAgLyogRklYKDAuMjExMTY0MjQzKSAqLworI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgICg0MTc2KSAgLyogRklYKDAuNTA5Nzk1NTc5KSAqLworI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgICg0OTI2KSAgLyogRklYKDAuNjAxMzQ0ODg3KSAqLworI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgICg1OTA2KSAgLyogRklYKDAuNzIwOTU5ODIyKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICg2MjcwKSAgLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgICg2OTY3KSAgLyogRklYKDAuODUwNDMwMDk1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICg3MzczKSAgLyogRklYKDAuODk5OTc2MjIzKSAqLworI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgICg4Njk3KSAgLyogRklYKDEuMDYxNTk0MzM3KSAqLworI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgICgxMDQyNikgLyogRklYKDEuMjcyNzU4NTgwKSAqLworI2RlZmluZSBGSVhfMV80NTE3NzQ5ODEgICgxMTg5MykgLyogRklYKDEuNDUxNzc0OTgxKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgxNTEzNykgLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgICgxNzc5OSkgLyogRklYKDIuMTcyNzM0ODAzKSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgyMDk5NSkgLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgICgyOTY5MikgLyogRklYKDMuNjI0NTA5Nzg1KSAqLworCisuYmFsaWduIDE2Citqc2ltZF9pZGN0XzR4NF9uZW9uX2NvbnN0czoKKyAgICAuc2hvcnQgICAgIEZJWF8xXzg0Nzc1OTA2NSAgICAgLyogZDBbMF0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMF83NjUzNjY4NjUgICAgLyogZDBbMV0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMF8yMTExNjQyNDMgICAgLyogZDBbMl0gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8xXzQ1MTc3NDk4MSAgICAgLyogZDBbM10gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMl8xNzI3MzQ4MDMgICAgLyogZDFbMF0gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8xXzA2MTU5NDMzNyAgICAgLyogZDFbMV0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMF81MDk3OTU1NzkgICAgLyogZDFbMl0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMF82MDEzNDQ4ODcgICAgLyogZDFbM10gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8wXzg5OTk3NjIyMyAgICAgLyogZDJbMF0gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8yXzU2MjkxNTQ0NyAgICAgLyogZDJbMV0gKi8KKyAgICAuc2hvcnQgICAgIDEgPDwgKENPTlNUX0JJVFMrMSkgLyogZDJbMl0gKi8KKyAgICAuc2hvcnQgICAgIDAgICAgICAgICAgICAgICAgICAgLyogZDJbM10gKi8KKworLm1hY3JvIGlkY3RfaGVscGVyIHg0LCB4NiwgeDgsIHgxMCwgeDEyLCB4MTQsIHgxNiwgc2hpZnQsIHkyNiwgeTI3LCB5MjgsIHkyOQorICAgIHZtdWxsLnMxNiAgICAgICBxMTQsIFx4NCwgIGQyWzJdCisgICAgdm1sYWwuczE2ICAgICAgIHExNCwgXHg4LCAgZDBbMF0KKyAgICB2bWxhbC5zMTYgICAgICAgcTE0LCBceDE0LCBkMFsxXQorCisgICAgdm11bGwuczE2ICAgICAgIHExMywgXHgxNiwgZDFbMl0KKyAgICB2bWxhbC5zMTYgICAgICAgcTEzLCBceDEyLCBkMVszXQorICAgIHZtbGFsLnMxNiAgICAgICBxMTMsIFx4MTAsIGQyWzBdCisgICAgdm1sYWwuczE2ICAgICAgIHExMywgXHg2LCAgZDJbMV0KKworICAgIHZtdWxsLnMxNiAgICAgICBxMTUsIFx4NCwgIGQyWzJdCisgICAgdm1sc2wuczE2ICAgICAgIHExNSwgXHg4LCAgZDBbMF0KKyAgICB2bWxzbC5zMTYgICAgICAgcTE1LCBceDE0LCBkMFsxXQorCisgICAgdm11bGwuczE2ICAgICAgIHExMiwgXHgxNiwgZDBbMl0KKyAgICB2bWxhbC5zMTYgICAgICAgcTEyLCBceDEyLCBkMFszXQorICAgIHZtbGFsLnMxNiAgICAgICBxMTIsIFx4MTAsIGQxWzBdCisgICAgdm1sYWwuczE2ICAgICAgIHExMiwgXHg2LCAgZDFbMV0KKworICAgIHZhZGQuczMyICAgICAgICBxMTAsIHExNCwgcTEzCisgICAgdnN1Yi5zMzIgICAgICAgIHExNCwgcTE0LCBxMTMKKworLmlmIFxzaGlmdCA+IDE2CisgICAgdnJzaHIuczMyICAgICAgIHExMCwgIHExMCwgI1xzaGlmdAorICAgIHZyc2hyLnMzMiAgICAgICBxMTQsICBxMTQsICNcc2hpZnQKKyAgICB2bW92bi5zMzIgICAgICAgXHkyNiwgcTEwCisgICAgdm1vdm4uczMyICAgICAgIFx5MjksIHExNAorLmVsc2UKKyAgICB2cnNocm4uczMyICAgICAgXHkyNiwgcTEwLCAjXHNoaWZ0CisgICAgdnJzaHJuLnMzMiAgICAgIFx5MjksIHExNCwgI1xzaGlmdAorLmVuZGlmCisKKyAgICB2YWRkLnMzMiAgICAgICAgcTEwLCBxMTUsIHExMgorICAgIHZzdWIuczMyICAgICAgICBxMTUsIHExNSwgcTEyCisKKy5pZiBcc2hpZnQgPiAxNgorICAgIHZyc2hyLnMzMiAgICAgICBxMTAsICBxMTAsICNcc2hpZnQKKyAgICB2cnNoci5zMzIgICAgICAgcTE1LCAgcTE1LCAjXHNoaWZ0CisgICAgdm1vdm4uczMyICAgICAgIFx5MjcsIHExMAorICAgIHZtb3ZuLnMzMiAgICAgICBceTI4LCBxMTUKKy5lbHNlCisgICAgdnJzaHJuLnMzMiAgICAgIFx5MjcsIHExMCwgI1xzaGlmdAorICAgIHZyc2hybi5zMzIgICAgICBceTI4LCBxMTUsICNcc2hpZnQKKy5lbmRpZgorCisuZW5kbQorCithc21fZnVuY3Rpb24ganNpbWRfaWRjdF80eDRfbmVvbgorCisgICAgRENUX1RBQkxFICAgICAgIC5yZXEgcjAKKyAgICBDT0VGX0JMT0NLICAgICAgLnJlcSByMQorICAgIE9VVFBVVF9CVUYgICAgICAucmVxIHIyCisgICAgT1VUUFVUX0NPTCAgICAgIC5yZXEgcjMKKyAgICBUTVAxICAgICAgICAgICAgLnJlcSByMAorICAgIFRNUDIgICAgICAgICAgICAucmVxIHIxCisgICAgVE1QMyAgICAgICAgICAgIC5yZXEgcjIKKyAgICBUTVA0ICAgICAgICAgICAgLnJlcSBpcAorCisgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisKKyAgICAvKiBMb2FkIGNvbnN0YW50cyAoZDMgaXMganVzdCB1c2VkIGZvciBwYWRkaW5nKSAqLworICAgIGFkciAgICAgICAgICAgICBUTVA0LCBqc2ltZF9pZGN0XzR4NF9uZW9uX2NvbnN0cworICAgIHZsZDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbVE1QNCwgOjEyOF0KKworICAgIC8qIExvYWQgYWxsIENPRUZfQkxPQ0sgaW50byBORU9OIHJlZ2lzdGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgYWxsb2NhdGlvbjoKKyAgICAgKiAgICAgICAwIDEgMiAzIHwgNCA1IDYgNworICAgICAqICAgICAgLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICogICAwIHwgZDQgICAgICB8IGQ1CisgICAgICogICAxIHwgZDYgICAgICB8IGQ3CisgICAgICogICAyIHwgZDggICAgICB8IGQ5CisgICAgICogICAzIHwgZDEwICAgICB8IGQxMQorICAgICAqICAgNCB8IC0gICAgICAgfCAtCisgICAgICogICA1IHwgZDEyICAgICB8IGQxMworICAgICAqICAgNiB8IGQxNCAgICAgfCBkMTUKKyAgICAgKiAgIDcgfCBkMTYgICAgIHwgZDE3CisgICAgICovCisgICAgdmxkMS4xNiAgICAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFtDT0VGX0JMT0NLXSEKKyAgICB2bGQxLjE2ICAgICAgICAge2Q4LCBkOSwgZDEwLCBkMTF9LCBbQ09FRl9CTE9DS10hCisgICAgYWRkIENPRUZfQkxPQ0ssIENPRUZfQkxPQ0ssICMxNgorICAgIHZsZDEuMTYgICAgICAgICB7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW0NPRUZfQkxPQ0tdIQorICAgIHZsZDEuMTYgICAgICAgICB7ZDE2LCBkMTd9LCBbQ09FRl9CTE9DS10hCisgICAgLyogZGVxdWFudGl6ZSAqLworICAgIHZsZDEuMTYgICAgICAgICB7ZDE4LCBkMTksIGQyMCwgZDIxfSwgW0RDVF9UQUJMRV0hCisgICAgdm11bC5zMTYgICAgICAgIHEyLCBxMiwgcTkKKyAgICB2bGQxLjE2ICAgICAgICAge2QyMiwgZDIzLCBkMjQsIGQyNX0sIFtEQ1RfVEFCTEVdIQorICAgIHZtdWwuczE2ICAgICAgICBxMywgcTMsIHExMAorICAgIHZtdWwuczE2ICAgICAgICBxNCwgcTQsIHExMQorICAgIGFkZCAgICAgICAgICAgICBEQ1RfVEFCTEUsIERDVF9UQUJMRSwgIzE2CisgICAgdmxkMS4xNiAgICAgICAgIHtkMjYsIGQyNywgZDI4LCBkMjl9LCBbRENUX1RBQkxFXSEKKyAgICB2bXVsLnMxNiAgICAgICAgcTUsIHE1LCBxMTIKKyAgICB2bXVsLnMxNiAgICAgICAgcTYsIHE2LCBxMTMKKyAgICB2bGQxLjE2ICAgICAgICAge2QzMCwgZDMxfSwgW0RDVF9UQUJMRV0hCisgICAgdm11bC5zMTYgICAgICAgIHE3LCBxNywgcTE0CisgICAgdm11bC5zMTYgICAgICAgIHE4LCBxOCwgcTE1CisKKworICAgIC8qIFBhc3MgMSAqLworICAgIGlkY3RfaGVscGVyICAgICBkNCwgZDYsIGQ4LCBkMTAsIGQxMiwgZDE0LCBkMTYsIDEyLCBkNCwgZDYsIGQ4LCBkMTAKKyAgICB0cmFuc3Bvc2VfNHg0ICAgZDQsIGQ2LCBkOCwgZDEwCisgICAgaWRjdF9oZWxwZXIgICAgIGQ1LCBkNywgZDksIGQxMSwgZDEzLCBkMTUsIGQxNywgMTIsIGQ1LCBkNywgZDksIGQxMQorICAgIHRyYW5zcG9zZV80eDQgICBkNSwgZDcsIGQ5LCBkMTEKKworICAgIC8qIFBhc3MgMiAqLworICAgIGlkY3RfaGVscGVyICAgICBkNCwgZDYsIGQ4LCBkMTAsIGQ3LCBkOSwgZDExLCAxOSwgZDI2LCBkMjcsIGQyOCwgZDI5CisgICAgdHJhbnNwb3NlXzR4NCAgIGQyNiwgZDI3LCBkMjgsIGQyOQorCisgICAgLyogUmFuZ2UgbGltaXQgKi8KKyAgICB2bW92LnUxNiAgICAgICAgcTE1LCAjMHg4MAorICAgIHZhZGQuczE2ICAgICAgICBxMTMsIHExMywgcTE1CisgICAgdmFkZC5zMTYgICAgICAgIHExNCwgcTE0LCBxMTUKKyAgICB2cW1vdnVuLnMxNiAgICAgZDI2LCBxMTMKKyAgICB2cW1vdnVuLnMxNiAgICAgZDI3LCBxMTQKKworICAgIC8qIFN0b3JlIHJlc3VsdHMgdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICBsZG1pYSAgICAgICAgICAgT1VUUFVUX0JVRiwge1RNUDEsIFRNUDIsIFRNUDMsIFRNUDR9CisgICAgYWRkICAgICAgICAgICAgIFRNUDEsIFRNUDEsIE9VVFBVVF9DT0wKKyAgICBhZGQgICAgICAgICAgICAgVE1QMiwgVE1QMiwgT1VUUFVUX0NPTAorICAgIGFkZCAgICAgICAgICAgICBUTVAzLCBUTVAzLCBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDQsIFRNUDQsIE9VVFBVVF9DT0wKKworI2lmIGRlZmluZWQoX19BUk1FTF9fKSAmJiAhUkVTUEVDVF9TVFJJQ1RfQUxJR05NRU5UCisgICAgLyogV2UgY2FuIHVzZSBtdWNoIGxlc3MgaW5zdHJ1Y3Rpb25zIG9uIGxpdHRsZSBlbmRpYW4gc3lzdGVtcyBpZiB0aGUKKyAgICAgKiBPUyBrZXJuZWwgaXMgbm90IGNvbmZpZ3VyZWQgdG8gdHJhcCB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzCisgICAgICovCisgICAgdnN0MS4zMiAgICAgICAgIHtkMjZbMF19LCBbVE1QMV0hCisgICAgdnN0MS4zMiAgICAgICAgIHtkMjdbMF19LCBbVE1QM10hCisgICAgdnN0MS4zMiAgICAgICAgIHtkMjZbMV19LCBbVE1QMl0hCisgICAgdnN0MS4zMiAgICAgICAgIHtkMjdbMV19LCBbVE1QNF0hCisjZWxzZQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI2WzBdfSwgW1RNUDFdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI3WzBdfSwgW1RNUDNdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI2WzFdfSwgW1RNUDFdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI3WzFdfSwgW1RNUDNdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI2WzJdfSwgW1RNUDFdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI3WzJdfSwgW1RNUDNdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI2WzNdfSwgW1RNUDFdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI3WzNdfSwgW1RNUDNdIQorCisgICAgdnN0MS44ICAgICAgICAgIHtkMjZbNF19LCBbVE1QMl0hCisgICAgdnN0MS44ICAgICAgICAgIHtkMjdbNF19LCBbVE1QNF0hCisgICAgdnN0MS44ICAgICAgICAgIHtkMjZbNV19LCBbVE1QMl0hCisgICAgdnN0MS44ICAgICAgICAgIHtkMjdbNV19LCBbVE1QNF0hCisgICAgdnN0MS44ICAgICAgICAgIHtkMjZbNl19LCBbVE1QMl0hCisgICAgdnN0MS44ICAgICAgICAgIHtkMjdbNl19LCBbVE1QNF0hCisgICAgdnN0MS44ICAgICAgICAgIHtkMjZbN119LCBbVE1QMl0hCisgICAgdnN0MS44ICAgICAgICAgIHtkMjdbN119LCBbVE1QNF0hCisjZW5kaWYKKworICAgIHZwb3AgICAgICAgICAgICB7ZDgtZDE1fQorICAgIGJ4ICAgICAgICAgICAgICBscgorCisgICAgLnVucmVxICAgICAgICAgIERDVF9UQUJMRQorICAgIC51bnJlcSAgICAgICAgICBDT0VGX0JMT0NLCisgICAgLnVucmVxICAgICAgICAgIE9VVFBVVF9CVUYKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0NPTAorICAgIC51bnJlcSAgICAgICAgICBUTVAxCisgICAgLnVucmVxICAgICAgICAgIFRNUDIKKyAgICAudW5yZXEgICAgICAgICAgVE1QMworICAgIC51bnJlcSAgICAgICAgICBUTVA0CisKKy5wdXJnZW0gaWRjdF9oZWxwZXIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoganNpbWRfaWRjdF8yeDJfbmVvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29udGFpbnMgaW52ZXJzZS1EQ1QgY29kZSBmb3IgZ2V0dGluZyByZWR1Y2VkLXNpemUKKyAqIDJ4MiBwaXhlbHMgb3V0cHV0IGZyb20gYW4gOHg4IERDVCBibG9jay4gSXQgdXNlcyB0aGUgc2FtZSAgY2FsY3VsYXRpb25zCisgKiBhbmQgcHJvZHVjZXMgZXhhY3RseSB0aGUgc2FtZSBvdXRwdXQgYXMgSUpHJ3Mgb3JpZ2luYWwgJ2pwZWdfaWRjdF8yeDInCisgKiBmdW5jdGlvbiBmcm9tIGpwZWctNmIgKGppZGN0cmVkLmMpLgorICoKKyAqIE5PVEU6IGpwZWctOCBoYXMgYW4gaW1wcm92ZWQgaW1wbGVtZW50YXRpb24gb2YgMngyIGludmVyc2UtRENULCB3aGljaAorICogICAgICAgcmVxdWlyZXMgbXVjaCBsZXNzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBhbmQgaGVuY2Ugc2hvdWxkIGJlIGZhc3Rlci4KKyAqICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBwYXJ0aWN1bGFyIE5FT04gb3B0aW1pemVkIGZ1bmN0aW9uIGlzCisgKiAgICAgICBiaXQgZXhhY3QgY29tcGF0aWJpbGl0eSB3aXRoIGpwZWctNmIuCisgKi8KKworLmJhbGlnbiA4Citqc2ltZF9pZGN0XzJ4Ml9uZW9uX2NvbnN0czoKKyAgICAuc2hvcnQgICAgIC1GSVhfMF83MjA5NTk4MjIgICAgLyogZDBbMF0gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8wXzg1MDQzMDA5NSAgICAgLyogZDBbMV0gKi8KKyAgICAuc2hvcnQgICAgIC1GSVhfMV8yNzI3NTg1ODAgICAgLyogZDBbMl0gKi8KKyAgICAuc2hvcnQgICAgIEZJWF8zXzYyNDUwOTc4NSAgICAgLyogZDBbM10gKi8KKworLm1hY3JvIGlkY3RfaGVscGVyIHg0LCB4NiwgeDEwLCB4MTIsIHgxNiwgc2hpZnQsIHkyNiwgeTI3CisgICAgdnNobGwuczE2ICBxMTQsICBceDQsICAjMTUKKyAgICB2bXVsbC5zMTYgIHExMywgIFx4NiwgIGQwWzNdCisgICAgdm1sYWwuczE2ICBxMTMsICBceDEwLCBkMFsyXQorICAgIHZtbGFsLnMxNiAgcTEzLCAgXHgxMiwgZDBbMV0KKyAgICB2bWxhbC5zMTYgIHExMywgIFx4MTYsIGQwWzBdCisKKyAgICB2YWRkLnMzMiAgIHExMCwgIHExNCwgIHExMworICAgIHZzdWIuczMyICAgcTE0LCAgcTE0LCAgcTEzCisKKy5pZiBcc2hpZnQgPiAxNgorICAgIHZyc2hyLnMzMiAgcTEwLCAgcTEwLCAgI1xzaGlmdAorICAgIHZyc2hyLnMzMiAgcTE0LCAgcTE0LCAgI1xzaGlmdAorICAgIHZtb3ZuLnMzMiAgXHkyNiwgcTEwCisgICAgdm1vdm4uczMyICBceTI3LCBxMTQKKy5lbHNlCisgICAgdnJzaHJuLnMzMiBceTI2LCBxMTAsICAjXHNoaWZ0CisgICAgdnJzaHJuLnMzMiBceTI3LCBxMTQsICAjXHNoaWZ0CisuZW5kaWYKKworLmVuZG0KKworYXNtX2Z1bmN0aW9uIGpzaW1kX2lkY3RfMngyX25lb24KKworICAgIERDVF9UQUJMRSAgICAgICAucmVxIHIwCisgICAgQ09FRl9CTE9DSyAgICAgIC5yZXEgcjEKKyAgICBPVVRQVVRfQlVGICAgICAgLnJlcSByMgorICAgIE9VVFBVVF9DT0wgICAgICAucmVxIHIzCisgICAgVE1QMSAgICAgICAgICAgIC5yZXEgcjAKKyAgICBUTVAyICAgICAgICAgICAgLnJlcSBpcAorCisgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisKKyAgICAvKiBMb2FkIGNvbnN0YW50cyAqLworICAgIGFkciAgICAgICAgICAgICBUTVAyLCBqc2ltZF9pZGN0XzJ4Ml9uZW9uX2NvbnN0cworICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbVE1QMiwgOjY0XQorCisgICAgLyogTG9hZCBhbGwgQ09FRl9CTE9DSyBpbnRvIE5FT04gcmVnaXN0ZXJzIHdpdGggdGhlIGZvbGxvd2luZyBhbGxvY2F0aW9uOgorICAgICAqICAgICAgIDAgMSAyIDMgfCA0IDUgNiA3CisgICAgICogICAgICAtLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgKiAgIDAgfCBkNCAgICAgIHwgZDUKKyAgICAgKiAgIDEgfCBkNiAgICAgIHwgZDcKKyAgICAgKiAgIDIgfCAtICAgICAgIHwgLQorICAgICAqICAgMyB8IGQxMCAgICAgfCBkMTEKKyAgICAgKiAgIDQgfCAtICAgICAgIHwgLQorICAgICAqICAgNSB8IGQxMiAgICAgfCBkMTMKKyAgICAgKiAgIDYgfCAtICAgICAgIHwgLQorICAgICAqICAgNyB8IGQxNiAgICAgfCBkMTcKKyAgICAgKi8KKworICAgIHZsZDEuMTYgICAgICAgICB7ZDQsIGQ1LCBkNiwgZDd9LCBbQ09FRl9CTE9DS10hCisgICAgYWRkICAgICAgICAgICAgIENPRUZfQkxPQ0ssIENPRUZfQkxPQ0ssICMxNgorICAgIHZsZDEuMTYgICAgICAgICB7ZDEwLCBkMTF9LCBbQ09FRl9CTE9DS10hCisgICAgYWRkICAgICAgICAgICAgIENPRUZfQkxPQ0ssIENPRUZfQkxPQ0ssICMxNgorICAgIHZsZDEuMTYgICAgICAgICB7ZDEyLCBkMTN9LCBbQ09FRl9CTE9DS10hCisgICAgYWRkICAgICAgICAgICAgIENPRUZfQkxPQ0ssIENPRUZfQkxPQ0ssICMxNgorICAgIHZsZDEuMTYgICAgICAgICB7ZDE2LCBkMTd9LCBbQ09FRl9CTE9DS10hCisgICAgLyogRGVxdWFudGl6ZSAqLworICAgIHZsZDEuMTYgICAgICAgICB7ZDE4LCBkMTksIGQyMCwgZDIxfSwgW0RDVF9UQUJMRV0hCisgICAgdm11bC5zMTYgICAgICAgIHEyLCBxMiwgcTkKKyAgICB2bXVsLnMxNiAgICAgICAgcTMsIHEzLCBxMTAKKyAgICBhZGQgICAgICAgICAgICAgRENUX1RBQkxFLCBEQ1RfVEFCTEUsICMxNgorICAgIHZsZDEuMTYgICAgICAgICB7ZDI0LCBkMjV9LCBbRENUX1RBQkxFXSEKKyAgICB2bXVsLnMxNiAgICAgICAgcTUsIHE1LCBxMTIKKyAgICBhZGQgICAgICAgICAgICAgRENUX1RBQkxFLCBEQ1RfVEFCTEUsICMxNgorICAgIHZsZDEuMTYgICAgICAgICB7ZDI2LCBkMjd9LCBbRENUX1RBQkxFXSEKKyAgICB2bXVsLnMxNiAgICAgICAgcTYsIHE2LCBxMTMKKyAgICBhZGQgICAgICAgICAgICAgRENUX1RBQkxFLCBEQ1RfVEFCTEUsICMxNgorICAgIHZsZDEuMTYgICAgICAgICB7ZDMwLCBkMzF9LCBbRENUX1RBQkxFXSEKKyAgICB2bXVsLnMxNiAgICAgICAgcTgsIHE4LCBxMTUKKworICAgIC8qIFBhc3MgMSAqLworICAgIHZtdWxsLnMxNiAgICAgICBxMTMsIGQ2LCAgZDBbM10KKyAgICB2bWxhbC5zMTYgICAgICAgcTEzLCBkMTAsIGQwWzJdCisgICAgdm1sYWwuczE2ICAgICAgIHExMywgZDEyLCBkMFsxXQorICAgIHZtbGFsLnMxNiAgICAgICBxMTMsIGQxNiwgZDBbMF0KKyAgICB2bXVsbC5zMTYgICAgICAgcTEyLCBkNywgIGQwWzNdCisgICAgdm1sYWwuczE2ICAgICAgIHExMiwgZDExLCBkMFsyXQorICAgIHZtbGFsLnMxNiAgICAgICBxMTIsIGQxMywgZDBbMV0KKyAgICB2bWxhbC5zMTYgICAgICAgcTEyLCBkMTcsIGQwWzBdCisgICAgdnNobGwuczE2ICAgICAgIHExNCwgZDQsICAjMTUKKyAgICB2c2hsbC5zMTYgICAgICAgcTE1LCBkNSwgICMxNQorICAgIHZhZGQuczMyICAgICAgICBxMTAsIHExNCwgcTEzCisgICAgdnN1Yi5zMzIgICAgICAgIHExNCwgcTE0LCBxMTMKKyAgICB2cnNocm4uczMyICAgICAgZDQsICBxMTAsICMxMworICAgIHZyc2hybi5zMzIgICAgICBkNiwgIHExNCwgIzEzCisgICAgdmFkZC5zMzIgICAgICAgIHExMCwgcTE1LCBxMTIKKyAgICB2c3ViLnMzMiAgICAgICAgcTE0LCBxMTUsIHExMgorICAgIHZyc2hybi5zMzIgICAgICBkNSwgIHExMCwgIzEzCisgICAgdnJzaHJuLnMzMiAgICAgIGQ3LCAgcTE0LCAjMTMKKyAgICB2dHJuLjE2ICAgICAgICAgcTIsICBxMworICAgIHZ0cm4uMzIgICAgICAgICBxMywgIHE1CisKKyAgICAvKiBQYXNzIDIgKi8KKyAgICBpZGN0X2hlbHBlciAgICAgZDQsIGQ2LCBkMTAsIGQ3LCBkMTEsIDIwLCBkMjYsIGQyNworCisgICAgLyogUmFuZ2UgbGltaXQgKi8KKyAgICB2bW92LnUxNiAgICAgICAgcTE1LCAjMHg4MAorICAgIHZhZGQuczE2ICAgICAgICBxMTMsIHExMywgcTE1CisgICAgdnFtb3Z1bi5zMTYgICAgIGQyNiwgcTEzCisgICAgdnFtb3Z1bi5zMTYgICAgIGQyNywgcTEzCisKKyAgICAvKiBTdG9yZSByZXN1bHRzIHRvIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgbGRtaWEgICAgICAgICAgIE9VVFBVVF9CVUYsIHtUTVAxLCBUTVAyfQorICAgIGFkZCAgICAgICAgICAgICBUTVAxLCBUTVAxLCBPVVRQVVRfQ09MCisgICAgYWRkICAgICAgICAgICAgIFRNUDIsIFRNUDIsIE9VVFBVVF9DT0wKKworICAgIHZzdDEuOCAgICAgICAgICB7ZDI2WzBdfSwgW1RNUDFdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI3WzRdfSwgW1RNUDFdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI2WzFdfSwgW1RNUDJdIQorICAgIHZzdDEuOCAgICAgICAgICB7ZDI3WzVdfSwgW1RNUDJdIQorCisgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgYnggICAgICAgICAgICAgIGxyCisKKyAgICAudW5yZXEgICAgICAgICAgRENUX1RBQkxFCisgICAgLnVucmVxICAgICAgICAgIENPRUZfQkxPQ0sKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0JVRgorICAgIC51bnJlcSAgICAgICAgICBPVVRQVVRfQ09MCisgICAgLnVucmVxICAgICAgICAgIFRNUDEKKyAgICAudW5yZXEgICAgICAgICAgVE1QMgorCisucHVyZ2VtIGlkY3RfaGVscGVyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGpzaW1kX3ljY19yZ2JhODg4OF9jb252ZXJ0X25lb24KKyAqIGpzaW1kX3ljY19yZ2I1NjVfY29udmVydF9uZW9uCisgKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gWUNiQ3IgLT4gUkdCCisgKi8KKworCisubWFjcm8gZG9fbG9hZCBzaXplCisgICAgLmlmIFxzaXplID09IDgKKyAgICAgICAgdmxkMS44ICB7ZDR9LCBbVV0hCisgICAgICAgIHZsZDEuOCAge2Q1fSwgW1ZdIQorICAgICAgICB2bGQxLjggIHtkMH0sIFtZXSEKKyAgICAgICAgcGxkICAgICBbWSwgIzY0XQorICAgICAgICBwbGQgICAgIFtVLCAjNjRdCisgICAgICAgIHBsZCAgICAgW1YsICM2NF0KKyAgICAuZWxzZWlmIFxzaXplID09IDQKKyAgICAgICAgdmxkMS44ICB7ZDRbMF19LCBbVV0hCisgICAgICAgIHZsZDEuOCAge2Q0WzFdfSwgW1VdIQorICAgICAgICB2bGQxLjggIHtkNFsyXX0sIFtVXSEKKyAgICAgICAgdmxkMS44ICB7ZDRbM119LCBbVV0hCisgICAgICAgIHZsZDEuOCAge2Q1WzBdfSwgW1ZdIQorICAgICAgICB2bGQxLjggIHtkNVsxXX0sIFtWXSEKKyAgICAgICAgdmxkMS44ICB7ZDVbMl19LCBbVl0hCisgICAgICAgIHZsZDEuOCAge2Q1WzNdfSwgW1ZdIQorICAgICAgICB2bGQxLjggIHtkMFswXX0sIFtZXSEKKyAgICAgICAgdmxkMS44ICB7ZDBbMV19LCBbWV0hCisgICAgICAgIHZsZDEuOCAge2QwWzJdfSwgW1ldIQorICAgICAgICB2bGQxLjggIHtkMFszXX0sIFtZXSEKKyAgICAuZWxzZWlmIFxzaXplID09IDIKKyAgICAgICAgdmxkMS44ICB7ZDRbNF19LCBbVV0hCisgICAgICAgIHZsZDEuOCAge2Q0WzVdfSwgW1VdIQorICAgICAgICB2bGQxLjggIHtkNVs0XX0sIFtWXSEKKyAgICAgICAgdmxkMS44ICB7ZDVbNV19LCBbVl0hCisgICAgICAgIHZsZDEuOCAge2QwWzRdfSwgW1ldIQorICAgICAgICB2bGQxLjggIHtkMFs1XX0sIFtZXSEKKyAgICAuZWxzZWlmIFxzaXplID09IDEKKyAgICAgICAgdmxkMS44ICB7ZDRbNl19LCBbVV0hCisgICAgICAgIHZsZDEuOCAge2Q1WzZdfSwgW1ZdIQorICAgICAgICB2bGQxLjggIHtkMFs2XX0sIFtZXSEKKyAgICAuZWxzZQorICAgICAgICAuZXJyb3IgdW5zdXBwb3J0ZWQgbWFjcm9ibG9jayBzaXplCisgICAgLmVuZGlmCisuZW5kbQorCisKKworCisKKy5tYWNybyBkb19zdG9yZSBicHAsIHNpemUKKyAgICAuaWYgXGJwcCA9PSAxNgorICAgICAgICAgICAgLyogaWYgMTYgYml0cywgcGFjayBpbnRvIFJHQjU2NSBmb3JtYXQgKi8KKyAgICAgICAgICAgIHZtb3YgICAgICBkMjcsIGQxMCAgICAgICAgICAvKiBpbnNlcnQgcmVkIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIHZzcmkudTggICBkMjcsIGQxMSwgIzUgICAgICAvKiBzaGlmdCBhbmQgaW5zZXJ0IHRoZSBncmVlbiBjaGFubmVsICovCisgICAgICAgICAgICB2c2xpLnU4ICAgZDI2LCBkMTEsICMzCisgICAgICAgICAgICB2c3JpLnU4ICAgZDI2LCBkMTIsICMzICAgICAvKiBzaGlmdCBhbmQgaW5zZXJ0IHRoZSBibHVlIGNoYW5uZWwgKi8KKworICAgICAgICAuaWYgXHNpemUgPT0gOAorICAgICAgICAgICAgdnN0Mi44ICB7ZDI2LCBkMjd9LCBbUkdCXSEKKyAgICAgICAgLmVsc2VpZiBcc2l6ZSA9PSA0CisgICAgICAgICAgICB2c3QyLjggIHtkMjZbMF0sIGQyN1swXX0sIFtSR0JdIQorICAgICAgICAgICAgdnN0Mi44ICB7ZDI2WzFdLCBkMjdbMV19LCBbUkdCXSEKKyAgICAgICAgICAgIHZzdDIuOCAge2QyNlsyXSwgZDI3WzJdfSwgW1JHQl0hCisgICAgICAgICAgICB2c3QyLjggIHtkMjZbM10sIGQyN1szXX0sIFtSR0JdIQorICAgICAgICAuZWxzZWlmIFxzaXplID09IDIKKyAgICAgICAgICAgIHZzdDIuOCAge2QyNls0XSwgZDI3WzRdfSwgW1JHQl0hCisgICAgICAgICAgICB2c3QyLjggIHtkMjZbNV0sIGQyN1s1XX0sIFtSR0JdIQorICAgICAgICAuZWxzZWlmIFxzaXplID09IDEKKyAgICAgICAgICAgIHZzdDIuOCAge2QyNls2XSwgZDI3WzZdfSwgW1JHQl0hCisgICAgICAgIC5lbHNlCisgICAgICAgICAgICAuZXJyb3IgdW5zdXBwb3J0ZWQgbWFjcm9ibG9jayBzaXplCisgICAgICAgIC5lbmRpZgorICAgIC5lbHNlaWYgXGJwcCA9PSAyNAorICAgICAgICAuaWYgXHNpemUgPT0gOAorICAgICAgICAgICAgdnN0My44ICB7ZDEwLCBkMTEsIGQxMn0sIFtSR0JdIQorICAgICAgICAuZWxzZWlmIFxzaXplID09IDQKKyAgICAgICAgICAgIHZzdDMuOCAge2QxMFswXSwgZDExWzBdLCBkMTJbMF19LCBbUkdCXSEKKyAgICAgICAgICAgIHZzdDMuOCAge2QxMFsxXSwgZDExWzFdLCBkMTJbMV19LCBbUkdCXSEKKyAgICAgICAgICAgIHZzdDMuOCAge2QxMFsyXSwgZDExWzJdLCBkMTJbMl19LCBbUkdCXSEKKyAgICAgICAgICAgIHZzdDMuOCAge2QxMFszXSwgZDExWzNdLCBkMTJbM119LCBbUkdCXSEKKyAgICAgICAgLmVsc2VpZiBcc2l6ZSA9PSAyCisgICAgICAgICAgICB2c3QzLjggIHtkMTBbNF0sIGQxMVs0XSwgZDEyWzRdfSwgW1JHQl0hCisgICAgICAgICAgICB2c3QzLjggIHtkMTBbNV0sIGQxMVs1XSwgZDEyWzVdfSwgW1JHQl0hCisgICAgICAgIC5lbHNlaWYgXHNpemUgPT0gMQorICAgICAgICAgICAgdnN0My44ICB7ZDEwWzZdLCBkMTFbNl0sIGQxMls2XX0sIFtSR0JdIQorICAgICAgICAuZWxzZQorICAgICAgICAgICAgLmVycm9yIHVuc3VwcG9ydGVkIG1hY3JvYmxvY2sgc2l6ZQorICAgICAgICAuZW5kaWYKKyAgICAuZWxzZWlmIFxicHAgPT0gMzIKKyAgICAgICAgLmlmIFxzaXplID09IDgKKyAgICAgICAgICAgIHZzdDQuOCAge2QxMCwgZDExLCBkMTIsIGQxM30sIFtSR0JdIQorICAgICAgICAuZWxzZWlmIFxzaXplID09IDQKKyAgICAgICAgICAgIHZzdDQuOCAge2QxMFswXSwgZDExWzBdLCBkMTJbMF0sIGQxM1swXX0sIFtSR0JdIQorICAgICAgICAgICAgdnN0NC44ICB7ZDEwWzFdLCBkMTFbMV0sIGQxMlsxXSwgZDEzWzFdfSwgW1JHQl0hCisgICAgICAgICAgICB2c3Q0LjggIHtkMTBbMl0sIGQxMVsyXSwgZDEyWzJdLCBkMTNbMl19LCBbUkdCXSEKKyAgICAgICAgICAgIHZzdDQuOCAge2QxMFszXSwgZDExWzNdLCBkMTJbM10sIGQxM1szXX0sIFtSR0JdIQorICAgICAgICAuZWxzZWlmIFxzaXplID09IDIKKyAgICAgICAgICAgIHZzdDQuOCAge2QxMFs0XSwgZDExWzRdLCBkMTJbNF0sIGQxM1s0XX0sIFtSR0JdIQorICAgICAgICAgICAgdnN0NC44ICB7ZDEwWzVdLCBkMTFbNV0sIGQxMls1XSwgZDEzWzVdfSwgW1JHQl0hCisgICAgICAgIC5lbHNlaWYgXHNpemUgPT0gMQorICAgICAgICAgICAgdnN0NC44ICB7ZDEwWzZdLCBkMTFbNl0sIGQxMls2XSwgZDEzWzZdfSwgW1JHQl0hCisgICAgICAgIC5lbHNlCisgICAgICAgICAgICAuZXJyb3IgdW5zdXBwb3J0ZWQgbWFjcm9ibG9jayBzaXplCisgICAgICAgIC5lbmRpZgorICAgIC5lbHNlCisgICAgICAgIC5lcnJvciB1bnN1cHBvcnRlZCBicHAKKyAgICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBnZW5lcmF0ZV9qc2ltZF95Y2NfcmdiX2NvbnZlcnRfbmVvbiBjb2xvcmlkLCBicHAsIHJfb2ZmcywgZ19vZmZzLCBiX29mZnMKKworLm1hY3JvIGRvX3l1dl90b19yZ2IKKyAgICB2YWRkdy51OCAgICAgICAgcTMsIHExLCBkNCAgICAgLyogcTMgPSB1IC0gMTI4ICovCisgICAgdmFkZHcudTggICAgICAgIHE0LCBxMSwgZDUgICAgIC8qIHEyID0gdiAtIDEyOCAqLworICAgIHZtdWxsLnMxNiAgICAgICBxMTAsIGQ2LCBkMVsxXSAvKiBtdWx0aXBseSBieSAtMTEyNzcgKi8KKyAgICB2bWxhbC5zMTYgICAgICAgcTEwLCBkOCwgZDFbMl0gLyogbXVsdGlwbHkgYnkgLTIzNDAxICovCisgICAgdm11bGwuczE2ICAgICAgIHExMSwgZDcsIGQxWzFdIC8qIG11bHRpcGx5IGJ5IC0xMTI3NyAqLworICAgIHZtbGFsLnMxNiAgICAgICBxMTEsIGQ5LCBkMVsyXSAvKiBtdWx0aXBseSBieSAtMjM0MDEgKi8KKyAgICB2bXVsbC5zMTYgICAgICAgcTEyLCBkOCwgZDFbMF0gLyogbXVsdGlwbHkgYnkgMjI5NzEgKi8KKyAgICB2bXVsbC5zMTYgICAgICAgcTEzLCBkOSwgZDFbMF0gLyogbXVsdGlwbHkgYnkgMjI5NzEgKi8KKyAgICB2bXVsbC5zMTYgICAgICAgcTE0LCBkNiwgZDFbM10gLyogbXVsdGlwbHkgYnkgMjkwMzMgKi8KKyAgICB2bXVsbC5zMTYgICAgICAgcTE1LCBkNywgZDFbM10gLyogbXVsdGlwbHkgYnkgMjkwMzMgKi8KKyAgICB2cnNocm4uczMyICAgICAgZDIwLCBxMTAsICMxNQorICAgIHZyc2hybi5zMzIgICAgICBkMjEsIHExMSwgIzE1CisgICAgdnJzaHJuLnMzMiAgICAgIGQyNCwgcTEyLCAjMTQKKyAgICB2cnNocm4uczMyICAgICAgZDI1LCBxMTMsICMxNAorICAgIHZyc2hybi5zMzIgICAgICBkMjgsIHExNCwgIzE0CisgICAgdnJzaHJuLnMzMiAgICAgIGQyOSwgcTE1LCAjMTQKKyAgICB2YWRkdy51OCAgICAgICAgcTEwLCBxMTAsIGQwCisgICAgdmFkZHcudTggICAgICAgIHExMiwgcTEyLCBkMAorICAgIHZhZGR3LnU4ICAgICAgICBxMTQsIHExNCwgZDAKKyAgICB2cW1vdnVuLnMxNiAgICAgZDFcZ19vZmZzLCBxMTAKKyAgICB2cW1vdnVuLnMxNiAgICAgZDFccl9vZmZzLCBxMTIKKyAgICB2cW1vdnVuLnMxNiAgICAgZDFcYl9vZmZzLCBxMTQKKy5lbmRtCisKKy8qIEFwcGxlIGdhcyBjcmFzaGVzIG9uIGFkcmwsIHdvcmsgYXJvdW5kIHRoYXQgYnkgdXNpbmcgYWRyLgorICogQnV0IHRoaXMgcmVxdWlyZXMgYSBjb3B5IG9mIHRoZXNlIGNvbnN0YW50cyBmb3IgZWFjaCBmdW5jdGlvbi4KKyAqLworCisuYmFsaWduIDE2Citqc2ltZF95Y2NfXGNvbG9yaWRcKClfbmVvbl9jb25zdHM6CisgICAgLnNob3J0ICAgICAgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMAorICAgIC5zaG9ydCAgICAgICAgICAyMjk3MSwgLTExMjc3LCAtMjM0MDEsIDI5MDMzCisgICAgLnNob3J0ICAgICAgICAgIC0xMjgsICAtMTI4LCAgIC0xMjgsICAgLTEyOAorICAgIC5zaG9ydCAgICAgICAgICAtMTI4LCAgLTEyOCwgICAtMTI4LCAgIC0xMjgKKworYXNtX2Z1bmN0aW9uIGpzaW1kX3ljY19cY29sb3JpZFwoKV9jb252ZXJ0X25lb24KKyAgICBPVVRQVVRfV0lEVEggICAgLnJlcSByMAorICAgIElOUFVUX0JVRiAgICAgICAucmVxIHIxCisgICAgSU5QVVRfUk9XICAgICAgIC5yZXEgcjIKKyAgICBPVVRQVVRfQlVGICAgICAgLnJlcSByMworICAgIE5VTV9ST1dTICAgICAgICAucmVxIHI0CisKKyAgICBJTlBVVF9CVUYwICAgICAgLnJlcSByNQorICAgIElOUFVUX0JVRjEgICAgICAucmVxIHI2CisgICAgSU5QVVRfQlVGMiAgICAgIC5yZXEgSU5QVVRfQlVGCisKKyAgICBSR0IgICAgICAgICAgICAgLnJlcSByNworICAgIFkgICAgICAgICAgICAgICAucmVxIHI4CisgICAgVSAgICAgICAgICAgICAgIC5yZXEgcjkKKyAgICBWICAgICAgICAgICAgICAgLnJlcSByMTAKKyAgICBOICAgICAgICAgICAgICAgLnJlcSBpcAorCisgICAgLyogTG9hZCBjb25zdGFudHMgdG8gZDEsIGQyLCBkMyAoZDAgaXMganVzdCB1c2VkIGZvciBwYWRkaW5nKSAqLworICAgIGFkciAgICAgICAgICAgICBpcCwganNpbWRfeWNjX1xjb2xvcmlkXCgpX25lb25fY29uc3RzCisgICAgdmxkMS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtpcCwgOjEyOF0KKworICAgIC8qIFNhdmUgQVJNIHJlZ2lzdGVycyBhbmQgaGFuZGxlIGlucHV0IGFyZ3VtZW50cyAqLworICAgIHB1c2ggICAgICAgICAgICB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCBscn0KKyAgICBsZHIgICAgICAgICAgICAgTlVNX1JPV1MsIFtzcCwgIyg0ICogOCldCisgICAgbGRyICAgICAgICAgICAgIElOUFVUX0JVRjAsIFtJTlBVVF9CVUZdCisgICAgbGRyICAgICAgICAgICAgIElOUFVUX0JVRjEsIFtJTlBVVF9CVUYsICM0XQorICAgIGxkciAgICAgICAgICAgICBJTlBVVF9CVUYyLCBbSU5QVVRfQlVGLCAjOF0KKyAgICAudW5yZXEgICAgICAgICAgSU5QVVRfQlVGCisKKyAgICAvKiBTYXZlIE5FT04gcmVnaXN0ZXJzICovCisgICAgdnB1c2ggICAgICAgICAgIHtkOC1kMTV9CisKKyAgICAvKiBJbml0aWFsbHkgc2V0IGQxMCwgZDExLCBkMTIsIGQxMyB0byAweEZGICovCisgICAgdm1vdi51OCAgICAgICAgIHE1LCAjMjU1CisgICAgdm1vdi51OCAgICAgICAgIHE2LCAjMjU1CisKKyAgICAvKiBPdXRlciBsb29wIG92ZXIgc2NhbmxpbmVzICovCisgICAgY21wICAgICAgICAgICAgIE5VTV9ST1dTLCAjMQorICAgIGJsdCAgICAgICAgICAgICA5ZgorMDoKKyAgICBsZHIgICAgICAgICAgICAgWSwgW0lOUFVUX0JVRjAsIElOUFVUX1JPVywgbHNsICMyXQorICAgIGxkciAgICAgICAgICAgICBVLCBbSU5QVVRfQlVGMSwgSU5QVVRfUk9XLCBsc2wgIzJdCisgICAgbW92ICAgICAgICAgICAgIE4sIE9VVFBVVF9XSURUSAorICAgIGxkciAgICAgICAgICAgICBWLCBbSU5QVVRfQlVGMiwgSU5QVVRfUk9XLCBsc2wgIzJdCisgICAgYWRkICAgICAgICAgICAgIElOUFVUX1JPVywgSU5QVVRfUk9XLCAjMQorICAgIGxkciAgICAgICAgICAgICBSR0IsIFtPVVRQVVRfQlVGXSwgIzQKKworICAgIC8qIElubmVyIGxvb3Agb3ZlciBwaXhlbHMgKi8KKyAgICBzdWJzICAgICAgICAgICAgTiwgTiwgIzgKKyAgICBibHQgICAgICAgICAgICAgMmYKKzE6CisgICAgZG9fbG9hZCAgICAgICAgIDgKKyAgICBkb195dXZfdG9fcmdiCisgICAgZG9fc3RvcmUgICAgICAgIFxicHAsIDgKKyAgICBzdWJzICAgICAgICAgICAgTiwgTiwgIzgKKyAgICBiZ2UgICAgICAgICAgICAgMWIKKyAgICB0c3QgICAgICAgICAgICAgTiwgIzcKKyAgICBiZXEgICAgICAgICAgICAgOGYKKzI6CisgICAgdHN0ICAgICAgICAgICAgIE4sICM0CisgICAgYmVxICAgICAgICAgICAgIDNmCisgICAgZG9fbG9hZCAgICAgICAgIDQKKzM6CisgICAgdHN0ICAgICAgICAgICAgIE4sICMyCisgICAgYmVxICAgICAgICAgICAgIDRmCisgICAgZG9fbG9hZCAgICAgICAgIDIKKzQ6CisgICAgdHN0ICAgICAgICAgICAgIE4sICMxCisgICAgYmVxICAgICAgICAgICAgIDVmCisgICAgZG9fbG9hZCAgICAgICAgIDEKKzU6CisgICAgZG9feXV2X3RvX3JnYgorICAgIHRzdCAgICAgICAgICAgICBOLCAjNAorICAgIGJlcSAgICAgICAgICAgICA2ZgorICAgIGRvX3N0b3JlICAgICAgICBcYnBwLCA0Cis2OgorICAgIHRzdCAgICAgICAgICAgICBOLCAjMgorICAgIGJlcSAgICAgICAgICAgICA3ZgorICAgIGRvX3N0b3JlICAgICAgICBcYnBwLCAyCis3OgorICAgIHRzdCAgICAgICAgICAgICBOLCAjMQorICAgIGJlcSAgICAgICAgICAgICA4ZgorICAgIGRvX3N0b3JlICAgICAgICBcYnBwLCAxCis4OgorICAgIHN1YnMgICAgICAgICAgICBOVU1fUk9XUywgTlVNX1JPV1MsICMxCisgICAgYmd0ICAgICAgICAgICAgIDBiCis5OgorICAgIC8qIFJlc3RvcmUgYWxsIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisgICAgdnBvcCAgICAgICAgICAgIHtkOC1kMTV9CisgICAgcG9wICAgICAgICAgICAgIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHBjfQorCisgICAgLnVucmVxICAgICAgICAgIE9VVFBVVF9XSURUSAorICAgIC51bnJlcSAgICAgICAgICBJTlBVVF9ST1cKKyAgICAudW5yZXEgICAgICAgICAgT1VUUFVUX0JVRgorICAgIC51bnJlcSAgICAgICAgICBOVU1fUk9XUworICAgIC51bnJlcSAgICAgICAgICBJTlBVVF9CVUYwCisgICAgLnVucmVxICAgICAgICAgIElOUFVUX0JVRjEKKyAgICAudW5yZXEgICAgICAgICAgSU5QVVRfQlVGMgorICAgIC51bnJlcSAgICAgICAgICBSR0IKKyAgICAudW5yZXEgICAgICAgICAgWQorICAgIC51bnJlcSAgICAgICAgICBVCisgICAgLnVucmVxICAgICAgICAgIFYKKyAgICAudW5yZXEgICAgICAgICAgTgorCisucHVyZ2VtIGRvX3l1dl90b19yZ2IKKworLmVuZG0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaWQgLS0tLS0gYnBwIFIgIEcgIEIgKi8KK2dlbmVyYXRlX2pzaW1kX3ljY19yZ2JfY29udmVydF9uZW9uIHJnYmE4ODg4LCAzMiwgMCwgMSwgMgorZ2VuZXJhdGVfanNpbWRfeWNjX3JnYl9jb252ZXJ0X25lb24gcmdiNTY1LCAgMTYsIDAsIDEsIDIKKworCisucHVyZ2VtIGRvX2xvYWQKKy5wdXJnZW0gZG9fc3RvcmUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvanBlZy9qc2ltZF9uZW9uLmMgYi9qcGVnL2pzaW1kX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdiMzNjCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qc2ltZF9uZW9uLmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSwgIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBOVklESUEgQ09SUE9SQVRJT04gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIKKworCisjaWYgKGRlZmluZWQoTlZfQVJNX05FT04pICYmIGRlZmluZWQoX19BUk1fSEFWRV9ORU9OKSkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykKKworRVhURVJOKHZvaWQpIGpzaW1kX3ljY19leHRyZ2JfY29udmVydF9uZW9uCisgICAgICAgIEpQUCgoSkRJTUVOU0lPTiBvdXRfd2lkdGgsCisgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKSk7CitFWFRFUk4odm9pZCkganNpbWRfeWNjX3JnYmE4ODg4X2NvbnZlcnRfbmVvbgorICAgICAgICBKUFAoKEpESU1FTlNJT04gb3V0X3dpZHRoLAorICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykpOworRVhURVJOKHZvaWQpIGpzaW1kX3ljY19yZ2I1NjVfY29udmVydF9uZW9uCisgICAgICAgIEpQUCgoSkRJTUVOU0lPTiBvdXRfd2lkdGgsCisgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKSk7CisKK0VYVEVSTih2b2lkKSBqc2ltZF9pZGN0X2lzbG93X25lb24gSlBQKCh2b2lkICogZGN0X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworCitFWFRFUk4odm9pZCkganNpbWRfaWRjdF9pZmFzdF9uZW9uIEpQUCgodm9pZCAqIGRjdF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKKworRVhURVJOKHZvaWQpIGpzaW1kX2lkY3RfMngyX25lb24gSlBQKCh2b2lkICogZGN0X3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworCitFWFRFUk4odm9pZCkganNpbWRfaWRjdF80eDRfbmVvbiBKUFAoKHZvaWQgKiBkY3RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CisKKyNpZmRlZiBfX2FhcmNoNjRfXworR0xPQkFMKHZvaWQpCitqc2ltZF95Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgICAganNpbWRfeWNjX2V4dHJnYl9jb252ZXJ0X25lb24oY2luZm8tPm91dHB1dF93aWR0aCwgaW5wdXRfYnVmLAorICAgICAgICBpbnB1dF9yb3csIG91dHB1dF9idWYsIG51bV9yb3dzKTsKK30KKyNlbmRpZgorCitHTE9CQUwodm9pZCkKK2pzaW1kX3ljY19yZ2JhODg4OF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICAgIHZvaWQgKCpuZW9uZmN0KShKRElNRU5TSU9OLCBKU0FNUElNQUdFLCBKRElNRU5TSU9OLCBKU0FNUEFSUkFZLCBpbnQpOworCisgICAgbmVvbmZjdD1qc2ltZF95Y2NfcmdiYTg4ODhfY29udmVydF9uZW9uOworCisgICAgbmVvbmZjdChjaW5mby0+b3V0cHV0X3dpZHRoLCBpbnB1dF9idWYsCisgICAgICAgIGlucHV0X3Jvdywgb3V0cHV0X2J1ZiwgbnVtX3Jvd3MpOworfQorCitHTE9CQUwodm9pZCkKK2pzaW1kX3ljY19yZ2I1NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgICB2b2lkICgqbmVvbmZjdCkoSkRJTUVOU0lPTiwgSlNBTVBJTUFHRSwgSkRJTUVOU0lPTiwgSlNBTVBBUlJBWSwgaW50KTsKKworICAgIG5lb25mY3Q9anNpbWRfeWNjX3JnYjU2NV9jb252ZXJ0X25lb247CisKKyAgICBuZW9uZmN0KGNpbmZvLT5vdXRwdXRfd2lkdGgsIGlucHV0X2J1ZiwKKyAgICAgICAgaW5wdXRfcm93LCBvdXRwdXRfYnVmLCBudW1fcm93cyk7Cit9CisKKyNpZmRlZiBfX2FhcmNoNjRfXworR0xPQkFMKHZvaWQpCitqc2ltZF9pZGN0X2lzbG93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKyAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICAgIGpzaW1kX2lkY3RfaXNsb3dfbmVvbihjb21wcHRyLT5kY3RfdGFibGUsIGNvZWZfYmxvY2ssIG91dHB1dF9idWYsIG91dHB1dF9jb2wpOworfQorI2VuZGlmCisKK0dMT0JBTCh2b2lkKQoranNpbWRfaWRjdF9pZmFzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgICBqc2ltZF9pZGN0X2lmYXN0X25lb24oY29tcHB0ci0+ZGN0X3RhYmxlLCBjb2VmX2Jsb2NrLCBvdXRwdXRfYnVmLCBvdXRwdXRfY29sKTsKK30KKworCitHTE9CQUwodm9pZCkKK2pzaW1kX2lkY3RfMngyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKyAgICAgICAgICAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICAgIGpzaW1kX2lkY3RfMngyX25lb24oY29tcHB0ci0+ZGN0X3RhYmxlLCBjb2VmX2Jsb2NrLCBvdXRwdXRfYnVmLCBvdXRwdXRfY29sKTsKK30KKworR0xPQkFMKHZvaWQpCitqc2ltZF9pZGN0XzR4NCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgICBqc2ltZF9pZGN0XzR4NF9uZW9uKGNvbXBwdHItPmRjdF90YWJsZSwgY29lZl9ibG9jaywgb3V0cHV0X2J1Ziwgb3V0cHV0X2NvbCk7Cit9CisKKworR0xPQkFMKGludCkKK2NhcF9uZW9uX2lkY3RfMngyICh2b2lkKQoreworICBpZiAoICAoRENUU0laRSAhPSA4KSAgICAgICAgICAgICAgfHwKKyAgICAgICAgKHNpemVvZihKQ09FRikgIT0gMikgICAgICAgIHx8CisgICAgICAgIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkgICAgICB8fAorICAgICAgICAoc2l6ZW9mKEpESU1FTlNJT04pICE9IDQpICAgfHwKKyAgICAgICAgKHNpemVvZihJU0xPV19NVUxUX1RZUEUpICE9IDIpKQorICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKK0dMT0JBTChpbnQpCitjYXBfbmVvbl9pZGN0XzR4NCAodm9pZCkKK3sKKworICBpZiAoICAoRENUU0laRSAhPSA4KSAgICAgICAgICAgICAgfHwKKyAgICAgICAgKHNpemVvZihKQ09FRikgIT0gMikgICAgICAgIHx8CisgICAgICAgIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkgICAgICB8fAorICAgICAgICAoc2l6ZW9mKEpESU1FTlNJT04pICE9IDQpICAgfHwKKyAgICAgICAgKHNpemVvZihJU0xPV19NVUxUX1RZUEUpICE9IDIpKQorICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBfX2FhcmNoNjRfXworR0xPQkFMKGludCkKK2NhcF9uZW9uX2lkY3RfaXNsb3codm9pZCkKK3sKKworICBpZiAoICAoRENUU0laRSAhPSA4KSAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIChzaXplb2YoSkNPRUYpICE9IDIpICAgICAgICAgICAgfHwKKyAgICAgICAgKEJJVFNfSU5fSlNBTVBMRSAhPSA4KSAgICAgICAgICB8fAorICAgICAgICAoc2l6ZW9mKEpESU1FTlNJT04pICE9IDQpICAgICAgIHx8CisgICAgICAgIChzaXplb2YoSVNMT1dfTVVMVF9UWVBFKSAhPSAyKSkKKyAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworCit9CisjZW5kaWYKKworR0xPQkFMKGludCkKK2NhcF9uZW9uX2lkY3RfaWZhc3QgKHZvaWQpCit7CisKKyAgaWYgKCAgKERDVFNJWkUgIT0gOCkgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAoc2l6ZW9mKEpDT0VGKSAhPSAyKSAgICAgICAgICAgIHx8CisgICAgICAgIChCSVRTX0lOX0pTQU1QTEUgIT0gOCkgICAgICAgICAgfHwKKyAgICAgICAgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KSAgICAgICB8fAorICAgICAgICAoc2l6ZW9mKElGQVNUX01VTFRfVFlQRSkgIT0gMikgIHx8CisgICAgICAgIChJRkFTVF9TQ0FMRV9CSVRTICE9IDIpKQorICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7CisKK30KKworR0xPQkFMKGludCkKK2NhcF9uZW9uX3ljY19yZ2IgKHZvaWQpCit7CisKKyAgaWYoICAgKEJJVFNfSU5fSlNBTVBMRSAhPSA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKHNpemVvZihKRElNRU5TSU9OKSAhPSA0KSAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKChSR0JfUElYRUxTSVpFICE9IDMpICYmIChSR0JfUElYRUxTSVpFICE9IDQpKSkKKyAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9qcGVnL2pzaW1kX25lb24uaCBiL2pwZWcvanNpbWRfbmVvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDEzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2pzaW1kX25lb24uaApAQCAtMCwwICsxLDkwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEsICBOVklESUEgQ09SUE9SQVRJT04uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTlZJRElBIENPUlBPUkFUSU9OIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19KU0lNRF9ORU9OX0hfXworI2RlZmluZSBfX0pTSU1EX05FT05fSF9fCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKyNpZiAoZGVmaW5lZChOVl9BUk1fTkVPTikgJiYgZGVmaW5lZChfX0FSTV9IQVZFX05FT04pKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKQorCisjaWYgZGVmaW5lZChBTkRST0lEX0FSTVY2X0lEQ1QpCisjZXJyb3IgIkFORFJPSURfQVJNVjZfSURDVCBhbmQgKE5WX0FSTV9ORU9OIG9yIF9fYXJjaDY0KSBhcmUgbXV0dXJhbHkgZXhjbHVzaXZlIG1vZGVzLCBib3RoIGhhdmUgYmVlbiBkZWZpbmVkIgorI2VuZGlmCisKK0dMT0JBTCh2b2lkKQoranNpbWRfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpOworCitHTE9CQUwodm9pZCkKK2pzaW1kX2lkY3RfaXNsb3coal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCk7CisKK0dMT0JBTCh2b2lkKQoranNpbWRfaWRjdF9pZmFzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgIEpESU1FTlNJT04gb3V0cHV0X2NvbCk7CisKK0dMT0JBTCh2b2lkKQoranNpbWRfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wpOworCitHTE9CQUwoaW50KQorY2FwX25lb25faWRjdF8yeDIgKHZvaWQpOworCitHTE9CQUwoaW50KQorY2FwX25lb25faWRjdF80eDQgKHZvaWQpOworCitHTE9CQUwoaW50KQorY2FwX25lb25faWRjdF9pc2xvdyAodm9pZCk7CisKK0dMT0JBTChpbnQpCitjYXBfbmVvbl9pZGN0X2lmYXN0ICh2b2lkKTsKKworR0xPQkFMKGludCkKK2NhcF9uZW9uX3ljY19yZ2IgKHZvaWQpOworCitHTE9CQUwodm9pZCkKK2pzaW1kX3ljY19yZ2I1NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cyk7CisKK0dMT0JBTCh2b2lkKQoranNpbWRfeWNjX3JnYl9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKTsKKworR0xPQkFMKHZvaWQpCitqc2ltZF95Y2NfcmdiYTg4ODhfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cyk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9qcGVnL2p1dGlscy5jIGIvanBlZy9qdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZhZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9qdXRpbHMuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIGp1dGlscy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGFibGVzIGFuZCBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgcm91dGluZXMgbmVlZGVkCisgKiBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKyAqIE5vdGUgd2UgcHJlZml4IGFsbCBnbG9iYWwgbmFtZXMgd2l0aCAiaiIgdG8gbWluaW1pemUgY29uZmxpY3RzIHdpdGgKKyAqIGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBqcGVnX3ppZ3phZ19vcmRlcltpXSBpcyB0aGUgemlnemFnLW9yZGVyIHBvc2l0aW9uIG9mIHRoZSBpJ3RoIGVsZW1lbnQKKyAqIG9mIGEgRENUIGJsb2NrIHJlYWQgaW4gbmF0dXJhbCBvcmRlciAobGVmdCB0byByaWdodCwgdG9wIHRvIGJvdHRvbSkuCisgKi8KKworI2lmIDAJCQkJLyogVGhpcyB0YWJsZSBpcyBub3QgYWN0dWFsbHkgbmVlZGVkIGluIHY2YSAqLworCitjb25zdCBpbnQganBlZ196aWd6YWdfb3JkZXJbRENUU0laRTJdID0geworICAgMCwgIDEsICA1LCAgNiwgMTQsIDE1LCAyNywgMjgsCisgICAyLCAgNCwgIDcsIDEzLCAxNiwgMjYsIDI5LCA0MiwKKyAgIDMsICA4LCAxMiwgMTcsIDI1LCAzMCwgNDEsIDQzLAorICAgOSwgMTEsIDE4LCAyNCwgMzEsIDQwLCA0NCwgNTMsCisgIDEwLCAxOSwgMjMsIDMyLCAzOSwgNDUsIDUyLCA1NCwKKyAgMjAsIDIyLCAzMywgMzgsIDQ2LCA1MSwgNTUsIDYwLAorICAyMSwgMzQsIDM3LCA0NywgNTAsIDU2LCA1OSwgNjEsCisgIDM1LCAzNiwgNDgsIDQ5LCA1NywgNTgsIDYyLCA2MworfTsKKworI2VuZGlmCisKKy8qCisgKiBqcGVnX25hdHVyYWxfb3JkZXJbaV0gaXMgdGhlIG5hdHVyYWwtb3JkZXIgcG9zaXRpb24gb2YgdGhlIGkndGggZWxlbWVudAorICogb2YgemlnemFnIG9yZGVyLgorICoKKyAqIFdoZW4gcmVhZGluZyBjb3JydXB0ZWQgZGF0YSwgdGhlIEh1ZmZtYW4gZGVjb2RlcnMgY291bGQgYXR0ZW1wdAorICogdG8gcmVmZXJlbmNlIGFuIGVudHJ5IGJleW9uZCB0aGUgZW5kIG9mIHRoaXMgYXJyYXkgKGlmIHRoZSBkZWNvZGVkCisgKiB6ZXJvIHJ1biBsZW5ndGggcmVhY2hlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJsb2NrKS4gIFRvIHByZXZlbnQKKyAqIHdpbGQgc3RvcmVzIHdpdGhvdXQgYWRkaW5nIGFuIGlubmVyLWxvb3AgdGVzdCwgd2UgcHV0IHNvbWUgZXh0cmEKKyAqICI2MyJzIGFmdGVyIHRoZSByZWFsIGVudHJpZXMuICBUaGlzIHdpbGwgY2F1c2UgdGhlIGV4dHJhIGNvZWZmaWNpZW50CisgKiB0byBiZSBzdG9yZWQgaW4gbG9jYXRpb24gNjMgb2YgdGhlIGJsb2NrLCBub3Qgc29tZXdoZXJlIHJhbmRvbS4KKyAqIFRoZSB3b3JzdCBjYXNlIHdvdWxkIGJlIGEgcnVuLWxlbmd0aCBvZiAxNSwgd2hpY2ggbWVhbnMgd2UgbmVlZCAxNgorICogZmFrZSBlbnRyaWVzLgorICovCisKK2NvbnN0IGludCBqcGVnX25hdHVyYWxfb3JkZXJbRENUU0laRTIrMTZdID0geworICAwLCAgMSwgIDgsIDE2LCAgOSwgIDIsICAzLCAxMCwKKyAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCisgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwKKyAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCisgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAorIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKKyA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMsCisgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCAvKiBleHRyYSBlbnRyaWVzIGZvciBzYWZldHkgaW4gZGVjb2RlciAqLworIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MworfTsKKworCisvKgorICogQXJpdGhtZXRpYyB1dGlsaXRpZXMKKyAqLworCitHTE9CQUwobG9uZykKK2pkaXZfcm91bmRfdXAgKGxvbmcgYSwgbG9uZyBiKQorLyogQ29tcHV0ZSBhL2Igcm91bmRlZCB1cCB0byBuZXh0IGludGVnZXIsIGllLCBjZWlsKGEvYikgKi8KKy8qIEFzc3VtZXMgYSA+PSAwLCBiID4gMCAqLworeworICByZXR1cm4gKGEgKyBiIC0gMUwpIC8gYjsKK30KKworCitHTE9CQUwobG9uZykKK2pyb3VuZF91cCAobG9uZyBhLCBsb25nIGIpCisvKiBDb21wdXRlIGEgcm91bmRlZCB1cCB0byBuZXh0IG11bHRpcGxlIG9mIGIsIGllLCBjZWlsKGEvYikqYiAqLworLyogQXNzdW1lcyBhID49IDAsIGIgPiAwICovCit7CisgIGEgKz0gYiAtIDFMOworICByZXR1cm4gYSAtIChhICUgYik7Cit9CisKK0dMT0JBTChsb25nKQoram1pbiAobG9uZyBhLCBsb25nIGIpCit7CisgIHJldHVybiBhIDwgYiA/IGEgOiBiOworfQorCisKKy8qIE9uIG5vcm1hbCBtYWNoaW5lcyB3ZSBjYW4gYXBwbHkgTUVNQ09QWSgpIGFuZCBNRU1aRVJPKCkgdG8gc2FtcGxlIGFycmF5cworICogYW5kIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4gIFRoaXMgd29uJ3Qgd29yayBvbiA4MHg4NiBiZWNhdXNlIHRoZSBhcnJheXMKKyAqIGFyZSBGQVIgYW5kIHdlJ3JlIGFzc3VtaW5nIGEgc21hbGwtcG9pbnRlciBtZW1vcnkgbW9kZWwuICBIb3dldmVyLCBzb21lCisgKiBET1MgY29tcGlsZXJzIHByb3ZpZGUgZmFyLXBvaW50ZXIgdmVyc2lvbnMgb2YgbWVtY3B5KCkgYW5kIG1lbXNldCgpIGV2ZW4KKyAqIGluIHRoZSBzbWFsbC1tb2RlbCBsaWJyYXJpZXMuICBUaGVzZSB3aWxsIGJlIHVzZWQgaWYgVVNFX0ZNRU0gaXMgZGVmaW5lZC4KKyAqIE90aGVyd2lzZSwgdGhlIHJvdXRpbmVzIGJlbG93IGRvIGl0IHRoZSBoYXJkIHdheS4gIChUaGUgcGVyZm9ybWFuY2UgY29zdAorICogaXMgbm90IGFsbCB0aGF0IGdyZWF0LCBiZWNhdXNlIHRoZXNlIHJvdXRpbmVzIGFyZW4ndCB2ZXJ5IGhlYXZpbHkgdXNlZC4pCisgKi8KKworI2lmbmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBub3JtYWwgY2FzZSwgc2FtZSBhcyByZWd1bGFyIG1hY3JvcyAqLworI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCisjZGVmaW5lIEZNRU1aRVJPKHRhcmdldCxzaXplKQlNRU1aRVJPKHRhcmdldCxzaXplKQorI2Vsc2UJCQkJLyogODB4ODYgY2FzZSwgZGVmaW5lIGlmIHdlIGNhbiAqLworI2lmZGVmIFVTRV9GTUVNCisjZGVmaW5lIEZNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCV9mbWVtY3B5KCh2b2lkIEZBUiAqKShkZXN0KSwgKGNvbnN0IHZvaWQgRkFSICopKHNyYyksIChzaXplX3QpKHNpemUpKQorI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJX2ZtZW1zZXQoKHZvaWQgRkFSICopKHRhcmdldCksIDAsIChzaXplX3QpKHNpemUpKQorI2VuZGlmCisjZW5kaWYKKworCitHTE9CQUwodm9pZCkKK2pjb3B5X3NhbXBsZV9yb3dzIChKU0FNUEFSUkFZIGlucHV0X2FycmF5LCBpbnQgc291cmNlX3JvdywKKwkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYXJyYXksIGludCBkZXN0X3JvdywKKwkJICAgaW50IG51bV9yb3dzLCBKRElNRU5TSU9OIG51bV9jb2xzKQorLyogQ29weSBzb21lIHJvd3Mgb2Ygc2FtcGxlcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLgorICogbnVtX3Jvd3Mgcm93cyBhcmUgY29waWVkIGZyb20gaW5wdXRfYXJyYXlbc291cmNlX3JvdysrXQorICogdG8gb3V0cHV0X2FycmF5W2Rlc3Rfcm93KytdOyB0aGVzZSBhcmVhcyBtYXkgb3ZlcmxhcCBmb3IgZHVwbGljYXRpb24uCisgKiBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcnJheXMgbXVzdCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIG51bV9jb2xzLgorICovCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisjaWZkZWYgRk1FTUNPUFkKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gKHNpemVfdCkgKG51bV9jb2xzICogU0laRU9GKEpTQU1QTEUpKTsKKyNlbHNlCisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7CisjZW5kaWYKKyAgcmVnaXN0ZXIgaW50IHJvdzsKKworICBpbnB1dF9hcnJheSArPSBzb3VyY2Vfcm93OworICBvdXRwdXRfYXJyYXkgKz0gZGVzdF9yb3c7CisKKyAgZm9yIChyb3cgPSBudW1fcm93czsgcm93ID4gMDsgcm93LS0pIHsKKyAgICBpbnB0ciA9ICppbnB1dF9hcnJheSsrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYXJyYXkrKzsKKyNpZmRlZiBGTUVNQ09QWQorICAgIEZNRU1DT1BZKG91dHB0ciwgaW5wdHIsIGNvdW50KTsKKyNlbHNlCisgICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIrKzsJLyogbmVlZG4ndCBib3RoZXIgd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLworI2VuZGlmCisgIH0KK30KKworCitHTE9CQUwodm9pZCkKK2pjb3B5X2Jsb2NrX3JvdyAoSkJMT0NLUk9XIGlucHV0X3JvdywgSkJMT0NLUk9XIG91dHB1dF9yb3csCisJCSBKRElNRU5TSU9OIG51bV9ibG9ja3MpCisvKiBDb3B5IGEgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLiAqLworeworI2lmZGVmIEZNRU1DT1BZCisgIEZNRU1DT1BZKG91dHB1dF9yb3csIGlucHV0X3JvdywgbnVtX2Jsb2NrcyAqIChEQ1RTSVpFMiAqIFNJWkVPRihKQ09FRikpKTsKKyNlbHNlCisgIHJlZ2lzdGVyIEpDT0VGUFRSIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIGxvbmcgY291bnQ7CisKKyAgaW5wdHIgPSAoSkNPRUZQVFIpIGlucHV0X3JvdzsKKyAgb3V0cHRyID0gKEpDT0VGUFRSKSBvdXRwdXRfcm93OworICBmb3IgKGNvdW50ID0gKGxvbmcpIG51bV9ibG9ja3MgKiBEQ1RTSVpFMjsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgKm91dHB0cisrID0gKmlucHRyKys7CisgIH0KKyNlbmRpZgorfQorCisKK0dMT0JBTCh2b2lkKQoranplcm9fZmFyICh2b2lkIEZBUiAqIHRhcmdldCwgc2l6ZV90IGJ5dGVzdG96ZXJvKQorLyogWmVybyBvdXQgYSBjaHVuayBvZiBGQVIgbWVtb3J5LiAqLworLyogVGhpcyBtaWdodCBiZSBzYW1wbGUtYXJyYXkgZGF0YSwgYmxvY2stYXJyYXkgZGF0YSwgb3IgYWxsb2NfbGFyZ2UgZGF0YS4gKi8KK3sKKyNpZmRlZiBGTUVNWkVSTworICBGTUVNWkVSTyh0YXJnZXQsIGJ5dGVzdG96ZXJvKTsKKyNlbHNlCisgIHJlZ2lzdGVyIGNoYXIgRkFSICogcHRyID0gKGNoYXIgRkFSICopIHRhcmdldDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OworCisgIGZvciAoY291bnQgPSBieXRlc3RvemVybzsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgKnB0cisrID0gMDsKKyAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9qcGVnL2p2ZXJzaW9uLmggYi9qcGVnL2p2ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3MmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvanZlcnNpb24uaApAQCAtMCwwICsxLDE0IEBACisvKgorICoganZlcnNpb24uaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHNvZnR3YXJlIHZlcnNpb24gaWRlbnRpZmljYXRpb24uCisgKi8KKworCisjZGVmaW5lIEpWRVJTSU9OCSI2YiAgMjctTWFyLTE5OTgiCisKKyNkZWZpbmUgSkNPUFlSSUdIVAkiQ29weXJpZ2h0IChDKSAxOTk4LCBUaG9tYXMgRy4gTGFuZSIKZGlmZiAtLWdpdCBhL2pwZWcvbGlianBlZy5kb2MgYi9qcGVnL2xpYmpwZWcuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWIyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL2xpYmpwZWcuZG9jCkBAIC0wLDAgKzEsMzAwNiBAQAorVVNJTkcgVEhFIElKRyBKUEVHIExJQlJBUlkKKworQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KK0ZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKworCitUaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIElKRyBKUEVHIGxpYnJhcnkgd2l0aGluIGFuIGFwcGxpY2F0aW9uCitwcm9ncmFtLiAgUmVhZCBpdCBpZiB5b3Ugd2FudCB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBsaWJyYXJ5LgorCitUaGUgZmlsZSBleGFtcGxlLmMgcHJvdmlkZXMgaGVhdmlseSBjb21tZW50ZWQgc2tlbGV0b24gY29kZSBmb3IgY2FsbGluZyB0aGUKK0pQRUcgbGlicmFyeS4gIEFsc28gc2VlIGpwZWdsaWIuaCAodGhlIGluY2x1ZGUgZmlsZSB0byBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uCitwcm9ncmFtcykgZm9yIGZ1bGwgZGV0YWlscyBhYm91dCBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0cy4KK1RoZSBsaWJyYXJ5IHNvdXJjZSBjb2RlLCBvZiBjb3Vyc2UsIGlzIHRoZSB1bHRpbWF0ZSByZWZlcmVuY2UuCisKK05vdGUgdGhhdCB0aGVyZSBoYXZlIGJlZW4gKm1ham9yKiBjaGFuZ2VzIGZyb20gdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZQorcHJlc2VudGVkIGJ5IElKRyB2ZXJzaW9uIDQgYW5kIGVhcmxpZXIgdmVyc2lvbnMuICBUaGUgb2xkIGRlc2lnbiBoYWQgc2V2ZXJhbAoraW5oZXJlbnQgbGltaXRhdGlvbnMsIGFuZCBpdCBoYWQgYWNjdW11bGF0ZWQgYSBsb3Qgb2YgY3J1ZnQgYXMgd2UgYWRkZWQKK2ZlYXR1cmVzIHdoaWxlIHRyeWluZyB0byBtaW5pbWl6ZSBhcHBsaWNhdGlvbi1pbnRlcmZhY2UgY2hhbmdlcy4gIFdlIGhhdmUKK3NhY3JpZmljZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpbiB0aGUgdmVyc2lvbiA1IHJld3JpdGUsIGJ1dCB3ZSB0aGluayB0aGUKK2ltcHJvdmVtZW50cyBqdXN0aWZ5IHRoaXMuCisKKworVEFCTEUgT0YgQ09OVEVOVFMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK092ZXJ2aWV3OgorCUZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgbGlicmFyeQorCU91dGxpbmUgb2YgdHlwaWNhbCB1c2FnZQorQmFzaWMgbGlicmFyeSB1c2FnZToKKwlEYXRhIGZvcm1hdHMKKwlDb21wcmVzc2lvbiBkZXRhaWxzCisJRGVjb21wcmVzc2lvbiBkZXRhaWxzCisJTWVjaGFuaWNzIG9mIHVzYWdlOiBpbmNsdWRlIGZpbGVzLCBsaW5raW5nLCBldGMKK0FkdmFuY2VkIGZlYXR1cmVzOgorCUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KKwlEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KKwlTcGVjaWFsIGNvbG9yIHNwYWNlcworCUVycm9yIGhhbmRsaW5nCisJQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIChzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzKQorCUkvTyBzdXNwZW5zaW9uCisJUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0CisJQnVmZmVyZWQtaW1hZ2UgbW9kZQorCUFiYnJldmlhdGVkIGRhdGFzdHJlYW1zIGFuZCBtdWx0aXBsZSBpbWFnZXMKKwlTcGVjaWFsIG1hcmtlcnMKKwlSYXcgKGRvd25zYW1wbGVkKSBpbWFnZSBkYXRhCisJUmVhbGx5IHJhdyBkYXRhOiBEQ1QgY29lZmZpY2llbnRzCisJUHJvZ3Jlc3MgbW9uaXRvcmluZworCU1lbW9yeSBtYW5hZ2VtZW50CisJTWVtb3J5IHVzYWdlCisJTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucworCVBvcnRhYmlsaXR5IGNvbnNpZGVyYXRpb25zCisJTm90ZXMgZm9yIE1TLURPUyBpbXBsZW1lbnRvcnMKKworWW91IHNob3VsZCByZWFkIGF0IGxlYXN0IHRoZSBvdmVydmlldyBhbmQgYmFzaWMgdXNhZ2Ugc2VjdGlvbnMgYmVmb3JlIHRyeWluZwordG8gcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LiAgVGhlIHNlY3Rpb25zIG9uIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZSByZWFkCitpZiBhbmQgd2hlbiB5b3UgbmVlZCB0aGVtLgorCisKK09WRVJWSUVXCis9PT09PT09PQorCitGdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgSUpHIEpQRUcgbGlicmFyeSBwcm92aWRlcyBDIGNvZGUgdG8gcmVhZCBhbmQgd3JpdGUgSlBFRy1jb21wcmVzc2VkIGltYWdlCitmaWxlcy4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBwcm9ncmFtIHJlY2VpdmVzIG9yIHN1cHBsaWVzIGltYWdlIGRhdGEgYQorc2NhbmxpbmUgYXQgYSB0aW1lLCB1c2luZyBhIHN0cmFpZ2h0Zm9yd2FyZCB1bmNvbXByZXNzZWQgaW1hZ2UgZm9ybWF0LiAgQWxsCitkZXRhaWxzIG9mIGNvbG9yIGNvbnZlcnNpb24gYW5kIG90aGVyIHByZXByb2Nlc3NpbmcvcG9zdHByb2Nlc3NpbmcgY2FuIGJlCitoYW5kbGVkIGJ5IHRoZSBsaWJyYXJ5LgorCitUaGUgbGlicmFyeSBpbmNsdWRlcyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBjb2RlIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgdGhlCitKUEVHIHN0YW5kYXJkIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIHR5cGljYWwgYXBwbGljYXRpb25zIG9mIEpQRUcuICBUaGVzZQorZnVuY3Rpb25zIHByZXByb2Nlc3MgdGhlIGltYWdlIGJlZm9yZSBKUEVHIGNvbXByZXNzaW9uIG9yIHBvc3Rwcm9jZXNzIGl0IGFmdGVyCitkZWNvbXByZXNzaW9uLiAgVGhleSBpbmNsdWRlIGNvbG9yc3BhY2UgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nL3Vwc2FtcGxpbmcsCithbmQgY29sb3IgcXVhbnRpemF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGluZGlyZWN0bHkgc2VsZWN0cyB1c2Ugb2YgdGhpcyBjb2RlCitieSBzcGVjaWZ5aW5nIHRoZSBmb3JtYXQgaW4gd2hpY2ggaXQgd2lzaGVzIHRvIHN1cHBseSBvciByZWNlaXZlIGltYWdlIGRhdGEuCitGb3IgZXhhbXBsZSwgaWYgY29sb3JtYXBwZWQgb3V0cHV0IGlzIHJlcXVlc3RlZCwgdGhlbiB0aGUgZGVjb21wcmVzc2lvbgorbGlicmFyeSBhdXRvbWF0aWNhbGx5IGludm9rZXMgY29sb3IgcXVhbnRpemF0aW9uLgorCitBIHdpZGUgcmFuZ2Ugb2YgcXVhbGl0eSB2cy4gc3BlZWQgdHJhZGVvZmZzIGFyZSBwb3NzaWJsZSBpbiBKUEVHIHByb2Nlc3NpbmcsCithbmQgZXZlbiBtb3JlIHNvIGluIGRlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5Citwcm92aWRlcyBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjb3ZlciBtb3N0IG9mIHRoZSB1c2VmdWwgdHJhZGVvZmZzLAorcmFuZ2luZyBmcm9tIHZlcnktaGlnaC1xdWFsaXR5IGRvd24gdG8gZmFzdC1wcmV2aWV3IG9wZXJhdGlvbi4gIE9uIHRoZQorY29tcHJlc3Npb24gc2lkZSB3ZSBoYXZlIGdlbmVyYWxseSBub3QgcHJvdmlkZWQgbG93LXF1YWxpdHkgY2hvaWNlcywgc2luY2UKK2NvbXByZXNzaW9uIGlzIG5vcm1hbGx5IGxlc3MgdGltZS1jcml0aWNhbC4gIEl0IHNob3VsZCBiZSB1bmRlcnN0b29kIHRoYXQgdGhlCitsb3ctcXVhbGl0eSBtb2RlcyBtYXkgbm90IG1lZXQgdGhlIEpQRUcgc3RhbmRhcmQncyBhY2N1cmFjeSByZXF1aXJlbWVudHM7Citub25ldGhlbGVzcywgdGhleSBhcmUgdXNlZnVsIGZvciB2aWV3ZXJzLgorCitBIHdvcmQgYWJvdXQgZnVuY3Rpb25zICpub3QqIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5LiAgV2UgaGFuZGxlIGEgc3Vic2V0IG9mCit0aGUgSVNPIEpQRUcgc3RhbmRhcmQ7IG1vc3QgYmFzZWxpbmUsIGV4dGVuZGVkLXNlcXVlbnRpYWwsIGFuZCBwcm9ncmVzc2l2ZQorSlBFRyBwcm9jZXNzZXMgYXJlIHN1cHBvcnRlZC4gIChPdXIgc3Vic2V0IGluY2x1ZGVzIGFsbCBmZWF0dXJlcyBub3cgaW4gY29tbW9uCit1c2UuKSAgVW5zdXBwb3J0ZWQgSVNPIG9wdGlvbnMgaW5jbHVkZToKKwkqIEhpZXJhcmNoaWNhbCBzdG9yYWdlCisJKiBMb3NzbGVzcyBKUEVHCisJKiBBcml0aG1ldGljIGVudHJvcHkgY29kaW5nICh1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucykKKwkqIEROTCBtYXJrZXIKKwkqIE5vbmludGVncmFsIHN1YnNhbXBsaW5nIHJhdGlvcworV2Ugc3VwcG9ydCBib3RoIDgtIGFuZCAxMi1iaXQgZGF0YSBwcmVjaXNpb24sIGJ1dCB0aGlzIGlzIGEgY29tcGlsZS10aW1lCitjaG9pY2UgcmF0aGVyIHRoYW4gYSBydW4tdGltZSBjaG9pY2U7IGhlbmNlIGl0IGlzIGRpZmZpY3VsdCB0byB1c2UgYm90aAorcHJlY2lzaW9ucyBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbi4KKworQnkgaXRzZWxmLCB0aGUgbGlicmFyeSBoYW5kbGVzIG9ubHkgaW50ZXJjaGFuZ2UgSlBFRyBkYXRhc3RyZWFtcyAtLS0gaW4KK3BhcnRpY3VsYXIgdGhlIHdpZGVseSB1c2VkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGUgbGlicmFyeSBjYW4gYmUgdXNlZCBieQorc3Vycm91bmRpbmcgY29kZSB0byBwcm9jZXNzIGludGVyY2hhbmdlIG9yIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMgdGhhdAorYXJlIGVtYmVkZGVkIGluIG1vcmUgY29tcGxleCBmaWxlIGZvcm1hdHMuICAoRm9yIGV4YW1wbGUsIHRoaXMgbGlicmFyeSBpcwordXNlZCBieSB0aGUgZnJlZSBMSUJUSUZGIGxpYnJhcnkgdG8gc3VwcG9ydCBKUEVHIGNvbXByZXNzaW9uIGluIFRJRkYuKQorCisKK091dGxpbmUgb2YgdHlwaWNhbCB1c2FnZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSByb3VnaCBvdXRsaW5lIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvcGVyYXRpb24gaXM6CisKKwlBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0CisJU3BlY2lmeSB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpCisJU2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uLCBpbmNsdWRpbmcgaW1hZ2Ugc2l6ZSAmIGNvbG9yc3BhY2UKKwlqcGVnX3N0YXJ0X2NvbXByZXNzKC4uLik7CisJd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHdyaXR0ZW4pCisJCWpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7CisJanBlZ19maW5pc2hfY29tcHJlc3MoLi4uKTsKKwlSZWxlYXNlIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAorCitBIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGhvbGRzIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgc3RhdGUgZm9yIHRoZSBKUEVHCitsaWJyYXJ5LiAgV2UgbWFrZSBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiB0aGUgb2JqZWN0IHNlcGFyYXRlIGZyb20gc3RhcnRpbmcKK29yIGZpbmlzaGluZyBjb21wcmVzc2lvbiBvZiBhbiBpbWFnZTsgdGhlIHNhbWUgb2JqZWN0IGNhbiBiZSByZS11c2VkIGZvciBhCitzZXJpZXMgb2YgaW1hZ2UgY29tcHJlc3Npb24gb3BlcmF0aW9ucy4gIFRoaXMgbWFrZXMgaXQgZWFzeSB0byByZS11c2UgdGhlCitzYW1lIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgYSBzZXF1ZW5jZSBvZiBpbWFnZXMuICBSZS11c2Ugb2YgYSBKUEVHIG9iamVjdAorYWxzbyBoYXMgaW1wb3J0YW50IGltcGxpY2F0aW9ucyBmb3IgcHJvY2Vzc2luZyBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLAorYXMgZGlzY3Vzc2VkIGxhdGVyLgorCitUaGUgaW1hZ2UgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHN1cHBsaWVkIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgZnJvbQoraW4tbWVtb3J5IGJ1ZmZlcnMuICBJZiB0aGUgYXBwbGljYXRpb24gaXMgZG9pbmcgZmlsZS10by1maWxlIGNvbXByZXNzaW9uLAorcmVhZGluZyBpbWFnZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBmaWxlIGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5LgorVGhlIGxpYnJhcnkgZW1pdHMgY29tcHJlc3NlZCBkYXRhIGJ5IGNhbGxpbmcgYSAiZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIiwKK3doaWNoIHR5cGljYWxseSB3aWxsIHdyaXRlIHRoZSBkYXRhIGludG8gYSBmaWxlOyBidXQgdGhlIGFwcGxpY2F0aW9uIGNhbgorcHJvdmlkZSBpdHMgb3duIGRlc3RpbmF0aW9uIG1hbmFnZXIgdG8gZG8gc29tZXRoaW5nIGVsc2UuCisKK1NpbWlsYXJseSwgdGhlIHJvdWdoIG91dGxpbmUgb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uIGlzOgorCisJQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0CisJU3BlY2lmeSB0aGUgc291cmNlIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpCisJQ2FsbCBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gb2J0YWluIGltYWdlIGluZm8KKwlTZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbgorCWpwZWdfc3RhcnRfZGVjb21wcmVzcyguLi4pOworCXdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKQorCQlqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7CisJanBlZ19maW5pc2hfZGVjb21wcmVzcyguLi4pOworCVJlbGVhc2UgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKKworVGhpcyBpcyBjb21wYXJhYmxlIHRvIHRoZSBjb21wcmVzc2lvbiBvdXRsaW5lIGV4Y2VwdCB0aGF0IHJlYWRpbmcgdGhlCitkYXRhc3RyZWFtIGhlYWRlciBpcyBhIHNlcGFyYXRlIHN0ZXAuICBUaGlzIGlzIGhlbHBmdWwgYmVjYXVzZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIGltYWdlJ3Mgc2l6ZSwgY29sb3JzcGFjZSwgZXRjIGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBhcHBsaWNhdGlvbgorc2VsZWN0cyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZSwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjaG9vc2UgYW4KK291dHB1dCBzY2FsaW5nIHJhdGlvIHRoYXQgd2lsbCBmaXQgdGhlIGltYWdlIGludG8gdGhlIGF2YWlsYWJsZSBzY3JlZW4gc2l6ZS4KKworVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYnRhaW5zIGNvbXByZXNzZWQgZGF0YSBieSBjYWxsaW5nIGEgZGF0YSBzb3VyY2UKK21hbmFnZXIsIHdoaWNoIHR5cGljYWxseSB3aWxsIHJlYWQgdGhlIGRhdGEgZnJvbSBhIGZpbGU7IGJ1dCBvdGhlciBiZWhhdmlvcnMKK2NhbiBiZSBvYnRhaW5lZCB3aXRoIGEgY3VzdG9tIHNvdXJjZSBtYW5hZ2VyLiAgRGVjb21wcmVzc2VkIGRhdGEgaXMgZGVsaXZlcmVkCitpbnRvIGluLW1lbW9yeSBidWZmZXJzIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuCisKK0l0IGlzIHBvc3NpYmxlIHRvIGFib3J0IGFuIGluY29tcGxldGUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24KK2J5IGNhbGxpbmcganBlZ19hYm9ydCgpOyBvciwgaWYgeW91IGRvIG5vdCBuZWVkIHRvIHJldGFpbiB0aGUgSlBFRyBvYmplY3QsCitzaW1wbHkgcmVsZWFzZSBpdCBieSBjYWxsaW5nIGpwZWdfZGVzdHJveSgpLgorCitKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9iamVjdHMgYXJlIHR3byBzZXBhcmF0ZSBzdHJ1Y3QgdHlwZXMuCitIb3dldmVyLCB0aGV5IHNoYXJlIHNvbWUgY29tbW9uIGZpZWxkcywgYW5kIGNlcnRhaW4gcm91dGluZXMgc3VjaCBhcworanBlZ19kZXN0cm95KCkgY2FuIHdvcmsgb24gZWl0aGVyIHR5cGUgb2Ygb2JqZWN0LgorCitUaGUgSlBFRyBsaWJyYXJ5IGhhcyBubyBzdGF0aWMgdmFyaWFibGVzOiBhbGwgc3RhdGUgaXMgaW4gdGhlIGNvbXByZXNzaW9uCitvciBkZWNvbXByZXNzaW9uIG9iamVjdC4gIFRoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byBwcm9jZXNzIG11bHRpcGxlCitjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zIGNvbmN1cnJlbnRseSwgdXNpbmcgbXVsdGlwbGUgSlBFRworb2JqZWN0cy4KKworQm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhbiBpbmNyZW1lbnRhbCBtZW1vcnktdG8tCittZW1vcnkgZmFzaGlvbiwgaWYgc3VpdGFibGUgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIGFyZSB1c2VkLiAgU2VlIHRoZQorc2VjdGlvbiBvbiAiSS9PIHN1c3BlbnNpb24iIGZvciBtb3JlIGRldGFpbHMuCisKKworQkFTSUMgTElCUkFSWSBVU0FHRQorPT09PT09PT09PT09PT09PT09PQorCitEYXRhIGZvcm1hdHMKKy0tLS0tLS0tLS0tLQorCitCZWZvcmUgZGl2aW5nIGludG8gcHJvY2VkdXJhbCBkZXRhaWxzLCBpdCBpcyBoZWxwZnVsIHRvIHVuZGVyc3RhbmQgdGhlCitpbWFnZSBkYXRhIGZvcm1hdCB0aGF0IHRoZSBKUEVHIGxpYnJhcnkgZXhwZWN0cyBvciByZXR1cm5zLgorCitUaGUgc3RhbmRhcmQgaW5wdXQgaW1hZ2UgZm9ybWF0IGlzIGEgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgcGl4ZWxzLCB3aXRoIGVhY2gKK3BpeGVsIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2YgImNvbXBvbmVudCIgb3IgInNhbXBsZSIgdmFsdWVzIChjb2xvcgorY2hhbm5lbHMpLiAgWW91IG11c3Qgc3BlY2lmeSBob3cgbWFueSBjb21wb25lbnRzIHRoZXJlIGFyZSBhbmQgdGhlIGNvbG9yc3BhY2UKK2ludGVycHJldGF0aW9uIG9mIHRoZSBjb21wb25lbnRzLiAgTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgUkdCIGRhdGEKKyh0aHJlZSBjb21wb25lbnRzIHBlciBwaXhlbCkgb3IgZ3JheXNjYWxlIGRhdGEgKG9uZSBjb21wb25lbnQgcGVyIHBpeGVsKS4KK1BMRUFTRSBOT1RFIFRIQVQgUkdCIERBVEEgSVMgVEhSRUUgU0FNUExFUyBQRVIgUElYRUwsIEdSQVlTQ0FMRSBPTkxZIE9ORS4KK0EgcmVtYXJrYWJsZSBudW1iZXIgb2YgcGVvcGxlIG1hbmFnZSB0byBtaXNzIHRoaXMsIG9ubHkgdG8gZmluZCB0aGF0IHRoZWlyCitwcm9ncmFtcyBkb24ndCB3b3JrIHdpdGggZ3JheXNjYWxlIEpQRUcgZmlsZXMuCisKK1RoZXJlIGlzIG5vIHByb3Zpc2lvbiBmb3IgY29sb3JtYXBwZWQgaW5wdXQuICBKUEVHIGZpbGVzIGFyZSBhbHdheXMgZnVsbC1jb2xvcgorb3IgZnVsbCBncmF5c2NhbGUgKG9yIHNvbWV0aW1lcyBhbm90aGVyIGNvbG9yc3BhY2Ugc3VjaCBhcyBDTVlLKS4gIFlvdSBjYW4KK2ZlZWQgaW4gYSBjb2xvcm1hcHBlZCBpbWFnZSBieSBleHBhbmRpbmcgaXQgdG8gZnVsbC1jb2xvciBmb3JtYXQuICBIb3dldmVyCitKUEVHIG9mdGVuIGRvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwgd2l0aCBzb3VyY2UgZGF0YSB0aGF0IGhhcyBiZWVuIGNvbG9ybWFwcGVkLAorYmVjYXVzZSBvZiBkaXRoZXJpbmcgbm9pc2UuICBUaGlzIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgSlBFRyBGQVEKK2FuZCB0aGUgb3RoZXIgcmVmZXJlbmNlcyBtZW50aW9uZWQgaW4gdGhlIFJFQURNRSBmaWxlLgorCitQaXhlbHMgYXJlIHN0b3JlZCBieSBzY2FubGluZXMsIHdpdGggZWFjaCBzY2FubGluZSBydW5uaW5nIGZyb20gbGVmdCB0bworcmlnaHQuICBUaGUgY29tcG9uZW50IHZhbHVlcyBmb3IgZWFjaCBwaXhlbCBhcmUgYWRqYWNlbnQgaW4gdGhlIHJvdzsgZm9yCitleGFtcGxlLCBSLEcsQixSLEcsQixSLEcsQiwuLi4gZm9yIDI0LWJpdCBSR0IgY29sb3IuICBFYWNoIHNjYW5saW5lIGlzIGFuCithcnJheSBvZiBkYXRhIHR5cGUgSlNBTVBMRSAtLS0gd2hpY2ggaXMgdHlwaWNhbGx5ICJ1bnNpZ25lZCBjaGFyIiwgdW5sZXNzCit5b3UndmUgY2hhbmdlZCBqbW9yZWNmZy5oLiAgKFlvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIFJHQiBwaXhlbCBsYXlvdXQsIHNheQordG8gQixHLFIgb3JkZXIsIGJ5IG1vZGlmeWluZyBqbW9yZWNmZy5oLiAgQnV0IHNlZSB0aGUgcmVzdHJpY3Rpb25zIGxpc3RlZCBpbgordGhhdCBmaWxlIGJlZm9yZSBkb2luZyBzby4pCisKK0EgMi1EIGFycmF5IG9mIHBpeGVscyBpcyBmb3JtZWQgYnkgbWFraW5nIGEgbGlzdCBvZiBwb2ludGVycyB0byB0aGUgc3RhcnRzIG9mCitzY2FubGluZXM7IHNvIHRoZSBzY2FubGluZXMgbmVlZCBub3QgYmUgcGh5c2ljYWxseSBhZGphY2VudCBpbiBtZW1vcnkuICBFdmVuCitpZiB5b3UgcHJvY2VzcyBqdXN0IG9uZSBzY2FubGluZSBhdCBhIHRpbWUsIHlvdSBtdXN0IG1ha2UgYSBvbmUtZWxlbWVudAorcG9pbnRlciBhcnJheSB0byBjb25mb3JtIHRvIHRoaXMgc3RydWN0dXJlLiAgUG9pbnRlcnMgdG8gSlNBTVBMRSByb3dzIGFyZSBvZgordHlwZSBKU0FNUFJPVywgYW5kIHRoZSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIGFycmF5IGlzIG9mIHR5cGUgSlNBTVBBUlJBWS4KKworVGhlIGxpYnJhcnkgYWNjZXB0cyBvciBzdXBwbGllcyBvbmUgb3IgbW9yZSBjb21wbGV0ZSBzY2FubGluZXMgcGVyIGNhbGwuCitJdCBpcyBub3QgcG9zc2libGUgdG8gcHJvY2VzcyBwYXJ0IG9mIGEgcm93IGF0IGEgdGltZS4gIFNjYW5saW5lcyBhcmUgYWx3YXlzCitwcm9jZXNzZWQgdG9wLXRvLWJvdHRvbS4gIFlvdSBjYW4gcHJvY2VzcyBhbiBlbnRpcmUgaW1hZ2UgaW4gb25lIGNhbGwgaWYgeW91CitoYXZlIGl0IGFsbCBpbiBtZW1vcnksIGJ1dCB1c3VhbGx5IGl0J3Mgc2ltcGxlc3QgdG8gcHJvY2VzcyBvbmUgc2NhbmxpbmUgYXQKK2EgdGltZS4KKworRm9yIGJlc3QgcmVzdWx0cywgc291cmNlIGRhdGEgdmFsdWVzIHNob3VsZCBoYXZlIHRoZSBwcmVjaXNpb24gc3BlY2lmaWVkIGJ5CitCSVRTX0lOX0pTQU1QTEUgKG5vcm1hbGx5IDggYml0cykuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBjaG9vc2UgdG8gY29tcHJlc3MKK2RhdGEgdGhhdCdzIG9ubHkgNiBiaXRzL2NoYW5uZWwsIHlvdSBzaG91bGQgbGVmdC1qdXN0aWZ5IGVhY2ggdmFsdWUgaW4gYQorYnl0ZSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgY29tcHJlc3Nvci4gIElmIHlvdSBuZWVkIHRvIGNvbXByZXNzIGRhdGEKK3RoYXQgaGFzIG1vcmUgdGhhbiA4IGJpdHMvY2hhbm5lbCwgY29tcGlsZSB3aXRoIEJJVFNfSU5fSlNBTVBMRSA9IDEyLgorKFNlZSAiTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucyIsIGxhdGVyLikKKworCitUaGUgZGF0YSBmb3JtYXQgcmV0dXJuZWQgYnkgdGhlIGRlY29tcHJlc3NvciBpcyB0aGUgc2FtZSBpbiBhbGwgZGV0YWlscywKK2V4Y2VwdCB0aGF0IGNvbG9ybWFwcGVkIG91dHB1dCBpcyBzdXBwb3J0ZWQuICAoQWdhaW4sIGEgSlBFRyBmaWxlIGlzIG5ldmVyCitjb2xvcm1hcHBlZC4gIEJ1dCB5b3UgY2FuIGFzayB0aGUgZGVjb21wcmVzc29yIHRvIHBlcmZvcm0gb24tdGhlLWZseSBjb2xvcgorcXVhbnRpemF0aW9uIHRvIGRlbGl2ZXIgY29sb3JtYXBwZWQgb3V0cHV0LikgIElmIHlvdSByZXF1ZXN0IGNvbG9ybWFwcGVkCitvdXRwdXQgdGhlbiB0aGUgcmV0dXJuZWQgZGF0YSBhcnJheSBjb250YWlucyBhIHNpbmdsZSBKU0FNUExFIHBlciBwaXhlbDsKK2l0cyB2YWx1ZSBpcyBhbiBpbmRleCBpbnRvIGEgY29sb3IgbWFwLiAgVGhlIGNvbG9yIG1hcCBpcyByZXByZXNlbnRlZCBhcworYSAyLUQgSlNBTVBBUlJBWSBpbiB3aGljaCBlYWNoIHJvdyBob2xkcyB0aGUgdmFsdWVzIG9mIG9uZSBjb2xvciBjb21wb25lbnQsCit0aGF0IGlzLCBjb2xvcm1hcFtpXVtqXSBpcyB0aGUgdmFsdWUgb2YgdGhlIGkndGggY29sb3IgY29tcG9uZW50IGZvciBwaXhlbAordmFsdWUgKG1hcCBpbmRleCkgai4gIE5vdGUgdGhhdCBzaW5jZSB0aGUgY29sb3JtYXAgaW5kZXhlcyBhcmUgc3RvcmVkIGluCitKU0FNUExFcywgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbG9ycyBpcyBsaW1pdGVkIGJ5IHRoZSBzaXplIG9mIEpTQU1QTEUKKyhpZSwgYXQgbW9zdCAyNTYgY29sb3JzIGZvciBhbiA4LWJpdCBKUEVHIGxpYnJhcnkpLgorCisKK0NvbXByZXNzaW9uIGRldGFpbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSB3ZSByZXZpc2l0IHRoZSBKUEVHIGNvbXByZXNzaW9uIG91dGxpbmUgZ2l2ZW4gaW4gdGhlIG92ZXJ2aWV3LgorCisxLiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LgorCitBIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGlzIGEgInN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCIuICAoSXQgYWxzbyBoYXMKK2EgYnVuY2ggb2Ygc3Vic2lkaWFyeSBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBhbGxvY2F0ZWQgdmlhIG1hbGxvYygpLCBidXQgdGhlCithcHBsaWNhdGlvbiBkb2Vzbid0IGNvbnRyb2wgdGhvc2UgZGlyZWN0bHkuKSAgVGhpcyBzdHJ1Y3QgY2FuIGJlIGp1c3QgYSBsb2NhbAordmFyaWFibGUgaW4gdGhlIGNhbGxpbmcgcm91dGluZSwgaWYgYSBzaW5nbGUgcm91dGluZSBpcyBnb2luZyB0byBleGVjdXRlIHRoZQord2hvbGUgSlBFRyBjb21wcmVzc2lvbiBzZXF1ZW5jZS4gIE90aGVyd2lzZSBpdCBjYW4gYmUgc3RhdGljIG9yIGFsbG9jYXRlZAorZnJvbSBtYWxsb2MoKS4KKworWW91IHdpbGwgYWxzbyBuZWVkIGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIEpQRUcgZXJyb3IgaGFuZGxlci4gIFRoZSBwYXJ0CitvZiB0aGlzIHRoYXQgdGhlIGxpYnJhcnkgY2FyZXMgYWJvdXQgaXMgYSAic3RydWN0IGpwZWdfZXJyb3JfbWdyIi4gIElmIHlvdQorYXJlIHByb3ZpZGluZyB5b3VyIG93biBlcnJvciBoYW5kbGVyLCB5b3UnbGwgdHlwaWNhbGx5IHdhbnQgdG8gZW1iZWQgdGhlCitqcGVnX2Vycm9yX21nciBzdHJ1Y3QgaW4gYSBsYXJnZXIgc3RydWN0dXJlOyB0aGlzIGlzIGRpc2N1c3NlZCBsYXRlciB1bmRlcgorIkVycm9yIGhhbmRsaW5nIi4gIEZvciBub3cgd2UnbGwgYXNzdW1lIHlvdSBhcmUganVzdCB1c2luZyB0aGUgZGVmYXVsdCBlcnJvcgoraGFuZGxlci4gIFRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgd2lsbCBwcmludCBKUEVHIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMKK29uIHN0ZGVyciwgYW5kIGl0IHdpbGwgY2FsbCBleGl0KCkgaWYgYSBmYXRhbCBlcnJvciBvY2N1cnMuCisKK1lvdSBtdXN0IGluaXRpYWxpemUgdGhlIGVycm9yIGhhbmRsZXIgc3RydWN0dXJlLCBzdG9yZSBhIHBvaW50ZXIgdG8gaXQgaW50bwordGhlIEpQRUcgb2JqZWN0J3MgImVyciIgZmllbGQsIGFuZCB0aGVuIGNhbGwganBlZ19jcmVhdGVfY29tcHJlc3MoKSB0bworaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgSlBFRyBvYmplY3QuCisKK1R5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwLCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIsIGlzCisKKwlzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87CisJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisJLi4uCisJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworCWpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7CisKK2pwZWdfY3JlYXRlX2NvbXByZXNzIGFsbG9jYXRlcyBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnksIHNvIGl0IGNvdWxkIGZhaWwKK2lmIHlvdSBhcmUgb3V0IG9mIG1lbW9yeS4gIEluIHRoYXQgY2FzZSBpdCB3aWxsIGV4aXQgdmlhIHRoZSBlcnJvciBoYW5kbGVyOwordGhhdCdzIHdoeSB0aGUgZXJyb3IgaGFuZGxlciBtdXN0IGJlIGluaXRpYWxpemVkIGZpcnN0LgorCisKKzIuIFNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKS4KKworQXMgcHJldmlvdXNseSBtZW50aW9uZWQsIHRoZSBKUEVHIGxpYnJhcnkgZGVsaXZlcnMgY29tcHJlc3NlZCBkYXRhIHRvIGEKKyJkYXRhIGRlc3RpbmF0aW9uIiBtb2R1bGUuICBUaGUgbGlicmFyeSBpbmNsdWRlcyBvbmUgZGF0YSBkZXN0aW5hdGlvbgorbW9kdWxlIHdoaWNoIGtub3dzIGhvdyB0byB3cml0ZSB0byBhIHN0ZGlvIHN0cmVhbS4gIFlvdSBjYW4gdXNlIHlvdXIgb3duCitkZXN0aW5hdGlvbiBtb2R1bGUgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIGVsc2UsIGFzIGRpc2N1c3NlZCBsYXRlci4KKworSWYgeW91IHVzZSB0aGUgc3RhbmRhcmQgZGVzdGluYXRpb24gbW9kdWxlLCB5b3UgbXVzdCBvcGVuIHRoZSB0YXJnZXQgc3RkaW8KK3N0cmVhbSBiZWZvcmVoYW5kLiAgVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAgbG9va3MgbGlrZToKKworCUZJTEUgKiBvdXRmaWxlOworCS4uLgorCWlmICgob3V0ZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKSkgPT0gTlVMTCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKwkgICAgZXhpdCgxKTsKKwl9CisJanBlZ19zdGRpb19kZXN0KCZjaW5mbywgb3V0ZmlsZSk7CisKK3doZXJlIHRoZSBsYXN0IGxpbmUgaW52b2tlcyB0aGUgc3RhbmRhcmQgZGVzdGluYXRpb24gbW9kdWxlLgorCitXQVJOSU5HOiBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBiaW5hcnkgY29tcHJlc3NlZCBkYXRhIGJlIGRlbGl2ZXJlZCB0byB0aGUKK291dHB1dCBmaWxlIHVuY2hhbmdlZC4gIE9uIG5vbi1Vbml4IHN5c3RlbXMgdGhlIHN0ZGlvIGxpYnJhcnkgbWF5IHBlcmZvcm0KK25ld2xpbmUgdHJhbnNsYXRpb24gb3Igb3RoZXJ3aXNlIGNvcnJ1cHQgYmluYXJ5IGRhdGEuICBUbyBzdXBwcmVzcyB0aGlzCitiZWhhdmlvciwgeW91IG1heSBuZWVkIHRvIHVzZSBhICJiIiBvcHRpb24gdG8gZm9wZW4gKGFzIHNob3duIGFib3ZlKSwgb3IgdXNlCitzZXRtb2RlKCkgb3IgYW5vdGhlciByb3V0aW5lIHRvIHB1dCB0aGUgc3RkaW8gc3RyZWFtIGluIGJpbmFyeSBtb2RlLiAgU2VlCitjanBlZy5jIGFuZCBkanBlZy5jIGZvciBjb2RlIHRoYXQgaGFzIGJlZW4gZm91bmQgdG8gd29yayBvbiBtYW55IHN5c3RlbXMuCisKK1lvdSBjYW4gc2VsZWN0IHRoZSBkYXRhIGRlc3RpbmF0aW9uIGFmdGVyIHNldHRpbmcgb3RoZXIgcGFyYW1ldGVycyAoc3RlcCAzKSwKK2lmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuICBZb3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGRlc3RpbmF0aW9uIGJldHdlZW4KK2NhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLgorCisKKzMuIFNldCBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2lvbiwgaW5jbHVkaW5nIGltYWdlIHNpemUgJiBjb2xvcnNwYWNlLgorCitZb3UgbXVzdCBzdXBwbHkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBpbWFnZSBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcKK2ZpZWxkcyBpbiB0aGUgSlBFRyBvYmplY3QgKGNpbmZvIHN0cnVjdHVyZSk6CisKKwlpbWFnZV93aWR0aAkJV2lkdGggb2YgaW1hZ2UsIGluIHBpeGVscworCWltYWdlX2hlaWdodAkJSGVpZ2h0IG9mIGltYWdlLCBpbiBwaXhlbHMKKwlpbnB1dF9jb21wb25lbnRzCU51bWJlciBvZiBjb2xvciBjaGFubmVscyAoc2FtcGxlcyBwZXIgcGl4ZWwpCisJaW5fY29sb3Jfc3BhY2UJCUNvbG9yIHNwYWNlIG9mIHNvdXJjZSBpbWFnZQorCitUaGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUsIGhvcGVmdWxseSwgb2J2aW91cy4gIEpQRUcgc3VwcG9ydHMgaW1hZ2UgZGltZW5zaW9ucworb2YgMSB0byA2NEsgcGl4ZWxzIGluIGVpdGhlciBkaXJlY3Rpb24uICBUaGUgaW5wdXQgY29sb3Igc3BhY2UgaXMgdHlwaWNhbGx5CitSR0Igb3IgZ3JheXNjYWxlLCBhbmQgaW5wdXRfY29tcG9uZW50cyBpcyAzIG9yIDEgYWNjb3JkaW5nbHkuICAoU2VlICJTcGVjaWFsCitjb2xvciBzcGFjZXMiLCBsYXRlciwgZm9yIG1vcmUgaW5mby4pICBUaGUgaW5fY29sb3Jfc3BhY2UgZmllbGQgbXVzdCBiZQorYXNzaWduZWQgb25lIG9mIHRoZSBKX0NPTE9SX1NQQUNFIGVudW0gY29uc3RhbnRzLCB0eXBpY2FsbHkgSkNTX1JHQiBvcgorSkNTX0dSQVlTQ0FMRS4KKworSlBFRyBoYXMgYSBsYXJnZSBudW1iZXIgb2YgY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IGRldGVybWluZSBob3cgdGhlCitpbWFnZSBpcyBlbmNvZGVkLiAgTW9zdCBhcHBsaWNhdGlvbnMgZG9uJ3QgbmVlZCBvciB3YW50IHRvIGtub3cgYWJvdXQgYWxsCit0aGVzZSBwYXJhbWV0ZXJzLiAgWW91IGNhbiBzZXQgYWxsIHRoZSBwYXJhbWV0ZXJzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgYnkKK2NhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKTsgdGhlbiwgaWYgdGhlcmUgYXJlIHBhcnRpY3VsYXIgdmFsdWVzIHlvdSB3YW50Cit0byBjaGFuZ2UsIHlvdSBjYW4gZG8gc28gYWZ0ZXIgdGhhdC4gIFRoZSAiQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbiIKK3NlY3Rpb24gdGVsbHMgYWJvdXQgYWxsIHRoZSBwYXJhbWV0ZXJzLgorCitZb3UgbXVzdCBzZXQgaW5fY29sb3Jfc3BhY2UgY29ycmVjdGx5IGJlZm9yZSBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCksCitiZWNhdXNlIHRoZSBkZWZhdWx0cyBkZXBlbmQgb24gdGhlIHNvdXJjZSBpbWFnZSBjb2xvcnNwYWNlLiAgSG93ZXZlciB0aGUKK290aGVyIHRocmVlIHNvdXJjZSBpbWFnZSBwYXJhbWV0ZXJzIG5lZWQgbm90IGJlIHZhbGlkIHVudGlsIHlvdSBjYWxsCitqcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBUaGVyZSdzIG5vIGhhcm0gaW4gY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIG1vcmUKK3RoYW4gb25jZSwgaWYgdGhhdCBoYXBwZW5zIHRvIGJlIGNvbnZlbmllbnQuCisKK1R5cGljYWwgY29kZSBmb3IgYSAyNC1iaXQgUkdCIHNvdXJjZSBpbWFnZSBpcworCisJY2luZm8uaW1hZ2Vfd2lkdGggPSBXaWR0aDsgCS8qIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQsIGluIHBpeGVscyAqLworCWNpbmZvLmltYWdlX2hlaWdodCA9IEhlaWdodDsKKwljaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHBlciBwaXhlbCAqLworCWNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLworCisJanBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKKwkvKiBNYWtlIG9wdGlvbmFsIHBhcmFtZXRlciBzZXR0aW5ncyBoZXJlICovCisKKworNC4ganBlZ19zdGFydF9jb21wcmVzcyguLi4pOworCitBZnRlciB5b3UgaGF2ZSBlc3RhYmxpc2hlZCB0aGUgZGF0YSBkZXN0aW5hdGlvbiBhbmQgc2V0IGFsbCB0aGUgbmVjZXNzYXJ5Citzb3VyY2UgaW1hZ2UgaW5mbyBhbmQgb3RoZXIgcGFyYW1ldGVycywgY2FsbCBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgdG8gYmVnaW4KK2EgY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZSwgYWxsb2NhdGUgd29ya2luZworc3RvcmFnZSwgYW5kIGVtaXQgdGhlIGZpcnN0IGZldyBieXRlcyBvZiB0aGUgSlBFRyBkYXRhc3RyZWFtIGhlYWRlci4KKworVHlwaWNhbCBjb2RlOgorCisJanBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOworCitUaGUgIlRSVUUiIHBhcmFtZXRlciBlbnN1cmVzIHRoYXQgYSBjb21wbGV0ZSBKUEVHIGludGVyY2hhbmdlIGRhdGFzdHJlYW0KK3dpbGwgYmUgd3JpdHRlbi4gIFRoaXMgaXMgYXBwcm9wcmlhdGUgaW4gbW9zdCBjYXNlcy4gIElmIHlvdSB0aGluayB5b3UgbWlnaHQKK3dhbnQgdG8gdXNlIGFuIGFiYnJldmlhdGVkIGRhdGFzdHJlYW0sIHJlYWQgdGhlIHNlY3Rpb24gb24gYWJicmV2aWF0ZWQKK2RhdGFzdHJlYW1zLCBiZWxvdy4KKworT25jZSB5b3UgaGF2ZSBjYWxsZWQganBlZ19zdGFydF9jb21wcmVzcygpLCB5b3UgbWF5IG5vdCBhbHRlciBhbnkgSlBFRworcGFyYW1ldGVycyBvciBvdGhlciBmaWVsZHMgb2YgdGhlIEpQRUcgb2JqZWN0IHVudGlsIHlvdSBoYXZlIGNvbXBsZXRlZAordGhlIGNvbXByZXNzaW9uIGN5Y2xlLgorCisKKzUuIHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSB3cml0dGVuKQorCWpwZWdfd3JpdGVfc2NhbmxpbmVzKC4uLik7CisKK05vdyB3cml0ZSBhbGwgdGhlIHJlcXVpcmVkIGltYWdlIGRhdGEgYnkgY2FsbGluZyBqcGVnX3dyaXRlX3NjYW5saW5lcygpCitvbmUgb3IgbW9yZSB0aW1lcy4gIFlvdSBjYW4gcGFzcyBvbmUgb3IgbW9yZSBzY2FubGluZXMgaW4gZWFjaCBjYWxsLCB1cAordG8gdGhlIHRvdGFsIGltYWdlIGhlaWdodC4gIEluIG1vc3QgYXBwbGljYXRpb25zIGl0IGlzIGNvbnZlbmllbnQgdG8gcGFzcworanVzdCBvbmUgb3IgYSBmZXcgc2NhbmxpbmVzIGF0IGEgdGltZS4gIFRoZSBleHBlY3RlZCBmb3JtYXQgZm9yIHRoZSBwYXNzZWQKK2RhdGEgaXMgZGlzY3Vzc2VkIHVuZGVyICJEYXRhIGZvcm1hdHMiLCBhYm92ZS4KKworSW1hZ2UgZGF0YSBzaG91bGQgYmUgd3JpdHRlbiBpbiB0b3AtdG8tYm90dG9tIHNjYW5saW5lIG9yZGVyLiAgVGhlIEpQRUcgc3BlYworY29udGFpbnMgc29tZSB3ZWFzZWwgd29yZGluZyBhYm91dCBob3cgdG9wIGFuZCBib3R0b20gYXJlIGFwcGxpY2F0aW9uLWRlZmluZWQKK3Rlcm1zIChhIGN1cmlvdXMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIEVuZ2xpc2ggbGFuZ3VhZ2UuLi4pIGJ1dCBpZiB5b3Ugd2FudAoreW91ciBmaWxlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggZXZlcnlvbmUgZWxzZSdzLCB5b3UgV0lMTCB1c2UgdG9wLXRvLWJvdHRvbQorb3JkZXIuICBJZiB0aGUgc291cmNlIGRhdGEgbXVzdCBiZSByZWFkIGluIGJvdHRvbS10by10b3Agb3JkZXIsIHlvdSBjYW4gdXNlCit0aGUgSlBFRyBsaWJyYXJ5J3MgdmlydHVhbCBhcnJheSBtZWNoYW5pc20gdG8gaW52ZXJ0IHRoZSBkYXRhIGVmZmljaWVudGx5LgorRXhhbXBsZXMgb2YgdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBjanBlZy4KKworVGhlIGxpYnJhcnkgbWFpbnRhaW5zIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBzY2FubGluZXMgd3JpdHRlbiBzbyBmYXIKK2luIHRoZSBuZXh0X3NjYW5saW5lIGZpZWxkIG9mIHRoZSBKUEVHIG9iamVjdC4gIFVzdWFsbHkgeW91IGNhbiBqdXN0IHVzZQordGhpcyB2YXJpYWJsZSBhcyB0aGUgbG9vcCBjb3VudGVyLCBzbyB0aGF0IHRoZSBsb29wIHRlc3QgbG9va3MgbGlrZQorIndoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSIuCisKK0NvZGUgZm9yIHRoaXMgc3RlcCBkZXBlbmRzIGhlYXZpbHkgb24gdGhlIHdheSB0aGF0IHlvdSBzdG9yZSB0aGUgc291cmNlIGRhdGEuCitleGFtcGxlLmMgc2hvd3MgdGhlIGZvbGxvd2luZyBjb2RlIGZvciB0aGUgY2FzZSBvZiBhIGZ1bGwtc2l6ZSAyLUQgc291cmNlCithcnJheSBjb250YWluaW5nIDMtYnl0ZSBSR0IgcGl4ZWxzOgorCisJSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CS8qIHBvaW50ZXIgdG8gYSBzaW5nbGUgcm93ICovCisJaW50IHJvd19zdHJpZGU7CQkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIGJ1ZmZlciAqLworCisJcm93X3N0cmlkZSA9IGltYWdlX3dpZHRoICogMzsJLyogSlNBTVBMRXMgcGVyIHJvdyBpbiBpbWFnZV9idWZmZXIgKi8KKworCXdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7CisJICAgIHJvd19wb2ludGVyWzBdID0gJiBpbWFnZV9idWZmZXJbY2luZm8ubmV4dF9zY2FubGluZSAqIHJvd19zdHJpZGVdOworCSAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHJvd19wb2ludGVyLCAxKTsKKwl9CisKK2pwZWdfd3JpdGVfc2NhbmxpbmVzKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhY3R1YWxseSB3cml0dGVuLgorVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgcGFzc2VkIGluLCBzbyB5b3UgY2FuIHVzdWFsbHkKK2lnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLiAgSXQgaXMgZGlmZmVyZW50IGluIGp1c3QgdHdvIGNhc2VzOgorICAqIElmIHlvdSB0cnkgdG8gd3JpdGUgbW9yZSBzY2FubGluZXMgdGhhbiB0aGUgZGVjbGFyZWQgaW1hZ2UgaGVpZ2h0LAorICAgIHRoZSBhZGRpdGlvbmFsIHNjYW5saW5lcyBhcmUgaWdub3JlZC4KKyAgKiBJZiB5b3UgdXNlIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIsIG91dHB1dCBidWZmZXIgb3ZlcnJ1bgorICAgIHdpbGwgY2F1c2UgdGhlIGNvbXByZXNzb3IgdG8gcmV0dXJuIGJlZm9yZSBhY2NlcHRpbmcgYWxsIHRoZSBwYXNzZWQgbGluZXMuCisgICAgVGhpcyBmZWF0dXJlIGlzIGRpc2N1c3NlZCB1bmRlciAiSS9PIHN1c3BlbnNpb24iLCBiZWxvdy4gIFRoZSBub3JtYWwKKyAgICBzdGRpbyBkZXN0aW5hdGlvbiBtYW5hZ2VyIHdpbGwgTk9UIGNhdXNlIHRoaXMgdG8gaGFwcGVuLgorSW4gYW55IGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGNoYW5nZSBpbiB0aGUgdmFsdWUgb2YKK25leHRfc2NhbmxpbmUuCisKKworNi4ganBlZ19maW5pc2hfY29tcHJlc3MoLi4uKTsKKworQWZ0ZXIgYWxsIHRoZSBpbWFnZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sIGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSB0bworY29tcGxldGUgdGhlIGNvbXByZXNzaW9uIGN5Y2xlLiAgVGhpcyBzdGVwIGlzIEVTU0VOVElBTCB0byBlbnN1cmUgdGhhdCB0aGUKK2xhc3QgYnVmZmVybG9hZCBvZiBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIGRhdGEgZGVzdGluYXRpb24uCitqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGFsc28gcmVsZWFzZXMgd29ya2luZyBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEVHCitvYmplY3QuCisKK1R5cGljYWwgY29kZToKKworCWpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisKK0lmIHVzaW5nIHRoZSBzdGRpbyBkZXN0aW5hdGlvbiBtYW5hZ2VyLCBkb24ndCBmb3JnZXQgdG8gY2xvc2UgdGhlIG91dHB1dAorc3RkaW8gc3RyZWFtIChpZiBuZWNlc3NhcnkpIGFmdGVyd2FyZHMuCisKK0lmIHlvdSBoYXZlIHJlcXVlc3RlZCBhIG11bHRpLXBhc3Mgb3BlcmF0aW5nIG1vZGUsIHN1Y2ggYXMgSHVmZm1hbiBjb2RlCitvcHRpbWl6YXRpb24sIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgd2lsbCBwZXJmb3JtIHRoZSBhZGRpdGlvbmFsIHBhc3NlcyB1c2luZworZGF0YSBidWZmZXJlZCBieSB0aGUgZmlyc3QgcGFzcy4gIEluIHRoaXMgY2FzZSBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIG1heSB0YWtlCitxdWl0ZSBhIHdoaWxlIHRvIGNvbXBsZXRlLiAgV2l0aCB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLCB0aGlzIHdpbGwKK25vdCBoYXBwZW4uCisKK0l0IGlzIGFuIGVycm9yIHRvIGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSBiZWZvcmUgd3JpdGluZyB0aGUgbmVjZXNzYXJ5Cit0b3RhbCBudW1iZXIgb2Ygc2NhbmxpbmVzLiAgSWYgeW91IHdpc2ggdG8gYWJvcnQgY29tcHJlc3Npb24sIGNhbGwKK2pwZWdfYWJvcnQoKSBhcyBkaXNjdXNzZWQgYmVsb3cuCisKK0FmdGVyIGNvbXBsZXRpbmcgYSBjb21wcmVzc2lvbiBjeWNsZSwgeW91IG1heSBkaXNwb3NlIG9mIHRoZSBKUEVHIG9iamVjdAorYXMgZGlzY3Vzc2VkIG5leHQsIG9yIHlvdSBtYXkgdXNlIGl0IHRvIGNvbXByZXNzIGFub3RoZXIgaW1hZ2UuICBJbiB0aGF0IGNhc2UKK3JldHVybiB0byBzdGVwIDIsIDMsIG9yIDQgYXMgYXBwcm9wcmlhdGUuICBJZiB5b3UgZG8gbm90IGNoYW5nZSB0aGUKK2Rlc3RpbmF0aW9uIG1hbmFnZXIsIHRoZSBuZXcgZGF0YXN0cmVhbSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgdGFyZ2V0LgorSWYgeW91IGRvIG5vdCBjaGFuZ2UgYW55IEpQRUcgcGFyYW1ldGVycywgdGhlIG5ldyBkYXRhc3RyZWFtIHdpbGwgYmUgd3JpdHRlbgord2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGJlZm9yZS4gIE5vdGUgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgaW5wdXQgaW1hZ2UKK2RpbWVuc2lvbnMgZnJlZWx5IGJldHdlZW4gY3ljbGVzLCBidXQgaWYgeW91IGNoYW5nZSB0aGUgaW5wdXQgY29sb3JzcGFjZSwgeW91CitzaG91bGQgY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpIHRvIGFkanVzdCBmb3IgdGhlIG5ldyBjb2xvcnNwYWNlOyBhbmQgdGhlbgoreW91J2xsIG5lZWQgdG8gcmVwZWF0IGFsbCBvZiBzdGVwIDMuCisKKworNy4gUmVsZWFzZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCisKK1doZW4geW91IGFyZSBkb25lIHdpdGggYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCwgZGVzdHJveSBpdCBieSBjYWxsaW5nCitqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoKS4gIFRoaXMgd2lsbCBmcmVlIGFsbCBzdWJzaWRpYXJ5IG1lbW9yeSAocmVnYXJkbGVzcyBvZgordGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBvYmplY3QpLiAgT3IgeW91IGNhbiBjYWxsIGpwZWdfZGVzdHJveSgpLCB3aGljaAord29ya3MgZm9yIGVpdGhlciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9iamVjdHMgLS0tIHRoaXMgbWF5IGJlIG1vcmUKK2NvbnZlbmllbnQgaWYgeW91IGFyZSBzaGFyaW5nIGNvZGUgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorY2FzZXMuICAoQWN0dWFsbHksIHRoZXNlIHJvdXRpbmVzIGFyZSBlcXVpdmFsZW50IGV4Y2VwdCBmb3IgdGhlIGRlY2xhcmVkIHR5cGUKK29mIHRoZSBwYXNzZWQgcG9pbnRlci4gIFRvIGF2b2lkIGdyaXBlcyBmcm9tIEFOU0kgQyBjb21waWxlcnMsIGpwZWdfZGVzdHJveSgpCitzaG91bGQgYmUgcGFzc2VkIGEgal9jb21tb25fcHRyLikKKworSWYgeW91IGFsbG9jYXRlZCB0aGUganBlZ19jb21wcmVzc19zdHJ1Y3Qgc3RydWN0dXJlIGZyb20gbWFsbG9jKCksIGZyZWVpbmcKK2l0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgLS0tIGpwZWdfZGVzdHJveSgpIHdvbid0LiAgRGl0dG8gZm9yIHRoZSBlcnJvcgoraGFuZGxlciBzdHJ1Y3R1cmUuCisKK1R5cGljYWwgY29kZToKKworCWpwZWdfZGVzdHJveV9jb21wcmVzcygmY2luZm8pOworCisKKzguIEFib3J0aW5nLgorCitJZiB5b3UgZGVjaWRlIHRvIGFib3J0IGEgY29tcHJlc3Npb24gY3ljbGUgYmVmb3JlIGZpbmlzaGluZywgeW91IGNhbiBjbGVhbiB1cAoraW4gZWl0aGVyIG9mIHR3byB3YXlzOgorCisqIElmIHlvdSBkb24ndCBuZWVkIHRoZSBKUEVHIG9iamVjdCBhbnkgbW9yZSwganVzdCBjYWxsCisgIGpwZWdfZGVzdHJveV9jb21wcmVzcygpIG9yIGpwZWdfZGVzdHJveSgpIHRvIHJlbGVhc2UgbWVtb3J5LiAgVGhpcyBpcworICBsZWdpdGltYXRlIGF0IGFueSBwb2ludCBhZnRlciBjYWxsaW5nIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgLS0tIGluIGZhY3QsCisgIGl0J3Mgc2FmZSBldmVuIGlmIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgZmFpbHMuCisKKyogSWYgeW91IHdhbnQgdG8gcmUtdXNlIHRoZSBKUEVHIG9iamVjdCwgY2FsbCBqcGVnX2Fib3J0X2NvbXByZXNzKCksIG9yIGNhbGwKKyAganBlZ19hYm9ydCgpIHdoaWNoIHdvcmtzIG9uIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2JqZWN0cy4KKyAgVGhpcyB3aWxsIHJldHVybiB0aGUgb2JqZWN0IHRvIGFuIGlkbGUgc3RhdGUsIHJlbGVhc2luZyBhbnkgd29ya2luZyBtZW1vcnkuCisgIGpwZWdfYWJvcnQoKSBpcyBhbGxvd2VkIGF0IGFueSB0aW1lIGFmdGVyIHN1Y2Nlc3NmdWwgb2JqZWN0IGNyZWF0aW9uLgorCitOb3RlIHRoYXQgY2xlYW5pbmcgdXAgdGhlIGRhdGEgZGVzdGluYXRpb24sIGlmIHJlcXVpcmVkLCBpcyB5b3VyCityZXNwb25zaWJpbGl0eTsgbmVpdGhlciBvZiB0aGVzZSByb3V0aW5lcyB3aWxsIGNhbGwgdGVybV9kZXN0aW5hdGlvbigpLgorKFNlZSAiQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIiwgYmVsb3csIGZvciBtb3JlIGFib3V0IHRoYXQuKQorCitqcGVnX2Rlc3Ryb3koKSBhbmQganBlZ19hYm9ydCgpIGFyZSB0aGUgb25seSBzYWZlIGNhbGxzIHRvIG1ha2Ugb24gYSBKUEVHCitvYmplY3QgdGhhdCBoYXMgcmVwb3J0ZWQgYW4gZXJyb3IgYnkgY2FsbGluZyBlcnJvcl9leGl0IChzZWUgIkVycm9yIGhhbmRsaW5nIgorZm9yIG1vcmUgaW5mbykuICBUaGUgaW50ZXJuYWwgc3RhdGUgb2Ygc3VjaCBhbiBvYmplY3QgaXMgbGlrZWx5IHRvIGJlIG91dCBvZgord2hhY2suICBFaXRoZXIgb2YgdGhlc2UgdHdvIHJvdXRpbmVzIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgdG8gYSBrbm93biBzdGF0ZS4KKworCitEZWNvbXByZXNzaW9uIGRldGFpbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIZXJlIHdlIHJldmlzaXQgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvdXRsaW5lIGdpdmVuIGluIHRoZSBvdmVydmlldy4KKworMS4gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LgorCitUaGlzIGlzIGp1c3QgbGlrZSBpbml0aWFsaXphdGlvbiBmb3IgY29tcHJlc3Npb24sIGFzIGRpc2N1c3NlZCBhYm92ZSwKK2V4Y2VwdCB0aGF0IHRoZSBvYmplY3QgaXMgYSAic3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QiIGFuZCB5b3UKK2NhbGwganBlZ19jcmVhdGVfZGVjb21wcmVzcygpLiAgRXJyb3IgaGFuZGxpbmcgaXMgZXhhY3RseSB0aGUgc2FtZS4KKworVHlwaWNhbCBjb2RlOgorCisJc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87CisJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisJLi4uCisJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworCWpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKKworKEJvdGggaGVyZSBhbmQgaW4gdGhlIElKRyBjb2RlLCB3ZSB1c3VhbGx5IHVzZSB2YXJpYWJsZSBuYW1lICJjaW5mbyIgZm9yCitib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9iamVjdHMuKQorCisKKzIuIFNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKS4KKworQXMgcHJldmlvdXNseSBtZW50aW9uZWQsIHRoZSBKUEVHIGxpYnJhcnkgcmVhZHMgY29tcHJlc3NlZCBkYXRhIGZyb20gYSAiZGF0YQorc291cmNlIiBtb2R1bGUuICBUaGUgbGlicmFyeSBpbmNsdWRlcyBvbmUgZGF0YSBzb3VyY2UgbW9kdWxlIHdoaWNoIGtub3dzIGhvdwordG8gcmVhZCBmcm9tIGEgc3RkaW8gc3RyZWFtLiAgWW91IGNhbiB1c2UgeW91ciBvd24gc291cmNlIG1vZHVsZSBpZiB5b3Ugd2FudAordG8gZG8gc29tZXRoaW5nIGVsc2UsIGFzIGRpc2N1c3NlZCBsYXRlci4KKworSWYgeW91IHVzZSB0aGUgc3RhbmRhcmQgc291cmNlIG1vZHVsZSwgeW91IG11c3Qgb3BlbiB0aGUgc291cmNlIHN0ZGlvIHN0cmVhbQorYmVmb3JlaGFuZC4gIFR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwIGxvb2tzIGxpa2U6CisKKwlGSUxFICogaW5maWxlOworCS4uLgorCWlmICgoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCSAgICBleGl0KDEpOworCX0KKwlqcGVnX3N0ZGlvX3NyYygmY2luZm8sIGluZmlsZSk7CisKK3doZXJlIHRoZSBsYXN0IGxpbmUgaW52b2tlcyB0aGUgc3RhbmRhcmQgc291cmNlIG1vZHVsZS4KKworV0FSTklORzogaXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgYmluYXJ5IGNvbXByZXNzZWQgZGF0YSBiZSByZWFkIHVuY2hhbmdlZC4KK09uIG5vbi1Vbml4IHN5c3RlbXMgdGhlIHN0ZGlvIGxpYnJhcnkgbWF5IHBlcmZvcm0gbmV3bGluZSB0cmFuc2xhdGlvbiBvcgorb3RoZXJ3aXNlIGNvcnJ1cHQgYmluYXJ5IGRhdGEuICBUbyBzdXBwcmVzcyB0aGlzIGJlaGF2aW9yLCB5b3UgbWF5IG5lZWQgdG8gdXNlCithICJiIiBvcHRpb24gdG8gZm9wZW4gKGFzIHNob3duIGFib3ZlKSwgb3IgdXNlIHNldG1vZGUoKSBvciBhbm90aGVyIHJvdXRpbmUgdG8KK3B1dCB0aGUgc3RkaW8gc3RyZWFtIGluIGJpbmFyeSBtb2RlLiAgU2VlIGNqcGVnLmMgYW5kIGRqcGVnLmMgZm9yIGNvZGUgdGhhdAoraGFzIGJlZW4gZm91bmQgdG8gd29yayBvbiBtYW55IHN5c3RlbXMuCisKK1lvdSBtYXkgbm90IGNoYW5nZSB0aGUgZGF0YSBzb3VyY2UgYmV0d2VlbiBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIoKSBhbmQKK2pwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4gIElmIHlvdSB3aXNoIHRvIHJlYWQgYSBzZXJpZXMgb2YgSlBFRyBpbWFnZXMgZnJvbQorYSBzaW5nbGUgc291cmNlIGZpbGUsIHlvdSBzaG91bGQgcmVwZWF0IHRoZSBqcGVnX3JlYWRfaGVhZGVyKCkgdG8KK2pwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBzZXF1ZW5jZSB3aXRob3V0IHJlaW5pdGlhbGl6aW5nIGVpdGhlciB0aGUgSlBFRworb2JqZWN0IG9yIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGU7IHRoaXMgcHJldmVudHMgYnVmZmVyZWQgaW5wdXQgZGF0YSBmcm9tCitiZWluZyBkaXNjYXJkZWQuCisKKworMy4gQ2FsbCBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gb2J0YWluIGltYWdlIGluZm8uCisKK1R5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwIGlzIGp1c3QKKworCWpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKworVGhpcyB3aWxsIHJlYWQgdGhlIHNvdXJjZSBkYXRhc3RyZWFtIGhlYWRlciBtYXJrZXJzLCB1cCB0byB0aGUgYmVnaW5uaW5nCitvZiB0aGUgY29tcHJlc3NlZCBkYXRhIHByb3Blci4gIE9uIHJldHVybiwgdGhlIGltYWdlIGRpbWVuc2lvbnMgYW5kIG90aGVyCitpbmZvIGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIEpQRUcgb2JqZWN0LiAgVGhlIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvCitjb25zdWx0IHRoaXMgaW5mb3JtYXRpb24gYmVmb3JlIHNlbGVjdGluZyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCisKK01vcmUgY29tcGxleCBjb2RlIGlzIG5lY2Vzc2FyeSBpZgorICAqIEEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkIC0tLSBpbiB0aGF0IGNhc2UganBlZ19yZWFkX2hlYWRlcigpCisgICAgbWF5IHJldHVybiBiZWZvcmUgaXQgaGFzIHJlYWQgYWxsIHRoZSBoZWFkZXIgZGF0YS4gIFNlZSAiSS9PIHN1c3BlbnNpb24iLAorICAgIGJlbG93LiAgVGhlIG5vcm1hbCBzdGRpbyBzb3VyY2UgbWFuYWdlciB3aWxsIE5PVCBjYXVzZSB0aGlzIHRvIGhhcHBlbi4KKyAgKiBBYmJyZXZpYXRlZCBKUEVHIGZpbGVzIGFyZSB0byBiZSBwcm9jZXNzZWQgLS0tIHNlZSB0aGUgc2VjdGlvbiBvbgorICAgIGFiYnJldmlhdGVkIGRhdGFzdHJlYW1zLiAgU3RhbmRhcmQgYXBwbGljYXRpb25zIHRoYXQgZGVhbCBvbmx5IGluCisgICAgaW50ZXJjaGFuZ2UgSlBFRyBmaWxlcyBuZWVkIG5vdCBiZSBjb25jZXJuZWQgd2l0aCB0aGlzIGNhc2UgZWl0aGVyLgorCitJdCBpcyBwZXJtaXNzaWJsZSB0byBzdG9wIGF0IHRoaXMgcG9pbnQgaWYgeW91IGp1c3Qgd2FudGVkIHRvIGZpbmQgb3V0IHRoZQoraW1hZ2UgZGltZW5zaW9ucyBhbmQgb3RoZXIgaGVhZGVyIGluZm8gZm9yIGEgSlBFRyBmaWxlLiAgSW4gdGhhdCBjYXNlLAorY2FsbCBqcGVnX2Rlc3Ryb3koKSB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZSBKUEVHIG9iamVjdCwgb3IgY2FsbAoranBlZ19hYm9ydCgpIHRvIHJldHVybiBpdCB0byBhbiBpZGxlIHN0YXRlIGJlZm9yZSBzZWxlY3RpbmcgYSBuZXcgZGF0YQorc291cmNlIGFuZCByZWFkaW5nIGFub3RoZXIgaGVhZGVyLgorCisKKzQuIFNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uLgorCitqcGVnX3JlYWRfaGVhZGVyKCkgc2V0cyBhcHByb3ByaWF0ZSBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBiYXNlZCBvbgordGhlIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlIChpbiBwYXJ0aWN1bGFyLCBpdHMgY29sb3JzcGFjZSkuICBIb3dldmVyLCB5b3UKK21heSB3ZWxsIHdhbnQgdG8gYWx0ZXIgdGhlc2UgZGVmYXVsdHMgYmVmb3JlIGJlZ2lubmluZyB0aGUgZGVjb21wcmVzc2lvbi4KK0ZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBpcyB0byBwcm9kdWNlIGZ1bGwgY29sb3Igb3V0cHV0IGZyb20gYSBjb2xvciBmaWxlLgorSWYgeW91IHdhbnQgY29sb3JtYXBwZWQgb3V0cHV0IHlvdSBtdXN0IGFzayBmb3IgaXQuICBPdGhlciBvcHRpb25zIGFsbG93IHRoZQorcmV0dXJuZWQgaW1hZ2UgdG8gYmUgc2NhbGVkIGFuZCBhbGxvdyB2YXJpb3VzIHNwZWVkL3F1YWxpdHkgdHJhZGVvZmZzIHRvIGJlCitzZWxlY3RlZC4gICJEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24iLCBiZWxvdywgZ2l2ZXMgZGV0YWlscy4KKworSWYgdGhlIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSwgbm90aGluZyBuZWVkIGJlIGRvbmUgYXQgdGhpcyBzdGVwLgorCitOb3RlIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgYnkgZWFjaCBjYWxsIHRvIGpwZWdfcmVhZF9oZWFkZXIoKS4KK0lmIHlvdSByZXVzZSBhIGRlY29tcHJlc3Npb24gb2JqZWN0LCB5b3UgY2Fubm90IGV4cGVjdCB5b3VyIHBhcmFtZXRlcgorc2V0dGluZ3MgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBjeWNsZXMsIGFzIHlvdSBjYW4gZm9yIGNvbXByZXNzaW9uLgorWW91IG11c3Qgc2V0IGRlc2lyZWQgcGFyYW1ldGVyIHZhbHVlcyBlYWNoIHRpbWUuCisKKworNS4ganBlZ19zdGFydF9kZWNvbXByZXNzKC4uLik7CisKK09uY2UgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHNhdGlzZmFjdG9yeSwgY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB0bworYmVnaW4gZGVjb21wcmVzc2lvbi4gIFRoaXMgd2lsbCBpbml0aWFsaXplIGludGVybmFsIHN0YXRlLCBhbGxvY2F0ZSB3b3JraW5nCittZW1vcnksIGFuZCBwcmVwYXJlIGZvciByZXR1cm5pbmcgZGF0YS4KKworVHlwaWNhbCBjb2RlIGlzIGp1c3QKKworCWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOworCitJZiB5b3UgaGF2ZSByZXF1ZXN0ZWQgYSBtdWx0aS1wYXNzIG9wZXJhdGluZyBtb2RlLCBzdWNoIGFzIDItcGFzcyBjb2xvcgorcXVhbnRpemF0aW9uLCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB3aWxsIGRvIGV2ZXJ5dGhpbmcgbmVlZGVkIGJlZm9yZSBkYXRhCitvdXRwdXQgY2FuIGJlZ2luLiAgSW4gdGhpcyBjYXNlIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIG1heSB0YWtlIHF1aXRlIGEgd2hpbGUKK3RvIGNvbXBsZXRlLiAgV2l0aCBhIHNpbmdsZS1zY2FuIChub24gcHJvZ3Jlc3NpdmUpIEpQRUcgZmlsZSBhbmQgZGVmYXVsdAorZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLCB0aGlzIHdpbGwgbm90IGhhcHBlbjsganBlZ19zdGFydF9kZWNvbXByZXNzKCkgd2lsbAorcmV0dXJuIHF1aWNrbHkuCisKK0FmdGVyIHRoaXMgY2FsbCwgdGhlIGZpbmFsIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zLCBpbmNsdWRpbmcgYW55IHJlcXVlc3RlZAorc2NhbGluZywgYXJlIGF2YWlsYWJsZSBpbiB0aGUgSlBFRyBvYmplY3Q7IHNvIGlzIHRoZSBzZWxlY3RlZCBjb2xvcm1hcCwgaWYKK2NvbG9ybWFwcGVkIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQuICBVc2VmdWwgZmllbGRzIGluY2x1ZGUKKworCW91dHB1dF93aWR0aAkJaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCwgYXMgc2NhbGVkCisJb3V0cHV0X2hlaWdodAorCW91dF9jb2xvcl9jb21wb25lbnRzCSMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UKKwlvdXRwdXRfY29tcG9uZW50cwkjIG9mIGNvbG9yIGNvbXBvbmVudHMgcmV0dXJuZWQgcGVyIHBpeGVsCisJY29sb3JtYXAJCXRoZSBzZWxlY3RlZCBjb2xvcm1hcCwgaWYgYW55CisJYWN0dWFsX251bWJlcl9vZl9jb2xvcnMJCW51bWJlciBvZiBlbnRyaWVzIGluIGNvbG9ybWFwCisKK291dHB1dF9jb21wb25lbnRzIGlzIDEgKGEgY29sb3JtYXAgaW5kZXgpIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7IG90aGVyd2lzZSBpdAorZXF1YWxzIG91dF9jb2xvcl9jb21wb25lbnRzLiAgSXQgaXMgdGhlIG51bWJlciBvZiBKU0FNUExFIHZhbHVlcyB0aGF0IHdpbGwgYmUKK2VtaXR0ZWQgcGVyIHBpeGVsIGluIHRoZSBvdXRwdXQgYXJyYXlzLgorCitUeXBpY2FsbHkgeW91IHdpbGwgbmVlZCB0byBhbGxvY2F0ZSBkYXRhIGJ1ZmZlcnMgdG8gaG9sZCB0aGUgaW5jb21pbmcgaW1hZ2UuCitZb3Ugd2lsbCBuZWVkIG91dHB1dF93aWR0aCAqIG91dHB1dF9jb21wb25lbnRzIEpTQU1QTEVzIHBlciBzY2FubGluZSBpbiB5b3VyCitvdXRwdXQgYnVmZmVyLCBhbmQgYSB0b3RhbCBvZiBvdXRwdXRfaGVpZ2h0IHNjYW5saW5lcyB3aWxsIGJlIHJldHVybmVkLgorCitOb3RlOiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBKUEVHIGxpYnJhcnkncyBpbnRlcm5hbCBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZQorZGF0YSBidWZmZXJzIChhcyBkanBlZyBkb2VzKSwgdGhlbiB0aGUgbWFuYWdlcidzIHByb3RvY29sIHJlcXVpcmVzIHRoYXQgeW91CityZXF1ZXN0IGxhcmdlIGJ1ZmZlcnMgKmJlZm9yZSogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIFRoaXMgaXMgYQorbGl0dGxlIHRyaWNreSBzaW5jZSB0aGUgb3V0cHV0X1hYWCBmaWVsZHMgYXJlIG5vdCBub3JtYWxseSB2YWxpZCB0aGVuLiAgWW91CitjYW4gbWFrZSB0aGVtIHZhbGlkIGJ5IGNhbGxpbmcganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkgYWZ0ZXIgc2V0dGluZyB0aGUKK3JlbGV2YW50IHBhcmFtZXRlcnMgKHNjYWxpbmcsIG91dHB1dCBjb2xvciBzcGFjZSwgYW5kIHF1YW50aXphdGlvbiBmbGFnKS4KKworCis2LiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkKKwlqcGVnX3JlYWRfc2NhbmxpbmVzKC4uLik7CisKK05vdyB5b3UgY2FuIHJlYWQgdGhlIGRlY29tcHJlc3NlZCBpbWFnZSBkYXRhIGJ5IGNhbGxpbmcganBlZ19yZWFkX3NjYW5saW5lcygpCitvbmUgb3IgbW9yZSB0aW1lcy4gIEF0IGVhY2ggY2FsbCwgeW91IHBhc3MgaW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYW5saW5lcwordG8gYmUgcmVhZCAoaWUsIHRoZSBoZWlnaHQgb2YgeW91ciB3b3JraW5nIGJ1ZmZlcik7IGpwZWdfcmVhZF9zY2FubGluZXMoKQord2lsbCByZXR1cm4gdXAgdG8gdGhhdCBtYW55IGxpbmVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzCithY3R1YWxseSByZWFkLiAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgZGF0YSBpcyBkaXNjdXNzZWQgdW5kZXIgIkRhdGEKK2Zvcm1hdHMiLCBhYm92ZS4gIERvbid0IGZvcmdldCB0aGF0IGdyYXlzY2FsZSBhbmQgY29sb3IgSlBFR3Mgd2lsbCByZXR1cm4KK2RpZmZlcmVudCBkYXRhIGZvcm1hdHMhCisKK0ltYWdlIGRhdGEgaXMgcmV0dXJuZWQgaW4gdG9wLXRvLWJvdHRvbSBzY2FubGluZSBvcmRlci4gIElmIHlvdSBtdXN0IHdyaXRlCitvdXQgdGhlIGltYWdlIGluIGJvdHRvbS10by10b3Agb3JkZXIsIHlvdSBjYW4gdXNlIHRoZSBKUEVHIGxpYnJhcnkncyB2aXJ0dWFsCithcnJheSBtZWNoYW5pc20gdG8gaW52ZXJ0IHRoZSBkYXRhIGVmZmljaWVudGx5LiAgRXhhbXBsZXMgb2YgdGhpcyBjYW4gYmUKK2ZvdW5kIGluIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gZGpwZWcuCisKK1RoZSBsaWJyYXJ5IG1haW50YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIHJldHVybmVkIHNvIGZhcgoraW4gdGhlIG91dHB1dF9zY2FubGluZSBmaWVsZCBvZiB0aGUgSlBFRyBvYmplY3QuICBVc3VhbGx5IHlvdSBjYW4ganVzdCB1c2UKK3RoaXMgdmFyaWFibGUgYXMgdGhlIGxvb3AgY291bnRlciwgc28gdGhhdCB0aGUgbG9vcCB0ZXN0IGxvb2tzIGxpa2UKKyJ3aGlsZSAoY2luZm8ub3V0cHV0X3NjYW5saW5lIDwgY2luZm8ub3V0cHV0X2hlaWdodCkiLiAgKE5vdGUgdGhhdCB0aGUgdGVzdAorc2hvdWxkIE5PVCBiZSBhZ2FpbnN0IGltYWdlX2hlaWdodCwgdW5sZXNzIHlvdSBuZXZlciB1c2Ugc2NhbGluZy4gIFRoZQoraW1hZ2VfaGVpZ2h0IGZpZWxkIGlzIHRoZSBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsIHVuc2NhbGVkIGltYWdlLikKK1RoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGVxdWFscyB0aGUgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiBvdXRwdXRfc2NhbmxpbmUuCisKK0lmIHlvdSBkb24ndCB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0CitqcGVnX3JlYWRfc2NhbmxpbmVzKCkgcmVhZHMgYXQgbGVhc3Qgb25lIHNjYW5saW5lIHBlciBjYWxsLCB1bnRpbCB0aGUKK2JvdHRvbSBvZiB0aGUgaW1hZ2UgaGFzIGJlZW4gcmVhY2hlZC4KKworSWYgeW91IHVzZSBhIGJ1ZmZlciBsYXJnZXIgdGhhbiBvbmUgc2NhbmxpbmUsIGl0IGlzIE5PVCBzYWZlIHRvIGFzc3VtZSB0aGF0CitqcGVnX3JlYWRfc2NhbmxpbmVzKCkgZmlsbHMgaXQuICAoVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBvbmx5IGEKK2ZldyBzY2FubGluZXMgcGVyIGNhbGwsIG5vIG1hdHRlciBob3cgbGFyZ2UgYSBidWZmZXIgeW91IHBhc3MuKSAgU28geW91IG11c3QKK2Fsd2F5cyBwcm92aWRlIGEgbG9vcCB0aGF0IGNhbGxzIGpwZWdfcmVhZF9zY2FubGluZXMoKSByZXBlYXRlZGx5IHVudGlsIHRoZQord2hvbGUgaW1hZ2UgaGFzIGJlZW4gcmVhZC4KKworCis3LiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKC4uLik7CisKK0FmdGVyIGFsbCB0aGUgaW1hZ2UgZGF0YSBoYXMgYmVlbiByZWFkLCBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB0bworY29tcGxldGUgdGhlIGRlY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIGNhdXNlcyB3b3JraW5nIG1lbW9yeSBhc3NvY2lhdGVkCit3aXRoIHRoZSBKUEVHIG9iamVjdCB0byBiZSByZWxlYXNlZC4KKworVHlwaWNhbCBjb2RlOgorCisJanBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOworCitJZiB1c2luZyB0aGUgc3RkaW8gc291cmNlIG1hbmFnZXIsIGRvbid0IGZvcmdldCB0byBjbG9zZSB0aGUgc291cmNlIHN0ZGlvCitzdHJlYW0gaWYgbmVjZXNzYXJ5LgorCitJdCBpcyBhbiBlcnJvciB0byBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBiZWZvcmUgcmVhZGluZyB0aGUgY29ycmVjdAordG90YWwgbnVtYmVyIG9mIHNjYW5saW5lcy4gIElmIHlvdSB3aXNoIHRvIGFib3J0IGRlY29tcHJlc3Npb24sIGNhbGwKK2pwZWdfYWJvcnQoKSBhcyBkaXNjdXNzZWQgYmVsb3cuCisKK0FmdGVyIGNvbXBsZXRpbmcgYSBkZWNvbXByZXNzaW9uIGN5Y2xlLCB5b3UgbWF5IGRpc3Bvc2Ugb2YgdGhlIEpQRUcgb2JqZWN0IGFzCitkaXNjdXNzZWQgbmV4dCwgb3IgeW91IG1heSB1c2UgaXQgdG8gZGVjb21wcmVzcyBhbm90aGVyIGltYWdlLiAgSW4gdGhhdCBjYXNlCityZXR1cm4gdG8gc3RlcCAyIG9yIDMgYXMgYXBwcm9wcmlhdGUuICBJZiB5b3UgZG8gbm90IGNoYW5nZSB0aGUgc291cmNlCittYW5hZ2VyLCB0aGUgbmV4dCBpbWFnZSB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgc2FtZSBzb3VyY2UuCisKKworOC4gUmVsZWFzZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdC4KKworV2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QsIGRlc3Ryb3kgaXQgYnkgY2FsbGluZworanBlZ19kZXN0cm95X2RlY29tcHJlc3MoKSBvciBqcGVnX2Rlc3Ryb3koKS4gIFRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mCitkZXN0cm95aW5nIGNvbXByZXNzaW9uIG9iamVjdHMgYXBwbGllcyBoZXJlIHRvby4KKworVHlwaWNhbCBjb2RlOgorCisJanBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKworCis5LiBBYm9ydGluZy4KKworWW91IGNhbiBhYm9ydCBhIGRlY29tcHJlc3Npb24gY3ljbGUgYnkgY2FsbGluZyBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpIG9yCitqcGVnX2Rlc3Ryb3koKSBpZiB5b3UgZG9uJ3QgbmVlZCB0aGUgSlBFRyBvYmplY3QgYW55IG1vcmUsIG9yCitqcGVnX2Fib3J0X2RlY29tcHJlc3MoKSBvciBqcGVnX2Fib3J0KCkgaWYgeW91IHdhbnQgdG8gcmV1c2UgdGhlIG9iamVjdC4KK1RoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mIGFib3J0aW5nIGNvbXByZXNzaW9uIGN5Y2xlcyBhcHBsaWVzIGhlcmUgdG9vLgorCisKK01lY2hhbmljcyBvZiB1c2FnZTogaW5jbHVkZSBmaWxlcywgbGlua2luZywgZXRjCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcHBsaWNhdGlvbnMgdXNpbmcgdGhlIEpQRUcgbGlicmFyeSBzaG91bGQgaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUganBlZ2xpYi5oCit0byBvYnRhaW4gZGVjbGFyYXRpb25zIG9mIGRhdGEgdHlwZXMgYW5kIHJvdXRpbmVzLiAgQmVmb3JlIGluY2x1ZGluZworanBlZ2xpYi5oLCBpbmNsdWRlIHN5c3RlbSBoZWFkZXJzIHRoYXQgZGVmaW5lIGF0IGxlYXN0IHRoZSB0eXBlZGVmcyBGSUxFIGFuZAorc2l6ZV90LiAgT24gQU5TSS1jb25mb3JtaW5nIHN5c3RlbXMsIGluY2x1ZGluZyA8c3RkaW8uaD4gaXMgc3VmZmljaWVudDsgb24KK29sZGVyIFVuaXggc3lzdGVtcywgeW91IG1heSBuZWVkIDxzeXMvdHlwZXMuaD4gdG8gZGVmaW5lIHNpemVfdC4KKworSWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlZmVyIHRvIGluZGl2aWR1YWwgSlBFRyBsaWJyYXJ5IGVycm9yIGNvZGVzLCBhbHNvCitpbmNsdWRlIGplcnJvci5oIHRvIGRlZmluZSB0aG9zZSBzeW1ib2xzLgorCitqcGVnbGliLmggaW5kaXJlY3RseSBpbmNsdWRlcyB0aGUgZmlsZXMgamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oLiAgSWYgeW91IGFyZQoraW5zdGFsbGluZyB0aGUgSlBFRyBoZWFkZXIgZmlsZXMgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5LCB5b3Ugd2lsbCB3YW50IHRvCitpbnN0YWxsIGFsbCBmb3VyIGZpbGVzOiBqcGVnbGliLmgsIGplcnJvci5oLCBqY29uZmlnLmgsIGptb3JlY2ZnLmguCisKK1RoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIGluY2x1ZGUgdGhlIEpQRUcgY29kZSBpbnRvIHlvdXIgZXhlY3V0YWJsZSBwcm9ncmFtCitpcyB0byBwcmVwYXJlIGEgbGlicmFyeSBmaWxlICgibGlianBlZy5hIiwgb3IgYSBjb3JyZXNwb25kaW5nIG5hbWUgb24gbm9uLVVuaXgKK21hY2hpbmVzKSBhbmQgcmVmZXJlbmNlIGl0IGF0IHlvdXIgbGluayBzdGVwLiAgSWYgeW91IHVzZSBvbmx5IGhhbGYgb2YgdGhlCitsaWJyYXJ5IChvbmx5IGNvbXByZXNzaW9uIG9yIG9ubHkgZGVjb21wcmVzc2lvbiksIG9ubHkgdGhhdCBtdWNoIGNvZGUgd2lsbCBiZQoraW5jbHVkZWQgZnJvbSB0aGUgbGlicmFyeSwgdW5sZXNzIHlvdXIgbGlua2VyIGlzIGhvcGVsZXNzbHkgYnJhaW4tZGFtYWdlZC4KK1RoZSBzdXBwbGllZCBtYWtlZmlsZXMgYnVpbGQgbGlianBlZy5hIGF1dG9tYXRpY2FsbHkgKHNlZSBpbnN0YWxsLmRvYykuCisKK1doaWxlIHlvdSBjYW4gYnVpbGQgdGhlIEpQRUcgbGlicmFyeSBhcyBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSB3aGltIHN0cmlrZXMKK3lvdSwgd2UgZG9uJ3QgcmVhbGx5IHJlY29tbWVuZCBpdC4gIFRoZSB0cm91YmxlIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpcyB0aGF0CithdCBzb21lIHBvaW50IHlvdSdsbCBwcm9iYWJseSB0cnkgdG8gc3Vic3RpdHV0ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5Cit3aXRob3V0IHJlY29tcGlsaW5nIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9ucy4gIFRoYXQgZ2VuZXJhbGx5IGRvZXNuJ3Qgd29yaworYmVjYXVzZSB0aGUgcGFyYW1ldGVyIHN0cnVjdCBkZWNsYXJhdGlvbnMgdXN1YWxseSBjaGFuZ2Ugd2l0aCBlYWNoIG5ldwordmVyc2lvbi4gIEluIG90aGVyIHdvcmRzLCB0aGUgbGlicmFyeSdzIEFQSSBpcyAqbm90KiBndWFyYW50ZWVkIGJpbmFyeQorY29tcGF0aWJsZSBhY3Jvc3MgdmVyc2lvbnM7IHdlIG9ubHkgdHJ5IHRvIGVuc3VyZSBzb3VyY2UtY29kZSBjb21wYXRpYmlsaXR5LgorKEluIGhpbmRzaWdodCwgaXQgbWlnaHQgaGF2ZSBiZWVuIHNtYXJ0ZXIgdG8gaGlkZSB0aGUgcGFyYW1ldGVyIHN0cnVjdHMgZnJvbQorYXBwbGljYXRpb25zIGFuZCBpbnRyb2R1Y2UgYSB0b24gb2YgYWNjZXNzIGZ1bmN0aW9ucyBpbnN0ZWFkLiAgVG9vIGxhdGUgbm93LAoraG93ZXZlci4pCisKK09uIHNvbWUgc3lzdGVtcyB5b3VyIGFwcGxpY2F0aW9uIG1heSBuZWVkIHRvIHNldCB1cCBhIHNpZ25hbCBoYW5kbGVyIHRvIGVuc3VyZQordGhhdCB0ZW1wb3JhcnkgZmlsZXMgYXJlIGRlbGV0ZWQgaWYgdGhlIHByb2dyYW0gaXMgaW50ZXJydXB0ZWQuICBUaGlzIGlzIG1vc3QKK2NyaXRpY2FsIGlmIHlvdSBhcmUgb24gTVMtRE9TIGFuZCB1c2UgdGhlIGptZW1kb3MuYyBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZDsKK2l0IHdpbGwgdHJ5IHRvIGdyYWIgZXh0ZW5kZWQgbWVtb3J5IGZvciB0ZW1wIGZpbGVzLCBhbmQgdGhhdCBzcGFjZSB3aWxsIE5PVCBiZQorZnJlZWQgYXV0b21hdGljYWxseS4gIFNlZSBjanBlZy5jIG9yIGRqcGVnLmMgZm9yIGFuIGV4YW1wbGUgc2lnbmFsIGhhbmRsZXIuCisKK0l0IG1heSBiZSB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCB0aGUgY29yZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgYWN0dWFsbHkKK3JlcXVpcmUgdGhlIHN0ZGlvIGxpYnJhcnk6IG9ubHkgdGhlIGRlZmF1bHQgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIGFuZAorZXJyb3IgaGFuZGxlciBuZWVkIGl0LiAgWW91IGNhbiB1c2UgdGhlIGxpYnJhcnkgaW4gYSBzdGRpby1sZXNzIGVudmlyb25tZW50CitpZiB5b3UgcmVwbGFjZSB0aG9zZSBtb2R1bGVzIGFuZCB1c2Ugam1lbW5vYnMuYyAob3IgYW5vdGhlciBtZW1vcnkgbWFuYWdlciBvZgoreW91ciBvd24gZGV2aXNpbmcpLiAgTW9yZSBpbmZvIGFib3V0IHRoZSBtaW5pbXVtIHN5c3RlbSBsaWJyYXJ5IHJlcXVpcmVtZW50cworbWF5IGJlIGZvdW5kIGluIGppbmNsdWRlLmguCisKKworQURWQU5DRUQgRkVBVFVSRVMKKz09PT09PT09PT09PT09PT09CisKK0NvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhbGwgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgeW91IGNhbiBzZXQgZm9yIEpQRUcKK2NvbXByZXNzaW9uLCBhcyB3ZWxsIGFzIHRoZSAiaGVscGVyIiByb3V0aW5lcyBwcm92aWRlZCB0byBhc3Npc3QgaW4gdGhpcwordGFzay4gIFByb3BlciBzZXR0aW5nIG9mIHNvbWUgcGFyYW1ldGVycyByZXF1aXJlcyBkZXRhaWxlZCB1bmRlcnN0YW5kaW5nCitvZiB0aGUgSlBFRyBzdGFuZGFyZDsgaWYgeW91IGRvbid0IGtub3cgd2hhdCBhIHBhcmFtZXRlciBpcyBmb3IsIGl0J3MgYmVzdAorbm90IHRvIG1lc3Mgd2l0aCBpdCEgIFNlZSBSRUZFUkVOQ0VTIGluIHRoZSBSRUFETUUgZmlsZSBmb3IgcG9pbnRlcnMgdG8KK21vcmUgaW5mbyBhYm91dCBKUEVHLgorCitJdCdzIGEgZ29vZCBpZGVhIHRvIGNhbGwganBlZ19zZXRfZGVmYXVsdHMoKSBmaXJzdCwgZXZlbiBpZiB5b3UgcGxhbiB0byBzZXQKK2FsbCB0aGUgcGFyYW1ldGVyczsgdGhhdCB3YXkgeW91ciBjb2RlIGlzIG1vcmUgbGlrZWx5IHRvIHdvcmsgd2l0aCBmdXR1cmUgSlBFRworbGlicmFyaWVzIHRoYXQgaGF2ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSByZWNvbW1lbmQKK3lvdSB1c2UgYSBoZWxwZXIgcm91dGluZSB3aGVyZSBvbmUgaXMgcHJvdmlkZWQsIGluIHByZWZlcmVuY2UgdG8gdHdpZGRsaW5nCitjaW5mbyBmaWVsZHMgZGlyZWN0bHkuCisKK1RoZSBoZWxwZXIgcm91dGluZXMgYXJlOgorCitqcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCisJVGhpcyByb3V0aW5lIHNldHMgYWxsIEpQRUcgcGFyYW1ldGVycyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB1c2luZworCW9ubHkgdGhlIGlucHV0IGltYWdlJ3MgY29sb3Igc3BhY2UgKGZpZWxkIGluX2NvbG9yX3NwYWNlLCB3aGljaCBtdXN0CisJYWxyZWFkeSBiZSBzZXQgaW4gY2luZm8pLiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCBvbmx5IG5lZWQgdG8gdXNlCisJdGhpcyByb3V0aW5lIGFuZCBwZXJoYXBzIGpwZWdfc2V0X3F1YWxpdHkoKS4KKworanBlZ19zZXRfY29sb3JzcGFjZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkKKwlTZXRzIHRoZSBKUEVHIGZpbGUncyBjb2xvcnNwYWNlIChmaWVsZCBqcGVnX2NvbG9yX3NwYWNlKSBhcyBzcGVjaWZpZWQsCisJYW5kIHNldHMgb3RoZXIgY29sb3Itc3BhY2UtZGVwZW5kZW50IHBhcmFtZXRlcnMgYXBwcm9wcmlhdGVseS4gIFNlZQorCSJTcGVjaWFsIGNvbG9yIHNwYWNlcyIsIGJlbG93LCBiZWZvcmUgdXNpbmcgdGhpcy4gIEEgbGFyZ2UgbnVtYmVyIG9mCisJcGFyYW1ldGVycywgaW5jbHVkaW5nIGFsbCBwZXItY29tcG9uZW50IHBhcmFtZXRlcnMsIGFyZSBzZXQgYnkgdGhpcworCXJvdXRpbmU7IGlmIHlvdSB3YW50IHRvIHR3aWRkbGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXJzIHlvdSBzaG91bGQgY2FsbAorCWpwZWdfc2V0X2NvbG9yc3BhY2UoKSBiZWZvcmUgcmF0aGVyIHRoYW4gYWZ0ZXIuCisKK2pwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKwlTZWxlY3RzIGFuIGFwcHJvcHJpYXRlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBjaW5mby0+aW5fY29sb3Jfc3BhY2UsCisJYW5kIGNhbGxzIGpwZWdfc2V0X2NvbG9yc3BhY2UoKS4gIFRoaXMgaXMgYWN0dWFsbHkgYSBzdWJyb3V0aW5lIG9mCisJanBlZ19zZXRfZGVmYXVsdHMoKS4gIEl0J3MgYnJva2VuIG91dCBpbiBjYXNlIHlvdSB3YW50IHRvIGNoYW5nZQorCWp1c3QgdGhlIGNvbG9yc3BhY2UtZGVwZW5kZW50IEpQRUcgcGFyYW1ldGVycy4KKworanBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorCUNvbnN0cnVjdHMgSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFwcHJvcHJpYXRlIGZvciB0aGUgaW5kaWNhdGVkCisJcXVhbGl0eSBzZXR0aW5nLiAgVGhlIHF1YWxpdHkgdmFsdWUgaXMgZXhwcmVzc2VkIG9uIHRoZSAwLi4xMDAgc2NhbGUKKwlyZWNvbW1lbmRlZCBieSBJSkcgKGNqcGVnJ3MgIi1xdWFsaXR5IiBzd2l0Y2ggdXNlcyB0aGlzIHJvdXRpbmUpLgorCU5vdGUgdGhhdCB0aGUgZXhhY3QgbWFwcGluZyBmcm9tIHF1YWxpdHkgdmFsdWVzIHRvIHRhYmxlcyBtYXkgY2hhbmdlCisJaW4gZnV0dXJlIElKRyByZWxlYXNlcyBhcyBtb3JlIGlzIGxlYXJuZWQgYWJvdXQgRENUIHF1YW50aXphdGlvbi4KKwlJZiB0aGUgZm9yY2VfYmFzZWxpbmUgcGFyYW1ldGVyIGlzIFRSVUUsIHRoZW4gdGhlIHF1YW50aXphdGlvbiB0YWJsZQorCWVudHJpZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAxLi4yNTUgZm9yIGZ1bGwgSlBFRyBiYXNlbGluZQorCWNvbXBhdGliaWxpdHkuICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBvbmx5IG1ha2VzIGEKKwlkaWZmZXJlbmNlIGZvciBxdWFsaXR5IHNldHRpbmdzIGJlbG93IDI1LCBhbmQgaXQgZWZmZWN0aXZlbHkgcHJldmVudHMKKwl2ZXJ5IHNtYWxsL2xvdyBxdWFsaXR5IGZpbGVzIGZyb20gYmVpbmcgZ2VuZXJhdGVkLiAgVGhlIElKRyBkZWNvZGVyCisJaXMgY2FwYWJsZSBvZiByZWFkaW5nIHRoZSBub24tYmFzZWxpbmUgZmlsZXMgZ2VuZXJhdGVkIGF0IGxvdyBxdWFsaXR5CisJc2V0dGluZ3Mgd2hlbiBmb3JjZV9iYXNlbGluZSBpcyBGQUxTRSwgYnV0IG90aGVyIGRlY29kZXJzIG1heSBub3QgYmUuCisKK2pwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKKwkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorCVNhbWUgYXMganBlZ19zZXRfcXVhbGl0eSgpIGV4Y2VwdCB0aGF0IHRoZSBnZW5lcmF0ZWQgdGFibGVzIGFyZSB0aGUKKwlzYW1wbGUgdGFibGVzIGdpdmVuIGluIHRoZSBKUEVDIHNwZWMgc2VjdGlvbiBLLjEsIG11bHRpcGxpZWQgYnkgdGhlCisJc3BlY2lmaWVkIHNjYWxlIGZhY3RvciAod2hpY2ggaXMgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZTsgdGh1cworCXNjYWxlX2ZhY3RvciA9IDEwMCByZXByb2R1Y2VzIHRoZSBzcGVjJ3MgdGFibGVzKS4gIE5vdGUgdGhhdCBsYXJnZXIKKwlzY2FsZSBmYWN0b3JzIGdpdmUgbG93ZXIgcXVhbGl0eS4gIFRoaXMgZW50cnkgcG9pbnQgaXMgdXNlZnVsIGZvcgorCWNvbmZvcm1pbmcgdG8gdGhlIEFkb2JlIFBvc3RTY3JpcHQgRENUIGNvbnZlbnRpb25zLCBidXQgd2UgZG8gbm90CisJcmVjb21tZW5kIGxpbmVhciBzY2FsaW5nIGFzIGEgdXNlci12aXNpYmxlIHF1YWxpdHkgc2NhbGUgb3RoZXJ3aXNlLgorCWZvcmNlX2Jhc2VsaW5lIGFnYWluIGNvbnN0cmFpbnMgdGhlIGNvbXB1dGVkIHRhYmxlIGVudHJpZXMgdG8gMS4uMjU1LgorCitpbnQganBlZ19xdWFsaXR5X3NjYWxpbmcgKGludCBxdWFsaXR5KQorCUNvbnZlcnRzIGEgdmFsdWUgb24gdGhlIElKRy1yZWNvbW1lbmRlZCBxdWFsaXR5IHNjYWxlIHRvIGEgbGluZWFyCisJc2NhbGluZyBwZXJjZW50YWdlLiAgTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgY2hhbmdlIG9yIGdvIGF3YXkKKwlpbiBmdXR1cmUgcmVsZWFzZXMgLS0tIElKRyBtYXkgY2hvb3NlIHRvIGFkb3B0IGEgc2NhbGluZyBtZXRob2QgdGhhdAorCWNhbid0IGJlIGV4cHJlc3NlZCBhcyBhIHNpbXBsZSBzY2FsYXIgbXVsdGlwbGllciwgaW4gd2hpY2ggY2FzZSB0aGUKKwlwcmVtaXNlIG9mIHRoaXMgcm91dGluZSBjb2xsYXBzZXMuICBDYXZlYXQgdXNlci4KKworanBlZ19hZGRfcXVhbnRfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAorCQkgICAgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorCUFsbG93cyBhbiBhcmJpdHJhcnkgcXVhbnRpemF0aW9uIHRhYmxlIHRvIGJlIGNyZWF0ZWQuICB3aGljaF90YmwKKwlpbmRpY2F0ZXMgd2hpY2ggdGFibGUgc2xvdCB0byBmaWxsLiAgYmFzaWNfdGFibGUgcG9pbnRzIHRvIGFuIGFycmF5CisJb2YgNjQgdW5zaWduZWQgaW50cyBnaXZlbiBpbiBub3JtYWwgYXJyYXkgb3JkZXIuICBUaGVzZSB2YWx1ZXMgYXJlCisJbXVsdGlwbGllZCBieSBzY2FsZV9mYWN0b3IvMTAwIGFuZCB0aGVuIGNsYW1wZWQgdG8gdGhlIHJhbmdlIDEuLjY1NTM1CisJKG9yIHRvIDEuLjI1NSBpZiBmb3JjZV9iYXNlbGluZSBpcyBUUlVFKS4KKwlDQVVUSU9OOiBwcmlvciB0byBsaWJyYXJ5IHZlcnNpb24gNmEsIGpwZWdfYWRkX3F1YW50X3RhYmxlIGV4cGVjdGVkCisJdGhlIGJhc2ljIHRhYmxlIHRvIGJlIGdpdmVuIGluIEpQRUcgemlnemFnIG9yZGVyLiAgSWYgeW91IG5lZWQgdG8KKwl3cml0ZSBjb2RlIHRoYXQgd29ya3Mgd2l0aCBlaXRoZXIgb2xkZXIgb3IgbmV3ZXIgdmVyc2lvbnMgb2YgdGhpcworCXJvdXRpbmUsIHlvdSBtdXN0IGNoZWNrIHRoZSBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyLiAgU29tZXRoaW5nIGxpa2UKKwkiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjEiIGlzIHRoZSByaWdodCB0ZXN0LgorCitqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCisJR2VuZXJhdGVzIGEgZGVmYXVsdCBzY2FuIHNjcmlwdCBmb3Igd3JpdGluZyBhIHByb2dyZXNzaXZlLUpQRUcgZmlsZS4KKwlUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYSBwcm9ncmVzc2l2ZSBmaWxlLAorCXVubGVzcyB5b3Ugd2FudCB0byBtYWtlIGEgY3VzdG9tIHNjYW4gc2VxdWVuY2UuICBZb3UgbXVzdCBlbnN1cmUgdGhhdAorCXRoZSBKUEVHIGNvbG9yIHNwYWNlIGlzIHNldCBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorCisKK0NvbXByZXNzaW9uIHBhcmFtZXRlcnMgKGNpbmZvIGZpZWxkcykgaW5jbHVkZToKKworSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2QKKwlTZWxlY3RzIHRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIERDVCBzdGVwLiAgQ2hvaWNlcyBhcmU6CisJCUpEQ1RfSVNMT1c6IHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtCisJCUpEQ1RfSUZBU1Q6IGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZAorCQlKRENUX0ZMT0FUOiBmbG9hdGluZy1wb2ludCBtZXRob2QKKwkJSkRDVF9ERUZBVUxUOiBkZWZhdWx0IG1ldGhvZCAobm9ybWFsbHkgSkRDVF9JU0xPVykKKwkJSkRDVF9GQVNURVNUOiBmYXN0ZXN0IG1ldGhvZCAobm9ybWFsbHkgSkRDVF9JRkFTVCkKKwlUaGUgRkxPQVQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBJU0xPVyBtZXRob2QsCisJYnV0IG1heSBnaXZlIGRpZmZlcmVudCByZXN1bHRzIG9uIGRpZmZlcmVudCBtYWNoaW5lcyBkdWUgdG8gdmFyeWluZworCXJvdW5kb2ZmIGJlaGF2aW9yLiAgVGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzCisJb24gYWxsIG1hY2hpbmVzLiAgT24gbWFjaGluZXMgd2l0aCBzdWZmaWNpZW50bHkgZmFzdCBGUCBoYXJkd2FyZSwgdGhlCisJZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSBhbHNvIGJlIHRoZSBmYXN0ZXN0LiAgVGhlIElGQVNUIG1ldGhvZCBpcworCWNvbnNpZGVyYWJseSBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3bzsgaXRzIHVzZSBpcyBub3QKKwlyZWNvbW1lbmRlZCBpZiBoaWdoIHF1YWxpdHkgaXMgYSBjb25jZXJuLiAgSkRDVF9ERUZBVUxUIGFuZAorCUpEQ1RfRkFTVEVTVCBhcmUgbWFjcm9zIGNvbmZpZ3VyYWJsZSBieSBlYWNoIGluc3RhbGxhdGlvbi4KKworSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlCitpbnQgbnVtX2NvbXBvbmVudHMKKwlUaGUgSlBFRyBjb2xvciBzcGFjZSBhbmQgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgY29tcG9uZW50czsgc2VlCisJIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGZvciBtb3JlIGluZm8uICBXZSByZWNvbW1lbmQgdXNpbmcKKwlqcGVnX3NldF9jb2xvcl9zcGFjZSgpIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVzZS4KKworYm9vbGVhbiBvcHRpbWl6ZV9jb2RpbmcKKwlUUlVFIGNhdXNlcyB0aGUgY29tcHJlc3NvciB0byBjb21wdXRlIG9wdGltYWwgSHVmZm1hbiBjb2RpbmcgdGFibGVzCisJZm9yIHRoZSBpbWFnZS4gIFRoaXMgcmVxdWlyZXMgYW4gZXh0cmEgcGFzcyBvdmVyIHRoZSBkYXRhIGFuZAorCXRoZXJlZm9yZSBjb3N0cyBhIGdvb2QgZGVhbCBvZiBzcGFjZSBhbmQgdGltZS4gIFRoZSBkZWZhdWx0IGlzCisJRkFMU0UsIHdoaWNoIHRlbGxzIHRoZSBjb21wcmVzc29yIHRvIHVzZSB0aGUgc3VwcGxpZWQgb3IgZGVmYXVsdAorCUh1ZmZtYW4gdGFibGVzLiAgSW4gbW9zdCBjYXNlcyBvcHRpbWFsIHRhYmxlcyBzYXZlIG9ubHkgYSBmZXcgcGVyY2VudAorCW9mIGZpbGUgc2l6ZSBjb21wYXJlZCB0byB0aGUgZGVmYXVsdCB0YWJsZXMuICBOb3RlIHRoYXQgd2hlbiB0aGlzIGlzCisJVFJVRSwgeW91IG5lZWQgbm90IHN1cHBseSBIdWZmbWFuIHRhYmxlcyBhdCBhbGwsIGFuZCBhbnkgeW91IGRvCisJc3VwcGx5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCisKK3Vuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsCitpbnQgcmVzdGFydF9pbl9yb3dzCisJVG8gZW1pdCByZXN0YXJ0IG1hcmtlcnMgaW4gdGhlIEpQRUcgZmlsZSwgc2V0IG9uZSBvZiB0aGVzZSBub256ZXJvLgorCVNldCByZXN0YXJ0X2ludGVydmFsIHRvIHNwZWNpZnkgdGhlIGV4YWN0IGludGVydmFsIGluIE1DVSBibG9ja3MuCisJU2V0IHJlc3RhcnRfaW5fcm93cyB0byBzcGVjaWZ5IHRoZSBpbnRlcnZhbCBpbiBNQ1Ugcm93cy4gIChJZgorCXJlc3RhcnRfaW5fcm93cyBpcyBub3QgMCwgdGhlbiByZXN0YXJ0X2ludGVydmFsIGlzIHNldCBhZnRlciB0aGUKKwlpbWFnZSB3aWR0aCBpbiBNQ1VzIGlzIGNvbXB1dGVkLikgIERlZmF1bHRzIGFyZSB6ZXJvIChubyByZXN0YXJ0cykuCisJT25lIHJlc3RhcnQgbWFya2VyIHBlciBNQ1Ugcm93IGlzIG9mdGVuIGEgZ29vZCBjaG9pY2UuCisJTk9URTogdGhlIG92ZXJoZWFkIG9mIHJlc3RhcnQgbWFya2VycyBpcyBoaWdoZXIgaW4gZ3JheXNjYWxlIEpQRUcKKwlmaWxlcyB0aGFuIGluIGNvbG9yIGZpbGVzLCBhbmQgTVVDSCBoaWdoZXIgaW4gcHJvZ3Jlc3NpdmUgSlBFR3MuCisJSWYgeW91IHVzZSByZXN0YXJ0cywgeW91IG1heSB3YW50IHRvIHVzZSBsYXJnZXIgaW50ZXJ2YWxzIGluIHRob3NlCisJY2FzZXMuCisKK2NvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvCitpbnQgbnVtX3NjYW5zCisJQnkgZGVmYXVsdCwgc2Nhbl9pbmZvIGlzIE5VTEw7IHRoaXMgY2F1c2VzIHRoZSBjb21wcmVzc29yIHRvIHdyaXRlIGEKKwlzaW5nbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZS4gIElmIG5vdCBOVUxMLCBzY2FuX2luZm8gcG9pbnRzIHRvCisJYW4gYXJyYXkgb2Ygc2NhbiBkZWZpbml0aW9uIHJlY29yZHMgb2YgbGVuZ3RoIG51bV9zY2Fucy4gIFRoZQorCWNvbXByZXNzb3Igd2lsbCB0aGVuIHdyaXRlIGEgSlBFRyBmaWxlIGhhdmluZyBvbmUgc2NhbiBmb3IgZWFjaCBzY2FuCisJZGVmaW5pdGlvbiByZWNvcmQuICBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgbm9uaW50ZXJsZWF2ZWQgb3IKKwlwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLiAgVGhlIGxpYnJhcnkgY2hlY2tzIHRoYXQgdGhlIHNjYW4gYXJyYXkKKwlkZWZpbmVzIGEgdmFsaWQgSlBFRyBzY2FuIHNlcXVlbmNlLiAgKGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGNyZWF0ZXMKKwlhIHN1aXRhYmxlIHNjYW4gZGVmaW5pdGlvbiBhcnJheSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4pICBUaGlzIGlzCisJZGlzY3Vzc2VkIGZ1cnRoZXIgdW5kZXIgIlByb2dyZXNzaXZlIEpQRUcgc3VwcG9ydCIuCisKK2ludCBzbW9vdGhpbmdfZmFjdG9yCisJSWYgbm9uLXplcm8sIHRoZSBpbnB1dCBpbWFnZSBpcyBzbW9vdGhlZDsgdGhlIHZhbHVlIHNob3VsZCBiZSAxIGZvcgorCW1pbmltYWwgc21vb3RoaW5nIHRvIDEwMCBmb3IgbWF4aW11bSBzbW9vdGhpbmcuICBDb25zdWx0IGpjc2FtcGxlLmMKKwlmb3IgZGV0YWlscyBvZiB0aGUgc21vb3RoaW5nIGFsZ29yaXRobS4gIFRoZSBkZWZhdWx0IGlzIHplcm8uCisKK2Jvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXIKKwlJZiBUUlVFLCBhIEpGSUYgQVBQMCBtYXJrZXIgaXMgZW1pdHRlZC4gIGpwZWdfc2V0X2RlZmF1bHRzKCkgYW5kCisJanBlZ19zZXRfY29sb3JzcGFjZSgpIHNldCB0aGlzIFRSVUUgaWYgYSBKRklGLWxlZ2FsIEpQRUcgY29sb3Igc3BhY2UKKwkoaWUsIFlDYkNyIG9yIGdyYXlzY2FsZSkgaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBGQUxTRS4KKworVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uCitVSU5UOCBKRklGX21pbm9yX3ZlcnNpb24KKwlUaGUgdmVyc2lvbiBudW1iZXIgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBKRklGIG1hcmtlci4KKwlqcGVnX3NldF9kZWZhdWx0cygpIGluaXRpYWxpemVzIHRoZSB2ZXJzaW9uIHRvIDEuMDEgKG1ham9yPW1pbm9yPTEpLgorCVlvdSBzaG91bGQgc2V0IGl0IHRvIDEuMDIgKG1ham9yPTEsIG1pbm9yPTIpIGlmIHlvdSBwbGFuIHRvIHdyaXRlCisJYW55IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2Vycy4KKworVUlOVDggZGVuc2l0eV91bml0CitVSU5UMTYgWF9kZW5zaXR5CitVSU5UMTYgWV9kZW5zaXR5CisJVGhlIHJlc29sdXRpb24gaW5mb3JtYXRpb24gdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBKRklGIG1hcmtlcjsKKwlub3QgdXNlZCBvdGhlcndpc2UuICBkZW5zaXR5X3VuaXQgbWF5IGJlIDAgZm9yIHVua25vd24sCisJMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSAwLDEsMQorCWluZGljYXRpbmcgc3F1YXJlIHBpeGVscyBvZiB1bmtub3duIHNpemUuCisKK2Jvb2xlYW4gd3JpdGVfQWRvYmVfbWFya2VyCisJSWYgVFJVRSwgYW4gQWRvYmUgQVBQMTQgbWFya2VyIGlzIGVtaXR0ZWQuICBqcGVnX3NldF9kZWZhdWx0cygpIGFuZAorCWpwZWdfc2V0X2NvbG9yc3BhY2UoKSBzZXQgdGhpcyBUUlVFIGlmIEpQRUcgY29sb3Igc3BhY2UgUkdCLCBDTVlLLAorCW9yIFlDQ0sgaXMgc2VsZWN0ZWQsIG90aGVyd2lzZSBGQUxTRS4gIEl0IGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhCisJdG8gc2V0IGJvdGggd3JpdGVfSkZJRl9oZWFkZXIgYW5kIHdyaXRlX0Fkb2JlX21hcmtlci4gIEluIGZhY3QsCisJeW91IHByb2JhYmx5IHNob3VsZG4ndCBjaGFuZ2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXQgYWxsIC0tLSB0aGUKKwlkZWZhdWx0IGJlaGF2aW9yIGVuc3VyZXMgdGhhdCB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgY2FuIGJlCisJcmVjb2duaXplZCBieSB0aGUgZGVjb2Rlci4KKworSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXQorCVBvaW50ZXJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9uZSBwZXIgdGFibGUgc2xvdCwKKwlvciBOVUxMIGlmIG5vIHRhYmxlIGlzIGRlZmluZWQgZm9yIGEgc2xvdC4gIFVzdWFsbHkgdGhlc2Ugc2hvdWxkCisJYmUgc2V0IHZpYSBvbmUgb2YgdGhlIGFib3ZlIGhlbHBlciByb3V0aW5lczsganBlZ19hZGRfcXVhbnRfdGFibGUoKQorCWlzIGdlbmVyYWwgZW5vdWdoIHRvIGRlZmluZSBhbnkgcXVhbnRpemF0aW9uIHRhYmxlLiAgVGhlIG90aGVyCisJcm91dGluZXMgd2lsbCBzZXQgdXAgdGFibGUgc2xvdCAwIGZvciBsdW1pbmFuY2UgcXVhbGl0eSBhbmQgdGFibGUKKwlzbG90IDEgZm9yIGNocm9taW5hbmNlLgorCitKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdCitKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdCisJUG9pbnRlcnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvbmUgcGVyIHRhYmxlIHNsb3QsIG9yIE5VTEwgaWYKKwlubyB0YWJsZSBpcyBkZWZpbmVkIGZvciBhIHNsb3QuICBTbG90cyAwIGFuZCAxIGFyZSBmaWxsZWQgd2l0aCB0aGUKKwlKUEVHIHNhbXBsZSB0YWJsZXMgYnkganBlZ19zZXRfZGVmYXVsdHMoKS4gIElmIHlvdSBuZWVkIHRvIGFsbG9jYXRlCisJbW9yZSB0YWJsZSBzdHJ1Y3R1cmVzLCBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKSBtYXkgYmUgdXNlZC4KKwlOb3RlIHRoYXQgb3B0aW1hbCBIdWZmbWFuIHRhYmxlcyBjYW4gYmUgY29tcHV0ZWQgZm9yIGFuIGltYWdlCisJYnkgc2V0dGluZyBvcHRpbWl6ZV9jb2RpbmcsIGFzIGRpc2N1c3NlZCBhYm92ZTsgdGhlcmUncyBzZWxkb20KKwlhbnkgbmVlZCB0byBtZXNzIHdpdGggcHJvdmlkaW5nIHlvdXIgb3duIEh1ZmZtYW4gdGFibGVzLgorCitUaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIGNpbmZvIGZpZWxkcyB3aGljaCBhcmUgbm90IGRvY3VtZW50ZWQgaGVyZQorYmVjYXVzZSB5b3UgY3VycmVudGx5IGNhbid0IGNoYW5nZSB0aGVtOyBmb3IgZXhhbXBsZSwgeW91IGNhbid0IHNldAorYXJpdGhfY29kZSBUUlVFIGJlY2F1c2UgYXJpdGhtZXRpYyBjb2RpbmcgaXMgdW5zdXBwb3J0ZWQuCisKKworUGVyLWNvbXBvbmVudCBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIHN0cnVjdCBjaW5mby5jb21wX2luZm9baV0gZm9yCitjb21wb25lbnQgbnVtYmVyIGkuICBOb3RlIHRoYXQgY29tcG9uZW50cyBoZXJlIHJlZmVyIHRvIGNvbXBvbmVudHMgb2YgdGhlCitKUEVHIGNvbG9yIHNwYWNlLCAqbm90KiB0aGUgc291cmNlIGltYWdlIGNvbG9yIHNwYWNlLiAgQSBzdWl0YWJseSBsYXJnZQorY29tcF9pbmZvW10gYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IGpwZWdfc2V0X2RlZmF1bHRzKCk7IGlmIHlvdSBjaG9vc2Ugbm90Cit0byB1c2UgdGhhdCByb3V0aW5lLCBpdCdzIHVwIHRvIHlvdSB0byBhbGxvY2F0ZSB0aGUgYXJyYXkuCisKK2ludCBjb21wb25lbnRfaWQKKwlUaGUgb25lLWJ5dGUgaWRlbnRpZmllciBjb2RlIHRvIGJlIHJlY29yZGVkIGluIHRoZSBKUEVHIGZpbGUgZm9yCisJdGhpcyBjb21wb25lbnQuICBGb3IgdGhlIHN0YW5kYXJkIGNvbG9yIHNwYWNlcywgd2UgcmVjb21tZW5kIHlvdQorCWxlYXZlIHRoZSBkZWZhdWx0IHZhbHVlcyBhbG9uZS4KKworaW50IGhfc2FtcF9mYWN0b3IKK2ludCB2X3NhbXBfZmFjdG9yCisJSG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2FtcGxpbmcgZmFjdG9ycyBmb3IgdGhlIGNvbXBvbmVudDsgbXVzdAorCWJlIDEuLjQgYWNjb3JkaW5nIHRvIHRoZSBKUEVHIHN0YW5kYXJkLiAgTm90ZSB0aGF0IGxhcmdlciBzYW1wbGluZworCWZhY3RvcnMgaW5kaWNhdGUgYSBoaWdoZXItcmVzb2x1dGlvbiBjb21wb25lbnQ7IG1hbnkgcGVvcGxlIGZpbmQKKwl0aGlzIGJlaGF2aW9yIHF1aXRlIHVuaW50dWl0aXZlLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSAyLDIgZm9yCisJbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kIDEsMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cywgZXhjZXB0CisJZm9yIGdyYXlzY2FsZSB3aGVyZSAxLDEgaXMgdXNlZC4KKworaW50IHF1YW50X3RibF9ubworCVF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIgZm9yIGNvbXBvbmVudC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisJMCBmb3IgbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisKK2ludCBkY190Ymxfbm8KK2ludCBhY190Ymxfbm8KKwlEQyBhbmQgQUMgZW50cm9weSBjb2RpbmcgdGFibGUgbnVtYmVycy4gIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUKKwkwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KKworaW50IGNvbXBvbmVudF9pbmRleAorCU11c3QgZXF1YWwgdGhlIGNvbXBvbmVudCdzIGluZGV4IGluIGNvbXBfaW5mb1tdLiAgKEJlZ2lubmluZyBpbgorCXJlbGVhc2UgdjYsIHRoZSBjb21wcmVzc29yIGxpYnJhcnkgd2lsbCBmaWxsIHRoaXMgaW4gYXV0b21hdGljYWxseTsKKwl5b3UgZG9uJ3QgaGF2ZSB0by4pCisKKworRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uIGlzIHNvbWV3aGF0IHNpbXBsZXIgdGhhbiBjb21wcmVzc2lvbgorcGFyYW1ldGVyIHNlbGVjdGlvbiwgc2luY2UgYWxsIG9mIHRoZSBKUEVHIGludGVybmFsIHBhcmFtZXRlcnMgYXJlCityZWNvcmRlZCBpbiB0aGUgc291cmNlIGZpbGUgYW5kIG5lZWQgbm90IGJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyhVbmxlc3MgeW91IGFyZSB3b3JraW5nIHdpdGggYWJicmV2aWF0ZWQgZmlsZXMsIGluIHdoaWNoIGNhc2Ugc2VlCisiQWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMiLCBiZWxvdy4pICBEZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgY29udHJvbAordGhlIHBvc3Rwcm9jZXNzaW5nIGRvbmUgb24gdGhlIGltYWdlIHRvIGRlbGl2ZXIgaXQgaW4gYSBmb3JtYXQgc3VpdGFibGUKK2ZvciB0aGUgYXBwbGljYXRpb24ncyB1c2UuICBNYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGNvbnRyb2wgc3BlZWQvcXVhbGl0eQordHJhZGVvZmZzLCBpbiB3aGljaCBmYXN0ZXIgZGVjb21wcmVzc2lvbiBtYXkgYmUgb2J0YWluZWQgYXQgdGhlIHByaWNlIG9mCithIHBvb3Jlci1xdWFsaXR5IGltYWdlLiAgVGhlIGRlZmF1bHRzIHNlbGVjdCB0aGUgaGlnaGVzdCBxdWFsaXR5IChzbG93ZXN0KQorcHJvY2Vzc2luZy4KKworVGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gdGhlIEpQRUcgb2JqZWN0IGFyZSBzZXQgYnkganBlZ19yZWFkX2hlYWRlcigpIGFuZAorbWF5IGJlIHVzZWZ1bCB0byB0aGUgYXBwbGljYXRpb24gaW4gY2hvb3NpbmcgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzOgorCitKRElNRU5TSU9OIGltYWdlX3dpZHRoCQkJV2lkdGggYW5kIGhlaWdodCBvZiBpbWFnZQorSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQKK2ludCBudW1fY29tcG9uZW50cwkJCU51bWJlciBvZiBjb2xvciBjb21wb25lbnRzCitKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2UJCUNvbG9yc3BhY2Ugb2YgaW1hZ2UKK2Jvb2xlYW4gc2F3X0pGSUZfbWFya2VyCQkJVFJVRSBpZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIHNlZW4KKyAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uCQlWZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gSkZJRiBtYXJrZXIKKyAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uCisgIFVJTlQ4IGRlbnNpdHlfdW5pdAkJCVJlc29sdXRpb24gZGF0YSBmcm9tIEpGSUYgbWFya2VyCisgIFVJTlQxNiBYX2RlbnNpdHkKKyAgVUlOVDE2IFlfZGVuc2l0eQorYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyCQlUUlVFIGlmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgc2VlbgorICBVSU5UOCBBZG9iZV90cmFuc2Zvcm0JCQlDb2xvciB0cmFuc2Zvcm0gY29kZSBmcm9tIEFkb2JlIG1hcmtlcgorCitUaGUgSlBFRyBjb2xvciBzcGFjZSwgdW5mb3J0dW5hdGVseSwgaXMgc29tZXRoaW5nIG9mIGEgZ3Vlc3Mgc2luY2UgdGhlIEpQRUcKK3N0YW5kYXJkIHByb3BlciBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIHJlY29yZCBpdC4gIEluIHByYWN0aWNlIG1vc3QgZmlsZXMKK2FkaGVyZSB0byB0aGUgSkZJRiBvciBBZG9iZSBjb252ZW50aW9ucywgYW5kIHRoZSBkZWNvZGVyIHdpbGwgcmVjb2duaXplIHRoZXNlCitjb3JyZWN0bHkuICBTZWUgIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGZvciBtb3JlIGluZm8uCisKKworVGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IGRldGVybWluZSB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUKK3JldHVybmVkIGltYWdlIGFyZToKKworSl9DT0xPUl9TUEFDRSBvdXRfY29sb3Jfc3BhY2UKKwlPdXRwdXQgY29sb3Igc3BhY2UuICBqcGVnX3JlYWRfaGVhZGVyKCkgc2V0cyBhbiBhcHByb3ByaWF0ZSBkZWZhdWx0CisJYmFzZWQgb24ganBlZ19jb2xvcl9zcGFjZTsgdHlwaWNhbGx5IGl0IHdpbGwgYmUgUkdCIG9yIGdyYXlzY2FsZS4KKwlUaGUgYXBwbGljYXRpb24gY2FuIGNoYW5nZSB0aGlzIGZpZWxkIHRvIHJlcXVlc3Qgb3V0cHV0IGluIGEgZGlmZmVyZW50CisJY29sb3JzcGFjZS4gIEZvciBleGFtcGxlLCBzZXQgaXQgdG8gSkNTX0dSQVlTQ0FMRSB0byBnZXQgZ3JheXNjYWxlCisJb3V0cHV0IGZyb20gYSBjb2xvciBmaWxlLiAgKFRoaXMgaXMgdXNlZnVsIGZvciBwcmV2aWV3aW5nOiBncmF5c2NhbGUKKwlvdXRwdXQgaXMgZmFzdGVyIHRoYW4gZnVsbCBjb2xvciBzaW5jZSB0aGUgY29sb3IgY29tcG9uZW50cyBuZWVkIG5vdAorCWJlIHByb2Nlc3NlZC4pICBOb3RlIHRoYXQgbm90IGFsbCBwb3NzaWJsZSBjb2xvciBzcGFjZSB0cmFuc2Zvcm1zIGFyZQorCWN1cnJlbnRseSBpbXBsZW1lbnRlZDsgeW91IG1heSBuZWVkIHRvIGV4dGVuZCBqZGNvbG9yLmMgaWYgeW91IHdhbnQgYW4KKwl1bnVzdWFsIGNvbnZlcnNpb24uCisKK3Vuc2lnbmVkIGludCBzY2FsZV9udW0sIHNjYWxlX2Rlbm9tCisJU2NhbGUgdGhlIGltYWdlIGJ5IHRoZSBmcmFjdGlvbiBzY2FsZV9udW0vc2NhbGVfZGVub20uICBEZWZhdWx0IGlzCisJMS8xLCBvciBubyBzY2FsaW5nLiAgQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgc2NhbGluZyByYXRpb3MKKwlhcmUgMS8xLCAxLzIsIDEvNCwgYW5kIDEvOC4gIChUaGUgbGlicmFyeSBkZXNpZ24gYWxsb3dzIGZvciBhcmJpdHJhcnkKKwlzY2FsaW5nIHJhdGlvcyBidXQgdGhpcyBpcyBub3QgbGlrZWx5IHRvIGJlIGltcGxlbWVudGVkIGFueSB0aW1lIHNvb24uKQorCVNtYWxsZXIgc2NhbGluZyByYXRpb3MgcGVybWl0IHNpZ25pZmljYW50bHkgZmFzdGVyIGRlY29kaW5nIHNpbmNlCisJZmV3ZXIgcGl4ZWxzIG5lZWQgYmUgcHJvY2Vzc2VkIGFuZCBhIHNpbXBsZXIgSURDVCBtZXRob2QgY2FuIGJlIHVzZWQuCisKK2Jvb2xlYW4gcXVhbnRpemVfY29sb3JzCisJSWYgc2V0IFRSVUUsIGNvbG9ybWFwcGVkIG91dHB1dCB3aWxsIGJlIGRlbGl2ZXJlZC4gIERlZmF1bHQgaXMgRkFMU0UsCisJbWVhbmluZyB0aGF0IGZ1bGwtY29sb3Igb3V0cHV0IHdpbGwgYmUgZGVsaXZlcmVkLgorCitUaGUgbmV4dCB0aHJlZSBwYXJhbWV0ZXJzIGFyZSByZWxldmFudCBvbmx5IGlmIHF1YW50aXplX2NvbG9ycyBpcyBUUlVFLgorCitpbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzCisJTWF4aW11bSBudW1iZXIgb2YgY29sb3JzIHRvIHVzZSBpbiBnZW5lcmF0aW5nIGEgbGlicmFyeS1zdXBwbGllZCBjb2xvcgorCW1hcCAodGhlIGFjdHVhbCBudW1iZXIgb2YgY29sb3JzIGlzIHJldHVybmVkIGluIGEgZGlmZmVyZW50IGZpZWxkKS4KKwlEZWZhdWx0IDI1Ni4gIElnbm9yZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gc3VwcGxpZXMgaXRzIG93biBjb2xvciBtYXAuCisKK2Jvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemUKKwlJZiBUUlVFLCBhbiBleHRyYSBwYXNzIG92ZXIgdGhlIGltYWdlIGlzIG1hZGUgdG8gc2VsZWN0IGEgY3VzdG9tIGNvbG9yCisJbWFwIGZvciB0aGUgaW1hZ2UuICBUaGlzIHVzdWFsbHkgbG9va3MgYSBsb3QgYmV0dGVyIHRoYW4gdGhlIG9uZS1zaXplLQorCWZpdHMtYWxsIGNvbG9ybWFwIHRoYXQgaXMgdXNlZCBvdGhlcndpc2UuICBEZWZhdWx0IGlzIFRSVUUuICBJZ25vcmVkCisJd2hlbiB0aGUgYXBwbGljYXRpb24gc3VwcGxpZXMgaXRzIG93biBjb2xvciBtYXAuCisKK0pfRElUSEVSX01PREUgZGl0aGVyX21vZGUKKwlTZWxlY3RzIGNvbG9yIGRpdGhlcmluZyBtZXRob2QuICBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKKwkJSkRJVEhFUl9OT05FCW5vIGRpdGhlcmluZzogZmFzdCwgdmVyeSBsb3cgcXVhbGl0eQorCQlKRElUSEVSX09SREVSRUQJb3JkZXJlZCBkaXRoZXI6IG1vZGVyYXRlIHNwZWVkIGFuZCBxdWFsaXR5CisJCUpESVRIRVJfRlMJRmxveWQtU3RlaW5iZXJnIGRpdGhlcjogc2xvdywgaGlnaCBxdWFsaXR5CisJRGVmYXVsdCBpcyBKRElUSEVSX0ZTLiAgKEF0IHByZXNlbnQsIG9yZGVyZWQgZGl0aGVyIGlzIGltcGxlbWVudGVkCisJb25seSBpbiB0aGUgc2luZ2xlLXBhc3MsIHN0YW5kYXJkLWNvbG9ybWFwIGNhc2UuICBJZiB5b3UgYXNrIGZvcgorCW9yZGVyZWQgZGl0aGVyIHdoZW4gdHdvX3Bhc3NfcXVhbnRpemUgaXMgVFJVRSBvciB3aGVuIHlvdSBzdXBwbHkKKwlhbiBleHRlcm5hbCBjb2xvciBtYXAsIHlvdSdsbCBnZXQgRi1TIGRpdGhlcmluZy4pCisKK1doZW4gcXVhbnRpemVfY29sb3JzIGlzIFRSVUUsIHRoZSB0YXJnZXQgY29sb3IgbWFwIGlzIGRlc2NyaWJlZCBieSB0aGUgbmV4dAordHdvIGZpZWxkcy4gIGNvbG9ybWFwIGlzIHNldCB0byBOVUxMIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gIFRoZSBhcHBsaWNhdGlvbgorY2FuIHN1cHBseSBhIGNvbG9yIG1hcCBieSBzZXR0aW5nIGNvbG9ybWFwIG5vbi1OVUxMIGFuZCBzZXR0aW5nCithY3R1YWxfbnVtYmVyX29mX2NvbG9ycyB0byB0aGUgbWFwIHNpemUuICBPdGhlcndpc2UsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpCitzZWxlY3RzIGEgc3VpdGFibGUgY29sb3IgbWFwIGFuZCBzZXRzIHRoZXNlIHR3byBmaWVsZHMgaXRzZWxmLgorW0ltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uOiBhdCBwcmVzZW50LCBhbiBleHRlcm5hbGx5IHN1cHBsaWVkIGNvbG9ybWFwIGlzCitvbmx5IGFjY2VwdGVkIGZvciAzLWNvbXBvbmVudCBvdXRwdXQgY29sb3Igc3BhY2VzLl0KKworSlNBTVBBUlJBWSBjb2xvcm1hcAorCVRoZSBjb2xvciBtYXAsIHJlcHJlc2VudGVkIGFzIGEgMi1EIHBpeGVsIGFycmF5IG9mIG91dF9jb2xvcl9jb21wb25lbnRzCisJcm93cyBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgY29sdW1ucy4gIElnbm9yZWQgaWYgbm90IHF1YW50aXppbmcuCisJQ0FVVElPTjogaWYgdGhlIEpQRUcgbGlicmFyeSBjcmVhdGVzIGl0cyBvd24gY29sb3JtYXAsIHRoZSBzdG9yYWdlCisJcG9pbnRlZCB0byBieSB0aGlzIGZpZWxkIGlzIHJlbGVhc2VkIGJ5IGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4KKwlDb3B5IHRoZSBjb2xvcm1hcCBzb21ld2hlcmUgZWxzZSBmaXJzdCwgaWYgeW91IHdhbnQgdG8gc2F2ZSBpdC4KKworaW50IGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzCisJVGhlIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIGNvbG9yIG1hcC4KKworQWRkaXRpb25hbCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdGhhdCB0aGUgYXBwbGljYXRpb24gbWF5IHNldCBpbmNsdWRlOgorCitKX0RDVF9NRVRIT0QgZGN0X21ldGhvZAorCVNlbGVjdHMgdGhlIGFsZ29yaXRobSB1c2VkIGZvciB0aGUgRENUIHN0ZXAuICBDaG9pY2VzIGFyZSB0aGUgc2FtZQorCWFzIGRlc2NyaWJlZCBhYm92ZSBmb3IgY29tcHJlc3Npb24uCisKK2Jvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZworCUlmIFRSVUUsIGRvIGNhcmVmdWwgdXBzYW1wbGluZyBvZiBjaHJvbWEgY29tcG9uZW50cy4gIElmIEZBTFNFLAorCWEgZmFzdGVyIGJ1dCBzbG9wcGllciBtZXRob2QgaXMgdXNlZC4gIERlZmF1bHQgaXMgVFJVRS4gIFRoZSB2aXN1YWwKKwlpbXBhY3Qgb2YgdGhlIHNsb3BwaWVyIG1ldGhvZCBpcyBvZnRlbiB2ZXJ5IHNtYWxsLgorCitib29sZWFuIGRvX2Jsb2NrX3Ntb290aGluZworCUlmIFRSVUUsIGludGVyYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpZWQgaW4gZWFybHkgc3RhZ2VzIG9mIGRlY29kaW5nCisJcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlczsgaWYgRkFMU0UsIG5vdC4gIERlZmF1bHQgaXMgVFJVRS4gIEVhcmx5CisJcHJvZ3Jlc3Npb24gc3RhZ2VzIGxvb2sgImZ1enp5IiB3aXRoIHNtb290aGluZywgImJsb2NreSIgd2l0aG91dC4KKwlJbiBhbnkgY2FzZSwgYmxvY2sgc21vb3RoaW5nIGNlYXNlcyB0byBiZSBhcHBsaWVkIGFmdGVyIHRoZSBmaXJzdCBmZXcKKwlBQyBjb2VmZmljaWVudHMgYXJlIGtub3duIHRvIGZ1bGwgYWNjdXJhY3ksIHNvIGl0IGlzIHJlbGV2YW50IG9ubHkKKwl3aGVuIHVzaW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUgZm9yIHByb2dyZXNzaXZlIGltYWdlcy4KKworYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQKK2Jvb2xlYW4gZW5hYmxlX2V4dGVybmFsX3F1YW50Citib29sZWFuIGVuYWJsZV8ycGFzc19xdWFudAorCVRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHdoaWNoIGlzCisJZGVzY3JpYmVkIGluIGl0cyBvd24gc2VjdGlvbiBiZWxvdy4KKworCitUaGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYXJlIGdpdmVuIGJ5IHRoZSBmb2xsb3dpbmcgZmllbGRzLiAgVGhlc2UgYXJlCitjb21wdXRlZCBmcm9tIHRoZSBzb3VyY2UgaW1hZ2UgZGltZW5zaW9ucyBhbmQgdGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycworYnkganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBZb3UgY2FuIGFsc28gY2FsbCBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKQordG8gb2J0YWluIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIHJlc3VsdCBmcm9tIHRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXR0aW5ncy4KK1RoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgYXJlIHRyeWluZyB0byBwaWNrIGEgc2NhbGluZyByYXRpbyB0aGF0IHdpbGwgZ2V0CitjbG9zZSB0byBhIGRlc2lyZWQgdGFyZ2V0IHNpemUuICBJdCdzIGFsc28gaW1wb3J0YW50IGlmIHlvdSBhcmUgdXNpbmcgdGhlCitKUEVHIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIHNwYWNlLCBiZWNhdXNlIHlvdQorYXJlIHN1cHBvc2VkIHRvIHJlcXVlc3Qgc3VjaCBidWZmZXJzICpiZWZvcmUqIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgorCitKRElNRU5TSU9OIG91dHB1dF93aWR0aAkJQWN0dWFsIGRpbWVuc2lvbnMgb2Ygb3V0cHV0IGltYWdlLgorSkRJTUVOU0lPTiBvdXRwdXRfaGVpZ2h0CitpbnQgb3V0X2NvbG9yX2NvbXBvbmVudHMJTnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlLgoraW50IG91dHB1dF9jb21wb25lbnRzCQlOdW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZC4KK2ludCByZWNfb3V0YnVmX2hlaWdodAkJUmVjb21tZW5kZWQgaGVpZ2h0IG9mIHNjYW5saW5lIGJ1ZmZlci4KKworV2hlbiBxdWFudGl6aW5nIGNvbG9ycywgb3V0cHV0X2NvbXBvbmVudHMgaXMgMSwgaW5kaWNhdGluZyBhIHNpbmdsZSBjb2xvciBtYXAKK2luZGV4IHBlciBwaXhlbC4gIE90aGVyd2lzZSBpdCBlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuICBUaGUgb3V0cHV0IGFycmF5cworYXJlIHJlcXVpcmVkIHRvIGJlIG91dHB1dF93aWR0aCAqIG91dHB1dF9jb21wb25lbnRzIEpTQU1QTEVzIHdpZGUuCisKK3JlY19vdXRidWZfaGVpZ2h0IGlzIHRoZSByZWNvbW1lbmRlZCBtaW5pbXVtIGhlaWdodCAoaW4gc2NhbmxpbmVzKSBvZiB0aGUKK2J1ZmZlciBwYXNzZWQgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpLiAgSWYgdGhlIGJ1ZmZlciBpcyBzbWFsbGVyLCB0aGUKK2xpYnJhcnkgd2lsbCBzdGlsbCB3b3JrLCBidXQgdGltZSB3aWxsIGJlIHdhc3RlZCBkdWUgdG8gdW5uZWNlc3NhcnkgZGF0YQorY29weWluZy4gIEluIGhpZ2gtcXVhbGl0eSBtb2RlcywgcmVjX291dGJ1Zl9oZWlnaHQgaXMgYWx3YXlzIDEsIGJ1dCBzb21lCitmYXN0ZXIsIGxvd2VyLXF1YWxpdHkgbW9kZXMgc2V0IGl0IHRvIGxhcmdlciB2YWx1ZXMgKHR5cGljYWxseSAyIHRvIDQpLgorSWYgeW91IGFyZSBnb2luZyB0byBhc2sgZm9yIGEgaGlnaC1zcGVlZCBwcm9jZXNzaW5nIG1vZGUsIHlvdSBtYXkgYXMgd2VsbAorZ28gdG8gdGhlIHRyb3VibGUgb2YgaG9ub3JpbmcgcmVjX291dGJ1Zl9oZWlnaHQgc28gYXMgdG8gYXZvaWQgZGF0YSBjb3B5aW5nLgorKEFuIG91dHB1dCBidWZmZXIgbGFyZ2VyIHRoYW4gcmVjX291dGJ1Zl9oZWlnaHQgbGluZXMgaXMgT0ssIGJ1dCB3b24ndAorcHJvdmlkZSBhbnkgbWF0ZXJpYWwgc3BlZWQgaW1wcm92ZW1lbnQgb3ZlciB0aGF0IGhlaWdodC4pCisKKworU3BlY2lhbCBjb2xvciBzcGFjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBKUEVHIHN0YW5kYXJkIGl0c2VsZiBpcyAiY29sb3IgYmxpbmQiIGFuZCBkb2Vzbid0IHNwZWNpZnkgYW55IHBhcnRpY3VsYXIKK2NvbG9yIHNwYWNlLiAgSXQgaXMgY3VzdG9tYXJ5IHRvIGNvbnZlcnQgY29sb3IgZGF0YSB0byBhIGx1bWluYW5jZS9jaHJvbWluYW5jZQorY29sb3Igc3BhY2UgYmVmb3JlIGNvbXByZXNzaW5nLCBzaW5jZSB0aGlzIHBlcm1pdHMgZ3JlYXRlciBjb21wcmVzc2lvbi4gIFRoZQorZXhpc3RpbmcgZGUtZmFjdG8gSlBFRyBmaWxlIGZvcm1hdCBzdGFuZGFyZHMgc3BlY2lmeSBZQ2JDciBvciBncmF5c2NhbGUgZGF0YQorKEpGSUYpLCBvciBncmF5c2NhbGUsIFJHQiwgWUNiQ3IsIENNWUssIG9yIFlDQ0sgKEFkb2JlKS4gIEZvciBzcGVjaWFsCithcHBsaWNhdGlvbnMgc3VjaCBhcyBtdWx0aXNwZWN0cmFsIGltYWdlcywgb3RoZXIgY29sb3Igc3BhY2VzIGNhbiBiZSB1c2VkLAorYnV0IGl0IG11c3QgYmUgdW5kZXJzdG9vZCB0aGF0IHN1Y2ggZmlsZXMgd2lsbCBiZSB1bnBvcnRhYmxlLgorCitUaGUgSlBFRyBsaWJyYXJ5IGNhbiBoYW5kbGUgdGhlIG1vc3QgY29tbW9uIGNvbG9yc3BhY2UgY29udmVyc2lvbnMgKG5hbWVseQorUkdCIDw9PiBZQ2JDciBhbmQgQ01ZSyA8PT4gWUNDSykuICBJdCBjYW4gYWxzbyBkZWFsIHdpdGggZGF0YSBvZiBhbiB1bmtub3duCitjb2xvciBzcGFjZSwgcGFzc2luZyBpdCB0aHJvdWdoIHdpdGhvdXQgY29udmVyc2lvbi4gIElmIHlvdSBkZWFsIGV4dGVuc2l2ZWx5Cit3aXRoIGFuIHVudXN1YWwgY29sb3Igc3BhY2UsIHlvdSBjYW4gZWFzaWx5IGV4dGVuZCB0aGUgbGlicmFyeSB0byB1bmRlcnN0YW5kCithZGRpdGlvbmFsIGNvbG9yIHNwYWNlcyBhbmQgcGVyZm9ybSBhcHByb3ByaWF0ZSBjb252ZXJzaW9ucy4KKworRm9yIGNvbXByZXNzaW9uLCB0aGUgc291cmNlIGRhdGEncyBjb2xvciBzcGFjZSBpcyBzcGVjaWZpZWQgYnkgZmllbGQKK2luX2NvbG9yX3NwYWNlLiAgVGhpcyBpcyB0cmFuc2Zvcm1lZCB0byB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgZ2l2ZW4KK2J5IGpwZWdfY29sb3Jfc3BhY2UuICBqcGVnX3NldF9kZWZhdWx0cygpIGNob29zZXMgYSByZWFzb25hYmxlIEpQRUcgY29sb3IKK3NwYWNlIGRlcGVuZGluZyBvbiBpbl9jb2xvcl9zcGFjZSwgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSBjYWxsaW5nCitqcGVnX3NldF9jb2xvcnNwYWNlKCkuICBPZiBjb3Vyc2UgeW91IG11c3Qgc2VsZWN0IGEgc3VwcG9ydGVkIHRyYW5zZm9ybWF0aW9uLgoramNjb2xvci5jIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9uczoKKwlSR0IgPT4gWUNiQ3IKKwlSR0IgPT4gR1JBWVNDQUxFCisJWUNiQ3IgPT4gR1JBWVNDQUxFCisJQ01ZSyA9PiBZQ0NLCitwbHVzIHRoZSBudWxsIHRyYW5zZm9ybXM6IEdSQVlTQ0FMRSA9PiBHUkFZU0NBTEUsIFJHQiA9PiBSR0IsCitZQ2JDciA9PiBZQ2JDciwgQ01ZSyA9PiBDTVlLLCBZQ0NLID0+IFlDQ0ssIGFuZCBVTktOT1dOID0+IFVOS05PV04uCisKK1RoZSBkZS1mYWN0byBmaWxlIGZvcm1hdCBzdGFuZGFyZHMgKEpGSUYgYW5kIEFkb2JlKSBzcGVjaWZ5IEFQUG4gbWFya2VycyB0aGF0CitpbmRpY2F0ZSB0aGUgY29sb3Igc3BhY2Ugb2YgdGhlIEpQRUcgZmlsZS4gIEl0IGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhhdAordGhlc2UgYXJlIHdyaXR0ZW4gY29ycmVjdGx5LCBvciBvbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBpcyBub3QKK29uZSBvZiB0aGUgb25lcyBzdXBwb3J0ZWQgYnkgdGhlIGRlLWZhY3RvIHN0YW5kYXJkcy4gIGpwZWdfc2V0X2NvbG9yc3BhY2UoKQord2lsbCBzZXQgdGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBvciBvbWl0IHRoZSBBUFBuIG1hcmtlcnMKK3Byb3Blcmx5LCBzbyBsb25nIGFzIGl0IGlzIHRvbGQgdGhlIHRydXRoIGFib3V0IHRoZSBKUEVHIGNvbG9yIHNwYWNlLgorRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyBzb21lIHJhbmRvbSAzLWNvbXBvbmVudCBjb2xvciBzcGFjZSB3aXRob3V0Citjb252ZXJzaW9uLCBkb24ndCB0cnkgdG8gZmFrZSBvdXQgdGhlIGxpYnJhcnkgYnkgc2V0dGluZyBpbl9jb2xvcl9zcGFjZSBhbmQKK2pwZWdfY29sb3Jfc3BhY2UgdG8gSkNTX1lDYkNyOyB1c2UgSkNTX1VOS05PV04uICBZb3UgbWF5IHdhbnQgdG8gd3JpdGUgYW4KK0FQUG4gbWFya2VyIG9mIHlvdXIgb3duIGRldmlzaW5nIHRvIGlkZW50aWZ5IHRoZSBjb2xvcnNwYWNlIC0tLSBzZWUgIlNwZWNpYWwKK21hcmtlcnMiLCBiZWxvdy4KKworV2hlbiB0b2xkIHRoYXQgdGhlIGNvbG9yIHNwYWNlIGlzIFVOS05PV04sIHRoZSBsaWJyYXJ5IHdpbGwgZGVmYXVsdCB0byB1c2luZworbHVtaW5hbmNlLXF1YWxpdHkgY29tcHJlc3Npb24gcGFyYW1ldGVycyBmb3IgYWxsIGNvbG9yIGNvbXBvbmVudHMuICBZb3UgbWF5Cit3ZWxsIHdhbnQgdG8gY2hhbmdlIHRoZXNlIHBhcmFtZXRlcnMuICBTZWUgdGhlIHNvdXJjZSBjb2RlIGZvcgoranBlZ19zZXRfY29sb3JzcGFjZSgpLCBpbiBqY3BhcmFtLmMsIGZvciBkZXRhaWxzLgorCitGb3IgZGVjb21wcmVzc2lvbiwgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGlzIGdpdmVuIGluIGpwZWdfY29sb3Jfc3BhY2UsCithbmQgdGhpcyBpcyB0cmFuc2Zvcm1lZCB0byB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlIG91dF9jb2xvcl9zcGFjZS4KK2pwZWdfcmVhZF9oZWFkZXIncyBzZXR0aW5nIG9mIGpwZWdfY29sb3Jfc3BhY2UgY2FuIGJlIHJlbGllZCBvbiBpZiB0aGUgZmlsZQorY29uZm9ybXMgdG8gSkZJRiBvciBBZG9iZSBjb252ZW50aW9ucywgYnV0IG90aGVyd2lzZSBpdCBpcyBubyBiZXR0ZXIgdGhhbiBhCitndWVzcy4gIElmIHlvdSBrbm93IHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBmb3IgY2VydGFpbiwgeW91IGNhbiBvdmVycmlkZQoranBlZ19yZWFkX2hlYWRlcidzIGd1ZXNzIGJ5IHNldHRpbmcganBlZ19jb2xvcl9zcGFjZS4gIGpwZWdfcmVhZF9oZWFkZXIgYWxzbworc2VsZWN0cyBhIGRlZmF1bHQgb3V0cHV0IGNvbG9yIHNwYWNlIGJhc2VkIG9uIChpdHMgZ3Vlc3Mgb2YpIGpwZWdfY29sb3Jfc3BhY2U7CitzZXQgb3V0X2NvbG9yX3NwYWNlIHRvIG92ZXJyaWRlIHRoaXMuICBBZ2FpbiwgeW91IG11c3Qgc2VsZWN0IGEgc3VwcG9ydGVkCit0cmFuc2Zvcm1hdGlvbi4gIGpkY29sb3IuYyBjdXJyZW50bHkgc3VwcG9ydHMKKwlZQ2JDciA9PiBHUkFZU0NBTEUKKwlZQ2JDciA9PiBSR0IKKwlHUkFZU0NBTEUgPT4gUkdCCisJWUNDSyA9PiBDTVlLCithcyB3ZWxsIGFzIHRoZSBudWxsIHRyYW5zZm9ybXMuICAoU2luY2UgR1JBWVNDQUxFPT5SR0IgaXMgcHJvdmlkZWQsIGFuCithcHBsaWNhdGlvbiBjYW4gZm9yY2UgZ3JheXNjYWxlIEpQRUdzIHRvIGxvb2sgbGlrZSBjb2xvciBKUEVHcyBpZiBpdCBvbmx5Cit3YW50cyB0byBoYW5kbGUgb25lIGNhc2UuKQorCitUaGUgdHdvLXBhc3MgY29sb3IgcXVhbnRpemVyLCBqcXVhbnQyLmMsIGlzIHNwZWNpYWxpemVkIHRvIGhhbmRsZSBSR0IgZGF0YQorKGl0IHdlaWdodHMgZGlzdGFuY2VzIGFwcHJvcHJpYXRlbHkgZm9yIFJHQiBjb2xvcnMpLiAgWW91J2xsIG5lZWQgdG8gbW9kaWZ5Cit0aGUgY29kZSBpZiB5b3Ugd2FudCB0byB1c2UgaXQgZm9yIG5vbi1SR0Igb3V0cHV0IGNvbG9yIHNwYWNlcy4gIE5vdGUgdGhhdAoranF1YW50Mi5jIGlzIHVzZWQgdG8gbWFwIHRvIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGNvbG9ybWFwIGFzIHdlbGwgYXMgZm9yCit0aGUgbm9ybWFsIHR3by1wYXNzIGNvbG9ybWFwIHNlbGVjdGlvbiBwcm9jZXNzLgorCitDQVVUSU9OOiBpdCBhcHBlYXJzIHRoYXQgQWRvYmUgUGhvdG9zaG9wIHdyaXRlcyBpbnZlcnRlZCBkYXRhIGluIENNWUsgSlBFRworZmlsZXM6IDAgcmVwcmVzZW50cyAxMDAlIGluayBjb3ZlcmFnZSwgcmF0aGVyIHRoYW4gMCUgaW5rIGFzIHlvdSdkIGV4cGVjdC4KK1RoaXMgaXMgYXJndWFibHkgYSBidWcgaW4gUGhvdG9zaG9wLCBidXQgaWYgeW91IG5lZWQgdG8gd29yayB3aXRoIFBob3Rvc2hvcAorQ01ZSyBmaWxlcywgeW91IHdpbGwgaGF2ZSB0byBkZWFsIHdpdGggaXQgaW4geW91ciBhcHBsaWNhdGlvbi4gIFdlIGNhbm5vdAorImZpeCIgdGhpcyBpbiB0aGUgbGlicmFyeSBieSBpbnZlcnRpbmcgdGhlIGRhdGEgZHVyaW5nIHRoZSBDTVlLPD0+WUNDSwordHJhbnNmb3JtLCBiZWNhdXNlIHRoYXQgd291bGQgYnJlYWsgb3RoZXIgYXBwbGljYXRpb25zLCBub3RhYmx5IEdob3N0c2NyaXB0LgorUGhvdG9zaG9wIHZlcnNpb25zIHByaW9yIHRvIDMuMCB3cml0ZSBFUFMgZmlsZXMgY29udGFpbmluZyBKUEVHLWVuY29kZWQgQ01ZSworZGF0YSBpbiB0aGUgc2FtZSBpbnZlcnRlZC1ZQ0NLIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gYmFyZSBKUEVHIGZpbGVzLCBidXQKK3RoZSBzdXJyb3VuZGluZyBQb3N0U2NyaXB0IGNvZGUgcGVyZm9ybXMgYW4gaW52ZXJzaW9uIHVzaW5nIHRoZSBQUyBpbWFnZQorb3BlcmF0b3IuICBJIGFtIHRvbGQgdGhhdCBQaG90b3Nob3AgMy4wIHdpbGwgd3JpdGUgdW5pbnZlcnRlZCBZQ0NLIGluCitFUFMvSlBFRyBmaWxlcywgYW5kIHdpbGwgb21pdCB0aGUgUFMtbGV2ZWwgaW52ZXJzaW9uLiAgKEJ1dCB0aGUgZGF0YQorcG9sYXJpdHkgdXNlZCBpbiBiYXJlIEpQRUcgZmlsZXMgd2lsbCBub3QgY2hhbmdlIGluIDMuMC4pICBJbiBlaXRoZXIgY2FzZSwKK3RoZSBKUEVHIGxpYnJhcnkgbXVzdCBub3QgaW52ZXJ0IHRoZSBkYXRhIGl0c2VsZiwgb3IgZWxzZSBHaG9zdHNjcmlwdCB3b3VsZAorcmVhZCB0aGVzZSBFUFMgZmlsZXMgaW5jb3JyZWN0bHkuCisKKworRXJyb3IgaGFuZGxpbmcKKy0tLS0tLS0tLS0tLS0tCisKK1doZW4gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBpcyB1c2VkLCBhbnkgZXJyb3IgZGV0ZWN0ZWQgaW5zaWRlIHRoZSBKUEVHCityb3V0aW5lcyB3aWxsIGNhdXNlIGEgbWVzc2FnZSB0byBiZSBwcmludGVkIG9uIHN0ZGVyciwgZm9sbG93ZWQgYnkgZXhpdCgpLgorWW91IGNhbiBzdXBwbHkgeW91ciBvd24gZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvcgorYW5kIHRvIGNvbnRyb2wgdGhlIHRyZWF0bWVudCBvZiBub25mYXRhbCB3YXJuaW5ncyBhbmQgdHJhY2UvZGVidWcgbWVzc2FnZXMuCitUaGUgZmlsZSBleGFtcGxlLmMgaWxsdXN0cmF0ZXMgdGhlIG1vc3QgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHRvIGhhdmUgdGhlCithcHBsaWNhdGlvbiByZWdhaW4gY29udHJvbCBhZnRlciBhbiBlcnJvciByYXRoZXIgdGhhbiBleGl0aW5nLgorCitUaGUgSlBFRyBsaWJyYXJ5IG5ldmVyIHdyaXRlcyBhbnkgbWVzc2FnZSBkaXJlY3RseTsgaXQgYWx3YXlzIGdvZXMgdGhyb3VnaAordGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLiAgVGhyZWUgY2xhc3NlcyBvZiBtZXNzYWdlcyBhcmUgcmVjb2duaXplZDoKKyAgKiBGYXRhbCBlcnJvcnM6IHRoZSBsaWJyYXJ5IGNhbm5vdCBjb250aW51ZS4KKyAgKiBXYXJuaW5nczogdGhlIGxpYnJhcnkgY2FuIGNvbnRpbnVlLCBidXQgdGhlIGRhdGEgaXMgY29ycnVwdCwgYW5kIGEKKyAgICBkYW1hZ2VkIG91dHB1dCBpbWFnZSBpcyBsaWtlbHkgdG8gcmVzdWx0LgorICAqIFRyYWNlL2luZm9ybWF0aW9uYWwgbWVzc2FnZXMuICBUaGVzZSBjb21lIHdpdGggYSB0cmFjZSBsZXZlbCBpbmRpY2F0aW5nCisgICAgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIG1lc3NhZ2U7IHlvdSBjYW4gY29udHJvbCB0aGUgdmVyYm9zaXR5IG9mIHRoZQorICAgIHByb2dyYW0gYnkgYWRqdXN0aW5nIHRoZSBtYXhpbXVtIHRyYWNlIGxldmVsIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQuCisKK1lvdSBtYXksIGlmIHlvdSB3aXNoLCBzaW1wbHkgcmVwbGFjZSB0aGUgZW50aXJlIEpQRUcgZXJyb3IgaGFuZGxpbmcgbW9kdWxlCisoamVycm9yLmMpIHdpdGggeW91ciBvd24gY29kZS4gIEhvd2V2ZXIsIHlvdSBjYW4gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiBieQorb25seSByZXBsYWNpbmcgc29tZSBvZiB0aGUgcm91dGluZXMgZGVwZW5kaW5nIG9uIHRoZSBiZWhhdmlvciB5b3UgbmVlZC4KK1RoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGNhbGxpbmcganBlZ19zdGRfZXJyb3IoKSBhcyB1c3VhbCwgYnV0IHRoZW4gb3ZlcnJpZGluZworc29tZSBvZiB0aGUgbWV0aG9kIHBvaW50ZXJzIGluIHRoZSBqcGVnX2Vycm9yX21nciBzdHJ1Y3QsIGFzIGlsbHVzdHJhdGVkIGJ5CitleGFtcGxlLmMuCisKK0FsbCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgd2lsbCByZWNlaXZlIGEgcG9pbnRlciB0byB0aGUgSlBFRyBvYmplY3QKKyhhIGpfY29tbW9uX3B0ciB3aGljaCBwb2ludHMgdG8gZWl0aGVyIGEganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IgYQoranBlZ19kZWNvbXByZXNzX3N0cnVjdDsgaWYgeW91IG5lZWQgdG8gdGVsbCB3aGljaCwgdGVzdCB0aGUgaXNfZGVjb21wcmVzc29yCitmaWVsZCkuICBUaGlzIHN0cnVjdCBpbmNsdWRlcyBhIHBvaW50ZXIgdG8gdGhlIGVycm9yIG1hbmFnZXIgc3RydWN0IGluIGl0cworImVyciIgZmllbGQuICBGcmVxdWVudGx5LCBjdXN0b20gZXJyb3IgaGFuZGxlciByb3V0aW5lcyB3aWxsIG5lZWQgdG8gYWNjZXNzCithZGRpdGlvbmFsIGRhdGEgd2hpY2ggaXMgbm90IGtub3duIHRvIHRoZSBKUEVHIGxpYnJhcnkgb3IgdGhlIHN0YW5kYXJkIGVycm9yCitoYW5kbGVyLiAgVGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gZG8gdGhpcyBpcyB0byBlbWJlZCBlaXRoZXIgdGhlIEpQRUcKK29iamVjdCBvciB0aGUganBlZ19lcnJvcl9tZ3Igc3RydWN0IGluIGEgbGFyZ2VyIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCithZGRpdGlvbmFsIGZpZWxkczsgdGhlbiBjYXN0aW5nIHRoZSBwYXNzZWQgcG9pbnRlciBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCithZGRpdGlvbmFsIGZpZWxkcy4gIEFnYWluLCBzZWUgZXhhbXBsZS5jIGZvciBvbmUgd2F5IHRvIGRvIGl0LiAgKEJlZ2lubmluZword2l0aCBJSkcgdmVyc2lvbiA2YiwgdGhlcmUgaXMgYWxzbyBhIHZvaWQgcG9pbnRlciAiY2xpZW50X2RhdGEiIGluIGVhY2gKK0pQRUcgb2JqZWN0LCB3aGljaCB0aGUgYXBwbGljYXRpb24gY2FuIGFsc28gdXNlIHRvIGZpbmQgcmVsYXRlZCBkYXRhLgorVGhlIGxpYnJhcnkgZG9lcyBub3QgdG91Y2ggY2xpZW50X2RhdGEgYXQgYWxsLikKKworVGhlIGluZGl2aWR1YWwgbWV0aG9kcyB0aGF0IHlvdSBtaWdodCB3aXNoIHRvIG92ZXJyaWRlIGFyZToKKworZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQorCVJlY2VpdmVzIGNvbnRyb2wgZm9yIGEgZmF0YWwgZXJyb3IuICBJbmZvcm1hdGlvbiBzdWZmaWNpZW50IHRvCisJZ2VuZXJhdGUgdGhlIGVycm9yIG1lc3NhZ2UgaGFzIGJlZW4gc3RvcmVkIGluIGNpbmZvLT5lcnI7IGNhbGwKKwlvdXRwdXRfbWVzc2FnZSB0byBkaXNwbGF5IGl0LiAgQ29udHJvbCBtdXN0IE5PVCByZXR1cm4gdG8gdGhlIGNhbGxlcjsKKwlnZW5lcmFsbHkgdGhpcyByb3V0aW5lIHdpbGwgZXhpdCgpIG9yIGxvbmdqbXAoKSBzb21ld2hlcmUuCisJVHlwaWNhbGx5IHlvdSB3b3VsZCBvdmVycmlkZSB0aGlzIHJvdXRpbmUgdG8gZ2V0IHJpZCBvZiB0aGUgZXhpdCgpCisJZGVmYXVsdCBiZWhhdmlvci4gIE5vdGUgdGhhdCBpZiB5b3UgY29udGludWUgcHJvY2Vzc2luZywgeW91IHNob3VsZAorCWNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCB3aXRoIGpwZWdfYWJvcnQoKSBvciBqcGVnX2Rlc3Ryb3koKS4KKworb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKKwlBY3R1YWwgb3V0cHV0IG9mIGFueSBKUEVHIG1lc3NhZ2UuICBPdmVycmlkZSB0aGlzIHRvIHNlbmQgbWVzc2FnZXMKKwlzb21ld2hlcmUgb3RoZXIgdGhhbiBzdGRlcnIuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdworCWhvdyB0byBnZW5lcmF0ZSBhIG1lc3NhZ2UsIG9ubHkgd2hlcmUgdG8gc2VuZCBpdC4KKworZm9ybWF0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikKKwlDb25zdHJ1Y3RzIGEgcmVhZGFibGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcgYmFzZWQgb24gdGhlIGVycm9yIGluZm8KKwlzdG9yZWQgaW4gY2luZm8tPmVyci4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBvdXRwdXRfbWVzc2FnZS4gIEZldworCWFwcGxpY2F0aW9ucyBzaG91bGQgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4gIE9uZSBwb3NzaWJsZQorCXJlYXNvbiBmb3IgZG9pbmcgc28gaXMgdG8gaW1wbGVtZW50IGR5bmFtaWMgc3dpdGNoaW5nIG9mIGVycm9yIG1lc3NhZ2UKKwlsYW5ndWFnZS4KKworZW1pdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpCisJRGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGVtaXQgYSB3YXJuaW5nIG9yIHRyYWNlIG1lc3NhZ2U7IGlmIHNvLAorCWNhbGxzIG91dHB1dF9tZXNzYWdlLiAgVGhlIG1haW4gcmVhc29uIGZvciBvdmVycmlkaW5nIHRoaXMgbWV0aG9kCisJd291bGQgYmUgdG8gYWJvcnQgb24gd2FybmluZ3MuICBtc2dfbGV2ZWwgaXMgLTEgZm9yIHdhcm5pbmdzLAorCTAgYW5kIHVwIGZvciB0cmFjZSBtZXNzYWdlcy4KKworT25seSBlcnJvcl9leGl0KCkgYW5kIGVtaXRfbWVzc2FnZSgpIGFyZSBjYWxsZWQgZnJvbSB0aGUgcmVzdCBvZiB0aGUgSlBFRworbGlicmFyeTsgdGhlIG90aGVyIHR3byBhcmUgaW50ZXJuYWwgdG8gdGhlIGVycm9yIGhhbmRsZXIuCisKK1RoZSBhY3R1YWwgbWVzc2FnZSB0ZXh0cyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggaXMgcG9pbnRlZCB0bworYnkgdGhlIGZpZWxkIGVyci0+anBlZ19tZXNzYWdlX3RhYmxlLiAgVGhlIG1lc3NhZ2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8KK2Vyci0+bGFzdF9qcGVnX21lc3NhZ2UsIGFuZCBpdCBpcyB0aGVzZSBjb2RlIG51bWJlcnMgdGhhdCBhcmUgdXNlZCBpbiB0aGUKK0pQRUcgbGlicmFyeSBjb2RlLiAgWW91IGNvdWxkIHJlcGxhY2UgdGhlIG1lc3NhZ2UgdGV4dHMgKGZvciBpbnN0YW5jZSwgd2l0aAorbWVzc2FnZXMgaW4gRnJlbmNoIG9yIEdlcm1hbikgYnkgY2hhbmdpbmcgdGhlIG1lc3NhZ2UgdGFibGUgcG9pbnRlci4gIFNlZQoramVycm9yLmggZm9yIHRoZSBkZWZhdWx0IHRleHRzLiAgQ0FVVElPTjogdGhpcyB0YWJsZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKK2NoYW5nZSBvciBncm93IGZyb20gb25lIGxpYnJhcnkgdmVyc2lvbiB0byB0aGUgbmV4dC4KKworSXQgbWF5IGJlIHVzZWZ1bCBmb3IgYW4gYXBwbGljYXRpb24gdG8gYWRkIGl0cyBvd24gbWVzc2FnZSB0ZXh0cyB0aGF0IGFyZQoraGFuZGxlZCBieSB0aGUgc2FtZSBtZWNoYW5pc20uICBUaGUgZXJyb3IgaGFuZGxlciBzdXBwb3J0cyBhIHNlY29uZCAiYWRkLW9uIgorbWVzc2FnZSB0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLiAgVG8gZGVmaW5lIGFuIGFkZG9uIHRhYmxlLCBzZXQgdGhlIHBvaW50ZXIKK2Vyci0+YWRkb25fbWVzc2FnZV90YWJsZSBhbmQgdGhlIG1lc3NhZ2UgbnVtYmVycyBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgYW5kCitlcnItPmxhc3RfYWRkb25fbWVzc2FnZS4gIElmIHlvdSBudW1iZXIgdGhlIGFkZG9uIG1lc3NhZ2VzIGJlZ2lubmluZyBhdCAxMDAwCitvciBzbywgeW91IHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgY29uZmxpY3RzIHdpdGggdGhlIGxpYnJhcnkncyBidWlsdC1pbgorbWVzc2FnZXMuICBTZWUgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcvZGpwZWcgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcKK2FkZG9uIG1lc3NhZ2VzICh0aGUgYWRkb24gbWVzc2FnZXMgYXJlIGRlZmluZWQgaW4gY2RlcnJvci5oKS4KKworQWN0dWFsIGludm9jYXRpb24gb2YgdGhlIGVycm9yIGhhbmRsZXIgaXMgZG9uZSB2aWEgbWFjcm9zIGRlZmluZWQgaW4gamVycm9yLmg6CisJRVJSRVhJVG4oLi4uKQlmb3IgZmF0YWwgZXJyb3JzCisJV0FSTk1TbiguLi4pCWZvciBjb3JydXB0LWRhdGEgd2FybmluZ3MKKwlUUkFDRU1TbiguLi4pCWZvciB0cmFjZSBhbmQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KK1RoZXNlIG1hY3JvcyBzdG9yZSB0aGUgbWVzc2FnZSBjb2RlIGFuZCBhbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGludG8gdGhlCitlcnJvciBoYW5kbGVyIHN0cnVjdCwgdGhlbiBpbnZva2UgdGhlIGVycm9yX2V4aXQoKSBvciBlbWl0X21lc3NhZ2UoKSBtZXRob2QuCitUaGUgdmFyaWFudHMgb2YgZWFjaCBtYWNybyBhcmUgZm9yIHZhcnlpbmcgbnVtYmVycyBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuCitUaGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSB1c2luZworc3RhbmRhcmQgcHJpbnRmKCkgZm9ybWF0IGNvZGVzLgorCitTZWUgamVycm9yLmggYW5kIGplcnJvci5jIGZvciBmdXJ0aGVyIGRldGFpbHMuCisKKworQ29tcHJlc3NlZCBkYXRhIGhhbmRsaW5nIChzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgSlBFRyBjb21wcmVzc2lvbiBsaWJyYXJ5IHNlbmRzIGl0cyBjb21wcmVzc2VkIGRhdGEgdG8gYSAiZGVzdGluYXRpb24KK21hbmFnZXIiIG1vZHVsZS4gIFRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIG1hbmFnZXIganVzdCB3cml0ZXMgdGhlIGRhdGEgdG8gYQorc3RkaW8gc3RyZWFtLCBidXQgeW91IGNhbiBwcm92aWRlIHlvdXIgb3duIG1hbmFnZXIgdG8gZG8gc29tZXRoaW5nIGVsc2UuCitTaW1pbGFybHksIHRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgY2FsbHMgYSAic291cmNlIG1hbmFnZXIiIHRvIG9idGFpbiB0aGUKK2NvbXByZXNzZWQgZGF0YTsgeW91IGNhbiBwcm92aWRlIHlvdXIgb3duIHNvdXJjZSBtYW5hZ2VyIGlmIHlvdSB3YW50IHRoZSBkYXRhCit0byBjb21lIGZyb20gc29tZXdoZXJlIG90aGVyIHRoYW4gYSBzdGRpbyBzdHJlYW0uCisKK0luIGJvdGggY2FzZXMsIGNvbXByZXNzZWQgZGF0YSBpcyBwcm9jZXNzZWQgYSBidWZmZXJsb2FkIGF0IGEgdGltZTogdGhlCitkZXN0aW5hdGlvbiBvciBzb3VyY2UgbWFuYWdlciBwcm92aWRlcyBhIHdvcmsgYnVmZmVyLCBhbmQgdGhlIGxpYnJhcnkgaW52b2tlcwordGhlIG1hbmFnZXIgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZmlsbGVkIG9yIGVtcHRpZWQuICAoWW91IGNvdWxkIGRlZmluZSBhCitvbmUtY2hhcmFjdGVyIGJ1ZmZlciB0byBmb3JjZSB0aGUgbWFuYWdlciB0byBiZSBpbnZva2VkIGZvciBlYWNoIGJ5dGUsIGJ1dAordGhhdCB3b3VsZCBiZSByYXRoZXIgaW5lZmZpY2llbnQuKSAgVGhlIGJ1ZmZlcidzIHNpemUgYW5kIGxvY2F0aW9uIGFyZQorY29udHJvbGxlZCBieSB0aGUgbWFuYWdlciwgbm90IGJ5IHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkZXNpcmVkIHRvCitkZWNvbXByZXNzIGEgSlBFRyBkYXRhc3RyZWFtIHRoYXQgd2FzIGFsbCBpbiBtZW1vcnksIHlvdSBjb3VsZCBqdXN0IG1ha2UgdGhlCitidWZmZXIgcG9pbnRlciBhbmQgbGVuZ3RoIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhIGluIG1lbW9yeS4gIFRoZW4gdGhlCitidWZmZXItcmVsb2FkIHByb2NlZHVyZSB3b3VsZCBiZSBpbnZva2VkIG9ubHkgaWYgdGhlIGRlY29tcHJlc3NvciByYW4gb2ZmIHRoZQorZW5kIG9mIHRoZSBkYXRhc3RyZWFtLCB3aGljaCB3b3VsZCBpbmRpY2F0ZSBhbiBlcnJvbmVvdXMgZGF0YXN0cmVhbS4KKworVGhlIHdvcmsgYnVmZmVyIGlzIGRlZmluZWQgYXMgYW4gYXJyYXkgb2YgZGF0YXR5cGUgSk9DVEVULCB3aGljaCBpcyBnZW5lcmFsbHkKKyJjaGFyIiBvciAidW5zaWduZWQgY2hhciIuICBPbiBhIG1hY2hpbmUgd2hlcmUgY2hhciBpcyBub3QgZXhhY3RseSA4IGJpdHMKK3dpZGUsIHlvdSBtdXN0IGRlZmluZSBKT0NURVQgYXMgYSB3aWRlciBkYXRhIHR5cGUgYW5kIHRoZW4gbW9kaWZ5IHRoZSBkYXRhCitzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgdG8gdHJhbnNjcmliZSB0aGUgd29yayBhcnJheXMgaW50byA4LWJpdCB1bml0cworb24gZXh0ZXJuYWwgc3RvcmFnZS4KKworQSBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIgc3RydWN0IGNvbnRhaW5zIGEgcG9pbnRlciBhbmQgY291bnQgZGVmaW5pbmcgdGhlCituZXh0IGJ5dGUgdG8gd3JpdGUgaW4gdGhlIHdvcmsgYnVmZmVyIGFuZCB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2U6CisKKwlKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOyAgLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworCXNpemVfdCBmcmVlX2luX2J1ZmZlcjsgICAgICAvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKworVGhlIGxpYnJhcnkgaW5jcmVtZW50cyB0aGUgcG9pbnRlciBhbmQgZGVjcmVtZW50cyB0aGUgY291bnQgdW50aWwgdGhlIGJ1ZmZlcgoraXMgZmlsbGVkLiAgVGhlIG1hbmFnZXIncyBlbXB0eV9vdXRwdXRfYnVmZmVyIG1ldGhvZCBtdXN0IHJlc2V0IHRoZSBwb2ludGVyCithbmQgY291bnQuICBUaGUgbWFuYWdlciBpcyBleHBlY3RlZCB0byByZW1lbWJlciB0aGUgYnVmZmVyJ3Mgc3RhcnRpbmcgYWRkcmVzcworYW5kIHRvdGFsIHNpemUgaW4gcHJpdmF0ZSBmaWVsZHMgbm90IHZpc2libGUgdG8gdGhlIGxpYnJhcnkuCisKK0EgZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHByb3ZpZGVzIHRocmVlIG1ldGhvZHM6CisKK2luaXRfZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorCUluaXRpYWxpemUgZGVzdGluYXRpb24uICBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKKwliZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbi4gIEl0IG11c3QgaW5pdGlhbGl6ZQorCW5leHRfb3V0cHV0X2J5dGUgYW5kIGZyZWVfaW5fYnVmZmVyLiAgZnJlZV9pbl9idWZmZXIgbXVzdCBiZQorCWluaXRpYWxpemVkIHRvIGEgcG9zaXRpdmUgdmFsdWUuCisKK2VtcHR5X291dHB1dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorCVRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBidWZmZXIgaGFzIGZpbGxlZCAoZnJlZV9pbl9idWZmZXIKKwlyZWFjaGVzIHplcm8pLiAgSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIGl0IHNob3VsZCB3cml0ZSBvdXQgdGhlCisJKmVudGlyZSogYnVmZmVyICh1c2UgdGhlIHNhdmVkIHN0YXJ0IGFkZHJlc3MgYW5kIGJ1ZmZlciBsZW5ndGg7CisJaWdub3JlIHRoZSBjdXJyZW50IHN0YXRlIG9mIG5leHRfb3V0cHV0X2J5dGUgYW5kIGZyZWVfaW5fYnVmZmVyKS4KKwlUaGVuIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZAorCXJldHVybiBUUlVFIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIGR1bXBlZC4KKwlmcmVlX2luX2J1ZmZlciBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlIHdoZW4gVFJVRSBpcworCXJldHVybmVkLiAgQSBGQUxTRSByZXR1cm4gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIEkvTyBzdXNwZW5zaW9uIGlzCisJZGVzaXJlZCAodGhpcyBvcGVyYXRpbmcgbW9kZSBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbikuCisKK3Rlcm1fZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorCVRlcm1pbmF0ZSBkZXN0aW5hdGlvbiAtLS0gY2FsbGVkIGJ5IGpwZWdfZmluaXNoX2NvbXByZXNzKCkgYWZ0ZXIgYWxsCisJZGF0YSBoYXMgYmVlbiB3cml0dGVuLiAgSW4gbW9zdCBhcHBsaWNhdGlvbnMsIHRoaXMgbXVzdCBmbHVzaCBhbnkKKwlkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyLiAgVXNlIGVpdGhlciBuZXh0X291dHB1dF9ieXRlIG9yCisJZnJlZV9pbl9idWZmZXIgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIGRhdGEgaXMgaW4gdGhlIGJ1ZmZlci4KKwordGVybV9kZXN0aW5hdGlvbigpIGlzIE5PVCBjYWxsZWQgYnkganBlZ19hYm9ydCgpIG9yIGpwZWdfZGVzdHJveSgpLiAgSWYgeW91Cit3YW50IHRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHRvIGJlIGNsZWFuZWQgdXAgZHVyaW5nIGFuIGFib3J0LCB5b3UgbXVzdCBkbyBpdAoreW91cnNlbGYuCisKK1lvdSB3aWxsIGFsc28gbmVlZCBjb2RlIHRvIGNyZWF0ZSBhIGpwZWdfZGVzdGluYXRpb25fbWdyIHN0cnVjdCwgZmlsbCBpbiBpdHMKK21ldGhvZCBwb2ludGVycywgYW5kIGluc2VydCBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBpbnRvIHRoZSAiZGVzdCIgZmllbGQgb2YKK3RoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIGRvbmUgaW4tbGluZSBpbiB5b3VyIHNldHVwIGNvZGUgaWYKK3lvdSBsaWtlLCBidXQgaXQncyBwcm9iYWJseSBjbGVhbmVyIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSByb3V0aW5lIHNpbWlsYXIgdG8KK3RoZSBqcGVnX3N0ZGlvX2Rlc3QoKSByb3V0aW5lIG9mIHRoZSBzdXBwbGllZCBkZXN0aW5hdGlvbiBtYW5hZ2VyLgorCitEZWNvbXByZXNzaW9uIHNvdXJjZSBtYW5hZ2VycyBmb2xsb3cgYSBwYXJhbGxlbCBkZXNpZ24sIGJ1dCB3aXRoIHNvbWUKK2FkZGl0aW9uYWwgZnJhbW1pc2hlcy4gIFRoZSBzb3VyY2UgbWFuYWdlciBzdHJ1Y3QgY29udGFpbnMgYSBwb2ludGVyIGFuZCBjb3VudAorZGVmaW5pbmcgdGhlIG5leHQgYnl0ZSB0byByZWFkIGZyb20gdGhlIHdvcmsgYnVmZmVyIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzCityZW1haW5pbmc6CisKKwljb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gYnVmZmVyICovCisJc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsgICAgICAgICAvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKworVGhlIGxpYnJhcnkgaW5jcmVtZW50cyB0aGUgcG9pbnRlciBhbmQgZGVjcmVtZW50cyB0aGUgY291bnQgdW50aWwgdGhlIGJ1ZmZlcgoraXMgZW1wdGllZC4gIFRoZSBtYW5hZ2VyJ3MgZmlsbF9pbnB1dF9idWZmZXIgbWV0aG9kIG11c3QgcmVzZXQgdGhlIHBvaW50ZXIgYW5kCitjb3VudC4gIEluIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgbWFuYWdlciBtdXN0IHJlbWVtYmVyIHRoZSBidWZmZXIncyBzdGFydGluZworYWRkcmVzcyBhbmQgdG90YWwgc2l6ZSBpbiBwcml2YXRlIGZpZWxkcyBub3QgdmlzaWJsZSB0byB0aGUgbGlicmFyeS4KKworQSBkYXRhIHNvdXJjZSBtYW5hZ2VyIHByb3ZpZGVzIGZpdmUgbWV0aG9kczoKKworaW5pdF9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisJSW5pdGlhbGl6ZSBzb3VyY2UuICBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyKCkgYmVmb3JlIGFueQorCWRhdGEgaXMgYWN0dWFsbHkgcmVhZC4gIFVubGlrZSBpbml0X2Rlc3RpbmF0aW9uKCksIGl0IG1heSBsZWF2ZQorCWJ5dGVzX2luX2J1ZmZlciBzZXQgdG8gMCAoaW4gd2hpY2ggY2FzZSBhIGZpbGxfaW5wdXRfYnVmZmVyKCkgY2FsbAorCXdpbGwgb2NjdXIgaW1tZWRpYXRlbHkpLgorCitmaWxsX2lucHV0X2J1ZmZlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKwlUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBieXRlc19pbl9idWZmZXIgaGFzIHJlYWNoZWQgemVybyBhbmQgbW9yZQorCWRhdGEgaXMgd2FudGVkLiAgSW4gdHlwaWNhbCBhcHBsaWNhdGlvbnMsIGl0IHNob3VsZCByZWFkIGZyZXNoIGRhdGEKKwlpbnRvIHRoZSBidWZmZXIgKGlnbm9yaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIG5leHRfaW5wdXRfYnl0ZSBhbmQKKwlieXRlc19pbl9idWZmZXIpLCByZXNldCB0aGUgcG9pbnRlciAmIGNvdW50IHRvIHRoZSBzdGFydCBvZiB0aGUKKwlidWZmZXIsIGFuZCByZXR1cm4gVFJVRSBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiByZWxvYWRlZC4KKwlJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciBlbnRpcmVseSwgb25seSB0byBvYnRhaW4gYXQKKwlsZWFzdCBvbmUgbW9yZSBieXRlLiAgYnl0ZXNfaW5fYnVmZmVyIE1VU1QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUKKwlpZiBUUlVFIGlzIHJldHVybmVkLiAgQSBGQUxTRSByZXR1cm4gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIEkvTworCXN1c3BlbnNpb24gaXMgZGVzaXJlZCAodGhpcyBtb2RlIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKS4KKworc2tpcF9pbnB1dF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKKwlTa2lwIG51bV9ieXRlcyB3b3J0aCBvZiBkYXRhLiAgVGhlIGJ1ZmZlciBwb2ludGVyIGFuZCBjb3VudCBzaG91bGQKKwliZSBhZHZhbmNlZCBvdmVyIG51bV9ieXRlcyBpbnB1dCBieXRlcywgcmVmaWxsaW5nIHRoZSBidWZmZXIgYXMKKwluZWVkZWQuICBUaGlzIGlzIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCisJdW5pbnRlcmVzdGluZyBkYXRhIChzdWNoIGFzIGFuIEFQUG4gbWFya2VyKS4gIEluIHNvbWUgYXBwbGljYXRpb25zCisJaXQgbWF5IGJlIHBvc3NpYmxlIHRvIG9wdGltaXplIGF3YXkgdGhlIHJlYWRpbmcgb2YgdGhlIHNraXBwZWQgZGF0YSwKKwlidXQgaXQncyBub3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aCBtdWNoIHRyb3VibGU7IGxhcmdlCisJc2tpcHMgYXJlIHVuY29tbW9uLiAgYnl0ZXNfaW5fYnVmZmVyIG1heSBiZSB6ZXJvIG9uIHJldHVybi4KKwlBIHplcm8gb3IgbmVnYXRpdmUgc2tpcCBjb3VudCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIG5vLW9wLgorCityZXN5bmNfdG9fcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpCisJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGRlY29tcHJlc3NvciBoYXMgZmFpbGVkIHRvIGZpbmQKKwlhIHJlc3RhcnQgKFJTVG4pIG1hcmtlciB3aGVyZSBvbmUgaXMgZXhwZWN0ZWQuICBJdHMgbWlzc2lvbiBpcyB0bworCWZpbmQgYSBzdWl0YWJsZSBwb2ludCBmb3IgcmVzdW1pbmcgZGVjb21wcmVzc2lvbi4gIEZvciBtb3N0CisJYXBwbGljYXRpb25zLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UganVzdCB1c2UgdGhlIGRlZmF1bHQgcmVzeW5jCisJcHJvY2VkdXJlLCBqcGVnX3Jlc3luY190b19yZXN0YXJ0KCkuICBIb3dldmVyLCBpZiB5b3UgYXJlIGFibGUgdG8gYmFjaworCXVwIGluIHRoZSBpbnB1dCBkYXRhIHN0cmVhbSwgb3IgaWYgeW91IGhhdmUgYS1wcmlvcmkga25vd2xlZGdlIGFib3V0CisJdGhlIGxpa2VseSBsb2NhdGlvbiBvZiByZXN0YXJ0IG1hcmtlcnMsIHlvdSBtYXkgYmUgYWJsZSB0byBkbyBiZXR0ZXIuCisJUmVhZCB0aGUgcmVhZF9yZXN0YXJ0X21hcmtlcigpIGFuZCBqcGVnX3Jlc3luY190b19yZXN0YXJ0KCkgcm91dGluZXMKKwlpbiBqZG1hcmtlci5jIGlmIHlvdSB0aGluayB5b3UnZCBsaWtlIHRvIGltcGxlbWVudCB5b3VyIG93biByZXN5bmMKKwlwcm9jZWR1cmUuCisKK3Rlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorCVRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgYWZ0ZXIgYWxsCisJZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KKworRm9yIGJvdGggZmlsbF9pbnB1dF9idWZmZXIoKSBhbmQgc2tpcF9pbnB1dF9kYXRhKCksIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcKK2FzIGFuIEVPRiByZXR1cm4uICBJZiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSByb3V0aW5lIGhhcworYSBjaG9pY2Ugb2YgZXhpdGluZyB2aWEgRVJSRVhJVCgpIG9yIGluc2VydGluZyBmYWtlIGRhdGEgaW50byB0aGUgYnVmZmVyLgorSW4gbW9zdCBjYXNlcywgZ2VuZXJhdGluZyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaW5zZXJ0aW5nIGEgZmFrZSBFT0kgbWFya2VyCitpcyB0aGUgYmVzdCBjb3Vyc2Ugb2YgYWN0aW9uIC0tLSB0aGlzIHdpbGwgYWxsb3cgdGhlIGRlY29tcHJlc3NvciB0byBvdXRwdXQKK2hvd2V2ZXIgbXVjaCBvZiB0aGUgaW1hZ2UgaXMgdGhlcmUuICBJbiBwYXRob2xvZ2ljYWwgY2FzZXMsIHRoZSBkZWNvbXByZXNzb3IKK21heSBzd2FsbG93IHRoZSBFT0kgYW5kIGFnYWluIGRlbWFuZCBkYXRhIC4uLiBqdXN0IGtlZXAgZmVlZGluZyBpdCBmYWtlIEVPSXMuCitqZGF0YXNyYy5jIGlsbHVzdHJhdGVzIHRoZSByZWNvbW1lbmRlZCBlcnJvciByZWNvdmVyeSBiZWhhdmlvci4KKwordGVybV9zb3VyY2UoKSBpcyBOT1QgY2FsbGVkIGJ5IGpwZWdfYWJvcnQoKSBvciBqcGVnX2Rlc3Ryb3koKS4gIElmIHlvdSB3YW50Cit0aGUgc291cmNlIG1hbmFnZXIgdG8gYmUgY2xlYW5lZCB1cCBkdXJpbmcgYW4gYWJvcnQsIHlvdSBtdXN0IGRvIGl0IHlvdXJzZWxmLgorCitZb3Ugd2lsbCBhbHNvIG5lZWQgY29kZSB0byBjcmVhdGUgYSBqcGVnX3NvdXJjZV9tZ3Igc3RydWN0LCBmaWxsIGluIGl0cyBtZXRob2QKK3BvaW50ZXJzLCBhbmQgaW5zZXJ0IGEgcG9pbnRlciB0byB0aGUgc3RydWN0IGludG8gdGhlICJzcmMiIGZpZWxkIG9mIHRoZSBKUEVHCitkZWNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIGRvbmUgaW4tbGluZSBpbiB5b3VyIHNldHVwIGNvZGUgaWYgeW91CitsaWtlLCBidXQgaXQncyBwcm9iYWJseSBjbGVhbmVyIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSByb3V0aW5lIHNpbWlsYXIgdG8gdGhlCitqcGVnX3N0ZGlvX3NyYygpIHJvdXRpbmUgb2YgdGhlIHN1cHBsaWVkIHNvdXJjZSBtYW5hZ2VyLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY29uc3VsdCB0aGUgc3RkaW8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2VycworaW4gamRhdGFzcmMuYyBhbmQgamRhdGFkc3QuYy4KKworCitJL08gc3VzcGVuc2lvbgorLS0tLS0tLS0tLS0tLS0KKworU29tZSBhcHBsaWNhdGlvbnMgbmVlZCB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSBhcyBhbiBpbmNyZW1lbnRhbCBtZW1vcnktdG8tCittZW1vcnkgZmlsdGVyOiB3aGVuIHRoZSBjb21wcmVzc2VkIGRhdGEgYnVmZmVyIGlzIGZpbGxlZCBvciBlbXB0aWVkLCB0aGV5IHdhbnQKK2NvbnRyb2wgdG8gcmV0dXJuIHRvIHRoZSBvdXRlciBsb29wLCByYXRoZXIgdGhhbiBleHBlY3RpbmcgdGhhdCB0aGUgYnVmZmVyIGNhbgorYmUgZW1wdGllZCBvciByZWxvYWRlZCB3aXRoaW4gdGhlIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXIgc3Vicm91dGluZS4KK1RoZSBsaWJyYXJ5IHN1cHBvcnRzIHRoaXMgbmVlZCBieSBwcm92aWRpbmcgYW4gIkkvTyBzdXNwZW5zaW9uIiBtb2RlLCB3aGljaCB3ZQorZGVzY3JpYmUgaW4gdGhpcyBzZWN0aW9uLgorCitUaGUgSS9PIHN1c3BlbnNpb24gbW9kZSBpcyBub3QgYSBwYW5hY2VhOiBub3RoaW5nIGlzIGd1YXJhbnRlZWQgYWJvdXQgdGhlCittYXhpbXVtIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGFueSBvbmUgY2FsbCB0byB0aGUgbGlicmFyeSwgc28gaXQgd2lsbCBub3QKK2VsaW1pbmF0ZSByZXNwb25zZS10aW1lIHByb2JsZW1zIGluIHNpbmdsZS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICBJZiB5b3UKK25lZWQgZ3VhcmFudGVlZCByZXNwb25zZSB0aW1lLCB3ZSBzdWdnZXN0IHlvdSAiYml0ZSB0aGUgYnVsbGV0IiBhbmQgaW1wbGVtZW50CithIHJlYWwgbXVsdGktdGFza2luZyBjYXBhYmlsaXR5LgorCitUbyB1c2UgSS9PIHN1c3BlbnNpb24sIGNvb3BlcmF0aW9uIGlzIG5lZWRlZCBiZXR3ZWVuIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uCithbmQgdGhlIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uIG1hbmFnZXI7IHlvdSB3aWxsIGFsd2F5cyBuZWVkIGEgY3VzdG9tCitzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlci4gIChQbGVhc2UgcmVhZCB0aGUgcHJldmlvdXMgc2VjdGlvbiBpZiB5b3UgaGF2ZW4ndAorYWxyZWFkeS4pICBUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IHRoZSBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgb3IKK2ZpbGxfaW5wdXRfYnVmZmVyKCkgcm91dGluZSBpcyBhIG5vLW9wLCBtZXJlbHkgcmV0dXJuaW5nIEZBTFNFIHRvIGluZGljYXRlCit0aGF0IGl0IGhhcyBkb25lIG5vdGhpbmcuICBVcG9uIHNlZWluZyB0aGlzLCB0aGUgSlBFRyBsaWJyYXJ5IHN1c3BlbmRzCitvcGVyYXRpb24gYW5kIHJldHVybnMgdG8gaXRzIGNhbGxlci4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBpcworcmVzcG9uc2libGUgZm9yIGVtcHR5aW5nIG9yIHJlZmlsbGluZyB0aGUgd29yayBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhlCitKUEVHIGxpYnJhcnkgYWdhaW4uCisKK0NvbXByZXNzaW9uIHN1c3BlbnNpb246CisKK0ZvciBjb21wcmVzc2lvbiBzdXNwZW5zaW9uLCB1c2UgYW4gZW1wdHlfb3V0cHV0X2J1ZmZlcigpIHJvdXRpbmUgdGhhdCByZXR1cm5zCitGQUxTRTsgdHlwaWNhbGx5IGl0IHdpbGwgbm90IGRvIGFueXRoaW5nIGVsc2UuICBUaGlzIHdpbGwgY2F1c2UgdGhlCitjb21wcmVzc29yIHRvIHJldHVybiB0byB0aGUgY2FsbGVyIG9mIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCksIHdpdGggdGhlIHJldHVybgordmFsdWUgaW5kaWNhdGluZyB0aGF0IG5vdCBhbGwgdGhlIHN1cHBsaWVkIHNjYW5saW5lcyBoYXZlIGJlZW4gYWNjZXB0ZWQuCitUaGUgYXBwbGljYXRpb24gbXVzdCBtYWtlIG1vcmUgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgYWRqdXN0IHRoZSBvdXRwdXQKK2J1ZmZlciBwb2ludGVyL2NvdW50IGFwcHJvcHJpYXRlbHksIGFuZCB0aGVuIGNhbGwganBlZ193cml0ZV9zY2FubGluZXMoKQorYWdhaW4sIHBvaW50aW5nIHRvIHRoZSBmaXJzdCB1bmNvbnN1bWVkIHNjYW5saW5lLgorCitXaGVuIGZvcmNlZCB0byBzdXNwZW5kLCB0aGUgY29tcHJlc3NvciB3aWxsIGJhY2t0cmFjayB0byBhIGNvbnZlbmllbnQgc3RvcHBpbmcKK3BvaW50ICh1c3VhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpOyBpdCB3aWxsIHJlZ2VuZXJhdGUgc29tZSBvdXRwdXQKK2RhdGEgd2hlbiByZXN0YXJ0ZWQuICBUaGVyZWZvcmUsIGFsdGhvdWdoIGVtcHR5X291dHB1dF9idWZmZXIoKSBpcyBvbmx5CitjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIGZpbGxlZCwgeW91IHNob3VsZCBOT1Qgd3JpdGUgb3V0IHRoZSBlbnRpcmUgYnVmZmVyCithZnRlciBhIHN1c3BlbnNpb24uICBXcml0ZSBvbmx5IHRoZSBkYXRhIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mCituZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyLiAgVGhlIGRhdGEgYmV5b25kIHRoYXQgcG9pbnQgd2lsbCBiZQorcmVnZW5lcmF0ZWQgYWZ0ZXIgcmVzdW1wdGlvbi4KKworQmVjYXVzZSBvZiB0aGUgYmFja3RyYWNraW5nIGJlaGF2aW9yLCBhIGdvb2Qtc2l6ZSBvdXRwdXQgYnVmZmVyIGlzIGVzc2VudGlhbAorZm9yIGVmZmljaWVuY3k7IHlvdSBkb24ndCB3YW50IHRoZSBjb21wcmVzc29yIHRvIHN1c3BlbmQgb2Z0ZW4uICAoSW4gZmFjdCwgYW4KK292ZXJseSBzbWFsbCBidWZmZXIgY291bGQgbGVhZCB0byBpbmZpbml0ZSBsb29waW5nLCBpZiBhIHNpbmdsZSBNQ1UgcmVxdWlyZWQKK21vcmUgZGF0YSB0aGFuIHdvdWxkIGZpdCBpbiB0aGUgYnVmZmVyLikgIFdlIHJlY29tbWVuZCBhIGJ1ZmZlciBvZiBhdCBsZWFzdAorc2V2ZXJhbCBLYnl0ZXMuICBZb3UgbWF5IHdhbnQgdG8gaW5zZXJ0IGV4cGxpY2l0IGNvZGUgdG8gZW5zdXJlIHRoYXQgeW91IGRvbid0CitjYWxsIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgdW5sZXNzIHRoZXJlIGlzIGEgcmVhc29uYWJsZSBhbW91bnQgb2Ygc3BhY2UgaW4KK3RoZSBvdXRwdXQgYnVmZmVyOyBpbiBvdGhlciB3b3JkcywgZmx1c2ggdGhlIGJ1ZmZlciBiZWZvcmUgdHJ5aW5nIHRvIGNvbXByZXNzCittb3JlIGRhdGEuCisKK1RoZSBjb21wcmVzc29yIGRvZXMgbm90IGFsbG93IHN1c3BlbnNpb24gd2hpbGUgaXQgaXMgdHJ5aW5nIHRvIHdyaXRlIEpQRUcKK21hcmtlcnMgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0OgorICAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wcmVzc2lvbiBvcGVyYXRpb24sIHRoZXJlIG11c3QgYmUgZW5vdWdoIGZyZWUKKyAgICBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0byBob2xkIHRoZSBoZWFkZXIgbWFya2VycyAodHlwaWNhbGx5IDYwMCBvcgorICAgIHNvIGJ5dGVzKS4gIFRoZSByZWNvbW1lbmRlZCBidWZmZXIgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGlzIGFueXdheSwgc28KKyAgICB0aGlzIGlzIG5vdCBhIHByb2JsZW0gYXMgbG9uZyBhcyB5b3Ugc3RhcnQgd2l0aCBhbiBlbXB0eSBidWZmZXIuICBIb3dldmVyLAorICAgIHRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgY2F0Y2ggeW91IGlmIHlvdSBpbnNlcnQgbGFyZ2Ugc3BlY2lhbCBtYXJrZXJzLCBzdWNoCisgICAgYXMgYSBKRklGIHRodW1ibmFpbCBpbWFnZSwgd2l0aG91dCBmbHVzaGluZyB0aGUgYnVmZmVyIGFmdGVyd2FyZHMuCisgICogV2hlbiB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLCB0aGVyZSBtdXN0IGJlIGVub3VnaCBzcGFjZSBpbiB0aGUKKyAgICBvdXRwdXQgYnVmZmVyIHRvIGVtaXQgYW55IGJ1ZmZlcmVkIGRhdGEgYW5kIHRoZSBmaW5hbCBFT0kgbWFya2VyLiAgSW4gdGhlCisgICAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgaGFsZiBhIGRvemVuIGJ5dGVzIHNob3VsZCBzdWZmaWNlIGZvciB0aGlzLCBidXQKKyAgICBmb3Igc2FmZXR5J3Mgc2FrZSB3ZSByZWNvbW1lbmQgZW5zdXJpbmcgdGhhdCBhdCBsZWFzdCAxMDAgYnl0ZXMgYXJlIGZyZWUKKyAgICBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLgorCitBIG1vcmUgc2lnbmlmaWNhbnQgcmVzdHJpY3Rpb24gaXMgdGhhdCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGNhbm5vdCBzdXNwZW5kLgorVGhpcyBtZWFucyB5b3UgY2Fubm90IHVzZSBzdXNwZW5zaW9uIHdpdGggbXVsdGktcGFzcyBvcGVyYXRpbmcgbW9kZXMsIG5hbWVseQorSHVmZm1hbiBjb2RlIG9wdGltaXphdGlvbiBhbmQgbXVsdGlwbGUtc2NhbiBvdXRwdXQuICBUaG9zZSBtb2RlcyB3cml0ZSB0aGUKK3dob2xlIGZpbGUgZHVyaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCksIHdoaWNoIHdpbGwgY2VydGFpbmx5IHJlc3VsdCBpbgorYnVmZmVyIG92ZXJydW4uICAoTm90ZSB0aGF0IHRoaXMgcmVzdHJpY3Rpb24gYXBwbGllcyBvbmx5IHRvIGNvbXByZXNzaW9uLAorbm90IGRlY29tcHJlc3Npb24uICBUaGUgZGVjb21wcmVzc29yIHN1cHBvcnRzIGlucHV0IHN1c3BlbnNpb24gaW4gYWxsIG9mIGl0cworb3BlcmF0aW5nIG1vZGVzLikKKworRGVjb21wcmVzc2lvbiBzdXNwZW5zaW9uOgorCitGb3IgZGVjb21wcmVzc2lvbiBzdXNwZW5zaW9uLCB1c2UgYSBmaWxsX2lucHV0X2J1ZmZlcigpIHJvdXRpbmUgdGhhdCBzaW1wbHkKK3JldHVybnMgRkFMU0UgKGV4Y2VwdCBwZXJoYXBzIGR1cmluZyBlcnJvciByZWNvdmVyeSwgYXMgZGlzY3Vzc2VkIGJlbG93KS4KK1RoaXMgd2lsbCBjYXVzZSB0aGUgZGVjb21wcmVzc29yIHRvIHJldHVybiB0byBpdHMgY2FsbGVyIHdpdGggYW4gaW5kaWNhdGlvbgordGhhdCBzdXNwZW5zaW9uIGhhcyBvY2N1cnJlZC4gIFRoaXMgY2FuIGhhcHBlbiBhdCBmb3VyIHBsYWNlczoKKyAgKiBqcGVnX3JlYWRfaGVhZGVyKCk6IHdpbGwgcmV0dXJuIEpQRUdfU1VTUEVOREVELgorICAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpOiB3aWxsIHJldHVybiBGQUxTRSwgcmF0aGVyIHRoYW4gaXRzIHVzdWFsIFRSVUUuCisgICoganBlZ19yZWFkX3NjYW5saW5lcygpOiB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyBhbHJlYWR5CisJY29tcGxldGVkIChwb3NzaWJseSAwKS4KKyAgKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCk6IHdpbGwgcmV0dXJuIEZBTFNFLCByYXRoZXIgdGhhbiBpdHMgdXN1YWwgVFJVRS4KK1RoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtdXN0IHJlY29nbml6ZSB0aGVzZSBjYXNlcywgbG9hZCBtb3JlIGRhdGEgaW50bwordGhlIGlucHV0IGJ1ZmZlciwgYW5kIHJlcGVhdCB0aGUgY2FsbC4gIEluIHRoZSBjYXNlIG9mIGpwZWdfcmVhZF9zY2FubGluZXMoKSwKK2luY3JlbWVudCB0aGUgcGFzc2VkIHBvaW50ZXJzIHBhc3QgYW55IHNjYW5saW5lcyBzdWNjZXNzZnVsbHkgcmVhZC4KKworSnVzdCBhcyB3aXRoIGNvbXByZXNzaW9uLCB0aGUgZGVjb21wcmVzc29yIHdpbGwgdHlwaWNhbGx5IGJhY2t0cmFjayB0byBhCitjb252ZW5pZW50IHJlc3RhcnQgcG9pbnQgYmVmb3JlIHN1c3BlbmRpbmcuICBXaGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkgaXMKK2NhbGxlZCwgbmV4dF9pbnB1dF9ieXRlL2J5dGVzX2luX2J1ZmZlciBwb2ludCB0byB0aGUgY3VycmVudCByZXN0YXJ0IHBvaW50LAord2hpY2ggaXMgd2hlcmUgdGhlIGRlY29tcHJlc3NvciB3aWxsIGJhY2t0cmFjayB0byBpZiBGQUxTRSBpcyByZXR1cm5lZC4KK1RoZSBkYXRhIGJleW9uZCB0aGF0IHBvc2l0aW9uIG11c3QgTk9UIGJlIGRpc2NhcmRlZCBpZiB5b3Ugc3VzcGVuZDsgaXQgbmVlZHMKK3RvIGJlIHJlLXJlYWQgdXBvbiByZXN1bXB0aW9uLiAgSW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMsIHlvdSdsbCBuZWVkIHRvIHNoaWZ0Cit0aGlzIGRhdGEgZG93biB0byB0aGUgc3RhcnQgb2YgeW91ciB3b3JrIGJ1ZmZlciBhbmQgdGhlbiBsb2FkIG1vcmUgZGF0YSBhZnRlcgoraXQuICBBZ2FpbiwgdGhpcyBiZWhhdmlvciBtZWFucyB0aGF0IGEgc2V2ZXJhbC1LYnl0ZSB3b3JrIGJ1ZmZlciBpcyBlc3NlbnRpYWwKK2ZvciBkZWNlbnQgcGVyZm9ybWFuY2U7IGZ1cnRoZXJtb3JlLCB5b3Ugc2hvdWxkIGxvYWQgYSByZWFzb25hYmxlIGFtb3VudCBvZgorbmV3IGRhdGEgYmVmb3JlIHJlc3VtaW5nIGRlY29tcHJlc3Npb24uICAoSWYgeW91IGxvYWRlZCwgc2F5LCBvbmx5IG9uZSBuZXcKK2J5dGUgZWFjaCB0aW1lIGFyb3VuZCwgeW91IGNvdWxkIHdhc3RlIGEgTE9UIG9mIGN5Y2xlcy4pCisKK1RoZSBza2lwX2lucHV0X2RhdGEoKSBzb3VyY2UgbWFuYWdlciByb3V0aW5lIHJlcXVpcmVzIHNwZWNpYWwgY2FyZSBpbiBhCitzdXNwZW5zaW9uIHNjZW5hcmlvLiAgVGhpcyByb3V0aW5lIGlzIE5PVCBncmFudGVkIHRoZSBhYmlsaXR5IHRvIHN1c3BlbmQgdGhlCitkZWNvbXByZXNzb3I7IGl0IGNhbiBkZWNyZW1lbnQgYnl0ZXNfaW5fYnVmZmVyIHRvIHplcm8sIGJ1dCBubyBtb3JlLiAgSWYgdGhlCityZXF1ZXN0ZWQgc2tpcCBkaXN0YW5jZSBleGNlZWRzIHRoZSBhbW91bnQgb2YgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGlucHV0CitidWZmZXIsIHRoZW4gc2tpcF9pbnB1dF9kYXRhKCkgbXVzdCBzZXQgYnl0ZXNfaW5fYnVmZmVyIHRvIHplcm8gYW5kIHJlY29yZCB0aGUKK2FkZGl0aW9uYWwgc2tpcCBkaXN0YW5jZSBzb21ld2hlcmUgZWxzZS4gIFRoZSBkZWNvbXByZXNzb3Igd2lsbCBpbW1lZGlhdGVseQorY2FsbCBmaWxsX2lucHV0X2J1ZmZlcigpLCB3aGljaCBzaG91bGQgcmV0dXJuIEZBTFNFLCB3aGljaCB3aWxsIGNhdXNlIGEKK3N1c3BlbnNpb24gcmV0dXJuLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG11c3QgdGhlbiBhcnJhbmdlIHRvIGRpc2NhcmQKK3RoZSByZWNvcmRlZCBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIGl0IHJlc3VtZXMgbG9hZGluZyB0aGUgaW5wdXQgYnVmZmVyLgorKFllcywgdGhpcyBkZXNpZ24gaXMgcmF0aGVyIGJhcm9xdWUsIGJ1dCBpdCBhdm9pZHMgY29tcGxleGl0eSBpbiB0aGUgZmFyIG1vcmUKK2NvbW1vbiBjYXNlIHdoZXJlIGEgbm9uLXN1c3BlbmRpbmcgc291cmNlIG1hbmFnZXIgaXMgdXNlZC4pCisKK0lmIHRoZSBpbnB1dCBkYXRhIGhhcyBiZWVuIGV4aGF1c3RlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGVtaXQgYSB3YXJuaW5nCithbmQgaW5zZXJ0IGR1bW15IEVPSSBtYXJrZXJzIGp1c3QgYXMgYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBtYW5hZ2VyCit3b3VsZCBkby4gIFRoaXMgY2FuIGJlIGhhbmRsZWQgZWl0aGVyIGluIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBsb2dpYyBvcgord2l0aGluIGZpbGxfaW5wdXRfYnVmZmVyKCk7IHRoZSBsYXR0ZXIgaXMgcHJvYmFibHkgbW9yZSBlZmZpY2llbnQuICBJZgorZmlsbF9pbnB1dF9idWZmZXIoKSBrbm93cyB0aGF0IG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUsIGl0IGNhbiBzZXQgdGhlCitwb2ludGVyL2NvdW50IHRvIHBvaW50IHRvIGEgZHVtbXkgRU9JIG1hcmtlciBhbmQgdGhlbiByZXR1cm4gVFJVRSBqdXN0IGFzCit0aG91Z2ggaXQgaGFkIHJlYWQgbW9yZSBkYXRhIGluIGEgbm9uLXN1c3BlbmRpbmcgc2l0dWF0aW9uLgorCitUaGUgZGVjb21wcmVzc29yIGRvZXMgbm90IGF0dGVtcHQgdG8gc3VzcGVuZCB3aXRoaW4gc3RhbmRhcmQgSlBFRyBtYXJrZXJzOworaW5zdGVhZCBpdCB3aWxsIGJhY2t0cmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIG1hcmtlciBhbmQgcmVwcm9jZXNzIHRoZSB3aG9sZQorbWFya2VyIG5leHQgdGltZS4gIEhlbmNlIHRoZSBpbnB1dCBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKK2xvbmdlc3Qgc3RhbmRhcmQgbWFya2VyIGluIHRoZSBmaWxlLiAgU3RhbmRhcmQgSlBFRyBtYXJrZXJzIHNob3VsZCBub3JtYWxseQorbm90IGV4Y2VlZCBhIGZldyBodW5kcmVkIGJ5dGVzIGVhY2ggKERIVCB0YWJsZXMgYXJlIHR5cGljYWxseSB0aGUgbG9uZ2VzdCkuCitXZSByZWNvbW1lbmQgYXQgbGVhc3QgYSAySyBidWZmZXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdoaWNoIGlzIG11Y2gKK2xhcmdlciB0aGFuIGFueSBjb3JyZWN0IG1hcmtlciBpcyBsaWtlbHkgdG8gYmUuICBGb3Igcm9idXN0bmVzcyBhZ2FpbnN0CitkYW1hZ2VkIG1hcmtlciBsZW5ndGggY291bnRzLCB5b3UgbWF5IHdpc2ggdG8gaW5zZXJ0IGEgdGVzdCBpbiB5b3VyCithcHBsaWNhdGlvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgaW5wdXQgYnVmZmVyIGlzIGNvbXBsZXRlbHkgZnVsbCBhbmQgeWV0Cit0aGUgZGVjb2RlciBoYXMgc3VzcGVuZGVkIHdpdGhvdXQgY29uc3VtaW5nIGFueSBkYXRhIC0tLSBvdGhlcndpc2UsIGlmIHRoaXMKK3NpdHVhdGlvbiBkaWQgb2NjdXIsIGl0IHdvdWxkIGxlYWQgdG8gYW4gZW5kbGVzcyBsb29wLiAgKFRoZSBsaWJyYXJ5IGNhbid0Citwcm92aWRlIHRoaXMgdGVzdCBzaW5jZSBpdCBoYXMgbm8gaWRlYSB3aGV0aGVyICJ0aGUgYnVmZmVyIGlzIGZ1bGwiLCBvcgorZXZlbiB3aGV0aGVyIHRoZXJlIGlzIGEgZml4ZWQtc2l6ZSBpbnB1dCBidWZmZXIuKQorCitUaGUgaW5wdXQgYnVmZmVyIHdvdWxkIG5lZWQgdG8gYmUgNjRLIHRvIGFsbG93IGZvciBhcmJpdHJhcnkgQ09NIG9yIEFQUG4KK21hcmtlcnMsIGJ1dCB0aGVzZSBhcmUgaGFuZGxlZCBzcGVjaWFsbHk6IHRoZXkgYXJlIGVpdGhlciBzYXZlZCBpbnRvIGFsbG9jYXRlZAorbWVtb3J5LCBvciBza2lwcGVkIG92ZXIgYnkgY2FsbGluZyBza2lwX2lucHV0X2RhdGEoKS4gIEluIHRoZSBmb3JtZXIgY2FzZSwKK3N1c3BlbnNpb24gaXMgaGFuZGxlZCBjb3JyZWN0bHksIGFuZCBpbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBwcm9ibGVtIG9mCitidWZmZXIgb3ZlcnJ1biBpcyBwbGFjZWQgb24gc2tpcF9pbnB1dF9kYXRhJ3Mgc2hvdWxkZXJzLCBhcyBleHBsYWluZWQgYWJvdmUuCitOb3RlIHRoYXQgaWYgeW91IHByb3ZpZGUgeW91ciBvd24gbWFya2VyIGhhbmRsaW5nIHJvdXRpbmUgZm9yIGxhcmdlIG1hcmtlcnMsCit5b3Ugc2hvdWxkIGNvbnNpZGVyIGhvdyB0byBkZWFsIHdpdGggYnVmZmVyIG92ZXJmbG93LgorCitNdWx0aXBsZS1idWZmZXIgbWFuYWdlbWVudDoKKworSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgaXMgZGVzaXJhYmxlIHRvIHN0b3JlIHRoZSBjb21wcmVzc2VkIGRhdGEgaW4gYSBsaW5rZWQKK2xpc3Qgb2YgYnVmZmVyIGFyZWFzLCBzbyBhcyB0byBhdm9pZCBkYXRhIGNvcHlpbmcuICBUaGlzIGNhbiBiZSBoYW5kbGVkIGJ5CitoYXZpbmcgZW1wdHlfb3V0cHV0X2J1ZmZlcigpIG9yIGZpbGxfaW5wdXRfYnVmZmVyKCkgc2V0IHRoZSBwb2ludGVyIGFuZCBjb3VudAordG8gcmVmZXJlbmNlIHRoZSBuZXh0IGF2YWlsYWJsZSBidWZmZXI7IEZBTFNFIGlzIHJldHVybmVkIG9ubHkgaWYgbm8gbW9yZQorYnVmZmVycyBhcmUgYXZhaWxhYmxlLiAgQWx0aG91Z2ggc2VlbWluZ2x5IHN0cmFpZ2h0Zm9yd2FyZCwgdGhlcmUgaXMgYQorcGl0ZmFsbCBpbiB0aGlzIGFwcHJvYWNoOiB0aGUgYmFja3RyYWNrIHRoYXQgb2NjdXJzIHdoZW4gRkFMU0UgaXMgcmV0dXJuZWQKK2NvdWxkIGJhY2sgdXAgaW50byBhbiBlYXJsaWVyIGJ1ZmZlci4gIEZvciBleGFtcGxlLCB3aGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkKK2lzIGNhbGxlZCwgdGhlIGN1cnJlbnQgcG9pbnRlciAmIGNvdW50IGluZGljYXRlIHRoZSBiYWNrdHJhY2sgcmVzdGFydCBwb2ludC4KK1NpbmNlIGZpbGxfaW5wdXRfYnVmZmVyKCkgd2lsbCBzZXQgdGhlIHBvaW50ZXIgYW5kIGNvdW50IHRvIHJlZmVyIHRvIGEgbmV3CitidWZmZXIsIHRoZSByZXN0YXJ0IHBvc2l0aW9uIG11c3QgYmUgc2F2ZWQgc29tZXdoZXJlIGVsc2UuICBTdXBwb3NlIGEgc2Vjb25kCitjYWxsIHRvIGZpbGxfaW5wdXRfYnVmZmVyKCkgb2NjdXJzIGluIHRoZSBzYW1lIGxpYnJhcnkgY2FsbCwgYW5kIG5vCithZGRpdGlvbmFsIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlLCBzbyBmaWxsX2lucHV0X2J1ZmZlciBtdXN0IHJldHVybiBGQUxTRS4KK0lmIHRoZSBKUEVHIGxpYnJhcnkgaGFzIG5vdCBtb3ZlZCB0aGUgcG9pbnRlci9jb3VudCBmb3J3YXJkIGluIHRoZSBjdXJyZW50CitidWZmZXIsIHRoZW4gKnRoZSBjb3JyZWN0IHJlc3RhcnQgcG9pbnQgaXMgdGhlIHNhdmVkIHBvc2l0aW9uIGluIHRoZSBwcmlvcgorYnVmZmVyKi4gIFByaW9yIGJ1ZmZlcnMgbWF5IGJlIGRpc2NhcmRlZCBvbmx5IGFmdGVyIHRoZSBsaWJyYXJ5IGVzdGFibGlzaGVzCithIHJlc3RhcnQgcG9pbnQgd2l0aGluIGEgbGF0ZXIgYnVmZmVyLiAgU2ltaWxhciByZW1hcmtzIGFwcGx5IGZvciBvdXRwdXQgaW50bworYSBjaGFpbiBvZiBidWZmZXJzLgorCitUaGUgbGlicmFyeSB3aWxsIG5ldmVyIGF0dGVtcHQgdG8gYmFja3RyYWNrIG92ZXIgYSBza2lwX2lucHV0X2RhdGEoKSBjYWxsLAorc28gYW55IHNraXBwZWQgZGF0YSBjYW4gYmUgcGVybWFuZW50bHkgZGlzY2FyZGVkLiAgWW91IHN0aWxsIGhhdmUgdG8gZGVhbAord2l0aCB0aGUgY2FzZSBvZiBza2lwcGluZyBub3QteWV0LXJlY2VpdmVkIGRhdGEsIGhvd2V2ZXIuCisKK0l0J3MgbXVjaCBzaW1wbGVyIHRvIHVzZSBvbmx5IGEgc2luZ2xlIGJ1ZmZlcjsgd2hlbiBmaWxsX2lucHV0X2J1ZmZlcigpIGlzCitjYWxsZWQsIG1vdmUgYW55IHVuY29uc3VtZWQgZGF0YSAoYmV5b25kIHRoZSBjdXJyZW50IHBvaW50ZXIvY291bnQpIGRvd24gdG8KK3RoZSBiZWdpbm5pbmcgb2YgdGhpcyBidWZmZXIgYW5kIHRoZW4gbG9hZCBuZXcgZGF0YSBpbnRvIHRoZSByZW1haW5pbmcgYnVmZmVyCitzcGFjZS4gIFRoaXMgYXBwcm9hY2ggcmVxdWlyZXMgYSBsaXR0bGUgbW9yZSBkYXRhIGNvcHlpbmcgYnV0IGlzIGZhciBlYXNpZXIKK3RvIGdldCByaWdodC4KKworCitQcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQcm9ncmVzc2l2ZSBKUEVHIHJlYXJyYW5nZXMgdGhlIHN0b3JlZCBkYXRhIGludG8gYSBzZXJpZXMgb2Ygc2NhbnMgb2YKK2luY3JlYXNpbmcgcXVhbGl0eS4gIEluIHNpdHVhdGlvbnMgd2hlcmUgYSBKUEVHIGZpbGUgaXMgdHJhbnNtaXR0ZWQgYWNyb3NzIGEKK3Nsb3cgY29tbXVuaWNhdGlvbnMgbGluaywgYSBkZWNvZGVyIGNhbiBnZW5lcmF0ZSBhIGxvdy1xdWFsaXR5IGltYWdlIHZlcnkKK3F1aWNrbHkgZnJvbSB0aGUgZmlyc3Qgc2NhbiwgdGhlbiBncmFkdWFsbHkgaW1wcm92ZSB0aGUgZGlzcGxheWVkIHF1YWxpdHkgYXMKK21vcmUgc2NhbnMgYXJlIHJlY2VpdmVkLiAgVGhlIGZpbmFsIGltYWdlIGFmdGVyIGFsbCBzY2FucyBhcmUgY29tcGxldGUgaXMKK2lkZW50aWNhbCB0byB0aGF0IG9mIGEgcmVndWxhciAoc2VxdWVudGlhbCkgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkKK3NldHRpbmcuICBQcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIGFyZSBvZnRlbiBzbGlnaHRseSBzbWFsbGVyIHRoYW4gZXF1aXZhbGVudAorc2VxdWVudGlhbCBKUEVHIGZpbGVzLCBidXQgdGhlIHBvc3NpYmlsaXR5IG9mIGluY3JlbWVudGFsIGRpc3BsYXkgaXMgdGhlIG1haW4KK3JlYXNvbiBmb3IgdXNpbmcgcHJvZ3Jlc3NpdmUgSlBFRy4KKworVGhlIElKRyBlbmNvZGVyIGxpYnJhcnkgZ2VuZXJhdGVzIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgd2hlbiBnaXZlbiBhCitzdWl0YWJsZSAic2NhbiBzY3JpcHQiIGRlZmluaW5nIGhvdyB0byBkaXZpZGUgdGhlIGRhdGEgaW50byBzY2Fucy4KK0NyZWF0aW9uIG9mIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgaXMgb3RoZXJ3aXNlIHRyYW5zcGFyZW50IHRvIHRoZSBlbmNvZGVyLgorUHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyBjYW4gYWxzbyBiZSByZWFkIHRyYW5zcGFyZW50bHkgYnkgdGhlIGRlY29kZXIgbGlicmFyeS4KK0lmIHRoZSBkZWNvZGluZyBhcHBsaWNhdGlvbiBzaW1wbHkgdXNlcyB0aGUgbGlicmFyeSBhcyBkZWZpbmVkIGFib3ZlLCBpdAord2lsbCByZWNlaXZlIGEgZmluYWwgZGVjb2RlZCBpbWFnZSB3aXRob3V0IGFueSBpbmRpY2F0aW9uIHRoYXQgdGhlIGZpbGUgd2FzCitwcm9ncmVzc2l2ZS4gIE9mIGNvdXJzZSwgdGhpcyBhcHByb2FjaCBkb2VzIG5vdCBhbGxvdyBpbmNyZW1lbnRhbCBkaXNwbGF5LgorVG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkaXNwbGF5LCBhbiBhcHBsaWNhdGlvbiBuZWVkcyB0byB1c2UgdGhlIGRlY29kZXIKK2xpYnJhcnkncyAiYnVmZmVyZWQtaW1hZ2UiIG1vZGUsIGluIHdoaWNoIGl0IHJlY2VpdmVzIGEgZGVjb2RlZCBpbWFnZQorbXVsdGlwbGUgdGltZXMuCisKK0VhY2ggZGlzcGxheWVkIHNjYW4gcmVxdWlyZXMgYWJvdXQgYXMgbXVjaCB3b3JrIHRvIGRlY29kZSBhcyBhIGZ1bGwgSlBFRworaW1hZ2Ugb2YgdGhlIHNhbWUgc2l6ZSwgc28gdGhlIGRlY29kZXIgbXVzdCBiZSBmYWlybHkgZmFzdCBpbiByZWxhdGlvbiB0byB0aGUKK2RhdGEgdHJhbnNtaXNzaW9uIHJhdGUgaW4gb3JkZXIgdG8gbWFrZSBpbmNyZW1lbnRhbCBkaXNwbGF5IHVzZWZ1bC4gIEhvd2V2ZXIsCitpdCBpcyBwb3NzaWJsZSB0byBza2lwIGRpc3BsYXlpbmcgdGhlIGltYWdlIGFuZCBzaW1wbHkgYWRkIHRoZSBpbmNvbWluZyBiaXRzCit0byB0aGUgZGVjb2RlcidzIGNvZWZmaWNpZW50IGJ1ZmZlci4gIFRoaXMgaXMgZmFzdCBiZWNhdXNlIG9ubHkgSHVmZm1hbgorZGVjb2RpbmcgbmVlZCBiZSBkb25lLCBub3QgSURDVCwgdXBzYW1wbGluZywgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBldGMuCitUaGUgSUpHIGRlY29kZXIgbGlicmFyeSBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN3aXRjaCBkeW5hbWljYWxseSBiZXR3ZWVuCitkaXNwbGF5aW5nIHRoZSBpbWFnZSBhbmQgc2ltcGx5IGFic29yYmluZyB0aGUgaW5jb21pbmcgYml0cy4gIEEgcHJvcGVybHkKK2NvZGVkIGFwcGxpY2F0aW9uIGNhbiBhdXRvbWF0aWNhbGx5IGFkYXB0IHRoZSBudW1iZXIgb2YgZGlzcGxheSBwYXNzZXMgdG8KK3N1aXQgdGhlIHRpbWUgYXZhaWxhYmxlIGFzIHRoZSBpbWFnZSBpcyByZWNlaXZlZC4gIEFsc28sIGEgZmluYWwKK2hpZ2hlci1xdWFsaXR5IGRpc3BsYXkgY3ljbGUgY2FuIGJlIHBlcmZvcm1lZCBmcm9tIHRoZSBidWZmZXJlZCBkYXRhIGFmdGVyCit0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQuCisKK1Byb2dyZXNzaXZlIGNvbXByZXNzaW9uOgorCitUbyBjcmVhdGUgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKG9yIGEgbXVsdGlwbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZSksCitzZXQgdGhlIHNjYW5faW5mbyBjaW5mbyBmaWVsZCB0byBwb2ludCB0byBhbiBhcnJheSBvZiBzY2FuIGRlc2NyaXB0b3JzLCBhbmQKK3BlcmZvcm0gY29tcHJlc3Npb24gYXMgdXN1YWwuICBJbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyB5b3VyIG93biBzY2FuIGxpc3QsCit5b3UgY2FuIGNhbGwgdGhlIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKCkgaGVscGVyIHJvdXRpbmUgdG8gY3JlYXRlIGEKK3JlY29tbWVuZGVkIHByb2dyZXNzaW9uIHNlcXVlbmNlOyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieSBhbGwKK2FwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgdG8gZ2V0IGludm9sdmVkIGluIHRoZSBuaXR0eS1ncml0dHkgb2YKK3Byb2dyZXNzaXZlIHNjYW4gc2VxdWVuY2UgZGVzaWduLiAgKElmIHlvdSB3YW50IHRvIHByb3ZpZGUgdXNlciBjb250cm9sIG9mCitzY2FuIHNlcXVlbmNlcywgeW91IG1heSB3aXNoIHRvIGJvcnJvdyB0aGUgc2NhbiBzY3JpcHQgcmVhZGluZyBjb2RlIGZvdW5kCitpbiByZHN3aXRjaC5jLCBzbyB0aGF0IHlvdSBjYW4gcmVhZCBzY2FuIHNjcmlwdCBmaWxlcyBqdXN0IGxpa2UgY2pwZWcncy4pCitXaGVuIHNjYW5faW5mbyBpcyBub3QgTlVMTCwgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbCBzdG9yZSBEQ1QnZCBkYXRhCitpbnRvIGEgYnVmZmVyIGFycmF5IGFzIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgaXMgY2FsbGVkLCBhbmQgd2lsbCBlbWl0IGFsbAordGhlIHJlcXVlc3RlZCBzY2FucyBkdXJpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKS4gIFRoaXMgaW1wbGllcyB0aGF0CittdWx0aXBsZS1zY2FuIG91dHB1dCBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uCittYW5hZ2VyLCBzaW5jZSBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuc2lvbi4gIFdlCitzaG91bGQgYWxzbyBub3RlIHRoYXQgdGhlIGNvbXByZXNzb3IgY3VycmVudGx5IGZvcmNlcyBIdWZmbWFuIG9wdGltaXphdGlvbgorbW9kZSB3aGVuIGNyZWF0aW5nIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLCBiZWNhdXNlIHRoZSBkZWZhdWx0IEh1ZmZtYW4KK3RhYmxlcyBhcmUgdW5zdWl0YWJsZSBmb3IgcHJvZ3Jlc3NpdmUgZmlsZXMuCisKK1Byb2dyZXNzaXZlIGRlY29tcHJlc3Npb246CisKK1doZW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSBpcyBub3QgdXNlZCwgdGhlIGRlY29kZXIgbGlicmFyeSB3aWxsIHJlYWQgYWxsIG9mCithIG11bHRpLXNjYW4gZmlsZSBkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCksIHNvIHRoYXQgaXQgY2FuIHByb3ZpZGUgYQorZmluYWwgZGVjb2RlZCBpbWFnZS4gIChIZXJlICJtdWx0aS1zY2FuIiBtZWFucyBlaXRoZXIgcHJvZ3Jlc3NpdmUgb3IKK211bHRpLXNjYW4gc2VxdWVudGlhbC4pICBUaGlzIG1ha2VzIG11bHRpLXNjYW4gZmlsZXMgdHJhbnNwYXJlbnQgdG8gdGhlCitkZWNvZGluZyBhcHBsaWNhdGlvbi4gIEhvd2V2ZXIsIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZWQgc3VzcGVuZGluZworaW5wdXQgd2l0aCB2ZXJzaW9uIDUgb2YgdGhlIElKRyBsaWJyYXJ5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZCB0byBjaGVjaworZm9yIGEgc3VzcGVuc2lvbiByZXR1cm4gZnJvbSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKworVG8gcGVyZm9ybSBpbmNyZW1lbnRhbCBkaXNwbGF5LCBhbiBhcHBsaWNhdGlvbiBtdXN0IHVzZSB0aGUgbGlicmFyeSdzCitidWZmZXJlZC1pbWFnZSBtb2RlLiAgVGhpcyBpcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KKworCitCdWZmZXJlZC1pbWFnZSBtb2RlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBsaWJyYXJ5IHN0b3JlcyB0aGUgcGFydGlhbGx5IGRlY29kZWQgaW1hZ2UgaW4gYQorY29lZmZpY2llbnQgYnVmZmVyLCBmcm9tIHdoaWNoIGl0IGNhbiBiZSByZWFkIG91dCBhcyBtYW55IHRpbWVzIGFzIGRlc2lyZWQuCitUaGlzIG1vZGUgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGluY3JlbWVudGFsIGRpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcywKK2J1dCBpdCBjYW4gYmUgdXNlZCB3aXRoIGFueSBKUEVHIGZpbGUuICBFYWNoIHNjYW4gb2YgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUKK2FkZHMgbW9yZSBkYXRhIChtb3JlIGRldGFpbCkgdG8gdGhlIGJ1ZmZlcmVkIGltYWdlLiAgVGhlIGFwcGxpY2F0aW9uIGNhbgorZGlzcGxheSBpbiBsb2Nrc3RlcCB3aXRoIHRoZSBzb3VyY2UgZmlsZSAob25lIGRpc3BsYXkgcGFzcyBwZXIgaW5wdXQgc2NhbiksCitvciBpdCBjYW4gYWxsb3cgaW5wdXQgcHJvY2Vzc2luZyB0byBvdXRydW4gZGlzcGxheSBwcm9jZXNzaW5nLiAgQnkgbWFraW5nCitpbnB1dCBhbmQgZGlzcGxheSBwcm9jZXNzaW5nIHJ1biBpbmRlcGVuZGVudGx5LCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlCithcHBsaWNhdGlvbiB0byBhZGFwdCBwcm9ncmVzc2l2ZSBkaXNwbGF5IHRvIGEgd2lkZSByYW5nZSBvZiBkYXRhIHRyYW5zbWlzc2lvbgorcmF0ZXMuCisKK1RoZSBiYXNpYyBjb250cm9sIGZsb3cgZm9yIGJ1ZmZlcmVkLWltYWdlIGRlY29kaW5nIGlzCisKKwlqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkKKwlzZXQgZGF0YSBzb3VyY2UKKwlqcGVnX3JlYWRfaGVhZGVyKCkKKwlzZXQgb3ZlcmFsbCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKKwljaW5mby5idWZmZXJlZF9pbWFnZSA9IFRSVUU7CS8qIHNlbGVjdCBidWZmZXJlZC1pbWFnZSBtb2RlICovCisJanBlZ19zdGFydF9kZWNvbXByZXNzKCkKKwlmb3IgKGVhY2ggb3V0cHV0IHBhc3MpIHsKKwkgICAgYWRqdXN0IG91dHB1dCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQKKwkgICAganBlZ19zdGFydF9vdXRwdXQoKQkJLyogc3RhcnQgYSBuZXcgb3V0cHV0IHBhc3MgKi8KKwkgICAgZm9yIChhbGwgc2NhbmxpbmVzIGluIGltYWdlKSB7CisJICAgICAgICBqcGVnX3JlYWRfc2NhbmxpbmVzKCkKKwkgICAgICAgIGRpc3BsYXkgc2NhbmxpbmVzCisJICAgIH0KKwkgICAganBlZ19maW5pc2hfb3V0cHV0KCkJLyogdGVybWluYXRlIG91dHB1dCBwYXNzICovCisJfQorCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoKQorCWpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkKKworVGhpcyBkaWZmZXJzIGZyb20gb3JkaW5hcnkgdW5idWZmZXJlZCBkZWNvZGluZyBpbiB0aGF0IHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwKK2xldmVsIG9mIGxvb3BpbmcuICBUaGUgYXBwbGljYXRpb24gY2FuIGNob29zZSBob3cgbWFueSBvdXRwdXQgcGFzc2VzIHRvIG1ha2UKK2FuZCBob3cgdG8gZGlzcGxheSBlYWNoIHBhc3MuCisKK1RoZSBzaW1wbGVzdCBhcHByb2FjaCB0byBkaXNwbGF5aW5nIHByb2dyZXNzaXZlIGltYWdlcyBpcyB0byBkbyBvbmUgZGlzcGxheQorcGFzcyBmb3IgZWFjaCBzY2FuIGFwcGVhcmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIEluIHRoaXMgY2FzZSB0aGUgb3V0ZXIgbG9vcAorY29uZGl0aW9uIGlzIHR5cGljYWxseQorCXdoaWxlICghIGpwZWdfaW5wdXRfY29tcGxldGUoJmNpbmZvKSkKK2FuZCB0aGUgc3RhcnQtb3V0cHV0IGNhbGwgc2hvdWxkIHJlYWQKKwlqcGVnX3N0YXJ0X291dHB1dCgmY2luZm8sIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyKTsKK1RoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkgaW5kaWNhdGVzIHdoaWNoIHNjYW4gb2YgdGhlIGlucHV0CitmaWxlIGlzIHRvIGJlIGRpc3BsYXllZDsgdGhlIHNjYW5zIGFyZSBudW1iZXJlZCBzdGFydGluZyBhdCAxIGZvciB0aGlzCitwdXJwb3NlLiAgKFlvdSBjYW4gdXNlIGEgbG9vcCBjb3VudGVyIHN0YXJ0aW5nIGF0IDEgaWYgeW91IGxpa2UsIGJ1dCB1c2luZwordGhlIGxpYnJhcnkncyBpbnB1dCBzY2FuIGNvdW50ZXIgaXMgZWFzaWVyLikgIFRoZSBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgcmVhZHMKK2RhdGEgYXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIGVhY2ggcmVxdWVzdGVkIHNjYW4sIGFuZCBqcGVnX2ZpbmlzaF9vdXRwdXQoKQorYWR2YW5jZXMgdG8gdGhlIG5leHQgc2NhbiBvciBlbmQtb2YtaW1hZ2UgbWFya2VyIChoZW5jZSBpbnB1dF9zY2FuX251bWJlcgord2lsbCBiZSBpbmNyZW1lbnRlZCBieSB0aGUgdGltZSBjb250cm9sIGFycml2ZXMgYmFjayBhdCBqcGVnX3N0YXJ0X291dHB1dCgpKS4KK1dpdGggdGhpcyB0ZWNobmlxdWUsIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9ubHkgYXMgbmVlZGVkLCBhbmQKK2lucHV0IGFuZCBvdXRwdXQgcHJvY2Vzc2luZyBydW4gaW4gbG9ja3N0ZXAuCisKK0FmdGVyIHJlYWRpbmcgdGhlIGZpbmFsIHNjYW4gYW5kIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUsIHRoZQorYnVmZmVyZWQgaW1hZ2UgcmVtYWlucyBhdmFpbGFibGU7IGl0IGNhbiBiZSByZWFkIGFkZGl0aW9uYWwgdGltZXMgYnkKK3JlcGVhdGluZyB0aGUganBlZ19zdGFydF9vdXRwdXQoKS9qcGVnX3JlYWRfc2NhbmxpbmVzKCkvanBlZ19maW5pc2hfb3V0cHV0KCkKK3NlcXVlbmNlLiAgRm9yIGV4YW1wbGUsIGEgdXNlZnVsIHRlY2huaXF1ZSBpcyB0byB1c2UgZmFzdCBvbmUtcGFzcyBjb2xvcgorcXVhbnRpemF0aW9uIGZvciBkaXNwbGF5IHBhc3NlcyBtYWRlIHdoaWxlIHRoZSBpbWFnZSBpcyBhcnJpdmluZywgZm9sbG93ZWQgYnkKK2EgZmluYWwgZGlzcGxheSBwYXNzIHVzaW5nIHR3by1wYXNzIHF1YW50aXphdGlvbiBmb3IgaGlnaGVzdCBxdWFsaXR5LiAgVGhpcworaXMgZG9uZSBieSBjaGFuZ2luZyB0aGUgbGlicmFyeSBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgZmluYWwgb3V0cHV0IHBhc3MuCitDaGFuZ2luZyBwYXJhbWV0ZXJzIGJldHdlZW4gcGFzc2VzIGlzIGRpc2N1c3NlZCBpbiBkZXRhaWwgYmVsb3cuCisKK0luIGdlbmVyYWwgdGhlIGxhc3Qgc2NhbiBvZiBhIHByb2dyZXNzaXZlIGZpbGUgY2Fubm90IGJlIHJlY29nbml6ZWQgYXMgc3VjaAordW50aWwgYWZ0ZXIgaXQgaXMgcmVhZCwgc28gYSBwb3N0LWlucHV0IGRpc3BsYXkgcGFzcyBpcyB0aGUgYmVzdCBhcHByb2FjaCBpZgoreW91IHdhbnQgc3BlY2lhbCBwcm9jZXNzaW5nIGluIHRoZSBmaW5hbCBwYXNzLgorCitXaGVuIGRvbmUgd2l0aCB0aGUgaW1hZ2UsIGJlIHN1cmUgdG8gY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgdG8gcmVsZWFzZQordGhlIGJ1ZmZlcmVkIGltYWdlIChvciBqdXN0IHVzZSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpKS4KKworSWYgaW5wdXQgZGF0YSBhcnJpdmVzIGZhc3RlciB0aGFuIGl0IGNhbiBiZSBkaXNwbGF5ZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4KK2NhdXNlIHRoZSBsaWJyYXJ5IHRvIGRlY29kZSBpbnB1dCBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCdzIG5lZWRlZCB0byBwcm9kdWNlCitvdXRwdXQuICBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyB0aGUgcm91dGluZSBqcGVnX2NvbnN1bWVfaW5wdXQoKS4KK1RoZSByZXR1cm4gdmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJSlBFR19SRUFDSEVEX1NPUzogICAgcmVhY2hlZCBhbiBTT1MgbWFya2VyICh0aGUgc3RhcnQgb2YgYSBuZXcgc2NhbikKKwlKUEVHX1JFQUNIRURfRU9JOiAgICByZWFjaGVkIHRoZSBFT0kgbWFya2VyIChlbmQgb2YgaW1hZ2UpCisJSlBFR19ST1dfQ09NUExFVEVEOiAgY29tcGxldGVkIHJlYWRpbmcgb25lIE1DVSByb3cgb2YgY29tcHJlc3NlZCBkYXRhCisJSlBFR19TQ0FOX0NPTVBMRVRFRDogY29tcGxldGVkIHJlYWRpbmcgbGFzdCBNQ1Ugcm93IG9mIGN1cnJlbnQgc2NhbgorCUpQRUdfU1VTUEVOREVEOiAgICAgIHN1c3BlbmRlZCBiZWZvcmUgY29tcGxldGluZyBhbnkgb2YgdGhlIGFib3ZlCisoSlBFR19TVVNQRU5ERUQgY2FuIG9jY3VyIG9ubHkgaWYgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuKSAgVGhpcworcm91dGluZSBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIGluaXRpYWxpemluZyB0aGUgSlBFRyBvYmplY3QuICBJdAorcmVhZHMgc29tZSBhZGRpdGlvbmFsIGRhdGEgYW5kIHJldHVybnMgd2hlbiBvbmUgb2YgdGhlIGluZGljYXRlZCBzaWduaWZpY2FudAorZXZlbnRzIG9jY3Vycy4gIChJZiBjYWxsZWQgYWZ0ZXIgdGhlIEVPSSBtYXJrZXIgaXMgcmVhY2hlZCwgaXQgd2lsbAoraW1tZWRpYXRlbHkgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0kgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJlYWQgbW9yZSBkYXRhLikKKworVGhlIGxpYnJhcnkncyBvdXRwdXQgcHJvY2Vzc2luZyB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKQord2hlbmV2ZXIgdGhlIG91dHB1dCBwcm9jZXNzaW5nIG92ZXJ0YWtlcyB0aGUgaW5wdXQ7IHRodXMsIHNpbXBsZSBsb2Nrc3RlcAorZGlzcGxheSByZXF1aXJlcyBubyBkaXJlY3QgY2FsbHMgdG8ganBlZ19jb25zdW1lX2lucHV0KCkuICBCdXQgYnkgYWRkaW5nCitjYWxscyB0byBqcGVnX2NvbnN1bWVfaW5wdXQoKSwgeW91IGNhbiBhYnNvcmIgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgaXMKK2JlaW5nIGRpc3BsYXllZC4gIFRoaXMgaGFzIHR3byBiZW5lZml0czoKKyAgKiBZb3UgY2FuIGxpbWl0IGJ1aWxkdXAgb2YgdW5wcm9jZXNzZWQgZGF0YSBpbiB5b3VyIGlucHV0IGJ1ZmZlci4KKyAgKiBZb3UgY2FuIGVsaW1pbmF0ZSBleHRyYSBkaXNwbGF5IHBhc3NlcyBieSBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZQorICAgIHN0YXRlIG9mIHRoZSBsaWJyYXJ5J3MgaW5wdXQgcHJvY2Vzc2luZy4KKworVGhlIGZpcnN0IG9mIHRoZXNlIGJlbmVmaXRzIG9ubHkgcmVxdWlyZXMgaW50ZXJzcGVyc2luZyBjYWxscyB0bworanBlZ19jb25zdW1lX2lucHV0KCkgd2l0aCB5b3VyIGRpc3BsYXkgb3BlcmF0aW9ucyBhbmQgYW55IG90aGVyIHByb2Nlc3NpbmcKK3lvdSBtYXkgYmUgZG9pbmcuICBUbyBhdm9pZCB3YXN0aW5nIGN5Y2xlcyBkdWUgdG8gYmFja3RyYWNraW5nLCBpdCdzIGJlc3QgdG8KK2NhbGwganBlZ19jb25zdW1lX2lucHV0KCkgb25seSBhZnRlciBhIGh1bmRyZWQgb3Igc28gbmV3IGJ5dGVzIGhhdmUgYXJyaXZlZC4KK1RoaXMgaXMgZGlzY3Vzc2VkIGZ1cnRoZXIgdW5kZXIgIkkvTyBzdXNwZW5zaW9uIiwgYWJvdmUuICAoTm90ZTogdGhlIEpQRUcKK2xpYnJhcnkgY3VycmVudGx5IGlzIG5vdCB0aHJlYWQtc2FmZS4gIFlvdSBtdXN0IG5vdCBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpCitmcm9tIG9uZSB0aHJlYWQgb2YgY29udHJvbCBpZiBhIGRpZmZlcmVudCBsaWJyYXJ5IHJvdXRpbmUgaXMgd29ya2luZyBvbiB0aGUKK3NhbWUgSlBFRyBvYmplY3QgaW4gYW5vdGhlciB0aHJlYWQuKQorCitXaGVuIGlucHV0IGFycml2ZXMgZmFzdCBlbm91Z2ggdGhhdCBtb3JlIHRoYW4gb25lIG5ldyBzY2FuIGlzIGF2YWlsYWJsZQorYmVmb3JlIHlvdSBzdGFydCBhIG5ldyBvdXRwdXQgcGFzcywgeW91IG1heSBhcyB3ZWxsIHNraXAgdGhlIG91dHB1dCBwYXNzCitjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wbGV0ZWQgc2Nhbi4gIFRoaXMgb2NjdXJzIGZvciBmcmVlIGlmIHlvdSBwYXNzCitjaW5mby5pbnB1dF9zY2FuX251bWJlciBhcyB0aGUgdGFyZ2V0IHNjYW4gbnVtYmVyIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCitUaGUgaW5wdXRfc2Nhbl9udW1iZXIgZmllbGQgaXMgc2ltcGx5IHRoZSBpbmRleCBvZiB0aGUgc2NhbiBjdXJyZW50bHkgYmVpbmcKK2NvbnN1bWVkIGJ5IHRoZSBpbnB1dCBwcm9jZXNzb3IuICBZb3UgY2FuIGVuc3VyZSB0aGF0IHRoaXMgaXMgdXAtdG8tZGF0ZSBieQorZW1wdHlpbmcgdGhlIGlucHV0IGJ1ZmZlciBqdXN0IGJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfb3V0cHV0KCk6IGNhbGwKK2pwZWdfY29uc3VtZV9pbnB1dCgpIHJlcGVhdGVkbHkgdW50aWwgaXQgcmV0dXJucyBKUEVHX1NVU1BFTkRFRCBvcgorSlBFR19SRUFDSEVEX0VPSS4KKworVGhlIHRhcmdldCBzY2FuIG51bWJlciBwYXNzZWQgdG8ganBlZ19zdGFydF9vdXRwdXQoKSBpcyBzYXZlZCBpbiB0aGUKK2NpbmZvLm91dHB1dF9zY2FuX251bWJlciBmaWVsZC4gIFRoZSBsaWJyYXJ5J3Mgb3V0cHV0IHByb2Nlc3NpbmcgY2FsbHMKK2pwZWdfY29uc3VtZV9pbnB1dCgpIHdoZW5ldmVyIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGFuZCByb3cgd2l0aGluCit0aGF0IHNjYW4gaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IG91dHB1dCBzY2FuIG51bWJlciBhbmQgcm93LgorVGh1cywgaW5wdXQgcHJvY2Vzc2luZyBjYW4gImdldCBhaGVhZCIgb2YgdGhlIG91dHB1dCBwcm9jZXNzaW5nIGJ1dCBpcyBub3QKK2FsbG93ZWQgdG8gImZhbGwgYmVoaW5kIi4gIFlvdSBjYW4gYWNoaWV2ZSBzZXZlcmFsIGRpZmZlcmVudCBlZmZlY3RzIGJ5CittYW5pcHVsYXRpbmcgdGhpcyBpbnRlcmxvY2sgcnVsZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgcGFzcyBhIHRhcmdldCBzY2FuCitudW1iZXIgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyLCB0aGUgb3V0cHV0IHByb2Nlc3NvciB3aWxsCit3YWl0IHVudGlsIHRoYXQgc2NhbiBzdGFydHMgdG8gYXJyaXZlIGJlZm9yZSBwcm9kdWNpbmcgYW55IG91dHB1dC4gIChUbyBhdm9pZAorYW4gaW5maW5pdGUgbG9vcCwgdGhlIHRhcmdldCBzY2FuIG51bWJlciBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIHRoZSBsYXN0CitzY2FuIG51bWJlciB3aGVuIHRoZSBlbmQgb2YgaW1hZ2UgaXMgcmVhY2hlZC4gIFRodXMsIGlmIHlvdSBzcGVjaWZ5IGEgbGFyZ2UKK3RhcmdldCBzY2FuIG51bWJlciwgdGhlIGxpYnJhcnkgd2lsbCBqdXN0IGFic29yYiB0aGUgZW50aXJlIGlucHV0IGZpbGUgYW5kCit0aGVuIHBlcmZvcm0gYW4gb3V0cHV0IHBhc3MuICBUaGlzIGlzIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIHdoYXQKK2pwZWdfc3RhcnRfZGVjb21wcmVzcygpIGRvZXMgd2hlbiB5b3UgZG9uJ3Qgc2VsZWN0IGJ1ZmZlcmVkLWltYWdlIG1vZGUuKQorV2hlbiB5b3UgcGFzcyBhIHRhcmdldCBzY2FuIG51bWJlciBlcXVhbCB0byB0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciwKK3RoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgbm8gZmFzdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBhcnJpdmVzLiAgVGhlCitmaW5hbCBwb3NzaWJpbGl0eSBpcyB0byBwYXNzIGEgdGFyZ2V0IHNjYW4gbnVtYmVyIGxlc3MgdGhhbiB0aGUgY3VycmVudCBpbnB1dAorc2NhbiBudW1iZXI7IHRoaXMgZGlzYWJsZXMgdGhlIGlucHV0L291dHB1dCBpbnRlcmxvY2sgYW5kIGNhdXNlcyB0aGUgb3V0cHV0Citwcm9jZXNzb3IgdG8gc2ltcGx5IGRpc3BsYXkgd2hhdGV2ZXIgaXQgZmluZHMgaW4gdGhlIGltYWdlIGJ1ZmZlciwgd2l0aG91dAord2FpdGluZyBmb3IgaW5wdXQuICAoSG93ZXZlciwgdGhlIGxpYnJhcnkgd2lsbCBub3QgYWNjZXB0IGEgdGFyZ2V0IHNjYW4KK251bWJlciBsZXNzIHRoYW4gb25lLCBzbyB5b3UgY2FuJ3QgYXZvaWQgd2FpdGluZyBmb3IgdGhlIGZpcnN0IHNjYW4uKQorCitXaGVuIGRhdGEgaXMgYXJyaXZpbmcgZmFzdGVyIHRoYW4gdGhlIG91dHB1dCBkaXNwbGF5IHByb2Nlc3NpbmcgY2FuIGFkdmFuY2UKK3Rocm91Z2ggdGhlIGltYWdlLCBqcGVnX2NvbnN1bWVfaW5wdXQoKSB3aWxsIHN0b3JlIGRhdGEgaW50byB0aGUgYnVmZmVyZWQKK2ltYWdlIGJleW9uZCB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG91dHB1dCBwcm9jZXNzaW5nIGlzIHJlYWRpbmcgZGF0YSBvdXQKK2FnYWluLiAgSWYgdGhlIGlucHV0IGFycml2ZXMgZmFzdCBlbm91Z2gsIGl0IG1heSAid3JhcCBhcm91bmQiIHRoZSBidWZmZXIgdG8KK3RoZSBwb2ludCB3aGVyZSB0aGUgaW5wdXQgaXMgbW9yZSB0aGFuIG9uZSB3aG9sZSBzY2FuIGFoZWFkIG9mIHRoZSBvdXRwdXQuCitJZiB0aGUgb3V0cHV0IHByb2Nlc3Npbmcgc2ltcGx5IHByb2NlZWRzIHRocm91Z2ggaXRzIGRpc3BsYXkgcGFzcyB3aXRob3V0CitwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBpbnB1dCwgdGhlIGVmZmVjdCBzZWVuIG9uLXNjcmVlbiBpcyB0aGF0IHRoZSBsb3dlcgorcGFydCBvZiB0aGUgaW1hZ2UgaXMgb25lIG9yIG1vcmUgc2NhbnMgYmV0dGVyIGluIHF1YWxpdHkgdGhhbiB0aGUgdXBwZXIgcGFydC4KK1RoZW4sIHdoZW4gdGhlIG5leHQgb3V0cHV0IHNjYW4gaXMgc3RhcnRlZCwgeW91IGhhdmUgYSBjaG9pY2Ugb2Ygd2hhdCB0YXJnZXQKK3NjYW4gbnVtYmVyIHRvIHVzZS4gIFRoZSByZWNvbW1lbmRlZCBjaG9pY2UgaXMgdG8gdXNlIHRoZSBjdXJyZW50IGlucHV0IHNjYW4KK251bWJlciBhdCB0aGF0IHRpbWUsIHdoaWNoIGltcGxpZXMgdGhhdCB5b3UndmUgc2tpcHBlZCB0aGUgb3V0cHV0IHNjYW5zCitjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzY2FucyB0aGF0IHdlcmUgY29tcGxldGVkIHdoaWxlIHlvdSBwcm9jZXNzZWQgdGhlCitwcmV2aW91cyBvdXRwdXQgc2Nhbi4gIEluIHRoaXMgd2F5LCB0aGUgZGVjb2RlciBhdXRvbWF0aWNhbGx5IGFkYXB0cyBpdHMKK3NwZWVkIHRvIHRoZSBhcnJpdmluZyBkYXRhLCBieSBza2lwcGluZyBvdXRwdXQgc2NhbnMgYXMgbmVjZXNzYXJ5IHRvIGtlZXAgdXAKK3dpdGggdGhlIGFycml2aW5nIGRhdGEuCisKK1doZW4gdXNpbmcgdGhpcyBzdHJhdGVneSwgeW91J2xsIHdhbnQgdG8gYmUgc3VyZSB0aGF0IHlvdSBwZXJmb3JtIGEgZmluYWwKK291dHB1dCBwYXNzIGFmdGVyIHJlY2VpdmluZyBhbGwgdGhlIGRhdGE7IG90aGVyd2lzZSB5b3VyIGxhc3QgZGlzcGxheSBtYXkgbm90CitiZSBmdWxsIHF1YWxpdHkgYWNyb3NzIHRoZSB3aG9sZSBzY3JlZW4uICBTbyB0aGUgcmlnaHQgb3V0ZXIgbG9vcCBsb2dpYyBpcworc29tZXRoaW5nIGxpa2UgdGhpczoKKwlkbyB7CisJICAgIGFic29yYiBhbnkgd2FpdGluZyBpbnB1dCBieSBjYWxsaW5nIGpwZWdfY29uc3VtZV9pbnB1dCgpCisJICAgIGZpbmFsX3Bhc3MgPSBqcGVnX2lucHV0X2NvbXBsZXRlKCZjaW5mbyk7CisJICAgIGFkanVzdCBvdXRwdXQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkCisJICAgIGpwZWdfc3RhcnRfb3V0cHV0KCZjaW5mbywgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIpOworCSAgICAuLi4KKwkgICAganBlZ19maW5pc2hfb3V0cHV0KCkKKwl9IHdoaWxlICghIGZpbmFsX3Bhc3MpOworcmF0aGVyIHRoYW4gcXVpdHRpbmcgYXMgc29vbiBhcyBqcGVnX2lucHV0X2NvbXBsZXRlKCkgcmV0dXJucyBUUlVFLiAgVGhpcworYXJyYW5nZW1lbnQgbWFrZXMgaXQgc2ltcGxlIHRvIHVzZSBoaWdoZXItcXVhbGl0eSBkZWNvZGluZyBwYXJhbWV0ZXJzCitmb3IgdGhlIGZpbmFsIHBhc3MuICBCdXQgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHNwZWNpYWwgcGFyYW1ldGVycyBmb3IKK3RoZSBmaW5hbCBwYXNzLCB0aGUgcmlnaHQgbG9vcCBsb2dpYyBpcyBsaWtlIHRoaXM6CisJZm9yICg7OykgeworCSAgICBhYnNvcmIgYW55IHdhaXRpbmcgaW5wdXQgYnkgY2FsbGluZyBqcGVnX2NvbnN1bWVfaW5wdXQoKQorCSAgICBqcGVnX3N0YXJ0X291dHB1dCgmY2luZm8sIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyKTsKKwkgICAgLi4uCisJICAgIGpwZWdfZmluaXNoX291dHB1dCgpCisJICAgIGlmIChqcGVnX2lucHV0X2NvbXBsZXRlKCZjaW5mbykgJiYKKwkgICAgICAgIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLm91dHB1dF9zY2FuX251bWJlcikKKwkgICAgICBicmVhazsKKwl9CitJbiB0aGlzIGNhc2UgeW91IGRvbid0IG5lZWQgdG8ga25vdyBpbiBhZHZhbmNlIHdoZXRoZXIgYW4gb3V0cHV0IHBhc3MgaXMgdG8KK2JlIHRoZSBsYXN0IG9uZSwgc28gaXQncyBub3QgbmVjZXNzYXJ5IHRvIGhhdmUgcmVhY2hlZCBFT0YgYmVmb3JlIHN0YXJ0aW5nCit0aGUgZmluYWwgb3V0cHV0IHBhc3M7IHJhdGhlciwgd2hhdCB5b3Ugd2FudCB0byB0ZXN0IGlzIHdoZXRoZXIgdGhlIG91dHB1dAorcGFzcyB3YXMgcGVyZm9ybWVkIGluIHN5bmMgd2l0aCB0aGUgZmluYWwgaW5wdXQgc2Nhbi4gIFRoaXMgZm9ybSBvZiB0aGUgbG9vcAord2lsbCBhdm9pZCBhbiBleHRyYSBvdXRwdXQgcGFzcyB3aGVuZXZlciB0aGUgZGVjb2RlciBpcyBhYmxlIChvciBuZWFybHkgYWJsZSkKK3RvIGtlZXAgdXAgd2l0aCB0aGUgaW5jb21pbmcgZGF0YS4KKworV2hlbiB0aGUgZGF0YSB0cmFuc21pc3Npb24gc3BlZWQgaXMgaGlnaCwgeW91IG1pZ2h0IGJlZ2luIGEgZGlzcGxheSBwYXNzLAordGhlbiBmaW5kIHRoYXQgbXVjaCBvciBhbGwgb2YgdGhlIGZpbGUgaGFzIGFycml2ZWQgYmVmb3JlIHlvdSBjYW4gY29tcGxldGUKK3RoZSBwYXNzLiAgKFlvdSBjYW4gZGV0ZWN0IHRoaXMgYnkgbm90aW5nIHRoZSBKUEVHX1JFQUNIRURfRU9JIHJldHVybiBjb2RlCitmcm9tIGpwZWdfY29uc3VtZV9pbnB1dCgpLCBvciBlcXVpdmFsZW50bHkgYnkgdGVzdGluZyBqcGVnX2lucHV0X2NvbXBsZXRlKCkuKQorSW4gdGhpcyBzaXR1YXRpb24geW91IG1heSB3aXNoIHRvIGFib3J0IHRoZSBjdXJyZW50IGRpc3BsYXkgcGFzcyBhbmQgc3RhcnQgYQorbmV3IG9uZSB1c2luZyB0aGUgbmV3bHkgYXJyaXZlZCBpbmZvcm1hdGlvbi4gIFRvIGRvIHNvLCBqdXN0IGNhbGwKK2pwZWdfZmluaXNoX291dHB1dCgpIGFuZCB0aGVuIHN0YXJ0IGEgbmV3IHBhc3Mgd2l0aCBqcGVnX3N0YXJ0X291dHB1dCgpLgorCitBIHZhcmlhbnQgc3RyYXRlZ3kgaXMgdG8gYWJvcnQgYW5kIHJlc3RhcnQgZGlzcGxheSBpZiBtb3JlIHRoYW4gb25lIGNvbXBsZXRlCitzY2FuIGFycml2ZXMgZHVyaW5nIGFuIG91dHB1dCBwYXNzOyB0aGlzIGNhbiBiZSBkZXRlY3RlZCBieSBub3RpbmcKK0pQRUdfUkVBQ0hFRF9TT1MgcmV0dXJucyBhbmQvb3IgZXhhbWluaW5nIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyLiAgVGhpcworaWRlYSBzaG91bGQgYmUgZW1wbG95ZWQgd2l0aCBjYXV0aW9uLCBob3dldmVyLCBzaW5jZSB0aGUgZGlzcGxheSBwcm9jZXNzCittaWdodCBuZXZlciBnZXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UgYmVmb3JlIGJlaW5nIGFib3J0ZWQsIHJlc3VsdGluZworaW4gdGhlIGxvd2VyIHBhcnQgb2YgdGhlIHNjcmVlbiBiZWluZyBzZXZlcmFsIHBhc3NlcyB3b3JzZSB0aGFuIHRoZSB1cHBlci4KK0luIG1vc3QgY2FzZXMgaXQncyBwcm9iYWJseSBiZXN0IHRvIGFib3J0IGFuIG91dHB1dCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlCitmaWxlIGhhcyBhcnJpdmVkIGFuZCB5b3Ugd2FudCB0byBiZWdpbiB0aGUgZmluYWwgb3V0cHV0IHBhc3MgaW1tZWRpYXRlbHkuCisKK1doZW4gcmVjZWl2aW5nIGRhdGEgYWNyb3NzIGEgY29tbXVuaWNhdGlvbiBsaW5rLCB3ZSByZWNvbW1lbmQgYWx3YXlzIHVzaW5nCit0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciBmb3IgdGhlIG91dHB1dCB0YXJnZXQgc2NhbiBudW1iZXI7IGlmIGEKK2hpZ2hlci1xdWFsaXR5IGZpbmFsIHBhc3MgaXMgdG8gYmUgZG9uZSwgaXQgc2hvdWxkIGJlIHN0YXJ0ZWQgKGFib3J0aW5nIGFueQoraW5jb21wbGV0ZSBvdXRwdXQgcGFzcykgYXMgc29vbiBhcyB0aGUgZW5kIG9mIGZpbGUgaXMgcmVjZWl2ZWQuICBIb3dldmVyLAorbWFueSBvdGhlciBzdHJhdGVnaWVzIGFyZSBwb3NzaWJsZS4gIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24gY2FuIGV4YW1pbmUKK3RoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gYW5kIGRlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXkgaXQgb3IKK25vdC4gIElmIHRoZSBzY2FuIGNvbnRhaW5zIG9ubHkgY2hyb21hIGRhdGEsIG9uZSBtaWdodCBjaG9vc2Ugbm90IHRvIHVzZSBpdAorYXMgdGhlIHRhcmdldCBzY2FuLCBleHBlY3RpbmcgdGhhdCB0aGUgc2NhbiB3aWxsIGJlIHNtYWxsIGFuZCB3aWxsIGFycml2ZQorcXVpY2tseS4gIFRvIHNraXAgdG8gdGhlIG5leHQgc2NhbiwgY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSB1bnRpbCBpdAorcmV0dXJucyBKUEVHX1JFQUNIRURfU09TIG9yIEpQRUdfUkVBQ0hFRF9FT0kuICBPciBqdXN0IHVzZSB0aGUgbmV4dCBoaWdoZXIKK251bWJlciBhcyB0aGUgdGFyZ2V0IHNjYW4gZm9yIGpwZWdfc3RhcnRfb3V0cHV0KCk7IGJ1dCB0aGF0IG1ldGhvZCBkb2Vzbid0CitsZXQgeW91IGluc3BlY3QgdGhlIG5leHQgc2NhbidzIHBhcmFtZXRlcnMgYmVmb3JlIGRlY2lkaW5nIHRvIGRpc3BsYXkgaXQuCisKKworSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwganBlZ19zdGFydF9kZWNvbXByZXNzKCkgbmV2ZXIgcGVyZm9ybXMgaW5wdXQgYW5kCit0aHVzIG5ldmVyIHN1c3BlbmRzLiAgQW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIGlucHV0IHN1c3BlbnNpb24gd2l0aAorYnVmZmVyZWQtaW1hZ2UgbW9kZSBtdXN0IGJlIHByZXBhcmVkIGZvciBzdXNwZW5zaW9uIHJldHVybnMgZnJvbSB0aGVzZQorcm91dGluZXM6CisqIGpwZWdfc3RhcnRfb3V0cHV0KCkgcGVyZm9ybXMgaW5wdXQgb25seSBpZiB5b3UgcmVxdWVzdCAyLXBhc3MgcXVhbnRpemF0aW9uCisgIGFuZCB0aGUgdGFyZ2V0IHNjYW4gaXNuJ3QgZnVsbHkgcmVhZCB5ZXQuICAoVGhpcyBpcyBkaXNjdXNzZWQgYmVsb3cuKQorKiBqcGVnX3JlYWRfc2NhbmxpbmVzKCksIGFzIGFsd2F5cywgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyB0aGF0IGl0CisgIHdhcyBhYmxlIHRvIHByb2R1Y2UgYmVmb3JlIHN1c3BlbmRpbmcuCisqIGpwZWdfZmluaXNoX291dHB1dCgpIHdpbGwgcmVhZCBhbnkgbWFya2VycyBmb2xsb3dpbmcgdGhlIHRhcmdldCBzY2FuLAorICB1cCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIG9yIHRoZSBTT1MgbWFya2VyIHRoYXQgYmVnaW5zIGFub3RoZXIgc2Nhbi4KKyAgKEJ1dCBpdCByZWFkcyBubyBpbnB1dCBpZiBqcGVnX2NvbnN1bWVfaW5wdXQoKSBoYXMgYWxyZWFkeSByZWFjaGVkIHRoZQorICBlbmQgb2YgdGhlIGZpbGUgb3IgYSBTT1MgbWFya2VyIGJleW9uZCB0aGUgdGFyZ2V0IG91dHB1dCBzY2FuLikKKyoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHdpbGwgcmVhZCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUsIGFuZCB0aHVzIGNhbgorICBzdXNwZW5kIGlmIHRoZSBlbmQgaGFzbid0IGFscmVhZHkgYmVlbiByZWFjaGVkIChhcyBjYW4gYmUgdGVzdGVkIGJ5CisgIGNhbGxpbmcganBlZ19pbnB1dF9jb21wbGV0ZSgpKS4KK2pwZWdfc3RhcnRfb3V0cHV0KCksIGpwZWdfZmluaXNoX291dHB1dCgpLCBhbmQganBlZ19maW5pc2hfZGVjb21wcmVzcygpCithbGwgcmV0dXJuIFRSVUUgaWYgdGhleSBjb21wbGV0ZWQgdGhlaXIgdGFza3MsIEZBTFNFIGlmIHRoZXkgaGFkIHRvIHN1c3BlbmQuCitJbiB0aGUgZXZlbnQgb2YgYSBGQUxTRSByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGxvYWQgbW9yZSBpbnB1dCBkYXRhCithbmQgcmVwZWF0IHRoZSBjYWxsLiAgQXBwbGljYXRpb25zIHRoYXQgdXNlIG5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlcyBuZWVkCitub3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlc2UgdGhyZWUgcm91dGluZXMuCisKKworSXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIGRlY29kaW5nIHBhcmFtZXRlcnMgYmV0d2VlbiBvdXRwdXQgcGFzc2VzIGluIHRoZQorYnVmZmVyZWQtaW1hZ2UgbW9kZS4gIFRoZSBkZWNvZGVyIGxpYnJhcnkgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgdmVyeQorbGltaXRlZCBjaGFuZ2VzIG9mIHBhcmFtZXRlcnMuICBPTkxZIFRIRSBGT0xMT1dJTkcgcGFyYW1ldGVyIGNoYW5nZXMgYXJlCithbGxvd2VkIGFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGlzIGNhbGxlZDoKKyogZGN0X21ldGhvZCBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCisgIEZvciBleGFtcGxlLCBvbmUgY291bGQgdXNlIGEgZmFzdCBEQ1QgbWV0aG9kIGZvciBlYXJseSBzY2FucywgY2hhbmdpbmcKKyAgdG8gYSBoaWdoZXIgcXVhbGl0eSBtZXRob2QgZm9yIHRoZSBmaW5hbCBzY2FuLgorKiBkaXRoZXJfbW9kZSBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCk7CisgIG9mIGNvdXJzZSB0aGlzIGhhcyBubyBpbXBhY3QgaWYgbm90IHVzaW5nIGNvbG9yIHF1YW50aXphdGlvbi4gIFR5cGljYWxseQorICBvbmUgd291bGQgdXNlIG9yZGVyZWQgZGl0aGVyIGZvciBpbml0aWFsIHBhc3NlcywgdGhlbiBzd2l0Y2ggdG8KKyAgRmxveWQtU3RlaW5iZXJnIGRpdGhlciBmb3IgdGhlIGZpbmFsIHBhc3MuICBDYXV0aW9uOiBjaGFuZ2luZyBkaXRoZXIgbW9kZQorICBjYW4gY2F1c2UgbW9yZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5LiAgQWx0aG91Z2ggdGhlIGFtb3VudAorICBvZiBtZW1vcnkgaW52b2x2ZWQgaXMgbm90IGxhcmdlIChhIHNjYW5saW5lIG9yIHNvKSwgaXQgbWF5IGNhdXNlIHRoZQorICBpbml0aWFsIG1heF9tZW1vcnlfdG9fdXNlIHNwZWNpZmljYXRpb24gdG8gYmUgZXhjZWVkZWQsIHdoaWNoIGluIHRoZSB3b3JzdAorICBjYXNlIHdvdWxkIHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtb3J5IGZhaWx1cmUuCisqIGRvX2Jsb2NrX3Ntb290aGluZyBjYW4gYmUgY2hhbmdlZCBiZWZvcmUgZWFjaCBjYWxsIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkuCisgIFRoaXMgc2V0dGluZyBpcyByZWxldmFudCBvbmx5IHdoZW4gZGVjb2RpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHIGltYWdlLgorICBEdXJpbmcgdGhlIGZpcnN0IERDLW9ubHkgc2NhbiwgYmxvY2sgc21vb3RoaW5nIHByb3ZpZGVzIGEgdmVyeSAiZnV6enkiIGxvb2sKKyAgaW5zdGVhZCBvZiB0aGUgdmVyeSAiYmxvY2t5IiBsb29rIHNlZW4gd2l0aG91dCBpdDsgd2hpY2ggaXMgYmV0dGVyIHNlZW1zIGEKKyAgbWF0dGVyIG9mIHBlcnNvbmFsIHRhc3RlLiAgQnV0IGJsb2NrIHNtb290aGluZyBpcyBuZWFybHkgYWx3YXlzIGEgd2luCisgIGR1cmluZyBsYXRlciBzdGFnZXMsIGVzcGVjaWFsbHkgd2hlbiBkZWNvZGluZyBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbgorICBpbWFnZTogc21vb3RoaW5nIGhlbHBzIHRvIGhpZGUgdGhlIHNsaWdodCBibG9ja2luZXNzIHRoYXQgb3RoZXJ3aXNlIHNob3dzCisgIHVwIG9uIHNtb290aCBncmFkaWVudHMgdW50aWwgdGhlIGxvd2VzdCBjb2VmZmljaWVudCBiaXRzIGFyZSBzZW50LgorKiBDb2xvciBxdWFudGl6YXRpb24gbW9kZSBjYW4gYmUgY2hhbmdlZCB1bmRlciB0aGUgcnVsZXMgZGVzY3JpYmVkIGJlbG93LgorICBZb3UgKmNhbm5vdCogY2hhbmdlIGJldHdlZW4gZnVsbC1jb2xvciBhbmQgcXVhbnRpemVkIG91dHB1dCAoYmVjYXVzZSB0aGF0CisgIHdvdWxkIGFsdGVyIHRoZSByZXF1aXJlZCBJL08gYnVmZmVyIHNpemVzKSwgYnV0IHlvdSBjYW4gY2hhbmdlIHdoaWNoCisgIHF1YW50aXphdGlvbiBtZXRob2QgaXMgdXNlZC4KKworV2hlbiBnZW5lcmF0aW5nIGNvbG9yLXF1YW50aXplZCBvdXRwdXQsIGNoYW5naW5nIHF1YW50aXphdGlvbiBtZXRob2QgaXMgYQordmVyeSB1c2VmdWwgd2F5IG9mIHN3aXRjaGluZyBiZXR3ZWVuIGhpZ2gtc3BlZWQgYW5kIGhpZ2gtcXVhbGl0eSBkaXNwbGF5LgorVGhlIGxpYnJhcnkgYWxsb3dzIHlvdSB0byBjaGFuZ2UgYW1vbmcgaXRzIHRocmVlIHF1YW50aXphdGlvbiBtZXRob2RzOgorMS4gU2luZ2xlLXBhc3MgcXVhbnRpemF0aW9uIHRvIGEgZml4ZWQgY29sb3IgY3ViZS4KKyAgIFNlbGVjdGVkIGJ5IGNpbmZvLnR3b19wYXNzX3F1YW50aXplID0gRkFMU0UgYW5kIGNpbmZvLmNvbG9ybWFwID0gTlVMTC4KKzIuIFNpbmdsZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBjb2xvcm1hcC4KKyAgIFNlbGVjdGVkIGJ5IHNldHRpbmcgY2luZm8uY29sb3JtYXAgdG8gcG9pbnQgdG8gdGhlIGNvbG9ybWFwICh0aGUgdmFsdWUgb2YKKyAgIHR3b19wYXNzX3F1YW50aXplIGlzIGlnbm9yZWQpOyBhbHNvIHNldCBjaW5mby5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycy4KKzMuIFR3by1wYXNzIHF1YW50aXphdGlvbiB0byBhIGNvbG9ybWFwIGNob3NlbiBzcGVjaWZpY2FsbHkgZm9yIHRoZSBpbWFnZS4KKyAgIFNlbGVjdGVkIGJ5IGNpbmZvLnR3b19wYXNzX3F1YW50aXplID0gVFJVRSBhbmQgY2luZm8uY29sb3JtYXAgPSBOVUxMLgorICAgKFRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZyBzZWxlY3RlZCBieSBqcGVnX3JlYWRfaGVhZGVyLCBidXQgaXQgaXMKKyAgIHByb2JhYmx5IE5PVCB3aGF0IHlvdSB3YW50IGZvciB0aGUgZmlyc3QgcGFzcyBvZiBwcm9ncmVzc2l2ZSBkaXNwbGF5ISkKK1RoZXNlIG1ldGhvZHMgb2ZmZXIgc3VjY2Vzc2l2ZWx5IGJldHRlciBxdWFsaXR5IGFuZCBsZXNzZXIgc3BlZWQuICBIb3dldmVyLAorb25seSB0aGUgZmlyc3QgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgcXVhbnRpemluZyBpbiBub24tUkdCIGNvbG9yIHNwYWNlcy4KKworSU1QT1JUQU5UOiBiZWNhdXNlIHRoZSBkaWZmZXJlbnQgcXVhbnRpemVyIG1ldGhvZHMgaGF2ZSB2ZXJ5IGRpZmZlcmVudAord29ya2luZy1zdG9yYWdlIHJlcXVpcmVtZW50cywgdGhlIGxpYnJhcnkgcmVxdWlyZXMgeW91IHRvIGluZGljYXRlIHdoaWNoCitvbmUocykgeW91IGludGVuZCB0byB1c2UgYmVmb3JlIHlvdSBjYWxsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgKElmIHdlIGRpZAorbm90IHJlcXVpcmUgdGhpcywgdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcgd291bGQgYmUgYSBjb21wbGV0ZSBmaWN0aW9uLikKK1lvdSBkbyB0aGlzIGJ5IHNldHRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgdGhyZWUgY2luZm8gZmllbGRzIHRvIFRSVUU6CisJZW5hYmxlXzFwYXNzX3F1YW50CQlGaXhlZCBjb2xvciBjdWJlIGNvbG9ybWFwCisJZW5hYmxlX2V4dGVybmFsX3F1YW50CQlFeHRlcm5hbGx5LXN1cHBsaWVkIGNvbG9ybWFwCisJZW5hYmxlXzJwYXNzX3F1YW50CQlUd28tcGFzcyBjdXN0b20gY29sb3JtYXAKK0FsbCB0aHJlZSBhcmUgaW5pdGlhbGl6ZWQgRkFMU0UgYnkganBlZ19yZWFkX2hlYWRlcigpLiAgQnV0CitqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBhdXRvbWF0aWNhbGx5IHNldHMgVFJVRSB0aGUgb25lIHNlbGVjdGVkIGJ5IHRoZQorY3VycmVudCB0d29fcGFzc19xdWFudGl6ZSBhbmQgY29sb3JtYXAgc2V0dGluZ3MsIHNvIHlvdSBvbmx5IG5lZWQgdG8gc2V0IHRoZQorZW5hYmxlIGZsYWdzIGZvciBhbnkgb3RoZXIgcXVhbnRpemF0aW9uIG1ldGhvZHMgeW91IHBsYW4gdG8gY2hhbmdlIHRvIGxhdGVyLgorCitBZnRlciBzZXR0aW5nIHRoZSBlbmFibGUgZmxhZ3MgY29ycmVjdGx5IGF0IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRpbWUsIHlvdQorY2FuIGNoYW5nZSB0byBhbnkgZW5hYmxlZCBxdWFudGl6YXRpb24gbWV0aG9kIGJ5IHNldHRpbmcgdHdvX3Bhc3NfcXVhbnRpemUKK2FuZCBjb2xvcm1hcCBwcm9wZXJseSBqdXN0IGJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfb3V0cHV0KCkuICBUaGUgZm9sbG93aW5nCitzcGVjaWFsIHJ1bGVzIGFwcGx5OgorMS4gWW91IG11c3QgZXhwbGljaXRseSBzZXQgY2luZm8uY29sb3JtYXAgdG8gTlVMTCB3aGVuIHN3aXRjaGluZyB0byAxLXBhc3MKKyAgIG9yIDItcGFzcyBtb2RlIGZyb20gYSBkaWZmZXJlbnQgbW9kZSwgb3Igd2hlbiB5b3Ugd2FudCB0aGUgMi1wYXNzCisgICBxdWFudGl6ZXIgdG8gYmUgcmUtcnVuIHRvIGdlbmVyYXRlIGEgbmV3IGNvbG9ybWFwLgorMi4gVG8gc3dpdGNoIHRvIGFuIGV4dGVybmFsIGNvbG9ybWFwLCBvciB0byBjaGFuZ2UgdG8gYSBkaWZmZXJlbnQgZXh0ZXJuYWwKKyAgIGNvbG9ybWFwIHRoYW4gd2FzIHVzZWQgb24gdGhlIHByaW9yIHBhc3MsIHlvdSBtdXN0IGNhbGwKKyAgIGpwZWdfbmV3X2NvbG9ybWFwKCkgYWZ0ZXIgc2V0dGluZyBjaW5mby5jb2xvcm1hcC4KK05PVEU6IGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgc2FtZSBjb2xvcm1hcCBhcyB3YXMgdXNlZCBpbiB0aGUgcHJpb3IgcGFzcywKK3lvdSBzaG91bGQgbm90IGRvIGVpdGhlciBvZiB0aGVzZSB0aGluZ3MuICBUaGlzIHdpbGwgc2F2ZSBzb21lIG5vbnRyaXZpYWwKK3N3aXRjaG92ZXIgY29zdHMuCisoVGhlc2UgcmVxdWlyZW1lbnRzIGV4aXN0IGJlY2F1c2UgY2luZm8uY29sb3JtYXAgd2lsbCBhbHdheXMgYmUgbm9uLU5VTEwKK2FmdGVyIGNvbXBsZXRpbmcgYSBwcmlvciBvdXRwdXQgcGFzcywgc2luY2UgYm90aCB0aGUgMS1wYXNzIGFuZCAyLXBhc3MKK3F1YW50aXplcnMgc2V0IGl0IHRvIHBvaW50IHRvIHRoZWlyIG91dHB1dCBjb2xvcm1hcHMuICBUaHVzIHlvdSBoYXZlIHRvCitkbyBvbmUgb2YgdGhlc2UgdHdvIHRoaW5ncyB0byBub3RpZnkgdGhlIGxpYnJhcnkgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQuCitZdXAsIGl0J3MgYSBiaXQga2x1Z3ksIGJ1dCBpdCdzIG5lY2Vzc2FyeSB0byBkbyBpdCB0aGlzIHdheSBmb3IgYmFja3dhcmRzCitjb21wYXRpYmlsaXR5LikKKworTm90ZSB0aGF0IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBsaWJyYXJ5IGdlbmVyYXRlcyBhbnkgcmVxdWVzdGVkIGNvbG9ybWFwCitkdXJpbmcganBlZ19zdGFydF9vdXRwdXQoKSwgbm90IGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKworV2hlbiB1c2luZyB0d28tcGFzcyBxdWFudGl6YXRpb24sIGpwZWdfc3RhcnRfb3V0cHV0KCkgbWFrZXMgYSBwYXNzIG92ZXIgdGhlCitidWZmZXJlZCBpbWFnZSB0byBkZXRlcm1pbmUgdGhlIG9wdGltdW0gY29sb3IgbWFwOyBpdCB0aGVyZWZvcmUgbWF5IHRha2UgYQorc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUsIHdoZXJlYXMgb3JkaW5hcmlseSBpdCBkb2VzIGxpdHRsZSB3b3JrLiAgVGhlCitwcm9ncmVzcyBtb25pdG9yIGhvb2sgaXMgY2FsbGVkIGR1cmluZyB0aGlzIHBhc3MsIGlmIGRlZmluZWQuICBJdCBpcyBhbHNvCitpbXBvcnRhbnQgdG8gcmVhbGl6ZSB0aGF0IGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHNjYW4gbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbgorb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIsIGpwZWdfc3RhcnRfb3V0cHV0KCkgd2lsbCBhdHRlbXB0Cit0byBjb25zdW1lIGlucHV0IGFzIGl0IG1ha2VzIHRoaXMgcGFzcy4gIElmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLAoreW91IG5lZWQgdG8gY2hlY2sgZm9yIGEgRkFMU0UgcmV0dXJuIGZyb20ganBlZ19zdGFydF9vdXRwdXQoKSB1bmRlciB0aGVzZQorY29uZGl0aW9ucy4gIFRoZSBjb21iaW5hdGlvbiBvZiAyLXBhc3MgcXVhbnRpemF0aW9uIGFuZCBhIG5vdC15ZXQtZnVsbHktcmVhZAordGFyZ2V0IHNjYW4gaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCBqcGVnX3N0YXJ0X291dHB1dCgpIHdpbGwgY29uc3VtZSBpbnB1dC4KKworCitBcHBsaWNhdGlvbiBhdXRob3JzIHdobyBzdXBwb3J0IGJ1ZmZlcmVkLWltYWdlIG1vZGUgbWF5IGJlIHRlbXB0ZWQgdG8gdXNlIGl0Citmb3IgYWxsIEpQRUcgaW1hZ2VzLCBldmVuIHNpbmdsZS1zY2FuIG9uZXMuICBUaGlzIHdpbGwgd29yaywgYnV0IGl0IGlzCitpbmVmZmljaWVudDogdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYW4gaW1hZ2Utc2l6ZWQgY29lZmZpY2llbnQgYnVmZmVyIGZvcgorc2luZ2xlLXNjYW4gaW1hZ2VzLiAgUmVxdWVzdGluZyBidWZmZXJlZC1pbWFnZSBtb2RlIGZvciBzdWNoIGFuIGltYWdlIHdhc3RlcworbWVtb3J5LiAgV29yc2UsIGl0IGNhbiBjb3N0IHRpbWUgb24gbGFyZ2UgaW1hZ2VzLCBzaW5jZSB0aGUgYnVmZmVyZWQgZGF0YSBoYXMKK3RvIGJlIHN3YXBwZWQgb3V0IG9yIHdyaXR0ZW4gdG8gYSB0ZW1wb3JhcnkgZmlsZS4gIElmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0CittYXhpbXVtIHBlcmZvcm1hbmNlIG9uIGJhc2VsaW5lIEpQRUcgZmlsZXMsIHlvdSBzaG91bGQgdXNlIGJ1ZmZlcmVkLWltYWdlCittb2RlIG9ubHkgd2hlbiB0aGUgaW5jb21pbmcgZmlsZSBhY3R1YWxseSBoYXMgbXVsdGlwbGUgc2NhbnMuICBUaGlzIGNhbiBiZQordGVzdGVkIGJ5IGNhbGxpbmcganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMoKSwgd2hpY2ggd2lsbCByZXR1cm4gYSBjb3JyZWN0CityZXN1bHQgYXQgYW55IHRpbWUgYWZ0ZXIganBlZ19yZWFkX2hlYWRlcigpIGNvbXBsZXRlcy4KKworSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB3aGVuIHlvdSB1c2UganBlZ19jb25zdW1lX2lucHV0KCkgdG8gbGV0IGlucHV0Citwcm9jZXNzaW5nIGdldCBhaGVhZCBvZiBvdXRwdXQgcHJvY2Vzc2luZywgdGhlIHJlc3VsdGluZyBwYXR0ZXJuIG9mIGFjY2VzcyB0bwordGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBxdWl0ZSBub25zZXF1ZW50aWFsLiAgSXQncyBiZXN0IHRvIHVzZSB0aGUgbWVtb3J5CittYW5hZ2VyIGptZW1ub2JzLmMgaWYgeW91IGNhbiAoaWUsIGlmIHlvdSBoYXZlIGVub3VnaCByZWFsIG9yIHZpcnR1YWwgbWFpbgorbWVtb3J5KS4gIElmIG5vdCwgYXQgbGVhc3QgbWFrZSBzdXJlIHRoYXQgbWF4X21lbW9yeV90b191c2UgaXMgc2V0IGFzIGhpZ2ggYXMKK3Bvc3NpYmxlLiAgSWYgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIgaGFzIHRvIHVzZSBhIHRlbXBvcmFyeSBmaWxlLCB5b3Ugd2lsbAorcHJvYmFibHkgc2VlIGEgbG90IG9mIGRpc2sgdHJhZmZpYyBhbmQgcG9vciBwZXJmb3JtYW5jZS4gIChUaGlzIGNvdWxkIGJlCitpbXByb3ZlZCB3aXRoIGFkZGl0aW9uYWwgd29yayBvbiB0aGUgbWVtb3J5IG1hbmFnZXIsIGJ1dCB3ZSBoYXZlbid0IGdvdHRlbgorYXJvdW5kIHRvIGl0IHlldC4pCisKK0luIHNvbWUgYXBwbGljYXRpb25zIGl0IG1heSBiZSBjb252ZW5pZW50IHRvIHVzZSBqcGVnX2NvbnN1bWVfaW5wdXQoKSBmb3IgYWxsCitpbnB1dCBwcm9jZXNzaW5nLCBpbmNsdWRpbmcgcmVhZGluZyB0aGUgaW5pdGlhbCBtYXJrZXJzOyB0aGF0IGlzLCB5b3UgbWF5Cit3aXNoIHRvIGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgaW5zdGVhZCBvZiBqcGVnX3JlYWRfaGVhZGVyKCkgZHVyaW5nCitzdGFydHVwLiAgVGhpcyB3b3JrcywgYnV0IG5vdGUgdGhhdCB5b3UgbXVzdCBjaGVjayBmb3IgSlBFR19SRUFDSEVEX1NPUyBhbmQKK0pQRUdfUkVBQ0hFRF9FT0kgcmV0dXJuIGNvZGVzIGFzIHRoZSBlcXVpdmFsZW50IG9mIGpwZWdfcmVhZF9oZWFkZXIncyBjb2Rlcy4KK09uY2UgdGhlIGZpcnN0IFNPUyBtYXJrZXIgaGFzIGJlZW4gcmVhY2hlZCwgeW91IG11c3QgY2FsbAoranBlZ19zdGFydF9kZWNvbXByZXNzKCkgYmVmb3JlIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgY29uc3VtZSBtb3JlIGlucHV0OworaXQnbGwganVzdCBrZWVwIHJldHVybmluZyBKUEVHX1JFQUNIRURfU09TIHVudGlsIHlvdSBkby4gIElmIHlvdSByZWFkIGEKK3RhYmxlcy1vbmx5IGZpbGUgdGhpcyB3YXksIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0kKK3dpdGhvdXQgZXZlciByZXR1cm5pbmcgSlBFR19SRUFDSEVEX1NPUzsgYmUgc3VyZSB0byBjaGVjayBmb3IgdGhpcyBjYXNlLgorSWYgdGhpcyBoYXBwZW5zLCB0aGUgZGVjb21wcmVzc29yIHdpbGwgbm90IHJlYWQgYW55IG1vcmUgaW5wdXQgdW50aWwgeW91IGNhbGwKK2pwZWdfYWJvcnQoKSB0byByZXNldCBpdC4gIEl0IGlzIE9LIHRvIGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgZXZlbiB3aGVuIG5vdAordXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZSwgYnV0IGluIHRoYXQgY2FzZSBpdCdzIGJhc2ljYWxseSBhIG5vLW9wIGFmdGVyIHRoZQoraW5pdGlhbCBtYXJrZXJzIGhhdmUgYmVlbiByZWFkOiBpdCB3aWxsIGp1c3QgcmV0dXJuIEpQRUdfU1VTUEVOREVELgorCisKK0FiYnJldmlhdGVkIGRhdGFzdHJlYW1zIGFuZCBtdWx0aXBsZSBpbWFnZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBKUEVHIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb2JqZWN0IGNhbiBiZSByZXVzZWQgdG8gcHJvY2VzcyBtdWx0aXBsZQoraW1hZ2VzLiAgVGhpcyBzYXZlcyBhIHNtYWxsIGFtb3VudCBvZiB0aW1lIHBlciBpbWFnZSBieSBlbGltaW5hdGluZyB0aGUKKyJjcmVhdGUiIGFuZCAiZGVzdHJveSIgb3BlcmF0aW9ucywgYnV0IHRoYXQgaXNuJ3QgdGhlIHJlYWwgcHVycG9zZSBvZiB0aGUKK2ZlYXR1cmUuICBSYXRoZXIsIHJldXNlIG9mIGFuIG9iamVjdCBwcm92aWRlcyBzdXBwb3J0IGZvciBhYmJyZXZpYXRlZCBKUEVHCitkYXRhc3RyZWFtcy4gIE9iamVjdCByZXVzZSBjYW4gYWxzbyBzaW1wbGlmeSBwcm9jZXNzaW5nIGEgc2VyaWVzIG9mIGltYWdlcyBpbgorYSBzaW5nbGUgaW5wdXQgb3Igb3V0cHV0IGZpbGUuICBUaGlzIHNlY3Rpb24gZXhwbGFpbnMgdGhlc2UgZmVhdHVyZXMuCisKK0EgSlBFRyBmaWxlIG5vcm1hbGx5IGNvbnRhaW5zIHNldmVyYWwgaHVuZHJlZCBieXRlcyB3b3J0aCBvZiBxdWFudGl6YXRpb24KK2FuZCBIdWZmbWFuIHRhYmxlcy4gIEluIGEgc2l0dWF0aW9uIHdoZXJlIG1hbnkgaW1hZ2VzIHdpbGwgYmUgc3RvcmVkIG9yCit0cmFuc21pdHRlZCB3aXRoIGlkZW50aWNhbCB0YWJsZXMsIHRoaXMgbWF5IHJlcHJlc2VudCBhbiBhbm5veWluZyBvdmVyaGVhZC4KK1RoZSBKUEVHIHN0YW5kYXJkIHRoZXJlZm9yZSBwZXJtaXRzIHRhYmxlcyB0byBiZSBvbWl0dGVkLiAgVGhlIHN0YW5kYXJkCitkZWZpbmVzIHRocmVlIGNsYXNzZXMgb2YgSlBFRyBkYXRhc3RyZWFtczoKKyAgKiAiSW50ZXJjaGFuZ2UiIGRhdGFzdHJlYW1zIGNvbnRhaW4gYW4gaW1hZ2UgYW5kIGFsbCB0YWJsZXMgbmVlZGVkIHRvIGRlY29kZQorICAgICB0aGUgaW1hZ2UuICBUaGVzZSBhcmUgdGhlIHVzdWFsIGtpbmQgb2YgSlBFRyBmaWxlLgorICAqICJBYmJyZXZpYXRlZCBpbWFnZSIgZGF0YXN0cmVhbXMgY29udGFpbiBhbiBpbWFnZSwgYnV0IGFyZSBtaXNzaW5nIHNvbWUgb3IKKyAgICBhbGwgb2YgdGhlIHRhYmxlcyBuZWVkZWQgdG8gZGVjb2RlIHRoYXQgaW1hZ2UuCisgICogIkFiYnJldmlhdGVkIHRhYmxlIHNwZWNpZmljYXRpb24iIChoZW5jZWZvcnRoICJ0YWJsZXMtb25seSIpIGRhdGFzdHJlYW1zCisgICAgY29udGFpbiBvbmx5IHRhYmxlIHNwZWNpZmljYXRpb25zLgorVG8gZGVjb2RlIGFuIGFiYnJldmlhdGVkIGltYWdlLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgbWlzc2luZyB0YWJsZShzKQoraW50byB0aGUgZGVjb2RlciBiZWZvcmVoYW5kLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHJlYWRpbmcgYSBzZXBhcmF0ZQordGFibGVzLW9ubHkgZmlsZS4gIEEgdmFyaWFudCBzY2hlbWUgdXNlcyBhIHNlcmllcyBvZiBpbWFnZXMgaW4gd2hpY2ggdGhlIGZpcnN0CitpbWFnZSBpcyBhbiBpbnRlcmNoYW5nZSAoY29tcGxldGUpIGRhdGFzdHJlYW0sIHdoaWxlIHN1YnNlcXVlbnQgb25lcyBhcmUKK2FiYnJldmlhdGVkIGFuZCByZWx5IG9uIHRoZSB0YWJsZXMgbG9hZGVkIGJ5IHRoZSBmaXJzdCBpbWFnZS4gIEl0IGlzIGFzc3VtZWQKK3RoYXQgb25jZSB0aGUgZGVjb2RlciBoYXMgcmVhZCBhIHRhYmxlLCBpdCB3aWxsIHJlbWVtYmVyIHRoYXQgdGFibGUgdW50aWwgYQorbmV3IGRlZmluaXRpb24gZm9yIHRoZSBzYW1lIHRhYmxlIG51bWJlciBpcyBlbmNvdW50ZXJlZC4KKworSXQgaXMgdGhlIGFwcGxpY2F0aW9uIGRlc2lnbmVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZmlndXJlIG91dCBob3cgdG8gYXNzb2NpYXRlCit0aGUgY29ycmVjdCB0YWJsZXMgd2l0aCBhbiBhYmJyZXZpYXRlZCBpbWFnZS4gIFdoaWxlIGFiYnJldmlhdGVkIGRhdGFzdHJlYW1zCitjYW4gYmUgdXNlZnVsIGluIGEgY2xvc2VkIGVudmlyb25tZW50LCB0aGVpciB1c2UgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQgaW4KK2FueSBzaXR1YXRpb24gd2hlcmUgZGF0YSBleGNoYW5nZSB3aXRoIG90aGVyIGFwcGxpY2F0aW9ucyBtaWdodCBiZSBuZWVkZWQuCitDYXZlYXQgZGVzaWduZXIuCisKK1RoZSBKUEVHIGxpYnJhcnkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBhbnkgY29tYmluYXRpb24gb2YKK3RhYmxlcy1vbmx5IGRhdGFzdHJlYW1zIGFuZCBhYmJyZXZpYXRlZCBpbWFnZXMuICBJbiBib3RoIGNvbXByZXNzaW9uIGFuZAorZGVjb21wcmVzc2lvbiBvYmplY3RzLCBhIHF1YW50aXphdGlvbiBvciBIdWZmbWFuIHRhYmxlIHdpbGwgYmUgcmV0YWluZWQgZm9yCit0aGUgbGlmZXRpbWUgb2YgdGhlIG9iamVjdCwgdW5sZXNzIGl0IGlzIG92ZXJ3cml0dGVuIGJ5IGEgbmV3IHRhYmxlIGRlZmluaXRpb24uCisKKworVG8gY3JlYXRlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW1zLCBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byB0ZWxsIHRoZQorY29tcHJlc3NvciBub3QgdG8gZW1pdCBzb21lIG9yIGFsbCBvZiB0aGUgdGFibGVzIGl0IGlzIHVzaW5nLiAgRWFjaAorcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlIHN0cnVjdCBjb250YWlucyBhIGJvb2xlYW4gZmllbGQgInNlbnRfdGFibGUiLAord2hpY2ggbm9ybWFsbHkgaXMgaW5pdGlhbGl6ZWQgdG8gRkFMU0UuICBGb3IgZWFjaCB0YWJsZSB1c2VkIGJ5IHRoZSBpbWFnZSwgdGhlCitoZWFkZXItd3JpdGluZyBwcm9jZXNzIGVtaXRzIHRoZSB0YWJsZSBhbmQgc2V0cyBzZW50X3RhYmxlID0gVFJVRSB1bmxlc3MgaXQgaXMKK2FscmVhZHkgVFJVRS4gIChJbiBub3JtYWwgdXNhZ2UsIHRoaXMgcHJldmVudHMgb3V0cHV0dGluZyB0aGUgc2FtZSB0YWJsZQorZGVmaW5pdGlvbiBtdWx0aXBsZSB0aW1lcywgYXMgd291bGQgb3RoZXJ3aXNlIG9jY3VyIGJlY2F1c2UgdGhlIGNocm9tYQorY29tcG9uZW50cyB0eXBpY2FsbHkgc2hhcmUgdGFibGVzLikgIFRodXMsIHNldHRpbmcgdGhpcyBmaWVsZCB0byBUUlVFIGJlZm9yZQorY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgd2lsbCBwcmV2ZW50IHRoZSB0YWJsZSBmcm9tIGJlaW5nIHdyaXR0ZW4gYXQKK2FsbC4KKworSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgInB1cmUiIGFiYnJldmlhdGVkIGltYWdlIGZpbGUgY29udGFpbmluZyBubyB0YWJsZXMsCitqdXN0IGNhbGwgImpwZWdfc3VwcHJlc3NfdGFibGVzKCZjaW5mbywgVFJVRSkiIGFmdGVyIGNvbnN0cnVjdGluZyBhbGwgdGhlCit0YWJsZXMuICBJZiB5b3Ugd2FudCB0byBlbWl0IHNvbWUgYnV0IG5vdCBhbGwgdGFibGVzLCB5b3UnbGwgbmVlZCB0byBzZXQgdGhlCitpbmRpdmlkdWFsIHNlbnRfdGFibGUgZmllbGRzIGRpcmVjdGx5LgorCitUbyBjcmVhdGUgYW4gYWJicmV2aWF0ZWQgaW1hZ2UsIHlvdSBtdXN0IGFsc28gY2FsbCBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKK3dpdGggYSBzZWNvbmQgcGFyYW1ldGVyIG9mIEZBTFNFLCBub3QgVFJVRS4gIE90aGVyd2lzZSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkKK3dpbGwgZm9yY2UgYWxsIHRoZSBzZW50X3RhYmxlIGZpZWxkcyB0byBGQUxTRS4gIChUaGlzIGlzIGEgc2FmZXR5IGZlYXR1cmUgdG8KK3ByZXZlbnQgYWJicmV2aWF0ZWQgaW1hZ2VzIGZyb20gYmVpbmcgY3JlYXRlZCBhY2NpZGVudGFsbHkuKQorCitUbyBjcmVhdGUgYSB0YWJsZXMtb25seSBmaWxlLCBwZXJmb3JtIHRoZSBzYW1lIHBhcmFtZXRlciBzZXR1cCB0aGF0IHlvdQorbm9ybWFsbHkgd291bGQsIGJ1dCBpbnN0ZWFkIG9mIGNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBzbyBvbiwgY2FsbAoranBlZ193cml0ZV90YWJsZXMoJmNpbmZvKS4gIFRoaXMgd2lsbCB3cml0ZSBhbiBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtCitjb250YWluaW5nIG9ubHkgU09JLCBEUVQgYW5kL29yIERIVCBtYXJrZXJzLCBhbmQgRU9JLiAgQWxsIHRoZSBxdWFudGl6YXRpb24KK2FuZCBIdWZmbWFuIHRhYmxlcyB0aGF0IGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHdpbGwKK2JlIGVtaXR0ZWQgdW5sZXNzIHRoZWlyIHNlbnRfdGFibGVzIGZsYWcgaXMgYWxyZWFkeSBUUlVFLCBhbmQgdGhlbiBhbGwgdGhlCitzZW50X3RhYmxlcyBmbGFncyB3aWxsIGJlIHNldCBUUlVFLgorCitBIHN1cmUtZmlyZSB3YXkgdG8gY3JlYXRlIG1hdGNoaW5nIHRhYmxlcy1vbmx5IGFuZCBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlcworaXMgdG8gcHJvY2VlZCBhcyBmb2xsb3dzOgorCisJY3JlYXRlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0CisJc2V0IEpQRUcgcGFyYW1ldGVycworCXNldCBkZXN0aW5hdGlvbiB0byB0YWJsZXMtb25seSBmaWxlCisJanBlZ193cml0ZV90YWJsZXMoJmNpbmZvKTsKKwlzZXQgZGVzdGluYXRpb24gdG8gaW1hZ2UgZmlsZQorCWpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBGQUxTRSk7CisJd3JpdGUgZGF0YS4uLgorCWpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisKK1NpbmNlIHRoZSBKUEVHIHBhcmFtZXRlcnMgYXJlIG5vdCBhbHRlcmVkIGJldHdlZW4gd3JpdGluZyB0aGUgdGFibGUgZmlsZSBhbmQKK3RoZSBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlLCB0aGUgc2FtZSB0YWJsZXMgYXJlIHN1cmUgdG8gYmUgdXNlZC4gIE9mIGNvdXJzZSwKK3lvdSBjYW4gcmVwZWF0IHRoZSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgLi4uIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgc2VxdWVuY2UKK21hbnkgdGltZXMgdG8gcHJvZHVjZSBtYW55IGFiYnJldmlhdGVkIGltYWdlIGZpbGVzIG1hdGNoaW5nIHRoZSB0YWJsZSBmaWxlLgorCitZb3UgY2Fubm90IHN1cHByZXNzIG91dHB1dCBvZiB0aGUgY29tcHV0ZWQgSHVmZm1hbiB0YWJsZXMgd2hlbiBIdWZmbWFuCitvcHRpbWl6YXRpb24gaXMgc2VsZWN0ZWQuICAoSWYgeW91IGNvdWxkLCB0aGVyZSdkIGJlIG5vIHdheSB0byBkZWNvZGUgdGhlCitpbWFnZS4uLikgIEdlbmVyYWxseSwgeW91IGRvbid0IHdhbnQgdG8gc2V0IG9wdGltaXplX2NvZGluZyA9IFRSVUUgd2hlbgoreW91IGFyZSB0cnlpbmcgdG8gcHJvZHVjZSBhYmJyZXZpYXRlZCBmaWxlcy4KKworSW4gc29tZSBjYXNlcyB5b3UgbWlnaHQgd2FudCB0byBjb21wcmVzcyBhbiBpbWFnZSB1c2luZyB0YWJsZXMgd2hpY2ggYXJlCitub3Qgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiwgYnV0IGFyZSBkZWZpbmVkIGluIGFuIGludGVyY2hhbmdlIG9yCit0YWJsZXMtb25seSBmaWxlIHJlYWRhYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB1cAorYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHJlYWQgdGhlIHNwZWNpZmljYXRpb24gZmlsZSwgdGhlbiBjb3B5aW5nIHRoZQordGFibGVzIGludG8geW91ciBjb21wcmVzc2lvbiBvYmplY3QuICBTZWUganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKQorZm9yIGFuIGV4YW1wbGUgb2YgY29weWluZyBxdWFudGl6YXRpb24gdGFibGVzLgorCisKK1RvIHJlYWQgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZXMsIHlvdSBzaW1wbHkgbmVlZCB0byBsb2FkIHRoZSBwcm9wZXIgdGFibGVzCitpbnRvIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlLgorSWYgdGhlIHByb3BlciB0YWJsZXMgYXJlIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSwgeW91IGNhbiBqdXN0CithbGxvY2F0ZSB0aGUgdGFibGUgc3RydWN0cyBhbmQgZmlsbCBpbiB0aGVpciBjb250ZW50cyBkaXJlY3RseS4gIEZvciBleGFtcGxlLAordG8gbG9hZCBhIGZpeGVkIHF1YW50aXphdGlvbiB0YWJsZSBpbnRvIHRhYmxlIHNsb3QgIm4iOgorCisgICAgaWYgKGNpbmZvLnF1YW50X3RibF9wdHJzW25dID09IE5VTEwpCisgICAgICBjaW5mby5xdWFudF90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKKyAgICBxdWFudF9wdHIgPSBjaW5mby5xdWFudF90YmxfcHRyc1tuXTsJLyogcXVhbnRfcHRyIGlzIEpRVUFOVF9UQkwqICovCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgIC8qIFF0YWJsZVtdIGlzIGRlc2lyZWQgcXVhbnRpemF0aW9uIHRhYmxlLCBpbiBuYXR1cmFsIGFycmF5IG9yZGVyICovCisgICAgICBxdWFudF9wdHItPnF1YW50dmFsW2ldID0gUXRhYmxlW2ldOworICAgIH0KKworQ29kZSB0byBsb2FkIGEgZml4ZWQgSHVmZm1hbiB0YWJsZSBpcyB0eXBpY2FsbHkgKGZvciBBQyB0YWJsZSAibiIpOgorCisgICAgaWYgKGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl0gPT0gTlVMTCkKKyAgICAgIGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl0gPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKKyAgICBodWZmX3B0ciA9IGNpbmZvLmFjX2h1ZmZfdGJsX3B0cnNbbl07CS8qIGh1ZmZfcHRyIGlzIEpIVUZGX1RCTCogKi8KKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKKyAgICAgIC8qIGNvdW50c1tpXSBpcyBudW1iZXIgb2YgSHVmZm1hbiBjb2RlcyBvZiBsZW5ndGggaSBiaXRzLCBpPTEuLjE2ICovCisgICAgICBodWZmX3B0ci0+Yml0c1tpXSA9IGNvdW50c1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAvKiBzeW1ib2xzW10gaXMgdGhlIGxpc3Qgb2YgSHVmZm1hbiBzeW1ib2xzLCBpbiBjb2RlLWxlbmd0aCBvcmRlciAqLworICAgICAgaHVmZl9wdHItPmh1ZmZ2YWxbaV0gPSBzeW1ib2xzW2ldOworICAgIH0KKworKE5vdGUgdGhhdCB0cnlpbmcgdG8gc2V0IGNpbmZvLnF1YW50X3RibF9wdHJzW25dIHRvIHBvaW50IGRpcmVjdGx5IGF0IGEKK2NvbnN0YW50IEpRVUFOVF9UQkwgb2JqZWN0IGlzIG5vdCBzYWZlLiAgSWYgdGhlIGluY29taW5nIGZpbGUgaGFwcGVuZWQgdG8KK2NvbnRhaW4gYSBxdWFudGl6YXRpb24gdGFibGUgZGVmaW5pdGlvbiwgeW91ciBtYXN0ZXIgdGFibGUgd291bGQgZ2V0CitvdmVyd3JpdHRlbiEgIEluc3RlYWQgYWxsb2NhdGUgYSB3b3JraW5nIHRhYmxlIGNvcHkgYW5kIGNvcHkgdGhlIG1hc3RlciB0YWJsZQoraW50byBpdCwgYXMgaWxsdXN0cmF0ZWQgYWJvdmUuICBEaXR0byBmb3IgSHVmZm1hbiB0YWJsZXMsIG9mIGNvdXJzZS4pCisKK1lvdSBtaWdodCB3YW50IHRvIHJlYWQgdGhlIHRhYmxlcyBmcm9tIGEgdGFibGVzLW9ubHkgZmlsZSwgcmF0aGVyIHRoYW4KK2hhcmQtd2lyaW5nIHRoZW0gaW50byB5b3VyIGFwcGxpY2F0aW9uLiAgVGhlIGpwZWdfcmVhZF9oZWFkZXIoKSBjYWxsIGlzCitzdWZmaWNpZW50IHRvIHJlYWQgYSB0YWJsZXMtb25seSBmaWxlLiAgWW91IG11c3QgcGFzcyBhIHNlY29uZCBwYXJhbWV0ZXIgb2YKK0ZBTFNFIHRvIGluZGljYXRlIHRoYXQgeW91IGRvIG5vdCByZXF1aXJlIGFuIGltYWdlIHRvIGJlIHByZXNlbnQuICBUaHVzLCB0aGUKK3R5cGljYWwgc2NlbmFyaW8gaXMKKworCWNyZWF0ZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0CisJc2V0IHNvdXJjZSB0byB0YWJsZXMtb25seSBmaWxlCisJanBlZ19yZWFkX2hlYWRlcigmY2luZm8sIEZBTFNFKTsKKwlzZXQgc291cmNlIHRvIGFiYnJldmlhdGVkIGltYWdlIGZpbGUKKwlqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7CisJc2V0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycworCWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOworCXJlYWQgZGF0YS4uLgorCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKKworSW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIHJlYWQgYSBmaWxlIHdpdGhvdXQga25vd2luZyB3aGV0aGVyIGl0IGNvbnRhaW5zCithbiBpbWFnZSBvciBqdXN0IHRhYmxlcy4gIEluIHRoYXQgY2FzZSwgcGFzcyBGQUxTRSBhbmQgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQorZnJvbSBqcGVnX3JlYWRfaGVhZGVyKCk6IGl0IHdpbGwgYmUgSlBFR19IRUFERVJfT0sgaWYgYW4gaW1hZ2Ugd2FzIGZvdW5kLAorSlBFR19IRUFERVJfVEFCTEVTX09OTFkgaWYgb25seSB0YWJsZXMgd2VyZSBmb3VuZC4gIChBIHRoaXJkIHJldHVybiB2YWx1ZSwKK0pQRUdfU1VTUEVOREVELCBpcyBwb3NzaWJsZSB3aGVuIHVzaW5nIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBtYW5hZ2VyLikKK05vdGUgdGhhdCBqcGVnX3JlYWRfaGVhZGVyKCkgd2lsbCBub3QgY29tcGxhaW4gaWYgeW91IHJlYWQgYW4gYWJicmV2aWF0ZWQKK2ltYWdlIGZvciB3aGljaCB5b3UgaGF2ZW4ndCBsb2FkZWQgdGhlIG1pc3NpbmcgdGFibGVzOyB0aGUgbWlzc2luZy10YWJsZSBjaGVjaworb2NjdXJzIGxhdGVyLCBpbiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKworCitJdCBpcyBwb3NzaWJsZSB0byByZWFkIGEgc2VyaWVzIG9mIGltYWdlcyBmcm9tIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGJ5CityZXBlYXRpbmcgdGhlIGpwZWdfcmVhZF9oZWFkZXIoKSAuLi4ganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHNlcXVlbmNlLAord2l0aG91dCByZWxlYXNpbmcvcmVjcmVhdGluZyB0aGUgSlBFRyBvYmplY3Qgb3IgdGhlIGRhdGEgc291cmNlIG1vZHVsZS4KKyhJZiB5b3UgZGlkIHJlaW5pdGlhbGl6ZSwgYW55IHBhcnRpYWwgYnVmZmVybG9hZCBsZWZ0IGluIHRoZSBkYXRhIHNvdXJjZQorYnVmZmVyIGF0IHRoZSBlbmQgb2Ygb25lIGltYWdlIHdvdWxkIGJlIGRpc2NhcmRlZCwgY2F1c2luZyB5b3UgdG8gbG9zZSB0aGUKK3N0YXJ0IG9mIHRoZSBuZXh0IGltYWdlLikgIFdoZW4geW91IHVzZSB0aGlzIG1ldGhvZCwgc3RvcmVkIHRhYmxlcyBhcmUKK2F1dG9tYXRpY2FsbHkgY2FycmllZCBmb3J3YXJkLCBzbyBzb21lIG9mIHRoZSBpbWFnZXMgY2FuIGJlIGFiYnJldmlhdGVkIGltYWdlcwordGhhdCBkZXBlbmQgb24gdGFibGVzIGZyb20gZWFybGllciBpbWFnZXMuCisKK0lmIHlvdSBpbnRlbmQgdG8gd3JpdGUgYSBzZXJpZXMgb2YgaW1hZ2VzIGludG8gYSBzaW5nbGUgZGVzdGluYXRpb24gZmlsZSwKK3lvdSBtaWdodCB3YW50IHRvIG1ha2UgYSBzcGVjaWFsaXplZCBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSB0aGF0IGRvZXNuJ3QKK2ZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIGF0IHRlcm1fZGVzdGluYXRpb24oKSB0aW1lLiAgVGhpcyB3b3VsZCBzcGVlZCB0aGluZ3MKK3VwIGJ5IHNvbWUgdHJpZmxpbmcgYW1vdW50LiAgT2YgY291cnNlLCB5b3UnZCBuZWVkIHRvIHJlbWVtYmVyIHRvIGZsdXNoIHRoZQorYnVmZmVyIGFmdGVyIHRoZSBsYXN0IGltYWdlLiAgWW91IGNhbiBtYWtlIHRoZSBsYXRlciBpbWFnZXMgYmUgYWJicmV2aWF0ZWQKK29uZXMgYnkgcGFzc2luZyBGQUxTRSB0byBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuCisKKworU3BlY2lhbCBtYXJrZXJzCistLS0tLS0tLS0tLS0tLS0KKworU29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zZXJ0IG9yIGV4dHJhY3Qgc3BlY2lhbCBkYXRhIGluIHRoZSBKUEVHCitkYXRhc3RyZWFtLiAgVGhlIEpQRUcgc3RhbmRhcmQgcHJvdmlkZXMgbWFya2VyIHR5cGVzICJDT00iIChjb21tZW50KSBhbmQKKyJBUFAwIiB0aHJvdWdoICJBUFAxNSIgKGFwcGxpY2F0aW9uKSB0byBob2xkIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEuCitVbmZvcnR1bmF0ZWx5LCB0aGUgdXNlIG9mIHRoZXNlIG1hcmtlcnMgaXMgbm90IHNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQuCitDT00gbWFya2VycyBhcmUgZmFpcmx5IHdpZGVseSB1c2VkIHRvIGhvbGQgdXNlci1zdXBwbGllZCB0ZXh0LiAgVGhlIEpGSUYgZmlsZQorZm9ybWF0IHNwZWMgdXNlcyBBUFAwIG1hcmtlcnMgd2l0aCBzcGVjaWZpZWQgaW5pdGlhbCBzdHJpbmdzIHRvIGhvbGQgY2VydGFpbgorZGF0YS4gIEFkb2JlIGFwcGxpY2F0aW9ucyB1c2UgQVBQMTQgbWFya2VycyBiZWdpbm5pbmcgd2l0aCB0aGUgc3RyaW5nICJBZG9iZSIKK2ZvciBtaXNjZWxsYW5lb3VzIGRhdGEuICBPdGhlciBBUFBuIG1hcmtlcnMgYXJlIHJhcmVseSBzZWVuLCBidXQgbWlnaHQKK2NvbnRhaW4gYWxtb3N0IGFueXRoaW5nLgorCitJZiB5b3Ugd2lzaCB0byBzdG9yZSB1c2VyLXN1cHBsaWVkIHRleHQsIHdlIHJlY29tbWVuZCB5b3UgdXNlIENPTSBtYXJrZXJzCithbmQgcGxhY2UgcmVhZGFibGUgNy1iaXQgQVNDSUkgdGV4dCBpbiB0aGVtLiAgTmV3bGluZSBjb252ZW50aW9ucyBhcmUgbm90CitzdGFuZGFyZGl6ZWQgLS0tIGV4cGVjdCB0byBmaW5kIExGIChVbml4IHN0eWxlKSwgQ1IvTEYgKERPUyBzdHlsZSksIG9yIENSCisoTWFjIHN0eWxlKS4gIEEgcm9idXN0IENPTSByZWFkZXIgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIHJhbmRvbSBiaW5hcnkKK2dhcmJhZ2UsIGluY2x1ZGluZyBudWxscywgc2luY2Ugc29tZSBhcHBsaWNhdGlvbnMgZ2VuZXJhdGUgQ09NIG1hcmtlcnMKK2NvbnRhaW5pbmcgbm9uLUFTQ0lJIGp1bmsuICAoQnV0IHlvdXJzIHNob3VsZCBub3QgYmUgb25lIG9mIHRoZW0uKQorCitGb3IgcHJvZ3JhbS1zdXBwbGllZCBkYXRhLCB1c2UgYW4gQVBQbiBtYXJrZXIsIGFuZCBiZSBzdXJlIHRvIGJlZ2luIGl0IHdpdGggYW4KK2lkZW50aWZ5aW5nIHN0cmluZyBzbyB0aGF0IHlvdSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBtYXJrZXIgaXMgYWN0dWFsbHkgeW91cnMuCitJdCdzIHByb2JhYmx5IGJlc3QgdG8gYXZvaWQgdXNpbmcgQVBQMCBvciBBUFAxNCBmb3IgYW55IHByaXZhdGUgbWFya2Vycy4KKyhOT1RFOiB0aGUgdXBjb21pbmcgU1BJRkYgc3RhbmRhcmQgd2lsbCB1c2UgQVBQOCBtYXJrZXJzOyB3ZSByZWNvbW1lbmQgeW91Citub3QgdXNlIEFQUDggbWFya2VycyBmb3IgYW55IHByaXZhdGUgcHVycG9zZXMsIGVpdGhlci4pCisKK0tlZXAgaW4gbWluZCB0aGF0IGF0IG1vc3QgNjU1MzMgYnl0ZXMgY2FuIGJlIHB1dCBpbnRvIG9uZSBtYXJrZXIsIGJ1dCB5b3UKK2NhbiBoYXZlIGFzIG1hbnkgbWFya2VycyBhcyB5b3UgbGlrZS4KKworQnkgZGVmYXVsdCwgdGhlIElKRyBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwgd3JpdGUgYSBKRklGIEFQUDAgbWFya2VyIGlmIHRoZQorc2VsZWN0ZWQgSlBFRyBjb2xvcnNwYWNlIGlzIGdyYXlzY2FsZSBvciBZQ2JDciwgb3IgYW4gQWRvYmUgQVBQMTQgbWFya2VyIGlmCit0aGUgc2VsZWN0ZWQgY29sb3JzcGFjZSBpcyBSR0IsIENNWUssIG9yIFlDQ0suICBZb3UgY2FuIGRpc2FibGUgdGhpcywgYnV0Cit3ZSBkb24ndCByZWNvbW1lbmQgaXQuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwgcmVjb2duaXplIEpGSUYgYW5kCitBZG9iZSBtYXJrZXJzIGFuZCB3aWxsIHNldCB0aGUgSlBFRyBjb2xvcnNwYWNlIHByb3Blcmx5IHdoZW4gb25lIGlzIGZvdW5kLgorCisKK1lvdSBjYW4gd3JpdGUgc3BlY2lhbCBtYXJrZXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZGF0YXN0cmVhbSBoZWFkZXIgYnkKK2NhbGxpbmcganBlZ193cml0ZV9tYXJrZXIoKSBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QKK2NhbGwgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKS4gIFdoZW4geW91IGRvIHRoaXMsIHRoZSBtYXJrZXJzIGFwcGVhciBhZnRlcgordGhlIFNPSSBhbmQgdGhlIEpGSUYgQVBQMCBhbmQgQWRvYmUgQVBQMTQgbWFya2VycyAoaWYgd3JpdHRlbiksIGJ1dCBiZWZvcmUKK2FsbCBlbHNlLiAgU3BlY2lmeSB0aGUgbWFya2VyIHR5cGUgcGFyYW1ldGVyIGFzICJKUEVHX0NPTSIgZm9yIENPTSBvcgorIkpQRUdfQVBQMCArIG4iIGZvciBBUFBuLiAgKEFjdHVhbGx5LCBqcGVnX3dyaXRlX21hcmtlciB3aWxsIGxldCB5b3Ugd3JpdGUKK2FueSBtYXJrZXIgdHlwZSwgYnV0IHdlIGRvbid0IHJlY29tbWVuZCB3cml0aW5nIGFueSBvdGhlciBraW5kcyBvZiBtYXJrZXIuKQorRm9yIGV4YW1wbGUsIHRvIHdyaXRlIGEgdXNlciBjb21tZW50IHN0cmluZyBwb2ludGVkIHRvIGJ5IGNvbW1lbnRfdGV4dDoKKwlqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19DT00sIGNvbW1lbnRfdGV4dCwgc3RybGVuKGNvbW1lbnRfdGV4dCkpOworCitJZiBpdCdzIG5vdCBjb252ZW5pZW50IHRvIHN0b3JlIGFsbCB0aGUgbWFya2VyIGRhdGEgaW4gbWVtb3J5IGF0IG9uY2UsCit5b3UgY2FuIGluc3RlYWQgY2FsbCBqcGVnX3dyaXRlX21faGVhZGVyKCkgZm9sbG93ZWQgYnkgbXVsdGlwbGUgY2FsbHMgdG8KK2pwZWdfd3JpdGVfbV9ieXRlKCkuICBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIGl0J3MgeW91ciByZXNwb25zaWJpbGl0eSB0bworY2FsbCBqcGVnX3dyaXRlX21fYnl0ZSgpIGV4YWN0bHkgdGhlIG51bWJlciBvZiB0aW1lcyBnaXZlbiBpbiB0aGUgbGVuZ3RoCitwYXJhbWV0ZXIgdG8ganBlZ193cml0ZV9tX2hlYWRlcigpLiAgKFRoaXMgbWV0aG9kIGxldHMgeW91IGVtcHR5IHRoZQorb3V0cHV0IGJ1ZmZlciBwYXJ0d2F5IHRocm91Z2ggYSBtYXJrZXIsIHdoaWNoIG1pZ2h0IGJlIGltcG9ydGFudCB3aGVuCit1c2luZyBhIHN1c3BlbmRpbmcgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUuICBJbiBhbnkgY2FzZSwgaWYgeW91IGFyZSB1c2luZworYSBzdXNwZW5kaW5nIGRlc3RpbmF0aW9uLCB5b3Ugc2hvdWxkIGZsdXNoIGl0cyBidWZmZXIgYWZ0ZXIgaW5zZXJ0aW5nCithbnkgc3BlY2lhbCBtYXJrZXJzLiAgU2VlICJJL08gc3VzcGVuc2lvbiIuKQorCitPciwgaWYgeW91IHByZWZlciB0byBzeW50aGVzaXplIHRoZSBtYXJrZXIgYnl0ZSBzZXF1ZW5jZSB5b3Vyc2VsZiwKK3lvdSBjYW4ganVzdCBjcmFtIGl0IHN0cmFpZ2h0IGludG8gdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlLgorCitJZiB5b3UgYXJlIHdyaXRpbmcgSkZJRiAxLjAyIGV4dGVuc2lvbiBtYXJrZXJzICh0aHVtYm5haWwgaW1hZ2VzKSwgZG9uJ3QKK2ZvcmdldCB0byBzZXQgY2luZm8uSkZJRl9taW5vcl92ZXJzaW9uID0gMiBzbyB0aGF0IHRoZSBlbmNvZGVyIHdpbGwgd3JpdGUgdGhlCitjb3JyZWN0IEpGSUYgdmVyc2lvbiBudW1iZXIgaW4gdGhlIEpGSUYgaGVhZGVyIG1hcmtlci4gIFRoZSBsaWJyYXJ5J3MgZGVmYXVsdAoraXMgdG8gd3JpdGUgdmVyc2lvbiAxLjAxLCBidXQgdGhhdCdzIHdyb25nIGlmIHlvdSBpbnNlcnQgYW55IDEuMDIgZXh0ZW5zaW9uCittYXJrZXJzLiAgKFdlIGNvdWxkIHByb2JhYmx5IGdldCBhd2F5IHdpdGgganVzdCBkZWZhdWx0aW5nIHRvIDEuMDIsIGJ1dCB0aGVyZQordXNlZCB0byBiZSBicm9rZW4gZGVjb2RlcnMgdGhhdCB3b3VsZCBjb21wbGFpbiBhYm91dCB1bmtub3duIG1pbm9yIHZlcnNpb24KK251bWJlcnMuICBUbyByZWR1Y2UgY29tcGF0aWJpbGl0eSByaXNrcyBpdCdzIHNhZmVzdCBub3QgdG8gd3JpdGUgMS4wMiB1bmxlc3MKK3lvdSBhcmUgYWN0dWFsbHkgdXNpbmcgMS4wMiBleHRlbnNpb25zLikKKworCitXaGVuIHJlYWRpbmcsIHR3byBtZXRob2RzIG9mIGhhbmRsaW5nIHNwZWNpYWwgbWFya2VycyBhcmUgYXZhaWxhYmxlOgorMS4gWW91IGNhbiBhc2sgdGhlIGxpYnJhcnkgdG8gc2F2ZSB0aGUgY29udGVudHMgb2YgQ09NIGFuZC9vciBBUFBuIG1hcmtlcnMKK2ludG8gbWVtb3J5LCBhbmQgdGhlbiBleGFtaW5lIHRoZW0gYXQgeW91ciBsZWlzdXJlIGFmdGVyd2FyZHMuCisyLiBZb3UgY2FuIHN1cHBseSB5b3VyIG93biByb3V0aW5lIHRvIHByb2Nlc3MgQ09NIGFuZC9vciBBUFBuIG1hcmtlcnMKK29uLXRoZS1mbHkgYXMgdGhleSBhcmUgcmVhZC4KK1RoZSBmaXJzdCBtZXRob2QgaXMgc2ltcGxlciB0byB1c2UsIGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBhIHN1c3BlbmRpbmcKK2RhdGEgc291cmNlOyB3cml0aW5nIGEgbWFya2VyIHByb2Nlc3NvciB0aGF0IGNvcGVzIHdpdGggaW5wdXQgc3VzcGVuc2lvbiBpcworbm90IGVhc3kgKGNvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiB0aGUgbWFya2VyIGlzIGxvbmdlciB0aGFuIHlvdXIgYXZhaWxhYmxlCitpbnB1dCBidWZmZXIpLiAgSG93ZXZlciwgdGhlIHNlY29uZCBtZXRob2QgY29uc2VydmVzIG1lbW9yeSBzaW5jZSB0aGUgbWFya2VyCitkYXRhIG5lZWQgbm90IGJlIGtlcHQgYXJvdW5kIGFmdGVyIGl0J3MgYmVlbiBwcm9jZXNzZWQuCisKK0ZvciBlaXRoZXIgbWV0aG9kLCB5b3UnZCBub3JtYWxseSBzZXQgdXAgbWFya2VyIGhhbmRsaW5nIGFmdGVyIGNyZWF0aW5nIGEKK2RlY29tcHJlc3Npb24gb2JqZWN0IGFuZCBiZWZvcmUgY2FsbGluZyBqcGVnX3JlYWRfaGVhZGVyKCksIGJlY2F1c2UgdGhlCittYXJrZXJzIG9mIGludGVyZXN0IHdpbGwgdHlwaWNhbGx5IGJlIG5lYXIgdGhlIGhlYWQgb2YgdGhlIGZpbGUgYW5kIHNvIHdpbGwKK2JlIHNjYW5uZWQgYnkganBlZ19yZWFkX2hlYWRlci4gIE9uY2UgeW91J3ZlIGVzdGFibGlzaGVkIGEgbWFya2VyIGhhbmRsaW5nCittZXRob2QsIGl0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGxpZmUgb2YgdGhhdCBkZWNvbXByZXNzaW9uIG9iamVjdAorKHBvdGVudGlhbGx5IG1hbnkgZGF0YXN0cmVhbXMpLCB1bmxlc3MgeW91IGNoYW5nZSBpdC4gIE1hcmtlciBoYW5kbGluZyBpcworZGV0ZXJtaW5lZCBzZXBhcmF0ZWx5IGZvciBDT00gbWFya2VycyBhbmQgZm9yIGVhY2ggQVBQbiBtYXJrZXIgY29kZS4KKworCitUbyBzYXZlIHRoZSBjb250ZW50cyBvZiBzcGVjaWFsIG1hcmtlcnMgaW4gbWVtb3J5LCBjYWxsCisJanBlZ19zYXZlX21hcmtlcnMoY2luZm8sIG1hcmtlcl9jb2RlLCBsZW5ndGhfbGltaXQpCit3aGVyZSBtYXJrZXJfY29kZSBpcyB0aGUgbWFya2VyIHR5cGUgdG8gc2F2ZSwgSlBFR19DT00gb3IgSlBFR19BUFAwK24uCisoVG8gYXJyYW5nZSB0byBzYXZlIGFsbCB0aGUgc3BlY2lhbCBtYXJrZXIgdHlwZXMsIHlvdSBuZWVkIHRvIGNhbGwgdGhpcworcm91dGluZSAxNyB0aW1lcywgZm9yIENPTSBhbmQgQVBQMC1BUFAxNS4pICBJZiB0aGUgaW5jb21pbmcgbWFya2VyIGlzIGxvbmdlcgordGhhbiBsZW5ndGhfbGltaXQgZGF0YSBieXRlcywgb25seSBsZW5ndGhfbGltaXQgYnl0ZXMgd2lsbCBiZSBzYXZlZDsgdGhpcworcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gYXZvaWQgY2hld2luZyB1cCBtZW1vcnkgd2hlbiB5b3Ugb25seSBuZWVkIHRvIHNlZSB0aGUKK2ZpcnN0IGZldyBieXRlcyBvZiBhIHBvdGVudGlhbGx5IGxhcmdlIG1hcmtlci4gIElmIHlvdSB3YW50IHRvIHNhdmUgYWxsIHRoZQorZGF0YSwgc2V0IGxlbmd0aF9saW1pdCB0byAweEZGRkY7IHRoYXQgaXMgZW5vdWdoIHNpbmNlIG1hcmtlciBsZW5ndGhzIGFyZSBvbmx5CisxNiBiaXRzLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHNldHRpbmcgbGVuZ3RoX2xpbWl0IHRvIDAgcHJldmVudHMgdGhhdCBtYXJrZXIKK3R5cGUgZnJvbSBiZWluZyBzYXZlZCBhdCBhbGwuICAoVGhhdCBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaW4gZmFjdC4pCisKK0FmdGVyIGpwZWdfcmVhZF9oZWFkZXIoKSBjb21wbGV0ZXMsIHlvdSBjYW4gZXhhbWluZSB0aGUgc3BlY2lhbCBtYXJrZXJzIGJ5Citmb2xsb3dpbmcgdGhlIGNpbmZvLT5tYXJrZXJfbGlzdCBwb2ludGVyIGNoYWluLiAgQWxsIHRoZSBzcGVjaWFsIG1hcmtlcnMgaW4KK3RoZSBmaWxlIGFwcGVhciBpbiB0aGlzIGxpc3QsIGluIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGZpbGUgKGJ1dAorb21pdHRpbmcgYW55IG1hcmtlcnMgb2YgdHlwZXMgeW91IGRpZG4ndCBhc2sgZm9yKS4gIEJvdGggdGhlIG9yaWdpbmFsIGRhdGEKK2xlbmd0aCBhbmQgdGhlIHNhdmVkIGRhdGEgbGVuZ3RoIGFyZSByZWNvcmRlZCBmb3IgZWFjaCBsaXN0IGVudHJ5OyB0aGUgbGF0dGVyCit3aWxsIG5vdCBleGNlZWQgbGVuZ3RoX2xpbWl0IGZvciB0aGUgcGFydGljdWxhciBtYXJrZXIgdHlwZS4gIE5vdGUgdGhhdCB0aGVzZQorbGVuZ3RocyBleGNsdWRlIHRoZSBtYXJrZXIgbGVuZ3RoIHdvcmQsIHdoZXJlYXMgdGhlIHN0b3JlZCByZXByZXNlbnRhdGlvbgord2l0aGluIHRoZSBKUEVHIGZpbGUgaW5jbHVkZXMgaXQuICAoSGVuY2UgdGhlIG1heGltdW0gZGF0YSBsZW5ndGggaXMgcmVhbGx5Citvbmx5IDY1NTMzLikKKworSXQgaXMgcG9zc2libGUgdGhhdCBhZGRpdGlvbmFsIHNwZWNpYWwgbWFya2VycyBhcHBlYXIgaW4gdGhlIGZpbGUgYmV5b25kIHRoZQorU09TIG1hcmtlciBhdCB3aGljaCBqcGVnX3JlYWRfaGVhZGVyIHN0b3BzOyBpZiBzbywgdGhlIG1hcmtlciBsaXN0IHdpbGwgYmUKK2V4dGVuZGVkIGR1cmluZyByZWFkaW5nIG9mIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8gYmUKK2NvbW1vbiwgaG93ZXZlci4gIElmIHlvdSBhcmUgc2hvcnQgb24gbWVtb3J5IHlvdSBtYXkgd2FudCB0byByZXNldCB0aGUgbGVuZ3RoCitsaW1pdCB0byB6ZXJvIGZvciBhbGwgbWFya2VyIHR5cGVzIGFmdGVyIGZpbmlzaGluZyBqcGVnX3JlYWRfaGVhZGVyLCB0bworZW5zdXJlIHRoYXQgdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcgY2Fubm90IGJlIGV4Y2VlZGVkIGR1ZSB0byBhZGRpdGlvbgorb2YgbGF0ZXIgbWFya2Vycy4KKworVGhlIG1hcmtlciBsaXN0IHJlbWFpbnMgc3RvcmVkIHVudGlsIHlvdSBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3Mgb3IKK2pwZWdfYWJvcnQsIGF0IHdoaWNoIHBvaW50IHRoZSBtZW1vcnkgaXMgZnJlZWQgYW5kIHRoZSBsaXN0IGlzIHNldCB0byBlbXB0eS4KKyhqcGVnX2Rlc3Ryb3kgYWxzbyByZWxlYXNlcyB0aGUgc3RvcmFnZSwgb2YgY291cnNlLikKKworTm90ZSB0aGF0IHRoZSBsaWJyYXJ5IGlzIGludGVybmFsbHkgaW50ZXJlc3RlZCBpbiBBUFAwIGFuZCBBUFAxNCBtYXJrZXJzOworaWYgeW91IHRyeSB0byBzZXQgYSBzbWFsbCBub256ZXJvIGxlbmd0aCBsaW1pdCBvbiB0aGVzZSB0eXBlcywgdGhlIGxpYnJhcnkKK3dpbGwgc2lsZW50bHkgZm9yY2UgdGhlIGxlbmd0aCB1cCB0byB0aGUgbWluaW11bSBpdCB3YW50cy4gIChCdXQgeW91IGNhbiBzZXQKK2EgemVybyBsZW5ndGggbGltaXQgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcgc2F2ZWQgYXQgYWxsLikgIEFsc28sIGluIGEKKzE2LWJpdCBlbnZpcm9ubWVudCwgdGhlIG1heGltdW0gbGVuZ3RoIGxpbWl0IG1heSBiZSBjb25zdHJhaW5lZCB0byBsZXNzIHRoYW4KKzY1NTMzIGJ5IG1hbGxvYygpIGxpbWl0YXRpb25zLiAgSXQgaXMgdGhlcmVmb3JlIGJlc3Qgbm90IHRvIGFzc3VtZSB0aGF0IHRoZQorZWZmZWN0aXZlIGxlbmd0aCBsaW1pdCBpcyBleGFjdGx5IHdoYXQgeW91IHNldCBpdCB0byBiZS4KKworCitJZiB5b3Ugd2FudCB0byBzdXBwbHkgeW91ciBvd24gbWFya2VyLXJlYWRpbmcgcm91dGluZSwgeW91IGRvIGl0IGJ5IGNhbGxpbmcKK2pwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoKS4gIEEgbWFya2VyIHByb2Nlc3NvciByb3V0aW5lIG11c3QgaGF2ZSB0aGUKK3NpZ25hdHVyZQorCWJvb2xlYW4ganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK0FsdGhvdWdoIHRoZSBtYXJrZXIgY29kZSBpcyBub3QgZXhwbGljaXRseSBwYXNzZWQsIHRoZSByb3V0aW5lIGNhbiBmaW5kIGl0CitpbiBjaW5mby0+dW5yZWFkX21hcmtlci4gIEF0IHRoZSB0aW1lIG9mIGNhbGwsIHRoZSBtYXJrZXIgcHJvcGVyIGhhcyBiZWVuCityZWFkIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZS4gIFRoZSBwcm9jZXNzb3Igcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IKK3JlYWRpbmcgdGhlIG1hcmtlciBsZW5ndGggd29yZCBhbmQgdGhlIHJlbWFpbmluZyBwYXJhbWV0ZXIgYnl0ZXMsIGlmIGFueS4KK1JldHVybiBUUlVFIHRvIGluZGljYXRlIHN1Y2Nlc3MuICAoRkFMU0Ugc2hvdWxkIGJlIHJldHVybmVkIG9ubHkgaWYgeW91IGFyZQordXNpbmcgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGFuZCBpdCB0ZWxscyB5b3UgdG8gc3VzcGVuZC4gIFNlZSB0aGUgc3RhbmRhcmQKK21hcmtlciBwcm9jZXNzb3JzIGluIGpkbWFya2VyLmMgZm9yIGFwcHJvcHJpYXRlIGNvZGluZyBtZXRob2RzIGlmIHlvdSBuZWVkIHRvCit1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLikKKworSWYgeW91IG92ZXJyaWRlIHRoZSBkZWZhdWx0IEFQUDAgb3IgQVBQMTQgcHJvY2Vzc29ycywgaXQgaXMgdXAgdG8geW91IHRvCityZWNvZ25pemUgSkZJRiBhbmQgQWRvYmUgbWFya2VycyBpZiB5b3Ugd2FudCBjb2xvcnNwYWNlIHJlY29nbml0aW9uIHRvIG9jY3VyCitwcm9wZXJseS4gIFdlIHJlY29tbWVuZCBjb3B5aW5nIGFuZCBleHRlbmRpbmcgdGhlIGRlZmF1bHQgcHJvY2Vzc29ycyBpZiB5b3UKK3dhbnQgdG8gZG8gdGhhdC4gIChBIGJldHRlciBpZGVhIGlzIHRvIHNhdmUgdGhlc2UgbWFya2VyIHR5cGVzIGZvciBsYXRlcgorZXhhbWluYXRpb24gYnkgY2FsbGluZyBqcGVnX3NhdmVfbWFya2VycygpOyB0aGF0IG1ldGhvZCBkb2Vzbid0IGludGVyZmVyZQord2l0aCB0aGUgbGlicmFyeSdzIG93biBwcm9jZXNzaW5nIG9mIHRoZXNlIG1hcmtlcnMuKQorCitqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCkgYW5kIGpwZWdfc2F2ZV9tYXJrZXJzKCkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorLS0tIGlmIHlvdSBjYWxsIG9uZSBpdCBvdmVycmlkZXMgYW55IHByZXZpb3VzIGNhbGwgdG8gdGhlIG90aGVyLCBmb3IgdGhlCitwYXJ0aWN1bGFyIG1hcmtlciB0eXBlIHNwZWNpZmllZC4KKworQSBzaW1wbGUgZXhhbXBsZSBvZiBhbiBleHRlcm5hbCBDT00gcHJvY2Vzc29yIGNhbiBiZSBmb3VuZCBpbiBkanBlZy5jLgorQWxzbywgc2VlIGpwZWd0cmFuLmMgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcganBlZ19zYXZlX21hcmtlcnMuCisKKworUmF3IChkb3duc2FtcGxlZCkgaW1hZ2UgZGF0YQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb21lIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHN1cHBseSBhbHJlYWR5LWRvd25zYW1wbGVkIGltYWdlIGRhdGEgdG8gdGhlIEpQRUcKK2NvbXByZXNzb3IsIG9yIHRvIHJlY2VpdmUgcmF3IGRvd25zYW1wbGVkIGRhdGEgZnJvbSB0aGUgZGVjb21wcmVzc29yLiAgVGhlCitsaWJyYXJ5IHN1cHBvcnRzIHRoaXMgcmVxdWlyZW1lbnQgYnkgYWxsb3dpbmcgdGhlIGFwcGxpY2F0aW9uIHRvIHdyaXRlIG9yCityZWFkIHJhdyBkYXRhLCBieXBhc3NpbmcgdGhlIG5vcm1hbCBwcmVwcm9jZXNzaW5nIG9yIHBvc3Rwcm9jZXNzaW5nIHN0ZXBzLgorVGhlIGludGVyZmFjZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3RhbmRhcmQgb25lIGFuZCBpcyBzb21ld2hhdCBoYXJkZXIgdG8KK3VzZS4gIElmIHlvdXIgaW50ZXJlc3QgaXMgbWVyZWx5IGluIGJ5cGFzc2luZyBjb2xvciBjb252ZXJzaW9uLCB3ZSByZWNvbW1lbmQKK3RoYXQgeW91IHVzZSB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlIGFuZCBzaW1wbHkgc2V0IGpwZWdfY29sb3Jfc3BhY2UgPQoraW5fY29sb3Jfc3BhY2UgKG9yIGpwZWdfY29sb3Jfc3BhY2UgPSBvdXRfY29sb3Jfc3BhY2UgZm9yIGRlY29tcHJlc3Npb24pLgorVGhlIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIHN1cHBseSBvcgorcmVjZWl2ZSBkb3duc2FtcGxlZCBpbWFnZSBkYXRhLCBpbiB3aGljaCBub3QgYWxsIGNvbXBvbmVudHMgaGF2ZSB0aGUgc2FtZQorZGltZW5zaW9ucy4KKworCitUbyBjb21wcmVzcyByYXcgZGF0YSwgeW91IG11c3Qgc3VwcGx5IHRoZSBkYXRhIGluIHRoZSBjb2xvcnNwYWNlIHRvIGJlIHVzZWQKK2luIHRoZSBKUEVHIGZpbGUgKHBsZWFzZSByZWFkIHRoZSBlYXJsaWVyIHNlY3Rpb24gb24gU3BlY2lhbCBjb2xvciBzcGFjZXMpCithbmQgZG93bnNhbXBsZWQgdG8gdGhlIHNhbXBsaW5nIGZhY3RvcnMgc3BlY2lmaWVkIGluIHRoZSBKUEVHIHBhcmFtZXRlcnMuCitZb3UgbXVzdCBzdXBwbHkgdGhlIGRhdGEgaW4gdGhlIGZvcm1hdCB1c2VkIGludGVybmFsbHkgYnkgdGhlIEpQRUcgbGlicmFyeSwKK25hbWVseSBhIEpTQU1QSU1BR0UgYXJyYXkuICBUaGlzIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHR3by1kaW1lbnNpb25hbAorYXJyYXlzLCBlYWNoIG9mIHR5cGUgSlNBTVBBUlJBWS4gIEVhY2ggMi1EIGFycmF5IGhvbGRzIHRoZSB2YWx1ZXMgZm9yIG9uZQorY29sb3IgY29tcG9uZW50LiAgVGhpcyBzdHJ1Y3R1cmUgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBjb21wb25lbnRzIGFyZSBvZgorZGlmZmVyZW50IHNpemVzLiAgSWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBNQ1Ugc2l6ZSwKK3lvdSBtdXN0IGFsc28gcGFkIHRoZSBkYXRhIGNvcnJlY3RseSAodXN1YWxseSwgdGhpcyBpcyBkb25lIGJ5IHJlcGxpY2F0aW5nCit0aGUgbGFzdCBjb2x1bW4gYW5kL29yIHJvdykuICBUaGUgZGF0YSBtdXN0IGJlIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIGEgRENUCitibG9jayBpbiBlYWNoIGNvbXBvbmVudDogdGhhdCBpcywgZWFjaCBkb3duc2FtcGxlZCByb3cgbXVzdCBjb250YWluIGEKK211bHRpcGxlIG9mIDggdmFsaWQgc2FtcGxlcywgYW5kIHRoZXJlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IHNhbXBsZSByb3dzCitmb3IgZWFjaCBjb21wb25lbnQuICAoRm9yIGFwcGxpY2F0aW9ucyBzdWNoIGFzIGNvbnZlcnNpb24gb2YgZGlnaXRhbCBUVgoraW1hZ2VzLCB0aGUgc3RhbmRhcmQgaW1hZ2Ugc2l6ZSBpcyB1c3VhbGx5IGEgbXVsdGlwbGUgb2YgdGhlIERDVCBibG9jayBzaXplLAorc28gdGhhdCBubyBwYWRkaW5nIG5lZWQgYWN0dWFsbHkgYmUgZG9uZS4pCisKK1RoZSBwcm9jZWR1cmUgZm9yIGNvbXByZXNzaW9uIG9mIHJhdyBkYXRhIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBub3JtYWwKK2NvbXByZXNzaW9uLCBleGNlcHQgdGhhdCB5b3UgY2FsbCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YKK2pwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBCZWZvcmUgY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCksIHlvdSBtdXN0IGRvCit0aGUgZm9sbG93aW5nOgorICAqIFNldCBjaW5mby0+cmF3X2RhdGFfaW4gdG8gVFJVRS4gIChJdCBpcyBzZXQgRkFMU0UgYnkganBlZ19zZXRfZGVmYXVsdHMoKS4pCisgICAgVGhpcyBub3RpZmllcyB0aGUgbGlicmFyeSB0aGF0IHlvdSB3aWxsIGJlIHN1cHBseWluZyByYXcgZGF0YS4KKyAgKiBFbnN1cmUganBlZ19jb2xvcl9zcGFjZSBpcyBjb3JyZWN0IC0tLSBhbiBleHBsaWNpdCBqcGVnX3NldF9jb2xvcnNwYWNlKCkKKyAgICBjYWxsIGlzIGEgZ29vZCBpZGVhLiAgTm90ZSB0aGF0IHNpbmNlIGNvbG9yIGNvbnZlcnNpb24gaXMgYnlwYXNzZWQsCisgICAgaW5fY29sb3Jfc3BhY2UgaXMgaWdub3JlZCwgZXhjZXB0IHRoYXQganBlZ19zZXRfZGVmYXVsdHMoKSB1c2VzIGl0IHRvCisgICAgY2hvb3NlIHRoZSBkZWZhdWx0IGpwZWdfY29sb3Jfc3BhY2Ugc2V0dGluZy4KKyAgKiBFbnN1cmUgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIGNpbmZvLT5jb21wX2luZm9baV0uaF9zYW1wX2ZhY3RvciBhbmQKKyAgICBjaW5mby0+Y29tcF9pbmZvW2ldLnZfc2FtcF9mYWN0b3IsIGFyZSBjb3JyZWN0LiAgU2luY2UgdGhlc2UgaW5kaWNhdGUgdGhlCisgICAgZGltZW5zaW9ucyBvZiB0aGUgZGF0YSB5b3UgYXJlIHN1cHBseWluZywgaXQncyB3aXNlIHRvIHNldCB0aGVtCisgICAgZXhwbGljaXRseSwgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhlIGxpYnJhcnkncyBkZWZhdWx0cyBhcmUgd2hhdCB5b3Ugd2FudC4KKworVG8gcGFzcyByYXcgZGF0YSB0byB0aGUgbGlicmFyeSwgY2FsbCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YKK2pwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBUaGUgdHdvIHJvdXRpbmVzIHdvcmsgc2ltaWxhcmx5IGV4Y2VwdCB0aGF0CitqcGVnX3dyaXRlX3Jhd19kYXRhIHRha2VzIGEgSlNBTVBJTUFHRSBkYXRhIGFycmF5IHJhdGhlciB0aGFuIEpTQU1QQVJSQVkuCitUaGUgc2NhbmxpbmVzIGNvdW50IHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgZnJvbSBqcGVnX3dyaXRlX3Jhd19kYXRhIGlzCittZWFzdXJlZCBpbiB0ZXJtcyBvZiB0aGUgY29tcG9uZW50IHdpdGggdGhlIGxhcmdlc3Qgdl9zYW1wX2ZhY3Rvci4KKworanBlZ193cml0ZV9yYXdfZGF0YSgpIHByb2Nlc3NlcyBvbmUgTUNVIHJvdyBwZXIgY2FsbCwgd2hpY2ggaXMgdG8gc2F5Cit2X3NhbXBfZmFjdG9yKkRDVFNJWkUgc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBUaGUgcGFzc2VkIG51bV9saW5lcwordmFsdWUgbXVzdCBiZSBhdCBsZWFzdCBtYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFLCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsCitiZSBleGFjdGx5IHRoYXQgYW1vdW50IChvciBwb3NzaWJseSBzb21lIG11bHRpcGxlIG9mIHRoYXQgYW1vdW50LCBpbiBmdXR1cmUKK2xpYnJhcnkgdmVyc2lvbnMpLiAgVGhpcyBpcyB0cnVlIGV2ZW4gb24gdGhlIGxhc3QgY2FsbCBhdCB0aGUgYm90dG9tIG9mIHRoZQoraW1hZ2U7IGRvbid0IGZvcmdldCB0byBwYWQgeW91ciBkYXRhIGFzIG5lY2Vzc2FyeS4KKworVGhlIHJlcXVpcmVkIGRpbWVuc2lvbnMgb2YgdGhlIHN1cHBsaWVkIGRhdGEgY2FuIGJlIGNvbXB1dGVkIGZvciBlYWNoCitjb21wb25lbnQgYXMKKwljaW5mby0+Y29tcF9pbmZvW2ldLndpZHRoX2luX2Jsb2NrcypEQ1RTSVpFICBzYW1wbGVzIHBlciByb3cKKwljaW5mby0+Y29tcF9pbmZvW2ldLmhlaWdodF9pbl9ibG9ja3MqRENUU0laRSByb3dzIGluIGltYWdlCithZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgaGFzIGluaXRpYWxpemVkIHRob3NlIGZpZWxkcy4gIElmIHRoZSB2YWxpZCBkYXRhCitpcyBzbWFsbGVyIHRoYW4gdGhpcywgaXQgbXVzdCBiZSBwYWRkZWQgYXBwcm9wcmlhdGVseS4gIEZvciBzb21lIHNhbXBsaW5nCitmYWN0b3JzIGFuZCBpbWFnZSBzaXplcywgYWRkaXRpb25hbCBkdW1teSBEQ1QgYmxvY2tzIGFyZSBpbnNlcnRlZCB0byBtYWtlCit0aGUgaW1hZ2UgYSBtdWx0aXBsZSBvZiB0aGUgTUNVIGRpbWVuc2lvbnMuICBUaGUgbGlicmFyeSBjcmVhdGVzIHN1Y2ggZHVtbXkKK2Jsb2NrcyBpdHNlbGY7IGl0IGRvZXMgbm90IHJlYWQgdGhlbSBmcm9tIHlvdXIgc3VwcGxpZWQgZGF0YS4gIFRoZXJlZm9yZSB5b3UKK25lZWQgbmV2ZXIgcGFkIGJ5IG1vcmUgdGhhbiBEQ1RTSVpFIHNhbXBsZXMuICBBbiBleGFtcGxlIG1heSBoZWxwIGhlcmUuCitBc3N1bWUgMmgydiBkb3duc2FtcGxpbmcgb2YgWUNiQ3IgZGF0YSwgdGhhdCBpcworCWNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDIJCWZvciBZCisJY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMgorCWNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciA9IDEJCWZvciBDYgorCWNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDEKKwljaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxCQlmb3IgQ3IKKwljaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxCithbmQgc3VwcG9zZSB0aGF0IHRoZSBub21pbmFsIGltYWdlIGRpbWVuc2lvbnMgKGNpbmZvLT5pbWFnZV93aWR0aCBhbmQKK2NpbmZvLT5pbWFnZV9oZWlnaHQpIGFyZSAxMDF4MTAxIHBpeGVscy4gIFRoZW4ganBlZ19zdGFydF9jb21wcmVzcygpIHdpbGwKK2NvbXB1dGUgZG93bnNhbXBsZWRfd2lkdGggPSAxMDEgYW5kIHdpZHRoX2luX2Jsb2NrcyA9IDEzIGZvciBZLAorZG93bnNhbXBsZWRfd2lkdGggPSA1MSBhbmQgd2lkdGhfaW5fYmxvY2tzID0gNyBmb3IgQ2IgYW5kIENyIChhbmQgdGhlIHNhbWUKK2ZvciB0aGUgaGVpZ2h0IGZpZWxkcykuICBZb3UgbXVzdCBwYWQgdGhlIFkgZGF0YSB0byBhdCBsZWFzdCAxMyo4ID0gMTA0Citjb2x1bW5zIGFuZCByb3dzLCB0aGUgQ2IvQ3IgZGF0YSB0byBhdCBsZWFzdCA3KjggPSA1NiBjb2x1bW5zIGFuZCByb3dzLiAgVGhlCitNQ1UgaGVpZ2h0IGlzIG1heF92X3NhbXBfZmFjdG9yID0gMiBEQ1Qgcm93cyBzbyB5b3UgbXVzdCBwYXNzIGF0IGxlYXN0IDE2CitzY2FubGluZXMgb24gZWFjaCBjYWxsIHRvIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSwgd2hpY2ggaXMgdG8gc2F5IDE2IGFjdHVhbAorc2FtcGxlIHJvd3Mgb2YgWSBhbmQgOCBlYWNoIG9mIENiIGFuZCBDci4gIEEgdG90YWwgb2YgNyBNQ1Ugcm93cyBhcmUgbmVlZGVkLAorc28geW91IG11c3QgcGFzcyBhIHRvdGFsIG9mIDcqMTYgPSAxMTIgInNjYW5saW5lcyIuICBUaGUgbGFzdCBEQ1QgYmxvY2sgcm93CitvZiBZIGRhdGEgaXMgZHVtbXksIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgeW91IHBhc3MgZm9yIGl0IGluIHRoZSBkYXRhCithcnJheXMsIGJ1dCB0aGUgc2NhbmxpbmVzIGNvdW50IG11c3QgdG90YWwgdXAgdG8gMTEyIHNvIHRoYXQgYWxsIG9mIHRoZSBDYgorYW5kIENyIGRhdGEgZ2V0cyBwYXNzZWQuCisKK091dHB1dCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCB3aXRoIHJhdy1kYXRhIGNvbXByZXNzaW9uOiBpZiB0aGUgZGF0YQorZGVzdGluYXRpb24gbW9kdWxlIHN1c3BlbmRzLCBqcGVnX3dyaXRlX3Jhd19kYXRhKCkgd2lsbCByZXR1cm4gMC4KK0luIHRoaXMgY2FzZSB0aGUgc2FtZSBkYXRhIHJvd3MgbXVzdCBiZSBwYXNzZWQgYWdhaW4gb24gdGhlIG5leHQgY2FsbC4KKworCitEZWNvbXByZXNzaW9uIHdpdGggcmF3IGRhdGEgb3V0cHV0IGltcGxpZXMgYnlwYXNzaW5nIGFsbCBwb3N0cHJvY2Vzc2luZzoKK3lvdSBjYW5ub3QgYXNrIGZvciByZXNjYWxpbmcgb3IgY29sb3IgcXVhbnRpemF0aW9uLCBmb3IgaW5zdGFuY2UuICBNb3JlCitzZXJpb3VzbHksIHlvdSBtdXN0IGRlYWwgd2l0aCB0aGUgY29sb3Igc3BhY2UgYW5kIHNhbXBsaW5nIGZhY3RvcnMgcHJlc2VudCBpbgordGhlIGluY29taW5nIGZpbGUuICBJZiB5b3VyIGFwcGxpY2F0aW9uIG9ubHkgaGFuZGxlcywgc2F5LCAyaDF2IFlDYkNyIGRhdGEsCit5b3UgbXVzdCBjaGVjayBmb3IgYW5kIGZhaWwgb24gb3RoZXIgY29sb3Igc3BhY2VzIG9yIG90aGVyIHNhbXBsaW5nIGZhY3RvcnMuCitUaGUgbGlicmFyeSB3aWxsIG5vdCBjb252ZXJ0IHRvIGEgZGlmZmVyZW50IGNvbG9yIHNwYWNlIGZvciB5b3UuCisKK1RvIG9idGFpbiByYXcgZGF0YSBvdXRwdXQsIHNldCBjaW5mby0+cmF3X2RhdGFfb3V0ID0gVFJVRSBiZWZvcmUKK2pwZWdfc3RhcnRfZGVjb21wcmVzcygpIChpdCBpcyBzZXQgRkFMU0UgYnkganBlZ19yZWFkX2hlYWRlcigpKS4gIEJlIHN1cmUgdG8KK3ZlcmlmeSB0aGF0IHRoZSBjb2xvciBzcGFjZSBhbmQgc2FtcGxpbmcgZmFjdG9ycyBhcmUgb25lcyB5b3UgY2FuIGhhbmRsZS4KK1RoZW4gY2FsbCBqcGVnX3JlYWRfcmF3X2RhdGEoKSBpbiBwbGFjZSBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuICBUaGUKK2RlY29tcHJlc3Npb24gcHJvY2VzcyBpcyBvdGhlcndpc2UgdGhlIHNhbWUgYXMgdXN1YWwuCisKK2pwZWdfcmVhZF9yYXdfZGF0YSgpIHJldHVybnMgb25lIE1DVSByb3cgcGVyIGNhbGwsIGFuZCB0aHVzIHlvdSBtdXN0IHBhc3MgYQorYnVmZmVyIG9mIGF0IGxlYXN0IG1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUgc2NhbmxpbmVzIChzY2FubGluZSBjb3VudGluZyBpcwordGhlIHNhbWUgYXMgZm9yIHJhdy1kYXRhIGNvbXByZXNzaW9uKS4gIFRoZSBidWZmZXIgeW91IHBhc3MgbXVzdCBiZSBsYXJnZQorZW5vdWdoIHRvIGhvbGQgdGhlIGFjdHVhbCBkYXRhIHBsdXMgcGFkZGluZyB0byBEQ1QtYmxvY2sgYm91bmRhcmllcy4gIEFzIHdpdGgKK2NvbXByZXNzaW9uLCBhbnkgZW50aXJlbHkgZHVtbXkgRENUIGJsb2NrcyBhcmUgbm90IHByb2Nlc3NlZCBzbyB5b3UgbmVlZCBub3QKK2FsbG9jYXRlIHNwYWNlIGZvciB0aGVtLCBidXQgdGhlIHRvdGFsIHNjYW5saW5lIGNvdW50IGluY2x1ZGVzIHRoZW0uICBUaGUKK2Fib3ZlIGV4YW1wbGUgb2YgY29tcHV0aW5nIGJ1ZmZlciBkaW1lbnNpb25zIGZvciByYXctZGF0YSBjb21wcmVzc2lvbiBpcworZXF1YWxseSB2YWxpZCBmb3IgZGVjb21wcmVzc2lvbi4KKworSW5wdXQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQgd2l0aCByYXctZGF0YSBkZWNvbXByZXNzaW9uOiBpZiB0aGUgZGF0YSBzb3VyY2UKK21vZHVsZSBzdXNwZW5kcywganBlZ19yZWFkX3Jhd19kYXRhKCkgd2lsbCByZXR1cm4gMC4gIFlvdSBjYW4gYWxzbyB1c2UKK2J1ZmZlcmVkLWltYWdlIG1vZGUgdG8gcmVhZCByYXcgZGF0YSBpbiBtdWx0aXBsZSBwYXNzZXMuCisKKworUmVhbGx5IHJhdyBkYXRhOiBEQ1QgY29lZmZpY2llbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgcG9zc2libGUgdG8gcmVhZCBvciB3cml0ZSB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgcmF3IERDVAorY29lZmZpY2llbnRzLiAgVGhpcyBmYWNpbGl0eSBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHVzZSBpbiBsb3NzbGVzcwordHJhbnNjb2RpbmcgYmV0d2VlbiBkaWZmZXJlbnQgSlBFRyBmaWxlIGZvcm1hdHMuICBPdGhlciBwb3NzaWJsZSBhcHBsaWNhdGlvbnMKK2luY2x1ZGUgbG9zc2xlc3MgY3JvcHBpbmcgb2YgYSBKUEVHIGltYWdlLCBsb3NzbGVzcyByZWFzc2VtYmx5IG9mIGEKK211bHRpLXN0cmlwIG9yIG11bHRpLXRpbGUgVElGRi9KUEVHIGZpbGUgaW50byBhIHNpbmdsZSBKUEVHIGRhdGFzdHJlYW0sIGV0Yy4KKworVG8gcmVhZCB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cywgb3BlbiB0aGUgZmlsZSBhbmQgZG8KK2pwZWdfcmVhZF9oZWFkZXIoKSBhcyB1c3VhbC4gIEJ1dCBpbnN0ZWFkIG9mIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkKK2FuZCBqcGVnX3JlYWRfc2NhbmxpbmVzKCksIGNhbGwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpLiAgVGhpcyB3aWxsIHJlYWQgdGhlCitlbnRpcmUgaW1hZ2UgaW50byBhIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cywgb25lIGFycmF5IHBlcgorY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmlydHVhbC1hcnJheQorZGVzY3JpcHRvcnMuICBFYWNoIHZpcnR1YWwgYXJyYXkgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHVzaW5nIHRoZSBKUEVHCittZW1vcnkgbWFuYWdlcidzIGFjY2Vzc192aXJ0X2JhcnJheSBtZXRob2QgKHNlZSBNZW1vcnkgbWFuYWdlbWVudCwgYmVsb3csCithbmQgYWxzbyByZWFkIHN0cnVjdHVyZS5kb2MncyBkaXNjdXNzaW9uIG9mIHZpcnR1YWwgYXJyYXkgaGFuZGxpbmcpLiAgT3IsCitmb3Igc2ltcGxlIHRyYW5zY29kaW5nIHRvIGEgZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXQsIHRoZSBhcnJheSBsaXN0IGNhbgoranVzdCBiZSBoYW5kZWQgZGlyZWN0bHkgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKworRWFjaCBibG9jayBpbiB0aGUgYmxvY2sgYXJyYXlzIGNvbnRhaW5zIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZXMgaW4KK25vcm1hbCBhcnJheSBvcmRlciAobm90IEpQRUcgemlnemFnIG9yZGVyKS4gIFRoZSBibG9jayBhcnJheXMgY29udGFpbiBvbmx5CitEQ1QgYmxvY2tzIGNvbnRhaW5pbmcgcmVhbCBkYXRhOyBhbnkgZW50aXJlbHktZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGZpbGwgb3V0CitpbnRlcmxlYXZlZCBNQ1VzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZXMgb2YgdGhlIGltYWdlIGFyZSBkaXNjYXJkZWQKK2R1cmluZyByZWFkaW5nIGFuZCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgYmxvY2sgYXJyYXlzLiAgKFRoZSBzaXplIG9mIGVhY2gKK2Jsb2NrIGFycmF5IGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIHdpZHRoX2luX2Jsb2NrcyBhbmQgaGVpZ2h0X2luX2Jsb2NrcworZmllbGRzIG9mIHRoZSBjb21wb25lbnQncyBjb21wX2luZm8gZW50cnkuKSAgVGhpcyBpcyBhbHNvIHRoZSBkYXRhIGZvcm1hdAorZXhwZWN0ZWQgYnkganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKworV2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgdGhlIHZpcnR1YWwgYXJyYXlzLCBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKQordG8gcmVsZWFzZSB0aGUgYXJyYXkgc3RvcmFnZSBhbmQgcmV0dXJuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCB0byBhbiBpZGxlCitzdGF0ZTsgb3IganVzdCBjYWxsIGpwZWdfZGVzdHJveSgpIGlmIHlvdSBkb24ndCBuZWVkIHRvIHJldXNlIHRoZSBvYmplY3QuCisKK0lmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLCBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCkgd2lsbCByZXR1cm4KK05VTEwgaWYgaXQgaXMgZm9yY2VkIHRvIHN1c3BlbmQ7IGEgbm9uLU5VTEwgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBzdWNjZXNzZnVsCitjb21wbGV0aW9uLiAgWW91IG5lZWQgbm90IHRlc3QgZm9yIGEgTlVMTCByZXR1cm4gdmFsdWUgd2hlbiB1c2luZyBhCitub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZS4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjYWxsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZQorZGVjb2RlcidzIGNvZWZmaWNpZW50IGFycmF5cyBkdXJpbmcgYSBub3JtYWwgZGVjb2RlIGN5Y2xlIGluIGJ1ZmZlcmVkLWltYWdlCittb2RlLiAgVGhpcyBmcmFtbWlzaCBtaWdodCBiZSB1c2VmdWwgZm9yIHByb2dyZXNzaXZlbHkgZGlzcGxheWluZyBhbiBpbmNvbWluZworaW1hZ2UgYW5kIHRoZW4gcmUtZW5jb2RpbmcgaXQgd2l0aG91dCBsb3NzLiAgVG8gZG8gdGhpcywgZGVjb2RlIGluIGJ1ZmZlcmVkLQoraW1hZ2UgbW9kZSBhcyBkaXNjdXNzZWQgcHJldmlvdXNseSwgdGhlbiBjYWxsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSBhZnRlcgordGhlIGxhc3QganBlZ19maW5pc2hfb3V0cHV0KCkgY2FsbC4gIFRoZSBhcnJheXMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHlvdXIgdXNlCit1bnRpbCB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuCisKKworVG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgSlBFRyBmaWxlIGFzIERDVCBjb2VmZmljaWVudHMsIHlvdSBtdXN0IHByb3ZpZGUKK3RoZSBEQ1QgY29lZmZpY2llbnRzIHN0b3JlZCBpbiB2aXJ0dWFsIGJsb2NrIGFycmF5cy4gIFlvdSBjYW4gZWl0aGVyIHBhc3MKK2Jsb2NrIGFycmF5cyByZWFkIGZyb20gYW4gaW5wdXQgSlBFRyBmaWxlIGJ5IGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSwgb3IKK2FsbG9jYXRlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IGFuZCBmaWxsIHRoZW0KK3lvdXJzZWxmLiAgSW4gZWl0aGVyIGNhc2UsIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgaXMgc3Vic3RpdHV0ZWQgZm9yCitqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBUaHVzIHRoZSBzZXF1ZW5jZSBpcworICAqIENyZWF0ZSBjb21wcmVzc2lvbiBvYmplY3QKKyAgKiBTZXQgYWxsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYXMgbmVjZXNzYXJ5CisgICogUmVxdWVzdCB2aXJ0dWFsIGFycmF5cyBpZiBuZWVkZWQKKyAgKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpCisgICoganBlZ19maW5pc2hfY29tcHJlc3MoKQorICAqIERlc3Ryb3kgb3IgcmUtdXNlIGNvbXByZXNzaW9uIG9iamVjdAoranBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBwYXNzZWQgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpcnR1YWwgYmxvY2sKK2FycmF5IGRlc2NyaXB0b3JzOyB0aGUgbnVtYmVyIG9mIGFycmF5cyBpcyBlcXVhbCB0byBjaW5mby5udW1fY29tcG9uZW50cy4KKworVGhlIHZpcnR1YWwgYXJyYXlzIG5lZWQgb25seSBoYXZlIGJlZW4gcmVxdWVzdGVkLCBub3QgcmVhbGl6ZWQsIGJlZm9yZQoranBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBjYWxsZWQuICBBIHNpZGUtZWZmZWN0IG9mCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIHRvIHJlYWxpemUgYW55IHZpcnR1YWwgYXJyYXlzIHRoYXQgaGF2ZSBiZWVuCityZXF1ZXN0ZWQgZnJvbSB0aGUgY29tcHJlc3Npb24gb2JqZWN0J3MgbWVtb3J5IG1hbmFnZXIuICBUaHVzLCB3aGVuIG9idGFpbmluZwordGhlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIGNvbXByZXNzaW9uIG9iamVjdCwgeW91IHNob3VsZCBmaWxsIHRoZSBhcnJheXMKK2FmdGVyIGNhbGxpbmcganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4gIFRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4gb3V0Cit3aGVuIHlvdSBjYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCk7IGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgb25seSB3cml0ZXMKK3RoZSBmaWxlIGhlYWRlci4KKworV2hlbiB3cml0aW5nIHJhdyBEQ1QgY29lZmZpY2llbnRzLCBpdCBpcyBjcnVjaWFsIHRoYXQgdGhlIEpQRUcgcXVhbnRpemF0aW9uCit0YWJsZXMgYW5kIHNhbXBsaW5nIGZhY3RvcnMgbWF0Y2ggdGhlIHdheSB0aGUgZGF0YSB3YXMgZW5jb2RlZCwgb3IgdGhlCityZXN1bHRpbmcgZmlsZSB3aWxsIGJlIGludmFsaWQuICBGb3IgdHJhbnNjb2RpbmcgZnJvbSBhbiBleGlzdGluZyBKUEVHIGZpbGUsCit3ZSByZWNvbW1lbmQgdXNpbmcganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKS4gIFRoaXMgcm91dGluZSBpbml0aWFsaXplcworYWxsIHRoZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzIChsaWtlIGpwZWdfc2V0X2RlZmF1bHRzKCkpLAordGhlbiBjb3BpZXMgdGhlIGNyaXRpY2FsIGluZm9ybWF0aW9uIGZyb20gYSBzb3VyY2UgZGVjb21wcmVzc2lvbiBvYmplY3QuCitUaGUgZGVjb21wcmVzc2lvbiBvYmplY3Qgc2hvdWxkIGhhdmUganVzdCBiZWVuIHVzZWQgdG8gcmVhZCB0aGUgZW50aXJlCitKUEVHIGlucHV0IGZpbGUgLS0tIHRoYXQgaXMsIGl0IHNob3VsZCBiZSBhd2FpdGluZyBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuCisKK2pwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgbWFya3MgYWxsIHRhYmxlcyBzdG9yZWQgaW4gdGhlIGNvbXByZXNzaW9uIG9iamVjdAorYXMgbmVlZGluZyB0byBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZSAodGh1cywgaXQgYWN0cyBsaWtlCitqcGVnX3N0YXJ0X2NvbXByZXNzKGNpbmZvLCBUUlVFKSkuICBUaGlzIGlzIGZvciBzYWZldHkncyBzYWtlLCB0byBhdm9pZAorZW1pdHRpbmcgYWJicmV2aWF0ZWQgSlBFRyBmaWxlcyBieSBhY2NpZGVudC4gIElmIHlvdSByZWFsbHkgd2FudCB0byBlbWl0IGFuCithYmJyZXZpYXRlZCBKUEVHIGZpbGUsIGNhbGwganBlZ19zdXBwcmVzc190YWJsZXMoKSwgb3Igc2V0IHRoZSB0YWJsZXMnCitpbmRpdmlkdWFsIHNlbnRfdGFibGUgZmxhZ3MsIGJldHdlZW4gY2FsbGluZyBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGFuZAoranBlZ19maW5pc2hfY29tcHJlc3MoKS4KKworCitQcm9ncmVzcyBtb25pdG9yaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIHJlZ2FpbiBjb250cm9sIGZyb20gdGhlIEpQRUcgbGlicmFyeSBldmVyeSBzbworb2Z0ZW4uICBUaGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHByb2R1Y2UgYSBwZXJjZW50LWRvbmUgYmFyIG9yCitvdGhlciBwcm9ncmVzcyBkaXNwbGF5LiAgKEZvciBhIHNpbXBsZSBleGFtcGxlLCBzZWUgY2pwZWcuYyBvciBkanBlZy5jLikKK0FsdGhvdWdoIHlvdSBkbyBnZXQgY29udHJvbCBiYWNrIGZyZXF1ZW50bHkgZHVyaW5nIHRoZSBkYXRhLXRyYW5zZmVycmluZyBwYXNzCisodGhlIGpwZWdfcmVhZF9zY2FubGluZXMgb3IganBlZ193cml0ZV9zY2FubGluZXMgbG9vcCksIGFueSBhZGRpdGlvbmFsIHBhc3Nlcword2lsbCBvY2N1ciBpbnNpZGUganBlZ19maW5pc2hfY29tcHJlc3Mgb3IganBlZ19zdGFydF9kZWNvbXByZXNzOyB0aG9zZQorcm91dGluZXMgbWF5IHRha2UgYSBsb25nIHRpbWUgdG8gZXhlY3V0ZSwgYW5kIHlvdSBkb24ndCBnZXQgY29udHJvbCBiYWNrCit1bnRpbCB0aGV5IGFyZSBkb25lLgorCitZb3UgY2FuIGRlZmluZSBhIHByb2dyZXNzLW1vbml0b3Igcm91dGluZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkKK2J5IHRoZSBsaWJyYXJ5LiAgTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCBob3cgb2Z0ZW4gdGhpcyBjYWxsIHdpbGwgb2NjdXIsCitzbyB3ZSBkb24ndCByZWNvbW1lbmQgeW91IHVzZSBpdCBmb3IgbW91c2UgdHJhY2tpbmcgb3IgYW55dGhpbmcgbGlrZSB0aGF0LgorQXQgcHJlc2VudCwgYSBjYWxsIHdpbGwgb2NjdXIgb25jZSBwZXIgTUNVIHJvdywgc2NhbmxpbmUsIG9yIHNhbXBsZSByb3cKK2dyb3VwLCB3aGljaGV2ZXIgdW5pdCBpcyBjb252ZW5pZW50IGZvciB0aGUgY3VycmVudCBwcm9jZXNzaW5nIG1vZGU7IHNvIHRoZQord2lkZXIgdGhlIGltYWdlLCB0aGUgbG9uZ2VyIHRoZSB0aW1lIGJldHdlZW4gY2FsbHMuICBEdXJpbmcgdGhlIGRhdGEKK3RyYW5zZmVycmluZyBwYXNzLCBvbmx5IG9uZSBjYWxsIG9jY3VycyBwZXIgY2FsbCBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzIG9yCitqcGVnX3dyaXRlX3NjYW5saW5lcywgc28gZG9uJ3QgcGFzcyBhIGxhcmdlIG51bWJlciBvZiBzY2FubGluZXMgYXQgb25jZSBpZgoreW91IHdhbnQgZmluZSByZXNvbHV0aW9uIGluIHRoZSBwcm9ncmVzcyBjb3VudC4gIChJZiB5b3UgcmVhbGx5IG5lZWQgdG8gdXNlCit0aGUgY2FsbGJhY2sgbWVjaGFuaXNtIGZvciB0aW1lLWNyaXRpY2FsIHRhc2tzIGxpa2UgbW91c2UgdHJhY2tpbmcsIHlvdSBjb3VsZAoraW5zZXJ0IGFkZGl0aW9uYWwgY2FsbHMgaW5zaWRlIHNvbWUgb2YgdGhlIGxpYnJhcnkncyBpbm5lciBsb29wcy4pCisKK1RvIGVzdGFibGlzaCBhIHByb2dyZXNzLW1vbml0b3IgY2FsbGJhY2ssIGNyZWF0ZSBhIHN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciwKK2ZpbGwgaW4gaXRzIHByb2dyZXNzX21vbml0b3IgZmllbGQgd2l0aCBhIHBvaW50ZXIgdG8geW91ciBjYWxsYmFjayByb3V0aW5lLAorYW5kIHNldCBjaW5mby0+cHJvZ3Jlc3MgdG8gcG9pbnQgdG8gdGhlIHN0cnVjdC4gIFRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZAord2hlbmV2ZXIgY2luZm8tPnByb2dyZXNzIGlzIG5vbi1OVUxMLiAgKFRoaXMgcG9pbnRlciBpcyBzZXQgdG8gTlVMTCBieQoranBlZ19jcmVhdGVfY29tcHJlc3Mgb3IganBlZ19jcmVhdGVfZGVjb21wcmVzczsgdGhlIGxpYnJhcnkgd2lsbCBub3QgY2hhbmdlCitpdCB0aGVyZWFmdGVyLiAgU28gaWYgeW91IGFsbG9jYXRlIGR5bmFtaWMgc3RvcmFnZSBmb3IgdGhlIHByb2dyZXNzIHN0cnVjdCwKK21ha2Ugc3VyZSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyB0aGUgSlBFRyBvYmplY3QgZG9lcy4gIEFsbG9jYXRpbmcgZnJvbSB0aGUKK0pQRUcgbWVtb3J5IG1hbmFnZXIgd2l0aCBsaWZldGltZSBKUE9PTF9QRVJNQU5FTlQgd2lsbCB3b3JrIG5pY2VseS4pICBZb3UKK2NhbiB1c2UgdGhlIHNhbWUgY2FsbGJhY2sgcm91dGluZSBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKworVGhlIGpwZWdfcHJvZ3Jlc3NfbWdyIHN0cnVjdCBjb250YWlucyBmb3VyIGZpZWxkcyB3aGljaCBhcmUgc2V0IGJ5IHRoZSBsaWJyYXJ5OgorCWxvbmcgcGFzc19jb3VudGVyOwkvKiB3b3JrIHVuaXRzIGNvbXBsZXRlZCBpbiB0aGlzIHBhc3MgKi8KKwlsb25nIHBhc3NfbGltaXQ7CS8qIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIGluIHRoaXMgcGFzcyAqLworCWludCBjb21wbGV0ZWRfcGFzc2VzOwkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLworCWludCB0b3RhbF9wYXNzZXM7CS8qIHRvdGFsIG51bWJlciBvZiBwYXNzZXMgZXhwZWN0ZWQgKi8KK0R1cmluZyBhbnkgb25lIHBhc3MsIHBhc3NfY291bnRlciBpbmNyZWFzZXMgZnJvbSAwIHVwIHRvIChub3QgaW5jbHVkaW5nKQorcGFzc19saW1pdDsgdGhlIHN0ZXAgc2l6ZSBpcyB1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgMS4gIFRoZSBwYXNzX2xpbWl0Cit2YWx1ZSBtYXkgY2hhbmdlIGZyb20gb25lIHBhc3MgdG8gYW5vdGhlci4gIFRoZSBleHBlY3RlZCB0b3RhbCBudW1iZXIgb2YKK3Bhc3NlcyBpcyBpbiB0b3RhbF9wYXNzZXMsIGFuZCB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbHJlYWR5IGNvbXBsZXRlZCBpcyBpbgorY29tcGxldGVkX3Bhc3Nlcy4gIFRodXMgdGhlIGZyYWN0aW9uIG9mIHdvcmsgY29tcGxldGVkIG1heSBiZSBlc3RpbWF0ZWQgYXMKKwkJY29tcGxldGVkX3Bhc3NlcyArIChwYXNzX2NvdW50ZXIvcGFzc19saW1pdCkKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl0b3RhbF9wYXNzZXMKK2lnbm9yaW5nIHRoZSBmYWN0IHRoYXQgdGhlIHBhc3NlcyBtYXkgbm90IGJlIGVxdWFsIGFtb3VudHMgb2Ygd29yay4KKworV2hlbiBkZWNvbXByZXNzaW5nLCBwYXNzX2xpbWl0IGNhbiBldmVuIGNoYW5nZSB3aXRoaW4gYSBwYXNzLCBiZWNhdXNlIGl0CitkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2Ygc2NhbnMgaW4gdGhlIEpQRUcgZmlsZSwgd2hpY2ggaXNuJ3QgYWx3YXlzIGtub3duIGluCithZHZhbmNlLiAgVGhlIGNvbXB1dGVkIGZyYWN0aW9uLW9mLXdvcmstZG9uZSBtYXkganVtcCBzdWRkZW5seSAoaWYgdGhlIGxpYnJhcnkKK2Rpc2NvdmVycyBpdCBoYXMgb3ZlcmVzdGltYXRlZCB0aGUgbnVtYmVyIG9mIHNjYW5zKSBvciBldmVuIGRlY3JlYXNlIChpbiB0aGUKK29wcG9zaXRlIGNhc2UpLiAgSXQgaXMgbm90IHdpc2UgdG8gcHV0IGdyZWF0IGZhaXRoIGluIHRoZSB3b3JrIGVzdGltYXRlLgorCitXaGVuIHVzaW5nIHRoZSBkZWNvbXByZXNzb3IncyBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3b3JrCitlc3RpbWF0ZSBpcyBsaWtlbHkgdG8gYmUgY29tcGxldGVseSB1bmhlbHBmdWwsIGJlY2F1c2UgdGhlIGxpYnJhcnkgaGFzIG5vIHdheQordG8ga25vdyBob3cgbWFueSBvdXRwdXQgcGFzc2VzIHdpbGwgYmUgZGVtYW5kZWQgb2YgaXQuICBDdXJyZW50bHksIHRoZSBsaWJyYXJ5CitzZXRzIHRvdGFsX3Bhc3NlcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXJlIHdpbGwgYmUgb25lIG1vcmUgb3V0cHV0CitwYXNzIGlmIHRoZSBpbnB1dCBmaWxlIGVuZCBoYXNuJ3QgeWV0IGJlZW4gcmVhZCAoanBlZ19pbnB1dF9jb21wbGV0ZSgpIGlzbid0CitUUlVFKSwgYnV0IG5vIG1vcmUgb3V0cHV0IHBhc3NlcyBpZiB0aGUgZmlsZSBlbmQgaGFzIGJlZW4gcmVhY2hlZCB3aGVuIHRoZQorb3V0cHV0IHBhc3MgaXMgc3RhcnRlZC4gIFRoaXMgbWVhbnMgdGhhdCB0b3RhbF9wYXNzZXMgd2lsbCByaXNlIGFzIGFkZGl0aW9uYWwKK291dHB1dCBwYXNzZXMgYXJlIHJlcXVlc3RlZC4gIElmIHlvdSBoYXZlIGEgd2F5IG9mIGRldGVybWluaW5nIHRoZSBpbnB1dCBmaWxlCitzaXplLCBlc3RpbWF0aW5nIHByb2dyZXNzIGJhc2VkIG9uIHRoZSBmcmFjdGlvbiBvZiB0aGUgZmlsZSB0aGF0J3MgYmVlbiByZWFkCit3aWxsIHByb2JhYmx5IGJlIG1vcmUgdXNlZnVsIHRoYW4gdXNpbmcgdGhlIGxpYnJhcnkncyB2YWx1ZS4KKworCitNZW1vcnkgbWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGNvdmVycyBzb21lIGtleSBmYWN0cyBhYm91dCB0aGUgSlBFRyBsaWJyYXJ5J3MgYnVpbHQtaW4gbWVtb3J5CittYW5hZ2VyLiAgRm9yIG1vcmUgaW5mbywgcGxlYXNlIHJlYWQgc3RydWN0dXJlLmRvYydzIHNlY3Rpb24gYWJvdXQgdGhlIG1lbW9yeQorbWFuYWdlciwgYW5kIGNvbnN1bHQgdGhlIHNvdXJjZSBjb2RlIGlmIG5lY2Vzc2FyeS4KKworQWxsIG1lbW9yeSBhbmQgdGVtcG9yYXJ5IGZpbGUgYWxsb2NhdGlvbiB3aXRoaW4gdGhlIGxpYnJhcnkgaXMgZG9uZSB2aWEgdGhlCittZW1vcnkgbWFuYWdlci4gIElmIG5lY2Vzc2FyeSwgeW91IGNhbiByZXBsYWNlIHRoZSAiYmFjayBlbmQiIG9mIHRoZSBtZW1vcnkKK21hbmFnZXIgdG8gY29udHJvbCBhbGxvY2F0aW9uIHlvdXJzZWxmIChmb3IgZXhhbXBsZSwgaWYgeW91IGRvbid0IHdhbnQgdGhlCitsaWJyYXJ5IHRvIHVzZSBtYWxsb2MoKSBhbmQgZnJlZSgpIGZvciBzb21lIHJlYXNvbikuCisKK1NvbWUgZGF0YSBpcyBhbGxvY2F0ZWQgInBlcm1hbmVudGx5IiBhbmQgd2lsbCBub3QgYmUgZnJlZWQgdW50aWwgdGhlIEpQRUcKK29iamVjdCBpcyBkZXN0cm95ZWQuICBNb3N0IGRhdGEgaXMgYWxsb2NhdGVkICJwZXIgaW1hZ2UiIGFuZCBpcyBmcmVlZCBieQoranBlZ19maW5pc2hfY29tcHJlc3MsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MsIG9yIGpwZWdfYWJvcnQuICBZb3UgY2FuIGNhbGwgdGhlCittZW1vcnkgbWFuYWdlciB5b3Vyc2VsZiB0byBhbGxvY2F0ZSBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCitmcmVlZCBhdCB0aGVzZSB0aW1lcy4gIFR5cGljYWwgY29kZSBmb3IgdGhpcyBpcworICBwdHIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBzaXplKTsKK1VzZSBKUE9PTF9QRVJNQU5FTlQgdG8gZ2V0IHN0b3JhZ2UgdGhhdCBsYXN0cyBhcyBsb25nIGFzIHRoZSBKUEVHIG9iamVjdC4KK1VzZSBhbGxvY19sYXJnZSBpbnN0ZWFkIG9mIGFsbG9jX3NtYWxsIGZvciBhbnl0aGluZyBiaWdnZXIgdGhhbiBhIGZldyBLYnl0ZXMuCitUaGVyZSBhcmUgYWxzbyBhbGxvY19zYXJyYXkgYW5kIGFsbG9jX2JhcnJheSByb3V0aW5lcyB0aGF0IGF1dG9tYXRpY2FsbHkKK2J1aWxkIDItRCBzYW1wbGUgb3IgYmxvY2sgYXJyYXlzLgorCitUaGUgbGlicmFyeSdzIG1pbmltdW0gc3BhY2UgcmVxdWlyZW1lbnRzIHRvIHByb2Nlc3MgYW4gaW1hZ2UgZGVwZW5kIG9uIHRoZQoraW1hZ2UncyB3aWR0aCwgYnV0IG5vdCBvbiBpdHMgaGVpZ2h0LCBiZWNhdXNlIHRoZSBsaWJyYXJ5IG9yZGluYXJpbHkgd29ya3MKK3dpdGggInN0cmlwIiBidWZmZXJzIHRoYXQgYXJlIGFzIHdpZGUgYXMgdGhlIGltYWdlIGJ1dCBqdXN0IGEgZmV3IHJvd3MgaGlnaC4KK1NvbWUgb3BlcmF0aW5nIG1vZGVzIChlZywgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uKSByZXF1aXJlIGZ1bGwtaW1hZ2UKK2J1ZmZlcnMuICBTdWNoIGJ1ZmZlcnMgYXJlIHRyZWF0ZWQgYXMgInZpcnR1YWwgYXJyYXlzIjogb25seSB0aGUgY3VycmVudCBzdHJpcAorbmVlZCBiZSBpbiBtZW1vcnksIGFuZCB0aGUgcmVzdCBjYW4gYmUgc3dhcHBlZCBvdXQgdG8gYSB0ZW1wb3JhcnkgZmlsZS4KKworSWYgeW91IHVzZSB0aGUgc2ltcGxlc3QgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgKGptZW1ub2JzLmMpLCB0aGVuIG5vCit0ZW1wb3JhcnkgZmlsZXMgYXJlIHVzZWQ7IHZpcnR1YWwgYXJyYXlzIGFyZSBzaW1wbHkgbWFsbG9jKCknZC4gIEltYWdlcyBiaWdnZXIKK3RoYW4gbWVtb3J5IGNhbiBiZSBwcm9jZXNzZWQgb25seSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyB2aXJ0dWFsIG1lbW9yeS4KK1RoZSBvdGhlciBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZHMgc3VwcG9ydCB0ZW1wb3JhcnkgZmlsZXMgb2YgdmFyaW91cyBmbGF2b3JzCithbmQgdGh1cyB3b3JrIGluIG1hY2hpbmVzIHdpdGhvdXQgdmlydHVhbCBtZW1vcnkuICBUaGV5IG1heSBhbHNvIGJlIHVzZWZ1bCBvbgorVW5peCBtYWNoaW5lcyBpZiB5b3UgbmVlZCB0byBwcm9jZXNzIGltYWdlcyB0aGF0IGV4Y2VlZCBhdmFpbGFibGUgc3dhcCBzcGFjZS4KKworV2hlbiB1c2luZyB0ZW1wb3JhcnkgZmlsZXMsIHRoZSBsaWJyYXJ5IHdpbGwgbWFrZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yCitpdHMgdmlydHVhbCBhcnJheXMganVzdCBiaWcgZW5vdWdoIHRvIHN0YXkgd2l0aGluIGEgIm1heGltdW0gbWVtb3J5IiBzZXR0aW5nLgorWW91ciBhcHBsaWNhdGlvbiBjYW4gc2V0IHRoaXMgbGltaXQgYnkgc2V0dGluZyBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZQorYWZ0ZXIgY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0LiAgKE9mIGNvdXJzZSwgdGhlcmUgaXMgc3RpbGwgYSBtaW5pbXVtIHNpemUgZm9yCit0aGUgYnVmZmVycywgc28gdGhlIG1heC1tZW1vcnkgc2V0dGluZyBpcyBlZmZlY3RpdmUgb25seSBpZiBpdCBpcyBiaWdnZXIgdGhhbgordGhlIG1pbmltdW0gc3BhY2UgbmVlZGVkLikgIElmIHlvdSBhbGxvY2F0ZSBhbnkgbGFyZ2Ugc3RydWN0dXJlcyB5b3Vyc2VsZiwgeW91CittdXN0IGFsbG9jYXRlIHRoZW0gYmVmb3JlIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBvciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBpbgorb3JkZXIgdG8gaGF2ZSB0aGVtIGNvdW50ZWQgYWdhaW5zdCB0aGUgbWF4IG1lbW9yeSBsaW1pdC4gIEFsc28ga2VlcCBpbiBtaW5kCit0aGF0IHNwYWNlIGFsbG9jYXRlZCB3aXRoIGFsbG9jX3NtYWxsKCkgaXMgaWdub3JlZCwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAoraXQncyB0b28gc21hbGwgdG8gYmUgd29ydGggd29ycnlpbmcgYWJvdXQ7IHNvIGEgcmVhc29uYWJsZSBzYWZldHkgbWFyZ2luCitzaG91bGQgYmUgbGVmdCB3aGVuIHNldHRpbmcgbWF4X21lbW9yeV90b191c2UuCisKK0lmIHlvdSB1c2UgdGhlIGptZW1uYW1lLmMgb3Igam1lbWRvcy5jIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kLCBpdCBpcworaW1wb3J0YW50IHRvIGNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCBwcm9wZXJseSB0byBlbnN1cmUgdGhhdCB0aGUgdGVtcG9yYXJ5CitmaWxlcyBnZXQgZGVsZXRlZC4gIChUaGlzIGlzIGVzcGVjaWFsbHkgY3J1Y2lhbCB3aXRoIGptZW1kb3MuYywgd2hlcmUgdGhlCisidGVtcG9yYXJ5IGZpbGVzIiBtYXkgYmUgZXh0ZW5kZWQtbWVtb3J5IHNlZ21lbnRzOyBpZiB0aGV5IGFyZSBub3QgZnJlZWQsCitET1Mgd2lsbCByZXF1aXJlIGEgcmVib290IHRvIHJlY292ZXIgdGhlIG1lbW9yeS4pICBUaHVzLCB3aXRoIHRoZXNlIG1lbW9yeQorbWFuYWdlcnMsIGl0J3MgYSBnb29kIGlkZWEgdG8gcHJvdmlkZSBhIHNpZ25hbCBoYW5kbGVyIHRoYXQgd2lsbCB0cmFwIGFueQorZWFybHkgZXhpdCBmcm9tIHlvdXIgcHJvZ3JhbS4gIFRoZSBoYW5kbGVyIHNob3VsZCBjYWxsIGVpdGhlciBqcGVnX2Fib3J0KCkKK29yIGpwZWdfZGVzdHJveSgpIGZvciBhbnkgYWN0aXZlIEpQRUcgb2JqZWN0cy4gIEEgaGFuZGxlciBpcyBub3QgbmVlZGVkIHdpdGgKK2ptZW1ub2JzLmMsIGFuZCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHdpdGggam1lbWFuc2kuYyBvciBqbWVtbWFjLmMgZWl0aGVyLAorc2luY2UgdGhlIEMgbGlicmFyeSBpcyBzdXBwb3NlZCB0byB0YWtlIGNhcmUgb2YgZGVsZXRpbmcgZmlsZXMgbWFkZSB3aXRoCit0bXBmaWxlKCkuCisKKworTWVtb3J5IHVzYWdlCistLS0tLS0tLS0tLS0KKworV29ya2luZyBtZW1vcnkgcmVxdWlyZW1lbnRzIHdoaWxlIHBlcmZvcm1pbmcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbgorZGVwZW5kIG9uIGltYWdlIGRpbWVuc2lvbnMsIGltYWdlIGNoYXJhY3RlcmlzdGljcyAoc3VjaCBhcyBjb2xvcnNwYWNlIGFuZAorSlBFRyBwcm9jZXNzKSwgYW5kIG9wZXJhdGluZyBtb2RlIChhcHBsaWNhdGlvbi1zZWxlY3RlZCBvcHRpb25zKS4KKworQXMgb2YgdjZiLCB0aGUgZGVjb21wcmVzc29yIHJlcXVpcmVzOgorIDEuIEFib3V0IDI0SyBpbiBtb3JlLW9yLWxlc3MtZml4ZWQtc2l6ZSBkYXRhLiAgVGhpcyB2YXJpZXMgYSBiaXQgZGVwZW5kaW5nCisgICAgb24gb3BlcmF0aW5nIG1vZGUgYW5kIGltYWdlIGNoYXJhY3RlcmlzdGljcyAocGFydGljdWxhcmx5IGNvbG9yIHZzLgorICAgIGdyYXlzY2FsZSksIGJ1dCBpdCBkb2Vzbid0IGRlcGVuZCBvbiBpbWFnZSBkaW1lbnNpb25zLgorIDIuIFN0cmlwIGJ1ZmZlcnMgKG9mIHNpemUgcHJvcG9ydGlvbmFsIHRvIHRoZSBpbWFnZSB3aWR0aCkgZm9yIElEQ1QgYW5kCisgICAgdXBzYW1wbGluZyByZXN1bHRzLiAgVGhlIHdvcnN0IGNhc2UgZm9yIGNvbW1vbmx5IHVzZWQgc2FtcGxpbmcgZmFjdG9ycworICAgIGlzIGFib3V0IDM0IGJ5dGVzICogd2lkdGggaW4gcGl4ZWxzIGZvciBhIGNvbG9yIGltYWdlLiAgQSBncmF5c2NhbGUgaW1hZ2UKKyAgICBvbmx5IG5lZWRzIGFib3V0IDggYnl0ZXMgcGVyIHBpeGVsIGNvbHVtbi4KKyAzLiBBIGZ1bGwtaW1hZ2UgRENUIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBuZWVkZWQgdG8gZGVjb2RlIGEgbXVsdGktc2NhbiBKUEVHCisgICAgZmlsZSAoaW5jbHVkaW5nIHByb2dyZXNzaXZlIEpQRUdzKSwgb3Igd2hlbmV2ZXIgeW91IHNlbGVjdCBidWZmZXJlZC1pbWFnZQorICAgIG1vZGUuICBUaGlzIHRha2VzIDIgYnl0ZXMvY29lZmZpY2llbnQuICBBdCB0eXBpY2FsIDJ4MiBzYW1wbGluZywgdGhhdCdzCisgICAgMyBieXRlcyBwZXIgcGl4ZWwgZm9yIGEgY29sb3IgaW1hZ2UuICBXb3JzdCBjYXNlICgxeDEgc2FtcGxpbmcpIHJlcXVpcmVzCisgICAgNiBieXRlcy9waXhlbC4gIEZvciBncmF5c2NhbGUsIGZpZ3VyZSAyIGJ5dGVzL3BpeGVsLgorIDQuIFRvIHBlcmZvcm0gMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiwgdGhlIGRlY29tcHJlc3NvciBhbHNvIG5lZWRzIGEKKyAgICAxMjhLIGNvbG9yIGxvb2t1cCB0YWJsZSBhbmQgYSBmdWxsLWltYWdlIHBpeGVsIGJ1ZmZlciAoMyBieXRlcy9waXhlbCkuCitUaGlzIGRvZXMgbm90IGNvdW50IGFueSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgc3VjaCBhcyBhCitidWZmZXIgdG8gaG9sZCB0aGUgZmluYWwgb3V0cHV0IGltYWdlLgorCitUaGUgYWJvdmUgZmlndXJlcyBhcmUgdmFsaWQgZm9yIDgtYml0IEpQRUcgZGF0YSBwcmVjaXNpb24gYW5kIGEgbWFjaGluZSB3aXRoCiszMi1iaXQgaW50cy4gIEZvciAxMi1iaXQgSlBFRyBkYXRhLCBkb3VibGUgdGhlIHNpemUgb2YgdGhlIHN0cmlwIGJ1ZmZlcnMgYW5kCitxdWFudGl6YXRpb24gcGl4ZWwgYnVmZmVyLiAgVGhlICJmaXhlZC1zaXplIiBkYXRhIHdpbGwgYmUgc29tZXdoYXQgc21hbGxlcgord2l0aCAxNi1iaXQgaW50cywgbGFyZ2VyIHdpdGggNjQtYml0IGludHMuICBBbHNvLCBDTVlLIG9yIG90aGVyIHVudXN1YWwKK2NvbG9yIHNwYWNlcyB3aWxsIHJlcXVpcmUgZGlmZmVyZW50IGFtb3VudHMgb2Ygc3BhY2UuCisKK1RoZSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGFuZCBwaXhlbCBidWZmZXJzLCBpZiBuZWVkZWQgYXQgYWxsLCBkbyBub3QKK2hhdmUgdG8gYmUgZnVsbHkgUkFNIHJlc2lkZW50OyB5b3UgY2FuIGhhdmUgdGhlIGxpYnJhcnkgdXNlIHRlbXBvcmFyeQorZmlsZXMgaW5zdGVhZCB3aGVuIHRoZSB0b3RhbCBtZW1vcnkgdXNhZ2Ugd291bGQgZXhjZWVkIGEgbGltaXQgeW91IHNldC4KKyhCdXQgaWYgeW91ciBPUyBzdXBwb3J0cyB2aXJ0dWFsIG1lbW9yeSwgaXQncyBwcm9iYWJseSBiZXR0ZXIgdG8ganVzdCB1c2UKK2ptZW1ub2JzIGFuZCBsZXQgdGhlIE9TIGRvIHRoZSBzd2FwcGluZy4pCisKK1RoZSBjb21wcmVzc29yJ3MgbWVtb3J5IHJlcXVpcmVtZW50cyBhcmUgc2ltaWxhciwgZXhjZXB0IHRoYXQgaXQgaGFzIG5vIG5lZWQKK2ZvciBjb2xvciBxdWFudGl6YXRpb24uICBBbHNvLCBpdCBuZWVkcyBhIGZ1bGwtaW1hZ2UgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcgoraWYgSHVmZm1hbi10YWJsZSBvcHRpbWl6YXRpb24gaXMgYXNrZWQgZm9yLCBldmVuIGlmIHByb2dyZXNzaXZlIG1vZGUgaXMgbm90CityZXF1ZXN0ZWQuCisKK0lmIHlvdSBuZWVkIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5IHVzYWdlIGluIGEgcGFydGljdWxhcgorc2l0dWF0aW9uLCB5b3UgY2FuIGVuYWJsZSB0aGUgTUVNX1NUQVRTIGNvZGUgaW4gam1lbW1nci5jLgorCisKK0xpYnJhcnkgY29tcGlsZS10aW1lIG9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBudW1iZXIgb2YgY29tcGlsZS10aW1lIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBieSBtb2RpZnlpbmcgam1vcmVjZmcuaC4KKworVGhlIEpQRUcgc3RhbmRhcmQgcHJvdmlkZXMgZm9yIGJvdGggdGhlIGJhc2VsaW5lIDgtYml0IERDVCBwcm9jZXNzIGFuZAorYSAxMi1iaXQgRENUIHByb2Nlc3MuICBUaGUgSUpHIGNvZGUgc3VwcG9ydHMgMTItYml0IGxvc3N5IEpQRUcgaWYgeW91IGRlZmluZQorQklUU19JTl9KU0FNUExFIGFzIDEyIHJhdGhlciB0aGFuIDguICBOb3RlIHRoYXQgdGhpcyBjYXVzZXMgSlNBTVBMRSB0byBiZQorbGFyZ2VyIHRoYW4gYSBjaGFyLCBzbyBpdCBhZmZlY3RzIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbidzIGltYWdlIGRhdGEuCitUaGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZyBhbmQgZGpwZWcgY2FuIHN1cHBvcnQgMTItYml0IG1vZGUgb25seSBmb3IgUFBNCithbmQgR0lGIGZpbGUgZm9ybWF0czsgeW91IG11c3QgZGlzYWJsZSB0aGUgb3RoZXIgZmlsZSBmb3JtYXRzIHRvIGNvbXBpbGUgYQorMTItYml0IGNqcGVnIG9yIGRqcGVnLiAgKGluc3RhbGwuZG9jIGhhcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQuKQorQXQgcHJlc2VudCwgYSAxMi1iaXQgbGlicmFyeSBjYW4gaGFuZGxlICpvbmx5KiAxMi1iaXQgaW1hZ2VzLCBub3QgYm90aAorcHJlY2lzaW9ucy4gIChJZiB5b3UgbmVlZCB0byBpbmNsdWRlIGJvdGggOC0gYW5kIDEyLWJpdCBsaWJyYXJpZXMgaW4gYSBzaW5nbGUKK2FwcGxpY2F0aW9uLCB5b3UgY291bGQgcHJvYmFibHkgZG8gaXQgYnkgZGVmaW5pbmcgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworZm9yIGp1c3Qgb25lIG9mIHRoZSBjb3BpZXMuICBZb3UnZCBoYXZlIHRvIGFjY2VzcyB0aGUgOC1iaXQgYW5kIDEyLWJpdCBjb3BpZXMKK2Zyb20gc2VwYXJhdGUgYXBwbGljYXRpb24gc291cmNlIGZpbGVzLiAgVGhpcyBpcyB1bnRlc3RlZCAuLi4gaWYgeW91IHRyeSBpdCwKK3dlJ2QgbGlrZSB0byBoZWFyIHdoZXRoZXIgaXQgd29ya3MhKQorCitOb3RlIHRoYXQgYSAxMi1iaXQgbGlicmFyeSBhbHdheXMgY29tcHJlc3NlcyBpbiBIdWZmbWFuIG9wdGltaXphdGlvbiBtb2RlLAoraW4gb3JkZXIgdG8gZ2VuZXJhdGUgdmFsaWQgSHVmZm1hbiB0YWJsZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG91cgorZGVmYXVsdCBIdWZmbWFuIHRhYmxlcyBvbmx5IGNvdmVyIDgtYml0IGRhdGEuICBJZiB5b3UgbmVlZCB0byBvdXRwdXQgMTItYml0CitmaWxlcyBpbiBvbmUgcGFzcywgeW91J2xsIGhhdmUgdG8gc3VwcGx5IHN1aXRhYmxlIGRlZmF1bHQgSHVmZm1hbiB0YWJsZXMuCitZb3UgbWF5IGFsc28gd2FudCB0byBzdXBwbHkgeW91ciBvd24gRENUIHF1YW50aXphdGlvbiB0YWJsZXM7IHRoZSBleGlzdGluZworcXVhbGl0eS1zY2FsaW5nIGNvZGUgaGFzIGJlZW4gZGV2ZWxvcGVkIGZvciA4LWJpdCB1c2UsIGFuZCBwcm9iYWJseSBkb2Vzbid0CitnZW5lcmF0ZSBlc3BlY2lhbGx5IGdvb2QgdGFibGVzIGZvciAxMi1iaXQuCisKK1RoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIChjb2xvciBjaGFubmVscykgaW4gdGhlIGltYWdlIGlzIGRldGVybWluZWQKK2J5IE1BWF9DT01QT05FTlRTLiAgVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzIHVwIHRvIDI1NSBjb21wb25lbnRzLCBidXQgd2UKK2V4cGVjdCB0aGF0IGZldyBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIG1vcmUgdGhhbiBmb3VyIG9yIHNvLgorCitPbiBtYWNoaW5lcyB3aXRoIHVudXN1YWwgZGF0YSB0eXBlIHNpemVzLCB5b3UgbWF5IGJlIGFibGUgdG8gaW1wcm92ZQorcGVyZm9ybWFuY2Ugb3IgcmVkdWNlIG1lbW9yeSBzcGFjZSBieSB0d2Vha2luZyB0aGUgdmFyaW91cyB0eXBlZGVmcyBpbgoram1vcmVjZmcuaC4gIEluIHBhcnRpY3VsYXIsIG9uIHNvbWUgUklTQyBDUFVzLCBhY2Nlc3MgdG8gYXJyYXlzIG9mICJzaG9ydCJzCitpcyBxdWl0ZSBzbG93OyBjb25zaWRlciB0cmFkaW5nIG1lbW9yeSBmb3Igc3BlZWQgYnkgbWFraW5nIEpDT0VGLCBJTlQxNiwgYW5kCitVSU5UMTYgYmUgImludCIgb3IgInVuc2lnbmVkIGludCIuICBVSU5UOCBpcyBhbHNvIGEgY2FuZGlkYXRlIHRvIGJlY29tZSBpbnQuCitZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBtYWtlIEpTQU1QTEUgYmUgaW50IHVubGVzcyB5b3UgaGF2ZSBsb3RzIG9mIG1lbW9yeQordG8gYnVybi4KKworWW91IGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxpYnJhcnkgYnkgY29tcGlsaW5nIG91dCB2YXJpb3VzIG9wdGlvbmFsCitmdW5jdGlvbnMuICBUbyBkbyB0aGlzLCB1bmRlZmluZSB4eHhfU1VQUE9SVEVEIHN5bWJvbHMgYXMgbmVjZXNzYXJ5LgorCitZb3UgY2FuIGFsc28gc2F2ZSBhIGZldyBLIGJ5IG5vdCBoYXZpbmcgdGV4dCBlcnJvciBtZXNzYWdlcyBpbiB0aGUgbGlicmFyeTsKK3RoZSBzdGFuZGFyZCBlcnJvciBtZXNzYWdlIHRhYmxlIG9jY3VwaWVzIGFib3V0IDVLYi4gIFRoaXMgaXMgcGFydGljdWxhcmx5CityZWFzb25hYmxlIGZvciBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgd2hlcmUgdGhlcmUncyBubyBnb29kIHdheSB0byBkaXNwbGF5IAorYSBtZXNzYWdlIGFueXdheS4gIFRvIGRvIHRoaXMsIHJlbW92ZSB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UgdGFibGUKKyhqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlW10pIGZyb20gamVycm9yLmMsIGFuZCBhbHRlciBmb3JtYXRfbWVzc2FnZSB0byBkbworc29tZXRoaW5nIHJlYXNvbmFibGUgd2l0aG91dCBpdC4gIFlvdSBjb3VsZCBvdXRwdXQgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlCittZXNzYWdlIGNvZGUgbnVtYmVyLCBmb3IgZXhhbXBsZS4gIElmIHlvdSBkbyB0aGlzLCB5b3UgY2FuIGFsc28gc2F2ZSBhIGNvdXBsZQorbW9yZSBLIGJ5IG1vZGlmeWluZyB0aGUgVFJBQ0VNU24oKSBtYWNyb3MgaW4gamVycm9yLmggdG8gZXhwYW5kIHRvIG5vdGhpbmc7Cit5b3UgZG9uJ3QgbmVlZCB0cmFjZSBjYXBhYmlsaXR5IGFueXdheSwgcmlnaHQ/CisKKworUG9ydGFiaWxpdHkgY29uc2lkZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBKUEVHIGxpYnJhcnkgaGFzIGJlZW4gd3JpdHRlbiB0byBiZSBleHRyZW1lbHkgcG9ydGFibGU7IHRoZSBzYW1wbGUKK2FwcGxpY2F0aW9ucyBjanBlZyBhbmQgZGpwZWcgYXJlIHNsaWdodGx5IGxlc3Mgc28uICBUaGlzIHNlY3Rpb24gc3VtbWFyaXplcwordGhlIGRlc2lnbiBnb2FscyBpbiB0aGlzIGFyZWEuICAoSWYgeW91IGVuY291bnRlciBhbnkgYnVncyB0aGF0IGNhdXNlIHRoZQorbGlicmFyeSB0byBiZSBsZXNzIHBvcnRhYmxlIHRoYW4gaXMgY2xhaW1lZCBoZXJlLCB3ZSdkIGFwcHJlY2lhdGUgaGVhcmluZworYWJvdXQgdGhlbS4pCisKK1RoZSBjb2RlIHdvcmtzIGZpbmUgb24gQU5TSSBDLCBDKyssIGFuZCBwcmUtQU5TSSBDIGNvbXBpbGVycywgdXNpbmcgYW55IG9mCit0aGUgcG9wdWxhciBzeXN0ZW0gaW5jbHVkZSBmaWxlIHNldHVwcywgYW5kIHNvbWUgbm90LXNvLXBvcHVsYXIgb25lcyB0b28uCitTZWUgaW5zdGFsbC5kb2MgZm9yIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcy4KKworVGhlIGNvZGUgaXMgbm90IGRlcGVuZGVudCBvbiB0aGUgZXhhY3Qgc2l6ZXMgb2YgdGhlIEMgZGF0YSB0eXBlcy4gIEFzCitkaXN0cmlidXRlZCwgd2UgbWFrZSB0aGUgYXNzdW1wdGlvbnMgdGhhdAorCWNoYXIJaXMgYXQgbGVhc3QgOCBiaXRzIHdpZGUKKwlzaG9ydAlpcyBhdCBsZWFzdCAxNiBiaXRzIHdpZGUKKwlpbnQJaXMgYXQgbGVhc3QgMTYgYml0cyB3aWRlCisJbG9uZwlpcyBhdCBsZWFzdCAzMiBiaXRzIHdpZGUKKyhUaGVzZSBhcmUgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIHRoZSBBTlNJIEMgc3RhbmRhcmQuKSAgV2lkZXIgdHlwZXMgd2lsbAord29yayBmaW5lLCBhbHRob3VnaCBtZW1vcnkgbWF5IGJlIHVzZWQgaW5lZmZpY2llbnRseSBpZiBjaGFyIGlzIG11Y2ggbGFyZ2VyCit0aGFuIDggYml0cyBvciBzaG9ydCBpcyBtdWNoIGJpZ2dlciB0aGFuIDE2IGJpdHMuICBUaGUgY29kZSBzaG91bGQgd29yaworZXF1YWxseSB3ZWxsIHdpdGggMTYtIG9yIDMyLWJpdCBpbnRzLgorCitJbiBhIHN5c3RlbSB3aGVyZSB0aGVzZSBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldCwgeW91IG1heSBiZSBhYmxlIHRvIG1ha2UgdGhlCitjb2RlIHdvcmsgYnkgbW9kaWZ5aW5nIHRoZSB0eXBlZGVmcyBpbiBqbW9yZWNmZy5oLiAgSG93ZXZlciwgeW91IHdpbGwgcHJvYmFibHkKK2hhdmUgZGlmZmljdWx0eSBpZiBpbnQgaXMgbGVzcyB0aGFuIDE2IGJpdHMgd2lkZSwgc2luY2UgcmVmZXJlbmNlcyB0byBwbGFpbgoraW50IGFib3VuZCBpbiB0aGUgY29kZS4KKworY2hhciBjYW4gYmUgZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZCwgYWx0aG91Z2ggdGhlIGNvZGUgcnVucyBmYXN0ZXIgaWYgYW4KK3Vuc2lnbmVkIGNoYXIgdHlwZSBpcyBhdmFpbGFibGUuICBJZiBjaGFyIGlzIHdpZGVyIHRoYW4gOCBiaXRzLCB5b3Ugd2lsbCBuZWVkCit0byByZWRlZmluZSBKT0NURVQgYW5kL29yIHByb3ZpZGUgY3VzdG9tIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXJzIHNvCit0aGF0IEpPQ1RFVCByZXByZXNlbnRzIGV4YWN0bHkgOCBiaXRzIG9mIGRhdGEgb24gZXh0ZXJuYWwgc3RvcmFnZS4KKworVGhlIEpQRUcgbGlicmFyeSBwcm9wZXIgZG9lcyBub3QgYXNzdW1lIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIGNoYXJhY3RlcnMuCitCdXQgc29tZSBvZiB0aGUgaW1hZ2UgZmlsZSBJL08gbW9kdWxlcyBpbiBjanBlZy9kanBlZyBkbyBoYXZlIEFTQ0lJCitkZXBlbmRlbmNpZXMgaW4gZmlsZS1oZWFkZXIgbWFuaXB1bGF0aW9uOyBzbyBkb2VzIGNqcGVnJ3Mgc2VsZWN0X2ZpbGVfdHlwZSgpCityb3V0aW5lLgorCitUaGUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IHJlbHkgaGVhdmlseSBvbiB0aGUgQyBsaWJyYXJ5LiAgSW4gcGFydGljdWxhciwgQworc3RkaW8gaXMgdXNlZCBvbmx5IGJ5IHRoZSBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGVzIGFuZCB0aGUgZXJyb3IKK2hhbmRsZXIsIGFsbCBvZiB3aGljaCBhcmUgYXBwbGljYXRpb24tcmVwbGFjZWFibGUuICAoY2pwZWcvZGpwZWcgYXJlIG1vcmUKK2hlYXZpbHkgZGVwZW5kZW50IG9uIHN0ZGlvLikgIG1hbGxvYyBhbmQgZnJlZSBhcmUgY2FsbGVkIG9ubHkgZnJvbSB0aGUgbWVtb3J5CittYW5hZ2VyICJiYWNrIGVuZCIgbW9kdWxlLCBzbyB5b3UgY2FuIHVzZSBhIGRpZmZlcmVudCBtZW1vcnkgYWxsb2NhdG9yIGJ5CityZXBsYWNpbmcgdGhhdCBvbmUgZmlsZS4KKworVGhlIGNvZGUgZ2VuZXJhbGx5IGFzc3VtZXMgdGhhdCBDIG5hbWVzIG11c3QgYmUgdW5pcXVlIGluIHRoZSBmaXJzdCAxNQorY2hhcmFjdGVycy4gIEhvd2V2ZXIsIGdsb2JhbCBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgbWFkZSB1bmlxdWUgaW4gdGhlCitmaXJzdCA2IGNoYXJhY3RlcnMgYnkgZGVmaW5pbmcgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUy4KKworTW9yZSBpbmZvIGFib3V0IHBvcnRpbmcgdGhlIGNvZGUgbWF5IGJlIGdsZWFuZWQgYnkgcmVhZGluZyBqY29uZmlnLmRvYywKK2ptb3JlY2ZnLmgsIGFuZCBqaW5jbHVkZS5oLgorCisKK05vdGVzIGZvciBNUy1ET1MgaW1wbGVtZW50b3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgSUpHIGNvZGUgaXMgZGVzaWduZWQgdG8gd29yayBlZmZpY2llbnRseSBpbiA4MHg4NiAic21hbGwiIG9yICJtZWRpdW0iCittZW1vcnkgbW9kZWxzIChpLmUuLCBkYXRhIHBvaW50ZXJzIGFyZSAxNiBiaXRzIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkCisiZmFyIjsgY29kZSBwb2ludGVycyBjYW4gYmUgZWl0aGVyIHNpemUpLiAgWW91IG1heSBiZSBhYmxlIHRvIHVzZSBzbWFsbAorbW9kZWwgdG8gY29tcGlsZSBjanBlZyBvciBkanBlZyBieSBpdHNlbGYsIGJ1dCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHVzZQorbWVkaXVtIG1vZGVsIGZvciBhbnkgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3b24ndCBtYWtlIG11Y2ggZGlmZmVyZW5jZSBpbgorcGVyZm9ybWFuY2UuICBZb3UgKndpbGwqIHRha2UgYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGhpdCBpZiB5b3UgdXNlIGEKK2xhcmdlLWRhdGEgbWVtb3J5IG1vZGVsIChwZXJoYXBzIDEwJS0yNSUpLCBhbmQgeW91IHNob3VsZCBhdm9pZCAiaHVnZSIgbW9kZWwKK2lmIGF0IGFsbCBwb3NzaWJsZS4KKworVGhlIEpQRUcgbGlicmFyeSB0eXBpY2FsbHkgbmVlZHMgMktiLTNLYiBvZiBzdGFjayBzcGFjZS4gIEl0IHdpbGwgYWxzbworbWFsbG9jIGFib3V0IDIwSy0zMEsgb2YgbmVhciBoZWFwIHNwYWNlIHdoaWxlIGV4ZWN1dGluZyAoYW5kIGxvdHMgb2YgZmFyCitoZWFwLCBidXQgdGhhdCBkb2Vzbid0IGNvdW50IGluIHRoaXMgY2FsY3VsYXRpb24pLiAgVGhpcyBmaWd1cmUgd2lsbCB2YXJ5CitkZXBlbmRpbmcgb24gc2VsZWN0ZWQgb3BlcmF0aW5nIG1vZGUsIGFuZCB0byBhIGxlc3NlciBleHRlbnQgb24gaW1hZ2Ugc2l6ZS4KK1RoZXJlIGlzIGFsc28gYWJvdXQgNUtiLTZLYiBvZiBjb25zdGFudCBkYXRhIHdoaWNoIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZQorbmVhciBkYXRhIHNlZ21lbnQgKGFib3V0IDRLYiBvZiB0aGlzIGlzIHRoZSBlcnJvciBtZXNzYWdlIHRhYmxlKS4KK1RodXMgeW91IGhhdmUgcGVyaGFwcyAyMEsgYXZhaWxhYmxlIGZvciBvdGhlciBtb2R1bGVzJyBzdGF0aWMgZGF0YSBhbmQgbmVhcgoraGVhcCBzcGFjZSBiZWZvcmUgeW91IG5lZWQgdG8gZ28gdG8gYSBsYXJnZXIgbWVtb3J5IG1vZGVsLiAgVGhlIEMgbGlicmFyeSdzCitzdGF0aWMgZGF0YSB3aWxsIGFjY291bnQgZm9yIHNldmVyYWwgSyBvZiB0aGlzLCBidXQgdGhhdCBzdGlsbCBsZWF2ZXMgYSBnb29kCitkZWFsIGZvciB5b3VyIG5lZWRzLiAgKElmIHlvdSBhcmUgdGlnaHQgb24gc3BhY2UsIHlvdSBjb3VsZCByZWR1Y2UgdGhlIHNpemVzCitvZiB0aGUgSS9PIGJ1ZmZlcnMgYWxsb2NhdGVkIGJ5IGpkYXRhc3JjLmMgYW5kIGpkYXRhZHN0LmMsIHNheSBmcm9tIDRLIHRvCisxSy4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8gbW92ZSB0aGUgZXJyb3IgbWVzc2FnZSB0YWJsZSB0byBmYXIgbWVtb3J5OwordGhpcyBzaG91bGQgYmUgZG9hYmxlIHdpdGggb25seSBsb2NhbGl6ZWQgaGFja2luZyBvbiBqZXJyb3IuYy4pCisKK0Fib3V0IDJLIG9mIHRoZSBuZWFyIGhlYXAgc3BhY2UgaXMgInBlcm1hbmVudCIgbWVtb3J5IHRoYXQgd2lsbCBub3QgYmUKK3JlbGVhc2VkIHVudGlsIHlvdSBkZXN0cm95IHRoZSBKUEVHIG9iamVjdC4gIFRoaXMgaXMgb25seSBhbiBpc3N1ZSBpZiB5b3UKK3NhdmUgYSBKUEVHIG9iamVjdCBiZXR3ZWVuIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb3BlcmF0aW9ucy4KKworRmFyIGRhdGEgc3BhY2UgbWF5IGFsc28gYmUgYSB0aWdodCByZXNvdXJjZSB3aGVuIHlvdSBhcmUgZGVhbGluZyB3aXRoIGxhcmdlCitpbWFnZXMuICBUaGUgbW9zdCBtZW1vcnktaW50ZW5zaXZlIGNhc2UgaXMgZGVjb21wcmVzc2lvbiB3aXRoIHR3by1wYXNzIGNvbG9yCitxdWFudGl6YXRpb24sIG9yIHNpbmdsZS1wYXNzIHF1YW50aXphdGlvbiB0byBhbiBleHRlcm5hbGx5IHN1cHBsaWVkIGNvbG9yCittYXAuICBUaGlzIHJlcXVpcmVzIGEgMTI4S2IgY29sb3IgbG9va3VwIHRhYmxlIHBsdXMgc3RyaXAgYnVmZmVycyBhbW91bnRpbmcKK3RvIGFib3V0IDQwIGJ5dGVzIHBlciBjb2x1bW4gZm9yIHR5cGljYWwgc2FtcGxpbmcgcmF0aW9zIChlZywgYWJvdXQgMjU2MDAKK2J5dGVzIGZvciBhIDY0MC1waXhlbC13aWRlIGltYWdlKS4gIFlvdSBtYXkgbm90IGJlIGFibGUgdG8gcHJvY2VzcyB3aWRlCitpbWFnZXMgaWYgeW91IGhhdmUgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIG9mIHlvdXIgb3duLgorCitPZiBjb3Vyc2UsIGFsbCBvZiB0aGVzZSBjb25jZXJucyB2YW5pc2ggaWYgeW91IHVzZSBhIDMyLWJpdCBmbGF0LW1lbW9yeS1tb2RlbAorY29tcGlsZXIsIHN1Y2ggYXMgREpHUFAgb3IgV2F0Y29tIEMuICBXZSBoaWdobHkgcmVjb21tZW5kIGZsYXQgbW9kZWwgaWYgeW91CitjYW4gdXNlIGl0OyB0aGUgSlBFRyBsaWJyYXJ5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGluIGZsYXQgbW9kZWwuCmRpZmYgLS1naXQgYS9qcGVnL2x0Y29uZmlnIGIvanBlZy9sdGNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzQ3ZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9sdGNvbmZpZwpAQCAtMCwwICsxLDE1MTIgQEAKKyMhIC9iaW4vc2gKKworIyBsdGNvbmZpZyAtIENyZWF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sLgorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBBIGxvdCBvZiB0aGlzIHNjcmlwdCBpcyB0YWtlbiBmcm9tIGF1dG9jb25mLTIuMTAuCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICIke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQorCitlY2hvPWVjaG8KK2lmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbiA6CitlbHNlCisgICMgVGhlIFNvbGFyaXMgYW5kIEFJWCBkZWZhdWx0IGVjaG8gcHJvZ3JhbSB1bnF1b3RlcyBiYWNrc2xhc2hlcy4KKyAgIyBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKKyAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgIyBTbywgd2UgZW11bGF0ZSBlY2hvIHdpdGggcHJpbnRmICclc1xuJworICBlY2hvPSJwcmludGYgJXNcXG4iCisgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbiA6CisgIGVsc2UKKyAgICAjIE9vcHMuICBXZSBoYXZlIG5vIHdvcmtpbmcgcHJpbnRmLiAgVHJ5IHRvIGZpbmQgYSBub3Qtc28tYnVnZ3kgZWNoby4KKyAgICBlY2hvPWVjaG8KKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCisgICAgICBpZiB0ZXN0IC1mICRkaXIvZWNobyAmJiB0ZXN0ICJYYCRkaXIvZWNobyAnXHQnYCIgPSAnWFx0JzsgdGhlbgorICAgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRzYXZlX2lmcyIKKyAgZmkKK2ZpCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYCRcXFxcXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgorcHJvZ25hbWU9YCRlY2hvICJYJDAiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworIyBDb25zdGFudHM6CitQUk9HUkFNPWx0Y29uZmlnCitQQUNLQUdFPWxpYnRvb2wKK1ZFUlNJT049MS4yCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC5jIDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC5jICRMSUJTIDE+JjUnCitybT0icm0gLWYiCisKK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBHbG9iYWwgdmFyaWFibGVzOgorY2FuX2J1aWxkX3NoYXJlZD15ZXMKK2VuYWJsZV9zaGFyZWQ9eWVzCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nLgorZW5hYmxlX3N0YXRpYz15ZXMKK2x0bWFpbj0KK3NpbGVudD0KK3NyY2Rpcj0KK2FjX2NvbmZpZ19ndWVzcz0KK2FjX2NvbmZpZ19zdWI9Citob3N0PQorbm9ub3B0PQordmVyaWZ5X2hvc3Q9eWVzCit3aXRoX2djYz1ubword2l0aF9nbnVfbGQ9bm8KKworb2xkX0FSPSIkQVIiCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCitvbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKK29sZF9MRD0iJExEIgorb2xkX0xOX1M9IiRMTl9TIgorb2xkX05NPSIkTk0iCitvbGRfUkFOTElCPSIkUkFOTElCIgorCisjIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KK2FyZ3M9CitwcmV2PQorZm9yIG9wdGlvbgorZG8KKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLSo9Kikgb3B0YXJnPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIG9wdGFyZz0gOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICBldmFsICIkcHJldj1cJG9wdGlvbiIKKyAgICBwcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLS1oZWxwKSBjYXQgPDxFT00KK1VzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gTFRNQUlOIFtIT1NUXQorCitHZW5lcmF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sIHNjcmlwdC4KKworICAgIC0tZGlzYWJsZS1zaGFyZWQgICAgICAgZG8gbm90IGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKKyAgICAtLWRpc2FibGUtc3RhdGljICAgICAgIGRvIG5vdCBidWlsZCBzdGF0aWMgbGlicmFyaWVzCisgICAgLS1oZWxwICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAgIC0tbm8tdmVyaWZ5ICAgICAgICAgICAgZG8gbm90IHZlcmlmeSB0aGF0IEhPU1QgaXMgYSB2YWxpZCBob3N0IHR5cGUKKyAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKKyAgICAtLXNpbGVudCAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgICAgLS1zcmNkaXI9RElSICAgICAgICAgICBmaW5kIFxgY29uZmlnLmd1ZXNzJyBpbiBESVIKKyAgICAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgICAgLS13aXRoLWdjYyAgICAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgR05VIEMgY29tcGlsZXIgd2lsbCBiZSB1c2VkCisgICAgLS13aXRoLWdudS1sZCAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgQyBjb21waWxlciB1c2VzIHRoZSBHTlUgbGlua2VyCisKK0xUTUFJTiBpcyB0aGUgXGBsdG1haW4uc2gnIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHByb3ZpZGVzIGJhc2ljIGxpYnRvb2wKK2Z1bmN0aW9uYWxpdHkuCisKK0hPU1QgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHN5c3RlbSBuYW1lIFtkZWZhdWx0PWd1ZXNzZWRdLgorRU9NCisgIGV4aXQgMAorICA7OworCisgIC0tZGlzYWJsZS1zaGFyZWQpIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKworICAtLWRpc2FibGUtc3RhdGljKSBlbmFibGVfc3RhdGljPW5vIDs7CisKKyAgLS1xdWlldCB8IC0tc2lsZW50KSBzaWxlbnQ9eWVzIDs7CisKKyAgLS1zcmNkaXIpIHByZXY9c3JjZGlyIDs7CisgIC0tc3JjZGlyPSopIHNyY2Rpcj0iJG9wdGFyZyIgOzsKKworICAtLW5vLXZlcmlmeSkgdmVyaWZ5X2hvc3Q9bm8gOzsKKworICAtLXZlcnNpb24pIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OIjsgZXhpdCAwIDs7CisKKyAgLS13aXRoLWdjYykgd2l0aF9nY2M9eWVzIDs7CisgIC0td2l0aC1nbnUtbGQpIHdpdGhfZ251X2xkPXllcyA7OworCisgIC0qKQorICAgIGVjaG8gIiRwcm9nbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHRpb24nIiAxPiYyCisgICAgZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KKyAgICAgIGx0bWFpbj0iJG9wdGlvbiIKKyAgICBlbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgorIyBUaGlzIGdlbmVyYXRlcyBhbiB1bm5lY2Vzc2FyeSB3YXJuaW5nIGZvciBzcGFyYy1zdW4tc29sYXJpczQuMS4zX1UxCisjICAgICAgaWYgdGVzdCAtbiAiYGVjaG8gJG9wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyMgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZyBcYCRvcHRpb24nIGlzIG5vdCBhIHZhbGlkIGhvc3QgdHlwZSIgMT4mMgorIyAgICAgIGZpCisgICAgICBob3N0PSIkb3B0aW9uIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRwcm9nbmFtZTogdG9vIG1hbnkgYXJndW1lbnRzIiAxPiYyCisgICAgICBlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgorICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBMVE1BSU4gZmlsZSIgMT4mMgorICBlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKK2ZpCisKK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuIDoKK2Vsc2UKKyAgZWNobyAiJHByb2duYW1lOiBcYCRsdG1haW4nIGRvZXMgbm90IGV4aXN0IiAxPiYyCisgIGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBRdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorbHRjb25maWdfYXJncz0KK2ZvciBhcmcKK2RvCisgIGNhc2UgIiRhcmciIGluCisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICckYXJnJyIgOzsKKyAgKikgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJGFyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIEEgcmVsZXZhbnQgc3Vic2V0IG9mIEFDX0lOSVQuCisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4+Li9jb25maWcubG9nCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCisjIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAorIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKKworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgIyBBc3N1bWUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgb25lIGFzIHRoZSBwYXRoIHRvIGx0bWFpbi5zaC4KKyAgc3JjZGlyPWAkZWNobyAiJGx0bWFpbiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICB0ZXN0ICIkc3JjZGlyIiA9ICIkbHRtYWluIiAmJiBzcmNkaXI9LgorZmkKKwordHJhcCAiJHJtIGNvbmZ0ZXN0KjsgZXhpdCAxIiAxIDIgMTUKK2lmIHRlc3QgIiR2ZXJpZnlfaG9zdCIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBmb3IgY29uZmlnLmd1ZXNzIGFuZCBjb25maWcuc3ViLgorICBhY19hdXhfZGlyPQorICBmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbworICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9jb25maWcuZ3Vlc3M7IHRoZW4KKyAgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGZpbmQgY29uZmlnLmd1ZXNzIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyCisgICAgZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworICBhY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKKworICAjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCisgIGlmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMgorICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CisKKyAgaG9zdF9hbGlhcz0kaG9zdAorICBjYXNlICIkaG9zdF9hbGlhcyIgaW4KKyAgIiIpCisgICAgaWYgaG9zdF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjIKKyAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaSA7OworICBlc2FjCisgIGhvc3Q9YCRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAorICBlY2hvICIkYWNfdCRob3N0IiAxPiY2CisKKyAgIyBNYWtlIHN1cmUgdGhlIGhvc3QgdmVyaWZpZWQuCisgIHRlc3QgLXogIiRob3N0IiAmJiBleGl0IDEKKworZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KKyAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgaG9zdCB0eXBlIGlmIHlvdSB1c2UgXGAtLW5vLXZlcmlmeSciIDE+JjIKKyAgZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCitlbHNlCisgIGhvc3RfYWxpYXM9JGhvc3QKK2ZpCisKKyMgVHJhbnNmb3JtIGxpbnV4KiB0byAqLSotbGludXgtZ251KiwgdG8gc3VwcG9ydCBvbGQgY29uZmlndXJlIHNjcmlwdHMuCitjYXNlICIkaG9zdF9vcyIgaW4KK2xpbnV4LWdudSopIDs7CitsaW51eCopIGhvc3Q9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLiotLiotbGludXhcKVwoLipcKSQvXDEtZ251XDIvJ2AKK2VzYWMKKworaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiBjcnUgJG9sZGxpYiRvbGRvYmpzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworIyBTZXQgYSBzYW5lIGRlZmF1bHQgZm9yIGBBUicuCit0ZXN0IC16ICIkQVIiICYmIEFSPWFyCisKKyMgSWYgUkFOTElCIGlzIG5vdCBzZXQsIHRoZW4gcnVuIHRoZSB0ZXN0LgoraWYgdGVzdCAiJHtSQU5MSUIrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgcmVzdWx0PW5vCisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiAkYWNfYyIgMT4mNgorICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgaWYgdGVzdCAtZiAkZGlyL3JhbmxpYjsgdGhlbgorICAgICAgUkFOTElCPSJyYW5saWIiCisgICAgICByZXN1bHQ9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRzYXZlX2lmcyIKKworICBlY2hvICIkYWNfdCRyZXN1bHQiIDE+JjYKK2ZpCisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzO1wkUkFOTElCIFwkb2xkbGliIgorICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWI7JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorZmkKKworIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHVzaW5nIEdDQy4KK2lmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzIHx8IHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBJZiBDQyBpcyBub3Qgc2V0LCB0aGVuIHRyeSB0byBmaW5kIEdDQyBvciBhIHVzYWJsZSBDQy4KKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnY2MuLi4gJGFjX2MiIDE+JjYKKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCisJQ0M9ImdjYyIKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgICBmaQorICBmaQorCisgICMgTm90ICJnY2MiLCBzbyB0cnkgImNjIiwgcmVqZWN0aW5nICIvdXNyL3VjYi9jYyIuCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2MuLi4gJGFjX2MiIDE+JjYKKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGNjX3JlamVjdGVkPW5vCisgICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KKyAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgICBpZiB0ZXN0IC1mICRkaXIvY2M7IHRoZW4KKwlpZiB0ZXN0ICIkZGlyL2NjIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKwkgIGNjX3JlamVjdGVkPXllcworCSAgY29udGludWUKKwlmaQorCUNDPSJjYyIKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgaWYgdGVzdCAkY2NfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgICAgIHNldCBkdW1teSAkQ0MKKyAgICAgIHNoaWZ0CisgICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisJIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisJIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisJIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKwlzaGlmdAorCXNldCBkdW1teSAiJGRpci9jYyIgIiRAIgorCXNoaWZ0CisJQ0M9IiRAIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgICAgZmkKKworICAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorICBmaQorCisgICMgTm93IHNlZSBpZiB0aGUgY29tcGlsZXIgaXMgcmVhbGx5IEdDQy4KKyAgd2l0aF9nY2M9bm8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gJGFjX2MiIDE+JjYKKyAgZWNobyAiJHByb2duYW1lOjQyNDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorCisgICRybSBjb25mdGVzdC5jCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgorICBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NDMyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICB3aXRoX2djYz15ZXMKKyAgZmkKKyAgJHJtIGNvbmZ0ZXN0LmMKKyAgZWNobyAiJGFjX3Qkd2l0aF9nY2MiIDE+JjYKK2ZpCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitzZXQgZHVtbXkgJENDCitjb21waWxlcj0iJDIiCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRhY19jIiAxPiY2CitwaWNfZmxhZz0KK3NwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0KK3dsPQorbGlua19zdGF0aWNfZmxhZz0KK25vX2J1aWx0aW5fZmxhZz0KKworaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgorICB3bD0nLVdsLCcKKyAgbGlua19zdGF0aWNfZmxhZz0nLXN0YXRpYycKKyAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJworCisgIGNhc2UgIiRob3N0X29zIiBpbgorICBhaXgzKiB8IGFpeDQqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KikKKyAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICA7OworICBvczIqKQorICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgorICAgIDs7CisgIGFtaWdhb3MqKQorICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgIHBpY19mbGFnPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgOzsKKyAgKikKKyAgICBwaWNfZmxhZz0nLWZQSUMnCisgICAgOzsKKyAgZXNhYworZWxzZQorICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgYWl4MyogfCBhaXg0KikKKyAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgbGlua19zdGF0aWNfZmxhZz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgIDs7CisKKyAgaHB1eDkqIHwgaHB1eDEwKikKKyAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGxpbmtfc3RhdGljX2ZsYWcgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPworICAgIHdsPSctV2wsJworICAgIGxpbmtfc3RhdGljX2ZsYWc9IiR7d2x9LWEgJHt3bH1hcmNoaXZlIgorICAgIHBpY19mbGFnPScrWicKKyAgICA7OworCisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICB3bD0nLVdsLCcKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKKyAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgOzsKKworICBvczIqKQorICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgorICAgIDs7CisKKyAgb3NmMyogfCBvc2Y0KikKKyAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICB3bD0nLVdsLCcKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKKyAgICA7OworCisgIHNjbzMuMnY1KikKKyAgICBwaWNfZmxhZz0nLUtwaWMnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLWRuJworICAgIHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0nLWJlbGYnCisgICAgOzsKKworICBzb2xhcmlzMiopCisgICAgcGljX2ZsYWc9Jy1LUElDJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJworICAgIHdsPSctV2wsJworICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICBwaWNfZmxhZz0nLVBJQycKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKKyAgICB3bD0nLVFvcHRpb24gbGQgJworICAgIDs7CisKKyAgc3lzdjQuMnV3MiopCisgICAgcGljX2ZsYWc9Jy1LUElDJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJworICAgIHdsPSctV2wsJworICAgIDs7CisKKyAgdXRzNCopCisgICAgcGljX2ZsYWc9Jy1waWMnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCisgICAgOzsKKworICAqKQorICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICA7OworICBlc2FjCitmaQorCitpZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCisgIGVjaG8gIiRhY190JHBpY19mbGFnIiAxPiY2CisKKyAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHBpY19mbGFnIGFjdHVhbGx5IHdvcmtzLgorICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2CisgICRybSBjb25mdGVzdCoKKyAgZWNobyA+IGNvbmZ0ZXN0LmMKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAkcGljX2ZsYWcgLURQSUMiCisgIGVjaG8gIiRwcm9nbmFtZTo1NDc6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MiID4mNQorICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjU0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCisgICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgorICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorCisgICAgIyBPbiBIUC1VWCwgYm90aCBDQyBhbmQgR0NDIG9ubHkgd2FybiB0aGF0IFBJQyBpcyBzdXBwb3J0ZWQuLi4gdGhlbiB0aGV5CisgICAgIyBjcmVhdGUgbm9uLVBJQyBvYmplY3RzLiAgU28sIGlmIHRoZXJlIHdlcmUgYW55IHdhcm5pbmdzLCB3ZSBhc3N1bWUgdGhhdAorICAgICMgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIHBpY19mbGFnPQorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190InllcyAxPiY2CisgICAgICBwaWNfZmxhZz0iICRwaWNfZmxhZyIKKyAgICBmaQorICBlbHNlCisgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgcGljX2ZsYWc9CisgICAgZWNobyAiJGFjX3Qibm8gMT4mNgorICBmaQorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgJHJtIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICIkYWNfdCJub25lIDE+JjYKK2ZpCisKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGF0aW9uIGZsYWdzLgoraWYgdGVzdCAtbiAiJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncyI7IHRoZW4KKyAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nOiBcYCRDQycgcmVxdWlyZXMgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisgIGlmIGVjaG8gIiRvbGRfQ0MgJG9sZF9DRkxBR1MgIiB8IGVncmVwIC1lICJbIAldJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFnc1sgCV0iID4vZGV2L251bGw7IHRoZW4gOgorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBhZGQgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byB0aGUgQ0Mgb3IgQ0ZMQUdTIGVudiB2YXJpYWJsZSBhbmQgcmVjb25maWd1cmUiIDE+JjIKKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgIGZpCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKKyRybSBjb25mdGVzdCoKK2VjaG8gJ21haW4oKXtyZXR1cm4oMCk7fScgPiBjb25mdGVzdC5jCitzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCitlY2hvICIkcHJvZ25hbWU6NTkxOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MiID4mNQoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBlY2hvICIkYWNfdCRsaW5rX3N0YXRpY19mbGFnIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190Im5vbmUgMT4mNgorICBsaW5rX3N0YXRpY19mbGFnPQorZmkKK0xERkxBR1M9IiRzYXZlX0xERkxBR1MiCiskcm0gY29uZnRlc3QqCisKK2lmIHRlc3QgLXogIiRMTl9TIjsgdGhlbgorICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIGxuIC1zLCBvciB3ZSBuZWVkIGhhcmQgbGlua3MuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJGFjX2MiIDE+JjYKKyAgJHJtIGNvbmZ0ZXN0ZGF0YQorICBpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICRybSBjb25mdGVzdGRhdGEKKyAgICBMTl9TPSJsbiAtcyIKKyAgZWxzZQorICAgIExOX1M9bG4KKyAgZmkKKyAgaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgorICAgIGVjaG8gIiRhY190InllcyAxPiY2CisgIGVsc2UKKyAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgIGZpCitmaQorCisjIE1ha2Ugc3VyZSBMRCBpcyBhbiBhYnNvbHV0ZSBwYXRoLgoraWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBhY19wcm9nPWxkCisgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KKyAgICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MuLi4gJGFjX2MiIDE+JjYKKyAgICBlY2hvICIkcHJvZ25hbWU6NjI0OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKKyAgICBjYXNlICIkYWNfcHJvZyIgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICAvKiB8IFtBLVphLXpdOlxcKikKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgICAiIikKKyAgICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmUgbm90IHVzaW5nIEdDQy4KKyAgICAgIGFjX3Byb2c9bGQKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICAgIDs7CisgICAgZXNhYworICBlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICRhY19jIiAxPiY2CisgICAgZWNobyAiJHByb2duYW1lOjY0MjogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CisgIGVsc2UKKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2CisgICAgZWNobyAiJHByb2duYW1lOjY0NTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorICBmaQorCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KKwlMRD0iJGFjX2Rpci8kYWNfcHJvZyIKKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisJIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorCSMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorCWlmICIkTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisJICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJZWxzZQorCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwlmaQorICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICAgIGVjaG8gIiRhY190JExEIiAxPiY2CisgIGVsc2UKKyAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgIGZpCisKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCitmaQorCisjIENoZWNrIHRvIHNlZSBpZiBpdCByZWFsbHkgaXMgb3IgaXMgbm90IEdOVSBsZC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRhY19jIiAxPiY2CisjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCitlY2hvICIkYWNfdCR3aXRoX2dudV9sZCIgMT4mNgorCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgorCithbGxvd191bmRlZmluZWRfZmxhZz0KK25vX3VuZGVmaW5lZF9mbGFnPQorYXJjaGl2ZV9jbWRzPQorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQoraGFyZGNvZGVfZGlyZWN0PW5vCitoYXJkY29kZV9taW51c19MPW5vCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCitydW5wYXRoX3Zhcj0KKworY2FzZSAiJGhvc3Rfb3MiIGluCithbWlnYW9zKiB8IHN1bm9zNCopCisgICMgT24gdGhlc2Ugb3BlcmF0aW5nIHN5c3RlbXMsIHdlIHNob3VsZCB0cmVhdCBHTlUgbGQgbGlrZSB0aGUgc3lzdGVtIGxkLgorICBnbnVfbGRfYWN0c19uYXRpdmU9eWVzCisgIDs7CisqKQorICBnbnVfbGRfYWN0c19uYXRpdmU9bm8KKyAgOzsKK2VzYWMKKworbGRfc2hsaWJzPXllcworaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllcyAmJiB0ZXN0ICIkZ251X2xkX2FjdHNfbmF0aXZlIiAhPSB5ZXM7IHRoZW4KKworICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYiRsaWJvYmpzJworICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgbGRfc2hsaWJzPXllcworICBlbHNlCisgICAgbGRfc2hsaWJzPW5vCisgIGZpCisKKyAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICBmaQorZWxzZQorICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgIGNhc2UgIiRob3N0X29zIiBpbgorICBhaXgzKikKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgIGFyY2hpdmVfY21kcz0nJE5NJGxpYm9ianMgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICdcJydzLy4qIC8vJ1wnJyA+ICRsaWIuZXhwOyRMRCAtbyAkb2JqZGlyLyRzb25hbWUkbGlib2JqcyAtYkU6JGxpYi5leHAgLVQ1MTIgLUg1MTIgLWJNOlNSRTskQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJworICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKyAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorICAgICAgIyBicm9rZW4gY29sbGVjdDIuCisgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICBmaQorICAgIDs7CisKKyAgYWl4NCopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhcmNoaXZlX2NtZHM9JyROTSRsaWJvYmpzIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgPiAkbGliLmV4cDskQ0MgLW8gJG9iamRpci8kc29uYW1lJGxpYm9ianMgJHt3bH0tYkU6JGxpYi5leHAgJHt3bH0tYk06U1JFICR7d2x9LWJub2VudHJ5OyRBUiBjcnUgJGxpYiAkb2JqZGlyLyRzb25hbWUnCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskQVIgY3J1ICRsaWIkbGlib2JqczskUkFOTElCICRsaWI7KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICA7OworCisgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICMgZXh0cmEgc3BhY2UpLgorICBmcmVlYnNkMi4yKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliJGxpYm9ianMgL3Vzci9saWIvYysrcnQwLm8nCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgZnJlZWJzZDIqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAjIEZyZWVCU0QgMywgYXQgbGFzdCwgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICBmcmVlYnNkMyopCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliJGxpYm9ianMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIGhwdXg5KikKKyAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyLyRzb25hbWU7JExEIC1iICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb2JqZGlyLyRzb25hbWUkbGlib2JqczttdiAkb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgOzsKKworICBocHV4MTAqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgOzsKKworICBpcml4NSogfCBpcml4NiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliIC1zb25hbWUgJHNvbmFtZSAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICA7OworCisgIG5ldGJzZCopCisgICAgIyBUZXN0ZWQgd2l0aCBOZXRCU0QgMS4yIGxkCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgb3BlbmJzZCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgb3MyKikKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvIERBVEEgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyBFWFBPUlRTID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmO2VteGV4cCRsaWJvYmpzID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliJGxpYm9ianMgJG9iamRpci8kbGlibmFtZS5kZWYnCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvYmpkaXIvJGxpYm5hbWUuYSAkb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICA7OworCisgIG9zZjMqIHwgb3NmNCopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1vICRsaWIgLXNvbmFtZSAkc29uYW1lIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nJGxpYm9ianMkZGVwbGlicycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgOzsKKworICBzY28zLjJ2NSopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICA7OworCisgIHNvbGFyaXMyKikKKyAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCisgICAgIyBTb2xhcmlzIDIgYmVmb3JlIDIuNSBoYXJkY29kZXMgLUwgcGF0aHMuCisgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgc29sYXJpczIuWzAtNF0qKQorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIkbGlib2JqcycKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliJGxpYm9ianMnCisgICAgZmkKKworICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tZXhwb3J0LWR5bmFtaWMnCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgdXRzNCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliJGxpYm9ianMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAqKQorICAgIGxkX3NobGlicz1ubworICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICA7OworICBlc2FjCitmaQorZWNobyAiJGFjX3QkbGRfc2hsaWJzIiAxPiY2CisKK2lmIHRlc3QgLXogIiROTSI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRhY19jIiAxPiY2CisgIGNhc2UgIiROTSIgaW4KKyAgLyogfCBbQS1aYS16XTpcXCopIDs7ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICAqKQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgICAgZm9yIGFjX2RpciBpbiAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gJFBBVEggL2JpbjsgZG8KKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KKyAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisgICAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgTk09IiRhY19kaXIvbm0gLUIiCisgICAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgTk09IiRhY19kaXIvbm0gLXAiCisJZWxzZQorICAgICAgICAgIE5NPSIkYWNfZGlyL25tIgorCWZpCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkTk0iICYmIE5NPW5tCisgICAgOzsKKyAgZXNhYworICBlY2hvICIkYWNfdCROTSIgMT4mNgorZmkKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK2VjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dC4uLiAkYWNfYyIgMT4mNgorCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tCQ0RFR1JTVFVdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK3N5bXhmcm09J1wxIFwxJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVFVdJworICA7OworaXJpeCopCisgICMgQ2Fubm90IHVzZSB1bmRlZmluZWQgc3ltYm9scyBvbiBJUklYIGJlY2F1c2UgaW5saW5lZCBmdW5jdGlvbnMgbWVzcyB1cyB1cC4KKyAgc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK3NvbGFyaXMyKikKKyAgc3ltY29kZT0nW0JEVFVdJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2lmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorICBzeW1jb2RlPSdbQUJDREdJU1RVV10nCitmaQorCisjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCitnbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogJHN5bWNvZGUgJHN5bXBhdCQvJHN5bXhmcm0vcCciCisKKyMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorcGlwZV93b3Jrcz1ubworJHJtIGNvbmZ0ZXN0KgorY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK21haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK0VPRgorCitlY2hvICIkcHJvZ25hbWU6OTcxOiBjaGVja2luZyBpZiBnbG9iYWxfc3ltYm9sX3BpcGUgd29ya3MiID4mNQoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo5NzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCisgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICBubGlzdD1jb25mdGVzdC5ubQorICBpZiB7IGVjaG8gIiRwcm9nbmFtZTo5NzU6IGV2YWwgXCIkTk0gY29uZnRlc3QubyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3RcIiIgPiY1OyBldmFsICIkTk0gY29uZnRlc3QubyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3QgMj4mNSI7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorCisgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorICAgICAgbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICB3Y291dD1gd2MgIiRubGlzdCIgMj4vZGV2L251bGxgCisgICAgICBjb3VudD1gJGVjaG8gIlgkd2NvdXQiIHwgJFhzZWQgLWUgJ3MvXlsgCV0qXChbMC05XVswLTldKlwpLiokL1wxLydgCisgICAgICAodGVzdCAiJGNvdW50IiAtZ2UgMCkgMj4vZGV2L251bGwgfHwgY291bnQ9LTEKKyAgICBlbHNlCisgICAgICBybSAtZiAiJG5saXN0IlQKKyAgICAgIGNvdW50PS0xCisgICAgZmkKKworICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJY2F0IDw8RU9GID4gY29uZnRlc3QuYworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKyAgICAgICAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorICAgICAgICBzZWQgJ3MvXi4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7LycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCisKKwljYXQgPDxFT0YgPj4gY29uZnRlc3QuYworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgX19wdHJfdCB2b2lkICoKKyNlbHNlCisjIGRlZmluZSBfX3B0cl90IGNoYXIgKgorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBkbGRfcHJlbG9hZGVkX3N5bWJvbHMsIC0xIGlmIHVuc29ydGVkLiAqLworaW50IGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50ID0gJGNvdW50OworCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK3N0cnVjdCB7CisgIGNoYXIgKm5hbWU7CisgIF9fcHRyX3QgYWRkcmVzczsKK30KK2RsZF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorICAgICAgICBzZWQgJ3MvXlwoLipcKSBcKC4qXCkkLyAgeyJcMSIsIChfX3B0cl90KSBcJlwyfSwvJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMKKyAgICAgICAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCisgIHswLCAoX19wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKyAgICAgICAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKyAgICAgICAgbXYgY29uZnRlc3QubyBjb25mdGVzdG0ubworCXNhdmVfTElCUz0iJExJQlMiCisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9J2NvbmZ0ZXN0bS5vJworCUNGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCisgICAgICAgIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTAzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgICAgICAgICAgcGlwZV93b3Jrcz15ZXMKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgICAgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1CisgICAgICAgIGZpCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICBlbHNlCisgICAgICAgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICJjYW5ub3QgcnVuICRnbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICBmaQorZWxzZQorICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuYyA+JjUKK2ZpCiskcm0gY29uZnRlc3QqCisKKyMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KK2VjaG8gIiRhY190JHBpcGVfd29ya3MiIDE+JjYKK3Rlc3QgIiRwaXBlX3dvcmtzIiA9IHllcyB8fCBnbG9iYWxfc3ltYm9sX3BpcGU9CisKKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkYWNfYyIgMT4mNgoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IG5vOyB0aGVuCisKKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYgXAorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IHllczsgdGhlbgorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZy4KKyAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCitlbHNlCisgICMgV2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKK2ZpCitlY2hvICIkYWNfdCRoYXJkY29kZV9hY3Rpb24iIDE+JjYKK3Rlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gdW5zdXBwb3J0ZWQgJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisKK3JlbG9hZF9mbGFnPQorcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkYWNfYyIgMT4mNgorIyBQT1JUTUUgU29tZSBsaW5rZXIgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCityZWxvYWRfZmxhZz0nLXInCitlY2hvICIkYWNfdCRyZWxvYWRfZmxhZyIKK3Rlc3QgLW4gIiRyZWxvYWRfZmxhZyIgJiYgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciCisKKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkYWNfYyIgMT4mNgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgzKiB8IGFpeDQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2ZyZWVic2QyKiB8IGZyZWVic2QzKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zbycKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitocHV4OSogfCBocHV4MTAqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wuJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbC4kbWFqb3IgJGxpYm5hbWUuc2wnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbC4kbWFqb3InCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eC1nbnVvbGRsZCogfCBsaW51eC1nbnVhb3V0KiB8IGxpbnV4LWdudWNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eC1nbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorCisgIGlmIHRlc3QgLWYgL2xpYi9sZC5zby4xOyB0aGVuCisgICAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgZWxzZQorICAgICMgT25seSB0aGUgR05VIGxkLnNvIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMgb24gTWtMaW51eC4KKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgcG93ZXJwYyopIGR5bmFtaWNfbGlua2VyPW5vIDs7CisgICAgKikgZHluYW1pY19saW5rZXI9J0xpbnV4IGxkLnNvJyA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKKworbmV0YnNkKiB8IG9wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK3NjbzMuMnY1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzb2xhcmlzMiopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK3N5c3Y0LjJ1dzIqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworZWNobyAiJGFjX3QkZHluYW1pY19saW5rZXIiCit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisjIFJlcG9ydCB0aGUgZmluYWwgY29uc2VxdWVuY2VzLgorZWNobyAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kcztcJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7Citlc2FjCisKK2VjaG8gIiRhY190JGVuYWJsZV9zaGFyZWQiIDE+JjYKKworIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKworZWNobyAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRlbmFibGVfc3RhdGljIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJGFjX2MiIDE+JjYKK3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBvYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2VjaG8gIiRhY190JG9iamRpciIgMT4mNgorCisjIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsLCBiZWNhdXNlIGl0IGlzCisjIHVzZWQgbGF0ZXIuCitsdGVjaG89IiRlY2hvIgorCisjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzLgorZm9yIHZhciBpbiBsdGVjaG8gb2xkX0NDIG9sZF9DRkxBR1Mgb2xkX0NQUEZMQUdTIG9sZF9MRCBvbGRfTk0gb2xkX1JBTkxJQiBcCisgIG9sZF9MTl9TIEFSIENDIExEIExOX1MgTk0gcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgcGljX2ZsYWcgXAorICBsaW5rX3N0YXRpY19mbGFnIG5vX2J1aWx0aW5fZmxhZyBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAorICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFJBTkxJQiBcCisgIG9sZF9hcmNoaXZlX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBvbGRfcG9zdGluc3RhbGxfY21kcyBcCisgIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgYXJjaGl2ZV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgbm9fdW5kZWZpbmVkX2ZsYWcgXAorICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgXAorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I7IGRvCisKKyAgY2FzZSAiJHZhciIgaW4KKyAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKKyAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgXAorICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgZmluaXNoX2NtZHMpCisgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgIGV2YWwgIiR2YXI9XGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgIgorICAgIDs7CisgICopCisgICAgZXZhbCAiJHZhcj1cYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYCIKKyAgICA7OworICBlc2FjCitkb25lCisKK29maWxlPWxpYnRvb2wKK3RyYXAgIiRybSAkb2ZpbGU7IGV4aXQgMSIgMSAyIDE1CitlY2hvIGNyZWF0aW5nICRvZmlsZQorJHJtICRvZmlsZQorY2F0IDw8RU9GID4gJG9maWxlCisjISAvYmluL3NoCisKKyMgbGlidG9vbCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdGNvbmZpZyBvciBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgcHJvZ3JhbSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgQ0M9IiRvbGRfQ0MiIENGTEFHUz0iJG9sZF9DRkxBR1MiIENQUEZMQUdTPSIkb2xkX0NQUEZMQUdTIiBcXAorIyBMRD0iJG9sZF9MRCIgTk09IiRvbGRfTk0iIFJBTkxJQj0iJG9sZF9SQU5MSUIiIExOX1M9IiRvbGRfTE5fUyIgXFwKKyMgICAkMCRsdGNvbmZpZ19hcmdzCisjCisjIENvbXBpbGVyIGFuZCBvdGhlciB0ZXN0IG91dHB1dCBwcm9kdWNlZCBieSAkcHJvZ25hbWUsIHVzZWZ1bCBmb3IKKyMgZGVidWdnaW5nICRwcm9nbmFtZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KK1hzZWQ9InNlZCAtZSBzL15YLy8iCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICJcJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSIkbHRlY2hvIgorCisjIFRoZSB2ZXJzaW9uIG9mICRwcm9nbmFtZSB0aGF0IGdlbmVyYXRlZCB0aGlzIHNjcmlwdC4KK0xUQ09ORklHX1ZFUlNJT049IiRWRVJTSU9OIgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIGxpYnRvb2wgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgb2xkLXN0eWxlIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0iJGhvc3RfYWxpYXMiCitob3N0PSIkaG9zdCIKKworIyBUaGUgYXJjaGl2ZXIuCitBUj0iJEFSIgorCisjIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCitDQz0iJENDIgorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0iJExEIgorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSIkTE5fUyIKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0iJE5NIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0iJG9iamRpciIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9IiRyZWxvYWRfZmxhZyIKK3JlbG9hZF9jbWRzPSIkcmVsb2FkX2NtZHMiCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSIkd2wiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9IiRwaWNfZmxhZyIKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0iJGxpbmtfc3RhdGljX2ZsYWciCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0iJG5vX2J1aWx0aW5fZmxhZyIKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIgorCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0iJGxpYm5hbWVfc3BlYyIKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSIkbGlicmFyeV9uYW1lc19zcGVjIgorCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9IiRzb25hbWVfc3BlYyIKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSIkUkFOTElCIgorb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHMiCitvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0iJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9IiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIgorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kcyIKK3Bvc3RpbnN0YWxsX2NtZHM9IiRwb3N0aW5zdGFsbF9jbWRzIgorcG9zdHVuaW5zdGFsbF9jbWRzPSIkcG9zdHVuaW5zdGFsbF9jbWRzIgorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRhbGxvd191bmRlZmluZWRfZmxhZyIKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0iJGZpbmlzaF9jbWRzIgorCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0iJGZpbmlzaF9ldmFsIgorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9IiRnbG9iYWxfc3ltYm9sX3BpcGUiCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCisKK0VPRgorCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeDMqKQorICBjYXQgPDxcRU9GID4+ICRvZmlsZQorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCisKK0VPRgorICA7OworZXNhYworCisjIEFwcGVuZCB0aGUgbHRtYWluLnNoIHNjcmlwdC4KK2NhdCAiJGx0bWFpbiIgPj4gJG9maWxlIHx8IChybSAtZiAkb2ZpbGU7IGV4aXQgMSkKKworY2htb2QgK3ggJG9maWxlCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvanBlZy9sdG1haW4uc2ggYi9qcGVnL2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM1MGIzCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9sdG1haW4uc2gKQEAgLTAsMCArMSwyNDUzIEBACisjIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBsdGNvbmZpZy4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgorcHJvZ25hbWU9YCRlY2hvICIkMCIgfCBzZWQgJ3MlXi4qLyUlJ2AKK21vZGVuYW1lPSIkcHJvZ25hbWUiCisKKyMgQ29uc3RhbnRzLgorUFJPR1JBTT1sdG1haW4uc2gKK1BBQ0tBR0U9bGlidG9vbAorVkVSU0lPTj0xLjIKKworZGVmYXVsdF9tb2RlPQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWtkaXI9Im1rZGlyIgorbXY9Im12IC1mIgorcm09InJtIC1mIgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIHMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCisjIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAorIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKKworaWYgdGVzdCAiJExUQ09ORklHX1ZFUlNJT04iICE9ICIkVkVSU0lPTiI7IHRoZW4KKyAgZWNobyAiJG1vZGVuYW1lOiBsdGNvbmZpZyB2ZXJzaW9uIFxgJExUQ09ORklHX1ZFUlNJT04nIGRvZXMgbm90IG1hdGNoICRQUk9HUkFNIHZlcnNpb24gXGAkVkVSU0lPTiciIDE+JjIKKyAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgZXhpdCAxCitmaQorCitpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCisgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBHbG9iYWwgdmFyaWFibGVzLgorbW9kZT0kZGVmYXVsdF9tb2RlCitub25vcHQ9CitwcmV2PQorcHJldm9wdD0KK3J1bj0KK3Nob3c9IiRlY2hvIgorc2hvd19oZWxwPQorZXhlY3V0ZV9kbGZpbGVzPQorCisjIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgord2hpbGUgdGVzdCAkIyAtZ3QgMAorZG8KKyAgYXJnPSIkMSIKKyAgc2hpZnQKKworICBjYXNlICIkYXJnIiBpbgorICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIG9wdGFyZz0gOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICBjYXNlICIkcHJldiIgaW4KKyAgICBleGVjdXRlX2RsZmlsZXMpCisgICAgICBldmFsICIkcHJldj1cIlwkJHByZXYgXCRhcmdcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBwcmV2PQorICAgIHByZXZvcHQ9CisgICAgY29udGludWUKKyAgZmkKKworICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/CisgIGNhc2UgIiRhcmciIGluCisgIC0taGVscCkKKyAgICBzaG93X2hlbHA9eWVzCisgICAgOzsKKworICAtLXZlcnNpb24pCisgICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04iCisgICAgZXhpdCAwCisgICAgOzsKKworICAtLWRyeS1ydW4gfCAtbikKKyAgICBydW49OgorICAgIDs7CisKKyAgLS1mZWF0dXJlcykKKyAgICBlY2hvICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGZpCisgICAgZXhpdCAwCisgICAgOzsKKworICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OworCisgIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKKyAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7CisKKyAgLS1xdWlldCB8IC0tc2lsZW50KQorICAgIHNob3c9OgorICAgIDs7CisKKyAgLWRsb3BlbikKKyAgICBwcmV2b3B0PSItZGxvcGVuIgorICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCisgICAgOzsKKworICAtKikKKyAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKKyAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgbm9ub3B0PSIkYXJnIgorICAgIGJyZWFrCisgICAgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KKyAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICRlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKK2ZpCisKK2lmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCisKKyAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCisgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgorICAgIGNhc2UgIiRub25vcHQiIGluCisgICAgKmNjIHwgKisrIHwgZ2NjKiB8ICotZ2NjKikKKyAgICAgIG1vZGU9bGluaworICAgICAgZm9yIGFyZworICAgICAgZG8KKyAgICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgLWMpCisgICAgICAgICAgIG1vZGU9Y29tcGlsZQorICAgICAgICAgICBicmVhaworICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgICpkYiB8ICpkYngpCisgICAgICBtb2RlPWV4ZWN1dGUKKyAgICAgIDs7CisgICAgKmluc3RhbGwqfGNwfG12KQorICAgICAgbW9kZT1pbnN0YWxsCisgICAgICA7OworICAgICpybSkKKyAgICAgIG1vZGU9dW5pbnN0YWxsCisgICAgICA7OworICAgICopCisgICAgICAjIElmIHdlIGhhdmUgbm8gbW9kZSwgYnV0IGRsZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHRoZW4gZG8gZXhlY3V0ZSBtb2RlLgorICAgICAgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgbW9kZT1leGVjdXRlCisKKyAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCisgICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgorICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIgMT4mMgorICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorCisgICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KKyAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgaGVscD0iVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworICAjIFRoZXNlIG1vZGVzIGFyZSBpbiBvcmRlciBvZiBleGVjdXRpb24gZnJlcXVlbmN5IHNvIHRoYXQgdGhleSBydW4gcXVpY2tseS4KKyAgY2FzZSAiJG1vZGUiIGluCisgICMgbGlidG9vbCBjb21waWxlIG1vZGUKKyAgY29tcGlsZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgorICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIGxhc3Rhcmc9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgICMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAtbykKKwkkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlbmFtZSB3aXRoIFxgLW8nIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisJOzsKKworICAgICAgLXN0YXRpYykKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgIGxhc3Rhcmc9IiRzcmNmaWxlIgorICAgICAgc3JjZmlsZT0iJGFyZyIKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKworICAgICAgIyBCYWNrc2xhc2hpZnkgYW55IGJhY2tzbGFzaGVzLCBkb3VibGUgcXVvdGVzLCBhbmQgZG9sbGFyIHNpZ25zLgorICAgICAgIyBUaGVzZSBhcmUgdGhlIG9ubHkgY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBzcGVjaWFsbHkKKyAgICAgICMgaW50ZXJwcmV0ZWQgaW5zaWRlIG9mIGRvdWJsZS1xdW90ZWQgc2NyaW5ncy4KKyAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseSBpbiBzY2FuCisgICAgICAjIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgIGNhc2UgIiRsYXN0YXJnIiBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJbGFzdGFyZz0iXCIkbGFzdGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWRkIHRoZSBwcmV2aW91cyBhcmd1bWVudCB0byBiYXNlX2NvbXBpbGUuCisgICAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgorCWJhc2VfY29tcGlsZT0iJGxhc3RhcmciCisgICAgICBlbHNlCisJYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgIHhmb3JtPSdbY0NGU2Ztc10nCisgICAgY2FzZSAiJGxpYm9iaiIgaW4KKyAgICAqLmFkYSkgeGZvcm09YWRhIDs7CisgICAgKi5hZGIpIHhmb3JtPWFkYiA7OworICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKKyAgICAqLmFzbSkgeGZvcm09YXNtIDs7CisgICAgKi5jKyspIHhmb3JtPWMrKyA7OworICAgICouY2MpIHhmb3JtPWNjIDs7CisgICAgKi5jcHApIHhmb3JtPWNwcCA7OworICAgICouY3h4KSB4Zm9ybT1jeHggOzsKKyAgICAqLmY5MCkgeGZvcm09ZjkwIDs7CisgICAgKi5mb3IpIHhmb3JtPWZvciA7OworICAgIGVzYWMKKworICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKKworICAgIGNhc2UgIiRsaWJvYmoiIGluCisgICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvLm8vJ2AgOzsKKyAgICAqKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkc3JjZmlsZSciIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCisgICAgICB0cmFwICIkcnVuICRybSAkb2JqICRsaWJvYmo7IGV4aXQgMSIgMSAyIDE1CisgICAgZWxzZQorICAgICAgJHJ1biAkcm0gJGxpYm9iagorICAgICAgdHJhcCAiJHJ1biAkcm0gJGxpYm9iajsgZXhpdCAxIiAxIDIgMTUKKyAgICBmaQorCisgICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCisgICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKKworICAgICAgIyBBbGwgcGxhdGZvcm1zIHVzZSAtRFBJQywgdG8gbm90aWZ5IHByZXByb2Nlc3NlZCBhc3NlbWJsZXIgY29kZS4KKyAgICAgICRzaG93ICIkYmFzZV9jb21waWxlJHBpY19mbGFnIC1EUElDICRzcmNmaWxlIgorICAgICAgaWYgJHJ1biBldmFsICIkYmFzZV9jb21waWxlXCRwaWNfZmxhZyAtRFBJQyBcJHNyY2ZpbGUiOyB0aGVuIDoKKyAgICAgIGVsc2UKKyAgICAgICAgdGVzdCAtbiAiJG9iaiIgJiYgJHJ1biAkcm0gJG9iagorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiBjb3B5IHRoZSBvYmplY3QgaW50byBwbGFjZSBhbmQgZmluaXNoLgorICAgICAgaWYgdGVzdCAteiAiJHBpY19mbGFnIjsgdGhlbgorICAgICAgICAkc2hvdyAiJExOX1MgJG9iaiAkbGlib2JqIgorICAgICAgICAkcnVuICRMTl9TICRvYmogJGxpYm9iagorICAgICAgICBleGl0ICQ/CisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0LCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICAkc2hvdyAiJG12ICRvYmogJGxpYm9iaiIKKyAgICAgICRydW4gJG12ICRvYmogJGxpYm9iaiB8fCBleGl0IDEKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJworICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICAkc2hvdyAiJGJhc2VfY29tcGlsZSAkc3JjZmlsZSRzdXBwcmVzc19vdXRwdXQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRiYXNlX2NvbXBpbGUgXCRzcmNmaWxlJHN1cHByZXNzX291dHB1dCI7IHRoZW4gOgorICAgICAgZWxzZQorICAgICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkbyBub3QKKyAgICAjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorICAgICAgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKyAgICAgICRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiBcJGxpYm9iaiIgfHwgZXhpdCAkPworICAgIGZpCisKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBsaW5rIG1vZGUKKyAgbGluaykKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgorICAgIENDPSIkbm9ub3B0IgorICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICBjb21waWxlX2NvbW1hbmQ9IiRDQyIKKyAgICBmaW5hbGl6ZV9jb21tYW5kPSIkQ0MiCisKKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgZGVwbGlicz0KKyAgICBkbGZpbGVzPQorICAgIGRscHJlZmlsZXM9CisgICAgZXhwb3J0X2R5bmFtaWM9bm8KKyAgICBoYXJkY29kZV9saWJkaXJzPQorICAgIGxpYm9ianM9CisgICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KKyAgICBsdGxpYnM9CisgICAgb2Jqcz0KKyAgICBwcmV2PQorICAgIHByZXZhcmc9CisgICAgcmVsZWFzZT0KKyAgICBycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdmluZm89CisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljKQorICAgICAgICBpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iIDE+JjIKKyAgICAgICAgZmkKKyAgICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisgICAgICAgIGJyZWFrCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICAgY2FzZSAiJHByZXYiIGluCisgICAgICAgIG91dHB1dCkKKyAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCisgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgIiRwcmV2IiBpbgorICAgICAgICBkbGZpbGVzfGRscHJlZmlsZXMpCisgICAgICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgorICAgICAgICAgICopCisgICAgICAgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgorICAgICAgICAgICAgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorICAgICAgICAgICAgcHJldj0KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIDs7CisJcmVsZWFzZSkKKwkgIHJlbGVhc2U9Ii0kYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworICAgICAgICBycGF0aCkKKyAgICAgICAgICBycGF0aD0iJHJwYXRoICRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisgICAgICAgICopCisgICAgICAgICAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorICAgICAgICAgIHByZXY9CisgICAgICAgICAgY29udGludWUKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorCisgICAgICBwcmV2YXJnPSIkYXJnIgorCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisgICAgICAgIGZpCisgICAgICAgIGNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisgICAgICAgIHByZXY9ZGxmaWxlcworICAgICAgICBjb250aW51ZQorICAgICAgICA7OworCisgICAgICAtZGxwcmVvcGVuKQorICAgICAgICBwcmV2PWRscHJlZmlsZXMKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorICAgICAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiICE9IHllczsgdGhlbgorICAgICAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKwkgIGVsc2UKKwkgICAgYXJnPQorCSAgZmkKKworICAgICAgICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgICAtTCopCisgICAgICAgIGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4tTFwoLipcKSQlXDElJ2AKKyAgICAgICAgY2FzZSAiJGRpciIgaW4KKyAgICAgICAgLyogfCBbQS1aYS16XTpcXCopCisJICAjIEFkZCB0aGUgY29ycmVzcG9uZGluZyBoYXJkY29kZV9saWJkaXJfZmxhZywgaWYgaXQgaXMgbm90IGlkZW50aWNhbC4KKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgLUwkZGlyJyBjYW5ub3Qgc3BlY2lmeSBhIHJlbGF0aXZlIGRpcmVjdG9yeSIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKyAgICAgICAgOzsKKworICAgICAgLWwqKSBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIiA7OworCisgICAgICAtbm8tdW5kZWZpbmVkKQorCWFsbG93X3VuZGVmaW5lZD1ubworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW8pIHByZXY9b3V0cHV0IDs7CisKKyAgICAgIC1yZWxlYXNlKQorCXByZXY9cmVsZWFzZQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJwYXRoKQorICAgICAgICBwcmV2PXJwYXRoCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgIC1zdGF0aWMpCisJIyBJZiB3ZSBoYXZlIG5vIHBpY19mbGFnLCB0aGVuIHRoaXMgaXMgdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMuCisJaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKyAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKKyAgICAgICAgZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisgICAgICAgIHByZXY9dmluZm8KKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgIiRhcmciIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisgICAgICAgIDs7CisKKyAgICAgICoubyB8ICouYSkKKyAgICAgICAgIyBBIHN0YW5kYXJkIG9iamVjdC4KKyAgICAgICAgb2Jqcz0iJG9ianMgJGFyZyIKKyAgICAgICAgOzsKKworICAgICAgKi5sbykKKyAgICAgICAgIyBBIGxpYnJhcnkgb2JqZWN0LgorCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgZWxzZQorCSAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICBwcmV2PWRscHJlZmlsZXMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1wubG8kL1wuby8nYAorCSAgcHJldj0KKwlmaQorCWxpYm9ianM9IiRsaWJvYmpzICRhcmciCisgICAgICAgIDs7CisKKyAgICAgICoubGEpCisgICAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgbGlicmFyeS4KKworICAgICAgICBkbG5hbWU9CisgICAgICAgIGxpYmRpcj0KKyAgICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgICAgb2xkX2xpYnJhcnk9CisKKyAgICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKyAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRhcmcgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgICAgICBlbHNlCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKworICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKyAgICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgKi8qIHwgKlxcKikgLiAkYXJnIDs7CisgICAgICAgICopIC4gLi8kYXJnIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgY29udGFpbnMgbm8gLXJwYXRoIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisKKyAgICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorICAgICAgICBsaW5rbGliPQorICAgICAgICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisgICAgICAgICAgbGlua2xpYj0iJGwiCisgICAgICAgIGRvbmUKKworICAgICAgICBpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorCisgICAgICAgICMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgorICAgICAgICBuYW1lPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorICAgICAgICBkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgICAgICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRhcmciOyB0aGVuCisgICAgICAgICAgZGlyPSIkb2JqZGlyIgorICAgICAgICBlbHNlCisgICAgICAgICAgZGlyPSIkZGlyLyRvYmpkaXIiCisgICAgICAgIGZpCisKKyAgICAgICAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisgICAgICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKyAgICAgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorICAgICAgICAgIGlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgd2UgbmVlZCB0byBwcmVsb2FkLgorICAgICAgICAgICAgcHJldj1kbHByZWZpbGVzCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBXZSBzaG91bGQgbm90IGNyZWF0ZSBhIGRlcGVuZGVuY3kgb24gdGhpcyBsaWJyYXJ5LCBidXQgd2UKKwkgICAgIyBtYXkgbmVlZCBhbnkgbGlicmFyaWVzIGl0IHJlcXVpcmVzLgorCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCisgICAgICAgICAgICBwcmV2PQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisgICAgICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKyAgICAgICAgICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKKyAgICAgICAgICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisgICAgICAgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgorICAgICAgICAgIGZpCisgICAgICAgICAgcHJldj0KKyAgICAgICAgZmkKKworICAgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKyAgICAgICAgICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPSIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyAkYXJnIgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgY2FzZSAiJHRlbXBfcnBhdGggIiBpbgorICAgICAgICAgICAgKiIgJGRpciAiKikgOzsKKyAgICAgICAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRkaXIiIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorICAgICAgICAgICAgICAgICMgUHV0IHRoZSBtYWdpYyBsaWJkaXIgd2l0aCB0aGUgaGFyZGNvZGUgZmxhZy4KKyAgICAgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorICAgICAgICAgICAgICAgIGxpYmRpcj0iQEhBUkRDT0RFX0xJQkRJUlNAIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQljYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCisJCSoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICA7OworCQkqKQorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgIDs7CisJCWVzYWMKKyAgICAgICAgICAgICAgICBsaWJkaXI9CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRmbGFnIgorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmxhZyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICAgICAgICAjIERvIHRoZSBzYW1lIGZvciB0aGUgcGVybWFuZW50IHJ1biBwYXRoLgorICAgICAgICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorICAgICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKKyAgICAgICAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKworCisgICAgICAgICAgY2FzZSAiJGhhcmRjb2RlX2FjdGlvbiIgaW4KKyAgICAgICAgICBpbW1lZGlhdGUpCisgICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCisgICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKworICAgICAgICAgIHJlbGluaykKKyAgICAgICAgICAgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAgICAgICAgY2FzZSAiJGRpciIgaW4KKyAgICAgICAgICAgIC8qIHwgW0EtWmEtel06XFwqKSA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkaXI9IiRhYnNkaXIiCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgorICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6IgorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworCisgICAgICAgICAgKikKKyAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGhhcmRjb2RlX2FjdGlvbicgaXMgYW4gdW5rbm93biBoYXJkY29kZSBhY3Rpb24iIDE+JjIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGliZGlyLyRsaW5rbGliIgorICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIgLWwkbmFtZSIKKyAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorICAgICAgICAgICAgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIgLWwkbmFtZSIKKyAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgIyBUcmFuc2Zvcm0gZGlyZWN0bHkgdG8gb2xkIGFyY2hpdmVzIGlmIHdlIGRvbid0IGJ1aWxkIG5ldyBsaWJyYXJpZXMuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiAmJiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCisgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBzdGF0aWMgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgZmkKKworCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAorCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCisJICAjIHNoYXJlZCBwbGF0Zm9ybXMuCisJICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCisJICBlbHNlCisJICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCisJICBmaQorICAgICAgICBmaQorCisJIyBBZGQgaW4gYW55IGxpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKKwljb250aW51ZQorICAgICAgICA7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCisgICAgICAqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgIiRhcmciIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgYm90aCBcYC12ZXJzaW9uLWluZm8nIGFuZCBcYC1yZWxlYXNlJyIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgb2xkbGliPQorICAgIG9sZG9ianM9CisgICAgY2FzZSAiJG91dHB1dCIgaW4KKyAgICAiIikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworCisgICAgKi8qIHwgKlxcKikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IG91dHB1dCBmaWxlIFxgJG91dHB1dCcgbXVzdCBoYXZlIG5vIGRpcmVjdG9yeSBjb21wb25lbnRzIiAxPiYyCisgICAgICBleGl0IDEKKyAgICAgIDs7CisKKyAgICAqLmEpCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisgICAgICBvbGRsaWI9IiRvdXRwdXQiCisgICAgICAkc2hvdyAiJHJtICRvbGRsaWIiCisgICAgICAkcnVuICRybSAkb2xkbGliCisgICAgICA7OworCisgICAgKi5sYSkKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgIiRvdXRwdXQiIGluCisgICAgICBsaWIqKSA7OworICAgICAgKikKKwkkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkYXJnJyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgbmFtZT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCisgICAgICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorICAgICAgY3VycmVudD0wCisgICAgICByZXZpc2lvbj0wCisgICAgICBhZ2U9MAorCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0czokb2JqcyIgMj4mMQorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSG93IHRoZSBoZWNrIGFyZSB3ZSBzdXBwb3NlZCB0byB3cml0ZSBhIHdyYXBwZXIgZm9yIGEgc2hhcmVkIGxpYnJhcnk/CisgICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbWF5IG5vdCBkZXBlbmQgb24gdW5pbnN0YWxsZWQgbGlicmFyaWVzOiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCisgICAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdpdGggXGAtcnBhdGgnIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKworICAgICAgc2V0IGR1bW15ICRycGF0aAorICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCisgICAgICBmaQorICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgorCisgICAgICAjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgorICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKyAgICAgIHNldCBkdW1teSAkdmluZm8KKyAgICAgIElGUz0iJHNhdmVfaWZzIgorCisgICAgICBpZiB0ZXN0IC1uICIkNSI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCisgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIHRlc3QgLW4gIiQyIiAmJiBjdXJyZW50PSIkMiIKKyAgICAgIHRlc3QgLW4gIiQzIiAmJiByZXZpc2lvbj0iJDMiCisgICAgICB0ZXN0IC1uICIkNCIgJiYgYWdlPSIkNCIKKworICAgICAgIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKyAgICAgIGNhc2UgIiRjdXJyZW50IiBpbgorICAgICAgMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7CisgICAgICAqKQorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBDVVJSRU5UIFxgJGN1cnJlbnQnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICBjYXNlICIkcmV2aXNpb24iIGluCisgICAgICAwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKKyAgICAgICopCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFJFVklTSU9OIFxgJHJldmlzaW9uJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAiJGFnZSIgaW4KKyAgICAgIDAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OworICAgICAgKikKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgIGlmIHRlc3QgJGFnZSAtZ3QgJGN1cnJlbnQ7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKworICAgICAgIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgorICAgICAgdmVyc2lvbl92YXJzPSJ2ZXJzaW9uX3R5cGUgY3VycmVudCBhZ2UgcmV2aXNpb24iCisgICAgICBjYXNlICIkdmVyc2lvbl90eXBlIiBpbgorICAgICAgbm9uZSkgOzsKKworICAgICAgbGludXgpCisgICAgICAgIHZlcnNpb25fdmFycz0iJHZlcnNpb25fdmFycyBtYWpvciB2ZXJzdWZmaXgiCisgICAgICAgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKyAgICAgICAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisgICAgICAgIDs7CisKKyAgICAgIG9zZikKKyAgICAgICAgdmVyc2lvbl92YXJzPSIkdmVyc2lvbl92YXJzIHZlcnN1ZmZpeCB2ZXJzdHJpbmciCisgICAgICAgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKyAgICAgICAgdmVyc3VmZml4PSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKyAgICAgICAgdmVyc3RyaW5nPSIkdmVyc3VmZml4IgorCisgICAgICAgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisgICAgICAgIGxvb3A9JGFnZQorICAgICAgICB3aGlsZSB0ZXN0ICRsb29wICE9IDA7IGRvCisgICAgICAgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKKyAgICAgICAgICBsb29wPWBleHByICRsb29wIC0gMWAKKyAgICAgICAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKKyAgICAgICAgZG9uZQorCisgICAgICAgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KKyAgICAgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKKyAgICAgICAgOzsKKworICAgICAgc3Vub3MpCisgICAgICAgIHZlcnNpb25fdmFycz0iJHZlcnNpb25fdmFycyBtYWpvciB2ZXJzdWZmaXgiCisgICAgICAgIG1ham9yPSIkY3VycmVudCIKKyAgICAgICAgdmVyc3VmZml4PSIkY3VycmVudC4kcmV2aXNpb24iCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgorICAgICAgICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBDcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnksIG9yIHJlbW92ZSBvdXIgb3V0cHV0cyBpZiB3ZSBuZWVkIHRvLgorICAgICAgaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuCisgICAgICAgICRzaG93ICIkcm0gJG9iamRpci8kb3V0cHV0ICRvYmpkaXIvJGxpYm5hbWUuKiAkb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioiCisgICAgICAgICRydW4gJHJtICRvYmpkaXIvJG91dHB1dCAkb2JqZGlyLyRsaWJuYW1lLiogJG9iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qCisgICAgICBlbHNlCisgICAgICAgICRzaG93ICIkbWtkaXIgJG9iamRpciIKKyAgICAgICAgJHJ1biAkbWtkaXIgJG9iamRpcgorCXN0YXR1cz0kPworCWlmIHRlc3QgJHN0YXR1cyAtZXEgMCB8fCB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgorCWVsc2UKKwkgIGV4aXQgJHN0YXR1cworCWZpCisgICAgICBmaQorCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCisgICAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgorICAgICAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisgICAgICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICBidWlsZF9vbGRfbGlicz15ZXMKKyAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKyAgICAgIGZpCisKKyAgICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgc3lzdGVtcy4KKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCisgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAgICMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICBldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKKyAgICAgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisgICAgICAgIHJlYWxuYW1lPSIkMiIKKyAgICAgICAgc2hpZnQ7IHNoaWZ0CisKKyAgICAgICAgaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorICAgICAgICAgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvbmFtZT0iJHJlYWxuYW1lIgorICAgICAgICBmaQorCisgICAgICAgIGxpYj0iJG9iamRpci8kcmVhbG5hbWUiCisJZm9yIGxpbmsKKwlkbworCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgorCWRvbmUKKworICAgICAgICAjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIFBJQy4KKyAgICAgICAgdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvL2cnYAorCisgICAgICAgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgICAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfY21kc1wiCisgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCisgICAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgJHNob3cgIiRjbWQiCisgICAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICAgIGRvbmUKKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICAgIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KKyAgICAgICAgZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisgICAgICAgICAgJHNob3cgIihjZCAkb2JqZGlyICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorICAgICAgICAgICRydW4gZXZhbCAnKGNkICRvYmpkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSknIHx8IGV4aXQgJD8KKyAgICAgICAgZG9uZQorCisgICAgICAgICMgSWYgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgorICAgICAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCisgICAgICAgICAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisgICAgICAgICAgZGxuYW1lPSIkc29uYW1lIgorICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBvbGRsaWI9IiRvYmpkaXIvJGxpYm5hbWUuYSIKKyAgICAgIDs7CisKKyAgICAqLmxvIHwgKi5vKQorICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIHJlbG9hZGFibGUgb2JqZWN0cyIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKKyAgICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBjYXNlICIkb3V0cHV0IiBpbgorICAgICAgKi5sbykKKyAgICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIiAxPiYyCisgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIGxpYm9iaj0iJG91dHB1dCIKKyAgICAgICAgb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvLm8vJ2AKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGxpYm9iaj0KKyAgICAgICAgb2JqPSIkb3V0cHV0IgorICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCisgICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKKworICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisgICAgICByZWxvYWRfb2Jqcz0iJG9ianMiYCRlY2hvICJYJGxpYm9ianMgIiB8ICRYc2VkIC1lICdzL1teICAgICAgIF0qXC5hIC8vZycgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy9nJ2AKKworICAgICAgb3V0cHV0PSIkb2JqIgorICAgICAgZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKKyAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgJHNob3cgIiRjbWQiCisgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgorICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgZXhpdCAwCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorICAgICAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAorICAgICAgICAjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorICAgICAgICAkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgorICAgICAgICAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPworICAgICAgICBleGl0IDAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KKyAgICAgICAgIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKyAgICAgICAgcmVsb2FkX29ianM9IiRsaWJvYmpzIgorICAgICAgICBvdXRwdXQ9IiRsaWJvYmoiCisgICAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCisgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCisgICAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgJHNob3cgIiRjbWQiCisgICAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICAgIGRvbmUKKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICBlbHNlCisgICAgICAgICMgSnVzdCBjcmVhdGUgYSBzeW1saW5rLgorICAgICAgICAkc2hvdyAiJExOX1MgJG9iaiAkbGlib2JqIgorICAgICAgICAkcnVuICRMTl9TICRvYmogJGxpYm9iaiB8fCBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgMAorICAgICAgOzsKKworICAgICopCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCB3aGlsZSBsaW5raW5nIHByb2dyYW1zIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorICAgICAgICAgICAgICAgICMgUHV0IHRoZSBtYWdpYyBsaWJkaXIgd2l0aCB0aGUgaGFyZGNvZGUgZmxhZy4KKyAgICAgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorICAgICAgICAgICAgICAgIGxpYmRpcj0iQEhBUkRDT0RFX0xJQkRJUlNAIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQljYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCisJCSoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICA7OworCQkqKQorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgIDs7CisJCWVzYWMKKyAgICAgICAgICAgICAgICBsaWJkaXI9CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRmbGFnIgorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmxhZyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICAgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisgICAgICAgICAgICAqIiAkbGliZGlyICIqKSA7OworICAgICAgICAgICAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICBmaQorCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgY29tcGlsZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBIQVJEQ09ERV9MSUJESVJTQCUkaGFyZGNvZGVfbGliZGlycyVnImAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBIQVJEQ09ERV9MSUJESVJTQCUkaGFyZGNvZGVfbGliZGlycyVnImAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAgICMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vJ2AKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy8nYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgICAgICAgIGRsc3ltcz0iJHtvdXRwdXR9Uy5jIgorICAgICAgZWxzZQorICAgICAgICBkbHN5bXM9CisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgorICAgICAgICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgcHJlbG9hZGVkIGxpc3QuCisgICAgICAgIGRscHJlZmlsZXM9YCRlY2hvICJYJG9ianMkZGxwcmVmaWxlcyAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy8nYAorCisJIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKyAgICAgICAgbmxpc3Q9IiRvYmpkaXIvJHtvdXRwdXR9Lm5tIgorCisJaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuCisJICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVQiCisJICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1UIgorCWVsc2UKKwkgICRzaG93ICIkbWtkaXIgJG9iamRpciIKKwkgICRydW4gJG1rZGlyICRvYmpkaXIKKwkgIHN0YXR1cz0kPworCSAgaWYgdGVzdCAkc3RhdHVzIC1lcSAwIHx8IHRlc3QgLWQgJG9iamRpcjsgdGhlbiA6CisJICBlbHNlCisJICAgIGV4aXQgJHN0YXR1cworCSAgZmkKKwlmaQorCisgICAgICAgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCisJICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorICAgICAgICBkb25lCisKKyAgICAgICAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KKyAgICAgICAgJHNob3cgImNyZWF0aW5nICRvYmpkaXIvJGRsc3ltcyIKKyAgICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgICMgTWFrZSBzdXJlIHdlIGF0IGxlYXN0IGhhdmUgYW4gZW1wdHkgZmlsZS4KKwkgIHRlc3QgLWYgIiRubGlzdCIgfHwgOiA+ICIkbmxpc3QiCisKKwkgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCSAgICBtdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKwkgICAgd2NvdXQ9YHdjICIkbmxpc3QiIDI+L2Rldi9udWxsYAorCSAgICBjb3VudD1gZWNobyAiWCR3Y291dCIgfCAkWHNlZCAtZSAncy9eWyAJXSpcKFswLTldWzAtOV0qXCkuKiQvXDEvJ2AKKwkgICAgKHRlc3QgIiRjb3VudCIgLWdlIDApIDI+L2Rldi9udWxsIHx8IGNvdW50PS0xCisJICBlbHNlCisJICAgICRybSAiJG5saXN0IlQKKwkgICAgY291bnQ9LTEKKwkgIGZpCisKKwkgIGNhc2UgIiRkbHN5bXMiIGluCisJICAiIikgOzsKKwkgICouYykKKwkgICAgJGVjaG8gPiAiJG9iamRpci8kZGxzeW1zIiAiXAorLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXQnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiBcIkNcIiB7CisjZW5kaWYKKworLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KKyNkZWZpbmUgZGxkX3ByZWxvYWRlZF9zeW1ib2xfY291bnQgc29tZV9vdGhlcl9zeW1ib2wKKyNkZWZpbmUgZGxkX3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwkgICAgaWYgdGVzdCAtZiAiJG5saXN0IjsgdGhlbgorCSAgICAgIHNlZCAtZSAncy9eLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvJyA8ICIkbmxpc3QiID4+ICIkb2JqZGlyLyRkbHN5bXMiCisJICAgIGVsc2UKKwkgICAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG9iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb2JqZGlyLyRkbHN5bXMiICJcCisKKyN1bmRlZiBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudAorI3VuZGVmIGRsZF9wcmVsb2FkZWRfc3ltYm9scworCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBfX3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIF9fcHRyX3QgY2hhciAqCisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGRsZF9wcmVsb2FkZWRfc3ltYm9scywgLTEgaWYgdW5zb3J0ZWQuICovCitpbnQgZGxkX3ByZWxvYWRlZF9zeW1ib2xfY291bnQgPSAkY291bnQ7CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworc3RydWN0IHsKKyAgY2hhciAqbmFtZTsKKyAgX19wdHJfdCBhZGRyZXNzOworfQorZGxkX3ByZWxvYWRlZF9zeW1ib2xzW10gPQore1wKKyIKKworCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiOyB0aGVuCisJICAgICAgc2VkICdzL15cKC4qXCkgXCguKlwpJC8gIHsiXDEiLCAoX19wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiAiJG9iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb2JqZGlyLyRkbHN5bXMiICJcCisgIHswLCAoX19wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCSAgICA7OworCisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgorCSAgICBleGl0IDEKKwkgICAgOzsKKwkgIGVzYWMKKyAgICAgICAgZmkKKworICAgICAgICAjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgorICAgICAgICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyBcIiRkbHN5bXNcIikiCisgICAgICAgICRydW4gZXZhbCAnKGNkICRvYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/CisKKyAgICAgICAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy5vJSJgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy5vJSJgCisgICAgICBlbGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgIT0geWVzOyB0aGVuCisgICAgICAgIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgYW5kIFxgLWRscHJlb3BlbicgYXJlIGlnbm9yZWQgd2l0aG91dCBcYC1leHBvcnQtZHluYW1pYyciIDE+JjIKKyAgICAgIGVsc2UKKyAgICAgICAgIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KKyAgICAgICAgIyBkbGRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKyAgICAgICAgIyByZWFsbHkgd2FzIHJlcXVpcmVkLgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKKworICAgICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisKKyAgICAgICAgIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCisgICAgICAgICRzaG93ICIkY29tcGlsZV9jb21tYW5kIgorICAgICAgICAkcnVuIGV2YWwgIiRjb21waWxlX2NvbW1hbmQiCisgICAgICAgIGV4aXQgJD8KKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG9iamRpci8kb3V0cHV0IiclZydgCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG9iamRpci8kb3V0cHV0IidUJWcnYAorCisgICAgICAjIENyZWF0ZSB0aGUgYmluYXJ5IGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LCB0aGVuIHdyYXAgaXQuCisgICAgICBpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgorICAgICAgZWxzZQorICAgICAgICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCisJJHJ1biAkbWtkaXIgJG9iamRpcgorCXN0YXR1cz0kPworCWlmIHRlc3QgJHN0YXR1cyAtZXEgMCB8fCB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgorCWVsc2UKKwkgIGV4aXQgJHN0YXR1cworCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCisgICAgICAgIHJwYXRoPQorICAgICAgICBmb3IgZGlyIGluICR0ZW1wX3JwYXRoOyBkbworICAgICAgICAgIGNhc2UgIiRkaXIiIGluCisgICAgICAgICAgLyogfCBbQS1aYS16XTpcXCopCisgICAgICAgICAgICAjIEFic29sdXRlIHBhdGguCisgICAgICAgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCisgICAgICAgICAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGRvbmUKKyAgICAgICAgdGVtcF9ycGF0aD0iJHJwYXRoIgorICAgICAgZmkKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKyAgICAgICRydW4gJHJtICRvdXRwdXQKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoIjsgdGhlbgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKyAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKyAgICAgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKyAgICAgICAgcnBhdGg9CisgICAgICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisgICAgICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorICAgICAgICBkb25lCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY2FzZSAiJGhhcmRjb2RlX2FjdGlvbiIgaW4KKyAgICAgIHJlbGluaykKKyAgICAgICAgIyBBR0ghIEZsYW1lIHRoZSBBSVggYW5kIEhQLVVYIHBlb3BsZSBmb3IgbWUsIHdpbGwgeWE/CisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVzaW5nIGEgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiByZWxpbmtpbmcgd2lsbCBiZSByZXF1aXJlZCBiZWZvcmUgXGAkb3V0cHV0JyBjYW4gYmUgaW5zdGFsbGVkIiAxPiYyCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgICRzaG93ICIkY29tcGlsZV9jb21tYW5kIgorICAgICAgJHJ1biBldmFsICIkY29tcGlsZV9jb21tYW5kIiB8fCBleGl0ICQ/CisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBRdW90ZSB0aGUgZmluYWxpemUgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKworICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCisgICAgICBxZWNobz1gJGVjaG8gIlgkZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKKyAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKyAgICAgICAgJHJtICRvdXRwdXQKKyAgICAgICAgdHJhcCAiJHJtICRvdXRwdXQ7IGV4aXQgMSIgMSAyIDE1CisKKyAgICAgICAgJGVjaG8gPiAkb3V0cHV0ICJcCisjISAvYmluL3NoCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0CisjIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04KKyMKKyMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisjIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKyMKKyMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIFxgYHB3ZGAnLgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCBcIlwke0NEUEFUSCtzZXR9XCIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPSckbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicycKKyAgZmluYWxpemVfY29tbWFuZD1cIiRmaW5hbGl6ZV9jb21tYW5kXCIKK2Vsc2UKKyAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJGVjaG8gYXJlIGFscmVhZHkgc2V0LgorICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4gOgorICBlbHNlCisgICAgZWNobz1cIiRxZWNob1wiCisgICAgZmlsZT1cIlwkMFwiCisgIGZpXAorIgorICAgICAgICAkZWNobyA+PiAkb3V0cHV0ICJcCisKKyAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KKyAgdGhpc2Rpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSokJSUnXGAKKyAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgorCisgICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgorICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbworICAgIGRlc3RkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qXCQlJSdcYAorCisgICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgorICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KKyAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgorICAgICAgLyogfCBbQS1aYS16XTpcXCopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OworICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OworICAgICAgZXNhYworICAgIGZpCisKKyAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAorICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorICBwcm9ncmFtPSckb3V0cHV0JworCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKyAgICAgICAgIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KKyAgICAgICAgICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCisKKyAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOipcJC8vJ1xgCisKKyAgICBleHBvcnQgJHNobGlicGF0aF92YXIKKyIKKyAgICAgICAgZmkKKworICAgICAgICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKworICAgICAgIyBFeHBvcnQgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0uCisgICAgICBQQVRIPVwiXCRwcm9nZGlyOlwkUEFUSFwiCisgICAgICBleHBvcnQgUEFUSAorCisgICAgICBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisKKyAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcJHByb2dkaXIvXCRwcm9ncmFtIGRvZXMgbm90IGV4aXN0XCIgMT4mMgorICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgorICAgIGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCisgICAgICAgIGNobW9kICt4ICRvdXRwdXQKKyAgICAgIGZpCisgICAgICBleGl0IDAKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCisgICAgICBvbGRvYmpzPSIkb2JqcyJgJGVjaG8gIlgkbGlib2JqcyAiIHwgJFhzZWQgLWUgJ3MvW14gICBdKlwuYSAvL2cnIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vZydgCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNcIgorICAgICAgZWxzZQorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKyAgICAgIGZpCisgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGZpCisKKyAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KKyAgICBjYXNlICIkb3V0cHV0IiBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLmEiCisKKyAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KKyAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICAgICRlY2hvID4gJG91dHB1dCAiXAorIyAkb3V0cHV0IC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgbHRtYWluLnNoIC0gR05VICRQQUNLQUdFICRWRVJTSU9OCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpcidcCisiCisgICAgICBmaQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgJHNob3cgIihjZCAkb2JqZGlyICYmICRMTl9TIC4uLyRvdXRwdXQgJG91dHB1dCkiCisgICAgICAkcnVuIGV2YWwgIihjZCAkb2JqZGlyICYmICRMTl9TIC4uLyRvdXRwdXQgJG91dHB1dCkiIHx8IGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCisgIGluc3RhbGwpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKKworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIC9iaW4vc2ggYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgorICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCI7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKKwlhcmc9IlwiJGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisgICAgICBpbnN0YWxsX3Byb2c9IiRhcmcgIgorICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgZWxzZQorICAgICAgaW5zdGFsbF9wcm9nPQorICAgICAgYXJnPSIkbm9ub3B0IgorICAgIGZpCisKKyAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCisgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICBjYXNlICIkYXJnIiBpbgorICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorICAgICAgYXJnPSJcIiRhcmdcIiIKKyAgICAgIDs7CisgICAgZXNhYworICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCisKKyAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCisgICAgZGVzdD0KKyAgICBmaWxlcz0KKyAgICBvcHRzPQorICAgIHByZXY9CisgICAgaW5zdGFsbF90eXBlPQorICAgIGlzZGlyPQorICAgIHN0cmlwbWU9CisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KKyAgICAgICAgZmlsZXM9IiRmaWxlcyAkZGVzdCIKKyAgICAgICAgZGVzdD0iJGFyZyIKKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAtZCkgaXNkaXI9eWVzIDs7CisgICAgICAtZikgcHJldj0iLWYiIDs7CisgICAgICAtZykgcHJldj0iLWciIDs7CisgICAgICAtbSkgcHJldj0iLW0iIDs7CisgICAgICAtbykgcHJldj0iLW8iIDs7CisgICAgICAtcykKKyAgICAgICAgc3RyaXBtZT0iIC1zIgorICAgICAgICBjb250aW51ZQorICAgICAgICA7OworICAgICAgLSopIDs7CisKKyAgICAgICopCisgICAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KKyAgICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAgICAgcHJldj0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGRlc3Q9IiRhcmciCisgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKKwlhcmc9IlwiJGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisgICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGFyZyIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCisgICAgICBlbHNlCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgorICAgICAgZmkKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAtbiAiJGlzZGlyIjsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCisgICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCisgICAgICBzZXQgZHVtbXkgJGZpbGVzCisgICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIgMT4mMgorICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorICAgIGZpCisgICAgY2FzZSAiJGRlc3RkaXIiIGluCisgICAgLyogfCBbQS1aYS16XTpcXCopIDs7CisgICAgKikKKyAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAgICoubG8pIDs7CisgICAgICAgICopCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIgMT4mMgorICAgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICIkZmlsZSIgaW4KKyAgICAgICouYSkKKyAgICAgICAgIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKyAgICAgICAgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCisgICAgICAgIDs7CisKKyAgICAgICoubGEpCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisgICAgICAgIGlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgICAgICAgIGVsc2UKKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKyAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKworICAgICAgICBsaWJyYXJ5X25hbWVzPQorICAgICAgICBvbGRfbGlicmFyeT0KKyAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisgICAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisgICAgICAgICopIC4gLi8kZmlsZSA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgorICAgICAgICBpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorICAgICAgICAgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7CisgICAgICAgICAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBlbHNlCisgICAgICAgICAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorICAgICAgICAgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCisgICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKKyAgICAgICAgICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBmaQorCisgICAgICAgIGRpcj0iYCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AvIgorICAgICAgICB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQorICAgICAgICBkaXI9IiRkaXIkb2JqZGlyIgorCisgICAgICAgICMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworICAgICAgICBpZiB0ZXN0IC1uICIkMiI7IHRoZW4KKyAgICAgICAgICByZWFsbmFtZT0iJDIiCisgICAgICAgICAgc2hpZnQKKyAgICAgICAgICBzaGlmdAorCisgICAgICAgICAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgorICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKKyAgICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/CisgICAgICAgICAgdGVzdCAiWCRkbG5hbWUiID0gIlgkcmVhbG5hbWUiICYmIGRsbmFtZT0KKworICAgICAgICAgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAgICAgICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MuCisgICAgICAgICAgICBybWNtZD0iJHJtIgorICAgICAgICAgICAgZm9yIGxpbmtuYW1lCisgICAgICAgICAgICBkbworICAgICAgICAgICAgICBybWNtZD0iJHJtY21kICRkZXN0ZGlyLyRsaW5rbmFtZSIKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICRzaG93ICIkcm1jbWQiCisgICAgICAgICAgICAkcnVuICRybWNtZAorCisgICAgICAgICAgICAjIC4uLiBhbmQgY3JlYXRlIG5ldyBvbmVzLgorICAgICAgICAgICAgZm9yIGxpbmtuYW1lCisgICAgICAgICAgICBkbworICAgICAgICAgICAgICB0ZXN0ICJYJGRsbmFtZSIgPSAiWCRsaW5rbmFtZSIgJiYgZGxuYW1lPQorICAgICAgICAgICAgICAkc2hvdyAiKGNkICRkZXN0ZGlyICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorICAgICAgICAgICAgICAkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKyAgICAgICAgICAgICMgSW5zdGFsbCB0aGUgZHluYW1pY2FsbHktbG9hZGFibGUgbGlicmFyeS4KKyAgICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIgorICAgICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIiB8fCBleGl0ICQ/CisgICAgICAgICAgZmkKKworICAgICAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgICAgICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKKyAgICAgICAgICBldmFsIGNtZHM9XCIkcG9zdGluc3RhbGxfY21kc1wiCisgICAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKKyAgICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgICAkc2hvdyAiJGNtZCIKKyAgICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgICAgIGRvbmUKKyAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgZmkKKworICAgICAgICAjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKyAgICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGRpci8kbmFtZSIKKyAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/CisKKyAgICAgICAgIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorICAgICAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorICAgICAgICA7OworCisgICAgICAqLmxvKQorICAgICAgICAjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworICAgICAgICAjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisgICAgICAgIGlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKyAgICAgICAgICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorICAgICAgICBlbHNlCisgICAgICAgICAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgICAgICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorICAgICAgICBmaQorCisgICAgICAgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisgICAgICAgIGNhc2UgIiRkZXN0ZmlsZSIgaW4KKyAgICAgICAgKi5sbykKKyAgICAgICAgICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKKyAgICAgICAgICA7OworICAgICAgICAqLm8pCisgICAgICAgICAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgorICAgICAgICAgIGRlc3RmaWxlPQorICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKKyAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCisgICAgICAgIGlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KKyAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCisgICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgfHwgZXhpdCAkPworICAgICAgICBmaQorCisgICAgICAgICMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgorICAgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAgICAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKyAgICAgICAgICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCisKKyAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgorICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KKyAgICAgICAgZmkKKyAgICAgICAgZXhpdCAwCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKyAgICAgICAgaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KKyAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPQorCisgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisgICAgICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAgICAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OworICAgICAgICAgICopIC4gLi8kZmlsZSA7OworICAgICAgICAgIGVzYWMKKworICAgICAgICAgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorICAgICAgICAgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiB8fCB0ZXN0IC16ICIkZmluYWxpemVfY29tbWFuZCI7IHRoZW4KKyAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgZmkKKworICAgICAgICAgIGZpbmFsaXplPXllcworICAgICAgICAgIGZvciBsaWIgaW4gJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM7IGRvCisgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCisgICAgICAgICAgICBsaWJkaXI9CisgICAgICAgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKyAgICAgICAgICAgICAgY2FzZSAiJGxpYiIgaW4KKyAgICAgICAgICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7CisgICAgICAgICAgICAgICopIC4gLi8kbGliIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBsaWJmaWxlPSIkbGliZGlyL2AkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgIgorICAgICAgICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBjb250YWlucyBubyAtcnBhdGggaW5mb3JtYXRpb24iIDE+JjIKKyAgICAgICAgICAgIGVsaWYgdGVzdCAtZiAiJGxpYmZpbGUiOyB0aGVuIDoKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKKyAgICAgICAgICAgICAgZmluYWxpemU9bm8KKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorCisgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVsaW5raW5nIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKKyAgICAgICAgICAgICAgJHNob3cgIiRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgICAgICAgICBpZiAkcnVuIGV2YWwgIiRmaW5hbGl6ZV9jb21tYW5kIjsgdGhlbiA6CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaWxlPSIkb2JqZGlyLyRmaWxlIlQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3QiCisgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0IiB8fCBleGl0ICQ/CisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCisgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/CisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdGluc3RhbGxfY21kc1wiCisgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KKyAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCisgICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjICRTSEVMTCAkMCAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBmaW5pc2ggbW9kZQorICBmaW5pc2gpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgorICAgIGxpYmRpcnM9IiRub25vcHQiCisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGRpcgorICAgICAgZG8KKyAgICAgICAgbGliZGlycz0iJGxpYmRpcnMgJGRpciIKKyAgICAgIGRvbmUKKworICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9jbWRzXCIKKyAgICAgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAgICAgJHJ1biBldmFsICIkY21kIgorICAgICAgICAgIGRvbmUKKyAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KKwkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCisJICAkcnVuIGV2YWwgIiRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICBlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKyAgICAgIGVjaG8gIiAgICRsaWJkaXIiCisgICAgZG9uZQorICAgIGVjaG8KKyAgICBlY2hvICJUbyBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyBpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCIKKyAgICBlY2hvICJ5b3UgbXVzdCB1c2UgdGhlIFxgLUxMSUJESVInIGZsYWcgZHVyaW5nIGxpbmtpbmcuIgorICAgIGVjaG8KKyAgICBlY2hvICIgWW91IHdpbGwgYWxzbyBuZWVkIHRvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICBlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGxpYmRpcj1MSUJESVIKKyAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKworICAgICAgZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgorICAgIGZpCisgICAgZWNobworICAgIGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgorICAgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBleGVjdXRlIG1vZGUKKyAgZXhlY3V0ZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgorCisgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KKyAgICBjbWQ9IiRub25vcHQiCisgICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KKyAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisgICAgICBmaQorCisgICAgICBkaXI9CisgICAgICBjYXNlICIkZmlsZSIgaW4KKyAgICAgICoubGEpCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisgICAgICAgIGlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgICAgICAgIGVsc2UKKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorICAgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorCisJIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCisJZGxuYW1lPQorCWxpYnJhcnlfbmFtZXM9CisKKyAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJY2FzZSAiJGZpbGUiIGluCisJKi8qIHwgKlxcKikgLiAkZmlsZSA7OworICAgICAgICAqKSAuIC4vJGZpbGUgOzsKKwllc2FjCisKKwkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgorCSAgY29udGludWUKKwlmaQorCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKworCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgorCSAgZGlyPSIkZGlyLyRvYmpkaXIiCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KKwlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgorCTs7CisKKyAgICAgICopCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZyBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIgMT4mMgorICAgICAgICBjb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICIkZmlsZSIgaW4KKyAgICAgIC0qKSA7OworICAgICAgKikKKyAgICAgICAgIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorICAgICAgICBpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAiJGZpbGUiIGluCisJICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJICAqKSAuIC4vJGZpbGUgOzsKKwkgIGVzYWMKKworCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgorICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKyAgICAgICMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgorICAgICAgZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCisgICAgICAjIE5vdyBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgorICAgICAgZXZhbCAiZXhlYyBcJGNtZCRhcmdzIgorCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZXhlYyBcJGNtZCRhcmdzIgorICAgICAgZXhpdCAxCisgICAgZWxzZQorICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KKyAgICAgIGV2YWwgIlwkZWNobyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCisgICAgICAkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgJGVjaG8gIiRjbWQkYXJncyIKKyAgICAgIGV4aXQgMAorICAgIGZpCisgICAgOzsKKworICAjIGxpYnRvb2wgdW5pbnN0YWxsIG1vZGUKKyAgdW5pbnN0YWxsKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IHVuaW5zdGFsbCIKKyAgICBybT0iJG5vbm9wdCIKKyAgICBmaWxlcz0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgIC0qKSBybT0iJHJtICRhcmciIDs7CisgICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJHJtIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisgICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICAgIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgIHJtZmlsZXM9IiRmaWxlIgorCisgICAgICBjYXNlICIkbmFtZSIgaW4KKyAgICAgICoubGEpCisgICAgICAgICMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KKyAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgLiAkZGlyLyRuYW1lCisKKyAgICAgICAgICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgorICAgICAgICAgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworICAgICAgICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbiIKKyAgICAgICAgICAgIHRlc3QgIlgkbiIgPSAiWCRkbG5hbWUiICYmIGRsbmFtZT0KKyAgICAgICAgICBkb25lCisgICAgICAgICAgdGVzdCAtbiAiJGRsbmFtZSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kZGxuYW1lIgorICAgICAgICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisKKwkgICRzaG93ICIkcm0gJHJtZmlsZXMiCisJICAkcnVuICRybSAkcm1maWxlcworCisJICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKwkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgIGV2YWwgY21kcz1cIiRwb3N0dW5pbnN0YWxsX2NtZHNcIgorCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworCSAgICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRzaG93ICIkY21kIgorCSAgICAgICRydW4gZXZhbCAiJGNtZCIKKwkgICAgZG9uZQorCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHNcIgorCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworCSAgICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRzaG93ICIkY21kIgorCSAgICAgICRydW4gZXZhbCAiJGNtZCIKKwkgICAgZG9uZQorCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZpCisKKyAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgKi5sbykKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgICAgIG9sZG9iaj1gJGVjaG8gIlgkbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKKyAgICAgICAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRvYmoiCisgICAgICAgIGZpCisJJHNob3cgIiRybSAkcm1maWxlcyIKKwkkcnVuICRybSAkcm1maWxlcworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgCSRzaG93ICIkcm0gJHJtZmlsZXMiCisJJHJ1biAkcm0gJHJtZmlsZXMKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgICBleGl0IDAKKyAgICA7OworCisgICIiKQorICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCisgICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworICBlc2FjCisKKyAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICBleGl0IDEKK2ZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKKworIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCitjYXNlICIkbW9kZSIgaW4KKyIiKSAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCisKK1Byb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorCistbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKKyAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCisgICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JworICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisKK01PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisKK01PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgorYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuIgorICBleGl0IDAKKyAgOzsKKworY29tcGlsZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKKworQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgorCitDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQorZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KKworVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCitTT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKK2xpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKKyAgOzsKKworZXhlY3V0ZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KKworQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCisKK1RoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKK2ZsYWdzLgorCitJZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCitpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKK2RpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgorCitUaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKKyAgOzsKKworZmluaXNoKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCisKK0NvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCisKK0VhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCisKK1RoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQordGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCisgIDs7CisKK2luc3RhbGwpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgorCitJbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KKworSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCitlaXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KKworVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKK0JTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgorICA7OworCitsaW5rKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KKworTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bworY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCithIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBkbGRfcHJlbG9hZGVkX3N5bWJvbHMKKyAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKKyAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcworICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQorCitBbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgorCitFdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQordHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKK29iamVjdCBmaWxlcy4KKworSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsIG9ubHkKK2xpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzIHJlcXVpcmVkLgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkIHVzaW5nIFxgYXInCithbmQgXGByYW5saWInLgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC5vJywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgaXMKK2NyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgIDs7CisKK3VuaW5zdGFsbCkKKyAgJGVjaG8KKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCitPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgIDs7CisKKyopCisgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKKyAgJGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitlY2hvCiskZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgorCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvanBlZy9tYWtjanBlZy5zdCBiL2pwZWcvbWFrY2pwZWcuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MmM4OQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrY2pwZWcuc3QKQEAgLTAsMCArMSwzOCBAQAorOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorOworOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCis7IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAorOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7Cis7IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBjanBlZy5wcmouCis7IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKKzsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKKzsKKzsKKzsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgorY2pwZWcudHRwCis7Cis7ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAorLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCisuQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcworLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncworLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCisuQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCisuQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKKz0KKzsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK3Bjc3RhcnQubworY2pwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLGp2ZXJzaW9uLmgpCitjZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRzd2l0Y2guYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRwcG0uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRnaWYuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmR0YXJnYS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZGJtcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZHJsZS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCitsaWJqcGVnLmxpYiAgICAgICAgOyBidWlsdCBieSBsaWJqcGVnLnByagorcGNmbHRsaWIubGliICAgICAgIDsgZmxvYXRpbmcgcG9pbnQgbGlicmFyeQorOyB0aGUgZmxvYXQgbGlicmFyeSBjYW4gYmUgb21pdHRlZCBpZiB5b3UndmUgdHVybmVkIG9mZiBEQ1RfRkxPQVRfU1VQUE9SVEVECitwY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5CitwY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9qcGVnL21ha2RqcGVnLnN0IGIvanBlZy9tYWtkanBlZy5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjI2NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9tYWtkanBlZy5zdApAQCAtMCwwICsxLDM4IEBACis7IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCis7Cis7IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KKzsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKKzsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCis7IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KKzsKKzsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGRqcGVnLnByai4KKzsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgorOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQorOworOworOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCitkanBlZy50dHAKKzsKKzsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCisuQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKKy5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCisuQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCisuQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKKy5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKKy5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAorPQorOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAorcGNzdGFydC5vCitkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgsanZlcnNpb24uaCkKK2NkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZGNvbG1hcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cnBwbS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cmdpZi5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cnRhcmdhLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3dyYm1wLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3dycmxlLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK2xpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCitwY2ZsdGxpYi5saWIgICAgICAgOyBmbG9hdGluZyBwb2ludCBsaWJyYXJ5Cis7IHRoZSBmbG9hdCBsaWJyYXJ5IGNhbiBiZSBvbWl0dGVkIGlmIHlvdSd2ZSB0dXJuZWQgb2ZmIERDVF9GTE9BVF9TVVBQT1JURUQKK3Bjc3RkbGliLmxpYiAgICAgICA7IHN0YW5kYXJkIGxpYnJhcnkKK3BjZXh0bGliLmxpYiAgICAgICA7IGV4dGVuZGVkIGxpYnJhcnkKZGlmZiAtLWdpdCBhL2pwZWcvbWFrZWFwcHMuZHMgYi9qcGVnL21ha2VhcHBzLmRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZGQwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VhcHBzLmRzCkBAIC0wLDAgKzEsODI4IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjIwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCishSUYgIiQoQ0ZHKSIgPT0gIiIKK0NGRz1janBlZyAtIFdpbjMyCishTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8gY2pwZWcgLSBXaW4zMi4KKyFFTkRJRiAKKworIUlGICIkKENGRykiICE9ICJjanBlZyAtIFdpbjMyIiAmJiAiJChDRkcpIiAhPSAiZGpwZWcgLSBXaW4zMiIgJiZcCisgIiQoQ0ZHKSIgIT0gImpwZWd0cmFuIC0gV2luMzIiICYmICIkKENGRykiICE9ICJyZGpwZ2NvbSAtIFdpbjMyIiAmJlwKKyAiJChDRkcpIiAhPSAid3JqcGdjb20gLSBXaW4zMiIKKyFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImFwcHMubWFrIiBDRkc9ImNqcGVnIC0gV2luMzIiCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiY2pwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJkanBlZyAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImpwZWd0cmFuIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAicmRqcGdjb20gLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ3cmpwZ2NvbSAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCishRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KKyFFTkRJRiAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorIUVMU0UgCitOVUxMPW51bAorIUVORElGIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgImNqcGVnIC0gV2luMzIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImNqcGVnIC0gV2luMzIiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJjanBlZ1xSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiY2pwZWdcUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgImNqcGVnIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgImNqcGVnXFJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiY2pwZWdcUmVsZWFzZSIKKyMgUFJPUCBUYXJnZXRfRGlyICJjanBlZyIKK09VVERJUj0uXGNqcGVnXFJlbGVhc2UKK0lOVERJUj0uXGNqcGVnXFJlbGVhc2UKKworQUxMIDogIiQoT1VURElSKVxjanBlZy5leGUiCisKK0NMRUFOIDogCisJLUBlcmFzZSAiJChJTlRESVIpXGNqcGVnLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRwcG0ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZGdpZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkdGFyZ2Eub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZHJsZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkYm1wLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRzd2l0Y2gub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgorCS1AZXJhc2UgIiQoT1VURElSKVxjanBlZy5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKKyAvRnAiJChJTlRESVIpL2NqcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5cY2pwZWdcUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvY2pwZWcuYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKKyBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCisgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAorIC9wZGI6IiQoT1VURElSKS9janBlZy5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2NqcGVnLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcY2pwZWcub2JqIiBcCisJIiQoSU5URElSKVxyZHBwbS5vYmoiIFwKKwkiJChJTlRESVIpXHJkZ2lmLm9iaiIgXAorCSIkKElOVERJUilccmR0YXJnYS5vYmoiIFwKKwkiJChJTlRESVIpXHJkcmxlLm9iaiIgXAorCSIkKElOVERJUilccmRibXAub2JqIiBcCisJIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIFwKKwkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKKworCisiJChPVVRESVIpXGNqcGVnLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCishRUxTRUlGICAiJChDRkcpIiA9PSAiZGpwZWcgLSBXaW4zMiIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImRqcGVnXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJkanBlZ1xSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiZGpwZWciCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiZGpwZWdcUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJkanBlZ1xSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgImRqcGVnIgorT1VURElSPS5cZGpwZWdcUmVsZWFzZQorSU5URElSPS5cZGpwZWdcUmVsZWFzZQorCitBTEwgOiAiJChPVVRESVIpXGRqcGVnLmV4ZSIKKworQ0xFQU4gOiAKKwktQGVyYXNlICIkKElOVERJUilcZGpwZWcub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx3cnBwbS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHdyZ2lmLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcd3J0YXJnYS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHdycmxlLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcd3JibXAub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXGRqcGVnLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAorIC9GcCIkKElOVERJUikvZGpwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9LlxkanBlZ1xSZWxlYXNlLworQ1BQX1NCUlM9LlwuCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9kanBlZy5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAorIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKKyBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCisgL3BkYjoiJChPVVRESVIpL2RqcGVnLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvZGpwZWcuZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVxkanBlZy5vYmoiIFwKKwkiJChJTlRESVIpXHdycHBtLm9iaiIgXAorCSIkKElOVERJUilcd3JnaWYub2JqIiBcCisJIiQoSU5URElSKVx3cnRhcmdhLm9iaiIgXAorCSIkKElOVERJUilcd3JybGUub2JqIiBcCisJIiQoSU5URElSKVx3cmJtcC5vYmoiIFwKKwkiJChJTlRESVIpXHJkY29sbWFwLm9iaiIgXAorCSIkKElOVERJUilcY2RqcGVnLm9iaiIgXAorCisKKyIkKE9VVERJUilcZGpwZWcuZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTFNFSUYgICIkKENGRykiID09ICJqcGVndHJhbiAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAianBlZ3RyYW5cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICJqcGVndHJhbiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJqcGVndHJhblxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAianBlZ3RyYW4iCitPVVRESVI9LlxqcGVndHJhblxSZWxlYXNlCitJTlRESVI9LlxqcGVndHJhblxSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilcanBlZ3RyYW4uZXhlIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVxqcGVndHJhbi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcY2RqcGVnLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcdHJhbnN1cHAub2JqIgorCS1AZXJhc2UgIiQoT1VURElSKVxqcGVndHJhbi5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKKyAvRnAiJChJTlRESVIpL2pwZWd0cmFuLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5canBlZ3RyYW5cUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvanBlZ3RyYW4uYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKKyBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCisgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAorIC9wZGI6IiQoT1VURElSKS9qcGVndHJhbi5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2pwZWd0cmFuLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcanBlZ3RyYW4ub2JqIiBcCisJIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIFwKKwkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKKwkiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIgXAorCisKKyIkKE9VVERJUilcanBlZ3RyYW4uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTFNFSUYgICIkKENGRykiID09ICJyZGpwZ2NvbSAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAicmRqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICJyZGpwZ2NvbSIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAicmRqcGdjb20iCitPVVRESVI9LlxyZGpwZ2NvbVxSZWxlYXNlCitJTlRESVI9LlxyZGpwZ2NvbVxSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilccmRqcGdjb20uZXhlIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAorIC9GcCIkKElOVERJUikvcmRqcGdjb20ucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9LlxyZGpwZ2NvbVxSZWxlYXNlLworQ1BQX1NCUlM9LlwuCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9yZGpwZ2NvbS5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAorIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKKyBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCisgL3BkYjoiJChPVVRESVIpL3JkanBnY29tLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvcmRqcGdjb20uZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiCisKKyIkKE9VVERJUilccmRqcGdjb20uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ3cmpwZ2NvbSAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAid3JqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIndyanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICJ3cmpwZ2NvbSIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIndyanBnY29tXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAid3JqcGdjb20iCitPVVRESVI9Llx3cmpwZ2NvbVxSZWxlYXNlCitJTlRESVI9Llx3cmpwZ2NvbVxSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilcd3JqcGdjb20uZXhlIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVx3cmpwZ2NvbS5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXHdyanBnY29tLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAorIC9GcCIkKElOVERJUikvd3JqcGdjb20ucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9Llx3cmpwZ2NvbVxSZWxlYXNlLworQ1BQX1NCUlM9LlwuCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS93cmpwZ2NvbS5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAorIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKKyBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCisgL3BkYjoiJChPVVRESVIpL3dyanBnY29tLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvd3JqcGdjb20uZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVx3cmpwZ2NvbS5vYmoiCisKKyIkKE9VVERJUilcd3JqcGdjb20uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTkRJRiAKKworLmN7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jcHB7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeHh7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3BweyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3h4eyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJjanBlZyAtIFdpbjMyIgorCishSUYgICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIgorCishRU5ESUYgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iY2pwZWcuYyIKK0RFUF9DUFBfQ0pQRUc9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCSJqdmVyc2lvbi5oIlwKKwkKKworIiQoSU5URElSKVxjanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DSlBFRykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJjZGpwZWcuYyIKK0RFUF9DUFBfQ0RKUEU9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DREpQRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHN3aXRjaC5jIgorREVQX0NQUF9SRFNXST1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRzd2l0Y2gub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRTV0kpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmRwcG0uYyIKK0RFUF9DUFBfUkRQUE09XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHJkcHBtLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEUFBNKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkZ2lmLmMiCitERVBfQ1BQX1JER0lGPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZGdpZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SREdJRikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHRhcmdhLmMiCitERVBfQ1BQX1JEVEFSPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZHRhcmdhLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEVEFSKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkYm1wLmMiCitERVBfQ1BQX1JEQk1QPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZGJtcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SREJNUCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHJsZS5jIgorREVQX0NQUF9SRFJMRT1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRybGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRSTEUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiZGpwZWcgLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAiZGpwZWcgLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImRqcGVnLmMiCitERVBfQ1BQX0RKUEVHPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkianZlcnNpb24uaCJcCisJCisKKyIkKElOVERJUilcZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfREpQRUcpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iY2RqcGVnLmMiCitERVBfQ1BQX0NESlBFPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmRjb2xtYXAuYyIKK0RFUF9DUFBfUkRDT0w9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHJkY29sbWFwLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEQ09MKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9IndycHBtLmMiCitERVBfQ1BQX1dSUFBNPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVx3cnBwbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlBQTSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJ3cmdpZi5jIgorREVQX0NQUF9XUkdJRj1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcd3JnaWYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JHSUYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0id3J0YXJnYS5jIgorREVQX0NQUF9XUlRBUj1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcd3J0YXJnYS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlRBUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJ3cmJtcC5jIgorREVQX0NQUF9XUkJNUD1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcd3JibXAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JCTVApICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0id3JybGUuYyIKK0RFUF9DUFBfV1JSTEU9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHdycmxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSUkxFKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImpwZWd0cmFuIC0gV2luMzIiCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImpwZWd0cmFuIC0gV2luMzIiCisKKyFFTkRJRiAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqcGVndHJhbi5jIgorREVQX0NQUF9KUEVHVD1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJInRyYW5zdXBwLmgiXAorCSJqdmVyc2lvbi5oIlwKKwkKKworIiQoSU5URElSKVxqcGVndHJhbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUEVHVCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJjZGpwZWcuYyIKK0RFUF9DUFBfQ0RKUEU9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DREpQRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHN3aXRjaC5jIgorREVQX0NQUF9SRFNXST1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRzd2l0Y2gub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRTV0kpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0idHJhbnN1cHAuYyIKK0RFUF9DUFBfVFJBTlM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkidHJhbnN1cHAuaCJcCisJCisKKyIkKElOVERJUilcdHJhbnN1cHAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfVFJBTlMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAicmRqcGdjb20gLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkanBnY29tLmMiCitERVBfQ1BQX1JESlBHPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJCisKKyIkKElOVERJUilccmRqcGdjb20ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRKUEcpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAid3JqcGdjb20gLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAid3JqcGdjb20gLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9IndyanBnY29tLmMiCitERVBfQ1BQX1dSSlBHPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJCisKKyIkKElOVERJUilcd3JqcGdjb20ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JKUEcpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvanBlZy9tYWtlZmlsZS5hbnNpIGIvanBlZy9tYWtlZmlsZS5hbnNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTE5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VmaWxlLmFuc2kKQEAgLTAsMCArMSwyMTQgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIHdpdGggQU5TSS1jYXBhYmxlIGNvbXBpbGVycy4KKyMgSWYgeW91IGhhdmUgYSBub24tQU5TSSBjb21waWxlciwgbWFrZWZpbGUudW5peCBpcyBhIGJldHRlciBzdGFydGluZyBwb2ludC4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKKworIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6CitDQz0gY2MKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IC1PCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIGNjIG9wdGlvbnM6CitMREZMQUdTPSAKKworIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KK0xETElCUz0gCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50CisjIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgorU1lTREVQTUVNPSBqbWVtbm9icy5vCisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKKyMgbGlua2VyCitMTj0gJChDQykKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gcm0gLWYKKyMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAorQVI9IGFyIHJjCisjIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQorQVIyPSByYW5saWIKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKKyAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCisgICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKKyAgICAgICAgamZkY3RpbnQubworIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAorICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKKyAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAorICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubworIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCitMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCisjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCitDT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK0RPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAorICAgICAgICBjZGpwZWcubworVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubworCisKK2FsbDogbGlianBlZy5hIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisKK2xpYmpwZWcuYTogJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcuYQorCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQorCSQoQVIyKSBsaWJqcGVnLmEKKworY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitkanBlZzogJChET0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCisKK2pwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCityZGpwZ2NvbTogcmRqcGdjb20ubworCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKKword3JqcGdjb206IHdyanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCitjbGVhbjoKKwkkKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gbGlianBlZy5hIHJkanBnY29tIHdyanBnY29tCisJJChSTSkgY29yZSB0ZXN0b3V0KgorCit0ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgorCSQoUk0pIHRlc3RvdXQqCisJLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKKwkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvanBlZy9tYWtlZmlsZS5iY2MgYi9qcGVnL21ha2VmaWxlLmJjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNmY2RlCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9tYWtlZmlsZS5iY2MKQEAgLTAsMCArMSwyODUgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIEJvcmxhbmQgQyBvbiBNUy1ET1Mgb3IgT1MvMi4KKyMgSXQgd29ya3Mgd2l0aCBCb3JsYW5kIEMrKyBmb3IgRE9TLCByZXZpc2lvbiAzLjAgb3IgbGF0ZXIsCisjIGFuZCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBCb3JsYW5kIEMrKyBmb3IgT1MvMi4KKyMgV2F0Y2ggb3V0IGZvciBvcHRpbWl6YXRpb24gYnVncyBpbiB0aGUgT1MvMiBjb21waWxlcnMgLS0tIHNlZSBub3RlcyBiZWxvdyEKKyMgVGhhbmtzIHRvIFRvbSBXcmlnaHQgYW5kIEdlJyBXZWlqZXJzIChvcmlnaW5hbCBET1MpIGFuZAorIyBLZW4gUG9ydGVyIChPUy8yKSBmb3IgdGhpcyBmaWxlLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIEFyZSB3ZSB1bmRlciBET1Mgb3IgT1MvMj8KKyFpZiAhJGQoRE9TKSAmJiAhJGQoT1MyKQorIWlmICRkKF9fT1MyX18pCitPUzI9MQorIWVsc2UKK0RPUz0xCishZW5kaWYKKyFlbmRpZgorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBiY2MKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CishaWYgJGQoRE9TKQorQ0ZMQUdTPSAtTzIgLW1tIC13LXBhciAtdy1zdHUgLXctY2NjIC13LXJjaAorIWVsc2UKK0NGTEFHUz0gLU8xIC13LXBhciAtdy1zdHUgLXctY2NjIC13LXJjaAorIWVuZGlmCisjIC1PMiBlbmFibGVzIGZ1bGwgY29kZSBvcHRpbWl6YXRpb24gKGZvciBwcmUtMy4wIEJvcmxhbmQgQysrLCB1c2UgLU8gLUcgLVopLgorIyAtTzIgaXMgYnVnZ3kgaW4gQm9ybGFuZCBPUy8yIEMrKyByZXZpc2lvbiAyLjAsIHNvIHVzZSAtTzEgdGhlcmUgZm9yIG5vdy4KKyMgSWYgeW91IGhhdmUgQm9ybGFuZCBPUy8yIEMrKyByZXZpc2lvbiAxLjAsIHVzZSAtTyBvciBubyBvcHRpbWl6YXRpb24gYXQgYWxsLgorIyAtbW0gc2VsZWN0cyBtZWRpdW0gbWVtb3J5IG1vZGVsIChuZWFyIGRhdGEsIGZhciBjb2RlIHBvaW50ZXJzOyBET1Mgb25seSEpCisjIC13LXBhciBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IHVudXNlZCBmdW5jdGlvbiBwYXJhbWV0ZXJzCisjIC13LXN0dSBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IGluY29tcGxldGUgc3RydWN0dXJlcworIyAtdy1jY2Mgc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCBjb21waWxlLXRpbWUtY29uc3RhbnQgY29uZGl0aW9ucworIyAtdy1yY2ggc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCB1bnJlYWNoYWJsZSBjb2RlCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIGNjIG9wdGlvbnM6CishaWYgJGQoRE9TKQorTERGTEFHUz0gLW1tCisjIG1lbW9yeSBtb2RlbCBvcHRpb24gaGVyZSBtdXN0IG1hdGNoIENGTEFHUyEKKyFlbHNlCitMREZMQUdTPQorIyAtbGFpIGZ1bGwtc2NyZWVuIGFwcAorIyAtbGMgY2FzZS1zaWduaWZpY2FudCBsaW5rCishZW5kaWYKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLgorIyBGb3IgRE9TLCB3ZSByZWNvbW1lbmQgam1lbWRvcy5jIGFuZCBqbWVtZG9zYS5hc20uCisjIEZvciBPUy8yLCB3ZSByZWNvbW1lbmQgam1lbW5vYnMuYyAoZmxhdCBtZW1vcnkhKQorIyBTWVNERVBNRU1MSUIgbXVzdCBsaXN0IHRoZSBzYW1lIGZpbGVzIHdpdGggIisiIHNpZ25zIGZvciB0aGUgbGlicmFyaWFuLgorIWlmICRkKERPUykKK1NZU0RFUE1FTT0gam1lbWRvcy5vYmogam1lbWRvc2Eub2JqCitTWVNERVBNRU1MSUI9ICtqbWVtZG9zLm9iaiAram1lbWRvc2Eub2JqCishZWxzZQorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKK1NZU0RFUE1FTUxJQj0gK2ptZW1ub2JzLm9iagorIWVuZGlmCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCisgICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKKyAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKKyAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCisgICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCisgICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAorICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAorICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagorIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKKyAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKK0RPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKKyAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKK1RST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagorCisKK2FsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQorCS0gZGVsIGxpYmpwZWcubGliCisJdGxpYiBsaWJqcGVnLmxpYiAvRSAvQyBAJiZ8CisramNhcGltaW4ub2JqICtqY2FwaXN0ZC5vYmogK2pjdHJhbnMub2JqICtqY3BhcmFtLm9iaiAramRhdGFkc3Qub2JqICYKKytqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogJgorK2pjY29lZmN0Lm9iaiAramNjb2xvci5vYmogK2pjc2FtcGxlLm9iaiAramNodWZmLm9iaiAramNwaHVmZi5vYmogJgorK2pjZGN0bWdyLm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogK2pmZGN0aW50Lm9iaiAramRhcGltaW4ub2JqICYKKytqZGFwaXN0ZC5vYmogK2pkdHJhbnMub2JqICtqZGF0YXNyYy5vYmogK2pkbWFzdGVyLm9iaiAramRpbnB1dC5vYmogJgorK2pkbWFya2VyLm9iaiAramRodWZmLm9iaiAramRwaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAramRjb2VmY3Qub2JqICYKKytqZHBvc3RjdC5vYmogK2pkZGN0bWdyLm9iaiAramlkY3Rmc3Qub2JqICtqaWRjdGZsdC5vYmogK2ppZGN0aW50Lm9iaiAmCisramlkY3RyZWQub2JqICtqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAranF1YW50Mi5vYmogJgorK2pkbWVyZ2Uub2JqICtqY29tYXBpLm9iaiAranV0aWxzLm9iaiAramVycm9yLm9iaiAram1lbW1nci5vYmogJgorJChTWVNERVBNRU1MSUIpCit8CisKK2NqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5saWIKKwkkKENDKSAkKExERkxBR1MpIC1lY2pwZWcuZXhlICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisKK2RqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKKwkkKENDKSAkKExERkxBR1MpIC1lZGpwZWcuZXhlICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisKK2pwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAtZWpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKworcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5jCishaWYgJGQoRE9TKQorCSQoQ0MpIC1tcyAtTyByZGpwZ2NvbS5jCishZWxzZQorCSQoQ0MpICQoQ0ZMQUdTKSByZGpwZ2NvbS5jCishZW5kaWYKKworIyBPbiBET1MsIHdyanBnY29tIG5lZWRzIGxhcmdlIG1vZGVsIHNvIGl0IGNhbiBtYWxsb2MgYSA2NEsgY2h1bmsKK3dyanBnY29tLmV4ZTogd3JqcGdjb20uYworIWlmICRkKERPUykKKwkkKENDKSAtbWwgLU8gd3JqcGdjb20uYworIWVsc2UKKwkkKENDKSAkKENGTEFHUykgd3JqcGdjb20uYworIWVuZGlmCisKKyMgVGhpcyAie30iIHN5bnRheCBhbGxvd3MgQm9ybGFuZCBNYWtlIHRvICJiYXRjaCIgc291cmNlIGZpbGVzLgorIyBJbiB0aGlzIHdheSwgZWFjaCBydW4gb2YgdGhlIGNvbXBpbGVyIGNhbiBidWlsZCBtYW55IG1vZHVsZXMuCisuYy5vYmo6CisJJChDQykgJChDRkxBR1MpIC1jeyAkPH0KKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKK2NsZWFuOgorCS0gZGVsICoub2JqCisJLSBkZWwgbGlianBlZy5saWIKKwktIGRlbCBjanBlZy5leGUKKwktIGRlbCBkanBlZy5leGUKKwktIGRlbCBqcGVndHJhbi5leGUKKwktIGRlbCByZGpwZ2NvbS5leGUKKwktIGRlbCB3cmpwZ2NvbS5leGUKKwktIGRlbCB0ZXN0b3V0Ki4qCisKK3Rlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCisJLSBkZWwgdGVzdG91dCouKgorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKyFpZiAkZChET1MpCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKyFlbHNlCisJZWNobyBuID4gbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtIDwgbi50bXAKKwljb21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wIDwgbi50bXAKKwljb21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnIDwgbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbSA8IG4udG1wCisJY29tcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnIDwgbi50bXAKKwljb21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcgPCBuLnRtcAorCWRlbCBuLnRtcAorIWVuZGlmCisKKworamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAoram1lbWRvc2Eub2JqOiBqbWVtZG9zYS5hc20KKwl0YXNtIC9teCBqbWVtZG9zYS5hc20KZGlmZiAtLWdpdCBhL2pwZWcvbWFrZWZpbGUuY2ZnIGIvanBlZy9tYWtlZmlsZS5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ZTQyZQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrZWZpbGUuY2ZnCkBAIC0wLDAgKzEsMzE5IEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBtYWtlZmlsZS5jZmcgaXMgZWRpdGVkIGJ5IGNvbmZpZ3VyZSB0byBwcm9kdWNlIGEgY3VzdG9tIE1ha2VmaWxlLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIEZvciBjb21waWxpbmcgd2l0aCBzb3VyY2UgYW5kIG9iamVjdCBmaWxlcyBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuCitzcmNkaXIgPSBAc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCisjIFdoZXJlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBtYW4gcGFnZXMuCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitiaW5kaXIgPSAkKGV4ZWNfcHJlZml4KS9iaW4KK2xpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgoraW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCitiaW5wcmVmaXggPQorbWFucHJlZml4ID0KK21hbmV4dCA9IDEKK21hbmRpciA9ICQocHJlZml4KS9tYW4vbWFuJChtYW5leHQpCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IEBDQ0AKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IEBDRkxBR1NAIEBDUFBGTEFHU0AgQElOQ0xVREVGTEFHU0AKKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKyMgSG93ZXZlciwgYW55IHNwZWNpYWwgZGVmaW5lcyBmb3IgYW5zaTJrbnIuYyBtYXkgYmUgaW5jbHVkZWQgaGVyZToKK0FOU0kyS05SRkxBR1M9IEBBTlNJMktOUkZMQUdTQAorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorTERGTEFHUz0gQExERkxBR1NACisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IEBMSUJTQAorCisjIElmIHVzaW5nIEdOVSBsaWJ0b29sLCBMSUJUT09MIHJlZmVyZW5jZXMgaXQ7IGlmIG5vdCwgTElCVE9PTCBpcyBlbXB0eS4KK0xJQlRPT0wgPSBATElCVE9PTEAKKyMgJChPKSBleHBhbmRzIHRvICJsbyIgaWYgdXNpbmcgbGlidG9vbCwgcGxhaW4gIm8iIGlmIG5vdC4KKyMgU2ltaWxhcmx5LCAkKEEpIGV4cGFuZHMgdG8gImxhIiBvciAiYSIuCitPID0gQE9ACitBID0gQEFACisKKyMgTGlicmFyeSB2ZXJzaW9uIElEOyBsaWJ0b29sIHVzZXMgdGhpcyBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyLgorIyBOb3RlOiB3ZSBzdWdnZXN0IHRoaXMgbWF0Y2ggdGhlIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgaW4ganBlZ2xpYi5oLgorSlBFR19MSUJfVkVSU0lPTiA9IEBKUEVHX0xJQl9WRVJTSU9OQAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAorIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KK1NZU0RFUE1FTT0gQE1FTU9SWU1HUkAKKworIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgorU0hFTEw9IC9iaW4vc2gKKyMgbGlua2VyCitMTj0gQExOQAorIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKK1JNPSBybSAtZgorIyBkaXJlY3RvcnkgY3JlYXRpb24gY29tbWFuZAorTUtESVI9IG1rZGlyCisjIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBhciByYworIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKK0FSMj0gQFJBTkxJQkAKKyMgaW5zdGFsbGF0aW9uIHByb2dyYW0KK0lOU1RBTEw9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9MSUI9IEBJTlNUQUxMX0xJQkAKK0lOU1RBTExfREFUQT0gQElOU1RBTExfREFUQUAKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS4kKE8pIGp1dGlscy4kKE8pIGplcnJvci4kKE8pIGptZW1tZ3IuJChPKSAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi4kKE8pIGpjYXBpc3RkLiQoTykgamN0cmFucy4kKE8pIGpjcGFyYW0uJChPKSBcCisgICAgICAgIGpkYXRhZHN0LiQoTykgamNpbml0LiQoTykgamNtYXN0ZXIuJChPKSBqY21hcmtlci4kKE8pIGpjbWFpbmN0LiQoTykgXAorICAgICAgICBqY3ByZXBjdC4kKE8pIGpjY29lZmN0LiQoTykgamNjb2xvci4kKE8pIGpjc2FtcGxlLiQoTykgamNodWZmLiQoTykgXAorICAgICAgICBqY3BodWZmLiQoTykgamNkY3RtZ3IuJChPKSBqZmRjdGZzdC4kKE8pIGpmZGN0Zmx0LiQoTykgXAorICAgICAgICBqZmRjdGludC4kKE8pCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi4kKE8pIGpkYXBpc3RkLiQoTykgamR0cmFucy4kKE8pIGpkYXRhc3JjLiQoTykgXAorICAgICAgICBqZG1hc3Rlci4kKE8pIGpkaW5wdXQuJChPKSBqZG1hcmtlci4kKE8pIGpkaHVmZi4kKE8pIGpkcGh1ZmYuJChPKSBcCisgICAgICAgIGpkbWFpbmN0LiQoTykgamRjb2VmY3QuJChPKSBqZHBvc3RjdC4kKE8pIGpkZGN0bWdyLiQoTykgXAorICAgICAgICBqaWRjdGZzdC4kKE8pIGppZGN0Zmx0LiQoTykgamlkY3RpbnQuJChPKSBqaWRjdHJlZC4kKE8pIFwKKyAgICAgICAgamRzYW1wbGUuJChPKSBqZGNvbG9yLiQoTykganF1YW50MS4kKE8pIGpxdWFudDIuJChPKSBqZG1lcmdlLiQoTykKKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLiQoTykgcmRwcG0uJChPKSByZGdpZi4kKE8pIHJkdGFyZ2EuJChPKSByZHJsZS4kKE8pIFwKKyAgICAgICAgcmRibXAuJChPKSByZHN3aXRjaC4kKE8pIGNkanBlZy4kKE8pCitET0JKRUNUUz0gZGpwZWcuJChPKSB3cnBwbS4kKE8pIHdyZ2lmLiQoTykgd3J0YXJnYS4kKE8pIHdycmxlLiQoTykgXAorICAgICAgICB3cmJtcC4kKE8pIHJkY29sbWFwLiQoTykgY2RqcGVnLiQoTykKK1RST0JKRUNUUz0ganBlZ3RyYW4uJChPKSByZHN3aXRjaC4kKE8pIGNkanBlZy4kKE8pIHRyYW5zdXBwLiQoTykKKworCithbGw6IEBBMktfREVQU0AgbGlianBlZy4kKEEpIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisKKyMgU3BlY2lhbCBjb21waWxhdGlvbiBydWxlcyB0byBzdXBwb3J0IGFuc2kya25yIGFuZCBsaWJ0b29sLgorLlNVRkZJWEVTOiAubG8gLmxhCisKKyMgSG93IHRvIGNvbXBpbGUgd2l0aCBsaWJ0b29sLgorQENPTV9MVEAuYy5sbzoKK0BDT01fTFRACSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChDRkxBR1MpIC1jICQoc3JjZGlyKS8kKi5jCisKKyMgSG93IHRvIHVzZSBhbnNpMmtuciwgd2hlbiBub3QgdXNpbmcgbGlidG9vbC4KK0BDT01fQTJLQC5jLm86CitAQ09NX0EyS0AJLi9hbnNpMmtuciAkKHNyY2RpcikvJCouYyBrbnIvJCouYworQENPTV9BMktACSQoQ0MpICQoQ0ZMQUdTKSAtYyBrbnIvJCouYworQENPTV9BMktACSQoUk0pIGtuci8kKi5jCisKKyMgSG93IHRvIHVzZSBhbnNpMmtuciBBTkQgbGlidG9vbC4KK0BDT01fQTJLQC5jLmxvOgorQENPTV9BMktACS4vYW5zaTJrbnIgJChzcmNkaXIpLyQqLmMga25yLyQqLmMKK0BDT01fQTJLQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoQ0ZMQUdTKSAtYyBrbnIvJCouYworQENPTV9BMktACSQoUk0pIGtuci8kKi5jCisKK2Fuc2kya25yOiBhbnNpMmtuci5jCisJJChDQykgJChDRkxBR1MpICQoQU5TSTJLTlJGTEFHUykgLW8gYW5zaTJrbnIgJChzcmNkaXIpL2Fuc2kya25yLmMKKwkkKE1LRElSKSBrbnIKKworIyB0aGUgbGlicmFyeToKKworIyB3aXRob3V0IGxpYnRvb2w6CitsaWJqcGVnLmE6IEBBMktfREVQU0AgJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcuYQorCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQorCSQoQVIyKSBsaWJqcGVnLmEKKworIyB3aXRoIGxpYnRvb2w6CitsaWJqcGVnLmxhOiBAQTJLX0RFUFNAICQoTElCT0JKRUNUUykKKwkkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpIC1vIGxpYmpwZWcubGEgJChMSUJPQkpFQ1RTKSBcCisJCS1ycGF0aCAkKGxpYmRpcikgLXZlcnNpb24taW5mbyAkKEpQRUdfTElCX1ZFUlNJT04pCisKKyMgc2FtcGxlIHByb2dyYW1zOgorCitjanBlZzogJChDT0JKRUNUUykgbGlianBlZy4kKEEpCisJJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCisKK2RqcGVnOiAkKERPQkpFQ1RTKSBsaWJqcGVnLiQoQSkKKwkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcuJChBKSAkKExETElCUykKKworanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLiQoQSkKKwkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCisKK3JkanBnY29tOiByZGpwZ2NvbS4kKE8pCisJJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS4kKE8pICQoTERMSUJTKQorCit3cmpwZ2NvbTogd3JqcGdjb20uJChPKQorCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20uJChPKSAkKExETElCUykKKworIyBJbnN0YWxsYXRpb24gcnVsZXM6CisKK2luc3RhbGw6IGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tIEBGT1JDRV9JTlNUQUxMX0xJQkAKKwkkKElOU1RBTExfUFJPR1JBTSkgY2pwZWcgJChiaW5kaXIpLyQoYmlucHJlZml4KWNqcGVnCisJJChJTlNUQUxMX1BST0dSQU0pIGRqcGVnICQoYmluZGlyKS8kKGJpbnByZWZpeClkanBlZworCSQoSU5TVEFMTF9QUk9HUkFNKSBqcGVndHJhbiAkKGJpbmRpcikvJChiaW5wcmVmaXgpanBlZ3RyYW4KKwkkKElOU1RBTExfUFJPR1JBTSkgcmRqcGdjb20gJChiaW5kaXIpLyQoYmlucHJlZml4KXJkanBnY29tCisJJChJTlNUQUxMX1BST0dSQU0pIHdyanBnY29tICQoYmluZGlyKS8kKGJpbnByZWZpeCl3cmpwZ2NvbQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvY2pwZWcuMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpY2pwZWcuJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9kanBlZy4xICQobWFuZGlyKS8kKG1hbnByZWZpeClkanBlZy4kKG1hbmV4dCkKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWd0cmFuLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWpwZWd0cmFuLiQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcmRqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpcmRqcGdjb20uJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS93cmpwZ2NvbS4xICQobWFuZGlyKS8kKG1hbnByZWZpeCl3cmpwZ2NvbS4kKG1hbmV4dCkKKworaW5zdGFsbC1saWI6IGxpYmpwZWcuJChBKSBpbnN0YWxsLWhlYWRlcnMKKwkkKElOU1RBTExfTElCKSBsaWJqcGVnLiQoQSkgJChsaWJkaXIpLyQoYmlucHJlZml4KWxpYmpwZWcuJChBKQorCitpbnN0YWxsLWhlYWRlcnM6IGpjb25maWcuaAorCSQoSU5TVEFMTF9EQVRBKSBqY29uZmlnLmggJChpbmNsdWRlZGlyKS9qY29uZmlnLmgKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWdsaWIuaCAkKGluY2x1ZGVkaXIpL2pwZWdsaWIuaAorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2Rpcikvam1vcmVjZmcuaCAkKGluY2x1ZGVkaXIpL2ptb3JlY2ZnLmgKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2plcnJvci5oICQoaW5jbHVkZWRpcikvamVycm9yLmgKKworY2xlYW46CisJJChSTSkgKi5vICoubG8gbGlianBlZy5hIGxpYmpwZWcubGEKKwkkKFJNKSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQorCSQoUk0pIGFuc2kya25yIGNvcmUgdGVzdG91dCogY29uZmlnLmxvZyBjb25maWcuc3RhdHVzCisJJChSTSkgLXIga25yIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbjogY2xlYW4KKwkkKFJNKSBNYWtlZmlsZSBqY29uZmlnLmggbGlidG9vbCBjb25maWcuY2FjaGUKKwordGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KKwkkKFJNKSB0ZXN0b3V0KgorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZworCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgICQoc3JjZGlyKS90ZXN0aW1nLnBwbQorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gJChzcmNkaXIpL3Rlc3Rwcm9nLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnICQoc3JjZGlyKS90ZXN0aW1nLnBwbQorCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCAkKHNyY2RpcikvdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWNtcCAkKHNyY2RpcikvdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCAkKHNyY2RpcikvdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCitjaGVjazogdGVzdAorCisjIE1pc3Rha2UgY2F0Y2hlcjoKKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKKyMgR05VIE1ha2UgbGlrZXMgdG8ga25vdyB3aGljaCB0YXJnZXQgbmFtZXMgYXJlIG5vdCByZWFsbHkgZmlsZXMgdG8gYmUgbWFkZToKKy5QSE9OWTogYWxsIGluc3RhbGwgaW5zdGFsbC1saWIgaW5zdGFsbC1oZWFkZXJzIGNsZWFuIGRpc3RjbGVhbiB0ZXN0IGNoZWNrCisKKworamNhcGltaW4uJChPKTogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLiQoTyk6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC4kKE8pOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci4kKE8pOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci4kKE8pOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi4kKE8pOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC4kKE8pOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0LiQoTyk6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci4kKE8pOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIuJChPKTogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkuJChPKTogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS4kKE8pOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLiQoTyk6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0LiQoTyk6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS4kKE8pOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy4kKE8pOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi4kKE8pOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQuJChPKTogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0LiQoTyk6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLiQoTyk6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0LiQoTyk6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLiQoTyk6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLiQoTyk6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLiQoTyk6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC4kKE8pOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC4kKE8pOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIuJChPKTogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLiQoTyk6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLiQoTyk6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYuJChPKTogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QuJChPKTogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLiQoTyk6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLiQoTyk6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci4kKE8pOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC4kKE8pOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0LiQoTyk6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQuJChPKTogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC4kKE8pOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0LiQoTyk6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQuJChPKTogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC4kKE8pOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEuJChPKToganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi4kKE8pOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMuJChPKToganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLiQoTyk6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS4kKE8pOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLiQoTyk6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMuJChPKTogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLiQoTyk6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLiQoTyk6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy4kKE8pOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy4kKE8pOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi4kKE8pOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLiQoTyk6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLiQoTyk6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy4kKE8pOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLiQoTyk6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC4kKE8pOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAuJChPKTogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0uJChPKTogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLiQoTyk6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi4kKE8pOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYuJChPKTogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EuJChPKTogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS4kKE8pOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC4kKE8pOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAuJChPKTogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLiQoTyk6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS4kKE8pOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvanBlZy9tYWtlZmlsZS5kaiBiL2pwZWcvbWFrZWZpbGUuZGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2NmQyNQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrZWZpbGUuZGoKQEAgLTAsMCArMSwyMjAgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgZm9yIERKR1BQIChEZWxvcmllJ3MgR05VIEMgcG9ydCBvbiBNUy1ET1MpLCB2Mi4wIG9yIGxhdGVyLgorIyBUaGFua3MgdG8gRnJhbmsgSi4gRG9uYWhvZSBmb3IgdGhpcyB2ZXJzaW9uLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBnY2MKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IC1PMiAtV2FsbCAtSS4KKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IC1zCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgREpHUFAgdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgY291bGQKKyMgdXNlIGptZW1uYW1lLm8gaWYgeW91IHdhbnQgdG8gdXNlIG5hbWVkIHRlbXAgZmlsZXMgaW5zdGVhZCBvZiBzd2FwIHNwYWNlLgorU1lTREVQTUVNPSBqbWVtbm9icy5vCisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKKyMgbGlua2VyCitMTj0gJChDQykKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gZGVsCisjIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBhciByYworIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKK0FSMj0gcmFubGliCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCisgICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAorICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCisgICAgICAgIGpmZGN0aW50Lm8KKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKKyAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCisgICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gamlkY3RpbnQubyBqaWRjdHJlZC5vIFwKKyAgICAgICAgamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCisgICAgICAgIGNkanBlZy5vCitET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK1RST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KKworCithbGw6IGxpYmpwZWcuYSBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCisKK2xpYmpwZWcuYTogJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcuYQorCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQorCSQoQVIyKSBsaWJqcGVnLmEKKworY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCisKK2RqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZy5leGUgJChET0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitqcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCityZGpwZ2NvbS5leGU6IHJkanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tLmV4ZSByZGpwZ2NvbS5vICQoTERMSUJTKQorCit3cmpwZ2NvbS5leGU6IHdyanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tLmV4ZSB3cmpwZ2NvbS5vICQoTERMSUJTKQorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJJChSTSkgKi5vCisJJChSTSkgY2pwZWcuZXhlCisJJChSTSkgZGpwZWcuZXhlCisJJChSTSkganBlZ3RyYW4uZXhlCisJJChSTSkgcmRqcGdjb20uZXhlCisJJChSTSkgd3JqcGdjb20uZXhlCisJJChSTSkgbGlianBlZy5hCisJJChSTSkgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQorCSQoUk0pIHRlc3RvdXQqLioKKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworCitqY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoranF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2ptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2NqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2RqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAorcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAord3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3Jkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCityZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9qcGVnL21ha2VmaWxlLm1hbnggYi9qcGVnL21ha2VmaWxlLm1hbngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiNDJkMQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrZWZpbGUubWFueApAQCAtMCwwICsxLDIxNCBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgQW1pZ2Egc3lzdGVtcyB1c2luZyBNYW54IEF6dGVjIEMgdmVyIDUueC4KKyMgVGhhbmtzIHRvIEQuSi4gSmFtZXMgKGRqamFtZXNAY3VwLnBvcnRhbC5jb20pIGZvciB0aGlzIHZlcnNpb24uCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IGNjCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorIyBVbmNvbW1lbnQgZm9yIGdlbmVyaWMgNjgwMDAgY29kZSAod2lsbCB3b3JrIG9uIGFueSBBbWlnYSkKK0FSQ0hGTEFHUz0gLXNuCisKKyMgVW5jb21tZW50IGZvciA2ODAyMC82ODAzMCBjb2RlIChmYXN0ZXIsIGJ1dCB3b24ndCBydW4gb24gNjgwMDAgQ1BVKQorI0FSQ0hGTEFHUz0gLWMyCisKK0NGTEFHUz0gLU1DIC1NRCAkKEFSQ0hGTEFHUykgLXNwZmFtIC1yNAorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorTERGTEFHUz0gLWcKKworIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KK0xETElCUz0gLWxtbCAtbGNsCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBBbWlnYSB3ZSByZWNvbW1lbmQgam1lbW5hbWUuby4KK1NZU0RFUE1FTT0gam1lbW5hbWUubworCisjIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCisjIGxpbmtlcgorTE49IGxuCisjIGZpbGUgZGVsZXRpb24gY29tbWFuZAorUk09IGRlbGV0ZSBxdWlldAorIyBsaWJyYXJ5ICgubGliKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBsYgorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAorICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKKyAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAorICAgICAgICBqZmRjdGludC5vCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCisgICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAorICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCisgICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCisgICAgICAgIGNkanBlZy5vCitET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK1RST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KKworCithbGw6IGxpYmpwZWcubGliIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCisJLSQoUk0pIGxpYmpwZWcubGliCisJJChBUikgbGlianBlZy5saWIgICQoTElCT0JKRUNUUykKKworY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworZGpwZWc6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4gJChUUk9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQorCityZGpwZ2NvbTogcmRqcGdjb20ubworCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKKword3JqcGdjb206IHdyanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCitjbGVhbjoKKwktJChSTSkgKi5vIGNqcGVnIGRqcGVnIGpwZWd0cmFuIGxpYmpwZWcubGliIHJkanBnY29tIHdyanBnY29tCisJLSQoUk0pIGNvcmUgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgorCS0kKFJNKSB0ZXN0b3V0Ki4qCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvanBlZy9tYWtlZmlsZS5tYzYgYi9qcGVnL21ha2VmaWxlLm1jNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWZmMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9tYWtlZmlsZS5tYzYKQEAgLTAsMCArMSwyNDkgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgZm9yIE1pY3Jvc29mdCBDIGZvciBNUy1ET1MsIHZlcnNpb24gNi4wMEEgYW5kIHVwLgorIyBVc2UgTk1BS0UsIG5vdCBNaWNyb3NvZnQncyBicmFpbi1kYW1hZ2VkIE1BS0UuCisjIFRoYW5rcyB0byBBbGFuIFdyaWdodCBhbmQgQ2hyaXMgVHVybmVyIG9mIE9saXZldHRpIFJlc2VhcmNoIEx0ZC4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibm1ha2UiICEhCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjb21waWxlciBvcHRpb25zOgorQ0ZMQUdTID0gLUFNIC1PZWNpZ3QgLUdzIC1XMworIyAtQU0gbWVkaXVtIG1lbW9yeSBtb2RlbCAob3IgdXNlIC1BUyBmb3Igc21hbGwgbW9kZWwsIGlmIHlvdSByZW1vdmUgZmVhdHVyZXMpCisjIC1PZWNpZ3QgLUdzICBtYXhpbXVtIHNhZmUgb3B0aW1pc2F0aW9uICgtT2wgaGFzIGJ1Z3MgaW4gTVNDIDYuMDBBKQorIyAtVzMgd2FybmluZyBsZXZlbCAzCisjIFlvdSBtaWdodCBhbHNvIHdhbnQgdG8gYWRkIC1HMiBpZiB5b3UgaGF2ZSBhbiA4MDI4NiwgZXRjLgorIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKKyMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgorCisjIEphbi1IZXJtYW4gQnVpbmluZyBzdWdnZXN0cyB0aGUgZm9sbG93aW5nIHN3aXRjaGVzIGZvciBNUyBDIDguMCBhbmQgYSA0ODY6CisjIENGTEFHUyA9IC9BTSAvZi0gL0ZQaTg3IC9HMyAvR3MgL0d5IC9PYjEgL09jIC9PZSAvT2cgL09pIC9PbCAvT24gL09vIC9PdCBcCisjICAgICAgICAgIC9PVjQgL1czCisjIGV4Y2VwdCBmb3IganF1YW50MS5jLCB3aGljaCBtdXN0IGJlIGNvbXBpbGVkIHdpdGggL09vLSB0byBhdm9pZCBhIGNvbXBpbGVyCisjIGNyYXNoLgorCisjIEluZ2FyIFN0ZWluc2xhbmQgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyB3aGVuIGJ1aWxkaW5nCisjIGEgMTYtYml0IFdpbmRvd3MgRExMOgorIyBDRkxBR1MgPSAtQUx3IC1Hc3cgLVpwZSAtVzMgLU8yIC1aaSAtWmQKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIERPUywgd2UgcmVjb21tZW5kIGptZW1kb3MuYyBhbmQgam1lbWRvc2EuYXNtLgorIyAoQnV0IG5vdCBmb3IgV2luZG93czsgc2VlIGluc3RhbGwuZG9jIGlmIHlvdSB1c2UgdGhpcyBtYWtlZmlsZSBmb3IgV2luZG93cy4pCitTWVNERVBNRU09IGptZW1kb3Mub2JqIGptZW1kb3NhLm9iagorIyBTWVNERVBNRU1MSUIgbXVzdCBsaXN0IHRoZSBzYW1lIGZpbGVzIHdpdGggIisiIHNpZ25zIGZvciB0aGUgbGlicmFyaWFuLgorU1lTREVQTUVNTElCPSAram1lbWRvcy5vYmogK2ptZW1kb3NhLm9iagorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAorICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCisgICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCisgICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagorIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAorICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAorICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKKyAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKKyAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCitMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCisjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCitDT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCisgICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCitET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCisgICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCitUUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKKworIyBuZWVkIGxpbmtlciByZXNwb25zZSBmaWxlIGJlY2F1c2UgZmlsZSBsaXN0ID4gMTI4IGNoYXJzCitSRklMRSA9IGxpYmpwZWcuYW5zCisKKworYWxsOiBsaWJqcGVnLmxpYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpICQoUkZJTEUpCisJZGVsIGxpYmpwZWcubGliCisJbGliIEAkKFJGSUxFKQorCisjIGxpbmtlciByZXNwb25zZSBmaWxlIGZvciBidWlsZGluZyBsaWJqcGVnLmxpYgorJChSRklMRSkgOiBtYWtlZmlsZQorCWRlbCAkKFJGSUxFKQorCWVjaG8gbGlianBlZy5saWIgPiQoUkZJTEUpCisjIHNpbGx5IHdhbnQtdG8tY3JlYXRlLWl0IHByb21wdDoKKwllY2hvIHkgPj4kKFJGSUxFKQorCWVjaG8gK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY3RyYW5zLm9iaiAramNwYXJhbS5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramRhdGFkc3Qub2JqICtqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqY21haW5jdC5vYmogK2pjcHJlcGN0Lm9iaiAramNjb2VmY3Qub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pjY29sb3Iub2JqICtqY3NhbXBsZS5vYmogK2pjaHVmZi5vYmogK2pjcGh1ZmYub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pjZGN0bWdyLm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramZkY3RpbnQub2JqICtqZGFwaW1pbi5vYmogK2pkYXBpc3RkLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICtqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pkbWFya2VyLm9iaiAramRodWZmLm9iaiAramRwaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqZGNvZWZjdC5vYmogK2pkcG9zdGN0Lm9iaiAramRkY3RtZ3Iub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2ppZGN0ZnN0Lm9iaiAramlkY3RmbHQub2JqICtqaWRjdGludC5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramlkY3RyZWQub2JqICtqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqcXVhbnQyLm9iaiAramRtZXJnZS5vYmogK2pjb21hcGkub2JqICtqdXRpbHMub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gJChTWVNERVBNRU1MSUIpIDsgPj4kKFJGSUxFKQorCitjanBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJZWNobyAkKENPQkpFQ1RTKSA+Y2pwZWcubHN0CisJbGluayAvU1RBQ0s6NDA5NiAvRVhFUEFDSyBAY2pwZWcubHN0LCBjanBlZy5leGUsICwgbGlianBlZy5saWIsIDsKKwlkZWwgY2pwZWcubHN0CisKK2RqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKKwllY2hvICQoRE9CSkVDVFMpID5kanBlZy5sc3QKKwlsaW5rIC9TVEFDSzo0MDk2IC9FWEVQQUNLIEBkanBlZy5sc3QsIGRqcGVnLmV4ZSwgLCBsaWJqcGVnLmxpYiwgOworCWRlbCBkanBlZy5sc3QKKworanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwlsaW5rIC9TVEFDSzo0MDk2IC9FWEVQQUNLICQoVFJPQkpFQ1RTKSwganBlZ3RyYW4uZXhlLCAsIGxpYmpwZWcubGliLCA7CisKK3JkanBnY29tLmV4ZTogcmRqcGdjb20uYworCSQoQ0MpIC1BUyAtTyAtVzMgcmRqcGdjb20uYworCisjIHdyanBnY29tIG5lZWRzIGxhcmdlIG1vZGVsIHNvIGl0IGNhbiBtYWxsb2MgYSA2NEsgY2h1bmsKK3dyanBnY29tLmV4ZTogd3JqcGdjb20uYworCSQoQ0MpIC1BTCAtTyAtVzMgd3JqcGdjb20uYworCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJZGVsICoub2JqCisJZGVsIGxpYmpwZWcubGliCisJZGVsIGNqcGVnLmV4ZQorCWRlbCBkanBlZy5leGUKKwlkZWwganBlZ3RyYW4uZXhlCisJZGVsIHJkanBnY29tLmV4ZQorCWRlbCB3cmpwZ2NvbS5leGUKKwlkZWwgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQorCWRlbCB0ZXN0b3V0Ki4qCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAoram1lbWRvc2Eub2JqIDogam1lbWRvc2EuYXNtCisJbWFzbSAvbXggJCo7CmRpZmYgLS1naXQgYS9qcGVnL21ha2VmaWxlLm1tcyBiL2pwZWcvbWFrZWZpbGUubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTMwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VmaWxlLm1tcwpAQCAtMCwwICsxLDIxOCBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgdXNlIHdpdGggTU1TIG9uIERpZ2l0YWwgVk1TIHN5c3RlbXMuCisjIFRoYW5rcyB0byBSaWNrIER5c29uIChkeXNvbkBpb3dhc3AucGh5c2ljcy51aW93YS5lZHUpCisjIGFuZCBUaW0gQmVsbCAodGJlbGxAbmV0Y29tLmNvbSkgZm9yIHRoZWlyIGhlbHAuCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIk1NUyIgISEKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9ICQoQ0ZMQUdTKSAvTm9EZWJ1ZyAvT3B0aW1pemUKKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgL0RlZmluZSBzd2l0Y2hlcyBoZXJlLgorLmlmZGVmIEFMUEhBCitPUFQ9CisuZWxzZQorT1BUPSAsU3lzJERpc2s6W11NQUtWTVMuT1BUL09wdGlvbgorLmVuZGlmCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50CisjIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKKyAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAorICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAorICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKKyAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCisgICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCisgICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLm9sYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAorICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagorRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAorICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagorVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCisjIG9iamVjdGZpbGUgbGlzdHMgd2l0aCBjb21tYXMgLS0tIHdoYXQgYSBjcm9jaworQ09CSkxJU1Q9IGNqcGVnLm9iaixyZHBwbS5vYmoscmRnaWYub2JqLHJkdGFyZ2Eub2JqLHJkcmxlLm9iaixyZGJtcC5vYmosXAorICAgICAgICAgIHJkc3dpdGNoLm9iaixjZGpwZWcub2JqCitET0JKTElTVD0gZGpwZWcub2JqLHdycHBtLm9iaix3cmdpZi5vYmosd3J0YXJnYS5vYmosd3JybGUub2JqLHdyYm1wLm9iaixcCisgICAgICAgICAgcmRjb2xtYXAub2JqLGNkanBlZy5vYmoKK1RST0JKTElTVD0ganBlZ3RyYW4ub2JqLHJkc3dpdGNoLm9iaixjZGpwZWcub2JqLHRyYW5zdXBwLm9iagorTElCT0JKTElTVD0gamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY3RyYW5zLm9iaixqY3BhcmFtLm9iaixqZGF0YWRzdC5vYmosXAorICAgICAgICAgIGpjaW5pdC5vYmosamNtYXN0ZXIub2JqLGpjbWFya2VyLm9iaixqY21haW5jdC5vYmosamNwcmVwY3Qub2JqLFwKKyAgICAgICAgICBqY2NvZWZjdC5vYmosamNjb2xvci5vYmosamNzYW1wbGUub2JqLGpjaHVmZi5vYmosamNwaHVmZi5vYmosXAorICAgICAgICAgIGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLGpmZGN0aW50Lm9iaixqZGFwaW1pbi5vYmosXAorICAgICAgICAgIGpkYXBpc3RkLm9iaixqZHRyYW5zLm9iaixqZGF0YXNyYy5vYmosamRtYXN0ZXIub2JqLGpkaW5wdXQub2JqLFwKKyAgICAgICAgICBqZG1hcmtlci5vYmosamRodWZmLm9iaixqZHBodWZmLm9iaixqZG1haW5jdC5vYmosamRjb2VmY3Qub2JqLFwKKyAgICAgICAgICBqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaixqaWRjdGZsdC5vYmosamlkY3RpbnQub2JqLFwKKyAgICAgICAgICBqaWRjdHJlZC5vYmosamRzYW1wbGUub2JqLGpkY29sb3Iub2JqLGpxdWFudDEub2JqLGpxdWFudDIub2JqLFwKKyAgICAgICAgICBqZG1lcmdlLm9iaixqY29tYXBpLm9iaixqdXRpbHMub2JqLGplcnJvci5vYmosam1lbW1nci5vYmosJChTWVNERVBNRU0pCisKKworLmZpcnN0CisJQC0gRGVmaW5lIC9Ob0xvZyBTeXMgU3lzJExpYnJhcnkKKworQUxMIDogbGlianBlZy5vbGIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCUAgQ29udGludWUKKworbGlianBlZy5vbGIgOiAkKExJQk9CSkVDVFMpCisJTGlicmFyeSAvQ3JlYXRlIGxpYmpwZWcub2xiICQoTElCT0JKTElTVCkKKworY2pwZWcuZXhlIDogJChDT0JKRUNUUykgbGlianBlZy5vbGIKKwkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IGNqcGVnLmV4ZSAkKENPQkpMSVNUKSxsaWJqcGVnLm9sYi9MaWJyYXJ5JChPUFQpCisKK2RqcGVnLmV4ZSA6ICQoRE9CSkVDVFMpIGxpYmpwZWcub2xiCisJJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSBkanBlZy5leGUgJChET0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQorCitqcGVndHJhbi5leGUgOiAkKFRST0JKRUNUUykgbGlianBlZy5vbGIKKwkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IGpwZWd0cmFuLmV4ZSAkKFRST0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQorCityZGpwZ2NvbS5leGUgOiByZGpwZ2NvbS5vYmoKKwkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IHJkanBnY29tLmV4ZSByZGpwZ2NvbS5vYmokKE9QVCkKKword3JqcGdjb20uZXhlIDogd3JqcGdjb20ub2JqCisJJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSB3cmpwZ2NvbS5leGUgd3JqcGdjb20ub2JqJChPUFQpCisKK2pjb25maWcuaCA6IGpjb25maWcudm1zCisJQC0gQ29weSBqY29uZmlnLnZtcyBqY29uZmlnLmgKKworY2xlYW4gOgorCUAtIFNldCBQcm90ZWN0aW9uID0gT3duZXI6UldFRCAqLio7LTEKKwlALSBTZXQgUHJvdGVjdGlvbiA9IE93bmVyOlJXRUQgKi5PQkoKKwktIFB1cmdlIC9Ob0xvZyAvTm9Db25maXJtICouKgorCS0gRGVsZXRlIC9Ob0xvZyAvTm9Db25maXJtICouT0JKOworCit0ZXN0IDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKKwltY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtIHRlc3RvcmlnLmpwZworCW1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgdGVzdG9yaWcuanBnCisJbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgICAgICAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyB0ZXN0aW1nLnBwbQorCW1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCW1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCW1jciBzeXMkZGlzazpbXWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCisJLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCisJLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm9iaiA6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vYmogOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqIDogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3Iub2JqIDogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3Iub2JqIDogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqIDogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQub2JqIDogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vYmogOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqIDogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm9iaiA6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm9iaiA6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqIDogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vYmogOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vYmogOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqIDogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMub2JqIDogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ub2JqIDogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iaiA6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vYmogOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vYmogOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmogOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vYmogOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vYmogOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmogOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQub2JqIDogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3Qub2JqIDogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iaiA6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vYmogOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vYmogOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iaiA6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm9iaiA6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vYmogOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmogOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3Iub2JqIDogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQub2JqIDogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmogOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm9iaiA6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQub2JqIDogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmogOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm9iaiA6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQub2JqIDogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iaiA6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIub2JqIDoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm9iaiA6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmogOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kub2JqIDogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vYmogOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iaiA6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vYmogOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vYmogOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqIDogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcub2JqIDogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ub2JqIDoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmogOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vYmogOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcub2JqIDogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmogOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gub2JqIDogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm9iaiA6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iaiA6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vYmogOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYub2JqIDogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iaiA6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm9iaiA6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eub2JqIDogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqIDogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm9iaiA6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vYmogOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqIDogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2pwZWcvbWFrZWZpbGUuc2FzIGIvanBlZy9tYWtlZmlsZS5zYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5NmZhZgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrZWZpbGUuc2FzCkBAIC0wLDAgKzEsMjUyIEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIFNBUyBDIDYuMCBhbmQgdXAuCisjIFRoYW5rcyB0byBFZCBIYW53YXksIE1hcmsgUmluZnJldCwgYW5kIEppbSBaZXBlZGEuCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IHNjCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgZ2VuZXJpYyA2ODB4MCB2ZXJzaW9uCitBUkNIRkxBR1M9IGNwdT1hbnkKK1NVRkZJWD0KKworIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgNjgwMzAtb25seSB2ZXJzaW9uCisjQVJDSEZMQUdTPSBjcHU9NjgwMzAKKyNTVUZGSVg9LjAzMAorCitDRkxBR1M9IG5vc3RhY2tjaGVjayBkYXRhPW5lYXIgcGFybXM9cmVnaXN0ZXIgb3B0aW1pemUgJChBUkNIRkxBR1MpIFwKKwlpZ25vcmU9MTA0IGlnbm9yZT0zMDQgaWdub3JlPTMwNgorIyBpZ25vcmU9MTA0IGRpc2FibGVzIHdhcm5pbmdzIGZvciBtaXNtYXRjaGVkIGNvbnN0IHF1YWxpZmllcnMKKyMgaWdub3JlPTMwNCBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIGJlaW5nIG9wdGltaXplZCBvdXQKKyMgaWdub3JlPTMwNiBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgdGhlIGlubGluaW5nIG9mIGZ1bmN0aW9ucworIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKKyMgTk9UIHZpYSBkZWZpbmUgc3dpdGNoZXMgaGVyZS4KKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IFNDIFNEIE5EIEJBVENICisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IExJQjpzY20ubGliIExJQjpzYy5saWIKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIEFtaWdhIHdlIHJlY29tbWVuZCBqbWVtbmFtZS5vLgorU1lTREVQTUVNPSBqbWVtbmFtZS5vCisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKKyMgbGlua2VyCitMTj0gc2xpbmsKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gZGVsZXRlIHF1aWV0CisjIGxpYnJhcnkgKC5saWIpIGZpbGUgY3JlYXRpb24gY29tbWFuZAorQVI9IG9tbAorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAorICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKKyAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAorICAgICAgICBqZmRjdGludC5vCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCisgICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAorICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCisgICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCisgICAgICAgIGNkanBlZy5vCitET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK1RST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KKworCithbGw6IGxpYmpwZWcubGliIGNqcGVnJChTVUZGSVgpIGRqcGVnJChTVUZGSVgpIGpwZWd0cmFuJChTVUZGSVgpIHJkanBnY29tJChTVUZGSVgpIHdyanBnY29tJChTVUZGSVgpCisKKyMgbm90ZTogZG8gc2V2ZXJhbCBBUiBzdGVwcyB0byBhdm9pZCBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0YXRpb25zCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCisJLSQoUk0pIGxpYmpwZWcubGliCisJJChBUikgbGlianBlZy5saWIgciAkKENMSUJPQkpFQ1RTKQorCSQoQVIpIGxpYmpwZWcubGliIHIgJChETElCT0JKRUNUUykKKwkkKEFSKSBsaWJqcGVnLmxpYiByICQoQ09NT0JKRUNUUykKKworY2pwZWckKFNVRkZJWCk6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgPFdJVEggPAorJChMREZMQUdTKQorVE8gY2pwZWckKFNVRkZJWCkKK0ZST00gTElCOmMubyAkKENPQkpFQ1RTKQorTElCIGxpYmpwZWcubGliICQoTERMSUJTKQorPAorCitkanBlZyQoU1VGRklYKTogJChET0JKRUNUUykgbGlianBlZy5saWIKKwkkKExOKSA8V0lUSCA8CiskKExERkxBR1MpCitUTyBkanBlZyQoU1VGRklYKQorRlJPTSBMSUI6Yy5vICQoRE9CSkVDVFMpCitMSUIgbGlianBlZy5saWIgJChMRExJQlMpCis8CisKK2pwZWd0cmFuJChTVUZGSVgpOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwkkKExOKSA8V0lUSCA8CiskKExERkxBR1MpCitUTyBqcGVndHJhbiQoU1VGRklYKQorRlJPTSBMSUI6Yy5vICQoVFJPQkpFQ1RTKQorTElCIGxpYmpwZWcubGliICQoTERMSUJTKQorPAorCityZGpwZ2NvbSQoU1VGRklYKTogcmRqcGdjb20ubworCSQoTE4pIDxXSVRIIDwKKyQoTERGTEFHUykKK1RPIHJkanBnY29tJChTVUZGSVgpCitGUk9NIExJQjpjLm8gcmRqcGdjb20ubworTElCICQoTERMSUJTKQorPAorCit3cmpwZ2NvbSQoU1VGRklYKTogd3JqcGdjb20ubworCSQoTE4pIDxXSVRIIDwKKyQoTERGTEFHUykKK1RPIHdyanBnY29tJChTVUZGSVgpCitGUk9NIExJQjpjLm8gd3JqcGdjb20ubworTElCICQoTERMSUJTKQorPAorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJLSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBjanBlZy4wMzAgZGpwZWcuMDMwIGpwZWd0cmFuLjAzMAorCS0kKFJNKSByZGpwZ2NvbSB3cmpwZ2NvbSByZGpwZ2NvbS4wMzAgd3JqcGdjb20uMDMwCisJLSQoUk0pIGxpYmpwZWcubGliIGNvcmUgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgorCS0kKFJNKSB0ZXN0b3V0Ki4qCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvanBlZy9tYWtlZmlsZS51bml4IGIvanBlZy9tYWtlZmlsZS51bml4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDU1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VmaWxlLnVuaXgKQEAgLTAsMCArMSwyMjggQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIHdpdGggbm9uLUFOU0kgY29tcGlsZXJzLgorIyBJZiB5b3UgaGF2ZSBhbiBBTlNJIGNvbXBpbGVyLCBtYWtlZmlsZS5hbnNpIGlzIGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50LgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBjYworCisjIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKK0NGTEFHUz0gLU8KKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKyMgSG93ZXZlciwgYW55IHNwZWNpYWwgZGVmaW5lcyBmb3IgYW5zaTJrbnIuYyBtYXkgYmUgaW5jbHVkZWQgaGVyZToKK0FOU0kyS05SRkxBR1M9IAorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorTERGTEFHUz0gCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAorIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KK1NZU0RFUE1FTT0gam1lbW5vYnMubworCisjIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCisjIGxpbmtlcgorTE49ICQoQ0MpCisjIGZpbGUgZGVsZXRpb24gY29tbWFuZAorUk09IHJtIC1mCisjIGZpbGUgcmVuYW1lIGNvbW1hbmQKK01WPSBtdgorIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCitBUj0gYXIgcmMKKyMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCitBUjI9IHJhbmxpYgorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAorICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKKyAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAorICAgICAgICBqZmRjdGludC5vCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCisgICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAorICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCisgICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAorICAgICAgICBjZGpwZWcubworRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCisgICAgICAgIGNkanBlZy5vCitUUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCisKKworYWxsOiBhbnNpMmtuciBsaWJqcGVnLmEgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KKworIyBUaGlzIHJ1bGUgY2F1c2VzIGFuc2kya25yIHRvIGJlIGludm9rZWQuCisuYy5vOgorCS4vYW5zaTJrbnIgJCouYyBUJCouYworCSQoQ0MpICQoQ0ZMQUdTKSAtYyBUJCouYworCSQoUk0pIFQkKi5jICQqLm8KKwkkKE1WKSBUJCoubyAkKi5vCisKK2Fuc2kya25yOiBhbnNpMmtuci5jCisJJChDQykgJChDRkxBR1MpICQoQU5TSTJLTlJGTEFHUykgLW8gYW5zaTJrbnIgYW5zaTJrbnIuYworCitsaWJqcGVnLmE6IGFuc2kya25yICQoTElCT0JKRUNUUykKKwkkKFJNKSBsaWJqcGVnLmEKKwkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKKwkkKEFSMikgbGlianBlZy5hCisKK2NqcGVnOiBhbnNpMmtuciAkKENPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnICQoQ09CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworZGpwZWc6IGFuc2kya25yICQoRE9CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcgJChET0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitqcGVndHJhbjogYW5zaTJrbnIgJChUUk9CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4gJChUUk9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworcmRqcGdjb206IHJkanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tIHJkanBnY29tLm8gJChMRExJQlMpCisKK3dyanBnY29tOiB3cmpwZ2NvbS5vCisJJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbSB3cmpwZ2NvbS5vICQoTERMSUJTKQorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJJChSTSkgKi5vIGNqcGVnIGRqcGVnIGpwZWd0cmFuIGxpYmpwZWcuYSByZGpwZ2NvbSB3cmpwZ2NvbQorCSQoUk0pIGFuc2kya25yIGNvcmUgdGVzdG91dCoKKwordGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KKwkkKFJNKSB0ZXN0b3V0KgorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJLi9kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJLi9janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KKwkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2pwZWcvbWFrZWZpbGUudmMgYi9qcGVnL21ha2VmaWxlLnZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2YwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VmaWxlLnZjCkBAIC0wLDAgKzEsMjExIEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIE5UIChhbmQgOTU/KS4KKyMgSXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyeSAoLkxJQiksCisjIGFuZCBidWlsZHMgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgYXMgY29uc29sZS1tb2RlIGFwcHMuCisjIFRoYW5rcyB0byBYaW5nb25nIENoYW5nLCBSYXltb25kIEV2ZXJseSBhbmQgb3RoZXJzLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJubWFrZSIgISEKKyMgVG8gYnVpbGQgYW4gb3B0aW1pemVkIGxpYnJhcnkgd2l0aG91dCBkZWJ1ZyBpbmZvLCBzYXkgIm5tYWtlIG5vZGVidWc9MSIuCisKKyMgUHVsbCBpbiBzdGFuZGFyZCB2YXJpYWJsZSBkZWZpbml0aW9ucworIWluY2x1ZGUgPHdpbjMyLm1haz4KKworIyBZb3UgbWF5IHdhbnQgdG8gYWRqdXN0IHRoZXNlIGNvbXBpbGVyIG9wdGlvbnM6CitDRkxBR1M9ICQoY2ZsYWdzKSAkKGNkZWJ1ZykgJChjdmFycykgLUkuCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIG9wdGlvbnM6CitMREZMQUdTPSAkKGxkZWJ1ZykgJChjb25sZmxhZ3MpCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IGNvbW1hbmRzIGhlcmUuCitMRExJQlM9ICQoY29ubGlicykKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIE5UIHdlIHN1Z2dlc3Qgam1lbW5vYnMub2JqLCB3aGljaCBleHBlY3RzIHRoZSBPUyB0bworIyBwcm92aWRlIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5LgorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKKworIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgorIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKK1JNPSBkZWwKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKKyAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAorICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAorICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKKyAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCisgICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCisgICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAorICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagorRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAorICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagorVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCisKKyMgVGVtcGxhdGUgY29tbWFuZCBmb3IgY29tcGlsaW5nIC5jIHRvIC5vYmoKKy5jLm9iajoKKwkkKGNjKSAkKENGTEFHUykgJCouYworCisKK2FsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcubGliCisJbGliIC1vdXQ6bGlianBlZy5saWIgICQoTElCT0JKRUNUUykKKworY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQobGluaykgJChMREZMQUdTKSAtb3V0OmNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQobGluaykgJChMREZMQUdTKSAtb3V0OmRqcGVnLmV4ZSAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwkkKGxpbmspICQoTERGTEFHUykgLW91dDpqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQorCityZGpwZ2NvbS5leGU6IHJkanBnY29tLm9iagorCSQobGluaykgJChMREZMQUdTKSAtb3V0OnJkanBnY29tLmV4ZSByZGpwZ2NvbS5vYmogJChMRExJQlMpCisKK3dyanBnY29tLmV4ZTogd3JqcGdjb20ub2JqCisJJChsaW5rKSAkKExERkxBR1MpIC1vdXQ6d3JqcGdjb20uZXhlIHdyanBnY29tLm9iaiAkKExETElCUykKKworCitjbGVhbjoKKwkkKFJNKSAqLm9iaiAqLmV4ZSBsaWJqcGVnLmxpYgorCSQoUk0pIHRlc3RvdXQqCisKK3Rlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCisJJChSTSkgdGVzdG91dCoKKwkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCS5cZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJLlxjanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCS5cY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJLlxqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworCitqY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramVycm9yLm9iajogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGludC5vYmo6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2RqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAord3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3Jkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9qcGVnL21ha2VmaWxlLnZtcyBiL2pwZWcvbWFrZWZpbGUudm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjM1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VmaWxlLnZtcwpAQCAtMCwwICsxLDE0MiBAQAorJCEgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorJCEKKyQhIFRoaXMgaXMgYSBjb21tYW5kIHByb2NlZHVyZSBmb3IgRGlnaXRhbCBWTVMgc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIE1NUy4KKyQhIEl0IGJ1aWxkcyB0aGUgSlBFRyBzb2Z0d2FyZSBieSBicnV0ZSBmb3JjZSwgcmVjb21waWxpbmcgZXZlcnl0aGluZyB3aGV0aGVyCiskISBvciBub3QgaXQgaXMgbmVjZXNzYXJ5LiAgSXQgdGhlbiBydW5zIHRoZSBiYXNpYyBzZWxmLXRlc3QuCiskISBUaGFua3MgdG8gUmljayBEeXNvbiAoZHlzb25AaW93YXNwLnBoeXNpY3MudWlvd2EuZWR1KQorJCEgYW5kIFRpbSBCZWxsICh0YmVsbEBuZXRjb20uY29tKSBmb3IgdGhlaXIgaGVscC4KKyQhCiskISBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHJ1bm5pbmcgdGhpcyEhCiskIQorJCBJZiBGJE1vZGUgKCkgLmVxcy4gIklOVEVSQUNUSVZFIgorJCAgIFRoZW4KKyQgICAgICAgVkVSSUZZID0gRiRWZXJpZnkgKDApCiskICAgRWxzZQorJCAgICAgICBWRVJJRlkgPSBGJFZlcmlmeSAoMSkKKyQgRW5kSWYKKyQgT24gQ29udHJvbF9ZIFRoZW4gR29UbyBFbmQKKyQgT24gRXJyb3IgICAgIFRoZW4gR29UbyBFbmQKKyQKKyQgSWYgRiRHZXRTeWkgKCJIV19NT0RFTCIpIC5ndC4gMTAyMyAKKyQgICBUaGVuCiskICAgICAgIE9QVCA9ICIiCiskICAgRWxzZQorJCAgICAgICBPUFQgPSAiLFN5cyREaXNrOltdbWFrdm1zLm9wdC9PcHRpb24iCiskIEVuZElmCiskIAorJCBEb0NvbXBpbGUgOj0gQ0MgL05vRGVidWcgL09wdGltaXplIC9Ob0xpc3QKKyQhCiskIERvQ29tcGlsZSBqY2FwaW1pbi5jCiskIERvQ29tcGlsZSBqY2FwaXN0ZC5jCiskIERvQ29tcGlsZSBqY3RyYW5zLmMKKyQgRG9Db21waWxlIGpjcGFyYW0uYworJCBEb0NvbXBpbGUgamRhdGFkc3QuYworJCBEb0NvbXBpbGUgamNpbml0LmMKKyQgRG9Db21waWxlIGpjbWFzdGVyLmMKKyQgRG9Db21waWxlIGpjbWFya2VyLmMKKyQgRG9Db21waWxlIGpjbWFpbmN0LmMKKyQgRG9Db21waWxlIGpjcHJlcGN0LmMKKyQgRG9Db21waWxlIGpjY29lZmN0LmMKKyQgRG9Db21waWxlIGpjY29sb3IuYworJCBEb0NvbXBpbGUgamNzYW1wbGUuYworJCBEb0NvbXBpbGUgamNodWZmLmMKKyQgRG9Db21waWxlIGpjcGh1ZmYuYworJCBEb0NvbXBpbGUgamNkY3RtZ3IuYworJCBEb0NvbXBpbGUgamZkY3Rmc3QuYworJCBEb0NvbXBpbGUgamZkY3RmbHQuYworJCBEb0NvbXBpbGUgamZkY3RpbnQuYworJCBEb0NvbXBpbGUgamRhcGltaW4uYworJCBEb0NvbXBpbGUgamRhcGlzdGQuYworJCBEb0NvbXBpbGUgamR0cmFucy5jCiskIERvQ29tcGlsZSBqZGF0YXNyYy5jCiskIERvQ29tcGlsZSBqZG1hc3Rlci5jCiskIERvQ29tcGlsZSBqZGlucHV0LmMKKyQgRG9Db21waWxlIGpkbWFya2VyLmMKKyQgRG9Db21waWxlIGpkaHVmZi5jCiskIERvQ29tcGlsZSBqZHBodWZmLmMKKyQgRG9Db21waWxlIGpkbWFpbmN0LmMKKyQgRG9Db21waWxlIGpkY29lZmN0LmMKKyQgRG9Db21waWxlIGpkcG9zdGN0LmMKKyQgRG9Db21waWxlIGpkZGN0bWdyLmMKKyQgRG9Db21waWxlIGppZGN0ZnN0LmMKKyQgRG9Db21waWxlIGppZGN0Zmx0LmMKKyQgRG9Db21waWxlIGppZGN0aW50LmMKKyQgRG9Db21waWxlIGppZGN0cmVkLmMKKyQgRG9Db21waWxlIGpkc2FtcGxlLmMKKyQgRG9Db21waWxlIGpkY29sb3IuYworJCBEb0NvbXBpbGUganF1YW50MS5jCiskIERvQ29tcGlsZSBqcXVhbnQyLmMKKyQgRG9Db21waWxlIGpkbWVyZ2UuYworJCBEb0NvbXBpbGUgamNvbWFwaS5jCiskIERvQ29tcGlsZSBqdXRpbHMuYworJCBEb0NvbXBpbGUgamVycm9yLmMKKyQgRG9Db21waWxlIGptZW1tZ3IuYworJCBEb0NvbXBpbGUgam1lbW5vYnMuYworJCEKKyQgTGlicmFyeSAvQ3JlYXRlIGxpYmpwZWcub2xiICBqY2FwaW1pbi5vYmosamNhcGlzdGQub2JqLGpjdHJhbnMub2JqLCAtCisgICAgICAgICAgamNwYXJhbS5vYmosamRhdGFkc3Qub2JqLGpjaW5pdC5vYmosamNtYXN0ZXIub2JqLGpjbWFya2VyLm9iaiwgLQorICAgICAgICAgIGpjbWFpbmN0Lm9iaixqY3ByZXBjdC5vYmosamNjb2VmY3Qub2JqLGpjY29sb3Iub2JqLGpjc2FtcGxlLm9iaiwgLQorICAgICAgICAgIGpjaHVmZi5vYmosamNwaHVmZi5vYmosamNkY3RtZ3Iub2JqLGpmZGN0ZnN0Lm9iaixqZmRjdGZsdC5vYmosIC0KKyAgICAgICAgICBqZmRjdGludC5vYmosamRhcGltaW4ub2JqLGpkYXBpc3RkLm9iaixqZHRyYW5zLm9iaixqZGF0YXNyYy5vYmosIC0KKyAgICAgICAgICBqZG1hc3Rlci5vYmosamRpbnB1dC5vYmosamRtYXJrZXIub2JqLGpkaHVmZi5vYmosamRwaHVmZi5vYmosIC0KKyAgICAgICAgICBqZG1haW5jdC5vYmosamRjb2VmY3Qub2JqLGpkcG9zdGN0Lm9iaixqZGRjdG1nci5vYmosamlkY3Rmc3Qub2JqLCAtCisgICAgICAgICAgamlkY3RmbHQub2JqLGppZGN0aW50Lm9iaixqaWRjdHJlZC5vYmosamRzYW1wbGUub2JqLGpkY29sb3Iub2JqLCAtCisgICAgICAgICAganF1YW50MS5vYmosanF1YW50Mi5vYmosamRtZXJnZS5vYmosamNvbWFwaS5vYmosanV0aWxzLm9iaiwgLQorICAgICAgICAgIGplcnJvci5vYmosam1lbW1nci5vYmosam1lbW5vYnMub2JqCiskIQorJCBEb0NvbXBpbGUgY2pwZWcuYworJCBEb0NvbXBpbGUgcmRwcG0uYworJCBEb0NvbXBpbGUgcmRnaWYuYworJCBEb0NvbXBpbGUgcmR0YXJnYS5jCiskIERvQ29tcGlsZSByZHJsZS5jCiskIERvQ29tcGlsZSByZGJtcC5jCiskIERvQ29tcGlsZSByZHN3aXRjaC5jCiskIERvQ29tcGlsZSBjZGpwZWcuYworJCEKKyQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBjanBlZy5leGUgIGNqcGVnLm9iaixyZHBwbS5vYmoscmRnaWYub2JqLCAtCisgICAgICAgICAgcmR0YXJnYS5vYmoscmRybGUub2JqLHJkYm1wLm9iaixyZHN3aXRjaC5vYmosY2RqcGVnLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKKyQhCiskIERvQ29tcGlsZSBkanBlZy5jCiskIERvQ29tcGlsZSB3cnBwbS5jCiskIERvQ29tcGlsZSB3cmdpZi5jCiskIERvQ29tcGlsZSB3cnRhcmdhLmMKKyQgRG9Db21waWxlIHdycmxlLmMKKyQgRG9Db21waWxlIHdyYm1wLmMKKyQgRG9Db21waWxlIHJkY29sbWFwLmMKKyQgRG9Db21waWxlIGNkanBlZy5jCiskIQorJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IGRqcGVnLmV4ZSAgZGpwZWcub2JqLHdycHBtLm9iaix3cmdpZi5vYmosIC0KKyAgICAgICAgICB3cnRhcmdhLm9iaix3cnJsZS5vYmosd3JibXAub2JqLHJkY29sbWFwLm9iaixjZGpwZWcub2JqLGxpYmpwZWcub2xiL0xpYnJhcnknT1BUJworJCEKKyQgRG9Db21waWxlIGpwZWd0cmFuLmMKKyQgRG9Db21waWxlIHJkc3dpdGNoLmMKKyQgRG9Db21waWxlIGNkanBlZy5jCiskIERvQ29tcGlsZSB0cmFuc3VwcC5jCiskIQorJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IGpwZWd0cmFuLmV4ZSAganBlZ3RyYW4ub2JqLHJkc3dpdGNoLm9iaiwgLQorICAgICAgICAgIGNkanBlZy5vYmosdHJhbnN1cHAub2JqLGxpYmpwZWcub2xiL0xpYnJhcnknT1BUJworJCEKKyQgRG9Db21waWxlIHJkanBnY29tLmMKKyQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSByZGpwZ2NvbS5leGUgIHJkanBnY29tLm9iaidPUFQnCiskIQorJCBEb0NvbXBpbGUgd3JqcGdjb20uYworJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IHdyanBnY29tLmV4ZSAgd3JqcGdjb20ub2JqJ09QVCcKKyQhCiskISBSdW4gdGhlIHNlbGYtdGVzdAorJCEKKyQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSB0ZXN0b3JpZy5qcGcKKyQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCB0ZXN0b3JpZy5qcGcKKyQgbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgICAgICAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyB0ZXN0aW1nLnBwbQorJCBtY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKyQgbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCiskIG1jciBzeXMkZGlzazpbXWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKyQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCiskIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKyQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKyQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCiskIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworJCEKKyRFbmQ6CiskICAgSWYgVmVyaWZ5IFRoZW4gU2V0IFZlcmlmeQorJCBFeGl0CmRpZmYgLS1naXQgYS9qcGVnL21ha2VmaWxlLndhdCBiL2pwZWcvbWFrZWZpbGUud2F0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTNlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VmaWxlLndhdApAQCAtMCwwICsxLDIzMyBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBzdWl0YWJsZSBmb3IgV2F0Y29tIEMvQysrIDEwLjAgb24gTVMtRE9TICh1c2luZworIyBkb3M0ZyBleHRlbmRlciksIE9TLzIsIGFuZCBXaW5kb3dzIE5UIGNvbnNvbGUgbW9kZS4KKyMgVGhhbmtzIHRvIEphbm9zIEhhaWRlLCBqaGFpZGVAYnRydnRlY2guY29tLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJ3bWFrZSIgISEKKworIyBVbmNvbW1lbnQgbGluZSBmb3IgZGVzaXJlZCBzeXN0ZW0KK1NZU1RFTT1ET1MKKyNTWVNURU09T1MyCisjU1lTVEVNPU5UCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IHdjbDM4NgorCisjIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKK0NGTEFHUz0gLTRyIC1vcnQgLXd4IC16cSAtYnQ9JChTWVNURU0pCisjIENhdXRpb246IGF2b2lkIC1vbCBvciAtb3g7IHRoZXNlIGdlbmVyYXRlIGJhZCBjb2RlIHdpdGggMTAuMCBvciAxMC4wYS4KKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKKyFpZmVxIFNZU1RFTSBET1MKK0xERkxBR1M9IC16cSAtbD1kb3M0ZworIWVsc2UgaWZlcSBTWVNURU0gT1MyCitMREZMQUdTPSAtenEgLWw9b3MydjIKKyFlbHNlIGlmZXEgU1lTVEVNIE5UCitMREZMQUdTPSAtenEgLWw9bnQKKyFlbmRpZgorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBqbWVtbm9icyBzaG91bGQgd29yayBmaW5lIGZvciBkb3M0ZyBvciBPUy8yIGVudmlyb25tZW50LgorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jICYKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyAmCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyAmCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jICYKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgJgorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyAmCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgJgorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jICYKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyAmCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggJgorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSAmCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyAmCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyAmCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyAmCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCAmCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgJgorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCAmCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgJgorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyAmCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSAmCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqICYKKyAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogJgorICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogJgorICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqICYKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqICYKKyAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiAmCisgICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiAmCisgICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogJgorICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagorRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogJgorICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagorVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCisKKworYWxsOiBsaWJqcGVnLmxpYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCisJLSBkZWwgbGlianBlZy5saWIKKwkqIHdsaWIgLW4gbGlianBlZy5saWIgJChMSUJPQkpFQ1RTKQorCitjanBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCitkanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCitqcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoQ0MpICQoTERGTEFHUykgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisKK3JkanBnY29tLmV4ZTogcmRqcGdjb20uYworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHJkanBnY29tLmMKKword3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5jCisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgd3JqcGdjb20uYworCisuYy5vYmo6CisJJChDQykgJChDRkxBR1MpIC1jICQ8CisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCitjbGVhbjogLlNZTUJPTElDCisJLSBkZWwgKi5vYmoKKwktIGRlbCBsaWJqcGVnLmxpYgorCS0gZGVsIGNqcGVnLmV4ZQorCS0gZGVsIGRqcGVnLmV4ZQorCS0gZGVsIGpwZWd0cmFuLmV4ZQorCS0gZGVsIHJkanBnY29tLmV4ZQorCS0gZGVsIHdyanBnY29tLmV4ZQorCS0gZGVsIHRlc3RvdXQqLioKKwordGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgIC5TWU1CT0xJQworCS0gZGVsIHRlc3RvdXQqLioKKwlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKKwlkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKKwljanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KKwlqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCishaWZlcSBTWVNURU0gRE9TCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKyFlbHNlCisJZWNobyBuID4gbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtIDwgbi50bXAKKwljb21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wIDwgbi50bXAKKwljb21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnIDwgbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbSA8IG4udG1wCisJY29tcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnIDwgbi50bXAKKwljb21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcgPCBuLnRtcAorCWRlbCBuLnRtcAorIWVuZGlmCisKKworamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvanBlZy9tYWtlbGliLmRzIGIvanBlZy9tYWtlbGliLmRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWQzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL21ha2VsaWIuZHMKQEAgLTAsMCArMSwxMDQ2IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjIwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKKworIUlGICIkKENGRykiID09ICIiCitDRkc9anBlZyAtIFdpbjMyCishTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8ganBlZyAtIFdpbjMyLgorIUVORElGIAorCishSUYgIiQoQ0ZHKSIgIT0gImpwZWcgLSBXaW4zMiIKKyFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImpwZWcubWFrIiBDRkc9ImpwZWcgLSBXaW4zMiIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgCishRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KKyFFTkRJRiAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorIUVMU0UgCitOVUxMPW51bAorIUVORElGIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgImpwZWcgLSBXaW4zMiIKK0NQUD1jbC5leGUKKworIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK09VVERJUj0uXFJlbGVhc2UKK0lOVERJUj0uXFJlbGVhc2UKKworQUxMIDogIiQoT1VURElSKVxqcGVnLmxpYiIKKworQ0xFQU4gOiAKKwktQGVyYXNlICIkKElOVERJUilcamNhcGltaW4ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjdHJhbnMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY3BhcmFtLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRhdGFkc3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2luaXQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY21hc3Rlci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjbWFya2VyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNtYWluY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjY29lZmN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNjb2xvci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjc2FtcGxlLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNodWZmLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNwaHVmZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamZkY3Rmc3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0aW50Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRhcGltaW4ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkdHJhbnMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRpbnB1dC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWFya2VyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRodWZmLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRwaHVmZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRjb2VmY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZHBvc3RjdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkZGN0bWdyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamlkY3Rmc3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGppZGN0aW50Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamlkY3RyZWQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkY29sb3Iub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqcXVhbnQxLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcanF1YW50Mi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWVyZ2Uub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY29tYXBpLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcanV0aWxzLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamVycm9yLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcam1lbW1nci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGptZW1ub2JzLm9iaiIKKwktQGVyYXNlICIkKE9VVERJUilcanBlZy5saWIiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIlwKKyAvRnAiJChJTlRESVIpL2pwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9LlxSZWxlYXNlLworQ1BQX1NCUlM9LlwuCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9qcGVnLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0xJQjMyX0ZMQUdTPS9ub2xvZ28gL291dDoiJChPVVRESVIpL2pwZWcubGliIiAKK0xJQjMyX09CSlM9IFwKKwkiJChJTlRESVIpXGpjYXBpbWluLm9iaiIgXAorCSIkKElOVERJUilcamNhcGlzdGQub2JqIiBcCisJIiQoSU5URElSKVxqY3RyYW5zLm9iaiIgXAorCSIkKElOVERJUilcamNwYXJhbS5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgXAorCSIkKElOVERJUilcamNpbml0Lm9iaiIgXAorCSIkKElOVERJUilcamNtYXN0ZXIub2JqIiBcCisJIiQoSU5URElSKVxqY21hcmtlci5vYmoiIFwKKwkiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgXAorCSIkKElOVERJUilcamNwcmVwY3Qub2JqIiBcCisJIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIFwKKwkiJChJTlRESVIpXGpjY29sb3Iub2JqIiBcCisJIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIFwKKwkiJChJTlRESVIpXGpjaHVmZi5vYmoiIFwKKwkiJChJTlRESVIpXGpjcGh1ZmYub2JqIiBcCisJIiQoSU5URElSKVxqY2RjdG1nci5vYmoiIFwKKwkiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgXAorCSIkKElOVERJUilcamZkY3RmbHQub2JqIiBcCisJIiQoSU5URElSKVxqZmRjdGludC5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXBpbWluLm9iaiIgXAorCSIkKElOVERJUilcamRhcGlzdGQub2JqIiBcCisJIiQoSU5URElSKVxqZHRyYW5zLm9iaiIgXAorCSIkKElOVERJUilcamRhdGFzcmMub2JqIiBcCisJIiQoSU5URElSKVxqZG1hc3Rlci5vYmoiIFwKKwkiJChJTlRESVIpXGpkaW5wdXQub2JqIiBcCisJIiQoSU5URElSKVxqZG1hcmtlci5vYmoiIFwKKwkiJChJTlRESVIpXGpkaHVmZi5vYmoiIFwKKwkiJChJTlRESVIpXGpkcGh1ZmYub2JqIiBcCisJIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIFwKKwkiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgXAorCSIkKElOVERJUilcamRwb3N0Y3Qub2JqIiBcCisJIiQoSU5URElSKVxqZGRjdG1nci5vYmoiIFwKKwkiJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgXAorCSIkKElOVERJUilcamlkY3RmbHQub2JqIiBcCisJIiQoSU5URElSKVxqaWRjdGludC5vYmoiIFwKKwkiJChJTlRESVIpXGppZGN0cmVkLm9iaiIgXAorCSIkKElOVERJUilcamRzYW1wbGUub2JqIiBcCisJIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgXAorCSIkKElOVERJUilcanF1YW50MS5vYmoiIFwKKwkiJChJTlRESVIpXGpxdWFudDIub2JqIiBcCisJIiQoSU5URElSKVxqZG1lcmdlLm9iaiIgXAorCSIkKElOVERJUilcamNvbWFwaS5vYmoiIFwKKwkiJChJTlRESVIpXGp1dGlscy5vYmoiIFwKKwkiJChJTlRESVIpXGplcnJvci5vYmoiIFwKKwkiJChJTlRESVIpXGptZW1tZ3Iub2JqIiBcCisJIiQoSU5URElSKVxqbWVtbm9icy5vYmoiCisKKyIkKE9VVERJUilcanBlZy5saWIiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSUIzMl9PQkpTKQorICAgICQoTElCMzIpIEA8PAorICAkKExJQjMyX0ZMQUdTKSAkKERFRl9GTEFHUykgJChMSUIzMl9PQkpTKQorPDwKKworIUVORElGIAorCisuY3skKENQUF9PQkpTKX0ub2JqOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmNwcHskKENQUF9PQkpTKX0ub2JqOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmN4eHskKENQUF9PQkpTKX0ub2JqOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmN7JChDUFBfU0JSUyl9LnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jcHB7JChDUFBfU0JSUyl9LnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeHh7JChDUFBfU0JSUyl9LnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImpwZWcgLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgorCishRU5ESUYgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNhcGltaW4uYyIKK0RFUF9DUFBfSkNBUEk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY2FwaW1pbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2FwaXN0ZC5jIgorREVQX0NQUF9KQ0FQSVM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSVMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNjb2VmY3QuYyIKK0RFUF9DUFBfSkNDT0U9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2NvbG9yLmMiCitERVBfQ1BQX0pDQ09MPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNjb2xvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPTCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2RjdG1nci5jIgorREVQX0NQUF9KQ0RDVD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDRENUKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjaHVmZi5jIgorREVQX0NQUF9KQ0hVRj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqY2h1ZmYuaCJcCisJCisKKyIkKElOVERJUilcamNodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDSFVGKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjaW5pdC5jIgorREVQX0NQUF9KQ0lOST1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjaW5pdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0lOSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY21haW5jdC5jIgorREVQX0NQUF9KQ01BST1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDTUFJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjbWFya2VyLmMiCitERVBfQ1BQX0pDTUFSPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNtYXJrZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNNQVIpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNtYXN0ZXIuYyIKK0RFUF9DUFBfSkNNQVM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ01BUykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY29tYXBpLmMiCitERVBfQ1BQX0pDT01BPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNvbWFwaS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ09NQSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY3BhcmFtLmMiCitERVBfQ1BQX0pDUEFSPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNwYXJhbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1BBUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY3BodWZmLmMiCitERVBfQ1BQX0pDUEhVPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpjaHVmZi5oIlwKKwkKKworIiQoSU5URElSKVxqY3BodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDUEhVKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjcHJlcGN0LmMiCitERVBfQ1BQX0pDUFJFPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNwcmVwY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNQUkUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNzYW1wbGUuYyIKK0RFUF9DUFBfSkNTQU09XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1NBTSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY3RyYW5zLmMiCitERVBfQ1BQX0pDVFJBPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamN0cmFucy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1RSQSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGFwaW1pbi5jIgorREVQX0NQUF9KREFQST1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXBpbWluLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkYXBpc3RkLmMiCitERVBfQ1BQX0pEQVBJUz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXBpc3RkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJUykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGF0YWRzdC5jIgorREVQX0NQUF9KREFUQT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkYXRhc3JjLmMiCitERVBfQ1BQX0pEQVRBUz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXRhc3JjLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBUykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGNvZWZjdC5jIgorREVQX0NQUF9KRENPRT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09FKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkY29sb3IuYyIKK0RFUF9DUFBfSkRDT0w9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09MKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkZGN0bWdyLmMiCitERVBfQ1BQX0pERENUPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkY3QuaCJcCisJCisKKyIkKElOVERJUilcamRkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkREQ1QpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRodWZmLmMiCitERVBfQ1BQX0pESFVGPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkaHVmZi5oIlwKKwkKKworIiQoSU5URElSKVxqZGh1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRIVUYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRpbnB1dC5jIgorREVQX0NQUF9KRElOUD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkaW5wdXQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRJTlApICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRtYWluY3QuYyIKK0RFUF9DUFBfSkRNQUk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1BSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZG1hcmtlci5jIgorREVQX0NQUF9KRE1BUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkbWFya2VyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUFSKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkbWFzdGVyLmMiCitERVBfQ1BQX0pETUFTPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamRtYXN0ZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNQVMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRtZXJnZS5jIgorREVQX0NQUF9KRE1FUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkbWVyZ2Uub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNRVIpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRwaHVmZi5jIgorREVQX0NQUF9KRFBIVT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGh1ZmYuaCJcCisJCisKKyIkKElOVERJUilcamRwaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFBIVSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZHBvc3RjdC5jIgorREVQX0NQUF9KRFBPUz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEUE9TKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Impkc2FtcGxlLmMiCitERVBfQ1BQX0pEU0FNPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamRzYW1wbGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRTQU0pICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamR0cmFucy5jIgorREVQX0NQUF9KRFRSQT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkdHJhbnMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRUUkEpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamVycm9yLmMiCitERVBfQ1BQX0pFUlJPPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqdmVyc2lvbi5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGplcnJvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRVJSTykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZmRjdGZsdC5jIgorREVQX0NQUF9KRkRDVD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGpmZGN0Zmx0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENUKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpmZGN0ZnN0LmMiCitERVBfQ1BQX0pGRENURj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENURikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZmRjdGludC5jIgorREVQX0NQUF9KRkRDVEk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqZmRjdGludC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRkRDVEkpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamlkY3RmbHQuYyIKK0RFUF9DUFBfSklEQ1Q9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqaWRjdGZzdC5jIgorREVQX0NQUF9KSURDVEY9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVEYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamlkY3RpbnQuYyIKK0RFUF9DUFBfSklEQ1RJPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkY3QuaCJcCisJCisKKyIkKElOVERJUilcamlkY3RpbnQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1RJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImppZGN0cmVkLmMiCitERVBfQ1BQX0pJRENUUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGppZGN0cmVkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENUUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqcXVhbnQxLmMiCitERVBfQ1BQX0pRVUFOPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcanF1YW50MS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUVVBTikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqcXVhbnQyLmMiCitERVBfQ1BQX0pRVUFOVD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpxdWFudDIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlFVQU5UKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Imp1dGlscy5jIgorREVQX0NQUF9KVVRJTD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGp1dGlscy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KVVRJTCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqbWVtbWdyLmMiCitERVBfQ1BQX0pNRU1NPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImptZW1zeXMuaCJcCisJCisKKyIkKElOVERJUilcam1lbW1nci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KTUVNTSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqbWVtbm9icy5jIgorREVQX0NQUF9KTUVNTj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqbWVtc3lzLmgiXAorCQorCisiJChJTlRESVIpXGptZW1ub2JzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pNRU1OKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKZGlmZiAtLWdpdCBhL2pwZWcvbWFrZXByb2oubWFjIGIvanBlZy9tYWtlcHJvai5tYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyNzdjOAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrZXByb2oubWFjCkBAIC0wLDAgKzEsMjEzIEBACistLQorLS0gbWFrZXByb2oubWFjCistLQorLS0gVGhpcyBBcHBsZVNjcmlwdCBidWlsZHMgQ29kZSBXYXJyaW9yIFBSTyBSZWxlYXNlIDIgcHJvamVjdCBmaWxlcyBmb3IgdGhlCistLSBsaWJqcGVnIGxpYnJhcnkgYXMgd2VsbCBhcyB0aGUgdGVzdCBwcm9ncmFtcyAnY2pwZWcnLCAnZGpwZWcnLCAnanBlZ3RyYW4nLgorLS0gKFdlJ2QgZGlzdHJpYnV0ZSByZWFsIHByb2plY3QgZmlsZXMsIGV4Y2VwdCB0aGV5J3JlIG5vdCB0ZXh0CistLSBhbmQgd291bGQgY3JlYXRlIG1haW50ZW5hbmNlIGhlYWRhY2hlcy4pCistLQorLS0gVGhlIHNjcmlwdCB0aGVuIGNvbXBpbGVzIGFuZCBsaW5rcyB0aGUgbGlicmFyeSBhbmQgdGhlIHRlc3QgcHJvZ3JhbXMuCistLSBOT1RFOiBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5IGNyZWF0ZWQgYSAnamNvbmZpZy5oJyBmaWxlLCB0aGUgc2NyaXB0CistLSBhdXRvbWF0aWNhbGx5IGNvcGllcyAnamNvbmZpZy5tYWMnIHRvICdqY29uZmlnLmgnLgorLS0KKy0tIFRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaGF2ZSBBcHBsZVNjcmlwdCAxLjEgb3IgbGF0ZXIgaW5zdGFsbGVkCistLSBhbmQgYSBzdWl0YWJsZSBBcHBsZVNjcmlwdCBlZGl0b3IgbGlrZSBTY3JpcHQgRWRpdG9yIG9yIFNjcmlwdCBEZWJ1Z2dlcgorLS0gKGh0dHA6Ly93d3cubGF0ZW5pZ2h0c3cuY29tKS4gT3BlbiB0aGlzIGZpbGUgd2l0aCB5b3VyIEFwcGxlU2NyaXB0CistLSBlZGl0b3IgYW5kIGV4ZWN1dGUgdGhlICJydW4iIGNvbW1hbmQgdG8gYnVpbGQgdGhlIHByb2plY3RzLgorLS0KKy0tIFRoYW5rcyB0byBEYW4gU2VhcnMgYW5kIERvbiBBZ3JvIGZvciB0aGlzIHNjcmlwdC4KKy0tIFF1ZXN0aW9ucyBhYm91dCB0aGlzIHNjcmlwdCBjYW4gYmUgYWRkcmVzc2VkIHRvIGRvZ3BhcmtAaW50ZXJsb2cuY29tCistLQorCitvbiBydW4KKworCWNob29zZSBmb2xkZXIgd2l0aCBwcm9tcHQgIj4+PiBTZWxlY3QgSUpHIHNvdXJjZSBmb2xkZXIgPDw8IgorCXNldCBpamdfZm9sZGVyIHRvIHJlc3VsdAorCisJY2hvb3NlIGZvbGRlciB3aXRoIHByb21wdCAiPj4+IFNlbGVjdCBNZXRyb1dlcmtzIGZvbGRlciA8PDwiCisJc2V0IGN3X2ZvbGRlciB0byByZXN1bHQKKworCS0tIGlmIGpjb25maWcuaCBkb2Vzbid0IGFscmVhZHkgZXhpc3QsIGNvcHkgamNvbmZpZy5tYWMKKworCXRlbGwgYXBwbGljYXRpb24gIkZpbmRlciIKKwkJaWYgbm90IChleGlzdHMgZmlsZSAiamNvbmZpZy5oIiBvZiBpamdfZm9sZGVyKSB0aGVuCisJCQlkdXBsaWNhdGUge2ZpbGUgImpjb25maWcubWFjIiBvZiBmb2xkZXIgaWpnX2ZvbGRlcn0KKwkJCXNlbGVjdCBmaWxlICJqY29uZmlnLm1hYyBjb3B5IiBvZiBmb2xkZXIgaWpnX2ZvbGRlcgorCQkJc2V0IG5hbWUgb2Ygc2VsZWN0aW9uIHRvICJqY29uZmlnLmgiCisJCWVuZCBpZgorCWVuZCB0ZWxsCisKKwl0ZWxsIGFwcGxpY2F0aW9uICJDb2RlV2FycmlvciBJREUgMi4xIgorCSAgd2l0aCB0aW1lb3V0IG9mIDEwMDAwIHNlY29uZHMKKworCQktLSBjcmVhdGUgbGlianBlZyBwcm9qZWN0CisKKwkJYWN0aXZhdGUKKwkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnLnByb2oiCisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImxpYmpwZWcifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJsaWJqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7UHJvamVjdCBUeXBlOmxpYnJhcnl9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9CisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNhcGltaW4uYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjYXBpc3RkLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3RyYW5zLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3BhcmFtLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGF0YWRzdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNpbml0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY21hc3Rlci5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNtYXJrZXIuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjbWFpbmN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3ByZXBjdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNjb2VmY3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjY29sb3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjc2FtcGxlLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2h1ZmYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjcGh1ZmYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjZGN0bWdyLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZmRjdGZzdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamZkY3RmbHQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpmZGN0aW50LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGFwaW1pbi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhcGlzdGQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkdHJhbnMuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkYXRhc3JjLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZG1hc3Rlci5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRpbnB1dC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYXJrZXIuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkaHVmZi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRwaHVmZi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYWluY3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkY29lZmN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHBvc3RjdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRkY3RtZ3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0ZnN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdGZsdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamlkY3RpbnQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0cmVkLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHNhbXBsZS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRjb2xvci5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianF1YW50MS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianF1YW50Mi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtZXJnZS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNvbWFwaS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianV0aWxzLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZXJyb3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImptZW1tZ3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImptZW1tYWMuYyIgVG8gU2VnbWVudCAxCisKKwkJLS0gY29tcGlsZSBhbmQgbGluayB0aGUgbGlicmFyeQorCisJCU1ha2UgUHJvamVjdAorCQlDbG9zZSBQcm9qZWN0CisKKwkJLS0gY3JlYXRlIGNqcGVnIHByb2plY3QKKworCQlhY3RpdmF0ZQorCQlDcmVhdGUgUHJvamVjdCAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNqcGVnLnByb2oiCisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImNqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToiY2pwZWcifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge0xpbmtlcjoiTWFjT1MgUFBDIExpbmtlciJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9CisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiY2pwZWcuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkcHBtLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZGdpZi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmR0YXJnYS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRybGUuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkYm1wLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZHN3aXRjaC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiY2RqcGVnLmMiIFRvIFNlZ21lbnQgMQorCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImxpYmpwZWciIFRvIFNlZ21lbnQgMgorCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBDLlBQQy5MaWIiIFRvIFNlZ21lbnQgMworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgU0lPVVguUFBDLkxpYiIgVG8gU2VnbWVudCAzCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBSdW50aW1lUFBDLkxpYiIgVG8gU2VnbWVudCAzCisKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpJbnRlcmZhY2VMaWIiIFRvIFNlZ21lbnQgNAorCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOk1hdGhMaWIiIFRvIFNlZ21lbnQgNAorCisJCS0tIGNvbXBpbGUgYW5kIGxpbmsgY2pwZWcKKworCQlNYWtlIFByb2plY3QKKwkJQ2xvc2UgUHJvamVjdAorCisJCS0tIGNyZWF0ZSBkanBlZyBwcm9qZWN0CisKKwkJYWN0aXZhdGUKKwkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJkanBlZy5wcm9qIgorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJkanBlZyJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIFByb2plY3QiIHRvIHtGaWxlIE5hbWU6ImRqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQorCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImRqcGVnLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnBwbS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JnaWYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndydGFyZ2EuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndycmxlLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cmJtcC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRjb2xtYXAuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKKworCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnIiBUbyBTZWdtZW50IDIKKworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgQy5QUEMuTGliIiBUbyBTZWdtZW50IDMKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIFNJT1VYLlBQQy5MaWIiIFRvIFNlZ21lbnQgMworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6UnVudGltZTpSdW50aW1lIFBQQzpNU0wgUnVudGltZVBQQy5MaWIiIFRvIFNlZ21lbnQgMworCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246SW50ZXJmYWNlTGliIiBUbyBTZWdtZW50IDQKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpNYXRoTGliIiBUbyBTZWdtZW50IDQKKworCQktLSBjb21waWxlIGFuZCBsaW5rIGRqcGVnCisKKwkJTWFrZSBQcm9qZWN0CisJCUNsb3NlIFByb2plY3QKKworCQktLSBjcmVhdGUganBlZ3RyYW4gcHJvamVjdAorCisJCWFjdGl2YXRlCisJCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianBlZ3RyYW4ucHJvaiIKKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtUYXJnZXQgTmFtZToianBlZ3RyYW4ifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJqcGVndHJhbiJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0FOU0kgU3RyaWN0OnRydWV9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtFbnVtcyBBbHdheXMgSW50czp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBDb2RlZ2VuIiB0byB7U3RydWN0IEFsaWdubWVudDpQb3dlclBDfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBMaW5rZXIiIHRvIHtHZW5lcmF0ZSBTWU0gRmlsZTpmYWxzZX0KKworCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqcGVndHJhbi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRzd2l0Y2guYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAidHJhbnN1cHAuYyIgVG8gU2VnbWVudCAxCisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZyIgVG8gU2VnbWVudCAyCisKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIEMuUFBDLkxpYiIgVG8gU2VnbWVudCAzCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBTSU9VWC5QUEMuTGliIiBUbyBTZWdtZW50IDMKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIFJ1bnRpbWVQUEMuTGliIiBUbyBTZWdtZW50IDMKKworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOkludGVyZmFjZUxpYiIgVG8gU2VnbWVudCA0CisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246TWF0aExpYiIgVG8gU2VnbWVudCA0CisKKwkJLS0gY29tcGlsZSBhbmQgbGluayBqcGVndHJhbgorCisJCU1ha2UgUHJvamVjdAorCQlDbG9zZSBQcm9qZWN0CisKKwkJcXVpdAorCisJICBlbmQgdGltZW91dAorCWVuZCB0ZWxsCitlbmQgcnVuCmRpZmYgLS1naXQgYS9qcGVnL21ha2xqcGVnLnN0IGIvanBlZy9tYWtsanBlZy5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM0OTNlCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9tYWtsanBlZy5zdApAQCAtMCwwICsxLDcwIEBACis7IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCis7Cis7IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KKzsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKKzsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCis7IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KKzsKKzsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGxpYmpwZWcucHJqLgorOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQorOworOworOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCitsaWJqcGVnLmxpYgorOworOyAqICogKiBDT01QSUxFUiBPUFRJT05TICogKiAqICAKKy5DWy1QXSAgICAgICAgOyBhYnNvbHV0ZSBjYWxscworLkNbLU1dICAgICAgICA7IGFuZCBubyBzdHJpbmcgbWVyZ2luZywgZm9sa3MKKy5DWy13LWNsbl0gICAgOyBubyAiY29uc3RhbnQgaXMgbG9uZyIgd2FybmluZ3MKKy5DWy13LXBhcl0gICAgOyBubyAicGFyYW1ldGVyIHh4eHggdW51c2VkIgorLkNbLXctcmNoXSAgICA7IG5vICJ1bnJlYWNoYWJsZSBjb2RlIgorLkNbLXdzaWddICAgICA7IHdhcm4gaWYgc2lnbmlmaWNhbnQgZGlnaXRzIG1heSBiZSBsb3N0CisuTFstSl0gICAgICAgIDsgbGluayBuZXcgT2JqLWZvcm1hdCAoc28gd2UgZ2V0IGEgbGlicmFyeSkKKz0KKzsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK2pjYXBpbWluLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjYXBpc3RkLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjY29lZmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjY29sb3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNkY3RtZ3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2pjaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamNodWZmLmgpCitqY2luaXQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNtYWluY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNtYXJrZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNtYXN0ZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNvbWFwaS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqY3BhcmFtLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjcGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpjaHVmZi5oKQoramNwcmVwY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNzYW1wbGUuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramN0cmFucy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGFwaW1pbi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGFwaXN0ZC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGF0YWRzdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCkKK2pkYXRhc3JjLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oKQoramRjb2VmY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRjb2xvci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGRjdG1nci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramRodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGh1ZmYuaCkKK2pkaW5wdXQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtYWluY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtYXJrZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtYXN0ZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtZXJnZS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZHBodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGh1ZmYuaCkKK2pkcG9zdGN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkc2FtcGxlLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkdHJhbnMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramVycm9yLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGp2ZXJzaW9uLmgsamVycm9yLmgpCitqZmRjdGZsdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramZkY3Rmc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2pmZGN0aW50LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCitqaWRjdGZsdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramlkY3Rmc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2ppZGN0aW50LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCitqaWRjdHJlZC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoranF1YW50MS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqcXVhbnQyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2p1dGlscy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqbWVtbWdyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqbWVtc3lzLmgpCitqbWVtYW5zaS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsam1lbXN5cy5oKQpkaWZmIC0tZ2l0IGEvanBlZy9tYWt0anBlZy5zdCBiL2pwZWcvbWFrdGpwZWcuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmNGQxNgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrdGpwZWcuc3QKQEAgLTAsMCArMSwzMiBAQAorOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorOworOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCis7IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAorOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7Cis7IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBqcGVndHJhbi5wcmouCis7IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKKzsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKKzsKKzsKKzsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgoranBlZ3RyYW4udHRwCis7Cis7ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAorLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCisuQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcworLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncworLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCisuQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCisuQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKKz0KKzsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK3Bjc3RhcnQubworanBlZ3RyYW4uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLHRyYW5zdXBwLmgsanZlcnNpb24uaCkKK2NkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZHN3aXRjaC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit0cmFuc3VwcC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsdHJhbnN1cHAuaCkKK2xpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCitwY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5CitwY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9qcGVnL21ha3Ztcy5vcHQgYi9qcGVnL21ha3Ztcy5vcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ZThmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvbWFrdm1zLm9wdApAQCAtMCwwICsxLDQgQEAKKyEgQSBwb2ludGVyIHRvIHRoZSBWQVgvVk1TIEMgUnVuLVRpbWUgU2hhcmVhYmxlIExpYnJhcnkuCishIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgbWFrZWZpbGUubW1zIGFuZCBtYWtlZmlsZS52bXMsCishIGJ1dCBvbmx5IGZvciB0aGUgb2xkZXIgVkFYIEMgY29tcGlsZXIuICBERUMgQyBkb2VzIG5vdCBuZWVkIGl0LgorU3lzJExpYnJhcnk6VkFYQ1JUTC5FWEUgL1NoYXJlCmRpZmYgLS1naXQgYS9qcGVnL21pcHNfaWRjdF9sZS5TIGIvanBlZy9taXBzX2lkY3RfbGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGI2ZmZhCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9taXBzX2lkY3RfbGUuUwpAQCAtMCwwICsxLDU0NyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisjIElEQ1QgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIE1JUFMgRFNQIEFTRSAobGl0dGxlIGVuZGlhbiB2ZXJzaW9uKQorIworIyBTZWUgTUlQUyBUZWNobm9sb2dpZXMgSW5jIGRvY3VtZW50czoKKyMgIkpQRUcgRGVjb2RlciBPcHRpbWl6YXRpb24gZm9yIE1JUFMzMihSKSBDb3JlcyIgIE1EMDA0ODMKKyMKKyMgIk1JUFMzMihSKSBBcmNoaXRlY3R1cmUgZm9yIFByb2dyYW1tZXJzIFZvbHVtZSBJVi1lOiBUaGUgTUlQUyhSKSBEU1AKKyMgICAgICAgQXBwbGljYXRpb24gU3BlY2lmaWNlIEV4dGVuc2lvbiB0byB0aGUgTUlQUzMyKFIpIEFyY2hpdGVjdHVyZSIgTUQwMDM3NAorIworCisgICAgICAgIC5zZXQgICAgICAgICAgICBub3Jlb3JkZXIKKyAgICAgICAgLnNldCAgICAgICAgICAgIG5vbWFjcm8KKyAgICAgICAgLnNldCAgICAgICAgICAgIG5vYXQKKworIyBUaGlzIHRhYmxlIGhhcyBiZWVuIG1vdmVkIHRvIG1pcHNfamlkY3Rmc3QuYyB0byBhdm9pZCBoYXZpbmcgdG8gbWVzcworIyB3aXRoIHRoZSBnbG9iYWwgcG9pbnRlciB0byBtYWtlIHRoaXMgY29kZSBQSUMuCisjICAgICAgIC5yZGF0YQorIworIyBtaXBzX2lkY3RfY29lZnM6CisjICAgICAgICMgQ29uc3RhbnQgdGFibGUgb2Ygc2NhbGVkIElEQ1QgY29lZmZpY2llbnRzLgorIworIyAgICAgICAud29yZCAgICAgICAgICAgMHg0NTQ2NDU0NiAgICAgICAgICAgICAgIyBGSVgoIDEuMDgyMzkyMjAwIC8gMikgPSAgMTc3MzQgPSAweDQ1NDYKKyMgICAgICAgLndvcmQgICAgICAgICAgIDB4NUE4MjVBODIgICAgICAgICAgICAgICMgRklYKCAxLjQxNDIxMzU2MiAvIDIpID0gIDIzMTcwID0gMHg1QTgyCisjICAgICAgIC53b3JkICAgICAgICAgICAweDc2NDI3NjQyICAgICAgICAgICAgICAjIEZJWCggMS44NDc3NTkwNjUgLyAyKSA9ICAzMDI3NCA9IDB4NzY0MgorIyAgICAgICAud29yZCAgICAgICAgICAgMHhBQzYxQUM2MSAgICAgICAgICAgICAgIyBGSVgoLTIuNjEzMTI1OTMwIC8gNCkgPSAtMjE0MDcgPSAweEFDNjEKKworICAgICAgICAudGV4dAorCisgICAgICAgIC5nbG9iYWwgICAgICAgICBtaXBzX2lkY3RfY29sdW1ucworICAgICAgICAuZW50ICAgICAgICAgICAgbWlwc19pZGN0X2NvbHVtbnMKKworIyB2b2lkIG1pcHNfaWRjdF9jb2x1bW5zKEpDT0VGICogaW5wdHIsIElGQVNUX01VTFRfVFlQRSAqIHF1YW50cHRyLAorIyAgICAgICAgICAgICAgICAgICAgICAgIERDVEVMRU0gKiB3c3B0ciwgY29uc3QgaW50ICogbWlwc19pZGN0X2NvZWZzKTsKKworbWlwc19pZGN0X2NvbHVtbnM6CisKKyMgJGEwICAgLSBpbnB0cgorIyAkYTEgICAtIHF1YW50cHRyCisjICRhMiAgIC0gd3NwdHIKKyMgJGEzLCAkYXQgICAtIG1pcHNfaWRjdF9jb2VmcworIyAkdDA6NyAtIHNpbWQgZGF0YQorIyAkdDggICAtIGNvZWZmaWNpZW50cywgdGVtcAorIyAkdDkgICAtIGxvb3AgZW5kIGFkZHJlc3MKKyMgJHMwOjMgLSBzaW1kIHF1YW50aXphdGlvbiBmYWN0b3JzCisjICRzNDo3IC0gdGVtcCByZXN1bHRzCisjICR2MDoxIC0gdGVtcCByZXN1bHRzCisKKyAgICAgICAgYWRkaXUgICAgICAgICAgICRzcCwgJHNwLCAtMzIgICAgICAgICAgICMgcmVzZXJ2ZSBzdGFjayBzcGFjZSBmb3IgczAtczcKKworICAgICAgICBzdyAgICAgICAgICAgICAgJHMwLCAyOCgkc3ApCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczEsIDI0KCRzcCkKKyAgICAgICAgc3cgICAgICAgICAgICAgICRzMiwgMjAoJHNwKQorICAgICAgICBzdyAgICAgICAgICAgICAgJHMzLCAxNigkc3ApCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczQsIDEyKCRzcCkKKyAgICAgICAgc3cgICAgICAgICAgICAgICRzNSwgIDgoJHNwKQorICAgICAgICBzdyAgICAgICAgICAgICAgJHM2LCAgNCgkc3ApCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczcsICAwKCRzcCkKKworICAgICAgICBhZGRpdSAgICAgICAgICAgJHQ5LCAkYTAsIDE2ICAgICAgICAgICAgIyBlbmQgYWRkcmVzcworCisgICAgICAgICNsdWkgICAgICAgICAgICAkYXQsICVoaShtaXBzX2lkY3RfY29lZnMpCisgICAgICAgICNvcmkgICAgICAgICAgICAkYXQsICVsbyhtaXBzX2lkY3RfY29lZnMpCisgICAgICAgICMgbW92ZSBtaXBzX2lkY3RfY29lZnMgYWRkcmVzcyBmcm9tICRhMyBpbnRvICRhdCB3aGVyZSB0aGUgcmVzdCBvZiB0aGlzIGNvZGUgZXhwZWN0cyBpdAorICAgICAgICBvciAgICAgICAgICAgICAgJGF0LCAkYTMsICR6ZXJvCisKK2xvb3BfY29sdW1uczoKKworICAgICAgICBsdyAgICAgICAgICAgICAgJHMwLCAwKCRhMSkgICAgICAgICAgICAgIyBxdWFudHB0cltEQ1RTSVpFKjBdCisKKyAgICAgICAgbHcgICAgICAgICAgICAgICR0MCwgMCgkYTApICAgICAgICAgICAgICMgaW5wdHJbRENUU0laRSowXQorICAgICAgICBsdyAgICAgICAgICAgICAgJHQxLCAxNigkYTApICAgICAgICAgICAgIyBpbnB0cltEQ1RTSVpFKjFdCisKKyAgICAgICAgbXVsZXFfcy53LnBobCAgICR2MCwgJHQwLCAkczAgICAgICAgICAgICMgdG1wMCAuLi4KKworICAgICAgICBsdyAgICAgICAgICAgICAgJHQyLCAzMigkYTApICAgICAgICAgICAgIyBpbnB0cltEQ1RTSVpFKjJdCisgICAgICAgIGx3ICAgICAgICAgICAgICAkdDMsIDQ4KCRhMCkgICAgICAgICAgICAjIGlucHRyW0RDVFNJWkUqM10KKyAgICAgICAgbHcgICAgICAgICAgICAgICR0NCwgNjQoJGEwKSAgICAgICAgICAgICMgaW5wdHJbRENUU0laRSo0XQorICAgICAgICBsdyAgICAgICAgICAgICAgJHQ1LCA4MCgkYTApICAgICAgICAgICAgIyBpbnB0cltEQ1RTSVpFKjVdCisKKyAgICAgICAgbXVsZXFfcy53LnBociAgICR0MCwgJHQwLCAkczAgICAgICAgICAgICMgLi4uIHRtcDAgLi4uCisKKyAgICAgICAgbHcgICAgICAgICAgICAgICR0NiwgOTYoJGEwKSAgICAgICAgICAgICMgaW5wdHJbRENUU0laRSo2XQorICAgICAgICBsdyAgICAgICAgICAgICAgJHQ3LCAxMTIoJGEwKSAgICAgICAgICAgIyBpbnB0cltEQ1RTSVpFKjddCisKKyAgICAgICAgb3IgICAgICAgICAgICAgICRzNCwgJHQxLCAkdDIKKyAgICAgICAgb3IgICAgICAgICAgICAgICRzNSwgJHQzLCAkdDQKKworICAgICAgICBibmV6ICAgICAgICAgICAgJHM0LCBmdWxsX2NvbHVtbgorICAgICAgICBpbnMgICAgICAgICAgICAgJHQwLCAkdjAsIDE2LCAxNiAgICAgICAgIyAuLi4gdG1wMAorCisgICAgICAgIGJuZXogICAgICAgICAgICAkczUsIGZ1bGxfY29sdW1uCisgICAgICAgIG9yICAgICAgICAgICAgICAkczYsICR0NSwgJHQ2CisgICAgICAgIG9yICAgICAgICAgICAgICAkczYsICRzNiwgJHQ3CisgICAgICAgIGJuZXogICAgICAgICAgICAkczYsIGZ1bGxfY29sdW1uCisKKyAgICAgICAgc3cgICAgICAgICAgICAgICR0MCwgMCgkYTIpICAgICAgICAgICAgICMgd3NwdHJbRENUU0laRSowXQorICAgICAgICBzdyAgICAgICAgICAgICAgJHQwLCAxNigkYTIpICAgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjFdCisgICAgICAgIHN3ICAgICAgICAgICAgICAkdDAsIDMyKCRhMikgICAgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqMl0KKyAgICAgICAgc3cgICAgICAgICAgICAgICR0MCwgNDgoJGEyKSAgICAgICAgICAgICMgd3NwdHJbRENUU0laRSozXQorICAgICAgICBzdyAgICAgICAgICAgICAgJHQwLCA2NCgkYTIpICAgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjRdCisgICAgICAgIHN3ICAgICAgICAgICAgICAkdDAsIDgwKCRhMikgICAgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqNV0KKyAgICAgICAgc3cgICAgICAgICAgICAgICR0MCwgOTYoJGEyKSAgICAgICAgICAgICMgd3NwdHJbRENUU0laRSo2XQorICAgICAgICBzdyAgICAgICAgICAgICAgJHQwLCAxMTIoJGEyKSAgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjddCisKKyAgICAgICAgYWRkaXUgICAgICAgICAgICRhMCwgJGEwLCA0CisKKyAgICAgICAgYiAgICAgICAgICAgICAgIGNvbnRpbnVlX2NvbHVtbnMKKyAgICAgICAgYWRkaXUgICAgICAgICAgICRhMSwgJGExLCA0CisKKworZnVsbF9jb2x1bW46CisKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzMSwgMzIoJGExKSAgICAgICAgICAgICMgcXVhbnRwdHJbRENUU0laRSoyXQorICAgICAgICBsdyAgICAgICAgICAgICAgJHMyLCA2NCgkYTEpICAgICAgICAgICAgIyBxdWFudHB0cltEQ1RTSVpFKjRdCisKKyAgICAgICAgbXVsZXFfcy53LnBobCAgICR2MCwgJHQyLCAkczEgICAgICAgICAgICMgdG1wMSAuLi4KKyAgICAgICAgbXVsZXFfcy53LnBociAgICR0MiwgJHQyLCAkczEgICAgICAgICAgICMgLi4uIHRtcDEgLi4uCisKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzMCwgMTYoJGExKSAgICAgICAgICAgICMgcXVhbnRwdHJbRENUU0laRSoxXQorICAgICAgICBsdyAgICAgICAgICAgICAgJHMxLCA0OCgkYTEpICAgICAgICAgICAgIyBxdWFudHB0cltEQ1RTSVpFKjNdCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczMsIDk2KCRhMSkgICAgICAgICAgICAjIHF1YW50cHRyW0RDVFNJWkUqNl0KKworICAgICAgICBtdWxlcV9zLncucGhsICAgJHYxLCAkdDQsICRzMiAgICAgICAgICAgIyB0bXAyIC4uLgorICAgICAgICBtdWxlcV9zLncucGhyICAgJHQ0LCAkdDQsICRzMiAgICAgICAgICAgIyAuLi4gdG1wMiAuLi4KKworICAgICAgICBsdyAgICAgICAgICAgICAgJHMyLCA4MCgkYTEpICAgICAgICAgICAgIyBxdWFudHB0cltEQ1RTSVpFKjVdCisgICAgICAgIGx3ICAgICAgICAgICAgICAkdDgsIDQoJGF0KSAgICAgICAgICAgICAjIEZJWCgxLjQxNDIxMzU2MikKKyAgICAgICAgaW5zICAgICAgICAgICAgICR0MiwgJHYwLCAxNiwgMTYgICAgICAgICMgLi4uIHRtcDEKKworICAgICAgICBtdWxlcV9zLncucGhsICAgJHYwLCAkdDYsICRzMyAgICAgICAgICAgIyB0bXAzIC4uLgorICAgICAgICBtdWxlcV9zLncucGhyICAgJHQ2LCAkdDYsICRzMyAgICAgICAgICAgIyAuLi4gdG1wMyAuLi4KKworICAgICAgICBpbnMgICAgICAgICAgICAgJHQ0LCAkdjEsIDE2LCAxNiAgICAgICAgIyAuLi4gdG1wMgorCisgICAgICAgIGFkZHEucGggICAgICAgICAkczQsICR0MCwgJHQ0ICAgICAgICAgICAjIHRtcDEwCisgICAgICAgIHN1YnEucGggICAgICAgICAkczUsICR0MCwgJHQ0ICAgICAgICAgICAjIHRtcDExCisKKyAgICAgICAgaW5zICAgICAgICAgICAgICR0NiwgJHYwLCAxNiwgMTYgICAgICAgICMgLi4uIHRtcDMKKworICAgICAgICBzdWJxLnBoICAgICAgICAgJHM2LCAkdDIsICR0NiAgICAgICAgICAgIyB0bXAxMiAuLi4KKyAgICAgICAgYWRkcS5waCAgICAgICAgICRzNywgJHQyLCAkdDYgICAgICAgICAgICMgdG1wMTMKKworICAgICAgICBtdWxxX3JzLnBoICAgICAgJHM2LCAkczYsICR0OCAgICAgICAgICAgIyAuLi4gdG1wMTIgLi4uCisKKyAgICAgICAgYWRkcS5waCAgICAgICAgICR0MCwgJHM0LCAkczcgICAgICAgICAgICMgdG1wMAorICAgICAgICBzdWJxLnBoICAgICAgICAgJHQ2LCAkczQsICRzNyAgICAgICAgICAgIyB0bXAzCisKKyMjIyMjIyMjIyMjIyMjIyMKKworICAgICAgICBtdWxlcV9zLncucGhsICAgJHYwLCAkdDEsICRzMCAgICAgICAgICAgIyB0bXA0IC4uLgorICAgICAgICBtdWxlcV9zLncucGhyICAgJHQxLCAkdDEsICRzMCAgICAgICAgICAgIyAuLi4gdG1wNCAuLi4KKworICAgICAgICBzaGxsX3MucGggICAgICAgJHM2LCAkczYsIDEgICAgICAgICAgICAgIyB4MgorCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczMsIDExMigkYTEpICAgICAgICAgICAjIHF1YW50cHRyW0RDVFNJWkUqN10KKworICAgICAgICBzdWJxLnBoICAgICAgICAgJHM2LCAkczYsICRzNyAgICAgICAgICAgIyAuLi4gdG1wMTIKKworICAgICAgICBtdWxlcV9zLncucGhsICAgJHYxLCAkdDcsICRzMyAgICAgICAgICAgIyB0bXA3IC4uLgorICAgICAgICBtdWxlcV9zLncucGhyICAgJHQ3LCAkdDcsICRzMyAgICAgICAgICAgIyAuLi4gdG1wNyAuLi4KKworICAgICAgICBpbnMgICAgICAgICAgICAgJHQxLCAkdjAsIDE2LCAxNiAgICAgICAgIyAuLi4gdG1wNAorCisgICAgICAgIGFkZHEucGggICAgICAgICAkdDIsICRzNSwgJHM2ICAgICAgICAgICAjIHRtcDEKKyAgICAgICAgc3VicS5waCAgICAgICAgICR0NCwgJHM1LCAkczYgICAgICAgICAgICMgdG1wMgorCisgICAgICAgIG11bGVxX3Mudy5waGwgICAkdjAsICR0NSwgJHMyICAgICAgICAgICAjIHRtcDYgLi4uCisgICAgICAgIG11bGVxX3Mudy5waHIgICAkdDUsICR0NSwgJHMyICAgICAgICAgICAjIC4uLiB0bXA2IC4uLgorCisgICAgICAgIGlucyAgICAgICAgICAgICAkdDcsICR2MSwgMTYsIDE2ICAgICAgICAjIC4uLiB0bXA3CisKKyAgICAgICAgYWRkcS5waCAgICAgICAgICRzNSwgJHQxLCAkdDcgICAgICAgICAgICMgejExCisgICAgICAgIHN1YnEucGggICAgICAgICAkczYsICR0MSwgJHQ3ICAgICAgICAgICAjIHoxMgorCisgICAgICAgIG11bGVxX3Mudy5waGwgICAkdjEsICR0MywgJHMxICAgICAgICAgICAjIHRtcDUgLi4uCisgICAgICAgIG11bGVxX3Mudy5waHIgICAkdDMsICR0MywgJHMxICAgICAgICAgICAjIC4uLiB0bXA1IC4uLgorCisgICAgICAgIGlucyAgICAgICAgICAgICAkdDUsICR2MCwgMTYsIDE2ICAgICAgICAjIC4uLiB0bXA2CisKKyMgc3RhbGxzCisKKyAgICAgICAgaW5zICAgICAgICAgICAgICR0MywgJHYxLCAxNiwgMTYgICAgICAgICMgLi4uIHRtcDUKKworCisgICAgICAgIGFkZHEucGggICAgICAgICAkczcsICR0NSwgJHQzICAgICAgICAgICAjIHoxMworICAgICAgICBzdWJxLnBoICAgICAgICAgJHYwLCAkdDUsICR0MyAgICAgICAgICAgIyB6MTAKKworICAgICAgICBhZGRxLnBoICAgICAgICAgJHQ3LCAkczUsICRzNyAgICAgICAgICAgIyB0bXA3CisgICAgICAgIHN1YnEucGggICAgICAgICAkczUsICRzNSwgJHM3ICAgICAgICAgICAjIHRtcDExIC4uLgorCisgICAgICAgIGFkZHEucGggICAgICAgICAkdjEsICR2MCwgJHM2ICAgICAgICAgICAjIHo1IC4uLgorCisgICAgICAgIG11bHFfcnMucGggICAgICAkczUsICRzNSwgJHQ4ICAgICAgICAgICAjIC4uLiB0bXAxMQorCisgICAgICAgIGx3ICAgICAgICAgICAgICAkdDgsIDgoJGF0KSAgICAgICAgICAgICAjIEZJWCgxLjg0Nzc1OTA2NSkKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzNCwgMCgkYXQpICAgICAgICAgICAgICMgRklYKDEuMDgyMzkyMjAwKQorCisgICAgICAgIGFkZHEucGggICAgICAgICAkczAsICR0MCwgJHQ3CisgICAgICAgIHN1YnEucGggICAgICAgICAkczEsICR0MCwgJHQ3CisKKyAgICAgICAgbXVscV9ycy5waCAgICAgICR2MSwgJHYxLCAkdDggICAgICAgICAgICMgLi4uIHo1CisKKyAgICAgICAgc2hsbF9zLnBoICAgICAgICRzNSwgJHM1LCAxICAgICAgICAgICAgICMgeDIKKworICAgICAgICBsdyAgICAgICAgICAgICAgJHQ4LCAxMigkYXQpICAgICAgICAgICAgIyBGSVgoLTIuNjEzMTI1OTMwKQorICAgICAgICBzdyAgICAgICAgICAgICAgJHMwLCAwKCRhMikgICAgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjBdCisKKyAgICAgICAgbXVscV9ycy5waCAgICAgICR2MCwgJHYwLCAkdDggICAgICAgICAgICMgdG1wMTIgLi4uCisgICAgICAgIG11bHFfcnMucGggICAgICAkczQsICRzNiwgJHM0ICAgICAgICAgICAjIHRtcDEwIC4uLgorCisgICAgICAgIHNobGxfcy5waCAgICAgICAkdjEsICR2MSwgMSAgICAgICAgICAgICAjIHgyCisKKyAgICAgICAgYWRkaXUgICAgICAgICAgICRhMCwgJGEwLCA0CisgICAgICAgIGFkZGl1ICAgICAgICAgICAkYTEsICRhMSwgNAorCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczEsIDExMigkYTIpICAgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqN10KKworICAgICAgICBzaGxsX3MucGggICAgICAgJHM2LCAkdjAsIDIgICAgICAgICAgICAgIyB4NAorICAgICAgICBzaGxsX3MucGggICAgICAgJHM0LCAkczQsIDEgICAgICAgICAgICAgIyB4MgorICAgICAgICBhZGRxLnBoICAgICAgICAgJHM2LCAkczYsICR2MSAgICAgICAgICAgIyAuLi4gdG1wMTIKKworICAgICAgICBzdWJxLnBoICAgICAgICAgJHQ1LCAkczYsICR0NyAgICAgICAgICAgIyB0bXA2CisgICAgICAgIHN1YnEucGggICAgICAgICAkczQsICRzNCwgJHYxICAgICAgICAgICAjIC4uLiB0bXAxMAorICAgICAgICBzdWJxLnBoICAgICAgICAgJHQzLCAkczUsICR0NSAgICAgICAgICAgIyB0bXA1CisgICAgICAgIGFkZHEucGggICAgICAgICAkczIsICR0MiwgJHQ1CisgICAgICAgIGFkZHEucGggICAgICAgICAkdDEsICRzNCwgJHQzICAgICAgICAgICAjIHRtcDQKKyAgICAgICAgc3VicS5waCAgICAgICAgICRzMywgJHQyLCAkdDUKKworICAgICAgICBzdyAgICAgICAgICAgICAgJHMyLCAxNigkYTIpICAgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjFdCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczMsIDk2KCRhMikgICAgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqNl0KKworICAgICAgICBhZGRxLnBoICAgICAgICAgJHYwLCAkdDQsICR0MworICAgICAgICBzdWJxLnBoICAgICAgICAgJHYxLCAkdDQsICR0MworCisgICAgICAgIHN3ICAgICAgICAgICAgICAkdjAsIDMyKCRhMikgICAgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqMl0KKyAgICAgICAgc3cgICAgICAgICAgICAgICR2MSwgODAoJGEyKSAgICAgICAgICAgICMgd3NwdHJbRENUU0laRSo1XQorCisgICAgICAgIGFkZHEucGggICAgICAgICAkdjAsICR0NiwgJHQxCisgICAgICAgIHN1YnEucGggICAgICAgICAkdjEsICR0NiwgJHQxCisKKyAgICAgICAgc3cgICAgICAgICAgICAgICR2MCwgNjQoJGEyKSAgICAgICAgICAgICMgd3NwdHJbRENUU0laRSo0XQorICAgICAgICBzdyAgICAgICAgICAgICAgJHYxLCA0OCgkYTIpICAgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjNdCisKK2NvbnRpbnVlX2NvbHVtbnM6CisKKyAgICAgICAgYm5lICAgICAgICAgICAgICRhMCwgJHQ5LCBsb29wX2NvbHVtbnMKKyAgICAgICAgYWRkaXUgICAgICAgICAgICRhMiwgJGEyLCA0CisKKworICAgICAgICBsdyAgICAgICAgICAgICAgJHMwLCAyOCgkc3ApCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczEsIDI0KCRzcCkKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzMiwgMjAoJHNwKQorICAgICAgICBsdyAgICAgICAgICAgICAgJHMzLCAxNigkc3ApCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczQsIDEyKCRzcCkKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzNSwgIDgoJHNwKQorICAgICAgICBsdyAgICAgICAgICAgICAgJHM2LCAgNCgkc3ApCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczcsICAwKCRzcCkKKworICAgICAgICBqciAgICAgICAgICAgICAgJHJhCisgICAgICAgIGFkZGl1ICAgICAgICAgICAkc3AsICRzcCwgMzIKKworCisgICAgICAgIC5lbmQgICAgICAgICAgICBtaXBzX2lkY3RfY29sdW1ucworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyAgICAgICAgLmdsb2JhbCAgICAgICAgIG1pcHNfaWRjdF9yb3dzCisgICAgICAgIC5lbnQgICAgICAgICAgICBtaXBzX2lkY3Rfcm93cworCisjIHZvaWQgbWlwc19pZGN0X3Jvd3MoRENURUxFTSAqIHdzcHRyLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisjICAgICAgICAgICAgICAgICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfY29sLCBjb25zdCBpbnQgKiBtaXBzX2lkY3RfY29lZnMpOworCittaXBzX2lkY3Rfcm93czoKKworIyAkYTAgICAtIHdzcHRyCisjICRhMSAgIC0gb3V0cHV0X2J1ZgorIyAkYTIgICAtIG91dHB1dF9jb2wKKyMgJGEzICAgLSBvdXRwdHIKKyMgJGEzLCAkYXQgICAtIG1pcHNfaWRjdF9jb2VmcworIyAkdDA6NyAtIHNpbWQgZGF0YQorIyAkdDggICAtIGNvZWZmaWNpZW50cywgdGVtcAorIyAkdDkgICAtIGxvb3AgZW5kIGFkZHJlc3MKKyMgJHMwOjMgLSBzaW1kIHF1YW50aXphdGlvbiBmYWN0b3JzCisjICRzNDo3IC0gdGVtcCByZXN1bHRzCisjIHM4ICAgIC0gY29uc3QgMHg4MDgwODA4MAorIyAkdjA6MSAtIHRlbXAgcmVzdWx0cworCitTSElGVCAgID0gICAgICAgICAgICAgICAyCisKKyAgICAgICAgYWRkaXUgICAgICAgICAgICRzcCwgJHNwLCAtNDggICAgICAgICAgICMgcmVzZXJ2ZSBzdGFjayBzcGFjZSBmb3IgczAtczgKKworICAgICAgICAjIHNhdmUgJGEzIChtaXBzX2lkY3RfY29lZnMpIGJlY2F1c2UgaXQgbWlnaHQgZ2V0IGNsb2JiZXJlZCBiZWxvdworICAgICAgICBzdyAgICAgICAgICAgICAgJGEzLCAzNigkc3ApCisKKyAgICAgICAgc3cgICAgICAgICAgICAgICRzMCwgMzIoJHNwKQorICAgICAgICBzdyAgICAgICAgICAgICAgJHMxLCAyOCgkc3ApCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczIsIDI0KCRzcCkKKyAgICAgICAgc3cgICAgICAgICAgICAgICRzMywgMjAoJHNwKQorICAgICAgICBzdyAgICAgICAgICAgICAgJHM0LCAxNigkc3ApCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczUsIDEyKCRzcCkKKyAgICAgICAgc3cgICAgICAgICAgICAgICRzNiwgIDgoJHNwKQorICAgICAgICBzdyAgICAgICAgICAgICAgJHM3LCAgNCgkc3ApCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczgsICAwKCRzcCkKKworICAgICAgICBhZGRpdSAgICAgICAgICAgJHQ5LCAkYTAsIDEyOCAgICAgICAgICAgIyBlbmQgYWRkcmVzcworCisgICAgICAgIGx1aSAgICAgICAgICAgICAkczgsIDB4ODA4MAorICAgICAgICBvcmkgICAgICAgICAgICAgJHM4LCAkczgsIDB4ODA4MAorCitsb29wX3Jvd3M6CisKKyAgICAgICAgbHcgICAgICAgICAgICAgICRhdCwgMzYoJHNwKSAgICAgICAgICAgICMgcmVzdG9yZSBzYXZlZCAkYTMgKG1pcHNfaWRjdF9jb2VmcykKKworICAgICAgICBsdyAgICAgICAgICAgICAgJHQwLCAwKzAoJGEwKSAgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjArMC8xXSAgYiBhCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczAsIDE2KzAoJGEwKSAgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqMSswLzFdICBCIEEKKyAgICAgICAgbHcgICAgICAgICAgICAgICR0MiwgMCs0KCRhMCkgICAgICAgICAgICMgd3NwdHJbRENUU0laRSowKzIvM10gIGQgYworICAgICAgICBsdyAgICAgICAgICAgICAgJHMyLCAxNis0KCRhMCkgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjErMi8zXSAgRCBDCisgICAgICAgIGx3ICAgICAgICAgICAgICAkdDQsIDArOCgkYTApICAgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqMCs0LzVdICBmIGUKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzNCwgMTYrOCgkYTApICAgICAgICAgICMgd3NwdHJbRENUU0laRSoxKzQvNV0gIEYgRQorICAgICAgICBsdyAgICAgICAgICAgICAgJHQ2LCAwKzEyKCRhMCkgICAgICAgICAgIyB3c3B0cltEQ1RTSVpFKjArNi83XSAgaCBnCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczYsIDE2KzEyKCRhMCkgICAgICAgICAjIHdzcHRyW0RDVFNJWkUqMSs2LzddICBIIEcKKworICAgICAgICBwcmVjcnEucGgudyAgICAgJHQxLCAkczAsICR0MCAgICAgICAgICAgIyBCIGIKKyAgICAgICAgaW5zICAgICAgICAgICAgICR0MCwgJHMwLCAxNiwgMTYgICAgICAgICMgQSBhCisKKyAgICAgICAgYm5leiAgICAgICAgICAgICR0MSwgZnVsbF9yb3cKKyAgICAgICAgb3IgICAgICAgICAgICAgICRzMCwgJHQyLCAkczIKKyAgICAgICAgYm5leiAgICAgICAgICAgICRzMCwgZnVsbF9yb3cKKyAgICAgICAgb3IgICAgICAgICAgICAgICRzMCwgJHQ0LCAkczQKKyAgICAgICAgYm5leiAgICAgICAgICAgICRzMCwgZnVsbF9yb3cKKyAgICAgICAgb3IgICAgICAgICAgICAgICRzMCwgJHQ2LCAkczYKKyAgICAgICAgYm5leiAgICAgICAgICAgICRzMCwgZnVsbF9yb3cKKworICAgICAgICBzaGxsX3MucGggICAgICAgJHMwLCAkdDAsIFNISUZUICAgICAgICAgIyBBIGEKKworICAgICAgICBsdyAgICAgICAgICAgICAgJGEzLCAwKCRhMSkKKyAgICAgICAgbHcgICAgICAgICAgICAgICRhdCwgNCgkYTEpCisKKyAgICAgICAgcHJlY3JxLnBoLncgICAgICR0MCwgJHMwLCAkczAgICAgICAgICAgICMgQSBBCisgICAgICAgIGlucyAgICAgICAgICAgICAkczAsICRzMCwgMTYsIDE2ICAgICAgICAjIGEgYQorCisgICAgICAgIGFkZHUgICAgICAgICAgICAkYTMsICRhMywgJGEyCisgICAgICAgIGFkZHUgICAgICAgICAgICAkYXQsICRhdCwgJGEyCisKKyAgICAgICAgcHJlY3JxLnFiLnBoICAgICR0MCwgJHQwLCAkdDAgICAgICAgICAgICMgQSBBIEEgQQorICAgICAgICBwcmVjcnEucWIucGggICAgJHMwLCAkczAsICRzMCAgICAgICAgICAgIyBhIGEgYSBhCisKKworICAgICAgICBhZGR1LnFiICAgICAgICAgJHMwLCAkczAsICRzOAorICAgICAgICBhZGR1LnFiICAgICAgICAgJHQwLCAkdDAsICRzOAorCisKKyAgICAgICAgc3cgICAgICAgICAgICAgICRzMCwgMCgkYTMpCisgICAgICAgIHN3ICAgICAgICAgICAgICAkczAsIDQoJGEzKQorCisgICAgICAgIHN3ICAgICAgICAgICAgICAkdDAsIDAoJGF0KQorICAgICAgICBzdyAgICAgICAgICAgICAgJHQwLCA0KCRhdCkKKworCisgICAgICAgIGFkZGl1ICAgICAgICAgICAkYTAsICRhMCwgMzIKKworICAgICAgICBibmUgICAgICAgICAgICAgJGEwLCAkdDksIGxvb3Bfcm93cworICAgICAgICBhZGRpdSAgICAgICAgICAgJGExLCAkYTEsIDgKKworICAgICAgICBiICAgICAgICAgICAgICAgZXhpdF9yb3dzCisgICAgICAgIG5vcAorCisKK2Z1bGxfcm93OgorCisgICAgICAgIHByZWNycS5waC53ICAgICAkdDMsICRzMiwgJHQyCisgICAgICAgIGlucyAgICAgICAgICAgICAkdDIsICRzMiwgMTYsIDE2CisKKyAgICAgICAgcHJlY3JxLnBoLncgICAgICR0NSwgJHM0LCAkdDQKKyAgICAgICAgaW5zICAgICAgICAgICAgICR0NCwgJHM0LCAxNiwgMTYKKworICAgICAgICBwcmVjcnEucGgudyAgICAgJHQ3LCAkczYsICR0NgorICAgICAgICBpbnMgICAgICAgICAgICAgJHQ2LCAkczYsIDE2LCAxNgorCisKKyAgICAgICAgbHcgICAgICAgICAgICAgICR0OCwgNCgkYXQpICAgICAgICAgICAgICMgRklYKDEuNDE0MjEzNTYyKQorCisgICAgICAgIGFkZHEucGggICAgICAgICAkczQsICR0MCwgJHQ0ICAgICAgICAgICAjIHRtcDEwCisgICAgICAgIHN1YnEucGggICAgICAgICAkczUsICR0MCwgJHQ0ICAgICAgICAgICAjIHRtcDExCisKKyAgICAgICAgc3VicS5waCAgICAgICAgICRzNiwgJHQyLCAkdDYgICAgICAgICAgICMgdG1wMTIgLi4uCisgICAgICAgIGFkZHEucGggICAgICAgICAkczcsICR0MiwgJHQ2ICAgICAgICAgICAjIHRtcDEzCisKKyAgICAgICAgbXVscV9ycy5waCAgICAgICRzNiwgJHM2LCAkdDggICAgICAgICAgICMgLi4uIHRtcDEyIC4uLgorCisgICAgICAgIGFkZHEucGggICAgICAgICAkdDAsICRzNCwgJHM3ICAgICAgICAgICAjIHRtcDAKKyAgICAgICAgc3VicS5waCAgICAgICAgICR0NiwgJHM0LCAkczcgICAgICAgICAgICMgdG1wMworCisgICAgICAgIHNobGxfcy5waCAgICAgICAkczYsICRzNiwgMSAgICAgICAgICAgICAjIHgyCisKKyAgICAgICAgc3VicS5waCAgICAgICAgICRzNiwgJHM2LCAkczcgICAgICAgICAgICMgLi4uIHRtcDEyCisKKyAgICAgICAgYWRkcS5waCAgICAgICAgICR0MiwgJHM1LCAkczYgICAgICAgICAgICMgdG1wMQorICAgICAgICBzdWJxLnBoICAgICAgICAgJHQ0LCAkczUsICRzNiAgICAgICAgICAgIyB0bXAyCisKKyMjIyMjIyMjIyMjIyMjIyMKKworICAgICAgICBhZGRxLnBoICAgICAgICAgJHM1LCAkdDEsICR0NyAgICAgICAgICAgIyB6MTEKKyAgICAgICAgc3VicS5waCAgICAgICAgICRzNiwgJHQxLCAkdDcgICAgICAgICAgICMgejEyCisKKyAgICAgICAgYWRkcS5waCAgICAgICAgICRzNywgJHQ1LCAkdDMgICAgICAgICAgICMgejEzCisgICAgICAgIHN1YnEucGggICAgICAgICAkdjAsICR0NSwgJHQzICAgICAgICAgICAjIHoxMAorCisgICAgICAgIGFkZHEucGggICAgICAgICAkdDcsICRzNSwgJHM3ICAgICAgICAgICAjIHRtcDcKKyAgICAgICAgc3VicS5waCAgICAgICAgICRzNSwgJHM1LCAkczcgICAgICAgICAgICMgdG1wMTEgLi4uCisKKyAgICAgICAgYWRkcS5waCAgICAgICAgICR2MSwgJHYwLCAkczYgICAgICAgICAgICMgejUgLi4uCisKKyAgICAgICAgbXVscV9ycy5waCAgICAgICRzNSwgJHM1LCAkdDggICAgICAgICAgICMgLi4uIHRtcDExCisKKyAgICAgICAgbHcgICAgICAgICAgICAgICR0OCwgOCgkYXQpICAgICAgICAgICAgICMgRklYKDEuODQ3NzU5MDY1KQorICAgICAgICBsdyAgICAgICAgICAgICAgJHM0LCAwKCRhdCkgICAgICAgICAgICAgIyBGSVgoMS4wODIzOTIyMDApCisKKyAgICAgICAgYWRkcS5waCAgICAgICAgICRzMCwgJHQwLCAkdDcgICAgICAgICAgICMgdG1wMCArIHRtcDcKKyAgICAgICAgc3VicS5waCAgICAgICAgICRzNywgJHQwLCAkdDcgICAgICAgICAgICMgdG1wMCAtIHRtcDcKKworICAgICAgICBtdWxxX3JzLnBoICAgICAgJHYxLCAkdjEsICR0OCAgICAgICAgICAgIyAuLi4gejUKKworICAgICAgICBsdyAgICAgICAgICAgICAgJGEzLCAwKCRhMSkKKyAgICAgICAgbHcgICAgICAgICAgICAgICR0OCwgMTIoJGF0KSAgICAgICAgICAgICMgRklYKC0yLjYxMzEyNTkzMCkKKworICAgICAgICBzaGxsX3MucGggICAgICAgJHM1LCAkczUsIDEgICAgICAgICAgICAgIyB4MgorCisgICAgICAgIGFkZHUgICAgICAgICAgICAkYTMsICRhMywgJGEyCisKKyAgICAgICAgbXVscV9ycy5waCAgICAgICR2MCwgJHYwLCAkdDggICAgICAgICAgICMgdG1wMTIgLi4uCisgICAgICAgIG11bHFfcnMucGggICAgICAkczQsICRzNiwgJHM0ICAgICAgICAgICAjIHRtcDEwIC4uLgorCisgICAgICAgIHNobGxfcy5waCAgICAgICAkdjEsICR2MSwgMSAgICAgICAgICAgICAjIHgyCisKKyAgICAgICAgYWRkaXUgICAgICAgICAgICRhMCwgJGEwLCAzMgorICAgICAgICBhZGRpdSAgICAgICAgICAgJGExLCAkYTEsIDgKKworCisgICAgICAgIHNobGxfcy5waCAgICAgICAkczYsICR2MCwgMiAgICAgICAgICAgICAjIHg0CisgICAgICAgIHNobGxfcy5waCAgICAgICAkczQsICRzNCwgMSAgICAgICAgICAgICAjIHgyCisgICAgICAgIGFkZHEucGggICAgICAgICAkczYsICRzNiwgJHYxICAgICAgICAgICAjIC4uLiB0bXAxMgorCisgICAgICAgIHNobGxfcy5waCAgICAgICAkczAsICRzMCwgU0hJRlQKKworICAgICAgICBzdWJxLnBoICAgICAgICAgJHQ1LCAkczYsICR0NyAgICAgICAgICAgIyB0bXA2CisgICAgICAgIHN1YnEucGggICAgICAgICAkczQsICRzNCwgJHYxICAgICAgICAgICAjIC4uLiB0bXAxMAorICAgICAgICBzdWJxLnBoICAgICAgICAgJHQzLCAkczUsICR0NSAgICAgICAgICAgIyB0bXA1CisKKyAgICAgICAgc2hsbF9zLnBoICAgICAgICRzNywgJHM3LCBTSElGVAorCisgICAgICAgIGFkZHEucGggICAgICAgICAkdDEsICRzNCwgJHQzICAgICAgICAgICAjIHRtcDQKKworCisgICAgICAgIGFkZHEucGggICAgICAgICAkczEsICR0MiwgJHQ1ICAgICAgICAgICAjIHRtcDEgKyB0bXA2CisgICAgICAgIHN1YnEucGggICAgICAgICAkczYsICR0MiwgJHQ1ICAgICAgICAgICAjIHRtcDEgLSB0bXA2CisKKyAgICAgICAgYWRkcS5waCAgICAgICAgICRzMiwgJHQ0LCAkdDMgICAgICAgICAgICMgdG1wMiArIHRtcDUKKyAgICAgICAgc3VicS5waCAgICAgICAgICRzNSwgJHQ0LCAkdDMgICAgICAgICAgICMgdG1wMiAtIHRtcDUKKworICAgICAgICBhZGRxLnBoICAgICAgICAgJHM0LCAkdDYsICR0MSAgICAgICAgICAgIyB0bXAzICsgdG1wNAorICAgICAgICBzdWJxLnBoICAgICAgICAgJHMzLCAkdDYsICR0MSAgICAgICAgICAgIyB0bXAzIC0gdG1wNAorCisKKyAgICAgICAgc2hsbF9zLnBoICAgICAgICRzMSwgJHMxLCBTSElGVAorICAgICAgICBzaGxsX3MucGggICAgICAgJHMyLCAkczIsIFNISUZUCisgICAgICAgIHNobGxfcy5waCAgICAgICAkczMsICRzMywgU0hJRlQKKyAgICAgICAgc2hsbF9zLnBoICAgICAgICRzNCwgJHM0LCBTSElGVAorICAgICAgICBzaGxsX3MucGggICAgICAgJHM1LCAkczUsIFNISUZUCisgICAgICAgIHNobGxfcy5waCAgICAgICAkczYsICRzNiwgU0hJRlQKKworCisgICAgICAgIHByZWNycS5waC53ICAgICAkdDAsICRzMSwgJHMwICAgICAgICAgICAjIEIgQQorICAgICAgICBpbnMgICAgICAgICAgICAgJHMwLCAkczEsIDE2LCAxNiAgICAgICAgIyBiIGEKKworICAgICAgICBwcmVjcnEucGgudyAgICAgJHQyLCAkczMsICRzMiAgICAgICAgICAgIyBEIEMKKyAgICAgICAgaW5zICAgICAgICAgICAgICRzMiwgJHMzLCAxNiwgMTYgICAgICAgICMgZCBjCisKKyAgICAgICAgcHJlY3JxLnBoLncgICAgICR0NCwgJHM1LCAkczQgICAgICAgICAgICMgRiBFCisgICAgICAgIGlucyAgICAgICAgICAgICAkczQsICRzNSwgMTYsIDE2ICAgICAgICAjIGYgZQorCisgICAgICAgIHByZWNycS5waC53ICAgICAkdDYsICRzNywgJHM2ICAgICAgICAgICAjIEggRworICAgICAgICBpbnMgICAgICAgICAgICAgJHM2LCAkczcsIDE2LCAxNiAgICAgICAgIyBoIGcKKworICAgICAgICBwcmVjcnEucWIucGggICAgJHQwLCAkdDIsICR0MCAgICAgICAgICAgIyBEIEMgQiBBCisgICAgICAgIHByZWNycS5xYi5waCAgICAkczAsICRzMiwgJHMwICAgICAgICAgICAjIGQgYyBiIGEKKworICAgICAgICBwcmVjcnEucWIucGggICAgJHQ0LCAkdDYsICR0NCAgICAgICAgICAgIyBIIEcgRiBFCisgICAgICAgIHByZWNycS5xYi5waCAgICAkczQsICRzNiwgJHM0ICAgICAgICAgICAjIGggZyBmIGUKKworCisgICAgICAgIGFkZHUucWIgICAgICAgICAkczAsICRzMCwgJHM4CisgICAgICAgIGFkZHUucWIgICAgICAgICAkczQsICRzNCwgJHM4CisKKworICAgICAgICBzdyAgICAgICAgICAgICAgJHMwLCAwKCRhMykgICAgICAgICAgICAgIyBvdXRwdHJbMC8xLzIvM10gICAgICAgZCBjIGIgYQorICAgICAgICBzdyAgICAgICAgICAgICAgJHM0LCA0KCRhMykgICAgICAgICAgICAgIyBvdXRwdHJbNC81LzYvN10gICAgICAgaCBnIGYgZQorCisgICAgICAgIGx3ICAgICAgICAgICAgICAkYTMsIC00KCRhMSkKKworICAgICAgICBhZGR1LnFiICAgICAgICAgJHQwLCAkdDAsICRzOAorCisgICAgICAgIGFkZHUgICAgICAgICAgICAkYTMsICRhMywgJGEyCisKKyAgICAgICAgYWRkdS5xYiAgICAgICAgICR0NCwgJHQ0LCAkczgKKworCisgICAgICAgIHN3ICAgICAgICAgICAgICAkdDAsIDAoJGEzKSAgICAgICAgICAgICAjIG91dHB0clswLzEvMi8zXSAgICAgICBEIEMgQiBBCisKKyAgICAgICAgYm5lICAgICAgICAgICAgICRhMCwgJHQ5LCBsb29wX3Jvd3MKKyAgICAgICAgc3cgICAgICAgICAgICAgICR0NCwgNCgkYTMpICAgICAgICAgICAgICMgb3V0cHRyWzQvNS82LzddICAgICAgIEggRyBGIEUKKworCitleGl0X3Jvd3M6CisKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzMCwgMzIoJHNwKQorICAgICAgICBsdyAgICAgICAgICAgICAgJHMxLCAyOCgkc3ApCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczIsIDI0KCRzcCkKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzMywgMjAoJHNwKQorICAgICAgICBsdyAgICAgICAgICAgICAgJHM0LCAxNigkc3ApCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczUsIDEyKCRzcCkKKyAgICAgICAgbHcgICAgICAgICAgICAgICRzNiwgIDgoJHNwKQorICAgICAgICBsdyAgICAgICAgICAgICAgJHM3LCAgNCgkc3ApCisgICAgICAgIGx3ICAgICAgICAgICAgICAkczgsICAwKCRzcCkKKworICAgICAgICBqciAgICAgICAgICAgICAgJHJhCisgICAgICAgIGFkZGl1ICAgICAgICAgICAkc3AsICRzcCwgNDgKKworCisgICAgICAgIC5lbmQgICAgICAgICAgICBtaXBzX2lkY3Rfcm93cwpkaWZmIC0tZ2l0IGEvanBlZy9taXBzX2ppZGN0ZnN0LmMgYi9qcGVnL21pcHNfamlkY3Rmc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjA3NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9taXBzX2ppZGN0ZnN0LmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBJRENUIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBNSVBTIERTUCBBU0UgKGxpdHRsZSBlbmRpYW4gdmVyc2lvbikKKyAqCisgKiBqaWRjdGZzdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmYXN0LCBub3Qgc28gYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggZml4ZWQtcG9pbnQgbWF0aCwKKyAqIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGVkCisgKiBxdWFudGl6YXRpb24gdmFsdWVzLiAgVGhlIHNtYWxsZXIgdGhlIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyeSwgdGhlIGxlc3MKKyAqIHByZWNpc2UgdGhlIHNjYWxlZCB2YWx1ZSwgc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIHdvcnNlIHdpdGggaGlnaC0KKyAqIHF1YWxpdHktc2V0dGluZyBmaWxlcyB0aGFuIHdpdGggbG93LXF1YWxpdHkgb25lcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIiAgICAgICAgICAgICAgIC8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07CisgKiBzZWUgamlkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKKyAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCisgKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgorICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCisgKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKKyAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCisgKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCisgKgorICogVGhlIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgbm90IGludGVnZXJzIGJlY2F1c2UgdGhlIEFBJk4gc2NhbGluZworICogZmFjdG9ycyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkLiAgV2UgcmVwcmVzZW50IHRoZW0gc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMsCisgKiBzbyB0aGF0IHRoZSBmaXJzdCBhbmQgc2Vjb25kIElEQ1Qgcm91bmRzIGhhdmUgdGhlIHNhbWUgaW5wdXQgc2NhbGluZy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcywgd2UgY2hvb3NlIElGQVNUX1NDQUxFX0JJVFMgPSBQQVNTMV9CSVRTIHNvIGFzIHRvCisgKiBhdm9pZCBhIGRlc2NhbGluZyBzaGlmdDsgdGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSByYXRoZXIgZHJhc3RpY2FsbHkKKyAqIGZvciBzbWFsbCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcywgYnV0IGl0IHNhdmVzIGEgbG90IG9mIHNoaWZ0cy4KKyAqIEZvciAxMi1iaXQgSlNBTVBMRXMsIHRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyAxNngxNiBtdWx0aXBsaWVzIGFueXdheSwKKyAqIHNvIHdlIHVzZSBhIG11Y2ggbGFyZ2VyIHNjYWxpbmcgZmFjdG9yIHRvIHByZXNlcnZlIGFjY3VyYWN5LgorICoKKyAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5CisgKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCisgKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKKyAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgQ09OU1RfQklUUyAgOAorI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICA4CisjZGVmaW5lIFBBU1MxX0JJVFMgIDEgICAgICAgICAgIC8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDgKKyNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICAoKElOVDMyKSAgMjc3KSAgICAgICAgIC8qIEZJWCgxLjA4MjM5MjIwMCkgKi8KKyNkZWZpbmUgRklYXzFfNDE0MjEzNTYyICAoKElOVDMyKSAgMzYyKSAgICAgICAgIC8qIEZJWCgxLjQxNDIxMzU2MikgKi8KKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgNDczKSAgICAgICAgIC8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICAoKElOVDMyKSAgNjY5KSAgICAgICAgIC8qIEZJWCgyLjYxMzEyNTkzMCkgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgRklYKDEuMDgyMzkyMjAwKQorI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgIEZJWCgxLjQxNDIxMzU2MikKKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCisjZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgRklYKDIuNjEzMTI1OTMwKQorI2VuZGlmCisKKworLyogV2UgY2FuIGdhaW4gYSBsaXR0bGUgbW9yZSBzcGVlZCwgd2l0aCBhIGZ1cnRoZXIgY29tcHJvbWlzZSBpbiBhY2N1cmFjeSwKKyAqIGJ5IG9taXR0aW5nIHRoZSBhZGRpdGlvbiBpbiBhIGRlc2NhbGluZyBzaGlmdC4gIFRoaXMgeWllbGRzIGFuIGluY29ycmVjdGx5CisgKiByb3VuZGVkIHJlc3VsdCBoYWxmIHRoZSB0aW1lLi4uCisgKi8KKworI2lmbmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKKyN1bmRlZiBERVNDQUxFCisjZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoeCwgbikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGEgRENURUxFTSB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCwgYW5kIGltbWVkaWF0ZWx5CisgKiBkZXNjYWxlIHRvIHlpZWxkIGEgRENURUxFTSByZXN1bHQuCisgKi8KKworI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKERDVEVMRU0pIERFU0NBTEUoKHZhcikgKiAoY29uc3QpLCBDT05TVF9CSVRTKSkKKworCisvKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKKyAqIGVudHJ5OyBwcm9kdWNlIGEgRENURUxFTSByZXN1bHQuICBGb3IgOC1iaXQgZGF0YSBhIDE2eDE2LT4xNgorICogbXVsdGlwbGljYXRpb24gd2lsbCBkby4gIEZvciAxMi1iaXQgZGF0YSwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMKKyAqIGRlY2xhcmVkIElOVDMyLCBzbyBhIDMyLWJpdCBtdWx0aXBseSB3aWxsIGJlIHVzZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElGQVNUX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisjZWxzZQorI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICBcCisgICAgICAgIERFU0NBTEUoKGNvZWYpKihxdWFudHZhbCksIElGQVNUX1NDQUxFX0JJVFMtUEFTUzFfQklUUykKKyNlbmRpZgorCisKKy8qIExpa2UgREVTQ0FMRSwgYnV0IGFwcGxpZXMgdG8gYSBEQ1RFTEVNIGFuZCBwcm9kdWNlcyBhbiBpbnQuCisgKiBXZSBhc3N1bWUgdGhhdCBpbnQgcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgaWYgSU5UMzIgcmlnaHQgc2hpZnQgaXMuCisgKi8KKworI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisjZGVmaW5lIElTSElGVF9URU1QUyAgICBEQ1RFTEVNIGlzaGlmdF90ZW1wOworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIERDVEVMRU1CSVRTICAxNiAgICAgICAgIC8qIERDVEVMRU0gbWF5IGJlIDE2IG9yIDMyIGJpdHMgKi8KKyNlbHNlCisjZGVmaW5lIERDVEVMRU1CSVRTICAzMiAgICAgICAgIC8qIERDVEVMRU0gbXVzdCBiZSAzMiBiaXRzICovCisjZW5kaWYKKyNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkgIFwKKyAgICAoKGlzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCisgICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+KChEQ1RFTEVNKSAwKSkgPDwgKERDVEVMRU1CSVRTLShzaGZ0KSkpIDogXAorICAgICAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKKyNlbHNlCisjZGVmaW5lIElTSElGVF9URU1QUworI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgICAoKHgpID4+IChzaGZ0KSkKKyNlbmRpZgorCisjaWZkZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCisjZGVmaW5lIElERVNDQUxFKHgsbikgICgoaW50KSBJUklHSFRfU0hJRlQoKHgpICsgKDEgPDwgKChuKS0xKSksIG4pKQorI2Vsc2UKKyNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCh4LCBuKSkKKyNlbmRpZgorCisKKy8vIHRoaXMgdGFibGUgb2YgY29uc3RhbnRzIGhhcyBiZWVuIG1vdmVkIGZyb20gbWlwc19pZGN0X2xlL19iZS5zIHRvCisvLyBhdm9pZCBoYXZpbmcgdG8gbWFrZSB0aGUgYXNzZW1ibGVyIGNvZGUgcG9zaXRpb24gaW5kZXBlbmRlbnQKK3N0YXRpYyBjb25zdCBpbnQgbWlwc19pZGN0X2NvZWZzWzRdID0geworICAweDQ1NDY0NTQ2LCAgICAgICAgICAgLy8gRklYKCAxLjA4MjM5MjIwMCAvIDIpID0gIDE3NzM0ID0gMHg0NTQ2CisgIDB4NUE4MjVBODIsICAgICAgICAgICAvLyBGSVgoIDEuNDE0MjEzNTYyIC8gMikgPSAgMjMxNzAgPSAweDVBODIKKyAgMHg3NjQyNzY0MiwgICAgICAgICAgIC8vIEZJWCggMS44NDc3NTkwNjUgLyAyKSA9ICAzMDI3NCA9IDB4NzY0MgorICAweEFDNjFBQzYxICAgICAgICAgICAgLy8gRklYKC0yLjYxMzEyNTkzMCAvIDQpID0gLTIxNDA3ID0gMHhBQzYxCit9OworCit2b2lkIG1pcHNfaWRjdF9jb2x1bW5zKEpDT0VGICogaW5wdHIsIElGQVNUX01VTFRfVFlQRSAqIHF1YW50cHRyLAorICAgICAgICAgICAgICAgICAgICAgICBEQ1RFTEVNICogd3NwdHIsIGNvbnN0IGludCAqIG1pcHNfaWRjdF9jb2Vmcyk7Cit2b2lkIG1pcHNfaWRjdF9yb3dzKERDVEVMRU0gKiB3c3B0ciwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICBKRElNRU5TSU9OIG91dHB1dF9jb2wsIGNvbnN0IGludCAqIG1pcHNfaWRjdF9jb2Vmcyk7CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfbWlwcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisgICAgICAgICAgICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisgICAgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBKQ09FRlBUUiBpbnB0cjsKKyAgSUZBU1RfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIERDVEVMRU0gd29ya3NwYWNlW0RDVFNJWkUyXTsgIC8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElGQVNUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisKKyAgbWlwc19pZGN0X2NvbHVtbnMoaW5wdHIsIHF1YW50cHRyLCB3b3Jrc3BhY2UsIG1pcHNfaWRjdF9jb2Vmcyk7CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCisgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KKworICBtaXBzX2lkY3Rfcm93cyh3b3Jrc3BhY2UsIG91dHB1dF9idWYsIG91dHB1dF9jb2wsIG1pcHNfaWRjdF9jb2Vmcyk7CisKK30KKworI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvcmRibXAuYyBiL2pwZWcvcmRibXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDVmZTJhCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy9yZGJtcC5jCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogcmRibXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIE1pY3Jvc29mdCAiQk1QIgorICogZm9ybWF0IChNUyBXaW5kb3dzIDMueCwgT1MvMiAxLngsIGFuZCBPUy8yIDIueCBmbGF2b3JzKS4KKyAqIEN1cnJlbnRseSwgb25seSA4LWJpdCBhbmQgMjQtYml0IGltYWdlcyBhcmUgc3VwcG9ydGVkLCBub3QgMS1iaXQgb3IKKyAqIDQtYml0IChmZWVkaW5nIHN1Y2ggbG93LWRlcHRoIGltYWdlcyBpbnRvIEpQRUcgd291bGQgYmUgc2lsbHkgYW55d2F5KS4KKyAqIEFsc28sIHdlIGRvbid0IHN1cHBvcnQgUkxFLWNvbXByZXNzZWQgZmlsZXMuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIGlucHV0IGZyb20KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4gIFRoZXkgZnVydGhlciBhc3N1bWUgdGhhdCByZWFkaW5nIGJlZ2lucworICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlOyBzdGFydF9pbnB1dCBtYXkgbmVlZCB3b3JrIGlmIHRoZQorICogdXNlciBpbnRlcmZhY2UgaGFzIGFscmVhZHkgcmVhZCBzb21lIGRhdGEgKGUuZy4sIHRvIGRldGVybWluZSB0aGF0CisgKiB0aGUgZmlsZSBpcyBpbmRlZWQgQk1QIGZvcm1hdCkuCisgKgorICogVGhpcyBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEphbWVzIEFydGh1ciBCb3VjaGVyLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBCTVBfU1VQUE9SVEVECisKKworLyogTWFjcm9zIHRvIGRlYWwgd2l0aCB1bnNpZ25lZCBjaGFycyBhcyBlZmZpY2llbnRseSBhcyBjb21waWxlciBhbGxvd3MgKi8KKworI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCisjZWxzZSAvKiAhSEFWRV9VTlNJR05FRF9DSEFSICovCisjaWZkZWYgQ0hBUl9JU19VTlNJR05FRAordHlwZWRlZiBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCisjZWxzZQordHlwZWRlZiBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkgJiAweEZGKQorI2VuZGlmCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKworI2RlZmluZQlSZWFkT0soZmlsZSxidWZmZXIsbGVuKQkoSkZSRUFEKGZpbGUsYnVmZmVyLGxlbikgPT0gKChzaXplX3QpIChsZW4pKSkKKworCisvKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBzb3VyY2Ugb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IF9ibXBfc291cmNlX3N0cnVjdCAqIGJtcF9zb3VyY2VfcHRyOworCit0eXBlZGVmIHN0cnVjdCBfYm1wX3NvdXJjZV9zdHJ1Y3QgeworICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KKworICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogQk1QIGNvbG9ybWFwIChjb252ZXJ0ZWQgdG8gbXkgZm9ybWF0KSAqLworCisgIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIE5lZWRlZCB0byByZXZlcnNlIHJvdyBvcmRlciAqLworICBKRElNRU5TSU9OIHNvdXJjZV9yb3c7CS8qIEN1cnJlbnQgc291cmNlIHJvdyBudW1iZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dfd2lkdGg7CQkvKiBQaHlzaWNhbCB3aWR0aCBvZiBzY2FubGluZXMgaW4gZmlsZSAqLworCisgIGludCBiaXRzX3Blcl9waXhlbDsJCS8qIHJlbWVtYmVycyA4LSBvciAyNC1iaXQgZm9ybWF0ICovCit9IGJtcF9zb3VyY2Vfc3RydWN0OworCisKK0xPQ0FMKGludCkKK3JlYWRfYnl0ZSAoYm1wX3NvdXJjZV9wdHIgc2luZm8pCisvKiBSZWFkIG5leHQgYnl0ZSBmcm9tIEJNUCBmaWxlICovCit7CisgIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKKyAgcmVnaXN0ZXIgaW50IGM7CisKKyAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCisgICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgcmV0dXJuIGM7Cit9CisKKworTE9DQUwodm9pZCkKK3JlYWRfY29sb3JtYXAgKGJtcF9zb3VyY2VfcHRyIHNpbmZvLCBpbnQgY21hcGxlbiwgaW50IG1hcGVudHJ5c2l6ZSkKKy8qIFJlYWQgdGhlIGNvbG9ybWFwIGZyb20gYSBCTVAgZmlsZSAqLworeworICBpbnQgaTsKKworICBzd2l0Y2ggKG1hcGVudHJ5c2l6ZSkgeworICBjYXNlIDM6CisgICAgLyogQkdSIGZvcm1hdCAob2NjdXJzIGluIE9TLzIgZmlsZXMpICovCisgICAgZm9yIChpID0gMDsgaSA8IGNtYXBsZW47IGkrKykgeworICAgICAgc2luZm8tPmNvbG9ybWFwWzJdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgICBzaW5mby0+Y29sb3JtYXBbMV1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICAgIHNpbmZvLT5jb2xvcm1hcFswXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIC8qIEJHUjAgZm9ybWF0IChvY2N1cnMgaW4gTVMgV2luZG93cyBmaWxlcykgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7CisgICAgICBzaW5mby0+Y29sb3JtYXBbMl1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICAgIHNpbmZvLT5jb2xvcm1hcFsxXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgICAgc2luZm8tPmNvbG9ybWFwWzBdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgICAodm9pZCkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfQk1QX0JBRENNQVApOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCisgKiBUaGUgaW1hZ2UgaGFzIGJlZW4gcmVhZCBpbnRvIHRoZSB3aG9sZV9pbWFnZSBhcnJheSwgYnV0IGlzIG90aGVyd2lzZQorICogdW5wcm9jZXNzZWQuICBXZSBtdXN0IHJlYWQgaXQgb3V0IGluIHRvcC10by1ib3R0b20gcm93IG9yZGVyLCBhbmQgaWYKKyAqIGl0IGlzIGFuIDgtYml0IGltYWdlLCB3ZSBtdXN0IGV4cGFuZCBjb2xvcm1hcHBlZCBwaXhlbHMgdG8gMjRiaXQgZm9ybWF0LgorICovCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0XzhiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyA4LWJpdCBjb2xvcm1hcCBpbmRleGVzICovCit7CisgIGJtcF9zb3VyY2VfcHRyIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBzb3VyY2UtPmNvbG9ybWFwOworICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKKyAgcmVnaXN0ZXIgaW50IHQ7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIC8qIEZldGNoIG5leHQgcm93IGZyb20gdmlydHVhbCBhcnJheSAqLworICBzb3VyY2UtPnNvdXJjZV9yb3ctLTsKKyAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAorICAgICBzb3VyY2UtPnNvdXJjZV9yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisKKyAgLyogRXhwYW5kIHRoZSBjb2xvcm1hcCBpbmRleGVzIHRvIHJlYWwgZGF0YSAqLworICBpbnB0ciA9IGltYWdlX3B0clswXTsKKyAgb3V0cHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICB0ID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgKm91dHB0cisrID0gY29sb3JtYXBbMF1bdF07CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KKyAgICAqb3V0cHRyKysgPSBjb2xvcm1hcFsxXVt0XTsKKyAgICAqb3V0cHRyKysgPSBjb2xvcm1hcFsyXVt0XTsKKyAgfQorCisgIHJldHVybiAxOworfQorCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0XzI0Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgMjQtYml0IHBpeGVscyAqLworeworICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOworICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgLyogRmV0Y2ggbmV4dCByb3cgZnJvbSB2aXJ0dWFsIGFycmF5ICovCisgIHNvdXJjZS0+c291cmNlX3Jvdy0tOworICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCisgICAgIHNvdXJjZS0+c291cmNlX3JvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKworICAvKiBUcmFuc2ZlciBkYXRhLiAgTm90ZSBzb3VyY2UgdmFsdWVzIGFyZSBpbiBCR1Igb3JkZXIKKyAgICogKGV2ZW4gdGhvdWdoIE1pY3Jvc29mdCdzIG93biBkb2N1bWVudHMgc2F5IHRoZSBvcHBvc2l0ZSkuCisgICAqLworICBpbnB0ciA9IGltYWdlX3B0clswXTsKKyAgb3V0cHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICBvdXRwdHJbMl0gPSAqaW5wdHIrKzsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLworICAgIG91dHB0clsxXSA9ICppbnB0cisrOworICAgIG91dHB0clswXSA9ICppbnB0cisrOworICAgIG91dHB0ciArPSAzOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFRoaXMgbWV0aG9kIGxvYWRzIHRoZSBpbWFnZSBpbnRvIHdob2xlX2ltYWdlIGR1cmluZyB0aGUgZmlyc3QgY2FsbCBvbgorICogZ2V0X3BpeGVsX3Jvd3MuICBUaGUgZ2V0X3BpeGVsX3Jvd3MgcG9pbnRlciBpcyB0aGVuIGFkanVzdGVkIHRvIGNhbGwKKyAqIGdldF84Yml0X3JvdyBvciBnZXRfMjRiaXRfcm93IG9uIHN1YnNlcXVlbnQgY2FsbHMuCisgKi8KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitwcmVsb2FkX2ltYWdlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dF9wdHI7CisgIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOworICBKRElNRU5TSU9OIHJvdywgY29sOworICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisKKyAgLyogUmVhZCB0aGUgZGF0YSBpbnRvIGEgdmlydHVhbCBhcnJheSBpbiBpbnB1dC1maWxlIHJvdyBvcmRlci4gKi8KKyAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgeworICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IChsb25nKSByb3c7CisgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgIH0KKyAgICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKKyAgICAgICByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgICBvdXRfcHRyID0gaW1hZ2VfcHRyWzBdOworICAgIGZvciAoY29sID0gc291cmNlLT5yb3dfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAvKiBpbmxpbmUgY29weSBvZiByZWFkX2J5dGUoKSBmb3Igc3BlZWQgKi8KKyAgICAgIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgICAgICpvdXRfcHRyKysgPSAoSlNBTVBMRSkgYzsKKyAgICB9CisgIH0KKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpCisgICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKKworICAvKiBTZXQgdXAgdG8gcmVhZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5IGluIHRvcC10by1ib3R0b20gb3JkZXIgKi8KKyAgc3dpdGNoIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsKSB7CisgIGNhc2UgODoKKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF84Yml0X3JvdzsKKyAgICBicmVhazsKKyAgY2FzZSAyNDoKKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF8yNGJpdF9yb3c7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOworICB9CisgIHNvdXJjZS0+c291cmNlX3JvdyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisKKyAgLyogQW5kIHJlYWQgdGhlIGZpcnN0IHJvdyAqLworICByZXR1cm4gKCpzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfaW5wdXRfYm1wIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgVV9DSEFSIGJtcGZpbGVoZWFkZXJbMTRdOworICBVX0NIQVIgYm1waW5mb2hlYWRlcls2NF07CisjZGVmaW5lIEdFVF8yQihhcnJheSxvZmZzZXQpICAoKHVuc2lnbmVkIGludCkgVUNIKGFycmF5W29mZnNldF0pICsgXAorCQkJICAgICAgICgoKHVuc2lnbmVkIGludCkgVUNIKGFycmF5W29mZnNldCsxXSkpIDw8IDgpKQorI2RlZmluZSBHRVRfNEIoYXJyYXksb2Zmc2V0KSAgKChJTlQzMikgVUNIKGFycmF5W29mZnNldF0pICsgXAorCQkJICAgICAgICgoKElOVDMyKSBVQ0goYXJyYXlbb2Zmc2V0KzFdKSkgPDwgOCkgKyBcCisJCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrMl0pKSA8PCAxNikgKyBcCisJCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrM10pKSA8PCAyNCkpCisgIElOVDMyIGJmT2ZmQml0czsKKyAgSU5UMzIgaGVhZGVyU2l6ZTsKKyAgSU5UMzIgYmlXaWR0aCA9IDA7CQkvKiBpbml0aWFsaXplIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgSU5UMzIgYmlIZWlnaHQgPSAwOworICB1bnNpZ25lZCBpbnQgYmlQbGFuZXM7CisgIElOVDMyIGJpQ29tcHJlc3Npb247CisgIElOVDMyIGJpWFBlbHNQZXJNZXRlcixiaVlQZWxzUGVyTWV0ZXI7CisgIElOVDMyIGJpQ2xyVXNlZCA9IDA7CisgIGludCBtYXBlbnRyeXNpemUgPSAwOwkJLyogMCBpbmRpY2F0ZXMgbm8gY29sb3JtYXAgKi8KKyAgSU5UMzIgYlBhZDsKKyAgSkRJTUVOU0lPTiByb3dfd2lkdGg7CisKKyAgLyogUmVhZCBhbmQgdmVyaWZ5IHRoZSBiaXRtYXAgZmlsZSBoZWFkZXIgKi8KKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIGJtcGZpbGVoZWFkZXIsIDE0KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIGlmIChHRVRfMkIoYm1wZmlsZWhlYWRlciwwKSAhPSAweDRENDIpIC8qICdCTScgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9OT1QpOworICBiZk9mZkJpdHMgPSAoSU5UMzIpIEdFVF80QihibXBmaWxlaGVhZGVyLDEwKTsKKyAgLyogV2UgaWdub3JlIHRoZSByZW1haW5pbmcgZmlsZWhlYWRlciBmaWVsZHMgKi8KKworICAvKiBUaGUgaW5mb2hlYWRlciBtaWdodCBiZSAxMiBieXRlcyAoT1MvMiAxLngpLCA0MCBieXRlcyAoV2luZG93cyksCisgICAqIG9yIDY0IGJ5dGVzIChPUy8yIDIueCkuICBDaGVjayB0aGUgZmlyc3QgNCBieXRlcyB0byBmaW5kIG91dCB3aGljaC4KKyAgICovCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBibXBpbmZvaGVhZGVyLCA0KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIGhlYWRlclNpemUgPSAoSU5UMzIpIEdFVF80QihibXBpbmZvaGVhZGVyLDApOworICBpZiAoaGVhZGVyU2l6ZSA8IDEyIHx8IGhlYWRlclNpemUgPiA2NCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgYm1waW5mb2hlYWRlcis0LCBoZWFkZXJTaXplLTQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKworICBzd2l0Y2ggKChpbnQpIGhlYWRlclNpemUpIHsKKyAgY2FzZSAxMjoKKyAgICAvKiBEZWNvZGUgT1MvMiAxLnggaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUENPUkVIRUFERVIpICovCisgICAgYmlXaWR0aCA9IChJTlQzMikgR0VUXzJCKGJtcGluZm9oZWFkZXIsNCk7CisgICAgYmlIZWlnaHQgPSAoSU5UMzIpIEdFVF8yQihibXBpbmZvaGVhZGVyLDYpOworICAgIGJpUGxhbmVzID0gR0VUXzJCKGJtcGluZm9oZWFkZXIsOCk7CisgICAgc291cmNlLT5iaXRzX3Blcl9waXhlbCA9IChpbnQpIEdFVF8yQihibXBpbmZvaGVhZGVyLDEwKTsKKworICAgIHN3aXRjaCAoc291cmNlLT5iaXRzX3Blcl9waXhlbCkgeworICAgIGNhc2UgODoJCQkvKiBjb2xvcm1hcHBlZCBpbWFnZSAqLworICAgICAgbWFwZW50cnlzaXplID0gMzsJCS8qIE9TLzIgdXNlcyBSR0JUUklQTEUgY29sb3JtYXAgKi8KKyAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0JNUF9PUzJfTUFQUEVELCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgkJCS8qIFJHQiBpbWFnZSAqLworICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QX09TMiwgKGludCkgYmlXaWR0aCwgKGludCkgYmlIZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRERFUFRIKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYmlQbGFuZXMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRFBMQU5FUyk7CisgICAgYnJlYWs7CisgIGNhc2UgNDA6CisgIGNhc2UgNjQ6CisgICAgLyogRGVjb2RlIFdpbmRvd3MgMy54IGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBJTkZPSEVBREVSKSAqLworICAgIC8qIG9yIE9TLzIgMi54IGhlYWRlciwgd2hpY2ggaGFzIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgd2UgaWdub3JlICovCisgICAgYmlXaWR0aCA9IEdFVF80QihibXBpbmZvaGVhZGVyLDQpOworICAgIGJpSGVpZ2h0ID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsOCk7CisgICAgYmlQbGFuZXMgPSBHRVRfMkIoYm1waW5mb2hlYWRlciwxMik7CisgICAgc291cmNlLT5iaXRzX3Blcl9waXhlbCA9IChpbnQpIEdFVF8yQihibXBpbmZvaGVhZGVyLDE0KTsKKyAgICBiaUNvbXByZXNzaW9uID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMTYpOworICAgIGJpWFBlbHNQZXJNZXRlciA9IEdFVF80QihibXBpbmZvaGVhZGVyLDI0KTsKKyAgICBiaVlQZWxzUGVyTWV0ZXIgPSBHRVRfNEIoYm1waW5mb2hlYWRlciwyOCk7CisgICAgYmlDbHJVc2VkID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMzIpOworICAgIC8qIGJpU2l6ZUltYWdlLCBiaUNsckltcG9ydGFudCBmaWVsZHMgYXJlIGlnbm9yZWQgKi8KKworICAgIHN3aXRjaCAoc291cmNlLT5iaXRzX3Blcl9waXhlbCkgeworICAgIGNhc2UgODoJCQkvKiBjb2xvcm1hcHBlZCBpbWFnZSAqLworICAgICAgbWFwZW50cnlzaXplID0gNDsJCS8qIFdpbmRvd3MgdXNlcyBSR0JRVUFEIGNvbG9ybWFwICovCisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVBfTUFQUEVELCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgkJCS8qIFJHQiBpbWFnZSAqLworICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QLCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChiaVBsYW5lcyAhPSAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEUExBTkVTKTsKKyAgICBpZiAoYmlDb21wcmVzc2lvbiAhPSAwKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQ09NUFJFU1NFRCk7CisKKyAgICBpZiAoYmlYUGVsc1Blck1ldGVyID4gMCAmJiBiaVlQZWxzUGVyTWV0ZXIgPiAwKSB7CisgICAgICAvKiBTZXQgSkZJRiBkZW5zaXR5IHBhcmFtZXRlcnMgZnJvbSB0aGUgQk1QIGRhdGEgKi8KKyAgICAgIGNpbmZvLT5YX2RlbnNpdHkgPSAoVUlOVDE2KSAoYmlYUGVsc1Blck1ldGVyLzEwMCk7IC8qIDEwMCBjbSBwZXIgbWV0ZXIgKi8KKyAgICAgIGNpbmZvLT5ZX2RlbnNpdHkgPSAoVUlOVDE2KSAoYmlZUGVsc1Blck1ldGVyLzEwMCk7CisgICAgICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMjsJLyogZG90cy9jbSAqLworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOworICAgIGJyZWFrOworICB9CisKKyAgLyogQ29tcHV0ZSBkaXN0YW5jZSB0byBiaXRtYXAgZGF0YSAtLS0gd2lsbCBhZGp1c3QgZm9yIGNvbG9ybWFwIGJlbG93ICovCisgIGJQYWQgPSBiZk9mZkJpdHMgLSAoaGVhZGVyU2l6ZSArIDE0KTsKKworICAvKiBSZWFkIHRoZSBjb2xvcm1hcCwgaWYgYW55ICovCisgIGlmIChtYXBlbnRyeXNpemUgPiAwKSB7CisgICAgaWYgKGJpQ2xyVXNlZCA8PSAwKQorICAgICAgYmlDbHJVc2VkID0gMjU2OwkJLyogYXNzdW1lIGl0J3MgMjU2ICovCisgICAgZWxzZSBpZiAoYmlDbHJVc2VkID4gMjU2KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEQ01BUCk7CisgICAgLyogQWxsb2NhdGUgc3BhY2UgdG8gc3RvcmUgdGhlIGNvbG9ybWFwICovCisgICAgc291cmNlLT5jb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAoSkRJTUVOU0lPTikgYmlDbHJVc2VkLCAoSkRJTUVOU0lPTikgMyk7CisgICAgLyogYW5kIHJlYWQgaXQgZnJvbSB0aGUgZmlsZSAqLworICAgIHJlYWRfY29sb3JtYXAoc291cmNlLCAoaW50KSBiaUNsclVzZWQsIG1hcGVudHJ5c2l6ZSk7CisgICAgLyogYWNjb3VudCBmb3Igc2l6ZSBvZiBjb2xvcm1hcCAqLworICAgIGJQYWQgLT0gYmlDbHJVc2VkICogbWFwZW50cnlzaXplOworICB9CisKKyAgLyogU2tpcCBhbnkgcmVtYWluaW5nIHBhZCBieXRlcyAqLworICBpZiAoYlBhZCA8IDApCQkJLyogaW5jb3JyZWN0IGJmT2ZmQml0cyB2YWx1ZT8gKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURIRUFERVIpOworICB3aGlsZSAoLS1iUGFkID49IDApIHsKKyAgICAodm9pZCkgcmVhZF9ieXRlKHNvdXJjZSk7CisgIH0KKworICAvKiBDb21wdXRlIHJvdyB3aWR0aCBpbiBmaWxlLCBpbmNsdWRpbmcgcGFkZGluZyB0byA0LWJ5dGUgYm91bmRhcnkgKi8KKyAgaWYgKHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwgPT0gMjQpCisgICAgcm93X3dpZHRoID0gKEpESU1FTlNJT04pIChiaVdpZHRoICogMyk7CisgIGVsc2UKKyAgICByb3dfd2lkdGggPSAoSkRJTUVOU0lPTikgYmlXaWR0aDsKKyAgd2hpbGUgKChyb3dfd2lkdGggJiAzKSAhPSAwKSByb3dfd2lkdGgrKzsKKyAgc291cmNlLT5yb3dfd2lkdGggPSByb3dfd2lkdGg7CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGludmVyc2lvbiBhcnJheSwgcHJlcGFyZSBmb3IgcHJlbG9hZCBwYXNzICovCisgIHNvdXJjZS0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisgICAgIHJvd193aWR0aCwgKEpESU1FTlNJT04pIGJpSGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7CisgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gcHJlbG9hZF9pbWFnZTsKKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCisgIH0KKworICAvKiBBbGxvY2F0ZSBvbmUtcm93IGJ1ZmZlciBmb3IgcmV0dXJuZWQgZGF0YSAqLworICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAoSkRJTUVOU0lPTikgKGJpV2lkdGggKiAzKSwgKEpESU1FTlNJT04pIDEpOworICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKworICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7CisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IDg7CisgIGNpbmZvLT5pbWFnZV93aWR0aCA9IChKRElNRU5TSU9OKSBiaVdpZHRoOworICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGJpSGVpZ2h0OworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9pbnB1dF9ibXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEJNUCBmb3JtYXQgaW5wdXQuCisgKi8KKworR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCitqaW5pdF9yZWFkX2JtcCAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGJtcF9zb3VyY2VfcHRyIHNvdXJjZTsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KKyAgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihibXBfc291cmNlX3N0cnVjdCkpOworICBzb3VyY2UtPmNpbmZvID0gY2luZm87CS8qIG1ha2UgYmFjayBsaW5rIGZvciBzdWJyb3V0aW5lcyAqLworICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzLCBleGNlcHQgZ2V0X3BpeGVsX3Jvd3Mgd2hpY2ggc3RhcnRfaW5wdXQgc2V0cyAqLworICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X2JtcDsKKyAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X2JtcDsKKworICByZXR1cm4gKGNqcGVnX3NvdXJjZV9wdHIpIHNvdXJjZTsKK30KKworI2VuZGlmIC8qIEJNUF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvcmRjb2xtYXAuYyBiL2pwZWcvcmRjb2xtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmIzNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9yZGNvbG1hcC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogcmRjb2xtYXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgZGpwZWcncyAiLW1hcCBmaWxlIiBzd2l0Y2guICBJdCByZWFkcyBhIHNvdXJjZSBpbWFnZQorICogYW5kIGNvbnN0cnVjdHMgYSBjb2xvcm1hcCB0byBiZSBzdXBwbGllZCB0byB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCisgKgorICogQ3VycmVudGx5LCB0aGVzZSBmaWxlIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCBmb3IgdGhlIG1hcCBmaWxlOgorICogICBHSUY6IHRoZSBjb250ZW50cyBvZiB0aGUgR0lGJ3MgZ2xvYmFsIGNvbG9ybWFwIGFyZSB1c2VkLgorICogICBQUE0gKGVpdGhlciB0ZXh0IG9yIHJhdyBmbGF2b3IpOiB0aGUgZW50aXJlIGZpbGUgaXMgcmVhZCBhbmQKKyAqICAgICAgZWFjaCB1bmlxdWUgcGl4ZWwgdmFsdWUgaXMgZW50ZXJlZCBpbiB0aGUgbWFwLgorICogTm90ZSB0aGF0IHJlYWRpbmcgYSBsYXJnZSBQUE0gZmlsZSB3aWxsIGJlIGhvcnJlbmRvdXNseSBzbG93LgorICogVHlwaWNhbGx5LCBhIFBQTS1mb3JtYXQgbWFwIGZpbGUgc2hvdWxkIGNvbnRhaW4ganVzdCBvbmUgcGl4ZWwKKyAqIG9mIGVhY2ggZGVzaXJlZCBjb2xvci4gIFN1Y2ggYSBmaWxlIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBhbgorICogb3JkaW5hcnkgaW1hZ2UgUFBNIGZpbGUgd2l0aCBwcG10b21hcCgxKS4KKyAqCisgKiBSZXNjYWxpbmcgYSBQUE0gdGhhdCBoYXMgYSBtYXh2YWwgdW5lcXVhbCB0byBNQVhKU0FNUExFIGlzIG5vdAorICogY3VycmVudGx5IGltcGxlbWVudGVkLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQJLyogb3RoZXJ3aXNlIGNhbid0IHF1YW50aXplIHRvIHN1cHBsaWVkIG1hcCAqLworCisvKiBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYXJlIGJhc2VkIG9uIHRoZSBQQk1QTFVTIGxpYnJhcnksIHdoaWNoIGlzOgorKioKKyoqIENvcHlyaWdodCAoQykgMTk4OCBieSBKZWYgUG9za2FuemVyLgorKioKKyoqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworKiogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAorKiogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyoqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyoqIGRvY3VtZW50YXRpb24uICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCisqKiBpbXBsaWVkIHdhcnJhbnR5LgorKi8KKworCisvKgorICogQWRkIGEgKHBvdGVudGlhbGx5KSBuZXcgY29sb3IgdG8gdGhlIGNvbG9yIG1hcC4KKyAqLworCitMT0NBTCh2b2lkKQorYWRkX21hcF9lbnRyeSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IFIsIGludCBHLCBpbnQgQikKK3sKKyAgSlNBTVBST1cgY29sb3JtYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOworICBKU0FNUFJPVyBjb2xvcm1hcDEgPSBjaW5mby0+Y29sb3JtYXBbMV07CisgIEpTQU1QUk9XIGNvbG9ybWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKKyAgaW50IG5jb2xvcnMgPSBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnM7CisgIGludCBpbmRleDsKKworICAvKiBDaGVjayBmb3IgZHVwbGljYXRlIGNvbG9yLiAqLworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuY29sb3JzOyBpbmRleCsrKSB7CisgICAgaWYgKEdFVEpTQU1QTEUoY29sb3JtYXAwW2luZGV4XSkgPT0gUiAmJgorCUdFVEpTQU1QTEUoY29sb3JtYXAxW2luZGV4XSkgPT0gRyAmJgorCUdFVEpTQU1QTEUoY29sb3JtYXAyW2luZGV4XSkgPT0gQikKKyAgICAgIHJldHVybjsJCQkvKiBjb2xvciBpcyBhbHJlYWR5IGluIG1hcCAqLworICB9CisKKyAgLyogQ2hlY2sgZm9yIG1hcCBvdmVyZmxvdy4gKi8KKyAgaWYgKG5jb2xvcnMgPj0gKE1BWEpTQU1QTEUrMSkpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsIChNQVhKU0FNUExFKzEpKTsKKworICAvKiBPSywgYWRkIGNvbG9yIHRvIG1hcC4gKi8KKyAgY29sb3JtYXAwW25jb2xvcnNdID0gKEpTQU1QTEUpIFI7CisgIGNvbG9ybWFwMVtuY29sb3JzXSA9IChKU0FNUExFKSBHOworICBjb2xvcm1hcDJbbmNvbG9yc10gPSAoSlNBTVBMRSkgQjsKKyAgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzKys7Cit9CisKKworLyoKKyAqIEV4dHJhY3QgY29sb3IgbWFwIGZyb20gYSBHSUYgZmlsZS4KKyAqLworCitMT0NBTCh2b2lkKQorcmVhZF9naWZfbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQoreworICBpbnQgaGVhZGVyWzEzXTsKKyAgaW50IGksIGNvbG9ybWFwbGVuOworICBpbnQgUiwgRywgQjsKKworICAvKiBJbml0aWFsICdHJyBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgYnkgcmVhZF9jb2xvcl9tYXAgKi8KKyAgLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgR0lGIGhlYWRlciBhbmQgbG9naWNhbCBzY3JlZW4gZGVzY3JpcHRvciAqLworICBmb3IgKGkgPSAxOyBpIDwgMTM7IGkrKykgeworICAgIGlmICgoaGVhZGVyW2ldID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworICB9CisKKyAgLyogVmVyaWZ5IEdJRiBIZWFkZXIgKi8KKyAgaWYgKGhlYWRlclsxXSAhPSAnSScgfHwgaGVhZGVyWzJdICE9ICdGJykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworCisgIC8qIFRoZXJlIG11c3QgYmUgYSBnbG9iYWwgY29sb3IgbWFwLiAqLworICBpZiAoKGhlYWRlclsxMF0gJiAweDgwKSA9PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisKKyAgLyogT0ssIGZldGNoIGl0LiAqLworICBjb2xvcm1hcGxlbiA9IDIgPDwgKGhlYWRlclsxMF0gJiAweDA3KTsKKworICBmb3IgKGkgPSAwOyBpIDwgY29sb3JtYXBsZW47IGkrKykgeworICAgIFIgPSBnZXRjKGluZmlsZSk7CisgICAgRyA9IGdldGMoaW5maWxlKTsKKyAgICBCID0gZ2V0YyhpbmZpbGUpOworICAgIGlmIChSID09IEVPRiB8fCBHID09IEVPRiB8fCBCID09IEVPRikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisgICAgYWRkX21hcF9lbnRyeShjaW5mbywKKwkJICBSIDw8IChCSVRTX0lOX0pTQU1QTEUtOCksCisJCSAgRyA8PCAoQklUU19JTl9KU0FNUExFLTgpLAorCQkgIEIgPDwgKEJJVFNfSU5fSlNBTVBMRS04KSk7CisgIH0KK30KKworCisvKiBTdXBwb3J0IHJvdXRpbmVzIGZvciByZWFkaW5nIFBQTSAqLworCisKK0xPQ0FMKGludCkKK3BibV9nZXRjIChGSUxFICogaW5maWxlKQorLyogUmVhZCBuZXh0IGNoYXIsIHNraXBwaW5nIG92ZXIgYW55IGNvbW1lbnRzICovCisvKiBBIGNvbW1lbnQvbmV3bGluZSBzZXF1ZW5jZSBpcyByZXR1cm5lZCBhcyBhIG5ld2xpbmUgKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNoOworICAKKyAgY2ggPSBnZXRjKGluZmlsZSk7CisgIGlmIChjaCA9PSAnIycpIHsKKyAgICBkbyB7CisgICAgICBjaCA9IGdldGMoaW5maWxlKTsKKyAgICB9IHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRik7CisgIH0KKyAgcmV0dXJuIGNoOworfQorCisKK0xPQ0FMKHVuc2lnbmVkIGludCkKK3JlYWRfcGJtX2ludGVnZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCisvKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIHRoZSBQUE0gZmlsZSAqLworLyogU3dhbGxvd3Mgb25lIHRyYWlsaW5nIGNoYXJhY3RlciBhZnRlciB0aGUgaW50ZWdlciAqLworLyogTm90ZSB0aGF0IG9uIGEgMTYtYml0LWludCBtYWNoaW5lLCBvbmx5IHZhbHVlcyB1cCB0byA2NGsgY2FuIGJlIHJlYWQuICovCisvKiBUaGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlLiAqLworeworICByZWdpc3RlciBpbnQgY2g7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB2YWw7CisgIAorICAvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgZG8geworICAgIGNoID0gcGJtX2dldGMoaW5maWxlKTsKKyAgICBpZiAoY2ggPT0gRU9GKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKyAgfSB3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInKTsKKyAgCisgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworICAKKyAgdmFsID0gY2ggLSAnMCc7CisgIHdoaWxlICgoY2ggPSBwYm1fZ2V0YyhpbmZpbGUpKSA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgdmFsICo9IDEwOworICAgIHZhbCArPSBjaCAtICcwJzsKKyAgfQorICByZXR1cm4gdmFsOworfQorCisKKy8qCisgKiBFeHRyYWN0IGNvbG9yIG1hcCBmcm9tIGEgUFBNIGZpbGUuCisgKi8KKworTE9DQUwodm9pZCkKK3JlYWRfcHBtX21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgaW50IGM7CisgIHVuc2lnbmVkIGludCB3LCBoLCBtYXh2YWwsIHJvdywgY29sOworICBpbnQgUiwgRywgQjsKKworICAvKiBJbml0aWFsICdQJyBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgYnkgcmVhZF9jb2xvcl9tYXAgKi8KKyAgYyA9IGdldGMoaW5maWxlKTsJCS8qIHNhdmUgZm9ybWF0IGRpc2NyaW1pbmF0b3IgZm9yIGEgc2VjICovCisKKyAgLyogd2hpbGUgd2UgZmV0Y2ggdGhlIHJlbWFpbmluZyBoZWFkZXIgaW5mbyAqLworICB3ID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKKyAgaCA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7CisgIG1heHZhbCA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7CisKKyAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgbWF4dmFsIDw9IDApIC8qIGVycm9yIGNoZWNrICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKworICAvKiBGb3Igbm93LCB3ZSBkb24ndCBzdXBwb3J0IHJlc2NhbGluZyBmcm9tIGFuIHVudXN1YWwgbWF4dmFsLiAqLworICBpZiAobWF4dmFsICE9ICh1bnNpZ25lZCBpbnQpIE1BWEpTQU1QTEUpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKworICBzd2l0Y2ggKGMpIHsKKyAgY2FzZSAnMyc6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBQTSBmaWxlICovCisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoOyByb3crKykgeworICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3OyBjb2wrKykgeworCVIgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOworCUcgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOworCUIgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOworCWFkZF9tYXBfZW50cnkoY2luZm8sIFIsIEcsIEIpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICBjYXNlICc2JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQUE0gZmlsZSAqLworICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93KyspIHsKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdzsgY29sKyspIHsKKwlSID0gZ2V0YyhpbmZpbGUpOworCUcgPSBnZXRjKGluZmlsZSk7CisJQiA9IGdldGMoaW5maWxlKTsKKwlpZiAoUiA9PSBFT0YgfHwgRyA9PSBFT0YgfHwgQiA9PSBFT0YpCisJICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworCWFkZF9tYXBfZW50cnkoY2luZm8sIFIsIEcsIEIpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogTWFpbiBlbnRyeSBwb2ludCBmcm9tIGRqcGVnLmMuCisgKiAgSW5wdXQ6IG9wZW5lZCBpbnB1dCBmaWxlIChmcm9tIGZpbGUgbmFtZSBhcmd1bWVudCBvbiBjb21tYW5kIGxpbmUpLgorICogIE91dHB1dDogY29sb3JtYXAgYW5kIGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzIGZpZWxkcyBhcmUgc2V0IGluIGNpbmZvLgorICovCisKK0dMT0JBTCh2b2lkKQorcmVhZF9jb2xvcl9tYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCit7CisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvbG9yIG1hcCBvZiBtYXhpbXVtIHN1cHBvcnRlZCBzaXplLiAqLworICBjaW5mby0+Y29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAoSkRJTUVOU0lPTikgKE1BWEpTQU1QTEUrMSksIChKRElNRU5TSU9OKSAzKTsKKyAgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzID0gMDsgLyogaW5pdGlhbGl6ZSBtYXAgdG8gZW1wdHkgKi8KKworICAvKiBSZWFkIGZpcnN0IGJ5dGUgdG8gZGV0ZXJtaW5lIGZpbGUgZm9ybWF0ICovCisgIHN3aXRjaCAoZ2V0YyhpbmZpbGUpKSB7CisgIGNhc2UgJ0cnOgorICAgIHJlYWRfZ2lmX21hcChjaW5mbywgaW5maWxlKTsKKyAgICBicmVhazsKKyAgY2FzZSAnUCc6CisgICAgcmVhZF9wcG1fbWFwKGNpbmZvLCBpbmZpbGUpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisgICAgYnJlYWs7CisgIH0KK30KKworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9yZGdpZi5jIGIvanBlZy9yZGdpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2MxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3JkZ2lmLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIHJkZ2lmLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBHSUYgZm9ybWF0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogdG8gYXZvaWQgZW50YW5nbGVtZW50cyB3aXRoIFVuaXN5cycgcGF0ZW50IG9uIExaVyBjb21wcmVzc2lvbiwgICAgICAqCisgKiB0aGUgYWJpbGl0eSB0byByZWFkIEdJRiBmaWxlcyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIElKRyBkaXN0cmlidXRpb24uICoKKyAqIFNvcnJ5IGFib3V0IHRoYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV2UgYXJlIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKKyAqICAgICJUaGUgR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0KGMpIGlzIHRoZSBDb3B5cmlnaHQgcHJvcGVydHkgb2YKKyAqICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCisgKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4iCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIEdJRl9TVVBQT1JURUQKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEdJRiBmb3JtYXQgaW5wdXQuCisgKi8KKworR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCitqaW5pdF9yZWFkX2dpZiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGIGlucHV0IGlzIHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLiAgU29ycnkuXG4iKTsKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworICByZXR1cm4gTlVMTDsJCQkvKiBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCit9CisKKyNlbmRpZiAvKiBHSUZfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL3JkanBnY29tLjEgYi9qcGVnL3JkanBnY29tLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiYTA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvcmRqcGdjb20uMQpAQCAtMCwwICsxLDU0IEBACisuVEggUkRKUEdDT00gMSAiMTEgT2N0b2JlciAxOTk3IgorLlNIIE5BTUUKK3JkanBnY29tIFwtIGRpc3BsYXkgdGV4dCBjb21tZW50cyBmcm9tIGEgSlBFRyBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIHJkanBnY29tCitbCisuQiBcLXZlcmJvc2UKK10KK1sKKy5JIGZpbGVuYW1lCitdCisuTFAKKy5TSCBERVNDUklQVElPTgorLkxQCisuQiByZGpwZ2NvbQorcmVhZHMgdGhlIG5hbWVkIEpQRUcvSkZJRiBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKK2FuZCBwcmludHMgYW55IHRleHQgY29tbWVudHMgZm91bmQgaW4gdGhlIGZpbGUgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KKy5QUAorVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzICJjb21tZW50IiAoQ09NKSBibG9ja3MgdG8gb2NjdXIgd2l0aGluIGEgSlBFRyBmaWxlLgorQWx0aG91Z2ggdGhlIHN0YW5kYXJkIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHdoYXQgQ09NIGJsb2NrcyBhcmUgZm9yLCB0aGV5CithcmUgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQgc3RyaW5ncy4gIFRoaXMgbGV0cyB5b3UgYWRkCithbm5vdGF0aW9ucywgdGl0bGVzLCBpbmRleCB0ZXJtcywgZXRjIHRvIHlvdXIgSlBFRyBmaWxlcywgYW5kIGxhdGVyIHJldHJpZXZlCit0aGVtIGFzIHRleHQuICBDT00gYmxvY2tzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgaW1hZ2Ugc3RvcmVkIGluIHRoZSBKUEVHCitmaWxlLiAgVGhlIG1heGltdW0gc2l6ZSBvZiBhIENPTSBibG9jayBpcyA2NEssIGJ1dCB5b3UgY2FuIGhhdmUgYXMgbWFueSBvZgordGhlbSBhcyB5b3UgbGlrZSBpbiBvbmUgSlBFRyBmaWxlLgorLlNIIE9QVElPTlMKKy5UUAorLkIgXC12ZXJib3NlCitDYXVzZXMKKy5CIHJkanBnY29tCit0byBhbHNvIGRpc3BsYXkgdGhlIEpQRUcgaW1hZ2UgZGltZW5zaW9ucy4KKy5QUAorU3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCwgYW5kIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuCisuU0ggSElOVFMKKy5CIHJkanBnY29tCitkb2VzIG5vdCBkZXBlbmQgb24gdGhlIElKRyBKUEVHIGxpYnJhcnkuICBJdHMgc291cmNlIGNvZGUgaXMgaW50ZW5kZWQgYXMgYW4KK2lsbHVzdHJhdGlvbiBvZiB0aGUgbWluaW11bSBhbW91bnQgb2YgY29kZSByZXF1aXJlZCB0byBwYXJzZSBhIEpQRUcgZmlsZQoraGVhZGVyIGNvcnJlY3RseS4KKy5QUAorSW4KKy5CIFwtdmVyYm9zZQorbW9kZSwKKy5CIHJkanBnY29tCit3aWxsIGFsc28gYXR0ZW1wdCB0byBwcmludCB0aGUgY29udGVudHMgb2YgYW55ICJBUFAxMiIgbWFya2VycyBhcyB0ZXh0LgorU29tZSBkaWdpdGFsIGNhbWVyYXMgcHJvZHVjZSBBUFAxMiBtYXJrZXJzIGNvbnRhaW5pbmcgdXNlZnVsIHRleHR1YWwKK2luZm9ybWF0aW9uLiAgSWYgeW91IGxpa2UsIHlvdSBjYW4gbW9kaWZ5IHRoZSBzb3VyY2UgY29kZSB0byBwcmludAorb3RoZXIgQVBQbiBtYXJrZXIgdHlwZXMgYXMgd2VsbC4KKy5TSCBTRUUgQUxTTworLkJSIGNqcGVnICgxKSwKKy5CUiBkanBlZyAoMSksCisuQlIganBlZ3RyYW4gKDEpLAorLkJSIHdyanBnY29tICgxKQorLlNIIEFVVEhPUgorSW5kZXBlbmRlbnQgSlBFRyBHcm91cApkaWZmIC0tZ2l0IGEvanBlZy9yZGpwZ2NvbS5jIGIvanBlZy9yZGpwZ2NvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTZmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3JkanBnY29tLmMKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiByZGpwZ2NvbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSB2ZXJ5IHNpbXBsZSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbiB0aGF0IGRpc3BsYXlzCisgKiB0aGUgdGV4dCBpbiBDT00gKGNvbW1lbnQpIG1hcmtlcnMgaW4gYSBKRklGIGZpbGUuCisgKiBUaGlzIG1heSBiZSB1c2VmdWwgYXMgYW4gZXhhbXBsZSBvZiB0aGUgbWluaW11bSBsb2dpYyBuZWVkZWQgdG8gcGFyc2UKKyAqIEpQRUcgbWFya2Vycy4KKyAqLworCisjZGVmaW5lIEpQRUdfQ0pQRUdfREpQRUcJLyogdG8gZ2V0IHRoZSBjb21tYW5kLWxpbmUgY29uZmlnIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgkJLyogZ2V0IGF1dG8tY29uZmlnIHN5bWJvbHMsIDxzdGRpby5oPiAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXN1cHBlcigpLCB0b2xvd2VyKCkgKi8KKyNpZmRlZiBVU0VfU0VUTU9ERQorI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSdzIHBhcmFtZXRlciBtYWNyb3MgKi8KKy8qIElmIHlvdSBoYXZlIHNldG1vZGUoKSBidXQgbm90IDxpby5oPiwganVzdCBkZWxldGUgdGhpcyBsaW5lOiAqLworI2luY2x1ZGUgPGlvLmg+CQkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkgKi8KKyNlbmRpZgorCisjaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KKyNpZmRlZiBfX01XRVJLU19fCisjaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLworI2VuZGlmCisjaWZkZWYgVEhJTktfQworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCisjZWxzZQorI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgorI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KKyNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCisjZW5kaWYKKyNpZm5kZWYgRVhJVF9TVUNDRVNTCisjaWZkZWYgVk1TCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KKyNlbHNlCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMAorI2VuZGlmCisjZW5kaWYKKworCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUuCisgKiBUbyByZXVzZSB0aGlzIGNvZGUgaW4gYW5vdGhlciBhcHBsaWNhdGlvbiwgeW91IG1pZ2h0IG5lZWQgdG8gY2hhbmdlIHRoZXNlLgorICovCisKK3N0YXRpYyBGSUxFICogaW5maWxlOwkJLyogaW5wdXQgSlBFRyBmaWxlICovCisKKy8qIFJldHVybiBuZXh0IGlucHV0IGJ5dGUsIG9yIEVPRiBpZiBubyBtb3JlICovCisjZGVmaW5lIE5FWFRCWVRFKCkgIGdldGMoaW5maWxlKQorCisKKy8qIEVycm9yIGV4aXQgaGFuZGxlciAqLworI2RlZmluZSBFUlJFWElUKG1zZykgIChmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpLCBleGl0KEVYSVRfRkFJTFVSRSkpCisKKworLyogUmVhZCBvbmUgYnl0ZSwgdGVzdGluZyBmb3IgRU9GICovCitzdGF0aWMgaW50CityZWFkXzFfYnl0ZSAodm9pZCkKK3sKKyAgaW50IGM7CisKKyAgYyA9IE5FWFRCWVRFKCk7CisgIGlmIChjID09IEVPRikKKyAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOworICByZXR1cm4gYzsKK30KKworLyogUmVhZCAyIGJ5dGVzLCBjb252ZXJ0IHRvIHVuc2lnbmVkIGludCAqLworLyogQWxsIDItYnl0ZSBxdWFudGl0aWVzIGluIEpQRUcgbWFya2VycyBhcmUgTVNCIGZpcnN0ICovCitzdGF0aWMgdW5zaWduZWQgaW50CityZWFkXzJfYnl0ZXMgKHZvaWQpCit7CisgIGludCBjMSwgYzI7CisKKyAgYzEgPSBORVhUQllURSgpOworICBpZiAoYzEgPT0gRU9GKQorICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7CisgIGMyID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMyID09IEVPRikKKyAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOworICByZXR1cm4gKCgodW5zaWduZWQgaW50KSBjMSkgPDwgOCkgKyAoKHVuc2lnbmVkIGludCkgYzIpOworfQorCisKKy8qCisgKiBKUEVHIG1hcmtlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSAweEZGIGJ5dGVzLCBmb2xsb3dlZCBieSBhIG1hcmtlcgorICogY29kZSBieXRlICh3aGljaCBpcyBub3QgYW4gRkYpLiAgSGVyZSBhcmUgdGhlIG1hcmtlciBjb2RlcyBvZiBpbnRlcmVzdAorICogaW4gdGhpcyBwcm9ncmFtLiAgKFNlZSBqZG1hcmtlci5jIGZvciBhIG1vcmUgY29tcGxldGUgbGlzdC4pCisgKi8KKworI2RlZmluZSBNX1NPRjAgIDB4QzAJCS8qIFN0YXJ0IE9mIEZyYW1lIE4gKi8KKyNkZWZpbmUgTV9TT0YxICAweEMxCQkvKiBOIGluZGljYXRlcyB3aGljaCBjb21wcmVzc2lvbiBwcm9jZXNzICovCisjZGVmaW5lIE1fU09GMiAgMHhDMgkJLyogT25seSBTT0YwLVNPRjIgYXJlIG5vdyBpbiBjb21tb24gdXNlICovCisjZGVmaW5lIE1fU09GMyAgMHhDMworI2RlZmluZSBNX1NPRjUgIDB4QzUJCS8qIE5COiBjb2RlcyBDNCBhbmQgQ0MgYXJlIE5PVCBTT0YgbWFya2VycyAqLworI2RlZmluZSBNX1NPRjYgIDB4QzYKKyNkZWZpbmUgTV9TT0Y3ICAweEM3CisjZGVmaW5lIE1fU09GOSAgMHhDOQorI2RlZmluZSBNX1NPRjEwIDB4Q0EKKyNkZWZpbmUgTV9TT0YxMSAweENCCisjZGVmaW5lIE1fU09GMTMgMHhDRAorI2RlZmluZSBNX1NPRjE0IDB4Q0UKKyNkZWZpbmUgTV9TT0YxNSAweENGCisjZGVmaW5lIE1fU09JICAgMHhEOAkJLyogU3RhcnQgT2YgSW1hZ2UgKGJlZ2lubmluZyBvZiBkYXRhc3RyZWFtKSAqLworI2RlZmluZSBNX0VPSSAgIDB4RDkJCS8qIEVuZCBPZiBJbWFnZSAoZW5kIG9mIGRhdGFzdHJlYW0pICovCisjZGVmaW5lIE1fU09TICAgMHhEQQkJLyogU3RhcnQgT2YgU2NhbiAoYmVnaW5zIGNvbXByZXNzZWQgZGF0YSkgKi8KKyNkZWZpbmUgTV9BUFAwCTB4RTAJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIG1hcmtlciwgdHlwZSBOICovCisjZGVmaW5lIE1fQVBQMTIJMHhFQwkJLyogKHdlIGRvbid0IGJvdGhlciB0byBsaXN0IGFsbCAxNiBBUFBuJ3MpICovCisjZGVmaW5lIE1fQ09NICAgMHhGRQkJLyogQ09NbWVudCAqLworCisKKy8qCisgKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyIGFuZCByZXR1cm4gaXRzIG1hcmtlciBjb2RlLgorICogV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBGRiBieXRlLCBwb3NzaWJseSBtb3JlIGlmIHRoZSBjb21wcmVzc29yIHVzZWQgRkZzCisgKiB0byBwYWQgdGhlIGZpbGUuCisgKiBUaGVyZSBjb3VsZCBhbHNvIGJlIG5vbi1GRiBnYXJiYWdlIGJldHdlZW4gbWFya2Vycy4gIFRoZSB0cmVhdG1lbnQgb2Ygc3VjaAorICogZ2FyYmFnZSBpcyB1bnNwZWNpZmllZDsgd2UgY2hvb3NlIHRvIHNraXAgb3ZlciBpdCBidXQgZW1pdCBhIHdhcm5pbmcgbXNnLgorICogTkI6IHRoaXMgcm91dGluZSBtdXN0IG5vdCBiZSB1c2VkIGFmdGVyIHNlZWluZyBTT1MgbWFya2VyLCBzaW5jZSBpdCB3aWxsCisgKiBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aCBGRi8wMCBzZXF1ZW5jZXMgaW4gdGhlIGNvbXByZXNzZWQgaW1hZ2UgZGF0YS4uLgorICovCisKK3N0YXRpYyBpbnQKK25leHRfbWFya2VyICh2b2lkKQoreworICBpbnQgYzsKKyAgaW50IGRpc2NhcmRlZF9ieXRlcyA9IDA7CisKKyAgLyogRmluZCAweEZGIGJ5dGU7IGNvdW50IGFuZCBza2lwIGFueSBub24tRkZzLiAqLworICBjID0gcmVhZF8xX2J5dGUoKTsKKyAgd2hpbGUgKGMgIT0gMHhGRikgeworICAgIGRpc2NhcmRlZF9ieXRlcysrOworICAgIGMgPSByZWFkXzFfYnl0ZSgpOworICB9CisgIC8qIEdldCBtYXJrZXIgY29kZSBieXRlLCBzd2FsbG93aW5nIGFueSBkdXBsaWNhdGUgRkYgYnl0ZXMuICBFeHRyYSBGRnMKKyAgICogYXJlIGxlZ2FsIGFzIHBhZCBieXRlcywgc28gZG9uJ3QgY291bnQgdGhlbSBpbiBkaXNjYXJkZWRfYnl0ZXMuCisgICAqLworICBkbyB7CisgICAgYyA9IHJlYWRfMV9ieXRlKCk7CisgIH0gd2hpbGUgKGMgPT0gMHhGRik7CisKKyAgaWYgKGRpc2NhcmRlZF9ieXRlcyAhPSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBnYXJiYWdlIGRhdGEgZm91bmQgaW4gSlBFRyBmaWxlXG4iKTsKKyAgfQorCisgIHJldHVybiBjOworfQorCisKKy8qCisgKiBSZWFkIHRoZSBpbml0aWFsIG1hcmtlciwgd2hpY2ggc2hvdWxkIGJlIFNPSS4KKyAqIEZvciBhIEpGSUYgZmlsZSwgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgZmlsZSBzaG91bGQgYmUgbGl0ZXJhbGx5CisgKiAweEZGIE1fU09JLiAgVG8gYmUgbW9yZSBnZW5lcmFsLCB3ZSBjb3VsZCB1c2UgbmV4dF9tYXJrZXIsIGJ1dCBpZiB0aGUKKyAqIGlucHV0IGZpbGUgd2VyZW4ndCBhY3R1YWxseSBKUEVHIGF0IGFsbCwgbmV4dF9tYXJrZXIgbWlnaHQgcmVhZCB0aGUgd2hvbGUKKyAqIGZpbGUgYW5kIHRoZW4gcmV0dXJuIGEgbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlLi4uCisgKi8KKworc3RhdGljIGludAorZmlyc3RfbWFya2VyICh2b2lkKQoreworICBpbnQgYzEsIGMyOworCisgIGMxID0gTkVYVEJZVEUoKTsKKyAgYzIgPSBORVhUQllURSgpOworICBpZiAoYzEgIT0gMHhGRiB8fCBjMiAhPSBNX1NPSSkKKyAgICBFUlJFWElUKCJOb3QgYSBKUEVHIGZpbGUiKTsKKyAgcmV0dXJuIGMyOworfQorCisKKy8qCisgKiBNb3N0IHR5cGVzIG9mIG1hcmtlciBhcmUgZm9sbG93ZWQgYnkgYSB2YXJpYWJsZS1sZW5ndGggcGFyYW1ldGVyIHNlZ21lbnQuCisgKiBUaGlzIHJvdXRpbmUgc2tpcHMgb3ZlciB0aGUgcGFyYW1ldGVycyBmb3IgYW55IG1hcmtlciB3ZSBkb24ndCBvdGhlcndpc2UKKyAqIHdhbnQgdG8gcHJvY2Vzcy4KKyAqIE5vdGUgdGhhdCB3ZSBNVVNUIHNraXAgdGhlIHBhcmFtZXRlciBzZWdtZW50IGV4cGxpY2l0bHkgaW4gb3JkZXIgbm90IHRvCisgKiBiZSBmb29sZWQgYnkgMHhGRiBieXRlcyB0aGF0IG1pZ2h0IGFwcGVhciB3aXRoaW4gdGhlIHBhcmFtZXRlciBzZWdtZW50OworICogc3VjaCBieXRlcyBkbyBOT1QgaW50cm9kdWNlIG5ldyBtYXJrZXJzLgorICovCisKK3N0YXRpYyB2b2lkCitza2lwX3ZhcmlhYmxlICh2b2lkKQorLyogU2tpcCBvdmVyIGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCit7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisKKyAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLworICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKKyAgLyogTGVuZ3RoIGluY2x1ZGVzIGl0c2VsZiwgc28gbXVzdCBiZSBhdCBsZWFzdCAyICovCisgIGlmIChsZW5ndGggPCAyKQorICAgIEVSUkVYSVQoIkVycm9uZW91cyBKUEVHIG1hcmtlciBsZW5ndGgiKTsKKyAgbGVuZ3RoIC09IDI7CisgIC8qIFNraXAgb3ZlciB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CisgICAgbGVuZ3RoLS07CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBhIENPTSBtYXJrZXIuCisgKiBXZSB3YW50IHRvIHByaW50IG91dCB0aGUgbWFya2VyIGNvbnRlbnRzIGFzIGxlZ2libGUgdGV4dDsKKyAqIHdlIG11c3QgZ3VhcmQgYWdhaW5zdCBub24tdGV4dCBqdW5rIGFuZCB2YXJ5aW5nIG5ld2xpbmUgcmVwcmVzZW50YXRpb25zLgorICovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX0NPTSAodm9pZCkKK3sKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgaW50IGNoOworICBpbnQgbGFzdGNoID0gMDsKKworICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCisgIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOworICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KKyAgaWYgKGxlbmd0aCA8IDIpCisgICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOworICBsZW5ndGggLT0gMjsKKworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgIGNoID0gcmVhZF8xX2J5dGUoKTsKKyAgICAvKiBFbWl0IHRoZSBjaGFyYWN0ZXIgaW4gYSByZWFkYWJsZSBmb3JtLgorICAgICAqIE5vbnByaW50YWJsZXMgYXJlIGNvbnZlcnRlZCB0byBcbm5uIGZvcm0sCisgICAgICogd2hpbGUgXCBpcyBjb252ZXJ0ZWQgdG8gXFwuCisgICAgICogTmV3bGluZXMgaW4gQ1IsIENSL0xGLCBvciBMRiBmb3JtIHdpbGwgYmUgcHJpbnRlZCBhcyBvbmUgbmV3bGluZS4KKyAgICAgKi8KKyAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgaWYgKGxhc3RjaCAhPSAnXHInKQorCXByaW50ZigiXG4iKTsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKKyAgICAgIHByaW50ZigiXFxcXCIpOworICAgIH0gZWxzZSBpZiAoaXNwcmludChjaCkpIHsKKyAgICAgIHB1dGMoY2gsIHN0ZG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiXFwlMDNvIiwgY2gpOworICAgIH0KKyAgICBsYXN0Y2ggPSBjaDsKKyAgICBsZW5ndGgtLTsKKyAgfQorICBwcmludGYoIlxuIik7Cit9CisKKworLyoKKyAqIFByb2Nlc3MgYSBTT0ZuIG1hcmtlci4KKyAqIFRoaXMgY29kZSBpcyBvbmx5IG5lZWRlZCBpZiB5b3Ugd2FudCB0byBrbm93IHRoZSBpbWFnZSBkaW1lbnNpb25zLi4uCisgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfU09GbiAoaW50IG1hcmtlcikKK3sKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IGltYWdlX2hlaWdodCwgaW1hZ2Vfd2lkdGg7CisgIGludCBkYXRhX3ByZWNpc2lvbiwgbnVtX2NvbXBvbmVudHM7CisgIGNvbnN0IGNoYXIgKiBwcm9jZXNzOworICBpbnQgY2k7CisKKyAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CS8qIHVzdWFsIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KKworICBkYXRhX3ByZWNpc2lvbiA9IHJlYWRfMV9ieXRlKCk7CisgIGltYWdlX2hlaWdodCA9IHJlYWRfMl9ieXRlcygpOworICBpbWFnZV93aWR0aCA9IHJlYWRfMl9ieXRlcygpOworICBudW1fY29tcG9uZW50cyA9IHJlYWRfMV9ieXRlKCk7CisKKyAgc3dpdGNoIChtYXJrZXIpIHsKKyAgY2FzZSBNX1NPRjA6CXByb2Nlc3MgPSAiQmFzZWxpbmUiOyAgYnJlYWs7CisgIGNhc2UgTV9TT0YxOglwcm9jZXNzID0gIkV4dGVuZGVkIHNlcXVlbnRpYWwiOyAgYnJlYWs7CisgIGNhc2UgTV9TT0YyOglwcm9jZXNzID0gIlByb2dyZXNzaXZlIjsgIGJyZWFrOworICBjYXNlIE1fU09GMzoJcHJvY2VzcyA9ICJMb3NzbGVzcyI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjU6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwiOyAgYnJlYWs7CisgIGNhc2UgTV9TT0Y2Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjc6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIGxvc3NsZXNzIjsgIGJyZWFrOworICBjYXNlIE1fU09GOToJcHJvY2VzcyA9ICJFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjEwOglwcm9jZXNzID0gIlByb2dyZXNzaXZlLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjExOglwcm9jZXNzID0gIkxvc3NsZXNzLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjEzOglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjE0Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyBjb2RpbmciOyBicmVhazsKKyAgY2FzZSBNX1NPRjE1Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7CisgIGRlZmF1bHQ6CXByb2Nlc3MgPSAiVW5rbm93biI7ICBicmVhazsKKyAgfQorCisgIHByaW50ZigiSlBFRyBpbWFnZSBpcyAldXcgKiAldWgsICVkIGNvbG9yIGNvbXBvbmVudHMsICVkIGJpdHMgcGVyIHNhbXBsZVxuIiwKKwkgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgbnVtX2NvbXBvbmVudHMsIGRhdGFfcHJlY2lzaW9uKTsKKyAgcHJpbnRmKCJKUEVHIHByb2Nlc3M6ICVzXG4iLCBwcm9jZXNzKTsKKworICBpZiAobGVuZ3RoICE9ICh1bnNpZ25lZCBpbnQpICg4ICsgbnVtX2NvbXBvbmVudHMgKiAzKSkKKyAgICBFUlJFWElUKCJCb2d1cyBTT0YgbWFya2VyIGxlbmd0aCIpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IG51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CS8qIENvbXBvbmVudCBJRCBjb2RlICovCisgICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CS8qIEgsIFYgc2FtcGxpbmcgZmFjdG9ycyAqLworICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwkvKiBRdWFudGl6YXRpb24gdGFibGUgbnVtYmVyICovCisgIH0KK30KKworCisvKgorICogUGFyc2UgdGhlIG1hcmtlciBzdHJlYW0gdW50aWwgU09TIG9yIEVPSSBpcyBzZWVuOworICogZGlzcGxheSBhbnkgQ09NIG1hcmtlcnMuCisgKiBXaGlsZSB0aGUgY29tcGFuaW9uIHByb2dyYW0gd3JqcGdjb20gd2lsbCBhbHdheXMgaW5zZXJ0IENPTSBtYXJrZXJzIGJlZm9yZQorICogU09Gbiwgb3RoZXIgaW1wbGVtZW50YXRpb25zIG1pZ2h0IG5vdCwgc28gd2Ugc2NhbiB0byBTT1MgYmVmb3JlIHN0b3BwaW5nLgorICogSWYgd2Ugd2VyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGltYWdlIGRpbWVuc2lvbnMsIHdlIHdvdWxkIHN0b3AgYXQgU09Gbi4KKyAqIChDb252ZXJzZWx5LCBpZiB3ZSBvbmx5IGNhcmVkIGFib3V0IENPTSBtYXJrZXJzLCB0aGVyZSB3b3VsZCBiZSBubyBuZWVkCisgKiBmb3Igc3BlY2lhbCBjb2RlIHRvIGhhbmRsZSBTT0ZuOyB3ZSBjb3VsZCB0cmVhdCBpdCBsaWtlIG90aGVyIG1hcmtlcnMuKQorICovCisKK3N0YXRpYyBpbnQKK3NjYW5fSlBFR19oZWFkZXIgKGludCB2ZXJib3NlKQoreworICBpbnQgbWFya2VyOworCisgIC8qIEV4cGVjdCBTT0kgYXQgc3RhcnQgb2YgZmlsZSAqLworICBpZiAoZmlyc3RfbWFya2VyKCkgIT0gTV9TT0kpCisgICAgRVJSRVhJVCgiRXhwZWN0ZWQgU09JIG1hcmtlciBmaXJzdCIpOworCisgIC8qIFNjYW4gbWlzY2VsbGFuZW91cyBtYXJrZXJzIHVudGlsIHdlIHJlYWNoIFNPUy4gKi8KKyAgZm9yICg7OykgeworICAgIG1hcmtlciA9IG5leHRfbWFya2VyKCk7CisgICAgc3dpdGNoIChtYXJrZXIpIHsKKyAgICAgIC8qIE5vdGUgdGhhdCBtYXJrZXIgY29kZXMgMHhDNCwgMHhDOCwgMHhDQyBhcmUgbm90LCBhbmQgbXVzdCBub3QgYmUsCisgICAgICAgKiB0cmVhdGVkIGFzIFNPRm4uICBDNCBpbiBwYXJ0aWN1bGFyIGlzIGFjdHVhbGx5IERIVC4KKyAgICAgICAqLworICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KKyAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCisgICAgICBpZiAodmVyYm9zZSkKKwlwcm9jZXNzX1NPRm4obWFya2VyKTsKKyAgICAgIGVsc2UKKwlza2lwX3ZhcmlhYmxlKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT1M6CQkJLyogc3RvcCBiZWZvcmUgaGl0dGluZyBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICAgIHJldHVybiBtYXJrZXI7CisKKyAgICBjYXNlIE1fRU9JOgkJCS8qIGluIGNhc2UgaXQncyBhIHRhYmxlcy1vbmx5IEpQRUcgc3RyZWFtICovCisgICAgICByZXR1cm4gbWFya2VyOworCisgICAgY2FzZSBNX0NPTToKKyAgICAgIHByb2Nlc3NfQ09NKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9BUFAxMjoKKyAgICAgIC8qIFNvbWUgZGlnaXRhbCBjYW1lcmEgbWFrZXJzIHB1dCB1c2VmdWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbnRvCisgICAgICAgKiBBUFAxMiBtYXJrZXJzLCBzbyB3ZSBwcmludCB0aG9zZSBvdXQgdG9vIHdoZW4gaW4gLXZlcmJvc2UgbW9kZS4KKyAgICAgICAqLworICAgICAgaWYgKHZlcmJvc2UpIHsKKwlwcmludGYoIkFQUDEyIGNvbnRhaW5zOlxuIik7CisJcHJvY2Vzc19DT00oKTsKKyAgICAgIH0gZWxzZQorCXNraXBfdmFyaWFibGUoKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoJCQkvKiBBbnl0aGluZyBlbHNlIGp1c3QgZ2V0cyBza2lwcGVkICovCisgICAgICBza2lwX3ZhcmlhYmxlKCk7CQkvKiB3ZSBhc3N1bWUgaXQgaGFzIGEgcGFyYW1ldGVyIGNvdW50Li4uICovCisgICAgICBicmVhazsKKyAgICB9CisgIH0gLyogZW5kIGxvb3AgKi8KK30KKworCisvKiBDb21tYW5kIGxpbmUgcGFyc2luZyBjb2RlICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKworCitzdGF0aWMgdm9pZAordXNhZ2UgKHZvaWQpCisvKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCit7CisgIGZwcmludGYoc3RkZXJyLCAicmRqcGdjb20gZGlzcGxheXMgYW55IHRleHR1YWwgY29tbWVudHMgaW4gYSBKUEVHIGZpbGUuXG4iKTsKKworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbc3dpdGNoZXNdIFtpbnB1dGZpbGVdXG4iLCBwcm9nbmFtZSk7CisKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgICAgQWxzbyBkaXNwbGF5IGRpbWVuc2lvbnMgb2YgSlBFRyBpbWFnZVxuIik7CisKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKK3N0YXRpYyBpbnQKK2tleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQorLyogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiAocG9zc2libHkgYWJicmV2aWF0ZWQpIGtleXdvcmQgc3dpdGNoZXMuICovCisvKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksICovCisvKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uICovCit7CisgIHJlZ2lzdGVyIGludCBjYSwgY2s7CisgIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7CisKKyAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgeworICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQorICAgICAgcmV0dXJuIDA7CQkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KKyAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLworICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKKyAgICBpZiAoY2EgIT0gY2spCisgICAgICByZXR1cm4gMDsJCQkvKiBubyBnb29kICovCisgICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KKyAgfQorICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLworICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7CQkJLyogQS1PSyAqLworfQorCisKKy8qCisgKiBUaGUgbWFpbiBwcm9ncmFtLgorICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgYXJnbjsKKyAgY2hhciAqIGFyZzsKKyAgaW50IHZlcmJvc2UgPSAwOworCisgIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCisjaWZkZWYgVVNFX0NDT01NQU5ECisgIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7CisjZW5kaWYKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisgIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCisgICAgcHJvZ25hbWUgPSAicmRqcGdjb20iOwkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KKworICAvKiBQYXJzZSBzd2l0Y2hlcywgaWYgYW55ICovCisgIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKKyAgICBhcmcgPSBhcmd2W2FyZ25dOworICAgIGlmIChhcmdbMF0gIT0gJy0nKQorICAgICAgYnJlYWs7CQkJLyogbm90IHN3aXRjaCwgbXVzdCBiZSBmaWxlIG5hbWUgKi8KKyAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIG92ZXIgJy0nICovCisgICAgaWYgKGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgeworICAgICAgdmVyYm9zZSsrOworICAgIH0gZWxzZQorICAgICAgdXNhZ2UoKTsKKyAgfQorCisgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCisgIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KKyAgaWYgKGFyZ24gPCBhcmdjLTEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7CisgICAgdXNhZ2UoKTsKKyAgfQorICBpZiAoYXJnbiA8IGFyZ2MpIHsKKyAgICBpZiAoKGluZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KKyNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KKyAgICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KKyAgICBpZiAoKGluZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3RkaW5cbiIsIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisjZWxzZQorICAgIGluZmlsZSA9IHN0ZGluOworI2VuZGlmCisgIH0KKworICAvKiBTY2FuIHRoZSBKUEVHIGhlYWRlcnMuICovCisgICh2b2lkKSBzY2FuX0pQRUdfaGVhZGVyKHZlcmJvc2UpOworCisgIC8qIEFsbCBkb25lLiAqLworICBleGl0KEVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvanBlZy9yZHBwbS5jIGIvanBlZy9yZHBwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjM1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3JkcHBtLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiByZHBwbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gUFBNL1BHTSBmb3JtYXQuCisgKiBUaGUgZXh0ZW5kZWQgMi1ieXRlLXBlci1zYW1wbGUgcmF3IFBQTS9QR00gZm9ybWF0cyBhcmUgc3VwcG9ydGVkLgorICogVGhlIFBCTVBMVVMgbGlicmFyeSBpcyBOT1QgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGlzIHNvZnR3YXJlCisgKiAoYnV0IGl0IGlzIGhpZ2hseSB1c2VmdWwgYXMgYSBzZXQgb2YgUFBNIGltYWdlIG1hbmlwdWxhdGlvbiBwcm9ncmFtcykuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIGlucHV0IGZyb20KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4gIFRoZXkgZnVydGhlciBhc3N1bWUgdGhhdCByZWFkaW5nIGJlZ2lucworICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlOyBzdGFydF9pbnB1dCBtYXkgbmVlZCB3b3JrIGlmIHRoZQorICogdXNlciBpbnRlcmZhY2UgaGFzIGFscmVhZHkgcmVhZCBzb21lIGRhdGEgKGUuZy4sIHRvIGRldGVybWluZSB0aGF0CisgKiB0aGUgZmlsZSBpcyBpbmRlZWQgUFBNIGZvcm1hdCkuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIFBQTV9TVVBQT1JURUQKKworCisvKiBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYXJlIGJhc2VkIG9uIHRoZSBQQk1QTFVTIGxpYnJhcnksIHdoaWNoIGlzOgorKioKKyoqIENvcHlyaWdodCAoQykgMTk4OCBieSBKZWYgUG9za2FuemVyLgorKioKKyoqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworKiogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAorKiogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyoqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyoqIGRvY3VtZW50YXRpb24uICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCisqKiBpbXBsaWVkIHdhcnJhbnR5LgorKi8KKworCisvKiBNYWNyb3MgdG8gZGVhbCB3aXRoIHVuc2lnbmVkIGNoYXJzIGFzIGVmZmljaWVudGx5IGFzIGNvbXBpbGVyIGFsbG93cyAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKKyNlbHNlIC8qICFIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECit0eXBlZGVmIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKKyNlbHNlCit0eXBlZGVmIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSAmIDB4RkYpCisjZW5kaWYKKyNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKworCisjZGVmaW5lCVJlYWRPSyhmaWxlLGJ1ZmZlcixsZW4pCShKRlJFQUQoZmlsZSxidWZmZXIsbGVuKSA9PSAoKHNpemVfdCkgKGxlbikpKQorCisKKy8qCisgKiBPbiBtb3N0IHN5c3RlbXMsIHJlYWRpbmcgaW5kaXZpZHVhbCBieXRlcyB3aXRoIGdldGMoKSBpcyBkcmFzdGljYWxseSBsZXNzCisgKiBlZmZpY2llbnQgdGhhbiBidWZmZXJpbmcgYSByb3cgYXQgYSB0aW1lIHdpdGggZnJlYWQoKS4gIE9uIFBDcywgd2UgbXVzdAorICogYWxsb2NhdGUgdGhlIGJ1ZmZlciBpbiBuZWFyIGRhdGEgc3BhY2UsIGJlY2F1c2Ugd2UgYXJlIGFzc3VtaW5nIHNtYWxsLWRhdGEKKyAqIG1lbW9yeSBtb2RlbCwgd2hlcmVpbiBmcmVhZCgpIGNhbid0IHJlYWNoIGZhciBtZW1vcnkuICBJZiB5b3UgbmVlZCB0bworICogcHJvY2VzcyB2ZXJ5IHdpZGUgaW1hZ2VzIG9uIGEgUEMsIHlvdSBtaWdodCBoYXZlIHRvIGNvbXBpbGUgaW4gbGFyZ2UtbWVtb3J5CisgKiBtb2RlbCwgb3IgZWxzZSByZXBsYWNlIGZyZWFkKCkgd2l0aCBhIGdldGMoKSBsb29wIC0tLSB3aGljaCB3aWxsIGJlIG11Y2gKKyAqIHNsb3dlci4KKyAqLworCisKKy8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIHNvdXJjZSBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBVX0NIQVIgKmlvYnVmZmVyOwkJLyogbm9uLUZBUiBwb2ludGVyIHRvIEkvTyBidWZmZXIgKi8KKyAgSlNBTVBST1cgcGl4cm93OwkJLyogRkFSIHBvaW50ZXIgdG8gc2FtZSAqLworICBzaXplX3QgYnVmZmVyX3dpZHRoOwkJLyogd2lkdGggb2YgSS9PIGJ1ZmZlciAqLworICBKU0FNUExFICpyZXNjYWxlOwkJLyogPT4gbWF4dmFsLXJlbWFwcGluZyBhcnJheSwgb3IgTlVMTCAqLworfSBwcG1fc291cmNlX3N0cnVjdDsKKwordHlwZWRlZiBwcG1fc291cmNlX3N0cnVjdCAqIHBwbV9zb3VyY2VfcHRyOworCisKK0xPQ0FMKGludCkKK3BibV9nZXRjIChGSUxFICogaW5maWxlKQorLyogUmVhZCBuZXh0IGNoYXIsIHNraXBwaW5nIG92ZXIgYW55IGNvbW1lbnRzICovCisvKiBBIGNvbW1lbnQvbmV3bGluZSBzZXF1ZW5jZSBpcyByZXR1cm5lZCBhcyBhIG5ld2xpbmUgKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNoOworCisgIGNoID0gZ2V0YyhpbmZpbGUpOworICBpZiAoY2ggPT0gJyMnKSB7CisgICAgZG8geworICAgICAgY2ggPSBnZXRjKGluZmlsZSk7CisgICAgfSB3aGlsZSAoY2ggIT0gJ1xuJyAmJiBjaCAhPSBFT0YpOworICB9CisgIHJldHVybiBjaDsKK30KKworCitMT0NBTCh1bnNpZ25lZCBpbnQpCityZWFkX3BibV9pbnRlZ2VyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKKy8qIFJlYWQgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyIGZyb20gdGhlIFBQTSBmaWxlICovCisvKiBTd2FsbG93cyBvbmUgdHJhaWxpbmcgY2hhcmFjdGVyIGFmdGVyIHRoZSBpbnRlZ2VyICovCisvKiBOb3RlIHRoYXQgb24gYSAxNi1iaXQtaW50IG1hY2hpbmUsIG9ubHkgdmFsdWVzIHVwIHRvIDY0ayBjYW4gYmUgcmVhZC4gKi8KKy8qIFRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gaW4gcHJhY3RpY2UuICovCit7CisgIHJlZ2lzdGVyIGludCBjaDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHZhbDsKKworICAvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgZG8geworICAgIGNoID0gcGJtX2dldGMoaW5maWxlKTsKKyAgICBpZiAoY2ggPT0gRU9GKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICB9IHdoaWxlIChjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicpOworCisgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT05OVU1FUklDKTsKKworICB2YWwgPSBjaCAtICcwJzsKKyAgd2hpbGUgKChjaCA9IHBibV9nZXRjKGluZmlsZSkpID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICB2YWwgKj0gMTA7CisgICAgdmFsICs9IGNoIC0gJzAnOworICB9CisgIHJldHVybiB2YWw7Cit9CisKKworLyoKKyAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCisgKgorICogV2UgcHJvdmlkZSBzZXZlcmFsIGRpZmZlcmVudCB2ZXJzaW9ucyBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZSBmb3JtYXQuCisgKiBJbiBhbGwgY2FzZXMsIGlucHV0IGlzIHNjYWxlZCB0byB0aGUgc2l6ZSBvZiBKU0FNUExFLgorICoKKyAqIEEgcmVhbGx5IGZhc3QgcGF0aCBpcyBwcm92aWRlZCBmb3IgcmVhZGluZyBieXRlL3NhbXBsZSByYXcgZmlsZXMgd2l0aAorICogbWF4dmFsID0gTUFYSlNBTVBMRSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGZvciA4LWJpdCBkYXRhLgorICovCisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfdGV4dF9ncmF5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgdGV4dC1mb3JtYXQgUEdNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLworeworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworICBGSUxFICogaW5maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOworICBKRElNRU5TSU9OIGNvbDsKKworICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICpwdHIrKyA9IHJlc2NhbGVbcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKV07CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfdGV4dF9yZ2Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyB0ZXh0LWZvcm1hdCBQUE0gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisgIEZJTEUgKiBpbmZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7CisgIEpESU1FTlNJT04gY29sOworCisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKKyAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOworICAgICpwdHIrKyA9IHJlc2NhbGVbcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKV07CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfc2NhbGVkX2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctYnl0ZS1mb3JtYXQgUEdNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLworeworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKKyAgSkRJTUVOU0lPTiBjb2w7CisKKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfc2NhbGVkX3JnYl9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy1ieXRlLWZvcm1hdCBQUE0gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgVV9DSEFSICogYnVmZmVycHRyOworICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOworICBKRElNRU5TSU9OIGNvbDsKKworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBidWZmZXJwdHIgPSBzb3VyY2UtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAqcHRyKysgPSByZXNjYWxlW1VDSCgqYnVmZmVycHRyKyspXTsKKyAgICAqcHRyKysgPSByZXNjYWxlW1VDSCgqYnVmZmVycHRyKyspXTsKKyAgICAqcHRyKysgPSByZXNjYWxlW1VDSCgqYnVmZmVycHRyKyspXTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF9yYXdfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctYnl0ZS1mb3JtYXQgZmlsZXMgd2l0aCBtYXh2YWwgPSBNQVhKU0FNUExFLgorICogSW4gdGhpcyBjYXNlIHdlIGp1c3QgcmVhZCByaWdodCBpbnRvIHRoZSBKU0FNUExFIGJ1ZmZlciEKKyAqIE5vdGUgdGhhdCBzYW1lIGNvZGUgd29ya3MgZm9yIFBQTSBhbmQgUEdNIGZpbGVzLgorICovCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisKKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIHJldHVybiAxOworfQorCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3dvcmRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy13b3JkLWZvcm1hdCBQR00gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgVV9DSEFSICogYnVmZmVycHRyOworICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOworICBKRElNRU5TSU9OIGNvbDsKKworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBidWZmZXJwdHIgPSBzb3VyY2UtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICByZWdpc3RlciBpbnQgdGVtcDsKKyAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOworICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKKyAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOworICB9CisgIHJldHVybiAxOworfQorCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3dvcmRfcmdiX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LXdvcmQtZm9ybWF0IFBQTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7CisgIEpESU1FTlNJT04gY29sOworCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIHJlZ2lzdGVyIGludCB0ZW1wOworICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7CisgICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OworICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07CisgICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKKyAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7CisgICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKKyAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOworICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKKyAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOworICB9CisgIHJldHVybiAxOworfQorCisKKy8qCisgKiBSZWFkIHRoZSBmaWxlIGhlYWRlcjsgcmV0dXJuIGltYWdlIHNpemUgYW5kIGNvbXBvbmVudCBjb3VudC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X2lucHV0X3BwbSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisgIGludCBjOworICB1bnNpZ25lZCBpbnQgdywgaCwgbWF4dmFsOworICBib29sZWFuIG5lZWRfaW9idWZmZXIsIHVzZV9yYXdfYnVmZmVyLCBuZWVkX3Jlc2NhbGU7CisKKyAgaWYgKGdldGMoc291cmNlLT5wdWIuaW5wdXRfZmlsZSkgIT0gJ1AnKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX05PVCk7CisKKyAgYyA9IGdldGMoc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7IC8qIHN1YmZvcm1hdCBkaXNjcmltaW5hdG9yIGNoYXJhY3RlciAqLworCisgIC8qIGRldGVjdCB1bnN1cHBvcnRlZCB2YXJpYW50cyAoaWUsIFBCTSkgYmVmb3JlIHRyeWluZyB0byByZWFkIGhlYWRlciAqLworICBzd2l0Y2ggKGMpIHsKKyAgY2FzZSAnMic6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBHTSBmaWxlICovCisgIGNhc2UgJzMnOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQUE0gZmlsZSAqLworICBjYXNlICc1JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQR00gZmlsZSAqLworICBjYXNlICc2JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQUE0gZmlsZSAqLworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX05PVCk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBmZXRjaCB0aGUgcmVtYWluaW5nIGhlYWRlciBpbmZvICovCisgIHcgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKTsKKyAgaCA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOworICBtYXh2YWwgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKTsKKworICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCBtYXh2YWwgPD0gMCkgLyogZXJyb3IgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT1QpOworCisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsgLyogd2UgYWx3YXlzIHJlc2NhbGUgZGF0YSB0byB0aGlzICovCisgIGNpbmZvLT5pbWFnZV93aWR0aCA9IChKRElNRU5TSU9OKSB3OworICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGg7CisKKyAgLyogaW5pdGlhbGl6ZSBmbGFncyB0byBtb3N0IGNvbW1vbiBzZXR0aW5ncyAqLworICBuZWVkX2lvYnVmZmVyID0gVFJVRTsJCS8qIGRvIHdlIG5lZWQgYW4gSS9PIGJ1ZmZlcj8gKi8KKyAgdXNlX3Jhd19idWZmZXIgPSBGQUxTRTsJLyogZG8gd2UgbWFwIGlucHV0IGJ1ZmZlciBvbnRvIEkvTyBidWZmZXI/ICovCisgIG5lZWRfcmVzY2FsZSA9IFRSVUU7CQkvKiBkbyB3ZSBuZWVkIGEgcmVzY2FsZSBhcnJheT8gKi8KKworICBzd2l0Y2ggKGMpIHsKKyAgY2FzZSAnMic6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBHTSBmaWxlICovCisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUEdNX1RFWFQsIHcsIGgpOworICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3RleHRfZ3JheV9yb3c7CisgICAgbmVlZF9pb2J1ZmZlciA9IEZBTFNFOworICAgIGJyZWFrOworCisgIGNhc2UgJzMnOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQUE0gZmlsZSAqLworICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BQTV9URVhULCB3LCBoKTsKKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF90ZXh0X3JnYl9yb3c7CisgICAgbmVlZF9pb2J1ZmZlciA9IEZBTFNFOworICAgIGJyZWFrOworCisgIGNhc2UgJzUnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBHTSBmaWxlICovCisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUEdNLCB3LCBoKTsKKyAgICBpZiAobWF4dmFsID4gMjU1KSB7CisgICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF93b3JkX2dyYXlfcm93OworICAgIH0gZWxzZSBpZiAobWF4dmFsID09IE1BWEpTQU1QTEUgJiYgU0laRU9GKEpTQU1QTEUpID09IFNJWkVPRihVX0NIQVIpKSB7CisgICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9yYXdfcm93OworICAgICAgdXNlX3Jhd19idWZmZXIgPSBUUlVFOworICAgICAgbmVlZF9yZXNjYWxlID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3NjYWxlZF9ncmF5X3JvdzsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAnNic6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUFBNIGZpbGUgKi8KKyAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QUE0sIHcsIGgpOworICAgIGlmIChtYXh2YWwgPiAyNTUpIHsKKyAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3dvcmRfcmdiX3JvdzsKKyAgICB9IGVsc2UgaWYgKG1heHZhbCA9PSBNQVhKU0FNUExFICYmIFNJWkVPRihKU0FNUExFKSA9PSBTSVpFT0YoVV9DSEFSKSkgeworICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfcmF3X3JvdzsKKyAgICAgIHVzZV9yYXdfYnVmZmVyID0gVFJVRTsKKyAgICAgIG5lZWRfcmVzY2FsZSA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9zY2FsZWRfcmdiX3JvdzsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgSS9PIGJ1ZmZlcjogMSBvciAzIGJ5dGVzIG9yIHdvcmRzL3BpeGVsLiAqLworICBpZiAobmVlZF9pb2J1ZmZlcikgeworICAgIHNvdXJjZS0+YnVmZmVyX3dpZHRoID0gKHNpemVfdCkgdyAqIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICoKKyAgICAgICgobWF4dmFsPD0yNTUpID8gU0laRU9GKFVfQ0hBUikgOiAoMipTSVpFT0YoVV9DSEFSKSkpOworICAgIHNvdXJjZS0+aW9idWZmZXIgPSAoVV9DSEFSICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgc291cmNlLT5idWZmZXJfd2lkdGgpOworICB9CisKKyAgLyogQ3JlYXRlIGNvbXByZXNzb3IgaW5wdXQgYnVmZmVyLiAqLworICBpZiAodXNlX3Jhd19idWZmZXIpIHsKKyAgICAvKiBGb3IgdW5zY2FsZWQgcmF3LWlucHV0IGNhc2UsIHdlIGNhbiBqdXN0IG1hcCBpdCBvbnRvIHRoZSBJL08gYnVmZmVyLiAqLworICAgIC8qIFN5bnRoZXNpemUgYSBKU0FNUEFSUkFZIHBvaW50ZXIgc3RydWN0dXJlICovCisgICAgLyogQ2FzdCBoZXJlIGltcGxpZXMgbmVhci0+ZmFyIHBvaW50ZXIgY29udmVyc2lvbiBvbiBQQ3MgKi8KKyAgICBzb3VyY2UtPnBpeHJvdyA9IChKU0FNUFJPVykgc291cmNlLT5pb2J1ZmZlcjsKKyAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAmIHNvdXJjZS0+cGl4cm93OworICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworICB9IGVsc2UgeworICAgIC8qIE5lZWQgdG8gdHJhbnNsYXRlIGFueXdheSwgc28gbWFrZSBhIHNlcGFyYXRlIHNhbXBsZSBidWZmZXIuICovCisgICAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgIChKRElNRU5TSU9OKSB3ICogY2luZm8tPmlucHV0X2NvbXBvbmVudHMsIChKRElNRU5TSU9OKSAxKTsKKyAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKyAgfQorCisgIC8qIENvbXB1dGUgdGhlIHJlc2NhbGluZyBhcnJheSBpZiByZXF1aXJlZC4gKi8KKyAgaWYgKG5lZWRfcmVzY2FsZSkgeworICAgIElOVDMyIHZhbCwgaGFsZl9tYXh2YWw7CisKKyAgICAvKiBPbiAxNi1iaXQtaW50IG1hY2hpbmVzIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBvZiBtYXh2YWwgPSA2NTUzNSAqLworICAgIHNvdXJjZS0+cmVzY2FsZSA9IChKU0FNUExFICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgKHNpemVfdCkgKCgobG9uZykgbWF4dmFsICsgMUwpICogU0laRU9GKEpTQU1QTEUpKSk7CisgICAgaGFsZl9tYXh2YWwgPSBtYXh2YWwgLyAyOworICAgIGZvciAodmFsID0gMDsgdmFsIDw9IChJTlQzMikgbWF4dmFsOyB2YWwrKykgeworICAgICAgLyogVGhlIG11bHRpcGxpY2F0aW9uIGhlcmUgbXVzdCBiZSBkb25lIGluIDMyIGJpdHMgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyAgICAgIHNvdXJjZS0+cmVzY2FsZVt2YWxdID0gKEpTQU1QTEUpICgodmFsKk1BWEpTQU1QTEUgKyBoYWxmX21heHZhbCkvbWF4dmFsKTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfaW5wdXRfcHBtIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBQUE0gZm9ybWF0IGlucHV0LgorICovCisKK0dMT0JBTChjanBlZ19zb3VyY2VfcHRyKQoramluaXRfcmVhZF9wcG0gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBwcG1fc291cmNlX3B0ciBzb3VyY2U7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0ICovCisgIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YocHBtX3NvdXJjZV9zdHJ1Y3QpKTsKKyAgLyogRmlsbCBpbiBtZXRob2QgcHRycywgZXhjZXB0IGdldF9waXhlbF9yb3dzIHdoaWNoIHN0YXJ0X2lucHV0IHNldHMgKi8KKyAgc291cmNlLT5wdWIuc3RhcnRfaW5wdXQgPSBzdGFydF9pbnB1dF9wcG07CisgIHNvdXJjZS0+cHViLmZpbmlzaF9pbnB1dCA9IGZpbmlzaF9pbnB1dF9wcG07CisKKyAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Cit9CisKKyNlbmRpZiAvKiBQUE1fU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL3JkcmxlLmMgYi9qcGVnL3JkcmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyYmMzNwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvcmRybGUuYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIHJkcmxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBVdGFoIFJMRSBmb3JtYXQuCisgKiBUaGUgVXRhaCBSYXN0ZXIgVG9vbGtpdCBsaWJyYXJ5IGlzIHJlcXVpcmVkICh2ZXJzaW9uIDMuMSBvciBsYXRlcikuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIGlucHV0IGZyb20KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4gIFRoZXkgZnVydGhlciBhc3N1bWUgdGhhdCByZWFkaW5nIGJlZ2lucworICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlOyBzdGFydF9pbnB1dCBtYXkgbmVlZCB3b3JrIGlmIHRoZQorICogdXNlciBpbnRlcmZhY2UgaGFzIGFscmVhZHkgcmVhZCBzb21lIGRhdGEgKGUuZy4sIHRvIGRldGVybWluZSB0aGF0CisgKiB0aGUgZmlsZSBpcyBpbmRlZWQgUkxFIGZvcm1hdCkuCisgKgorICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBNaWtlIExpamV3c2tpLAorICogd2l0aCB1cGRhdGVzIGZyb20gUm9iZXJ0IEh1dGNoaW5zb24uCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIFJMRV9TVVBQT1JURUQKKworLyogcmxlLmggaXMgcHJvdmlkZWQgYnkgdGhlIFV0YWggUmFzdGVyIFRvb2xraXQuICovCisKKyNpbmNsdWRlIDxybGUuaD4KKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0IEpTQU1QTEUgaGFzIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFzIHJsZV9waXhlbCwKKyAqIHRvIHdpdCwgInVuc2lnbmVkIGNoYXIiLiAgSGVuY2Ugd2UgY2FuJ3QgY29wZSB3aXRoIDEyLSBvciAxNi1iaXQgc2FtcGxlcy4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKy8qCisgKiBXZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgUkxFIGZpbGVzOgorICogICAKKyAqICAgR1JBWVNDQUxFICAgLSA4IGJpdHMsIG5vIGNvbG9ybWFwCisgKiAgIE1BUFBFREdSQVkgIC0gOCBiaXRzLCAxIGNoYW5uZWwgY29sb21hcAorICogICBQU0VVRE9DT0xPUiAtIDggYml0cywgMyBjaGFubmVsIGNvbG9ybWFwCisgKiAgIFRSVUVDT0xPUiAgIC0gMjQgYml0cywgMyBjaGFubmVsIGNvbG9ybWFwCisgKiAgIERJUkVDVENPTE9SIC0gMjQgYml0cywgbm8gY29sb3JtYXAKKyAqCisgKiBGb3Igbm93LCB3ZSBpZ25vcmUgYW55IGFscGhhIGNoYW5uZWwgaW4gdGhlIGltYWdlLgorICovCisKK3R5cGVkZWYgZW51bQorICB7IEdSQVlTQ0FMRSwgTUFQUEVER1JBWSwgUFNFVURPQ09MT1IsIFRSVUVDT0xPUiwgRElSRUNUQ09MT1IgfSBybGVfa2luZDsKKworCisvKgorICogU2luY2UgUkxFIHN0b3JlcyBzY2FubGluZXMgYm90dG9tLXRvLXRvcCwgd2UgaGF2ZSB0byBpbnZlcnQgdGhlIGltYWdlCisgKiB0byBjb25mb3JtIHRvIEpQRUcncyB0b3AtdG8tYm90dG9tIG9yZGVyLiAgVG8gZG8gdGhpcywgd2UgcmVhZCB0aGUKKyAqIGluY29taW5nIGltYWdlIGludG8gYSB2aXJ0dWFsIGFycmF5IG9uIHRoZSBmaXJzdCBnZXRfcGl4ZWxfcm93cyBjYWxsLAorICogdGhlbiBmZXRjaCB0aGUgcmVxdWlyZWQgcm93IGZyb20gdGhlIHZpcnR1YWwgYXJyYXkgb24gc3Vic2VxdWVudCBjYWxscy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfcmxlX3NvdXJjZV9zdHJ1Y3QgKiBybGVfc291cmNlX3B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX3JsZV9zb3VyY2Vfc3RydWN0IHsKKyAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgcmxlX2tpbmQgdmlzdWFsOyAgICAgICAgICAgICAgLyogYWN0dWFsIHR5cGUgb2YgaW5wdXQgZmlsZSAqLworICBqdmlydF9zYXJyYXlfcHRyIGltYWdlOyAgICAgICAvKiB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlICovCisgIEpESU1FTlNJT04gcm93OwkJLyogY3VycmVudCByb3cgIyBpbiB0aGUgdmlydHVhbCBhcnJheSAqLworICBybGVfaGRyIGhlYWRlcjsgICAgICAgICAgICAgICAvKiBJbnB1dCBmaWxlIGluZm9ybWF0aW9uICovCisgIHJsZV9waXhlbCoqIHJsZV9yb3c7ICAgICAgICAgIC8qIGhvbGRzIGEgcm93IHJldHVybmVkIGJ5IHJsZV9nZXRyb3coKSAqLworCit9IHJsZV9zb3VyY2Vfc3RydWN0OworCisKKy8qCisgKiBSZWFkIHRoZSBmaWxlIGhlYWRlcjsgcmV0dXJuIGltYWdlIHNpemUgYW5kIGNvbXBvbmVudCBjb3VudC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X2lucHV0X3JsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87CisgIEpESU1FTlNJT04gd2lkdGgsIGhlaWdodDsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworI2VuZGlmCisKKyAgLyogVXNlIFJMRSBsaWJyYXJ5IHJvdXRpbmUgdG8gZ2V0IHRoZSBoZWFkZXIgaW5mbyAqLworICBzb3VyY2UtPmhlYWRlciA9ICpybGVfaGRyX2luaXQoTlVMTCk7CisgIHNvdXJjZS0+aGVhZGVyLnJsZV9maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKKyAgc3dpdGNoIChybGVfZ2V0X3NldHVwKCYoc291cmNlLT5oZWFkZXIpKSkgeworICBjYXNlIFJMRV9TVUNDRVNTOgorICAgIC8qIEEtT0sgKi8KKyAgICBicmVhazsKKyAgY2FzZSBSTEVfTk9UX1JMRToKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9OT1QpOworICAgIGJyZWFrOworICBjYXNlIFJMRV9OT19TUEFDRToKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9NRU0pOworICAgIGJyZWFrOworICBjYXNlIFJMRV9FTVBUWToKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9FTVBUWSk7CisgICAgYnJlYWs7CisgIGNhc2UgUkxFX0VPRjoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9FT0YpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0JBREVSUk9SKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIEZpZ3VyZSBvdXQgd2hhdCB3ZSBoYXZlLCBzZXQgcHJpdmF0ZSB2YXJzIGFuZCByZXR1cm4gdmFsdWVzIGFjY29yZGluZ2x5ICovCisgIAorICB3aWR0aCAgPSBzb3VyY2UtPmhlYWRlci54bWF4IC0gc291cmNlLT5oZWFkZXIueG1pbiArIDE7CisgIGhlaWdodCA9IHNvdXJjZS0+aGVhZGVyLnltYXggLSBzb3VyY2UtPmhlYWRlci55bWluICsgMTsKKyAgc291cmNlLT5oZWFkZXIueG1pbiA9IDA7CQkvKiByZWFsaWduIGhvcml6b250YWxseSAqLworICBzb3VyY2UtPmhlYWRlci54bWF4ID0gd2lkdGgtMTsKKworICBjaW5mby0+aW1hZ2Vfd2lkdGggICAgICA9IHdpZHRoOworICBjaW5mby0+aW1hZ2VfaGVpZ2h0ICAgICA9IGhlaWdodDsKKyAgY2luZm8tPmRhdGFfcHJlY2lzaW9uICAgPSA4OyAgLyogd2UgY2FuIG9ubHkgaGFuZGxlIDggYml0IGRhdGEgKi8KKworICBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDApIHsKKyAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBHUkFZU0NBTEU7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUkxFX0dSQVksIHdpZHRoLCBoZWlnaHQpOworICB9IGVsc2UgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMSAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAxKSB7CisgICAgc291cmNlLT52aXN1YWwgICAgID0gTUFQUEVER1JBWTsKKyAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfTUFQR1JBWSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAxIDw8IHNvdXJjZS0+aGVhZGVyLmNtYXBsZW4pOworICB9IGVsc2UgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMSAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAzKSB7CisgICAgc291cmNlLT52aXN1YWwgICAgID0gUFNFVURPQ09MT1I7CisgICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfUkxFX01BUFBFRCwgd2lkdGgsIGhlaWdodCwKKwkgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7CisgIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAzICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDMpIHsKKyAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBUUlVFQ09MT1I7CisgICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfUkxFX0ZVTExNQVAsIHdpZHRoLCBoZWlnaHQsCisJICAgICAxIDw8IHNvdXJjZS0+aGVhZGVyLmNtYXBsZW4pOworICB9IGVsc2UgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMyAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAwKSB7CisgICAgc291cmNlLT52aXN1YWwgICAgID0gRElSRUNUQ09MT1I7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUkxFLCB3aWR0aCwgaGVpZ2h0KTsKKyAgfSBlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfVU5TVVBQT1JURUQpOworICAKKyAgaWYgKHNvdXJjZS0+dmlzdWFsID09IEdSQVlTQ0FMRSB8fCBzb3VyY2UtPnZpc3VhbCA9PSBNQVBQRURHUkFZKSB7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlICAgPSBKQ1NfR1JBWVNDQUxFOworICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKKyAgfSBlbHNlIHsKKyAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgICA9IEpDU19SR0I7CisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOworICB9CisKKyAgLyoKKyAgICogQSBwbGFjZSB0byBob2xkIGVhY2ggc2NhbmxpbmUgd2hpbGUgaXQncyBjb252ZXJ0ZWQuCisgICAqIChHUkFZU0NBTEUgc2NhbmxpbmVzIGRvbid0IG5lZWQgY29udmVydGluZykKKyAgICovCisgIGlmIChzb3VyY2UtPnZpc3VhbCAhPSBHUkFZU0NBTEUpIHsKKyAgICBzb3VyY2UtPnJsZV9yb3cgPSAocmxlX3BpeGVsKiopICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAoSkRJTUVOU0lPTikgd2lkdGgsIChKRElNRU5TSU9OKSBjaW5mby0+aW5wdXRfY29tcG9uZW50cyk7CisgIH0KKworICAvKiByZXF1ZXN0IGEgdmlydHVhbCBhcnJheSB0byBob2xkIHRoZSBpbWFnZSAqLworICBzb3VyY2UtPmltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorICAgICAoSkRJTUVOU0lPTikgKHdpZHRoICogc291cmNlLT5oZWFkZXIubmNvbG9ycyksCisgICAgIChKRElNRU5TSU9OKSBoZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLworICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsKKyAgfQorI2VuZGlmCisKKyAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7Cit9CisKKworLyoKKyAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCisgKiBDYWxsZWQgb25seSBhZnRlciBsb2FkX2ltYWdlIGhhcyByZWFkIHRoZSBpbWFnZSBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5LgorICogVXNlZCBmb3IgR1JBWVNDQUxFLCBNQVBQRURHUkFZLCBUUlVFQ09MT1IsIGFuZCBESVJFQ1RDT0xPUiBpbWFnZXMuCisgKi8KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfcmxlX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87CisKKyAgc291cmNlLT5yb3ctLTsKKyAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCBzb3VyY2UtPnJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKworICByZXR1cm4gMTsKK30KKworLyoKKyAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCisgKiBDYWxsZWQgb25seSBhZnRlciBsb2FkX2ltYWdlIGhhcyByZWFkIHRoZSBpbWFnZSBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5LgorICogVXNlZCBmb3IgUFNFVURPQ09MT1IgaW1hZ2VzLgorICovCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3BzZXVkb2NvbG9yX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87CisgIEpTQU1QUk9XIHNyY19yb3csIGRlc3Rfcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgcmxlX21hcCAqY29sb3JtYXA7CisgIGludCB2YWw7CisKKyAgY29sb3JtYXAgPSBzb3VyY2UtPmhlYWRlci5jbWFwOworICBkZXN0X3JvdyA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgc291cmNlLT5yb3ctLTsKKyAgc3JjX3JvdyA9ICogKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCBzb3VyY2UtPnJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICB2YWwgPSBHRVRKU0FNUExFKCpzcmNfcm93KyspOworICAgICpkZXN0X3JvdysrID0gKEpTQU1QTEUpIChjb2xvcm1hcFt2YWwgICAgICBdID4+IDgpOworICAgICpkZXN0X3JvdysrID0gKEpTQU1QTEUpIChjb2xvcm1hcFt2YWwgKyAyNTZdID4+IDgpOworICAgICpkZXN0X3JvdysrID0gKEpTQU1QTEUpIChjb2xvcm1hcFt2YWwgKyA1MTJdID4+IDgpOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIExvYWQgdGhlIGltYWdlIGludG8gYSB2aXJ0dWFsIGFycmF5LiAgV2UgaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2UgUkxFCisgKiBmaWxlcyBzdGFydCBhdCB0aGUgbG93ZXIgbGVmdCB3aGlsZSB0aGUgSlBFRyBzdGFuZGFyZCBoYXMgdGhlbSBzdGFydGluZworICogaW4gdGhlIHVwcGVyIGxlZnQuICBUaGlzIGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZSB3ZSB3YW50IHRvIGdldCBhIHJvdworICogb2YgaW5wdXQuICBXaGF0IHdlIGRvIGlzIGxvYWQgdGhlIFJMRSBkYXRhIGludG8gdGhlIGFycmF5IGFuZCB0aGVuIGNhbGwKKyAqIHRoZSBhcHByb3ByaWF0ZSByb3V0aW5lIHRvIHJlYWQgb25lIHJvdyBmcm9tIHRoZSBhcnJheS4gIEJlZm9yZSByZXR1cm5pbmcsCisgKiB3ZSBzZXQgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3Mgc28gdGhhdCBzdWJzZXF1ZW50IGNhbGxzIGdvIHN0cmFpZ2h0IHRvCisgKiB0aGUgYXBwcm9wcmlhdGUgcm93LXJlYWRpbmcgcm91dGluZS4KKyAqLworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2xvYWRfaW1hZ2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICBybGVfc291cmNlX3B0ciBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpIHNpbmZvOworICBKRElNRU5TSU9OIHJvdywgY29sOworICBKU0FNUFJPVyAgc2NhbmxpbmUsIHJlZF9wdHIsIGdyZWVuX3B0ciwgYmx1ZV9wdHI7CisgIHJsZV9waXhlbCAqKnJsZV9yb3c7CisgIHJsZV9tYXAgKmNvbG9ybWFwOworICBjaGFyIGNoYW5uZWw7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyNlbmRpZgorCisgIGNvbG9ybWFwID0gc291cmNlLT5oZWFkZXIuY21hcDsKKyAgcmxlX3JvdyA9IHNvdXJjZS0+cmxlX3JvdzsKKworICAvKiBSZWFkIHRoZSBSTEUgZGF0YSBpbnRvIG91ciB2aXJ0dWFsIGFycmF5LgorICAgKiBXZSBhc3N1bWUgaGVyZSB0aGF0IChhKSBybGVfcGl4ZWwgaXMgcmVwcmVzZW50ZWQgdGhlIHNhbWUgYXMgSlNBTVBMRSwKKyAgICogYW5kIChiKSB3ZSBhcmUgbm90IG9uIGEgbWFjaGluZSB3aGVyZSBGQVIgcG9pbnRlcnMgZGlmZmVyIGZyb20gcmVndWxhci4KKyAgICovCisgIFJMRV9DTFJfQklUKHNvdXJjZS0+aGVhZGVyLCBSTEVfQUxQSEEpOyAvKiBkb24ndCByZWFkIHRoZSBhbHBoYSBjaGFubmVsICovCisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gMDsKKyAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgfQorI2VuZGlmCisKKyAgc3dpdGNoIChzb3VyY2UtPnZpc3VhbCkgeworCisgIGNhc2UgR1JBWVNDQUxFOgorICBjYXNlIFBTRVVET0NPTE9SOgorICAgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKKyAgICAgIHJsZV9yb3cgPSAocmxlX3BpeGVsICoqKSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT5pbWFnZSwgcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgICAgICBybGVfZ2V0cm93KCZzb3VyY2UtPmhlYWRlciwgcmxlX3Jvdyk7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOworICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIE1BUFBFREdSQVk6CisgIGNhc2UgVFJVRUNPTE9SOgorICAgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKKyAgICAgIHNjYW5saW5lID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgICAgIHJsZV9yb3cgPSBzb3VyY2UtPnJsZV9yb3c7CisgICAgICBybGVfZ2V0cm93KCZzb3VyY2UtPmhlYWRlciwgcmxlX3Jvdyk7CisKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgY2luZm8tPmltYWdlX3dpZHRoOyBjb2wrKykgeworICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgc291cmNlLT5oZWFkZXIubmNvbG9yczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgKnNjYW5saW5lKysgPSAoSlNBTVBMRSkKKyAgICAgICAgICAgIChjb2xvcm1hcFtHRVRKU0FNUExFKHJsZV9yb3dbY2hhbm5lbF1bY29sXSkgKyAyNTYgKiBjaGFubmVsXSA+PiA4KTsKKyAgICAgICAgfQorICAgICAgfQorCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOworICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIERJUkVDVENPTE9SOgorICAgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKKyAgICAgIHNjYW5saW5lID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKKworICAgICAgcmVkX3B0ciAgID0gcmxlX3Jvd1swXTsKKyAgICAgIGdyZWVuX3B0ciA9IHJsZV9yb3dbMV07CisgICAgICBibHVlX3B0ciAgPSBybGVfcm93WzJdOworCisgICAgICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgICAgKnNjYW5saW5lKysgPSAqcmVkX3B0cisrOworICAgICAgICAqc2NhbmxpbmUrKyA9ICpncmVlbl9wdHIrKzsKKyAgICAgICAgKnNjYW5saW5lKysgPSAqYmx1ZV9wdHIrKzsKKyAgICAgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKKyAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOworI2VuZGlmCisKKyAgLyogU2V0IHVwIHRvIGNhbGwgcHJvcGVyIHJvdy1leHRyYWN0aW9uIHJvdXRpbmUgaW4gZnV0dXJlICovCisgIGlmIChzb3VyY2UtPnZpc3VhbCA9PSBQU0VVRE9DT0xPUikgeworICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9IHNvdXJjZS0+cmxlX3JvdzsKKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9wc2V1ZG9jb2xvcl9yb3c7CisgIH0gZWxzZSB7CisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfcmxlX3JvdzsKKyAgfQorICBzb3VyY2UtPnJvdyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisKKyAgLyogQW5kIGZldGNoIHRoZSB0b3Btb3N0IChib3R0b21tb3N0KSByb3cgKi8KKyAgcmV0dXJuICgqc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MpIChjaW5mbywgc2luZm8pOyAgIAorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9pbnB1dF9ybGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFJMRSBmb3JtYXQgaW5wdXQuCisgKi8KKworR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCitqaW5pdF9yZWFkX3JsZSAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHJsZV9zb3VyY2VfcHRyIHNvdXJjZTsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KKyAgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0YocmxlX3NvdXJjZV9zdHJ1Y3QpKTsKKyAgLyogRmlsbCBpbiBtZXRob2QgcHRycyAqLworICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X3JsZTsKKyAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X3JsZTsKKyAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBsb2FkX2ltYWdlOworCisgIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOworfQorCisjZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9yZHN3aXRjaC5jIGIvanBlZy9yZHN3aXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNGJiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3Jkc3dpdGNoLmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiByZHN3aXRjaC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcHJvY2VzcyBzb21lIG9mIGNqcGVnJ3MgbW9yZSBjb21wbGljYXRlZAorICogY29tbWFuZC1saW5lIHN3aXRjaGVzLiAgU3dpdGNoZXMgcHJvY2Vzc2VkIGhlcmUgYXJlOgorICoJLXF0YWJsZXMgZmlsZQkJUmVhZCBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGV4dCBmaWxlCisgKgktc2NhbnMgZmlsZQkJUmVhZCBzY2FuIHNjcmlwdCBmcm9tIHRleHQgZmlsZQorICoJLXFzbG90cyBOWyxOLC4uLl0JU2V0IGNvbXBvbmVudCBxdWFudGl6YXRpb24gdGFibGUgc2VsZWN0b3JzCisgKgktc2FtcGxlIEh4VlssSHhWLC4uLl0JU2V0IGNvbXBvbmVudCBzYW1wbGluZyBmYWN0b3JzCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc2RpZ2l0KCksIGlzc3BhY2UoKSAqLworCisKK0xPQ0FMKGludCkKK3RleHRfZ2V0YyAoRklMRSAqIGZpbGUpCisvKiBSZWFkIG5leHQgY2hhciwgc2tpcHBpbmcgb3ZlciBhbnkgY29tbWVudHMgKCMgdG8gZW5kIG9mIGxpbmUpICovCisvKiBBIGNvbW1lbnQvbmV3bGluZSBzZXF1ZW5jZSBpcyByZXR1cm5lZCBhcyBhIG5ld2xpbmUgKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNoOworICAKKyAgY2ggPSBnZXRjKGZpbGUpOworICBpZiAoY2ggPT0gJyMnKSB7CisgICAgZG8geworICAgICAgY2ggPSBnZXRjKGZpbGUpOworICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKKyAgfQorICByZXR1cm4gY2g7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK3JlYWRfdGV4dF9pbnRlZ2VyIChGSUxFICogZmlsZSwgbG9uZyAqIHJlc3VsdCwgaW50ICogdGVybWNoYXIpCisvKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIGEgZmlsZSwgc3RvcmUgaXQgaW4gcmVzdWx0ICovCisvKiBSZWFkcyBvbmUgdHJhaWxpbmcgY2hhcmFjdGVyIGFmdGVyIHRoZSBpbnRlZ2VyOyByZXR1cm5zIGl0IGluIHRlcm1jaGFyICovCit7CisgIHJlZ2lzdGVyIGludCBjaDsKKyAgcmVnaXN0ZXIgbG9uZyB2YWw7CisgIAorICAvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UsIGRldGVjdCBFT0YgKi8KKyAgZG8geworICAgIGNoID0gdGV4dF9nZXRjKGZpbGUpOworICAgIGlmIChjaCA9PSBFT0YpIHsKKyAgICAgICp0ZXJtY2hhciA9IGNoOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSB3aGlsZSAoaXNzcGFjZShjaCkpOworICAKKyAgaWYgKCEgaXNkaWdpdChjaCkpIHsKKyAgICAqdGVybWNoYXIgPSBjaDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB2YWwgPSBjaCAtICcwJzsKKyAgd2hpbGUgKChjaCA9IHRleHRfZ2V0YyhmaWxlKSkgIT0gRU9GKSB7CisgICAgaWYgKCEgaXNkaWdpdChjaCkpCisgICAgICBicmVhazsKKyAgICB2YWwgKj0gMTA7CisgICAgdmFsICs9IGNoIC0gJzAnOworICB9CisgICpyZXN1bHQgPSB2YWw7CisgICp0ZXJtY2hhciA9IGNoOworICByZXR1cm4gVFJVRTsKK30KKworCitHTE9CQUwoYm9vbGVhbikKK3JlYWRfcXVhbnRfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lLAorCQkgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogUmVhZCBhIHNldCBvZiBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLgorICogVGhlIGZpbGUgaXMgcGxhaW4gQVNDSUkgdGV4dDogZGVjaW1hbCBudW1iZXJzIHdpdGggd2hpdGVzcGFjZSBiZXR3ZWVuLgorICogQ29tbWVudHMgcHJlY2VkZWQgYnkgJyMnIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsZS4KKyAqIFRoZXJlIG1heSBiZSBvbmUgdG8gTlVNX1FVQU5UX1RCTFMgdGFibGVzIGluIHRoZSBmaWxlLCBlYWNoIG9mIDY0IHZhbHVlcy4KKyAqIFRoZSB0YWJsZXMgYXJlIGltcGxpY2l0bHkgbnVtYmVyZWQgMCwxLGV0Yy4KKyAqIE5PVEU6IGRvZXMgbm90IGFmZmVjdCB0aGUgcXNsb3RzIG1hcHBpbmcsIHdoaWNoIHdpbGwgZGVmYXVsdCB0byBzZWxlY3RpbmcKKyAqIHRhYmxlIDAgZm9yIGx1bWluYW5jZSAob3IgcHJpbWFyeSkgY29tcG9uZW50cywgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KKyAqIFlvdSBtdXN0IHVzZSAtcXNsb3RzIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IGNvbXBvbmVudC0+dGFibGUgbWFwcGluZy4KKyAqLworeworICBGSUxFICogZnA7CisgIGludCB0YmxubywgaSwgdGVybWNoYXI7CisgIGxvbmcgdmFsOworICB1bnNpZ25lZCBpbnQgdGFibGVbRENUU0laRTJdOworCisgIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiB0YWJsZSBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHRibG5vID0gMDsKKworICB3aGlsZSAocmVhZF90ZXh0X2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpIHsgLyogcmVhZCAxc3QgZWxlbWVudCBvZiB0YWJsZSAqLworICAgIGlmICh0YmxubyA+PSBOVU1fUVVBTlRfVEJMUykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSB0YWJsZXMgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgdGFibGVbMF0gPSAodW5zaWduZWQgaW50KSB2YWw7CisgICAgZm9yIChpID0gMTsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICAgIGlmICghIHJlYWRfdGV4dF9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKSB7CisJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHRhYmxlIGRhdGEgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworCWZjbG9zZShmcCk7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgdGFibGVbaV0gPSAodW5zaWduZWQgaW50KSB2YWw7CisgICAgfQorICAgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCB0YmxubywgdGFibGUsIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworICAgIHRibG5vKys7CisgIH0KKworICBpZiAodGVybWNoYXIgIT0gRU9GKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJOb24tbnVtZXJpYyBkYXRhIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGZjbG9zZShmcCk7CisgIHJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKworTE9DQUwoYm9vbGVhbikKK3JlYWRfc2Nhbl9pbnRlZ2VyIChGSUxFICogZmlsZSwgbG9uZyAqIHJlc3VsdCwgaW50ICogdGVybWNoYXIpCisvKiBWYXJpYW50IG9mIHJlYWRfdGV4dF9pbnRlZ2VyIHRoYXQgYWx3YXlzIGxvb2tzIGZvciBhIG5vbi1zcGFjZSB0ZXJtY2hhcjsKKyAqIHRoaXMgc2ltcGxpZmllcyBwYXJzaW5nIG9mIHB1bmN0dWF0aW9uIGluIHNjYW4gc2NyaXB0cy4KKyAqLworeworICByZWdpc3RlciBpbnQgY2g7CisKKyAgaWYgKCEgcmVhZF90ZXh0X2ludGVnZXIoZmlsZSwgcmVzdWx0LCB0ZXJtY2hhcikpCisgICAgcmV0dXJuIEZBTFNFOworICBjaCA9ICp0ZXJtY2hhcjsKKyAgd2hpbGUgKGNoICE9IEVPRiAmJiBpc3NwYWNlKGNoKSkKKyAgICBjaCA9IHRleHRfZ2V0YyhmaWxlKTsKKyAgaWYgKGlzZGlnaXQoY2gpKSB7CQkvKiBvb3BzLCBwdXQgaXQgYmFjayAqLworICAgIGlmICh1bmdldGMoY2gsIGZpbGUpID09IEVPRikKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBjaCA9ICcgJzsKKyAgfSBlbHNlIHsKKyAgICAvKiBBbnkgc2VwYXJhdG9ycyBvdGhlciB0aGFuICc7JyBhbmQgJzonIGFyZSBpZ25vcmVkOworICAgICAqIHRoaXMgYWxsb3dzIHVzZXIgdG8gaW5zZXJ0IGNvbW1hcywgZXRjLCBpZiBkZXNpcmVkLgorICAgICAqLworICAgIGlmIChjaCAhPSBFT0YgJiYgY2ggIT0gJzsnICYmIGNoICE9ICc6JykKKyAgICAgIGNoID0gJyAnOworICB9CisgICp0ZXJtY2hhciA9IGNoOworICByZXR1cm4gVFJVRTsKK30KKworCitHTE9CQUwoYm9vbGVhbikKK3JlYWRfc2Nhbl9zY3JpcHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICogZmlsZW5hbWUpCisvKiBSZWFkIGEgc2NhbiBzY3JpcHQgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KKyAqIEVhY2ggZW50cnkgaW4gdGhlIGZpbGUgZGVmaW5lcyBvbmUgc2NhbiB0byBiZSBlbWl0dGVkLgorICogRW50cmllcyBhcmUgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgJzsnLgorICogQW4gZW50cnkgY29udGFpbnMgb25lIHRvIGZvdXIgY29tcG9uZW50IGluZGV4ZXMsCisgKiBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgY29sb24gJzonIGFuZCBmb3VyIHByb2dyZXNzaXZlLUpQRUcgcGFyYW1ldGVycy4KKyAqIFRoZSBjb21wb25lbnQgaW5kZXhlcyBkZW5vdGUgd2hpY2ggY29tcG9uZW50KHMpIGFyZSB0byBiZSB0cmFuc21pdHRlZAorICogaW4gdGhlIGN1cnJlbnQgc2Nhbi4gIFRoZSBmaXJzdCBjb21wb25lbnQgaGFzIGluZGV4IDAuCisgKiBTZXF1ZW50aWFsIEpQRUcgaXMgdXNlZCBpZiB0aGUgcHJvZ3Jlc3NpdmUtSlBFRyBwYXJhbWV0ZXJzIGFyZSBvbWl0dGVkLgorICogVGhlIGZpbGUgaXMgZnJlZSBmb3JtYXQgdGV4dDogYW55IHdoaXRlc3BhY2UgbWF5IGFwcGVhciBiZXR3ZWVuIG51bWJlcnMKKyAqIGFuZCB0aGUgJzonIGFuZCAnOycgcHVuY3R1YXRpb24gbWFya3MuICBBbHNvLCBvdGhlciBwdW5jdHVhdGlvbiAoc3VjaAorICogYXMgY29tbWFzIG9yIGRhc2hlcykgY2FuIGJlIHBsYWNlZCBiZXR3ZWVuIG51bWJlcnMgaWYgZGVzaXJlZC4KKyAqIENvbW1lbnRzIHByZWNlZGVkIGJ5ICcjJyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGUuCisgKiBOb3RlOiB3ZSBkbyB2ZXJ5IGxpdHRsZSB2YWxpZGl0eSBjaGVja2luZyBoZXJlOworICogamNtYXN0ZXIuYyB3aWxsIHZhbGlkYXRlIHRoZSBzY3JpcHQgcGFyYW1ldGVycy4KKyAqLworeworICBGSUxFICogZnA7CisgIGludCBzY2Fubm8sIG5jb21wcywgdGVybWNoYXI7CisgIGxvbmcgdmFsOworICBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7CisjZGVmaW5lIE1BWF9TQ0FOUyAgMTAwCQkvKiBxdWl0ZSBhcmJpdHJhcnkgbGltaXQgKi8KKyAganBlZ19zY2FuX2luZm8gc2NhbnNbTUFYX1NDQU5TXTsKKworICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gc2NhbiBkZWZpbml0aW9uIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgc2NhbnB0ciA9IHNjYW5zOworICBzY2Fubm8gPSAwOworCisgIHdoaWxlIChyZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkgeworICAgIGlmIChzY2Fubm8gPj0gTUFYX1NDQU5TKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IHNjYW5zIGRlZmluZWQgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gKGludCkgdmFsOworICAgIG5jb21wcyA9IDE7CisgICAgd2hpbGUgKHRlcm1jaGFyID09ICcgJykgeworICAgICAgaWYgKG5jb21wcyA+PSBNQVhfQ09NUFNfSU5fU0NBTikgeworCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgY29tcG9uZW50cyBpbiBvbmUgc2NhbiBpbiBmaWxlICVzXG4iLAorCQlmaWxlbmFtZSk7CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkKKwlnb3RvIGJvZ3VzOworICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W25jb21wc10gPSAoaW50KSB2YWw7CisgICAgICBuY29tcHMrKzsKKyAgICB9CisgICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IG5jb21wczsKKyAgICBpZiAodGVybWNoYXIgPT0gJzonKSB7CisgICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSB8fCB0ZXJtY2hhciAhPSAnICcpCisJZ290byBib2d1czsKKyAgICAgIHNjYW5wdHItPlNzID0gKGludCkgdmFsOworICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikgfHwgdGVybWNoYXIgIT0gJyAnKQorCWdvdG8gYm9ndXM7CisgICAgICBzY2FucHRyLT5TZSA9IChpbnQpIHZhbDsKKyAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpIHx8IHRlcm1jaGFyICE9ICcgJykKKwlnb3RvIGJvZ3VzOworICAgICAgc2NhbnB0ci0+QWggPSAoaW50KSB2YWw7CisgICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkKKwlnb3RvIGJvZ3VzOworICAgICAgc2NhbnB0ci0+QWwgPSAoaW50KSB2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHNldCBub24tcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyAqLworICAgICAgc2NhbnB0ci0+U3MgPSAwOworICAgICAgc2NhbnB0ci0+U2UgPSBEQ1RTSVpFMi0xOworICAgICAgc2NhbnB0ci0+QWggPSAwOworICAgICAgc2NhbnB0ci0+QWwgPSAwOworICAgIH0KKyAgICBpZiAodGVybWNoYXIgIT0gJzsnICYmIHRlcm1jaGFyICE9IEVPRikgeworYm9ndXM6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc2NhbiBlbnRyeSBmb3JtYXQgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgc2NhbnB0cisrLCBzY2Fubm8rKzsKKyAgfQorCisgIGlmICh0ZXJtY2hhciAhPSBFT0YpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vbi1udW1lcmljIGRhdGEgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHNjYW5ubyA+IDApIHsKKyAgICAvKiBTdGFzaCBjb21wbGV0ZWQgc2NhbiBsaXN0IGluIGNpbmZvIHN0cnVjdHVyZS4KKyAgICAgKiBOT1RFOiBmb3IgY2pwZWcncyB1c2UsIEpQT09MX0lNQUdFIGlzIHRoZSByaWdodCBsaWZldGltZSBmb3IgdGhpcyBkYXRhLAorICAgICAqIGJ1dCBpZiB5b3Ugd2FudCB0byBjb21wcmVzcyBtdWx0aXBsZSBpbWFnZXMgeW91J2Qgd2FudCBKUE9PTF9QRVJNQU5FTlQuCisgICAgICovCisgICAgc2NhbnB0ciA9IChqcGVnX3NjYW5faW5mbyAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIHNjYW5ubyAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOworICAgIE1FTUNPUFkoc2NhbnB0ciwgc2NhbnMsIHNjYW5ubyAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOworICAgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOworICAgIGNpbmZvLT5udW1fc2NhbnMgPSBzY2Fubm87CisgIH0KKworICBmY2xvc2UoZnApOworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLworCisKK0dMT0JBTChib29sZWFuKQorc2V0X3F1YW50X3Nsb3RzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKQorLyogUHJvY2VzcyBhIHF1YW50aXphdGlvbi10YWJsZS1zZWxlY3RvcnMgcGFyYW1ldGVyIHN0cmluZywgb2YgdGhlIGZvcm0KKyAqICAgICBOWyxOLC4uLl0KKyAqIElmIHRoZXJlIGFyZSBtb3JlIGNvbXBvbmVudHMgdGhhbiBwYXJhbWV0ZXJzLCB0aGUgbGFzdCB2YWx1ZSBpcyByZXBsaWNhdGVkLgorICovCit7CisgIGludCB2YWwgPSAwOwkJCS8qIGRlZmF1bHQgdGFibGUgIyAqLworICBpbnQgY2k7CisgIGNoYXIgY2g7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgTUFYX0NPTVBPTkVOVFM7IGNpKyspIHsKKyAgICBpZiAoKmFyZykgeworICAgICAgY2ggPSAnLCc7CQkJLyogaWYgbm90IHNldCBieSBzc2NhbmYsIHdpbGwgYmUgJywnICovCisgICAgICBpZiAoc3NjYW5mKGFyZywgIiVkJWMiLCAmdmFsLCAmY2gpIDwgMSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoY2ggIT0gJywnKQkJLyogc3ludGF4IGNoZWNrICovCisJcmV0dXJuIEZBTFNFOworICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID49IE5VTV9RVUFOVF9UQkxTKSB7CisJZnByaW50ZihzdGRlcnIsICJKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLiVkXG4iLAorCQlOVU1fUVVBTlRfVEJMUy0xKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5xdWFudF90Ymxfbm8gPSB2YWw7CisgICAgICB3aGlsZSAoKmFyZyAmJiAqYXJnKysgIT0gJywnKSAvKiBhZHZhbmNlIHRvIG5leHQgc2VnbWVudCBvZiBhcmcgc3RyaW5nICovCisJOworICAgIH0gZWxzZSB7CisgICAgICAvKiByZWFjaGVkIGVuZCBvZiBwYXJhbWV0ZXIsIHNldCByZW1haW5pbmcgY29tcG9uZW50cyB0byBsYXN0IHRhYmxlICovCisgICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5xdWFudF90Ymxfbm8gPSB2YWw7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisKK0dMT0JBTChib29sZWFuKQorc2V0X3NhbXBsZV9mYWN0b3JzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKQorLyogUHJvY2VzcyBhIHNhbXBsZS1mYWN0b3JzIHBhcmFtZXRlciBzdHJpbmcsIG9mIHRoZSBmb3JtCisgKiAgICAgSHhWWyxIeFYsLi4uXQorICogSWYgdGhlcmUgYXJlIG1vcmUgY29tcG9uZW50cyB0aGFuIHBhcmFtZXRlcnMsICIxeDEiIGlzIGFzc3VtZWQgZm9yIHRoZSByZXN0LgorICovCit7CisgIGludCBjaSwgdmFsMSwgdmFsMjsKKyAgY2hhciBjaDEsIGNoMjsKKworICBmb3IgKGNpID0gMDsgY2kgPCBNQVhfQ09NUE9ORU5UUzsgY2krKykgeworICAgIGlmICgqYXJnKSB7CisgICAgICBjaDIgPSAnLCc7CQkvKiBpZiBub3Qgc2V0IGJ5IHNzY2FuZiwgd2lsbCBiZSAnLCcgKi8KKyAgICAgIGlmIChzc2NhbmYoYXJnLCAiJWQlYyVkJWMiLCAmdmFsMSwgJmNoMSwgJnZhbDIsICZjaDIpIDwgMykKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoKGNoMSAhPSAneCcgJiYgY2gxICE9ICdYJykgfHwgY2gyICE9ICcsJykgLyogc3ludGF4IGNoZWNrICovCisJcmV0dXJuIEZBTFNFOworICAgICAgaWYgKHZhbDEgPD0gMCB8fCB2YWwxID4gNCB8fCB2YWwyIDw9IDAgfHwgdmFsMiA+IDQpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkpQRUcgc2FtcGxpbmcgZmFjdG9ycyBtdXN0IGJlIDEuLjRcbiIpOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLmhfc2FtcF9mYWN0b3IgPSB2YWwxOworICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvciA9IHZhbDI7CisgICAgICB3aGlsZSAoKmFyZyAmJiAqYXJnKysgIT0gJywnKSAvKiBhZHZhbmNlIHRvIG5leHQgc2VnbWVudCBvZiBhcmcgc3RyaW5nICovCisJOworICAgIH0gZWxzZSB7CisgICAgICAvKiByZWFjaGVkIGVuZCBvZiBwYXJhbWV0ZXIsIHNldCByZW1haW5pbmcgY29tcG9uZW50cyB0byAxeDEgc2FtcGxpbmcgKi8KKyAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLmhfc2FtcF9mYWN0b3IgPSAxOworICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvanBlZy9yZHRhcmdhLmMgYi9qcGVnL3JkdGFyZ2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzJjZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy9yZHRhcmdhLmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKiByZHRhcmdhLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBUYXJnYSBmb3JtYXQuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIGlucHV0IGZyb20KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4gIFRoZXkgZnVydGhlciBhc3N1bWUgdGhhdCByZWFkaW5nIGJlZ2lucworICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlOyBzdGFydF9pbnB1dCBtYXkgbmVlZCB3b3JrIGlmIHRoZQorICogdXNlciBpbnRlcmZhY2UgaGFzIGFscmVhZHkgcmVhZCBzb21lIGRhdGEgKGUuZy4sIHRvIGRldGVybWluZSB0aGF0CisgKiB0aGUgZmlsZSBpcyBpbmRlZWQgVGFyZ2EgZm9ybWF0KS4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IExlZSBEYW5pZWwgQ3JvY2tlci4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisKKworLyogTWFjcm9zIHRvIGRlYWwgd2l0aCB1bnNpZ25lZCBjaGFycyBhcyBlZmZpY2llbnRseSBhcyBjb21waWxlciBhbGxvd3MgKi8KKworI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCisjZWxzZSAvKiAhSEFWRV9VTlNJR05FRF9DSEFSICovCisjaWZkZWYgQ0hBUl9JU19VTlNJR05FRAordHlwZWRlZiBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCisjZWxzZQordHlwZWRlZiBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkgJiAweEZGKQorI2VuZGlmCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKworI2RlZmluZQlSZWFkT0soZmlsZSxidWZmZXIsbGVuKQkoSkZSRUFEKGZpbGUsYnVmZmVyLGxlbikgPT0gKChzaXplX3QpIChsZW4pKSkKKworCisvKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBzb3VyY2Ugb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IF90Z2Ffc291cmNlX3N0cnVjdCAqIHRnYV9zb3VyY2VfcHRyOworCit0eXBlZGVmIHN0cnVjdCBfdGdhX3NvdXJjZV9zdHJ1Y3QgeworICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KKworICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogVGFyZ2EgY29sb3JtYXAgKGNvbnZlcnRlZCB0byBteSBmb3JtYXQpICovCisKKyAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZTsJLyogTmVlZGVkIGlmIGZ1bm55IGlucHV0IHJvdyBvcmRlciAqLworICBKRElNRU5TSU9OIGN1cnJlbnRfcm93OwkvKiBDdXJyZW50IGxvZ2ljYWwgcm93IG51bWJlciB0byByZWFkICovCisKKyAgLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGV4dHJhY3QgbmV4dCBUYXJnYSBwaXhlbCBmcm9tIGlucHV0IGZpbGUgKi8KKyAgSk1FVEhPRCh2b2lkLCByZWFkX3BpeGVsLCAodGdhX3NvdXJjZV9wdHIgc2luZm8pKTsKKworICAvKiBSZXN1bHQgb2YgcmVhZF9waXhlbCBpcyBkZWxpdmVyZWQgaGVyZTogKi8KKyAgVV9DSEFSIHRnYV9waXhlbFs0XTsKKworICBpbnQgcGl4ZWxfc2l6ZTsJCS8qIEJ5dGVzIHBlciBUYXJnYSBwaXhlbCAoMSB0byA0KSAqLworCisgIC8qIFN0YXRlIGluZm8gZm9yIHJlYWRpbmcgUkxFLWNvZGVkIHBpeGVsczsgYm90aCBjb3VudHMgbXVzdCBiZSBpbml0IHRvIDAgKi8KKyAgaW50IGJsb2NrX2NvdW50OwkJLyogIyBvZiBwaXhlbHMgcmVtYWluaW5nIGluIFJMRSBibG9jayAqLworICBpbnQgZHVwX3BpeGVsX2NvdW50OwkJLyogIyBvZiB0aW1lcyB0byBkdXBsaWNhdGUgcHJldmlvdXMgcGl4ZWwgKi8KKworICAvKiBUaGlzIHNhdmVzIHRoZSBjb3JyZWN0IHBpeGVsLXJvdy1leHBhbnNpb24gbWV0aG9kIGZvciBwcmVsb2FkX2ltYWdlICovCisgIEpNRVRIT0QoSkRJTUVOU0lPTiwgZ2V0X3BpeGVsX3Jvd3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOworfSB0Z2Ffc291cmNlX3N0cnVjdDsKKworCisvKiBGb3IgZXhwYW5kaW5nIDUtYml0IHBpeGVsIHZhbHVlcyB0byA4LWJpdCB3aXRoIGJlc3Qgcm91bmRpbmcgKi8KKworc3RhdGljIGNvbnN0IFVJTlQ4IGM1dG84Yml0c1szMl0gPSB7CisgICAgMCwgICA4LCAgMTYsICAyNSwgIDMzLCAgNDEsICA0OSwgIDU4LAorICAgNjYsICA3NCwgIDgyLCAgOTAsICA5OSwgMTA3LCAxMTUsIDEyMywKKyAgMTMyLCAxNDAsIDE0OCwgMTU2LCAxNjUsIDE3MywgMTgxLCAxODksCisgIDE5NywgMjA2LCAyMTQsIDIyMiwgMjMwLCAyMzksIDI0NywgMjU1Cit9OworCisKKworTE9DQUwoaW50KQorcmVhZF9ieXRlICh0Z2Ffc291cmNlX3B0ciBzaW5mbykKKy8qIFJlYWQgbmV4dCBieXRlIGZyb20gVGFyZ2EgZmlsZSAqLworeworICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7CisgIHJlZ2lzdGVyIGludCBjOworCisgIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQorICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIHJldHVybiBjOworfQorCisKK0xPQ0FMKHZvaWQpCityZWFkX2NvbG9ybWFwICh0Z2Ffc291cmNlX3B0ciBzaW5mbywgaW50IGNtYXBsZW4sIGludCBtYXBlbnRyeXNpemUpCisvKiBSZWFkIHRoZSBjb2xvcm1hcCBmcm9tIGEgVGFyZ2EgZmlsZSAqLworeworICBpbnQgaTsKKworICAvKiBQcmVzZW50bHkgb25seSBoYW5kbGVzIDI0LWJpdCBCR1IgZm9ybWF0ICovCisgIGlmIChtYXBlbnRyeXNpemUgIT0gMjQpCisgICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfVEdBX0JBRENNQVApOworCisgIGZvciAoaSA9IDA7IGkgPCBjbWFwbGVuOyBpKyspIHsKKyAgICBzaW5mby0+Y29sb3JtYXBbMl1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICBzaW5mby0+Y29sb3JtYXBbMV1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICBzaW5mby0+Y29sb3JtYXBbMF1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgfQorfQorCisKKy8qCisgKiByZWFkX3BpeGVsIG1ldGhvZHM6IGdldCBhIHNpbmdsZSBwaXhlbCBmcm9tIFRhcmdhIGZpbGUgaW50byB0Z2FfcGl4ZWxbXQorICovCisKK01FVEhPRERFRih2b2lkKQorcmVhZF9ub25fcmxlX3BpeGVsICh0Z2Ffc291cmNlX3B0ciBzaW5mbykKKy8qIFJlYWQgb25lIFRhcmdhIHBpeGVsIGZyb20gdGhlIGlucHV0IGZpbGU7IG5vIFJMRSBleHBhbnNpb24gKi8KK3sKKyAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc2luZm8tPnB1Yi5pbnB1dF9maWxlOworICByZWdpc3RlciBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2luZm8tPnBpeGVsX3NpemU7IGkrKykgeworICAgIHNpbmZvLT50Z2FfcGl4ZWxbaV0gPSAoVV9DSEFSKSBnZXRjKGluZmlsZSk7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfcmxlX3BpeGVsICh0Z2Ffc291cmNlX3B0ciBzaW5mbykKKy8qIFJlYWQgb25lIFRhcmdhIHBpeGVsIGZyb20gdGhlIGlucHV0IGZpbGUsIGV4cGFuZGluZyBSTEUgZGF0YSBhcyBuZWVkZWQgKi8KK3sKKyAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc2luZm8tPnB1Yi5pbnB1dF9maWxlOworICByZWdpc3RlciBpbnQgaTsKKworICAvKiBEdXBsaWNhdGUgcHJldmlvdXNseSByZWFkIHBpeGVsPyAqLworICBpZiAoc2luZm8tPmR1cF9waXhlbF9jb3VudCA+IDApIHsKKyAgICBzaW5mby0+ZHVwX3BpeGVsX2NvdW50LS07CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVGltZSB0byByZWFkIFJMRSBibG9jayBoZWFkZXI/ICovCisgIGlmICgtLXNpbmZvLT5ibG9ja19jb3VudCA8IDApIHsgLyogZGVjcmVtZW50IHBpeGVscyByZW1haW5pbmcgaW4gYmxvY2sgKi8KKyAgICBpID0gcmVhZF9ieXRlKHNpbmZvKTsKKyAgICBpZiAoaSAmIDB4ODApIHsJCS8qIFN0YXJ0IG9mIGR1cGxpY2F0ZS1waXhlbCBibG9jaz8gKi8KKyAgICAgIHNpbmZvLT5kdXBfcGl4ZWxfY291bnQgPSBpICYgMHg3RjsgLyogbnVtYmVyIG9mIGR1cHMgYWZ0ZXIgdGhpcyBvbmUgKi8KKyAgICAgIHNpbmZvLT5ibG9ja19jb3VudCA9IDA7CS8qIHRoZW4gcmVhZCBuZXcgYmxvY2sgaGVhZGVyICovCisgICAgfSBlbHNlIHsKKyAgICAgIHNpbmZvLT5ibG9ja19jb3VudCA9IGkgJiAweDdGOyAvKiBudW1iZXIgb2YgcGl4ZWxzIGFmdGVyIHRoaXMgb25lICovCisgICAgfQorICB9CisKKyAgLyogUmVhZCBuZXh0IHBpeGVsICovCisgIGZvciAoaSA9IDA7IGkgPCBzaW5mby0+cGl4ZWxfc2l6ZTsgaSsrKSB7CisgICAgc2luZm8tPnRnYV9waXhlbFtpXSA9IChVX0NIQVIpIGdldGMoaW5maWxlKTsKKyAgfQorfQorCisKKy8qCisgKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgorICoKKyAqIFdlIHByb3ZpZGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVyc2lvbnMgZGVwZW5kaW5nIG9uIGlucHV0IGZpbGUgZm9ybWF0LgorICovCisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfOGJpdF9ncmF5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgOC1iaXQgZ3JheXNjYWxlIHBpeGVscyAqLworeworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICAKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAoKnNvdXJjZS0+cmVhZF9waXhlbCkgKHNvdXJjZSk7IC8qIExvYWQgbmV4dCBwaXhlbCBpbnRvIHRnYV9waXhlbCAqLworICAgICpwdHIrKyA9IChKU0FNUExFKSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMF0pOworICB9CisgIHJldHVybiAxOworfQorCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF84Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgOC1iaXQgY29sb3JtYXAgaW5kZXhlcyAqLworeworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBpbnQgdDsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgcmVnaXN0ZXIgSlNBTVBBUlJBWSBjb2xvcm1hcCA9IHNvdXJjZS0+Y29sb3JtYXA7CisKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAoKnNvdXJjZS0+cmVhZF9waXhlbCkgKHNvdXJjZSk7IC8qIExvYWQgbmV4dCBwaXhlbCBpbnRvIHRnYV9waXhlbCAqLworICAgIHQgPSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMF0pOworICAgICpwdHIrKyA9IGNvbG9ybWFwWzBdW3RdOworICAgICpwdHIrKyA9IGNvbG9ybWFwWzFdW3RdOworICAgICpwdHIrKyA9IGNvbG9ybWFwWzJdW3RdOworICB9CisgIHJldHVybiAxOworfQorCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF8xNmJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDE2LWJpdCBwaXhlbHMgKi8KK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgaW50IHQ7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIAorICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICgqc291cmNlLT5yZWFkX3BpeGVsKSAoc291cmNlKTsgLyogTG9hZCBuZXh0IHBpeGVsIGludG8gdGdhX3BpeGVsICovCisgICAgdCA9IFVDSChzb3VyY2UtPnRnYV9waXhlbFswXSk7CisgICAgdCArPSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMV0pIDw8IDg7CisgICAgLyogV2UgZXhwYW5kIDUgYml0IGRhdGEgdG8gOCBiaXQgc2FtcGxlIHdpZHRoLgorICAgICAqIFRoZSBmb3JtYXQgb2YgdGhlIDE2LWJpdCAoTFNCIGZpcnN0KSBpbnB1dCB3b3JkIGlzCisgICAgICogICAgIHhSUlJSUkdHR0dHQkJCQkIKKyAgICAgKi8KKyAgICBwdHJbMl0gPSAoSlNBTVBMRSkgYzV0bzhiaXRzW3QgJiAweDFGXTsKKyAgICB0ID4+PSA1OworICAgIHB0clsxXSA9IChKU0FNUExFKSBjNXRvOGJpdHNbdCAmIDB4MUZdOworICAgIHQgPj49IDU7CisgICAgcHRyWzBdID0gKEpTQU1QTEUpIGM1dG84Yml0c1t0ICYgMHgxRl07CisgICAgcHRyICs9IDM7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0XzI0Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgMjQtYml0IHBpeGVscyAqLworeworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICAKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAoKnNvdXJjZS0+cmVhZF9waXhlbCkgKHNvdXJjZSk7IC8qIExvYWQgbmV4dCBwaXhlbCBpbnRvIHRnYV9waXhlbCAqLworICAgICpwdHIrKyA9IChKU0FNUExFKSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMl0pOyAvKiBjaGFuZ2UgQkdSIHRvIFJHQiBvcmRlciAqLworICAgICpwdHIrKyA9IChKU0FNUExFKSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMV0pOworICAgICpwdHIrKyA9IChKU0FNUExFKSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMF0pOworICB9CisgIHJldHVybiAxOworfQorCisvKgorICogVGFyZ2EgYWxzbyBkZWZpbmVzIGEgMzItYml0IHBpeGVsIGZvcm1hdCB3aXRoIG9yZGVyIEIsRyxSLEEuCisgKiBXZSBwcmVzZW50bHkgaWdub3JlIHRoZSBhdHRyaWJ1dGUgYnl0ZSwgc28gdGhlIGNvZGUgZm9yIHJlYWRpbmcKKyAqIHRoZXNlIHBpeGVscyBpcyBpZGVudGljYWwgdG8gdGhlIDI0LWJpdCByb3V0aW5lIGFib3ZlLgorICogVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBhY3R1YWwgcGl4ZWwgbGVuZ3RoIGlzIG9ubHkga25vd24gdG8gcmVhZF9waXhlbC4KKyAqLworCisjZGVmaW5lIGdldF8zMmJpdF9yb3cgIGdldF8yNGJpdF9yb3cKKworCisvKgorICogVGhpcyBtZXRob2QgaXMgZm9yIHJlLXJlYWRpbmcgdGhlIGlucHV0IGRhdGEgaW4gc3RhbmRhcmQgdG9wLWRvd24KKyAqIHJvdyBvcmRlci4gIFRoZSBlbnRpcmUgaW1hZ2UgaGFzIGFscmVhZHkgYmVlbiByZWFkIGludG8gd2hvbGVfaW1hZ2UKKyAqIHdpdGggcHJvcGVyIGNvbnZlcnNpb24gb2YgcGl4ZWwgZm9ybWF0LCBidXQgaXQncyBpbiBhIGZ1bm55IHJvdyBvcmRlci4KKyAqLworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF9tZW1vcnlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgSkRJTUVOU0lPTiBzb3VyY2Vfcm93OworCisgIC8qIENvbXB1dGUgcm93IG9mIHNvdXJjZSB0aGF0IG1hcHMgdG8gY3VycmVudF9yb3cgb2Ygbm9ybWFsIG9yZGVyICovCisgIC8qIEZvciBub3csIGFzc3VtZSBpbWFnZSBpcyBib3R0b20tdXAgYW5kIG5vdCBpbnRlcmxhY2VkLiAqLworICAvKiBORUVEUyBXT1JLIHRvIHN1cHBvcnQgaW50ZXJsYWNlZCBpbWFnZXMhICovCisgIHNvdXJjZV9yb3cgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0IC0gc291cmNlLT5jdXJyZW50X3JvdyAtIDE7CisKKyAgLyogRmV0Y2ggdGhhdCByb3cgZnJvbSB2aXJ0dWFsIGFycmF5ICovCisgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKKyAgICAgc291cmNlX3JvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKworICBzb3VyY2UtPmN1cnJlbnRfcm93Kys7CisgIHJldHVybiAxOworfQorCisKKy8qCisgKiBUaGlzIG1ldGhvZCBsb2FkcyB0aGUgaW1hZ2UgaW50byB3aG9sZV9pbWFnZSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgb24KKyAqIGdldF9waXhlbF9yb3dzLiAgVGhlIGdldF9waXhlbF9yb3dzIHBvaW50ZXIgaXMgdGhlbiBhZGp1c3RlZCB0byBjYWxsCisgKiBnZXRfbWVtb3J5X3JvdyBvbiBzdWJzZXF1ZW50IGNhbGxzLgorICovCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorcHJlbG9hZF9pbWFnZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87CisgIEpESU1FTlNJT04gcm93OworICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisKKyAgLyogUmVhZCB0aGUgZGF0YSBpbnRvIGEgdmlydHVhbCBhcnJheSBpbiBpbnB1dC1maWxlIHJvdyBvcmRlci4gKi8KKyAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgeworICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IChsb25nKSByb3c7CisgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgIH0KKyAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwgcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgICAgKCpzb3VyY2UtPmdldF9waXhlbF9yb3dzKSAoY2luZm8sIHNpbmZvKTsKKyAgfQorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOworCisgIC8qIFNldCB1cCB0byByZWFkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXkgaW4gdW5zY3JhbWJsZWQgb3JkZXIgKi8KKyAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfbWVtb3J5X3JvdzsKKyAgc291cmNlLT5jdXJyZW50X3JvdyA9IDA7CisgIC8qIEFuZCByZWFkIHRoZSBmaXJzdCByb3cgKi8KKyAgcmV0dXJuIGdldF9tZW1vcnlfcm93KGNpbmZvLCBzaW5mbyk7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfaW5wdXRfdGdhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgVV9DSEFSIHRhcmdhaGVhZGVyWzE4XTsKKyAgaW50IGlkbGVuLCBjbWFwdHlwZSwgc3VidHlwZSwgZmxhZ3MsIGludGVybGFjZV90eXBlLCBjb21wb25lbnRzOworICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodCwgbWFwbGVuOworICBib29sZWFuIGlzX2JvdHRvbV91cDsKKworI2RlZmluZSBHRVRfMkIob2Zmc2V0KQkoKHVuc2lnbmVkIGludCkgVUNIKHRhcmdhaGVhZGVyW29mZnNldF0pICsgXAorCQkJICgoKHVuc2lnbmVkIGludCkgVUNIKHRhcmdhaGVhZGVyW29mZnNldCsxXSkpIDw8IDgpKQorCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCB0YXJnYWhlYWRlciwgMTgpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKworICAvKiBQcmV0ZW5kICIxNS1iaXQiIHBpeGVscyBhcmUgMTYtYml0IC0tLSB3ZSBpZ25vcmUgYXR0cmlidXRlIGJpdCBhbnl3YXkgKi8KKyAgaWYgKHRhcmdhaGVhZGVyWzE2XSA9PSAxNSkKKyAgICB0YXJnYWhlYWRlclsxNl0gPSAxNjsKKworICBpZGxlbiA9IFVDSCh0YXJnYWhlYWRlclswXSk7CisgIGNtYXB0eXBlID0gVUNIKHRhcmdhaGVhZGVyWzFdKTsKKyAgc3VidHlwZSA9IFVDSCh0YXJnYWhlYWRlclsyXSk7CisgIG1hcGxlbiA9IEdFVF8yQig1KTsKKyAgd2lkdGggPSBHRVRfMkIoMTIpOworICBoZWlnaHQgPSBHRVRfMkIoMTQpOworICBzb3VyY2UtPnBpeGVsX3NpemUgPSBVQ0godGFyZ2FoZWFkZXJbMTZdKSA+PiAzOworICBmbGFncyA9IFVDSCh0YXJnYWhlYWRlclsxN10pOwkvKiBJbWFnZSBEZXNjcmlwdG9yIGJ5dGUgKi8KKworICBpc19ib3R0b21fdXAgPSAoKGZsYWdzICYgMHgyMCkgPT0gMCk7CS8qIGJpdCA1IHNldCA9PiB0b3AtZG93biAqLworICBpbnRlcmxhY2VfdHlwZSA9IGZsYWdzID4+IDY7CS8qIGJpdHMgNi83IGFyZSBpbnRlcmxhY2UgY29kZSAqLworCisgIGlmIChjbWFwdHlwZSA+IDEgfHwJCS8qIGNtYXB0eXBlIG11c3QgYmUgMCBvciAxICovCisgICAgICBzb3VyY2UtPnBpeGVsX3NpemUgPCAxIHx8IHNvdXJjZS0+cGl4ZWxfc2l6ZSA+IDQgfHwKKyAgICAgIChVQ0godGFyZ2FoZWFkZXJbMTZdKSAmIDcpICE9IDAgfHwgLyogYml0cy9waXhlbCBtdXN0IGJlIG11bHRpcGxlIG9mIDggKi8KKyAgICAgIGludGVybGFjZV90eXBlICE9IDApCS8qIGN1cnJlbnRseSBkb24ndCBhbGxvdyBpbnRlcmxhY2VkIGltYWdlICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOworICAKKyAgaWYgKHN1YnR5cGUgPiA4KSB7CisgICAgLyogSXQncyBhbiBSTEUtY29kZWQgZmlsZSAqLworICAgIHNvdXJjZS0+cmVhZF9waXhlbCA9IHJlYWRfcmxlX3BpeGVsOworICAgIHNvdXJjZS0+YmxvY2tfY291bnQgPSBzb3VyY2UtPmR1cF9waXhlbF9jb3VudCA9IDA7CisgICAgc3VidHlwZSAtPSA4OworICB9IGVsc2UgeworICAgIC8qIE5vbi1STEUgZmlsZSAqLworICAgIHNvdXJjZS0+cmVhZF9waXhlbCA9IHJlYWRfbm9uX3JsZV9waXhlbDsKKyAgfQorCisgIC8qIE5vdyBzaG91bGQgaGF2ZSBzdWJ0eXBlIDEsIDIsIG9yIDMgKi8KKyAgY29tcG9uZW50cyA9IDM7CQkvKiB1bnRpbCBwcm92ZW4gZGlmZmVyZW50ICovCisgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisKKyAgc3dpdGNoIChzdWJ0eXBlKSB7CisgIGNhc2UgMToJCQkvKiBDb2xvcm1hcHBlZCBpbWFnZSAqLworICAgIGlmIChzb3VyY2UtPnBpeGVsX3NpemUgPT0gMSAmJiBjbWFwdHlwZSA9PSAxKQorICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF84Yml0X3JvdzsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfVEdBX01BUFBFRCwgd2lkdGgsIGhlaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgMjoJCQkvKiBSR0IgaW1hZ2UgKi8KKyAgICBzd2l0Y2ggKHNvdXJjZS0+cGl4ZWxfc2l6ZSkgeworICAgIGNhc2UgMjoKKyAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfMTZiaXRfcm93OworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF8yNGJpdF9yb3c7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzMyYml0X3JvdzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfVEdBLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSAzOgkJCS8qIEdyYXlzY2FsZSBpbWFnZSAqLworICAgIGNvbXBvbmVudHMgPSAxOworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisgICAgaWYgKHNvdXJjZS0+cGl4ZWxfc2l6ZSA9PSAxKQorICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF84Yml0X2dyYXlfcm93OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19UR0FfR1JBWSwgd2lkdGgsIGhlaWdodCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKGlzX2JvdHRvbV91cCkgeworICAgIC8qIENyZWF0ZSBhIHZpcnR1YWwgYXJyYXkgdG8gYnVmZmVyIHRoZSB1cHNpZGUtZG93biBpbWFnZS4gKi8KKyAgICBzb3VyY2UtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisgICAgICAgKEpESU1FTlNJT04pIHdpZHRoICogY29tcG9uZW50cywgKEpESU1FTlNJT04pIGhlaWdodCwgKEpESU1FTlNJT04pIDEpOworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworICAgICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOyAvKiBjb3VudCBmaWxlIGlucHV0IGFzIHNlcGFyYXRlIHBhc3MgKi8KKyAgICB9CisgICAgLyogc291cmNlLT5wdWIuYnVmZmVyIHdpbGwgcG9pbnQgdG8gdGhlIHZpcnR1YWwgYXJyYXkuICovCisgICAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7IC8qIGluIGNhc2UgYW55b25lIGxvb2tzIGF0IGl0ICovCisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBwcmVsb2FkX2ltYWdlOworICB9IGVsc2UgeworICAgIC8qIERvbid0IG5lZWQgYSB2aXJ0dWFsIGFycmF5LCBidXQgZG8gbmVlZCBhIG9uZS1yb3cgaW5wdXQgYnVmZmVyLiAqLworICAgIHNvdXJjZS0+d2hvbGVfaW1hZ2UgPSBOVUxMOworICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAoSkRJTUVOU0lPTikgd2lkdGggKiBjb21wb25lbnRzLCAoSkRJTUVOU0lPTikgMSk7CisgICAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBzb3VyY2UtPmdldF9waXhlbF9yb3dzOworICB9CisgIAorICB3aGlsZSAoaWRsZW4tLSkJCS8qIFRocm93IGF3YXkgSUQgZmllbGQgKi8KKyAgICAodm9pZCkgcmVhZF9ieXRlKHNvdXJjZSk7CisKKyAgaWYgKG1hcGxlbiA+IDApIHsKKyAgICBpZiAobWFwbGVuID4gMjU2IHx8IEdFVF8yQigzKSAhPSAwKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEQ01BUCk7CisgICAgLyogQWxsb2NhdGUgc3BhY2UgdG8gc3RvcmUgdGhlIGNvbG9ybWFwICovCisgICAgc291cmNlLT5jb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgKEpESU1FTlNJT04pIG1hcGxlbiwgKEpESU1FTlNJT04pIDMpOworICAgIC8qIGFuZCByZWFkIGl0IGZyb20gdGhlIGZpbGUgKi8KKyAgICByZWFkX2NvbG9ybWFwKHNvdXJjZSwgKGludCkgbWFwbGVuLCBVQ0godGFyZ2FoZWFkZXJbN10pKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY21hcHR5cGUpCQkvKiBidXQgeW91IHByb21pc2VkIGEgY21hcCEgKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKKyAgICBzb3VyY2UtPmNvbG9ybWFwID0gTlVMTDsKKyAgfQorCisgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gY29tcG9uZW50czsKKyAgY2luZm8tPmRhdGFfcHJlY2lzaW9uID0gODsKKyAgY2luZm8tPmltYWdlX3dpZHRoID0gd2lkdGg7CisgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX2lucHV0X3RnYSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgVGFyZ2EgZm9ybWF0IGlucHV0LgorICovCisKK0dMT0JBTChjanBlZ19zb3VyY2VfcHRyKQoramluaXRfcmVhZF90YXJnYSAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZTsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KKyAgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRih0Z2Ffc291cmNlX3N0cnVjdCkpOworICBzb3VyY2UtPmNpbmZvID0gY2luZm87CS8qIG1ha2UgYmFjayBsaW5rIGZvciBzdWJyb3V0aW5lcyAqLworICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzLCBleGNlcHQgZ2V0X3BpeGVsX3Jvd3Mgd2hpY2ggc3RhcnRfaW5wdXQgc2V0cyAqLworICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X3RnYTsKKyAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X3RnYTsKKworICByZXR1cm4gKGNqcGVnX3NvdXJjZV9wdHIpIHNvdXJjZTsKK30KKworI2VuZGlmIC8qIFRBUkdBX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy9zdHJ1Y3R1cmUuZG9jIGIvanBlZy9zdHJ1Y3R1cmUuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzlkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3N0cnVjdHVyZS5kb2MKQEAgLTAsMCArMSw5NDggQEAKK0lKRyBKUEVHIExJQlJBUlk6ICBTWVNURU0gQVJDSElURUNUVVJFCisKK0NvcHlyaWdodCAoQykgMTk5MS0xOTk1LCBUaG9tYXMgRy4gTGFuZS4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCitGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisKKworVGhpcyBmaWxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIElKRyBKUEVHIHNvZnR3YXJlOwordGhhdCBpcywgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgdmFyaW91cyBtb2R1bGVzIGluIHRoZSBzeXN0ZW0gYW5kIHRoZSBpbnRlcmZhY2VzCitiZXR3ZWVuIG1vZHVsZXMuICBGb3IgbW9yZSBwcmVjaXNlIGRldGFpbHMgYWJvdXQgYW55IGRhdGEgc3RydWN0dXJlIG9yIGNhbGxpbmcKK2NvbnZlbnRpb24sIHNlZSB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgY29tbWVudHMgaW4gdGhlIHNvdXJjZSBjb2RlLgorCitXZSBhc3N1bWUgdGhhdCB0aGUgcmVhZGVyIGlzIGFscmVhZHkgc29tZXdoYXQgZmFtaWxpYXIgd2l0aCB0aGUgSlBFRyBzdGFuZGFyZC4KK1RoZSBSRUFETUUgZmlsZSBpbmNsdWRlcyByZWZlcmVuY2VzIGZvciBsZWFybmluZyBhYm91dCBKUEVHLiAgVGhlIGZpbGUKK2xpYmpwZWcuZG9jIGRlc2NyaWJlcyB0aGUgbGlicmFyeSBmcm9tIHRoZSB2aWV3cG9pbnQgb2YgYW4gYXBwbGljYXRpb24KK3Byb2dyYW1tZXIgdXNpbmcgdGhlIGxpYnJhcnk7IGl0J3MgYmVzdCB0byByZWFkIHRoYXQgZmlsZSBiZWZvcmUgdGhpcyBvbmUuCitBbHNvLCB0aGUgZmlsZSBjb2RlcnVsZXMuZG9jIGRlc2NyaWJlcyB0aGUgY29kaW5nIHN0eWxlIGNvbnZlbnRpb25zIHdlIHVzZS4KKworSW4gdGhpcyBkb2N1bWVudCwgSlBFRy1zcGVjaWZpYyB0ZXJtaW5vbG9neSBmb2xsb3dzIHRoZSBKUEVHIHN0YW5kYXJkOgorICBBICJjb21wb25lbnQiIG1lYW5zIGEgY29sb3IgY2hhbm5lbCwgZS5nLiwgUmVkIG9yIEx1bWluYW5jZS4KKyAgQSAic2FtcGxlIiBpcyBhIHNpbmdsZSBjb21wb25lbnQgdmFsdWUgKGkuZS4sIG9uZSBudW1iZXIgaW4gdGhlIGltYWdlIGRhdGEpLgorICBBICJjb2VmZmljaWVudCIgaXMgYSBmcmVxdWVuY3kgY29lZmZpY2llbnQgKGEgRENUIHRyYW5zZm9ybSBvdXRwdXQgbnVtYmVyKS4KKyAgQSAiYmxvY2siIGlzIGFuIDh4OCBncm91cCBvZiBzYW1wbGVzIG9yIGNvZWZmaWNpZW50cy4KKyAgQW4gIk1DVSIgKG1pbmltdW0gY29kZWQgdW5pdCkgaXMgYW4gaW50ZXJsZWF2ZWQgc2V0IG9mIGJsb2NrcyBvZiBzaXplCisJZGV0ZXJtaW5lZCBieSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgb3IgYSBzaW5nbGUgYmxvY2sgaW4gYQorCW5vbmludGVybGVhdmVkIHNjYW4uCitXZSBkbyBub3QgdXNlIHRoZSB0ZXJtcyAicGl4ZWwiIGFuZCAic2FtcGxlIiBpbnRlcmNoYW5nZWFibHkuICBXaGVuIHdlIHNheQorcGl4ZWwsIHdlIG1lYW4gYW4gZWxlbWVudCBvZiB0aGUgZnVsbC1zaXplIGltYWdlLCB3aGlsZSBhIHNhbXBsZSBpcyBhbiBlbGVtZW50CitvZiB0aGUgZG93bnNhbXBsZWQgaW1hZ2UuICBUaHVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBtYXkgdmFyeSBhY3Jvc3MKK2NvbXBvbmVudHMgd2hpbGUgdGhlIG51bWJlciBvZiBwaXhlbHMgZG9lcyBub3QuICAoVGhpcyB0ZXJtaW5vbG9neSBpcyBub3QgdXNlZAorcmlnb3JvdXNseSB0aHJvdWdob3V0IHRoZSBjb2RlLCBidXQgaXQgaXMgdXNlZCBpbiBwbGFjZXMgd2hlcmUgY29uZnVzaW9uIHdvdWxkCitvdGhlcndpc2UgcmVzdWx0LikKKworCisqKiogU3lzdGVtIGZlYXR1cmVzICoqKgorCitUaGUgSUpHIGRpc3RyaWJ1dGlvbiBjb250YWlucyB0d28gcGFydHM6CisgICogQSBzdWJyb3V0aW5lIGxpYnJhcnkgZm9yIEpQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCisgICogY2pwZWcvZGpwZWcsIHR3byBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSBsaWJyYXJ5IHRvIHRyYW5zZm9ybQorICAgIEpGSUYgSlBFRyBmaWxlcyB0byBhbmQgZnJvbSBzZXZlcmFsIG90aGVyIGltYWdlIGZvcm1hdHMuCitjanBlZy9kanBlZyBhcmUgb2Ygbm8gZ3JlYXQgaW50ZWxsZWN0dWFsIGNvbXBsZXhpdHk6IHRoZXkgbWVyZWx5IGFkZCBhIHNpbXBsZQorY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGFuZCBJL08gcm91dGluZXMgZm9yIHNldmVyYWwgdW5jb21wcmVzc2VkIGltYWdlCitmb3JtYXRzLiAgVGhpcyBkb2N1bWVudCBjb25jZW50cmF0ZXMgb24gdGhlIGxpYnJhcnkgaXRzZWxmLgorCitXZSBkZXNpcmUgdGhlIGxpYnJhcnkgdG8gYmUgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIGFsbCBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZAorc2VxdWVudGlhbCwgYW5kIHByb2dyZXNzaXZlIERDVCBwcm9jZXNzZXMuICBIaWVyYXJjaGljYWwgcHJvY2Vzc2VzIGFyZSBub3QKK3N1cHBvcnRlZC4KKworVGhlIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbG9zc2xlc3MgKHNwYXRpYWwpIEpQRUcgcHJvY2Vzcy4gIExvc3NsZXNzCitKUEVHIHNoYXJlcyBsaXR0bGUgb3Igbm8gY29kZSB3aXRoIGxvc3N5IEpQRUcsIGFuZCB3b3VsZCBub3JtYWxseSBiZSB1c2VkCit3aXRob3V0IHRoZSBleHRlbnNpdmUgcHJlLSBhbmQgcG9zdC1wcm9jZXNzaW5nIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeS4KK1dlIGZlZWwgdGhhdCBsb3NzbGVzcyBKUEVHIGlzIGJldHRlciBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgbGlicmFyeS4KKworV2l0aGluIHRoZXNlIGxpbWl0cywgYW55IHNldCBvZiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFsbG93ZWQgYnkgdGhlIEpQRUcKK3NwZWMgc2hvdWxkIGJlIHJlYWRhYmxlIGZvciBkZWNvbXByZXNzaW9uLiAgKFdlIGNhbiBiZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0Cit3aGF0IGZvcm1hdHMgd2UgY2FuIGdlbmVyYXRlLikgIEFsdGhvdWdoIHRoZSBzeXN0ZW0gZGVzaWduIGFsbG93cyBmb3IgYWxsCitwYXJhbWV0ZXIgdmFsdWVzLCBzb21lIHVuY29tbW9uIHNldHRpbmdzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkIGFuZCBtYXkKK25ldmVyIGJlOyBub25pbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MgYXJlIHRoZSBwcmltZSBleGFtcGxlLiAgRnVydGhlcm1vcmUsCit3ZSB0cmVhdCA4LWJpdCB2cy4gMTItYml0IGRhdGEgcHJlY2lzaW9uIGFzIGEgY29tcGlsZS10aW1lIHN3aXRjaCwgbm90IGEKK3J1bi10aW1lIG9wdGlvbiwgYmVjYXVzZSBtb3N0IG1hY2hpbmVzIGNhbiBzdG9yZSA4LWJpdCBwaXhlbHMgbXVjaCBtb3JlCitjb21wYWN0bHkgdGhhbiAxMi1iaXQuCisKK0ZvciBsZWdhbCByZWFzb25zLCBKUEVHIGFyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLCBidXQKK2V4dGVuZGluZyB0aGUgbGlicmFyeSB0byBpbmNsdWRlIGl0IHdvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZC4KKworQnkgaXRzZWxmLCB0aGUgbGlicmFyeSBoYW5kbGVzIG9ubHkgaW50ZXJjaGFuZ2UgSlBFRyBkYXRhc3RyZWFtcyAtLS0gaW4KK3BhcnRpY3VsYXIgdGhlIHdpZGVseSB1c2VkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGUgbGlicmFyeSBjYW4gYmUgdXNlZCBieQorc3Vycm91bmRpbmcgY29kZSB0byBwcm9jZXNzIGludGVyY2hhbmdlIG9yIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMgdGhhdAorYXJlIGVtYmVkZGVkIGluIG1vcmUgY29tcGxleCBmaWxlIGZvcm1hdHMuICAoRm9yIGV4YW1wbGUsIGxpYnRpZmYgdXNlcyB0aGlzCitsaWJyYXJ5IHRvIGltcGxlbWVudCBKUEVHIGNvbXByZXNzaW9uIHdpdGhpbiB0aGUgVElGRiBmaWxlIGZvcm1hdC4pCisKK1RoZSBsaWJyYXJ5IGluY2x1ZGVzIGEgc3Vic3RhbnRpYWwgYW1vdW50IG9mIGNvZGUgdGhhdCBpcyBub3QgY292ZXJlZCBieSB0aGUKK0pQRUcgc3RhbmRhcmQgYnV0IGlzIG5lY2Vzc2FyeSBmb3IgdHlwaWNhbCBhcHBsaWNhdGlvbnMgb2YgSlBFRy4gIFRoZXNlCitmdW5jdGlvbnMgcHJlcHJvY2VzcyB0aGUgaW1hZ2UgYmVmb3JlIEpQRUcgY29tcHJlc3Npb24gb3IgcG9zdHByb2Nlc3MgaXQgYWZ0ZXIKK2RlY29tcHJlc3Npb24uICBUaGV5IGluY2x1ZGUgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBkb3duc2FtcGxpbmcvdXBzYW1wbGluZywKK2FuZCBjb2xvciBxdWFudGl6YXRpb24uICBUaGlzIGNvZGUgY2FuIGJlIG9taXR0ZWQgaWYgbm90IG5lZWRlZC4KKworQSB3aWRlIHJhbmdlIG9mIHF1YWxpdHkgdnMuIHNwZWVkIHRyYWRlb2ZmcyBhcmUgcG9zc2libGUgaW4gSlBFRyBwcm9jZXNzaW5nLAorYW5kIGV2ZW4gbW9yZSBzbyBpbiBkZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nLiAgVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeQorcHJvdmlkZXMgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIHRoYXQgY292ZXIgbW9zdCBvZiB0aGUgdXNlZnVsIHRyYWRlb2ZmcywKK3JhbmdpbmcgZnJvbSB2ZXJ5LWhpZ2gtcXVhbGl0eSBkb3duIHRvIGZhc3QtcHJldmlldyBvcGVyYXRpb24uICBPbiB0aGUKK2NvbXByZXNzaW9uIHNpZGUgd2UgaGF2ZSBnZW5lcmFsbHkgbm90IHByb3ZpZGVkIGxvdy1xdWFsaXR5IGNob2ljZXMsIHNpbmNlCitjb21wcmVzc2lvbiBpcyBub3JtYWxseSBsZXNzIHRpbWUtY3JpdGljYWwuICBJdCBzaG91bGQgYmUgdW5kZXJzdG9vZCB0aGF0IHRoZQorbG93LXF1YWxpdHkgbW9kZXMgbWF5IG5vdCBtZWV0IHRoZSBKUEVHIHN0YW5kYXJkJ3MgYWNjdXJhY3kgcmVxdWlyZW1lbnRzOworbm9uZXRoZWxlc3MsIHRoZXkgYXJlIHVzZWZ1bCBmb3Igdmlld2Vycy4KKworCisqKiogUG9ydGFiaWxpdHkgaXNzdWVzICoqKgorCitQb3J0YWJpbGl0eSBpcyBhbiBlc3NlbnRpYWwgcmVxdWlyZW1lbnQgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlIGtleSBwb3J0YWJpbGl0eQoraXNzdWVzIHRoYXQgc2hvdyB1cCBhdCB0aGUgbGV2ZWwgb2Ygc3lzdGVtIGFyY2hpdGVjdHVyZSBhcmU6CisKKzEuICBNZW1vcnkgdXNhZ2UuICBXZSB3YW50IHRoZSBjb2RlIHRvIGJlIGFibGUgdG8gcnVuIG9uIFBDLWNsYXNzIG1hY2hpbmVzCit3aXRoIGxpbWl0ZWQgbWVtb3J5LiAgSW1hZ2VzIHNob3VsZCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkIHNlcXVlbnRpYWxseSAoaW4KK3N0cmlwcyksIHRvIGF2b2lkIGhvbGRpbmcgdGhlIHdob2xlIGltYWdlIGluIG1lbW9yeSBhdCBvbmNlLiAgV2hlcmUgYQorZnVsbC1pbWFnZSBidWZmZXIgaXMgbmVjZXNzYXJ5LCB3ZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgZWl0aGVyIHZpcnR1YWwgbWVtb3J5CitvciB0ZW1wb3JhcnkgZmlsZXMuCisKKzIuICBOZWFyL2ZhciBwb2ludGVyIGRpc3RpbmN0aW9uLiAgVG8gcnVuIGVmZmljaWVudGx5IG9uIDgweDg2IG1hY2hpbmVzLCB0aGUKK2NvZGUgc2hvdWxkIGRpc3Rpbmd1aXNoICJzbWFsbCIgb2JqZWN0cyAoa2VwdCBpbiBuZWFyIGRhdGEgc3BhY2UpIGZyb20KKyJsYXJnZSIgb25lcyAoa2VwdCBpbiBmYXIgZGF0YSBzcGFjZSkuICBUaGlzIGlzIGFuIGFubm95aW5nIHJlc3RyaWN0aW9uLCBidXQKK2ZvcnR1bmF0ZWx5IGl0IGRvZXMgbm90IGltcGFjdCBjb2RlIHF1YWxpdHkgZm9yIGxlc3MgYnJhaW4tZGFtYWdlZCBtYWNoaW5lcywKK2FuZCB0aGUgc291cmNlIGNvZGUgY2x1dHRlciB0dXJucyBvdXQgdG8gYmUgbWluaW1hbCB3aXRoIHN1ZmZpY2llbnQgdXNlIG9mCitwb2ludGVyIHR5cGVkZWZzLgorCiszLiBEYXRhIHByZWNpc2lvbi4gIFdlIGFzc3VtZSB0aGF0ICJjaGFyIiBpcyBhdCBsZWFzdCA4IGJpdHMsICJzaG9ydCIgYW5kCisiaW50IiBhdCBsZWFzdCAxNiwgImxvbmciIGF0IGxlYXN0IDMyLiAgVGhlIGNvZGUgd2lsbCB3b3JrIGZpbmUgd2l0aCBsYXJnZXIKK2RhdGEgc2l6ZXMsIGFsdGhvdWdoIG1lbW9yeSBtYXkgYmUgdXNlZCBpbmVmZmljaWVudGx5IGluIHNvbWUgY2FzZXMuICBIb3dldmVyLAordGhlIEpQRUcgY29tcHJlc3NlZCBkYXRhc3RyZWFtIG11c3QgdWx0aW1hdGVseSBhcHBlYXIgb24gZXh0ZXJuYWwgc3RvcmFnZSBhcyBhCitzZXF1ZW5jZSBvZiA4LWJpdCBieXRlcyBpZiBpdCBpcyB0byBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZC4gIFRoaXMgbWF5IHBvc2UgYQorcHJvYmxlbSBvbiBtYWNoaW5lcyB3aGVyZSBjaGFyIGlzIHdpZGVyIHRoYW4gOCBiaXRzLiAgVGhlIGxpYnJhcnkgcmVwcmVzZW50cworY29tcHJlc3NlZCBkYXRhIGFzIGFuIGFycmF5IG9mIHZhbHVlcyBvZiB0eXBlZGVmIEpPQ1RFVC4gIElmIG5vIGRhdGEgdHlwZQorZXhhY3RseSA4IGJpdHMgd2lkZSBpcyBhdmFpbGFibGUsIGN1c3RvbSBkYXRhIHNvdXJjZSBhbmQgZGF0YSBkZXN0aW5hdGlvbgorbW9kdWxlcyBtdXN0IGJlIHdyaXR0ZW4gdG8gdW5wYWNrIGFuZCBwYWNrIHRoZSBjaG9zZW4gSk9DVEVUIGRhdGF0eXBlIGludG8KKzgtYml0IGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLgorCisKKyoqKiBTeXN0ZW0gb3ZlcnZpZXcgKioqCisKK1RoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgYXJlIGVhY2ggZGl2aWRlZCBpbnRvIHR3byBtYWluIHNlY3Rpb25zOgordGhlIEpQRUcgY29tcHJlc3NvciBvciBkZWNvbXByZXNzb3IgcHJvcGVyLCBhbmQgdGhlIHByZXByb2Nlc3Npbmcgb3IKK3Bvc3Rwcm9jZXNzaW5nIGZ1bmN0aW9ucy4gIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGVzZSB0d28gc2VjdGlvbnMgaXMgdGhlCitpbWFnZSBkYXRhIHRoYXQgdGhlIG9mZmljaWFsIEpQRUcgc3BlYyByZWdhcmRzIGFzIGl0cyBpbnB1dCBvciBvdXRwdXQ6IHRoaXMKK2RhdGEgaXMgaW4gdGhlIGNvbG9yc3BhY2UgdG8gYmUgdXNlZCBmb3IgY29tcHJlc3Npb24sIGFuZCBpdCBpcyBkb3duc2FtcGxlZAordG8gdGhlIHNhbXBsaW5nIGZhY3RvcnMgdG8gYmUgdXNlZC4gIFRoZSBwcmVwcm9jZXNzaW5nIGFuZCBwb3N0cHJvY2Vzc2luZworc3RlcHMgYXJlIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGEgbm9ybWFsIGltYWdlIHJlcHJlc2VudGF0aW9uIHRvIG9yIGZyb20KK3RoaXMgZm9ybS4gIChUaG9zZSBmZXcgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBkZWFsIHdpdGggWUNiQ3IgZG93bnNhbXBsZWQKK2RhdGEgY2FuIHNraXAgdGhlIHByZXByb2Nlc3Npbmcgb3IgcG9zdHByb2Nlc3Npbmcgc3RlcC4pCisKK0xvb2tpbmcgbW9yZSBjbG9zZWx5LCB0aGUgY29tcHJlc3NvciBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWFpbgorZWxlbWVudHM6CisKKyAgUHJlcHJvY2Vzc2luZzoKKyAgICAqIENvbG9yIHNwYWNlIGNvbnZlcnNpb24gKGUuZy4sIFJHQiB0byBZQ2JDcikuCisgICAgKiBFZGdlIGV4cGFuc2lvbiBhbmQgZG93bnNhbXBsaW5nLiAgT3B0aW9uYWxseSwgdGhpcyBzdGVwIGNhbiBkbyBzaW1wbGUKKyAgICAgIHNtb290aGluZyAtLS0gdGhpcyBpcyBvZnRlbiBoZWxwZnVsIGZvciBsb3ctcXVhbGl0eSBzb3VyY2UgZGF0YS4KKyAgSlBFRyBwcm9wZXI6CisgICAgKiBNQ1UgYXNzZW1ibHksIERDVCwgcXVhbnRpemF0aW9uLgorICAgICogRW50cm9weSBjb2RpbmcgKHNlcXVlbnRpYWwgb3IgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYykuCisKK0luIGFkZGl0aW9uIHRvIHRoZXNlIG1vZHVsZXMgd2UgbmVlZCBvdmVyYWxsIGNvbnRyb2wsIG1hcmtlciBnZW5lcmF0aW9uLAorYW5kIHN1cHBvcnQgY29kZSAobWVtb3J5IG1hbmFnZW1lbnQgJiBlcnJvciBoYW5kbGluZykuICBUaGVyZSBpcyBhbHNvIGEKK21vZHVsZSByZXNwb25zaWJsZSBmb3IgcGh5c2ljYWxseSB3cml0aW5nIHRoZSBvdXRwdXQgZGF0YSAtLS0gdHlwaWNhbGx5Cit0aGlzIGlzIGp1c3QgYW4gaW50ZXJmYWNlIHRvIGZ3cml0ZSgpLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8KK2RvIHNvbWV0aGluZyBlbHNlIHdpdGggdGhlIGRhdGEuCisKK1RoZSBkZWNvbXByZXNzb3IgbGlicmFyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1haW4gZWxlbWVudHM6CisKKyAgSlBFRyBwcm9wZXI6CisgICAgKiBFbnRyb3B5IGRlY29kaW5nIChzZXF1ZW50aWFsIG9yIHByb2dyZXNzaXZlLCBIdWZmbWFuIG9yIGFyaXRobWV0aWMpLgorICAgICogRGVxdWFudGl6YXRpb24sIGludmVyc2UgRENULCBNQ1UgZGlzYXNzZW1ibHkuCisgIFBvc3Rwcm9jZXNzaW5nOgorICAgICogVXBzYW1wbGluZy4gIE9wdGlvbmFsbHksIHRoaXMgc3RlcCBtYXkgYmUgYWJsZSB0byBkbyBtb3JlIGdlbmVyYWwKKyAgICAgIHJlc2NhbGluZyBvZiB0aGUgaW1hZ2UuCisgICAgKiBDb2xvciBzcGFjZSBjb252ZXJzaW9uIChlLmcuLCBZQ2JDciB0byBSR0IpLiAgVGhpcyBzdGVwIG1heSBhbHNvCisgICAgICBwcm92aWRlIGdhbW1hIGFkanVzdG1lbnQgWyBjdXJyZW50bHkgaXQgZG9lcyBub3QgXS4KKyAgICAqIE9wdGlvbmFsIGNvbG9yIHF1YW50aXphdGlvbiAoZS5nLiwgcmVkdWN0aW9uIHRvIDI1NiBjb2xvcnMpLgorICAgICogT3B0aW9uYWwgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiAoZS5nLiwgMjQtYml0IHRvIDE1LWJpdCBjb2xvcikuCisgICAgICBbVGhpcyBmZWF0dXJlIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuXQorCitXZSBhbHNvIG5lZWQgb3ZlcmFsbCBjb250cm9sLCBtYXJrZXIgcGFyc2luZywgYW5kIGEgZGF0YSBzb3VyY2UgbW9kdWxlLgorVGhlIHN1cHBvcnQgY29kZSAobWVtb3J5IG1hbmFnZW1lbnQgJiBlcnJvciBoYW5kbGluZykgY2FuIGJlIHNoYXJlZCB3aXRoCit0aGUgY29tcHJlc3Npb24gaGFsZiBvZiB0aGUgbGlicmFyeS4KKworVGhlcmUgbWF5IGJlIHNldmVyYWwgaW1wbGVtZW50YXRpb25zIG9mIGVhY2ggb2YgdGhlc2UgZWxlbWVudHMsIHBhcnRpY3VsYXJseQoraW4gdGhlIGRlY29tcHJlc3Nvciwgd2hlcmUgYSB3aWRlIHJhbmdlIG9mIHNwZWVkL3F1YWxpdHkgdHJhZGVvZmZzIGlzIHZlcnkKK3VzZWZ1bC4gIEl0IG11c3QgYmUgdW5kZXJzdG9vZCB0aGF0IHNvbWUgb2YgdGhlIGJlc3Qgc3BlZWR1cHMgaW52b2x2ZQorbWVyZ2luZyBhZGphY2VudCBzdGVwcyBpbiB0aGUgcGlwZWxpbmUuICBGb3IgZXhhbXBsZSwgdXBzYW1wbGluZywgY29sb3Igc3BhY2UKK2NvbnZlcnNpb24sIGFuZCBjb2xvciBxdWFudGl6YXRpb24gbWlnaHQgYWxsIGJlIGRvbmUgYXQgb25jZSB3aGVuIHVzaW5nIGEKK2xvdy1xdWFsaXR5IG9yZGVyZWQtZGl0aGVyIHRlY2huaXF1ZS4gIFRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIGlzIGRlc2lnbmVkIHRvCithbGxvdyBzdWNoIG1lcmdpbmcgd2hlcmUgYXBwcm9wcmlhdGUuCisKKworTm90ZTogaXQgaXMgY29udmVuaWVudCB0byByZWdhcmQgZWRnZSBleHBhbnNpb24gKHBhZGRpbmcgdG8gYmxvY2sgYm91bmRhcmllcykKK2FzIGEgcHJlcHJvY2Vzc2luZy9wb3N0cHJvY2Vzc2luZyBmdW5jdGlvbiwgZXZlbiB0aG91Z2ggdGhlIEpQRUcgc3BlYyBpbmNsdWRlcworaXQgaW4gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4gIFdlIGRvIHRoaXMgYmVjYXVzZSBkb3duc2FtcGxpbmcvdXBzYW1wbGluZworY2FuIGJlIHNpbXBsaWZpZWQgYSBsaXR0bGUgaWYgdGhleSB3b3JrIG9uIHBhZGRlZCBkYXRhOiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8KK2hhdmUgc3BlY2lhbCBjYXNlcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcy4gIFRoZXJlZm9yZSB0aGUgaW50ZXJmYWNlCitidWZmZXIgaXMgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiBibG9ja3Mgd2lkZSBhbmQgaGlnaCwgYW5kIHdlIGV4cGVjdAorY29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyB0byBwYWQgdGhlIHNvdXJjZSBkYXRhIHByb3Blcmx5LiAgUGFkZGluZyB3aWxsIG9jY3VyCitvbmx5IHRvIHRoZSBuZXh0IGJsb2NrICg4LXNhbXBsZSkgYm91bmRhcnkuICBJbiBhbiBpbnRlcmxlYXZlZC1zY2FuIHNpdHVhdGlvbiwKK2FkZGl0aW9uYWwgZHVtbXkgYmxvY2tzIG1heSBiZSB1c2VkIHRvIGZpbGwgb3V0IE1DVXMsIGJ1dCB0aGUgTUNVIGFzc2VtYmx5IGFuZAorZGlzYXNzZW1ibHkgbG9naWMgd2lsbCBjcmVhdGUgb3IgZGlzY2FyZCB0aGVzZSBibG9ja3MgaW50ZXJuYWxseS4gIChUaGlzIGlzCithZHZhbnRhZ2VvdXMgZm9yIHNwZWVkIHJlYXNvbnMsIHNpbmNlIHdlIGF2b2lkIERDVGluZyB0aGUgZHVtbXkgYmxvY2tzLgorSXQgYWxzbyBwZXJtaXRzIGEgc21hbGwgcmVkdWN0aW9uIGluIGZpbGUgc2l6ZSwgYmVjYXVzZSB0aGUgY29tcHJlc3NvciBjYW4KK2Nob29zZSBkdW1teSBibG9jayBjb250ZW50cyBzbyBhcyB0byBtaW5pbWl6ZSB0aGVpciBzaXplIGluIGNvbXByZXNzZWQgZm9ybS4KK0ZpbmFsbHksIGl0IG1ha2VzIHRoZSBpbnRlcmZhY2UgYnVmZmVyIHNwZWNpZmljYXRpb24gaW5kZXBlbmRlbnQgb2Ygd2hldGhlcgordGhlIGZpbGUgaXMgYWN0dWFsbHkgaW50ZXJsZWF2ZWQgb3Igbm90LikgIEFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gZGVhbAorZGlyZWN0bHkgd2l0aCB0aGUgZG93bnNhbXBsZWQgZGF0YSBtdXN0IHByb3ZpZGUgc2ltaWxhciBidWZmZXJpbmcgYW5kIHBhZGRpbmcKK2ZvciBvZGQtc2l6ZWQgaW1hZ2VzLgorCisKKyoqKiBQb29yIG1hbidzIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyAqKioKKworSXQgc2hvdWxkIGJlIGNsZWFyIGJ5IG5vdyB0aGF0IHdlIGhhdmUgYSBsb3Qgb2YgcXVhc2ktaW5kZXBlbmRlbnQgcHJvY2Vzc2luZworc3RlcHMsIG1hbnkgb2Ygd2hpY2ggaGF2ZSBzZXZlcmFsIHBvc3NpYmxlIGJlaGF2aW9ycy4gIFRvIGF2b2lkIGNsdXR0ZXJpbmcgdGhlCitjb2RlIHdpdGggbG90cyBvZiBzd2l0Y2ggc3RhdGVtZW50cywgd2UgdXNlIGEgc2ltcGxlIGZvcm0gb2Ygb2JqZWN0LXN0eWxlCitwcm9ncmFtbWluZyB0byBzZXBhcmF0ZSBvdXQgdGhlIGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLgorCitGb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudCBjb2xvciBxdWFudGl6YXRpb24gYWxnb3JpdGhtcyBjb3VsZCBiZSBpbXBsZW1lbnRlZAorYXMgdHdvIHNlcGFyYXRlIG1vZHVsZXMgdGhhdCBwcmVzZW50IHRoZSBzYW1lIGV4dGVybmFsIGludGVyZmFjZTsgYXQgcnVudGltZSwKK3RoZSBjYWxsaW5nIGNvZGUgd2lsbCBhY2Nlc3MgdGhlIHByb3BlciBtb2R1bGUgaW5kaXJlY3RseSB0aHJvdWdoIGFuICJvYmplY3QiLgorCitXZSBjYW4gZ2V0IHRoZSBsaW1pdGVkIGZlYXR1cmVzIHdlIG5lZWQgd2hpbGUgc3RheWluZyB3aXRoaW4gcG9ydGFibGUgQy4KK1RoZSBiYXNpYyB0b29sIGlzIGEgZnVuY3Rpb24gcG9pbnRlci4gIEFuICJvYmplY3QiIGlzIGp1c3QgYSBzdHJ1Y3QKK2NvbnRhaW5pbmcgb25lIG9yIG1vcmUgZnVuY3Rpb24gcG9pbnRlciBmaWVsZHMsIGVhY2ggb2Ygd2hpY2ggY29ycmVzcG9uZHMgdG8KK2EgbWV0aG9kIG5hbWUgaW4gcmVhbCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLiAgRHVyaW5nIGluaXRpYWxpemF0aW9uIHdlCitmaWxsIGluIHRoZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIHJlZmVyZW5jZXMgdG8gd2hpY2hldmVyIG1vZHVsZSB3ZSBoYXZlCitkZXRlcm1pbmVkIHdlIG5lZWQgdG8gdXNlIGluIHRoaXMgcnVuLiAgVGhlbiBpbnZvY2F0aW9uIG9mIHRoZSBtb2R1bGUgaXMgZG9uZQorYnkgaW5kaXJlY3RpbmcgdGhyb3VnaCBhIGZ1bmN0aW9uIHBvaW50ZXI7IG9uIG1vc3QgbWFjaGluZXMgdGhpcyBpcyBubyBtb3JlCitleHBlbnNpdmUgdGhhbiBhIHN3aXRjaCBzdGF0ZW1lbnQsIHdoaWNoIHdvdWxkIGJlIHRoZSBvbmx5IG90aGVyIHdheSBvZgorbWFraW5nIHRoZSByZXF1aXJlZCBydW4tdGltZSBjaG9pY2UuICBUaGUgcmVhbGx5IHNpZ25pZmljYW50IGJlbmVmaXQsIG9mCitjb3Vyc2UsIGlzIGtlZXBpbmcgdGhlIHNvdXJjZSBjb2RlIGNsZWFuIGFuZCB3ZWxsIHN0cnVjdHVyZWQuCisKK1dlIGNhbiBhbHNvIGFycmFuZ2UgdG8gaGF2ZSBwcml2YXRlIHN0b3JhZ2UgdGhhdCB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQKK2ltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBraW5kIG9mIG9iamVjdC4gIFdlIGRvIHRoaXMgYnkgbWFraW5nIGFsbCB0aGUKK21vZHVsZS1zcGVjaWZpYyBvYmplY3Qgc3RydWN0cyBiZSBzZXBhcmF0ZWx5IGFsbG9jYXRlZCBlbnRpdGllcywgd2hpY2ggd2lsbAorYmUgYWNjZXNzZWQgdmlhIHBvaW50ZXJzIGluIHRoZSBtYXN0ZXIgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBzdHJ1Y3QuCitUaGUgInB1YmxpYyIgZmllbGRzIG9yIG1ldGhvZHMgZm9yIGEgZ2l2ZW4ga2luZCBvZiBvYmplY3QgYXJlIHNwZWNpZmllZCBieQorYSBjb21tb25seSBrbm93biBzdHJ1Y3QuICBCdXQgYSBtb2R1bGUncyBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBhbGxvY2F0ZQorYSBsYXJnZXIgc3RydWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbW1vbiBzdHJ1Y3QgYXMgaXRzIGZpcnN0IG1lbWJlciwgcGx1cworYWRkaXRpb25hbCBwcml2YXRlIGZpZWxkcy4gIFdpdGggYXBwcm9wcmlhdGUgcG9pbnRlciBjYXN0aW5nLCB0aGUgbW9kdWxlJ3MKK2ludGVybmFsIGZ1bmN0aW9ucyBjYW4gYWNjZXNzIHRoZXNlIHByaXZhdGUgZmllbGRzLiAgKEZvciBhIHNpbXBsZSBleGFtcGxlLAorc2VlIGpkYXRhZHN0LmMsIHdoaWNoIGltcGxlbWVudHMgdGhlIGV4dGVybmFsIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgc3RydWN0CitqcGVnX2Rlc3RpbmF0aW9uX21nciwgYnV0IGFkZHMgZXh0cmEgZmllbGRzLikKKworKE9mIGNvdXJzZSB0aGlzIHdvdWxkIGFsbCBiZSBhIGxvdCBlYXNpZXIgaWYgd2Ugd2VyZSB1c2luZyBDKyssIGJ1dCB3ZSBhcmUKK25vdCB5ZXQgcHJlcGFyZWQgdG8gYXNzdW1lIHRoYXQgZXZlcnlvbmUgaGFzIGEgQysrIGNvbXBpbGVyLikKKworQW4gaW1wb3J0YW50IGJlbmVmaXQgb2YgdGhpcyBzY2hlbWUgaXMgdGhhdCBpdCBpcyBlYXN5IHRvIHByb3ZpZGUgbXVsdGlwbGUKK3ZlcnNpb25zIG9mIGFueSBtZXRob2QsIGVhY2ggdHVuZWQgdG8gYSBwYXJ0aWN1bGFyIGNhc2UuICBXaGlsZSBhIGxvdCBvZgorcHJlY2FsY3VsYXRpb24gbWlnaHQgYmUgZG9uZSB0byBzZWxlY3QgYW4gb3B0aW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBhIG1ldGhvZCwKK3RoZSBjb3N0IHBlciBpbnZvY2F0aW9uIGlzIGNvbnN0YW50LiAgRm9yIGV4YW1wbGUsIHRoZSB1cHNhbXBsaW5nIHN0ZXAgbWlnaHQKK2hhdmUgYSAiZ2VuZXJpYyIgbWV0aG9kLCBwbHVzIG9uZSBvciBtb3JlICJoYXJkd2lyZWQiIG1ldGhvZHMgZm9yIHRoZSBtb3N0Citwb3B1bGFyIHNhbXBsaW5nIGZhY3RvcnM7IHRoZSBoYXJkd2lyZWQgbWV0aG9kcyB3b3VsZCBiZSBmYXN0ZXIgYmVjYXVzZSB0aGV5J2QKK3VzZSBzdHJhaWdodC1saW5lIGNvZGUgaW5zdGVhZCBvZiBmb3ItbG9vcHMuICBUaGUgY29zdCB0byBkZXRlcm1pbmUgd2hpY2gKK21ldGhvZCB0byB1c2UgaXMgcGFpZCBvbmx5IG9uY2UsIGF0IHN0YXJ0dXAsIGFuZCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhIGFyZQoraGlkZGVuIGZyb20gdGhlIGNhbGxlcnMgb2YgdGhlIG1ldGhvZC4KKworVGhpcyBwbGFuIGRpZmZlcnMgYSBsaXR0bGUgYml0IGZyb20gdXN1YWwgb2JqZWN0LW9yaWVudGVkIHN0cnVjdHVyZXMsIGluIHRoYXQKK29ubHkgb25lIGluc3RhbmNlIG9mIGVhY2ggb2JqZWN0IGNsYXNzIHdpbGwgZXhpc3QgZHVyaW5nIGV4ZWN1dGlvbi4gIFRoZQorcmVhc29uIGZvciBoYXZpbmcgdGhlIGNsYXNzIHN0cnVjdHVyZSBpcyB0aGF0IG9uIGRpZmZlcmVudCBydW5zIHdlIG1heSBjcmVhdGUKK2RpZmZlcmVudCBpbnN0YW5jZXMgKGNob29zZSB0byBleGVjdXRlIGRpZmZlcmVudCBtb2R1bGVzKS4gIFlvdSBjYW4gdGhpbmsgb2YKK3RoZSB0ZXJtICJtZXRob2QiIGFzIGRlbm90aW5nIHRoZSBjb21tb24gaW50ZXJmYWNlIHByZXNlbnRlZCBieSBhIHBhcnRpY3VsYXIKK3NldCBvZiBpbnRlcmNoYW5nZWFibGUgZnVuY3Rpb25zLCBhbmQgIm9iamVjdCIgYXMgZGVub3RpbmcgYSBncm91cCBvZiByZWxhdGVkCittZXRob2RzLCBvciB0aGUgdG90YWwgc2hhcmVkIGludGVyZmFjZSBiZWhhdmlvciBvZiBhIGdyb3VwIG9mIG1vZHVsZXMuCisKKworKioqIE92ZXJhbGwgY29udHJvbCBzdHJ1Y3R1cmUgKioqCisKK1dlIHByZXZpb3VzbHkgbWVudGlvbmVkIHRoZSBuZWVkIGZvciBvdmVyYWxsIGNvbnRyb2wgbG9naWMgaW4gdGhlIGNvbXByZXNzaW9uCithbmQgZGVjb21wcmVzc2lvbiBsaWJyYXJpZXMuICBJbiBJSkcgaW1wbGVtZW50YXRpb25zIHByaW9yIHRvIHY1LCBvdmVyYWxsCitjb250cm9sIHdhcyBtb3N0bHkgcHJvdmlkZWQgYnkgInBpcGVsaW5lIGNvbnRyb2wiIG1vZHVsZXMsIHdoaWNoIHByb3ZlZCB0byBiZQorbGFyZ2UsIHVud2llbGR5LCBhbmQgaGFyZCB0byB1bmRlcnN0YW5kLiAgVG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uLCB0aGUKK2NvbnRyb2wgbG9naWMgaGFzIGJlZW4gc3ViZGl2aWRlZCBpbnRvIG11bHRpcGxlIG1vZHVsZXMuICBUaGUgY29udHJvbCBtb2R1bGVzCitjb25zaXN0IG9mOgorCisxLiBNYXN0ZXIgY29udHJvbCBmb3IgbW9kdWxlIHNlbGVjdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24uICBUaGlzIGhhcyB0d28KK3Jlc3BvbnNpYmlsaXRpZXM6CisKKyAgIDFBLiAgU3RhcnR1cCBpbml0aWFsaXphdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGltYWdlIHByb2Nlc3NpbmcuCisgICAgICAgIFRoZSBpbmRpdmlkdWFsIHByb2Nlc3NpbmcgbW9kdWxlcyB0byBiZSB1c2VkIGluIHRoaXMgcnVuIGFyZSBzZWxlY3RlZAorICAgICAgICBhbmQgZ2l2ZW4gaW5pdGlhbGl6YXRpb24gY2FsbHMuCisKKyAgIDFCLiAgUGVyLXBhc3MgY29udHJvbC4gIFRoaXMgZGV0ZXJtaW5lcyBob3cgbWFueSBwYXNzZXMgd2lsbCBiZSBwZXJmb3JtZWQKKyAgICAgICAgYW5kIGNhbGxzIGVhY2ggYWN0aXZlIHByb2Nlc3NpbmcgbW9kdWxlIHRvIGNvbmZpZ3VyZSBpdHNlbGYKKyAgICAgICAgYXBwcm9wcmlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4gIEVuZC1vZi1wYXNzIHByb2Nlc3NpbmcsCisJd2hlcmUgbmVjZXNzYXJ5LCBpcyBhbHNvIGludm9rZWQgZnJvbSB0aGUgbWFzdGVyIGNvbnRyb2wgbW9kdWxlLgorCisgICBNZXRob2Qgc2VsZWN0aW9uIGlzIHBhcnRpYWxseSBkaXN0cmlidXRlZCwgaW4gdGhhdCBhIHBhcnRpY3VsYXIgcHJvY2Vzc2luZworICAgbW9kdWxlIG1heSBjb250YWluIHNldmVyYWwgcG9zc2libGUgaW1wbGVtZW50YXRpb25zIG9mIGEgcGFydGljdWxhciBtZXRob2QsCisgICB3aGljaCBpdCB3aWxsIHNlbGVjdCBhbW9uZyB3aGVuIGdpdmVuIGl0cyBpbml0aWFsaXphdGlvbiBjYWxsLiAgVGhlIG1hc3RlcgorICAgY29udHJvbCBjb2RlIG5lZWQgb25seSBiZSBjb25jZXJuZWQgd2l0aCBkZWNpc2lvbnMgdGhhdCBhZmZlY3QgbW9yZSB0aGFuCisgICBvbmUgbW9kdWxlLgorIAorMi4gRGF0YSBidWZmZXJpbmcgY29udHJvbC4gIEEgc2VwYXJhdGUgY29udHJvbCBtb2R1bGUgZXhpc3RzIGZvciBlYWNoCisgICBpbnRlci1wcm9jZXNzaW5nLXN0ZXAgZGF0YSBidWZmZXIuICBUaGlzIG1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IKKyAgIGludm9raW5nIHRoZSBwcm9jZXNzaW5nIHN0ZXBzIHRoYXQgd3JpdGUgb3IgcmVhZCB0aGF0IGRhdGEgYnVmZmVyLgorCitFYWNoIGJ1ZmZlciBjb250cm9sbGVyIHNlZXMgdGhlIHdvcmxkIGFzIGZvbGxvd3M6CisKK2lucHV0IGRhdGEgPT4gcHJvY2Vzc2luZyBzdGVwIEEgPT4gYnVmZmVyID0+IHByb2Nlc3Npbmcgc3RlcCBCID0+IG91dHB1dCBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnRyb2xsZXIgLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBjb250cm9sbGVyIGtub3dzIHRoZSBkYXRhZmxvdyByZXF1aXJlbWVudHMgb2Ygc3RlcHMgQSBhbmQgQjogaG93IG11Y2ggZGF0YQordGhleSB3YW50IHRvIGFjY2VwdCBpbiBvbmUgY2h1bmsgYW5kIGhvdyBtdWNoIHRoZXkgb3V0cHV0IGluIG9uZSBjaHVuay4gIEl0cworZnVuY3Rpb24gaXMgdG8gbWFuYWdlIGl0cyBidWZmZXIgYW5kIGNhbGwgQSBhbmQgQiBhdCB0aGUgcHJvcGVyIHRpbWVzLgorCitBIGRhdGEgYnVmZmVyIGNvbnRyb2wgbW9kdWxlIG1heSBpdHNlbGYgYmUgdmlld2VkIGFzIGEgcHJvY2Vzc2luZyBzdGVwIGJ5IGEKK2hpZ2hlci1sZXZlbCBjb250cm9sIG1vZHVsZTsgdGh1cyB0aGUgY29udHJvbCBtb2R1bGVzIGZvcm0gYSBiaW5hcnkgdHJlZSB3aXRoCitlbGVtZW50YXJ5IHByb2Nlc3Npbmcgc3RlcHMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgdHJlZS4KKworVGhlIGNvbnRyb2wgbW9kdWxlcyBhcmUgb2JqZWN0cy4gIEEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBmbGV4aWJpbGl0eSBjYW4KK2JlIGhhZCBieSByZXBsYWNpbmcgaW1wbGVtZW50YXRpb25zIG9mIGEgY29udHJvbCBtb2R1bGUuICBGb3IgZXhhbXBsZToKKyogTWVyZ2luZyBvZiBhZGphY2VudCBzdGVwcyBpbiB0aGUgcGlwZWxpbmUgaXMgZG9uZSBieSByZXBsYWNpbmcgYSBjb250cm9sCisgIG1vZHVsZSBhbmQgaXRzIHBhaXIgb2YgcHJvY2Vzc2luZy1zdGVwIG1vZHVsZXMgd2l0aCBhIHNpbmdsZSBwcm9jZXNzaW5nLQorICBzdGVwIG1vZHVsZS4gIChIZW5jZSB0aGUgcG9zc2libGUgbWVyZ2VzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB0cmVlIG9mCisgIGNvbnRyb2wgbW9kdWxlcy4pCisqIEluIHNvbWUgcHJvY2Vzc2luZyBtb2RlcywgYSBnaXZlbiBpbnRlcnN0ZXAgYnVmZmVyIG5lZWQgb25seSBiZSBhICJzdHJpcCIKKyAgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSB0aGUgZGVzaXJlZCBkYXRhIGNodW5rIHNpemVzLiAgSW4gb3RoZXIKKyAgbW9kZXMsIGEgZnVsbC1pbWFnZSBidWZmZXIgaXMgbmVlZGVkIGFuZCBzZXZlcmFsIHBhc3NlcyBhcmUgcmVxdWlyZWQuCisgIFRoZSBjb250cm9sIG1vZHVsZSBkZXRlcm1pbmVzIHdoaWNoIGtpbmQgb2YgYnVmZmVyIGlzIHVzZWQgYW5kIG1hbmlwdWxhdGVzCisgIHZpcnR1YWwgYXJyYXkgYnVmZmVycyBhcyBuZWVkZWQuICBPbmUgb3IgYm90aCBwcm9jZXNzaW5nIHN0ZXBzIG1heSBiZQorICB1bmF3YXJlIG9mIHRoZSBtdWx0aS1wYXNzIGJlaGF2aW9yLgorCitJbiB0aGVvcnksIHdlIG1pZ2h0IGJlIGFibGUgdG8gbWFrZSBhbGwgb2YgdGhlIGRhdGEgYnVmZmVyIGNvbnRyb2xsZXJzCitpbnRlcmNoYW5nZWFibGUgYW5kIHByb3ZpZGUganVzdCBvbmUgc2V0IG9mIGltcGxlbWVudGF0aW9ucyBmb3IgYWxsLiAgSW4KK3ByYWN0aWNlLCBlYWNoIG9uZSBjb250YWlucyBjb25zaWRlcmFibGUgc3BlY2lhbC1jYXNlIHByb2Nlc3NpbmcgZm9yIGl0cworcGFydGljdWxhciBqb2IuICBUaGUgYnVmZmVyIGNvbnRyb2xsZXIgY29uY2VwdCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYW4KK292ZXJhbGwgc3lzdGVtIHN0cnVjdHVyaW5nIHByaW5jaXBsZSwgbm90IGFzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlCit0YXNrIHBlcmZvcm1lZCBieSBhbnkgb25lIGNvbnRyb2xsZXIuCisKKworKioqIENvbXByZXNzaW9uIG9iamVjdCBzdHJ1Y3R1cmUgKioqCisKK0hlcmUgaXMgYSBza2V0Y2ggb2YgdGhlIGxvZ2ljYWwgc3RydWN0dXJlIG9mIHRoZSBKUEVHIGNvbXByZXNzaW9uIGxpYnJhcnk6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gQ29sb3JzcGFjZSBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICB8LS0gUHJlcHJvY2Vzc2luZyBjb250cm9sbGVyIC0tfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBEb3duc2FtcGxpbmcKK01haW4gY29udHJvbGxlciAtLXwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIEZvcndhcmQgRENULCBxdWFudGl6ZQorICAgICAgICAgICAgICAgICAgfC0tIENvZWZmaWNpZW50IGNvbnRyb2xsZXIgLS18CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBFbnRyb3B5IGVuY29kaW5nCisKK1RoaXMgc2tldGNoIGFsc28gZGVzY3JpYmVzIHRoZSBmbG93IG9mIGNvbnRyb2wgKHN1YnJvdXRpbmUgY2FsbHMpIGR1cmluZwordHlwaWNhbCBpbWFnZSBkYXRhIHByb2Nlc3NpbmcuICBFYWNoIG9mIHRoZSBjb21wb25lbnRzIHNob3duIGluIHRoZSBkaWFncmFtIGlzCithbiAib2JqZWN0IiB3aGljaCBtYXkgaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgYXZhaWxhYmxlLiAgT25lCitvciBtb3JlIHNvdXJjZSBjb2RlIGZpbGVzIGNvbnRhaW4gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbihzKSBvZiBlYWNoIG9iamVjdC4KKworVGhlIG9iamVjdHMgc2hvd24gYWJvdmUgYXJlOgorCisqIE1haW4gY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBzdWJzYW1wbGVkLWRhdGEgYnVmZmVyLCB3aGljaAorICBob2xkcyB0aGUgcHJlcHJvY2Vzc2VkIGlucHV0IGRhdGEuICBUaGlzIGNvbnRyb2xsZXIgaW52b2tlcyBwcmVwcm9jZXNzaW5nIHRvCisgIGZpbGwgdGhlIHN1YnNhbXBsZWQtZGF0YSBidWZmZXIsIGFuZCBKUEVHIGNvbXByZXNzaW9uIHRvIGVtcHR5IGl0LiAgVGhlcmUgaXMKKyAgdXN1YWxseSBubyBuZWVkIGZvciBhIGZ1bGwtaW1hZ2UgYnVmZmVyIGhlcmU7IGEgc3RyaXAgYnVmZmVyIGlzIGFkZXF1YXRlLgorCisqIFByZXByb2Nlc3NpbmcgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBkb3duc2FtcGxpbmcgaW5wdXQgZGF0YQorICBidWZmZXIsIHdoaWNoIGxpZXMgYmV0d2VlbiBjb2xvcnNwYWNlIGNvbnZlcnNpb24gYW5kIGRvd25zYW1wbGluZy4gIE5vdGUKKyAgdGhhdCBhIHVuaWZpZWQgY29udmVyc2lvbi9kb3duc2FtcGxpbmcgbW9kdWxlIHdvdWxkIHByb2JhYmx5IHJlcGxhY2UgdGhpcworICBjb250cm9sbGVyIGVudGlyZWx5LgorCisqIENvbG9yc3BhY2UgY29udmVyc2lvbjogY29udmVydHMgYXBwbGljYXRpb24gaW1hZ2UgZGF0YSBpbnRvIHRoZSBkZXNpcmVkCisgIEpQRUcgY29sb3Igc3BhY2U7IGFsc28gY2hhbmdlcyB0aGUgZGF0YSBmcm9tIHBpeGVsLWludGVybGVhdmVkIGxheW91dCB0bworICBzZXBhcmF0ZSBjb21wb25lbnQgcGxhbmVzLiAgUHJvY2Vzc2VzIG9uZSBwaXhlbCByb3cgYXQgYSB0aW1lLgorCisqIERvd25zYW1wbGluZzogcGVyZm9ybXMgcmVkdWN0aW9uIG9mIGNocm9tYSBjb21wb25lbnRzIGFzIHJlcXVpcmVkLgorICBPcHRpb25hbGx5IG1heSBwZXJmb3JtIHBpeGVsLWxldmVsIHNtb290aGluZyBhcyB3ZWxsLiAgUHJvY2Vzc2VzIGEgInJvdworICBncm91cCIgYXQgYSB0aW1lLCB3aGVyZSBhIHJvdyBncm91cCBpcyBkZWZpbmVkIGFzIFZtYXggcGl4ZWwgcm93cyBvZiBlYWNoCisgIGNvbXBvbmVudCBiZWZvcmUgZG93bnNhbXBsaW5nLCBhbmQgVmsgc2FtcGxlIHJvd3MgYWZ0ZXJ3YXJkcyAocmVtZW1iZXIgVmsKKyAgZGlmZmVycyBhY3Jvc3MgY29tcG9uZW50cykuICBTb21lIGRvd25zYW1wbGluZyBvciBzbW9vdGhpbmcgYWxnb3JpdGhtcyBtYXkKKyAgcmVxdWlyZSBjb250ZXh0IHJvd3MgYWJvdmUgYW5kIGJlbG93IHRoZSBjdXJyZW50IHJvdyBncm91cDsgdGhlCisgIHByZXByb2Nlc3NpbmcgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIHRoZXNlIHJvd3MgdmlhIHByb3BlcgorICBidWZmZXJpbmcuICBUaGUgZG93bnNhbXBsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVkZ2UgZXhwYW5zaW9uIGF0IHRoZSByaWdodAorICBlZGdlIChpLmUuLCBleHRlbmRpbmcgZWFjaCBzYW1wbGUgcm93IHRvIGEgbXVsdGlwbGUgb2YgOCBzYW1wbGVzKTsgYnV0IHRoZQorICBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIHZlcnRpY2FsIGVkZ2UgZXhwYW5zaW9uIChpLmUuLAorICBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHNhbXBsZSByb3cgYXMgbmVlZGVkIHRvIG1ha2UgYSBtdWx0aXBsZSBvZiA4IHJvd3MpLgorCisqIENvZWZmaWNpZW50IGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgRENULWNvZWZmaWNpZW50IGRhdGEuCisgIFRoaXMgY29udHJvbGxlciBoYW5kbGVzIE1DVSBhc3NlbWJseSwgaW5jbHVkaW5nIGluc2VydGlvbiBvZiBkdW1teSBEQ1QKKyAgYmxvY2tzIHdoZW4gbmVlZGVkIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZS4gIFdoZW4gcGVyZm9ybWluZworICBIdWZmbWFuLWNvZGUgb3B0aW1pemF0aW9uIG9yIGVtaXR0aW5nIGEgbXVsdGlzY2FuIEpQRUcgZmlsZSwgdGhpcworICBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBidWZmZXJpbmcgdGhlIGZ1bGwgaW1hZ2UuICBUaGUgZXF1aXZhbGVudCBvZgorICBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyBvZiBzdWJzYW1wbGVkIGRhdGEgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLAorICBldmVuIHdoZW4gdGhlIEpQRUcgZmlsZSBpcyBub25pbnRlcmxlYXZlZC4KKworKiBGb3J3YXJkIERDVCBhbmQgcXVhbnRpemF0aW9uOiBQZXJmb3JtIERDVCwgcXVhbnRpemUsIGFuZCBlbWl0IGNvZWZmaWNpZW50cy4KKyAgV29ya3Mgb24gb25lIG9yIG1vcmUgRENUIGJsb2NrcyBhdCBhIHRpbWUuICAoTm90ZTogdGhlIGNvZWZmaWNpZW50cyBhcmUgbm93CisgIGVtaXR0ZWQgaW4gbm9ybWFsIGFycmF5IG9yZGVyLCB3aGljaCB0aGUgZW50cm9weSBlbmNvZGVyIGlzIGV4cGVjdGVkIHRvCisgIGNvbnZlcnQgdG8gemlnemFnIG9yZGVyIGFzIG5lY2Vzc2FyeS4gIFByaW9yIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSBkaWQKKyAgdGhlIGNvbnZlcnNpb24gdG8gemlnemFnIG9yZGVyIHdpdGhpbiB0aGUgcXVhbnRpemF0aW9uIHN0ZXAuKQorCisqIEVudHJvcHkgZW5jb2Rpbmc6IFBlcmZvcm0gSHVmZm1hbiBvciBhcml0aG1ldGljIGVudHJvcHkgY29kaW5nIGFuZCBlbWl0IHRoZQorICBjb2RlZCBkYXRhIHRvIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZS4gIFdvcmtzIG9uIG9uZSBNQ1UgcGVyIGNhbGwuCisgIEZvciBwcm9ncmVzc2l2ZSBKUEVHLCB0aGUgc2FtZSBEQ1QgYmxvY2tzIGFyZSBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIKKyAgZHVyaW5nIGVhY2ggcGFzcywgYW5kIHRoZSBjb2RlciBtdXN0IGVtaXQgdGhlIGFwcHJvcHJpYXRlIHN1YnNldCBvZgorICBjb2VmZmljaWVudHMuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBvYmplY3RzLCB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBpbmNsdWRlcyB0aGVzZQorb2JqZWN0czoKKworKiBNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhc3NlcyByZXF1aXJlZCwgY29udHJvbHMgb3ZlcmFsbAorICBhbmQgcGVyLXBhc3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG90aGVyIG1vZHVsZXMuCisKKyogTWFya2VyIHdyaXRpbmc6IGdlbmVyYXRlcyBKUEVHIG1hcmtlcnMgKGV4Y2VwdCBmb3IgUlNUbiwgd2hpY2ggaXMgZW1pdHRlZAorICBieSB0aGUgZW50cm9weSBlbmNvZGVyIHdoZW4gbmVlZGVkKS4KKworKiBEYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXI6IHdyaXRlcyB0aGUgb3V0cHV0IEpQRUcgZGF0YXN0cmVhbSB0byBpdHMgZmluYWwKKyAgZGVzdGluYXRpb24gKGUuZy4sIGEgZmlsZSkuICBUaGUgZGVzdGluYXRpb24gbWFuYWdlciBzdXBwbGllZCB3aXRoIHRoZQorICBsaWJyYXJ5IGtub3dzIGhvdyB0byB3cml0ZSB0byBhIHN0ZGlvIHN0cmVhbTsgZm9yIG90aGVyIGJlaGF2aW9ycywgdGhlCisgIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBwcm92aWRlIGl0cyBvd24gZGVzdGluYXRpb24gbWFuYWdlci4KKworKiBNZW1vcnkgbWFuYWdlcjogYWxsb2NhdGVzIGFuZCByZWxlYXNlcyBtZW1vcnksIGNvbnRyb2xzIHZpcnR1YWwgYXJyYXlzCisgICh3aXRoIGJhY2tpbmcgc3RvcmUgbWFuYWdlbWVudCwgd2hlcmUgcmVxdWlyZWQpLgorCisqIEVycm9yIGhhbmRsZXI6IHBlcmZvcm1zIGZvcm1hdHRpbmcgYW5kIG91dHB1dCBvZiBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZXM7CisgIGRldGVybWluZXMgaGFuZGxpbmcgb2Ygbm9uZmF0YWwgZXJyb3JzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heQorICBvdmVycmlkZSBzb21lIG9yIGFsbCBvZiB0aGlzIG9iamVjdCdzIG1ldGhvZHMgdG8gY2hhbmdlIGVycm9yIGhhbmRsaW5nLgorCisqIFByb2dyZXNzIG1vbml0b3I6IHN1cHBvcnRzIG91dHB1dCBvZiAicGVyY2VudC1kb25lIiBwcm9ncmVzcyByZXBvcnRzLgorICBUaGlzIG9iamVjdCByZXByZXNlbnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbjoKKyAgaWYgd2FudGVkLCBpdCBtdXN0IGJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworVGhlIGVycm9yIGhhbmRsZXIsIGRlc3RpbmF0aW9uIG1hbmFnZXIsIGFuZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdHMgYXJlCitkZWZpbmVkIGFzIHNlcGFyYXRlIG9iamVjdHMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgYXBwbGljYXRpb24tc3BlY2lmaWMKK2N1c3RvbWl6YXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeS4gIEEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlCitpbmRpdmlkdWFsIG1ldGhvZHMgb3Igc3VwcGx5IGl0cyBvd24gYWxsLW5ldyBpbXBsZW1lbnRhdGlvbiBvZiBvbmUgb2YgdGhlc2UKK29iamVjdHMuICBUaGUgb2JqZWN0IGludGVyZmFjZXMgZm9yIHRoZXNlIG9iamVjdHMgYXJlIHRoZXJlZm9yZSB0cmVhdGVkIGFzCitwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2Ugb2YgdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIG90aGVyIG9iamVjdHMKK2FyZSBpbnRlcm5hbCB0byB0aGUgbGlicmFyeS4KKworVGhlIGVycm9yIGhhbmRsZXIgYW5kIG1lbW9yeSBtYW5hZ2VyIGFyZSBzaGFyZWQgYnkgSlBFRyBjb21wcmVzc2lvbiBhbmQKK2RlY29tcHJlc3Npb247IHRoZSBwcm9ncmVzcyBtb25pdG9yLCBpZiB1c2VkLCBtYXkgYmUgc2hhcmVkIGFzIHdlbGwuCisKKworKioqIERlY29tcHJlc3Npb24gb2JqZWN0IHN0cnVjdHVyZSAqKioKKworSGVyZSBpcyBhIHNrZXRjaCBvZiB0aGUgbG9naWNhbCBzdHJ1Y3R1cmUgb2YgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBsaWJyYXJ5OgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBFbnRyb3B5IGRlY29kaW5nCisgICAgICAgICAgICAgICAgICB8LS0gQ29lZmZpY2llbnQgY29udHJvbGxlciAtLXwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIERlcXVhbnRpemUsIEludmVyc2UgRENUCitNYWluIGNvbnRyb2xsZXIgLS18CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBVcHNhbXBsaW5nCisgICAgICAgICAgICAgICAgICB8LS0gUG9zdHByb2Nlc3NpbmcgY29udHJvbGxlciAtLXwgICB8LS0gQ29sb3JzcGFjZSBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBDb2xvciBxdWFudGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIENvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24KKworQXMgYmVmb3JlLCB0aGlzIGRpYWdyYW0gYWxzbyByZXByZXNlbnRzIHR5cGljYWwgY29udHJvbCBmbG93LiAgVGhlIG9iamVjdHMKK3Nob3duIGFyZToKKworKiBNYWluIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgc3Vic2FtcGxlZC1kYXRhIGJ1ZmZlciwgd2hpY2gKKyAgaG9sZHMgdGhlIG91dHB1dCBvZiBKUEVHIGRlY29tcHJlc3Npb24gcHJvcGVyLiAgVGhpcyBjb250cm9sbGVyJ3MgcHJpbWFyeQorICB0YXNrIGlzIHRvIGZlZWQgdGhlIHBvc3Rwcm9jZXNzaW5nIHByb2NlZHVyZS4gIFNvbWUgdXBzYW1wbGluZyBhbGdvcml0aG1zCisgIG1heSByZXF1aXJlIGNvbnRleHQgcm93cyBhYm92ZSBhbmQgYmVsb3cgdGhlIGN1cnJlbnQgcm93IGdyb3VwOyB3aGVuIHRoaXMKKyAgaXMgdHJ1ZSwgdGhlIG1haW4gY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgaXRzIGJ1ZmZlciBzbyBhcworICB0byBtYWtlIGNvbnRleHQgcm93cyBhdmFpbGFibGUuICBJbiB0aGUgY3VycmVudCBkZXNpZ24sIHRoZSBtYWluIGJ1ZmZlciBpcworICBhbHdheXMgYSBzdHJpcCBidWZmZXI7IGEgZnVsbC1pbWFnZSBidWZmZXIgaXMgbmV2ZXIgcmVxdWlyZWQuCisKKyogQ29lZmZpY2llbnQgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBEQ1QtY29lZmZpY2llbnQgZGF0YS4KKyAgVGhpcyBjb250cm9sbGVyIGhhbmRsZXMgTUNVIGRpc2Fzc2VtYmx5LCBpbmNsdWRpbmcgZGVsZXRpb24gb2YgYW55IGR1bW15CisgIERDVCBibG9ja3MgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlLiAgV2hlbiByZWFkaW5nIGEgbXVsdGlzY2FuIEpQRUcKKyAgZmlsZSwgdGhpcyBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBidWZmZXJpbmcgdGhlIGZ1bGwgaW1hZ2UuCisgIChCdWZmZXJpbmcgRENUIGNvZWZmaWNpZW50cywgcmF0aGVyIHRoYW4gc2FtcGxlcywgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQKKyAgcHJvZ3Jlc3NpdmUgSlBFRy4pICBUaGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyBvZgorICBzdWJzYW1wbGVkIGRhdGEgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLCBldmVuIHdoZW4gdGhlIHNvdXJjZSBKUEVHIGZpbGUgaXMKKyAgbm9uaW50ZXJsZWF2ZWQuCisKKyogRW50cm9weSBkZWNvZGluZzogUmVhZCBjb2RlZCBkYXRhIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZSBhbmQgcGVyZm9ybQorICBIdWZmbWFuIG9yIGFyaXRobWV0aWMgZW50cm9weSBkZWNvZGluZy4gIFdvcmtzIG9uIG9uZSBNQ1UgcGVyIGNhbGwuCisgIEZvciBwcm9ncmVzc2l2ZSBKUEVHIGRlY29kaW5nLCB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBzdXBwbGllcyB0aGUgcHJpb3IKKyAgY29lZmZpY2llbnRzIG9mIGVhY2ggTUNVIChpbml0aWFsbHkgYWxsIHplcm9lcyksIHdoaWNoIHRoZSBlbnRyb3B5IGRlY29kZXIKKyAgbW9kaWZpZXMgaW4gZWFjaCBzY2FuLgorCisqIERlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVDogbGlrZSBpdCBzYXlzLiAgTm90ZSB0aGF0IHRoZSBjb2VmZmljaWVudHMKKyAgYnVmZmVyZWQgYnkgdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgaGF2ZSBOT1QgYmVlbiBkZXF1YW50aXplZDsgd2UKKyAgbWVyZ2UgZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIGludG8gYSBzaW5nbGUgc3RlcCBmb3Igc3BlZWQgcmVhc29ucy4KKyAgV2hlbiBzY2FsZWQtZG93biBvdXRwdXQgaXMgYXNrZWQgZm9yLCBzaW1wbGlmaWVkIERDVCBhbGdvcml0aG1zIG1heSBiZSB1c2VkCisgIHRoYXQgZW1pdCBvbmx5IDF4MSwgMngyLCBvciA0eDQgc2FtcGxlcyBwZXIgRENUIGJsb2NrLCBub3QgdGhlIGZ1bGwgOHg4LgorICBXb3JrcyBvbiBvbmUgRENUIGJsb2NrIGF0IGEgdGltZS4KKworKiBQb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIGNvbG9yIHF1YW50aXphdGlvbgorICBpbnB1dCBidWZmZXIsIHdoZW4gcXVhbnRpemF0aW9uIGlzIGluIHVzZS4gIChXaXRob3V0IHF1YW50aXphdGlvbiwgdGhpcworICBjb250cm9sbGVyIGp1c3QgY2FsbHMgdGhlIHVwc2FtcGxlci4pICBGb3IgdHdvLXBhc3MgcXVhbnRpemF0aW9uLCB0aGlzCisgIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJ1ZmZlcmluZyB0aGUgZnVsbC1pbWFnZSBkYXRhLgorCisqIFVwc2FtcGxpbmc6IHJlc3RvcmVzIGNocm9tYSBjb21wb25lbnRzIHRvIGZ1bGwgc2l6ZS4gIChNYXkgc3VwcG9ydCBtb3JlCisgIGdlbmVyYWwgb3V0cHV0IHJlc2NhbGluZywgdG9vLiAgTm90ZSB0aGF0IGlmIHVuZGVyc2l6ZWQgRENUIG91dHB1dHMgaGF2ZQorICBiZWVuIGVtaXR0ZWQgYnkgdGhlIERDVCBtb2R1bGUsIHRoaXMgbW9kdWxlIG11c3QgYWRqdXN0IHNvIHRoYXQgcHJvcGVybHkKKyAgc2l6ZWQgb3V0cHV0cyBhcmUgY3JlYXRlZC4pICBXb3JrcyBvbiBvbmUgcm93IGdyb3VwIGF0IGEgdGltZS4gIFRoaXMgbW9kdWxlCisgIGFsc28gY2FsbHMgdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLCBzbyBpdHMgdG9wIGxldmVsIGlzIGVmZmVjdGl2ZWx5IGEKKyAgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSB1cHNhbXBsaW5nLT5jb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4gIEhvd2V2ZXIsIGluCisgIGFsbCBidXQgdGhlIGhpZ2hlc3QtcXVhbGl0eSBvcGVyYXRpbmcgbW9kZXMsIHVwc2FtcGxpbmcgYW5kIGNvbG9yCisgIGNvbnZlcnNpb24gYXJlIGxpa2VseSB0byBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBzdGVwLgorCisqIENvbG9yc3BhY2UgY29udmVyc2lvbjogY29udmVydCBmcm9tIEpQRUcgY29sb3Igc3BhY2UgdG8gb3V0cHV0IGNvbG9yIHNwYWNlLAorICBhbmQgY2hhbmdlIGRhdGEgbGF5b3V0IGZyb20gc2VwYXJhdGUgY29tcG9uZW50IHBsYW5lcyB0byBwaXhlbC1pbnRlcmxlYXZlZC4KKyAgV29ya3Mgb24gb25lIHBpeGVsIHJvdyBhdCBhIHRpbWUuCisKKyogQ29sb3IgcXVhbnRpemF0aW9uOiByZWR1Y2UgdGhlIGRhdGEgdG8gY29sb3JtYXBwZWQgZm9ybSwgdXNpbmcgZWl0aGVyIGFuCisgIGV4dGVybmFsbHkgc3BlY2lmaWVkIGNvbG9ybWFwIG9yIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkIG9uZS4gIFRoaXMgbW9kdWxlCisgIGlzIG5vdCB1c2VkIGZvciBmdWxsLWNvbG9yIG91dHB1dC4gIFdvcmtzIG9uIG9uZSBwaXhlbCByb3cgYXQgYSB0aW1lOyBtYXkKKyAgcmVxdWlyZSB0d28gcGFzc2VzIHRvIGdlbmVyYXRlIGEgY29sb3IgbWFwLiAgTm90ZSB0aGF0IHRoZSBvdXRwdXQgd2lsbAorICBhbHdheXMgYmUgYSBzaW5nbGUgY29tcG9uZW50IHJlcHJlc2VudGluZyBjb2xvcm1hcCBpbmRleGVzLiAgSW4gdGhlIGN1cnJlbnQKKyAgZGVzaWduLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgSlNBTVBMRXMsIHNvIGFuIDgtYml0IGNvbXBpbGF0aW9uIGNhbm5vdAorICBxdWFudGl6ZSB0byBtb3JlIHRoYW4gMjU2IGNvbG9ycy4gIFRoaXMgaXMgdW5saWtlbHkgdG8gYmUgYSBwcm9ibGVtIGluCisgIHByYWN0aWNlLgorCisqIENvbG9yIHJlZHVjdGlvbjogdGhpcyBtb2R1bGUgaGFuZGxlcyBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uLCBlLmcuLAorICBnZW5lcmF0aW5nIDE1LWJpdCBjb2xvciAoNSBiaXRzL3ByaW1hcnkpIGZyb20gSlBFRydzIDI0LWJpdCBvdXRwdXQuCisgIE5vdCBxdWl0ZSBjbGVhciB5ZXQgaG93IHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQuLi4gc2hvdWxkIHdlIG1lcmdlIGl0IHdpdGgKKyAgY29sb3JzcGFjZSBjb252ZXJzaW9uPz8/CisKK05vdGUgdGhhdCBzb21lIGhpZ2gtc3BlZWQgb3BlcmF0aW5nIG1vZGVzIG1pZ2h0IGNvbmRlbnNlIHRoZSBlbnRpcmUKK3Bvc3Rwcm9jZXNzaW5nIHNlcXVlbmNlIHRvIGEgc2luZ2xlIG1vZHVsZSAodXBzYW1wbGUsIGNvbG9yIGNvbnZlcnQsIGFuZAorcXVhbnRpemUgaW4gb25lIHN0ZXApLgorCitJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgb2JqZWN0cywgdGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBpbmNsdWRlcyB0aGVzZQorb2JqZWN0czoKKworKiBNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhc3NlcyByZXF1aXJlZCwgY29udHJvbHMgb3ZlcmFsbAorICBhbmQgcGVyLXBhc3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG90aGVyIG1vZHVsZXMuICBUaGlzIGlzIHN1YmRpdmlkZWQgaW50bworICBpbnB1dCBhbmQgb3V0cHV0IGNvbnRyb2w6IGpkaW5wdXQuYyBjb250cm9scyBvbmx5IGlucHV0LXNpZGUgcHJvY2Vzc2luZywKKyAgd2hpbGUgamRtYXN0ZXIuYyBoYW5kbGVzIG92ZXJhbGwgaW5pdGlhbGl6YXRpb24gYW5kIG91dHB1dC1zaWRlIGNvbnRyb2wuCisKKyogTWFya2VyIHJlYWRpbmc6IGRlY29kZXMgSlBFRyBtYXJrZXJzIChleGNlcHQgZm9yIFJTVG4pLgorCisqIERhdGEgc291cmNlIG1hbmFnZXI6IHN1cHBsaWVzIHRoZSBpbnB1dCBKUEVHIGRhdGFzdHJlYW0uICBUaGUgc291cmNlCisgIG1hbmFnZXIgc3VwcGxpZWQgd2l0aCB0aGUgbGlicmFyeSBrbm93cyBob3cgdG8gcmVhZCBmcm9tIGEgc3RkaW8gc3RyZWFtOworICBmb3Igb3RoZXIgYmVoYXZpb3JzLCB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IHByb3ZpZGUgaXRzIG93biBzb3VyY2UKKyAgbWFuYWdlci4KKworKiBNZW1vcnkgbWFuYWdlcjogc2FtZSBhcyBmb3IgY29tcHJlc3Npb24gbGlicmFyeS4KKworKiBFcnJvciBoYW5kbGVyOiBzYW1lIGFzIGZvciBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisqIFByb2dyZXNzIG1vbml0b3I6IHNhbWUgYXMgZm9yIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKK0FzIHdpdGggY29tcHJlc3Npb24sIHRoZSBkYXRhIHNvdXJjZSBtYW5hZ2VyLCBlcnJvciBoYW5kbGVyLCBhbmQgcHJvZ3Jlc3MKK21vbml0b3IgYXJlIGNhbmRpZGF0ZXMgZm9yIHJlcGxhY2VtZW50IGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCisKKworKioqIERlY29tcHJlc3Npb24gaW5wdXQgYW5kIG91dHB1dCBzZXBhcmF0aW9uICoqKgorCitUbyBzdXBwb3J0IGVmZmljaWVudCBpbmNyZW1lbnRhbCBkaXNwbGF5IG9mIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMsIHRoZQorZGVjb21wcmVzc29yIGlzIGRpdmlkZWQgaW50byB0d28gc2VjdGlvbnMgdGhhdCBjYW4gcnVuIGluZGVwZW5kZW50bHk6CisKKzEuIERhdGEgaW5wdXQgaW5jbHVkZXMgbWFya2VyIHBhcnNpbmcsIGVudHJvcHkgZGVjb2RpbmcsIGFuZCBpbnB1dCBpbnRvIHRoZQorICAgY29lZmZpY2llbnQgY29udHJvbGxlcidzIERDVCBjb2VmZmljaWVudCBidWZmZXIuICBOb3RlIHRoYXQgdGhpcworICAgcHJvY2Vzc2luZyBpcyByZWxhdGl2ZWx5IGNoZWFwIGFuZCBmYXN0LgorCisyLiBEYXRhIG91dHB1dCByZWFkcyBmcm9tIHRoZSBEQ1QgY29lZmZpY2llbnQgYnVmZmVyIGFuZCBwZXJmb3JtcyB0aGUgSURDVAorICAgYW5kIGFsbCBwb3N0cHJvY2Vzc2luZyBzdGVwcy4KKworRm9yIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLCB0aGUgZGF0YSBpbnB1dCBwcm9jZXNzaW5nIGlzIGFsbG93ZWQgdG8gZ2V0CithcmJpdHJhcmlseSBmYXIgYWhlYWQgb2YgdGhlIGRhdGEgb3V0cHV0IHByb2Nlc3NpbmcuICAoVGhpcyBvY2N1cnMgb25seQoraWYgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIGpwZWdfY29uc3VtZV9pbnB1dCgpOyBvdGhlcndpc2UgaW5wdXQgYW5kIG91dHB1dAorcnVuIGluIGxvY2tzdGVwLCBzaW5jZSB0aGUgaW5wdXQgc2VjdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBvdXRwdXQKK3NlY3Rpb24gbmVlZHMgbW9yZSBkYXRhLikgIEluIHRoaXMgd2F5IHRoZSBhcHBsaWNhdGlvbiBjYW4gYXZvaWQgbWFraW5nCitleHRyYSBkaXNwbGF5IHBhc3NlcyB3aGVuIGRhdGEgaXMgYXJyaXZpbmcgZmFzdGVyIHRoYW4gdGhlIGRpc3BsYXkgcGFzcworY2FuIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpdCBpcyBwb3NzaWJsZSB0byBhYm9ydCBhbiBvdXRwdXQgcGFzcyB3aXRob3V0Citsb3NpbmcgYW55dGhpbmcsIHNpbmNlIHRoZSBjb2VmZmljaWVudCBidWZmZXIgaXMgcmVhZC1vbmx5IGFzIGZhciBhcyB0aGUKK291dHB1dCBzZWN0aW9uIGlzIGNvbmNlcm5lZC4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBkZXRhaWwuCisKK0EgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBhcnJheSBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIEpQRUcgZmlsZSBoYXMgbXVsdGlwbGUKK3NjYW5zIChvciBpZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGJ1ZmZlcmVkLWltYWdlIG1vZGUgYW55d2F5KS4gIFdoZW4KK3JlYWRpbmcgYSBzaW5nbGUtc2NhbiBmaWxlLCB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBub3JtYWxseSBjcmVhdGVzIG9ubHkKK2Egb25lLU1DVSBidWZmZXIsIHNvIGlucHV0IGFuZCBvdXRwdXQgcHJvY2Vzc2luZyBtdXN0IHJ1biBpbiBsb2Nrc3RlcCBpbiB0aGlzCitjYXNlLiAganBlZ19jb25zdW1lX2lucHV0KCkgaXMgZWZmZWN0aXZlbHkgYSBuby1vcCBpbiB0aGlzIHNpdHVhdGlvbi4KKworVGhlIG1haW4gaW1wYWN0IG9mIGRpdmlkaW5nIHRoZSBkZWNvbXByZXNzb3IgaW4gdGhpcyBmYXNoaW9uIGlzIHRoYXQgd2UgbXVzdAorYmUgdmVyeSBjYXJlZnVsIHdpdGggc2hhcmVkIHZhcmlhYmxlcyBpbiB0aGUgY2luZm8gZGF0YSBzdHJ1Y3R1cmUuICBFYWNoCit2YXJpYWJsZSB0aGF0IGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgZGVjb21wcmVzc2lvbiBtdXN0IGJlCitjbGFzc2lmaWVkIGFzIGJlbG9uZ2luZyB0byBkYXRhIGlucHV0IG9yIGRhdGEgb3V0cHV0LCBhbmQgZWFjaCBzZWN0aW9uIG11c3QKK2xvb2sgb25seSBhdCBpdHMgb3duIHZhcmlhYmxlcy4gIEZvciBleGFtcGxlLCB0aGUgZGF0YSBvdXRwdXQgc2VjdGlvbiBtYXkgbm90CitkZXBlbmQgb24gYW55IG9mIHRoZSB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY3VycmVudCBzY2FuIGluIHRoZSBKUEVHCitmaWxlLCBiZWNhdXNlIHRoZXNlIG1heSBjaGFuZ2UgYXMgdGhlIGRhdGEgaW5wdXQgc2VjdGlvbiBhZHZhbmNlcyBpbnRvIGEgbmV3CitzY2FuLgorCitUaGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyAoc29tZXdoYXQgYXJiaXRyYXJpbHkpIGRlZmluZWQgdG8gdHJlYXQgaW5wdXQgb2YgdGhlCitmaWxlIGFzIG9uZSBwYXNzIHdoZW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSBpcyBub3QgdXNlZCwgYW5kIHRvIGlnbm9yZSBkYXRhCitpbnB1dCB3b3JrIGNvbXBsZXRlbHkgd2hlbiBidWZmZXJlZC1pbWFnZSBtb2RlIGlzIHVzZWQuICBOb3RlIHRoYXQgdGhlCitsaWJyYXJ5IGhhcyBubyByZWxpYWJsZSB3YXkgdG8gcHJlZGljdCB0aGUgbnVtYmVyIG9mIHBhc3NlcyB3aGVuIGRlYWxpbmcKK3dpdGggYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUsIG5vciBjYW4gaXQgcHJlZGljdCB0aGUgbnVtYmVyIG9mIG91dHB1dCBwYXNzZXMKK2luIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICBTbyB0aGUgd29yayBlc3RpbWF0ZSBpcyBpbmhlcmVudGx5IGJvZ3VzIGFueXdheS4KKworTm8gY29tcGFyYWJsZSBkaXZpc2lvbiBpcyBjdXJyZW50bHkgbWFkZSBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwgYmVjYXVzZQordGhlcmUgaXNuJ3QgYW55IHJlYWwgbmVlZCBmb3IgaXQuCisKKworKioqIERhdGEgZm9ybWF0cyAqKioKKworQXJyYXlzIG9mIHBpeGVsIHNhbXBsZSB2YWx1ZXMgdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmU6CisKKyAgICB0eXBlZGVmIHNvbWV0aGluZyBKU0FNUExFOwkJYSBwaXhlbCBjb21wb25lbnQgdmFsdWUsIDAuLk1BWEpTQU1QTEUKKyAgICB0eXBlZGVmIEpTQU1QTEUgKkpTQU1QUk9XOwkJcHRyIHRvIGEgcm93IG9mIHNhbXBsZXMKKyAgICB0eXBlZGVmIEpTQU1QUk9XICpKU0FNUEFSUkFZOwlwdHIgdG8gYSBsaXN0IG9mIHJvd3MKKyAgICB0eXBlZGVmIEpTQU1QQVJSQVkgKkpTQU1QSU1BR0U7CXB0ciB0byBhIGxpc3Qgb2YgY29sb3ItY29tcG9uZW50IGFycmF5cworCitUaGUgYmFzaWMgZWxlbWVudCB0eXBlIEpTQU1QTEUgd2lsbCB0eXBpY2FsbHkgYmUgb25lIG9mIHVuc2lnbmVkIGNoYXIsCisoc2lnbmVkKSBjaGFyLCBvciBzaG9ydC4gIFNob3J0IHdpbGwgYmUgdXNlZCBpZiBzYW1wbGVzIHdpZGVyIHRoYW4gOCBiaXRzIGFyZQordG8gYmUgc3VwcG9ydGVkICh0aGlzIGlzIGEgY29tcGlsZS10aW1lIG9wdGlvbikuICBPdGhlcndpc2UsIHVuc2lnbmVkIGNoYXIgaXMKK3VzZWQgaWYgcG9zc2libGUuICBJZiB0aGUgY29tcGlsZXIgb25seSBzdXBwb3J0cyBzaWduZWQgY2hhcnMsIHRoZW4gaXQgaXMKK25lY2Vzc2FyeSB0byBtYXNrIG9mZiB0aGUgdmFsdWUgd2hlbiByZWFkaW5nLiAgVGh1cywgYWxsIHJlYWRzIG9mIEpTQU1QTEUKK3ZhbHVlcyBtdXN0IGJlIGNvZGVkIGFzICJHRVRKU0FNUExFKHZhbHVlKSIsIHdoZXJlIHRoZSBtYWNybyB3aWxsIGJlIGRlZmluZWQKK2FzICIoKHZhbHVlKSAmIDB4RkYpIiBvbiBzaWduZWQtY2hhciBtYWNoaW5lcyBhbmQgIigoaW50KSAodmFsdWUpKSIgZWxzZXdoZXJlLgorCitXaXRoIHRoZXNlIGNvbnZlbnRpb25zLCBKU0FNUExFIHZhbHVlcyBjYW4gYmUgYXNzdW1lZCB0byBiZSA+PSAwLiAgVGhpcyBoZWxwcworc2ltcGxpZnkgY29ycmVjdCByb3VuZGluZyBkdXJpbmcgZG93bnNhbXBsaW5nLCBldGMuICBUaGUgSlBFRyBzdGFuZGFyZCdzCitzcGVjaWZpY2F0aW9uIHRoYXQgc2FtcGxlIHZhbHVlcyBydW4gZnJvbSAtMTI4Li4xMjcgaXMgYWNjb21tb2RhdGVkIGJ5CitzdWJ0cmFjdGluZyAxMjgganVzdCBhcyB0aGUgc2FtcGxlIHZhbHVlIGlzIGNvcGllZCBpbnRvIHRoZSBzb3VyY2UgYXJyYXkgZm9yCit0aGUgRENUIHN0ZXAgKHRoaXMgd2lsbCBiZSBhbiBhcnJheSBvZiBzaWduZWQgaW50cykuICBTaW1pbGFybHksIGR1cmluZworZGVjb21wcmVzc2lvbiB0aGUgb3V0cHV0IG9mIHRoZSBJRENUIHN0ZXAgd2lsbCBiZSBpbW1lZGlhdGVseSBzaGlmdGVkIGJhY2sgdG8KKzAuLjI1NS4gIChOQjogZGlmZmVyZW50IHZhbHVlcyBhcmUgcmVxdWlyZWQgd2hlbiAxMi1iaXQgc2FtcGxlcyBhcmUgaW4gdXNlLgorVGhlIGNvZGUgaXMgd3JpdHRlbiBpbiB0ZXJtcyBvZiBNQVhKU0FNUExFIGFuZCBDRU5URVJKU0FNUExFLCB3aGljaCB3aWxsIGJlCitkZWZpbmVkIGFzIDI1NSBhbmQgMTI4IHJlc3BlY3RpdmVseSBpbiBhbiA4LWJpdCBpbXBsZW1lbnRhdGlvbiwgYW5kIGFzIDQwOTUKK2FuZCAyMDQ4IGluIGEgMTItYml0IGltcGxlbWVudGF0aW9uLikKKworV2UgdXNlIGEgcG9pbnRlciBwZXIgcm93LCByYXRoZXIgdGhhbiBhIHR3by1kaW1lbnNpb25hbCBKU0FNUExFIGFycmF5LiAgVGhpcworY2hvaWNlIGNvc3RzIG9ubHkgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGFuZCBoYXMgc2V2ZXJhbCBiZW5lZml0czoKKyogQ29kZSB1c2luZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZG9lc24ndCBuZWVkIHRvIGtub3cgdGhlIGFsbG9jYXRlZCB3aWR0aCBvZgorICB0aGUgcm93cy4gIFRoaXMgc2ltcGxpZmllcyBlZGdlIGV4cGFuc2lvbi9jb21wcmVzc2lvbiwgc2luY2Ugd2UgY2FuIHdvcmsKKyAgaW4gYW4gYXJyYXkgdGhhdCdzIHdpZGVyIHRoYW4gdGhlIGxvZ2ljYWwgcGljdHVyZSB3aWR0aC4KKyogSW5kZXhpbmcgZG9lc24ndCByZXF1aXJlIG11bHRpcGxpY2F0aW9uOyB0aGlzIGlzIGEgcGVyZm9ybWFuY2Ugd2luIG9uIG1hbnkKKyAgbWFjaGluZXMuCisqIEFycmF5cyB3aXRoIG1vcmUgdGhhbiA2NEsgdG90YWwgZWxlbWVudHMgY2FuIGJlIHN1cHBvcnRlZCBldmVuIG9uIG1hY2hpbmVzCisgIHdoZXJlIG1hbGxvYygpIGNhbm5vdCBhbGxvY2F0ZSBjaHVua3MgbGFyZ2VyIHRoYW4gNjRLLgorKiBUaGUgcm93cyBmb3JtaW5nIGEgY29tcG9uZW50IGFycmF5IG1heSBiZSBhbGxvY2F0ZWQgYXQgZGlmZmVyZW50IHRpbWVzCisgIHdpdGhvdXQgZXh0cmEgY29weWluZy4gIFRoaXMgdHJpY2sgYWxsb3dzIHNvbWUgc3BlZWR1cHMgaW4gc21vb3RoaW5nIHN0ZXBzCisgIHRoYXQgbmVlZCBhY2Nlc3MgdG8gdGhlIHByZXZpb3VzIGFuZCBuZXh0IHJvd3MuCisKK05vdGUgdGhhdCBlYWNoIGNvbG9yIGNvbXBvbmVudCBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBhcnJheTsgd2UgZG9uJ3QgdXNlIHRoZQordHJhZGl0aW9uYWwgbGF5b3V0IGluIHdoaWNoIHRoZSBjb21wb25lbnRzIG9mIGEgcGl4ZWwgYXJlIHN0b3JlZCB0b2dldGhlci4KK1RoaXMgc2ltcGxpZmllcyBjb2Rpbmcgb2YgbW9kdWxlcyB0aGF0IHdvcmsgb24gZWFjaCBjb21wb25lbnQgaW5kZXBlbmRlbnRseSwKK2JlY2F1c2UgdGhleSBkb24ndCBuZWVkIHRvIGtub3cgaG93IG1hbnkgY29tcG9uZW50cyB0aGVyZSBhcmUuICBGdXJ0aGVybW9yZSwKK3dlIGNhbiByZWFkIG9yIHdyaXRlIGVhY2ggY29tcG9uZW50IHRvIGEgdGVtcG9yYXJ5IGZpbGUgaW5kZXBlbmRlbnRseSwgd2hpY2gKK2lzIGhlbHBmdWwgd2hlbiBkZWFsaW5nIHdpdGggbm9uaW50ZXJsZWF2ZWQgSlBFRyBmaWxlcy4KKworSW4gZ2VuZXJhbCwgYSBzcGVjaWZpYyBzYW1wbGUgdmFsdWUgaXMgYWNjZXNzZWQgYnkgY29kZSBzdWNoIGFzCisJR0VUSlNBTVBMRShpbWFnZVtjb2xvcmNvbXBvbmVudF1bcm93XVtjb2xdKQord2hlcmUgY29sIGlzIG1lYXN1cmVkIGZyb20gdGhlIGltYWdlIGxlZnQgZWRnZSwgYnV0IHJvdyBpcyBtZWFzdXJlZCBmcm9tIHRoZQorZmlyc3Qgc2FtcGxlIHJvdyBjdXJyZW50bHkgaW4gbWVtb3J5LiAgRWl0aGVyIG9mIHRoZSBmaXJzdCB0d28gaW5kZXhpbmdzIGNhbgorYmUgcHJlY29tcHV0ZWQgYnkgY29weWluZyB0aGUgcmVsZXZhbnQgcG9pbnRlci4KKworCitTaW5jZSBtb3N0IGltYWdlLXByb2Nlc3NpbmcgYXBwbGljYXRpb25zIHByZWZlciB0byB3b3JrIG9uIGltYWdlcyBpbiB3aGljaAordGhlIGNvbXBvbmVudHMgb2YgYSBwaXhlbCBhcmUgc3RvcmVkIHRvZ2V0aGVyLCB0aGUgZGF0YSBwYXNzZWQgdG8gb3IgZnJvbSB0aGUKK3N1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHRyYWRpdGlvbmFsIGNvbnZlbnRpb246IGEgc2luZ2xlIHBpeGVsIGlzCityZXByZXNlbnRlZCBieSBOIGNvbnNlY3V0aXZlIEpTQU1QTEUgdmFsdWVzLCBhbmQgYW4gaW1hZ2Ugcm93IGlzIGFuIGFycmF5IG9mCisoIyBvZiBjb2xvciBjb21wb25lbnRzKSooaW1hZ2Ugd2lkdGgpIEpTQU1QTEVzLiAgT25lIG9yIG1vcmUgcm93cyBvZiBkYXRhIGNhbgorYmUgcmVwcmVzZW50ZWQgYnkgYSBwb2ludGVyIG9mIHR5cGUgSlNBTVBBUlJBWSBpbiB0aGlzIHNjaGVtZS4gIFRoaXMgc2NoZW1lIGlzCitjb252ZXJ0ZWQgdG8gY29tcG9uZW50LXdpc2Ugc3RvcmFnZSBpbnNpZGUgdGhlIEpQRUcgbGlicmFyeS4gIChBcHBsaWNhdGlvbnMKK3RoYXQgd2FudCB0byBza2lwIEpQRUcgcHJlcHJvY2Vzc2luZyBvciBwb3N0cHJvY2Vzc2luZyB3aWxsIGhhdmUgdG8gY29udGVuZAord2l0aCBjb21wb25lbnQtd2lzZSBzdG9yYWdlLikKKworCitBcnJheXMgb2YgRENULWNvZWZmaWNpZW50IHZhbHVlcyB1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZToKKworICAgIHR5cGVkZWYgc2hvcnQgSkNPRUY7CQlhIDE2LWJpdCBzaWduZWQgaW50ZWdlcgorICAgIHR5cGVkZWYgSkNPRUYgSkJMT0NLW0RDVFNJWkUyXTsJYW4gOHg4IGJsb2NrIG9mIGNvZWZmaWNpZW50cworICAgIHR5cGVkZWYgSkJMT0NLICpKQkxPQ0tST1c7CQlwdHIgdG8gb25lIGhvcml6b250YWwgcm93IG9mIDh4OCBibG9ja3MKKyAgICB0eXBlZGVmIEpCTE9DS1JPVyAqSkJMT0NLQVJSQVk7CXB0ciB0byBhIGxpc3Qgb2Ygc3VjaCByb3dzCisgICAgdHlwZWRlZiBKQkxPQ0tBUlJBWSAqSkJMT0NLSU1BR0U7CXB0ciB0byBhIGxpc3Qgb2YgY29sb3IgY29tcG9uZW50IGFycmF5cworCitUaGUgdW5kZXJseWluZyB0eXBlIGlzIGF0IGxlYXN0IGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyOyB3aGlsZSAic2hvcnQiIGlzIGJpZworZW5vdWdoIG9uIGFsbCBtYWNoaW5lcyBvZiBpbnRlcmVzdCwgb24gc29tZSBtYWNoaW5lcyBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZQorImludCIgZm9yIHNwZWVkIHJlYXNvbnMsIGRlc3BpdGUgdGhlIHN0b3JhZ2UgY29zdC4gIENvZWZmaWNpZW50cyBhcmUgZ3JvdXBlZAoraW50byA4eDggYmxvY2tzIChidXQgd2UgYWx3YXlzIHVzZSAjZGVmaW5lcyBEQ1RTSVpFIGFuZCBEQ1RTSVpFMiByYXRoZXIgdGhhbgorIjgiIGFuZCAiNjQiKS4KKworVGhlIGNvbnRlbnRzIG9mIGEgY29lZmZpY2llbnQgYmxvY2sgbWF5IGJlIGluIGVpdGhlciAibmF0dXJhbCIgb3IgemlnemFnZ2VkCitvcmRlciwgYW5kIG1heSBiZSB0cnVlIHZhbHVlcyBvciBkaXZpZGVkIGJ5IHRoZSBxdWFudGl6YXRpb24gY29lZmZpY2llbnRzLAorZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBibG9jayBpcyBpbiB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZS4gIEluIHRoZSBjdXJyZW50CitsaWJyYXJ5LCBjb2VmZmljaWVudCBibG9ja3MgYXJlIGtlcHQgaW4gbmF0dXJhbCBvcmRlciBldmVyeXdoZXJlOyB0aGUgZW50cm9weQorY29kZWNzIHppZ3phZyBvciBkZXppZ3phZyB0aGUgZGF0YSBhcyBpdCBpcyB3cml0dGVuIG9yIHJlYWQuICBUaGUgYmxvY2tzCitjb250YWluIHF1YW50aXplZCBjb2VmZmljaWVudHMgZXZlcnl3aGVyZSBvdXRzaWRlIHRoZSBEQ1QvSURDVCBzdWJzeXN0ZW1zLgorKFRoaXMgbGF0dGVyIGRlY2lzaW9uIG1heSBuZWVkIHRvIGJlIHJldmlzaXRlZCB0byBzdXBwb3J0IHZhcmlhYmxlCitxdWFudGl6YXRpb24gYSBsYSBKUEVHIFBhcnQgMy4pCisKK05vdGljZSB0aGF0IHRoZSBhbGxvY2F0aW9uIHVuaXQgaXMgbm93IGEgcm93IG9mIDh4OCBibG9ja3MsIGNvcnJlc3BvbmRpbmcgdG8KK2VpZ2h0IHJvd3Mgb2Ygc2FtcGxlcy4gIE90aGVyd2lzZSB0aGUgc3RydWN0dXJlIGlzIG11Y2ggdGhlIHNhbWUgYXMgZm9yCitzYW1wbGVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbnMuCisKK09uIG1hY2hpbmVzIHdoZXJlIG1hbGxvYygpIGNhbid0IGhhbmRsZSBhIHJlcXVlc3QgYmlnZ2VyIHRoYW4gNjRLYiwgdGhpcyBkYXRhCitzdHJ1Y3R1cmUgbGltaXRzIHVzIHRvIHJvd3Mgb2YgbGVzcyB0aGFuIDUxMiBKQkxPQ0tzLCBvciBhIHBpY3R1cmUgd2lkdGggb2YKKzQwMDArIHBpeGVscy4gIFRoaXMgc2VlbXMgYW4gYWNjZXB0YWJsZSByZXN0cmljdGlvbi4KKworCitPbiA4MHg4NiBtYWNoaW5lcywgdGhlIGJvdHRvbS1sZXZlbCBwb2ludGVyIHR5cGVzIChKU0FNUFJPVyBhbmQgSkJMT0NLUk9XKQorbXVzdCBiZSBkZWNsYXJlZCBhcyAiZmFyIiBwb2ludGVycywgYnV0IHRoZSB1cHBlciBsZXZlbHMgY2FuIGJlICJuZWFyIgorKGltcGx5aW5nIHRoYXQgdGhlIHBvaW50ZXIgbGlzdHMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgRFMgc2VnbWVudCkuCitXZSB1c2UgYSAjZGVmaW5lIHN5bWJvbCBGQVIsIHdoaWNoIGV4cGFuZHMgdG8gdGhlICJmYXIiIGtleXdvcmQgd2hlbgorY29tcGlsaW5nIG9uIDgweDg2IG1hY2hpbmVzIGFuZCB0byBub3RoaW5nIGVsc2V3aGVyZS4KKworCisqKiogU3VzcGVuZGFibGUgcHJvY2Vzc2luZyAqKioKKworSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgaXMgZGVzaXJhYmxlIHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGFzIGFuCitpbmNyZW1lbnRhbCwgbWVtb3J5LXRvLW1lbW9yeSBmaWx0ZXIuICBJbiB0aGlzIHNpdHVhdGlvbiB0aGUgZGF0YSBzb3VyY2Ugb3IKK2Rlc3RpbmF0aW9uIG1heSBiZSBhIGxpbWl0ZWQtc2l6ZSBidWZmZXIsIGFuZCB3ZSBjYW4ndCByZWx5IG9uIGJlaW5nIGFibGUgdG8KK2VtcHR5IG9yIHJlZmlsbCB0aGUgYnVmZmVyIGF0IGFyYml0cmFyeSB0aW1lcy4gIEluc3RlYWQgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCitsaWtlIHRvIGhhdmUgY29udHJvbCByZXR1cm4gZnJvbSB0aGUgbGlicmFyeSBhdCBidWZmZXIgb3ZlcmZsb3cvdW5kZXJydW4sIGFuZAordGhlbiByZXN1bWUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBhdCBhIGxhdGVyIHRpbWUuCisKK1RoaXMgc2NlbmFyaW8gaXMgc3VwcG9ydGVkIGZvciBzaW1wbGUgY2FzZXMuICAoRm9yIGFueXRoaW5nIG1vcmUgY29tcGxleCwgd2UKK3JlY29tbWVuZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiAiYml0ZSB0aGUgYnVsbGV0IiBhbmQgZGV2ZWxvcCByZWFsIG11bHRpdGFza2luZworY2FwYWJpbGl0eS4pICBUaGUgbGlianBlZy5kb2MgZmlsZSBnb2VzIGludG8gbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHVzYWdlIGFuZAorbGltaXRhdGlvbnMgb2YgdGhpcyBjYXBhYmlsaXR5OyBoZXJlIHdlIGFkZHJlc3MgdGhlIGltcGxpY2F0aW9ucyBmb3IgbGlicmFyeQorc3RydWN0dXJlLgorCitUaGUgZXNzZW5jZSBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBlbnRyb3B5IGNvZGVjIChjb2RlciBvciBkZWNvZGVyKSBtdXN0CitiZSBwcmVwYXJlZCB0byBzdG9wIGF0IGFyYml0cmFyeSB0aW1lcy4gIEluIHR1cm4sIHRoZSBjb250cm9sbGVycyB0aGF0IGNhbGwKK3RoZSBlbnRyb3B5IGNvZGVjIG11c3QgYmUgYWJsZSB0byBzdG9wIGJlZm9yZSBoYXZpbmcgcHJvZHVjZWQgb3IgY29uc3VtZWQgYWxsCit0aGUgZGF0YSB0aGF0IHRoZXkgbm9ybWFsbHkgd291bGQgaGFuZGxlIGluIG9uZSBjYWxsLiAgVGhhdCBwYXJ0IGlzIHJlYXNvbmFibHkKK3N0cmFpZ2h0Zm9yd2FyZDogd2UgbWFrZSB0aGUgY29udHJvbGxlciBjYWxsIGludGVyZmFjZXMgaW5jbHVkZSAicHJvZ3Jlc3MKK2NvdW50ZXJzIiB3aGljaCBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGRhdGEgY2h1bmtzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGFuZAord2UgcmVxdWlyZSBjYWxsZXJzIHRvIHRlc3QgdGhlIGNvdW50ZXIgcmF0aGVyIHRoYW4ganVzdCBhc3N1bWUgYWxsIG9mIHRoZSBkYXRhCit3YXMgcHJvY2Vzc2VkLgorCitSYXRoZXIgdGhhbiB0cnlpbmcgdG8gcmVzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBjdXJyZW50IEh1ZmZtYW4KK2NvZGVjcyBhcmUgZGVzaWduZWQgdG8gcmVzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IE1DVSBhZnRlciBhCitzdXNwZW5zaW9uIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3cvdW5kZXJydW4uICBBdCB0aGUgc3RhcnQgb2YgZWFjaCBjYWxsLCB0aGUKK2NvZGVjJ3MgaW50ZXJuYWwgc3RhdGUgaXMgbG9hZGVkIGZyb20gcGVybWFuZW50IHN0b3JhZ2UgKGluIHRoZSBKUEVHIG9iamVjdAorc3RydWN0dXJlcykgaW50byBsb2NhbCB2YXJpYWJsZXMuICBPbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIE1DVSwgdGhlCitwZXJtYW5lbnQgc3RhdGUgaXMgdXBkYXRlZC4gIChUaGlzIGNvcHlpbmcgaXMgbm90IHZlcnkgZXhwZW5zaXZlLCBhbmQgbWF5IGV2ZW4KK2xlYWQgdG8gKmltcHJvdmVkKiBwZXJmb3JtYW5jZSBpZiB0aGUgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSByZWdpc3Rlcml6ZWQuKQorSWYgYSBzdXNwZW5zaW9uIG9jY3VycywgdGhlIGNvZGVjIHNpbXBseSByZXR1cm5zIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHN0YXRlLAordGh1cyBlZmZlY3RpdmVseSByZXZlcnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBNQ1UuICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzCitsZWF2aW5nIHNvbWUgZGF0YSB1bnByb2Nlc3NlZCBpbiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGJ1ZmZlciAoaWUsIHRoZQorY29tcHJlc3NlZCBwYXJ0aWFsIE1DVSkuICBUaGUgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbW9kdWxlIGludGVyZmFjZXMgYXJlCitzcGVjaWZpZWQgc28gYXMgdG8gbWFrZSB0aGlzIHBvc3NpYmxlLiAgVGhpcyBhbHNvIGltcGxpZXMgdGhhdCB0aGUgZGF0YSBidWZmZXIKK211c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSB3b3JzdC1jYXNlIGNvbXByZXNzZWQgTUNVOyBhIGNvdXBsZSB0aG91c2FuZAorYnl0ZXMgc2hvdWxkIGJlIGVub3VnaC4KKworSW4gYSBzdWNjZXNzaXZlLWFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBzY2FuLCB0aGUgcHJvZ3Jlc3NpdmUgSHVmZm1hbgorZGVjb2RlciBoYXMgdG8gYmUgYWJsZSB0byB1bmRvIGFzc2lnbm1lbnRzIG9mIG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnRzIGlmIGl0CitzdXNwZW5kcyBiZWZvcmUgdGhlIE1DVSBpcyBjb21wbGV0ZSwgc2luY2UgZGVjb2RpbmcgcmVxdWlyZXMgZGlzdGluZ3Vpc2hpbmcKK3ByZXZpb3VzbHktemVybyBhbmQgcHJldmlvdXNseS1ub256ZXJvIGNvZWZmaWNpZW50cy4gIFRoaXMgaXMgYSBiaXQgdGVkaW91cworYnV0IHByb2JhYmx5IHdvbid0IGhhdmUgbXVjaCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuICBPdGhlciB2YXJpYW50cyBvZiBIdWZmbWFuCitkZWNvZGluZyBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGlzLCBzaW5jZSB0aGV5IHdpbGwganVzdCBzdG9yZSB0aGUgc2FtZSB2YWx1ZXMKK2FnYWluIGlmIGZvcmNlZCB0byByZXBlYXQgdGhlIE1DVS4KKworVGhpcyBhcHByb2FjaCB3b3VsZCBwcm9iYWJseSBub3Qgd29yayBmb3IgYW4gYXJpdGhtZXRpYyBjb2RlYywgc2luY2UgaXRzCittb2RpZmlhYmxlIHN0YXRlIGlzIHF1aXRlIGxhcmdlIGFuZCBjb3VsZG4ndCBiZSBjb3BpZWQgY2hlYXBseS4gIEluc3RlYWQgaXQKK3dvdWxkIGhhdmUgdG8gc3VzcGVuZCBhbmQgcmVzdW1lIGV4YWN0bHkgYXQgdGhlIHBvaW50IG9mIHRoZSBidWZmZXIgZW5kLgorCitUaGUgSlBFRyBtYXJrZXIgcmVhZGVyIGlzIGRlc2lnbmVkIHRvIGNvcGUgd2l0aCBzdXNwZW5zaW9uIGF0IGFuIGFyYml0cmFyeQorcG9pbnQuICBJdCBkb2VzIHNvIGJ5IGJhY2tpbmcgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXJrZXIgcGFyYW1ldGVyIHNlZ21lbnQsCitzbyB0aGUgZGF0YSBidWZmZXIgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGxhcmdlc3QgbWFya2VyIG9mIGludGVyZXN0LgorQWdhaW4sIGEgY291cGxlIEtCIHNob3VsZCBiZSBhZGVxdWF0ZS4gIChBIHNwZWNpYWwgInNraXAiIGNvbnZlbnRpb24gaXMgdXNlZAordG8gYnlwYXNzIENPTSBhbmQgQVBQbiBtYXJrZXJzLCBzbyB0aGVzZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplCit3aXRob3V0IGNhdXNpbmcgcHJvYmxlbXM7IG90aGVyd2lzZSBhIDY0SyBidWZmZXIgd291bGQgYmUgbmVlZGVkIGluIHRoZSB3b3JzdAorY2FzZS4pCisKK1RoZSBKUEVHIG1hcmtlciB3cml0ZXIgY3VycmVudGx5IGRvZXMgKm5vdCogY29wZSB3aXRoIHN1c3BlbnNpb24uICBJIGZlZWwgdGhhdAordGhpcyBpcyBub3QgbmVjZXNzYXJ5OyBpdCBpcyBtdWNoIGVhc2llciBzaW1wbHkgdG8gcmVxdWlyZSB0aGUgYXBwbGljYXRpb24gdG8KK2Vuc3VyZSB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHNwYWNlIGJlZm9yZSBzdGFydGluZy4gIChBbiBlbXB0eSAySyBidWZmZXIgaXMKK21vcmUgdGhhbiBzdWZmaWNpZW50IGZvciB0aGUgaGVhZGVyIG1hcmtlcnM7IGFuZCBlbnN1cmluZyB0aGVyZSBhcmUgYSBkb3plbiBvcgordHdvIGJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHdpbGwgc3VmZmljZSBmb3IgdGhlCit0cmFpbGVyLikgIFRoaXMgd291bGQgbm90IHdvcmsgZm9yIHdyaXRpbmcgbXVsdGktc2NhbiBKUEVHIGZpbGVzLCBidXQKK3dlIHNpbXBseSBkbyBub3QgaW50ZW5kIHRvIHN1cHBvcnQgdGhhdCBjYXBhYmlsaXR5IHdpdGggc3VzcGVuc2lvbi4KKworCisqKiogTWVtb3J5IG1hbmFnZXIgc2VydmljZXMgKioqCisKK1RoZSBKUEVHIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciBjb250cm9scyBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gb2YKK21lbW9yeSwgYW5kIGl0IG1hbmFnZXMgbGFyZ2UgInZpcnR1YWwiIGRhdGEgYXJyYXlzIG9uIG1hY2hpbmVzIHdoZXJlIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHZpcnR1YWwgbWVtb3J5LiAgTm90ZSB0aGF0IHRoZSBzYW1lCittZW1vcnkgbWFuYWdlciBzZXJ2ZXMgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zLgorCitJbiBhbGwgY2FzZXMsIGFsbG9jYXRlZCBvYmplY3RzIGFyZSB0aWVkIHRvIGEgcGFydGljdWxhciBjb21wcmVzc2lvbiBvcgorZGVjb21wcmVzc2lvbiBtYXN0ZXIgcmVjb3JkLCBhbmQgdGhleSB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gdGhhdCBtYXN0ZXIKK3JlY29yZCBpcyBkZXN0cm95ZWQuCisKK1RoZSBtZW1vcnkgbWFuYWdlciBkb2VzIG5vdCBwcm92aWRlIGV4cGxpY2l0IGRlYWxsb2NhdGlvbiBvZiBvYmplY3RzLgorSW5zdGVhZCwgb2JqZWN0cyBhcmUgY3JlYXRlZCBpbiAicG9vbHMiIG9mIGZyZWUgc3RvcmFnZSwgYW5kIGEgd2hvbGUgcG9vbAorY2FuIGJlIGZyZWVkIGF0IG9uY2UuICBUaGlzIGFwcHJvYWNoIGhlbHBzIHByZXZlbnQgc3RvcmFnZS1sZWFrIGJ1Z3MsIGFuZAoraXQgc3BlZWRzIHVwIG9wZXJhdGlvbnMgd2hlbmV2ZXIgbWFsbG9jL2ZyZWUgYXJlIHNsb3cgKGFzIHRoZXkgb2Z0ZW4gYXJlKS4KK1RoZSBwb29scyBjYW4gYmUgcmVnYXJkZWQgYXMgbGlmZXRpbWUgaWRlbnRpZmllcnMgZm9yIG9iamVjdHMuICBUd28KK3Bvb2xzL2xpZmV0aW1lcyBhcmUgZGVmaW5lZDoKKyAgKiBKUE9PTF9QRVJNQU5FTlQJbGFzdHMgdW50aWwgbWFzdGVyIHJlY29yZCBpcyBkZXN0cm95ZWQKKyAgKiBKUE9PTF9JTUFHRQkJbGFzdHMgdW50aWwgZG9uZSB3aXRoIGltYWdlIChKUEVHIGRhdGFzdHJlYW0pCitQZXJtYW5lbnQgbGlmZXRpbWUgaXMgdXNlZCBmb3IgcGFyYW1ldGVycyBhbmQgdGFibGVzIHRoYXQgc2hvdWxkIGJlIGNhcnJpZWQKK2Fjcm9zcyBmcm9tIG9uZSBkYXRhc3RyZWFtIHRvIGFub3RoZXI7IHRoaXMgaW5jbHVkZXMgYWxsIGFwcGxpY2F0aW9uLXZpc2libGUKK3BhcmFtZXRlcnMuICBJbWFnZSBsaWZldGltZSBpcyB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuICAoQSB0aGlyZCBsaWZldGltZSwKK0pQT09MX1BBU1MgPSBvbmUgcHJvY2Vzc2luZyBwYXNzLCB3YXMgb3JpZ2luYWxseSBwbGFubmVkLiAgSG93ZXZlciBpdCB3YXMKK2Ryb3BwZWQgYXMgbm90IGJlaW5nIHdvcnRod2hpbGUuICBUaGUgYWN0dWFsIHVzYWdlIHBhdHRlcm5zIGFyZSBzdWNoIHRoYXQgdGhlCitwZWFrIG1lbW9yeSB1c2FnZSB3b3VsZCBiZSBhYm91dCB0aGUgc2FtZSBhbnl3YXk7IGFuZCBoYXZpbmcgcGVyLXBhc3Mgc3RvcmFnZQorc3Vic3RhbnRpYWxseSBjb21wbGljYXRlcyB0aGUgdmlydHVhbCBtZW1vcnkgYWxsb2NhdGlvbiBydWxlcyAtLS0gc2VlIGJlbG93LikKKworVGhlIG1lbW9yeSBtYW5hZ2VyIGRlYWxzIHdpdGggdGhyZWUga2luZHMgb2Ygb2JqZWN0OgorMS4gIlNtYWxsIiBvYmplY3RzLiAgVHlwaWNhbGx5IHRoZXNlIHJlcXVpcmUgbm8gbW9yZSB0aGFuIDEwSy0yMEsgdG90YWwuCisyLiAiTGFyZ2UiIG9iamVjdHMuICBUaGVzZSBtYXkgcmVxdWlyZSB0ZW5zIHRvIGh1bmRyZWRzIG9mIEsgZGVwZW5kaW5nIG9uCisgICBpbWFnZSBzaXplLiAgU2VtYW50aWNhbGx5IHRoZXkgYmVoYXZlIHRoZSBzYW1lIGFzIHNtYWxsIG9iamVjdHMsIGJ1dCB3ZQorICAgZGlzdGluZ3Vpc2ggdGhlbSBmb3IgdHdvIHJlYXNvbnM6CisgICAgICogT24gTVMtRE9TIG1hY2hpbmVzLCBsYXJnZSBvYmplY3RzIGFyZSByZWZlcmVuY2VkIGJ5IEZBUiBwb2ludGVycywKKyAgICAgICBzbWFsbCBvYmplY3RzIGJ5IE5FQVIgcG9pbnRlcnMuCisgICAgICogUG9vbCBhbGxvY2F0aW9uIGhldXJpc3RpY3MgbWF5IGRpZmZlciBmb3IgbGFyZ2UgYW5kIHNtYWxsIG9iamVjdHMuCisgICBOb3RlIHRoYXQgaW5kaXZpZHVhbCAibGFyZ2UiIG9iamVjdHMgY2Fubm90IGV4Y2VlZCB0aGUgc2l6ZSBhbGxvd2VkIGJ5CisgICB0eXBlIHNpemVfdCwgd2hpY2ggbWF5IGJlIDY0SyBvciBsZXNzIG9uIHNvbWUgbWFjaGluZXMuCiszLiAiVmlydHVhbCIgb2JqZWN0cy4gIFRoZXNlIGFyZSBsYXJnZSAyLUQgYXJyYXlzIG9mIEpTQU1QTEVzIG9yIEpCTE9DS3MKKyAgICh0eXBpY2FsbHkgbGFyZ2UgZW5vdWdoIGZvciB0aGUgZW50aXJlIGltYWdlIGJlaW5nIHByb2Nlc3NlZCkuICBUaGUKKyAgIG1lbW9yeSBtYW5hZ2VyIHByb3ZpZGVzIHN0cmlwd2lzZSBhY2Nlc3MgdG8gdGhlc2UgYXJyYXlzLiAgT24gbWFjaGluZXMKKyAgIHdpdGhvdXQgdmlydHVhbCBtZW1vcnksIHRoZSByZXN0IG9mIHRoZSBhcnJheSBtYXkgYmUgc3dhcHBlZCBvdXQgdG8gYQorICAgdGVtcG9yYXJ5IGZpbGUuCisKKyhOb3RlOiBKU0FNUEFSUkFZIGFuZCBKQkxPQ0tBUlJBWSBkYXRhIHN0cnVjdHVyZXMgYXJlIGEgY29tYmluYXRpb24gb2YgbGFyZ2UKK29iamVjdHMgZm9yIHRoZSBkYXRhIHByb3BlciBhbmQgc21hbGwgb2JqZWN0cyBmb3IgdGhlIHJvdyBwb2ludGVycy4gIEZvcgorY29udmVuaWVuY2UgYW5kIHNwZWVkLCB0aGUgbWVtb3J5IG1hbmFnZXIgcHJvdmlkZXMgc2luZ2xlIHJvdXRpbmVzIHRvIGNyZWF0ZQordGhlc2Ugc3RydWN0dXJlcy4gIFNpbWlsYXJseSwgdmlydHVhbCBhcnJheXMgaW5jbHVkZSBhIHNtYWxsIGNvbnRyb2wgYmxvY2sKK2FuZCBhIEpTQU1QQVJSQVkgb3IgSkJMT0NLQVJSQVkgd29ya2luZyBidWZmZXIsIGFsbCBjcmVhdGVkIHdpdGggb25lIGNhbGwuKQorCitJbiB0aGUgcHJlc2VudCBpbXBsZW1lbnRhdGlvbiwgdmlydHVhbCBhcnJheXMgYXJlIG9ubHkgcGVybWl0dGVkIHRvIGhhdmUgaW1hZ2UKK2xpZmVzcGFuLiAgKFBlcm1hbmVudCBsaWZlc3BhbiB3b3VsZCBub3QgYmUgcmVhc29uYWJsZSwgYW5kIHBhc3MgbGlmZXNwYW4gaXMKK25vdCB2ZXJ5IHVzZWZ1bCBzaW5jZSBhIHZpcnR1YWwgYXJyYXkncyByYWlzb24gZCdldHJlIGlzIHRvIHN0b3JlIGRhdGEgZm9yCittdWx0aXBsZSBwYXNzZXMgdGhyb3VnaCB0aGUgaW1hZ2UuKSAgV2UgYWxzbyBleHBlY3QgdGhhdCBvbmx5ICJzbWFsbCIgb2JqZWN0cword2lsbCBiZSBnaXZlbiBwZXJtYW5lbnQgbGlmZXNwYW4sIHRob3VnaCB0aGlzIHJlc3RyaWN0aW9uIGlzIG5vdCByZXF1aXJlZCBieQordGhlIG1lbW9yeSBtYW5hZ2VyLgorCitJbiBhIG5vbi12aXJ0dWFsLW1lbW9yeSBtYWNoaW5lLCBzb21lIHBlcmZvcm1hbmNlIGJlbmVmaXQgY2FuIGJlIGdhaW5lZCBieQorbWFraW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBmb3IgdmlydHVhbCBhcnJheXMgYmUgYXMgbGFyZ2UgYXMgcG9zc2libGUuCisoRm9yIHNtYWxsIGltYWdlcywgdGhlIGJ1ZmZlcnMgbWlnaHQgZml0IGVudGlyZWx5IGluIG1lbW9yeSwgc28gYmxpbmQKK3N3YXBwaW5nIHdvdWxkIGJlIHZlcnkgd2FzdGVmdWwuKSAgVGhlIG1lbW9yeSBtYW5hZ2VyIHdpbGwgYWRqdXN0IHRoZSBoZWlnaHQKK29mIHRoZSBidWZmZXJzIHRvIGZpdCB3aXRoaW4gYSBwcmVzcGVjaWZpZWQgbWF4aW11bSBtZW1vcnkgdXNhZ2UuICBJbiBvcmRlcgordG8gZG8gdGhpcyBpbiBhIHJlYXNvbmFibHkgb3B0aW1hbCBmYXNoaW9uLCB0aGUgbWFuYWdlciBuZWVkcyB0byBhbGxvY2F0ZSBhbGwKK29mIHRoZSB2aXJ0dWFsIGFycmF5cyBhdCBvbmNlLiAgVGhlcmVmb3JlLCB0aGVyZSBpc24ndCBhIG9uZS1zdGVwIGFsbG9jYXRpb24KK3JvdXRpbmUgZm9yIHZpcnR1YWwgYXJyYXlzOyBpbnN0ZWFkLCB0aGVyZSBpcyBhICJyZXF1ZXN0IiByb3V0aW5lIHRoYXQgc2ltcGx5CithbGxvY2F0ZXMgdGhlIGNvbnRyb2wgYmxvY2ssIGFuZCBhICJyZWFsaXplIiByb3V0aW5lIChjYWxsZWQganVzdCBvbmNlKSB0aGF0CitkZXRlcm1pbmVzIHNwYWNlIGFsbG9jYXRpb24gYW5kIGNyZWF0ZXMgYWxsIG9mIHRoZSBhY3R1YWwgYnVmZmVycy4gIFRoZQorcmVhbGl6ZSByb3V0aW5lIG11c3QgYWxsb3cgZm9yIHNwYWNlIG9jY3VwaWVkIGJ5IG5vbi12aXJ0dWFsIGxhcmdlIG9iamVjdHMuCisoV2UgZG9uJ3QgYm90aGVyIHRvIGZhY3RvciBpbiB0aGUgc3BhY2UgbmVlZGVkIGZvciBzbWFsbCBvYmplY3RzLCBvbiB0aGUKK2dyb3VuZHMgdGhhdCBpdCBpc24ndCB3b3J0aCB0aGUgdHJvdWJsZS4pCisKK1RvIHN1cHBvcnQgYWxsIHRoaXMsIHdlIGVzdGFibGlzaCB0aGUgZm9sbG93aW5nIHByb3RvY29sIGZvciBkb2luZyBidXNpbmVzcword2l0aCB0aGUgbWVtb3J5IG1hbmFnZXI6CisgIDEuIE1vZHVsZXMgbXVzdCByZXF1ZXN0IHZpcnR1YWwgYXJyYXlzICh3aGljaCBtYXkgaGF2ZSBvbmx5IGltYWdlIGxpZmVzcGFuKQorICAgICBkdXJpbmcgdGhlIGluaXRpYWwgc2V0dXAgcGhhc2UsIGkuZS4sIGluIHRoZWlyIGppbml0X3h4eCByb3V0aW5lcy4KKyAgMi4gQWxsICJsYXJnZSIgb2JqZWN0cyAoaW5jbHVkaW5nIEpTQU1QQVJSQVlzIGFuZCBKQkxPQ0tBUlJBWXMpIG11c3QgYWxzbyBiZQorICAgICBhbGxvY2F0ZWQgZHVyaW5nIGluaXRpYWwgc2V0dXAuCisgIDMuIHJlYWxpemVfdmlydF9hcnJheXMgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgaW5pdGlhbCBzZXR1cC4KKyAgICAgVGhlIGFib3ZlIGNvbnZlbnRpb25zIGVuc3VyZSB0aGF0IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCisgICAgIGZvciBpdCB0byBjaG9vc2UgYSBnb29kIHNpemUgZm9yIHZpcnR1YWwgYXJyYXkgYnVmZmVycy4KK1NtYWxsIG9iamVjdHMgb2YgYW55IGxpZmVzcGFuIG1heSBiZSBhbGxvY2F0ZWQgYXQgYW55IHRpbWUuICBXZSBleHBlY3QgdGhhdAordGhlIHRvdGFsIHNwYWNlIHVzZWQgZm9yIHNtYWxsIG9iamVjdHMgd2lsbCBiZSBzbWFsbCBlbm91Z2ggdG8gYmUgbmVnbGlnaWJsZQoraW4gdGhlIHJlYWxpemVfdmlydF9hcnJheXMgY29tcHV0YXRpb24uCisKK0luIGEgdmlydHVhbC1tZW1vcnkgbWFjaGluZSwgd2Ugc2ltcGx5IHByZXRlbmQgdGhhdCB0aGUgYXZhaWxhYmxlIHNwYWNlIGlzCitpbmZpbml0ZSwgdGh1cyBjYXVzaW5nIHJlYWxpemVfdmlydF9hcnJheXMgdG8gZGVjaWRlIHRoYXQgaXQgY2FuIGFsbG9jYXRlIGFsbAordGhlIHZpcnR1YWwgYXJyYXlzIGFzIGZ1bGwtc2l6ZSBpbi1tZW1vcnkgYnVmZmVycy4gIFRoZSBvdmVyaGVhZCBvZiB0aGUKK3ZpcnR1YWwtYXJyYXkgYWNjZXNzIHByb3RvY29sIGlzIHZlcnkgc21hbGwgd2hlbiBubyBzd2FwcGluZyBvY2N1cnMuCisKK0EgdmlydHVhbCBhcnJheSBjYW4gYmUgc3BlY2lmaWVkIHRvIGJlICJwcmUtemVyb2VkIjsgd2hlbiB0aGlzIGZsYWcgaXMgc2V0LAorbmV2ZXIteWV0LXdyaXR0ZW4gc2VjdGlvbnMgb2YgdGhlIGFycmF5IGFyZSBzZXQgdG8gemVybyBiZWZvcmUgYmVpbmcgbWFkZQorYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuICBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgbmV2ZXItd3JpdHRlbiBzZWN0aW9ucworb2YgdGhlIGFycmF5IGNvbnRhaW4gZ2FyYmFnZS4gIChUaGlzIGZlYXR1cmUgZXhpc3RzIHByaW1hcmlseSBiZWNhdXNlIHRoZQorZXF1aXZhbGVudCBsb2dpYyB3b3VsZCBvdGhlcndpc2UgYmUgbmVlZGVkIGluIGpkY29lZmN0LmMgZm9yIHByb2dyZXNzaXZlCitKUEVHIG1vZGU7IHdlIG1heSBhcyB3ZWxsIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBwb3NzaWJsZSBvdGhlciB1c2VzLikKKworVGhlIGZpcnN0IHdyaXRlIHBhc3Mgb24gYSB2aXJ0dWFsIGFycmF5IGlzIHJlcXVpcmVkIHRvIG9jY3VyIGluIHRvcC10by1ib3R0b20KK29yZGVyOyByZWFkIHBhc3NlcywgYXMgd2VsbCBhcyBhbnkgd3JpdGUgcGFzc2VzIGFmdGVyIHRoZSBmaXJzdCBvbmUsIG1heQorYWNjZXNzIHRoZSBhcnJheSBpbiBhbnkgb3JkZXIuICBUaGlzIHJlc3RyaWN0aW9uIGV4aXN0cyBwYXJ0bHkgdG8gc2ltcGxpZnkKK3RoZSB2aXJ0dWFsIGFycmF5IGNvbnRyb2wgbG9naWMsIGFuZCBwYXJ0bHkgYmVjYXVzZSBzb21lIGZpbGUgc3lzdGVtcyBtYXkgbm90CitzdXBwb3J0IHNlZWtpbmcgYmV5b25kIHRoZSBjdXJyZW50IGVuZC1vZi1maWxlIGluIGEgdGVtcG9yYXJ5IGZpbGUuICBUaGUgbWFpbgoraW1wbGljYXRpb24gb2YgdGhpcyByZXN0cmljdGlvbiBpcyB0aGF0IHJlYXJyYW5nZW1lbnQgb2Ygcm93cyAoc3VjaCBhcworY29udmVydGluZyB0b3AtdG8tYm90dG9tIGRhdGEgb3JkZXIgdG8gYm90dG9tLXRvLXRvcCkgbXVzdCBiZSBoYW5kbGVkIHdoaWxlCityZWFkaW5nIGRhdGEgb3V0IG9mIHRoZSB2aXJ0dWFsIGFycmF5LCBub3Qgd2hpbGUgcHV0dGluZyBpdCBpbi4KKworCisqKiogTWVtb3J5IG1hbmFnZXIgaW50ZXJuYWwgc3RydWN0dXJlICoqKgorCitUbyBpc29sYXRlIHN5c3RlbSBkZXBlbmRlbmNpZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2UgaGF2ZSBicm9rZW4gdGhlCittZW1vcnkgbWFuYWdlciBpbnRvIHR3byBwYXJ0cy4gIFRoZXJlIGlzIGEgcmVhc29uYWJseSBzeXN0ZW0taW5kZXBlbmRlbnQKKyJmcm9udCBlbmQiIChqbWVtbWdyLmMpIGFuZCBhICJiYWNrIGVuZCIgdGhhdCBjb250YWlucyBvbmx5IHRoZSBjb2RlCitsaWtlbHkgdG8gY2hhbmdlIGFjcm9zcyBzeXN0ZW1zLiAgQWxsIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBtZXRob2RzCitvdXRsaW5lZCBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIGZyb250IGVuZC4gIFRoZSBiYWNrIGVuZCBwcm92aWRlcwordGhlIGZvbGxvd2luZyByb3V0aW5lcyBmb3IgdXNlIGJ5IHRoZSBmcm9udCBlbmQgKG5vbmUgb2YgdGhlc2Ugcm91dGluZXMKK2FyZSBrbm93biB0byB0aGUgcmVzdCBvZiB0aGUgSlBFRyBjb2RlKToKKworanBlZ19tZW1faW5pdCwganBlZ19tZW1fdGVybQlzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uL3NodXRkb3duCisKK2pwZWdfZ2V0X3NtYWxsLCBqcGVnX2ZyZWVfc21hbGwJaW50ZXJmYWNlIHRvIG1hbGxvYyBhbmQgZnJlZSBsaWJyYXJ5IHJvdXRpbmVzCisJCQkJKG9yIHRoZWlyIGVxdWl2YWxlbnRzKQorCitqcGVnX2dldF9sYXJnZSwganBlZ19mcmVlX2xhcmdlCWludGVyZmFjZSB0byBGQVIgbWFsbG9jL2ZyZWUgaW4gTVNET1MgbWFjaGluZXM7CisJCQkJZWxzZSB1c3VhbGx5IHRoZSBzYW1lIGFzCisJCQkJanBlZ19nZXRfc21hbGwvanBlZ19mcmVlX3NtYWxsCisKK2pwZWdfbWVtX2F2YWlsYWJsZQkJZXN0aW1hdGUgYXZhaWxhYmxlIG1lbW9yeQorCitqcGVnX29wZW5fYmFja2luZ19zdG9yZQkJY3JlYXRlIGEgYmFja2luZy1zdG9yZSBvYmplY3QKKworcmVhZF9iYWNraW5nX3N0b3JlLAkJbWFuaXB1bGF0ZSBhIGJhY2tpbmctc3RvcmUgb2JqZWN0Cit3cml0ZV9iYWNraW5nX3N0b3JlLAorY2xvc2VfYmFja2luZ19zdG9yZQorCitPbiBzb21lIHN5c3RlbXMgdGhlcmUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIHR5cGUgb2YgYmFja2luZy1zdG9yZSBvYmplY3QKKyhzcGVjaWZpY2FsbHksIGluIE1TLURPUyBhIGJhY2tpbmcgc3RvcmUgZmlsZSBtaWdodCBiZSBhbiBhcmVhIG9mIGV4dGVuZGVkCittZW1vcnkgYXMgd2VsbCBhcyBhIGRpc2sgZmlsZSkuICBqcGVnX29wZW5fYmFja2luZ19zdG9yZSBpcyByZXNwb25zaWJsZSBmb3IKK2Nob29zaW5nIGhvdyB0byBpbXBsZW1lbnQgYSBnaXZlbiBvYmplY3QuICBUaGUgcmVhZC93cml0ZS9jbG9zZSByb3V0aW5lcworYXJlIG1ldGhvZCBwb2ludGVycyBpbiB0aGUgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGEgZ2l2ZW4gb2JqZWN0OyB0aGlzCitsZXRzIHRoZW0gYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLgorCitJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgZXhwbGljaXRseQorcmVsZWFzZWQgdXBvbiBhYm5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uLiAgRm9yIGV4YW1wbGUsIE1TLURPUyB3b24ndCBmcmVlCitleHRlbmRlZCBtZW1vcnkgYnkgaXRzZWxmLiAgVG8gc3VwcG9ydCB0aGlzLCB3ZSB3aWxsIGV4cGVjdCB0aGUgbWFpbiBwcm9ncmFtCitvciBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiB0byBhcnJhbmdlIHRvIGNhbGwgc2VsZl9kZXN0cnVjdCAodHlwaWNhbGx5IHZpYQoranBlZ19kZXN0cm95KSB1cG9uIGFibm9ybWFsIHRlcm1pbmF0aW9uLiAgVGhpcyBtYXkgcmVxdWlyZSBhIFNJR0lOVCBzaWduYWwKK2hhbmRsZXIgb3IgZXF1aXZhbGVudC4gIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0aGUgYmFjayBlbmQgbW9kdWxlIGluc3RhbGwgaXRzCitvd24gc2lnbmFsIGhhbmRsZXIsIGJlY2F1c2UgdGhhdCB3b3VsZCBwcmUtZW1wdCB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24ncworYWJpbGl0eSB0byBjb250cm9sIHNpZ25hbCBoYW5kbGluZy4KKworVGhlIElKRyBkaXN0cmlidXRpb24gaW5jbHVkZXMgc2V2ZXJhbCBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCBpbXBsZW1lbnRhdGlvbnMuCitVc3VhbGx5IHRoZSBzYW1lIGJhY2sgZW5kIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgYWxsIGFwcGxpY2F0aW9ucyBvbiBhIGdpdmVuCitzeXN0ZW0sIGJ1dCBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gdG8gc3VwcGx5IGl0cyBvd24gYmFjayBlbmQgYXQKK25lZWQuCisKKworKioqIEltcGxpY2F0aW9ucyBvZiBETkwgbWFya2VyICoqKgorCitTb21lIEpQRUcgZmlsZXMgbWF5IHVzZSBhIEROTCBtYXJrZXIgdG8gcG9zdHBvbmUgZGVmaW5pdGlvbiBvZiB0aGUgaW1hZ2UKK2hlaWdodCAodGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yIGEgZmF4LWxpa2Ugc2Nhbm5lcidzIG91dHB1dCwgZm9yIGluc3RhbmNlKS4KK0luIHRoZXNlIGZpbGVzIHRoZSBTT0YgbWFya2VyIGNsYWltcyB0aGUgaW1hZ2UgaGVpZ2h0IGlzIDAsIGFuZCB5b3Ugb25seQorZmluZCBvdXQgdGhlIHRydWUgaW1hZ2UgaGVpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IHNjYW4uCisKK1dlIGNvdWxkIHJlYWQgdGhlc2UgZmlsZXMgYXMgZm9sbG93czoKKzEuIFVwb24gc2VlaW5nIHplcm8gaW1hZ2UgaGVpZ2h0LCByZXBsYWNlIGl0IGJ5IDY1NTM1ICh0aGUgbWF4aW11bSBhbGxvd2VkKS4KKzIuIFdoZW4gdGhlIEROTCBpcyBmb3VuZCwgdXBkYXRlIHRoZSBpbWFnZSBoZWlnaHQgaW4gdGhlIGdsb2JhbCBpbWFnZQorICAgZGVzY3JpcHRvci4KK1RoaXMgaW1wbGllcyB0aGF0IGNvbnRyb2wgbW9kdWxlcyBtdXN0IGF2b2lkIG1ha2luZyBjb3BpZXMgb2YgdGhlIGltYWdlCitoZWlnaHQsIGFuZCBtdXN0IHJlLXRlc3QgZm9yIHRlcm1pbmF0aW9uIGFmdGVyIGVhY2ggTUNVIHJvdy4gIFRoaXMgd291bGQKK2JlIGVhc3kgZW5vdWdoIHRvIGRvLgorCitJbiBjYXNlcyB3aGVyZSBpbWFnZS1zaXplIGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCB0aGlzIGFwcHJvYWNoIHdpbGwKK3Jlc3VsdCBpbiB2ZXJ5IGluZWZmaWNpZW50IHVzZSBvZiB2aXJ0dWFsIG1lbW9yeSBvciBtdWNoLWxhcmdlci10aGFuLW5lY2Vzc2FyeQordGVtcG9yYXJ5IGZpbGVzLiAgVGhpcyBzZWVtcyBhY2NlcHRhYmxlIGZvciBzb21ldGhpbmcgdGhhdCBwcm9iYWJseSB3b24ndCBiZSBhCittYWluc3RyZWFtIHVzYWdlLiAgUGVvcGxlIG1pZ2h0IGhhdmUgdG8gZm9yZ28gdXNlIG9mIG1lbW9yeS1ob2dnaW5nIG9wdGlvbnMKKyhzdWNoIGFzIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiBvciBub25pbnRlcmxlYXZlZCBKUEVHIGZpbGVzKSBpZiB0aGV5Cit3YW50IGVmZmljaWVudCBjb252ZXJzaW9uIG9mIHN1Y2ggZmlsZXMuICAoT25lIGNvdWxkIGltcHJvdmUgZWZmaWNpZW5jeSBieQorZGVtYW5kaW5nIGEgdXNlci1zdXBwbGllZCB1cHBlciBib3VuZCBmb3IgdGhlIGhlaWdodCwgbGVzcyB0aGFuIDY1NTM2OyBpbiBtb3N0CitjYXNlcyBpdCBjb3VsZCBiZSBtdWNoIGxlc3MuKQorCitUaGUgc3RhbmRhcmQgYWxzbyBwZXJtaXRzIHRoZSBTT0YgbWFya2VyIHRvIG92ZXJlc3RpbWF0ZSB0aGUgaW1hZ2UgaGVpZ2h0LAord2l0aCBhIEROTCB0byBnaXZlIHRoZSB0cnVlLCBzbWFsbGVyIGhlaWdodCBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzY2FuLgorVGhpcyB3b3VsZCBzb2x2ZSB0aGUgc3BhY2UgcHJvYmxlbXMgaWYgdGhlIG92ZXJlc3RpbWF0ZSB3YXNuJ3QgdG9vIGdyZWF0LgorSG93ZXZlciwgaXQgaW1wbGllcyB0aGF0IHlvdSBkb24ndCBldmVuIGtub3cgd2hldGhlciBETkwgd2lsbCBiZSB1c2VkLgorCitUaGlzIGxlYWRzIHRvIGEgY291cGxlIG9mIHZlcnkgc2VyaW91cyBvYmplY3Rpb25zOgorMS4gVGVzdGluZyBmb3IgYSBETkwgbWFya2VyIG11c3Qgb2NjdXIgaW4gdGhlIGlubmVyIGxvb3Agb2YgdGhlIGRlY29tcHJlc3NvcidzCisgICBIdWZmbWFuIGRlY29kZXI7IHRoaXMgaW1wbGllcyBhIHNwZWVkIHBlbmFsdHkgd2hldGhlciB0aGUgZmVhdHVyZSBpcyB1c2VkCisgICBvciBub3QuCisyLiBUaGVyZSBpcyBubyB3YXkgdG8gaGlkZSB0aGUgbGFzdC1taW51dGUgY2hhbmdlIGluIGltYWdlIGhlaWdodCBmcm9tIGFuCisgICBhcHBsaWNhdGlvbiB1c2luZyB0aGUgZGVjb2Rlci4gIFRodXMgKmV2ZXJ5KiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgSUpHCisgICBsaWJyYXJ5IHdvdWxkIHN1ZmZlciBhIGNvbXBsZXhpdHkgcGVuYWx0eSB3aGV0aGVyIGl0IGNhcmVkIGFib3V0IEROTCBvcgorICAgbm90LgorV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IEROTCBiZWNhdXNlIG9mIHRoZXNlIHByb2JsZW1zLgorCitBIGRpZmZlcmVudCBhcHByb2FjaCBpcyB0byBpbnNpc3QgdGhhdCBETkwtdXNpbmcgZmlsZXMgYmUgcHJlcHJvY2Vzc2VkIGJ5IGEKK3NlcGFyYXRlIHByb2dyYW0gdGhhdCByZWFkcyBhaGVhZCB0byB0aGUgRE5MLCB0aGVuIGdvZXMgYmFjayBhbmQgZml4ZXMgdGhlIFNPRgorbWFya2VyLiAgVGhpcyBpcyBhIG11Y2ggc2ltcGxlciBzb2x1dGlvbiBhbmQgaXMgcHJvYmFibHkgZmFyIG1vcmUgZWZmaWNpZW50LgorRXZlbiBpZiBvbmUgd2FudHMgcGlwZWQgaW5wdXQsIGJ1ZmZlcmluZyB0aGUgZmlyc3Qgc2NhbiBvZiB0aGUgSlBFRyBmaWxlIG5lZWRzCithIGxvdCBzbWFsbGVyIHRlbXAgZmlsZSB0aGFuIGlzIGltcGxpZWQgYnkgdGhlIG1heGltdW0taGVpZ2h0IG1ldGhvZC4gIEZvcgordGhpcyBhcHByb2FjaCB3ZSdkIHNpbXBseSB0cmVhdCBETkwgYXMgYSBuby1vcCBpbiB0aGUgZGVjb21wcmVzc29yIChhdCBtb3N0LAorY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBTT0YgaW1hZ2UgaGVpZ2h0KS4KKworV2Ugd2lsbCBub3Qgd29ycnkgYWJvdXQgbWFraW5nIHRoZSBjb21wcmVzc29yIGNhcGFibGUgb2Ygb3V0cHV0dGluZyBETkwuCitTb21ldGhpbmcgc2ltaWxhciB0byB0aGUgZmlyc3Qgc2NoZW1lIGFib3ZlIGNvdWxkIGJlIGFwcGxpZWQgaWYgYW55b25lIGV2ZXIKK3dhbnRzIHRvIG1ha2UgdGhhdCB3b3JrLgpkaWZmIC0tZ2l0IGEvanBlZy90ZXN0aW1nLmJtcCBiL2pwZWcvdGVzdGltZy5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwM2QxNQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvdGVzdGltZy5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBlZy90ZXN0aW1nLmpwZyBiL2pwZWcvdGVzdGltZy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0Y2E1ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvdGVzdGltZy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBlZy90ZXN0aW1nLnBwbSBiL2pwZWcvdGVzdGltZy5wcG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4MWNlMgotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvdGVzdGltZy5wcG0KQEAgLTAsMCArMSw0IEBACitQNgorMjI3IDE0OQorMjU1CiswLy0wLy0xMC4yMS81MS41MS42Mi82Mi84My84My86My06My06My06My06My06My06Mi85MS45MS44MC04MC05MS45MS46Mi84MC04MC04MC04MC04MC04MC04MC04MC02Lis2Lis2Lis1LSo1LSo0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCk0LCkyLSkvKiQvLCUvLCUwLSYxLicyLygzMCkzMCk2Myw2Myw3NC04NS44NS45Ni86NzA6Ny5BOjBCPDBEPjJGQDRJQTRKQjVLQzZLQzZNRDVNRDVPQzNOQjJPQzNPQzNQRDRSRTVSPzFZPzJiQDRuQjV9RTaLSDiZRzmjRjevRzq4Rzm+RTrFRzvHRz7KRz/LSEDQRUDnRkztQ0zrREvrRUnuQ0nvQkTxPkL0PUH4O0H3OkD0Oj/wPD/pP0DiQD7XPzzLQTe7PS+1QC61QC60Py20Py2zQC2yPy2vQC2tQCyqQSymQS2iQiyfQCqbQSmYQCqWQSyUPi2SPy+SPy+RPi6RPiyQPSuSPCuSPCuUPyuUPyuUPSqUPSqUPSqVPiuWPyyWQC+WPzaVPjWXPTKfPzGpQjOzRDO8RDS/RDS5PzC1QTKsRjieSDuHSDlvQTJUOCpDMyY9NTI5NTQ5NTQ3MzI3MTE2MDA1MC01MC03Mi83Mi83Mi82MS42MS01MCw1MCw0MSwvLy0uMC0vLy0vLy0wLy0wLy0yLi0yLi01LC00Kyw0KiszKSo3KCs9LjFFNjlQOjxqQkN8SUiNTU2VT0+fV1uqZG6qb4OfdJCUe6OHf66Ahrp+iL1zea1gYZFUS3ZQRGhTSmdPR15NSF5UUWJmZG98fYKNkZCZnpijqZ+iqJqeoJOPkoF7fGxmZ1VYV0VRTkVVUltVUWJVUWIwLy0wLy0xMC4xMC40MC01MS42Mi82Mi84My84My86My06My06My06My06My06My05MS45MS44MC04MC04MC04MC05MS45MS44MC04MC04MC04MC04MC04MC04MC04MC02Lis2Lis1LSo1LSo1LSo0LCk0LCk0LCk1LSo1LSo1LSo1LSo1LSo1LSo1LSozLiowKyUwLSYwLSYxLicyLygzMCk0MSo0MSo2Myw2Myw3NC03NC04NS45Ni86NzA6Ny5AOS9BOy9DPTFFPzNIQDNJQTRKQjVKQjVMQzRMQzRNQTFNQTFNQTFOQjJPQzNRRDRQPjBVPzFeQTNqQzR4RDaERTSSRTWcQzOnQzSvQTS1QTS8QjfARDrERTzFRj3NQ0DhRUnnQknoQ0nqREjtREfvQkTzQEP2P0P4O0H3OkD0Oj/wPD/pP0DgQT7VQDzKQDa5Pi+1QC60Py20Py20Py2yPyywPy2vQC2tQCypQCumQS2hQSufQCqbQSmYQCqWQSyUPi2SPy+RPi6RPi6RPiyQPSuSPCuSPCuUPyuTPiqUPSqUPSqUPSqVPiuWPyyWQC+UQDWVPjWYPjOgPjGrQTO1RDS9QzS/RDW7QTK3QzasRjicSTuFRzpsQDNTOSpCNCk+NjM6NjU5NTQ4NDM4MjI3MTE2MS42MS43Mi83Mi83Mi82MS42MS01MCw1MCw0MSwvLy0uMC0vLy0vLy0wLy0wLy0yLi0yLi0zLS01LC00KiszKSo1KSs8LTBDNDdOODpkPj12RUGGSkmPTkyaVFakYWqlbH2dco6Re6KGgK5/hbl7hLtvdalbW41RSHVPQ2lPRmVPR19QSF9STl9bWWZub3SDh4iUmZWZnpeaoJSZnY+PkYN+f29qa1ldW0xWU0pYU1pWUmFYUWEvLiwvLiwwLy0xMC40MC00MC01MS41MS43Mi43Mi43Mi43Mi45Miw5Miw5Miw5Miw5MS44MC43Ly03Ly03Ly03Ly04MC45MS84MC44MC44MC44MC44MC44MC44MC44MC42Liw1LSs1LSs1LSs0LCo0LCo0LCo0LCo1LSs1LSs1LSs1LSs1LSs1LSs1LSszLioyLScxLicyLygzMCkzMCk0MSo0MSo1Mis2Myw2Myw2Myw3NC04NS45Ni85Ni86Ny4/OC5AOi5CPDBEPjJHPzRIQDVIQDNIQDNJQDFJQDFLPzFLPzFLPy9MQDBNQTFOQjJNQTFRQTFZQjJkQzJxQzN8QzKHQjKSQTCYPC2gOiunOy6vPTK1QDa6RDq/Rj3FRD7ZQ0XhQEbjQkfnQkbqREbwQ0X0QUT4P0T6O0D5Oj/1O0DwPUDoQEDcQT3RQDvGQDW3PS6zQC2zQC2yPyyyPy2wPy2vPiytQCyqPy2nQC2lQCyhQSudQSyaPyqYQCqVQCuUPi2RPi6RPi6RPi6QPSuQPSuQPSuQPSuRPiyRPiySPCuSPCuTPSyTPSyUPyuVPy6VQTaWPzWaPjOjPjKvQTS5QzW/RDXBQzXARDi4RjuuST2ZSj2BRztoQDRROixCNSw/NzQ9Nzc8NjY6NDQ5NDE4MzA3Mi83Mi82Mi82Mi82Mi81MS41Mi00MSw0MSwyMSwuMC0sMS0uMC0uMC0vLy0vLy0wLy0yLi01Ly80Li41LC00Kis0Kis5LS8+MjRJNTZbOTdsPzl8RUCGSUSQT02YW2CbZnaUbYiMd56Dfa19grl1frdmbaRUVolNRXZMQWtNQWVPRmNRSGNNSF5OS1xbW2VxdHmFiYiHjIaKj4iNkIWGinx4emxmaVhaW01WU0xaVVtaVGBbU2AuLSsvLiwvLiwwLy0zLyw0MC00MC00MC02MS02MS02MS02MS04MSs4MSs4MSs4MSs3Ly03Ly02Liw2Liw2Liw2Liw3Ly03Ly04MC44MC44MC44MC44MC44MC44MC44MC41LSs1LSs1LSs0LCo0LCo0LCozKykzKyk2Liw2Liw2Liw2Liw2Liw2Liw2Liw0LywzMCszMCkzMCk0MSo0MSo1Mis1Mis1Mis1Mis1Mis2Myw3NC04NS44NS45Ni85Ni0+Ny0/OS1AOi5CPDBFPTJFPTJGPjFGPjFHPTFHPi9IPC5JPS9JPS9KPi5MQDBKQTBLRDJORTRVRDReRDNpRDJzQjF+QS+GPy2MOSmUOSedOSqjPC2sQDOzRTi4SDzBRj7SREPaQUPeQkPiREPnQ0TsQkPzQEP3P0H6O0D5Oj/1O0DuPkDlQUDaQj3NQDnCQDO1PS2wQCywQCywQCyvPiyuPyyuPyysPyupQC2mPyyjQCugQCqcQCuYQCqWQCmUPyqRPiyRPi6RPi6QPS2QPSuQPSuPPCqPPCqQPSuQPSuPPCqPPCqSPCuRPiyUPi2SPy2VQTaWPzWcPjKmQDSyQja8QzjBQzfCQjfCRjy6Sj+sTECXSz58RjpiQDRMOi5BNy1AODU+OTY9Nzc8NzQ6NTI5NDE4MzA4MzA2Mi82Mi82Mi8zMi41Mi0yMSwyMSwxMi0tMi4tMi4vMS4vMS4wMC4wMC4xMC4xMC41MTA2MDA1Ly81LC00Kyw2LC06MDFEMjJUNzFjOzNxQTd7RTuCSESJUlWNX2yLaYKDc5h9eat4fbVvd7VgZqJRUotMRXlMQHBMQGhQRWdRRmZMQ15HQlZNTFpeXmZqbnF1eXh4fXd6gHZ3em9rb2FgYlRXWUxUVExdV1ldVl1dVl4tLS0tLS0uLSsvLiwwLy0xMC4zLyw0MC0zLywzLyw0Lys0Lys0Lys0Lys2Lyk2Lyk0Lyw0LywzLiszLiszLiszLis0Lyw0Lyw1MC01MC01MC01MC01MC01MC01MC01MC0zLiszLisyLSoyLSoyLSoxLCkxLCkxLCk0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0Lyw0MSw0MSw0MSw0MSw0MSw1Mi01Mi01Mi01Mi01Mi02My42My43NC84NTA5NjE5Ni88NS09Niw/OC5AOS9COi9DOzBDOzBDOy5EOi5EOi5GOi5HOy1IPC5JPS9KPjBJQDFKRzZNSDVSRzVZRjViRTNqRDF1Qi99PiyCOymLOimTOiqaPSyjQjKsRjiySj27ST/MR0LUREPYRELdRULiQkLpQUHwPUD0PD75Oj/4Ojz0PD7tPz7hQj7TQzrFQTW5PzCyPy2uPyyuPyyuPyytPi2sPi2sPi2qPy2oPi6kPy2gPyyePyuaPyyXPyuVPiqTPiqRPiyQPy6PPi2PPi2PPi2OPSyOPSyOPSyOPSyOPSyOPSyOPSyPPCyPPi2RPi6QPy6UQjSXQTSdQDGoQDO2QTe/QznFQjjEQTe+Qzu3SD+mTEOQSkB0RTtaPjJFOS08NStAOTNAODU/NzU+NjM9NTI8NDE5NDA4My82Mi80My80My8yMy4zMi4xMi0xMi0wMi0tMi4sMi4tMi4tMi4vMS4vMS4wMC4xMC4zMjA1MTA1MTA0Li4yLCw0Kyw3Li89Ly5ONS5ZOS5lPTFuQDNzQjt5S0uAWmWDZ4B/cJd6eKp1e7drc7RfZKZUVJRPR4NMQndOQW1OQmhNQWVKQWBHQllHRlhLS1dNUFVdY2NgZmJiaWFgZlxaYFRXW01VWE1YWFBeWVZgV1hgV1osLCwsLCwuLSsuLSsvLiwwLy0zLywzLywyLisyLiszLiozLiozLiozLio1Lig1LSozLiszLisyLSoxLCkxLCkyLSozLiszLiszLiszLiszLiszLiszLiszLiszLiszLisyLSoyLSoyLSoyLSoxLCkxLCkxLCkwKygzLiszLiszLiszLiszLiszLiszLiszLis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw1Mi01Mi02My43NC84NTA4NTA4NS47NCw8NSs9Niw+Ny1ANy5BOS5BOS5BOS5DOS9DOS1FOS1GOi5HOy9IPC5KPjBIQTFKRzZJSDZORzVWRjZcRTNkQzJuQDB2Pi17PCuCOymMOyqUPSycQDGjRjWqSjq0Sj3ESEDMRUHRRkHWRUDeQ0HkQD7sPj/xOjz3Ozz0OjvwPD3pQD3cQz3NQzi+QDKxPiyuPyyrQCyqPyuqPyuqPy2pPiypPiyoPyylPi2iPyygPyybPiyXPyuVPiqTPimRPyqPPiuPPi2PPi2PPi2OPSyOPSyOPSyNPCuOPSyLPCuNPCuLPCuLPC2MPSyNPi+OPy6UQjSXQTKgQDKsQjW5QznCQzrFQjrCQTu6QTmxSUCjTkeNTkVvRz1TPzRBOy85Ni1AOTNBNzU/NzQ+NjM8NDE5NDA4My83NC80My80My8zNC8yMy4yMy4wMi0wMi0uMy0tMy8tMy8uMy8uMy8wMi8wMi8xMS8xMS8yMS8zMjAzMjA0MC8yLi0xLSw0Li44LixHNC1PNClYOCtgPDBlPzZtR0Z5WWSCa4WAdZ98fLJ3fLxudbtkaK9bW6FSTY9MQn5PQXJMQGhJPWNIPmBIQl5FQ1hAQk87QEZCR0pETUpKUUpKUUlJUUZLUUVPVUlWV09eWVNgWVNgWFUrKysrKyssLCwtLS0vLiwvLiwwLy0wLy0xLSoxLSoxLSoxLSoyLSkyLSkyLSkyLSkyLSoyLCwxKysxKysxKysxKysyLCwyLCwxKysxKysxKysxKysxKysxKysxKysxKysyLCwyLCwyLCwxKysxKysxKyswKiowKiozLS0zLS0zLS0zLS0zLS0zLS0zLS0zLis0MSw0MSw0MSwzMCszMCszMCszMCszMCs0MSw0MSw1Mi02My43NC83NC84NTA4NS46Mys7NCw8NS09Ni4/Ni8/Ni0/Ni0/NyxCOC5COC5FOC9FOS1HOy9IPDBKPjJIQDNIRTZHRjRLRTVRRDRYQzJfQjJmPy5uPSx2PSx8OiqFOSmMOyqTPS6bQjKiRjesRji7RjzCRj7JRj7QRT7ZREDiQz/qQEDwPj7yOjrxOzrsPDzkQTzWQzvGRDa1QC+qPSmqPy2pQC2pQC2oPyyoPi6oPi6nPS2lPi2jPS6gPy6ePy2aPy2WPyyTPiqRPyqPPimPPiuNPi2NPi2MPSyMPS6MPS6LPC2LPC2LPC2KPS2KOyyJPCyKPC+LPi6LPTCMPy+SQzKYQjGhQTGuQja8QzrCQzzEQz3AQz25RkGyUUqlWFKPWFFzUklXST5DQzc8PzY+OTNANzI+NzE9NjA6NS85NC44My82My40My40My4zNC8xMy4xMy4uMy0uMy0uMy0tMy8tMy8tMy8tMy8uMy8uMy8wMi8wMi8wMC4xMS8yMjAyMS8wLy0vLiwyLi00Lyw/MCtEMClLMylUOC1aPDRkRkZ1XWqDc42JgKuFhL5+g8d0esZtcL1jZa9WU5pMQ4JLP3FJPGdHO2NFPl9GQl1EQlc/QU47P0g6QkU+SEdETUhHUUlHUUhKUkdOVktVWE1eWk9hWU5hWE8rKysrKyssLCwsLCwuLC0vLiwwLy0wLy0xLSoxLSoxLSoxLSoyLSkyLSkyLSkyLSoyLCwxKysxKyswKiowKioxKysxKysyLCwwKiowKiowKiowKiowKiowKiowKiowKioyLCwyLCwyLCwxKysxKyswKiowKiowKioyLCwyLCwyLCwyLCwyLCwyLCwyLCwyLCwzLywzMCszMCszMCszMCszMCszMCszMCs0MSw0MSw1Mi02My42My43NC84NTA4NTA5Miw6Mys7NCw8NS0+NS4+NS4+NS4+NSxCOC9COC5FOC9FOC9HOjFJPTFKPjJJPzNGQzRGQzRKQjVPQTRUQTJcQDJiPjBqPC1xPC53OSp9OCmFOCiMOiyVPS+bQjSkQjWyRjq6RTvBRj7KRz/UR0DeRkHnQ0HuQkDtOzvrOzvnPjvfQjvRRDq/RDSvQC2kPiimQS2mQS2lQCylQC6lQC6kPy2kPy2kPi+iPi6fQC6cPy6YPy2VPiuRPyqPPimPPiuNPi2NPi2NPi2MPSyMPS6LPC2LPC2KPS2KPS2IPC6IPC6IPC6IPC+HPi+IPjGLPzGRRDKWQzGiQjStQza6QzvBRD7BRD67RUG5UEyyW1SlZVyRZl11X1RbVUlHTUFDST88OTI/ODI+NzE7NjA5NC43NC02My40My40My4zNC4yNC8xMy4vNC4uMy0uMy0uMy0tMy8tMy8tMy8tMy8uMy8uMy8wMi8wMi8vLy0wMC4yMjAyMjAxMC4wLy0wLy0zLyw4LCw7LClDMCpLNzBTPDZeSUh0Ym6HepSQiraMjcaEiM96gMxyeMZpa7ZXV59JRIRFPW5HPGREPGFDPl5DQVlAQ1ZARFA+RUtHUVJLV1VRXldVYFhTX1VSXlRUXlNZX1NeW0xhWkphWkosLS8sLS8sLS8sLi0tLS0tLS0uLSsuLSsvLiwvLiwxLSowLCkwLCkwLCkvKygvKygvKyovKyovKyovKyovKyovKyovKyowLCsvKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyowLCswLCsxLSwxLSwyLi0xLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwwLCkxLSoyLiszLywzLywzLywzLywzLywzLywzLywzLywzLyw0MC01MS42Mi83NC84MC05Miw6My07NC49NC8+NS4+NS4+NS4/NC4/NSxCNS1DNi5ENy9GOTBHOjFGPDJHPzRIQDVKQDZQPzVUPjNYPDFeOTBiNittOS50OC18OCuDOSyNOy+TPTCYPzGePjCnQTOtQTS1Qzi+RTrKRz3URz7eRT/lQ0DoQD/qQkHmREHaRT7IRDi3QjGqQS6iQiyiQS6hQC2iPyyiPi6hPS2hPS2iPi6gPy+cPCyaPSyYPC2VPi2TPSyQPSuOPSqMPiqLPCuLPCuKPS2JPCyJPCyJPCyIOi2HOy2JPS+GPC+GPC+HPTCIPjOIQDKJQTWLQTSRRTWXRDSjRTmxST66R0C7RD67RUG4TUe0WlKvZl+jcWaRc2h+cmRqal5WXlNJUUZMTEJKRj1CPjU8OC85NSw3NCs2MywzMys0My4zNC4xNC0xNC0wMi0vMSwsMSssMSstMi4tMi4tMi4tMi4vMS4vMS4vMS4vMS4wMi8wMi8xMS8xMS8xMS8xMS8xMS80MC80KzA7LzNBMzJDNC9KOzZdT095bXmLhZ+TkLuUls+QldmDidN0esZqbrdfYqdaW5RMSXRIQmRBPl0+Plg/QlVBSVZMVVxVYGJicW5ufXh2hnxyf3VseW9ndWhfa19XX1BdXEhiXEZjXUcsLS8sLS8sLS8sLS8tLS0tLS0uLC0uLSsvLiwuLSswLCkwLCkvKygvKygvKygvKyguKikuKikuKikuKikvKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyovKyowLCswLCswLCsxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwxLSwwLCswLCkxLSoyLiszLywzLywyLisyLisyLisyLisyLisyLiszLyw0MC01MS42Mi84MC45MS46Mi87NC49NC8+NTA+NTA9NC0/NC4/NC5BNC5CNS1DNi5FODBHOjJIOzNIPjVIPjVMPTZPPjZRPTRWOzJaOTBfNy9oNzBwNy53Ny2BOS2JOS6QPDGWPDGbPTGiQDOnQTOsQjW0RDi+RTrJRjzURT3bRD3fREDgRUDeRkHURz7ERjiyQzKlQi2eQi2fQy6eQi2fQC6ePy2ePy2ePy2ePi6ePi6aPSyZPiyWPS2UPSyQPSuPPiuMPiqMPSyLPCuKPSuJPCyJPCyJPCyHOyuHOy2FPC2GPC+FPS+FPTGDPTGEPjKGQDaHQTeIQjaTRzmXRTejRzyvSkC4SUK4R0G3TEazVE6xZFyqcWaffm+Qf29/fG1tc2VaZlpOWE1MTkFLST1FQzdAPTQ9OjE4OC40NCwxMSkyMy0yMy0wMywvMisvMSwuMCsuMCsuMCsvMS4tMi4vMS4vMS4vMS4vMS4vMS4vMS4wMi8wMi8xMS8xMS8xMS8xMS8xMS8yMDE1KzQ5LTc8MjM/NTNIPzpeVlR4cnyKiJ6Tk7mUl8qQltSEi895gcJxebhrdK1obp5cX4BYWnFTVWpSV2pUXmhaZ21mdnZygn90iH9+koeDlYl+joF2hnlygHFmdGVaZVRbWkVgWkBiXEQsLS8sLS8sLS8sLS8sLS8sLi0tLS0tLS0uLSsuLSsuLSstLCovKyguKicuKicuKicsKyksKissKissKisrKSorKSorKSorKSotKywtKywtKywtKywtKywtKywtKywtKywsKissKistKywtKywtKywuLC0uLC0uLC0uLC0uLC0uLC0vLS4vLS4vLS4vLS4vLiwwLCswLCsxLSwyLi0yLi0yLi0yLi0xLSwxLSwxLSwxLSwxLSwyLi0zLy40MC81MS44MC45MS46Mi87MzA9MzE9NC89NC89NC8/NDA/NC5BNC5BNC5DNjBENzFGOTNHOjRIOzVKOzZLPDdOPTZQOzZTOjVWNzJbNi5jNjBrNi50NSx9Ny+HOS+NOzCUPDCWPDGdPzOgQDSiQDOoQDOxQza6RDjFRTrNRDrVRkDXSEDUSULMST++RTquQzOhQi6cQS6dQi+cQS6cPy6bPi2bPi2bPi2bPi+bPzCYPC2WPS2UPC6TPS6PPi2MPSyLPCuKPSuJPCqJPCqJPCyHOyuHOy2FPC2EOi2DOy2EPDCCPDCCPDKCPjODPzSFQTiHQzqIRDmUSj2XSDugSD6sS0SyS0azTEeyU02uYFatc2emgXGdjHqRjnuCiXdzgG9jcWJYY1VOUkRNTkBISTtERDhAQDQ5Oy40NisvMSYwMSkwMSkvMCovMCouLyouLyovLy0vLy0vLy0uMC0vLy0vLy0vLy0vLy0vLy0vLy0wMC4wMC4wMC4wMC4wMC4wMC4wMC4xLzI2Kzk3Kzk4LzQ7NjNIRT5fXll6enyLjZqQlLGSl7+PlceEjsN9ibt7ibZ8i7J9jKt9iJp3g49xfodufYJufn5vgn55joWDmY2LoZSRqJiQpZSInYqDloN8jXtqe2lcaFRYWEBdWTxfW0AtLjAtLjAtLjAtLjAtLjAtLjAuLi4uLi4uLSsuLSstLCotLCouKicuKicuKicuKiksKisrKSorKSorKSorKSoqKCkqKCkqKCksKissKissKissKissKissKissKissKissKissKissKissKissKistKywtKywtKywtKywuLC0uLC0uLC0uLC0vLS4vLS4vLS4vKyowLCsxLSwxLSwxLSwxLSwwLCswLCswLCswLCswLCswLCsxLSwyLi0zLy40MC85MS86MjA7MzE8NDE9MzE9MzE9MzE9NC8+My8+My9AMi9AMy1BNC5DNjBENzFFODJGOTNIOTRJOjVKOzZMOjZOOTRRODNUNTBeNzJlNjBvNi94OC+COTCKOi+QPDGUPjGZPzSbPzSbPzKfPzGlQTKuQjW4RDe/RTrHRz7LSEDKSkHDST62RjqqQjWeQTCZQC6ZQS2ZQS2YPy2XPiyXPiyZPiyZPS6XPi6VPCyUPSyTPS6QPS2OPSyKPSuKPS2JPCyIOymIOymHOyuHOyuEOyyEOyyDOy2AOyyBOy+APDGAPDGBPjWDQDeDQzqHRDyIRTyUTECWSDyeRz6nSkOuTEmuUUytXVaqal6ngG+hj3mamoKPm4OGlYB6i3hte2pibV1TWkpRVUZLT0BFSTpARDY7PTA1NywxMygwMSkvMCguLykuLSguLSkuLSkvLiwwLy0vLiwvLiwvLiwvLiwvLiwuLiwvLiwuLiwwLy0vLy0wLy0vLy0vLy0vLy0vLy0yLTE3LDo2KjgzLTE5NjFISj9iZlh7gHqLkJONk6OPlrCMlbaDkLKBkK+FmbKNpLaSqLOTqKuQpKOMoJ6HnpiCmY99mImBnIuIo5CUsJqYsZuUrZeLo42Fm4R/knxrfGlYZk9TVjtaVjleWj0rLzIrLzIrLzIrLzItLjAtLjAuLi4uLi4tLS0tLS0uLSstLCotLCosKyksKyksKyksKissKissKisrKSorKSoqKCkqKCkqKCksKissKissKissKissKissKissKissKissKissKissKissKissKisrKSorKSorKSosKistKywtKywuLC0uLC0vLS4vLS4vLS4vKyowLCswLCswLCswLCswLCsvKyouKikvKyovKyovKyovKyowLCsxLSwzLy40MC85MDE6MjA7MzE8NDI9MzI9MzE8MjA8MjA9MjA9Mi4/MS4/MS5AMi9BMzBCNS9DNjBENjNDODREOTVFOjZHOTZIOTRLODRONTBYNzJfNjBpNzByNy99OjGGPDGMPjKQPjKXQDaXPzWXPzWXPzOcQDOjQzWrQzazRTi6RTu9Rz2+SD65Rz2wRDimQTWbPzCXQC+XQC2XQC2WPy6VPi2UPSyVPCyWPS+WPS+VPC6TOy2SPC+OPC6LPC2JPCyJPCyIPCyHOyuGOiqGOiqGOiqDOiuDOiuCOiyAOi6AOjCAPDGAPTR/PzaCQjmDRD2HRkCISD+RS0GSSD2aRz+jTEWoUEyoWFGpZl2mdmiijHebmYCVpIeMo4eGnYN+kX10gnFqdWVcZVJWX0xOVUNFTDo/RjY8QDI3Oi82OC0wMSkwMCguLSgvLCcvKygvKyoxLSwyLi0xLSwxLSwxLSwxLSwxLSwvLiwxLSwvLiwyLi0wLy0yLi0wLy0wLy0wLy0wLy0yLTE4LDo1KTUxKys2NixHTDhgaFF6g3CIkoeNl5aPmqCNmaWGlqOHm6KQqqmbubGgwLOYt6iatqebt6iYt6WRsZyJq5KJq5CQsZSSs5aVtJWQrY+IooWEm4F7knhnemRUYklRVDlWVTlYVzssMDMsMDMsMDMsMDMuLzEuLzEvLy8vLy8uLi4uLi4vLiwuLSsuLSsuLSstLCotLCotKywtKywtKywsKisrKSoqKCkqKCkqKCkrKSorKSorKSorKSorKSorKSorKSorKSosKissKisrKSorKSorKSoqKCkqKCkqKCksKissKissKistKywuLC0uLC0vLS4vLS4vKyovKyowLCswLCsvKyovKyouKiktKSgwLCswLCsvKyowLCsxLSwyLi0zLy40MC86MTI6MTI7MzE8NDI9MzI8MjE8MjA7MS89MjA8MS8+MC0+MC0/MS5AMi9BNC4/NC5ANTFANzJAOTNBOjRCOTRDODRGNzRINS9RNTFYNS9hNi9sOC11OS6APC+GPjCLPTGTPzWVPjWTPzWTPzSVQjSaQjSgQzSlRDSsQjWwRDi0RTqxRTuqQjehPzSaPjGWPjCVPy6UPyuTPSyTPSyTPCuTPCuUPC6UPC6TOy2SPC2PPC6NOy2KOyyJPCyHOyuHOyuGOiqGOiqFOSmDOimDOiuBOSp/OS1/OS2APDF/PDN/PzaAQTiCQzyFRj+ISUKKSUOOSkGQRz6XSEOfTkqnVlKnYFqpcGWkg3KclH2WoYOPqIqIp4iDoIR+ln55iHVwe2pkcFxdaVNSXkpKU0BCSzo+RTU6QDI5PDEzNCwyMioxLikvLCcvKSkwKioxKysyLCwxKysxKysxKysxKysxKyswLCswLCswLCsxLSwxLSwxLSwxLSwvLiwvLiwvLiwyLC44Kjc1KDEzKyg1NiZFSzFcZ0d1gmSGk3mOm4qRnpSQn5qLnpiNpZeXtJ6ixaWpzq2lya2myrCny7GkyKyXvp+Ls5GIsI2NspCOso6Qso+NrIqEoYKAmXt3jnJkeF1RX0VOUjdRUTVTUjYsMDMsMDMsMDMsMDMuLzEuLzEuLzEuLzEvLy8vLy8vLy8vLy8vLiwvLiwuLSsuLSsvLS4uLC0uLC0tKywsKisrKSorKSoqKCkrKSorKSorKSorKSorKSorKSorKSorKSorKSorKSorKSoqKCkqKCkqKCkpJygpJygrKSorKSosKistKywuLC0uLC0vLS4vLS4vKyovKyovKyovKyovKyouKiktKSgsKCcwLCswLCswLCswLCsxLSwyLi00MC80MC86MTI7MjM7MjM8MzQ9MzI8MjE8MjE7MTA8MS88MS8+MC89Ly4+MC0+MC0/MS4+My89NjA7NjA7ODM8OTQ9OjU+OTNANzJDNjBHNC5PNCtZNCtkNStuOCx4Oi1/Oy6FOy6PPDSRPDWQPjOPQDOQQTKTQjGXQTKZQDCgPjGmQDSqQjeqQjmlQDafPjWXPTKVPzKSPy2SPy2RPiyQPSuROyqROyqSPC2SPC2ROy6ROy6OOy2NOy2KOy6IOi2GOiyEOyyFOSmFOSmDOimCOSiCOSqBOSp+OCx+OCyAPDGAPTSAQDeBQjmERT6FSUGIS0aMTUaMSUGOSECYSkahU0+oXVipaGKpe26kjnmZnIGSp4aJrIuCqoiAoYR/mYB+i3d4gW5qeGFkcltaaFFRXUlJVENDTDs+RDY8PzQ2Ny80NCwzMCswKycxKCkxKCkyKSo0KywyKSoyKSoyKSoyKSoyKSowKiowKiowKioxKysxKyswLCswLCswLCswLCswLCsxKy02KTI1KS00LSU0NiFBSCZXYztxgFeCkm2NnH2QoIaQooyLoYqNqImVuI6gyJSk0J2p06uo0q6n0a2hy6WTvZeFr4eCrISHsIaIroWMsYiLq4aBn3t7lHRxiGtfc1dNXUJJTzNKTTBLSy8uLzEsMDEuLzEuLzEuMC8uMC8uMC8vLy8wMC4wMC4wMC4wLy0wLy0wLysvLiwxLSwyLi0xLSwxLSwwLCsvKywsKisrKSorKSorKSorKSorKSorKSorKSorKSorKSwrKSorKSwrKSotKCwqKCksKCkpJygpJygoJicqKCkrKSosKissKyktKywuLSsvLiwvLiwtLCotLCovKyovKyouKiktKSgsKCcsKCcxLSwyLSoyLSoyLSozLis0Lyw1MC02MS47MzE7MzE8NDI8NDI9MzE8MjA7MS87MS88MS88MS89Ly49Ly49Lyw+MC0/MS49Mi49NC09Ni47ODE5OTE5OjI5OjI7ODE/Ni9DMitKMSxUMileMypnNytvOS11PS56PC+HPTKLPTOLPzKMQDKOQDOPQDGSPzGVPS+YPC+cPjKiQjahQzeeQjeZPzSWPjKUPjGUPi+TPS6QPS2PPCyOPSyMPSyMPS6NPi+OPC6OPC6LPC+KOy6IOi2IOi2GOiyEOyyCOiuCOit/Oip+Oyp+Oyt8Oip9OSx8Oi6APjKBPjWAQDaCQzqDRz2FSkKHTkWLT0eMSUOOSUSTUEqYXFSeZ2CddWmeh3WemICUoYWPqomJrIuDqIeAoYR+m396kHl0iG9pfWJieV1ccFVVZ09PXEhHUkFBSDg9QTM4OC44NS43LywzKykyKCkyKCkzKSo0KiswKiwvKyowKiwwKiowKiwwKiwyKSwyKSwzKi0xKy0xKy0xKy0wLC0wLC0wLC0xKy80KS80Kis0LSU0NiE/RiVUYDhtfFGBkGeJmXSNnnqNoX6IoXqKp3uRtoKbxIify5CfyZmex52dxpqYwZWMt4qCrYCFroKMtYmEq3+JroWJqYJ+nHh2j29sg2ZablNKWj9HTTNGSjFERi4vMCsuMCsvMCswMSwwMSwwMSwxMi0yMS0zMi40My80My82Mi81MS40MSwzLyw0Lyw1MC01MC00LywzLisyLCwxLSwwLCswLCsuLC0uLC0tLS8tLS8sLC4rKy0qKS4pKSsuKS8uKS0vKC8uKS0vKS0uKS0uKisuKisvKyovKyotLCouLSktLSstLikuLyouLyotLS0tLS0uLC0vLS4vLiwwLy0yLisyLisyLSo0LCk1LSo2Lis4Lyo6MSw6MSo7Mis9NC09NC0+NTA+NTA+NTA9NC88My47Mi09Mi48MS08MS87MC49Ly4+MC8+MC9AMS5BMClAMik7NCo3Ny0zOS0yOC41Ni46My0/LSlGKidMKSdTKiZaLyhgNSxkPDBrQDB5QTB/QC+GQTGLQjOPQDOTPTCTOy+SOC2TOy+TPS6UQTGVQjKUQzKSQTCRPi6ROyyXOzCXOjKSOzGMPTCIPzCEPy+CPy6DPi6IQDGIPzCKPjGKPDCJOy+IOi6GOi2DOy17OSt+QDN3PC5xNyl3Pi13Pi12Oy19PzJ7Oy+CQDSHRTmJST+ITEGGTUKEUEOHTkWRS0mXU1CUYlmRcGGMfWqJiXGJlnyKnoKNpIeNpomOp4qNp4yHpIh+n4J1mntvl3VpjWlihF9belhac1VablNXZU5QV0VKSz1DPzZAOTM7MC42KiozJykzJyszJysxJiosKi0pKyoqKiwqKCksJysuKCwxKC0yJy0zKC4zKC4zKDAyKDAwKTEwKTEvKjEvKjAvKS0xKyswLSgvLyM8PypWXEBwelh/i2eNnHWLnXOMoXaMpneKqHaJqnWOtHuZv4afwY+dvo+WuoqPs4OIrn2Fq3yDqnuFqn6DqH2Dpn6Annx5lHVyiW1ofGNZa1VNWkZJUTxDSDQ/Qi8vMCowMSswMSswMSsxMiwxMiwyMSwzMi00My40My43NC83NC82My41Mi01MCw1MCw3Lyw3Lyw2Liw2LiwzLisyLSowLCswLCswLC0vLS4vLTAtLS8tLDErKi8pKi4pKC0uKS8vKC8vKC8vKC8vKS0vKS0uKisuKisvKyovKyouLSkuLSkuLyouLyouLykuLyouLi4uLjAuLi4uLi4vLiwvLiwxLSozLis1LSo1Lig3Lik4Lyg6Lyk7MCo8Mik9Myo+NSw+NSw+NS4+NS4+NS49NC08My48My49Mi48MS07MC47MC49Ly49Ly4+MC9AMS5DMCpDMClBMis+NCs6Ni05NSw6My08MS0/LStEKilJKihOKydULylaNS1fOjFlPi9wQS94QS2AQTCIQDKPPzSRPTOTOjKTOzGNOS6LPC+LPi6MQDCNQTGNQTGOQS+RPzGVOzKVOzKQPDKLPTCGPjCDQC+BPy+CPy6FQDGGPi+JPTCIPC6HOy6EOyyCOiyAOyx4OCx4PDFzOS1uOStzPi5zPi5yOCp1Oix9PTGDQTWJRTqLST2JS0CGTkGEUEOHTkWRSkiXU1KSZl2Md2aEhnCAk3eBnn+EpYaIp4iNp4qQp42Qp42KpImBn4N3nH1vmHZlkmlgi2BZglpZe1hcd1hablNTYUpOVUNGSDtDQDc8NzM3Ly0zKisyKSoxKCsuKCosKisqKiwrKSwrKSwtKCwvKS0yKDAyKDAyKDAyKDAyKDEwKTEvKjEtKjMtKjMtKjEyLTEyLi0wLCktLSU4OixTWEJveF2Ai2mHlm+GmWyGnm6Io3CGpHCEpXCKrXeTtoCZuYeWtoSTs4GMrnuGq3iCqHeCqHmDqHyDpnyCpH9/nXt4knVxiG5oe2VZaldNWkhFTDxARDU7PS8xMiwxMiwxMiwxMiwyMy0yMy00My40My41NC81NC84NTA4NTA4NTA3NC83Mi42MS04MC04MC03Lyw2Lis0LywzLisyLCwxLSwxLS4vLS4wLjEvLTAtLS8sLC4rKi8rKS4vKC8xJy8vKS0vKS0vKS0vKS0uKisuKiswLCswLCsvLiovLiovLikwLyowLyowLysvLy0vLy8wLi8wLi8wLy0vLiwxLSoyLSo2Lis3MCo5MCs6MSo8MSs9Myo+NCs/NSw/Ni0/Ni1ANy5ANy4/Ni8+NS49NC09NC09Mi48MS07MC47MC47MC47MC48MS8/MS5DMitFMCtILytLLS1MLC9LKy5JKi9FKy5BLSxALipBLihFLihNLilYMSpiMy1nNSxqOixvOy13OzCBPTSHPDaMPDWNOjSNOjSKPDKHPTKGPjKFPzOGQTKJQTOMQjWPQzWOPzKPPS+MPjGKPi6HPi+FPiyGPS6IPCyJOy6JPCyIOi2GOiqDOyx/PCl+PSt7PCt9PTF6PDF2Oi91Oy94QDF4QDF2PC52Oy1/PzWCQjiJRj2LSD+JSkGHS0GHTkOKTkaRSkiYVFGWZlyQdmWHhW6CkXR/nXuBpIOFqIeIqomNqoyQqYyOpYmIn4OBmn15mHhplm1hkmVci2FchmBdgmBbfF1VclZQaFBGWUVCUD86RDkzOjIuMywqLykqLCkqKigwJygxJioxJioxJiowJyoxKCswKi4wKy8vKi4tKy4sKzArLDApLTAoLTEoLTEpLTAxLzIzLy4uKicqKiI1NypQVUFtdlt8immAkGt+k2p/mWqDn26AoG5+oG2ApXGHrHiNr3yLrXqIqniEqXaBp3Z/p3V/pnd/pnl/pHmAon19m3l3kXRwh21ofGNZa1VNWkhESDk9PzI5OS0yMy0yMy0zNC4zNC4zNC40NS81NC81NC82NTA3NjE5NjE6NzI6NzI5NjE5NDA5NDA6Mi85MS45MS44MC01MC00Lyw0Li40Li4zLzAzLzAxLzAxLzIwLjEuLjAtLS8tKy4wKTAyKS4wKi4wKi4wKi4wKiwvKywvKyoxLSwxLSwwLyswLysxMCsxMCsxMCsxMCwxMS8xMTExLzAxMC4xMC4yLiszLiszLio5Miw5Miw7Mis8Myw+NCtANi1ANi1BNy5COC9BOC9COTBBOC9BODFANzA+NS4+NS49Mi49Mi48MS87MC47MC48MS89MjA9Mi5CMy5FMi5MLi5SKzBWJy9VJi5QJy9JKS5DLy48MSs7Mik/MilHMChSLylfLipkLylpOS9rOy91PDN9PDaFOziJOzmKOzeIOjaJPjiGQDiGQjmFQjmFQzeGQjeHQTeJQTWIQDGIQS+HQC6HQC6HPi2IPCyIOyuJOiuKOCqIOSqHOiqDOil/PCl7PSh4Pih4PiqCPjF7Ny56Ny56PDF2Oy13PS98QTN7QDKAQjeDRTqGSD2ISj+GSkCHTUKIT0SKUUiMU0qOXFGOaFuLdGKFf2eAi21+lnZ/nnyDp4OEqYeHqomLqoqLpoeHoIKDmn59mHlxlW9plGlmj2dmjGVni2dkhmVffl9ad1tQaFBLXkpCUD84RDYyOi8uNCosLygrKiUyJiY1JSg0JSgyJigxJygvKSsvKywuLC0rKysqKy0qKy0oLC0oLC8nLC8nLC8qKy0uKisxKyswKycuKyI4OCxQVUFpcVl2hGN7jGh5j2h8lml/nGx9n215nmt6oG1/pXKCp3SApXF9o3B9o3B9pXN+pXZ+pXh9pHh8oXh9n3p6mXd1kHFuh2plfGJXa1JOW0dERjk/PTE6OCw0NS80NS80NS81NjA1NjA1NjA3NjE3NjE4NzI4NzI7ODM8OTQ8OTQ8OTQ8NzM8NzM8NDE8NDE7MzA7MzA4MzA3Mi82MS42MS41MTA2MjE2MjEzMTIyMDExLzAwLi8xLS4yLDA0Ky40Ky40Ky4yLC4yLCwyLCwyLCwzLy4zLywzLywzLywyMSwyMSwzMi0zMi4zMjAzMjAzMjAzMjA1MTA1MS42MS42MS07NC48NS89NC0/Ni1BNy5COC9FOC9DOS9EOjFEOjFFOzJEOjFDOTBCOC9ANS9ANS8+My8+My89Mi49Mi49MjA9MjA+MzE+MzFANTFFMzFNMDJULDRYKTNXKDJSKTFLLDFCMzA6Ni03Nys6NipCNClNMilYLyleLylmOjFqOzNzPDd6PTqCPDqGPDuHOzuGOjqCOzeBPjiBQTiBQjmDQzqDQzqFQDmEQDeCQzKCQzGDQjCEPy+GPS6IPC6JOi2LOS2JNyuHOCuFOSuCOit+PSt4Pip2Pyp4PiqBOS18LyeCOC+EPjR3NCtzNSp9QTZ9Qzd/RTqARzyCST6DSj+ES0KGTUSHUUeFV0p8YU56alGAcFmBdV2CfGKDhmmGk3WInXyDo36Bp4KCqoWCrIaBqYR/pYB7nn16mXd6knB6kGx4jWx3jGt1jW1yiWxthGdrf2RgclhbaVJSW0hITD1AQDQ7Nyw3MCY1KiQ2KCc1JyczJycxJyYuKSYrKigrKykrLSonLCgnKyopKyopKyoqKiwrKSwrKSwtKSosIyQyKic1MCo4NipCQzVVWkZmcFdufV50iGVximJ1kGV4mGl3m2tzmWh0mml3n2t6om54oGx3n214oG55o3N7pXV7pXd8o3d5nnV6nHd3lnRzjm9thmhke19Xa1BOW0dDQzc+OjE5NSw1NjA1NjA2NzE2NzE3ODI3ODI4NzI4NzI5ODM6OTQ9OjU+OzY+OzY+OzY+OTU+OTU/NzQ/NzQ+NjM9NTI7NjM6NTI5NDE5NDE4NDE4NDM5NTQ4NDM3MzI0MzE1MTI0MC82LTA2LS42LTA2LS40Li40Li40Li40Lyw0MC00MC00MC01MS4zMi0zMi00My40My40My80MzE1NDI1NDA4NDE4NTA5NDA6NS89NjA+Ny9ANy5BOC9DOTBEOjBHOjFIOzJGPDNGPDNGPDNGPDNFOzJDOTBCNzFBNjBANTFANTE/NDA+My8+MzE/NDJANTM/NTNANzJDNTJJMzVQMTZULzZTLjVQMDVKMjJDNTI9OTA8Oi09OitDNylJNihRMylXMildMitkMyxsNTB2NjR9NzeCODeDNzeCNjZ+NzV9OjR9PDZ9PjWAPzmDQDiGPzmFQTiAQjOAQzGBQjGDQDCFPS+HOy6IOi6HOS2FOSyDOSyCOix/PCx8PSx5Pix4Pyx8PSyHNSqLMiyhTEWnWFGLQTh8OTCCRjuASz15SDp6Sjx7TT58Tj99T0KBUUWHVUqCX0xya09vc1J8dViHd12PeWKYf2mfi3OglHqWlnqPnXyLo3+IqIGFp4KApH57n3l+mXaDkXCFjm+DjnCAj3B/kHB7jnB3jG1zh2tqfmJmdlxfaFNWW0dPTT5HQTNANio9MCc7LCc5Kyg2KyczKygvLCcsLScrLicpLigpLigrLSgtLCovKyozKSo0KCo3Jyo3JygzKCQ8MyxFPjRJRzhRUkBdYktncVZqeVpugl1rhFxsiV1wkWJxlWVvlWRvl2VymmZ1n21ynGpxm2l0nm54onJ6pHZ5onZ5n3Z2mnR3mXZ1lHJvjWtqhWZjfF5VbE9OXEVDQzdAOTE7NCw2NzE3ODI3ODI3ODI4OTM4OTM5ODM6OTQ6OTQ7OjU+OzY/PDc/PDc/PDdAOzdAOzdCOjdCOjdBOTZAODU9ODQ9ODQ8NzM8NzM8NzM8NzQ8NzQ8NzQ7NjM5NTI5MzM4MzA4LzA5Ly44LzA4MC44MC44MC42MS42MS02MS02MS01Mi01Mi02My42My43NC83NC81NDA1NDA4NDE5NTI6NjM8OTQ9ODRAOTNANzBBOC9DOTBEOjBHOjFIPDBJPTFJPTFKPTRKPTRKPTRJPDNGPDNEOjFCOC9BNy5BODFANzBANzI/NjE/NjFANzJANzJBODM/NzRAODVCODZEOTdHOTZIOTZIOTZIOTRFODBFOC9FOS1FOStHOSxJOSpLOStRNypaLyZkLyduMy16NjODOTiJOzmLOzqLPTuLQT6HQDqCPTZ/PDN/OjOCPDSIPTeJQDeDQTWBQjOCQDKDPzKDPTGEPDCBOy+APC9+PC58PS57PS58Pi98Pi99Pi9/PS+GOS+QMSuiPDjNbGbZfnmtWlSMQzyITEF/TkB0SjxxTT1wUT9xUkB0U0B6V0SCW0p+ZU9tc09ve1WEeVuYdV+pb2O2bWa+cWu9d2+7gnexjHqnl36en4CWoYGNoX6FnXmFmXaIkXKLkHKIkXKEk3KAlnJ8lnN4k3B0knBti2lphGVkeFxda1FWXkdNUDtFRDBCOytAMys/Miw7MCo3MCozMCkwMCguLycuLykvMCoyLyo2LCs6Kis+KCtDJitFJCtDJihGNS1MQzRWUT5bWURgYkpnbVFpd1Zqe1dsgltngldmhldsjlxvlGFulGFulmJymmZznWtvm2pvmWlynG53oHR5onh4nnd1m3Zzl3N1l3ZzknJui2xphGNie1tUbU1NXUNHSDpFPDVANzA3ODI3ODI4OTM4OTM4OTM5OjQ6OTQ6OTQ7OjU8OzY/PDdAPThAPThAPThBPDhBPDhDOzhDOzhDOzhCOjc/OjY+OTU+OTU9ODQ+OTU+OTU+OTU+OTU9ODU8NzM6NTE7MzA6MC46MC45MS45MS45MS85MS45MS43Mi42MS02MS02My42My42My43NC83NC83NC81NDA2NTE5NTI7ODM8OTQ/OjRCOzVCOzNBOC9COi9DOS9FOy9IPDBJPTFKPjJKPjJLPjVLPjVKPTRKPTRGPDNFOzJDOTBCOC9COTJCOTJBODNANzJANzJBODNCOTRBOjQ/ODJAOTNCOzVEPTdGPTZHPDZLPDVOOzRNNi5ONixRNitRNitRNypQOStQOSlWNidmNipyNix+OzOJQDmVRECbSESfSkefTEagUUqZTESORDuFOzCENy2FNy2MOTGNPTSIPjWHPjeGPTaFPDWFPDWBPTR9PTN6PjN4QDN2QTN4QDN6PjN/PDODOjOINzORMzGYKCazPTvsfHr9lZLFaGOWR0CJS0B4SDpuTTxqUT1mVD5oVj5sWEB0W0V/YEyAaFB5c1GEd1WedFy0bF7JX1/TVlzZUVvXVFzkb3XZenjMhnzAj361lYCrlX2jknifj3acinKcinSZjXWVj3WRkXWLknOGkXOCkXJ8i255hmp1e2Ftb1dnYk5fVEJVRTVSPC9PNC1NMS1JMCxELyo+Lyg5LyY3Lic2Lyc4MSk6Lyk9LitBLCtGKStIKCtLJytIKSdUQjRZUTxkXkZnZUxpbE9udVZte1hsflhrhFpnhFZnh1Ztj11wlWJxlmJymWR1nWl0m2xvmWtvlmpymW13nXZ5n3h3mnl0lnVzlHV1lHVzkHFvimtphGVhfFtUbU1NXUJNTkBLQjlGPTY5OjQ5OjQ5OjQ5OjQ5OjQ6OzU9PDc9PDc9PDc9PDdAPThAPThBPjlCPzpEPztEPztFQDxFQDxFQDpEPzlEPzlDPjhFPjhEPTdCOzVCOzVCOzVCOzVCOjdCOzVBOjRBOjRBODNBODNBODNANzJANjQ+NzE+NzE+NzE8NzE8NzE7NjA6NS84NS44NS43NC83NC85NjE5NjE5NjE6NzA8NzE9ODJBOjJCOzFDOjFEPDFGPDJKPjJLPzNMQDJOQDNOQDVOQDdOQDdMPzZLPjVJPDNIOzJFOzJFOzJCOTBBOC9AOTE/ODA/ODA/ODBAOTNAOTM8NS9NRD1NQDpLOjNUQDlSNjJPMCthPDZcMy1gNS5gNCteLydeLyVmNixtPTFxPTCJST2PRzuXST+fS0GfRj6bPjeaPTaeRDumTkSkUEWoVkqrWUulT0KZQTWXOzCbPjaTOTiROTiMNjWGNTKGODSEPzh8QDZyPjFyQjRvQTJxPTB2OjCCNzKMNDOSLTGaJyzISEnoYmHFRUTNV1XheXarVk+GRjyEVkZtUj1pW0FpYkZqZUhqYEVuXkR8ZEyNalSSYkyybV3RbmjbWF3gO0znLUXyK0j1MEz2QFnsSVzkW2XlbnLie3zbgH3bg3/YiYLDf3a9gXe6hHi2hniyiHitineoi3mljHiagG+Zfm2YeGmTb2GNYlmEVU17SUJ4QT51OjxpLjJkMDJhMTFQJidHJSNMMC1NNTFHNC5FMixEMS1GMS5GLixHKypLLS1RNi9ZSDRgVzpmX0JnZEVrb051fFp1hF1vgVlsg1dsh1pwjV1ykmFzlWJ1l2R3mWZ2m2hylmpzmG9zl3FxlW9zlXR3mXh6mHx5lnp4lXlzjXJth2prhGZpgmRhelpUbU1PX0ROTz9TS0BQRz45OjQ5OjQ5OjQ5OjQ6OzU7PDY+PTg/Pjk+PTg+PThBPjlBPjlCPzpDQDtEPztEPztGQT1FQDxFQDpFQDpEPzlEPzlFPjhFPjhFPjhFPjhFPjhEPTVDPDZDPDREOzRDOjFCOTJCOTJCOTJCOTJBODNBODNAOTNAOTM+NzE8NzE7NjA7NjA5Ni84NS43NC83NC85NjE5Ni85Ni86NzA8NzE+OjFBOjBCPDBDOzBFOy9JPTFKPjBMQDJMQDJOQDNOQDNOQDVOQDdNPzZKPTRJPDNIOzJFOzJFOzJDOjFCOTBAOTFAOTFAOTFAOTFBOjRCOTJEOTNJODFMLytWLixqNzZ1OTl7OzuFRUODRD+ESECFSUGGRz6OSUKZTkihUEyiT0eTRDeUQjSaQjafQzigPjOcNy2cNy2fPTCjQzWbPzCZQDCgRTOkRzanRjauSDq2TkW0TE2vSEylQESZOTuROTiNPjqDQDh4PjNvPjB6STuFTEGEPziELCuSKS6zOUTSTFfcS07fTU3KPj3AQD/QYFyzWVGEQDWCVER5YUllW0BeXT9paElzbE92Z0p+ZEuWY068ZFjWX1vmVVrrQU7yLEX+JUT/Jkj/J0n/Lk75M07yPFLwSVrrUF7lUV3jU13gWGLbYmnVZmzUam7SbXHPcXLNdXTJeHfHeXfKfHzJeXrIdnjHcXTGa3LFZm7FYWvDX2vFYG6zU1+lS1WaR1GNREuGRUltNjlIHBtUMS1NMCpIMStKNi9LODFLOjJPPjZVRThbTzVjWjlnYUFpZkVuck96gl16iWJ0hl5yiV9wiV9wi2BxjmB1kmR3lGR3lGR3lGZzkml4lnJ6l3h5lnh+mH2DnYSFnYeDm4WBmYN6knpyiW9thGhogWRgeVtUbU1OYUVSU0FWUEJVT0M4OTM4OTM4OTM5OjQ7PDY8PTc/PjlAPzpAPzpAPzpDQDtDQDtDQDtDQDtEPztEPztGQTtGQTtGQTtFQDpFQDpFQDpHQDhGPzdKQTpJQDlIPzhHPjVGPTZFPDNGPDNFOzFEOjFEOjFEOjFEOjFEOzREOzREOzRDPDQ/ODA/ODA8NzE7NjA6NS86NS85NC45NC45Ni85Ni86NS87Ny4+Ny9AOS9COTBDOzBFOzFGPDBJPTFLPzFNPzJNQDBOQTFNQDBQPzVNPzRMPjNLPTJJPDNIOzJFOzFEOjBDOjFDOjFBOjBBOjA/OzJAPDNAPDNEOzRVRDxSMy5qMjOOQUetTFfDVWDLXWbGX2KbQj6XST+WTEGcTkKsUkq+VVLMT1PETEulQDSdQjCgQDClPzGlOy6jNyukOCunPS+rRTahPiuYNySdOielPi2sQS+yQzK2RDqnMDKvOkK5REy9TFK6TVKtS0yWQT6CNzF7OC92Nix4MiqEMS2cMze5PUfVR1foTVviRknPNTPQOjm9MzHITkvGY12USj+MW0p9Y0xqX0NnZEV0b09/cFGBaEqNaE6waFnkYmL1UVr0RFH2N0n9MUr/Mk7/L03/Kkj/Mk/8MEv3MUr1NUzyNE3wMkvzM0zzN1DyQFjvQ1vuRl3tSWHrTmPqUWXoVWjoVmvlU2rkUmnjT2nkTmnnTmzrUG/yU3PzVnX+aIXxYXzlW3TVVWzNWWzJZHKoUl1yLTJeJidZMCxXOjRRPzVCOi06OCk+QjFMTjlWTzNhVjZlXz9oZURxdVR/hmV+jGl3iGR4jGl1i2Vyi2Ryi2N2jGV5j2h6kGl6kGqAlXaEm36KnoWNoIqSo5CXqJaYqZmWppmRopKHmIZ6jXlwg21nfmJed1lUbU1QY0dTWERYVURZVkc3ODI3ODI4OTM5OjQ7PDY9PjhAPzpBQDtCQTxCQTxEQTxEQTxEQTxEQTxFQDxFQDxHQjxHQjxHQjxGQTtGQTtGQjlIQTlIQTlMQzxLQjlKQThJQDdIPjVHPTNGPDJFOzFEOjBEOjBFOzFFOzJEOzJFPDNFPDVFPDVAOTE/ODA9ODI8NzE7NjA6NS86NS86NS85Ni85Ni07Ny47Nyw/OC5AOi5DOzBEPC9GPDBGPS5KPjBLPy9NQDBNQDBNQC9NQDBPPzJPPjRMPjNLPTJKPDNHOjFFOzFEOjBEOzJEOzJCOzFAPDFAPDNBPTRCPjVGPDNTODFbKiaJOj++VGDZVGXmVWbjVWPLSk+fMzCWOi+RPjCZQTOuRj3FSUfVQkjNPkCxQjenRjWpQjOsQDOvPzOwPjOzQjS0RDayRzWpQi+jPCmkOyipPCirOiiuNiatMyi2OTe6OT29Nz68Nzy/PELGSkzEVFO+WFOZPzeMNCqJLCWdNjHDSEvcT1fiQVHbM0DeOjnNLirTODTINzTGRUDIXVWpV0uQV0Z3V0B2ZUl+cFN/cFGEZkqQZEupb1vVdWnuU1f8RFD3O0r4OUn+PU7/QFH/Okz5NEj/P1P+OU36NEv9M0v9MUr/L0n/ME7/NlP/M1T9NFb9Nlf6N1f4OVr4PVz3Pl71QGH4Q2b2QGb1P2X1P2f4P2j8Q23/RXL/SXP/T3X/UXX+VXbyU3HnVG7lYXjWZna3V2J9MTVqMC9YMSpQOCxHPi8+QS47RC8/Ry9QSy5fVDhnYENva058fGCIjnKHkXZ9i3F6jXF8j3N8j3N6jW96im19jG+DknWIl3qVo4qcqZWjrp2msaGstKexua6wt7Crta2hq6KUoJSDkYJzhHFofGNddFhTbE5QZEhSWkNXWURZWkg2NzE2NzE3ODI4OTM6OzU8PTc/PjlAPzpCQTxCQTxEQTxEQTxEQTxFQj1GQT1GQT1GQzxGQzxHQjxIQz1IRDtIRDtKQztKQzlMQzpLQjlLQThKQDZKPTRJPTFIPDBHOy9FOy9FOy9FOy9FOzFFOzFFOzFEOzJEOzJAOS9AOS9AOTE/ODA8NzE7NjA7NjA6NS87Ny47Ny47Ny48OC0/OC5BOy9DOzBEPC9HPTFHPi9LPzFNQDBNQDBOQTBPPy9PPzBPPzJOPTNOPTNKPDFJOzBHOy9EOjBEOjBEPDFEPDFCOzFAPDFBPTJBPzNCPzZLPTRcNS53MzKtTFPbXWnmTV/lQFHXNkW3JiuoMSmdNyiSOiaXPCmsQDPDRD3UPj/NOzuxPzWoQjSqQDKtPzKyQDW4Qzm8SDu7SjysPi+qPy+oPSumOymqOSmwOiy3Oy+8PDHKRkHOREHQPj/QNznWNzzeQkXiTE7dUk/EQz7GS0PNVEzUU03ZS0rbP0LgNT7hMjfbNC7aNy7QMSvPOjS/ODSzQDm1W1CWVUN7TjmCYkmGa1CEYEaSW0atZlTLcmTnbWjqRUvyOkTqOUPnPETnQkjnRkvoR0zqRk30SlPyQk3yOUn2NUj5Mkf9L0b/Mkz/OFL/OVb/OVj/Olj9Olr+O13/PV//QGL/QWX/Q2n+RGv+RG39Qm38Q2/8Q2/8QnH9Qm//R3D/QGj/R23/TXDySWjpT2vlW3LZY3O9WWOOP0RgJiRRKyJWQDNWTz1JTDdARC1SSjNlWUN1alaAe2eOjXmZnIuVnIyIk4OCjoCJl4iPm42MmYiHkoKKk4KXno6kqJmytqe4vK6/wbbAwbnCw73FxsHDw8O+vr6wtbGiqaKNl4x5h3Zpe2Vcc1lUbU9SZkpRW0JVWkNXXEY1NjA1NjA2NzE3ODI4OTM6OzU9PDc+PThAPzpAPzpDQDtEQTxFQj1FQj1HQj5HQj5HRD1HRD1IQz1JRD5JRTxJRTxLRDpMRTtMQzpLQzhMQjhLQTVMQDRLPzNKPjJJPTFHPTFHPTFGPDBGPDBFOzFFOzFEOzJDOjFBOjBBOjBAOTFAOTE9ODI8NzE7NjA7NjA7Ny47Ny47Nyw8OC0/OS1BOy9EPC9FPTBIPzBKPjBMPy9NQDBOQTBOQTBPPy9PPy9PPzJOPTNNPDJMOzFJOzBHOy9GOTBDOS9DOzBCPDBCOzFAPDFAPjJBPzNCPzZOOzRtODSXRkXEWV/bV2LfQ1HeOEbUMzu9KyutMSehOCWYOiGXOSCkOya2Pi7DOjK+NzGnNyyiOi2lOS2nNyyvOjG4Qji6RTu3RTquPjKtPzCnPCykNieqNim2PjDDRDvKRz2+OC3OQDbhRD/sQkL0PUHzOT7rMjfeLjDbNzXiR0LoU0zlTkfcPTnZMTDjLzLqNjfZMSjePC/NLCLQNzG+MyywNy/JZ1y4bFyOV0OHWkODVj+JUj2pXEzObGHhZ2LkVFTwRUvxPUbkO0DZPT7SQT7SR0LdT03rV1ftTlLvRE3wOkf2NUb3Mkb4LkT7MUf+N07+OFP9OFT9OFb+OVf/O1z/PmH/QWX/Q2v+O2X9PGj9Pmr9P236Pm74Pm/0PW32Omr/SHL/O2H/P2T/S27/S273Tm3vVW/jWm7ocoLCYWqYSUx0OjhcNi1QOStQQzJVTTpeUUFyZVWIfG6VjYKfnZGmp5+hpp+WnJiVnpuep6Smr6ymrKiip6OmqKO1tLDCwbzMycDRzsXV0MzV0M3Uzs7Vz9HRy8/Lxsq/vcCwsq+Yn5iAjH5tfmtgdFtXblJWak5TYEZWYEVYYEg1NjA1NjA1NjA1NjA2NzE4OTM6OTQ7OjU9PDc+PThBPjlDQDtEQTxGQz5IQz9IQz9HRD1IRT5JRD5JRD5KRj1KRj1NRjxNRjxNRTpMRDlNQzlNQzdOQjZNQTNOQDNNQTNKQTJKQTJJQDFIPzBHPTFGPDBEPDFEPDFDOjFDOjFBOjJAOTE/ODI/ODI8NzE8NzE8OC88OC08OC08OC1AOi5BOy9EPC9FPTBIPzBLPzFNQDBOQTBQQDBQQDBPQC1PPy9PPTFPPTFNPTBMPC9JOzBGOi5FOC9DOS9COi9BOy9BOjA/OzA/PTFAPjJAQDRQOTFyMS+oSkvBU1a7PkS9MDbCMDPBLy+6MSmpMSGjOSOcPSGZOx+bPCChPSOlOyWkNiWeNimgOC2iNiylNCytODG3QDq4QzyyQDaxQjetQTSoPC+mOCuvOjC8QzjDRD3FQDfDPi3PPi3ZNSvhKibtIiX6JSv/KjH/LjTtKSrnLivhMyzfNCzgMyzjMizpMC3nMivaMiXWNibQMibPNyzFNi69PjfIYFXSf3GmZVOPVkKKTTqjV0nIZlvfZF/nUlToQ0n1Rk3tQETfPz/UQDzJQDjGQDfRRkHjTUzvSk70QEv5OUj9N0j8NUj4M0X3Nkf6O036OFD8N1L7NlL9NlX/Nlj/OV3/O2H/PGf/Pmv/P23/QHH/QnT/QnX+QnX8QnT5QnD/Rm36QWH+RWX/S2r+S2v/VnT/X3r1XXTyan7mcH7Tb3euXmGDQ0FnNi9oQjdzVUp5ZVyMfXajlpCto6Gyrqu2traytrmqr7Owt722vcW9wcrAw8rDwsrJxs3Vztbd19vi2tjn3dvp3d3m2tzl2N/k1+Dg1N7Zz9jKxcu6urqip6OIkod0gnFleGJcc1dbb1Nbak1caUtdZ0w1NjE1NjE1NjE1NjA1NjE2NzE4NzI5ODM8OzY9PDdAPThCPzpEQTxGQzxHRD1IRT5IRT5IRT5IRTxKRj1KRjtLRztLRztOSDpNRztNRztNRTpNRDtNRDtNRD1OQz9OQz1NQzdNRDVLQjNKQTJIPjJHPTFFPTJEOzJDOjFDOjNBOjJBOjRAOTM/NzQ8NzM8NzE+Ny8+Ny88OC89OTA+OjFBOjJDPDJEPTNIQDVJPzNMQDJNQTFOQTBQQDBPQC1PQC1MPy9MPjFNPTBMOzFKOTFJODFFODBDOTBAOS8+Oi87Oy88PDA9PjA+PzFBPzBTOC2HPDfEXFvKWlmuODarLiqyMSuuLiWtMiOsOSasQiqqRiymRCejQSajQSaiPCOfOSOgOSqjOzCmOjCmNy6tPDS2Qzy3RTuwQDWrPTCoPC+pOy6sPDC7RTnGTEHFRTy8OCy/NiTNOijdOy7mMyzxKyr5KCv9Jiv7JSf4Kir1LivvMizrNCzoMyrlMynkMijgMyXgOirRMh/cPzDONinIOC3CPzWzQTbRbGC/Z1mlUkKoT0HLY1rnaGLmUlLqQUbzQkrrPkThOz3WPDzNQDnBPjS2OCy5Ni7EOTTiSEjpQEXwO0T2Okj6Okn4OEf3O0n7P07+QVX/P1b+PFT+OVT/OFX/OVr/Ol7/O2P/Pmn/Pmz/Pm//PnD9PnH6QHL4QHT3QXH3Q2r/TW3/U3P3SmjrQGD9VHP/Z4X/ZYL3XXfvX3jnaHvccH3GcXinZ2eNXlh7WlGXfneqmZK+sK3EvLrGwsPIx8zHx8/Dw8/LytjMytjRytrXzt/f1OTm2+nq4Ovt4+vv5eby6Ob06Ojw5Obu4ejt4Onq3efk2OLRytHBv8Krq6mRlo96hnhse2hidV9gclhicFZib1NjbVQyMS8zMjA0MzE2NTE4NzU5ODQ5ODQ5ODQ7OjU8OzY9PTU/PzdBQTlDQzlFRTtFRTtISEBISD5ISDxKSDtLSjhMSzdNTDhOSzhNSjlKRjpHRDtKRkNOSU1OSVBHRE9EP0VORT5MQzRKQDRLQTVNQzlMQjhGPTRCOTBFPDVDOjVAOTM/NzRAODU/NzU8NzQ8NDJDOjVCOTRBOTY+OTU/Ojc+Ojc/OzhAPDlCPzpEQDdHQDZKQDRMQDBPQC1PQCtMPyxHQC5GPy9JOzBLODFNNTNLNjVKODhGOzlCPzo2OTA0PC85RDQ6QS82OSQ/PShiQzG8al65SkGmNyylNSmnNyulNSelNyaoPSujOCSlPCaqQCqtQCmsPSmsOSauNiWrNiWkNiehNymiOCqmPC6qQDKsQjSsQjKsQTGpPiyrPSytPCyzPS+9QzTERjjAPjG6MibHOSvMOCrQOCvWOC3bNy3iNS7pMy/uMS3xLiz0Li3zMCzxMSzqNSrjNyndOinbOijcOSbUMx/QMyDPOCfGNye+NijCQjXPU0nITkPPU0vhXFfuXVrwUFLtPkPyOT/3P0fqQUbfQ0TVQUHIPzm7PDOxOy+wPC+yPDDKTEDUS0PcR0PhPj/rPEH3P0f9P0n5O0f+RFH8Q1H+RFL/RFX9QFb8PFX/PFr/QmT/Rmv/QWr6O2f1Omf2PG35Q3P9SXn/S3r/TXn/TXT4UHPwT3DnTWnqTWr8WXj/Z4j/X4P1R2z2V3foX3nDXm69e3+HYV6PeHCnkYS7p5zRxLvd1tDd3Nrc2+De3Ofi2+vm1+zr2O7x2fH23fP34vP35/T16/T07vL59PH59PD58e/27e7z6Ozu4+np3uTm3eLW0NTNycq7urijpaCLkIl5g3hyfW9we2t9hnN4gWx2fWswLi8xLzAzMjA1NDI2NTM3NjI4NzM4NzI6OTQ7OjU9PTU/PzdBQTdDQzlERDhFRTtISD5ISD5ISDxKSDlLSjZMSzZNTTVOTThLSjhLST1LSkVQUFJXVWBZWGpWVGpST2BPSUtNRD9IPzpGPThHPjlIPzpGPThCOzVEOjhBOTY/NzQ/NzRAODVAODU9ODU7NjI9NC89NC89NTI8NzQ9OTY+Ojk9PDo+PTlCPzpEPzlHQDZKQDRNQDBPQC1QPytMQCpCPyxCPy5GPDBIOjFKNjVJNTZGMzVANjVAPDk6PTY7PjVAQDRFPC1KOSleQjSATD6uUUKrOy2gMiOhNiajOieeNySeOSWjPiqhOyWnPCiuPyuzQC22PSy3OSq4Nii1NymqOSmlOiqkOSmlOyuoPi6rQTGrQi+rQC6uPyyrOiixPCu/RTbGSDnBPzG8OCvANinLNyvPNyzQOS7ROy3UPC/YOi7gOC/nNC3uMS30Liv0LivxMCvqNCnhNyjXOifVOiTePCfZNiPVOCXUPSrMOyrBNSbEOi/PRjzRRj/aSUTpT03zUFH0R0nwO0D1OkH4Q0jlQkXaREPSQkHFPji3OzGuOi2qPC2rPS62RTXGTD/UTkXcR0PjPz7vP0L6P0b+QEr4Q0r3Q0z6RFD/RlT9QlP5PlP8Plj/QmH/Rmj/Q2n8P2n5QGr5QnD8Rnb+Snr/S3v/Snr/SHT1S3DxUXP1XHr5X3v7WHf8TnH9RWv6RGzvRWnaS2fIX3CxbnVrTEmQfnSwlonMsqXk08ns49zr5+bq6e7q5/Lt4vP24/n74fr/4v3/5///7P//8v7/9v7/+fv++vf9+vX89/T69fL47/D06+7x6O3v5uvm3eDc1tjKxsWzsq6eoZqOk4yJj4WIkIOPlYeJkICGjH4vLiwwLy0xMC4yMS80My81NDA3NjI3NjE6OTQ6OjI8PDQ+PjZAQDZCQjhDQzlERDpJRj1JRztKSDtMSThNSjdOTDdOTDdPTDlLSTpOS0JUUlNfXmZpaHhtbYVsa4praINgWWlZUVxPR1JIQEtIPkdHPUVFPEFAOjxDOjs/Ojc8NzQ8NzM9ODI+OTM+OjE9OTA4My05NC47NjA8OTI9OjM+OzQ/PDVAPDNFPjRHPzRJPzNMQDBPPzBQPy9QPy1MPyw8OyY6PSg/PCtBOy1CNzFBNjI+NDI7MzA9ODRCOzVIOTROMi5ZLClsLy6HOz2gRkWjOzCiMiSfMSCkOSelPCmeNySeOCKiPCakOyaqPSmxQS22QS+5Pi67PC2+Oi2+PC+yPC6sPC6pOSupOSurPCutPi2tPi2tPCyyPy2wOCi5Pi7LTD3LRzq8Niq6MibJOS7QNizUNivUOCzWOi7YOi/cOC7jNi/oMyzwMC30Liv0LivwMSnnMifdNibUOCLSNyHdOCTcNSPaOSfaPi/TPS7INinFOSzLQTfJPDXNPjjZRUHlS0nqSkrpQ0PsP0HrQ0PeQ0HVRD/NQj3CPTS2Oi6uOCqrOiqsOyusOCnARDjUTkXdSUXgQEDoPkH3Qkn/SFD0QUf0QEn5Q0/9R1T+RVX6QFX7P1j+QV//RGb/Q2n/Q2v/RnD/SXf/S3v/THz/Snr/Rnj/SHf/S3T6TnT/Wnz/YYD9VXbxQ2T7SWv/VHbcP1zNSWDYe4W4fHxhQzuPfG6ujoHVs6fz29H77OX68vD59/r39P307Pv66///6v//7P//7v//8///9///+////fz//vv//fn/+vj/+Pb/9fb98/T78PT58PPw5+rl3+HTz86+vbmtrqiipZ6do5mdo5ejq56eppebo5YvLiwvLiwwLy0xMCwyMS0zMi41NC82NTA4ODA5OTE7OzM9PTU/PzVBQTdCQjhDQzlIRTxKRjtLSDlNSjlQSzhPTThRTDhPTDtMSj5RUExeXWJtbHp6epKBgqGAgqiAgKZ7dZdya4plX3tZU21UTGRNRVpHQFBCPEhEP0ZAOz88ODc7NjM7NjA8OC89OS47OC86NzA5OTE7OzM+OzI/PTFAPDE/Oy9BOy1GPy9IPy5LPy9NQC9PPzBPPy9QPjBMPy9APSo/PixAPS4/Oy8/OzI+OTM9OjU6OTQ8OTREOTVNNTFWLStqKS2EMjieOEOrPkOmNy6lNyilOiiqPy2oPyygOSahOCOkOyalOiarPCmzPiy5QC+9Pi/BPTDFPTHEPjK9PzO2PTKyOS6uOCqvOSuwOiyyOiyzOSq2Oyy5Oy3EQjTLRTnIPjO+MSfAMijNOS/WNSvYNCraNi3bNy3eNy7hNizmMyzsMSrzMCz0Liv0LynvMCjkMibbNCTSNiDQNR/XMh7aMB/aNCTcPC7WPS/QOS7NPTLSRDrENS3FNjDKOzXYREDiTUnlS0neQz/WPTjTQDnOQTjHPjS+PC+1OiuwOCqvOSuxOy2sNCa9PzPRSEDZSEPdQkDlQETzRkz9TlXwP0XwP0X2Qk3+SFX+SFf8Qlf6QFj8QV7/QWP/Q2b/Rm3/SXL/TXn/T3z/THv/SXn/RHb/Tn7/Un3+S3L4TW//VnX/VXX3TWrwRmPvS2bSPlbhZHT+n6fTj45kOTJsSj6leW7QpZz11Mv/6eP/9PL//f///P/58//87///7///8P//8v//9P//9///+/3//Pv//fr//Pj/+vj/+ff/9vf/9fb/9Pj+8/f26+/s4+Ta1dLJxsG6ubSztKyxtKmwtqq2vrOwuK2stKkxMCwxMCwwLyswLysxMCwyMSw0My41NC83Ny84ODA5OTE7OzM9PTM/PzVBQTdEQThJRTpMRjpOSDpQSjpSSzlSTTpTTDpRSz1PSkRWVFVmZHF3eI2GhqiNkLmPk8OPkMaOi8CHg7Z7d6lwbZppZI1fW35VUG5OSmFLR1hFQk0/PUI7Nzg5NTI5Ni84NSw4NSw2NzE3ODM4OTE7OzE+PC8/PCtCPSpDPClHPyxKPytLQCxMQS9NQDBNPzJMQDRLPjVMPzZLPjVGPDNCOTI9ODI6OTQ2OzQ3PDU5PDU+OjFINC1ZMi13NziUP0SmPkWnOTyqOzCqPCurQC6sQS+pQC2lPCmmOyerPiqnOCStOie1PCu8PS7BPC3FOy7KPDDKPTPFPza+PjO6Oi+3Nyy3Nyy4OCu6OCu6OCu7NyvHQTXNQzjFOC7BMSbGMynLNy3PNSvbNCvfMynhNC3iNizjNSznNSvsMSrwLyr1Lyz2LyryLynsMCfiMiPZNCHQNR/PNB7WMR7ZLx7YMiLYNinXOS3UOjDWPzbYRT3WRj7NQDfJPDXLQDnWS0TZTkfSRT7FOzHFPTHCPDDAPC+6Oyy3OSq0Oiu2PC25PzC1OS2/PDLJQDrSQz/bQ0LjREjtSk/2T1bsP0XtPkPyQkz7SVX/Sln9Rlj6Q1n7Q137QF/7QmT/RWz/SnP/Tnr/T3z/THn+SXb/Snf/VIH/VH39SnH5SW3/U3T/VnT4TmnrRF7kRl3qWGv/lqL/tbzznZ6OSEZrLimma2PNlo/zyMH/497/8fD//P3//f/89/7+9v//9v//9///+P//+v///P///f3//fr//Pj/+/j/+fj/+Pf/9vj/9ff/9Pj/9Pj98fPz6erk3NrW0c3NysPJyb/KysDKzcLJ0Mi+yL+3wbg2NTE0My4zMi4xMCsxMCsyMSwzMi00My42Ni43Ny84ODA6OjI8PDI+PjRAQDZCQDRKRDhNRThPSDhSSztUSzpUTTtTTDxSS0FRTElaV15saXx/fp2Mj7iWmcyZntiant6ZmNqUkdSMismGhb+BfrV4dqdua5ZmZYddWndWVGlNS1lEQUo+PD87Ojg7NzQ3NjI1NTU0NTc2NjQ4NzI8Oi4/PCtDPipGQCpHPypIQCtJQSxJQjBJQTRIQjZIQTlHQDpLPTxJOztDOTo9Nzc4NzUzODQvODMvOTE3PDU3NCtDMSddODB+Qz2WR0OePj+eNTGnOy+qPCuqPy2qPy2pPiypPiqsPyuwPy2rOCWyOSi5Oiu/OS3DOSzIOi7NOjDPPDTLPjXGOzTCOTHBOC7BOC7COS/COC7DNizFNy3RQznQQDfDMCbDLCPQNy/WPDTTMirgMyzkMijnMivoMyrqMyvtMivwLyrzLSr2Lyr1LinxMCnsMSjhNCTaNSLRNiDQNR/YNyPZMyPWMyTVMybVNSnUOCzUPDHWPzbsWVHhUkrTSEHMQzvKRTzMST/IRTvAPjG8Oiq8Oyi8Oiq5Oim3Oii4Oiu8PjC/QTPBQTbBPDPFPDbPQT3XRUXdR0jkSU3rTFDoQkbqQEPwQ0n5S1T+Tln8Slr8Rlz8Rl/4QV/5QmH9RWn/SnD/Tnf/T3r/Tnj/THb/UXv/Unn+T3b9T3T/Vnn/XXv/U2/uRF76VGzuUWT3ZHT/kp7/i5X0g4nHYGSnTU21amfOj4rvvLj/3tn/7+7/+vn//P79+//9+v/++///+///+////P//+/3/+/v/+/j/+/j//Pn/+/r/+/r/+Pr/9vj/8/f98fP57e/y5ubn3dvf2NLb187d28/g3tLf4dbc49vP2NPFzsk8OTQ7ODE4NTA1Mis0MSo0MSo1Mis2Myw3NC04NS45Ni87ODE9OjE/PDNBPjVDPzRKQjdNQzdQRzhTSjtXSztVTD1VSz9TSkNTSktdV2NubIKCgqaRlcWaoNqfpuqiqfGhpe+eoOuZm+WVmN2UldaQkcqJib2Cg7F6eaFycZFmY35YVmtQTlxJR1JGQ0xDQko/P0s9PUc7OkA7OTo8OTQ/Oy9DPS1FQCxGQCpGQStFQi9FQzRDQzdCQztBQz5AQUNCPEZEPkxDQU5FRU9DSE5BSUw+SEk+R0RDSEFBPTJMOi5nRjeDT0GNSTyOPzKUOCmlPi+pPiyrPiqsPyutQCyvQC2wPy2xPCqxOCe2OCm9OSrDOSzIOC3MOC7SOTHUOzXPOjTNOjPLODHLODHMOTLNOjLMNzDLNi/TPDXVPjXSOTHMMijONCrYOzLaPDPXMyrkMSrpMSfsMSruMinwMSnyLyn0LSj2LCj3LSn0LynwMSnpMyjiNSfZNiXSNyHPNyDUOSXVOCXTNiXRNCXSNCjTNyvSOC7QNy/jTkfoWFDnWlPaUUnMRz7ERDm/QDe5Pi+5PCq5PCa5PCi5Oie4OSi6OyrAPjDDQTTJRDvGQDfJQDrRRkPVSUjWSEfYR0rfSUvmRkjoQkTtREn1TFP8UVr7T137TF37S2D2RF73RGH5Rmb9SWz/TnX/T3j/T3j/UHf3VnjzVXb0VHb8WXj/XXv/Wnf7UWvySWD9V2v2VWfqTV72Xm3iS1rmVGHlVGHXWGHBZWbIg37lq6f/1NH/6+j/8/L/+Pn//v/7/P/7/P/7/P/8/P78+v39+fr99/f89/T/+vf/+/j//Pv/+/r/+Pj/8/P97vH66+7w4eTp3d3k2dXi2dLm39Xr59vx7eHx8eXs8+zb5uLO2dVAPTY9OjM6NzA3NC01Mis1Mis1Mis2Myw3NC03NC05Ni87ODE9OjE/PDNAPTRCPjNKQjdNQzdSRjhWSjpXSztYTDxXSz9USUNTSk1eWGZwbYiChKuRl8ucpOOjrfWnsP2qsf+mrPqhp/OgpO6fo+qdoeGZm9aVlsySksSJiLR5eZ9qaYtgXXxYVXBSUGhPTWVOSmNLR15GQlNAPUg/Oj4/OjZAPDFBPi9DQC9DQjBCQzNCRDc/RD0+REA8RUQ7Qko+Q1ZDSWFMUmhVXG9cYnJgZG9iYmpkYGFmWFdhSkRsRz6DU0WVWEaTSjeRQCuZPiuoQS6uQC+uQS2vQC2wQS60QS+yPSuwNya1Nyi8OCvCOCvIOC3NNi3RNy/VODHYOzTSNzLQNzLQNzLRODLUOTTUOTTTODPTNi/eQTrVOC/RMyrWOC/ePTXePTXaOTHcNSznMinrMCfvMCjxMCn0Lyn3LSn3LCj3LCj3LSn0LynuMinpNCnhNSfaNybUNyTPOCPONyLPOCXONyTPNibQNynSOSvRNyvONCrLNCvjTkfzZFzrYFnVT0bEQTe6OzK1OS24Pim4Pie5PCa5OyW6OSa9OSrAPC/EPjLKRDnKQTnORT/VS0jTTEnOR0TNRUXWSEfjSUnmQ0ToRUjyTVP4U1r5Ulz3T176T2H0SF71R2D4R2T7SWn/TnL/UXj/Unn/VHrwVXXvWnf5Xn39Xnz5VXD1TWf5T2n/WW7/W23/Y3TwTV73VGX0T2D8VWf1TF/kUl/AXl+7dnHXnJj6ycX/5eP/7ev/9PT///38///7///7///7//79/f39/Pr++fb9+PX/+PX/+fb/+vn/+vn/9vb88PD46ez05ubr3d3o2tnk2dPo3tXw6N358+X/+uz+/vL0+vbh6+rT3dxCPjVBPTRAPDM+OjE8OC86Ni04NCs3Myo2Mik2Mik3Myo4NCs7NjA+OTNBPDZFPjZJQDdNQzdSRjhVSTlXSjpYSztaTEFbTkhUSU1YUmBnZIF8fqeNksqXoOOeqvalsP+qs/+rsv+stP+ssvyqsfmqr/OorOypq+ifodqZmtKNjcGBf7F0cqFoZZJdWodYUn5YUXpZUXZWT25NSF9DP00/OkA/OzpCPzg+PjRAQjVCRTo/RD08Qj46Q0I+Rkg/TFVEVm5RZoNhco5pc450do+BeI2Eb4CAXmyKW2OSV1meV1WmVk2mTT+fQC6cOSSgOiSnPCisPSquPyyxQC6zQC20Py22PSy5Oyy6Nie+NijENirLNy3RNy3WOC/aOTHaODPXODTYOTXZOjbYOTPYNjHYNjHaODPdOjPmQzzgPTbaNzDjQDf+W1L/bGP/XVTnPzblMyntMinxMir0Lyn0Kib1KCX4KCb4Kyj3LSvzMCztMivjMSfaMCPUMSLUNCTTOijMOybKPCjNPCnPPCrSOizSOSvSOCzRNy3aQDjPODHcR0H0Y17lWFHLQjzFQDu3NCq3Oia2PCS5PCa6PCa9Oii/OivEPDDGPjLHPjTMQzvZUErfWFLUT0rDPzrAPzrPSETeSEfiR0XmSkvvUFTxUlfvTlbtS1jxTFz5Umb4T2b3S2X3Smb8TWz/UXP/Unb9Unb0V3buWHX1WHX7W3f/XHj/WnP/V27/Vmv/YnX9Vmf/XG3/W2zxRlj0RFj/UWXuVmXGZmeqaWXKj4vntrL40s//6+f97+78+Pf5/fz5///5///6//78/v3//vz/+/j+9vT++fX/+/f/+fb/9vT/9vb/9fX26Ojm2Njj1dTe0M3h1tDx59789Of++Oj//On///P6//no8fDY4eBDPzZCPjNBPTQ/OzI9OTA7Ny46Ni05NSw3Myo3Myo3Myo4NCs6NS89ODJAOzVEPTVIPzZMQjZRRTdUSDhWSThXSjlZSz5aTUVVSk5XUV9lYn95e6SKj8mUneKbpvWjrv6rtP+stf+utv+vt/+wt/+vtvyvtPivsvWpquuio+OYmNiMismAf7t1ca5pZaBjXphgV45gVohdVH9WUHRNSWJGQ1RCQUlBQUM8PDpBQj1GRUFDRD9BP0BEQkVPTVJXVmRjaIZxdZp/faKHfZ+SfZyge5qlcIqkYHWsWWm2VmG6UVW4SEawQDSsOymsPCatPSeoOCSoNyWrOCauOSiwOCeyOSi1Nyi4Nii7MyXCNCjKNy3TOjLZPDPePTXfPDXfPDXhPjnfPDffPDfhPjnlQj3oQz3nQjzmQTvlQDrmQjnkQDfcOC/VMSjYNivrST7/W0/xQDbuNizqKyPuKSP4LSn/Ly3+LCv2KCj6MC71NC/vNjHnNi7eMynWMibUMiXPNibLOifIOyfKPCjNOijPOSrQNynRNSnQNCjTOS/PNS3UPTblUErlVFHbTEjNQj+3MSi8Oyi7PSa9PCe+Oye+OSjAOCjCOizEOi/IPjTLQjjVT0bcV1DSUknDRD2/QzvMSEPbTEjfSkblTUzrU1LtVFfrUFbpTlbsT1r3Vmb4VWj5U2n6Umv8Um3/U3H/U3T/UnXyTW34VXT/XHr/X3v/XHb/VW/7Umn7UmX8VWb3UmL/Wmj/WmjzTl74U2P+WWnfU162YF+XXle2gX3ZqaXuyMX94d756en9+PX6/Pn5///4///3//36/v3///3/+/v/9/X9+PT++fX++fX+9vP/9/b/9fX26urq3Nvk1tPd0Mrf1czv5dv89eX/+ef//en//+/6//jo8e7b4d9FQTZFQTVDPzRBPTI/OzA9OS48OC07Nyw4NCs4NCs3Myo4NCs6NS89ODI/OjRDPDRHPjVKQjdORDhSRjZURzZXRzdZSTxZSkNXS0tYUF1iXnlzdZyFisKQmdyYpPCgq/qqs/6ttf6vt/+xuf+zuv+0u/+1uf+1uf+vsvmsrPSjo+uZl+COjdODgMd4dbxzbbNrYKJpXZtjWpFdV4VWUndOS2hFRFZAQEw4NTxBPEBLQUJMQEJRPkJaRUpwV12CY3OYcpeleqeuf6uye6O4dpzAcJPCY4PAVG7CR1zQS1zRSFDEPDy6NS64OSq1PCewPCWwOyewOymyOim0Oyq3PCy7PC3APC3EPC7ENirLOC7TPDHZPzXfQTjhPjfgPDPfOjTcNzHZNC7YMy3eOTPmQTvsRT/pQjzkPTXjPDTbNCzYNCvbNy3UMifMLCDWNirpRzr1Sz7yQDbvNC3wLSn2LCr6LCz8LCz4KizwKinsLyvoMi7jNS7cNCvYMSjVMSfRMyfNNyjLOinNOijQOinSOyrTOirUOCvUOCzRNCvWPDTVOjXVPDflT07tWVfZRUXCMy/AOyy/PCjAOyq/OinBOSnAOCjAOCrAOCzGPTPHQTbPSkHYVUvSUkfGRz7ARDrHRz7WS0TYSUPdTEnkU1DlU1TiUFPiTVPlTlfyWGT2Wmj9W3D+WnL8Vm76Umz7UWz/UXD9R23/UHb/Wn3/W3v/VnL9VGv+V2v/XG37WWj4Wmj7YW32YGvtXWfvZm7sZm3JXF+gXVd7T0aYbWbBmJTdurbw1NH04N//9fT5+ff5//35///3//36/v3//////f//+Pn8+fT8+fL8+fT9+PT/+fb/+Pb57uzv5OLl2tbb0Mrc0sju5Nj99uT/++j//ef//+36/fTq8Oze499JRTlIRDhGQjZEQDRCPjNAPDE/OzA+Oi86Ni05NSw5NSw5NSw6NS88NzE+OTNAOzVFPjZJQDdMRDdPRjVSRTRVRTVXRzhXST5YTUtYTldeWnFwcJaAhrqMltSVoemdqfWosPmpsfmts/2wt/+xt/+yuf+0uP+0uP+vsfyrrfilp/KfnuqXluKMi9eCgc19ecV1bbZwZ6pmYJ5fWpBZWIRRUXVHR2NBPlE9NURIOEJUPUNgQEVuQ0qAT1WWXWSrZni/a4/JbprLb5jJaY/IYIPJV3jGSWfEO1XGMkjZQVDgRU3ROzzGNzHEPzC9QCyxOiStNiKtNSSuNSSzNSa2Nyi8OCvDOy3IPC/TQDbXQDfaQDbcPzbePTXeOTPdNi7bNCzTLijSLSfTLijYMy3hOjTjPDThODHcNS3cNS3QLCLNKR/ZNyziQjbcPzDQNCXLLh/pRjfzSTz9SD/8PDf0LSrxIyX1Jyn7LzLxLS7rLy7kMi7eMyzaMSrXMCrWLynTMCfTNyrSOSvWOivYPC3aPi/bPzDcQDPcQDPSNirmTELlSkXONTDfR0bzWlzfSUvVQT/IPC/EOyvDOirDOirCOirCOirBOSu+OSrCPDDCPjLIRjnPT0LOUETGSDy/QzfBQzfOSD/RRj/VSkXbUEvdUk/ZTUzaS03cS1DrWGDzW2f8YXH/YXX6WG31T2f1TWf/Tmv/T3X/Unn/VXf/VHH8VG39W3D/Y3X/anj/Z3X6Ym/1YW3tZGzjZmzZaGrOZ2i1ZmGNXlRlRzx/XlWpiIHNq6nlx8Xv2tn/8/P5+Pb5/fz4///3///7/////v///P//+fr++/b7+/P7+vX++/b//fn/+/j+9PL47enq39ne1Mvd08nt5tb/+OX//uj//+b//+v4+u/q7+jj5t9OSDpNRzlMRjhKRDZIQjZGQDREPTNDPDI/ODA+Ny89Ni49Ni49NjA+NzFAOTM/OjRDPjhFQThLQzhORTZRRDNSRTJWRjZWSDtaTUdWTVJbV2hsa4t+grGKk86Sn+Oapu6mrvepr/mtsP2vs/2ws/+wtP6ws/+vs/2rrvuoq/ikp/Sgou+anOmTleKKjNmGhdGDf8l7dbtta6xkZZ5fYZJZW4RSUXNOSGJXRllfQ1FtQkyBRU2YTVSsVV28W2LKWmjZUnDiUnXfVHXZUGzSSmLNQlfHOErFLj/UOEXjQ0vmR0vYPj7NPjbMRjrDSDa2Pyu3Pi24PS26PC29Pi/DPzDKQjTQRDfVRTrZRTnaQjfbPjXZOzLZNi3ZNSzaMyvXMyrUMSrXNC3aNy7dOTDfODDeNy/dNi7cNSzWLybZNSvXNyvPMiPNMSLSOSnVPi3UOynYPC3mRDf4SkH9RD/5NjT1Ki32Ki33LzL3NjftNTXiMzDaMSzXMCrXLyzZMC3ZMCvjODHkOTHiOjHiOzLgPDDfPTDcPzDaPjHRNyvvV0z4YVrTOzbROzrmUFHcRkjmUFHPPDTKOi/GOCzFOSzEOi3EPC7DOy3AOyy+Oi2+PC7DQTPHSDnHSTvCRDa+QDK8PjDJRjzKRTzOSULVUEnXUk3VTkvTS0vXTE/pWmDwXmj8ZnL/aHj8XXHyUGXzTWX9Tmv/Vnr/VHj/UnL4VG32XXH7aHj7anf3ZXL8ZXTzX23sYGvqa3LfcnXDamaqZFyebGF9ZlZYSDlrWEqUfHK9oJzewsHu1tb+7u/79fX7+/v7///5///9/v///v//+///+v3//vn7/vX7/Pb//vn///r//vr/+/X/9/Lx6OHk3NHh2czw6df/+uT//+b//uX//+r3+evt8Ofo6eFRSz1QSjxPSTtNRzlLRTlJQzdHQDZHQDZCOzNBOjJAOTE/ODA/ODI/ODJBOjRAOzVCPzhFQjlLRTlNRjZQRTNSRTJVRjNVSDdZTENVS0xaU2NpaYV8gauJk8iTnt6apOumrPiprPusrf2tsP+usf+usf6tsP2tsP2prPmnqvekqPKipvCfo+2anuiVmeOSlN6SktqJis18gMBzeLJvdaltcJ1pZ45qX315X3iCV2qOUF+jT1y7U1zNVF3WUFfbSFLlQFHoP1LkQ1LcRFDWQ0vPQETKOTzJNDbkSkznSUrhQUHVNzTOOTXOQTjIRDi+PjHDRTbDRTbFRjfJRTjORjjRRzrXRzzaRz3WPjPVOzHWOC/VNCzWMyrYNCvbNCzaNi3bODHdPDTgPTTfPDPdOTDcNS3cNSzbNy3SLiTdOzDaPS7NMSLGLR3ONybSPSnNOibMOSfUOCniOi/zPTn/QED/PD7+MzfzLC/qLC7hKyrYKinUKyjXLyzeNDTkODjpOTnvNzXwNzTuNzPoNzHjNy3cNirXNSjRNSbNNSjnUEX/bWPbSEHINDLXQ0PTPkLqVlbZQTzSPjTLOC7GNivGOi3GPC/DPi/BPS67OSu7PC2+PzDAQTK/QTK9QC68PS67PC3DQzbERDnISD/QUEfTUkzQT0nSTkzVT07pXmPuYWf7aXT/bnr/ZHX1Vmr1UWn/VW//V3b/VnT6WHDxXnD0bnn2d4Dta3PeWGHxYG3xYG3sYm/vc33siIrMgXyqdGiZeWpza1hPTjpfVkeDcWevlpLcwL/v1dj86ev+9PX9+/z9/v/6/v/+/f///f//+///+f7///v5//X6/fb///r///r///j//ff//vb58Oft5drp4dT079z/++X//uX//+P//+j5+ury9Ofu8OVTTT1STDxRSz1PSTtNRzlLRTdKRDhJQzdFPjREPTNCOzNBOjJAOTNBOjRBOTZAOzdBQDtDQztJRTlNRzdPRzJSRjBVRjFVSDVXSz9SSEZYUl5qZ4J9gaeJk8SSntqYouekp/amp/qrqfyrrP6srf+trv6srvusrvuorPamqvSkqPGjp/ChqO6gp+2dpOibouaZnuKSmtuLk9KGj8qDjcKEiLeDgaiIeZqPbYiaY3qpWGm7UV/PTVngSVLoQUnqPUHpPTvjPjjdQznWSDrOSTjFRjPCQzDFQDHkVEngRz/aOzfYNjTYODjYOjvROTjINzTAOi++PC6/Oy7AOi7COCvDNyrGNCfGMibONCrQMyrRMyjUMynWMyrZNSzdNi7cOC/ePTPbPTLcOzHbOC/bNy3aNizYNCrXMynVMybTMyXQNCXPNibSPSnRPirKOSTAMhzIOibKNCXVMSfnNTH6PDz/PUD/Nz33MzfqLTHhLS7ZLS3XLy7cNDPjOTrpOz3wOT32Mjb4MDP0MDHtMS/kMSreMijVMSXPMyTJMSTRPTH6al/kVEzIOTXQQD/LOj3kUlPkSkjcQz3ROjPJNi7GOC7FOzDCPDC/PS+6Oyq8Py29QC68Py26Oyq6Oyi9Oyu+PCy8PjC8PjLARDjITELMUEjKTkbMTEnQTkzoYWXsYWb4aHL/b3v/aHj3Wmv3VWr+WnL/WXP7XXTuYXLmanTrfYDxh4nod3naX2TxZ3T+bXzzZXXrbHf2kZXsop/ElIqijXxoalVIUTxXVUZ0aFykjIjbv77y1dn54+b/8/b/+vz+/v/8/f/++////P//+v//+P3///v5//X3/fP9//f///j//fb//ff///b/+e/17+Hy7Nz69eH//ef//eT//uL//+f9/uz5+uz39+tWTz9UTj5TSz5QSjxPRzpMRjhMRDdKRDhIQDVGQDRFPDNCOzFCOTJBOjJDOjNBPDZDQDlERDpKRjpNRzdPRzJRRjBUSDJVSDVVST1RR0VXUV1qaIB+gqiMlMWTndiZouefoPKjoPemo/qnp/2oqv+pq/6prP2nrfulq/WjqvKjp+6ip+ukqe2mqe6lqO2jp+6YoOiUoeWUn9+Un9eVm82alb6gjK+qg6ClZX+0XXDCUWPQSVfcQk7lPkbrPEHsPDzqPzjjQTTcRTTUSTTKSTPCRi6/QizCPy3iU0XeRDzdOTfmPj7qREblQETZOD3ONjXNQjvIRDjJQzjHQTXGPjLDOSzCNinCMifGMijLMyjONCrTNSzYNS7ZNC7bNC7bNCzkQjfdPTHZNyzaNizfOS3fOS3bNSnVMSXYOCjNMiDKMSHPOSjOOCfHNCLKNyXUQzDINybOOCrXNizeNS7mMy/uNTP2Ojn7Pz7/TEv6SEbyQkLsPj3qPD3nNzrlMjbmLDH0KzH4KS/0LC7vLy7oMSvgNCrZNSnTNyjGMCHALh/0ZFnrXVPPQDrUREPLOzvfTU3qUlHgSEXTOzbJNi/GOC7GOS/DOy2+Oiu+PCzBQC3AQS67PCm3OCW4OSa9PCm+Py61NymzNyu4PjHBRzrFS0DFSUHISULLSkXlYV/mXmDxZGr+bnf+a3XzXWnwWGX4XW36XnP1YnToZG/jbHLsfn/5jYv2hoXpcXP4cnn/eYb1YXHgWGb2iJH/tLTQrqKgm4ddalBEUjlRVD9qYlWbiIHawL/y2Nn24OP/9Pf/+v3//v/9/P/+/P///f//+//++f37//r0//Ly/vL5//T8//b7/fL//fT///T///P79ef38eH++eX//ef+/OP+/eH//+r///H9/fP8/PJYT0BXUEBXTj9VTj5USzxSSztSSTpQSDtNQzdLQzZLQTVIQDNIPjJHPzJIPjJGQDRHQzpHRTlKRzhOSTZSSjVVSjRVSjRWSzlYTkRVTE1aVGJraIN7fqeJj8ORmdeYn+ejpPalovmiovyhovygpP+iqP+jq/+krfyhqvWhqfGhqOylqO2qqe+tqfOxqfasqfigqfiXp/KSoeKWn9amo862nr65hZy4Z3q/TF3RRVLfPk3nO0fnPETmPULgQEDgQEDiPj/fPD3dRULJOjTKRDnKRjq6MSnbSkXoSknpQ0XrPkLoOz/mPD/hPT7aPD3UPDvPQjvIPzfKRDvRTUHNSz6/PTC4Nim9OSy/NyvDNizINS3LMirRLyrULyvbMi/eNS7nQTXfOSvZMSTdMyblOSvnOy3fOCbVMh/PMh/MNB/KNSHHNCLHNCLKNCXNNSfPNSnKMCbPMinRNSnSNirSNCjVMybXMyfcNCngMinmMy7rNTLrMzPpLzLnLTLoLTTtLjX2LTP2Ky/vKyzsLy3qNS7jOSzZNyjQNCXDLRzEMyLnWEjpWU7LOzPfTknFNDHaSEjhT1DcSkrUQ0DMOzbIODDGOCzHOSvIPCvFPCrCOyi+OSa8Oyi7PCm6PSm6PSu3PCy0OCy1OzC5PTG7PzO7PzO+QDTAQDXEQTfvamH1cGnqY1/0bWr7cXHsYWT0Z23/cHn/bHr7aHjwZG/pYmnrZGrubG7ucW/ucW/7eXv/fYX5Wmz8Y3ffYnD7rK+2qpp9kXVdclFKWTpMUjhzblqllYjLt7Dt1dP/7vD/9vf/9/v9+Pz8/P7+///+/////v/7//7w//Tl/unm++rv/+74//b8//T+//P//vH//fH/++7/+ur/+eb/+eP/+eH/+eH8+uX///X///v///tZUEFYT0BYT0BWTT5VTD1USzxTSjtSSTpORTZNRDVMQzRLQjNKQTJKQTJKQTJJQTRHQzhIRDlMRjhPSDZSSjVTSzRWSzdUSzpYTkVVTE1ZVWNraIN7faaGjMCNldOWmuGfnuyfnfGenvSen/mdov2fpv+gqv+hrPugrPSgq+2fp+iipeilpOqpo+2roO6kn++gp/eapvCcoeGjnNCxmMC/jarCcYTEVGLRQ0/iPEbsOEHvNz/qOj3lPD/cQEHbQUPgPEPaOT/aQUTLOzvMQj/KQD3BMzHlT1DmQ0boP0TqO0LnOD/iODvbODnVOjjPOzfURT/GPTXFPDTMRz7MTEHBQzW4Oiy3OSu5Nyq/NyvGNi3LNC3RMi7YMy/hNTPkODTkPjLhOy3eNinfNSbhNSfhNSfaNSLTNB/ROSTLOSLHOSXHOibJPCvLPCzMOCzONCrVMy7WNS3TNyvPNynJNibHNCLLNCHPNCLYMiTeMibjMCvmLizmLC3mLC/mLTLoLjPsKy7tLC3sMC7oMi7gNCrbNSfVOCfSOSfVPy67KhnWRDXQPjHZRj7rVlDaQj/YQkHnVVbiUlLcS0jUQz7NPTXJOS7IOSvHOCjIOyrEOyi/Oie9PCm9Piu6Py25QC+2Pi6yOiy0OzC3PTC4PjG6PzC9PzHBQjPFQzXraVzybWTnYlvwa2b1b2zoYmHxa2z8dHj/cX7/b3z2aXLtXWbqWWDxYmb3cXD+enj7dnf/eH75UmT+W3DkXW72pqmpppNqjGtadE9OXztTWjt1c1ypnY3WxLj24dz/9fH/+vr/+vv/+/z8/Pz6/v37//76/v/1//rt//Ph/+nh/ebp/+vz//H4//L9//L///H//e///e3/+un/9uX78+D68t389N/89+T9+vP8/Pr///1cUEJbT0FbT0FZTT9YTD5XSz1WSjxWSjxTRzlSRjhRRTdPQzVPQzVPQzVPQzVNQzdKQzlKRjtNRzlQSTdTSzZWSzVWSzdUSzpXTUNWTU5aV2JraYF5e6GFibmLkcuRltaYmN6ZmeOYmemane6boPSdo/efp/igqfSgqu+dqOicpOOcouCen+CeneGdmeObmeKWm9+amtqkldCxjMC/gqzHcpPJWXHHQlPXQUzfPkTjPT/lPT3lPD/jPT/hPkHhPkPgPEPXOD3VP0HPQUDKQz/DPDjEOTbpV1fgQkPkPkLoOz/jOTzcNjjWNjbROTbMOzbVSEHEOzG+NSvFQTXNSz7GSDq7PS+3OCm6Nim/NynHNyzPNi7XNTDeNzHmOTXpPTnXMyrXNSraNircNirdNSrdNynaOirXPizFNCG/NB+5NCG5NiK8OCm9OCm9MyjALSXjQDvlPjjePTPVPC7MOSnINyTINyLMNyPSNyXVMyTXLybZLifbLircLi3bLy/cLi/bLCnfMCvgNS3cNSzVMybQNCXQOSbRPirUQS/CMSDnU0XSOzDaQTveQz/oSknwVFXtVVTnU1HjT03dSkPWQzvPPDLKOCvFNibENybANyW8Nya5Oie5PCq3Pi21PSyyPSywOiyxOy+0PC61PS+3PS65PzC+QzTDRTfcXFHqZ13kYVnwbGf2cG3nYWDsZmfzanHgUl7vXmv1aHHyZW3xYGf0ZWn5cXH+eHf6dHX/bnXzSl34UmjkW23xnKGjnIphgGBVb0hPZD1XYEF3d12tpZLh0cL/7ub/+PH//Pj//vr+//r7//z7//37//35//vz//bo/+7c/uPa+N7h+eHo++Xv/Oj2/ev9/uz9+un/+ur/9+b68eD06Njy59X269n48eH++vH9/Pj//vtcUEJcUEJbT0FaTkBZTT9ZTT9YTD5YTD5VSTtUSDpTRzlSRjhSRjhSRjhSRjhQRjpMRTtLRzxPSTtSSzlUTDdXTDZXTDhXSztWTEJVTUtcVmBqaH55eZuChbKKjcKPlM6TldKVlNaVlduWmOOYm+iYnuyaou2bo+ucpeiYot+Wn9qVm9WUmNWTl9aSk9aRkNKFhL2Rg7alfbG3c6LIZo/SVnrVR2HUPEveQUrgQkPeQ0HgQj/hQUHkP0PnPkXnPUbjP0bWOj7RP0DRRUTGQTy6NjHFPjrqWlndQULjQEPmPUDjOj3bODnTOTfQPDjOQTjPRTvCOi67MijAPC/HRTfERTa9Pi+4OSi9OCnCOSnLOC7SOi/ZODDgOTHoOzfrPjjYMSvZMircMyzdNSzgNS3fNy7bOS7WPS/JNyjGOinBPCu+PCy/Oy7BOzDFPDbOOTXrQ0DtQDzkQDfZPTHPOSrHOSXIOibJOyXPPCjQNyfPMSXRMSXUMSjWMyzUMSzRLyrTMirTNSzTNyvQNynNNSfKNyXMOyjMPirMOyjPPCz0XlDgRjzSMy/SLizmQED7V1j/dXP/cm//amf2XlnnUEfVQTfHNSi9LiDEOCfAOCi7OCa4Oym3PCy1PS2yPSywPC2vOy6tPC6wPC+wPC2xOy22Pi68QjPARjfLTUHfYFfiYVv0cGz4dHLmYGHkXWHmXWTWSFTnWWXzZ3L0Z2/2ZWz8a3D+c3b+dnb7cHP7ZW7xRFj0S2LlWGvrkpaglYNfellRbENTaD9cZ0V5fF+wqpTn3Mr/9ej/+fD/+/H+/vT9//f7//r5//r2//jy/PPq++va+N7O89LK68zP7M7X7tLg8Nbp89vy9+H29eH79uP89eP17Nvt4dHp3c3t4dHx6Nn89e389/H++fNcUEJcUEJbT0FbT0FaTkBZTT9ZTT9ZTT9XSz1WSjxVSTtVSTtUSDpVSTtVSTtTST1PRzxPST1RSTxTTDpVTThYTTdZTDlYTDxVS0FVS0lcVV1oZXh1dJN8fqWFh7eMj8KOkMOPkMiQks+QlNSSldyTl+CUmN+Vmt6VndySm9aOlM6JkMeFi8WBh8N9g8F+f7h9dJ+OcJSoZ4/BXITWTnbiQWPoOlXqOUvmQUfgRUPcR0HbR0PfRUXmQUfuPErtPUrmQknXPkDQQD/QSUW/PjizMizIQzzgVVDcREPhQUPjP0DhPj/aPz3UQDzRRDvPRjzHPTLAOCq9NSm9OSq/PS2/PS29Oyu9PCnCOirHOyrPOy/VOy/bOC/gOC/nODPpOjXmOTXkNTLkMjDmMjHnMzLmNDDdMivUMCfLMSfLNy3IOjDENy7BNC3DNDDMOjvdP0DrODvtNzbkNzHYNSzMNCbGNSLENyPFOiXLPSnLOCbMNCbONSfUOCzUOjDTOS/QOC3QPjHKOy3FOCfENyXGOSfHPCnHPCnHOijNPi3NOirYPjLhQzrULy3kOjrgMjTfNTbXNTPWOzbeQz7lS0PqUUnqU0joVEjkVUfLPzDEPy6+PCy4PS23Pi20Py6wPy+uPjCsPC6sPC6sPC6sPSytPCyxPS63QTO6RDbGTEHeYljiY13wbmz0cnLlYGPlYGXnYGf3a3b7b3r3a3btYGjwX2b9bHH/eHv/eXz6bXP4XmrzQVf0Q13oVWjmh42jk4Nnf11ZdEledUlod1CBiGazspbo4sz/+un//e3//u/9//L7//T4//T0//Ht++rk8uHY7tfF6Me75Ly63rq/3rzH4MDN4sPY5szj69Ps7tj08d738t/z6tns4NLo2s3q3M/v4dby6N/x6OHy6eJbT0FbT0FbT0FaTkBaTkBZTT9ZTT9ZTT9YTD5YTD5XSz1WSjxWSjxXSz1XSz1YTD5RST5RST5TSz5VTDtYTTlYTTdZTDlYTTtXSz9VTEdZU1dlXm5uaoN1dJZ+faWEhbGGibSHibmKi8GLjciNjs+OjtSPj9WPkNOQlNOLkMqDiMB8gbh1fLJvdq1pb6tsapyAbIiTY3muWXbLUG/jQmTwN1b2NEz3OEjvQEXlRkLdSkPbSkXhR0foQ0ryPU7wPkzkQ0nXQ0PMQT7OSUS6OzSwNCzJSUDVTEbYQkHaPz3bOzvaPDvYQD3URT/NRzzLRzrAOCrBOCjAOCq+OSi8OSe7OCa9OijAOyjEOynKPSzSPC7XOy7cOC7hNi7kNi/oNTDpMzLoLi/pLDDuMDL1NDf1NzfuNDXmMjHaLirXNC/VNjLRMzLPLzHSLzTbNj3qOkTtMDbuMDLmMy/cMyzRNSnKNyfIOSjJPCjGOCTJNiTONijTOizaPjLdQTXdQTXYQTbTRzjJQTHCOyjAOSbDPCnGPSrFPCrFOCbMOivNNynNMCfmQzzbMi/vP0HjLzLaKizVMS/SNS7VODHWOTDSOC7MNSrGMibAMSPORTXGQTK8PS61OiqxOSmvOSurOiyqOiyrOy+rPTCsPi+sPC6rPCutPCyyPi+1QTLJU0fgZ17gY1/qamnubm/mY2jwanH1b3j6cXv9dH72bXXuYmv2ZG7/cnr/eH7/cXX6aXD4V2b5QVn0QFvqUWbhfoOsl4Z5j2ttiF1viVp5imCNl3K2t5jf3sL59N78+uX//+/7/+/1/+/v/+vn+uTc79nQ483F3sGw1q2o06aq0Kew06u21K681rHH2rrS38Hg5szo6tTy7dry6dju4tTs29Hq2c/s29Pp2tPm2dHl2NBbTj5bTj5bTj5bTj5aTT1aTT1aTT1aTT1ZTDxZTDxYSztYSztYSztZTDxZTDxZTT9TST9USj5VTD1YTDxZTjpaTTpaTTpZTjxZTT9VTEVYT1JfV2JkX3NqZoFzb5B5eZ18fqR+gKmBgrKDhLyGhsaIh8uJiMyJiMqIiMiDg798fbV2d61wcadrbKRmZ6BsYI6CYHGVVl6zTl7SSl7sQFj3Nkv+M0b+OUPzP0LpREDhSELeSUPiRknpQkryPU7vPk7dQUXURkTIQT3JSEK0Oi+xNyzOT0bJQjzOPTjQNjTPMTDQNTHTPjjPRTvIRjnDRDW+OSjDOijCOiq/Oie9OCW+OSa/OifBOibEOSbLOinTOizZOSvdNyvhNSvkMyvqMy3rKivxKi34LTP8LzT/MTf/Mzf/Mzj9NTj5ODv1ODzyOT7yOUH0OUT3N0b7Nkj+NUX0KzX0LTLtMTLjNC/ZNi3QOCrOOyvOPSzLNSbROCrZOy/fPTLiPjTkPTTlPjXfQTbZSjzPRzfJQTHEPCzCOSnCOSfGOCrIOSnJMifTOS/hQDjrRD7eMC/gLi7rNDboNjbYMy3VNy7XOTDXOjHVOzHSOzDNOjDJOy/WTD/MRjq/QDG0OSqwNimsNiirNyqpOCqsOy2tPS+uPjCtPS+rPCurPCutPC6xPTDAS0HaZFreY17oa2nwb3PqaW71cnr8dn/uZnD3b3n5cnn2anP+bHb/d3//dn35aG/5Y273UmL+Qlv3PFnqS2HddHu1momNnnp9mGt7l2aClWiRnXWsso7LzK3g4MTp7NHu9t7l89nZ7dHP5snF3sC81be0y66qyKSawZSWwo+Zw5OhyJmny52sy6G1zqfB0rDO2bvZ3cTl487s5dXv4dbr2tLn0s3j0Mrgz8jazMPVx75bTj5aTT1aTT1aTT1aTT1aTT1ZTDxZTDxaTT1ZTDxZTDxYSztYSztZTDxaTT1aTD9WSj5WSj5YTD5ZTjxaTTxaTTpaTTpaTTxbT0FXTURXTUxcUlpeWGZiXXFqZn9zcI13dpZ4eJx8e6eBfrWEf7+FgsWIgsiJhMeCfb9/ebd6da14cad2b6V0a6JwZ6B6YYuEUVqZSEWzRUjTSE/uQk74Okb+NkH+OUD1PT3uQT3mRD/jRULkQ0joQUvuPU3rP03YP0LRR0TFQTzDRz+yOS6zOi/RVUvDPjXJODPHLyzFKibILyrNOjPMQznDQza8Pi/AOyrEOynDPCnBOifCOyjDPCnCOyfDOCXENSTKNyXUOCnZNyrdNSrhMyrlMynqMir1MzP/NTj/ODz/NDr/LTL/KC3/KC3+KzH8LTP2KTDyJjH3KTb/LD//KkH8IDnzGi/2IjDzKC7tLDHmMC/aMSzUMyvRNSnQNirUNivdOTDmPTbrPjfrOjToNzHoNTDiOTLfSD3XSzzTRTfLPS/ENijCMyXINinPOC3ONCrUNi3mQzzfODLgMjHSICDsODnlNjPVMSjSNCnSNCnPNSnONivKNirINSvFNyvjWU7YUkbKSDu+QDK3Oy+1Oy61PDG1PDGvOS2xOy+xPTCxPS6vOyytOSqtOSyuOi2xPDLQWVHcYl3scHD0dnnubXL1cXz2cn3/eoP/f4n/eYD0aHH3ZXD/cXz/dX//a3T4Xmr2T2H/QV73OFfpR17bbnS6nYuZqYSCnm5+mmeBl2iNnHGhqYK0upbIza3V3L3M2bvB1LSyzKmnwp+evJiatpCWsoyQsYaJs4GGtX6NuYSVwIucwo+fxJGoxZmyyKG+zqrJ0rXa2cTm383q3tLp1s/hzMnbxsPUwbvOvbXIt7BaTT1aTT1aTT1aTT1aTT1aTT1aTT1aTT1YSztYSztYSztZTDxZTDxaTT1aTT1aTT1aTD9aTD9aTT1bTj1dTT1eTzxcTzxcTz5ZTT1XTUNXTEhYTk9aUFhdVWJgWWlhXHJqZoFva45zcJt2cad7dbODfsGKg8mKg8eIf8CKfryIebKDcqiGcqeNdKuHbKOGXISQSEykQjm2QTrNQ0DeQD/oOjv0PD7/REX3PjzzPTzsPj3qQEHrQknqQ03rQU7jQUzQPj7FQDm+Pza3PjOwPC+yPDDARDjSTUTHNjHUOzbNMi7MMy7WQzvHPzO1Nie7Piy6NyXBOifDPCnCOyjAOSXCOSbFOifHOijLOifQOSjWNijYMiTaLiLgLyXsNy71PTX1ODL3NDD3MC34Kir7Jij7JSf7JSf7JSf7Jir3ISn4Ii7/Jzf/KD7/ITv/GDb9FzH/JzjvIyzmIyvjKy3dLS3UKyjSLSncNDHiNjLoNjTuNjbyNjXyMTLvLi/uLCzlLyzcOTLROjHSOTHsU0u7IhrEKyPfRj7ILibNLijePDfoRUDiOjfYLyraLiriNTHlPDffPjTVPC7PNSnLMybMNSrNOy7LOzDFOC7sYljgWk/IQzq5Niy6Oi+4OC2xMye0NiqwMCWwMiauMiavNCWwNieyOiq0PC6zPTGwOjC6QzvWXFfscHDxc3b2eHz7eYP1cXz/fIT9d4D6dH38c3v/cn7/cn3/bXj/Z3P8YG70SVz/Plz/PlvkQVbUZWu0lYCSoXqDnW19mWZ+lGOHl2qUn3eepoGgqIOcqISSo3+Ko3yAn3Z6mnF5mm98nXKBoHaDpHWCrXeDs3mLuH+RvISTvoaXvoecvoyivZCnvJOvvZq+wqfPzLnf08fj0srcx8TUv7zMurbBsqu5qqVaTT1aTT1aTT1aTT1aTT1aTT1aTT1aTT1YSztYSztYSztZTDxZTDxaTT1aTT1aTT1aTD9aTT1cTD1dTT1dTjteTzxcTzxcTz5dUEBbT0NbTkZZTkpaUFFcU1hfVV5fV2ZkXHRpYoNuZ5Fxap14cKyAebyHgMSKgcSPgMGQfrqNdKuMbqKXcaShdaiaap6ZV3udPUGqNSuxNSvCPDPTQDjdPjjoPzrzQT31PTv1Ozz0O0DxPkLuQEnoQUniQEvaQUbHPDm9PTS2PDGxOy+rOiyuOiu9QTXQSkHaR0DcQT3UNjPQNTHVQDnNQzi7OSuyNSO9OCfCOyjEPSrEPSrEOyjGOyjHOijKOSjPOSjPNibUMiXaMiXjNSrqOC7vODDwOTHnMSbnLyXqLiXvLCb2Kyf7Kyn+LCv/LS78Ki36JSv6JC7/Jzf/JDv/HDf/FDP8EzD1HjD2Ljn1MzzlKjHbKCzcLjDeMDLbKy7xOj70Nz33NDr2Mjb2LzT4MDP5MjX0ODfbMi3aOzXXODLkRT/kRT/OLyvRMi7BIh7UNTHhPzroRUDgPTjYMy3ZMizdNjDdOjHUOi7POSrJNSfHNSjIOSvKPDDKPDLGOS/tY1nhWE7JQDi6NCvCOTHDOjC/NizCOS+/NSu+NCq9NCq7NSm4Nim1NSi0NiiwNim0OzC7QjnTWVTobGrvcXT2eHz+fIT4doD+fIT8eYH5dn7+dX//c3//cH3/a3f8ZHH9X272SV3/Plz/PlzpQ1nTZWiujneJmG96lWJ1klx4jl1/kGOKlWuNmHCLlXCFlG1wh11siV1oiVxnjV5rj19xlWV5m2l6n2uBrHSEsXaKt3yNu32QvH+TvIKWvYabu4mbtYahs4uttpe+vajPxrfYx7/WwbzPvLjGt7S6rKmypKNcTDxcTDxcTDxcTDxcTDxcTDxcTDxcTDxaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxcTD1cTD1dSz1dTT1dTjteTzxeTzxcTzxfUkFdUUFcUERbTkZaT0tbUE5dUVNdUlpfU2djWHZoXYVrYpFza6R/drWGfb6Jfb2XhcGZgLebdqmecJ6udaK6dqW1aZixUnS4PES+NS26NCvAPDDLQzfTRTnbQzjkPznxPTz3Oj75OkH2PUXvQEfmQUjZQEXPQELAOza4OTCxOSutOSqpOCitOSq7PzPPRjzZRD7XOTbZNzTaOzfcQz3dT0XOSDy1MyO+OSjBOifEOynGPSvJPSzIPCvJOinMOSnPNynPMiPTLyPfNCruPTP0PzbxOTHpNCvgNCbfNSbiMiXlLyTrLCTuKyXxKyjyKyjzKy3wKCvyJi/4KDb+JTr9HTf8FjP4GDP0JTfyMDvzNUHyOEPwO0TwPEXpNT7kLDbwMjzzLzv2Ljn2LTf1LjP1LjHzLzHtNDLcMCziPTnaNjTfOzn/bWrlQ0HRLy3OLyzZOjffQDzgQTvbPDbVNy7WNS3WNSvSNirINifDNiXCNifEOCnFOy7GPDHGPDHFOzHrYFnhVE3JPDO/MCjLOzPRPjbOOzPSPTbYPTjXPDfUPTbPPDLJOzHDOS68Niq2Nim5Oy+8QDbPVE3jZ2Xtb3L4en7/gYj7fIP7fIP7eYH7eID/d4H/c4H/bn3/Z3b7YHD8W231R17/PFr/PlzsRlrOYGGefmV2hVpphFFohU9tg1J0hVh7iF19iF54hFxxglhgek1ff1BhhVVljVlulWB1nGd9oGp+o22DrHKEsnSItniLuXmLuXmNuXqRun6UuoGTsX+VrICbqYaprZK6taLHua7LuLLItrS4rKyqoaKgl5pbSztbSztbSztbSztbSztbSztbSztbSztaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxdSz1dSz1dTDxeTT1eTTteTzxeTzxeTzxeUUBeUUBdT0JbT0NcTkVbTkZcT0ldT09eUF9iVG1kWXtpXolwZ5x8dK2Fe7eIe7OZhbqlhbSvgKq4eqHGeJ/RdZzMY4zITWzcRlLfQUDVQT3PRTvMSDvNRzvTRTneQTruQEH1PEH6PUT4P0fwQUjiQUbSQEHGPzy/Pza2PDGvOSurOiqqOSmuOCq8PjDORDrVPDfVMzHgOznlQT/hRD/oU0zfVUq/OivBOSm+NyTANyXEOynJPSzKPSzLOSrOOCnNNCbSMibZMinlOS/xPjf1PjbwNS7kLybgNineNingNCrjMSfnLinqLSnsKijsKirqKSzoJyzrJzHyKTn2Jjz3ITv7Hj37JUH7NkjkKDbnLjz/UFz/YGz/UFzyPEnzOUfoKTjtKjjxLTn0MDrxMjfqMDHhKyrXKCXYMC3aNzLUMi/lQ0D/c3D1VlPdPjvlR0TbPTraPDnVOjXSODDRNy3QNirNNCbGMyO+NSO5NiS7OCa/OyzAPC+/OS3AOi/FPDLlWFHcTUfKNzDHMCnXPDfeQTraOzXfPDXnPjnpPTnmPznhQDjZPzXQPDLIOi7BOS27OSy7PTHLTkjgY1/sbm/6fH//hIj9foX4eYD4eYD8eYH/eIL/dIL/bn39ZXT5Xm73VmjzRVz9OFb/PFruSFzHWVqKbFJjckdcdEJceUNkeklsfVB0gVZ2g1hygVhvgVdth1psjlxvlWJ1nWh7pGyBqG+EqnGFq3CFrXGFsXSItHWJt3aJt3aJt3aLuHePuXqRtHyPq3uSpHybpIWtq5a+sqTIt6/HuLW0q66hnqWXkplbSztbSztbSztbSztbSztbSztbSztbSztaSjpaSjpaSjpbSztbSztcTDxcTDxcTDxdTDxeSzxeSzxeTT1eTTtfTjxeTzxeTzxeTzxeTj5eTj5cTz9eTkFdT0JeUEVeT0piTlliUWRjVHFkWn1sZZF4cqJ/d6iDdqSUfaeshqvCianOgp7ad5ThbInbWHfaRF/zQlT6RFDvSlDhSUjQRT7LRTzQRjzZRD7oQkLwQEP1QEf1QkjtREffQ0TPQT3CPze/QDe1PS+uOiurOiqqOSmuOCq7Oy7MPzbhRkHiPTvuQkLrQUHeOzbjSkLmWEzVSz7IQDLAOCi8MyPBOCjIPC3JOirLNynQOCvOMCXXMyngOC/pOzTtOjXtNjDrMCvlLCfjMCzjMS3nMTDsMzHzMjX2Mzf3NDj3NjvsLTXqLDbtLj3xMEPzLUb2KUf9K07/M1L0OUzlMz/wQE3/X2z/bHr/V2b1Q1P1PlDuM0TtM0HtMz7pNjzjOTnbODPONCrHLyTLMirHLijQNzLyWVT2XFryWFbbQT/iSEbcQkDUPDfONzDNNi3POC3POSvKNyfCNSO5OCOzOSS1Oii4PS25Oyy2Nim8Ny7GPTXbTkfZRUHONTDQMS3hPjnnQDrjODHnNTHrMjDuMjHrNTLnODPhOjLYOi/QOS7IOi6+Niq6OCvISULcX1nrbmz7fYD/hYn9f4P1dn32d378eYH/eIL/c4P/a339ZHb5XnD0U2X0Rl39OFb+PVrvTF3AVFJ6X0JXaDxZcT9bdkNmeUtuflF0gVZ4hVp5iF93jGF5lWV4mmh6oG18p3GBqnKEq3KFq3CGqW+HrXKIsHSJs3SItXSHtXSFt3KJuHSLuHeQtnuOrHiOo3iZpIKtrZXAuafOwLXSxMG8ucCoqracnKhaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpaSjpbSztbSztcTDxcTDxdTDxeSzxeSzxeSzxfTD1eTTtfTjxeTzxeTzxdTjtdTjteTzxfTz9fTz9gUEBhUUFiUEZiTlBjTl1fUGVgVXNnYYV0b5d7dJ19cZePdpaug5/Mi6HbgpbmcoXrZHXpUGTpO1L5M0z/PFH7RVLpREvVP0DOQD7RQz/WRULjRUboQkTuQUXtQ0bnREXaRUHLQjq/PzS7PzOxOy2pOCioOSiqOSmwOCq8Oi3KOzPoSUXpPz/rPT7lNzjaMi/eQTruWlD0aFvaUEPJQTO+NSXCNifHOSvIOSvLNyvSOCzRMCbaNi3mOzTpOzTqNDDoLyzqLSvrLS3zNDn1Mzv4Mz38Mz3/MT7+MD39MT35MT71MEHyMUL0NEv1NU71ME72LU//MVj/Pl/mM0j5T1z/YW7/X27/V2b7UGD0RFjpOErzQVHqOkfdMjrSLzLKMi3COC29Oyu8OirEOi/AMijZSkL6a2PdTEfhUEvPOznPOzngTErUQDzKNzDKNy3OPC/NPCvLOinEOyi0OyatOiWvPCmzPi2xOSmvMye6Oi/KRDvWR0HYQz3UNzLXMi7nOzfsOjboMi7tMi3yLC30LCzyLi/vMzHoNzHiOjHaPDHSPjLCNim6NCnFQjrXWFLnamj6fH3/hon+gIT1dn33eH/9eoL/eIL/cYH/aXv7YnT4XW/yUWP3SWD/Olj9P1vwT1+6UU5xWDpTZjhddUVhfElugVN2hll7iF1+i2CBkGeCl2yAnGx9n218pG99qHCAqW+Cqm6DqWyFqWyIq3GIrnGIsHKGs3KEs2+DtXCFt3KJuHSLtXaJrHSOpXeaqISwtJnIw6/YzL7a0czCwsyrscGbobFaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhaSzhbTDlbTDlcTTpcTTpdTDpeSzxgSjxeSzxfTD1eTTtfTjxeTzxeTzxeTzpfUDtgTzthUD5hUD5hUD5hUDxiT0FlTU1kTVdgT19hVW1nYoB1cZJ8dpiAc5GPdY6tgJTNhpTffofucXn5Y2z6UFv6O03/Kkb/MlH/PFPxPE3gPEXXQEXVQ0TUQkPcQ0XgQkPkQUTiQkTeRELUQz7JQDi+PjO4PjGvOSuoNyepOimtPCq0PCzBPTHPPzffPTrlOTnjMDPiLzLgNDLbOTTmTUX8bGHyaFvZUUPGPC/GOi3IOi7JNyrNNivVOC/VNCzeNy/mOTPoNjLpMS/oLyzuMS/1MTX/MkP/MEX/LUb/KkL/JUD/Iz38IDn2IDj3J0H1K0X1Lk31L1DzK1D0KVT/MmD/QWjzQ1j/YG3/aHX4VmXtS1rxTFzrQlXaMkPrQFLdN0PJLTG6KCixLiSrOCalPyaoQCe4Py68OizdWU3hXVHNRz7NRD7BNjPJOzfkVVHVRkDJOTHIOC3JOizIOSjIOSjEPSmxPyemPCaoOyasPSqrNyisMyi8PTTTTEbWR0HdRUDbOTbcMzDpNzPsNTHrMCv0MS39LC//Ky36Li/0MS/tNC/mODHfOzHYPjLJOS69MyjAOzLPTkjhYV73eXr/iIr/g4f5eoH7fIP/e4b/eIT/bn7+ZXf3XnD1WmzrTGD1SWH8OVf7PVnuTV2ySkdoUTFRZDZcdERmfk51iFt/jmOEkGiGkmqIl26JnnOIpHSEpnR/p3J9qHB/qG6BqW2DqWyFqWyFqG6Hq26FrW+Fr2+BsGyAsmuCtm6Ft3KHs3SHrXSNp3ecrIWyuZrIxq/Xzr3Z0sy7v8qkrL+Smq1bSjhaSzhbSjhaSzhbSjhaSzhbSjhaSzhbSjhaSzhbSjhbTDlcSzlcTTpdTDpdTDpeSzxeSzxeSzxeTT1eTT1eTzxeTzxcTzxgUT5hUj1hUj9iUT9iUT9hUD5hTztiTD5oT0tnTlJiUFxjV2tqZn91dpR9fJx/eJeRepargZXGhJLafYXwdXr+bG3/WVv9REz+L0n/NVL/PFXzPE7pP0zjQ0vdQkjWPUDbQUPcQEHeQEHbQT/YQz/QQTnHPjS9PTC1PzGsOyupOCitPCy0Py67QDHKQTfYQz3ZNzThODXeLi7iMzDmOjbTMCfPNSnrVUf/d2rrW1DRQzfKPDDLOzDJNyrNNivUOjDaNzDfODLlNjPnMzLqMDHtMTL0Mzb9NDz+JTb/Izn/Ijn/Ijn/ITj/Hzb9HTX4HjbvGzLuHznwJULvKEfuJkrxJ03/M1z/RWj/YnX/YGz3V2PxUV3yUF3vTVriQE3UMj3aPUbMNzu7Ly6uLyimNSeiOyibPyacPiWqOSeyOCvSVkq7OzLEPzi+NDG9Mi/OQ0DlV1PVSEHIOTHENirFNijENSXGNSTDOiixPCinOiaoNyWtOSqsNCavMSXCPzXbUkrZSUHhSELeOzbeMi7qNDHtMS/vLSv8MjL+LC/9Ky75Ky3zKyvtLSrmMSrfNCzWOCzRPTG/Mii8Ny7ISULZXFjzd3f/iYv/h4r7gIX+f4b/fYj/doT/anz+X3P3WGz2VGnqRFz1RF71NlXxOlbgTFqlSENeSy1NYzVVbz9ifUp0jFyAlmeHmGyIm26KoHKLpXaMrHqGq3eBqnJ+p218pWl9pWeBpWeCpmmCpWuCqG2Dq22CrGx/rmh+sGmBs2qEtm+JtnOJr3KOrHiZsIStu5i/xanLyrXLzcK2vcWeqrqLl6ddSzdcSzddSzdcSzddSzdcSzddSzdcSzdeTDhdTDheTDhdTDheTDhdTDheTDhdTDpdSjxdSz1eTD5cTDxcTDxbTj1dUD9eU0FgU0JfUj9gUEBiUUFjUkJkUUJkTkFkTEJqTUloS01kUFlmW2xua4Z3e56Aha2JiLKPg6mlh6m+iKDQgpLieX7wc3H6amL/YV75SlfxPlHrOkzuP07vQ1HqQEvmPEflPkbhPELfPD/aPD3WPDrPPjnKPTTBOzC4OiynNiavQTCtPCysNii/QTXMRj3MPTXQNzLaODXcNzHeNS7eNi3eOCrdPCrXOifTNiXZOzDwU0zyWk/ZRTnHOCrNPi7UQjPSOi3UMyvwR0LhLy/uNTrzNj3uLDf/Qk3xJzP6JjL/KTL/KDL5HSf9Iir/Jy/+Jy/wHSbwHin5KzfqIC7sJjfxLUHnIzv/WHLnLUT/XWz/X2n+WmP5VVz1UFfrSE3dP0DNODTLPjfEQTe3PzGmNyaZMiGZNiOaOyefPCmnOC2uNy/CRT+/Oze9MzHENjTFNTTUREPbTEjaS0XRRDvIOjDENCnHNSjLNCnFNSq8PC+zOSytLyOrKB6zLSTDOS/SQzvYSD/kUEbfRT3aNzDdMCrnMCzyMjH5MTP9MTT3LzH2MDH2MDHzMC7yMC7tMi3mNS3dOS/VPTC+MiXAPjG5PTPWX1npc3H/j4/7hIb7h4r/hIz/eIj/aH3/X3f/W3X/VW/4TGb4RWPxOln0O1vmP1nbXWmLQDtWRi1MXjZZdUJnhk13ll19nGN/nWeAoWqDpm6CqG+Ap25/pm1+pWx9pWl8pGh9o2Z/o2V/o2Z/pWx/pm2Bq2x/rGt+rWd/rmaBsWeDs2mHtW2LtHKNsHaOrnyZtImnvZmxwaSywa6msrCNmJ56hYtdSzddSzddSzddSzddSzddSzddSzddSzdeTDheTDheTDheTDheTDheTDheTDheSzpcSzteTD5fTT9eTj5bTj1bTj1cUT9eUkJfU0NdUUFdT0JfT0JgTkRiUEZjT0hlTkhpTUpnTlFlU19nX3RubpB5fqiAh7uHisGelcqji7urf6O5eJDTeYPqfHv0dmr2aWD4XWHzT1rsRlLySFP4SVb1RVDvP0rrO0XkOT/gOjzaOjrVPTjOPzfHPjTAPC+3PCyrPCuqPy2pOCiyOizBQTbFPDTHNjHUPDfSNTDWNS3XNSrYNCjZOCbbOibbOyXaOSfdNi7mQTvrTUThSTzQPi/HOCjKOCnTOy7eOzT2SkbkMDHwNjv2NkHxLjz/QE7vJzTzJCz3JSj7KSz9Kyz8Kiv4KCj2KCj3KyzvJCftJSjqJSz9O0TZGyfwNEP8QVLYJjb/anX/Ymr+WmH8V130T1PlQkPXPDjRPja+OCy/RDW5SDapPiyZLx+QKRqPKBmSKBueLSWwOjbRVFDOSEfDNTTGNDXRPT3rV1XYR0LWRz/QQTnHOS/GMynKNizQNy/ONzDHPTPCOTHCNS7DMi3JNC7RODPYPzneRT3kSkDeQTjaNi3dMCrnMCzyMjH7MDP7MDP0MDLzMTL0MDHzLzDzMC7uMS3nNC3fOS3XPTG/MyS+PC+3PTLTXlfpdnP/kJD5hYj4hYr/gor/dIX/Znz/XHb/WHT/UW/+SWj8QGHzOlrxP1/hSWDBU1x7PzdSRi5NXzladkNlh0tzlVl4nF93nWJ7oWZ9pWl9pmp8pWl8pWl8pGh7o2V7oWR7oWR9oWN+omV8o2p9pmx9qWx9qml8q2V9rWN/r2OCsWOFsGiHsmuIr3CIq3OLq3yQrISQqoeMoot4h4BkcHBSXl5dTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDhdTDheSzpfTj5hUEBgUEBdUD9cTz5bTz9bUkNbUUVbUUdcT0dcT0lfUE1jUU9mVFRnVVVnVVVnVlxoXW5saYZzdqN8g7qCisuKjdSYkdegisqqgrS5fZ/PgJPkhIbuf3bzc2r7ZWf3U1ztR1HwRk/2SFL3RVHyQUvuPUXkNz3gNzrZOTnUPDfNQDfFQTS+PzC2Pi2tPi2qPCurOiy4QjbHSD/AOzK7MCnKOjLNNi/QNi7VNyzYOCzZNyjZOCbcOSbgOirdNC3bNC7iQTnpT0PeSDrINSXIMiPZQDLiPjX1SEToMTPyNTv5N0D4NED/RVP4Mj/wKTDrIybsJCf5MTP1LS/vJyfsJiX1MTLrKSr2ODroKzHiKTHrMz3/Ul7vPUv/W2f+XmbxVlzuT1TwTVLqRUndOjvVNzTUPznANizBPzK8QjWzPTGsNy2lMymhLCOcJyCaJR6pLyrHRUPCOjq8LCzIMzXXQUL0Xl3QPzrSQzvQQTnLPTPMOS/UPTTaQDjbQDvbQDzYPTvdPjvjQT/kPj7gOjrjPz3rSUTgQjndPDTZNSzdMivnMS3wMzH1MTL4MDL0MDL0MDL0MDHzLzDzMC7uMS3nNC3fOS3YPjLANCW6OCu1OzDQW1Ttenf/k5L7h4r6g4n9fon/coL/ZHn/W3T/VHH/Tm3/Rmf7PV/0PVzuRWLfVGeiQUhwOzNTSDJRYTxdeEVmh05yk1p1mF50ml94nmN7o2d7o2d5omZ5omZ5oWN4oGJ5n2J5oGF8oGJ6oGN6omZ7pGh7p2h7qGV7qWF7qWB9q2B/rmCHsmqKtW6LsnOJrHSGpneCnnV5k25vhmxTZVlBUE0yQT5eTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTTleTDhgTjphUDxgUT5dUD9aTj5ZT0NYUEVYT0hbUU9fVVRiWFllWF9pWWNsXGZrXmdsYWlsZHFva4JydJp5frV/hsqFjNqMjuGOh9efi9OtisSzgKm9eY7Me4HegXrygnf/c3L/Y2f5VVz0TVT1R1D0Q03yPkfvPELlNjvgODjbOTfUPDfNQDbFQTS8QTG3Py6rOiqtPi2xPTC8RjrMUkfHSD+6NS66MSnIOTHNODHTOzDZPTHbOy3ZNifcNibgOCvgNS3bMivgPTTsTkLjSz3SOizROCrgQjbfNy7wPjrpLzDwMTb3NDz8OEL/Tlr/TFX9PkXyMzjiJCbtLzHqLCzwMjLoKirrLy7yOjrRGhzmMzfdLDLoOUDwRU3/WGPzTVfYPUPaQUThQkbhPkHeOT3cODnYODjTOTfJODPCOTG9OjLAQTrNTkjWVlPQTk7DQ0CyNzK2OTXPS0nZTUzjUVLvWVrqUlHxWVbJNTHOPjbSQjnQQDfTPzXZQjngQzziQDvpP0DnOD3sOT3yP0PvOj/oNTjsPj32TUreOTPbNjDaMyveMyzlNC7sMzDyMjH0MDH0MDL2LzL2MDH1LzD1Ly7wMC3pNC3gOC3ZPzPCNie3NSizOS7LVk/vfHn/k5L8iIv9gYn+eof9b3/8Y3f/WHH/T2z/Rmj/QGP7OVz0P17pS2TYWmiFMzVnOzBXTzhXZ0Nhe0tqiVBzkll0lVx1mF53nWJ5oWV6omZ3oGR2oGF3n2F2nmB4n2B4n2B7n2F6oGN6omZ6o2d6p2Z6p2J6qGB6qF18q11+rV+GsmeLtG6Ms3SKrXOGpnWAnXF0jmlpgGRRY1VEU0w4R0BeTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTteTTldSzVfTTVgUDlfUDtcTz5aTkBYT0ZYUUtZUFFgV1xnYGhuZnNzaHlzZ3tzZ31xaH1vbH1wcYZyd5d2fat6gsF/h9KEiuCKi+WTjeOdjNqghL+edZ+gbIKsbnG8dmzSdmnyc23/bGz/Z2n+XmD7Ulf1Rk3vPELqNz3mNTvhNzjdOTjWPTfOQTfGQjW9QjC4QC+tNym0QDOvOjCwOzHIUkjVXFHJTUO7OzC+OTDBNy3MOS/WPjPbPTHaNircNCfiNirgMyziNzDkPTXlRTniRjneQjPeQTLiPjLbMCbqNzLsMC/vLjHxLjT6Nz//UFj/XWT/Wl//T1PhLjHjMDPgLC33RUXoNjbcLCzbLS7rPkDcMjXZMzf/YmjgPULLKjLKLTTBJirVOz3hQEXbNjrZMzffOT3cNzvNLzDMNDPNOzvVR0beUlPsYGP1aWz0ZWvqXmHEQD7GRUDlXlv4aGf/b3D/amrlS0vXPTvJNDDRPjfXRDzWQzvVPjXVPDTYOjHcNDHuNTvxLTfwLDbyLjjvLDTrLDPzOTz+SkvfMy/cMy7aMyvcMyzjNS7qNDDvNC/yMjH0MDL2LzL3LzH2LjD1Ly7wMC3qMy3iNy3ZPzPGOCq0MiWyOC3DTkfvfHn/kpH/iIz/f4n/d4X6bHz4YXT7VG79SGf/PmL/Ol/6NlzzQWHgTmXCV2FwLytfPzBbVz5ebEllfU1riVN0klx1ll92mV94nmN5oWN4oGJ1n2B1n2B1nV92nl93nl94n2B7n2F6oWJ6omR7pWV8pmR8p2B5p155qFp7qlx9rF6ArGGFr2eHrm2HqnCFpXODoHJ7lW5yimpleGVba15SYlVfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjxfTjpeTDRfTjRgTjheTzpbTj5ZT0VaU01aVFRfWmFoYnBybYF6dYx7dZF7cZN6cJN2cJJxdJNyeJp0fah3gbZ6g8R+hs+EidqLjN6Wj9yZis2bhbaig6OqhJGrfnmfbFuaUT68TULUUUniV1LrV1XxU1LxS03tPkPlNDrpOTzmOTvgOznYPTjTQDjKQjbAQTC6Py+zOSy6QTarNSujLiS+ST/ZZ1zZZFrLVUm4PDK4NinAMynOOjDZOzDaNizeMynkNi3fMSrkNzHjOzLdOS/ePjDjRjXkQjPfOSvfMSjpNC3wMzHvLS7tKi70MTf/RUr/Vlv/XWL/XGHiOTzjOTzVKyz0SkviODnXLy/bNTfMKCnMJyv4WFrdPkLVOT3RNjq6HyPEKCvcPD7mQUXdNDnZLDLeMTfZMDXNKC7SMzfkS072YWX7aG75Y2z3YGn6YGz4YmvWTEzVTkrqXFrqVlTnTU3jSEbPNDLOMy/ZQTzgS0TkT0jfSkPZQDjXOjPXNi7cLi31Mjr7LTr4Kjf1JzT1KTT4MDr/PkP/SkrgMS7eMyzcMyzdNSzhNC3nNC/tNC/wMy/0MDL3LzL5LjH4LTD2Li7xLy3rMi3iNy3ZPTHJOy2zMSSxNyy6Qz3seXb/jY3/iI3/fIj/cYH2aHj2X3L5Umz7RGP/OV7/Nl36NlzwRmPRTmCiSU1lNStWRDBbWUBebEllfE5riFJ0kVt3lV94mWB7nmR6oGN2nmBzm11ynFxzm1x0nF12nV53nl97n2F6oWJ5oWJ6pGJ8p2J7pl94plt4p1l6qVl7qlp+ql+DrWWFrGuHqW2Jp3OJpXWEnXN8lHJ1iXBuf2xmd2VfUD1fUD1fUD1fUD1fUD1fUD1fUD1fUD1eTzxeTzxeTzxeTzxeTzxeTzxeTzxfTjphUDZhUDZhTzleTzxbT0FbUktcVlZfWmFrZ3Zzb4Z9epeCfqGBfKV9d6N7daV4dqdzealzfbB4gbh7hL9+hsSEicmNjs6Uk82ak8eglb2rm7W8prLJranFppSqiG2cZkqcRTKvQTS2QDTCQjnWSEToTk7uSkvsP0PrPT/pOz3kPDvfPTrZQDjQQDXIPjHBPTC9OjC+PzavNCynMSe7ST/RY1bWaFvVZVfDT0K6PjK6NCnHNyzWOTDZNSzfMivnNjDiMCzjNC/iNy/eNy7gPjHlQzTkPjDeNCXmNCrpMCvwMy/wLi7vLS7yMTTzNzj2QkX2TVL8WV7pRkv2UVfYMzfrRkrdODzmQUXaNzrOLjDRMDXkSEvSNzvQNzq5IyXVOz3bODvlOz7rPEHnNjziLTbdKTLhMTvnPETwTFP9XWX/a3P/anP6YGr2Wmf5WGj3W2b0ZGToWlboV1TYQD3PMTDUNDTTMzPhQ0DjSkXpUkvqU0zhSkHZPzfYOTPbODHjMzPzLjf/MD7/MD36Kjf8Ljr/O0X/Q0j7QULjMS/fNC3dNC3dNSziNC3mMyztNC/xNDD0MDL3LzL5LjH4LTD2Li7xLy3rMi3jNy3YOi/NPjC1MSWxNyyyOzXpc3H/ior/h43/dob+aX3zYXTzW3D3UGr6Q2L/N2D/N2H5O1/sTGa/T1t+ODZdPTBORjFWWEBaZUVjeE1qhVJyjlt2lF55mmF7nmR4nmFzm11wmFlwmVdxmlhxmlh0m1x1nF15nV94n2B4oV95ol56pV55pFx4pFl4pFd5pVZ7p1h/qV+CrGSEq2iGqGyHpW+GonGAmm14kWpxhWlqfmNidl1fUD1fUD1fUD1fUD1fUD1fUD1fUD1fUD1eTzxeTzxeTzxeTzxeTzxeTzxeTzxfTjpjUTljUTlhUDxdUEBaUEdcVFJfWmFhX210cop5eJiBgKiDgbB+frB5ea95dbB3d7V3fL54gMF9hcSCiMSFisGNj7+Xlr6gnbysp7u2rLW+s7HIuKvQvqbWwaLRu5bQrIivb1SuXEekRzWoPjDCRz/gV1HvV1bxTk/pQEPqPT/mPD3iPTvfPTrXPTXROjHJOTDBODDBPDW5OjO4PTXBT0XHWE3HXU/RZVjTY1XCTD68Oi3FOC7SOTHXNC3fMiznNjDmNDDhMi3gNS7jPDPnQzfmQzTiOi3fMyXqNSzmLibwMC3vLyzwMzHxNTTnLS7iMjTnQkb3WF32V1z/b3XlRErrSE3gPEP+W2D/b3XePUL/fYL/bXHqUVTUPkDGMDLWOj3ySEvuOT7wNz/4PUbyN0LoLTj0Pkr/XWf/bXf/anL/Y273XWf6Xmv/YW//XW75WWXyXF3jUEniSkfVNzTSLzDZNTTSMC7YOTXfRD/jSkTiSUHZQDjTNi/WNC/cNzHoNjbqJy/8MDz+Mj33Kzb5MDr/PkX9P0HsNDTiMy7gNS7eNi3fNCzhMyroMyzvNC/0NDH2MDH3LzL5LjH4LTD4Li7yLy3rMi3jNy3XOS7RPzK2MCWyNiywNjHocG//h4j/ho7/cIL8Y3jxXHD0WG73T2n7QmL/OWH/PGT2QWLkUmewUVdkLydXRDNHRy9SVDxVXj9idExpgVFxi1t2kl96mGJ8nWR4nF9ymVpul1Vul1Vul1VvmFZymVp0m1x3m113nl13nlt4oVt5o1t3o1h2old2olV3o1R5pVh6pFp+pl+BpmN/oWR+nGZ7l2ZyjF1pglhgdlJab1BSZ0hcTDxeTj5gUEBgUEBfTz9fTz9fTz9hUUFiUkJfTz9dTT1dTT1hUUFjU0NiUkJgUT5kUz9hUD5dUEBeUUlbUVBaU1plYXBzcYl5eJp6fKV+gLGAgbl9f7p4erdyc7Rsb7Z0d8h2e8yAg8qLjcaWl8OkpL6ysLu8ubTLxrPTzLDZz6zbz6fcz6Pd0KPZy5zZwpjRqIi4gGegXkbLemfWdWW9SD/XUU73Y2PpS0zlP0HiODnkOjriOjncNzXZNjHWOzbLODHANS7HQju7PDO/ST/GWEu5T0HOZFbRY1TMWEnFRznEOi/NNi3YNy/hNi/jNC/fMC3fMizgNzDkPTTgPDDdNynfNSjlNyzkLyTqLybsLynuMS3uMjDrNDDoNTHiNjTXNznmSk71WV3tTlPXOD3XNjz5WGD/foT/fob/b3X/Z2//aXD/Zmz1XGHxWFv7Wl//VVr/REv8OEL7N0H2Mj7uKznsMD7xPUj/U1//YGn/Z3L/ZXD+Ym3/Y27/YG/9XWftU1PfRkDWODXWNDHXMTHXLy7YMzHbOTThRD3cQjrZPzfWPDTXOTDbODHgOTPmNjbwNzzzNDvzNDv2NDz1NjvyNTnrMzPjMS/eMyzeNS7fNy7gNSvkMyvpMizvMiz1MjD3MTL4MDP6LzL5LjH5Ly/zMC7sMy7lNy7gPzXMOCy/NiyvLya4OzfSWFf/mJr+e4P/bYD/ZXz4XHLwUGj0R2X8Q2X/O2T5OWD1TmzTUmSJPT9QLCBDOyZDRy5LTTVZX0NaakVjeE1xiFp4kmJ4lmB0lVxylllxmFlslVNtllJul1NvmFRymVh0m1p1nF11nFt0m1h0nVd2oFh3oVd2old2olV1oVR0oFN7pVt7o116nl51l1tti1Vifk1YckNTaj5BVzA/VS88UixbSzteTj5gUEBgUEBgUEBfTz9gUEBhUUFiUkJgUEBfTz9gUEBiUkJjU0NiUkJgUEBmVkdfUUZcT0deVFNhWmFkYG9ta4N2d5Z3eaJ7fa59f7h4fLlxdbVrcLRsb7Zucb51dtB8ftWJidOYmM6op8e4tsHJxbrTzrHb16ri26Xn3qXm3aLk26Ti2KPb0aDUx5vTvJq7nICpfWTFi3fKfW20VkrSYVv2cnDsWlvnS0zjP0DnPT7rPkDnOzviNjbbNjTWPTjJODPKPzi5Ni64PjO9S0C2SDvIXU3db2DUYFHGSDq9NSnEMCbUNi3cNS3bMCniNTHlOTXkPTfgPDPcOC7bNSnfNCrjNSrsNy7tNSvtMivrMCvnMCzjMizhNC7dNTLWODfYPkDkSkzzV1v6XmL8XGT+XWX/YWn0U1vvTlbxUVn/X2f/anH/Zmz1WmDzTlTtNDrxLDX0Kjb3LTnxJzXlIS3mJzbtN0P+UFr/WmT/Ymz/ZG3/ZW7/Y239W2j1UVrlRUXePDfbNjTeNjPfNTXcMzDaMi/bNjLgPjnbPjfYOzTXOjPbODHfODLlOTXnOjbpOTvqNzrrNzruNznuNznsNjXlMzHfMizcMyzdNi3fNyziNizlMivqMSzyMSz1MjD3MTL3MDP6LzL5LjH3Ly/zMC7sMy7lNy7fPDPUPTLCOC62MSq3NzTYWlv/kJP7c33/Znr/Xnb5V2/3T2n5Rmb7P2L8PGP0QGPlT2i5S1Z4OzhMMiM8OiM8QihFRy9PUzhWZEFgckpug1h1j192k110k1hxk1ZwlFRrkk9rlFBslVFtllJwl1ZymVhzmltzmll0m1h1nVd1n1d1n1d0nlRynlFxnVJwnFFumFBslE5ojExigUZYdT9OaTZGXS9AVytAVy1AVy1BWC5ZTDxbTj5eUUFeUUFeUUFeUUFfUkJgU0NhVERgU0NfUkJgU0NhVERhVERgU0NeUENiVU1cUU1bUVJjWWJrZHRxbYR2dZV5e6R5e6x5frZ4fLtuc7VlabBgZ69qbrhydcZ9fdeHhN2XlNupp9i7uc/Lysjc2L/l4bTp5Krt6Kbw6aXt5aTn4afi26fXz6HLw5y4r5Cpm4Gbg2uog3Cnb2CcUke6XVXdbWn3dXXvX1/kSkzlQETrQUTsPkDoODriNjbfPTrUOzbUQTrCNzC3Nyy3PjOuPS+2RjjbalzfaVvZW03KQjbFMijRNCvZNi3ZMizeNTLpQT7sR0PgPTbVMinVMSfaMifeMCXmNCroMSnnLinmLynjMiziNy/hPTTgQjnGLSjKNDPcREPwVlj6XmL3WmHzU1vxUVvoRlHqSFPvT1n8XGb/bXb/bnT0WV/jPkTpLjX0LTT7Mjz8Mj71KzntJzT2NkX/S1f3SVP1UFf4V1/+Xmb/Y2v/YGn3UlnpQkneOTfeNzHjNzXpPDjrOzvmOTXhNTHdNjDdOjPZOzLXOTDXOTDcNzHhODPnOjbpPDjjOTnjOTnlOTfnOTjoODjmNzThNDDbMivaNi3bNy3eOCziNiznMinrMCnzMCz3MTD1MTL1MTP4MDL3LzH3Ly/yMC7uMy7nNi7dOTDcRDnHODC7NC61Ly7kX2L/g4j4bHf+Ynj+V3P6UG3+TGz/Q2b2Ol3zO1/sSWbUU2edREpsOzRPPiw9PCc6PyhFRC9GSDBRXDxZa0VnfFFyiVt0j1pxkFVtj1Jrj09pkE1pkUtpkkxrlFBtllRul1Vwl1hxmFd1nFl1nVd0nFVynFRwmlJtl01rlU1qlExljUdhiEVbf0FVdDtMaTNFYC1BWCo+VSdCXC9FXzJJYzZXSjpaTT1cTz9eUUFdUEBeUUFfUkJhVERgU0NgU0NgU0NhVERhVERgU0NfUkJcUERaT01aUVZiWGNqY3NxbYZ2dZV4eqN6fK13fLRzebdtcrRiaa9dZKxhZ7Fscr54e8qJid+VkeWkoeS2teHHxNnV0c7h3cTn5Lnr5q/u6q3u6Kzp4qvj26ra06nLwqG7tpmlpY2bmYSTiHaYgXGZcmObYlezaWDPcm37i4n1dXTqW13mTE7oQ0ftQETsPD/pOzzfOjjbPDjeRT/TQzvDOjC6Oi+wNimnMSO/STvbYVLqa1zbU0XJOizMNCfUNivXNC3ZNDLxTUv+WljtS0bZODDWMyrbNCveMijfLibhLCXhLCXeLSXcMSnaNizZOzDXPzTCLyfENCzOOjbZQ0LfRkjgRUnkR07qTVbxUV32VmL4WGL5XGX/Z3D/bXX0WWHeO0DqMTfxLjTyLTbwKzTrJTLsKDT7PUn/U1/tP0noQUnqR0z0UVb/WWD/WF30R03kNjjhNTPkNzPqOzjyQD70QD/vPTvmOTXgNzLdODLaOTHZODDZODDcNzHjNzPoOTbpOjfiOjfgOznjOjfmOjjnOjblODTgNS7aMyvaNizbNy3eOCziNiznMinrMCnyLyv2MC/0MjL0MjP3MTL2MDH2MC/yMC7uMy7nNi7cOC/gRjzJOTG+My62LCzuZmr/eYD4Z3T/Ynn9VHH+S2v/R2r/PmPyNlnrPV7jUWjEWGWIQkJnQzdbTjtHRjFBQy1KSDNFRS1MVTZTYz5idExsg1Vwi1hujVJrjVBpjktnj0lokEpokUtqk01rlFBtllRvlldwl1Z0m1hzm1VxmVNvl1Bqk01nkEpljkhkjUdgh0RdgUFXeT1ScThNaTZMZjZOZTdPZjhMZjdPaTlTbT5VSDhXSjpbTj5cTz9dUEBdUEBfUkJhVERfUkJgU0NhVERhVERgU0NfUkJfUkJeUUlWTVJfWGhuZnt0cIl4dJd4d6F4eqt5e7RzebdqcrNgZ61bY6tfZ7Bqcrt2fMaAhM6TleCenuStrue7vebLyd/U09jd287h38bl4b7m4rzk37ng17ba0LXOxrG+taatp5uYmoyMjoCJhXmKfHGRdmubc2mobWW6b2nmiYTugX7zc3LxZWTxV1nwTU7uREXsQEDjOjfgOzfkQj3eRT/MPDPGPTPEQjWvMSOuMCLHSTvcWEvWTkDMPS/OOCrQNirRMyrWNDL1VVX/a2j6XVjjRD7cOzPfOzLjODDiNC3jMiziMSvdMCnUMCfNLyTGLyTCMCPFOSzANCfBMynLOjXXQ0HbRUfbQkfaQEjgRE/rT1ryVmHyVmH6Xmn/Z2/zWWHhQkfqOjztNTftMzjvMjjxMz33OUP/SFP/Vl/kNj/dNDvfNjvrQUT5Sk/8SU30O0HpMTPoNTHrOTXvPDjyPDnzOznwOjfpNzPiNzDfOzLcOzHbOjDcOTDfODLkNzPoNjTpNzXmOjjkOzjmOjjoOjnoOzfmOTXhNi/cMyzbNy3cOC7fOS3hNyrlMynpMSnxMCn0MS3zMzLxMzP0MjL0MDH0MS/yMC7uMy7nNi7eNy/gQzrKNzDAMS3AMTP3anD/cXr6ZnT7XXT6UG3/Q2b/PWT/OWP1OF7mRWTZWm2rVlt3RT5kSj1hWUZUTztLSTRQSTZHRS5HUDNMXDhabEZmfE5thVNtilJsjE1ojUpmjkhnj0hnkUlpkkxqk09slVNulVZvllV0mVZzmFVulVJqkkxmj0tjjEhhikZfiEZagUJYfD9TdDtQbjhPazpSbD1XbkBacUNVbz9WcT5XcUFSRTVVSDhYSztaTT1bTj5cTz9eUUFgU0NgU0NhVERhVERhVERgU0NgU0NiVUVhVlBeVmNqZXx5dZB9eZp6eaF4eal2ebBzd7RqcrNjarBbY6tdZa5ocLl2fseBh9GIjNOZnd2jpeCvs+O7v+XGx+PPzt7U09jX1tHZ18vZ1sfX0cXSycDMw77Fubm0qKyjmp2Ki4Z4e3R5dnF1bGV/bGWNb2eOYVudYFvAc23YeXXwf3v8fHn/cnD9Y2P2U1TwSEfvQz/qPjrhPDbgQTvROjHTQzrdVErCPjK4Nim9OSzCPS7IPy/PQjHXQzXWQDHRNy3QMi/qTE36X13yV1PfRD/ZOjTbODHgNzDmOTPnOTLnOTLiOjHaOS/ROSzKOCvEOCmwKBi4MyLIQDLTST7SREDLOzrMNzvPOkDRN0HiSFLtVl/wWWL1Xmf3YGnqVVvcQUXlQD7sPzvxQUP6R0r/TFT/UVn/VF3/Vl7hNDraLzXcLzPnNzr0PUH4Oz/3NDjzMTLtNDLvOTXwODbtNDLrMjDqMjDnNDDhNC7jPDTgPTTfPDPeOzLhODPkNzPoNDPoNDPoODjnOTjoODjrOTnrOTfpNzXiNS/eMyzbNy3cOCzdOivfNyrjMijnMCjvMCjyMSzxNDLwNDPzMzLzMTHzMS/xMS7sMy7nNi7gOTHZPDPMNzHBMC3RQEP/bnX9a3X5YnHwUmn1SGb/O2H/NF7/NmL7PmTkTmnKXGmLR0ZqRjpdTDxdVkNYUT5SSjdPRzRJRC5ESi5HVTJTYz5ec0hnf01qh09qiktnjEdnjEZmjkdmkEhnkEppkk5rlFJtlFVtlFVxlVVvlFFqkU5njktjjEhgiUVfiEZehkdcgkVbfkRXeEFWcj9Vb0BZcEJdckdedUdbc0NZdEFYc0BOQjJRRTVVSTlXSztYTDxaTj5cUEBeUkJhVUViVkZiVkZhVUVfU0NhVUVmWkpoXVluZ3d1cI58eJl7eaB3eKZ2d61wda9qb69haKxeZq5fZ7BlbbZweMB9hc2JkNiPl9iZoNahqNaqsdu0ud+6v9/Awd3Dw9vHxtjGw9TFwdDBu8m8s8S7sMG1qLymmK+Wi5yIhYxxcXF0cG9wZmV3aGWGbmqEX1mVZF+bWlS5ZmDZc27wenb/e3f/d3P/aGb8Wlf+Uk71SELmPTbnRD3YOzTbRz3qXFLFOzDEPDC9Nyu+NijHPi7RRDPUQjPUQTHXQTPSODbYPj7dQ0PcQkDWPTfVODHYNy/eNy/lOjPmOTPlOjPiOzPbPjXVQTXRRTjMRzauLRi8OyXNSjjRTD3GPTW7MCvAMDDKOT7XQUrhS1TrVWDwWmXwXWXsWWHfTFLUPkDPNC/YNy/gOznqQEDyQ0j1RErxQknuP0biNTvfMjbjMzbvODz1Nzn4MTT7LzL8MTTvMjDwOTXwNzTsMC7oLCrnMCzmMy7gMyzkPTXgPTTgPTTgPDPjOjXmOTXqNjXsNjXsNTfsNTftNTfuNjjuNjbrNTTkMi7eMSveNy7dOS3dOivfNyrhNCbmMSbtMSjxMSzwNDLuNTPxNDLyMjHzMS/xMS7sMy7nNi7iOzPSNCvSOjXGMjDnVVj/cHj5Y27yWmnnSWDzRWb/OGL/L13/NWL/QmjcTGWxUFlqNS9eRzdYSzpVTjtbUD5WSThNQDBKQzBARixBTy5LWzZYakBieEdmgUpoiElmi0ZlikRji0JjjUVljkhnkExokU9pkVJrklNuklJskFBoj05ki0phikhfiEZfh0hfh0hfhUhfgkhdfkddeUZdd0hgd0tjeE9jek5ddUNbdkFadUBKQzNNRjZRSDlUSzxXSz1ZTT9cTz9eUUFkV0ZlWEdkWEhiVkZfVUlhV01nXlVsY2Z3col5dZp4dp50c59ycqR0da1scK9iZ6laYalfZa9mbLhtc792fMiBh9OPk92XnN6bodWgp9Oprdqus92xtN2ytNu0tNq2tNu1sdazrdGup8mrocSqnsKkmLyZi6+Ifpl8eIZkYmdpZWZjWVpqW1h7Y195VlCSY12KTkaiVU29YFjWa2Pxd3L/f3r/enf/bmr+YVz3VE/pR0LuT0ndQj3eR0DqV0+6LCK+MSe+NCfHPi7RRTbLPi3BMiLKNyfbRTfeRT/TOTfMMy7NNTDUOzXXPTXdPDThPTTkOzTkOTLeNS7XNCvPNSnKOCvFPCzCPy3UUz7IRzK9PCm+Oi3DPTLEOzXCNzTCNDPcS07eTVLhUFXlVFnoWV3lVljcTU/TREDJNSvRNyvYNy/dNTLiMjTlMjbmMTjmLjbsND7sMzvzNT/7OUL9ND76KzX/KDP/Lzn4LTP5NTf5NTnwLi/rKivpMC7oNTHiNS/jPDTgPTTgPTThPTTkOzbnOjbrNzbuNjbsNDbrMzXsMjXtMzTtNTXqNDHjMS3bMCjeOCzdOivdOiveOCjgNCbjMyTpMybsNCruNTDuNTLwNDLwMy/yMi/vMizsNCznNi7kPTTNLybXPjnMMzX5Ymf/b3n3W2nwTmPqQ135RWj/OmX/MF3/NmH2R2jJSl2TQ0ZSLCNWSThTTDpPSDZbTz9VSTlGPy1IRjE+QidASihJVTFTZDpfckVlfUlnhEpliEhjiENhiUJiikNjjUVljkhmj01oj1BpkFFskFBrkE1mjUpjiklhiEdgh0Zgh0hghklegUdef0ZffUdgfElhe0tke01mfE5mfk5deENdekBee0NEQjZGRDhKRjtQRz5SSD5XST5dTT5fTz9gUT5hUj9gU0JfVkdiWVJnYl9vam5zb353cZN6dKB8eah5d6lwcKZnZ6NgYaJcX6RgYq1maLVvcMB5esyEgtaNi9+Wkuecmeagnt2hodejo9mkpNqmo9ilotelodSkoNOlntGjnc2imsmimciflsOZjbuOgrCDfJ5ybn1pZ2xkXmBmWlprWVVyV1B9V06MV0+VUkmoWlC1WFDBWlPYa2TseXL5gnz/i4b5dXH/dXPtX13fUEzZRUHvWlTMNzHFMirENirDNyjANyfDNybGOSjKOyvQPC7VPzHSOC7WPDLXPzTTOzDNNSjNMyfYOi/iQDXgOTDhOTDeNy7XNyvPNynJOirGPyzEQS/CPS7GQDTLRTrNRzzMQzvFPDS7Miy2KybHPDfQRULZT0zgVlPjWVbhWFLYT0nQQzrMOyrTOijcOCziNS7oLi/sKjLwKDP0Jzb6LT76Kz/7Kj/9KT//KD//Jj//JDz/JDz/JDj/Jzn/Kzz+LDnzKzXtLjXoNDXnOzndODTdOjPeOzTgOzXjOjXmOTXpNzPrNTTrMzXsNDbrNTTpNTTnNTPiNS/dNSzbNSncOCzbOSrcOSjeOSbfOCbiNyXjNiXmNCbsNS3tNC/wNTDxNC7xNSztNSvqNSrlNyzgOTDYNy/VOjbbP0L/bXf/YnP7U2r1SWP/S2r2Nlv/Nl//PGf4PmPnTmqvSVZeJCJELCA/OidIRTRQTTxQSTlFQjE+Qy8/Ry9CSCZFSyVLUy5TXThba0Rhdktkfk5kg0pihkZgiEJhiUBji0JljUZokEpskFBtkVFskUxpjkhnjEdmi0hmikpliUljhUhhg0dkg0pkgUlif0djfkdkf0pkf0hlfkdhfUNbezxcfz1fgkI9PzQ/QTZGQzxKRT9QRT9URz5bSz5dTT1gTztgUTxeU0FeVkljW1hoY2lubHlzb4Z0cJV2cJ50cKJwbaJnZp9hYZ9dXqFcXKRlZLBrarp0csV9e8+GgtmNieCUjuaYk+WbltmcmNWdmdaemteemNadl9WcltSbldGeltGclM2ck8qbkseakMSTibuIf66CeJ10a3xtZGlmXV5mW1lpWlNvV017VUqKVkuaVkuwXFK6WVLBWFLTZmHgcWrjdm/tfnf9h4X/h4X3dXPuZ2TjVVPrWlXHMizCLyXFNynDNybANyXBOCbEOCfIOyrPOy3TPS/VOSzVOSzTOizSOizROSvROSvUOCvYOCzfOzHgOTDcOC7WOCzPOSrIOSjBOia+OSa+NirBODDGPTXJQDjKQTnIPzfFPDTCOTG/NC3HPjbRSEDYT0faUUnXTkbMQzvDNyrKNyXTOCTdNynlNCztLy/0KzP5KTf9KDr/K0D/KkH/KUH/JkH/I0D/ITz/Hj3/HTr/Hzr/IDn/JTv/KTv3LTnwMTnqNzrlOzvcOTTcOjXeOzTgOzXjOjXmOTXpNzPrNTLrMzXsNDbrNTToNjTkNzHfNi/cNSzZNSnbOSrbOSrcOSjcOSbeOSbfOCXhOCXjNiXnNSvqMyvrNCzrNSrrNSrqNijkNynhNyrfOzHVNCzTNTTzVFn/ZXP/W3D1R2L/SWj/QWT/O2D9M1v5O2HyTW3NTGKJOD9TKiRBNSc2OSg7PCxCQDFEQTBAPy09Qi4+Ryw9Qx1LUCdcYjxlb0podlJlelFkfk9kgkxhg0ZhhkFhiUBjjEBnjURpjkhrkE1skU5skUtqkEdojUhmi0ZnikpmiUlmhUpkg0hmg0tkgUlkf0hkgEZlgUdlgUdmf0VifkFdgD5fhD9ih0I2OS46PDE/PzdEQTpLQjtPRTxWSD1ZTDxeTzxcTzxcU0JeV01jXV1oZWxvbXtzcYlzb5Rxa5lqZphjYJVcW5RaWphcXaBcX6ZoarVub793eMp/gNKGhNiKiNyPi+CRjt2TkNOTkdCTkdCTkdKUj9GTjtGTjNCSi86VjM2Ti8eUi8SUi8CTi76MhLODeqWAcpV8ZXd1XmZpW1tkW1ZkW1JmWEtyVkiEVEijWlG9YFnJXFnPWVfbY2Lha2nfb2vjdnH7ioT/iob/hYH/fXn3bmjuYVjENCvAMibEOCnBOifAOSbAOSXCOSbGOyjMOivQOizWOi3TNSnONSfQOCrUPi/UPi/ONijLLyLaOi7aOC3ZNyzWOCzQOivJOinCOSa+NyS9NSnANizCOC7EOjDHPTPKQDbLQTfMQjjHOjHKQDbPRTvQRjzSSD7RRz3KQDbFNyvMNiXWNibfNyznNC/xMDP2LTX7Kzn/Kjz8Jzv8Jz37JT35Izv7ITr6Hjf8HDf+Gzb/Hjj/Hzb/JDj9Kjv3MjzxNj3rODvkOjrcOTTcOjXeOzTgOzXlOTXnODXpNzPrNTLtMzbuNDftNTXqNjXlNjHhNi/cNSzYNCjaOCnZOSnaOSfbOCXdOCXeNyTgNyThNiXhNSfiNCnjNSrjNijjNijhNyjeNinbNyvdPDLQMSvYODj/a3L/XW7+UGnxPFv/SGz/N13/PmX5NVvuPmLmVnGqP1FhIyhMLyk7NyswNyczNyY5PClAPSpBPChAPilCQiY/Rh1YYTRzflSAjGR3h2Bof1NhfUxhgEdgg0NghT9hiUBjjEBojkVqj0prkE1skU5uk01rkUhojUhnjEdoi0toi0tmiExkhkplhEtkg0pjgEZkgUdmgkhmgkdlgUZigEJjhkRlikVojUgyNSo1OC07PDRBPjdHQDpLQjtSRTxWSjxYTDxZTT1ZUUReV09jXmJpZ3JvboByb4xybZVqZ5RgXo9XV4tUVY5XWJhcX6JhY61sbrtyc8N7fM6Cg9WIhtmKiNuMiNyNitePjtKPjc6PjM+Oi9CPidGOiNCOhs+Nhc6PhcqOhcaPhcGQh7yPh7aJgqyAeJ1/b4yAX3B8WWBsWFlkW1ReX1FfXElqV0Z9U0WeVUy+XFnQWVvZWFzkY2fna2vhcGzleHPsfXbtenP+g37/hoH/gXv1a2HJPDLEOCnCOyi/Oie/Oya+OiXBOibFOifIOSnOOCrYOi7UNirONSfOOCnRPi7RPi7LOCjHLyHSNinTNSnSNCjSNinROSvNPCvIPSrEOynEOi3EOi/GOTDGOS/HOjHIOzHJPDPLPTPTRDzTRTvQQTnLPTPLPDTPQTfPQDjOOzHONSfZNSniNS7rMzHyLzX3Kzb5KTf8KTr5Jjn3Jjv3Jjv4Jzz7Jjz9JTr/JDr/Izr/Ijf+Izf6JTf5LDv3NT7yOT/oODrgODfcOTTcOjXeOzTgOzXlOTXnODXpNzPrNTTuNDfuNDfuNjbqNjXmNzLhNi/cNSzXNSrYOCrYOCjYOCjZOCbaNybcNyTdNiTdNiTbNSXcNijdNyfcOSjcOSjbOijZOSnXOivXOjHQMy7rSEv/b3n/Vmr4RF/4PF//QWf/M1z/OGL4PmPoTWzFT2WAMD1KHSBDMS0xMScuNic0PSw9Qi5CQCtCPCRFPiRIRSRVXDBwfk2Pn3KXqHyDmG1qhFdfe0pdfkVfg0NhhkBiikFmj0NrkEpskUxtkk9tkk9vlE5skklpjklojUhpjExpjExoik5niU1mhUxkg0pkgUdlgkhng0hohElmgkdkgkRnikhpjklskUwtMyczNis4OTE8OzZCPTlHQDpNRD1RRz1TST1TSz5VTkRaVVFhXmVpZ3Vta4Fsa4pqaJBiYI9YVohQUIZRUY1YWZpgY6pmarRvcsF1eMl8f9CChdaGh9mHiNiKidmLitaLjM+LisyKic2Jh9CJhdGIhNGKg9GJgtCMhM+LhMiNhcGNhrqNhrCHgaV+d5Z/bYWEWWqAU1puVlRjXFJaYU9aX0hlWkR4VUKSTES4VFLQU1fbUlnlXmToZWrja2zmdXHkdW7ib2j3fnb/gnv/h370bGDJPzLBOCjAOyi/PSe/PSfAPCfCOyfFOifHOCjNNynYOi/ZOC7SOCzPOSvMOivJOirIOSnJNyjPOSvRNyvSOCzRNyvPNyrMOCrLPCzLPi3KPDDJPTDKPDLJOy/IOjDGOCzFNy3FNSrQQDfQQDXNPTTJOS7LODDOOzHNOjLMNSzQLyXZMCnkMjDsMjX0Lzj5LTn7Kzv8LDz8LT/7Lj/8L0D8L0D+L0H/Lz//LT//LkD/KTn8KTj3Kzf1MDrxNj3tOD3jNzfcNDPcOTTcOjXeOzbiOjflOTXnODXqNjXsNDTxNDjxNDjvNTbtNzbmNzLhNi/aNizXNSrYOCrWOSjWOSjYOSbYOSbZOCbaNybZOCbVOCXVOibWOyfVPSjUPSjUPSrUPSzUPC7RNy/aOzj/XmX/YXH/UGn3PFv/QWn/NF//NGD7MVn0S2zbWXGVPk5aJS1DKSw6Mi8tMCkwOCs3QC86Qis8PCJBPB5VSChgWzV7hVOQo2yqvouovo2OpXdvi1thf0tef0ZghERjiEJljURqk0dvlE5wlVBvk1Nvk1NvlE5skklpjklnjEdpjExpjExpi09oik5mhUplhElkg0hlhElnhUlohkhnhUdlhURpjklpkUtslE4rMSUuNCo0NzA4OTM+OjdCPTpIQTtLRDxOSDxORz1PSkRXU1JfXmZmZXVnZ39nZoZiYYlbWYpRUYVOT4dSU5NbXqNlabNsb751d8p6fNF/gdaDhdiGh9mGh9eIh9WJidOHiMuGh8iGhcuFg86FgNCFgNKHf9KHgNCNhdKMhcuNhcGMhbiLhauEf517do18anqEVmOBUFZuVVFkXlBbZU1YYkliXkVzWEOPT0W0V1LQVVraU1rnXGPoYWflZ2rocG/seXLmcWj3fHTzc2r+eG3mXFHEOyu+NSPCOyfBPSjBPSjDPCjEOyjIOynLOSrPNyrWNSvYNy3UOi7OOizHOinEOCfGOinKPSzPPS7WQDLZQTTWPjHOOCrINCbKOCnLPCzJOizIOizJOy/JOy3KOi/IOSvINSvHNSjKNizPOy/SPjTTPzPWPzbVPjPONy7JLCPSKyXcLSrnMDLwMzn2MTv6MDz9MD/9MD/5MED3MUD3MUD2MD33Lzz3LTn6LDn6Kjf9Lzz5Lzv1MDrwMzrtNjvmNjnfNTXZNDLcOTTdOjXfOjbiOjflOTXnODXqNjXsNDTyNTnyNTnwNjftNzbmNzTfNi/aNi3WNirVNyvUOCnUOCnUOSfVOCfVOCXXNyfUOSXQOSTOPCXPPSbPPyfOQCjOQCrQPy7SOzDRNjHrSEn/ZnL/T2T/SGb7N1v/QW39L13/N2HyNFjjUGq8VWZtMTlFKCpFNjk3MzI1NDA2OTA2PS0zOyMzOBhDQx1qYTqFgVSfrnepwYe1zpevx5OSrn12lGJlhlFggkZghUJjiEJnj0ZtlkpymE9yl1JxlVVwlFRvlE5skUtojUhmi0Zoi0tpjExpi05pi09nhktmhUplhElmhUloiElpiUhph0dmhkNqj0prk01ullAoMCMrMScvNC0zNTA3NjQ8ODVAPThDPjhJRTxIRTxLSENSUFFbW2VhYnRiYnxgYIJfXohaWIpUVIpUVJBcXaBnabNwc8R2eM17f9h+gtuDhN6Eht2EhdiDhNaFhNSGhdGDhsuChciDg8uCgc2DgNGFgNSIgNWIgNONhdKLhMiLg76Lg7KJgqSBfJN3cIB2ZW9+VVt8UFFuVU5mX09dZU1aZElhYUdxXUWJVEatXVTIWlvUVlriW2HmXWTpYWXubGz1enPtcmr3eG/eWVDlW1DSRDjDNSfHOinFOifEPCbFPSfIPSjKOyrNOirQOCrUNirTMCfUMynSOCzNOyzHOyrCOyjAOyjDPCnIOyrVQzThSz3eSDrTPS/KNCbJNSfNOyzIOSnIOSnIOSvIOSnKOCvKOCnLNyvLNynNNivSPC7XPzTYQDPaQDbbQTXXOjHSMSncMC7lMTTuNDn1Nj75ND75MT76MED4Lz/yLjzvLzztLzntMDfvLTXvLDLyKzLxKjH1Mjr1MzvyNTvsNTnlNTfhNTXeNjXcNzXcODbdOTffOjbjOjfmODfpNzfqNjfsNDb0NTr0NTrxNzruODfmNzTgNzDaNi3UNirTNyrROCrQOCrQOSjQOSjQOSbROCjQOSbLOSLIOiLIPiTHPyXIQCjIQCrMPS3POzHXOTb8VVz/XnH/R2P/P2H/OmH/N2f+M2L7OGDtRmTFTmGJQElTMTJBNjRAOjw6NDY/NTY8NzE3OSs0PSI5Qx5TWi6CglCip3GxxYqvy46wzJKmw42Srn17mWVniFFfgUVeg0BjiUBpj0RvlUpzmVBzmFNxlVVvk1Nuk05rkEpnjEdlikVnikpoi0tpi05pi05miEtkhklkhklliEhnikpoi0lpiUhmiUVqkkxslk5vmVEmLiEoMCUtMisxMy4zMzE3NjQ6OTU8OzZHRD1ERDxHRkJPT1FaWmRfYXBeYHlcXH5gX4lcWoxZWJFcXJpnZ61xc8B6fNF/gNyBhOGCheSFhuOEheGDg9uBgtWDgtKDgs6Eh8yDhsmEhMyDgs6FgtOHgtaKgteMg9SNhdCMg8SLgreKgquFf5t/eIhzbnVxYmV2V1V0U0xqVktmX01iZk1fZUljYkZwXkZ6UT+dW023WlPFU1LXVlriV1zqWWDyY2X3cm3xbmb3cWjRRDvUQTfFMSXINCbUQzLHOSXHOibJOyfNPCnQOivTOizYOCzZNyzPLCPOMCXONinLPCzHQC3BPiq+Oye8NyTANCPRQjLjT0HkTkDYQjTLNynLNynQPi/KOyvJOirHOCjGNyfINifKNijOOCrQOCvTOy7VOy/VOS3SNirVNyzaPDHdPDLcNzHoODjxOD33OkH7OUL6NEH1LzzyLDvvLDrtLzvqMTnqMzjrNDjtNTfxNTb0MzbzNTfwMzfvNjvtOTzpNjniNDXdMzPfNzbgOzndODbeOTfhOTbjOjfmODfpNzfqNjfsNDb0NTr0NTrxNzrsODnmOTXfODLYNy/TNyvQOCvNOirNOSvMOyrNOirNOijNOirMOyjFOSLCOiLDPSTCPiXDPyjGPyvKPC7PODHfPD//XGb/UWj/SWb/OV3/PWj5Ll39PGjpO1zlXHCmTFZeLi5HODNCQz48ODk/NDhFMjZDNDE9Oik+RSZGVSpicz+Qm2GtvX+xy4yryYumw4uduoSOrHp7mWVmh1BafEBegT9hhz5ojkNvlUpymE9yl1JwlFRuklJuk05qj0lmi0ZkiURmiUloi0tpi05pi05miEtlh0pkh0dliEZnikhoi0doi0dlikRrk0xtl09wmlIoMCEnLyIoLSYpLiguMC0zMzE3ODM5OjQ9PTU/QDhERUBKTEtPUllWWGVaXHNdXn1ZWIJbWYteXZZlZaNubrZ3eMh/gdiEheKMjO6MjPCKiuyGh+SCgtyAgNaCgNODgs6Ag8iBhMeDg8uEhM6Gg9CIg9OLhNKMhM+KgMWKgLyJgK+HfZ+AeI13b3prZWdmXVhtW1FtW01pXExmXktkX0llYUhoYUdvX0ZvUDuFVUGlXU+/YVnRWVjdUVTuU1v4XGD5aGXmWVDURDzONzDRNy/XOjHWPS/UOyvPOSjNOibPOSjROinUOCnYOCrcNSzcNSzQLyXNMynMOCzKPi/FQC/BQC2+PSq8OSfCOSm+MCLpV0rfSz/DLyPRPTHOPC/HOCjKOyvJOinIOSjHOCfINybJNibLNSbMNCbQNynXOy7cPjLcPDDZNyzaOC3iPjTsQzz1QkXyOT/wMjz2ND/2MkDxLTvtLTrtMj3sNz7mNTvkNjjlNzjrOTnwOjnxNzjvNzfyOz3uPDzqOjrmODfhODXfNzTcNzXcNzXeOTfhOTjjOTnmOjrpOTvsOTztOTzvODz0NzvzNjrwODrtOTrnOzngOzXXOTDPNyzKOCvIOSnHOSvGOinHOinHOijIOyrHPCnBOSPEPSe+OiO2NB68OSXJRDPPPzbKMSz/XmX/Vmf/SWL/PFz4MVj3MFn7NmP1QmnnWW+sRlFvMzNOMyxCPzY+QzxANzhALTFMLzNLMi5BOSZESihabj1+ml+euHeoxYKsyoyfvoKYtoCUsn6CoG5mhFJYdkJZez9dgD5jh0Fpj0RulEltlUxslE5rkk9skU5pjklmikRjhkJjhkJmiUloi0tmikxkiEpni01ojE5ni0tmi0hlikVmi0Vqj0lrk0pxm1FynlN0oFUqMCIpLyMpLicpLigtLywxMzA1NjE3ODI7PDQ+PzdBRD1ISkdPUFRTVWFYWWtaXHVcWn9eXYlkYpRraqR1dLp/fs6Hh9+LjOmNje+MjPCJieuFhOKAgNiAftKAf8+CgsyFhsmGh8iHiMuJiM6LiM+Mhs6NhsyOhciKgLyJf7GGfKGCeJF7c4B0a25sYmBlXVJlYE1lXktmXktoXUtpXElqXkhrX0duXkV3X0d/W0OSWUatWkzHVlDeUlP1UVj/WF/wVVPjTEXZPjnVNjDZNi/cOTDbOSzWOSjTOCbROCbROCjUOCnXNyncNirfNCzdNSzOMCfJNSnIOSvGPS3EQS/BQC2/PCq+OSjEOCnLPC7kUkXcSDzINCjMOi3IOizCNCbKPSzLPCvKOyrKOyrLOinMOSnOOCnPNijTNyrWOCzZNyzXMynVMSfYMSjeNy7nPDX4REfxOD7tLznvLzrwMD3uLjvrMTzrNj/kNTrcMzbYMjLfOjjuRUL4SUb4REPzPz7pOjfnOTjlOTfiOTbhODXgODXhOTjhOTjgODfiODjlOTnnOTrpOTvsOTztOTzuNzvzNjryNTnuNjjqODjkOzjcOjXTOS/LNyvGOCrDOirCOirAOyrAOyrBPCnBPCvBPCm9OSTBPym7OiWzNR+5OifBOy/KOjLYPD3/Xmf/UGT/QVv5OFf2Nlv1O2D0PmTjSWWrP0yDPz5fOjJHOy86PjA4PjJGPDpSPj1OMC5TOC9WSzVjaUV4j1uNsHCdwn2hxoGauX2auYCatoONqXhyjl5ZdUVUcD1ce0Jff0BihkBpjUNtk0hslEtrk0xpkE1pkE1njEdliUNjhkJjhkRnikppjExojE5ni01pjU9pjU1pjktnjEdnjEZmjkVskkltlUxwnFFvnVJ0oFUtMSItMSMsLyYsLikvLy0xMS8zNC80NS05OzA8PjFAQjdFSEFLTUxRUldVVWFWV2lcWXReXX9mZIxwbqB6eLeFg86Ni9+QkOqQju+OjO2KieeHhN+Bf9N/fMt/fciAf8OGhceIiMaKisqMismMismMiMWMhL+LgreJgK2GfKGAdo97cIB1anBuZGJpX1ZjXU1fYUxfYUtjXkpnXEpsW0luXEhvXUdxXUV3YUl4WD+HUz2jVkTHWE/jVVP4T1T+TVPiPjzePDfdODTeNzHhNi/hNi7dNyvaNyjUNybTOCTTOCbVOCfYNindNSrgMyzdNSzLMyjENijCOSnBPCvCPy3CPy3BPCvAOCjDNSfcSj3aRjrVQTXOPC/ENijEOyu+NibGOinHOinHOinJOirKOCnLNynMNijNMyfVOS3VNyzWMyrXMyraMyvfNi/lOjPpPDjwPD3tNDnrMDfsMTjuMzztNDzrN0DqPUPdNzvhQUHsTkv4WVX9WlX6UUzvQj7lODTiNjLgNzLgNzLgNzLhODXiOTbkOzjkOzjhNzfkODjmODroODvrODzrODzrODzsODvvNTjuNDfsNTfnNzfiOjfZOjTPOC/HNyzCOCu/Oiu9Oyu7PCu7PCu7PCm7PCu7PCm4OSa9QCqzOSSxNiS2Oyu1MCfDNDDsUFT/W2n/SmD1OlXwN1bxQF3vSGbnSGTNTmGCODllPzZSQDJEQTA5PSw1Nyk+NitLOS9FLSNSPSxnXUKBiF+Sq3SXu3uWwXqWv3uUs3icuIWatIWAmm1cdUtIYjVOaDhbeEJffT9jg0BojERskkdqkklokkpnkExmj0tkiURkh0NjhkRliEZoi0trjk5rj09qjk5pkE9pkE9pkE1okEpnj0hokkhslEtvmU1zoVZzo1d2pFkyNCYwNCYwMSkwMSsxMi0yMy4zNC40Nis5Oy07Pi0/QTNERjlJSkRNT05SUVdTU11YVmRcWm9kYX5ubJR6d6yEgsOMidaRj+OUkeqTkOuOi+KJhdmCf8x/fMN/fL+Afr2EgsGGhcGJiMKNisOLiL+JhbiHf66FfaSFe52Ado55bn5yZ21tYWFrXlZpW1BjXEpdYEtdYUpjXkpoW0ptWktxWkp0Wkl2W0ZzV0F4UjuKUT2qWUbNW1DjVFDwRknxPkHbMi/cNS/hNTHjNjDjNS7hNSvgNinbOCnWNyTTOCTROCbUOSfYNincNirgMyzaNi3INim9OCe8Nya9Oii/PivCPy3DOyvEOCnGNCfpVUnTPDHMOCzRQjS+NSXAPSvAPSvAOCjEOCfFOSjHOinIOSnLNynMNijNMyfSNirUMynVMinbNCzjOjPpPjfsPznsPTroNDXsNTnvNjvuNTvqMjrmMznkNz3iPEDzVVb8YmL/bWr/aWTzVlHkQTzfNjPdNC/fNjHeNzHeNzHfODLhODXiOTblOTfmOjjlNzjmODnoODvpOTzrODzrODzrODzsNzzuNTruNjjqNjflOTffPDfWPDTMOS/FOSy+OSq6Oyq2Oym1PCm1PCu0PSmzOyqzPCizOie3QCytOCatOCezOy2rKyLDNTT9YGf/VGT6R1zwPFXrPVjnR1/hT2TST1+0U1p2R0FYSDlLRDJGRTFCRTA9Pyo6OCM7Mx4/Mx1QRypua0iKk2aVrHSRtHSOt3ORunieu4WhuIqQp31sgltLXzpBVzBMYzdXcj9fe0Bkg0BpikNrkUZpkUhnkUdkj0hljkpih0JjhkJkh0VnikhqjU1sj09tkVFuklJqkVBqkU5qkkxokkpnkUdpk0dtl0twnE92pVd2plp4qFw3OCg2OCo2Niw1Ni41NjA1NjA2Ny82OCs7Pi09QC1AQy5ERzRJSz5NTkZRUE5SUlJWVVNZWF1hX2xraYF1c5uAfbKIhseMitOVkuGUkeKQjdyLh9OEgcSBfbp/fLV/fLOBfreEgbqHhLmJhbeKhLKGf6iBepuAeJB/c4d6bnpyZmptX15qW1RpW1BqWktmWkpiX0xiX0xlXkxpXEtuW0xyW0t3XEt7Wkd+VUGGUj2bUkG2VkbOUkjaR0DiODjlMzPdMS3fMy/iNS/jNS7hMyzfMyndNSjcOSjTOCTQOSTPOibROifUOCnZNyrdNSzYNy3EOyu5Oim1NiW3OCe9OyvCPS7HOy7HNyzQOTD1XFTWPTXJNSvPQTW4MyS3Oii8Pyu/OinDOirGOivIOizKOy3MOi3POC3RNy3QMyrSMSnWMSveNzHlPDfqPjroOzfmNzTpNzXvOzzwPD/qNjnkMTXkNTroQkbtTU//eHf/cW7xYFvdSkPRODPRMi7cNzPnQDrgOTPgOTHgNzLgNzLiNjLjNzPlNzblNzbmNjjnNznqNzvrODzrOD7rOD7oNz3qNzvuNzvuNznqNzrkOjrfPTrWPTfLOzLDOy+6OCq1OiqzOyqvPCmvPCqsPCisOymsOymqOyisPSqmOCenOSqqOC2sLynLQEP/aHL0TV7zSFvtRFnlSFvZT17JVF23VFecWFVkTT9PTDlMRzRKRTFGRC0/Qic9RCM+SCNLVi5cZzx4gVSLmWaRpG2NqW6PsnKXuX2ftoiSp4B1hmRSY0M/UDBCUzFPYTlWbD1ie0JlgkJpikNqkEVpkkZlkUZikEhjjkdih0JmhkNnikhpjEprjk5tkFBuklJvk1NqkU5rkk9qk01pk0tpk0lqlklumktynk92pVd2p1h3qFk/PS49Pi49PTE9PTM9PTU7PDQ7PTI7PS8/Qi9ARC1DRy5GSjNLTDpOT0FRUUlSUkhZV0paWk5fXlxnZXJxbol7eaGDgLeHhcSPjNGPjNONis+KhceDf7p+ea96d6Z5dqV7dqx8ea6AfK6DfamDfaN/eJd8dIt6coF2a3NyZmZtX1xqXFNrW05sWkxsW0trW0tpXU1nXk1pXU1qXU1uXU1zXk16XU2BWkmTYE+bVkenTkC4Sj3FQDfPNi7YMSveMSvhNTHhNi/iNS7iNC3gMineNCfcNibaOyjROSTNOyTMOybOOyfROinVOSrZNyzTOS3BPiy0OyiwNSOyNSO7OSnEPC7JOy/LNy3ZPzf4W1TjSUHOOjDMQDO4NiasMyC1PCm8OSe/NyfANyfDNyjFNynJNyrONyzRNy3ZPDPbOjLeOTPlPDfqPjrqPTnnODXjNDHoOTbrPDnsOjroODrsPkD4UFD/YmP/cHD5aGXiVFDKPTbAMSvJNDDWOzffPTrgOzfiOzXhOjLiOTThODPjNzPkNzPlNTXmNjbpNjnpNjnqNzvrODzrOD7qNz3oNz3pNjrvODzsODnoODrjOzrdPjrTPjfJPDLAPC+2OCmyOimuOymqOyipPCioOyelOialOiilPCmgOSigOymgOSqiNiq1PjjbVFj7ZXDuS1zvSV3pSlzbTVvJUVq0VlagWlKKYFJQSTdITTlOSTVIQCs7NRs2Nxc+TyVMZjZsilR3lFyEm2WJmmSNm2aQo2uUrXSYsHyDlW1ufVxRYEM8SjA5RixBUDFPXztXaj1jekRlgkJqi0RrkUZpkkZlkUZhj0ZjjkdjiENpiUZqjUtsj01sj09sj09tkVFuklJtlFFtlU9tllBslkxrl0ptmUpyn05zolF7rF17rF16q1xEQTBEQjNEQjZDQzlDQztDQztCQjZCQzNERjBFSC1HSi1KTTJPTjlSUT9UUkVVU0RcWkNcXERcXU9hYWFpaHhycZB7eqaBfrWGgr+Ig8OIhMGEgbp/e655c6F0b5dvbZVwbJ5ybqF2cJ53cpp3cpJ0b4Vza3pyaW5tYmBsX1dqXFFrW0xtXExvXE1vXEtxW01xW05vXE5tXU5sX09tYE9zYE96X06GWk2fX1OkUEWuQji6OzLGNi3OMSjWMindNSziNzDhNi/hNC3gMyzgNCrdNSjYNyXUOSXPOiLKPSLJPSTKPifNPCnSOyrVOSzPOy2/QC2xPCisNSGuMyG6OCjEPC7KOi/ONS3YOTPwTknxVE3ZQjnMQjW+Py6mMR2zPCi+PCzBOSvBNyrCNinFNyvJOS7POzHUOzPhRD3jQTzkPzvnPjvpPTvpOzroODjnODXnODXmOTXmNzTpOzr0Skr/XFv/ZGP4Y1/MPTnBODK9NC7DODHVQT3eRUDfPTvZNDLiOzXiOzPiOTTiOTTkODTlODTnNzfpNzfqNjnrNzrrNjvrODzrOD7oNz3oNz3pNjrrNzrpNjnmODngOznbPjnRPjbGPDG+PC6zOCmuOymqOyimOyekOyijOiejOiegOSahPiuWNyWcPSuaOSmaMifDUEvta23uXGbsUF7pSlzfSFfNS1O5UlOkW1KSY1GAalVKTThETDdKQi9IOSRCNxtGSCNVcD1nk1Z+s2+Cs3GDpWh9klmDjVmOlmOJl2R8jF9YZkNHVDg5RS02Qio6RCw9SjBKWDdXaD5lfEZogkNsi0VskEZpk0djkUZhkUdhj0dmi0ZsjEltkE5ukU9sj09rjk5rj09tkVFwl1RxmVNwmVNwmlBvm05xnU50o1J3plV8rV56rV55rF1JQzNKRDZJRTlJRTpJRztJRztIRjlIRzVJSDNKSjJMTDJOTjRSUDtUUT5YUkRZVEFdWT5bWj5cWUheW1RkYWhua354c5N9eKCBe6eDfauFf62DfKZ9d511bo9vaYVrZ4JpZYhqZottaIhtaYJtaHxsZnJrYmdqYF5nXVRoXE5oW0trXEluXUtxX0txX0twXUxwXU5wXU9wXU5zXU93XU5+XU6HXEySWEyhVUikRjyrOS+6Ny3KNy/TNi3aNi3eNi3fNi/fNC3fNCzfNCzfNyzdNynYNifRNiTPOiTMPCTKPCbLPSfOOynROyrTOizOPC2+QS+vPCeoMyGsMyC2OSfBPS7JOy/MOC7MMirgQTv4W1TgSUDQRDfKRjerMh+5PizKRjfMQjXKQDPLPzLNPzPUQTfcRTzjRj/iQDviPTnjOjfiNjTjNTTkNjXlOTflPDnkPzngPTbcOjXfQDrqTUjqUUzTQDm4KSO4LSa+NS3JPjfRQDvWPjnaOzjjOzvnPT3iOTbiOTbiOTbkODblOTXnOjbpOTnqOjrqODjqODjrODvrODvpOTzoODvnNzrnNzrpNjrmNjjiODjeOjjWPTjMPTXCPDG5Oy2uOSiqOyqmOymiOyigOyeeOyafOiibOieYPy2MNSKZPS6YOCqXLybNXFj3eXzfWF/mWGTaUVvKS1K5TE+pVlCeYFWQZ1WAblZQVzg/Sio8OxxDPRtVUStsdkSDomaUwX6HvHaGuHN8nmFugk11flGCh151fVZbYkA7RCk0PCU1PSg9RDI8RTI5QytDUDJVZT5ne0hpg0Zsi0dtkUdqk0dmkkdikEdjjkdojUpsj01vklBuk1Bsj01pjktqj0pqkkxzm1RznVVznVNynlFynk9zolJ3plV6q1p2plp1pVtzo1lSSztSSztSSj1SSj1SSj1SSj1SSj1SSztVTjxWTz1XUD5YUT9ZUkBbVERcVUVcVUViW0hhWkhhWUxiWVJlXVtrYWlxZnR1ant6boR8cIh/c4t/c4l8cIR1anttYnJlXWpjYGtgX2dfXGNfWl5eWlleWVVhWlJiWk9lW09nW0tpXEtrXElrXEdtXUZtXUZqXkhpY01xZlRxWkp1T0KLV0qcXFCjWUysWkylTj2mRTSnPCyxNyjCOC3RODDcNDHdMS3fNi/eNy7eNy7eNy7eNy7bNyvYNinXNynVOCnUOCnSOSnSOSnSOSvSOSvUOCvNOyy9Oyu2Pi2uOSipMSCrMiG3OSrAPC/DOS7INSvONS3UOjDbQzjdSz7USDnCPSy3MiPdUEbYSkDURjzURDvaRz/eR0DgQz7gPDrgNzTmODfsOjrsOjrnNzfiNjTgOTPcPTfZRj7PQjnEOi+8NCi3MSa5NSm/Oy/DPzPDOjDJPDPSPzfaPzriPTvnOznsODntOTrnNzrlODrlODrlOTnlOTflOTflOTXlOTXgNDDhNTHkNjXlNzbmODnnOTrnOTrnOTvrOz7mOTvfOTncPTrWQT3NQjvBQTa3PzGpOimjPCugPSqbPCiZOiaWOiWXOCaROCaQQTCLPC2HLyORLya8TErkbW/nbG/NVlq9TE61Tk+qUU2iVU+bWE+XXVKVYVSKalNXWi86TRY3Rg9UYSl+jlCbsG+fvHmcvXiStXN+nWFogExcbUNZZEJUXUJIUDk/RDA6PSxAQzI8QDE6PjA8QzM6QzBBTjJSZD5dc0Jng0hwj0tvk0tskkdqkklpk0tnkEpskFBtkVNvk1Nsk1Btkk1rk0ptlkptmElxnExxnk1yn05yoVB0o1J2p1V5qll6ql55pmNtmVpijk9XTj9XTj9XTj9XTj9XTj9XTj9XTj9XTj9YT0BZUEFZUEFbUkNcU0RdVEVeVUZfVkdkW0pjWkljWU1jWU9mW1VqX11uYmRwZGhyZWx0Z3B2aXJ2aXJzZm1tYGdnW19iWFleW1ZaWlJZVk9XVEtYVElYVEhcVkheV0djWktjWklmW0lnXEhpXUdqXkZrX0doYEljYk1uZ1R2XE2BU0aaVk2rVk+wUkq3UUWvSDmsQzCsPSyxOSm+OCzLODDVNjLZNDDdNi7cOC7cOC7cOC7bNy3aOC3ZNyzXNyvXNyvVNyvVNyvVNyvUOCvUOCvUOCvOOiy+PC62Pi6uOSimMSCnMiCyOim5Pi6+PC7GOi3HNCrLNCnSOzDcRTrhT0LfUUPdT0PbRj/YQDvTPDXSOzTWPTfaPTjcODbdMzPnNzfrNzjuNznrNzjnNzflOTfiPTnbQjrKQTe/PzS4OiyxNievNSayOCm4PS2/QDHFQTTNQDbXQDffPTjjOjfpNzfvNTbxNzrpNjrnNjznNzrmODnmODflOTXlOTXjOjXiOTLjOjPjOjXkOzbkOzjkOzjlOTnlOTnkOjvjOzvfPD3ZPz3QQTvEPza3PTKsOy2lOyugPSqcPSuXPCmWOyiSOiaTOCWMOiWAOSeAOCmJNSqdPDW/UVDXZWXRXmG3TU2sTkykVE2dWVCYXFGXXlOXXlOYX1aMZlFgXy9TZypecjN6kE+Zr26lvnyZsnCIoGJqgkhhdUJUZTtKWDdGUDc/SDU5PzE1OC06PC9BQjQ9PzQ6PTI9QTM6QzBATTNSZD5edEVng0hxkE1wlExukkhrlEhrk0xokUttkVFuklRtlFNtlFFrk0xrlEhsl0htmEhwnUpwnUpwoExzolF1plR4qVh4qVh4qF5tl1hii1FZgkhdVEVdVEVdVEVdVEVdVEVdVEVdVEVdVEVbUkNcU0RdVEVeVUZfVkdgV0hhWElhWEdlXUplXUhkW0pkW0xlW1FmW1VoXVloXVtpXV1qXl5rX19rX19pXlxmW1liV1NfVlFaVk1XVEtVUUhSTkNRTUJTT0NXUUNYUkJeV0deV0VhWUZjW0ZnXEhpXkhrYEpoYkxiYU1uZ1V5X1CIWE6iW1WxVlGySUW4RUC5QDe4PjG3Oy+4OCu8OCvDOSzJOy/ROi/ZOC7bNy3bNy3bOS7aOC3ZNyzZNyzXNyvXNyvVNyvVNyvUOCvUOCvUOCvSOSvNOyzAPjC2Pi6tOiijMiCjMx+qOiazPiy5Pi7EPzDEOCvFMijINCrQPDDYRjncTT/iTkTZOjbYNDPUMjDWNDLbOTfhPTzmPDzpOzztOTzuNTrrMjfpMjboNTjlOTnhPDrZQDq+OC21OiuxNieuNCWtNSWwOCi1PCu7PS7IRDXPQzbWQjjcPTfiOTToNjTtNTXvNznqNjnpNjnpNjnnNzfnNzfmOTXlOTXlOjPjOjPkOzTkOzbjPDbjOzjiOjnhOTneODjdOTrcPDzaQD7TQj3IPzm5OjGtNyulNyihOyydPCuZPCuUOymTOiiQOSaQNyWKOSZ6NiN5NiWIOSygRj25U0/AV1S4UE+rSUaiTUicU0yZWVCXXlOXYVeXYVeYX1aLZVBzckZ6jVaTpm6kuYCrwIees3t8kFtbbzw/UiRBUytBUC8/TDI6QzA2PC42OTA1OC85Oy5AQTM9PzQ5PDE9QTM5Qi9ATTNRYz1gdkdphUpzkk9ylk5wlEptlkptlU5rlE5wlFRxlVVvllNullBslEtslUlsl0humUlwnUxwnUxwn051pFN4qVh5qlt1pldxoFhfiUpWf0VPeD5hWElhWElhWElhWElhWElhWElhWElhWElfVkdgV0hgV0hhWEliWUpjWktkW0xkW0plXUhmXkdmXklnX0xnXk9mXFBmXFJmXFNoXVdoXVdoXVdoXlVnXVRlW1FkWlBjW05dWU1aVkpWUkZSTkJQTEBQTT5UTkBVTz9XUUFZVEFbVkNdWERhWkdkXUpmX0xmYU1kY1FsZVV2XE+KW1GpYly4Wli2RkS5PDrDPDjGOzbEOjDCOC29OCm8Oiq+Py7HPy/TOS3ZNyzaOC3ZOS3aOC3YOCzYOCzVNyvVNyvUOCvUOCvUOCvUOCvUOCvSOSvNOyzBPzG2Pi6sOSeiMyCdMx2iOCKsPSm1QC68Py2/OivDNyrFNSrLNyvOOi7OPC/TOjLeNjXgMjTbMTLdMzTgODjlOzzqPT/sPD7uNzzsMzjpMDbmMjXlNTjhNzfaNjXONjG3NSivNyeuNiasNyasNyauOSiyOim1OirDQTHKQjTUQTfcPzjiOzXmOTXrNzbuODftNjjrNzjrNzjqODbqODboOTTnOjTmOzTiOTLhOjLfOjTgOzfeOjjcOjjbOTfZOTnWPDrVQDzSQz3KQTu7OzKvNiukNieeNyicOyqYOymUOymSOyiPOiaNOCSMNyOHOSWAPSp2NSOBNSeZRTqqUEisTUepTEemUUydUEqYVUyUWk+UXlKVYVaVYVaXYVeNZ1SJhV+ZqXitvY6muIiQoXRzhllOYDgvQRstPhwzQiU6Ri49RjM7QTM6PTI6PTQ8PTU5OS0/QDI8PjM5PDE8QDI5Qi8/TDJQYjxhd0hqhkt0k1Bzl09ylkxvmExvl1Btl09wl1RzmFVwmFJvl1BtlkptlkhumUpwm0txnk1yn050o1N5qFh7rF13p1ttnVNlkk1bhUZTfEJOdz1jWktjWktjWktjWktjWktjWktjWktjWktjWktjWktkW0xkW0xlXE1mXU5mXU5mXUxmXkdnX0hoYElpYUxpYU5pYE9oX1BnXk9qYFRpYFFpYFFoX05oX05oYE1oYE1oYU5kXk5gWkxbVUdWUEJQTT5OSzpOSzpOSzpQTTxSTz5UUUBWU0BYV0NbWkZdXEheXUtiYFFmXlFtV0qGW1KsaWO+Y2DBTU3IQkPQOz3UODnTODTMNzDBOSu6PSm1Qyu8QivOOyvXNynYOCrXOivZOSvWOSrWOSrUOCnUOCnUOCnUOCnSOSnSOSnSOSnSOSnNOyzBPzG2PjCrOiihNiKaNB6bNyCjPSavQi2zOyq6OyzCOizHOS3LOC7OOjDQPDDZOjTpOTzsNDzmMznjMjjiMzjhNDjiMzjiMjXpNjzpNDnnNDrnNzrjOTzbNzbQMjHAMCi0NiitOiitOiirOiirOiirOiisOSavNya4OivBOy/OPjPYPzfgPTjkOzjoOTbsODfuNjbuNjbuNjbtNzTqODToOjPnOjPkPDPhOjLfOzLfPDXcPTfbPTrZPjzXPTvUPj3PQDzLQjzFQjq5PTWtNy2jNSieNyiaOiqWOymTPCmROyqNOiiKOSaJOCWINySDOCWDQC11NCJ7MyWTRzqkUUmhTkaeTkehV06YVUySWEyQWk6NXE6PXVKUYFWXYVePaFeNiWaYpXqdqYGAjmpda0hEUzQyQCYkMhktOiYwOyo1PS45PzM8PzQ9PzQ6OzM6OjA5OS0+PzE7PTI4OzA7PzE4QS4+SzFQYjxieElrh0x1lFF0mFBzl01xmk5xmVJvmVFymlNymlNymlFwmU1tl0ttmElwm0xznk90oFF2olN4p1l7qV56qF9xn1ZkkkpZhkNdhkpXfkdSeUJlXE1lXE1lXE1lXE1lXE1lXE1lXE1lXE1lXE1mXU5mXU5mXU5nXk9nXk9oX1BoX05nX0poYElpYUxqYk1qYk9qYk9qYVBqYVBqYVBpYU5oYE1oYEtoYEtoYElpYUpqYktmX01iXUpeWEhYUkJTTT1NSjlLSDdJSDZLSjhMSzlMTTtOTz1QUT9RVEFTVkVTVkVbWUxeVkljUUV6WE6haGG2ZWHEVlXWUVLZQEPfOj7cODfUNzDHOy68PyuxQyq1QSjKOyrUNyjVOCnVOSrWOSrVOSrVOSrUOCnUOCnSOSnSOSnSOSnSOSnSOSnSOSnNOyzBPzG1PS+rPCmiOSSZNh+VNR2bOyKnQSqyQi65QC+/OyzDNyrFMijLNCvSOzDfPTjqNTruMzzrNj3pOD7nOj7kOz7jOj3iOTzfNTjhNzriOT7hPT7bPT7ROTbDMi+2MCevOSurPiqrPiqpPiqqPSmpPCipOierOCWvNiW5NynFOzDQPTPZPDXfPDfkOzjoOzfuODfvNzXvNzXuODXrOjTpOzTnPDTkPTTiPjXgPzfeQTraQTvZQT7VQT/RQD3NQj/DPzq7QDizPTOqOC2hNSibNSeYOCiVPCqRPCiNPCmKPCiIOiaGOSeENyWDNiR/NiV9Oil0MyF+OSqXT0GjWU6cUkeVT0WYVkqVWU6QW02OWk2MW02OXFGTX1SZYFeRZ1d+eFh5g15yfFpVYEI7RSwvOyUwOyowPC4zPTI0PDE2PDI8PzZAQTk/QTY8PDA3Nys4OSs+PzE6PDE3Oi86PjA3QC09SjBPYTtieElrh0x1lFF1mVF0mE5xmk5ymlNwmlJymlFznFBym09wmUtumUpwm0xznk92oVJ5pVh7p1p6qF14pl1xn1dnlE9dikVYgkJgh05ZgElTekNnXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9nXk9oX1BoX1BoX1BoX1BpYE9qYVBqYk9qYk9qYk9pYE9pYE9pYU5pYU5pYU5oYEtoYEtoYEloYEloYUdoYUdoYUdmX0xlXktiW0lcV0RXUj9QTTpMSThJSDZJSDZHSDZHSjlHSzpITDtJTTxITz9KTj9QUUNYUkZbT0NpUkSDWU2WVkywU0zUWlnbSUriP0LhOTnaNzLPOzHCPy20QiqzPCTJOinTNyjUOCnTOirVOSrTOirTOirTOirSOSnROinROinROinROinROinROinNOyzBPTC1PS+sPSyjPCmYOCCQNBuVOSChQSmtQy22QS+/PS/ANivCLyXHMCfQNi7eOjjoNTnuNj7sO0HqQEPmQUXgQkPcQEHZPz/NMTLQNjbTOjzRPTvJOzm+NzG1NC6tNCmqPC2lPiulPiulQCylPiukPiimOyepOieqNyWyNye8OCvFOC7MNzDUOTTcPTnmPjvpOjfsOTXsOTXrOjTpOzToOzTlPTTiPjTgQjfdQznaQzzVQjvPQT3KPzzHPTu/PjmxPDOpOi+iOCucNiiYNyeUOCmROimNOiiLPSmJPCqHPCmDOieCOSiANyZ/NiV9NiR4MyN4NSWFQjKYVUWdV0uUUEOQUESVWkyTWU2QWk6QXFGQXFGSW1SVXFWYW1aOYlVrYkVWYD1KUzQ9Ryw2PyoyPSw0PjM1PzY2PTY4Pzg9QjtDRj1FRzxDRDZAPi87OSo3OCo9PjA6PDE3Oi86PjA2Pyw9SjBOYDphd0hrh0x1lFF1mVF0mE5ym09ymlNwmlBxm09ynU5xnE1wm0xvmktynU51oVR5pVh/q2B+qWF6pV1xnFVmkUxfiUddh0VeiEliiVBZgElTekNoX1BoX1BoX1BoX1BoX1BoX1BoX1BoX1BnXk9oX1BoX1BoX1BoX1BoX1BpYFFpYFFtZFVsY1RqYVJpYFFoX1BnXk9nXk1oYE1pYU5pYUxpYUxpYUxoYEloYEloYUdoYElnYUtmX0xlXktiW0hcV0RVUj9QTTxNTDpFRjRERzRESDdESDdCSTlCSzpCSzpDSjpJSz5TUURTUEFYTDxlSzp0RTWVSD7CWVPZUk/gREXgOjrcNzXVOzPKPi+6PSm1OCLJOinPOCfQOSjSOyrSOyrSOyrSOyrSOyrROinROinROinROinROinROinROinNOyzBOzC2Oi6tPCynPiuZOSOPMxqTNx6fPyejOSOwOynAPjDGPDHMOC7QNy/ZPDXjPz3sPULuP0TpQ0XiREPYQD/KOzfANTC7MS65Lyy8NTG+Oja7PDazOjKqOC6kOCyhOiuhPS2fPiugPyyhQC2hQC2hQSujPiqmPSqpOyqtOiiyNyi5NSm/NSvJOTDUPzngQz7kPTfoOzXoOzXnPDTlPDXkPTThPjXeQDXcRDnYRDrSQzvKQTnEPzq8Oza4ODWwOTOiNy2ZOCiVNSeTNieROimPPCqLOimFOCaIPSqFPCuDPCqAPCl+Oid8OCV7NiZ7NiZ5MSOAOCqMRziWU0OSUEKLTD2QUkWZX1ORV0ySWU6UW1KWXVSWXVaXXFaWWVSMXlFhWDtFTSg2QB44QSY+RzI8RTQzPTItNy4xODE3PjZCRTxHSj9ISTtCQzE/Pio7OiY3OCg9PjA5OzA2OS46PjA2Pyw8SS9OYDphd0hqhkt1lFF0mFB0mE5ym09ymlNwmlBxnE1xnExxnExwm0twm0xznk93o1Z7p1yCrWWAq2R4o1xqlVBdh0VZg0FeiEhlj1BjilFagUpTekNpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1NqYFdqYFdqYFdqYFdqYFZqYFZqYFRqYVJqYVJqYVBqYVBqYk9qYk9qYk9qYk1qYk1nX0pnX0pmXkllX0liXUlaWENTUD1NTDpISTdFSDdBRTZARDU/RTc/Rzg/Rzg+RjdHSz1JSz1BRTRLSjZcUTthRS+DSjnAal3cZ2DjVVPkRkXlQUDgQT3VPjXJPTDGPS3GNCXLNSbMNifNNyjNNyjOOCnROyzTPS7SPC3SPC3SPC3SPC3ROyzROyzROyzOPC27Mii2Ny6xOy+oOimaNyKUNR+VNx6cOSKuQS2zOyu6NinBNCrNNi/XPDfiQz/qSEXoREXoRUjdQ0PJOja7NjG0ODCuOC6pNCurOS+pOS6kOC6gOC2bOSyWOiuTPCuSPCuWPSuYPSqZPiuaPyybQC2dQSygQS2jQC2iOyqlOiirNyiwNim2Niu+OC3EOzPMPDTaPTbgPTbiPzjiQTfiQTneQjbaQDbXQDXYSD3SRTvHQTi7OzKyNS+qMy2mMSqfMiuZOS2SOyqROSuNOiqLOimIOymHOyuFPCuAOSd9OCh8OSh8OSh8OSh7OCd5NiZ4MyR3LSCLQTSXT0OTTUGOTECRUUWTVUqOUkeYXFKYXFKRVU2QVEyXWlWVWFOUV1STZ1pdVDVJUSpBSyhCSyw+SC83QCsyPS00PzE0PDFIUENaXlBXW0pNTzpERi5BQSc9PSU6Oyk+PzE7PTI6PTI7PzE0PSo7SC5QYjxjeUpsiE11lFFzl09ylkxwmU1ymlNxm1FwnUxxnktyn05yn05zn1B2olV7p1x/qmKCrWZ4o15qk09giUdeh0VhiUpmjlBokFRkiVNbgExUeUVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1NqX1lqX1tqX1tqX1lqX1lqYFdqYFZqYFRqYFRqYVJqYVJqYVJqYVJqYVJqYVBqYVBoYE1oYEtnX0pnX0pkXUpeWUVVUj9PTjpJSjpFSDdCRDZARDU/RTc+Rjc+Rjc9RTZARjg+RTU+RjFITDVNSTBVPyd/UTq8c2LLY1jgX1rrVVTnR0fiQD7gQT3YPznOOjDNOSvOPSzPPS7PPi3POy3OOyvNOSvNOirOOizQOivQOizQOivQOizQOivQOizNOy7JPzXFQjq8QjeuPS+fNiOWMR2WMR2bMh2oNSO0NijDOy/RQTjeRT/mSUTpSkbqS0jeQ0HbRUTQQj68PDOvOS+pPTClPzGfPTCfPzGcPjKXPjCUPi+PPS+KPi6HQC6IPyyOPSqROyqSPCuTPSyUPyuVPiuXPiyZPiyfQC6hPS2kOiyoOCysOCuxOC22OjC8OS/KPDLQPDLTPzXVQTfXQznWQznURDnRRTjKQjbDQTS5PTOwOjCpNi+kNS6fNCyZNyySOi6MPSyKOyyIOyuGOiqEOyqDPCqBPCx+Oyp8Oyl7OSl5Oil4OSh3OCd1Nid3NCSANCeQRDeYTkORSz+MSj6PUUSSVEmQUkeTU0qYWE+YVU+XVlCcXViUV1KOU0+KY1RdVzVYYzlfakJaZkJJVDY2Qyk0QCo8SDRPWEdZYlFfZlRXXEZKTjdCRSo/PyM8PCI5Oig9PjA6PDE5PDE8QDI1Pis7SC5QYjxkektsiE11lFF0mFBylkxxmk5ymlNxm1FzoE9yn0xwnUxxnk10oFF4pFd8p19/qmN7pmFvmlVjjEpdhkRhiUpljU5ljU5ji09kiVNbgExUeUVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFpX1VqX1tqXl5qXl5qX11qX1lqYFdqYFZqYFRqYFRqYFRqYFRqYFRqYFRqYFRqYFZqYFRsYU9rYExpYU5pYU5mX0xhXEhZVkNTUj5NSzxISTlERjhBRTZBRTY/RjY+RDY8RDU9RjU3QC1ASDFJSzNGPyVXPyeHWkO3c2C2VkrZYlrwZWLsVFPmRkjrR0jmQ0TYOzbLNyvJOirJOizJOirLOSzKOCnINinINifKOCvLNynLNyvLNynLNyvMOCrMOCzLOC7CMy2+NS+2Ni2tMyihMCKeLx6gMSCnMyS8QTLHQzfWRz/hTEbnTEfpSkblRkLfREDXQ0HPREHBQDqxOzGkPC+hQTGcRTSYRTOTRDORRDSPQjKKQTCFQDCCQS9+QS5/QC6GOiqLOSuLOimKOyqLPCuNPCuOPSqPPCqWPy6WPS2bOyudOSqgOCulOS2pOy6uOS+4Oi6+OTDBOzDEPjPFPzPFQTTDQTPBQTS2OyyyOiyqOC2jNyueNiubNiyYNy6UOi+NOy+IPCyHOy2EOyyCOiuAOyuAOyt/PCx9Oyt6Oyp6Oyx3OSp2OCl1Nyh0Nil2NCaIOzGURjyWTkKOSj2ISDyNT0KRU0iSUkmST0mZVE+ZU1GaVlOaXVqTWVWNW1SNbFuBfVh+iV6Ai2FseFJMWDQ2RCM9Si5MWkBlcVllb1ddZU1QVT5FSTA/Qyg9QCM6PCQ4OSc7PC44Oi85PDE9QTM2Pyw8SS9QYjxkekttiU52lVJ0mFBzl01xmk5ymlNwmlB1olFwoExunUxwn091pFZ5p1x9qGB8p2BwmVVmj01chEVchEVljE1pkFFmjU5fhUhjiFJaf0xTeEVpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYFZrYFxrX19rYF5rYFxrYFprYVhrYVdrYVVrYVVrYVVrYVVrYVVrYVdrYVdrYVhrYVduYlJtYlBqYk9qYk9oYU5lXktfWkdZVkVSTz5NSzxHSDpERjhDRTdCRDZARDU8QzM8SDQ5Qi1GSjNMRjBPOiVxTDmaY0+qXk6hQTXGU0znY1/wXl7tU1XrSk/pREjhQUHMOTHHOS3FNyvFNyvIOC3KOi/LOzDNOjDRPjTRPjTSPjTSPjTTPzXTPzXTPzXTPjfTPzvRQj7LRD7GRj3CRjzDST7HTUDOUETZU0jdUEfiTUfkSUXkR0LiQz/gQT3bQj3VRkLJRD+6PzerPTCfPi6aQzCVRzOUSTaNRjSMRTOIQzOFQjGAQTB9QC56QS58Py2COiyGOCyFOSuGOiyGOiyHOy2HOyuIOyuJOiuLOimOOCmQOCqVOSyZOy+dPS+iPDCqOi+tOC6vOS+wOi6wOi6wOiyvOSuuOCqoNymlNyieNimbNiqVNyuSOC2ROS+OPDCIPC6FPC2DOyyBOSp/Oip+OSp9Oip9Oyt8Oix6Oyx5Oyx3OSpzOCpxNihyNyl1NSmMRDiSSD2RSz+KSDqHSTyLT0STVEuXVEyWUUybVFCYUU+UU0+WXFiQX1iQaF6XfmqUlHCFkmZ1gldZaD9DUis/TypQYDxjclFldFVcaUtOWD1DTDE/RSs+Qik9QSg7PSc3OCg6Oy03OS45PDE9QTM3QC08SS9PYTtieElsiE12lVJ1mVF0mE5ym09ymlNvm1BxoE9vnk1vnk1zolJ6qF18qmF6pV51oFtjjEpeh0Vbg0Rfh0hnjk9qkVBmjUxgh0hih1FZfktSd0RpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYFRrYFprYFxrYFprYVhrYVdrYVVrYlNrYlNrYlNrYlNrYlNrYVVrYVdrYVdrYVhrYVdvY1VuYlJrYlFrYlFrYlFoYU9kXU1gWkpYUkJSTz5OSzxJRzhHRTZERTVCQzM+QjE9STE/Ry9MRzFTPitnPS2VWkytX1OcPjSeMyu2PznYWFXzaWf2ZGXrUlXmSk7oTlDZSUHTRjzNQDbLPjTOQDbSRDrVRz3XRz7aSkHaSkHdSkLdSkLeS0PeS0PgS0TgS0XrU1LoVFTjU1LcUk/YU0zYU0zbVUzgVU7gTEjhSUbjRULiQ0DkQkDiQ0DkRULgRkTZSkbKRUC5PjesPTKhPzKYQjGSRTOQRzSMRTOIQzOHQjODQDCBPzF+PzB6Py98Pi+AOi6DOS6DOS6DOS6DOy2DOy2DOy2DOy2BOSqCOSqFOSuHOiqJOiuNOy2PPC6TOy+bOy+eOS2fOS2gOiyhOSyiOCuiOCqiOCqfOCmcOCmYOCiUOCmPOSqMOiyJOi2HOy2EOi2COiyBOSuAOCp9OCl9Nyt8OCt7OSt6OCx5OS14Oi12OCtxNSpvNSlxNyt0OSuMSDuNSTyJST2ESTuFSz+MUkaTV02YWE+YUU2cVVGYUlCTVlGSYFmIYleDZ1uGemRuclFaaUBKWTBBUihJWjBXaT9kdk5qfFZYaUVMWzo/TC46RCk8RCw+Qy08QS06PSw4OSs6Oy02OC04OzA+QjQ3QC07SC5MXjhfdUZphUp0k1B0mFB0mE5ym09zm1RwnFFunU1tnkxwoVB3qFl8qmF6qGBynVhpk1Fag0FchEVhiElljE1njk1njktojUpmikxjhlBZe0lSdEJpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYVVsYllsYllsYllsYlZsYlZsY1JsY1JsZFFsZFFsZFFsY1JsY1RsYlZsYlhsYlhsYlhvY1VuYlJrYlFsY1JsY1JrYlFnYFBkXU1eV0dZU0NTTT9NSjtLSDlHRTZFQjM/Qi87SC4/SC1PQy1hPS2DRTqrWFK0TkqeLCuyOjm5PTvTU1LycG7+dnbxZWjrWF7wXl/jVVHaUEbUR0DQQzrRRD3URz7WR0HWRz/ZSEPaSkLcSETdSkPeSkbeS0TgS0fgS0fiSEjhR0ncSEjZR0fWSETXSETYR0LbRkLgQkHkQULmQkHoQkLnQ0LkQkDfQT7bQT/bSkfKQz+5PDauPjOiQDOYQTCQQTCPQzOKQTKIQDGHPzGFPTGCPDCAPDF/PTF/PTGBOzGBOzGDOjOBOzGBOzGAPC+APDF/PS+APC+APS2BPC2AOyyCOiyBOSqCOCuDNymMOi6POC6ROS2UOi+XOy6aPS6ePC+fPi6ZOSmWOSiTOiqQOiuKOyyHOyuEOyyCOiuCOiyBOSt/Nyl+Nih7NSl7NSl7NSl6Nil4Nip4OCx3OSxzOCpwNClvNSlyOi12PDCLTUCJSzyESjyCTT2FUUOLVkiSWE2XV06TTkmZVE+XVlKVXFWQZVx7XlBmVkZgXkdFTy0+Tik/TyhKXDJfckVrflFleEtYakBNXzdAUS02RSY3RCo9RjE9RDQ6PjA3Oy04Oiw6Oy02OC04OzA+QjQ3QC05RixJWzVbcUJlgUZykU5zl09zl01ym09zm1RwnFFtnExvoE9zpFV4qFx6qGBzoFtpk1FgikhZgUJehkdljE1njk1mjUpljUdnjEdojExhhE5YekhRc0FpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsYlhsYlZsYlZsY1JsY1JsZE9sZE9sZE1sZE1sZE1sZE9sZFFsY1JsY1RsYlZsYlZvY1VtYVNrYlNsY1RtZFVsY1RpYFFmX09iW0teV0dYUUFSTDxPSTlKRzZJQzNBQy46RytARipVQCt4RzmjUEy0SEi2ODy6MznIQUXEP0DKSknfYmDxcXDwbnDnYmXiWlzbUU7VTETPRD/NQjvPRD/QRT7QQj7NQDnSQz/SQz3UQ0DVRD/XQ0HYREDZRUPaREPdQUTdQUTeREbdR0jfSUjgSknjSUnlR0jnQUPqQUTsQkXsQkXnQUHiQD7bPTrVPTraRkbJPTy5ODOwOzKmQDSYPzGRPjCPQDGKPC+KPDCJOzGIOjCHODGGOTOFOjSEOzSBOzOAPDOBOjSAPDN/PDN9PTF9PTN8PDB8PDB8PS58PS57PC18Oix7OSl6OCp7NyqCOi6DOS6HOS2JOS6NOS6ROy6VPC6WPS2SOSmROimNOiqKOyqHOyuDPCqAOyt+OyqAOCqAOCx+Nip9NSl8NCh6NCh6NCp5NSp1Mil2Nix2OC1yNitvMylvNSpzOi94QDOKUEKGTj+BTj2CUUCFVkaJWEmOVUqRUkmST0mXVE6TVE+RXFaKZlpuW0pQSzdFSzFBTjBLWjlXZ0NgckpneU9kekxWbD5HXS9BVi03SCQxQCE2Qio9RjU8RDk4PTY3OjM5Oy47PC42OC05PDE/QzU3QC03RCpGWDJWbD1hfUJvjktxlU1zl01ym090nFVxnVJvnlBxolF1pld2plpzoVlql1JijEpbhUVehkhgiEljiktljEtmjUpmjkhmi0ZliUlgg01XeUdQckBpYFFpYFFpYFFpYFFpYFFpYFFpYFFpYFFrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsYlZsY1RsY1RsY1JsZFFsZE9sZE9sZE1sZE1sZE9sZE9sZFFsY1JsY1RsY1RsY1RuYlRtYVNtYVNtYVNtZFVsY1RqYVJnYFBkXU1gWUlaU0NVTj5QSzhNSDVJRDFEQy5ARipERChbQiyIVEevXFirPkGsLzPOSU7GP0XAOz67OzzERkfYWlvjZWbbWVvMR0jRSkfQRULNQj/QQj7URkLURkLQQj7JPjfPRD3PRD3SREDURUHWRULZRUPaREXdREbeP0PfQETeQkXfRUXhR0fgRkbgQkPhPj/oQkTpQEPoPkHnPT7kPj7jQT/hQ0DfRUPWQkLFOTi2NTCwOzSmPzaaPjOQPS+NPzKIPC+HOjCHOjCHODGHODOHODOIOTSIOzWCOTKAOjKAOjJ/OzJ+PDB+PDB8PDB8PDB4OCx5OS16Oi56Oi57PC17PC16Oyx6Oyx9Oy9/OS+ANy6BNyyENiqFNSqGNyqGNyiKOCqIOSqIOyuFPC2EPC2APSx+PCx9Oyt9OSx9Ny18Nix5NSp6NCp4NCl4NCl4NSxyMih1NSt2OC1yNituNCluNSp0OzB4QjaKVUeEUEKAT0CEU0SIV0mMVkqMUkeNTkeVVE6UVU6LUkuEWE1/ZFNlWkRHSzI9SixJWDlaa0lneFRjeFFZbkVTaD1OYzhKXzQ6TCYwPx4sOR01Pik9QzU8Qjg6PDc5PDU7PTI7PTA3OS45PDE/QzU4Py04QilFVTFVaDthekNuik1yk05ylk5ymlFznVNxnVJyoFV1o1h2pFt0olpvmlVmkE5eiEhbg0RkjE5hiUtgh0hjiklmjUpnjktlikVhhUVgg01XeUdQckBpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlFrYlFrYlFrYlFsY1JsY1JsY1JsY1JsY1RsY1RsY1RuYlRrXVBwYFF0ZFdyZFduYlZqYFRoYFNoYlRnYVNnYVFjXU1bVkNWUT1TTjhOSDJHQSlLRyxJPyRiSTORZ1e2eG27bGW4WVe5T0+2QkW9QkXCREfIRkjNSEvQSkvSTE3TS03PRUXQREXTRUTWRkXVRkLSQz3OQzzPRjzIRDjJRTnKRTzMRT/SREDXQ0PaQUTbP0PhQkbiQkThQ0TgREXgREXhRkTjRUTkRETjQ0PkQkDkQD/jPz7jPz7iQD3iQD3eQz/TQj/FPjq2OTOqNzCfOjCXPTKOPjOGPjKDPzKBPzOBPTKBOzOEOTOGOTOIODGIOTKFOzCEPC6EPC6DOy2BOy+AOi6AOi6AOi5+Oi1+Oi1+Oi1+Oi19Oy99Oy99Oy99Oy99OTB9OTB+ODB+OC6ANy6ANy6ANy5+OCyAOCx+OCx9OSx8OC17OS16OCx4OCx4OCx4OC54OC53Ny12OC12Nix0NitzNSpxNSttMSdyNixuNCltMyhvNittNClxOC1/ST2FU0iFU0qGUkeIUkiLUEiQUUqUUUuVUkyTVE2NVEuJW06CY1FvX0hZVTpNVjdPXztqfllieFFZb0hVakNSZ0BNYjtJWTVDUjE3RCY0PiMyOiM2Oyc8PjBAQjVAQDY8PjM1OC0zOS00Oi43Oi85PS87Py49Qiw8RShTXzthckZuhlJzkVVylVFymlNznVNynVV1nlp+p2V+p2VwmFliiktehkdehkhehEdghkliiEtkik1mjU5ljE1jiktgh0hehEdfgkxUdkRLbTtpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRyYlNxYVJyYlVxY1ZyZlpvZ1ptZVhqZFZnY1draFlvaVlsZ1RoY09jXkhbVT1STDRQSjBIPiVRPylrUD1/WEeETkKIRT2TRD+xV1a4VFS7UVHAUE/ATk3BTU3CTErDS0rQVFTISEfCPT7EPTrQQkDTRUHPQjvHPjTKRDnJRTnLRj3NRz7URkLYRETcQUXdQUXhQkbhQ0ThQ0TiREXiREPhRkThRkThRkTgRUHfREDgQj/fQT7gQT3gQT3gQT3eQz/URT/IQzy6PjasOjCgOTCUOi+KPDCCPDCAQTJ+QDN+PjR/PDODOjOGOTGIODGJOTCHOy6FPC2EOyyEOyyDOy2COiyCOiyCOix/OS1/OS1/OS1/OS1+Oi9+Oi9+Oi9+Oi99OTB9OTB9OTB9OTB9OTB9OTB8OTB8OTB8OTB6OjB6OjB5OS95OS95OS93OS53OS53OC93OC90OC5zNy1yNixyNixwNitwNitrMSZxNyxtNClsMyhvNitsMyhwNyx+SD6EUkmFU0yIUUqLUEqQUUyUUE2VUU6UU0+KT0eFU0iAW0t7ZVBzaVBoa0xmcVFneFRedE1YbkdQZj9MYTpLXzpLXDpHVjdDUDQ8Ri04QCk2Oyc3Oik8PS8/QDI+PjI7PTA0OjAzOzA1OzE2PDA6PC88Py4+QSw+RCpRWzlebURrgVJwjFJwk1NxmVJznVNznlZ4n158omV4nmFrkVRghkldg0Zdg0ZcgkVghklhh0pjiUxli05kik1iiEtghklehEldf0xSdEJJazlpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRxZFRvX1BtXVBtX1JxZVlvZ1xsZFloYlZmYldwbGB7eGl+e2p/eWl6dWJwaVZlYEpUVDxGRi5DPihNQi5TQC9VOChdNypsPTNuNzB1OTF+OzWHQDqSSUKbUEqlWFCtWlK7Xlm6U063R0W8Qj/IRELRRkPTREDPQDrQQTvQQzzSRT7UR0DWR0PaRkbbRUbeREbfQ0TfQ0TfQ0TfQ0TgREXfRUXfRUPfRUPeRELeRELcRD/bQz7cQz3cQz3cQz3bQz7WRUDORT/DQjyzPjWiOjGUOC2IOSyDOy2CQDJ/QDF+PjJ/PTGDOjGGOTGHODGIOjCHOy6EOyyEOyyEOyyCOiyCOiyAOi6AOi5/OS1/OS1+Oi9+Oi9+Oi9+Oi9+Oi9+Oi99OTB9OTB9OTB9OTB8OTB7OC97OC97OC97OzF7OzF6OjB5OzB4Oi94Oi94Oi94Oi90OC50OC5zNy1zNy1yNixxNStvNSpvNSpqMSZvNittNClrMidsNippMydtNyt9Rz2HUEmHUEmLUEqOUUyRUk2SU06UVVCRVlCMV0+HW1B+Xk90Yk5vaVFvclVsd1lmd1VRZUJLXzpFWTZEVTNFVjZHVjlHVDhFUjg/STA8RC05Pio3Oyo6PC48PjA7PS85Oy42PDI1PTI2PDI2PDA6PC88PjA9QC09QylNVzVaaUBmfE1siE5ukVFxmVJ1n1V0n1d6oWB3nWBulFdjiUxcgkVcgkVcgkVagENfhUhhh0piiEtkik1jiUxhh0pfhUhdg0hbfUpQckBHaTdpYFFpYFFpYFFqYVJqYVJrYlNrYlNrYlNqYVJqYVJqYVJqYVJqYVJqYVJqYVJqYVJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RuYlRyZFdvYVRtX1JrX1NrYVdsY1psZVtqZl1qZl14dGmIhHiRjYGVj4GSjH6JgnJ9emdgY05PVD5ERzJGRTFIQzBGPSxMPCxWQzRQOStSNipWNCpZNSlcNithOS9lPTFtPTGKS0KdU0quVU+2Tku8RkTGQULSREPYRkbUQD7VQT/WQj7WRUDZRUPaRkTbRUTdRUTeRETfQ0TfQ0TeRETeRETdRUTdRULeRkPbRkLaRUHZRD7YRT7XRDzXRDzZRD3YRT7URDzTRj/JRj66QTinOzGYOCyMOSuFPC2DQDB/QDF+PzB/PS+DOjGEOi+HOS+IOi6EOi2EOyyEOyyDOiuCOiyCOix/OS1/OS1/OS1/OS1+Oi9+Oi9+Oi9+Oi9+Oi9+Oi99OTB8OTB9OTB7OC97OC97OC97OC94OC57OzF5OzB5OzB5OzB4Oi94Oi94Oi92Oi9zNy1zNy1zNy1yNixxNStvNSpvNSptNClqMSZvNitsMyhoMiZrNSloMiZsNip8RjyKT0eMT0qNUEuPUk2QU06RVlCQV1CMWlGJXVKFYVV5X1BpWkdkX0lkaE9cZktOXUBFVThBUTQ9TTA8Sy4/TTNDUTdGUjpHUztCTDQ+RzI6QS85PSw5PS45PS44PC03Oy03PTM2PTU2OzQ2PDI6PDE7PS88Pyw8QSpKUzRWZT5ieElqhkxukVFzm1R3oVd4olp7omFymFtli05cgkVagENcgkVcgkVagENfhUhghklhh0piiEthh0pghklehEddg0hZe0hOcD5FZzVoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsY1RyZlh0aFxzZ1ttY1lqYVhsZV1zbmh6d3CBfneQjYagnZSopZyrp5yopJmjnZGZlod6e2tjZlNPUj9HSjdFSDVCRTJCRTJFSDVLTDxKSDlHRDVEPjBBOSxBNytANipGNChTNSpxQjiMUEifUEuvSUe/R0nMRUnTQkXWQELZQELaQkHbQ0LaRUHaRUHcREHcREHeRETeREbeREbeREbeRETdRUTdRUTaREPaRkLXRkHWRj7URT3URT3TRj3URT3VRj7UQTrTQzvORT3BQjmuPjOeOS2ROy6KPC+EPzCBPy+APi6APS2BOy+EOi2GOi2HOy6EOi2DOy2COiyCOiyCOiyBOSt/OS1/OS1+Oi9+Oi9+Oi9+Oi99OjF9OjF9OjF9OjF8OTF6OjF8OTF5OTB5OTB4OC94OC92Ny55OjF5OjF4OTB2OjB2OjB1OS91OS90Oi9yNy9xNi5xNi5wNS1vNCxuMytuMyttNCtqMShtNy1qNCpoMihqNCpmMidqNit9RDuNTkePTkiQUUqQVEyQVU+OV1CKWVKDW1F7WU12XE9rWkpdVUJZWERZXkhPWUE/SzM6SC83RS40Qis1QSs4RC49STNDTDdFTjlCSzY/SDU8RTI6QS84Py83Pi41PCw0Oiw1PDQ1PDU2OzU2OzQ5OzA6PC87Pi07QClHUDFSYTpgdkdphUtvklJ1nVZ5o1l5o1t4n2BukVdgg0lafUNbfkRegUdegUddgEZgg0lhhEpihUtihUthhEpgg0lfgkhegUlXfElMcEBCZjZoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsY1RrYVVuZFpwZlxsY1prZFxybWeEgXyRkIyno6C1sa7EwbzJxsHJxL7FwLrAubG5sqiknI+IgnJmY1RQUT9GSTg+RTM7RDE6RjI4RTM4RTM4QzI6QjM8QjRAQzhDRTpHRTk+NChQOi9lPzaARUGhUE+/WFvKUVbKQ0nVRkrXRUbaRkbbRUTdRULeRELdRD/eQ0HeRETeREbeREbeREbcREPcREPcREPaREPZRUHXRkHVRkDTRj3SRTzQRjzRRz3URT3UPzjVQDnQQzrGQzm2QTelPTCWPS+MPS6GPi+CPy+BPi6APS2BPC2DOy2EOi2FOy6COiyCOiyCOiyCOiyBOSt/Oit/OS1+OCx+Oi9+Oi9+Oi9+Oi99OjF9OjF9OjF9OjF6OjF6OjF5OTB5OTB4OC92Ny52Ny50OC53OC91OS91OS9zOS50OC5zOS5yOC1yOC1xNi5xNi5wNS1vNCxuMyttNCtsMypqNCpoMihsNixpMylmMidoNCllMSZpNSp7QjmOTUeSTUiRUEqPVEyNVk+HWE6BWU98XFFzXE5rW0xgV0ZWU0JQU0JKUT9ASTY0QCwzPCsyOyowOSgwOSgyOyo1Pi05QjE8RTQ/SDc/SDU+RzQ6RjI6QzI1QC8zPi0xPCwzOjMzOTU0OTU0OTI4OTE5Oy47Pi07QCpDTC9PXjddc0RphE1wk1N3n1l5o1l3oVlxmFlmiU9afUNYe0Fcf0VdgEZdgEZegUdgg0lgg0lgg0lgg0lgg0lfgkhegUddgEpWe0hKbkBBZTdoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsYlZqYFZqYVhrZFprZ151cGqIhYCfnpqwsK7DwsDT0tDi4d/n5uTn4+Dj3tre1tPZzsjOvLK4pZeXh3p5bV1fWUlLTDpARTE7RC8+SjY9SDc9RjU7QzQ7PjU6OzM5ODM4ODA9PTNDPDJONzFhODSISEivXV/FYGTKV1rNUVPTTk/XTUvbS0reSEfhRkTjREHiQkLfQ0TeREbeREbdQ0XdQ0XcQkTcQkLbQ0LaREPYREDVRD/TRj/SRTzQRjzQRz3URT3ZQDrZQDrRQjrIQzq8QzqsQDSZOy+MOSuJPS+DPi6BPi2APSyBPCyDOyyDOyyEPC2COiyCOiyCOiyBOSt/OS1/OS1+OC59OS5+Oi9+Oi99OjF9OjF9OjF9OjF9OjF9OjF6OjF5OjF4OTB4OTB3OC90OC5zNy1yOC10OC5zOS5yOC1xOC1yOC1wNyxwNyxwNyxvNi1vNi1uNSxuNSxtNCtsMyprMilpMylnMSdrNyxoNCllMSZoNCliMCVmNCl6QTiQTUeSTUiRUEqOVUyIWE6BWU94Wk9yXE5rXk5eV0dSUEFLTj1DSjo5QjEyOiswOCkxNysxNy0wNiwvNSsvNSkwOCsyOis0PC05RDQ7RjU9SDc8STc7RjU2QzEzQCwxPi0uODAwNjIxNjIyNzE3ODI5OzA6PC46Pyk/SCtLWTVbcUNog0xxk1Z3nlt3oVlznFZnjVBegUlVeEBXekJbfkZbfkZbfkZdgEhfgkpfgkpfgkpfgkpegUlegUldgEhdgEpVdklKa0BAYTZoYVFoYVFoYVFpYlJpYlJqY1NqY1NqY1NpYlJpYlJpYlJpYlJpYlJpYlJpYlJpYlJrYlNrYlNrYlNrYlNrYlNrYlNrYlNrYlNsY1RsY1RsY1RsY1RsY1RsY1RsY1RsYlZwZ15uZ19sZ2F0cWqHhH+hoJy8vLrO0M/Pz8/g4ODy8vL6+Pn79/b38/Dx7Onw4t/o0MbdwbXBq52ikYF9dWJeXEdLTTdDSDJBSTJBSTRARzVCRDdBQTdCPTlDOTc/OjY5PDU+PzdCNzFKLitkNjaPUVKzZ2nGbm3AXFzHWlfQVlPXUU7cTEviSEjmQ0TlQkPfQ0bdREbdREbdQ0XdQ0XcQkTcQkLcQkLcREPZQ0LXQz/TRD7SRT7QRjzQRjzURT3cQz3bQTnSQjrKRDu/RTqwQTacOi2LNSaKPC+FPS6CPS2APSyBPCyBPCyDPCqEPC2COiyCOiyCOix/Oit/OS1+OCx9OS59OS5+Oi9+Oi99OjF9OjF9OjF9OjF9OjF7OzF5OjF3OzF4OTB1OS90OC5zOS5yOC1xNyxyOC1xOC1wNyxuOCxwNyxtNytvNitvNitvNi1vNi1uNSxtNCtsMypqNCppMyloNClmMidrNyxoNCljMSZlMyhiMCVlMyh4QjiOTUeST0mOUkqKVU2DWE96Wk9xW01oXExaVERJSjo/QzQ+RDY5QTIwOCsvNyo2PDI0NzA1ODE1NzI0NzAyNS4wNiwwOC0xOSw2QTM6RTU9Sjk+Szk8STc3RjMyQSwxPi0sNi4uNDAwNTExNjA2NzE4Oi86PC46Pys8RSpJVzRZb0Fngk1wklZ2nVx1nlhwmVVghklYe0NTdj5XekJbfkZZfERZfERcf0dfgkpfgkpegUlegUlegUldgEhdgEhdf0xTdElIaEE/XTdpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NqY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVsZFdpYlpnZF12c26Tko6vr63ExsXa3Nvq7u/z9Pb29/n8/P7///////3/+/r89/T98uz34dTy2MfgyrXGtp+qoIeIhGliYkZFSC1ESC9DRzBGRTFHRDVGPDNDNjBGNDJIOjk+PTk+PzpCOjdJNzVjR0aSamrFk5LoranSi4fHdG7AXVjGU1DVT07fSkznRkvpRkvfRUffSUvaREbUOz7YPkDhR0ngREfWOj3aQEDaQEDZQUDWQj7UQz7RQjzQQTvRQTneQz7bQTnTQDnKQTm+QjiwQDWfOi6QOCqMPTCHPi+DPi6BPi2APSx/PCuBPSqBPCx/Oit/OS1/OS1+OCx+OC58OC18OC18OC18OTB8OTB8OTB8OTB6OjF6OjF6OjF6OjF5PTV3PDR3OzN1OjJ0OTFxOC9wNy5wNy5vNi1tNy1tNy1sOC1tNy1sOC1tNy1tNy1pMittNi9wOTJvODFrNC1nMipnMipoMytlMChpNy5kMildLSNgMCZfLyViMihzPjaMT0qPUEuIUUqBUkp9WU12X1FmWUlUTj5ERTU+RTU6QzI1QDA0PC8zOzA0OjA0OjA2ODM3ODM2NjQ0NjEzNTAxNi8vNi4uNisuOSsyPS02QzI6RzY6STY4RzQ0Qy4xPy4qNCssMi4tMi4uMy00NS83OS46PC86Pys2PiZEUjFXbENoglJzlF13nl9ym1drlFJbfkRYeURUdUBUdUBXeENae0ZbfEdae0Zef0pig05ig05ef0pcfUhfgEtggUxefk1Uc0pGZEA8VzRpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVsZFlnZF1vbmqGhYOkpKLBw8LW2tvq7u/3+/z3+/74/P/8/f/+/v7///3//vr//Pn/+vP/8OD769Tt38XXzbLAu52ko4SCg2NnaktMUTNHSi9FQy5HQi9IPjJJOjNMOTVLPDk/OjdCQT9NSEVdUlB5amejjovOsq7oxb//19Hss6rNgnzAY17KVlbYUlPfSE3aQUTWREXVRUXYSEjcSkvbRUbVPD7WPD7bQUPZPz/ZPz/ZQUDXQUDWQj7TQj3SQTzTQDncQTzbQDvTQDnLQjq/QzuxQTagOzGSOC2MPTCHPi+DPi6BPi2APSx/PCuBPCyBPCx/Oit/OS1/OS1+OCx9OS58OC18OC18OC18OTB8OTB8OTB8OTB6OjF7OzJ7OzJ6OzJ3PDR1PDN1OjJzOjFyOTBuOC5vNi1tNy1tNy1sOC1sOC1sOC1sOC1qOC1sOC1sOC1rNi5uNzBvODFuOTFsNy9pNCxnMiplMypjMShkNCpfLyVeLiRiMiheLiRgMCZwPjWBSkWHUkyHWFJ+WE9yVktkUkRRSjo+Py86QTE2QTA1QDAzPjA0PDE0PDE1OzE3OjM3OTQ3NzU3NzU1NzI0NjExNi8vNi4vNywuOSsxPC40QTA4RTQ5SDU4RzQ0RTI0QjEuOC8uNS4uMy0tMisyMys0Nis4Oi05PSw3PyhEUTNXbEVoglV0lWB3nWJwmFlnj1BZfERXeENUdUBUdUBWd0JZekVZekVZekVbfEdfgEtfgEtcfUhbfEdef0pef0pee01TbktGX0E5UjRpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NrYlNrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZsZlplZF95e3iXmZiytrfN0dLk6ez0+fz6///7///8///9/v/+/v7//vz///v///r///T+/Of6+d3v8NHh5cTS2LS8xJ+gqIOHkWxgZ0VRWDdERyxEQy5KRDRMRDdLQThJPjpDOzlTSktpYV+Bd3ackpC+s6/Zzsjq3NP+6N3/8+n/5NvwqaPDZWO1QkXHREnaUlbbVVTRTUvKREHNQ0HURkXXRUbYRETZQ0TWPT/XPkDYQD/WQD/WQkDTQj/TQj3UQTrZQDrZQDrSQjrLRTzARDyyQjehPDKTOS6OPDCJPTCDPi+BPi5/PS1+PCyAPS2APS1/OS1/OS1+Oi99OS59OS58OC17OC97OC99OjF9OjF7OzJ7OzJ7OzJ7OzJ6OzR4PDR0OzJxOzFyOTBvOS9uOC5sOC1sNixrNyxsOC1qOC1qOC1qOC1qOC1pOS1qOC1qOC1uOTFtODBtODBtODBtODBpNy5mNCtjMShkMilhMSddLSNfMCZjNCpcLSNfMCZzRDx9UEqBVlB+WVFwVEleSj9PQzc/PC00NigyOyowOysxPC4yPS80PDE0PDE1OzE3OjM3OTQ3OTY2ODM1NzI1NzIyNzAwNy8wOC0uOSswOy0yPy42QzI3RTQ4RzQ4RzQ5RjU0PjMzOjIvNC0sMigvMCgxMyg1Nyo2Oik2PidEUTVZbUprhFp3l2Z3nGZsk1pfh0tXeENXdUNUckBUckBWdEJYdkRZd0VZd0VaeEZde0lffUtde0lde0lffUtefEpad0tQZ0pBV0AzSTJpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZuZVZuZVZtZ1tqa2aDh4ijp6i5vsHQ1djl7e/z+/31/f/7///7///8///8/vv9/vn+/fj//vf///P4/eb0/d7u99jm8s7d6cPO2rS2wZmhq4aAh2VmbUxNUTZGSDBISjVLSTpIRDlEQDdPR0RqYF+LgYCkmpm3r6zLxsLe29Tq5t368ej/+/H/9+3/3dX7trHlj47KY2SwQD/DUEvJVE3JUEjDRkDIR0LUTUrWS0jQQD/SPj7TPz/VPz7VQT/VQT/TQj/TQj3TQj3WPjnVQDrSQz3MRT/ART6yQTmiPTWVOzKOPDGJPTCDPi+BPi5/PS9+PCyAPS2APS1/OS1/OS1+Oi99OS59OS58OC17OC97OC9+OzJ+OzJ8PDN7OzJ7OzJ7OzJ6OzR4PDRyOTBvOS9vOS9tOS5sOC1rNyxqNitoNitpNyxpNyxpNyxoOCxoOCxoOCxoOCxoOCxtOzJsNy9qNS1pNy5qOC9qOC9mNCthMSdlNSthMihdLiRhMihiMylZKiBhMih5TkWBXFZ2V1JpTkdXQzpJPDNAOi46Oy04PC4wOCkvOiozOy40PC81PTI1OzE2OTA2OTA3OTQ2ODM2ODM0OTIzODEzOS8xOS4xOS4uOSsvOiwwPSwyPy41QjE3RTQ7SDY8STg5Qzg3PzQyOC4tMycuMCUvMSQyNCY0OCc0PCdFUjhdcFByi2R7mm53nGlmjVhVfEVTc0FUckBTcT9TcT9UckBVc0FWdEJWdEJXdUNbeUdde0lcekhefEpffUtcekhXcklKXkU8TTsuPy1nZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldvZlduZ11xcW+HjI+kqay3v8LN1djj7e/y/P70/v/4///6///7//z9//r8/fX6/PH5+e32+Or2/+jz/+Tw/eHu+dnp9NLe6MXK0q22vpmdo4F9gmJZXUJHTDVGSzdGSjlDRzlBQzhjXliFfXqroZ/Bt7XMwsHXz83m4d3x7un69/D89ev/8eb/8un/9Oz/5d/pqKS3aGOmTEG1UETBWU7HW1HGUUi/RD3CQTzLREHLQD3OQD7QQD/RQUDSQz/RQz/RQz/SQz3TPzvSQTzQRUDJRUC9Qz6vQDmgPjWVPTOOPDGJPDKDPTGBPTB/PTF+PC5/PS9/PS9+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC98PDN8PDN8PDN7OzJ6OzR5OjN5OjN3OzNuNzBtODBsNy9sNy9rNi5oNi1oNi1oNi1pNy5oOC5oOC5nOC5nOC5nOC5nOC5oOC5rOTJoNi9mNC1nNS5pNzBoNzBlNC1iMSpjMitiMytfMChdMShdMShWKiFiNi17VUx0WVJhTkhOPzhBNy49Niw7OS05Oy45PDEzOS0zOy41Oy82PDA2PDA3Oi81OC00Ny42OTA0OTIzODEzOS8zOS8yOi8xOS4xOSwuOSsuOSsvOiwwOy0zPi42QzI6RTU8Rzc9RTg6QjU1Oy8wNigwMiUvMSQxMyUxNSQyOiVHUztidVd3j2t8m3JxlWdcglFKcD1Pbz5Rbj5Rbj5Rbj5Rbj5Rbj5TcEBTcEBXdERbeEhdekpdekpffExffExad0dSbEVDVT82RDcoNilnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldwZ1hwZ1huZ11sbm16goWTmqCrtbfEztDc5ujt9/n0/v/1/v32//z6//r7//n7/vP4+u319ujx9OP0/er0/ej0/OXz+d/y9tvp7M3Y17nFxKWxsJKPjnJlZ09NUDtHSzpGTT1HT0JLUUd7e3OfmpTFvrjYzszf09Pn29vz6+n89/Tw7+r8/PT///b//fP/+e//8+r/597/18vYk4O4ZVOjSjq0VEa9V0m1Rju3QDjIS0XHQz7KQz/MQj/OQ0DOQz7OQz7NRD7NQj3RQjzSQz/OREHFRD+4QT2qPTieOzWVPDSOOzOJPDKDPTOBPTJ/PTF+PDB/PTF/PS9+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC98PDN7OzJ7OzJ6OjF5OjN4OTJ3ODF1OTFuNzBsNy9sNy9qOC9pNy5pNy5oNi1nNy1nNy1nNy1mNy1mNy1mNy1mNy1mNy1mNy1oNzBoNi9nNS5nNS5nNi9oNzBnNi9mNS5hMiplNi5eMilcMCdgNCthNSxpPTR1U0pYR0BFPjY8NS85NSw7OC84Oi81NywzNis2OS41Oy83Oi82OS42OS41OC01NywzNisyOCwxOSwyOC4xOSwxOS4xOSwxOSwxOSwuOSsuOSsuOSsvOiwwOyszPi42QTE3QjI8RDU6QzI4Py81Oy00NikyNCcxMyUwNCUwNyVIVD5leFx1jW10kmxmiV9Sd0tCaDlLazxOaztQbT1QbT1OaztOaztPbDxRbj5Wc0Nad0ddekpee0tffExffExWc0NOZ0A8SjkvOjIkLiZnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NrYlNrYlNsY1RsY1RtZFVtZFVtZFVtZFVtZFVuZVZuZVZvZldwZ1hxaFlvaF5oaWttdHqFjJSjrLG/yM3T3uLl8PLw/Pzy/Pv1/vn4//f6//b8//L6/ez4+ef29+f29ur39+v69+j89ub99eL37Nbn2MPVxq/AsZqek311bltaV0ZQUUNTVktbYlplbGSVmI2ysqjVzsbo3dnz4+P66uv/8fT/9/n//vv+/fn5+vT4+u/8/PD///P///H/++r/5tHxqpS8b1upVkSuUkO1UES7TEG/SkHCRz/GRT/JRUDKRUDKRT7JRD3IQzzJQjzRQz/QRUDMRUHCQz2zPTmmOzWcOzWVPDaMPDOHPTSFPDWBPTR/PDN+PDB/PTF/PTF+Oi9+Oi9+Oi99OS58OTB7OC97OC97OC97OzJ7OzJ5OjN4OTJ3ODF2NzB2NzBzNy9uNzBqOC9qOC9qOC9qOC9oOC5oOC5oOC5nNy1mNy1mNy1mNy1kOC1kOC1kOC1mNy1nNi9oNzBpODFpODFoNzBpODFqOzNsPTVnODBrPDRiNi1hNSxvQzp4TEN0SUBuTURDOTA1Ni40NS84OTE4OzI0Ny4xNCsyNSw1OC01OC01Nyw0Nis0Nis0Nis0NikzNykvNyguOSkwOCsuOSkuOSsuOSkwOCkwOCkxOSowOCkwOCsvNyowOCsxOSwzOy40PC05QjE6QzA7QjA6QTE6PC42OCoyNCYvMyQyOSdJVT9jdVtthGdmhGJXeVRJbkU/ZDhIZztMaTtOaz1Oaz1MaTtMaTtNajxPbD5VckRZdkhbeEpdekxee01ceUtRbkBHXzs2QjQrNC8jKSVnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNnZFNpY1NqY1NqY1NqYlVsYlZsYlZtY1dtZFVtZFVtZFVsZVVtZlZuZ1dvZ1puaFxvaF5tamVrb3JtdHqDipClrrPDzNHV3+Hm7vH0/P70/fr3/fn5/vf6//T8//L8//H8/+79/vD7+O/++vH/+e//+u3/+en/8t/v4MvdzrfBspuil4F8dWJiX05YWkxdY1dtd258hn2mrKK+wLXa1c/u5OL87u7/9PT/9Pf+9PX/+fn7+vj7/fj8//r4//X0/PH3/fH///H/+ej/9OP/zLu9f3CbUUSpU0a1U0iyQzrASkDESEDHRz7JRj7IRT3HRDzGQzvGQzvNRz7MRz7HRz68QzutPjWfOjKXOjORPjaKPTWGPTSDPTWBPTSAPDN/OzCBOzGBOzF+Oi9+Oi9+OjF9OTB8OTB7OC97OC97OC96OjF6OjF4OTJ3ODF2NzB1Ni91Ni9xNi5tODBrOTBqOC9qOC9pOS9pOS9pOS9oOC5nNy1mNy1nNy1mNy1mNy1mNy1mNy1mNy1mNS5qODFtOzRrOjNqOTJqOjBtPjRvQzhsQDVvRDtkPDJjPTJ6VkqGZFp5V01iTEE+OjEzODE0OTI3PDU0OjAvNSsyNSw5PDMzNisyNSoyNCkwMygxMygyNSo0Nis0NywuNiksNykvNyotOCovNyovNyovNyovNyoxOSwwOCswOC0vNywvNywvNywwOC0wOCs3PzA5QjE8RTQ9RDQ7QTM4PC4yNictNCQyOypKVkJjcltofGFddlhPbUtGZkFBYTpIZDtLaDxOaz9Oaz9LaDxKZzlMaT1Oaz1UcUVXdEhad0tbeExdek5adk1OakFDWzsyPjQqMDAhJydoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqZFhsZFlsY1ptZVptZVhtZlZnYE5qZVJua1hvbF1oZVxmZWFzcXKBgoaKj5OWnqGrs7bDyMvY3eDq7u/29/n5+/r8/v3+/vz///r9/vb6/fL5/PH6/fL7/vP5+vL6+vL5+e38+uv+/Of5997p5crV1La6uZuYmHxxdFlfZE1ia1hyfWyEkIKRm5C0ubLLzMfj4t7y7uv38/L79/b9+fj8+Pf//vz+/vz+/vz9//r9//r9//r9//r9//r6/Pf///r/+/b/6uXYp6CjYFibRD21TkW/TUPCRjzERDnKRTzOSUDOS0HLSEDHRzzGRzjDSDi9SjizSDimRTWaQjSRQjWLQzWGQjWEQjaCQDSCPjOCPDKEOjGGOTGGOTF/OTF+OjF8OTF7ODB6Ny96Ny93Ny52Ni13Ny53Ny53OC93OC92Ny51Ni1xNStuMytsNy9pODFpODFoNzBoNzBnNi9nNi9nNi9mNS5nNi9pNzBpODFoNzBnNi9lNC1lMyxoMy1qNS9tODBrOTBqOjBpOy5pPTBrQTNnQjJqSTpkSDp2X09+a1yKeGqMf29SSj03OS40OjA0OjAzOS8zOS8zOS8yOC4yOC4xNy0xNy0zNi0wNiwyNSwvNSsxNCsvNSsvNC0uNS0vNC0uNS0vNC0vNC0vNC0vNC0wNS4vNC0vNC0uMywuMywvNC0vNC0vNi4xOzIzPTI2QDU4Qjc5RDY3QjQ1QDAzPi00Py5EUT1XZU5ba1FQYkhFWDxAVDhCVzZJYz5LZT5LZj1LZj1KZTxKZTpMZz5Paj9VcEdZdEtcdk9dd1Bdd1JXcU5IYj87TzYmMSsmKy4kKSxoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZpZFFqaFNtaldqa1tnZ19sbGx+f4SQk5qor7W4wsTR1tni5+ry8/X7/P7//v///v/+/fv//vr///r+//n7/PT4+/L2/PL3/fP3+vH4+u/4+u33+un5++Xy9drf4sPM0K+0uJeRlnZrcVVZYUlfa1V0gW+MmIqdp5y/wbzT09Hn5+Xz8/H39/X7+/n8/Pr7+/n+/vz+/vz+/vz+/vz+/vz+/vz+/vz7//71///1///+////+/r/7erwv7rCfnWfS0GvTUC5Sz7CTEDFSz7DRTm8PTS+PzbDRTnERjfDSje9TDqzSjemRjaZQzKRQzaNRTeFQzeCQjiBQTeBPjWCPDSDOjOGOTGEOTN+OTJ9OjJ6OjF6OjF5OTB4OC92Ny52Ny51Ni12Ny50OC50OC50OC5yNixvNSptNCtsNy9pODFqODFoNzBpNzBoNzBnNi9nNi9lMyxlMyxnNS5oNi9qODFqODFqODFrOTJrNjBsNzFrOTBrOzFrOy9qPjFqQDBpRDJnSDZrUD1nUkF1ZlOBdWWMhXOGg3JLTDw2OS4zOS8zOS8zOS8yOC4yOC4yOC4xNy0xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsvNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4wNS8vNC4uMy0uMy0uMy0uMy0vNC4vNi8uODAvOjIxPTM0QDY2QjY2QjY2QjQ1QjE2QzFDUD5QXUlSYElJV0BBTzZCUDdFVTpKYkBKZD9LZUBLZT5JYzxIYzpJZDtKZTxTbkVYcktcdlFdd1RbdFRUbU9DXD42STUmMS0nLDAkKS1oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZtaFVraVRtaldqa1tra2N3d3eRkpenrLK/xszS3N7s8fT3/P/+///+/////v///v/+/fv//vr///r9/vj6+/P1+O/x9+vx9+v09+z1+ev2+Or1+OX19+Hu7tTb27/JyquwsZKTlnl1eWBrcFp0e2mIkIGfp5yuta3Nz8re3tzv7+34+Pb7+/n+/vz+/vz9/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//77///7////////+/n/+vT/9+390cbYnpCUTD2lUkKpTDunQDG3RzvPWU3PVUq8QDTERDfGSDrDSz25STuqQjedPzOXQDeTRTuJQDmEQTmBQTh/PzZ+PjV9PTR/PDR9PTR6OzR4PDR3OzN3OzN1OjJ0OTF0OTF0OTFyOTByOTByOTByOTBvOS9uOC5sNixrNStsNy9qODFsNzFqODFrNjBpNzBpNzBoNi9nNS5nNS5mNS5nNi9oNzBpODFrOjNrOjNsOzRqOzNpOjBoPDFrPzJqQzRpRDJmRTJmSTdsVkFqWUd1alaGf22RjnuAf21FRjY1OC0yOC4yOC4yOC4xNy0xNy0xNy0wNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsvNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4vNC4uMy0tMiwtMiwuMy0vNC4uNS4rNS0rNi4tOS8vOzEyPjI0QDQ2QjQ3RDM4RTM/TDpFUj5DUTo7STI4Ri0+TDNEVDlKX0BKYkBMZEJLYz9JYT1HYDlGXzhHYDlSa0RYcExddVNedlZacVRQZ0s9VDguQS4mMS0nLDAlKi5oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZuaVZsalVsa1dsbV1wcWmAgoGeoaa5vsTEy9Hb5ef1+v37///8/f/8/f/+/P38+/n//vz///v//vn7/PT19u7u8ebp7+Pn7d/t8eLw9OXx9OPx9N/y8dzq6tDY2LzHx6uysZWhoYmRk32Qk4CcnpGqraK2u7TAxb/c3Nrp6ef29vT7+/n9/fv///3///39/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v77+/3//v///v/38u/88+z//PP/++3/9OTsw7G5gXCVUECiTz+4WEq3TT+1RTnARzzBQTbIRTvFST+9Rz2vQDmhPDSaPTaWQTyNPzuHQDyBQDp9QDt6Pzl5QDl4Pzh4Pzh2PTR2PTR2PTR1PDNzPTNyPDJyPDJxOzFvOzBvOzBvOzBuOi9rOS5qOC1qOC1pNy5tODJuNzJtNjFsNzFsNzFrNjBpNzBpNzBsOjNqOTJoNzBmNy9mNy9mNy9oOTFmOjFqPzZmPjRlPTFmPjJoQzNpRTVmRzNjRzJjSjZoVkBpXElza1aFgm+PjnpwcV85PSw0NywyOC4xNy0xNy0xNy0wNiwwNiwwNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsuMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0tMiwtMiwtMiwtMiwuMy0tNC0qNCwpNCwqNiwrNy0uOi4xPTE0QDI1QTM2QzI6RzU8STc4RTEyPysyQCk4Ri8+TjREWDxFXT1LYEFKYkBLYD9HXztIXjpGXjpTaUVYcE5gdVZedVhablNMY0k5TTQpOiglLislKi4kKS1oZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVptZlZsZ1RraVRubVlvcGB0dW2Fh4akp6y/xMrO1dvm8PL7///7///7/P79/v///v/+/fv///3///v+/fj3+PDv8Ojn6t/g5tre5dXn69rq79vt8Nvs8Nnu7tbo6NDa2L/MyrHCvae3taCxrp22tKfBvrXJyMPS087Z2dfo6Oby8vD6+vj8/Pr9/fv///3///38/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vz//P///P//+/r8+/f9//n+//j+//T//+3//uz438vFnIqdYlCWSjqlTDy0UEC8TD6/QDfGQzvFRj+/RD2xPjumOjeeOjiZPjuRPTuKPzyEQD19QD14QTx0QjtyQztyQztxPzZzPjZzPjZyPTVyPTVyPTVwPjVvPTRuPjRtPTNsPDJrOzFqOzFpOjBpOjBqOjBuNzJwNjJwNjJtNjFtNjFsNzFpNzBpNzBsOzRrOjNoOTFlOTBlOTBlOTBlOjFkPDJmQjZjQTVjQzRkRDVkRzVkSTZiSTNfSTJeTDZlVj9qYk1ybVeEg2+Eh3JbYEwzOigyOCwyOC4xNy0xNy0xNy0wNiwwNiwwNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSsuMy0uMy0uMy0uMy0uMy0uMy0uMy0uMy0tMiwtMiwsMSssMSssMSssMSstMiwsMywsNi4rNS0qNCsqNCsrNSwuOC0wOy0yPS8yPS01QC82QTA1QS0xPSkxPSk1QS04Ri89TzVAVDhGWT1IXEBKXT9JXj1LXj5LYD9UZ0dbcFFjdlphdVpZa1NKXUc2RzQmNCUkLSokKSwiJypoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqY1lrZFpsY1xtZFttZVpsZlZqZ1RralVsbllvcmFzdm2BhYSfpKi4v8fW3+Tt9/n7///7///7/P/+/////v/+/fv///v///r8/PTz9err7eLj59nd49Xc49Hk6dPn7NXp7dbq7NTr69Po5s/f2sTTzrjTzrrMxrbLw7jQycHX0s7g29jq5uXw7+3z8vD5+ff9/fv9/fv9/fv///3+/vz8/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//fz/+/z/+Pn//v3+//35//30//jv//X3//bw9+f//+3/7tvNp5Ska1iiW0eqV0WtTDu5RDrARDzART68RT+0QT6qPTqiOjmaOzmVPTyNPz2FPz19QDt3QjxyQztvRDtvRDtwPzhxPzZxPzZxPzZxPzZwPjVvPzVvPzVvQDZuPzVtPjRrPDJoPDFoPDFoPDFsPDJvODNxNjJwNjJwNjJtNjFsNzFqODFpODFoNzBnODBlOTBlOjFkPDJlPzRmQDVkQjZeQjRhRzhjTDpkTTtjTThgSzZdSzNdTTRdUTliWD9taFJzc1uAg252e2VGTzo0PSozOS0yOC4yOC4yOC4xNy0xNy0xNy0wNiwxNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSsrMCorMCorMCorMCosMSssMywuNS4sNi4qNCsqNCsqNCsrNSwtNywuOSstOCowOys0Py81QC80Py4zPyszPi0zQCw3Ri85SzNATzhCVDpHVzxIWz9NXUJNYERVZUpcb1NkdFpgclpYZ1JHWEU0QjEkMiUkLSokKSwiJypoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqY1lrZFpsY1xtZFtsZlpsZlZsaVZsa1ZrbVhrbl1scmh5f32VnaCut77S2+Dq8/j7///5/v/5+v7+/////v/6+ff///v+/fj5+fHx8+jp697j59jf5tbg6NPk6dLn7dPo7NPn6dHo6NDn5c7g28fX0L7a08PZ0cbe1Mvm3dju5OPz6er68fT/+fv6+ff+/vz///39/fv9/fv///3///38/Pr+/vz+/vz+/vz+/vz+/vz+/vz+/vz//fz/+fj/+vn//v38//33//7u//nx///y//31//rz+ev//e3/+uj0zrurd2KPUTqqXEiyTj64Sj25ST64SUC0R0CvRD6lPTqcOjeWPTmPPjqIPzmAQTp4QTp0RDpwRjpwRTxwPzhxPzhxPzhxPzhxPzhxPzhwPzhwPzhxQjpwQTluPzdsPTVpPTRqPjVqPjVuPTZvODNyNzNwNjJwNjJuNzJsNzFqODFpODFkOC9kOTBjOzFkPjNkQDRjQTVjQTVfQzVaRTRfTjxnVkJoV0NjUzxeTzhbTzVcUjddVjxdWT5ubFV0dl58gWtjbVUyPig2Qi4zOy4zOS8zOS8zOS8yOC4yOC4yOC4xNy0xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSssMSsrMCoqLykqLykrMCosMSsrMistNC0rNS0qNCwqNCwrNSwrNSwsNistNywsNisvOiwyPS82QTE3QjI3QjE1QDA0Py4yPy00Qy46RzM9TDVBTzhEVDpKWD9MXEJUYklca1RjcVpebVhVYlBEUkEyPjAjLyUmLywmLCwkKipoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZqZFZqZFZqY1lrZFpsY1xtZFtsZlpsZlZvbFltbFdqbFdna1pmbGJye3iOmJqosbjK09jj7PH4/f/3/P/6+//+/////v/6+fX///r9/fX4+O7w8uXp693l6djj6tjl7dbm7NLp7dLq7dLo6M7o5s/o48/h2sjY0MPYzsTd0szq39v47ev/9Pb/9fn/9fv/+fz+/P3///3///3+/vz+/vz///3///39/fv+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vr//fv//fv9/Pr5/fz4///1///z///t/frz//v7//r///T/9ub/89//483XrZWpb1moV0SuUUCsTz6vT0GxT0KtS0CkQzyZPDWVPjePPzaIPziBQTd7Qjd1RDZxRThxRThwPzhxPzhzPjhxPzhxPzhxPzhxPzhwPzhzQjtxQjpvQDhtPjZsPTVqPjVtPjZvPjdvODNxNzNvODNtODJtODJpODFoOTFmOjFmOzJkPjNkQDRiQjVgQzVdQTNcQDJXQjFURzRbUz5mXkdpXkhiWD9aUzlaUzdcVzpaVjtYVztrbVVzd151fWZVYUkmMhw4RDAzOy40OjA0OjAzOS8zOS8zOS8yOC4yOC4xNy0xNy0xNy0wNiwwNiwvNSsvNSsvNSstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwsMSsrMCorMCoqLykqLykrMCorMCosMSsrMispMysqNCwrNS0rNSwsNi0tNy4tNywsNisuOC0yPDE2QTM5RDY5RDQ3QjQ2QTEwOysyPy01QjA5RjI8STVATjdGVD1KWD9SYElbaFRhblpcaVdRXk1CTkAvOy8iLCMrMS0oLiwmLCxoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZFpsZVttZF1uZVxtZ1ttZ1dxbltrbVdrbllrcmBqcmdweXaHkZOfqrC7xMnQ2d7q7/P2+/78/f/+/////v/+/fn///r+/vb6+vD2+Ov09ujw9OPq8d/n79jw9trt8tTr7tHs7NLo5tHh3Mnd1cje1Mrh1M7o2tny5OT66+7+8vT/9/v/+f///P///f7+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+//r//vr//vr+/vz9//77///6///6///7///+//////3/+/X/+/H//Oz/++X/89v/6tG6gmmmYkuXTzmfVD+oWkajUkGdSjqgTT+OPDCLPTCGPjJ/PS94PS90Py9zQjN0RDZyPTVyPTd0PThzPjh1QDp1QDp0PzlxPzhzQTpxQDlxQDlxQDlwPzhuPzdvPjdvPjdrOTJtODJsOjNsOzRsOzRoPDNnPDNjPTJjPzNePjFkRzljRzlUPS1OOShNOCdAMR5XUTtQTjdLSTBPSzJdWT5pZUplYURWVTdYWDxdYENvc1p6gGZkbFU9STEtOSMyPio0PC81OzE0OjA0OjA0OjAzOS8zOS8zOS8zOS8zOS8zOS8yOC4xNy0xNy0xNy0wNiwxNjAxNjAwNS8wNS8vNC4vNC4vNC4vNC4sMSssMSssMSssMSssMSssMSsrMCorMCouNS4tNC0tNC0sMywtNC0tNCwuNS0uNS0rMiotNCwwNy81PTI5QTY9RTg/Rzw/Sjw3QjI1QC8zPi0xPSkyPio5RS9CTjhJVT9PW0dWYk5daFdZZFRMV0k8RjsvOS4pMyopLysoLionLStoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZFpsZVttZF1uZVxtZ1traFdvblpqbFZrbllrcmBqdGlxfHiJlJajrrS+x8zS2+Dr8PT3/P/9/v/+/////vz+/fn///r+/vT7++/3+ev09+bw9eHq8t3o7dbq79Hm68vk58rm5szj4czf2cne1Mrf1M7n2djt39/25+r77/P/9Pj/9/v/+v7//P///vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z7//r7//r9//z9/v/+/f///P///P//+////P///P//+/n//PX//vH//+3/++X/8tn/69HgsZendVyRW0OWWkKaWUOaVkOZUkCORzWLRjaIRTSDRDN8QzJ3QjBzQC9vPi91QDhzPjh1Pjl1QDp0PzlvPTZwPjdzQTpxPzhwPzhwPzhuPzdvPjdtPjZuPTZtPjZrPDRsPTVtPjZrPzZqPzZnQTZlQTViQjVkRzlbQTJeRzdeSThOPStGNyRHOCU+NiFMTDRHSzJERyxERCpNTTFcWz9iYUNgYUJZWT1kZ0pzd15zeV9YYEk6RCwvOyU3Qy82PjE2PDI2PDI2PDI1OzE1OzE1OzE1OzE1OzE1OzE1OzE0OjA0OjAzOS8zOS8zOS8yNzEyNzEyNzExNjAxNjAxNjAwNS8wNS8uMy0uMy0tMiwtMiwsMSssMSsrMCorMCoqMSoqMSopMCkpMCkpMCkqMSorMiosMysuNS0tNCwuNS0wNy80OzM5QTY/Rj5CSj87Rjg6RTU3QjE0Py4zPys2Qi48SDJATDZMWERTX0tZZFRXYlJMVks9RzwxOzIrNSwrMisqMCwpLytoZVZoZVZoZVZoZVZoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdsY1ptZFttZF1uZVxtZ1traFdtbFhpbVZqb1lrdGFpdWlxfXmKmJmlsri/ytDU3eLt8vb3/P/8/f/9//7//vz+/fj///f9/fP6++33+un09+Tv9N7n79jl69Hi58ne4cLd3cHe3sbe28jd18vg1c/k2dfu4uLz5+v67vL/9Pj/9/v/+fz/+v3//f3//vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z4//z4//z7//7+/v7//P//+v//+f//+P//+f//+v//+vr//fj///b///P9/+//+ub/9Nz/+OD/7NPjv6esgmqHWUKFUTuSW0aXXUmNUz9/RjJ1PilyPilzQCt0RDB2RTRxPzRuPDNxPDR0QjlzQThvPzVxQTd4SD5uPjRtPjRtPjRrPzRsPTNqPjNsPTNqPjNnPzVnQTZnQTZnQzdlQzdjQzZgQzVeRDViSztVQjFaSTdgU0BSRzNDOyZFPShGQStBRSxCSC5BRSo8QCU/QiVOTjJfYEFpakthYUVucVR2emFnbVNKTzk0PCU0PSg9RjM4PjI4PjQ4PjQ4PjQ3PTM3PTM3PTM2PDI4PjQ4PjQ3PTM3PTM3PTM2PDI2PDI2PDI1OjQ0OTM0OTM0OTMzODIzODIzODIyNzEwNS8wNS8vNC4uMy0tMiwsMSsrMCorMCopLigpLigpLigpLigpLigqLykrMCosMSsxNjAvNC4sMSssMSsvNC42OzQ9QjxBSEBASz0+Szo8STc4RTM0QS0yPyszQSo1QyxEUT1LWERRXk1RXk1IVEg8SDwyPjQuOC8tNC0tNC0sMyxnZFVnZFVoZVZoZVZoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldrZVdrZVdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbVZqb1lqc2BodGhtfHeImJims7m/ytDT3OPr8Pb2+//8/f/9//7///3//vn+/vb9/fH6++33+uf09+Lu89zl7dXi6M7b4MDX2rvW1rzZ18Ld18fe183l29ns4OD47PD78Pb/9fv/+f7/+v3/+/v/+/v//fz//vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//z4//74//77//7+/v7//P7/+v//+f//+P7/+v3/+fz/+fn//fr///j///j7//X8/vD//+3//On/8d//8N3/79rx0r20kHp7Uj50SjR1SDN2STR6TTh9UDt5TDduQS5lNyd7TUBzRDpxQjhzRDpvQzhnOzBkOC1nPTFpPzNpPzNpPzNnPzNmPjJmPjJmPjJlPzJiQDRiQjVgQzVfQzVfQzVbRDRaRTRXRDNYSTZPQi9cVD9vaVNjXkhNSzRJRzBJSzM+RCo/SC1ARio8QiY8QSNGSSxYWTpkZUZtbVF4eFx0dl5bX0ZAQy42OyU4QCs8QzE5PzM5PzU5PzU4PjQ4PjQ3PTM3PTM3PTM5PzU4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ3PDY3PDY3PDY2OzU2OzU2OzU1OjQ1OjQzODIzODIxNjAwNS8vNC4tMiwsMSssMSsrMCorMCoqLykqLykrMCosMSstMiwtMiwwNS8uMy0rMCorMCotMi4yNzE4PTk7QjpASz1ATTtATTs9SjY4RTEzQCwxPygwPic8STVCTztIVUNJVkVEUEI7RzsyPjQuOjAsNi4uNS4tNC1nZFVnZFVnZFVoZVZoZVZpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldpZldrZVdsZFdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbldpcVpnc19kcmVqeXSFlZWjsre9yM7S2+Lq7/X0+f37/P/9//7///3///r///j///P+//H7/uv3+uXw9d7m7tbi6MzZ3L/V1bnS0LnU0b7a1Mjg2dHq4N/06e3+8/n/9/z/+////f///v///vz//vr//vr+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz9//76///6///7///+/v7//f7//Pz/+/z/+/r/+vj/+ff/+vf//fj///v///v9//r9/vn59O7//vb//fT//PP/++7/9+f75tXp0sDPtKG2moWUdWF3VkNqSTZsSTZyTTt1UD5tRjdpQjNnQjJqRTVuSTluSjpvSztvSztlQTFjQjFjQjFjQjFjQjFjQjFiQzFgQzNdRjZcRzZcRzZaRzZaRzZXSDVURzRSRzNQSDNOSDJmZE1+fmZyclpWWEBKTDRHTTM8RSo8Ris/SCtBRytBRihERypNTi9UVTZ4d1t7el5ublZVVT1DQi4/QSw+QS46Pi07PjM5PzU5PzU4PjQ4PjQ3PTM3PTM3PTM4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ4PjQ5Pjg5Pjg5Pjg4PTc4PTc4PTc3PDY3PDY2OzU1OjQ0OTMzODIyNzEwNS8vNC4vNC4tMi4tMi4sMS0rMCwrMCwsMS0tMi4tMi4sMS0sMS0sMS0sMS0uMjEwNTEzNzY0OzQ7Rzk9TDlATzxATzo8SzY3Ri80QywyQSo2RS46STRATzxCUD8/TT44RjcxPzItOS0sNi0tNCwsMytmY1RmY1RnZFVoZVZoZVZpZldqZ1hqZ1hpZldpZldpZldpZldpZldpZldpZldpZldsZFdsZFdsY1ptZFttZF1tZlxtZ1tqaVdrbVhpbldpcVpnc19icGNneHKClJSjsrfAy9HU3eTr8Pb1+v77/P/9//7///3///r///j///T///P//+/6/ejy9+Dn8NXi6MzX2r3R0bXNy7TOy7rWz8Xe19Hs4uP37vP/9v7/+v///f///v////3+//r+//n+//r+//r+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v79/v/9/v/9/v/9//79//z+//r+//n///f9/fP9/fX+/fj+/fn//vz+/v7//f///v/++f///P//+/z79vP/+PL//fT//vH//e3/+un/8uD35NPn0r/Su6m5n46fhHOPcmJ8XUt9Xkx0VUNhRDJXOihZPCpbPixYPSpgRTJgRTJgRTJfRjJgRzNgRzNgRzNdSDNcSzdcTTpcTTpZTDlYTTlVTThSTDZRTDZOTDVRUTlpa1N8gGdtcVhTWT9GTDI+Ryw8Ris8Ris/SCtESi5FSixERypISSpMTS55eFx0c1dmZE1UUjtMSTZLSjZGRTM8PS08PzQ5PzU5PzU5PzU4PjQ4PjQ4PjQ4PjQ3PTM3PTM4PjQ4PjQ4PjQ4PjQ5PzU5PzU6Pzk6Pzk6Pzk6Pzk5Pjg5Pjg5Pjg4PTc4PTc4PTc3PDY2OzU1OjQ0OTMzODIzODIvNDAuMy8tMi4sMS0rMCwrMCwrMCwrMCwrMCwsMS0tMTAuMjEvMzIvMzIvMzItNC0zPzE3RjM9TDdATzo/Tjc8SzQ5SDE4RzA1RC04RzA8SzY+TTo8Sjk3RTYxPzItOS0rNSwtNCwsMytmY1RmY1RnZFVoZVZoZVZpZldqZ1hqZ1hpZldpZldpZldpZldpZldpZldpZldpZldsZFdsZFdsY1ptZFttZF1tZlxtZ1tqaVdqbFdobVZoclpmc19jcWRoeXOFl5elt7vH0tja4+rw9fv4/f/8/f/9//7///3//vn///X///L///D8/+z4++bv9N3i69Dd48fV1bnOzLPJxLDKxLTQyb/a0s/p4OP27fL/9///+v///f///v////39//r8//j8//j9//r+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/v7//P///P/+/f/9//76//r4//n4//X4//P4//P4//X8//j9//r//f7//P///P//+//99///+v///P///f///v/+/fv7+/P6+Oz///H//+///+3//u3//e3/9uf/7uD96tv649H/5tDjyrSlj3h0XkdlTzhiTDVcSDBeSjJcSjJcSjJdSzNdSzNeTDReTDRcTTZZTjhXTzpXTzpWUDpVTzlTTjhQTjdOTjZNTzdQVDtgZkxmb1RVXkNFTzRBSzA8Ris/SS4/SS5DTC9ITjJITS9GSSxPUDFZWDpxbVJqZkthXEZbVkBZVEFUUT5NSjlCQzM9QDU7QTc7QTc7QTc6QDY6QDY6QDY5PzU4PjQ4PjQ4PjQ5PzU5PzU6QDY6QDY6QDY7QDo7QDo7QDo6Pzk6Pzk5Pjg5Pjg5Pjg6Pzk6Pzk5Pjg5Pjg4PTc4PTc3PDY3PDY0OTUyNzMxNjIvNDAtMi4sMS0rLy4rLy4sMC8sMC8tMTAuMjEuMjMuMjMtMTIrMS0rOSovQC02SDI7TTc9Tzc8TjQ6TDI6TDI1Ry83STE6TDY8TTo6Szk2RzcwQDMtOy4sNi0tNCwsMytjZFJjZFJkZVNlZlRnZVZoZldpZ1hpZ1hoZldpZldpZldpZldpZldpZldpZldrZVdrZVdrZVdsZFlsZVttZF1tZlxrZ1tqaVdpa1ZobVdoclpndGBkcWdqe3WJm52qvMDN2N7g5+30+f/6///7///9//z+//r+/vb6+u76++36++n4+uXz9uHq7tff48rZ3MHT0bjMx7HFvqzGvrHMw7zWzsvm3eD06vL+9///+v///v/////+/v79//r8//r8//r9//z+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz+/vz//vz//vz//vz//f7//P///P///f/9//77//z4//n3//f3//X4//b5//b8//j///v//v3//P//+///+v//+v//+////P///v/+/f/7/fz8/vv+//r5+vL6/PH9++/++u7/+ez/++z//e///ez/8Nv/++Ls3MOejnVgUDdSQilYSC9YSC5bTTNbTTNaTjRaTjRbTzVbTzVcUDZbUThVTzdUTzlUTzlRTzhQTjdOTjZLTTVJTTRKTjVMUjhTXEFQWTxASSw7RihBTC4/SixETTBFTjFKUTJNUjRKTTBMTDBZWT1rak5oZEliXkVeWkFfWkRgW0daVUFRTzpLSjhBQjRAQjVAQjU+QTY+QTY+QTY9QDc9QDc5PzU5PzU5PzU6QDY6QDY6Qjc6Qjc6Qjc7QDk7QDk7QDo6Pzg6Pzk5Pjc5Pjg5Pjc7QDo7QDk7QDo7QDk6Pzk6Pzg6Pzk6Pzk4Pzg3PTk0OzQzODIxNjAvNC4uMy8uMy8uMjEuMjEsMi4sMi4rMisrMiosNCkpNiUkNh4pPSEyRis4TDE7TzY7TTU7TTU7TTU4SjI5SzM7TTU8TjY8Tjg3SDUxQjAuPC0tNywuNS0tNCxdZU5eZk9fZ1BgaFFkaVVmaVZnaldpalhmZ1VoZ1VoZVZoZVZqZFZrZVdrZVlsZlhsZlhraFltZ1trZ1xtZl5qZltpZVlnZVZnaFZma1Vlbllib11kcWhzg4CWqKy5yM/S2+Li6e/y9/v3/P/5/fz8/vn8//b8/vH3+Or5+ur49+Xy8d3u7dnr6tbg38rX0r7Xz7zLwK69tKW9s6nCt7HMwsHb0tfq4Oj68/v89v/++////v/+/f/8/f/8/v38/v3+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz+/fn+/fn//Pn//fr//vv//vv//v///f7//P3//f7////+//39//z7/fj///v8/ff//fj//vr//fj/+vb/9/T/+fn/+v///P///f/////////9//z9//78/v3+/////////vz//vn//vP//u7//er//eb69Nz/+uDn4MaPiGxVTjJXTjFUSy5TSitXTjFXTjFVTjFVTjFUTzJUTzJUTjRTTzRRTTJSTjVRTzZQUDZNTzdLTzZITTZHTDVKUDZGTzRBSi09Ric+SCZESypGTStFTCpQVjRQVDNLTi9ISyxUVDhiYkZjY0laWkBbWUBcWkFdW0JdW0JbWUBYVj1VUzpTUThIRjFHRDFEQTBBPzBAPjE+PjI/PzU+QDU7PjU5PzU5PzU5QTY5QTQ4QzU4QzU4QzU6Qjc5QTY5QDg4QDU4Pzc5QTY5QDg6Qjc6QTk6Qjc5QDg6Qjc7Qjo8RDk9RDw+RT04Qjo4Qjo3QTg4QDU2PjE0PC8zOS8yNzEuNDAvNTEtNy8tOS0uOykwQCY2Ryc3TSc7Vis6Vys7VTA7VDQ7Ujg9UDo+Tzw+UDo6TDZAUjhFVz1GWT1EWD1AVDs1SDIrPCksNissMysrMipaZ01baE5caFBdaVFialNja1RnbFhoa1hnaFZnaFZpZldpZldrZVdsZlhtZVptZ1ltZ1lraFlrZ1trZ1xqZl1qZltoZlplZlZoaVdnbFZmb1xlcmFqd256iomcq7K6yNHQ2eDh6ezy9/v4/v75/vr6//j7/vP5/e/4+ev3+Ob19OLt7Njp5tPl4s/c18TSy7nKv63BtKS5raG8r6bBtrLLwcDb0Nbm3+b78/799//++////v/+/f/8/f/8/f/8/f/+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz//fr//Pn//Pn//fr//fn//vr//v3//fz//P3//f7//v///v///f79+/z//v3//vv//Pr/+PP47efy5d326N/78Or/+v3//P///f7///3///v9//z9//78/f/9/v/9/v///f///vz//vX//+7//uj//+T69t39++Lk4MeLh2xSTTBTTjBRSytRSytVTy9VTy9UTzFUTzFTTzJTTzJRUDRRUDRRTTJQTzNQTjVOUTZNTzdKUDZITTZFTTVIUTZFTjFCSy4/SSdCSShGTStKUCxLUS1OUi9QVDFWWjdeYkFfYkNZXD9UVzxVVT1WVj5XVT5YVj1ZVz5YVj1YVztXVjpYVDlRSzNPSTNMRzRJRDFEQTJCQDNBPzM+QDU8PTU5PzU5PzU5QTY3QjQ4QzU3RDM3RDM6Qjc5QTY5QTY4QDU4QDU5QTY5QTY6Qjc6Qjc6Qjc6Qjc6Qjc7Qzg8RDk9RTo8Rjs9Rz88SD48Rjs7RjY8RDU6QjM5PzM4PTY3Pjc0PjYzPTQwPi0zQyk5TSpCWS9HYTFPcDtMbjtMaT1GYT5CWT88Uj07TDo6Szg9TzlEVjxLXkJNYEJMYERIXEA6UTcxRC4rNSorMiopMChaZ01baE5caFBealJialNkbFVnbFhpbFlpalhpalhraFlraFlsZlhtZ1luZltuaFptZ1lraFlrZ1tqZltqZl1pZVpoZlpmZ1doaVdlalRkbVpndGNvfHN/j46drLO2xM3N1t3e5unx9vr4/v76/v35/vj4+/L0+Orz9Obw8d/q6dfh4Mzc2cbX1MHQy7jHwK6/s6O9sKC8sKTDtq7LwLzVy8rj2N7r5Ov89P/99//++////v/+/f/8/f/8/f/9//7+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz//vz//vz//fr//fr//Pn//Pn//Pj//Pj//fz//Pv/+/z//P3//v///v///f7+/P3//v3//vv//fv88+7q39ni1c3r3dT37Ob/+v3//P///f7///3///v9//z9//78/f/9/v/9/v///v////3//vX//u3//ef//uP7997+/OPj38aJhWpQSy5RTC5RSytRSytUTi5VTy9UTzFVUDJUUDNTTzJRUDRQTzNRTTJPTjJQTjVNUDVNTzdKUDZJTjdGTjZIUTZGTzJDTC9DTStGTSxKUS9PVTFTWTVRWTJXXzhqcEp5f1txdlZZXkBLTzRNUDVRUTlRUTlSUDlTUThUUjlVVDhZVTpaVjtYUjpWUDpSTTpOSTZIRTZEQjVDQTU/QTY8PTU5PzU6QDY5QTY3QjQ3QjQ3RDM3RDM6Qjc6Qjc5QTY5QTY5QTY5QTY6Qjc6Qjc6Qjc6Qjc6Qjc6Qjc7Qzg8RDk+Rjs8Rjs/SUE+SkA/ST4+STk/Rzg+Rjc+RDg9Qjs+RT45Qzs2QDc0QjE5SS9CVjNQZz1YckJef0pbfUpYdUlNaEVDWkA5Tzo2RzU0RTI8TjhFVz1OYUVTZkhTZ0tOYkZAVz02STMvOS4vNi4tNCxaZ01baE5caFBealJibFRlbVZobVlpblprbFprbFpsaltsaVpuaFpuaFpvZ1xvaVtsaVpraFlqZlpqZltpZVxpZVpoZlpmZ1dmZ1ViZ1FhaldlcmFvfHN+jo2WpayrucLH0Nfa4efu8/f2/Pz4/Pv1+vTz9u3u8uTp6tzj5NLc28nT0r7Oy7jJxrPDvqu9tqTDt6fHuazNwbXWycHf1NDp397z6O748fj99f/++P///P/+/f/9/P/8/f/8/v39//7+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz+/fv//vz//fr//fr//fr//Pn/+/f/+/f//fz//Pv++vv/+/z//f7//v///f7+/P3//Pv//vv//fv99O/t4tzm2dHw4tn88ev/+v3//P///f7///3///v9//r9//78/f/9/v/9/v///v////3//vX//u3//Ob//OH++eP//ufk38mKhm1QSjBSTTBTTC9TTS1UTi5VTy9VUDJVUDJUUDNTTzJQTzNPTjJQTDFOTTFPTTRMTzRMTjZKUDZKTzhIUDhKUzhHUDNHUDNJUzFNVDNPVjRWXDhcZD1nckh0gVWIk2mQm3OFj2xudVRaYUJSVjtMTjZOTjZNTTVOTDVPTTZSUDdXUzpZVTxaVD5YUjxUTzxRTDlLSDlHRThFQzdAQjc9PjY6QDY6QDY5QTY3QjQ3QjQ2QzI2QzI7Qzg6Qjc5QTY5QTY5QTY5QTY6Qjc7Qzg7Qzg6Qjc6Qjc7Qzg7Qzg9RTo+Rjs9Rzw9Rz88SD4+SD0+STk/Rzg+Rjc+RDg9Qjs9RD05Qzs2QDc0QjE5SS9EWDVSaT9bdUVae0ZXeUZUcUVJZEE9VDoySDMvQC4tPis2SDJAUjhMX0NSZUdTZ0tPY0dAVz02STMwOi8wNy8tNCxZZ01aaE5caFBealJibFRlbVZpblpqb1ttblxsbVtta1xtaltuaFpuaFpvaV1vaVtsaVpraFlqZlppZVppZVxpZVppZ1tnaFhnaFZjaFJhaldlcmFvfHN7i4qQn6aisLnBy9TU3eTp8fTy+vz0+vjx9vDt8Ofo7N7i49Xa28nS0b/MybbJxLHDvqu/uKa8s6LKvq7Txbjc0MTm2dHt4uD27O3/9Pr/+f//9///+v///P/+/f/9/P/7/P78/v3+///+/v7+/v7+/v7+/v7+/v7+/v7//vz//vz+/fv+/fv//fr//fr//fr/+/j/+vb++fX//fz/+/r9+fr++vv+/P3//f7//v///f7//Pv//fr//Pr/+PP37Oby5d346uH/9O7/+v3//P///f7///3///v9//r9//78/f/8/f/9/v///v////3//vX//ez/++P++t///Ob//+nn4syMiG9STDJUTzJUTTBVTjFUTi5VTy9WUTNWUTNVUTRTTzJPTjJOTTFQTDFOTTFOTDNLTjNMTjZLUTdLUDlKUjpMVTpJUjVKUzZPWTdTWjlUWzldYz9mbkeCkmOSpnOfsYGbqn+SoXqIlHBye1xcYkZMUDdLTTVMSzZLSTRMSjVQSzVUTjhWUDpXUTtWUDpTTjtRTDlMSTpJRzpHRTlDRTo9PjY6QDY6QDY5QTY3QjQ3QjQ2QzI2QzI7Qzg7Qzg6Qjc5QTY5QTY6Qjc7Qzg7Qzg7Qzg7Qzg7Qzg7Qzg8RDk9RTo+Rjs9Rzw9Rz88SD49Rzw9SDg+Rjc9RTY9Qzc9Qjs6QTo3QTk1PzY0QjE5SS9CVjNOZTtVbz9UdUBSdEFQbUFFYD05UDYtQy4rPCorPCkxQy08TjRIWz9QY0VSZkpOYkZAVz01SDIsNisrMionLiYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGVnL3Rlc3RpbWdwLmpwZyBiL2pwZWcvdGVzdGltZ3AuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmI2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3Rlc3RpbWdwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGVnL3Rlc3RvcmlnLmpwZyBiL2pwZWcvdGVzdG9yaWcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTZhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3Rlc3RvcmlnLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGVnL3Rlc3Rwcm9nLmpwZyBiL2pwZWcvdGVzdHByb2cuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMGZlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3Rlc3Rwcm9nLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGVnL3RyYW5zdXBwLmMgYi9qcGVnL3RyYW5zdXBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlYzU2NAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvdHJhbnN1cHAuYwpAQCAtMCwwICsxLDkyOCBAQAorLyoKKyAqIHRyYW5zdXBwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW1hZ2UgdHJhbnNmb3JtYXRpb24gcm91dGluZXMgYW5kIG90aGVyIHV0aWxpdHkgY29kZQorICogdXNlZCBieSB0aGUganBlZ3RyYW4gc2FtcGxlIGFwcGxpY2F0aW9uLiAgVGhlc2UgYXJlIE5PVCBwYXJ0IG9mIHRoZSBjb3JlCisgKiBKUEVHIGxpYnJhcnkuICBCdXQgd2Uga2VlcCB0aGVzZSByb3V0aW5lcyBzZXBhcmF0ZSBmcm9tIGpwZWd0cmFuLmMgdG8KKyAqIGVhc2UgdGhlIHRhc2sgb2YgbWFpbnRhaW5pbmcganBlZ3RyYW4tbGlrZSBwcm9ncmFtcyB0aGF0IGhhdmUgb3RoZXIgdXNlcgorICogaW50ZXJmYWNlcy4KKyAqLworCisvKiBBbHRob3VnaCB0aGlzIGZpbGUgcmVhbGx5IHNob3VsZG4ndCBoYXZlIGFjY2VzcyB0byB0aGUgbGlicmFyeSBpbnRlcm5hbHMsCisgKiBpdCdzIGhlbHBmdWwgdG8gbGV0IGl0IGNhbGwganJvdW5kX3VwKCkgYW5kIGpjb3B5X2Jsb2NrX3JvdygpLgorICovCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJ0cmFuc3VwcC5oIgkJLyogTXkgb3duIGV4dGVybmFsIGludGVyZmFjZSAqLworCisKKyNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorCisvKgorICogTG9zc2xlc3MgaW1hZ2UgdHJhbnNmb3JtYXRpb24gcm91dGluZXMuICBUaGVzZSByb3V0aW5lcyB3b3JrIG9uIERDVAorICogY29lZmZpY2llbnQgYXJyYXlzIGFuZCB0aHVzIGRvIG5vdCByZXF1aXJlIGFueSBsb3NzeSBkZWNvbXByZXNzaW9uCisgKiBvciByZWNvbXByZXNzaW9uIG9mIHRoZSBpbWFnZS4KKyAqIFRoYW5rcyB0byBHdWlkbyBWb2xsYmVkaW5nIGZvciB0aGUgaW5pdGlhbCBkZXNpZ24gYW5kIGNvZGUgb2YgdGhpcyBmZWF0dXJlLgorICoKKyAqIEhvcml6b250YWwgZmxpcHBpbmcgaXMgZG9uZSBpbi1wbGFjZSwgdXNpbmcgYSBzaW5nbGUgdG9wLXRvLWJvdHRvbQorICogcGFzcyB0aHJvdWdoIHRoZSB2aXJ0dWFsIHNvdXJjZSBhcnJheS4gIEl0IHdpbGwgdGh1cyBiZSBtdWNoIHRoZQorICogZmFzdGVzdCBvcHRpb24gZm9yIGltYWdlcyBsYXJnZXIgdGhhbiBtYWluIG1lbW9yeS4KKyAqCisgKiBUaGUgb3RoZXIgcm91dGluZXMgcmVxdWlyZSBhIHNldCBvZiBkZXN0aW5hdGlvbiB2aXJ0dWFsIGFycmF5cywgc28gdGhleQorICogbmVlZCB0d2ljZSBhcyBtdWNoIG1lbW9yeSBhcyBqcGVndHJhbiBub3JtYWxseSBkb2VzLiAgVGhlIGRlc3RpbmF0aW9uCisgKiBhcnJheXMgYXJlIGFsd2F5cyB3cml0dGVuIGluIG5vcm1hbCBzY2FuIG9yZGVyICh0b3AgdG8gYm90dG9tKSBiZWNhdXNlCisgKiB0aGUgdmlydHVhbCBhcnJheSBtYW5hZ2VyIGV4cGVjdHMgdGhpcy4gIFRoZSBzb3VyY2UgYXJyYXlzIHdpbGwgYmUgc2Nhbm5lZAorICogaW4gdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIsIHdoaWNoIG1lYW5zIG11bHRpcGxlIHBhc3NlcyB0aHJvdWdoIHRoZSBzb3VyY2UKKyAqIGFycmF5cyBmb3IgbW9zdCBvZiB0aGUgdHJhbnNmb3Jtcy4gIFRoYXQgY291bGQgcmVzdWx0IGluIG11Y2ggdGhyYXNoaW5nCisgKiBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4gbWFpbiBtZW1vcnkuCisgKgorICogU29tZSBub3RlcyBhYm91dCB0aGUgb3BlcmF0aW5nIGVudmlyb25tZW50IG9mIHRoZSBpbmRpdmlkdWFsIHRyYW5zZm9ybQorICogcm91dGluZXM6CisgKiAxLiBCb3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHZpcnR1YWwgYXJyYXlzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUKKyAqICAgIHNvdXJjZSBKUEVHIG9iamVjdCwgYW5kIHRoZXJlZm9yZSBzaG91bGQgYmUgbWFuaXB1bGF0ZWQgYnkgY2FsbGluZyB0aGUKKyAqICAgIHNvdXJjZSdzIG1lbW9yeSBtYW5hZ2VyLgorICogMi4gVGhlIGRlc3RpbmF0aW9uJ3MgY29tcG9uZW50IGNvdW50IHNob3VsZCBiZSB1c2VkLiAgSXQgbWF5IGJlIHNtYWxsZXIKKyAqICAgIHRoYW4gdGhlIHNvdXJjZSdzIHdoZW4gZm9yY2luZyB0byBncmF5c2NhbGUuCisgKiAzLiBMaWtld2lzZSB0aGUgZGVzdGluYXRpb24ncyBzYW1wbGluZyBmYWN0b3JzIHNob3VsZCBiZSB1c2VkLiAgV2hlbgorICogICAgZm9yY2luZyB0byBncmF5c2NhbGUgdGhlIGRlc3RpbmF0aW9uJ3Mgc2FtcGxpbmcgZmFjdG9ycyB3aWxsIGJlIGFsbCAxLAorICogICAgYW5kIHdlIG1heSBhcyB3ZWxsIHRha2UgdGhhdCBhcyB0aGUgZWZmZWN0aXZlIGlNQ1Ugc2l6ZS4KKyAqIDQuIFdoZW4gInRyaW0iIGlzIGluIGVmZmVjdCwgdGhlIGRlc3RpbmF0aW9uJ3MgZGltZW5zaW9ucyB3aWxsIGJlIHRoZQorICogICAgdHJpbW1lZCB2YWx1ZXMgYnV0IHRoZSBzb3VyY2UncyB3aWxsIGJlIHVudHJpbW1lZC4KKyAqIDUuIEFsbCB0aGUgcm91dGluZXMgYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVycyBhcmUKKyAqICAgIHBhZGRlZCBvdXQgdG8gYSBmdWxsIGlNQ1UgYm91bmRhcnkuICBUaGlzIGlzIHRydWUsIGFsdGhvdWdoIGZvciB0aGUKKyAqICAgIHNvdXJjZSBidWZmZXIgaXQgaXMgYW4gdW5kb2N1bWVudGVkIHByb3BlcnR5IG9mIGpkY29lZmN0LmMuCisgKiBOb3RlcyAyLDMsNCBib2lsIGRvd24gdG8gdGhpczogZ2VuZXJhbGx5IHdlIHNob3VsZCB1c2UgdGhlIGRlc3RpbmF0aW9uJ3MKKyAqIGRpbWVuc2lvbnMgYW5kIGlnbm9yZSB0aGUgc291cmNlJ3MuCisgKi8KKworCitMT0NBTCh2b2lkKQorZG9fZmxpcF9oIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzKQorLyogSG9yaXpvbnRhbCBmbGlwOyBkb25lIGluLXBsYWNlLCBzbyBubyBzZXBhcmF0ZSBkZXN0IGFycmF5IGlzIHJlcXVpcmVkICovCit7CisgIEpESU1FTlNJT04gTUNVX2NvbHMsIGNvbXBfd2lkdGgsIGJsa194LCBibGtfeTsKKyAgaW50IGNpLCBrLCBvZmZzZXRfeTsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyOworICBKQ09FRlBUUiBwdHIxLCBwdHIyOworICBKQ09FRiB0ZW1wMSwgdGVtcDI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogSG9yaXpvbnRhbCBtaXJyb3Jpbmcgb2YgRENUIGJsb2NrcyBpcyBhY2NvbXBsaXNoZWQgYnkgc3dhcHBpbmcKKyAgICogcGFpcnMgb2YgYmxvY2tzIGluLXBsYWNlLiAgV2l0aGluIGEgRENUIGJsb2NrLCB3ZSBwZXJmb3JtIGhvcml6b250YWwKKyAgICogbWlycm9yaW5nIGJ5IGNoYW5naW5nIHRoZSBzaWducyBvZiBvZGQtbnVtYmVyZWQgY29sdW1ucy4KKyAgICogUGFydGlhbCBpTUNVcyBhdCB0aGUgcmlnaHQgZWRnZSBhcmUgbGVmdCB1bnRvdWNoZWQuCisgICAqLworICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICBmb3IgKGJsa195ID0gMDsgYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7CisgICAgICBidWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgeworCWZvciAoYmxrX3ggPSAwOyBibGtfeCAqIDIgPCBjb21wX3dpZHRoOyBibGtfeCsrKSB7CisJICBwdHIxID0gYnVmZmVyW29mZnNldF95XVtibGtfeF07CisJICBwdHIyID0gYnVmZmVyW29mZnNldF95XVtjb21wX3dpZHRoIC0gYmxrX3ggLSAxXTsKKwkgIC8qIHRoaXMgdW5yb2xsZWQgbG9vcCBkb2Vzbid0IG5lZWQgdG8ga25vdyB3aGljaCByb3cgaXQncyBvbi4uLiAqLworCSAgZm9yIChrID0gMDsgayA8IERDVFNJWkUyOyBrICs9IDIpIHsKKwkgICAgdGVtcDEgPSAqcHRyMTsJLyogc3dhcCBldmVuIGNvbHVtbiAqLworCSAgICB0ZW1wMiA9ICpwdHIyOworCSAgICAqcHRyMSsrID0gdGVtcDI7CisJICAgICpwdHIyKysgPSB0ZW1wMTsKKwkgICAgdGVtcDEgPSAqcHRyMTsJLyogc3dhcCBvZGQgY29sdW1uIHdpdGggc2lnbiBjaGFuZ2UgKi8KKwkgICAgdGVtcDIgPSAqcHRyMjsKKwkgICAgKnB0cjErKyA9IC10ZW1wMjsKKwkgICAgKnB0cjIrKyA9IC10ZW1wMTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX2ZsaXBfdiAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCisvKiBWZXJ0aWNhbCBmbGlwICovCit7CisgIEpESU1FTlNJT04gTUNVX3Jvd3MsIGNvbXBfaGVpZ2h0LCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeTsKKyAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKKyAgSkJMT0NLUk9XIHNyY19yb3dfcHRyLCBkc3Rfcm93X3B0cjsKKyAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBXZSBvdXRwdXQgaW50byBhIHNlcGFyYXRlIGFycmF5IGJlY2F1c2Ugd2UgY2FuJ3QgdG91Y2ggZGlmZmVyZW50CisgICAqIHJvd3Mgb2YgdGhlIHNvdXJjZSB2aXJ0dWFsIGFycmF5IHNpbXVsdGFuZW91c2x5LiAgT3RoZXJ3aXNlLCB0aGlzCisgICAqIGlzIGEgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCBhbmFsb2cgb2YgaG9yaXpvbnRhbCBmbGlwLgorICAgKiBXaXRoaW4gYSBEQ1QgYmxvY2ssIHZlcnRpY2FsIG1pcnJvcmluZyBpcyBkb25lIGJ5IGNoYW5naW5nIHRoZSBzaWducworICAgKiBvZiBvZGQtbnVtYmVyZWQgcm93cy4KKyAgICogUGFydGlhbCBpTUNVcyBhdCB0aGUgYm90dG9tIGVkZ2UgYXJlIGNvcGllZCB2ZXJiYXRpbS4KKyAgICovCisgIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7CisJLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLworCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCisJICAgY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOworICAgICAgfSBlbHNlIHsKKwkvKiBCb3R0b20tZWRnZSBibG9ja3Mgd2lsbCBiZSBjb3BpZWQgdmVyYmF0aW0uICovCisJc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgICB9CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7CisJICAvKiBSb3cgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCisJICBkc3Rfcm93X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldOworCSAgc3JjX3Jvd19wdHIgPSBzcmNfYnVmZmVyW2NvbXBwdHItPnZfc2FtcF9mYWN0b3IgLSBvZmZzZXRfeSAtIDFdOworCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisJICAgICAgIGRzdF9ibGtfeCsrKSB7CisJICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkgKz0gMikgeworCSAgICAgIC8qIGNvcHkgZXZlbiByb3cgKi8KKwkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKKwkgICAgICAvKiBjb3B5IG9kZCByb3cgd2l0aCBzaWduIGNoYW5nZSAqLworCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CisJICAgIH0KKwkgIH0KKwl9IGVsc2UgeworCSAgLyogSnVzdCBjb3B5IHJvdyB2ZXJiYXRpbS4gKi8KKwkgIGpjb3B5X2Jsb2NrX3JvdyhzcmNfYnVmZmVyW29mZnNldF95XSwgZHN0X2J1ZmZlcltvZmZzZXRfeV0sCisJCQkgIGNvbXBwdHItPndpZHRoX2luX2Jsb2Nrcyk7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb190cmFuc3Bvc2UgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogVHJhbnNwb3NlIHNvdXJjZSBpbnRvIGRlc3RpbmF0aW9uICovCit7CisgIEpESU1FTlNJT04gZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOworICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIFRyYW5zcG9zaW5nIHBpeGVscyB3aXRoaW4gYSBibG9jayBqdXN0IHJlcXVpcmVzIHRyYW5zcG9zaW5nIHRoZQorICAgKiBEQ1QgY29lZmZpY2llbnRzLgorICAgKiBQYXJ0aWFsIGlNQ1VzIGF0IHRoZSBlZGdlcyByZXF1aXJlIG5vIHNwZWNpYWwgdHJlYXRtZW50OyB3ZSBzaW1wbHkKKyAgICogcHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBEQ1QgYmxvY2tzIGZvciBldmVyeSBjb21wb25lbnQuCisgICAqLworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisJIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7CisgICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisJICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgeworCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCisJICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOworCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgeworCSAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOworCSAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOworCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKQorCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCWRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19yb3RfOTAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogOTAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgMS4gVHJhbnNwb3NpbmcgdGhlIGltYWdlOworICogICAyLiBIb3Jpem9udGFsIG1pcnJvcmluZy4KKyAqIFRoZXNlIHR3byBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgorICovCit7CisgIEpESU1FTlNJT04gTUNVX2NvbHMsIGNvbXBfd2lkdGgsIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKKyAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKKyAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBCZWNhdXNlIG9mIHRoZSBob3Jpem9udGFsIG1pcnJvciBzdGVwLCB3ZSBjYW4ndCBwcm9jZXNzIHBhcnRpYWwgaU1DVXMKKyAgICogYXQgdGhlIChvdXRwdXQpIHJpZ2h0IGVkZ2UgcHJvcGVybHkuICBUaGV5IGp1c3QgZ2V0IHRyYW5zcG9zZWQgYW5kCisgICAqIG5vdCBtaXJyb3JlZC4KKyAgICovCisgIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKwkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKKyAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKKwlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKwkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7CisJICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKKwkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7CisJICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7CisJICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XVtkc3RfYmxrX3kgKyBvZmZzZXRfeV07CisJICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CisJICAgICAgLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCisJICAgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldCisJCVtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkJaSsrOworCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOworCSAgICAgIH0KKwkgICAgfSBlbHNlIHsKKwkgICAgICAvKiBFZGdlIGJsb2NrcyBhcmUgdHJhbnNwb3NlZCBidXQgbm90IG1pcnJvcmVkLiAqLworCSAgICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07CisJICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19yb3RfMjcwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogMjcwIGRlZ3JlZSByb3RhdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgKiAgIDEuIEhvcml6b250YWwgbWlycm9yaW5nOworICogICAyLiBUcmFuc3Bvc2luZyB0aGUgaW1hZ2UuCisgKiBUaGVzZSB0d28gc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KKyAqLworeworICBKRElNRU5TSU9OIE1DVV9yb3dzLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOworICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIEJlY2F1c2Ugb2YgdGhlIGhvcml6b250YWwgbWlycm9yIHN0ZXAsIHdlIGNhbid0IHByb2Nlc3MgcGFydGlhbCBpTUNVcworICAgKiBhdCB0aGUgKG91dHB1dCkgYm90dG9tIGVkZ2UgcHJvcGVybHkuICBUaGV5IGp1c3QgZ2V0IHRyYW5zcG9zZWQgYW5kCisgICAqIG5vdCBtaXJyb3JlZC4KKyAgICovCisgIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgeworCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKKwkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAorCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKwkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKKwkgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7CisJICAgICAgLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCisJICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdCisJCVtjb21wX2hlaWdodCAtIGRzdF9ibGtfeSAtIG9mZnNldF95IC0gMV07CisJICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7CisJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICBqKys7CisJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07CisJCX0KKwkgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgLyogRWRnZSBibG9ja3MgYXJlIHRyYW5zcG9zZWQgYnV0IG5vdCBtaXJyb3JlZC4gKi8KKwkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fcm90XzE4MCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKKy8qIDE4MCBkZWdyZWUgcm90YXRpb24gaXMgZXF1aXZhbGVudCB0bworICogICAxLiBWZXJ0aWNhbCBtaXJyb3Jpbmc7CisgKiAgIDIuIEhvcml6b250YWwgbWlycm9yaW5nLgorICogVGhlc2UgdHdvIHN0ZXBzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBwcm9jZXNzaW5nIHJvdXRpbmUuCisgKi8KK3sKKyAgSkRJTUVOU0lPTiBNQ1VfY29scywgTUNVX3Jvd3MsIGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0LCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeTsKKyAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKKyAgSkJMT0NLUk9XIHNyY19yb3dfcHRyLCBkc3Rfcm93X3B0cjsKKyAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisJIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7CisgICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkvKiBSb3cgaXMgd2l0aGluIHRoZSB2ZXJ0aWNhbGx5IG1pcnJvcmFibGUgYXJlYS4gKi8KKwlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAorCSAgIGNvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKyAgICAgIH0gZWxzZSB7CisJLyogQm90dG9tLWVkZ2Ugcm93cyBhcmUgb25seSBtaXJyb3JlZCBob3Jpem9udGFsbHkuICovCisJc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgICB9CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7CisJICAvKiBSb3cgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCisJICBkc3Rfcm93X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldOworCSAgc3JjX3Jvd19wdHIgPSBzcmNfYnVmZmVyW2NvbXBwdHItPnZfc2FtcF9mYWN0b3IgLSBvZmZzZXRfeSAtIDFdOworCSAgLyogUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgY2FuIGJlIG1pcnJvcmVkIGJvdGggd2F5cy4gKi8KKwkgIGZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcF93aWR0aDsgZHN0X2Jsa194KyspIHsKKwkgICAgZHN0X3B0ciA9IGRzdF9yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gMV07CisJICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKKwkgICAgICAvKiBGb3IgZXZlbiByb3csIG5lZ2F0ZSBldmVyeSBvZGQgY29sdW1uLiAqLworCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqICs9IDIpIHsKKwkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7CisJCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CisJICAgICAgfQorCSAgICAgIC8qIEZvciBvZGQgcm93LCBuZWdhdGUgZXZlcnkgZXZlbiBjb2x1bW4uICovCisJICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGogKz0gMikgeworCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOworCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwkgIC8qIEFueSByZW1haW5pbmcgcmlnaHQtZWRnZSBibG9ja3MgYXJlIG9ubHkgbWlycm9yZWQgdmVydGljYWxseS4gKi8KKwkgIGZvciAoOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7CisJICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkgKz0gMikgeworCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CisJICAgIH0KKwkgIH0KKwl9IGVsc2UgeworCSAgLyogUmVtYWluaW5nIHJvd3MgYXJlIGp1c3QgbWlycm9yZWQgaG9yaXpvbnRhbGx5LiAqLworCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKKwkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeV07CisJICAvKiBQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBjYW4gYmUgbWlycm9yZWQuICovCisJICBmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBfd2lkdGg7IGRzdF9ibGtfeCsrKSB7CisJICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIDFdOworCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkgKz0gMikgeworCSAgICAgICpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCSAgICAgICpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CisJICAgIH0KKwkgIH0KKwkgIC8qIEFueSByZW1haW5pbmcgcmlnaHQtZWRnZSBibG9ja3MgYXJlIG9ubHkgY29waWVkLiAqLworCSAgZm9yICg7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsgZHN0X2Jsa194KyspIHsKKwkgICAgZHN0X3B0ciA9IGRzdF9yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykKKwkgICAgICAqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX3RyYW5zdmVyc2UgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgICAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCisvKiBUcmFuc3ZlcnNlIHRyYW5zcG9zZSBpcyBlcXVpdmFsZW50IHRvCisgKiAgIDEuIDE4MCBkZWdyZWUgcm90YXRpb247CisgKiAgIDIuIFRyYW5zcG9zaXRpb247CisgKiBvcgorICogICAxLiBIb3Jpem9udGFsIG1pcnJvcmluZzsKKyAqICAgMi4gVHJhbnNwb3NpdGlvbjsKKyAqICAgMy4gSG9yaXpvbnRhbCBtaXJyb3JpbmcuCisgKiBUaGVzZSBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgorICovCit7CisgIEpESU1FTlNJT04gTUNVX2NvbHMsIE1DVV9yb3dzLCBjb21wX3dpZHRoLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOworICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKwkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKKyAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKKwlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKwkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7CisJICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKKwkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7CisJICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7CisJICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XQorCQlbY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSBvZmZzZXRfeSAtIDFdOworCSAgICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CisJCS8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLworCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV0KKwkJICBbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07CisJCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKKwkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7CisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgICAgaisrOworCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgfQorCQkgIGkrKzsKKwkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7CisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICAgIGorKzsKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgfQorCQl9CisJICAgICAgfSBlbHNlIHsKKwkJLyogUmlnaHQtZWRnZSBibG9ja3MgYXJlIG1pcnJvcmVkIGluIHkgb25seSAqLworCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOworCQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CisJCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgeworCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICAgIGorKzsKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgIH0KKwkJfQorCSAgICAgIH0KKwkgICAgfSBlbHNlIHsKKwkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOworCSAgICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CisJCS8qIEJvdHRvbS1lZGdlIGJsb2NrcyBhcmUgbWlycm9yZWQgaW4geCBvbmx5ICovCisJCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQorCQkgIFtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKKwkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgeworCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgIGkrKzsKKwkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07CisJCX0KKwkgICAgICB9IGVsc2UgeworCQkvKiBBdCBsb3dlciByaWdodCBjb3JuZXIsIGp1c3QgdHJhbnNwb3NlLCBubyBtaXJyb3JpbmcgKi8KKwkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKKwkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyogUmVxdWVzdCBhbnkgcmVxdWlyZWQgd29ya3NwYWNlLgorICoKKyAqIFdlIGFsbG9jYXRlIHRoZSB3b3Jrc3BhY2UgdmlydHVhbCBhcnJheXMgZnJvbSB0aGUgc291cmNlIGRlY29tcHJlc3Npb24KKyAqIG9iamVjdCwgc28gdGhhdCBhbGwgdGhlIGFycmF5cyAoYm90aCB0aGUgb3JpZ2luYWwgZGF0YSBhbmQgdGhlIHdvcmtzcGFjZSkKKyAqIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoaWxlIG1ha2luZyBtZW1vcnkgbWFuYWdlbWVudCBkZWNpc2lvbnMuCisgKiBIZW5jZSwgdGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIgKHdoaWNoIHJlYWRzCisgKiB0aGUgaW1hZ2UgZGltZW5zaW9ucykgYW5kIGJlZm9yZSBqcGVnX3JlYWRfY29lZmZpY2llbnRzICh3aGljaCByZWFsaXplcworICogdGhlIHNvdXJjZSdzIHZpcnR1YWwgYXJyYXlzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2p0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKKwkJCSAgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pCit7CisgIGp2aXJ0X2JhcnJheV9wdHIgKmNvZWZfYXJyYXlzID0gTlVMTDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW50IGNpOworCisgIGlmIChpbmZvLT5mb3JjZV9ncmF5c2NhbGUgJiYKKyAgICAgIHNyY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyICYmCisgICAgICBzcmNpbmZvLT5udW1fY29tcG9uZW50cyA9PSAzKSB7CisgICAgLyogV2UnbGwgb25seSBwcm9jZXNzIHRoZSBmaXJzdCBjb21wb25lbnQgKi8KKyAgICBpbmZvLT5udW1fY29tcG9uZW50cyA9IDE7CisgIH0gZWxzZSB7CisgICAgLyogUHJvY2VzcyBhbGwgdGhlIGNvbXBvbmVudHMgKi8KKyAgICBpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOworICB9CisKKyAgc3dpdGNoIChpbmZvLT50cmFuc2Zvcm0pIHsKKyAgY2FzZSBKWEZPUk1fTk9ORToKKyAgY2FzZSBKWEZPUk1fRkxJUF9IOgorICAgIC8qIERvbid0IG5lZWQgYSB3b3Jrc3BhY2UgYXJyYXkgKi8KKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fRkxJUF9WOgorICBjYXNlIEpYRk9STV9ST1RfMTgwOgorICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgc2FtZSBkaW1lbnNpb25zIGFzIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgYXJyYXlzIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSwKKyAgICAgKiBzbyB0aGF0IHRyYW5zZm9ybSByb3V0aW5lcyBuZWVkIG5vdCB3b3JyeSBhYm91dCBtaXNzaW5nIGVkZ2UgYmxvY2tzLgorICAgICAqLworICAgIGNvZWZfYXJyYXlzID0gKGp2aXJ0X2JhcnJheV9wdHIgKikKKyAgICAgICgqc3JjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLAorCVNJWkVPRihqdmlydF9iYXJyYXlfcHRyKSAqIGluZm8tPm51bV9jb21wb25lbnRzKTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgY29tcHB0ciA9IHNyY2luZm8tPmNvbXBfaW5mbyArIGNpOworICAgICAgY29lZl9hcnJheXNbY2ldID0gKCpzcmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKKyAgY2FzZSBKWEZPUk1fVFJBTlNWRVJTRToKKyAgY2FzZSBKWEZPUk1fUk9UXzkwOgorICBjYXNlIEpYRk9STV9ST1RfMjcwOgorICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgdHJhbnNwb3NlZCBkaW1lbnNpb25zLgorICAgICAqIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBhcnJheXMgcGFkZGVkIG91dCB0byB0aGUgbmV4dCBpTUNVIGJvdW5kYXJ5LAorICAgICAqIHNvIHRoYXQgdHJhbnNmb3JtIHJvdXRpbmVzIG5lZWQgbm90IHdvcnJ5IGFib3V0IG1pc3NpbmcgZWRnZSBibG9ja3MuCisgICAgICovCisgICAgY29lZl9hcnJheXMgPSAoanZpcnRfYmFycmF5X3B0ciAqKQorICAgICAgKCpzcmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsCisJU0laRU9GKGp2aXJ0X2JhcnJheV9wdHIpICogaW5mby0+bnVtX2NvbXBvbmVudHMpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gc3JjaW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgICBjb2VmX2FycmF5c1tjaV0gPSAoKnNyY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXMgPSBjb2VmX2FycmF5czsKK30KKworCisvKiBUcmFuc3Bvc2UgZGVzdGluYXRpb24gaW1hZ2UgcGFyYW1ldGVycyAqLworCitMT0NBTCh2b2lkKQordHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMgKGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCit7CisgIGludCB0YmxubywgaSwgaiwgY2ksIGl0ZW1wOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKUVVBTlRfVEJMICpxdGJscHRyOworICBKRElNRU5TSU9OIGR0ZW1wOworICBVSU5UMTYgcXRlbXA7CisKKyAgLyogVHJhbnNwb3NlIGJhc2ljIGltYWdlIGRpbWVuc2lvbnMgKi8KKyAgZHRlbXAgPSBkc3RpbmZvLT5pbWFnZV93aWR0aDsKKyAgZHN0aW5mby0+aW1hZ2Vfd2lkdGggPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIGRzdGluZm8tPmltYWdlX2hlaWdodCA9IGR0ZW1wOworCisgIC8qIFRyYW5zcG9zZSBzYW1wbGluZyBmYWN0b3JzICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGl0ZW1wID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID0gaXRlbXA7CisgIH0KKworICAvKiBUcmFuc3Bvc2UgcXVhbnRpemF0aW9uIHRhYmxlcyAqLworICBmb3IgKHRibG5vID0gMDsgdGJsbm8gPCBOVU1fUVVBTlRfVEJMUzsgdGJsbm8rKykgeworICAgIHF0YmxwdHIgPSBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107CisgICAgaWYgKHF0YmxwdHIgIT0gTlVMTCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgeworCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkgIHF0ZW1wID0gcXRibHB0ci0+cXVhbnR2YWxbaSpEQ1RTSVpFK2pdOworCSAgcXRibHB0ci0+cXVhbnR2YWxbaSpEQ1RTSVpFK2pdID0gcXRibHB0ci0+cXVhbnR2YWxbaipEQ1RTSVpFK2ldOworCSAgcXRibHB0ci0+cXVhbnR2YWxbaipEQ1RTSVpFK2ldID0gcXRlbXA7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qIFRyaW0gb2ZmIGFueSBwYXJ0aWFsIGlNQ1VzIG9uIHRoZSBpbmRpY2F0ZWQgZGVzdGluYXRpb24gZWRnZSAqLworCitMT0NBTCh2b2lkKQordHJpbV9yaWdodF9lZGdlIChqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQoreworICBpbnQgY2ksIG1heF9oX3NhbXBfZmFjdG9yOworICBKRElNRU5TSU9OIE1DVV9jb2xzOworCisgIC8qIFdlIGhhdmUgdG8gY29tcHV0ZSBtYXhfaF9zYW1wX2ZhY3RvciBvdXJzZWx2ZXMsCisgICAqIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gc2V0IHlldCBpbiB0aGUgZGVzdGluYXRpb24KKyAgICogKGFuZCB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc291cmNlJ3MgdmFsdWUpLgorICAgKi8KKyAgbWF4X2hfc2FtcF9mYWN0b3IgPSAxOworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGludCBoX3NhbXBfZmFjdG9yID0gZHN0aW5mby0+Y29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yOworICAgIG1heF9oX3NhbXBfZmFjdG9yID0gTUFYKG1heF9oX3NhbXBfZmFjdG9yLCBoX3NhbXBfZmFjdG9yKTsKKyAgfQorICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKG1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIGlmIChNQ1VfY29scyA+IDApCQkvKiBjYW4ndCB0cmltIHRvIDAgcGl4ZWxzICovCisgICAgZHN0aW5mby0+aW1hZ2Vfd2lkdGggPSBNQ1VfY29scyAqIChtYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworfQorCitMT0NBTCh2b2lkKQordHJpbV9ib3R0b21fZWRnZSAoal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgaW50IGNpLCBtYXhfdl9zYW1wX2ZhY3RvcjsKKyAgSkRJTUVOU0lPTiBNQ1Vfcm93czsKKworICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgbWF4X3Zfc2FtcF9mYWN0b3Igb3Vyc2VsdmVzLAorICAgKiBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHNldCB5ZXQgaW4gdGhlIGRlc3RpbmF0aW9uCisgICAqIChhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHNvdXJjZSdzIHZhbHVlKS4KKyAgICovCisgIG1heF92X3NhbXBfZmFjdG9yID0gMTsKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBpbnQgdl9zYW1wX2ZhY3RvciA9IGRzdGluZm8tPmNvbXBfaW5mb1tjaV0udl9zYW1wX2ZhY3RvcjsKKyAgICBtYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChtYXhfdl9zYW1wX2ZhY3Rvciwgdl9zYW1wX2ZhY3Rvcik7CisgIH0KKyAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAobWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgaWYgKE1DVV9yb3dzID4gMCkJCS8qIGNhbid0IHRyaW0gdG8gMCBwaXhlbHMgKi8KKyAgICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBNQ1Vfcm93cyAqIChtYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworfQorCisKKy8qIEFkanVzdCBvdXRwdXQgaW1hZ2UgcGFyYW1ldGVycyBhcyBuZWVkZWQuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygpCisgKiBhbmQgYmVmb3JlIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2V0IG9mIHZpcnR1YWwgY29lZmZpY2llbnQgYXJyYXlzIHRvIGJlIHdyaXR0ZW4KKyAqIChlaXRoZXIgdGhlIG9uZXMgYWxsb2NhdGVkIGJ5IGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UsIG9yIHRoZQorICogb3JpZ2luYWwgc291cmNlIGRhdGEgYXJyYXlzKS4gIFRoZSBjYWxsZXIgd2lsbCBuZWVkIHRvIHBhc3MgdGhpcyB2YWx1ZQorICogdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKyAqLworCitHTE9CQUwoanZpcnRfYmFycmF5X3B0ciAqKQoranRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycyAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAorCQkJICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkJCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkJCSAgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pCit7CisgIC8qIElmIGZvcmNlLXRvLWdyYXlzY2FsZSBpcyByZXF1ZXN0ZWQsIGFkanVzdCBkZXN0aW5hdGlvbiBwYXJhbWV0ZXJzICovCisgIGlmIChpbmZvLT5mb3JjZV9ncmF5c2NhbGUpIHsKKyAgICAvKiBXZSB1c2UganBlZ19zZXRfY29sb3JzcGFjZSB0byBtYWtlIHN1cmUgc3Vic2lkaWFyeSBzZXR0aW5ncyBnZXQgZml4ZWQKKyAgICAgKiBwcm9wZXJseS4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIHRhcmdldCBoX3NhbXBfZmFjdG9yICYgdl9zYW1wX2ZhY3RvcgorICAgICAqIHdpbGwgZ2V0IHNldCB0byAxLCB3aGljaCB0eXBpY2FsbHkgd29uJ3QgbWF0Y2ggdGhlIHNvdXJjZS4KKyAgICAgKiBJbiBmYWN0IHdlIGRvIHRoaXMgZXZlbiBpZiB0aGUgc291cmNlIGlzIGFscmVhZHkgZ3JheXNjYWxlOyB0aGF0CisgICAgICogcHJvdmlkZXMgYW4gZWFzeSB3YXkgb2YgY29lcmNpbmcgYSBncmF5c2NhbGUgSlBFRyB3aXRoIGZ1bm55IHNhbXBsaW5nCisgICAgICogZmFjdG9ycyB0byB0aGUgY3VzdG9tYXJ5IDEsMS4gIChTb21lIGRlY29kZXJzIGZhaWwgb24gb3RoZXIgZmFjdG9ycy4pCisgICAgICovCisgICAgaWYgKChkc3RpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDciAmJgorCSBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9PSAzKSB8fAorCShkc3RpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUgJiYKKwkgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMSkpIHsKKyAgICAgIC8qIFdlIGhhdmUgdG8gcHJlc2VydmUgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIuICovCisgICAgICBpbnQgc3ZfcXVhbnRfdGJsX25vID0gZHN0aW5mby0+Y29tcF9pbmZvWzBdLnF1YW50X3RibF9ubzsKKyAgICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoZHN0aW5mbywgSkNTX0dSQVlTQ0FMRSk7CisgICAgICBkc3RpbmZvLT5jb21wX2luZm9bMF0ucXVhbnRfdGJsX25vID0gc3ZfcXVhbnRfdGJsX25vOworICAgIH0gZWxzZSB7CisgICAgICAvKiBTb3JyeSwgY2FuJ3QgZG8gaXQgKi8KKyAgICAgIEVSUkVYSVQoZHN0aW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIH0KKyAgfQorCisgIC8qIENvcnJlY3QgdGhlIGRlc3RpbmF0aW9uJ3MgaW1hZ2UgZGltZW5zaW9ucyBldGMgaWYgbmVjZXNzYXJ5ICovCisgIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7CisgIGNhc2UgSlhGT1JNX05PTkU6CisgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9GTElQX0g6CisgICAgaWYgKGluZm8tPnRyaW0pCisgICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX0ZMSVBfVjoKKyAgICBpZiAoaW5mby0+dHJpbSkKKyAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKKyAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKKyAgICAvKiB0cmFuc3Bvc2UgZG9lcyBOT1QgaGF2ZSB0byB0cmltIGFueXRoaW5nICovCisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6CisgICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7CisgICAgaWYgKGluZm8tPnRyaW0pIHsKKyAgICAgIHRyaW1fcmlnaHRfZWRnZShkc3RpbmZvKTsKKyAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9ST1RfOTA6CisgICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7CisgICAgaWYgKGluZm8tPnRyaW0pCisgICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF8xODA6CisgICAgaWYgKGluZm8tPnRyaW0pIHsKKyAgICAgIHRyaW1fcmlnaHRfZWRnZShkc3RpbmZvKTsKKyAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9ST1RfMjcwOgorICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOworICAgIGlmIChpbmZvLT50cmltKQorICAgICAgdHJpbV9ib3R0b21fZWRnZShkc3RpbmZvKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IGRhdGEgc2V0ICovCisgIGlmIChpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXMgIT0gTlVMTCkKKyAgICByZXR1cm4gaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzOworICByZXR1cm4gc3JjX2NvZWZfYXJyYXlzOworfQorCisKKy8qIEV4ZWN1dGUgdGhlIGFjdHVhbCB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55LgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cywgYmVjYXVzZSBpdCBkZXBlbmRzCisgKiBvbiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyB0byBoYXZlIGNvbXB1dGVkIHN1YnNpZGlhcnkgdmFsdWVzIHN1Y2ggYXMKKyAqIHRoZSBwZXItY29tcG9uZW50IHdpZHRoIGFuZCBoZWlnaHQgZmllbGRzIGluIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgKgorICogTm90ZSB0aGF0IHNvbWUgdHJhbnNmb3JtYXRpb25zIHdpbGwgbW9kaWZ5IHRoZSBzb3VyY2UgZGF0YSBhcnJheXMhCisgKi8KKworR0xPQkFMKHZvaWQpCitqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24gKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKKwkJCQkgICBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCQkJCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkJCQkgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQoreworICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMgPSBpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXM7CisKKyAgc3dpdGNoIChpbmZvLT50cmFuc2Zvcm0pIHsKKyAgY2FzZSBKWEZPUk1fTk9ORToKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fRkxJUF9IOgorICAgIGRvX2ZsaXBfaChzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMpOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9GTElQX1Y6CisgICAgZG9fZmxpcF92KHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fVFJBTlNQT1NFOgorICAgIGRvX3RyYW5zcG9zZShzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6CisgICAgZG9fdHJhbnN2ZXJzZShzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF85MDoKKyAgICBkb19yb3RfOTAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9ST1RfMTgwOgorICAgIGRvX3JvdF8xODAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9ST1RfMjcwOgorICAgIGRvX3JvdF8yNzAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGJyZWFrOworICB9Cit9CisKKyNlbmRpZiAvKiBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLworCisKKy8qIFNldHVwIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHNhdmUgZGVzaXJlZCBtYXJrZXJzIGluIG1lbW9yeS4KKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGpwZWdfcmVhZF9oZWFkZXIoKSB0byBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pjb3B5X21hcmtlcnNfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgSkNPUFlfT1BUSU9OIG9wdGlvbikKK3sKKyNpZmRlZiBTQVZFX01BUktFUlNfU1VQUE9SVEVECisgIGludCBtOworCisgIC8qIFNhdmUgY29tbWVudHMgZXhjZXB0IHVuZGVyIE5PTkUgb3B0aW9uICovCisgIGlmIChvcHRpb24gIT0gSkNPUFlPUFRfTk9ORSkgeworICAgIGpwZWdfc2F2ZV9tYXJrZXJzKHNyY2luZm8sIEpQRUdfQ09NLCAweEZGRkYpOworICB9CisgIC8qIFNhdmUgYWxsIHR5cGVzIG9mIEFQUG4gbWFya2VycyBpZmYgQUxMIG9wdGlvbiAqLworICBpZiAob3B0aW9uID09IEpDT1BZT1BUX0FMTCkgeworICAgIGZvciAobSA9IDA7IG0gPCAxNjsgbSsrKQorICAgICAganBlZ19zYXZlX21hcmtlcnMoc3JjaW5mbywgSlBFR19BUFAwICsgbSwgMHhGRkZGKTsKKyAgfQorI2VuZGlmIC8qIFNBVkVfTUFSS0VSU19TVVBQT1JURUQgKi8KK30KKworLyogQ29weSBtYXJrZXJzIHNhdmVkIGluIHRoZSBnaXZlbiBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQganVzdCBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgb3IKKyAqIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCisgKiBOb3RlIHRoYXQgdGhvc2Ugcm91dGluZXMgd2lsbCBoYXZlIHdyaXR0ZW4gdGhlIFNPSSwgYW5kIGFsc28gdGhlCisgKiBKRklGIEFQUDAgb3IgQWRvYmUgQVBQMTQgbWFya2VycyBpZiBzZWxlY3RlZC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pjb3B5X21hcmtlcnNfZXhlY3V0ZSAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCQkgICAgICAgSkNPUFlfT1BUSU9OIG9wdGlvbikKK3sKKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcjsKKworICAvKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBleGFtaW5lIHRoZQorICAgKiBvcHRpb24gZmxhZyBoZXJlOyB3ZSBqdXN0IGNvcHkgZXZlcnl0aGluZyB0aGF0IGdvdCBzYXZlZC4KKyAgICogQnV0IHRvIGF2b2lkIGNvbmZ1c2lvbiwgd2UgZG8gbm90IG91dHB1dCBKRklGIGFuZCBBZG9iZSBBUFAxNCBtYXJrZXJzCisgICAqIGlmIHRoZSBlbmNvZGVyIGxpYnJhcnkgYWxyZWFkeSB3cm90ZSBvbmUuCisgICAqLworICBmb3IgKG1hcmtlciA9IHNyY2luZm8tPm1hcmtlcl9saXN0OyBtYXJrZXIgIT0gTlVMTDsgbWFya2VyID0gbWFya2VyLT5uZXh0KSB7CisgICAgaWYgKGRzdGluZm8tPndyaXRlX0pGSUZfaGVhZGVyICYmCisJbWFya2VyLT5tYXJrZXIgPT0gSlBFR19BUFAwICYmCisJbWFya2VyLT5kYXRhX2xlbmd0aCA+PSA1ICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVswXSkgPT0gMHg0QSAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMV0pID09IDB4NDYgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzJdKSA9PSAweDQ5ICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVszXSkgPT0gMHg0NiAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbNF0pID09IDApCisgICAgICBjb250aW51ZTsJCQkvKiByZWplY3QgZHVwbGljYXRlIEpGSUYgKi8KKyAgICBpZiAoZHN0aW5mby0+d3JpdGVfQWRvYmVfbWFya2VyICYmCisJbWFya2VyLT5tYXJrZXIgPT0gSlBFR19BUFAwKzE0ICYmCisJbWFya2VyLT5kYXRhX2xlbmd0aCA+PSA1ICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVswXSkgPT0gMHg0MSAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMV0pID09IDB4NjQgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzJdKSA9PSAweDZGICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVszXSkgPT0gMHg2MiAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbNF0pID09IDB4NjUpCisgICAgICBjb250aW51ZTsJCQkvKiByZWplY3QgZHVwbGljYXRlIEFkb2JlICovCisjaWZkZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyAgICAvKiBXZSBjb3VsZCB1c2UganBlZ193cml0ZV9tYXJrZXIgaWYgdGhlIGRhdGEgd2VyZW4ndCBGQVIuLi4gKi8KKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgIGpwZWdfd3JpdGVfbV9oZWFkZXIoZHN0aW5mbywgbWFya2VyLT5tYXJrZXIsIG1hcmtlci0+ZGF0YV9sZW5ndGgpOworICAgICAgZm9yIChpID0gMDsgaSA8IG1hcmtlci0+ZGF0YV9sZW5ndGg7IGkrKykKKwlqcGVnX3dyaXRlX21fYnl0ZShkc3RpbmZvLCBtYXJrZXItPmRhdGFbaV0pOworICAgIH0KKyNlbHNlCisgICAganBlZ193cml0ZV9tYXJrZXIoZHN0aW5mbywgbWFya2VyLT5tYXJrZXIsCisJCSAgICAgIG1hcmtlci0+ZGF0YSwgbWFya2VyLT5kYXRhX2xlbmd0aCk7CisjZW5kaWYKKyAgfQorfQpkaWZmIC0tZ2l0IGEvanBlZy90cmFuc3VwcC5oIGIvanBlZy90cmFuc3VwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmQzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3RyYW5zdXBwLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiB0cmFuc3VwcC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgaW1hZ2UgdHJhbnNmb3JtYXRpb24gcm91dGluZXMgYW5kCisgKiBvdGhlciB1dGlsaXR5IGNvZGUgdXNlZCBieSB0aGUganBlZ3RyYW4gc2FtcGxlIGFwcGxpY2F0aW9uLiAgVGhlc2UgYXJlCisgKiBOT1QgcGFydCBvZiB0aGUgY29yZSBKUEVHIGxpYnJhcnkuICBCdXQgd2Uga2VlcCB0aGVzZSByb3V0aW5lcyBzZXBhcmF0ZQorICogZnJvbSBqcGVndHJhbi5jIHRvIGVhc2UgdGhlIHRhc2sgb2YgbWFpbnRhaW5pbmcganBlZ3RyYW4tbGlrZSBwcm9ncmFtcworICogdGhhdCBoYXZlIG90aGVyIHVzZXIgaW50ZXJmYWNlcy4KKyAqCisgKiBOT1RFOiBhbGwgdGhlIHJvdXRpbmVzIGRlY2xhcmVkIGhlcmUgaGF2ZSB2ZXJ5IHNwZWNpZmljIHJlcXVpcmVtZW50cworICogYWJvdXQgd2hlbiB0aGV5IGFyZSB0byBiZSBleGVjdXRlZCBkdXJpbmcgdGhlIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgdGhlCisgKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZpbGVzLiAgU2VlIHRoZSBjb21tZW50cyBpbiB0cmFuc3VwcC5jLCBvciBzZWUKKyAqIGpwZWd0cmFuLmMgZm9yIGFuIGV4YW1wbGUgb2YgY29ycmVjdCB1c2FnZS4KKyAqLworCisvKiBJZiB5b3UgaGFwcGVuIG5vdCB0byB3YW50IHRoZSBpbWFnZSB0cmFuc2Zvcm0gc3VwcG9ydCwgZGlzYWJsZSBpdCBoZXJlICovCisjaWZuZGVmIFRSQU5TRk9STVNfU1VQUE9SVEVECisjZGVmaW5lIFRSQU5TRk9STVNfU1VQUE9SVEVEIDEJCS8qIDAgZGlzYWJsZXMgdHJhbnNmb3JtIGNvZGUgKi8KKyNlbmRpZgorCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganRyYW5zZm9ybV9yZXF1ZXN0X3dvcmtzcGFjZQkJalRyUmVxdWVzdAorI2RlZmluZSBqdHJhbnNmb3JtX2FkanVzdF9wYXJhbWV0ZXJzCQlqVHJBZGp1c3QKKyNkZWZpbmUganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uCWpUckV4ZWMKKyNkZWZpbmUgamNvcHlfbWFya2Vyc19zZXR1cAkJCWpDTXJrU2V0dXAKKyNkZWZpbmUgamNvcHlfbWFya2Vyc19leGVjdXRlCQkJakNNcmtFeGVjCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisKKy8qCisgKiBDb2RlcyBmb3Igc3VwcG9ydGVkIHR5cGVzIG9mIGltYWdlIHRyYW5zZm9ybWF0aW9ucy4KKyAqLworCit0eXBlZGVmIGVudW0geworCUpYRk9STV9OT05FLAkJLyogbm8gdHJhbnNmb3JtYXRpb24gKi8KKwlKWEZPUk1fRkxJUF9ILAkJLyogaG9yaXpvbnRhbCBmbGlwICovCisJSlhGT1JNX0ZMSVBfViwJCS8qIHZlcnRpY2FsIGZsaXAgKi8KKwlKWEZPUk1fVFJBTlNQT1NFLAkvKiB0cmFuc3Bvc2UgYWNyb3NzIFVMLXRvLUxSIGF4aXMgKi8KKwlKWEZPUk1fVFJBTlNWRVJTRSwJLyogdHJhbnNwb3NlIGFjcm9zcyBVUi10by1MTCBheGlzICovCisJSlhGT1JNX1JPVF85MCwJCS8qIDkwLWRlZ3JlZSBjbG9ja3dpc2Ugcm90YXRpb24gKi8KKwlKWEZPUk1fUk9UXzE4MCwJCS8qIDE4MC1kZWdyZWUgcm90YXRpb24gKi8KKwlKWEZPUk1fUk9UXzI3MAkJLyogMjcwLWRlZ3JlZSBjbG9ja3dpc2UgKG9yIDkwIGNjdykgKi8KK30gSlhGT1JNX0NPREU7CisKKy8qCisgKiBBbHRob3VnaCByb3RhdGluZyBhbmQgZmxpcHBpbmcgZGF0YSBleHByZXNzZWQgYXMgRENUIGNvZWZmaWNpZW50cyBpcyBub3QKKyAqIGhhcmQsIHRoZXJlIGlzIGFuIGFzeW1tZXRyeSBpbiB0aGUgSlBFRyBmb3JtYXQgc3BlY2lmaWNhdGlvbiBmb3IgaW1hZ2VzCisgKiB3aG9zZSBkaW1lbnNpb25zIGFyZW4ndCBtdWx0aXBsZXMgb2YgdGhlIGlNQ1Ugc2l6ZS4gIFRoZSByaWdodCBhbmQgYm90dG9tCisgKiBpbWFnZSBlZGdlcyBhcmUgcGFkZGVkIG91dCB0byB0aGUgbmV4dCBpTUNVIGJvdW5kYXJ5IHdpdGgganVuayBkYXRhOyBidXQKKyAqIG5vIHBhZGRpbmcgaXMgcG9zc2libGUgYXQgdGhlIHRvcCBhbmQgbGVmdCBlZGdlcy4gIElmIHdlIHdlcmUgdG8gZmxpcAorICogdGhlIHdob2xlIGltYWdlIGluY2x1ZGluZyB0aGUgcGFkIGRhdGEsIHRoZW4gcGFkIGdhcmJhZ2Ugd291bGQgYmVjb21lCisgKiB2aXNpYmxlIGF0IHRoZSB0b3AgYW5kL29yIGxlZnQsIGFuZCByZWFsIHBpeGVscyB3b3VsZCBkaXNhcHBlYXIgaW50byB0aGUKKyAqIHBhZCBtYXJnaW5zIC0tLSBwZXJoYXBzIHBlcm1hbmVudGx5LCBzaW5jZSBlbmNvZGVycyAmIGRlY29kZXJzIG1heSBub3QKKyAqIGJvdGhlciB0byBwcmVzZXJ2ZSBEQ1QgYmxvY2tzIHRoYXQgYXBwZWFyIHRvIGJlIGNvbXBsZXRlbHkgb3V0c2lkZSB0aGUKKyAqIG5vbWluYWwgaW1hZ2UgYXJlYS4gIFNvLCB3ZSBoYXZlIHRvIGV4Y2x1ZGUgYW55IHBhcnRpYWwgaU1DVXMgZnJvbSB0aGUKKyAqIGJhc2ljIHRyYW5zZm9ybWF0aW9uLgorICoKKyAqIFRyYW5zcG9zZSBpcyB0aGUgb25seSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGNhbiBoYW5kbGUgcGFydGlhbCBpTUNVcyBhdCB0aGUKKyAqIHJpZ2h0IGFuZCBib3R0b20gZWRnZXMgY29tcGxldGVseSBjbGVhbmx5LiAgZmxpcF9oIGNhbiBmbGlwIHBhcnRpYWwgaU1DVXMKKyAqIGF0IHRoZSBib3R0b20sIGJ1dCBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVXMgYXQgdGhlIHJpZ2h0IGVkZ2UgdW50b3VjaGVkLgorICogU2ltaWxhcmx5IGZsaXBfdiBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVXMgYXQgdGhlIGJvdHRvbSBlZGdlIHVudG91Y2hlZC4KKyAqIFRoZSBvdGhlciB0cmFuc2Zvcm1zIGFyZSBkZWZpbmVkIGFzIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSBiYXNpYyB0cmFuc2Zvcm1zCisgKiBhbmQgcHJvY2VzcyBlZGdlIGJsb2NrcyBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyB0aGUgZXF1aXZhbGVuY2UuCisgKgorICogVGhlICJ0cmltIiBvcHRpb24gY2F1c2VzIHVudHJhbnNmb3JtYWJsZSBwYXJ0aWFsIGlNQ1VzIHRvIGJlIGRyb3BwZWQ7CisgKiB0aGlzIGlzIG5vdCBzdHJpY3RseSBsb3NzbGVzcywgYnV0IGl0IHVzdWFsbHkgZ2l2ZXMgdGhlIGJlc3QtbG9va2luZworICogcmVzdWx0IGZvciBvZGQtc2l6ZSBpbWFnZXMuICBOb3RlIHRoYXQgd2hlbiB0aGlzIG9wdGlvbiBpcyBhY3RpdmUsCisgKiB0aGUgZXhwZWN0ZWQgbWF0aGVtYXRpY2FsIGVxdWl2YWxlbmNlcyBiZXR3ZWVuIHRoZSB0cmFuc2Zvcm1zIG1heSBub3QgaG9sZC4KKyAqIChGb3IgZXhhbXBsZSwgLXJvdCAyNzAgLXRyaW0gdHJpbXMgb25seSB0aGUgYm90dG9tIGVkZ2UsIGJ1dCAtcm90IDkwIC10cmltCisgKiBmb2xsb3dlZCBieSAtcm90IDE4MCAtdHJpbSB0cmltcyBib3RoIGVkZ2VzLikKKyAqCisgKiBXZSBhbHNvIG9mZmVyIGEgImZvcmNlIHRvIGdyYXlzY2FsZSIgb3B0aW9uLCB3aGljaCBzaW1wbHkgZGlzY2FyZHMgdGhlCisgKiBjaHJvbWluYW5jZSBjaGFubmVscyBvZiBhIFlDYkNyIGltYWdlLiAgVGhpcyBpcyBsb3NzbGVzcyBpbiB0aGUgc2Vuc2UgdGhhdAorICogdGhlIGx1bWluYW5jZSBjaGFubmVsIGlzIHByZXNlcnZlZCBleGFjdGx5LiAgSXQncyBub3QgdGhlIHNhbWUga2luZCBvZgorICogdGhpbmcgYXMgdGhlIHJvdGF0ZS9mbGlwIHRyYW5zZm9ybWF0aW9ucywgYnV0IGl0J3MgY29udmVuaWVudCB0byBoYW5kbGUgaXQKKyAqIGFzIHBhcnQgb2YgdGhpcyBwYWNrYWdlLCBtYWlubHkgYmVjYXVzZSB0aGUgdHJhbnNmb3JtYXRpb24gcm91dGluZXMgaGF2ZSB0bworICogYmUgYXdhcmUgb2YgdGhlIG9wdGlvbiB0byBrbm93IGhvdyBtYW55IGNvbXBvbmVudHMgdG8gd29yayBvbi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIE9wdGlvbnM6IHNldCBieSBjYWxsZXIgKi8KKyAgSlhGT1JNX0NPREUgdHJhbnNmb3JtOwkvKiBpbWFnZSB0cmFuc2Zvcm0gb3BlcmF0b3IgKi8KKyAgYm9vbGVhbiB0cmltOwkJCS8qIGlmIFRSVUUsIHRyaW0gcGFydGlhbCBNQ1VzIGFzIG5lZWRlZCAqLworICBib29sZWFuIGZvcmNlX2dyYXlzY2FsZTsJLyogaWYgVFJVRSwgY29udmVydCBjb2xvciBpbWFnZSB0byBncmF5c2NhbGUgKi8KKworICAvKiBJbnRlcm5hbCB3b3Jrc3BhY2U6IGNhbGxlciBzaG91bGQgbm90IHRvdWNoIHRoZXNlICovCisgIGludCBudW1fY29tcG9uZW50czsJCS8qICMgb2YgY29tcG9uZW50cyBpbiB3b3Jrc3BhY2UgKi8KKyAganZpcnRfYmFycmF5X3B0ciAqIHdvcmtzcGFjZV9jb2VmX2FycmF5czsgLyogd29ya3NwYWNlIGZvciB0cmFuc2Zvcm1hdGlvbnMgKi8KK30ganBlZ190cmFuc2Zvcm1faW5mbzsKKworCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKworLyogUmVxdWVzdCBhbnkgcmVxdWlyZWQgd29ya3NwYWNlICovCitFWFRFUk4odm9pZCkganRyYW5zZm9ybV9yZXF1ZXN0X3dvcmtzcGFjZQorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKSk7CisvKiBBZGp1c3Qgb3V0cHV0IGltYWdlIHBhcmFtZXRlcnMgKi8KK0VYVEVSTihqdmlydF9iYXJyYXlfcHRyICopIGp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKKy8qIEV4ZWN1dGUgdGhlIGFjdHVhbCB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55ICovCitFWFRFUk4odm9pZCkganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKSk7CisKKyNlbmRpZiAvKiBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBTdXBwb3J0IGZvciBjb3B5aW5nIG9wdGlvbmFsIG1hcmtlcnMgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gZmlsZS4KKyAqLworCit0eXBlZGVmIGVudW0geworCUpDT1BZT1BUX05PTkUsCQkvKiBjb3B5IG5vIG9wdGlvbmFsIG1hcmtlcnMgKi8KKwlKQ09QWU9QVF9DT01NRU5UUywJLyogY29weSBvbmx5IGNvbW1lbnQgKENPTSkgbWFya2VycyAqLworCUpDT1BZT1BUX0FMTAkJLyogY29weSBhbGwgb3B0aW9uYWwgbWFya2VycyAqLworfSBKQ09QWV9PUFRJT047CisKKyNkZWZpbmUgSkNPUFlPUFRfREVGQVVMVCAgSkNPUFlPUFRfQ09NTUVOVFMJLyogcmVjb21tZW5kZWQgZGVmYXVsdCAqLworCisvKiBTZXR1cCBkZWNvbXByZXNzaW9uIG9iamVjdCB0byBzYXZlIGRlc2lyZWQgbWFya2VycyBpbiBtZW1vcnkgKi8KK0VYVEVSTih2b2lkKSBqY29weV9tYXJrZXJzX3NldHVwCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIEpDT1BZX09QVElPTiBvcHRpb24pKTsKKy8qIENvcHkgbWFya2VycyBzYXZlZCBpbiB0aGUgZ2l2ZW4gc291cmNlIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0ICovCitFWFRFUk4odm9pZCkgamNvcHlfbWFya2Vyc19leGVjdXRlCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgICBKQ09QWV9PUFRJT04gb3B0aW9uKSk7CmRpZmYgLS1naXQgYS9qcGVnL3VzYWdlLmRvYyBiL2pwZWcvdXNhZ2UuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDk3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3VzYWdlLmRvYwpAQCAtMCwwICsxLDU2MiBAQAorVVNBR0UgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZmlsZSBkZXNjcmliZXMgdXNhZ2Ugb2YgdGhlIEpQRUcgY29udmVyc2lvbiBwcm9ncmFtcyBjanBlZyBhbmQgZGpwZWcsCithcyB3ZWxsIGFzIHRoZSB1dGlsaXR5IHByb2dyYW1zIGpwZWd0cmFuLCByZGpwZ2NvbSBhbmQgd3JqcGdjb20uICAoU2VlCit0aGUgb3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSB3aXRoaW4KK3lvdXIgb3duIHByb2dyYW1zLikKKworSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSB5b3UgbWF5IHByZWZlciB0byByZWFkIHRoZSBVbml4LXN0eWxlIG1hbnVhbAorcGFnZXMgaW4gZmlsZXMgY2pwZWcuMSwgZGpwZWcuMSwganBlZ3RyYW4uMSwgcmRqcGdjb20uMSwgd3JqcGdjb20uMS4KKworCitJTlRST0RVQ1RJT04KKworVGhlc2UgcHJvZ3JhbXMgaW1wbGVtZW50IEpQRUcgaW1hZ2UgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uICBKUEVHCisocHJvbm91bmNlZCAiamF5LXBlZyIpIGlzIGEgc3RhbmRhcmRpemVkIGNvbXByZXNzaW9uIG1ldGhvZCBmb3IgZnVsbC1jb2xvcgorYW5kIGdyYXktc2NhbGUgaW1hZ2VzLiAgSlBFRyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgInJlYWwtd29ybGQiIHNjZW5lcywKK2ZvciBleGFtcGxlIHNjYW5uZWQgcGhvdG9ncmFwaHMuICBDYXJ0b29ucywgbGluZSBkcmF3aW5ncywgYW5kIG90aGVyCitub24tcmVhbGlzdGljIGltYWdlcyBhcmUgbm90IEpQRUcncyBzdHJvbmcgc3VpdDsgb24gdGhhdCBzb3J0IG9mIG1hdGVyaWFsCit5b3UgbWF5IGdldCBwb29yIGltYWdlIHF1YWxpdHkgYW5kL29yIGxpdHRsZSBjb21wcmVzc2lvbi4KKworSlBFRyBpcyBsb3NzeSwgbWVhbmluZyB0aGF0IHRoZSBvdXRwdXQgaW1hZ2UgaXMgbm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCB0bwordGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IHNob3VsZCBub3QgdXNlIEpQRUcgaWYgeW91IGhhdmUgdG8gaGF2ZSBpZGVudGljYWwKK291dHB1dCBiaXRzLiAgSG93ZXZlciwgb24gdHlwaWNhbCByZWFsLXdvcmxkIGltYWdlcywgdmVyeSBnb29kIGNvbXByZXNzaW9uCitsZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZCBhbWF6aW5nbHkgaGlnaCBjb21wcmVzc2lvbgoraXMgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhIGxvdy1xdWFsaXR5IGltYWdlLiAgWW91IGNhbiB0cmFkZSBvZmYgaW1hZ2UKK3F1YWxpdHkgYWdhaW5zdCBmaWxlIHNpemUgYnkgYWRqdXN0aW5nIHRoZSBjb21wcmVzc29yJ3MgInF1YWxpdHkiIHNldHRpbmcuCisKKworR0VORVJBTCBVU0FHRQorCitXZSBwcm92aWRlIHR3byBwcm9ncmFtcywgY2pwZWcgdG8gY29tcHJlc3MgYW4gaW1hZ2UgZmlsZSBpbnRvIEpQRUcgZm9ybWF0LAorYW5kIGRqcGVnIHRvIGRlY29tcHJlc3MgYSBKUEVHIGZpbGUgYmFjayBpbnRvIGEgY29udmVudGlvbmFsIGltYWdlIGZvcm1hdC4KKworT24gVW5peC1saWtlIHN5c3RlbXMsIHlvdSBzYXk6CisJY2pwZWcgW3N3aXRjaGVzXSBbaW1hZ2VmaWxlXSA+anBlZ2ZpbGUKK29yCisJZGpwZWcgW3N3aXRjaGVzXSBbanBlZ2ZpbGVdICA+aW1hZ2VmaWxlCitUaGUgcHJvZ3JhbXMgcmVhZCB0aGUgc3BlY2lmaWVkIGlucHV0IGZpbGUsIG9yIHN0YW5kYXJkIGlucHV0IGlmIG5vbmUgaXMKK25hbWVkLiAgVGhleSBhbHdheXMgd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0ICh3aXRoIHRyYWNlL2Vycm9yIG1lc3NhZ2VzIHRvCitzdGFuZGFyZCBlcnJvcikuICBUaGVzZSBjb252ZW50aW9ucyBhcmUgaGFuZHkgZm9yIHBpcGluZyBpbWFnZXMgYmV0d2VlbgorcHJvZ3JhbXMuCisKK09uIG1vc3Qgbm9uLVVuaXggc3lzdGVtcywgeW91IHNheToKKwljanBlZyBbc3dpdGNoZXNdIGltYWdlZmlsZSBqcGVnZmlsZQorb3IKKwlkanBlZyBbc3dpdGNoZXNdIGpwZWdmaWxlICBpbWFnZWZpbGUKK2kuZS4sIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGlzCitzdHlsZSBpcyBhIGxpdHRsZSBtb3JlIGZvb2xwcm9vZiwgYW5kIGl0IGxvc2VzIG5vIGZ1bmN0aW9uYWxpdHkgaWYgeW91IGRvbid0CitoYXZlIHBpcGVzLiAgKFlvdSBjYW4gZ2V0IHRoaXMgc3R5bGUgb24gVW5peCB0b28sIGlmIHlvdSBwcmVmZXIsIGJ5IGRlZmluaW5nCitUV09fRklMRV9DT01NQU5ETElORSB3aGVuIHlvdSBjb21waWxlIHRoZSBwcm9ncmFtczsgc2VlIGluc3RhbGwuZG9jLikKKworWW91IGNhbiBhbHNvIHNheToKKwljanBlZyBbc3dpdGNoZXNdIC1vdXRmaWxlIGpwZWdmaWxlICBpbWFnZWZpbGUKK29yCisJZGpwZWcgW3N3aXRjaGVzXSAtb3V0ZmlsZSBpbWFnZWZpbGUgIGpwZWdmaWxlCitUaGlzIHN5bnRheCB3b3JrcyBvbiBhbGwgc3lzdGVtcywgc28gaXQgaXMgdXNlZnVsIGZvciBzY3JpcHRzLgorCitUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBpbWFnZSBmaWxlIGZvcm1hdHMgYXJlOiBQUE0gKFBCTVBMVVMgY29sb3IgZm9ybWF0KSwKK1BHTSAoUEJNUExVUyBncmF5LXNjYWxlIGZvcm1hdCksIEJNUCwgVGFyZ2EsIGFuZCBSTEUgKFV0YWggUmFzdGVyIFRvb2xraXQKK2Zvcm1hdCkuICAoUkxFIGlzIHN1cHBvcnRlZCBvbmx5IGlmIHRoZSBVUlQgbGlicmFyeSBpcyBhdmFpbGFibGUuKQorY2pwZWcgcmVjb2duaXplcyB0aGUgaW5wdXQgaW1hZ2UgZm9ybWF0IGF1dG9tYXRpY2FsbHksIHdpdGggdGhlIGV4Y2VwdGlvbgorb2Ygc29tZSBUYXJnYS1mb3JtYXQgZmlsZXMuICBZb3UgaGF2ZSB0byB0ZWxsIGRqcGVnIHdoaWNoIGZvcm1hdCB0byBnZW5lcmF0ZS4KKworSlBFRyBmaWxlcyBhcmUgaW4gdGhlIGRlZmFjdG8gc3RhbmRhcmQgSkZJRiBmaWxlIGZvcm1hdC4gIFRoZXJlIGFyZSBvdGhlciwKK2xlc3Mgd2lkZWx5IHVzZWQgSlBFRy1iYXNlZCBmaWxlIGZvcm1hdHMsIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uCisKK0FsbCBzd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkOyBmb3IgZXhhbXBsZSwgLWdyYXlzY2FsZSBtYXkgYmUgd3JpdHRlbgorLWdyYXkgb3IgLWdyLiAgTW9zdCBvZiB0aGUgImJhc2ljIiBzd2l0Y2hlcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gYXMgbGl0dGxlIGFzCitvbmUgbGV0dGVyLiAgVXBwZXIgYW5kIGxvd2VyIGNhc2UgYXJlIGVxdWl2YWxlbnQgKC1CTVAgaXMgdGhlIHNhbWUgYXMgLWJtcCkuCitCcml0aXNoIHNwZWxsaW5ncyBhcmUgYWxzbyBhY2NlcHRlZCAoZS5nLiwgLWdyZXlzY2FsZSksIHRob3VnaCBmb3IgYnJldml0eQordGhlc2UgYXJlIG5vdCBtZW50aW9uZWQgYmVsb3cuCisKKworQ0pQRUcgREVUQUlMUworCitUaGUgYmFzaWMgY29tbWFuZCBsaW5lIHN3aXRjaGVzIGZvciBjanBlZyBhcmU6CisKKwktcXVhbGl0eSBOCVNjYWxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYWRqdXN0IGltYWdlIHF1YWxpdHkuCisJCQlRdWFsaXR5IGlzIDAgKHdvcnN0KSB0byAxMDAgKGJlc3QpOyBkZWZhdWx0IGlzIDc1LgorCQkJKFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKKworCS1ncmF5c2NhbGUJQ3JlYXRlIG1vbm9jaHJvbWUgSlBFRyBmaWxlIGZyb20gY29sb3IgaW5wdXQuCisJCQlCZSBzdXJlIHRvIHVzZSB0aGlzIHN3aXRjaCB3aGVuIGNvbXByZXNzaW5nIGEgZ3JheXNjYWxlCisJCQlCTVAgZmlsZSwgYmVjYXVzZSBjanBlZyBpc24ndCBicmlnaHQgZW5vdWdoIHRvIG5vdGljZQorCQkJd2hldGhlciBhIEJNUCBmaWxlIHVzZXMgb25seSBzaGFkZXMgb2YgZ3JheS4gIEJ5CisJCQlzYXlpbmcgLWdyYXlzY2FsZSwgeW91J2xsIGdldCBhIHNtYWxsZXIgSlBFRyBmaWxlIHRoYXQKKwkJCXRha2VzIGxlc3MgdGltZSB0byBwcm9jZXNzLgorCisJLW9wdGltaXplCVBlcmZvcm0gb3B0aW1pemF0aW9uIG9mIGVudHJvcHkgZW5jb2RpbmcgcGFyYW1ldGVycy4KKwkJCVdpdGhvdXQgdGhpcywgZGVmYXVsdCBlbmNvZGluZyBwYXJhbWV0ZXJzIGFyZSB1c2VkLgorCQkJLW9wdGltaXplIHVzdWFsbHkgbWFrZXMgdGhlIEpQRUcgZmlsZSBhIGxpdHRsZSBzbWFsbGVyLAorCQkJYnV0IGNqcGVnIHJ1bnMgc29tZXdoYXQgc2xvd2VyIGFuZCBuZWVkcyBtdWNoIG1vcmUKKwkJCW1lbW9yeS4gIEltYWdlIHF1YWxpdHkgYW5kIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gYXJlCisJCQl1bmFmZmVjdGVkIGJ5IC1vcHRpbWl6ZS4KKworCS1wcm9ncmVzc2l2ZQlDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIChzZWUgYmVsb3cpLgorCisJLXRhcmdhCQlJbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdC4gIFRhcmdhIGZpbGVzIHRoYXQgY29udGFpbgorCQkJYW4gImlkZW50aWZpY2F0aW9uIiBmaWVsZCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5CisJCQlyZWNvZ25pemVkIGJ5IGNqcGVnOyBmb3Igc3VjaCBmaWxlcyB5b3UgbXVzdCBzcGVjaWZ5CisJCQktdGFyZ2EgdG8gbWFrZSBjanBlZyB0cmVhdCB0aGUgaW5wdXQgYXMgVGFyZ2EgZm9ybWF0LgorCQkJRm9yIG1vc3QgVGFyZ2EgZmlsZXMsIHlvdSB3b24ndCBuZWVkIHRoaXMgc3dpdGNoLgorCitUaGUgLXF1YWxpdHkgc3dpdGNoIGxldHMgeW91IHRyYWRlIG9mZiBjb21wcmVzc2VkIGZpbGUgc2l6ZSBhZ2FpbnN0IHF1YWxpdHkgb2YKK3RoZSByZWNvbnN0cnVjdGVkIGltYWdlOiB0aGUgaGlnaGVyIHRoZSBxdWFsaXR5IHNldHRpbmcsIHRoZSBsYXJnZXIgdGhlIEpQRUcKK2ZpbGUsIGFuZCB0aGUgY2xvc2VyIHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB0byB0aGUgb3JpZ2luYWwgaW5wdXQuICBOb3JtYWxseQoreW91IHdhbnQgdG8gdXNlIHRoZSBsb3dlc3QgcXVhbGl0eSBzZXR0aW5nIChzbWFsbGVzdCBmaWxlKSB0aGF0IGRlY29tcHJlc3NlcworaW50byBzb21ldGhpbmcgdmlzdWFsbHkgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgb3JpZ2luYWwgaW1hZ2UuICBGb3IgdGhpcworcHVycG9zZSB0aGUgcXVhbGl0eSBzZXR0aW5nIHNob3VsZCBiZSBiZXR3ZWVuIDUwIGFuZCA5NTsgdGhlIGRlZmF1bHQgb2YgNzUgaXMKK29mdGVuIGFib3V0IHJpZ2h0LiAgSWYgeW91IHNlZSBkZWZlY3RzIGF0IC1xdWFsaXR5IDc1LCB0aGVuIGdvIHVwIDUgb3IgMTAKK2NvdW50cyBhdCBhIHRpbWUgdW50aWwgeW91IGFyZSBoYXBweSB3aXRoIHRoZSBvdXRwdXQgaW1hZ2UuICAoVGhlIG9wdGltYWwKK3NldHRpbmcgd2lsbCB2YXJ5IGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIuKQorCistcXVhbGl0eSAxMDAgd2lsbCBnZW5lcmF0ZSBhIHF1YW50aXphdGlvbiB0YWJsZSBvZiBhbGwgMSdzLCBtaW5pbWl6aW5nIGxvc3MKK2luIHRoZSBxdWFudGl6YXRpb24gc3RlcCAoYnV0IHRoZXJlIGlzIHN0aWxsIGluZm9ybWF0aW9uIGxvc3MgaW4gc3Vic2FtcGxpbmcsCithcyB3ZWxsIGFzIHJvdW5kb2ZmIGVycm9yKS4gIFRoaXMgc2V0dGluZyBpcyBtYWlubHkgb2YgaW50ZXJlc3QgZm9yCitleHBlcmltZW50YWwgcHVycG9zZXMuICBRdWFsaXR5IHZhbHVlcyBhYm92ZSBhYm91dCA5NSBhcmUgTk9UIHJlY29tbWVuZGVkIGZvcgorbm9ybWFsIHVzZTsgdGhlIGNvbXByZXNzZWQgZmlsZSBzaXplIGdvZXMgdXAgZHJhbWF0aWNhbGx5IGZvciBoYXJkbHkgYW55IGdhaW4KK2luIG91dHB1dCBpbWFnZSBxdWFsaXR5LgorCitJbiB0aGUgb3RoZXIgZGlyZWN0aW9uLCBxdWFsaXR5IHZhbHVlcyBiZWxvdyA1MCB3aWxsIHByb2R1Y2UgdmVyeSBzbWFsbCBmaWxlcworb2YgbG93IGltYWdlIHF1YWxpdHkuICBTZXR0aW5ncyBhcm91bmQgNSB0byAxMCBtaWdodCBiZSB1c2VmdWwgaW4gcHJlcGFyaW5nIGFuCitpbmRleCBvZiBhIGxhcmdlIGltYWdlIGxpYnJhcnksIGZvciBleGFtcGxlLiAgVHJ5IC1xdWFsaXR5IDIgKG9yIHNvKSBmb3Igc29tZQorYW11c2luZyBDdWJpc3QgZWZmZWN0cy4gIChOb3RlOiBxdWFsaXR5IHZhbHVlcyBiZWxvdyBhYm91dCAyNSBnZW5lcmF0ZSAyLWJ5dGUKK3F1YW50aXphdGlvbiB0YWJsZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG9wdGlvbmFsIGluIHRoZSBKUEVHIHN0YW5kYXJkLgorY2pwZWcgZW1pdHMgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB5b3UgZ2l2ZSBzdWNoIGEgcXVhbGl0eSB2YWx1ZSwgYmVjYXVzZSBzb21lCitvdGhlciBKUEVHIHByb2dyYW1zIG1heSBiZSB1bmFibGUgdG8gZGVjb2RlIHRoZSByZXN1bHRpbmcgZmlsZS4gIFVzZSAtYmFzZWxpbmUKK2lmIHlvdSBuZWVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGF0IGxvdyBxdWFsaXR5IHZhbHVlcy4pCisKK1RoZSAtcHJvZ3Jlc3NpdmUgc3dpdGNoIGNyZWF0ZXMgYSAicHJvZ3Jlc3NpdmUgSlBFRyIgZmlsZS4gIEluIHRoaXMgdHlwZSBvZgorSlBFRyBmaWxlLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gbXVsdGlwbGUgc2NhbnMgb2YgaW5jcmVhc2luZyBxdWFsaXR5LiAgSWYgdGhlCitmaWxlIGlzIGJlaW5nIHRyYW5zbWl0dGVkIG92ZXIgYSBzbG93IGNvbW11bmljYXRpb25zIGxpbmssIHRoZSBkZWNvZGVyIGNhbiB1c2UKK3RoZSBmaXJzdCBzY2FuIHRvIGRpc3BsYXkgYSBsb3ctcXVhbGl0eSBpbWFnZSB2ZXJ5IHF1aWNrbHksIGFuZCBjYW4gdGhlbgoraW1wcm92ZSB0aGUgZGlzcGxheSB3aXRoIGVhY2ggc3Vic2VxdWVudCBzY2FuLiAgVGhlIGZpbmFsIGltYWdlIGlzIGV4YWN0bHkKK2VxdWl2YWxlbnQgdG8gYSBzdGFuZGFyZCBKUEVHIGZpbGUgb2YgdGhlIHNhbWUgcXVhbGl0eSBzZXR0aW5nLCBhbmQgdGhlIHRvdGFsCitmaWxlIHNpemUgaXMgYWJvdXQgdGhlIHNhbWUgLS0tIG9mdGVuIGEgbGl0dGxlIHNtYWxsZXIuICBDQVVUSU9OOiBwcm9ncmVzc2l2ZQorSlBFRyBpcyBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZCwgc28gbWFueSBkZWNvZGVycyB3aWxsIGJlIHVuYWJsZSB0byB2aWV3IGEKK3Byb2dyZXNzaXZlIEpQRUcgZmlsZSBhdCBhbGwuCisKK1N3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKKworCS1kY3QgaW50CVVzZSBpbnRlZ2VyIERDVCBtZXRob2QgKGRlZmF1bHQpLgorCS1kY3QgZmFzdAlVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSkuCisJLWRjdCBmbG9hdAlVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZC4KKwkJCVRoZSBmbG9hdCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4KKwkJCXRoZSBpbnQgbWV0aG9kLCBidXQgaXMgbXVjaCBzbG93ZXIgdW5sZXNzIHlvdXIgbWFjaGluZQorCQkJaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28gbm90ZSB0aGF0CisJCQlyZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkKKwkJCWFjcm9zcyBtYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZQorCQkJdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLiAgVGhlIGZhc3QgaW50ZWdlciBtZXRob2QKKwkJCWlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCisKKwktcmVzdGFydCBOCUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5CisJCQlOIE1DVSBibG9ja3MgaWYgIkIiIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCisJCQktcmVzdGFydCAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gcmVzdGFydCBtYXJrZXJzLgorCisJLXNtb290aCBOCVNtb290aCB0aGUgaW5wdXQgaW1hZ2UgdG8gZWxpbWluYXRlIGRpdGhlcmluZyBub2lzZS4KKwkJCU4sIHJhbmdpbmcgZnJvbSAxIHRvIDEwMCwgaW5kaWNhdGVzIHRoZSBzdHJlbmd0aCBvZgorCQkJc21vb3RoaW5nLiAgMCAodGhlIGRlZmF1bHQpIG1lYW5zIG5vIHNtb290aGluZy4KKworCS1tYXhtZW1vcnkgTglTZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcKKwkJCWxhcmdlIGltYWdlcy4gIFZhbHVlIGlzIGluIHRob3VzYW5kcyBvZiBieXRlcywgb3IKKwkJCW1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgorCQkJRm9yIGV4YW1wbGUsIC1tYXggNG0gc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZQorCQkJc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgorCisJLXZlcmJvc2UJRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZSAtdidzIGdpdmUgbW9yZSBwcmludG91dC4KKwlvciAgLWRlYnVnCUFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgorCitUaGUgLXJlc3RhcnQgb3B0aW9uIGluc2VydHMgZXh0cmEgbWFya2VycyB0aGF0IGFsbG93IGEgSlBFRyBkZWNvZGVyIHRvCityZXN5bmNocm9uaXplIGFmdGVyIGEgdHJhbnNtaXNzaW9uIGVycm9yLiAgV2l0aG91dCByZXN0YXJ0IG1hcmtlcnMsIGFueSBkYW1hZ2UKK3RvIGEgY29tcHJlc3NlZCBmaWxlIHdpbGwgdXN1YWxseSBydWluIHRoZSBpbWFnZSBmcm9tIHRoZSBwb2ludCBvZiB0aGUgZXJyb3IKK3RvIHRoZSBlbmQgb2YgdGhlIGltYWdlOyB3aXRoIHJlc3RhcnQgbWFya2VycywgdGhlIGRhbWFnZSBpcyB1c3VhbGx5IGNvbmZpbmVkCit0byB0aGUgcG9ydGlvbiBvZiB0aGUgaW1hZ2UgdXAgdG8gdGhlIG5leHQgcmVzdGFydCBtYXJrZXIuICBPZiBjb3Vyc2UsIHRoZQorcmVzdGFydCBtYXJrZXJzIG9jY3VweSBleHRyYSBzcGFjZS4gIFdlIHJlY29tbWVuZCAtcmVzdGFydCAxIGZvciBpbWFnZXMgdGhhdAord2lsbCBiZSB0cmFuc21pdHRlZCBhY3Jvc3MgdW5yZWxpYWJsZSBuZXR3b3JrcyBzdWNoIGFzIFVzZW5ldC4KKworVGhlIC1zbW9vdGggb3B0aW9uIGZpbHRlcnMgdGhlIGlucHV0IHRvIGVsaW1pbmF0ZSBmaW5lLXNjYWxlIG5vaXNlLiAgVGhpcyBpcworb2Z0ZW4gdXNlZnVsIHdoZW4gY29udmVydGluZyBkaXRoZXJlZCBpbWFnZXMgdG8gSlBFRzogYSBtb2RlcmF0ZSBzbW9vdGhpbmcKK2ZhY3RvciBvZiAxMCB0byA1MCBnZXRzIHJpZCBvZiBkaXRoZXJpbmcgcGF0dGVybnMgaW4gdGhlIGlucHV0IGZpbGUsIHJlc3VsdGluZworaW4gYSBzbWFsbGVyIEpQRUcgZmlsZSBhbmQgYSBiZXR0ZXItbG9va2luZyBpbWFnZS4gIFRvbyBsYXJnZSBhIHNtb290aGluZworZmFjdG9yIHdpbGwgdmlzaWJseSBibHVyIHRoZSBpbWFnZSwgaG93ZXZlci4KKworU3dpdGNoZXMgZm9yIHdpemFyZHM6CisKKwktYmFzZWxpbmUJRm9yY2UgYmFzZWxpbmUtY29tcGF0aWJsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGJlCisJCQlnZW5lcmF0ZWQuICBUaGlzIGNsYW1wcyBxdWFudGl6YXRpb24gdmFsdWVzIHRvIDggYml0cworCQkJZXZlbiBhdCBsb3cgcXVhbGl0eSBzZXR0aW5ncy4gIChUaGlzIHN3aXRjaCBpcyBwb29ybHkKKwkJCW5hbWVkLCBzaW5jZSBpdCBkb2VzIG5vdCBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGlzCisJCQlhY3R1YWxseSBiYXNlbGluZSBKUEVHLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlCisJCQktYmFzZWxpbmUgYW5kIC1wcm9ncmVzc2l2ZSB0b2dldGhlci4pCisKKwktcXRhYmxlcyBmaWxlCVVzZSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkCisJCQl0ZXh0IGZpbGUuCisKKwktcXNsb3RzIE5bLC4uLl0gU2VsZWN0IHdoaWNoIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UgZm9yIGVhY2ggY29sb3IKKwkJCWNvbXBvbmVudC4KKworCS1zYW1wbGUgSHhWWywuLi5dICBTZXQgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudC4KKworCS1zY2FucyBmaWxlCVVzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCisKK1RoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcuICBJZiB5b3UKK2Rvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBET04nVCBVU0UgVEhFTS4gIFRoZXNlIHN3aXRjaGVzIGFyZSBkb2N1bWVudGVkCitmdXJ0aGVyIGluIHRoZSBmaWxlIHdpemFyZC5kb2MuCisKKworREpQRUcgREVUQUlMUworCitUaGUgYmFzaWMgY29tbWFuZCBsaW5lIHN3aXRjaGVzIGZvciBkanBlZyBhcmU6CisKKwktY29sb3JzIE4JUmVkdWNlIGltYWdlIHRvIGF0IG1vc3QgTiBjb2xvcnMuICBUaGlzIHJlZHVjZXMgdGhlCisJb3IgLXF1YW50aXplIE4JbnVtYmVyIG9mIGNvbG9ycyB1c2VkIGluIHRoZSBvdXRwdXQgaW1hZ2UsIHNvIHRoYXQgaXQKKwkJCWNhbiBiZSBkaXNwbGF5ZWQgb24gYSBjb2xvcm1hcHBlZCBkaXNwbGF5IG9yIHN0b3JlZCBpbgorCQkJYSBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdC4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQorCQkJYW4gOC1iaXQgZGlzcGxheSwgeW91J2QgbmVlZCB0byByZWR1Y2UgdG8gMjU2IG9yIGZld2VyCisJCQljb2xvcnMuICAoLWNvbG9ycyBpcyB0aGUgcmVjb21tZW5kZWQgbmFtZSwgLXF1YW50aXplCisJCQlpcyBwcm92aWRlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4pCisKKwktZmFzdAkJU2VsZWN0IHJlY29tbWVuZGVkIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgZmFzdCwgbG93CisJCQlxdWFsaXR5IG91dHB1dC4gIChUaGUgZGVmYXVsdCBvcHRpb25zIGFyZSBjaG9zZW4gZm9yCisJCQloaWdoZXN0IHF1YWxpdHkgb3V0cHV0LikgIEN1cnJlbnRseSwgdGhpcyBpcyBlcXVpdmFsZW50CisJCQl0byAiLWRjdCBmYXN0IC1ub3Ntb290aCAtb25lcGFzcyAtZGl0aGVyIG9yZGVyZWQiLgorCisJLWdyYXlzY2FsZQlGb3JjZSBncmF5LXNjYWxlIG91dHB1dCBldmVuIGlmIEpQRUcgZmlsZSBpcyBjb2xvci4KKwkJCVVzZWZ1bCBmb3Igdmlld2luZyBvbiBtb25vY2hyb21lIGRpc3BsYXlzOyBhbHNvLAorCQkJZGpwZWcgcnVucyBub3RpY2VhYmx5IGZhc3RlciBpbiB0aGlzIG1vZGUuCisKKwktc2NhbGUgTS9OCVNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5CisJCQl0aGUgc2NhbGUgZmFjdG9yIG11c3QgYmUgMS8xLCAxLzIsIDEvNCwgb3IgMS84LgorCQkJU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91cgorCQkJc2NyZWVuOyBhbHNvLCBkanBlZyBydW5zIG11Y2ggZmFzdGVyIHdoZW4gc2NhbGluZworCQkJZG93biB0aGUgb3V0cHV0LgorCisJLWJtcAkJU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChXaW5kb3dzIGZsYXZvcikuICA4LWJpdAorCQkJY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYgLWNvbG9ycyBvciAtZ3JheXNjYWxlCisJCQlpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsKKwkJCW90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCisKKwktZ2lmCQlTZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQuICBTaW5jZSBHSUYgZG9lcyBub3Qgc3VwcG9ydAorCQkJbW9yZSB0aGFuIDI1NiBjb2xvcnMsIC1jb2xvcnMgMjU2IGlzIGFzc3VtZWQgKHVubGVzcworCQkJeW91IHNwZWNpZnkgYSBzbWFsbGVyIG51bWJlciBvZiBjb2xvcnMpLiAgSWYgeW91CisJCQlzcGVjaWZ5IC1mYXN0LCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgY29sb3JzIGlzIDIxNi4KKworCS1vczIJCVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiAxLnggZmxhdm9yKS4gIDgtYml0CisJCQljb2xvcm1hcHBlZCBmb3JtYXQgaXMgZW1pdHRlZCBpZiAtY29sb3JzIG9yIC1ncmF5c2NhbGUKKwkJCWlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlOworCQkJb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvciBmb3JtYXQgaXMgZW1pdHRlZC4KKworCS1wbm0JCVNlbGVjdCBQQk1QTFVTIChQUE0vUEdNKSBvdXRwdXQgZm9ybWF0ICh0aGlzIGlzIHRoZQorCQkJZGVmYXVsdCBmb3JtYXQpLiAgUEdNIGlzIGVtaXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSBpcworCQkJZ3JheS1zY2FsZSBvciBpZiAtZ3JheXNjYWxlIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlCisJCQlQUE0gaXMgZW1pdHRlZC4KKworCS1ybGUJCVNlbGVjdCBSTEUgb3V0cHV0IGZvcm1hdC4gIChSZXF1aXJlcyBVUlQgbGlicmFyeS4pCisKKwktdGFyZ2EJCVNlbGVjdCBUYXJnYSBvdXRwdXQgZm9ybWF0LiAgR3JheS1zY2FsZSBmb3JtYXQgaXMKKwkJCWVtaXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlIG9yIGlmCisJCQktZ3JheXNjYWxlIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlLCBjb2xvcm1hcHBlZCBmb3JtYXQKKwkJCWlzIGVtaXR0ZWQgaWYgLWNvbG9ycyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgMjQtYml0CisJCQlmdWxsLWNvbG9yIGZvcm1hdCBpcyBlbWl0dGVkLgorCitTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6CisKKwktZGN0IGludAlVc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KKwktZGN0IGZhc3QJVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgorCS1kY3QgZmxvYXQJVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCisJCQlUaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuCisJCQl0aGUgaW50IG1ldGhvZCwgYnV0IGlzIG11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUKKwkJCWhhcyB2ZXJ5IGZhc3QgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuICBBbHNvIG5vdGUgdGhhdAorCQkJcmVzdWx0cyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSB2YXJ5IHNsaWdodGx5CisJCQlhY3Jvc3MgbWFjaGluZXMsIHdoaWxlIHRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUKKwkJCXRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4gIFRoZSBmYXN0IGludGVnZXIgbWV0aG9kCisJCQlpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgorCisJLWRpdGhlciBmcwlVc2UgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCisJLWRpdGhlciBvcmRlcmVkCVVzZSBvcmRlcmVkIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCisJLWRpdGhlciBub25lCURvIG5vdCB1c2UgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KKwkJCUJ5IGRlZmF1bHQsIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaXMgYXBwbGllZCB3aGVuCisJCQlxdWFudGl6aW5nIGNvbG9yczsgdGhpcyBpcyBzbG93IGJ1dCB1c3VhbGx5IHByb2R1Y2VzCisJCQl0aGUgYmVzdCByZXN1bHRzLiAgT3JkZXJlZCBkaXRoZXIgaXMgYSBjb21wcm9taXNlCisJCQliZXR3ZWVuIHNwZWVkIGFuZCBxdWFsaXR5OyBubyBkaXRoZXJpbmcgaXMgZmFzdCBidXQKKwkJCXVzdWFsbHkgbG9va3MgYXdmdWwuICBOb3RlIHRoYXQgdGhlc2Ugc3dpdGNoZXMgaGF2ZQorCQkJbm8gZWZmZWN0IHVubGVzcyBjb2xvciBxdWFudGl6YXRpb24gaXMgYmVpbmcgZG9uZS4KKwkJCU9yZGVyZWQgZGl0aGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluIC1vbmVwYXNzIG1vZGUuCisKKwktbWFwIEZJTEUJUXVhbnRpemUgdG8gdGhlIGNvbG9ycyB1c2VkIGluIHRoZSBzcGVjaWZpZWQgaW1hZ2UKKwkJCWZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJvZHVjaW5nIG11bHRpcGxlIGZpbGVzCisJCQl3aXRoIGlkZW50aWNhbCBjb2xvciBtYXBzLCBvciBmb3IgZm9yY2luZyBhIHByZWRlZmluZWQKKwkJCXNldCBvZiBjb2xvcnMgdG8gYmUgdXNlZC4gIFRoZSBGSUxFIG11c3QgYmUgYSBHSUYKKwkJCW9yIFBQTSBmaWxlLiAgVGhpcyBvcHRpb24gb3ZlcnJpZGVzIC1jb2xvcnMgYW5kCisJCQktb25lcGFzcy4KKworCS1ub3Ntb290aAlVc2UgYSBmYXN0ZXIsIGxvd2VyLXF1YWxpdHkgdXBzYW1wbGluZyByb3V0aW5lLgorCisJLW9uZXBhc3MJVXNlIG9uZS1wYXNzIGluc3RlYWQgb2YgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLgorCQkJVGhlIG9uZS1wYXNzIG1ldGhvZCBpcyBmYXN0ZXIgYW5kIG5lZWRzIGxlc3MgbWVtb3J5LAorCQkJYnV0IGl0IHByb2R1Y2VzIGEgbG93ZXItcXVhbGl0eSBpbWFnZS4gIC1vbmVwYXNzIGlzCisJCQlpZ25vcmVkIHVubGVzcyB5b3UgYWxzbyBzYXkgLWNvbG9ycyBOLiAgQWxzbywKKwkJCXRoZSBvbmUtcGFzcyBtZXRob2QgaXMgYWx3YXlzIHVzZWQgZm9yIGdyYXktc2NhbGUKKwkJCW91dHB1dCAodGhlIHR3by1wYXNzIG1ldGhvZCBpcyBubyBpbXByb3ZlbWVudCB0aGVuKS4KKworCS1tYXhtZW1vcnkgTglTZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcKKwkJCWxhcmdlIGltYWdlcy4gIFZhbHVlIGlzIGluIHRob3VzYW5kcyBvZiBieXRlcywgb3IKKwkJCW1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgorCQkJRm9yIGV4YW1wbGUsIC1tYXggNG0gc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZQorCQkJc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgorCisJLXZlcmJvc2UJRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZSAtdidzIGdpdmUgbW9yZSBwcmludG91dC4KKwlvciAgLWRlYnVnCUFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgorCisKK0hJTlRTIEZPUiBDSlBFRworCitDb2xvciBHSUYgZmlsZXMgYXJlIG5vdCB0aGUgaWRlYWwgaW5wdXQgZm9yIEpQRUc7IEpQRUcgaXMgcmVhbGx5IGludGVuZGVkIGZvcgorY29tcHJlc3NpbmcgZnVsbC1jb2xvciAoMjQtYml0KSBpbWFnZXMuICBJbiBwYXJ0aWN1bGFyLCBkb24ndCB0cnkgdG8gY29udmVydAorY2FydG9vbnMsIGxpbmUgZHJhd2luZ3MsIGFuZCBvdGhlciBpbWFnZXMgdGhhdCBoYXZlIG9ubHkgYSBmZXcgZGlzdGluY3QKK2NvbG9ycy4gIEdJRiB3b3JrcyBncmVhdCBvbiB0aGVzZSwgSlBFRyBkb2VzIG5vdC4gIElmIHlvdSB3YW50IHRvIGNvbnZlcnQgYQorR0lGIHRvIEpQRUcsIHlvdSBzaG91bGQgZXhwZXJpbWVudCB3aXRoIGNqcGVnJ3MgLXF1YWxpdHkgYW5kIC1zbW9vdGggb3B0aW9ucwordG8gZ2V0IGEgc2F0aXNmYWN0b3J5IGNvbnZlcnNpb24uICAtc21vb3RoIDEwIG9yIHNvIGlzIG9mdGVuIGhlbHBmdWwuCisKK0F2b2lkIHJ1bm5pbmcgYW4gaW1hZ2UgdGhyb3VnaCBhIHNlcmllcyBvZiBKUEVHIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24KK2N5Y2xlcy4gIEltYWdlIHF1YWxpdHkgbG9zcyB3aWxsIGFjY3VtdWxhdGU7IGFmdGVyIHRlbiBvciBzbyBjeWNsZXMgdGhlIGltYWdlCittYXkgYmUgbm90aWNlYWJseSB3b3JzZSB0aGFuIGl0IHdhcyBhZnRlciBvbmUgY3ljbGUuICBJdCdzIGJlc3QgdG8gdXNlIGEKK2xvc3NsZXNzIGZvcm1hdCB3aGlsZSBtYW5pcHVsYXRpbmcgYW4gaW1hZ2UsIHRoZW4gY29udmVydCB0byBKUEVHIGZvcm1hdCB3aGVuCit5b3UgYXJlIHJlYWR5IHRvIGZpbGUgdGhlIGltYWdlIGF3YXkuCisKK1RoZSAtb3B0aW1pemUgb3B0aW9uIHRvIGNqcGVnIGlzIHdvcnRoIHVzaW5nIHdoZW4geW91IGFyZSBtYWtpbmcgYSAiZmluYWwiCit2ZXJzaW9uIGZvciBwb3N0aW5nIG9yIGFyY2hpdmluZy4gIEl0J3MgYWxzbyBhIHdpbiB3aGVuIHlvdSBhcmUgdXNpbmcgbG93CitxdWFsaXR5IHNldHRpbmdzIHRvIG1ha2UgdmVyeSBzbWFsbCBKUEVHIGZpbGVzOyB0aGUgcGVyY2VudGFnZSBpbXByb3ZlbWVudAoraXMgb2Z0ZW4gYSBsb3QgbW9yZSB0aGFuIGl0IGlzIG9uIGxhcmdlciBmaWxlcy4gIChBdCBwcmVzZW50LCAtb3B0aW1pemUKK21vZGUgaXMgYWx3YXlzIHNlbGVjdGVkIHdoZW4gZ2VuZXJhdGluZyBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLikKKworR0lGIGlucHV0IGZpbGVzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLCB0byBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQuCitVc2UgYSBVbmlzeXMtbGljZW5zZWQgcHJvZ3JhbSBpZiB5b3UgbmVlZCB0byByZWFkIGEgR0lGIGZpbGUuICAoQ29udmVyc2lvbgorb2YgR0lGIGZpbGVzIHRvIEpQRUcgaXMgdXN1YWxseSBhIGJhZCBpZGVhIGFueXdheS4pCisKKworSElOVFMgRk9SIERKUEVHCisKK1RvIGdldCBhIHF1aWNrIHByZXZpZXcgb2YgYW4gaW1hZ2UsIHVzZSB0aGUgLWdyYXlzY2FsZSBhbmQvb3IgLXNjYWxlIHN3aXRjaGVzLgorIi1ncmF5c2NhbGUgLXNjYWxlIDEvOCIgaXMgdGhlIGZhc3Rlc3QgY2FzZS4KKworU2V2ZXJhbCBvcHRpb25zIGFyZSBhdmFpbGFibGUgdGhhdCB0cmFkZSBvZmYgaW1hZ2UgcXVhbGl0eSB0byBnYWluIHNwZWVkLgorIi1mYXN0IiB0dXJucyBvbiB0aGUgcmVjb21tZW5kZWQgc2V0dGluZ3MuCisKKyItZGN0IGZhc3QiIGFuZC9vciAiLW5vc21vb3RoIiBnYWluIHNwZWVkIGF0IGEgc21hbGwgc2FjcmlmaWNlIGluIHF1YWxpdHkuCitXaGVuIHByb2R1Y2luZyBhIGNvbG9yLXF1YW50aXplZCBpbWFnZSwgIi1vbmVwYXNzIC1kaXRoZXIgb3JkZXJlZCIgaXMgZmFzdCBidXQKK211Y2ggbG93ZXIgcXVhbGl0eSB0aGFuIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAgIi1kaXRoZXIgbm9uZSIgbWF5IGdpdmUKK2FjY2VwdGFibGUgcmVzdWx0cyBpbiB0d28tcGFzcyBtb2RlLCBidXQgaXMgc2VsZG9tIHRvbGVyYWJsZSBpbiBvbmUtcGFzcyBtb2RlLgorCitJZiB5b3UgYXJlIGZvcnR1bmF0ZSBlbm91Z2ggdG8gaGF2ZSB2ZXJ5IGZhc3QgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUsCisiLWRjdCBmbG9hdCIgbWF5IGJlIGV2ZW4gZmFzdGVyIHRoYW4gIi1kY3QgZmFzdCIuICBCdXQgb24gbW9zdCBtYWNoaW5lcworIi1kY3QgZmxvYXQiIGlzIHNsb3dlciB0aGFuICItZGN0IGludCI7IGluIHRoaXMgY2FzZSBpdCBpcyBub3Qgd29ydGggdXNpbmcsCitiZWNhdXNlIGl0cyB0aGVvcmV0aWNhbCBhY2N1cmFjeSBhZHZhbnRhZ2UgaXMgdG9vIHNtYWxsIHRvIGJlIHNpZ25pZmljYW50CitpbiBwcmFjdGljZS4KKworVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIHJlcXVpcmVzIGEgZ29vZCBkZWFsIG9mIG1lbW9yeTsgb24gTVMtRE9TIG1hY2hpbmVzCitpdCBtYXkgcnVuIG91dCBvZiBtZW1vcnkgZXZlbiB3aXRoIC1tYXhtZW1vcnkgMC4gIEluIHRoYXQgY2FzZSB5b3UgY2FuIHN0aWxsCitkZWNvbXByZXNzLCB3aXRoIHNvbWUgbG9zcyBvZiBpbWFnZSBxdWFsaXR5LCBieSBzcGVjaWZ5aW5nIC1vbmVwYXNzIGZvcgorb25lLXBhc3MgcXVhbnRpemF0aW9uLgorCitUbyBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIGRqcGVnIHByb2R1Y2VzIHVuY29tcHJlc3NlZCBHSUYgZmlsZXMuICBUaGVzZQorYXJlIGxhcmdlciB0aGFuIHRoZXkgc2hvdWxkIGJlLCBidXQgYXJlIHJlYWRhYmxlIGJ5IHN0YW5kYXJkIEdJRiBkZWNvZGVycy4KKworCitISU5UUyBGT1IgQk9USCBQUk9HUkFNUworCitJZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCB0aGFuIHdpbGwgZml0IGluIHRoZSBhdmFpbGFibGUgbWFpbiBtZW1vcnkgKGFzCitkZXRlcm1pbmVkIGJ5IC1tYXhtZW1vcnkpLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLiAgKE1TLURPUyB2ZXJzaW9ucword2lsbCB0cnkgdG8gZ2V0IGV4dGVuZGVkIG9yIGV4cGFuZGVkIG1lbW9yeSBmaXJzdC4pICBUaGUgdGVtcG9yYXJ5IGZpbGVzIGFyZQorb2Z0ZW4gcmF0aGVyIGxhcmdlOiBpbiB0eXBpY2FsIGNhc2VzIHRoZXkgb2NjdXB5IHRocmVlIGJ5dGVzIHBlciBwaXhlbCwgZm9yCitleGFtcGxlIDMqODAwKjYwMCA9IDEuNDRNYiBmb3IgYW4gODAweDYwMCBpbWFnZS4gIElmIHlvdSBkb24ndCBoYXZlIGVub3VnaAorZnJlZSBkaXNrIHNwYWNlLCBsZWF2ZSBvdXQgLXByb2dyZXNzaXZlIGFuZCAtb3B0aW1pemUgKGZvciBjanBlZykgb3Igc3BlY2lmeQorLW9uZXBhc3MgKGZvciBkanBlZykuCisKK09uIE1TLURPUywgdGhlIHRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBUTVAKK29yIFRFTVAgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBuZWl0aGVyIG9mIHRob3NlCitleGlzdC4gIEFtaWdhIGltcGxlbWVudGF0aW9ucyBwdXQgdGhlIHRlbXAgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBuYW1lZCBieQorSlBFR1RNUDosIHNvIGJlIHN1cmUgdG8gYXNzaWduIEpQRUdUTVA6IHRvIGEgZGlzayBwYXJ0aXRpb24gd2l0aCBhZGVxdWF0ZSBmcmVlCitzcGFjZS4KKworVGhlIGRlZmF1bHQgbWVtb3J5IHVzYWdlIGxpbWl0ICgtbWF4bWVtb3J5KSBpcyBzZXQgd2hlbiB0aGUgc29mdHdhcmUgaXMKK2NvbXBpbGVkLiAgSWYgeW91IGdldCBhbiAiaW5zdWZmaWNpZW50IG1lbW9yeSIgZXJyb3IsIHRyeSBzcGVjaWZ5aW5nIGEgc21hbGxlcgorLW1heG1lbW9yeSB2YWx1ZSwgZXZlbiAtbWF4bWVtb3J5IDAgdG8gdXNlIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIHNwYWNlLiAgWW91CittYXkgd2FudCB0byByZWNvbXBpbGUgd2l0aCBhIHNtYWxsZXIgZGVmYXVsdCB2YWx1ZSBpZiB0aGlzIGhhcHBlbnMgb2Z0ZW4uCisKK09uIG1hY2hpbmVzIHRoYXQgaGF2ZSAiZW52aXJvbm1lbnQiIHZhcmlhYmxlcywgeW91IGNhbiBkZWZpbmUgdGhlIGVudmlyb25tZW50Cit2YXJpYWJsZSBKUEVHTUVNIHRvIHNldCB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuICBUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzCitkZXNjcmliZWQgZm9yIHRoZSAtbWF4bWVtb3J5IHN3aXRjaC4gIEpQRUdNRU0gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlCitzcGVjaWZpZWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQsIGFuZCBpdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbgorZXhwbGljaXQgLW1heG1lbW9yeSBzd2l0Y2guCisKK09uIE1TLURPUyBtYWNoaW5lcywgLW1heG1lbW9yeSBpcyB0aGUgYW1vdW50IG9mIG1haW4gKGNvbnZlbnRpb25hbCkgbWVtb3J5IHRvCit1c2UuICAoRXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGlzIGFsc28gdXNlZCBpZiBhdmFpbGFibGUuKSAgTW9zdAorRE9TLXNwZWNpZmljIHZlcnNpb25zIG9mIHRoaXMgc29mdHdhcmUgZG8gdGhlaXIgb3duIG1lbW9yeSBzcGFjZSBlc3RpbWF0aW9uCithbmQgZG8gbm90IG5lZWQgeW91IHRvIHNwZWNpZnkgLW1heG1lbW9yeS4KKworCitKUEVHVFJBTgorCitqcGVndHJhbiBwZXJmb3JtcyB2YXJpb3VzIHVzZWZ1bCB0cmFuc2Zvcm1hdGlvbnMgb2YgSlBFRyBmaWxlcy4KK0l0IGNhbiB0cmFuc2xhdGUgdGhlIGNvZGVkIHJlcHJlc2VudGF0aW9uIGZyb20gb25lIHZhcmlhbnQgb2YgSlBFRyB0byBhbm90aGVyLAorZm9yIGV4YW1wbGUgZnJvbSBiYXNlbGluZSBKUEVHIHRvIHByb2dyZXNzaXZlIEpQRUcgb3IgdmljZSB2ZXJzYS4gIEl0IGNhbiBhbHNvCitwZXJmb3JtIHNvbWUgcmVhcnJhbmdlbWVudHMgb2YgdGhlIGltYWdlIGRhdGEsIGZvciBleGFtcGxlIHR1cm5pbmcgYW4gaW1hZ2UKK2Zyb20gbGFuZHNjYXBlIHRvIHBvcnRyYWl0IGZvcm1hdCBieSByb3RhdGlvbi4KKworanBlZ3RyYW4gd29ya3MgYnkgcmVhcnJhbmdpbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoRENUIGNvZWZmaWNpZW50cyksIHdpdGhvdXQKK2V2ZXIgZnVsbHkgZGVjb2RpbmcgdGhlIGltYWdlLiAgVGhlcmVmb3JlLCBpdHMgdHJhbnNmb3JtYXRpb25zIGFyZSBsb3NzbGVzczoKK3RoZXJlIGlzIG5vIGltYWdlIGRlZ3JhZGF0aW9uIGF0IGFsbCwgd2hpY2ggd291bGQgbm90IGJlIHRydWUgaWYgeW91IHVzZWQKK2RqcGVnIGZvbGxvd2VkIGJ5IGNqcGVnIHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgY29udmVyc2lvbi4gIEJ1dCBieSB0aGUgc2FtZQordG9rZW4sIGpwZWd0cmFuIGNhbm5vdCBwZXJmb3JtIGxvc3N5IG9wZXJhdGlvbnMgc3VjaCBhcyBjaGFuZ2luZyB0aGUgaW1hZ2UKK3F1YWxpdHkuCisKK2pwZWd0cmFuIHVzZXMgYSBjb21tYW5kIGxpbmUgc3ludGF4IHNpbWlsYXIgdG8gY2pwZWcgb3IgZGpwZWcuCitPbiBVbml4LWxpa2Ugc3lzdGVtcywgeW91IHNheToKKwlqcGVndHJhbiBbc3dpdGNoZXNdIFtpbnB1dGZpbGVdID5vdXRwdXRmaWxlCitPbiBtb3N0IG5vbi1Vbml4IHN5c3RlbXMsIHlvdSBzYXk6CisJanBlZ3RyYW4gW3N3aXRjaGVzXSBpbnB1dGZpbGUgb3V0cHV0ZmlsZQord2hlcmUgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBhcmUgSlBFRyBmaWxlcy4KKworVG8gc3BlY2lmeSB0aGUgY29kZWQgSlBFRyByZXByZXNlbnRhdGlvbiB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSwKK2pwZWd0cmFuIGFjY2VwdHMgYSBzdWJzZXQgb2YgdGhlIHN3aXRjaGVzIHJlY29nbml6ZWQgYnkgY2pwZWc6CisJLW9wdGltaXplCVBlcmZvcm0gb3B0aW1pemF0aW9uIG9mIGVudHJvcHkgZW5jb2RpbmcgcGFyYW1ldGVycy4KKwktcHJvZ3Jlc3NpdmUJQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZS4KKwktcmVzdGFydCBOCUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5CisJCQlOIE1DVSBibG9ja3MgaWYgIkIiIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCisJLXNjYW5zIGZpbGUJVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KK1NlZSB0aGUgcHJldmlvdXMgZGlzY3Vzc2lvbiBvZiBjanBlZyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZXNlIHN3aXRjaGVzLgorSWYgeW91IHNwZWNpZnkgbm9uZSBvZiB0aGVzZSBzd2l0Y2hlcywgeW91IGdldCBhIHBsYWluIGJhc2VsaW5lLUpQRUcgb3V0cHV0CitmaWxlLiAgVGhlIHF1YWxpdHkgc2V0dGluZyBhbmQgc28gZm9ydGggYXJlIGRldGVybWluZWQgYnkgdGhlIGlucHV0IGZpbGUuCisKK1RoZSBpbWFnZSBjYW4gYmUgbG9zc2xlc3NseSB0cmFuc2Zvcm1lZCBieSBnaXZpbmcgb25lIG9mIHRoZXNlIHN3aXRjaGVzOgorCS1mbGlwIGhvcml6b250YWwJTWlycm9yIGltYWdlIGhvcml6b250YWxseSAobGVmdC1yaWdodCkuCisJLWZsaXAgdmVydGljYWwJCU1pcnJvciBpbWFnZSB2ZXJ0aWNhbGx5ICh0b3AtYm90dG9tKS4KKwktcm90YXRlIDkwCQlSb3RhdGUgaW1hZ2UgOTAgZGVncmVlcyBjbG9ja3dpc2UuCisJLXJvdGF0ZSAxODAJCVJvdGF0ZSBpbWFnZSAxODAgZGVncmVlcy4KKwktcm90YXRlIDI3MAkJUm90YXRlIGltYWdlIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZSAob3IgOTAgY2N3KS4KKwktdHJhbnNwb3NlCQlUcmFuc3Bvc2UgaW1hZ2UgKGFjcm9zcyBVTC10by1MUiBheGlzKS4KKwktdHJhbnN2ZXJzZQkJVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgKGFjcm9zcyBVUi10by1MTCBheGlzKS4KKworVGhlIHRyYW5zcG9zZSB0cmFuc2Zvcm1hdGlvbiBoYXMgbm8gcmVzdHJpY3Rpb25zIHJlZ2FyZGluZyBpbWFnZSBkaW1lbnNpb25zLgorVGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBvcGVyYXRlIHJhdGhlciBvZGRseSBpZiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgbm90CithIG11bHRpcGxlIG9mIHRoZSBpTUNVIHNpemUgKHVzdWFsbHkgOCBvciAxNiBwaXhlbHMpLCBiZWNhdXNlIHRoZXkgY2FuIG9ubHkKK3RyYW5zZm9ybSBjb21wbGV0ZSBibG9ja3Mgb2YgRENUIGNvZWZmaWNpZW50IGRhdGEgaW4gdGhlIGRlc2lyZWQgd2F5LgorCitqcGVndHJhbidzIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiB0cmFuc2Zvcm1pbmcgYW4gb2RkLXNpemUgaW1hZ2UgaXMgZGVzaWduZWQKK3RvIHByZXNlcnZlIGV4YWN0IHJldmVyc2liaWxpdHkgYW5kIG1hdGhlbWF0aWNhbCBjb25zaXN0ZW5jeSBvZiB0aGUKK3RyYW5zZm9ybWF0aW9uIHNldC4gIEFzIHN0YXRlZCwgdHJhbnNwb3NlIGlzIGFibGUgdG8gZmxpcCB0aGUgZW50aXJlIGltYWdlCithcmVhLiAgSG9yaXpvbnRhbCBtaXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1UgY29sdW1uIGF0IHRoZSByaWdodCBlZGdlCit1bnRvdWNoZWQsIGJ1dCBpcyBhYmxlIHRvIGZsaXAgYWxsIHJvd3Mgb2YgdGhlIGltYWdlLiAgU2ltaWxhcmx5LCB2ZXJ0aWNhbAorbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIHJvdyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLCBidXQgaXMKK2FibGUgdG8gZmxpcCBhbGwgY29sdW1ucy4gIFRoZSBvdGhlciB0cmFuc2Zvcm1zIGNhbiBiZSBidWlsdCB1cCBhcyBzZXF1ZW5jZXMKK29mIHRyYW5zcG9zZSBhbmQgZmxpcCBvcGVyYXRpb25zOyBmb3IgY29uc2lzdGVuY3ksIHRoZWlyIGFjdGlvbnMgb24gZWRnZQorcGl4ZWxzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBlbmQgcmVzdWx0IG9mIHRoZSBjb3JyZXNwb25kaW5nCit0cmFuc3Bvc2UtYW5kLWZsaXAgc2VxdWVuY2UuCisKK0ZvciBwcmFjdGljYWwgdXNlLCB5b3UgbWF5IHByZWZlciB0byBkaXNjYXJkIGFueSB1bnRyYW5zZm9ybWFibGUgZWRnZSBwaXhlbHMKK3JhdGhlciB0aGFuIGhhdmluZyBhIHN0cmFuZ2UtbG9va2luZyBzdHJpcCBhbG9uZyB0aGUgcmlnaHQgYW5kL29yIGJvdHRvbSBlZGdlcworb2YgYSB0cmFuc2Zvcm1lZCBpbWFnZS4gIFRvIGRvIHRoaXMsIGFkZCB0aGUgLXRyaW0gc3dpdGNoOgorCS10cmltCQlEcm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzLgorT2J2aW91c2x5LCBhIHRyYW5zZm9ybWF0aW9uIHdpdGggLXRyaW0gaXMgbm90IHJldmVyc2libGUsIHNvIHN0cmljdGx5IHNwZWFraW5nCitqcGVndHJhbiB3aXRoIHRoaXMgc3dpdGNoIGlzIG5vdCBsb3NzbGVzcy4gIEFsc28sIHRoZSBleHBlY3RlZCBtYXRoZW1hdGljYWwKK2VxdWl2YWxlbmNlcyBiZXR3ZWVuIHRoZSB0cmFuc2Zvcm1hdGlvbnMgbm8gbG9uZ2VyIGhvbGQuICBGb3IgZXhhbXBsZSwKKyItcm90IDI3MCAtdHJpbSIgdHJpbXMgb25seSB0aGUgYm90dG9tIGVkZ2UsIGJ1dCAiLXJvdCA5MCAtdHJpbSIgZm9sbG93ZWQgYnkKKyItcm90IDE4MCAtdHJpbSIgdHJpbXMgYm90aCBlZGdlcy4KKworQW5vdGhlciBub3Qtc3RyaWN0bHktbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gc3dpdGNoIGlzOgorCS1ncmF5c2NhbGUJRm9yY2UgZ3JheXNjYWxlIG91dHB1dC4KK1RoaXMgb3B0aW9uIGRpc2NhcmRzIHRoZSBjaHJvbWluYW5jZSBjaGFubmVscyBpZiB0aGUgaW5wdXQgaW1hZ2UgaXMgWUNiQ3IKKyhpZSwgYSBzdGFuZGFyZCBjb2xvciBKUEVHKSwgcmVzdWx0aW5nIGluIGEgZ3JheXNjYWxlIEpQRUcgZmlsZS4gIFRoZQorbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHksIHNvIHRoaXMgaXMgYSBiZXR0ZXIgbWV0aG9kIG9mIHJlZHVjaW5nCit0byBncmF5c2NhbGUgdGhhbiBkZWNvbXByZXNzaW9uLCBjb252ZXJzaW9uLCBhbmQgcmVjb21wcmVzc2lvbi4gIFRoaXMgc3dpdGNoCitpcyBwYXJ0aWN1bGFybHkgaGFuZHkgZm9yIGZpeGluZyBhIG1vbm9jaHJvbWUgcGljdHVyZSB0aGF0IHdhcyBtaXN0YWtlbmx5CitlbmNvZGVkIGFzIGEgY29sb3IgSlBFRy4gIChJbiBzdWNoIGEgY2FzZSwgdGhlIHNwYWNlIHNhdmluZ3MgZnJvbSBnZXR0aW5nIHJpZAorb2YgdGhlIG5lYXItZW1wdHkgY2hyb21hIGNoYW5uZWxzIHdvbid0IGJlIGxhcmdlOyBidXQgdGhlIGRlY29kaW5nIHRpbWUgZm9yCithIGdyYXlzY2FsZSBKUEVHIGlzIHN1YnN0YW50aWFsbHkgbGVzcyB0aGFuIHRoYXQgZm9yIGEgY29sb3IgSlBFRy4pCisKK2pwZWd0cmFuIGFsc28gcmVjb2duaXplcyB0aGVzZSBzd2l0Y2hlcyB0aGF0IGNvbnRyb2wgd2hhdCB0byBkbyB3aXRoICJleHRyYSIKK21hcmtlcnMsIHN1Y2ggYXMgY29tbWVudCBibG9ja3M6CisJLWNvcHkgbm9uZQlDb3B5IG5vIGV4dHJhIG1hcmtlcnMgZnJvbSBzb3VyY2UgZmlsZS4gIFRoaXMgc2V0dGluZworCQkJc3VwcHJlc3NlcyBhbGwgY29tbWVudHMgYW5kIG90aGVyIGV4Y2VzcyBiYWdnYWdlCisJCQlwcmVzZW50IGluIHRoZSBzb3VyY2UgZmlsZS4KKwktY29weSBjb21tZW50cwlDb3B5IG9ubHkgY29tbWVudCBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIGNvcGllcworCQkJY29tbWVudHMgZnJvbSB0aGUgc291cmNlIGZpbGUsIGJ1dCBkaXNjYXJkcworCQkJYW55IG90aGVyIGluZXNzZW50aWFsIGRhdGEuIAorCS1jb3B5IGFsbAlDb3B5IGFsbCBleHRyYSBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIHByZXNlcnZlcworCQkJbWlzY2VsbGFuZW91cyBtYXJrZXJzIGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZSwgc3VjaAorCQkJYXMgSkZJRiB0aHVtYm5haWxzIGFuZCBQaG90b3Nob3Agc2V0dGluZ3MuICBJbiBzb21lCisJCQlmaWxlcyB0aGVzZSBleHRyYSBtYXJrZXJzIGNhbiBiZSBzaXphYmxlLgorVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgLWNvcHkgY29tbWVudHMuICAoTm90ZTogaW4gSUpHIHJlbGVhc2VzIHY2IGFuZCB2NmEsCitqcGVndHJhbiBhbHdheXMgZGlkIHRoZSBlcXVpdmFsZW50IG9mIC1jb3B5IG5vbmUuKQorCitBZGRpdGlvbmFsIHN3aXRjaGVzIHJlY29nbml6ZWQgYnkganBlZ3RyYW4gYXJlOgorCS1vdXRmaWxlIGZpbGVuYW1lCisJLW1heG1lbW9yeSBOCisJLXZlcmJvc2UKKwktZGVidWcKK1RoZXNlIHdvcmsgdGhlIHNhbWUgYXMgaW4gY2pwZWcgb3IgZGpwZWcuCisKKworVEhFIENPTU1FTlQgVVRJTElUSUVTCisKK1RoZSBKUEVHIHN0YW5kYXJkIGFsbG93cyAiY29tbWVudCIgKENPTSkgYmxvY2tzIHRvIG9jY3VyIHdpdGhpbiBhIEpQRUcgZmlsZS4KK0FsdGhvdWdoIHRoZSBzdGFuZGFyZCBkb2Vzbid0IGFjdHVhbGx5IGRlZmluZSB3aGF0IENPTSBibG9ja3MgYXJlIGZvciwgdGhleQorYXJlIHdpZGVseSB1c2VkIHRvIGhvbGQgdXNlci1zdXBwbGllZCB0ZXh0IHN0cmluZ3MuICBUaGlzIGxldHMgeW91IGFkZAorYW5ub3RhdGlvbnMsIHRpdGxlcywgaW5kZXggdGVybXMsIGV0YyB0byB5b3VyIEpQRUcgZmlsZXMsIGFuZCBsYXRlciByZXRyaWV2ZQordGhlbSBhcyB0ZXh0LiAgQ09NIGJsb2NrcyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIGltYWdlIHN0b3JlZCBpbiB0aGUgSlBFRworZmlsZS4gIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBDT00gYmxvY2sgaXMgNjRLLCBidXQgeW91IGNhbiBoYXZlIGFzIG1hbnkgb2YKK3RoZW0gYXMgeW91IGxpa2UgaW4gb25lIEpQRUcgZmlsZS4KKworV2UgcHJvdmlkZSB0d28gdXRpbGl0eSBwcm9ncmFtcyB0byBkaXNwbGF5IENPTSBibG9jayBjb250ZW50cyBhbmQgYWRkIENPTQorYmxvY2tzIHRvIGEgSlBFRyBmaWxlLgorCityZGpwZ2NvbSBzZWFyY2hlcyBhIEpQRUcgZmlsZSBhbmQgcHJpbnRzIHRoZSBjb250ZW50cyBvZiBhbnkgQ09NIGJsb2NrcyBvbgorc3RhbmRhcmQgb3V0cHV0LiAgVGhlIGNvbW1hbmQgbGluZSBzeW50YXggaXMKKwlyZGpwZ2NvbSBbLXZlcmJvc2VdIFtpbnB1dGZpbGVuYW1lXQorVGhlIHN3aXRjaCAiLXZlcmJvc2UiIChvciBqdXN0ICItdiIpIGNhdXNlcyByZGpwZ2NvbSB0byBhbHNvIGRpc3BsYXkgdGhlIEpQRUcKK2ltYWdlIGRpbWVuc2lvbnMuICBJZiB5b3Ugb21pdCB0aGUgaW5wdXQgZmlsZSBuYW1lIGZyb20gdGhlIGNvbW1hbmQgbGluZSwKK3RoZSBKUEVHIGZpbGUgaXMgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgbWF5IG5vdCB3b3JrIG9uIHNvbWUKK29wZXJhdGluZyBzeXN0ZW1zLCBpZiBiaW5hcnkgZGF0YSBjYW4ndCBiZSByZWFkIGZyb20gc3RkaW4uKQorCit3cmpwZ2NvbSBhZGRzIGEgQ09NIGJsb2NrLCBjb250YWluaW5nIHRleHQgeW91IHByb3ZpZGUsIHRvIGEgSlBFRyBmaWxlLgorT3JkaW5hcmlseSwgdGhlIENPTSBibG9jayBpcyBhZGRlZCBhZnRlciBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrcywgYnV0IHlvdQorY2FuIGRlbGV0ZSB0aGUgb2xkIENPTSBibG9ja3MgaWYgeW91IHdpc2guICB3cmpwZ2NvbSBwcm9kdWNlcyBhIG5ldyBKUEVHCitmaWxlOyBpdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGlucHV0IGZpbGUuICBETyBOT1QgdHJ5IHRvIG92ZXJ3cml0ZSB0aGUgaW5wdXQKK2ZpbGUgYnkgZGlyZWN0aW5nIHdyanBnY29tJ3Mgb3V0cHV0IGJhY2sgaW50byBpdDsgb24gbW9zdCBzeXN0ZW1zIHRoaXMgd2lsbAoranVzdCBkZXN0cm95IHlvdXIgZmlsZS4KKworVGhlIGNvbW1hbmQgbGluZSBzeW50YXggZm9yIHdyanBnY29tIGlzIHNpbWlsYXIgdG8gY2pwZWcncy4gIE9uIFVuaXgtbGlrZQorc3lzdGVtcywgaXQgaXMKKwl3cmpwZ2NvbSBbc3dpdGNoZXNdIFtpbnB1dGZpbGVuYW1lXQorVGhlIG91dHB1dCBmaWxlIGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQgb3V0cHV0LiAgVGhlIGlucHV0IGZpbGUgY29tZXMgZnJvbQordGhlIG5hbWVkIGZpbGUsIG9yIGZyb20gc3RhbmRhcmQgaW5wdXQgaWYgbm8gaW5wdXQgZmlsZSBpcyBuYW1lZC4KKworT24gbW9zdCBub24tVW5peCBzeXN0ZW1zLCB0aGUgc3ludGF4IGlzCisJd3JqcGdjb20gW3N3aXRjaGVzXSBpbnB1dGZpbGVuYW1lIG91dHB1dGZpbGVuYW1lCit3aGVyZSBib3RoIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBuYW1lcyBtdXN0IGJlIGdpdmVuIGV4cGxpY2l0bHkuCisKK3dyanBnY29tIHVuZGVyc3RhbmRzIHRocmVlIHN3aXRjaGVzOgorCS1yZXBsYWNlCQkgRGVsZXRlIGFueSBleGlzdGluZyBDT00gYmxvY2tzIGZyb20gdGhlIGZpbGUuCisJLWNvbW1lbnQgIkNvbW1lbnQgdGV4dCIJIFN1cHBseSBuZXcgQ09NIHRleHQgb24gY29tbWFuZCBsaW5lLgorCS1jZmlsZSBuYW1lCQkgUmVhZCB0ZXh0IGZvciBuZXcgQ09NIGJsb2NrIGZyb20gbmFtZWQgZmlsZS4KKyhTd2l0Y2ggbmFtZXMgY2FuIGJlIGFiYnJldmlhdGVkLikgIElmIHlvdSBoYXZlIG9ubHkgb25lIGxpbmUgb2YgY29tbWVudCB0ZXh0Cit0byBhZGQsIHlvdSBjYW4gcHJvdmlkZSBpdCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggLWNvbW1lbnQuICBUaGUgY29tbWVudAordGV4dCBtdXN0IGJlIHN1cnJvdW5kZWQgd2l0aCBxdW90ZXMgc28gdGhhdCBpdCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlCithcmd1bWVudC4gIExvbmdlciBjb21tZW50cyBjYW4gYmUgcmVhZCBmcm9tIGEgdGV4dCBmaWxlLgorCitJZiB5b3UgZ2l2ZSBuZWl0aGVyIC1jb21tZW50IG5vciAtY2ZpbGUsIHRoZW4gd3JqcGdjb20gd2lsbCByZWFkIHRoZSBjb21tZW50Cit0ZXh0IGZyb20gc3RhbmRhcmQgaW5wdXQuICAoSW4gdGhpcyBjYXNlIGFuIGlucHV0IGltYWdlIGZpbGUgbmFtZSBNVVNUIGJlCitzdXBwbGllZCwgc28gdGhhdCB0aGUgc291cmNlIEpQRUcgZmlsZSBjb21lcyBmcm9tIHNvbWV3aGVyZSBlbHNlLikgIFlvdSBjYW4KK2VudGVyIG11bHRpcGxlIGxpbmVzLCB1cCB0byA2NEtCIHdvcnRoLiAgVHlwZSBhbiBlbmQtb2YtZmlsZSBpbmRpY2F0b3IKKyh1c3VhbGx5IGNvbnRyb2wtRCBvciBjb250cm9sLVopIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWVudCB0ZXh0IGVudHJ5LgorCit3cmpwZ2NvbSB3aWxsIG5vdCBhZGQgYSBDT00gYmxvY2sgaWYgdGhlIHByb3ZpZGVkIGNvbW1lbnQgc3RyaW5nIGlzIGVtcHR5LgorVGhlcmVmb3JlIC1yZXBsYWNlIC1jb21tZW50ICIiIGNhbiBiZSB1c2VkIHRvIGRlbGV0ZSBhbGwgQ09NIGJsb2NrcyBmcm9tIGEKK2ZpbGUuCisKK1RoZXNlIHV0aWxpdHkgcHJvZ3JhbXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgSUpHIEpQRUcgbGlicmFyeS4gIEluCitwYXJ0aWN1bGFyLCB0aGUgc291cmNlIGNvZGUgZm9yIHJkanBnY29tIGlzIGludGVuZGVkIGFzIGFuIGlsbHVzdHJhdGlvbiBvZgordGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgcmVxdWlyZWQgdG8gcGFyc2UgYSBKUEVHIGZpbGUgaGVhZGVyIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL2pwZWcvd2l6YXJkLmRvYyBiL2pwZWcvd2l6YXJkLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE3MGIyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy93aXphcmQuZG9jCkBAIC0wLDAgKzEsMjExIEBACitBZHZhbmNlZCB1c2FnZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBmaWxlIGRlc2NyaWJlcyBjanBlZydzICJzd2l0Y2hlcyBmb3Igd2l6YXJkcyIuCisKK1RoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcgYnkgcGVyc29ucword2hvIGFyZSByZWFzb25hYmx5IGtub3dsZWRnZWFibGUgYWJvdXQgdGhlIEpQRUcgc3RhbmRhcmQuICBJZiB5b3UgZG9uJ3Qga25vdword2hhdCB5b3UgYXJlIGRvaW5nLCBET04nVCBVU0UgVEhFU0UgU1dJVENIRVMuICBZb3UnbGwgbGlrZWx5IHByb2R1Y2UgZmlsZXMKK3dpdGggd29yc2UgaW1hZ2UgcXVhbGl0eSBhbmQvb3IgcG9vcmVyIGNvbXByZXNzaW9uIHRoYW4geW91J2QgZ2V0IGZyb20gdGhlCitkZWZhdWx0IHNldHRpbmdzLiAgRnVydGhlcm1vcmUsIHRoZXNlIHN3aXRjaGVzIG11c3QgYmUgdXNlZCB3aXRoIGNhdXRpb24KK3doZW4gbWFraW5nIGZpbGVzIGludGVuZGVkIGZvciBnZW5lcmFsIHVzZSwgYmVjYXVzZSBub3QgYWxsIEpQRUcgZGVjb2RlcnMKK3dpbGwgc3VwcG9ydCB1bnVzdWFsIEpQRUcgcGFyYW1ldGVyIHNldHRpbmdzLgorCisKK1F1YW50aXphdGlvbiBUYWJsZSBBZGp1c3RtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPcmRpbmFyaWx5LCBjanBlZyBzdGFydHMgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHRhYmxlcyAodGhlIHNhbWUgb25lcyBnaXZlbgorYXMgZXhhbXBsZXMgaW4gdGhlIEpQRUcgc3RhbmRhcmQpIGFuZCBzY2FsZXMgdGhlbSB1cCBvciBkb3duIGFjY29yZGluZyB0bwordGhlIC1xdWFsaXR5IHNldHRpbmcuICBUaGUgZGV0YWlscyBvZiB0aGUgc2NhbGluZyBhbGdvcml0aG0gY2FuIGJlIGZvdW5kIGluCitqY3BhcmFtLmMuICBBdCB2ZXJ5IGxvdyBxdWFsaXR5IHNldHRpbmdzLCBzb21lIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyaWVzCitjYW4gZ2V0IHNjYWxlZCB1cCB0byB2YWx1ZXMgZXhjZWVkaW5nIDI1NS4gIEFsdGhvdWdoIDItYnl0ZSBxdWFudGl6YXRpb24KK3ZhbHVlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBJSkcgc29mdHdhcmUsIHRoaXMgZmVhdHVyZSBpcyBub3QgaW4gYmFzZWxpbmUKK0pQRUcgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4gIElmIHlvdSBuZWVkIHRvIGVuc3VyZQord2lkZSBjb21wYXRpYmlsaXR5IG9mIGxvdy1xdWFsaXR5IGZpbGVzLCB5b3UgY2FuIGNvbnN0cmFpbiB0aGUgc2NhbGVkCitxdWFudGl6YXRpb24gdmFsdWVzIHRvIG5vIG1vcmUgdGhhbiAyNTUgYnkgZ2l2aW5nIHRoZSAtYmFzZWxpbmUgc3dpdGNoLgorTm90ZSB0aGF0IHVzZSBvZiAtYmFzZWxpbmUgd2lsbCByZXN1bHQgaW4gcG9vcmVyIHF1YWxpdHkgZm9yIHRoZSBzYW1lIGZpbGUKK3NpemUsIHNpbmNlIG1vcmUgYml0cyB0aGFuIG5lY2Vzc2FyeSBhcmUgZXhwZW5kZWQgb24gaGlnaGVyIEFDIGNvZWZmaWNpZW50cy4KKworWW91IGNhbiBzdWJzdGl0dXRlIGEgZGlmZmVyZW50IHNldCBvZiBxdWFudGl6YXRpb24gdmFsdWVzIGJ5IHVzaW5nIHRoZQorLXF0YWJsZXMgc3dpdGNoOgorCisJLXF0YWJsZXMgZmlsZQlVc2UgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gdGhlIG5hbWVkIGZpbGUuCisKK1RoZSBzcGVjaWZpZWQgZmlsZSBzaG91bGQgYmUgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBkZWNpbWFsIHF1YW50aXphdGlvbgordmFsdWVzLiAgVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gb25lIHRvIGZvdXIgdGFibGVzLCBlYWNoIG9mIDY0IGVsZW1lbnRzLgorVGhlIHRhYmxlcyBhcmUgaW1wbGljaXRseSBudW1iZXJlZCAwLDEsZXRjLiBpbiBvcmRlciBvZiBhcHBlYXJhbmNlLiAgVGFibGUKK2VudHJpZXMgYXBwZWFyIGluIG5vcm1hbCBhcnJheSBvcmRlciAoTk9UIGluIHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleQord2lsbCBiZSBzdG9yZWQgaW4gdGhlIEpQRUcgZmlsZSkuCisKK1F1YW50aXphdGlvbiB0YWJsZSBmaWxlcyBhcmUgZnJlZSBmb3JtYXQsIGluIHRoYXQgYXJiaXRyYXJ5IHdoaXRlc3BhY2UgY2FuCithcHBlYXIgYmV0d2VlbiBudW1iZXJzLiAgQWxzbywgY29tbWVudHMgY2FuIGJlIGluY2x1ZGVkOiBhIGNvbW1lbnQgc3RhcnRzCit3aXRoICcjJyBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgSGVyZSBpcyBhbiBleGFtcGxlIGZpbGUgdGhhdAorZHVwbGljYXRlcyB0aGUgZGVmYXVsdCBxdWFudGl6YXRpb24gdGFibGVzOgorCisJIyBRdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIEpQRUcgc3BlYywgc2VjdGlvbiBLLjEKKworCSMgVGhpcyBpcyB0YWJsZSAwICh0aGUgbHVtaW5hbmNlIHRhYmxlKToKKwkgIDE2ICAxMSAgMTAgIDE2ICAyNCAgNDAgIDUxICA2MQorCSAgMTIgIDEyICAxNCAgMTkgIDI2ICA1OCAgNjAgIDU1CisJICAxNCAgMTMgIDE2ICAyNCAgNDAgIDU3ICA2OSAgNTYKKwkgIDE0ICAxNyAgMjIgIDI5ICA1MSAgODcgIDgwICA2MgorCSAgMTggIDIyICAzNyAgNTYgIDY4IDEwOSAxMDMgIDc3CisJICAyNCAgMzUgIDU1ICA2NCAgODEgMTA0IDExMyAgOTIKKwkgIDQ5ICA2NCAgNzggIDg3IDEwMyAxMjEgMTIwIDEwMQorCSAgNzIgIDkyICA5NSAgOTggMTEyIDEwMCAxMDMgIDk5CisKKwkjIFRoaXMgaXMgdGFibGUgMSAodGhlIGNocm9taW5hbmNlIHRhYmxlKToKKwkgIDE3ICAxOCAgMjQgIDQ3ICA5OSAgOTkgIDk5ICA5OQorCSAgMTggIDIxICAyNiAgNjYgIDk5ICA5OSAgOTkgIDk5CisJICAyNCAgMjYgIDU2ICA5OSAgOTkgIDk5ICA5OSAgOTkKKwkgIDQ3ICA2NiAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQorCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5CisJICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKKwkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQorCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5CisKK0lmIHRoZSAtcXRhYmxlcyBzd2l0Y2ggaXMgdXNlZCB3aXRob3V0IC1xdWFsaXR5LCB0aGVuIHRoZSBzcGVjaWZpZWQgdGFibGVzCithcmUgdXNlZCBleGFjdGx5IGFzLWlzLiAgSWYgYm90aCAtcXRhYmxlcyBhbmQgLXF1YWxpdHkgYXJlIHVzZWQsIHRoZW4gdGhlCit0YWJsZXMgdGFrZW4gZnJvbSB0aGUgZmlsZSBhcmUgc2NhbGVkIGluIHRoZSBzYW1lIGZhc2hpb24gdGhhdCB0aGUgZGVmYXVsdAordGFibGVzIHdvdWxkIGJlIHNjYWxlZCBmb3IgdGhhdCBxdWFsaXR5IHNldHRpbmcuICBJZiAtYmFzZWxpbmUgYXBwZWFycywgdGhlbgordGhlIHF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAxLTI1NS4KKworQnkgZGVmYXVsdCwgY2pwZWcgd2lsbCB1c2UgcXVhbnRpemF0aW9uIHRhYmxlIDAgZm9yIGx1bWluYW5jZSBjb21wb25lbnRzIGFuZAordGFibGUgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4gIFRvIG92ZXJyaWRlIHRoaXMgY2hvaWNlLCB1c2UgdGhlIC1xc2xvdHMKK3N3aXRjaDoKKworCS1xc2xvdHMgTlssLi4uXQkJU2VsZWN0IHdoaWNoIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UgZm9yCisJCQkJZWFjaCBjb2xvciBjb21wb25lbnQuCisKK1RoZSAtcXNsb3RzIHN3aXRjaCBzcGVjaWZpZXMgYSBxdWFudGl6YXRpb24gdGFibGUgbnVtYmVyIGZvciBlYWNoIGNvbG9yCitjb21wb25lbnQsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29tcG9uZW50cyBhcHBlYXIgaW4gdGhlIEpQRUcgU09GIG1hcmtlci4KK0ZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBzZXBhcmF0ZSB0YWJsZSBmb3IgZWFjaCBvZiBZLENiLENyLCB5b3UgY291bGQKK3Byb3ZpZGUgYSAtcXRhYmxlcyBmaWxlIHRoYXQgZGVmaW5lcyB0aHJlZSBxdWFudGl6YXRpb24gdGFibGVzIGFuZCBzYXkKKyItcXNsb3RzIDAsMSwyIi4gIElmIC1xc2xvdHMgZ2l2ZXMgZmV3ZXIgdGFibGUgbnVtYmVycyB0aGFuIHRoZXJlIGFyZSBjb2xvcgorY29tcG9uZW50cywgdGhlbiB0aGUgbGFzdCB0YWJsZSBudW1iZXIgaXMgcmVwZWF0ZWQgYXMgbmVjZXNzYXJ5LgorCisKK1NhbXBsaW5nIEZhY3RvciBBZGp1c3RtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCeSBkZWZhdWx0LCBjanBlZyB1c2VzIDI6MSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkb3duc2FtcGxpbmcgd2hlbgorY29tcHJlc3NpbmcgWUNiQ3IgZGF0YSwgYW5kIG5vIGRvd25zYW1wbGluZyBmb3IgYWxsIG90aGVyIGNvbG9yIHNwYWNlcy4KK1lvdSBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggdGhlIC1zYW1wbGUgc3dpdGNoOgorCisJLXNhbXBsZSBIeFZbLC4uLl0JU2V0IEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvcgorCQkJCWNvbXBvbmVudC4KKworVGhlIC1zYW1wbGUgc3dpdGNoIHNwZWNpZmllcyB0aGUgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yCitjb21wb25lbnQsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgSlBFRyBTT0YgbWFya2VyLgorSWYgeW91IHNwZWNpZnkgZmV3ZXIgSHhWIHBhaXJzIHRoYW4gdGhlcmUgYXJlIGNvbXBvbmVudHMsIHRoZSByZW1haW5pbmcKK2NvbXBvbmVudHMgYXJlIHNldCB0byAxeDEgc2FtcGxpbmcuICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgWUNiQ3Igc2V0dGluZworaXMgZXF1aXZhbGVudCB0byAiLXNhbXBsZSAyeDIsMXgxLDF4MSIsIHdoaWNoIGNhbiBiZSBhYmJyZXZpYXRlZCB0bworIi1zYW1wbGUgMngyIi4KKworVGhlcmUgYXJlIHN0aWxsIHNvbWUgSlBFRyBkZWNvZGVycyBpbiBleGlzdGVuY2UgdGhhdCBzdXBwb3J0IG9ubHkgMngxCitzYW1wbGluZyAoYWxzbyBjYWxsZWQgNDoyOjIgc2FtcGxpbmcpLiAgQ29tcGF0aWJpbGl0eSB3aXRoIHN1Y2ggZGVjb2RlcnMgY2FuCitiZSBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nICItc2FtcGxlIDJ4MSIuICBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCB1bmxlc3MKK3JlYWxseSBuZWNlc3NhcnksIHNpbmNlIGl0IGluY3JlYXNlcyBmaWxlIHNpemUgYW5kIGVuY29kaW5nL2RlY29kaW5nIHRpbWUKK3dpdGggdmVyeSBsaXR0bGUgcXVhbGl0eSBnYWluLgorCisKK011bHRpcGxlIFNjYW4gLyBQcm9ncmVzc2lvbiBDb250cm9sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCeSBkZWZhdWx0LCBjanBlZyBlbWl0cyBhIHNpbmdsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgVGhlCistcHJvZ3Jlc3NpdmUgc3dpdGNoIGdlbmVyYXRlcyBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSB1c2luZyBhIGRlZmF1bHQgc2VyaWVzCitvZiBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzLiAgWW91IGNhbiBjcmVhdGUgbXVsdGlwbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcKK2ZpbGVzIG9yIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMgd2l0aCBjdXN0b20gcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBieSB1c2luZwordGhlIC1zY2FucyBzd2l0Y2g6CisKKwktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2VxdWVuY2UgZ2l2ZW4gaW4gdGhlIG5hbWVkIGZpbGUuCisKK1RoZSBzcGVjaWZpZWQgZmlsZSBzaG91bGQgYmUgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBhICJzY2FuIHNjcmlwdCIuCitUaGUgc2NyaXB0IHNwZWNpZmllcyB0aGUgY29udGVudHMgYW5kIG9yZGVyaW5nIG9mIHRoZSBzY2FucyB0byBiZSBlbWl0dGVkLgorRWFjaCBlbnRyeSBpbiB0aGUgc2NyaXB0IGRlZmluZXMgb25lIHNjYW4uICBBIHNjYW4gZGVmaW5pdGlvbiBzcGVjaWZpZXMKK3RoZSBjb21wb25lbnRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzY2FuLCBhbmQgZm9yIHByb2dyZXNzaXZlIEpQRUcgaXQgYWxzbworc3BlY2lmaWVzIHRoZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIFNzLFNlLEFoLEFsIGZvciB0aGUgc2Nhbi4gIFNjYW4KK2RlZmluaXRpb25zIGFyZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAoJzsnKS4gIEEgc2VtaWNvbG9uIGFmdGVyIHRoZSBsYXN0CitzY2FuIGRlZmluaXRpb24gaXMgb3B0aW9uYWwuCisKK0VhY2ggc2NhbiBkZWZpbml0aW9uIGNvbnRhaW5zIG9uZSB0byBmb3VyIGNvbXBvbmVudCBpbmRleGVzLCBvcHRpb25hbGx5Citmb2xsb3dlZCBieSBhIGNvbG9uICgnOicpIGFuZCB0aGUgZm91ciBwcm9ncmVzc2l2ZS1KUEVHIHBhcmFtZXRlcnMuICBUaGUKK2NvbXBvbmVudCBpbmRleGVzIGRlbm90ZSB3aGljaCBjb2xvciBjb21wb25lbnQocykgYXJlIHRvIGJlIHRyYW5zbWl0dGVkIGluCit0aGUgc2Nhbi4gIENvbXBvbmVudHMgYXJlIG51bWJlcmVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUKK0pQRUcgU09GIG1hcmtlciwgd2l0aCB0aGUgZmlyc3QgY29tcG9uZW50IGJlaW5nIG51bWJlcmVkIDAuICAoTm90ZSB0aGF0IHRoZXNlCitpbmRleGVzIGFyZSBub3QgdGhlICJjb21wb25lbnQgSUQiIGNvZGVzIGFzc2lnbmVkIHRvIHRoZSBjb21wb25lbnRzLCBqdXN0Citwb3NpdGlvbmFsIGluZGV4ZXMuKQorCitUaGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBmb3IgZWFjaCBzY2FuIGFyZToKKwlTcwlaaWd6YWcgaW5kZXggb2YgZmlyc3QgY29lZmZpY2llbnQgaW5jbHVkZWQgaW4gc2NhbgorCVNlCVppZ3phZyBpbmRleCBvZiBsYXN0IGNvZWZmaWNpZW50IGluY2x1ZGVkIGluIHNjYW4KKwlBaAlaZXJvIGZvciBmaXJzdCBzY2FuIG9mIGEgY29lZmZpY2llbnQsIGVsc2UgQWwgb2YgcHJpb3Igc2NhbgorCUFsCVN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBsb3cgYml0IHBvc2l0aW9uIGZvciBzY2FuCitJZiB0aGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBhcmUgb21pdHRlZCwgdGhlIHZhbHVlcyAwLDYzLDAsMCBhcmUgdXNlZCwKK3Byb2R1Y2luZyBhIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgY2pwZWcgYXV0b21hdGljYWxseSBkZXRlcm1pbmVzIHdoZXRoZXIKK3RoZSBzY3JpcHQgcmVwcmVzZW50cyBhIHByb2dyZXNzaXZlIG9yIHNlcXVlbnRpYWwgZmlsZSwgYnkgb2JzZXJ2aW5nIHdoZXRoZXIKK1NzIGFuZCBTZSB2YWx1ZXMgb3RoZXIgdGhhbiAwIGFuZCA2MyBhcHBlYXIuICAoVGhlIC1wcm9ncmVzc2l2ZSBzd2l0Y2ggaXMKK25vdCBuZWVkZWQgdG8gc3BlY2lmeSB0aGlzOyBpbiBmYWN0LCBpdCBpcyBpZ25vcmVkIHdoZW4gLXNjYW5zIGFwcGVhcnMuKQorVGhlIHNjYW4gc2NyaXB0IG11c3QgbWVldCB0aGUgSlBFRyByZXN0cmljdGlvbnMgb24gcHJvZ3Jlc3Npb24gc2VxdWVuY2VzLgorKGNqcGVnIGNoZWNrcyB0aGF0IHRoZSBzcGVjJ3MgcmVxdWlyZW1lbnRzIGFyZSBvYmV5ZWQuKQorCitTY2FuIHNjcmlwdCBmaWxlcyBhcmUgZnJlZSBmb3JtYXQsIGluIHRoYXQgYXJiaXRyYXJ5IHdoaXRlc3BhY2UgY2FuIGFwcGVhcgorYmV0d2VlbiBudW1iZXJzIGFuZCBhcm91bmQgcHVuY3R1YXRpb24uICBBbHNvLCBjb21tZW50cyBjYW4gYmUgaW5jbHVkZWQ6IGEKK2NvbW1lbnQgc3RhcnRzIHdpdGggJyMnIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBGb3IgYWRkaXRpb25hbAorbGVnaWJpbGl0eSwgY29tbWFzIG9yIGRhc2hlcyBjYW4gYmUgcGxhY2VkIGJldHdlZW4gdmFsdWVzLiAgKEFjdHVhbGx5LCBhbnkKK3NpbmdsZSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgb3RoZXIgdGhhbiAnOicgb3IgJzsnIGNhbiBiZSBpbnNlcnRlZC4pICBGb3IKK2V4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHdvIHNjYW4gZGVmaW5pdGlvbnMgYXJlIGVxdWl2YWxlbnQ6CisJMCAxIDI6IDAgNjMgMCAwOworCTAsMSwyIDogMC02MywgMCwwIDsKKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgc2NhbiBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgYSBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQKK3NlcXVlbnRpYWwgSlBFRyBmaWxlOgorCisJMDsJCQkjIFkgb25seSBpbiBmaXJzdCBzY2FuCisJMSAyOwkJCSMgQ2IgYW5kIENyIGluIHNlY29uZCBzY2FuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHByb2dyZXNzaXZlIHNjYW4gc2NyaXB0IHVzaW5nIG9ubHkgc3BlY3RyYWwgc2VsZWN0aW9uCisobm8gc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKToKKworCSMgSW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgWSxDYixDcjoKKwkwLDEsMjogMC0wLCAgIDAsIDAgOworCSMgQUMgc2NhbnM6CisJMDogICAgIDEtMiwgICAwLCAwIDsJIyBGaXJzdCB0d28gWSBBQyBjb2VmZmljaWVudHMKKwkwOiAgICAgMy01LCAgIDAsIDAgOwkjIFRocmVlIG1vcmUKKwkxOiAgICAgMS02MywgIDAsIDAgOwkjIEFsbCBBQyBjb2VmZmljaWVudHMgZm9yIENiCisJMjogICAgIDEtNjMsICAwLCAwIDsJIyBBbGwgQUMgY29lZmZpY2llbnRzIGZvciBDcgorCTA6ICAgICA2LTksICAgMCwgMCA7CSMgTW9yZSBZIGNvZWZmaWNpZW50cworCTA6ICAgICAxMC02MywgMCwgMCA7CSMgUmVtYWluaW5nIFkgY29lZmZpY2llbnRzCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbiBzY3JpcHQuICBUaGlzIGlzIGVxdWl2YWxlbnQKK3RvIHRoZSBkZWZhdWx0IHNjcmlwdCB1c2VkIGJ5ICJjanBlZyAtcHJvZ3Jlc3NpdmUiIGZvciBZQ2JDciBpbWFnZXM6CisKKwkjIEluaXRpYWwgREMgc2NhbiBmb3IgWSxDYixDciAobG93ZXN0IGJpdCBub3Qgc2VudCkKKwkwLDEsMjogMC0wLCAgIDAsIDEgOworCSMgRmlyc3QgQUMgc2Nhbjogc2VuZCBmaXJzdCA1IFkgQUMgY29lZmZpY2llbnRzLCBtaW51cyAyIGxvd2VzdCBiaXRzOgorCTA6ICAgICAxLTUsICAgMCwgMiA7CisJIyBTZW5kIGFsbCBDcixDYiBBQyBjb2VmZmljaWVudHMsIG1pbnVzIGxvd2VzdCBiaXQ6CisJIyAoY2hyb21hIGRhdGEgaXMgdXN1YWxseSB0b28gc21hbGwgdG8gYmUgd29ydGggc3ViZGl2aWRpbmcgZnVydGhlcjsKKwkjICBidXQgbm90ZSB3ZSBzZW5kIENyIGZpcnN0IHNpbmNlIGV5ZSBpcyBsZWFzdCBzZW5zaXRpdmUgdG8gQ2IpCisJMjogICAgIDEtNjMsICAwLCAxIDsKKwkxOiAgICAgMS02MywgIDAsIDEgOworCSMgU2VuZCByZW1haW5pbmcgWSBBQyBjb2VmZmljaWVudHMsIG1pbnVzIDIgbG93ZXN0IGJpdHM6CisJMDogICAgIDYtNjMsICAwLCAyIDsKKwkjIFNlbmQgbmV4dC10by1sb3dlc3QgYml0IG9mIGFsbCBZIEFDIGNvZWZmaWNpZW50czoKKwkwOiAgICAgMS02MywgIDIsIDEgOworCSMgQXQgdGhpcyBwb2ludCB3ZSd2ZSBzZW50IGFsbCBidXQgdGhlIGxvd2VzdCBiaXQgb2YgYWxsIGNvZWZmaWNpZW50cy4KKwkjIFNlbmQgbG93ZXN0IGJpdCBvZiBEQyBjb2VmZmljaWVudHMKKwkwLDEsMjogMC0wLCAgIDEsIDAgOworCSMgU2VuZCBsb3dlc3QgYml0IG9mIEFDIGNvZWZmaWNpZW50cworCTI6ICAgICAxLTYzLCAgMSwgMCA7CisJMTogICAgIDEtNjMsICAxLCAwIDsKKwkjIFkgQUMgbG93ZXN0IGJpdCBzY2FuIGlzIGxhc3Q7IGl0J3MgdXN1YWxseSB0aGUgbGFyZ2VzdCBzY2FuCisJMDogICAgIDEtNjMsICAxLCAwIDsKKworSXQgbWF5IGJlIHdvcnRoIHBvaW50aW5nIG91dCB0aGF0IHRoaXMgc2NyaXB0IGlzIHR1bmVkIGZvciBxdWFsaXR5IHNldHRpbmdzCitvZiBhcm91bmQgNTAgdG8gNzUuICBGb3IgbG93ZXIgcXVhbGl0eSBzZXR0aW5ncywgeW91J2QgcHJvYmFibHkgd2FudCB0byB1c2UKK2Egc2NyaXB0IHdpdGggZmV3ZXIgc3RhZ2VzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAob3RoZXJ3aXNlIHRoZQoraW5pdGlhbCBzY2FucyB3aWxsIGJlIHJlYWxseSBiYWQpLiAgRm9yIGhpZ2hlciBxdWFsaXR5IHNldHRpbmdzLCB5b3UgbWlnaHQKK3dhbnQgdG8gdXNlIG1vcmUgc3RhZ2VzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAoc28gdGhhdCB0aGUgaW5pdGlhbAorc2NhbnMgYXJlIG5vdCB0b28gbGFyZ2UpLgpkaWZmIC0tZ2l0IGEvanBlZy93cmJtcC5jIGIvanBlZy93cmJtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODNiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3dyYm1wLmMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiB3cmJtcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBNaWNyb3NvZnQgIkJNUCIKKyAqIGZvcm1hdCAoTVMgV2luZG93cyAzLnggYW5kIE9TLzIgMS54IGZsYXZvcnMpLgorICogRWl0aGVyIDgtYml0IGNvbG9ybWFwcGVkIG9yIDI0LWJpdCBmdWxsLWNvbG9yIGZvcm1hdCBjYW4gYmUgd3JpdHRlbi4KKyAqIE5vIGNvbXByZXNzaW9uIGlzIHN1cHBvcnRlZC4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCisgKgorICogVGhpcyBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEphbWVzIEFydGh1ciBCb3VjaGVyLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBCTVBfU1VQUE9SVEVECisKKworLyoKKyAqIFRvIHN1cHBvcnQgMTItYml0IEpQRUcgZGF0YSwgd2UnZCBoYXZlIHRvIHNjYWxlIG91dHB1dCBkb3duIHRvIDggYml0cy4KKyAqIFRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKy8qCisgKiBTaW5jZSBCTVAgc3RvcmVzIHNjYW5saW5lcyBib3R0b20tdG8tdG9wLCB3ZSBoYXZlIHRvIGludmVydCB0aGUgaW1hZ2UKKyAqIGZyb20gSlBFRydzIHRvcC10by1ib3R0b20gb3JkZXIuICBUbyBkbyB0aGlzLCB3ZSBzYXZlIHRoZSBvdXRnb2luZyBkYXRhCisgKiBpbiBhIHZpcnR1YWwgYXJyYXkgZHVyaW5nIHB1dF9waXhlbF9yb3cgY2FsbHMsIHRoZW4gYWN0dWFsbHkgZW1pdCB0aGUKKyAqIEJNUCBmaWxlIGR1cmluZyBmaW5pc2hfb3V0cHV0LiAgVGhlIHZpcnR1YWwgYXJyYXkgY29udGFpbnMgb25lIEpTQU1QTEUgcGVyCisgKiBwaXhlbCBpZiB0aGUgb3V0cHV0IGlzIGdyYXlzY2FsZSBvciBjb2xvcm1hcHBlZCwgdGhyZWUgaWYgaXQgaXMgZnVsbCBjb2xvci4KKyAqLworCisvKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgYm9vbGVhbiBpc19vczI7CQkvKiBzYXZlcyB0aGUgT1MyIGZvcm1hdCByZXF1ZXN0IGZsYWcgKi8KKworICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiBuZWVkZWQgdG8gcmV2ZXJzZSByb3cgb3JkZXIgKi8KKyAgSkRJTUVOU0lPTiBkYXRhX3dpZHRoOwkvKiBKU0FNUExFcyBwZXIgcm93ICovCisgIEpESU1FTlNJT04gcm93X3dpZHRoOwkJLyogcGh5c2ljYWwgd2lkdGggb2Ygb25lIHJvdyBpbiB0aGUgQk1QIGZpbGUgKi8KKyAgaW50IHBhZF9ieXRlczsJCS8qIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIG5lZWRlZCBwZXIgcm93ICovCisgIEpESU1FTlNJT04gY3VyX291dHB1dF9yb3c7CS8qIG5leHQgcm93IyB0byB3cml0ZSB0byB2aXJ0dWFsIGFycmF5ICovCit9IGJtcF9kZXN0X3N0cnVjdDsKKwordHlwZWRlZiBibXBfZGVzdF9zdHJ1Y3QgKiBibXBfZGVzdF9wdHI7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK0xPQ0FMKHZvaWQpIHdyaXRlX2NvbG9ybWFwCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCwKKwkgICAgIGludCBtYXBfY29sb3JzLCBpbnQgbWFwX2VudHJ5X3NpemUpKTsKKworCisvKgorICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgorICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHdyaXRpbmcgMjQtYml0IHBpeGVscyAqLworeworICBibXBfZGVzdF9wdHIgZGVzdCA9IChibXBfZGVzdF9wdHIpIGRpbmZvOworICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIGludCBwYWQ7CisKKyAgLyogQWNjZXNzIG5leHQgcm93IGluIHZpcnR1YWwgYXJyYXkgKi8KKyAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT53aG9sZV9pbWFnZSwKKyAgICAgZGVzdC0+Y3VyX291dHB1dF9yb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgZGVzdC0+Y3VyX291dHB1dF9yb3crKzsKKworICAvKiBUcmFuc2ZlciBkYXRhLiAgTm90ZSBkZXN0aW5hdGlvbiB2YWx1ZXMgbXVzdCBiZSBpbiBCR1Igb3JkZXIKKyAgICogKGV2ZW4gdGhvdWdoIE1pY3Jvc29mdCdzIG93biBkb2N1bWVudHMgc2F5IHRoZSBvcHBvc2l0ZSkuCisgICAqLworICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIG91dHB0ciA9IGltYWdlX3B0clswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIG91dHB0clsyXSA9ICppbnB0cisrOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCisgICAgb3V0cHRyWzFdID0gKmlucHRyKys7CisgICAgb3V0cHRyWzBdID0gKmlucHRyKys7CisgICAgb3V0cHRyICs9IDM7CisgIH0KKworICAvKiBaZXJvIG91dCB0aGUgcGFkIGJ5dGVzLiAqLworICBwYWQgPSBkZXN0LT5wYWRfYnl0ZXM7CisgIHdoaWxlICgtLXBhZCA+PSAwKQorICAgICpvdXRwdHIrKyA9IDA7Cit9CisKK01FVEhPRERFRih2b2lkKQorcHV0X2dyYXlfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJICAgICAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgZ3JheXNjYWxlIE9SIHF1YW50aXplZCBjb2xvciBvdXRwdXQgKi8KK3sKKyAgYm1wX2Rlc3RfcHRyIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKSBkaW5mbzsKKyAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBpbnQgcGFkOworCisgIC8qIEFjY2VzcyBuZXh0IHJvdyBpbiB2aXJ0dWFsIGFycmF5ICovCisgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+d2hvbGVfaW1hZ2UsCisgICAgIGRlc3QtPmN1cl9vdXRwdXRfcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgIGRlc3QtPmN1cl9vdXRwdXRfcm93Kys7CisKKyAgLyogVHJhbnNmZXIgZGF0YS4gKi8KKyAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBvdXRwdHIgPSBpbWFnZV9wdHJbMF07CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAqb3V0cHRyKysgPSAqaW5wdHIrKzsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLworICB9CisKKyAgLyogWmVybyBvdXQgdGhlIHBhZCBieXRlcy4gKi8KKyAgcGFkID0gZGVzdC0+cGFkX2J5dGVzOworICB3aGlsZSAoLS1wYWQgPj0gMCkKKyAgICAqb3V0cHRyKysgPSAwOworfQorCisKKy8qCisgKiBTdGFydHVwOiBub3JtYWxseSB3cml0ZXMgdGhlIGZpbGUgaGVhZGVyLgorICogSW4gdGhpcyBtb2R1bGUgd2UgbWF5IGFzIHdlbGwgcG9zdHBvbmUgZXZlcnl0aGluZyB1bnRpbCBmaW5pc2hfb3V0cHV0LgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfb3V0cHV0X2JtcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIC8qIG5vIHdvcmsgaGVyZSAqLworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqCisgKiBIZXJlIGlzIHdoZXJlIHdlIHJlYWxseSBvdXRwdXQgdGhlIEJNUCBmaWxlLgorICoKKyAqIEZpcnN0LCByb3V0aW5lcyB0byB3cml0ZSB0aGUgV2luZG93cyBhbmQgT1MvMiB2YXJpYW50cyBvZiB0aGUgZmlsZSBoZWFkZXIuCisgKi8KKworTE9DQUwodm9pZCkKK3dyaXRlX2JtcF9oZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0KQorLyogV3JpdGUgYSBXaW5kb3dzLXN0eWxlIEJNUCBmaWxlIGhlYWRlciwgaW5jbHVkaW5nIGNvbG9ybWFwIGlmIG5lZWRlZCAqLworeworICBjaGFyIGJtcGZpbGVoZWFkZXJbMTRdOworICBjaGFyIGJtcGluZm9oZWFkZXJbNDBdOworI2RlZmluZSBQVVRfMkIoYXJyYXksb2Zmc2V0LHZhbHVlKSAgXAorCShhcnJheVtvZmZzZXRdID0gKGNoYXIpICgodmFsdWUpICYgMHhGRiksIFwKKwkgYXJyYXlbb2Zmc2V0KzFdID0gKGNoYXIpICgoKHZhbHVlKSA+PiA4KSAmIDB4RkYpKQorI2RlZmluZSBQVVRfNEIoYXJyYXksb2Zmc2V0LHZhbHVlKSAgXAorCShhcnJheVtvZmZzZXRdID0gKGNoYXIpICgodmFsdWUpICYgMHhGRiksIFwKKwkgYXJyYXlbb2Zmc2V0KzFdID0gKGNoYXIpICgoKHZhbHVlKSA+PiA4KSAmIDB4RkYpLCBcCisJIGFycmF5W29mZnNldCsyXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gMTYpICYgMHhGRiksIFwKKwkgYXJyYXlbb2Zmc2V0KzNdID0gKGNoYXIpICgoKHZhbHVlKSA+PiAyNCkgJiAweEZGKSkKKyAgSU5UMzIgaGVhZGVyc2l6ZSwgYmZTaXplOworICBpbnQgYml0c19wZXJfcGl4ZWwsIGNtYXBfZW50cmllczsKKworICAvKiBDb21wdXRlIGNvbG9ybWFwIHNpemUgYW5kIHRvdGFsIGZpbGUgc2l6ZSAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICAgIC8qIENvbG9ybWFwcGVkIFJHQiAqLworICAgICAgYml0c19wZXJfcGl4ZWwgPSA4OworICAgICAgY21hcF9lbnRyaWVzID0gMjU2OworICAgIH0gZWxzZSB7CisgICAgICAvKiBVbnF1YW50aXplZCwgZnVsbCBjb2xvciBSR0IgKi8KKyAgICAgIGJpdHNfcGVyX3BpeGVsID0gMjQ7CisgICAgICBjbWFwX2VudHJpZXMgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBHcmF5c2NhbGUgb3V0cHV0LiAgV2UgbmVlZCB0byBmYWtlIGEgMjU2LWVudHJ5IGNvbG9ybWFwLiAqLworICAgIGJpdHNfcGVyX3BpeGVsID0gODsKKyAgICBjbWFwX2VudHJpZXMgPSAyNTY7CisgIH0KKyAgLyogRmlsZSBzaXplICovCisgIGhlYWRlcnNpemUgPSAxNCArIDQwICsgY21hcF9lbnRyaWVzICogNDsgLyogSGVhZGVyIGFuZCBjb2xvcm1hcCAqLworICBiZlNpemUgPSBoZWFkZXJzaXplICsgKElOVDMyKSBkZXN0LT5yb3dfd2lkdGggKiAoSU5UMzIpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAKKyAgLyogU2V0IHVudXNlZCBmaWVsZHMgb2YgaGVhZGVyIHRvIDAgKi8KKyAgTUVNWkVSTyhibXBmaWxlaGVhZGVyLCBTSVpFT0YoYm1wZmlsZWhlYWRlcikpOworICBNRU1aRVJPKGJtcGluZm9oZWFkZXIsIFNJWkVPRihibXBpbmZvaGVhZGVyKSk7CisKKyAgLyogRmlsbCB0aGUgZmlsZSBoZWFkZXIgKi8KKyAgYm1wZmlsZWhlYWRlclswXSA9IDB4NDI7CS8qIGZpcnN0IDIgYnl0ZXMgYXJlIEFTQ0lJICdCJywgJ00nICovCisgIGJtcGZpbGVoZWFkZXJbMV0gPSAweDREOworICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMiwgYmZTaXplKTsgLyogYmZTaXplICovCisgIC8qIHdlIGxlYXZlIGJmUmVzZXJ2ZWQxICYgYmZSZXNlcnZlZDIgPSAwICovCisgIFBVVF80QihibXBmaWxlaGVhZGVyLCAxMCwgaGVhZGVyc2l6ZSk7IC8qIGJmT2ZmQml0cyAqLworCisgIC8qIEZpbGwgdGhlIGluZm8gaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUElORk9IRUFERVIpICovCisgIFBVVF8yQihibXBpbmZvaGVhZGVyLCAwLCA0MCk7CS8qIGJpU2l6ZSAqLworICBQVVRfNEIoYm1waW5mb2hlYWRlciwgNCwgY2luZm8tPm91dHB1dF93aWR0aCk7IC8qIGJpV2lkdGggKi8KKyAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDgsIGNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsgLyogYmlIZWlnaHQgKi8KKyAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDEyLCAxKTsJLyogYmlQbGFuZXMgLSBtdXN0IGJlIDEgKi8KKyAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDE0LCBiaXRzX3Blcl9waXhlbCk7IC8qIGJpQml0Q291bnQgKi8KKyAgLyogd2UgbGVhdmUgYmlDb21wcmVzc2lvbiA9IDAsIGZvciBub25lICovCisgIC8qIHdlIGxlYXZlIGJpU2l6ZUltYWdlID0gMDsgdGhpcyBpcyBjb3JyZWN0IGZvciB1bmNvbXByZXNzZWQgZGF0YSAqLworICBpZiAoY2luZm8tPmRlbnNpdHlfdW5pdCA9PSAyKSB7IC8qIGlmIGhhdmUgZGVuc2l0eSBpbiBkb3RzL2NtLCB0aGVuICovCisgICAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDI0LCAoSU5UMzIpIChjaW5mby0+WF9kZW5zaXR5KjEwMCkpOyAvKiBYUGVscy9NICovCisgICAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDI4LCAoSU5UMzIpIChjaW5mby0+WV9kZW5zaXR5KjEwMCkpOyAvKiBYUGVscy9NICovCisgIH0KKyAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDMyLCBjbWFwX2VudHJpZXMpOyAvKiBiaUNsclVzZWQgKi8KKyAgLyogd2UgbGVhdmUgYmlDbHJJbXBvcnRhbnQgPSAwICovCisKKyAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBmaWxlaGVhZGVyLCAxNCkgIT0gKHNpemVfdCkgMTQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKKyAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBpbmZvaGVhZGVyLCA0MCkgIT0gKHNpemVfdCkgNDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKKworICBpZiAoY21hcF9lbnRyaWVzID4gMCkKKyAgICB3cml0ZV9jb2xvcm1hcChjaW5mbywgZGVzdCwgY21hcF9lbnRyaWVzLCA0KTsKK30KKworCitMT0NBTCh2b2lkKQord3JpdGVfb3MyX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QpCisvKiBXcml0ZSBhbiBPUzItc3R5bGUgQk1QIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgY29sb3JtYXAgaWYgbmVlZGVkICovCit7CisgIGNoYXIgYm1wZmlsZWhlYWRlclsxNF07CisgIGNoYXIgYm1wY29yZWhlYWRlclsxMl07CisgIElOVDMyIGhlYWRlcnNpemUsIGJmU2l6ZTsKKyAgaW50IGJpdHNfcGVyX3BpeGVsLCBjbWFwX2VudHJpZXM7CisKKyAgLyogQ29tcHV0ZSBjb2xvcm1hcCBzaXplIGFuZCB0b3RhbCBmaWxlIHNpemUgKi8KKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgICAvKiBDb2xvcm1hcHBlZCBSR0IgKi8KKyAgICAgIGJpdHNfcGVyX3BpeGVsID0gODsKKyAgICAgIGNtYXBfZW50cmllcyA9IDI1NjsKKyAgICB9IGVsc2UgeworICAgICAgLyogVW5xdWFudGl6ZWQsIGZ1bGwgY29sb3IgUkdCICovCisgICAgICBiaXRzX3Blcl9waXhlbCA9IDI0OworICAgICAgY21hcF9lbnRyaWVzID0gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogR3JheXNjYWxlIG91dHB1dC4gIFdlIG5lZWQgdG8gZmFrZSBhIDI1Ni1lbnRyeSBjb2xvcm1hcC4gKi8KKyAgICBiaXRzX3Blcl9waXhlbCA9IDg7CisgICAgY21hcF9lbnRyaWVzID0gMjU2OworICB9CisgIC8qIEZpbGUgc2l6ZSAqLworICBoZWFkZXJzaXplID0gMTQgKyAxMiArIGNtYXBfZW50cmllcyAqIDM7IC8qIEhlYWRlciBhbmQgY29sb3JtYXAgKi8KKyAgYmZTaXplID0gaGVhZGVyc2l6ZSArIChJTlQzMikgZGVzdC0+cm93X3dpZHRoICogKElOVDMyKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKKyAgCisgIC8qIFNldCB1bnVzZWQgZmllbGRzIG9mIGhlYWRlciB0byAwICovCisgIE1FTVpFUk8oYm1wZmlsZWhlYWRlciwgU0laRU9GKGJtcGZpbGVoZWFkZXIpKTsKKyAgTUVNWkVSTyhibXBjb3JlaGVhZGVyLCBTSVpFT0YoYm1wY29yZWhlYWRlcikpOworCisgIC8qIEZpbGwgdGhlIGZpbGUgaGVhZGVyICovCisgIGJtcGZpbGVoZWFkZXJbMF0gPSAweDQyOwkvKiBmaXJzdCAyIGJ5dGVzIGFyZSBBU0NJSSAnQicsICdNJyAqLworICBibXBmaWxlaGVhZGVyWzFdID0gMHg0RDsKKyAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDIsIGJmU2l6ZSk7IC8qIGJmU2l6ZSAqLworICAvKiB3ZSBsZWF2ZSBiZlJlc2VydmVkMSAmIGJmUmVzZXJ2ZWQyID0gMCAqLworICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMTAsIGhlYWRlcnNpemUpOyAvKiBiZk9mZkJpdHMgKi8KKworICAvKiBGaWxsIHRoZSBpbmZvIGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBDT1JFSEVBREVSKSAqLworICBQVVRfMkIoYm1wY29yZWhlYWRlciwgMCwgMTIpOwkvKiBiY1NpemUgKi8KKyAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDQsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOyAvKiBiY1dpZHRoICovCisgIFBVVF8yQihibXBjb3JlaGVhZGVyLCA2LCBjaW5mby0+b3V0cHV0X2hlaWdodCk7IC8qIGJjSGVpZ2h0ICovCisgIFBVVF8yQihibXBjb3JlaGVhZGVyLCA4LCAxKTsJLyogYmNQbGFuZXMgLSBtdXN0IGJlIDEgKi8KKyAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDEwLCBiaXRzX3Blcl9waXhlbCk7IC8qIGJjQml0Q291bnQgKi8KKworICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGZpbGVoZWFkZXIsIDE0KSAhPSAoc2l6ZV90KSAxNCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGNvcmVoZWFkZXIsIDEyKSAhPSAoc2l6ZV90KSAxMikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworCisgIGlmIChjbWFwX2VudHJpZXMgPiAwKQorICAgIHdyaXRlX2NvbG9ybWFwKGNpbmZvLCBkZXN0LCBjbWFwX2VudHJpZXMsIDMpOworfQorCisKKy8qCisgKiBXcml0ZSB0aGUgY29sb3JtYXAuCisgKiBXaW5kb3dzIHVzZXMgQkdSMCBtYXAgZW50cmllczsgT1MvMiB1c2VzIEJHUiBlbnRyaWVzLgorICovCisKK0xPQ0FMKHZvaWQpCit3cml0ZV9jb2xvcm1hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QsCisJCWludCBtYXBfY29sb3JzLCBpbnQgbWFwX2VudHJ5X3NpemUpCit7CisgIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBjaW5mby0+Y29sb3JtYXA7CisgIGludCBudW1fY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICBGSUxFICogb3V0ZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKKyAgaW50IGk7CisKKyAgaWYgKGNvbG9ybWFwICE9IE5VTEwpIHsKKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID09IDMpIHsKKyAgICAgIC8qIE5vcm1hbCBjYXNlIHdpdGggUkdCIGNvbG9ybWFwICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgaSsrKSB7CisJcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzJdW2ldKSwgb3V0ZmlsZSk7CisJcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzFdW2ldKSwgb3V0ZmlsZSk7CisJcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7CisJaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCisJICBwdXRjKDAsIG91dGZpbGUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBHcmF5c2NhbGUgY29sb3JtYXAgKG9ubHkgaGFwcGVucyB3aXRoIGdyYXlzY2FsZSBxdWFudGl6YXRpb24pICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgaSsrKSB7CisJcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7CisJcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7CisJcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7CisJaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCisJICBwdXRjKDAsIG91dGZpbGUpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBJZiBubyBjb2xvcm1hcCwgbXVzdCBiZSBncmF5c2NhbGUgZGF0YS4gIEdlbmVyYXRlIGEgbGluZWFyICJtYXAiLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgcHV0YyhpLCBvdXRmaWxlKTsKKyAgICAgIHB1dGMoaSwgb3V0ZmlsZSk7CisgICAgICBwdXRjKGksIG91dGZpbGUpOworICAgICAgaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCisJcHV0YygwLCBvdXRmaWxlKTsKKyAgICB9CisgIH0KKyAgLyogUGFkIGNvbG9ybWFwIHdpdGggemVyb3MgdG8gZW5zdXJlIHNwZWNpZmllZCBudW1iZXIgb2YgY29sb3JtYXAgZW50cmllcyAqLyAKKyAgaWYgKGkgPiBtYXBfY29sb3JzKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgaSk7CisgIGZvciAoOyBpIDwgbWFwX2NvbG9yczsgaSsrKSB7CisgICAgcHV0YygwLCBvdXRmaWxlKTsKKyAgICBwdXRjKDAsIG91dGZpbGUpOworICAgIHB1dGMoMCwgb3V0ZmlsZSk7CisgICAgaWYgKG1hcF9lbnRyeV9zaXplID09IDQpCisgICAgICBwdXRjKDAsIG91dGZpbGUpOworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfb3V0cHV0X2JtcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIGJtcF9kZXN0X3B0ciBkZXN0ID0gKGJtcF9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIEZJTEUgKiBvdXRmaWxlID0gZGVzdC0+cHViLm91dHB1dF9maWxlOworICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgZGF0YV9wdHI7CisgIEpESU1FTlNJT04gcm93OworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworCisgIC8qIFdyaXRlIHRoZSBoZWFkZXIgYW5kIGNvbG9ybWFwICovCisgIGlmIChkZXN0LT5pc19vczIpCisgICAgd3JpdGVfb3MyX2hlYWRlcihjaW5mbywgZGVzdCk7CisgIGVsc2UKKyAgICB3cml0ZV9ibXBfaGVhZGVyKGNpbmZvLCBkZXN0KTsKKworICAvKiBXcml0ZSB0aGUgZmlsZSBib2R5IGZyb20gb3VyIHZpcnR1YWwgYXJyYXkgKi8KKyAgZm9yIChyb3cgPSBjaW5mby0+b3V0cHV0X2hlaWdodDsgcm93ID4gMDsgcm93LS0pIHsKKyAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAobG9uZykgKGNpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gcm93KTsKKyAgICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKKyAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgIH0KKyAgICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+d2hvbGVfaW1hZ2UsIHJvdy0xLCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworICAgIGRhdGFfcHRyID0gaW1hZ2VfcHRyWzBdOworICAgIGZvciAoY29sID0gZGVzdC0+cm93X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcHV0YyhHRVRKU0FNUExFKCpkYXRhX3B0ciksIG91dGZpbGUpOworICAgICAgZGF0YV9wdHIrKzsKKyAgICB9CisgIH0KKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpCisgICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKKworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGZmbHVzaChvdXRmaWxlKTsKKyAgaWYgKGZlcnJvcihvdXRmaWxlKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBCTVAgZm9ybWF0IG91dHB1dC4KKyAqLworCitHTE9CQUwoZGpwZWdfZGVzdF9wdHIpCitqaW5pdF93cml0ZV9ibXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfb3MyKQoreworICBibXBfZGVzdF9wdHIgZGVzdDsKKyAgSkRJTUVOU0lPTiByb3dfd2lkdGg7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLworICBkZXN0ID0gKGJtcF9kZXN0X3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YoYm1wX2Rlc3Rfc3RydWN0KSk7CisgIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfYm1wOworICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfYm1wOworICBkZXN0LT5pc19vczIgPSBpc19vczI7CisKKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgeworICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7CisgIH0gZWxzZSBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZ3JheV9yb3dzOworICAgIGVsc2UKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOworICB9IGVsc2UgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0NPTE9SU1BBQ0UpOworICB9CisKKyAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworCisgIC8qIERldGVybWluZSB3aWR0aCBvZiByb3dzIGluIHRoZSBCTVAgZmlsZSAocGFkZGVkIHRvIDQtYnl0ZSBib3VuZGFyeSkuICovCisgIHJvd193aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHM7CisgIGRlc3QtPmRhdGFfd2lkdGggPSByb3dfd2lkdGg7CisgIHdoaWxlICgocm93X3dpZHRoICYgMykgIT0gMCkgcm93X3dpZHRoKys7CisgIGRlc3QtPnJvd193aWR0aCA9IHJvd193aWR0aDsKKyAgZGVzdC0+cGFkX2J5dGVzID0gKGludCkgKHJvd193aWR0aCAtIGRlc3QtPmRhdGFfd2lkdGgpOworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBpbnZlcnNpb24gYXJyYXksIHByZXBhcmUgZm9yIHdyaXRlIHBhc3MgKi8KKyAgZGVzdC0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisgICAgIHJvd193aWR0aCwgY2luZm8tPm91dHB1dF9oZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKKyAgZGVzdC0+Y3VyX291dHB1dF9yb3cgPSAwOworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisgICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOyAvKiBjb3VudCBmaWxlIGlucHV0IGFzIHNlcGFyYXRlIHBhc3MgKi8KKyAgfQorCisgIC8qIENyZWF0ZSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KKyAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIHJvd193aWR0aCwgKEpESU1FTlNJT04pIDEpOworICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisKKyAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKK30KKworI2VuZGlmIC8qIEJNUF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvd3JnaWYuYyBiL2pwZWcvd3JnaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmU4MzI4Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy93cmdpZi5jCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogd3JnaWYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gR0lGIGZvcm1hdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IHRvIGF2b2lkIGVudGFuZ2xlbWVudHMgd2l0aCBVbmlzeXMnIHBhdGVudCBvbiBMWlcgY29tcHJlc3Npb24sICAgKgorICogdGhpcyBjb2RlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIG91dHB1dCAidW5jb21wcmVzc2VkIEdJRiIgZmlsZXMuICAgICAgICAqCisgKiBUaGVyZSBpcyBubyB0cmFjZSBvZiB0aGUgTFpXIGFsZ29yaXRobSBpbiB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KKyAqLworCisvKgorICogVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gcHBtdG9naWYgZnJvbSB0aGUgUEJNUExVUyBkaXN0cmlidXRpb24KKyAqIG9mIEZlYi4gMTk5MS4gIFRoYXQgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2U6CisgKiAgICBCYXNlZCBvbiBHSUZFTkNPREUgYnkgRGF2aWQgUm93bGV5IDxtZ2FyZGlAd2F0ZHNjdS53YXRlcmxvby5lZHU+LgorICogICAgTGVtcGVsLVppdiBjb21wcmVzc2lvbiBiYXNlZCBvbiAiY29tcHJlc3MiIGJ5IFNwZW5jZXIgVy4gVGhvbWFzIGV0IGFsLgorICogICAgQ29weXJpZ2h0IChDKSAxOTg5IGJ5IEplZiBQb3NrYW56ZXIuCisgKiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqICAgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKKyAqICAgIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiAgICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiAgICBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgorICogICAgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBXZSBhcmUgYWxzbyByZXF1aXJlZCB0byBzdGF0ZSB0aGF0CisgKiAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCisgKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgorICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBHSUZfU1VQUE9SVEVECisKKworLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayBzYXZlcyBwYXNzaW5nIHNlcGFyYXRlIHBhcm0gKi8KKworICAvKiBTdGF0ZSBmb3IgcGFja2luZyB2YXJpYWJsZS13aWR0aCBjb2RlcyBpbnRvIGEgYml0c3RyZWFtICovCisgIGludCBuX2JpdHM7CQkJLyogY3VycmVudCBudW1iZXIgb2YgYml0cy9jb2RlICovCisgIGludCBtYXhjb2RlOwkJCS8qIG1heGltdW0gY29kZSwgZ2l2ZW4gbl9iaXRzICovCisgIElOVDMyIGN1cl9hY2N1bTsJCS8qIGhvbGRzIGJpdHMgbm90IHlldCBvdXRwdXQgKi8KKyAgaW50IGN1cl9iaXRzOwkJCS8qICMgb2YgYml0cyBpbiBjdXJfYWNjdW0gKi8KKworICAvKiBTdGF0ZSBmb3IgR0lGIGNvZGUgYXNzaWdubWVudCAqLworICBpbnQgQ2xlYXJDb2RlOwkJLyogY2xlYXIgY29kZSAoZG9lc24ndCBjaGFuZ2UpICovCisgIGludCBFT0ZDb2RlOwkJCS8qIEVPRiBjb2RlIChkaXR0bykgKi8KKyAgaW50IGNvZGVfY291bnRlcjsJCS8qIGNvdW50cyBvdXRwdXQgc3ltYm9scyAqLworCisgIC8qIEdJRiBkYXRhIHBhY2tldCBjb25zdHJ1Y3Rpb24gYnVmZmVyICovCisgIGludCBieXRlc2lucGt0OwkJLyogIyBvZiBieXRlcyBpbiBjdXJyZW50IHBhY2tldCAqLworICBjaGFyIHBhY2tldGJ1ZlsyNTZdOwkJLyogd29ya3NwYWNlIGZvciBhY2N1bXVsYXRpbmcgcGFja2V0ICovCisKK30gZ2lmX2Rlc3Rfc3RydWN0OworCit0eXBlZGVmIGdpZl9kZXN0X3N0cnVjdCAqIGdpZl9kZXN0X3B0cjsKKworLyogTGFyZ2VzdCB2YWx1ZSB0aGF0IHdpbGwgZml0IGluIE4gYml0cyAqLworI2RlZmluZSBNQVhDT0RFKG5fYml0cykJKCgxIDw8IChuX2JpdHMpKSAtIDEpCisKKworLyoKKyAqIFJvdXRpbmVzIHRvIHBhY2thZ2UgZmluaXNoZWQgZGF0YSBieXRlcyBpbnRvIEdJRiBkYXRhIGJsb2Nrcy4KKyAqIEEgZGF0YSBibG9jayBjb25zaXN0cyBvZiBhIGNvdW50IGJ5dGUgKDEuLjI1NSkgYW5kIHRoYXQgbWFueSBkYXRhIGJ5dGVzLgorICovCisKK0xPQ0FMKHZvaWQpCitmbHVzaF9wYWNrZXQgKGdpZl9kZXN0X3B0ciBkaW5mbykKKy8qIGZsdXNoIGFueSBhY2N1bXVsYXRlZCBkYXRhICovCit7CisgIGlmIChkaW5mby0+Ynl0ZXNpbnBrdCA+IDApIHsJLyogbmV2ZXIgd3JpdGUgemVyby1sZW5ndGggcGFja2V0ICovCisgICAgZGluZm8tPnBhY2tldGJ1ZlswXSA9IChjaGFyKSBkaW5mby0+Ynl0ZXNpbnBrdCsrOworICAgIGlmIChKRldSSVRFKGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUsIGRpbmZvLT5wYWNrZXRidWYsIGRpbmZvLT5ieXRlc2lucGt0KQorCSE9IChzaXplX3QpIGRpbmZvLT5ieXRlc2lucGt0KQorICAgICAgRVJSRVhJVChkaW5mby0+Y2luZm8sIEpFUlJfRklMRV9XUklURSk7CisgICAgZGluZm8tPmJ5dGVzaW5wa3QgPSAwOworICB9Cit9CisKKworLyogQWRkIGEgY2hhcmFjdGVyIHRvIGN1cnJlbnQgcGFja2V0OyBmbHVzaCB0byBkaXNrIGlmIG5lY2Vzc2FyeSAqLworI2RlZmluZSBDSEFSX09VVChkaW5mbyxjKSAgXAorCXsgKGRpbmZvKS0+cGFja2V0YnVmWysrKGRpbmZvKS0+Ynl0ZXNpbnBrdF0gPSAoY2hhcikgKGMpOyAgXAorCSAgICBpZiAoKGRpbmZvKS0+Ynl0ZXNpbnBrdCA+PSAyNTUpICBcCisJICAgICAgZmx1c2hfcGFja2V0KGRpbmZvKTsgIFwKKwl9CisKKworLyogUm91dGluZSB0byBjb252ZXJ0IHZhcmlhYmxlLXdpZHRoIGNvZGVzIGludG8gYSBieXRlIHN0cmVhbSAqLworCitMT0NBTCh2b2lkKQorb3V0cHV0IChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBjb2RlKQorLyogRW1pdCBhIGNvZGUgb2Ygbl9iaXRzIGJpdHMgKi8KKy8qIFVzZXMgY3VyX2FjY3VtIGFuZCBjdXJfYml0cyB0byByZWJsb2NrIGludG8gOC1iaXQgYnl0ZXMgKi8KK3sKKyAgZGluZm8tPmN1cl9hY2N1bSB8PSAoKElOVDMyKSBjb2RlKSA8PCBkaW5mby0+Y3VyX2JpdHM7CisgIGRpbmZvLT5jdXJfYml0cyArPSBkaW5mby0+bl9iaXRzOworCisgIHdoaWxlIChkaW5mby0+Y3VyX2JpdHMgPj0gOCkgeworICAgIENIQVJfT1VUKGRpbmZvLCBkaW5mby0+Y3VyX2FjY3VtICYgMHhGRik7CisgICAgZGluZm8tPmN1cl9hY2N1bSA+Pj0gODsKKyAgICBkaW5mby0+Y3VyX2JpdHMgLT0gODsKKyAgfQorfQorCisKKy8qIFRoZSBwc2V1ZG8tY29tcHJlc3Npb24gYWxnb3JpdGhtLgorICoKKyAqIEluIHRoaXMgbW9kdWxlIHdlIHNpbXBseSBvdXRwdXQgZWFjaCBwaXhlbCB2YWx1ZSBhcyBhIHNlcGFyYXRlIHN5bWJvbDsKKyAqIHRodXMsIG5vIGNvbXByZXNzaW9uIG9jY3Vycy4gIEluIGZhY3QsIHRoZXJlIGlzIGV4cGFuc2lvbiBvZiBvbmUgYml0IHBlcgorICogcGl4ZWwsIGJlY2F1c2Ugd2UgdXNlIGEgc3ltYm9sIHdpZHRoIG9uZSBiaXQgd2lkZXIgdGhhbiB0aGUgcGl4ZWwgd2lkdGguCisgKgorICogR0lGIG9yZGluYXJpbHkgdXNlcyB2YXJpYWJsZS13aWR0aCBzeW1ib2xzLCBhbmQgdGhlIGRlY29kZXIgd2lsbCBleHBlY3QKKyAqIHRvIHJhdGNoZXQgdXAgdGhlIHN5bWJvbCB3aWR0aCBhZnRlciBhIGZpeGVkIG51bWJlciBvZiBzeW1ib2xzLgorICogVG8gc2ltcGxpZnkgdGhlIGxvZ2ljIGFuZCBrZWVwIHRoZSBleHBhbnNpb24gcGVuYWx0eSBkb3duLCB3ZSBlbWl0IGEKKyAqIEdJRiBDbGVhciBjb2RlIHRvIHJlc2V0IHRoZSBkZWNvZGVyIGp1c3QgYmVmb3JlIHRoZSB3aWR0aCB3b3VsZCByYXRjaGV0IHVwLgorICogVGh1cywgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGhhdmUgdGhlIHNhbWUgYml0IHdpZHRoLgorICogTm90ZSB0aGF0IGVtaXR0aW5nIHRoZSBDbGVhciBjb2RlcyBhdCB0aGUgcmlnaHQgdGltZXMgaXMgYSBtZXJlIG1hdHRlciBvZgorICogY291bnRpbmcgb3V0cHV0IHN5bWJvbHMgYW5kIGlzIGluIG5vIHdheSBkZXBlbmRlbnQgb24gdGhlIExaVyBwYXRlbnQuCisgKgorICogV2l0aCBhIHNtYWxsIGJhc2ljIHBpeGVsIHdpZHRoIChsb3cgY29sb3IgY291bnQpLCBDbGVhciBjb2RlcyB3aWxsIGJlCisgKiBuZWVkZWQgdmVyeSBmcmVxdWVudGx5LCBjYXVzaW5nIHRoZSBmaWxlIHRvIGV4cGFuZCBldmVuIG1vcmUuICBTbyB0aGlzCisgKiBzaW1wbGlzdGljIGFwcHJvYWNoIHdvdWxkbid0IHdvcmsgdG9vIHdlbGwgb24gYmlsZXZlbCBpbWFnZXMsIGZvciBleGFtcGxlLgorICogQnV0IGZvciBvdXRwdXQgb2YgSlBFRyBjb252ZXJzaW9ucyB0aGUgcGl4ZWwgd2lkdGggd2lsbCB1c3VhbGx5IGJlIDggYml0cworICogKDEyOSB0byAyNTYgY29sb3JzKSwgc28gdGhlIG92ZXJoZWFkIGFkZGVkIGJ5IENsZWFyIHN5bWJvbHMgaXMgb25seSBhYm91dAorICogb25lIHN5bWJvbCBpbiBldmVyeSAyNTYuCisgKi8KKworTE9DQUwodm9pZCkKK2NvbXByZXNzX2luaXQgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGlfYml0cykKKy8qIEluaXRpYWxpemUgcHNldWRvLWNvbXByZXNzb3IgKi8KK3sKKyAgLyogaW5pdCBhbGwgdGhlIHN0YXRlIHZhcmlhYmxlcyAqLworICBkaW5mby0+bl9iaXRzID0gaV9iaXRzOworICBkaW5mby0+bWF4Y29kZSA9IE1BWENPREUoZGluZm8tPm5fYml0cyk7CisgIGRpbmZvLT5DbGVhckNvZGUgPSAoMSA8PCAoaV9iaXRzIC0gMSkpOworICBkaW5mby0+RU9GQ29kZSA9IGRpbmZvLT5DbGVhckNvZGUgKyAxOworICBkaW5mby0+Y29kZV9jb3VudGVyID0gZGluZm8tPkNsZWFyQ29kZSArIDI7CisgIC8qIGluaXQgb3V0cHV0IGJ1ZmZlcmluZyB2YXJzICovCisgIGRpbmZvLT5ieXRlc2lucGt0ID0gMDsKKyAgZGluZm8tPmN1cl9hY2N1bSA9IDA7CisgIGRpbmZvLT5jdXJfYml0cyA9IDA7CisgIC8qIEdJRiBzcGVjaWZpZXMgYW4gaW5pdGlhbCBDbGVhciBjb2RlICovCisgIG91dHB1dChkaW5mbywgZGluZm8tPkNsZWFyQ29kZSk7Cit9CisKKworTE9DQUwodm9pZCkKK2NvbXByZXNzX3BpeGVsIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBjKQorLyogQWNjZXB0IGFuZCAiY29tcHJlc3MiIG9uZSBwaXhlbCB2YWx1ZS4KKyAqIFRoZSBnaXZlbiB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBuX2JpdHMgd2lkZS4KKyAqLworeworICAvKiBPdXRwdXQgdGhlIGdpdmVuIHBpeGVsIHZhbHVlIGFzIGEgc3ltYm9sLiAqLworICBvdXRwdXQoZGluZm8sIGMpOworICAvKiBJc3N1ZSBDbGVhciBjb2RlcyBvZnRlbiBlbm91Z2ggdG8ga2VlcCB0aGUgcmVhZGVyIGZyb20gcmF0Y2hldGluZyB1cAorICAgKiBpdHMgc3ltYm9sIHNpemUuCisgICAqLworICBpZiAoZGluZm8tPmNvZGVfY291bnRlciA8IGRpbmZvLT5tYXhjb2RlKSB7CisgICAgZGluZm8tPmNvZGVfY291bnRlcisrOworICB9IGVsc2UgeworICAgIG91dHB1dChkaW5mbywgZGluZm8tPkNsZWFyQ29kZSk7CisgICAgZGluZm8tPmNvZGVfY291bnRlciA9IGRpbmZvLT5DbGVhckNvZGUgKyAyOwkvKiByZXNldCB0aGUgY291bnRlciAqLworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2NvbXByZXNzX3Rlcm0gKGdpZl9kZXN0X3B0ciBkaW5mbykKKy8qIENsZWFuIHVwIGF0IGVuZCAqLworeworICAvKiBTZW5kIGFuIEVPRiBjb2RlICovCisgIG91dHB1dChkaW5mbywgZGluZm8tPkVPRkNvZGUpOworICAvKiBGbHVzaCB0aGUgYml0LXBhY2tpbmcgYnVmZmVyICovCisgIGlmIChkaW5mby0+Y3VyX2JpdHMgPiAwKSB7CisgICAgQ0hBUl9PVVQoZGluZm8sIGRpbmZvLT5jdXJfYWNjdW0gJiAweEZGKTsKKyAgfQorICAvKiBGbHVzaCB0aGUgcGFja2V0IGJ1ZmZlciAqLworICBmbHVzaF9wYWNrZXQoZGluZm8pOworfQorCisKKy8qIEdJRiBoZWFkZXIgY29uc3RydWN0aW9uICovCisKKworTE9DQUwodm9pZCkKK3B1dF93b3JkIChnaWZfZGVzdF9wdHIgZGluZm8sIHVuc2lnbmVkIGludCB3KQorLyogRW1pdCBhIDE2LWJpdCB3b3JkLCBMU0IgZmlyc3QgKi8KK3sKKyAgcHV0Yyh3ICYgMHhGRiwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGMoKHcgPj4gOCkgJiAweEZGLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKK30KKworCitMT0NBTCh2b2lkKQorcHV0XzNieXRlcyAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgdmFsKQorLyogRW1pdCAzIGNvcGllcyBvZiBzYW1lIGJ5dGUgdmFsdWUgLS0tIGhhbmR5IHN1YnIgZm9yIGNvbG9ybWFwIGNvbnN0cnVjdGlvbiAqLworeworICBwdXRjKHZhbCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGModmFsLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0Yyh2YWwsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2hlYWRlciAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgbnVtX2NvbG9ycywgSlNBTVBBUlJBWSBjb2xvcm1hcCkKKy8qIE91dHB1dCB0aGUgR0lGIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgY29sb3IgbWFwICovCisvKiBJZiBjb2xvcm1hcD09TlVMTCwgc3ludGhlc2l6ZSBhIGdyYXktc2NhbGUgY29sb3JtYXAgKi8KK3sKKyAgaW50IEJpdHNQZXJQaXhlbCwgQ29sb3JNYXBTaXplLCBJbml0Q29kZVNpemUsIEZsYWdCeXRlOworICBpbnQgY3NoaWZ0ID0gZGluZm8tPmNpbmZvLT5kYXRhX3ByZWNpc2lvbiAtIDg7CisgIGludCBpOworCisgIGlmIChudW1fY29sb3JzID4gMjU2KQorICAgIEVSUkVYSVQxKGRpbmZvLT5jaW5mbywgSkVSUl9UT09fTUFOWV9DT0xPUlMsIG51bV9jb2xvcnMpOworICAvKiBDb21wdXRlIGJpdHMvcGl4ZWwgYW5kIHJlbGF0ZWQgdmFsdWVzICovCisgIEJpdHNQZXJQaXhlbCA9IDE7CisgIHdoaWxlIChudW1fY29sb3JzID4gKDEgPDwgQml0c1BlclBpeGVsKSkKKyAgICBCaXRzUGVyUGl4ZWwrKzsKKyAgQ29sb3JNYXBTaXplID0gMSA8PCBCaXRzUGVyUGl4ZWw7CisgIGlmIChCaXRzUGVyUGl4ZWwgPD0gMSkKKyAgICBJbml0Q29kZVNpemUgPSAyOworICBlbHNlCisgICAgSW5pdENvZGVTaXplID0gQml0c1BlclBpeGVsOworICAvKgorICAgKiBXcml0ZSB0aGUgR0lGIGhlYWRlci4KKyAgICogTm90ZSB0aGF0IHdlIGdlbmVyYXRlIGEgcGxhaW4gR0lGODcgaGVhZGVyIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkuCisgICAqLworICBwdXRjKCdHJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGMoJ0knLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0YygnRicsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKCc4JywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGMoJzcnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0YygnYScsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICAvKiBXcml0ZSB0aGUgTG9naWNhbCBTY3JlZW4gRGVzY3JpcHRvciAqLworICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfd2lkdGgpOworICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsKKyAgRmxhZ0J5dGUgPSAweDgwOwkJLyogWWVzLCB0aGVyZSBpcyBhIGdsb2JhbCBjb2xvciB0YWJsZSAqLworICBGbGFnQnl0ZSB8PSAoQml0c1BlclBpeGVsLTEpIDw8IDQ7IC8qIGNvbG9yIHJlc29sdXRpb24gKi8KKyAgRmxhZ0J5dGUgfD0gKEJpdHNQZXJQaXhlbC0xKTsJLyogc2l6ZSBvZiBnbG9iYWwgY29sb3IgdGFibGUgKi8KKyAgcHV0YyhGbGFnQnl0ZSwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGMoMCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7IC8qIEJhY2tncm91bmQgY29sb3IgaW5kZXggKi8KKyAgcHV0YygwLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogUmVzZXJ2ZWQgKGFzcGVjdCByYXRpbyBpbiBHSUY4OSkgKi8KKyAgLyogV3JpdGUgdGhlIEdsb2JhbCBDb2xvciBNYXAgKi8KKyAgLyogSWYgdGhlIGNvbG9yIG1hcCBpcyBtb3JlIHRoYW4gOCBiaXRzIHByZWNpc2lvbiwgKi8KKyAgLyogd2UgcmVkdWNlIGl0IHRvIDggYml0cyBieSBzaGlmdGluZyAqLworICBmb3IgKGk9MDsgaSA8IENvbG9yTWFwU2l6ZTsgaSsrKSB7CisgICAgaWYgKGkgPCBudW1fY29sb3JzKSB7CisgICAgICBpZiAoY29sb3JtYXAgIT0gTlVMTCkgeworCWlmIChkaW5mby0+Y2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisJICAvKiBOb3JtYWwgY2FzZTogUkdCIGNvbG9yIG1hcCAqLworCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzFdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworCSAgcHV0YyhHRVRKU0FNUExFKGNvbG9ybWFwWzJdW2ldKSA+PiBjc2hpZnQsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworCX0gZWxzZSB7CisJICAvKiBHcmF5c2NhbGUgImNvbG9yIG1hcCI6IHBvc3NpYmxlIGlmIHF1YW50aXppbmcgZ3JheXNjYWxlIGltYWdlICovCisJICBwdXRfM2J5dGVzKGRpbmZvLCBHRVRKU0FNUExFKGNvbG9ybWFwWzBdW2ldKSA+PiBjc2hpZnQpOworCX0KKyAgICAgIH0gZWxzZSB7CisJLyogQ3JlYXRlIGEgZ3JheS1zY2FsZSBtYXAgb2YgbnVtX2NvbG9ycyB2YWx1ZXMsIHJhbmdlIDAuLjI1NSAqLworCXB1dF8zYnl0ZXMoZGluZm8sIChpICogMjU1ICsgKG51bV9jb2xvcnMtMSkvMikgLyAobnVtX2NvbG9ycy0xKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGZpbGwgb3V0IHRoZSBtYXAgdG8gYSBwb3dlciBvZiAyICovCisgICAgICBwdXRfM2J5dGVzKGRpbmZvLCAwKTsKKyAgICB9CisgIH0KKyAgLyogV3JpdGUgaW1hZ2Ugc2VwYXJhdG9yIGFuZCBJbWFnZSBEZXNjcmlwdG9yICovCisgIHB1dGMoJywnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogc2VwYXJhdG9yICovCisgIHB1dF93b3JkKGRpbmZvLCAwKTsJCS8qIGxlZnQvdG9wIG9mZnNldCAqLworICBwdXRfd29yZChkaW5mbywgMCk7CisgIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF93aWR0aCk7IC8qIGltYWdlIHNpemUgKi8KKyAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X2hlaWdodCk7CisgIC8qIGZsYWcgYnl0ZTogbm90IGludGVybGFjZWQsIG5vIGxvY2FsIGNvbG9yIG1hcCAqLworICBwdXRjKDB4MDAsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICAvKiBXcml0ZSBJbml0aWFsIENvZGUgU2l6ZSBieXRlICovCisgIHB1dGMoSW5pdENvZGVTaXplLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKworICAvKiBJbml0aWFsaXplIGZvciAiY29tcHJlc3Npb24iIG9mIGltYWdlIGRhdGEgKi8KKyAgY29tcHJlc3NfaW5pdChkaW5mbywgSW5pdENvZGVTaXplKzEpOworfQorCisKKy8qCisgKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9vdXRwdXRfZ2lmIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgZ2lmX2Rlc3RfcHRyIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKSBkaW5mbzsKKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKyAgICBlbWl0X2hlYWRlcihkZXN0LCBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMsIGNpbmZvLT5jb2xvcm1hcCk7CisgIGVsc2UKKyAgICBlbWl0X2hlYWRlcihkZXN0LCAyNTYsIChKU0FNUEFSUkFZKSBOVUxMKTsKK30KKworCisvKgorICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgorICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCit7CisgIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIGNvbXByZXNzX3BpeGVsKGRlc3QsIEdFVEpTQU1QTEUoKnB0cisrKSk7CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfb3V0cHV0X2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87CisKKyAgLyogRmx1c2ggImNvbXByZXNzaW9uIiBtZWNoYW5pc20gKi8KKyAgY29tcHJlc3NfdGVybShkZXN0KTsKKyAgLyogV3JpdGUgYSB6ZXJvLWxlbmd0aCBkYXRhIGJsb2NrIHRvIGVuZCB0aGUgc2VyaWVzICovCisgIHB1dGMoMCwgZGVzdC0+cHViLm91dHB1dF9maWxlKTsKKyAgLyogV3JpdGUgdGhlIEdJRiB0ZXJtaW5hdG9yIG1hcmsgKi8KKyAgcHV0YygnOycsIGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7CisgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KKyAgZmZsdXNoKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7CisgIGlmIChmZXJyb3IoZGVzdC0+cHViLm91dHB1dF9maWxlKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBHSUYgZm9ybWF0IG91dHB1dC4KKyAqLworCitHTE9CQUwoZGpwZWdfZGVzdF9wdHIpCitqaW5pdF93cml0ZV9naWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGdpZl9kZXN0X3B0ciBkZXN0OworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KKyAgZGVzdCA9IChnaWZfZGVzdF9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKGdpZl9kZXN0X3N0cnVjdCkpOworICBkZXN0LT5jaW5mbyA9IGNpbmZvOwkJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCisgIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfZ2lmOworICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKKyAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X2dpZjsKKworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfR1JBWVNDQUxFICYmCisgICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9HSUZfQ09MT1JTUEFDRSk7CisKKyAgLyogRm9yY2UgcXVhbnRpemF0aW9uIGlmIGNvbG9yIG9yIGlmID4gOCBiaXRzIGlucHV0ICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgfHwgY2luZm8tPmRhdGFfcHJlY2lzaW9uID4gOCkgeworICAgIC8qIEZvcmNlIHF1YW50aXphdGlvbiB0byBhdCBtb3N0IDI1NiBjb2xvcnMgKi8KKyAgICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKKyAgICBpZiAoY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA+IDI1NikKKyAgICAgIGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSAyNTY7CisgIH0KKworICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCisgIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7CisKKyAgaWYgKGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyAhPSAxKSAvKiBzYWZldHkgY2hlY2s6IGp1c3Qgb25lIGNvbXBvbmVudD8gKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9CVUcpOworCisgIC8qIENyZWF0ZSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KKyAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGNpbmZvLT5vdXRwdXRfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKKyAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworCisgIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Cit9CisKKyNlbmRpZiAvKiBHSUZfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qcGVnL3dyanBnY29tLjEgYi9qcGVnL3dyanBnY29tLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxOWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvd3JqcGdjb20uMQpAQCAtMCwwICsxLDEwMyBAQAorLlRIIFdSSlBHQ09NIDEgIjE1IEp1bmUgMTk5NSIKKy5TSCBOQU1FCit3cmpwZ2NvbSBcLSBpbnNlcnQgdGV4dCBjb21tZW50cyBpbnRvIGEgSlBFRyBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIHdyanBnY29tCitbCisuQiBcLXJlcGxhY2UKK10KK1sKKy5CSSBcLWNvbW1lbnQgIiB0ZXh0IgorXQorWworLkJJIFwtY2ZpbGUgIiBuYW1lIgorXQorWworLkkgZmlsZW5hbWUKK10KKy5MUAorLlNIIERFU0NSSVBUSU9OCisuTFAKKy5CIHdyanBnY29tCityZWFkcyB0aGUgbmFtZWQgSlBFRy9KRklGIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzIG5hbWVkLAorYW5kIGdlbmVyYXRlcyBhIG5ldyBKUEVHL0pGSUYgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQuICBBIGNvbW1lbnQgYmxvY2sgaXMKK2FkZGVkIHRvIHRoZSBmaWxlLgorLlBQCitUaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCitBbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKK2FyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKK2Fubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKK3RoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKK2ZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCit0aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCisuUFAKKy5CIHdyanBnY29tCithZGRzIGEgQ09NIGJsb2NrLCBjb250YWluaW5nIHRleHQgeW91IHByb3ZpZGUsIHRvIGEgSlBFRyBmaWxlLgorT3JkaW5hcmlseSwgdGhlIENPTSBibG9jayBpcyBhZGRlZCBhZnRlciBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrczsgYnV0IHlvdQorY2FuIGRlbGV0ZSB0aGUgb2xkIENPTSBibG9ja3MgaWYgeW91IHdpc2guCisuU0ggT1BUSU9OUworU3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCwgYW5kIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuCisuVFAKKy5CIFwtcmVwbGFjZQorRGVsZXRlIGFueSBleGlzdGluZyBDT00gYmxvY2tzIGZyb20gdGhlIGZpbGUuCisuVFAKKy5CSSBcLWNvbW1lbnQgIiB0ZXh0IgorU3VwcGx5IHRleHQgZm9yIG5ldyBDT00gYmxvY2sgb24gY29tbWFuZCBsaW5lLgorLlRQCisuQkkgXC1jZmlsZSAiIG5hbWUiCitSZWFkIHRleHQgZm9yIG5ldyBDT00gYmxvY2sgZnJvbSBuYW1lZCBmaWxlLgorLlBQCitJZiB5b3UgaGF2ZSBvbmx5IG9uZSBsaW5lIG9mIGNvbW1lbnQgdGV4dCB0byBhZGQsIHlvdSBjYW4gcHJvdmlkZSBpdCBvbiB0aGUKK2NvbW1hbmQgbGluZSB3aXRoCisuQlIgXC1jb21tZW50IC4KK1RoZSBjb21tZW50IHRleHQgbXVzdCBiZSBzdXJyb3VuZGVkIHdpdGggcXVvdGVzIHNvIHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBhCitzaW5nbGUgYXJndW1lbnQuICBMb25nZXIgY29tbWVudHMgY2FuIGJlIHJlYWQgZnJvbSBhIHRleHQgZmlsZS4KKy5QUAorSWYgeW91IGdpdmUgbmVpdGhlcgorLkIgXC1jb21tZW50Citub3IKKy5CUiBcLWNmaWxlICwKK3RoZW4KKy5CIHdyanBnY29tCit3aWxsIHJlYWQgdGhlIGNvbW1lbnQgdGV4dCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKEluIHRoaXMgY2FzZSBhbiBpbnB1dCBpbWFnZQorZmlsZSBuYW1lIE1VU1QgYmUgc3VwcGxpZWQsIHNvIHRoYXQgdGhlIHNvdXJjZSBKUEVHIGZpbGUgY29tZXMgZnJvbSBzb21ld2hlcmUKK2Vsc2UuKSAgWW91IGNhbiBlbnRlciBtdWx0aXBsZSBsaW5lcywgdXAgdG8gNjRLQiB3b3J0aC4gIFR5cGUgYW4gZW5kLW9mLWZpbGUKK2luZGljYXRvciAodXN1YWxseSBjb250cm9sLUQpIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWVudCB0ZXh0IGVudHJ5LgorLlBQCisuQiB3cmpwZ2NvbQord2lsbCBub3QgYWRkIGEgQ09NIGJsb2NrIGlmIHRoZSBwcm92aWRlZCBjb21tZW50IHN0cmluZyBpcyBlbXB0eS4gIFRoZXJlZm9yZQorXGZCXC1yZXBsYWNlIFwtY29tbWVudCAiIlxmUiBjYW4gYmUgdXNlZCB0byBkZWxldGUgYWxsIENPTSBibG9ja3MgZnJvbSBhIGZpbGUuCisuU0ggRVhBTVBMRVMKKy5MUAorQWRkIGEgc2hvcnQgY29tbWVudCB0byBpbi5qcGcsIHByb2R1Y2luZyBvdXQuanBnOgorLklQCisuQiB3cmpwZ2NvbSBcLWMKK1xmSSJWaWV3IG9mIG15IGJhY2sgeWFyZCIgaW4uanBnCisuQiA+CisuSSBvdXQuanBnCisuUFAKK0F0dGFjaCBhIGxvbmcgY29tbWVudCBwcmV2aW91c2x5IHN0b3JlZCBpbiBjb21tZW50LnR4dDoKKy5JUAorLkIgd3JqcGdjb20KKy5JIGluLmpwZworLkIgPAorLkkgY29tbWVudC50eHQKKy5CID4KKy5JIG91dC5qcGcKKy5QUAorb3IgZXF1aXZhbGVudGx5CisuSVAKKy5CIHdyanBnY29tCisuQiAtY2ZpbGUKKy5JIGNvbW1lbnQudHh0CisuQiA8CisuSSBpbi5qcGcKKy5CID4KKy5JIG91dC5qcGcKKy5TSCBTRUUgQUxTTworLkJSIGNqcGVnICgxKSwKKy5CUiBkanBlZyAoMSksCisuQlIganBlZ3RyYW4gKDEpLAorLkJSIHJkanBnY29tICgxKQorLlNIIEFVVEhPUgorSW5kZXBlbmRlbnQgSlBFRyBHcm91cApkaWZmIC0tZ2l0IGEvanBlZy93cmpwZ2NvbS5jIGIvanBlZy93cmpwZ2NvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDRiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGVnL3dyanBnY29tLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiB3cmpwZ2NvbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSB2ZXJ5IHNpbXBsZSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbiB0aGF0IGluc2VydHMKKyAqIHVzZXItc3VwcGxpZWQgdGV4dCBhcyBhIENPTSAoY29tbWVudCkgbWFya2VyIGluIGEgSkZJRiBmaWxlLgorICogVGhpcyBtYXkgYmUgdXNlZnVsIGFzIGFuIGV4YW1wbGUgb2YgdGhlIG1pbmltdW0gbG9naWMgbmVlZGVkIHRvIHBhcnNlCisgKiBKUEVHIG1hcmtlcnMuCisgKi8KKworI2RlZmluZSBKUEVHX0NKUEVHX0RKUEVHCS8qIHRvIGdldCB0aGUgY29tbWFuZC1saW5lIGNvbmZpZyBzeW1ib2xzICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIJCS8qIGdldCBhdXRvLWNvbmZpZyBzeW1ib2xzLCA8c3RkaW8uaD4gKi8KKworI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpICovCitleHRlcm4gdm9pZCAqIG1hbGxvYyAoKTsKKyNlbmRpZgorI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzdXBwZXIoKSwgdG9sb3dlcigpICovCisjaWZkZWYgVVNFX1NFVE1PREUKKyNpbmNsdWRlIDxmY250bC5oPgkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkncyBwYXJhbWV0ZXIgbWFjcm9zICovCisvKiBJZiB5b3UgaGF2ZSBzZXRtb2RlKCkgYnV0IG5vdCA8aW8uaD4sIGp1c3QgZGVsZXRlIHRoaXMgbGluZTogKi8KKyNpbmNsdWRlIDxpby5oPgkJCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpICovCisjZW5kaWYKKworI2lmZGVmIFVTRV9DQ09NTUFORAkJLyogY29tbWFuZC1saW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCisjaWZkZWYgX19NV0VSS1NfXworI2luY2x1ZGUgPFNJT1VYLmg+ICAgICAgICAgICAgICAvKiBNZXRyb3dlcmtzIG5lZWRzIHRoaXMgKi8KKyNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiAuLi4gYW5kIHRoaXMgKi8KKyNlbmRpZgorI2lmZGVmIFRISU5LX0MKKyNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiBUaGluayBkZWNsYXJlcyBpdCBoZXJlICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyIgorI2RlZmluZSBXUklURV9CSU5BUlkJInciCisjZWxzZQorI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgorI2RlZmluZSBXUklURV9CSU5BUlkJIndiIiwgImN0eD1zdG0iCisjZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKKyNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLworI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKKyNlbmRpZgorI2lmbmRlZiBFWElUX1NVQ0NFU1MKKyNpZmRlZiBWTVMKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2Vsc2UKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAwCisjZW5kaWYKKyNlbmRpZgorCisvKiBSZWR1Y2UgdGhpcyB2YWx1ZSBpZiB5b3VyIG1hbGxvYygpIGNhbid0IGFsbG9jYXRlIGJsb2NrcyB1cCB0byA2NEsuCisgKiBPbiBET1MsIGNvbXBpbGluZyBpbiBsYXJnZSBtb2RlbCBpcyB1c3VhbGx5IGEgYmV0dGVyIHNvbHV0aW9uLgorICovCisKKyNpZm5kZWYgTUFYX0NPTV9MRU5HVEgKKyNkZWZpbmUgTUFYX0NPTV9MRU5HVEggNjUwMDBMCS8qIG11c3QgYmUgPD0gNjU1MzMgaW4gYW55IGNhc2UgKi8KKyNlbmRpZgorCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gcmVhZCB0aGUgaW5wdXQgZmlsZSBhbmQgd3JpdGUgdGhlIG91dHB1dCBmaWxlLgorICogVG8gcmV1c2UgdGhpcyBjb2RlIGluIGFub3RoZXIgYXBwbGljYXRpb24sIHlvdSBtaWdodCBuZWVkIHRvIGNoYW5nZSB0aGVzZS4KKyAqLworCitzdGF0aWMgRklMRSAqIGluZmlsZTsJCS8qIGlucHV0IEpQRUcgZmlsZSAqLworCisvKiBSZXR1cm4gbmV4dCBpbnB1dCBieXRlLCBvciBFT0YgaWYgbm8gbW9yZSAqLworI2RlZmluZSBORVhUQllURSgpICBnZXRjKGluZmlsZSkKKworc3RhdGljIEZJTEUgKiBvdXRmaWxlOwkJLyogb3V0cHV0IEpQRUcgZmlsZSAqLworCisvKiBFbWl0IGFuIG91dHB1dCBieXRlICovCisjZGVmaW5lIFBVVEJZVEUoeCkgIHB1dGMoKHgpLCBvdXRmaWxlKQorCisKKy8qIEVycm9yIGV4aXQgaGFuZGxlciAqLworI2RlZmluZSBFUlJFWElUKG1zZykgIChmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpLCBleGl0KEVYSVRfRkFJTFVSRSkpCisKKworLyogUmVhZCBvbmUgYnl0ZSwgdGVzdGluZyBmb3IgRU9GICovCitzdGF0aWMgaW50CityZWFkXzFfYnl0ZSAodm9pZCkKK3sKKyAgaW50IGM7CisKKyAgYyA9IE5FWFRCWVRFKCk7CisgIGlmIChjID09IEVPRikKKyAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOworICByZXR1cm4gYzsKK30KKworLyogUmVhZCAyIGJ5dGVzLCBjb252ZXJ0IHRvIHVuc2lnbmVkIGludCAqLworLyogQWxsIDItYnl0ZSBxdWFudGl0aWVzIGluIEpQRUcgbWFya2VycyBhcmUgTVNCIGZpcnN0ICovCitzdGF0aWMgdW5zaWduZWQgaW50CityZWFkXzJfYnl0ZXMgKHZvaWQpCit7CisgIGludCBjMSwgYzI7CisKKyAgYzEgPSBORVhUQllURSgpOworICBpZiAoYzEgPT0gRU9GKQorICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7CisgIGMyID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMyID09IEVPRikKKyAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOworICByZXR1cm4gKCgodW5zaWduZWQgaW50KSBjMSkgPDwgOCkgKyAoKHVuc2lnbmVkIGludCkgYzIpOworfQorCisKKy8qIFJvdXRpbmVzIHRvIHdyaXRlIGRhdGEgdG8gb3V0cHV0IGZpbGUgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlXzFfYnl0ZSAoaW50IGMpCit7CisgIFBVVEJZVEUoYyk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV8yX2J5dGVzICh1bnNpZ25lZCBpbnQgdmFsKQoreworICBQVVRCWVRFKCh2YWwgPj4gOCkgJiAweEZGKTsKKyAgUFVUQllURSh2YWwgJiAweEZGKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX21hcmtlciAoaW50IG1hcmtlcikKK3sKKyAgUFVUQllURSgweEZGKTsKKyAgUFVUQllURShtYXJrZXIpOworfQorCitzdGF0aWMgdm9pZAorY29weV9yZXN0X29mX2ZpbGUgKHZvaWQpCit7CisgIGludCBjOworCisgIHdoaWxlICgoYyA9IE5FWFRCWVRFKCkpICE9IEVPRikKKyAgICBQVVRCWVRFKGMpOworfQorCisKKy8qCisgKiBKUEVHIG1hcmtlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSAweEZGIGJ5dGVzLCBmb2xsb3dlZCBieSBhIG1hcmtlcgorICogY29kZSBieXRlICh3aGljaCBpcyBub3QgYW4gRkYpLiAgSGVyZSBhcmUgdGhlIG1hcmtlciBjb2RlcyBvZiBpbnRlcmVzdAorICogaW4gdGhpcyBwcm9ncmFtLiAgKFNlZSBqZG1hcmtlci5jIGZvciBhIG1vcmUgY29tcGxldGUgbGlzdC4pCisgKi8KKworI2RlZmluZSBNX1NPRjAgIDB4QzAJCS8qIFN0YXJ0IE9mIEZyYW1lIE4gKi8KKyNkZWZpbmUgTV9TT0YxICAweEMxCQkvKiBOIGluZGljYXRlcyB3aGljaCBjb21wcmVzc2lvbiBwcm9jZXNzICovCisjZGVmaW5lIE1fU09GMiAgMHhDMgkJLyogT25seSBTT0YwLVNPRjIgYXJlIG5vdyBpbiBjb21tb24gdXNlICovCisjZGVmaW5lIE1fU09GMyAgMHhDMworI2RlZmluZSBNX1NPRjUgIDB4QzUJCS8qIE5COiBjb2RlcyBDNCBhbmQgQ0MgYXJlIE5PVCBTT0YgbWFya2VycyAqLworI2RlZmluZSBNX1NPRjYgIDB4QzYKKyNkZWZpbmUgTV9TT0Y3ICAweEM3CisjZGVmaW5lIE1fU09GOSAgMHhDOQorI2RlZmluZSBNX1NPRjEwIDB4Q0EKKyNkZWZpbmUgTV9TT0YxMSAweENCCisjZGVmaW5lIE1fU09GMTMgMHhDRAorI2RlZmluZSBNX1NPRjE0IDB4Q0UKKyNkZWZpbmUgTV9TT0YxNSAweENGCisjZGVmaW5lIE1fU09JICAgMHhEOAkJLyogU3RhcnQgT2YgSW1hZ2UgKGJlZ2lubmluZyBvZiBkYXRhc3RyZWFtKSAqLworI2RlZmluZSBNX0VPSSAgIDB4RDkJCS8qIEVuZCBPZiBJbWFnZSAoZW5kIG9mIGRhdGFzdHJlYW0pICovCisjZGVmaW5lIE1fU09TICAgMHhEQQkJLyogU3RhcnQgT2YgU2NhbiAoYmVnaW5zIGNvbXByZXNzZWQgZGF0YSkgKi8KKyNkZWZpbmUgTV9DT00gICAweEZFCQkvKiBDT01tZW50ICovCisKKworLyoKKyAqIEZpbmQgdGhlIG5leHQgSlBFRyBtYXJrZXIgYW5kIHJldHVybiBpdHMgbWFya2VyIGNvZGUuCisgKiBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIEZGIGJ5dGUsIHBvc3NpYmx5IG1vcmUgaWYgdGhlIGNvbXByZXNzb3IgdXNlZCBGRnMKKyAqIHRvIHBhZCB0aGUgZmlsZS4gIChQYWRkaW5nIEZGcyB3aWxsIE5PVCBiZSByZXBsaWNhdGVkIGluIHRoZSBvdXRwdXQgZmlsZS4pCisgKiBUaGVyZSBjb3VsZCBhbHNvIGJlIG5vbi1GRiBnYXJiYWdlIGJldHdlZW4gbWFya2Vycy4gIFRoZSB0cmVhdG1lbnQgb2Ygc3VjaAorICogZ2FyYmFnZSBpcyB1bnNwZWNpZmllZDsgd2UgY2hvb3NlIHRvIHNraXAgb3ZlciBpdCBidXQgZW1pdCBhIHdhcm5pbmcgbXNnLgorICogTkI6IHRoaXMgcm91dGluZSBtdXN0IG5vdCBiZSB1c2VkIGFmdGVyIHNlZWluZyBTT1MgbWFya2VyLCBzaW5jZSBpdCB3aWxsCisgKiBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aCBGRi8wMCBzZXF1ZW5jZXMgaW4gdGhlIGNvbXByZXNzZWQgaW1hZ2UgZGF0YS4uLgorICovCisKK3N0YXRpYyBpbnQKK25leHRfbWFya2VyICh2b2lkKQoreworICBpbnQgYzsKKyAgaW50IGRpc2NhcmRlZF9ieXRlcyA9IDA7CisKKyAgLyogRmluZCAweEZGIGJ5dGU7IGNvdW50IGFuZCBza2lwIGFueSBub24tRkZzLiAqLworICBjID0gcmVhZF8xX2J5dGUoKTsKKyAgd2hpbGUgKGMgIT0gMHhGRikgeworICAgIGRpc2NhcmRlZF9ieXRlcysrOworICAgIGMgPSByZWFkXzFfYnl0ZSgpOworICB9CisgIC8qIEdldCBtYXJrZXIgY29kZSBieXRlLCBzd2FsbG93aW5nIGFueSBkdXBsaWNhdGUgRkYgYnl0ZXMuICBFeHRyYSBGRnMKKyAgICogYXJlIGxlZ2FsIGFzIHBhZCBieXRlcywgc28gZG9uJ3QgY291bnQgdGhlbSBpbiBkaXNjYXJkZWRfYnl0ZXMuCisgICAqLworICBkbyB7CisgICAgYyA9IHJlYWRfMV9ieXRlKCk7CisgIH0gd2hpbGUgKGMgPT0gMHhGRik7CisKKyAgaWYgKGRpc2NhcmRlZF9ieXRlcyAhPSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBnYXJiYWdlIGRhdGEgZm91bmQgaW4gSlBFRyBmaWxlXG4iKTsKKyAgfQorCisgIHJldHVybiBjOworfQorCisKKy8qCisgKiBSZWFkIHRoZSBpbml0aWFsIG1hcmtlciwgd2hpY2ggc2hvdWxkIGJlIFNPSS4KKyAqIEZvciBhIEpGSUYgZmlsZSwgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgZmlsZSBzaG91bGQgYmUgbGl0ZXJhbGx5CisgKiAweEZGIE1fU09JLiAgVG8gYmUgbW9yZSBnZW5lcmFsLCB3ZSBjb3VsZCB1c2UgbmV4dF9tYXJrZXIsIGJ1dCBpZiB0aGUKKyAqIGlucHV0IGZpbGUgd2VyZW4ndCBhY3R1YWxseSBKUEVHIGF0IGFsbCwgbmV4dF9tYXJrZXIgbWlnaHQgcmVhZCB0aGUgd2hvbGUKKyAqIGZpbGUgYW5kIHRoZW4gcmV0dXJuIGEgbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlLi4uCisgKi8KKworc3RhdGljIGludAorZmlyc3RfbWFya2VyICh2b2lkKQoreworICBpbnQgYzEsIGMyOworCisgIGMxID0gTkVYVEJZVEUoKTsKKyAgYzIgPSBORVhUQllURSgpOworICBpZiAoYzEgIT0gMHhGRiB8fCBjMiAhPSBNX1NPSSkKKyAgICBFUlJFWElUKCJOb3QgYSBKUEVHIGZpbGUiKTsKKyAgcmV0dXJuIGMyOworfQorCisKKy8qCisgKiBNb3N0IHR5cGVzIG9mIG1hcmtlciBhcmUgZm9sbG93ZWQgYnkgYSB2YXJpYWJsZS1sZW5ndGggcGFyYW1ldGVyIHNlZ21lbnQuCisgKiBUaGlzIHJvdXRpbmUgc2tpcHMgb3ZlciB0aGUgcGFyYW1ldGVycyBmb3IgYW55IG1hcmtlciB3ZSBkb24ndCBvdGhlcndpc2UKKyAqIHdhbnQgdG8gcHJvY2Vzcy4KKyAqIE5vdGUgdGhhdCB3ZSBNVVNUIHNraXAgdGhlIHBhcmFtZXRlciBzZWdtZW50IGV4cGxpY2l0bHkgaW4gb3JkZXIgbm90IHRvCisgKiBiZSBmb29sZWQgYnkgMHhGRiBieXRlcyB0aGF0IG1pZ2h0IGFwcGVhciB3aXRoaW4gdGhlIHBhcmFtZXRlciBzZWdtZW50OworICogc3VjaCBieXRlcyBkbyBOT1QgaW50cm9kdWNlIG5ldyBtYXJrZXJzLgorICovCisKK3N0YXRpYyB2b2lkCitjb3B5X3ZhcmlhYmxlICh2b2lkKQorLyogQ29weSBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLworeworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisgIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KKyAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CisgIHdyaXRlXzJfYnl0ZXMobGVuZ3RoKTsKKyAgLyogTGVuZ3RoIGluY2x1ZGVzIGl0c2VsZiwgc28gbXVzdCBiZSBhdCBsZWFzdCAyICovCisgIGlmIChsZW5ndGggPCAyKQorICAgIEVSUkVYSVQoIkVycm9uZW91cyBKUEVHIG1hcmtlciBsZW5ndGgiKTsKKyAgbGVuZ3RoIC09IDI7CisgIC8qIFNraXAgb3ZlciB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgd3JpdGVfMV9ieXRlKHJlYWRfMV9ieXRlKCkpOworICAgIGxlbmd0aC0tOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitza2lwX3ZhcmlhYmxlICh2b2lkKQorLyogU2tpcCBvdmVyIGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCit7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisKKyAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLworICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKKyAgLyogTGVuZ3RoIGluY2x1ZGVzIGl0c2VsZiwgc28gbXVzdCBiZSBhdCBsZWFzdCAyICovCisgIGlmIChsZW5ndGggPCAyKQorICAgIEVSUkVYSVQoIkVycm9uZW91cyBKUEVHIG1hcmtlciBsZW5ndGgiKTsKKyAgbGVuZ3RoIC09IDI7CisgIC8qIFNraXAgb3ZlciB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CisgICAgbGVuZ3RoLS07CisgIH0KK30KKworCisvKgorICogUGFyc2UgdGhlIG1hcmtlciBzdHJlYW0gdW50aWwgU09GbiBvciBFT0kgaXMgc2VlbjsKKyAqIGNvcHkgZGF0YSB0byBvdXRwdXQsIGJ1dCBkaXNjYXJkIENPTSBtYXJrZXJzIHVubGVzcyBrZWVwX0NPTSBpcyB0cnVlLgorICovCisKK3N0YXRpYyBpbnQKK3NjYW5fSlBFR19oZWFkZXIgKGludCBrZWVwX0NPTSkKK3sKKyAgaW50IG1hcmtlcjsKKworICAvKiBFeHBlY3QgU09JIGF0IHN0YXJ0IG9mIGZpbGUgKi8KKyAgaWYgKGZpcnN0X21hcmtlcigpICE9IE1fU09JKQorICAgIEVSUkVYSVQoIkV4cGVjdGVkIFNPSSBtYXJrZXIgZmlyc3QiKTsKKyAgd3JpdGVfbWFya2VyKE1fU09JKTsKKworICAvKiBTY2FuIG1pc2NlbGxhbmVvdXMgbWFya2VycyB1bnRpbCB3ZSByZWFjaCBTT0ZuLiAqLworICBmb3IgKDs7KSB7CisgICAgbWFya2VyID0gbmV4dF9tYXJrZXIoKTsKKyAgICBzd2l0Y2ggKG1hcmtlcikgeworICAgICAgLyogTm90ZSB0aGF0IG1hcmtlciBjb2RlcyAweEM0LCAweEM4LCAweENDIGFyZSBub3QsIGFuZCBtdXN0IG5vdCBiZSwKKyAgICAgICAqIHRyZWF0ZWQgYXMgU09Gbi4gIEM0IGluIHBhcnRpY3VsYXIgaXMgYWN0dWFsbHkgREhULgorICAgICAgICovCisgICAgY2FzZSBNX1NPRjA6CQkvKiBCYXNlbGluZSAqLworICAgIGNhc2UgTV9TT0YxOgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0YyOgkJLyogUHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GMzoJCS8qIExvc3NsZXNzLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjU6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y2OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjc6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GOToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTA6CQkvKiBQcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxMToJCS8qIExvc3NsZXNzLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjEzOgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTQ6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTU6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICAgIHJldHVybiBtYXJrZXI7CisKKyAgICBjYXNlIE1fU09TOgkJCS8qIHNob3VsZCBub3Qgc2VlIGNvbXByZXNzZWQgZGF0YSBiZWZvcmUgU09GICovCisgICAgICBFUlJFWElUKCJTT1Mgd2l0aG91dCBwcmlvciBTT0ZuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9FT0k6CQkJLyogaW4gY2FzZSBpdCdzIGEgdGFibGVzLW9ubHkgSlBFRyBzdHJlYW0gKi8KKyAgICAgIHJldHVybiBtYXJrZXI7CisKKyAgICBjYXNlIE1fQ09NOgkJCS8qIEV4aXN0aW5nIENPTTogY29uZGl0aW9uYWxseSBkaXNjYXJkICovCisgICAgICBpZiAoa2VlcF9DT00pIHsKKwl3cml0ZV9tYXJrZXIobWFya2VyKTsKKwljb3B5X3ZhcmlhYmxlKCk7CisgICAgICB9IGVsc2UgeworCXNraXBfdmFyaWFibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoJCQkvKiBBbnl0aGluZyBlbHNlIGp1c3QgZ2V0cyBjb3BpZWQgKi8KKyAgICAgIHdyaXRlX21hcmtlcihtYXJrZXIpOworICAgICAgY29weV92YXJpYWJsZSgpOwkJLyogd2UgYXNzdW1lIGl0IGhhcyBhIHBhcmFtZXRlciBjb3VudC4uLiAqLworICAgICAgYnJlYWs7CisgICAgfQorICB9IC8qIGVuZCBsb29wICovCit9CisKKworLyogQ29tbWFuZCBsaW5lIHBhcnNpbmcgY29kZSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCisKKworc3RhdGljIHZvaWQKK3VzYWdlICh2b2lkKQorLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLworeworICBmcHJpbnRmKHN0ZGVyciwgIndyanBnY29tIGluc2VydHMgYSB0ZXh0dWFsIGNvbW1lbnQgaW4gYSBKUEVHIGZpbGUuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJZb3UgY2FuIGFkZCB0byBvciByZXBsYWNlIGFueSBleGlzdGluZyBjb21tZW50KHMpLlxuIik7CisKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7CisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7CisjZWxzZQorICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKKyNlbmRpZgorCisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1yZXBsYWNlICAgICAgICAgRGVsZXRlIGFueSBleGlzdGluZyBjb21tZW50c1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtY29tbWVudCBcInRleHRcIiAgSW5zZXJ0IGNvbW1lbnQgd2l0aCBnaXZlbiB0ZXh0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jZmlsZSBuYW1lICAgICAgUmVhZCBjb21tZW50IGZyb20gbmFtZWQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiTm90aWNlIHRoYXQgeW91IG11c3QgcHV0IHF1b3RlcyBhcm91bmQgdGhlIGNvbW1lbnQgdGV4dFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAid2hlbiB5b3UgdXNlIC1jb21tZW50LlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiSWYgeW91IGRvIG5vdCBnaXZlIGVpdGhlciAtY29tbWVudCBvciAtY2ZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSxcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgInRoZW4gdGhlIGNvbW1lbnQgdGV4dCBpcyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJJdCBjYW4gYmUgbXVsdGlwbGUgbGluZXMsIHVwIHRvICV1IGNoYXJhY3RlcnMgdG90YWwuXG4iLAorCSAgKHVuc2lnbmVkIGludCkgTUFYX0NPTV9MRU5HVEgpOworI2lmbmRlZiBUV09fRklMRV9DT01NQU5ETElORQorICBmcHJpbnRmKHN0ZGVyciwgIllvdSBtdXN0IHNwZWNpZnkgYW4gaW5wdXQgSlBFRyBmaWxlIG5hbWUgd2hlbiBzdXBwbHlpbmdcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgImNvbW1lbnQgdGV4dCBmcm9tIHN0YW5kYXJkIGlucHV0LlxuIik7CisjZW5kaWYKKworICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworc3RhdGljIGludAora2V5bWF0Y2ggKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpCisvKiBDYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nIG9mIChwb3NzaWJseSBhYmJyZXZpYXRlZCkga2V5d29yZCBzd2l0Y2hlcy4gKi8KKy8qIGtleXdvcmQgaXMgdGhlIGNvbnN0YW50IGtleXdvcmQgKG11c3QgYmUgbG93ZXIgY2FzZSBhbHJlYWR5KSwgKi8KKy8qIG1pbmNoYXJzIGlzIGxlbmd0aCBvZiBtaW5pbXVtIGxlZ2FsIGFiYnJldmlhdGlvbi4gKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNhLCBjazsKKyAgcmVnaXN0ZXIgaW50IG5tYXRjaGVkID0gMDsKKworICB3aGlsZSAoKGNhID0gKmFyZysrKSAhPSAnXDAnKSB7CisgICAgaWYgKChjayA9ICprZXl3b3JkKyspID09ICdcMCcpCisgICAgICByZXR1cm4gMDsJCQkvKiBhcmcgbG9uZ2VyIHRoYW4ga2V5d29yZCwgbm8gZ29vZCAqLworICAgIGlmIChpc3VwcGVyKGNhKSkJCS8qIGZvcmNlIGFyZyB0byBsY2FzZSAoYXNzdW1lIGNrIGlzIGFscmVhZHkpICovCisgICAgICBjYSA9IHRvbG93ZXIoY2EpOworICAgIGlmIChjYSAhPSBjaykKKyAgICAgIHJldHVybiAwOwkJCS8qIG5vIGdvb2QgKi8KKyAgICBubWF0Y2hlZCsrOwkJCS8qIGNvdW50IG1hdGNoZWQgY2hhcmFjdGVycyAqLworICB9CisgIC8qIHJlYWNoZWQgZW5kIG9mIGFyZ3VtZW50OyBmYWlsIGlmIGl0J3MgdG9vIHNob3J0IGZvciB1bmlxdWUgYWJicmV2ICovCisgIGlmIChubWF0Y2hlZCA8IG1pbmNoYXJzKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsJCQkvKiBBLU9LICovCit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGludCBhcmduOworICBjaGFyICogYXJnOworICBpbnQga2VlcF9DT00gPSAxOworICBjaGFyICogY29tbWVudF9hcmcgPSBOVUxMOworICBGSUxFICogY29tbWVudF9maWxlID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IGNvbW1lbnRfbGVuZ3RoID0gMDsKKyAgaW50IG1hcmtlcjsKKworICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLworI2lmZGVmIFVTRV9DQ09NTUFORAorICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOworI2VuZGlmCisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQorICAgIHByb2duYW1lID0gIndyanBnY29tIjsJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCisKKyAgLyogUGFyc2Ugc3dpdGNoZXMsIGlmIGFueSAqLworICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7CisgICAgYXJnID0gYXJndlthcmduXTsKKyAgICBpZiAoYXJnWzBdICE9ICctJykKKyAgICAgIGJyZWFrOwkJCS8qIG5vdCBzd2l0Y2gsIG11c3QgYmUgZmlsZSBuYW1lICovCisgICAgYXJnKys7CQkJLyogYWR2YW5jZSBvdmVyICctJyAqLworICAgIGlmIChrZXltYXRjaChhcmcsICJyZXBsYWNlIiwgMSkpIHsKKyAgICAgIGtlZXBfQ09NID0gMDsKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNmaWxlIiwgMikpIHsKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykgdXNhZ2UoKTsKKyAgICAgIGlmICgoY29tbWVudF9maWxlID0gZm9wZW4oYXJndlthcmduXSwgInIiKSkgPT0gTlVMTCkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjb21tZW50IiwgMSkpIHsKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykgdXNhZ2UoKTsKKyAgICAgIGNvbW1lbnRfYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIElmIHRoZSBjb21tZW50IHRleHQgc3RhcnRzIHdpdGggJyInLCB0aGVuIHdlIGFyZSBwcm9iYWJseSBydW5uaW5nCisgICAgICAgKiB1bmRlciBNUy1ET0cgYW5kIG11c3QgcGFyc2Ugb3V0IHRoZSBxdW90ZWQgc3RyaW5nIG91cnNlbHZlcy4gIFNpZ2guCisgICAgICAgKi8KKyAgICAgIGlmIChjb21tZW50X2FyZ1swXSA9PSAnIicpIHsKKwljb21tZW50X2FyZyA9IChjaGFyICopIG1hbGxvYygoc2l6ZV90KSBNQVhfQ09NX0xFTkdUSCk7CisJaWYgKGNvbW1lbnRfYXJnID09IE5VTEwpCisJICBFUlJFWElUKCJJbnN1ZmZpY2llbnQgbWVtb3J5Iik7CisJc3RyY3B5KGNvbW1lbnRfYXJnLCBhcmd2W2FyZ25dKzEpOworCWZvciAoOzspIHsKKwkgIGNvbW1lbnRfbGVuZ3RoID0gKHVuc2lnbmVkIGludCkgc3RybGVuKGNvbW1lbnRfYXJnKTsKKwkgIGlmIChjb21tZW50X2xlbmd0aCA+IDAgJiYgY29tbWVudF9hcmdbY29tbWVudF9sZW5ndGgtMV0gPT0gJyInKSB7CisJICAgIGNvbW1lbnRfYXJnW2NvbW1lbnRfbGVuZ3RoLTFdID0gJ1wwJzsgLyogemFwIHRlcm1pbmF0aW5nIHF1b3RlICovCisJICAgIGJyZWFrOworCSAgfQorCSAgaWYgKCsrYXJnbiA+PSBhcmdjKQorCSAgICBFUlJFWElUKCJNaXNzaW5nIGVuZGluZyBxdW90ZSBtYXJrIik7CisJICBzdHJjYXQoY29tbWVudF9hcmcsICIgIik7CisJICBzdHJjYXQoY29tbWVudF9hcmcsIGFyZ3ZbYXJnbl0pOworCX0KKyAgICAgIH0KKyAgICAgIGNvbW1lbnRfbGVuZ3RoID0gKHVuc2lnbmVkIGludCkgc3RybGVuKGNvbW1lbnRfYXJnKTsKKyAgICB9IGVsc2UKKyAgICAgIHVzYWdlKCk7CisgIH0KKworICAvKiBDYW5ub3QgdXNlIGJvdGggLWNvbW1lbnQgYW5kIC1jZmlsZS4gKi8KKyAgaWYgKGNvbW1lbnRfYXJnICE9IE5VTEwgJiYgY29tbWVudF9maWxlICE9IE5VTEwpCisgICAgdXNhZ2UoKTsKKyAgLyogSWYgdGhlcmUgaXMgbmVpdGhlciAtY29tbWVudCBub3IgLWNmaWxlLCB3ZSB3aWxsIHJlYWQgdGhlIGNvbW1lbnQgdGV4dAorICAgKiBmcm9tIHN0ZGluOyBpbiB0aGlzIGNhc2UgdGhlcmUgTVVTVCBiZSBhbiBpbnB1dCBKUEVHIGZpbGUgbmFtZS4KKyAgICovCisgIGlmIChjb21tZW50X2FyZyA9PSBOVUxMICYmIGNvbW1lbnRfZmlsZSA9PSBOVUxMICYmIGFyZ24gPj0gYXJnYykKKyAgICB1c2FnZSgpOworCisgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCisgIGlmIChhcmduIDwgYXJnYykgeworICAgIGlmICgoaW5maWxlID0gZm9wZW4oYXJndlthcmduXSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduXSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGRlZmF1bHQgaW5wdXQgZmlsZSBpcyBzdGRpbiAqLworI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLworICAgIHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOworI2VuZGlmCisjaWZkZWYgVVNFX0ZET1BFTgkJLyogbmVlZCB0byByZS1vcGVuIGluIGJpbmFyeSBtb2RlPyAqLworICAgIGlmICgoaW5maWxlID0gZmRvcGVuKGZpbGVubyhzdGRpbiksIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBzdGRpblxuIiwgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyNlbHNlCisgICAgaW5maWxlID0gc3RkaW47CisjZW5kaWYKKyAgfQorCisgIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIC8qIE11c3QgaGF2ZSBleHBsaWNpdCBvdXRwdXQgZmlsZSBuYW1lICovCisgIGlmIChhcmduICE9IGFyZ2MtMikgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyAgaWYgKChvdXRmaWxlID0gZm9wZW4oYXJndlthcmduKzFdLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbisxXSk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisjZWxzZQorICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCisgIGlmIChhcmduIDwgYXJnYy0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KKyNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KKyAgc2V0bW9kZShmaWxlbm8oc3Rkb3V0KSwgT19CSU5BUlkpOworI2VuZGlmCisjaWZkZWYgVVNFX0ZET1BFTgkJLyogbmVlZCB0byByZS1vcGVuIGluIGJpbmFyeSBtb2RlPyAqLworICBpZiAoKG91dGZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZG91dCksIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIHN0ZG91dFxuIiwgcHJvZ25hbWUpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorI2Vsc2UKKyAgb3V0ZmlsZSA9IHN0ZG91dDsKKyNlbmRpZgorI2VuZGlmIC8qIFRXT19GSUxFX0NPTU1BTkRMSU5FICovCisKKyAgLyogQ29sbGVjdCBjb21tZW50IHRleHQgZnJvbSBjb21tZW50X2ZpbGUgb3Igc3RkaW4sIGlmIG5lY2Vzc2FyeSAqLworICBpZiAoY29tbWVudF9hcmcgPT0gTlVMTCkgeworICAgIEZJTEUgKiBzcmNfZmlsZTsKKyAgICBpbnQgYzsKKworICAgIGNvbW1lbnRfYXJnID0gKGNoYXIgKikgbWFsbG9jKChzaXplX3QpIE1BWF9DT01fTEVOR1RIKTsKKyAgICBpZiAoY29tbWVudF9hcmcgPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoIkluc3VmZmljaWVudCBtZW1vcnkiKTsKKyAgICBjb21tZW50X2xlbmd0aCA9IDA7CisgICAgc3JjX2ZpbGUgPSAoY29tbWVudF9maWxlICE9IE5VTEwgPyBjb21tZW50X2ZpbGUgOiBzdGRpbik7CisgICAgd2hpbGUgKChjID0gZ2V0YyhzcmNfZmlsZSkpICE9IEVPRikgeworICAgICAgaWYgKGNvbW1lbnRfbGVuZ3RoID49ICh1bnNpZ25lZCBpbnQpIE1BWF9DT01fTEVOR1RIKSB7CisJZnByaW50ZihzdGRlcnIsICJDb21tZW50IHRleHQgbWF5IG5vdCBleGNlZWQgJXUgYnl0ZXNcbiIsCisJCSh1bnNpZ25lZCBpbnQpIE1BWF9DT01fTEVOR1RIKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9CisgICAgICBjb21tZW50X2FyZ1tjb21tZW50X2xlbmd0aCsrXSA9IChjaGFyKSBjOworICAgIH0KKyAgICBpZiAoY29tbWVudF9maWxlICE9IE5VTEwpCisgICAgICBmY2xvc2UoY29tbWVudF9maWxlKTsKKyAgfQorCisgIC8qIENvcHkgSlBFRyBoZWFkZXJzIHVudGlsIFNPRm4gbWFya2VyOworICAgKiB3ZSB3aWxsIGluc2VydCB0aGUgbmV3IGNvbW1lbnQgbWFya2VyIGp1c3QgYmVmb3JlIFNPRm4uCisgICAqIFRoaXMgKGEpIGNhdXNlcyB0aGUgbmV3IGNvbW1lbnQgdG8gYXBwZWFyIGFmdGVyLCByYXRoZXIgdGhhbiBiZWZvcmUsCisgICAqIGV4aXN0aW5nIGNvbW1lbnRzOyBhbmQgKGIpIGVuc3VyZXMgdGhhdCBjb21tZW50cyBjb21lIGFmdGVyIGFueSBKRklGCisgICAqIG9yIEpGWFggbWFya2VycywgYXMgcmVxdWlyZWQgYnkgdGhlIEpGSUYgc3BlY2lmaWNhdGlvbi4KKyAgICovCisgIG1hcmtlciA9IHNjYW5fSlBFR19oZWFkZXIoa2VlcF9DT00pOworICAvKiBJbnNlcnQgdGhlIG5ldyBDT00gbWFya2VyLCBidXQgb25seSBpZiBub25lbXB0eSB0ZXh0IGhhcyBiZWVuIHN1cHBsaWVkICovCisgIGlmIChjb21tZW50X2xlbmd0aCA+IDApIHsKKyAgICB3cml0ZV9tYXJrZXIoTV9DT00pOworICAgIHdyaXRlXzJfYnl0ZXMoY29tbWVudF9sZW5ndGggKyAyKTsKKyAgICB3aGlsZSAoY29tbWVudF9sZW5ndGggPiAwKSB7CisgICAgICB3cml0ZV8xX2J5dGUoKmNvbW1lbnRfYXJnKyspOworICAgICAgY29tbWVudF9sZW5ndGgtLTsKKyAgICB9CisgIH0KKyAgLyogRHVwbGljYXRlIHRoZSByZW1haW5kZXIgb2YgdGhlIHNvdXJjZSBmaWxlLgorICAgKiBOb3RlIHRoYXQgYW55IENPTSBtYXJrZXJzIG9jY3VyaW5nIGFmdGVyIFNPRiB3aWxsIG5vdCBiZSB0b3VjaGVkLgorICAgKi8KKyAgd3JpdGVfbWFya2VyKG1hcmtlcik7CisgIGNvcHlfcmVzdF9vZl9maWxlKCk7CisKKyAgLyogQWxsIGRvbmUuICovCisgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCit9CmRpZmYgLS1naXQgYS9qcGVnL3dycHBtLmMgYi9qcGVnL3dycHBtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2ZDkwOAotLS0gL2Rldi9udWxsCisrKyBiL2pwZWcvd3JwcG0uYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIHdycHBtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIFBQTS9QR00gZm9ybWF0LgorICogVGhlIGV4dGVuZGVkIDItYnl0ZS1wZXItc2FtcGxlIHJhdyBQUE0vUEdNIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KKyAqIFRoZSBQQk1QTFVTIGxpYnJhcnkgaXMgTk9UIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhpcyBzb2Z0d2FyZQorICogKGJ1dCBpdCBpcyBoaWdobHkgdXNlZnVsIGFzIGEgc2V0IG9mIFBQTSBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMpLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgUFBNX1NVUFBPUlRFRAorCisKKy8qCisgKiBGb3IgMTItYml0IEpQRUcgZGF0YSwgd2UgZWl0aGVyIGRvd25zY2FsZSB0aGUgdmFsdWVzIHRvIDggYml0cworICogKHRvIHdyaXRlIHN0YW5kYXJkIGJ5dGUtcGVyLXNhbXBsZSBQUE0vUEdNIGZpbGVzKSwgb3Igb3V0cHV0CisgKiBub25zdGFuZGFyZCB3b3JkLXBlci1zYW1wbGUgUFBNL1BHTSBmaWxlcy4gIERvd25zY2FsaW5nIGlzIGRvbmUKKyAqIGlmIFBQTV9OT1JBV1dPUkQgaXMgZGVmaW5lZCAodGhpcyBjYW4gYmUgZG9uZSBpbiB0aGUgTWFrZWZpbGUKKyAqIG9yIGluIGpjb25maWcuaCkuCisgKiAoV2hlbiB0aGUgY29yZSBsaWJyYXJ5IHN1cHBvcnRzIGRhdGEgcHJlY2lzaW9uIHJlZHVjdGlvbiwgYSBjbGVhbmVyCisgKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHRvIGFzayBmb3IgdGhhdCBpbnN0ZWFkLikKKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgUFVUUFBNU0FNUExFKHB0cix2KSAgKnB0cisrID0gKGNoYXIpICh2KQorI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAxCisjZGVmaW5lIFBQTV9NQVhWQUwgMjU1CisjZWxzZQorI2lmZGVmIFBQTV9OT1JBV1dPUkQKKyNkZWZpbmUgUFVUUFBNU0FNUExFKHB0cix2KSAgKnB0cisrID0gKGNoYXIpICgodikgPj4gKEJJVFNfSU5fSlNBTVBMRS04KSkKKyNkZWZpbmUgQllURVNQRVJTQU1QTEUgMQorI2RlZmluZSBQUE1fTUFYVkFMIDI1NQorI2Vsc2UKKy8qIFRoZSB3b3JkLXBlci1zYW1wbGUgZm9ybWF0IGFsd2F5cyBwdXRzIHRoZSBMU0IgZmlyc3QuICovCisjZGVmaW5lIFBVVFBQTVNBTVBMRShwdHIsdikJCQlcCisJeyByZWdpc3RlciBpbnQgdmFsXyA9IHY7CQlcCisJICAqcHRyKysgPSAoY2hhcikgKHZhbF8gJiAweEZGKTsJXAorCSAgKnB0cisrID0gKGNoYXIpICgodmFsXyA+PiA4KSAmIDB4RkYpOwlcCisJfQorI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAyCisjZGVmaW5lIFBQTV9NQVhWQUwgKCgxPDxCSVRTX0lOX0pTQU1QTEUpLTEpCisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBXaGVuIEpTQU1QTEUgaXMgdGhlIHNhbWUgc2l6ZSBhcyBjaGFyLCB3ZSBjYW4ganVzdCBmd3JpdGUoKSB0aGUKKyAqIGRlY29tcHJlc3NlZCBkYXRhIHRvIHRoZSBQUE0gb3IgUEdNIGZpbGUuICBPbiBQQ3MsIGluIG9yZGVyIHRvIG1ha2UgdGhpcworICogd29yayB0aGUgb3V0cHV0IGJ1ZmZlciBtdXN0IGJlIGFsbG9jYXRlZCBpbiBuZWFyIGRhdGEgc3BhY2UsIGJlY2F1c2Ugd2UgYXJlCisgKiBhc3N1bWluZyBzbWFsbC1kYXRhIG1lbW9yeSBtb2RlbCB3aGVyZWluIGZ3cml0ZSgpIGNhbid0IHJlYWNoIGZhciBtZW1vcnkuCisgKiBJZiB5b3UgbmVlZCB0byBwcm9jZXNzIHZlcnkgd2lkZSBpbWFnZXMgb24gYSBQQywgeW91IG1pZ2h0IGhhdmUgdG8gY29tcGlsZQorICogaW4gbGFyZ2UtbWVtb3J5IG1vZGVsLCBvciBlbHNlIHJlcGxhY2UgZndyaXRlKCkgd2l0aCBhIHB1dGMoKSBsb29wIC0tLQorICogd2hpY2ggd2lsbCBiZSBtdWNoIHNsb3dlci4KKyAqLworCisKKy8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBVc3VhbGx5IHRoZXNlIHR3byBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBwbGFjZTogKi8KKyAgY2hhciAqaW9idWZmZXI7CQkvKiBmd3JpdGUncyBJL08gYnVmZmVyICovCisgIEpTQU1QUk9XIHBpeHJvdzsJCS8qIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyICovCisgIHNpemVfdCBidWZmZXJfd2lkdGg7CQkvKiB3aWR0aCBvZiBJL08gYnVmZmVyICovCisgIEpESU1FTlNJT04gc2FtcGxlc19wZXJfcm93OwkvKiBKU0FNUExFcyBwZXIgb3V0cHV0IHJvdyAqLworfSBwcG1fZGVzdF9zdHJ1Y3Q7CisKK3R5cGVkZWYgcHBtX2Rlc3Rfc3RydWN0ICogcHBtX2Rlc3RfcHRyOworCisKKy8qCisgKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCisgKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCisgKgorICogcHV0X3BpeGVsX3Jvd3MgaGFuZGxlcyB0aGUgIm5vcm1hbCIgOC1iaXQgY2FzZSB3aGVyZSB0aGUgZGVjb21wcmVzc29yCisgKiBvdXRwdXQgYnVmZmVyIGlzIHBoeXNpY2FsbHkgdGhlIHNhbWUgYXMgdGhlIGZ3cml0ZSBidWZmZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKK3sKKyAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKKworICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOworfQorCisKKy8qCisgKiBUaGlzIGNvZGUgaXMgdXNlZCB3aGVuIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSBhbmQgYXBwbHkgYSBwaXhlbAorICogZm9ybWF0IHRyYW5zbGF0aW9uLiAgVHlwaWNhbGx5IHRoaXMgb25seSBoYXBwZW5zIGluIDEyLWJpdCBtb2RlLgorICovCisKK01FVEhPRERFRih2b2lkKQorY29weV9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKK3sKKyAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgY2hhciAqIGJ1ZmZlcnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBkZXN0LT5zYW1wbGVzX3Blcl9yb3c7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRSgqcHRyKyspKTsKKyAgfQorICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOworfQorCisKKy8qCisgKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEgd2hlbiBjb2xvciBxdWFudGl6YXRpb24gaXMgaW4gZWZmZWN0LgorICogV2UgaGF2ZSB0byBkZW1hcCB0aGUgY29sb3IgaW5kZXggdmFsdWVzIHRvIHN0cmFpZ2h0IGRhdGEuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwdXRfZGVtYXBwZWRfcmdiIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCit7CisgIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIGNoYXIgKiBidWZmZXJwdHI7CisgIHJlZ2lzdGVyIGludCBwaXh2YWw7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMSA9IGNpbmZvLT5jb2xvcm1hcFsxXTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgYnVmZmVycHRyID0gZGVzdC0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICBwaXh2YWwgPSBHRVRKU0FNUExFKCpwdHIrKyk7CisgICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRShjb2xvcl9tYXAwW3BpeHZhbF0pKTsKKyAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcDFbcGl4dmFsXSkpOworICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwMltwaXh2YWxdKSk7CisgIH0KKyAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK3B1dF9kZW1hcHBlZF9ncmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQoreworICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBjaGFyICogYnVmZmVycHRyOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGNvbG9yX21hcCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgYnVmZmVycHRyID0gZGVzdC0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcFtHRVRKU0FNUExFKCpwdHIrKyldKSk7CisgIH0KKyAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKK30KKworCisvKgorICogU3RhcnR1cDogd3JpdGUgdGhlIGZpbGUgaGVhZGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfb3V0cHV0X3BwbSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87CisKKyAgLyogRW1pdCBmaWxlIGhlYWRlciAqLworICBzd2l0Y2ggKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIC8qIGVtaXQgaGVhZGVyIGZvciByYXcgUEdNIGZvcm1hdCAqLworICAgIGZwcmludGYoZGVzdC0+cHViLm91dHB1dF9maWxlLCAiUDVcbiVsZCAlbGRcbiVkXG4iLAorCSAgICAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwgKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LAorCSAgICBQUE1fTUFYVkFMKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorICAgIC8qIGVtaXQgaGVhZGVyIGZvciByYXcgUFBNIGZvcm1hdCAqLworICAgIGZwcmludGYoZGVzdC0+cHViLm91dHB1dF9maWxlLCAiUDZcbiVsZCAlbGRcbiVkXG4iLAorCSAgICAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwgKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LAorCSAgICBQUE1fTUFYVkFMKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9DT0xPUlNQQUNFKTsKKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9vdXRwdXRfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLworICBmZmx1c2goZGluZm8tPm91dHB1dF9maWxlKTsKKyAgaWYgKGZlcnJvcihkaW5mby0+b3V0cHV0X2ZpbGUpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Cit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFBQTSBmb3JtYXQgb3V0cHV0LgorICovCisKK0dMT0JBTChkanBlZ19kZXN0X3B0cikKK2ppbml0X3dyaXRlX3BwbSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcHBtX2Rlc3RfcHRyIGRlc3Q7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLworICBkZXN0ID0gKHBwbV9kZXN0X3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YocHBtX2Rlc3Rfc3RydWN0KSk7CisgIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfcHBtOworICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfcHBtOworCisgIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KKyAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKKworICAvKiBDcmVhdGUgcGh5c2ljYWwgSS9PIGJ1ZmZlci4gIE5vdGUgd2UgbWFrZSB0aGlzIG5lYXIgb24gYSBQQy4gKi8KKyAgZGVzdC0+c2FtcGxlc19wZXJfcm93ID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgZGVzdC0+YnVmZmVyX3dpZHRoID0gZGVzdC0+c2FtcGxlc19wZXJfcm93ICogKEJZVEVTUEVSU0FNUExFICogU0laRU9GKGNoYXIpKTsKKyAgZGVzdC0+aW9idWZmZXIgPSAoY2hhciAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgfHwgQklUU19JTl9KU0FNUExFICE9IDggfHwKKyAgICAgIFNJWkVPRihKU0FNUExFKSAhPSBTSVpFT0YoY2hhcikpIHsKKyAgICAvKiBXaGVuIHF1YW50aXppbmcsIHdlIG5lZWQgYW4gb3V0cHV0IGJ1ZmZlciBmb3IgY29sb3JtYXAgaW5kZXhlcworICAgICAqIHRoYXQncyBzZXBhcmF0ZSBmcm9tIHRoZSBwaHlzaWNhbCBJL08gYnVmZmVyLiAgV2UgYWxzbyBuZWVkIGEKKyAgICAgKiBzZXBhcmF0ZSBidWZmZXIgaWYgcGl4ZWwgZm9ybWF0IHRyYW5zbGF0aW9uIG11c3QgdGFrZSBwbGFjZS4KKyAgICAgKi8KKyAgICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMsIChKRElNRU5TSU9OKSAxKTsKKyAgICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisgICAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycykKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IGNvcHlfcGl4ZWxfcm93czsKKyAgICBlbHNlIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpCisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZGVtYXBwZWRfZ3JheTsKKyAgICBlbHNlCisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZGVtYXBwZWRfcmdiOworICB9IGVsc2UgeworICAgIC8qIFdlIHdpbGwgZndyaXRlKCkgZGlyZWN0bHkgZnJvbSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICAvKiBTeW50aGVzaXplIGEgSlNBTVBBUlJBWSBwb2ludGVyIHN0cnVjdHVyZSAqLworICAgIC8qIENhc3QgaGVyZSBpbXBsaWVzIG5lYXItPmZhciBwb2ludGVyIGNvbnZlcnNpb24gb24gUENzICovCisgICAgZGVzdC0+cGl4cm93ID0gKEpTQU1QUk9XKSBkZXN0LT5pb2J1ZmZlcjsKKyAgICBkZXN0LT5wdWIuYnVmZmVyID0gJiBkZXN0LT5waXhyb3c7CisgICAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOworICB9CisKKyAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKK30KKworI2VuZGlmIC8qIFBQTV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pwZWcvd3JybGUuYyBiL2pwZWcvd3JybGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU3MzM3Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZy93cnJsZS5jCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogd3JybGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gUkxFIGZvcm1hdC4KKyAqIFRoZSBVdGFoIFJhc3RlciBUb29sa2l0IGxpYnJhcnkgaXMgcmVxdWlyZWQgKHZlcnNpb24gMy4xIG9yIGxhdGVyKS4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCisgKgorICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBNaWtlIExpamV3c2tpLAorICogd2l0aCB1cGRhdGVzIGZyb20gUm9iZXJ0IEh1dGNoaW5zb24uCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIFJMRV9TVVBQT1JURUQKKworLyogcmxlLmggaXMgcHJvdmlkZWQgYnkgdGhlIFV0YWggUmFzdGVyIFRvb2xraXQuICovCisKKyNpbmNsdWRlIDxybGUuaD4KKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0IEpTQU1QTEUgaGFzIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFzIHJsZV9waXhlbCwKKyAqIHRvIHdpdCwgInVuc2lnbmVkIGNoYXIiLiAgSGVuY2Ugd2UgY2FuJ3QgY29wZSB3aXRoIDEyLSBvciAxNi1iaXQgc2FtcGxlcy4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyoKKyAqIFNpbmNlIFJMRSBzdG9yZXMgc2NhbmxpbmVzIGJvdHRvbS10by10b3AsIHdlIGhhdmUgdG8gaW52ZXJ0IHRoZSBpbWFnZQorICogZnJvbSBKUEVHJ3MgdG9wLXRvLWJvdHRvbSBvcmRlci4gIFRvIGRvIHRoaXMsIHdlIHNhdmUgdGhlIG91dGdvaW5nIGRhdGEKKyAqIGluIGEgdmlydHVhbCBhcnJheSBkdXJpbmcgcHV0X3BpeGVsX3JvdyBjYWxscywgdGhlbiBhY3R1YWxseSBlbWl0IHRoZQorICogUkxFIGZpbGUgZHVyaW5nIGZpbmlzaF9vdXRwdXQuCisgKi8KKworCisvKgorICogRm9yIG5vdywgaWYgd2UgZW1pdCBhbiBSTEUgY29sb3IgbWFwIHRoZW4gaXQgaXMgYWx3YXlzIDI1NiBlbnRyaWVzIGxvbmcsCisgKiB0aG91Z2ggbm90IGFsbCBvZiB0aGUgZW50cmllcyBuZWVkIGJlIHVzZWQuCisgKi8KKworI2RlZmluZSBDTUFQQklUUwk4CisjZGVmaW5lIENNQVBMRU5HVEgJKDE8PChDTUFQQklUUykpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIGp2aXJ0X3NhcnJheV9wdHIgaW1hZ2U7CS8qIHZpcnR1YWwgYXJyYXkgdG8gc3RvcmUgdGhlIG91dHB1dCBpbWFnZSAqLworICBybGVfbWFwICpjb2xvcm1hcDsJIAkvKiBSTEUtc3R5bGUgY29sb3IgbWFwLCBvciBOVUxMIGlmIG5vbmUgKi8KKyAgcmxlX3BpeGVsICoqcmxlX3JvdzsJCS8qIFRvIHBhc3Mgcm93cyB0byBybGVfcHV0cm93KCkgKi8KKworfSBybGVfZGVzdF9zdHJ1Y3Q7CisKK3R5cGVkZWYgcmxlX2Rlc3Rfc3RydWN0ICogcmxlX2Rlc3RfcHRyOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKHZvaWQpIHJsZV9wdXRfcGl4ZWxfcm93cworICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkpOworCisKKy8qCisgKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuCisgKgorICogSW4gdGhpcyBtb2R1bGUgaXQncyBlYXNpZXIgdG8gd2FpdCB0aWxsIGZpbmlzaF9vdXRwdXQgdG8gd3JpdGUgYW55dGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9vdXRwdXRfcmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKKyAgc2l6ZV90IGNtYXBzaXplOworICBpbnQgaSwgY2k7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyNlbmRpZgorCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGUgaW1hZ2UgY2FuIGJlIHN0b3JlZCBpbiBSTEUgZm9ybWF0LgorICAgKgorICAgKiAtIFJMRSBzdG9yZXMgaW1hZ2UgZGltZW5zaW9ucyBhcyAqc2lnbmVkKiAxNiBiaXQgaW50ZWdlcnMuICBKUEVHCisgICAqICAgdXNlcyB1bnNpZ25lZCwgc28gd2UgaGF2ZSB0byBjaGVjayB0aGUgd2lkdGguCisgICAqCisgICAqIC0gQ29sb3JzcGFjZSBpcyBleHBlY3RlZCB0byBiZSBncmF5c2NhbGUgb3IgUkdCLgorICAgKgorICAgKiAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKGNvbXBvbmVudHMpIGlzIGV4cGVjdGVkIHRvIGJlIDEgKGdyYXlzY2FsZS8KKyAgICogICBwc2V1ZG9jb2xvcikgb3IgMyAodHJ1ZWNvbG9yL2RpcmVjdGNvbG9yKS4KKyAgICogICAoY291bGQgYmUgMiBvciA0IGlmIHVzaW5nIGFuIGFscGhhIGNoYW5uZWwsIGJ1dCB3ZSBhcmVuJ3QpCisgICAqLworCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoID4gMzI3NjcgfHwgY2luZm8tPm91dHB1dF9oZWlnaHQgPiAzMjc2NykKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9STEVfRElNRU5TSU9OUywgY2luZm8tPm91dHB1dF93aWR0aCwgCisJICAgICBjaW5mby0+b3V0cHV0X2hlaWdodCk7CisKKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX0dSQVlTQ0FMRSAmJgorICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0NPTE9SU1BBQ0UpOworCisgIGlmIChjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgIT0gMSAmJiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgIT0gMykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9STEVfVE9PTUFOWUNIQU5ORUxTLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOworCisgIC8qIENvbnZlcnQgY29sb3JtYXAsIGlmIGFueSwgdG8gUkxFIGZvcm1hdC4gKi8KKworICBkZXN0LT5jb2xvcm1hcCA9IE5VTEw7CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICAvKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBSTEUtc3R5bGUgY21hcCwgemVybyBhbnkgZXh0cmEgZW50cmllcyAqLworICAgIGNtYXBzaXplID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICogQ01BUExFTkdUSCAqIFNJWkVPRihybGVfbWFwKTsKKyAgICBkZXN0LT5jb2xvcm1hcCA9IChybGVfbWFwICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBjbWFwc2l6ZSk7CisgICAgTUVNWkVSTyhkZXN0LT5jb2xvcm1hcCwgY21hcHNpemUpOworCisgICAgLyogU2F2ZSBhd2F5IGRhdGEgaW4gUkxFIGZvcm1hdCAtLS0gbm90ZSA4LWJpdCBsZWZ0IHNoaWZ0ISAqLworICAgIC8qIFNoaWZ0aW5nIHdvdWxkIG5lZWQgYWRqdXN0bWVudCBmb3IgSlNBTVBMRXMgd2lkZXIgdGhhbiA4IGJpdHMuICovCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOyBpKyspIHsKKyAgICAgICAgZGVzdC0+Y29sb3JtYXBbY2kgKiBDTUFQTEVOR1RIICsgaV0gPQorICAgICAgICAgIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwW2NpXVtpXSkgPDwgODsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBTZXQgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIGZpcnN0IHJvdyAqLworICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwgKEpESU1FTlNJT04pIDAsIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworCisgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHJsZV9wdXRfcGl4ZWxfcm93czsKKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgIC8qIGNvdW50IGZpbGUgd3JpdGluZyBhcyBzZXBhcmF0ZSBwYXNzICovCisgIH0KKyNlbmRpZgorfQorCisKKy8qCisgKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCisgKgorICogVGhpcyByb3V0aW5lIGp1c3Qgc2F2ZXMgdGhlIGRhdGEgYXdheSBpbiBhIHZpcnR1YWwgYXJyYXkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitybGVfcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQkgICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQoreworICBybGVfZGVzdF9wdHIgZGVzdCA9IChybGVfZGVzdF9wdHIpIGRpbmZvOworCisgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPmltYWdlLAorICAgICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUsIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgfQorfQorCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKgorICogSGVyZSBpcyB3aGVyZSB3ZSByZWFsbHkgb3V0cHV0IHRoZSBSTEUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9vdXRwdXRfcmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmxlX2hkciBoZWFkZXI7CQkvKiBPdXRwdXQgZmlsZSBpbmZvcm1hdGlvbiAqLworICBybGVfcGl4ZWwgKipybGVfcm93LCAqcmVkLCAqZ3JlZW4sICpibHVlOworICBKU0FNUFJPVyBvdXRwdXRfcm93OworICBjaGFyIGNtYXBjb21tZW50WzgwXTsKKyAgaW50IHJvdywgY29sOworICBpbnQgY2k7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyNlbmRpZgorCisgIC8qIEluaXRpYWxpemUgdGhlIGhlYWRlciBpbmZvICovCisgIGhlYWRlciA9ICpybGVfaGRyX2luaXQoTlVMTCk7CisgIGhlYWRlci5ybGVfZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKKyAgaGVhZGVyLnhtaW4gICAgID0gMDsKKyAgaGVhZGVyLnhtYXggICAgID0gY2luZm8tPm91dHB1dF93aWR0aCAgLSAxOworICBoZWFkZXIueW1pbiAgICAgPSAwOworICBoZWFkZXIueW1heCAgICAgPSBjaW5mby0+b3V0cHV0X2hlaWdodCAtIDE7CisgIGhlYWRlci5hbHBoYSAgICA9IDA7CisgIGhlYWRlci5uY29sb3JzICA9IGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm91dHB1dF9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgUkxFX1NFVF9CSVQoaGVhZGVyLCBjaSk7CisgIH0KKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICBoZWFkZXIubmNtYXAgICA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgICBoZWFkZXIuY21hcGxlbiA9IENNQVBCSVRTOworICAgIGhlYWRlci5jbWFwICAgID0gZGVzdC0+Y29sb3JtYXA7CisgICAgLyogQWRkIGEgY29tbWVudCB0byB0aGUgb3V0cHV0IGltYWdlIHdpdGggdGhlIHRydWUgY29sb3JtYXAgbGVuZ3RoLiAqLworICAgIHNwcmludGYoY21hcGNvbW1lbnQsICJjb2xvcl9tYXBfbGVuZ3RoPSVkIiwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzKTsKKyAgICBybGVfcHV0Y29tKGNtYXBjb21tZW50LCAmaGVhZGVyKTsKKyAgfQorCisgIC8qIEVtaXQgdGhlIFJMRSBoZWFkZXIgYW5kIGNvbG9yIG1hcCAoaWYgYW55KSAqLworICBybGVfcHV0X3NldHVwKCZoZWFkZXIpOworCisgIC8qIE5vdyBvdXRwdXQgdGhlIFJMRSBkYXRhIGZyb20gb3VyIHZpcnR1YWwgYXJyYXkuCisgICAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgKGEpIHJsZV9waXhlbCBpcyByZXByZXNlbnRlZCB0aGUgc2FtZSBhcyBKU0FNUExFLAorICAgKiBhbmQgKGIpIHdlIGFyZSBub3Qgb24gYSBtYWNoaW5lIHdoZXJlIEZBUiBwb2ludGVycyBkaWZmZXIgZnJvbSByZWd1bGFyLgorICAgKi8KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gMDsKKyAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9PSAxKSB7CisgICAgZm9yIChyb3cgPSBjaW5mby0+b3V0cHV0X2hlaWdodC0xOyByb3cgPj0gMDsgcm93LS0pIHsKKyAgICAgIHJsZV9yb3cgPSAocmxlX3BpeGVsICoqKSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKKwkgKEpESU1FTlNJT04pIHJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKyAgICAgIHJsZV9wdXRyb3cocmxlX3JvdywgKGludCkgY2luZm8tPm91dHB1dF93aWR0aCwgJmhlYWRlcik7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOworICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHJvdyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0LTE7IHJvdyA+PSAwOyByb3ctLSkgeworICAgICAgcmxlX3JvdyA9IChybGVfcGl4ZWwgKiopIGRlc3QtPnJsZV9yb3c7CisgICAgICBvdXRwdXRfcm93ID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKKwkgKEpESU1FTlNJT04pIHJvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKyAgICAgIHJlZCA9IHJsZV9yb3dbMF07CisgICAgICBncmVlbiA9IHJsZV9yb3dbMV07CisgICAgICBibHVlID0gcmxlX3Jvd1syXTsKKyAgICAgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgICAgKnJlZCsrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKKyAgICAgICAgKmdyZWVuKysgPSBHRVRKU0FNUExFKCpvdXRwdXRfcm93KyspOworICAgICAgICAqYmx1ZSsrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKKyAgICAgIH0KKyAgICAgIHJsZV9wdXRyb3cocmxlX3JvdywgKGludCkgY2luZm8tPm91dHB1dF93aWR0aCwgJmhlYWRlcik7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOworICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKQorICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7CisjZW5kaWYKKworICAvKiBFbWl0IGZpbGUgdHJhaWxlciAqLworICBybGVfcHV0ZW9mKCZoZWFkZXIpOworICBmZmx1c2goZGVzdC0+cHViLm91dHB1dF9maWxlKTsKKyAgaWYgKGZlcnJvcihkZXN0LT5wdWIub3V0cHV0X2ZpbGUpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Cit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFJMRSBmb3JtYXQgb3V0cHV0LgorICovCisKK0dMT0JBTChkanBlZ19kZXN0X3B0cikKK2ppbml0X3dyaXRlX3JsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcmxlX2Rlc3RfcHRyIGRlc3Q7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLworICBkZXN0ID0gKHJsZV9kZXN0X3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRU9GKHJsZV9kZXN0X3N0cnVjdCkpOworICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X3JsZTsKKyAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X3JsZTsKKworICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCisgIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7CisKKyAgLyogQWxsb2NhdGUgYSB3b3JrIGFycmF5IGZvciBvdXRwdXQgdG8gdGhlIFJMRSBsaWJyYXJ5LiAqLworICBkZXN0LT5ybGVfcm93ID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgY2luZm8tPm91dHB1dF93aWR0aCwgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyk7CisKKyAgLyogQWxsb2NhdGUgYSB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlLiAqLworICBkZXN0LT5pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKyAgICAgKEpESU1FTlNJT04pIChjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzKSwKKyAgICAgY2luZm8tPm91dHB1dF9oZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKKworICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OworfQorCisjZW5kaWYgLyogUkxFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanBlZy93cnRhcmdhLmMgYi9qcGVnL3dydGFyZ2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjEwNGQyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZy93cnRhcmdhLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiB3cnRhcmdhLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIFRhcmdhIGZvcm1hdC4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCisgKgorICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBMZWUgRGFuaWVsIENyb2NrZXIuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAorCisKKy8qCisgKiBUbyBzdXBwb3J0IDEyLWJpdCBKUEVHIGRhdGEsIHdlJ2QgaGF2ZSB0byBzY2FsZSBvdXRwdXQgZG93biB0byA4IGJpdHMuCisgKiBUaGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDgtYml0IEpTQU1QTEVzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisvKgorICogVGhlIG91dHB1dCBidWZmZXIgbmVlZHMgdG8gYmUgd3JpdGFibGUgYnkgZndyaXRlKCkuICBPbiBQQ3MsIHdlIG11c3QKKyAqIGFsbG9jYXRlIHRoZSBidWZmZXIgaW4gbmVhciBkYXRhIHNwYWNlLCBiZWNhdXNlIHdlIGFyZSBhc3N1bWluZyBzbWFsbC1kYXRhCisgKiBtZW1vcnkgbW9kZWwsIHdoZXJlaW4gZndyaXRlKCkgY2FuJ3QgcmVhY2ggZmFyIG1lbW9yeS4gIElmIHlvdSBuZWVkIHRvCisgKiBwcm9jZXNzIHZlcnkgd2lkZSBpbWFnZXMgb24gYSBQQywgeW91IG1pZ2h0IGhhdmUgdG8gY29tcGlsZSBpbiBsYXJnZS1tZW1vcnkKKyAqIG1vZGVsLCBvciBlbHNlIHJlcGxhY2UgZndyaXRlKCkgd2l0aCBhIHB1dGMoKSBsb29wIC0tLSB3aGljaCB3aWxsIGJlIG11Y2gKKyAqIHNsb3dlci4KKyAqLworCisKKy8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBjaGFyICppb2J1ZmZlcjsJCS8qIHBoeXNpY2FsIEkvTyBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBidWZmZXJfd2lkdGg7CS8qIHdpZHRoIG9mIG9uZSByb3cgKi8KK30gdGdhX2Rlc3Rfc3RydWN0OworCit0eXBlZGVmIHRnYV9kZXN0X3N0cnVjdCAqIHRnYV9kZXN0X3B0cjsKKworCitMT0NBTCh2b2lkKQord3JpdGVfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywgaW50IG51bV9jb2xvcnMpCisvKiBDcmVhdGUgYW5kIHdyaXRlIGEgVGFyZ2EgaGVhZGVyICovCit7CisgIGNoYXIgdGFyZ2FoZWFkZXJbMThdOworCisgIC8qIFNldCB1bnVzZWQgZmllbGRzIG9mIGhlYWRlciB0byAwICovCisgIE1FTVpFUk8odGFyZ2FoZWFkZXIsIFNJWkVPRih0YXJnYWhlYWRlcikpOworCisgIGlmIChudW1fY29sb3JzID4gMCkgeworICAgIHRhcmdhaGVhZGVyWzFdID0gMTsJCS8qIGNvbG9yIG1hcCB0eXBlIDEgKi8KKyAgICB0YXJnYWhlYWRlcls1XSA9IChjaGFyKSAobnVtX2NvbG9ycyAmIDB4RkYpOworICAgIHRhcmdhaGVhZGVyWzZdID0gKGNoYXIpIChudW1fY29sb3JzID4+IDgpOworICAgIHRhcmdhaGVhZGVyWzddID0gMjQ7CS8qIDI0IGJpdHMgcGVyIGNtYXAgZW50cnkgKi8KKyAgfQorCisgIHRhcmdhaGVhZGVyWzEyXSA9IChjaGFyKSAoY2luZm8tPm91dHB1dF93aWR0aCAmIDB4RkYpOworICB0YXJnYWhlYWRlclsxM10gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gOCk7CisgIHRhcmdhaGVhZGVyWzE0XSA9IChjaGFyKSAoY2luZm8tPm91dHB1dF9oZWlnaHQgJiAweEZGKTsKKyAgdGFyZ2FoZWFkZXJbMTVdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X2hlaWdodCA+PiA4KTsKKyAgdGFyZ2FoZWFkZXJbMTddID0gMHgyMDsJLyogVG9wLWRvd24sIG5vbi1pbnRlcmxhY2VkICovCisKKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgeworICAgIHRhcmdhaGVhZGVyWzJdID0gMzsJCS8qIGltYWdlIHR5cGUgPSB1bmNvbXByZXNzZWQgZ3JheS1zY2FsZSAqLworICAgIHRhcmdhaGVhZGVyWzE2XSA9IDg7CS8qIGJpdHMgcGVyIHBpeGVsICovCisgIH0gZWxzZSB7CQkJLyogbXVzdCBiZSBSR0IgKi8KKyAgICBpZiAobnVtX2NvbG9ycyA+IDApIHsKKyAgICAgIHRhcmdhaGVhZGVyWzJdID0gMTsJLyogaW1hZ2UgdHlwZSA9IGNvbG9ybWFwcGVkIFJHQiAqLworICAgICAgdGFyZ2FoZWFkZXJbMTZdID0gODsKKyAgICB9IGVsc2UgeworICAgICAgdGFyZ2FoZWFkZXJbMl0gPSAyOwkvKiBpbWFnZSB0eXBlID0gdW5jb21wcmVzc2VkIFJHQiAqLworICAgICAgdGFyZ2FoZWFkZXJbMTZdID0gMjQ7CisgICAgfQorICB9CisKKyAgaWYgKEpGV1JJVEUoZGluZm8tPm91dHB1dF9maWxlLCB0YXJnYWhlYWRlciwgMTgpICE9IChzaXplX3QpIDE4KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Cit9CisKKworLyoKKyAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KKyAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3B1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQorLyogdXNlZCBmb3IgdW5xdWFudGl6ZWQgZnVsbC1jb2xvciBvdXRwdXQgKi8KK3sKKyAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIGNoYXIgKiBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgb3V0cHRyID0gZGVzdC0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICBvdXRwdHJbMF0gPSAoY2hhcikgR0VUSlNBTVBMRShpbnB0clsyXSk7IC8qIFJHQiB0byBCR1Igb3JkZXIgKi8KKyAgICBvdXRwdHJbMV0gPSAoY2hhcikgR0VUSlNBTVBMRShpbnB0clsxXSk7CisgICAgb3V0cHRyWzJdID0gKGNoYXIpIEdFVEpTQU1QTEUoaW5wdHJbMF0pOworICAgIGlucHRyICs9IDMsIG91dHB0ciArPSAzOworICB9CisgICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Cit9CisKK01FVEhPRERFRih2b2lkKQorcHV0X2dyYXlfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJICAgICAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKKy8qIHVzZWQgZm9yIGdyYXlzY2FsZSBPUiBxdWFudGl6ZWQgY29sb3Igb3V0cHV0ICovCit7CisgIHRnYV9kZXN0X3B0ciBkZXN0ID0gKHRnYV9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBjaGFyICogb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIG91dHB0ciA9IGRlc3QtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKm91dHB0cisrID0gKGNoYXIpIEdFVEpTQU1QTEUoKmlucHRyKyspOworICB9CisgICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Cit9CisKKworLyoKKyAqIFdyaXRlIHNvbWUgZGVtYXBwZWQgcGl4ZWwgZGF0YSB3aGVuIGNvbG9yIHF1YW50aXphdGlvbiBpcyBpbiBlZmZlY3QuCisgKiBGb3IgVGFyZ2EsIHRoaXMgaXMgb25seSBhcHBsaWVkIHRvIGdyYXlzY2FsZSBkYXRhLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHV0X2RlbWFwcGVkX2dyYXkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQkgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCit7CisgIHRnYV9kZXN0X3B0ciBkZXN0ID0gKHRnYV9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBjaGFyICogb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIG91dHB0ciA9IGRlc3QtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKm91dHB0cisrID0gKGNoYXIpIEdFVEpTQU1QTEUoY29sb3JfbWFwMFtHRVRKU0FNUExFKCppbnB0cisrKV0pOworICB9CisgICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Cit9CisKKworLyoKKyAqIFN0YXJ0dXA6IHdyaXRlIHRoZSBmaWxlIGhlYWRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X291dHB1dF90Z2EgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOworICBpbnQgbnVtX2NvbG9ycywgaTsKKyAgRklMRSAqb3V0ZmlsZTsKKworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgLyogVGFyZ2EgZG9lc24ndCBoYXZlIGEgbWFwcGVkIGdyYXlzY2FsZSBmb3JtYXQsIHNvIHdlIHdpbGwgKi8KKyAgICAvKiBkZW1hcCBxdWFudGl6ZWQgZ3JheSBvdXRwdXQuICBOZXZlciBlbWl0IGEgY29sb3JtYXAuICovCisgICAgd3JpdGVfaGVhZGVyKGNpbmZvLCBkaW5mbywgMCk7CisgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZGVtYXBwZWRfZ3JheTsKKyAgICBlbHNlCisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZ3JheV9yb3dzOworICB9IGVsc2UgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgOC1iaXQgY29sb3JtYXAgaW5kZXhlcywgc28gb25seSAyNTYgY29sb3JzICovCisgICAgICBudW1fY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICAgICAgaWYgKG51bV9jb2xvcnMgPiAyNTYpCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfVE9PX01BTllfQ09MT1JTLCBudW1fY29sb3JzKTsKKyAgICAgIHdyaXRlX2hlYWRlcihjaW5mbywgZGluZm8sIG51bV9jb2xvcnMpOworICAgICAgLyogV3JpdGUgdGhlIGNvbG9ybWFwLiAgTm90ZSBUYXJnYSB1c2VzIEJHUiBieXRlIG9yZGVyICovCisgICAgICBvdXRmaWxlID0gZGVzdC0+cHViLm91dHB1dF9maWxlOworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7IGkrKykgeworCXB1dGMoR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMl1baV0pLCBvdXRmaWxlKTsKKwlwdXRjKEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzFdW2ldKSwgb3V0ZmlsZSk7CisJcHV0YyhHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOworICAgICAgfQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVfaGVhZGVyKGNpbmZvLCBkaW5mbywgMCk7CisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQ09MT1JTUEFDRSk7CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfb3V0cHV0X3RnYSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KKyAgZmZsdXNoKGRpbmZvLT5vdXRwdXRfZmlsZSk7CisgIGlmIChmZXJyb3IoZGluZm8tPm91dHB1dF9maWxlKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBUYXJnYSBmb3JtYXQgb3V0cHV0LgorICovCisKK0dMT0JBTChkanBlZ19kZXN0X3B0cikKK2ppbml0X3dyaXRlX3RhcmdhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICB0Z2FfZGVzdF9wdHIgZGVzdDsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCisgIGRlc3QgPSAodGdhX2Rlc3RfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRih0Z2FfZGVzdF9zdHJ1Y3QpKTsKKyAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF90Z2E7CisgIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF90Z2E7CisKKyAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworCisgIC8qIENyZWF0ZSBJL08gYnVmZmVyLiAgTm90ZSB3ZSBtYWtlIHRoaXMgbmVhciBvbiBhIFBDLiAqLworICBkZXN0LT5idWZmZXJfd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzOworICBkZXN0LT5pb2J1ZmZlciA9IChjaGFyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoc2l6ZV90KSAoZGVzdC0+YnVmZmVyX3dpZHRoICogU0laRU9GKGNoYXIpKSk7CisKKyAgLyogQ3JlYXRlIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLworICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgZGVzdC0+YnVmZmVyX3dpZHRoLCAoSkRJTUVOU0lPTikgMSk7CisgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKworICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OworfQorCisjZW5kaWYgLyogVEFSR0FfU1VQUE9SVEVEICovCg==