ZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtZ25vbWUvcmVjaXBlcy1nbm9tZS9ldm9sdXRpb24tZGF0YS1zZXJ2ZXIvZXZvbHV0aW9uLWRhdGEtc2VydmVyLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1nbm9tZS9yZWNpcGVzLWdub21lL2V2b2x1dGlvbi1kYXRhLXNlcnZlci9ldm9sdXRpb24tZGF0YS1zZXJ2ZXIuYmIKaW5kZXggMDhiZDc3OC4uN2YyNjdiNCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1nbm9tZS9yZWNpcGVzLWdub21lL2V2b2x1dGlvbi1kYXRhLXNlcnZlci9ldm9sdXRpb24tZGF0YS1zZXJ2ZXIuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1nbm9tZS9yZWNpcGVzLWdub21lL2V2b2x1dGlvbi1kYXRhLXNlcnZlci9ldm9sdXRpb24tZGF0YS1zZXJ2ZXIuYmIKQEAgLTYsNyArNiw3IEBACiAgICAgZGJ1cyBkYiB2aXJ0dWFsL2xpYmljb252IHpsaWIgbGlic291cC0yLjQgbGliaWNhbCBuc3MgbGlic2VjcmV0IFwKICIKIAotaW5oZXJpdCBnc2V0dGluZ3MgZ29iamVjdC1pbnRyb3NwZWN0aW9uIGZlYXR1cmVzX2NoZWNrIGNtYWtlIGd0ay1kb2MgZ2V0dGV4dCBwZXJsbmF0aXZlIHB5dGhvbm5hdGl2ZQoraW5oZXJpdCBnc2V0dGluZ3MgZ29iamVjdC1pbnRyb3NwZWN0aW9uIGZlYXR1cmVzX2NoZWNrIGNtYWtlIGd0ay1kb2MgZ2V0dGV4dCBwZXJsbmF0aXZlCiAKIFJFUVVJUkVEX0RJU1RST19GRUFUVVJFUyA9ICJ4MTEiCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtZ25vbWUvcmVjaXBlcy1rZXJuZWwvc3lzcHJvZi9maWxlcy8wMDAxLWxpYnN5c3Byb2YtdWktUmVuYW1lLWVudmlyb24tdG8tc3lzX2Vudmlyb24ucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLWdub21lL3JlY2lwZXMta2VybmVsL3N5c3Byb2YvZmlsZXMvMDAwMS1saWJzeXNwcm9mLXVpLVJlbmFtZS1lbnZpcm9uLXRvLXN5c19lbnZpcm9uLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmIzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLWdub21lL3JlY2lwZXMta2VybmVsL3N5c3Byb2YvZmlsZXMvMDAwMS1saWJzeXNwcm9mLXVpLVJlbmFtZS1lbnZpcm9uLXRvLXN5c19lbnZpcm9uLnBhdGNoCkBAIC0wLDAgKzEsNjMgQEAKK0Zyb20gNGJkMGQ1ZDVkZDY4NDFmYmFjODM4NTUyNzYxN2QxOGU3NzMxMjQ0ZCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CitEYXRlOiBXZWQsIDE1IEphbiAyMDIwIDEzOjE3OjU4IC0wODAwCitTdWJqZWN0OiBbUEFUQ0hdIGxpYnN5c3Byb2YtdWk6IFJlbmFtZSBlbnZpcm9uIHRvIHN5c19lbnZpcm9uCisKK1RoaXMgaGVscHMgYXZvaWQgbmFtZXNhcGFjZSBjb25mbGljdCB3aXRoIGdsaWJjIGhlYWRlcnMKKworRml4ZXMKKy91c3IvaW5jbHVkZS91bmlzdGQuaDo1NDU6MTU6IG5vdGU6IHByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmUKKworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworCitVcHN0cmVhbS1TdGF0dXM6IFBlbmRpbmcKK1NpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CistLS0KKyBzcmMvbGlic3lzcHJvZi11aS9zeXNwcm9mLXByb2ZpbGVyLWFzc2lzdGFudC5jIHwgMTAgKysrKystLS0tLQorIDEgZmlsZSBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9zcmMvbGlic3lzcHJvZi11aS9zeXNwcm9mLXByb2ZpbGVyLWFzc2lzdGFudC5jIGIvc3JjL2xpYnN5c3Byb2YtdWkvc3lzcHJvZi1wcm9maWxlci1hc3Npc3RhbnQuYworaW5kZXggMjJlM2UyNC4uYzU1ZDU1MSAxMDA2NDQKKy0tLSBhL3NyYy9saWJzeXNwcm9mLXVpL3N5c3Byb2YtcHJvZmlsZXItYXNzaXN0YW50LmMKKysrKyBiL3NyYy9saWJzeXNwcm9mLXVpL3N5c3Byb2YtcHJvZmlsZXItYXNzaXN0YW50LmMKK0BAIC0yMzUsNyArMjM1LDcgQEAgc3lzcHJvZl9wcm9maWxlcl9hc3Npc3RhbnRfcmVjb3JkX2NsaWNrZWRfY2IgKFN5c3Byb2ZQcm9maWxlckFzc2lzdGFudCAqc2VsZiwKKyAgICAgeworICAgICAgIGdfYXV0byhHU3RydikgYXJndiA9IE5VTEw7CisgICAgICAgZ19hdXRvKEdTdHJ2KSBlbnYgPSBOVUxMOworLSAgICAgIFN5c3Byb2ZFbnZpcm9uICplbnZpcm9uOworKyAgICAgIFN5c3Byb2ZFbnZpcm9uICpzeXNfZW52aXJvbjsKKyAgICAgICBjb25zdCBnY2hhciAqY29tbWFuZDsKKyAgICAgICBnaW50IGFyZ2M7CisgCitAQCAtMjQ1LDggKzI0NSw4IEBAIHN5c3Byb2ZfcHJvZmlsZXJfYXNzaXN0YW50X3JlY29yZF9jbGlja2VkX2NiIChTeXNwcm9mUHJvZmlsZXJBc3Npc3RhbnQgKnNlbGYsCisgICAgICAgc3lzcHJvZl9wcm9maWxlcl9zZXRfc3Bhd24gKHByb2ZpbGVyLCBUUlVFKTsKKyAgICAgICBzeXNwcm9mX3Byb2ZpbGVyX3NldF9zcGF3bl9hcmd2IChwcm9maWxlciwgKGNvbnN0IGdjaGFyICogY29uc3QgKilhcmd2KTsKKyAKKy0gICAgICBlbnZpcm9uID0gc3lzcHJvZl9lbnZpcm9uX2VkaXRvcl9nZXRfZW52aXJvbiAoc2VsZi0+ZW52aXJvbl9lZGl0b3IpOworLSAgICAgIGVudiA9IHN5c3Byb2ZfZW52aXJvbl9nZXRfZW52aXJvbiAoZW52aXJvbik7CisrICAgICAgc3lzX2Vudmlyb24gPSBzeXNwcm9mX2Vudmlyb25fZWRpdG9yX2dldF9lbnZpcm9uIChzZWxmLT5lbnZpcm9uX2VkaXRvcik7CisrICAgICAgZW52ID0gc3lzcHJvZl9lbnZpcm9uX2dldF9lbnZpcm9uIChzeXNfZW52aXJvbik7CisgICAgICAgc3lzcHJvZl9wcm9maWxlcl9zZXRfc3Bhd25fZW52IChwcm9maWxlciwgKGNvbnN0IGdjaGFyICogY29uc3QgKillbnYpOworIAorICAgICAgIHN5c3Byb2ZfcHJvZmlsZXJfc2V0X3NwYXduX2luaGVyaXRfZW52aXJvbiAocHJvZmlsZXIsCitAQCAtNDA1LDcgKzQwNSw3IEBAIHN5c3Byb2ZfcHJvZmlsZXJfYXNzaXN0YW50X2NsYXNzX2luaXQgKFN5c3Byb2ZQcm9maWxlckFzc2lzdGFudENsYXNzICprbGFzcykKKyBzdGF0aWMgdm9pZAorIHN5c3Byb2ZfcHJvZmlsZXJfYXNzaXN0YW50X2luaXQgKFN5c3Byb2ZQcm9maWxlckFzc2lzdGFudCAqc2VsZikKKyB7CistICBnX2F1dG9wdHIoU3lzcHJvZkVudmlyb24pIGVudmlyb24gPSBzeXNwcm9mX2Vudmlyb25fbmV3ICgpOworKyAgZ19hdXRvcHRyKFN5c3Byb2ZFbnZpcm9uKSBzeXNfZW52aXJvbiA9IHN5c3Byb2ZfZW52aXJvbl9uZXcgKCk7CisgCisgICBndGtfd2lkZ2V0X2luaXRfdGVtcGxhdGUgKEdUS19XSURHRVQgKHNlbGYpKTsKKyAKK0BAIC00NDUsNyArNDQ1LDcgQEAgc3lzcHJvZl9wcm9maWxlcl9hc3Npc3RhbnRfaW5pdCAoU3lzcHJvZlByb2ZpbGVyQXNzaXN0YW50ICpzZWxmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19DT05ORUNUX1NXQVBQRUQpOworIAorLSAgc3lzcHJvZl9lbnZpcm9uX2VkaXRvcl9zZXRfZW52aXJvbiAoc2VsZi0+ZW52aXJvbl9lZGl0b3IsIGVudmlyb24pOworKyAgc3lzcHJvZl9lbnZpcm9uX2VkaXRvcl9zZXRfZW52aXJvbiAoc2VsZi0+ZW52aXJvbl9lZGl0b3IsIHN5c19lbnZpcm9uKTsKKyB9CisgCisgdm9pZAorLS0gCisyLjI1LjAKKwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1nbm9tZS9yZWNpcGVzLWtlcm5lbC9zeXNwcm9mL2ZpbGVzLzAwMDEtbWVzb24uYnVpbGQtZG8tbm90LWhhcmRjb2RlLWxpbnV4LWFzLWhvc3RfbWFjaGluZS0ucy5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtZ25vbWUvcmVjaXBlcy1rZXJuZWwvc3lzcHJvZi9maWxlcy8wMDAxLW1lc29uLmJ1aWxkLWRvLW5vdC1oYXJkY29kZS1saW51eC1hcy1ob3N0X21hY2hpbmUtLnMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1NDg5MgotLS0gL2Rldi9udWxsCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtZ25vbWUvcmVjaXBlcy1rZXJuZWwvc3lzcHJvZi9maWxlcy8wMDAxLW1lc29uLmJ1aWxkLWRvLW5vdC1oYXJkY29kZS1saW51eC1hcy1ob3N0X21hY2hpbmUtLnMucGF0Y2gKQEAgLTAsMCArMSw0MiBAQAorRnJvbSA0M2MzOWI1Njg1NDQ1MjQyZDA3MWIzNzA2YWYyOTAzZWZhNTA4YjRhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQWxleGFuZGVyIEthbmF2aW4gPGFsZXgua2FuYXZpbkBnbWFpbC5jb20+CitEYXRlOiBUdWUsIDE0IEphbiAyMDIwIDEyOjU4OjI3ICswMTAwCitTdWJqZWN0OiBbUEFUQ0hdIG1lc29uLmJ1aWxkOiBkbyBub3QgaGFyZGNvZGUgJ2xpbnV4JyBhcworIGhvc3RfbWFjaGluZSgpLnN5c3RlbSgpIHZhbHVlCisKK0luIHNvbWUgYnVpbGQgZW52aXJvbm1ldHMgc3VjaCBhcyBPcGVuRW1iZWRkZWQgdGhpcyBjYW4gYmUgJ2xpbnV4LWdudWVhYmknCitvciBvdGhlcndpc2Ugbm90IGV4YWN0bHkgJ2xpbnV4Jy4KKworVXBzdHJlYW0tU3RhdHVzOiBQZW5kaW5nCitTaWduZWQtb2ZmLWJ5OiBBbGV4YW5kZXIgS2FuYXZpbiA8YWxleC5rYW5hdmluQGdtYWlsLmNvbT4KKy0tLQorIHNyYy9saWJzeXNwcm9mL21lc29uLmJ1aWxkIHwgMiArLQorIHNyYy90b29scy9tZXNvbi5idWlsZCAgICAgIHwgMiArLQorIDIgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvc3JjL2xpYnN5c3Byb2YvbWVzb24uYnVpbGQgYi9zcmMvbGlic3lzcHJvZi9tZXNvbi5idWlsZAoraW5kZXggMzQ0OTk2MS4uM2MyZDE4NiAxMDA2NDQKKy0tLSBhL3NyYy9saWJzeXNwcm9mL21lc29uLmJ1aWxkCisrKysgYi9zcmMvbGlic3lzcHJvZi9tZXNvbi5idWlsZAorQEAgLTg0LDcgKzg0LDcgQEAgbGlic3lzcHJvZl9kZXBzID0gWworICAgcG9sa2l0X2RlcCwKKyBdCisgCistaWYgaG9zdF9tYWNoaW5lLnN5c3RlbSgpID09ICdsaW51eCcKKytpZiBob3N0X21hY2hpbmUuc3lzdGVtKCkuY29udGFpbnMoJ2xpbnV4JykKKyAgIGxpYnN5c3Byb2ZfcHVibGljX3NvdXJjZXMgKz0gWworICAgICAnc3lzcHJvZi1tZW1vcnktc291cmNlLmMnLAorICAgICAnc3lzcHJvZi1wZXJmLWNvdW50ZXIuYycsCitkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL21lc29uLmJ1aWxkIGIvc3JjL3Rvb2xzL21lc29uLmJ1aWxkCitpbmRleCA2NzAwNTJhLi4zZmI3ZjBjIDEwMDY0NAorLS0tIGEvc3JjL3Rvb2xzL21lc29uLmJ1aWxkCisrKysgYi9zcmMvdG9vbHMvbWVzb24uYnVpbGQKK0BAIC0yLDcgKzIsNyBAQCB0b29sc19kZXBzID0gWworICAgbGlic3lzcHJvZl9jYXB0dXJlX2RlcCwKKyBdCisgCistaWYgZ2V0X29wdGlvbignbGlic3lzcHJvZicpIGFuZCBob3N0X21hY2hpbmUuc3lzdGVtKCkgPT0gJ2xpbnV4JworK2lmIGdldF9vcHRpb24oJ2xpYnN5c3Byb2YnKSBhbmQgaG9zdF9tYWNoaW5lLnN5c3RlbSgpLmNvbnRhaW5zKCdsaW51eCcpCisgICBwb2xraXRfYWdlbnRfZGVwID0gZGVwZW5kZW5jeSgncG9sa2l0LWFnZW50LTEnKQorICAgc3lzcHJvZl9jbGkgPSBleGVjdXRhYmxlKCdzeXNwcm9mLWNsaScsICdzeXNwcm9mLWNsaS5jJywKKyAgICAgZGVwZW5kZW5jaWVzOiB0b29sc19kZXBzICsgW2xpYnN5c3Byb2ZfZGVwLCBwb2xraXRfZGVwLCBwb2xraXRfYWdlbnRfZGVwXSwKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtZ25vbWUvcmVjaXBlcy1rZXJuZWwvc3lzcHJvZi9maWxlcy8wMDAxLXN5c3Byb2YtRGVmaW5lLU5UX0dOVV9CVUlMRF9JRC1pZi11bmRlZmluZWQucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLWdub21lL3JlY2lwZXMta2VybmVsL3N5c3Byb2YvZmlsZXMvMDAwMS1zeXNwcm9mLURlZmluZS1OVF9HTlVfQlVJTERfSUQtaWYtdW5kZWZpbmVkLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWE4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLWdub21lL3JlY2lwZXMta2VybmVsL3N5c3Byb2YvZmlsZXMvMDAwMS1zeXNwcm9mLURlZmluZS1OVF9HTlVfQlVJTERfSUQtaWYtdW5kZWZpbmVkLnBhdGNoCkBAIC0wLDAgKzEsMzUgQEAKK0Zyb20gMzAyNWQ4MGFhYWNjNWY2N2FhOWViMWU2ZmRlMzBmNzFkOWM1YjA0YiBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CitEYXRlOiBNb24sIDE4IEp1bCAyMDExIDE2OjAwOjE3IC0wNzAwCitTdWJqZWN0OiBbUEFUQ0ggMS8yXSBzeXNwcm9mOiBEZWZpbmUgTlRfR05VX0JVSUxEX0lEIGlmIHVuZGVmaW5lZAorCitPbiB1Y2xpYmMgZWxmLmggZG9lcyBub3QgaGF2ZSBHTlUgZXh0ZW50aW9ucyBidXQgd2UgbmVlZCB0aGlzIGRlZmluZQorc28gd2UgZGVmaW5lIGl0IGxvY2FsbHkgaWYgaXRzIG5vdCBnZXR0aW5nIGl0IGZyb20gZWxmLmgKKworU2lnbmVkLW9mZi1ieTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KKworVXBzdHJlYW0tU3RhdHVzOiBQZW5kaW5nCisKKyUlIG9yaWdpbmFsIHBhdGNoOiBkZWZpbmUtTlRfR05VX0JVSUxEX0lELnBhdGNoCistLS0KKyBzcmMvbGlic3lzcHJvZi9lbGZwYXJzZXIuaCB8IDQgKysrKworIDEgZmlsZSBjaGFuZ2VkLCA0IGluc2VydGlvbnMoKykKKworZGlmZiAtLWdpdCBhL3NyYy9saWJzeXNwcm9mL2VsZnBhcnNlci5oIGIvc3JjL2xpYnN5c3Byb2YvZWxmcGFyc2VyLmgKK2luZGV4IDE2MGU0YzkuLjk0ZmE1YzAgMTAwNjQ0CistLS0gYS9zcmMvbGlic3lzcHJvZi9lbGZwYXJzZXIuaAorKysrIGIvc3JjL2xpYnN5c3Byb2YvZWxmcGFyc2VyLmgKK0BAIC0xOCw2ICsxOCwxMCBAQAorIAorICNpbmNsdWRlIDxnbGliLmg+CisgCisrI2lmbmRlZiBOVF9HTlVfQlVJTERfSUQKKysjZGVmaW5lIE5UX0dOVV9CVUlMRF9JRCAzCisrI2VuZGlmCisrCisgdHlwZWRlZiBzdHJ1Y3QgRWxmU3ltIEVsZlN5bTsKKyB0eXBlZGVmIHN0cnVjdCBFbGZQYXJzZXIgRWxmUGFyc2VyOworIAorLS0gCisyLjE3LjEKKwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1nbm9tZS9yZWNpcGVzLWtlcm5lbC9zeXNwcm9mL3N5c3Byb2ZfMy4zNC4xLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1nbm9tZS9yZWNpcGVzLWtlcm5lbC9zeXNwcm9mL3N5c3Byb2ZfMy4zNC4xLmJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTMwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLWdub21lL3JlY2lwZXMta2VybmVsL3N5c3Byb2Yvc3lzcHJvZl8zLjM0LjEuYmIKQEAgLTAsMCArMSwzNyBAQAorU1VNTUFSWSA9ICJTeXN0ZW0td2lkZSBQZXJmb3JtYW5jZSBQcm9maWxlciBmb3IgTGludXgiCitIT01FUEFHRSA9ICJodHRwOi8vd3d3LnN5c3Byb2YuY29tIgorTElDRU5TRSA9ICJHUEx2MysiCitMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9DT1BZSU5HO21kNT1kMzIyMzliY2I2NzM0NjNhYjg3NGU4MGQ0N2ZhZTUwNCBcCisgICAgICAgICAgICAgICAgICAgIGZpbGU6Ly9zcmMvc3lzcHJvZi9zeXNwcm9mLWFwcGxpY2F0aW9uLmM7ZW5kbGluZT0xNzttZDU9YTNkZThkZjNiMGY4ODc2ZGQwMWUxMzg4ZDJkNGI2MDciCisKK0dOT01FQkFTRUJVSUxEQ0xBU1MgPSAibWVzb24iCitpbmhlcml0IGdub21lYmFzZSBnZXR0ZXh0IHN5c3RlbWQgdXBzdHJlYW0tdmVyc2lvbi1pcy1ldmVuIGdzZXR0aW5ncworCitERVBFTkRTID0gImdsaWItMi4wIGxpYnhtbDItbmF0aXZlIGdsaWItMi4wLW5hdGl2ZSIKKworU1JDX1VSSVthcmNoaXZlLm1kNXN1bV0gPSAiY2MzMjQ1NTI3N2IzMWFmYjE5NjVkNjI3YWUzZTM2MjkiCitTUkNfVVJJW2FyY2hpdmUuc2hhMjU2c3VtXSA9ICI4NDRiYmI4ZDhiNjUwNzFiM2JjYTk2ZjhlOTIxMzE5Y2VlZjgxZjJkMmM1MWZjYzlkYTYzYTRiMzU1Yzg5M2QwIgorU1JDX1VSSSArPSAiZmlsZTovLzAwMDEtc3lzcHJvZi1EZWZpbmUtTlRfR05VX0JVSUxEX0lELWlmLXVuZGVmaW5lZC5wYXRjaCBcCisgICAgICAgICAgICBmaWxlOi8vMDAwMS1tZXNvbi5idWlsZC1kby1ub3QtaGFyZGNvZGUtbGludXgtYXMtaG9zdF9tYWNoaW5lLS5zLnBhdGNoIFwKKyAgICAgICAgICAgIGZpbGU6Ly8wMDAxLWxpYnN5c3Byb2YtdWktUmVuYW1lLWVudmlyb24tdG8tc3lzX2Vudmlyb24ucGF0Y2ggXAorICAgICAgICAgICAgIgorCitQQUNLQUdFQ09ORklHID89ICJzeXNwcm9mZCBsaWJzeXNwcm9mICR7QGJiLnV0aWxzLmNvbnRhaW5zX2FueSgnRElTVFJPX0ZFQVRVUkVTJywgJyR7R1RLM0RJU1RST0ZFQVRVUkVTfScsICdndGsnLCAnJywgZCl9IgorUEFDS0FHRUNPTkZJR1tndGtdID0gIi1EZW5hYmxlX2d0az10cnVlLC1EZW5hYmxlX2d0az1mYWxzZSxndGsrMyBsaWJkYXp6bGUiCitQQUNLQUdFQ09ORklHW3N5c3Byb2ZkXSA9ICItRHdpdGhfc3lzcHJvZmQ9YnVuZGxlZCwtRHdpdGhfc3lzcHJvZmQ9bm9uZSxwb2xraXQiCitQQUNLQUdFQ09ORklHW2xpYnN5c3Byb2ZdID0gIi1EbGlic3lzcHJvZj10cnVlLC1EbGlic3lzcHJvZj1mYWxzZSxwb2xraXQiCisKKyMgRW5hYmxpZyB0aGlzIHJlcXVyaWVzIHllbHAKK0VYVFJBX09FTUVTT04gKz0gIi1EaGVscD1mYWxzZSAtRHN5c3RlbWR1bml0ZGlyPSR7c3lzdGVtZF91bml0ZGlyfS9zeXN0ZW0iCisKK1NPTElCUyA9ICIuc28iCitGSUxFU19TT0xJQlNERVYgPSAiIgorCitTWVNURU1EX1NFUlZJQ0VfJHtQTn0gPSAiJHtAYmIudXRpbHMuY29udGFpbnMoJ1BBQ0tBR0VDT05GSUcnLCAnc3lzcHJvZmQnLCAnc3lzcHJvZjIuc2VydmljZSBzeXNwcm9mMy5zZXJ2aWNlJywgJycsIGQpfSIKKworRklMRVNfJHtQTn0gKz0gIiBcCisgICAgICAgICAgICAgICAke2RhdGFkaXJ9L2RidXMtMS9zeXN0ZW0tc2VydmljZXMgXAorICAgICAgICAgICAgICAgJHtkYXRhZGlyfS9kYnVzLTEvc3lzdGVtLmQgXAorICAgICAgICAgICAgICAgJHtkYXRhZGlyfS9kYnVzLTEvaW50ZXJmYWNlcyBcCisgICAgICAgICAgICAgICAke2RhdGFkaXJ9L21ldGFpbmZvIFwKKyAgICAgICAgICAgICAgICIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtbmV0d29ya2luZy9yZWNpcGVzLWNvbm5lY3Rpdml0eS9jcmRhL2NyZGFfMy4xOC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtbmV0d29ya2luZy9yZWNpcGVzLWNvbm5lY3Rpdml0eS9jcmRhL2NyZGFfMy4xOC5iYgppbmRleCBjOTM5MDVlLi43YzkyNWIyIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1jb25uZWN0aXZpdHkvY3JkYS9jcmRhXzMuMTguYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtY29ubmVjdGl2aXR5L2NyZGEvY3JkYV8zLjE4LmJiCkBAIC0yMiw3ICsyMiw3IEBACiAKICMgUmVjdXJzaXZlIG1ha2UgcHJvYmxlbQogRVhUUkFfT0VNQUtFID0gIk1BS0VGTEFHUz0gREVTVERJUj0ke0R9IExJQkRJUj0ke2xpYmRpcn0vY3JkYSBMRExJQlJFRz0nLVdsLC1ycGF0aCwke2xpYmRpcn0vY3JkYSAtbHJlZycgXAotICAgICAgICAgICAgICAgIFVERVZfUlVMRV9ESVI9JHtub25hcmNoX2xpYmRpcn0vdWRldi9ydWxlcy5kLyIKKyAgICAgICAgICAgICAgICBVREVWX1JVTEVfRElSPSR7bm9uYXJjaF9iYXNlX2xpYmRpcn0vdWRldi9ydWxlcy5kLyIKIFRBUkdFVF9CSVRTID0gIiR7U0lURUlORk9fQklUU30iCiBleHBvcnQgVEFSR0VUX0JJVFMKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtY29ubmVjdGl2aXR5L2RoY3BjZC9kaGNwY2RfOC4xLjEuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1jb25uZWN0aXZpdHkvZGhjcGNkL2RoY3BjZF84LjEuNS5iYgpzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1jb25uZWN0aXZpdHkvZGhjcGNkL2RoY3BjZF84LjEuMS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtY29ubmVjdGl2aXR5L2RoY3BjZC9kaGNwY2RfOC4xLjUuYmIKaW5kZXggYTVhYTU4NC4uMzM0OWNhMSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtY29ubmVjdGl2aXR5L2RoY3BjZC9kaGNwY2RfOC4xLjEuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtY29ubmVjdGl2aXR5L2RoY3BjZC9kaGNwY2RfOC4xLjUuYmIKQEAgLTEwLDExICsxMCwxMCBAQAogVVBTVFJFQU1fQ0hFQ0tfVVJJID0gImh0dHBzOi8vcm95Lm1hcnBsZXMubmFtZS9kb3dubG9hZHMvZGhjcGNkLyIKIAogU1JDX1VSSSA9ICJodHRwOi8vcm95Lm1hcnBsZXMubmFtZS9kb3dubG9hZHMvJHtCUE59LyR7QlBOfS0ke1BWfS50YXIueHogXAotICAgICAgICAgICBmaWxlOi8vMDAwMS1yZW1vdmUtSU5DTFVERURJUi10by1wcmV2ZW50LWJ1aWxkLWlzc3Vlcy5wYXRjaCBcCi0gICAgICAgICAgIGZpbGU6Ly8wMDAxLWRoY3BjZC1GaXgtYnVpbGQtZXJyb3Itd2l0aC1tdXNsLnBhdGNoIgorICAgICAgICAgICBmaWxlOi8vMDAwMS1yZW1vdmUtSU5DTFVERURJUi10by1wcmV2ZW50LWJ1aWxkLWlzc3Vlcy5wYXRjaCIKIAotU1JDX1VSSVttZDVzdW1dID0gImRjNGYyOWE2MmFmYzUzY2RhYzMxMWU5MjVjZmQxYmM3IgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjQ4NWQzMDhmZTEwZmViZDM2YjZmOTM2ZTQyNjBlNGFiMzRhMTQ2ZTRmMDBhOWY3YTU1MDljNDM3N2FkNWVhODIiCitTUkNfVVJJW21kNXN1bV0gPSAiNTdmZDVkZDRmZjk3MjI3NzNlYzY3MjM5ZGIzNGQzYjUiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiYzVjYmUxNTA2OWNlZjM0N2U3MmQwYmY3YTE5YjAyNTU1NzFlZTBjMTg0YzY3MDU4NTlhMDk1ODhhNTBhOGViZCIKIAogaW5oZXJpdCBwa2djb25maWcgYXV0b3Rvb2xzLWJyb2tlbnNlcAogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1jb25uZWN0aXZpdHkvZGhjcGNkL2ZpbGVzLzAwMDEtZGhjcGNkLUZpeC1idWlsZC1lcnJvci13aXRoLW11c2wucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1jb25uZWN0aXZpdHkvZGhjcGNkL2ZpbGVzLzAwMDEtZGhjcGNkLUZpeC1idWlsZC1lcnJvci13aXRoLW11c2wucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGI0NjcuLjAwMDAwMDAKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtY29ubmVjdGl2aXR5L2RoY3BjZC9maWxlcy8wMDAxLWRoY3BjZC1GaXgtYnVpbGQtZXJyb3Itd2l0aC1tdXNsLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotU3ViamVjdDogW1BBVENIXSBkaGNwY2Q6IEZpeCBidWlsZCBlcnJvciB3aXRoIG11c2wuCi0KLVJlLW9yZ2FuaXplIHRoZSBoZWFkZXIgaW5jbHVkZXMgaW4gaWYtbGludXguYyB0byBmaXggZXJyb3IgYXMgZm9sbG93czoKLUluIGZpbGUgaW5jbHVkZWQgZnJvbSBpZi1saW51eC5jOjQ5OgotcGF0aC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmg6MTEyOjg6IGVycm9yOiByZWRlZmluaXRpb24gb2YgJ3N0cnVjdCBldGhoZHInCi0KLVNpZ25lZC1vZmYtYnk6IFpoZW5nIFJ1b3FpbiA8emhlbmdycS5mbnN0QGNuLmZ1aml0c3UuY29tPgotLS0tCi0gc3JjL2lmLWxpbnV4LmMgfCAyICstCi0gMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pCi0KLWRpZmYgLS1naXQgYS9zcmMvaWYtbGludXguYyBiL3NyYy9pZi1saW51eC5jCi1pbmRleCBmZDQ3Mjc4Li5iZmE4NzhiIDEwMDY0NAotLS0tIGEvc3JjL2lmLWxpbnV4LmMKLSsrKyBiL3NyYy9pZi1saW51eC5jCi1AQCAtMzcsNiArMzcsNyBAQAotICNpbmNsdWRlIDxsaW51eC9pZl9hZGRyLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2lmX2xpbmsuaD4KLSAjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+Ci0rI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KLSAjaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLSAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+Ci1AQCAtNDYsNyArNDcsNiBAQAotIAotICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSAjaW5jbHVkZSA8bmV0L2lmLmg+Ci0tI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KLSAjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgotICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0gI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotLS0gCi0yLjcuNAotCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1kZXZ0b29scy9ncnBjL2dycGNfMS4yNC4zLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtZGV2dG9vbHMvZ3JwYy9ncnBjXzEuMjQuMy5iYgppbmRleCAzY2RlNmY3Li42YWIxNWRhIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1kZXZ0b29scy9ncnBjL2dycGNfMS4yNC4zLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtbmV0d29ya2luZy9yZWNpcGVzLWRldnRvb2xzL2dycGMvZ3JwY18xLjI0LjMuYmIKQEAgLTQ0LDYgKzQ0LDEwIEBACiAgICAgc2VkIC1pIC1lICJzL3NldChfZ1JQQ19BTExUQVJHRVRTX0xJQlJBUklFUyBcJHtDTUFLRV9ETF9MSUJTfSBydCBtIHB0aHJlYWQpL3NldChfZ1JQQ19BTExUQVJHRVRTX0xJQlJBUklFUyBcJHtDTUFLRV9ETF9MSUJTfSBhdG9taWMgcnQgbSBwdGhyZWFkKS9nIiAke1N9L0NNYWtlTGlzdHMudHh0CiB9CiAKK2RvX2NvbmZpZ3VyZV9wcmVwZW5kX3Bvd2VycGMoKSB7CisgICAgc2VkIC1pIC1lICJzL3NldChfZ1JQQ19BTExUQVJHRVRTX0xJQlJBUklFUyBcJHtDTUFLRV9ETF9MSUJTfSBydCBtIHB0aHJlYWQpL3NldChfZ1JQQ19BTExUQVJHRVRTX0xJQlJBUklFUyBcJHtDTUFLRV9ETF9MSUJTfSBhdG9taWMgcnQgbSBwdGhyZWFkKS9nIiAke1N9L0NNYWtlTGlzdHMudHh0Cit9CisKIGRvX2NvbmZpZ3VyZV9wcmVwZW5kX3Rvb2xjaGFpbi1jbGFuZ194ODYoKSB7CiAgICAgc2VkIC1pIC1lICJzL3NldChfZ1JQQ19BTExUQVJHRVRTX0xJQlJBUklFUyBcJHtDTUFLRV9ETF9MSUJTfSBydCBtIHB0aHJlYWQpL3NldChfZ1JQQ19BTExUQVJHRVRTX0xJQlJBUklFUyBcJHtDTUFLRV9ETF9MSUJTfSBhdG9taWMgcnQgbSBwdGhyZWFkKS9nIiAke1N9L0NNYWtlTGlzdHMudHh0CiB9CmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW5ldHdvcmtpbmcvcmVjaXBlcy1zdXBwb3J0L3JkbWEtY29yZS9yZG1hLWNvcmUvMDAwMS1Vc2Utb3ZlcmxvYWRhYmxlLWF0dHJpYnV0ZS13aXRoLWNsYW5nLnBhdGNoIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtc3VwcG9ydC9yZG1hLWNvcmUvcmRtYS1jb3JlLzAwMDEtVXNlLW92ZXJsb2FkYWJsZS1hdHRyaWJ1dGUtd2l0aC1jbGFuZy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmE2ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtc3VwcG9ydC9yZG1hLWNvcmUvcmRtYS1jb3JlLzAwMDEtVXNlLW92ZXJsb2FkYWJsZS1hdHRyaWJ1dGUtd2l0aC1jbGFuZy5wYXRjaApAQCAtMCwwICsxLDQyIEBACitGcm9tIDQyOTc2ZWQwYTAxNjA4NjRiNDE2ODA2MDRlYTljZGIzYzE3NWNiOTQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgorRGF0ZTogV2VkLCAxNSBKYW4gMjAyMCAxNzo0ODoyOCAtMDgwMAorU3ViamVjdDogW1BBVENIXSBVc2Ugb3ZlcmxvYWRhYmxlIGF0dHJpYnV0ZSB3aXRoIGNsYW5nCisKK1RoaXMgaXMgb3ZlcnJpZGluZyB0aGUgbGliYyBpbXBsZW1lbnRhdGlvbgorCitVcHN0cmVhbS1TdGF0dXM6IFBlbmRpbmcKK1NpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CistLS0KKyBsaWJyZG1hY20vcHJlbG9hZC5jIHwgOCArKysrKysrLQorIDEgZmlsZSBjaGFuZ2VkLCA3IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKKworZGlmZiAtLWdpdCBhL2xpYnJkbWFjbS9wcmVsb2FkLmMgYi9saWJyZG1hY20vcHJlbG9hZC5jCitpbmRleCBkNDZiZWIxYi4uYjQ1MWRlNTAgMTAwNjQ0CistLS0gYS9saWJyZG1hY20vcHJlbG9hZC5jCisrKysgYi9saWJyZG1hY20vcHJlbG9hZC5jCitAQCAtNTksNiArNTksMTIgQEAKKyAjaW5jbHVkZSAiY21hLmgiCisgI2luY2x1ZGUgImluZGV4ZXIuaCIKKyAKKysjaWZkZWYgX19jbGFuZ19fCisrI2RlZmluZSBPVkVSTE9BRCAgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgCisrI2Vsc2UKKysjZGVmaW5lIE9WRVJMT0FECisrI2VuZGlmCisrCisgc3RydWN0IHNvY2tldF9jYWxscyB7CisgCWludCAoKnNvY2tldCkoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCk7CisgCWludCAoKmJpbmQpKGludCBzb2NrZXQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90IGFkZHJsZW4pOworQEAgLTc5Myw3ICs3OTksNyBAQCBzc2l6ZV90IHJlY3YoaW50IHNvY2tldCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCisgCQlycmVjdihmZCwgYnVmLCBsZW4sIGZsYWdzKSA6IHJlYWwucmVjdihmZCwgYnVmLCBsZW4sIGZsYWdzKTsKKyB9CisgCistc3NpemVfdCByZWN2ZnJvbShpbnQgc29ja2V0LCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncywKKytzc2l6ZV90IE9WRVJMT0FEIHJlY3Zmcm9tKGludCBzb2NrZXQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IGZsYWdzLAorIAkJIHN0cnVjdCBzb2NrYWRkciAqc3JjX2FkZHIsIHNvY2tsZW5fdCAqYWRkcmxlbikKKyB7CisgCWludCBmZDsKKy0tIAorMi4yNS4wCisKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtbmV0d29ya2luZy9yZWNpcGVzLXN1cHBvcnQvcmRtYS1jb3JlL3JkbWEtY29yZV8yNy4wLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtc3VwcG9ydC9yZG1hLWNvcmUvcmRtYS1jb3JlXzI3LjAuYmIKaW5kZXggMzYxZDY5Yi4uNDE3OTc5ZCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtc3VwcG9ydC9yZG1hLWNvcmUvcmRtYS1jb3JlXzI3LjAuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1uZXR3b3JraW5nL3JlY2lwZXMtc3VwcG9ydC9yZG1hLWNvcmUvcmRtYS1jb3JlXzI3LjAuYmIKQEAgLTksNiArOSw3IEBACiBTUkNfVVJJID0gImdpdDovL2dpdGh1Yi5jb20vbGludXgtcmRtYS9yZG1hLWNvcmUuZ2l0O2JyYW5jaD0ke0JSQU5DSH0gXAogICAgICAgICAgICBmaWxlOi8vMDAwMS1SZW1vdmUtbWFuLWZpbGVzLXdoaWNoLWNhbnQtYmUtYnVpbHQucGF0Y2ggXAogICAgICAgICAgICBmaWxlOi8vMDAwMS1saWJyZG1hY20tVXNlLXNjaGVkX3lpZWxkLWluc3RlYWQtb2YtcHRocmVhZF95aWVsZC5wYXRjaCBcCisgICAgICAgICAgIGZpbGU6Ly8wMDAxLVVzZS1vdmVybG9hZGFibGUtYXR0cmlidXRlLXdpdGgtY2xhbmcucGF0Y2ggXAogICAgICAgICAgICAiCiBTUkNSRVYgPSAiODRjYWYwMzVhZTYxMjNlMjI5NmI3MjAwNmNkMmNmNjk4YzY1ZWI0NiIKIFMgPSAiJHtXT1JLRElSfS9naXQiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL2NsYXNzZXMvZ2l0cGtndi5iYmNsYXNzIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9jbGFzc2VzL2dpdHBrZ3YuYmJjbGFzcwppbmRleCBhYjU5MWJkLi4xODA0MjFlIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL2NsYXNzZXMvZ2l0cGtndi5iYmNsYXNzCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvY2xhc3Nlcy9naXRwa2d2LmJiY2xhc3MKQEAgLTQwLDEwICs0MCwxNiBAQAogR0lUUEtHViA9ICIke0BnZXRfZ2l0X3BrZ3YoZCwgRmFsc2UpfSIKIEdJVFBLR1ZUQUcgPSAiJHtAZ2V0X2dpdF9wa2d2KGQsIFRydWUpfSIKIAotZGVmIGdpdHBrZ3ZfZHJvcF90YWdfcHJlZml4KHZlcnNpb24pOgorIyBUaGlzIHJlZ2V4cCBpcyB1c2VkIHRvIGRyb3AgdW53YW50ZWQgcGFydHMgb2YgdGhlIGZvdW5kIHRhZ3MuIEFueSBtYXRjaGluZworIyBncm91cHMgd2lsbCBiZSBjb25jYXRlbmF0ZWQgdG8geWllbGQgdGhlIGZpbmFsIHZlcnNpb24uCitHSVRQS0dWX1RBR19SRUdFWFAgPz89ICJ2KFxkLiopIgorCitkZWYgZ2l0cGtndl9kcm9wX3RhZ19wcmVmaXgoZCwgdmVyc2lvbik6CiAgICAgaW1wb3J0IHJlCi0gICAgaWYgcmUubWF0Y2goInZcZCIsIHZlcnNpb24pOgotICAgICAgICByZXR1cm4gdmVyc2lvblsxOl0KKworICAgIG0gPSByZS5tYXRjaChkLmdldFZhcignR0lUUEtHVl9UQUdfUkVHRVhQJyksIHZlcnNpb24pCisgICAgaWYgbToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oZ3JvdXAgZm9yIGdyb3VwIGluIG0uZ3JvdXBzKCkgaWYgZ3JvdXApCiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuIHZlcnNpb24KIApAQCAtMTA1LDcgKzExMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBiYi5mZXRjaDIucnVuZmV0Y2hjbWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdpdCAtLWdpdC1kaXI9JShyZXBvZGlyKXMgZGVzY3JpYmUgJShyZXYpcyAtLXRhZ3MgLS1leGFjdC1tYXRjaCAyPi9kZXYvbnVsbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHZhcnMsIGQsIHF1aWV0PVRydWUpLnN0cmlwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9IGdpdHBrZ3ZfZHJvcF90YWdfcHJlZml4KG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9IGdpdHBrZ3ZfZHJvcF90YWdfcHJlZml4KGQsIG91dHB1dCkKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9ICIwLjAtJXMtZyVzIiAlIChjb21taXRzLCB2YXJzWydyZXYnXVs6N10pCiAgICAgICAgICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2ZpbGVzLzAwMDEtYXJjaC1hcm0tQ29uc2lkZXItYXJtdjd2ZS1hcmNoLWFzLXdlbGwucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maWxlcy8wMDAxLWFyY2gtYXJtLUNvbnNpZGVyLWFybXY3dmUtYXJjaC1hcy13ZWxsLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODNhNzZmLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2ZpbGVzLzAwMDEtYXJjaC1hcm0tQ29uc2lkZXItYXJtdjd2ZS1hcmNoLWFzLXdlbGwucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1Gcm9tIDJhZjU4OTA5Y2Q5ZjI4NjJkMWRjMDc4MzZlMjAxMzYxYTJjZDhkNWQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCi1Gcm9tOiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgotRGF0ZTogU2F0LCA1IE9jdCAyMDE5IDA4OjUzOjIyIC0wNzAwCi1TdWJqZWN0OiBbUEFUQ0hdIGFyY2gtYXJtOiBDb25zaWRlciBhcm12N3ZlIGFyY2ggYXMgd2VsbAotCi1VcHN0cmVhbS1TdGF0dXM6IFN1Ym1pdHRlZCBbXQotCi1TaWduZWQtb2ZmLWJ5OiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgotLS0tCi0gYXJjaC9hcmNoLWFybS5oIHwgMiArLQotIDEgZmlsZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQotCi1kaWZmIC0tZ2l0IGEvYXJjaC9hcmNoLWFybS5oIGIvYXJjaC9hcmNoLWFybS5oCi1pbmRleCA3OGNiMmViZS4uNGY3MjI5NjcgMTAwNjQ0Ci0tLS0gYS9hcmNoL2FyY2gtYXJtLmgKLSsrKyBiL2FyY2gvYXJjaC1hcm0uaAotQEAgLTExLDcgKzExLDcgQEAKLSAjZGVmaW5lIG5vcCAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92XHRyMCxyMFx0QCBub3Bcblx0IikKLSAjZGVmaW5lIHJlYWRfYmFycmllcigpCV9fYXNtX18gX192b2xhdGlsZV9fICgiIiA6IDogOiAibWVtb3J5IikKLSAjZGVmaW5lIHdyaXRlX2JhcnJpZXIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgOiA6IDogIm1lbW9yeSIpCi0tI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF84QV9fKQotKyNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfOEFfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdWRV9fKQotICNkZWZpbmUJbm9wCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIpCi0gI2RlZmluZSByZWFkX2JhcnJpZXIoKQlfX3N5bmNfc3luY2hyb25pemUoKQotICNkZWZpbmUgd3JpdGVfYmFycmllcigpCV9fc3luY19zeW5jaHJvbml6ZSgpCi0tLSAKLTIuMjMuMAotCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maWxlcy8wMDAxLXVwZGF0ZS10aGUtaW50ZXJwcmV0ZXItcGF0aHMucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maWxlcy8wMDAxLXVwZGF0ZS10aGUtaW50ZXJwcmV0ZXItcGF0aHMucGF0Y2gKaW5kZXggMzI3YjlmNS4uYzljM2EwOCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9maW8vZmlsZXMvMDAwMS11cGRhdGUtdGhlLWludGVycHJldGVyLXBhdGhzLnBhdGNoCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2ZpbGVzLzAwMDEtdXBkYXRlLXRoZS1pbnRlcnByZXRlci1wYXRocy5wYXRjaApAQCAtMTYsOCArMTYsNyBAQAogIHRvb2xzL2hpc3QvZmlvbG9ncGFyc2VyX2hpc3QucHkgfCAyICstCiAgdG9vbHMvaGlzdC9oYWxmLWJpbnMucHkgICAgICAgICB8IDIgKy0KICB0b29scy9wbG90L2ZpbzJnbnVwbG90ICAgICAgICAgIHwgMiArLQotIHQvc3RlYWR5c3RhdGVfdGVzdHMucHkgfCAyICstCi0gNyBmaWxlcyBjaGFuZ2VkLCA3IGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCisgNiBmaWxlcyBjaGFuZ2VkLCA2IGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCiAKIGRpZmYgLS1naXQgYS90b29scy9maW9fanNvbnBsdXNfY2xhdDJjc3YgYi90b29scy9maW9fanNvbnBsdXNfY2xhdDJjc3YKIGluZGV4IDc4YTAwN2U1Li4wNTI0YjZlNiAxMDA3NTUKQEAgLTc5LDE2ICs3OCw2IEBACiAgIyBOb3RlOiB0aGlzIHNjcmlwdCBpcyBweXRob24yIGFuZCBweXRob24zIGNvbXBhdGlibGUuCiAgIwogICMgIENvcHlyaWdodCAoQykgMjAxMyBlTm92YW5jZSBTQVMgPGxpY2Vuc2luZ0Blbm92YW5jZS5jb20+Ci1kaWZmIC0tZ2l0IGEvdC9zdGVhZHlzdGF0ZV90ZXN0cy5weSBiL3Qvc3RlYWR5c3RhdGVfdGVzdHMucHkKLWluZGV4IDUwMjU0ZGNjLi45NWU3ZGZkZSAxMDA3NTUKLS0tLSBhL3Qvc3RlYWR5c3RhdGVfdGVzdHMucHkKLSsrKyBiL3Qvc3RlYWR5c3RhdGVfdGVzdHMucHkKLUBAIC0xLDQgKzEsNCBAQAotLSMhL3Vzci9iaW4vcHl0aG9uMi43Ci0rIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0gIyBOb3RlOiB0aGlzIHNjcmlwdCBpcyBweXRob24yIGFuZCBweXRob24gMyBjb21wYXRpYmxlLgotICMKLSAjIHN0ZWFkeXN0YXRlX3Rlc3RzLnB5CiAtLSAKIDIuMTcuMQogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maW9fMy4xNi5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2Zpb18zLjE3LmJiCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvZmlvL2Zpb18zLjE2LmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maW9fMy4xNy5iYgppbmRleCBhZGFiNjE4Li5lNDFjMjFkIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maW9fMy4xNi5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2Zpby9maW9fMy4xNy5iYgpAQCAtMjEsMTAgKzIxLDkgQEAKIFBBQ0tBR0VDT05GSUcgPz89ICIke1BBQ0tBR0VDT05GSUdfTlVNQX0iCiBQQUNLQUdFQ09ORklHW251bWFdID0gIiwtLWRpc2FibGUtbnVtYSxudW1hY3RsIgogCi1TUkNSRVYgPSAiOTJmNzU3MDhiNTMwOTg5ZmRiMTNiNTBiZTY2MDRmNDRiODBkMDM4ZCIKK1NSQ1JFViA9ICIwOGNlOWRjMjBiOGE0ZTU1ZGI3YWY2ZDg2OWRkZmE0OWI0YTAyZDAzIgogU1JDX1VSSSA9ICJnaXQ6Ly9naXQua2VybmVsLmRrL2Zpby5naXQgXAogICAgICAgICAgIGZpbGU6Ly8wMDAxLXVwZGF0ZS10aGUtaW50ZXJwcmV0ZXItcGF0aHMucGF0Y2ggXAotICAgICAgICAgIGZpbGU6Ly8wMDAxLWFyY2gtYXJtLUNvbnNpZGVyLWFybXY3dmUtYXJjaC1hcy13ZWxsLnBhdGNoIFwKICIKIAogUyA9ICIke1dPUktESVJ9L2dpdCIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvaW96b25lMy9pb3pvbmUzLzAwMDEtbGV0LXN5c3RlbS1oZWFkZXJzLXByb3ZpZGUtcHJlYWQ2NC5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvaW96b25lMy9pb3pvbmUzLzAwMDEtbGV0LXN5c3RlbS1oZWFkZXJzLXByb3ZpZGUtcHJlYWQ2NC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFhNTZhCi0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9pb3pvbmUzL2lvem9uZTMvMDAwMS1sZXQtc3lzdGVtLWhlYWRlcnMtcHJvdmlkZS1wcmVhZDY0LnBhdGNoCkBAIC0wLDAgKzEsMzQgQEAKK0Zyb20gNjQzODlhNjdiOTNhNTNiOWZiN2U5ZTIwZTkwNWE1ZWU0NjEzNjA2YiBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CitEYXRlOiBXZWQsIDE1IEphbiAyMDIwIDE3OjEwOjQyIC0wODAwCitTdWJqZWN0OiBbUEFUQ0hdIGxldCBzeXN0ZW0gaGVhZGVycyBwcm92aWRlIHByZWFkNjQoKQorCitUaGUgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHdpdGggc3lzdGVtIGhlYWRlcnMgYW55d2F5CisKK0ZpeGVzCisKK2lvem9uZS5jOjEyNzA6OTogZXJyb3I6IHJlZGVjbGFyYXRpb24gb2YgJ3ByZWFkNjQnIG11c3QgaGF2ZSB0aGUgJ292ZXJsb2FkYWJsZScgYXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IHByZWFkNjQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL21udC9iL3lvZS9idWlsZC90bXAvd29yay9jb3JlMi02NC15b2UtbGludXgvaW96b25lMy80ODgtcjAvcmVjaXBlLXN5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91bmlzdGQuaDo4MzoxOiBub3RlOiBwcmV2aW91cyBvdmVybG9hZCBvZiBmdW5jdGlvbiBpcyBoZXJlICAgICAgICAgIHByZWFkNjQgKGludCBfX2ZkLCB2b2lkICpjb25zdCBfX2NsYW5nX3Bhc3Nfb2JqZWN0X3NpemUwIF9fYnVmLCAgICAgICAgICAgICAgICAgXgorMSBlcnJvciBnZW5lcmF0ZWQuCisKK1Vwc3RyZWFtLVN0YXR1czogUGVuZGluZworCitTaWduZWQtb2ZmLWJ5OiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgorLS0tCisgaW96b25lLmMgfCAxIC0KKyAxIGZpbGUgY2hhbmdlZCwgMSBkZWxldGlvbigtKQorCitkaWZmIC0tZ2l0IGEvaW96b25lLmMgYi9pb3pvbmUuYworaW5kZXggMDkwZGQ1Zi4uZmRlYTQwMCAxMDA2NDQKKy0tLSBhL2lvem9uZS5jCisrKysgYi9pb3pvbmUuYworQEAgLTEyNjcsNyArMTI2Nyw2IEBAIGludCBwaXRfZ2V0dGltZW9mZGF5KCk7CisgI2lmZGVmIEhBVkVfQU5TSUNfQworICNpZiBkZWZpbmVkIChIQVZFX1BSRUFEKSAmJiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpCisgc3NpemVfdCBwd3JpdGU2NCgpOyAKKy1zc2l6ZV90IHByZWFkNjQoKTsgCisgI2VuZGlmCisgI2lmICFkZWZpbmVkKGxpbnV4KQorIGNoYXIgKmdldGVudigpOworLS0gCisyLjI1LjAKKwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9pb3pvbmUzL2lvem9uZTNfNDg4LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9pb3pvbmUzL2lvem9uZTNfNDg4LmJiCmluZGV4IDU4ODViMTQuLjRkOWUwNzcgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvaW96b25lMy9pb3pvbmUzXzQ4OC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2lvem9uZTMvaW96b25lM180ODguYmIKQEAgLTgsNiArOCw3IEBACiAiCiBTUkNfVVJJID0gImh0dHA6Ly93d3cuaW96b25lLm9yZy9zcmMvY3VycmVudC8ke0JQTn1fJHtQVn0udGFyIFwKICAgICBmaWxlOi8vcGFyYWxsZWxpc20ucGF0Y2ggXAorICAgIGZpbGU6Ly8wMDAxLWxldC1zeXN0ZW0taGVhZGVycy1wcm92aWRlLXByZWFkNjQucGF0Y2ggXAogICAgIGZpbGU6Ly9jb3B5cmlnaHQudHh0IFwKICIKIFNSQ19VUklbbWQ1c3VtXSA9ICJkNjBhNjllNDRjZGE4NDM2ZjRmOTRkODYwOTU4ZWZjMiIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvbGliaHVnZXRsYmZzL2ZpbGVzLzAwMDEtdGVzdHMtYWRkLWV4cGxpY2l0LXBlcm1pc3Npb25zLXRvLW9wZW4tY2FsbC5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvbGliaHVnZXRsYmZzL2ZpbGVzLzAwMDEtdGVzdHMtYWRkLWV4cGxpY2l0LXBlcm1pc3Npb25zLXRvLW9wZW4tY2FsbC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDUyYjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9saWJodWdldGxiZnMvZmlsZXMvMDAwMS10ZXN0cy1hZGQtZXhwbGljaXQtcGVybWlzc2lvbnMtdG8tb3Blbi1jYWxsLnBhdGNoCkBAIC0wLDAgKzEsNDEgQEAKK0Zyb20gZDA3ZDJmOTYwMWI0OWJiNzJjZDRiMzY4MzhmMGMyMzhiZDFiMGZjMSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CitEYXRlOiBXZWQsIDE1IEphbiAyMDIwIDE4OjQ1OjA5IC0wODAwCitTdWJqZWN0OiBbUEFUQ0hdIHRlc3RzOiBhZGQgZXhwbGljaXQgcGVybWlzc2lvbnMgdG8gb3BlbigpIGNhbGwKKworRml4ZXMKK2dldGh1Z2VwYWdlc2l6ZXMuYzoyMjc6MzU6IGVycm9yOiBvcGVuIHdpdGggT19DUkVBVCBpbiBzZWNvbmQgYXJndW1lbnQgbmVlZHMgMyBhcmd1bWVudHMKK3wgICAgICAgICBmZCA9IG9wZW4oZm5hbWUsIE9fV1JPTkxZfE9fQ1JFQVQpOworfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKworVXBzdHJlYW0tU3RhdHVzOiBTdWJtaXR0ZWQgW2h0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyF0b3BpYy9saWJodWdldGxiZnMvYW5OdERYYlFLcm9dCitTaWduZWQtb2ZmLWJ5OiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgorLS0tCisgdGVzdHMvZ2V0aHVnZXBhZ2VzaXplcy5jIHwgNCArKy0tCisgMSBmaWxlIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL3Rlc3RzL2dldGh1Z2VwYWdlc2l6ZXMuYyBiL3Rlc3RzL2dldGh1Z2VwYWdlc2l6ZXMuYworaW5kZXggOTU1MWIzOC4uNTc3NzI2NSAxMDA2NDQKKy0tLSBhL3Rlc3RzL2dldGh1Z2VwYWdlc2l6ZXMuYworKysrIGIvdGVzdHMvZ2V0aHVnZXBhZ2VzaXplcy5jCitAQCAtMjIzLDcgKzIyMyw3IEBAIHZvaWQgc2V0dXBfZmFrZV9kYXRhKGxvbmcgc2l6ZXNbXSwgaW50IG5fZWxlbSkKKyAJCUZBSUwoIm1rZHRlbXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAKKyAJc3ByaW50ZihmbmFtZSwgIiVzL21lbWluZm8tbm9uZSIsIGZha2VfbWVtaW5mbyk7CistCWZkID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVCk7CisrCWZkID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVCwgMDYwMCk7CisgCWlmIChmZCA8IDApCisgCQlGQUlMKCJvcGVuOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgCWlmICh3cml0ZShmZCwgbWVtaW5mb19iYXNlLAorQEAgLTIzMyw3ICsyMzMsNyBAQCB2b2lkIHNldHVwX2Zha2VfZGF0YShsb25nIHNpemVzW10sIGludCBuX2VsZW0pCisgCQlGQUlMKCJjbG9zZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworIAorIAlzcHJpbnRmKGZuYW1lLCAiJXMvbWVtaW5mby1odWdlcGFnZXMiLCBmYWtlX21lbWluZm8pOworLQlmZCA9IG9wZW4oZm5hbWUsIE9fV1JPTkxZfE9fQ1JFQVQpOworKwlmZCA9IG9wZW4oZm5hbWUsIE9fV1JPTkxZfE9fQ1JFQVQsIDA2MDApOworIAlpZiAoZmQgPCAwKQorIAkJRkFJTCgib3BlbjogJXMiLCBzdHJlcnJvcihlcnJubykpOworIAlpZiAod3JpdGUoZmQsIG1lbWluZm9fYmFzZSwKKy0tIAorMi4yNS4wCisKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvbGliaHVnZXRsYmZzL2xpYmh1Z2V0bGJmc19naXQuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtYmVuY2htYXJrL2xpYmh1Z2V0bGJmcy9saWJodWdldGxiZnNfZ2l0LmJiCmluZGV4IGYyNTgxMjIuLmU2NmRiMWEgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1iZW5jaG1hcmsvbGliaHVnZXRsYmZzL2xpYmh1Z2V0bGJmc19naXQuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWJlbmNobWFyay9saWJodWdldGxiZnMvbGliaHVnZXRsYmZzX2dpdC5iYgpAQCAtMjQsNiArMjQsNyBAQAogICAgIGZpbGU6Ly8wMDA0LXNobS5jLU1hcmstZ2xpYmMtc3BlY2lmaWMtY2hhbmdlcy1zby5wYXRjaCBcCiAgICAgZmlsZTovLzAwMDUtSW5jbHVkZS1kaXJlbnQuaC1mb3ItaW5vX3QucGF0Y2ggXAogICAgIGZpbGU6Ly8wMDA2LWluY2x1ZGUtbGltaXRzLmgtZm9yLVBBVEhfTUFYLnBhdGNoIFwKKyAgICBmaWxlOi8vMDAwMS10ZXN0cy1hZGQtZXhwbGljaXQtcGVybWlzc2lvbnMtdG8tb3Blbi1jYWxsLnBhdGNoIFwKICIKIAogVVBTVFJFQU1fQ0hFQ0tfR0lUVEFHUkVHRVggPSAiKD9QPHB2ZXI+XGQrKFwuXGQrKSspIgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvbm5lY3Rpdml0eS96YWJiaXgvemFiYml4L3phYmJpeC1hZ2VudC5zZXJ2aWNlIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvbm5lY3Rpdml0eS96YWJiaXgvemFiYml4L3phYmJpeC1hZ2VudC5zZXJ2aWNlCmluZGV4IGIxOGE5NmYuLjU2ZTUwNjQgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1jb25uZWN0aXZpdHkvemFiYml4L3phYmJpeC96YWJiaXgtYWdlbnQuc2VydmljZQorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29ubmVjdGl2aXR5L3phYmJpeC96YWJiaXgvemFiYml4LWFnZW50LnNlcnZpY2UKQEAgLTMsOSArMyw4IEBACiBBZnRlcj1zeXNsb2cudGFyZ2V0IG5ldHdvcmsudGFyZ2V0CiAKIFtTZXJ2aWNlXQotVHlwZT1vbmVzaG90Ci1FeGVjU3RhcnQ9QFNCSU5ESVJAL3phYmJpeF9hZ2VudGQKLVJlbWFpbkFmdGVyRXhpdD15ZXMKK1R5cGU9c2ltcGxlCitFeGVjU3RhcnQ9QFNCSU5ESVJAL3phYmJpeF9hZ2VudGQgLWYKIFVzZXI9emFiYml4CiAKIFtJbnN0YWxsXQpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvbm5lY3Rpdml0eS96ZXJvbXEvY3Bwem1xX2dpdC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1jb25uZWN0aXZpdHkvemVyb21xL2NwcHptcV9naXQuYmIKaW5kZXggMzY5NzEyOS4uMGI2Njk3MCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvbm5lY3Rpdml0eS96ZXJvbXEvY3Bwem1xX2dpdC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29ubmVjdGl2aXR5L3plcm9tcS9jcHB6bXFfZ2l0LmJiCkBAIC00LDggKzQsOCBAQAogTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vTElDRU5TRTttZDU9ZGIxNzRlYWY3YjU1YTM0YTdjODk1NTExOTdmNjZlOTQiCiBERVBFTkRTID0gInplcm9tcSIKIAotU1JDUkVWID0gImU2N2ZhMGUxNmQ3OTY0ODc2MjI4OTUyZjYwNjkzZjVjMDNlYTBjYzEiCi1QViA9ICI0LjUuMCIKK1NSQ1JFViA9ICI4ZDVjOWE4ODk4OGRjYmViYjcyOTM5Y2EwOTM5ZDQzMjIzMGZmZGUxIgorUFYgPSAiNC42LjAiCiAKIFNSQ19VUkkgPSAiZ2l0Oi8vZ2l0aHViLmNvbS96ZXJvbXEvY3Bwem1xLmdpdCIKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvcmUvcGFja2FnZWdyb3Vwcy9wYWNrYWdlZ3JvdXAtbWV0YS1vZS5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1jb3JlL3BhY2thZ2Vncm91cHMvcGFja2FnZWdyb3VwLW1ldGEtb2UuYmIKaW5kZXggMzFjM2Y0ZS4uNTlmMTcwMyAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWNvcmUvcGFja2FnZWdyb3Vwcy9wYWNrYWdlZ3JvdXAtbWV0YS1vZS5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtY29yZS9wYWNrYWdlZ3JvdXBzL3BhY2thZ2Vncm91cC1tZXRhLW9lLmJiCkBAIC05NCw2ICs5NCw3IEBACiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1ic3BfcmVtb3ZlX21pcHNhcmNoID0gImVmaXZhciBlZmlib290bWdyIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtYnNwX3JlbW92ZV9wb3dlcnBjID0gImVmaXZhciBlZmlib290bWdyIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtYnNwX3JlbW92ZV9wb3dlcnBjNjQgPSAiZWZpdmFyIGVmaWJvb3RtZ3IiCitSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1ic3BfcmVtb3ZlX3Bvd2VycGM2NGxlID0gImVmaXZhciBlZmlib290bWdyIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtYnNwX3JlbW92ZV9yaXNjdjY0ID0gImVmaXZhciBlZmlib290bWdyIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtYnNwX3JlbW92ZV9yaXNjdjMyID0gImVmaXZhciBlZmlib290bWdyIgogCkBAIC0xMjUsNiArMTI2LDcgQEAKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWRldnRvb2xzX3JlbW92ZV9taXBzNjRlbCA9ICJub2RlanMiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1kZXZ0b29sc19yZW1vdmVfcG93ZXJwYyA9ICJhbmRyb2lkLXRvb2xzIGJyZWFrcGFkIHVmdHJhY2UgbHNodyIKIFJERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLWRldnRvb2xzX3JlbW92ZV9wb3dlcnBjNjQgPSAiYW5kcm9pZC10b29scyB1ZnRyYWNlIGxzaHciCitSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1kZXZ0b29sc19yZW1vdmVfcG93ZXJwYzY0bGUgPSAiYW5kcm9pZC10b29scyB1ZnRyYWNlIGxzaHciCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1kZXZ0b29sc19yZW1vdmVfcmlzY3Y2NCA9ICJub2RlanMgdWZ0cmFjZSBsc2h3IgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZGV2dG9vbHNfcmVtb3ZlX3Jpc2N2MzIgPSAibm9kZWpzIHVmdHJhY2UgbHNodyIKIApAQCAtMTU2LDYgKzE1OCw3IEBACiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1leHRlbmRlZF9yZW1vdmVfbWlwc2FyY2ggPSAidXBtIG1yYWEgdGlwdG9wIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZXh0ZW5kZWRfcmVtb3ZlX3Bvd2VycGMgPSAidXBtIG1yYWEiCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1leHRlbmRlZF9yZW1vdmVfcG93ZXJwYzY0ID0gInVwbSBtcmFhIgorUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZXh0ZW5kZWRfcmVtb3ZlX3Bvd2VycGM2NGxlID0gInVwbSBtcmFhIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZXh0ZW5kZWRfcmVtb3ZlX3Jpc2N2NjQgPSAidXBtIG1yYWEgdGlwdG9wIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZXh0ZW5kZWRfcmVtb3ZlX3Jpc2N2MzIgPSAidXBtIG1yYWEgdGlwdG9wIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2UtZXh0ZW5kZWRfcmVtb3ZlX2xpYmMtbXVzbCA9ICJsY2Rwcm9jIgpAQCAtMjM2LDcgKzIzOSw3IEBACiAgICAgbGliaW5paCBpbm90aWZ5LXRvb2xzIGpvZSBsY21zIGxjb3YgbGliYXRhc21hcnQgbGliYnl0ZXNpemUgXAogICAgIGxpYmNlcmVhbCBsaWJjeXVzYnNlcmlhbCBsaWJlZSBsaWJlaWdlbiBsaWJlc3RyIGxpYmZ0ZGkgbGliZ2l0MiBcCiAgICAgbGliZ3Bpb2QgbGliaWlvIGxpYmpzLWpxdWVyeSBsaWJqcy1zaXp6bGUgbGlibGluZWJyZWFrIGxpYm1pY3JvaHR0cGQgXAotICAgIGxpYm14bWwgbGlibmloIGxpYm9hdXRoIGxpYm9sIGxpYm9vcCBsaWJwMTEgbGlicmF3MTM5NCBsaWJzbWkgbGlic29jIGxpYnNzaDIgXAorICAgIGxpYm14bWwgbGlib2F1dGggbGlib2wgbGlib29wIGxpYnAxMSBsaWJyYXcxMzk0IGxpYnNtaSBsaWJzb2MgbGlic3NoMiBcCiAgICAgbGlic3NoIGxpYnRhciBsaWJ0ZWFtIGxpYnRpbnl4bWwyIGxpYnRpbnl4bWwgbGlidXNiZyBsaWJ1c2ItY29tcGF0IGxpYnV0ZW1wdGVyIFwKICAgICBsaW5rcyBsaW8tdXRpbHMgbG9ja2RldiBsb2c0YyBsb2c0Y3BwIGxvZ3dhcm4gbGliZGV2bWFwcGVyIGx2bTIgXAogICAgIG1haWxjYXAgbWJ1ZmZlciBtZyBtaW5pbmkgXApAQCAtMjYzLDYgKzI2Niw3IEBACiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1zdXBwb3J0X3JlbW92ZV9taXBzYXJjaCA9ICJncGVyZnRvb2xzIgogUkRFUEVORFNfcGFja2FnZWdyb3VwLW1ldGEtb2Utc3VwcG9ydF9yZW1vdmVfcmlzY3Y2NCA9ICJ1aW0iCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1zdXBwb3J0X3JlbW92ZV9yaXNjdjMyID0gInVpbSIKK1JERVBFTkRTX3BhY2thZ2Vncm91cC1tZXRhLW9lLXN1cHBvcnRfcmVtb3ZlX3Bvd2VycGMgPSAic3NpYXBpIgogCiBSREVQRU5EU19wYWNrYWdlZ3JvdXAtbWV0YS1vZS1zdXBwb3J0LWVnbCA9IlwKICAgICBmcmVlcmRwIGxpYm5pY2Ugb3BlbmN2IFwKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9ieWFjYy9ieWFjY18yMDE5MTEwMy5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9ieWFjYy9ieWFjY18yMDE5MTEyNS5iYgpzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvYnlhY2MvYnlhY2NfMjAxOTExMDMuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9ieWFjYy9ieWFjY18yMDE5MTEyNS5iYgppbmRleCBlYWU0NjE4Li5hNGU1N2Y1IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvYnlhY2MvYnlhY2NfMjAxOTExMDMuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2J5YWNjL2J5YWNjXzIwMTkxMTI1LmJiCkBAIC03LDYgKzcsNSBAQAogTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vcGFja2FnZS9kZWJpYW4vY29weXJpZ2h0O21kNT0zZWI3YzYzNTQzNGZhZmUyM2VmMzBmYzI2M2U2M2IyZiIKIHJlcXVpcmUgYnlhY2MuaW5jCiAKLVNSQ19VUklbbWQ1c3VtXSA9ICI4NGZmZTU5MTY2ZjY3YmJlMTQ3YTZmNTAyYzdhZjMwOSIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICJkMjkxZmIzNDgxNmY0NTA3OTA2NzM2NmI3ZjczMDBmZmJmOWY3ZTNmMWFhZjZkNTA5Yjg0NDQyZDA2NWQxMWI5IgotCitTUkNfVVJJW21kNXN1bV0gPSAiNjc0NWE0ZmJmMDcyM2M0YzkyODBmYzNlNTY4YjNkMWIiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiMDcxYzJlYmUzNmFmYWE4NDQ4YjgwZTg5MzQ3M2E2ODFlNjNhM2I4YTRlZDYzNmMwZDY3NTc4MGEwMjQxMWNkZSIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9mbHVlbnRiaXQvZmx1ZW50Yml0LzAwMDEtcHBjLUZpeC1zaWduYXR1cmUtZm9yLWNvX2NyZWF0ZS1BUEkucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvZmx1ZW50Yml0L2ZsdWVudGJpdC8wMDAxLXBwYy1GaXgtc2lnbmF0dXJlLWZvci1jb19jcmVhdGUtQVBJLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvZmx1ZW50Yml0L2ZsdWVudGJpdC8wMDAxLXBwYy1GaXgtc2lnbmF0dXJlLWZvci1jb19jcmVhdGUtQVBJLnBhdGNoCkBAIC0wLDAgKzEsMzggQEAKK0Zyb20gYmU0MDMyMDc5YzkzMTcwNGY1MmUyOWY1ZGE1YzAxY2RlMjRhYzg0MiBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CitEYXRlOiBUaHUsIDE2IEphbiAyMDIwIDEwOjQ0OjU4IC0wODAwCitTdWJqZWN0OiBbUEFUQ0hdIHBwYzogRml4IHNpZ25hdHVyZSBmb3IgY29fY3JlYXRlIEFQSQorCitVcHN0cmVhbS1TdGF0dXM6IFN1Ym1pdHRlZCBbaHR0cHM6Ly9naXRodWIuY29tL2ZsdWVudC9mbHVlbnQtYml0L3B1bGwvMTg4Nl0KK1NpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CistLS0KKyBsaWIvZmxiX2xpYmNvL3BwYy5jIHwgNiArKysrLS0KKyAxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvbGliL2ZsYl9saWJjby9wcGMuYyBiL2xpYi9mbGJfbGliY28vcHBjLmMKK2luZGV4IGU2NTM2ZDU2Li41MzMyNTZiMyAxMDA2NDQKKy0tLSBhL2xpYi9mbGJfbGliY28vcHBjLmMKKysrKyBiL2xpYi9mbGJfbGliY28vcHBjLmMKK0BAIC0yNzksNyArMjc5LDkgQEAgc3RhdGljIHVpbnQzMl90KiBjb19jcmVhdGVfKHVuc2lnbmVkIHNpemUsIHVpbnRwdHJfdCBlbnRyeSkgeworICAgcmV0dXJuIHQ7CisgfQorIAorLWNvdGhyZWFkX3QgY29fY3JlYXRlKHVuc2lnbmVkIGludCBzaXplLCB2b2lkICgqZW50cnlfKSh2b2lkKSkgeworK2NvdGhyZWFkX3QgY29fY3JlYXRlKHVuc2lnbmVkIGludCBzaXplLCB2b2lkICgqZW50cnlfKSh2b2lkKSwKKysgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9zaXplKSB7CisrCisgICB1aW50cHRyX3QgZW50cnkgPSAodWludHB0cl90KWVudHJ5XzsKKyAgIHVpbnQzMl90KiB0ID0gMDsKKyAKK0BAIC0zMjUsNyArMzI3LDcgQEAgY290aHJlYWRfdCBjb19jcmVhdGUodW5zaWduZWQgaW50IHNpemUsIHZvaWQgKCplbnRyeV8pKHZvaWQpKSB7CisgICAgIHRbMTBdID0gKHVpbnQzMl90KShzcCA+PiBzaGlmdCA+PiBzaGlmdCk7CisgICAgIHRbMTFdID0gKHVpbnQzMl90KXNwOworICAgfQorLQorKyAgKm91dF9zaXplID0gc2l6ZTsKKyAgIHJldHVybiB0OworIH0KKyAKKy0tIAorMi4yNS4wCisKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9mbHVlbnRiaXQvZmx1ZW50Yml0XzEuMy41LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2ZsdWVudGJpdC9mbHVlbnRiaXRfMS4zLjUuYmIKaW5kZXggYWFkMTQ5OS4uZDhjYjhiNSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2ZsdWVudGJpdC9mbHVlbnRiaXRfMS4zLjUuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL2ZsdWVudGJpdC9mbHVlbnRiaXRfMS4zLjUuYmIKQEAgLTE1LDYgKzE1LDcgQEAKICAgICAgICAgICAgZmlsZTovL2plbWFsbG9jLnBhdGNoIFwKICAgICAgICAgICAgZmlsZTovL2Nyb3NzLWJ1aWxkLWluaXQtc3lzdGVtLWRldGVjdGlvbi5wYXRjaCBcCiAgICAgICAgICAgIGZpbGU6Ly9idWlsdGluLW5hbi5wYXRjaCBcCisgICAgICAgICAgIGZpbGU6Ly8wMDAxLXBwYy1GaXgtc2lnbmF0dXJlLWZvci1jb19jcmVhdGUtQVBJLnBhdGNoIFwKICAgICAgICAgICAiCiBTUkNfVVJJW21kNXN1bV0gPSAiNmVhZTZkZmQwYTg3NGU1ZGQyNzBjMzZlOWM2OGY3NDciCiBTUkNfVVJJW3NoYTI1NnN1bV0gPSAiZTAzN2M3NmM4OTI2OWM4ZGM0MDI3YTA4ZTQ0MmZlZmQyNzUxYjBmMWUwZjljMzhmOWE0YjEyZDc4MWE5Yzc4OSIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9tb3pqcy9tb3pqc182MC41LjIuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZXh0ZW5kZWQvbW96anMvbW96anNfNjAuNS4yLmJiCmluZGV4IGY1MmJjY2EuLjM4OWJjYWMgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1leHRlbmRlZC9tb3pqcy9tb3pqc182MC41LjIuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLWV4dGVuZGVkL21vempzL21vempzXzYwLjUuMi5iYgpAQCAtNTcsNiArNTcsNyBAQAogCiAjIFdpdGhvdXQgdGhpcywgSlNfSW5pdCgpIHdpbGwgZmFpbCBmb3IgbWlwczY0LgogRVhUUkFfT0VDT05GX2FwcGVuZF9taXBzYXJjaCA9ICIgLS13aXRoLWludGwtYXBpPWJ1aWxkIgorRVhUUkFfT0VDT05GX2FwcGVuZF9wb3dlcnBjID0gIiAtLXdpdGgtaW50bC1hcGk9YnVpbGQiCiAKIEVYVFJBX09FQ09ORl9hcHBlbmRfbWlwc2FyY2ggPSAiIC0tZGlzYWJsZS1pb24iCiBFWFRSQV9PRUNPTkZfYXBwZW5kX3Jpc2N2NjQgPSAiIC0tZGlzYWJsZS1pb24iCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtZ3JhcGhpY3MvZm9udGZvcmdlL2ZvbnRmb3JnZV8yMDE5MDgwMS5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1ncmFwaGljcy9mb250Zm9yZ2UvZm9udGZvcmdlXzIwMTkwODAxLmJiCmluZGV4IDk5YzEwOGQuLmI4NDgwNmYgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1ncmFwaGljcy9mb250Zm9yZ2UvZm9udGZvcmdlXzIwMTkwODAxLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1ncmFwaGljcy9mb250Zm9yZ2UvZm9udGZvcmdlXzIwMTkwODAxLmJiCkBAIC02LDEwICs2LDEwIEBACiAgICAgZmlsZTovL0xJQ0VOU0U7bWQ1PWQwNDJmM2QyYThmZDcyMDhiNzA0YTQ5OTE2OGUzYzg5IFwKICIKIAotREVQRU5EUyA9ICJnbGliLTIuMCBwYW5nbyBnaWZsaWIgdGlmZiBsaWJ4bWwyIGpwZWcgcHl0aG9uIGxpYnRvb2wgdXRoYXNoIGdldHRleHQtbmF0aXZlIgorREVQRU5EUyA9ICJnbGliLTIuMCBwYW5nbyBnaWZsaWIgdGlmZiBsaWJ4bWwyIGpwZWcgbGlidG9vbCB1dGhhc2ggZ2V0dGV4dC1uYXRpdmUiCiBERVBFTkRTX2FwcGVuZF9jbGFzcy10YXJnZXQgPSAiIGxpYnhpIgogCi1pbmhlcml0IGF1dG90b29scyBwa2djb25maWcgcHl0aG9ubmF0aXZlIGZlYXR1cmVzX2NoZWNrIGdldHRleHQgZ3RrLWljb24tY2FjaGUgbWltZQoraW5oZXJpdCBhdXRvdG9vbHMgcGtnY29uZmlnIHB5dGhvbjNuYXRpdmUgZmVhdHVyZXNfY2hlY2sgZ2V0dGV4dCBndGstaWNvbi1jYWNoZSBtaW1lCiAKIFJFUVVJUkVEX0RJU1RST19GRUFUVVJFU19hcHBlbmRfY2xhc3MtdGFyZ2V0ID0gIiB4MTEiCiAKQEAgLTMxLDggKzMxLDYgQEAKIAogUEFDS0FHRVMgPSsgIiR7UE59LXB5dGhvbiIKIAotUlBST1ZJREVTXyR7UE59LWRiZyArPSAiJHtQTn0tcHl0aG9uLWRiZyIKLQogRklMRVNfJHtQTn0gKz0gIiBcCiAgICAgJHtkYXRhZGlyfS9hcHBkYXRhIFwKICAgICAke2RhdGFkaXJ9L21ldGFpbmZvIFwKQEAgLTQwLDcgKzM4LDcgQEAKICIKIAogRklMRVNfJHtQTn0tcHl0aG9uID0gIiR7UFlUSE9OX1NJVEVQQUNLQUdFU19ESVJ9ICR7ZGF0YWRpcn0vJHtCUE59L3B5dGhvbiIKLVJERVBFTkRTXyR7UE59LXB5dGhvbiA9ICJweXRob24iCitSREVQRU5EU18ke1BOfS1weXRob24gPSAicHl0aG9uMyIKIAogIyBmb3IgZS5nIGtkZSdzIG94eWdlbi1mb250cwogQkJDTEFTU0VYVEVORCA9ICJuYXRpdmUiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9qYWNrL2phY2svMDAwMS1leGFtcGxlLWNsaWVudHMtVXNlLWMtY29tcGlsZXItZm9yLWphY2tfc2ltZHRlc3RzLnBhdGNoIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvamFjay9qYWNrLzAwMDEtZXhhbXBsZS1jbGllbnRzLVVzZS1jLWNvbXBpbGVyLWZvci1qYWNrX3NpbWR0ZXN0cy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGEyMWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvamFjay9qYWNrLzAwMDEtZXhhbXBsZS1jbGllbnRzLVVzZS1jLWNvbXBpbGVyLWZvci1qYWNrX3NpbWR0ZXN0cy5wYXRjaApAQCAtMCwwICsxLDMzIEBACitGcm9tIDc2YjhhMzg5MjY4Mjc1Y2MxM2YzYjRlNjEzOTRkNDBiMjRlYzU2ZjEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgorRGF0ZTogV2VkLCAxNSBKYW4gMjAyMCAyMDoyMTo1OCAtMDgwMAorU3ViamVjdDogW1BBVENIXSBleGFtcGxlLWNsaWVudHM6IFVzZSBjKysgY29tcGlsZXIgZm9yIGphY2tfc2ltZHRlc3RzCisKK0l0IHVzZXMgYysrIHNvdXJjZXMgYW5kIHJ1bnRpbWUgdGhlcmVmb3JlIGl0cyBiZXN0IHRvIHVzZSBjKysgY29tcGlsZXIKK3RvIGJ1aWxkIGl0IHNvIGl0IGNhbiBmaW5kIHRoZSBjb3JyZWN0IHJ1bnRpbWUsIGNyb3NzIGNvbXBpbGluZyB3aXRoCitjbGFuZyBmYWlscworCit4ODZfNjQteW9lLWxpbnV4LWxkOiBleGFtcGxlLWNsaWVudHMvc2ltZHRlc3RzLmNwcC4yOC5vOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIHN5bWJvbCAnX19jeGFfY2FsbF91bmV4cGVjdGVkQEBDWFhBQklfMS4zJworCitVcHN0cmVhbS1TdGF0dXM6IFN1Ym1pdHRlZCBbaHR0cHM6Ly9naXRodWIuY29tL2phY2thdWRpby9qYWNrMi9wdWxsLzUzNl0KK1NpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+CistLS0KKyBleGFtcGxlLWNsaWVudHMvd3NjcmlwdCB8IDIgKysKKyAxIGZpbGUgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspCisKK2RpZmYgLS1naXQgYS9leGFtcGxlLWNsaWVudHMvd3NjcmlwdCBiL2V4YW1wbGUtY2xpZW50cy93c2NyaXB0CitpbmRleCBhODg1N2FhNy4uZGY5NDM1YWEgMTAwNjQ0CistLS0gYS9leGFtcGxlLWNsaWVudHMvd3NjcmlwdAorKysrIGIvZXhhbXBsZS1jbGllbnRzL3dzY3JpcHQKK0BAIC02OSw2ICs2OSw4IEBAIGRlZiBidWlsZChibGQpOgorIAorICAgICAgICAgaWYgYmxkLmVudlsnSVNfTUFDT1NYJ106CisgICAgICAgICAgICAgcHJvZyA9IGJsZChmZWF0dXJlcz0nYyBjcHJvZ3JhbScsIGZyYW1ld29yayA9IFsnRm91bmRhdGlvbiddKQorKyAgICAgICAgZWxpZiBleGFtcGxlX3Byb2dyYW0gPT0gJ2phY2tfc2ltZHRlc3RzJzoKKysgICAgICAgICAgICBwcm9nID0gYmxkKGZlYXR1cmVzPSdjeHggY3h4cHJvZ3JhbScpCisgICAgICAgICBlbHNlOgorICAgICAgICAgICAgIHByb2cgPSBibGQoZmVhdHVyZXM9J2MgY3Byb2dyYW0nKQorICAgICAgICAgcHJvZy5pbmNsdWRlcyA9IG9zX2luY2RpciArIFsnLi4vY29tbW9uL2phY2snLCAnLi4vY29tbW9uJ10KKy0tIAorMi4yNS4wCisKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1tdWx0aW1lZGlhL2phY2svamFja18xLjE5LjE0LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvamFjay9qYWNrXzEuMTkuMTQuYmIKaW5kZXggY2ViYzk1Mi4uZTk1NDM0MSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvamFjay9qYWNrXzEuMTkuMTQuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvamFjay9qYWNrXzEuMTkuMTQuYmIKQEAgLTE0LDcgKzE0LDkgQEAKIAogREVQRU5EUyA9ICJsaWJzYW1wbGVyYXRlMCBsaWJzbmRmaWxlMSByZWFkbGluZSIKIAotU1JDX1VSSSA9ICJnaXQ6Ly9naXRodWIuY29tL2phY2thdWRpby9qYWNrMi5naXQiCitTUkNfVVJJID0gImdpdDovL2dpdGh1Yi5jb20vamFja2F1ZGlvL2phY2syLmdpdCBcCisgICAgICAgICAgIGZpbGU6Ly8wMDAxLWV4YW1wbGUtY2xpZW50cy1Vc2UtYy1jb21waWxlci1mb3ItamFja19zaW1kdGVzdHMucGF0Y2ggXAorICAgICAgICAgICIKIFNSQ1JFViA9ICJiNTRhMDliZjdlZjc2MGQ4MWZkYjg1NDRhZDEwZTQ1NTc1Mzk0NjI0IgogCiBTID0gIiR7V09SS0RJUn0vZ2l0IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvbXBsYXllci9tcHZfMC4yNi4wLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLW11bHRpbWVkaWEvbXBsYXllci9tcHZfMC4yNi4wLmJiCmluZGV4IDI5YmNmZTQuLmMzMjdjNDUgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1tdWx0aW1lZGlhL21wbGF5ZXIvbXB2XzAuMjYuMC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtbXVsdGltZWRpYS9tcGxheWVyL21wdl8wLjI2LjAuYmIKQEAgLTMwLDYgKzMwLDcgQEAKIExVQV9taXBzNjQgID0gIiIKIExVQV9hYXJjaDY0ICA9ICIiCiBMVUFfcG93ZXJwYzY0ICA9ICIiCitMVUFfcG93ZXJwYyAgPSAiIgogCiAjIE5vdGU6IGJvdGggbHVhIGFuZCBsaWJhc3MgYXJlIHJlcXVpcmVkIHRvIGdldCBvbi1zY3JlZW4tZGlzcGxheSAoY29udHJvbHMpCiBQQUNLQUdFQ09ORklHID8/PSAiIFwKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1wcmludGluZy9jdXBzL2N1cHMtZmlsdGVycy5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnMuaW5jCmluZGV4IDQ1YmRhYjMuLjU4OWJiOTAgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1wcmludGluZy9jdXBzL2N1cHMtZmlsdGVycy5pbmMKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXByaW50aW5nL2N1cHMvY3Vwcy1maWx0ZXJzLmluYwpAQCAtNDcsOCArNDcsNyBAQAogICAgICAgICAiCiAKIEZJTEVTXyR7UE59LWdzdCA9ICJcCi0JJHtsaWJkaXJ9L2N1cHMvZmlsdGVyL2dzdG9weGwgXAotCSR7bGliZGlyfS9jdXBzL2ZpbHRlci9nc3RvcmFzdGVyIFwKKwkke2xpYmV4ZWNkaXJ9L2N1cHMvZmlsdGVyL2dzdG8qIFwKIAkiCiAKIEZJTEVTXyR7UE59LWRhdGEgPSAiXApAQCAtNTYsMzcgKzU1LDI0IEBACiAJIgogCiBGSUxFU18ke1BOfS1kYmcgKz0gIlwKLQkke2xpYmRpcn0vY3Vwcy9maWx0ZXIvLmRlYnVnIFwKLQkke2xpYmRpcn0vY3Vwcy9iYWNrZW5kLy5kZWJ1ZyBcCisJJHtsaWJleGVjZGlyfS9jdXBzL2JhY2tlbmQvLmRlYnVnIFwKKwkke2xpYmV4ZWNkaXJ9L2N1cHMvZHJpdmVyLy5kZWJ1ZyBcCisJJHtsaWJleGVjZGlyfS9jdXBzL2ZpbHRlci8uZGVidWcgXAogCSIKIAogRklMRVNfJHtQTn0gKz0gIlwKLSAgICAgICAgJHtsaWJkaXJ9L2N1cHMvZmlsdGVyIFwKLSAgICAgICAgJHtsaWJkaXJ9L2N1cHMvYmFja2VuZCBcCi0gICAgICAgICR7bGliZGlyfS9jdXBzL2RyaXZlciBcCisgICAgICAgICR7bGliZXhlY2Rpcn0vY3VwcyBcCisgICAgICAgICR7ZGF0YWRpcn0vcHBkLyBcCiAgICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9jaGFyc2V0cyBcCiAgICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9kcnYgXAogICAgICAgICAke2RhdGFkaXJ9L2N1cHMvbWltZSBcCiAgICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9wcGRjIFwKLSAgICAgICAgJHtkYXRhZGlyfS9wcGQvY3Vwc2ZpbHRlcnMgXAotICAgICAgICAke2RhdGFkaXJ9L2N1cHMvYnJhaWxsZSBcCiAgICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9iYW5uZXJzIFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2JyYWlsbGUvaW5kZXguc2ggXAotICAgICAgICAke2RhdGFkaXJ9L2N1cHMvYnJhaWxsZS9jdXBzLWJyYWlsbGUuc2ggXAotICAgICAgICAke2RhdGFkaXJ9L2N1cHMvYnJhaWxsZS9pbmRleHYzLnNoIFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2JyYWlsbGUvaW5kZXh2NC5zaCBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9iYW5uZXJzL3RvcHNlY3JldCBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9iYW5uZXJzL3NlY3JldCBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9iYW5uZXJzL2NvbmZpZGVudGlhbCBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9iYW5uZXJzL3VuY2xhc3NpZmllZCBcCi0gICAgICAgICR7ZGF0YWRpcn0vY3Vwcy9iYW5uZXJzL2Zvcm0gXAotICAgICAgICAke2RhdGFkaXJ9L2N1cHMvYmFubmVycy9jbGFzc2lmaWVkIFwKLSAgICAgICAgJHtkYXRhZGlyfS9jdXBzL2Jhbm5lcnMvc3RhbmRhcmQgXAogIgogCiBkb19pbnN0YWxsX2FwcGVuZCgpIHsKLQkjIHJlbW92ZSBiYW5uZXJzLCBicmFpbGxlIGRpcnMKLQlybSAtcmYgJHtEfSR7ZGF0YWRpcn0vY3Vwcy97YmFubmVycyxicmFpbGxlfQorCSMgcmVtb3ZlIGJyYWlsbGUgZGlyCisJcm0gLXJmICR7RH0ke2RhdGFkaXJ9L2N1cHMvYnJhaWxsZQogCiAJIyByZW1vdmUgc3lzcm9vdCBwYXRoIGNvbnRhbWluYXRpb24gZnJvbSBwa2djb25maWcgZmlsZQogCXNlZCAtaSAtZSAnczoke1NUQUdJTkdfRElSX1RBUkdFVH06OicgJHtEfS8ke2xpYmRpcn0vcGtnY29uZmlnL2xpYmN1cHNmaWx0ZXJzLnBjCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnNfMS4yNi4wLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXByaW50aW5nL2N1cHMvY3Vwcy1maWx0ZXJzXzEuMjYuMC5iYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5NjAyYS4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnNfMS4yNi4wLmJiCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1pbmNsdWRlIGN1cHMtZmlsdGVycy5pbmMKLQotU1JDX1VSSVttZDVzdW1dID0gImFmYjI3OGM3N2JiMTk1YzJhMzJmYzY0ZTVjODM3OGZiIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gImZmODY3OWZjZDBjMzFjMjVkMjI5MjYyYzdhZDEwMGJhMTYxZWY2YjJhYTQ1NWEyZGY2NzNkZDc0ZWY5M2Y0ODgiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtcHJpbnRpbmcvY3Vwcy9jdXBzLWZpbHRlcnNfMS4yNi4yLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXByaW50aW5nL2N1cHMvY3Vwcy1maWx0ZXJzXzEuMjYuMi5iYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZlZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXByaW50aW5nL2N1cHMvY3Vwcy1maWx0ZXJzXzEuMjYuMi5iYgpAQCAtMCwwICsxLDQgQEAKK2luY2x1ZGUgY3Vwcy1maWx0ZXJzLmluYworCitTUkNfVVJJW21kNXN1bV0gPSAiOTcwMDk1NTk2YmYyYjhjZmU5MWFjOTFjMGI1MTI5N2EiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiMDA2OWFlZjEzNTg1MjJmMTkwMWE2NDc0OWVjNzUzZDI4YTJkNmE4MzI3NThiY2U1OGZmY2Q3MjJiMjhjMGU2NiIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zZWN1cml0eS9rZXl1dGlscy9rZXl1dGlsc18xLjYuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc2VjdXJpdHkva2V5dXRpbHMva2V5dXRpbHNfMS42LjEuYmIKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXNlY3VyaXR5L2tleXV0aWxzL2tleXV0aWxzXzEuNi5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXNlY3VyaXR5L2tleXV0aWxzL2tleXV0aWxzXzEuNi4xLmJiCmluZGV4IDU3MjE0M2EuLjBhOGMyZTQgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zZWN1cml0eS9rZXl1dGlscy9rZXl1dGlsc18xLjYuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXNlY3VyaXR5L2tleXV0aWxzL2tleXV0aWxzXzEuNi4xLmJiCkBAIC0yMSw4ICsyMSw4IEBACiAgICAgICAgICAgIGZpbGU6Ly9maXhfbGlicmFyeV9pbnN0YWxsX3BhdGgucGF0Y2ggXAogICAgICAgICAgICAiCiAKLVNSQ19VUklbbWQ1c3VtXSA9ICIxOTE5ODdiMGFiNDZiYjViNTBlZmQ3MGE2ZTZjZTgwOCIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICJkM2FlZjIwY2VjMDAwNWMwZmE2YjRiZTQwMDc5ODg1NTY3NDczMTg1YjFhNTdiNjI5YjAzMGU2Nzk0MmM3MTE1IgorU1JDX1VSSVttZDVzdW1dID0gIjkxOWFmN2YzMzU3NjgxNmI0MjNkNTM3ZjhhODY5MmU4IgorU1JDX1VSSVtzaGEyNTZzdW1dID0gImM4YjE1NzIyYWU1MWQ5NWI5YWQ3NmNjNmQ0OWE0YzJjYzE5YjBjNjBmNzJmNjFmYjliZjQzZWVhN2NiZDY0Y2UiCiAKIEVYVFJBX09FTUFLRSA9ICInQ0ZMQUdTPSR7Q0ZMQUdTfSAtV2FsbCcgXAogICAgIE5PX0FSTElCPTEgXApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGNvdi9sY292XzEuMTQuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9sY292L2xjb3ZfMS4xNC5iYgppbmRleCBmZDAyZjRhLi4yNmU3OTdhIDEwMDc1NQotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9sY292L2xjb3ZfMS4xNC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9sY292L2xjb3ZfMS4xNC5iYgpAQCAtMTMsNiArMTMsNyBAQAogICAgIHBlcmwgXAogICAgIHBlcmwtbW9kdWxlLWZpbGVoYW5kbGUgXAogICAgIHBlcmwtbW9kdWxlLWdldG9wdC1zdGQgXAorICAgIHBlcmwtbW9kdWxlLWRpZ2VzdC1tZDUgXAogICAgIHBlcmwtbW9kdWxlLWRpZ2VzdC1zaGEgXAogICAgIHBlcmwtbW9kdWxlLWNvbnN0YW50IFwKICAgICBwZXJsLW1vZHVsZS1jd2QgXApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibWljcm9odHRwZC9saWJtaWNyb2h0dHBkXzAuOS42OC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm1pY3JvaHR0cGQvbGlibWljcm9odHRwZF8wLjkuNjkuYmIKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibWljcm9odHRwZC9saWJtaWNyb2h0dHBkXzAuOS42OC5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibWljcm9odHRwZC9saWJtaWNyb2h0dHBkXzAuOS42OS5iYgppbmRleCBmNTU2OWRlLi40ZGFlYWY3IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJtaWNyb2h0dHBkL2xpYm1pY3JvaHR0cGRfMC45LjY4LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L2xpYm1pY3JvaHR0cGQvbGlibWljcm9odHRwZF8wLjkuNjkuYmIKQEAgLTgsOCArOCw4IEBACiAKIFNSQ19VUkkgPSAiJHtHTlVfTUlSUk9SfS9saWJtaWNyb2h0dHBkLyR7QlBOfS0ke1BWfS50YXIuZ3ogXAogIgotU1JDX1VSSVttZDVzdW1dID0gIjFjM2NhM2JmOTJkZmM2ODA1MzhiNDE4NmM1OGE5YmQwIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gImM1NzE2ZTJhMjg5OWFiYzllMTZjOGZhN2ExYTU4ZGE4OGY4MWFjYTk2YTBiN2U2OGE1ZDRkODllMjE2MTBiNjEiCitTUkNfVVJJW21kNXN1bV0gPSAiM2NlMDNkYjFmMTAwMDc1MTdjZWNmMDVlMDQwMDY5YWYiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiZmI5YjZiMTQ4Yjc4NzQ5M2U2MzdkMzA4MzU4ODcxMWU2NWNiY2I3MjZmYTAyY2VlMmNkNTQzYzVkZTI3ZTM3ZSIKIAogaW5oZXJpdCBhdXRvdG9vbHMgbGliX3BhY2thZ2UgcGtnY29uZmlnIGdldHRleHQKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibmloL2xpYm5paC0xLjAuMy8wMDAxLVVwZGF0ZS1hdXRvdG9vbC1maWxlcy1hbHNvLW1ha2UtaXQtd29yay13aXRoLWxhdGVzdC0ucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zLzAwMDEtVXBkYXRlLWF1dG90b29sLWZpbGVzLWFsc28tbWFrZS1pdC13b3JrLXdpdGgtbGF0ZXN0LS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4NTdjMi4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zLzAwMDEtVXBkYXRlLWF1dG90b29sLWZpbGVzLWFsc28tbWFrZS1pdC13b3JrLXdpdGgtbGF0ZXN0LS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MzEwICswLDAgQEAKLUZyb20gMGYxY2MxYmM2MTU4MDdlODFmZDI3MDlkNDE3N2NhNDExNjg0NDZjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci1EYXRlOiBTYXQsIDcgRGVjIDIwMTkgMDA6NDU6MjMgLTA4MDAKLVN1YmplY3Q6IFtQQVRDSF0gVXBkYXRlIGF1dG90b29sIGZpbGVzLCBhbHNvIG1ha2UgaXQgd29yayB3aXRoIGxhdGVzdCBnZXR0ZXh0Ci0KLVVwc3RyZWFtLVN0YXR1czogSW5hcHByb3ByaWF0ZSBbRGVhZCB1cHN0cmVhbV0KLVNpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci0tLS0KLSBBQk9VVC1OTFMgICAgICAgICAgICAgICB8ICAxMDY5ICstLQotIENoYW5nZUxvZyAgICAgICAgICAgICAgIHwgICAgIDcgKwotIE1ha2VmaWxlLmFtICAgICAgICAgICAgIHwgICAgIDIgKy0KLSBjb25maWd1cmUuYWMgICAgICAgICAgICB8ICAgICA2ICstCi0gaW50bC9DaGFuZ2VMb2cgICAgICAgICAgfCAgICAgNCAtCi0gaW50bC9NYWtlZmlsZS5pbiAgICAgICAgfCAgIDU4NyAtLQotIGludGwvVkVSU0lPTiAgICAgICAgICAgIHwgICAgIDEgLQotIGludGwvYmluZHRleHRkb20uYyAgICAgIHwgICAzNDAgLQotIGludGwvY29uZmlnLmNoYXJzZXQgICAgIHwgICA2NDAgLS0KLSBpbnRsL2RjZ2V0dGV4dC5jICAgICAgICB8ICAgIDU2IC0KLSBpbnRsL2RjaWdldHRleHQuYyAgICAgICB8ICAxNjg5IC0tLS0tCi0gaW50bC9kY25nZXR0ZXh0LmMgICAgICAgfCAgICA1NyAtCi0gaW50bC9kZ2V0dGV4dC5jICAgICAgICAgfCAgICA1OCAtCi0gaW50bC9kbmdldHRleHQuYyAgICAgICAgfCAgICA1OSAtCi0gaW50bC9ldmFsLXBsdXJhbC5oICAgICAgfCAgIDEwOCAtCi0gaW50bC9leHBsb2RlbmFtZS5jICAgICAgfCAgIDEzNSAtCi0gaW50bC9leHBvcnQuaCAgICAgICAgICAgfCAgICAgNiAtCi0gaW50bC9maW5kZG9tYWluLmMgICAgICAgfCAgIDIxMiAtCi0gaW50bC9nZXR0ZXh0LmMgICAgICAgICAgfCAgICA2MyAtCi0gaW50bC9nZXR0ZXh0UC5oICAgICAgICAgfCAgIDI5NyAtCi0gaW50bC9nbW8uaCAgICAgICAgICAgICAgfCAgIDE1MiAtCi0gaW50bC9oYXNoLXN0cmluZy5jICAgICAgfCAgICA1MSAtCi0gaW50bC9oYXNoLXN0cmluZy5oICAgICAgfCAgICAzNiAtCi0gaW50bC9pbnRsLWNvbXBhdC5jICAgICAgfCAgIDEzMyAtCi0gaW50bC9pbnRsLWV4cG9ydHMuYyAgICAgfCAgICAzNiAtCi0gaW50bC9sMTBuZmxpc3QuYyAgICAgICAgfCAgIDQwMCAtLQotIGludGwvbGFuZ3ByZWZzLmMgICAgICAgIHwgICAxMzAgLQotIGludGwvbGliZ251aW50bC5oLmluICAgIHwgICA0MTkgLS0KLSBpbnRsL2xpYmludGwucmMgICAgICAgICB8ICAgIDM4IC0KLSBpbnRsL2xvYWRpbmZvLmggICAgICAgICB8ICAgMTMyIC0KLSBpbnRsL2xvYWRtc2djYXQuYyAgICAgICB8ICAxMzM2IC0tLS0KLSBpbnRsL2xvY2FsY2hhcnNldC5jICAgICB8ICAgNDYxIC0tCi0gaW50bC9sb2NhbGNoYXJzZXQuaCAgICAgfCAgICA0MiAtCi0gaW50bC9sb2NhbGUuYWxpYXMgICAgICAgfCAgICA3NyAtCi0gaW50bC9sb2NhbGVhbGlhcy5jICAgICAgfCAgIDQzOSAtLQotIGludGwvbG9jYWxlbmFtZS5jICAgICAgIHwgIDE1MDcgLS0tLQotIGludGwvbG9jay5jICAgICAgICAgICAgIHwgICA5MjIgLS0tCi0gaW50bC9sb2NrLmggICAgICAgICAgICAgfCAgMTEwNSAtLS0KLSBpbnRsL2xvZy5jICAgICAgICAgICAgICB8ICAgMTE2IC0KLSBpbnRsL25nZXR0ZXh0LmMgICAgICAgICB8ICAgIDY1IC0KLSBpbnRsL29zMmNvbXBhdC5jICAgICAgICB8ICAgIDk4IC0KLSBpbnRsL29zMmNvbXBhdC5oICAgICAgICB8ICAgIDQ2IC0KLSBpbnRsL29zZGVwLmMgICAgICAgICAgICB8ICAgIDI2IC0KLSBpbnRsL3BsdXJhbC1leHAuYyAgICAgICB8ICAgMTU1IC0KLSBpbnRsL3BsdXJhbC1leHAuaCAgICAgICB8ICAgMTI5IC0KLSBpbnRsL3BsdXJhbC5jICAgICAgICAgICB8ICAxOTgxIC0tLS0tLQotIGludGwvcGx1cmFsLnkgICAgICAgICAgIHwgICAzODUgLS0KLSBpbnRsL3ByaW50Zi1hcmdzLmMgICAgICB8ICAgMTg4IC0KLSBpbnRsL3ByaW50Zi1hcmdzLmggICAgICB8ICAgMTU1IC0KLSBpbnRsL3ByaW50Zi1wYXJzZS5jICAgICB8ICAgNTkwIC0tCi0gaW50bC9wcmludGYtcGFyc2UuaCAgICAgfCAgICA3NSAtCi0gaW50bC9wcmludGYuYyAgICAgICAgICAgfCAgIDQyNyAtLQotIGludGwvcmVmLWFkZC5zaW4gICAgICAgIHwgICAgMzEgLQotIGludGwvcmVmLWRlbC5zaW4gICAgICAgIHwgICAgMjYgLQotIGludGwvcmVsb2NhdGFibGUuYyAgICAgIHwgICA0NjggLS0KLSBpbnRsL3JlbG9jYXRhYmxlLmggICAgICB8ICAgIDc5IC0KLSBpbnRsL3RleHRkb21haW4uYyAgICAgICB8ICAgMTI3IC0KLSBpbnRsL3RzZWFyY2guYyAgICAgICAgICB8ICAgNjg0IC0tCi0gaW50bC90c2VhcmNoLmggICAgICAgICAgfCAgICA4MyAtCi0gaW50bC92YXNucHJpbnRmLmMgICAgICAgfCAgNDY3NyAtLS0tLS0tLS0tLS0tCi0gaW50bC92YXNucHJpbnRmLmggICAgICAgfCAgICA3OCAtCi0gaW50bC92YXNud3ByaW50Zi5oICAgICAgfCAgICA0NiAtCi0gaW50bC92ZXJzaW9uLmMgICAgICAgICAgfCAgICAyNiAtCi0gaW50bC93cHJpbnRmLXBhcnNlLmggICAgfCAgICA3NSAtCi0gaW50bC94c2l6ZS5oICAgICAgICAgICAgfCAgIDEwOSAtCi0gbTQvaW50bG1hY29zeC5tNCAgICAgICAgfCAgICA1NSArLQotIHBvL0NoYW5nZUxvZyAgICAgICAgICAgIHwgICAgIDggKwotIHBvL1J1bGVzLXF1b3QgICAgICAgICAgIHwgICAgMTkgKy0KLSBwby9lbkBib2xkcXVvdC5oZWFkZXIgICB8ICAgICAyICstCi0gcG8vZW5AcXVvdC5oZWFkZXIgICAgICAgfCAgICAgMiArLQotIHBvL2luc2VydC1oZWFkZXIuc2luICAgIHwgICAgIDUgKwotIHBvL3JlbW92ZS1wb3RjZGF0ZS5zaW4gIHwgICAgIDggKy0KLSA3NCBmaWxlcyBjaGFuZ2VkLCAxMzM1IGluc2VydGlvbnMoKyksIDM4NjQ2IGRlbGV0aW9ucygtKQotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL0NoYW5nZUxvZwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL01ha2VmaWxlLmluCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvVkVSU0lPTgotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2JpbmR0ZXh0ZG9tLmMKLSBkZWxldGUgbW9kZSAxMDA3NTUgaW50bC9jb25maWcuY2hhcnNldAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2RjZ2V0dGV4dC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZGNpZ2V0dGV4dC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZGNuZ2V0dGV4dC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZGdldHRleHQuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2RuZ2V0dGV4dC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvZXZhbC1wbHVyYWwuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2V4cGxvZGVuYW1lLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9leHBvcnQuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2ZpbmRkb21haW4uYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2dldHRleHQuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2dldHRleHRQLmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9nbW8uaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2hhc2gtc3RyaW5nLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9oYXNoLXN0cmluZy5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvaW50bC1jb21wYXQuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2ludGwtZXhwb3J0cy5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbDEwbmZsaXN0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sYW5ncHJlZnMuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xpYmdudWludGwuaC5pbgotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xpYmludGwucmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2FkaW5mby5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbG9hZG1zZ2NhdC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvbG9jYWxjaGFyc2V0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2NhbGNoYXJzZXQuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvY2FsZS5hbGlhcwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL2xvY2FsZWFsaWFzLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2NhbGVuYW1lLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2NrLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2NrLmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9sb2cuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL25nZXR0ZXh0LmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9vczJjb21wYXQuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL29zMmNvbXBhdC5oCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvb3NkZXAuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3BsdXJhbC1leHAuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3BsdXJhbC1leHAuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3BsdXJhbC5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcGx1cmFsLnkKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9wcmludGYtYXJncy5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcHJpbnRmLWFyZ3MuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3ByaW50Zi1wYXJzZS5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcHJpbnRmLXBhcnNlLmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9wcmludGYuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3JlZi1hZGQuc2luCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcmVmLWRlbC5zaW4KLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC9yZWxvY2F0YWJsZS5jCi0gZGVsZXRlIG1vZGUgMTAwNjQ0IGludGwvcmVsb2NhdGFibGUuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3RleHRkb21haW4uYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3RzZWFyY2guYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3RzZWFyY2guaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3Zhc25wcmludGYuYwotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3Zhc25wcmludGYuaAotIGRlbGV0ZSBtb2RlIDEwMDY0NCBpbnRsL3Zhc253cHJpbnRmLmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC92ZXJzaW9uLmMKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC93cHJpbnRmLXBhcnNlLmgKLSBkZWxldGUgbW9kZSAxMDA2NDQgaW50bC94c2l6ZS5oCi0KLS0tLSBhL0FCT1VULU5MUwotKysrIGIvQUJPVVQtTkxTCi1AQCAtMSwxMDY4ICsxIEBACi0tMSBOb3RlcyBvbiB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0Ci0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0tCi0tRnJlZSBzb2Z0d2FyZSBpcyBnb2luZyBpbnRlcm5hdGlvbmFsISAgVGhlIEZyZWUgVHJhbnNsYXRpb24gUHJvamVjdCBpcwotLWEgd2F5IHRvIGdldCBtYWludGFpbmVycyBvZiBmcmVlIHNvZnR3YXJlLCB0cmFuc2xhdG9ycywgYW5kIHVzZXJzIGFsbAotLXRvZ2V0aGVyLCBzbyB0aGF0IGZyZWUgc29mdHdhcmUgd2lsbCBncmFkdWFsbHkgYmVjb21lIGFibGUgdG8gc3BlYWsgbWFueQotLWxhbmd1YWdlcy4gIEEgZmV3IHBhY2thZ2VzIGFscmVhZHkgcHJvdmlkZSB0cmFuc2xhdGlvbnMgZm9yIHRoZWlyCi0tbWVzc2FnZXMuCi0tCi0tICAgSWYgeW91IGZvdW5kIHRoaXMgYEFCT1VULU5MUycgZmlsZSBpbnNpZGUgYSBkaXN0cmlidXRpb24sIHlvdSBtYXkKLS1hc3N1bWUgdGhhdCB0aGUgZGlzdHJpYnV0ZWQgcGFja2FnZSBkb2VzIHVzZSBHTlUgYGdldHRleHQnIGludGVybmFsbHksCi0taXRzZWxmIGF2YWlsYWJsZSBhdCB5b3VyIG5lYXJlc3QgR05VIGFyY2hpdmUgc2l0ZS4gIEJ1dCB5b3UgZG8gX25vdF8KLS1uZWVkIHRvIGluc3RhbGwgR05VIGBnZXR0ZXh0JyBwcmlvciB0byBjb25maWd1cmluZywgaW5zdGFsbGluZyBvciB1c2luZwotLXRoaXMgcGFja2FnZSB3aXRoIG1lc3NhZ2VzIHRyYW5zbGF0ZWQuCi0tCi0tICAgSW5zdGFsbGVycyB3aWxsIGZpbmQgaGVyZSBzb21lIHVzZWZ1bCBoaW50cy4gIFRoZXNlIG5vdGVzIGFsc28KLS1leHBsYWluIGhvdyB1c2VycyBzaG91bGQgcHJvY2VlZCBmb3IgZ2V0dGluZyB0aGUgcHJvZ3JhbXMgdG8gdXNlIHRoZQotLWF2YWlsYWJsZSB0cmFuc2xhdGlvbnMuICBUaGV5IHRlbGwgaG93IHBlb3BsZSB3YW50aW5nIHRvIGNvbnRyaWJ1dGUgYW5kCi0td29yayBvbiB0cmFuc2xhdGlvbnMgY2FuIGNvbnRhY3QgdGhlIGFwcHJvcHJpYXRlIHRlYW0uCi0tCi0tICAgV2hlbiByZXBvcnRpbmcgYnVncyBpbiB0aGUgYGludGwvJyBkaXJlY3Rvcnkgb3IgYnVncyB3aGljaCBtYXkgYmUKLS1yZWxhdGVkIHRvIGludGVybmF0aW9uYWxpemF0aW9uLCB5b3Ugc2hvdWxkIHRlbGwgYWJvdXQgdGhlIHZlcnNpb24gb2YKLS1gZ2V0dGV4dCcgd2hpY2ggaXMgdXNlZC4gIFRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCi0tYGludGwvVkVSU0lPTicgZmlsZSwgaW4gaW50ZXJuYXRpb25hbGl6ZWQgcGFja2FnZXMuCi0tCi0tMS4xIFF1aWNrIGNvbmZpZ3VyYXRpb24gYWR2aWNlCi0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tCi0tSWYgeW91IHdhbnQgdG8gZXhwbG9pdCB0aGUgZnVsbCBwb3dlciBvZiBpbnRlcm5hdGlvbmFsaXphdGlvbiwgeW91Ci0tc2hvdWxkIGNvbmZpZ3VyZSBpdCB1c2luZwotLQotLSAgICAgLi9jb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQKLS0KLS10byBmb3JjZSB1c2FnZSBvZiBpbnRlcm5hdGlvbmFsaXppbmcgcm91dGluZXMgcHJvdmlkZWQgd2l0aGluIHRoaXMKLS1wYWNrYWdlLCBkZXNwaXRlIHRoZSBleGlzdGVuY2Ugb2YgaW50ZXJuYXRpb25hbGl6aW5nIGNhcGFiaWxpdGllcyBpbiB0aGUKLS1vcGVyYXRpbmcgc3lzdGVtIHdoZXJlIHRoaXMgcGFja2FnZSBpcyBiZWluZyBpbnN0YWxsZWQuICBTbyBmYXIsIG9ubHkKLS10aGUgYGdldHRleHQnIGltcGxlbWVudGF0aW9uIGluIHRoZSBHTlUgQyBsaWJyYXJ5IHZlcnNpb24gMiBwcm92aWRlcyBhcwotLW1hbnkgZmVhdHVyZXMgKHN1Y2ggYXMgbG9jYWxlIGFsaWFzLCBtZXNzYWdlIGluaGVyaXRhbmNlLCBhdXRvbWF0aWMKLS1jaGFyc2V0IGNvbnZlcnNpb24gb3IgcGx1cmFsIGZvcm0gaGFuZGxpbmcpIGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotLUl0IGlzIGFsc28gbm90IHBvc3NpYmxlIHRvIG9mZmVyIHRoaXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IG9uIHRvcAotLW9mIGEgYGNhdGdldHMnIGltcGxlbWVudGF0aW9uLiAgRnV0dXJlIHZlcnNpb25zIG9mIEdOVSBgZ2V0dGV4dCcgd2lsbAotLXZlcnkgbGlrZWx5IGNvbnZleSBldmVuIG1vcmUgZnVuY3Rpb25hbGl0eS4gIFNvIGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhCi0tdG8gY2hhbmdlIHRvIEdOVSBgZ2V0dGV4dCcgYXMgc29vbiBhcyBwb3NzaWJsZS4KLS0KLS0gICBTbyB5b3UgbmVlZCBfbm90XyBwcm92aWRlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgdXNpbmcgR05VIGxpYmMgMiBvcgotLXlvdSBoYXZlIGluc3RhbGxlZCBhIHJlY2VudCBjb3B5IG9mIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlIHdpdGggdGhlCi0taW5jbHVkZWQgYGxpYmludGwnLgotLQotLTEuMiBJTlNUQUxMIE1hdHRlcnMKLS09PT09PT09PT09PT09PT09PT09Ci0tCi0tU29tZSBwYWNrYWdlcyBhcmUgImxvY2FsaXphYmxlIiB3aGVuIHByb3Blcmx5IGluc3RhbGxlZDsgdGhlIHByb2dyYW1zCi0tdGhleSBjb250YWluIGNhbiBiZSBtYWRlIHRvIHNwZWFrIHlvdXIgb3duIG5hdGl2ZSBsYW5ndWFnZS4gIE1vc3Qgc3VjaAotLXBhY2thZ2VzIHVzZSBHTlUgYGdldHRleHQnLiAgT3RoZXIgcGFja2FnZXMgaGF2ZSB0aGVpciBvd24gd2F5cyB0bwotLWludGVybmF0aW9uYWxpemF0aW9uLCBwcmVkYXRpbmcgR05VIGBnZXR0ZXh0Jy4KLS0KLS0gICBCeSBkZWZhdWx0LCB0aGlzIHBhY2thZ2Ugd2lsbCBiZSBpbnN0YWxsZWQgdG8gYWxsb3cgdHJhbnNsYXRpb24gb2YKLS1tZXNzYWdlcy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0aGUgc3lzdGVtIGFscmVhZHkKLS1wcm92aWRlcyB0aGUgR05VIGBnZXR0ZXh0JyBmdW5jdGlvbnMuICBJZiBub3QsIHRoZSBpbmNsdWRlZCBHTlUKLS1gZ2V0dGV4dCcgbGlicmFyeSB3aWxsIGJlIHVzZWQuICBUaGlzIGxpYnJhcnkgaXMgd2hvbGx5IGNvbnRhaW5lZAotLXdpdGhpbiB0aGlzIHBhY2thZ2UsIHVzdWFsbHkgaW4gdGhlIGBpbnRsLycgc3ViZGlyZWN0b3J5LCBzbyBwcmlvcgotLWluc3RhbGxhdGlvbiBvZiB0aGUgR05VIGBnZXR0ZXh0JyBwYWNrYWdlIGlzIF9ub3RfIHJlcXVpcmVkLgotLUluc3RhbGxlcnMgbWF5IHVzZSBzcGVjaWFsIG9wdGlvbnMgYXQgY29uZmlndXJhdGlvbiB0aW1lIGZvciBjaGFuZ2luZwotLXRoZSBkZWZhdWx0IGJlaGF2aW91ci4gIFRoZSBjb21tYW5kczoKLS0KLS0gICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Ci0tICAgICAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtbmxzCi0tCi0td2lsbCwgcmVzcGVjdGl2ZWx5LCBieXBhc3MgYW55IHByZS1leGlzdGluZyBgZ2V0dGV4dCcgdG8gdXNlIHRoZQotLWludGVybmF0aW9uYWxpemluZyByb3V0aW5lcyBwcm92aWRlZCB3aXRoaW4gdGhpcyBwYWNrYWdlLCBvciBlbHNlLAotLV90b3RhbGx5XyBkaXNhYmxlIHRyYW5zbGF0aW9uIG9mIG1lc3NhZ2VzLgotLQotLSAgIFdoZW4geW91IGFscmVhZHkgaGF2ZSBHTlUgYGdldHRleHQnIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbSBhbmQgcnVuCi0tY29uZmlndXJlIHdpdGhvdXQgYW4gb3B0aW9uIGZvciB5b3VyIG5ldyBwYWNrYWdlLCBgY29uZmlndXJlJyB3aWxsCi0tcHJvYmFibHkgZGV0ZWN0IHRoZSBwcmV2aW91c2x5IGJ1aWx0IGFuZCBpbnN0YWxsZWQgYGxpYmludGwuYScgZmlsZSBhbmQKLS13aWxsIGRlY2lkZSB0byB1c2UgdGhpcy4gIFRoaXMgbWlnaHQgbm90IGJlIGRlc2lyYWJsZS4gIFlvdSBzaG91bGQgdXNlCi0tdGhlIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4gIEkuZS4gaWYgdGhlIGZpbGUKLS1gaW50bC9WRVJTSU9OJyBzaG93cyB0aGF0IHRoZSBsaWJyYXJ5IHdoaWNoIGNvbWVzIHdpdGggdGhpcyBwYWNrYWdlIGlzCi0tbW9yZSByZWNlbnQsIHlvdSBzaG91bGQgdXNlCi0tCi0tICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dAotLQotLXRvIHByZXZlbnQgYXV0by1kZXRlY3Rpb24uCi0tCi0tICAgVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIG5vdCB0ZXN0IGZvciB0aGUgYGNhdGdldHMnIGZ1bmN0aW9uCi0tYW5kIHRoZXJlZm9yZSBpdCB3aWxsIG5vdCBiZSB1c2VkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGV2ZW4gYW4KLS1lbXVsYXRpb24gb2YgYGdldHRleHQnIG9uIHRvcCBvZiBgY2F0Z2V0cycgY291bGQgbm90IHByb3ZpZGUgYWxsIHRoZQotLWV4dGVuc2lvbnMgb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4KLS0KLS0gICBJbnRlcm5hdGlvbmFsaXplZCBwYWNrYWdlcyB1c3VhbGx5IGhhdmUgbWFueSBgcG8vTEwucG8nIGZpbGVzLCB3aGVyZQotLUxMIGdpdmVzIGFuIElTTyA2MzkgdHdvLWxldHRlciBjb2RlIGlkZW50aWZ5aW5nIHRoZSBsYW5ndWFnZS4gIFVubGVzcwotLXRyYW5zbGF0aW9ucyBoYXZlIGJlZW4gZm9yYmlkZGVuIGF0IGBjb25maWd1cmUnIHRpbWUgYnkgdXNpbmcgdGhlCi0tYC0tZGlzYWJsZS1ubHMnIHN3aXRjaCwgYWxsIGF2YWlsYWJsZSB0cmFuc2xhdGlvbnMgYXJlIGluc3RhbGxlZAotLXRvZ2V0aGVyIHdpdGggdGhlIHBhY2thZ2UuICBIb3dldmVyLCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYExJTkdVQVMnCi0tbWF5IGJlIHNldCwgcHJpb3IgdG8gY29uZmlndXJhdGlvbiwgdG8gbGltaXQgdGhlIGluc3RhbGxlZCBzZXQuCi0tYExJTkdVQVMnIHNob3VsZCB0aGVuIGNvbnRhaW4gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0d28tbGV0dGVyCi0tY29kZXMsIHN0YXRpbmcgd2hpY2ggbGFuZ3VhZ2VzIGFyZSBhbGxvd2VkLgotLQotLTEuMyBVc2luZyBUaGlzIFBhY2thZ2UKLS09PT09PT09PT09PT09PT09PT09PT09Ci0tCi0tQXMgYSB1c2VyLCBpZiB5b3VyIGxhbmd1YWdlIGhhcyBiZWVuIGluc3RhbGxlZCBmb3IgdGhpcyBwYWNrYWdlLCB5b3UKLS1vbmx5IGhhdmUgdG8gc2V0IHRoZSBgTEFORycgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlCi0tYExMX0NDJyBjb21iaW5hdGlvbi4gIElmIHlvdSBoYXBwZW4gdG8gaGF2ZSB0aGUgYExDX0FMTCcgb3Igc29tZSBvdGhlcgotLWBMQ194eHgnIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQsIHlvdSBzaG91bGQgdW5zZXQgdGhlbSBiZWZvcmUKLS1zZXR0aW5nIGBMQU5HJywgb3RoZXJ3aXNlIHRoZSBzZXR0aW5nIG9mIGBMQU5HJyB3aWxsIG5vdCBoYXZlIHRoZQotLWRlc2lyZWQgZWZmZWN0LiAgSGVyZSBgTEwnIGlzIGFuIElTTyA2MzkgdHdvLWxldHRlciBsYW5ndWFnZSBjb2RlLCBhbmQKLS1gQ0MnIGlzIGFuIElTTyAzMTY2IHR3by1sZXR0ZXIgY291bnRyeSBjb2RlLiAgRm9yIGV4YW1wbGUsIGxldCdzCi0tc3VwcG9zZSB0aGF0IHlvdSBzcGVhayBHZXJtYW4gYW5kIGxpdmUgaW4gR2VybWFueS4gIEF0IHRoZSBzaGVsbAotLXByb21wdCwgbWVyZWx5IGV4ZWN1dGUgYHNldGVudiBMQU5HIGRlX0RFJyAoaW4gYGNzaCcpLAotLWBleHBvcnQgTEFORzsgTEFORz1kZV9ERScgKGluIGBzaCcpIG9yIGBleHBvcnQgTEFORz1kZV9ERScgKGluIGBiYXNoJykuCi0tVGhpcyBjYW4gYmUgZG9uZSBmcm9tIHlvdXIgYC5sb2dpbicgb3IgYC5wcm9maWxlJyBmaWxlLCBvbmNlIGFuZCBmb3IKLS1hbGwuCi0tCi0tICAgWW91IG1pZ2h0IHRoaW5rIHRoYXQgdGhlIGNvdW50cnkgY29kZSBzcGVjaWZpY2F0aW9uIGlzIHJlZHVuZGFudC4KLS1CdXQgaW4gZmFjdCwgc29tZSBsYW5ndWFnZXMgaGF2ZSBkaWFsZWN0cyBpbiBkaWZmZXJlbnQgY291bnRyaWVzLiAgRm9yCi0tZXhhbXBsZSwgYGRlX0FUJyBpcyB1c2VkIGZvciBBdXN0cmlhLCBhbmQgYHB0X0JSJyBmb3IgQnJhemlsLiAgVGhlCi0tY291bnRyeSBjb2RlIHNlcnZlcyB0byBkaXN0aW5ndWlzaCB0aGUgZGlhbGVjdHMuCi0tCi0tICAgVGhlIGxvY2FsZSBuYW1pbmcgY29udmVudGlvbiBvZiBgTExfQ0MnLCB3aXRoIGBMTCcgZGVub3RpbmcgdGhlCi0tbGFuZ3VhZ2UgYW5kIGBDQycgZGVub3RpbmcgdGhlIGNvdW50cnksIGlzIHRoZSBvbmUgdXNlIG9uIHN5c3RlbXMgYmFzZWQKLS1vbiBHTlUgbGliYy4gIE9uIG90aGVyIHN5c3RlbXMsIHNvbWUgdmFyaWF0aW9ucyBvZiB0aGlzIHNjaGVtZSBhcmUKLS11c2VkLCBzdWNoIGFzIGBMTCcgb3IgYExMX0NDLkVOQ09ESU5HJy4gIFlvdSBjYW4gZ2V0IHRoZSBsaXN0IG9mCi0tbG9jYWxlcyBzdXBwb3J0ZWQgYnkgeW91ciBzeXN0ZW0gZm9yIHlvdXIgbGFuZ3VhZ2UgYnkgcnVubmluZyB0aGUKLS1jb21tYW5kIGBsb2NhbGUgLWEgfCBncmVwICdeTEwnJy4KLS0KLS0gICBOb3QgYWxsIHByb2dyYW1zIGhhdmUgdHJhbnNsYXRpb25zIGZvciBhbGwgbGFuZ3VhZ2VzLiAgQnkgZGVmYXVsdCwgYW4KLS1FbmdsaXNoIG1lc3NhZ2UgaXMgc2hvd24gaW4gcGxhY2Ugb2YgYSBub25leGlzdGVudCB0cmFuc2xhdGlvbi4gIElmIHlvdQotLXVuZGVyc3RhbmQgb3RoZXIgbGFuZ3VhZ2VzLCB5b3UgY2FuIHNldCB1cCBhIHByaW9yaXR5IGxpc3Qgb2YgbGFuZ3VhZ2VzLgotLVRoaXMgaXMgZG9uZSB0aHJvdWdoIGEgZGlmZmVyZW50IGVudmlyb25tZW50IHZhcmlhYmxlLCBjYWxsZWQKLS1gTEFOR1VBR0UnLiAgR05VIGBnZXR0ZXh0JyBnaXZlcyBwcmVmZXJlbmNlIHRvIGBMQU5HVUFHRScgb3ZlciBgTEFORycKLS1mb3IgdGhlIHB1cnBvc2Ugb2YgbWVzc2FnZSBoYW5kbGluZywgYnV0IHlvdSBzdGlsbCBuZWVkIHRvIGhhdmUgYExBTkcnCi0tc2V0IHRvIHRoZSBwcmltYXJ5IGxhbmd1YWdlOyB0aGlzIGlzIHJlcXVpcmVkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZQotLXN5c3RlbSBsaWJyYXJpZXMuICBGb3IgZXhhbXBsZSwgc29tZSBTd2VkaXNoIHVzZXJzIHdobyB3b3VsZCByYXRoZXIKLS1yZWFkIHRyYW5zbGF0aW9ucyBpbiBHZXJtYW4gdGhhbiBFbmdsaXNoIGZvciB3aGVuIFN3ZWRpc2ggaXMgbm90Ci0tYXZhaWxhYmxlLCBzZXQgYExBTkdVQUdFJyB0byBgc3Y6ZGUnIHdoaWxlIGxlYXZpbmcgYExBTkcnIHRvIGBzdl9TRScuCi0tCi0tICAgU3BlY2lhbCBhZHZpY2UgZm9yIE5vcndlZ2lhbiB1c2VyczogVGhlIGxhbmd1YWdlIGNvZGUgZm9yIE5vcndlZ2lhbgotLWJva21hKmwgY2hhbmdlZCBmcm9tIGBubycgdG8gYG5iJyByZWNlbnRseSAoaW4gMjAwMykuICBEdXJpbmcgdGhlCi0tdHJhbnNpdGlvbiBwZXJpb2QsIHdoaWxlIHNvbWUgbWVzc2FnZSBjYXRhbG9ncyBmb3IgdGhpcyBsYW5ndWFnZSBhcmUKLS1pbnN0YWxsZWQgdW5kZXIgYG5iJyBhbmQgc29tZSBvbGRlciBvbmVzIHVuZGVyIGBubycsIGl0J3MgcmVjb21tZW5kZWQKLS1mb3IgTm9yd2VnaWFuIHVzZXJzIHRvIHNldCBgTEFOR1VBR0UnIHRvIGBuYjpubycgc28gdGhhdCBib3RoIG5ld2VyIGFuZAotLW9sZGVyIHRyYW5zbGF0aW9ucyBhcmUgdXNlZC4KLS0KLS0gICBJbiB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYnV0IG5vdCBpbiB0aGUgYExBTkcnCi0tZW52aXJvbm1lbnQgdmFyaWFibGUsIGBMTF9DQycgY29tYmluYXRpb25zIGNhbiBiZSBhYmJyZXZpYXRlZCBhcyBgTEwnCi0tdG8gZGVub3RlIHRoZSBsYW5ndWFnZSdzIG1haW4gZGlhbGVjdC4gIEZvciBleGFtcGxlLCBgZGUnIGlzIGVxdWl2YWxlbnQKLS10byBgZGVfREUnIChHZXJtYW4gYXMgc3Bva2VuIGluIEdlcm1hbnkpLCBhbmQgYHB0JyB0byBgcHRfUFQnCi0tKFBvcnR1Z3Vlc2UgYXMgc3Bva2VuIGluIFBvcnR1Z2FsKSBpbiB0aGlzIGNvbnRleHQuCi0tCi0tMS40IFRyYW5zbGF0aW5nIFRlYW1zCi0tPT09PT09PT09PT09PT09PT09PT09Ci0tCi0tRm9yIHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgdG8gYmUgYSBzdWNjZXNzLCB3ZSBuZWVkIGludGVyZXN0ZWQKLS1wZW9wbGUgd2hvIGxpa2UgdGhlaXIgb3duIGxhbmd1YWdlIGFuZCB3cml0ZSBpdCB3ZWxsLCBhbmQgd2hvIGFyZSBhbHNvCi0tYWJsZSB0byBzeW5lcmdpemUgd2l0aCBvdGhlciB0cmFuc2xhdG9ycyBzcGVha2luZyB0aGUgc2FtZSBsYW5ndWFnZS4KLS1FYWNoIHRyYW5zbGF0aW9uIHRlYW0gaGFzIGl0cyBvd24gbWFpbGluZyBsaXN0LiAgVGhlIHVwLXRvLWRhdGUgbGlzdCBvZgotLXRlYW1zIGNhbiBiZSBmb3VuZCBhdCB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0J3MgaG9tZXBhZ2UsCi0tYGh0dHA6Ly90cmFuc2xhdGlvbnByb2plY3Qub3JnLycsIGluIHRoZSAiVGVhbXMiIGFyZWEuCi0tCi0tICAgSWYgeW91J2QgbGlrZSB0byB2b2x1bnRlZXIgdG8gX3dvcmtfIGF0IHRyYW5zbGF0aW5nIG1lc3NhZ2VzLCB5b3UKLS1zaG91bGQgYmVjb21lIGEgbWVtYmVyIG9mIHRoZSB0cmFuc2xhdGluZyB0ZWFtIGZvciB5b3VyIG93biBsYW5ndWFnZS4KLS1UaGUgc3Vic2NyaWJpbmcgYWRkcmVzcyBpcyBfbm90XyB0aGUgc2FtZSBhcyB0aGUgbGlzdCBpdHNlbGYsIGl0IGhhcwotLWAtcmVxdWVzdCcgYXBwZW5kZWQuICBGb3IgZXhhbXBsZSwgc3BlYWtlcnMgb2YgU3dlZGlzaCBjYW4gc2VuZCBhCi0tbWVzc2FnZSB0byBgc3YtcmVxdWVzdEBsaS5vcmcnLCBoYXZpbmcgdGhpcyBtZXNzYWdlIGJvZHk6Ci0tCi0tICAgICBzdWJzY3JpYmUKLS0KLS0gICBLZWVwIGluIG1pbmQgdGhhdCB0ZWFtIG1lbWJlcnMgYXJlIGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlCi0tX2FjdGl2ZWx5XyBpbiB0cmFuc2xhdGlvbnMsIG9yIGF0IHNvbHZpbmcgdHJhbnNsYXRpb25hbCBkaWZmaWN1bHRpZXMsCi0tcmF0aGVyIHRoYW4gbWVyZWx5IGx1cmtpbmcgYXJvdW5kLiAgSWYgeW91ciB0ZWFtIGRvZXMgbm90IGV4aXN0IHlldCBhbmQKLS15b3Ugd2FudCB0byBzdGFydCBvbmUsIG9yIGlmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHdoYXQgdG8gZG8gb3IgaG93IHRvCi0tZ2V0IHN0YXJ0ZWQsIHBsZWFzZSB3cml0ZSB0byBgY29vcmRpbmF0b3JAdHJhbnNsYXRpb25wcm9qZWN0Lm9yZycgdG8KLS1yZWFjaCB0aGUgY29vcmRpbmF0b3IgZm9yIGFsbCB0cmFuc2xhdG9yIHRlYW1zLgotLQotLSAgIFRoZSBFbmdsaXNoIHRlYW0gaXMgc3BlY2lhbC4gIEl0IHdvcmtzIGF0IGltcHJvdmluZyBhbmQgdW5pZm9ybWl6aW5nCi0tdGhlIHRlcm1pbm9sb2d5IGluIHVzZS4gIFByb3ZlbiBsaW5ndWlzdGljIHNraWxscyBhcmUgcHJhaXNlZCBtb3JlIHRoYW4KLS1wcm9ncmFtbWluZyBza2lsbHMsIGhlcmUuCi0tCi0tMS41IEF2YWlsYWJsZSBQYWNrYWdlcwotLT09PT09PT09PT09PT09PT09PT09PT0KLS0KLS1MYW5ndWFnZXMgYXJlIG5vdCBlcXVhbGx5IHN1cHBvcnRlZCBpbiBhbGwgcGFja2FnZXMuICBUaGUgZm9sbG93aW5nCi0tbWF0cml4IHNob3dzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCBhcyBvZiBOb3ZlbWJlcgotLTIwMDcuICBUaGUgbWF0cml4IHNob3dzLCBpbiByZWdhcmQgb2YgZWFjaCBwYWNrYWdlLCBmb3Igd2hpY2ggbGFuZ3VhZ2VzCi0tUE8gZmlsZXMgaGF2ZSBiZWVuIHN1Ym1pdHRlZCB0byB0cmFuc2xhdGlvbiBjb29yZGluYXRpb24sIHdpdGggYQotLXRyYW5zbGF0aW9uIHBlcmNlbnRhZ2Ugb2YgYXQgbGVhc3QgNTAlLgotLQotLSAgICAgUmVhZHkgUE8gZmlsZXMgICAgICAgYWYgYW0gYXIgYXogYmUgYmcgYnMgY2EgY3MgY3kgZGEgZGUgZWwgZW4gZW5fR0IgZW8KLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS0gICAgIENvbXBlbmRpdW0gICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICBbXSAgICAgIHwKLS0gICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICBbXSAgICAgIHwKLS0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgICBbXSAgICAgIHwKLS0gICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpYnNoZWxmICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpc29uLXJ1bnRpbWUgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGJsdWV6LXBpbiAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgIFtdIHwKLS0gICAgIGNmbG93ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdICAgICAgICAgIHwKLS0gICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNwcGxpYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGNyeXB0b25pdCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGRpYWxvZyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIHwKLS0gICAgIGRvb2RsZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICBbXSAgICAgIHwKLS0gICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICgpIFtdICAgICBbXSAgICAgIHwKLS0gICAgIGZpbmR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGZpbmR1dGlsc19zdGFibGUgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdIHwKLS0gICAgIGdldHRleHQtcnVudGltZSAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKLS0gICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdpcCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdtdWx0ICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICgpICgpICAgICBbXSAgICAgIHwKLS0gICAgIGdudWVkdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudWxpYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudW5ldCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudW5ldC1ndGsgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudXRscyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1jb250YWN0cyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1maWxlbWFuYWdlciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1wYWNrYWdlICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1zdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS10YXNrbWFuYWdlciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS10b2RvICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICBbXSAgICAgIHwKLS0gICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdyYW1hZG9pciAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzYXNsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLWJhZCAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLWJhc2UgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLWdvb2QgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLXVnbHkgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzdHJlYW1lciAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICAgICBbXSAgICAgIHwKLS0gICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIGd0a2FtICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGd0a29ycGhhbiAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGd0a3NwZWxsICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdIHwKLS0gICAgIGd1dGVucHJpbnQgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKLS0gICAgIGhlcnJpZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGh5bGFmYXggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlkdXRpbHMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGluZGVudCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgIFtdIHwKLS0gICAgIGlzb18xNTkyNCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgICAgIFtdICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdICAgICAgICAgIFtdIHwKLS0gICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlzb180MjE3ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKLS0gICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGp0YWcgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgICAgIHwKLS0gICAgIGtleXRvdWNoICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGtleXRvdWNoLWVkaXRvciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGtleXRvdWNoLWtleWJvYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxlYWZwYWQgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIHwKLS0gICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmV4aWYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmV4dHJhY3RvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdwZXdpZGdldCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdwZy1lcnJvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdwaG90bzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdwaG90bzJfcG9ydCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdzYXNsICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIHwKLS0gICAgIGxpYmlkbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxwcm5nICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGx5bnggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgICAgIHwKLS0gICAgIG1haWxmcm9tZCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHBpbG90LXFvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHBvcHQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHBzbWlzYyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHB3ZHV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHFvZiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgIFtdIFtdIFtdICAgICAgICAgIFtdIHwKLS0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNjcm9sbGtlZXBlciAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICBbXSAgICAgIHwKLS0gICAgIHNlZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIHwKLS0gICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgIFtdICgpIFtdICAgICBbXSAgIFtdIHwKLS0gICAgIHNoYXJ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgIFtdIFtdIFtdICAgICAgICAgICAgIHwKLS0gICAgIHNoaXNoaSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIHNvbGZlZ2UgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHN5c3RlbS10b29scy1iYS4uLiB8ICAgICAgIFtdICAgICAgIFtdIFtdIFtdIFtdICAgIFtdIFtdIFtdICAgICBbXSAgICAgIHwKLS0gICAgIHRhciAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKLS0gICAgIHRpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAoKSAgICAgIHwKLS0gICAgIHR1eHBhaW50ICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgICAgICBbXSAgIFtdIHwKLS0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHV0aWwtbGludXgtbmcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLS0gICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICBbXSAgICAgIHwKLS0gICAgIHdnZXQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLS0gICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgIFtdIFtdICAgICBbXSAgICAgIHwKLS0gICAgIHhrZXlib2FyZC1jb25maWcgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwKLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmIGFtIGFyIGF6IGJlIGJnIGJzIGNhIGNzIGN5IGRhIGRlIGVsIGVuIGVuX0dCIGVvCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgMCAgMiAgMSAgOCAyNiAgMiA0MCA0OCAgMiA1NiA4OCAxNSAgMSAgMTUgICAxOAotLQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXMgZXQgZXUgZmEgZmkgZnIgIGdhIGdsIGd1IGhlIGhpIGhyIGh1IGlkIGlzIGl0Ci0tICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLSAgICAgQ29tcGVuZGl1bSAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGEycHMgICAgICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSB8Ci0tICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGJhc2ggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBiZmQgICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYmlic2hlbGYgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGJpbnV0aWxzICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBiaXNvbiAgICAgICAgICAgICAgfCBbXSBbXSAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgW10gICAgW10gfAotLSAgICAgYmlzb24tcnVudGltZSAgICAgIHwgICAgW10gICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIHwKLS0gICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0tICAgICBjZmxvdyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBjb3JldXRpbHMgICAgICAgICAgfCBbXSBbXSAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNwcGxpYiAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBjcnlwdG9uaXQgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZGlhbG9nICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGRpZmZ1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICBkb29kbGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICB8Ci0tICAgICBmZXRjaG1haWwgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgW10gICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGZpbmR1dGlsc19zdGFibGUgICB8ICAgIFtdICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBmbGV4ICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdhcyAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnYXdrICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgW10gICAgICAgW10gICAgICAgICAgICAgICAgKCkgfAotLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdjYyAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCBbXSAgICAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgW10gW10gICAgW10gfAotLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgW10gICAgICAgICAgW10gW10gIFtdICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIHwKLS0gICAgIGdldHRleHQtdG9vbHMgICAgICB8IFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBnaXAgICAgICAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBnbXVsdCAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIHwKLS0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICgpICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICB8Ci0tICAgICBnbnVlZHUgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251bGliICAgICAgICAgICAgIHwgW10gW10gICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudW5ldCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnVuZXQtZ3RrICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251dGxzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncGUtYmVhbSAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1jbG9jayAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0tICAgICBncGUtZmlsZW1hbmFnZXIgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGdwZS1sb2dpbiAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBncGUtb3duZXJpbmZvICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgfAotLSAgICAgZ3BlLXBhY2thZ2UgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1za2V0Y2hib29rICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncGUtc3UgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS10aW1lc2hlZXQgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0tICAgICBncGUtdG9kYXkgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwaG90bzIgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBncHJvZiAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgfAotLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBncmVwICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIHwKLS0gICAgIGdzYXNsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0tICAgICBnc3MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFkICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIGdzdC1wbHVnaW5zLWJhc2UgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBnc3QtcGx1Z2lucy1nb29kICAgfCBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgZ3N0LXBsdWdpbnMtdWdseSAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIGdzdHJlYW1lciAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0tICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgZ3RrYW0gICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIGd0a29ycGhhbiAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBndGtzcGVsbCAgICAgICAgICAgfCBbXSAgICBbXSAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgZ3V0ZW5wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGhlbGxvICAgICAgICAgICAgICB8IFtdIFtdIFtdIFtdIFtdIFtdICBbXSBbXSAgICBbXSAgICBbXSBbXSBbXSAgICBbXSB8Ci0tICAgICBoZXJyaWUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaHlsYWZheCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlkdXRpbHMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICBpbmRlbnQgICAgICAgICAgICAgfCBbXSBbXSBbXSAgICBbXSBbXSAgW10gW10gICAgICAgICAgICAgW10gW10gICAgW10gfAotLSAgICAgaXNvXzE1OTI0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlzb18zMTY2ICAgICAgICAgICB8IFtdIFtdIFtdICAgIFtdIFtdICAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgICBbXSB8Ci0tICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIGlzb182MzkgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBqcGlsb3QgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGp3aG9pcyAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICBrYmQgICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAga2V5dG91Y2ggICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGtleXRvdWNoLWVkaXRvciAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBrZXl0b3VjaC1rZXlib2EuLi4gfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGxkICAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsZWFmcGFkICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgW10gICAgICAgW10gICAgICAgW10gICAgICAgW10gfAotLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIGxpYmV4aWYgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJleHRyYWN0b3IgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgW10gICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIHwKLS0gICAgIGxpYmdwZy1lcnJvciAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJncGhvdG8yICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotLSAgICAgbGliZ3Bob3RvMl9wb3J0ICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGxpYmdzYXNsICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICBbXSAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliaWRuICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWx5cG9uZCAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIHwKLS0gICAgIGxwcm5nICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBseW54ICAgICAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICAgIHwKLS0gICAgIG1haWxmcm9tZCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBtYWlsdXRpbHMgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gIFtdIFtdICAgIFtdICAgIFtdICAgIFtdICAgICAgIHwKLS0gICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBtaW5pY29tICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgW10gIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIG9wY29kZXMgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gfAotLSAgICAgcGlsb3QtcW9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHBvcHQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSBbXSAgICAgICAgICAgICAgICAgICBbXSAgICB8Ci0tICAgICBwc21pc2MgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgcHdkdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHFvZiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0tICAgICByYWRpdXMgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgW10gIFtdIFtdICAgIFtdICAgICAgIFtdIFtdICAgIFtdIHwKLS0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0tICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdIFtdICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCBbXSAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAotLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgW10gW10gICAgICAgW10gW10gIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKLS0gICAgIHNoaXNoaSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBza2VuY2lsICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc29sZmVnZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLS0gICAgIHNvdW5kdHJhY2tlciAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0tICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc3lzdGVtLXRvb2xzLWJhLi4uIHwgW10gICAgW10gICAgW10gW10gIFtdICAgICAgICAgICAgIFtdIFtdIFtdICAgIFtdIHwKLS0gICAgIHRhciAgICAgICAgICAgICAgICB8ICAgIFtdIFtdICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgfAotLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgW10gICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0tICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHV0aWwtbGludXggICAgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0tICAgICB1dGlsLWxpbnV4LW5nICAgICAgfCBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gfAotLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICB3ZGlmZiAgICAgICAgICAgICAgfCBbXSBbXSAgICAgICAgICBbXSAgW10gW10gICAgICAgICAgICAgW10gW10gICAgW10gfAotLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgW10gICAgICAgW10gW10gIFtdICAgICAgICAgICAgIFtdIFtdIFtdICAgIFtdIHwKLS0gICAgIHhjaGF0ICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSB8Ci0tICAgICB4a2V5Ym9hcmQtY29uZmlnICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBlcyBldCBldSBmYSBmaSBmciAgZ2EgZ2wgZ3UgaGUgaGkgaHIgaHUgaWQgaXMgaXQKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDg1IDIyIDE0ICAyIDQ4IDEwMSA2MSAxMiAgMiAgOCAgMiAgNiA1MyAyOSAgMSA1MgotLQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgamEga2Ega28ga3Uga3kgbGcgbHQgbHYgbWsgbW4gbXMgbXQgbmIgbmUgbmwgIG5uCi0tICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLSAgICAgQ29tcGVuZGl1bSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgfAotLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgIFtdICAgICB8Ci0tICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYmlic2hlbGYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLS0gICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgfAotLSAgICAgYmlzb24tcnVudGltZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgIHwKLS0gICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBjZmxvdyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGNwcGxpYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBjcnlwdG9uaXQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZGlhbG9nICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGRpZmZ1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBkb29kbGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBmZXRjaG1haWwgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGZpbmR1dGlsc19zdGFibGUgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnYXdrICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdldHRleHQtdG9vbHMgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnaXAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnbXVsdCAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICgpICAgICAgICB8Ci0tICAgICBnbnVlZHUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251bGliICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdudW5ldCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnVuZXQtZ3RrICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251dGxzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1jbG9jayAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtY29uZiAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtZmlsZW1hbmFnZXIgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1sb2dpbiAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtb3duZXJpbmZvICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLXBhY2thZ2UgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtc3UgICAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncGUtdG9kYXkgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdwaG90bzIgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICB8Ci0tICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzYXNsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnc3MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFkICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLWJhc2UgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnc3QtcGx1Z2lucy1nb29kICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtdWdseSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdzdHJlYW1lciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3RrYW0gICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGd0a29ycGhhbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBndGtzcGVsbCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3V0ZW5wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGhlbGxvICAgICAgICAgICAgICB8IFtdIFtdIFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgIFtdICBbXSB8Ci0tICAgICBoZXJyaWUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaHlsYWZheCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlkdXRpbHMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBpbmRlbnQgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaXNvXzE1OTI0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGlzb18zMTY2ICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdICAgIFtdICBbXSB8Ci0tICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGlzb182MzkgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdICBbXSB8Ci0tICAgICBqcGlsb3QgICAgICAgICAgICAgfCAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgfAotLSAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAga2V5dG91Y2ggICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGtleXRvdWNoLWVkaXRvciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBrZXl0b3VjaC1rZXlib2EuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsZWFmcGFkICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpYmV4aWYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJleHRyYWN0b3IgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpYmdwZy1lcnJvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJncGhvdG8yICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Bob3RvMl9wb3J0ICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxpYmdzYXNsICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGliaWRuICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxwcm5nICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBseW54ICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIG1haWxmcm9tZCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBtaW5pY29tICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgIHwKLS0gICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgcGlsb3QtcW9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHBvcHQgICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBwc21pc2MgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgfAotLSAgICAgcHdkdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHFvZiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHJwbSAgICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzY3JlZW0gICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gIFtdIHwKLS0gICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCBbXSAgICBbXSAgICAgICAgICBbXSAgICAgICAgICBbXSAgICBbXSAgICBbXSAgW10gfAotLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHNoaXNoaSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc29sZmVnZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICgpIHwKLS0gICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBzcCAgICAgICAgICAgICAgICAgfCAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc3lzdGVtLXRvb2xzLWJhLi4uIHwgW10gICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHRhciAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgfAotLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgIFtdICBbXSB8Ci0tICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHV0aWwtbGludXggICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICB1dGlsLWxpbnV4LW5nICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgfAotLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHhjaGF0ICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICB4a2V5Ym9hcmQtY29uZmlnICAgfCAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBqYSBrYSBrbyBrdSBreSBsZyBsdCBsdiBtayBtbiBtcyBtdCBuYiBuZSBubCAgbm4KLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDUxICAyIDI1ICAzICAyICAwICA2ICAwICAyICAyIDIwICAwIDExICAxIDEwMyAgNgotLQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcGEgcGwgcHQgcHRfQlIgcm0gcm8gcnUgcncgc2sgc2wgc3Egc3Igc3YgIHRhCi0tICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLSAgICAgQ29tcGVuZGl1bSAgICAgICAgIHwgICAgICAgICAgW10gIFtdICAgICAgW10gICAgICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICgpICAgICBbXSAgICAgIFtdIFtdICAgICAgIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAoKSAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgICAgICAgICAgIHwKLS0gICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICB8Ci0tICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgYmlic2hlbGYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICB8Ci0tICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgYmlzb24tcnVudGltZSAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gICAgICAgICAgW10gICAgICAgW10gICAgIHwKLS0gICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgIFtdIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBjZmxvdyAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGNwcGxpYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBjcnlwdG9uaXQgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZGlhbG9nICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBkb29kbGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgfAotLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgIFtdIFtdICAgICAgIFtdICAgICAgIFtdICAgICB8Ci0tICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgfAotLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGZpbmR1dGlsc19zdGFibGUgICB8ICAgICAgIFtdIFtdICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgIFtdICAgICB8Ci0tICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCAgICAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgW10gW10gICAgICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBnaXAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgfAotLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gW10gICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgIFtdIFtdICAgIFtdICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBnbXVsdCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgfAotLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnbnVlZHUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ251bGliICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgIHwKLS0gICAgIGdudW5ldCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBnbnVuZXQtZ3RrICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ251dGxzICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgICAgIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgIFtdIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtZmlsZW1hbmFnZXIgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLXBhY2thZ2UgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgIHwKLS0gICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgW10gIFtdICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgW10gW10gICAgIHwKLS0gICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICAgfAotLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgW10gW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGdzYXNsICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBnc3MgICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtYmFkICAgIHwgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdzdC1wbHVnaW5zLWJhc2UgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBnc3QtcGx1Z2lucy1nb29kICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgZ3N0LXBsdWdpbnMtdWdseSAgIHwgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGdzdHJlYW1lciAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICB8Ci0tICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgZ3RrYW0gICAgICAgICAgICAgIHwgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGd0a29ycGhhbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBndGtzcGVsbCAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICBbXSBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgZ3V0ZW5wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBoZXJyaWUgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgaHlsYWZheCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlkdXRpbHMgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBpbmRlbnQgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgfAotLSAgICAgaXNvXzE1OTI0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgIFtdIFtdIFtdICBbXSAgICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdICBbXSB8Ci0tICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgICAgICAgW10gW10gICAgW10gICAgW10gW10gICAgIHwKLS0gICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLS0gICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgIFtdICAgICBbXSAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAga2V5dG91Y2ggICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGtleXRvdWNoLWVkaXRvciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBrZXl0b3VjaC1rZXlib2EuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsZWFmcGFkICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgW10gfAotLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpYmV4aWYgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICB8Ci0tICAgICBsaWJleHRyYWN0b3IgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgW10gW10gIFtdICAgICAgW10gICAgICAgW10gW10gICAgW10gW10gICAgIHwKLS0gICAgIGxpYmdwZy1lcnJvciAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsaWJncGhvdG8yICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGliZ3Bob3RvMl9wb3J0ICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIGxpYmdzYXNsICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIFtdICAgICB8Ci0tICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgfAotLSAgICAgbGliaWRuICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgIHwKLS0gICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIGxwcm5nICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIG1haWxmcm9tZCAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIFtdICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcGlsb3QtcW9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHBvcHQgICAgICAgICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBwc21pc2MgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgcHdkdXRpbHMgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLS0gICAgIHFvZiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgW10gW10gIFtdICAgICAgW10gW10gICAgICAgW10gICAgICAgW10gICAgIHwKLS0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICB8Ci0tICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgW10gICAgW10gW10gW10gICAgIHwKLS0gICAgIHNlZCAgICAgICAgICAgICAgICB8ICAgICAgIFtdIFtdICBbXSAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICB8Ci0tICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgfAotLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgIHwKLS0gICAgIHNoaXNoaSAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgc29sZmVnZSAgICAgICAgICAgIHwgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICB8Ci0tICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgc3lzdGVtLXRvb2xzLWJhLi4uIHwgICAgW10gW10gW10gIFtdICAgICAgW10gICAgICAgICAgICAgW10gW10gW10gIFtdIHwKLS0gICAgIHRhciAgICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgIFtdICAgICB8Ci0tICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICB8Ci0tICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgIFtdICAgICAgIFtdICAgICB8Ci0tICAgICB1dGlsLWxpbnV4LW5nICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIHwKLS0gICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgfAotLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgIHwKLS0gICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdIFtdIFtdIFtdICAgICB8Ci0tICAgICB4a2V5Ym9hcmQtY29uZmlnICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICAgfAotLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgW10gICAgIHwKLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwYSBwbCBwdCBwdF9CUiBybSBybyBydSBydyBzayBzbCBzcSBzciBzdiAgdGEKLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAwICA1IDc3IDMxICA1MyAgICA0IDU4IDcyICAzIDQ1IDQ2ICA5IDQ1IDEyMiAgMwotLQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGcgdGggdGsgdHIgdWsgdmVuIHZpICB3YSB4aCB6aF9DTiB6aF9ISyB6aF9UVyB6dQotLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0tICAgICBDb21wZW5kaXVtICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMTkKLS0gICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOQotLSAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCi0tICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLS0gICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQotLSAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0Ci0tICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKLS0gICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotLSAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCi0tICAgICBiaWJzaGVsZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAgOQotLSAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDIwCi0tICAgICBiaXNvbi1ydW50aW1lICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMTgKLS0gICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgW10gICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyOAotLSAgICAgY2Zsb3cgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0tICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLS0gICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotLSAgICAgY29yZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE4Ci0tICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTEKLS0gICAgIGNwcGxpYiAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxMgotLSAgICAgY3J5cHRvbml0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0tICAgICBkaWFsb2cgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgIDkKLS0gICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyOQotLSAgICAgZG9vZGxlICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0tICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKLS0gICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgotLSAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCi0tICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKLS0gICAgIGZpbmR1dGlsc19zdGFibGUgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxOAotLSAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1Ci0tICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLS0gICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotLSAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDE2Ci0tICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLS0gICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAgNwotLSAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgW10gICAgW10gICAgICB8IDI5Ci0tICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgIHwgMjgKLS0gICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMAotLSAgICAgZ2lwICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDEzCi0tICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKLS0gICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNQotLSAgICAgZ211bHQgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE2Ci0tICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLS0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICgpIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotLSAgICAgZ251ZWR1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCi0tICAgICBnbnVsaWIgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKLS0gICAgIGdudW5ldCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAotLSAgICAgZ251bmV0LWd0ayAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0tICAgICBnbnV0bHMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLS0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAxNAotLSAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDE0Ci0tICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLS0gICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgfCAyMQotLSAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgICAgICAgICB8IDE2Ci0tICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTAKLS0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMgotLSAgICAgZ3BlLWZpbGVtYW5hZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICBncGUtZ28gICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTkKLS0gICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMQotLSAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDIxCi0tICAgICBncGUtcGFja2FnZSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLS0gICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgotLSAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgICAgICAgICB8IDIxCi0tICAgICBncGUtdGFza21hbmFnZXIgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjEKLS0gICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOAotLSAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgW10gICAgICB8IDIxCi0tICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLS0gICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMQotLSAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEzCi0tICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLS0gICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNwotLSAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCi0tICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLS0gICAgIGdzYXNsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAgOQotLSAgICAgZ3NzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICBnc3QtcGx1Z2lucy1iYWQgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTMKLS0gICAgIGdzdC1wbHVnaW5zLWJhc2UgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQotLSAgICAgZ3N0LXBsdWdpbnMtZ29vZCAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgW10gICAgW10gICAgICB8IDE2Ci0tICAgICBnc3QtcGx1Z2lucy11Z2x5ICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTMKLS0gICAgIGdzdHJlYW1lciAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOAotLSAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICBndGthbSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKLS0gICAgIGd0a29ycGhhbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNwotLSAgICAgZ3Rrc3BlbGwgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICBbXSAgICAgW10gICAgW10gICAgW10gICAgICB8IDI3Ci0tICAgICBndXRlbnByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLS0gICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAzOAotLSAgICAgaGVycmllICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4Ci0tICAgICBoeWxhZmF4ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLS0gICAgIGlkdXRpbHMgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNQotLSAgICAgaW5kZW50ICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDI4Ci0tICAgICBpc29fMTU5MjQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgIDQKLS0gICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgIFtdIFtdIFtdIFtdICAgICBbXSAgW10gICAgIFtdICAgIFtdICAgIFtdICAgICAgfCA1NAotLSAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8ICA0Ci0tICAgICBpc29fNDIxNyAgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICBbXSAgICAgICAgICAgIHwgMjQKLS0gICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgW10gICAgIFtdICAgIFtdICAgICAgICAgICAgfCAyNgotLSAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLS0gICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMwotLSAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEzCi0tICAgICBrZXl0b3VjaCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLS0gICAgIGtleXRvdWNoLWVkaXRvciAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotLSAgICAga2V5dG91Y2gta2V5Ym9hLi4uIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0tICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLS0gICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxMAotLSAgICAgbGVhZnBhZCAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDI0Ci0tICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMTkKLS0gICAgIGxpYmV4aWYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotLSAgICAgbGliZXh0cmFjdG9yICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0tICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjAKLS0gICAgIGxpYmdwZy1lcnJvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotLSAgICAgbGliZ3Bob3RvMiAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5Ci0tICAgICBsaWJncGhvdG8yX3BvcnQgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTEKLS0gICAgIGxpYmdzYXNsICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOAotLSAgICAgbGliaWNvbnYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCi0tICAgICBsaWJpZG4gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTEKLS0gICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAotLSAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0tICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLS0gICAgIGxwcm5nICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgotLSAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1Ci0tICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMTgKLS0gICAgIG1haWxmcm9tZCAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotLSAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4Ci0tICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjAKLS0gICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQotLSAgICAgbWluaWNvbSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0Ci0tICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjAKLS0gICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAotLSAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDExCi0tICAgICBwaWxvdC1xb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKLS0gICAgIHBvcHQgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOAotLSAgICAgcHNtaXNjICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDEwCi0tICAgICBwd2R1dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLS0gICAgIHFvZiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAotLSAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjUKLS0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMwotLSAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCi0tICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMjYKLS0gICAgIHNlZCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMwotLSAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDI5Ci0tICAgICBzaGFydXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMjMKLS0gICAgIHNoaXNoaSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotLSAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0tICAgICBzb2xmZWdlICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLS0gICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQotLSAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0tICAgICBzeXN0ZW0tdG9vbHMtYmEuLi4gfCAgICBbXSAgICBbXSBbXSAgICAgW10gICAgIFtdICBbXSAgICAgICAgICBbXSAgICAgIHwgMzgKLS0gICAgIHRhciAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNwotLSAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDE1Ci0tICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKLS0gICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgIFtdICAgICAgfCAxOQotLSAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCi0tICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLS0gICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAotLSAgICAgdXRpbC1saW51eC1uZyAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIwCi0tICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLS0gICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQotLSAgICAgd2RpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIzCi0tICAgICB3Z2V0ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMjAKLS0gICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyOQotLSAgICAgeGtleWJvYXJkLWNvbmZpZyAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0Ci0tICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMTUKLS0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLSAgICAgICA3NiB0ZWFtcyAgICAgICAgICAgdGcgdGggdGsgdHIgdWsgdmVuIHZpICB3YSB4aCB6aF9DTiB6aF9ISyB6aF9UVyB6dQotLSAgICAgIDE2MyBkb21haW5zICAgICAgICAgIDAgIDMgIDEgNzQgNTEgIDAgIDE0MyAyMSAgMSAgNTcgICAgIDcgICAgNDUgICAgMCAgMjAzNgotLQotLSAgIFNvbWUgY291bnRlcnMgaW4gdGhlIHByZWNlZGluZyBtYXRyaXggYXJlIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YKLS12aXNpYmxlIGJsb2NrcyBsZXQgdXMgZXhwZWN0LiAgVGhpcyBpcyBiZWNhdXNlIGEgZmV3IGV4dHJhIFBPIGZpbGVzIGFyZQotLXVzZWQgZm9yIGltcGxlbWVudGluZyByZWdpb25hbCB2YXJpYW50cyBvZiBsYW5ndWFnZXMsIG9yIGxhbmd1YWdlCi0tZGlhbGVjdHMuCi0tCi0tICAgRm9yIGEgUE8gZmlsZSBpbiB0aGUgbWF0cml4IGFib3ZlIHRvIGJlIGVmZmVjdGl2ZSwgdGhlIHBhY2thZ2UgdG8KLS13aGljaCBpdCBhcHBsaWVzIHNob3VsZCBhbHNvIGhhdmUgYmVlbiBpbnRlcm5hdGlvbmFsaXplZCBhbmQKLS1kaXN0cmlidXRlZCBhcyBzdWNoIGJ5IGl0cyBtYWludGFpbmVyLiAgVGhlcmUgbWlnaHQgYmUgYW4gb2JzZXJ2YWJsZQotLWxhZyBiZXR3ZWVuIHRoZSBtZXJlIGV4aXN0ZW5jZSBhIFBPIGZpbGUgYW5kIGl0cyB3aWRlIGF2YWlsYWJpbGl0eSBpbiBhCi0tZGlzdHJpYnV0aW9uLgotLQotLSAgIElmIE5vdmVtYmVyIDIwMDcgc2VlbXMgdG8gYmUgb2xkLCB5b3UgbWF5IGZldGNoIGEgbW9yZSByZWNlbnQgY29weQotLW9mIHRoaXMgYEFCT1VULU5MUycgZmlsZSBvbiBtb3N0IEdOVSBhcmNoaXZlIHNpdGVzLiAgVGhlIG1vc3QKLS11cC10by1kYXRlIG1hdHJpeCB3aXRoIGZ1bGwgcGVyY2VudGFnZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBhdAotLWBodHRwOi8vdHJhbnNsYXRpb25wcm9qZWN0Lm9yZy9leHRyYS9tYXRyaXguaHRtbCcuCi0tCi0tMS42IFVzaW5nIGBnZXR0ZXh0JyBpbiBuZXcgcGFja2FnZXMKLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLQotLUlmIHlvdSBhcmUgd3JpdGluZyBhIGZyZWVseSBhdmFpbGFibGUgcHJvZ3JhbSBhbmQgd2FudCB0bwotLWludGVybmF0aW9uYWxpemUgaXQgeW91IGFyZSB3ZWxjb21lIHRvIHVzZSBHTlUgYGdldHRleHQnIGluIHlvdXIKLS1wYWNrYWdlLiAgT2YgY291cnNlIHlvdSBoYXZlIHRvIHJlc3BlY3QgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tTGljZW5zZSB3aGljaCBjb3ZlcnMgdGhlIHVzZSBvZiB0aGUgR05VIGBnZXR0ZXh0JyBsaWJyYXJ5LiAgVGhpcyBtZWFucwotLWluIHBhcnRpY3VsYXIgdGhhdCBldmVuIG5vbi1mcmVlIHByb2dyYW1zIGNhbiB1c2UgYGxpYmludGwnIGFzIGEgc2hhcmVkCi0tbGlicmFyeSwgd2hlcmVhcyBvbmx5IGZyZWUgc29mdHdhcmUgY2FuIHVzZSBgbGliaW50bCcgYXMgYSBzdGF0aWMKLS1saWJyYXJ5IG9yIHVzZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBgbGliaW50bCcuCi0tCi0tICAgT25jZSB0aGUgc291cmNlcyBhcmUgY2hhbmdlZCBhcHByb3ByaWF0ZWx5IGFuZCB0aGUgc2V0dXAgY2FuIGhhbmRsZQotLXRoZSB1c2Ugb2YgYGdldHRleHQnIHRoZSBvbmx5IHRoaW5nIG1pc3NpbmcgYXJlIHRoZSB0cmFuc2xhdGlvbnMuICBUaGUKLS1GcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgaXMgYWxzbyBhdmFpbGFibGUgZm9yIHBhY2thZ2VzIHdoaWNoIGFyZSBub3QKLS1kZXZlbG9wZWQgaW5zaWRlIHRoZSBHTlUgcHJvamVjdC4gIFRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gZ2l2ZW4gYWJvdmUKLS1hcHBsaWVzIGFsc28gZm9yIGV2ZXJ5IG90aGVyIEZyZWUgU29mdHdhcmUgUHJvamVjdC4gIENvbnRhY3QKLS1gY29vcmRpbmF0b3JAdHJhbnNsYXRpb25wcm9qZWN0Lm9yZycgdG8gbWFrZSB0aGUgYC5wb3QnIGZpbGVzIGF2YWlsYWJsZQotLXRvIHRoZSB0cmFuc2xhdGlvbiB0ZWFtcy4KLS0KLSs8aHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZXR0ZXh0L21hbnVhbC9odG1sX25vZGUvVXNlcnMuaHRtbD4KLS0tLSBhL0NoYW5nZUxvZwotKysrIGIvQ2hhbmdlTG9nCi1AQCAtMSwzICsxLDEwIEBACi0rMjAxOS0xMi0wNyAgZ2V0dGV4dGl6ZSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgotKwotKwkqIG00L2ludGxtYWNvc3gubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjIwLjEuCi0rCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBSZW1vdmUgaW50bC4KLSsJKiBjb25maWd1cmUuYWMgKEFDX0NPTkZJR19GSUxFUyk6IFJlbW92ZSBpbnRsL01ha2VmaWxlLgotKwkoQU1fR05VX0dFVFRFWFRfVkVSU0lPTik6IEJ1bXAgdG8gMC4yMC4KLSsKLSAyMDEzLTAzLTEzICBTdGV2ZSBMYW5nYXNlayAgPHN0ZXZlLmxhbmdhc2VrQHVidW50dS5jb20+Ci0gCi0gCSogbmloL3dhdGNoLmMgKG5paF93YXRjaF93YWxrX2ZpbHRlcik6IE5ldyBOaWhGaWxlRmlsdGVyIGZ1bmN0aW9uCi0tLS0gYS9NYWtlZmlsZS5hbQotKysrIGIvTWFrZWZpbGUuYW0KLUBAIC0xLDYgKzEsNiBAQAotICMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgotIAotLVNVQkRJUlMgPSBtNCBpbnRsIG5paCBuaWgtZGJ1cyBuaWgtZGJ1cy10b29sIHBvCi0rU1VCRElSUyA9IG00IG5paCBuaWgtZGJ1cyBuaWgtZGJ1cy10b29sIHBvCi0gCi0gRVhUUkFfRElTVCA9IEhBQ0tJTkcKLSAKLS0tLSBhL2NvbmZpZ3VyZS5hYwotKysrIGIvY29uZmlndXJlLmFjCi1AQCAtMTUsOCArMTUsOCBAQCBBTV9NQUlOVEFJTkVSX01PREUoW2VuYWJsZV0pCi0gTFRfUFJFUkVRKDIuMi40KQotIExUX0lOSVQKLSAKLS1BTV9HTlVfR0VUVEVYVF9WRVJTSU9OKFswLjE3XSkKLS1BTV9HTlVfR0VUVEVYVCgpCi0rQU1fR05VX0dFVFRFWFRfVkVSU0lPTihbMC4yMF0pCi0rQU1fR05VX0dFVFRFWFQoW2V4dGVybmFsXSkKLSAKLSAjIENoZWNrcyBmb3IgcHJvZ3JhbXMuCi0gQUNfUFJPR19DQwotQEAgLTU4LDcgKzU4LDcgQEAgQVNfSUYoW3Rlc3QgIiRjcm9zc19jb21waWxpbmciID0gInllcyJdLAotIAkgICAgICBBQ19TVUJTVChbTklIX0RCVVNfVE9PTF0sIFsiXCR7dG9wX2J1aWxkZGlyfS9uaWgtZGJ1cy10b29sL25paC1kYnVzLXRvb2wiXSldKV0sCi0gICAgICAgW0FDX1NVQlNUKFtOSUhfREJVU19UT09MXSwgWyJcJHt0b3BfYnVpbGRkaXJ9L25paC1kYnVzLXRvb2wvbmloLWRidXMtdG9vbCJdKV0pCi0gCi0tQUNfQ09ORklHX0ZJTEVTKFsgTWFrZWZpbGUgbTQvTWFrZWZpbGUgaW50bC9NYWtlZmlsZQotK0FDX0NPTkZJR19GSUxFUyhbIE1ha2VmaWxlIG00L01ha2VmaWxlCi0gCQkgIG5paC9NYWtlZmlsZSBuaWgvbGlibmloLnBjCi0gCQkgIG5paC1kYnVzL01ha2VmaWxlIG5paC1kYnVzL2xpYm5paC1kYnVzLnBjCi0gCQkgIG5paC1kYnVzLXRvb2wvTWFrZWZpbGUKLS0tLSBhL2ludGwvQ2hhbmdlTG9nCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0ICswLDAgQEAKLS0yMDA3LTExLTA3ICBHTlUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KLS0KLS0JKiBWZXJzaW9uIDAuMTcgcmVsZWFzZWQuCi0tCi0tLS0gYS9pbnRsL01ha2VmaWxlLmluCi0rKysgL2Rldi9udWxsCi1AQCAtMSw1ODcgKzAsMCBAQAotLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIG1lc3NhZ2UgY2F0YWxvZyBoYW5kbGluZyBsaWJyYXJ5IG9mIEdOVSBnZXR0ZXh0Ci0tIyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSMKLS0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tIyBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0jCi0tIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tIwotLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0jIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0jIFVTQS4KLS0KLS1QQUNLQUdFID0gQFBBQ0tBR0VACi0tVkVSU0lPTiA9IEBWRVJTSU9OQAotLQotLVNIRUxMID0gL2Jpbi9zaAotLQotLXNyY2RpciA9IEBzcmNkaXJACi0tdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotLXRvcF9idWlsZGRpciA9IC4uCi0tCi0tIyBUaGUgVlBBVEggdmFyaWFibGVzIGFsbG93cyBidWlsZHMgd2l0aCAkYnVpbGRkaXIgIT0gJHNyY2RpciwgYXNzdW1pbmcgYQotLSMgJ21ha2UnIHByb2dyYW0gdGhhdCBzdXBwb3J0cyBWUEFUSCAoc3VjaCBhcyBHTlUgbWFrZSkuIFRoaXMgbGluZSBpcyByZW1vdmVkCi0tIyBieSBhdXRvY29uZiBhdXRvbWF0aWNhbGx5IHdoZW4gIiQoc3JjZGlyKSIgPSAiLiIuCi0tIyBJbiB0aGlzIGRpcmVjdG9yeSwgdGhlIFZQQVRIIGhhbmRsaW5nIGlzIHBhcnRpY3VsYXI6Ci0tIyAxLiBJZiBJTlRMX0xJQlRPT0xfU1VGRklYX1BSRUZJWCBpcyAnbCcgKGluZGljYXRpbmcgYSBidWlsZCB3aXRoIGxpYnRvb2wpLAotLSMgICAgdGhlIC5jIC0+IC5sbyBydWxlcyBjYXJlZnVsbHkgdXNlICQoc3JjZGlyKSwgc28gdGhhdCBWUEFUSCBjYW4gYmUgb21pdHRlZC4KLS0jIDIuIElmIFBBQ0tBR0UgPSBnZXR0ZXh0LXRvb2xzLCBWUEFUSCBfbXVzdF8gYmUgb21pdHRlZCwgYmVjYXVzZSBvdGhlcndpc2UKLS0jICAgICdtYWtlJyBkb2VzIHRoZSB3cm9uZyB0aGluZyBpZiBHTlUgZ2V0dGV4dCB3YXMgY29uZmlndXJlZCB3aXRoCi0tIyAgICAiLi9jb25maWd1cmUgLS1zcmNkaXI9YHB3ZGAiLCBuYW1lbHkgaXQgZ2V0cyBjb25mdXNlZCBieSB0aGUgLmxvIGFuZCAubGEKLS0jICAgIGZpbGVzIGl0IGZpbmRzIGluIHNyY2RpciA9IC4uLy4uL2dldHRleHQtcnVudGltZS9pbnRsLgotLVZQQVRIID0gJChzcmNkaXIpCi0tCi0tcHJlZml4ID0gQHByZWZpeEAKLS1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLS10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLS1saWJkaXIgPSBAbGliZGlyQAotLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLS1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLS1kYXRhZGlyID0gQGRhdGFkaXJACi0tbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLS1nZXR0ZXh0c3JjZGlyID0gJChkYXRhZGlyKS9nZXR0ZXh0L2ludGwKLS1hbGlhc3BhdGggPSAkKGxvY2FsZWRpcikKLS1zdWJkaXIgPSBpbnRsCi0tCi0tSU5TVEFMTCA9IEBJTlNUQUxMQAotLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0tCi0tIyBXZSB1c2UgJChta2Rpcl9wKS4KLS0jIEluIGF1dG9tYWtlIDw9IDEuOS54LCAkKG1rZGlyX3ApIGlzIGRlZmluZWQgZWl0aGVyIGFzICJta2RpciAtcCAtLSIgb3IgYXMKLS0jICIkKG1raW5zdGFsbGRpcnMpIiBvciBhcyAiJChpbnN0YWxsX3NoKSAtZCIuIEZvciB0aGVzZSBhdXRvbWFrZSB2ZXJzaW9ucywKLS0jIEBpbnN0YWxsX3NoQCBkb2VzIG5vdCBzdGFydCB3aXRoICQoU0hFTEwpLCBzbyB3ZSBhZGQgaXQuCi0tIyBJbiBhdXRvbWFrZSA+PSAxLjEwLCBAbWtkaXJfcEAgaXMgZGVyaXZlZCBmcm9tICR7TUtESVJfUH0sIHdoaWNoIGlzIGRlZmluZWQKLS0jIGVpdGhlciBhcyAiL3BhdGgvdG8vbWtkaXIgLXAiIG9yICIuLi4vaW5zdGFsbC1zaCAtYyAtZCIuIEZvciB0aGVzZSBhdXRvbWFrZQotLSMgdmVyc2lvbnMsICQobWtpbnN0YWxsZGlycykgYW5kICQoaW5zdGFsbF9zaCkgYXJlIHVudXNlZC4KLS1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgQGluc3RhbGxfc2hAIC1kCi0taW5zdGFsbF9zaCA9ICQoU0hFTEwpIEBpbnN0YWxsX3NoQAotLU1LRElSX1AgPSBATUtESVJfUEAKLS1ta2Rpcl9wID0gQG1rZGlyX3BACi0tCi0tbCA9IEBJTlRMX0xJQlRPT0xfU1VGRklYX1BSRUZJWEAKLS0KLS1BUiA9IGFyCi0tQ0MgPSBAQ0NACi0tTElCVE9PTCA9IEBMSUJUT09MQAotLVJBTkxJQiA9IEBSQU5MSUJACi0tWUFDQyA9IEBJTlRMQklTT05AIC15IC1kCi0tWUZMQUdTID0gLS1uYW1lLXByZWZpeD1fX2dldHRleHQKLS1XSU5EUkVTID0gQFdJTkRSRVNACi0tCi0tIyAtREJVSUxESU5HX0xJQklOVEw6IENoYW5nZSBleHBhbnNpb24gb2YgTElCSU5UTF9ETExfRVhQT1JURUQgbWFjcm8uCi0tIyAtREJVSUxESU5HX0RMTDogQ2hhbmdlIGV4cGFuc2lvbiBvZiBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgbWFjcm8uCi0tREVGUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLURMT0NBTEVfQUxJQVNfUEFUSD1cIiQoYWxpYXNwYXRoKVwiIFwKLS0tRExJQkRJUj1cIiQobGliZGlyKVwiIC1EQlVJTERJTkdfTElCSU5UTCAtREJVSUxESU5HX0RMTCAtRElOX0xJQklOVEwgXAotLS1ERU5BQkxFX1JFTE9DQVRBQkxFPTEgLURJTl9MSUJSQVJZIC1ESU5TVEFMTERJUj1cIiQobGliZGlyKVwiIC1ETk9fWE1BTExPQyBcCi0tLURzZXRfcmVsb2NhdGlvbl9wcmVmaXg9bGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggXAotLS1EcmVsb2NhdGU9bGliaW50bF9yZWxvY2F0ZSBcCi0tLURERVBFTkRTX09OX0xJQklDT05WPTEgQERFRlNACi0tQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0tQ0ZMQUdTID0gQENGTEFHU0AgQENGTEFHX1ZJU0lCSUxJVFlACi0tTERGTEFHUyA9IEBMREZMQUdTQCAkKExERkxBR1NfQFdPRTMyRExMQCkKLS1MREZMQUdTX3llcyA9IC1XbCwtLWV4cG9ydC1hbGwtc3ltYm9scwotLUxERkxBR1Nfbm8gPQotLUxJQlMgPSBATElCU0AKLS0KLS1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotLQotLUhFQURFUlMgPSBcCi0tICBnbW8uaCBcCi0tICBnZXR0ZXh0UC5oIFwKLS0gIGhhc2gtc3RyaW5nLmggXAotLSAgbG9hZGluZm8uaCBcCi0tICBwbHVyYWwtZXhwLmggXAotLSAgZXZhbC1wbHVyYWwuaCBcCi0tICBsb2NhbGNoYXJzZXQuaCBcCi0tICBsb2NrLmggXAotLSAgcmVsb2NhdGFibGUuaCBcCi0tICB0c2VhcmNoLmggdHNlYXJjaC5jIFwKLS0gIHhzaXplLmggXAotLSAgcHJpbnRmLWFyZ3MuaCBwcmludGYtYXJncy5jIFwKLS0gIHByaW50Zi1wYXJzZS5oIHdwcmludGYtcGFyc2UuaCBwcmludGYtcGFyc2UuYyBcCi0tICB2YXNucHJpbnRmLmggdmFzbndwcmludGYuaCB2YXNucHJpbnRmLmMgXAotLSAgb3MyY29tcGF0LmggXAotLSAgbGliZ251aW50bC5oLmluCi0tU09VUkNFUyA9IFwKLS0gIGJpbmR0ZXh0ZG9tLmMgXAotLSAgZGNnZXR0ZXh0LmMgXAotLSAgZGdldHRleHQuYyBcCi0tICBnZXR0ZXh0LmMgXAotLSAgZmluZGRvbWFpbi5jIFwKLS0gIGhhc2gtc3RyaW5nLmMgXAotLSAgbG9hZG1zZ2NhdC5jIFwKLS0gIGxvY2FsZWFsaWFzLmMgXAotLSAgdGV4dGRvbWFpbi5jIFwKLS0gIGwxMG5mbGlzdC5jIFwKLS0gIGV4cGxvZGVuYW1lLmMgXAotLSAgZGNpZ2V0dGV4dC5jIFwKLS0gIGRjbmdldHRleHQuYyBcCi0tICBkbmdldHRleHQuYyBcCi0tICBuZ2V0dGV4dC5jIFwKLS0gIHBsdXJhbC55IFwKLS0gIHBsdXJhbC1leHAuYyBcCi0tICBsb2NhbGNoYXJzZXQuYyBcCi0tICBsb2NrLmMgXAotLSAgcmVsb2NhdGFibGUuYyBcCi0tICBsYW5ncHJlZnMuYyBcCi0tICBsb2NhbGVuYW1lLmMgXAotLSAgbG9nLmMgXAotLSAgcHJpbnRmLmMgXAotLSAgdmVyc2lvbi5jIFwKLS0gIG9zZGVwLmMgXAotLSAgb3MyY29tcGF0LmMgXAotLSAgaW50bC1leHBvcnRzLmMgXAotLSAgaW50bC1jb21wYXQuYwotLU9CSkVDVFMgPSBcCi0tICBiaW5kdGV4dGRvbS4kbG8gXAotLSAgZGNnZXR0ZXh0LiRsbyBcCi0tICBkZ2V0dGV4dC4kbG8gXAotLSAgZ2V0dGV4dC4kbG8gXAotLSAgZmluZGRvbWFpbi4kbG8gXAotLSAgaGFzaC1zdHJpbmcuJGxvIFwKLS0gIGxvYWRtc2djYXQuJGxvIFwKLS0gIGxvY2FsZWFsaWFzLiRsbyBcCi0tICB0ZXh0ZG9tYWluLiRsbyBcCi0tICBsMTBuZmxpc3QuJGxvIFwKLS0gIGV4cGxvZGVuYW1lLiRsbyBcCi0tICBkY2lnZXR0ZXh0LiRsbyBcCi0tICBkY25nZXR0ZXh0LiRsbyBcCi0tICBkbmdldHRleHQuJGxvIFwKLS0gIG5nZXR0ZXh0LiRsbyBcCi0tICBwbHVyYWwuJGxvIFwKLS0gIHBsdXJhbC1leHAuJGxvIFwKLS0gIGxvY2FsY2hhcnNldC4kbG8gXAotLSAgbG9jay4kbG8gXAotLSAgcmVsb2NhdGFibGUuJGxvIFwKLS0gIGxhbmdwcmVmcy4kbG8gXAotLSAgbG9jYWxlbmFtZS4kbG8gXAotLSAgbG9nLiRsbyBcCi0tICBwcmludGYuJGxvIFwKLS0gIHZlcnNpb24uJGxvIFwKLS0gIG9zZGVwLiRsbyBcCi0tICBpbnRsLWNvbXBhdC4kbG8KLS1PQkpFQ1RTX1JFU195ZXMgPSBsaWJpbnRsLnJlcwotLU9CSkVDVFNfUkVTX25vID0KLS1ESVNURklMRVMuY29tbW9uID0gTWFrZWZpbGUuaW4gXAotLWNvbmZpZy5jaGFyc2V0IGxvY2FsZS5hbGlhcyByZWYtYWRkLnNpbiByZWYtZGVsLnNpbiBleHBvcnQuaCBsaWJpbnRsLnJjIFwKLS0kKEhFQURFUlMpICQoU09VUkNFUykKLS1ESVNURklMRVMuZ2VuZXJhdGVkID0gcGx1cmFsLmMKLS1ESVNURklMRVMubm9ybWFsID0gVkVSU0lPTgotLURJU1RGSUxFUy5nZXR0ZXh0ID0gQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSBsaWJpbnRsLmdsaWJjIFJFQURNRS53b2UzMgotLURJU1RGSUxFUy5vYnNvbGV0ZSA9IHhvcGVuLW1zZy5zZWQgbGludXgtbXNnLnNlZCBwbzJ0Ymwuc2VkLmluIGNhdC1jb21wYXQuYyBcCi0tQ09QWUlORy5MSUItMiBnZXR0ZXh0LmggbGliZ2V0dGV4dC5oIHBsdXJhbC1ldmFsLmMgbGliZ251aW50bC5oIFwKLS1saWJnbnVpbnRsLmhfdm1zIE1ha2VmaWxlLnZtcyBsaWJnbnVpbnRsLmgubXN2Yy1zdGF0aWMgXAotLWxpYmdudWludGwuaC5tc3ZjLXNoYXJlZCBNYWtlZmlsZS5tc3ZjCi0tCi0tYWxsOiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotLWFsbC15ZXM6IGxpYmludGwuJGxhIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCi0tYWxsLW5vOiBhbGwtbm8tQEJVSUxEX0lOQ0xVREVEX0xJQklOVExACi0tYWxsLW5vLXllczogbGliZ251aW50bC4kbGEKLS1hbGwtbm8tbm86Ci0tCi0tbGliaW50bC5hIGxpYmdudWludGwuYTogJChPQkpFQ1RTKQotLQlybSAtZiAkQAotLQkkKEFSKSBjcnUgJEAgJChPQkpFQ1RTKQotLQkkKFJBTkxJQikgJEAKLS0KLS1saWJpbnRsLmxhIGxpYmdudWludGwubGE6ICQoT0JKRUNUUykgJChPQkpFQ1RTX1JFU19AV09FMzJAKQotLQkkKExJQlRPT0wpIC0tbW9kZT1saW5rIFwKLS0JICAkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIFwKLS0JICAkKE9CSkVDVFMpIEBMVExJQklDT05WQCBASU5UTF9NQUNPU1hfTElCU0AgJChMSUJTKSBATFRMSUJUSFJFQURAIEBMVExJQkNAIFwKLS0JICAkKE9CSkVDVFNfUkVTX0BXT0UzMkApIFwKLS0JICAtdmVyc2lvbi1pbmZvICQoTFRWX0NVUlJFTlQpOiQoTFRWX1JFVklTSU9OKTokKExUVl9BR0UpIFwKLS0JICAtcnBhdGggJChsaWJkaXIpIFwKLS0JICAtbm8tdW5kZWZpbmVkCi0tCi0tIyBMaWJ0b29sJ3MgbGlicmFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBsaWJpbnRsLgotLSMgQmVmb3JlIG1ha2luZyBhIGdldHRleHQgcmVsZWFzZSwgdGhlIGdldHRleHQgbWFpbnRhaW5lciBtdXN0IGNoYW5nZSB0aGlzCi0tIyBhY2NvcmRpbmcgdG8gdGhlIGxpYnRvb2wgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAiTGlicmFyeSBpbnRlcmZhY2UgdmVyc2lvbnMiLgotLSMgTWFpbnRhaW5lcnMgb2Ygb3RoZXIgcGFja2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBpbnRsIGRpcmVjdG9yeSBtdXN0ICpub3QqCi0tIyBjaGFuZ2UgdGhlc2UgdmFsdWVzLgotLUxUVl9DVVJSRU5UPTgKLS1MVFZfUkVWSVNJT049MgotLUxUVl9BR0U9MAotLQotLS5TVUZGSVhFUzoKLS0uU1VGRklYRVM6IC5jIC55IC5vIC5sbyAuc2luIC5zZWQKLS0KLS0uYy5vOgotLQkkKENPTVBJTEUpICQ8Ci0tCi0tLnkuYzoKLS0JJChZQUNDKSAkKFlGTEFHUykgLS1vdXRwdXQgJEAgJDwKLS0Jcm0gLWYgJCouaAotLQotLWJpbmR0ZXh0ZG9tLmxvOiAkKHNyY2RpcikvYmluZHRleHRkb20uYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2JpbmR0ZXh0ZG9tLmMKLS1kY2dldHRleHQubG86ICQoc3JjZGlyKS9kY2dldHRleHQuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjZ2V0dGV4dC5jCi0tZGdldHRleHQubG86ICQoc3JjZGlyKS9kZ2V0dGV4dC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGdldHRleHQuYwotLWdldHRleHQubG86ICQoc3JjZGlyKS9nZXR0ZXh0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9nZXR0ZXh0LmMKLS1maW5kZG9tYWluLmxvOiAkKHNyY2RpcikvZmluZGRvbWFpbi5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZmluZGRvbWFpbi5jCi0taGFzaC1zdHJpbmcubG86ICQoc3JjZGlyKS9oYXNoLXN0cmluZy5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvaGFzaC1zdHJpbmcuYwotLWxvYWRtc2djYXQubG86ICQoc3JjZGlyKS9sb2FkbXNnY2F0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2FkbXNnY2F0LmMKLS1sb2NhbGVhbGlhcy5sbzogJChzcmNkaXIpL2xvY2FsZWFsaWFzLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGVhbGlhcy5jCi0tdGV4dGRvbWFpbi5sbzogJChzcmNkaXIpL3RleHRkb21haW4uYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3RleHRkb21haW4uYwotLWwxMG5mbGlzdC5sbzogJChzcmNkaXIpL2wxMG5mbGlzdC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbDEwbmZsaXN0LmMKLS1leHBsb2RlbmFtZS5sbzogJChzcmNkaXIpL2V4cGxvZGVuYW1lLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9leHBsb2RlbmFtZS5jCi0tZGNpZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjaWdldHRleHQuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjaWdldHRleHQuYwotLWRjbmdldHRleHQubG86ICQoc3JjZGlyKS9kY25nZXR0ZXh0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY25nZXR0ZXh0LmMKLS1kbmdldHRleHQubG86ICQoc3JjZGlyKS9kbmdldHRleHQuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RuZ2V0dGV4dC5jCi0tbmdldHRleHQubG86ICQoc3JjZGlyKS9uZ2V0dGV4dC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbmdldHRleHQuYwotLXBsdXJhbC5sbzogJChzcmNkaXIpL3BsdXJhbC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcGx1cmFsLmMKLS1wbHVyYWwtZXhwLmxvOiAkKHNyY2RpcikvcGx1cmFsLWV4cC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcGx1cmFsLWV4cC5jCi0tbG9jYWxjaGFyc2V0LmxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGNoYXJzZXQuYwotLWxvY2subG86ICQoc3JjZGlyKS9sb2NrLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NrLmMKLS1yZWxvY2F0YWJsZS5sbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5jCi0tbGFuZ3ByZWZzLmxvOiAkKHNyY2RpcikvbGFuZ3ByZWZzLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sYW5ncHJlZnMuYwotLWxvY2FsZW5hbWUubG86ICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKLS1sb2cubG86ICQoc3JjZGlyKS9sb2cuYwotLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvZy5jCi0tcHJpbnRmLmxvOiAkKHNyY2RpcikvcHJpbnRmLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9wcmludGYuYwotLXZlcnNpb24ubG86ICQoc3JjZGlyKS92ZXJzaW9uLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS92ZXJzaW9uLmMKLS1vc2RlcC5sbzogJChzcmNkaXIpL29zZGVwLmMKLS0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9vc2RlcC5jCi0taW50bC1jb21wYXQubG86ICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCi0tCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvaW50bC1jb21wYXQuYwotLQotLSMgVGhpcyBydWxlIGlzIGV4ZWN1dGVkIG9ubHkgb24gV29lMzIgc3lzdGVtcy4KLS0jIFRoZSBmb2xsb3dpbmcgc2VkIGV4cHJlc3Npb25zIGNvbWUgZnJvbSB0aGUgd2luZHJlcy1vcHRpb25zIHNjcmlwdC4gVGhleSBhcmUKLS0jIGlubGluZWQgaGVyZSwgc28gdGhhdCB0aGV5IGNhbiBiZSB3cml0dGVuIGluIGEgTWFrZWZpbGUgd2l0aG91dCByZXF1aXJpbmcgYQotLSMgdGVtcG9yYXJ5IGZpbGUuIFRoZXkgbXVzdCBjb250YWluIGxpdGVyYWwgbmV3bGluZXMgcmF0aGVyIHRoYW4gc2VtaWNvbG9ucywKLS0jIHNvIHRoYXQgdGhleSB3b3JrIHdpdGggdGhlIHNlZC0zLjAyIHRoYXQgaXMgc2hpcHBlZCB3aXRoIE1TWVMuIFdlIGNhbiB1c2UKLS0jIEdOVSBiYXNoJ3MgJCdcbicgc3ludGF4IHRvIG9idGFpbiBzdWNoIGEgbmV3bGluZS4KLS1saWJpbnRsLnJlczogJChzcmNkaXIpL2xpYmludGwucmMKLS0Jbmw9JCQnXG4nOyBcCi0tCXNlZF9leHRyYWN0X21ham9yPScvXlswLTldL3snJCR7bmx9J3MvXlwoWzAtOV0qXCkuKi9cMS9wJyQke25sfXEkJHtubH0nfSckJHtubH0nY1wnJCR7bmx9MCQke25sfXE7IFwKLS0Jc2VkX2V4dHJhY3RfbWlub3I9Jy9eWzAtOV1bMC05XSpbLl1bMC05XS97JyQke25sfSdzL15bMC05XSpbLl1cKFswLTldKlwpLiovXDEvcCckJHtubH1xJCR7bmx9J30nJCR7bmx9J2NcJyQke25sfTAkJHtubH1xOyBcCi0tCXNlZF9leHRyYWN0X3N1Ym1pbm9yPScvXlswLTldWzAtOV0qWy5dWzAtOV1bMC05XSpbLl1bMC05XS97JyQke25sfSdzL15bMC05XSpbLl1bMC05XSpbLl1cKFswLTldKlwpLiovXDEvcCckJHtubH1xJCR7bmx9J30nJCR7bmx9J2NcJyQke25sfTAkJHtubH1xOyBcCi0tCSQoV0lORFJFUykgXAotLQkgICItRFBBQ0tBR0VfVkVSU0lPTl9TVFJJTkc9XFxcIiQoVkVSU0lPTilcXFwiIiBcCi0tCSAgIi1EUEFDS0FHRV9WRVJTSU9OX01BSk9SPSJgZWNobyAnJChWRVJTSU9OKScgfCBzZWQgLW4gLWUgIiQkc2VkX2V4dHJhY3RfbWFqb3IiYCBcCi0tCSAgIi1EUEFDS0FHRV9WRVJTSU9OX01JTk9SPSJgZWNobyAnJChWRVJTSU9OKScgfCBzZWQgLW4gLWUgIiQkc2VkX2V4dHJhY3RfbWlub3IiYCBcCi0tCSAgIi1EUEFDS0FHRV9WRVJTSU9OX1NVQk1JTk9SPSJgZWNobyAnJChWRVJTSU9OKScgfCBzZWQgLW4gLWUgIiQkc2VkX2V4dHJhY3Rfc3VibWlub3IiYCBcCi0tCSAgLWkgJChzcmNkaXIpL2xpYmludGwucmMgLW8gbGliaW50bC5yZXMgLS1vdXRwdXQtZm9ybWF0PWNvZmYKLS0KLS1yZWYtYWRkLnNlZDogJChzcmNkaXIpL3JlZi1hZGQuc2luCi0tCXNlZCAtZSAnL14jL2QnIC1lICdzL0AnJ1BBQ0tBR0UnJ0AvQFBBQ0tBR0VAL2cnICQoc3JjZGlyKS9yZWYtYWRkLnNpbiA+IHQtcmVmLWFkZC5zZWQKLS0JbXYgdC1yZWYtYWRkLnNlZCByZWYtYWRkLnNlZAotLXJlZi1kZWwuc2VkOiAkKHNyY2RpcikvcmVmLWRlbC5zaW4KLS0Jc2VkIC1lICcvXiMvZCcgLWUgJ3MvQCcnUEFDS0FHRScnQC9AUEFDS0FHRUAvZycgJChzcmNkaXIpL3JlZi1kZWwuc2luID4gdC1yZWYtZGVsLnNlZAotLQltdiB0LXJlZi1kZWwuc2VkIHJlZi1kZWwuc2VkCi0tCi0tSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkuLgotLQotLWxpYmdudWludGwuaDogJChzcmNkaXIpL2xpYmdudWludGwuaC5pbgotLQlzZWQgLWUgJy9JTl9MSUJHTE9DQUxFL2QnIFwKLS0JICAgIC1lICdzLEAnJ0hBVkVfUE9TSVhfUFJJTlRGJydALEBIQVZFX1BPU0lYX1BSSU5URkAsZycgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9BU1BSSU5URicnQCxASEFWRV9BU1BSSU5URkAsZycgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9TTlBSSU5URicnQCxASEFWRV9TTlBSSU5URkAsZycgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9XUFJJTlRGJydALEBIQVZFX1dQUklOVEZALGcnIFwKLS0JICA8ICQoc3JjZGlyKS9saWJnbnVpbnRsLmguaW4gXAotLQl8IGlmIHRlc3QgJ0BXT0UzMkRMTEAnID0geWVzOyB0aGVuIFwKLS0JICAgIHNlZCAtZSAncy9leHRlcm4gXChbXigpXSpcKTsvZXh0ZXJuIF9fZGVjbHNwZWMgKGRsbGltcG9ydCkgXDE7Lyc7IFwKLS0JICBlbHNlIFwKLS0JICAgIGNhdDsgXAotLQkgIGZpIFwKLS0JfCBzZWQgLWUgJ3MvZXh0ZXJuIFwoW14iXVwpL2V4dGVybiBMSUJJTlRMX0RMTF9FWFBPUlRFRCBcMS8nIFwKLS0JICAgICAgLWUgIi8jZGVmaW5lIF9MSUJJTlRMX0gvciAkKHNyY2RpcikvZXhwb3J0LmgiIFwKLS0JfCBzZWQgLWUgJ3MsQCcnSEFWRV9WSVNJQklMSVRZJydALEBIQVZFX1ZJU0lCSUxJVFlALGcnIFwKLS0JICA+IGxpYmdudWludGwuaAotLQotLWxpYmludGwuaDogJChzcmNkaXIpL2xpYmdudWludGwuaC5pbgotLQlzZWQgLWUgJy9JTl9MSUJHTE9DQUxFL2QnIFwKLS0JICAgIC1lICdzLEAnJ0hBVkVfUE9TSVhfUFJJTlRGJydALEBIQVZFX1BPU0lYX1BSSU5URkAsZycgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9BU1BSSU5URicnQCxASEFWRV9BU1BSSU5URkAsZycgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9TTlBSSU5URicnQCxASEFWRV9TTlBSSU5URkAsZycgXAotLQkgICAgLWUgJ3MsQCcnSEFWRV9XUFJJTlRGJydALEBIQVZFX1dQUklOVEZALGcnIFwKLS0JICA8ICQoc3JjZGlyKS9saWJnbnVpbnRsLmguaW4gPiBsaWJpbnRsLmgKLS0KLS1jaGFyc2V0LmFsaWFzOiAkKHNyY2RpcikvY29uZmlnLmNoYXJzZXQKLS0JJChTSEVMTCkgJChzcmNkaXIpL2NvbmZpZy5jaGFyc2V0ICdAaG9zdEAnID4gdC0kQAotLQltdiB0LSRAICRACi0tCi0tY2hlY2s6IGFsbAotLQotLSMgV2UgbXVzdCBub3QgaW5zdGFsbCB0aGUgbGliaW50bC5oL2xpYmludGwuYSBmaWxlcyBpZiB3ZSBhcmUgb24gYQotLSMgc3lzdGVtIHdoaWNoIGhhcyB0aGUgR05VIGdldHRleHQoKSBmdW5jdGlvbiBpbiBpdHMgQyBsaWJyYXJ5IG9yIGluIGEKLS0jIHNlcGFyYXRlIGxpYnJhcnkuCi0tIyBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uZSB3aGljaCBjb21lcyB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUKLS0jIHBhY2thZ2UsIHlvdSBoYXZlIHRvIHVzZSBgY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Jy4KLS1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi0taW5zdGFsbC1leGVjOiBhbGwKLS0JaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKLS0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotLQkgICQobWtkaXJfcCkgJChERVNURElSKSQobGliZGlyKSAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgXAotLQkgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLmggJChERVNURElSKSQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCi0tCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCi0tCSAgICAkKElOU1RBTExfREFUQSkgbGliaW50bC4kbGEgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLiRsYTsgXAotLQkgIGlmIHRlc3QgIkBSRUxPQ0FUQUJMRUAiID0geWVzOyB0aGVuIFwKLS0JICAgIGRlcGVuZGVuY2llcz1gc2VkIC1uIC1lICdzLF5kZXBlbmRlbmN5X2xpYnM9XCguKlwpLFwxLHAnIDwgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhIHwgc2VkIC1lICJzLF4nLCwiIC1lICJzLCdcJCQsLCJgOyBcCi0tCSAgICBpZiB0ZXN0IC1uICIkJGRlcGVuZGVuY2llcyI7IHRoZW4gXAotLQkgICAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwubGE7IFwKLS0JICAgIGZpOyBcCi0tCSAgZmk7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAotLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IG5vIFwKLS0JICAgJiYgdGVzdCBAR0xJQkMyQCAhPSBubzsgdGhlbiBcCi0tCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0tCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCi0tCSAgICAkKElOU1RBTExfREFUQSkgbGliZ251aW50bC4kbGEgJChERVNURElSKSQobGliZGlyKS9saWJnbnVpbnRsLiRsYTsgXAotLQkgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvcHJlbG9hZGFibGVfbGliaW50bC5zbzsgXAotLQkgICQoSU5TVEFMTF9EQVRBKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuc28gJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCi0tCSAgJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIFwKLS0JICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC4kbGE7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0JaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotLQkgIHRlc3QgQEdMSUJDMjFAICE9IG5vIHx8ICQobWtkaXJfcCkgJChERVNURElSKSQobGliZGlyKTsgXAotLQkgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKLS0JICBkZXN0PSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAotLQkgIGlmIHRlc3QgLWYgJChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyB0aGVuIFwKLS0JICAgIG9yaWc9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCi0tCSAgICBzZWQgLWYgcmVmLWFkZC5zZWQgJCRvcmlnID4gJCR0ZW1wOyBcCi0tCSAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotLQkgICAgcm0gLWYgJCR0ZW1wOyBcCi0tCSAgZWxzZSBcCi0tCSAgICBpZiB0ZXN0IEBHTElCQzIxQCA9IG5vOyB0aGVuIFwKLS0JICAgICAgb3JpZz1jaGFyc2V0LmFsaWFzOyBcCi0tCSAgICAgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKLS0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKLS0JICAgICAgcm0gLWYgJCR0ZW1wOyBcCi0tCSAgICBmaTsgXAotLQkgIGZpOyBcCi0tCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChsb2NhbGVkaXIpOyBcCi0tCSAgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhcyBcCi0tCSAgICAmJiBvcmlnPSQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzIFwKLS0JICAgIHx8IG9yaWc9JChzcmNkaXIpL2xvY2FsZS5hbGlhczsgXAotLQkgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAotLQkgIGRlc3Q9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXM7IFwKLS0JICBzZWQgLWYgcmVmLWFkZC5zZWQgJCRvcmlnID4gJCR0ZW1wOyBcCi0tCSAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKLS0JICBybSAtZiAkJHRlbXA7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS1pbnN0YWxsLWRhdGE6IGFsbAotLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0tCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKTsgXAotLQkgICQoSU5TVEFMTF9EQVRBKSBWRVJTSU9OICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpL1ZFUlNJT047IFwKLS0JICAkKElOU1RBTExfREFUQSkgQ2hhbmdlTG9nLmluc3QgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvQ2hhbmdlTG9nOyBcCi0tCSAgZGlzdHM9IkNPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgJChESVNURklMRVMuY29tbW9uKSI7IFwKLS0JICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0tCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSBcCi0tCQkJICAgICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotLQkgIGRvbmU7IFwKLS0JICBjaG1vZCBhK3ggJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvY29uZmlnLmNoYXJzZXQ7IFwKLS0JICBkaXN0cz0iJChESVNURklMRVMuZ2VuZXJhdGVkKSI7IFwKLS0JICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0tCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAotLQkgICAgJChJTlNUQUxMX0RBVEEpICQkZGlyLyQkZmlsZSBcCi0tCQkJICAgICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotLQkgIGRvbmU7IFwKLS0JICBkaXN0cz0iJChESVNURklMRVMub2Jzb2xldGUpIjsgXAotLQkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLS0JICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotLQkgIGRvbmU7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0KLS1pbnN0YWxsLXN0cmlwOiBpbnN0YWxsCi0tCi0taW5zdGFsbC1kdmkgaW5zdGFsbC1odG1sIGluc3RhbGwtaW5mbyBpbnN0YWxsLXBzIGluc3RhbGwtcGRmOgotLQotLWluc3RhbGxkaXJzOgotLQlpZiB7IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSIgfHwgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IH0gXAotLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0tCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCi0tCWVsc2UgXAotLQkgIDogOyBcCi0tCWZpCi0tCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiIFwKLS0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubyBcCi0tCSAgICYmIHRlc3QgQEdMSUJDMkAgIT0gbm87IHRoZW4gXAotLQkgICQobWtkaXJfcCkgJChERVNURElSKSQobGliZGlyKTsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLQlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0tCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0tCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChsb2NhbGVkaXIpOyBcCi0tCWVsc2UgXAotLQkgIDogOyBcCi0tCWZpCi0tCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLS0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCi0tCWVsc2UgXAotLQkgIDogOyBcCi0tCWZpCi0tCi0tIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotLWluc3RhbGxjaGVjazoKLS0KLS11bmluc3RhbGw6Ci0tCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCi0tCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKLS0JICBybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKLS0JICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAotLQkgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLiRsYTsgXAotLQllbHNlIFwKLS0JICA6IDsgXAotLQlmaQotLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCi0tCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm8gXAotLQkgICAmJiB0ZXN0IEBHTElCQzJAICE9IG5vOyB0aGVuIFwKLS0JICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0JaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotLQkgIGlmIHRlc3QgLWYgJChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyB0aGVuIFwKLS0JICAgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKLS0JICAgIGRlc3Q9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCi0tCSAgICBzZWQgLWYgcmVmLWRlbC5zZWQgJCRkZXN0ID4gJCR0ZW1wOyBcCi0tCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAotLQkgICAgICBybSAtZiAkJGRlc3Q7IFwKLS0JICAgIGVsc2UgXAotLQkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotLQkgICAgZmk7IFwKLS0JICAgIHJtIC1mICQkdGVtcDsgXAotLQkgIGZpOyBcCi0tCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgdGhlbiBcCi0tCSAgICB0ZW1wPSQoREVTVERJUikkKGxvY2FsZWRpcikvdC1sb2NhbGUuYWxpYXM7IFwKLS0JICAgIGRlc3Q9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXM7IFwKLS0JICAgIHNlZCAtZiByZWYtZGVsLnNlZCAkJGRlc3QgPiAkJHRlbXA7IFwKLS0JICAgIGlmIGdyZXAgJ14jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogJCQnICQkdGVtcCA+IC9kZXYvbnVsbDsgdGhlbiBcCi0tCSAgICAgIHJtIC1mICQkZGVzdDsgXAotLQkgICAgZWxzZSBcCi0tCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCi0tCSAgICBmaTsgXAotLQkgICAgcm0gLWYgJCR0ZW1wOyBcCi0tCSAgZmk7IFwKLS0JZWxzZSBcCi0tCSAgOiA7IFwKLS0JZmkKLS0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotLQkgIGZvciBmaWxlIGluIFZFUlNJT04gQ2hhbmdlTG9nIENPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpOyBkbyBcCi0tCSAgICBybSAtZiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLS0JICBkb25lOyBcCi0tCWVsc2UgXAotLQkgIDogOyBcCi0tCWZpCi0tCi0taW5mbyBkdmkgcHMgcGRmIGh0bWw6Ci0tCi0tJChPQkpFQ1RTKTogLi4vY29uZmlnLmggbGliZ251aW50bC5oCi0tYmluZHRleHRkb20uJGxvIGRjZ2V0dGV4dC4kbG8gZGNpZ2V0dGV4dC4kbG8gZGNuZ2V0dGV4dC4kbG8gZGdldHRleHQuJGxvIGRuZ2V0dGV4dC4kbG8gZmluZGRvbWFpbi4kbG8gZ2V0dGV4dC4kbG8gaW50bC1jb21wYXQuJGxvIGxvYWRtc2djYXQuJGxvIGxvY2FsZWFsaWFzLiRsbyBuZ2V0dGV4dC4kbG8gdGV4dGRvbWFpbi4kbG86ICQoc3JjZGlyKS9nZXR0ZXh0UC5oICQoc3JjZGlyKS9nbW8uaCAkKHNyY2RpcikvbG9hZGluZm8uaAotLWhhc2gtc3RyaW5nLiRsbyBkY2lnZXR0ZXh0LiRsbyBsb2FkbXNnY2F0LiRsbzogJChzcmNkaXIpL2hhc2gtc3RyaW5nLmgKLS1leHBsb2RlbmFtZS4kbG8gbDEwbmZsaXN0LiRsbzogJChzcmNkaXIpL2xvYWRpbmZvLmgKLS1kY2lnZXR0ZXh0LiRsbyBsb2FkbXNnY2F0LiRsbyBwbHVyYWwuJGxvIHBsdXJhbC1leHAuJGxvOiAkKHNyY2RpcikvcGx1cmFsLWV4cC5oCi0tZGNpZ2V0dGV4dC4kbG86ICQoc3JjZGlyKS9ldmFsLXBsdXJhbC5oCi0tbG9jYWxjaGFyc2V0LiRsbzogJChzcmNkaXIpL2xvY2FsY2hhcnNldC5oCi0tYmluZHRleHRkb20uJGxvIGRjaWdldHRleHQuJGxvIGZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvIGxvY2FsZWFsaWFzLiRsbyBsb2NrLiRsbyBsb2cuJGxvOiAkKHNyY2RpcikvbG9jay5oCi0tbG9jYWxlYWxpYXMuJGxvIGxvY2FsY2hhcnNldC4kbG8gcmVsb2NhdGFibGUuJGxvOiAkKHNyY2RpcikvcmVsb2NhdGFibGUuaAotLXByaW50Zi4kbG86ICQoc3JjZGlyKS9wcmludGYtYXJncy5oICQoc3JjZGlyKS9wcmludGYtYXJncy5jICQoc3JjZGlyKS9wcmludGYtcGFyc2UuaCAkKHNyY2Rpcikvd3ByaW50Zi1wYXJzZS5oICQoc3JjZGlyKS94c2l6ZS5oICQoc3JjZGlyKS9wcmludGYtcGFyc2UuYyAkKHNyY2RpcikvdmFzbnByaW50Zi5oICQoc3JjZGlyKS92YXNud3ByaW50Zi5oICQoc3JjZGlyKS92YXNucHJpbnRmLmMKLS0KLS0jIEEgYmlzb24tMi4xIGdlbmVyYXRlZCBwbHVyYWwuYyBpbmNsdWRlcyA8bGliaW50bC5oPiBpZiBFTkFCTEVfTkxTLgotLVBMVVJBTF9ERVBTX3llcyA9IGxpYmludGwuaAotLVBMVVJBTF9ERVBTX25vID0KLS1wbHVyYWwuJGxvOiAkKFBMVVJBTF9ERVBTX0BVU0VfSU5DTFVERURfTElCSU5UTEApCi0tCi0tdGFnczogVEFHUwotLQotLVRBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgZXRhZ3MgLW8gJCRoZXJlL1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0tCi0tY3RhZ3M6IENUQUdTCi0tCi0tQ1RBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgY3RhZ3MgLW8gJCRoZXJlL0NUQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQotLQotLWlkOiBJRAotLQotLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykKLS0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIG1raWQgLWYkJGhlcmUvSUQgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0tCi0tCi0tbW9zdGx5Y2xlYW46Ci0tCXJtIC1mICouYSAqLmxhICoubyAqLm9iaiAqLmxvIGxpYmludGwucmVzIGNvcmUgY29yZS4qCi0tCXJtIC1mIGxpYmdudWludGwuaCBsaWJpbnRsLmggY2hhcnNldC5hbGlhcyByZWYtYWRkLnNlZCByZWYtZGVsLnNlZAotLQlybSAtZiAtciAubGlicyBfbGlicwotLQotLWNsZWFuOiBtb3N0bHljbGVhbgotLQotLWRpc3RjbGVhbjogY2xlYW4KLS0Jcm0gLWYgTWFrZWZpbGUgSUQgVEFHUwotLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLS0JICBybSAtZiBDaGFuZ2VMb2cuaW5zdCAkKERJU1RGSUxFUy5ub3JtYWwpOyBcCi0tCWVsc2UgXAotLQkgIDogOyBcCi0tCWZpCi0tCi0tbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0tCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0tCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLS0KLS0KLS0jIEdOVSBnZXR0ZXh0IG5lZWRzIG5vdCBjb250YWluIHRoZSBmaWxlIGBWRVJTSU9OJyBidXQgY29udGFpbnMgc29tZQotLSMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KLS1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotLWRpc3QgZGlzdGRpcjogTWFrZWZpbGUKLS0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotLQkgIDogOyBcCi0tCWVsc2UgXAotLQkgIGlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSI7IHRoZW4gXAotLQkgICAgYWRkaXRpb25hbD0iJChESVNURklMRVMuZ2V0dGV4dCkiOyBcCi0tCSAgZWxzZSBcCi0tCSAgICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5ub3JtYWwpIjsgXAotLQkgIGZpOyBcCi0tCSAgJChNQUtFKSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCkgJCRhZGRpdGlvbmFsOyBcCi0tCSAgZm9yIGZpbGUgaW4gQ2hhbmdlTG9nICQoRElTVEZJTEVTLmNvbW1vbikgJChESVNURklMRVMuZ2VuZXJhdGVkKSAkJGFkZGl0aW9uYWw7IGRvIFwKLS0JICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGRpcj0uOyBlbHNlIGRpcj0kKHNyY2Rpcik7IGZpOyBcCi0tCSAgICBjcCAtcCAkJGRpci8kJGZpbGUgJChkaXN0ZGlyKSB8fCB0ZXN0ICQkZmlsZSA9IE1ha2VmaWxlLmluIHx8IGV4aXQgMTsgXAotLQkgIGRvbmU7IFwKLS0JZmkKLS0KLS1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0tCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLS0jIFRoaXMgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsIGJ1dCBkb2Vzbid0IHdvcmsgYW55IG1vcmUgd2l0aCBhdXRvY29uZi0yLjU3LAotLSMgd2hlbiBBQ19DT05GSUdfRklMRVMoW2ludGwvTWFrZWZpbGU6c29tZWRpci9NYWtlZmlsZS5pbl0pIGlzIHVzZWQuCi0tIwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQAotLQotLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0tIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0tLk5PRVhQT1JUOgotLS0tIGEvaW50bC9WRVJTSU9OCi0rKysgL2Rldi9udWxsCi1AQCAtMSArMCwwIEBACi0tR05VIGdldHRleHQgbGlicmFyeSBmcm9tIGdldHRleHQtMC4xNwotLS0tIGEvaW50bC9iaW5kdGV4dGRvbS5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwzNDAgKzAsMCBAQAotLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMsIDIwMDUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotLSNlbmRpZgotLQotLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayBfX2xpYmNfcndsb2NrX3dybG9jawotLSMgZGVmaW5lIGdsX3J3bG9ja191bmxvY2sgX19saWJjX3J3bG9ja191bmxvY2sKLS0jZWxzZQotLSMgaW5jbHVkZSAibG9jay5oIgotLSNlbmRpZgotLQotLS8qIFNvbWUgY29tcGlsZXJzLCBsaWtlIFN1bk9TNCBjYywgZG9uJ3QgaGF2ZSBvZmZzZXRvZiBpbiA8c3RkZGVmLmg+LiAgKi8KLS0jaWZuZGVmIG9mZnNldG9mCi0tIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSxpZGVudCkgKChzaXplX3QpJigoKHR5cGUqKTApLT5pZGVudCkpCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLwotLWdsX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKLS0KLS0KLS0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0tICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgQklORFRFWFRET01BSU4gX19iaW5kdGV4dGRvbWFpbgotLSMgZGVmaW5lIEJJTkRfVEVYVERPTUFJTl9DT0RFU0VUIF9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKLS0jIGlmbmRlZiBzdHJkdXAKLS0jICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLS0jIGVuZGlmCi0tI2Vsc2UKLS0jIGRlZmluZSBCSU5EVEVYVERPTUFJTiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCi0tIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAotLSNlbmRpZgotLQotLS8qIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IG5hbWUgKkRJUk5BTUVQIGFuZCB0aGUgb3V0cHV0IGNvZGVzZXQgKkNPREVTRVRQCi0tICAgdG8gYmUgdXNlZCBmb3IgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nLgotLSAgIElmICpESVJOQU1FUCBvciAqQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5vdAotLSAgIG1vZGlmaWVkLCBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIGlzIHJldHVybmVkLgotLSAgIElmIERJUk5BTUVQIG9yIENPREVTRVRQIGlzIE5VTEwsIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBpcyBuZWl0aGVyCi0tICAgbW9kaWZpZWQgbm9yIHJldHVybmVkLiAgKi8KLS1zdGF0aWMgdm9pZAotLXNldF9iaW5kaW5nX3ZhbHVlcyAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKLS0JCSAgICBjb25zdCBjaGFyICoqZGlybmFtZXAsIGNvbnN0IGNoYXIgKipjb2Rlc2V0cCkKLS17Ci0tICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKLS0gIGludCBtb2RpZmllZDsKLS0KLS0gIC8qIFNvbWUgc2FuaXR5IGNoZWNrcy4gICovCi0tICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMIHx8IGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKLS0gICAgewotLSAgICAgIGlmIChkaXJuYW1lcCkKLS0JKmRpcm5hbWVwID0gTlVMTDsKLS0gICAgICBpZiAoY29kZXNldHApCi0tCSpjb2Rlc2V0cCA9IE5VTEw7Ci0tICAgICAgcmV0dXJuOwotLSAgICB9Ci0tCi0tICBnbF9yd2xvY2tfd3Jsb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0tCi0tICBtb2RpZmllZCA9IDA7Ci0tCi0tICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotLSAgICB7Ci0tICAgICAgaW50IGNvbXBhcmUgPSBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPmRvbWFpbm5hbWUpOwotLSAgICAgIGlmIChjb21wYXJlID09IDApCi0tCS8qIFdlIGZvdW5kIGl0ISAgKi8KLS0JYnJlYWs7Ci0tICAgICAgaWYgKGNvbXBhcmUgPCAwKQotLQl7Ci0tCSAgLyogSXQgaXMgbm90IGluIHRoZSBsaXN0LiAgKi8KLS0JICBiaW5kaW5nID0gTlVMTDsKLS0JICBicmVhazsKLS0JfQotLSAgICB9Ci0tCi0tICBpZiAoYmluZGluZyAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgaWYgKGRpcm5hbWVwKQotLQl7Ci0tCSAgY29uc3QgY2hhciAqZGlybmFtZSA9ICpkaXJuYW1lcDsKLS0KLS0JICBpZiAoZGlybmFtZSA9PSBOVUxMKQotLQkgICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLwotLQkgICAgKmRpcm5hbWVwID0gYmluZGluZy0+ZGlybmFtZTsKLS0JICBlbHNlCi0tCSAgICB7Ci0tCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKLS0JCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCi0tCQkgb2xkIGJpbmRpbmcuICAqLwotLQkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5kaXJuYW1lOwotLQkgICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCByZXN1bHQpICE9IDApCi0tCQl7Ci0tCQkgIGlmIChzdHJjbXAgKGRpcm5hbWUsIF9ubF9kZWZhdWx0X2Rpcm5hbWUpID09IDApCi0tCQkgICAgcmVzdWx0ID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLS0JCSAgZWxzZQotLQkJICAgIHsKLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0tCQkgICAgICByZXN1bHQgPSBzdHJkdXAgKGRpcm5hbWUpOwotLSNlbHNlCi0tCQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0tCQkgICAgICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0tCQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQotLQkJCW1lbWNweSAocmVzdWx0LCBkaXJuYW1lLCBsZW4pOwotLSNlbmRpZgotLQkJICAgIH0KLS0KLS0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKLS0JCSAgICB7Ci0tCQkgICAgICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBfbmxfZGVmYXVsdF9kaXJuYW1lKQotLQkJCWZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOwotLQotLQkJICAgICAgYmluZGluZy0+ZGlybmFtZSA9IHJlc3VsdDsKLS0JCSAgICAgIG1vZGlmaWVkID0gMTsKLS0JCSAgICB9Ci0tCQl9Ci0tCSAgICAgICpkaXJuYW1lcCA9IHJlc3VsdDsKLS0JICAgIH0KLS0JfQotLQotLSAgICAgIGlmIChjb2Rlc2V0cCkKLS0JewotLQkgIGNvbnN0IGNoYXIgKmNvZGVzZXQgPSAqY29kZXNldHA7Ci0tCi0tCSAgaWYgKGNvZGVzZXQgPT0gTlVMTCkKLS0JICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KLS0JICAgICpjb2Rlc2V0cCA9IGJpbmRpbmctPmNvZGVzZXQ7Ci0tCSAgZWxzZQotLQkgICAgewotLQkgICAgICAvKiBUaGUgZG9tYWluIGlzIGFscmVhZHkgYm91bmQuICBJZiB0aGUgbmV3IHZhbHVlIGFuZCB0aGUgb2xkCi0tCQkgb25lIGFyZSBlcXVhbCB3ZSBzaW1wbHkgZG8gbm90aGluZy4gIE90aGVyd2lzZSByZXBsYWNlIHRoZQotLQkJIG9sZCBiaW5kaW5nLiAgKi8KLS0JICAgICAgY2hhciAqcmVzdWx0ID0gYmluZGluZy0+Y29kZXNldDsKLS0JICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8IHN0cmNtcCAoY29kZXNldCwgcmVzdWx0KSAhPSAwKQotLQkJewotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLS0JCSAgcmVzdWx0ID0gc3RyZHVwIChjb2Rlc2V0KTsKLS0jZWxzZQotLQkJICBzaXplX3QgbGVuID0gc3RybGVuIChjb2Rlc2V0KSArIDE7Ci0tCQkgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLS0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKLS0JCSAgICBtZW1jcHkgKHJlc3VsdCwgY29kZXNldCwgbGVuKTsKLS0jZW5kaWYKLS0KLS0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKLS0JCSAgICB7Ci0tCQkgICAgICBpZiAoYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQotLQkJCWZyZWUgKGJpbmRpbmctPmNvZGVzZXQpOwotLQotLQkJICAgICAgYmluZGluZy0+Y29kZXNldCA9IHJlc3VsdDsKLS0JCSAgICAgIG1vZGlmaWVkID0gMTsKLS0JCSAgICB9Ci0tCQl9Ci0tCSAgICAgICpjb2Rlc2V0cCA9IHJlc3VsdDsKLS0JICAgIH0KLS0JfQotLSAgICB9Ci0tICBlbHNlIGlmICgoZGlybmFtZXAgPT0gTlVMTCB8fCAqZGlybmFtZXAgPT0gTlVMTCkKLS0JICAgJiYgKGNvZGVzZXRwID09IE5VTEwgfHwgKmNvZGVzZXRwID09IE5VTEwpKQotLSAgICB7Ci0tICAgICAgLyogU2ltcGx5IHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotLSAgICAgIGlmIChkaXJuYW1lcCkKLS0JKmRpcm5hbWVwID0gX25sX2RlZmF1bHRfZGlybmFtZTsKLS0gICAgICBpZiAoY29kZXNldHApCi0tCSpjb2Rlc2V0cCA9IE5VTEw7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIC8qIFdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IGJpbmRpbmcuICAqLwotLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLS0gICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQotLQkoc3RydWN0IGJpbmRpbmcgKikgbWFsbG9jIChvZmZzZXRvZiAoc3RydWN0IGJpbmRpbmcsIGRvbWFpbm5hbWUpICsgbGVuKTsKLS0KLS0gICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3X2JpbmRpbmcgPT0gTlVMTCwgMCkpCi0tCWdvdG8gZmFpbGVkOwotLQotLSAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7Ci0tCi0tICAgICAgaWYgKGRpcm5hbWVwKQotLQl7Ci0tCSAgY29uc3QgY2hhciAqZGlybmFtZSA9ICpkaXJuYW1lcDsKLS0KLS0JICBpZiAoZGlybmFtZSA9PSBOVUxMKQotLQkgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUuICAqLwotLQkgICAgZGlybmFtZSA9IF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0tCSAgZWxzZQotLQkgICAgewotLQkgICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotLQkJZGlybmFtZSA9IF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0tCSAgICAgIGVsc2UKLS0JCXsKLS0JCSAgY2hhciAqcmVzdWx0OwotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLS0JCSAgcmVzdWx0ID0gc3RyZHVwIChkaXJuYW1lKTsKLS0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKLS0JCSAgICBnb3RvIGZhaWxlZF9kaXJuYW1lOwotLSNlbHNlCi0tCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLS0JCSAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQotLQkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7Ci0tCQkgIG1lbWNweSAocmVzdWx0LCBkaXJuYW1lLCBsZW4pOwotLSNlbmRpZgotLQkJICBkaXJuYW1lID0gcmVzdWx0OwotLQkJfQotLQkgICAgfQotLQkgICpkaXJuYW1lcCA9IGRpcm5hbWU7Ci0tCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBkaXJuYW1lOwotLQl9Ci0tICAgICAgZWxzZQotLQkvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCi0tCW5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLS0KLS0gICAgICBpZiAoY29kZXNldHApCi0tCXsKLS0JICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOwotLQotLQkgIGlmIChjb2Rlc2V0ICE9IE5VTEwpCi0tCSAgICB7Ci0tCSAgICAgIGNoYXIgKnJlc3VsdDsKLS0KLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0tCSAgICAgIHJlc3VsdCA9IHN0cmR1cCAoY29kZXNldCk7Ci0tCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCi0tCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OwotLSNlbHNlCi0tCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGNvZGVzZXQpICsgMTsKLS0JICAgICAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotLQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQotLQkJZ290byBmYWlsZWRfY29kZXNldDsKLS0JICAgICAgbWVtY3B5IChyZXN1bHQsIGNvZGVzZXQsIGxlbik7Ci0tI2VuZGlmCi0tCSAgICAgIGNvZGVzZXQgPSByZXN1bHQ7Ci0tCSAgICB9Ci0tCSAgKmNvZGVzZXRwID0gY29kZXNldDsKLS0JICBuZXdfYmluZGluZy0+Y29kZXNldCA9IChjaGFyICopIGNvZGVzZXQ7Ci0tCX0KLS0gICAgICBlbHNlCi0tCW5ld19iaW5kaW5nLT5jb2Rlc2V0ID0gTlVMTDsKLS0KLS0gICAgICAvKiBOb3cgZW5xdWV1ZSBpdC4gICovCi0tICAgICAgaWYgKF9ubF9kb21haW5fYmluZGluZ3MgPT0gTlVMTAotLQkgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RvbWFpbl9iaW5kaW5ncy0+ZG9tYWlubmFtZSkgPCAwKQotLQl7Ci0tCSAgbmV3X2JpbmRpbmctPm5leHQgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotLQkgIF9ubF9kb21haW5fYmluZGluZ3MgPSBuZXdfYmluZGluZzsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotLQkgIHdoaWxlIChiaW5kaW5nLT5uZXh0ICE9IE5VTEwKLS0JCSAmJiBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPm5leHQtPmRvbWFpbm5hbWUpID4gMCkKLS0JICAgIGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0OwotLQotLQkgIG5ld19iaW5kaW5nLT5uZXh0ID0gYmluZGluZy0+bmV4dDsKLS0JICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7Ci0tCX0KLS0KLS0gICAgICBtb2RpZmllZCA9IDE7Ci0tCi0tICAgICAgLyogSGVyZSB3ZSBkZWFsIHdpdGggbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMuICAqLwotLSAgICAgIGlmICgwKQotLQl7Ci0tCWZhaWxlZF9jb2Rlc2V0OgotLQkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSAhPSBfbmxfZGVmYXVsdF9kaXJuYW1lKQotLQkgICAgZnJlZSAobmV3X2JpbmRpbmctPmRpcm5hbWUpOwotLQlmYWlsZWRfZGlybmFtZToKLS0JICBmcmVlIChuZXdfYmluZGluZyk7Ci0tCWZhaWxlZDoKLS0JICBpZiAoZGlybmFtZXApCi0tCSAgICAqZGlybmFtZXAgPSBOVUxMOwotLQkgIGlmIChjb2Rlc2V0cCkKLS0JICAgICpjb2Rlc2V0cCA9IE5VTEw7Ci0tCX0KLS0gICAgfQotLQotLSAgLyogSWYgd2UgbW9kaWZpZWQgYW55IGJpbmRpbmcsIHdlIGZsdXNoIHRoZSBjYWNoZXMuICAqLwotLSAgaWYgKG1vZGlmaWVkKQotLSAgICArK19ubF9tc2dfY2F0X2NudHI7Ci0tCi0tICBnbF9yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0tfQotLQotLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLS1jaGFyICoKLS1CSU5EVEVYVERPTUFJTiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSkKLS17Ci0tICBzZXRfYmluZGluZ192YWx1ZXMgKGRvbWFpbm5hbWUsICZkaXJuYW1lLCBOVUxMKTsKLS0gIHJldHVybiAoY2hhciAqKSBkaXJuYW1lOwotLX0KLS0KLS0vKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCi0tICAgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSByZXR1cm5lZC4gICovCi0tY2hhciAqCi0tQklORF9URVhURE9NQUlOX0NPREVTRVQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmNvZGVzZXQpCi0tewotLSAgc2V0X2JpbmRpbmdfdmFsdWVzIChkb21haW5uYW1lLCBOVUxMLCAmY29kZXNldCk7Ci0tICByZXR1cm4gKGNoYXIgKikgY29kZXNldDsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXNlcyBmb3IgZnVuY3Rpb24gbmFtZXMgaW4gR05VIEMgTGlicmFyeS4gICovCi0td2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOwotLXdlYWtfYWxpYXMgKF9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQsIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KTsKLS0jZW5kaWYKLS0tLSBhL2ludGwvY29uZmlnLmNoYXJzZXQKLSsrKyAvZGV2L251bGwKLUBAIC0xLDY0MCArMCwwIEBACi0tIyEgL2Jpbi9zaAotLSMgT3V0cHV0IGEgc3lzdGVtIGRlcGVuZGVudCB0YWJsZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYWxpYXNlcy4KLS0jCi0tIyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSMKLS0jICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0jICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tIyAgIGFueSBsYXRlciB2ZXJzaW9uLgotLSMKLS0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLSMKLS0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0jICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSMgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tIyAgIFVTQS4KLS0jCi0tIyBUaGUgdGFibGUgY29uc2lzdHMgb2YgbGluZXMgb2YgdGhlIGZvcm0KLS0jICAgIEFMSUFTICBDQU5PTklDQUwKLS0jCi0tIyBBTElBUyBpcyB0aGUgKHN5c3RlbSBkZXBlbmRlbnQpIHJlc3VsdCBvZiAibmxfbGFuZ2luZm8gKENPREVTRVQpIi4KLS0jIEFMSUFTIGlzIGNvbXBhcmVkIGluIGEgY2FzZSBzZW5zaXRpdmUgd2F5LgotLSMKLS0jIENBTk9OSUNBTCBpcyB0aGUgR05VIGNhbm9uaWNhbCBuYW1lIGZvciB0aGlzIGNoYXJhY3RlciBlbmNvZGluZy4KLS0jIEl0IG11c3QgYmUgYW4gZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IGxpYmljb252LiBTdXBwb3J0IGJ5IEdOVSBsaWJjIGlzCi0tIyBhbHNvIGRlc2lyYWJsZS4gQ0FOT05JQ0FMIGlzIGNhc2UgaW5zZW5zaXRpdmUuIFVzdWFsbHkgYW4gdXBwZXIgY2FzZQotLSMgTUlNRSBjaGFyc2V0IG5hbWUgaXMgcHJlZmVycmVkLgotLSMgVGhlIGN1cnJlbnQgbGlzdCBvZiBHTlUgY2Fub25pY2FsIGNoYXJzZXQgbmFtZXMgaXMgYXMgZm9sbG93cy4KLS0jCi0tIyAgICAgICBuYW1lICAgICAgICAgICAgICBNSU1FPyAgICAgICAgICAgICB1c2VkIGJ5IHdoaWNoIHN5c3RlbXMKLS0jICAgQVNDSUksIEFOU0lfWDMuNC0xOTY4ICAgICAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIElTTy04ODU5LTEgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBJU08tODg1OS0yICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLS0jICAgSVNPLTg4NTktMyAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMKLS0jICAgSVNPLTg4NTktNCAgICAgICAgICAgICAgWSAgIG9zZiBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBJU08tODg1OS01ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLS0jICAgSVNPLTg4NTktNiAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IHNvbGFyaXMKLS0jICAgSVNPLTg4NTktNyAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgbmV0YnNkIGRhcndpbgotLSMgICBJU08tODg1OS04ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKLS0jICAgSVNPLTg4NTktOSAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZGFyd2luCi0tIyAgIElTTy04ODU5LTEzICAgICAgICAgICAgICAgICBnbGliYyBuZXRic2QgZGFyd2luCi0tIyAgIElTTy04ODU5LTE0ICAgICAgICAgICAgICAgICBnbGliYwotLSMgICBJU08tODg1OS0xNSAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCi0tIyAgIEtPSTgtUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBLT0k4LVUgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIEtPSTgtVCAgICAgICAgICAgICAgICAgICAgICBnbGliYwotLSMgICBDUDQzNyAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0tIyAgIENQNzc1ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1A4NTAgICAgICAgICAgICAgICAgICAgICAgIGFpeCBvc2YgZG9zCi0tIyAgIENQODUyICAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1A4NTUgICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDg1NiAgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0tIyAgIENQODU3ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1A4NjEgICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDg2MiAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0tIyAgIENQODY0ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1A4NjUgICAgICAgICAgICAgICAgICAgICAgIGRvcwotLSMgICBDUDg2NiAgICAgICAgICAgICAgICAgICAgICAgZnJlZWJzZCBuZXRic2QgZGFyd2luIGRvcwotLSMgICBDUDg2OSAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0tIyAgIENQODc0ICAgICAgICAgICAgICAgICAgICAgICB3b2UzMiBkb3MKLS0jICAgQ1A5MjIgICAgICAgICAgICAgICAgICAgICAgIGFpeAotLSMgICBDUDkzMiAgICAgICAgICAgICAgICAgICAgICAgYWl4IHdvZTMyIGRvcwotLSMgICBDUDk0MyAgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0tIyAgIENQOTQ5ICAgICAgICAgICAgICAgICAgICAgICBvc2Ygd29lMzIgZG9zCi0tIyAgIENQOTUwICAgICAgICAgICAgICAgICAgICAgICB3b2UzMiBkb3MKLS0jICAgQ1AxMDQ2ICAgICAgICAgICAgICAgICAgICAgIGFpeAotLSMgICBDUDExMjQgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0tIyAgIENQMTEyNSAgICAgICAgICAgICAgICAgICAgICBkb3MKLS0jICAgQ1AxMTI5ICAgICAgICAgICAgICAgICAgICAgIGFpeAotLSMgICBDUDEyNTAgICAgICAgICAgICAgICAgICAgICAgd29lMzIKLS0jICAgQ1AxMjUxICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMgbmV0YnNkIGRhcndpbiB3b2UzMgotLSMgICBDUDEyNTIgICAgICAgICAgICAgICAgICAgICAgYWl4IHdvZTMyCi0tIyAgIENQMTI1MyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotLSMgICBDUDEyNTQgICAgICAgICAgICAgICAgICAgICAgd29lMzIKLS0jICAgQ1AxMjU1ICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHdvZTMyCi0tIyAgIENQMTI1NiAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotLSMgICBDUDEyNTcgICAgICAgICAgICAgICAgICAgICAgd29lMzIKLS0jICAgR0IyMzEyICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggc29sYXJpcyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLS0jICAgRVVDLUpQICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIEVVQy1LUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBFVUMtVFcgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBuZXRic2QKLS0jICAgQklHNSAgICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotLSMgICBCSUc1LUhLU0NTICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcwotLSMgICBHQksgICAgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IG9zZiBzb2xhcmlzIHdvZTMyIGRvcwotLSMgICBHQjE4MDMwICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyBuZXRic2QKLS0jICAgU0hJRlRfSklTICAgICAgICAgICAgICAgWSAgIGhwdXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0tIyAgIEpPSEFCICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzIHdvZTMyCi0tIyAgIFRJUy02MjAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcwotLSMgICBWSVNDSUkgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMKLS0jICAgVENWTjU3MTItMSAgICAgICAgICAgICAgICAgIGdsaWJjCi0tIyAgIEdFT1JHSUFOLVBTICAgICAgICAgICAgICAgICBnbGliYwotLSMgICBIUC1ST01BTjggICAgICAgICAgICAgICAgICAgaHB1eAotLSMgICBIUC1BUkFCSUM4ICAgICAgICAgICAgICAgICAgaHB1eAotLSMgICBIUC1HUkVFSzggICAgICAgICAgICAgICAgICAgaHB1eAotLSMgICBIUC1IRUJSRVc4ICAgICAgICAgICAgICAgICAgaHB1eAotLSMgICBIUC1UVVJLSVNIOCAgICAgICAgICAgICAgICAgaHB1eAotLSMgICBIUC1LQU5BOCAgICAgICAgICAgICAgICAgICAgaHB1eAotLSMgICBERUMtS0FOSkkgICAgICAgICAgICAgICAgICAgb3NmCi0tIyAgIERFQy1IQU5ZVSAgICAgICAgICAgICAgICAgICBvc2YKLS0jICAgVVRGLTggICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzIG5ldGJzZCBkYXJ3aW4KLS0jCi0tIyBOb3RlOiBOYW1lcyB3aGljaCBhcmUgbm90IG1hcmtlZCBhcyBiZWluZyBhIE1JTUUgbmFtZSBzaG91bGQgbm90IGJlIHVzZWQgaW4KLS0jIEludGVybmV0IHByb3RvY29scyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2UgKG1haWwsIG5ld3MsIGV0Yy4pLgotLSMKLS0jIE5vdGU6IEFTQ0lJIGFuZCBBTlNJX1gzLjQtMTk2OCBhcmUgc3lub255bW91cyBjYW5vbmljYWwgbmFtZXMuIEFwcGxpY2F0aW9ucwotLSMgbXVzdCB1bmRlcnN0YW5kIGJvdGggbmFtZXMgYW5kIHRyZWF0IHRoZW0gYXMgZXF1aXZhbGVudC4KLS0jCi0tIyBUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgZmlsZSBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3BlY2lmaWNhdGlvbiwKLS0jICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0tIyBvcgotLSMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0tCi0taG9zdD0iJDEiCi0tb3M9YGVjaG8gIiRob3N0IiB8IHNlZCAtZSAncy9eW14tXSotW14tXSotXCguKlwpJC9cMS8nYAotLWVjaG8gIiMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFsaWFzZXMsIgotLWVjaG8gIiMgc3VpdGFibGUgZm9yIG9wZXJhdGluZyBzeXN0ZW0gJyR7b3N9Jy4iCi0tZWNobyAiIyBJdCB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBjb25maWcuY2hhcnNldC4iCi0tIyBMaXN0IG9mIHJlZmVyZW5jZXMsIHVwZGF0ZWQgZHVyaW5nIGluc3RhbGxhdGlvbjoKLS1lY2hvICIjIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogIgotLWNhc2UgIiRvcyIgaW4KLS0gICAgbGludXgtZ251bGliYzEqKQotLQkjIExpbnV4IGxpYmM1IGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCi0tCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQotLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLS0JZWNobyAiQyBBU0NJSSIKLS0JZWNobyAiUE9TSVggQVNDSUkiCi0tCWZvciBsIGluIGFmIGFmX1pBIGNhIGNhX0VTIGRhIGRhX0RLIGRlIGRlX0FUIGRlX0JFIGRlX0NIIGRlX0RFIGRlX0xVIFwKLS0JICAgICAgICAgZW4gZW5fQVUgZW5fQlcgZW5fQ0EgZW5fREsgZW5fR0IgZW5fSUUgZW5fTlogZW5fVVMgZW5fWkEgXAotLQkgICAgICAgICBlbl9aVyBlcyBlc19BUiBlc19CTyBlc19DTCBlc19DTyBlc19ETyBlc19FQyBlc19FUyBlc19HVCBcCi0tCSAgICAgICAgIGVzX0hOIGVzX01YIGVzX1BBIGVzX1BFIGVzX1BZIGVzX1NWIGVzX1VTIGVzX1VZIGVzX1ZFIGV0IFwKLS0JICAgICAgICAgZXRfRUUgZXUgZXVfRVMgZmkgZmlfRkkgZm8gZm9fRk8gZnIgZnJfQkUgZnJfQ0EgZnJfQ0ggZnJfRlIgXAotLQkgICAgICAgICBmcl9MVSBnYSBnYV9JRSBnbCBnbF9FUyBpZCBpZF9JRCBpbiBpbl9JRCBpcyBpc19JUyBpdCBpdF9DSCBcCi0tCSAgICAgICAgIGl0X0lUIGtsIGtsX0dMIG5sIG5sX0JFIG5sX05MIG5vIG5vX05PIHB0IHB0X0JSIHB0X1BUIHN2IFwKLS0JICAgICAgICAgc3ZfRkkgc3ZfU0U7IGRvCi0tCSAgZWNobyAiJGwgSVNPLTg4NTktMSIKLS0JICBlY2hvICIkbC5pc28tODg1OS0xIElTTy04ODU5LTEiCi0tCSAgZWNobyAiJGwuaXNvLTg4NTktMTUgSVNPLTg4NTktMTUiCi0tCSAgZWNobyAiJGwuaXNvLTg4NTktMTVAZXVybyBJU08tODg1OS0xNSIKLS0JICBlY2hvICIkbEBldXJvIElTTy04ODU5LTE1IgotLQkgIGVjaG8gIiRsLmNwLTQzNyBDUDQzNyIKLS0JICBlY2hvICIkbC5jcC04NTAgQ1A4NTAiCi0tCSAgZWNobyAiJGwuY3AtMTI1MiBDUDEyNTIiCi0tCSAgZWNobyAiJGwuY3AtMTI1MkBldXJvIENQMTI1MiIKLS0JICAjZWNobyAiJGwuYXRhcmktc3QgQVRBUkktU1QiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZwotLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotLQkgIGVjaG8gIiRsLnV0Zi04QGV1cm8gVVRGLTgiCi0tCWRvbmUKLS0JZm9yIGwgaW4gY3MgY3NfQ1ogaHIgaHJfSFIgaHUgaHVfSFUgcGwgcGxfUEwgcm8gcm9fUk8gc2sgc2tfU0sgc2wgXAotLQkgICAgICAgICBzbF9TSSBzciBzcl9DUyBzcl9ZVTsgZG8KLS0JICBlY2hvICIkbCBJU08tODg1OS0yIgotLQkgIGVjaG8gIiRsLmlzby04ODU5LTIgSVNPLTg4NTktMiIKLS0JICBlY2hvICIkbC5jcC04NTIgQ1A4NTIiCi0tCSAgZWNobyAiJGwuY3AtMTI1MCBDUDEyNTAiCi0tCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0tCWRvbmUKLS0JZm9yIGwgaW4gbWsgbWtfTUsgcnUgcnVfUlU7IGRvCi0tCSAgZWNobyAiJGwgSVNPLTg4NTktNSIKLS0JICBlY2hvICIkbC5pc28tODg1OS01IElTTy04ODU5LTUiCi0tCSAgZWNobyAiJGwua29pOC1yIEtPSTgtUiIKLS0JICBlY2hvICIkbC5jcC04NjYgQ1A4NjYiCi0tCSAgZWNobyAiJGwuY3AtMTI1MSBDUDEyNTEiCi0tCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0tCWRvbmUKLS0JZm9yIGwgaW4gYXIgYXJfU0E7IGRvCi0tCSAgZWNobyAiJGwgSVNPLTg4NTktNiIKLS0JICBlY2hvICIkbC5pc28tODg1OS02IElTTy04ODU5LTYiCi0tCSAgZWNobyAiJGwuY3AtODY0IENQODY0IgotLQkgICNlY2hvICIkbC5jcC04NjggQ1A4NjgiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZwotLQkgIGVjaG8gIiRsLmNwLTEyNTYgQ1AxMjU2IgotLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotLQlkb25lCi0tCWZvciBsIGluIGVsIGVsX0dSIGdyIGdyX0dSOyBkbwotLQkgIGVjaG8gIiRsIElTTy04ODU5LTciCi0tCSAgZWNobyAiJGwuaXNvLTg4NTktNyBJU08tODg1OS03IgotLQkgIGVjaG8gIiRsLmNwLTg2OSBDUDg2OSIKLS0JICBlY2hvICIkbC5jcC0xMjUzIENQMTI1MyIKLS0JICBlY2hvICIkbC5jcC0xMjUzQGV1cm8gQ1AxMjUzIgotLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotLQkgIGVjaG8gIiRsLnV0Zi04QGV1cm8gVVRGLTgiCi0tCWRvbmUKLS0JZm9yIGwgaW4gaGUgaGVfSUwgaXcgaXdfSUw7IGRvCi0tCSAgZWNobyAiJGwgSVNPLTg4NTktOCIKLS0JICBlY2hvICIkbC5pc28tODg1OS04IElTTy04ODU5LTgiCi0tCSAgZWNobyAiJGwuY3AtODYyIENQODYyIgotLQkgIGVjaG8gIiRsLmNwLTEyNTUgQ1AxMjU1IgotLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotLQlkb25lCi0tCWZvciBsIGluIHRyIHRyX1RSOyBkbwotLQkgIGVjaG8gIiRsIElTTy04ODU5LTkiCi0tCSAgZWNobyAiJGwuaXNvLTg4NTktOSBJU08tODg1OS05IgotLQkgIGVjaG8gIiRsLmNwLTg1NyBDUDg1NyIKLS0JICBlY2hvICIkbC5jcC0xMjU0IENQMTI1NCIKLS0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLS0JZG9uZQotLQlmb3IgbCBpbiBsdCBsdF9MVCBsdiBsdl9MVjsgZG8KLS0JICAjZWNobyAiJGwgQkFMVElDIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKLS0JICBlY2hvICIkbCBJU08tODg1OS0xMyIKLS0JZG9uZQotLQlmb3IgbCBpbiBydV9VQSB1ayB1a19VQTsgZG8KLS0JICBlY2hvICIkbCBLT0k4LVUiCi0tCWRvbmUKLS0JZm9yIGwgaW4gemggemhfQ047IGRvCi0tCSAgI2VjaG8gIiRsIEdCXzIzMTItODAiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZywgd3JvbmcgZW5jb2RpbmcgbmFtZQotLQkgIGVjaG8gIiRsIEdCMjMxMiIKLS0JZG9uZQotLQlmb3IgbCBpbiBqYSBqYV9KUCBqYV9KUC5FVUM7IGRvCi0tCSAgZWNobyAiJGwgRVVDLUpQIgotLQlkb25lCi0tCWZvciBsIGluIGtvIGtvX0tSOyBkbwotLQkgIGVjaG8gIiRsIEVVQy1LUiIKLS0JZG9uZQotLQlmb3IgbCBpbiB0aCB0aF9USDsgZG8KLS0JICBlY2hvICIkbCBUSVMtNjIwIgotLQlkb25lCi0tCWZvciBsIGluIGZhIGZhX0lSOyBkbwotLQkgICNlY2hvICIkbCBJU0lSSS0zMzQyIiAjIGEgYnJva2VuIGVuY29kaW5nCi0tCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0tCWRvbmUKLS0JOzsKLS0gICAgbGludXgqIHwgKi1nbnUqKQotLQkjIFdpdGggZ2xpYmMtMi4xIG9yIG5ld2VyLCB3ZSBkb24ndCBuZWVkIGFueSBjYW5vbmljYWxpemF0aW9uLAotLQkjIGJlY2F1c2UgZ2xpYmMgaGFzIGljb252IGFuZCBib3RoIGdsaWJjIGFuZCBsaWJpY29udiBzdXBwb3J0IGFsbAotLQkjIEdOVSBjYW5vbmljYWwgbmFtZXMgZGlyZWN0bHkuIFRoZXJlZm9yZSwgdGhlIE1ha2VmaWxlIGRvZXMgbm90Ci0tCSMgbmVlZCB0byBpbnN0YWxsIHRoZSBhbGlhcyBmaWxlIGF0IGFsbC4KLS0JIyBUaGUgZm9sbG93aW5nIGFwcGxpZXMgb25seSB0byBnbGliYy0yLjAueCBhbmQgb2xkZXIgbGliY3MuCi0tCWVjaG8gIklTT182NDYuSVJWOjE5ODMgQVNDSUkiCi0tCTs7Ci0tICAgIGFpeCopCi0tCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotLQllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKLS0JZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCi0tCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgotLQllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKLS0JZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCi0tCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotLQllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgotLQllY2hvICJJQk0tODUwIENQODUwIgotLQllY2hvICJJQk0tODU2IENQODU2IgotLQllY2hvICJJQk0tOTIxIElTTy04ODU5LTEzIgotLQllY2hvICJJQk0tOTIyIENQOTIyIgotLQllY2hvICJJQk0tOTMyIENQOTMyIgotLQllY2hvICJJQk0tOTQzIENQOTQzIgotLQllY2hvICJJQk0tMTA0NiBDUDEwNDYiCi0tCWVjaG8gIklCTS0xMTI0IENQMTEyNCIKLS0JZWNobyAiSUJNLTExMjkgQ1AxMTI5IgotLQllY2hvICJJQk0tMTI1MiBDUDEyNTIiCi0tCWVjaG8gIklCTS1ldWNDTiBHQjIzMTIiCi0tCWVjaG8gIklCTS1ldWNKUCBFVUMtSlAiCi0tCWVjaG8gIklCTS1ldWNLUiBFVUMtS1IiCi0tCWVjaG8gIklCTS1ldWNUVyBFVUMtVFciCi0tCWVjaG8gImJpZzUgQklHNSIKLS0JZWNobyAiR0JLIEdCSyIKLS0JZWNobyAiVElTLTYyMCBUSVMtNjIwIgotLQllY2hvICJVVEYtOCBVVEYtOCIKLS0JOzsKLS0gICAgaHB1eCopCi0tCWVjaG8gImlzbzg4NTkxIElTTy04ODU5LTEiCi0tCWVjaG8gImlzbzg4NTkyIElTTy04ODU5LTIiCi0tCWVjaG8gImlzbzg4NTk1IElTTy04ODU5LTUiCi0tCWVjaG8gImlzbzg4NTk2IElTTy04ODU5LTYiCi0tCWVjaG8gImlzbzg4NTk3IElTTy04ODU5LTciCi0tCWVjaG8gImlzbzg4NTk4IElTTy04ODU5LTgiCi0tCWVjaG8gImlzbzg4NTk5IElTTy04ODU5LTkiCi0tCWVjaG8gImlzbzg4NTkxNSBJU08tODg1OS0xNSIKLS0JZWNobyAicm9tYW44IEhQLVJPTUFOOCIKLS0JZWNobyAiYXJhYmljOCBIUC1BUkFCSUM4IgotLQllY2hvICJncmVlazggSFAtR1JFRUs4IgotLQllY2hvICJoZWJyZXc4IEhQLUhFQlJFVzgiCi0tCWVjaG8gInR1cmtpc2g4IEhQLVRVUktJU0g4IgotLQllY2hvICJrYW5hOCBIUC1LQU5BOCIKLS0JZWNobyAidGlzNjIwIFRJUy02MjAiCi0tCWVjaG8gImJpZzUgQklHNSIKLS0JZWNobyAiZXVjSlAgRVVDLUpQIgotLQllY2hvICJldWNLUiBFVUMtS1IiCi0tCWVjaG8gImV1Y1RXIEVVQy1UVyIKLS0JZWNobyAiaHAxNUNOIEdCMjMxMiIKLS0JI2VjaG8gImNjZGMgPyIgIyB3aGF0IGlzIHRoaXM/Ci0tCWVjaG8gIlNKSVMgU0hJRlRfSklTIgotLQllY2hvICJ1dGY4IFVURi04IgotLQk7OwotLSAgICBpcml4KikKLS0JZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCi0tCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgotLQllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKLS0JZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCi0tCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotLQllY2hvICJldWNDTiBHQjIzMTIiCi0tCWVjaG8gImV1Y0pQIEVVQy1KUCIKLS0JZWNobyAiZXVjS1IgRVVDLUtSIgotLQllY2hvICJldWNUVyBFVUMtVFciCi0tCTs7Ci0tICAgIG9zZiopCi0tCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotLQllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKLS0JZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCi0tCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgotLQllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKLS0JZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCi0tCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotLQllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgotLQllY2hvICJjcDg1MCBDUDg1MCIKLS0JZWNobyAiYmlnNSBCSUc1IgotLQllY2hvICJkZWNoYW55dSBERUMtSEFOWVUiCi0tCWVjaG8gImRlY2hhbnppIEdCMjMxMiIKLS0JZWNobyAiZGVja2FuamkgREVDLUtBTkpJIgotLQllY2hvICJkZWNrb3JlYW4gRVVDLUtSIgotLQllY2hvICJldWNKUCBFVUMtSlAiCi0tCWVjaG8gImV1Y0tSIEVVQy1LUiIKLS0JZWNobyAiZXVjVFcgRVVDLVRXIgotLQllY2hvICJHQksgR0JLIgotLQllY2hvICJLU0M1NjAxIENQOTQ5IgotLQllY2hvICJzZGVja2FuamkgRVVDLUpQIgotLQllY2hvICJTSklTIFNISUZUX0pJUyIKLS0JZWNobyAiVEFDVElTIFRJUy02MjAiCi0tCWVjaG8gIlVURi04IFVURi04IgotLQk7OwotLSAgICBzb2xhcmlzKikKLS0JZWNobyAiNjQ2IEFTQ0lJIgotLQllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKLS0JZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCi0tCWVjaG8gIklTTzg4NTktMyBJU08tODg1OS0zIgotLQllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKLS0JZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCi0tCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgotLQllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKLS0JZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCi0tCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotLQllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgotLQllY2hvICJrb2k4LXIgS09JOC1SIgotLQllY2hvICJhbnNpLTEyNTEgQ1AxMjUxIgotLQllY2hvICJCSUc1IEJJRzUiCi0tCWVjaG8gIkJpZzUtSEtTQ1MgQklHNS1IS1NDUyIKLS0JZWNobyAiZ2IyMzEyIEdCMjMxMiIKLS0JZWNobyAiR0JLIEdCSyIKLS0JZWNobyAiR0IxODAzMCBHQjE4MDMwIgotLQllY2hvICJjbnMxMTY0MyBFVUMtVFciCi0tCWVjaG8gIjU2MDEgRVVDLUtSIgotLQllY2hvICJrb19LUi5qb2hhcDkyIEpPSEFCIgotLQllY2hvICJldWNKUCBFVUMtSlAiCi0tCWVjaG8gIlBDSyBTSElGVF9KSVMiCi0tCWVjaG8gIlRJUzYyMC4yNTMzIFRJUy02MjAiCi0tCSNlY2hvICJzdW5fZXVfZ3JlZWsgPyIgIyB3aGF0IGlzIHRoaXM/Ci0tCWVjaG8gIlVURi04IFVURi04IgotLQk7OwotLSAgICBmcmVlYnNkKiB8IG9zMiopCi0tCSMgRnJlZUJTRCA0LjIgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLS0JIyBsb2NhbGNoYXJzZXQuYyBmYWxscyBiYWNrIHRvIHVzaW5nIHRoZSBmdWxsIGxvY2FsZSBuYW1lCi0tCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotLQkjIExpa2V3aXNlIGZvciBPUy8yLiBPUy8yIGhhcyBYRnJlZTg2IGp1c3QgbGlrZSBGcmVlQlNELiBKdXN0Ci0tCSMgcmV1c2UgRnJlZUJTRCdzIGxvY2FsZSBkYXRhIGZvciBPUy8yLgotLQllY2hvICJDIEFTQ0lJIgotLQllY2hvICJVUy1BU0NJSSBBU0NJSSIKLS0JZm9yIGwgaW4gbGFfTE4gbHRfTE47IGRvCi0tCSAgZWNobyAiJGwuQVNDSUkgQVNDSUkiCi0tCWRvbmUKLS0JZm9yIGwgaW4gZGFfREsgZGVfQVQgZGVfQ0ggZGVfREUgZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgZXNfRVMgXAotLQkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBsYV9MTiBcCi0tCSAgICAgICAgIGx0X0xOIG5sX0JFIG5sX05MIG5vX05PIHB0X1BUIHN2X1NFOyBkbwotLQkgIGVjaG8gIiRsLklTT184ODU5LTEgSVNPLTg4NTktMSIKLS0JICBlY2hvICIkbC5ESVNfODg1OS0xNSBJU08tODg1OS0xNSIKLS0JZG9uZQotLQlmb3IgbCBpbiBjc19DWiBocl9IUiBodV9IVSBsYV9MTiBsdF9MTiBwbF9QTCBzbF9TSTsgZG8KLS0JICBlY2hvICIkbC5JU09fODg1OS0yIElTTy04ODU5LTIiCi0tCWRvbmUKLS0JZm9yIGwgaW4gbGFfTE4gbHRfTFQ7IGRvCi0tCSAgZWNobyAiJGwuSVNPXzg4NTktNCBJU08tODg1OS00IgotLQlkb25lCi0tCWZvciBsIGluIHJ1X1JVIHJ1X1NVOyBkbwotLQkgIGVjaG8gIiRsLktPSTgtUiBLT0k4LVIiCi0tCSAgZWNobyAiJGwuSVNPXzg4NTktNSBJU08tODg1OS01IgotLQkgIGVjaG8gIiRsLkNQODY2IENQODY2IgotLQlkb25lCi0tCWVjaG8gInVrX1VBLktPSTgtVSBLT0k4LVUiCi0tCWVjaG8gInpoX1RXLkJJRzUgQklHNSIKLS0JZWNobyAiemhfVFcuQmlnNSBCSUc1IgotLQllY2hvICJ6aF9DTi5FVUMgR0IyMzEyIgotLQllY2hvICJqYV9KUC5FVUMgRVVDLUpQIgotLQllY2hvICJqYV9KUC5TSklTIFNISUZUX0pJUyIKLS0JZWNobyAiamFfSlAuU2hpZnRfSklTIFNISUZUX0pJUyIKLS0JZWNobyAia29fS1IuRVVDIEVVQy1LUiIKLS0JOzsKLS0gICAgbmV0YnNkKikKLS0JZWNobyAiNjQ2IEFTQ0lJIgotLQllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKLS0JZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCi0tCWVjaG8gIklTTzg4NTktNCBJU08tODg1OS00IgotLQllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKLS0JZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCi0tCWVjaG8gIklTTzg4NTktMTMgSVNPLTg4NTktMTMiCi0tCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCi0tCWVjaG8gImV1Y0NOIEdCMjMxMiIKLS0JZWNobyAiZXVjSlAgRVVDLUpQIgotLQllY2hvICJldWNLUiBFVUMtS1IiCi0tCWVjaG8gImV1Y1RXIEVVQy1UVyIKLS0JZWNobyAiQklHNSBCSUc1IgotLQllY2hvICJTSklTIFNISUZUX0pJUyIKLS0JOzsKLS0gICAgZGFyd2luWzU2XSopCi0tCSMgRGFyd2luIDYuOCBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQotLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLS0JIyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0tCWVjaG8gIkMgQVNDSUkiCi0tCWZvciBsIGluIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGxhX0xOOyBkbwotLQkgIGVjaG8gIiRsLlVTLUFTQ0lJIEFTQ0lJIgotLQlkb25lCi0tCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKLS0JICAgICAgICAgZmlfRkkgZnJfQkUgZnJfQ0EgZnJfQ0ggZnJfRlIgaXNfSVMgaXRfQ0ggaXRfSVQgbmxfQkUgXAotLQkgICAgICAgICBubF9OTCBub19OTyBwdF9QVCBzdl9TRTsgZG8KLS0JICBlY2hvICIkbCBJU08tODg1OS0xIgotLQkgIGVjaG8gIiRsLklTTzg4NTktMSBJU08tODg1OS0xIgotLQkgIGVjaG8gIiRsLklTTzg4NTktMTUgSVNPLTg4NTktMTUiCi0tCWRvbmUKLS0JZm9yIGwgaW4gbGFfTE47IGRvCi0tCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCi0tCSAgZWNobyAiJGwuSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLS0JZG9uZQotLQlmb3IgbCBpbiBjc19DWiBocl9IUiBodV9IVSBsYV9MTiBwbF9QTCBzbF9TSTsgZG8KLS0JICBlY2hvICIkbC5JU084ODU5LTIgSVNPLTg4NTktMiIKLS0JZG9uZQotLQlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KLS0JICBlY2hvICIkbC5JU084ODU5LTQgSVNPLTg4NTktNCIKLS0JZG9uZQotLQlmb3IgbCBpbiBydV9SVTsgZG8KLS0JICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgotLQkgIGVjaG8gIiRsLklTTzg4NTktNSBJU08tODg1OS01IgotLQkgIGVjaG8gIiRsLkNQODY2IENQODY2IgotLQlkb25lCi0tCWZvciBsIGluIGJnX0JHOyBkbwotLQkgIGVjaG8gIiRsLkNQMTI1MSBDUDEyNTEiCi0tCWRvbmUKLS0JZWNobyAidWtfVUEuS09JOC1VIEtPSTgtVSIKLS0JZWNobyAiemhfVFcuQklHNSBCSUc1IgotLQllY2hvICJ6aF9UVy5CaWc1IEJJRzUiCi0tCWVjaG8gInpoX0NOLkVVQyBHQjIzMTIiCi0tCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCi0tCWVjaG8gImphX0pQLlNKSVMgU0hJRlRfSklTIgotLQllY2hvICJrb19LUi5FVUMgRVVDLUtSIgotLQk7OwotLSAgICBkYXJ3aW4qKQotLQkjIERhcndpbiA3LjUgaGFzIG5sX2xhbmdpbmZvKENPREVTRVQpLCBidXQgaXQgaXMgdXNlbGVzczoKLS0JIyAtIEl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyB3aGVuIExBTkcgaXMgc2V0IHRvIGEgbG9jYWxlIG9mIHRoZQotLQkjICAgZm9ybSBsbF9DQywgYWx0aG91Z2ggbGxfQ0MvTENfQ1RZUEUgaXMgYSBzeW1saW5rIHRvIGFuIFVURi04Ci0tCSMgICBMQ19DVFlQRSBmaWxlLgotLQkjIC0gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBMQU5HLCBMQ19DVFlQRSwgTENfQUxMIGFyZSBub3Qgc2V0IGJ5Ci0tCSMgICB0aGUgc3lzdGVtOyBubF9sYW5naW5mbyhDT0RFU0VUKSByZXR1cm5zICJVUy1BU0NJSSIgaW4gdGhpcyBjYXNlLgotLQkjIC0gVGhlIGRvY3VtZW50YXRpb24gc2F5czoKLS0JIyAgICAgIi4uLiBhbGwgY29kZSB0aGF0IGNhbGxzIEJTRCBzeXN0ZW0gcm91dGluZXMgc2hvdWxkIGVuc3VyZQotLQkjICAgICAgdGhhdCB0aGUgY29uc3QgKmNoYXIgcGFyYW1ldGVycyBvZiB0aGVzZSByb3V0aW5lcyBhcmUgaW4gVVRGLTgKLS0JIyAgICAgIGVuY29kaW5nLiBBbGwgQlNEIHN5c3RlbSBmdW5jdGlvbnMgZXhwZWN0IHRoZWlyIHN0cmluZwotLQkjICAgICAgcGFyYW1ldGVycyB0byBiZSBpbiBVVEYtOCBlbmNvZGluZyBhbmQgbm90aGluZyBlbHNlLiIKLS0JIyAgIEl0IGFsc28gc2F5cwotLQkjICAgICAiQW4gYWRkaXRpb25hbCBjYXZlYXQgaXMgdGhhdCBzdHJpbmcgcGFyYW1ldGVycyBmb3IgZmlsZXMsCi0tCSMgICAgICBwYXRocywgYW5kIG90aGVyIGZpbGUtc3lzdGVtIGVudGl0aWVzIG11c3QgYmUgaW4gY2Fub25pY2FsCi0tCSMgICAgICBVVEYtOC4gSW4gYSBjYW5vbmljYWwgVVRGLTggVW5pY29kZSBzdHJpbmcsIGFsbCBkZWNvbXBvc2FibGUKLS0JIyAgICAgIGNoYXJhY3RlcnMgYXJlIGRlY29tcG9zZWQgLi4uIgotLQkjICAgYnV0IHRoaXMgaXMgbm90IHRydWU6IFlvdSBjYW4gcGFzcyBub24tZGVjb21wb3NlZCBVVEYtOCBzdHJpbmdzCi0tCSMgICB0byBmaWxlIHN5c3RlbSBmdW5jdGlvbnMsIGFuZCBpdCBpcyB0aGUgT1Mgd2hpY2ggd2lsbCBjb252ZXJ0Ci0tCSMgICB0aGVtIHRvIGRlY29tcG9zZWQgVVRGLTggYmVmb3JlIGFjY2Vzc2luZyB0aGUgZmlsZSBzeXN0ZW0uCi0tCSMgLSBUaGUgQXBwbGUgVGVybWluYWwgYXBwbGljYXRpb24gZGlzcGxheXMgVVRGLTggYnkgZGVmYXVsdC4KLS0JIyAtIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBhcmUgZnJlZSB0byB1c2UgZGlmZmVyZW50IGVuY29kaW5nczoKLS0JIyAgIC0geHRlcm0gdXNlcyBJU08tODg1OS0xIGJ5IGRlZmF1bHQuCi0tCSMgICAtIFRleHRFZGl0IHVzZXMgTWFjUm9tYW4gYnkgZGVmYXVsdC4KLS0JIyBXZSBwcmVmZXIgVVRGLTggb3ZlciBkZWNvbXBvc2VkIFVURi04LU1BQyBiZWNhdXNlIG9uZSBzaG91bGQKLS0JIyBtaW5pbWl6ZSB0aGUgdXNlIG9mIGRlY29tcG9zZWQgVW5pY29kZS4gVW5mb3J0dW5hdGVseSwgdGhyb3VnaCB0aGUKLS0JIyBEYXJ3aW4gZmlsZSBzeXN0ZW0sIGRlY29tcG9zZWQgVVRGLTggc3RyaW5ncyBhcmUgbGVha2VkIGludG8gdXNlcgotLQkjIHNwYWNlIG5ldmVydGhlbGVzcy4KLS0JZWNobyAiKiBVVEYtOCIKLS0JOzsKLS0gICAgYmVvcyopCi0tCSMgQmVPUyBoYXMgYSBzaW5nbGUgbG9jYWxlLCBhbmQgaXQgaGFzIFVURi04IGVuY29kaW5nLgotLQllY2hvICIqIFVURi04IgotLQk7OwotLSAgICBtc2Rvc2RqZ3BwKikKLS0JIyBESkdQUCAyLjAzIGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCi0tCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQotLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLS0JZWNobyAiIyIKLS0JZWNobyAiIyBUaGUgZW5jb2RpbmdzIGdpdmVuIGhlcmUgbWF5IG5vdCBhbGwgYmUgY29ycmVjdC4iCi0tCWVjaG8gIiMgSWYgeW91IGZpbmQgdGhhdCB0aGUgZW5jb2RpbmcgZ2l2ZW4gZm9yIHlvdXIgbGFuZ3VhZ2UgYW5kIgotLQllY2hvICIjIGNvdW50cnkgaXMgbm90IHRoZSBvbmUgeW91ciBET1MgbWFjaGluZSBhY3R1YWxseSB1c2VzLCBqdXN0IgotLQllY2hvICIjIGNvcnJlY3QgaXQgaW4gdGhpcyBmaWxlLCBhbmQgc2VuZCBhIG1haWwgdG8iCi0tCWVjaG8gIiMgSnVhbiBNYW51ZWwgR3VlcnJlcm8gPGp1YW4uZ3VlcnJlcm9AZ214LmRlPiIKLS0JZWNobyAiIyBhbmQgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiIKLS0JZWNobyAiIyIKLS0JZWNobyAiQyBBU0NJSSIKLS0JIyBJU08tODg1OS0xIGxhbmd1YWdlcwotLQllY2hvICJjYSBDUDg1MCIKLS0JZWNobyAiY2FfRVMgQ1A4NTAiCi0tCWVjaG8gImRhIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PwotLQllY2hvICJkYV9ESyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLS0JZWNobyAiZGUgQ1A4NTAiCi0tCWVjaG8gImRlX0FUIENQODUwIgotLQllY2hvICJkZV9DSCBDUDg1MCIKLS0JZWNobyAiZGVfREUgQ1A4NTAiCi0tCWVjaG8gImVuIENQODUwIgotLQllY2hvICJlbl9BVSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KLS0JZWNobyAiZW5fQ0EgQ1A4NTAiCi0tCWVjaG8gImVuX0dCIENQODUwIgotLQllY2hvICJlbl9OWiBDUDQzNyIKLS0JZWNobyAiZW5fVVMgQ1A0MzciCi0tCWVjaG8gImVuX1pBIENQODUwIiAjIG5vdCBDUDQzNyA/PwotLQllY2hvICJlcyBDUDg1MCIKLS0JZWNobyAiZXNfQVIgQ1A4NTAiCi0tCWVjaG8gImVzX0JPIENQODUwIgotLQllY2hvICJlc19DTCBDUDg1MCIKLS0JZWNobyAiZXNfQ08gQ1A4NTAiCi0tCWVjaG8gImVzX0NSIENQODUwIgotLQllY2hvICJlc19DVSBDUDg1MCIKLS0JZWNobyAiZXNfRE8gQ1A4NTAiCi0tCWVjaG8gImVzX0VDIENQODUwIgotLQllY2hvICJlc19FUyBDUDg1MCIKLS0JZWNobyAiZXNfR1QgQ1A4NTAiCi0tCWVjaG8gImVzX0hOIENQODUwIgotLQllY2hvICJlc19NWCBDUDg1MCIKLS0JZWNobyAiZXNfTkkgQ1A4NTAiCi0tCWVjaG8gImVzX1BBIENQODUwIgotLQllY2hvICJlc19QWSBDUDg1MCIKLS0JZWNobyAiZXNfUEUgQ1A4NTAiCi0tCWVjaG8gImVzX1NWIENQODUwIgotLQllY2hvICJlc19VWSBDUDg1MCIKLS0JZWNobyAiZXNfVkUgQ1A4NTAiCi0tCWVjaG8gImV0IENQODUwIgotLQllY2hvICJldF9FRSBDUDg1MCIKLS0JZWNobyAiZXUgQ1A4NTAiCi0tCWVjaG8gImV1X0VTIENQODUwIgotLQllY2hvICJmaSBDUDg1MCIKLS0JZWNobyAiZmlfRkkgQ1A4NTAiCi0tCWVjaG8gImZyIENQODUwIgotLQllY2hvICJmcl9CRSBDUDg1MCIKLS0JZWNobyAiZnJfQ0EgQ1A4NTAiCi0tCWVjaG8gImZyX0NIIENQODUwIgotLQllY2hvICJmcl9GUiBDUDg1MCIKLS0JZWNobyAiZ2EgQ1A4NTAiCi0tCWVjaG8gImdhX0lFIENQODUwIgotLQllY2hvICJnZCBDUDg1MCIKLS0JZWNobyAiZ2RfR0IgQ1A4NTAiCi0tCWVjaG8gImdsIENQODUwIgotLQllY2hvICJnbF9FUyBDUDg1MCIKLS0JZWNobyAiaWQgQ1A4NTAiICAgICMgbm90IENQNDM3ID8/Ci0tCWVjaG8gImlkX0lEIENQODUwIiAjIG5vdCBDUDQzNyA/PwotLQllY2hvICJpcyBDUDg2MSIgICAgIyBub3QgQ1A4NTAgPz8KLS0JZWNobyAiaXNfSVMgQ1A4NjEiICMgbm90IENQODUwID8/Ci0tCWVjaG8gIml0IENQODUwIgotLQllY2hvICJpdF9DSCBDUDg1MCIKLS0JZWNobyAiaXRfSVQgQ1A4NTAiCi0tCWVjaG8gImx0IENQNzc1IgotLQllY2hvICJsdF9MVCBDUDc3NSIKLS0JZWNobyAibHYgQ1A3NzUiCi0tCWVjaG8gImx2X0xWIENQNzc1IgotLQllY2hvICJuYiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLS0JZWNobyAibmJfTk8gQ1A4NjUiICMgbm90IENQODUwID8/Ci0tCWVjaG8gIm5sIENQODUwIgotLQllY2hvICJubF9CRSBDUDg1MCIKLS0JZWNobyAibmxfTkwgQ1A4NTAiCi0tCWVjaG8gIm5uIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PwotLQllY2hvICJubl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLS0JZWNobyAibm8gQ1A4NjUiICAgICMgbm90IENQODUwID8/Ci0tCWVjaG8gIm5vX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PwotLQllY2hvICJwdCBDUDg1MCIKLS0JZWNobyAicHRfQlIgQ1A4NTAiCi0tCWVjaG8gInB0X1BUIENQODUwIgotLQllY2hvICJzdiBDUDg1MCIKLS0JZWNobyAic3ZfU0UgQ1A4NTAiCi0tCSMgSVNPLTg4NTktMiBsYW5ndWFnZXMKLS0JZWNobyAiY3MgQ1A4NTIiCi0tCWVjaG8gImNzX0NaIENQODUyIgotLQllY2hvICJociBDUDg1MiIKLS0JZWNobyAiaHJfSFIgQ1A4NTIiCi0tCWVjaG8gImh1IENQODUyIgotLQllY2hvICJodV9IVSBDUDg1MiIKLS0JZWNobyAicGwgQ1A4NTIiCi0tCWVjaG8gInBsX1BMIENQODUyIgotLQllY2hvICJybyBDUDg1MiIKLS0JZWNobyAicm9fUk8gQ1A4NTIiCi0tCWVjaG8gInNrIENQODUyIgotLQllY2hvICJza19TSyBDUDg1MiIKLS0JZWNobyAic2wgQ1A4NTIiCi0tCWVjaG8gInNsX1NJIENQODUyIgotLQllY2hvICJzcSBDUDg1MiIKLS0JZWNobyAic3FfQUwgQ1A4NTIiCi0tCWVjaG8gInNyIENQODUyIiAgICAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/Ci0tCWVjaG8gInNyX0NTIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/Ci0tCWVjaG8gInNyX1lVIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/Ci0tCSMgSVNPLTg4NTktMyBsYW5ndWFnZXMKLS0JZWNobyAibXQgQ1A4NTAiCi0tCWVjaG8gIm10X01UIENQODUwIgotLQkjIElTTy04ODU5LTUgbGFuZ3VhZ2VzCi0tCWVjaG8gImJlIENQODY2IgotLQllY2hvICJiZV9CRSBDUDg2NiIKLS0JZWNobyAiYmcgQ1A4NjYiICAgICMgbm90IENQODU1ID8/Ci0tCWVjaG8gImJnX0JHIENQODY2IiAjIG5vdCBDUDg1NSA/PwotLQllY2hvICJtayBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KLS0JZWNobyAibWtfTUsgQ1A4NjYiICMgbm90IENQODU1ID8/Ci0tCWVjaG8gInJ1IENQODY2IgotLQllY2hvICJydV9SVSBDUDg2NiIKLS0JZWNobyAidWsgQ1AxMTI1IgotLQllY2hvICJ1a19VQSBDUDExMjUiCi0tCSMgSVNPLTg4NTktNiBsYW5ndWFnZXMKLS0JZWNobyAiYXIgQ1A4NjQiCi0tCWVjaG8gImFyX0FFIENQODY0IgotLQllY2hvICJhcl9EWiBDUDg2NCIKLS0JZWNobyAiYXJfRUcgQ1A4NjQiCi0tCWVjaG8gImFyX0lRIENQODY0IgotLQllY2hvICJhcl9JUiBDUDg2NCIKLS0JZWNobyAiYXJfSk8gQ1A4NjQiCi0tCWVjaG8gImFyX0tXIENQODY0IgotLQllY2hvICJhcl9NQSBDUDg2NCIKLS0JZWNobyAiYXJfT00gQ1A4NjQiCi0tCWVjaG8gImFyX1FBIENQODY0IgotLQllY2hvICJhcl9TQSBDUDg2NCIKLS0JZWNobyAiYXJfU1kgQ1A4NjQiCi0tCSMgSVNPLTg4NTktNyBsYW5ndWFnZXMKLS0JZWNobyAiZWwgQ1A4NjkiCi0tCWVjaG8gImVsX0dSIENQODY5IgotLQkjIElTTy04ODU5LTggbGFuZ3VhZ2VzCi0tCWVjaG8gImhlIENQODYyIgotLQllY2hvICJoZV9JTCBDUDg2MiIKLS0JIyBJU08tODg1OS05IGxhbmd1YWdlcwotLQllY2hvICJ0ciBDUDg1NyIKLS0JZWNobyAidHJfVFIgQ1A4NTciCi0tCSMgSmFwYW5lc2UKLS0JZWNobyAiamEgQ1A5MzIiCi0tCWVjaG8gImphX0pQIENQOTMyIgotLQkjIENoaW5lc2UKLS0JZWNobyAiemhfQ04gR0JLIgotLQllY2hvICJ6aF9UVyBDUDk1MCIgIyBub3QgQ1A5MzggPz8KLS0JIyBLb3JlYW4KLS0JZWNobyAia3IgQ1A5NDkiICAgICMgbm90IENQOTM0ID8/Ci0tCWVjaG8gImtyX0tSIENQOTQ5IiAjIG5vdCBDUDkzNCA/PwotLQkjIFRoYWkKLS0JZWNobyAidGggQ1A4NzQiCi0tCWVjaG8gInRoX1RIIENQODc0IgotLQkjIE90aGVyCi0tCWVjaG8gImVvIENQODUwIgotLQllY2hvICJlb19FTyBDUDg1MCIKLS0JOzsKLS1lc2FjCi0tLS0gYS9pbnRsL2RjZ2V0dGV4dC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw1NiArMCwwIEBACi0tLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8bGliaW50bC5oPgotLSNlbHNlCi0tIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLS0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0tICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0tICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKLS0jIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAotLSNlbHNlCi0tIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0Ci0tIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKLS0jZW5kaWYKLS0KLS0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLS0gICBsb2NhbGUuICAqLwotLWNoYXIgKgotLURDR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKLS17Ci0tICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIE5VTEwsIDAsIDAsIGNhdGVnb3J5KTsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi0tSU5UREVGKF9fZGNnZXR0ZXh0KQotLXdlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOwotLSNlbmRpZgotLS0tIGEvaW50bC9kY2lnZXR0ZXh0LmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDE2ODkgKzAsMCBAQAotLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBkY2lnZXR0ZXh0IGZ1bmN0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCi0tICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0tICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLS0jIGRlZmluZSBfR05VX1NPVVJDRQkxCi0tI2VuZGlmCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLS8qIE5MX0xPQ0FMRV9OQU1FIGRvZXMgbm90IHdvcmsgaW4gZ2xpYmMtMi40LiAgSWdub3JlIGl0LiAgKi8KLS0jdW5kZWYgSEFWRV9OTF9MT0NBTEVfTkFNRQotLQotLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLS0KLS0jaWZkZWYgX19HTlVDX18KLS0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLS0jZWxzZQotLSMgaWZkZWYgX01TQ19WRVIKLS0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLS0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLS0jIGVsc2UKLS0jICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLS0jICBlbHNlCi0tIyAgIGlmZGVmIF9BSVgKLS0gI3ByYWdtYSBhbGxvY2EKLS0jICAgZWxzZQotLSMgICAgaWZuZGVmIGFsbG9jYQotLWNoYXIgKmFsbG9jYSAoKTsKLS0jICAgIGVuZGlmCi0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPGVycm5vLmg+Ci0tI2lmbmRlZiBlcnJubwotLWV4dGVybiBpbnQgZXJybm87Ci0tI2VuZGlmCi0tI2lmbmRlZiBfX3NldF9lcnJubwotLSMgZGVmaW5lIF9fc2V0X2Vycm5vKHZhbCkgZXJybm8gPSAodmFsKQotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLQotLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPGxvY2FsZS5oPgotLQotLSNpZmRlZiBfTElCQwotLSAgLyogR3Vlc3Mgd2hldGhlciBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHNpZ25hbCBTSUdGUEUuCi0tICAgICBTZXQgdG8gMSBvbmx5IGlmIHlvdSBrbm93IGZvciBzdXJlLiAgSW4gY2FzZSBvZiBkb3VidCwgc2V0IHRvIDAuICAqLwotLSMgaWYgZGVmaW5lZCBfX2FscGhhX18gfHwgZGVmaW5lZCBfX2FybV9fIHx8IGRlZmluZWQgX19pMzg2X18gXAotLSAgICAgfHwgZGVmaW5lZCBfX202OGtfXyB8fCBkZWZpbmVkIF9fczM5MF9fCi0tIyAgZGVmaW5lIElOVERJVjBfUkFJU0VTX1NJR0ZQRSAxCi0tIyBlbHNlCi0tIyAgZGVmaW5lIElOVERJVjBfUkFJU0VTX1NJR0ZQRSAwCi0tIyBlbmRpZgotLSNlbmRpZgotLSNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCi0tIyBpbmNsdWRlIDxzaWduYWwuaD4KLS0jZW5kaWYKLS0KLS0jaWYgZGVmaW5lZCBIQVZFX1NZU19QQVJBTV9IIHx8IGRlZmluZWQgX0xJQkMKLS0jIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotLSNlbmRpZgotLQotLSNpZiAhZGVmaW5lZCBfTElCQwotLSMgaWYgSEFWRV9OTF9MT0NBTEVfTkFNRQotLSMgIGluY2x1ZGUgPGxhbmdpbmZvLmg+Ci0tIyBlbmRpZgotLSMgaW5jbHVkZSAibG9jYWxjaGFyc2V0LmgiCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jZWxzZQotLSMgaWZkZWYgSU5fTElCR0xPQ0FMRQotLSMgIGluY2x1ZGUgPGxpYmludGwuaD4KLS0jIGVuZGlmCi0tIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tI2VuZGlmCi0tI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCi0tCi0tLyogSGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotLSMgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgX19saWJjX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQKLS0jIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrIF9fbGliY19yd2xvY2tfcmRsb2NrCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayBfX2xpYmNfcndsb2NrX3dybG9jawotLSMgZGVmaW5lIGdsX3J3bG9ja191bmxvY2sgX19saWJjX3J3bG9ja191bmxvY2sKLS0jZWxzZQotLSMgaW5jbHVkZSAibG9jay5oIgotLSNlbmRpZgotLQotLS8qIEFsaWdubWVudCBvZiB0eXBlcy4gICovCi0tI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgotLSMgZGVmaW5lIGFsaWdub2YoVFlQRSkgX19hbGlnbm9mX18gKFRZUEUpCi0tI2Vsc2UKLS0jIGRlZmluZSBhbGlnbm9mKFRZUEUpIFwKLS0gICAgKChpbnQpICYoKHN0cnVjdCB7IGNoYXIgZHVtbXkxOyBUWVBFIGR1bW15MjsgfSAqKSAwKS0+ZHVtbXkyKQotLSNlbmRpZgotLQotLS8qIFNvbWUgY29tcGlsZXJzLCBsaWtlIFN1bk9TNCBjYywgZG9uJ3QgaGF2ZSBvZmZzZXRvZiBpbiA8c3RkZGVmLmg+LiAgKi8KLS0jaWZuZGVmIG9mZnNldG9mCi0tIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSxpZGVudCkgKChzaXplX3QpJigoKHR5cGUqKTApLT5pZGVudCkpCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLSNpZmRlZiBfTElCQwotLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLS0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0tIyBkZWZpbmUgZ2V0Y3dkIF9fZ2V0Y3dkCi0tIyBpZm5kZWYgc3RwY3B5Ci0tIyAgZGVmaW5lIHN0cGNweSBfX3N0cGNweQotLSMgZW5kaWYKLS0jIGRlZmluZSB0ZmluZCBfX3RmaW5kCi0tI2Vsc2UKLS0jIGlmICFkZWZpbmVkIEhBVkVfR0VUQ1dECi0tY2hhciAqZ2V0d2QgKCk7Ci0tIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKLS0jIGVsc2UKLS0jICBpZiBWTVMKLS0jICAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgKGdldGN3ZCkgKGJ1ZiwgbWF4LCAwKQotLSMgIGVsc2UKLS1jaGFyICpnZXRjd2QgKCk7Ci0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgSEFWRV9TVFBDUFkKLS1zdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOwotLSMgZW5kaWYKLS0jIGlmbmRlZiBIQVZFX01FTVBDUFkKLS1zdGF0aWMgdm9pZCAqbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7Ci0tIyBlbmRpZgotLSNlbmRpZgotLQotLS8qIFVzZSBhIHJlcGxhY2VtZW50IGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgYHRzZWFyY2gnIGZ1bmN0aW9uCi0tICAgZmFtaWx5LiAgKi8KLS0jaWYgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKLS0jIGluY2x1ZGUgPHNlYXJjaC5oPgotLSNlbHNlCi0tIyBkZWZpbmUgdHNlYXJjaCBsaWJpbnRsX3RzZWFyY2gKLS0jIGRlZmluZSB0ZmluZCBsaWJpbnRsX3RmaW5kCi0tIyBkZWZpbmUgdGRlbGV0ZSBsaWJpbnRsX3RkZWxldGUKLS0jIGRlZmluZSB0d2FsayBsaWJpbnRsX3R3YWxrCi0tIyBpbmNsdWRlICJ0c2VhcmNoLmgiCi0tI2VuZGlmCi0tCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgdHNlYXJjaCBfX3RzZWFyY2gKLS0jZW5kaWYKLS0KLS0vKiBBbW91bnQgdG8gaW5jcmVhc2UgYnVmZmVyIHNpemUgYnkgaW4gZWFjaCB0cnkuICAqLwotLSNkZWZpbmUgUEFUSF9JTkNSIDMyCi0tCi0tLyogVGhlIGZvbGxvd2luZyBpcyBmcm9tIHBhdGhtYXguaC4gICovCi0tLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCi0tICAgUEFUSF9NQVggYnV0IG1pZ2h0IGNhdXNlIHJlZGVmaW5pdGlvbiB3YXJuaW5ncyB3aGVuIHN5cy9wYXJhbS5oIGlzCi0tICAgbGF0ZXIgaW5jbHVkZWQgKGFzIG9uIE1PUkUvQlNEIDQuMykuICAqLwotLSNpZiBkZWZpbmVkIF9QT1NJWF9WRVJTSU9OIHx8IChkZWZpbmVkIEhBVkVfTElNSVRTX0ggJiYgIWRlZmluZWQgX19HTlVDX18pCi0tIyBpbmNsdWRlIDxsaW1pdHMuaD4KLS0jZW5kaWYKLS0KLS0jaWZuZGVmIF9QT1NJWF9QQVRIX01BWAotLSMgZGVmaW5lIF9QT1NJWF9QQVRIX01BWCAyNTUKLS0jZW5kaWYKLS0KLS0jaWYgIWRlZmluZWQgUEFUSF9NQVggJiYgZGVmaW5lZCBfUENfUEFUSF9NQVgKLS0jIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKLS0jZW5kaWYKLS0KLS0vKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLwotLSNpZiBkZWZpbmVkIEhBVkVfU1lTX1BBUkFNX0ggJiYgIWRlZmluZWQgUEFUSF9NQVggJiYgIWRlZmluZWQgTUFYUEFUSExFTgotLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0tI2VuZGlmCi0tCi0tI2lmICFkZWZpbmVkIFBBVEhfTUFYICYmIGRlZmluZWQgTUFYUEFUSExFTgotLSMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KLS0jZW5kaWYKLS0KLS0jaWZuZGVmIFBBVEhfTUFYCi0tIyBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCi0tI2VuZGlmCi0tCi0tLyogUGF0aG5hbWUgc3VwcG9ydC4KLS0gICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLS0gICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKLS0gICAgICAgICAgICAgICAgICAgICAgICBpdCBtYXkgYmUgY29uY2F0ZW5hdGVkIHRvIGEgZGlyZWN0b3J5IHBhdGhuYW1lLgotLSAgIElTX1BBVEhfV0lUSF9ESVIoUCkgIHRlc3RzIHdoZXRoZXIgUCBjb250YWlucyBhIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLgotLSAqLwotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0tICAvKiBXaW4zMiwgQ3lnd2luLCBPUy8yLCBET1MgKi8KLS0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQotLSMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAotLSAgICAoKCgoUClbMF0gPj0gJ0EnICYmIChQKVswXSA8PSAnWicpIHx8ICgoUClbMF0gPj0gJ2EnICYmIChQKVswXSA8PSAneicpKSBcCi0tICAgICAmJiAoUClbMV0gPT0gJzonKQotLSMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgKElTU0xBU0ggKChQKVswXSkgfHwgSEFTX0RFVklDRSAoUCkpCi0tIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSBcCi0tICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCi0tI2Vsc2UKLS0gIC8qIFVuaXggKi8KLS0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQotLSMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgSVNTTEFTSCAoKFApWzBdKQotLSMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMKQotLSNlbmRpZgotLQotLS8qIFdoZXRoZXIgdG8gc3VwcG9ydCBkaWZmZXJlbnQgbG9jYWxlcyBpbiBkaWZmZXJlbnQgdGhyZWFkcy4gICovCi0tI2lmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9OTF9MT0NBTEVfTkFNRSB8fCAoSEFWRV9TVFJVQ1RfX19MT0NBTEVfU1RSVUNUX19fTkFNRVMgJiYgZGVmaW5lZCBVU0VfSU5fR0VUVEVYVF9URVNUUykgfHwgZGVmaW5lZCBJTl9MSUJHTE9DQUxFCi0tIyBkZWZpbmUgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRQotLSNlbmRpZgotLQotLS8qIFRoaXMgaXMgdGhlIHR5cGUgdXNlZCBmb3IgdGhlIHNlYXJjaCB0cmVlIHdoZXJlIGtub3duIHRyYW5zbGF0aW9ucwotLSAgIGFyZSBzdG9yZWQuICAqLwotLXN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90Ci0tewotLSAgLyogRG9tYWluIGluIHdoaWNoIHRvIHNlYXJjaC4gICovCi0tICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotLQotLSAgLyogVGhlIGNhdGVnb3J5LiAgKi8KLS0gIGludCBjYXRlZ29yeTsKLS0KLS0jaWZkZWYgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRQotLSAgLyogTmFtZSBvZiB0aGUgcmVsZXZhbnQgbG9jYWxlIGNhdGVnb3J5LCBvciAiIiBmb3IgdGhlIGdsb2JhbCBsb2NhbGUuICAqLwotLSAgY29uc3QgY2hhciAqbG9jYWxlbmFtZTsKLS0jZW5kaWYKLS0KLS0jaWZkZWYgSU5fTElCR0xPQ0FMRQotLSAgLyogVGhlIGNoYXJhY3RlciBlbmNvZGluZy4gICovCi0tICBjb25zdCBjaGFyICplbmNvZGluZzsKLS0jZW5kaWYKLS0KLS0gIC8qIFN0YXRlIG9mIHRoZSBjYXRhbG9nIGNvdW50ZXIgYXQgdGhlIHBvaW50IHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KLS0gIGludCBjb3VudGVyOwotLQotLSAgLyogQ2F0YWxvZyB3aGVyZSB0aGUgc3RyaW5nIHdhcyBmb3VuZC4gICovCi0tICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47Ci0tCi0tICAvKiBBbmQgZmluYWxseSB0aGUgdHJhbnNsYXRpb24uICAqLwotLSAgY29uc3QgY2hhciAqdHJhbnNsYXRpb247Ci0tICBzaXplX3QgdHJhbnNsYXRpb25fbGVuZ3RoOwotLQotLSAgLyogUG9pbnRlciB0byB0aGUgc3RyaW5nIGluIHF1ZXN0aW9uLiAgKi8KLS0gIGNoYXIgbXNnaWRbWkVST107Ci0tfTsKLS0KLS1nbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIHRyZWVfbG9jaykKLS0KLS0vKiBSb290IG9mIHRoZSBzZWFyY2ggdHJlZSB3aXRoIGtub3duIHRyYW5zbGF0aW9ucy4gICovCi0tc3RhdGljIHZvaWQgKnJvb3Q7Ci0tCi0tLyogRnVuY3Rpb24gdG8gY29tcGFyZSB0d28gZW50cmllcyBpbiB0aGUgdGFibGUgb2Yga25vd24gdHJhbnNsYXRpb25zLiAgKi8KLS1zdGF0aWMgaW50Ci0tdHJhbnNjbXAgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLS17Ci0tICBjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqczE7Ci0tICBjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqczI7Ci0tICBpbnQgcmVzdWx0OwotLQotLSAgczEgPSAoY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikgcDE7Ci0tICBzMiA9IChjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKSBwMjsKLS0KLS0gIHJlc3VsdCA9IHN0cmNtcCAoczEtPm1zZ2lkLCBzMi0+bXNnaWQpOwotLSAgaWYgKHJlc3VsdCA9PSAwKQotLSAgICB7Ci0tICAgICAgcmVzdWx0ID0gc3RyY21wIChzMS0+ZG9tYWlubmFtZSwgczItPmRvbWFpbm5hbWUpOwotLSAgICAgIGlmIChyZXN1bHQgPT0gMCkKLS0JewotLSNpZmRlZiBIQVZFX1BFUl9USFJFQURfTE9DQUxFCi0tCSAgcmVzdWx0ID0gc3RyY21wIChzMS0+bG9jYWxlbmFtZSwgczItPmxvY2FsZW5hbWUpOwotLQkgIGlmIChyZXN1bHQgPT0gMCkKLS0jZW5kaWYKLS0JICAgIHsKLS0jaWZkZWYgSU5fTElCR0xPQ0FMRQotLQkgICAgICByZXN1bHQgPSBzdHJjbXAgKHMxLT5lbmNvZGluZywgczItPmVuY29kaW5nKTsKLS0JICAgICAgaWYgKHJlc3VsdCA9PSAwKQotLSNlbmRpZgotLQkJLyogV2UgY29tcGFyZSB0aGUgY2F0ZWdvcnkgbGFzdCAodGhvdWdoIHRoaXMgaXMgdGhlIGNoZWFwZXN0Ci0tCQkgICBvcGVyYXRpb24pIHNpbmNlIGl0IGlzIGhvcGVmdWxseSBhbHdheXMgdGhlIHNhbWUgKG5hbWVseQotLQkJICAgTENfTUVTU0FHRVMpLiAgKi8KLS0JCXJlc3VsdCA9IHMxLT5jYXRlZ29yeSAtIHMyLT5jYXRlZ29yeTsKLS0JICAgIH0KLS0JfQotLSAgICB9Ci0tCi0tICByZXR1cm4gcmVzdWx0OwotLX0KLS0KLS0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCi0tICAgdGV4dGRvbWFpbigzKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzICJtZXNzYWdlcyIuICAqLwotLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSBhdHRyaWJ1dGVfaGlkZGVuID0gIm1lc3NhZ2VzIjsKLS0KLS0jaWZuZGVmIElOX0xJQkdMT0NBTEUKLS0vKiBWYWx1ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGRvbWFpbiBmb3IgZ2V0dGV4dCgzKS4gICovCi0tY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gYXR0cmlidXRlX2hpZGRlbgotLSAgICAgPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKLS0jZW5kaWYKLS0KLS0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi0tI2lmIGRlZmluZWQgX19FTVhfXwotLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKLS0jZWxzZQotLSMgaWZkZWYgX0xJQkMKLS1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW107Ci0tbGliY19oaWRkZW5fcHJvdG8gKF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0tIyBlbmRpZgotLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gTE9DQUxFRElSOwotLSMgaWZkZWYgX0xJQkMKLS1saWJjX2hpZGRlbl9kYXRhX2RlZiAoX25sX2RlZmF1bHRfZGlybmFtZSkKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBJTl9MSUJHTE9DQUxFCi0tLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMgY3JlYXRlZCBieSBiaW5kdGV4dGRvbWFpbigpCi0tICAgY2FsbHMuICAqLwotLXN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotLSNlbmRpZgotLQotLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi0tc3RhdGljIGNoYXIgKnBsdXJhbF9sb29rdXAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbiwKLS0JCQkgICAgdW5zaWduZWQgbG9uZyBpbnQgbiwKLS0JCQkgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS0KLS0jaWZkZWYgSU5fTElCR0xPQ0FMRQotLXN0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LAotLQkJCQkJIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSwKLS0JCQkJCSBjb25zdCBjaGFyICpsb2NhbGVuYW1lKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tI2Vsc2UKLS1zdGF0aWMgY29uc3QgY2hhciAqZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGludCBjYXRlZ29yeSwKLS0JCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS0jZW5kaWYKLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCi0tIyBkZWZpbmUgY2F0ZWdvcnlfdG9fbmFtZShjYXRlZ29yeSkgXAotLSAgX25sX2NhdGVnb3J5X25hbWVzLnN0ciArIF9ubF9jYXRlZ29yeV9uYW1lX2lkeHNbY2F0ZWdvcnldCi0tI2Vsc2UKLS1zdGF0aWMgY29uc3QgY2hhciAqY2F0ZWdvcnlfdG9fbmFtZSAoaW50IGNhdGVnb3J5KSBpbnRlcm5hbF9mdW5jdGlvbjsKLS0jZW5kaWYKLS0jaWYgKGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVikgJiYgIWRlZmluZWQgSU5fTElCR0xPQ0FMRQotLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfb3V0cHV0X2NoYXJzZXQgKHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tI2VuZGlmCi0tCi0tCi0tLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0tICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLS0jaWZkZWYgSEFWRV9BTExPQ0EKLS0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KLS0jIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCi0tIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KLS0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCi0tI2Vsc2UKLS1zdHJ1Y3QgYmxvY2tfbGlzdAotLXsKLS0gIHZvaWQgKmFkZHJlc3M7Ci0tICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKLS19OwotLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLS0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0tICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAotLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0tICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAotLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKLS0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLS0gICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKLS0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCi0tICAgIH0JCQkJCQkJCQkgICAgICBcCi0tICB9IHdoaWxlICgwKQotLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAotLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLS0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKLS0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKLS0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0tICAgICAgZnJlZSAob2xkLT5hZGRyZXNzKTsJCQkJCQkgICAgICBcCi0tICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAotLSAgICB9CQkJCQkJCQkJICAgICAgXAotLSAgfSB3aGlsZSAoMCkKLS0jIHVuZGVmIGFsbG9jYQotLSMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKLS0jIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQotLSNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLwotLQotLQotLSNpZmRlZiBfTElCQwotLS8qIExpc3Qgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgdHJhbnNsYXRpb25zLiAgKi8KLS10eXBlZGVmIHN0cnVjdCB0cmFuc21lbV9saXN0Ci0tewotLSAgc3RydWN0IHRyYW5zbWVtX2xpc3QgKm5leHQ7Ci0tICBjaGFyIGRhdGFbWkVST107Ci0tfSB0cmFuc21lbV9ibG9ja190OwotLXN0YXRpYyBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqdHJhbnNtZW1fbGlzdDsKLS0jZWxzZQotLXR5cGVkZWYgdW5zaWduZWQgY2hhciB0cmFuc21lbV9ibG9ja190OwotLSNlbmRpZgotLQotLQotLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLS0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0tICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0tICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAotLSNlbHNlCi0tIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKLS0jZW5kaWYKLS0KLS0vKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KLS1nbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkICgsIF9ubF9zdGF0ZV9sb2NrIGF0dHJpYnV0ZV9oaWRkZW4pCi0tCi0tLyogQ2hlY2tpbmcgd2hldGhlciB0aGUgYmluYXJpZXMgcnVucyBTVUlEIG11c3QgYmUgZG9uZSBhbmQgZ2xpYmMgcHJvdmlkZXMKLS0gICBlYXNpZXIgbWV0aG9kcyB0aGVyZWZvcmUgd2UgbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgRU5BQkxFX1NFQ1VSRSBfX2xpYmNfZW5hYmxlX3NlY3VyZQotLSMgZGVmaW5lIERFVEVSTUlORV9TRUNVUkUKLS0jZWxzZQotLSMgaWZuZGVmIEhBVkVfR0VUVUlECi0tIyAgZGVmaW5lIGdldHVpZCgpIDAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgSEFWRV9HRVRHSUQKLS0jICBkZWZpbmUgZ2V0Z2lkKCkgMAotLSMgZW5kaWYKLS0jIGlmbmRlZiBIQVZFX0dFVEVVSUQKLS0jICBkZWZpbmUgZ2V0ZXVpZCgpIGdldHVpZCgpCi0tIyBlbmRpZgotLSMgaWZuZGVmIEhBVkVfR0VURUdJRAotLSMgIGRlZmluZSBnZXRlZ2lkKCkgZ2V0Z2lkKCkKLS0jIGVuZGlmCi0tc3RhdGljIGludCBlbmFibGVfc2VjdXJlOwotLSMgZGVmaW5lIEVOQUJMRV9TRUNVUkUgKGVuYWJsZV9zZWN1cmUgPT0gMSkKLS0jIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFIFwKLS0gIGlmIChlbmFibGVfc2VjdXJlID09IDApCQkJCQkJICAgICAgXAotLSAgICB7CQkJCQkJCQkJICAgICAgXAotLSAgICAgIGlmIChnZXR1aWQgKCkgIT0gZ2V0ZXVpZCAoKSB8fCBnZXRnaWQgKCkgIT0gZ2V0ZWdpZCAoKSkJCSAgICAgIFwKLS0JZW5hYmxlX3NlY3VyZSA9IDE7CQkJCQkJICAgICAgXAotLSAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLS0JZW5hYmxlX3NlY3VyZSA9IC0xOwkJCQkJCSAgICAgIFwKLS0gICAgfQotLSNlbmRpZgotLQotLS8qIEdldCB0aGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUgdGhlIHBsdXJhbCBleHByZXNzaW9uLiAgKi8KLS0jaW5jbHVkZSAiZXZhbC1wbHVyYWwuaCIKLS0KLS0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLS0gICBDQVRFR09SWSBsb2NhbGUgYW5kLCBpZiBQTFVSQUwgaXMgbm9uemVybywgc2VhcmNoIG92ZXIgc3RyaW5nCi0tICAgZGVwZW5kaW5nIG9uIHRoZSBwbHVyYWwgZm9ybSBkZXRlcm1pbmVkIGJ5IE4uICAqLwotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tY2hhciAqCi0tZ2xfZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKLS0JICAgICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLAotLQkgICAgICAgaW50IHBsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgbiwKLS0JICAgICAgIGludCBjYXRlZ29yeSwKLS0JICAgICAgIGNvbnN0IGNoYXIgKmxvY2FsZW5hbWUsIGNvbnN0IGNoYXIgKmVuY29kaW5nKQotLSNlbHNlCi0tY2hhciAqCi0tRENJR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCi0tCSAgICBpbnQgcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBuLCBpbnQgY2F0ZWdvcnkpCi0tI2VuZGlmCi0tewotLSNpZm5kZWYgSEFWRV9BTExPQ0EKLS0gIHN0cnVjdCBibG9ja19saXN0ICpibG9ja19saXN0ID0gTlVMTDsKLS0jZW5kaWYKLS0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKLS0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotLSAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOwotLSAgY29uc3QgY2hhciAqY2F0ZWdvcnl2YWx1ZTsKLS0gIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci0tICBjaGFyICp4ZG9tYWlubmFtZTsKLS0gIGNoYXIgKnNpbmdsZV9sb2NhbGU7Ci0tICBjaGFyICpyZXR2YWw7Ci0tICBzaXplX3QgcmV0bGVuOwotLSAgaW50IHNhdmVkX2Vycm5vOwotLSAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnNlYXJjaDsKLS0gIHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqZm91bmRwID0gTlVMTDsKLS0gIHNpemVfdCBtc2dpZF9sZW47Ci0tI2lmIGRlZmluZWQgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRSAmJiAhZGVmaW5lZCBJTl9MSUJHTE9DQUxFCi0tICBjb25zdCBjaGFyICpsb2NhbGVuYW1lOwotLSNlbmRpZgotLSAgc2l6ZV90IGRvbWFpbm5hbWVfbGVuOwotLQotLSAgLyogSWYgbm8gcmVhbCBNU0dJRCBpcyBnaXZlbiByZXR1cm4gTlVMTC4gICovCi0tICBpZiAobXNnaWQxID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLQotLSNpZmRlZiBfTElCQwotLSAgaWYgKGNhdGVnb3J5IDwgMCB8fCBjYXRlZ29yeSA+PSBfX0xDX0xBU1QgfHwgY2F0ZWdvcnkgPT0gTENfQUxMKQotLSAgICAvKiBCb2d1cy4gICovCi0tICAgIHJldHVybiAocGx1cmFsID09IDAKLS0JICAgID8gKGNoYXIgKikgbXNnaWQxCi0tCSAgICAvKiBVc2UgdGhlIEdlcm1hbmljIHBsdXJhbCBydWxlLiAgKi8KLS0JICAgIDogbiA9PSAxID8gKGNoYXIgKikgbXNnaWQxIDogKGNoYXIgKikgbXNnaWQyKTsKLS0jZW5kaWYKLS0KLS0gIC8qIFByZXNlcnZlIHRoZSBgZXJybm8nIHZhbHVlLiAgKi8KLS0gIHNhdmVkX2Vycm5vID0gZXJybm87Ci0tCi0tICBnbF9yd2xvY2tfcmRsb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0tCi0tICAvKiBJZiBET01BSU5OQU1FIGlzIE5VTEwsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZWZhdWx0IGRvbWFpbi4gIElmCi0tICAgICBDQVRFR09SWSBpcyBub3QgTENfTUVTU0FHRVMgdGhpcyBtaWdodCBub3QgbWFrZSBtdWNoIHNlbnNlIGJ1dCB0aGUKLS0gICAgIGRlZmluaXRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCi0tICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotLSAgICBkb21haW5uYW1lID0gX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0tCi0tICAvKiBPUy8yIHNwZWNpZmljOiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgbGliaW50bCB2ZXJzaW9ucyAgKi8KLS0jaWZkZWYgTENfTUVTU0FHRVNfQ09NUEFUCi0tICBpZiAoY2F0ZWdvcnkgPT0gTENfTUVTU0FHRVNfQ09NUEFUKQotLSAgICBjYXRlZ29yeSA9IExDX01FU1NBR0VTOwotLSNlbmRpZgotLQotLSAgbXNnaWRfbGVuID0gc3RybGVuIChtc2dpZDEpICsgMTsKLS0KLS0gIC8qIFRyeSB0byBmaW5kIHRoZSB0cmFuc2xhdGlvbiBhbW9uZyB0aG9zZSB3aGljaCB3ZSBmb3VuZCBhdAotLSAgICAgc29tZSB0aW1lLiAgKi8KLS0gIHNlYXJjaCA9IChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKQotLQkgICBhbGxvY2EgKG9mZnNldG9mIChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCwgbXNnaWQpICsgbXNnaWRfbGVuKTsKLS0gIG1lbWNweSAoc2VhcmNoLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOwotLSAgc2VhcmNoLT5kb21haW5uYW1lID0gZG9tYWlubmFtZTsKLS0gIHNlYXJjaC0+Y2F0ZWdvcnkgPSBjYXRlZ29yeTsKLS0jaWZkZWYgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRQotLSMgaWZuZGVmIElOX0xJQkdMT0NBTEUKLS0jICBpZmRlZiBfTElCQwotLSAgbG9jYWxlbmFtZSA9IF9fY3VycmVudF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnkpOwotLSMgIGVsc2UKLS0jICAgaWYgSEFWRV9OTF9MT0NBTEVfTkFNRQotLSAgLyogTkxfTE9DQUxFX05BTUUgaXMgcHVibGljIGdsaWJjIEFQSSBpbnRyb2R1Y2VkIGluIGdsaWJjLTIuNC4gICovCi0tICBsb2NhbGVuYW1lID0gbmxfbGFuZ2luZm8gKE5MX0xPQ0FMRV9OQU1FIChjYXRlZ29yeSkpOwotLSMgICBlbHNlCi0tIyAgICBpZiBIQVZFX1NUUlVDVF9fX0xPQ0FMRV9TVFJVQ1RfX19OQU1FUyAmJiBkZWZpbmVkIFVTRV9JTl9HRVRURVhUX1RFU1RTCi0tICAvKiBUaGUgX19uYW1lcyBmaWVsZCBpcyBub3QgcHVibGljIGdsaWJjIEFQSSBhbmQgbXVzdCB0aGVyZWZvcmUgbm90IGJlIHVzZWQKLS0gICAgIGluIGNvZGUgdGhhdCBpcyBpbnN0YWxsZWQgaW4gcHVibGljIGxvY2F0aW9ucy4gICovCi0tICB7Ci0tICAgIGxvY2FsZV90IHRocmVhZF9sb2NhbGUgPSB1c2Vsb2NhbGUgKE5VTEwpOwotLSAgICBpZiAodGhyZWFkX2xvY2FsZSAhPSBMQ19HTE9CQUxfTE9DQUxFKQotLSAgICAgIGxvY2FsZW5hbWUgPSB0aHJlYWRfbG9jYWxlLT5fX25hbWVzW2NhdGVnb3J5XTsKLS0gICAgZWxzZQotLSAgICAgIGxvY2FsZW5hbWUgPSAiIjsKLS0gIH0KLS0jICAgIGVuZGlmCi0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tICBzZWFyY2gtPmxvY2FsZW5hbWUgPSBsb2NhbGVuYW1lOwotLSMgaWZkZWYgSU5fTElCR0xPQ0FMRQotLSAgc2VhcmNoLT5lbmNvZGluZyA9IGVuY29kaW5nOwotLSMgZW5kaWYKLS0KLS0gIC8qIFNpbmNlIHRmaW5kL3RzZWFyY2ggbWFuYWdlIGEgYmFsYW5jZWQgdHJlZSwgY29uY3VycmVudCB0ZmluZCBhbmQKLS0gICAgIHRzZWFyY2ggY2FsbHMgY2FuIGJlIGZhdGFsLiAgKi8KLS0gIGdsX3J3bG9ja19yZGxvY2sgKHRyZWVfbG9jayk7Ci0tCi0tICBmb3VuZHAgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKiopIHRmaW5kIChzZWFyY2gsICZyb290LCB0cmFuc2NtcCk7Ci0tCi0tICBnbF9yd2xvY2tfdW5sb2NrICh0cmVlX2xvY2spOwotLQotLSAgZnJlZWEgKHNlYXJjaCk7Ci0tICBpZiAoZm91bmRwICE9IE5VTEwgJiYgKCpmb3VuZHApLT5jb3VudGVyID09IF9ubF9tc2dfY2F0X2NudHIpCi0tICAgIHsKLS0gICAgICAvKiBOb3cgZGVhbCB3aXRoIHBsdXJhbC4gICovCi0tICAgICAgaWYgKHBsdXJhbCkKLS0JcmV0dmFsID0gcGx1cmFsX2xvb2t1cCAoKCpmb3VuZHApLT5kb21haW4sIG4sICgqZm91bmRwKS0+dHJhbnNsYXRpb24sCi0tCQkJCSgqZm91bmRwKS0+dHJhbnNsYXRpb25fbGVuZ3RoKTsKLS0gICAgICBlbHNlCi0tCXJldHZhbCA9IChjaGFyICopICgqZm91bmRwKS0+dHJhbnNsYXRpb247Ci0tCi0tICAgICAgZ2xfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOwotLSAgICAgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0tICAgICAgcmV0dXJuIHJldHZhbDsKLS0gICAgfQotLSNlbmRpZgotLQotLSAgLyogU2VlIHdoZXRoZXIgdGhpcyBpcyBhIFNVSUQgYmluYXJ5IG9yIG5vdC4gICovCi0tICBERVRFUk1JTkVfU0VDVVJFOwotLQotLSAgLyogRmlyc3QgZmluZCBtYXRjaGluZyBiaW5kaW5nLiAgKi8KLS0jaWZkZWYgSU5fTElCR0xPQ0FMRQotLSAgLyogV2UgY2FuIHVzZSBhIHRyaXZpYWwgYmluZGluZywgc2luY2UgX25sX2ZpbmRfbXNnIHdpbGwgaWdub3JlIGl0IGFueXdheSwKLS0gICAgIGFuZCBfbmxfbG9hZF9kb21haW4gYW5kIF9ubF9maW5kX2RvbWFpbiBqdXN0IHBhc3MgaXQgdGhyb3VnaC4gICovCi0tICBiaW5kaW5nID0gTlVMTDsKLS0gIGRpcm5hbWUgPSBiaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgTlVMTCk7Ci0tI2Vsc2UKLS0gIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCi0tICAgIHsKLS0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7Ci0tICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKLS0JLyogV2UgZm91bmQgaXQhICAqLwotLQlicmVhazsKLS0gICAgICBpZiAoY29tcGFyZSA8IDApCi0tCXsKLS0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLwotLQkgIGJpbmRpbmcgPSBOVUxMOwotLQkgIGJyZWFrOwotLQl9Ci0tICAgIH0KLS0KLS0gIGlmIChiaW5kaW5nID09IE5VTEwpCi0tICAgIGRpcm5hbWUgPSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgZGlybmFtZSA9IGJpbmRpbmctPmRpcm5hbWU7Ci0tI2VuZGlmCi0tICAgICAgaWYgKCFJU19BQlNPTFVURV9QQVRIIChkaXJuYW1lKSkKLS0JewotLQkgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLwotLQkgIHNpemVfdCBkaXJuYW1lX2xlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotLQkgIHNpemVfdCBwYXRoX21heDsKLS0JICBjaGFyICpyZXNvbHZlZF9kaXJuYW1lOwotLQkgIGNoYXIgKnJldDsKLS0KLS0JICBwYXRoX21heCA9ICh1bnNpZ25lZCBpbnQpIFBBVEhfTUFYOwotLQkgIHBhdGhfbWF4ICs9IDI7CQkvKiBUaGUgZ2V0Y3dkIGRvY3Mgc2F5IHRvIGRvIHRoaXMuICAqLwotLQotLQkgIGZvciAoOzspCi0tCSAgICB7Ci0tCSAgICAgIHJlc29sdmVkX2Rpcm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHBhdGhfbWF4ICsgZGlybmFtZV9sZW4pOwotLQkgICAgICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHRtcF9kaXJuYW1lKTsKLS0KLS0JICAgICAgX19zZXRfZXJybm8gKDApOwotLQkgICAgICByZXQgPSBnZXRjd2QgKHJlc29sdmVkX2Rpcm5hbWUsIHBhdGhfbWF4KTsKLS0JICAgICAgaWYgKHJldCAhPSBOVUxMIHx8IGVycm5vICE9IEVSQU5HRSkKLS0JCWJyZWFrOwotLQotLQkgICAgICBwYXRoX21heCArPSBwYXRoX21heCAvIDI7Ci0tCSAgICAgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKLS0JICAgIH0KLS0KLS0JICBpZiAocmV0ID09IE5VTEwpCi0tCSAgICAvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCi0tCSAgICAgICBlcnJvciBidXQgc2ltcGx5IHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcuICAqLwotLQkgICAgZ290byByZXR1cm5fdW50cmFuc2xhdGVkOwotLQotLQkgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKHJlc29sdmVkX2Rpcm5hbWUsICdcMCcpLCAiLyIpLCBkaXJuYW1lKTsKLS0JICBkaXJuYW1lID0gcmVzb2x2ZWRfZGlybmFtZTsKLS0JfQotLSNpZm5kZWYgSU5fTElCR0xPQ0FMRQotLSAgICB9Ci0tI2VuZGlmCi0tCi0tICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBzeW1ib2xpYyBuYW1lIG9mIENBVEVHT1JZIGFuZCBpdHMgdmFsdWUuICAqLwotLSAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOwotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUsIGxvY2FsZW5hbWUpOwotLSNlbHNlCi0tICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOwotLSNlbmRpZgotLQotLSAgZG9tYWlubmFtZV9sZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpOwotLSAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQotLQkJCQkgKyBkb21haW5uYW1lX2xlbiArIDUpOwotLSAgQUREX0JMT0NLIChibG9ja19saXN0LCB4ZG9tYWlubmFtZSk7Ci0tCi0tICBzdHBjcHkgKChjaGFyICopIG1lbXBjcHkgKHN0cGNweSAoc3RwY3B5ICh4ZG9tYWlubmFtZSwgY2F0ZWdvcnluYW1lKSwgIi8iKSwKLS0JCQkgICAgZG9tYWlubmFtZSwgZG9tYWlubmFtZV9sZW4pLAotLQkgICIubW8iKTsKLS0KLS0gIC8qIENyZWF0aW5nIHdvcmtpbmcgYXJlYS4gICovCi0tICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7Ci0tICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHNpbmdsZV9sb2NhbGUpOwotLQotLQotLSAgLyogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhpcyBpcyBhIGxvb3AgYmVjYXVzZSB3ZSBwZXJoYXBzCi0tICAgICBnb3QgYW4gb3JkZXJlZCBsaXN0IG9mIGxhbmd1YWdlcyB0byBjb25zaWRlciBmb3IgdGhlIHRyYW5zbGF0aW9uLiAgKi8KLS0gIHdoaWxlICgxKQotLSAgICB7Ci0tICAgICAgLyogTWFrZSBDQVRFR09SWVZBTFVFIHBvaW50IHRvIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QuICAqLwotLSAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCi0tCSsrY2F0ZWdvcnl2YWx1ZTsKLS0gICAgICBpZiAoY2F0ZWdvcnl2YWx1ZVswXSA9PSAnXDAnKQotLQl7Ci0tCSAgLyogVGhlIHdob2xlIGNvbnRlbnRzIG9mIENBVEVHT1JZVkFMVUUgaGFzIGJlZW4gc2VhcmNoZWQgYnV0Ci0tCSAgICAgbm8gdmFsaWQgZW50cnkgaGFzIGJlZW4gZm91bmQuICBXZSBzb2x2ZSB0aGlzIHNpdHVhdGlvbgotLQkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCi0tCSAgICAgd2lsbCB0YWtlIHBsYWNlLiAgKi8KLS0JICBzaW5nbGVfbG9jYWxlWzBdID0gJ0MnOwotLQkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOwotLQl9Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgY2hhciAqY3AgPSBzaW5nbGVfbG9jYWxlOwotLQkgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSAhPSAnOicpCi0tCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7Ci0tCSAgKmNwID0gJ1wwJzsKLS0KLS0JICAvKiBXaGVuIHRoaXMgaXMgYSBTVUlEIGJpbmFyeSB3ZSBtdXN0IG5vdCBhbGxvdyBhY2Nlc3NpbmcgZmlsZXMKLS0JICAgICBvdXRzaWRlIHRoZSBkZWRpY2F0ZWQgZGlyZWN0b3JpZXMuICAqLwotLQkgIGlmIChFTkFCTEVfU0VDVVJFICYmIElTX1BBVEhfV0lUSF9ESVIgKHNpbmdsZV9sb2NhbGUpKQotLQkgICAgLyogSW5nb3JlIHRoaXMgZW50cnkuICAqLwotLQkgICAgY29udGludWU7Ci0tCX0KLS0KLS0gICAgICAvKiBJZiB0aGUgY3VycmVudCBsb2NhbGUgdmFsdWUgaXMgQyAob3IgUE9TSVgpIHdlIGRvbid0IGxvYWQgYQotLQkgZG9tYWluLiAgUmV0dXJuIHRoZSBNU0dJRC4gICovCi0tICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCi0tCSAgfHwgc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiUE9TSVgiKSA9PSAwKQotLQlicmVhazsKLS0KLS0gICAgICAvKiBGaW5kIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgbWF0Y2hpbmcgdGhlCi0tCSBET01BSU5OQU1FIGFuZCBDQVRFR09SWS4gICovCi0tICAgICAgZG9tYWluID0gX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBzaW5nbGVfbG9jYWxlLCB4ZG9tYWlubmFtZSwgYmluZGluZyk7Ci0tCi0tICAgICAgaWYgKGRvbWFpbiAhPSBOVUxMKQotLQl7Ci0tI2lmIGRlZmluZWQgSU5fTElCR0xPQ0FMRQotLQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLCBiaW5kaW5nLCBlbmNvZGluZywgbXNnaWQxLCAmcmV0bGVuKTsKLS0jZWxzZQotLQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLCBiaW5kaW5nLCBtc2dpZDEsIDEsICZyZXRsZW4pOwotLSNlbmRpZgotLQotLQkgIGlmIChyZXR2YWwgPT0gTlVMTCkKLS0JICAgIHsKLS0JICAgICAgaW50IGNudDsKLS0KLS0JICAgICAgZm9yIChjbnQgPSAwOyBkb21haW4tPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotLQkJewotLSNpZiBkZWZpbmVkIElOX0xJQkdMT0NBTEUKLS0JCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBiaW5kaW5nLAotLQkJCQkJIGVuY29kaW5nLCBtc2dpZDEsICZyZXRsZW4pOwotLSNlbHNlCi0tCQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLT5zdWNjZXNzb3JbY250XSwgYmluZGluZywKLS0JCQkJCSBtc2dpZDEsIDEsICZyZXRsZW4pOwotLSNlbmRpZgotLQotLQkJICBpZiAocmV0dmFsICE9IE5VTEwpCi0tCQkgICAgewotLQkJICAgICAgZG9tYWluID0gZG9tYWluLT5zdWNjZXNzb3JbY250XTsKLS0JCSAgICAgIGJyZWFrOwotLQkJICAgIH0KLS0JCX0KLS0JICAgIH0KLS0KLS0JICAvKiBSZXR1cm5pbmcgLTEgbWVhbnMgdGhhdCBzb21lIHJlc291cmNlIHByb2JsZW0gZXhpc3RzCi0tCSAgICAgKGxpa2VseSBtZW1vcnkpIGFuZCB0aGF0IHRoZSBzdHJpbmdzIGNvdWxkIG5vdCBiZQotLQkgICAgIGNvbnZlcnRlZC4gIFJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5ncy4gICovCi0tCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJldHZhbCA9PSAoY2hhciAqKSAtMSwgMCkpCi0tCSAgICBicmVhazsKLS0KLS0JICBpZiAocmV0dmFsICE9IE5VTEwpCi0tCSAgICB7Ci0tCSAgICAgIC8qIEZvdW5kIHRoZSB0cmFuc2xhdGlvbiBvZiBNU0dJRDEgaW4gZG9tYWluIERPTUFJTjoKLS0JCSBzdGFydGluZyBhdCBSRVRWQUwsIFJFVExFTiBieXRlcy4gICovCi0tCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLS0JICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMKQotLQkJewotLQkJICAvKiBDcmVhdGUgYSBuZXcgZW50cnkgYW5kIGFkZCBpdCB0byB0aGUgc2VhcmNoIHRyZWUuICAqLwotLQkJICBzaXplX3Qgc2l6ZTsKLS0JCSAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKm5ld3A7Ci0tCi0tCQkgIHNpemUgPSBvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKQotLQkJCSArIG1zZ2lkX2xlbiArIGRvbWFpbm5hbWVfbGVuICsgMTsKLS0jaWZkZWYgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRQotLQkJICBzaXplICs9IHN0cmxlbiAobG9jYWxlbmFtZSkgKyAxOwotLSNlbmRpZgotLQkJICBuZXdwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIG1hbGxvYyAoc2l6ZSk7Ci0tCQkgIGlmIChuZXdwICE9IE5VTEwpCi0tCQkgICAgewotLQkJICAgICAgY2hhciAqbmV3X2RvbWFpbm5hbWU7Ci0tI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLS0JCSAgICAgIGNoYXIgKm5ld19sb2NhbGVuYW1lOwotLSNlbmRpZgotLQotLQkJICAgICAgbmV3X2RvbWFpbm5hbWUgPQotLQkJCShjaGFyICopIG1lbXBjcHkgKG5ld3AtPm1zZ2lkLCBtc2dpZDEsIG1zZ2lkX2xlbik7Ci0tCQkgICAgICBtZW1jcHkgKG5ld19kb21haW5uYW1lLCBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiArIDEpOwotLSNpZmRlZiBIQVZFX1BFUl9USFJFQURfTE9DQUxFCi0tCQkgICAgICBuZXdfbG9jYWxlbmFtZSA9IG5ld19kb21haW5uYW1lICsgZG9tYWlubmFtZV9sZW4gKyAxOwotLQkJICAgICAgc3RyY3B5IChuZXdfbG9jYWxlbmFtZSwgbG9jYWxlbmFtZSk7Ci0tI2VuZGlmCi0tCQkgICAgICBuZXdwLT5kb21haW5uYW1lID0gbmV3X2RvbWFpbm5hbWU7Ci0tCQkgICAgICBuZXdwLT5jYXRlZ29yeSA9IGNhdGVnb3J5OwotLSNpZmRlZiBIQVZFX1BFUl9USFJFQURfTE9DQUxFCi0tCQkgICAgICBuZXdwLT5sb2NhbGVuYW1lID0gbmV3X2xvY2FsZW5hbWU7Ci0tI2VuZGlmCi0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS0JCSAgICAgIG5ld3AtPmVuY29kaW5nID0gZW5jb2Rpbmc7Ci0tI2VuZGlmCi0tCQkgICAgICBuZXdwLT5jb3VudGVyID0gX25sX21zZ19jYXRfY250cjsKLS0JCSAgICAgIG5ld3AtPmRvbWFpbiA9IGRvbWFpbjsKLS0JCSAgICAgIG5ld3AtPnRyYW5zbGF0aW9uID0gcmV0dmFsOwotLQkJICAgICAgbmV3cC0+dHJhbnNsYXRpb25fbGVuZ3RoID0gcmV0bGVuOwotLQotLQkJICAgICAgZ2xfcndsb2NrX3dybG9jayAodHJlZV9sb2NrKTsKLS0KLS0JCSAgICAgIC8qIEluc2VydCB0aGUgZW50cnkgaW4gdGhlIHNlYXJjaCB0cmVlLiAgKi8KLS0JCSAgICAgIGZvdW5kcCA9IChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKikKLS0JCQl0c2VhcmNoIChuZXdwLCAmcm9vdCwgdHJhbnNjbXApOwotLQotLQkJICAgICAgZ2xfcndsb2NrX3VubG9jayAodHJlZV9sb2NrKTsKLS0KLS0JCSAgICAgIGlmIChmb3VuZHAgPT0gTlVMTAotLQkJCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKmZvdW5kcCAhPSBuZXdwLCAwKSkKLS0JCQkvKiBUaGUgaW5zZXJ0IGZhaWxlZC4gICovCi0tCQkJZnJlZSAobmV3cCk7Ci0tCQkgICAgfQotLQkJfQotLQkgICAgICBlbHNlCi0tCQl7Ci0tCQkgIC8qIFdlIGNhbiB1cGRhdGUgdGhlIGV4aXN0aW5nIGVudHJ5LiAgKi8KLS0JCSAgKCpmb3VuZHApLT5jb3VudGVyID0gX25sX21zZ19jYXRfY250cjsKLS0JCSAgKCpmb3VuZHApLT5kb21haW4gPSBkb21haW47Ci0tCQkgICgqZm91bmRwKS0+dHJhbnNsYXRpb24gPSByZXR2YWw7Ci0tCQkgICgqZm91bmRwKS0+dHJhbnNsYXRpb25fbGVuZ3RoID0gcmV0bGVuOwotLQkJfQotLQotLQkgICAgICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotLQotLQkgICAgICAvKiBOb3cgZGVhbCB3aXRoIHBsdXJhbC4gICovCi0tCSAgICAgIGlmIChwbHVyYWwpCi0tCQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwIChkb21haW4sIG4sIHJldHZhbCwgcmV0bGVuKTsKLS0KLS0JICAgICAgZ2xfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOwotLQkgICAgICByZXR1cm4gcmV0dmFsOwotLQkgICAgfQotLQl9Ci0tICAgIH0KLS0KLS0gcmV0dXJuX3VudHJhbnNsYXRlZDoKLS0gIC8qIFJldHVybiB0aGUgdW50cmFuc2xhdGVkIE1TR0lELiAgKi8KLS0gIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLS0gIGdsX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLS0jaWZuZGVmIF9MSUJDCi0tICBpZiAoIUVOQUJMRV9TRUNVUkUpCi0tICAgIHsKLS0gICAgICBleHRlcm4gdm9pZCBfbmxfbG9nX3VudHJhbnNsYXRlZCAoY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsCi0tCQkJCQljb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkJCQkJY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCi0tCQkJCQlpbnQgcGx1cmFsKTsKLS0gICAgICBjb25zdCBjaGFyICpsb2dmaWxlbmFtZSA9IGdldGVudiAoIkdFVFRFWFRfTE9HX1VOVFJBTlNMQVRFRCIpOwotLQotLSAgICAgIGlmIChsb2dmaWxlbmFtZSAhPSBOVUxMICYmIGxvZ2ZpbGVuYW1lWzBdICE9ICdcMCcpCi0tCV9ubF9sb2dfdW50cmFuc2xhdGVkIChsb2dmaWxlbmFtZSwgZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIHBsdXJhbCk7Ci0tICAgIH0KLS0jZW5kaWYKLS0gIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0tICByZXR1cm4gKHBsdXJhbCA9PSAwCi0tCSAgPyAoY2hhciAqKSBtc2dpZDEKLS0JICAvKiBVc2UgdGhlIEdlcm1hbmljIHBsdXJhbCBydWxlLiAgKi8KLS0JICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7Ci0tfQotLQotLQotLS8qIExvb2sgdXAgdGhlIHRyYW5zbGF0aW9uIG9mIG1zZ2lkIHdpdGhpbiBET01BSU5fRklMRSBhbmQgRE9NQUlOQklORElORy4KLS0gICBSZXR1cm4gaXQgaWYgZm91bmQuICBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQgb3IgaW4gY2FzZSBvZiBhIGNvbnZlcnNpb24KLS0gICBmYWlsdXJlIChwcm9ibGVtIGluIHRoZSBwYXJ0aWN1bGFyIG1lc3NhZ2UgY2F0YWxvZykuICBSZXR1cm4gKGNoYXIgKikgLTEKLS0gICBpbiBjYXNlIG9mIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBkdXJpbmcgY29udmVyc2lvbiAob25seSBpZgotLSAgIEVOQ09ESU5HICE9IE5VTEwgcmVzcC4gQ09OVkVSVCA9PSB0cnVlKS4gICovCi0tY2hhciAqCi0taW50ZXJuYWxfZnVuY3Rpb24KLS0jaWZkZWYgSU5fTElCR0xPQ0FMRQotLV9ubF9maW5kX21zZyAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCi0tCSAgICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICplbmNvZGluZywKLS0JICAgICAgY29uc3QgY2hhciAqbXNnaWQsCi0tCSAgICAgIHNpemVfdCAqbGVuZ3RocCkKLS0jZWxzZQotLV9ubF9maW5kX21zZyAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCi0tCSAgICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLAotLQkgICAgICBjb25zdCBjaGFyICptc2dpZCwgaW50IGNvbnZlcnQsCi0tCSAgICAgIHNpemVfdCAqbGVuZ3RocCkKLS0jZW5kaWYKLS17Ci0tICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLS0gIHNpemVfdCBhY3Q7Ci0tICBjaGFyICpyZXN1bHQ7Ci0tICBzaXplX3QgcmVzdWx0bGVuOwotLQotLSAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkIDw9IDApCi0tICAgIF9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcpOwotLQotLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLQotLSAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOwotLQotLSAgbnN0cmluZ3MgPSBkb21haW4tPm5zdHJpbmdzOwotLQotLSAgLyogTG9jYXRlIHRoZSBNU0dJRCBhbmQgaXRzIHRyYW5zbGF0aW9uLiAgKi8KLS0gIGlmIChkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICAvKiBVc2UgdGhlIGhhc2hpbmcgdGFibGUuICAqLwotLSAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7Ci0tICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IF9faGFzaF9zdHJpbmcgKG1zZ2lkKTsKLS0gICAgICBubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7Ci0tICAgICAgbmxzX3VpbnQzMiBpbmNyID0gMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKLS0KLS0gICAgICB3aGlsZSAoMSkKLS0JewotLQkgIG5sc191aW50MzIgbnN0ciA9Ci0tCSAgICBXIChkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKLS0KLS0JICBpZiAobnN0ciA9PSAwKQotLQkgICAgLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCi0tCSAgICByZXR1cm4gTlVMTDsKLS0KLS0JICBuc3RyLS07Ci0tCi0tCSAgLyogQ29tcGFyZSBtc2dpZCB3aXRoIHRoZSBvcmlnaW5hbCBzdHJpbmcgYXQgaW5kZXggbnN0ci4KLS0JICAgICBXZSBjb21wYXJlIHRoZSBsZW5ndGhzIHdpdGggPj0sIG5vdCA9PSwgYmVjYXVzZSBwbHVyYWwgZW50cmllcwotLQkgICAgIGFyZSByZXByZXNlbnRlZCBieSBzdHJpbmdzIHdpdGggYW4gZW1iZWRkZWQgTlVMLiAgKi8KLS0JICBpZiAobnN0ciA8IG5zdHJpbmdzCi0tCSAgICAgID8gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ubGVuZ3RoKSA+PSBsZW4KLS0JCSYmIChzdHJjbXAgKG1zZ2lkLAotLQkJCSAgICBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLS0JCQkJCSAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ub2Zmc2V0KSkKLS0JCSAgICA9PSAwKQotLQkgICAgICA6IGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiW25zdHIgLSBuc3RyaW5nc10ubGVuZ3RoID4gbGVuCi0tCQkmJiAoc3RyY21wIChtc2dpZCwKLS0JCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWJbbnN0ciAtIG5zdHJpbmdzXS5wb2ludGVyKQotLQkJICAgID09IDApKQotLQkgICAgewotLQkgICAgICBhY3QgPSBuc3RyOwotLQkgICAgICBnb3RvIGZvdW5kOwotLQkgICAgfQotLQotLQkgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQotLQkgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKLS0JICBlbHNlCi0tCSAgICBpZHggKz0gaW5jcjsKLS0JfQotLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogVHJ5IHRoZSBkZWZhdWx0IG1ldGhvZDogIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHNvcnRlZCBhcnJheSBvZgotLQkgbWVzc2FnZXMuICAqLwotLSAgICAgIHNpemVfdCB0b3AsIGJvdHRvbTsKLS0KLS0gICAgICBib3R0b20gPSAwOwotLSAgICAgIHRvcCA9IG5zdHJpbmdzOwotLSAgICAgIHdoaWxlIChib3R0b20gPCB0b3ApCi0tCXsKLS0JICBpbnQgY21wX3ZhbDsKLS0KLS0JICBhY3QgPSAoYm90dG9tICsgdG9wKSAvIDI7Ci0tCSAgY21wX3ZhbCA9IHN0cmNtcCAobXNnaWQsIChkb21haW4tPmRhdGEKLS0JCQkJICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0tCQkJCQkgZG9tYWluLT5vcmlnX3RhYlthY3RdLm9mZnNldCkpKTsKLS0JICBpZiAoY21wX3ZhbCA8IDApCi0tCSAgICB0b3AgPSBhY3Q7Ci0tCSAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCi0tCSAgICBib3R0b20gPSBhY3QgKyAxOwotLQkgIGVsc2UKLS0JICAgIGdvdG8gZm91bmQ7Ci0tCX0KLS0gICAgICAvKiBObyB0cmFuc2xhdGlvbiB3YXMgZm91bmQuICAqLwotLSAgICAgIHJldHVybiBOVUxMOwotLSAgICB9Ci0tCi0tIGZvdW5kOgotLSAgLyogVGhlIHRyYW5zbGF0aW9uIHdhcyBmb3VuZCBhdCBpbmRleCBBQ1QuICBJZiB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlCi0tICAgICBzdHJpbmcgdG8gdXNlIGEgZGlmZmVyZW50IGNoYXJhY3RlciBzZXQsIHRoaXMgaXMgdGhlIHRpbWUuICAqLwotLSAgaWYgKGFjdCA8IG5zdHJpbmdzKQotLSAgICB7Ci0tICAgICAgcmVzdWx0ID0gKGNoYXIgKikKLS0JKGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYlthY3RdLm9mZnNldCkpOwotLSAgICAgIHJlc3VsdGxlbiA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYlthY3RdLmxlbmd0aCkgKyAxOwotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICByZXN1bHQgPSAoY2hhciAqKSBkb21haW4tPnRyYW5zX3N5c2RlcF90YWJbYWN0IC0gbnN0cmluZ3NdLnBvaW50ZXI7Ci0tICAgICAgcmVzdWx0bGVuID0gZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5sZW5ndGg7Ci0tICAgIH0KLS0KLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX0lDT05WCi0tIyBpZmRlZiBJTl9MSUJHTE9DQUxFCi0tICBpZiAoZW5jb2RpbmcgIT0gTlVMTCkKLS0jIGVsc2UKLS0gIGlmIChjb252ZXJ0KQotLSMgZW5kaWYKLS0gICAgewotLSAgICAgIC8qIFdlIGFyZSBzdXBwb3NlZCB0byBkbyBhIGNvbnZlcnNpb24uICAqLwotLSMgaWZuZGVmIElOX0xJQkdMT0NBTEUKLS0gICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IGdldF9vdXRwdXRfY2hhcnNldCAoZG9tYWluYmluZGluZyk7Ci0tIyBlbmRpZgotLSAgICAgIHNpemVfdCBuY29udmVyc2lvbnM7Ci0tICAgICAgc3RydWN0IGNvbnZlcnRlZF9kb21haW4gKmNvbnZkOwotLSAgICAgIHNpemVfdCBpOwotLQotLSAgICAgIC8qIFByb3RlY3QgYWdhaW5zdCByZWFsbG9jYXRpb24gb2YgdGhlIHRhYmxlLiAgKi8KLS0gICAgICBnbF9yd2xvY2tfcmRsb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQotLSAgICAgIC8qIFNlYXJjaCB3aGV0aGVyIGEgdGFibGUgd2l0aCBjb252ZXJ0ZWQgdHJhbnNsYXRpb25zIGZvciB0aGlzCi0tCSBlbmNvZGluZyBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4gICovCi0tICAgICAgbmNvbnZlcnNpb25zID0gZG9tYWluLT5uY29udmVyc2lvbnM7Ci0tICAgICAgY29udmQgPSBOVUxMOwotLQotLSAgICAgIGZvciAoaSA9IG5jb252ZXJzaW9uczsgaSA+IDA7ICkKLS0JewotLQkgIGktLTsKLS0JICBpZiAoc3RyY21wIChkb21haW4tPmNvbnZlcnNpb25zW2ldLmVuY29kaW5nLCBlbmNvZGluZykgPT0gMCkKLS0JICAgIHsKLS0JICAgICAgY29udmQgPSAmZG9tYWluLT5jb252ZXJzaW9uc1tpXTsKLS0JICAgICAgYnJlYWs7Ci0tCSAgICB9Ci0tCX0KLS0KLS0gICAgICBnbF9yd2xvY2tfdW5sb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQotLSAgICAgIGlmIChjb252ZCA9PSBOVUxMKQotLQl7Ci0tCSAgLyogV2UgaGF2ZSB0byBhbGxvY2F0ZSBhIG5ldyBjb252ZXJzaW9ucyB0YWJsZS4gICovCi0tCSAgZ2xfcndsb2NrX3dybG9jayAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLS0KLS0JICAvKiBNYXliZSBpbiB0aGUgbWVhbnRpbWUgc29tZWJvZHkgYWRkZWQgdGhlIHRyYW5zbGF0aW9uLgotLQkgICAgIFJlY2hlY2suICAqLwotLQkgIGZvciAoaSA9IG5jb252ZXJzaW9uczsgaSA+IDA7ICkKLS0JICAgIHsKLS0JICAgICAgaS0tOwotLQkgICAgICBpZiAoc3RyY21wIChkb21haW4tPmNvbnZlcnNpb25zW2ldLmVuY29kaW5nLCBlbmNvZGluZykgPT0gMCkKLS0JCXsKLS0JCSAgY29udmQgPSAmZG9tYWluLT5jb252ZXJzaW9uc1tpXTsKLS0JCSAgZ290byBmb3VuZF9jb252ZDsKLS0JCX0KLS0JICAgIH0KLS0KLS0JICB7Ci0tCSAgICAvKiBBbGxvY2F0ZSBhIHRhYmxlIGZvciB0aGUgY29udmVydGVkIHRyYW5zbGF0aW9ucyBmb3IgdGhpcwotLQkgICAgICAgZW5jb2RpbmcuICAqLwotLQkgICAgc3RydWN0IGNvbnZlcnRlZF9kb21haW4gKm5ld19jb252ZXJzaW9ucyA9Ci0tCSAgICAgIChzdHJ1Y3QgY29udmVydGVkX2RvbWFpbiAqKQotLQkgICAgICAoZG9tYWluLT5jb252ZXJzaW9ucyAhPSBOVUxMCi0tCSAgICAgICA/IHJlYWxsb2MgKGRvbWFpbi0+Y29udmVyc2lvbnMsCi0tCQkJICAobmNvbnZlcnNpb25zICsgMSkgKiBzaXplb2YgKHN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluKSkKLS0JICAgICAgIDogbWFsbG9jICgobmNvbnZlcnNpb25zICsgMSkgKiBzaXplb2YgKHN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluKSkpOwotLQotLQkgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKG5ld19jb252ZXJzaW9ucyA9PSBOVUxMLCAwKSkKLS0JICAgICAgewotLQkJLyogTm90aGluZyB3ZSBjYW4gZG8sIG5vIG1vcmUgbWVtb3J5LiAgV2UgY2Fubm90IHVzZSB0aGUKLS0JCSAgIHRyYW5zbGF0aW9uIGJlY2F1c2UgaXQgbWlnaHQgYmUgZW5jb2RlZCBpbmNvcnJlY3RseS4gICovCi0tCSAgICAgIHVubG9ja19mYWlsOgotLQkJZ2xfcndsb2NrX3VubG9jayAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLS0JCXJldHVybiAoY2hhciAqKSAtMTsKLS0JICAgICAgfQotLQotLQkgICAgZG9tYWluLT5jb252ZXJzaW9ucyA9IG5ld19jb252ZXJzaW9uczsKLS0KLS0JICAgIC8qIENvcHkgdGhlICdlbmNvZGluZycgc3RyaW5nIHRvIHBlcm1hbmVudCBzdG9yYWdlLiAgKi8KLS0JICAgIGVuY29kaW5nID0gc3RyZHVwIChlbmNvZGluZyk7Ci0tCSAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoZW5jb2RpbmcgPT0gTlVMTCwgMCkpCi0tCSAgICAgIC8qIE5vdGhpbmcgd2UgY2FuIGRvLCBubyBtb3JlIG1lbW9yeS4gIFdlIGNhbm5vdCB1c2UgdGhlCi0tCQkgdHJhbnNsYXRpb24gYmVjYXVzZSBpdCBtaWdodCBiZSBlbmNvZGVkIGluY29ycmVjdGx5LiAgKi8KLS0JICAgICAgZ290byB1bmxvY2tfZmFpbDsKLS0KLS0JICAgIGNvbnZkID0gJm5ld19jb252ZXJzaW9uc1tuY29udmVyc2lvbnNdOwotLQkgICAgY29udmQtPmVuY29kaW5nID0gZW5jb2Rpbmc7Ci0tCi0tCSAgICAvKiBGaW5kIG91dCBhYm91dCB0aGUgY2hhcmFjdGVyIHNldCB0aGUgZmlsZSBpcyBlbmNvZGVkIHdpdGguCi0tCSAgICAgICBUaGlzIGNhbiBiZSBmb3VuZCAoaW4gdGV4dHVhbCBmb3JtKSBpbiB0aGUgZW50cnkgIiIuICBJZiB0aGlzCi0tCSAgICAgICBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlICdjaGFyc2V0PScKLS0JICAgICAgIGluZm9ybWF0aW9uLCB3ZSB3aWxsIGFzc3VtZSB0aGUgY2hhcnNldCBtYXRjaGVzIHRoZSBvbmUgdGhlCi0tCSAgICAgICBjdXJyZW50IGxvY2FsZSBhbmQgd2UgZG9uJ3QgaGF2ZSB0byBwZXJmb3JtIGFueSBjb252ZXJzaW9uLiAgKi8KLS0jIGlmZGVmIF9MSUJDCi0tCSAgICBjb252ZC0+Y29udiA9IChfX2djb252X3QpIC0xOwotLSMgZWxzZQotLSMgIGlmIEhBVkVfSUNPTlYKLS0JICAgIGNvbnZkLT5jb252ID0gKGljb252X3QpIC0xOwotLSMgIGVuZGlmCi0tIyBlbmRpZgotLQkgICAgewotLQkgICAgICBjaGFyICpudWxsZW50cnk7Ci0tCSAgICAgIHNpemVfdCBudWxsZW50cnlsZW47Ci0tCi0tCSAgICAgIC8qIEdldCB0aGUgaGVhZGVyIGVudHJ5LiAgVGhpcyBpcyBhIHJlY3Vyc2lvbiwgYnV0IGl0IGRvZXNuJ3QKLS0JCSByZWFsbG9jYXRlIGRvbWFpbi0+Y29udmVyc2lvbnMgYmVjYXVzZSB3ZSBwYXNzCi0tCQkgZW5jb2RpbmcgPSBOVUxMIG9yIGNvbnZlcnQgPSAwLCByZXNwZWN0aXZlbHkuICAqLwotLQkgICAgICBudWxsZW50cnkgPQotLSMgaWZkZWYgSU5fTElCR0xPQ0FMRQotLQkJX25sX2ZpbmRfbXNnIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZywgTlVMTCwgIiIsCi0tCQkJICAgICAgJm51bGxlbnRyeWxlbik7Ci0tIyBlbHNlCi0tCQlfbmxfZmluZF9tc2cgKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nLCAiIiwgMCwgJm51bGxlbnRyeWxlbik7Ci0tIyBlbmRpZgotLQotLQkgICAgICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCi0tCQl7Ci0tCQkgIGNvbnN0IGNoYXIgKmNoYXJzZXRzdHI7Ci0tCi0tCQkgIGNoYXJzZXRzdHIgPSBzdHJzdHIgKG51bGxlbnRyeSwgImNoYXJzZXQ9Iik7Ci0tCQkgIGlmIChjaGFyc2V0c3RyICE9IE5VTEwpCi0tCQkgICAgewotLQkJICAgICAgc2l6ZV90IGxlbjsKLS0JCSAgICAgIGNoYXIgKmNoYXJzZXQ7Ci0tCQkgICAgICBjb25zdCBjaGFyICpvdXRjaGFyc2V0OwotLQotLQkJICAgICAgY2hhcnNldHN0ciArPSBzdHJsZW4gKCJjaGFyc2V0PSIpOwotLQkJICAgICAgbGVuID0gc3RyY3NwbiAoY2hhcnNldHN0ciwgIiBcdFxuIik7Ci0tCi0tCQkgICAgICBjaGFyc2V0ID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKLS0jIGlmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9NRU1QQ1BZCi0tCQkgICAgICAqKChjaGFyICopIG1lbXBjcHkgKGNoYXJzZXQsIGNoYXJzZXRzdHIsIGxlbikpID0gJ1wwJzsKLS0jIGVsc2UKLS0JCSAgICAgIG1lbWNweSAoY2hhcnNldCwgY2hhcnNldHN0ciwgbGVuKTsKLS0JCSAgICAgIGNoYXJzZXRbbGVuXSA9ICdcMCc7Ci0tIyBlbmRpZgotLQotLQkJICAgICAgb3V0Y2hhcnNldCA9IGVuY29kaW5nOwotLQotLSMgaWZkZWYgX0xJQkMKLS0JCSAgICAgIC8qIFdlIGFsd2F5cyB3YW50IHRvIHVzZSB0cmFuc2xpdGVyYXRpb24uICAqLwotLQkJICAgICAgb3V0Y2hhcnNldCA9IG5vcm1fYWRkX3NsYXNoZXMgKG91dGNoYXJzZXQsICJUUkFOU0xJVCIpOwotLQkJICAgICAgY2hhcnNldCA9IG5vcm1fYWRkX3NsYXNoZXMgKGNoYXJzZXQsICIiKTsKLS0JCSAgICAgIGludCByID0gX19nY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0LCAmY29udmQtPmNvbnYsCi0tCQkJCQkgICAgR0NPTlZfQVZPSURfTk9DT05WKTsKLS0JCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyICE9IF9fR0NPTlZfT0ssIDApKQotLQkJCXsKLS0JCQkgIC8qIElmIHRoZSBvdXRwdXQgZW5jb2RpbmcgaXMgdGhlIHNhbWUgdGhlcmUgaXMKLS0JCQkgICAgIG5vdGhpbmcgdG8gZG8uICBPdGhlcndpc2UgZG8gbm90IHVzZSB0aGUKLS0JCQkgICAgIHRyYW5zbGF0aW9uIGF0IGFsbC4gICovCi0tCQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAociAhPSBfX0dDT05WX05VTENPTlYsIDEpKQotLQkJCSAgICB7Ci0tCQkJICAgICAgZ2xfcndsb2NrX3VubG9jayAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLS0JCQkgICAgICBmcmVlICgoY2hhciAqKSBlbmNvZGluZyk7Ci0tCQkJICAgICAgcmV0dXJuIE5VTEw7Ci0tCQkJICAgIH0KLS0KLS0JCQkgIGNvbnZkLT5jb252ID0gKF9fZ2NvbnZfdCkgLTE7Ci0tCQkJfQotLSMgZWxzZQotLSMgIGlmIEhBVkVfSUNPTlYKLS0JCSAgICAgIC8qIFdoZW4gdXNpbmcgR05VIGxpYmMgPj0gMi4yIG9yIEdOVSBsaWJpY29udiA+PSAxLjUsCi0tCQkJIHdlIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCi0tIyAgIGlmIChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikgfHwgX19HTElCQ19fID4gMiBcCi0tICAgICAgIHx8IF9MSUJJQ09OVl9WRVJTSU9OID49IDB4MDEwNQotLQkJICAgICAgaWYgKHN0cmNociAob3V0Y2hhcnNldCwgJy8nKSA9PSBOVUxMKQotLQkJCXsKLS0JCQkgIGNoYXIgKnRtcDsKLS0KLS0JCQkgIGxlbiA9IHN0cmxlbiAob3V0Y2hhcnNldCk7Ci0tCQkJICB0bXAgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEwICsgMSk7Ci0tCQkJICBtZW1jcHkgKHRtcCwgb3V0Y2hhcnNldCwgbGVuKTsKLS0JCQkgIG1lbWNweSAodG1wICsgbGVuLCAiLy9UUkFOU0xJVCIsIDEwICsgMSk7Ci0tCQkJICBvdXRjaGFyc2V0ID0gdG1wOwotLQotLQkJCSAgY29udmQtPmNvbnYgPSBpY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0KTsKLS0KLS0JCQkgIGZyZWVhIChvdXRjaGFyc2V0KTsKLS0JCQl9Ci0tCQkgICAgICBlbHNlCi0tIyAgIGVuZGlmCi0tCQkJY29udmQtPmNvbnYgPSBpY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0KTsKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0KLS0JCSAgICAgIGZyZWVhIChjaGFyc2V0KTsKLS0JCSAgICB9Ci0tCQl9Ci0tCSAgICB9Ci0tCSAgICBjb252ZC0+Y29udl90YWIgPSBOVUxMOwotLQkgICAgLyogSGVyZSBkb21haW4tPmNvbnZlcnNpb25zIGlzIHN0aWxsID09IG5ld19jb252ZXJzaW9ucy4gICovCi0tCSAgICBkb21haW4tPm5jb252ZXJzaW9ucysrOwotLQkgIH0KLS0KLS0JZm91bmRfY29udmQ6Ci0tCSAgZ2xfcndsb2NrX3VubG9jayAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLS0JfQotLQotLSAgICAgIGlmICgKLS0jIGlmZGVmIF9MSUJDCi0tCSAgY29udmQtPmNvbnYgIT0gKF9fZ2NvbnZfdCkgLTEKLS0jIGVsc2UKLS0jICBpZiBIQVZFX0lDT05WCi0tCSAgY29udmQtPmNvbnYgIT0gKGljb252X3QpIC0xCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tCSAgKQotLQl7Ci0tCSAgLyogV2UgYXJlIHN1cHBvc2VkIHRvIGRvIGEgY29udmVyc2lvbi4gIEZpcnN0IGFsbG9jYXRlIGFuCi0tCSAgICAgYXBwcm9wcmlhdGUgdGFibGUgd2l0aCB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIHRhYmxlCi0tCSAgICAgb2YgdHJhbnNsYXRpb25zIGluIHRoZSBmaWxlLCB3aGVyZSB3ZSBjYW4gcHV0IHRoZSBwb2ludGVycwotLQkgICAgIHRvIHRoZSBjb252ZXJ0ZWQgc3RyaW5ncyBpbi4KLS0JICAgICBUaGVyZSBpcyBhIHNsaWdodCBjb21wbGljYXRpb24gd2l0aCBwbHVyYWwgZW50cmllcy4gIFRoZXkKLS0JICAgICBhcmUgcmVwcmVzZW50ZWQgYnkgY29uc2VjdXRpdmUgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncy4gIFdlCi0tCSAgICAgaGFuZGxlIHRoaXMgY2FzZSBieSBjb252ZXJ0aW5nIFJFU1VMVExFTiBieXRlcywgaW5jbHVkaW5nCi0tCSAgICAgTlVMcy4gICovCi0tCi0tCSAgaWYgKGNvbnZkLT5jb252X3RhYiA9PSBOVUxMCi0tCSAgICAgICYmICgoY29udmQtPmNvbnZfdGFiID0KLS0JCSAgICAoY2hhciAqKikgY2FsbG9jIChuc3RyaW5ncyArIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncywKLS0JCQkJICAgICAgc2l6ZW9mIChjaGFyICopKSkKLS0JCSAgPT0gTlVMTCkpCi0tCSAgICAvKiBNYXJrIHRoYXQgd2UgZGlkbid0IHN1Y2NlZWQgYWxsb2NhdGluZyBhIHRhYmxlLiAgKi8KLS0JICAgIGNvbnZkLT5jb252X3RhYiA9IChjaGFyICoqKSAtMTsKLS0KLS0JICBpZiAoX19idWlsdGluX2V4cGVjdCAoY29udmQtPmNvbnZfdGFiID09IChjaGFyICoqKSAtMSwgMCkpCi0tCSAgICAvKiBOb3RoaW5nIHdlIGNhbiBkbywgbm8gbW9yZSBtZW1vcnkuICBXZSBjYW5ub3QgdXNlIHRoZQotLQkgICAgICAgdHJhbnNsYXRpb24gYmVjYXVzZSBpdCBtaWdodCBiZSBlbmNvZGVkIGluY29ycmVjdGx5LiAgKi8KLS0JICAgIHJldHVybiAoY2hhciAqKSAtMTsKLS0KLS0JICBpZiAoY29udmQtPmNvbnZfdGFiW2FjdF0gPT0gTlVMTCkKLS0JICAgIHsKLS0JICAgICAgLyogV2UgaGF2ZW4ndCB1c2VkIHRoaXMgc3RyaW5nIHNvIGZhciwgc28gaXQgaXMgbm90Ci0tCQkgdHJhbnNsYXRlZCB5ZXQuICBEbyB0aGlzIG5vdy4gICovCi0tCSAgICAgIC8qIFdlIHVzZSBhIGJpdCBtb3JlIGVmZmljaWVudCBtZW1vcnkgaGFuZGxpbmcuCi0tCQkgV2UgYWxsb2NhdGUgYWx3YXlzIGxhcmdlciBibG9ja3Mgd2hpY2ggZ2V0IHVzZWQgb3ZlcgotLQkJIHRpbWUuICBUaGlzIGlzIGZhc3RlciB0aGFuIG1hbnkgc21hbGwgYWxsb2NhdGlvbnMuICAgKi8KLS0JICAgICAgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spCi0tIyBkZWZpbmUgSU5JVElBTF9CTE9DS19TSVpFCTQwODAKLS0JICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgKmZyZWVtZW07Ci0tCSAgICAgIHN0YXRpYyBzaXplX3QgZnJlZW1lbV9zaXplOwotLQotLQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZjsKLS0JICAgICAgdW5zaWduZWQgY2hhciAqb3V0YnVmOwotLQkgICAgICBpbnQgbWFsbG9jX2NvdW50OwotLSMgaWZuZGVmIF9MSUJDCi0tCSAgICAgIHRyYW5zbWVtX2Jsb2NrX3QgKnRyYW5zbWVtX2xpc3QgPSBOVUxMOwotLSMgZW5kaWYKLS0KLS0JICAgICAgX19saWJjX2xvY2tfbG9jayAobG9jayk7Ci0tCi0tCSAgICAgIGluYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcmVzdWx0OwotLQkgICAgICBvdXRidWYgPSBmcmVlbWVtICsgc2l6ZW9mIChzaXplX3QpOwotLQotLQkgICAgICBtYWxsb2NfY291bnQgPSAwOwotLQkgICAgICB3aGlsZSAoMSkKLS0JCXsKLS0JCSAgdHJhbnNtZW1fYmxvY2tfdCAqbmV3bWVtOwotLSMgaWZkZWYgX0xJQkMKLS0JCSAgc2l6ZV90IG5vbl9yZXZlcnNpYmxlOwotLQkJICBpbnQgcmVzOwotLQotLQkJICBpZiAoZnJlZW1lbV9zaXplIDwgc2l6ZW9mIChzaXplX3QpKQotLQkJICAgIGdvdG8gcmVzaXplX2ZyZWVtZW07Ci0tCi0tCQkgIHJlcyA9IF9fZ2NvbnYgKGNvbnZkLT5jb252LAotLQkJCQkgJmluYnVmLCBpbmJ1ZiArIHJlc3VsdGxlbiwKLS0JCQkJICZvdXRidWYsCi0tCQkJCSBvdXRidWYgKyBmcmVlbWVtX3NpemUgLSBzaXplb2YgKHNpemVfdCksCi0tCQkJCSAmbm9uX3JldmVyc2libGUpOwotLQotLQkJICBpZiAocmVzID09IF9fR0NPTlZfT0sgfHwgcmVzID09IF9fR0NPTlZfRU1QVFlfSU5QVVQpCi0tCQkgICAgYnJlYWs7Ci0tCi0tCQkgIGlmIChyZXMgIT0gX19HQ09OVl9GVUxMX09VVFBVVCkKLS0JCSAgICB7Ci0tCQkgICAgICAvKiBXZSBzaG91bGQgbm90IHVzZSB0aGUgdHJhbnNsYXRpb24gYXQgYWxsLCBpdAotLQkJCSBpcyBpbmNvcnJlY3RseSBlbmNvZGVkLiAgKi8KLS0JCSAgICAgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0tCQkgICAgICByZXR1cm4gTlVMTDsKLS0JCSAgICB9Ci0tCi0tCQkgIGluYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcmVzdWx0OwotLSMgZWxzZQotLSMgIGlmIEhBVkVfSUNPTlYKLS0JCSAgY29uc3QgY2hhciAqaW5wdHIgPSAoY29uc3QgY2hhciAqKSBpbmJ1ZjsKLS0JCSAgc2l6ZV90IGlubGVmdCA9IHJlc3VsdGxlbjsKLS0JCSAgY2hhciAqb3V0cHRyID0gKGNoYXIgKikgb3V0YnVmOwotLQkJICBzaXplX3Qgb3V0bGVmdDsKLS0KLS0JCSAgaWYgKGZyZWVtZW1fc2l6ZSA8IHNpemVvZiAoc2l6ZV90KSkKLS0JCSAgICBnb3RvIHJlc2l6ZV9mcmVlbWVtOwotLQotLQkJICBvdXRsZWZ0ID0gZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpOwotLQkJICBpZiAoaWNvbnYgKGNvbnZkLT5jb252LAotLQkJCSAgICAgKElDT05WX0NPTlNUIGNoYXIgKiopICZpbnB0ciwgJmlubGVmdCwKLS0JCQkgICAgICZvdXRwdHIsICZvdXRsZWZ0KQotLQkJICAgICAgIT0gKHNpemVfdCkgKC0xKSkKLS0JCSAgICB7Ci0tCQkgICAgICBvdXRidWYgPSAodW5zaWduZWQgY2hhciAqKSBvdXRwdHI7Ci0tCQkgICAgICBicmVhazsKLS0JCSAgICB9Ci0tCQkgIGlmIChlcnJubyAhPSBFMkJJRykKLS0JCSAgICB7Ci0tCQkgICAgICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOwotLQkJICAgICAgcmV0dXJuIE5VTEw7Ci0tCQkgICAgfQotLSMgIGVuZGlmCi0tIyBlbmRpZgotLQotLQkJcmVzaXplX2ZyZWVtZW06Ci0tCQkgIC8qIFdlIG11c3QgYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9yIHJlc2l6ZSB0aGUgb2xkIG9uZS4gICovCi0tCQkgIGlmIChtYWxsb2NfY291bnQgPiAwKQotLQkJICAgIHsKLS0JCSAgICAgICsrbWFsbG9jX2NvdW50OwotLQkJICAgICAgZnJlZW1lbV9zaXplID0gbWFsbG9jX2NvdW50ICogSU5JVElBTF9CTE9DS19TSVpFOwotLQkJICAgICAgbmV3bWVtID0gKHRyYW5zbWVtX2Jsb2NrX3QgKikgcmVhbGxvYyAodHJhbnNtZW1fbGlzdCwKLS0JCQkJCQkJICAgICBmcmVlbWVtX3NpemUpOwotLSMgaWZkZWYgX0xJQkMKLS0JCSAgICAgIGlmIChuZXdtZW0gIT0gTlVMTCkKLS0JCQl0cmFuc21lbV9saXN0ID0gdHJhbnNtZW1fbGlzdC0+bmV4dDsKLS0JCSAgICAgIGVsc2UKLS0JCQl7Ci0tCQkJICBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqb2xkID0gdHJhbnNtZW1fbGlzdDsKLS0KLS0JCQkgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OwotLQkJCSAgZnJlZSAob2xkKTsKLS0JCQl9Ci0tIyBlbmRpZgotLQkJICAgIH0KLS0JCSAgZWxzZQotLQkJICAgIHsKLS0JCSAgICAgIG1hbGxvY19jb3VudCA9IDE7Ci0tCQkgICAgICBmcmVlbWVtX3NpemUgPSBJTklUSUFMX0JMT0NLX1NJWkU7Ci0tCQkgICAgICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSBtYWxsb2MgKGZyZWVtZW1fc2l6ZSk7Ci0tCQkgICAgfQotLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3bWVtID09IE5VTEwsIDApKQotLQkJICAgIHsKLS0JCSAgICAgIGZyZWVtZW0gPSBOVUxMOwotLQkJICAgICAgZnJlZW1lbV9zaXplID0gMDsKLS0JCSAgICAgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0tCQkgICAgICByZXR1cm4gKGNoYXIgKikgLTE7Ci0tCQkgICAgfQotLQotLSMgaWZkZWYgX0xJQkMKLS0JCSAgLyogQWRkIHRoZSBibG9jayB0byB0aGUgbGlzdCBvZiBibG9ja3Mgd2UgaGF2ZSB0byBmcmVlCi0tCQkgICAgIGF0IHNvbWUgcG9pbnQuICAqLwotLQkJICBuZXdtZW0tPm5leHQgPSB0cmFuc21lbV9saXN0OwotLQkJICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOwotLQotLQkJICBmcmVlbWVtID0gKHVuc2lnbmVkIGNoYXIgKikgbmV3bWVtLT5kYXRhOwotLQkJICBmcmVlbWVtX3NpemUgLT0gb2Zmc2V0b2YgKHN0cnVjdCB0cmFuc21lbV9saXN0LCBkYXRhKTsKLS0jIGVsc2UKLS0JCSAgdHJhbnNtZW1fbGlzdCA9IG5ld21lbTsKLS0JCSAgZnJlZW1lbSA9IG5ld21lbTsKLS0jIGVuZGlmCi0tCi0tCQkgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7Ci0tCQl9Ci0tCi0tCSAgICAgIC8qIFdlIGhhdmUgbm93IGluIG91ciBidWZmZXIgYSBjb252ZXJ0ZWQgc3RyaW5nLiAgUHV0IHRoaXMKLS0JCSBpbnRvIHRoZSB0YWJsZSBvZiBjb252ZXJzaW9ucy4gICovCi0tCSAgICAgICooc2l6ZV90ICopIGZyZWVtZW0gPSBvdXRidWYgLSBmcmVlbWVtIC0gc2l6ZW9mIChzaXplX3QpOwotLQkgICAgICBjb252ZC0+Y29udl90YWJbYWN0XSA9IChjaGFyICopIGZyZWVtZW07Ci0tCSAgICAgIC8qIFNocmluayBmcmVlbWVtLCBidXQga2VlcCBpdCBhbGlnbmVkLiAgKi8KLS0JICAgICAgZnJlZW1lbV9zaXplIC09IG91dGJ1ZiAtIGZyZWVtZW07Ci0tCSAgICAgIGZyZWVtZW0gPSBvdXRidWY7Ci0tCSAgICAgIGZyZWVtZW0gKz0gZnJlZW1lbV9zaXplICYgKGFsaWdub2YgKHNpemVfdCkgLSAxKTsKLS0JICAgICAgZnJlZW1lbV9zaXplID0gZnJlZW1lbV9zaXplICYgfiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOwotLQotLQkgICAgICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOwotLQkgICAgfQotLQotLQkgIC8qIE5vdyBjb252ZC0+Y29udl90YWJbYWN0XSBjb250YWlucyB0aGUgdHJhbnNsYXRpb24gb2YgYWxsCi0tCSAgICAgdGhlIHBsdXJhbCB2YXJpYW50cy4gICovCi0tCSAgcmVzdWx0ID0gY29udmQtPmNvbnZfdGFiW2FjdF0gKyBzaXplb2YgKHNpemVfdCk7Ci0tCSAgcmVzdWx0bGVuID0gKihzaXplX3QgKikgY29udmQtPmNvbnZfdGFiW2FjdF07Ci0tCX0KLS0gICAgfQotLQotLSAgLyogVGhlIHJlc3VsdCBzdHJpbmcgaXMgY29udmVydGVkLiAgKi8KLS0KLS0jZW5kaWYgLyogX0xJQkMgfHwgSEFWRV9JQ09OViAqLwotLQotLSAgKmxlbmd0aHAgPSByZXN1bHRsZW47Ci0tICByZXR1cm4gcmVzdWx0OwotLX0KLS0KLS0KLS0vKiBMb29rIHVwIGEgcGx1cmFsIHZhcmlhbnQuICAqLwotLXN0YXRpYyBjaGFyICoKLS1pbnRlcm5hbF9mdW5jdGlvbgotLXBsdXJhbF9sb29rdXAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKLS0JICAgICAgIGNvbnN0IGNoYXIgKnRyYW5zbGF0aW9uLCBzaXplX3QgdHJhbnNsYXRpb25fbGVuKQotLXsKLS0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW5kYXRhID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbi0+ZGF0YTsKLS0gIHVuc2lnbmVkIGxvbmcgaW50IGluZGV4OwotLSAgY29uc3QgY2hhciAqcDsKLS0KLS0gIGluZGV4ID0gcGx1cmFsX2V2YWwgKGRvbWFpbmRhdGEtPnBsdXJhbCwgbik7Ci0tICBpZiAoaW5kZXggPj0gZG9tYWluZGF0YS0+bnBsdXJhbHMpCi0tICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhbmQgdGhlCi0tICAgICAgIGdpdmVuIG1heGltdW0gdmFsdWUgZG8gbm90IG1hdGNoLiAgKi8KLS0gICAgaW5kZXggPSAwOwotLQotLSAgLyogU2tpcCBJTkRFWCBzdHJpbmdzIGF0IFRSQU5TTEFUSU9OLiAgKi8KLS0gIHAgPSB0cmFuc2xhdGlvbjsKLS0gIHdoaWxlIChpbmRleC0tID4gMCkKLS0gICAgewotLSNpZmRlZiBfTElCQwotLSAgICAgIHAgPSBfX3Jhd21lbWNociAocCwgJ1wwJyk7Ci0tI2Vsc2UKLS0gICAgICBwID0gc3RyY2hyIChwLCAnXDAnKTsKLS0jZW5kaWYKLS0gICAgICAvKiBBbmQgc2tpcCBvdmVyIHRoZSBOVUwgYnl0ZS4gICovCi0tICAgICAgcCsrOwotLQotLSAgICAgIGlmIChwID49IHRyYW5zbGF0aW9uICsgdHJhbnNsYXRpb25fbGVuKQotLQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBJdCBtZWFucyB0aGUgcGx1cmFsIGV4cHJlc3Npb24KLS0JICAgZXZhbHVhdGVkIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB2YXJpYW50cwotLQkgICBhdmFpbGFibGUgZm9yIE1TR0lEMS4gICovCi0tCXJldHVybiAoY2hhciAqKSB0cmFuc2xhdGlvbjsKLS0gICAgfQotLSAgcmV0dXJuIChjaGFyICopIHA7Ci0tfQotLQotLSNpZm5kZWYgX0xJQkMKLS0vKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGxvY2FsZSBDQVRFR09SWS4gICovCi0tc3RhdGljIGNvbnN0IGNoYXIgKgotLWludGVybmFsX2Z1bmN0aW9uCi0tY2F0ZWdvcnlfdG9fbmFtZSAoaW50IGNhdGVnb3J5KQotLXsKLS0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLS0KLS0gIHN3aXRjaCAoY2F0ZWdvcnkpCi0tICB7Ci0tI2lmZGVmIExDX0NPTExBVEUKLS0gIGNhc2UgTENfQ09MTEFURToKLS0gICAgcmV0dmFsID0gIkxDX0NPTExBVEUiOwotLSAgICBicmVhazsKLS0jZW5kaWYKLS0jaWZkZWYgTENfQ1RZUEUKLS0gIGNhc2UgTENfQ1RZUEU6Ci0tICAgIHJldHZhbCA9ICJMQ19DVFlQRSI7Ci0tICAgIGJyZWFrOwotLSNlbmRpZgotLSNpZmRlZiBMQ19NT05FVEFSWQotLSAgY2FzZSBMQ19NT05FVEFSWToKLS0gICAgcmV0dmFsID0gIkxDX01PTkVUQVJZIjsKLS0gICAgYnJlYWs7Ci0tI2VuZGlmCi0tI2lmZGVmIExDX05VTUVSSUMKLS0gIGNhc2UgTENfTlVNRVJJQzoKLS0gICAgcmV0dmFsID0gIkxDX05VTUVSSUMiOwotLSAgICBicmVhazsKLS0jZW5kaWYKLS0jaWZkZWYgTENfVElNRQotLSAgY2FzZSBMQ19USU1FOgotLSAgICByZXR2YWwgPSAiTENfVElNRSI7Ci0tICAgIGJyZWFrOwotLSNlbmRpZgotLSNpZmRlZiBMQ19NRVNTQUdFUwotLSAgY2FzZSBMQ19NRVNTQUdFUzoKLS0gICAgcmV0dmFsID0gIkxDX01FU1NBR0VTIjsKLS0gICAgYnJlYWs7Ci0tI2VuZGlmCi0tI2lmZGVmIExDX1JFU1BPTlNFCi0tICBjYXNlIExDX1JFU1BPTlNFOgotLSAgICByZXR2YWwgPSAiTENfUkVTUE9OU0UiOwotLSAgICBicmVhazsKLS0jZW5kaWYKLS0jaWZkZWYgTENfQUxMCi0tICBjYXNlIExDX0FMTDoKLS0gICAgLyogVGhpcyBtaWdodCBub3QgbWFrZSBzZW5zZSBidXQgaXMgcGVyaGFwcyBiZXR0ZXIgdGhhbiBhbnkgb3RoZXIKLS0gICAgICAgdmFsdWUuICAqLwotLSAgICByZXR2YWwgPSAiTENfQUxMIjsKLS0gICAgYnJlYWs7Ci0tI2VuZGlmCi0tICBkZWZhdWx0OgotLSAgICAvKiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGZvciBhIGRlZmF1bHQgdmFsdWUgbGV0IG1lIGtub3cuICAqLwotLSAgICByZXR2YWwgPSAiTENfWFhYIjsKLS0gIH0KLS0KLS0gIHJldHVybiByZXR2YWw7Ci0tfQotLSNlbmRpZgotLQotLS8qIEd1ZXNzIHZhbHVlIG9mIGN1cnJlbnQgbG9jYWxlIGZyb20gdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwotLSAgIG9yIHN5c3RlbS1kZXBlbmRlbnQgZGVmYXVsdHMuICAqLwotLXN0YXRpYyBjb25zdCBjaGFyICoKLS1pbnRlcm5hbF9mdW5jdGlvbgotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lLAotLQkJICAgICAgY29uc3QgY2hhciAqbG9jYWxlKQotLQotLSNlbHNlCi0tZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQotLSNlbmRpZgotLXsKLS0gIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotLSNpZm5kZWYgSU5fTElCR0xPQ0FMRQotLSAgY29uc3QgY2hhciAqbG9jYWxlOwotLSMgaWZuZGVmIF9MSUJDCi0tICBjb25zdCBjaGFyICpsYW5ndWFnZV9kZWZhdWx0OwotLSAgaW50IGxvY2FsZV9kZWZhdWx0ZWQ7Ci0tIyBlbmRpZgotLSNlbmRpZgotLQotLSAgLyogV2UgdXNlIHRoZSBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotLSAgICAgMS4gVGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnTEFOR1VBR0UnLiAgVGhpcyBpcyBhIEdOVQotLSAgICAgICAgZXh0ZW5zaW9uLiAgSXRzIHZhbHVlIGNhbiBiZSBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2FsZSBuYW1lcy4KLS0gICAgIDIuIFRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ0xDX0FMTCcsICdMQ194eHgnLCBvciAnTEFORycuCi0tICAgICAgICBNb3JlIHByZWNpc2VseSwgdGhlIGZpcnN0IGFtb25nIHRoZXNlIHRoYXQgaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHZhbHVlLgotLSAgICAgICAgVGhpcyBpcyBob3cgUE9TSVggc3BlY2lmaWVzIGl0LiAgVGhlIHZhbHVlIGlzIGEgc2luZ2xlIGxvY2FsZSBuYW1lLgotLSAgICAgMy4gQSBzeXN0ZW0tZGVwZW5kZW50IHByZWZlcmVuY2UgbGlzdCBvZiBsYW5ndWFnZXMuICBJdHMgdmFsdWUgY2FuIGJlIGEKLS0gICAgICAgIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2FsZSBuYW1lcy4KLS0gICAgIDQuIEEgc3lzdGVtLWRlcGVuZGVudCBkZWZhdWx0IGxvY2FsZSBuYW1lLgotLSAgICAgVGhpcyB3YXk6Ci0tICAgICAgIC0gU3lzdGVtLWRlcGVuZGVudCBzZXR0aW5ncyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0tICAgICAgIC0gSWYgdGhlIHN5c3RlbSBwcm92aWRlcyBib3RoIGEgbGlzdCBvZiBsYW5ndWFnZXMgYW5kIGEgZGVmYXVsdCBsb2NhbGUsCi0tICAgICAgICAgdGhlIGZvcm1lciBpcyB1c2VkLiAgKi8KLS0KLS0jaWZuZGVmIElOX0xJQkdMT0NBTEUKLS0gIC8qIEZldGNoIHRoZSBsb2NhbGUgbmFtZSwgdGhyb3VnaCB0aGUgUE9TSVggbWV0aG9kIG9mIGxvb2tpbmcgdG8gYExDX0FMTCcsCi0tICAgICBgTENfeHh4JywgYW5kIGBMQU5HJy4gIE9uIHNvbWUgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZQotLSAgICAgYHNldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLS0jIGlmZGVmIF9MSUJDCi0tICBsb2NhbGUgPSBfX2N1cnJlbnRfbG9jYWxlX25hbWUgKGNhdGVnb3J5KTsKLS0jIGVsc2UKLS0jICBpZiBIQVZFX1NUUlVDVF9fX0xPQ0FMRV9TVFJVQ1RfX19OQU1FUyAmJiBkZWZpbmVkIFVTRV9JTl9HRVRURVhUX1RFU1RTCi0tICAvKiBUaGUgX19uYW1lcyBmaWVsZCBpcyBub3QgcHVibGljIGdsaWJjIEFQSSBhbmQgbXVzdCB0aGVyZWZvcmUgbm90IGJlIHVzZWQKLS0gICAgIGluIGNvZGUgdGhhdCBpcyBpbnN0YWxsZWQgaW4gcHVibGljIGxvY2F0aW9ucy4gICovCi0tICBsb2NhbGVfdCB0aHJlYWRfbG9jYWxlID0gdXNlbG9jYWxlIChOVUxMKTsKLS0gIGlmICh0aHJlYWRfbG9jYWxlICE9IExDX0dMT0JBTF9MT0NBTEUpCi0tICAgIHsKLS0gICAgICBsb2NhbGUgPSB0aHJlYWRfbG9jYWxlLT5fX25hbWVzW2NhdGVnb3J5XTsKLS0gICAgICBsb2NhbGVfZGVmYXVsdGVkID0gMDsKLS0gICAgfQotLSAgZWxzZQotLSMgIGVuZGlmCi0tICAgIHsKLS0gICAgICBsb2NhbGUgPSBfbmxfbG9jYWxlX25hbWVfcG9zaXggKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOwotLSAgICAgIGxvY2FsZV9kZWZhdWx0ZWQgPSAwOwotLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKLS0JewotLQkgIGxvY2FsZSA9IF9ubF9sb2NhbGVfbmFtZV9kZWZhdWx0ICgpOwotLQkgIGxvY2FsZV9kZWZhdWx0ZWQgPSAxOwotLQl9Ci0tICAgIH0KLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tICAvKiBJZ25vcmUgTEFOR1VBR0UgYW5kIGl0cyBzeXN0ZW0tZGVwZW5kZW50IGFuYWxvZ29uIGlmIHRoZSBsb2NhbGUgaXMgc2V0Ci0tICAgICB0byAiQyIgYmVjYXVzZQotLSAgICAgMS4gIkMiIGxvY2FsZSB1c3VhbGx5IHVzZXMgdGhlIEFTQ0lJIGVuY29kaW5nLCBhbmQgbW9zdCBpbnRlcm5hdGlvbmFsCi0tCW1lc3NhZ2VzIHVzZSBub24tQVNDSUkgY2hhcmFjdGVycy4gVGhlc2UgY2hhcmFjdGVycyBnZXQgZGlzcGxheWVkCi0tCWFzIHF1ZXN0aW9uIG1hcmtzIChpZiB1c2luZyBnbGliYydzIGljb252KCkpIG9yIGFzIGludmFsaWQgOC1iaXQKLS0JY2hhcmFjdGVycyAoYmVjYXVzZSBvdGhlciBpY29udigpcyByZWZ1c2UgdG8gY29udmVydCBtb3N0IG5vbi1BU0NJSQotLQljaGFyYWN0ZXJzIHRvIEFTQ0lJKS4gSW4gYW55IGNhc2UsIHRoZSBvdXRwdXQgaXMgdWdseS4KLS0gICAgIDIuIFRoZSBwcmVjaXNlIG91dHB1dCBvZiBzb21lIHByb2dyYW1zIGluIHRoZSAiQyIgbG9jYWxlIGlzIHNwZWNpZmllZAotLQlieSBQT1NJWCBhbmQgc2hvdWxkIG5vdCBkZXBlbmQgb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIGxpa2UKLS0JIkxBTkdVQUdFIiBvciBzeXN0ZW0tZGVwZW5kZW50IGluZm9ybWF0aW9uLiAgV2UgYWxsb3cgc3VjaCBwcm9ncmFtcwotLSAgICAgICAgdG8gdXNlIGdldHRleHQoKS4gICovCi0tICBpZiAoc3RyY21wIChsb2NhbGUsICJDIikgPT0gMCkKLS0gICAgcmV0dXJuIGxvY2FsZTsKLS0KLS0gIC8qIFRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiB0aGUgJ0xBTkdVQUdFJyBlbnZpcm9ubWVudAotLSAgICAgdmFyaWFibGUuICAqLwotLSAgbGFuZ3VhZ2UgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOwotLSAgaWYgKGxhbmd1YWdlICE9IE5VTEwgJiYgbGFuZ3VhZ2VbMF0gIT0gJ1wwJykKLS0gICAgcmV0dXJuIGxhbmd1YWdlOwotLSNpZiAhZGVmaW5lZCBJTl9MSUJHTE9DQUxFICYmICFkZWZpbmVkIF9MSUJDCi0tICAvKiBUaGUgbmV4dCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgbG9jYWxlIG5hbWUsIGlmIG5vdCBkZWZhdWx0ZWQuICAqLwotLSAgaWYgKGxvY2FsZV9kZWZhdWx0ZWQpCi0tICAgIHsKLS0gICAgICAvKiBUaGUgbmV4dCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBwcmVmZXJlbmNlcyBsaXN0LiAqLwotLSAgICAgIGxhbmd1YWdlX2RlZmF1bHQgPSBfbmxfbGFuZ3VhZ2VfcHJlZmVyZW5jZXNfZGVmYXVsdCAoKTsKLS0gICAgICBpZiAobGFuZ3VhZ2VfZGVmYXVsdCAhPSBOVUxMKQotLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlX2RlZmF1bHQ7Ci0tICAgIH0KLS0gIC8qIFRoZSBsZWFzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgbG9jYWxlIG5hbWUsIGlmIGRlZmF1bHRlZC4gICovCi0tI2VuZGlmCi0tICByZXR1cm4gbG9jYWxlOwotLX0KLS0KLS0jaWYgKGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVikgJiYgIWRlZmluZWQgSU5fTElCR0xPQ0FMRQotLS8qIFJldHVybnMgdGhlIG91dHB1dCBjaGFyc2V0LiAgKi8KLS1zdGF0aWMgY29uc3QgY2hhciAqCi0taW50ZXJuYWxfZnVuY3Rpb24KLS1nZXRfb3V0cHV0X2NoYXJzZXQgKHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQotLXsKLS0gIC8qIFRoZSBvdXRwdXQgY2hhcnNldCBzaG91bGQgbm9ybWFsbHkgYmUgZGV0ZXJtaW5lZCBieSB0aGUgbG9jYWxlLiAgQnV0Ci0tICAgICBzb21ldGltZXMgdGhlIGxvY2FsZSBpcyBub3QgdXNlZCBvciBub3QgY29ycmVjdGx5IHNldCB1cCwgc28gd2UgcHJvdmlkZQotLSAgICAgYSBwb3NzaWJpbGl0eSBmb3IgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdGhpczogdGhlIE9VVFBVVF9DSEFSU0VUCi0tICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIE1vcmVvdmVyLCB0aGUgdmFsdWUgc3BlY2lmaWVkIHRocm91Z2gKLS0gICAgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IG92ZXJyaWRlcyBib3RoLiAgKi8KLS0gIGlmIChkb21haW5iaW5kaW5nICE9IE5VTEwgJiYgZG9tYWluYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQotLSAgICByZXR1cm4gZG9tYWluYmluZGluZy0+Y29kZXNldDsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIC8qIEZvciBzcGVlZCByZWFzb25zLCB3ZSBsb29rIGF0IHRoZSB2YWx1ZSBvZiBPVVRQVVRfQ0hBUlNFVCBvbmx5Ci0tCSBvbmNlLiAgVGhpcyBpcyBhIHVzZXIgdmFyaWFibGUgdGhhdCBpcyBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlCi0tCSBkdXJpbmcgYSBwcm9ncmFtIHJ1bi4gICovCi0tICAgICAgc3RhdGljIGNoYXIgKm91dHB1dF9jaGFyc2V0X2NhY2hlOwotLSAgICAgIHN0YXRpYyBpbnQgb3V0cHV0X2NoYXJzZXRfY2FjaGVkOwotLQotLSAgICAgIGlmICghb3V0cHV0X2NoYXJzZXRfY2FjaGVkKQotLQl7Ci0tCSAgY29uc3QgY2hhciAqdmFsdWUgPSBnZXRlbnYgKCJPVVRQVVRfQ0hBUlNFVCIpOwotLQotLQkgIGlmICh2YWx1ZSAhPSBOVUxMICYmIHZhbHVlWzBdICE9ICdcMCcpCi0tCSAgICB7Ci0tCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKHZhbHVlKSArIDE7Ci0tCSAgICAgIGNoYXIgKnZhbHVlX2NvcHkgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0tCi0tCSAgICAgIGlmICh2YWx1ZV9jb3B5ICE9IE5VTEwpCi0tCQltZW1jcHkgKHZhbHVlX2NvcHksIHZhbHVlLCBsZW4pOwotLQkgICAgICBvdXRwdXRfY2hhcnNldF9jYWNoZSA9IHZhbHVlX2NvcHk7Ci0tCSAgICB9Ci0tCSAgb3V0cHV0X2NoYXJzZXRfY2FjaGVkID0gMTsKLS0JfQotLQotLSAgICAgIGlmIChvdXRwdXRfY2hhcnNldF9jYWNoZSAhPSBOVUxMKQotLQlyZXR1cm4gb3V0cHV0X2NoYXJzZXRfY2FjaGU7Ci0tICAgICAgZWxzZQotLQl7Ci0tIyBpZmRlZiBfTElCQwotLQkgIHJldHVybiBfTkxfQ1VSUkVOVCAoTENfQ1RZUEUsIENPREVTRVQpOwotLSMgZWxzZQotLSMgIGlmIEhBVkVfSUNPTlYKLS0JICByZXR1cm4gbG9jYWxlX2NoYXJzZXQgKCk7Ci0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tCX0KLS0gICAgfQotLX0KLS0jZW5kaWYKLS0KLS0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLS0KLS0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0tICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLS0gICB0byBiZSBkZWZpbmVkLiAgKi8KLS0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotLXN0YXRpYyBjaGFyICoKLS1zdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKLS17Ci0tICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0tICAgIC8qIERvIG5vdGhpbmcuICovIDsKLS0gIHJldHVybiBkZXN0IC0gMTsKLS19Ci0tI2VuZGlmCi0tCi0tI2lmICFfTElCQyAmJiAhSEFWRV9NRU1QQ1BZCi0tc3RhdGljIHZvaWQgKgotLW1lbXBjcHkgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCi0tewotLSAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgbikgKyBuKTsKLS19Ci0tI2VuZGlmCi0tCi0tI2lmICFfTElCQyAmJiAhSEFWRV9UU0VBUkNICi0tIyBpbmNsdWRlICJ0c2VhcmNoLmMiCi0tI2VuZGlmCi0tCi0tCi0tI2lmZGVmIF9MSUJDCi0tLyogSWYgd2Ugd2FudCB0byBmcmVlIGFsbCByZXNvdXJjZXMgd2UgaGF2ZSB0byBkbyBzb21lIHdvcmsgYXQKLS0gICBwcm9ncmFtJ3MgZW5kLiAgKi8KLS1saWJjX2ZyZWVyZXNfZm4gKGZyZWVfbWVtKQotLXsKLS0gIHZvaWQgKm9sZDsKLS0KLS0gIHdoaWxlIChfbmxfZG9tYWluX2JpbmRpbmdzICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBzdHJ1Y3QgYmluZGluZyAqb2xkcCA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0tICAgICAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IF9ubF9kb21haW5fYmluZGluZ3MtPm5leHQ7Ci0tICAgICAgaWYgKG9sZHAtPmRpcm5hbWUgIT0gX25sX2RlZmF1bHRfZGlybmFtZSkKLS0JLyogWWVzLCB0aGlzIGlzIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KLS0JZnJlZSAob2xkcC0+ZGlybmFtZSk7Ci0tICAgICAgZnJlZSAob2xkcC0+Y29kZXNldCk7Ci0tICAgICAgZnJlZSAob2xkcCk7Ci0tICAgIH0KLS0KLS0gIGlmIChfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKLS0gICAgLyogWWVzLCBhZ2FpbiBhIHBvaW50ZXIgY29tcGFyaXNvbi4gICovCi0tICAgIGZyZWUgKChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluKTsKLS0KLS0gIC8qIFJlbW92ZSB0aGUgc2VhcmNoIHRyZWUgd2l0aCB0aGUga25vd24gdHJhbnNsYXRpb25zLiAgKi8KLS0gIF9fdGRlc3Ryb3kgKHJvb3QsIGZyZWUpOwotLSAgcm9vdCA9IE5VTEw7Ci0tCi0tICB3aGlsZSAodHJhbnNtZW1fbGlzdCAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgb2xkID0gdHJhbnNtZW1fbGlzdDsKLS0gICAgICB0cmFuc21lbV9saXN0ID0gdHJhbnNtZW1fbGlzdC0+bmV4dDsKLS0gICAgICBmcmVlIChvbGQpOwotLSAgICB9Ci0tfQotLSNlbmRpZgotLS0tIGEvaW50bC9kY25nZXR0ZXh0LmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDU3ICswLDAgQEAKLS0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGNuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8bGliaW50bC5oPgotLSNlbHNlCi0tIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLS0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0tICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0tICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBEQ05HRVRURVhUIF9fZGNuZ2V0dGV4dAotLSMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0Ci0tI2Vsc2UKLS0jIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAotLSMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0Ci0tI2VuZGlmCi0tCi0tLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0tICAgbG9jYWxlLiAgKi8KLS1jaGFyICoKLS1EQ05HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4sCi0tCSAgICBpbnQgY2F0ZWdvcnkpCi0tewotLSAgcmV0dXJuIERDSUdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCAxLCBuLCBjYXRlZ29yeSk7Ci0tfQotLQotLSNpZmRlZiBfTElCQwotLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotLXdlYWtfYWxpYXMgKF9fZGNuZ2V0dGV4dCwgZGNuZ2V0dGV4dCk7Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2RnZXR0ZXh0LmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDU4ICswLDAgQEAKLS0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGdldHRleHQoMykgZnVuY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0KLS0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0tCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLS0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLS0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLS0jIGRlZmluZSBEQ0dFVFRFWFQgSU5UVVNFKF9fZGNnZXR0ZXh0KQotLSNlbHNlCi0tIyBkZWZpbmUgREdFVFRFWFQgbGliaW50bF9kZ2V0dGV4dAotLSMgZGVmaW5lIERDR0VUVEVYVCBsaWJpbnRsX2RjZ2V0dGV4dAotLSNlbmRpZgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50Ci0tICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLS1jaGFyICoKLS1ER0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQpCi0tewotLSAgcmV0dXJuIERDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKTsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi0td2Vha19hbGlhcyAoX19kZ2V0dGV4dCwgZGdldHRleHQpOwotLSNlbmRpZgotLS0tIGEvaW50bC9kbmdldHRleHQuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNTkgKzAsMCBAQAotLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkbmdldHRleHQoMykgZnVuY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0KLS0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0tCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLS0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLS0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIEROR0VUVEVYVCBfX2RuZ2V0dGV4dAotLSMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0Ci0tI2Vsc2UKLS0jIGRlZmluZSBETkdFVFRFWFQgbGliaW50bF9kbmdldHRleHQKLS0jIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAotLSNlbmRpZgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50Ci0tICAgTENfTUVTU0FHRVMgbG9jYWxlIGFuZCBza2lwIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBwbHVyYWwgZm9ybS4gICovCi0tY2hhciAqCi0tRE5HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKLS17Ci0tICByZXR1cm4gRENOR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4sIExDX01FU1NBR0VTKTsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi0td2Vha19hbGlhcyAoX19kbmdldHRleHQsIGRuZ2V0dGV4dCk7Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2V2YWwtcGx1cmFsLmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDEwOCArMCwwIEBACi0tLyogUGx1cmFsIGV4cHJlc3Npb24gZXZhbHVhdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMywgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgU1RBVElDCi0tI2RlZmluZSBTVEFUSUMgc3RhdGljCi0tI2VuZGlmCi0tCi0tLyogRXZhbHVhdGUgdGhlIHBsdXJhbCBleHByZXNzaW9uIGFuZCByZXR1cm4gYW4gaW5kZXggdmFsdWUuICAqLwotLVNUQVRJQwotLXVuc2lnbmVkIGxvbmcgaW50Ci0taW50ZXJuYWxfZnVuY3Rpb24KLS1wbHVyYWxfZXZhbCAoY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gKnBleHAsIHVuc2lnbmVkIGxvbmcgaW50IG4pCi0tewotLSAgc3dpdGNoIChwZXhwLT5uYXJncykKLS0gICAgewotLSAgICBjYXNlIDA6Ci0tICAgICAgc3dpdGNoIChwZXhwLT5vcGVyYXRpb24pCi0tCXsKLS0JY2FzZSB2YXI6Ci0tCSAgcmV0dXJuIG47Ci0tCWNhc2UgbnVtOgotLQkgIHJldHVybiBwZXhwLT52YWwubnVtOwotLQlkZWZhdWx0OgotLQkgIGJyZWFrOwotLQl9Ci0tICAgICAgLyogTk9UUkVBQ0hFRCAqLwotLSAgICAgIGJyZWFrOwotLSAgICBjYXNlIDE6Ci0tICAgICAgewotLQkvKiBwZXhwLT5vcGVyYXRpb24gbXVzdCBiZSBsbm90LiAgKi8KLS0JdW5zaWduZWQgbG9uZyBpbnQgYXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKLS0JcmV0dXJuICEgYXJnOwotLSAgICAgIH0KLS0gICAgY2FzZSAyOgotLSAgICAgIHsKLS0JdW5zaWduZWQgbG9uZyBpbnQgbGVmdGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7Ci0tCWlmIChwZXhwLT5vcGVyYXRpb24gPT0gbG9yKQotLQkgIHJldHVybiBsZWZ0YXJnIHx8IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7Ci0tCWVsc2UgaWYgKHBleHAtPm9wZXJhdGlvbiA9PSBsYW5kKQotLQkgIHJldHVybiBsZWZ0YXJnICYmIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7Ci0tCWVsc2UKLS0JICB7Ci0tCSAgICB1bnNpZ25lZCBsb25nIGludCByaWdodGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7Ci0tCi0tCSAgICBzd2l0Y2ggKHBleHAtPm9wZXJhdGlvbikKLS0JICAgICAgewotLQkgICAgICBjYXNlIG11bHQ6Ci0tCQlyZXR1cm4gbGVmdGFyZyAqIHJpZ2h0YXJnOwotLQkgICAgICBjYXNlIGRpdmlkZToKLS0jaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQotLQkJaWYgKHJpZ2h0YXJnID09IDApCi0tCQkgIHJhaXNlIChTSUdGUEUpOwotLSNlbmRpZgotLQkJcmV0dXJuIGxlZnRhcmcgLyByaWdodGFyZzsKLS0JICAgICAgY2FzZSBtb2R1bGU6Ci0tI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKLS0JCWlmIChyaWdodGFyZyA9PSAwKQotLQkJICByYWlzZSAoU0lHRlBFKTsKLS0jZW5kaWYKLS0JCXJldHVybiBsZWZ0YXJnICUgcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2UgcGx1czoKLS0JCXJldHVybiBsZWZ0YXJnICsgcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2UgbWludXM6Ci0tCQlyZXR1cm4gbGVmdGFyZyAtIHJpZ2h0YXJnOwotLQkgICAgICBjYXNlIGxlc3NfdGhhbjoKLS0JCXJldHVybiBsZWZ0YXJnIDwgcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2UgZ3JlYXRlcl90aGFuOgotLQkJcmV0dXJuIGxlZnRhcmcgPiByaWdodGFyZzsKLS0JICAgICAgY2FzZSBsZXNzX29yX2VxdWFsOgotLQkJcmV0dXJuIGxlZnRhcmcgPD0gcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2UgZ3JlYXRlcl9vcl9lcXVhbDoKLS0JCXJldHVybiBsZWZ0YXJnID49IHJpZ2h0YXJnOwotLQkgICAgICBjYXNlIGVxdWFsOgotLQkJcmV0dXJuIGxlZnRhcmcgPT0gcmlnaHRhcmc7Ci0tCSAgICAgIGNhc2Ugbm90X2VxdWFsOgotLQkJcmV0dXJuIGxlZnRhcmcgIT0gcmlnaHRhcmc7Ci0tCSAgICAgIGRlZmF1bHQ6Ci0tCQlicmVhazsKLS0JICAgICAgfQotLQkgIH0KLS0JLyogTk9UUkVBQ0hFRCAqLwotLQlicmVhazsKLS0gICAgICB9Ci0tICAgIGNhc2UgMzoKLS0gICAgICB7Ci0tCS8qIHBleHAtPm9wZXJhdGlvbiBtdXN0IGJlIHFtb3AuICAqLwotLQl1bnNpZ25lZCBsb25nIGludCBib29sYXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKLS0JcmV0dXJuIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1tib29sYXJnID8gMSA6IDJdLCBuKTsKLS0gICAgICB9Ci0tICAgIH0KLS0gIC8qIE5PVFJFQUNIRUQgKi8KLS0gIHJldHVybiAwOwotLX0KLS0tLSBhL2ludGwvZXhwbG9kZW5hbWUuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTM1ICswLDAgQEAKLS0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLS0KLS0jaW5jbHVkZSAibG9hZGluZm8uaCIKLS0KLS0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLS0jaWZuZGVmIE5VTEwKLS0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLS0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLS0jIGVsc2UKLS0jICBkZWZpbmUgTlVMTCAwCi0tIyBlbmRpZgotLSNlbmRpZgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0vKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBhIGxlYWRpbmcgbGFuZ3VhZ2UgcGFydCBhbmQgYWxsIHRoZQotLSAgIHJlc3QuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhbmd1YWdlLAotLSAgIGkuZS4gdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3QuICAqLwotLXN0YXRpYyBjaGFyICpfbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSk7Ci0tCi0tc3RhdGljIGNoYXIgKgotLV9ubF9maW5kX2xhbmd1YWdlIChjb25zdCBjaGFyICpuYW1lKQotLXsKLS0gIHdoaWxlIChuYW1lWzBdICE9ICdcMCcgJiYgbmFtZVswXSAhPSAnXycgJiYgbmFtZVswXSAhPSAnQCcgJiYgbmFtZVswXSAhPSAnLicpCi0tICAgICsrbmFtZTsKLS0KLS0gIHJldHVybiAoY2hhciAqKSBuYW1lOwotLX0KLS0KLS0KLS1pbnQKLS1fbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLAotLQkJICBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKiptb2RpZmllciwKLS0JCSAgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwgY29uc3QgY2hhciAqKmNvZGVzZXQsCi0tCQkgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQpCi0tewotLSAgY2hhciAqY3A7Ci0tICBpbnQgbWFzazsKLS0KLS0gICptb2RpZmllciA9IE5VTEw7Ci0tICAqdGVycml0b3J5ID0gTlVMTDsKLS0gICpjb2Rlc2V0ID0gTlVMTDsKLS0gICpub3JtYWxpemVkX2NvZGVzZXQgPSBOVUxMOwotLQotLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0tICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycsICcuJywgYW5kIGBAJy4gICovCi0tICBtYXNrID0gMDsKLS0gICpsYW5ndWFnZSA9IGNwID0gbmFtZTsKLS0gIGNwID0gX25sX2ZpbmRfbGFuZ3VhZ2UgKCpsYW5ndWFnZSk7Ci0tCi0tICBpZiAoKmxhbmd1YWdlID09IGNwKQotLSAgICAvKiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2U6IGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQuICBVc2UKLS0gICAgICAgdGhpcyBlbnRyeSBhcyBpdCBpcyB3aXRob3V0IGV4cGxvZGluZy4gIFBlcmhhcHMgaXQgaXMgYW4gYWxpYXMuICAqLwotLSAgICBjcCA9IHN0cmNociAoKmxhbmd1YWdlLCAnXDAnKTsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIGlmIChjcFswXSA9PSAnXycpCi0tCXsKLS0JICAvKiBOZXh0IGlzIHRoZSB0ZXJyaXRvcnkuICAqLwotLQkgIGNwWzBdID0gJ1wwJzsKLS0JICAqdGVycml0b3J5ID0gKytjcDsKLS0KLS0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLicgJiYgY3BbMF0gIT0gJ0AnKQotLQkgICAgKytjcDsKLS0KLS0JICBtYXNrIHw9IFhQR19URVJSSVRPUlk7Ci0tCX0KLS0KLS0gICAgICBpZiAoY3BbMF0gPT0gJy4nKQotLQl7Ci0tCSAgLyogTmV4dCBpcyB0aGUgY29kZXNldC4gICovCi0tCSAgY3BbMF0gPSAnXDAnOwotLQkgICpjb2Rlc2V0ID0gKytjcDsKLS0KLS0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnQCcpCi0tCSAgICArK2NwOwotLQotLQkgIG1hc2sgfD0gWFBHX0NPREVTRVQ7Ci0tCi0tCSAgaWYgKCpjb2Rlc2V0ICE9IGNwICYmICgqY29kZXNldClbMF0gIT0gJ1wwJykKLS0JICAgIHsKLS0JICAgICAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IF9ubF9ub3JtYWxpemVfY29kZXNldCAoKmNvZGVzZXQsCi0tCQkJCQkJCSAgIGNwIC0gKmNvZGVzZXQpOwotLQkgICAgICBpZiAoKm5vcm1hbGl6ZWRfY29kZXNldCA9PSBOVUxMKQotLQkJcmV0dXJuIC0xOwotLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKCpjb2Rlc2V0LCAqbm9ybWFsaXplZF9jb2Rlc2V0KSA9PSAwKQotLQkJZnJlZSAoKGNoYXIgKikgKm5vcm1hbGl6ZWRfY29kZXNldCk7Ci0tCSAgICAgIGVsc2UKLS0JCW1hc2sgfD0gWFBHX05PUk1fQ09ERVNFVDsKLS0JICAgIH0KLS0JfQotLSAgICB9Ci0tCi0tICBpZiAoY3BbMF0gPT0gJ0AnKQotLSAgICB7Ci0tICAgICAgLyogTmV4dCBpcyB0aGUgbW9kaWZpZXIuICAqLwotLSAgICAgIGNwWzBdID0gJ1wwJzsKLS0gICAgICAqbW9kaWZpZXIgPSArK2NwOwotLQotLSAgICAgIGlmIChjcFswXSAhPSAnXDAnKQotLQltYXNrIHw9IFhQR19NT0RJRklFUjsKLS0gICAgfQotLQotLSAgaWYgKCp0ZXJyaXRvcnkgIT0gTlVMTCAmJiAoKnRlcnJpdG9yeSlbMF0gPT0gJ1wwJykKLS0gICAgbWFzayAmPSB+WFBHX1RFUlJJVE9SWTsKLS0KLS0gIGlmICgqY29kZXNldCAhPSBOVUxMICYmICgqY29kZXNldClbMF0gPT0gJ1wwJykKLS0gICAgbWFzayAmPSB+WFBHX0NPREVTRVQ7Ci0tCi0tICByZXR1cm4gbWFzazsKLS19Ci0tLS0gYS9pbnRsL2V4cG9ydC5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw2ICswLDAgQEAKLS0KLS0jaWYgQEhBVkVfVklTSUJJTElUWUAgJiYgQlVJTERJTkdfTElCSU5UTAotLSNkZWZpbmUgTElCSU5UTF9ETExfRVhQT1JURUQgX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCi0tI2Vsc2UKLS0jZGVmaW5lIExJQklOVExfRExMX0VYUE9SVEVECi0tI2VuZGlmCi0tLS0gYS9pbnRsL2ZpbmRkb21haW4uYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMjEyICswLDAgQEAKLS0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDEsIDIwMDMtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5vcmc+LCAxOTk1LgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRpby5oPgotLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLQotLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0vKiBIYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZCBfX2xpYmNfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZAotLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2sgX19saWJjX3J3bG9ja19yZGxvY2sKLS0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrIF9fbGliY19yd2xvY2tfd3Jsb2NrCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayBfX2xpYmNfcndsb2NrX3VubG9jawotLSNlbHNlCi0tIyBpbmNsdWRlICJsb2NrLmgiCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLS8qIExpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucy4gICovCi0tc3RhdGljIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9sb2FkZWRfZG9tYWluczsKLS0KLS0KLS0vKiBSZXR1cm4gYSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgZGVzY3JpYmVkIGJ5Ci0tICAgdGhlIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZIHBhcmFtZXRlcnMgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50bHkKLS0gICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCi0tc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi0taW50ZXJuYWxfZnVuY3Rpb24KLS1fbmxfZmluZF9kb21haW4gKGNvbnN0IGNoYXIgKmRpcm5hbWUsIGNoYXIgKmxvY2FsZSwKLS0JCSBjb25zdCBjaGFyICpkb21haW5uYW1lLCBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKLS17Ci0tICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0tICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLS0gIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotLSAgY29uc3QgY2hhciAqdGVycml0b3J5OwotLSAgY29uc3QgY2hhciAqY29kZXNldDsKLS0gIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKLS0gIGNvbnN0IGNoYXIgKmFsaWFzX3ZhbHVlOwotLSAgaW50IG1hc2s7Ci0tCi0tICAvKiBMT0NBTEUgY2FuIGNvbnNpc3Qgb2YgdXAgdG8gZm91ciByZWNvZ25pemVkIHBhcnRzIGZvciB0aGUgWFBHIHN5bnRheDoKLS0KLS0JCWxhbmd1YWdlW190ZXJyaXRvcnldWy5jb2Rlc2V0XVtAbW9kaWZpZXJdCi0tCi0tICAgICBCZXNpZGUgdGhlIGZpcnN0IHBhcnQgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmCi0tICAgICB0aGUgZnVsbCBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZCwgdGhlIGxlc3Mgc3BlY2lmaWMgb25lIGFyZQotLSAgICAgbG9va2VkIGZvci4gIFRoZSB2YXJpb3VzIHBhcnRzIHdpbGwgYmUgc3RyaXBwZWQgb2ZmIGFjY29yZGluZyB0bwotLSAgICAgdGhlIGZvbGxvd2luZyBvcmRlcjoKLS0JCSgxKSBjb2Rlc2V0Ci0tCQkoMikgbm9ybWFsaXplZCBjb2Rlc2V0Ci0tCQkoMykgdGVycml0b3J5Ci0tCQkoNCkgbW9kaWZpZXIKLS0gICAqLwotLQotLSAgLyogV2UgbmVlZCB0byBwcm90ZWN0IG1vZGlmeWluZyB0aGUgX05MX0xPQURFRF9ET01BSU5TIGRhdGEuICAqLwotLSAgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZCAoc3RhdGljLCBsb2NrKTsKLS0gIGdsX3J3bG9ja19yZGxvY2sgKGxvY2spOwotLQotLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHRlc3RlZCBmb3IgdGhpcyBsb2NhbGUgZW50cnkgdGhlcmUgaGFzIHRvCi0tICAgICBiZSBvbmUgZGF0YSBzZXQgaW4gdGhlIGxpc3Qgb2YgbG9hZGVkIGRvbWFpbnMuICAqLwotLSAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAotLQkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgMCwgbG9jYWxlLCBOVUxMLCBOVUxMLAotLQkJCSAgICAgICBOVUxMLCBOVUxMLCBkb21haW5uYW1lLCAwKTsKLS0KLS0gIGdsX3J3bG9ja191bmxvY2sgKGxvY2spOwotLQotLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgLyogV2Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhpcyBsb2NhbGUuICAqLwotLSAgICAgIGludCBjbnQ7Ci0tCi0tICAgICAgaWYgKHJldHZhbC0+ZGVjaWRlZCA8PSAwKQotLQlfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7Ci0tCi0tICAgICAgaWYgKHJldHZhbC0+ZGF0YSAhPSBOVUxMKQotLQlyZXR1cm4gcmV0dmFsOwotLQotLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLS0JewotLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkIDw9IDApCi0tCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0sIGRvbWFpbmJpbmRpbmcpOwotLQotLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCi0tCSAgICBicmVhazsKLS0JfQotLQotLSAgICAgIHJldHVybiByZXR2YWw7Ci0tICAgICAgLyogTk9UUkVBQ0hFRCAqLwotLSAgICB9Ci0tCi0tICAvKiBTZWUgd2hldGhlciB0aGUgbG9jYWxlIHZhbHVlIGlzIGFuIGFsaWFzLiAgSWYgeWVzIGl0cyB2YWx1ZQotLSAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCi0tICAgICBkb25lLiAgKi8KLS0gIGFsaWFzX3ZhbHVlID0gX25sX2V4cGFuZF9hbGlhcyAobG9jYWxlKTsKLS0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotLSAgICB7Ci0tI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotLSAgICAgIGxvY2FsZSA9IHN0cmR1cCAoYWxpYXNfdmFsdWUpOwotLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKLS0JcmV0dXJuIE5VTEw7Ci0tI2Vsc2UKLS0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChhbGlhc192YWx1ZSkgKyAxOwotLSAgICAgIGxvY2FsZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLS0gICAgICBpZiAobG9jYWxlID09IE5VTEwpCi0tCXJldHVybiBOVUxMOwotLQotLSAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKLS0jZW5kaWYKLS0gICAgfQotLQotLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0tICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycsICcuJywgYW5kIGBAJy4gICovCi0tICBtYXNrID0gX25sX2V4cGxvZGVfbmFtZSAobG9jYWxlLCAmbGFuZ3VhZ2UsICZtb2RpZmllciwgJnRlcnJpdG9yeSwKLS0JCQkgICAmY29kZXNldCwgJm5vcm1hbGl6ZWRfY29kZXNldCk7Ci0tICBpZiAobWFzayA9PSAtMSkKLS0gICAgLyogVGhpcyBtZWFucyB3ZSBhcmUgb3V0IG9mIGNvcmUuICAqLwotLSAgICByZXR1cm4gTlVMTDsKLS0KLS0gIC8qIFdlIG5lZWQgdG8gcHJvdGVjdCBtb2RpZnlpbmcgdGhlIF9OTF9MT0FERURfRE9NQUlOUyBkYXRhLiAgKi8KLS0gIGdsX3J3bG9ja193cmxvY2sgKGxvY2spOwotLQotLSAgLyogQ3JlYXRlIGFsbCBwb3NzaWJsZSBsb2NhbGUgZW50cmllcyB3aGljaCBtaWdodCBiZSBpbnRlcmVzdGVkIGluCi0tICAgICBnZW5lcmFsaXphdGlvbi4gICovCi0tICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0tCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCBtYXNrLCBsYW5ndWFnZSwgdGVycml0b3J5LAotLQkJCSAgICAgICBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLAotLQkJCSAgICAgICBkb21haW5uYW1lLCAxKTsKLS0KLS0gIGdsX3J3bG9ja191bmxvY2sgKGxvY2spOwotLQotLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotLSAgICAvKiBUaGlzIG1lYW5zIHdlIGFyZSBvdXQgb2YgY29yZS4gICovCi0tICAgIGdvdG8gb3V0OwotLQotLSAgaWYgKHJldHZhbC0+ZGVjaWRlZCA8PSAwKQotLSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7Ci0tICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCi0tICAgIHsKLS0gICAgICBpbnQgY250OwotLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLS0JewotLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkIDw9IDApCi0tCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0sIGRvbWFpbmJpbmRpbmcpOwotLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCi0tCSAgICBicmVhazsKLS0JfQotLSAgICB9Ci0tCi0tICAvKiBUaGUgcm9vbSBmb3IgYW4gYWxpYXMgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQgbm93LiAgKi8KLS0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotLSAgICBmcmVlIChsb2NhbGUpOwotLQotLW91dDoKLS0gIC8qIFRoZSBzcGFjZSBmb3Igbm9ybWFsaXplZF9jb2Rlc2V0IGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQuICAqLwotLSAgaWYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKQotLSAgICBmcmVlICgodm9pZCAqKSBub3JtYWxpemVkX2NvZGVzZXQpOwotLQotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tCi0tCi0tI2lmZGVmIF9MSUJDCi0tLyogVGhpcyBpcyBjYWxsZWQgZnJvbSBpY29udi9nY29udl9kYi5jJ3MgZnJlZV9tZW0sIGFzIGxvY2FsZXMgbXVzdAotLSAgIGJlIGZyZWVkIGJlZm9yZSBmcmVlaW5nIGdjb252IHN0ZXBzIGFycmF5cy4gICovCi0tdm9pZCBfX2xpYmNfZnJlZXJlc19mbl9zZWN0aW9uCi0tX25sX2ZpbmRkb21haW5fc3ViZnJlZXJlcyAoKQotLXsKLS0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJ1bnAgPSBfbmxfbG9hZGVkX2RvbWFpbnM7Ci0tCi0tICB3aGlsZSAocnVucCAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqaGVyZSA9IHJ1bnA7Ci0tICAgICAgaWYgKHJ1bnAtPmRhdGEgIT0gTlVMTCkKLS0JX25sX3VubG9hZF9kb21haW4gKChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBydW5wLT5kYXRhKTsKLS0gICAgICBydW5wID0gcnVucC0+bmV4dDsKLS0gICAgICBmcmVlICgoY2hhciAqKSBoZXJlLT5maWxlbmFtZSk7Ci0tICAgICAgZnJlZSAoaGVyZSk7Ci0tICAgIH0KLS19Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2dldHRleHQuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNjMgKzAsMCBAQAotLS8qIEltcGxlbWVudGF0aW9uIG9mIGdldHRleHQoMykgZnVuY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgX19uZWVkX05VTEwKLS0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotLSNlbHNlCi0tIyBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLwotLSNlbmRpZgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8bGliaW50bC5oPgotLSNlbHNlCi0tIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLS0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0tICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0tICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBHRVRURVhUIF9fZ2V0dGV4dAotLSMgZGVmaW5lIERDR0VUVEVYVCBJTlRVU0UoX19kY2dldHRleHQpCi0tI2Vsc2UKLS0jIGRlZmluZSBHRVRURVhUIGxpYmludGxfZ2V0dGV4dAotLSMgZGVmaW5lIERDR0VUVEVYVCBsaWJpbnRsX2RjZ2V0dGV4dAotLSNlbmRpZgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0tICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLS0gICB0ZXh0KS4gICovCi0tY2hhciAqCi0tR0VUVEVYVCAoY29uc3QgY2hhciAqbXNnaWQpCi0tewotLSAgcmV0dXJuIERDR0VUVEVYVCAoTlVMTCwgbXNnaWQsIExDX01FU1NBR0VTKTsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi0td2Vha19hbGlhcyAoX19nZXR0ZXh0LCBnZXR0ZXh0KTsKLS0jZW5kaWYKLS0tLSBhL2ludGwvZ2V0dGV4dFAuaAotKysrIC9kZXYvbnVsbAotQEAgLTEsMjk3ICswLDAgQEAKLS0vKiBIZWFkZXIgZGVzY3JpYmluZyBpbnRlcm5hbHMgb2YgbGliaW50bCBsaWJyYXJ5LgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX0dFVFRFWFRQX0gKLS0jZGVmaW5lIF9HRVRURVhUUF9ICi0tCi0tI2luY2x1ZGUgPHN0ZGRlZi5oPgkJLyogR2V0IHNpemVfdC4gICovCi0tCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlICIuLi9pY29udi9nY29udl9pbnQuaCIKLS0jZWxzZQotLSMgaWYgSEFWRV9JQ09OVgotLSMgIGluY2x1ZGUgPGljb252Lmg+Ci0tIyBlbmRpZgotLSNlbmRpZgotLQotLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lCi0tI2Vsc2UKLS0jIGluY2x1ZGUgImxvY2suaCIKLS0jZW5kaWYKLS0KLS0jaWZkZWYgX0xJQkMKLS1leHRlcm4gY2hhciAqX19nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKTsKLS1leHRlcm4gY2hhciAqX19kZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKTsKLS1leHRlcm4gY2hhciAqX19kY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLS0JCQkgIGludCBfX2NhdGVnb3J5KTsKLS1leHRlcm4gY2hhciAqX19uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24pOwotLWV4dGVybiBjaGFyICpfX2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCSAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgbik7Ci0tZXh0ZXJuIGNoYXIgKl9fZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCSAgIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLS0JCQkgICB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KTsKLS1leHRlcm4gY2hhciAqX19kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSAgIGludCBfX3BsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgX19uLAotLQkJCSAgIGludCBfX2NhdGVnb3J5KTsKLS1leHRlcm4gY2hhciAqX190ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpOwotLWV4dGVybiBjaGFyICpfX2JpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJICAgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7Ci0tZXh0ZXJuIGNoYXIgKl9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkJCWNvbnN0IGNoYXIgKl9fY29kZXNldCk7Ci0tZXh0ZXJuIHZvaWQgX25sX2ZpbmRkb21haW5fc3ViZnJlZXJlcyAodm9pZCkgYXR0cmlidXRlX2hpZGRlbjsKLS1leHRlcm4gdm9pZCBfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb24gYXR0cmlidXRlX2hpZGRlbjsKLS0jZWxzZQotLS8qIERlY2xhcmUgdGhlIGV4cG9ydGVkIGxpYmludGxfKiBmdW5jdGlvbnMsIGluIGEgd2F5IHRoYXQgYWxsb3dzIHVzIHRvCi0tICAgY2FsbCB0aGVtIHVuZGVyIHRoZWlyIHJlYWwgbmFtZS4gICovCi0tIyB1bmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLS0jIHVuZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgZGVmaW5lIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotLSMgaWZkZWYgSU5fTElCR0xPQ0FMRQotLWV4dGVybiBjaGFyICpnbF9kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0tCQkJICAgIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLS0JCQkgICAgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCi0tCQkJICAgIGludCBfX2NhdGVnb3J5LAotLQkJCSAgICBjb25zdCBjaGFyICpfX2xvY2FsZW5hbWUsIGNvbnN0IGNoYXIgKl9fZW5jb2RpbmcpOwotLSMgZWxzZQotLWV4dGVybiBjaGFyICpsaWJpbnRsX2RjaWdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLS0JCQkJIGludCBfX3BsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgX19uLAotLQkJCQkgaW50IF9fY2F0ZWdvcnkpOwotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSAibG9hZGluZm8uaCIKLS0KLS0jaW5jbHVkZSAiZ21vLmgiCQkvKiBHZXQgbmxzX3VpbnQzMi4gICovCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLSNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KLS0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotLSNlbmRpZgotLQotLSNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgotLSMgZGVmaW5lIGF0dHJpYnV0ZV9oaWRkZW4KLS0jZW5kaWYKLS0KLS0vKiBUZWxsIHRoZSBjb21waWxlciB3aGVuIGEgY29uZGl0aW9uYWwgb3IgaW50ZWdlciBleHByZXNzaW9uIGlzCi0tICAgYWxtb3N0IGFsd2F5cyB0cnVlIG9yIGFsbW9zdCBhbHdheXMgZmFsc2UuICAqLwotLSNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAotLSMgZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoZXhwciwgdmFsKSAoZXhwcikKLS0jZW5kaWYKLS0KLS0jaWZuZGVmIFcKLS0jIGRlZmluZSBXKGZsYWcsIGRhdGEpICgoZmxhZykgPyBTV0FQIChkYXRhKSA6IChkYXRhKSkKLS0jZW5kaWYKLS0KLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0tIyBkZWZpbmUgU1dBUChpKSBic3dhcF8zMiAoaSkKLS0jZWxzZQotLXN0YXRpYyBpbmxpbmUgbmxzX3VpbnQzMgotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS1TV0FQIChubHNfdWludDMyIGkpCi0tIyBlbHNlCi0tU1dBUCAoaSkKLS0gICAgIG5sc191aW50MzIgaTsKLS0jIGVuZGlmCi0tewotLSAgcmV0dXJuIChpIDw8IDI0KSB8ICgoaSAmIDB4ZmYwMCkgPDwgOCkgfCAoKGkgPj4gOCkgJiAweGZmMDApIHwgKGkgPj4gMjQpOwotLX0KLS0jZW5kaWYKLS0KLS0KLS0vKiBJbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcuICAqLwotLXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MKLS17Ci0tICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLwotLSAgc2l6ZV90IGxlbmd0aDsKLS0gIC8qIFBvaW50ZXIgdG8gYWRkcmVzc2VkIHN0cmluZy4gICovCi0tICBjb25zdCBjaGFyICpwb2ludGVyOwotLX07Ci0tCi0tLyogQ2FjaGUgb2YgdHJhbnNsYXRlZCBzdHJpbmdzIGFmdGVyIGNoYXJzZXQgY29udmVyc2lvbi4KLS0gICBOb3RlOiBUaGUgc3RyaW5ncyBhcmUgY29udmVydGVkIHRvIHRoZSB0YXJnZXQgZW5jb2Rpbmcgb25seSBvbiBhbiBhcy1uZWVkZWQKLS0gICBiYXNpcy4gICovCi0tc3RydWN0IGNvbnZlcnRlZF9kb21haW4KLS17Ci0tICAvKiBUaGUgdGFyZ2V0IGVuY29kaW5nIG5hbWUuICAqLwotLSAgY29uc3QgY2hhciAqZW5jb2Rpbmc7Ci0tICAvKiBUaGUgZGVzY3JpcHRvciBmb3IgY29udmVyc2lvbiBmcm9tIHRoZSBtZXNzYWdlIGNhdGFsb2cncyBlbmNvZGluZyB0bwotLSAgICAgdGhpcyB0YXJnZXQgZW5jb2RpbmcuICAqLwotLSNpZmRlZiBfTElCQwotLSAgX19nY29udl90IGNvbnY7Ci0tI2Vsc2UKLS0jIGlmIEhBVkVfSUNPTlYKLS0gIGljb252X3QgY29udjsKLS0jIGVuZGlmCi0tI2VuZGlmCi0tICAvKiBUaGUgdGFibGUgb2YgdHJhbnNsYXRlZCBzdHJpbmdzIGFmdGVyIGNoYXJzZXQgY29udmVyc2lvbi4gICovCi0tICBjaGFyICoqY29udl90YWI7Ci0tfTsKLS0KLS0vKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4gICovCi0tc3RydWN0IGxvYWRlZF9kb21haW4KLS17Ci0tICAvKiBQb2ludGVyIHRvIG1lbW9yeSBjb250YWluaW5nIHRoZSAubW8gZmlsZS4gICovCi0tICBjb25zdCBjaGFyICpkYXRhOwotLSAgLyogMSBpZiB0aGUgbWVtb3J5IGlzIG1tYXAoKWVkLCAwIGlmIHRoZSBtZW1vcnkgaXMgbWFsbG9jKCllZC4gICovCi0tICBpbnQgdXNlX21tYXA7Ci0tICAvKiBTaXplIG9mIG1tYXAoKWVkIG1lbW9yeS4gICovCi0tICBzaXplX3QgbW1hcF9zaXplOwotLSAgLyogMSBpZiB0aGUgLm1vIGZpbGUgdXNlcyBhIGRpZmZlcmVudCBlbmRpYW5uZXNzIHRoYW4gdGhpcyBtYWNoaW5lLiAgKi8KLS0gIGludCBtdXN0X3N3YXA7Ci0tICAvKiBQb2ludGVyIHRvIGFkZGl0aW9uYWwgbWFsbG9jKCllZCBtZW1vcnkuICAqLwotLSAgdm9pZCAqbWFsbG9jZWQ7Ci0tCi0tICAvKiBOdW1iZXIgb2Ygc3RhdGljIHN0cmluZ3MgcGFpcnMuICAqLwotLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLS0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3RyaW5ncyBpbiB0aGUgZmlsZS4gICovCi0tICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOwotLSAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLwotLSAgY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICp0cmFuc190YWI7Ci0tCi0tICAvKiBOdW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIHBhaXJzLiAgKi8KLS0gIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKLS0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLwotLSAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqb3JpZ19zeXNkZXBfdGFiOwotLSAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiB0cmFuc2xhdGVkIHN5c2RlcCBzdHJpbmdzLiAgKi8KLS0gIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKnRyYW5zX3N5c2RlcF90YWI7Ci0tCi0tICAvKiBTaXplIG9mIGhhc2ggdGFibGUuICAqLwotLSAgbmxzX3VpbnQzMiBoYXNoX3NpemU7Ci0tICAvKiBQb2ludGVyIHRvIGhhc2ggdGFibGUuICAqLwotLSAgY29uc3QgbmxzX3VpbnQzMiAqaGFzaF90YWI7Ci0tICAvKiAxIGlmIHRoZSBoYXNoIHRhYmxlIHVzZXMgYSBkaWZmZXJlbnQgZW5kaWFubmVzcyB0aGFuIHRoaXMgbWFjaGluZS4gICovCi0tICBpbnQgbXVzdF9zd2FwX2hhc2hfdGFiOwotLQotLSAgLyogQ2FjaGUgb2YgY2hhcnNldCBjb252ZXJzaW9ucyBvZiB0aGUgdHJhbnNsYXRlZCBzdHJpbmdzLiAgKi8KLS0gIHN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluICpjb252ZXJzaW9uczsKLS0gIHNpemVfdCBuY29udmVyc2lvbnM7Ci0tICBnbF9yd2xvY2tfZGVmaW5lICgsIGNvbnZlcnNpb25zX2xvY2spCi0tCi0tICBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcGx1cmFsOwotLSAgdW5zaWduZWQgbG9uZyBpbnQgbnBsdXJhbHM7Ci0tfTsKLS0KLS0vKiBXZSB3YW50IHRvIGFsbG9jYXRlIGEgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdC4gIEJ1dCBJU08gQwotLSAgIGRvZXNuJ3QgYWxsb3cgemVybyBzaXplZCBhcnJheXMuICAqLwotLSNpZmRlZiBfX0dOVUNfXwotLSMgZGVmaW5lIFpFUk8gMAotLSNlbHNlCi0tIyBkZWZpbmUgWkVSTyAxCi0tI2VuZGlmCi0tCi0tLyogQSBzZXQgb2Ygc2V0dGluZ3MgYm91bmQgdG8gYSBtZXNzYWdlIGRvbWFpbi4gIFVzZWQgdG8gc3RvcmUgc2V0dGluZ3MKLS0gICBmcm9tIGJpbmR0ZXh0ZG9tYWluKCkgYW5kIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkuICAqLwotLXN0cnVjdCBiaW5kaW5nCi0tewotLSAgc3RydWN0IGJpbmRpbmcgKm5leHQ7Ci0tICBjaGFyICpkaXJuYW1lOwotLSAgY2hhciAqY29kZXNldDsKLS0gIGNoYXIgZG9tYWlubmFtZVtaRVJPXTsKLS19OwotLQotLS8qIEEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgc29tZSBwcmV2aW91cyB0cmFuc2xhdGlvbnMKLS0gICBiZWNvbWUgaW52YWxpZC4KLS0gICBUaGlzIHZhcmlhYmxlIGlzIHBhcnQgb2YgdGhlIGV4dGVybmFsIEFCSSBvZiB0aGUgR05VIGxpYmludGwuICAqLwotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tIyBpbmNsdWRlIDxnbG9jYWxlL2NvbmZpZy5oPgotLWV4dGVybiBMSUJHTE9DQUxFX0RMTF9FWFBPUlRFRCBpbnQgX25sX21zZ19jYXRfY250cjsKLS0jZWxzZQotLWV4dGVybiBMSUJJTlRMX0RMTF9FWFBPUlRFRCBpbnQgX25sX21zZ19jYXRfY250cjsKLS0jZW5kaWYKLS0KLS0jaWZuZGVmIF9MSUJDCi0tZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9sYW5ndWFnZV9wcmVmZXJlbmNlc19kZWZhdWx0ICh2b2lkKTsKLS0jIGRlZmluZSBnbF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgX25sX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZQotLWV4dGVybiB2b2lkIF9ubF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKGNoYXIgKm5hbWUpOwotLSMgZGVmaW5lIGdsX2xvY2FsZV9uYW1lX3Bvc2l4IF9ubF9sb2NhbGVfbmFtZV9wb3NpeAotLWV4dGVybiBjb25zdCBjaGFyICpfbmxfbG9jYWxlX25hbWVfcG9zaXggKGludCBjYXRlZ29yeSwKLS0JCQkJCSAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKTsKLS0jIGRlZmluZSBnbF9sb2NhbGVfbmFtZV9kZWZhdWx0IF9ubF9sb2NhbGVfbmFtZV9kZWZhdWx0Ci0tZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9sb2NhbGVfbmFtZV9kZWZhdWx0ICh2b2lkKTsKLS0jIGRlZmluZSBnbF9sb2NhbGVfbmFtZSBfbmxfbG9jYWxlX25hbWUKLS1leHRlcm4gY29uc3QgY2hhciAqX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSk7Ci0tI2VuZGlmCi0tCi0tc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpfX2Rpcm5hbWUsIGNoYXIgKl9fbG9jYWxlLAotLQkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkJCSBzdHJ1Y3QgYmluZGluZyAqX19kb21haW5iaW5kaW5nKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tdm9pZCBfbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluLAotLQkJICAgICAgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKLS0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotLQotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tY2hhciAqX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLS0JCSAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0tCQkgICAgY29uc3QgY2hhciAqbXNnaWQsCi0tCQkgICAgc2l6ZV90ICpsZW5ndGhwKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tI2Vsc2UKLS1jaGFyICpfbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotLQkJICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICptc2dpZCwKLS0JCSAgICBpbnQgY29udmVydCwgc2l6ZV90ICpsZW5ndGhwKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tI2VuZGlmCi0tCi0tLyogVGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhbG9uZSBsaWJpbnRsLmEgbXVzdCBoYXZlIGRpZmZlcmVudAotLSAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCi0tICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCi0tI2lmICFkZWZpbmVkIF9MSUJDCi0tIyBkZWZpbmUgX25sX2RlZmF1bHRfZGlybmFtZSBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZQotLSMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKLS0jZW5kaWYKLS0KLS0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi0tZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOwotLSNpZmRlZiBfTElCQwotLWxpYmNfaGlkZGVuX3Byb3RvIChfbmxfZGVmYXVsdF9kaXJuYW1lKQotLSNlbmRpZgotLQotLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KLS1leHRlcm4gc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0tCi0tLyogVGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhbG9uZSBsaWJpbnRsLmEgbXVzdCBoYXZlIGRpZmZlcmVudAotLSAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCi0tICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCi0tI2lmICFkZWZpbmVkIF9MSUJDCi0tIyBkZWZpbmUgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluCi0tIyBkZWZpbmUgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluCi0tI2VuZGlmCi0tCi0tLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCi0tZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSBhdHRyaWJ1dGVfaGlkZGVuOwotLQotLS8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLwotLWV4dGVybiBjb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBhdHRyaWJ1dGVfaGlkZGVuOwotLQotLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotLQotLSNlbmRpZiAvKiBnZXR0ZXh0UC5oICAqLwotLS0tIGEvaW50bC9nbW8uaAotKysrIC9kZXYvbnVsbAotQEAgLTEsMTUyICswLDAgQEAKLS0vKiBEZXNjcmlwdGlvbiBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdDogZ2VuZXJhbCBmaWxlIGxheW91dC4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMiwgMjAwNCwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX0dFVFRFWFRfSAotLSNkZWZpbmUgX0dFVFRFWFRfSCAxCi0tCi0tI2luY2x1ZGUgPGxpbWl0cy5oPgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0vKiBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdC4gICovCi0tI2RlZmluZSBfTUFHSUMgMHg5NTA0MTJkZQotLSNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQotLQotLS8qIFJldmlzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudGx5IHVzZWQgLm1vIChiaW5hcnkpIGZpbGUgZm9ybWF0LiAgKi8KLS0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCi0tI2RlZmluZSBNT19SRVZJU0lPTl9OVU1CRVJfV0lUSF9TWVNERVBfSSAxCi0tCi0tLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCi0tICAgdG8gZGV0ZXJtaW5lIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUgdGhhdCBpcyAzMiBiaXRzIHdpZGUuICBBbgotLSAgIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIHVzZSBhdXRvY29uZidzIEFDX0NIRUNLX1NJWkVPRiBtYWNybywgYnV0Ci0tICAgYXMgb2YgdmVyc2lvbiBhdXRvY29uZi0yLjEzLCB0aGUgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvIGRvZXNuJ3Qgd29yawotLSAgIHdoZW4gY3Jvc3MtY29tcGlsaW5nLiAgKi8KLS0KLS0jaWYgX19TVERDX18KLS0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCi0tI2Vsc2UKLS0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKLS0jZW5kaWYKLS0KLS0vKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgotLSAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQotLSAgIHRoYXQgZG9lc24ndCBpbmNsdWRlIDE2LWJpdCBzeXN0ZW1zLCBhbmQgb25seSBtb2Rlcm4gc3lzdGVtcwotLSAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCi0tCi0tI2lmbmRlZiBVSU5UX01BWAotLSMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKLS0jZW5kaWYKLS0KLS0jaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotLXR5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKLS0jZWxzZQotLSMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLS10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7Ci0tIyBlbHNlCi0tIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLS10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKLS0jICBlbHNlCi0tICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKLS0gICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLwotLSAgIkNhbm5vdCBkZXRlcm1pbmUgdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZS4iCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tCi0tLyogSGVhZGVyIGZvciBiaW5hcnkgLm1vIGZpbGUgZm9ybWF0LiAgKi8KLS1zdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKLS17Ci0tICAvKiBUaGUgbWFnaWMgbnVtYmVyLiAgKi8KLS0gIG5sc191aW50MzIgbWFnaWM7Ci0tICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCi0tICBubHNfdWludDMyIHJldmlzaW9uOwotLQotLSAgLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1ham9yIHJldmlzaW9uIDAgb3IgMS4gICovCi0tCi0tICAvKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgcGFpcnMuICAqLwotLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLS0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCi0tICBubHNfdWludDMyIG9yaWdfdGFiX29mZnNldDsKLS0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzdHJpbmdzLiAgKi8KLS0gIG5sc191aW50MzIgdHJhbnNfdGFiX29mZnNldDsKLS0gIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCi0tICBubHNfdWludDMyIGhhc2hfdGFiX3NpemU7Ci0tICAvKiBPZmZzZXQgb2YgZmlyc3QgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0tICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKLS0KLS0gIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtaW5vciByZXZpc2lvbiA+PSAxLiAgKi8KLS0KLS0gIC8qIFRoZSBudW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCi0tICBubHNfdWludDMyIG5fc3lzZGVwX3NlZ21lbnRzOwotLSAgLyogT2Zmc2V0IG9mIHRhYmxlIGRlc2NyaWJpbmcgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCi0tICBubHNfdWludDMyIHN5c2RlcF9zZWdtZW50c19vZmZzZXQ7Ci0tICAvKiBUaGUgbnVtYmVyIG9mIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBwYWlycy4gICovCi0tICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7Ci0tICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN5c2RlcCBzdHJpbmdzLiAgKi8KLS0gIG5sc191aW50MzIgb3JpZ19zeXNkZXBfdGFiX29mZnNldDsKLS0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCi0tICBubHNfdWludDMyIHRyYW5zX3N5c2RlcF90YWJfb2Zmc2V0OwotLX07Ci0tCi0tLyogRGVzY3JpcHRvciBmb3Igc3RhdGljIHN0cmluZyBjb250YWluZWQgaW4gdGhlIGJpbmFyeSAubW8gZmlsZS4gICovCi0tc3RydWN0IHN0cmluZ19kZXNjCi0tewotLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcsIG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCi0tICBubHNfdWludDMyIGxlbmd0aDsKLS0gIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCi0tICBubHNfdWludDMyIG9mZnNldDsKLS19OwotLQotLS8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtaW5vciByZXZpc2lvbiA+PSAxLiAgKi8KLS0KLS0vKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LiAgKi8KLS1zdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQKLS17Ci0tICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLwotLSAgbmxzX3VpbnQzMiBsZW5ndGg7Ci0tICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLwotLSAgbmxzX3VpbnQzMiBvZmZzZXQ7Ci0tfTsKLS0KLS0vKiBQYWlyIG9mIGEgc3RhdGljIGFuZCBhIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudCwgaW4gc3RydWN0IHN5c2RlcF9zdHJpbmcuICAqLwotLXN0cnVjdCBzZWdtZW50X3BhaXIKLS17Ci0tICAvKiBTaXplIG9mIHN0YXRpYyBzZWdtZW50LiAgKi8KLS0gIG5sc191aW50MzIgc2Vnc2l6ZTsKLS0gIC8qIFJlZmVyZW5jZSB0byBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LCBvciB+MCBhdCB0aGUgZW5kLiAgKi8KLS0gIG5sc191aW50MzIgc3lzZGVwcmVmOwotLX07Ci0tCi0tLyogRGVzY3JpcHRvciBmb3Igc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcuICAqLwotLXN0cnVjdCBzeXNkZXBfc3RyaW5nCi0tewotLSAgLyogT2Zmc2V0IG9mIHN0YXRpYyBzdHJpbmcgc2VnbWVudHMgaW4gZmlsZS4gICovCi0tICBubHNfdWludDMyIG9mZnNldDsKLS0gIC8qIEFsdGVybmF0aW5nIHNlcXVlbmNlIG9mIHN0YXRpYyBhbmQgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4KLS0gICAgIFRoZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGF0aWMgc2VnbWVudCwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLwotLSAgc3RydWN0IHNlZ21lbnRfcGFpciBzZWdtZW50c1sxXTsKLS19OwotLQotLS8qIE1hcmtlciBmb3IgdGhlIGVuZCBvZiB0aGUgc2VnbWVudHNbXSBhcnJheS4gIFRoaXMgaGFzIHRoZSB2YWx1ZSAweEZGRkZGRkZGLAotLSAgIHJlZ2FyZGxlc3Mgd2hldGhlciAnaW50JyBpcyAxNiBiaXQsIDMyIGJpdCwgb3IgNjQgYml0LiAgKi8KLS0jZGVmaW5lIFNFR01FTlRTX0VORCAoKG5sc191aW50MzIpIH4wKQotLQotLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotLQotLSNlbmRpZgkvKiBnZXR0ZXh0LmggICovCi0tLS0gYS9pbnRsL2hhc2gtc3RyaW5nLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDUxICswLDAgQEAKLS0vKiBJbXBsZW1lbnRzIGEgc3RyaW5nIGhhc2hpbmcgZnVuY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotLQotLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLS0gICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLS0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotLSAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tLyogU3BlY2lmaWNhdGlvbi4gICovCi0tI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCi0tCi0tCi0tLyogRGVmaW5lcyB0aGUgc28gY2FsbGVkIGBoYXNocGp3JyBmdW5jdGlvbiBieSBQLkouIFdlaW5iZXJnZXIKLS0gICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCi0tICAgMTk4NiwgMTk4NyBCZWxsIFRlbGVwaG9uZSBMYWJvcmF0b3JpZXMsIEluYy5dICAqLwotLXVuc2lnbmVkIGxvbmcgaW50Ci0tX19oYXNoX3N0cmluZyAoY29uc3QgY2hhciAqc3RyX3BhcmFtKQotLXsKLS0gIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwsIGc7Ci0tICBjb25zdCBjaGFyICpzdHIgPSBzdHJfcGFyYW07Ci0tCi0tICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgKi8KLS0gIGh2YWwgPSAwOwotLSAgd2hpbGUgKCpzdHIgIT0gJ1wwJykKLS0gICAgewotLSAgICAgIGh2YWwgPDw9IDQ7Ci0tICAgICAgaHZhbCArPSAodW5zaWduZWQgY2hhcikgKnN0cisrOwotLSAgICAgIGcgPSBodmFsICYgKCh1bnNpZ25lZCBsb25nIGludCkgMHhmIDw8IChIQVNIV09SREJJVFMgLSA0KSk7Ci0tICAgICAgaWYgKGcgIT0gMCkKLS0JewotLQkgIGh2YWwgXj0gZyA+PiAoSEFTSFdPUkRCSVRTIC0gOCk7Ci0tCSAgaHZhbCBePSBnOwotLQl9Ci0tICAgIH0KLS0gIHJldHVybiBodmFsOwotLX0KLS0tLSBhL2ludGwvaGFzaC1zdHJpbmcuaAotKysrIC9kZXYvbnVsbAotQEAgLTEsMzYgKzAsMCBAQAotLS8qIERlc2NyaXB0aW9uIG9mIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0OiBzdHJpbmcgaGFzaGluZyBmdW5jdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTctMTk5OCwgMjAwMC0yMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLS8qIFdlIGFzc3VtZSB0byBoYXZlIGB1bnNpZ25lZCBsb25nIGludCcgdmFsdWUgd2l0aCBhdCBsZWFzdCAzMiBiaXRzLiAgKi8KLS0jZGVmaW5lIEhBU0hXT1JEQklUUyAzMgotLQotLQotLSNpZm5kZWYgX0xJQkMKLS0jIGlmZGVmIElOX0xJQklOVEwKLS0jICBkZWZpbmUgX19oYXNoX3N0cmluZyBsaWJpbnRsX2hhc2hfc3RyaW5nCi0tIyBlbHNlCi0tIyAgZGVmaW5lIF9faGFzaF9zdHJpbmcgaGFzaF9zdHJpbmcKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogRGVmaW5lcyB0aGUgc28gY2FsbGVkIGBoYXNocGp3JyBmdW5jdGlvbiBieSBQLkouIFdlaW5iZXJnZXIKLS0gICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCi0tICAgMTk4NiwgMTk4NyBCZWxsIFRlbGVwaG9uZSBMYWJvcmF0b3JpZXMsIEluYy5dICAqLwotLWV4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX2hhc2hfc3RyaW5nIChjb25zdCBjaGFyICpzdHJfcGFyYW0pOwotLS0tIGEvaW50bC9pbnRsLWNvbXBhdC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMzMgKzAsMCBAQAotLS8qIGludGwtY29tcGF0LmMgLSBTdHViIGZ1bmN0aW9ucyB0byBjYWxsIGdldHRleHQgZnVuY3Rpb25zIGZyb20gR05VIGdldHRleHQKLS0gICBMaWJyYXJ5LgotLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMjAwMC0yMDAzLCAyMDA1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tLyogVGhpcyBmaWxlIHJlZGlyZWN0cyB0aGUgZ2V0dGV4dCBmdW5jdGlvbnMgKHdpdGhvdXQgcHJlZml4KSB0byB0aG9zZQotLSAgIGRlZmluZWQgaW4gdGhlIGluY2x1ZGVkIEdOVSBsaWJpbnRsIGxpYnJhcnkgKHdpdGggImxpYmludGxfIiBwcmVmaXgpLgotLSAgIEl0IGlzIGNvbXBpbGVkIGludG8gbGliaW50bCBpbiBvcmRlciB0byBtYWtlIHRoZSBBTV9HTlVfR0VUVEVYVCB0ZXN0Ci0tICAgb2YgZ2V0dGV4dCA8PSAwLjExLjIgd29yayB3aXRoIHRoZSBsaWJpbnRsIGxpYnJhcnkgPj0gMC4xMS4zIHdoaWNoCi0tICAgaGFzIHRoZSByZWRpcmVjdGlvbnMgcHJpbWFyaWx5IGluIHRoZSA8bGliaW50bC5oPiBpbmNsdWRlIGZpbGUuCi0tICAgSXQgaXMgYWxzbyBjb21waWxlZCBpbnRvIGxpYmdudWludGwgc28gdGhhdCBsaWJnbnVpbnRsLnNvIGNhbiBiZSB1c2VkCi0tICAgYXMgTERfUFJFTE9BRGFibGUgbGlicmFyeSBvbiBnbGliYyBzeXN0ZW1zLCB0byBwcm92aWRlIHRoZSBleHRyYQotLSAgIGZlYXR1cmVzIHRoYXQgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgbGliYyBkb24ndCBoYXZlIChuYW1lbHksIGxvZ2dpbmcpLiAgKi8KLS0KLS0KLS0jdW5kZWYgZ2V0dGV4dAotLSN1bmRlZiBkZ2V0dGV4dAotLSN1bmRlZiBkY2dldHRleHQKLS0jdW5kZWYgbmdldHRleHQKLS0jdW5kZWYgZG5nZXR0ZXh0Ci0tI3VuZGVmIGRjbmdldHRleHQKLS0jdW5kZWYgdGV4dGRvbWFpbgotLSN1bmRlZiBiaW5kdGV4dGRvbWFpbgotLSN1bmRlZiBiaW5kX3RleHRkb21haW5fY29kZXNldAotLQotLQotLS8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKLS0gICB0aGUgZnVuY3Rpb25zIGFyZSBvbmx5IGRlZmluZWQgZm9yIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZQotLSAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCi0tI2lmIEhBVkVfVklTSUJJTElUWSAmJiBCVUlMRElOR19ETEwKLS0jIGRlZmluZSBETExfRVhQT1JURUQgX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCi0tI2VsaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKLS0jIGRlZmluZSBETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0tI2Vsc2UKLS0jIGRlZmluZSBETExfRVhQT1JURUQKLS0jZW5kaWYKLS0KLS0KLS1ETExfRVhQT1JURUQKLS1jaGFyICoKLS1nZXR0ZXh0IChjb25zdCBjaGFyICptc2dpZCkKLS17Ci0tICByZXR1cm4gbGliaW50bF9nZXR0ZXh0IChtc2dpZCk7Ci0tfQotLQotLQotLURMTF9FWFBPUlRFRAotLWNoYXIgKgotLWRnZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCkKLS17Ci0tICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQpOwotLX0KLS0KLS0KLS1ETExfRVhQT1JURUQKLS1jaGFyICoKLS1kY2dldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkLCBpbnQgY2F0ZWdvcnkpCi0tewotLSAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOwotLX0KLS0KLS0KLS1ETExfRVhQT1JURUQKLS1jaGFyICoKLS1uZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCi0tewotLSAgcmV0dXJuIGxpYmludGxfbmdldHRleHQgKG1zZ2lkMSwgbXNnaWQyLCBuKTsKLS19Ci0tCi0tCi0tRExMX0VYUE9SVEVECi0tY2hhciAqCi0tZG5nZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKLS17Ci0tICByZXR1cm4gbGliaW50bF9kbmdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuKTsKLS19Ci0tCi0tCi0tRExMX0VYUE9SVEVECi0tY2hhciAqCi0tZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKLS0JICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuLAotLQkgICAgaW50IGNhdGVnb3J5KQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2RjbmdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBjYXRlZ29yeSk7Ci0tfQotLQotLQotLURMTF9FWFBPUlRFRAotLWNoYXIgKgotLXRleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCi0tewotLSAgcmV0dXJuIGxpYmludGxfdGV4dGRvbWFpbiAoZG9tYWlubmFtZSk7Ci0tfQotLQotLQotLURMTF9FWFBPUlRFRAotLWNoYXIgKgotLWJpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpkaXJuYW1lKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKTsKLS19Ci0tCi0tCi0tRExMX0VYUE9SVEVECi0tY2hhciAqCi0tYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmNvZGVzZXQpCi0tewotLSAgcmV0dXJuIGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGRvbWFpbm5hbWUsIGNvZGVzZXQpOwotLX0KLS0tLSBhL2ludGwvaW50bC1leHBvcnRzLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDM2ICswLDAgQEAKLS0vKiBMaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMgb2YgbGliaW50bCBvbiBDeWd3aW4uCi0tICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDA2LgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tIC8qIElNUCh4KSBpcyBhIHN5bWJvbCB0aGF0IGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHguICAqLwotLSNkZWZpbmUgSU1QKHgpIF9pbXBfXyMjeAotLQotLSAvKiBFbnN1cmUgdGhhdCB0aGUgdmFyaWFibGUgeCBpcyBleHBvcnRlZCBmcm9tIHRoZSBsaWJyYXJ5LCBhbmQgdGhhdCBhCi0tICAgIHBzZXVkby12YXJpYWJsZSBJTVAoeCkgaXMgYXZhaWxhYmxlLiAgKi8KLS0jZGVmaW5lIFZBUklBQkxFKHgpIFwKLS0gLyogRXhwb3J0IHggd2l0aG91dCByZWRlZmluaW5nIHguICBUaGlzIGNvZGUgd2FzIGZvdW5kIGJ5IGNvbXBpbGluZyBhCVwKLS0gICAgc25pcHBldDoJCQkJCQkJCVwKLS0gICAgICBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCB4OyBpbnQgeCA9IDQyOyAgKi8JCVwKLS0gYXNtICgiLnNlY3Rpb24gLmRyZWN0dmVcbiIpOwkJCQkJCVwKLS0gYXNtICgiLmFzY2lpIFwiIC1leHBvcnQ6IiAjeCAiLGRhdGFcIlxuIik7CQkJCVwKLS0gYXNtICgiLmRhdGFcbiIpOwkJCQkJCQlcCi0tIC8qIEFsbG9jYXRlIGEgcHNldWRvLXZhcmlhYmxlIElNUCh4KS4gICovCQkJCVwKLS0gZXh0ZXJuIGludCB4OwkJCQkJCQkJXAotLSB2b2lkICogSU1QKHgpID0gJng7Ci0tCi0tVkFSSUFCTEUobGliaW50bF92ZXJzaW9uKQotLS0tIGEvaW50bC9sMTBuZmxpc3QuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNDAwICswLDAgQEAKLS0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIHN0cGNweSgpLgotLSAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQotLSAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KLS0jaWZuZGVmIF9HTlVfU09VUkNFCi0tIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotLSNlbmRpZgotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tCi0tI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX0FSR1pfSAotLSMgaW5jbHVkZSA8YXJnei5oPgotLSNlbmRpZgotLSNpbmNsdWRlIDxjdHlwZS5oPgotLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tCi0tI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0tCi0tLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCi0tI2lmbmRlZiBOVUxMCi0tIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0tIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0tIyBlbHNlCi0tIyAgZGVmaW5lIE5VTEwgMAotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tI2lmZGVmIF9MSUJDCi0tLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0tICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLS0jIGlmbmRlZiBzdHBjcHkKLS0jICBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQotLSMgZW5kaWYKLS0jZWxzZQotLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi0tc3RhdGljIGNoYXIgKnN0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKTsKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogUGF0aG5hbWUgc3VwcG9ydC4KLS0gICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLS0gICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKLS0gICAgICAgICAgICAgICAgICAgICAgICBpdCBtYXkgYmUgY29uY2F0ZW5hdGVkIHRvIGEgZGlyZWN0b3J5IHBhdGhuYW1lLgotLSAqLwotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0tICAvKiBXaW4zMiwgQ3lnd2luLCBPUy8yLCBET1MgKi8KLS0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQotLSMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAotLSAgICAoKCgoUClbMF0gPj0gJ0EnICYmIChQKVswXSA8PSAnWicpIHx8ICgoUClbMF0gPj0gJ2EnICYmIChQKVswXSA8PSAneicpKSBcCi0tICAgICAmJiAoUClbMV0gPT0gJzonKQotLSMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgKElTU0xBU0ggKChQKVswXSkgfHwgSEFTX0RFVklDRSAoUCkpCi0tI2Vsc2UKLS0gIC8qIFVuaXggKi8KLS0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQotLSMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgSVNTTEFTSCAoKFApWzBdKQotLSNlbmRpZgotLQotLS8qIERlZmluZSBmdW5jdGlvbiB3aGljaCBhcmUgdXN1YWxseSBub3QgYXZhaWxhYmxlLiAgKi8KLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBfX2FyZ3pfY291bnQoYXJneiwgbGVuKSBJTlRVU0UoX19hcmd6X2NvdW50KSAoYXJneiwgbGVuKQotLSNlbGlmIGRlZmluZWQgSEFWRV9BUkdaX0NPVU5UCi0tIyB1bmRlZiBfX2FyZ3pfY291bnQKLS0jIGRlZmluZSBfX2FyZ3pfY291bnQgYXJnel9jb3VudAotLSNlbHNlCi0tLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCi0tc3RhdGljIHNpemVfdAotLWFyZ3pfY291bnRfXyAoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikKLS17Ci0tICBzaXplX3QgY291bnQgPSAwOwotLSAgd2hpbGUgKGxlbiA+IDApCi0tICAgIHsKLS0gICAgICBzaXplX3QgcGFydF9sZW4gPSBzdHJsZW4gKGFyZ3opOwotLSAgICAgIGFyZ3ogKz0gcGFydF9sZW4gKyAxOwotLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0tICAgICAgY291bnQrKzsKLS0gICAgfQotLSAgcmV0dXJuIGNvdW50OwotLX0KLS0jIHVuZGVmIF9fYXJnel9jb3VudAotLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfQVJHWl9DT1VOVCAqLwotLQotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIFwKLS0gIElOVFVTRShfX2FyZ3pfc3RyaW5naWZ5KSAoYXJneiwgbGVuLCBzZXApCi0tI2VsaWYgZGVmaW5lZCBIQVZFX0FSR1pfU1RSSU5HSUZZCi0tIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5Ci0tIyBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeSBhcmd6X3N0cmluZ2lmeQotLSNlbHNlCi0tLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncwotLSAgIGV4Y2VwdCB0aGUgbGFzdCBpbnRvIHRoZSBjaGFyYWN0ZXIgU0VQLiAgKi8KLS1zdGF0aWMgdm9pZAotLWFyZ3pfc3RyaW5naWZ5X18gKGNoYXIgKmFyZ3osIHNpemVfdCBsZW4sIGludCBzZXApCi0tewotLSAgd2hpbGUgKGxlbiA+IDApCi0tICAgIHsKLS0gICAgICBzaXplX3QgcGFydF9sZW4gPSBzdHJsZW4gKGFyZ3opOwotLSAgICAgIGFyZ3ogKz0gcGFydF9sZW47Ci0tICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKLS0gICAgICBpZiAobGVuID4gMCkKLS0JKmFyZ3orKyA9IHNlcDsKLS0gICAgfQotLX0KLS0jIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKLS0jIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBhcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKLS0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX0FSR1pfU1RSSU5HSUZZICovCi0tCi0tI2lmZGVmIF9MSUJDCi0tI2VsaWYgZGVmaW5lZCBIQVZFX0FSR1pfTkVYVAotLSMgdW5kZWYgX19hcmd6X25leHQKLS0jIGRlZmluZSBfX2FyZ3pfbmV4dCBhcmd6X25leHQKLS0jZWxzZQotLXN0YXRpYyBjaGFyICoKLS1hcmd6X25leHRfXyAoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLCBjb25zdCBjaGFyICplbnRyeSkKLS17Ci0tICBpZiAoZW50cnkpCi0tICAgIHsKLS0gICAgICBpZiAoZW50cnkgPCBhcmd6ICsgYXJnel9sZW4pCi0tICAgICAgICBlbnRyeSA9IHN0cmNociAoZW50cnksICdcMCcpICsgMTsKLS0KLS0gICAgICByZXR1cm4gZW50cnkgPj0gYXJneiArIGFyZ3pfbGVuID8gTlVMTCA6IChjaGFyICopIGVudHJ5OwotLSAgICB9Ci0tICBlbHNlCi0tICAgIGlmIChhcmd6X2xlbiA+IDApCi0tICAgICAgcmV0dXJuIGFyZ3o7Ci0tICAgIGVsc2UKLS0gICAgICByZXR1cm4gMDsKLS19Ci0tIyB1bmRlZiBfX2FyZ3pfbmV4dAotLSMgZGVmaW5lIF9fYXJnel9uZXh0KGFyZ3osIGxlbiwgZW50cnkpIGFyZ3pfbmV4dF9fIChhcmd6LCBsZW4sIGVudHJ5KQotLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfQVJHWl9ORVhUICovCi0tCi0tCi0tLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KLS1zdGF0aWMgaW5saW5lIGludAotLXBvcCAoaW50IHgpCi0tewotLSAgLyogV2UgYXNzdW1lIHRoYXQgbm8gbW9yZSB0aGFuIDE2IGJpdHMgYXJlIHVzZWQuICAqLwotLSAgeCA9ICgoeCAmIH4weDU1NTUpID4+IDEpICsgKHggJiAweDU1NTUpOwotLSAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOwotLSAgeCA9ICgoeCA+PiA0KSArIHgpICYgMHgwZjBmOwotLSAgeCA9ICgoeCA+PiA4KSArIHgpICYgMHhmZjsKLS0KLS0gIHJldHVybiB4OwotLX0KLS0KLS0MCi0tc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi0tX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKLS0JCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sCi0tCQkgICAgaW50IG1hc2ssIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCi0tCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAotLQkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLAotLQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpCi0tewotLSAgY2hhciAqYWJzX2ZpbGVuYW1lOwotLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmxhc3RwOwotLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwotLSAgY2hhciAqY3A7Ci0tICBzaXplX3QgZGlybGlzdF9jb3VudDsKLS0gIHNpemVfdCBlbnRyaWVzOwotLSAgaW50IGNudDsKLS0KLS0gIC8qIElmIExBTkdVQUdFIGNvbnRhaW5zIGFuIGFic29sdXRlIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLCB3ZSBpZ25vcmUKLS0gICAgIERJUkxJU1QuICAqLwotLSAgaWYgKElTX0FCU09MVVRFX1BBVEggKGxhbmd1YWdlKSkKLS0gICAgZGlybGlzdF9sZW4gPSAwOwotLQotLSAgLyogQWxsb2NhdGUgcm9vbSBmb3IgdGhlIGZ1bGwgZmlsZSBuYW1lLiAgKi8KLS0gIGFic19maWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlybGlzdF9sZW4KLS0JCQkJICArIHN0cmxlbiAobGFuZ3VhZ2UpCi0tCQkJCSAgKyAoKG1hc2sgJiBYUEdfVEVSUklUT1JZKSAhPSAwCi0tCQkJCSAgICAgPyBzdHJsZW4gKHRlcnJpdG9yeSkgKyAxIDogMCkKLS0JCQkJICArICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0tCQkJCSAgICAgPyBzdHJsZW4gKGNvZGVzZXQpICsgMSA6IDApCi0tCQkJCSAgKyAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwCi0tCQkJCSAgICAgPyBzdHJsZW4gKG5vcm1hbGl6ZWRfY29kZXNldCkgKyAxIDogMCkKLS0JCQkJICArICgobWFzayAmIFhQR19NT0RJRklFUikgIT0gMAotLQkJCQkgICAgID8gc3RybGVuIChtb2RpZmllcikgKyAxIDogMCkKLS0JCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwotLQotLSAgaWYgKGFic19maWxlbmFtZSA9PSBOVUxMKQotLSAgICByZXR1cm4gTlVMTDsKLS0KLS0gIC8qIENvbnN0cnVjdCBmaWxlIG5hbWUuICAqLwotLSAgY3AgPSBhYnNfZmlsZW5hbWU7Ci0tICBpZiAoZGlybGlzdF9sZW4gPiAwKQotLSAgICB7Ci0tICAgICAgbWVtY3B5IChjcCwgZGlybGlzdCwgZGlybGlzdF9sZW4pOwotLSAgICAgIF9fYXJnel9zdHJpbmdpZnkgKGNwLCBkaXJsaXN0X2xlbiwgUEFUSF9TRVBBUkFUT1IpOwotLSAgICAgIGNwICs9IGRpcmxpc3RfbGVuOwotLSAgICAgIGNwWy0xXSA9ICcvJzsKLS0gICAgfQotLQotLSAgY3AgPSBzdHBjcHkgKGNwLCBsYW5ndWFnZSk7Ci0tCi0tICBpZiAoKG1hc2sgJiBYUEdfVEVSUklUT1JZKSAhPSAwKQotLSAgICB7Ci0tICAgICAgKmNwKysgPSAnXyc7Ci0tICAgICAgY3AgPSBzdHBjcHkgKGNwLCB0ZXJyaXRvcnkpOwotLSAgICB9Ci0tICBpZiAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMCkKLS0gICAgewotLSAgICAgICpjcCsrID0gJy4nOwotLSAgICAgIGNwID0gc3RwY3B5IChjcCwgY29kZXNldCk7Ci0tICAgIH0KLS0gIGlmICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApCi0tICAgIHsKLS0gICAgICAqY3ArKyA9ICcuJzsKLS0gICAgICBjcCA9IHN0cGNweSAoY3AsIG5vcm1hbGl6ZWRfY29kZXNldCk7Ci0tICAgIH0KLS0gIGlmICgobWFzayAmIFhQR19NT0RJRklFUikgIT0gMCkKLS0gICAgewotLSAgICAgICpjcCsrID0gJ0AnOwotLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOwotLSAgICB9Ci0tCi0tICAqY3ArKyA9ICcvJzsKLS0gIHN0cGNweSAoY3AsIGZpbGVuYW1lKTsKLS0KLS0gIC8qIExvb2sgaW4gbGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zIHdoZXRoZXIgaXQgaXMgYWxyZWFkeQotLSAgICAgYXZhaWxhYmxlLiAgKi8KLS0gIGxhc3RwID0gbDEwbmZpbGVfbGlzdDsKLS0gIGZvciAocmV0dmFsID0gKmwxMG5maWxlX2xpc3Q7IHJldHZhbCAhPSBOVUxMOyByZXR2YWwgPSByZXR2YWwtPm5leHQpCi0tICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCi0tICAgICAgewotLQlpbnQgY29tcGFyZSA9IHN0cmNtcCAocmV0dmFsLT5maWxlbmFtZSwgYWJzX2ZpbGVuYW1lKTsKLS0JaWYgKGNvbXBhcmUgPT0gMCkKLS0JICAvKiBXZSBmb3VuZCBpdCEgICovCi0tCSAgYnJlYWs7Ci0tCWlmIChjb21wYXJlIDwgMCkKLS0JICB7Ci0tCSAgICAvKiBJdCdzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0tCSAgICByZXR2YWwgPSBOVUxMOwotLQkgICAgYnJlYWs7Ci0tCSAgfQotLQotLQlsYXN0cCA9ICZyZXR2YWwtPm5leHQ7Ci0tICAgICAgfQotLQotLSAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCi0tICAgIHsKLS0gICAgICBmcmVlIChhYnNfZmlsZW5hbWUpOwotLSAgICAgIHJldHVybiByZXR2YWw7Ci0tICAgIH0KLS0KLS0gIGRpcmxpc3RfY291bnQgPSAoZGlybGlzdF9sZW4gPiAwID8gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgOiAxKTsKLS0KLS0gIC8qIEFsbG9jYXRlIGEgbmV3IGxvYWRlZF9sMTBuZmlsZS4gICovCi0tICByZXR2YWwgPQotLSAgICAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKQotLSAgICBtYWxsb2MgKHNpemVvZiAoKnJldHZhbCkKLS0JICAgICsgKCgoZGlybGlzdF9jb3VudCA8PCBwb3AgKG1hc2spKSArIChkaXJsaXN0X2NvdW50ID4gMSA/IDEgOiAwKSkKLS0JICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopKSk7Ci0tICBpZiAocmV0dmFsID09IE5VTEwpCi0tICAgIHsKLS0gICAgICBmcmVlIChhYnNfZmlsZW5hbWUpOwotLSAgICAgIHJldHVybiBOVUxMOwotLSAgICB9Ci0tCi0tICByZXR2YWwtPmZpbGVuYW1lID0gYWJzX2ZpbGVuYW1lOwotLQotLSAgLyogV2Ugc2V0IHJldHZhbC0+ZGF0YSB0byBOVUxMIGhlcmU7IGl0IGlzIGZpbGxlZCBpbiBsYXRlci4KLS0gICAgIFNldHRpbmcgcmV0dmFsLT5kZWNpZGVkIHRvIDEgaGVyZSBtZWFucyB0aGF0IHJldHZhbCBkb2VzIG5vdAotLSAgICAgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZSAoZGlybGlzdF9jb3VudCA+IDEpIG9yIGlzIG5vdCB3b3J0aAotLSAgICAgbG9va2luZyB1cCAoaWYgYW4gdW5ub3JtYWxpemVkIGNvZGVzZXQgd2FzIHNwZWNpZmllZCkuICAqLwotLSAgcmV0dmFsLT5kZWNpZGVkID0gKGRpcmxpc3RfY291bnQgPiAxCi0tCQkgICAgIHx8ICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0tCQkJICYmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpOwotLSAgcmV0dmFsLT5kYXRhID0gTlVMTDsKLS0KLS0gIHJldHZhbC0+bmV4dCA9ICpsYXN0cDsKLS0gICpsYXN0cCA9IHJldHZhbDsKLS0KLS0gIGVudHJpZXMgPSAwOwotLSAgLyogUmVjdXJzZSB0byBmaWxsIHRoZSBpbmhlcml0YW5jZSBsaXN0IG9mIFJFVFZBTC4KLS0gICAgIElmIHRoZSBESVJMSVNUIGlzIGEgcmVhbCBsaXN0IChpLmUuIERJUkxJU1RfQ09VTlQgPiAxKSwgdGhlIFJFVFZBTAotLSAgICAgZW50cnkgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZTsgcmV0dmFsLT5maWxlbmFtZSBjb250YWlucwotLSAgICAgY29sb25zLiAgSW4gdGhpcyBjYXNlIHdlIGxvb3AgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBESVJMSVNUIGFuZAotLSAgICAgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5IE1BU0suCi0tICAgICBJZiB0aGUgRElSTElTVCBpcyBhIHNpbmdsZSBkaXJlY3Rvcnkgb3IgZW50aXJlbHkgcmVkdW5kYW50IChpLmUuCi0tICAgICBESVJMSVNUX0NPVU5UID09IDEpLCB3ZSBsb29wIGFjcm9zcyBhbGwgYml0IHBhdHRlcm5zIGRvbWluYXRlZCBieQotLSAgICAgTUFTSywgZXhjbHVkaW5nIE1BU0sgaXRzZWxmLgotLSAgICAgSW4gZWl0aGVyIGNhc2UsIHdlIGxvb3AgZG93biBmcm9tIE1BU0sgdG8gMC4gIFRoaXMgaGFzIHRoZSBlZmZlY3QKLS0gICAgIHRoYXQgdGhlIGV4dHJhIGJpdHMgaW4gdGhlIGxvY2FsZSBuYW1lIGFyZSBkcm9wcGVkIGluIHRoaXMgb3JkZXI6Ci0tICAgICBmaXJzdCB0aGUgbW9kaWZpZXIsIHRoZW4gdGhlIHRlcnJpdG9yeSwgdGhlbiB0aGUgY29kZXNldCwgdGhlbiB0aGUKLS0gICAgIG5vcm1hbGl6ZWRfY29kZXNldC4gICovCi0tICBmb3IgKGNudCA9IGRpcmxpc3RfY291bnQgPiAxID8gbWFzayA6IG1hc2sgLSAxOyBjbnQgPj0gMDsgLS1jbnQpCi0tICAgIGlmICgoY250ICYgfm1hc2spID09IDAKLS0JJiYgISgoY250ICYgWFBHX0NPREVTRVQpICE9IDAgJiYgKGNudCAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApKQotLSAgICAgIHsKLS0JaWYgKGRpcmxpc3RfY291bnQgPiAxKQotLQkgIHsKLS0JICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgdGhlIERJUkxJU1QuICAqLwotLQkgICAgY2hhciAqZGlyID0gTlVMTDsKLS0KLS0JICAgIHdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQotLQkJICAgIT0gTlVMTCkKLS0JICAgICAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQotLQkJPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpciwgc3RybGVuIChkaXIpICsgMSwKLS0JCQkJICAgICAgY250LCBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAotLQkJCQkgICAgICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBmaWxlbmFtZSwKLS0JCQkJICAgICAgMSk7Ci0tCSAgfQotLQllbHNlCi0tCSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQotLQkgICAgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLAotLQkJCQkgIGNudCwgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKLS0JCQkJICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBmaWxlbmFtZSwgMSk7Ci0tICAgICAgfQotLSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllc10gPSBOVUxMOwotLQotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tDAotLS8qIE5vcm1hbGl6ZSBjb2Rlc2V0IG5hbWUuICBUaGVyZSBpcyBubyBzdGFuZGFyZCBmb3IgdGhlIGNvZGVzZXQKLS0gICBuYW1lcy4gIE5vcm1hbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbgotLSAgIG5hbWVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZQotLSAgIGZyZWVkIGJ5IHRoZSBjYWxsZXIuICAqLwotLWNvbnN0IGNoYXIgKgotLV9ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwgc2l6ZV90IG5hbWVfbGVuKQotLXsKLS0gIGludCBsZW4gPSAwOwotLSAgaW50IG9ubHlfZGlnaXQgPSAxOwotLSAgY2hhciAqcmV0dmFsOwotLSAgY2hhciAqd3A7Ci0tICBzaXplX3QgY250OwotLQotLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0tICAgIGlmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKLS0gICAgICB7Ci0tCSsrbGVuOwotLQotLQlpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCi0tCSAgb25seV9kaWdpdCA9IDA7Ci0tICAgICAgfQotLQotLSAgcmV0dmFsID0gKGNoYXIgKikgbWFsbG9jICgob25seV9kaWdpdCA/IDMgOiAwKSArIGxlbiArIDEpOwotLQotLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgaWYgKG9ubHlfZGlnaXQpCi0tCXdwID0gc3RwY3B5IChyZXR2YWwsICJpc28iKTsKLS0gICAgICBlbHNlCi0tCXdwID0gcmV0dmFsOwotLQotLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotLQlpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCi0tCSAgKndwKysgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKTsKLS0JZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCi0tCSAgKndwKysgPSBjb2Rlc2V0W2NudF07Ci0tCi0tICAgICAgKndwID0gJ1wwJzsKLS0gICAgfQotLQotLSAgcmV0dXJuIChjb25zdCBjaGFyICopIHJldHZhbDsKLS19Ci0tCi0tCi0tLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0tCi0tLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLS0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0tICAgdG8gYmUgZGVmaW5lZC4gICovCi0tI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLS1zdGF0aWMgY2hhciAqCi0tc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCi0tewotLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0tICByZXR1cm4gZGVzdCAtIDE7Ci0tfQotLSNlbmRpZgotLS0tIGEvaW50bC9sYW5ncHJlZnMuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTMwICswLDAgQEAKLS0vKiBEZXRlcm1pbmUgdGhlIHVzZXIncyBsYW5ndWFnZSBwcmVmZXJlbmNlcy4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLQotLSNpZiBIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUUKLS0jIGluY2x1ZGUgPHN0cmluZy5oPgotLSMgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZQcmVmZXJlbmNlcy5oPgotLSMgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZQcm9wZXJ0eUxpc3QuaD4KLS0jIGluY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGQXJyYXkuaD4KLS0jIGluY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGU3RyaW5nLmg+Ci0tZXh0ZXJuIHZvaWQgX25sX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZSAoY2hhciAqbmFtZSk7Ci0tI2VuZGlmCi0tCi0tLyogRGV0ZXJtaW5lIHRoZSB1c2VyJ3MgbGFuZ3VhZ2UgcHJlZmVyZW5jZXMsIGFzIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YKLS0gICBsb2NhbGUgbmFtZXMgaW4gWFBHIHN5bnRheAotLSAgICAgbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bLmNvZGVzZXRdW0Btb2RpZmllcl0KLS0gICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4KLS0gICBUaGUgTEFOR1VBR0UgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lcyBub3QgbmVlZCB0byBiZSBjb25zaWRlcmVkOyBpdCBpcwotLSAgIGFscmVhZHkgdGFrZW4gaW50byBhY2NvdW50IGJ5IHRoZSBjYWxsZXIuICAqLwotLQotLWNvbnN0IGNoYXIgKgotLV9ubF9sYW5ndWFnZV9wcmVmZXJlbmNlc19kZWZhdWx0ICh2b2lkKQotLXsKLS0jaWYgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFIC8qIE1hY09TIFggMTAuMiBvciBuZXdlciAqLwotLSAgewotLSAgICAvKiBDYWNoZSB0aGUgcHJlZmVyZW5jZXMgbGlzdCwgc2luY2UgQ29yZUZvdW5kYXRpb24gY2FsbHMgYXJlIGV4cGVuc2l2ZS4gICovCi0tICAgIHN0YXRpYyBjb25zdCBjaGFyICpjYWNoZWRfbGFuZ3VhZ2VzOwotLSAgICBzdGF0aWMgaW50IGNhY2hlX2luaXRpYWxpemVkOwotLQotLSAgICBpZiAoIWNhY2hlX2luaXRpYWxpemVkKQotLSAgICAgIHsKLS0JQ0ZUeXBlUmVmIHByZWZlcmVuY2VzID0KLS0JICBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIChDRlNUUiAoIkFwcGxlTGFuZ3VhZ2VzIiksCi0tCQkJCSAgICAga0NGUHJlZmVyZW5jZXNDdXJyZW50QXBwbGljYXRpb24pOwotLQlpZiAocHJlZmVyZW5jZXMgIT0gTlVMTAotLQkgICAgJiYgQ0ZHZXRUeXBlSUQgKHByZWZlcmVuY2VzKSA9PSBDRkFycmF5R2V0VHlwZUlEICgpKQotLQkgIHsKLS0JICAgIENGQXJyYXlSZWYgcHJlZkFycmF5ID0gKENGQXJyYXlSZWYpcHJlZmVyZW5jZXM7Ci0tCSAgICBpbnQgbiA9IENGQXJyYXlHZXRDb3VudCAocHJlZkFycmF5KTsKLS0JICAgIGNoYXIgYnVmWzI1Nl07Ci0tCSAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0tCSAgICBpbnQgaTsKLS0KLS0JICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0tCSAgICAgIHsKLS0JCUNGVHlwZVJlZiBlbGVtZW50ID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleCAocHJlZkFycmF5LCBpKTsKLS0JCWlmIChlbGVtZW50ICE9IE5VTEwKLS0JCSAgICAmJiBDRkdldFR5cGVJRCAoZWxlbWVudCkgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQgKCkKLS0JCSAgICAmJiBDRlN0cmluZ0dldENTdHJpbmcgKChDRlN0cmluZ1JlZillbGVtZW50LAotLQkJCQkJICAgYnVmLCBzaXplb2YgKGJ1ZiksCi0tCQkJCQkgICBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKSkKLS0JCSAgewotLQkJICAgIF9ubF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKGJ1Zik7Ci0tCQkgICAgc2l6ZSArPSBzdHJsZW4gKGJ1ZikgKyAxOwotLQkJICAgIC8qIE1vc3QgR05VIHByb2dyYW1zIHVzZSBtc2dpZHMgaW4gRW5nbGlzaCBhbmQgZG9uJ3Qgc2hpcAotLQkJICAgICAgIGFuIGVuLm1vIG1lc3NhZ2UgY2F0YWxvZy4gIFRoZXJlZm9yZSB3aGVuIHdlIHNlZSAiZW4iCi0tCQkgICAgICAgaW4gdGhlIHByZWZlcmVuY2VzIGxpc3QsIGFycmFuZ2UgZm9yIGdldHRleHQoKSB0bwotLQkJICAgICAgIHJldHVybiB0aGUgbXNnaWQsIGFuZCBpZ25vcmUgYWxsIGZ1cnRoZXIgZWxlbWVudHMgb2YKLS0JCSAgICAgICB0aGUgcHJlZmVyZW5jZXMgbGlzdC4gICovCi0tCQkgICAgaWYgKHN0cmNtcCAoYnVmLCAiZW4iKSA9PSAwKQotLQkJICAgICAgYnJlYWs7Ci0tCQkgIH0KLS0JCWVsc2UKLS0JCSAgYnJlYWs7Ci0tCSAgICAgIH0KLS0JICAgIGlmIChzaXplID4gMCkKLS0JICAgICAgewotLQkJY2hhciAqbGFuZ3VhZ2VzID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKLS0KLS0JCWlmIChsYW5ndWFnZXMgIT0gTlVMTCkKLS0JCSAgewotLQkJICAgIGNoYXIgKnAgPSBsYW5ndWFnZXM7Ci0tCi0tCQkgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLS0JCSAgICAgIHsKLS0JCQlDRlR5cGVSZWYgZWxlbWVudCA9Ci0tCQkJICBDRkFycmF5R2V0VmFsdWVBdEluZGV4IChwcmVmQXJyYXksIGkpOwotLQkJCWlmIChlbGVtZW50ICE9IE5VTEwKLS0JCSAgICAgICAgICAgICYmIENGR2V0VHlwZUlEIChlbGVtZW50KSA9PSBDRlN0cmluZ0dldFR5cGVJRCAoKQotLQkJCSAgICAmJiBDRlN0cmluZ0dldENTdHJpbmcgKChDRlN0cmluZ1JlZillbGVtZW50LAotLQkJCQkJCSAgIGJ1Ziwgc2l6ZW9mIChidWYpLAotLQkJCQkJCSAgIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpKQotLQkJCSAgewotLQkJCSAgICBfbmxfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplIChidWYpOwotLQkJCSAgICBzdHJjcHkgKHAsIGJ1Zik7Ci0tCQkJICAgIHAgKz0gc3RybGVuIChidWYpOwotLQkJCSAgICAqcCsrID0gJzonOwotLQkJCSAgICBpZiAoc3RyY21wIChidWYsICJlbiIpID09IDApCi0tCQkJICAgICAgYnJlYWs7Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgYnJlYWs7Ci0tCQkgICAgICB9Ci0tCQkgICAgKi0tcCA9ICdcMCc7Ci0tCi0tCQkgICAgY2FjaGVkX2xhbmd1YWdlcyA9IGxhbmd1YWdlczsKLS0JCSAgfQotLQkgICAgICB9Ci0tCSAgfQotLQljYWNoZV9pbml0aWFsaXplZCA9IDE7Ci0tICAgICAgfQotLSAgICBpZiAoY2FjaGVkX2xhbmd1YWdlcyAhPSBOVUxMKQotLSAgICAgIHJldHVybiBjYWNoZWRfbGFuZ3VhZ2VzOwotLSAgfQotLSNlbmRpZgotLQotLSAgcmV0dXJuIE5VTEw7Ci0tfQotLS0tIGEvaW50bC9saWJnbnVpbnRsLmguaW4KLSsrKyAvZGV2L251bGwKLUBAIC0xLDQxOSArMCwwIEBACi0tLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX0xJQklOVExfSAotLSNkZWZpbmUgX0xJQklOVExfSAkxCi0tCi0tI2luY2x1ZGUgPGxvY2FsZS5oPgotLQotLS8qIFRoZSBMQ19NRVNTQUdFUyBsb2NhbGUgY2F0ZWdvcnkgaXMgdGhlIGNhdGVnb3J5IHVzZWQgYnkgdGhlIGZ1bmN0aW9ucwotLSAgIGdldHRleHQoKSBhbmQgZGdldHRleHQoKS4gIEl0IGlzIHNwZWNpZmllZCBpbiBQT1NJWCwgYnV0IG5vdCBpbiBBTlNJIEMuCi0tICAgT24gc3lzdGVtcyB0aGF0IGRvbid0IGRlZmluZSBpdCwgdXNlIGFuIGFyYml0cmFyeSB2YWx1ZSBpbnN0ZWFkLgotLSAgIE9uIFNvbGFyaXMsIDxsb2NhbGUuaD4gZGVmaW5lcyBfX0xPQ0FMRV9IIChvciBfTE9DQUxFX0ggaW4gU29sYXJpcyAyLjUpCi0tICAgdGhlbiBpbmNsdWRlcyA8bGliaW50bC5oPiAoaS5lLiB0aGlzIGZpbGUhKSBhbmQgdGhlbiBvbmx5IGRlZmluZXMKLS0gICBMQ19NRVNTQUdFUy4gIFRvIGF2b2lkIGEgcmVkZWZpbml0aW9uIHdhcm5pbmcsIGRvbid0IGRlZmluZSBMQ19NRVNTQUdFUwotLSAgIGluIHRoaXMgY2FzZS4gICovCi0tI2lmICFkZWZpbmVkIExDX01FU1NBR0VTICYmICEoZGVmaW5lZCBfX0xPQ0FMRV9IIHx8IChkZWZpbmVkIF9MT0NBTEVfSCAmJiBkZWZpbmVkIF9fc3VuKSkKLS0jIGRlZmluZSBMQ19NRVNTQUdFUyAxNzI5Ci0tI2VuZGlmCi0tCi0tLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCi0tICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0tI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0tCi0tLyogUHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIGZpbGUgZm9ybWF0cy4gIFJldHVybnMgdGhlCi0tICAgbWF4aW11bSBtaW5vciByZXZpc2lvbiBudW1iZXIgc3VwcG9ydGVkIGZvciBhIGdpdmVuIG1ham9yIHJldmlzaW9uLiAgKi8KLS0jZGVmaW5lIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKG1ham9yKSBcCi0tICAoKG1ham9yKSA9PSAwIHx8IChtYWpvcikgPT0gMSA/IDEgOiAtMSkKLS0KLS0vKiBSZXNvbHZlIGEgcGxhdGZvcm0gc3BlY2lmaWMgY29uZmxpY3Qgb24gREpHUFAuICBHTlUgZ2V0dGV4dCB0YWtlcwotLSAgIHByZWNlZGVuY2Ugb3ZlciBfY29uaW9fZ2V0dGV4dC4gICovCi0tI2lmZGVmIF9fREpHUFBfXwotLSMgdW5kZWYgZ2V0dGV4dAotLSNlbmRpZgotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSNlbmRpZgotLQotLQotLS8qIFZlcnNpb24gbnVtYmVyOiAobWFqb3I8PDE2KSArIChtaW5vcjw8OCkgKyBzdWJtaW5vciAqLwotLSNkZWZpbmUgTElCSU5UTF9WRVJTSU9OIDB4MDAxMTAwCi0tZXh0ZXJuIGludCBsaWJpbnRsX3ZlcnNpb247Ci0tCi0tCi0tLyogV2UgcmVkaXJlY3QgdGhlIGZ1bmN0aW9ucyB0byB0aG9zZSBwcmVmaXhlZCB3aXRoICJsaWJpbnRsXyIuICBUaGlzIGlzCi0tICAgbmVjZXNzYXJ5LCBiZWNhdXNlIHNvbWUgc3lzdGVtcyBkZWZpbmUgZ2V0dGV4dC90ZXh0ZG9tYWluLy4uLiBpbiB0aGUgQwotLSAgIGxpYnJhcnkgKG5hbWVseSwgU29sYXJpcyAyLjQgYW5kIG5ld2VyLCBhbmQgR05VIGxpYmMgMi4wIGFuZCBuZXdlcikuCi0tICAgSWYgd2UgdXNlZCB0aGUgdW5wcmVmaXhlZCBuYW1lcywgdGhlcmUgd291bGQgYmUgY2FzZXMgd2hlcmUgdGhlCi0tICAgZGVmaW5pdGlvbiBpbiB0aGUgQyBsaWJyYXJ5IHdvdWxkIG92ZXJyaWRlIHRoZSBvbmUgaW4gdGhlIGxpYmludGwuc28KLS0gICBzaGFyZWQgbGlicmFyeS4gIFJlY2FsbCB0aGF0IG9uIEVMRiBzeXN0ZW1zLCB0aGUgc3ltYm9scyBhcmUgbG9va2VkCi0tICAgdXAgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLS0gICAgIDEuIGluIHRoZSBleGVjdXRhYmxlLAotLSAgICAgMi4gaW4gdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSwgaW4gb3JkZXIsCi0tICAgICAzLiBpbiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNwZWNpZmllZCBvbiB0aGUgbGluawotLSAgICAgICAgY29tbWFuZCBsaW5lLAotLSAgICAgNC4gaW4gdGhlIGRsb3BlbigpZWQgc2hhcmVkIGxpYnJhcmllcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQotLSAgICAgICAgZGxvcGVuKCllZC4KLS0gICBUaGUgZGVmaW5pdGlvbiBpbiB0aGUgQyBsaWJyYXJ5IHdvdWxkIG92ZXJyaWRlIHRoZSBvbmUgaW4gbGliaW50bC5zbyBpZgotLSAgIGVpdGhlcgotLSAgICAgKiAtbGMgaXMgZ2l2ZW4gb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lIGFuZCAtbGludGwgaXNuJ3QsIG9yCi0tICAgICAqIC1sYyBpcyBnaXZlbiBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUgYmVmb3JlIC1saW50bCwgb3IKLS0gICAgICogbGliaW50bC5zbyBpcyBhIGRlcGVuZGVuY3kgb2YgYSBkbG9wZW4oKWVkIHNoYXJlZCBsaWJyYXJ5IGJ1dCBub3QKLS0gICAgICAgbGlua2VkIHRvIHRoZSBleGVjdXRhYmxlIGF0IGxpbmsgdGltZS4KLS0gICBTaW5jZSBTb2xhcmlzIGdldHRleHQoKSBiZWhhdmVzIGRpZmZlcmVudGx5IHRoYW4gR05VIGdldHRleHQoKSwgdGhpcwotLSAgIHdvdWxkIGJlIHVuYWNjZXB0YWJsZS4KLS0KLS0gICBUaGUgcmVkaXJlY3Rpb24gaGFwcGVucyBieSBkZWZhdWx0IHRocm91Z2ggbWFjcm9zIGluIEMsIHNvIHRoYXQgJmdldHRleHQKLS0gICBpcyBpbmRlcGVuZGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgYnV0IHRocm91Z2ggaW5saW5lIGZ1bmN0aW9ucyBpbgotLSAgIEMrKywgaW4gb3JkZXIgbm90IHRvIGludGVyZmVyZSB3aXRoIHRoZSBuYW1lIG1hbmdsaW5nIG9mIGNsYXNzIGZpZWxkcyBvcgotLSAgIGNsYXNzIG1ldGhvZHMgY2FsbGVkICdnZXR0ZXh0Jy4gICovCi0tCi0tLyogVGhlIHVzZXIgY2FuIGRlZmluZSBfSU5UTF9SRURJUkVDVF9JTkxJTkUgb3IgX0lOVExfUkVESVJFQ1RfTUFDUk9TLgotLSAgIElmIGhlIGRvZXNuJ3QsIHdlIGNob29zZSB0aGUgbWV0aG9kLiAgQSB0aGlyZCBwb3NzaWJsZSBtZXRob2QgaXMKLS0gICBfSU5UTF9SRURJUkVDVF9BU00sIHN1cHBvcnRlZCBvbmx5IGJ5IEdDQy4gICovCi0tI2lmICEoZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9JTkxJTkUgfHwgZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9NQUNST1MpCi0tIyBpZiBfX0dOVUNfXyA+PSAyICYmICEoX19BUFBMRV9DQ19fID4gMSkgJiYgIWRlZmluZWQgX19NSU5HVzMyX18gJiYgIShfX0dOVUNfXyA9PSAyICYmIGRlZmluZWQgX0FJWCkgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cykKLS0jICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfQVNNCi0tIyBlbHNlCi0tIyAgaWZkZWYgX19jcGx1c3BsdXMKLS0jICAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX0lOTElORQotLSMgIGVsc2UKLS0jICAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgIGVuZGlmCi0tIyBlbmRpZgotLSNlbmRpZgotLS8qIEF1eGlsaWFyeSBtYWNyb3MuICAqLwotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9BU00KLS0jIGRlZmluZSBfSU5UTF9BU00oY25hbWUpIF9fYXNtX18gKF9JTlRMX0FTTU5BTUUgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgI2NuYW1lKSkKLS0jIGRlZmluZSBfSU5UTF9BU01OQU1FKHByZWZpeCxjbmFtZXN0cmluZykgX0lOVExfU1RSSU5HSUZZIChwcmVmaXgpIGNuYW1lc3RyaW5nCi0tIyBkZWZpbmUgX0lOVExfU1RSSU5HSUZZKHByZWZpeCkgI3ByZWZpeAotLSNlbHNlCi0tIyBkZWZpbmUgX0lOVExfQVNNKGNuYW1lKQotLSNlbmRpZgotLQotLS8qIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyhuKSBkZWNsYXJlcyB0aGF0IHRoZSBnaXZlbiBmdW5jdGlvbiBtYXkgcmV0dXJuCi0tICAgaXRzIG4tdGggYXJndW1lbnQgbGl0ZXJhbGx5LiAgVGhpcyBlbmFibGVzIEdDQyB0byB3YXJuIGZvciBleGFtcGxlIGFib3V0Ci0tICAgcHJpbnRmIChnZXR0ZXh0ICgiZm9vICV5IikpLiAgKi8KLS0jaWYgX19HTlVDX18gPj0gMyAmJiAhKF9fQVBQTEVfQ0NfXyA+IDEgJiYgZGVmaW5lZCBfX2NwbHVzcGx1cykKLS0jIGRlZmluZSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcobikgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fIChuKSkpCi0tI2Vsc2UKLS0jIGRlZmluZSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcobikKLS0jZW5kaWYKLS0KLS0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0tICAgdGV4dCkuICAqLwotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLS1leHRlcm4gY2hhciAqbGliaW50bF9nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDEpOwotLXN0YXRpYyBpbmxpbmUgY2hhciAqZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCkKLS17Ci0tICByZXR1cm4gbGliaW50bF9nZXR0ZXh0IChfX21zZ2lkKTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgZ2V0dGV4dCBsaWJpbnRsX2dldHRleHQKLS0jZW5kaWYKLS1leHRlcm4gY2hhciAqZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCkKLS0gICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2dldHRleHQpCi0tICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMSk7Ci0tI2VuZGlmCi0tCi0tLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0tICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKTsKLS1zdGF0aWMgaW5saW5lIGNoYXIgKmRnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpCi0tewotLSAgcmV0dXJuIGxpYmludGxfZGdldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZCk7Ci0tfQotLSNlbHNlCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgZGVmaW5lIGRnZXR0ZXh0IGxpYmludGxfZGdldHRleHQKLS0jZW5kaWYKLS1leHRlcm4gY2hhciAqZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkKLS0gICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RnZXR0ZXh0KQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotLSNlbmRpZgotLQotLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotLSAgIGxvY2FsZS4gICovCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotLWV4dGVybiBjaGFyICpsaWJpbnRsX2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotLQkJCQlpbnQgX19jYXRlZ29yeSkKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKTsKLS1zdGF0aWMgaW5saW5lIGNoYXIgKmRjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotLQkJCSAgICAgICBpbnQgX19jYXRlZ29yeSkKLS17Ci0tICByZXR1cm4gbGliaW50bF9kY2dldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZCwgX19jYXRlZ29yeSk7Ci0tfQotLSNlbHNlCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgZGVmaW5lIGRjZ2V0dGV4dCBsaWJpbnRsX2RjZ2V0dGV4dAotLSNlbmRpZgotLWV4dGVybiBjaGFyICpkY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLS0JCQlpbnQgX19jYXRlZ29yeSkKLS0gICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RjZ2V0dGV4dCkKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKTsKLS0jZW5kaWYKLS0KLS0KLS0vKiBTaW1pbGFyIHRvIGBnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQotLSAgIG51bWJlciBOLiAgKi8KLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLS0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDEpIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMik7Ci0tc3RhdGljIGlubGluZSBjaGFyICpuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKLS17Ci0tICByZXR1cm4gbGliaW50bF9uZ2V0dGV4dCAoX19tc2dpZDEsIF9fbXNnaWQyLCBfX24pOwotLX0KLS0jZWxzZQotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLS0jIGRlZmluZSBuZ2V0dGV4dCBsaWJpbnRsX25nZXR0ZXh0Ci0tI2VuZGlmCi0tZXh0ZXJuIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfbmdldHRleHQpCi0tICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMSkgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKTsKLS0jZW5kaWYKLS0KLS0vKiBTaW1pbGFyIHRvIGBkZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKLS0gICBudW1iZXIgTi4gICovCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotLWV4dGVybiBjaGFyICpsaWJpbnRsX2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkMSwKLS0JCQkJY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDMpOwotLXN0YXRpYyBpbmxpbmUgY2hhciAqZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAotLQkJCSAgICAgICBjb25zdCBjaGFyICpfX21zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgX19uKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2RuZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkMSwgX19tc2dpZDIsIF9fbik7Ci0tfQotLSNlbHNlCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgZGVmaW5lIGRuZ2V0dGV4dCBsaWJpbnRsX2RuZ2V0dGV4dAotLSNlbmRpZgotLWV4dGVybiBjaGFyICpkbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQljb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uKQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZG5nZXR0ZXh0KQotLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMyk7Ci0tI2VuZGlmCi0tCi0tLyogU2ltaWxhciB0byBgZGNnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQotLSAgIG51bWJlciBOLiAgKi8KLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSkKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDMpOwotLXN0YXRpYyBpbmxpbmUgY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQljb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0tCQkJCXVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpCi0tewotLSAgcmV0dXJuIGxpYmludGxfZGNuZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkMSwgX19tc2dpZDIsIF9fbiwgX19jYXRlZ29yeSk7Ci0tfQotLSNlbHNlCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgZGVmaW5lIGRjbmdldHRleHQgbGliaW50bF9kY25nZXR0ZXh0Ci0tI2VuZGlmCi0tZXh0ZXJuIGNoYXIgKmRjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotLQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGNuZ2V0dGV4dCkKLS0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDMpOwotLSNlbmRpZgotLQotLQotLSNpZm5kZWYgSU5fTElCR0xPQ0FMRQotLQotLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0tICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotLWV4dGVybiBjaGFyICpsaWJpbnRsX3RleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSk7Ci0tc3RhdGljIGlubGluZSBjaGFyICp0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpCi0tewotLSAgcmV0dXJuIGxpYmludGxfdGV4dGRvbWFpbiAoX19kb21haW5uYW1lKTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgdGV4dGRvbWFpbiBsaWJpbnRsX3RleHRkb21haW4KLS0jZW5kaWYKLS1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfdGV4dGRvbWFpbik7Ci0tI2VuZGlmCi0tCi0tLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0tICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLS1leHRlcm4gY2hhciAqbGliaW50bF9iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7Ci0tc3RhdGljIGlubGluZSBjaGFyICpiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKQotLXsKLS0gIHJldHVybiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChfX2RvbWFpbm5hbWUsIF9fZGlybmFtZSk7Ci0tfQotLSNlbHNlCi0tI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluIGxpYmludGxfYmluZHRleHRkb21haW4KLS0jZW5kaWYKLS1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19kaXJuYW1lKQotLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfYmluZHRleHRkb21haW4pOwotLSNlbmRpZgotLQotLS8qIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiB3aGljaCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUKLS0gICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0tZXh0ZXJuIGNoYXIgKmxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLS0JCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCk7Ci0tc3RhdGljIGlubGluZSBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkJICAgICBjb25zdCBjaGFyICpfX2NvZGVzZXQpCi0tewotLSAgcmV0dXJuIGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKF9fZG9tYWlubmFtZSwgX19jb2Rlc2V0KTsKLS19Ci0tI2Vsc2UKLS0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0tIyBkZWZpbmUgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAotLSNlbmRpZgotLWV4dGVybiBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotLQkJCQkgICAgICBjb25zdCBjaGFyICpfX2NvZGVzZXQpCi0tICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCk7Ci0tI2VuZGlmCi0tCi0tI2VuZGlmIC8qIElOX0xJQkdMT0NBTEUgKi8KLS0KLS0KLS0vKiBTdXBwb3J0IGZvciBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucyBpbiAqcHJpbnRmKCksIGZvbGxvd2luZyB0aGUKLS0gICBQT1NJWC9YU0kgc3BlY2lmaWNhdGlvbi4KLS0gICBOb3RlOiBUaGVzZSByZXBsYWNlbWVudHMgZm9yIHRoZSAqcHJpbnRmKCkgZnVuY3Rpb25zIGFyZSB2aXNpYmxlIG9ubHkKLS0gICBpbiBzb3VyY2UgZmlsZXMgdGhhdCAjaW5jbHVkZSA8bGliaW50bC5oPiBvciAjaW5jbHVkZSAiZ2V0dGV4dC5oIi4KLS0gICBQYWNrYWdlcyB0aGF0IHVzZSAqcHJpbnRmKCkgaW4gc291cmNlIGZpbGVzIHRoYXQgZG9uJ3QgcmVmZXIgdG8gXygpCi0tICAgb3IgZ2V0dGV4dCgpIGJ1dCBmb3Igd2hpY2ggdGhlIGZvcm1hdCBzdHJpbmcgY291bGQgYmUgdGhlIHJldHVybiB2YWx1ZQotLSAgIG9mIF8oKSBvciBnZXR0ZXh0KCkgbmVlZCB0byBhZGQgdGhpcyAjaW5jbHVkZS4gIE9oIHdlbGwuICAqLwotLQotLSNpZiAhQEhBVkVfUE9TSVhfUFJJTlRGQAotLQotLSNpbmNsdWRlIDxzdGRpby5oPgotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0KLS0vKiBHZXQgdmFfbGlzdC4gICovCi0tI2lmIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUgotLSMgaW5jbHVkZSA8c3RkYXJnLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgPHZhcmFyZ3MuaD4KLS0jZW5kaWYKLS0KLS0jdW5kZWYgZnByaW50ZgotLSNkZWZpbmUgZnByaW50ZiBsaWJpbnRsX2ZwcmludGYKLS1leHRlcm4gaW50IGZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotLSN1bmRlZiB2ZnByaW50ZgotLSNkZWZpbmUgdmZwcmludGYgbGliaW50bF92ZnByaW50ZgotLWV4dGVybiBpbnQgdmZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLS0KLS0jdW5kZWYgcHJpbnRmCi0tI2lmIGRlZmluZWQgX19OZXRCU0RfXyB8fCBkZWZpbmVkIF9fQkVPU19fIHx8IGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fTUlOR1czMl9fCi0tLyogRG9uJ3QgYnJlYWsgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZixNLE4pKSkuCi0tICAgVGhpcyByZWRlZmluaXRpb24gaXMgb25seSBwb3NzaWJsZSBiZWNhdXNlIHRoZSBsaWJjIGluIE5ldEJTRCwgQ3lnd2luLAotLSAgIG1pbmd3IGRvZXMgbm90IGhhdmUgYSBmdW5jdGlvbiBfX3ByaW50Zl9fLiAgKi8KLS0jIGRlZmluZSBsaWJpbnRsX3ByaW50ZiBfX3ByaW50Zl9fCi0tI2VuZGlmCi0tI2RlZmluZSBwcmludGYgbGliaW50bF9wcmludGYKLS1leHRlcm4gaW50IHByaW50ZiAoY29uc3QgY2hhciAqLCAuLi4pOwotLSN1bmRlZiB2cHJpbnRmCi0tI2RlZmluZSB2cHJpbnRmIGxpYmludGxfdnByaW50ZgotLWV4dGVybiBpbnQgdnByaW50ZiAoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLS0KLS0jdW5kZWYgc3ByaW50ZgotLSNkZWZpbmUgc3ByaW50ZiBsaWJpbnRsX3NwcmludGYKLS1leHRlcm4gaW50IHNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotLSN1bmRlZiB2c3ByaW50ZgotLSNkZWZpbmUgdnNwcmludGYgbGliaW50bF92c3ByaW50ZgotLWV4dGVybiBpbnQgdnNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLS0KLS0jaWYgQEhBVkVfU05QUklOVEZACi0tCi0tI3VuZGVmIHNucHJpbnRmCi0tI2RlZmluZSBzbnByaW50ZiBsaWJpbnRsX3NucHJpbnRmCi0tZXh0ZXJuIGludCBzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLS0jdW5kZWYgdnNucHJpbnRmCi0tI2RlZmluZSB2c25wcmludGYgbGliaW50bF92c25wcmludGYKLS1leHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7Ci0tCi0tI2VuZGlmCi0tCi0tI2lmIEBIQVZFX0FTUFJJTlRGQAotLQotLSN1bmRlZiBhc3ByaW50ZgotLSNkZWZpbmUgYXNwcmludGYgbGliaW50bF9hc3ByaW50ZgotLWV4dGVybiBpbnQgYXNwcmludGYgKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLS0jdW5kZWYgdmFzcHJpbnRmCi0tI2RlZmluZSB2YXNwcmludGYgbGliaW50bF92YXNwcmludGYKLS1leHRlcm4gaW50IHZhc3ByaW50ZiAoY2hhciAqKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLS0KLS0jZW5kaWYKLS0KLS0jaWYgQEhBVkVfV1BSSU5URkAKLS0KLS0jdW5kZWYgZndwcmludGYKLS0jZGVmaW5lIGZ3cHJpbnRmIGxpYmludGxfZndwcmludGYKLS1leHRlcm4gaW50IGZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKLS0jdW5kZWYgdmZ3cHJpbnRmCi0tI2RlZmluZSB2ZndwcmludGYgbGliaW50bF92ZndwcmludGYKLS1leHRlcm4gaW50IHZmd3ByaW50ZiAoRklMRSAqLCBjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOwotLQotLSN1bmRlZiB3cHJpbnRmCi0tI2RlZmluZSB3cHJpbnRmIGxpYmludGxfd3ByaW50ZgotLWV4dGVybiBpbnQgd3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqLCAuLi4pOwotLSN1bmRlZiB2d3ByaW50ZgotLSNkZWZpbmUgdndwcmludGYgbGliaW50bF92d3ByaW50ZgotLWV4dGVybiBpbnQgdndwcmludGYgKGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7Ci0tCi0tI3VuZGVmIHN3cHJpbnRmCi0tI2RlZmluZSBzd3ByaW50ZiBsaWJpbnRsX3N3cHJpbnRmCi0tZXh0ZXJuIGludCBzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKLS0jdW5kZWYgdnN3cHJpbnRmCi0tI2RlZmluZSB2c3dwcmludGYgbGliaW50bF92c3dwcmludGYKLS1leHRlcm4gaW50IHZzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7Ci0tCi0tI2VuZGlmCi0tCi0tI2VuZGlmCi0tCi0tCi0tLyogU3VwcG9ydCBmb3IgcmVsb2NhdGFibGUgcGFja2FnZXMuICAqLwotLQotLS8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgotLSAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4Ci0tICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKLS0gICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCi0tICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KLS0jZGVmaW5lIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4Ci0tZXh0ZXJuIHZvaWQKLS0gICAgICAgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAotLQkJCQkgICAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeCk7Ci0tCi0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tfQotLSNlbmRpZgotLQotLSNlbmRpZiAvKiBsaWJpbnRsLmggKi8KLS0tLSBhL2ludGwvbGliaW50bC5yYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMzggKzAsMCBAQAotLS8qIFJlc291cmNlcyBmb3IgaW50bC5kbGwgKi8KLS0KLS0jaW5jbHVkZSA8d2ludmVyLmg+Ci0tCi0tVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCi0tIEZJTEVWRVJTSU9OIFBBQ0tBR0VfVkVSU0lPTl9NQUpPUixQQUNLQUdFX1ZFUlNJT05fTUlOT1IsUEFDS0FHRV9WRVJTSU9OX1NVQk1JTk9SLDAKLS0gUFJPRFVDVFZFUlNJT04gUEFDS0FHRV9WRVJTSU9OX01BSk9SLFBBQ0tBR0VfVkVSU0lPTl9NSU5PUixQQUNLQUdFX1ZFUlNJT05fU1VCTUlOT1IsMAotLSBGSUxFRkxBR1NNQVNLIDB4M2ZMIC8qIFZTX0ZGSV9GSUxFRkxBR1NNQVNLICovCi0tI2lmZGVmIF9ERUJVRwotLSBGSUxFRkxBR1MgMHgxTCAgLyogVlNfRkZfREVCVUcgKi8KLS0jZWxzZQotLSBGSUxFRkxBR1MgMHgwTAotLSNlbmRpZgotLSBGSUxFT1MgMHgxMDAwNEwgIC8qIFZPU19ET1NfV0lORE9XUzMyICovCi0tIEZJTEVUWVBFIDB4MkwgIC8qIFZGVF9ETEwgKi8KLS0gRklMRVNVQlRZUEUgMHgwTCAgLyogVkZUMl9VTktOT1dOICovCi0tQkVHSU4KLS0gICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgotLSAgICBCRUdJTgotLSAgICAgICAgQkxPQ0sgIjA0MDkwMDAwIiAgLyogTGFuZyA9IFVTIEVuZ2xpc2gsIENoYXJzZXQgPSBBU0NJSSAqLwotLSAgICAgICAgQkVHSU4KLS0gICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLCAiVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBXDAiCi0tICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIkZyZWUgU29mdHdhcmUgRm91bmRhdGlvblwwIgotLSAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiTEdQTGVkIGxpYmludGwgZm9yIFdpbmRvd3MgTlQvMjAwMC9YUC9WaXN0YSBhbmQgV2luZG93cyA5NS85OC9NRVwwIgotLSAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsIFBBQ0tBR0VfVkVSU0lPTl9TVFJJTkcgIlwwIgotLSAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAiaW50bC5kbGxcMCIKLS0gICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAxOTk1LTIwMDdcMCIKLS0gICAgICAgICAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIlwwIgotLSAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImludGwuZGxsXDAiCi0tICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgImxpYmludGw6IGFjY2Vzc2luZyBOTFMgbWVzc2FnZSBjYXRhbG9nc1wwIgotLSAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFBBQ0tBR0VfVkVSU0lPTl9TVFJJTkcgIlwwIgotLSAgICAgICAgRU5ECi0tICAgIEVORAotLSAgICBCTE9DSyAiVmFyRmlsZUluZm8iCi0tICAgIEJFR0lOCi0tICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDAgIC8qIFVTIEVuZ2xpc2gsIEFTQ0lJICovCi0tICAgIEVORAotLUVORAotLS0tIGEvaW50bC9sb2FkaW5mby5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMzIgKzAsMCBAQAotLS8qIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LCAyMDAwLTIwMDMsIDIwMDUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLS0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX0xPQURJTkZPX0gKLS0jZGVmaW5lIF9MT0FESU5GT19ICTEKLS0KLS0vKiBEZWNsYXJhdGlvbnMgb2YgbG9jYWxlIGRlcGVuZGVudCBjYXRhbG9nIGxvb2t1cCBmdW5jdGlvbnMuCi0tICAgSW1wbGVtZW50ZWQgaW4KLS0KLS0gICAgIGxvY2FsZWFsaWFzLmMgICAgUG9zc2libHkgcmVwbGFjZSBhIGxvY2FsZSBuYW1lIGJ5IGFub3RoZXIuCi0tICAgICBleHBsb2RlbmFtZS5jICAgIFNwbGl0IGEgbG9jYWxlIG5hbWUgaW50byBpdHMgdmFyaW91cyBmaWVsZHMuCi0tICAgICBsMTBuZmxpc3QuYyAgICAgIEdlbmVyYXRlIGEgbGlzdCBvZiBmaWxlbmFtZXMgb2YgcG9zc2libGUgbWVzc2FnZSBjYXRhbG9ncy4KLS0gICAgIGZpbmRkb21haW4uYyAgICAgRmluZCBhbmQgb3BlbiB0aGUgcmVsZXZhbnQgbWVzc2FnZSBjYXRhbG9ncy4KLS0KLS0gICBUaGUgbWFpbiBmdW5jdGlvbiBfbmxfZmluZF9kb21haW4oKSBpbiBmaW5kZG9tYWluLmMgaXMgZGVjbGFyZWQKLS0gICBpbiBnZXR0ZXh0UC5oLgotLSAqLwotLQotLSNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KLS0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotLSNlbmRpZgotLQotLSNpZm5kZWYgTElCSU5UTF9ETExfRVhQT1JURUQKLS0jIGRlZmluZSBMSUJJTlRMX0RMTF9FWFBPUlRFRAotLSNlbmRpZgotLQotLS8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKLS0gICBhbG1vc3QgYWx3YXlzIHRydWUgb3IgYWxtb3N0IGFsd2F5cyBmYWxzZS4gICovCi0tI2lmbmRlZiBIQVZFX0JVSUxUSU5fRVhQRUNUCi0tIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQotLSNlbmRpZgotLQotLS8qIFNlcGFyYXRvciBpbiBQQVRIIGxpa2UgbGlzdHMgb2YgcGF0aG5hbWVzLiAgKi8KLS0jaWYgKChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykgJiYgIWRlZmluZWQgX19DWUdXSU5fXykgfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0tICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCi0tIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzsnCi0tI2Vsc2UKLS0gIC8qIFVuaXggKi8KLS0jIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKLS0jZW5kaWYKLS0KLS0vKiBFbmNvZGluZyBvZiBsb2NhbGUgbmFtZSBwYXJ0cy4gICovCi0tI2RlZmluZSBYUEdfTk9STV9DT0RFU0VUCTEKLS0jZGVmaW5lIFhQR19DT0RFU0VUCQkyCi0tI2RlZmluZSBYUEdfVEVSUklUT1JZCQk0Ci0tI2RlZmluZSBYUEdfTU9ESUZJRVIJCTgKLS0KLS0KLS1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlCi0tewotLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0tICBpbnQgZGVjaWRlZDsKLS0KLS0gIGNvbnN0IHZvaWQgKmRhdGE7Ci0tCi0tICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpuZXh0OwotLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqc3VjY2Vzc29yWzFdOwotLX07Ci0tCi0tCi0tLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAotLSAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCi0tICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCi0tICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCi0tZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwKLS0JCQkJCSAgc2l6ZV90IG5hbWVfbGVuKTsKLS0KLS0vKiBMb29rdXAgYSBsb2NhbGUgZGVwZW5kZW50IGZpbGUuCi0tICAgKkwxME5GSUxFX0xJU1QgZGVub3RlcyBhIHBvb2wgb2YgbG9va3VwIHJlc3VsdHMgb2YgbG9jYWxlIGRlcGVuZGVudAotLSAgIGZpbGVzIG9mIHRoZSBzYW1lIGtpbmQsIHNvcnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIC0+ZmlsZW5hbWUuCi0tICAgRElSTElTVCBhbmQgRElSTElTVF9MRU4gYXJlIGFuIGFyZ3ogbGlzdCBvZiBkaXJlY3RvcmllcyBpbiB3aGljaCB0bwotLSAgIGxvb2ssIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGRpcmVjdG9yeSAoaS5lLiBESVJMSVNUX0xFTiA+IDApLgotLSAgIE1BU0ssIExBTkdVQUdFLCBURVJSSVRPUlksIENPREVTRVQsIE5PUk1BTElaRURfQ09ERVNFVCwgTU9ESUZJRVIKLS0gICBhcmUgdGhlIHBpZWNlcyBvZiB0aGUgbG9jYWxlIG5hbWUsIGFzIHByb2R1Y2VkIGJ5IF9ubF9leHBsb2RlX25hbWUoKS4KLS0gICBGSUxFTkFNRSBpcyB0aGUgZmlsZW5hbWUgc3VmZml4LgotLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGxvb2t1cCByZXN1bHQsIGVpdGhlciBmb3VuZCBpbiAqTDEwTkZJTEVfTElTVCwKLS0gICBvciAtIGlmIERPX0FMTE9DQVRFIGlzIG5vbnplcm8gLSBmcmVzaGx5IGFsbG9jYXRlZCwgb3IgcG9zc2libHkgTlVMTC4KLS0gICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbi1OVUxMLCBpdCBpcyBhZGRlZCB0byAqTDEwTkZJTEVfTElTVCwgYW5kCi0tICAgaXRzIC0+bmV4dCBmaWVsZCBkZW5vdGVzIHRoZSBjaGFpbmluZyBpbnNpZGUgKkwxME5GSUxFX0xJU1QsIGFuZAotLSAgIGZ1cnRoZXJtb3JlIGl0cyAtPnN1Y2Nlc3NvcltdIGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBvdGhlciBsb29rdXAKLS0gICByZXN1bHRzIGZyb20gd2hpY2ggdGhpcyBsb29rdXAgcmVzdWx0IGluaGVyaXRzLiAgKi8KLS1leHRlcm4gc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi0tX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKLS0JCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sIGludCBtYXNrLAotLQkJICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCi0tCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAotLQkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLAotLQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpOwotLQotLS8qIExvb2t1cCB0aGUgcmVhbCBsb2NhbGUgbmFtZSBmb3IgYSBsb2NhbGUgYWxpYXMgTkFNRSwgb3IgTlVMTCBpZgotLSAgIE5BTUUgaXMgbm90IGEgbG9jYWxlIGFsaWFzIChidXQgcG9zc2libHkgYSByZWFsIGxvY2FsZSBuYW1lKS4KLS0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBtdXN0IG5vdCBiZSBmcmVlZC4gICovCi0tLyogUGFydCBvZiB0aGUgbGliaW50bCBBQkkgb25seSBmb3IgdGhlIHNha2Ugb2YgdGhlIGdldHRleHQubTQgbWFjcm8uICAqLwotLWV4dGVybiBMSUJJTlRMX0RMTF9FWFBPUlRFRCBjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzIChjb25zdCBjaGFyICpuYW1lKTsKLS0KLS0vKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBpdHMgcGllY2VzOiBsYW5ndWFnZSwgbW9kaWZpZXIsCi0tICAgdGVycml0b3J5LCBjb2Rlc2V0LgotLSAgIE5BTUUgZ2V0cyBkZXN0cnVjdGl2ZWx5IG1vZGlmaWVkOiBOVUwgYnl0ZXMgYXJlIGluc2VydGVkIGhlcmUgYW5kCi0tICAgdGhlcmUuICAqTEFOR1VBR0UgZ2V0cyBhc3NpZ25lZCBOQU1FLiAgRWFjaCBvZiAqTU9ESUZJRVIsICpURVJSSVRPUlksCi0tICAgKkNPREVTRVQgZ2V0cyBhc3NpZ25lZCBlaXRoZXIgYSBwb2ludGVyIGludG8gdGhlIG9sZCBOQU1FIHN0cmluZywgb3IKLS0gICBOVUxMLiAgKk5PUk1BTElaRURfQ09ERVNFVCBnZXRzIGFzc2lnbmVkIHRoZSBleHBhbmRlZCAqQ09ERVNFVCwgaWYgaXQKLS0gICBpcyBkaWZmZXJlbnQgZnJvbSAqQ09ERVNFVDsgdGhpcyBvbmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBoYXMKLS0gICB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBiaXRtYXNrLCB3aGVyZSBlYWNoIGJpdCBjb3JyZXNwb25kcyB0byBvbmUKLS0gICBmaWxsZWQtaW4gdmFsdWU6Ci0tICAgICBYUEdfTU9ESUZJRVIgICAgICAgICAgICAgICAgZm9yICpNT0RJRklFUiwKLS0gICAgIFhQR19URVJSSVRPUlkgICAgICAgICAgICAgICBmb3IgKlRFUlJJVE9SWSwKLS0gICAgIFhQR19DT0RFU0VUICAgICAgICAgICAgICAgICBmb3IgKkNPREVTRVQsCi0tICAgICBYUEdfTk9STV9DT0RFU0VUICAgICAgICAgICAgZm9yICpOT1JNQUxJWkVEX0NPREVTRVQuCi0tICovCi0tZXh0ZXJuIGludCBfbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCi0tCQkJICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksCi0tCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKLS0JCQkgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQpOwotLQotLSNlbmRpZgkvKiBsb2FkaW5mby5oICovCi0tLS0gYS9pbnRsL2xvYWRtc2djYXQuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTMzNiArMCwwIEBACi0tLyogTG9hZCBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncy4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgotLSAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQotLSAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KLS0jaWZuZGVmIF9HTlVfU09VUkNFCi0tIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQotLSNlbmRpZgotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8Y3R5cGUuaD4KLS0jaW5jbHVkZSA8ZXJybm8uaD4KLS0jaW5jbHVkZSA8ZmNudGwuaD4KLS0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0tI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0tCi0tI2lmZGVmIF9fR05VQ19fCi0tIyB1bmRlZiAgYWxsb2NhCi0tIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLS0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0tI2Vsc2UKLS0jIGlmZGVmIF9NU0NfVkVSCi0tIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0tIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0tIyBlbHNlCi0tIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLS0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0tIyAgZWxzZQotLSMgICBpZmRlZiBfQUlYCi0tICNwcmFnbWEgYWxsb2NhCi0tIyAgIGVsc2UKLS0jICAgIGlmbmRlZiBhbGxvY2EKLS1jaGFyICphbGxvY2EgKCk7Ci0tIyAgICBlbmRpZgotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tIyBlbmRpZgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tCi0tI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0tIyBpbmNsdWRlIDx1bmlzdGQuaD4KLS0jZW5kaWYKLS0KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGxhbmdpbmZvLmg+Ci0tIyBpbmNsdWRlIDxsb2NhbGUuaD4KLS0jZW5kaWYKLS0KLS0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotLSAgICB8fCAoZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9QT1NJWF9NQVBQRURfRklMRVMpCi0tIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgotLSMgdW5kZWYgSEFWRV9NTUFQCi0tIyBkZWZpbmUgSEFWRV9NTUFQCTEKLS0jZWxzZQotLSMgdW5kZWYgSEFWRV9NTUFQCi0tI2VuZGlmCi0tCi0tI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggfHwgZGVmaW5lZCBfTElCQwotLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0tI2VuZGlmCi0tI2lmIGRlZmluZWQgSEFWRV9JTlRUWVBFU19IIHx8IGRlZmluZWQgX0xJQkMKLS0jIGluY2x1ZGUgPGludHR5cGVzLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgImdtby5oIgotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLSNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgotLSNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCi0tCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlICIuLi9sb2NhbGUvbG9jYWxlaW5mby5oIgotLSMgaW5jbHVkZSA8bm90LWNhbmNlbC5oPgotLSNlbmRpZgotLQotLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibG9jay5oIgotLSNlbmRpZgotLQotLS8qIFByb3ZpZGUgZmFsbGJhY2sgdmFsdWVzIGZvciBtYWNyb3MgdGhhdCBvdWdodCB0byBiZSBkZWZpbmVkIGluIDxpbnR0eXBlcy5oPi4KLS0gICBOb3RlIHRoYXQgb3VyIGZhbGxiYWNrIHZhbHVlcyBuZWVkIG5vdCBiZSBsaXRlcmFsIHN0cmluZ3MsIGJlY2F1c2Ugd2UgZG9uJ3QKLS0gICB1c2UgdGhlbSB3aXRoIHByZXByb2Nlc3NvciBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gICovCi0tI2lmICFkZWZpbmVkIFBSSWQ4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkOAotLSMgZGVmaW5lIFBSSWQ4ICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaTgKLS0jIGRlZmluZSBQUklpOCAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJbzggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW84Ci0tIyBkZWZpbmUgUFJJbzggIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXU4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1OAotLSMgZGVmaW5lIFBSSXU4ICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4OCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeDgKLS0jIGRlZmluZSBQUkl4OCAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVg4Ci0tIyBkZWZpbmUgUFJJWDggIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWQxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZDE2Ci0tIyBkZWZpbmUgUFJJZDE2ICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWkxNgotLSMgZGVmaW5lIFBSSWkxNiAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJbzE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvMTYKLS0jIGRlZmluZSBQUklvMTYgIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXUxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdTE2Ci0tIyBkZWZpbmUgUFJJdTE2ICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4MTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXgxNgotLSMgZGVmaW5lIFBSSXgxNiAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYMTYKLS0jIGRlZmluZSBQUklYMTYgIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWQzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZDMyCi0tIyBkZWZpbmUgUFJJZDMyICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWkzMgotLSMgZGVmaW5lIFBSSWkzMiAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJbzMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvMzIKLS0jIGRlZmluZSBQUklvMzIgIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXUzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdTMyCi0tIyBkZWZpbmUgUFJJdTMyICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4MzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXgzMgotLSMgZGVmaW5lIFBSSXgzMiAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYMzIKLS0jIGRlZmluZSBQUklYMzIgIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWQ2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZDY0Ci0tIyBkZWZpbmUgUFJJZDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGQiIDogImxsZCIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWk2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaTY0Ci0tIyBkZWZpbmUgUFJJaTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGkiIDogImxsaSIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSW82NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJbzY0Ci0tIyBkZWZpbmUgUFJJbzY0IChzaXplb2YgKGxvbmcpID09IDggPyAibG8iIDogImxsbyIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXU2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdTY0Ci0tIyBkZWZpbmUgUFJJdTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHUiIDogImxsdSIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeDY0Ci0tIyBkZWZpbmUgUFJJeDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHgiIDogImxseCIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSVg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWDY0Ci0tIyBkZWZpbmUgUFJJWDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibFgiIDogImxsWCIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRMRUFTVDgKLS0jIGRlZmluZSBQUklkTEVBU1Q4ICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpTEVBU1Q4Ci0tIyBkZWZpbmUgUFJJaUxFQVNUOCAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0xFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJb0xFQVNUOAotLSMgZGVmaW5lIFBSSW9MRUFTVDggIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVMRUFTVDgKLS0jIGRlZmluZSBQUkl1TEVBU1Q4ICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4TEVBU1Q4Ci0tIyBkZWZpbmUgUFJJeExFQVNUOCAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWExFQVNUOAotLSMgZGVmaW5lIFBSSVhMRUFTVDggIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkTEVBU1QxNgotLSMgZGVmaW5lIFBSSWRMRUFTVDE2ICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaUxFQVNUMTYKLS0jIGRlZmluZSBQUklpTEVBU1QxNiAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0xFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW9MRUFTVDE2Ci0tIyBkZWZpbmUgUFJJb0xFQVNUMTYgIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1TEVBU1QxNgotLSMgZGVmaW5lIFBSSXVMRUFTVDE2ICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeExFQVNUMTYKLS0jIGRlZmluZSBQUkl4TEVBU1QxNiAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVhMRUFTVDE2Ci0tIyBkZWZpbmUgUFJJWExFQVNUMTYgIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkTEVBU1QzMgotLSMgZGVmaW5lIFBSSWRMRUFTVDMyICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaUxFQVNUMzIKLS0jIGRlZmluZSBQUklpTEVBU1QzMiAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0xFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW9MRUFTVDMyCi0tIyBkZWZpbmUgUFJJb0xFQVNUMzIgIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1TEVBU1QzMgotLSMgZGVmaW5lIFBSSXVMRUFTVDMyICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeExFQVNUMzIKLS0jIGRlZmluZSBQUkl4TEVBU1QzMiAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVhMRUFTVDMyCi0tIyBkZWZpbmUgUFJJWExFQVNUMzIgIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklkTEVBU1Q2NAotLSMgZGVmaW5lIFBSSWRMRUFTVDY0IFBSSWQ2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaUxFQVNUNjQKLS0jIGRlZmluZSBQUklpTEVBU1Q2NCBQUklpNjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0xFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSW9MRUFTVDY0Ci0tIyBkZWZpbmUgUFJJb0xFQVNUNjQgUFJJbzY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl1TEVBU1Q2NAotLSMgZGVmaW5lIFBSSXVMRUFTVDY0IFBSSXU2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeExFQVNUNjQKLS0jIGRlZmluZSBQUkl4TEVBU1Q2NCBQUkl4NjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSVhMRUFTVDY0Ci0tIyBkZWZpbmUgUFJJWExFQVNUNjQgUFJJWDY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJZEZBU1Q4Ci0tIyBkZWZpbmUgUFJJZEZBU1Q4ICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWlGQVNUOAotLSMgZGVmaW5lIFBSSWlGQVNUOCAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0ZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvRkFTVDgKLS0jIGRlZmluZSBQUklvRkFTVDggIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJdUZBU1Q4Ci0tIyBkZWZpbmUgUFJJdUZBU1Q4ICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXhGQVNUOAotLSMgZGVmaW5lIFBSSXhGQVNUOCAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYRkFTVDgKLS0jIGRlZmluZSBQUklYRkFTVDggIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRGQVNUMTYKLS0jIGRlZmluZSBQUklkRkFTVDE2ICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpRkFTVDE2Ci0tIyBkZWZpbmUgUFJJaUZBU1QxNiAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0ZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJb0ZBU1QxNgotLSMgZGVmaW5lIFBSSW9GQVNUMTYgIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVGQVNUMTYKLS0jIGRlZmluZSBQUkl1RkFTVDE2ICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4RkFTVDE2Ci0tIyBkZWZpbmUgUFJJeEZBU1QxNiAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWEZBU1QxNgotLSMgZGVmaW5lIFBSSVhGQVNUMTYgIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRGQVNUMzIKLS0jIGRlZmluZSBQUklkRkFTVDMyICJkIgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpRkFTVDMyCi0tIyBkZWZpbmUgUFJJaUZBU1QzMiAiaSIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0ZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJb0ZBU1QzMgotLSMgZGVmaW5lIFBSSW9GQVNUMzIgIm8iCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVGQVNUMzIKLS0jIGRlZmluZSBQUkl1RkFTVDMyICJ1IgotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4RkFTVDMyCi0tIyBkZWZpbmUgUFJJeEZBU1QzMiAieCIKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWEZBU1QzMgotLSMgZGVmaW5lIFBSSVhGQVNUMzIgIlgiCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRGQVNUNjQKLS0jIGRlZmluZSBQUklkRkFTVDY0IFBSSWQ2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklpRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklpRkFTVDY0Ci0tIyBkZWZpbmUgUFJJaUZBU1Q2NCBQUklpNjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJb0ZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJb0ZBU1Q2NAotLSMgZGVmaW5lIFBSSW9GQVNUNjQgUFJJbzY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVGQVNUNjQKLS0jIGRlZmluZSBQUkl1RkFTVDY0IFBSSXU2NAotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUkl4RkFTVDY0Ci0tIyBkZWZpbmUgUFJJeEZBU1Q2NCBQUkl4NjQKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJWEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJWEZBU1Q2NAotLSMgZGVmaW5lIFBSSVhGQVNUNjQgUFJJWDY0Ci0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRNQVgKLS0jIGRlZmluZSBQUklkTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiAibGxkIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJaU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaU1BWAotLSMgZGVmaW5lIFBSSWlNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxpIiA6ICJsbGkiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvTUFYCi0tIyBkZWZpbmUgUFJJb01BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibG8iIDogImxsbyIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVNQVgKLS0jIGRlZmluZSBQUkl1TUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiAibGx1IikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJeE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeE1BWAotLSMgZGVmaW5lIFBSSXhNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImx4IiA6ICJsbHgiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYTUFYCi0tIyBkZWZpbmUgUFJJWE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibFgiIDogImxsWCIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSWRQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSWRQVFIKLS0jIGRlZmluZSBQUklkUFRSIFwKLS0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiBcCi0tICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJkIiA6IFwKLS0gICAibGxkIikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJaVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJaVBUUgotLSMgZGVmaW5lIFBSSWlQVFIgXAotLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxpIiA6IFwKLS0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gImkiIDogXAotLSAgICJsbGkiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklvUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklvUFRSCi0tIyBkZWZpbmUgUFJJb1BUUiBcCi0tICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibG8iIDogXAotLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAibyIgOiBcCi0tICAgImxsbyIpCi0tI2VuZGlmCi0tI2lmICFkZWZpbmVkIFBSSXVQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLS0jIHVuZGVmIFBSSXVQVFIKLS0jIGRlZmluZSBQUkl1UFRSIFwKLS0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiBcCi0tICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJ1IiA6IFwKLS0gICAibGx1IikKLS0jZW5kaWYKLS0jaWYgIWRlZmluZWQgUFJJeFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotLSMgdW5kZWYgUFJJeFBUUgotLSMgZGVmaW5lIFBSSXhQVFIgXAotLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx4IiA6IFwKLS0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIngiIDogXAotLSAgICJsbHgiKQotLSNlbmRpZgotLSNpZiAhZGVmaW5lZCBQUklYUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0tIyB1bmRlZiBQUklYUFRSCi0tIyBkZWZpbmUgUFJJWFBUUiBcCi0tICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibFgiIDogXAotLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiWCIgOiBcCi0tICAgImxsWCIpCi0tI2VuZGlmCi0tCi0tLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLQotLSNpZmRlZiBfTElCQwotLS8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0tICAgYmVjYXVzZSBzb21lIElTTyBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0tICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotLSMgZGVmaW5lIG9wZW4obmFtZSwgZmxhZ3MpCW9wZW5fbm90X2NhbmNlbF8yIChuYW1lLCBmbGFncykKLS0jIGRlZmluZSBjbG9zZShmZCkJCWNsb3NlX25vdF9jYW5jZWxfbm9fc3RhdHVzIChmZCkKLS0jIGRlZmluZSByZWFkKGZkLCBidWYsIG4pCXJlYWRfbm90X2NhbmNlbCAoZmQsIGJ1ZiwgbikKLS0jIGRlZmluZSBtbWFwKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQpIFwKLS0gIF9fbW1hcCAoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCkKLS0jIGRlZmluZSBtdW5tYXAoYWRkciwgbGVuKQlfX211bm1hcCAoYWRkciwgbGVuKQotLSNlbmRpZgotLQotLS8qIEZvciB0aG9zZSBsb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0tICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLS0jaWZkZWYgSEFWRV9BTExPQ0EKLS0jIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCi0tI2Vsc2UKLS0jIGRlZmluZSBhbGxvY2EobikgbWFsbG9jIChuKQotLSMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCi0tI2VuZGlmCi0tCi0tLyogRm9yIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBJL08uCi0tICAgT19CSU5BUlkgaXMgdXN1YWxseSBkZWNsYXJlZCBpbiA8ZmNudGwuaD4uICovCi0tI2lmICFkZWZpbmVkIE9fQklOQVJZICYmIGRlZmluZWQgX09fQklOQVJZCi0tICAvKiBGb3IgTVNDLWNvbXBhdGlibGUgY29tcGlsZXJzLiAgKi8KLS0jIGRlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKLS0jIGRlZmluZSBPX1RFWFQgX09fVEVYVAotLSNlbmRpZgotLSNpZmRlZiBfX0JFT1NfXwotLSAgLyogQmVPUyA1IGhhcyBPX0JJTkFSWSBhbmQgT19URVhULCBidXQgdGhleSBoYXZlIG5vIGVmZmVjdC4gICovCi0tIyB1bmRlZiBPX0JJTkFSWQotLSMgdW5kZWYgT19URVhUCi0tI2VuZGlmCi0tLyogT24gcmVhc29uYWJsZSBzeXN0ZW1zLCBiaW5hcnkgSS9PIGlzIHRoZSBkZWZhdWx0LiAgKi8KLS0jaWZuZGVmIE9fQklOQVJZCi0tIyBkZWZpbmUgT19CSU5BUlkgMAotLSNlbmRpZgotLQotLQotLS8qIFdlIG5lZWQgYSBzaWduLCB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQKLS0gICB3aXRoIGFsbCB0cmFuc2xhdGlvbnMuICBUaGlzIGlzIGltcG9ydGFudCBpZiB0aGUgdHJhbnNsYXRpb25zIGFyZQotLSAgIGNhY2hlZCBieSBvbmUgb2YgR0NDJ3MgZmVhdHVyZXMuICAqLwotLWludCBfbmxfbXNnX2NhdF9jbnRyOwotLQotLQotLS8qIEV4cGFuZCBhIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQuICBSZXR1cm4gTlVMTCBpZiB1bnN1cHBvcnRlZC4gICovCi0tc3RhdGljIGNvbnN0IGNoYXIgKgotLWdldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAoY29uc3QgY2hhciAqbmFtZSkKLS17Ci0tICAvKiBUZXN0IGZvciBhbiBJU08gQyA5OSBzZWN0aW9uIDcuOC4xIGZvcm1hdCBzdHJpbmcgZGlyZWN0aXZlLgotLSAgICAgU3ludGF4OgotLSAgICAgUCBSIEkgeyBkIHwgaSB8IG8gfCB1IHwgeCB8IFggfQotLSAgICAgeyB7IHwgTEVBU1QgfCBGQVNUIH0geyA4IHwgMTYgfCAzMiB8IDY0IH0gfCBNQVggfCBQVFIgfSAgKi8KLS0gIC8qIFdlIGRvbid0IHVzZSBhIHRhYmxlIG9mIDE0IHRpbWVzIDYgJ2NvbnN0IGNoYXIgKicgc3RyaW5ncyBoZXJlLCBiZWNhdXNlCi0tICAgICBkYXRhIHJlbG9jYXRpb25zIGNvc3Qgc3RhcnR1cCB0aW1lLiAgKi8KLS0gIGlmIChuYW1lWzBdID09ICdQJyAmJiBuYW1lWzFdID09ICdSJyAmJiBuYW1lWzJdID09ICdJJykKLS0gICAgewotLSAgICAgIGlmIChuYW1lWzNdID09ICdkJyB8fCBuYW1lWzNdID09ICdpJyB8fCBuYW1lWzNdID09ICdvJyB8fCBuYW1lWzNdID09ICd1JwotLQkgIHx8IG5hbWVbM10gPT0gJ3gnIHx8IG5hbWVbM10gPT0gJ1gnKQotLQl7Ci0tCSAgaWYgKG5hbWVbNF0gPT0gJzgnICYmIG5hbWVbNV0gPT0gJ1wwJykKLS0JICAgIHsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJcmV0dXJuIFBSSWQ4OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQlyZXR1cm4gUFJJaTg7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKLS0JCXJldHVybiBQUklvODsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJcmV0dXJuIFBSSXU4OwotLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQlyZXR1cm4gUFJJeDg7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKLS0JCXJldHVybiBQUklYODsKLS0JICAgICAgYWJvcnQgKCk7Ci0tCSAgICB9Ci0tCSAgaWYgKG5hbWVbNF0gPT0gJzEnICYmIG5hbWVbNV0gPT0gJzYnICYmIG5hbWVbNl0gPT0gJ1wwJykKLS0JICAgIHsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJcmV0dXJuIFBSSWQxNjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJcmV0dXJuIFBSSWkxNjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJcmV0dXJuIFBSSW8xNjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJcmV0dXJuIFBSSXUxNjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJcmV0dXJuIFBSSXgxNjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJcmV0dXJuIFBSSVgxNjsKLS0JICAgICAgYWJvcnQgKCk7Ci0tCSAgICB9Ci0tCSAgaWYgKG5hbWVbNF0gPT0gJzMnICYmIG5hbWVbNV0gPT0gJzInICYmIG5hbWVbNl0gPT0gJ1wwJykKLS0JICAgIHsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJcmV0dXJuIFBSSWQzMjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJcmV0dXJuIFBSSWkzMjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJcmV0dXJuIFBSSW8zMjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJcmV0dXJuIFBSSXUzMjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJcmV0dXJuIFBSSXgzMjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJcmV0dXJuIFBSSVgzMjsKLS0JICAgICAgYWJvcnQgKCk7Ci0tCSAgICB9Ci0tCSAgaWYgKG5hbWVbNF0gPT0gJzYnICYmIG5hbWVbNV0gPT0gJzQnICYmIG5hbWVbNl0gPT0gJ1wwJykKLS0JICAgIHsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJcmV0dXJuIFBSSWQ2NDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJcmV0dXJuIFBSSWk2NDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJcmV0dXJuIFBSSW82NDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJcmV0dXJuIFBSSXU2NDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJcmV0dXJuIFBSSXg2NDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJcmV0dXJuIFBSSVg2NDsKLS0JICAgICAgYWJvcnQgKCk7Ci0tCSAgICB9Ci0tCSAgaWYgKG5hbWVbNF0gPT0gJ0wnICYmIG5hbWVbNV0gPT0gJ0UnICYmIG5hbWVbNl0gPT0gJ0EnCi0tCSAgICAgICYmIG5hbWVbN10gPT0gJ1MnICYmIG5hbWVbOF0gPT0gJ1QnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVs5XSA9PSAnOCcgJiYgbmFtZVsxMF0gPT0gJ1wwJykKLS0JCXsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJICAgIHJldHVybiBQUklkTEVBU1Q4OwotLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQkgICAgcmV0dXJuIFBSSWlMRUFTVDg7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdvJykKLS0JCSAgICByZXR1cm4gUFJJb0xFQVNUODsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJICAgIHJldHVybiBQUkl1TEVBU1Q4OwotLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQkgICAgcmV0dXJuIFBSSXhMRUFTVDg7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdYJykKLS0JCSAgICByZXR1cm4gUFJJWExFQVNUODsKLS0JCSAgYWJvcnQgKCk7Ci0tCQl9Ci0tCSAgICAgIGlmIChuYW1lWzldID09ICcxJyAmJiBuYW1lWzEwXSA9PSAnNicgJiYgbmFtZVsxMV0gPT0gJ1wwJykKLS0JCXsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJICAgIHJldHVybiBQUklkTEVBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJICAgIHJldHVybiBQUklpTEVBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJICAgIHJldHVybiBQUklvTEVBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJICAgIHJldHVybiBQUkl1TEVBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJICAgIHJldHVybiBQUkl4TEVBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJICAgIHJldHVybiBQUklYTEVBU1QxNjsKLS0JCSAgYWJvcnQgKCk7Ci0tCQl9Ci0tCSAgICAgIGlmIChuYW1lWzldID09ICczJyAmJiBuYW1lWzEwXSA9PSAnMicgJiYgbmFtZVsxMV0gPT0gJ1wwJykKLS0JCXsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJICAgIHJldHVybiBQUklkTEVBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJICAgIHJldHVybiBQUklpTEVBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJICAgIHJldHVybiBQUklvTEVBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJICAgIHJldHVybiBQUkl1TEVBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJICAgIHJldHVybiBQUkl4TEVBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJICAgIHJldHVybiBQUklYTEVBU1QzMjsKLS0JCSAgYWJvcnQgKCk7Ci0tCQl9Ci0tCSAgICAgIGlmIChuYW1lWzldID09ICc2JyAmJiBuYW1lWzEwXSA9PSAnNCcgJiYgbmFtZVsxMV0gPT0gJ1wwJykKLS0JCXsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJICAgIHJldHVybiBQUklkTEVBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJICAgIHJldHVybiBQUklpTEVBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJICAgIHJldHVybiBQUklvTEVBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJICAgIHJldHVybiBQUkl1TEVBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJICAgIHJldHVybiBQUkl4TEVBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJICAgIHJldHVybiBQUklYTEVBU1Q2NDsKLS0JCSAgYWJvcnQgKCk7Ci0tCQl9Ci0tCSAgICB9Ci0tCSAgaWYgKG5hbWVbNF0gPT0gJ0YnICYmIG5hbWVbNV0gPT0gJ0EnICYmIG5hbWVbNl0gPT0gJ1MnCi0tCSAgICAgICYmIG5hbWVbN10gPT0gJ1QnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVs4XSA9PSAnOCcgJiYgbmFtZVs5XSA9PSAnXDAnKQotLQkJewotLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQkgICAgcmV0dXJuIFBSSWRGQVNUODsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJICAgIHJldHVybiBQUklpRkFTVDg7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdvJykKLS0JCSAgICByZXR1cm4gUFJJb0ZBU1Q4OwotLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0tCQkgICAgcmV0dXJuIFBSSXVGQVNUODsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJICAgIHJldHVybiBQUkl4RkFTVDg7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdYJykKLS0JCSAgICByZXR1cm4gUFJJWEZBU1Q4OwotLQkJICBhYm9ydCAoKTsKLS0JCX0KLS0JICAgICAgaWYgKG5hbWVbOF0gPT0gJzEnICYmIG5hbWVbOV0gPT0gJzYnICYmIG5hbWVbMTBdID09ICdcMCcpCi0tCQl7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdkJykKLS0JCSAgICByZXR1cm4gUFJJZEZBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJICAgIHJldHVybiBQUklpRkFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0tCQkgICAgcmV0dXJuIFBSSW9GQVNUMTY7Ci0tCQkgIGlmIChuYW1lWzNdID09ICd1JykKLS0JCSAgICByZXR1cm4gUFJJdUZBU1QxNjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJICAgIHJldHVybiBQUkl4RkFTVDE2OwotLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0tCQkgICAgcmV0dXJuIFBSSVhGQVNUMTY7Ci0tCQkgIGFib3J0ICgpOwotLQkJfQotLQkgICAgICBpZiAobmFtZVs4XSA9PSAnMycgJiYgbmFtZVs5XSA9PSAnMicgJiYgbmFtZVsxMF0gPT0gJ1wwJykKLS0JCXsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotLQkJICAgIHJldHVybiBQUklkRkFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0tCQkgICAgcmV0dXJuIFBSSWlGQVNUMzI7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdvJykKLS0JCSAgICByZXR1cm4gUFJJb0ZBU1QzMjsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotLQkJICAgIHJldHVybiBQUkl1RkFTVDMyOwotLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0tCQkgICAgcmV0dXJuIFBSSXhGQVNUMzI7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdYJykKLS0JCSAgICByZXR1cm4gUFJJWEZBU1QzMjsKLS0JCSAgYWJvcnQgKCk7Ci0tCQl9Ci0tCSAgICAgIGlmIChuYW1lWzhdID09ICc2JyAmJiBuYW1lWzldID09ICc0JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQotLQkJewotLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQkgICAgcmV0dXJuIFBSSWRGQVNUNjQ7Ci0tCQkgIGlmIChuYW1lWzNdID09ICdpJykKLS0JCSAgICByZXR1cm4gUFJJaUZBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotLQkJICAgIHJldHVybiBQUklvRkFTVDY0OwotLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0tCQkgICAgcmV0dXJuIFBSSXVGQVNUNjQ7Ci0tCQkgIGlmIChuYW1lWzNdID09ICd4JykKLS0JCSAgICByZXR1cm4gUFJJeEZBU1Q2NDsKLS0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotLQkJICAgIHJldHVybiBQUklYRkFTVDY0OwotLQkJICBhYm9ydCAoKTsKLS0JCX0KLS0JICAgIH0KLS0JICBpZiAobmFtZVs0XSA9PSAnTScgJiYgbmFtZVs1XSA9PSAnQScgJiYgbmFtZVs2XSA9PSAnWCcKLS0JICAgICAgJiYgbmFtZVs3XSA9PSAnXDAnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQlyZXR1cm4gUFJJZE1BWDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJcmV0dXJuIFBSSWlNQVg7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKLS0JCXJldHVybiBQUklvTUFYOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0tCQlyZXR1cm4gUFJJdU1BWDsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJcmV0dXJuIFBSSXhNQVg7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKLS0JCXJldHVybiBQUklYTUFYOwotLQkgICAgICBhYm9ydCAoKTsKLS0JICAgIH0KLS0JICBpZiAobmFtZVs0XSA9PSAnUCcgJiYgbmFtZVs1XSA9PSAnVCcgJiYgbmFtZVs2XSA9PSAnUicKLS0JICAgICAgJiYgbmFtZVs3XSA9PSAnXDAnKQotLQkgICAgewotLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0tCQlyZXR1cm4gUFJJZFBUUjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotLQkJcmV0dXJuIFBSSWlQVFI7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKLS0JCXJldHVybiBQUklvUFRSOwotLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0tCQlyZXR1cm4gUFJJdVBUUjsKLS0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotLQkJcmV0dXJuIFBSSXhQVFI7Ci0tCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKLS0JCXJldHVybiBQUklYUFRSOwotLQkgICAgICBhYm9ydCAoKTsKLS0JICAgIH0KLS0JfQotLSAgICB9Ci0tICAvKiBUZXN0IGZvciBhIGdsaWJjIHNwZWNpZmljIHByaW50ZigpIGZvcm1hdCBkaXJlY3RpdmUgZmxhZy4gICovCi0tICBpZiAobmFtZVswXSA9PSAnSScgJiYgbmFtZVsxXSA9PSAnXDAnKQotLSAgICB7Ci0tI2lmIGRlZmluZWQgX0xJQkMgfHwgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpCi0tICAgICAgLyogVGhlICdJJyBmbGFnLCBpbiBudW1lcmljIGZvcm1hdCBkaXJlY3RpdmVzLCByZXBsYWNlcyBBU0NJSSBkaWdpdHMKLS0JIHdpdGggdGhlICdvdXRkaWdpdHMnIGRlZmluZWQgaW4gdGhlIExDX0NUWVBFIGxvY2FsZSBmYWNldC4gIFRoaXMgaXMKLS0JIHVzZWQgZm9yIEZhcnNpIChQZXJzaWFuKSBhbmQgbWF5YmUgQXJhYmljLiAgKi8KLS0gICAgICByZXR1cm4gIkkiOwotLSNlbHNlCi0tICAgICAgcmV0dXJuICIiOwotLSNlbmRpZgotLSAgICB9Ci0tICAvKiBPdGhlciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgYXJlIG5vdCB2YWxpZC4gICovCi0tICByZXR1cm4gTlVMTDsKLS19Ci0tCi0tLyogTG9hZCB0aGUgbWVzc2FnZSBjYXRhbG9ncyBzcGVjaWZpZWQgYnkgRklMRU5BTUUuICBJZiBpdCBpcyBubyB2YWxpZAotLSAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KLS12b2lkCi0taW50ZXJuYWxfZnVuY3Rpb24KLS1fbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotLQkJIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQotLXsKLS0gIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZF9yZWN1cnNpdmUgKHN0YXRpYywgbG9jaykKLS0gIGludCBmZCA9IC0xOwotLSAgc2l6ZV90IHNpemU7Ci0tI2lmZGVmIF9MSUJDCi0tICBzdHJ1Y3Qgc3RhdDY0IHN0OwotLSNlbHNlCi0tICBzdHJ1Y3Qgc3RhdCBzdDsKLS0jZW5kaWYKLS0gIHN0cnVjdCBtb19maWxlX2hlYWRlciAqZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTE7Ci0tICBpbnQgdXNlX21tYXAgPSAwOwotLSAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKLS0gIGludCByZXZpc2lvbjsKLS0gIGNvbnN0IGNoYXIgKm51bGxlbnRyeTsKLS0gIHNpemVfdCBudWxsZW50cnlsZW47Ci0tCi0tICBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZSAobG9jayk7Ci0tICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgIT0gMCkKLS0gICAgewotLSAgICAgIC8qIFRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczoKLS0KLS0JICsgdGhpcyBpcyB0aGUgc2FtZSB0aHJlYWQgY2FsbGluZyBhZ2FpbiBkdXJpbmcgdGhpcyBpbml0aWFsaXphdGlvbgotLQkgICB2aWEgX25sX2ZpbmRfbXNnLiAgV2UgaGF2ZSBpbml0aWFsaXplZCBldmVyeXRoaW5nIHRoaXMgY2FsbCBuZWVkcy4KLS0KLS0JICsgdGhpcyBpcyBhbm90aGVyIHRocmVhZCB3aGljaCB0cmllZCB0byBpbml0aWFsaXplIHRoaXMgb2JqZWN0LgotLQkgICBOb3QgbmVjZXNzYXJ5IGFueW1vcmUgc2luY2UgaWYgdGhlIGxvY2sgaXMgYXZhaWxhYmxlIHRoaXMKLS0JICAgaXMgZmluaXNoZWQuCi0tICAgICAgKi8KLS0gICAgICBnb3RvIGRvbmU7Ci0tICAgIH0KLS0KLS0gIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gLTE7Ci0tICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7Ci0tCi0tICAvKiBOb3RlIHRoYXQgaXQgd291bGQgYmUgdXNlbGVzcyB0byBzdG9yZSBkb21haW5iaW5kaW5nIGluIGRvbWFpbl9maWxlCi0tICAgICBiZWNhdXNlIGRvbWFpbmJpbmRpbmcgbWlnaHQgYmUgPT0gTlVMTCBub3cgYnV0ICE9IE5VTEwgbGF0ZXIgKGFmdGVyCi0tICAgICBhIGNhbGwgdG8gYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpLiAgKi8KLS0KLS0gIC8qIElmIHRoZSByZWNvcmQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbG9jYWxlIHRoZSBGSUxFTkFNRQotLSAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLS0gICAgIHNwZWNpZmljYXRpb24gdGhlIGxvY2FsZSBmaWxlIG5hbWUgaXMgZGlmZmVyZW50IGZvciBYUEcgYW5kIENFTgotLSAgICAgc3ludGF4LiAgKi8KLS0gIGlmIChkb21haW5fZmlsZS0+ZmlsZW5hbWUgPT0gTlVMTCkKLS0gICAgZ290byBvdXQ7Ci0tCi0tICAvKiBUcnkgdG8gb3BlbiB0aGUgYWRkcmVzc2VkIGZpbGUuICAqLwotLSAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOwotLSAgaWYgKGZkID09IC0xKQotLSAgICBnb3RvIG91dDsKLS0KLS0gIC8qIFdlIG11c3Qga25vdyBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gICovCi0tICBpZiAoCi0tI2lmZGVmIF9MSUJDCi0tICAgICAgX19idWlsdGluX2V4cGVjdCAoZnN0YXQ2NCAoZmQsICZzdCkgIT0gMCwgMCkKLS0jZWxzZQotLSAgICAgIF9fYnVpbHRpbl9leHBlY3QgKGZzdGF0IChmZCwgJnN0KSAhPSAwLCAwKQotLSNlbmRpZgotLSAgICAgIHx8IF9fYnVpbHRpbl9leHBlY3QgKChzaXplID0gKHNpemVfdCkgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSwgMCkKLS0gICAgICB8fCBfX2J1aWx0aW5fZXhwZWN0IChzaXplIDwgc2l6ZW9mIChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIpLCAwKSkKLS0gICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLwotLSAgICBnb3RvIG91dDsKLS0KLS0jaWZkZWYgSEFWRV9NTUFQCi0tICAvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIGxvYWQgdGhlIGZpbGUuICBJZiBtbWFwKCkgaXMgYXZhaWxhYmxlIHdlIHRyeQotLSAgICAgdGhpcyBmaXJzdC4gIElmIG5vdCBhdmFpbGFibGUgb3IgaXQgZmFpbGVkIHdlIHRyeSB0byBsb2FkIGl0LiAgKi8KLS0gIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCwKLS0JCQkJCSBNQVBfUFJJVkFURSwgZmQsIDApOwotLQotLSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSwgMSkpCi0tICAgIHsKLS0gICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCi0tICAgICAgY2xvc2UgKGZkKTsKLS0gICAgICBmZCA9IC0xOwotLSAgICAgIHVzZV9tbWFwID0gMTsKLS0gICAgfQotLSNlbmRpZgotLQotLSAgLyogSWYgdGhlIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgKGkuZS4gbW1hcCdlZCkgd2UgdHJ5IHRvIGxvYWQKLS0gICAgIGl0IG1hbnVhbGx5LiAgKi8KLS0gIGlmIChkYXRhID09IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCi0tICAgIHsKLS0gICAgICBzaXplX3QgdG9fcmVhZDsKLS0gICAgICBjaGFyICpyZWFkX3B0cjsKLS0KLS0gICAgICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtYWxsb2MgKHNpemUpOwotLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0tCWdvdG8gb3V0OwotLQotLSAgICAgIHRvX3JlYWQgPSBzaXplOwotLSAgICAgIHJlYWRfcHRyID0gKGNoYXIgKikgZGF0YTsKLS0gICAgICBkbwotLQl7Ci0tCSAgbG9uZyBpbnQgbmIgPSAobG9uZyBpbnQpIHJlYWQgKGZkLCByZWFkX3B0ciwgdG9fcmVhZCk7Ci0tCSAgaWYgKG5iIDw9IDApCi0tCSAgICB7Ci0tI2lmZGVmIEVJTlRSCi0tCSAgICAgIGlmIChuYiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKLS0JCWNvbnRpbnVlOwotLSNlbmRpZgotLQkgICAgICBnb3RvIG91dDsKLS0JICAgIH0KLS0JICByZWFkX3B0ciArPSBuYjsKLS0JICB0b19yZWFkIC09IG5iOwotLQl9Ci0tICAgICAgd2hpbGUgKHRvX3JlYWQgPiAwKTsKLS0KLS0gICAgICBjbG9zZSAoZmQpOwotLSAgICAgIGZkID0gLTE7Ci0tICAgIH0KLS0KLS0gIC8qIFVzaW5nIHRoZSBtYWdpYyBudW1iZXIgd2UgY2FuIHRlc3Qgd2hldGhlciBpdCByZWFsbHkgaXMgYSBtZXNzYWdlCi0tICAgICBjYXRhbG9nIGZpbGUuICAqLwotLSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCwKLS0JCQkwKSkKLS0gICAgewotLSAgICAgIC8qIFRoZSBtYWdpYyBudW1iZXIgaXMgd3Jvbmc6IG5vdCBhIG1lc3NhZ2UgY2F0YWxvZyBmaWxlLiAgKi8KLS0jaWZkZWYgSEFWRV9NTUFQCi0tICAgICAgaWYgKHVzZV9tbWFwKQotLQltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzaXplKTsKLS0gICAgICBlbHNlCi0tI2VuZGlmCi0tCWZyZWUgKGRhdGEpOwotLSAgICAgIGdvdG8gb3V0OwotLSAgICB9Ci0tCi0tICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2FkZWRfZG9tYWluKSk7Ci0tICBpZiAoZG9tYWluID09IE5VTEwpCi0tICAgIGdvdG8gb3V0OwotLSAgZG9tYWluX2ZpbGUtPmRhdGEgPSBkb21haW47Ci0tCi0tICBkb21haW4tPmRhdGEgPSAoY2hhciAqKSBkYXRhOwotLSAgZG9tYWluLT51c2VfbW1hcCA9IHVzZV9tbWFwOwotLSAgZG9tYWluLT5tbWFwX3NpemUgPSBzaXplOwotLSAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7Ci0tICBkb21haW4tPm1hbGxvY2VkID0gTlVMTDsKLS0KLS0gIC8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdmFpbGFibGUgdGFibGVzLiAgKi8KLS0gIHJldmlzaW9uID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKTsKLS0gIC8qIFdlIHN1cHBvcnQgb25seSB0aGUgbWFqb3IgcmV2aXNpb25zIDAgYW5kIDEuICAqLwotLSAgc3dpdGNoIChyZXZpc2lvbiA+PiAxNikKLS0gICAgewotLSAgICBjYXNlIDA6Ci0tICAgIGNhc2UgMToKLS0gICAgICBkb21haW4tPm5zdHJpbmdzID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5zdHJpbmdzKTsKLS0gICAgICBkb21haW4tPm9yaWdfdGFiID0gKGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3RhYl9vZmZzZXQpKTsKLS0gICAgICBkb21haW4tPnRyYW5zX3RhYiA9IChjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLS0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+dHJhbnNfdGFiX29mZnNldCkpOwotLSAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOwotLSAgICAgIGRvbWFpbi0+aGFzaF90YWIgPQotLQkoZG9tYWluLT5oYXNoX3NpemUgPiAyCi0tCSA/IChjb25zdCBubHNfdWludDMyICopCi0tCSAgICgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpCi0tCSA6IE5VTEwpOwotLSAgICAgIGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiID0gZG9tYWluLT5tdXN0X3N3YXA7Ci0tCi0tICAgICAgLyogTm93IGRpc3BhdGNoIG9uIHRoZSBtaW5vciByZXZpc2lvbi4gICovCi0tICAgICAgc3dpdGNoIChyZXZpc2lvbiAmIDB4ZmZmZikKLS0JewotLQljYXNlIDA6Ci0tCSAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKLS0JICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7Ci0tCSAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKLS0JICBicmVhazsKLS0JY2FzZSAxOgotLQlkZWZhdWx0OgotLQkgIHsKLS0JICAgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKLS0KLS0JICAgIGlmIChkb21haW4tPmhhc2hfdGFiID09IE5VTEwpCi0tCSAgICAgIC8qIFRoaXMgaXMgaW52YWxpZC4gIFRoZXNlIG1pbm9yIHJldmlzaW9ucyBuZWVkIGEgaGFzaCB0YWJsZS4gICovCi0tCSAgICAgIGdvdG8gaW52YWxpZDsKLS0KLS0JICAgIG5fc3lzZGVwX3N0cmluZ3MgPQotLQkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bl9zeXNkZXBfc3RyaW5ncyk7Ci0tCSAgICBpZiAobl9zeXNkZXBfc3RyaW5ncyA+IDApCi0tCSAgICAgIHsKLS0JCW5sc191aW50MzIgbl9zeXNkZXBfc2VnbWVudHM7Ci0tCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKnN5c2RlcF9zZWdtZW50czsKLS0JCWNvbnN0IGNoYXIgKipzeXNkZXBfc2VnbWVudF92YWx1ZXM7Ci0tCQljb25zdCBubHNfdWludDMyICpvcmlnX3N5c2RlcF90YWI7Ci0tCQljb25zdCBubHNfdWludDMyICp0cmFuc19zeXNkZXBfdGFiOwotLQkJbmxzX3VpbnQzMiBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOwotLQkJc2l6ZV90IG1lbW5lZWQ7Ci0tCQljaGFyICptZW07Ci0tCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV9vcmlnX3N5c2RlcF90YWI7Ci0tCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV90cmFuc19zeXNkZXBfdGFiOwotLQkJbmxzX3VpbnQzMiAqaW5tZW1faGFzaF90YWI7Ci0tCQl1bnNpZ25lZCBpbnQgaSwgajsKLS0KLS0JCS8qIEdldCB0aGUgdmFsdWVzIG9mIHRoZSBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KLS0JCW5fc3lzZGVwX3NlZ21lbnRzID0KLS0JCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5fc3lzZGVwX3NlZ21lbnRzKTsKLS0JCXN5c2RlcF9zZWdtZW50cyA9IChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKikKLS0JCSAgKChjaGFyICopIGRhdGEKLS0JCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnN5c2RlcF9zZWdtZW50c19vZmZzZXQpKTsKLS0JCXN5c2RlcF9zZWdtZW50X3ZhbHVlcyA9Ci0tCQkgIChjb25zdCBjaGFyICoqKQotLQkJICBhbGxvY2EgKG5fc3lzZGVwX3NlZ21lbnRzICogc2l6ZW9mIChjb25zdCBjaGFyICopKTsKLS0JCWZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zZWdtZW50czsgaSsrKQotLQkJICB7Ci0tCQkgICAgY29uc3QgY2hhciAqbmFtZSA9Ci0tCQkgICAgICAoY2hhciAqKSBkYXRhCi0tCQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc2VnbWVudHNbaV0ub2Zmc2V0KTsKLS0JCSAgICBubHNfdWludDMyIG5hbWVsZW4gPQotLQkJICAgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zZWdtZW50c1tpXS5sZW5ndGgpOwotLQotLQkJICAgIGlmICghKG5hbWVsZW4gPiAwICYmIG5hbWVbbmFtZWxlbiAtIDFdID09ICdcMCcpKQotLQkJICAgICAgewotLQkJCWZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOwotLQkJCWdvdG8gaW52YWxpZDsKLS0JCSAgICAgIH0KLS0KLS0JCSAgICBzeXNkZXBfc2VnbWVudF92YWx1ZXNbaV0gPSBnZXRfc3lzZGVwX3NlZ21lbnRfdmFsdWUgKG5hbWUpOwotLQkJICB9Ci0tCi0tCQlvcmlnX3N5c2RlcF90YWIgPSAoY29uc3QgbmxzX3VpbnQzMiAqKQotLQkJICAoKGNoYXIgKikgZGF0YQotLQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ19zeXNkZXBfdGFiX29mZnNldCkpOwotLQkJdHJhbnNfc3lzZGVwX3RhYiA9IChjb25zdCBubHNfdWludDMyICopCi0tCQkgICgoY2hhciAqKSBkYXRhCi0tCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc19zeXNkZXBfdGFiX29mZnNldCkpOwotLQotLQkJLyogQ29tcHV0ZSB0aGUgYW1vdW50IG9mIGFkZGl0aW9uYWwgbWVtb3J5IG5lZWRlZCBmb3IgdGhlCi0tCQkgICBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgYW5kIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4KLS0JCSAgIEF0IHRoZSBzYW1lIHRpbWUsIGFsc28gZHJvcCBzdHJpbmcgcGFpcnMgd2hpY2ggcmVmZXIgdG8KLS0JCSAgIGFuIHVuZGVmaW5lZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnQuICAqLwotLQkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncyA9IDA7Ci0tCQltZW1uZWVkID0gZG9tYWluLT5oYXNoX3NpemUgKiBzaXplb2YgKG5sc191aW50MzIpOwotLQkJZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3N0cmluZ3M7IGkrKykKLS0JCSAgewotLQkJICAgIGludCB2YWxpZCA9IDE7Ci0tCQkgICAgc2l6ZV90IG5lZWRzWzJdOwotLQotLQkJICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0tCQkgICAgICB7Ci0tCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQotLQkJCSAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCi0tCQkJICAoKGNoYXIgKikgZGF0YQotLQkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0tCQkJCWogPT0gMAotLQkJCQk/IG9yaWdfc3lzZGVwX3RhYltpXQotLQkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKLS0JCQlzaXplX3QgbmVlZCA9IDA7Ci0tCQkJY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOwotLQotLQkJCWlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKSAhPSBTRUdNRU5UU19FTkQpCi0tCQkJICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKLS0JCQkgICAgewotLQkJCSAgICAgIG5sc191aW50MzIgc3lzZGVwcmVmOwotLQotLQkJCSAgICAgIG5lZWQgKz0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOwotLQotLQkJCSAgICAgIHN5c2RlcHJlZiA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOwotLQkJCSAgICAgIGlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQotLQkJCQlicmVhazsKLS0KLS0JCQkgICAgICBpZiAoc3lzZGVwcmVmID49IG5fc3lzZGVwX3NlZ21lbnRzKQotLQkJCQl7Ci0tCQkJCSAgLyogSW52YWxpZC4gICovCi0tCQkJCSAgZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7Ci0tCQkJCSAgZ290byBpbnZhbGlkOwotLQkJCQl9Ci0tCi0tCQkJICAgICAgaWYgKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdID09IE5VTEwpCi0tCQkJCXsKLS0JCQkJICAvKiBUaGlzIHBhcnRpY3VsYXIgc3RyaW5nIHBhaXIgaXMgaW52YWxpZC4gICovCi0tCQkJCSAgdmFsaWQgPSAwOwotLQkJCQkgIGJyZWFrOwotLQkJCQl9Ci0tCi0tCQkJICAgICAgbmVlZCArPSBzdHJsZW4gKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdKTsKLS0JCQkgICAgfQotLQotLQkJCW5lZWRzW2pdID0gbmVlZDsKLS0JCQlpZiAoIXZhbGlkKQotLQkJCSAgYnJlYWs7Ci0tCQkgICAgICB9Ci0tCi0tCQkgICAgaWYgKHZhbGlkKQotLQkJICAgICAgewotLQkJCW5faW5tZW1fc3lzZGVwX3N0cmluZ3MrKzsKLS0JCQltZW1uZWVkICs9IG5lZWRzWzBdICsgbmVlZHNbMV07Ci0tCQkgICAgICB9Ci0tCQkgIH0KLS0JCW1lbW5lZWQgKz0gMiAqIG5faW5tZW1fc3lzZGVwX3N0cmluZ3MKLS0JCQkgICAqIHNpemVvZiAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyk7Ci0tCi0tCQlpZiAobl9pbm1lbV9zeXNkZXBfc3RyaW5ncyA+IDApCi0tCQkgIHsKLS0JCSAgICB1bnNpZ25lZCBpbnQgazsKLS0KLS0JCSAgICAvKiBBbGxvY2F0ZSBhZGRpdGlvbmFsIG1lbW9yeS4gICovCi0tCQkgICAgbWVtID0gKGNoYXIgKikgbWFsbG9jIChtZW1uZWVkKTsKLS0JCSAgICBpZiAobWVtID09IE5VTEwpCi0tCQkgICAgICBnb3RvIGludmFsaWQ7Ci0tCi0tCQkgICAgZG9tYWluLT5tYWxsb2NlZCA9IG1lbTsKLS0JCSAgICBpbm1lbV9vcmlnX3N5c2RlcF90YWIgPSAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqKSBtZW07Ci0tCQkgICAgbWVtICs9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MKLS0JCQkgICAqIHNpemVvZiAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyk7Ci0tCQkgICAgaW5tZW1fdHJhbnNfc3lzZGVwX3RhYiA9IChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICopIG1lbTsKLS0JCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncwotLQkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKLS0JCSAgICBpbm1lbV9oYXNoX3RhYiA9IChubHNfdWludDMyICopIG1lbTsKLS0JCSAgICBtZW0gKz0gZG9tYWluLT5oYXNoX3NpemUgKiBzaXplb2YgKG5sc191aW50MzIpOwotLQotLQkJICAgIC8qIENvbXB1dGUgdGhlIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncy4gICovCi0tCQkgICAgayA9IDA7Ci0tCQkgICAgZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3N0cmluZ3M7IGkrKykKLS0JCSAgICAgIHsKLS0JCQlpbnQgdmFsaWQgPSAxOwotLQotLQkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0tCQkJICB7Ci0tCQkJICAgIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICpzeXNkZXBfc3RyaW5nID0KLS0JCQkgICAgICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKLS0JCQkgICAgICAoKGNoYXIgKikgZGF0YQotLQkJCSAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotLQkJCQkgICAgaiA9PSAwCi0tCQkJCSAgICA/IG9yaWdfc3lzZGVwX3RhYltpXQotLQkJCQkgICAgOiB0cmFuc19zeXNkZXBfdGFiW2ldKSk7Ci0tCQkJICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPQotLQkJCSAgICAgIHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOwotLQotLQkJCSAgICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikKLS0JCQkJIT0gU0VHTUVOVFNfRU5EKQotLQkJCSAgICAgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQotLQkJCQl7Ci0tCQkJCSAgbmxzX3VpbnQzMiBzeXNkZXByZWY7Ci0tCi0tCQkJCSAgc3lzZGVwcmVmID0KLS0JCQkJICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOwotLQkJCQkgIGlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQotLQkJCQkgICAgYnJlYWs7Ci0tCi0tCQkJCSAgaWYgKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdID09IE5VTEwpCi0tCQkJCSAgICB7Ci0tCQkJCSAgICAgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcwotLQkJCQkJIGludmFsaWQuICAqLwotLQkJCQkgICAgICB2YWxpZCA9IDA7Ci0tCQkJCSAgICAgIGJyZWFrOwotLQkJCQkgICAgfQotLQkJCQl9Ci0tCi0tCQkJICAgIGlmICghdmFsaWQpCi0tCQkJICAgICAgYnJlYWs7Ci0tCQkJICB9Ci0tCi0tCQkJaWYgKHZhbGlkKQotLQkJCSAgewotLQkJCSAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotLQkJCSAgICAgIHsKLS0JCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQotLQkJCQkgIChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqKQotLQkJCQkgICgoY2hhciAqKSBkYXRhCi0tCQkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0tCQkJCQlqID09IDAKLS0JCQkJCT8gb3JpZ19zeXNkZXBfdGFiW2ldCi0tCQkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKLS0JCQkJY29uc3QgY2hhciAqc3RhdGljX3NlZ21lbnRzID0KLS0JCQkJICAoY2hhciAqKSBkYXRhCi0tCQkJCSAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3N0cmluZy0+b2Zmc2V0KTsKLS0JCQkJY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9Ci0tCQkJCSAgc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7Ci0tCi0tCQkJCS8qIENvbmNhdGVuYXRlIHRoZSBzZWdtZW50cywgYW5kIGZpbGwKLS0JCQkJICAgaW5tZW1fb3JpZ19zeXNkZXBfdGFiW2tdIChmb3IgaiA9PSAwKSBhbmQKLS0JCQkJICAgaW5tZW1fdHJhbnNfc3lzZGVwX3RhYltrXSAoZm9yIGogPT0gMSkuICAqLwotLQotLQkJCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV90YWJfZW50cnkgPQotLQkJCQkgIChqID09IDAKLS0JCQkJICAgPyBpbm1lbV9vcmlnX3N5c2RlcF90YWIKLS0JCQkJICAgOiBpbm1lbV90cmFuc19zeXNkZXBfdGFiKQotLQkJCQkgICsgazsKLS0KLS0JCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpCi0tCQkJCSAgICA9PSBTRUdNRU5UU19FTkQpCi0tCQkJCSAgewotLQkJCQkgICAgLyogT25seSBvbmUgc3RhdGljIHNlZ21lbnQuICAqLwotLQkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQotLQkJCQkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7Ci0tCQkJCSAgICBpbm1lbV90YWJfZW50cnktPnBvaW50ZXIgPSBzdGF0aWNfc2VnbWVudHM7Ci0tCQkJCSAgfQotLQkJCQllbHNlCi0tCQkJCSAgewotLQkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyID0gbWVtOwotLQotLQkJCQkgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCi0tCQkJCSAgICAgIHsKLS0JCQkJCW5sc191aW50MzIgc2Vnc2l6ZSA9Ci0tCQkJCQkgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKLS0JCQkJCW5sc191aW50MzIgc3lzZGVwcmVmID0KLS0JCQkJCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7Ci0tCQkJCQlzaXplX3QgbjsKLS0KLS0JCQkJCWlmIChzZWdzaXplID4gMCkKLS0JCQkJCSAgewotLQkJCQkJICAgIG1lbWNweSAobWVtLCBzdGF0aWNfc2VnbWVudHMsIHNlZ3NpemUpOwotLQkJCQkJICAgIG1lbSArPSBzZWdzaXplOwotLQkJCQkJICAgIHN0YXRpY19zZWdtZW50cyArPSBzZWdzaXplOwotLQkJCQkJICB9Ci0tCi0tCQkJCQlpZiAoc3lzZGVwcmVmID09IFNFR01FTlRTX0VORCkKLS0JCQkJCSAgYnJlYWs7Ci0tCi0tCQkJCQluID0gc3RybGVuIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSk7Ci0tCQkJCQltZW1jcHkgKG1lbSwgc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0sIG4pOwotLQkJCQkJbWVtICs9IG47Ci0tCQkJCSAgICAgIH0KLS0KLS0JCQkJICAgIGlubWVtX3RhYl9lbnRyeS0+bGVuZ3RoID0KLS0JCQkJICAgICAgbWVtIC0gaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyOwotLQkJCQkgIH0KLS0JCQkgICAgICB9Ci0tCi0tCQkJICAgIGsrKzsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0JCSAgICBpZiAoayAhPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzKQotLQkJICAgICAgYWJvcnQgKCk7Ci0tCi0tCQkgICAgLyogQ29tcHV0ZSB0aGUgYXVnbWVudGVkIGhhc2ggdGFibGUuICAqLwotLQkJICAgIGZvciAoaSA9IDA7IGkgPCBkb21haW4tPmhhc2hfc2l6ZTsgaSsrKQotLQkJICAgICAgaW5tZW1faGFzaF90YWJbaV0gPQotLQkJCVcgKGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiLCBkb21haW4tPmhhc2hfdGFiW2ldKTsKLS0JCSAgICBmb3IgKGkgPSAwOyBpIDwgbl9pbm1lbV9zeXNkZXBfc3RyaW5nczsgaSsrKQotLQkJICAgICAgewotLQkJCWNvbnN0IGNoYXIgKm1zZ2lkID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiW2ldLnBvaW50ZXI7Ci0tCQkJbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IF9faGFzaF9zdHJpbmcgKG1zZ2lkKTsKLS0JCQlubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7Ci0tCQkJbmxzX3VpbnQzMiBpbmNyID0KLS0JCQkgIDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7Ci0tCi0tCQkJZm9yICg7OykKLS0JCQkgIHsKLS0JCQkgICAgaWYgKGlubWVtX2hhc2hfdGFiW2lkeF0gPT0gMCkKLS0JCQkgICAgICB7Ci0tCQkJCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICBVc2UgaXQuICAqLwotLQkJCQlpbm1lbV9oYXNoX3RhYltpZHhdID0gMSArIGRvbWFpbi0+bnN0cmluZ3MgKyBpOwotLQkJCQlicmVhazsKLS0JCQkgICAgICB9Ci0tCi0tCQkJICAgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQotLQkJCSAgICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICBpZHggKz0gaW5jcjsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0KLS0JCSAgICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOwotLQkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiOwotLQkJICAgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IGlubWVtX3RyYW5zX3N5c2RlcF90YWI7Ci0tCi0tCQkgICAgZG9tYWluLT5oYXNoX3RhYiA9IGlubWVtX2hhc2hfdGFiOwotLQkJICAgIGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiID0gMDsKLS0JCSAgfQotLQkJZWxzZQotLQkJICB7Ci0tCQkgICAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKLS0JCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7Ci0tCQkgICAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKLS0JCSAgfQotLQotLQkJZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7Ci0tCSAgICAgIH0KLS0JICAgIGVsc2UKLS0JICAgICAgewotLQkJZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKLS0JCWRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKLS0JCWRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7Ci0tCSAgICAgIH0KLS0JICB9Ci0tCSAgYnJlYWs7Ci0tCX0KLS0gICAgICBicmVhazsKLS0gICAgZGVmYXVsdDoKLS0gICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgcmV2aXNpb24uICAqLwotLSAgICBpbnZhbGlkOgotLSAgICAgIC8qIFRoaXMgaXMgYW4gaW52YWxpZCAubW8gZmlsZS4gICovCi0tICAgICAgaWYgKGRvbWFpbi0+bWFsbG9jZWQpCi0tCWZyZWUgKGRvbWFpbi0+bWFsbG9jZWQpOwotLSNpZmRlZiBIQVZFX01NQVAKLS0gICAgICBpZiAodXNlX21tYXApCi0tCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHNpemUpOwotLSAgICAgIGVsc2UKLS0jZW5kaWYKLS0JZnJlZSAoZGF0YSk7Ci0tICAgICAgZnJlZSAoZG9tYWluKTsKLS0gICAgICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7Ci0tICAgICAgZ290byBvdXQ7Ci0tICAgIH0KLS0KLS0gIC8qIE5vIGNhY2hlcyBvZiBjb252ZXJ0ZWQgdHJhbnNsYXRpb25zIHNvIGZhci4gICovCi0tICBkb21haW4tPmNvbnZlcnNpb25zID0gTlVMTDsKLS0gIGRvbWFpbi0+bmNvbnZlcnNpb25zID0gMDsKLS0gIGdsX3J3bG9ja19pbml0IChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQotLSAgLyogR2V0IHRoZSBoZWFkZXIgZW50cnkgYW5kIGxvb2sgZm9yIGEgcGx1cmFsIHNwZWNpZmljYXRpb24uICAqLwotLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0tICBudWxsZW50cnkgPQotLSAgICBfbmxfZmluZF9tc2cgKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nLCBOVUxMLCAiIiwgJm51bGxlbnRyeWxlbik7Ci0tI2Vsc2UKLS0gIG51bGxlbnRyeSA9IF9ubF9maW5kX21zZyAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcsICIiLCAwLCAmbnVsbGVudHJ5bGVuKTsKLS0jZW5kaWYKLS0gIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKG51bGxlbnRyeSwgJmRvbWFpbi0+cGx1cmFsLCAmZG9tYWluLT5ucGx1cmFscyk7Ci0tCi0tIG91dDoKLS0gIGlmIChmZCAhPSAtMSkKLS0gICAgY2xvc2UgKGZkKTsKLS0KLS0gIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gMTsKLS0KLS0gZG9uZToKLS0gIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmUgKGxvY2spOwotLX0KLS0KLS0KLS0jaWZkZWYgX0xJQkMKLS12b2lkCi0taW50ZXJuYWxfZnVuY3Rpb24gX19saWJjX2ZyZWVyZXNfZm5fc2VjdGlvbgotLV9ubF91bmxvYWRfZG9tYWluIChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluKQotLXsKLS0gIHNpemVfdCBpOwotLQotLSAgaWYgKGRvbWFpbi0+cGx1cmFsICE9ICZfX2dldHRleHRfZ2VybWFuaWNfcGx1cmFsKQotLSAgICBfX2dldHRleHRfZnJlZV9leHAgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBkb21haW4tPnBsdXJhbCk7Ci0tCi0tICBmb3IgKGkgPSAwOyBpIDwgZG9tYWluLT5uY29udmVyc2lvbnM7IGkrKykKLS0gICAgewotLSAgICAgIHN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluICpjb252ZCA9ICZkb21haW4tPmNvbnZlcnNpb25zW2ldOwotLQotLSAgICAgIGZyZWUgKGNvbnZkLT5lbmNvZGluZyk7Ci0tICAgICAgaWYgKGNvbnZkLT5jb252X3RhYiAhPSBOVUxMICYmIGNvbnZkLT5jb252X3RhYiAhPSAoY2hhciAqKikgLTEpCi0tCWZyZWUgKGNvbnZkLT5jb252X3RhYik7Ci0tICAgICAgaWYgKGNvbnZkLT5jb252ICE9IChfX2djb252X3QpIC0xKQotLQlfX2djb252X2Nsb3NlIChjb252ZC0+Y29udik7Ci0tICAgIH0KLS0gIGlmIChkb21haW4tPmNvbnZlcnNpb25zICE9IE5VTEwpCi0tICAgIGZyZWUgKGRvbWFpbi0+Y29udmVyc2lvbnMpOwotLSAgX19saWJjX3J3bG9ja19maW5pIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotLQotLSAgaWYgKGRvbWFpbi0+bWFsbG9jZWQpCi0tICAgIGZyZWUgKGRvbWFpbi0+bWFsbG9jZWQpOwotLQotLSMgaWZkZWYgX1BPU0lYX01BUFBFRF9GSUxFUwotLSAgaWYgKGRvbWFpbi0+dXNlX21tYXApCi0tICAgIG11bm1hcCAoKGNhZGRyX3QpIGRvbWFpbi0+ZGF0YSwgZG9tYWluLT5tbWFwX3NpemUpOwotLSAgZWxzZQotLSMgZW5kaWYJLyogX1BPU0lYX01BUFBFRF9GSUxFUyAqLwotLSAgICBmcmVlICgodm9pZCAqKSBkb21haW4tPmRhdGEpOwotLQotLSAgZnJlZSAoZG9tYWluKTsKLS19Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL2xvY2FsY2hhcnNldC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0NjEgKzAsMCBAQAotLS8qIERldGVybWluZSBhIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0tCi0tICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCi0tCi0tI2luY2x1ZGUgPGNvbmZpZy5oPgotLQotLS8qIFNwZWNpZmljYXRpb24uICAqLwotLSNpbmNsdWRlICJsb2NhbGNoYXJzZXQuaCIKLS0KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2luY2x1ZGUgPHN0ZGlvLmg+Ci0tI2luY2x1ZGUgPHN0cmluZy5oPgotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0KLS0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KLS0jIGRlZmluZSBXSU4zMl9OQVRJVkUKLS0jZW5kaWYKLS0KLS0jaWYgZGVmaW5lZCBfX0VNWF9fCi0tLyogQXNzdW1lIEVNWCBwcm9ncmFtIHJ1bnMgb24gT1MvMiwgZXZlbiBpZiBjb21waWxlZCB1bmRlciBET1MuICAqLwotLSMgZGVmaW5lIE9TMgotLSNlbmRpZgotLQotLSNpZiAhZGVmaW5lZCBXSU4zMl9OQVRJVkUKLS0jIGlmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAotLSMgIGluY2x1ZGUgPGxhbmdpbmZvLmg+Ci0tIyBlbHNlCi0tIyAgaWYgMCAvKiBzZWUgY29tbWVudCBiZWxvdyAqLwotLSMgICBpbmNsdWRlIDxsb2NhbGUuaD4KLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jIGlmZGVmIF9fQ1lHV0lOX18KLS0jICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotLSMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLS0jIGVuZGlmCi0tI2VsaWYgZGVmaW5lZCBXSU4zMl9OQVRJVkUKLS0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0tIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0tI2VuZGlmCi0tI2lmIGRlZmluZWQgT1MyCi0tIyBkZWZpbmUgSU5DTF9ET1MKLS0jIGluY2x1ZGUgPG9zMi5oPgotLSNlbmRpZgotLQotLSNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKLS0jIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCi0tI2Vsc2UKLS0jIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQotLSNlbmRpZgotLQotLS8qIEdldCBMSUJESVIuICAqLwotLSNpZm5kZWYgTElCRElSCi0tIyBpbmNsdWRlICJjb25maWdtYWtlLmgiCi0tI2VuZGlmCi0tCi0tI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLS0gIC8qIFdpbjMyLCBDeWd3aW4sIE9TLzIsIERPUyAqLwotLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBESVJFQ1RPUllfU0VQQVJBVE9SCi0tIyBkZWZpbmUgRElSRUNUT1JZX1NFUEFSQVRPUiAnLycKLS0jZW5kaWYKLS0KLS0jaWZuZGVmIElTU0xBU0gKLS0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gRElSRUNUT1JZX1NFUEFSQVRPUikKLS0jZW5kaWYKLS0KLS0jaWYgSEFWRV9ERUNMX0dFVENfVU5MT0NLRUQKLS0jIHVuZGVmIGdldGMKLS0jIGRlZmluZSBnZXRjIGdldGNfdW5sb2NrZWQKLS0jZW5kaWYKLS0KLS0vKiBUaGUgZm9sbG93aW5nIHN0YXRpYyB2YXJpYWJsZSBpcyBkZWNsYXJlZCAndm9sYXRpbGUnIHRvIGF2b2lkIGEKLS0gICBwb3NzaWJsZSBtdWx0aXRocmVhZCBwcm9ibGVtIGluIHRoZSBmdW5jdGlvbiBnZXRfY2hhcnNldF9hbGlhc2VzLiBJZiB3ZQotLSAgIGFyZSBydW5uaW5nIGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQsIGFuZCBpZiB0d28gdGhyZWFkcyBpbml0aWFsaXplCi0tICAgJ2NoYXJzZXRfYWxpYXNlcycgc2ltdWx0YW5lb3VzbHksIGJvdGggd2lsbCBwcm9kdWNlIHRoZSBzYW1lIHZhbHVlLAotLSAgIGFuZCBldmVyeXRoaW5nIHdpbGwgYmUgb2sgaWYgdGhlIHR3byBhc3NpZ25tZW50cyB0byAnY2hhcnNldF9hbGlhc2VzJwotLSAgIGFyZSBhdG9taWMuIEJ1dCBJIGRvbid0IGtub3cgd2hhdCB3aWxsIGhhcHBlbiBpZiB0aGUgdHdvIGFzc2lnbm1lbnRzIG1peC4gICovCi0tI2lmIF9fU1REQ19fICE9IDEKLS0jIGRlZmluZSB2b2xhdGlsZSAvKiBlbXB0eSAqLwotLSNlbmRpZgotLS8qIFBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUsIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4KLS0gICByZWFkLCBlbHNlIE5VTEwuICBJdHMgZm9ybWF0IGlzOgotLSAgIEFMSUFTXzEgJ1wwJyBDQU5PTklDQUxfMSAnXDAnIC4uLiBBTElBU19uICdcMCcgQ0FOT05JQ0FMX24gJ1wwJyAnXDAnICAqLwotLXN0YXRpYyBjb25zdCBjaGFyICogdm9sYXRpbGUgY2hhcnNldF9hbGlhc2VzOwotLQotLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLwotLXN0YXRpYyBjb25zdCBjaGFyICoKLS1nZXRfY2hhcnNldF9hbGlhc2VzICh2b2lkKQotLXsKLS0gIGNvbnN0IGNoYXIgKmNwOwotLQotLSAgY3AgPSBjaGFyc2V0X2FsaWFzZXM7Ci0tICBpZiAoY3AgPT0gTlVMTCkKLS0gICAgewotLSNpZiAhKGRlZmluZWQgVk1TIHx8IGRlZmluZWQgV0lOMzJfTkFUSVZFIHx8IGRlZmluZWQgX19DWUdXSU5fXykKLS0gICAgICBGSUxFICpmcDsKLS0gICAgICBjb25zdCBjaGFyICpkaXI7Ci0tICAgICAgY29uc3QgY2hhciAqYmFzZSA9ICJjaGFyc2V0LmFsaWFzIjsKLS0gICAgICBjaGFyICpmaWxlX25hbWU7Ci0tCi0tICAgICAgLyogTWFrZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGUgY2hhcnNldC5hbGlhcyBsb2NhdGlvbi4gIFRoaXMgaXMKLS0JIG5lY2Vzc2FyeSBmb3IgcnVubmluZyB0aGUgdGVzdHN1aXRlIGJlZm9yZSAibWFrZSBpbnN0YWxsIi4gICovCi0tICAgICAgZGlyID0gZ2V0ZW52ICgiQ0hBUlNFVEFMSUFTRElSIik7Ci0tICAgICAgaWYgKGRpciA9PSBOVUxMIHx8IGRpclswXSA9PSAnXDAnKQotLQlkaXIgPSByZWxvY2F0ZSAoTElCRElSKTsKLS0KLS0gICAgICAvKiBDb25jYXRlbmF0ZSBkaXIgYW5kIGJhc2UgaW50byBmcmVzaGx5IGFsbG9jYXRlZCBmaWxlX25hbWUuICAqLwotLSAgICAgIHsKLS0Jc2l6ZV90IGRpcl9sZW4gPSBzdHJsZW4gKGRpcik7Ci0tCXNpemVfdCBiYXNlX2xlbiA9IHN0cmxlbiAoYmFzZSk7Ci0tCWludCBhZGRfc2xhc2ggPSAoZGlyX2xlbiA+IDAgJiYgIUlTU0xBU0ggKGRpcltkaXJfbGVuIC0gMV0pKTsKLS0JZmlsZV9uYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJfbGVuICsgYWRkX3NsYXNoICsgYmFzZV9sZW4gKyAxKTsKLS0JaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQotLQkgIHsKLS0JICAgIG1lbWNweSAoZmlsZV9uYW1lLCBkaXIsIGRpcl9sZW4pOwotLQkgICAgaWYgKGFkZF9zbGFzaCkKLS0JICAgICAgZmlsZV9uYW1lW2Rpcl9sZW5dID0gRElSRUNUT1JZX1NFUEFSQVRPUjsKLS0JICAgIG1lbWNweSAoZmlsZV9uYW1lICsgZGlyX2xlbiArIGFkZF9zbGFzaCwgYmFzZSwgYmFzZV9sZW4gKyAxKTsKLS0JICB9Ci0tICAgICAgfQotLQotLSAgICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCB8fCAoZnAgPSBmb3BlbiAoZmlsZV9uYW1lLCAiciIpKSA9PSBOVUxMKQotLQkvKiBPdXQgb2YgbWVtb3J5IG9yIGZpbGUgbm90IGZvdW5kLCB0cmVhdCBpdCBhcyBlbXB0eS4gICovCi0tCWNwID0gIiI7Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgLyogUGFyc2UgdGhlIGZpbGUncyBjb250ZW50cy4gICovCi0tCSAgY2hhciAqcmVzX3B0ciA9IE5VTEw7Ci0tCSAgc2l6ZV90IHJlc19zaXplID0gMDsKLS0KLS0JICBmb3IgKDs7KQotLQkgICAgewotLQkgICAgICBpbnQgYzsKLS0JICAgICAgY2hhciBidWYxWzUwKzFdOwotLQkgICAgICBjaGFyIGJ1ZjJbNTArMV07Ci0tCSAgICAgIHNpemVfdCBsMSwgbDI7Ci0tCSAgICAgIGNoYXIgKm9sZF9yZXNfcHRyOwotLQotLQkgICAgICBjID0gZ2V0YyAoZnApOwotLQkgICAgICBpZiAoYyA9PSBFT0YpCi0tCQlicmVhazsKLS0JICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICcgJyB8fCBjID09ICdcdCcpCi0tCQljb250aW51ZTsKLS0JICAgICAgaWYgKGMgPT0gJyMnKQotLQkJewotLQkJICAvKiBTa2lwIGNvbW1lbnQsIHRvIGVuZCBvZiBsaW5lLiAgKi8KLS0JCSAgZG8KLS0JCSAgICBjID0gZ2V0YyAoZnApOwotLQkJICB3aGlsZSAoIShjID09IEVPRiB8fCBjID09ICdcbicpKTsKLS0JCSAgaWYgKGMgPT0gRU9GKQotLQkJICAgIGJyZWFrOwotLQkJICBjb250aW51ZTsKLS0JCX0KLS0JICAgICAgdW5nZXRjIChjLCBmcCk7Ci0tCSAgICAgIGlmIChmc2NhbmYgKGZwLCAiJTUwcyAlNTBzIiwgYnVmMSwgYnVmMikgPCAyKQotLQkJYnJlYWs7Ci0tCSAgICAgIGwxID0gc3RybGVuIChidWYxKTsKLS0JICAgICAgbDIgPSBzdHJsZW4gKGJ1ZjIpOwotLQkgICAgICBvbGRfcmVzX3B0ciA9IHJlc19wdHI7Ci0tCSAgICAgIGlmIChyZXNfc2l6ZSA9PSAwKQotLQkJewotLQkJICByZXNfc2l6ZSA9IGwxICsgMSArIGwyICsgMTsKLS0JCSAgcmVzX3B0ciA9IChjaGFyICopIG1hbGxvYyAocmVzX3NpemUgKyAxKTsKLS0JCX0KLS0JICAgICAgZWxzZQotLQkJewotLQkJICByZXNfc2l6ZSArPSBsMSArIDEgKyBsMiArIDE7Ci0tCQkgIHJlc19wdHIgPSAoY2hhciAqKSByZWFsbG9jIChyZXNfcHRyLCByZXNfc2l6ZSArIDEpOwotLQkJfQotLQkgICAgICBpZiAocmVzX3B0ciA9PSBOVUxMKQotLQkJewotLQkJICAvKiBPdXQgb2YgbWVtb3J5LiAqLwotLQkJICByZXNfc2l6ZSA9IDA7Ci0tCQkgIGlmIChvbGRfcmVzX3B0ciAhPSBOVUxMKQotLQkJICAgIGZyZWUgKG9sZF9yZXNfcHRyKTsKLS0JCSAgYnJlYWs7Ci0tCQl9Ci0tCSAgICAgIHN0cmNweSAocmVzX3B0ciArIHJlc19zaXplIC0gKGwyICsgMSkgLSAobDEgKyAxKSwgYnVmMSk7Ci0tCSAgICAgIHN0cmNweSAocmVzX3B0ciArIHJlc19zaXplIC0gKGwyICsgMSksIGJ1ZjIpOwotLQkgICAgfQotLQkgIGZjbG9zZSAoZnApOwotLQkgIGlmIChyZXNfc2l6ZSA9PSAwKQotLQkgICAgY3AgPSAiIjsKLS0JICBlbHNlCi0tCSAgICB7Ci0tCSAgICAgICoocmVzX3B0ciArIHJlc19zaXplKSA9ICdcMCc7Ci0tCSAgICAgIGNwID0gcmVzX3B0cjsKLS0JICAgIH0KLS0JfQotLQotLSAgICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCkKLS0JZnJlZSAoZmlsZV9uYW1lKTsKLS0KLS0jZWxzZQotLQotLSMgaWYgZGVmaW5lZCBWTVMKLS0gICAgICAvKiBUbyBhdm9pZCB0aGUgdHJvdWJsZXMgb2YgYW4gZXh0cmEgZmlsZSBjaGFyc2V0LmFsaWFzX3ZtcyBpbiB0aGUKLS0JIHNvdXJjZXMgb2YgbWFueSBHTlUgcGFja2FnZXMsIHNpbXBseSBpbmxpbmUgdGhlIGFsaWFzZXMgaGVyZS4gICovCi0tICAgICAgLyogVGhlIGxpc3Qgb2YgZW5jb2RpbmdzIGlzIHRha2VuIGZyb20gdGhlIE9wZW5WTVMgNy4zLTEgZG9jdW1lbnRhdGlvbgotLQkgIkNvbXBhcSBDIFJ1bi1UaW1lIExpYnJhcnkgUmVmZXJlbmNlIE1hbnVhbCBmb3IgT3BlblZNUyBzeXN0ZW1zIgotLQkgc2VjdGlvbiAxMC43ICJIYW5kbGluZyBEaWZmZXJlbnQgQ2hhcmFjdGVyIFNldHMiLiAgKi8KLS0gICAgICBjcCA9ICJJU084ODU5LTEiICJcMCIgIklTTy04ODU5LTEiICJcMCIKLS0JICAgIklTTzg4NTktMiIgIlwwIiAiSVNPLTg4NTktMiIgIlwwIgotLQkgICAiSVNPODg1OS01IiAiXDAiICJJU08tODg1OS01IiAiXDAiCi0tCSAgICJJU084ODU5LTciICJcMCIgIklTTy04ODU5LTciICJcMCIKLS0JICAgIklTTzg4NTktOCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgotLQkgICAiSVNPODg1OS05IiAiXDAiICJJU08tODg1OS05IiAiXDAiCi0tCSAgIC8qIEphcGFuZXNlICovCi0tCSAgICJldWNKUCIgIlwwIiAiRVVDLUpQIiAiXDAiCi0tCSAgICJTSklTIiAiXDAiICJTSElGVF9KSVMiICJcMCIKLS0JICAgIkRFQ0tBTkpJIiAiXDAiICJERUMtS0FOSkkiICJcMCIKLS0JICAgIlNERUNLQU5KSSIgIlwwIiAiRVVDLUpQIiAiXDAiCi0tCSAgIC8qIENoaW5lc2UgKi8KLS0JICAgImV1Y1RXIiAiXDAiICJFVUMtVFciICJcMCIKLS0JICAgIkRFQ0hBTllVIiAiXDAiICJERUMtSEFOWVUiICJcMCIKLS0JICAgIkRFQ0hBTlpJIiAiXDAiICJHQjIzMTIiICJcMCIKLS0JICAgLyogS29yZWFuICovCi0tCSAgICJERUNLT1JFQU4iICJcMCIgIkVVQy1LUiIgIlwwIjsKLS0jIGVuZGlmCi0tCi0tIyBpZiBkZWZpbmVkIFdJTjMyX05BVElWRSB8fCBkZWZpbmVkIF9fQ1lHV0lOX18KLS0gICAgICAvKiBUbyBhdm9pZCB0aGUgdHJvdWJsZXMgb2YgaW5zdGFsbGluZyBhIHNlcGFyYXRlIGZpbGUgaW4gdGhlIHNhbWUKLS0JIGRpcmVjdG9yeSBhcyB0aGUgRExMIGFuZCBvZiByZXRyaWV2aW5nIHRoZSBETEwncyBkaXJlY3RvcnkgYXQKLS0JIHJ1bnRpbWUsIHNpbXBseSBpbmxpbmUgdGhlIGFsaWFzZXMgaGVyZS4gICovCi0tCi0tICAgICAgY3AgPSAiQ1A5MzYiICJcMCIgIkdCSyIgIlwwIgotLQkgICAiQ1AxMzYxIiAiXDAiICJKT0hBQiIgIlwwIgotLQkgICAiQ1AyMDEyNyIgIlwwIiAiQVNDSUkiICJcMCIKLS0JICAgIkNQMjA4NjYiICJcMCIgIktPSTgtUiIgIlwwIgotLQkgICAiQ1AyMDkzNiIgIlwwIiAiR0IyMzEyIiAiXDAiCi0tCSAgICJDUDIxODY2IiAiXDAiICJLT0k4LVJVIiAiXDAiCi0tCSAgICJDUDI4NTkxIiAiXDAiICJJU08tODg1OS0xIiAiXDAiCi0tCSAgICJDUDI4NTkyIiAiXDAiICJJU08tODg1OS0yIiAiXDAiCi0tCSAgICJDUDI4NTkzIiAiXDAiICJJU08tODg1OS0zIiAiXDAiCi0tCSAgICJDUDI4NTk0IiAiXDAiICJJU08tODg1OS00IiAiXDAiCi0tCSAgICJDUDI4NTk1IiAiXDAiICJJU08tODg1OS01IiAiXDAiCi0tCSAgICJDUDI4NTk2IiAiXDAiICJJU08tODg1OS02IiAiXDAiCi0tCSAgICJDUDI4NTk3IiAiXDAiICJJU08tODg1OS03IiAiXDAiCi0tCSAgICJDUDI4NTk4IiAiXDAiICJJU08tODg1OS04IiAiXDAiCi0tCSAgICJDUDI4NTk5IiAiXDAiICJJU08tODg1OS05IiAiXDAiCi0tCSAgICJDUDI4NjA1IiAiXDAiICJJU08tODg1OS0xNSIgIlwwIgotLQkgICAiQ1AzODU5OCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgotLQkgICAiQ1A1MTkzMiIgIlwwIiAiRVVDLUpQIiAiXDAiCi0tCSAgICJDUDUxOTM2IiAiXDAiICJHQjIzMTIiICJcMCIKLS0JICAgIkNQNTE5NDkiICJcMCIgIkVVQy1LUiIgIlwwIgotLQkgICAiQ1A1MTk1MCIgIlwwIiAiRVVDLVRXIiAiXDAiCi0tCSAgICJDUDU0OTM2IiAiXDAiICJHQjE4MDMwIiAiXDAiCi0tCSAgICJDUDY1MDAxIiAiXDAiICJVVEYtOCIgIlwwIjsKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tICAgICAgY2hhcnNldF9hbGlhc2VzID0gY3A7Ci0tICAgIH0KLS0KLS0gIHJldHVybiBjcDsKLS19Ci0tCi0tLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAotLSAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgotLSAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLgotLSAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKLS0gICBuYW1lLiAgKi8KLS0KLS0jaWZkZWYgU1RBVElDCi0tU1RBVElDCi0tI2VuZGlmCi0tY29uc3QgY2hhciAqCi0tbG9jYWxlX2NoYXJzZXQgKHZvaWQpCi0tewotLSAgY29uc3QgY2hhciAqY29kZXNldDsKLS0gIGNvbnN0IGNoYXIgKmFsaWFzZXM7Ci0tCi0tI2lmICEoZGVmaW5lZCBXSU4zMl9OQVRJVkUgfHwgZGVmaW5lZCBPUzIpCi0tCi0tIyBpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKLS0KLS0gIC8qIE1vc3Qgc3lzdGVtcyBzdXBwb3J0IG5sX2xhbmdpbmZvIChDT0RFU0VUKSBub3dhZGF5cy4gICovCi0tICBjb2Rlc2V0ID0gbmxfbGFuZ2luZm8gKENPREVTRVQpOwotLQotLSMgIGlmZGVmIF9fQ1lHV0lOX18KLS0gIC8qIEN5Z3dpbiAyMDA2IGRvZXMgbm90IGhhdmUgbG9jYWxlcy4gIG5sX2xhbmdpbmZvIChDT0RFU0VUKSBhbHdheXMKLS0gICAgIHJldHVybnMgIlVTLUFTQ0lJIi4gIEFzIGxvbmcgYXMgdGhpcyBpcyBub3QgZml4ZWQsIHJldHVybiB0aGUgc3VmZml4Ci0tICAgICBvZiB0aGUgbG9jYWxlIG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpZiBwcmVzZW50KSBvcgotLSAgICAgdGhlIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLS0gIGlmIChjb2Rlc2V0ICE9IE5VTEwgJiYgc3RyY21wIChjb2Rlc2V0LCAiVVMtQVNDSUkiKSA9PSAwKQotLSAgICB7Ci0tICAgICAgY29uc3QgY2hhciAqbG9jYWxlOwotLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsyICsgMTAgKyAxXTsKLS0KLS0gICAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLS0gICAgICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCi0tCXsKLS0JICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19DVFlQRSIpOwotLQkgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLS0JICAgIGxvY2FsZSA9IGdldGVudiAoIkxBTkciKTsKLS0JfQotLSAgICAgIGlmIChsb2NhbGUgIT0gTlVMTCAmJiBsb2NhbGVbMF0gIT0gJ1wwJykKLS0JewotLQkgIC8qIElmIHRoZSBsb2NhbGUgbmFtZSBjb250YWlucyBhbiBlbmNvZGluZyBhZnRlciB0aGUgZG90LCByZXR1cm4KLS0JICAgICBpdC4gICovCi0tCSAgY29uc3QgY2hhciAqZG90ID0gc3RyY2hyIChsb2NhbGUsICcuJyk7Ci0tCi0tCSAgaWYgKGRvdCAhPSBOVUxMKQotLQkgICAgewotLQkgICAgICBjb25zdCBjaGFyICptb2RpZmllcjsKLS0KLS0JICAgICAgZG90Kys7Ci0tCSAgICAgIC8qIExvb2sgZm9yIHRoZSBwb3NzaWJsZSBALi4uIHRyYWlsZXIgYW5kIHJlbW92ZSBpdCwgaWYgYW55LiAgKi8KLS0JICAgICAgbW9kaWZpZXIgPSBzdHJjaHIgKGRvdCwgJ0AnKTsKLS0JICAgICAgaWYgKG1vZGlmaWVyID09IE5VTEwpCi0tCQlyZXR1cm4gZG90OwotLQkgICAgICBpZiAobW9kaWZpZXIgLSBkb3QgPCBzaXplb2YgKGJ1ZikpCi0tCQl7Ci0tCQkgIG1lbWNweSAoYnVmLCBkb3QsIG1vZGlmaWVyIC0gZG90KTsKLS0JCSAgYnVmIFttb2RpZmllciAtIGRvdF0gPSAnXDAnOwotLQkJICByZXR1cm4gYnVmOwotLQkJfQotLQkgICAgfQotLQl9Ci0tCi0tICAgICAgLyogV29lMzIgaGFzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsb2NhbGUncyBjb2RlcGFnZSBhcyBhIG51bWJlci4gICovCi0tICAgICAgc3ByaW50ZiAoYnVmLCAiQ1AldSIsIEdldEFDUCAoKSk7Ci0tICAgICAgY29kZXNldCA9IGJ1ZjsKLS0gICAgfQotLSMgIGVuZGlmCi0tCi0tIyBlbHNlCi0tCi0tICAvKiBPbiBvbGQgc3lzdGVtcyB3aGljaCBsYWNrIGl0LCB1c2Ugc2V0bG9jYWxlIG9yIGdldGVudi4gICovCi0tICBjb25zdCBjaGFyICpsb2NhbGUgPSBOVUxMOwotLQotLSAgLyogQnV0IG1vc3Qgb2xkIHN5c3RlbXMgZG9uJ3QgaGF2ZSBhIGNvbXBsZXRlIHNldCBvZiBsb2NhbGVzLiAgU29tZQotLSAgICAgKGxpa2UgU3VuT1MgNCBvciBESkdQUCkgaGF2ZSBvbmx5IHRoZSBDIGxvY2FsZS4gIFRoZXJlZm9yZSB3ZSBkb24ndAotLSAgICAgdXNlIHNldGxvY2FsZSBoZXJlOyBpdCB3b3VsZCByZXR1cm4gIkMiIHdoZW4gaXQgZG9lc24ndCBzdXBwb3J0IHRoZQotLSAgICAgbG9jYWxlIG5hbWUgdGhlIHVzZXIgaGFzIHNldC4gICovCi0tIyAgaWYgMAotLSAgbG9jYWxlID0gc2V0bG9jYWxlIChMQ19DVFlQRSwgTlVMTCk7Ci0tIyAgZW5kaWYKLS0gIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLS0gICAgewotLSAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOwotLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLS0JewotLQkgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7Ci0tCSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotLQkgICAgbG9jYWxlID0gZ2V0ZW52ICgiTEFORyIpOwotLQl9Ci0tICAgIH0KLS0KLS0gIC8qIE9uIHNvbWUgb2xkIHN5c3RlbXMsIG9uZSB1c2VkIHRvIHNldCBsb2NhbGUgPSAiaXNvODg1OV8xIi4gT24gb3RoZXJzLAotLSAgICAgeW91IHNldCBpdCB0byAibGFuZ3VhZ2VfQ09VTlRSWS5jaGFyc2V0Ii4gSW4gYW55IGNhc2UsIHdlIHJlc29sdmUgaXQKLS0gICAgIHRocm91Z2ggdGhlIGNoYXJzZXQuYWxpYXMgZmlsZS4gICovCi0tICBjb2Rlc2V0ID0gbG9jYWxlOwotLQotLSMgZW5kaWYKLS0KLS0jZWxpZiBkZWZpbmVkIFdJTjMyX05BVElWRQotLQotLSAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOwotLQotLSAgLyogV29lMzIgaGFzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsb2NhbGUncyBjb2RlcGFnZSBhcyBhIG51bWJlci4gICovCi0tICBzcHJpbnRmIChidWYsICJDUCV1IiwgR2V0QUNQICgpKTsKLS0gIGNvZGVzZXQgPSBidWY7Ci0tCi0tI2VsaWYgZGVmaW5lZCBPUzIKLS0KLS0gIGNvbnN0IGNoYXIgKmxvY2FsZTsKLS0gIHN0YXRpYyBjaGFyIGJ1ZlsyICsgMTAgKyAxXTsKLS0gIFVMT05HIGNwWzNdOwotLSAgVUxPTkcgY3BsZW47Ci0tCi0tICAvKiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIHRoZSBjb2Rlc2V0LCBhcyBzZXQgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0sCi0tICAgICB3aXRoIHN0YW5kYXJkIGxhbmd1YWdlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCi0tICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLS0gIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLS0gICAgewotLSAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7Ci0tICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotLQlsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7Ci0tICAgIH0KLS0gIGlmIChsb2NhbGUgIT0gTlVMTCAmJiBsb2NhbGVbMF0gIT0gJ1wwJykKLS0gICAgewotLSAgICAgIC8qIElmIHRoZSBsb2NhbGUgbmFtZSBjb250YWlucyBhbiBlbmNvZGluZyBhZnRlciB0aGUgZG90LCByZXR1cm4gaXQuICAqLwotLSAgICAgIGNvbnN0IGNoYXIgKmRvdCA9IHN0cmNociAobG9jYWxlLCAnLicpOwotLQotLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLS0JewotLQkgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotLQotLQkgIGRvdCsrOwotLQkgIC8qIExvb2sgZm9yIHRoZSBwb3NzaWJsZSBALi4uIHRyYWlsZXIgYW5kIHJlbW92ZSBpdCwgaWYgYW55LiAgKi8KLS0JICBtb2RpZmllciA9IHN0cmNociAoZG90LCAnQCcpOwotLQkgIGlmIChtb2RpZmllciA9PSBOVUxMKQotLQkgICAgcmV0dXJuIGRvdDsKLS0JICBpZiAobW9kaWZpZXIgLSBkb3QgPCBzaXplb2YgKGJ1ZikpCi0tCSAgICB7Ci0tCSAgICAgIG1lbWNweSAoYnVmLCBkb3QsIG1vZGlmaWVyIC0gZG90KTsKLS0JICAgICAgYnVmIFttb2RpZmllciAtIGRvdF0gPSAnXDAnOwotLQkgICAgICByZXR1cm4gYnVmOwotLQkgICAgfQotLQl9Ci0tCi0tICAgICAgLyogUmVzb2x2ZSB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLwotLSAgICAgIGNvZGVzZXQgPSBsb2NhbGU7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIC8qIE9TLzIgaGFzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsb2NhbGUncyBjb2RlcGFnZSBhcyBhIG51bWJlci4gICovCi0tICAgICAgaWYgKERvc1F1ZXJ5Q3AgKHNpemVvZiAoY3ApLCBjcCwgJmNwbGVuKSkKLS0JY29kZXNldCA9ICIiOwotLSAgICAgIGVsc2UKLS0JewotLQkgIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBjcFswXSk7Ci0tCSAgY29kZXNldCA9IGJ1ZjsKLS0JfQotLSAgICB9Ci0tCi0tI2VuZGlmCi0tCi0tICBpZiAoY29kZXNldCA9PSBOVUxMKQotLSAgICAvKiBUaGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQuICAqLwotLSAgICBjb2Rlc2V0ID0gIiI7Ci0tCi0tICAvKiBSZXNvbHZlIGFsaWFzLiAqLwotLSAgZm9yIChhbGlhc2VzID0gZ2V0X2NoYXJzZXRfYWxpYXNlcyAoKTsKLS0gICAgICAgKmFsaWFzZXMgIT0gJ1wwJzsKLS0gICAgICAgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSwgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSkKLS0gICAgaWYgKHN0cmNtcCAoY29kZXNldCwgYWxpYXNlcykgPT0gMAotLQl8fCAoYWxpYXNlc1swXSA9PSAnKicgJiYgYWxpYXNlc1sxXSA9PSAnXDAnKSkKLS0gICAgICB7Ci0tCWNvZGVzZXQgPSBhbGlhc2VzICsgc3RybGVuIChhbGlhc2VzKSArIDE7Ci0tCWJyZWFrOwotLSAgICAgIH0KLS0KLS0gIC8qIERvbid0IHJldHVybiBhbiBlbXB0eSBzdHJpbmcuICBHTlUgbGliYyBhbmQgR05VIGxpYmljb252IGludGVycHJldAotLSAgICAgdGhlIGVtcHR5IHN0cmluZyBhcyBkZW5vdGluZyAidGhlIGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZyIsCi0tICAgICB0aHVzIEdOVSBsaWJpY29udiB3b3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYSBzZWNvbmQgdGltZS4gICovCi0tICBpZiAoY29kZXNldFswXSA9PSAnXDAnKQotLSAgICBjb2Rlc2V0ID0gIkFTQ0lJIjsKLS0KLS0gIHJldHVybiBjb2Rlc2V0OwotLX0KLS0tLSBhL2ludGwvbG9jYWxjaGFyc2V0LmgKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQyICswLDAgQEAKLS0vKiBEZXRlcm1pbmUgYSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLgotLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQ0hBUlNFVCBMaWJyYXJ5LgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfTE9DQUxDSEFSU0VUX0gKLS0jZGVmaW5lIF9MT0NBTENIQVJTRVRfSAotLQotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgewotLSNlbmRpZgotLQotLQotLS8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCBjYW5vbmljYWxpemUgaXQKLS0gICBpbnRvIG9uZSBvZiB0aGUgY2Fub25pY2FsIG5hbWVzIGxpc3RlZCBpbiBjb25maWcuY2hhcnNldC4KLS0gICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4KLS0gICBJZiB0aGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSByZXN1bHQgaXMgYSBub24tY2Fub25pY2FsCi0tICAgbmFtZS4gICovCi0tZXh0ZXJuIGNvbnN0IGNoYXIgKiBsb2NhbGVfY2hhcnNldCAodm9pZCk7Ci0tCi0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tfQotLSNlbmRpZgotLQotLQotLSNlbmRpZiAvKiBfTE9DQUxDSEFSU0VUX0ggKi8KLS0tLSBhL2ludGwvbG9jYWxlLmFsaWFzCi0rKysgL2Rldi9udWxsCi1AQCAtMSw3NyArMCwwIEBACi0tIyBMb2NhbGUgbmFtZSBhbGlhcyBkYXRhIGJhc2UuCi0tIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSwyMDAzLDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tIwotLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0jIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0jIGFueSBsYXRlciB2ZXJzaW9uLgotLSMKLS0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tIyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0jCi0tIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSMgVVNBLgotLQotLSMgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgb2YKLS0jIHRoZSBYIFdpbmRvdyBTeXN0ZW0sIHdoaWNoIG5vcm1hbGx5IGNhbiBiZSBmb3VuZCBpbgotLSMJL3Vzci9saWIvWDExL2xvY2FsZS9sb2NhbGUuYWxpYXMKLS0jIEEgc2luZ2xlIGxpbmUgY29udGFpbnMgdHdvIGZpZWxkczogYW4gYWxpYXMgYW5kIGEgc3Vic3RpdHV0aW9uIHZhbHVlLgotLSMgQWxsIGVudHJpZXMgYXJlIGNhc2UgaW5kZXBlbmRlbnQuCi0tCi0tIyBOb3RlOiBUaGlzIGZpbGUgaXMgb2Jzb2xldGUgYW5kIGlzIGtlcHQgYXJvdW5kIGZvciB0aGUgdGltZSBiZWluZyBmb3IKLS0jIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBOb2JvZHkgc2hvdWxkIHJlbHkgb24gdGhlIG5hbWVzIGRlZmluZWQgaGVyZS4KLS0jIExvY2FsZXMgc2hvdWxkIGFsd2F5cyBiZSBzcGVjaWZpZWQgYnkgdGhlaXIgZnVsbCBuYW1lLgotLQotLSMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAKLS0KLS1ib2ttYWwJCW5iX05PLklTTy04ODU5LTEKLS1ib2tt5WwJCW5iX05PLklTTy04ODU5LTEKLS1jYXRhbGFuCQljYV9FUy5JU08tODg1OS0xCi0tY3JvYXRpYW4JaHJfSFIuSVNPLTg4NTktMgotLWN6ZWNoCQljc19DWi5JU08tODg1OS0yCi0tZGFuaXNoICAgICAgICAgIGRhX0RLLklTTy04ODU5LTEKLS1kYW5zawkJZGFfREsuSVNPLTg4NTktMQotLWRldXRzY2gJCWRlX0RFLklTTy04ODU5LTEKLS1kdXRjaAkJbmxfTkwuSVNPLTg4NTktMQotLWVlc3RpCQlldF9FRS5JU08tODg1OS0xCi0tZXN0b25pYW4JZXRfRUUuSVNPLTg4NTktMQotLWZpbm5pc2ggICAgICAgICBmaV9GSS5JU08tODg1OS0xCi0tZnJhbudhaXMJZnJfRlIuSVNPLTg4NTktMQotLWZyZW5jaAkJZnJfRlIuSVNPLTg4NTktMQotLWdhbGVnbwkJZ2xfRVMuSVNPLTg4NTktMQotLWdhbGljaWFuCWdsX0VTLklTTy04ODU5LTEKLS1nZXJtYW4JCWRlX0RFLklTTy04ODU5LTEKLS1ncmVlayAgICAgICAgICAgZWxfR1IuSVNPLTg4NTktNwotLWhlYnJldyAgICAgICAgICBoZV9JTC5JU08tODg1OS04Ci0taHJ2YXRza2kJaHJfSFIuSVNPLTg4NTktMgotLWh1bmdhcmlhbiAgICAgICBodV9IVS5JU08tODg1OS0yCi0taWNlbGFuZGljICAgICAgIGlzX0lTLklTTy04ODU5LTEKLS1pdGFsaWFuICAgICAgICAgaXRfSVQuSVNPLTg4NTktMQotLWphcGFuZXNlCWphX0pQLmV1Y0pQCi0tamFwYW5lc2UuZXVjCWphX0pQLmV1Y0pQCi0tamFfSlAJCWphX0pQLmV1Y0pQCi0tamFfSlAudWppcwlqYV9KUC5ldWNKUAotLWphcGFuZXNlLnNqaXMJamFfSlAuU0pJUwotLWtvcmVhbgkJa29fS1IuZXVjS1IKLS1rb3JlYW4uZXVjIAlrb19LUi5ldWNLUgotLWtvX0tSCQlrb19LUi5ldWNLUgotLWxpdGh1YW5pYW4gICAgICBsdF9MVC5JU08tODg1OS0xMwotLW5vX05PCQluYl9OTy5JU08tODg1OS0xCi0tbm9fTk8uSVNPLTg4NTktMSBuYl9OTy5JU08tODg1OS0xCi0tbm9yd2VnaWFuICAgICAgIG5iX05PLklTTy04ODU5LTEKLS1ueW5vcnNrCQlubl9OTy5JU08tODg1OS0xCi0tcG9saXNoICAgICAgICAgIHBsX1BMLklTTy04ODU5LTIKLS1wb3J0dWd1ZXNlICAgICAgcHRfUFQuSVNPLTg4NTktMQotLXJvbWFuaWFuICAgICAgICByb19STy5JU08tODg1OS0yCi0tcnVzc2lhbiAgICAgICAgIHJ1X1JVLklTTy04ODU5LTUKLS1zbG92YWsgICAgICAgICAgc2tfU0suSVNPLTg4NTktMgotLXNsb3ZlbmUgICAgICAgICBzbF9TSS5JU08tODg1OS0yCi0tc2xvdmVuaWFuICAgICAgIHNsX1NJLklTTy04ODU5LTIKLS1zcGFuaXNoICAgICAgICAgZXNfRVMuSVNPLTg4NTktMQotLXN3ZWRpc2ggICAgICAgICBzdl9TRS5JU08tODg1OS0xCi0tdGhhaQkJdGhfVEguVElTLTYyMAotLXR1cmtpc2ggICAgICAgICB0cl9UUi5JU08tODg1OS05Ci0tLS0gYS9pbnRsL2xvY2FsZWFsaWFzLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDQzOSArMCwwIEBACi0tLyogSGFuZGxlIGFsaWFzZXMgZm9yIGxvY2FsZSBuYW1lcy4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCi0tICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0tICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLS0jIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCi0tI2VuZGlmCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxjdHlwZS5oPgotLSNpbmNsdWRlIDxzdGRpby5oPgotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9fX0ZTRVRMT0NLSU5HCi0tIyBpbmNsdWRlIDxzdGRpb19leHQuaD4KLS0jZW5kaWYKLS0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0tCi0tI2lmZGVmIF9fR05VQ19fCi0tIyB1bmRlZiBhbGxvY2EKLS0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLS0jZWxzZQotLSMgaWZkZWYgX01TQ19WRVIKLS0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLS0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLS0jIGVsc2UKLS0jICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLS0jICBlbHNlCi0tIyAgIGlmZGVmIF9BSVgKLS0gI3ByYWdtYSBhbGxvY2EKLS0jICAgZWxzZQotLSMgICAgaWZuZGVmIGFsbG9jYQotLWNoYXIgKmFsbG9jYSAoKTsKLS0jICAgIGVuZGlmCi0tIyAgIGVuZGlmCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLS0KLS0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0tIyBpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgotLSNlbHNlCi0tIyBkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tI2lmZGVmIF9MSUJDCi0tLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0tICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLS0jIGRlZmluZSBzdHJjYXNlY21wIF9fc3RyY2FzZWNtcAotLQotLSMgaWZuZGVmIG1lbXBjcHkKLS0jICBkZWZpbmUgbWVtcGNweSBfX21lbXBjcHkKLS0jIGVuZGlmCi0tIyBkZWZpbmUgSEFWRV9NRU1QQ1BZCTEKLS0jIGRlZmluZSBIQVZFX19fRlNFVExPQ0tJTkcJMQotLSNlbmRpZgotLQotLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLS0jZWxzZQotLSMgaW5jbHVkZSAibG9jay5oIgotLSNlbmRpZgotLQotLSNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KLS0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotLSNlbmRpZgotLQotLS8qIFNvbWUgb3B0aW1pemF0aW9ucyBmb3IgZ2xpYmMuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIEZFT0YoZnApCQlmZW9mX3VubG9ja2VkIChmcCkKLS0jIGRlZmluZSBGR0VUUyhidWYsIG4sIGZwKQlmZ2V0c191bmxvY2tlZCAoYnVmLCBuLCBmcCkKLS0jZWxzZQotLSMgZGVmaW5lIEZFT0YoZnApCQlmZW9mIChmcCkKLS0jIGRlZmluZSBGR0VUUyhidWYsIG4sIGZwKQlmZ2V0cyAoYnVmLCBuLCBmcCkKLS0jZW5kaWYKLS0KLS0vKiBGb3IgdGhvc2UgbG9zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0tI2lmZGVmIEhBVkVfQUxMT0NBCi0tIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLwotLSNlbHNlCi0tIyBkZWZpbmUgYWxsb2NhKG4pIG1hbGxvYyAobikKLS0jIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQotLSNlbmRpZgotLQotLSNpZiBkZWZpbmVkIF9MSUJDX1JFRU5UUkFOVCB8fCBIQVZFX0RFQ0xfRkdFVFNfVU5MT0NLRUQKLS0jIHVuZGVmIGZnZXRzCi0tIyBkZWZpbmUgZmdldHMoYnVmLCBsZW4sIHMpIGZnZXRzX3VubG9ja2VkIChidWYsIGxlbiwgcykKLS0jZW5kaWYKLS0jaWYgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQgfHwgSEFWRV9ERUNMX0ZFT0ZfVU5MT0NLRUQKLS0jIHVuZGVmIGZlb2YKLS0jIGRlZmluZSBmZW9mKHMpIGZlb2ZfdW5sb2NrZWQgKHMpCi0tI2VuZGlmCi0tCi0tCi0tX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spCi0tCi0tCi0tc3RydWN0IGFsaWFzX21hcAotLXsKLS0gIGNvbnN0IGNoYXIgKmFsaWFzOwotLSAgY29uc3QgY2hhciAqdmFsdWU7Ci0tfTsKLS0KLS0KLS0jaWZuZGVmIF9MSUJDCi0tIyBkZWZpbmUgbGliY19mcmVlcmVzX3B0cihkZWNsKSBkZWNsCi0tI2VuZGlmCi0tCi0tbGliY19mcmVlcmVzX3B0ciAoc3RhdGljIGNoYXIgKnN0cmluZ19zcGFjZSk7Ci0tc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfYWN0OwotLXN0YXRpYyBzaXplX3Qgc3RyaW5nX3NwYWNlX21heDsKLS1saWJjX2ZyZWVyZXNfcHRyIChzdGF0aWMgc3RydWN0IGFsaWFzX21hcCAqbWFwKTsKLS1zdGF0aWMgc2l6ZV90IG5tYXA7Ci0tc3RhdGljIHNpemVfdCBtYXhtYXA7Ci0tCi0tCi0tLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLS1zdGF0aWMgc2l6ZV90IHJlYWRfYWxpYXNfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pCi0tICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLS1zdGF0aWMgaW50IGV4dGVuZF9hbGlhc190YWJsZSAodm9pZCk7Ci0tc3RhdGljIGludCBhbGlhc19jb21wYXJlIChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLAotLQkJCSAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMik7Ci0tCi0tCi0tY29uc3QgY2hhciAqCi0tX25sX2V4cGFuZF9hbGlhcyAoY29uc3QgY2hhciAqbmFtZSkKLS17Ci0tICBzdGF0aWMgY29uc3QgY2hhciAqbG9jYWxlX2FsaWFzX3BhdGg7Ci0tICBzdHJ1Y3QgYWxpYXNfbWFwICpyZXR2YWw7Ci0tICBjb25zdCBjaGFyICpyZXN1bHQgPSBOVUxMOwotLSAgc2l6ZV90IGFkZGVkOwotLQotLSAgX19saWJjX2xvY2tfbG9jayAobG9jayk7Ci0tCi0tICBpZiAobG9jYWxlX2FsaWFzX3BhdGggPT0gTlVMTCkKLS0gICAgbG9jYWxlX2FsaWFzX3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKLS0KLS0gIGRvCi0tICAgIHsKLS0gICAgICBzdHJ1Y3QgYWxpYXNfbWFwIGl0ZW07Ci0tCi0tICAgICAgaXRlbS5hbGlhcyA9IG5hbWU7Ci0tCi0tICAgICAgaWYgKG5tYXAgPiAwKQotLQlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAotLQkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0tCQkJCQkgICAgICAgKGludCAoKikgKGNvbnN0IHZvaWQgKiwKLS0JCQkJCQkJIGNvbnN0IHZvaWQgKikKLS0JCQkJCQkpIGFsaWFzX2NvbXBhcmUpOwotLSAgICAgIGVsc2UKLS0JcmV0dmFsID0gTlVMTDsKLS0KLS0gICAgICAvKiBXZSByZWFsbHkgZm91bmQgYW4gYWxpYXMuICBSZXR1cm4gdGhlIHZhbHVlLiAgKi8KLS0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0tCXsKLS0JICByZXN1bHQgPSByZXR2YWwtPnZhbHVlOwotLQkgIGJyZWFrOwotLQl9Ci0tCi0tICAgICAgLyogUGVyaGFwcyB3ZSBjYW4gZmluZCBhbm90aGVyIGFsaWFzIGZpbGUuICAqLwotLSAgICAgIGFkZGVkID0gMDsKLS0gICAgICB3aGlsZSAoYWRkZWQgPT0gMCAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnKQotLQl7Ci0tCSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0tCi0tCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdID09IFBBVEhfU0VQQVJBVE9SKQotLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLS0JICBzdGFydCA9IGxvY2FsZV9hbGlhc19wYXRoOwotLQotLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnCi0tCQkgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gUEFUSF9TRVBBUkFUT1IpCi0tCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotLQotLQkgIGlmIChzdGFydCA8IGxvY2FsZV9hbGlhc19wYXRoKQotLQkgICAgYWRkZWQgPSByZWFkX2FsaWFzX2ZpbGUgKHN0YXJ0LCBsb2NhbGVfYWxpYXNfcGF0aCAtIHN0YXJ0KTsKLS0JfQotLSAgICB9Ci0tICB3aGlsZSAoYWRkZWQgIT0gMCk7Ci0tCi0tICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOwotLQotLSAgcmV0dXJuIHJlc3VsdDsKLS19Ci0tCi0tCi0tc3RhdGljIHNpemVfdAotLWludGVybmFsX2Z1bmN0aW9uCi0tcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKLS17Ci0tICBGSUxFICpmcDsKLS0gIGNoYXIgKmZ1bGxfZm5hbWU7Ci0tICBzaXplX3QgYWRkZWQ7Ci0tICBzdGF0aWMgY29uc3QgY2hhciBhbGlhc2ZpbGVbXSA9ICIvbG9jYWxlLmFsaWFzIjsKLS0KLS0gIGZ1bGxfZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGZuYW1lX2xlbiArIHNpemVvZiBhbGlhc2ZpbGUpOwotLSNpZmRlZiBIQVZFX01FTVBDUFkKLS0gIG1lbXBjcHkgKG1lbXBjcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pLAotLQkgICBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOwotLSNlbHNlCi0tICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOwotLSAgbWVtY3B5ICgmZnVsbF9mbmFtZVtmbmFtZV9sZW5dLCBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOwotLSNlbmRpZgotLQotLSNpZmRlZiBfTElCQwotLSAgLyogTm90ZSB0aGUgZmlsZSBpcyBvcGVuZWQgd2l0aCBjYW5jZWxsYXRpb24gaW4gdGhlIEkvTyBmdW5jdGlvbnMKLS0gICAgIGRpc2FibGVkLiAgKi8KLS0gIGZwID0gZm9wZW4gKHJlbG9jYXRlIChmdWxsX2ZuYW1lKSwgInJjIik7Ci0tI2Vsc2UKLS0gIGZwID0gZm9wZW4gKHJlbG9jYXRlIChmdWxsX2ZuYW1lKSwgInIiKTsKLS0jZW5kaWYKLS0gIGZyZWVhIChmdWxsX2ZuYW1lKTsKLS0gIGlmIChmcCA9PSBOVUxMKQotLSAgICByZXR1cm4gMDsKLS0KLS0jaWZkZWYgSEFWRV9fX0ZTRVRMT0NLSU5HCi0tICAvKiBObyB0aHJlYWRzIHByZXNlbnQuICAqLwotLSAgX19mc2V0bG9ja2luZyAoZnAsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLS0jZW5kaWYKLS0KLS0gIGFkZGVkID0gMDsKLS0gIHdoaWxlICghRkVPRiAoZnApKQotLSAgICB7Ci0tICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCi0tCSBhKSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCB0d28gZmllbGRzCi0tCSBiKSB0aGVzZSBmaWVsZHMgbXVzdCBiZSB1c2FibGUgYXMgZmlsZSBuYW1lcyBhbmQgc28gbXVzdCBub3QKLS0JICAgIGJlIHRoYXQgbG9uZwotLQkgV2UgYXZvaWQgYSBtdWx0aS1raWxvYnl0ZSBidWZmZXIgaGVyZSBzaW5jZSB0aGlzIHdvdWxkIHVzZSB1cAotLQkgc3RhY2sgc3BhY2Ugd2hpY2ggd2UgbWlnaHQgbm90IGhhdmUgaWYgdGhlIHByb2dyYW0gcmFuIG91dCBvZgotLQkgbWVtb3J5LiAgKi8KLS0gICAgICBjaGFyIGJ1Zls0MDBdOwotLSAgICAgIGNoYXIgKmFsaWFzOwotLSAgICAgIGNoYXIgKnZhbHVlOwotLSAgICAgIGNoYXIgKmNwOwotLSAgICAgIGludCBjb21wbGV0ZV9saW5lOwotLQotLSAgICAgIGlmIChGR0VUUyAoYnVmLCBzaXplb2YgYnVmLCBmcCkgPT0gTlVMTCkKLS0JLyogRU9GIHJlYWNoZWQuICAqLwotLQlicmVhazsKLS0KLS0gICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbGluZSBpcyBjb21wbGV0ZS4gICovCi0tICAgICAgY29tcGxldGVfbGluZSA9IHN0cmNociAoYnVmLCAnXG4nKSAhPSBOVUxMOwotLQotLSAgICAgIGNwID0gYnVmOwotLSAgICAgIC8qIElnbm9yZSBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLS0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKLS0JKytjcDsKLS0KLS0gICAgICAvKiBBIGxlYWRpbmcgJyMnIHNpZ25hbHMgYSBjb21tZW50IGxpbmUuICAqLwotLSAgICAgIGlmIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcjJykKLS0JewotLQkgIGFsaWFzID0gY3ArKzsKLS0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKLS0JICAgICsrY3A7Ci0tCSAgLyogVGVybWluYXRlIGFsaWFzIG5hbWUuICAqLwotLQkgIGlmIChjcFswXSAhPSAnXDAnKQotLQkgICAgKmNwKysgPSAnXDAnOwotLQotLQkgIC8qIE5vdyBsb29rIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2YWx1ZS4gICovCi0tCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCi0tCSAgICArK2NwOwotLQotLQkgIGlmIChjcFswXSAhPSAnXDAnKQotLQkgICAgewotLQkgICAgICB2YWx1ZSA9IGNwKys7Ci0tCSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQotLQkJKytjcDsKLS0JICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KLS0JICAgICAgaWYgKGNwWzBdID09ICdcbicpCi0tCQl7Ci0tCQkgIC8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRlc3QKLS0JCSAgICAgZm9yIHRoZSBlbmQgb2YgbGluZSBwb3NzaWJsZS4gIFdlIGFyZSBsb29raW5nIGZvcgotLQkJICAgICB0aGUgdGVybWluYXRpbmcgJ1xuJyB3aGljaCBkbyBub3Qgb3ZlcndyaXRlIGhlcmUuICAqLwotLQkJICAqY3ArKyA9ICdcMCc7Ci0tCQkgICpjcCA9ICdcbic7Ci0tCQl9Ci0tCSAgICAgIGVsc2UgaWYgKGNwWzBdICE9ICdcMCcpCi0tCQkqY3ArKyA9ICdcMCc7Ci0tCi0tI2lmZGVmIElOX0xJQkdMT0NBTEUKLS0JICAgICAgLyogZ2xpYmMncyBsb2NhbGUuYWxpYXMgY29udGFpbnMgZW50cmllcyBmb3IgamFfSlAgYW5kIGtvX0tSCi0tCQkgdGhhdCBtYWtlIGl0IGltcG9zc2libGUgdG8gdXNlIGEgSmFwYW5lc2Ugb3IgS29yZWFuIFVURi04Ci0tCQkgbG9jYWxlIHVuZGVyIHRoZSBuYW1lICJqYV9KUCIgb3IgImtvX0tSIi4gIElnbm9yZSB0aGVzZQotLQkJIGVudHJpZXMuICAqLwotLQkgICAgICBpZiAoc3RyY2hyIChhbGlhcywgJ18nKSA9PSBOVUxMKQotLSNlbmRpZgotLQkJewotLQkJICBzaXplX3QgYWxpYXNfbGVuOwotLQkJICBzaXplX3QgdmFsdWVfbGVuOwotLQotLQkJICBpZiAobm1hcCA+PSBtYXhtYXApCi0tCQkgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGV4dGVuZF9hbGlhc190YWJsZSAoKSwgMCkpCi0tCQkgICAgICBnb3RvIG91dDsKLS0KLS0JCSAgYWxpYXNfbGVuID0gc3RybGVuIChhbGlhcykgKyAxOwotLQkJICB2YWx1ZV9sZW4gPSBzdHJsZW4gKHZhbHVlKSArIDE7Ci0tCi0tCQkgIGlmIChzdHJpbmdfc3BhY2VfYWN0ICsgYWxpYXNfbGVuICsgdmFsdWVfbGVuID4gc3RyaW5nX3NwYWNlX21heCkKLS0JCSAgICB7Ci0tCQkgICAgICAvKiBJbmNyZWFzZSBzaXplIG9mIG1lbW9yeSBwb29sLiAgKi8KLS0JCSAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IChzdHJpbmdfc3BhY2VfbWF4Ci0tCQkJCQkgKyAoYWxpYXNfbGVuICsgdmFsdWVfbGVuID4gMTAyNAotLQkJCQkJICAgID8gYWxpYXNfbGVuICsgdmFsdWVfbGVuIDogMTAyNCkpOwotLQkJICAgICAgY2hhciAqbmV3X3Bvb2wgPSAoY2hhciAqKSByZWFsbG9jIChzdHJpbmdfc3BhY2UsIG5ld19zaXplKTsKLS0JCSAgICAgIGlmIChuZXdfcG9vbCA9PSBOVUxMKQotLQkJCWdvdG8gb3V0OwotLQotLQkJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHN0cmluZ19zcGFjZSAhPSBuZXdfcG9vbCwgMCkpCi0tCQkJewotLQkJCSAgc2l6ZV90IGk7Ci0tCi0tCQkJICBmb3IgKGkgPSAwOyBpIDwgbm1hcDsgaSsrKQotLQkJCSAgICB7Ci0tCQkJICAgICAgbWFwW2ldLmFsaWFzICs9IG5ld19wb29sIC0gc3RyaW5nX3NwYWNlOwotLQkJCSAgICAgIG1hcFtpXS52YWx1ZSArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKLS0JCQkgICAgfQotLQkJCX0KLS0KLS0JCSAgICAgIHN0cmluZ19zcGFjZSA9IG5ld19wb29sOwotLQkJICAgICAgc3RyaW5nX3NwYWNlX21heCA9IG5ld19zaXplOwotLQkJICAgIH0KLS0KLS0JCSAgbWFwW25tYXBdLmFsaWFzID0KLS0JCSAgICAoY29uc3QgY2hhciAqKSBtZW1jcHkgKCZzdHJpbmdfc3BhY2Vbc3RyaW5nX3NwYWNlX2FjdF0sCi0tCQkJCQkgICBhbGlhcywgYWxpYXNfbGVuKTsKLS0JCSAgc3RyaW5nX3NwYWNlX2FjdCArPSBhbGlhc19sZW47Ci0tCi0tCQkgIG1hcFtubWFwXS52YWx1ZSA9Ci0tCQkgICAgKGNvbnN0IGNoYXIgKikgbWVtY3B5ICgmc3RyaW5nX3NwYWNlW3N0cmluZ19zcGFjZV9hY3RdLAotLQkJCQkJICAgdmFsdWUsIHZhbHVlX2xlbik7Ci0tCQkgIHN0cmluZ19zcGFjZV9hY3QgKz0gdmFsdWVfbGVuOwotLQotLQkJICArK25tYXA7Ci0tCQkgICsrYWRkZWQ7Ci0tCQl9Ci0tCSAgICB9Ci0tCX0KLS0KLS0gICAgICAvKiBQb3NzaWJseSBub3QgdGhlIHdob2xlIGxpbmUgZml0cyBpbnRvIHRoZSBidWZmZXIuICBJZ25vcmUKLS0JIHRoZSByZXN0IG9mIHRoZSBsaW5lLiAgKi8KLS0gICAgICBpZiAoISBjb21wbGV0ZV9saW5lKQotLQlkbwotLQkgIGlmIChGR0VUUyAoYnVmLCBzaXplb2YgYnVmLCBmcCkgPT0gTlVMTCkKLS0JICAgIC8qIE1ha2Ugc3VyZSB0aGUgaW5uZXIgbG9vcCB3aWxsIGJlIGxlZnQuICBUaGUgb3V0ZXIgbG9vcAotLQkgICAgICAgd2lsbCBleGl0IGF0IHRoZSBgZmVvZicgdGVzdC4gICovCi0tCSAgICBicmVhazsKLS0Jd2hpbGUgKHN0cmNociAoYnVmLCAnXG4nKSA9PSBOVUxMKTsKLS0gICAgfQotLQotLSBvdXQ6Ci0tICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCi0tICAgICBlcnJvcnMuICAtLWRyZXBwZXIgICovCi0tICBmY2xvc2UgKGZwKTsKLS0KLS0gIGlmIChhZGRlZCA+IDApCi0tICAgIHFzb3J0IChtYXAsIG5tYXAsIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0tCSAgIChpbnQgKCopIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIGFsaWFzX2NvbXBhcmUpOwotLQotLSAgcmV0dXJuIGFkZGVkOwotLX0KLS0KLS0KLS1zdGF0aWMgaW50Ci0tZXh0ZW5kX2FsaWFzX3RhYmxlICgpCi0tewotLSAgc2l6ZV90IG5ld19zaXplOwotLSAgc3RydWN0IGFsaWFzX21hcCAqbmV3X21hcDsKLS0KLS0gIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOwotLSAgbmV3X21hcCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIHJlYWxsb2MgKG1hcCwgKG5ld19zaXplCi0tCQkJCQkJKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKSk7Ci0tICBpZiAobmV3X21hcCA9PSBOVUxMKQotLSAgICAvKiBTaW1wbHkgZG9uJ3QgZXh0ZW5kOiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNvcmUuICAqLwotLSAgICByZXR1cm4gLTE7Ci0tCi0tICBtYXAgPSBuZXdfbWFwOwotLSAgbWF4bWFwID0gbmV3X3NpemU7Ci0tICByZXR1cm4gMDsKLS19Ci0tCi0tCi0tc3RhdGljIGludAotLWFsaWFzX2NvbXBhcmUgKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpCi0tewotLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJDQVNFQ01QCi0tICByZXR1cm4gc3RyY2FzZWNtcCAobWFwMS0+YWxpYXMsIG1hcDItPmFsaWFzKTsKLS0jZWxzZQotLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAxLT5hbGlhczsKLS0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMi0+YWxpYXM7Ci0tICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKLS0KLS0gIGlmIChwMSA9PSBwMikKLS0gICAgcmV0dXJuIDA7Ci0tCi0tICBkbwotLSAgICB7Ci0tICAgICAgLyogSSBrbm93IHRoaXMgc2VlbXMgdG8gYmUgb2RkIGJ1dCB0aGUgdG9sb3dlcigpIGZ1bmN0aW9uIGluCi0tCSBzb21lIHN5c3RlbXMgbGliYyBjYW5ub3QgaGFuZGxlIG5vbmFscGhhIGNoYXJhY3RlcnMuICAqLwotLSAgICAgIGMxID0gaXN1cHBlciAoKnAxKSA/IHRvbG93ZXIgKCpwMSkgOiAqcDE7Ci0tICAgICAgYzIgPSBpc3VwcGVyICgqcDIpID8gdG9sb3dlciAoKnAyKSA6ICpwMjsKLS0gICAgICBpZiAoYzEgPT0gJ1wwJykKLS0JYnJlYWs7Ci0tICAgICAgKytwMTsKLS0gICAgICArK3AyOwotLSAgICB9Ci0tICB3aGlsZSAoYzEgPT0gYzIpOwotLQotLSAgcmV0dXJuIGMxIC0gYzI7Ci0tI2VuZGlmCi0tfQotLS0tIGEvaW50bC9sb2NhbGVuYW1lLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDE1MDcgKzAsMCBAQAotLS8qIERldGVybWluZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbG9jYWxlLgotLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5vcmc+LCAxOTk1LiAgKi8KLS0vKiBXaW4zMiBjb2RlIHdyaXR0ZW4gYnkgVG9yIExpbGxxdmlzdCA8dG1sQGlraS5maT4uICAqLwotLS8qIE1hY09TIFggY29kZSB3cml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCi0tCi0tI2luY2x1ZGUgPGNvbmZpZy5oPgotLQotLS8qIFNwZWNpZmljYXRpb24uICAqLwotLSNpZmRlZiBJTl9MSUJJTlRMCi0tIyBpbmNsdWRlICJnZXR0ZXh0UC5oIgotLSNlbHNlCi0tIyBpbmNsdWRlICJsb2NhbGVuYW1lLmgiCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxsb2NhbGUuaD4KLS0KLS0jaWYgSEFWRV9DRkxPQ0FMRUNPUFlDVVJSRU5UIHx8IEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRQotLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0tIyBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlN0cmluZy5oPgotLSMgaWYgSEFWRV9DRkxPQ0FMRUNPUFlDVVJSRU5UCi0tIyAgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZMb2NhbGUuaD4KLS0jIGVsaWYgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0tIyAgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZQcmVmZXJlbmNlcy5oPgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KLS0jIGRlZmluZSBXSU4zMl9OQVRJVkUKLS0jZW5kaWYKLS0KLS0jaWZkZWYgV0lOMzJfTkFUSVZFCi0tIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotLSMgaW5jbHVkZSA8d2luZG93cy5oPgotLS8qIExpc3Qgb2YgbGFuZ3VhZ2UgY29kZXMsIHNvcnRlZCBieSB2YWx1ZToKLS0gICAweDAxIExBTkdfQVJBQklDCi0tICAgMHgwMiBMQU5HX0JVTEdBUklBTgotLSAgIDB4MDMgTEFOR19DQVRBTEFOCi0tICAgMHgwNCBMQU5HX0NISU5FU0UKLS0gICAweDA1IExBTkdfQ1pFQ0gKLS0gICAweDA2IExBTkdfREFOSVNICi0tICAgMHgwNyBMQU5HX0dFUk1BTgotLSAgIDB4MDggTEFOR19HUkVFSwotLSAgIDB4MDkgTEFOR19FTkdMSVNICi0tICAgMHgwYSBMQU5HX1NQQU5JU0gKLS0gICAweDBiIExBTkdfRklOTklTSAotLSAgIDB4MGMgTEFOR19GUkVOQ0gKLS0gICAweDBkIExBTkdfSEVCUkVXCi0tICAgMHgwZSBMQU5HX0hVTkdBUklBTgotLSAgIDB4MGYgTEFOR19JQ0VMQU5ESUMKLS0gICAweDEwIExBTkdfSVRBTElBTgotLSAgIDB4MTEgTEFOR19KQVBBTkVTRQotLSAgIDB4MTIgTEFOR19LT1JFQU4KLS0gICAweDEzIExBTkdfRFVUQ0gKLS0gICAweDE0IExBTkdfTk9SV0VHSUFOCi0tICAgMHgxNSBMQU5HX1BPTElTSAotLSAgIDB4MTYgTEFOR19QT1JUVUdVRVNFCi0tICAgMHgxNyBMQU5HX1JIQUVUT19ST01BTkNFCi0tICAgMHgxOCBMQU5HX1JPTUFOSUFOCi0tICAgMHgxOSBMQU5HX1JVU1NJQU4KLS0gICAweDFhIExBTkdfQ1JPQVRJQU4gPT0gTEFOR19TRVJCSUFOCi0tICAgMHgxYiBMQU5HX1NMT1ZBSwotLSAgIDB4MWMgTEFOR19BTEJBTklBTgotLSAgIDB4MWQgTEFOR19TV0VESVNICi0tICAgMHgxZSBMQU5HX1RIQUkKLS0gICAweDFmIExBTkdfVFVSS0lTSAotLSAgIDB4MjAgTEFOR19VUkRVCi0tICAgMHgyMSBMQU5HX0lORE9ORVNJQU4KLS0gICAweDIyIExBTkdfVUtSQUlOSUFOCi0tICAgMHgyMyBMQU5HX0JFTEFSVVNJQU4KLS0gICAweDI0IExBTkdfU0xPVkVOSUFOCi0tICAgMHgyNSBMQU5HX0VTVE9OSUFOCi0tICAgMHgyNiBMQU5HX0xBVFZJQU4KLS0gICAweDI3IExBTkdfTElUSFVBTklBTgotLSAgIDB4MjggTEFOR19UQUpJSwotLSAgIDB4MjkgTEFOR19GQVJTSQotLSAgIDB4MmEgTEFOR19WSUVUTkFNRVNFCi0tICAgMHgyYiBMQU5HX0FSTUVOSUFOCi0tICAgMHgyYyBMQU5HX0FaRVJJCi0tICAgMHgyZCBMQU5HX0JBU1FVRQotLSAgIDB4MmUgTEFOR19TT1JCSUFOCi0tICAgMHgyZiBMQU5HX01BQ0VET05JQU4KLS0gICAweDMwIExBTkdfU1VUVQotLSAgIDB4MzEgTEFOR19UU09OR0EKLS0gICAweDMyIExBTkdfVFNXQU5BCi0tICAgMHgzMyBMQU5HX1ZFTkRBCi0tICAgMHgzNCBMQU5HX1hIT1NBCi0tICAgMHgzNSBMQU5HX1pVTFUKLS0gICAweDM2IExBTkdfQUZSSUtBQU5TCi0tICAgMHgzNyBMQU5HX0dFT1JHSUFOCi0tICAgMHgzOCBMQU5HX0ZBRVJPRVNFCi0tICAgMHgzOSBMQU5HX0hJTkRJCi0tICAgMHgzYSBMQU5HX01BTFRFU0UKLS0gICAweDNiIExBTkdfU0FBTUkKLS0gICAweDNjIExBTkdfR0FFTElDCi0tICAgMHgzZCBMQU5HX1lJRERJU0gKLS0gICAweDNlIExBTkdfTUFMQVkKLS0gICAweDNmIExBTkdfS0FaQUsKLS0gICAweDQwIExBTkdfS1lSR1laCi0tICAgMHg0MSBMQU5HX1NXQUhJTEkKLS0gICAweDQyIExBTkdfVFVSS01FTgotLSAgIDB4NDMgTEFOR19VWkJFSwotLSAgIDB4NDQgTEFOR19UQVRBUgotLSAgIDB4NDUgTEFOR19CRU5HQUxJCi0tICAgMHg0NiBMQU5HX1BVTkpBQkkKLS0gICAweDQ3IExBTkdfR1VKQVJBVEkKLS0gICAweDQ4IExBTkdfT1JJWUEKLS0gICAweDQ5IExBTkdfVEFNSUwKLS0gICAweDRhIExBTkdfVEVMVUdVCi0tICAgMHg0YiBMQU5HX0tBTk5BREEKLS0gICAweDRjIExBTkdfTUFMQVlBTEFNCi0tICAgMHg0ZCBMQU5HX0FTU0FNRVNFCi0tICAgMHg0ZSBMQU5HX01BUkFUSEkKLS0gICAweDRmIExBTkdfU0FOU0tSSVQKLS0gICAweDUwIExBTkdfTU9OR09MSUFOCi0tICAgMHg1MSBMQU5HX1RJQkVUQU4KLS0gICAweDUyIExBTkdfV0VMU0gKLS0gICAweDUzIExBTkdfQ0FNQk9ESUFOCi0tICAgMHg1NCBMQU5HX0xBTwotLSAgIDB4NTUgTEFOR19CVVJNRVNFCi0tICAgMHg1NiBMQU5HX0dBTElDSUFOCi0tICAgMHg1NyBMQU5HX0tPTktBTkkKLS0gICAweDU4IExBTkdfTUFOSVBVUkkKLS0gICAweDU5IExBTkdfU0lOREhJCi0tICAgMHg1YSBMQU5HX1NZUklBQwotLSAgIDB4NWIgTEFOR19TSU5IQUxFU0UKLS0gICAweDVjIExBTkdfQ0hFUk9LRUUKLS0gICAweDVkIExBTkdfSU5VS1RJVFVUCi0tICAgMHg1ZSBMQU5HX0FNSEFSSUMKLS0gICAweDVmIExBTkdfVEFNQVpJR0hUCi0tICAgMHg2MCBMQU5HX0tBU0hNSVJJCi0tICAgMHg2MSBMQU5HX05FUEFMSQotLSAgIDB4NjIgTEFOR19GUklTSUFOCi0tICAgMHg2MyBMQU5HX1BBU0hUTwotLSAgIDB4NjQgTEFOR19UQUdBTE9HCi0tICAgMHg2NSBMQU5HX0RJVkVISQotLSAgIDB4NjYgTEFOR19FRE8KLS0gICAweDY3IExBTkdfRlVMRlVMREUKLS0gICAweDY4IExBTkdfSEFVU0EKLS0gICAweDY5IExBTkdfSUJJQklPCi0tICAgMHg2YSBMQU5HX1lPUlVCQQotLSAgIDB4NzAgTEFOR19JR0JPCi0tICAgMHg3MSBMQU5HX0tBTlVSSQotLSAgIDB4NzIgTEFOR19PUk9NTwotLSAgIDB4NzMgTEFOR19USUdSSU5ZQQotLSAgIDB4NzQgTEFOR19HVUFSQU5JCi0tICAgMHg3NSBMQU5HX0hBV0FJSUFOCi0tICAgMHg3NiBMQU5HX0xBVElOCi0tICAgMHg3NyBMQU5HX1NPTUFMSQotLSAgIDB4NzggTEFOR19ZSQotLSAgIDB4NzkgTEFOR19QQVBJQU1FTlRVCi0tKi8KLS0vKiBNaW5ndyBoZWFkZXJzIGRvbid0IGhhdmUgbGF0ZXN0IGxhbmd1YWdlIGFuZCBzdWJsYW5ndWFnZSBjb2Rlcy4gICovCi0tIyBpZm5kZWYgTEFOR19BRlJJS0FBTlMKLS0jIGRlZmluZSBMQU5HX0FGUklLQUFOUyAweDM2Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQUxCQU5JQU4KLS0jIGRlZmluZSBMQU5HX0FMQkFOSUFOIDB4MWMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19BTUhBUklDCi0tIyBkZWZpbmUgTEFOR19BTUhBUklDIDB4NWUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19BUkFCSUMKLS0jIGRlZmluZSBMQU5HX0FSQUJJQyAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQVJNRU5JQU4KLS0jIGRlZmluZSBMQU5HX0FSTUVOSUFOIDB4MmIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19BU1NBTUVTRQotLSMgZGVmaW5lIExBTkdfQVNTQU1FU0UgMHg0ZAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0FaRVJJCi0tIyBkZWZpbmUgTEFOR19BWkVSSSAweDJjCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfQkFTUVVFCi0tIyBkZWZpbmUgTEFOR19CQVNRVUUgMHgyZAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0JFTEFSVVNJQU4KLS0jIGRlZmluZSBMQU5HX0JFTEFSVVNJQU4gMHgyMwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0JFTkdBTEkKLS0jIGRlZmluZSBMQU5HX0JFTkdBTEkgMHg0NQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0JVUk1FU0UKLS0jIGRlZmluZSBMQU5HX0JVUk1FU0UgMHg1NQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0NBTUJPRElBTgotLSMgZGVmaW5lIExBTkdfQ0FNQk9ESUFOIDB4NTMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19DQVRBTEFOCi0tIyBkZWZpbmUgTEFOR19DQVRBTEFOIDB4MDMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19DSEVST0tFRQotLSMgZGVmaW5lIExBTkdfQ0hFUk9LRUUgMHg1YwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0RJVkVISQotLSMgZGVmaW5lIExBTkdfRElWRUhJIDB4NjUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19FRE8KLS0jIGRlZmluZSBMQU5HX0VETyAweDY2Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfRVNUT05JQU4KLS0jIGRlZmluZSBMQU5HX0VTVE9OSUFOIDB4MjUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19GQUVST0VTRQotLSMgZGVmaW5lIExBTkdfRkFFUk9FU0UgMHgzOAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0ZBUlNJCi0tIyBkZWZpbmUgTEFOR19GQVJTSSAweDI5Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfRlJJU0lBTgotLSMgZGVmaW5lIExBTkdfRlJJU0lBTiAweDYyCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfRlVMRlVMREUKLS0jIGRlZmluZSBMQU5HX0ZVTEZVTERFIDB4NjcKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19HQUVMSUMKLS0jIGRlZmluZSBMQU5HX0dBRUxJQyAweDNjCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfR0FMSUNJQU4KLS0jIGRlZmluZSBMQU5HX0dBTElDSUFOIDB4NTYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19HRU9SR0lBTgotLSMgZGVmaW5lIExBTkdfR0VPUkdJQU4gMHgzNwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0dVQVJBTkkKLS0jIGRlZmluZSBMQU5HX0dVQVJBTkkgMHg3NAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0dVSkFSQVRJCi0tIyBkZWZpbmUgTEFOR19HVUpBUkFUSSAweDQ3Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfSEFVU0EKLS0jIGRlZmluZSBMQU5HX0hBVVNBIDB4NjgKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19IQVdBSUlBTgotLSMgZGVmaW5lIExBTkdfSEFXQUlJQU4gMHg3NQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0hFQlJFVwotLSMgZGVmaW5lIExBTkdfSEVCUkVXIDB4MGQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19ISU5ESQotLSMgZGVmaW5lIExBTkdfSElOREkgMHgzOQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0lCSUJJTwotLSMgZGVmaW5lIExBTkdfSUJJQklPIDB4NjkKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19JR0JPCi0tIyBkZWZpbmUgTEFOR19JR0JPIDB4NzAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19JTkRPTkVTSUFOCi0tIyBkZWZpbmUgTEFOR19JTkRPTkVTSUFOIDB4MjEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19JTlVLVElUVVQKLS0jIGRlZmluZSBMQU5HX0lOVUtUSVRVVCAweDVkCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfS0FOTkFEQQotLSMgZGVmaW5lIExBTkdfS0FOTkFEQSAweDRiCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfS0FOVVJJCi0tIyBkZWZpbmUgTEFOR19LQU5VUkkgMHg3MQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0tBU0hNSVJJCi0tIyBkZWZpbmUgTEFOR19LQVNITUlSSSAweDYwCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfS0FaQUsKLS0jIGRlZmluZSBMQU5HX0tBWkFLIDB4M2YKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19LT05LQU5JCi0tIyBkZWZpbmUgTEFOR19LT05LQU5JIDB4NTcKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19LWVJHWVoKLS0jIGRlZmluZSBMQU5HX0tZUkdZWiAweDQwCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTEFPCi0tIyBkZWZpbmUgTEFOR19MQU8gMHg1NAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX0xBVElOCi0tIyBkZWZpbmUgTEFOR19MQVRJTiAweDc2Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTEFUVklBTgotLSMgZGVmaW5lIExBTkdfTEFUVklBTiAweDI2Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTElUSFVBTklBTgotLSMgZGVmaW5lIExBTkdfTElUSFVBTklBTiAweDI3Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTUFDRURPTklBTgotLSMgZGVmaW5lIExBTkdfTUFDRURPTklBTiAweDJmCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTUFMQVkKLS0jIGRlZmluZSBMQU5HX01BTEFZIDB4M2UKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19NQUxBWUFMQU0KLS0jIGRlZmluZSBMQU5HX01BTEFZQUxBTSAweDRjCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTUFMVEVTRQotLSMgZGVmaW5lIExBTkdfTUFMVEVTRSAweDNhCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTUFOSVBVUkkKLS0jIGRlZmluZSBMQU5HX01BTklQVVJJIDB4NTgKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19NQVJBVEhJCi0tIyBkZWZpbmUgTEFOR19NQVJBVEhJIDB4NGUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19NT05HT0xJQU4KLS0jIGRlZmluZSBMQU5HX01PTkdPTElBTiAweDUwCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfTkVQQUxJCi0tIyBkZWZpbmUgTEFOR19ORVBBTEkgMHg2MQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX09SSVlBCi0tIyBkZWZpbmUgTEFOR19PUklZQSAweDQ4Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfT1JPTU8KLS0jIGRlZmluZSBMQU5HX09ST01PIDB4NzIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19QQVBJQU1FTlRVCi0tIyBkZWZpbmUgTEFOR19QQVBJQU1FTlRVIDB4NzkKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19QQVNIVE8KLS0jIGRlZmluZSBMQU5HX1BBU0hUTyAweDYzCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfUFVOSkFCSQotLSMgZGVmaW5lIExBTkdfUFVOSkFCSSAweDQ2Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfUkhBRVRPX1JPTUFOQ0UKLS0jIGRlZmluZSBMQU5HX1JIQUVUT19ST01BTkNFIDB4MTcKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19TQUFNSQotLSMgZGVmaW5lIExBTkdfU0FBTUkgMHgzYgotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NBTlNLUklUCi0tIyBkZWZpbmUgTEFOR19TQU5TS1JJVCAweDRmCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU0VSQklBTgotLSMgZGVmaW5lIExBTkdfU0VSQklBTiAweDFhCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU0lOREhJCi0tIyBkZWZpbmUgTEFOR19TSU5ESEkgMHg1OQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NJTkhBTEVTRQotLSMgZGVmaW5lIExBTkdfU0lOSEFMRVNFIDB4NWIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19TTE9WQUsKLS0jIGRlZmluZSBMQU5HX1NMT1ZBSyAweDFiCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfU09NQUxJCi0tIyBkZWZpbmUgTEFOR19TT01BTEkgMHg3NwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NPUkJJQU4KLS0jIGRlZmluZSBMQU5HX1NPUkJJQU4gMHgyZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NVVFUKLS0jIGRlZmluZSBMQU5HX1NVVFUgMHgzMAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NXQUhJTEkKLS0jIGRlZmluZSBMQU5HX1NXQUhJTEkgMHg0MQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1NZUklBQwotLSMgZGVmaW5lIExBTkdfU1lSSUFDIDB4NWEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19UQUdBTE9HCi0tIyBkZWZpbmUgTEFOR19UQUdBTE9HIDB4NjQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19UQUpJSwotLSMgZGVmaW5lIExBTkdfVEFKSUsgMHgyOAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RBTUFaSUdIVAotLSMgZGVmaW5lIExBTkdfVEFNQVpJR0hUIDB4NWYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19UQU1JTAotLSMgZGVmaW5lIExBTkdfVEFNSUwgMHg0OQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RBVEFSCi0tIyBkZWZpbmUgTEFOR19UQVRBUiAweDQ0Ci0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVEVMVUdVCi0tIyBkZWZpbmUgTEFOR19URUxVR1UgMHg0YQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RIQUkKLS0jIGRlZmluZSBMQU5HX1RIQUkgMHgxZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RJQkVUQU4KLS0jIGRlZmluZSBMQU5HX1RJQkVUQU4gMHg1MQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RJR1JJTllBCi0tIyBkZWZpbmUgTEFOR19USUdSSU5ZQSAweDczCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVFNPTkdBCi0tIyBkZWZpbmUgTEFOR19UU09OR0EgMHgzMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1RTV0FOQQotLSMgZGVmaW5lIExBTkdfVFNXQU5BIDB4MzIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19UVVJLTUVOCi0tIyBkZWZpbmUgTEFOR19UVVJLTUVOIDB4NDIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19VS1JBSU5JQU4KLS0jIGRlZmluZSBMQU5HX1VLUkFJTklBTiAweDIyCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVVJEVQotLSMgZGVmaW5lIExBTkdfVVJEVSAweDIwCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfVVpCRUsKLS0jIGRlZmluZSBMQU5HX1VaQkVLIDB4NDMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19WRU5EQQotLSMgZGVmaW5lIExBTkdfVkVOREEgMHgzMwotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1ZJRVROQU1FU0UKLS0jIGRlZmluZSBMQU5HX1ZJRVROQU1FU0UgMHgyYQotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1dFTFNICi0tIyBkZWZpbmUgTEFOR19XRUxTSCAweDUyCi0tIyBlbmRpZgotLSMgaWZuZGVmIExBTkdfWEhPU0EKLS0jIGRlZmluZSBMQU5HX1hIT1NBIDB4MzQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19ZSQotLSMgZGVmaW5lIExBTkdfWUkgMHg3OAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1lJRERJU0gKLS0jIGRlZmluZSBMQU5HX1lJRERJU0ggMHgzZAotLSMgZW5kaWYKLS0jIGlmbmRlZiBMQU5HX1lPUlVCQQotLSMgZGVmaW5lIExBTkdfWU9SVUJBIDB4NmEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgTEFOR19aVUxVCi0tIyBkZWZpbmUgTEFOR19aVUxVIDB4MzUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBIDB4MDEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfSVJBUQotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0lSQVEgMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19FR1lQVAotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0VHWVBUIDB4MDMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfTElCWUEKLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19MSUJZQSAweDA0Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0FMR0VSSUEKLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19BTEdFUklBIDB4MDUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfTU9ST0NDTwotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX01PUk9DQ08gMHgwNgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfVFVOSVNJQSAweDA3Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX09NQU4KLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19PTUFOIDB4MDgKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfWUVNRU4KLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19ZRU1FTiAweDA5Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1NZUklBCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU1lSSUEgMHgwYQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19KT1JEQU4KLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19KT1JEQU4gMHgwYgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OCi0tIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTEVCQU5PTiAweDBjCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0tVV0FJVAotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0tVV0FJVCAweDBkCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1VBRQotLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1VBRSAweDBlCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0JBSFJBSU4KLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOIDB4MGYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfUUFUQVIKLS0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19RQVRBUiAweDEwCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfQVpFUklfTEFUSU4KLS0jIGRlZmluZSBTVUJMQU5HX0FaRVJJX0xBVElOIDB4MDEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19BWkVSSV9DWVJJTExJQwotLSMgZGVmaW5lIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMgMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0JFTkdBTElfSU5ESUEKLS0jIGRlZmluZSBTVUJMQU5HX0JFTkdBTElfSU5ESUEgMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0JFTkdBTElfQkFOR0xBREVTSAotLSMgZGVmaW5lIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIIDB4MDIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19DSElORVNFX01BQ0FVCi0tIyBkZWZpbmUgU1VCTEFOR19DSElORVNFX01BQ0FVIDB4MDUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQQotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EgMHgwNwotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQQotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBIDB4MDgKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0NBUklCQkVBTgotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4gMHgwOQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0JFTElaRSAweDBhCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRAotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCAweDBiCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRQotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRSAweDBjCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9QSElMSVBQSU5FUwotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9QSElMSVBQSU5FUyAweDBkCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9JTkRPTkVTSUEKLS0jIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBIDB4MGUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HIDB4MGYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0lORElBCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0lORElBIDB4MTAKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBCi0tIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBIDB4MTEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1NJTkdBUE9SRQotLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUgMHgxMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHCi0tIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRyAweDA1Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX01PTkFDTwotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PTkFDTyAweDA2Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1dFU1RJTkRJRVMKLS0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTIDB4MDcKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfUkVVTklPTgotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04gMHgwOAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9DT05HTwotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NPTkdPIDB4MDkKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfU0VORUdBTAotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwgMHgwYQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9DQU1FUk9PTgotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OIDB4MGIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ09URURJVk9JUkUKLS0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRSAweDBjCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX01BTEkKLS0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NQUxJIDB4MGQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTwotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08gMHgwZQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9IQUlUSQotLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0hBSVRJIDB4MGYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRwotLSMgZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcgMHgwNAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOCi0tIyBkZWZpbmUgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTiAweDA1Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfS0FTSE1JUklfSU5ESUEKLS0jIGRlZmluZSBTVUJMQU5HX0tBU0hNSVJJX0lORElBIDB4MDIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19NQUxBWV9NQUxBWVNJQQotLSMgZGVmaW5lIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEgMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNCi0tIyBkZWZpbmUgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfTkVQQUxJX0lORElBCi0tIyBkZWZpbmUgU1VCTEFOR19ORVBBTElfSU5ESUEgMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1BVTkpBQklfSU5ESUEKLS0jIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfSU5ESUEgMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU4KLS0jIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU4gMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUEKLS0jIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUEgMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkEKLS0jIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkEgMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NFUkJJQU5fTEFUSU4KLS0jIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU4gMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMKLS0jIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgMHgwMwotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTgotLSMgZGVmaW5lIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOIDB4MDEKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TSU5ESElfQUZHSEFOSVNUQU4KLS0jIGRlZmluZSBTVUJMQU5HX1NJTkRISV9BRkdIQU5JU1RBTiAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEEKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBIDB4MDQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0EKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQSAweDA1Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QQU5BTUEKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BIDB4MDYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQwotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgMHgwNwotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSAweDA4Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSAweDA5Ci0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QRVJVCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BFUlUgMHgwYQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSAweDBiCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IgMHgwYwotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUgMHgwZAotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWQotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZIDB4MGUKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZIDB4MGYKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQSAweDEwCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUgotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUiAweDExCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUwotLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUyAweDEyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUEKLS0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBIDB4MTMKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPCi0tIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPIDB4MTQKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQKLS0jIGRlZmluZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORCAweDAyCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQwotLSMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQyAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfVEFNQVpJR0hUX0FMR0VSSUFfTEFUSU4KLS0jIGRlZmluZSBTVUJMQU5HX1RBTUFaSUdIVF9BTEdFUklBX0xBVElOIDB4MDIKLS0jIGVuZGlmCi0tIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQQotLSMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEgMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEKLS0jIGRlZmluZSBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEgMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1VSRFVfUEFLSVNUQU4KLS0jIGRlZmluZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU4gMHgwMQotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1VSRFVfSU5ESUEKLS0jIGRlZmluZSBTVUJMQU5HX1VSRFVfSU5ESUEgMHgwMgotLSMgZW5kaWYKLS0jIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0xBVElOCi0tIyBkZWZpbmUgU1VCTEFOR19VWkJFS19MQVRJTiAweDAxCi0tIyBlbmRpZgotLSMgaWZuZGVmIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMKLS0jIGRlZmluZSBTVUJMQU5HX1VaQkVLX0NZUklMTElDIDB4MDIKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tIyBpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgfHwgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0tLyogTWFjT1MgWCAxMC4yIG9yIG5ld2VyICovCi0tCi0tLyogQ2Fub25pY2FsaXplIGEgTWFjT1MgWCBsb2NhbGUgbmFtZSB0byBhIFVuaXggbG9jYWxlIG5hbWUuCi0tICAgTkFNRSBpcyBhIHN1ZmZpY2llbnRseSBsYXJnZSBidWZmZXIuCi0tICAgT24gaW5wdXQsIGl0IGNvbnRhaW5zIHRoZSBNYWNPUyBYIGxvY2FsZSBuYW1lLgotLSAgIE9uIG91dHB1dCwgaXQgY29udGFpbnMgdGhlIFVuaXggbG9jYWxlIG5hbWUuICAqLwotLSMgIGlmICFkZWZpbmVkIElOX0xJQklOVEwKLS1zdGF0aWMKLS0jICBlbmRpZgotLXZvaWQKLS1nbF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKGNoYXIgKm5hbWUpCi0tewotLSAgLyogVGhpcyBjb252ZXJzaW9uIGlzIGJhc2VkIG9uIGEgcG9zdGluZyBieQotLSAgICAgRGVib3JhaCBHb2xkU21pdGggPGdvbGRzbWl0QGFwcGxlLmNvbT4gb24gMjAwNS0wMy0wOCwKLS0gICAgIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvY2FyYm9uLWRldi8yMDA1L01hci9tc2cwMDI5My5odG1sICovCi0tCi0tICAvKiBDb252ZXJ0IGxlZ2FjeSAoTmVYVHN0ZXAgaW5oZXJpdGVkKSBFbmdsaXNoIG5hbWVzIHRvIFVuaXggKElTTyA2MzkgYW5kCi0tICAgICBJU08gMzE2NikgbmFtZXMuICBQcmlvciB0byBNYWNPUyBYIDEwLjMsIHRoZXJlIGlzIG5vIEFQSSBmb3IgZG9pbmcgdGhpcy4KLS0gICAgIFRoZXJlZm9yZSB3ZSBkbyBpdCBvdXJzZWx2ZXMsIHVzaW5nIGEgdGFibGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlCi0tICAgICBNYWNPUyBYIDEwLjMuOCBmdW5jdGlvbgotLSAgICAgQ0ZMb2NhbGVDcmVhdGVDYW5vbmljYWxMb2NhbGVJZGVudGlmaWVyRnJvbVN0cmluZygpLiAgKi8KLS0gIHR5cGVkZWYgc3RydWN0IHsgY29uc3QgY2hhciBsZWdhY3lbMjErMV07IGNvbnN0IGNoYXIgdW5peHlbNSsxXTsgfQotLQkgIGxlZ2FjeV9lbnRyeTsKLS0gIHN0YXRpYyBjb25zdCBsZWdhY3lfZW50cnkgbGVnYWN5X3RhYmxlW10gPSB7Ci0tICAgIHsgIkFmcmlrYWFucyIsICAgICAgICAgICAgICJhZiIgfSwKLS0gICAgeyAiQWxiYW5pYW4iLCAgICAgICAgICAgICAgInNxIiB9LAotLSAgICB7ICJBbWhhcmljIiwgICAgICAgICAgICAgICAiYW0iIH0sCi0tICAgIHsgIkFyYWJpYyIsICAgICAgICAgICAgICAgICJhciIgfSwKLS0gICAgeyAiQXJtZW5pYW4iLCAgICAgICAgICAgICAgImh5IiB9LAotLSAgICB7ICJBc3NhbWVzZSIsICAgICAgICAgICAgICAiYXMiIH0sCi0tICAgIHsgIkF5bWFyYSIsICAgICAgICAgICAgICAgICJheSIgfSwKLS0gICAgeyAiQXplcmJhaWphbmkiLCAgICAgICAgICAgImF6IiB9LAotLSAgICB7ICJCYXNxdWUiLCAgICAgICAgICAgICAgICAiZXUiIH0sCi0tICAgIHsgIkJlbGFydXNpYW4iLCAgICAgICAgICAgICJiZSIgfSwKLS0gICAgeyAiQmVsb3J1c3NpYW4iLCAgICAgICAgICAgImJlIiB9LAotLSAgICB7ICJCZW5nYWxpIiwgICAgICAgICAgICAgICAiYm4iIH0sCi0tICAgIHsgIkJyYXppbGlhbiBQb3J0dWdlc2UiLCAgICJwdF9CUiIgfSwKLS0gICAgeyAiQnJhemlsaWFuIFBvcnR1Z3Vlc2UiLCAgInB0X0JSIiB9LAotLSAgICB7ICJCcmV0b24iLCAgICAgICAgICAgICAgICAiYnIiIH0sCi0tICAgIHsgIkJ1bGdhcmlhbiIsICAgICAgICAgICAgICJiZyIgfSwKLS0gICAgeyAiQnVybWVzZSIsICAgICAgICAgICAgICAgIm15IiB9LAotLSAgICB7ICJCeWVsb3J1c3NpYW4iLCAgICAgICAgICAiYmUiIH0sCi0tICAgIHsgIkNhdGFsYW4iLCAgICAgICAgICAgICAgICJjYSIgfSwKLS0gICAgeyAiQ2hld2EiLCAgICAgICAgICAgICAgICAgIm55IiB9LAotLSAgICB7ICJDaGljaGV3YSIsICAgICAgICAgICAgICAibnkiIH0sCi0tICAgIHsgIkNoaW5lc2UiLCAgICAgICAgICAgICAgICJ6aCIgfSwKLS0gICAgeyAiQ2hpbmVzZSwgU2ltcGxpZmllZCIsICAgInpoX0NOIiB9LAotLSAgICB7ICJDaGluZXNlLCBUcmFkaXRpb25hbCIsICAiemhfVFciIH0sCi0tICAgIHsgIkNoaW5lc2UsIFRyYWR0aW9uYWwiLCAgICJ6aF9UVyIgfSwKLS0gICAgeyAiQ3JvYXRpYW4iLCAgICAgICAgICAgICAgImhyIiB9LAotLSAgICB7ICJDemVjaCIsICAgICAgICAgICAgICAgICAiY3MiIH0sCi0tICAgIHsgIkRhbmlzaCIsICAgICAgICAgICAgICAgICJkYSIgfSwKLS0gICAgeyAiRHV0Y2giLCAgICAgICAgICAgICAgICAgIm5sIiB9LAotLSAgICB7ICJEem9uZ2toYSIsICAgICAgICAgICAgICAiZHoiIH0sCi0tICAgIHsgIkVuZ2xpc2giLCAgICAgICAgICAgICAgICJlbiIgfSwKLS0gICAgeyAiRXNwZXJhbnRvIiwgICAgICAgICAgICAgImVvIiB9LAotLSAgICB7ICJFc3RvbmlhbiIsICAgICAgICAgICAgICAiZXQiIH0sCi0tICAgIHsgIkZhcm9lc2UiLCAgICAgICAgICAgICAgICJmbyIgfSwKLS0gICAgeyAiRmFyc2kiLCAgICAgICAgICAgICAgICAgImZhIiB9LAotLSAgICB7ICJGaW5uaXNoIiwgICAgICAgICAgICAgICAiZmkiIH0sCi0tICAgIHsgIkZsZW1pc2giLCAgICAgICAgICAgICAgICJubF9CRSIgfSwKLS0gICAgeyAiRnJlbmNoIiwgICAgICAgICAgICAgICAgImZyIiB9LAotLSAgICB7ICJHYWxpY2lhbiIsICAgICAgICAgICAgICAiZ2wiIH0sCi0tICAgIHsgIkdhbGxlZ2FuIiwgICAgICAgICAgICAgICJnbCIgfSwKLS0gICAgeyAiR2VvcmdpYW4iLCAgICAgICAgICAgICAgImthIiB9LAotLSAgICB7ICJHZXJtYW4iLCAgICAgICAgICAgICAgICAiZGUiIH0sCi0tICAgIHsgIkdyZWVrIiwgICAgICAgICAgICAgICAgICJlbCIgfSwKLS0gICAgeyAiR3JlZW5sYW5kaWMiLCAgICAgICAgICAgImtsIiB9LAotLSAgICB7ICJHdWFyYW5pIiwgICAgICAgICAgICAgICAiZ24iIH0sCi0tICAgIHsgIkd1amFyYXRpIiwgICAgICAgICAgICAgICJndSIgfSwKLS0gICAgeyAiSGF3YWlpYW4iLCAgICAgICAgICAgICAgImhhdyIgfSwgLyogWWVzLCAiaGF3Iiwgbm90ICJjcGUiLiAgKi8KLS0gICAgeyAiSGVicmV3IiwgICAgICAgICAgICAgICAgImhlIiB9LAotLSAgICB7ICJIaW5kaSIsICAgICAgICAgICAgICAgICAiaGkiIH0sCi0tICAgIHsgIkh1bmdhcmlhbiIsICAgICAgICAgICAgICJodSIgfSwKLS0gICAgeyAiSWNlbGFuZGljIiwgICAgICAgICAgICAgImlzIiB9LAotLSAgICB7ICJJbmRvbmVzaWFuIiwgICAgICAgICAgICAiaWQiIH0sCi0tICAgIHsgIkludWt0aXR1dCIsICAgICAgICAgICAgICJpdSIgfSwKLS0gICAgeyAiSXJpc2giLCAgICAgICAgICAgICAgICAgImdhIiB9LAotLSAgICB7ICJJdGFsaWFuIiwgICAgICAgICAgICAgICAiaXQiIH0sCi0tICAgIHsgIkphcGFuZXNlIiwgICAgICAgICAgICAgICJqYSIgfSwKLS0gICAgeyAiSmF2YW5lc2UiLCAgICAgICAgICAgICAgImp2IiB9LAotLSAgICB7ICJLYWxhYWxsaXN1dCIsICAgICAgICAgICAia2wiIH0sCi0tICAgIHsgIkthbm5hZGEiLCAgICAgICAgICAgICAgICJrbiIgfSwKLS0gICAgeyAiS2FzaG1pcmkiLCAgICAgICAgICAgICAgImtzIiB9LAotLSAgICB7ICJLYXpha2giLCAgICAgICAgICAgICAgICAia2siIH0sCi0tICAgIHsgIktobWVyIiwgICAgICAgICAgICAgICAgICJrbSIgfSwKLS0gICAgeyAiS2lueWFyd2FuZGEiLCAgICAgICAgICAgInJ3IiB9LAotLSAgICB7ICJLaXJnaGl6IiwgICAgICAgICAgICAgICAia3kiIH0sCi0tICAgIHsgIktvcmVhbiIsICAgICAgICAgICAgICAgICJrbyIgfSwKLS0gICAgeyAiS3VyZGlzaCIsICAgICAgICAgICAgICAgImt1IiB9LAotLSAgICB7ICJMYXRpbiIsICAgICAgICAgICAgICAgICAibGEiIH0sCi0tICAgIHsgIkxhdHZpYW4iLCAgICAgICAgICAgICAgICJsdiIgfSwKLS0gICAgeyAiTGl0aHVhbmlhbiIsICAgICAgICAgICAgImx0IiB9LAotLSAgICB7ICJNYWNlZG9uaWFuIiwgICAgICAgICAgICAibWsiIH0sCi0tICAgIHsgIk1hbGFnYXN5IiwgICAgICAgICAgICAgICJtZyIgfSwKLS0gICAgeyAiTWFsYXkiLCAgICAgICAgICAgICAgICAgIm1zIiB9LAotLSAgICB7ICJNYWxheWFsYW0iLCAgICAgICAgICAgICAibWwiIH0sCi0tICAgIHsgIk1hbHRlc2UiLCAgICAgICAgICAgICAgICJtdCIgfSwKLS0gICAgeyAiTWFueCIsICAgICAgICAgICAgICAgICAgImd2IiB9LAotLSAgICB7ICJNYXJhdGhpIiwgICAgICAgICAgICAgICAibXIiIH0sCi0tICAgIHsgIk1vbGRhdmlhbiIsICAgICAgICAgICAgICJtbyIgfSwKLS0gICAgeyAiTW9uZ29saWFuIiwgICAgICAgICAgICAgIm1uIiB9LAotLSAgICB7ICJOZXBhbGkiLCAgICAgICAgICAgICAgICAibmUiIH0sCi0tICAgIHsgIk5vcndlZ2lhbiIsICAgICAgICAgICAgICJuYiIgfSwgLyogWWVzLCAibmIiLCBub3QgdGhlIG9ic29sZXRlICJubyIuICAqLwotLSAgICB7ICJOeWFuamEiLCAgICAgICAgICAgICAgICAibnkiIH0sCi0tICAgIHsgIk55bm9yc2siLCAgICAgICAgICAgICAgICJubiIgfSwKLS0gICAgeyAiT3JpeWEiLCAgICAgICAgICAgICAgICAgIm9yIiB9LAotLSAgICB7ICJPcm9tbyIsICAgICAgICAgICAgICAgICAib20iIH0sCi0tICAgIHsgIlBhbmphYmkiLCAgICAgICAgICAgICAgICJwYSIgfSwKLS0gICAgeyAiUGFzaHRvIiwgICAgICAgICAgICAgICAgInBzIiB9LAotLSAgICB7ICJQZXJzaWFuIiwgICAgICAgICAgICAgICAiZmEiIH0sCi0tICAgIHsgIlBvbGlzaCIsICAgICAgICAgICAgICAgICJwbCIgfSwKLS0gICAgeyAiUG9ydHVndWVzZSIsICAgICAgICAgICAgInB0IiB9LAotLSAgICB7ICJQb3J0dWd1ZXNlLCBCcmF6aWxpYW4iLCAicHRfQlIiIH0sCi0tICAgIHsgIlB1bmphYmkiLCAgICAgICAgICAgICAgICJwYSIgfSwKLS0gICAgeyAiUHVzaHRvIiwgICAgICAgICAgICAgICAgInBzIiB9LAotLSAgICB7ICJRdWVjaHVhIiwgICAgICAgICAgICAgICAicXUiIH0sCi0tICAgIHsgIlJvbWFuaWFuIiwgICAgICAgICAgICAgICJybyIgfSwKLS0gICAgeyAiUnVhbmRhIiwgICAgICAgICAgICAgICAgInJ3IiB9LAotLSAgICB7ICJSdW5kaSIsICAgICAgICAgICAgICAgICAicm4iIH0sCi0tICAgIHsgIlJ1c3NpYW4iLCAgICAgICAgICAgICAgICJydSIgfSwKLS0gICAgeyAiU2FtaSIsICAgICAgICAgICAgICAgICAgInNlX05PIiB9LCAvKiBOb3QganVzdCAic2UiLiAgKi8KLS0gICAgeyAiU2Fuc2tyaXQiLCAgICAgICAgICAgICAgInNhIiB9LAotLSAgICB7ICJTY290dGlzaCIsICAgICAgICAgICAgICAiZ2QiIH0sCi0tICAgIHsgIlNlcmJpYW4iLCAgICAgICAgICAgICAgICJzciIgfSwKLS0gICAgeyAiU2ltcGxpZmllZCBDaGluZXNlIiwgICAgInpoX0NOIiB9LAotLSAgICB7ICJTaW5kaGkiLCAgICAgICAgICAgICAgICAic2QiIH0sCi0tICAgIHsgIlNpbmhhbGVzZSIsICAgICAgICAgICAgICJzaSIgfSwKLS0gICAgeyAiU2xvdmFrIiwgICAgICAgICAgICAgICAgInNrIiB9LAotLSAgICB7ICJTbG92ZW5pYW4iLCAgICAgICAgICAgICAic2wiIH0sCi0tICAgIHsgIlNvbWFsaSIsICAgICAgICAgICAgICAgICJzbyIgfSwKLS0gICAgeyAiU3BhbmlzaCIsICAgICAgICAgICAgICAgImVzIiB9LAotLSAgICB7ICJTdW5kYW5lc2UiLCAgICAgICAgICAgICAic3UiIH0sCi0tICAgIHsgIlN3YWhpbGkiLCAgICAgICAgICAgICAgICJzdyIgfSwKLS0gICAgeyAiU3dlZGlzaCIsICAgICAgICAgICAgICAgInN2IiB9LAotLSAgICB7ICJUYWdhbG9nIiwgICAgICAgICAgICAgICAidGwiIH0sCi0tICAgIHsgIlRhamlrIiwgICAgICAgICAgICAgICAgICJ0ZyIgfSwKLS0gICAgeyAiVGFqaWtpIiwgICAgICAgICAgICAgICAgInRnIiB9LAotLSAgICB7ICJUYW1pbCIsICAgICAgICAgICAgICAgICAidGEiIH0sCi0tICAgIHsgIlRhdGFyIiwgICAgICAgICAgICAgICAgICJ0dCIgfSwKLS0gICAgeyAiVGVsdWd1IiwgICAgICAgICAgICAgICAgInRlIiB9LAotLSAgICB7ICJUaGFpIiwgICAgICAgICAgICAgICAgICAidGgiIH0sCi0tICAgIHsgIlRpYmV0YW4iLCAgICAgICAgICAgICAgICJibyIgfSwKLS0gICAgeyAiVGlncmlueWEiLCAgICAgICAgICAgICAgInRpIiB9LAotLSAgICB7ICJUb25nYW4iLCAgICAgICAgICAgICAgICAidG8iIH0sCi0tICAgIHsgIlRyYWRpdGlvbmFsIENoaW5lc2UiLCAgICJ6aF9UVyIgfSwKLS0gICAgeyAiVHVya2lzaCIsICAgICAgICAgICAgICAgInRyIiB9LAotLSAgICB7ICJUdXJrbWVuIiwgICAgICAgICAgICAgICAidGsiIH0sCi0tICAgIHsgIlVpZ2h1ciIsICAgICAgICAgICAgICAgICJ1ZyIgfSwKLS0gICAgeyAiVWtyYWluaWFuIiwgICAgICAgICAgICAgInVrIiB9LAotLSAgICB7ICJVcmR1IiwgICAgICAgICAgICAgICAgICAidXIiIH0sCi0tICAgIHsgIlV6YmVrIiwgICAgICAgICAgICAgICAgICJ1eiIgfSwKLS0gICAgeyAiVmlldG5hbWVzZSIsICAgICAgICAgICAgInZpIiB9LAotLSAgICB7ICJXZWxzaCIsICAgICAgICAgICAgICAgICAiY3kiIH0sCi0tICAgIHsgIllpZGRpc2giLCAgICAgICAgICAgICAgICJ5aSIgfQotLSAgfTsKLS0KLS0gIC8qIENvbnZlcnQgbmV3LXN0eWxlIGxvY2FsZSBuYW1lcyB3aXRoIGxhbmd1YWdlIHRhZ3MgKElTTyA2MzkgYW5kIElTTyAxNTkyNCkKLS0gICAgIHRvIFVuaXggKElTTyA2MzkgYW5kIElTTyAzMTY2KSBuYW1lcy4gICovCi0tICB0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGNoYXIgbGFuZ3RhZ1s3KzFdOyBjb25zdCBjaGFyIHVuaXh5WzEyKzFdOyB9Ci0tCSAgbGFuZ3RhZ19lbnRyeTsKLS0gIHN0YXRpYyBjb25zdCBsYW5ndGFnX2VudHJ5IGxhbmd0YWdfdGFibGVbXSA9IHsKLS0gICAgLyogTWFjT1MgWCBoYXMgImF6LUFyYWIiLCAiYXotQ3lybCIsICJhei1MYXRuIi4KLS0gICAgICAgVGhlIGRlZmF1bHQgc2NyaXB0IGZvciBheiBvbiBVbml4IGlzIExhdGluLiAgKi8KLS0gICAgeyAiYXotTGF0biIsICJheiIgfSwKLS0gICAgLyogTWFjT1MgWCBoYXMgImdhLWRvdHMiLiAgRG9lcyBub3QgeWV0IGV4aXN0IG9uIFVuaXguICAqLwotLSAgICB7ICJnYS1kb3RzIiwgImdhIiB9LAotLSAgICAvKiBNYWNPUyBYIGhhcyAia2stQ3lybCIuICBEb2VzIG5vdCB5ZXQgZXhpc3Qgb24gVW5peC4gICovCi0tICAgIC8qIE1hY09TIFggaGFzICJtbi1DeXJsIiwgIm1uLU1vbmciLgotLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIG1uIG9uIFVuaXggaXMgQ3lyaWxsaWMuICAqLwotLSAgICB7ICJtbi1DeXJsIiwgIm1uIiB9LAotLSAgICAvKiBNYWNPUyBYIGhhcyAibXMtQXJhYiIsICJtcy1MYXRuIi4KLS0gICAgICAgVGhlIGRlZmF1bHQgc2NyaXB0IGZvciBtcyBvbiBVbml4IGlzIExhdGluLiAgKi8KLS0gICAgeyAibXMtTGF0biIsICJtcyIgfSwKLS0gICAgLyogTWFjT1MgWCBoYXMgInRnLUN5cmwiLgotLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIHRnIG9uIFVuaXggaXMgQ3lyaWxsaWMuICAqLwotLSAgICB7ICJ0Zy1DeXJsIiwgInRnIiB9LAotLSAgICAvKiBNYWNPUyBYIGhhcyAidGstQ3lybCIuICBEb2VzIG5vdCB5ZXQgZXhpc3Qgb24gVW5peC4gICovCi0tICAgIC8qIE1hY09TIFggaGFzICJ0dC1DeXJsIi4KLS0gICAgICAgVGhlIGRlZmF1bHQgc2NyaXB0IGZvciB0dCBvbiBVbml4IGlzIEN5cmlsbGljLiAgKi8KLS0gICAgeyAidHQtQ3lybCIsICJ0dCIgfSwKLS0gICAgLyogTWFjT1MgWCBoYXMgInpoLUhhbnMiLCAiemgtSGFudCIuCi0tICAgICAgIENvdW50cnkgY29kZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2Ugb24gVW5peC4gICovCi0tICAgIHsgInpoLUhhbnMiLCAiemhfQ04iIH0sCi0tICAgIHsgInpoLUhhbnQiLCAiemhfVFciIH0KLS0gIH07Ci0tCi0tICAvKiBDb252ZXJ0IHNjcmlwdCBuYW1lcyAoSVNPIDE1OTI0KSB0byBVbml4IGNvbnZlbnRpb25zLgotLSAgICAgU2VlIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvaXNvMTU5MjQvaXNvMTU5MjQtY29kZXMuaHRtbCAgKi8KLS0gIHR5cGVkZWYgc3RydWN0IHsgY29uc3QgY2hhciBzY3JpcHRbNCsxXTsgY29uc3QgY2hhciB1bml4eVs5KzFdOyB9Ci0tCSAgc2NyaXB0X2VudHJ5OwotLSAgc3RhdGljIGNvbnN0IHNjcmlwdF9lbnRyeSBzY3JpcHRfdGFibGVbXSA9IHsKLS0gICAgeyAiQXJhYiIsICJhcmFiaWMiIH0sCi0tICAgIHsgIkN5cmwiLCAiY3lyaWxsaWMiIH0sCi0tICAgIHsgIk1vbmciLCAibW9uZ29saWFuIiB9Ci0tICB9OwotLQotLSAgLyogU3RlcCAxOiBDb252ZXJ0IHVzaW5nIGxlZ2FjeV90YWJsZS4gICovCi0tICBpZiAobmFtZVswXSA+PSAnQScgJiYgbmFtZVswXSA8PSAnWicpCi0tICAgIHsKLS0gICAgICB1bnNpZ25lZCBpbnQgaTEsIGkyOwotLSAgICAgIGkxID0gMDsKLS0gICAgICBpMiA9IHNpemVvZiAobGVnYWN5X3RhYmxlKSAvIHNpemVvZiAobGVnYWN5X2VudHJ5KTsKLS0gICAgICB3aGlsZSAoaTIgLSBpMSA+IDEpCi0tCXsKLS0JICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBpZiBuYW1lIG9jY3VycyBpbiBsZWdhY3lfdGFibGUsCi0tCSAgICAgaXRzIGluZGV4IG11c3QgYmUgPj0gaTEgYW5kIDwgaTIuICAqLwotLQkgIHVuc2lnbmVkIGludCBpID0gKGkxICsgaTIpID4+IDE7Ci0tCSAgY29uc3QgbGVnYWN5X2VudHJ5ICpwID0gJmxlZ2FjeV90YWJsZVtpXTsKLS0JICBpZiAoc3RyY21wIChuYW1lLCBwLT5sZWdhY3kpIDwgMCkKLS0JICAgIGkyID0gaTsKLS0JICBlbHNlCi0tCSAgICBpMSA9IGk7Ci0tCX0KLS0gICAgICBpZiAoc3RyY21wIChuYW1lLCBsZWdhY3lfdGFibGVbaTFdLmxlZ2FjeSkgPT0gMCkKLS0JewotLQkgIHN0cmNweSAobmFtZSwgbGVnYWN5X3RhYmxlW2kxXS51bml4eSk7Ci0tCSAgcmV0dXJuOwotLQl9Ci0tICAgIH0KLS0KLS0gIC8qIFN0ZXAgMjogQ29udmVydCB1c2luZyBsYW5ndGFnX3RhYmxlIGFuZCBzY3JpcHRfdGFibGUuICAqLwotLSAgaWYgKHN0cmxlbiAobmFtZSkgPT0gNyAmJiBuYW1lWzJdID09ICctJykKLS0gICAgewotLSAgICAgIHVuc2lnbmVkIGludCBpMSwgaTI7Ci0tICAgICAgaTEgPSAwOwotLSAgICAgIGkyID0gc2l6ZW9mIChsYW5ndGFnX3RhYmxlKSAvIHNpemVvZiAobGFuZ3RhZ19lbnRyeSk7Ci0tICAgICAgd2hpbGUgKGkyIC0gaTEgPiAxKQotLQl7Ci0tCSAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgaWYgbmFtZSBvY2N1cnMgaW4gbGFuZ3RhZ190YWJsZSwKLS0JICAgICBpdHMgaW5kZXggbXVzdCBiZSA+PSBpMSBhbmQgPCBpMi4gICovCi0tCSAgdW5zaWduZWQgaW50IGkgPSAoaTEgKyBpMikgPj4gMTsKLS0JICBjb25zdCBsYW5ndGFnX2VudHJ5ICpwID0gJmxhbmd0YWdfdGFibGVbaV07Ci0tCSAgaWYgKHN0cmNtcCAobmFtZSwgcC0+bGFuZ3RhZykgPCAwKQotLQkgICAgaTIgPSBpOwotLQkgIGVsc2UKLS0JICAgIGkxID0gaTsKLS0JfQotLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGxhbmd0YWdfdGFibGVbaTFdLmxhbmd0YWcpID09IDApCi0tCXsKLS0JICBzdHJjcHkgKG5hbWUsIGxhbmd0YWdfdGFibGVbaTFdLnVuaXh5KTsKLS0JICByZXR1cm47Ci0tCX0KLS0KLS0gICAgICBpMSA9IDA7Ci0tICAgICAgaTIgPSBzaXplb2YgKHNjcmlwdF90YWJsZSkgLyBzaXplb2YgKHNjcmlwdF9lbnRyeSk7Ci0tICAgICAgd2hpbGUgKGkyIC0gaTEgPiAxKQotLQl7Ci0tCSAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgaWYgKG5hbWUgKyAzKSBvY2N1cnMgaW4gc2NyaXB0X3RhYmxlLAotLQkgICAgIGl0cyBpbmRleCBtdXN0IGJlID49IGkxIGFuZCA8IGkyLiAgKi8KLS0JICB1bnNpZ25lZCBpbnQgaSA9IChpMSArIGkyKSA+PiAxOwotLQkgIGNvbnN0IHNjcmlwdF9lbnRyeSAqcCA9ICZzY3JpcHRfdGFibGVbaV07Ci0tCSAgaWYgKHN0cmNtcCAobmFtZSArIDMsIHAtPnNjcmlwdCkgPCAwKQotLQkgICAgaTIgPSBpOwotLQkgIGVsc2UKLS0JICAgIGkxID0gaTsKLS0JfQotLSAgICAgIGlmIChzdHJjbXAgKG5hbWUgKyAzLCBzY3JpcHRfdGFibGVbaTFdLnNjcmlwdCkgPT0gMCkKLS0JewotLQkgIG5hbWVbMl0gPSAnQCc7Ci0tCSAgc3RyY3B5IChuYW1lICsgMywgc2NyaXB0X3RhYmxlW2kxXS51bml4eSk7Ci0tCSAgcmV0dXJuOwotLQl9Ci0tICAgIH0KLS0KLS0gIC8qIFN0ZXAgMzogQ29udmVydCBuZXctc3R5bGUgZGFzaCB0byBVbml4IHVuZGVyc2NvcmUuICovCi0tICB7Ci0tICAgIGNoYXIgKnA7Ci0tICAgIGZvciAocCA9IG5hbWU7ICpwICE9ICdcMCc7IHArKykKLS0gICAgICBpZiAoKnAgPT0gJy0nKQotLQkqcCA9ICdfJzsKLS0gIH0KLS19Ci0tCi0tI2VuZGlmCi0tCi0tLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgJ3NldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKLS0gICAiRGlyZWN0cyAnc2V0bG9jYWxlKCknIHRvIHF1ZXJ5ICdjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotLSAgICBzZXR0aW5nIG9mICdsb2NhbCcuIgotLSAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgTmVpdGhlciBkbyBTVVNWMiBhbmQKLS0gICBJU08gQyA5OS4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQgc3lzdGVtcyAoZS5nLgotLSAgIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KLS0jaWYgZGVmaW5lZCBfTElCQyB8fCAoZGVmaW5lZCBfX0dMSUJDX18gJiYgX19HTElCQ19fID49IDIpCi0tIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotLSNlbmRpZgotLQotLS8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBuYW1lLCBhbmQgY2Fub25pY2FsaXplIGl0IGludG8gWFBHIHN5bnRheAotLSAgICAgbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bLmNvZGVzZXRdW0Btb2RpZmllcl0KLS0gICBUaGUgY29kZXNldCBwYXJ0IGluIHRoZSByZXN1bHQgaXMgbm90IHJlbGlhYmxlOyB0aGUgbG9jYWxlX2NoYXJzZXQoKQotLSAgIHNob3VsZCBiZSB1c2VkIGZvciBjb2Rlc2V0IGluZm9ybWF0aW9uIGluc3RlYWQuCi0tICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuICAqLwotLQotLWNvbnN0IGNoYXIgKgotLWdsX2xvY2FsZV9uYW1lX3Bvc2l4IChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKLS17Ci0tICAvKiBVc2UgdGhlIFBPU0lYIG1ldGhvZHMgb2YgbG9va2luZyB0byAnTENfQUxMJywgJ0xDX3h4eCcsIGFuZCAnTEFORycuCi0tICAgICBPbiBzb21lIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgJ3NldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLS0jaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCi0tICByZXR1cm4gc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCk7Ci0tI2Vsc2UKLS0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLS0KLS0gIC8qIFNldHRpbmcgb2YgTENfQUxMIG92ZXJyaWRlcyBhbGwgb3RoZXIuICAqLwotLSAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7Ci0tICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0tICAgIHJldHVybiByZXR2YWw7Ci0tICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KLS0gIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKLS0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLS0gICAgcmV0dXJuIHJldHZhbDsKLS0gIC8qIExhc3QgcG9zc2liaWxpdHkgaXMgdGhlIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwotLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOwotLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotLSAgICByZXR1cm4gcmV0dmFsOwotLQotLSAgcmV0dXJuIE5VTEw7Ci0tI2VuZGlmCi0tfQotLQotLWNvbnN0IGNoYXIgKgotLWdsX2xvY2FsZV9uYW1lX2RlZmF1bHQgKHZvaWQpCi0tewotLSAgLyogUE9TSVg6MjAwMSBzYXlzOgotLSAgICAgIkFsbCBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgZGVmaW5lIGEgbG9jYWxlIGFzIHRoZSBkZWZhdWx0IGxvY2FsZSwgdG8gYmUKLS0gICAgICBpbnZva2VkIHdoZW4gbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQsIG9yIHNldCB0byB0aGUgZW1wdHkKLS0gICAgICBzdHJpbmcuICBUaGlzIGRlZmF1bHQgbG9jYWxlIGNhbiBiZSB0aGUgUE9TSVggbG9jYWxlIG9yIGFueSBvdGhlcgotLSAgICAgIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbG9jYWxlLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUKLS0gICAgICBmYWNpbGl0aWVzIGZvciBsb2NhbCBpbnN0YWxsYXRpb24gYWRtaW5pc3RyYXRvcnMgdG8gc2V0IHRoZSBkZWZhdWx0Ci0tICAgICAgbG9jYWxlLCBjdXN0b21pemluZyBpdCBmb3IgZWFjaCBsb2NhdGlvbi4gIFBPU0lYOjIwMDEgZG9lcyBub3QgcmVxdWlyZQotLSAgICAgIHN1Y2ggYSBmYWNpbGl0eS4gICovCi0tCi0tI2lmICEoSEFWRV9DRkxPQ0FMRUNPUFlDVVJSRU5UIHx8IEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRSB8fCBkZWZpbmVkKFdJTjMyX05BVElWRSkpCi0tCi0tICAvKiBUaGUgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSB3YXkgb2Ygc2V0dGluZyB0aGUgbG9jYWxlLCBvdGhlciB0aGFuIHRoZQotLSAgICAgUE9TSVggc3BlY2lmaWVkIGVudmlyb25tZW50IHZhcmlhYmxlcy4gIFdlIHVzZSBDIGFzIGRlZmF1bHQgbG9jYWxlLiAgKi8KLS0gIHJldHVybiAiQyI7Ci0tCi0tI2Vsc2UKLS0KLS0gIC8qIFJldHVybiBhbiBYUEcgc3R5bGUgbG9jYWxlIG5hbWUgbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bQG1vZGlmaWVyXS4KLS0gICAgIERvbid0IGV2ZW4gYm90aGVyIGRldGVybWluaW5nIHRoZSBjb2Rlc2V0OyBpdCdzIG5vdCB1c2VmdWwgaW4gdGhpcwotLSAgICAgY29udGV4dCwgYmVjYXVzZSBtZXNzYWdlIGNhdGFsb2dzIGFyZSBub3Qgc3BlY2lmaWMgdG8gYSBzaW5nbGUKLS0gICAgIGNvZGVzZXQuICAqLwotLQotLSMgaWYgSEFWRV9DRkxPQ0FMRUNPUFlDVVJSRU5UIHx8IEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRQotLSAgLyogTWFjT1MgWCAxMC4yIG9yIG5ld2VyICovCi0tICB7Ci0tICAgIC8qIENhY2hlIHRoZSBsb2NhbGUgbmFtZSwgc2luY2UgQ29yZUZvdW5kYXRpb24gY2FsbHMgYXJlIGV4cGVuc2l2ZS4gICovCi0tICAgIHN0YXRpYyBjb25zdCBjaGFyICpjYWNoZWRfbG9jYWxlbmFtZTsKLS0KLS0gICAgaWYgKGNhY2hlZF9sb2NhbGVuYW1lID09IE5VTEwpCi0tICAgICAgewotLQljaGFyIG5hbWVidWZbMjU2XTsKLS0jICBpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgLyogTWFjT1MgWCAxMC4zIG9yIG5ld2VyICovCi0tCUNGTG9jYWxlUmVmIGxvY2FsZSA9IENGTG9jYWxlQ29weUN1cnJlbnQgKCk7Ci0tCUNGU3RyaW5nUmVmIG5hbWUgPSBDRkxvY2FsZUdldElkZW50aWZpZXIgKGxvY2FsZSk7Ci0tCi0tCWlmIChDRlN0cmluZ0dldENTdHJpbmcgKG5hbWUsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSwKLS0JCQkJa0NGU3RyaW5nRW5jb2RpbmdBU0NJSSkpCi0tCSAgewotLQkgICAgZ2xfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplIChuYW1lYnVmKTsKLS0JICAgIGNhY2hlZF9sb2NhbGVuYW1lID0gc3RyZHVwIChuYW1lYnVmKTsKLS0JICB9Ci0tCUNGUmVsZWFzZSAobG9jYWxlKTsKLS0jICBlbGlmIEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRSAvKiBNYWNPUyBYIDEwLjIgb3IgbmV3ZXIgKi8KLS0JQ0ZUeXBlUmVmIHZhbHVlID0KLS0JICBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIChDRlNUUiAoIkFwcGxlTG9jYWxlIiksCi0tCQkJCSAgICAga0NGUHJlZmVyZW5jZXNDdXJyZW50QXBwbGljYXRpb24pOwotLQlpZiAodmFsdWUgIT0gTlVMTAotLQkgICAgJiYgQ0ZHZXRUeXBlSUQgKHZhbHVlKSA9PSBDRlN0cmluZ0dldFR5cGVJRCAoKQotLQkgICAgJiYgQ0ZTdHJpbmdHZXRDU3RyaW5nICgoQ0ZTdHJpbmdSZWYpdmFsdWUsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSwKLS0JCQkJICAga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSkpCi0tCSAgewotLQkgICAgZ2xfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplIChuYW1lYnVmKTsKLS0JICAgIGNhY2hlZF9sb2NhbGVuYW1lID0gc3RyZHVwIChuYW1lYnVmKTsKLS0JICB9Ci0tIyAgZW5kaWYKLS0JaWYgKGNhY2hlZF9sb2NhbGVuYW1lID09IE5VTEwpCi0tCSAgY2FjaGVkX2xvY2FsZW5hbWUgPSAiQyI7Ci0tICAgICAgfQotLSAgICByZXR1cm4gY2FjaGVkX2xvY2FsZW5hbWU7Ci0tICB9Ci0tCi0tIyBlbmRpZgotLQotLSMgaWYgZGVmaW5lZChXSU4zMl9OQVRJVkUpIC8qIFdJTjMyLCBub3QgQ3lnd2luICovCi0tICB7Ci0tICAgIExDSUQgbGNpZDsKLS0gICAgTEFOR0lEIGxhbmdpZDsKLS0gICAgaW50IHByaW1hcnksIHN1YjsKLS0KLS0gICAgLyogVXNlIG5hdGl2ZSBXaW4zMiBBUEkgbG9jYWxlIElELiAgKi8KLS0gICAgbGNpZCA9IEdldFRocmVhZExvY2FsZSAoKTsKLS0KLS0gICAgLyogU3RyaXAgb2ZmIHRoZSBzb3J0aW5nIHJ1bGVzLCBrZWVwIG9ubHkgdGhlIGxhbmd1YWdlIHBhcnQuICAqLwotLSAgICBsYW5naWQgPSBMQU5HSURGUk9NTENJRCAobGNpZCk7Ci0tCi0tICAgIC8qIFNwbGl0IGludG8gbGFuZ3VhZ2UgYW5kIHRlcnJpdG9yeSBwYXJ0LiAgKi8KLS0gICAgcHJpbWFyeSA9IFBSSU1BUllMQU5HSUQgKGxhbmdpZCk7Ci0tICAgIHN1YiA9IFNVQkxBTkdJRCAobGFuZ2lkKTsKLS0KLS0gICAgLyogRGlzcGF0Y2ggb24gbGFuZ3VhZ2UuCi0tICAgICAgIFNlZSBhbHNvIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9vbmxpbmVkYXQvbGFuZ3VhZ2VzLmh0bWwgLgotLSAgICAgICBGb3IgZGV0YWlscyBhYm91dCBsYW5ndWFnZXMsIHNlZSBodHRwOi8vd3d3LmV0aG5vbG9ndWUuY29tLyAuICAqLwotLSAgICBzd2l0Y2ggKHByaW1hcnkpCi0tICAgICAgewotLSAgICAgIGNhc2UgTEFOR19BRlJJS0FBTlM6IHJldHVybiAiYWZfWkEiOwotLSAgICAgIGNhc2UgTEFOR19BTEJBTklBTjogcmV0dXJuICJzcV9BTCI7Ci0tICAgICAgY2FzZSBMQU5HX0FNSEFSSUM6IHJldHVybiAiYW1fRVQiOwotLSAgICAgIGNhc2UgTEFOR19BUkFCSUM6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQTogcmV0dXJuICJhcl9TQSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19JUkFROiByZXR1cm4gImFyX0lRIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0VHWVBUOiByZXR1cm4gImFyX0VHIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0xJQllBOiByZXR1cm4gImFyX0xZIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0FMR0VSSUE6IHJldHVybiAiYXJfRFoiOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfTU9ST0NDTzogcmV0dXJuICJhcl9NQSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBOiByZXR1cm4gImFyX1ROIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX09NQU46IHJldHVybiAiYXJfT00iOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfWUVNRU46IHJldHVybiAiYXJfWUUiOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfU1lSSUE6IHJldHVybiAiYXJfU1kiOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfSk9SREFOOiByZXR1cm4gImFyX0pPIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0xFQkFOT046IHJldHVybiAiYXJfTEIiOwotLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfS1VXQUlUOiByZXR1cm4gImFyX0tXIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX1VBRTogcmV0dXJuICJhcl9BRSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOOiByZXR1cm4gImFyX0JIIjsKLS0JICBjYXNlIFNVQkxBTkdfQVJBQklDX1FBVEFSOiByZXR1cm4gImFyX1FBIjsKLS0JICB9Ci0tCXJldHVybiAiYXIiOwotLSAgICAgIGNhc2UgTEFOR19BUk1FTklBTjogcmV0dXJuICJoeV9BTSI7Ci0tICAgICAgY2FzZSBMQU5HX0FTU0FNRVNFOiByZXR1cm4gImFzX0lOIjsKLS0gICAgICBjYXNlIExBTkdfQVpFUkk6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBBemVyYmFpamFuaSBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KLS0JICBjYXNlIFNVQkxBTkdfQVpFUklfTEFUSU46IHJldHVybiAiYXpfQVpAbGF0aW4iOwotLQkgIGNhc2UgU1VCTEFOR19BWkVSSV9DWVJJTExJQzogcmV0dXJuICJhel9BWkBjeXJpbGxpYyI7Ci0tCSAgfQotLQlyZXR1cm4gImF6IjsKLS0gICAgICBjYXNlIExBTkdfQkFTUVVFOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAiZXVfRVMiOwotLQkgIH0KLS0JcmV0dXJuICJldSI7IC8qIEFtYmlndW91czogY291bGQgYmUgImV1X0VTIiBvciAiZXVfRlIiLiAgKi8KLS0gICAgICBjYXNlIExBTkdfQkVMQVJVU0lBTjogcmV0dXJuICJiZV9CWSI7Ci0tICAgICAgY2FzZSBMQU5HX0JFTkdBTEk6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfQkVOR0FMSV9JTkRJQTogcmV0dXJuICJibl9JTiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0JFTkdBTElfQkFOR0xBREVTSDogcmV0dXJuICJibl9CRCI7Ci0tCSAgfQotLQlyZXR1cm4gImJuIjsKLS0gICAgICBjYXNlIExBTkdfQlVMR0FSSUFOOiByZXR1cm4gImJnX0JHIjsKLS0gICAgICBjYXNlIExBTkdfQlVSTUVTRTogcmV0dXJuICJteV9NTSI7Ci0tICAgICAgY2FzZSBMQU5HX0NBTUJPRElBTjogcmV0dXJuICJrbV9LSCI7Ci0tICAgICAgY2FzZSBMQU5HX0NBVEFMQU46IHJldHVybiAiY2FfRVMiOwotLSAgICAgIGNhc2UgTEFOR19DSEVST0tFRTogcmV0dXJuICJjaHJfVVMiOwotLSAgICAgIGNhc2UgTEFOR19DSElORVNFOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0NISU5FU0VfVFJBRElUSU9OQUw6IHJldHVybiAiemhfVFciOwotLQkgIGNhc2UgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQ6IHJldHVybiAiemhfQ04iOwotLQkgIGNhc2UgU1VCTEFOR19DSElORVNFX0hPTkdLT05HOiByZXR1cm4gInpoX0hLIjsKLS0JICBjYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU5HQVBPUkU6IHJldHVybiAiemhfU0ciOwotLQkgIGNhc2UgU1VCTEFOR19DSElORVNFX01BQ0FVOiByZXR1cm4gInpoX01PIjsKLS0JICB9Ci0tCXJldHVybiAiemgiOwotLSAgICAgIGNhc2UgTEFOR19DUk9BVElBTjogICAgICAgLyogTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KLS0JCQkJICogV2hhdCB1c2VkIHRvIGJlIGNhbGxlZCBTZXJiby1Dcm9hdGlhbgotLQkJCQkgKiBzaG91bGQgcmVhbGx5IG5vdyBiZSB0d28gc2VwYXJhdGUKLS0JCQkJICogbGFuZ3VhZ2VzIGJlY2F1c2Ugb2YgcG9saXRpY2FsIHJlYXNvbnMuCi0tCQkJCSAqIChTYXlzIHRtbCwgd2hvIGtub3dzIG5vdGhpbmcgYWJvdXQgU2VyYmlhbgotLQkJCQkgKiBvciBDcm9hdGlhbi4pCi0tCQkJCSAqIChJIGNhbiBmZWVsIHRob3NlIGZsYW1lcyBjb21pbmcgYWxyZWFkeS4pCi0tCQkJCSAqLwotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAiaHJfSFIiOwotLQkgIGNhc2UgU1VCTEFOR19TRVJCSUFOX0xBVElOOiByZXR1cm4gInNyX0NTIjsKLS0JICBjYXNlIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQzogcmV0dXJuICJzcl9DU0BjeXJpbGxpYyI7Ci0tCSAgfQotLQlyZXR1cm4gImhyIjsKLS0gICAgICBjYXNlIExBTkdfQ1pFQ0g6IHJldHVybiAiY3NfQ1oiOwotLSAgICAgIGNhc2UgTEFOR19EQU5JU0g6IHJldHVybiAiZGFfREsiOwotLSAgICAgIGNhc2UgTEFOR19ESVZFSEk6IHJldHVybiAiZHZfTVYiOwotLSAgICAgIGNhc2UgTEFOR19EVVRDSDoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19EVVRDSDogcmV0dXJuICJubF9OTCI7Ci0tCSAgY2FzZSBTVUJMQU5HX0RVVENIX0JFTEdJQU46IC8qIEZMRU1JU0gsIFZMQUFNUyAqLyByZXR1cm4gIm5sX0JFIjsKLS0JICB9Ci0tCXJldHVybiAibmwiOwotLSAgICAgIGNhc2UgTEFOR19FRE86IHJldHVybiAiYmluX05HIjsKLS0gICAgICBjYXNlIExBTkdfRU5HTElTSDoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIC8qIFNVQkxBTkdfRU5HTElTSF9VUyA9PSBTVUJMQU5HX0RFRkFVTFQuIEhlaC4gSSB0aG91Z2h0Ci0tCSAgICogRW5nbGlzaCB3YXMgdGhlIGxhbmd1YWdlIHNwb2tlbiBpbiBFbmdsYW5kLgotLQkgICAqIE9oIHdlbGwuCi0tCSAgICovCi0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfVVM6IHJldHVybiAiZW5fVVMiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX1VLOiByZXR1cm4gImVuX0dCIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9BVVM6IHJldHVybiAiZW5fQVUiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0NBTjogcmV0dXJuICJlbl9DQSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfTlo6IHJldHVybiAiZW5fTloiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0VJUkU6IHJldHVybiAiZW5fSUUiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQTogcmV0dXJuICJlbl9aQSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQTogcmV0dXJuICJlbl9KTSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOOiByZXR1cm4gImVuX0dEIjsgLyogR3JlbmFkYT8gKi8KLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9CRUxJWkU6IHJldHVybiAiZW5fQloiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEOiByZXR1cm4gImVuX1RUIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRTogcmV0dXJuICJlbl9aVyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVM6IHJldHVybiAiZW5fUEgiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQTogcmV0dXJuICJlbl9JRCI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkc6IHJldHVybiAiZW5fSEsiOwotLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0lORElBOiByZXR1cm4gImVuX0lOIjsKLS0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQTogcmV0dXJuICJlbl9NWSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFOiByZXR1cm4gImVuX1NHIjsKLS0JICB9Ci0tCXJldHVybiAiZW4iOwotLSAgICAgIGNhc2UgTEFOR19FU1RPTklBTjogcmV0dXJuICJldF9FRSI7Ci0tICAgICAgY2FzZSBMQU5HX0ZBRVJPRVNFOiByZXR1cm4gImZvX0ZPIjsKLS0gICAgICBjYXNlIExBTkdfRkFSU0k6IHJldHVybiAiZmFfSVIiOwotLSAgICAgIGNhc2UgTEFOR19GSU5OSVNIOiByZXR1cm4gImZpX0ZJIjsKLS0gICAgICBjYXNlIExBTkdfRlJFTkNIOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSDogcmV0dXJuICJmcl9GUiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOOiAvKiBXQUxMT09OICovIHJldHVybiAiZnJfQkUiOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfQ0FOQURJQU46IHJldHVybiAiZnJfQ0EiOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfU1dJU1M6IHJldHVybiAiZnJfQ0giOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRzogcmV0dXJuICJmcl9MVSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9NT05BQ086IHJldHVybiAiZnJfTUMiOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUzogcmV0dXJuICJmciI7IC8qIENhcmliYmVhbj8gKi8KLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX1JFVU5JT046IHJldHVybiAiZnJfUkUiOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfQ09OR086IHJldHVybiAiZnJfQ0ciOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfU0VORUdBTDogcmV0dXJuICJmcl9TTiI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU1FUk9PTjogcmV0dXJuICJmcl9DTSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRTogcmV0dXJuICJmcl9DSSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9NQUxJOiByZXR1cm4gImZyX01MIjsKLS0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX01PUk9DQ086IHJldHVybiAiZnJfTUEiOwotLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfSEFJVEk6IHJldHVybiAiZnJfSFQiOwotLQkgIH0KLS0JcmV0dXJuICJmciI7Ci0tICAgICAgY2FzZSBMQU5HX0ZSSVNJQU46IHJldHVybiAiZnlfTkwiOwotLSAgICAgIGNhc2UgTEFOR19GVUxGVUxERToKLS0JLyogU3Bva2VuIGluIE5pZ2VyaWEsIEd1aW5lYSwgU2VuZWdhbCwgTWFsaSwgTmlnZXIsIENhbWVyb29uLCBCZW5pbi4gICovCi0tCXJldHVybiAiZmZfTkciOwotLSAgICAgIGNhc2UgTEFOR19HQUVMSUM6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIDB4MDE6IC8qIFNDT1RUSVNIICovIHJldHVybiAiZ2RfR0IiOwotLQkgIGNhc2UgMHgwMjogLyogSVJJU0ggKi8gcmV0dXJuICJnYV9JRSI7Ci0tCSAgfQotLQlyZXR1cm4gIkMiOwotLSAgICAgIGNhc2UgTEFOR19HQUxJQ0lBTjogcmV0dXJuICJnbF9FUyI7Ci0tICAgICAgY2FzZSBMQU5HX0dFT1JHSUFOOiByZXR1cm4gImthX0dFIjsKLS0gICAgICBjYXNlIExBTkdfR0VSTUFOOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0dFUk1BTjogcmV0dXJuICJkZV9ERSI7Ci0tCSAgY2FzZSBTVUJMQU5HX0dFUk1BTl9TV0lTUzogcmV0dXJuICJkZV9DSCI7Ci0tCSAgY2FzZSBTVUJMQU5HX0dFUk1BTl9BVVNUUklBTjogcmV0dXJuICJkZV9BVCI7Ci0tCSAgY2FzZSBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHOiByZXR1cm4gImRlX0xVIjsKLS0JICBjYXNlIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU46IHJldHVybiAiZGVfTEkiOwotLQkgIH0KLS0JcmV0dXJuICJkZSI7Ci0tICAgICAgY2FzZSBMQU5HX0dSRUVLOiByZXR1cm4gImVsX0dSIjsKLS0gICAgICBjYXNlIExBTkdfR1VBUkFOSTogcmV0dXJuICJnbl9QWSI7Ci0tICAgICAgY2FzZSBMQU5HX0dVSkFSQVRJOiByZXR1cm4gImd1X0lOIjsKLS0gICAgICBjYXNlIExBTkdfSEFVU0E6IHJldHVybiAiaGFfTkciOwotLSAgICAgIGNhc2UgTEFOR19IQVdBSUlBTjoKLS0JLyogRklYTUU6IERvIHRoZXkgbWVhbiBIYXdhaWlhbiAoImhhd19VUyIsIDEwMDAgc3BlYWtlcnMpCi0tCSAgIG9yIEhhd2FpaSBDcmVvbGUgRW5nbGlzaCAoImNwZV9VUyIsIDYwMDAwMCBzcGVha2Vycyk/ICAqLwotLQlyZXR1cm4gImNwZV9VUyI7Ci0tICAgICAgY2FzZSBMQU5HX0hFQlJFVzogcmV0dXJuICJoZV9JTCI7Ci0tICAgICAgY2FzZSBMQU5HX0hJTkRJOiByZXR1cm4gImhpX0lOIjsKLS0gICAgICBjYXNlIExBTkdfSFVOR0FSSUFOOiByZXR1cm4gImh1X0hVIjsKLS0gICAgICBjYXNlIExBTkdfSUJJQklPOiByZXR1cm4gIm5pY19ORyI7Ci0tICAgICAgY2FzZSBMQU5HX0lDRUxBTkRJQzogcmV0dXJuICJpc19JUyI7Ci0tICAgICAgY2FzZSBMQU5HX0lHQk86IHJldHVybiAiaWdfTkciOwotLSAgICAgIGNhc2UgTEFOR19JTkRPTkVTSUFOOiByZXR1cm4gImlkX0lEIjsKLS0gICAgICBjYXNlIExBTkdfSU5VS1RJVFVUOiByZXR1cm4gIml1X0NBIjsKLS0gICAgICBjYXNlIExBTkdfSVRBTElBTjoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19JVEFMSUFOOiByZXR1cm4gIml0X0lUIjsKLS0JICBjYXNlIFNVQkxBTkdfSVRBTElBTl9TV0lTUzogcmV0dXJuICJpdF9DSCI7Ci0tCSAgfQotLQlyZXR1cm4gIml0IjsKLS0gICAgICBjYXNlIExBTkdfSkFQQU5FU0U6IHJldHVybiAiamFfSlAiOwotLSAgICAgIGNhc2UgTEFOR19LQU5OQURBOiByZXR1cm4gImtuX0lOIjsKLS0gICAgICBjYXNlIExBTkdfS0FOVVJJOiByZXR1cm4gImtyX05HIjsKLS0gICAgICBjYXNlIExBTkdfS0FTSE1JUkk6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJrc19QSyI7Ci0tCSAgY2FzZSBTVUJMQU5HX0tBU0hNSVJJX0lORElBOiByZXR1cm4gImtzX0lOIjsKLS0JICB9Ci0tCXJldHVybiAia3MiOwotLSAgICAgIGNhc2UgTEFOR19LQVpBSzogcmV0dXJuICJra19LWiI7Ci0tICAgICAgY2FzZSBMQU5HX0tPTktBTkk6Ci0tCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCi0tCXJldHVybiAia29rX0lOIjsKLS0gICAgICBjYXNlIExBTkdfS09SRUFOOiByZXR1cm4gImtvX0tSIjsKLS0gICAgICBjYXNlIExBTkdfS1lSR1laOiByZXR1cm4gImt5X0tHIjsKLS0gICAgICBjYXNlIExBTkdfTEFPOiByZXR1cm4gImxvX0xBIjsKLS0gICAgICBjYXNlIExBTkdfTEFUSU46IHJldHVybiAibGFfVkEiOwotLSAgICAgIGNhc2UgTEFOR19MQVRWSUFOOiByZXR1cm4gImx2X0xWIjsKLS0gICAgICBjYXNlIExBTkdfTElUSFVBTklBTjogcmV0dXJuICJsdF9MVCI7Ci0tICAgICAgY2FzZSBMQU5HX01BQ0VET05JQU46IHJldHVybiAibWtfTUsiOwotLSAgICAgIGNhc2UgTEFOR19NQUxBWToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19NQUxBWV9NQUxBWVNJQTogcmV0dXJuICJtc19NWSI7Ci0tCSAgY2FzZSBTVUJMQU5HX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNOiByZXR1cm4gIm1zX0JOIjsKLS0JICB9Ci0tCXJldHVybiAibXMiOwotLSAgICAgIGNhc2UgTEFOR19NQUxBWUFMQU06IHJldHVybiAibWxfSU4iOwotLSAgICAgIGNhc2UgTEFOR19NQUxURVNFOiByZXR1cm4gIm10X01UIjsKLS0gICAgICBjYXNlIExBTkdfTUFOSVBVUkk6Ci0tCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCi0tCXJldHVybiAibW5pX0lOIjsKLS0gICAgICBjYXNlIExBTkdfTUFSQVRISTogcmV0dXJuICJtcl9JTiI7Ci0tICAgICAgY2FzZSBMQU5HX01PTkdPTElBTjoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gIm1uX01OIjsKLS0JICB9Ci0tCXJldHVybiAibW4iOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJtbl9DTiIgb3IgIm1uX01OIi4gICovCi0tICAgICAgY2FzZSBMQU5HX05FUEFMSToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gIm5lX05QIjsKLS0JICBjYXNlIFNVQkxBTkdfTkVQQUxJX0lORElBOiByZXR1cm4gIm5lX0lOIjsKLS0JICB9Ci0tCXJldHVybiAibmUiOwotLSAgICAgIGNhc2UgTEFOR19OT1JXRUdJQU46Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTDogcmV0dXJuICJuYl9OTyI7Ci0tCSAgY2FzZSBTVUJMQU5HX05PUldFR0lBTl9OWU5PUlNLOiByZXR1cm4gIm5uX05PIjsKLS0JICB9Ci0tCXJldHVybiAibm8iOwotLSAgICAgIGNhc2UgTEFOR19PUklZQTogcmV0dXJuICJvcl9JTiI7Ci0tICAgICAgY2FzZSBMQU5HX09ST01POiByZXR1cm4gIm9tX0VUIjsKLS0gICAgICBjYXNlIExBTkdfUEFQSUFNRU5UVTogcmV0dXJuICJwYXBfQU4iOwotLSAgICAgIGNhc2UgTEFOR19QQVNIVE86Ci0tCXJldHVybiAicHMiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJwc19QSyIgb3IgInBzX0FGIi4gICovCi0tICAgICAgY2FzZSBMQU5HX1BPTElTSDogcmV0dXJuICJwbF9QTCI7Ci0tICAgICAgY2FzZSBMQU5HX1BPUlRVR1VFU0U6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfUE9SVFVHVUVTRTogcmV0dXJuICJwdF9QVCI7Ci0tCSAgLyogSG1tLiBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOID09IFNVQkxBTkdfREVGQVVMVC4KLS0JICAgICBTYW1lIHBoZW5vbWVub24gYXMgU1VCTEFOR19FTkdMSVNIX1VTID09IFNVQkxBTkdfREVGQVVMVC4gKi8KLS0JICBjYXNlIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU46IHJldHVybiAicHRfQlIiOwotLQkgIH0KLS0JcmV0dXJuICJwdCI7Ci0tICAgICAgY2FzZSBMQU5HX1BVTkpBQkk6Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfUFVOSkFCSV9JTkRJQTogcmV0dXJuICJwYV9JTiI7IC8qIEd1cm11a2hpIHNjcmlwdCAqLwotLQkgIGNhc2UgU1VCTEFOR19QVU5KQUJJX1BBS0lTVEFOOiByZXR1cm4gInBhX1BLIjsgLyogQXJhYmljIHNjcmlwdCAqLwotLQkgIH0KLS0JcmV0dXJuICJwYSI7Ci0tICAgICAgY2FzZSBMQU5HX1JIQUVUT19ST01BTkNFOiByZXR1cm4gInJtX0NIIjsKLS0gICAgICBjYXNlIExBTkdfUk9NQU5JQU46Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQTogcmV0dXJuICJyb19STyI7Ci0tCSAgY2FzZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkE6IHJldHVybiAicm9fTUQiOwotLQkgIH0KLS0JcmV0dXJuICJybyI7Ci0tICAgICAgY2FzZSBMQU5HX1JVU1NJQU46Ci0tCXN3aXRjaCAoc3ViKQotLQkgIHsKLS0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJydV9SVSI7Ci0tCSAgfQotLQlyZXR1cm4gInJ1IjsgLyogQW1iaWd1b3VzOiBjb3VsZCBiZSAicnVfUlUiIG9yICJydV9VQSIgb3IgInJ1X01EIi4gICovCi0tICAgICAgY2FzZSBMQU5HX1NBQU1JOiAvKiBhY3R1YWxseSBOb3J0aGVybiBTYW1pICovIHJldHVybiAic2VfTk8iOwotLSAgICAgIGNhc2UgTEFOR19TQU5TS1JJVDogcmV0dXJuICJzYV9JTiI7Ci0tICAgICAgY2FzZSBMQU5HX1NJTkRISToKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19TSU5ESElfUEFLSVNUQU46IHJldHVybiAic2RfUEsiOwotLQkgIGNhc2UgU1VCTEFOR19TSU5ESElfQUZHSEFOSVNUQU46IHJldHVybiAic2RfQUYiOwotLQkgIH0KLS0JcmV0dXJuICJzZCI7Ci0tICAgICAgY2FzZSBMQU5HX1NJTkhBTEVTRTogcmV0dXJuICJzaV9MSyI7Ci0tICAgICAgY2FzZSBMQU5HX1NMT1ZBSzogcmV0dXJuICJza19TSyI7Ci0tICAgICAgY2FzZSBMQU5HX1NMT1ZFTklBTjogcmV0dXJuICJzbF9TSSI7Ci0tICAgICAgY2FzZSBMQU5HX1NPTUFMSTogcmV0dXJuICJzb19TTyI7Ci0tICAgICAgY2FzZSBMQU5HX1NPUkJJQU46Ci0tCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCi0tCXJldHVybiAid2VuX0RFIjsKLS0gICAgICBjYXNlIExBTkdfU1BBTklTSDoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIOiByZXR1cm4gImVzX0VTIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOOiByZXR1cm4gImVzX01YIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9NT0RFUk46Ci0tCSAgICByZXR1cm4gImVzX0VTQG1vZGVybiI7CS8qIG5vdCBzZWVuIG9uIFVuaXggKi8KLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEE6IHJldHVybiAiZXNfR1QiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0E6IHJldHVybiAiZXNfQ1IiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1BBTkFNQTogcmV0dXJuICJlc19QQSI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDOiByZXR1cm4gImVzX0RPIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEE6IHJldHVybiAiZXNfVkUiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBOiByZXR1cm4gImVzX0NPIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9QRVJVOiByZXR1cm4gImVzX1BFIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkE6IHJldHVybiAiZXNfQVIiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0VDVUFET1I6IHJldHVybiAiZXNfRUMiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0NISUxFOiByZXR1cm4gImVzX0NMIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZOiByZXR1cm4gImVzX1VZIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWTogcmV0dXJuICJlc19QWSI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQTogcmV0dXJuICJlc19CTyI7Ci0tCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1I6IHJldHVybiAiZXNfU1YiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTOiByZXR1cm4gImVzX0hOIjsKLS0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUE6IHJldHVybiAiZXNfTkkiOwotLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPOiByZXR1cm4gImVzX1BSIjsKLS0JICB9Ci0tCXJldHVybiAiZXMiOwotLSAgICAgIGNhc2UgTEFOR19TVVRVOiByZXR1cm4gImJudF9UWiI7IC8qIG9yICJzdF9MUyIgb3IgIm5zb19aQSI/ICovCi0tICAgICAgY2FzZSBMQU5HX1NXQUhJTEk6IHJldHVybiAic3dfS0UiOwotLSAgICAgIGNhc2UgTEFOR19TV0VESVNIOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAic3ZfU0UiOwotLQkgIGNhc2UgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQ6IHJldHVybiAic3ZfRkkiOwotLQkgIH0KLS0JcmV0dXJuICJzdiI7Ci0tICAgICAgY2FzZSBMQU5HX1NZUklBQzogcmV0dXJuICJzeXJfVFIiOyAvKiBBbiBleHRpbmN0IGxhbmd1YWdlLiAgKi8KLS0gICAgICBjYXNlIExBTkdfVEFHQUxPRzogcmV0dXJuICJ0bF9QSCI7Ci0tICAgICAgY2FzZSBMQU5HX1RBSklLOiByZXR1cm4gInRnX1RKIjsKLS0gICAgICBjYXNlIExBTkdfVEFNQVpJR0hUOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gVGFtYXppZ2h0IGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLwotLQkgIGNhc2UgU1VCTEFOR19UQU1BWklHSFRfQVJBQklDOiByZXR1cm4gImJlcl9NQUBhcmFiaWMiOwotLQkgIGNhc2UgU1VCTEFOR19UQU1BWklHSFRfQUxHRVJJQV9MQVRJTjogcmV0dXJuICJiZXJfRFpAbGF0aW4iOwotLQkgIH0KLS0JcmV0dXJuICJiZXJfTUEiOwotLSAgICAgIGNhc2UgTEFOR19UQU1JTDoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gInRhX0lOIjsKLS0JICB9Ci0tCXJldHVybiAidGEiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJ0YV9JTiIgb3IgInRhX0xLIiBvciAidGFfU0ciLiAgKi8KLS0gICAgICBjYXNlIExBTkdfVEFUQVI6IHJldHVybiAidHRfUlUiOwotLSAgICAgIGNhc2UgTEFOR19URUxVR1U6IHJldHVybiAidGVfSU4iOwotLSAgICAgIGNhc2UgTEFOR19USEFJOiByZXR1cm4gInRoX1RIIjsKLS0gICAgICBjYXNlIExBTkdfVElCRVRBTjogcmV0dXJuICJib19DTiI7Ci0tICAgICAgY2FzZSBMQU5HX1RJR1JJTllBOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX1RJR1JJTllBX0VUSElPUElBOiByZXR1cm4gInRpX0VUIjsKLS0JICBjYXNlIFNVQkxBTkdfVElHUklOWUFfRVJJVFJFQTogcmV0dXJuICJ0aV9FUiI7Ci0tCSAgfQotLQlyZXR1cm4gInRpIjsKLS0gICAgICBjYXNlIExBTkdfVFNPTkdBOiByZXR1cm4gInRzX1pBIjsKLS0gICAgICBjYXNlIExBTkdfVFNXQU5BOiByZXR1cm4gInRuX0JXIjsKLS0gICAgICBjYXNlIExBTkdfVFVSS0lTSDogcmV0dXJuICJ0cl9UUiI7Ci0tICAgICAgY2FzZSBMQU5HX1RVUktNRU46IHJldHVybiAidGtfVE0iOwotLSAgICAgIGNhc2UgTEFOR19VS1JBSU5JQU46IHJldHVybiAidWtfVUEiOwotLSAgICAgIGNhc2UgTEFOR19VUkRVOgotLQlzd2l0Y2ggKHN1YikKLS0JICB7Ci0tCSAgY2FzZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU46IHJldHVybiAidXJfUEsiOwotLQkgIGNhc2UgU1VCTEFOR19VUkRVX0lORElBOiByZXR1cm4gInVyX0lOIjsKLS0JICB9Ci0tCXJldHVybiAidXIiOwotLSAgICAgIGNhc2UgTEFOR19VWkJFSzoKLS0Jc3dpdGNoIChzdWIpCi0tCSAgewotLQkgIGNhc2UgU1VCTEFOR19VWkJFS19MQVRJTjogcmV0dXJuICJ1el9VWiI7Ci0tCSAgY2FzZSBTVUJMQU5HX1VaQkVLX0NZUklMTElDOiByZXR1cm4gInV6X1VaQGN5cmlsbGljIjsKLS0JICB9Ci0tCXJldHVybiAidXoiOwotLSAgICAgIGNhc2UgTEFOR19WRU5EQTogcmV0dXJuICJ2ZV9aQSI7Ci0tICAgICAgY2FzZSBMQU5HX1ZJRVROQU1FU0U6IHJldHVybiAidmlfVk4iOwotLSAgICAgIGNhc2UgTEFOR19XRUxTSDogcmV0dXJuICJjeV9HQiI7Ci0tICAgICAgY2FzZSBMQU5HX1hIT1NBOiByZXR1cm4gInhoX1pBIjsKLS0gICAgICBjYXNlIExBTkdfWUk6IHJldHVybiAic2l0X0NOIjsKLS0gICAgICBjYXNlIExBTkdfWUlERElTSDogcmV0dXJuICJ5aV9JTCI7Ci0tICAgICAgY2FzZSBMQU5HX1lPUlVCQTogcmV0dXJuICJ5b19ORyI7Ci0tICAgICAgY2FzZSBMQU5HX1pVTFU6IHJldHVybiAienVfWkEiOwotLSAgICAgIGRlZmF1bHQ6IHJldHVybiAiQyI7Ci0tICAgICAgfQotLSAgfQotLSMgZW5kaWYKLS0jZW5kaWYKLS19Ci0tCi0tY29uc3QgY2hhciAqCi0tZ2xfbG9jYWxlX25hbWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQotLXsKLS0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLS0KLS0gIHJldHZhbCA9IGdsX2xvY2FsZV9uYW1lX3Bvc2l4IChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKLS0gIGlmIChyZXR2YWwgIT0gTlVMTCkKLS0gICAgcmV0dXJuIHJldHZhbDsKLS0KLS0gIHJldHVybiBnbF9sb2NhbGVfbmFtZV9kZWZhdWx0ICgpOwotLX0KLS0tLSBhL2ludGwvbG9jay5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw5MjIgKzAsMCBAQAotLS8qIExvY2tpbmcgaW4gbXVsdGl0aHJlYWRlZCBzaXR1YXRpb25zLgotLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDUuCi0tICAgQmFzZWQgb24gR0NDJ3MgZ3Roci1wb3NpeC5oLCBndGhyLXBvc2l4OTUuaCwgZ3Roci1zb2xhcmlzLmgsCi0tICAgZ3Roci13aW4zMi5oLiAgKi8KLS0KLS0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0tCi0tI2luY2x1ZGUgImxvY2suaCIKLS0KLS0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0tCi0tI2lmIFVTRV9QT1NJWF9USFJFQURTCi0tCi0tLyogVXNlIHRoZSBQT1NJWCB0aHJlYWRzIGxpYnJhcnkuICAqLwotLQotLSMgaWYgUFRIUkVBRF9JTl9VU0VfREVURUNUSU9OX0hBUkQKLS0KLS0vKiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYnkgYSBkdW1teSB0aHJlYWQuICAqLwotLXN0YXRpYyB2b2lkICoKLS1kdW1teV90aHJlYWRfZnVuYyAodm9pZCAqYXJnKQotLXsKLS0gIHJldHVybiBhcmc7Ci0tfQotLQotLWludAotLWdsdGhyZWFkX2luX3VzZSAodm9pZCkKLS17Ci0tICBzdGF0aWMgaW50IHRlc3RlZDsKLS0gIHN0YXRpYyBpbnQgcmVzdWx0OyAvKiAxOiBsaW5rZWQgd2l0aCAtbHB0aHJlYWQsIDA6IG9ubHkgd2l0aCBsaWJjICovCi0tCi0tICBpZiAoIXRlc3RlZCkKLS0gICAgewotLSAgICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0tCi0tICAgICAgaWYgKHB0aHJlYWRfY3JlYXRlICgmdGhyZWFkLCBOVUxMLCBkdW1teV90aHJlYWRfZnVuYywgTlVMTCkgIT0gMCkKLS0JLyogVGhyZWFkIGNyZWF0aW9uIGZhaWxlZC4gICovCi0tCXJlc3VsdCA9IDA7Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgLyogVGhyZWFkIGNyZWF0aW9uIHdvcmtzLiAgKi8KLS0JICB2b2lkICpyZXR2YWw7Ci0tCSAgaWYgKHB0aHJlYWRfam9pbiAodGhyZWFkLCAmcmV0dmFsKSAhPSAwKQotLQkgICAgYWJvcnQgKCk7Ci0tCSAgcmVzdWx0ID0gMTsKLS0JfQotLSAgICAgIHRlc3RlZCA9IDE7Ci0tICAgIH0KLS0gIHJldHVybiByZXN1bHQ7Ci0tfQotLQotLSMgZW5kaWYKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0jIGlmIEhBVkVfUFRIUkVBRF9SV0xPQ0sKLS0KLS0jICBpZiAhZGVmaW5lZCBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUgotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfaW5pdCAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKHB0aHJlYWRfcndsb2NrX2luaXQgKCZsb2NrLT5yd2xvY2ssIE5VTEwpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgbG9jay0+aW5pdGlhbGl6ZWQgPSAxOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLS0gICAgewotLSAgICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5ndWFyZCkgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgICAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLS0JZ2x0aHJlYWRfcndsb2NrX2luaXQgKGxvY2spOwotLSAgICAgIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAoJmxvY2stPmd1YXJkKSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgfQotLSAgaWYgKHB0aHJlYWRfcndsb2NrX3JkbG9jayAoJmxvY2stPnJ3bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfd3Jsb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotLSAgICB7Ci0tICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmxvY2stPmd1YXJkKSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotLQlnbHRocmVhZF9yd2xvY2tfaW5pdCAobG9jayk7Ci0tICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+Z3VhcmQpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICB9Ci0tICBpZiAocHRocmVhZF9yd2xvY2tfd3Jsb2NrICgmbG9jay0+cndsb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja191bmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfcndsb2NrX3VubG9jayAoJmxvY2stPnJ3bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJmxvY2stPnJ3bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBsb2NrLT5pbml0aWFsaXplZCA9IDA7Ci0tfQotLQotLSMgIGVuZGlmCi0tCi0tIyBlbHNlCi0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19pbml0IChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAocHRocmVhZF9tdXRleF9pbml0ICgmbG9jay0+bG9jaywgTlVMTCkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9jb25kX2luaXQgKCZsb2NrLT53YWl0aW5nX3JlYWRlcnMsIE5VTEwpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfY29uZF9pbml0ICgmbG9jay0+d2FpdGluZ193cml0ZXJzLCBOVUxMKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudCA9IDA7Ci0tICBsb2NrLT5ydW5jb3VudCA9IDA7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfcmRsb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAocHRocmVhZF9tdXRleF9sb2NrICgmbG9jay0+bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICAvKiBUZXN0IHdoZXRoZXIgb25seSByZWFkZXJzIGFyZSBjdXJyZW50bHkgcnVubmluZywgYW5kIHdoZXRoZXIgdGhlIHJ1bmNvdW50Ci0tICAgICBmaWVsZCB3aWxsIG5vdCBvdmVyZmxvdy4gICovCi0tICAvKiBQT1NJWCBzYXlzOiAiSXQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZAotLSAgICAgYWNxdWlyZXMgdGhlIGxvY2sgd2hlbiBhIHdyaXRlciBkb2VzIG5vdCBob2xkIHRoZSBsb2NrIGFuZCB0aGVyZSBhcmUKLS0gICAgIHdyaXRlcnMgYmxvY2tlZCBvbiB0aGUgbG9jay4iICBMZXQncyBzYXksIG5vOiBnaXZlIHRoZSB3cml0ZXJzIGEgaGlnaGVyCi0tICAgICBwcmlvcml0eS4gICovCi0tICB3aGlsZSAoIShsb2NrLT5ydW5jb3VudCArIDEgPiAwICYmIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudCA9PSAwKSkKLS0gICAgewotLSAgICAgIC8qIFRoaXMgdGhyZWFkIGhhcyB0byB3YWl0IGZvciBhIHdoaWxlLiAgRW5xdWV1ZSBpdCBhbW9uZyB0aGUKLS0JIHdhaXRpbmdfcmVhZGVycy4gICovCi0tICAgICAgaWYgKHB0aHJlYWRfY29uZF93YWl0ICgmbG9jay0+d2FpdGluZ19yZWFkZXJzLCAmbG9jay0+bG9jaykgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgIH0KLS0gIGxvY2stPnJ1bmNvdW50Kys7Ci0tICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja193cmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIC8qIFRlc3Qgd2hldGhlciBubyByZWFkZXJzIG9yIHdyaXRlcnMgYXJlIGN1cnJlbnRseSBydW5uaW5nLiAgKi8KLS0gIHdoaWxlICghKGxvY2stPnJ1bmNvdW50ID09IDApKQotLSAgICB7Ci0tICAgICAgLyogVGhpcyB0aHJlYWQgaGFzIHRvIHdhaXQgZm9yIGEgd2hpbGUuICBFbnF1ZXVlIGl0IGFtb25nIHRoZQotLQkgd2FpdGluZ193cml0ZXJzLiAgKi8KLS0gICAgICBsb2NrLT53YWl0aW5nX3dyaXRlcnNfY291bnQrKzsKLS0gICAgICBpZiAocHRocmVhZF9jb25kX3dhaXQgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMsICZsb2NrLT5sb2NrKSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgICBsb2NrLT53YWl0aW5nX3dyaXRlcnNfY291bnQtLTsKLS0gICAgfQotLSAgbG9jay0+cnVuY291bnQtLTsgLyogcnVuY291bnQgYmVjb21lcyAtMSAqLwotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfdW5sb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAocHRocmVhZF9tdXRleF9sb2NrICgmbG9jay0+bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAobG9jay0+cnVuY291bnQgPCAwKQotLSAgICB7Ci0tICAgICAgLyogRHJvcCBhIHdyaXRlciBsb2NrLiAgKi8KLS0gICAgICBpZiAoIShsb2NrLT5ydW5jb3VudCA9PSAtMSkpCi0tCWFib3J0ICgpOwotLSAgICAgIGxvY2stPnJ1bmNvdW50ID0gMDsKLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogRHJvcCBhIHJlYWRlciBsb2NrLiAgKi8KLS0gICAgICBpZiAoIShsb2NrLT5ydW5jb3VudCA+IDApKQotLQlhYm9ydCAoKTsKLS0gICAgICBsb2NrLT5ydW5jb3VudC0tOwotLSAgICB9Ci0tICBpZiAobG9jay0+cnVuY291bnQgPT0gMCkKLS0gICAgewotLSAgICAgIC8qIFBPU0lYIHJlY29tbWVuZHMgdGhhdCAid3JpdGUgbG9ja3Mgc2hhbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgcmVhZAotLQkgbG9ja3MiLCB0byBhdm9pZCAid3JpdGVyIHN0YXJ2YXRpb24iLiAgKi8KLS0gICAgICBpZiAobG9jay0+d2FpdGluZ193cml0ZXJzX2NvdW50ID4gMCkKLS0JewotLQkgIC8qIFdha2UgdXAgb25lIG9mIHRoZSB3YWl0aW5nIHdyaXRlcnMuICAqLwotLQkgIGlmIChwdGhyZWFkX2NvbmRfc2lnbmFsICgmbG9jay0+d2FpdGluZ193cml0ZXJzKSAhPSAwKQotLQkgICAgYWJvcnQgKCk7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICAvKiBXYWtlIHVwIGFsbCB3YWl0aW5nIHJlYWRlcnMuICAqLwotLQkgIGlmIChwdGhyZWFkX2NvbmRfYnJvYWRjYXN0ICgmbG9jay0+d2FpdGluZ19yZWFkZXJzKSAhPSAwKQotLQkgICAgYWJvcnQgKCk7Ci0tCX0KLS0gICAgfQotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+bG9jaykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJmxvY2stPmxvY2spICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfY29uZF9kZXN0cm95ICgmbG9jay0+d2FpdGluZ19yZWFkZXJzKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChwdGhyZWFkX2NvbmRfZGVzdHJveSAoJmxvY2stPndhaXRpbmdfd3JpdGVycykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tfQotLQotLSMgZW5kaWYKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0jIGlmIEhBVkVfUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUKLS0KLS0jICBpZiAhKGRlZmluZWQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIgfHwgZGVmaW5lZCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHJpYnV0ZXM7Ci0tCi0tICBpZiAocHRocmVhZF9tdXRleGF0dHJfaW5pdCAoJmF0dHJpYnV0ZXMpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKCZhdHRyaWJ1dGVzLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9tdXRleF9pbml0ICgmbG9jay0+cmVjbXV0ZXgsICZhdHRyaWJ1dGVzKSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICgmYXR0cmlidXRlcykgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBsb2NrLT5pbml0aWFsaXplZCA9IDE7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0tICAgIHsKLS0gICAgICBpZiAocHRocmVhZF9tdXRleF9sb2NrICgmbG9jay0+Z3VhcmQpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICAgIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0tCWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGxvY2spOwotLSAgICAgIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAoJmxvY2stPmd1YXJkKSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgfQotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmxvY2stPnJlY211dGV4KSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAoJmxvY2stPnJlY211dGV4KSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAocHRocmVhZF9tdXRleF9kZXN0cm95ICgmbG9jay0+cmVjbXV0ZXgpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgbG9jay0+aW5pdGlhbGl6ZWQgPSAwOwotLX0KLS0KLS0jICBlbmRpZgotLQotLSMgZWxzZQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChwdGhyZWFkX211dGV4X2luaXQgKCZsb2NrLT5tdXRleCwgTlVMTCkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBsb2NrLT5vd25lciA9IChwdGhyZWFkX3QpIDA7Ci0tICBsb2NrLT5kZXB0aCA9IDA7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIHB0aHJlYWRfdCBzZWxmID0gcHRocmVhZF9zZWxmICgpOwotLSAgaWYgKGxvY2stPm93bmVyICE9IHNlbGYpCi0tICAgIHsKLS0gICAgICBpZiAocHRocmVhZF9tdXRleF9sb2NrICgmbG9jay0+bXV0ZXgpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICAgIGxvY2stPm93bmVyID0gc2VsZjsKLS0gICAgfQotLSAgaWYgKCsrKGxvY2stPmRlcHRoKSA9PSAwKSAvKiB3cmFwYXJvdW5kPyAqLwotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAobG9jay0+b3duZXIgIT0gcHRocmVhZF9zZWxmICgpKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChsb2NrLT5kZXB0aCA9PSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmICgtLShsb2NrLT5kZXB0aCkgPT0gMCkKLS0gICAgewotLSAgICAgIGxvY2stPm93bmVyID0gKHB0aHJlYWRfdCkgMDsKLS0gICAgICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5tdXRleCkgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgIH0KLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKGxvY2stPm93bmVyICE9IChwdGhyZWFkX3QpIDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJmxvY2stPm11dGV4KSAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS19Ci0tCi0tIyBlbmRpZgotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXN0YXRpYyBjb25zdCBwdGhyZWFkX29uY2VfdCBmcmVzaF9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7Ci0tCi0taW50Ci0tZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCkKLS17Ci0tICAvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgcHRocmVhZF9vbmNlX3QgaXMgYW4gaW50ZWdlciB0eXBlLCBhIGZsb2F0aW5nLXBvaW50Ci0tICAgICB0eXBlLCBhIHBvaW50ZXIgdHlwZSwgb3IgYSBzdHJ1Y3R1cmUgdHlwZS4gICovCi0tICBjaGFyICpmaXJzdGJ5dGUgPSAoY2hhciAqKW9uY2VfY29udHJvbDsKLS0gIGlmICgqZmlyc3RieXRlID09ICooY29uc3QgY2hhciAqKSZmcmVzaF9vbmNlKQotLSAgICB7Ci0tICAgICAgLyogRmlyc3QgdGltZSB1c2Ugb2Ygb25jZV9jb250cm9sLiAgSW52ZXJ0IHRoZSBmaXJzdCBieXRlLiAgKi8KLS0gICAgICAqZmlyc3RieXRlID0gfiAqKGNvbnN0IGNoYXIgKikmZnJlc2hfb25jZTsKLS0gICAgICByZXR1cm4gMTsKLS0gICAgfQotLSAgZWxzZQotLSAgICByZXR1cm4gMDsKLS19Ci0tCi0tI2VuZGlmCi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLQotLSNpZiBVU0VfUFRIX1RIUkVBRFMKLS0KLS0vKiBVc2UgdGhlIEdOVSBQdGggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9vbmNlX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS12b2lkCi0tZ2x0aHJlYWRfb25jZV9jYWxsICh2b2lkICphcmcpCi0tewotLSAgdm9pZCAoKipnbF9vbmNlX3RlbXBfYWRkcikgKHZvaWQpID0gKHZvaWQgKCoqKSAodm9pZCkpIGFyZzsKLS0gIHZvaWQgKCppbml0ZnVuY3Rpb24pICh2b2lkKSA9ICpnbF9vbmNlX3RlbXBfYWRkcjsKLS0gIGluaXRmdW5jdGlvbiAoKTsKLS19Ci0tCi0taW50Ci0tZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAocHRoX29uY2VfdCAqb25jZV9jb250cm9sKQotLXsKLS0gIC8qIFdlIGtub3cgdGhhdCBwdGhfb25jZV90IGlzIGFuIGludGVnZXIgdHlwZS4gICovCi0tICBpZiAoKm9uY2VfY29udHJvbCA9PSBQVEhfT05DRV9JTklUKQotLSAgICB7Ci0tICAgICAgLyogRmlyc3QgdGltZSB1c2Ugb2Ygb25jZV9jb250cm9sLiAgSW52ZXJ0IHRoZSBtYXJrZXIuICAqLwotLSAgICAgICpvbmNlX2NvbnRyb2wgPSB+IFBUSF9PTkNFX0lOSVQ7Ci0tICAgICAgcmV0dXJuIDE7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgcmV0dXJuIDA7Ci0tfQotLQotLSNlbmRpZgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jaWYgVVNFX1NPTEFSSVNfVEhSRUFEUwotLQotLS8qIFVzZSB0aGUgb2xkIFNvbGFyaXMgdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAobXV0ZXhfaW5pdCAoJmxvY2stPm11dGV4LCBVU1lOQ19USFJFQUQsIE5VTEwpICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgbG9jay0+b3duZXIgPSAodGhyZWFkX3QpIDA7Ci0tICBsb2NrLT5kZXB0aCA9IDA7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIHRocmVhZF90IHNlbGYgPSB0aHJfc2VsZiAoKTsKLS0gIGlmIChsb2NrLT5vd25lciAhPSBzZWxmKQotLSAgICB7Ci0tICAgICAgaWYgKG11dGV4X2xvY2sgKCZsb2NrLT5tdXRleCkgIT0gMCkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbG9jay0+b3duZXIgPSBzZWxmOwotLSAgICB9Ci0tICBpZiAoKysobG9jay0+ZGVwdGgpID09IDApIC8qIHdyYXBhcm91bmQ/ICovCi0tICAgIGFib3J0ICgpOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChsb2NrLT5vd25lciAhPSB0aHJfc2VsZiAoKSkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAobG9jay0+ZGVwdGggPT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAoLS0obG9jay0+ZGVwdGgpID09IDApCi0tICAgIHsKLS0gICAgICBsb2NrLT5vd25lciA9ICh0aHJlYWRfdCkgMDsKLS0gICAgICBpZiAobXV0ZXhfdW5sb2NrICgmbG9jay0+bXV0ZXgpICE9IDApCi0tCWFib3J0ICgpOwotLSAgICB9Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChsb2NrLT5vd25lciAhPSAodGhyZWFkX3QpIDApCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKG11dGV4X2Rlc3Ryb3kgKCZsb2NrLT5tdXRleCkgIT0gMCkKLS0gICAgYWJvcnQgKCk7Ci0tfQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXZvaWQKLS1nbHRocmVhZF9vbmNlIChnbF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRmdW5jdGlvbikgKHZvaWQpKQotLXsKLS0gIGlmICghb25jZV9jb250cm9sLT5pbml0ZWQpCi0tICAgIHsKLS0gICAgICAvKiBVc2UgdGhlIG11dGV4IHRvIGd1YXJhbnRlZSB0aGF0IGlmIGFub3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgY2FsbGluZwotLQkgdGhlIGluaXRmdW5jdGlvbiwgdGhpcyB0aHJlYWQgd2FpdHMgdW50aWwgaXQncyBmaW5pc2hlZC4gICovCi0tICAgICAgaWYgKG11dGV4X2xvY2sgKCZvbmNlX2NvbnRyb2wtPm11dGV4KSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgICBpZiAoIW9uY2VfY29udHJvbC0+aW5pdGVkKQotLQl7Ci0tCSAgb25jZV9jb250cm9sLT5pbml0ZWQgPSAxOwotLQkgIGluaXRmdW5jdGlvbiAoKTsKLS0JfQotLSAgICAgIGlmIChtdXRleF91bmxvY2sgKCZvbmNlX2NvbnRyb2wtPm11dGV4KSAhPSAwKQotLQlhYm9ydCAoKTsKLS0gICAgfQotLX0KLS0KLS1pbnQKLS1nbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkIChnbF9vbmNlX3QgKm9uY2VfY29udHJvbCkKLS17Ci0tICAvKiBXZSBrbm93IHRoYXQgZ2xfb25jZV90IGNvbnRhaW5zIGFuIGludGVnZXIgdHlwZS4gICovCi0tICBpZiAoIW9uY2VfY29udHJvbC0+aW5pdGVkKQotLSAgICB7Ci0tICAgICAgLyogRmlyc3QgdGltZSB1c2Ugb2Ygb25jZV9jb250cm9sLiAgSW52ZXJ0IHRoZSBtYXJrZXIuICAqLwotLSAgICAgIG9uY2VfY29udHJvbC0+aW5pdGVkID0gfiAwOwotLSAgICAgIHJldHVybiAxOwotLSAgICB9Ci0tICBlbHNlCi0tICAgIHJldHVybiAwOwotLX0KLS0KLS0jZW5kaWYKLS0KLS0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0tCi0tI2lmIFVTRV9XSU4zMl9USFJFQURTCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdm9pZAotLWdsdGhyZWFkX2xvY2tfaW5pdCAoZ2xfbG9ja190ICpsb2NrKQotLXsKLS0gIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0gIGxvY2stPmd1YXJkLmRvbmUgPSAxOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfbG9ja19sb2NrIChnbF9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotLSAgICB7Ci0tICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50ICgmbG9jay0+Z3VhcmQuc3RhcnRlZCkgPT0gMCkKLS0JLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBuZWVkIHRoaXMgbG9jay4gIEluaXRpYWxpemUgaXQuICAqLwotLQlnbHRocmVhZF9sb2NrX2luaXQgKGxvY2spOwotLSAgICAgIGVsc2UKLS0JLyogWWllbGQgdGhlIENQVSB3aGlsZSB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZCB0byBmaW5pc2gKLS0JICAgaW5pdGlhbGl6aW5nIHRoaXMgbG9jay4gICovCi0tCXdoaWxlICghbG9jay0+Z3VhcmQuZG9uZSkKLS0JICBTbGVlcCAoMCk7Ci0tICAgIH0KLS0gIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9sb2NrX3VubG9jayAoZ2xfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+Z3VhcmQuZG9uZSkKLS0gICAgYWJvcnQgKCk7Ci0tICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfbG9ja19kZXN0cm95IChnbF9sb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotLSAgICBhYm9ydCAoKTsKLS0gIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLSAgbG9jay0+Z3VhcmQuZG9uZSA9IDA7Ci0tfQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXN0YXRpYyBpbmxpbmUgdm9pZAotLWdsX3dhaXRxdWV1ZV9pbml0IChnbF93YWl0cXVldWVfdCAqd3EpCi0tewotLSAgd3EtPmFycmF5ID0gTlVMTDsKLS0gIHdxLT5jb3VudCA9IDA7Ci0tICB3cS0+YWxsb2MgPSAwOwotLSAgd3EtPm9mZnNldCA9IDA7Ci0tfQotLQotLS8qIEVucXVldWVzIHRoZSBjdXJyZW50IHRocmVhZCwgcmVwcmVzZW50ZWQgYnkgYW4gZXZlbnQsIGluIGEgd2FpdCBxdWV1ZS4KLS0gICBSZXR1cm5zIElOVkFMSURfSEFORExFX1ZBTFVFIGlmIGFuIGFsbG9jYXRpb24gZmFpbHVyZSBvY2N1cnMuICAqLwotLXN0YXRpYyBIQU5ETEUKLS1nbF93YWl0cXVldWVfYWRkIChnbF93YWl0cXVldWVfdCAqd3EpCi0tewotLSAgSEFORExFIGV2ZW50OwotLSAgdW5zaWduZWQgaW50IGluZGV4OwotLQotLSAgaWYgKHdxLT5jb3VudCA9PSB3cS0+YWxsb2MpCi0tICAgIHsKLS0gICAgICB1bnNpZ25lZCBpbnQgbmV3X2FsbG9jID0gMiAqIHdxLT5hbGxvYyArIDE7Ci0tICAgICAgSEFORExFICpuZXdfYXJyYXkgPQotLQkoSEFORExFICopIHJlYWxsb2MgKHdxLT5hcnJheSwgbmV3X2FsbG9jICogc2l6ZW9mIChIQU5ETEUpKTsKLS0gICAgICBpZiAobmV3X2FycmF5ID09IE5VTEwpCi0tCS8qIE5vIG1vcmUgbWVtb3J5LiAgKi8KLS0JcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOwotLSAgICAgIC8qIE5vdyBpcyBhIGdvb2Qgb3Bwb3J0dW5pdHkgdG8gcm90YXRlIHRoZSBhcnJheSBzbyB0aGF0IGl0cyBjb250ZW50cwotLQkgc3RhcnRzIGF0IG9mZnNldCAwLiAgKi8KLS0gICAgICBpZiAod3EtPm9mZnNldCA+IDApCi0tCXsKLS0JICB1bnNpZ25lZCBpbnQgb2xkX2NvdW50ID0gd3EtPmNvdW50OwotLQkgIHVuc2lnbmVkIGludCBvbGRfYWxsb2MgPSB3cS0+YWxsb2M7Ci0tCSAgdW5zaWduZWQgaW50IG9sZF9vZmZzZXQgPSB3cS0+b2Zmc2V0OwotLQkgIHVuc2lnbmVkIGludCBpOwotLQkgIGlmIChvbGRfb2Zmc2V0ICsgb2xkX2NvdW50ID4gb2xkX2FsbG9jKQotLQkgICAgewotLQkgICAgICB1bnNpZ25lZCBpbnQgbGltaXQgPSBvbGRfb2Zmc2V0ICsgb2xkX2NvdW50IC0gb2xkX2FsbG9jOwotLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKykKLS0JCW5ld19hcnJheVtvbGRfYWxsb2MgKyBpXSA9IG5ld19hcnJheVtpXTsKLS0JICAgIH0KLS0JICBmb3IgKGkgPSAwOyBpIDwgb2xkX2NvdW50OyBpKyspCi0tCSAgICBuZXdfYXJyYXlbaV0gPSBuZXdfYXJyYXlbb2xkX29mZnNldCArIGldOwotLQkgIHdxLT5vZmZzZXQgPSAwOwotLQl9Ci0tICAgICAgd3EtPmFycmF5ID0gbmV3X2FycmF5OwotLSAgICAgIHdxLT5hbGxvYyA9IG5ld19hbGxvYzsKLS0gICAgfQotLSAgZXZlbnQgPSBDcmVhdGVFdmVudCAoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOwotLSAgaWYgKGV2ZW50ID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotLSAgICAvKiBObyB3YXkgdG8gYWxsb2NhdGUgYW4gZXZlbnQuICAqLwotLSAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0tICBpbmRleCA9IHdxLT5vZmZzZXQgKyB3cS0+Y291bnQ7Ci0tICBpZiAoaW5kZXggPj0gd3EtPmFsbG9jKQotLSAgICBpbmRleCAtPSB3cS0+YWxsb2M7Ci0tICB3cS0+YXJyYXlbaW5kZXhdID0gZXZlbnQ7Ci0tICB3cS0+Y291bnQrKzsKLS0gIHJldHVybiBldmVudDsKLS19Ci0tCi0tLyogTm90aWZpZXMgdGhlIGZpcnN0IHRocmVhZCBmcm9tIGEgd2FpdCBxdWV1ZSBhbmQgZGVxdWV1ZXMgaXQuICAqLwotLXN0YXRpYyBpbmxpbmUgdm9pZAotLWdsX3dhaXRxdWV1ZV9ub3RpZnlfZmlyc3QgKGdsX3dhaXRxdWV1ZV90ICp3cSkKLS17Ci0tICBTZXRFdmVudCAod3EtPmFycmF5W3dxLT5vZmZzZXQgKyAwXSk7Ci0tICB3cS0+b2Zmc2V0Kys7Ci0tICB3cS0+Y291bnQtLTsKLS0gIGlmICh3cS0+Y291bnQgPT0gMCB8fCB3cS0+b2Zmc2V0ID09IHdxLT5hbGxvYykKLS0gICAgd3EtPm9mZnNldCA9IDA7Ci0tfQotLQotLS8qIE5vdGlmaWVzIGFsbCB0aHJlYWRzIGZyb20gYSB3YWl0IHF1ZXVlIGFuZCBkZXF1ZXVlcyB0aGVtIGFsbC4gICovCi0tc3RhdGljIGlubGluZSB2b2lkCi0tZ2xfd2FpdHF1ZXVlX25vdGlmeV9hbGwgKGdsX3dhaXRxdWV1ZV90ICp3cSkKLS17Ci0tICB1bnNpZ25lZCBpbnQgaTsKLS0KLS0gIGZvciAoaSA9IDA7IGkgPCB3cS0+Y291bnQ7IGkrKykKLS0gICAgewotLSAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IHdxLT5vZmZzZXQgKyBpOwotLSAgICAgIGlmIChpbmRleCA+PSB3cS0+YWxsb2MpCi0tCWluZGV4IC09IHdxLT5hbGxvYzsKLS0gICAgICBTZXRFdmVudCAod3EtPmFycmF5W2luZGV4XSk7Ci0tICAgIH0KLS0gIHdxLT5jb3VudCA9IDA7Ci0tICB3cS0+b2Zmc2V0ID0gMDsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19pbml0IChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICBnbF93YWl0cXVldWVfaW5pdCAoJmxvY2stPndhaXRpbmdfcmVhZGVycyk7Ci0tICBnbF93YWl0cXVldWVfaW5pdCAoJmxvY2stPndhaXRpbmdfd3JpdGVycyk7Ci0tICBsb2NrLT5ydW5jb3VudCA9IDA7Ci0tICBsb2NrLT5ndWFyZC5kb25lID0gMTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+Z3VhcmQuZG9uZSkKLS0gICAgewotLSAgICAgIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCAoJmxvY2stPmd1YXJkLnN0YXJ0ZWQpID09IDApCi0tCS8qIFRoaXMgdGhyZWFkIGlzIHRoZSBmaXJzdCBvbmUgdG8gbmVlZCB0aGlzIGxvY2suICBJbml0aWFsaXplIGl0LiAgKi8KLS0JZ2x0aHJlYWRfcndsb2NrX2luaXQgKGxvY2spOwotLSAgICAgIGVsc2UKLS0JLyogWWllbGQgdGhlIENQVSB3aGlsZSB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZCB0byBmaW5pc2gKLS0JICAgaW5pdGlhbGl6aW5nIHRoaXMgbG9jay4gICovCi0tCXdoaWxlICghbG9jay0+Z3VhcmQuZG9uZSkKLS0JICBTbGVlcCAoMCk7Ci0tICAgIH0KLS0gIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICAvKiBUZXN0IHdoZXRoZXIgb25seSByZWFkZXJzIGFyZSBjdXJyZW50bHkgcnVubmluZywgYW5kIHdoZXRoZXIgdGhlIHJ1bmNvdW50Ci0tICAgICBmaWVsZCB3aWxsIG5vdCBvdmVyZmxvdy4gICovCi0tICBpZiAoIShsb2NrLT5ydW5jb3VudCArIDEgPiAwKSkKLS0gICAgewotLSAgICAgIC8qIFRoaXMgdGhyZWFkIGhhcyB0byB3YWl0IGZvciBhIHdoaWxlLiAgRW5xdWV1ZSBpdCBhbW9uZyB0aGUKLS0JIHdhaXRpbmdfcmVhZGVycy4gICovCi0tICAgICAgSEFORExFIGV2ZW50ID0gZ2xfd2FpdHF1ZXVlX2FkZCAoJmxvY2stPndhaXRpbmdfcmVhZGVycyk7Ci0tICAgICAgaWYgKGV2ZW50ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotLQl7Ci0tCSAgRFdPUkQgcmVzdWx0OwotLQkgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tCSAgLyogV2FpdCB1bnRpbCBhbm90aGVyIHRocmVhZCBzaWduYWxzIHRoaXMgZXZlbnQuICAqLwotLQkgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QgKGV2ZW50LCBJTkZJTklURSk7Ci0tCSAgaWYgKHJlc3VsdCA9PSBXQUlUX0ZBSUxFRCB8fCByZXN1bHQgPT0gV0FJVF9USU1FT1VUKQotLQkgICAgYWJvcnQgKCk7Ci0tCSAgQ2xvc2VIYW5kbGUgKGV2ZW50KTsKLS0JICAvKiBUaGUgdGhyZWFkIHdoaWNoIHNpZ25hbGxlZCB0aGUgZXZlbnQgYWxyZWFkeSBkaWQgdGhlIGJvb2trZWVwaW5nOgotLQkgICAgIHJlbW92ZWQgdXMgZnJvbSB0aGUgd2FpdGluZ19yZWFkZXJzLCBpbmNyZW1lbnRlZCBsb2NrLT5ydW5jb3VudC4gICovCi0tCSAgaWYgKCEobG9jay0+cnVuY291bnQgPiAwKSkKLS0JICAgIGFib3J0ICgpOwotLQkgIHJldHVybjsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIC8qIEFsbG9jYXRpb24gZmFpbHVyZS4gIFdlaXJkLiAgKi8KLS0JICBkbwotLQkgICAgewotLQkgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLQkgICAgICBTbGVlcCAoMSk7Ci0tCSAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tCSAgICB9Ci0tCSAgd2hpbGUgKCEobG9jay0+cnVuY291bnQgKyAxID4gMCkpOwotLQl9Ci0tICAgIH0KLS0gIGxvY2stPnJ1bmNvdW50Kys7Ci0tICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotLSAgICB7Ci0tICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50ICgmbG9jay0+Z3VhcmQuc3RhcnRlZCkgPT0gMCkKLS0JLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBuZWVkIHRoaXMgbG9jay4gIEluaXRpYWxpemUgaXQuICAqLwotLQlnbHRocmVhZF9yd2xvY2tfaW5pdCAobG9jayk7Ci0tICAgICAgZWxzZQotLQkvKiBZaWVsZCB0aGUgQ1BVIHdoaWxlIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotLQkgICBpbml0aWFsaXppbmcgdGhpcyBsb2NrLiAgKi8KLS0Jd2hpbGUgKCFsb2NrLT5ndWFyZC5kb25lKQotLQkgIFNsZWVwICgwKTsKLS0gICAgfQotLSAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0gIC8qIFRlc3Qgd2hldGhlciBubyByZWFkZXJzIG9yIHdyaXRlcnMgYXJlIGN1cnJlbnRseSBydW5uaW5nLiAgKi8KLS0gIGlmICghKGxvY2stPnJ1bmNvdW50ID09IDApKQotLSAgICB7Ci0tICAgICAgLyogVGhpcyB0aHJlYWQgaGFzIHRvIHdhaXQgZm9yIGEgd2hpbGUuICBFbnF1ZXVlIGl0IGFtb25nIHRoZQotLQkgd2FpdGluZ193cml0ZXJzLiAgKi8KLS0gICAgICBIQU5ETEUgZXZlbnQgPSBnbF93YWl0cXVldWVfYWRkICgmbG9jay0+d2FpdGluZ193cml0ZXJzKTsKLS0gICAgICBpZiAoZXZlbnQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0tCXsKLS0JICBEV09SRCByZXN1bHQ7Ci0tCSAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0JICAvKiBXYWl0IHVudGlsIGFub3RoZXIgdGhyZWFkIHNpZ25hbHMgdGhpcyBldmVudC4gICovCi0tCSAgcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIElORklOSVRFKTsKLS0JICBpZiAocmVzdWx0ID09IFdBSVRfRkFJTEVEIHx8IHJlc3VsdCA9PSBXQUlUX1RJTUVPVVQpCi0tCSAgICBhYm9ydCAoKTsKLS0JICBDbG9zZUhhbmRsZSAoZXZlbnQpOwotLQkgIC8qIFRoZSB0aHJlYWQgd2hpY2ggc2lnbmFsbGVkIHRoZSBldmVudCBhbHJlYWR5IGRpZCB0aGUgYm9va2tlZXBpbmc6Ci0tCSAgICAgcmVtb3ZlZCB1cyBmcm9tIHRoZSB3YWl0aW5nX3dyaXRlcnMsIHNldCBsb2NrLT5ydW5jb3VudCA9IC0xLiAgKi8KLS0JICBpZiAoIShsb2NrLT5ydW5jb3VudCA9PSAtMSkpCi0tCSAgICBhYm9ydCAoKTsKLS0JICByZXR1cm47Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICAvKiBBbGxvY2F0aW9uIGZhaWx1cmUuICBXZWlyZC4gICovCi0tCSAgZG8KLS0JICAgIHsKLS0JICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS0JICAgICAgU2xlZXAgKDEpOwotLQkgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLQkgICAgfQotLQkgIHdoaWxlICghKGxvY2stPnJ1bmNvdW50ID09IDApKTsKLS0JfQotLSAgICB9Ci0tICBsb2NrLT5ydW5jb3VudC0tOyAvKiBydW5jb3VudCBiZWNvbWVzIC0xICovCi0tICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLX0KLS0KLS12b2lkCi0tZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi0tewotLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotLSAgICBhYm9ydCAoKTsKLS0gIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICBpZiAobG9jay0+cnVuY291bnQgPCAwKQotLSAgICB7Ci0tICAgICAgLyogRHJvcCBhIHdyaXRlciBsb2NrLiAgKi8KLS0gICAgICBpZiAoIShsb2NrLT5ydW5jb3VudCA9PSAtMSkpCi0tCWFib3J0ICgpOwotLSAgICAgIGxvY2stPnJ1bmNvdW50ID0gMDsKLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogRHJvcCBhIHJlYWRlciBsb2NrLiAgKi8KLS0gICAgICBpZiAoIShsb2NrLT5ydW5jb3VudCA+IDApKQotLQlhYm9ydCAoKTsKLS0gICAgICBsb2NrLT5ydW5jb3VudC0tOwotLSAgICB9Ci0tICBpZiAobG9jay0+cnVuY291bnQgPT0gMCkKLS0gICAgewotLSAgICAgIC8qIFBPU0lYIHJlY29tbWVuZHMgdGhhdCAid3JpdGUgbG9ja3Mgc2hhbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgcmVhZAotLQkgbG9ja3MiLCB0byBhdm9pZCAid3JpdGVyIHN0YXJ2YXRpb24iLiAgKi8KLS0gICAgICBpZiAobG9jay0+d2FpdGluZ193cml0ZXJzLmNvdW50ID4gMCkKLS0JewotLQkgIC8qIFdha2UgdXAgb25lIG9mIHRoZSB3YWl0aW5nIHdyaXRlcnMuICAqLwotLQkgIGxvY2stPnJ1bmNvdW50LS07Ci0tCSAgZ2xfd2FpdHF1ZXVlX25vdGlmeV9maXJzdCAoJmxvY2stPndhaXRpbmdfd3JpdGVycyk7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICAvKiBXYWtlIHVwIGFsbCB3YWl0aW5nIHJlYWRlcnMuICAqLwotLQkgIGxvY2stPnJ1bmNvdW50ICs9IGxvY2stPndhaXRpbmdfcmVhZGVycy5jb3VudDsKLS0JICBnbF93YWl0cXVldWVfbm90aWZ5X2FsbCAoJmxvY2stPndhaXRpbmdfcmVhZGVycyk7Ci0tCX0KLS0gICAgfQotLSAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAoIWxvY2stPmd1YXJkLmRvbmUpCi0tICAgIGFib3J0ICgpOwotLSAgaWYgKGxvY2stPnJ1bmNvdW50ICE9IDApCi0tICAgIGFib3J0ICgpOwotLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tICBpZiAobG9jay0+d2FpdGluZ19yZWFkZXJzLmFycmF5ICE9IE5VTEwpCi0tICAgIGZyZWUgKGxvY2stPndhaXRpbmdfcmVhZGVycy5hcnJheSk7Ci0tICBpZiAobG9jay0+d2FpdGluZ193cml0ZXJzLmFycmF5ICE9IE5VTEwpCi0tICAgIGZyZWUgKGxvY2stPndhaXRpbmdfd3JpdGVycy5hcnJheSk7Ci0tICBsb2NrLT5ndWFyZC5kb25lID0gMDsKLS19Ci0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi0tewotLSAgbG9jay0+b3duZXIgPSAwOwotLSAgbG9jay0+ZGVwdGggPSAwOwotLSAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLSAgbG9jay0+Z3VhcmQuZG9uZSA9IDE7Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmICghbG9jay0+Z3VhcmQuZG9uZSkKLS0gICAgewotLSAgICAgIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCAoJmxvY2stPmd1YXJkLnN0YXJ0ZWQpID09IDApCi0tCS8qIFRoaXMgdGhyZWFkIGlzIHRoZSBmaXJzdCBvbmUgdG8gbmVlZCB0aGlzIGxvY2suICBJbml0aWFsaXplIGl0LiAgKi8KLS0JZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAobG9jayk7Ci0tICAgICAgZWxzZQotLQkvKiBZaWVsZCB0aGUgQ1BVIHdoaWxlIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotLQkgICBpbml0aWFsaXppbmcgdGhpcyBsb2NrLiAgKi8KLS0Jd2hpbGUgKCFsb2NrLT5ndWFyZC5kb25lKQotLQkgIFNsZWVwICgwKTsKLS0gICAgfQotLSAgewotLSAgICBEV09SRCBzZWxmID0gR2V0Q3VycmVudFRocmVhZElkICgpOwotLSAgICBpZiAobG9jay0+b3duZXIgIT0gc2VsZikKLS0gICAgICB7Ci0tCUVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0tCWxvY2stPm93bmVyID0gc2VsZjsKLS0gICAgICB9Ci0tICAgIGlmICgrKyhsb2NrLT5kZXB0aCkgPT0gMCkgLyogd3JhcGFyb3VuZD8gKi8KLS0gICAgICBhYm9ydCAoKTsKLS0gIH0KLS19Ci0tCi0tdm9pZAotLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLS17Ci0tICBpZiAobG9jay0+b3duZXIgIT0gR2V0Q3VycmVudFRocmVhZElkICgpKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmIChsb2NrLT5kZXB0aCA9PSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIGlmICgtLShsb2NrLT5kZXB0aCkgPT0gMCkKLS0gICAgewotLSAgICAgIGxvY2stPm93bmVyID0gMDsKLS0gICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLSAgICB9Ci0tfQotLQotLXZvaWQKLS1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotLXsKLS0gIGlmIChsb2NrLT5vd25lciAhPSAwKQotLSAgICBhYm9ydCAoKTsKLS0gIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotLSAgbG9jay0+Z3VhcmQuZG9uZSA9IDA7Ci0tfQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXZvaWQKLS1nbHRocmVhZF9vbmNlIChnbF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRmdW5jdGlvbikgKHZvaWQpKQotLXsKLS0gIGlmIChvbmNlX2NvbnRyb2wtPmluaXRlZCA8PSAwKQotLSAgICB7Ci0tICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50ICgmb25jZV9jb250cm9sLT5zdGFydGVkKSA9PSAwKQotLQl7Ci0tCSAgLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBjb21lIHRvIHRoaXMgb25jZV9jb250cm9sLiAgKi8KLS0JICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmb25jZV9jb250cm9sLT5sb2NrKTsKLS0JICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJm9uY2VfY29udHJvbC0+bG9jayk7Ci0tCSAgb25jZV9jb250cm9sLT5pbml0ZWQgPSAwOwotLQkgIGluaXRmdW5jdGlvbiAoKTsKLS0JICBvbmNlX2NvbnRyb2wtPmluaXRlZCA9IDE7Ci0tCSAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZvbmNlX2NvbnRyb2wtPmxvY2spOwotLQl9Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgLyogVW5kbyBsYXN0IG9wZXJhdGlvbi4gICovCi0tCSAgSW50ZXJsb2NrZWREZWNyZW1lbnQgKCZvbmNlX2NvbnRyb2wtPnN0YXJ0ZWQpOwotLQkgIC8qIFNvbWUgb3RoZXIgdGhyZWFkIGhhcyBhbHJlYWR5IHN0YXJ0ZWQgdGhlIGluaXRpYWxpemF0aW9uLgotLQkgICAgIFlpZWxkIHRoZSBDUFUgd2hpbGUgd2FpdGluZyBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBmaW5pc2gKLS0JICAgICBpbml0aWFsaXppbmcgYW5kIHRha2luZyB0aGUgbG9jay4gICovCi0tCSAgd2hpbGUgKG9uY2VfY29udHJvbC0+aW5pdGVkIDwgMCkKLS0JICAgIFNsZWVwICgwKTsKLS0JICBpZiAob25jZV9jb250cm9sLT5pbml0ZWQgPD0gMCkKLS0JICAgIHsKLS0JICAgICAgLyogVGFrZSB0aGUgbG9jay4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBvdGhlciB0aHJlYWQgaGFzCi0tCQkgZmluaXNoZWQgY2FsbGluZyB0aGUgaW5pdGZ1bmN0aW9uLiAgKi8KLS0JICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZvbmNlX2NvbnRyb2wtPmxvY2spOwotLQkgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJm9uY2VfY29udHJvbC0+bG9jayk7Ci0tCSAgICAgIGlmICghKG9uY2VfY29udHJvbC0+aW5pdGVkID4gMCkpCi0tCQlhYm9ydCAoKTsKLS0JICAgIH0KLS0JfQotLSAgICB9Ci0tfQotLQotLSNlbmRpZgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0tLSBhL2ludGwvbG9jay5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMTA1ICswLDAgQEAKLS0vKiBMb2NraW5nIGluIG11bHRpdGhyZWFkZWQgc2l0dWF0aW9ucy4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDA1LgotLSAgIEJhc2VkIG9uIEdDQydzIGd0aHItcG9zaXguaCwgZ3Roci1wb3NpeDk1LmgsIGd0aHItc29sYXJpcy5oLAotLSAgIGd0aHItd2luMzIuaC4gICovCi0tCi0tLyogVGhpcyBmaWxlIGNvbnRhaW5zIGxvY2tpbmcgcHJpbWl0aXZlcyBmb3IgdXNlIHdpdGggYSBnaXZlbiB0aHJlYWQgbGlicmFyeS4KLS0gICBJdCBkb2VzIG5vdCBjb250YWluIHByaW1pdGl2ZXMgZm9yIGNyZWF0aW5nIHRocmVhZHMgb3IgZm9yIG90aGVyCi0tICAgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCi0tCi0tICAgTm9ybWFsIChub24tcmVjdXJzaXZlKSBsb2NrczoKLS0gICAgIFR5cGU6ICAgICAgICAgICAgICAgIGdsX2xvY2tfdAotLSAgICAgRGVjbGFyYXRpb246ICAgICAgICAgZ2xfbG9ja19kZWZpbmUoZXh0ZXJuLCBuYW1lKQotLSAgICAgSW5pdGlhbGl6ZXI6ICAgICAgICAgZ2xfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoLCBuYW1lKQotLSAgICAgSW5pdGlhbGl6YXRpb246ICAgICAgZ2xfbG9ja19pbml0IChuYW1lKTsKLS0gICAgIFRha2luZyB0aGUgbG9jazogICAgIGdsX2xvY2tfbG9jayAobmFtZSk7Ci0tICAgICBSZWxlYXNpbmcgdGhlIGxvY2s6ICBnbF9sb2NrX3VubG9jayAobmFtZSk7Ci0tICAgICBEZS1pbml0aWFsaXphdGlvbjogICBnbF9sb2NrX2Rlc3Ryb3kgKG5hbWUpOwotLQotLSAgIFJlYWQtV3JpdGUgKG5vbi1yZWN1cnNpdmUpIGxvY2tzOgotLSAgICAgVHlwZTogICAgICAgICAgICAgICAgZ2xfcndsb2NrX3QKLS0gICAgIERlY2xhcmF0aW9uOiAgICAgICAgIGdsX3J3bG9ja19kZWZpbmUoZXh0ZXJuLCBuYW1lKQotLSAgICAgSW5pdGlhbGl6ZXI6ICAgICAgICAgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZCgsIG5hbWUpCi0tICAgICBJbml0aWFsaXphdGlvbjogICAgICBnbF9yd2xvY2tfaW5pdCAobmFtZSk7Ci0tICAgICBUYWtpbmcgdGhlIGxvY2s6ICAgICBnbF9yd2xvY2tfcmRsb2NrIChuYW1lKTsKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3J3bG9ja193cmxvY2sgKG5hbWUpOwotLSAgICAgUmVsZWFzaW5nIHRoZSBsb2NrOiAgZ2xfcndsb2NrX3VubG9jayAobmFtZSk7Ci0tICAgICBEZS1pbml0aWFsaXphdGlvbjogICBnbF9yd2xvY2tfZGVzdHJveSAobmFtZSk7Ci0tCi0tICAgUmVjdXJzaXZlIGxvY2tzOgotLSAgICAgVHlwZTogICAgICAgICAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfdAotLSAgICAgRGVjbGFyYXRpb246ICAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKGV4dGVybiwgbmFtZSkKLS0gICAgIEluaXRpYWxpemVyOiAgICAgICAgIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZCgsIG5hbWUpCi0tICAgICBJbml0aWFsaXphdGlvbjogICAgICBnbF9yZWN1cnNpdmVfbG9ja19pbml0IChuYW1lKTsKLS0gICAgIFRha2luZyB0aGUgbG9jazogICAgIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKG5hbWUpOwotLSAgICAgUmVsZWFzaW5nIHRoZSBsb2NrOiAgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChuYW1lKTsKLS0gICAgIERlLWluaXRpYWxpemF0aW9uOiAgIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKG5hbWUpOwotLQotLSAgT25jZS1vbmx5IGV4ZWN1dGlvbjoKLS0gICAgIFR5cGU6ICAgICAgICAgICAgICAgIGdsX29uY2VfdAotLSAgICAgSW5pdGlhbGl6ZXI6ICAgICAgICAgZ2xfb25jZV9kZWZpbmUoZXh0ZXJuLCBuYW1lKQotLSAgICAgRXhlY3V0aW9uOiAgICAgICAgICAgZ2xfb25jZSAobmFtZSwgaW5pdGZ1bmN0aW9uKTsKLS0qLwotLQotLQotLSNpZm5kZWYgX0xPQ0tfSAotLSNkZWZpbmUgX0xPQ0tfSAotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jaWYgVVNFX1BPU0lYX1RIUkVBRFMKLS0KLS0vKiBVc2UgdGhlIFBPU0lYIHRocmVhZHMgbGlicmFyeS4gICovCi0tCi0tIyBpbmNsdWRlIDxwdGhyZWFkLmg+Ci0tIyBpbmNsdWRlIDxzdGRsaWIuaD4KLS0KLS0jIGlmZGVmIF9fY3BsdXNwbHVzCi0tZXh0ZXJuICJDIiB7Ci0tIyBlbmRpZgotLQotLSMgaWYgUFRIUkVBRF9JTl9VU0VfREVURUNUSU9OX0hBUkQKLS0KLS0vKiBUaGUgcHRocmVhZF9pbl91c2UoKSBkZXRlY3Rpb24gbmVlZHMgdG8gYmUgZG9uZSBhdCBydW50aW1lLiAgKi8KLS0jICBkZWZpbmUgcHRocmVhZF9pbl91c2UoKSBcCi0tICAgICBnbHRocmVhZF9pbl91c2UgKCkKLS1leHRlcm4gaW50IGdsdGhyZWFkX2luX3VzZSAodm9pZCk7Ci0tCi0tIyBlbmRpZgotLQotLSMgaWYgVVNFX1BPU0lYX1RIUkVBRFNfV0VBSwotLQotLS8qIFVzZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIFBPU0lYIHRocmVhZHMgbGlicmFyeS4gICovCi0tCi0tLyogV2VhayByZWZlcmVuY2VzIGF2b2lkIGRyYWdnaW5nIGluIGV4dGVybmFsIGxpYnJhcmllcyBpZiB0aGUgb3RoZXIgcGFydHMKLS0gICBvZiB0aGUgcHJvZ3JhbSBkb24ndCB1c2UgdGhlbS4gIEhlcmUgd2UgdXNlIHRoZW0sIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAotLSAgIGV2ZXJ5IHByb2dyYW0gdGhhdCB1c2VzIGxpYmludGwgdG8gZGVwZW5kIG9uIGxpYnB0aHJlYWQuICBUaGlzIGFzc3VtZXMKLS0gICB0aGF0IGxpYnB0aHJlYWQgd291bGQgbm90IGJlIGxvYWRlZCBhZnRlciBsaWJpbnRsOyBpLmUuIGlmIGxpYmludGwgaXMKLS0gICBsb2FkZWQgZmlyc3QsIGJ5IGFuIGV4ZWN1dGFibGUgdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gbGlicHRocmVhZCwgYW5kCi0tICAgdGhlbiBhIG1vZHVsZSBpcyBkeW5hbWljYWxseSBsb2FkZWQgdGhhdCBkZXBlbmRzIG9uIGxpYnB0aHJlYWQsIGxpYmludGwKLS0gICB3aWxsIG5vdCBiZSBtdWx0aXRocmVhZC1zYWZlLiAgKi8KLS0KLS0vKiBUaGUgd2F5IHRvIHRlc3QgYXQgcnVudGltZSB3aGV0aGVyIGxpYnB0aHJlYWQgaXMgcHJlc2VudCBpcyB0byB0ZXN0Ci0tICAgd2hldGhlciBhIGZ1bmN0aW9uIHBvaW50ZXIncyB2YWx1ZSwgc3VjaCBhcyAmcHRocmVhZF9tdXRleF9pbml0LCBpcwotLSAgIG5vbi1OVUxMLiAgSG93ZXZlciwgc29tZSB2ZXJzaW9ucyBvZiBHQ0MgaGF2ZSBhIGJ1ZyB0aHJvdWdoIHdoaWNoLCBpbgotLSAgIFBJQyBtb2RlLCAmZm9vICE9IE5VTEwgYWx3YXlzIGV2YWx1YXRlcyB0byB0cnVlIGlmIHRoZXJlIGlzIGEgZGlyZWN0Ci0tICAgY2FsbCB0byBmb28oLi4uKSBpbiB0aGUgc2FtZSBmdW5jdGlvbi4gIFRvIGF2b2lkIHRoaXMsIHdlIHRlc3QgdGhlCi0tICAgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIGluIGxpYnB0aHJlYWQgdGhhdCB3ZSBkb24ndCB1c2UuICAqLwotLQotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhfaW5pdAotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhfbG9jawotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhfdW5sb2NrCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleF9kZXN0cm95Ci0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfaW5pdAotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfcndsb2NrX3JkbG9jawotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfcndsb2NrX3dybG9jawotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfcndsb2NrX3VubG9jawotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX29uY2UKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX2NvbmRfaW5pdAotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfY29uZF93YWl0Ci0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9jb25kX3NpZ25hbAotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfY29uZF9icm9hZGNhc3QKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX2NvbmRfZGVzdHJveQotLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQKLS0jICBwcmFnbWEgd2VhayBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlCi0tIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveQotLSMgIGlmbmRlZiBwdGhyZWFkX3NlbGYKLS0jICAgcHJhZ21hIHdlYWsgcHRocmVhZF9zZWxmCi0tIyAgZW5kaWYKLS0KLS0jICBpZiAhUFRIUkVBRF9JTl9VU0VfREVURUNUSU9OX0hBUkQKLS0jICAgcHJhZ21hIHdlYWsgcHRocmVhZF9jYW5jZWwKLS0jICAgZGVmaW5lIHB0aHJlYWRfaW5fdXNlKCkgKHB0aHJlYWRfY2FuY2VsICE9IE5VTEwpCi0tIyAgZW5kaWYKLS0KLS0jIGVsc2UKLS0KLS0jICBpZiAhUFRIUkVBRF9JTl9VU0VfREVURUNUSU9OX0hBUkQKLS0jICAgZGVmaW5lIHB0aHJlYWRfaW5fdXNlKCkgMQotLSMgIGVuZGlmCi0tCi0tIyBlbmRpZgotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgcHRocmVhZF9tdXRleF90IGdsX2xvY2tfdDsKLS0jIGRlZmluZSBnbF9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIHB0aHJlYWRfbXV0ZXhfdCBOQU1FOwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9tdXRleF90IE5BTUUgPSBnbF9sb2NrX2luaXRpYWxpemVyOwotLSMgZGVmaW5lIGdsX2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCi0tIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfaW5pdCAoJk5BTUUsIE5VTEwpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9sb2NrX2xvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9sb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX211dGV4X3VubG9jayAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfbG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0jIGlmIEhBVkVfUFRIUkVBRF9SV0xPQ0sKLS0KLS0jICBpZmRlZiBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUgotLQotLXR5cGVkZWYgcHRocmVhZF9yd2xvY2tfdCBnbF9yd2xvY2tfdDsKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICAgU1RPUkFHRUNMQVNTIHB0aHJlYWRfcndsb2NrX3QgTkFNRTsKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICAgU1RPUkFHRUNMQVNTIHB0aHJlYWRfcndsb2NrX3QgTkFNRSA9IGdsX3J3bG9ja19pbml0aWFsaXplcjsKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19pbml0aWFsaXplciBcCi0tICAgICAgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19pbml0KE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9yd2xvY2tfaW5pdCAoJk5BTUUsIE5VTEwpICE9IDApIFwKLS0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayhOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX3J3bG9ja19yZGxvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3J3bG9ja191bmxvY2soTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9yd2xvY2tfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX3J3bG9ja19kZXN0cm95ICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tCi0tIyAgZWxzZQotLQotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIGludCBpbml0aWFsaXplZDsKLS0gICAgICAgICAgcHRocmVhZF9tdXRleF90IGd1YXJkOyAgIC8qIHByb3RlY3RzIHRoZSBpbml0aWFsaXphdGlvbiAqLwotLSAgICAgICAgICBwdGhyZWFkX3J3bG9ja190IHJ3bG9jazsgLyogcmVhZC13cml0ZSBsb2NrICovCi0tICAgICAgICB9Ci0tICAgICAgICBnbF9yd2xvY2tfdDsKLS0jICAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICAgU1RPUkFHRUNMQVNTIGdsX3J3bG9ja190IE5BTUU7Ci0tIyAgIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgIFNUT1JBR0VDTEFTUyBnbF9yd2xvY2tfdCBOQU1FID0gZ2xfcndsb2NrX2luaXRpYWxpemVyOwotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2luaXRpYWxpemVyIFwKLS0gICAgICB7IDAsIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIgfQotLSMgICBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgXAotLSAgICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja19pbml0ICgmTkFNRSk7IFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrKE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfcmRsb2NrICgmTkFNRSk7IFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3J3bG9ja193cmxvY2soTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgXAotLSAgICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja193cmxvY2sgKCZOQU1FKTsgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoJk5BTUUpOyBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yd2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKCZOQU1FKTsgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfaW5pdCAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfd3Jsb2NrIChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tCi0tIyAgZW5kaWYKLS0KLS0jIGVsc2UKLS0KLS10eXBlZGVmIHN0cnVjdAotLSAgICAgICAgewotLSAgICAgICAgICBwdGhyZWFkX211dGV4X3QgbG9jazsgLyogcHJvdGVjdHMgdGhlIHJlbWFpbmluZyBmaWVsZHMgKi8KLS0gICAgICAgICAgcHRocmVhZF9jb25kX3Qgd2FpdGluZ19yZWFkZXJzOyAvKiB3YWl0aW5nIHJlYWRlcnMgKi8KLS0gICAgICAgICAgcHRocmVhZF9jb25kX3Qgd2FpdGluZ193cml0ZXJzOyAvKiB3YWl0aW5nIHdyaXRlcnMgKi8KLS0gICAgICAgICAgdW5zaWduZWQgaW50IHdhaXRpbmdfd3JpdGVyc19jb3VudDsgLyogbnVtYmVyIG9mIHdhaXRpbmcgd3JpdGVycyAqLwotLSAgICAgICAgICBpbnQgcnVuY291bnQ7IC8qIG51bWJlciBvZiByZWFkZXJzIHJ1bm5pbmcsIG9yIC0xIHdoZW4gYSB3cml0ZXIgcnVucyAqLwotLSAgICAgICAgfQotLSAgICAgICAgZ2xfcndsb2NrX3Q7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX3J3bG9ja190IE5BTUU7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX3J3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2luaXRpYWxpemVyIFwKLS0gICAgeyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVIsIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiwgMCwgMCB9Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgXAotLSAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfaW5pdCAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICBcCi0tICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKCZOQU1FKTsgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICBcCi0tICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja193cmxvY2sgKCZOQU1FKTsgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICBcCi0tICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja191bmxvY2sgKCZOQU1FKTsgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfcndsb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgXAotLSAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX2luaXQgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfcmRsb2NrIChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja191bmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoZ2xfcndsb2NrX3QgKmxvY2spOwotLQotLSMgZW5kaWYKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0jIGlmIEhBVkVfUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUKLS0KLS0jICBpZiBkZWZpbmVkIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSIHx8IGRlZmluZWQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKLS0KLS10eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBnbF9yZWN1cnNpdmVfbG9ja190OwotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgIFNUT1JBR0VDTEFTUyBwdGhyZWFkX211dGV4X3QgTkFNRTsKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9tdXRleF90IE5BTUUgPSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplcjsKLS0jICAgaWZkZWYgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIKLS0jICAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0tICAgICAgIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSCi0tIyAgIGVsc2UKLS0jICAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0tICAgICAgIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCi0tIyAgIGVuZGlmCi0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfaW5pdCAoJk5BTUUsIE5VTEwpICE9IDApIFwKLS0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9sb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX211dGV4X3VubG9jayAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0KLS0jICBlbHNlCi0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS0gICAgICAgIHsKLS0gICAgICAgICAgcHRocmVhZF9tdXRleF90IHJlY211dGV4OyAvKiByZWN1cnNpdmUgbXV0ZXggKi8KLS0gICAgICAgICAgcHRocmVhZF9tdXRleF90IGd1YXJkOyAgICAvKiBwcm90ZWN0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLS0gICAgICAgICAgaW50IGluaXRpYWxpemVkOwotLSAgICAgICAgfQotLSAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FOwotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUUgPSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplcjsKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyIFwKLS0gICAgICB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIDAgfQotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdChOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoJk5BTUUpOyBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19sb2NrKE5BTUUpIFwKLS0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrICgmTkFNRSk7IFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB3aGlsZSAoMCkKLS0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayhOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrICgmTkFNRSk7IFwKLS0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHdoaWxlICgwKQotLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoJk5BTUUpOyBcCi0tICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgd2hpbGUgKDApCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS0KLS0jICBlbmRpZgotLQotLSMgZWxzZQotLQotLS8qIE9sZCB2ZXJzaW9ucyBvZiBQT1NJWCB0aHJlYWRzIG9uIFNvbGFyaXMgZGlkIG5vdCBoYXZlIHJlY3Vyc2l2ZSBsb2Nrcy4KLS0gICBXZSBoYXZlIHRvIGltcGxlbWVudCB0aGVtIG91cnNlbHZlcy4gICovCi0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS0gICAgICAgIHsKLS0gICAgICAgICAgcHRocmVhZF9tdXRleF90IG11dGV4OwotLSAgICAgICAgICBwdGhyZWFkX3Qgb3duZXI7Ci0tICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVwdGg7Ci0tICAgICAgICB9Ci0tICAgICAgICBnbF9yZWN1cnNpdmVfbG9ja190OwotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FOwotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FID0gZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyIFwKLS0gICAgIHsgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiwgKHB0aHJlYWRfdCkgMCwgMCB9Ci0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQoTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoJk5BTUUpOyBcCi0tICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgIHdoaWxlICgwKQotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19sb2NrKE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKCZOQU1FKTsgXAotLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoJk5BTUUpOyBcCi0tICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgd2hpbGUgKDApCi0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoJk5BTUUpOyBcCi0tICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgIHdoaWxlICgwKQotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tCi0tIyBlbmRpZgotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgcHRocmVhZF9vbmNlX3QgZ2xfb25jZV90OwotLSMgZGVmaW5lIGdsX29uY2VfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9vbmNlX3QgTkFNRSA9IFBUSFJFQURfT05DRV9JTklUOwotLSMgZGVmaW5lIGdsX29uY2UoTkFNRSwgSU5JVEZVTkNUSU9OKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgIGlmIChwdGhyZWFkX29uY2UgKCZOQU1FLCBJTklURlVOQ1RJT04pICE9IDApIFwKLS0gICAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgaWYgKGdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKCZOQU1FKSkgICAgXAotLSAgICAgICAgICAgICAgSU5JVEZVTkNUSU9OICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS1leHRlcm4gaW50IGdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKHB0aHJlYWRfb25jZV90ICpvbmNlX2NvbnRyb2wpOwotLQotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS19Ci0tIyBlbmRpZgotLQotLSNlbmRpZgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jaWYgVVNFX1BUSF9USFJFQURTCi0tCi0tLyogVXNlIHRoZSBHTlUgUHRoIHRocmVhZHMgbGlicmFyeS4gICovCi0tCi0tIyBpbmNsdWRlIDxwdGguaD4KLS0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotLQotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jIGVuZGlmCi0tCi0tIyBpZiBVU0VfUFRIX1RIUkVBRFNfV0VBSwotLQotLS8qIFVzZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIEdOVSBQdGggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLS0KLS0jICBwcmFnbWEgd2VhayBwdGhfbXV0ZXhfaW5pdAotLSMgIHByYWdtYSB3ZWFrIHB0aF9tdXRleF9hY3F1aXJlCi0tIyAgcHJhZ21hIHdlYWsgcHRoX211dGV4X3JlbGVhc2UKLS0jICBwcmFnbWEgd2VhayBwdGhfcndsb2NrX2luaXQKLS0jICBwcmFnbWEgd2VhayBwdGhfcndsb2NrX2FjcXVpcmUKLS0jICBwcmFnbWEgd2VhayBwdGhfcndsb2NrX3JlbGVhc2UKLS0jICBwcmFnbWEgd2VhayBwdGhfb25jZQotLQotLSMgIHByYWdtYSB3ZWFrIHB0aF9jYW5jZWwKLS0jICBkZWZpbmUgcHRoX2luX3VzZSgpIChwdGhfY2FuY2VsICE9IE5VTEwpCi0tCi0tIyBlbHNlCi0tCi0tIyAgZGVmaW5lIHB0aF9pbl91c2UoKSAxCi0tCi0tIyBlbmRpZgotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgcHRoX211dGV4X3QgZ2xfbG9ja190OwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgcHRoX211dGV4X3QgTkFNRTsKLS0jIGRlZmluZSBnbF9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIHB0aF9tdXRleF90IE5BTUUgPSBnbF9sb2NrX2luaXRpYWxpemVyOwotLSMgZGVmaW5lIGdsX2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICBQVEhfTVVURVhfSU5JVAotLSMgZGVmaW5lIGdsX2xvY2tfaW5pdChOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAocHRoX2luX3VzZSgpICYmICFwdGhfbXV0ZXhfaW5pdCAoJk5BTUUpKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX2xvY2tfbG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAocHRoX2luX3VzZSgpICYmICFwdGhfbXV0ZXhfYWNxdWlyZSAoJk5BTUUsIDAsIE5VTEwpKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9tdXRleF9yZWxlYXNlICgmTkFNRSkpIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfbG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgKHZvaWQpKCZOQU1FKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgcHRoX3J3bG9ja190IGdsX3J3bG9ja190OwotLSMgIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgU1RPUkFHRUNMQVNTIHB0aF9yd2xvY2tfdCBOQU1FOwotLSMgIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICAgU1RPUkFHRUNMQVNTIHB0aF9yd2xvY2tfdCBOQU1FID0gZ2xfcndsb2NrX2luaXRpYWxpemVyOwotLSMgIGRlZmluZSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICAgUFRIX1JXTE9DS19JTklUCi0tIyAgZGVmaW5lIGdsX3J3bG9ja19pbml0KE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX3J3bG9ja19pbml0ICgmTkFNRSkpIFwKLS0gICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayhOQU1FKSBcCi0tICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICBpZiAocHRoX2luX3VzZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgICYmICFwdGhfcndsb2NrX2FjcXVpcmUgKCZOQU1FLCBQVEhfUldMT0NLX1JELCAwLCBOVUxMKSkgXAotLSAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKSBcCi0tICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICBpZiAocHRoX2luX3VzZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgICYmICFwdGhfcndsb2NrX2FjcXVpcmUgKCZOQU1FLCBQVEhfUldMT0NLX1JXLCAwLCBOVUxMKSkgXAotLSAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0tICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9yd2xvY2tfcmVsZWFzZSAoJk5BTUUpKSBcCi0tICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgd2hpbGUgKDApCi0tIyAgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgICh2b2lkKSgmTkFNRSkKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiBJbiBQdGgsIG11dGV4ZXMgYXJlIHJlY3Vyc2l2ZSBieSBkZWZhdWx0LiAgKi8KLS10eXBlZGVmIHB0aF9tdXRleF90IGdsX3JlY3Vyc2l2ZV9sb2NrX3Q7Ci0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgIFNUT1JBR0VDTEFTUyBwdGhfbXV0ZXhfdCBOQU1FOwotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgICBTVE9SQUdFQ0xBU1MgcHRoX211dGV4X3QgTkFNRSA9IGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyOwotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0tICAgICBQVEhfTVVURVhfSU5JVAotLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9tdXRleF9pbml0ICgmTkFNRSkpIFwKLS0gICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgd2hpbGUgKDApCi0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX211dGV4X2FjcXVpcmUgKCZOQU1FLCAwLCBOVUxMKSkgXAotLSAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICB3aGlsZSAoMCkKLS0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9tdXRleF9yZWxlYXNlICgmTkFNRSkpIFwKLS0gICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgd2hpbGUgKDApCi0tIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICAgKHZvaWQpKCZOQU1FKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgcHRoX29uY2VfdCBnbF9vbmNlX3Q7Ci0tIyBkZWZpbmUgZ2xfb25jZV9kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBwdGhfb25jZV90IE5BTUUgPSBQVEhfT05DRV9JTklUOwotLSMgZGVmaW5lIGdsX29uY2UoTkFNRSwgSU5JVEZVTkNUSU9OKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHB0aF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICB2b2lkICgqZ2xfb25jZV90ZW1wKSAodm9pZCkgPSBJTklURlVOQ1RJT047ICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgIGlmICghcHRoX29uY2UgKCZOQU1FLCBnbHRocmVhZF9vbmNlX2NhbGwsICZnbF9vbmNlX3RlbXApKSBcCi0tICAgICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgICBpZiAoZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAoJk5BTUUpKSAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgICAgSU5JVEZVTkNUSU9OICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9vbmNlX2NhbGwgKHZvaWQgKmFyZyk7Ci0tZXh0ZXJuIGludCBnbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkIChwdGhfb25jZV90ICpvbmNlX2NvbnRyb2wpOwotLQotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS19Ci0tIyBlbmRpZgotLQotLSNlbmRpZgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jaWYgVVNFX1NPTEFSSVNfVEhSRUFEUwotLQotLS8qIFVzZSB0aGUgb2xkIFNvbGFyaXMgdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLS0KLS0jIGluY2x1ZGUgPHRocmVhZC5oPgotLSMgaW5jbHVkZSA8c3luY2guaD4KLS0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotLQotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jIGVuZGlmCi0tCi0tIyBpZiBVU0VfU09MQVJJU19USFJFQURTX1dFQUsKLS0KLS0vKiBVc2Ugd2VhayByZWZlcmVuY2VzIHRvIHRoZSBvbGQgU29sYXJpcyB0aHJlYWRzIGxpYnJhcnkuICAqLwotLQotLSMgIHByYWdtYSB3ZWFrIG11dGV4X2luaXQKLS0jICBwcmFnbWEgd2VhayBtdXRleF9sb2NrCi0tIyAgcHJhZ21hIHdlYWsgbXV0ZXhfdW5sb2NrCi0tIyAgcHJhZ21hIHdlYWsgbXV0ZXhfZGVzdHJveQotLSMgIHByYWdtYSB3ZWFrIHJ3bG9ja19pbml0Ci0tIyAgcHJhZ21hIHdlYWsgcndfcmRsb2NrCi0tIyAgcHJhZ21hIHdlYWsgcndfd3Jsb2NrCi0tIyAgcHJhZ21hIHdlYWsgcndfdW5sb2NrCi0tIyAgcHJhZ21hIHdlYWsgcndsb2NrX2Rlc3Ryb3kKLS0jICBwcmFnbWEgd2VhayB0aHJfc2VsZgotLQotLSMgIHByYWdtYSB3ZWFrIHRocl9zdXNwZW5kCi0tIyAgZGVmaW5lIHRocmVhZF9pbl91c2UoKSAodGhyX3N1c3BlbmQgIT0gTlVMTCkKLS0KLS0jIGVsc2UKLS0KLS0jICBkZWZpbmUgdGhyZWFkX2luX3VzZSgpIDEKLS0KLS0jIGVuZGlmCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBtdXRleF90IGdsX2xvY2tfdDsKLS0jIGRlZmluZSBnbF9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIG11dGV4X3QgTkFNRTsKLS0jIGRlZmluZSBnbF9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIG11dGV4X3QgTkFNRSA9IGdsX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfbG9ja19pbml0aWFsaXplciBcCi0tICAgIERFRkFVTFRNVVRFWAotLSMgZGVmaW5lIGdsX2xvY2tfaW5pdChOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiBtdXRleF9pbml0ICgmTkFNRSwgVVNZTkNfVEhSRUFELCBOVUxMKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX2xvY2tfbG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpICYmIG11dGV4X2xvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgbXV0ZXhfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiBtdXRleF9kZXN0cm95ICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgcndsb2NrX3QgZ2xfcndsb2NrX3Q7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIHJ3bG9ja190IE5BTUU7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIHJ3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2luaXRpYWxpemVyIFwKLS0gICAgREVGQVVMVFJXTE9DSwotLSMgZGVmaW5lIGdsX3J3bG9ja19pbml0KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndsb2NrX2luaXQgKCZOQU1FLCBVU1lOQ19USFJFQUQsIE5VTEwpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpICYmIHJ3X3JkbG9jayAoJk5BTUUpICE9IDApIFwKLS0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiByd193cmxvY2sgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgIHdoaWxlICgwKQotLSMgZGVmaW5lIGdsX3J3bG9ja191bmxvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yd2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndsb2NrX2Rlc3Ryb3kgKCZOQU1FKSAhPSAwKSBcCi0tICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiBPbGQgU29sYXJpcyB0aHJlYWRzIGRpZCBub3QgaGF2ZSByZWN1cnNpdmUgbG9ja3MuCi0tICAgV2UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlbSBvdXJzZWx2ZXMuICAqLwotLQotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIG11dGV4X3QgbXV0ZXg7Ci0tICAgICAgICAgIHRocmVhZF90IG93bmVyOwotLSAgICAgICAgICB1bnNpZ25lZCBsb25nIGRlcHRoOwotLSAgICAgICAgfQotLSAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUU7Ci0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FID0gZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICB7IERFRkFVTFRNVVRFWCwgKHRocmVhZF90KSAwLCAwIH0KLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19sb2NrKE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2soTkFNRSkgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKCZOQU1FKTsgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoJk5BTUUpOyBcCi0tICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIHZvbGF0aWxlIGludCBpbml0ZWQ7Ci0tICAgICAgICAgIG11dGV4X3QgbXV0ZXg7Ci0tICAgICAgICB9Ci0tICAgICAgICBnbF9vbmNlX3Q7Ci0tIyBkZWZpbmUgZ2xfb25jZV9kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0tICAgIFNUT1JBR0VDTEFTUyBnbF9vbmNlX3QgTkFNRSA9IHsgMCwgREVGQVVMVE1VVEVYIH07Ci0tIyBkZWZpbmUgZ2xfb25jZShOQU1FLCBJTklURlVOQ1RJT04pIFwKLS0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgICAgZ2x0aHJlYWRfb25jZSAoJk5BTUUsIElOSVRGVU5DVElPTik7ICAgICAgXAotLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgIGlmIChnbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkICgmTkFNRSkpIFwKLS0gICAgICAgICAgICAgIElOSVRGVU5DVElPTiAoKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0tICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0gICAgd2hpbGUgKDApCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfb25jZSAoZ2xfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0ZnVuY3Rpb24pICh2b2lkKSk7Ci0tZXh0ZXJuIGludCBnbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkIChnbF9vbmNlX3QgKm9uY2VfY29udHJvbCk7Ci0tCi0tIyBpZmRlZiBfX2NwbHVzcGx1cwotLX0KLS0jIGVuZGlmCi0tCi0tI2VuZGlmCi0tCi0tLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLQotLSNpZiBVU0VfV0lOMzJfVEhSRUFEUwotLQotLSMgaW5jbHVkZSA8d2luZG93cy5oPgotLQotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jIGVuZGlmCi0tCi0tLyogV2UgY2FuIHVzZSBDUklUSUNBTF9TRUNUSU9OIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB0aGUgV2luMzIgRXZlbnQsIE11dGV4LAotLSAgIFNlbWFwaG9yZSB0eXBlcywgYmVjYXVzZQotLSAgICAgLSB3ZSBuZWVkIG9ubHkgdG8gc3luY2hyb25pemUgaW5zaWRlIGEgc2luZ2xlIHByb2Nlc3MgKGFkZHJlc3Mgc3BhY2UpLAotLSAgICAgICBub3QgaW50ZXItcHJvY2VzcyBsb2NraW5nLAotLSAgICAgLSB3ZSBkb24ndCBuZWVkIHRvIHN1cHBvcnQgdHJ5bG9jayBvcGVyYXRpb25zLiAgKFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uCi0tICAgICAgIGRvZXMgbm90IHdvcmsgb24gV2luZG93cyA5NS85OC9NRS4gIFBhY2thZ2VzIHRoYXQgbmVlZCB0cnlsb2NrIHVzdWFsbHkKLS0gICAgICAgZGVmaW5lIHRoZWlyIG93biBtdXRleCB0eXBlLikgICovCi0tCi0tLyogVGhlcmUgaXMgbm8gd2F5IHRvIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSBhIENSSVRJQ0FMX1NFQ1RJT04uICBJdCBuZWVkcwotLSAgIHRvIGJlIGRvbmUgbGF6aWx5LCBvbmNlIG9ubHkuICBGb3IgdGhpcyB3ZSBuZWVkIHNwaW5sb2Nrcy4gICovCi0tCi0tdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgZG9uZTsgdm9sYXRpbGUgbG9uZyBzdGFydGVkOyB9IGdsX3NwaW5sb2NrX3Q7Ci0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS0gICAgICAgIHsKLS0gICAgICAgICAgZ2xfc3BpbmxvY2tfdCBndWFyZDsgLyogcHJvdGVjdHMgdGhlIGluaXRpYWxpemF0aW9uICovCi0tICAgICAgICAgIENSSVRJQ0FMX1NFQ1RJT04gbG9jazsKLS0gICAgICAgIH0KLS0gICAgICAgIGdsX2xvY2tfdDsKLS0jIGRlZmluZSBnbF9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX2xvY2tfdCBOQU1FOwotLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfbG9ja190IE5BTUUgPSBnbF9sb2NrX2luaXRpYWxpemVyOwotLSMgZGVmaW5lIGdsX2xvY2tfaW5pdGlhbGl6ZXIgXAotLSAgICB7IHsgMCwgLTEgfSB9Ci0tIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfbG9ja19pbml0ICgmTkFNRSkKLS0jIGRlZmluZSBnbF9sb2NrX2xvY2soTkFNRSkgXAotLSAgICBnbHRocmVhZF9sb2NrX2xvY2sgKCZOQU1FKQotLSMgZGVmaW5lIGdsX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfbG9ja191bmxvY2sgKCZOQU1FKQotLSMgZGVmaW5lIGdsX2xvY2tfZGVzdHJveShOQU1FKSBcCi0tICAgIGdsdGhyZWFkX2xvY2tfZGVzdHJveSAoJk5BTUUpCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfbG9ja19pbml0IChnbF9sb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX2xvY2tfbG9jayAoZ2xfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9sb2NrX3VubG9jayAoZ2xfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9sb2NrX2Rlc3Ryb3kgKGdsX2xvY2tfdCAqbG9jayk7Ci0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yd2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tLyogSXQgaXMgaW1wb3NzaWJsZSB0byBpbXBsZW1lbnQgcmVhZC13cml0ZSBsb2NrcyB1c2luZyBwbGFpbiBsb2Nrcywgd2l0aG91dAotLSAgIGludHJvZHVjaW5nIGFuIGV4dHJhIHRocmVhZCBkZWRpY2F0ZWQgdG8gbWFuYWdpbmcgcmVhZC13cml0ZSBsb2Nrcy4KLS0gICBUaGVyZWZvcmUgaGVyZSB3ZSBuZWVkIHRvIHVzZSB0aGUgbG93LWxldmVsIEV2ZW50IHR5cGUuICAqLwotLQotLXR5cGVkZWYgc3RydWN0Ci0tICAgICAgICB7Ci0tICAgICAgICAgIEhBTkRMRSAqYXJyYXk7IC8qIGFycmF5IG9mIHdhaXRpbmcgdGhyZWFkcywgZWFjaCByZXByZXNlbnRlZCBieSBhbiBldmVudCAqLwotLSAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7IC8qIG51bWJlciBvZiB3YWl0aW5nIHRocmVhZHMgKi8KLS0gICAgICAgICAgdW5zaWduZWQgaW50IGFsbG9jOyAvKiBsZW5ndGggb2YgYWxsb2NhdGVkIGFycmF5ICovCi0tICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7IC8qIGluZGV4IG9mIGZpcnN0IHdhaXRpbmcgdGhyZWFkIGluIGFycmF5ICovCi0tICAgICAgICB9Ci0tICAgICAgICBnbF93YWl0cXVldWVfdDsKLS10eXBlZGVmIHN0cnVjdAotLSAgICAgICAgewotLSAgICAgICAgICBnbF9zcGlubG9ja190IGd1YXJkOyAvKiBwcm90ZWN0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLS0gICAgICAgICAgQ1JJVElDQUxfU0VDVElPTiBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgcmVtYWluaW5nIGZpZWxkcyAqLwotLSAgICAgICAgICBnbF93YWl0cXVldWVfdCB3YWl0aW5nX3JlYWRlcnM7IC8qIHdhaXRpbmcgcmVhZGVycyAqLwotLSAgICAgICAgICBnbF93YWl0cXVldWVfdCB3YWl0aW5nX3dyaXRlcnM7IC8qIHdhaXRpbmcgd3JpdGVycyAqLwotLSAgICAgICAgICBpbnQgcnVuY291bnQ7IC8qIG51bWJlciBvZiByZWFkZXJzIHJ1bm5pbmcsIG9yIC0xIHdoZW4gYSB3cml0ZXIgcnVucyAqLwotLSAgICAgICAgfQotLSAgICAgICAgZ2xfcndsb2NrX3Q7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX3J3bG9ja190IE5BTUU7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX3J3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2luaXRpYWxpemVyIFwKLS0gICAgeyB7IDAsIC0xIH0gfQotLSMgZGVmaW5lIGdsX3J3bG9ja19pbml0KE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfcndsb2NrX2luaXQgKCZOQU1FKQotLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotLSAgICBnbHRocmVhZF9yd2xvY2tfcmRsb2NrICgmTkFNRSkKLS0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0tICAgIGdsdGhyZWFkX3J3bG9ja191bmxvY2sgKCZOQU1FKQotLSMgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKCZOQU1FKQotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19pbml0IChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja193cmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfdW5sb2NrIChnbF9yd2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKGdsX3J3bG9ja190ICpsb2NrKTsKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS0vKiBUaGUgV2luMzIgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgQ1JJVElDQUxfU0VDVElPTiBhbHJlYWR5IGltcGxlbWVudHMgYQotLSAgIHJlY3Vyc2l2ZSBsb2NrLiAgQnV0IHdlIG5lZWQgbm90IHJlbHkgb24gaXQ6IEl0J3MgZWFzeSB0byBpbXBsZW1lbnQgYQotLSAgIHJlY3Vyc2l2ZSBsb2NrIHdpdGhvdXQgdGhpcyBhc3N1bXB0aW9uLiAgKi8KLS0KLS10eXBlZGVmIHN0cnVjdAotLSAgICAgICAgewotLSAgICAgICAgICBnbF9zcGlubG9ja190IGd1YXJkOyAvKiBwcm90ZWN0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLS0gICAgICAgICAgRFdPUkQgb3duZXI7Ci0tICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVwdGg7Ci0tICAgICAgICAgIENSSVRJQ0FMX1NFQ1RJT04gbG9jazsKLS0gICAgICAgIH0KLS0gICAgICAgIGdsX3JlY3Vyc2l2ZV9sb2NrX3Q7Ci0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FOwotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgTkFNRSA9IGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyOwotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyIFwKLS0gICAgeyB7IDAsIC0xIH0sIDAsIDAgfQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQoTkFNRSkgXAotLSAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0ICgmTkFNRSkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19sb2NrKE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoJk5BTUUpCi0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrICgmTkFNRSkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZXN0cm95KE5BTUUpIFwKLS0gICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoJk5BTUUpCi0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0tZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9vbmNlX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS10eXBlZGVmIHN0cnVjdAotLSAgICAgICAgewotLSAgICAgICAgICB2b2xhdGlsZSBpbnQgaW5pdGVkOwotLSAgICAgICAgICB2b2xhdGlsZSBsb25nIHN0YXJ0ZWQ7Ci0tICAgICAgICAgIENSSVRJQ0FMX1NFQ1RJT04gbG9jazsKLS0gICAgICAgIH0KLS0gICAgICAgIGdsX29uY2VfdDsKLS0jIGRlZmluZSBnbF9vbmNlX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX29uY2VfdCBOQU1FID0geyAtMSwgLTEgfTsKLS0jIGRlZmluZSBnbF9vbmNlKE5BTUUsIElOSVRGVU5DVElPTikgXAotLSAgICBnbHRocmVhZF9vbmNlICgmTkFNRSwgSU5JVEZVTkNUSU9OKQotLWV4dGVybiB2b2lkIGdsdGhyZWFkX29uY2UgKGdsX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdGZ1bmN0aW9uKSAodm9pZCkpOwotLQotLSMgaWZkZWYgX19jcGx1c3BsdXMKLS19Ci0tIyBlbmRpZgotLQotLSNlbmRpZgotLQotLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS0KLS0jaWYgIShVU0VfUE9TSVhfVEhSRUFEUyB8fCBVU0VfUFRIX1RIUkVBRFMgfHwgVVNFX1NPTEFSSVNfVEhSRUFEUyB8fCBVU0VfV0lOMzJfVEhSRUFEUykKLS0KLS0vKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRocmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQuICAqLwotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgaW50IGdsX2xvY2tfdDsKLS0jIGRlZmluZSBnbF9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpCi0tIyBkZWZpbmUgZ2xfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKQotLSMgZGVmaW5lIGdsX2xvY2tfaW5pdChOQU1FKQotLSMgZGVmaW5lIGdsX2xvY2tfbG9jayhOQU1FKQotLSMgZGVmaW5lIGdsX2xvY2tfdW5sb2NrKE5BTUUpCi0tCi0tLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yd2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0tCi0tdHlwZWRlZiBpbnQgZ2xfcndsb2NrX3Q7Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpCi0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpCi0tIyBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkKLS0jIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrKE5BTUUpCi0tIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKQotLSMgZGVmaW5lIGdsX3J3bG9ja191bmxvY2soTkFNRSkKLS0KLS0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS0KLS10eXBlZGVmIGludCBnbF9yZWN1cnNpdmVfbG9ja190OwotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpCi0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkKLS0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0KE5BTUUpCi0tIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfbG9jayhOQU1FKQotLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayhOQU1FKQotLQotLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLQotLXR5cGVkZWYgaW50IGdsX29uY2VfdDsKLS0jIGRlZmluZSBnbF9vbmNlX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLS0gICAgU1RPUkFHRUNMQVNTIGdsX29uY2VfdCBOQU1FID0gMDsKLS0jIGRlZmluZSBnbF9vbmNlKE5BTUUsIElOSVRGVU5DVElPTikgXAotLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgaWYgKE5BTUUgPT0gMCkgICAgICAgXAotLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgXAotLSAgICAgICAgICAgIE5BTUUgPSB+IDA7ICAgICAgXAotLSAgICAgICAgICAgIElOSVRGVU5DVElPTiAoKTsgXAotLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgXAotLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgXAotLSAgICB3aGlsZSAoMCkKLS0KLS0jZW5kaWYKLS0KLS0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0tCi0tI2VuZGlmIC8qIF9MT0NLX0ggKi8KLS0tLSBhL2ludGwvbG9nLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDExNiArMCwwIEBACi0tLyogTG9nIGZpbGUgb3V0cHV0LgotLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGlvLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0vKiBIYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxvY2suaCIKLS0jZW5kaWYKLS0KLS0vKiBQcmludCBhbiBBU0NJSSBzdHJpbmcgd2l0aCBxdW90ZXMgYW5kIGVzY2FwZSBzZXF1ZW5jZXMgd2hlcmUgbmVlZGVkLiAgKi8KLS1zdGF0aWMgdm9pZAotLXByaW50X2VzY2FwZWQgKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3RyKQotLXsKLS0gIHB1dGMgKCciJywgc3RyZWFtKTsKLS0gIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQotLSAgICBpZiAoKnN0ciA9PSAnXG4nKQotLSAgICAgIHsKLS0JZnB1dHMgKCJcXG5cIiIsIHN0cmVhbSk7Ci0tCWlmIChzdHJbMV0gPT0gJ1wwJykKLS0JICByZXR1cm47Ci0tCWZwdXRzICgiXG5cIiIsIHN0cmVhbSk7Ci0tICAgICAgfQotLSAgICBlbHNlCi0tICAgICAgewotLQlpZiAoKnN0ciA9PSAnIicgfHwgKnN0ciA9PSAnXFwnKQotLQkgIHB1dGMgKCdcXCcsIHN0cmVhbSk7Ci0tCXB1dGMgKCpzdHIsIHN0cmVhbSk7Ci0tICAgICAgfQotLSAgcHV0YyAoJyInLCBzdHJlYW0pOwotLX0KLS0KLS1zdGF0aWMgY2hhciAqbGFzdF9sb2dmaWxlbmFtZSA9IE5VTEw7Ci0tc3RhdGljIEZJTEUgKmxhc3RfbG9nZmlsZSA9IE5VTEw7Ci0tX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spCi0tCi0tc3RhdGljIGlubGluZSB2b2lkCi0tX25sX2xvZ191bnRyYW5zbGF0ZWRfbG9ja2VkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwgY29uc3QgY2hhciAqZG9tYWlubmFtZSwKLS0JCQkgICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCBpbnQgcGx1cmFsKQotLXsKLS0gIEZJTEUgKmxvZ2ZpbGU7Ci0tCi0tICAvKiBDYW4gd2UgcmV1c2UgdGhlIGxhc3Qgb3BlbmVkIGxvZ2ZpbGU/ICAqLwotLSAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKGxvZ2ZpbGVuYW1lLCBsYXN0X2xvZ2ZpbGVuYW1lKSAhPSAwKQotLSAgICB7Ci0tICAgICAgLyogQ2xvc2UgdGhlIGxhc3QgdXNlZCBsb2dmaWxlLiAgKi8KLS0gICAgICBpZiAobGFzdF9sb2dmaWxlbmFtZSAhPSBOVUxMKQotLQl7Ci0tCSAgaWYgKGxhc3RfbG9nZmlsZSAhPSBOVUxMKQotLQkgICAgewotLQkgICAgICBmY2xvc2UgKGxhc3RfbG9nZmlsZSk7Ci0tCSAgICAgIGxhc3RfbG9nZmlsZSA9IE5VTEw7Ci0tCSAgICB9Ci0tCSAgZnJlZSAobGFzdF9sb2dmaWxlbmFtZSk7Ci0tCSAgbGFzdF9sb2dmaWxlbmFtZSA9IE5VTEw7Ci0tCX0KLS0gICAgICAvKiBPcGVuIHRoZSBsb2dmaWxlLiAgKi8KLS0gICAgICBsYXN0X2xvZ2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKGxvZ2ZpbGVuYW1lKSArIDEpOwotLSAgICAgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lID09IE5VTEwpCi0tCXJldHVybjsKLS0gICAgICBzdHJjcHkgKGxhc3RfbG9nZmlsZW5hbWUsIGxvZ2ZpbGVuYW1lKTsKLS0gICAgICBsYXN0X2xvZ2ZpbGUgPSBmb3BlbiAobG9nZmlsZW5hbWUsICJhIik7Ci0tICAgICAgaWYgKGxhc3RfbG9nZmlsZSA9PSBOVUxMKQotLQlyZXR1cm47Ci0tICAgIH0KLS0gIGxvZ2ZpbGUgPSBsYXN0X2xvZ2ZpbGU7Ci0tCi0tICBmcHJpbnRmIChsb2dmaWxlLCAiZG9tYWluICIpOwotLSAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgZG9tYWlubmFtZSk7Ci0tICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZCAiKTsKLS0gIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIG1zZ2lkMSk7Ci0tICBpZiAocGx1cmFsKQotLSAgICB7Ci0tICAgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnaWRfcGx1cmFsICIpOwotLSAgICAgIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIG1zZ2lkMik7Ci0tICAgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnc3RyWzBdIFwiXCJcbiIpOwotLSAgICB9Ci0tICBlbHNlCi0tICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ3N0ciBcIlwiXG4iKTsKLS0gIHB1dGMgKCdcbicsIGxvZ2ZpbGUpOwotLX0KLS0KLS0vKiBBZGQgdG8gdGhlIGxvZyBmaWxlIGFuIGVudHJ5IGRlbm90aW5nIGEgZmFpbGVkIHRyYW5zbGF0aW9uLiAgKi8KLS12b2lkCi0tX25sX2xvZ191bnRyYW5zbGF0ZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAotLQkJICAgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIGludCBwbHVyYWwpCi0tewotLSAgX19saWJjX2xvY2tfbG9jayAobG9jayk7Ci0tICBfbmxfbG9nX3VudHJhbnNsYXRlZF9sb2NrZWQgKGxvZ2ZpbGVuYW1lLCBkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgcGx1cmFsKTsKLS0gIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0tfQotLS0tIGEvaW50bC9uZ2V0dGV4dC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw2NSArMCwwIEBACi0tLyogSW1wbGVtZW50YXRpb24gb2YgbmdldHRleHQoMykgZnVuY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgX19uZWVkX05VTEwKLS0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotLSNlbHNlCi0tIyBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLwotLSNlbmRpZgotLQotLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotLSNpZmRlZiBfTElCQwotLSMgaW5jbHVkZSA8bGliaW50bC5oPgotLSNlbHNlCi0tIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPGxvY2FsZS5oPgotLQotLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS0KLS0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0tICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0tI2lmZGVmIF9MSUJDCi0tIyBkZWZpbmUgTkdFVFRFWFQgX19uZ2V0dGV4dAotLSMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0Ci0tI2Vsc2UKLS0jIGRlZmluZSBOR0VUVEVYVCBsaWJpbnRsX25nZXR0ZXh0Ci0tIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKLS0jZW5kaWYKLS0KLS0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0tICAgdGV4dCkuICAqLwotLWNoYXIgKgotLU5HRVRURVhUIChjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKLS17Ci0tICByZXR1cm4gRENOR0VUVEVYVCAoTlVMTCwgbXNnaWQxLCBtc2dpZDIsIG4sIExDX01FU1NBR0VTKTsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi0td2Vha19hbGlhcyAoX19uZ2V0dGV4dCwgbmdldHRleHQpOwotLSNlbmRpZgotLS0tIGEvaW50bC9vczJjb21wYXQuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsOTggKzAsMCBAQAotLS8qIE9TLzIgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMuCi0tICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jZGVmaW5lIE9TMl9BV0FSRQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tI2luY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotLQotLS8qIEEgdmVyc2lvbiBvZiBnZXRlbnYoKSB0aGF0IHdvcmtzIGZyb20gRExMcyAqLwotLWV4dGVybiB1bnNpZ25lZCBsb25nIERvc1NjYW5FbnYgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBzek5hbWUsIHVuc2lnbmVkIGNoYXIgKipwcHN6VmFsdWUpOwotLQotLWNoYXIgKgotLV9ubF9nZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCi0tewotLSAgdW5zaWduZWQgY2hhciAqdmFsdWU7Ci0tICBpZiAoRG9zU2NhbkVudiAobmFtZSwgJnZhbHVlKSkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICBlbHNlCi0tICAgIHJldHVybiB2YWx1ZTsKLS19Ci0tCi0tLyogQSBmaXhlZCBzaXplIGJ1ZmZlci4gICovCi0tY2hhciBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZVtNQVhQQVRITEVOKzFdOwotLQotLWNoYXIgKl9ubG9zMl9saWJkaXIgPSBOVUxMOwotLWNoYXIgKl9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBOVUxMOwotLWNoYXIgKl9ubG9zMl9sb2NhbGVkaXIgPSBOVUxMOwotLQotLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQKLS1ubG9zMl9pbml0aWFsaXplICgpCi0tewotLSAgY2hhciAqcm9vdCA9IGdldGVudiAoIlVOSVhST09UIik7Ci0tICBjaGFyICpnbnVsb2NhbGVkaXIgPSBnZXRlbnYgKCJHTlVMT0NBTEVESVIiKTsKLS0KLS0gIF9ubG9zMl9saWJkaXIgPSBnbnVsb2NhbGVkaXI7Ci0tICBpZiAoIV9ubG9zMl9saWJkaXIpCi0tICAgIHsKLS0gICAgICBpZiAocm9vdCkKLS0gICAgICAgIHsKLS0gICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKLS0gICAgICAgICAgX25sb3MyX2xpYmRpciA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExJQkRJUikgKyAxKTsKLS0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyLCByb290LCBzbCk7Ci0tICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciArIHNsLCBMSUJESVIsIHN0cmxlbiAoTElCRElSKSArIDEpOwotLSAgICAgICAgfQotLSAgICAgIGVsc2UKLS0gICAgICAgIF9ubG9zMl9saWJkaXIgPSBMSUJESVI7Ci0tICAgIH0KLS0KLS0gIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBnbnVsb2NhbGVkaXI7Ci0tICBpZiAoIV9ubG9zMl9sb2NhbGVhbGlhc3BhdGgpCi0tICAgIHsKLS0gICAgICBpZiAocm9vdCkKLS0gICAgICAgIHsKLS0gICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKLS0gICAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOwotLSAgICAgICAgICBtZW1jcHkgKF9ubG9zMl9sb2NhbGVhbGlhc3BhdGgsIHJvb3QsIHNsKTsKLS0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoICsgc2wsIExPQ0FMRV9BTElBU19QQVRILCBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOwotLSAgICAgICAgfQotLSAgICAgZWxzZQotLSAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOwotLSAgICB9Ci0tCi0tICBfbmxvczJfbG9jYWxlZGlyID0gZ251bG9jYWxlZGlyOwotLSAgaWYgKCFfbmxvczJfbG9jYWxlZGlyKQotLSAgICB7Ci0tICAgICAgaWYgKHJvb3QpCi0tICAgICAgICB7Ci0tICAgICAgICAgIHNpemVfdCBzbCA9IHN0cmxlbiAocm9vdCk7Ci0tICAgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMT0NBTEVESVIpICsgMSk7Ci0tICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciwgcm9vdCwgc2wpOwotLSAgICAgICAgICBtZW1jcHkgKF9ubG9zMl9sb2NhbGVkaXIgKyBzbCwgTE9DQUxFRElSLCBzdHJsZW4gKExPQ0FMRURJUikgKyAxKTsKLS0gICAgICAgIH0KLS0gICAgICBlbHNlCi0tICAgICAgICBfbmxvczJfbG9jYWxlZGlyID0gTE9DQUxFRElSOwotLSAgICB9Ci0tCi0tICBpZiAoc3RybGVuIChfbmxvczJfbG9jYWxlZGlyKSA8PSBNQVhQQVRITEVOKQotLSAgICBzdHJjcHkgKGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lLCBfbmxvczJfbG9jYWxlZGlyKTsKLS19Ci0tLS0gYS9pbnRsL29zMmNvbXBhdC5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0NiArMCwwIEBACi0tLyogT1MvMiBjb21wYXRpYmlsaXR5IGRlZmluZXMuCi0tICAgVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGZyb20gY29uZmlnLmgKLS0gICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFdoZW4gaW5jbHVkZWQgZnJvbSBvczJjb21wYXQuaCB3ZSBuZWVkIGFsbCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbnMgKi8KLS0jaWZuZGVmIE9TMl9BV0FSRQotLQotLSN1bmRlZiBMSUJESVIKLS0jZGVmaW5lIExJQkRJUgkJCV9ubG9zMl9saWJkaXIKLS1leHRlcm4gY2hhciAqX25sb3MyX2xpYmRpcjsKLS0KLS0jdW5kZWYgTE9DQUxFRElSCi0tI2RlZmluZSBMT0NBTEVESVIJCV9ubG9zMl9sb2NhbGVkaXIKLS1leHRlcm4gY2hhciAqX25sb3MyX2xvY2FsZWRpcjsKLS0KLS0jdW5kZWYgTE9DQUxFX0FMSUFTX1BBVEgKLS0jZGVmaW5lIExPQ0FMRV9BTElBU19QQVRICV9ubG9zMl9sb2NhbGVhbGlhc3BhdGgKLS1leHRlcm4gY2hhciAqX25sb3MyX2xvY2FsZWFsaWFzcGF0aDsKLS0KLS0jZW5kaWYKLS0KLS0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0tI2RlZmluZSBIQVZFX1NUUkNBU0VDTVAgMQotLSNkZWZpbmUgc3RyY2FzZWNtcCBzdHJpY21wCi0tI2RlZmluZSBzdHJuY2FzZWNtcCBzdHJuaWNtcAotLQotLS8qIFdlIGhhdmUgb3VyIG93biBnZXRlbnYoKSB3aGljaCB3b3JrcyBldmVuIGlmIGxpYnJhcnkgaXMgY29tcGlsZWQgYXMgRExMICovCi0tI2RlZmluZSBnZXRlbnYgX25sX2dldGVudgotLQotLS8qIE9sZGVyIHZlcnNpb25zIG9mIGdldHRleHQgdXNlZCAtMSBhcyB0aGUgdmFsdWUgb2YgTENfTUVTU0FHRVMgKi8KLS0jZGVmaW5lIExDX01FU1NBR0VTX0NPTVBBVCAoLTEpCi0tLS0gYS9pbnRsL29zZGVwLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDI2ICswLDAgQEAKLS0vKiBPUyBkZXBlbmRlbnQgcGFydHMgb2YgbGliaW50bC4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZiBkZWZpbmVkIF9fQ1lHV0lOX18KLS0jIGluY2x1ZGUgImludGwtZXhwb3J0cy5jIgotLSNlbGlmIGRlZmluZWQgX19FTVhfXwotLSMgaW5jbHVkZSAib3MyY29tcGF0LmMiCi0tI2Vsc2UKLS0vKiBBdm9pZCBBSVggY29tcGlsZXIgd2FybmluZy4gICovCi0tdHlwZWRlZiBpbnQgZHVtbXk7Ci0tI2VuZGlmCi0tLS0gYS9pbnRsL3BsdXJhbC1leHAuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTU1ICswLDAgQEAKLS0vKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMywgMjAwNS0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDIwMDAuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPGN0eXBlLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0jaW5jbHVkZSAicGx1cmFsLWV4cC5oIgotLQotLSNpZiAoZGVmaW5lZCBfX0dOVUNfXyAmJiAhKF9fQVBQTEVfQ0NfXyA+IDEpICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzKSBcCi0tICAgIHx8IChkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKQotLQotLS8qIFRoZXNlIHN0cnVjdHMgYXJlIHRoZSBjb25zdGFudCBleHByZXNzaW9uIGZvciB0aGUgZ2VybWFuaWMgcGx1cmFsCi0tICAgZm9ybSBkZXRlcm1pbmF0aW9uLiAgSXQgcmVwcmVzZW50cyB0aGUgZXhwcmVzc2lvbiAgIm4gIT0gMSIuICAqLwotLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhciA9Ci0tewotLSAgLm5hcmdzID0gMCwKLS0gIC5vcGVyYXRpb24gPSB2YXIsCi0tfTsKLS1zdGF0aWMgY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gcGxvbmUgPQotLXsKLS0gIC5uYXJncyA9IDAsCi0tICAub3BlcmF0aW9uID0gbnVtLAotLSAgLnZhbCA9Ci0tICB7Ci0tICAgIC5udW0gPSAxCi0tICB9Ci0tfTsKLS1zdHJ1Y3QgZXhwcmVzc2lvbiBHRVJNQU5JQ19QTFVSQUwgPQotLXsKLS0gIC5uYXJncyA9IDIsCi0tICAub3BlcmF0aW9uID0gbm90X2VxdWFsLAotLSAgLnZhbCA9Ci0tICB7Ci0tICAgIC5hcmdzID0KLS0gICAgewotLSAgICAgIFswXSA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSAmcGx2YXIsCi0tICAgICAgWzFdID0gKHN0cnVjdCBleHByZXNzaW9uICopICZwbG9uZQotLSAgICB9Ci0tICB9Ci0tfTsKLS0KLS0jIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpCi0tCi0tI2Vsc2UKLS0KLS0vKiBGb3IgY29tcGlsZXJzIHdpdGhvdXQgc3VwcG9ydCBmb3IgSVNPIEMgOTkgc3RydWN0L3VuaW9uIGluaXRpYWxpemVyczoKLS0gICBJbml0aWFsaXphdGlvbiBhdCBydW4tdGltZS4gICovCi0tCi0tc3RhdGljIHN0cnVjdCBleHByZXNzaW9uIHBsdmFyOwotLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZTsKLS1zdHJ1Y3QgZXhwcmVzc2lvbiBHRVJNQU5JQ19QTFVSQUw7Ci0tCi0tc3RhdGljIHZvaWQKLS1pbml0X2dlcm1hbmljX3BsdXJhbCAoKQotLXsKLS0gIGlmIChwbG9uZS52YWwubnVtID09IDApCi0tICAgIHsKLS0gICAgICBwbHZhci5uYXJncyA9IDA7Ci0tICAgICAgcGx2YXIub3BlcmF0aW9uID0gdmFyOwotLQotLSAgICAgIHBsb25lLm5hcmdzID0gMDsKLS0gICAgICBwbG9uZS5vcGVyYXRpb24gPSBudW07Ci0tICAgICAgcGxvbmUudmFsLm51bSA9IDE7Ci0tCi0tICAgICAgR0VSTUFOSUNfUExVUkFMLm5hcmdzID0gMjsKLS0gICAgICBHRVJNQU5JQ19QTFVSQUwub3BlcmF0aW9uID0gbm90X2VxdWFsOwotLSAgICAgIEdFUk1BTklDX1BMVVJBTC52YWwuYXJnc1swXSA9ICZwbHZhcjsKLS0gICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMV0gPSAmcGxvbmU7Ci0tICAgIH0KLS19Ci0tCi0tIyBkZWZpbmUgSU5JVF9HRVJNQU5JQ19QTFVSQUwoKSBpbml0X2dlcm1hbmljX3BsdXJhbCAoKQotLQotLSNlbmRpZgotLQotLXZvaWQKLS1pbnRlcm5hbF9mdW5jdGlvbgotLUVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKGNvbnN0IGNoYXIgKm51bGxlbnRyeSwKLS0JCQkgICBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKnBsdXJhbHAsCi0tCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKLS17Ci0tICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBjb25zdCBjaGFyICpwbHVyYWw7Ci0tICAgICAgY29uc3QgY2hhciAqbnBsdXJhbHM7Ci0tCi0tICAgICAgcGx1cmFsID0gc3Ryc3RyIChudWxsZW50cnksICJwbHVyYWw9Iik7Ci0tICAgICAgbnBsdXJhbHMgPSBzdHJzdHIgKG51bGxlbnRyeSwgIm5wbHVyYWxzPSIpOwotLSAgICAgIGlmIChwbHVyYWwgPT0gTlVMTCB8fCBucGx1cmFscyA9PSBOVUxMKQotLQlnb3RvIG5vX3BsdXJhbDsKLS0gICAgICBlbHNlCi0tCXsKLS0JICBjaGFyICplbmRwOwotLQkgIHVuc2lnbmVkIGxvbmcgaW50IG47Ci0tCSAgc3RydWN0IHBhcnNlX2FyZ3MgYXJnczsKLS0KLS0JICAvKiBGaXJzdCBnZXQgdGhlIG51bWJlci4gICovCi0tCSAgbnBsdXJhbHMgKz0gOTsKLS0JICB3aGlsZSAoKm5wbHVyYWxzICE9ICdcMCcgJiYgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpucGx1cmFscykpCi0tCSAgICArK25wbHVyYWxzOwotLQkgIGlmICghKCpucGx1cmFscyA+PSAnMCcgJiYgKm5wbHVyYWxzIDw9ICc5JykpCi0tCSAgICBnb3RvIG5vX3BsdXJhbDsKLS0jaWYgZGVmaW5lZCBIQVZFX1NUUlRPVUwgfHwgZGVmaW5lZCBfTElCQwotLQkgIG4gPSBzdHJ0b3VsIChucGx1cmFscywgJmVuZHAsIDEwKTsKLS0jZWxzZQotLQkgIGZvciAoZW5kcCA9IG5wbHVyYWxzLCBuID0gMDsgKmVuZHAgPj0gJzAnICYmICplbmRwIDw9ICc5JzsgZW5kcCsrKQotLQkgICAgbiA9IG4gKiAxMCArICgqZW5kcCAtICcwJyk7Ci0tI2VuZGlmCi0tCSAgaWYgKG5wbHVyYWxzID09IGVuZHApCi0tCSAgICBnb3RvIG5vX3BsdXJhbDsKLS0JICAqbnBsdXJhbHNwID0gbjsKLS0KLS0JICAvKiBEdWUgdG8gdGhlIHJlc3RyaWN0aW9ucyBiaXNvbiBpbXBvc2VzIG9udG8gdGhlIGludGVyZmFjZSBvZiB0aGUKLS0JICAgICBzY2FubmVyIGZ1bmN0aW9uIHdlIGhhdmUgdG8gcHV0IHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSByZXN1bHQKLS0JICAgICBwYXNzZWQgdXAgZnJvbSB0aGUgcGFyc2VyIGludG8gdGhlIHNhbWUgc3RydWN0dXJlIHdoaWNoIGFkZHJlc3MKLS0JICAgICBpcyBwYXNzZWQgZG93biB0byB0aGUgcGFyc2VyLiAgKi8KLS0JICBwbHVyYWwgKz0gNzsKLS0JICBhcmdzLmNwID0gcGx1cmFsOwotLQkgIGlmIChQTFVSQUxfUEFSU0UgKCZhcmdzKSAhPSAwKQotLQkgICAgZ290byBub19wbHVyYWw7Ci0tCSAgKnBsdXJhbHAgPSBhcmdzLnJlczsKLS0JfQotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICAvKiBCeSBkZWZhdWx0IHdlIGFyZSB1c2luZyB0aGUgR2VybWFuaWMgZm9ybTogc2luZ3VsYXIgZm9ybSBvbmx5Ci0tICAgICAgICAgZm9yIGBvbmUnLCB0aGUgcGx1cmFsIGZvcm0gb3RoZXJ3aXNlLiAgWWVzLCB0aGlzIGlzIGFsc28gd2hhdAotLSAgICAgICAgIEVuZ2xpc2ggaXMgdXNpbmcgc2luY2UgRW5nbGlzaCBpcyBhIEdlcm1hbmljIGxhbmd1YWdlLiAgKi8KLS0gICAgbm9fcGx1cmFsOgotLSAgICAgIElOSVRfR0VSTUFOSUNfUExVUkFMICgpOwotLSAgICAgICpwbHVyYWxwID0gJkdFUk1BTklDX1BMVVJBTDsKLS0gICAgICAqbnBsdXJhbHNwID0gMjsKLS0gICAgfQotLX0KLS0tLSBhL2ludGwvcGx1cmFsLWV4cC5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMjkgKzAsMCBAQAotLS8qIEV4cHJlc3Npb24gcGFyc2luZyBhbmQgZXZhbHVhdGlvbiBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzLCAyMDA1LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX1BMVVJBTF9FWFBfSAotLSNkZWZpbmUgX1BMVVJBTF9FWFBfSAotLQotLSNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KLS0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotLSNlbmRpZgotLQotLSNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgotLSMgZGVmaW5lIGF0dHJpYnV0ZV9oaWRkZW4KLS0jZW5kaWYKLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jZW5kaWYKLS0KLS0KLS1lbnVtIGV4cHJlc3Npb25fb3BlcmF0b3IKLS17Ci0tICAvKiBXaXRob3V0IGFyZ3VtZW50czogICovCi0tICB2YXIsCQkJCS8qIFRoZSB2YXJpYWJsZSAibiIuICAqLwotLSAgbnVtLAkJCQkvKiBEZWNpbWFsIG51bWJlci4gICovCi0tICAvKiBVbmFyeSBvcGVyYXRvcnM6ICAqLwotLSAgbG5vdCwJCQkJLyogTG9naWNhbCBOT1QuICAqLwotLSAgLyogQmluYXJ5IG9wZXJhdG9yczogICovCi0tICBtdWx0LAkJCQkvKiBNdWx0aXBsaWNhdGlvbi4gICovCi0tICBkaXZpZGUsCQkJLyogRGl2aXNpb24uICAqLwotLSAgbW9kdWxlLAkJCS8qIE1vZHVsbyBvcGVyYXRpb24uICAqLwotLSAgcGx1cywJCQkJLyogQWRkaXRpb24uICAqLwotLSAgbWludXMsCQkJLyogU3VidHJhY3Rpb24uICAqLwotLSAgbGVzc190aGFuLAkJCS8qIENvbXBhcmlzb24uICAqLwotLSAgZ3JlYXRlcl90aGFuLAkJCS8qIENvbXBhcmlzb24uICAqLwotLSAgbGVzc19vcl9lcXVhbCwJCS8qIENvbXBhcmlzb24uICAqLwotLSAgZ3JlYXRlcl9vcl9lcXVhbCwJCS8qIENvbXBhcmlzb24uICAqLwotLSAgZXF1YWwsCQkJLyogQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkuICAqLwotLSAgbm90X2VxdWFsLAkJCS8qIENvbXBhcmlzb24gZm9yIGluZXF1YWxpdHkuICAqLwotLSAgbGFuZCwJCQkJLyogTG9naWNhbCBBTkQuICAqLwotLSAgbG9yLAkJCQkvKiBMb2dpY2FsIE9SLiAgKi8KLS0gIC8qIFRlcm5hcnkgb3BlcmF0b3JzOiAgKi8KLS0gIHFtb3AJCQkJLyogUXVlc3Rpb24gbWFyayBvcGVyYXRvci4gICovCi0tfTsKLS0KLS0vKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHRoZQotLSAgIHBsdXJhbCBmb3JtLiAgKi8KLS1zdHJ1Y3QgZXhwcmVzc2lvbgotLXsKLS0gIGludCBuYXJnczsJCQkvKiBOdW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLS0gIGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcGVyYXRpb247Ci0tICB1bmlvbgotLSAgewotLSAgICB1bnNpZ25lZCBsb25nIGludCBudW07CS8qIE51bWJlciB2YWx1ZSBmb3IgYG51bScuICAqLwotLSAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1szXTsJLyogVXAgdG8gdGhyZWUgYXJndW1lbnRzLiAgKi8KLS0gIH0gdmFsOwotLX07Ci0tCi0tLyogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byB0aGUgcGFyc2VyIGFuZCBnZXQKLS0gICB0aGUgcmVzdWx0IGluIGEgdGhyZWFkLXNhZmUgd2F5LiAgKi8KLS1zdHJ1Y3QgcGFyc2VfYXJncwotLXsKLS0gIGNvbnN0IGNoYXIgKmNwOwotLSAgc3RydWN0IGV4cHJlc3Npb24gKnJlczsKLS19OwotLQotLQotLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoaXMgc291cmNlIGNvZGUgaXMgdXNlZAotLSAgIDEuIGluIHRoZSBHTlUgQyBMaWJyYXJ5IGxpYnJhcnksCi0tICAgMi4gaW4gdGhlIEdOVSBsaWJpbnRsIGxpYnJhcnksCi0tICAgMy4gaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLgotLSAgIFRoZSBmdW5jdGlvbiBuYW1lcyBpbiBlYWNoIHNpdHVhdGlvbiBtdXN0IGJlIGRpZmZlcmVudCwgdG8gYWxsb3cgZm9yCi0tICAgYmluYXJ5IGluY29tcGF0aWJsZSBjaGFuZ2VzIGluICdzdHJ1Y3QgZXhwcmVzc2lvbicuICBGdXJ0aGVybW9yZSwKLS0gICAxLiBpbiB0aGUgR05VIEMgTGlicmFyeSBsaWJyYXJ5LCB0aGUgbmFtZXMgaGF2ZSBhIF9fIHByZWZpeCwKLS0gICAyLiszLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSBhbmQgaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLCB0aGUgbmFtZXMKLS0gICAgICAgICBtdXN0IGZvbGxvdyBBTlNJIEMgYW5kIG5vdCBzdGFydCB3aXRoIF9fLgotLSAgIFNvIHdlIGhhdmUgdG8gZGlzdGluZ3Vpc2ggdGhlIHRocmVlIGNhc2VzLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gX19nZXR0ZXh0X2ZyZWVfZXhwCi0tIyBkZWZpbmUgUExVUkFMX1BBUlNFIF9fZ2V0dGV4dHBhcnNlCi0tIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIF9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwKLS0jIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIF9fZ2V0dGV4dF9leHRyYWN0X3BsdXJhbAotLSNlbGlmIGRlZmluZWQgKElOX0xJQklOVEwpCi0tIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9mcmVlX2V4cAotLSMgZGVmaW5lIFBMVVJBTF9QQVJTRSBsaWJpbnRsX2dldHRleHRwYXJzZQotLSMgZGVmaW5lIEdFUk1BTklDX1BMVVJBTCBsaWJpbnRsX2dldHRleHRfZ2VybWFuaWNfcGx1cmFsCi0tIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBsaWJpbnRsX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKLS0jZWxzZQotLSMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBmcmVlX3BsdXJhbF9leHByZXNzaW9uCi0tIyBkZWZpbmUgUExVUkFMX1BBUlNFIHBhcnNlX3BsdXJhbF9leHByZXNzaW9uCi0tIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIGdlcm1hbmljX3BsdXJhbAotLSMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gZXh0cmFjdF9wbHVyYWxfZXhwcmVzc2lvbgotLSNlbmRpZgotLQotLWV4dGVybiB2b2lkIEZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKLS0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotLWV4dGVybiBpbnQgUExVUkFMX1BBUlNFICh2b2lkICphcmcpOwotLWV4dGVybiBzdHJ1Y3QgZXhwcmVzc2lvbiBHRVJNQU5JQ19QTFVSQUwgYXR0cmlidXRlX2hpZGRlbjsKLS1leHRlcm4gdm9pZCBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChjb25zdCBjaGFyICpudWxsZW50cnksCi0tCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKnBsdXJhbHAsCi0tCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGludCAqbnBsdXJhbHNwKQotLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0tCi0tI2lmICFkZWZpbmVkIChfTElCQykgJiYgIWRlZmluZWQgKElOX0xJQklOVEwpICYmICFkZWZpbmVkIChJTl9MSUJHTE9DQUxFKQotLWV4dGVybiB1bnNpZ25lZCBsb25nIGludCBwbHVyYWxfZXZhbCAoY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gKnBleHAsCi0tCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IG4pOwotLSNlbmRpZgotLQotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLX0KLS0jZW5kaWYKLS0KLS0jZW5kaWYgLyogX1BMVVJBTF9FWFBfSCAqLwotLS0tIGEvaW50bC9wbHVyYWwuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTk4MSArMCwwIEBACi0tCi0tLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNC4xLiAgKi8KLS0KLS0vKiBTa2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCi0tICAgCi0tICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2Ci0tICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tICAgCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLS0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0tICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0gICAKLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLS0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLSAgIAotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0tICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotLQotLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucwotLSAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi0tICAgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHNvIGxvbmcgYXMgdGhhdCB3b3JrIGlzbid0IGl0c2VsZiBhCi0tICAgcGFyc2VyIGdlbmVyYXRvciB1c2luZyB0aGUgc2tlbGV0b24gb3IgYSBtb2RpZmllZCB2ZXJzaW9uIHRoZXJlb2YKLS0gICBhcyBhIHBhcnNlciBza2VsZXRvbi4gIEFsdGVybmF0aXZlbHksIGlmIHlvdSBtb2RpZnkgb3IgcmVkaXN0cmlidXRlCi0tICAgdGhlIHBhcnNlciBza2VsZXRvbiBpdHNlbGYsIHlvdSBtYXkgKGF0IHlvdXIgb3B0aW9uKSByZW1vdmUgdGhpcwotLSAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZwotLSAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSB3aXRob3V0IHRoaXMgc3BlY2lhbCBleGNlcHRpb24uCi0tICAgCi0tICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgotLSAgIHZlcnNpb24gMi4yIG9mIEJpc29uLiAgKi8KLS0KLS0vKiBDIExBTFIoMSkgcGFyc2VyIHNrZWxldG9uIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiwgYnkKLS0gICBzaW1wbGlmeWluZyB0aGUgb3JpZ2luYWwgc28tY2FsbGVkICJzZW1hbnRpYyIgcGFyc2VyLiAgKi8KLS0KLS0vKiBBbGwgc3ltYm9scyBkZWZpbmVkIGJlbG93IHNob3VsZCBiZWdpbiB3aXRoIHl5IG9yIFlZLCB0byBhdm9pZAotLSAgIGluZnJpbmdpbmcgb24gdXNlciBuYW1lIHNwYWNlLiAgVGhpcyBzaG91bGQgYmUgZG9uZSBldmVuIGZvciBsb2NhbAotLSAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCi0tICAgVGhlcmUgYXJlIHNvbWUgdW5hdm9pZGFibGUgZXhjZXB0aW9ucyB3aXRoaW4gaW5jbHVkZSBmaWxlcyB0bwotLSAgIGRlZmluZSBuZWNlc3NhcnkgbGlicmFyeSBzeW1ib2xzOyB0aGV5IGFyZSBub3RlZCAiSU5GUklOR0VTIE9OCi0tICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCi0tCi0tLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KLS0jZGVmaW5lIFlZQklTT04gMQotLQotLS8qIEJpc29uIHZlcnNpb24uICAqLwotLSNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjQuMSIKLS0KLS0vKiBTa2VsZXRvbiBuYW1lLiAgKi8KLS0jZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgotLQotLS8qIFB1cmUgcGFyc2Vycy4gICovCi0tI2RlZmluZSBZWVBVUkUgMQotLQotLS8qIFB1c2ggcGFyc2Vycy4gICovCi0tI2RlZmluZSBZWVBVU0ggMAotLQotLS8qIFB1bGwgcGFyc2Vycy4gICovCi0tI2RlZmluZSBZWVBVTEwgMQotLQotLS8qIFVzaW5nIGxvY2F0aW9ucy4gICovCi0tI2RlZmluZSBZWUxTUF9ORUVERUQgMAotLQotLS8qIFN1YnN0aXR1dGUgdGhlIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBuYW1lcy4gICovCi0tI2RlZmluZSB5eXBhcnNlICAgICAgICAgX19nZXR0ZXh0cGFyc2UKLS0jZGVmaW5lIHl5bGV4ICAgICAgICAgICBfX2dldHRleHRsZXgKLS0jZGVmaW5lIHl5ZXJyb3IgICAgICAgICBfX2dldHRleHRlcnJvcgotLSNkZWZpbmUgeXlsdmFsICAgICAgICAgIF9fZ2V0dGV4dGx2YWwKLS0jZGVmaW5lIHl5Y2hhciAgICAgICAgICBfX2dldHRleHRjaGFyCi0tI2RlZmluZSB5eWRlYnVnICAgICAgICAgX19nZXR0ZXh0ZGVidWcKLS0jZGVmaW5lIHl5bmVycnMgICAgICAgICBfX2dldHRleHRuZXJycwotLQotLQotLS8qIENvcHkgdGhlIGZpcnN0IHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwotLQotLS8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxICJwbHVyYWwueSIKLS0KLS0vKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDIwMDAuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBGb3IgYmlzb24gPCAyLjAsIHRoZSBiaXNvbiBnZW5lcmF0ZWQgcGFyc2VyIHVzZXMgYWxsb2NhLiAgQUlYIDMgZm9yY2VzIHVzCi0tICAgdG8gcHV0IHRoaXMgZGVjbGFyYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZSBkZWNsYXJhdGlvbiBpbgotLSAgIGJpc29uJ3Mgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+Ci0tICAgYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlIGFyYml0cmFyeSBzeXN0ZW0gaGVhZGVycy4KLS0gICBUaGlzIGNhbiBnbyBhd2F5IG9uY2UgdGhlIEFNX0lOVExfU1VCRElSIG1hY3JvIHJlcXVpcmVzIGJpc29uID49IDIuMC4gICovCi0tI2lmIGRlZmluZWQgX0FJWCAmJiAhZGVmaW5lZCBfX0dOVUNfXwotLSAjcHJhZ21hIGFsbG9jYQotLSNlbmRpZgotLQotLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSAicGx1cmFsLWV4cC5oIgotLQotLS8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKLS0gICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KLS0jaWZuZGVmIF9MSUJDCi0tIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCi0tI2VuZGlmCi0tCi0tI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAotLSNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKLS0KLS0KLS0vKiBMaW5lIDE4OSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTMwICJwbHVyYWwuYyIKLS0KLS0vKiBFbmFibGluZyB0cmFjZXMuICAqLwotLSNpZm5kZWYgWVlERUJVRwotLSMgZGVmaW5lIFlZREVCVUcgMAotLSNlbmRpZgotLQotLS8qIEVuYWJsaW5nIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMuICAqLwotLSNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKLS0jIHVuZGVmIFlZRVJST1JfVkVSQk9TRQotLSMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAxCi0tI2Vsc2UKLS0jIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMAotLSNlbmRpZgotLQotLS8qIEVuYWJsaW5nIHRoZSB0b2tlbiB0YWJsZS4gICovCi0tI2lmbmRlZiBZWVRPS0VOX1RBQkxFCi0tIyBkZWZpbmUgWVlUT0tFTl9UQUJMRSAwCi0tI2VuZGlmCi0tCi0tCi0tLyogVG9rZW5zLiAgKi8KLS0jaWZuZGVmIFlZVE9LRU5UWVBFCi0tIyBkZWZpbmUgWVlUT0tFTlRZUEUKLS0gICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKLS0gICAgICBrbm93IGFib3V0IHRoZW0uICAqLwotLSAgIGVudW0geXl0b2tlbnR5cGUgewotLSAgICAgRVFVT1AyID0gMjU4LAotLSAgICAgQ01QT1AyID0gMjU5LAotLSAgICAgQURET1AyID0gMjYwLAotLSAgICAgTVVMT1AyID0gMjYxLAotLSAgICAgTlVNQkVSID0gMjYyCi0tICAgfTsKLS0jZW5kaWYKLS0vKiBUb2tlbnMuICAqLwotLSNkZWZpbmUgRVFVT1AyIDI1OAotLSNkZWZpbmUgQ01QT1AyIDI1OQotLSNkZWZpbmUgQURET1AyIDI2MAotLSNkZWZpbmUgTVVMT1AyIDI2MQotLSNkZWZpbmUgTlVNQkVSIDI2MgotLQotLQotLQotLQotLSNpZiAhIGRlZmluZWQgWVlTVFlQRSAmJiAhIGRlZmluZWQgWVlTVFlQRV9JU19ERUNMQVJFRAotLXR5cGVkZWYgdW5pb24gWVlTVFlQRQotLXsKLS0KLS0vKiBMaW5lIDIxNCBvZiB5YWNjLmMgICovCi0tI2xpbmUgNTEgInBsdXJhbC55IgotLQotLSAgdW5zaWduZWQgbG9uZyBpbnQgbnVtOwotLSAgZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wOwotLSAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKLS0KLS0KLS0KLS0vKiBMaW5lIDIxNCBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTg4ICJwbHVyYWwuYyIKLS19IFlZU1RZUEU7Ci0tIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKLS0jIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCi0tIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCi0tI2VuZGlmCi0tCi0tCi0tLyogQ29weSB0aGUgc2Vjb25kIHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwotLQotLS8qIExpbmUgMjY0IG9mIHlhY2MuYyAgKi8KLS0jbGluZSA1NyAicGx1cmFsLnkiCi0tCi0tLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLS1zdGF0aWMgaW50IHl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCk7Ci0tc3RhdGljIHZvaWQgeXllcnJvciAoY29uc3QgY2hhciAqc3RyKTsKLS0KLS0vKiBBbGxvY2F0aW9uIG9mIGV4cHJlc3Npb25zLiAgKi8KLS0KLS1zdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgotLW5ld19leHAgKGludCBuYXJncywgZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wLAotLQkgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKLS17Ci0tICBpbnQgaTsKLS0gIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOwotLQotLSAgLyogSWYgYW55IG9mIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgbWFsbG9jJ2VkLCBqdXN0IHJldHVybiBOVUxMLiAgKi8KLS0gIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0tICAgIGlmIChhcmdzW2ldID09IE5VTEwpCi0tICAgICAgZ290byBmYWlsOwotLQotLSAgLyogQWxsb2NhdGUgYSBuZXcgZXhwcmVzc2lvbi4gICovCi0tICBuZXdwID0gKHN0cnVjdCBleHByZXNzaW9uICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOwotLSAgaWYgKG5ld3AgIT0gTlVMTCkKLS0gICAgewotLSAgICAgIG5ld3AtPm5hcmdzID0gbmFyZ3M7Ci0tICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7Ci0tICAgICAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKLS0JbmV3cC0+dmFsLmFyZ3NbaV0gPSBhcmdzW2ldOwotLSAgICAgIHJldHVybiBuZXdwOwotLSAgICB9Ci0tCi0tIGZhaWw6Ci0tICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotLSAgICBGUkVFX0VYUFJFU1NJT04gKGFyZ3NbaV0pOwotLQotLSAgcmV0dXJuIE5VTEw7Ci0tfQotLQotLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotLW5ld19leHBfMCAoZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wKQotLXsKLS0gIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7Ci0tfQotLQotLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotLW5ld19leHBfMSAoZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCi0tewotLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMV07Ci0tCi0tICBhcmdzWzBdID0gcmlnaHQ7Ci0tICByZXR1cm4gbmV3X2V4cCAoMSwgb3AsIGFyZ3MpOwotLX0KLS0KLS1zdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgotLW5ld19leHBfMiAoZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqbGVmdCwKLS0JICAgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQotLXsKLS0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzJdOwotLQotLSAgYXJnc1swXSA9IGxlZnQ7Ci0tICBhcmdzWzFdID0gcmlnaHQ7Ci0tICByZXR1cm4gbmV3X2V4cCAoMiwgb3AsIGFyZ3MpOwotLX0KLS0KLS1zdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKLS1uZXdfZXhwXzMgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmJleHAsCi0tCSAgIHN0cnVjdCBleHByZXNzaW9uICp0YnJhbmNoLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZmJyYW5jaCkKLS17Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1szXTsKLS0KLS0gIGFyZ3NbMF0gPSBiZXhwOwotLSAgYXJnc1sxXSA9IHRicmFuY2g7Ci0tICBhcmdzWzJdID0gZmJyYW5jaDsKLS0gIHJldHVybiBuZXdfZXhwICgzLCBvcCwgYXJncyk7Ci0tfQotLQotLQotLQotLS8qIExpbmUgMjY0IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAyNzggInBsdXJhbC5jIgotLQotLSNpZmRlZiBzaG9ydAotLSMgdW5kZWYgc2hvcnQKLS0jZW5kaWYKLS0KLS0jaWZkZWYgWVlUWVBFX1VJTlQ4Ci0tdHlwZWRlZiBZWVRZUEVfVUlOVDggeXl0eXBlX3VpbnQ4OwotLSNlbHNlCi0tdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHl5dHlwZV91aW50ODsKLS0jZW5kaWYKLS0KLS0jaWZkZWYgWVlUWVBFX0lOVDgKLS10eXBlZGVmIFlZVFlQRV9JTlQ4IHl5dHlwZV9pbnQ4OwotLSNlbGlmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0tdHlwZWRlZiBzaWduZWQgY2hhciB5eXR5cGVfaW50ODsKLS0jZWxzZQotLXR5cGVkZWYgc2hvcnQgaW50IHl5dHlwZV9pbnQ4OwotLSNlbmRpZgotLQotLSNpZmRlZiBZWVRZUEVfVUlOVDE2Ci0tdHlwZWRlZiBZWVRZUEVfVUlOVDE2IHl5dHlwZV91aW50MTY7Ci0tI2Vsc2UKLS10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB5eXR5cGVfdWludDE2OwotLSNlbmRpZgotLQotLSNpZmRlZiBZWVRZUEVfSU5UMTYKLS10eXBlZGVmIFlZVFlQRV9JTlQxNiB5eXR5cGVfaW50MTY7Ci0tI2Vsc2UKLS10eXBlZGVmIHNob3J0IGludCB5eXR5cGVfaW50MTY7Ci0tI2VuZGlmCi0tCi0tI2lmbmRlZiBZWVNJWkVfVAotLSMgaWZkZWYgX19TSVpFX1RZUEVfXwotLSMgIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCi0tIyBlbGlmIGRlZmluZWQgc2l6ZV90Ci0tIyAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAotLSMgZWxpZiAhIGRlZmluZWQgWVlTSVpFX1QgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS0jICBpbmNsdWRlIDxzdGRkZWYuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotLSMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKLS0jIGVsc2UKLS0jICBkZWZpbmUgWVlTSVpFX1QgdW5zaWduZWQgaW50Ci0tIyBlbmRpZgotLSNlbmRpZgotLQotLSNkZWZpbmUgWVlTSVpFX01BWElNVU0gKChZWVNJWkVfVCkgLTEpCi0tCi0tI2lmbmRlZiBZWV8KLS0jIGlmIFlZRU5BQkxFX05MUwotLSMgIGlmIEVOQUJMRV9OTFMKLS0jICAgaW5jbHVkZSA8bGliaW50bC5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0tIyAgIGRlZmluZSBZWV8obXNnaWQpIGRnZXR0ZXh0ICgiYmlzb24tcnVudGltZSIsIG1zZ2lkKQotLSMgIGVuZGlmCi0tIyBlbmRpZgotLSMgaWZuZGVmIFlZXwotLSMgIGRlZmluZSBZWV8obXNnaWQpIG1zZ2lkCi0tIyBlbmRpZgotLSNlbmRpZgotLQotLS8qIFN1cHByZXNzIHVudXNlZC12YXJpYWJsZSB3YXJuaW5ncyBieSAidXNpbmciIEUuICAqLwotLSNpZiAhIGRlZmluZWQgbGludCB8fCBkZWZpbmVkIF9fR05VQ19fCi0tIyBkZWZpbmUgWVlVU0UoZSkgKCh2b2lkKSAoZSkpCi0tI2Vsc2UKLS0jIGRlZmluZSBZWVVTRShlKSAvKiBlbXB0eSAqLwotLSNlbmRpZgotLQotLS8qIElkZW50aXR5IGZ1bmN0aW9uLCB1c2VkIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IGNvbnN0YW50IGNvbmRpdGlvbnMuICAqLwotLSNpZm5kZWYgbGludAotLSMgZGVmaW5lIFlZSUQobikgKG4pCi0tI2Vsc2UKLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1zdGF0aWMgaW50Ci0tWVlJRCAoaW50IHl5aSkKLS0jZWxzZQotLXN0YXRpYyBpbnQKLS1ZWUlEICh5eWkpCi0tICAgIGludCB5eWk7Ci0tI2VuZGlmCi0tewotLSAgcmV0dXJuIHl5aTsKLS19Ci0tI2VuZGlmCi0tCi0tI2lmICEgZGVmaW5lZCB5eW92ZXJmbG93IHx8IFlZRVJST1JfVkVSQk9TRQotLQotLS8qIFRoZSBwYXJzZXIgaW52b2tlcyBhbGxvY2Egb3IgbWFsbG9jOyBkZWZpbmUgdGhlIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KLS0KLS0jIGlmZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQotLSMgIGlmIFlZU1RBQ0tfVVNFX0FMTE9DQQotLSMgICBpZmRlZiBfX0dOVUNfXwotLSMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQotLSMgICBlbGlmIGRlZmluZWQgX19CVUlMVElOX1ZBX0FSR19JTkNSCi0tIyAgICBpbmNsdWRlIDxhbGxvY2EuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotLSMgICBlbGlmIGRlZmluZWQgX0FJWAotLSMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19hbGxvY2EKLS0jICAgZWxpZiBkZWZpbmVkIF9NU0NfVkVSCi0tIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotLSMgICAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0tIyAgIGVsc2UKLS0jICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQotLSMgICAgaWYgISBkZWZpbmVkIF9BTExPQ0FfSCAmJiAhIGRlZmluZWQgX1NURExJQl9IICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0tIyAgICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLS0jICAgICBpZm5kZWYgX1NURExJQl9ICi0tIyAgICAgIGRlZmluZSBfU1RETElCX0ggMQotLSMgICAgIGVuZGlmCi0tIyAgICBlbmRpZgotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tIyBlbmRpZgotLQotLSMgaWZkZWYgWVlTVEFDS19BTExPQwotLSAgIC8qIFBhY2lmeSBHQ0MncyBgZW1wdHkgaWYtYm9keScgd2FybmluZy4gICovCi0tIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRShQdHIpIGRvIHsgLyogZW1wdHkgKi87IH0gd2hpbGUgKFlZSUQgKDApKQotLSMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KLS0gICAgLyogVGhlIE9TIG1pZ2h0IGd1YXJhbnRlZSBvbmx5IG9uZSBndWFyZCBwYWdlIGF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLAotLSAgICAgICBhbmQgYSBwYWdlIHNpemUgY2FuIGJlIGFzIHNtYWxsIGFzIDQwOTYgYnl0ZXMuICBTbyB3ZSBjYW5ub3Qgc2FmZWx5Ci0tICAgICAgIGludm9rZSBhbGxvY2EgKE4pIGlmIE4gZXhjZWVkcyA0MDk2LiAgVXNlIGEgc2xpZ2h0bHkgc21hbGxlciBudW1iZXIKLS0gICAgICAgdG8gYWxsb3cgZm9yIGEgZmV3IGNvbXBpbGVyLWFsbG9jYXRlZCB0ZW1wb3Jhcnkgc3RhY2sgc2xvdHMuICAqLwotLSMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIDQwMzIgLyogcmVhc29uYWJsZSBjaXJjYSAyMDA2ICovCi0tIyAgZW5kaWYKLS0jIGVsc2UKLS0jICBkZWZpbmUgWVlTVEFDS19BTExPQyBZWU1BTExPQwotLSMgIGRlZmluZSBZWVNUQUNLX0ZSRUUgWVlGUkVFCi0tIyAgaWZuZGVmIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTQotLSMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIFlZU0laRV9NQVhJTVVNCi0tIyAgZW5kaWYKLS0jICBpZiAoZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiAhIGRlZmluZWQgX1NURExJQl9IIFwKLS0gICAgICAgJiYgISAoKGRlZmluZWQgWVlNQUxMT0MgfHwgZGVmaW5lZCBtYWxsb2MpIFwKLS0JICAgICAmJiAoZGVmaW5lZCBZWUZSRUUgfHwgZGVmaW5lZCBmcmVlKSkpCi0tIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0tIyAgIGlmbmRlZiBfU1RETElCX0gKLS0jICAgIGRlZmluZSBfU1RETElCX0ggMQotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tIyAgaWZuZGVmIFlZTUFMTE9DCi0tIyAgIGRlZmluZSBZWU1BTExPQyBtYWxsb2MKLS0jICAgaWYgISBkZWZpbmVkIG1hbGxvYyAmJiAhIGRlZmluZWQgX1NURExJQl9IICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0tdm9pZCAqbWFsbG9jIChZWVNJWkVfVCk7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLS0jICAgZW5kaWYKLS0jICBlbmRpZgotLSMgIGlmbmRlZiBZWUZSRUUKLS0jICAgZGVmaW5lIFlZRlJFRSBmcmVlCi0tIyAgIGlmICEgZGVmaW5lZCBmcmVlICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS12b2lkIGZyZWUgKHZvaWQgKik7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLS0jICAgZW5kaWYKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jZW5kaWYgLyogISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFICovCi0tCi0tCi0tI2lmICghIGRlZmluZWQgeXlvdmVyZmxvdyBcCi0tICAgICAmJiAoISBkZWZpbmVkIF9fY3BsdXNwbHVzIFwKLS0JIHx8IChkZWZpbmVkIFlZU1RZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKLS0KLS0vKiBBIHR5cGUgdGhhdCBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBhbnkgc3RhY2sgbWVtYmVyLiAgKi8KLS11bmlvbiB5eWFsbG9jCi0tewotLSAgeXl0eXBlX2ludDE2IHl5c3NfYWxsb2M7Ci0tICBZWVNUWVBFIHl5dnNfYWxsb2M7Ci0tfTsKLS0KLS0vKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLwotLSMgZGVmaW5lIFlZU1RBQ0tfR0FQX01BWElNVU0gKHNpemVvZiAodW5pb24geXlhbGxvYykgLSAxKQotLQotLS8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAotLSAgIE4gZWxlbWVudHMuICAqLwotLSMgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAotLSAgICAgKChOKSAqIChzaXplb2YgKHl5dHlwZV9pbnQxNikgKyBzaXplb2YgKFlZU1RZUEUpKSBcCi0tICAgICAgKyBZWVNUQUNLX0dBUF9NQVhJTVVNKQotLQotLS8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbwotLSAgIG5vdCBvdmVybGFwLiAgKi8KLS0jIGlmbmRlZiBZWUNPUFkKLS0jICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIDEgPCBfX0dOVUNfXwotLSMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAotLSAgICAgIF9fYnVpbHRpbl9tZW1jcHkgKFRvLCBGcm9tLCAoQ291bnQpICogc2l6ZW9mICgqKEZyb20pKSkKLS0jICBlbHNlCi0tIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAotLSAgICAgIGRvCQkJCQlcCi0tCXsJCQkJCVwKLS0JICBZWVNJWkVfVCB5eWk7CQkJCVwKLS0JICBmb3IgKHl5aSA9IDA7IHl5aSA8IChDb3VudCk7IHl5aSsrKQlcCi0tCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKLS0JfQkJCQkJXAotLSAgICAgIHdoaWxlIChZWUlEICgwKSkKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0KLS0vKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKLS0gICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKLS0gICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQotLSAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0Ci0tICAgc3RhY2suICAqLwotLSMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2tfYWxsb2MsIFN0YWNrKQkJCQlcCi0tICAgIGRvCQkJCQkJCQkJXAotLSAgICAgIHsJCQkJCQkJCQlcCi0tCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAotLQlZWUNPUFkgKCZ5eXB0ci0+U3RhY2tfYWxsb2MsIFN0YWNrLCB5eXNpemUpOwkJCVwKLS0JU3RhY2sgPSAmeXlwdHItPlN0YWNrX2FsbG9jOwkJCQkJXAotLQl5eW5ld2J5dGVzID0geXlzdGFja3NpemUgKiBzaXplb2YgKCpTdGFjaykgKyBZWVNUQUNLX0dBUF9NQVhJTVVNOyBcCi0tCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKLS0gICAgICB9CQkJCQkJCQkJXAotLSAgICB3aGlsZSAoWVlJRCAoMCkpCi0tCi0tI2VuZGlmCi0tCi0tLyogWVlGSU5BTCAtLSBTdGF0ZSBudW1iZXIgb2YgdGhlIHRlcm1pbmF0aW9uIHN0YXRlLiAgKi8KLS0jZGVmaW5lIFlZRklOQUwgIDkKLS0vKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KLS0jZGVmaW5lIFlZTEFTVCAgIDU0Ci0tCi0tLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICAqLwotLSNkZWZpbmUgWVlOVE9LRU5TICAxNgotLS8qIFlZTk5UUyAtLSBOdW1iZXIgb2Ygbm9udGVybWluYWxzLiAgKi8KLS0jZGVmaW5lIFlZTk5UUyAgMwotLS8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gICovCi0tI2RlZmluZSBZWU5SVUxFUyAgMTMKLS0vKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAgKi8KLS0jZGVmaW5lIFlZTlNUQVRFUyAgMjcKLS0KLS0vKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KLS0jZGVmaW5lIFlZVU5ERUZUT0sgIDIKLS0jZGVmaW5lIFlZTUFYVVRPSyAgIDI2MgotLQotLSNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKQkJCQkJCVwKLS0gICgodW5zaWduZWQgaW50KSAoWVlYKSA8PSBZWU1BWFVUT0sgPyB5eXRyYW5zbGF0ZVtZWVhdIDogWVlVTkRFRlRPSykKLS0KLS0vKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5dHJhbnNsYXRlW10gPQotLXsKLS0gICAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAxMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA1LCAgICAgMiwKLS0gICAgICAxNCwgICAgMTUsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAxMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLS0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICA2LCAgICAgNywKLS0gICAgICAgOCwgICAgIDksICAgIDExCi0tfTsKLS0KLS0jaWYgWVlERUJVRwotLS8qIFlZUFJIU1tZWU5dIC0tIEluZGV4IG9mIHRoZSBmaXJzdCBSSFMgc3ltYm9sIG9mIHJ1bGUgbnVtYmVyIFlZTiBpbgotLSAgIFlZUkhTLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cHJoc1tdID0KLS17Ci0tICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDUsICAgIDExLCAgICAxNSwgICAgMTksICAgIDIzLCAgICAyNywgICAgMzEsCi0tICAgICAgMzUsICAgIDM4LCAgICA0MCwgICAgNDIKLS19OwotLQotLS8qIFlZUkhTIC0tIEEgYC0xJy1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcnVsZXMnIFJIUy4gICovCi0tc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cmhzW10gPQotLXsKLS0gICAgICAxNywgICAgIDAsICAgIC0xLCAgICAxOCwgICAgLTEsICAgIDE4LCAgICAgMywgICAgMTgsICAgIDEyLCAgICAxOCwKLS0gICAgICAtMSwgICAgMTgsICAgICA0LCAgICAxOCwgICAgLTEsICAgIDE4LCAgICAgNSwgICAgMTgsICAgIC0xLCAgICAxOCwKLS0gICAgICAgNiwgICAgMTgsICAgIC0xLCAgICAxOCwgICAgIDcsICAgIDE4LCAgICAtMSwgICAgMTgsICAgICA4LCAgICAxOCwKLS0gICAgICAtMSwgICAgMTgsICAgICA5LCAgICAxOCwgICAgLTEsICAgIDEwLCAgICAxOCwgICAgLTEsICAgIDEzLCAgICAtMSwKLS0gICAgICAxMSwgICAgLTEsICAgIDE0LCAgICAxOCwgICAgMTUsICAgIC0xCi0tfTsKLS0KLS0vKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cmxpbmVbXSA9Ci0tewotLSAgICAgICAwLCAgIDE1NCwgICAxNTQsICAgMTYyLCAgIDE2NiwgICAxNzAsICAgMTc0LCAgIDE3OCwgICAxODIsICAgMTg2LAotLSAgICAgMTkwLCAgIDE5NCwgICAxOTgsICAgMjAzCi0tfTsKLS0jZW5kaWYKLS0KLS0jaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UgfHwgWVlUT0tFTl9UQUJMRQotLS8qIFlZVE5BTUVbU1lNQk9MLU5VTV0gLS0gU3RyaW5nIG5hbWUgb2YgdGhlIHN5bWJvbCBTWU1CT0wtTlVNLgotLSAgIEZpcnN0LCB0aGUgdGVybWluYWxzLCB0aGVuLCBzdGFydGluZyBhdCBZWU5UT0tFTlMsIG5vbnRlcm1pbmFscy4gICovCi0tc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9Ci0tewotLSAgIiRlbmQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZCIsICInPyciLCAiJ3wnIiwgIicmJyIsICJFUVVPUDIiLCAiQ01QT1AyIiwKLS0gICJBRERPUDIiLCAiTVVMT1AyIiwgIichJyIsICJOVU1CRVIiLCAiJzonIiwgIiduJyIsICInKCciLCAiJyknIiwKLS0gICIkYWNjZXB0IiwgInN0YXJ0IiwgImV4cCIsIDAKLS19OwotLSNlbmRpZgotLQotLSMgaWZkZWYgWVlQUklOVAotLS8qIFlZVE9LTlVNW1lZTEVYLU5VTV0gLS0gSW50ZXJuYWwgdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8KLS0gICB0b2tlbiBZWUxFWC1OVU0uICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5dG9rbnVtW10gPQotLXsKLS0gICAgICAgMCwgICAyNTYsICAgMjU3LCAgICA2MywgICAxMjQsICAgIDM4LCAgIDI1OCwgICAyNTksICAgMjYwLCAgIDI2MSwKLS0gICAgICAzMywgICAyNjIsICAgIDU4LCAgIDExMCwgICAgNDAsICAgIDQxCi0tfTsKLS0jIGVuZGlmCi0tCi0tLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCi0tc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXIxW10gPQotLXsKLS0gICAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwKLS0gICAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOAotLX07Ci0tCi0tLyogWVlSMltZWU5dIC0tIE51bWJlciBvZiBzeW1ib2xzIGNvbXBvc2luZyByaWdodCBoYW5kIHNpZGUgb2YgcnVsZSBZWU4uICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlyMltdID0KLS17Ci0tICAgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDUsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCi0tICAgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDMKLS19OwotLQotLS8qIFlZREVGQUNUW1NUQVRFLU5BTUVdIC0tIERlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZQotLSAgIFNUQVRFLU5VTSB3aGVuIFlZVEFCTEUgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybwotLSAgIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuIGVycm9yLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5ZGVmYWN0W10gPQotLXsKLS0gICAgICAgMCwgICAgIDAsICAgIDEyLCAgICAxMSwgICAgIDAsICAgICAwLCAgICAgMiwgICAgMTAsICAgICAwLCAgICAgMSwKLS0gICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTMsICAgICAwLCAgICAgNCwKLS0gICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICAwLCAgICAgMwotLX07Ci0tCi0tLyogWVlERUZHT1RPW05URVJNLU5VTV0uICAqLwotLXN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eWRlZmdvdG9bXSA9Ci0tewotLSAgICAgIC0xLCAgICAgNSwgICAgIDYKLS19OwotLQotLS8qIFlZUEFDVFtTVEFURS1OVU1dIC0tIEluZGV4IGluIFlZVEFCTEUgb2YgdGhlIHBvcnRpb24gZGVzY3JpYmluZwotLSAgIFNUQVRFLU5VTS4gICovCi0tI2RlZmluZSBZWVBBQ1RfTklORiAtMTAKLS1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlwYWN0W10gPQotLXsKLS0gICAgICAtOSwgICAgLTksICAgLTEwLCAgIC0xMCwgICAgLTksICAgICA4LCAgICAzNiwgICAtMTAsICAgIDEzLCAgIC0xMCwKLS0gICAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwgICAtMTAsICAgIDI2LCAgICA0MSwKLS0gICAgICA0NSwgICAgMTgsICAgIC0yLCAgICAxNCwgICAtMTAsICAgIC05LCAgICAzNgotLX07Ci0tCi0tLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlwZ290b1tdID0KLS17Ci0tICAgICAtMTAsICAgLTEwLCAgICAtMQotLX07Ci0tCi0tLyogWVlUQUJMRVtZWVBBQ1RbU1RBVEUtTlVNXV0uICBXaGF0IHRvIGRvIGluIHN0YXRlIFNUQVRFLU5VTS4gIElmCi0tICAgcG9zaXRpdmUsIHNoaWZ0IHRoYXQgdG9rZW4uICBJZiBuZWdhdGl2ZSwgcmVkdWNlIHRoZSBydWxlIHdoaWNoCi0tICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KLS0gICBJZiBZWVRBQkxFX05JTkYsIHN5bnRheCBlcnJvci4gICovCi0tI2RlZmluZSBZWVRBQkxFX05JTkYgLTEKLS1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5dGFibGVbXSA9Ci0tewotLSAgICAgICA3LCAgICAgMSwgICAgIDIsICAgICA4LCAgICAgMywgICAgIDQsICAgIDE1LCAgICAxNiwgICAgIDksICAgIDE4LAotLSAgICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAotLSAgICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE2LCAgICAyNiwgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDEwLAotLSAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgICAwLCAgICAgMCwgICAgMjUsICAgIDEwLAotLSAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotLSAgICAgIDE2LCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNgotLX07Ci0tCi0tc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5Y2hlY2tbXSA9Ci0tewotLSAgICAgICAxLCAgICAxMCwgICAgMTEsICAgICA0LCAgICAxMywgICAgMTQsICAgICA4LCAgICAgOSwgICAgIDAsICAgIDEwLAotLSAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LAotLSAgICAgICA3LCAgICAgOCwgICAgIDksICAgICA5LCAgICAyNSwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTUsICAgICAzLAotLSAgICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIC0xLCAgICAtMSwgICAgMTIsICAgICAzLAotLSAgICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAotLSAgICAgICA5LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOQotLX07Ci0tCi0tLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKLS0gICBzeW1ib2wgb2Ygc3RhdGUgU1RBVEUtTlVNLiAgKi8KLS1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5c3Rvc1tdID0KLS17Ci0tICAgICAgIDAsICAgIDEwLCAgICAxMSwgICAgMTMsICAgIDE0LCAgICAxNywgICAgMTgsICAgIDE4LCAgICAxOCwgICAgIDAsCi0tICAgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDE1LCAgICAxOCwgICAgMTgsCi0tICAgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxMiwgICAgMTgKLS19OwotLQotLSNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKLS0jZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKLS0jZGVmaW5lIFlZRU1QVFkJCSgtMikKLS0jZGVmaW5lIFlZRU9GCQkwCi0tCi0tI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCi0tI2RlZmluZSBZWUFCT1JUCQlnb3RvIHl5YWJvcnRsYWIKLS0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJvcmxhYgotLQotLQotLS8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKLS0gICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotLSAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KLS0KLS0jZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgotLQotLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotLQotLSNkZWZpbmUgWVlCQUNLVVAoVG9rZW4sIFZhbHVlKQkJCQkJXAotLWRvCQkJCQkJCQlcCi0tICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAotLSAgICB7CQkJCQkJCQlcCi0tICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCi0tICAgICAgeXlsdmFsID0gKFZhbHVlKTsJCQkJCQlcCi0tICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCi0tICAgICAgWVlQT1BTVEFDSyAoMSk7CQkJCQkJXAotLSAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAotLSAgICB9CQkJCQkJCQlcCi0tICBlbHNlCQkJCQkJCQlcCi0tICAgIHsJCQkJCQkJCVwKLS0gICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKSk7IFwKLS0gICAgICBZWUVSUk9SOwkJCQkJCQlcCi0tICAgIH0JCQkJCQkJCVwKLS13aGlsZSAoWVlJRCAoMCkpCi0tCi0tCi0tI2RlZmluZSBZWVRFUlJPUgkxCi0tI2RlZmluZSBZWUVSUkNPREUJMjU2Ci0tCi0tCi0tLyogWVlMTE9DX0RFRkFVTFQgLS0gU2V0IENVUlJFTlQgdG8gc3BhbiBmcm9tIFJIU1sxXSB0byBSSFNbTl0uCi0tICAgSWYgTiBpcyAwLCB0aGVuIHNldCBDVVJSRU5UIHRvIHRoZSBlbXB0eSBsb2NhdGlvbiB3aGljaCBlbmRzCi0tICAgdGhlIHByZXZpb3VzIHN5bWJvbDogUkhTWzBdIChhbHdheXMgZGVmaW5lZCkuICAqLwotLQotLSNkZWZpbmUgWVlSSFNMT0MoUmhzLCBLKSAoKFJocylbS10pCi0tI2lmbmRlZiBZWUxMT0NfREVGQVVMVAotLSMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJXAotLSAgICBkbwkJCQkJCQkJCVwKLS0gICAgICBpZiAoWVlJRCAoTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS0JewkJCQkJCQkJXAotLQkgIChDdXJyZW50KS5maXJzdF9saW5lICAgPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9saW5lOwlcCi0tCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2NvbHVtbjsJXAotLQkgIChDdXJyZW50KS5sYXN0X2xpbmUgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2xpbmU7CQlcCi0tCSAgKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfY29sdW1uOwlcCi0tCX0JCQkJCQkJCVwKLS0gICAgICBlbHNlCQkJCQkJCQlcCi0tCXsJCQkJCQkJCVwKLS0JICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gKEN1cnJlbnQpLmxhc3RfbGluZSAgID0JCVwKLS0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfbGluZTsJCQkJXAotLQkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSAoQ3VycmVudCkubGFzdF9jb2x1bW4gPQkJXAotLQkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9jb2x1bW47CQkJCVwKLS0JfQkJCQkJCQkJXAotLSAgICB3aGlsZSAoWVlJRCAoMCkpCi0tI2VuZGlmCi0tCi0tCi0tLyogWVlfTE9DQVRJT05fUFJJTlQgLS0gUHJpbnQgdGhlIGxvY2F0aW9uIG9uIHRoZSBzdHJlYW0uCi0tICAgVGhpcyBtYWNybyB3YXMgbm90IG1hbmRhdGVkIG9yaWdpbmFsbHk6IGRlZmluZSBvbmx5IGlmIHdlIGtub3cKLS0gICB3ZSB3b24ndCBicmVhayB1c2VyIGNvZGU6IHdoZW4gdGhlc2UgYXJlIHRoZSBsb2NhdGlvbnMgd2Uga25vdy4gICovCi0tCi0tI2lmbmRlZiBZWV9MT0NBVElPTl9QUklOVAotLSMgaWYgWVlMVFlQRV9JU19UUklWSUFMCi0tIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykJCQlcCi0tICAgICBmcHJpbnRmIChGaWxlLCAiJWQuJWQtJWQuJWQiLAkJCVwKLS0JICAgICAgKExvYykuZmlyc3RfbGluZSwgKExvYykuZmlyc3RfY29sdW1uLAlcCi0tCSAgICAgIChMb2MpLmxhc3RfbGluZSwgIChMb2MpLmxhc3RfY29sdW1uKQotLSMgZWxzZQotLSMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpICgodm9pZCkgMCkKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tCi0tLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCi0tCi0tI2lmZGVmIFlZTEVYX1BBUkFNCi0tIyBkZWZpbmUgWVlMRVggeXlsZXggKCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQotLSNlbHNlCi0tIyBkZWZpbmUgWVlMRVggeXlsZXggKCZ5eWx2YWwpCi0tI2VuZGlmCi0tCi0tLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLwotLSNpZiBZWURFQlVHCi0tCi0tIyBpZm5kZWYgWVlGUFJJTlRGCi0tIyAgaW5jbHVkZSA8c3RkaW8uaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotLSMgIGRlZmluZSBZWUZQUklOVEYgZnByaW50ZgotLSMgZW5kaWYKLS0KLS0jIGRlZmluZSBZWURQUklOVEYoQXJncykJCQlcCi0tZG8gewkJCQkJCVwKLS0gIGlmICh5eWRlYnVnKQkJCQkJXAotLSAgICBZWUZQUklOVEYgQXJnczsJCQkJXAotLX0gd2hpbGUgKFlZSUQgKDApKQotLQotLSMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQkJCSAgXAotLWRvIHsJCQkJCQkJCQkgIFwKLS0gIGlmICh5eWRlYnVnKQkJCQkJCQkJICBcCi0tICAgIHsJCQkJCQkJCQkgIFwKLS0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsJCQkJCSAgXAotLSAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLAkJCQkJCSAgXAotLQkJICBUeXBlLCBWYWx1ZSk7IFwKLS0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CQkJCQkJICBcCi0tICAgIH0JCQkJCQkJCQkgIFwKLS19IHdoaWxlIChZWUlEICgwKSkKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8Ci0tYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS0KLS0vKkFSR1NVU0VEKi8KLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1zdGF0aWMgdm9pZAotLXl5X3N5bWJvbF92YWx1ZV9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKLS0jZWxzZQotLXN0YXRpYyB2b2lkCi0teXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKLS0gICAgRklMRSAqeXlvdXRwdXQ7Ci0tICAgIGludCB5eXR5cGU7Ci0tICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKLS0jZW5kaWYKLS17Ci0tICBpZiAoIXl5dmFsdWVwKQotLSAgICByZXR1cm47Ci0tIyBpZmRlZiBZWVBSSU5UCi0tICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQotLSAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKLS0jIGVsc2UKLS0gIFlZVVNFICh5eW91dHB1dCk7Ci0tIyBlbmRpZgotLSAgc3dpdGNoICh5eXR5cGUpCi0tICAgIHsKLS0gICAgICBkZWZhdWx0OgotLQlicmVhazsKLS0gICAgfQotLX0KLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8Ci0tYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS0KLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1zdGF0aWMgdm9pZAotLXl5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKLS0jZWxzZQotLXN0YXRpYyB2b2lkCi0teXlfc3ltYm9sX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKLS0gICAgRklMRSAqeXlvdXRwdXQ7Ci0tICAgIGludCB5eXR5cGU7Ci0tICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKLS0jZW5kaWYKLS17Ci0tICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQotLSAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAidG9rZW4gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7Ci0tICBlbHNlCi0tICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKLS0KLS0gIHl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApOwotLSAgWVlGUFJJTlRGICh5eW91dHB1dCwgIikiKTsKLS19Ci0tCi0tLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCB5eV9zdGFja19wcmludCAtLSBQcmludCB0aGUgc3RhdGUgc3RhY2sgZnJvbSBpdHMgQk9UVE9NIHVwIHRvIGl0cyB8Ci0tfCBUT1AgKGluY2x1ZGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0tCi0tI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0tc3RhdGljIHZvaWQKLS15eV9zdGFja19wcmludCAoeXl0eXBlX2ludDE2ICp5eWJvdHRvbSwgeXl0eXBlX2ludDE2ICp5eXRvcCkKLS0jZWxzZQotLXN0YXRpYyB2b2lkCi0teXlfc3RhY2tfcHJpbnQgKHl5Ym90dG9tLCB5eXRvcCkKLS0gICAgeXl0eXBlX2ludDE2ICp5eWJvdHRvbTsKLS0gICAgeXl0eXBlX2ludDE2ICp5eXRvcDsKLS0jZW5kaWYKLS17Ci0tICBZWUZQUklOVEYgKHN0ZGVyciwgIlN0YWNrIG5vdyIpOwotLSAgZm9yICg7IHl5Ym90dG9tIDw9IHl5dG9wOyB5eWJvdHRvbSsrKQotLSAgICB7Ci0tICAgICAgaW50IHl5Ym90ID0gKnl5Ym90dG9tOwotLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgeXlib3QpOwotLSAgICB9Ci0tICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7Ci0tfQotLQotLSMgZGVmaW5lIFlZX1NUQUNLX1BSSU5UKEJvdHRvbSwgVG9wKQkJCQlcCi0tZG8gewkJCQkJCQkJXAotLSAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKLS0gICAgeXlfc3RhY2tfcHJpbnQgKChCb3R0b20pLCAoVG9wKSk7CQkJCVwKLS19IHdoaWxlIChZWUlEICgwKSkKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS0KLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1zdGF0aWMgdm9pZAotLXl5X3JlZHVjZV9wcmludCAoWVlTVFlQRSAqeXl2c3AsIGludCB5eXJ1bGUpCi0tI2Vsc2UKLS1zdGF0aWMgdm9pZAotLXl5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5cnVsZSkKLS0gICAgWVlTVFlQRSAqeXl2c3A7Ci0tICAgIGludCB5eXJ1bGU7Ci0tI2VuZGlmCi0tewotLSAgaW50IHl5bnJocyA9IHl5cjJbeXlydWxlXTsKLS0gIGludCB5eWk7Ci0tICB1bnNpZ25lZCBsb25nIGludCB5eWxubyA9IHl5cmxpbmVbeXlydWxlXTsKLS0gIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAlbHUpOlxuIiwKLS0JICAgICB5eXJ1bGUgLSAxLCB5eWxubyk7Ci0tICAvKiBUaGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLiAgKi8KLS0gIGZvciAoeXlpID0gMDsgeXlpIDwgeXlucmhzOyB5eWkrKykKLS0gICAgewotLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICAgJCVkID0gIiwgeXlpICsgMSk7Ci0tICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsIHl5cmhzW3l5cHJoc1t5eXJ1bGVdICsgeXlpXSwKLS0JCSAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKLS0JCSAgICAgICAJCSAgICAgICApOwotLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKLS0gICAgfQotLX0KLS0KLS0jIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkJCVwKLS1kbyB7CQkJCQlcCi0tICBpZiAoeXlkZWJ1ZykJCQkJXAotLSAgICB5eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCBSdWxlKTsgXAotLX0gd2hpbGUgKFlZSUQgKDApKQotLQotLS8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAotLSAgIG11bHRpcGxlIHBhcnNlcnMgY2FuIGNvZXhpc3QuICAqLwotLWludCB5eWRlYnVnOwotLSNlbHNlIC8qICFZWURFQlVHICovCi0tIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCi0tIyBkZWZpbmUgWVlfU1lNQk9MX1BSSU5UKFRpdGxlLCBUeXBlLCBWYWx1ZSwgTG9jYXRpb24pCi0tIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCi0tIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCi0tI2VuZGlmIC8qICFZWURFQlVHICovCi0tCi0tCi0tLyogWVlJTklUREVQVEggLS0gaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MuICAqLwotLSNpZm5kZWYJWVlJTklUREVQVEgKLS0jIGRlZmluZSBZWUlOSVRERVBUSCAyMDAKLS0jZW5kaWYKLS0KLS0vKiBZWU1BWERFUFRIIC0tIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvIChlZmZlY3RpdmUgb25seQotLSAgIGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLgotLQotLSAgIERvIG5vdCBtYWtlIHRoaXMgdmFsdWUgdG9vIGxhcmdlOyB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmCi0tICAgWVlTVEFDS19BTExPQ19NQVhJTVVNIDwgWVlTVEFDS19CWVRFUyAoWVlNQVhERVBUSCkKLS0gICBldmFsdWF0ZWQgd2l0aCBpbmZpbml0ZS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLiAgKi8KLS0KLS0jaWZuZGVmIFlZTUFYREVQVEgKLS0jIGRlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0tI2VuZGlmCi0tCi0tDAotLQotLSNpZiBZWUVSUk9SX1ZFUkJPU0UKLS0KLS0jIGlmbmRlZiB5eXN0cmxlbgotLSMgIGlmIGRlZmluZWQgX19HTElCQ19fICYmIGRlZmluZWQgX1NUUklOR19ICi0tIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KLS0jICBlbHNlCi0tLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgWVlTVFIuICAqLwotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLXN0YXRpYyBZWVNJWkVfVAotLXl5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKLS0jZWxzZQotLXN0YXRpYyBZWVNJWkVfVAotLXl5c3RybGVuICh5eXN0cikKLS0gICAgY29uc3QgY2hhciAqeXlzdHI7Ci0tI2VuZGlmCi0tewotLSAgWVlTSVpFX1QgeXlsZW47Ci0tICBmb3IgKHl5bGVuID0gMDsgeXlzdHJbeXlsZW5dOyB5eWxlbisrKQotLSAgICBjb250aW51ZTsKLS0gIHJldHVybiB5eWxlbjsKLS19Ci0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tCi0tIyBpZm5kZWYgeXlzdHBjcHkKLS0jICBpZiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBkZWZpbmVkIF9TVFJJTkdfSCAmJiBkZWZpbmVkIF9HTlVfU09VUkNFCi0tIyAgIGRlZmluZSB5eXN0cGNweSBzdHBjcHkKLS0jICBlbHNlCi0tLyogQ29weSBZWVNSQyB0byBZWURFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbgotLSAgIFlZREVTVC4gICovCi0tI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0tICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0tc3RhdGljIGNoYXIgKgotLXl5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQotLSNlbHNlCi0tc3RhdGljIGNoYXIgKgotLXl5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQotLSAgICBjaGFyICp5eWRlc3Q7Ci0tICAgIGNvbnN0IGNoYXIgKnl5c3JjOwotLSNlbmRpZgotLXsKLS0gIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKLS0gIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOwotLQotLSAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCi0tICAgIGNvbnRpbnVlOwotLQotLSAgcmV0dXJuIHl5ZCAtIDE7Ci0tfQotLSMgIGVuZGlmCi0tIyBlbmRpZgotLQotLSMgaWZuZGVmIHl5dG5hbWVycgotLS8qIENvcHkgdG8gWVlSRVMgdGhlIGNvbnRlbnRzIG9mIFlZU1RSIGFmdGVyIHN0cmlwcGluZyBhd2F5IHVubmVjZXNzYXJ5Ci0tICAgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcywgc28gdGhhdCBpdCdzIHN1aXRhYmxlIGZvciB5eWVycm9yLiAgVGhlCi0tICAgaGV1cmlzdGljIGlzIHRoYXQgZG91YmxlLXF1b3RpbmcgaXMgdW5uZWNlc3NhcnkgdW5sZXNzIHRoZSBzdHJpbmcKLS0gICBjb250YWlucyBhbiBhcG9zdHJvcGhlLCBhIGNvbW1hLCBvciBiYWNrc2xhc2ggKG90aGVyIHRoYW4KLS0gICBiYWNrc2xhc2gtYmFja3NsYXNoKS4gIFlZU1RSIGlzIHRha2VuIGZyb20geXl0bmFtZS4gIElmIFlZUkVTIGlzCi0tICAgbnVsbCwgZG8gbm90IGNvcHk7IGluc3RlYWQsIHJldHVybiB0aGUgbGVuZ3RoIG9mIHdoYXQgdGhlIHJlc3VsdAotLSAgIHdvdWxkIGhhdmUgYmVlbi4gICovCi0tc3RhdGljIFlZU0laRV9UCi0teXl0bmFtZXJyIChjaGFyICp5eXJlcywgY29uc3QgY2hhciAqeXlzdHIpCi0tewotLSAgaWYgKCp5eXN0ciA9PSAnIicpCi0tICAgIHsKLS0gICAgICBZWVNJWkVfVCB5eW4gPSAwOwotLSAgICAgIGNoYXIgY29uc3QgKnl5cCA9IHl5c3RyOwotLQotLSAgICAgIGZvciAoOzspCi0tCXN3aXRjaCAoKisreXlwKQotLQkgIHsKLS0JICBjYXNlICdcJyc6Ci0tCSAgY2FzZSAnLCc6Ci0tCSAgICBnb3RvIGRvX25vdF9zdHJpcF9xdW90ZXM7Ci0tCi0tCSAgY2FzZSAnXFwnOgotLQkgICAgaWYgKCorK3l5cCAhPSAnXFwnKQotLQkgICAgICBnb3RvIGRvX25vdF9zdHJpcF9xdW90ZXM7Ci0tCSAgICAvKiBGYWxsIHRocm91Z2guICAqLwotLQkgIGRlZmF1bHQ6Ci0tCSAgICBpZiAoeXlyZXMpCi0tCSAgICAgIHl5cmVzW3l5bl0gPSAqeXlwOwotLQkgICAgeXluKys7Ci0tCSAgICBicmVhazsKLS0KLS0JICBjYXNlICciJzoKLS0JICAgIGlmICh5eXJlcykKLS0JICAgICAgeXlyZXNbeXluXSA9ICdcMCc7Ci0tCSAgICByZXR1cm4geXluOwotLQkgIH0KLS0gICAgZG9fbm90X3N0cmlwX3F1b3RlczogOwotLSAgICB9Ci0tCi0tICBpZiAoISB5eXJlcykKLS0gICAgcmV0dXJuIHl5c3RybGVuICh5eXN0cik7Ci0tCi0tICByZXR1cm4geXlzdHBjcHkgKHl5cmVzLCB5eXN0cikgLSB5eXJlczsKLS19Ci0tIyBlbmRpZgotLQotLS8qIENvcHkgaW50byBZWVJFU1VMVCBhbiBlcnJvciBtZXNzYWdlIGFib3V0IHRoZSB1bmV4cGVjdGVkIHRva2VuCi0tICAgWVlDSEFSIHdoaWxlIGluIHN0YXRlIFlZU1RBVEUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsCi0tICAgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuICBJZiBZWVJFU1VMVCBpcyBudWxsLCBkbyBub3QKLS0gICBjb3B5IGFueXRoaW5nOyBqdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUKLS0gICBjb3BpZWQuICBBcyBhIHNwZWNpYWwgY2FzZSwgcmV0dXJuIDAgaWYgYW4gb3JkaW5hcnkgInN5bnRheCBlcnJvciIKLS0gICBtZXNzYWdlIHdpbGwgZG8uICBSZXR1cm4gWVlTSVpFX01BWElNVU0gaWYgb3ZlcmZsb3cgb2NjdXJzIGR1cmluZwotLSAgIHNpemUgY2FsY3VsYXRpb24uICAqLwotLXN0YXRpYyBZWVNJWkVfVAotLXl5c3ludGF4X2Vycm9yIChjaGFyICp5eXJlc3VsdCwgaW50IHl5c3RhdGUsIGludCB5eWNoYXIpCi0tewotLSAgaW50IHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLS0KLS0gIGlmICghIChZWVBBQ1RfTklORiA8IHl5biAmJiB5eW4gPD0gWVlMQVNUKSkKLS0gICAgcmV0dXJuIDA7Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICBpbnQgeXl0eXBlID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7Ci0tICAgICAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXR5cGVdKTsKLS0gICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNpemUwOwotLSAgICAgIFlZU0laRV9UIHl5c2l6ZTE7Ci0tICAgICAgaW50IHl5c2l6ZV9vdmVyZmxvdyA9IDA7Ci0tICAgICAgZW51bSB7IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gPSA1IH07Ci0tICAgICAgY2hhciBjb25zdCAqeXlhcmdbWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTV07Ci0tICAgICAgaW50IHl5eDsKLS0KLS0jIGlmIDAKLS0gICAgICAvKiBUaGlzIGlzIHNvIHhnZXR0ZXh0IHNlZXMgdGhlIHRyYW5zbGF0YWJsZSBmb3JtYXRzIHRoYXQgYXJlCi0tCSBjb25zdHJ1Y3RlZCBvbiB0aGUgZmx5LiAgKi8KLS0gICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcyIpOwotLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMiKTsKLS0gICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIik7Ci0tICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyIpOwotLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMgb3IgJXMiKTsKLS0jIGVuZGlmCi0tICAgICAgY2hhciAqeXlmbXQ7Ci0tICAgICAgY2hhciBjb25zdCAqeXlmOwotLSAgICAgIHN0YXRpYyBjaGFyIGNvbnN0IHl5dW5leHBlY3RlZFtdID0gInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcyI7Ci0tICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlleHBlY3RpbmdbXSA9ICIsIGV4cGVjdGluZyAlcyI7Ci0tICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlvcltdID0gIiBvciAlcyI7Ci0tICAgICAgY2hhciB5eWZvcm1hdFtzaXplb2YgeXl1bmV4cGVjdGVkCi0tCQkgICAgKyBzaXplb2YgeXlleHBlY3RpbmcgLSAxCi0tCQkgICAgKyAoKFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gLSAyKQotLQkJICAgICAgICogKHNpemVvZiB5eW9yIC0gMSkpXTsKLS0gICAgICBjaGFyIGNvbnN0ICp5eXByZWZpeCA9IHl5ZXhwZWN0aW5nOwotLQotLSAgICAgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KLS0JIFlZQ0hFQ0suICAqLwotLSAgICAgIGludCB5eXhiZWdpbiA9IHl5biA8IDAgPyAteXluIDogMDsKLS0KLS0gICAgICAvKiBTdGF5IHdpdGhpbiBib3VuZHMgb2YgYm90aCB5eWNoZWNrIGFuZCB5eXRuYW1lLiAgKi8KLS0gICAgICBpbnQgeXljaGVja2xpbSA9IFlZTEFTVCAtIHl5biArIDE7Ci0tICAgICAgaW50IHl5eGVuZCA9IHl5Y2hlY2tsaW0gPCBZWU5UT0tFTlMgPyB5eWNoZWNrbGltIDogWVlOVE9LRU5TOwotLSAgICAgIGludCB5eWNvdW50ID0gMTsKLS0KLS0gICAgICB5eWFyZ1swXSA9IHl5dG5hbWVbeXl0eXBlXTsKLS0gICAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZvcm1hdCwgeXl1bmV4cGVjdGVkKTsKLS0KLS0gICAgICBmb3IgKHl5eCA9IHl5eGJlZ2luOyB5eXggPCB5eXhlbmQ7ICsreXl4KQotLQlpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCi0tCSAgewotLQkgICAgaWYgKHl5Y291bnQgPT0gWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSkKLS0JICAgICAgewotLQkJeXljb3VudCA9IDE7Ci0tCQl5eXNpemUgPSB5eXNpemUwOwotLQkJeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZCAtIDFdID0gJ1wwJzsKLS0JCWJyZWFrOwotLQkgICAgICB9Ci0tCSAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOwotLQkgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXhdKTsKLS0JICAgIHl5c2l6ZV9vdmVyZmxvdyB8PSAoeXlzaXplMSA8IHl5c2l6ZSk7Ci0tCSAgICB5eXNpemUgPSB5eXNpemUxOwotLQkgICAgeXlmbXQgPSB5eXN0cGNweSAoeXlmbXQsIHl5cHJlZml4KTsKLS0JICAgIHl5cHJlZml4ID0geXlvcjsKLS0JICB9Ci0tCi0tICAgICAgeXlmID0gWVlfKHl5Zm9ybWF0KTsKLS0gICAgICB5eXNpemUxID0geXlzaXplICsgeXlzdHJsZW4gKHl5Zik7Ci0tICAgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKLS0gICAgICB5eXNpemUgPSB5eXNpemUxOwotLQotLSAgICAgIGlmICh5eXNpemVfb3ZlcmZsb3cpCi0tCXJldHVybiBZWVNJWkVfTUFYSU1VTTsKLS0KLS0gICAgICBpZiAoeXlyZXN1bHQpCi0tCXsKLS0JICAvKiBBdm9pZCBzcHJpbnRmLCBhcyB0aGF0IGluZnJpbmdlcyBvbiB0aGUgdXNlcidzIG5hbWUgc3BhY2UuCi0tCSAgICAgRG9uJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgZXZlbiBpZiB0aGUgdHJhbnNsYXRpb24KLS0JICAgICBwcm9kdWNlZCBhIHN0cmluZyB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgIiVzInMuICAqLwotLQkgIGNoYXIgKnl5cCA9IHl5cmVzdWx0OwotLQkgIGludCB5eWkgPSAwOwotLQkgIHdoaWxlICgoKnl5cCA9ICp5eWYpICE9ICdcMCcpCi0tCSAgICB7Ci0tCSAgICAgIGlmICgqeXlwID09ICclJyAmJiB5eWZbMV0gPT0gJ3MnICYmIHl5aSA8IHl5Y291bnQpCi0tCQl7Ci0tCQkgIHl5cCArPSB5eXRuYW1lcnIgKHl5cCwgeXlhcmdbeXlpKytdKTsKLS0JCSAgeXlmICs9IDI7Ci0tCQl9Ci0tCSAgICAgIGVsc2UKLS0JCXsKLS0JCSAgeXlwKys7Ci0tCQkgIHl5ZisrOwotLQkJfQotLQkgICAgfQotLQl9Ci0tICAgICAgcmV0dXJuIHl5c2l6ZTsKLS0gICAgfQotLX0KLS0jZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0tDAotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCBSZWxlYXNlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byB0aGlzIHN5bWJvbC4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLQotLS8qQVJHU1VTRUQqLwotLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotLXN0YXRpYyB2b2lkCi0teXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQotLSNlbHNlCi0tc3RhdGljIHZvaWQKLS15eWRlc3RydWN0ICh5eW1zZywgeXl0eXBlLCB5eXZhbHVlcCkKLS0gICAgY29uc3QgY2hhciAqeXltc2c7Ci0tICAgIGludCB5eXR5cGU7Ci0tICAgIFlZU1RZUEUgKnl5dmFsdWVwOwotLSNlbmRpZgotLXsKLS0gIFlZVVNFICh5eXZhbHVlcCk7Ci0tCi0tICBpZiAoIXl5bXNnKQotLSAgICB5eW1zZyA9ICJEZWxldGluZyI7Ci0tICBZWV9TWU1CT0xfUFJJTlQgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7Ci0tCi0tICBzd2l0Y2ggKHl5dHlwZSkKLS0gICAgewotLQotLSAgICAgIGRlZmF1bHQ6Ci0tCWJyZWFrOwotLSAgICB9Ci0tfQotLQotLS8qIFByZXZlbnQgd2FybmluZ3MgZnJvbSAtV21pc3NpbmctcHJvdG90eXBlcy4gICovCi0tI2lmZGVmIFlZUEFSU0VfUEFSQU0KLS0jaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCi0taW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pOwotLSNlbHNlCi0taW50IHl5cGFyc2UgKCk7Ci0tI2VuZGlmCi0tI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCi0tI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cwotLWludCB5eXBhcnNlICh2b2lkKTsKLS0jZWxzZQotLWludCB5eXBhcnNlICgpOwotLSNlbmRpZgotLSNlbmRpZiAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KLS0KLS0KLS0KLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCB5eXBhcnNlIG9yIHl5cHVzaF9wYXJzZS4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0tCi0tI2lmZGVmIFlZUEFSU0VfUEFSQU0KLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1pbnQKLS15eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKQotLSNlbHNlCi0taW50Ci0teXlwYXJzZSAoWVlQQVJTRV9QQVJBTSkKLS0gICAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKLS0jZW5kaWYKLS0jZWxzZSAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KLS0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLS0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLS1pbnQKLS15eXBhcnNlICh2b2lkKQotLSNlbHNlCi0taW50Ci0teXlwYXJzZSAoKQotLQotLSNlbmRpZgotLSNlbmRpZgotLXsKLS0vKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCi0taW50IHl5Y2hhcjsKLS0KLS0vKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwotLVlZU1RZUEUgeXlsdmFsOwotLQotLSAgICAvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLwotLSAgICBpbnQgeXluZXJyczsKLS0KLS0gICAgaW50IHl5c3RhdGU7Ci0tICAgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLwotLSAgICBpbnQgeXllcnJzdGF0dXM7Ci0tCi0tICAgIC8qIFRoZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgotLSAgICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLgotLSAgICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLgotLQotLSAgICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKLS0gICAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCi0tCi0tICAgIC8qIFRoZSBzdGF0ZSBzdGFjay4gICovCi0tICAgIHl5dHlwZV9pbnQxNiB5eXNzYVtZWUlOSVRERVBUSF07Ci0tICAgIHl5dHlwZV9pbnQxNiAqeXlzczsKLS0gICAgeXl0eXBlX2ludDE2ICp5eXNzcDsKLS0KLS0gICAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KLS0gICAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07Ci0tICAgIFlZU1RZUEUgKnl5dnM7Ci0tICAgIFlZU1RZUEUgKnl5dnNwOwotLQotLSAgICBZWVNJWkVfVCB5eXN0YWNrc2l6ZTsKLS0KLS0gIGludCB5eW47Ci0tICBpbnQgeXlyZXN1bHQ7Ci0tICAvKiBMb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlci4gICovCi0tICBpbnQgeXl0b2tlbjsKLS0gIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCB0byByZXR1cm4gc2VtYW50aWMgdmFsdWUgYW5kIGxvY2F0aW9uIGZyb20gdGhlCi0tICAgICBhY3Rpb24gcm91dGluZXMuICAqLwotLSAgWVlTVFlQRSB5eXZhbDsKLS0KLS0jaWYgWVlFUlJPUl9WRVJCT1NFCi0tICAvKiBCdWZmZXIgZm9yIGVycm9yIG1lc3NhZ2VzLCBhbmQgaXRzIGFsbG9jYXRlZCBzaXplLiAgKi8KLS0gIGNoYXIgeXltc2didWZbMTI4XTsKLS0gIGNoYXIgKnl5bXNnID0geXltc2didWY7Ci0tICBZWVNJWkVfVCB5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKLS0jZW5kaWYKLS0KLS0jZGVmaW5lIFlZUE9QU1RBQ0soTikgICAoeXl2c3AgLT0gKE4pLCB5eXNzcCAtPSAoTikpCi0tCi0tICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZCBydWxlLgotLSAgICAgS2VlcCB0byB6ZXJvIHdoZW4gbm8gc3ltYm9sIHNob3VsZCBiZSBwb3BwZWQuICAqLwotLSAgaW50IHl5bGVuID0gMDsKLS0KLS0gIHl5dG9rZW4gPSAwOwotLSAgeXlzcyA9IHl5c3NhOwotLSAgeXl2cyA9IHl5dnNhOwotLSAgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLS0KLS0gIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7Ci0tCi0tICB5eXN0YXRlID0gMDsKLS0gIHl5ZXJyc3RhdHVzID0gMDsKLS0gIHl5bmVycnMgPSAwOwotLSAgeXljaGFyID0gWVlFTVBUWTsgLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KLS0KLS0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0tICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKLS0gICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KLS0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLS0gIHl5c3NwID0geXlzczsKLS0gIHl5dnNwID0geXl2czsKLS0KLS0gIGdvdG8geXlzZXRzdGF0ZTsKLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5bmV3c3RhdGUgLS0gUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4geXlzdGF0ZS4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS0geXluZXdzdGF0ZToKLS0gIC8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCi0tICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuICBTbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KLS0gIHl5c3NwKys7Ci0tCi0tIHl5c2V0c3RhdGU6Ci0tICAqeXlzc3AgPSB5eXN0YXRlOwotLQotLSAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCi0tICAgIHsKLS0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KLS0gICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOwotLQotLSNpZmRlZiB5eW92ZXJmbG93Ci0tICAgICAgewotLQkvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2suICBVc2UgY29waWVzIG9mCi0tCSAgIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8KLS0JICAgbWVtb3J5LiAgKi8KLS0JWVlTVFlQRSAqeXl2czEgPSB5eXZzOwotLQl5eXR5cGVfaW50MTYgKnl5c3MxID0geXlzczsKLS0KLS0JLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCi0tCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgVGhpcyB1c2VkIHRvIGJlIGEKLS0JICAgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLCBidXQgdGhhdCBtaWdodAotLQkgICBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KLS0JeXlvdmVyZmxvdyAoWVlfKCJtZW1vcnkgZXhoYXVzdGVkIiksCi0tCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0tCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0tCQkgICAgJnl5c3RhY2tzaXplKTsKLS0KLS0JeXlzcyA9IHl5c3MxOwotLQl5eXZzID0geXl2czE7Ci0tICAgICAgfQotLSNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLS0jIGlmbmRlZiBZWVNUQUNLX1JFTE9DQVRFCi0tICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKLS0jIGVsc2UKLS0gICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KLS0gICAgICBpZiAoWVlNQVhERVBUSCA8PSB5eXN0YWNrc2l6ZSkKLS0JZ290byB5eWV4aGF1c3RlZGxhYjsKLS0gICAgICB5eXN0YWNrc2l6ZSAqPSAyOwotLSAgICAgIGlmIChZWU1BWERFUFRIIDwgeXlzdGFja3NpemUpCi0tCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKLS0KLS0gICAgICB7Ci0tCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOwotLQl1bmlvbiB5eWFsbG9jICp5eXB0ciA9Ci0tCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKLS0JaWYgKCEgeXlwdHIpCi0tCSAgZ290byB5eWV4aGF1c3RlZGxhYjsKLS0JWVlTVEFDS19SRUxPQ0FURSAoeXlzc19hbGxvYywgeXlzcyk7Ci0tCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnNfYWxsb2MsIHl5dnMpOwotLSMgIHVuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKLS0JaWYgKHl5c3MxICE9IHl5c3NhKQotLQkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOwotLSAgICAgIH0KLS0jIGVuZGlmCi0tI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLS0KLS0gICAgICB5eXNzcCA9IHl5c3MgKyB5eXNpemUgLSAxOwotLSAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7Ci0tCi0tICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWx1XG4iLAotLQkJICAodW5zaWduZWQgbG9uZyBpbnQpIHl5c3RhY2tzaXplKSk7Ci0tCi0tICAgICAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCi0tCVlZQUJPUlQ7Ci0tICAgIH0KLS0KLS0gIFlZRFBSSU5URiAoKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKSk7Ci0tCi0tICBpZiAoeXlzdGF0ZSA9PSBZWUZJTkFMKQotLSAgICBZWUFDQ0VQVDsKLS0KLS0gIGdvdG8geXliYWNrdXA7Ci0tCi0tLyotLS0tLS0tLS0tLS4KLS18IHl5YmFja3VwLiAgfAotLWAtLS0tLS0tLS0tLSovCi0teXliYWNrdXA6Ci0tCi0tICAvKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgUmVhZCBhCi0tICAgICBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotLQotLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCi0tICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0tICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQotLSAgICBnb3RvIHl5ZGVmYXVsdDsKLS0KLS0gIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0tCi0tICAvKiBZWUNIQVIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0Ygb3IgYSB2YWxpZCBsb29rYWhlYWQgc3ltYm9sLiAgKi8KLS0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKLS0gICAgewotLSAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOwotLSAgICAgIHl5Y2hhciA9IFlZTEVYOwotLSAgICB9Ci0tCi0tICBpZiAoeXljaGFyIDw9IFlZRU9GKQotLSAgICB7Ci0tICAgICAgeXljaGFyID0geXl0b2tlbiA9IFlZRU9GOwotLSAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIk5vdyBhdCBlbmQgb2YgaW5wdXQuXG4iKSk7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKLS0gICAgICBZWV9TWU1CT0xfUFJJTlQgKCJOZXh0IHRva2VuIGlzIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7Ci0tICAgIH0KLS0KLS0gIC8qIElmIHRoZSBwcm9wZXIgYWN0aW9uIG9uIHNlZWluZyB0b2tlbiBZWVRPS0VOIGlzIHRvIHJlZHVjZSBvciB0bwotLSAgICAgZGV0ZWN0IGFuIGVycm9yLCB0YWtlIHRoYXQgYWN0aW9uLiAgKi8KLS0gIHl5biArPSB5eXRva2VuOwotLSAgaWYgKHl5biA8IDAgfHwgWVlMQVNUIDwgeXluIHx8IHl5Y2hlY2tbeXluXSAhPSB5eXRva2VuKQotLSAgICBnb3RvIHl5ZGVmYXVsdDsKLS0gIHl5biA9IHl5dGFibGVbeXluXTsKLS0gIGlmICh5eW4gPD0gMCkKLS0gICAgewotLSAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQotLQlnb3RvIHl5ZXJybGFiOwotLSAgICAgIHl5biA9IC15eW47Ci0tICAgICAgZ290byB5eXJlZHVjZTsKLS0gICAgfQotLQotLSAgLyogQ291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvcgotLSAgICAgc3RhdHVzLiAgKi8KLS0gIGlmICh5eWVycnN0YXR1cykKLS0gICAgeXllcnJzdGF0dXMtLTsKLS0KLS0gIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLwotLSAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKLS0KLS0gIC8qIERpc2NhcmQgdGhlIHNoaWZ0ZWQgdG9rZW4uICAqLwotLSAgeXljaGFyID0gWVlFTVBUWTsKLS0KLS0gIHl5c3RhdGUgPSB5eW47Ci0tICAqKyt5eXZzcCA9IHl5bHZhbDsKLS0KLS0gIGdvdG8geXluZXdzdGF0ZTsKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgeXlkZWZhdWx0IC0tIGRvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICB8Ci0tYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS15eWRlZmF1bHQ6Ci0tICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLS0gIGlmICh5eW4gPT0gMCkKLS0gICAgZ290byB5eWVycmxhYjsKLS0gIGdvdG8geXlyZWR1Y2U7Ci0tCi0tCi0tLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5cmVkdWNlIC0tIERvIGEgcmVkdWN0aW9uLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0teXlyZWR1Y2U6Ci0tICAvKiB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLwotLSAgeXlsZW4gPSB5eXIyW3l5bl07Ci0tCi0tICAvKiBJZiBZWUxFTiBpcyBub256ZXJvLCBpbXBsZW1lbnQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbjoKLS0gICAgIGAkJCA9ICQxJy4KLS0KLS0gICAgIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNldHMgWVlWQUwgdG8gZ2FyYmFnZS4KLS0gICAgIFRoaXMgYmVoYXZpb3IgaXMgdW5kb2N1bWVudGVkIGFuZCBCaXNvbgotLSAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKLS0gICAgIHVuY29uZGl0aW9uYWxseSBtYWtlcyB0aGUgcGFyc2VyIGEgYml0IHNtYWxsZXIsIGFuZCBpdCBhdm9pZHMgYQotLSAgICAgR0NDIHdhcm5pbmcgdGhhdCBZWVZBTCBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkLiAgKi8KLS0gIHl5dmFsID0geXl2c3BbMS15eWxlbl07Ci0tCi0tCi0tICBZWV9SRURVQ0VfUFJJTlQgKHl5bik7Ci0tICBzd2l0Y2ggKHl5bikKLS0gICAgewotLSAgICAgICAgY2FzZSAyOgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTU1ICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgaWYgKCh5eXZzcFsoMSkgLSAoMSldLmV4cCkgPT0gTlVMTCkKLS0JICAgICAgWVlBQk9SVDsKLS0JICAgICgoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+cmVzID0gKHl5dnNwWygxKSAtICgxKV0uZXhwKTsKLS0JICB9Ci0tICAgIGJyZWFrOwotLQotLSAgY2FzZSAzOgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTYzICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzMgKHFtb3AsICh5eXZzcFsoMSkgLSAoNSldLmV4cCksICh5eXZzcFsoMykgLSAoNSldLmV4cCksICh5eXZzcFsoNSkgLSAoNSldLmV4cCkpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDQ6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxNjcgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMiAobG9yLCAoeXl2c3BbKDEpIC0gKDMpXS5leHApLCAoeXl2c3BbKDMpIC0gKDMpXS5leHApKTsKLS0JICB9Ci0tICAgIGJyZWFrOwotLQotLSAgY2FzZSA1OgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTcxICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzIgKGxhbmQsICh5eXZzcFsoMSkgLSAoMyldLmV4cCksICh5eXZzcFsoMykgLSAoMyldLmV4cCkpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDY6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxNzUgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMiAoKHl5dnNwWygyKSAtICgzKV0ub3ApLCAoeXl2c3BbKDEpIC0gKDMpXS5leHApLCAoeXl2c3BbKDMpIC0gKDMpXS5leHApKTsKLS0JICB9Ci0tICAgIGJyZWFrOwotLQotLSAgY2FzZSA3OgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTc5ICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzIgKCh5eXZzcFsoMikgLSAoMyldLm9wKSwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0tCSAgfQotLSAgICBicmVhazsKLS0KLS0gIGNhc2UgODoKLS0KLS0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDE4MyAicGx1cmFsLnkiCi0tICAgIHsKLS0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8yICgoeXl2c3BbKDIpIC0gKDMpXS5vcCksICh5eXZzcFsoMSkgLSAoMyldLmV4cCksICh5eXZzcFsoMykgLSAoMyldLmV4cCkpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDk6Ci0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxODcgInBsdXJhbC55IgotLSAgICB7Ci0tCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMiAoKHl5dnNwWygyKSAtICgzKV0ub3ApLCAoeXl2c3BbKDEpIC0gKDMpXS5leHApLCAoeXl2c3BbKDMpIC0gKDMpXS5leHApKTsKLS0JICB9Ci0tICAgIGJyZWFrOwotLQotLSAgY2FzZSAxMDoKLS0KLS0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDE5MSAicGx1cmFsLnkiCi0tICAgIHsKLS0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8xIChsbm90LCAoeXl2c3BbKDIpIC0gKDIpXS5leHApKTsKLS0JICB9Ci0tICAgIGJyZWFrOwotLQotLSAgY2FzZSAxMToKLS0KLS0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotLSNsaW5lIDE5NSAicGx1cmFsLnkiCi0tICAgIHsKLS0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8wICh2YXIpOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDEyOgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMTk5ICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgaWYgKCgoeXl2YWwuZXhwKSA9IG5ld19leHBfMCAobnVtKSkgIT0gTlVMTCkKLS0JICAgICAgKHl5dmFsLmV4cCktPnZhbC5udW0gPSAoeXl2c3BbKDEpIC0gKDEpXS5udW0pOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDEzOgotLQotLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0tI2xpbmUgMjA0ICJwbHVyYWwueSIKLS0gICAgewotLQkgICAgKHl5dmFsLmV4cCkgPSAoeXl2c3BbKDIpIC0gKDMpXS5leHApOwotLQkgIH0KLS0gICAgYnJlYWs7Ci0tCi0tCi0tCi0tLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAxNTkyICJwbHVyYWwuYyIKLS0gICAgICBkZWZhdWx0OiBicmVhazsKLS0gICAgfQotLSAgWVlfU1lNQk9MX1BSSU5UICgiLT4gJCQgPSIsIHl5cjFbeXluXSwgJnl5dmFsLCAmeXlsb2MpOwotLQotLSAgWVlQT1BTVEFDSyAoeXlsZW4pOwotLSAgeXlsZW4gPSAwOwotLSAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKLS0KLS0gICorK3l5dnNwID0geXl2YWw7Ci0tCi0tICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQotLSAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCi0tICAgICBudW1iZXIgcmVkdWNlZCBieS4gICovCi0tCi0tICB5eW4gPSB5eXIxW3l5bl07Ci0tCi0tICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UT0tFTlNdICsgKnl5c3NwOwotLSAgaWYgKDAgPD0geXlzdGF0ZSAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKLS0gICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07Ci0tICBlbHNlCi0tICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVE9LRU5TXTsKLS0KLS0gIGdvdG8geXluZXdzdGF0ZTsKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS15eWVycmxhYjoKLS0gIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwotLSAgaWYgKCF5eWVycnN0YXR1cykKLS0gICAgewotLSAgICAgICsreXluZXJyczsKLS0jaWYgISBZWUVSUk9SX1ZFUkJPU0UKLS0gICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKLS0jZWxzZQotLSAgICAgIHsKLS0JWVlTSVpFX1QgeXlzaXplID0geXlzeW50YXhfZXJyb3IgKDAsIHl5c3RhdGUsIHl5Y2hhcik7Ci0tCWlmICh5eW1zZ19hbGxvYyA8IHl5c2l6ZSAmJiB5eW1zZ19hbGxvYyA8IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkKLS0JICB7Ci0tCSAgICBZWVNJWkVfVCB5eWFsbG9jID0gMiAqIHl5c2l6ZTsKLS0JICAgIGlmICghICh5eXNpemUgPD0geXlhbGxvYyAmJiB5eWFsbG9jIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCi0tCSAgICAgIHl5YWxsb2MgPSBZWVNUQUNLX0FMTE9DX01BWElNVU07Ci0tCSAgICBpZiAoeXltc2cgIT0geXltc2didWYpCi0tCSAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOwotLQkgICAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eWFsbG9jKTsKLS0JICAgIGlmICh5eW1zZykKLS0JICAgICAgeXltc2dfYWxsb2MgPSB5eWFsbG9jOwotLQkgICAgZWxzZQotLQkgICAgICB7Ci0tCQl5eW1zZyA9IHl5bXNnYnVmOwotLQkJeXltc2dfYWxsb2MgPSBzaXplb2YgeXltc2didWY7Ci0tCSAgICAgIH0KLS0JICB9Ci0tCi0tCWlmICgwIDwgeXlzaXplICYmIHl5c2l6ZSA8PSB5eW1zZ19hbGxvYykKLS0JICB7Ci0tCSAgICAodm9pZCkgeXlzeW50YXhfZXJyb3IgKHl5bXNnLCB5eXN0YXRlLCB5eWNoYXIpOwotLQkgICAgeXllcnJvciAoeXltc2cpOwotLQkgIH0KLS0JZWxzZQotLQkgIHsKLS0JICAgIHl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yIikpOwotLQkgICAgaWYgKHl5c2l6ZSAhPSAwKQotLQkgICAgICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotLQkgIH0KLS0gICAgICB9Ci0tI2VuZGlmCi0tICAgIH0KLS0KLS0KLS0KLS0gIGlmICh5eWVycnN0YXR1cyA9PSAzKQotLSAgICB7Ci0tICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbgotLQkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLwotLQotLSAgICAgIGlmICh5eWNoYXIgPD0gWVlFT0YpCi0tCXsKLS0JICAvKiBSZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQuICAqLwotLQkgIGlmICh5eWNoYXIgPT0gWVlFT0YpCi0tCSAgICBZWUFCT1JUOwotLQl9Ci0tICAgICAgZWxzZQotLQl7Ci0tCSAgeXlkZXN0cnVjdCAoIkVycm9yOiBkaXNjYXJkaW5nIiwKLS0JCSAgICAgIHl5dG9rZW4sICZ5eWx2YWwpOwotLQkgIHl5Y2hhciA9IFlZRU1QVFk7Ci0tCX0KLS0gICAgfQotLQotLSAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCi0tICAgICB0b2tlbi4gICovCi0tICBnb3RvIHl5ZXJybGFiMTsKLS0KLS0KLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLS18IHl5ZXJyb3JsYWIgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgWVlFUlJPUi4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS15eWVycm9ybGFiOgotLQotLSAgLyogUGFjaWZ5IGNvbXBpbGVycyBsaWtlIEdDQyB3aGVuIHRoZSB1c2VyIGNvZGUgbmV2ZXIgaW52b2tlcwotLSAgICAgWVlFUlJPUiBhbmQgdGhlIGxhYmVsIHl5ZXJyb3JsYWIgdGhlcmVmb3JlIG5ldmVyIGFwcGVhcnMgaW4gdXNlcgotLSAgICAgY29kZS4gICovCi0tICBpZiAoLypDT05TVENPTkQqLyAwKQotLSAgICAgZ290byB5eWVycm9ybGFiOwotLQotLSAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAotLSAgICAgdGhpcyBZWUVSUk9SLiAgKi8KLS0gIFlZUE9QU1RBQ0sgKHl5bGVuKTsKLS0gIHl5bGVuID0gMDsKLS0gIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7Ci0tICB5eXN0YXRlID0gKnl5c3NwOwotLSAgZ290byB5eWVycmxhYjE7Ci0tCi0tCi0tLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgeXllcnJsYWIxIC0tIGNvbW1vbiBjb2RlIGZvciBib3RoIHN5bnRheCBlcnJvciBhbmQgWVlFUlJPUi4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0teXllcnJsYWIxOgotLSAgeXllcnJzdGF0dXMgPSAzOwkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMuICAqLwotLQotLSAgZm9yICg7OykKLS0gICAgewotLSAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLS0gICAgICBpZiAoeXluICE9IFlZUEFDVF9OSU5GKQotLQl7Ci0tCSAgeXluICs9IFlZVEVSUk9SOwotLQkgIGlmICgwIDw9IHl5biAmJiB5eW4gPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXluXSA9PSBZWVRFUlJPUikKLS0JICAgIHsKLS0JICAgICAgeXluID0geXl0YWJsZVt5eW5dOwotLQkgICAgICBpZiAoMCA8IHl5bikKLS0JCWJyZWFrOwotLQkgICAgfQotLQl9Ci0tCi0tICAgICAgLyogUG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4uICAqLwotLSAgICAgIGlmICh5eXNzcCA9PSB5eXNzKQotLQlZWUFCT1JUOwotLQotLQotLSAgICAgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogcG9wcGluZyIsCi0tCQkgIHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3ApOwotLSAgICAgIFlZUE9QU1RBQ0sgKDEpOwotLSAgICAgIHl5c3RhdGUgPSAqeXlzc3A7Ci0tICAgICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKLS0gICAgfQotLQotLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0tCi0tCi0tICAvKiBTaGlmdCB0aGUgZXJyb3IgdG9rZW4uICAqLwotLSAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXN0b3NbeXluXSwgeXl2c3AsIHl5bHNwKTsKLS0KLS0gIHl5c3RhdGUgPSB5eW47Ci0tICBnb3RvIHl5bmV3c3RhdGU7Ci0tCi0tCi0tLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotLXwgeXlhY2NlcHRsYWIgLS0gWVlBQ0NFUFQgY29tZXMgaGVyZS4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0teXlhY2NlcHRsYWI6Ci0tICB5eXJlc3VsdCA9IDA7Ci0tICBnb3RvIHl5cmV0dXJuOwotLQotLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCB5eWFib3J0bGFiIC0tIFlZQUJPUlQgY29tZXMgaGVyZS4gIHwKLS1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLXl5YWJvcnRsYWI6Ci0tICB5eXJlc3VsdCA9IDE7Ci0tICBnb3RvIHl5cmV0dXJuOwotLQotLSNpZiAhZGVmaW5lZCh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKLS0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0tfCB5eWV4aGF1c3RlZGxhYiAtLSBtZW1vcnkgZXhoYXVzdGlvbiBjb21lcyBoZXJlLiAgfAotLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS15eWV4aGF1c3RlZGxhYjoKLS0gIHl5ZXJyb3IgKFlZXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKLS0gIHl5cmVzdWx0ID0gMjsKLS0gIC8qIEZhbGwgdGhyb3VnaC4gICovCi0tI2VuZGlmCi0tCi0teXlyZXR1cm46Ci0tICBpZiAoeXljaGFyICE9IFlZRU1QVFkpCi0tICAgICB5eWRlc3RydWN0ICgiQ2xlYW51cDogZGlzY2FyZGluZyBsb29rYWhlYWQiLAotLQkJIHl5dG9rZW4sICZ5eWx2YWwpOwotLSAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAotLSAgICAgdGhpcyBZWUFCT1JUIG9yIFlZQUNDRVBULiAgKi8KLS0gIFlZUE9QU1RBQ0sgKHl5bGVuKTsKLS0gIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7Ci0tICB3aGlsZSAoeXlzc3AgIT0geXlzcykKLS0gICAgewotLSAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBwb3BwaW5nIiwKLS0JCSAgeXlzdG9zWyp5eXNzcF0sIHl5dnNwKTsKLS0gICAgICBZWVBPUFNUQUNLICgxKTsKLS0gICAgfQotLSNpZm5kZWYgeXlvdmVyZmxvdwotLSAgaWYgKHl5c3MgIT0geXlzc2EpCi0tICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7Ci0tI2VuZGlmCi0tI2lmIFlZRVJST1JfVkVSQk9TRQotLSAgaWYgKHl5bXNnICE9IHl5bXNnYnVmKQotLSAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKLS0jZW5kaWYKLS0gIC8qIE1ha2Ugc3VyZSBZWUlEIGlzIHVzZWQuICAqLwotLSAgcmV0dXJuIFlZSUQgKHl5cmVzdWx0KTsKLS19Ci0tCi0tCi0tCi0tLyogTGluZSAxNjc1IG9mIHlhY2MuYyAgKi8KLS0jbGluZSAyMDkgInBsdXJhbC55IgotLQotLQotLXZvaWQKLS1pbnRlcm5hbF9mdW5jdGlvbgotLUZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKLS17Ci0tICBpZiAoZXhwID09IE5VTEwpCi0tICAgIHJldHVybjsKLS0KLS0gIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLwotLSAgc3dpdGNoIChleHAtPm5hcmdzKQotLSAgICB7Ci0tICAgIGNhc2UgMzoKLS0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMl0pOwotLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0tICAgIGNhc2UgMjoKLS0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMV0pOwotLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0tICAgIGNhc2UgMToKLS0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMF0pOwotLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0tICAgIGRlZmF1bHQ6Ci0tICAgICAgYnJlYWs7Ci0tICAgIH0KLS0KLS0gIGZyZWUgKGV4cCk7Ci0tfQotLQotLQotLXN0YXRpYyBpbnQKLS15eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCi0tewotLSAgY29uc3QgY2hhciAqZXhwID0gKnBleHA7Ci0tICBpbnQgcmVzdWx0OwotLQotLSAgd2hpbGUgKDEpCi0tICAgIHsKLS0gICAgICBpZiAoZXhwWzBdID09ICdcMCcpCi0tCXsKLS0JICAqcGV4cCA9IGV4cDsKLS0JICByZXR1cm4gWVlFT0Y7Ci0tCX0KLS0KLS0gICAgICBpZiAoZXhwWzBdICE9ICcgJyAmJiBleHBbMF0gIT0gJ1x0JykKLS0JYnJlYWs7Ci0tCi0tICAgICAgKytleHA7Ci0tICAgIH0KLS0KLS0gIHJlc3VsdCA9ICpleHArKzsKLS0gIHN3aXRjaCAocmVzdWx0KQotLSAgICB7Ci0tICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLS0gICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotLSAgICAgIHsKLS0JdW5zaWduZWQgbG9uZyBpbnQgbiA9IHJlc3VsdCAtICcwJzsKLS0Jd2hpbGUgKGV4cFswXSA+PSAnMCcgJiYgZXhwWzBdIDw9ICc5JykKLS0JICB7Ci0tCSAgICBuICo9IDEwOwotLQkgICAgbiArPSBleHBbMF0gLSAnMCc7Ci0tCSAgICArK2V4cDsKLS0JICB9Ci0tCWx2YWwtPm51bSA9IG47Ci0tCXJlc3VsdCA9IE5VTUJFUjsKLS0gICAgICB9Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJz0nOgotLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotLQl7Ci0tCSAgKytleHA7Ci0tCSAgbHZhbC0+b3AgPSBlcXVhbDsKLS0JICByZXN1bHQgPSBFUVVPUDI7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXJlc3VsdCA9IFlZRVJSQ09ERTsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnISc6Ci0tICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0tCXsKLS0JICArK2V4cDsKLS0JICBsdmFsLT5vcCA9IG5vdF9lcXVhbDsKLS0JICByZXN1bHQgPSBFUVVPUDI7Ci0tCX0KLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnJic6Ci0tICAgIGNhc2UgJ3wnOgotLSAgICAgIGlmIChleHBbMF0gPT0gcmVzdWx0KQotLQkrK2V4cDsKLS0gICAgICBlbHNlCi0tCXJlc3VsdCA9IFlZRVJSQ09ERTsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnPCc6Ci0tICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0tCXsKLS0JICArK2V4cDsKLS0JICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7Ci0tCX0KLS0gICAgICBlbHNlCi0tCWx2YWwtPm9wID0gbGVzc190aGFuOwotLSAgICAgIHJlc3VsdCA9IENNUE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnPic6Ci0tICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0tCXsKLS0JICArK2V4cDsKLS0JICBsdmFsLT5vcCA9IGdyZWF0ZXJfb3JfZXF1YWw7Ci0tCX0KLS0gICAgICBlbHNlCi0tCWx2YWwtPm9wID0gZ3JlYXRlcl90aGFuOwotLSAgICAgIHJlc3VsdCA9IENNUE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnKic6Ci0tICAgICAgbHZhbC0+b3AgPSBtdWx0OwotLSAgICAgIHJlc3VsdCA9IE1VTE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnLyc6Ci0tICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7Ci0tICAgICAgcmVzdWx0ID0gTVVMT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICclJzoKLS0gICAgICBsdmFsLT5vcCA9IG1vZHVsZTsKLS0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJysnOgotLSAgICAgIGx2YWwtPm9wID0gcGx1czsKLS0gICAgICByZXN1bHQgPSBBRERPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJy0nOgotLSAgICAgIGx2YWwtPm9wID0gbWludXM7Ci0tICAgICAgcmVzdWx0ID0gQURET1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICduJzoKLS0gICAgY2FzZSAnPyc6Ci0tICAgIGNhc2UgJzonOgotLSAgICBjYXNlICcoJzoKLS0gICAgY2FzZSAnKSc6Ci0tICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCi0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJzsnOgotLSAgICBjYXNlICdcbic6Ci0tICAgIGNhc2UgJ1wwJzoKLS0gICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KLS0gICAgICAtLWV4cDsKLS0gICAgICByZXN1bHQgPSBZWUVPRjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgZGVmYXVsdDoKLS0gICAgICByZXN1bHQgPSBZWUVSUkNPREU7Ci0tI2lmIFlZREVCVUcgIT0gMAotLSAgICAgIC0tZXhwOwotLSNlbmRpZgotLSAgICAgIGJyZWFrOwotLSAgICB9Ci0tCi0tICAqcGV4cCA9IGV4cDsKLS0KLS0gIHJldHVybiByZXN1bHQ7Ci0tfQotLQotLQotLXN0YXRpYyB2b2lkCi0teXllcnJvciAoY29uc3QgY2hhciAqc3RyKQotLXsKLS0gIC8qIERvIG5vdGhpbmcuICBXZSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlLiAgKi8KLS19Ci0tCi0tLS0gYS9pbnRsL3BsdXJhbC55Ci0rKysgL2Rldi9udWxsCi1AQCAtMSwzODUgKzAsMCBAQAotLSV7Ci0tLyogRXhwcmVzc2lvbiBwYXJzaW5nIGZvciBwbHVyYWwgZm9ybSBzZWxlY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMsIDIwMDUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogRm9yIGJpc29uIDwgMi4wLCB0aGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNlciB1c2VzIGFsbG9jYS4gIEFJWCAzIGZvcmNlcyB1cwotLSAgIHRvIHB1dCB0aGlzIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4KLS0gICBiaXNvbidzIHNrZWxldG9uIGZpbGUgY29tZXMgdG9vIGxhdGUuICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPgotLSAgIGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZSBhcmJpdHJhcnkgc3lzdGVtIGhlYWRlcnMuCi0tICAgVGhpcyBjYW4gZ28gYXdheSBvbmNlIHRoZSBBTV9JTlRMX1NVQkRJUiBtYWNybyByZXF1aXJlcyBiaXNvbiA+PSAyLjAuICAqLwotLSNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KLS0gI3ByYWdtYSBhbGxvY2EKLS0jZW5kaWYKLS0KLS0jaWZkZWYgSEFWRV9DT05GSUdfSAotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLS0KLS0vKiBUaGUgbWFpbiBmdW5jdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciBpcyBjYWxsZWQgX19nZXR0ZXh0cGFyc2UsCi0tICAgYnV0IHdlIHdhbnQgaXQgdG8gYmUgY2FsbGVkIFBMVVJBTF9QQVJTRS4gICovCi0tI2lmbmRlZiBfTElCQwotLSMgZGVmaW5lIF9fZ2V0dGV4dHBhcnNlIFBMVVJBTF9QQVJTRQotLSNlbmRpZgotLQotLSNkZWZpbmUgWVlMRVhfUEFSQU0JJigoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+Y3AKLS0jZGVmaW5lIFlZUEFSU0VfUEFSQU0JYXJnCi0tJX0KLS0lcHVyZV9wYXJzZXIKLS0lZXhwZWN0IDcKLS0KLS0ldW5pb24gewotLSAgdW5zaWduZWQgbG9uZyBpbnQgbnVtOwotLSAgZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wOwotLSAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKLS19Ci0tCi0tJXsKLS0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotLXN0YXRpYyBpbnQgeXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKTsKLS1zdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOwotLQotLS8qIEFsbG9jYXRpb24gb2YgZXhwcmVzc2lvbnMuICAqLwotLQotLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cCAoaW50IG5hcmdzLCBlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsCi0tCSBzdHJ1Y3QgZXhwcmVzc2lvbiAqIGNvbnN0ICphcmdzKQotLXsKLS0gIGludCBpOwotLSAgc3RydWN0IGV4cHJlc3Npb24gKm5ld3A7Ci0tCi0tICAvKiBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBtYWxsb2MnZWQsIGp1c3QgcmV0dXJuIE5VTEwuICAqLwotLSAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKLS0gICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKLS0gICAgICBnb3RvIGZhaWw7Ci0tCi0tICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KLS0gIG5ld3AgPSAoc3RydWN0IGV4cHJlc3Npb24gKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7Ci0tICBpZiAobmV3cCAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgbmV3cC0+bmFyZ3MgPSBuYXJnczsKLS0gICAgICBuZXdwLT5vcGVyYXRpb24gPSBvcDsKLS0gICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotLQluZXdwLT52YWwuYXJnc1tpXSA9IGFyZ3NbaV07Ci0tICAgICAgcmV0dXJuIG5ld3A7Ci0tICAgIH0KLS0KLS0gZmFpbDoKLS0gIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0tICAgIEZSRUVfRVhQUkVTU0lPTiAoYXJnc1tpXSk7Ci0tCi0tICByZXR1cm4gTlVMTDsKLS19Ci0tCi0tc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cF8wIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3ApCi0tewotLSAgcmV0dXJuIG5ld19leHAgKDAsIG9wLCBOVUxMKTsKLS19Ci0tCi0tc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cF8xIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKLS17Ci0tICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1sxXTsKLS0KLS0gIGFyZ3NbMF0gPSByaWdodDsKLS0gIHJldHVybiBuZXdfZXhwICgxLCBvcCwgYXJncyk7Ci0tfQotLQotLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi0tbmV3X2V4cF8yIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpsZWZ0LAotLQkgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCi0tewotLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07Ci0tCi0tICBhcmdzWzBdID0gbGVmdDsKLS0gIGFyZ3NbMV0gPSByaWdodDsKLS0gIHJldHVybiBuZXdfZXhwICgyLCBvcCwgYXJncyk7Ci0tfQotLQotLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotLW5ld19leHBfMyAoZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqYmV4cCwKLS0JICAgc3RydWN0IGV4cHJlc3Npb24gKnRicmFuY2gsIHN0cnVjdCBleHByZXNzaW9uICpmYnJhbmNoKQotLXsKLS0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwotLQotLSAgYXJnc1swXSA9IGJleHA7Ci0tICBhcmdzWzFdID0gdGJyYW5jaDsKLS0gIGFyZ3NbMl0gPSBmYnJhbmNoOwotLSAgcmV0dXJuIG5ld19leHAgKDMsIG9wLCBhcmdzKTsKLS19Ci0tCi0tJX0KLS0KLS0vKiBUaGlzIGRlY2xhcmVzIHRoYXQgYWxsIG9wZXJhdG9ycyBoYXZlIHRoZSBzYW1lIGFzc29jaWF0aXZpdHkgYW5kIHRoZQotLSAgIHByZWNlZGVuY2Ugb3JkZXIgYXMgaW4gQy4gIFNlZSBbSGFyYmlzb24sIFN0ZWVsZTogQywgQSBSZWZlcmVuY2UgTWFudWFsXS4KLS0gICBUaGVyZSBpcyBubyB1bmFyeSBtaW51cyBhbmQgbm8gYml0d2lzZSBvcGVyYXRvcnMuCi0tICAgT3BlcmF0b3JzIHdpdGggdGhlIHNhbWUgc3ludGFjdGljIGJlaGF2aW91ciBoYXZlIGJlZW4gbWVyZ2VkIGludG8gYSBzaW5nbGUKLS0gICB0b2tlbiwgdG8gc2F2ZSBzcGFjZSBpbiB0aGUgYXJyYXkgZ2VuZXJhdGVkIGJ5IGJpc29uLiAgKi8KLS0lcmlnaHQgJz8nCQkvKiAgID8JCSovCi0tJWxlZnQgJ3wnCQkvKiAgIHx8CQkqLwotLSVsZWZ0ICcmJwkJLyogICAmJgkJKi8KLS0lbGVmdCBFUVVPUDIJCS8qICAgPT0gIT0JKi8KLS0lbGVmdCBDTVBPUDIJCS8qICAgPCA+IDw9ID49CSovCi0tJWxlZnQgQURET1AyCQkvKiAgICsgLQkqLwotLSVsZWZ0IE1VTE9QMgkJLyogICAqIC8gJQkqLwotLSVyaWdodCAnIScJCS8qICAgIQkJKi8KLS0KLS0ldG9rZW4gPG9wPiBFUVVPUDIgQ01QT1AyIEFERE9QMiBNVUxPUDIKLS0ldG9rZW4gPG51bT4gTlVNQkVSCi0tJXR5cGUgPGV4cD4gZXhwCi0tCi0tJSUKLS0KLS1zdGFydDoJICBleHAKLS0JICB7Ci0tCSAgICBpZiAoJDEgPT0gTlVMTCkKLS0JICAgICAgWVlBQk9SVDsKLS0JICAgICgoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+cmVzID0gJDE7Ci0tCSAgfQotLQk7Ci0tCi0tZXhwOgkgIGV4cCAnPycgZXhwICc6JyBleHAKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMyAocW1vcCwgJDEsICQzLCAkNSk7Ci0tCSAgfQotLQl8IGV4cCAnfCcgZXhwCi0tCSAgewotLQkgICAgJCQgPSBuZXdfZXhwXzIgKGxvciwgJDEsICQzKTsKLS0JICB9Ci0tCXwgZXhwICcmJyBleHAKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMiAobGFuZCwgJDEsICQzKTsKLS0JICB9Ci0tCXwgZXhwIEVRVU9QMiBleHAKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7Ci0tCSAgfQotLQl8IGV4cCBDTVBPUDIgZXhwCi0tCSAgewotLQkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOwotLQkgIH0KLS0JfCBleHAgQURET1AyIGV4cAotLQkgIHsKLS0JICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKLS0JICB9Ci0tCXwgZXhwIE1VTE9QMiBleHAKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7Ci0tCSAgfQotLQl8ICchJyBleHAKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMSAobG5vdCwgJDIpOwotLQkgIH0KLS0JfCAnbicKLS0JICB7Ci0tCSAgICAkJCA9IG5ld19leHBfMCAodmFyKTsKLS0JICB9Ci0tCXwgTlVNQkVSCi0tCSAgewotLQkgICAgaWYgKCgkJCA9IG5ld19leHBfMCAobnVtKSkgIT0gTlVMTCkKLS0JICAgICAgJCQtPnZhbC5udW0gPSAkMTsKLS0JICB9Ci0tCXwgJygnIGV4cCAnKScKLS0JICB7Ci0tCSAgICAkJCA9ICQyOwotLQkgIH0KLS0JOwotLQotLSUlCi0tCi0tdm9pZAotLWludGVybmFsX2Z1bmN0aW9uCi0tRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQotLXsKLS0gIGlmIChleHAgPT0gTlVMTCkKLS0gICAgcmV0dXJuOwotLQotLSAgLyogSGFuZGxlIHRoZSByZWN1cnNpdmUgY2FzZS4gICovCi0tICBzd2l0Y2ggKGV4cC0+bmFyZ3MpCi0tICAgIHsKLS0gICAgY2FzZSAzOgotLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1syXSk7Ci0tICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLS0gICAgY2FzZSAyOgotLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1sxXSk7Ci0tICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLS0gICAgY2FzZSAxOgotLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1swXSk7Ci0tICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLS0gICAgZGVmYXVsdDoKLS0gICAgICBicmVhazsKLS0gICAgfQotLQotLSAgZnJlZSAoZXhwKTsKLS19Ci0tCi0tCi0tc3RhdGljIGludAotLXl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCkKLS17Ci0tICBjb25zdCBjaGFyICpleHAgPSAqcGV4cDsKLS0gIGludCByZXN1bHQ7Ci0tCi0tICB3aGlsZSAoMSkKLS0gICAgewotLSAgICAgIGlmIChleHBbMF0gPT0gJ1wwJykKLS0JewotLQkgICpwZXhwID0gZXhwOwotLQkgIHJldHVybiBZWUVPRjsKLS0JfQotLQotLSAgICAgIGlmIChleHBbMF0gIT0gJyAnICYmIGV4cFswXSAhPSAnXHQnKQotLQlicmVhazsKLS0KLS0gICAgICArK2V4cDsKLS0gICAgfQotLQotLSAgcmVzdWx0ID0gKmV4cCsrOwotLSAgc3dpdGNoIChyZXN1bHQpCi0tICAgIHsKLS0gICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotLSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0tICAgICAgewotLQl1bnNpZ25lZCBsb25nIGludCBuID0gcmVzdWx0IC0gJzAnOwotLQl3aGlsZSAoZXhwWzBdID49ICcwJyAmJiBleHBbMF0gPD0gJzknKQotLQkgIHsKLS0JICAgIG4gKj0gMTA7Ci0tCSAgICBuICs9IGV4cFswXSAtICcwJzsKLS0JICAgICsrZXhwOwotLQkgIH0KLS0JbHZhbC0+bnVtID0gbjsKLS0JcmVzdWx0ID0gTlVNQkVSOwotLSAgICAgIH0KLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnPSc6Ci0tICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0tCXsKLS0JICArK2V4cDsKLS0JICBsdmFsLT5vcCA9IGVxdWFsOwotLQkgIHJlc3VsdCA9IEVRVU9QMjsKLS0JfQotLSAgICAgIGVsc2UKLS0JcmVzdWx0ID0gWVlFUlJDT0RFOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICchJzoKLS0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLS0JewotLQkgICsrZXhwOwotLQkgIGx2YWwtPm9wID0gbm90X2VxdWFsOwotLQkgIHJlc3VsdCA9IEVRVU9QMjsKLS0JfQotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICcmJzoKLS0gICAgY2FzZSAnfCc6Ci0tICAgICAgaWYgKGV4cFswXSA9PSByZXN1bHQpCi0tCSsrZXhwOwotLSAgICAgIGVsc2UKLS0JcmVzdWx0ID0gWVlFUlJDT0RFOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICc8JzoKLS0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLS0JewotLQkgICsrZXhwOwotLQkgIGx2YWwtPm9wID0gbGVzc19vcl9lcXVhbDsKLS0JfQotLSAgICAgIGVsc2UKLS0JbHZhbC0+b3AgPSBsZXNzX3RoYW47Ci0tICAgICAgcmVzdWx0ID0gQ01QT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICc+JzoKLS0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLS0JewotLQkgICsrZXhwOwotLQkgIGx2YWwtPm9wID0gZ3JlYXRlcl9vcl9lcXVhbDsKLS0JfQotLSAgICAgIGVsc2UKLS0JbHZhbC0+b3AgPSBncmVhdGVyX3RoYW47Ci0tICAgICAgcmVzdWx0ID0gQ01QT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICcqJzoKLS0gICAgICBsdmFsLT5vcCA9IG11bHQ7Ci0tICAgICAgcmVzdWx0ID0gTVVMT1AyOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBjYXNlICcvJzoKLS0gICAgICBsdmFsLT5vcCA9IGRpdmlkZTsKLS0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJyUnOgotLSAgICAgIGx2YWwtPm9wID0gbW9kdWxlOwotLSAgICAgIHJlc3VsdCA9IE1VTE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnKyc6Ci0tICAgICAgbHZhbC0+b3AgPSBwbHVzOwotLSAgICAgIHJlc3VsdCA9IEFERE9QMjsKLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnLSc6Ci0tICAgICAgbHZhbC0+b3AgPSBtaW51czsKLS0gICAgICByZXN1bHQgPSBBRERPUDI7Ci0tICAgICAgYnJlYWs7Ci0tCi0tICAgIGNhc2UgJ24nOgotLSAgICBjYXNlICc/JzoKLS0gICAgY2FzZSAnOic6Ci0tICAgIGNhc2UgJygnOgotLSAgICBjYXNlICcpJzoKLS0gICAgICAvKiBOb3RoaW5nLCBqdXN0IHJldHVybiB0aGUgY2hhcmFjdGVyLiAgKi8KLS0gICAgICBicmVhazsKLS0KLS0gICAgY2FzZSAnOyc6Ci0tICAgIGNhc2UgJ1xuJzoKLS0gICAgY2FzZSAnXDAnOgotLSAgICAgIC8qIEJlIHNhZmUgYW5kIGxldCB0aGUgdXNlciBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4uICAqLwotLSAgICAgIC0tZXhwOwotLSAgICAgIHJlc3VsdCA9IFlZRU9GOwotLSAgICAgIGJyZWFrOwotLQotLSAgICBkZWZhdWx0OgotLSAgICAgIHJlc3VsdCA9IFlZRVJSQ09ERTsKLS0jaWYgWVlERUJVRyAhPSAwCi0tICAgICAgLS1leHA7Ci0tI2VuZGlmCi0tICAgICAgYnJlYWs7Ci0tICAgIH0KLS0KLS0gICpwZXhwID0gZXhwOwotLQotLSAgcmV0dXJuIHJlc3VsdDsKLS19Ci0tCi0tCi0tc3RhdGljIHZvaWQKLS15eWVycm9yIChjb25zdCBjaGFyICpzdHIpCi0tewotLSAgLyogRG8gbm90aGluZy4gIFdlIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUuICAqLwotLX0KLS0tLSBhL2ludGwvcHJpbnRmLWFyZ3MuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsMTg4ICswLDAgQEAKLS0vKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgotLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzLCAyMDA1LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBUaGlzIGZpbGUgY2FuIGJlIHBhcmFtZXRyaXplZCB3aXRoIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgotLSAgICAgRU5BQkxFX1VOSVNURElPICAgIFNldCB0byAxIHRvIGVuYWJsZSB0aGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4KLS0gICAgIFBSSU5URl9GRVRDSEFSR1MgICBOYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBkZWZpbmVkLgotLSAgICAgU1RBVElDICAgICAgICAgICAgIFNldCB0byAnc3RhdGljJyB0byBkZWNsYXJlIHRoZSBmdW5jdGlvbiBzdGF0aWMuICAqLwotLQotLSNpZm5kZWYgUFJJTlRGX0ZFVENIQVJHUwotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tLyogU3BlY2lmaWNhdGlvbi4gICovCi0tI2lmbmRlZiBQUklOVEZfRkVUQ0hBUkdTCi0tIyBpbmNsdWRlICJwcmludGYtYXJncy5oIgotLSNlbmRpZgotLQotLSNpZmRlZiBTVEFUSUMKLS1TVEFUSUMKLS0jZW5kaWYKLS1pbnQKLS1QUklOVEZfRkVUQ0hBUkdTICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSkKLS17Ci0tICBzaXplX3QgaTsKLS0gIGFyZ3VtZW50ICphcDsKLS0KLS0gIGZvciAoaSA9IDAsIGFwID0gJmEtPmFyZ1swXTsgaSA8IGEtPmNvdW50OyBpKyssIGFwKyspCi0tICAgIHN3aXRjaCAoYXAtPnR5cGUpCi0tICAgICAgewotLSAgICAgIGNhc2UgVFlQRV9TQ0hBUjoKLS0JYXAtPmEuYV9zY2hhciA9IHZhX2FyZyAoYXJncywgLypzaWduZWQgY2hhciovIGludCk7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9VQ0hBUjoKLS0JYXAtPmEuYV91Y2hhciA9IHZhX2FyZyAoYXJncywgLyp1bnNpZ25lZCBjaGFyKi8gaW50KTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX1NIT1JUOgotLQlhcC0+YS5hX3Nob3J0ID0gdmFfYXJnIChhcmdzLCAvKnNob3J0Ki8gaW50KTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX1VTSE9SVDoKLS0JYXAtPmEuYV91c2hvcnQgPSB2YV9hcmcgKGFyZ3MsIC8qdW5zaWduZWQgc2hvcnQqLyBpbnQpOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfSU5UOgotLQlhcC0+YS5hX2ludCA9IHZhX2FyZyAoYXJncywgaW50KTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX1VJTlQ6Ci0tCWFwLT5hLmFfdWludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgaW50KTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX0xPTkdJTlQ6Ci0tCWFwLT5hLmFfbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQpOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfVUxPTkdJTlQ6Ci0tCWFwLT5hLmFfdWxvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgaW50KTsKLS0JYnJlYWs7Ci0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLSAgICAgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKLS0JYXAtPmEuYV9sb25nbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyBsb25nIGludCk7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6Ci0tCWFwLT5hLmFfdWxvbmdsb25naW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nIGxvbmcgaW50KTsKLS0JYnJlYWs7Ci0tI2VuZGlmCi0tICAgICAgY2FzZSBUWVBFX0RPVUJMRToKLS0JYXAtPmEuYV9kb3VibGUgPSB2YV9hcmcgKGFyZ3MsIGRvdWJsZSk7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgotLQlhcC0+YS5hX2xvbmdkb3VibGUgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgZG91YmxlKTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX0NIQVI6Ci0tCWFwLT5hLmFfY2hhciA9IHZhX2FyZyAoYXJncywgaW50KTsKLS0JYnJlYWs7Ci0tI2lmIEhBVkVfV0lOVF9UCi0tICAgICAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKLS0JLyogQWx0aG91Z2ggSVNPIEMgOTkgNy4yNC4xLigyKSBzYXlzIHRoYXQgd2ludF90IGlzICJ1bmNoYW5nZWQgYnkKLS0JICAgZGVmYXVsdCBhcmd1bWVudCBwcm9tb3Rpb25zIiwgdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gbWluZ3czMiwKLS0JICAgd2hlcmUgd2ludF90IGlzICd1bnNpZ25lZCBzaG9ydCcuICAqLwotLQlhcC0+YS5hX3dpZGVfY2hhciA9Ci0tCSAgKHNpemVvZiAod2ludF90KSA8IHNpemVvZiAoaW50KQotLQkgICA/IHZhX2FyZyAoYXJncywgaW50KQotLQkgICA6IHZhX2FyZyAoYXJncywgd2ludF90KSk7Ci0tCWJyZWFrOwotLSNlbmRpZgotLSAgICAgIGNhc2UgVFlQRV9TVFJJTkc6Ci0tCWFwLT5hLmFfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotLQkvKiBBIG51bGwgcG9pbnRlciBpcyBhbiBpbnZhbGlkIGFyZ3VtZW50IGZvciAiJXMiLCBidXQgaW4gcHJhY3RpY2UKLS0JICAgaXQgb2NjdXJzIHF1aXRlIGZyZXF1ZW50bHkgaW4gcHJpbnRmIHN0YXRlbWVudHMgdGhhdCBwcm9kdWNlCi0tCSAgIGRlYnVnIG91dHB1dC4gIFVzZSBhIGZhbGxiYWNrIGluIHRoaXMgY2FzZS4gICovCi0tCWlmIChhcC0+YS5hX3N0cmluZyA9PSBOVUxMKQotLQkgIGFwLT5hLmFfc3RyaW5nID0gIihOVUxMKSI7Ci0tCWJyZWFrOwotLSNpZiBIQVZFX1dDSEFSX1QKLS0gICAgICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6Ci0tCWFwLT5hLmFfd2lkZV9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IHdjaGFyX3QgKik7Ci0tCS8qIEEgbnVsbCBwb2ludGVyIGlzIGFuIGludmFsaWQgYXJndW1lbnQgZm9yICIlbHMiLCBidXQgaW4gcHJhY3RpY2UKLS0JICAgaXQgb2NjdXJzIHF1aXRlIGZyZXF1ZW50bHkgaW4gcHJpbnRmIHN0YXRlbWVudHMgdGhhdCBwcm9kdWNlCi0tCSAgIGRlYnVnIG91dHB1dC4gIFVzZSBhIGZhbGxiYWNrIGluIHRoaXMgY2FzZS4gICovCi0tCWlmIChhcC0+YS5hX3dpZGVfc3RyaW5nID09IE5VTEwpCi0tCSAgewotLQkgICAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgd2lkZV9udWxsX3N0cmluZ1tdID0KLS0JICAgICAgewotLQkJKHdjaGFyX3QpJygnLAotLQkJKHdjaGFyX3QpJ04nLCAod2NoYXJfdCknVScsICh3Y2hhcl90KSdMJywgKHdjaGFyX3QpJ0wnLAotLQkJKHdjaGFyX3QpJyknLAotLQkJKHdjaGFyX3QpMAotLQkgICAgICB9OwotLQkgICAgYXAtPmEuYV93aWRlX3N0cmluZyA9IHdpZGVfbnVsbF9zdHJpbmc7Ci0tCSAgfQotLQlicmVhazsKLS0jZW5kaWYKLS0gICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKLS0JYXAtPmEuYV9wb2ludGVyID0gdmFfYXJnIChhcmdzLCB2b2lkICopOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKLS0JYXAtPmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaWduZWQgY2hhciAqKTsKLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6Ci0tCWFwLT5hLmFfY291bnRfc2hvcnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgc2hvcnQgKik7Ci0tCWJyZWFrOwotLSAgICAgIGNhc2UgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjoKLS0JYXAtPmEuYV9jb3VudF9pbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgaW50ICopOwotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOgotLQlhcC0+YS5hX2NvdW50X2xvbmdpbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQgKik7Ci0tCWJyZWFrOwotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0gICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjoKLS0JYXAtPmEuYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGxvbmcgaW50ICopOwotLQlicmVhazsKLS0jZW5kaWYKLS0jaWYgRU5BQkxFX1VOSVNURElPCi0tICAgICAgLyogVGhlIHVuaXN0ZGlvIGV4dGVuc2lvbnMuICAqLwotLSAgICAgIGNhc2UgVFlQRV9VOF9TVFJJTkc6Ci0tCWFwLT5hLmFfdThfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB1aW50OF90ICopOwotLQkvKiBBIG51bGwgcG9pbnRlciBpcyBhbiBpbnZhbGlkIGFyZ3VtZW50IGZvciAiJVUiLCBidXQgaW4gcHJhY3RpY2UKLS0JICAgaXQgb2NjdXJzIHF1aXRlIGZyZXF1ZW50bHkgaW4gcHJpbnRmIHN0YXRlbWVudHMgdGhhdCBwcm9kdWNlCi0tCSAgIGRlYnVnIG91dHB1dC4gIFVzZSBhIGZhbGxiYWNrIGluIHRoaXMgY2FzZS4gICovCi0tCWlmIChhcC0+YS5hX3U4X3N0cmluZyA9PSBOVUxMKQotLQkgIHsKLS0JICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHU4X251bGxfc3RyaW5nW10gPQotLQkgICAgICB7ICcoJywgJ04nLCAnVScsICdMJywgJ0wnLCAnKScsIDAgfTsKLS0JICAgIGFwLT5hLmFfdThfc3RyaW5nID0gdThfbnVsbF9zdHJpbmc7Ci0tCSAgfQotLQlicmVhazsKLS0gICAgICBjYXNlIFRZUEVfVTE2X1NUUklORzoKLS0JYXAtPmEuYV91MTZfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB1aW50MTZfdCAqKTsKLS0JLyogQSBudWxsIHBvaW50ZXIgaXMgYW4gaW52YWxpZCBhcmd1bWVudCBmb3IgIiVsVSIsIGJ1dCBpbiBwcmFjdGljZQotLQkgICBpdCBvY2N1cnMgcXVpdGUgZnJlcXVlbnRseSBpbiBwcmludGYgc3RhdGVtZW50cyB0aGF0IHByb2R1Y2UKLS0JICAgZGVidWcgb3V0cHV0LiAgVXNlIGEgZmFsbGJhY2sgaW4gdGhpcyBjYXNlLiAgKi8KLS0JaWYgKGFwLT5hLmFfdTE2X3N0cmluZyA9PSBOVUxMKQotLQkgIHsKLS0JICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCB1MTZfbnVsbF9zdHJpbmdbXSA9Ci0tCSAgICAgIHsgJygnLCAnTicsICdVJywgJ0wnLCAnTCcsICcpJywgMCB9OwotLQkgICAgYXAtPmEuYV91MTZfc3RyaW5nID0gdTE2X251bGxfc3RyaW5nOwotLQkgIH0KLS0JYnJlYWs7Ci0tICAgICAgY2FzZSBUWVBFX1UzMl9TVFJJTkc6Ci0tCWFwLT5hLmFfdTMyX3N0cmluZyA9IHZhX2FyZyAoYXJncywgY29uc3QgdWludDMyX3QgKik7Ci0tCS8qIEEgbnVsbCBwb2ludGVyIGlzIGFuIGludmFsaWQgYXJndW1lbnQgZm9yICIlbGxVIiwgYnV0IGluIHByYWN0aWNlCi0tCSAgIGl0IG9jY3VycyBxdWl0ZSBmcmVxdWVudGx5IGluIHByaW50ZiBzdGF0ZW1lbnRzIHRoYXQgcHJvZHVjZQotLQkgICBkZWJ1ZyBvdXRwdXQuICBVc2UgYSBmYWxsYmFjayBpbiB0aGlzIGNhc2UuICAqLwotLQlpZiAoYXAtPmEuYV91MzJfc3RyaW5nID09IE5VTEwpCi0tCSAgewotLQkgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHUzMl9udWxsX3N0cmluZ1tdID0KLS0JICAgICAgeyAnKCcsICdOJywgJ1UnLCAnTCcsICdMJywgJyknLCAwIH07Ci0tCSAgICBhcC0+YS5hX3UzMl9zdHJpbmcgPSB1MzJfbnVsbF9zdHJpbmc7Ci0tCSAgfQotLQlicmVhazsKLS0jZW5kaWYKLS0gICAgICBkZWZhdWx0OgotLQkvKiBVbmtub3duIHR5cGUuICAqLwotLQlyZXR1cm4gLTE7Ci0tICAgICAgfQotLSAgcmV0dXJuIDA7Ci0tfQotLS0tIGEvaW50bC9wcmludGYtYXJncy5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxNTUgKzAsMCBAQAotLS8qIERlY29tcG9zZWQgcHJpbnRmIGFyZ3VtZW50IGxpc3QuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMsIDIwMDYtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX1BSSU5URl9BUkdTX0gKLS0jZGVmaW5lIF9QUklOVEZfQVJHU19ICi0tCi0tLyogVGhpcyBmaWxlIGNhbiBiZSBwYXJhbWV0cml6ZWQgd2l0aCB0aGUgZm9sbG93aW5nIG1hY3JvczoKLS0gICAgIEVOQUJMRV9VTklTVERJTyAgICBTZXQgdG8gMSB0byBlbmFibGUgdGhlIHVuaXN0ZGlvIGV4dGVuc2lvbnMuCi0tICAgICBQUklOVEZfRkVUQ0hBUkdTICAgTmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgZGVjbGFyZWQuCi0tICAgICBTVEFUSUMgICAgICAgICAgICAgU2V0IHRvICdzdGF0aWMnIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHN0YXRpYy4gICovCi0tCi0tLyogRGVmYXVsdCBwYXJhbWV0ZXJzLiAgKi8KLS0jaWZuZGVmIFBSSU5URl9GRVRDSEFSR1MKLS0jIGRlZmluZSBQUklOVEZfRkVUQ0hBUkdTIHByaW50Zl9mZXRjaGFyZ3MKLS0jZW5kaWYKLS0KLS0vKiBHZXQgc2l6ZV90LiAgKi8KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tCi0tLyogR2V0IHdjaGFyX3QuICAqLwotLSNpZiBIQVZFX1dDSEFSX1QKLS0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotLSNlbmRpZgotLQotLS8qIEdldCB3aW50X3QuICAqLwotLSNpZiBIQVZFX1dJTlRfVAotLSMgaW5jbHVkZSA8d2NoYXIuaD4KLS0jZW5kaWYKLS0KLS0vKiBHZXQgdmFfbGlzdC4gICovCi0tI2luY2x1ZGUgPHN0ZGFyZy5oPgotLQotLQotLS8qIEFyZ3VtZW50IHR5cGVzICovCi0tdHlwZWRlZiBlbnVtCi0tewotLSAgVFlQRV9OT05FLAotLSAgVFlQRV9TQ0hBUiwKLS0gIFRZUEVfVUNIQVIsCi0tICBUWVBFX1NIT1JULAotLSAgVFlQRV9VU0hPUlQsCi0tICBUWVBFX0lOVCwKLS0gIFRZUEVfVUlOVCwKLS0gIFRZUEVfTE9OR0lOVCwKLS0gIFRZUEVfVUxPTkdJTlQsCi0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLSAgVFlQRV9MT05HTE9OR0lOVCwKLS0gIFRZUEVfVUxPTkdMT05HSU5ULAotLSNlbmRpZgotLSAgVFlQRV9ET1VCTEUsCi0tICBUWVBFX0xPTkdET1VCTEUsCi0tICBUWVBFX0NIQVIsCi0tI2lmIEhBVkVfV0lOVF9UCi0tICBUWVBFX1dJREVfQ0hBUiwKLS0jZW5kaWYKLS0gIFRZUEVfU1RSSU5HLAotLSNpZiBIQVZFX1dDSEFSX1QKLS0gIFRZUEVfV0lERV9TVFJJTkcsCi0tI2VuZGlmCi0tICBUWVBFX1BPSU5URVIsCi0tICBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVIsCi0tICBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVIsCi0tICBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSLAotLSAgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVIKLS0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tLCBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVIKLS0jZW5kaWYKLS0jaWYgRU5BQkxFX1VOSVNURElPCi0tICAvKiBUaGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4gICovCi0tLCBUWVBFX1U4X1NUUklORwotLSwgVFlQRV9VMTZfU1RSSU5HCi0tLCBUWVBFX1UzMl9TVFJJTkcKLS0jZW5kaWYKLS19IGFyZ190eXBlOwotLQotLS8qIFBvbHltb3JwaGljIGFyZ3VtZW50ICovCi0tdHlwZWRlZiBzdHJ1Y3QKLS17Ci0tICBhcmdfdHlwZSB0eXBlOwotLSAgdW5pb24KLS0gIHsKLS0gICAgc2lnbmVkIGNoYXIJCQlhX3NjaGFyOwotLSAgICB1bnNpZ25lZCBjaGFyCQlhX3VjaGFyOwotLSAgICBzaG9ydAkJCWFfc2hvcnQ7Ci0tICAgIHVuc2lnbmVkIHNob3J0CQlhX3VzaG9ydDsKLS0gICAgaW50CQkJCWFfaW50OwotLSAgICB1bnNpZ25lZCBpbnQJCWFfdWludDsKLS0gICAgbG9uZyBpbnQJCQlhX2xvbmdpbnQ7Ci0tICAgIHVuc2lnbmVkIGxvbmcgaW50CQlhX3Vsb25naW50OwotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0gICAgbG9uZyBsb25nIGludAkJYV9sb25nbG9uZ2ludDsKLS0gICAgdW5zaWduZWQgbG9uZyBsb25nIGludAlhX3Vsb25nbG9uZ2ludDsKLS0jZW5kaWYKLS0gICAgZmxvYXQJCQlhX2Zsb2F0OwotLSAgICBkb3VibGUJCQlhX2RvdWJsZTsKLS0gICAgbG9uZyBkb3VibGUJCQlhX2xvbmdkb3VibGU7Ci0tICAgIGludAkJCQlhX2NoYXI7Ci0tI2lmIEhBVkVfV0lOVF9UCi0tICAgIHdpbnRfdAkJCWFfd2lkZV9jaGFyOwotLSNlbmRpZgotLSAgICBjb25zdCBjaGFyKgkJCWFfc3RyaW5nOwotLSNpZiBIQVZFX1dDSEFSX1QKLS0gICAgY29uc3Qgd2NoYXJfdCoJCWFfd2lkZV9zdHJpbmc7Ci0tI2VuZGlmCi0tICAgIHZvaWQqCQkJYV9wb2ludGVyOwotLSAgICBzaWduZWQgY2hhciAqCQlhX2NvdW50X3NjaGFyX3BvaW50ZXI7Ci0tICAgIHNob3J0ICoJCQlhX2NvdW50X3Nob3J0X3BvaW50ZXI7Ci0tICAgIGludCAqCQkJYV9jb3VudF9pbnRfcG9pbnRlcjsKLS0gICAgbG9uZyBpbnQgKgkJCWFfY291bnRfbG9uZ2ludF9wb2ludGVyOwotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0gICAgbG9uZyBsb25nIGludCAqCQlhX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXI7Ci0tI2VuZGlmCi0tI2lmIEVOQUJMRV9VTklTVERJTwotLSAgICAvKiBUaGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4gICovCi0tICAgIGNvbnN0IHVpbnQ4X3QgKgkJYV91OF9zdHJpbmc7Ci0tICAgIGNvbnN0IHVpbnQxNl90ICoJCWFfdTE2X3N0cmluZzsKLS0gICAgY29uc3QgdWludDMyX3QgKgkJYV91MzJfc3RyaW5nOwotLSNlbmRpZgotLSAgfQotLSAgYTsKLS19Ci0tYXJndW1lbnQ7Ci0tCi0tdHlwZWRlZiBzdHJ1Y3QKLS17Ci0tICBzaXplX3QgY291bnQ7Ci0tICBhcmd1bWVudCAqYXJnOwotLX0KLS1hcmd1bWVudHM7Ci0tCi0tCi0tLyogRmV0Y2ggdGhlIGFyZ3VtZW50cywgcHV0dGluZyB0aGVtIGludG8gYS4gKi8KLS0jaWZkZWYgU1RBVElDCi0tU1RBVElDCi0tI2Vsc2UKLS1leHRlcm4KLS0jZW5kaWYKLS1pbnQgUFJJTlRGX0ZFVENIQVJHUyAodmFfbGlzdCBhcmdzLCBhcmd1bWVudHMgKmEpOwotLQotLSNlbmRpZiAvKiBfUFJJTlRGX0FSR1NfSCAqLwotLS0tIGEvaW50bC9wcmludGYtcGFyc2UuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNTkwICswLDAgQEAKLS0vKiBGb3JtYXR0ZWQgb3V0cHV0IHRvIHN0cmluZ3MuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAsIDIwMDItMjAwMywgMjAwNi0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tLyogVGhpcyBmaWxlIGNhbiBiZSBwYXJhbWV0cml6ZWQgd2l0aCB0aGUgZm9sbG93aW5nIG1hY3JvczoKLS0gICAgIENIQVJfVCAgICAgICAgICAgICBUaGUgZWxlbWVudCB0eXBlIG9mIHRoZSBmb3JtYXQgc3RyaW5nLgotLSAgICAgQ0hBUl9UX09OTFlfQVNDSUkgIFNldCB0byAxIHRvIGVuYWJsZSB2ZXJpZmljYXRpb24gdGhhdCBhbGwgY2hhcmFjdGVycwotLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3RyaW5nIGFyZSBBU0NJSS4KLS0gICAgIERJUkVDVElWRSAgICAgICAgICBTdHJ1Y3R1cmUgZGVub3RpbmcgYSBmb3JtYXQgZGlyZWN0aXZlLgotLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZHMgb24gQ0hBUl9ULgotLSAgICAgRElSRUNUSVZFUyAgICAgICAgIFN0cnVjdHVyZSBkZW5vdGluZyB0aGUgc2V0IG9mIGZvcm1hdCBkaXJlY3RpdmVzIG9mIGEKLS0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLiAgRGVwZW5kcyBvbiBDSEFSX1QuCi0tICAgICBQUklOVEZfUEFSU0UgICAgICAgRnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBmb3JtYXQgc3RyaW5nLgotLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZHMgb24gQ0hBUl9ULgotLSAgICAgU1RBVElDICAgICAgICAgICAgIFNldCB0byAnc3RhdGljJyB0byBkZWNsYXJlIHRoZSBmdW5jdGlvbiBzdGF0aWMuCi0tICAgICBFTkFCTEVfVU5JU1RESU8gICAgU2V0IHRvIDEgdG8gZW5hYmxlIHRoZSB1bmlzdGRpbyBleHRlbnNpb25zLiAgKi8KLS0KLS0jaWZuZGVmIFBSSU5URl9QQVJTRQotLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0tI2VuZGlmCi0tCi0tLyogU3BlY2lmaWNhdGlvbi4gICovCi0tI2lmbmRlZiBQUklOVEZfUEFSU0UKLS0jIGluY2x1ZGUgInByaW50Zi1wYXJzZS5oIgotLSNlbmRpZgotLQotLS8qIERlZmF1bHQgcGFyYW1ldGVycy4gICovCi0tI2lmbmRlZiBQUklOVEZfUEFSU0UKLS0jIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCi0tIyBkZWZpbmUgQ0hBUl9UIGNoYXIKLS0jIGRlZmluZSBESVJFQ1RJVkUgY2hhcl9kaXJlY3RpdmUKLS0jIGRlZmluZSBESVJFQ1RJVkVTIGNoYXJfZGlyZWN0aXZlcwotLSNlbmRpZgotLQotLS8qIEdldCBzaXplX3QsIE5VTEwuICAqLwotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0KLS0vKiBHZXQgaW50bWF4X3QuICAqLwotLSNpZiBkZWZpbmVkIElOX0xJQklOVEwgfHwgZGVmaW5lZCBJTl9MSUJBU1BSSU5URgotLSMgaWYgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVgKLS0jICBpbmNsdWRlIDxzdGRpbnQuaD4KLS0jIGVuZGlmCi0tIyBpZiBIQVZFX0lOVFRZUEVTX0hfV0lUSF9VSU5UTUFYCi0tIyAgaW5jbHVkZSA8aW50dHlwZXMuaD4KLS0jIGVuZGlmCi0tI2Vsc2UKLS0jIGluY2x1ZGUgPHN0ZGludC5oPgotLSNlbmRpZgotLQotLS8qIG1hbGxvYygpLCByZWFsbG9jKCksIGZyZWUoKS4gICovCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLQotLS8qIGVycm5vLiAgKi8KLS0jaW5jbHVkZSA8ZXJybm8uaD4KLS0KLS0vKiBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuICAqLwotLSNpbmNsdWRlICJ4c2l6ZS5oIgotLQotLSNpZiBDSEFSX1RfT05MWV9BU0NJSQotLS8qIGNfaXNhc2NpaSgpLiAgKi8KLS0jIGluY2x1ZGUgImMtY3R5cGUuaCIKLS0jZW5kaWYKLS0KLS0jaWZkZWYgU1RBVElDCi0tU1RBVElDCi0tI2VuZGlmCi0taW50Ci0tUFJJTlRGX1BBUlNFIChjb25zdCBDSEFSX1QgKmZvcm1hdCwgRElSRUNUSVZFUyAqZCwgYXJndW1lbnRzICphKQotLXsKLS0gIGNvbnN0IENIQVJfVCAqY3AgPSBmb3JtYXQ7CQkvKiBwb2ludGVyIGludG8gZm9ybWF0ICovCi0tICBzaXplX3QgYXJnX3Bvc24gPSAwOwkJLyogbnVtYmVyIG9mIHJlZ3VsYXIgYXJndW1lbnRzIGNvbnN1bWVkICovCi0tICBzaXplX3QgZF9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGQtPmRpciAqLwotLSAgc2l6ZV90IGFfYWxsb2NhdGVkOwkJCS8qIGFsbG9jYXRlZCBlbGVtZW50cyBvZiBhLT5hcmcgKi8KLS0gIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoID0gMDsKLS0gIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDA7Ci0tCi0tICBkLT5jb3VudCA9IDA7Ci0tICBkX2FsbG9jYXRlZCA9IDE7Ci0tICBkLT5kaXIgPSAoRElSRUNUSVZFICopIG1hbGxvYyAoZF9hbGxvY2F0ZWQgKiBzaXplb2YgKERJUkVDVElWRSkpOwotLSAgaWYgKGQtPmRpciA9PSBOVUxMKQotLSAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KLS0gICAgZ290byBvdXRfb2ZfbWVtb3J5XzE7Ci0tCi0tICBhLT5jb3VudCA9IDA7Ci0tICBhX2FsbG9jYXRlZCA9IDA7Ci0tICBhLT5hcmcgPSBOVUxMOwotLQotLSNkZWZpbmUgUkVHSVNURVJfQVJHKF9pbmRleF8sX3R5cGVfKSBcCi0tICB7CQkJCQkJCQkJXAotLSAgICBzaXplX3QgbiA9IChfaW5kZXhfKTsJCQkJCQlcCi0tICAgIGlmIChuID49IGFfYWxsb2NhdGVkKQkJCQkJCVwKLS0gICAgICB7CQkJCQkJCQkJXAotLQlzaXplX3QgbWVtb3J5X3NpemU7CQkJCQkJXAotLQlhcmd1bWVudCAqbWVtb3J5OwkJCQkJCVwKLS0JCQkJCQkJCQlcCi0tCWFfYWxsb2NhdGVkID0geHRpbWVzIChhX2FsbG9jYXRlZCwgMik7CQkJCVwKLS0JaWYgKGFfYWxsb2NhdGVkIDw9IG4pCQkJCQkJXAotLQkgIGFfYWxsb2NhdGVkID0geHN1bSAobiwgMSk7CQkJCQlcCi0tCW1lbW9yeV9zaXplID0geHRpbWVzIChhX2FsbG9jYXRlZCwgc2l6ZW9mIChhcmd1bWVudCkpOwkJXAotLQlpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCQkJCVwKLS0JICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8JCQlcCi0tCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCVwKLS0JbWVtb3J5ID0gKGFyZ3VtZW50ICopIChhLT5hcmcJCQkJCVwKLS0JCQkgICAgICAgPyByZWFsbG9jIChhLT5hcmcsIG1lbW9yeV9zaXplKQkJXAotLQkJCSAgICAgICA6IG1hbGxvYyAobWVtb3J5X3NpemUpKTsJCQlcCi0tCWlmIChtZW1vcnkgPT0gTlVMTCkJCQkJCQlcCi0tCSAgLyogT3V0IG9mIG1lbW9yeS4gICovCQkJCQkJXAotLQkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQlcCi0tCWEtPmFyZyA9IG1lbW9yeTsJCQkJCQlcCi0tICAgICAgfQkJCQkJCQkJCVwKLS0gICAgd2hpbGUgKGEtPmNvdW50IDw9IG4pCQkJCQkJXAotLSAgICAgIGEtPmFyZ1thLT5jb3VudCsrXS50eXBlID0gVFlQRV9OT05FOwkJCQlcCi0tICAgIGlmIChhLT5hcmdbbl0udHlwZSA9PSBUWVBFX05PTkUpCQkJCQlcCi0tICAgICAgYS0+YXJnW25dLnR5cGUgPSAoX3R5cGVfKTsJCQkJCVwKLS0gICAgZWxzZSBpZiAoYS0+YXJnW25dLnR5cGUgIT0gKF90eXBlXykpCQkJCVwKLS0gICAgICAvKiBBbWJpZ3VvdXMgdHlwZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCQkJXAotLSAgICAgIGdvdG8gZXJyb3I7CQkJCQkJCVwKLS0gIH0KLS0KLS0gIHdoaWxlICgqY3AgIT0gJ1wwJykKLS0gICAgewotLSAgICAgIENIQVJfVCBjID0gKmNwKys7Ci0tICAgICAgaWYgKGMgPT0gJyUnKQotLQl7Ci0tCSAgc2l6ZV90IGFyZ19pbmRleCA9IEFSR19OT05FOwotLQkgIERJUkVDVElWRSAqZHAgPSAmZC0+ZGlyW2QtPmNvdW50XTsgLyogcG9pbnRlciB0byBuZXh0IGRpcmVjdGl2ZSAqLwotLQotLQkgIC8qIEluaXRpYWxpemUgdGhlIG5leHQgZGlyZWN0aXZlLiAgKi8KLS0JICBkcC0+ZGlyX3N0YXJ0ID0gY3AgLSAxOwotLQkgIGRwLT5mbGFncyA9IDA7Ci0tCSAgZHAtPndpZHRoX3N0YXJ0ID0gTlVMTDsKLS0JICBkcC0+d2lkdGhfZW5kID0gTlVMTDsKLS0JICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gQVJHX05PTkU7Ci0tCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IE5VTEw7Ci0tCSAgZHAtPnByZWNpc2lvbl9lbmQgPSBOVUxMOwotLQkgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gQVJHX05PTkU7Ci0tCSAgZHAtPmFyZ19pbmRleCA9IEFSR19OT05FOwotLQotLQkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLwotLQkgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCi0tCSAgICB7Ci0tCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7Ci0tCi0tCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotLQkJOwotLQkgICAgICBpZiAoKm5wID09ICckJykKLS0JCXsKLS0JCSAgc2l6ZV90IG4gPSAwOwotLQotLQkJICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKLS0JCSAgICBuID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7Ci0tCQkgIGlmIChuID09IDApCi0tCQkgICAgLyogUG9zaXRpb25hbCBhcmd1bWVudCAwLiAgKi8KLS0JCSAgICBnb3RvIGVycm9yOwotLQkJICBpZiAoc2l6ZV9vdmVyZmxvd19wIChuKSkKLS0JCSAgICAvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5IGxhdGVyLiAgKi8KLS0JCSAgICBnb3RvIGVycm9yOwotLQkJICBhcmdfaW5kZXggPSBuIC0gMTsKLS0JCSAgY3AgPSBucCArIDE7Ci0tCQl9Ci0tCSAgICB9Ci0tCi0tCSAgLyogUmVhZCB0aGUgZmxhZ3MuICAqLwotLQkgIGZvciAoOzspCi0tCSAgICB7Ci0tCSAgICAgIGlmICgqY3AgPT0gJ1wnJykKLS0JCXsKLS0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfR1JPVVA7Ci0tCQkgIGNwKys7Ci0tCQl9Ci0tCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnLScpCi0tCQl7Ci0tCQkgIGRwLT5mbGFncyB8PSBGTEFHX0xFRlQ7Ci0tCQkgIGNwKys7Ci0tCQl9Ci0tCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnKycpCi0tCQl7Ci0tCQkgIGRwLT5mbGFncyB8PSBGTEFHX1NIT1dTSUdOOwotLQkJICBjcCsrOwotLQkJfQotLQkgICAgICBlbHNlIGlmICgqY3AgPT0gJyAnKQotLQkJewotLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19TUEFDRTsKLS0JCSAgY3ArKzsKLS0JCX0KLS0JICAgICAgZWxzZSBpZiAoKmNwID09ICcjJykKLS0JCXsKLS0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfQUxUOwotLQkJICBjcCsrOwotLQkJfQotLQkgICAgICBlbHNlIGlmICgqY3AgPT0gJzAnKQotLQkJewotLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19aRVJPOwotLQkJICBjcCsrOwotLQkJfQotLQkgICAgICBlbHNlCi0tCQlicmVhazsKLS0JICAgIH0KLS0KLS0JICAvKiBQYXJzZSB0aGUgZmllbGQgd2lkdGguICAqLwotLQkgIGlmICgqY3AgPT0gJyonKQotLQkgICAgewotLQkgICAgICBkcC0+d2lkdGhfc3RhcnQgPSBjcDsKLS0JICAgICAgY3ArKzsKLS0JICAgICAgZHAtPndpZHRoX2VuZCA9IGNwOwotLQkgICAgICBpZiAobWF4X3dpZHRoX2xlbmd0aCA8IDEpCi0tCQltYXhfd2lkdGhfbGVuZ3RoID0gMTsKLS0KLS0JICAgICAgLyogVGVzdCBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCi0tCSAgICAgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCi0tCQl7Ci0tCQkgIGNvbnN0IENIQVJfVCAqbnA7Ci0tCi0tCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotLQkJICAgIDsKLS0JCSAgaWYgKCpucCA9PSAnJCcpCi0tCQkgICAgewotLQkJICAgICAgc2l6ZV90IG4gPSAwOwotLQotLQkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0tCQkJbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOwotLQkJICAgICAgaWYgKG4gPT0gMCkKLS0JCQkvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLwotLQkJCWdvdG8gZXJyb3I7Ci0tCQkgICAgICBpZiAoc2l6ZV9vdmVyZmxvd19wIChuKSkKLS0JCQkvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5IGxhdGVyLiAgKi8KLS0JCQlnb3RvIGVycm9yOwotLQkJICAgICAgZHAtPndpZHRoX2FyZ19pbmRleCA9IG4gLSAxOwotLQkJICAgICAgY3AgPSBucCArIDE7Ci0tCQkgICAgfQotLQkJfQotLQkgICAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKLS0JCXsKLS0JCSAgZHAtPndpZHRoX2FyZ19pbmRleCA9IGFyZ19wb3NuKys7Ci0tCQkgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ID09IEFSR19OT05FKQotLQkJICAgIC8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KLS0JCSAgICBnb3RvIGVycm9yOwotLQkJfQotLQkgICAgICBSRUdJU1RFUl9BUkcgKGRwLT53aWR0aF9hcmdfaW5kZXgsIFRZUEVfSU5UKTsKLS0JICAgIH0KLS0JICBlbHNlIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCi0tCSAgICB7Ci0tCSAgICAgIHNpemVfdCB3aWR0aF9sZW5ndGg7Ci0tCi0tCSAgICAgIGRwLT53aWR0aF9zdGFydCA9IGNwOwotLQkgICAgICBmb3IgKDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzknOyBjcCsrKQotLQkJOwotLQkgICAgICBkcC0+d2lkdGhfZW5kID0gY3A7Ci0tCSAgICAgIHdpZHRoX2xlbmd0aCA9IGRwLT53aWR0aF9lbmQgLSBkcC0+d2lkdGhfc3RhcnQ7Ci0tCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgd2lkdGhfbGVuZ3RoKQotLQkJbWF4X3dpZHRoX2xlbmd0aCA9IHdpZHRoX2xlbmd0aDsKLS0JICAgIH0KLS0KLS0JICAvKiBQYXJzZSB0aGUgcHJlY2lzaW9uLiAgKi8KLS0JICBpZiAoKmNwID09ICcuJykKLS0JICAgIHsKLS0JICAgICAgY3ArKzsKLS0JICAgICAgaWYgKCpjcCA9PSAnKicpCi0tCQl7Ci0tCQkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBjcCAtIDE7Ci0tCQkgIGNwKys7Ci0tCQkgIGRwLT5wcmVjaXNpb25fZW5kID0gY3A7Ci0tCQkgIGlmIChtYXhfcHJlY2lzaW9uX2xlbmd0aCA8IDIpCi0tCQkgICAgbWF4X3ByZWNpc2lvbl9sZW5ndGggPSAyOwotLQotLQkJICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KLS0JCSAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLS0JCSAgICB7Ci0tCQkgICAgICBjb25zdCBDSEFSX1QgKm5wOwotLQotLQkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0tCQkJOwotLQkJICAgICAgaWYgKCpucCA9PSAnJCcpCi0tCQkJewotLQkJCSAgc2l6ZV90IG4gPSAwOwotLQotLQkJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0tCQkJICAgIG4gPSB4c3VtICh4dGltZXMgKG4sIDEwKSwgKm5wIC0gJzAnKTsKLS0JCQkgIGlmIChuID09IDApCi0tCQkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCi0tCQkJICAgIGdvdG8gZXJyb3I7Ci0tCQkJICBpZiAoc2l6ZV9vdmVyZmxvd19wIChuKSkKLS0JCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeQotLQkJCSAgICAgICBsYXRlci4gICovCi0tCQkJICAgIGdvdG8gZXJyb3I7Ci0tCQkJICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IG4gLSAxOwotLQkJCSAgY3AgPSBucCArIDE7Ci0tCQkJfQotLQkJICAgIH0KLS0JCSAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID09IEFSR19OT05FKQotLQkJICAgIHsKLS0JCSAgICAgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKLS0JCSAgICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKLS0JCQkvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCi0tCQkJZ290byBlcnJvcjsKLS0JCSAgICB9Ci0tCQkgIFJFR0lTVEVSX0FSRyAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXgsIFRZUEVfSU5UKTsKLS0JCX0KLS0JICAgICAgZWxzZQotLQkJewotLQkJICBzaXplX3QgcHJlY2lzaW9uX2xlbmd0aDsKLS0KLS0JCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IGNwIC0gMTsKLS0JCSAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKLS0JCSAgICA7Ci0tCQkgIGRwLT5wcmVjaXNpb25fZW5kID0gY3A7Ci0tCQkgIHByZWNpc2lvbl9sZW5ndGggPSBkcC0+cHJlY2lzaW9uX2VuZCAtIGRwLT5wcmVjaXNpb25fc3RhcnQ7Ci0tCQkgIGlmIChtYXhfcHJlY2lzaW9uX2xlbmd0aCA8IHByZWNpc2lvbl9sZW5ndGgpCi0tCQkgICAgbWF4X3ByZWNpc2lvbl9sZW5ndGggPSBwcmVjaXNpb25fbGVuZ3RoOwotLQkJfQotLQkgICAgfQotLQotLQkgIHsKLS0JICAgIGFyZ190eXBlIHR5cGU7Ci0tCi0tCSAgICAvKiBQYXJzZSBhcmd1bWVudCB0eXBlL3NpemUgc3BlY2lmaWVycy4gICovCi0tCSAgICB7Ci0tCSAgICAgIGludCBmbGFncyA9IDA7Ci0tCi0tCSAgICAgIGZvciAoOzspCi0tCQl7Ci0tCQkgIGlmICgqY3AgPT0gJ2gnKQotLQkJICAgIHsKLS0JCSAgICAgIGZsYWdzIHw9ICgxIDw8IChmbGFncyAmIDEpKTsKLS0JCSAgICAgIGNwKys7Ci0tCQkgICAgfQotLQkJICBlbHNlIGlmICgqY3AgPT0gJ0wnKQotLQkJICAgIHsKLS0JCSAgICAgIGZsYWdzIHw9IDQ7Ci0tCQkgICAgICBjcCsrOwotLQkJICAgIH0KLS0JCSAgZWxzZSBpZiAoKmNwID09ICdsJykKLS0JCSAgICB7Ci0tCQkgICAgICBmbGFncyArPSA4OwotLQkJICAgICAgY3ArKzsKLS0JCSAgICB9Ci0tCQkgIGVsc2UgaWYgKCpjcCA9PSAnaicpCi0tCQkgICAgewotLQkJICAgICAgaWYgKHNpemVvZiAoaW50bWF4X3QpID4gc2l6ZW9mIChsb25nKSkKLS0JCQl7Ci0tCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgbG9uZyAqLwotLQkJCSAgZmxhZ3MgKz0gMTY7Ci0tCQkJfQotLQkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGludCkpCi0tCQkJewotLQkJCSAgLyogaW50bWF4X3QgPSBsb25nICovCi0tCQkJICBmbGFncyArPSA4OwotLQkJCX0KLS0JCSAgICAgIGNwKys7Ci0tCQkgICAgfQotLQkJICBlbHNlIGlmICgqY3AgPT0gJ3onIHx8ICpjcCA9PSAnWicpCi0tCQkgICAgewotLQkJICAgICAgLyogJ3onIGlzIHN0YW5kYXJkaXplZCBpbiBJU08gQyA5OSwgYnV0IGdsaWJjIHVzZXMgJ1onCi0tCQkJIGJlY2F1c2UgdGhlIHdhcm5pbmcgZmFjaWxpdHkgaW4gZ2NjLTIuOTUuMiB1bmRlcnN0YW5kcwotLQkJCSBvbmx5ICdaJyAoc2VlIGdjYy0yLjk1LjIvZ2NjL2MtY29tbW9uLmM6MTc4NCkuICAqLwotLQkJICAgICAgaWYgKHNpemVvZiAoc2l6ZV90KSA+IHNpemVvZiAobG9uZykpCi0tCQkJewotLQkJCSAgLyogc2l6ZV90ID0gbG9uZyBsb25nICovCi0tCQkJICBmbGFncyArPSAxNjsKLS0JCQl9Ci0tCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHNpemVfdCkgPiBzaXplb2YgKGludCkpCi0tCQkJewotLQkJCSAgLyogc2l6ZV90ID0gbG9uZyAqLwotLQkJCSAgZmxhZ3MgKz0gODsKLS0JCQl9Ci0tCQkgICAgICBjcCsrOwotLQkJICAgIH0KLS0JCSAgZWxzZSBpZiAoKmNwID09ICd0JykKLS0JCSAgICB7Ci0tCQkgICAgICBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChsb25nKSkKLS0JCQl7Ci0tCQkJICAvKiBwdHJkaWZmX3QgPSBsb25nIGxvbmcgKi8KLS0JCQkgIGZsYWdzICs9IDE2OwotLQkJCX0KLS0JCSAgICAgIGVsc2UgaWYgKHNpemVvZiAocHRyZGlmZl90KSA+IHNpemVvZiAoaW50KSkKLS0JCQl7Ci0tCQkJICAvKiBwdHJkaWZmX3QgPSBsb25nICovCi0tCQkJICBmbGFncyArPSA4OwotLQkJCX0KLS0JCSAgICAgIGNwKys7Ci0tCQkgICAgfQotLQkJICBlbHNlCi0tCQkgICAgYnJlYWs7Ci0tCQl9Ci0tCi0tCSAgICAgIC8qIFJlYWQgdGhlIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KLS0JICAgICAgYyA9ICpjcCsrOwotLQkgICAgICBzd2l0Y2ggKGMpCi0tCQl7Ci0tCQljYXNlICdkJzogY2FzZSAnaSc6Ci0tI2lmIEhBVkVfTE9OR19MT05HX0lOVAotLQkJICAvKiBJZiAnbG9uZyBsb25nJyBleGlzdHMgYW5kIGlzIGxhcmdlciB0aGFuICdsb25nJzogICovCi0tCQkgIGlmIChmbGFncyA+PSAxNiB8fCAoZmxhZ3MgJiA0KSkKLS0JCSAgICB0eXBlID0gVFlQRV9MT05HTE9OR0lOVDsKLS0JCSAgZWxzZQotLSNlbmRpZgotLQkJICAvKiBJZiAnbG9uZyBsb25nJyBleGlzdHMgYW5kIGlzIHRoZSBzYW1lIGFzICdsb25nJywgd2UgcGFyc2UKLS0JCSAgICAgImxsZCIgaW50byBUWVBFX0xPTkdJTlQuICAqLwotLQkJICBpZiAoZmxhZ3MgPj0gOCkKLS0JCSAgICB0eXBlID0gVFlQRV9MT05HSU5UOwotLQkJICBlbHNlIGlmIChmbGFncyAmIDIpCi0tCQkgICAgdHlwZSA9IFRZUEVfU0NIQVI7Ci0tCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKLS0JCSAgICB0eXBlID0gVFlQRV9TSE9SVDsKLS0JCSAgZWxzZQotLQkJICAgIHR5cGUgPSBUWVBFX0lOVDsKLS0JCSAgYnJlYWs7Ci0tCQljYXNlICdvJzogY2FzZSAndSc6IGNhc2UgJ3gnOiBjYXNlICdYJzoKLS0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tCQkgIC8qIElmICdsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgbGFyZ2VyIHRoYW4gJ2xvbmcnOiAgKi8KLS0JCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQotLQkJICAgIHR5cGUgPSBUWVBFX1VMT05HTE9OR0lOVDsKLS0JCSAgZWxzZQotLSNlbmRpZgotLQkJICAvKiBJZiAndW5zaWduZWQgbG9uZyBsb25nJyBleGlzdHMgYW5kIGlzIHRoZSBzYW1lIGFzCi0tCQkgICAgICd1bnNpZ25lZCBsb25nJywgd2UgcGFyc2UgImxsdSIgaW50byBUWVBFX1VMT05HSU5ULiAgKi8KLS0JCSAgaWYgKGZsYWdzID49IDgpCi0tCQkgICAgdHlwZSA9IFRZUEVfVUxPTkdJTlQ7Ci0tCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKLS0JCSAgICB0eXBlID0gVFlQRV9VQ0hBUjsKLS0JCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQotLQkJICAgIHR5cGUgPSBUWVBFX1VTSE9SVDsKLS0JCSAgZWxzZQotLQkJICAgIHR5cGUgPSBUWVBFX1VJTlQ7Ci0tCQkgIGJyZWFrOwotLQkJY2FzZSAnZic6IGNhc2UgJ0YnOiBjYXNlICdlJzogY2FzZSAnRSc6IGNhc2UgJ2cnOiBjYXNlICdHJzoKLS0JCWNhc2UgJ2EnOiBjYXNlICdBJzoKLS0JCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQotLQkJICAgIHR5cGUgPSBUWVBFX0xPTkdET1VCTEU7Ci0tCQkgIGVsc2UKLS0JCSAgICB0eXBlID0gVFlQRV9ET1VCTEU7Ci0tCQkgIGJyZWFrOwotLQkJY2FzZSAnYyc6Ci0tCQkgIGlmIChmbGFncyA+PSA4KQotLSNpZiBIQVZFX1dJTlRfVAotLQkJICAgIHR5cGUgPSBUWVBFX1dJREVfQ0hBUjsKLS0jZWxzZQotLQkJICAgIGdvdG8gZXJyb3I7Ci0tI2VuZGlmCi0tCQkgIGVsc2UKLS0JCSAgICB0eXBlID0gVFlQRV9DSEFSOwotLQkJICBicmVhazsKLS0jaWYgSEFWRV9XSU5UX1QKLS0JCWNhc2UgJ0MnOgotLQkJICB0eXBlID0gVFlQRV9XSURFX0NIQVI7Ci0tCQkgIGMgPSAnYyc7Ci0tCQkgIGJyZWFrOwotLSNlbmRpZgotLQkJY2FzZSAncyc6Ci0tCQkgIGlmIChmbGFncyA+PSA4KQotLSNpZiBIQVZFX1dDSEFSX1QKLS0JCSAgICB0eXBlID0gVFlQRV9XSURFX1NUUklORzsKLS0jZWxzZQotLQkJICAgIGdvdG8gZXJyb3I7Ci0tI2VuZGlmCi0tCQkgIGVsc2UKLS0JCSAgICB0eXBlID0gVFlQRV9TVFJJTkc7Ci0tCQkgIGJyZWFrOwotLSNpZiBIQVZFX1dDSEFSX1QKLS0JCWNhc2UgJ1MnOgotLQkJICB0eXBlID0gVFlQRV9XSURFX1NUUklORzsKLS0JCSAgYyA9ICdzJzsKLS0JCSAgYnJlYWs7Ci0tI2VuZGlmCi0tCQljYXNlICdwJzoKLS0JCSAgdHlwZSA9IFRZUEVfUE9JTlRFUjsKLS0JCSAgYnJlYWs7Ci0tCQljYXNlICduJzoKLS0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tCQkgIC8qIElmICdsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgbGFyZ2VyIHRoYW4gJ2xvbmcnOiAgKi8KLS0JCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQotLQkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI7Ci0tCQkgIGVsc2UKLS0jZW5kaWYKLS0JCSAgLyogSWYgJ2xvbmcgbG9uZycgZXhpc3RzIGFuZCBpcyB0aGUgc2FtZSBhcyAnbG9uZycsIHdlIHBhcnNlCi0tCQkgICAgICJsbG4iIGludG8gVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVIuICAqLwotLQkJICBpZiAoZmxhZ3MgPj0gOCkKLS0JCSAgICB0eXBlID0gVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI7Ci0tCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKLS0JCSAgICB0eXBlID0gVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOwotLQkJICBlbHNlIGlmIChmbGFncyAmIDEpCi0tCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjsKLS0JCSAgZWxzZQotLQkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOwotLQkJICBicmVhazsKLS0jaWYgRU5BQkxFX1VOSVNURElPCi0tCQkvKiBUaGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4gICovCi0tCQljYXNlICdVJzoKLS0JCSAgaWYgKGZsYWdzID49IDE2KQotLQkJICAgIHR5cGUgPSBUWVBFX1UzMl9TVFJJTkc7Ci0tCQkgIGVsc2UgaWYgKGZsYWdzID49IDgpCi0tCQkgICAgdHlwZSA9IFRZUEVfVTE2X1NUUklORzsKLS0JCSAgZWxzZQotLQkJICAgIHR5cGUgPSBUWVBFX1U4X1NUUklORzsKLS0JCSAgYnJlYWs7Ci0tI2VuZGlmCi0tCQljYXNlICclJzoKLS0JCSAgdHlwZSA9IFRZUEVfTk9ORTsKLS0JCSAgYnJlYWs7Ci0tCQlkZWZhdWx0OgotLQkJICAvKiBVbmtub3duIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KLS0JCSAgZ290byBlcnJvcjsKLS0JCX0KLS0JICAgIH0KLS0KLS0JICAgIGlmICh0eXBlICE9IFRZUEVfTk9ORSkKLS0JICAgICAgewotLQkJZHAtPmFyZ19pbmRleCA9IGFyZ19pbmRleDsKLS0JCWlmIChkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKQotLQkJICB7Ci0tCQkgICAgZHAtPmFyZ19pbmRleCA9IGFyZ19wb3NuKys7Ci0tCQkgICAgaWYgKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpCi0tCQkgICAgICAvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCi0tCQkgICAgICBnb3RvIGVycm9yOwotLQkJICB9Ci0tCQlSRUdJU1RFUl9BUkcgKGRwLT5hcmdfaW5kZXgsIHR5cGUpOwotLQkgICAgICB9Ci0tCSAgICBkcC0+Y29udmVyc2lvbiA9IGM7Ci0tCSAgICBkcC0+ZGlyX2VuZCA9IGNwOwotLQkgIH0KLS0KLS0JICBkLT5jb3VudCsrOwotLQkgIGlmIChkLT5jb3VudCA+PSBkX2FsbG9jYXRlZCkKLS0JICAgIHsKLS0JICAgICAgc2l6ZV90IG1lbW9yeV9zaXplOwotLQkgICAgICBESVJFQ1RJVkUgKm1lbW9yeTsKLS0KLS0JICAgICAgZF9hbGxvY2F0ZWQgPSB4dGltZXMgKGRfYWxsb2NhdGVkLCAyKTsKLS0JICAgICAgbWVtb3J5X3NpemUgPSB4dGltZXMgKGRfYWxsb2NhdGVkLCBzaXplb2YgKERJUkVDVElWRSkpOwotLQkgICAgICBpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCi0tCQkvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KLS0JCWdvdG8gb3V0X29mX21lbW9yeTsKLS0JICAgICAgbWVtb3J5ID0gKERJUkVDVElWRSAqKSByZWFsbG9jIChkLT5kaXIsIG1lbW9yeV9zaXplKTsKLS0JICAgICAgaWYgKG1lbW9yeSA9PSBOVUxMKQotLQkJLyogT3V0IG9mIG1lbW9yeS4gICovCi0tCQlnb3RvIG91dF9vZl9tZW1vcnk7Ci0tCSAgICAgIGQtPmRpciA9IG1lbW9yeTsKLS0JICAgIH0KLS0JfQotLSNpZiBDSEFSX1RfT05MWV9BU0NJSQotLSAgICAgIGVsc2UgaWYgKCFjX2lzYXNjaWkgKGMpKQotLQl7Ci0tCSAgLyogTm9uLUFTQ0lJIGNoYXJhY3Rlci4gIE5vdCBzdXBwb3J0ZWQuICAqLwotLQkgIGdvdG8gZXJyb3I7Ci0tCX0KLS0jZW5kaWYKLS0gICAgfQotLSAgZC0+ZGlyW2QtPmNvdW50XS5kaXJfc3RhcnQgPSBjcDsKLS0KLS0gIGQtPm1heF93aWR0aF9sZW5ndGggPSBtYXhfd2lkdGhfbGVuZ3RoOwotLSAgZC0+bWF4X3ByZWNpc2lvbl9sZW5ndGggPSBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKLS0gIHJldHVybiAwOwotLQotLWVycm9yOgotLSAgaWYgKGEtPmFyZykKLS0gICAgZnJlZSAoYS0+YXJnKTsKLS0gIGlmIChkLT5kaXIpCi0tICAgIGZyZWUgKGQtPmRpcik7Ci0tICBlcnJubyA9IEVJTlZBTDsKLS0gIHJldHVybiAtMTsKLS0KLS1vdXRfb2ZfbWVtb3J5OgotLSAgaWYgKGEtPmFyZykKLS0gICAgZnJlZSAoYS0+YXJnKTsKLS0gIGlmIChkLT5kaXIpCi0tICAgIGZyZWUgKGQtPmRpcik7Ci0tb3V0X29mX21lbW9yeV8xOgotLSAgZXJybm8gPSBFTk9NRU07Ci0tICByZXR1cm4gLTE7Ci0tfQotLQotLSN1bmRlZiBQUklOVEZfUEFSU0UKLS0jdW5kZWYgRElSRUNUSVZFUwotLSN1bmRlZiBESVJFQ1RJVkUKLS0jdW5kZWYgQ0hBUl9UX09OTFlfQVNDSUkKLS0jdW5kZWYgQ0hBUl9UCi0tLS0gYS9pbnRsL3ByaW50Zi1wYXJzZS5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw3NSArMCwwIEBACi0tLyogUGFyc2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZuZGVmIF9QUklOVEZfUEFSU0VfSAotLSNkZWZpbmUgX1BSSU5URl9QQVJTRV9ICi0tCi0tI2luY2x1ZGUgInByaW50Zi1hcmdzLmgiCi0tCi0tCi0tLyogRmxhZ3MgKi8KLS0jZGVmaW5lIEZMQUdfR1JPVVAJIDEJLyogJyBmbGFnICovCi0tI2RlZmluZSBGTEFHX0xFRlQJIDIJLyogLSBmbGFnICovCi0tI2RlZmluZSBGTEFHX1NIT1dTSUdOCSA0CS8qICsgZmxhZyAqLwotLSNkZWZpbmUgRkxBR19TUEFDRQkgOAkvKiBzcGFjZSBmbGFnICovCi0tI2RlZmluZSBGTEFHX0FMVAkxNgkvKiAjIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfWkVSTwkzMgotLQotLS8qIGFyZ19pbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnQgaXMgY29uc3VtZWQuICAqLwotLSNkZWZpbmUgQVJHX05PTkUJKH4oc2l6ZV90KTApCi0tCi0tLyogQSBwYXJzZWQgZGlyZWN0aXZlLiAgKi8KLS10eXBlZGVmIHN0cnVjdAotLXsKLS0gIGNvbnN0IGNoYXIqIGRpcl9zdGFydDsKLS0gIGNvbnN0IGNoYXIqIGRpcl9lbmQ7Ci0tICBpbnQgZmxhZ3M7Ci0tICBjb25zdCBjaGFyKiB3aWR0aF9zdGFydDsKLS0gIGNvbnN0IGNoYXIqIHdpZHRoX2VuZDsKLS0gIHNpemVfdCB3aWR0aF9hcmdfaW5kZXg7Ci0tICBjb25zdCBjaGFyKiBwcmVjaXNpb25fc3RhcnQ7Ci0tICBjb25zdCBjaGFyKiBwcmVjaXNpb25fZW5kOwotLSAgc2l6ZV90IHByZWNpc2lvbl9hcmdfaW5kZXg7Ci0tICBjaGFyIGNvbnZlcnNpb247IC8qIGQgaSBvIHUgeCBYIGYgZSBFIGcgRyBjIHMgcCBuIFUgJSBidXQgbm90IEMgUyAqLwotLSAgc2l6ZV90IGFyZ19pbmRleDsKLS19Ci0tY2hhcl9kaXJlY3RpdmU7Ci0tCi0tLyogQSBwYXJzZWQgZm9ybWF0IHN0cmluZy4gICovCi0tdHlwZWRlZiBzdHJ1Y3QKLS17Ci0tICBzaXplX3QgY291bnQ7Ci0tICBjaGFyX2RpcmVjdGl2ZSAqZGlyOwotLSAgc2l6ZV90IG1heF93aWR0aF9sZW5ndGg7Ci0tICBzaXplX3QgbWF4X3ByZWNpc2lvbl9sZW5ndGg7Ci0tfQotLWNoYXJfZGlyZWN0aXZlczsKLS0KLS0KLS0vKiBQYXJzZXMgdGhlIGZvcm1hdCBzdHJpbmcuICBGaWxscyBpbiB0aGUgbnVtYmVyIE4gb2YgZGlyZWN0aXZlcywgYW5kIGZpbGxzCi0tICAgaW4gZGlyZWN0aXZlc1swXSwgLi4uLCBkaXJlY3RpdmVzW04tMV0sIGFuZCBzZXRzIGRpcmVjdGl2ZXNbTl0uZGlyX3N0YXJ0Ci0tICAgdG8gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIEFsc28gZmlsbHMgaW4gdGhlIGFyZ190eXBlIGZpZWxkcyBvZiB0aGUKLS0gICBhcmd1bWVudHMgYW5kIHRoZSBuZWVkZWQgY291bnQgb2YgYXJndW1lbnRzLiAgKi8KLS0jaWZkZWYgU1RBVElDCi0tU1RBVElDCi0tI2Vsc2UKLS1leHRlcm4KLS0jZW5kaWYKLS1pbnQgcHJpbnRmX3BhcnNlIChjb25zdCBjaGFyICpmb3JtYXQsIGNoYXJfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKLS0KLS0jZW5kaWYgLyogX1BSSU5URl9QQVJTRV9IICovCi0tLS0gYS9pbnRsL3ByaW50Zi5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0MjcgKzAsMCBAQAotLS8qIEZvcm1hdHRlZCBvdXRwdXQgdG8gc3RyaW5ncywgdXNpbmcgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zLgotLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNi0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpZmRlZiBfX0dOVUNfXwotLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0tIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotLSNlbHNlCi0tIyBpZmRlZiBfTVNDX1ZFUgotLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotLSMgZWxzZQotLSMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0tIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotLSMgIGVsc2UKLS0jICAgaWZkZWYgX0FJWAotLSAjcHJhZ21hIGFsbG9jYQotLSMgICBlbHNlCi0tIyAgICBpZm5kZWYgYWxsb2NhCi0tY2hhciAqYWxsb2NhICgpOwotLSMgICAgZW5kaWYKLS0jICAgZW5kaWYKLS0jICBlbmRpZgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkaW8uaD4KLS0KLS0jaWYgIUhBVkVfUE9TSVhfUFJJTlRGCi0tCi0tI2luY2x1ZGUgPGVycm5vLmg+Ci0tI2luY2x1ZGUgPGxpbWl0cy5oPgotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tCi0tLyogU29tZSBzeXN0ZW1zLCBsaWtlIE9TRi8xIDQuMCBhbmQgV29lMzIsIGRvbid0IGhhdmUgRU9WRVJGTE9XLiAgKi8KLS0jaWZuZGVmIEVPVkVSRkxPVwotLSMgZGVmaW5lIEVPVkVSRkxPVyBFMkJJRwotLSNlbmRpZgotLQotLS8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKLS0gICB0aGUgZnVuY3Rpb25zIGFyZSBvbmx5IGRlZmluZWQgZm9yIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZQotLSAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCi0tI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCi0tIyBkZWZpbmUgRExMX0VYUE9SVEVEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotLSNlbHNlCi0tIyBkZWZpbmUgRExMX0VYUE9SVEVECi0tI2VuZGlmCi0tCi0tI2RlZmluZSBTVEFUSUMgc3RhdGljCi0tCi0tLyogVGhpcyBuZWVkcyB0byBiZSBjb25zaXN0ZW50IHdpdGggbGliZ251aW50bC5oLmluLiAgKi8KLS0jaWYgZGVmaW5lZCBfX05ldEJTRF9fIHx8IGRlZmluZWQgX19CRU9TX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19NSU5HVzMyX18KLS0vKiBEb24ndCBicmVhayBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLE0sTikpKS4KLS0gICBUaGlzIHJlZGVmaW5pdGlvbiBpcyBvbmx5IHBvc3NpYmxlIGJlY2F1c2UgdGhlIGxpYmMgaW4gTmV0QlNELCBDeWd3aW4sCi0tICAgbWluZ3cgZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIF9fcHJpbnRmX18uICAqLwotLSMgZGVmaW5lIGxpYmludGxfcHJpbnRmIF9fcHJpbnRmX18KLS0jZW5kaWYKLS0KLS0vKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAicHJpbnRmLWFyZ3MuaCIuICAqLwotLSNpbmNsdWRlICJwcmludGYtYXJncy5jIgotLQotLS8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJwcmludGYtcGFyc2UuaCIuICAqLwotLSNpbmNsdWRlICJwcmludGYtcGFyc2UuYyIKLS0KLS0vKiBEZWZpbmUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ2YXNucHJpbnRmLmgiLiAgKi8KLS0jZGVmaW5lIHZhc25wcmludGYgbGliaW50bF92YXNucHJpbnRmCi0tI2luY2x1ZGUgInZhc25wcmludGYuYyIKLS0jaWYgMCAvKiBub3QgbmVlZGVkICovCi0tI2RlZmluZSBhc25wcmludGYgbGliaW50bF9hc25wcmludGYKLS0jaW5jbHVkZSAiYXNucHJpbnRmLmMiCi0tI2VuZGlmCi0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF92ZnByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS17Ci0tICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKLS0gICAgcmV0dXJuIHZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICBzaXplX3QgbGVuZ3RoOwotLSAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gICAgICBpbnQgcmV0dmFsID0gLTE7Ci0tICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQotLQl7Ci0tCSAgc2l6ZV90IHdyaXR0ZW4gPSBmd3JpdGUgKHJlc3VsdCwgMSwgbGVuZ3RoLCBzdHJlYW0pOwotLQkgIGZyZWUgKHJlc3VsdCk7Ci0tCSAgaWYgKHdyaXR0ZW4gPT0gbGVuZ3RoKQotLQkgICAgewotLQkgICAgICBpZiAobGVuZ3RoID4gSU5UX01BWCkKLS0JCWVycm5vID0gRU9WRVJGTE9XOwotLQkgICAgICBlbHNlCi0tCQlyZXR2YWwgPSBsZW5ndGg7Ci0tCSAgICB9Ci0tCX0KLS0gICAgICByZXR1cm4gcmV0dmFsOwotLSAgICB9Ci0tfQotLQotLURMTF9FWFBPUlRFRAotLWludAotLWxpYmludGxfZnByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLS17Ci0tICB2YV9saXN0IGFyZ3M7Ci0tICBpbnQgcmV0dmFsOwotLQotLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0tICByZXR2YWwgPSBsaWJpbnRsX3ZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7Ci0tICB2YV9lbmQgKGFyZ3MpOwotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF92cHJpbnRmIChjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS17Ci0tICByZXR1cm4gbGliaW50bF92ZnByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOwotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3ByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0tewotLSAgdmFfbGlzdCBhcmdzOwotLSAgaW50IHJldHZhbDsKLS0KLS0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotLSAgcmV0dmFsID0gbGliaW50bF92cHJpbnRmIChmb3JtYXQsIGFyZ3MpOwotLSAgdmFfZW5kIChhcmdzKTsKLS0gIHJldHVybiByZXR2YWw7Ci0tfQotLQotLURMTF9FWFBPUlRFRAotLWludAotLWxpYmludGxfdnNwcmludGYgKGNoYXIgKnJlc3VsdGJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0tewotLSAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0tICAgIHJldHVybiB2c3ByaW50ZiAocmVzdWx0YnVmLCBmb3JtYXQsIGFyZ3MpOwotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgc2l6ZV90IGxlbmd0aCA9IChzaXplX3QpIH4wIC8gKDQgKiBzaXplb2YgKGNoYXIpKTsKLS0gICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKLS0JewotLQkgIGZyZWUgKHJlc3VsdCk7Ci0tCSAgcmV0dXJuIC0xOwotLQl9Ci0tICAgICAgaWYgKGxlbmd0aCA+IElOVF9NQVgpCi0tCXsKLS0JICBlcnJubyA9IEVPVkVSRkxPVzsKLS0JICByZXR1cm4gLTE7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXJldHVybiBsZW5ndGg7Ci0tICAgIH0KLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF9zcHJpbnRmIChjaGFyICpyZXN1bHRidWYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLXsKLS0gIHZhX2xpc3QgYXJnczsKLS0gIGludCByZXR2YWw7Ci0tCi0tICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLS0gIHJldHZhbCA9IGxpYmludGxfdnNwcmludGYgKHJlc3VsdGJ1ZiwgZm9ybWF0LCBhcmdzKTsKLS0gIHZhX2VuZCAoYXJncyk7Ci0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0KLS0jaWYgSEFWRV9TTlBSSU5URgotLQotLSMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgotLSAgIC8qIFdpbmRvd3MuICAqLwotLSMgIGRlZmluZSBzeXN0ZW1fdnNucHJpbnRmIF92c25wcmludGYKLS0jIGVsc2UKLS0gICAvKiBVbml4LiAgKi8KLS0jICBkZWZpbmUgc3lzdGVtX3ZzbnByaW50ZiB2c25wcmludGYKLS0jIGVuZGlmCi0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF92c25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0tewotLSAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0tICAgIHJldHVybiBzeXN0ZW1fdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7Ci0tICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0tICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCi0tCXsKLS0JICBpZiAobWF4bGVuZ3RoID4gMCkKLS0JICAgIHsKLS0JICAgICAgc2l6ZV90IHBydW5lZF9sZW5ndGggPQotLQkJKGxlbmd0aCA8IG1heGxlbmd0aCA/IGxlbmd0aCA6IG1heGxlbmd0aCAtIDEpOwotLQkgICAgICBtZW1jcHkgKHJlc3VsdGJ1ZiwgcmVzdWx0LCBwcnVuZWRfbGVuZ3RoKTsKLS0JICAgICAgcmVzdWx0YnVmW3BydW5lZF9sZW5ndGhdID0gJ1wwJzsKLS0JICAgIH0KLS0JICBmcmVlIChyZXN1bHQpOwotLQl9Ci0tICAgICAgaWYgKGxlbmd0aCA+IElOVF9NQVgpCi0tCXsKLS0JICBlcnJubyA9IEVPVkVSRkxPVzsKLS0JICByZXR1cm4gLTE7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXJldHVybiBsZW5ndGg7Ci0tICAgIH0KLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF9zbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLS17Ci0tICB2YV9saXN0IGFyZ3M7Ci0tICBpbnQgcmV0dmFsOwotLQotLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0tICByZXR2YWwgPSBsaWJpbnRsX3ZzbnByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0tICB2YV9lbmQgKGFyZ3MpOwotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tCi0tI2VuZGlmCi0tCi0tI2lmIEhBVkVfQVNQUklOVEYKLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3Zhc3ByaW50ZiAoY2hhciAqKnJlc3VsdHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotLXsKLS0gIHNpemVfdCBsZW5ndGg7Ci0tICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0tICBpZiAocmVzdWx0ID09IE5VTEwpCi0tICAgIHJldHVybiAtMTsKLS0gIGlmIChsZW5ndGggPiBJTlRfTUFYKQotLSAgICB7Ci0tICAgICAgZnJlZSAocmVzdWx0KTsKLS0gICAgICBlcnJubyA9IEVPVkVSRkxPVzsKLS0gICAgICByZXR1cm4gLTE7Ci0tICAgIH0KLS0gICpyZXN1bHRwID0gcmVzdWx0OwotLSAgcmV0dXJuIGxlbmd0aDsKLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF9hc3ByaW50ZiAoY2hhciAqKnJlc3VsdHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLXsKLS0gIHZhX2xpc3QgYXJnczsKLS0gIGludCByZXR2YWw7Ci0tCi0tICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLS0gIHJldHZhbCA9IGxpYmludGxfdmFzcHJpbnRmIChyZXN1bHRwLCBmb3JtYXQsIGFyZ3MpOwotLSAgdmFfZW5kIChhcmdzKTsKLS0gIHJldHVybiByZXR2YWw7Ci0tfQotLQotLSNlbmRpZgotLQotLSNpZiBIQVZFX0ZXUFJJTlRGCi0tCi0tI2luY2x1ZGUgPHdjaGFyLmg+Ci0tCi0tI2RlZmluZSBXSURFX0NIQVJfVkVSU0lPTiAxCi0tCi0tI2luY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKLS0vKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAid3ByaW50Zi1wYXJzZS5oIi4gICovCi0tI2RlZmluZSBDSEFSX1Qgd2NoYXJfdAotLSNkZWZpbmUgRElSRUNUSVZFIHdjaGFyX3RfZGlyZWN0aXZlCi0tI2RlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcwotLSNkZWZpbmUgUFJJTlRGX1BBUlNFIHdwcmludGZfcGFyc2UKLS0jaW5jbHVkZSAicHJpbnRmLXBhcnNlLmMiCi0tCi0tLyogRGVmaW5lIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAidmFzbnByaW50Zi5oIi4gICovCi0tI2RlZmluZSB2YXNud3ByaW50ZiBsaWJpbnRsX3Zhc253cHJpbnRmCi0tI2luY2x1ZGUgInZhc25wcmludGYuYyIKLS0jaWYgMCAvKiBub3QgbmVlZGVkICovCi0tI2RlZmluZSBhc253cHJpbnRmIGxpYmludGxfYXNud3ByaW50ZgotLSNpbmNsdWRlICJhc25wcmludGYuYyIKLS0jZW5kaWYKLS0KLS0jIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCi0tICAgLyogV2luZG93cy4gICovCi0tIyAgZGVmaW5lIHN5c3RlbV92c3dwcmludGYgX3ZzbndwcmludGYKLS0jIGVsc2UKLS0gICAvKiBVbml4LiAgKi8KLS0jICBkZWZpbmUgc3lzdGVtX3Zzd3ByaW50ZiB2c3dwcmludGYKLS0jIGVuZGlmCi0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF92ZndwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0tewotLSAgaWYgKHdjc2NociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0tICAgIHJldHVybiB2ZndwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHNpemVfdCBsZW5ndGg7Ci0tICAgICAgd2NoYXJfdCAqcmVzdWx0ID0gbGliaW50bF92YXNud3ByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gICAgICBpbnQgcmV0dmFsID0gLTE7Ci0tICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQotLQl7Ci0tCSAgc2l6ZV90IGk7Ci0tCSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotLQkgICAgaWYgKGZwdXR3YyAocmVzdWx0W2ldLCBzdHJlYW0pID09IFdFT0YpCi0tCSAgICAgIGJyZWFrOwotLQkgIGZyZWUgKHJlc3VsdCk7Ci0tCSAgaWYgKGkgPT0gbGVuZ3RoKQotLQkgICAgewotLQkgICAgICBpZiAobGVuZ3RoID4gSU5UX01BWCkKLS0JCWVycm5vID0gRU9WRVJGTE9XOwotLQkgICAgICBlbHNlCi0tCQlyZXR2YWwgPSBsZW5ndGg7Ci0tCSAgICB9Ci0tCX0KLS0gICAgICByZXR1cm4gcmV0dmFsOwotLSAgICB9Ci0tfQotLQotLURMTF9FWFBPUlRFRAotLWludAotLWxpYmludGxfZndwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCi0tewotLSAgdmFfbGlzdCBhcmdzOwotLSAgaW50IHJldHZhbDsKLS0KLS0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotLSAgcmV0dmFsID0gbGliaW50bF92ZndwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKLS0gIHZhX2VuZCAoYXJncyk7Ci0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0KLS1ETExfRVhQT1JURUQKLS1pbnQKLS1saWJpbnRsX3Z3cHJpbnRmIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS17Ci0tICByZXR1cm4gbGliaW50bF92ZndwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcmdzKTsKLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF93cHJpbnRmIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKLS17Ci0tICB2YV9saXN0IGFyZ3M7Ci0tICBpbnQgcmV0dmFsOwotLQotLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0tICByZXR2YWwgPSBsaWJpbnRsX3Z3cHJpbnRmIChmb3JtYXQsIGFyZ3MpOwotLSAgdmFfZW5kIChhcmdzKTsKLS0gIHJldHVybiByZXR2YWw7Ci0tfQotLQotLURMTF9FWFBPUlRFRAotLWludAotLWxpYmludGxfdnN3cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotLXsKLS0gIGlmICh3Y3NjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQotLSAgICByZXR1cm4gc3lzdGVtX3Zzd3ByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICBzaXplX3QgbWF4bGVuZ3RoID0gbGVuZ3RoOwotLSAgICAgIHdjaGFyX3QgKnJlc3VsdCA9IGxpYmludGxfdmFzbndwcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLS0gICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKLS0JewotLQkgIGlmIChtYXhsZW5ndGggPiAwKQotLQkgICAgewotLQkgICAgICBzaXplX3QgcHJ1bmVkX2xlbmd0aCA9Ci0tCQkobGVuZ3RoIDwgbWF4bGVuZ3RoID8gbGVuZ3RoIDogbWF4bGVuZ3RoIC0gMSk7Ci0tCSAgICAgIG1lbWNweSAocmVzdWx0YnVmLCByZXN1bHQsIHBydW5lZF9sZW5ndGggKiBzaXplb2YgKHdjaGFyX3QpKTsKLS0JICAgICAgcmVzdWx0YnVmW3BydW5lZF9sZW5ndGhdID0gMDsKLS0JICAgIH0KLS0JICBmcmVlIChyZXN1bHQpOwotLQkgIC8qIFVubGlrZSB2c25wcmludGYsIHdoaWNoIGhhcyB0byByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgdGhhdAotLQkgICAgIHdvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBpZiB0aGUgcmVzdWx0YnVmIGhhZCBiZWVuIHN1ZmZpY2llbnRseQotLQkgICAgIGxhcmdlLCB0aGUgdnN3cHJpbnRmIGZ1bmN0aW9uIGhhcyB0byByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZgotLQkgICAgIHRoZSByZXN1bHRidWYgd2FzIG5vdCBzdWZmaWNpZW50bHkgbGFyZ2UuICAqLwotLQkgIGlmIChsZW5ndGggPj0gbWF4bGVuZ3RoKQotLQkgICAgcmV0dXJuIC0xOwotLQl9Ci0tICAgICAgaWYgKGxlbmd0aCA+IElOVF9NQVgpCi0tCXsKLS0JICBlcnJubyA9IEVPVkVSRkxPVzsKLS0JICByZXR1cm4gLTE7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXJldHVybiBsZW5ndGg7Ci0tICAgIH0KLS19Ci0tCi0tRExMX0VYUE9SVEVECi0taW50Ci0tbGliaW50bF9zd3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKLS17Ci0tICB2YV9saXN0IGFyZ3M7Ci0tICBpbnQgcmV0dmFsOwotLQotLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0tICByZXR2YWwgPSBsaWJpbnRsX3Zzd3ByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0tICB2YV9lbmQgKGFyZ3MpOwotLSAgcmV0dXJuIHJldHZhbDsKLS19Ci0tCi0tI2VuZGlmCi0tCi0tI2VuZGlmCi0tLS0gYS9pbnRsL3JlZi1hZGQuc2luCi0rKysgL2Rldi9udWxsCi1AQCAtMSwzMSArMCwwIEBACi0tIyBBZGQgdGhpcyBwYWNrYWdlIHRvIGEgbGlzdCBvZiByZWZlcmVuY2VzIHN0b3JlZCBpbiBhIHRleHQgZmlsZS4KLS0jCi0tIyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0jCi0tIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0jICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0jCi0tIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSMgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0jCi0tIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tIyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0jICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSMgICBVU0EuCi0tIwotLSMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCi0tIwotLS9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8gewotLSAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLwotLSAgdGEKLS0gIDphCi0tICBzLyBAUEFDS0FHRUAgLyBAUEFDS0FHRUAgLwotLSAgdGIKLS0gIHMvICQvIEBQQUNLQUdFQCAvCi0tICA6YgotLSAgcy9eLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8KLS19Ci0tLS0gYS9pbnRsL3JlZi1kZWwuc2luCi0rKysgL2Rldi9udWxsCi1AQCAtMSwyNiArMCwwIEBACi0tIyBSZW1vdmUgdGhpcyBwYWNrYWdlIGZyb20gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgotLSMKLS0jICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSMKLS0jICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0jICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tIyAgIGFueSBsYXRlciB2ZXJzaW9uLgotLSMKLS0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLSMKLS0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0jICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSMgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tIyAgIFVTQS4KLS0jCi0tIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPi4KLS0jCi0tL14jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogLyB7Ci0tICBzLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8vCi0tICBzLyBAUEFDS0FHRUAgLyAvCi0tICBzL14vIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6LwotLX0KLS0tLSBhL2ludGwvcmVsb2NhdGFibGUuYwotKysrIC9kZXYvbnVsbAotQEAgLTEsNDY4ICswLDAgQEAKLS0vKiBQcm92aWRlIHJlbG9jYXRhYmxlIHBhY2thZ2VzLgotLSAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tCi0tLyogVGVsbCBnbGliYydzIDxzdGRpby5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBnZXRsaW5lKCkuCi0tICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0tICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLS0jIGRlZmluZSBfR05VX1NPVVJDRQkxCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPGNvbmZpZy5oPgotLQotLS8qIFNwZWNpZmljYXRpb24uICAqLwotLSNpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgotLQotLSNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKLS0KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2luY2x1ZGUgPHN0ZGlvLmg+Ci0tI2luY2x1ZGUgPHN0ZGxpYi5oPgotLSNpbmNsdWRlIDxzdHJpbmcuaD4KLS0KLS0jaWZkZWYgTk9fWE1BTExPQwotLSMgZGVmaW5lIHhtYWxsb2MgbWFsbG9jCi0tI2Vsc2UKLS0jIGluY2x1ZGUgInhhbGxvYy5oIgotLSNlbmRpZgotLQotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18KLS0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0tIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0tI2VuZGlmCi0tCi0tI2lmIERFUEVORFNfT05fTElCQ0hBUlNFVAotLSMgaW5jbHVkZSA8bGliY2hhcnNldC5oPgotLSNlbmRpZgotLSNpZiBERVBFTkRTX09OX0xJQklDT05WICYmIEhBVkVfSUNPTlYKLS0jIGluY2x1ZGUgPGljb252Lmg+Ci0tI2VuZGlmCi0tI2lmIERFUEVORFNfT05fTElCSU5UTCAmJiBFTkFCTEVfTkxTCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2VuZGlmCi0tCi0tLyogRmFrZWQgY2hlYXAgJ2Jvb2wnLiAgKi8KLS0jdW5kZWYgYm9vbAotLSN1bmRlZiBmYWxzZQotLSN1bmRlZiB0cnVlCi0tI2RlZmluZSBib29sIGludAotLSNkZWZpbmUgZmFsc2UgMAotLSNkZWZpbmUgdHJ1ZSAxCi0tCi0tLyogUGF0aG5hbWUgc3VwcG9ydC4KLS0gICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLS0gICBJU19QQVRIX1dJVEhfRElSKFApICB0ZXN0cyB3aGV0aGVyIFAgY29udGFpbnMgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KLS0gKi8KLS0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotLSAgLyogV2luMzIsIEN5Z3dpbiwgT1MvMiwgRE9TICovCi0tIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKLS0jIGRlZmluZSBIQVNfREVWSUNFKFApIFwKLS0gICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAotLSAgICAgJiYgKFApWzFdID09ICc6JykKLS0jIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIFwKLS0gICAgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMIHx8IHN0cmNociAoUCwgJ1xcJykgIT0gTlVMTCB8fCBIQVNfREVWSUNFIChQKSkKLS0jIGRlZmluZSBGSUxFX1NZU1RFTV9QUkVGSVhfTEVOKFApIChIQVNfREVWSUNFIChQKSA/IDIgOiAwKQotLSNlbHNlCi0tICAvKiBVbml4ICovCi0tIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJykKLS0jIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKLS0jIGRlZmluZSBGSUxFX1NZU1RFTV9QUkVGSVhfTEVOKFApIDAKLS0jZW5kaWYKLS0KLS0vKiBPcmlnaW5hbCBpbnN0YWxsYXRpb24gcHJlZml4LiAgKi8KLS1zdGF0aWMgY2hhciAqb3JpZ19wcmVmaXg7Ci0tc3RhdGljIHNpemVfdCBvcmlnX3ByZWZpeF9sZW47Ci0tLyogQ3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LiAgKi8KLS1zdGF0aWMgY2hhciAqY3Vycl9wcmVmaXg7Ci0tc3RhdGljIHNpemVfdCBjdXJyX3ByZWZpeF9sZW47Ci0tLyogVGhlc2UgcHJlZml4ZXMgZG8gbm90IGVuZCBpbiBhIHNsYXNoLiAgQW55dGhpbmcgdGhhdCB3aWxsIGJlIGNvbmNhdGVuYXRlZAotLSAgIHRvIHRoZW0gbXVzdCBzdGFydCB3aXRoIGEgc2xhc2guICAqLwotLQotLS8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoaXMgbW9kdWxlLgotLSAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4Ci0tICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKLS0gICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCi0tICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KLS1zdGF0aWMgdm9pZAotLXNldF90aGlzX3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeF9hcmcsCi0tCQkJICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2FyZykKLS17Ci0tICBpZiAob3JpZ19wcmVmaXhfYXJnICE9IE5VTEwgJiYgY3Vycl9wcmVmaXhfYXJnICE9IE5VTEwKLS0gICAgICAvKiBPcHRpbWl6YXRpb246IGlmIG9yaWdfcHJlZml4IGFuZCBjdXJyX3ByZWZpeCBhcmUgZXF1YWwsIHRoZQotLQkgcmVsb2NhdGlvbiBpcyBhIG5vcC4gICovCi0tICAgICAgJiYgc3RyY21wIChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZykgIT0gMCkKLS0gICAgewotLSAgICAgIC8qIER1cGxpY2F0ZSB0aGUgYXJndW1lbnQgc3RyaW5ncy4gICovCi0tICAgICAgY2hhciAqbWVtb3J5OwotLQotLSAgICAgIG9yaWdfcHJlZml4X2xlbiA9IHN0cmxlbiAob3JpZ19wcmVmaXhfYXJnKTsKLS0gICAgICBjdXJyX3ByZWZpeF9sZW4gPSBzdHJsZW4gKGN1cnJfcHJlZml4X2FyZyk7Ci0tICAgICAgbWVtb3J5ID0gKGNoYXIgKikgeG1hbGxvYyAob3JpZ19wcmVmaXhfbGVuICsgMSArIGN1cnJfcHJlZml4X2xlbiArIDEpOwotLSNpZmRlZiBOT19YTUFMTE9DCi0tICAgICAgaWYgKG1lbW9yeSAhPSBOVUxMKQotLSNlbmRpZgotLQl7Ci0tCSAgbWVtY3B5IChtZW1vcnksIG9yaWdfcHJlZml4X2FyZywgb3JpZ19wcmVmaXhfbGVuICsgMSk7Ci0tCSAgb3JpZ19wcmVmaXggPSBtZW1vcnk7Ci0tCSAgbWVtb3J5ICs9IG9yaWdfcHJlZml4X2xlbiArIDE7Ci0tCSAgbWVtY3B5IChtZW1vcnksIGN1cnJfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfbGVuICsgMSk7Ci0tCSAgY3Vycl9wcmVmaXggPSBtZW1vcnk7Ci0tCSAgcmV0dXJuOwotLQl9Ci0tICAgIH0KLS0gIG9yaWdfcHJlZml4ID0gTlVMTDsKLS0gIGN1cnJfcHJlZml4ID0gTlVMTDsKLS0gIC8qIERvbid0IHdvcnJ5IGFib3V0IHdhc3RlZCBtZW1vcnkgaGVyZSAtIHRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBvbmx5Ci0tICAgICBjYWxsZWQgb25jZS4gICovCi0tfQotLQotLS8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgotLSAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4Ci0tICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKLS0gICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCi0tICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KLS12b2lkCi0tc2V0X3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeF9hcmcsIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2FyZykKLS17Ci0tICBzZXRfdGhpc19yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOwotLQotLSAgLyogTm93IG5vdGlmeSBhbGwgZGVwZW5kZW50IGxpYnJhcmllcy4gICovCi0tI2lmIERFUEVORFNfT05fTElCQ0hBUlNFVAotLSAgbGliY2hhcnNldF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKLS0jZW5kaWYKLS0jaWYgREVQRU5EU19PTl9MSUJJQ09OViAmJiBIQVZFX0lDT05WICYmIF9MSUJJQ09OVl9WRVJTSU9OID49IDB4MDEwOQotLSAgbGliaWNvbnZfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7Ci0tI2VuZGlmCi0tI2lmIERFUEVORFNfT05fTElCSU5UTCAmJiBFTkFCTEVfTkxTICYmIGRlZmluZWQgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXgKLS0gIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7Ci0tI2VuZGlmCi0tfQotLQotLSNpZiAhZGVmaW5lZCBJTl9MSUJSQVJZIHx8IChkZWZpbmVkIFBJQyAmJiBkZWZpbmVkIElOU1RBTExESVIpCi0tCi0tLyogQ29udmVuaWVuY2UgZnVuY3Rpb246Ci0tICAgQ29tcHV0ZXMgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCwgYmFzZWQgb24gdGhlIG9yaWdpbmFsCi0tICAgaW5zdGFsbGF0aW9uIHByZWZpeCwgdGhlIG9yaWdpbmFsIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYSBwYXJ0aWN1bGFyCi0tICAgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBhdGhuYW1lIG9mIHRoaXMgZmlsZS4gIFJldHVybnMgTlVMTCB1cG9uIGZhaWx1cmUuICAqLwotLSNpZmRlZiBJTl9MSUJSQVJZCi0tI2RlZmluZSBjb21wdXRlX2N1cnJfcHJlZml4IGxvY2FsX2NvbXB1dGVfY3Vycl9wcmVmaXgKLS1zdGF0aWMKLS0jZW5kaWYKLS1jb25zdCBjaGFyICoKLS1jb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCi0tCQkgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbGRpciwKLS0JCSAgICAgY29uc3QgY2hhciAqY3Vycl9wYXRobmFtZSkKLS17Ci0tICBjb25zdCBjaGFyICpjdXJyX2luc3RhbGxkaXI7Ci0tICBjb25zdCBjaGFyICpyZWxfaW5zdGFsbGRpcjsKLS0KLS0gIGlmIChjdXJyX3BhdGhuYW1lID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLQotLSAgLyogRGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCByZWxhdGl2ZSB0byB0aGUgcHJlZml4LgotLSAgICAgVGhpcyBpcyBzaW1wbHkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnX2luc3RhbGxwcmVmaXggYW5kCi0tICAgICBvcmlnX2luc3RhbGxkaXIuICAqLwotLSAgaWYgKHN0cm5jbXAgKG9yaWdfaW5zdGFsbHByZWZpeCwgb3JpZ19pbnN0YWxsZGlyLCBzdHJsZW4gKG9yaWdfaW5zdGFsbHByZWZpeCkpCi0tICAgICAgIT0gMCkKLS0gICAgLyogU2hvdWxkbid0IGhhcHBlbiAtIG5vdGhpbmcgc2hvdWxkIGJlIGluc3RhbGxlZCBvdXRzaWRlICQocHJlZml4KS4gICovCi0tICAgIHJldHVybiBOVUxMOwotLSAgcmVsX2luc3RhbGxkaXIgPSBvcmlnX2luc3RhbGxkaXIgKyBzdHJsZW4gKG9yaWdfaW5zdGFsbHByZWZpeCk7Ci0tCi0tICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gICovCi0tICB7Ci0tICAgIGNvbnN0IGNoYXIgKnBfYmFzZSA9IGN1cnJfcGF0aG5hbWUgKyBGSUxFX1NZU1RFTV9QUkVGSVhfTEVOIChjdXJyX3BhdGhuYW1lKTsKLS0gICAgY29uc3QgY2hhciAqcCA9IGN1cnJfcGF0aG5hbWUgKyBzdHJsZW4gKGN1cnJfcGF0aG5hbWUpOwotLSAgICBjaGFyICpxOwotLQotLSAgICB3aGlsZSAocCA+IHBfYmFzZSkKLS0gICAgICB7Ci0tCXAtLTsKLS0JaWYgKElTU0xBU0ggKCpwKSkKLS0JICBicmVhazsKLS0gICAgICB9Ci0tCi0tICAgIHEgPSAoY2hhciAqKSB4bWFsbG9jIChwIC0gY3Vycl9wYXRobmFtZSArIDEpOwotLSNpZmRlZiBOT19YTUFMTE9DCi0tICAgIGlmIChxID09IE5VTEwpCi0tICAgICAgcmV0dXJuIE5VTEw7Ci0tI2VuZGlmCi0tICAgIG1lbWNweSAocSwgY3Vycl9wYXRobmFtZSwgcCAtIGN1cnJfcGF0aG5hbWUpOwotLSAgICBxW3AgLSBjdXJyX3BhdGhuYW1lXSA9ICdcMCc7Ci0tICAgIGN1cnJfaW5zdGFsbGRpciA9IHE7Ci0tICB9Ci0tCi0tICAvKiBDb21wdXRlIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggYnkgcmVtb3ZpbmcgdGhlIHRyYWlsaW5nCi0tICAgICByZWxfaW5zdGFsbGRpciBmcm9tIGl0LiAgKi8KLS0gIHsKLS0gICAgY29uc3QgY2hhciAqcnAgPSByZWxfaW5zdGFsbGRpciArIHN0cmxlbiAocmVsX2luc3RhbGxkaXIpOwotLSAgICBjb25zdCBjaGFyICpjcCA9IGN1cnJfaW5zdGFsbGRpciArIHN0cmxlbiAoY3Vycl9pbnN0YWxsZGlyKTsKLS0gICAgY29uc3QgY2hhciAqY3BfYmFzZSA9Ci0tICAgICAgY3Vycl9pbnN0YWxsZGlyICsgRklMRV9TWVNURU1fUFJFRklYX0xFTiAoY3Vycl9pbnN0YWxsZGlyKTsKLS0KLS0gICAgd2hpbGUgKHJwID4gcmVsX2luc3RhbGxkaXIgJiYgY3AgPiBjcF9iYXNlKQotLSAgICAgIHsKLS0JYm9vbCBzYW1lID0gZmFsc2U7Ci0tCWNvbnN0IGNoYXIgKnJwaSA9IHJwOwotLQljb25zdCBjaGFyICpjcGkgPSBjcDsKLS0KLS0Jd2hpbGUgKHJwaSA+IHJlbF9pbnN0YWxsZGlyICYmIGNwaSA+IGNwX2Jhc2UpCi0tCSAgewotLQkgICAgcnBpLS07Ci0tCSAgICBjcGktLTsKLS0JICAgIGlmIChJU1NMQVNIICgqcnBpKSB8fCBJU1NMQVNIICgqY3BpKSkKLS0JICAgICAgewotLQkJaWYgKElTU0xBU0ggKCpycGkpICYmIElTU0xBU0ggKCpjcGkpKQotLQkJICBzYW1lID0gdHJ1ZTsKLS0JCWJyZWFrOwotLQkgICAgICB9Ci0tCSAgICAvKiBEbyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24gaWYgdGhlIGZpbGVzeXN0ZW0gaXMgYWx3YXlzIG9yCi0tCSAgICAgICBvZnRlbiBjYXNlLWluc2Vuc2l0aXZlLiAgSXQncyBiZXR0ZXIgdG8gYWNjZXB0IHRoZSBjb21wYXJpc29uCi0tCSAgICAgICBpZiB0aGUgZGlmZmVyZW5jZSBpcyBvbmx5IGluIGNhc2UsIHJhdGhlciB0aGFuIHRvIGZhaWwuICAqLwotLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0tCSAgICAvKiBXaW4zMiwgQ3lnd2luLCBPUy8yLCBET1MgLSBjYXNlIGluc2lnbmlmaWNhbnQgZmlsZXN5c3RlbSAqLwotLQkgICAgaWYgKCgqcnBpID49ICdhJyAmJiAqcnBpIDw9ICd6JyA/ICpycGkgLSAnYScgKyAnQScgOiAqcnBpKQotLQkJIT0gKCpjcGkgPj0gJ2EnICYmICpjcGkgPD0gJ3onID8gKmNwaSAtICdhJyArICdBJyA6ICpjcGkpKQotLQkgICAgICBicmVhazsKLS0jZWxzZQotLQkgICAgaWYgKCpycGkgIT0gKmNwaSkKLS0JICAgICAgYnJlYWs7Ci0tI2VuZGlmCi0tCSAgfQotLQlpZiAoIXNhbWUpCi0tCSAgYnJlYWs7Ci0tCS8qIFRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudCB3YXMgdGhlIHNhbWUuICBvcGkgYW5kIGNwaSBub3cgcG9pbnQKLS0JICAgdG8gdGhlIHNsYXNoIGJlZm9yZSBpdC4gICovCi0tCXJwID0gcnBpOwotLQljcCA9IGNwaTsKLS0gICAgICB9Ci0tCi0tICAgIGlmIChycCA+IHJlbF9pbnN0YWxsZGlyKQotLSAgICAgIC8qIFVuZXhwZWN0ZWQ6IFRoZSBjdXJyX2luc3RhbGxkaXIgZG9lcyBub3QgZW5kIHdpdGggcmVsX2luc3RhbGxkaXIuICAqLwotLSAgICAgIHJldHVybiBOVUxMOwotLQotLSAgICB7Ci0tICAgICAgc2l6ZV90IGN1cnJfcHJlZml4X2xlbiA9IGNwIC0gY3Vycl9pbnN0YWxsZGlyOwotLSAgICAgIGNoYXIgKmN1cnJfcHJlZml4OwotLQotLSAgICAgIGN1cnJfcHJlZml4ID0gKGNoYXIgKikgeG1hbGxvYyAoY3Vycl9wcmVmaXhfbGVuICsgMSk7Ci0tI2lmZGVmIE5PX1hNQUxMT0MKLS0gICAgICBpZiAoY3Vycl9wcmVmaXggPT0gTlVMTCkKLS0JcmV0dXJuIE5VTEw7Ci0tI2VuZGlmCi0tICAgICAgbWVtY3B5IChjdXJyX3ByZWZpeCwgY3Vycl9pbnN0YWxsZGlyLCBjdXJyX3ByZWZpeF9sZW4pOwotLSAgICAgIGN1cnJfcHJlZml4W2N1cnJfcHJlZml4X2xlbl0gPSAnXDAnOwotLQotLSAgICAgIHJldHVybiBjdXJyX3ByZWZpeDsKLS0gICAgfQotLSAgfQotLX0KLS0KLS0jZW5kaWYgLyogIUlOX0xJQlJBUlkgfHwgUElDICovCi0tCi0tI2lmIGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUgotLQotLS8qIEZ1bGwgcGF0aG5hbWUgb2Ygc2hhcmVkIGxpYnJhcnksIG9yIE5VTEwuICAqLwotLXN0YXRpYyBjaGFyICpzaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKLS0KLS0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fCi0tCi0tLyogRGV0ZXJtaW5lIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB3aGVuIGl0IGlzIGxvYWRlZC4gICovCi0tCi0tQk9PTCBXSU5BUEkKLS1EbGxNYWluIChISU5TVEFOQ0UgbW9kdWxlX2hhbmRsZSwgRFdPUkQgZXZlbnQsIExQVk9JRCByZXNlcnZlZCkKLS17Ci0tICAodm9pZCkgcmVzZXJ2ZWQ7Ci0tCi0tICBpZiAoZXZlbnQgPT0gRExMX1BST0NFU1NfQVRUQUNIKQotLSAgICB7Ci0tICAgICAgLyogVGhlIERMTCBpcyBiZWluZyBsb2FkZWQgaW50byBhbiBhcHBsaWNhdGlvbidzIGFkZHJlc3MgcmFuZ2UuICAqLwotLSAgICAgIHN0YXRpYyBjaGFyIGxvY2F0aW9uW01BWF9QQVRIXTsKLS0KLS0gICAgICBpZiAoIUdldE1vZHVsZUZpbGVOYW1lIChtb2R1bGVfaGFuZGxlLCBsb2NhdGlvbiwgc2l6ZW9mIChsb2NhdGlvbikpKQotLQkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KLS0JcmV0dXJuIEZBTFNFOwotLQotLSAgICAgIGlmICghSVNfUEFUSF9XSVRIX0RJUiAobG9jYXRpb24pKQotLQkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KLS0JcmV0dXJuIEZBTFNFOwotLQotLSAgICAgIHsKLS0jaWYgZGVmaW5lZCBfX0NZR1dJTl9fCi0tCS8qIE9uIEN5Z3dpbiwgd2UgbmVlZCB0byBjb252ZXJ0IHBhdGhzIGNvbWluZyBmcm9tIFdpbjMyIHN5c3RlbSBjYWxscwotLQkgICB0byB0aGUgVW5peC1saWtlIHNsYXNoaWZpZWQgbm90YXRpb24uICAqLwotLQlzdGF0aWMgY2hhciBsb2NhdGlvbl9hc19wb3NpeF9wYXRoWzIgKiBNQVhfUEFUSF07Ci0tCS8qIFRoZXJlJ3Mgbm8gZXJyb3IgcmV0dXJuIGRlZmluZWQgZm9yIGN5Z3dpbl9jb252X3RvX3Bvc2l4X3BhdGguCi0tCSAgIFNlZSBjeWd3aW4tYXBpL2Z1bmMtY3lnd2luLWNvbnYtdG8tcG9zaXgtcGF0aC5odG1sLgotLQkgICBEb2VzIGl0IG92ZXJmbG93IHRoZSBidWZmZXIgb2YgZXhwZWN0ZWQgc2l6ZSBNQVhfUEFUSCBvciBkb2VzIGl0Ci0tCSAgIHRydW5jYXRlIHRoZSBwYXRoPyAgSSBkb24ndCBrbm93LiAgTGV0J3MgY2F0Y2ggYm90aC4gICovCi0tCWN5Z3dpbl9jb252X3RvX3Bvc2l4X3BhdGggKGxvY2F0aW9uLCBsb2NhdGlvbl9hc19wb3NpeF9wYXRoKTsKLS0JbG9jYXRpb25fYXNfcG9zaXhfcGF0aFtNQVhfUEFUSCAtIDFdID0gJ1wwJzsKLS0JaWYgKHN0cmxlbiAobG9jYXRpb25fYXNfcG9zaXhfcGF0aCkgPj0gTUFYX1BBVEggLSAxKQotLQkgIC8qIEEgc2lnbiBvZiBidWZmZXIgb3ZlcmZsb3cgb3IgcGF0aCB0cnVuY2F0aW9uLiAgKi8KLS0JICByZXR1cm4gRkFMU0U7Ci0tCXNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gc3RyZHVwIChsb2NhdGlvbl9hc19wb3NpeF9wYXRoKTsKLS0jZWxzZQotLQlzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHN0cmR1cCAobG9jYXRpb24pOwotLSNlbmRpZgotLSAgICAgIH0KLS0gICAgfQotLQotLSAgcmV0dXJuIFRSVUU7Ci0tfQotLQotLSNlbHNlIC8qIFVuaXggZXhjZXB0IEN5Z3dpbiAqLwotLQotLXN0YXRpYyB2b2lkCi0tZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKQotLXsKLS0jaWYgZGVmaW5lZCBfX2xpbnV4X18gJiYgX19HTElCQ19fID49IDIKLS0gIC8qIExpbnV4IGhhcyAvcHJvYy9zZWxmL21hcHMuIGdsaWJjIDIgaGFzIHRoZSBnZXRsaW5lKCkgZnVuY3Rpb24uICAqLwotLSAgRklMRSAqZnA7Ci0tCi0tICAvKiBPcGVuIHRoZSBjdXJyZW50IHByb2Nlc3MnIG1hcHMgZmlsZS4gIEl0IGRlc2NyaWJlcyBvbmUgVk1BIHBlciBsaW5lLiAgKi8KLS0gIGZwID0gZm9wZW4gKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOwotLSAgaWYgKGZwKQotLSAgICB7Ci0tICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpICZmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOwotLSAgICAgIGZvciAoOzspCi0tCXsKLS0JICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0tCSAgaW50IGM7Ci0tCi0tCSAgaWYgKGZzY2FuZiAoZnAsICIlbHgtJWx4IiwgJnN0YXJ0LCAmZW5kKSAhPSAyKQotLQkgICAgYnJlYWs7Ci0tCSAgaWYgKGFkZHJlc3MgPj0gc3RhcnQgJiYgYWRkcmVzcyA8PSBlbmQgLSAxKQotLQkgICAgewotLQkgICAgICAvKiBGb3VuZCBpdC4gIE5vdyBzZWUgaWYgdGhpcyBsaW5lIGNvbnRhaW5zIGEgZmlsZW5hbWUuICAqLwotLQkgICAgICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmIGMgIT0gJy8nKQotLQkJY29udGludWU7Ci0tCSAgICAgIGlmIChjID09ICcvJykKLS0JCXsKLS0JCSAgc2l6ZV90IHNpemU7Ci0tCQkgIGludCBsZW47Ci0tCi0tCQkgIHVuZ2V0YyAoYywgZnApOwotLQkJICBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IE5VTEw7IHNpemUgPSAwOwotLQkJICBsZW4gPSBnZXRsaW5lICgmc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUsICZzaXplLCBmcCk7Ci0tCQkgIGlmIChsZW4gPj0gMCkKLS0JCSAgICB7Ci0tCQkgICAgICAvKiBTdWNjZXNzOiBmaWxsZWQgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUuICAqLwotLQkJICAgICAgaWYgKGxlbiA+IDAgJiYgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWVbbGVuIC0gMV0gPT0gJ1xuJykKLS0JCQlzaGFyZWRfbGlicmFyeV9mdWxsbmFtZVtsZW4gLSAxXSA9ICdcMCc7Ci0tCQkgICAgfQotLQkJfQotLQkgICAgICBicmVhazsKLS0JICAgIH0KLS0JICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQotLQkgICAgY29udGludWU7Ci0tCX0KLS0gICAgICBmY2xvc2UgKGZwKTsKLS0gICAgfQotLSNlbmRpZgotLX0KLS0KLS0jZW5kaWYgLyogKFdJTjMyIG9yIEN5Z3dpbikgLyAoVW5peCBleGNlcHQgQ3lnd2luKSAqLwotLQotLS8qIFJldHVybiB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgY3VycmVudCBzaGFyZWQgbGlicmFyeS4KLS0gICBSZXR1cm4gTlVMTCBpZiB1bmtub3duLgotLSAgIEd1YXJhbnRlZWQgdG8gd29yayBvbmx5IG9uIExpbnV4LCBDeWd3aW4gYW5kIFdvZTMyLiAgKi8KLS1zdGF0aWMgY2hhciAqCi0tZ2V0X3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpCi0tewotLSNpZiAhKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19DWUdXSU5fXykKLS0gIHN0YXRpYyBib29sIHRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Ci0tICBpZiAoIXRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUpCi0tICAgIHsKLS0gICAgICBmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpOwotLSAgICAgIHRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSB0cnVlOwotLSAgICB9Ci0tI2VuZGlmCi0tICByZXR1cm4gc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Ci0tfQotLQotLSNlbmRpZiAvKiBQSUMgKi8KLS0KLS0vKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KLS0gICBkaXJlY3RvcnkuICAqLwotLWNvbnN0IGNoYXIgKgotLXJlbG9jYXRlIChjb25zdCBjaGFyICpwYXRobmFtZSkKLS17Ci0tI2lmIGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUgotLSAgc3RhdGljIGludCBpbml0aWFsaXplZDsKLS0KLS0gIC8qIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotLSAgaWYgKCFpbml0aWFsaXplZCkKLS0gICAgewotLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9yaWdfcHJlZml4IGFuZCBjdXJyX3ByZWZpeCBsaWtlbHkgaGF2ZSBhbHJlYWR5IGJlZW4KLS0JIHNldCB0aHJvdWdoIHRoZSBtYWluIHByb2dyYW0ncyBzZXRfcHJvZ3JhbV9uYW1lX2FuZF9pbnN0YWxsZGlyCi0tCSBmdW5jdGlvbi4gIFRoaXMgaXMgc3VmZmljaWVudCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBsaWJyYXJ5IGhhcwotLQkgaW5pdGlhbGx5IGJlZW4gaW5zdGFsbGVkIGluIHRoZSBzYW1lIG9yaWdfcHJlZml4LiAgQnV0IHdlIGNhbiBkbwotLQkgYmV0dGVyLCB0byBhbHNvIGNvdmVyIHRoZSBjYXNlcyB0aGF0IDEuIGl0IGhhcyBiZWVuIGluc3RhbGxlZAotLQkgaW4gYSBkaWZmZXJlbnQgcHJlZml4IGJlZm9yZSBiZWluZyBtb3ZlZCB0byBvcmlnX3ByZWZpeCBhbmQgKGxhdGVyKQotLQkgdG8gY3Vycl9wcmVmaXgsIDIuIHVubGlrZSB0aGUgcHJvZ3JhbSwgaXQgaGFzIG5vdCBtb3ZlZCBhd2F5IGZyb20KLS0JIG9yaWdfcHJlZml4LiAgKi8KLS0gICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXggPSBJTlNUQUxMUFJFRklYOwotLSAgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbGRpciA9IElOU1RBTExESVI7Ci0tICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYmV0dGVyOwotLQotLSAgICAgIGN1cnJfcHJlZml4X2JldHRlciA9Ci0tCWNvbXB1dGVfY3Vycl9wcmVmaXggKG9yaWdfaW5zdGFsbHByZWZpeCwgb3JpZ19pbnN0YWxsZGlyLAotLQkJCSAgICAgZ2V0X3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpKTsKLS0gICAgICBpZiAoY3Vycl9wcmVmaXhfYmV0dGVyID09IE5VTEwpCi0tCWN1cnJfcHJlZml4X2JldHRlciA9IGN1cnJfcHJlZml4OwotLQotLSAgICAgIHNldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19pbnN0YWxscHJlZml4LCBjdXJyX3ByZWZpeF9iZXR0ZXIpOwotLQotLSAgICAgIGluaXRpYWxpemVkID0gMTsKLS0gICAgfQotLSNlbmRpZgotLQotLSAgLyogTm90ZTogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBwZXJmb3JtIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBoZXJlLAotLSAgICAgZXZlbiBmb3IgRE9TLWxpa2UgZmlsZXN5c3RlbXMsIGJlY2F1c2UgdGhlIHBhdGhuYW1lIGFyZ3VtZW50IHdhcwotLSAgICAgdHlwaWNhbGx5IGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBNYWtlZmlsZSB2YXJpYWJsZSBhcyBvcmlnX3ByZWZpeCBjYW1lCi0tICAgICBmcm9tLiAgKi8KLS0gIGlmIChvcmlnX3ByZWZpeCAhPSBOVUxMICYmIGN1cnJfcHJlZml4ICE9IE5VTEwKLS0gICAgICAmJiBzdHJuY21wIChwYXRobmFtZSwgb3JpZ19wcmVmaXgsIG9yaWdfcHJlZml4X2xlbikgPT0gMCkKLS0gICAgewotLSAgICAgIGlmIChwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dID09ICdcMCcpCi0tCS8qIHBhdGhuYW1lIGVxdWFscyBvcmlnX3ByZWZpeC4gICovCi0tCXJldHVybiBjdXJyX3ByZWZpeDsKLS0gICAgICBpZiAoSVNTTEFTSCAocGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXSkpCi0tCXsKLS0JICAvKiBwYXRobmFtZSBzdGFydHMgd2l0aCBvcmlnX3ByZWZpeC4gICovCi0tCSAgY29uc3QgY2hhciAqcGF0aG5hbWVfdGFpbCA9ICZwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dOwotLQkgIGNoYXIgKnJlc3VsdCA9Ci0tCSAgICAoY2hhciAqKSB4bWFsbG9jIChjdXJyX3ByZWZpeF9sZW4gKyBzdHJsZW4gKHBhdGhuYW1lX3RhaWwpICsgMSk7Ci0tCi0tI2lmZGVmIE5PX1hNQUxMT0MKLS0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0tI2VuZGlmCi0tCSAgICB7Ci0tCSAgICAgIG1lbWNweSAocmVzdWx0LCBjdXJyX3ByZWZpeCwgY3Vycl9wcmVmaXhfbGVuKTsKLS0JICAgICAgc3RyY3B5IChyZXN1bHQgKyBjdXJyX3ByZWZpeF9sZW4sIHBhdGhuYW1lX3RhaWwpOwotLQkgICAgICByZXR1cm4gcmVzdWx0OwotLQkgICAgfQotLQl9Ci0tICAgIH0KLS0gIC8qIE5vdGhpbmcgdG8gcmVsb2NhdGUuICAqLwotLSAgcmV0dXJuIHBhdGhuYW1lOwotLX0KLS0KLS0jZW5kaWYKLS0tLSBhL2ludGwvcmVsb2NhdGFibGUuaAotKysrIC9kZXYvbnVsbAotQEAgLTEsNzkgKzAsMCBAQAotLS8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCi0tICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLSAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfUkVMT0NBVEFCTEVfSAotLSNkZWZpbmUgX1JFTE9DQVRBQkxFX0gKLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jZW5kaWYKLS0KLS0KLS0vKiBUaGlzIGNhbiBiZSBlbmFibGVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZSAtLWVuYWJsZS1yZWxvY2F0YWJsZSBvcHRpb24uICAqLwotLSNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKLS0KLS0vKiBXaGVuIGJ1aWxkaW5nIGEgRExMLCB3ZSBtdXN0IGV4cG9ydCBzb21lIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBiZWNhdXNlCi0tICAgdGhpcyBpcyBhIHByaXZhdGUgLmggZmlsZSwgd2UgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0tICAgaW4gYW55IGNhc2UuICAqLwotLSNpZiBIQVZFX1ZJU0lCSUxJVFkgJiYgQlVJTERJTkdfRExMCi0tIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVEIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQotLSNlbGlmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCi0tIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotLSNlbHNlCi0tIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVECi0tI2VuZGlmCi0tCi0tLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCi0tICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKLS0gICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAotLSAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKLS0gICBpbnN0ZWFkIG9mICIvIikuICAqLwotLWV4dGVybiBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgdm9pZAotLSAgICAgICBzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAotLQkJCSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4KTsKLS0KLS0vKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KLS0gICBkaXJlY3RvcnkuICAqLwotLWV4dGVybiBjb25zdCBjaGFyICogcmVsb2NhdGUgKGNvbnN0IGNoYXIgKnBhdGhuYW1lKTsKLS0KLS0vKiBNZW1vcnkgbWFuYWdlbWVudDogcmVsb2NhdGUoKSBsZWFrcyBtZW1vcnksIGJlY2F1c2UgaXQgaGFzIHRvIGNvbnN0cnVjdAotLSAgIGEgZnJlc2ggcGF0aG5hbWUuICBJZiB0aGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlIHlvdXIgcHJvZ3JhbSBjYWxscwotLSAgIHJlbG9jYXRlKCkgZnJlcXVlbnRseSwgdGhpbmsgYWJvdXQgY2FjaGluZyB0aGUgcmVzdWx0LiAgKi8KLS0KLS0vKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKLS0gICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKLS0gICBpbnN0YWxsYXRpb24gcHJlZml4LCB0aGUgb3JpZ2luYWwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBhIHBhcnRpY3VsYXIKLS0gICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCi0tZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCi0tCQkJCQkgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAotLQkJCQkJIGNvbnN0IGNoYXIgKmN1cnJfcGF0aG5hbWUpOwotLQotLSNlbHNlCi0tCi0tLyogQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBoYXJkd2lyZWQgcGF0aG5hbWVzLiAgKi8KLS0jZGVmaW5lIHJlbG9jYXRlKHBhdGhuYW1lKSAocGF0aG5hbWUpCi0tCi0tI2VuZGlmCi0tCi0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tfQotLSNlbmRpZgotLQotLSNlbmRpZiAvKiBfUkVMT0NBVEFCTEVfSCAqLwotLS0tIGEvaW50bC90ZXh0ZG9tYWluLmMKLSsrKyAvZGV2L251bGwKLUBAIC0xLDEyNyArMCwwIEBACi0tLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24uCi0tICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0tCi0tI2luY2x1ZGUgImdldHRleHRQLmgiCi0tI2lmZGVmIF9MSUJDCi0tIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0tI2Vsc2UKLS0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLS0jZW5kaWYKLS0KLS0vKiBIYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLS0jaWZkZWYgX0xJQkMKLS0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0tIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZQotLSMgZGVmaW5lIGdsX3J3bG9ja193cmxvY2sgX19saWJjX3J3bG9ja193cmxvY2sKLS0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrIF9fbGliY19yd2xvY2tfdW5sb2NrCi0tI2Vsc2UKLS0jIGluY2x1ZGUgImxvY2suaCIKLS0jZW5kaWYKLS0KLS0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0tCi0tCi0tLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLS0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLS0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotLSNpZmRlZiBfTElCQwotLSMgZGVmaW5lIFRFWFRET01BSU4gX190ZXh0ZG9tYWluCi0tIyBpZm5kZWYgc3RyZHVwCi0tIyAgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0tIyBlbmRpZgotLSNlbHNlCi0tIyBkZWZpbmUgVEVYVERPTUFJTiBsaWJpbnRsX3RleHRkb21haW4KLS0jZW5kaWYKLS0KLS0vKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KLS1nbF9yd2xvY2tfZGVmaW5lIChleHRlcm4sIF9ubF9zdGF0ZV9sb2NrIGF0dHJpYnV0ZV9oaWRkZW4pCi0tCi0tLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0tICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLS0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLS1jaGFyICoKLS1URVhURE9NQUlOIChjb25zdCBjaGFyICpkb21haW5uYW1lKQotLXsKLS0gIGNoYXIgKm5ld19kb21haW47Ci0tICBjaGFyICpvbGRfZG9tYWluOwotLQotLSAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCi0tICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotLSAgICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0tCi0tICBnbF9yd2xvY2tfd3Jsb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0tCi0tICBvbGRfZG9tYWluID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0tCi0tICAvKiBJZiBkb21haW4gbmFtZSBpcyB0aGUgbnVsbCBzdHJpbmcgc2V0IHRvIGRlZmF1bHQgZG9tYWluICJtZXNzYWdlcyIuICAqLwotLSAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJwotLSAgICAgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pID09IDApCi0tICAgIHsKLS0gICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotLSAgICAgIG5ld19kb21haW4gPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLS0gICAgfQotLSAgZWxzZSBpZiAoc3RyY21wIChkb21haW5uYW1lLCBvbGRfZG9tYWluKSA9PSAwKQotLSAgICAvKiBUaGlzIGNhbiBoYXBwZW4gYW5kIHBlb3BsZSB3aWxsIHVzZSBpdCB0byBzaWduYWwgdGhhdCBzb21lCi0tICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGNoYW5nZWQuICAqLwotLSAgICBuZXdfZG9tYWluID0gb2xkX2RvbWFpbjsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgbWFsbG9jIGZhaWxzIGBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbicKLS0JIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQotLQkgYXJlIG91dCBvZiBjb3JlLiAgKi8KLS0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0tICAgICAgbmV3X2RvbWFpbiA9IHN0cmR1cCAoZG9tYWlubmFtZSk7Ci0tI2Vsc2UKLS0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0tICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLS0gICAgICBpZiAobmV3X2RvbWFpbiAhPSBOVUxMKQotLQltZW1jcHkgKG5ld19kb21haW4sIGRvbWFpbm5hbWUsIGxlbik7Ci0tI2VuZGlmCi0tCi0tICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKLS0JX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBuZXdfZG9tYWluOwotLSAgICB9Ci0tCi0tICAvKiBXZSB1c2UgdGhpcyBwb3NzaWJpbGl0eSB0byBzaWduYWwgYSBjaGFuZ2Ugb2YgdGhlIGxvYWRlZCBjYXRhbG9ncwotLSAgICAgc2luY2UgdGhpcyBpcyBtb3N0IGxpa2VseSB0aGUgY2FzZSBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgZWFzeSB3ZQotLSAgICAgdG8gZG8gaXQuICBEbyBpdCBvbmx5IHdoZW4gdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLwotLSAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKLS0gICAgewotLSAgICAgICsrX25sX21zZ19jYXRfY250cjsKLS0KLS0gICAgICBpZiAob2xkX2RvbWFpbiAhPSBuZXdfZG9tYWluICYmIG9sZF9kb21haW4gIT0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pCi0tCWZyZWUgKG9sZF9kb21haW4pOwotLSAgICB9Ci0tCi0tICBnbF9yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0tCi0tICByZXR1cm4gbmV3X2RvbWFpbjsKLS19Ci0tCi0tI2lmZGVmIF9MSUJDCi0tLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi0td2Vha19hbGlhcyAoX190ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluKTsKLS0jZW5kaWYKLS0tLSBhL2ludGwvdHNlYXJjaC5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw2ODQgKzAsMCBAQAotLS8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMCwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0gICBDb250cmlidXRlZCBieSBCZXJuZCBTY2htaWR0IDxjcnV4QFBvb2wuSW5mb3JtYXRpay5SV1RILUFhY2hlbi5ERT4sIDE5OTcuCi0tCi0tICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMKLS0gICBMaWJyYXJ5LiAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0vKiBUcmVlIHNlYXJjaCBmb3IgcmVkL2JsYWNrIHRyZWVzLgotLSAgIFRoZSBhbGdvcml0aG0gZm9yIGFkZGluZyBub2RlcyBpcyB0YWtlbiBmcm9tIG9uZSBvZiB0aGUgbWFueSAiQWxnb3JpdGhtcyIKLS0gICBib29rcyBieSBSb2JlcnQgU2VkZ2V3aWNrLCBhbHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmVycy4KLS0gICBUaGUgYWxnb3JpdGhtIGZvciBkZWxldGluZyBub2RlcyBjYW4gcHJvYmFibHkgYmUgZm91bmQgaW4gYSBib29rIG5hbWVkCi0tICAgIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zIiBieSBDb3JtZW4vTGVpc2Vyc29uL1JpdmVzdC4gIEF0IGxlYXN0IHRoYXQncwotLSAgIHRoZSBib29rIHRoYXQgbXkgcHJvZmVzc29yIHRvb2sgbW9zdCBhbGdvcml0aG1zIGZyb20gZHVyaW5nIHRoZSAiRGF0YQotLSAgIFN0cnVjdHVyZXMiIGNvdXJzZS4uLgotLQotLSAgIFRvdGFsbHkgcHVibGljIGRvbWFpbi4gICovCi0tCi0tLyogUmVkL2JsYWNrIHRyZWVzIGFyZSBiaW5hcnkgdHJlZXMgaW4gd2hpY2ggdGhlIGVkZ2VzIGFyZSBjb2xvcmVkIGVpdGhlciByZWQKLS0gICBvciBibGFjay4gIFRoZXkgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0tICAgMS4gVGhlIG51bWJlciBvZiBibGFjayBlZGdlcyBvbiBldmVyeSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gYSBsZWFmIGlzCi0tICAgICAgY29uc3RhbnQuCi0tICAgMi4gTm8gdHdvIHJlZCBlZGdlcyBhcmUgYWRqYWNlbnQuCi0tICAgVGhlcmVmb3JlIHRoZXJlIGlzIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBsZW5ndGggb2YgZXZlcnkgcGF0aCwgaXQncwotLSAgIE8obG9nIG4pIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgdHJlZS4gIE5vIHBhdGggY2FuIGJlIGxvbmdlcgotLSAgIHRoYW4gMSsyKlAgd2hlcmUgUCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBwYXRoIGluIHRoZSB0cmVlLgotLSAgIFVzZWZ1bCBmb3IgdGhlIGltcGxlbWVudGF0aW9uOgotLSAgIDMuIElmIG9uZSBvZiB0aGUgY2hpbGRyZW4gb2YgYSBub2RlIGlzIE5VTEwsIHRoZW4gdGhlIG90aGVyIG9uZSBpcyByZWQKLS0gICAgICAoaWYgaXQgZXhpc3RzKS4KLS0KLS0gICBJbiB0aGUgaW1wbGVtZW50YXRpb24sIG5vdCB0aGUgZWRnZXMgYXJlIGNvbG9yZWQsIGJ1dCB0aGUgbm9kZXMuICBUaGUgY29sb3IKLS0gICBpbnRlcnByZXRlZCBhcyB0aGUgY29sb3Igb2YgdGhlIGVkZ2UgbGVhZGluZyB0byB0aGlzIG5vZGUuICBUaGUgY29sb3IgaXMKLS0gICBtZWFuaW5nbGVzcyBmb3IgdGhlIHJvb3Qgbm9kZSwgYnV0IHdlIGNvbG9yIHRoZSByb290IG5vZGUgYmxhY2sgZm9yCi0tICAgY29udmVuaWVuY2UuICBBbGwgYWRkZWQgbm9kZXMgYXJlIHJlZCBpbml0aWFsbHkuCi0tCi0tICAgQWRkaW5nIHRvIGEgcmVkL2JsYWNrIHRyZWUgaXMgcmF0aGVyIGVhc3kuICBUaGUgcmlnaHQgcGxhY2UgaXMgc2VhcmNoZWQKLS0gICB3aXRoIGEgdXN1YWwgYmluYXJ5IHRyZWUgc2VhcmNoLiAgQWRkaXRpb25hbGx5LCB3aGVuZXZlciBhIG5vZGUgTiBpcwotLSAgIHJlYWNoZWQgdGhhdCBoYXMgdHdvIHJlZCBzdWNjZXNzb3JzLCB0aGUgc3VjY2Vzc29ycyBhcmUgY29sb3JlZCBibGFjayBhbmQKLS0gICB0aGUgbm9kZSBpdHNlbGYgY29sb3JlZCByZWQuICBUaGlzIG1vdmVzIHJlZCBlZGdlcyB1cCB0aGUgdHJlZSB3aGVyZSB0aGV5Ci0tICAgcG9zZSBsZXNzIG9mIGEgcHJvYmxlbSBvbmNlIHdlIGdldCB0byByZWFsbHkgaW5zZXJ0IHRoZSBuZXcgbm9kZS4gIENoYW5naW5nCi0tICAgTidzIGNvbG9yIHRvIHJlZCBtYXkgdmlvbGF0ZSBydWxlIDIsIGhvd2V2ZXIsIHNvIHJvdGF0aW9ucyBtYXkgYmVjb21lCi0tICAgbmVjZXNzYXJ5IHRvIHJlc3RvcmUgdGhlIGludmFyaWFudHMuICBBZGRpbmcgYSBuZXcgcmVkIGxlYWYgbWF5IHZpb2xhdGUKLS0gICB0aGUgc2FtZSBydWxlLCBzbyBhZnRlcndhcmRzIGFuIGFkZGl0aW9uYWwgY2hlY2sgaXMgcnVuIGFuZCB0aGUgdHJlZQotLSAgIHBvc3NpYmx5IHJvdGF0ZWQuCi0tCi0tICAgRGVsZXRpbmcgaXMgaGFpcnkuICBUaGVyZSBhcmUgbWFpbmx5IHR3byBub2RlcyBpbnZvbHZlZDogdGhlIG5vZGUgdG8gYmUKLS0gICBkZWxldGVkIChuMSksIGFuZCBhbm90aGVyIG5vZGUgdGhhdCBpcyB0byBiZSB1bmNoYWluZWQgZnJvbSB0aGUgdHJlZSAobjIpLgotLSAgIElmIG4xIGhhcyBhIHN1Y2Nlc3NvciAodGhlIG5vZGUgd2l0aCBhIHNtYWxsZXN0IGtleSB0aGF0IGlzIGxhcmdlciB0aGFuCi0tICAgbjEpLCB0aGVuIHRoZSBzdWNjZXNzb3IgYmVjb21lcyBuMiBhbmQgaXRzIGNvbnRlbnRzIGFyZSBjb3BpZWQgaW50byBuMSwKLS0gICBvdGhlcndpc2UgbjEgYmVjb21lcyBuMi4KLS0gICBVbmNoYWluaW5nIGEgbm9kZSBtYXkgdmlvbGF0ZSBydWxlIDE6IGlmIG4yIGlzIGJsYWNrLCBvbmUgc3VidHJlZSBpcwotLSAgIG1pc3Npbmcgb25lIGJsYWNrIGVkZ2UgYWZ0ZXJ3YXJkcy4gIFRoZSBhbGdvcml0aG0gbXVzdCB0cnkgdG8gbW92ZSB0aGlzCi0tICAgZXJyb3IgdXB3YXJkcyB0b3dhcmRzIHRoZSByb290LCBzbyB0aGF0IHRoZSBzdWJ0cmVlIHRoYXQgZG9lcyBub3QgaGF2ZQotLSAgIGVub3VnaCBibGFjayBlZGdlcyBiZWNvbWVzIHRoZSB3aG9sZSB0cmVlLiAgT25jZSB0aGF0IGhhcHBlbnMsIHRoZSBlcnJvcgotLSAgIGhhcyBkaXNhcHBlYXJlZC4gIEl0IG1heSBub3QgYmUgbmVjZXNzYXJ5IHRvIGdvIGFsbCB0aGUgd2F5IHVwLCBzaW5jZSBpdAotLSAgIGlzIHBvc3NpYmxlIHRoYXQgcm90YXRpb25zIGFuZCByZWNvbG9yaW5nIGNhbiBmaXggdGhlIGVycm9yIGJlZm9yZSB0aGF0LgotLQotLSAgIEFsdGhvdWdoIHRoZSBkZWxldGlvbiBhbGdvcml0aG0gbXVzdCB3YWxrIHVwd2FyZHMgdGhyb3VnaCB0aGUgdHJlZSwgd2UKLS0gICBkbyBub3Qgc3RvcmUgcGFyZW50IHBvaW50ZXJzIGluIHRoZSBub2Rlcy4gIEluc3RlYWQsIGRlbGV0ZSBhbGxvY2F0ZXMgYQotLSAgIHNtYWxsIGFycmF5IG9mIHBhcmVudCBwb2ludGVycyBhbmQgZmlsbHMgaXQgd2hpbGUgZGVzY2VuZGluZyB0aGUgdHJlZS4KLS0gICBTaW5jZSB3ZSBrbm93IHRoYXQgdGhlIGxlbmd0aCBvZiBhIHBhdGggaXMgTyhsb2cgbiksIHdoZXJlIG4gaXMgdGhlIG51bWJlcgotLSAgIG9mIG5vZGVzLCB0aGlzIGlzIGxpa2VseSB0byB1c2UgbGVzcyBtZW1vcnkuICAqLwotLQotLS8qIFRyZWUgcm90YXRpb25zIGxvb2sgbGlrZSB0aGlzOgotLSAgICAgIEEgICAgICAgICAgICAgICAgQwotLSAgICAgLyBcICAgICAgICAgICAgICAvIFwKLS0gICAgQiAgIEMgICAgICAgICAgICBBICAgRwotLSAgIC8gXCAvIFwgIC0tPiAgICAgLyBcCi0tICAgRCBFIEYgRyAgICAgICAgIEIgICBGCi0tICAgICAgICAgICAgICAgICAgLyBcCi0tICAgICAgICAgICAgICAgICBEICAgRQotLQotLSAgIEluIHRoaXMgY2FzZSwgQSBoYXMgYmVlbiByb3RhdGVkIGxlZnQuICBUaGlzIHByZXNlcnZlcyB0aGUgb3JkZXJpbmcgb2YgdGhlCi0tICAgYmluYXJ5IHRyZWUuICAqLwotLQotLSNpbmNsdWRlIDxjb25maWcuaD4KLS0KLS0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLS0jaWZkZWYgSU5fTElCSU5UTAotLSMgaW5jbHVkZSAidHNlYXJjaC5oIgotLSNlbHNlCi0tIyBpbmNsdWRlIDxzZWFyY2guaD4KLS0jZW5kaWYKLS0KLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tCi0tdHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9mbl90KSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOwotLXR5cGVkZWYgdm9pZCAoKl9fYWN0aW9uX2ZuX3QpIChjb25zdCB2b2lkICosIFZJU0lULCBpbnQpOwotLQotLSNpZm5kZWYgd2Vha19hbGlhcwotLSMgZGVmaW5lIF9fdHNlYXJjaCB0c2VhcmNoCi0tIyBkZWZpbmUgX190ZmluZCB0ZmluZAotLSMgZGVmaW5lIF9fdGRlbGV0ZSB0ZGVsZXRlCi0tIyBkZWZpbmUgX190d2FsayB0d2FsawotLSNlbmRpZgotLQotLSNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KLS0vKiBJbnNpZGUgR05VIGxpYmMgd2UgbWFyayBzb21lIGZ1bmN0aW9uIGluIGEgc3BlY2lhbCB3YXkuICBJbiBvdGhlcgotLSAgIGVudmlyb25tZW50cyBzaW1wbHkgaWdub3JlIHRoZSBtYXJraW5nLiAgKi8KLS0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotLSNlbmRpZgotLQotLXR5cGVkZWYgc3RydWN0IG5vZGVfdAotLXsKLS0gIC8qIENhbGxlcnMgZXhwZWN0IHRoaXMgdG8gYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSAtIGRvIG5vdAotLSAgICAgbW92ZSEgICovCi0tICBjb25zdCB2b2lkICprZXk7Ci0tICBzdHJ1Y3Qgbm9kZV90ICpsZWZ0OwotLSAgc3RydWN0IG5vZGVfdCAqcmlnaHQ7Ci0tICB1bnNpZ25lZCBpbnQgcmVkOjE7Ci0tfSAqbm9kZTsKLS10eXBlZGVmIGNvbnN0IHN0cnVjdCBub2RlX3QgKmNvbnN0X25vZGU7Ci0tCi0tI3VuZGVmIERFQlVHR0lORwotLQotLSNpZmRlZiBERUJVR0dJTkcKLS0KLS0vKiBSb3V0aW5lcyB0byBjaGVjayB0cmVlIGludmFyaWFudHMuICAqLwotLQotLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS0KLS0jZGVmaW5lIENIRUNLX1RSRUUoYSkgY2hlY2tfdHJlZShhKQotLQotLXN0YXRpYyB2b2lkCi0tY2hlY2tfdHJlZV9yZWN1cnNlIChub2RlIHAsIGludCBkX3NvZmFyLCBpbnQgZF90b3RhbCkKLS17Ci0tICBpZiAocCA9PSBOVUxMKQotLSAgICB7Ci0tICAgICAgYXNzZXJ0IChkX3NvZmFyID09IGRfdG90YWwpOwotLSAgICAgIHJldHVybjsKLS0gICAgfQotLQotLSAgY2hlY2tfdHJlZV9yZWN1cnNlIChwLT5sZWZ0LCBkX3NvZmFyICsgKHAtPmxlZnQgJiYgIXAtPmxlZnQtPnJlZCksIGRfdG90YWwpOwotLSAgY2hlY2tfdHJlZV9yZWN1cnNlIChwLT5yaWdodCwgZF9zb2ZhciArIChwLT5yaWdodCAmJiAhcC0+cmlnaHQtPnJlZCksIGRfdG90YWwpOwotLSAgaWYgKHAtPmxlZnQpCi0tICAgIGFzc2VydCAoIShwLT5sZWZ0LT5yZWQgJiYgcC0+cmVkKSk7Ci0tICBpZiAocC0+cmlnaHQpCi0tICAgIGFzc2VydCAoIShwLT5yaWdodC0+cmVkICYmIHAtPnJlZCkpOwotLX0KLS0KLS1zdGF0aWMgdm9pZAotLWNoZWNrX3RyZWUgKG5vZGUgcm9vdCkKLS17Ci0tICBpbnQgY250ID0gMDsKLS0gIG5vZGUgcDsKLS0gIGlmIChyb290ID09IE5VTEwpCi0tICAgIHJldHVybjsKLS0gIHJvb3QtPnJlZCA9IDA7Ci0tICBmb3IocCA9IHJvb3QtPmxlZnQ7IHA7IHAgPSBwLT5sZWZ0KQotLSAgICBjbnQgKz0gIXAtPnJlZDsKLS0gIGNoZWNrX3RyZWVfcmVjdXJzZSAocm9vdCwgMCwgY250KTsKLS19Ci0tCi0tCi0tI2Vsc2UKLS0KLS0jZGVmaW5lIENIRUNLX1RSRUUoYSkKLS0KLS0jZW5kaWYKLS0KLS0vKiBQb3NzaWJseSAic3BsaXQiIGEgbm9kZSB3aXRoIHR3byByZWQgc3VjY2Vzc29ycywgYW5kL29yIGZpeCB1cCB0d28gcmVkCi0tICAgZWRnZXMgaW4gYSByb3cuICBST09UUCBpcyBhIHBvaW50ZXIgdG8gdGhlIGxvd2VzdCBub2RlIHdlIHZpc2l0ZWQsIFBBUkVOVFAKLS0gICBhbmQgR1BBUkVOVFAgcG9pbnRlcnMgdG8gaXRzIHBhcmVudC9ncmFuZHBhcmVudC4gIFBfUiBhbmQgR1BfUiBjb250YWluIHRoZQotLSAgIGNvbXBhcmlzb24gdmFsdWVzIHRoYXQgZGV0ZXJtaW5lZCB3aGljaCB3YXkgd2FzIHRha2VuIGluIHRoZSB0cmVlIHRvIHJlYWNoCi0tICAgUk9PVFAuICBNT0RFIGlzIDEgaWYgd2UgbmVlZCBub3QgZG8gdGhlIHNwbGl0LCBidXQgbXVzdCBjaGVjayBmb3IgdHdvIHJlZAotLSAgIGVkZ2VzIGJldHdlZW4gR1BBUkVOVFAgYW5kIFJPT1RQLiAgKi8KLS1zdGF0aWMgdm9pZAotLW1heWJlX3NwbGl0X2Zvcl9pbnNlcnQgKG5vZGUgKnJvb3RwLCBub2RlICpwYXJlbnRwLCBub2RlICpncGFyZW50cCwKLS0JCQlpbnQgcF9yLCBpbnQgZ3BfciwgaW50IG1vZGUpCi0tewotLSAgbm9kZSByb290ID0gKnJvb3RwOwotLSAgbm9kZSAqcnAsICpscDsKLS0gIHJwID0gJigqcm9vdHApLT5yaWdodDsKLS0gIGxwID0gJigqcm9vdHApLT5sZWZ0OwotLQotLSAgLyogU2VlIGlmIHdlIGhhdmUgdG8gc3BsaXQgdGhpcyBub2RlIChib3RoIHN1Y2Nlc3NvcnMgcmVkKS4gICovCi0tICBpZiAobW9kZSA9PSAxCi0tICAgICAgfHwgKCgqcnApICE9IE5VTEwgJiYgKCpscCkgIT0gTlVMTCAmJiAoKnJwKS0+cmVkICYmICgqbHApLT5yZWQpKQotLSAgICB7Ci0tICAgICAgLyogVGhpcyBub2RlIGJlY29tZXMgcmVkLCBpdHMgc3VjY2Vzc29ycyBibGFjay4gICovCi0tICAgICAgcm9vdC0+cmVkID0gMTsKLS0gICAgICBpZiAoKnJwKQotLQkoKnJwKS0+cmVkID0gMDsKLS0gICAgICBpZiAoKmxwKQotLQkoKmxwKS0+cmVkID0gMDsKLS0KLS0gICAgICAvKiBJZiB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZSBpcyBhbHNvIHJlZCwgd2UgaGF2ZSB0byBkbwotLQkgcm90YXRpb25zLiAgKi8KLS0gICAgICBpZiAocGFyZW50cCAhPSBOVUxMICYmICgqcGFyZW50cCktPnJlZCkKLS0JewotLQkgIG5vZGUgZ3AgPSAqZ3BhcmVudHA7Ci0tCSAgbm9kZSBwID0gKnBhcmVudHA7Ci0tCSAgLyogVGhlcmUgYXJlIHR3byBtYWluIGNhc2VzOgotLQkgICAgIDEuIFRoZSBlZGdlIHR5cGVzIChsZWZ0IG9yIHJpZ2h0KSBvZiB0aGUgdHdvIHJlZCBlZGdlcyBkaWZmZXIuCi0tCSAgICAgMi4gQm90aCByZWQgZWRnZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCi0tCSAgICAgVGhlcmUgZXhpc3QgdHdvIHN5bW1ldHJpZXMgb2YgZWFjaCBjYXNlLCBzbyB0aGVyZSBpcyBhIHRvdGFsIG9mCi0tCSAgICAgNCBjYXNlcy4gICovCi0tCSAgaWYgKChwX3IgPiAwKSAhPSAoZ3BfciA+IDApKQotLQkgICAgewotLQkgICAgICAvKiBQdXQgdGhlIGNoaWxkIGF0IHRoZSB0b3Agb2YgdGhlIHRyZWUsIHdpdGggaXRzIHBhcmVudAotLQkJIGFuZCBncmFuZHBhcmVudCBhcyBzdWNjZXNzb3JzLiAgKi8KLS0JICAgICAgcC0+cmVkID0gMTsKLS0JICAgICAgZ3AtPnJlZCA9IDE7Ci0tCSAgICAgIHJvb3QtPnJlZCA9IDA7Ci0tCSAgICAgIGlmIChwX3IgPCAwKQotLQkJewotLQkJICAvKiBDaGlsZCBpcyBsZWZ0IG9mIHBhcmVudC4gICovCi0tCQkgIHAtPmxlZnQgPSAqcnA7Ci0tCQkgICpycCA9IHA7Ci0tCQkgIGdwLT5yaWdodCA9ICpscDsKLS0JCSAgKmxwID0gZ3A7Ci0tCQl9Ci0tCSAgICAgIGVsc2UKLS0JCXsKLS0JCSAgLyogQ2hpbGQgaXMgcmlnaHQgb2YgcGFyZW50LiAgKi8KLS0JCSAgcC0+cmlnaHQgPSAqbHA7Ci0tCQkgICpscCA9IHA7Ci0tCQkgIGdwLT5sZWZ0ID0gKnJwOwotLQkJICAqcnAgPSBncDsKLS0JCX0KLS0JICAgICAgKmdwYXJlbnRwID0gcm9vdDsKLS0JICAgIH0KLS0JICBlbHNlCi0tCSAgICB7Ci0tCSAgICAgICpncGFyZW50cCA9ICpwYXJlbnRwOwotLQkgICAgICAvKiBQYXJlbnQgYmVjb21lcyB0aGUgdG9wIG9mIHRoZSB0cmVlLCBncmFuZHBhcmVudCBhbmQKLS0JCSBjaGlsZCBhcmUgaXRzIHN1Y2Nlc3NvcnMuICAqLwotLQkgICAgICBwLT5yZWQgPSAwOwotLQkgICAgICBncC0+cmVkID0gMTsKLS0JICAgICAgaWYgKHBfciA8IDApCi0tCQl7Ci0tCQkgIC8qIExlZnQgZWRnZXMuICAqLwotLQkJICBncC0+bGVmdCA9IHAtPnJpZ2h0OwotLQkJICBwLT5yaWdodCA9IGdwOwotLQkJfQotLQkgICAgICBlbHNlCi0tCQl7Ci0tCQkgIC8qIFJpZ2h0IGVkZ2VzLiAgKi8KLS0JCSAgZ3AtPnJpZ2h0ID0gcC0+bGVmdDsKLS0JCSAgcC0+bGVmdCA9IGdwOwotLQkJfQotLQkgICAgfQotLQl9Ci0tICAgIH0KLS19Ci0tCi0tLyogRmluZCBvciBpbnNlcnQgZGF0dW0gaW50byBzZWFyY2ggdHJlZS4KLS0gICBLRVkgaXMgdGhlIGtleSB0byBiZSBsb2NhdGVkLCBST09UUCBpcyB0aGUgYWRkcmVzcyBvZiB0cmVlIHJvb3QsCi0tICAgQ09NUEFSIHRoZSBvcmRlcmluZyBmdW5jdGlvbi4gICovCi0tdm9pZCAqCi0tX190c2VhcmNoIChjb25zdCB2b2lkICprZXksIHZvaWQgKip2cm9vdHAsIF9fY29tcGFyX2ZuX3QgY29tcGFyKQotLXsKLS0gIG5vZGUgcTsKLS0gIG5vZGUgKnBhcmVudHAgPSBOVUxMLCAqZ3BhcmVudHAgPSBOVUxMOwotLSAgbm9kZSAqcm9vdHAgPSAobm9kZSAqKSB2cm9vdHA7Ci0tICBub2RlICpuZXh0cDsKLS0gIGludCByID0gMCwgcF9yID0gMCwgZ3BfciA9IDA7IC8qIE5vIHRoZXkgbWlnaHQgbm90LCBNciBDb21waWxlci4gICovCi0tCi0tICBpZiAocm9vdHAgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tICAvKiBUaGlzIHNhdmVzIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyBiZWxvdy4gICovCi0tICBpZiAoKnJvb3RwICE9IE5VTEwpCi0tICAgICgqcm9vdHApLT5yZWQgPSAwOwotLQotLSAgQ0hFQ0tfVFJFRSAoKnJvb3RwKTsKLS0KLS0gIG5leHRwID0gcm9vdHA7Ci0tICB3aGlsZSAoKm5leHRwICE9IE5VTEwpCi0tICAgIHsKLS0gICAgICBub2RlIHJvb3QgPSAqcm9vdHA7Ci0tICAgICAgciA9ICgqY29tcGFyKSAoa2V5LCByb290LT5rZXkpOwotLSAgICAgIGlmIChyID09IDApCi0tCXJldHVybiByb290OwotLQotLSAgICAgIG1heWJlX3NwbGl0X2Zvcl9pbnNlcnQgKHJvb3RwLCBwYXJlbnRwLCBncGFyZW50cCwgcF9yLCBncF9yLCAwKTsKLS0gICAgICAvKiBJZiB0aGF0IGRpZCBhbnkgcm90YXRpb25zLCBwYXJlbnRwIGFuZCBncGFyZW50cCBhcmUgbm93IGdhcmJhZ2UuCi0tCSBUaGF0IGRvZXNuJ3QgbWF0dGVyLCBiZWNhdXNlIHRoZSB2YWx1ZXMgdGhleSBjb250YWluIGFyZSBuZXZlcgotLQkgdXNlZCBhZ2FpbiBpbiB0aGF0IGNhc2UuICAqLwotLQotLSAgICAgIG5leHRwID0gciA8IDAgPyAmcm9vdC0+bGVmdCA6ICZyb290LT5yaWdodDsKLS0gICAgICBpZiAoKm5leHRwID09IE5VTEwpCi0tCWJyZWFrOwotLQotLSAgICAgIGdwYXJlbnRwID0gcGFyZW50cDsKLS0gICAgICBwYXJlbnRwID0gcm9vdHA7Ci0tICAgICAgcm9vdHAgPSBuZXh0cDsKLS0KLS0gICAgICBncF9yID0gcF9yOwotLSAgICAgIHBfciA9IHI7Ci0tICAgIH0KLS0KLS0gIHEgPSAoc3RydWN0IG5vZGVfdCAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IG5vZGVfdCkpOwotLSAgaWYgKHEgIT0gTlVMTCkKLS0gICAgewotLSAgICAgICpuZXh0cCA9IHE7CQkJLyogbGluayBuZXcgbm9kZSB0byBvbGQgKi8KLS0gICAgICBxLT5rZXkgPSBrZXk7CQkJLyogaW5pdGlhbGl6ZSBuZXcgbm9kZSAqLwotLSAgICAgIHEtPnJlZCA9IDE7Ci0tICAgICAgcS0+bGVmdCA9IHEtPnJpZ2h0ID0gTlVMTDsKLS0KLS0gICAgICBpZiAobmV4dHAgIT0gcm9vdHApCi0tCS8qIFRoZXJlIG1heSBiZSB0d28gcmVkIGVkZ2VzIGluIGEgcm93IG5vdywgd2hpY2ggd2UgbXVzdCBhdm9pZCBieQotLQkgICByb3RhdGluZyB0aGUgdHJlZS4gICovCi0tCW1heWJlX3NwbGl0X2Zvcl9pbnNlcnQgKG5leHRwLCByb290cCwgcGFyZW50cCwgciwgcF9yLCAxKTsKLS0gICAgfQotLQotLSAgcmV0dXJuIHE7Ci0tfQotLSNpZmRlZiB3ZWFrX2FsaWFzCi0td2Vha19hbGlhcyAoX190c2VhcmNoLCB0c2VhcmNoKQotLSNlbmRpZgotLQotLQotLS8qIEZpbmQgZGF0dW0gaW4gc2VhcmNoIHRyZWUuCi0tICAgS0VZIGlzIHRoZSBrZXkgdG8gYmUgbG9jYXRlZCwgUk9PVFAgaXMgdGhlIGFkZHJlc3Mgb2YgdHJlZSByb290LAotLSAgIENPTVBBUiB0aGUgb3JkZXJpbmcgZnVuY3Rpb24uICAqLwotLXZvaWQgKgotLV9fdGZpbmQgKGtleSwgdnJvb3RwLCBjb21wYXIpCi0tICAgICBjb25zdCB2b2lkICprZXk7Ci0tICAgICB2b2lkICpjb25zdCAqdnJvb3RwOwotLSAgICAgX19jb21wYXJfZm5fdCBjb21wYXI7Ci0tewotLSAgbm9kZSAqcm9vdHAgPSAobm9kZSAqKSB2cm9vdHA7Ci0tCi0tICBpZiAocm9vdHAgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tCi0tICBDSEVDS19UUkVFICgqcm9vdHApOwotLQotLSAgd2hpbGUgKCpyb290cCAhPSBOVUxMKQotLSAgICB7Ci0tICAgICAgbm9kZSByb290ID0gKnJvb3RwOwotLSAgICAgIGludCByOwotLQotLSAgICAgIHIgPSAoKmNvbXBhcikgKGtleSwgcm9vdC0+a2V5KTsKLS0gICAgICBpZiAociA9PSAwKQotLQlyZXR1cm4gcm9vdDsKLS0KLS0gICAgICByb290cCA9IHIgPCAwID8gJnJvb3QtPmxlZnQgOiAmcm9vdC0+cmlnaHQ7Ci0tICAgIH0KLS0gIHJldHVybiBOVUxMOwotLX0KLS0jaWZkZWYgd2Vha19hbGlhcwotLXdlYWtfYWxpYXMgKF9fdGZpbmQsIHRmaW5kKQotLSNlbmRpZgotLQotLQotLS8qIERlbGV0ZSBub2RlIHdpdGggZ2l2ZW4ga2V5LgotLSAgIEtFWSBpcyB0aGUga2V5IHRvIGJlIGRlbGV0ZWQsIFJPT1RQIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSByb290IG9mIHRyZWUsCi0tICAgQ09NUEFSIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLiAgKi8KLS12b2lkICoKLS1fX3RkZWxldGUgKGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqKnZyb290cCwgX19jb21wYXJfZm5fdCBjb21wYXIpCi0tewotLSAgbm9kZSBwLCBxLCByLCByZXR2YWw7Ci0tICBpbnQgY21wOwotLSAgbm9kZSAqcm9vdHAgPSAobm9kZSAqKSB2cm9vdHA7Ci0tICBub2RlIHJvb3QsIHVuY2hhaW5lZDsKLS0gIC8qIFN0YWNrIG9mIG5vZGVzIHNvIHdlIHJlbWVtYmVyIHRoZSBwYXJlbnRzIHdpdGhvdXQgcmVjdXJzaW9uLiAgSXQncwotLSAgICAgX3ZlcnlfIHVubGlrZWx5IHRoYXQgdGhlcmUgYXJlIHBhdGhzIGxvbmdlciB0aGFuIDQwIG5vZGVzLiAgVGhlIHRyZWUKLS0gICAgIHdvdWxkIG5lZWQgdG8gaGF2ZSBhcm91bmQgMjUwLjAwMCBub2Rlcy4gICovCi0tICBpbnQgc3RhY2tzaXplID0gMTAwOwotLSAgaW50IHNwID0gMDsKLS0gIG5vZGUgKm5vZGVzdGFja1sxMDBdOwotLQotLSAgaWYgKHJvb3RwID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLSAgcCA9ICpyb290cDsKLS0gIGlmIChwID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLQotLSAgQ0hFQ0tfVFJFRSAocCk7Ci0tCi0tICB3aGlsZSAoKGNtcCA9ICgqY29tcGFyKSAoa2V5LCAoKnJvb3RwKS0+a2V5KSkgIT0gMCkKLS0gICAgewotLSAgICAgIGlmIChzcCA9PSBzdGFja3NpemUpCi0tCWFib3J0ICgpOwotLQotLSAgICAgIG5vZGVzdGFja1tzcCsrXSA9IHJvb3RwOwotLSAgICAgIHAgPSAqcm9vdHA7Ci0tICAgICAgcm9vdHAgPSAoKGNtcCA8IDApCi0tCSAgICAgICA/ICYoKnJvb3RwKS0+bGVmdAotLQkgICAgICAgOiAmKCpyb290cCktPnJpZ2h0KTsKLS0gICAgICBpZiAoKnJvb3RwID09IE5VTEwpCi0tCXJldHVybiBOVUxMOwotLSAgICB9Ci0tCi0tICAvKiBUaGlzIGlzIGJvZ3VzIGlmIHRoZSBub2RlIHRvIGJlIGRlbGV0ZWQgaXMgdGhlIHJvb3QuLi4gdGhpcyByb3V0aW5lCi0tICAgICByZWFsbHkgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyIHdpdGggMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUKLS0gICAgIGFuZCBlcnJubyA9IEVTUkNIIG9yIHNvbWV0aGluZy4gICovCi0tICByZXR2YWwgPSBwOwotLQotLSAgLyogV2UgZG9uJ3QgdW5jaGFpbiB0aGUgbm9kZSB3ZSB3YW50IHRvIGRlbGV0ZS4gSW5zdGVhZCwgd2Ugb3ZlcndyaXRlCi0tICAgICBpdCB3aXRoIGl0cyBzdWNjZXNzb3IgYW5kIHVuY2hhaW4gdGhlIHN1Y2Nlc3Nvci4gIElmIHRoZXJlIGlzIG5vCi0tICAgICBzdWNjZXNzb3IsIHdlIHJlYWxseSB1bmNoYWluIHRoZSBub2RlIHRvIGJlIGRlbGV0ZWQuICAqLwotLQotLSAgcm9vdCA9ICpyb290cDsKLS0KLS0gIHIgPSByb290LT5yaWdodDsKLS0gIHEgPSByb290LT5sZWZ0OwotLQotLSAgaWYgKHEgPT0gTlVMTCB8fCByID09IE5VTEwpCi0tICAgIHVuY2hhaW5lZCA9IHJvb3Q7Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICBub2RlICpwYXJlbnQgPSByb290cCwgKnVwID0gJnJvb3QtPnJpZ2h0OwotLSAgICAgIGZvciAoOzspCi0tCXsKLS0JICBpZiAoc3AgPT0gc3RhY2tzaXplKQotLQkgICAgYWJvcnQgKCk7Ci0tCSAgbm9kZXN0YWNrW3NwKytdID0gcGFyZW50OwotLQkgIHBhcmVudCA9IHVwOwotLQkgIGlmICgoKnVwKS0+bGVmdCA9PSBOVUxMKQotLQkgICAgYnJlYWs7Ci0tCSAgdXAgPSAmKCp1cCktPmxlZnQ7Ci0tCX0KLS0gICAgICB1bmNoYWluZWQgPSAqdXA7Ci0tICAgIH0KLS0KLS0gIC8qIFdlIGtub3cgdGhhdCBlaXRoZXIgdGhlIGxlZnQgb3IgcmlnaHQgc3VjY2Vzc29yIG9mIFVOQ0hBSU5FRCBpcyBOVUxMLgotLSAgICAgUiBiZWNvbWVzIHRoZSBvdGhlciBvbmUsIGl0IGlzIGNoYWluZWQgaW50byB0aGUgcGFyZW50IG9mIFVOQ0hBSU5FRC4gICovCi0tICByID0gdW5jaGFpbmVkLT5sZWZ0OwotLSAgaWYgKHIgPT0gTlVMTCkKLS0gICAgciA9IHVuY2hhaW5lZC0+cmlnaHQ7Ci0tICBpZiAoc3AgPT0gMCkKLS0gICAgKnJvb3RwID0gcjsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgIHEgPSAqbm9kZXN0YWNrW3NwLTFdOwotLSAgICAgIGlmICh1bmNoYWluZWQgPT0gcS0+cmlnaHQpCi0tCXEtPnJpZ2h0ID0gcjsKLS0gICAgICBlbHNlCi0tCXEtPmxlZnQgPSByOwotLSAgICB9Ci0tCi0tICBpZiAodW5jaGFpbmVkICE9IHJvb3QpCi0tICAgIHJvb3QtPmtleSA9IHVuY2hhaW5lZC0+a2V5OwotLSAgaWYgKCF1bmNoYWluZWQtPnJlZCkKLS0gICAgewotLSAgICAgIC8qIE5vdyB3ZSBsb3N0IGEgYmxhY2sgZWRnZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbnVtYmVyIG9mIGJsYWNrCi0tCSBlZGdlcyBvbiBldmVyeSBwYXRoIGlzIG5vIGxvbmdlciBjb25zdGFudC4gIFdlIG11c3QgYmFsYW5jZSB0aGUKLS0JIHRyZWUuICAqLwotLSAgICAgIC8qIE5PREVTVEFDSyBub3cgY29udGFpbnMgYWxsIHBhcmVudHMgb2YgUi4gIFIgaXMgbGlrZWx5IHRvIGJlIE5VTEwKLS0JIGluIHRoZSBmaXJzdCBpdGVyYXRpb24uICAqLwotLSAgICAgIC8qIE5VTEwgbm9kZXMgYXJlIGNvbnNpZGVyZWQgYmxhY2sgdGhyb3VnaG91dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvcgotLQkgY29ycmVjdG5lc3MuICAqLwotLSAgICAgIHdoaWxlIChzcCA+IDAgJiYgKHIgPT0gTlVMTCB8fCAhci0+cmVkKSkKLS0JewotLQkgIG5vZGUgKnBwID0gbm9kZXN0YWNrW3NwIC0gMV07Ci0tCSAgcCA9ICpwcDsKLS0JICAvKiBUd28gc3ltbWV0cmljIGNhc2VzLiAgKi8KLS0JICBpZiAociA9PSBwLT5sZWZ0KQotLQkgICAgewotLQkgICAgICAvKiBRIGlzIFIncyBicm90aGVyLCBQIGlzIFIncyBwYXJlbnQuICBUaGUgc3VidHJlZSB3aXRoIHJvb3QKLS0JCSBSIGhhcyBvbmUgYmxhY2sgZWRnZSBsZXNzIHRoYW4gdGhlIHN1YnRyZWUgd2l0aCByb290IFEuICAqLwotLQkgICAgICBxID0gcC0+cmlnaHQ7Ci0tCSAgICAgIGlmIChxLT5yZWQpCi0tCQl7Ci0tCQkgIC8qIElmIFEgaXMgcmVkLCB3ZSBrbm93IHRoYXQgUCBpcyBibGFjay4gV2Ugcm90YXRlIFAgbGVmdAotLQkJICAgICBzbyB0aGF0IFEgYmVjb21lcyB0aGUgdG9wIG5vZGUgaW4gdGhlIHRyZWUsIHdpdGggUCBiZWxvdwotLQkJICAgICBpdC4gIFAgaXMgY29sb3JlZCByZWQsIFEgaXMgY29sb3JlZCBibGFjay4KLS0JCSAgICAgVGhpcyBhY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBibGFjayBlZGdlIGNvdW50IGZvciBhbnkKLS0JCSAgICAgbGVhZiBpbiB0aGUgdHJlZSwgYnV0IHdlIHdpbGwgYmUgYWJsZSB0byByZWNvZ25pemUgb25lCi0tCQkgICAgIG9mIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9ucywgd2hpY2ggYWxsIHJlcXVpcmUgdGhhdCBRCi0tCQkgICAgIGlzIGJsYWNrLiAgKi8KLS0JCSAgcS0+cmVkID0gMDsKLS0JCSAgcC0+cmVkID0gMTsKLS0JCSAgLyogTGVmdCByb3RhdGUgcC4gICovCi0tCQkgIHAtPnJpZ2h0ID0gcS0+bGVmdDsKLS0JCSAgcS0+bGVmdCA9IHA7Ci0tCQkgICpwcCA9IHE7Ci0tCQkgIC8qIE1ha2Ugc3VyZSBwcCBpcyByaWdodCBpZiB0aGUgY2FzZSBiZWxvdyB0cmllcyB0byB1c2UKLS0JCSAgICAgaXQuICAqLwotLQkJICBub2Rlc3RhY2tbc3ArK10gPSBwcCA9ICZxLT5sZWZ0OwotLQkJICBxID0gcC0+cmlnaHQ7Ci0tCQl9Ci0tCSAgICAgIC8qIFdlIGtub3cgdGhhdCBRIGNhbid0IGJlIE5VTEwgaGVyZS4gIFdlIGFsc28ga25vdyB0aGF0IFEgaXMKLS0JCSBibGFjay4gICovCi0tCSAgICAgIGlmICgocS0+bGVmdCA9PSBOVUxMIHx8ICFxLT5sZWZ0LT5yZWQpCi0tCQkgICYmIChxLT5yaWdodCA9PSBOVUxMIHx8ICFxLT5yaWdodC0+cmVkKSkKLS0JCXsKLS0JCSAgLyogUSBoYXMgdHdvIGJsYWNrIHN1Y2Nlc3NvcnMuICBXZSBjYW4gc2ltcGx5IGNvbG9yIFEgcmVkLgotLQkJICAgICBUaGUgd2hvbGUgc3VidHJlZSB3aXRoIHJvb3QgUCBpcyBub3cgbWlzc2luZyBvbmUgYmxhY2sKLS0JCSAgICAgZWRnZS4gIE5vdGUgdGhhdCB0aGlzIGFjdGlvbiBjYW4gdGVtcG9yYXJpbHkgbWFrZSB0aGUKLS0JCSAgICAgdHJlZSBpbnZhbGlkIChpZiBQIGlzIHJlZCkuICBCdXQgd2Ugd2lsbCBleGl0IHRoZSBsb29wCi0tCQkgICAgIGluIHRoYXQgY2FzZSBhbmQgc2V0IFAgYmxhY2ssIHdoaWNoIGJvdGggbWFrZXMgdGhlIHRyZWUKLS0JCSAgICAgdmFsaWQgYW5kIGFsc28gbWFrZXMgdGhlIGJsYWNrIGVkZ2UgY291bnQgY29tZSBvdXQKLS0JCSAgICAgcmlnaHQuICBJZiBQIGlzIGJsYWNrLCB3ZSBhcmUgYXQgbGVhc3Qgb25lIHN0ZXAgY2xvc2VyCi0tCQkgICAgIHRvIHRoZSByb290IGFuZCB3ZSdsbCB0cnkgYWdhaW4gdGhlIG5leHQgaXRlcmF0aW9uLiAgKi8KLS0JCSAgcS0+cmVkID0gMTsKLS0JCSAgciA9IHA7Ci0tCQl9Ci0tCSAgICAgIGVsc2UKLS0JCXsKLS0JCSAgLyogUSBpcyBibGFjaywgb25lIG9mIFEncyBzdWNjZXNzb3JzIGlzIHJlZC4gIFdlIGNhbgotLQkJICAgICByZXBhaXIgdGhlIHRyZWUgd2l0aCBvbmUgb3BlcmF0aW9uIGFuZCB3aWxsIGV4aXQgdGhlCi0tCQkgICAgIGxvb3AgYWZ0ZXJ3YXJkcy4gICovCi0tCQkgIGlmIChxLT5yaWdodCA9PSBOVUxMIHx8ICFxLT5yaWdodC0+cmVkKQotLQkJICAgIHsKLS0JCSAgICAgIC8qIFRoZSBsZWZ0IG9uZSBpcyByZWQuICBXZSBwZXJmb3JtIHRoZSBzYW1lIGFjdGlvbiBhcwotLQkJCSBpbiBtYXliZV9zcGxpdF9mb3JfaW5zZXJ0IHdoZXJlIHR3byByZWQgZWRnZXMgYXJlCi0tCQkJIGFkamFjZW50IGJ1dCBwb2ludCBpbiBkaWZmZXJlbnQgZGlyZWN0aW9uczoKLS0JCQkgUSdzIGxlZnQgc3VjY2Vzc29yIChsZXQncyBjYWxsIGl0IFEyKSBiZWNvbWVzIHRoZQotLQkJCSB0b3Agb2YgdGhlIHN1YnRyZWUgd2UgYXJlIGxvb2tpbmcgYXQsIGl0cyBwYXJlbnQgKFEpCi0tCQkJIGFuZCBncmFuZHBhcmVudCAoUCkgYmVjb21lIGl0cyBzdWNjZXNzb3JzLiBUaGUgZm9ybWVyCi0tCQkJIHN1Y2Nlc3NvcnMgb2YgUTIgYXJlIHBsYWNlZCBiZWxvdyBQIGFuZCBRLgotLQkJCSBQIGJlY29tZXMgYmxhY2ssIGFuZCBRMiBnZXRzIHRoZSBjb2xvciB0aGF0IFAgaGFkLgotLQkJCSBUaGlzIGNoYW5nZXMgdGhlIGJsYWNrIGVkZ2UgY291bnQgb25seSBmb3Igbm9kZSBSIGFuZAotLQkJCSBpdHMgc3VjY2Vzc29ycy4gICovCi0tCQkgICAgICBub2RlIHEyID0gcS0+bGVmdDsKLS0JCSAgICAgIHEyLT5yZWQgPSBwLT5yZWQ7Ci0tCQkgICAgICBwLT5yaWdodCA9IHEyLT5sZWZ0OwotLQkJICAgICAgcS0+bGVmdCA9IHEyLT5yaWdodDsKLS0JCSAgICAgIHEyLT5yaWdodCA9IHE7Ci0tCQkgICAgICBxMi0+bGVmdCA9IHA7Ci0tCQkgICAgICAqcHAgPSBxMjsKLS0JCSAgICAgIHAtPnJlZCA9IDA7Ci0tCQkgICAgfQotLQkJICBlbHNlCi0tCQkgICAgewotLQkJICAgICAgLyogSXQncyB0aGUgcmlnaHQgb25lLiAgUm90YXRlIFAgbGVmdC4gUCBiZWNvbWVzIGJsYWNrLAotLQkJCSBhbmQgUSBnZXRzIHRoZSBjb2xvciB0aGF0IFAgaGFkLiAgUSdzIHJpZ2h0IHN1Y2Nlc3NvcgotLQkJCSBhbHNvIGJlY29tZXMgYmxhY2suICBUaGlzIGNoYW5nZXMgdGhlIGJsYWNrIGVkZ2UKLS0JCQkgY291bnQgb25seSBmb3Igbm9kZSBSIGFuZCBpdHMgc3VjY2Vzc29ycy4gICovCi0tCQkgICAgICBxLT5yZWQgPSBwLT5yZWQ7Ci0tCQkgICAgICBwLT5yZWQgPSAwOwotLQotLQkJICAgICAgcS0+cmlnaHQtPnJlZCA9IDA7Ci0tCi0tCQkgICAgICAvKiBsZWZ0IHJvdGF0ZSBwICovCi0tCQkgICAgICBwLT5yaWdodCA9IHEtPmxlZnQ7Ci0tCQkgICAgICBxLT5sZWZ0ID0gcDsKLS0JCSAgICAgICpwcCA9IHE7Ci0tCQkgICAgfQotLQotLQkJICAvKiBXZSdyZSBkb25lLiAgKi8KLS0JCSAgc3AgPSAxOwotLQkJICByID0gTlVMTDsKLS0JCX0KLS0JICAgIH0KLS0JICBlbHNlCi0tCSAgICB7Ci0tCSAgICAgIC8qIENvbW1lbnRzOiBzZWUgYWJvdmUuICAqLwotLQkgICAgICBxID0gcC0+bGVmdDsKLS0JICAgICAgaWYgKHEtPnJlZCkKLS0JCXsKLS0JCSAgcS0+cmVkID0gMDsKLS0JCSAgcC0+cmVkID0gMTsKLS0JCSAgcC0+bGVmdCA9IHEtPnJpZ2h0OwotLQkJICBxLT5yaWdodCA9IHA7Ci0tCQkgICpwcCA9IHE7Ci0tCQkgIG5vZGVzdGFja1tzcCsrXSA9IHBwID0gJnEtPnJpZ2h0OwotLQkJICBxID0gcC0+bGVmdDsKLS0JCX0KLS0JICAgICAgaWYgKChxLT5yaWdodCA9PSBOVUxMIHx8ICFxLT5yaWdodC0+cmVkKQotLQkJICAgICAgICYmIChxLT5sZWZ0ID09IE5VTEwgfHwgIXEtPmxlZnQtPnJlZCkpCi0tCQl7Ci0tCQkgIHEtPnJlZCA9IDE7Ci0tCQkgIHIgPSBwOwotLQkJfQotLQkgICAgICBlbHNlCi0tCQl7Ci0tCQkgIGlmIChxLT5sZWZ0ID09IE5VTEwgfHwgIXEtPmxlZnQtPnJlZCkKLS0JCSAgICB7Ci0tCQkgICAgICBub2RlIHEyID0gcS0+cmlnaHQ7Ci0tCQkgICAgICBxMi0+cmVkID0gcC0+cmVkOwotLQkJICAgICAgcC0+bGVmdCA9IHEyLT5yaWdodDsKLS0JCSAgICAgIHEtPnJpZ2h0ID0gcTItPmxlZnQ7Ci0tCQkgICAgICBxMi0+bGVmdCA9IHE7Ci0tCQkgICAgICBxMi0+cmlnaHQgPSBwOwotLQkJICAgICAgKnBwID0gcTI7Ci0tCQkgICAgICBwLT5yZWQgPSAwOwotLQkJICAgIH0KLS0JCSAgZWxzZQotLQkJICAgIHsKLS0JCSAgICAgIHEtPnJlZCA9IHAtPnJlZDsKLS0JCSAgICAgIHAtPnJlZCA9IDA7Ci0tCQkgICAgICBxLT5sZWZ0LT5yZWQgPSAwOwotLQkJICAgICAgcC0+bGVmdCA9IHEtPnJpZ2h0OwotLQkJICAgICAgcS0+cmlnaHQgPSBwOwotLQkJICAgICAgKnBwID0gcTsKLS0JCSAgICB9Ci0tCQkgIHNwID0gMTsKLS0JCSAgciA9IE5VTEw7Ci0tCQl9Ci0tCSAgICB9Ci0tCSAgLS1zcDsKLS0JfQotLSAgICAgIGlmIChyICE9IE5VTEwpCi0tCXItPnJlZCA9IDA7Ci0tICAgIH0KLS0KLS0gIGZyZWUgKHVuY2hhaW5lZCk7Ci0tICByZXR1cm4gcmV0dmFsOwotLX0KLS0jaWZkZWYgd2Vha19hbGlhcwotLXdlYWtfYWxpYXMgKF9fdGRlbGV0ZSwgdGRlbGV0ZSkKLS0jZW5kaWYKLS0KLS0KLS0vKiBXYWxrIHRoZSBub2RlcyBvZiBhIHRyZWUuCi0tICAgUk9PVCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byBiZSB3YWxrZWQsIEFDVElPTiB0aGUgZnVuY3Rpb24gdG8gYmUKLS0gICBjYWxsZWQgYXQgZWFjaCBub2RlLiAgTEVWRUwgaXMgdGhlIGxldmVsIG9mIFJPT1QgaW4gdGhlIHdob2xlIHRyZWUuICAqLwotLXN0YXRpYyB2b2lkCi0taW50ZXJuYWxfZnVuY3Rpb24KLS10cmVjdXJzZSAoY29uc3Qgdm9pZCAqdnJvb3QsIF9fYWN0aW9uX2ZuX3QgYWN0aW9uLCBpbnQgbGV2ZWwpCi0tewotLSAgY29uc3Rfbm9kZSByb290ID0gKGNvbnN0X25vZGUpIHZyb290OwotLQotLSAgaWYgKHJvb3QtPmxlZnQgPT0gTlVMTCAmJiByb290LT5yaWdodCA9PSBOVUxMKQotLSAgICAoKmFjdGlvbikgKHJvb3QsIGxlYWYsIGxldmVsKTsKLS0gIGVsc2UKLS0gICAgewotLSAgICAgICgqYWN0aW9uKSAocm9vdCwgcHJlb3JkZXIsIGxldmVsKTsKLS0gICAgICBpZiAocm9vdC0+bGVmdCAhPSBOVUxMKQotLQl0cmVjdXJzZSAocm9vdC0+bGVmdCwgYWN0aW9uLCBsZXZlbCArIDEpOwotLSAgICAgICgqYWN0aW9uKSAocm9vdCwgcG9zdG9yZGVyLCBsZXZlbCk7Ci0tICAgICAgaWYgKHJvb3QtPnJpZ2h0ICE9IE5VTEwpCi0tCXRyZWN1cnNlIChyb290LT5yaWdodCwgYWN0aW9uLCBsZXZlbCArIDEpOwotLSAgICAgICgqYWN0aW9uKSAocm9vdCwgZW5kb3JkZXIsIGxldmVsKTsKLS0gICAgfQotLX0KLS0KLS0KLS0vKiBXYWxrIHRoZSBub2RlcyBvZiBhIHRyZWUuCi0tICAgUk9PVCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byBiZSB3YWxrZWQsIEFDVElPTiB0aGUgZnVuY3Rpb24gdG8gYmUKLS0gICBjYWxsZWQgYXQgZWFjaCBub2RlLiAgKi8KLS12b2lkCi0tX190d2FsayAoY29uc3Qgdm9pZCAqdnJvb3QsIF9fYWN0aW9uX2ZuX3QgYWN0aW9uKQotLXsKLS0gIGNvbnN0X25vZGUgcm9vdCA9IChjb25zdF9ub2RlKSB2cm9vdDsKLS0KLS0gIENIRUNLX1RSRUUgKHJvb3QpOwotLQotLSAgaWYgKHJvb3QgIT0gTlVMTCAmJiBhY3Rpb24gIT0gTlVMTCkKLS0gICAgdHJlY3Vyc2UgKHJvb3QsIGFjdGlvbiwgMCk7Ci0tfQotLSNpZmRlZiB3ZWFrX2FsaWFzCi0td2Vha19hbGlhcyAoX190d2FsaywgdHdhbGspCi0tI2VuZGlmCi0tCi0tCi0tI2lmZGVmIF9MSUJDCi0tCi0tLyogVGhlIHN0YW5kYXJkaXplZCBmdW5jdGlvbnMgbWlzcyBhbiBpbXBvcnRhbnQgZnVuY3Rpb25hbGl0eTogdGhlCi0tICAgdHJlZSBjYW5ub3QgYmUgcmVtb3ZlZCBlYXNpbHkuICBXZSBwcm92aWRlIGEgZnVuY3Rpb24gdG8gZG8gdGhpcy4gICovCi0tc3RhdGljIHZvaWQKLS1pbnRlcm5hbF9mdW5jdGlvbgotLXRkZXN0cm95X3JlY3Vyc2UgKG5vZGUgcm9vdCwgX19mcmVlX2ZuX3QgZnJlZWZjdCkKLS17Ci0tICBpZiAocm9vdC0+bGVmdCAhPSBOVUxMKQotLSAgICB0ZGVzdHJveV9yZWN1cnNlIChyb290LT5sZWZ0LCBmcmVlZmN0KTsKLS0gIGlmIChyb290LT5yaWdodCAhPSBOVUxMKQotLSAgICB0ZGVzdHJveV9yZWN1cnNlIChyb290LT5yaWdodCwgZnJlZWZjdCk7Ci0tICAoKmZyZWVmY3QpICgodm9pZCAqKSByb290LT5rZXkpOwotLSAgLyogRnJlZSB0aGUgbm9kZSBpdHNlbGYuICAqLwotLSAgZnJlZSAocm9vdCk7Ci0tfQotLQotLXZvaWQKLS1fX3RkZXN0cm95ICh2b2lkICp2cm9vdCwgX19mcmVlX2ZuX3QgZnJlZWZjdCkKLS17Ci0tICBub2RlIHJvb3QgPSAobm9kZSkgdnJvb3Q7Ci0tCi0tICBDSEVDS19UUkVFIChyb290KTsKLS0KLS0gIGlmIChyb290ICE9IE5VTEwpCi0tICAgIHRkZXN0cm95X3JlY3Vyc2UgKHJvb3QsIGZyZWVmY3QpOwotLX0KLS13ZWFrX2FsaWFzIChfX3RkZXN0cm95LCB0ZGVzdHJveSkKLS0KLS0jZW5kaWYgLyogX0xJQkMgKi8KLS0tLSBhL2ludGwvdHNlYXJjaC5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw4MyArMCwwIEBACi0tLyogQmluYXJ5IHRyZWUgZGF0YSBzdHJ1Y3R1cmUuCi0tICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfVFNFQVJDSF9ICi0tI2RlZmluZSBfVFNFQVJDSF9ICi0tCi0tI2lmIEhBVkVfVFNFQVJDSAotLQotLS8qIEdldCB0c2VhY2goKSwgdGZpbmQoKSwgdGRlbGV0ZSgpLCB0d2FsaygpIGRlY2xhcmF0aW9ucy4gICovCi0tI2luY2x1ZGUgPHNlYXJjaC5oPgotLQotLSNlbHNlCi0tCi0tI2lmZGVmIF9fY3BsdXNwbHVzCi0tZXh0ZXJuICJDIiB7Ci0tI2VuZGlmCi0tCi0tLyogU2VlIDxodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvc3VzdjN4YmQvc2VhcmNoLmguaHRtbD4sCi0tICAgICAgIDxodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvc3VzdjN4c2gvdHNlYXJjaC5odG1sPgotLSAgIGZvciBkZXRhaWxzLiAgKi8KLS0KLS10eXBlZGVmIGVudW0KLS17IAotLSAgcHJlb3JkZXIsCi0tICBwb3N0b3JkZXIsIAotLSAgZW5kb3JkZXIsCi0tICBsZWFmCi0tfQotLVZJU0lUOwotLQotLS8qIFNlYXJjaGVzIGFuIGVsZW1lbnQgaW4gdGhlIHRyZWUgKlZST09UUCB0aGF0IGNvbXBhcmVzIGVxdWFsIHRvIEtFWS4KLS0gICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBhIG5ldyBlbGVtZW50IGVxdWFsIHRvIEtFWQotLSAgIGlzIGluc2VydGVkIGluIHRoZSB0cmVlIGFuZCBpcyByZXR1cm5lZC4gICovCi0tZXh0ZXJuIHZvaWQgKiB0c2VhcmNoIChjb25zdCB2b2lkICprZXksIHZvaWQgKip2cm9vdHAsCi0tCQkgICAgICAgaW50ICgqY29tcGFyKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLS0KLS0vKiBTZWFyY2hlcyBhbiBlbGVtZW50IGluIHRoZSB0cmVlICpWUk9PVFAgdGhhdCBjb21wYXJlcyBlcXVhbCB0byBLRVkuCi0tICAgSWYgb25lIGlzIGZvdW5kLCBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgTlVMTCBpcyByZXR1cm5lZC4gICovCi0tZXh0ZXJuIHZvaWQgKiB0ZmluZCAoY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpjb25zdCAqdnJvb3RwLAotLQkJICAgICBpbnQgKCpjb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotLQotLS8qIFNlYXJjaGVzIGFuIGVsZW1lbnQgaW4gdGhlIHRyZWUgKlZST09UUCB0aGF0IGNvbXBhcmVzIGVxdWFsIHRvIEtFWS4KLS0gICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSwgYW5kIGl0cyBwYXJlbnQgbm9kZSBpcwotLSAgIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KLS1leHRlcm4gdm9pZCAqIHRkZWxldGUgKGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqKnZyb290cCwKLS0JCSAgICAgICBpbnQgKCpjb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotLQotLS8qIFBlcmZvcm0gYSBkZXB0aC1maXJzdCwgbGVmdC10by1yaWdodCB0cmF2ZXJzYWwgb2YgdGhlIHRyZWUgVlJPT1QuCi0tICAgVGhlIEFDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQ6Ci0tICAgICAtIGZvciBub24tbGVhZiBub2RlczogMyB0aW1lcywgYmVmb3JlIHRoZSBsZWZ0IHN1YnRyZWUgdHJhdmVyc2FsLAotLSAgICAgICBhZnRlciB0aGUgbGVmdCBzdWJ0cmVlIHRyYXZlcnNhbCBidXQgYmVmb3JlIHRoZSByaWdodCBzdWJ0cmVlIHRyYXZlcnNhbCwKLS0gICAgICAgYW5kIGFmdGVyIHRoZSByaWdodCBzdWJ0cmVlIHRyYXZlcnNhbCwKLS0gICAgIC0gZm9yIGxlYWYgbm9kZXM6IG9uY2UuCi0tICAgVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gQUNUSU9OIGFyZToKLS0gICAgIDEuIHRoZSBub2RlOyBpdCBjYW4gYmUgY2FzdGVkIHRvIGEgJ2NvbnN0IHZvaWQgKiBjb25zdCAqJywgaS5lLiBpbnRvIGEKLS0gICAgICAgIHBvaW50ZXIgdG8gdGhlIGtleSwKLS0gICAgIDIuIGFuIGluZGljYXRvciB3aGljaCB2aXNpdCBvZiB0aGUgbm9kZSB0aGlzIGlzLAotLSAgICAgMy4gdGhlIGxldmVsIG9mIHRoZSBub2RlIGluIHRoZSB0cmVlICgwIGZvciB0aGUgcm9vdCkuICAqLwotLWV4dGVybiB2b2lkIHR3YWxrIChjb25zdCB2b2lkICp2cm9vdCwKLS0JCSAgIHZvaWQgKCphY3Rpb24pIChjb25zdCB2b2lkICosIFZJU0lULCBpbnQpKTsKLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS19Ci0tI2VuZGlmCi0tCi0tI2VuZGlmCi0tCi0tI2VuZGlmIC8qIF9UU0VBUkNIX0ggKi8KLS0tLSBhL2ludGwvdmFzbnByaW50Zi5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0Njc3ICswLDAgQEAKLS0vKiB2c3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KLS0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLS8qIFRoaXMgZmlsZSBjYW4gYmUgcGFyYW1ldHJpemVkIHdpdGggdGhlIGZvbGxvd2luZyBtYWNyb3M6Ci0tICAgICBWQVNOUFJJTlRGICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQuCi0tICAgICBGQ0hBUl9UICAgICAgICAgICAgVGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgZm9ybWF0IHN0cmluZy4KLS0gICAgIERDSEFSX1QgICAgICAgICAgICBUaGUgZWxlbWVudCB0eXBlIG9mIHRoZSBkZXN0aW5hdGlvbiAocmVzdWx0KSBzdHJpbmcuCi0tICAgICBGQ0hBUl9UX09OTFlfQVNDSUkgU2V0IHRvIDEgdG8gZW5hYmxlIHZlcmlmaWNhdGlvbiB0aGF0IGFsbCBjaGFyYWN0ZXJzCi0tICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvcm1hdCBzdHJpbmcgYXJlIEFTQ0lJLiBNVVNUIGJlIHNldCBpZgotLSAgICAgICAgICAgICAgICAgICAgICAgIEZDSEFSX1QgYW5kIERDSEFSX1QgYXJlIG5vdCB0aGUgc2FtZSB0eXBlLgotLSAgICAgRElSRUNUSVZFICAgICAgICAgIFN0cnVjdHVyZSBkZW5vdGluZyBhIGZvcm1hdCBkaXJlY3RpdmUuCi0tICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kcyBvbiBGQ0hBUl9ULgotLSAgICAgRElSRUNUSVZFUyAgICAgICAgIFN0cnVjdHVyZSBkZW5vdGluZyB0aGUgc2V0IG9mIGZvcm1hdCBkaXJlY3RpdmVzIG9mIGEKLS0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLiAgRGVwZW5kcyBvbiBGQ0hBUl9ULgotLSAgICAgUFJJTlRGX1BBUlNFICAgICAgIEZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgZm9ybWF0IHN0cmluZy4KLS0gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRzIG9uIEZDSEFSX1QuCi0tICAgICBEQ0hBUl9DUFkgICAgICAgICAgbWVtY3B5IGxpa2UgZnVuY3Rpb24gZm9yIERDSEFSX1RbXSBhcnJheXMuCi0tICAgICBEQ0hBUl9TRVQgICAgICAgICAgbWVtc2V0IGxpa2UgZnVuY3Rpb24gZm9yIERDSEFSX1RbXSBhcnJheXMuCi0tICAgICBEQ0hBUl9NQlNOTEVOICAgICAgbWJzbmxlbiBsaWtlIGZ1bmN0aW9uIGZvciBEQ0hBUl9UW10gYXJyYXlzLgotLSAgICAgU05QUklOVEYgICAgICAgICAgIFRoZSBzeXN0ZW0ncyBzbnByaW50ZiAob3Igc2ltaWxhcikgZnVuY3Rpb24uCi0tICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYXkgYmUgZWl0aGVyIHNucHJpbnRmIG9yIHN3cHJpbnRmLgotLSAgICAgVENIQVJfVCAgICAgICAgICAgIFRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFyZ3VtZW50IGFuZCByZXN1bHQgc3RyaW5nCi0tICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNhaWQgU05QUklOVEYgZnVuY3Rpb24uICBUaGlzIG1heSBiZSBlaXRoZXIKLS0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG9yIHdjaGFyX3QuICBUaGUgY29kZSBleHBsb2l0cyB0aGF0Ci0tICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChUQ0hBUl9UKSB8IHNpemVvZiAoRENIQVJfVCkgYW5kCi0tICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25vZiAoVENIQVJfVCkgPD0gYWxpZ25vZiAoRENIQVJfVCkuCi0tICAgICBEQ0hBUl9JU19UQ0hBUiAgICAgU2V0IHRvIDEgaWYgRENIQVJfVCBhbmQgVENIQVJfVCBhcmUgdGhlIHNhbWUgdHlwZS4KLS0gICAgIERDSEFSX0NPTlZfRlJPTV9FTkNPRElORyBBIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBjaGFyW10gdG8gRENIQVJbXS4KLS0gICAgIERDSEFSX0lTX1VJTlQ4X1QgICBTZXQgdG8gMSBpZiBEQ0hBUl9UIGlzIHVpbnQ4X3QuCi0tICAgICBEQ0hBUl9JU19VSU5UMTZfVCAgU2V0IHRvIDEgaWYgRENIQVJfVCBpcyB1aW50MTZfdC4KLS0gICAgIERDSEFSX0lTX1VJTlQzMl9UICBTZXQgdG8gMSBpZiBEQ0hBUl9UIGlzIHVpbnQzMl90LiAgKi8KLS0KLS0vKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIHNucHJpbnRmKCkuCi0tICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0tICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLS0jIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCi0tI2VuZGlmCi0tCi0tI2lmbmRlZiBWQVNOUFJJTlRGCi0tIyBpbmNsdWRlIDxjb25maWcuaD4KLS0jZW5kaWYKLS0jaWZuZGVmIElOX0xJQklOVEwKLS0jIGluY2x1ZGUgPGFsbG9jYS5oPgotLSNlbmRpZgotLQotLS8qIFNwZWNpZmljYXRpb24uICAqLwotLSNpZm5kZWYgVkFTTlBSSU5URgotLSMgaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0jICBpbmNsdWRlICJ2YXNud3ByaW50Zi5oIgotLSMgZWxzZQotLSMgIGluY2x1ZGUgInZhc25wcmludGYuaCIKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tI2luY2x1ZGUgPGxvY2FsZS5oPgkvKiBsb2NhbGVjb252KCkgKi8KLS0jaW5jbHVkZSA8c3RkaW8uaD4JLyogc25wcmludGYoKSwgc3ByaW50ZigpICovCi0tI2luY2x1ZGUgPHN0ZGxpYi5oPgkvKiBhYm9ydCgpLCBtYWxsb2MoKSwgcmVhbGxvYygpLCBmcmVlKCkgKi8KLS0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIG1lbWNweSgpLCBzdHJsZW4oKSAqLwotLSNpbmNsdWRlIDxlcnJuby5oPgkvKiBlcnJubyAqLwotLSNpbmNsdWRlIDxsaW1pdHMuaD4JLyogQ0hBUl9CSVQgKi8KLS0jaW5jbHVkZSA8ZmxvYXQuaD4JLyogREJMX01BWF9FWFAsIExEQkxfTUFYX0VYUCAqLwotLSNpZiBIQVZFX05MX0xBTkdJTkZPCi0tIyBpbmNsdWRlIDxsYW5naW5mby5oPgotLSNlbmRpZgotLSNpZm5kZWYgVkFTTlBSSU5URgotLSMgaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0jICBpbmNsdWRlICJ3cHJpbnRmLXBhcnNlLmgiCi0tIyBlbHNlCi0tIyAgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCi0tIyBlbmRpZgotLSNlbmRpZgotLQotLS8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCi0tI2luY2x1ZGUgInhzaXplLmgiCi0tCi0tI2lmIChORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLS0jIGluY2x1ZGUgPG1hdGguaD4KLS0jIGluY2x1ZGUgImZsb2F0Ky5oIgotLSNlbmRpZgotLQotLSNpZiAoTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRSkgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotLSMgaW5jbHVkZSA8bWF0aC5oPgotLSMgaW5jbHVkZSAiaXNuYW4uaCIKLS0jZW5kaWYKLS0KLS0jaWYgKE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0xPTkdfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tIyBpbmNsdWRlIDxtYXRoLmg+Ci0tIyBpbmNsdWRlICJpc25hbmwtbm9saWJtLmgiCi0tIyBpbmNsdWRlICJmcHVjdy5oIgotLSNlbmRpZgotLQotLSNpZiAoTkVFRF9QUklOVEZfRElSRUNUSVZFX0EgfHwgTkVFRF9QUklOVEZfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tIyBpbmNsdWRlIDxtYXRoLmg+Ci0tIyBpbmNsdWRlICJpc25hbi5oIgotLSMgaW5jbHVkZSAicHJpbnRmLWZyZXhwLmgiCi0tI2VuZGlmCi0tCi0tI2lmIChORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRSkgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotLSMgaW5jbHVkZSA8bWF0aC5oPgotLSMgaW5jbHVkZSAiaXNuYW5sLW5vbGlibS5oIgotLSMgaW5jbHVkZSAicHJpbnRmLWZyZXhwbC5oIgotLSMgaW5jbHVkZSAiZnB1Y3cuaCIKLS0jZW5kaWYKLS0KLS0vKiBTb21lIHN5c3RlbXMsIGxpa2UgT1NGLzEgNC4wIGFuZCBXb2UzMiwgZG9uJ3QgaGF2ZSBFT1ZFUkZMT1cuICAqLwotLSNpZm5kZWYgRU9WRVJGTE9XCi0tIyBkZWZpbmUgRU9WRVJGTE9XIEUyQklHCi0tI2VuZGlmCi0tCi0tI2lmIEhBVkVfV0NIQVJfVAotLSMgaWYgSEFWRV9XQ1NMRU4KLS0jICBkZWZpbmUgbG9jYWxfd2NzbGVuIHdjc2xlbgotLSMgZWxzZQotLSAgIC8qIFNvbGFyaXMgMi41LjEgaGFzIHdjc2xlbigpIGluIGEgc2VwYXJhdGUgbGlicmFyeSBsaWJ3LnNvLiBUbyBhdm9pZAotLSAgICAgIGEgZGVwZW5kZW5jeSB0b3dhcmRzIHRoaXMgbGlicmFyeSwgaGVyZSBpcyBhIGxvY2FsIHN1YnN0aXR1dGUuCi0tICAgICAgRGVmaW5lIHRoaXMgc3Vic3RpdHV0ZSBvbmx5IG9uY2UsIGV2ZW4gaWYgdGhpcyBmaWxlIGlzIGluY2x1ZGVkCi0tICAgICAgdHdpY2UgaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdC4gICovCi0tIyAgaWZuZGVmIGxvY2FsX3djc2xlbl9kZWZpbmVkCi0tIyAgIGRlZmluZSBsb2NhbF93Y3NsZW5fZGVmaW5lZCAxCi0tc3RhdGljIHNpemVfdAotLWxvY2FsX3djc2xlbiAoY29uc3Qgd2NoYXJfdCAqcykKLS17Ci0tICBjb25zdCB3Y2hhcl90ICpwdHI7Ci0tCi0tICBmb3IgKHB0ciA9IHM7ICpwdHIgIT0gKHdjaGFyX3QpIDA7IHB0cisrKQotLSAgICA7Ci0tICByZXR1cm4gcHRyIC0gczsKLS19Ci0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tLyogRGVmYXVsdCBwYXJhbWV0ZXJzLiAgKi8KLS0jaWZuZGVmIFZBU05QUklOVEYKLS0jIGlmIFdJREVfQ0hBUl9WRVJTSU9OCi0tIyAgZGVmaW5lIFZBU05QUklOVEYgdmFzbndwcmludGYKLS0jICBkZWZpbmUgRkNIQVJfVCB3Y2hhcl90Ci0tIyAgZGVmaW5lIERDSEFSX1Qgd2NoYXJfdAotLSMgIGRlZmluZSBUQ0hBUl9UIHdjaGFyX3QKLS0jICBkZWZpbmUgRENIQVJfSVNfVENIQVIgMQotLSMgIGRlZmluZSBESVJFQ1RJVkUgd2NoYXJfdF9kaXJlY3RpdmUKLS0jICBkZWZpbmUgRElSRUNUSVZFUyB3Y2hhcl90X2RpcmVjdGl2ZXMKLS0jICBkZWZpbmUgUFJJTlRGX1BBUlNFIHdwcmludGZfcGFyc2UKLS0jICBkZWZpbmUgRENIQVJfQ1BZIHdtZW1jcHkKLS0jIGVsc2UKLS0jICBkZWZpbmUgVkFTTlBSSU5URiB2YXNucHJpbnRmCi0tIyAgZGVmaW5lIEZDSEFSX1QgY2hhcgotLSMgIGRlZmluZSBEQ0hBUl9UIGNoYXIKLS0jICBkZWZpbmUgVENIQVJfVCBjaGFyCi0tIyAgZGVmaW5lIERDSEFSX0lTX1RDSEFSIDEKLS0jICBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCi0tIyAgZGVmaW5lIERJUkVDVElWRVMgY2hhcl9kaXJlY3RpdmVzCi0tIyAgZGVmaW5lIFBSSU5URl9QQVJTRSBwcmludGZfcGFyc2UKLS0jICBkZWZpbmUgRENIQVJfQ1BZIG1lbWNweQotLSMgZW5kaWYKLS0jZW5kaWYKLS0jaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0gIC8qIFRDSEFSX1QgaXMgd2NoYXJfdC4gICovCi0tIyBkZWZpbmUgVVNFX1NOUFJJTlRGIDEKLS0jIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCi0tICAgLyogT24gV2luZG93cywgdGhlIGZ1bmN0aW9uIHN3cHJpbnRmKCkgaGFzIGEgZGlmZmVyZW50IHNpZ25hdHVyZSB0aGFuCi0tICAgICAgb24gVW5peDsgd2UgdXNlIHRoZSBfc253cHJpbnRmKCkgZnVuY3Rpb24gaW5zdGVhZC4gICovCi0tIyAgZGVmaW5lIFNOUFJJTlRGIF9zbndwcmludGYKLS0jIGVsc2UKLS0gICAvKiBVbml4LiAgKi8KLS0jICBkZWZpbmUgU05QUklOVEYgc3dwcmludGYKLS0jIGVuZGlmCi0tI2Vsc2UKLS0gIC8qIFRDSEFSX1QgaXMgY2hhci4gICovCi0tIyAvKiBVc2Ugc25wcmludGYgaWYgaXQgZXhpc3RzIHVuZGVyIHRoZSBuYW1lICdzbnByaW50Zicgb3IgJ19zbnByaW50ZicuCi0tICAgICBCdXQgZG9uJ3QgdXNlIGl0IG9uIEJlT1MsIHNpbmNlIEJlT1Mgc25wcmludGYgcHJvZHVjZXMgbm8gb3V0cHV0IGlmIHRoZQotLSAgICAgc2l6ZSBhcmd1bWVudCBpcyA+PSAweDMwMDAwMDAuICAqLwotLSMgaWYgKEhBVkVfREVDTF9fU05QUklOVEYgfHwgSEFWRV9TTlBSSU5URikgJiYgIWRlZmluZWQgX19CRU9TX18KLS0jICBkZWZpbmUgVVNFX1NOUFJJTlRGIDEKLS0jIGVsc2UKLS0jICBkZWZpbmUgVVNFX1NOUFJJTlRGIDAKLS0jIGVuZGlmCi0tIyBpZiBIQVZFX0RFQ0xfX1NOUFJJTlRGCi0tICAgLyogV2luZG93cy4gICovCi0tIyAgZGVmaW5lIFNOUFJJTlRGIF9zbnByaW50ZgotLSMgZWxzZQotLSAgIC8qIFVuaXguICAqLwotLSMgIGRlZmluZSBTTlBSSU5URiBzbnByaW50ZgotLSAgIC8qIEhlcmUgd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc25wcmludGYsIG5vdCBycGxfc25wcmludGYuICAqLwotLSMgIHVuZGVmIHNucHJpbnRmCi0tIyBlbmRpZgotLSNlbmRpZgotLS8qIEhlcmUgd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3ByaW50Ziwgbm90IHJwbF9zcHJpbnRmLiAgKi8KLS0jdW5kZWYgc3ByaW50ZgotLQotLSNpZiAoTkVFRF9QUklOVEZfRElSRUNUSVZFX0EgfHwgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRSkgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotLS8qIERldGVybWluZSB0aGUgZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCi0tIyBpZm5kZWYgZGVjaW1hbF9wb2ludF9jaGFyX2RlZmluZWQKLS0jICBkZWZpbmUgZGVjaW1hbF9wb2ludF9jaGFyX2RlZmluZWQgMQotLXN0YXRpYyBjaGFyCi0tZGVjaW1hbF9wb2ludF9jaGFyICgpCi0tewotLSAgY29uc3QgY2hhciAqcG9pbnQ7Ci0tICAvKiBEZXRlcm1pbmUgaXQgaW4gYSBtdWx0aXRocmVhZC1zYWZlIHdheS4gIFdlIGtub3cgbmxfbGFuZ2luZm8gaXMKLS0gICAgIG11bHRpdGhyZWFkLXNhZmUgb24gZ2xpYmMgc3lzdGVtcywgYnV0IGlzIG5vdCByZXF1aXJlZCB0byBiZSBtdWx0aXRocmVhZC0KLS0gICAgIHNhZmUgYnkgUE9TSVguICBzcHJpbnRmKCksIGhvd2V2ZXIsIGlzIG11bHRpdGhyZWFkLXNhZmUuICBsb2NhbGVjb252KCkKLS0gICAgIGlzIHJhcmVseSBtdWx0aXRocmVhZC1zYWZlLiAgKi8KLS0jICBpZiBIQVZFX05MX0xBTkdJTkZPICYmIF9fR0xJQkNfXwotLSAgcG9pbnQgPSBubF9sYW5naW5mbyAoUkFESVhDSEFSKTsKLS0jICBlbGlmIDEKLS0gIGNoYXIgcG9pbnRidWZbNV07Ci0tICBzcHJpbnRmIChwb2ludGJ1ZiwgIiUjLjBmIiwgMS4wKTsKLS0gIHBvaW50ID0gJnBvaW50YnVmWzFdOwotLSMgIGVsc2UKLS0gIHBvaW50ID0gbG9jYWxlY29udiAoKSAtPiBkZWNpbWFsX3BvaW50OwotLSMgIGVuZGlmCi0tICAvKiBUaGUgZGVjaW1hbCBwb2ludCBpcyBhbHdheXMgYSBzaW5nbGUgYnl0ZTogZWl0aGVyICcuJyBvciAnLCcuICAqLwotLSAgcmV0dXJuIChwb2ludFswXSAhPSAnXDAnID8gcG9pbnRbMF0gOiAnLicpOwotLX0KLS0jIGVuZGlmCi0tI2VuZGlmCi0tCi0tI2lmIE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRSAmJiAhTkVFRF9QUklOVEZfRE9VQkxFICYmICFkZWZpbmVkIElOX0xJQklOVEwKLS0KLS0vKiBFcXVpdmFsZW50IHRvICFpc2Zpbml0ZSh4KSB8fCB4ID09IDAsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGxpYm0uICAqLwotLXN0YXRpYyBpbnQKLS1pc19pbmZpbml0ZV9vcl96ZXJvIChkb3VibGUgeCkKLS17Ci0tICByZXR1cm4gaXNuYW4gKHgpIHx8IHggKyB4ID09IHg7Ci0tfQotLQotLSNlbmRpZgotLQotLSNpZiBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRSAmJiAhTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotLQotLS8qIEVxdWl2YWxlbnQgdG8gIWlzZmluaXRlKHgpLCBidXQgZG9lcyBub3QgcmVxdWlyZSBsaWJtLiAgKi8KLS1zdGF0aWMgaW50Ci0taXNfaW5maW5pdGVsIChsb25nIGRvdWJsZSB4KQotLXsKLS0gIHJldHVybiBpc25hbmwgKHgpIHx8ICh4ICsgeCA9PSB4ICYmIHggIT0gMC4wTCk7Ci0tfQotLQotLSNlbmRpZgotLQotLSNpZiAoTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tCi0tLyogQ29udmVydGluZyAnbG9uZyBkb3VibGUnIHRvIGRlY2ltYWwgd2l0aG91dCByYXJlIHJvdW5kaW5nIGJ1Z3MgcmVxdWlyZXMKLS0gICByZWFsIGJpZ251bXMuICBXZSB1c2UgdGhlIG5hbWluZyBjb252ZW50aW9ucyBvZiBHTlUgZ21wLCBidXQgdmFzdGx5IHNpbXBsZXIKLS0gICAoYW5kIHNsb3dlcikgYWxnb3JpdGhtcy4gICovCi0tCi0tdHlwZWRlZiB1bnNpZ25lZCBpbnQgbXBfbGltYl90OwotLSMgZGVmaW5lIEdNUF9MSU1CX0JJVFMgMzIKLS10eXBlZGVmIGludCBtcF9saW1iX3ZlcmlmeVsyICogKHNpemVvZiAobXBfbGltYl90KSAqIENIQVJfQklUID09IEdNUF9MSU1CX0JJVFMpIC0gMV07Ci0tCi0tdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgbXBfdHdvbGltYl90OwotLSMgZGVmaW5lIEdNUF9UV09MSU1CX0JJVFMgNjQKLS10eXBlZGVmIGludCBtcF90d29saW1iX3ZlcmlmeVsyICogKHNpemVvZiAobXBfdHdvbGltYl90KSAqIENIQVJfQklUID09IEdNUF9UV09MSU1CX0JJVFMpIC0gMV07Ci0tCi0tLyogUmVwcmVzZW50YXRpb24gb2YgYSBiaWdudW0gPj0gMC4gICovCi0tdHlwZWRlZiBzdHJ1Y3QKLS17Ci0tICBzaXplX3QgbmxpbWJzOwotLSAgbXBfbGltYl90ICpsaW1iczsgLyogQml0cyBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLCBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4gICovCi0tfSBtcG5fdDsKLS0KLS0vKiBDb21wdXRlIHRoZSBwcm9kdWN0IG9mIHR3byBiaWdudW1zID49IDAuCi0tICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeQotLSAgIGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi0tc3RhdGljIHZvaWQgKgotLW11bHRpcGx5IChtcG5fdCBzcmMxLCBtcG5fdCBzcmMyLCBtcG5fdCAqZGVzdCkKLS17Ci0tICBjb25zdCBtcF9saW1iX3QgKnAxOwotLSAgY29uc3QgbXBfbGltYl90ICpwMjsKLS0gIHNpemVfdCBsZW4xOwotLSAgc2l6ZV90IGxlbjI7Ci0tCi0tICBpZiAoc3JjMS5ubGltYnMgPD0gc3JjMi5ubGltYnMpCi0tICAgIHsKLS0gICAgICBsZW4xID0gc3JjMS5ubGltYnM7Ci0tICAgICAgcDEgPSBzcmMxLmxpbWJzOwotLSAgICAgIGxlbjIgPSBzcmMyLm5saW1iczsKLS0gICAgICBwMiA9IHNyYzIubGltYnM7Ci0tICAgIH0KLS0gIGVsc2UKLS0gICAgewotLSAgICAgIGxlbjEgPSBzcmMyLm5saW1iczsKLS0gICAgICBwMSA9IHNyYzIubGltYnM7Ci0tICAgICAgbGVuMiA9IHNyYzEubmxpbWJzOwotLSAgICAgIHAyID0gc3JjMS5saW1iczsKLS0gICAgfQotLSAgLyogTm93IDAgPD0gbGVuMSA8PSBsZW4yLiAgKi8KLS0gIGlmIChsZW4xID09IDApCi0tICAgIHsKLS0gICAgICAvKiBzcmMxIG9yIHNyYzIgaXMgemVyby4gICovCi0tICAgICAgZGVzdC0+bmxpbWJzID0gMDsKLS0gICAgICBkZXN0LT5saW1icyA9IChtcF9saW1iX3QgKikgbWFsbG9jICgxKTsKLS0gICAgfQotLSAgZWxzZQotLSAgICB7Ci0tICAgICAgLyogSGVyZSAxIDw9IGxlbjEgPD0gbGVuMi4gICovCi0tICAgICAgc2l6ZV90IGRsZW47Ci0tICAgICAgbXBfbGltYl90ICpkcDsKLS0gICAgICBzaXplX3QgaywgaSwgajsKLS0KLS0gICAgICBkbGVuID0gbGVuMSArIGxlbjI7Ci0tICAgICAgZHAgPSAobXBfbGltYl90ICopIG1hbGxvYyAoZGxlbiAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0tICAgICAgaWYgKGRwID09IE5VTEwpCi0tCXJldHVybiBOVUxMOwotLSAgICAgIGZvciAoayA9IGxlbjI7IGsgPiAwOyApCi0tCWRwWy0ta10gPSAwOwotLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4xOyBpKyspCi0tCXsKLS0JICBtcF9saW1iX3QgZGlnaXQxID0gcDFbaV07Ci0tCSAgbXBfdHdvbGltYl90IGNhcnJ5ID0gMDsKLS0JICBmb3IgKGogPSAwOyBqIDwgbGVuMjsgaisrKQotLQkgICAgewotLQkgICAgICBtcF9saW1iX3QgZGlnaXQyID0gcDJbal07Ci0tCSAgICAgIGNhcnJ5ICs9IChtcF90d29saW1iX3QpIGRpZ2l0MSAqIChtcF90d29saW1iX3QpIGRpZ2l0MjsKLS0JICAgICAgY2FycnkgKz0gZHBbaSArIGpdOwotLQkgICAgICBkcFtpICsgal0gPSAobXBfbGltYl90KSBjYXJyeTsKLS0JICAgICAgY2FycnkgPSBjYXJyeSA+PiBHTVBfTElNQl9CSVRTOwotLQkgICAgfQotLQkgIGRwW2kgKyBsZW4yXSA9IChtcF9saW1iX3QpIGNhcnJ5OwotLQl9Ci0tICAgICAgLyogTm9ybWFsaXNlLiAgKi8KLS0gICAgICB3aGlsZSAoZGxlbiA+IDAgJiYgZHBbZGxlbiAtIDFdID09IDApCi0tCWRsZW4tLTsKLS0gICAgICBkZXN0LT5ubGltYnMgPSBkbGVuOwotLSAgICAgIGRlc3QtPmxpbWJzID0gZHA7Ci0tICAgIH0KLS0gIHJldHVybiBkZXN0LT5saW1iczsKLS19Ci0tCi0tLyogQ29tcHV0ZSB0aGUgcXVvdGllbnQgb2YgYSBiaWdudW0gYSA+PSAwIGFuZCBhIGJpZ251bSBiID4gMC4KLS0gICBhIGlzIHdyaXR0ZW4gYXMgIGEgPSBxICogYiArIHIgIHdpdGggMCA8PSByIDwgYi4gIHEgaXMgdGhlIHF1b3RpZW50LCByCi0tICAgdGhlIHJlbWFpbmRlci4KLS0gICBGaW5hbGx5LCByb3VuZC10by1ldmVuIGlzIHBlcmZvcm1lZDogSWYgciA+IGIvMiBvciBpZiByID0gYi8yIGFuZCBxIGlzIG9kZCwKLS0gICBxIGlzIGluY3JlbWVudGVkLgotLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkKLS0gICBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotLXN0YXRpYyB2b2lkICoKLS1kaXZpZGUgKG1wbl90IGEsIG1wbl90IGIsIG1wbl90ICpxKQotLXsKLS0gIC8qIEFsZ29yaXRobToKLS0gICAgIEZpcnN0IG5vcm1hbGlzZSBhIGFuZCBiOiBhPVthW20tMV0sLi4uLGFbMF1dLCBiPVtiW24tMV0sLi4uLGJbMF1dCi0tICAgICB3aXRoIG0+PTAgYW5kIG4+MCAoaW4gYmFzZSBiZXRhID0gMl5HTVBfTElNQl9CSVRTKS4KLS0gICAgIElmIG08biwgdGhlbiBxOj0wIGFuZCByOj1hLgotLSAgICAgSWYgbT49bj0xLCBwZXJmb3JtIGEgc2luZ2xlLXByZWNpc2lvbiBkaXZpc2lvbjoKLS0gICAgICAgcjo9MCwgajo9bSwKLS0gICAgICAgd2hpbGUgaj4wIGRvCi0tICAgICAgICAge0hlcmUgKHFbbS0xXSpiZXRhXihtLTEpKy4uLitxW2pdKmJldGFeaikgKiBiWzBdICsgcipiZXRhXmogPQotLSAgICAgICAgICAgICAgID0gYVttLTFdKmJldGFeKG0tMSkrLi4uK2Fbal0qYmV0YV5qIHVuZCAwPD1yPGJbMF08YmV0YX0KLS0gICAgICAgICBqOj1qLTEsIHI6PXIqYmV0YSthW2pdLCBxW2pdOj1mbG9vcihyL2JbMF0pLCByOj1yLWJbMF0qcVtqXS4KLS0gICAgICAgTm9ybWFsaXNlIFtxW20tMV0sLi4uLHFbMF1dLCB5aWVsZHMgcS4KLS0gICAgIElmIG0+PW4+MSwgcGVyZm9ybSBhIG11bHRpcGxlLXByZWNpc2lvbiBkaXZpc2lvbjoKLS0gICAgICAgV2UgaGF2ZSBhL2IgPCBiZXRhXihtLW4rMSkuCi0tICAgICAgIHM6PWludERzaXplLTEtKGhpZ2h0ZXN0IGJpdCBpbiBiW24tMV0pLCAwPD1zPGludERzaXplLgotLSAgICAgICBTaGlmdCBhIGFuZCBiIGxlZnQgYnkgcyBiaXRzLCBjb3B5aW5nIHRoZW0uIHI6PWEuCi0tICAgICAgIHI9W3JbbV0sLi4uLHJbMF1dLCBiPVtiW24tMV0sLi4uLGJbMF1dIHdpdGggYltuLTFdPj1iZXRhLzIuCi0tICAgICAgIEZvciBqPW0tbiwuLi4sMDoge0hlcmUgMCA8PSByIDwgYipiZXRhXihqKzEpLn0KLS0gICAgICAgICBDb21wdXRlIHEqIDoKLS0gICAgICAgICAgIHEqIDo9IGZsb29yKChyW2orbl0qYmV0YStyW2orbi0xXSkvYltuLTFdKS4KLS0gICAgICAgICAgIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgKHEqID49IGJldGEpIHNldCBxKiA6PSBiZXRhLTEuCi0tICAgICAgICAgICBDb21wdXRlIGMyIDo9ICgocltqK25dKmJldGErcltqK24tMV0pIC0gcSogKiBiW24tMV0pKmJldGEgKyByW2orbi0yXQotLSAgICAgICAgICAgYW5kIGMzIDo9IGJbbi0yXSAqIHEqLgotLSAgICAgICAgICAge1dlIGhhdmUgMCA8PSBjMiA8IDIqYmV0YV4yLCBldmVuIDAgPD0gYzIgPCBiZXRhXjIgaWYgbm8gb3ZlcmZsb3cKLS0gICAgICAgICAgICBvY2N1cnJlZC4gIEZ1cnRoZXJtb3JlIDAgPD0gYzMgPCBiZXRhXjIuCi0tICAgICAgICAgICAgSWYgdGhlcmUgd2FzIG92ZXJmbG93IGFuZAotLSAgICAgICAgICAgIHJbaituXSpiZXRhK3JbaituLTFdIC0gcSogKiBiW24tMV0gPj0gYmV0YSwgaS5lLiBjMiA+PSBiZXRhXjIsCi0tICAgICAgICAgICAgdGhlIG5leHQgdGVzdCBjYW4gYmUgc2tpcHBlZC59Ci0tICAgICAgICAgICBXaGlsZSBjMyA+IGMyLCB7SGVyZSAwIDw9IGMyIDwgYzMgPCBiZXRhXjJ9Ci0tICAgICAgICAgICAgIFB1dCBxKiA6PSBxKiAtIDEsIGMyIDo9IGMyICsgYltuLTFdKmJldGEsIGMzIDo9IGMzIC0gYltuLTJdLgotLSAgICAgICAgICAgSWYgcSogPiAwOgotLSAgICAgICAgICAgICBQdXQgciA6PSByIC0gYiAqIHEqICogYmV0YV5qLiBJbiBkZXRhaWw6Ci0tICAgICAgICAgICAgICAgW3JbbitqXSwuLi4scltqXV0gOj0gW3JbbitqXSwuLi4scltqXV0gLSBxKiAqIFtiW24tMV0sLi4uLGJbMF1dLgotLSAgICAgICAgICAgICAgIGhlbmNlOiB1Oj0wLCBmb3IgaTo9MCB0byBuLTEgZG8KLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1IDo9IHUgKyBxKiAqIGJbaV0sCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltqK2ldOj1yW2oraV0tKHUgbW9kIGJldGEpICgrIGJldGEsIGlmIGNhcnJ5KSwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Oj11IGRpdiBiZXRhICgrIDEsIGlmIGNhcnJ5IGluIHN1YnRyYWN0aW9uKQotLSAgICAgICAgICAgICAgICAgICAgICByW24ral06PXJbbitqXS11LgotLSAgICAgICAgICAgICAgIHtTaW5jZSBhbHdheXMgdSA9IChxKiAqIFtiW2ktMV0sLi4uLGJbMF1dIGRpdiBiZXRhXmkpICsgMQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IHEqICsgMSA8PSBiZXRhLAotLSAgICAgICAgICAgICAgICB0aGUgY2FycnkgdSBkb2VzIG5vdCBvdmVyZmxvdy59Ci0tICAgICAgICAgICAgIElmIGEgbmVnYXRpdmUgY2Fycnkgb2NjdXJzLCBwdXQgcSogOj0gcSogLSAxCi0tICAgICAgICAgICAgICAgYW5kIFtyW24ral0sLi4uLHJbal1dIDo9IFtyW24ral0sLi4uLHJbal1dICsgWzAsYltuLTFdLC4uLixiWzBdXS4KLS0gICAgICAgICBTZXQgcVtqXSA6PSBxKi4KLS0gICAgICAgTm9ybWFsaXNlIFtxW20tbl0sLi4scVswXV07IHRoaXMgeWllbGRzIHRoZSBxdW90aWVudCBxLgotLSAgICAgICBTaGlmdCBbcltuLTFdLC4uLixyWzBdXSByaWdodCBieSBzIGJpdHMgYW5kIG5vcm1hbGlzZTsgdGhpcyB5aWVsZHMgdGhlCi0tICAgICAgIHJlc3Qgci4KLS0gICAgICAgVGhlIHJvb20gZm9yIHFbal0gY2FuIGJlIGFsbG9jYXRlZCBhdCB0aGUgbWVtb3J5IGxvY2F0aW9uIG9mIHJbbitqXS4KLS0gICAgIEZpbmFsbHksIHJvdW5kLXRvLWV2ZW46Ci0tICAgICAgIFNoaWZ0IHIgbGVmdCBieSAxIGJpdC4KLS0gICAgICAgSWYgciA+IGIgb3IgaWYgciA9IGIgYW5kIHFbMF0gaXMgb2RkLCBxIDo9IHErMS4KLS0gICAqLwotLSAgY29uc3QgbXBfbGltYl90ICphX3B0ciA9IGEubGltYnM7Ci0tICBzaXplX3QgYV9sZW4gPSBhLm5saW1iczsKLS0gIGNvbnN0IG1wX2xpbWJfdCAqYl9wdHIgPSBiLmxpbWJzOwotLSAgc2l6ZV90IGJfbGVuID0gYi5ubGltYnM7Ci0tICBtcF9saW1iX3QgKnJvb21wdHI7Ci0tICBtcF9saW1iX3QgKnRtcF9yb29tcHRyID0gTlVMTDsKLS0gIG1wX2xpbWJfdCAqcV9wdHI7Ci0tICBzaXplX3QgcV9sZW47Ci0tICBtcF9saW1iX3QgKnJfcHRyOwotLSAgc2l6ZV90IHJfbGVuOwotLQotLSAgLyogQWxsb2NhdGUgcm9vbSBmb3IgYV9sZW4rMiBkaWdpdHMuCi0tICAgICAoTmVlZCBhX2xlbisxIGRpZ2l0cyBmb3IgdGhlIHJlYWwgZGl2aXNpb24gYW5kIDEgbW9yZSBkaWdpdCBmb3IgdGhlCi0tICAgICBmaW5hbCByb3VuZGluZyBvZiBxLikgICovCi0tICByb29tcHRyID0gKG1wX2xpbWJfdCAqKSBtYWxsb2MgKChhX2xlbiArIDIpICogc2l6ZW9mIChtcF9saW1iX3QpKTsKLS0gIGlmIChyb29tcHRyID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLQotLSAgLyogTm9ybWFsaXNlIGEuICAqLwotLSAgd2hpbGUgKGFfbGVuID4gMCAmJiBhX3B0clthX2xlbiAtIDFdID09IDApCi0tICAgIGFfbGVuLS07Ci0tCi0tICAvKiBOb3JtYWxpc2UgYi4gICovCi0tICBmb3IgKDs7KQotLSAgICB7Ci0tICAgICAgaWYgKGJfbGVuID09IDApCi0tCS8qIERpdmlzaW9uIGJ5IHplcm8uICAqLwotLQlhYm9ydCAoKTsKLS0gICAgICBpZiAoYl9wdHJbYl9sZW4gLSAxXSA9PSAwKQotLQliX2xlbi0tOwotLSAgICAgIGVsc2UKLS0JYnJlYWs7Ci0tICAgIH0KLS0KLS0gIC8qIEhlcmUgbSA9IGFfbGVuID49IDAgYW5kIG4gPSBiX2xlbiA+IDAuICAqLwotLQotLSAgaWYgKGFfbGVuIDwgYl9sZW4pCi0tICAgIHsKLS0gICAgICAvKiBtPG46IHRyaXZpYWwgY2FzZS4gIHE9MCwgciA6PSBjb3B5IG9mIGEuICAqLwotLSAgICAgIHJfcHRyID0gcm9vbXB0cjsKLS0gICAgICByX2xlbiA9IGFfbGVuOwotLSAgICAgIG1lbWNweSAocl9wdHIsIGFfcHRyLCBhX2xlbiAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0tICAgICAgcV9wdHIgPSByb29tcHRyICsgYV9sZW47Ci0tICAgICAgcV9sZW4gPSAwOwotLSAgICB9Ci0tICBlbHNlIGlmIChiX2xlbiA9PSAxKQotLSAgICB7Ci0tICAgICAgLyogbj0xOiBzaW5nbGUgcHJlY2lzaW9uIGRpdmlzaW9uLgotLQkgYmV0YV4obS0xKSA8PSBhIDwgYmV0YV5tICA9PT4gIGJldGFeKG0tMikgPD0gYS9iIDwgYmV0YV5tICAqLwotLSAgICAgIHJfcHRyID0gcm9vbXB0cjsKLS0gICAgICBxX3B0ciA9IHJvb21wdHIgKyAxOwotLSAgICAgIHsKLS0JbXBfbGltYl90IGRlbiA9IGJfcHRyWzBdOwotLQltcF9saW1iX3QgcmVtYWluZGVyID0gMDsKLS0JY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBhX3B0ciArIGFfbGVuOwotLQltcF9saW1iX3QgKmRlc3RwdHIgPSBxX3B0ciArIGFfbGVuOwotLQlzaXplX3QgY291bnQ7Ci0tCWZvciAoY291bnQgPSBhX2xlbjsgY291bnQgPiAwOyBjb3VudC0tKQotLQkgIHsKLS0JICAgIG1wX3R3b2xpbWJfdCBudW0gPQotLQkgICAgICAoKG1wX3R3b2xpbWJfdCkgcmVtYWluZGVyIDw8IEdNUF9MSU1CX0JJVFMpIHwgKi0tc291cmNlcHRyOwotLQkgICAgKi0tZGVzdHB0ciA9IG51bSAvIGRlbjsKLS0JICAgIHJlbWFpbmRlciA9IG51bSAlIGRlbjsKLS0JICB9Ci0tCS8qIE5vcm1hbGlzZSBhbmQgc3RvcmUgci4gICovCi0tCWlmIChyZW1haW5kZXIgPiAwKQotLQkgIHsKLS0JICAgIHJfcHRyWzBdID0gcmVtYWluZGVyOwotLQkgICAgcl9sZW4gPSAxOwotLQkgIH0KLS0JZWxzZQotLQkgIHJfbGVuID0gMDsKLS0JLyogTm9ybWFsaXNlIHEuICAqLwotLQlxX2xlbiA9IGFfbGVuOwotLQlpZiAocV9wdHJbcV9sZW4gLSAxXSA9PSAwKQotLQkgIHFfbGVuLS07Ci0tICAgICAgfQotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICAvKiBuPjE6IG11bHRpcGxlIHByZWNpc2lvbiBkaXZpc2lvbi4KLS0JIGJldGFeKG0tMSkgPD0gYSA8IGJldGFebSwgYmV0YV4obi0xKSA8PSBiIDwgYmV0YV5uICA9PT4KLS0JIGJldGFeKG0tbi0xKSA8PSBhL2IgPCBiZXRhXihtLW4rMSkuICAqLwotLSAgICAgIC8qIERldGVybWluZSBzLiAgKi8KLS0gICAgICBzaXplX3QgczsKLS0gICAgICB7Ci0tCW1wX2xpbWJfdCBtc2QgPSBiX3B0cltiX2xlbiAtIDFdOyAvKiA9IGJbbi0xXSwgPiAwICovCi0tCXMgPSAzMTsKLS0JaWYgKG1zZCA+PSAweDEwMDAwKQotLQkgIHsKLS0JICAgIG1zZCA9IG1zZCA+PiAxNjsKLS0JICAgIHMgLT0gMTY7Ci0tCSAgfQotLQlpZiAobXNkID49IDB4MTAwKQotLQkgIHsKLS0JICAgIG1zZCA9IG1zZCA+PiA4OwotLQkgICAgcyAtPSA4OwotLQkgIH0KLS0JaWYgKG1zZCA+PSAweDEwKQotLQkgIHsKLS0JICAgIG1zZCA9IG1zZCA+PiA0OwotLQkgICAgcyAtPSA0OwotLQkgIH0KLS0JaWYgKG1zZCA+PSAweDQpCi0tCSAgewotLQkgICAgbXNkID0gbXNkID4+IDI7Ci0tCSAgICBzIC09IDI7Ci0tCSAgfQotLQlpZiAobXNkID49IDB4MikKLS0JICB7Ci0tCSAgICBtc2QgPSBtc2QgPj4gMTsKLS0JICAgIHMgLT0gMTsKLS0JICB9Ci0tICAgICAgfQotLSAgICAgIC8qIDAgPD0gcyA8IEdNUF9MSU1CX0JJVFMuCi0tCSBDb3B5IGIsIHNoaWZ0aW5nIGl0IGxlZnQgYnkgcyBiaXRzLiAgKi8KLS0gICAgICBpZiAocyA+IDApCi0tCXsKLS0JICB0bXBfcm9vbXB0ciA9IChtcF9saW1iX3QgKikgbWFsbG9jIChiX2xlbiAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0tCSAgaWYgKHRtcF9yb29tcHRyID09IE5VTEwpCi0tCSAgICB7Ci0tCSAgICAgIGZyZWUgKHJvb21wdHIpOwotLQkgICAgICByZXR1cm4gTlVMTDsKLS0JICAgIH0KLS0JICB7Ci0tCSAgICBjb25zdCBtcF9saW1iX3QgKnNvdXJjZXB0ciA9IGJfcHRyOwotLQkgICAgbXBfbGltYl90ICpkZXN0cHRyID0gdG1wX3Jvb21wdHI7Ci0tCSAgICBtcF90d29saW1iX3QgYWNjdSA9IDA7Ci0tCSAgICBzaXplX3QgY291bnQ7Ci0tCSAgICBmb3IgKGNvdW50ID0gYl9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLS0JICAgICAgewotLQkJYWNjdSArPSAobXBfdHdvbGltYl90KSAqc291cmNlcHRyKysgPDwgczsKLS0JCSpkZXN0cHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotLQkJYWNjdSA9IGFjY3UgPj4gR01QX0xJTUJfQklUUzsKLS0JICAgICAgfQotLQkgICAgLyogYWNjdSBtdXN0IGJlIHplcm8sIHNpbmNlIHRoYXQgd2FzIGhvdyBzIHdhcyBkZXRlcm1pbmVkLiAgKi8KLS0JICAgIGlmIChhY2N1ICE9IDApCi0tCSAgICAgIGFib3J0ICgpOwotLQkgIH0KLS0JICBiX3B0ciA9IHRtcF9yb29tcHRyOwotLQl9Ci0tICAgICAgLyogQ29weSBhLCBzaGlmdGluZyBpdCBsZWZ0IGJ5IHMgYml0cywgeWllbGRzIHIuCi0tCSBNZW1vcnkgbGF5b3V0OgotLQkgQXQgdGhlIGJlZ2lubmluZzogciA9IHJvb21wdHJbMC4uYV9sZW5dLAotLQkgYXQgdGhlIGVuZDogciA9IHJvb21wdHJbMC4uYl9sZW4tMV0sIHEgPSByb29tcHRyW2JfbGVuLi5hX2xlbl0gICovCi0tICAgICAgcl9wdHIgPSByb29tcHRyOwotLSAgICAgIGlmIChzID09IDApCi0tCXsKLS0JICBtZW1jcHkgKHJfcHRyLCBhX3B0ciwgYV9sZW4gKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotLQkgIHJfcHRyW2FfbGVuXSA9IDA7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICBjb25zdCBtcF9saW1iX3QgKnNvdXJjZXB0ciA9IGFfcHRyOwotLQkgIG1wX2xpbWJfdCAqZGVzdHB0ciA9IHJfcHRyOwotLQkgIG1wX3R3b2xpbWJfdCBhY2N1ID0gMDsKLS0JICBzaXplX3QgY291bnQ7Ci0tCSAgZm9yIChjb3VudCA9IGFfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCSAgICB7Ci0tCSAgICAgIGFjY3UgKz0gKG1wX3R3b2xpbWJfdCkgKnNvdXJjZXB0cisrIDw8IHM7Ci0tCSAgICAgICpkZXN0cHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotLQkgICAgICBhY2N1ID0gYWNjdSA+PiBHTVBfTElNQl9CSVRTOwotLQkgICAgfQotLQkgICpkZXN0cHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotLQl9Ci0tICAgICAgcV9wdHIgPSByb29tcHRyICsgYl9sZW47Ci0tICAgICAgcV9sZW4gPSBhX2xlbiAtIGJfbGVuICsgMTsgLyogcSB3aWxsIGhhdmUgbS1uKzEgbGltYnMgKi8KLS0gICAgICB7Ci0tCXNpemVfdCBqID0gYV9sZW4gLSBiX2xlbjsgLyogbS1uICovCi0tCW1wX2xpbWJfdCBiX21zZCA9IGJfcHRyW2JfbGVuIC0gMV07IC8qIGJbbi0xXSAqLwotLQltcF9saW1iX3QgYl8ybXNkID0gYl9wdHJbYl9sZW4gLSAyXTsgLyogYltuLTJdICovCi0tCW1wX3R3b2xpbWJfdCBiX21zZGQgPSAvKiBiW24tMV0qYmV0YStiW24tMl0gKi8KLS0JICAoKG1wX3R3b2xpbWJfdCkgYl9tc2QgPDwgR01QX0xJTUJfQklUUykgfCBiXzJtc2Q7Ci0tCS8qIERpdmlzaW9uIGxvb3AsIHRyYXZlcnNlZCBtLW4rMSB0aW1lcy4KLS0JICAgaiBjb3VudHMgZG93biwgYiBpcyB1bmNoYW5nZWQsIGJldGEvMiA8PSBiW24tMV0gPCBiZXRhLiAgKi8KLS0JZm9yICg7OykKLS0JICB7Ci0tCSAgICBtcF9saW1iX3QgcV9zdGFyOwotLQkgICAgbXBfbGltYl90IGMxOwotLQkgICAgaWYgKHJfcHRyW2ogKyBiX2xlbl0gPCBiX21zZCkgLyogcltqK25dIDwgYltuLTFdID8gKi8KLS0JICAgICAgewotLQkJLyogRGl2aWRlIHJbaituXSpiZXRhK3JbaituLTFdIGJ5IGJbbi0xXSwgbm8gb3ZlcmZsb3cuICAqLwotLQkJbXBfdHdvbGltYl90IG51bSA9Ci0tCQkgICgobXBfdHdvbGltYl90KSByX3B0cltqICsgYl9sZW5dIDw8IEdNUF9MSU1CX0JJVFMpCi0tCQkgIHwgcl9wdHJbaiArIGJfbGVuIC0gMV07Ci0tCQlxX3N0YXIgPSBudW0gLyBiX21zZDsKLS0JCWMxID0gbnVtICUgYl9tc2Q7Ci0tCSAgICAgIH0KLS0JICAgIGVsc2UKLS0JICAgICAgewotLQkJLyogT3ZlcmZsb3csIGhlbmNlIHJbaituXSpiZXRhK3JbaituLTFdID49IGJldGEqYltuLTFdLiAgKi8KLS0JCXFfc3RhciA9IChtcF9saW1iX3QpfihtcF9saW1iX3QpMDsgLyogcSogPSBiZXRhLTEgKi8KLS0JCS8qIFRlc3Qgd2hldGhlciByW2orbl0qYmV0YStyW2orbi0xXSAtIChiZXRhLTEpKmJbbi0xXSA+PSBiZXRhCi0tCQkgICA8PT0+IHJbaituXSpiZXRhK3JbaituLTFdICsgYltuLTFdID49IGJldGEqYltuLTFdK2JldGEKLS0JCSAgIDw9PT4gYltuLTFdIDwgZmxvb3IoKHJbaituXSpiZXRhK3JbaituLTFdK2Jbbi0xXSkvYmV0YSkKLS0JCSAgICAgICAgezw9IGJldGEgIX0uCi0tCQkgICBJZiB5ZXMsIGp1bXAgZGlyZWN0bHkgdG8gdGhlIHN1YnRyYWN0aW9uIGxvb3AuCi0tCQkgICAoT3RoZXJ3aXNlLCByW2orbl0qYmV0YStyW2orbi0xXSAtIChiZXRhLTEpKmJbbi0xXSA8IGJldGEKLS0JCSAgICA8PT0+IGZsb29yKChyW2orbl0qYmV0YStyW2orbi0xXStiW24tMV0pL2JldGEpID0gYltuLTFdICkgKi8KLS0JCWlmIChyX3B0cltqICsgYl9sZW5dID4gYl9tc2QKLS0JCSAgICB8fCAoYzEgPSByX3B0cltqICsgYl9sZW4gLSAxXSArIGJfbXNkKSA8IGJfbXNkKQotLQkJICAvKiByW2orbl0gPj0gYltuLTFdKzEgb3IKLS0JCSAgICAgcltqK25dID0gYltuLTFdIGFuZCB0aGUgYWRkaXRpb24gcltqK24tMV0rYltuLTFdIGdpdmVzIGEKLS0JCSAgICAgY2FycnkuICAqLwotLQkJICBnb3RvIHN1YnRyYWN0OwotLQkgICAgICB9Ci0tCSAgICAvKiBxX3N0YXIgPSBxKiwKLS0JICAgICAgIGMxID0gKHJbaituXSpiZXRhK3JbaituLTFdKSAtIHEqICogYltuLTFdICg+PTAsIDxiZXRhKS4gICovCi0tCSAgICB7Ci0tCSAgICAgIG1wX3R3b2xpbWJfdCBjMiA9IC8qIGMxKmJldGErcltqK24tMl0gKi8KLS0JCSgobXBfdHdvbGltYl90KSBjMSA8PCBHTVBfTElNQl9CSVRTKSB8IHJfcHRyW2ogKyBiX2xlbiAtIDJdOwotLQkgICAgICBtcF90d29saW1iX3QgYzMgPSAvKiBiW24tMl0gKiBxKiAqLwotLQkJKG1wX3R3b2xpbWJfdCkgYl8ybXNkICogKG1wX3R3b2xpbWJfdCkgcV9zdGFyOwotLQkgICAgICAvKiBXaGlsZSBjMiA8IGMzLCBpbmNyZWFzZSBjMiBhbmQgZGVjcmVhc2UgYzMuCi0tCQkgQ29uc2lkZXIgYzMtYzIuICBXaGlsZSBpdCBpcyA+IDAsIGRlY3JlYXNlIGl0IGJ5Ci0tCQkgYltuLTFdKmJldGErYltuLTJdLiAgQmVjYXVzZSBvZiBiW24tMV0qYmV0YStiW24tMl0gPj0gYmV0YV4yLzIKLS0JCSB0aGlzIGNhbiBoYXBwZW4gb25seSB0d2ljZS4gICovCi0tCSAgICAgIGlmIChjMyA+IGMyKQotLQkJewotLQkJICBxX3N0YXIgPSBxX3N0YXIgLSAxOyAvKiBxKiA6PSBxKiAtIDEgKi8KLS0JCSAgaWYgKGMzIC0gYzIgPiBiX21zZGQpCi0tCQkgICAgcV9zdGFyID0gcV9zdGFyIC0gMTsgLyogcSogOj0gcSogLSAxICovCi0tCQl9Ci0tCSAgICB9Ci0tCSAgICBpZiAocV9zdGFyID4gMCkKLS0JICAgICAgc3VidHJhY3Q6Ci0tCSAgICAgIHsKLS0JCS8qIFN1YnRyYWN0IHIgOj0gciAtIGIgKiBxKiAqIGJldGFeai4gICovCi0tCQltcF9saW1iX3QgY3I7Ci0tCQl7Ci0tCQkgIGNvbnN0IG1wX2xpbWJfdCAqc291cmNlcHRyID0gYl9wdHI7Ci0tCQkgIG1wX2xpbWJfdCAqZGVzdHB0ciA9IHJfcHRyICsgajsKLS0JCSAgbXBfdHdvbGltYl90IGNhcnJ5ID0gMDsKLS0JCSAgc2l6ZV90IGNvdW50OwotLQkJICBmb3IgKGNvdW50ID0gYl9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLS0JCSAgICB7Ci0tCQkgICAgICAvKiBIZXJlIDAgPD0gY2FycnkgPD0gcSouICAqLwotLQkJICAgICAgY2FycnkgPQotLQkJCWNhcnJ5Ci0tCQkJKyAobXBfdHdvbGltYl90KSBxX3N0YXIgKiAobXBfdHdvbGltYl90KSAqc291cmNlcHRyKysKLS0JCQkrIChtcF9saW1iX3QpIH4oKmRlc3RwdHIpOwotLQkJICAgICAgLyogSGVyZSAwIDw9IGNhcnJ5IDw9IGJldGEqcSogKyBiZXRhLTEuICAqLwotLQkJICAgICAgKmRlc3RwdHIrKyA9IH4obXBfbGltYl90KSBjYXJyeTsKLS0JCSAgICAgIGNhcnJ5ID0gY2FycnkgPj4gR01QX0xJTUJfQklUUzsgLyogPD0gcSogKi8KLS0JCSAgICB9Ci0tCQkgIGNyID0gKG1wX2xpbWJfdCkgY2Fycnk7Ci0tCQl9Ci0tCQkvKiBTdWJ0cmFjdCBjciBmcm9tIHJfcHRyW2ogKyBiX2xlbl0sIHRoZW4gZm9yZ2V0IGFib3V0Ci0tCQkgICByX3B0cltqICsgYl9sZW5dLiAgKi8KLS0JCWlmIChjciA+IHJfcHRyW2ogKyBiX2xlbl0pCi0tCQkgIHsKLS0JCSAgICAvKiBTdWJ0cmFjdGlvbiBnYXZlIGEgY2FycnkuICAqLwotLQkJICAgIHFfc3RhciA9IHFfc3RhciAtIDE7IC8qIHEqIDo9IHEqIC0gMSAqLwotLQkJICAgIC8qIEFkZCBiIGJhY2suICAqLwotLQkJICAgIHsKLS0JCSAgICAgIGNvbnN0IG1wX2xpbWJfdCAqc291cmNlcHRyID0gYl9wdHI7Ci0tCQkgICAgICBtcF9saW1iX3QgKmRlc3RwdHIgPSByX3B0ciArIGo7Ci0tCQkgICAgICBtcF9saW1iX3QgY2FycnkgPSAwOwotLQkJICAgICAgc2l6ZV90IGNvdW50OwotLQkJICAgICAgZm9yIChjb3VudCA9IGJfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCQkJewotLQkJCSAgbXBfbGltYl90IHNvdXJjZTEgPSAqc291cmNlcHRyKys7Ci0tCQkJICBtcF9saW1iX3Qgc291cmNlMiA9ICpkZXN0cHRyOwotLQkJCSAgKmRlc3RwdHIrKyA9IHNvdXJjZTEgKyBzb3VyY2UyICsgY2Fycnk7Ci0tCQkJICBjYXJyeSA9Ci0tCQkJICAgIChjYXJyeQotLQkJCSAgICAgPyBzb3VyY2UxID49IChtcF9saW1iX3QpIH5zb3VyY2UyCi0tCQkJICAgICA6IHNvdXJjZTEgPiAobXBfbGltYl90KSB+c291cmNlMik7Ci0tCQkJfQotLQkJICAgIH0KLS0JCSAgICAvKiBGb3JnZXQgYWJvdXQgdGhlIGNhcnJ5IGFuZCBhYm91dCByW2orbl0uICAqLwotLQkJICB9Ci0tCSAgICAgIH0KLS0JICAgIC8qIHEqIGlzIGRldGVybWluZWQuICBTdG9yZSBpdCBhcyBxW2pdLiAgKi8KLS0JICAgIHFfcHRyW2pdID0gcV9zdGFyOwotLQkgICAgaWYgKGogPT0gMCkKLS0JICAgICAgYnJlYWs7Ci0tCSAgICBqLS07Ci0tCSAgfQotLSAgICAgIH0KLS0gICAgICByX2xlbiA9IGJfbGVuOwotLSAgICAgIC8qIE5vcm1hbGlzZSBxLiAgKi8KLS0gICAgICBpZiAocV9wdHJbcV9sZW4gLSAxXSA9PSAwKQotLQlxX2xlbi0tOwotLSMgaWYgMCAvKiBOb3QgbmVlZGVkIGhlcmUsIHNpbmNlIHdlIG5lZWQgciBvbmx5IHRvIGNvbXBhcmUgaXQgd2l0aCBiLzIsIGFuZAotLQkgIGIgaXMgc2hpZnRlZCBsZWZ0IGJ5IHMgYml0cy4gICovCi0tICAgICAgLyogU2hpZnQgciByaWdodCBieSBzIGJpdHMuICAqLwotLSAgICAgIGlmIChzID4gMCkKLS0JewotLQkgIG1wX2xpbWJfdCBwdHIgPSByX3B0ciArIHJfbGVuOwotLQkgIG1wX3R3b2xpbWJfdCBhY2N1ID0gMDsKLS0JICBzaXplX3QgY291bnQ7Ci0tCSAgZm9yIChjb3VudCA9IHJfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCSAgICB7Ci0tCSAgICAgIGFjY3UgPSAobXBfdHdvbGltYl90KSAobXBfbGltYl90KSBhY2N1IDw8IEdNUF9MSU1CX0JJVFM7Ci0tCSAgICAgIGFjY3UgKz0gKG1wX3R3b2xpbWJfdCkgKi0tcHRyIDw8IChHTVBfTElNQl9CSVRTIC0gcyk7Ci0tCSAgICAgICpwdHIgPSAobXBfbGltYl90KSAoYWNjdSA+PiBHTVBfTElNQl9CSVRTKTsKLS0JICAgIH0KLS0JfQotLSMgZW5kaWYKLS0gICAgICAvKiBOb3JtYWxpc2Ugci4gICovCi0tICAgICAgd2hpbGUgKHJfbGVuID4gMCAmJiByX3B0cltyX2xlbiAtIDFdID09IDApCi0tCXJfbGVuLS07Ci0tICAgIH0KLS0gIC8qIENvbXBhcmUgciA8PCAxIHdpdGggYi4gICovCi0tICBpZiAocl9sZW4gPiBiX2xlbikKLS0gICAgZ290byBpbmNyZW1lbnRfcTsKLS0gIHsKLS0gICAgc2l6ZV90IGk7Ci0tICAgIGZvciAoaSA9IGJfbGVuOzspCi0tICAgICAgewotLQltcF9saW1iX3Qgcl9pID0KLS0JICAoaSA8PSByX2xlbiAmJiBpID4gMCA/IHJfcHRyW2kgLSAxXSA+PiAoR01QX0xJTUJfQklUUyAtIDEpIDogMCkKLS0JICB8IChpIDwgcl9sZW4gPyByX3B0cltpXSA8PCAxIDogMCk7Ci0tCW1wX2xpbWJfdCBiX2kgPSAoaSA8IGJfbGVuID8gYl9wdHJbaV0gOiAwKTsKLS0JaWYgKHJfaSA+IGJfaSkKLS0JICBnb3RvIGluY3JlbWVudF9xOwotLQlpZiAocl9pIDwgYl9pKQotLQkgIGdvdG8ga2VlcF9xOwotLQlpZiAoaSA9PSAwKQotLQkgIGJyZWFrOwotLQlpLS07Ci0tICAgICAgfQotLSAgfQotLSAgaWYgKHFfbGVuID4gMCAmJiAoKHFfcHRyWzBdICYgMSkgIT0gMCkpCi0tICAgIC8qIHEgaXMgb2RkLiAgKi8KLS0gICAgaW5jcmVtZW50X3E6Ci0tICAgIHsKLS0gICAgICBzaXplX3QgaTsKLS0gICAgICBmb3IgKGkgPSAwOyBpIDwgcV9sZW47IGkrKykKLS0JaWYgKCsrKHFfcHRyW2ldKSAhPSAwKQotLQkgIGdvdG8ga2VlcF9xOwotLSAgICAgIHFfcHRyW3FfbGVuKytdID0gMTsKLS0gICAgfQotLSAga2VlcF9xOgotLSAgaWYgKHRtcF9yb29tcHRyICE9IE5VTEwpCi0tICAgIGZyZWUgKHRtcF9yb29tcHRyKTsKLS0gIHEtPmxpbWJzID0gcV9wdHI7Ci0tICBxLT5ubGltYnMgPSBxX2xlbjsKLS0gIHJldHVybiByb29tcHRyOwotLX0KLS0KLS0vKiBDb252ZXJ0IGEgYmlnbnVtIGEgPj0gMCwgbXVsdGlwbGllZCB3aXRoIDEwXmV4dHJhX3plcm9lcywgdG8gZGVjaW1hbAotLSAgIHJlcHJlc2VudGF0aW9uLgotLSAgIERlc3Ryb3lzIHRoZSBjb250ZW50cyBvZiBhLgotLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAtIGNvbnRhaW5pbmcgdGhlIGRlY2ltYWwgZGlnaXRzIGluIGxvdy10by1oaWdoCi0tICAgb3JkZXIsIHRlcm1pbmF0ZWQgd2l0aCBhIE5VTCBjaGFyYWN0ZXIgLSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZQotLSAgIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotLXN0YXRpYyBjaGFyICoKLS1jb252ZXJ0X3RvX2RlY2ltYWwgKG1wbl90IGEsIHNpemVfdCBleHRyYV96ZXJvZXMpCi0tewotLSAgbXBfbGltYl90ICphX3B0ciA9IGEubGltYnM7Ci0tICBzaXplX3QgYV9sZW4gPSBhLm5saW1iczsKLS0gIC8qIDAuMDMzNDUgaXMgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gbG9nKDIpLyg5KmxvZygxMCkpLiAgKi8KLS0gIHNpemVfdCBjX2xlbiA9IDkgKiAoKHNpemVfdCkoYV9sZW4gKiAoR01QX0xJTUJfQklUUyAqIDAuMDMzNDVmKSkgKyAxKTsKLS0gIGNoYXIgKmNfcHRyID0gKGNoYXIgKikgbWFsbG9jICh4c3VtIChjX2xlbiwgZXh0cmFfemVyb2VzKSk7Ci0tICBpZiAoY19wdHIgIT0gTlVMTCkKLS0gICAgewotLSAgICAgIGNoYXIgKmRfcHRyID0gY19wdHI7Ci0tICAgICAgZm9yICg7IGV4dHJhX3plcm9lcyA+IDA7IGV4dHJhX3plcm9lcy0tKQotLQkqZF9wdHIrKyA9ICcwJzsKLS0gICAgICB3aGlsZSAoYV9sZW4gPiAwKQotLQl7Ci0tCSAgLyogRGl2aWRlIGEgYnkgMTBeOSwgaW4tcGxhY2UuICAqLwotLQkgIG1wX2xpbWJfdCByZW1haW5kZXIgPSAwOwotLQkgIG1wX2xpbWJfdCAqcHRyID0gYV9wdHIgKyBhX2xlbjsKLS0JICBzaXplX3QgY291bnQ7Ci0tCSAgZm9yIChjb3VudCA9IGFfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCSAgICB7Ci0tCSAgICAgIG1wX3R3b2xpbWJfdCBudW0gPQotLQkJKChtcF90d29saW1iX3QpIHJlbWFpbmRlciA8PCBHTVBfTElNQl9CSVRTKSB8ICotLXB0cjsKLS0JICAgICAgKnB0ciA9IG51bSAvIDEwMDAwMDAwMDA7Ci0tCSAgICAgIHJlbWFpbmRlciA9IG51bSAlIDEwMDAwMDAwMDA7Ci0tCSAgICB9Ci0tCSAgLyogU3RvcmUgdGhlIHJlbWFpbmRlciBhcyA5IGRlY2ltYWwgZGlnaXRzLiAgKi8KLS0JICBmb3IgKGNvdW50ID0gOTsgY291bnQgPiAwOyBjb3VudC0tKQotLQkgICAgewotLQkgICAgICAqZF9wdHIrKyA9ICcwJyArIChyZW1haW5kZXIgJSAxMCk7Ci0tCSAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlciAvIDEwOwotLQkgICAgfQotLQkgIC8qIE5vcm1hbGl6ZSBhLiAgKi8KLS0JICBpZiAoYV9wdHJbYV9sZW4gLSAxXSA9PSAwKQotLQkgICAgYV9sZW4tLTsKLS0JfQotLSAgICAgIC8qIFJlbW92ZSBsZWFkaW5nIHplcm9lcy4gICovCi0tICAgICAgd2hpbGUgKGRfcHRyID4gY19wdHIgJiYgZF9wdHJbLTFdID09ICcwJykKLS0JZF9wdHItLTsKLS0gICAgICAvKiBCdXQga2VlcCBhdCBsZWFzdCBvbmUgemVyby4gICovCi0tICAgICAgaWYgKGRfcHRyID09IGNfcHRyKQotLQkqZF9wdHIrKyA9ICcwJzsKLS0gICAgICAvKiBUZXJtaW5hdGUgdGhlIHN0cmluZy4gICovCi0tICAgICAgKmRfcHRyID0gJ1wwJzsKLS0gICAgfQotLSAgcmV0dXJuIGNfcHRyOwotLX0KLS0KLS0jIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0tCi0tLyogQXNzdW1pbmcgeCBpcyBmaW5pdGUgYW5kID49IDA6Ci0tICAgd3JpdGUgeCBhcyB4ID0gMl5lICogbSwgd2hlcmUgbSBpcyBhIGJpZ251bS4KLS0gICBSZXR1cm4gdGhlIGFsbG9jYXRlZCBtZW1vcnkgaW4gY2FzZSBvZiBzdWNjZXNzLCBOVUxMIGluIGNhc2Ugb2YgbWVtb3J5Ci0tICAgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KLS1zdGF0aWMgdm9pZCAqCi0tZGVjb2RlX2xvbmdfZG91YmxlIChsb25nIGRvdWJsZSB4LCBpbnQgKmVwLCBtcG5fdCAqbXApCi0tewotLSAgbXBuX3QgbTsKLS0gIGludCBleHA7Ci0tICBsb25nIGRvdWJsZSB5OwotLSAgc2l6ZV90IGk7Ci0tCi0tICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc3VsdC4gICovCi0tICBtLm5saW1icyA9IChMREJMX01BTlRfQklUICsgR01QX0xJTUJfQklUUyAtIDEpIC8gR01QX0xJTUJfQklUUzsKLS0gIG0ubGltYnMgPSAobXBfbGltYl90ICopIG1hbGxvYyAobS5ubGltYnMgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotLSAgaWYgKG0ubGltYnMgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICAvKiBTcGxpdCBpbnRvIGV4cG9uZW50aWFsIHBhcnQgYW5kIG1hbnRpc3NhLiAgKi8KLS0gIHkgPSBmcmV4cGwgKHgsICZleHApOwotLSAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLS0gICAgYWJvcnQgKCk7Ci0tICAvKiB4ID0gMl5leHAgKiB5ID0gMl4oZXhwIC0gTERCTF9NQU5UX0JJVCkgKiAoeSAqIExEQkxfTUFOVF9CSVQpLCBhbmQgdGhlCi0tICAgICBsYXR0ZXIgaXMgYW4gaW50ZWdlci4gICovCi0tICAvKiBDb252ZXJ0IHRoZSBtYW50aXNzYSAoeSAqIExEQkxfTUFOVF9CSVQpIHRvIGEgc2VxdWVuY2Ugb2YgbGltYnMuCi0tICAgICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCdzIHNhZmUgdG8gY2FzdCBhICdsb25nIGRvdWJsZScgdmFsdWUgYmV0d2VlbgotLSAgICAgMl4zMSBhbmQgMl4zMiB0byAndW5zaWduZWQgaW50JywgdGhlcmVmb3JlIHBsYXkgc2FmZSBhbmQgY2FzdCBvbmx5Ci0tICAgICAnbG9uZyBkb3VibGUnIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDJeMTYgKHRvICd1bnNpZ25lZCBpbnQnIG9yICdpbnQnLAotLSAgICAgZG9lc24ndCBtYXR0ZXIpLiAgKi8KLS0jICBpZiAoTERCTF9NQU5UX0JJVCAlIEdNUF9MSU1CX0JJVFMpICE9IDAKLS0jICAgaWYgKExEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKSA+IEdNUF9MSU1CX0JJVFMgLyAyCi0tICAgIHsKLS0gICAgICBtcF9saW1iX3QgaGksIGxvOwotLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoTERCTF9NQU5UX0JJVCAlIChHTVBfTElNQl9CSVRTIC8gMikpOwotLSAgICAgIGhpID0gKGludCkgeTsKLS0gICAgICB5IC09IGhpOwotLSAgICAgIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0tCWFib3J0ICgpOwotLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpOwotLSAgICAgIGxvID0gKGludCkgeTsKLS0gICAgICB5IC09IGxvOwotLSAgICAgIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0tCWFib3J0ICgpOwotLSAgICAgIG0ubGltYnNbTERCTF9NQU5UX0JJVCAvIEdNUF9MSU1CX0JJVFNdID0gKGhpIDw8IChHTVBfTElNQl9CSVRTIC8gMikpIHwgbG87Ci0tICAgIH0KLS0jICAgZWxzZQotLSAgICB7Ci0tICAgICAgbXBfbGltYl90IGQ7Ci0tICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChMREJMX01BTlRfQklUICUgR01QX0xJTUJfQklUUyk7Ci0tICAgICAgZCA9IChpbnQpIHk7Ci0tICAgICAgeSAtPSBkOwotLSAgICAgIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0tCWFib3J0ICgpOwotLSAgICAgIG0ubGltYnNbTERCTF9NQU5UX0JJVCAvIEdNUF9MSU1CX0JJVFNdID0gZDsKLS0gICAgfQotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tICBmb3IgKGkgPSBMREJMX01BTlRfQklUIC8gR01QX0xJTUJfQklUUzsgaSA+IDA7ICkKLS0gICAgewotLSAgICAgIG1wX2xpbWJfdCBoaSwgbG87Ci0tICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC8gMik7Ci0tICAgICAgaGkgPSAoaW50KSB5OwotLSAgICAgIHkgLT0gaGk7Ci0tICAgICAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC8gMik7Ci0tICAgICAgbG8gPSAoaW50KSB5OwotLSAgICAgIHkgLT0gbG87Ci0tICAgICAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbS5saW1ic1stLWldID0gKGhpIDw8IChHTVBfTElNQl9CSVRTIC8gMikpIHwgbG87Ci0tICAgIH0KLS0gIGlmICghKHkgPT0gMC4wTCkpCi0tICAgIGFib3J0ICgpOwotLSAgLyogTm9ybWFsaXNlLiAgKi8KLS0gIHdoaWxlIChtLm5saW1icyA+IDAgJiYgbS5saW1ic1ttLm5saW1icyAtIDFdID09IDApCi0tICAgIG0ubmxpbWJzLS07Ci0tICAqbXAgPSBtOwotLSAgKmVwID0gZXhwIC0gTERCTF9NQU5UX0JJVDsKLS0gIHJldHVybiBtLmxpbWJzOwotLX0KLS0KLS0jIGVuZGlmCi0tCi0tIyBpZiBORUVEX1BSSU5URl9ET1VCTEUKLS0KLS0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPj0gMDoKLS0gICB3cml0ZSB4IGFzIHggPSAyXmUgKiBtLCB3aGVyZSBtIGlzIGEgYmlnbnVtLgotLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkKLS0gICBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotLXN0YXRpYyB2b2lkICoKLS1kZWNvZGVfZG91YmxlIChkb3VibGUgeCwgaW50ICplcCwgbXBuX3QgKm1wKQotLXsKLS0gIG1wbl90IG07Ci0tICBpbnQgZXhwOwotLSAgZG91YmxlIHk7Ci0tICBzaXplX3QgaTsKLS0KLS0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzdWx0LiAgKi8KLS0gIG0ubmxpbWJzID0gKERCTF9NQU5UX0JJVCArIEdNUF9MSU1CX0JJVFMgLSAxKSAvIEdNUF9MSU1CX0JJVFM7Ci0tICBtLmxpbWJzID0gKG1wX2xpbWJfdCAqKSBtYWxsb2MgKG0ubmxpbWJzICogc2l6ZW9mIChtcF9saW1iX3QpKTsKLS0gIGlmIChtLmxpbWJzID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLSAgLyogU3BsaXQgaW50byBleHBvbmVudGlhbCBwYXJ0IGFuZCBtYW50aXNzYS4gICovCi0tICB5ID0gZnJleHAgKHgsICZleHApOwotLSAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0tICAgIGFib3J0ICgpOwotLSAgLyogeCA9IDJeZXhwICogeSA9IDJeKGV4cCAtIERCTF9NQU5UX0JJVCkgKiAoeSAqIERCTF9NQU5UX0JJVCksIGFuZCB0aGUKLS0gICAgIGxhdHRlciBpcyBhbiBpbnRlZ2VyLiAgKi8KLS0gIC8qIENvbnZlcnQgdGhlIG1hbnRpc3NhICh5ICogREJMX01BTlRfQklUKSB0byBhIHNlcXVlbmNlIG9mIGxpbWJzLgotLSAgICAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQncyBzYWZlIHRvIGNhc3QgYSAnZG91YmxlJyB2YWx1ZSBiZXR3ZWVuCi0tICAgICAyXjMxIGFuZCAyXjMyIHRvICd1bnNpZ25lZCBpbnQnLCB0aGVyZWZvcmUgcGxheSBzYWZlIGFuZCBjYXN0IG9ubHkKLS0gICAgICdkb3VibGUnIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDJeMTYgKHRvICd1bnNpZ25lZCBpbnQnIG9yICdpbnQnLAotLSAgICAgZG9lc24ndCBtYXR0ZXIpLiAgKi8KLS0jICBpZiAoREJMX01BTlRfQklUICUgR01QX0xJTUJfQklUUykgIT0gMAotLSMgICBpZiAoREJMX01BTlRfQklUICUgR01QX0xJTUJfQklUUykgPiBHTVBfTElNQl9CSVRTIC8gMgotLSAgICB7Ci0tICAgICAgbXBfbGltYl90IGhpLCBsbzsKLS0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKERCTF9NQU5UX0JJVCAlIChHTVBfTElNQl9CSVRTIC8gMikpOwotLSAgICAgIGhpID0gKGludCkgeTsKLS0gICAgICB5IC09IGhpOwotLSAgICAgIGlmICghKHkgPj0gMC4wICYmIHkgPCAxLjApKQotLQlhYm9ydCAoKTsKLS0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKTsKLS0gICAgICBsbyA9IChpbnQpIHk7Ci0tICAgICAgeSAtPSBsbzsKLS0gICAgICBpZiAoISh5ID49IDAuMCAmJiB5IDwgMS4wKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgbS5saW1ic1tEQkxfTUFOVF9CSVQgLyBHTVBfTElNQl9CSVRTXSA9IChoaSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSB8IGxvOwotLSAgICB9Ci0tIyAgIGVsc2UKLS0gICAgewotLSAgICAgIG1wX2xpbWJfdCBkOwotLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoREJMX01BTlRfQklUICUgR01QX0xJTUJfQklUUyk7Ci0tICAgICAgZCA9IChpbnQpIHk7Ci0tICAgICAgeSAtPSBkOwotLSAgICAgIGlmICghKHkgPj0gMC4wICYmIHkgPCAxLjApKQotLQlhYm9ydCAoKTsKLS0gICAgICBtLmxpbWJzW0RCTF9NQU5UX0JJVCAvIEdNUF9MSU1CX0JJVFNdID0gZDsKLS0gICAgfQotLSMgICBlbmRpZgotLSMgIGVuZGlmCi0tICBmb3IgKGkgPSBEQkxfTUFOVF9CSVQgLyBHTVBfTElNQl9CSVRTOyBpID4gMDsgKQotLSAgICB7Ci0tICAgICAgbXBfbGltYl90IGhpLCBsbzsKLS0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKTsKLS0gICAgICBoaSA9IChpbnQpIHk7Ci0tICAgICAgeSAtPSBoaTsKLS0gICAgICBpZiAoISh5ID49IDAuMCAmJiB5IDwgMS4wKSkKLS0JYWJvcnQgKCk7Ci0tICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC8gMik7Ci0tICAgICAgbG8gPSAoaW50KSB5OwotLSAgICAgIHkgLT0gbG87Ci0tICAgICAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0tCWFib3J0ICgpOwotLSAgICAgIG0ubGltYnNbLS1pXSA9IChoaSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSB8IGxvOwotLSAgICB9Ci0tICBpZiAoISh5ID09IDAuMCkpCi0tICAgIGFib3J0ICgpOwotLSAgLyogTm9ybWFsaXNlLiAgKi8KLS0gIHdoaWxlIChtLm5saW1icyA+IDAgJiYgbS5saW1ic1ttLm5saW1icyAtIDFdID09IDApCi0tICAgIG0ubmxpbWJzLS07Ci0tICAqbXAgPSBtOwotLSAgKmVwID0gZXhwIC0gREJMX01BTlRfQklUOwotLSAgcmV0dXJuIG0ubGltYnM7Ci0tfQotLQotLSMgZW5kaWYKLS0KLS0vKiBBc3N1bWluZyB4ID0gMl5lICogbSBpcyBmaW5pdGUgYW5kID49IDAsIGFuZCBuIGlzIGFuIGludGVnZXI6Ci0tICAgUmV0dXJucyB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiByb3VuZCAoeCAqIDEwXm4pLgotLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAtIGNvbnRhaW5pbmcgdGhlIGRlY2ltYWwgZGlnaXRzIGluIGxvdy10by1oaWdoCi0tICAgb3JkZXIsIHRlcm1pbmF0ZWQgd2l0aCBhIE5VTCBjaGFyYWN0ZXIgLSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZQotLSAgIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotLXN0YXRpYyBjaGFyICoKLS1zY2FsZTEwX3JvdW5kX2RlY2ltYWxfZGVjb2RlZCAoaW50IGUsIG1wbl90IG0sIHZvaWQgKm1lbW9yeSwgaW50IG4pCi0tewotLSAgaW50IHM7Ci0tICBzaXplX3QgZXh0cmFfemVyb2VzOwotLSAgdW5zaWduZWQgaW50IGFic19uOwotLSAgdW5zaWduZWQgaW50IGFic19zOwotLSAgbXBfbGltYl90ICpwb3c1X3B0cjsKLS0gIHNpemVfdCBwb3c1X2xlbjsKLS0gIHVuc2lnbmVkIGludCBzX2xpbWJzOwotLSAgdW5zaWduZWQgaW50IHNfYml0czsKLS0gIG1wbl90IHBvdzU7Ci0tICBtcG5fdCB6OwotLSAgdm9pZCAqel9tZW1vcnk7Ci0tICBjaGFyICpkaWdpdHM7Ci0tCi0tICBpZiAobWVtb3J5ID09IE5VTEwpCi0tICAgIHJldHVybiBOVUxMOwotLSAgLyogeCA9IDJeZSAqIG0sIGhlbmNlCi0tICAgICB5ID0gcm91bmQgKDJeZSAqIDEwXm4gKiBtKSA9IHJvdW5kICgyXihlK24pICogNV5uICogbSkKLS0gICAgICAgPSByb3VuZCAoMl5zICogNV5uICogbSkuICAqLwotLSAgcyA9IGUgKyBuOwotLSAgZXh0cmFfemVyb2VzID0gMDsKLS0gIC8qIEZhY3RvciBvdXQgYSBjb21tb24gcG93ZXIgb2YgMTAgaWYgcG9zc2libGUuICAqLwotLSAgaWYgKHMgPiAwICYmIG4gPiAwKQotLSAgICB7Ci0tICAgICAgZXh0cmFfemVyb2VzID0gKHMgPCBuID8gcyA6IG4pOwotLSAgICAgIHMgLT0gZXh0cmFfemVyb2VzOwotLSAgICAgIG4gLT0gZXh0cmFfemVyb2VzOwotLSAgICB9Ci0tICAvKiBIZXJlIHkgPSByb3VuZCAoMl5zICogNV5uICogbSkgKiAxMF5leHRyYV96ZXJvZXMuCi0tICAgICBCZWZvcmUgY29udmVydGluZyB0byBkZWNpbWFsLCB3ZSBuZWVkIHRvIGNvbXB1dGUKLS0gICAgIHogPSByb3VuZCAoMl5zICogNV5uICogbSkuICAqLwotLSAgLyogQ29tcHV0ZSA1XnxufCwgcG9zc2libHkgc2hpZnRlZCBieSB8c3wgYml0cyBpZiBuIGFuZCBzIGhhdmUgdGhlIHNhbWUKLS0gICAgIHNpZ24uICAyLjMyMiBpcyBzbGlnaHRseSBsYXJnZXIgdGhhbiBsb2coNSkvbG9nKDIpLiAgKi8KLS0gIGFic19uID0gKG4gPj0gMCA/IG4gOiAtbik7Ci0tICBhYnNfcyA9IChzID49IDAgPyBzIDogLXMpOwotLSAgcG93NV9wdHIgPSAobXBfbGltYl90ICopIG1hbGxvYyAoKChpbnQpKGFic19uICogKDIuMzIyZiAvIEdNUF9MSU1CX0JJVFMpKSArIDEKLS0JCQkJICAgICsgYWJzX3MgLyBHTVBfTElNQl9CSVRTICsgMSkKLS0JCQkJICAgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotLSAgaWYgKHBvdzVfcHRyID09IE5VTEwpCi0tICAgIHsKLS0gICAgICBmcmVlIChtZW1vcnkpOwotLSAgICAgIHJldHVybiBOVUxMOwotLSAgICB9Ci0tICAvKiBJbml0aWFsaXplIHdpdGggMS4gICovCi0tICBwb3c1X3B0clswXSA9IDE7Ci0tICBwb3c1X2xlbiA9IDE7Ci0tICAvKiBNdWx0aXBseSB3aXRoIDVefG58LiAgKi8KLS0gIGlmIChhYnNfbiA+IDApCi0tICAgIHsKLS0gICAgICBzdGF0aWMgbXBfbGltYl90IGNvbnN0IHNtYWxsX3BvdzVbMTMgKyAxXSA9Ci0tCXsKLS0JICAxLCA1LCAyNSwgMTI1LCA2MjUsIDMxMjUsIDE1NjI1LCA3ODEyNSwgMzkwNjI1LCAxOTUzMTI1LCA5NzY1NjI1LAotLQkgIDQ4ODI4MTI1LCAyNDQxNDA2MjUsIDEyMjA3MDMxMjUKLS0JfTsKLS0gICAgICB1bnNpZ25lZCBpbnQgbjEzOwotLSAgICAgIGZvciAobjEzID0gMDsgbjEzIDw9IGFic19uOyBuMTMgKz0gMTMpCi0tCXsKLS0JICBtcF9saW1iX3QgZGlnaXQxID0gc21hbGxfcG93NVtuMTMgKyAxMyA8PSBhYnNfbiA/IDEzIDogYWJzX24gLSBuMTNdOwotLQkgIHNpemVfdCBqOwotLQkgIG1wX3R3b2xpbWJfdCBjYXJyeSA9IDA7Ci0tCSAgZm9yIChqID0gMDsgaiA8IHBvdzVfbGVuOyBqKyspCi0tCSAgICB7Ci0tCSAgICAgIG1wX2xpbWJfdCBkaWdpdDIgPSBwb3c1X3B0cltqXTsKLS0JICAgICAgY2FycnkgKz0gKG1wX3R3b2xpbWJfdCkgZGlnaXQxICogKG1wX3R3b2xpbWJfdCkgZGlnaXQyOwotLQkgICAgICBwb3c1X3B0cltqXSA9IChtcF9saW1iX3QpIGNhcnJ5OwotLQkgICAgICBjYXJyeSA9IGNhcnJ5ID4+IEdNUF9MSU1CX0JJVFM7Ci0tCSAgICB9Ci0tCSAgaWYgKGNhcnJ5ID4gMCkKLS0JICAgIHBvdzVfcHRyW3BvdzVfbGVuKytdID0gKG1wX2xpbWJfdCkgY2Fycnk7Ci0tCX0KLS0gICAgfQotLSAgc19saW1icyA9IGFic19zIC8gR01QX0xJTUJfQklUUzsKLS0gIHNfYml0cyA9IGFic19zICUgR01QX0xJTUJfQklUUzsKLS0gIGlmIChuID49IDAgPyBzID49IDAgOiBzIDw9IDApCi0tICAgIHsKLS0gICAgICAvKiBNdWx0aXBseSB3aXRoIDJefHN8LiAgKi8KLS0gICAgICBpZiAoc19iaXRzID4gMCkKLS0JewotLQkgIG1wX2xpbWJfdCAqcHRyID0gcG93NV9wdHI7Ci0tCSAgbXBfdHdvbGltYl90IGFjY3UgPSAwOwotLQkgIHNpemVfdCBjb3VudDsKLS0JICBmb3IgKGNvdW50ID0gcG93NV9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLS0JICAgIHsKLS0JICAgICAgYWNjdSArPSAobXBfdHdvbGltYl90KSAqcHRyIDw8IHNfYml0czsKLS0JICAgICAgKnB0cisrID0gKG1wX2xpbWJfdCkgYWNjdTsKLS0JICAgICAgYWNjdSA9IGFjY3UgPj4gR01QX0xJTUJfQklUUzsKLS0JICAgIH0KLS0JICBpZiAoYWNjdSA+IDApCi0tCSAgICB7Ci0tCSAgICAgICpwdHIgPSAobXBfbGltYl90KSBhY2N1OwotLQkgICAgICBwb3c1X2xlbisrOwotLQkgICAgfQotLQl9Ci0tICAgICAgaWYgKHNfbGltYnMgPiAwKQotLQl7Ci0tCSAgc2l6ZV90IGNvdW50OwotLQkgIGZvciAoY291bnQgPSBwb3c1X2xlbjsgY291bnQgPiAwOykKLS0JICAgIHsKLS0JICAgICAgY291bnQtLTsKLS0JICAgICAgcG93NV9wdHJbc19saW1icyArIGNvdW50XSA9IHBvdzVfcHRyW2NvdW50XTsKLS0JICAgIH0KLS0JICBmb3IgKGNvdW50ID0gc19saW1iczsgY291bnQgPiAwOykKLS0JICAgIHsKLS0JICAgICAgY291bnQtLTsKLS0JICAgICAgcG93NV9wdHJbY291bnRdID0gMDsKLS0JICAgIH0KLS0JICBwb3c1X2xlbiArPSBzX2xpbWJzOwotLQl9Ci0tICAgICAgcG93NS5saW1icyA9IHBvdzVfcHRyOwotLSAgICAgIHBvdzUubmxpbWJzID0gcG93NV9sZW47Ci0tICAgICAgaWYgKG4gPj0gMCkKLS0JewotLQkgIC8qIE11bHRpcGx5IG0gd2l0aCBwb3c1LiAgTm8gZGl2aXNpb24gbmVlZGVkLiAgKi8KLS0JICB6X21lbW9yeSA9IG11bHRpcGx5IChtLCBwb3c1LCAmeik7Ci0tCX0KLS0gICAgICBlbHNlCi0tCXsKLS0JICAvKiBEaXZpZGUgbSBieSBwb3c1IGFuZCByb3VuZC4gICovCi0tCSAgel9tZW1vcnkgPSBkaXZpZGUgKG0sIHBvdzUsICZ6KTsKLS0JfQotLSAgICB9Ci0tICBlbHNlCi0tICAgIHsKLS0gICAgICBwb3c1LmxpbWJzID0gcG93NV9wdHI7Ci0tICAgICAgcG93NS5ubGltYnMgPSBwb3c1X2xlbjsKLS0gICAgICBpZiAobiA+PSAwKQotLQl7Ci0tCSAgLyogbiA+PSAwLCBzIDwgMC4KLS0JICAgICBNdWx0aXBseSBtIHdpdGggcG93NSwgdGhlbiBkaXZpZGUgYnkgMl58c3wuICAqLwotLQkgIG1wbl90IG51bWVyYXRvcjsKLS0JICBtcG5fdCBkZW5vbWluYXRvcjsKLS0JICB2b2lkICp0bXBfbWVtb3J5OwotLQkgIHRtcF9tZW1vcnkgPSBtdWx0aXBseSAobSwgcG93NSwgJm51bWVyYXRvcik7Ci0tCSAgaWYgKHRtcF9tZW1vcnkgPT0gTlVMTCkKLS0JICAgIHsKLS0JICAgICAgZnJlZSAocG93NV9wdHIpOwotLQkgICAgICBmcmVlIChtZW1vcnkpOwotLQkgICAgICByZXR1cm4gTlVMTDsKLS0JICAgIH0KLS0JICAvKiBDb25zdHJ1Y3QgMl58c3wuICAqLwotLQkgIHsKLS0JICAgIG1wX2xpbWJfdCAqcHRyID0gcG93NV9wdHIgKyBwb3c1X2xlbjsKLS0JICAgIHNpemVfdCBpOwotLQkgICAgZm9yIChpID0gMDsgaSA8IHNfbGltYnM7IGkrKykKLS0JICAgICAgcHRyW2ldID0gMDsKLS0JICAgIHB0cltzX2xpbWJzXSA9IChtcF9saW1iX3QpIDEgPDwgc19iaXRzOwotLQkgICAgZGVub21pbmF0b3IubGltYnMgPSBwdHI7Ci0tCSAgICBkZW5vbWluYXRvci5ubGltYnMgPSBzX2xpbWJzICsgMTsKLS0JICB9Ci0tCSAgel9tZW1vcnkgPSBkaXZpZGUgKG51bWVyYXRvciwgZGVub21pbmF0b3IsICZ6KTsKLS0JICBmcmVlICh0bXBfbWVtb3J5KTsKLS0JfQotLSAgICAgIGVsc2UKLS0JewotLQkgIC8qIG4gPCAwLCBzID4gMC4KLS0JICAgICBNdWx0aXBseSBtIHdpdGggMl5zLCB0aGVuIGRpdmlkZSBieSBwb3c1LiAgKi8KLS0JICBtcG5fdCBudW1lcmF0b3I7Ci0tCSAgbXBfbGltYl90ICpudW1fcHRyOwotLQkgIG51bV9wdHIgPSAobXBfbGltYl90ICopIG1hbGxvYyAoKG0ubmxpbWJzICsgc19saW1icyArIDEpCi0tCQkJCQkgICogc2l6ZW9mIChtcF9saW1iX3QpKTsKLS0JICBpZiAobnVtX3B0ciA9PSBOVUxMKQotLQkgICAgewotLQkgICAgICBmcmVlIChwb3c1X3B0cik7Ci0tCSAgICAgIGZyZWUgKG1lbW9yeSk7Ci0tCSAgICAgIHJldHVybiBOVUxMOwotLQkgICAgfQotLQkgIHsKLS0JICAgIG1wX2xpbWJfdCAqZGVzdHB0ciA9IG51bV9wdHI7Ci0tCSAgICB7Ci0tCSAgICAgIHNpemVfdCBpOwotLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgc19saW1iczsgaSsrKQotLQkJKmRlc3RwdHIrKyA9IDA7Ci0tCSAgICB9Ci0tCSAgICBpZiAoc19iaXRzID4gMCkKLS0JICAgICAgewotLQkJY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBtLmxpbWJzOwotLQkJbXBfdHdvbGltYl90IGFjY3UgPSAwOwotLQkJc2l6ZV90IGNvdW50OwotLQkJZm9yIChjb3VudCA9IG0ubmxpbWJzOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCQkgIHsKLS0JCSAgICBhY2N1ICs9IChtcF90d29saW1iX3QpICpzb3VyY2VwdHIrKyA8PCBzX2JpdHM7Ci0tCQkgICAgKmRlc3RwdHIrKyA9IChtcF9saW1iX3QpIGFjY3U7Ci0tCQkgICAgYWNjdSA9IGFjY3UgPj4gR01QX0xJTUJfQklUUzsKLS0JCSAgfQotLQkJaWYgKGFjY3UgPiAwKQotLQkJICAqZGVzdHB0cisrID0gKG1wX2xpbWJfdCkgYWNjdTsKLS0JICAgICAgfQotLQkgICAgZWxzZQotLQkgICAgICB7Ci0tCQljb25zdCBtcF9saW1iX3QgKnNvdXJjZXB0ciA9IG0ubGltYnM7Ci0tCQlzaXplX3QgY291bnQ7Ci0tCQlmb3IgKGNvdW50ID0gbS5ubGltYnM7IGNvdW50ID4gMDsgY291bnQtLSkKLS0JCSAgKmRlc3RwdHIrKyA9ICpzb3VyY2VwdHIrKzsKLS0JICAgICAgfQotLQkgICAgbnVtZXJhdG9yLmxpbWJzID0gbnVtX3B0cjsKLS0JICAgIG51bWVyYXRvci5ubGltYnMgPSBkZXN0cHRyIC0gbnVtX3B0cjsKLS0JICB9Ci0tCSAgel9tZW1vcnkgPSBkaXZpZGUgKG51bWVyYXRvciwgcG93NSwgJnopOwotLQkgIGZyZWUgKG51bV9wdHIpOwotLQl9Ci0tICAgIH0KLS0gIGZyZWUgKHBvdzVfcHRyKTsKLS0gIGZyZWUgKG1lbW9yeSk7Ci0tCi0tICAvKiBIZXJlIHkgPSByb3VuZCAoeCAqIDEwXm4pID0geiAqIDEwXmV4dHJhX3plcm9lcy4gICovCi0tCi0tICBpZiAoel9tZW1vcnkgPT0gTlVMTCkKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICBkaWdpdHMgPSBjb252ZXJ0X3RvX2RlY2ltYWwgKHosIGV4dHJhX3plcm9lcyk7Ci0tICBmcmVlICh6X21lbW9yeSk7Ci0tICByZXR1cm4gZGlnaXRzOwotLX0KLS0KLS0jIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0tCi0tLyogQXNzdW1pbmcgeCBpcyBmaW5pdGUgYW5kID49IDAsIGFuZCBuIGlzIGFuIGludGVnZXI6Ci0tICAgUmV0dXJucyB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiByb3VuZCAoeCAqIDEwXm4pLgotLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAtIGNvbnRhaW5pbmcgdGhlIGRlY2ltYWwgZGlnaXRzIGluIGxvdy10by1oaWdoCi0tICAgb3JkZXIsIHRlcm1pbmF0ZWQgd2l0aCBhIE5VTCBjaGFyYWN0ZXIgLSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZQotLSAgIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotLXN0YXRpYyBjaGFyICoKLS1zY2FsZTEwX3JvdW5kX2RlY2ltYWxfbG9uZ19kb3VibGUgKGxvbmcgZG91YmxlIHgsIGludCBuKQotLXsKLS0gIGludCBlOwotLSAgbXBuX3QgbTsKLS0gIHZvaWQgKm1lbW9yeSA9IGRlY29kZV9sb25nX2RvdWJsZSAoeCwgJmUsICZtKTsKLS0gIHJldHVybiBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZGVjb2RlZCAoZSwgbSwgbWVtb3J5LCBuKTsKLS19Ci0tCi0tIyBlbmRpZgotLQotLSMgaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0tCi0tLyogQXNzdW1pbmcgeCBpcyBmaW5pdGUgYW5kID49IDAsIGFuZCBuIGlzIGFuIGludGVnZXI6Ci0tICAgUmV0dXJucyB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiByb3VuZCAoeCAqIDEwXm4pLgotLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAtIGNvbnRhaW5pbmcgdGhlIGRlY2ltYWwgZGlnaXRzIGluIGxvdy10by1oaWdoCi0tICAgb3JkZXIsIHRlcm1pbmF0ZWQgd2l0aCBhIE5VTCBjaGFyYWN0ZXIgLSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZQotLSAgIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotLXN0YXRpYyBjaGFyICoKLS1zY2FsZTEwX3JvdW5kX2RlY2ltYWxfZG91YmxlIChkb3VibGUgeCwgaW50IG4pCi0tewotLSAgaW50IGU7Ci0tICBtcG5fdCBtOwotLSAgdm9pZCAqbWVtb3J5ID0gZGVjb2RlX2RvdWJsZSAoeCwgJmUsICZtKTsKLS0gIHJldHVybiBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZGVjb2RlZCAoZSwgbSwgbWVtb3J5LCBuKTsKLS19Ci0tCi0tIyBlbmRpZgotLQotLSMgaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0KLS0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPiAwOgotLSAgIFJldHVybiBhbiBhcHByb3hpbWF0aW9uIGZvciBuIHdpdGggMTBebiA8PSB4IDwgMTBeKG4rMSkuCi0tICAgVGhlIGFwcHJveGltYXRpb24gaXMgdXN1YWxseSB0aGUgcmlnaHQgbiwgYnV0IG1heSBiZSBvZmYgYnkgMSBzb21ldGltZXMuICAqLwotLXN0YXRpYyBpbnQKLS1mbG9vcmxvZzEwbCAobG9uZyBkb3VibGUgeCkKLS17Ci0tICBpbnQgZXhwOwotLSAgbG9uZyBkb3VibGUgeTsKLS0gIGRvdWJsZSB6OwotLSAgZG91YmxlIGw7Ci0tCi0tICAvKiBTcGxpdCBpbnRvIGV4cG9uZW50aWFsIHBhcnQgYW5kIG1hbnRpc3NhLiAgKi8KLS0gIHkgPSBmcmV4cGwgKHgsICZleHApOwotLSAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAoeSA9PSAwLjBMKQotLSAgICByZXR1cm4gSU5UX01JTjsKLS0gIGlmICh5IDwgMC41TCkKLS0gICAgewotLSAgICAgIHdoaWxlICh5IDwgKDEuMEwgLyAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSAvICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpKSkKLS0JewotLQkgIHkgKj0gMS4wTCAqICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpICogKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSk7Ci0tCSAgZXhwIC09IEdNUF9MSU1CX0JJVFM7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjBMIC8gKDEgPDwgMTYpKSkKLS0JewotLQkgIHkgKj0gMS4wTCAqICgxIDw8IDE2KTsKLS0JICBleHAgLT0gMTY7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjBMIC8gKDEgPDwgOCkpKQotLQl7Ci0tCSAgeSAqPSAxLjBMICogKDEgPDwgOCk7Ci0tCSAgZXhwIC09IDg7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjBMIC8gKDEgPDwgNCkpKQotLQl7Ci0tCSAgeSAqPSAxLjBMICogKDEgPDwgNCk7Ci0tCSAgZXhwIC09IDQ7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjBMIC8gKDEgPDwgMikpKQotLQl7Ci0tCSAgeSAqPSAxLjBMICogKDEgPDwgMik7Ci0tCSAgZXhwIC09IDI7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjBMIC8gKDEgPDwgMSkpKQotLQl7Ci0tCSAgeSAqPSAxLjBMICogKDEgPDwgMSk7Ci0tCSAgZXhwIC09IDE7Ci0tCX0KLS0gICAgfQotLSAgaWYgKCEoeSA+PSAwLjVMICYmIHkgPCAxLjBMKSkKLS0gICAgYWJvcnQgKCk7Ci0tICAvKiBDb21wdXRlIGFuIGFwcHJveGltYXRpb24gZm9yIGwgPSBsb2cyKHgpID0gZXhwICsgbG9nMih5KS4gICovCi0tICBsID0gZXhwOwotLSAgeiA9IHk7Ci0tICBpZiAoeiA8IDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDQpCi0tICAgIHsKLS0gICAgICB6ICo9IDEuNDE0MjEzNTYyMzczMDk1MDQ4ODsKLS0gICAgICBsIC09IDAuNTsKLS0gICAgfQotLSAgaWYgKHogPCAwLjg0MDg5NjQxNTI1MzcxNDU0MzEpCi0tICAgIHsKLS0gICAgICB6ICo9IDEuMTg5MjA3MTE1MDAyNzIxMDY2NzsKLS0gICAgICBsIC09IDAuMjU7Ci0tICAgIH0KLS0gIGlmICh6IDwgMC45MTcwMDQwNDMyMDQ2NzEyMzE3NSkKLS0gICAgewotLSAgICAgIHogKj0gMS4wOTA1MDc3MzI2NjUyNTc2NTkyOwotLSAgICAgIGwgLT0gMC4xMjU7Ci0tICAgIH0KLS0gIGlmICh6IDwgMC45NTc2MDMyODA2OTg1NzM2NDY5KQotLSAgICB7Ci0tICAgICAgeiAqPSAxLjA0NDI3Mzc4MjQyNzQxMzg0MDM7Ci0tICAgICAgbCAtPSAwLjA2MjU7Ci0tICAgIH0KLS0gIC8qIE5vdyAwLjk1IDw9IHogPD0gMS4wMS4gICovCi0tICB6ID0gMSAtIHo7Ci0tICAvKiBsb2coMS16KSA9IC0geiAtIHpeMi8yIC0gel4zLzMgLSB6XjQvNCAtIC4uLgotLSAgICAgRm91ciB0ZXJtcyBhcmUgZW5vdWdoIHRvIGdldCBhbiBhcHByb3hpbWF0aW9uIHdpdGggZXJyb3IgPCAxMF4tNy4gICovCi0tICBsIC09IHogKiAoMS4wICsgeiAqICgwLjUgKyB6ICogKCgxLjAgLyAzKSArIHogKiAwLjI1KSkpOwotLSAgLyogRmluYWxseSBtdWx0aXBseSB3aXRoIGxvZygyKS9sb2coMTApLCB5aWVsZHMgYW4gYXBwcm94aW1hdGlvbiBmb3IKLS0gICAgIGxvZzEwKHgpLiAgKi8KLS0gIGwgKj0gMC4zMDEwMjk5OTU2NjM5ODExOTUyMzsKLS0gIC8qIFJvdW5kIGRvd24gdG8gdGhlIG5leHQgaW50ZWdlci4gICovCi0tICByZXR1cm4gKGludCkgbCArIChsIDwgMCA/IC0xIDogMCk7Ci0tfQotLQotLSMgZW5kaWYKLS0KLS0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRQotLQotLS8qIEFzc3VtaW5nIHggaXMgZmluaXRlIGFuZCA+IDA6Ci0tICAgUmV0dXJuIGFuIGFwcHJveGltYXRpb24gZm9yIG4gd2l0aCAxMF5uIDw9IHggPCAxMF4obisxKS4KLS0gICBUaGUgYXBwcm94aW1hdGlvbiBpcyB1c3VhbGx5IHRoZSByaWdodCBuLCBidXQgbWF5IGJlIG9mZiBieSAxIHNvbWV0aW1lcy4gICovCi0tc3RhdGljIGludAotLWZsb29ybG9nMTAgKGRvdWJsZSB4KQotLXsKLS0gIGludCBleHA7Ci0tICBkb3VibGUgeTsKLS0gIGRvdWJsZSB6OwotLSAgZG91YmxlIGw7Ci0tCi0tICAvKiBTcGxpdCBpbnRvIGV4cG9uZW50aWFsIHBhcnQgYW5kIG1hbnRpc3NhLiAgKi8KLS0gIHkgPSBmcmV4cCAoeCwgJmV4cCk7Ci0tICBpZiAoISh5ID49IDAuMCAmJiB5IDwgMS4wKSkKLS0gICAgYWJvcnQgKCk7Ci0tICBpZiAoeSA9PSAwLjApCi0tICAgIHJldHVybiBJTlRfTUlOOwotLSAgaWYgKHkgPCAwLjUpCi0tICAgIHsKLS0gICAgICB3aGlsZSAoeSA8ICgxLjAgLyAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSAvICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpKSkKLS0JewotLQkgIHkgKj0gMS4wICogKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgKiAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKTsKLS0JICBleHAgLT0gR01QX0xJTUJfQklUUzsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMCAvICgxIDw8IDE2KSkpCi0tCXsKLS0JICB5ICo9IDEuMCAqICgxIDw8IDE2KTsKLS0JICBleHAgLT0gMTY7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjAgLyAoMSA8PCA4KSkpCi0tCXsKLS0JICB5ICo9IDEuMCAqICgxIDw8IDgpOwotLQkgIGV4cCAtPSA4OwotLQl9Ci0tICAgICAgaWYgKHkgPCAoMS4wIC8gKDEgPDwgNCkpKQotLQl7Ci0tCSAgeSAqPSAxLjAgKiAoMSA8PCA0KTsKLS0JICBleHAgLT0gNDsKLS0JfQotLSAgICAgIGlmICh5IDwgKDEuMCAvICgxIDw8IDIpKSkKLS0JewotLQkgIHkgKj0gMS4wICogKDEgPDwgMik7Ci0tCSAgZXhwIC09IDI7Ci0tCX0KLS0gICAgICBpZiAoeSA8ICgxLjAgLyAoMSA8PCAxKSkpCi0tCXsKLS0JICB5ICo9IDEuMCAqICgxIDw8IDEpOwotLQkgIGV4cCAtPSAxOwotLQl9Ci0tICAgIH0KLS0gIGlmICghKHkgPj0gMC41ICYmIHkgPCAxLjApKQotLSAgICBhYm9ydCAoKTsKLS0gIC8qIENvbXB1dGUgYW4gYXBwcm94aW1hdGlvbiBmb3IgbCA9IGxvZzIoeCkgPSBleHAgKyBsb2cyKHkpLiAgKi8KLS0gIGwgPSBleHA7Ci0tICB6ID0geTsKLS0gIGlmICh6IDwgMC43MDcxMDY3ODExODY1NDc1MjQ0NCkKLS0gICAgewotLSAgICAgIHogKj0gMS40MTQyMTM1NjIzNzMwOTUwNDg4OwotLSAgICAgIGwgLT0gMC41OwotLSAgICB9Ci0tICBpZiAoeiA8IDAuODQwODk2NDE1MjUzNzE0NTQzMSkKLS0gICAgewotLSAgICAgIHogKj0gMS4xODkyMDcxMTUwMDI3MjEwNjY3OwotLSAgICAgIGwgLT0gMC4yNTsKLS0gICAgfQotLSAgaWYgKHogPCAwLjkxNzAwNDA0MzIwNDY3MTIzMTc1KQotLSAgICB7Ci0tICAgICAgeiAqPSAxLjA5MDUwNzczMjY2NTI1NzY1OTI7Ci0tICAgICAgbCAtPSAwLjEyNTsKLS0gICAgfQotLSAgaWYgKHogPCAwLjk1NzYwMzI4MDY5ODU3MzY0NjkpCi0tICAgIHsKLS0gICAgICB6ICo9IDEuMDQ0MjczNzgyNDI3NDEzODQwMzsKLS0gICAgICBsIC09IDAuMDYyNTsKLS0gICAgfQotLSAgLyogTm93IDAuOTUgPD0geiA8PSAxLjAxLiAgKi8KLS0gIHogPSAxIC0gejsKLS0gIC8qIGxvZygxLXopID0gLSB6IC0gel4yLzIgLSB6XjMvMyAtIHpeNC80IC0gLi4uCi0tICAgICBGb3VyIHRlcm1zIGFyZSBlbm91Z2ggdG8gZ2V0IGFuIGFwcHJveGltYXRpb24gd2l0aCBlcnJvciA8IDEwXi03LiAgKi8KLS0gIGwgLT0geiAqICgxLjAgKyB6ICogKDAuNSArIHogKiAoKDEuMCAvIDMpICsgeiAqIDAuMjUpKSk7Ci0tICAvKiBGaW5hbGx5IG11bHRpcGx5IHdpdGggbG9nKDIpL2xvZygxMCksIHlpZWxkcyBhbiBhcHByb3hpbWF0aW9uIGZvcgotLSAgICAgbG9nMTAoeCkuICAqLwotLSAgbCAqPSAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIzOwotLSAgLyogUm91bmQgZG93biB0byB0aGUgbmV4dCBpbnRlZ2VyLiAgKi8KLS0gIHJldHVybiAoaW50KSBsICsgKGwgPCAwID8gLTEgOiAwKTsKLS19Ci0tCi0tIyBlbmRpZgotLQotLSNlbmRpZgotLQotLURDSEFSX1QgKgotLVZBU05QUklOVEYgKERDSEFSX1QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLAotLQkgICAgY29uc3QgRkNIQVJfVCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0tewotLSAgRElSRUNUSVZFUyBkOwotLSAgYXJndW1lbnRzIGE7Ci0tCi0tICBpZiAoUFJJTlRGX1BBUlNFIChmb3JtYXQsICZkLCAmYSkgPCAwKQotLSAgICAvKiBlcnJubyBpcyBhbHJlYWR5IHNldC4gICovCi0tICAgIHJldHVybiBOVUxMOwotLQotLSNkZWZpbmUgQ0xFQU5VUCgpIFwKLS0gIGZyZWUgKGQuZGlyKTsJCQkJCQkJCVwKLS0gIGlmIChhLmFyZykJCQkJCQkJCVwKLS0gICAgZnJlZSAoYS5hcmcpOwotLQotLSAgaWYgKFBSSU5URl9GRVRDSEFSR1MgKGFyZ3MsICZhKSA8IDApCi0tICAgIHsKLS0gICAgICBDTEVBTlVQICgpOwotLSAgICAgIGVycm5vID0gRUlOVkFMOwotLSAgICAgIHJldHVybiBOVUxMOwotLSAgICB9Ci0tCi0tICB7Ci0tICAgIHNpemVfdCBidWZfbmVlZGVkbGVuZ3RoOwotLSAgICBUQ0hBUl9UICpidWY7Ci0tICAgIFRDSEFSX1QgKmJ1Zl9tYWxsb2NlZDsKLS0gICAgY29uc3QgRkNIQVJfVCAqY3A7Ci0tICAgIHNpemVfdCBpOwotLSAgICBESVJFQ1RJVkUgKmRwOwotLSAgICAvKiBPdXRwdXQgc3RyaW5nIGFjY3VtdWxhdG9yLiAgKi8KLS0gICAgRENIQVJfVCAqcmVzdWx0OwotLSAgICBzaXplX3QgYWxsb2NhdGVkOwotLSAgICBzaXplX3QgbGVuZ3RoOwotLQotLSAgICAvKiBBbGxvY2F0ZSBhIHNtYWxsIGJ1ZmZlciB0aGF0IHdpbGwgaG9sZCBhIGRpcmVjdGl2ZSBwYXNzZWQgdG8KLS0gICAgICAgc3ByaW50ZiBvciBzbnByaW50Zi4gICovCi0tICAgIGJ1Zl9uZWVkZWRsZW5ndGggPQotLSAgICAgIHhzdW00ICg3LCBkLm1heF93aWR0aF9sZW5ndGgsIGQubWF4X3ByZWNpc2lvbl9sZW5ndGgsIDYpOwotLSNpZiBIQVZFX0FMTE9DQQotLSAgICBpZiAoYnVmX25lZWRlZGxlbmd0aCA8IDQwMDAgLyBzaXplb2YgKFRDSEFSX1QpKQotLSAgICAgIHsKLS0JYnVmID0gKFRDSEFSX1QgKikgYWxsb2NhIChidWZfbmVlZGVkbGVuZ3RoICogc2l6ZW9mIChUQ0hBUl9UKSk7Ci0tCWJ1Zl9tYWxsb2NlZCA9IE5VTEw7Ci0tICAgICAgfQotLSAgICBlbHNlCi0tI2VuZGlmCi0tICAgICAgewotLQlzaXplX3QgYnVmX21lbXNpemUgPSB4dGltZXMgKGJ1Zl9uZWVkZWRsZW5ndGgsIHNpemVvZiAoVENIQVJfVCkpOwotLQlpZiAoc2l6ZV9vdmVyZmxvd19wIChidWZfbWVtc2l6ZSkpCi0tCSAgZ290byBvdXRfb2ZfbWVtb3J5XzE7Ci0tCWJ1ZiA9IChUQ0hBUl9UICopIG1hbGxvYyAoYnVmX21lbXNpemUpOwotLQlpZiAoYnVmID09IE5VTEwpCi0tCSAgZ290byBvdXRfb2ZfbWVtb3J5XzE7Ci0tCWJ1Zl9tYWxsb2NlZCA9IGJ1ZjsKLS0gICAgICB9Ci0tCi0tICAgIGlmIChyZXN1bHRidWYgIT0gTlVMTCkKLS0gICAgICB7Ci0tCXJlc3VsdCA9IHJlc3VsdGJ1ZjsKLS0JYWxsb2NhdGVkID0gKmxlbmd0aHA7Ci0tICAgICAgfQotLSAgICBlbHNlCi0tICAgICAgewotLQlyZXN1bHQgPSBOVUxMOwotLQlhbGxvY2F0ZWQgPSAwOwotLSAgICAgIH0KLS0gICAgbGVuZ3RoID0gMDsKLS0gICAgLyogSW52YXJpYW50czoKLS0gICAgICAgcmVzdWx0IGlzIGVpdGhlciA9PSByZXN1bHRidWYgb3IgPT0gTlVMTCBvciBtYWxsb2MtYWxsb2NhdGVkLgotLSAgICAgICBJZiBsZW5ndGggPiAwLCB0aGVuIHJlc3VsdCAhPSBOVUxMLiAgKi8KLS0KLS0gICAgLyogRW5zdXJlcyB0aGF0IGFsbG9jYXRlZCA+PSBuZWVkZWQuICBBYm9ydHMgdGhyb3VnaCBhIGp1bXAgdG8KLS0gICAgICAgb3V0X29mX21lbW9yeSBpZiBuZWVkZWQgaXMgU0laRV9NQVggb3Igb3RoZXJ3aXNlIHRvbyBiaWcuICAqLwotLSNkZWZpbmUgRU5TVVJFX0FMTE9DQVRJT04obmVlZGVkKSBcCi0tICAgIGlmICgobmVlZGVkKSA+IGFsbG9jYXRlZCkJCQkJCQkgICAgIFwKLS0gICAgICB7CQkJCQkJCQkJICAgICBcCi0tCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQkgICAgIFwKLS0JRENIQVJfVCAqbWVtb3J5OwkJCQkJCSAgICAgXAotLQkJCQkJCQkJCSAgICAgXAotLQlhbGxvY2F0ZWQgPSAoYWxsb2NhdGVkID4gMCA/IHh0aW1lcyAoYWxsb2NhdGVkLCAyKSA6IDEyKTsJICAgICBcCi0tCWlmICgobmVlZGVkKSA+IGFsbG9jYXRlZCkJCQkJCSAgICAgXAotLQkgIGFsbG9jYXRlZCA9IChuZWVkZWQpOwkJCQkJCSAgICAgXAotLQltZW1vcnlfc2l6ZSA9IHh0aW1lcyAoYWxsb2NhdGVkLCBzaXplb2YgKERDSEFSX1QpKTsJCSAgICAgXAotLQlpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCQkJCSAgICAgXAotLQkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQkgICAgIFwKLS0JaWYgKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpCQkJICAgICBcCi0tCSAgbWVtb3J5ID0gKERDSEFSX1QgKikgbWFsbG9jIChtZW1vcnlfc2l6ZSk7CQkJICAgICBcCi0tCWVsc2UJCQkJCQkJCSAgICAgXAotLQkgIG1lbW9yeSA9IChEQ0hBUl9UICopIHJlYWxsb2MgKHJlc3VsdCwgbWVtb3J5X3NpemUpOwkJICAgICBcCi0tCWlmIChtZW1vcnkgPT0gTlVMTCkJCQkJCQkgICAgIFwKLS0JICBnb3RvIG91dF9vZl9tZW1vcnk7CQkJCQkJICAgICBcCi0tCWlmIChyZXN1bHQgPT0gcmVzdWx0YnVmICYmIGxlbmd0aCA+IDApCQkJCSAgICAgXAotLQkgIERDSEFSX0NQWSAobWVtb3J5LCByZXN1bHQsIGxlbmd0aCk7CQkJCSAgICAgXAotLQlyZXN1bHQgPSBtZW1vcnk7CQkJCQkJICAgICBcCi0tICAgICAgfQotLQotLSAgICBmb3IgKGNwID0gZm9ybWF0LCBpID0gMCwgZHAgPSAmZC5kaXJbMF07IDsgY3AgPSBkcC0+ZGlyX2VuZCwgaSsrLCBkcCsrKQotLSAgICAgIHsKLS0JaWYgKGNwICE9IGRwLT5kaXJfc3RhcnQpCi0tCSAgewotLQkgICAgc2l6ZV90IG4gPSBkcC0+ZGlyX3N0YXJ0IC0gY3A7Ci0tCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgbik7Ci0tCi0tCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoYXVnbWVudGVkX2xlbmd0aCk7Ci0tCSAgICAvKiBUaGlzIGNvcGllcyBhIHBpZWNlIG9mIEZDSEFSX1RbXSBpbnRvIGEgRENIQVJfVFtdLiAgSGVyZSB3ZQotLQkgICAgICAgbmVlZCB0aGF0IHRoZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIG9ubHkgQVNDSUkgY2hhcmFjdGVycwotLQkgICAgICAgaWYgRkNIQVJfVCBhbmQgRENIQVJfVCBhcmUgbm90IHRoZSBzYW1lIHR5cGUuICAqLwotLQkgICAgaWYgKHNpemVvZiAoRkNIQVJfVCkgPT0gc2l6ZW9mIChEQ0hBUl9UKSkKLS0JICAgICAgewotLQkJRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIChjb25zdCBEQ0hBUl9UICopIGNwLCBuKTsKLS0JCWxlbmd0aCA9IGF1Z21lbnRlZF9sZW5ndGg7Ci0tCSAgICAgIH0KLS0JICAgIGVsc2UKLS0JICAgICAgewotLQkJZG8KLS0JCSAgcmVzdWx0W2xlbmd0aCsrXSA9ICh1bnNpZ25lZCBjaGFyKSAqY3ArKzsKLS0JCXdoaWxlICgtLW4gPiAwKTsKLS0JICAgICAgfQotLQkgIH0KLS0JaWYgKGkgPT0gZC5jb3VudCkKLS0JICBicmVhazsKLS0KLS0JLyogRXhlY3V0ZSBhIHNpbmdsZSBkaXJlY3RpdmUuICAqLwotLQlpZiAoZHAtPmNvbnZlcnNpb24gPT0gJyUnKQotLQkgIHsKLS0JICAgIHNpemVfdCBhdWdtZW50ZWRfbGVuZ3RoOwotLQotLQkgICAgaWYgKCEoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkpCi0tCSAgICAgIGFib3J0ICgpOwotLQkgICAgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgMSk7Ci0tCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoYXVnbWVudGVkX2xlbmd0aCk7Ci0tCSAgICByZXN1bHRbbGVuZ3RoXSA9ICclJzsKLS0JICAgIGxlbmd0aCA9IGF1Z21lbnRlZF9sZW5ndGg7Ci0tCSAgfQotLQllbHNlCi0tCSAgewotLQkgICAgaWYgKCEoZHAtPmFyZ19pbmRleCAhPSBBUkdfTk9ORSkpCi0tCSAgICAgIGFib3J0ICgpOwotLQotLQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICduJykKLS0JICAgICAgewotLQkJc3dpdGNoIChhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlKQotLQkJICB7Ci0tCQkgIGNhc2UgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOgotLQkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfc2NoYXJfcG9pbnRlciA9IGxlbmd0aDsKLS0JCSAgICBicmVhazsKLS0JCSAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6Ci0tCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9zaG9ydF9wb2ludGVyID0gbGVuZ3RoOwotLQkJICAgIGJyZWFrOwotLQkJICBjYXNlIFRZUEVfQ09VTlRfSU5UX1BPSU5URVI6Ci0tCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9pbnRfcG9pbnRlciA9IGxlbmd0aDsKLS0JCSAgICBicmVhazsKLS0JCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjoKLS0JCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2xvbmdpbnRfcG9pbnRlciA9IGxlbmd0aDsKLS0JCSAgICBicmVhazsKLS0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0tCQkgIGNhc2UgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOgotLQkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlciA9IGxlbmd0aDsKLS0JCSAgICBicmVhazsKLS0jZW5kaWYKLS0JCSAgZGVmYXVsdDoKLS0JCSAgICBhYm9ydCAoKTsKLS0JCSAgfQotLQkgICAgICB9Ci0tI2lmIEVOQUJMRV9VTklTVERJTwotLQkgICAgLyogVGhlIHVuaXN0ZGlvIGV4dGVuc2lvbnMuICAqLwotLQkgICAgZWxzZSBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ1UnKQotLQkgICAgICB7Ci0tCQlhcmdfdHlwZSB0eXBlID0gYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZTsKLS0JCWludCBmbGFncyA9IGRwLT5mbGFnczsKLS0JCWludCBoYXNfd2lkdGg7Ci0tCQlzaXplX3Qgd2lkdGg7Ci0tCQlpbnQgaGFzX3ByZWNpc2lvbjsKLS0JCXNpemVfdCBwcmVjaXNpb247Ci0tCi0tCQloYXNfd2lkdGggPSAwOwotLQkJd2lkdGggPSAwOwotLQkJaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQotLQkJICB7Ci0tCQkgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0tCQkgICAgICB7Ci0tCQkJaW50IGFyZzsKLS0KLS0JCQlpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLS0JCQkgIGFib3J0ICgpOwotLQkJCWFyZyA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkJaWYgKGFyZyA8IDApCi0tCQkJICB7Ci0tCQkJICAgIC8qICJBIG5lZ2F0aXZlIGZpZWxkIHdpZHRoIGlzIHRha2VuIGFzIGEgJy0nIGZsYWcKLS0JCQkgICAgICAgIGZvbGxvd2VkIGJ5IGEgcG9zaXRpdmUgZmllbGQgd2lkdGguIiAgKi8KLS0JCQkgICAgZmxhZ3MgfD0gRkxBR19MRUZUOwotLQkJCSAgICB3aWR0aCA9ICh1bnNpZ25lZCBpbnQpICgtYXJnKTsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB3aWR0aCA9IGFyZzsKLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPndpZHRoX3N0YXJ0OwotLQotLQkJCWRvCi0tCQkJICB3aWR0aCA9IHhzdW0gKHh0aW1lcyAod2lkdGgsIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLS0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT53aWR0aF9lbmQpOwotLQkJICAgICAgfQotLQkJICAgIGhhc193aWR0aCA9IDE7Ci0tCQkgIH0KLS0KLS0JCWhhc19wcmVjaXNpb24gPSAwOwotLQkJcHJlY2lzaW9uID0gMDsKLS0JCWlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQotLQkJICB7Ci0tCQkgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQotLQkJICAgICAgewotLQkJCWludCBhcmc7Ci0tCi0tCQkJaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJYXJnID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkJLyogIkEgbmVnYXRpdmUgcHJlY2lzaW9uIGlzIHRha2VuIGFzIGlmIHRoZSBwcmVjaXNpb24KLS0JCQkgICAgd2VyZSBvbWl0dGVkLiIgICovCi0tCQkJaWYgKGFyZyA+PSAwKQotLQkJCSAgewotLQkJCSAgICBwcmVjaXNpb24gPSBhcmc7Ci0tCQkJICAgIGhhc19wcmVjaXNpb24gPSAxOwotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+cHJlY2lzaW9uX3N0YXJ0ICsgMTsKLS0KLS0JCQlwcmVjaXNpb24gPSAwOwotLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0tCQkJICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotLQkJCWhhc19wcmVjaXNpb24gPSAxOwotLQkJICAgICAgfQotLQkJICB9Ci0tCi0tCQlzd2l0Y2ggKHR5cGUpCi0tCQkgIHsKLS0JCSAgY2FzZSBUWVBFX1U4X1NUUklORzoKLS0JCSAgICB7Ci0tCQkgICAgICBjb25zdCB1aW50OF90ICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdThfc3RyaW5nOwotLQkJICAgICAgY29uc3QgdWludDhfdCAqYXJnX2VuZDsKLS0JCSAgICAgIHNpemVfdCBjaGFyYWN0ZXJzOwotLQotLQkJICAgICAgaWYgKGhhc19wcmVjaXNpb24pCi0tCQkJewotLQkJCSAgLyogVXNlIG9ubHkgUFJFQ0lTSU9OIGNoYXJhY3RlcnMsIGZyb20gdGhlIGxlZnQuICAqLwotLQkJCSAgYXJnX2VuZCA9IGFyZzsKLS0JCQkgIGNoYXJhY3RlcnMgPSAwOwotLQkJCSAgZm9yICg7IHByZWNpc2lvbiA+IDA7IHByZWNpc2lvbi0tKQotLQkJCSAgICB7Ci0tCQkJICAgICAgaW50IGNvdW50ID0gdThfc3RybWJsZW4gKGFyZ19lbmQpOwotLQkJCSAgICAgIGlmIChjb3VudCA9PSAwKQotLQkJCQlicmVhazsKLS0JCQkgICAgICBpZiAoY291bnQgPCAwKQotLQkJCQl7Ci0tCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tCQkJCSAgICBmcmVlIChyZXN1bHQpOwotLQkJCQkgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tCQkJCSAgQ0xFQU5VUCAoKTsKLS0JCQkJICBlcnJubyA9IEVJTFNFUTsKLS0JCQkJICByZXR1cm4gTlVMTDsKLS0JCQkJfQotLQkJCSAgICAgIGFyZ19lbmQgKz0gY291bnQ7Ci0tCQkJICAgICAgY2hhcmFjdGVycysrOwotLQkJCSAgICB9Ci0tCQkJfQotLQkJICAgICAgZWxzZSBpZiAoaGFzX3dpZHRoKQotLQkJCXsKLS0JCQkgIC8qIFVzZSB0aGUgZW50aXJlIHN0cmluZywgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YKLS0JCQkgICAgIGNoYXJhY3RlcnMuICAqLwotLQkJCSAgYXJnX2VuZCA9IGFyZzsKLS0JCQkgIGNoYXJhY3RlcnMgPSAwOwotLQkJCSAgZm9yICg7OykKLS0JCQkgICAgewotLQkJCSAgICAgIGludCBjb3VudCA9IHU4X3N0cm1ibGVuIChhcmdfZW5kKTsKLS0JCQkgICAgICBpZiAoY291bnQgPT0gMCkKLS0JCQkJYnJlYWs7Ci0tCQkJICAgICAgaWYgKGNvdW50IDwgMCkKLS0JCQkJewotLQkJCQkgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCQkgICAgZnJlZSAocmVzdWx0KTsKLS0JCQkJICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJCSAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCQkgIENMRUFOVVAgKCk7Ci0tCQkJCSAgZXJybm8gPSBFSUxTRVE7Ci0tCQkJCSAgcmV0dXJuIE5VTEw7Ci0tCQkJCX0KLS0JCQkgICAgICBhcmdfZW5kICs9IGNvdW50OwotLQkJCSAgICAgIGNoYXJhY3RlcnMrKzsKLS0JCQkgICAgfQotLQkJCX0KLS0JCSAgICAgIGVsc2UKLS0JCQl7Ci0tCQkJICAvKiBVc2UgdGhlIGVudGlyZSBzdHJpbmcuICAqLwotLQkJCSAgYXJnX2VuZCA9IGFyZyArIHU4X3N0cmxlbiAoYXJnKTsKLS0JCQkgIC8qIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBkb2Vzbid0IG1hdHRlci4gICovCi0tCQkJICBjaGFyYWN0ZXJzID0gMDsKLS0JCQl9Ci0tCi0tCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotLQkJCSAgJiYgIShkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpKQotLQkJCXsKLS0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotLQkJCSAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotLQkJCSAgRENIQVJfU0VUIChyZXN1bHQgKyBsZW5ndGgsICcgJywgbik7Ci0tCQkJICBsZW5ndGggKz0gbjsKLS0JCQl9Ci0tCi0tIyBpZiBEQ0hBUl9JU19VSU5UOF9UCi0tCQkgICAgICB7Ci0tCQkJc2l6ZV90IG4gPSBhcmdfZW5kIC0gYXJnOwotLQkJCUVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIG4pKTsKLS0JCQlEQ0hBUl9DUFkgKHJlc3VsdCArIGxlbmd0aCwgYXJnLCBuKTsKLS0JCQlsZW5ndGggKz0gbjsKLS0JCSAgICAgIH0KLS0jIGVsc2UKLS0JCSAgICAgIHsgLyogQ29udmVydC4gICovCi0tCQkJRENIQVJfVCAqY29udmVydGVkID0gcmVzdWx0ICsgbGVuZ3RoOwotLQkJCXNpemVfdCBjb252ZXJ0ZWRfbGVuID0gYWxsb2NhdGVkIC0gbGVuZ3RoOwotLSMgIGlmIERDSEFSX0lTX1RDSEFSCi0tCQkJLyogQ29udmVydCBmcm9tIFVURi04IHRvIGxvY2FsZSBlbmNvZGluZy4gICovCi0tCQkJaWYgKHU4X2NvbnZfdG9fZW5jb2RpbmcgKGxvY2FsZV9jaGFyc2V0ICgpLAotLQkJCQkJCSBpY29udmVoX3F1ZXN0aW9uX21hcmssCi0tCQkJCQkJIGFyZywgYXJnX2VuZCAtIGFyZywgTlVMTCwKLS0JCQkJCQkgJmNvbnZlcnRlZCwgJmNvbnZlcnRlZF9sZW4pCi0tCQkJICAgIDwgMCkKLS0jICBlbHNlCi0tCQkJLyogQ29udmVydCBmcm9tIFVURi04IHRvIFVURi0xNi9VVEYtMzIuICAqLwotLQkJCWNvbnZlcnRlZCA9Ci0tCQkJICBVOF9UT19EQ0hBUiAoYXJnLCBhcmdfZW5kIC0gYXJnLAotLQkJCQkgICAgICAgY29udmVydGVkLCAmY29udmVydGVkX2xlbik7Ci0tCQkJaWYgKGNvbnZlcnRlZCA9PSBOVUxMKQotLSMgIGVuZGlmCi0tCQkJICB7Ci0tCQkJICAgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotLQkJCSAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0JCQkgICAgICBmcmVlIChyZXN1bHQpOwotLQkJCSAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0JCQkgICAgQ0xFQU5VUCAoKTsKLS0JCQkgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKLS0JCQkgICAgcmV0dXJuIE5VTEw7Ci0tCQkJICB9Ci0tCQkJaWYgKGNvbnZlcnRlZCAhPSByZXN1bHQgKyBsZW5ndGgpCi0tCQkJICB7Ci0tCQkJICAgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIGNvbnZlcnRlZF9sZW4pKTsKLS0JCQkgICAgRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIGNvbnZlcnRlZCwgY29udmVydGVkX2xlbik7Ci0tCQkJICAgIGZyZWUgKGNvbnZlcnRlZCk7Ci0tCQkJICB9Ci0tCQkJbGVuZ3RoICs9IGNvbnZlcnRlZF9sZW47Ci0tCQkgICAgICB9Ci0tIyBlbmRpZgotLQotLQkJICAgICAgaWYgKGhhc193aWR0aCAmJiB3aWR0aCA+IGNoYXJhY3RlcnMKLS0JCQkgICYmIChkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpKQotLQkJCXsKLS0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotLQkJCSAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotLQkJCSAgRENIQVJfU0VUIChyZXN1bHQgKyBsZW5ndGgsICcgJywgbik7Ci0tCQkJICBsZW5ndGggKz0gbjsKLS0JCQl9Ci0tCQkgICAgfQotLQkJICAgIGJyZWFrOwotLQotLQkJICBjYXNlIFRZUEVfVTE2X1NUUklORzoKLS0JCSAgICB7Ci0tCQkgICAgICBjb25zdCB1aW50MTZfdCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3UxNl9zdHJpbmc7Ci0tCQkgICAgICBjb25zdCB1aW50MTZfdCAqYXJnX2VuZDsKLS0JCSAgICAgIHNpemVfdCBjaGFyYWN0ZXJzOwotLQotLQkJICAgICAgaWYgKGhhc19wcmVjaXNpb24pCi0tCQkJewotLQkJCSAgLyogVXNlIG9ubHkgUFJFQ0lTSU9OIGNoYXJhY3RlcnMsIGZyb20gdGhlIGxlZnQuICAqLwotLQkJCSAgYXJnX2VuZCA9IGFyZzsKLS0JCQkgIGNoYXJhY3RlcnMgPSAwOwotLQkJCSAgZm9yICg7IHByZWNpc2lvbiA+IDA7IHByZWNpc2lvbi0tKQotLQkJCSAgICB7Ci0tCQkJICAgICAgaW50IGNvdW50ID0gdTE2X3N0cm1ibGVuIChhcmdfZW5kKTsKLS0JCQkgICAgICBpZiAoY291bnQgPT0gMCkKLS0JCQkJYnJlYWs7Ci0tCQkJICAgICAgaWYgKGNvdW50IDwgMCkKLS0JCQkJewotLQkJCQkgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCQkgICAgZnJlZSAocmVzdWx0KTsKLS0JCQkJICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJCSAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCQkgIENMRUFOVVAgKCk7Ci0tCQkJCSAgZXJybm8gPSBFSUxTRVE7Ci0tCQkJCSAgcmV0dXJuIE5VTEw7Ci0tCQkJCX0KLS0JCQkgICAgICBhcmdfZW5kICs9IGNvdW50OwotLQkJCSAgICAgIGNoYXJhY3RlcnMrKzsKLS0JCQkgICAgfQotLQkJCX0KLS0JCSAgICAgIGVsc2UgaWYgKGhhc193aWR0aCkKLS0JCQl7Ci0tCQkJICAvKiBVc2UgdGhlIGVudGlyZSBzdHJpbmcsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mCi0tCQkJICAgICBjaGFyYWN0ZXJzLiAgKi8KLS0JCQkgIGFyZ19lbmQgPSBhcmc7Ci0tCQkJICBjaGFyYWN0ZXJzID0gMDsKLS0JCQkgIGZvciAoOzspCi0tCQkJICAgIHsKLS0JCQkgICAgICBpbnQgY291bnQgPSB1MTZfc3RybWJsZW4gKGFyZ19lbmQpOwotLQkJCSAgICAgIGlmIChjb3VudCA9PSAwKQotLQkJCQlicmVhazsKLS0JCQkgICAgICBpZiAoY291bnQgPCAwKQotLQkJCQl7Ci0tCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tCQkJCSAgICBmcmVlIChyZXN1bHQpOwotLQkJCQkgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tCQkJCSAgQ0xFQU5VUCAoKTsKLS0JCQkJICBlcnJubyA9IEVJTFNFUTsKLS0JCQkJICByZXR1cm4gTlVMTDsKLS0JCQkJfQotLQkJCSAgICAgIGFyZ19lbmQgKz0gY291bnQ7Ci0tCQkJICAgICAgY2hhcmFjdGVycysrOwotLQkJCSAgICB9Ci0tCQkJfQotLQkJICAgICAgZWxzZQotLQkJCXsKLS0JCQkgIC8qIFVzZSB0aGUgZW50aXJlIHN0cmluZy4gICovCi0tCQkJICBhcmdfZW5kID0gYXJnICsgdTE2X3N0cmxlbiAoYXJnKTsKLS0JCQkgIC8qIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBkb2Vzbid0IG1hdHRlci4gICovCi0tCQkJICBjaGFyYWN0ZXJzID0gMDsKLS0JCQl9Ci0tCi0tCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotLQkJCSAgJiYgIShkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpKQotLQkJCXsKLS0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotLQkJCSAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotLQkJCSAgRENIQVJfU0VUIChyZXN1bHQgKyBsZW5ndGgsICcgJywgbik7Ci0tCQkJICBsZW5ndGggKz0gbjsKLS0JCQl9Ci0tCi0tIyBpZiBEQ0hBUl9JU19VSU5UMTZfVAotLQkJICAgICAgewotLQkJCXNpemVfdCBuID0gYXJnX2VuZCAtIGFyZzsKLS0JCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0tCQkJRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIGFyZywgbik7Ci0tCQkJbGVuZ3RoICs9IG47Ci0tCQkgICAgICB9Ci0tIyBlbHNlCi0tCQkgICAgICB7IC8qIENvbnZlcnQuICAqLwotLQkJCURDSEFSX1QgKmNvbnZlcnRlZCA9IHJlc3VsdCArIGxlbmd0aDsKLS0JCQlzaXplX3QgY29udmVydGVkX2xlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKLS0jICBpZiBEQ0hBUl9JU19UQ0hBUgotLQkJCS8qIENvbnZlcnQgZnJvbSBVVEYtMTYgdG8gbG9jYWxlIGVuY29kaW5nLiAgKi8KLS0JCQlpZiAodTE2X2NvbnZfdG9fZW5jb2RpbmcgKGxvY2FsZV9jaGFyc2V0ICgpLAotLQkJCQkJCSAgaWNvbnZlaF9xdWVzdGlvbl9tYXJrLAotLQkJCQkJCSAgYXJnLCBhcmdfZW5kIC0gYXJnLCBOVUxMLAotLQkJCQkJCSAgJmNvbnZlcnRlZCwgJmNvbnZlcnRlZF9sZW4pCi0tCQkJICAgIDwgMCkKLS0jICBlbHNlCi0tCQkJLyogQ29udmVydCBmcm9tIFVURi0xNiB0byBVVEYtOC9VVEYtMzIuICAqLwotLQkJCWNvbnZlcnRlZCA9Ci0tCQkJICBVMTZfVE9fRENIQVIgKGFyZywgYXJnX2VuZCAtIGFyZywKLS0JCQkJCWNvbnZlcnRlZCwgJmNvbnZlcnRlZF9sZW4pOwotLQkJCWlmIChjb252ZXJ0ZWQgPT0gTlVMTCkKLS0jICBlbmRpZgotLQkJCSAgewotLQkJCSAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLS0JCQkgICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tCQkJICAgICAgZnJlZSAocmVzdWx0KTsKLS0JCQkgICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLQkJCSAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tCQkJICAgIENMRUFOVVAgKCk7Ci0tCQkJICAgIGVycm5vID0gc2F2ZWRfZXJybm87Ci0tCQkJICAgIHJldHVybiBOVUxMOwotLQkJCSAgfQotLQkJCWlmIChjb252ZXJ0ZWQgIT0gcmVzdWx0ICsgbGVuZ3RoKQotLQkJCSAgewotLQkJCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBjb252ZXJ0ZWRfbGVuKSk7Ci0tCQkJICAgIERDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCBjb252ZXJ0ZWQsIGNvbnZlcnRlZF9sZW4pOwotLQkJCSAgICBmcmVlIChjb252ZXJ0ZWQpOwotLQkJCSAgfQotLQkJCWxlbmd0aCArPSBjb252ZXJ0ZWRfbGVuOwotLQkJICAgICAgfQotLSMgZW5kaWYKLS0KLS0JCSAgICAgIGlmIChoYXNfd2lkdGggJiYgd2lkdGggPiBjaGFyYWN0ZXJzCi0tCQkJICAmJiAoZHAtPmZsYWdzICYgRkxBR19MRUZUKSkKLS0JCQl7Ci0tCQkJICBzaXplX3QgbiA9IHdpZHRoIC0gY2hhcmFjdGVyczsKLS0JCQkgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIG4pKTsKLS0JCQkgIERDSEFSX1NFVCAocmVzdWx0ICsgbGVuZ3RoLCAnICcsIG4pOwotLQkJCSAgbGVuZ3RoICs9IG47Ci0tCQkJfQotLQkJICAgIH0KLS0JCSAgICBicmVhazsKLS0KLS0JCSAgY2FzZSBUWVBFX1UzMl9TVFJJTkc6Ci0tCQkgICAgewotLQkJICAgICAgY29uc3QgdWludDMyX3QgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91MzJfc3RyaW5nOwotLQkJICAgICAgY29uc3QgdWludDMyX3QgKmFyZ19lbmQ7Ci0tCQkgICAgICBzaXplX3QgY2hhcmFjdGVyczsKLS0KLS0JCSAgICAgIGlmIChoYXNfcHJlY2lzaW9uKQotLQkJCXsKLS0JCQkgIC8qIFVzZSBvbmx5IFBSRUNJU0lPTiBjaGFyYWN0ZXJzLCBmcm9tIHRoZSBsZWZ0LiAgKi8KLS0JCQkgIGFyZ19lbmQgPSBhcmc7Ci0tCQkJICBjaGFyYWN0ZXJzID0gMDsKLS0JCQkgIGZvciAoOyBwcmVjaXNpb24gPiAwOyBwcmVjaXNpb24tLSkKLS0JCQkgICAgewotLQkJCSAgICAgIGludCBjb3VudCA9IHUzMl9zdHJtYmxlbiAoYXJnX2VuZCk7Ci0tCQkJICAgICAgaWYgKGNvdW50ID09IDApCi0tCQkJCWJyZWFrOwotLQkJCSAgICAgIGlmIChjb3VudCA8IDApCi0tCQkJCXsKLS0JCQkJICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0JCQkJICAgIGZyZWUgKHJlc3VsdCk7Ci0tCQkJCSAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLQkJCQkgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0JCQkJICBDTEVBTlVQICgpOwotLQkJCQkgIGVycm5vID0gRUlMU0VROwotLQkJCQkgIHJldHVybiBOVUxMOwotLQkJCQl9Ci0tCQkJICAgICAgYXJnX2VuZCArPSBjb3VudDsKLS0JCQkgICAgICBjaGFyYWN0ZXJzKys7Ci0tCQkJICAgIH0KLS0JCQl9Ci0tCQkgICAgICBlbHNlIGlmIChoYXNfd2lkdGgpCi0tCQkJewotLQkJCSAgLyogVXNlIHRoZSBlbnRpcmUgc3RyaW5nLCBhbmQgY291bnQgdGhlIG51bWJlciBvZgotLQkJCSAgICAgY2hhcmFjdGVycy4gICovCi0tCQkJICBhcmdfZW5kID0gYXJnOwotLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0tCQkJICBmb3IgKDs7KQotLQkJCSAgICB7Ci0tCQkJICAgICAgaW50IGNvdW50ID0gdTMyX3N0cm1ibGVuIChhcmdfZW5kKTsKLS0JCQkgICAgICBpZiAoY291bnQgPT0gMCkKLS0JCQkJYnJlYWs7Ci0tCQkJICAgICAgaWYgKGNvdW50IDwgMCkKLS0JCQkJewotLQkJCQkgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCQkgICAgZnJlZSAocmVzdWx0KTsKLS0JCQkJICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJCSAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCQkgIENMRUFOVVAgKCk7Ci0tCQkJCSAgZXJybm8gPSBFSUxTRVE7Ci0tCQkJCSAgcmV0dXJuIE5VTEw7Ci0tCQkJCX0KLS0JCQkgICAgICBhcmdfZW5kICs9IGNvdW50OwotLQkJCSAgICAgIGNoYXJhY3RlcnMrKzsKLS0JCQkgICAgfQotLQkJCX0KLS0JCSAgICAgIGVsc2UKLS0JCQl7Ci0tCQkJICAvKiBVc2UgdGhlIGVudGlyZSBzdHJpbmcuICAqLwotLQkJCSAgYXJnX2VuZCA9IGFyZyArIHUzMl9zdHJsZW4gKGFyZyk7Ci0tCQkJICAvKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZG9lc24ndCBtYXR0ZXIuICAqLwotLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0tCQkJfQotLQotLQkJICAgICAgaWYgKGhhc193aWR0aCAmJiB3aWR0aCA+IGNoYXJhY3RlcnMKLS0JCQkgICYmICEoZHAtPmZsYWdzICYgRkxBR19MRUZUKSkKLS0JCQl7Ci0tCQkJICBzaXplX3QgbiA9IHdpZHRoIC0gY2hhcmFjdGVyczsKLS0JCQkgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIG4pKTsKLS0JCQkgIERDSEFSX1NFVCAocmVzdWx0ICsgbGVuZ3RoLCAnICcsIG4pOwotLQkJCSAgbGVuZ3RoICs9IG47Ci0tCQkJfQotLQotLSMgaWYgRENIQVJfSVNfVUlOVDMyX1QKLS0JCSAgICAgIHsKLS0JCQlzaXplX3QgbiA9IGFyZ19lbmQgLSBhcmc7Ci0tCQkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotLQkJCURDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCBhcmcsIG4pOwotLQkJCWxlbmd0aCArPSBuOwotLQkJICAgICAgfQotLSMgZWxzZQotLQkJICAgICAgeyAvKiBDb252ZXJ0LiAgKi8KLS0JCQlEQ0hBUl9UICpjb252ZXJ0ZWQgPSByZXN1bHQgKyBsZW5ndGg7Ci0tCQkJc2l6ZV90IGNvbnZlcnRlZF9sZW4gPSBhbGxvY2F0ZWQgLSBsZW5ndGg7Ci0tIyAgaWYgRENIQVJfSVNfVENIQVIKLS0JCQkvKiBDb252ZXJ0IGZyb20gVVRGLTMyIHRvIGxvY2FsZSBlbmNvZGluZy4gICovCi0tCQkJaWYgKHUzMl9jb252X3RvX2VuY29kaW5nIChsb2NhbGVfY2hhcnNldCAoKSwKLS0JCQkJCQkgIGljb252ZWhfcXVlc3Rpb25fbWFyaywKLS0JCQkJCQkgIGFyZywgYXJnX2VuZCAtIGFyZywgTlVMTCwKLS0JCQkJCQkgICZjb252ZXJ0ZWQsICZjb252ZXJ0ZWRfbGVuKQotLQkJCSAgICA8IDApCi0tIyAgZWxzZQotLQkJCS8qIENvbnZlcnQgZnJvbSBVVEYtMzIgdG8gVVRGLTgvVVRGLTE2LiAgKi8KLS0JCQljb252ZXJ0ZWQgPQotLQkJCSAgVTMyX1RPX0RDSEFSIChhcmcsIGFyZ19lbmQgLSBhcmcsCi0tCQkJCQljb252ZXJ0ZWQsICZjb252ZXJ0ZWRfbGVuKTsKLS0JCQlpZiAoY29udmVydGVkID09IE5VTEwpCi0tIyAgZW5kaWYKLS0JCQkgIHsKLS0JCQkgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0tCQkJICAgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLQkJCSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0tCQkJICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0JCQkgICAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLQkJCSAgICBDTEVBTlVQICgpOwotLQkJCSAgICBlcnJubyA9IHNhdmVkX2Vycm5vOwotLQkJCSAgICByZXR1cm4gTlVMTDsKLS0JCQkgIH0KLS0JCQlpZiAoY29udmVydGVkICE9IHJlc3VsdCArIGxlbmd0aCkKLS0JCQkgIHsKLS0JCQkgICAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgY29udmVydGVkX2xlbikpOwotLQkJCSAgICBEQ0hBUl9DUFkgKHJlc3VsdCArIGxlbmd0aCwgY29udmVydGVkLCBjb252ZXJ0ZWRfbGVuKTsKLS0JCQkgICAgZnJlZSAoY29udmVydGVkKTsKLS0JCQkgIH0KLS0JCQlsZW5ndGggKz0gY29udmVydGVkX2xlbjsKLS0JCSAgICAgIH0KLS0jIGVuZGlmCi0tCi0tCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotLQkJCSAgJiYgKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkpCi0tCQkJewotLQkJCSAgc2l6ZV90IG4gPSB3aWR0aCAtIGNoYXJhY3RlcnM7Ci0tCQkJICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0tCQkJICBEQ0hBUl9TRVQgKHJlc3VsdCArIGxlbmd0aCwgJyAnLCBuKTsKLS0JCQkgIGxlbmd0aCArPSBuOwotLQkJCX0KLS0JCSAgICB9Ci0tCQkgICAgYnJlYWs7Ci0tCi0tCQkgIGRlZmF1bHQ6Ci0tCQkgICAgYWJvcnQgKCk7Ci0tCQkgIH0KLS0JICAgICAgfQotLSNlbmRpZgotLSNpZiAoTkVFRF9QUklOVEZfRElSRUNUSVZFX0EgfHwgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0tCSAgICBlbHNlIGlmICgoZHAtPmNvbnZlcnNpb24gPT0gJ2EnIHx8IGRwLT5jb252ZXJzaW9uID09ICdBJykKLS0jIGlmICEoTkVFRF9QUklOVEZfRElSRUNUSVZFX0EgfHwgKE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFICYmIE5FRURfUFJJTlRGX0RPVUJMRSkpCi0tCQkgICAgICYmICgwCi0tIyAgaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0tCQkJIHx8IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9ET1VCTEUKLS0jICBlbmRpZgotLSMgIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0tCQkJIHx8IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9MT05HRE9VQkxFCi0tIyAgZW5kaWYKLS0JCQkpCi0tIyBlbmRpZgotLQkJICAgICkKLS0JICAgICAgewotLQkJYXJnX3R5cGUgdHlwZSA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGU7Ci0tCQlpbnQgZmxhZ3MgPSBkcC0+ZmxhZ3M7Ci0tCQlpbnQgaGFzX3dpZHRoOwotLQkJc2l6ZV90IHdpZHRoOwotLQkJaW50IGhhc19wcmVjaXNpb247Ci0tCQlzaXplX3QgcHJlY2lzaW9uOwotLQkJc2l6ZV90IHRtcF9sZW5ndGg7Ci0tCQlEQ0hBUl9UIHRtcGJ1Zls3MDBdOwotLQkJRENIQVJfVCAqdG1wOwotLQkJRENIQVJfVCAqcGFkX3B0cjsKLS0JCURDSEFSX1QgKnA7Ci0tCi0tCQloYXNfd2lkdGggPSAwOwotLQkJd2lkdGggPSAwOwotLQkJaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQotLQkJICB7Ci0tCQkgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0tCQkgICAgICB7Ci0tCQkJaW50IGFyZzsKLS0KLS0JCQlpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLS0JCQkgIGFib3J0ICgpOwotLQkJCWFyZyA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkJaWYgKGFyZyA8IDApCi0tCQkJICB7Ci0tCQkJICAgIC8qICJBIG5lZ2F0aXZlIGZpZWxkIHdpZHRoIGlzIHRha2VuIGFzIGEgJy0nIGZsYWcKLS0JCQkgICAgICAgIGZvbGxvd2VkIGJ5IGEgcG9zaXRpdmUgZmllbGQgd2lkdGguIiAgKi8KLS0JCQkgICAgZmxhZ3MgfD0gRkxBR19MRUZUOwotLQkJCSAgICB3aWR0aCA9ICh1bnNpZ25lZCBpbnQpICgtYXJnKTsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB3aWR0aCA9IGFyZzsKLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPndpZHRoX3N0YXJ0OwotLQotLQkJCWRvCi0tCQkJICB3aWR0aCA9IHhzdW0gKHh0aW1lcyAod2lkdGgsIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLS0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT53aWR0aF9lbmQpOwotLQkJICAgICAgfQotLQkJICAgIGhhc193aWR0aCA9IDE7Ci0tCQkgIH0KLS0KLS0JCWhhc19wcmVjaXNpb24gPSAwOwotLQkJcHJlY2lzaW9uID0gMDsKLS0JCWlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQotLQkJICB7Ci0tCQkgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQotLQkJICAgICAgewotLQkJCWludCBhcmc7Ci0tCi0tCQkJaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJYXJnID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkJLyogIkEgbmVnYXRpdmUgcHJlY2lzaW9uIGlzIHRha2VuIGFzIGlmIHRoZSBwcmVjaXNpb24KLS0JCQkgICAgd2VyZSBvbWl0dGVkLiIgICovCi0tCQkJaWYgKGFyZyA+PSAwKQotLQkJCSAgewotLQkJCSAgICBwcmVjaXNpb24gPSBhcmc7Ci0tCQkJICAgIGhhc19wcmVjaXNpb24gPSAxOwotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+cHJlY2lzaW9uX3N0YXJ0ICsgMTsKLS0KLS0JCQlwcmVjaXNpb24gPSAwOwotLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0tCQkJICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotLQkJCWhhc19wcmVjaXNpb24gPSAxOwotLQkJICAgICAgfQotLQkJICB9Ci0tCi0tCQkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplLiAgKi8KLS0JCWlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKLS0JCSAgdG1wX2xlbmd0aCA9Ci0tCQkgICAgKHVuc2lnbmVkIGludCkgKChMREJMX0RJRyArIDEpCi0tCQkJCSAgICAqIDAuODMxIC8qIGRlY2ltYWwgLT4gaGV4YWRlY2ltYWwgKi8KLS0JCQkJICAgKQotLQkJICAgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLS0JCWVsc2UKLS0JCSAgdG1wX2xlbmd0aCA9Ci0tCQkgICAgKHVuc2lnbmVkIGludCkgKChEQkxfRElHICsgMSkKLS0JCQkJICAgICogMC44MzEgLyogZGVjaW1hbCAtPiBoZXhhZGVjaW1hbCAqLwotLQkJCQkgICApCi0tCQkgICAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0tCQkgIHRtcF9sZW5ndGggPSBwcmVjaXNpb247Ci0tCQkvKiBBY2NvdW50IGZvciBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KLS0JCXRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxMik7Ci0tCi0tCQlpZiAodG1wX2xlbmd0aCA8IHdpZHRoKQotLQkJICB0bXBfbGVuZ3RoID0gd2lkdGg7Ci0tCi0tCQl0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7IC8qIGFjY291bnQgZm9yIHRyYWlsaW5nIE5VTCAqLwotLQotLQkJaWYgKHRtcF9sZW5ndGggPD0gc2l6ZW9mICh0bXBidWYpIC8gc2l6ZW9mIChEQ0hBUl9UKSkKLS0JCSAgdG1wID0gdG1wYnVmOwotLQkJZWxzZQotLQkJICB7Ci0tCQkgICAgc2l6ZV90IHRtcF9tZW1zaXplID0geHRpbWVzICh0bXBfbGVuZ3RoLCBzaXplb2YgKERDSEFSX1QpKTsKLS0KLS0JCSAgICBpZiAoc2l6ZV9vdmVyZmxvd19wICh0bXBfbWVtc2l6ZSkpCi0tCQkgICAgICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KLS0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCSAgICB0bXAgPSAoRENIQVJfVCAqKSBtYWxsb2MgKHRtcF9tZW1zaXplKTsKLS0JCSAgICBpZiAodG1wID09IE5VTEwpCi0tCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KLS0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCSAgfQotLQotLQkJcGFkX3B0ciA9IE5VTEw7Ci0tCQlwID0gdG1wOwotLQkJaWYgKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFKQotLQkJICB7Ci0tIyBpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotLQkJICAgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOwotLQotLQkJICAgIGlmIChpc25hbmwgKGFyZykpCi0tCQkgICAgICB7Ci0tCQkJaWYgKGRwLT5jb252ZXJzaW9uID09ICdBJykKLS0JCQkgIHsKLS0JCQkgICAgKnArKyA9ICdOJzsgKnArKyA9ICdBJzsgKnArKyA9ICdOJzsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgICpwKysgPSAnbic7ICpwKysgPSAnYSc7ICpwKysgPSAnbic7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWludCBzaWduID0gMDsKLS0JCQlERUNMX0xPTkdfRE9VQkxFX1JPVU5ESU5HCi0tCi0tCQkJQkVHSU5fTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0tCi0tCQkJaWYgKHNpZ25iaXQgKGFyZykpIC8qIGFyZyA8IDAuMEwgb3IgbmVnYXRpdmUgemVybyAqLwotLQkJCSAgewotLQkJCSAgICBzaWduID0gLTE7Ci0tCQkJICAgIGFyZyA9IC1hcmc7Ci0tCQkJICB9Ci0tCi0tCQkJaWYgKHNpZ24gPCAwKQotLQkJCSAgKnArKyA9ICctJzsKLS0JCQllbHNlIGlmIChmbGFncyAmIEZMQUdfU0hPV1NJR04pCi0tCQkJICAqcCsrID0gJysnOwotLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TUEFDRSkKLS0JCQkgICpwKysgPSAnICc7Ci0tCi0tCQkJaWYgKGFyZyA+IDAuMEwgJiYgYXJnICsgYXJnID09IGFyZykKLS0JCQkgIHsKLS0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdBJykKLS0JCQkgICAgICB7Ci0tCQkJCSpwKysgPSAnSSc7ICpwKysgPSAnTic7ICpwKysgPSAnRic7Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgewotLQkJCQkqcCsrID0gJ2knOyAqcCsrID0gJ24nOyAqcCsrID0gJ2YnOwotLQkJCSAgICAgIH0KLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgIGludCBleHBvbmVudDsKLS0JCQkgICAgbG9uZyBkb3VibGUgbWFudGlzc2E7Ci0tCi0tCQkJICAgIGlmIChhcmcgPiAwLjBMKQotLQkJCSAgICAgIG1hbnRpc3NhID0gcHJpbnRmX2ZyZXhwbCAoYXJnLCAmZXhwb25lbnQpOwotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgewotLQkJCQlleHBvbmVudCA9IDA7Ci0tCQkJCW1hbnRpc3NhID0gMC4wTDsKLS0JCQkgICAgICB9Ci0tCi0tCQkJICAgIGlmIChoYXNfcHJlY2lzaW9uCi0tCQkJCSYmIHByZWNpc2lvbiA8ICh1bnNpZ25lZCBpbnQpICgoTERCTF9ESUcgKyAxKSAqIDAuODMxKSArIDEpCi0tCQkJICAgICAgewotLQkJCQkvKiBSb3VuZCB0aGUgbWFudGlzc2EuICAqLwotLQkJCQlsb25nIGRvdWJsZSB0YWlsID0gbWFudGlzc2E7Ci0tCQkJCXNpemVfdCBxOwotLQotLQkJCQlmb3IgKHEgPSBwcmVjaXNpb247IDsgcS0tKQotLQkJCQkgIHsKLS0JCQkJICAgIGludCBkaWdpdCA9IChpbnQpIHRhaWw7Ci0tCQkJCSAgICB0YWlsIC09IGRpZ2l0OwotLQkJCQkgICAgaWYgKHEgPT0gMCkKLS0JCQkJICAgICAgewotLQkJCQkJaWYgKGRpZ2l0ICYgMSA/IHRhaWwgPj0gMC41TCA6IHRhaWwgPiAwLjVMKQotLQkJCQkJICB0YWlsID0gMSAtIHRhaWw7Ci0tCQkJCQllbHNlCi0tCQkJCQkgIHRhaWwgPSAtIHRhaWw7Ci0tCQkJCQlicmVhazsKLS0JCQkJICAgICAgfQotLQkJCQkgICAgdGFpbCAqPSAxNi4wTDsKLS0JCQkJICB9Ci0tCQkJCWlmICh0YWlsICE9IDAuMEwpCi0tCQkJCSAgZm9yIChxID0gcHJlY2lzaW9uOyBxID4gMDsgcS0tKQotLQkJCQkgICAgdGFpbCAqPSAwLjA2MjVMOwotLQkJCQltYW50aXNzYSArPSB0YWlsOwotLQkJCSAgICAgIH0KLS0KLS0JCQkgICAgKnArKyA9ICcwJzsKLS0JCQkgICAgKnArKyA9IGRwLT5jb252ZXJzaW9uIC0gJ0EnICsgJ1gnOwotLQkJCSAgICBwYWRfcHRyID0gcDsKLS0JCQkgICAgewotLQkJCSAgICAgIGludCBkaWdpdDsKLS0KLS0JCQkgICAgICBkaWdpdCA9IChpbnQpIG1hbnRpc3NhOwotLQkJCSAgICAgIG1hbnRpc3NhIC09IGRpZ2l0OwotLQkJCSAgICAgICpwKysgPSAnMCcgKyBkaWdpdDsKLS0JCQkgICAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpCi0tCQkJCSAgfHwgbWFudGlzc2EgPiAwLjBMIHx8IHByZWNpc2lvbiA+IDApCi0tCQkJCXsKLS0JCQkJICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkgIC8qIFRoaXMgbG9vcCB0ZXJtaW5hdGVzIGJlY2F1c2Ugd2UgYXNzdW1lCi0tCQkJCSAgICAgdGhhdCBGTFRfUkFESVggaXMgYSBwb3dlciBvZiAyLiAgKi8KLS0JCQkJICB3aGlsZSAobWFudGlzc2EgPiAwLjBMKQotLQkJCQkgICAgewotLQkJCQkgICAgICBtYW50aXNzYSAqPSAxNi4wTDsKLS0JCQkJICAgICAgZGlnaXQgPSAoaW50KSBtYW50aXNzYTsKLS0JCQkJICAgICAgbWFudGlzc2EgLT0gZGlnaXQ7Ci0tCQkJCSAgICAgICpwKysgPSBkaWdpdAotLQkJCQkJICAgICArIChkaWdpdCA8IDEwCi0tCQkJCQkJPyAnMCcKLS0JCQkJCQk6IGRwLT5jb252ZXJzaW9uIC0gMTApOwotLQkJCQkgICAgICBpZiAocHJlY2lzaW9uID4gMCkKLS0JCQkJCXByZWNpc2lvbi0tOwotLQkJCQkgICAgfQotLQkJCQkgIHdoaWxlIChwcmVjaXNpb24gPiAwKQotLQkJCQkgICAgewotLQkJCQkgICAgICAqcCsrID0gJzAnOwotLQkJCQkgICAgICBwcmVjaXNpb24tLTsKLS0JCQkJICAgIH0KLS0JCQkJfQotLQkJCSAgICAgIH0KLS0JCQkgICAgICAqcCsrID0gZHAtPmNvbnZlcnNpb24gLSAnQScgKyAnUCc7Ci0tIyAgaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0JCQkgICAgICB7Ci0tCQkJCXN0YXRpYyBjb25zdCB3Y2hhcl90IGRlY2ltYWxfZm9ybWF0W10gPQotLQkJCQkgIHsgJyUnLCAnKycsICdkJywgJ1wwJyB9OwotLQkJCQlTTlBSSU5URiAocCwgNiArIDEsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0tCQkJICAgICAgfQotLQkJCSAgICAgIHdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQlwKys7Ci0tIyAgZWxzZQotLQkJCSAgICAgIGlmIChzaXplb2YgKERDSEFSX1QpID09IDEpCi0tCQkJCXsKLS0JCQkJICBzcHJpbnRmICgoY2hhciAqKSBwLCAiJStkIiwgZXhwb25lbnQpOwotLQkJCQkgIHdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkgICAgcCsrOwotLQkJCQl9Ci0tCQkJICAgICAgZWxzZQotLQkJCQl7Ci0tCQkJCSAgY2hhciBleHBidWZbNiArIDFdOwotLQkJCQkgIGNvbnN0IGNoYXIgKmVwOwotLQkJCQkgIHNwcmludGYgKGV4cGJ1ZiwgIiUrZCIsIGV4cG9uZW50KTsKLS0JCQkJICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0tCQkJCSAgICBwKys7Ci0tCQkJCX0KLS0jICBlbmRpZgotLQkJCSAgfQotLQotLQkJCUVORF9MT05HX0RPVUJMRV9ST1VORElORyAoKTsKLS0JCSAgICAgIH0KLS0jIGVsc2UKLS0JCSAgICBhYm9ydCAoKTsKLS0jIGVuZGlmCi0tCQkgIH0KLS0JCWVsc2UKLS0JCSAgewotLSMgaWYgTkVFRF9QUklOVEZfRElSRUNUSVZFX0EgfHwgTkVFRF9QUklOVEZfRE9VQkxFCi0tCQkgICAgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9kb3VibGU7Ci0tCi0tCQkgICAgaWYgKGlzbmFuIChhcmcpKQotLQkJICAgICAgewotLQkJCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnQScpCi0tCQkJICB7Ci0tCQkJICAgICpwKysgPSAnTic7ICpwKysgPSAnQSc7ICpwKysgPSAnTic7Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLQkJCSAgICAqcCsrID0gJ24nOyAqcCsrID0gJ2EnOyAqcCsrID0gJ24nOwotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQlpbnQgc2lnbiA9IDA7Ci0tCi0tCQkJaWYgKHNpZ25iaXQgKGFyZykpIC8qIGFyZyA8IDAuMCBvciBuZWdhdGl2ZSB6ZXJvICovCi0tCQkJICB7Ci0tCQkJICAgIHNpZ24gPSAtMTsKLS0JCQkgICAgYXJnID0gLWFyZzsKLS0JCQkgIH0KLS0KLS0JCQlpZiAoc2lnbiA8IDApCi0tCQkJICAqcCsrID0gJy0nOwotLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TSE9XU0lHTikKLS0JCQkgICpwKysgPSAnKyc7Ci0tCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NQQUNFKQotLQkJCSAgKnArKyA9ICcgJzsKLS0KLS0JCQlpZiAoYXJnID4gMC4wICYmIGFyZyArIGFyZyA9PSBhcmcpCi0tCQkJICB7Ci0tCQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnQScpCi0tCQkJICAgICAgewotLQkJCQkqcCsrID0gJ0knOyAqcCsrID0gJ04nOyAqcCsrID0gJ0YnOwotLQkJCSAgICAgIH0KLS0JCQkgICAgZWxzZQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICdpJzsgKnArKyA9ICduJzsgKnArKyA9ICdmJzsKLS0JCQkgICAgICB9Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLQkJCSAgICBpbnQgZXhwb25lbnQ7Ci0tCQkJICAgIGRvdWJsZSBtYW50aXNzYTsKLS0KLS0JCQkgICAgaWYgKGFyZyA+IDAuMCkKLS0JCQkgICAgICBtYW50aXNzYSA9IHByaW50Zl9mcmV4cCAoYXJnLCAmZXhwb25lbnQpOwotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgewotLQkJCQlleHBvbmVudCA9IDA7Ci0tCQkJCW1hbnRpc3NhID0gMC4wOwotLQkJCSAgICAgIH0KLS0KLS0JCQkgICAgaWYgKGhhc19wcmVjaXNpb24KLS0JCQkJJiYgcHJlY2lzaW9uIDwgKHVuc2lnbmVkIGludCkgKChEQkxfRElHICsgMSkgKiAwLjgzMSkgKyAxKQotLQkJCSAgICAgIHsKLS0JCQkJLyogUm91bmQgdGhlIG1hbnRpc3NhLiAgKi8KLS0JCQkJZG91YmxlIHRhaWwgPSBtYW50aXNzYTsKLS0JCQkJc2l6ZV90IHE7Ci0tCi0tCQkJCWZvciAocSA9IHByZWNpc2lvbjsgOyBxLS0pCi0tCQkJCSAgewotLQkJCQkgICAgaW50IGRpZ2l0ID0gKGludCkgdGFpbDsKLS0JCQkJICAgIHRhaWwgLT0gZGlnaXQ7Ci0tCQkJCSAgICBpZiAocSA9PSAwKQotLQkJCQkgICAgICB7Ci0tCQkJCQlpZiAoZGlnaXQgJiAxID8gdGFpbCA+PSAwLjUgOiB0YWlsID4gMC41KQotLQkJCQkJICB0YWlsID0gMSAtIHRhaWw7Ci0tCQkJCQllbHNlCi0tCQkJCQkgIHRhaWwgPSAtIHRhaWw7Ci0tCQkJCQlicmVhazsKLS0JCQkJICAgICAgfQotLQkJCQkgICAgdGFpbCAqPSAxNi4wOwotLQkJCQkgIH0KLS0JCQkJaWYgKHRhaWwgIT0gMC4wKQotLQkJCQkgIGZvciAocSA9IHByZWNpc2lvbjsgcSA+IDA7IHEtLSkKLS0JCQkJICAgIHRhaWwgKj0gMC4wNjI1OwotLQkJCQltYW50aXNzYSArPSB0YWlsOwotLQkJCSAgICAgIH0KLS0KLS0JCQkgICAgKnArKyA9ICcwJzsKLS0JCQkgICAgKnArKyA9IGRwLT5jb252ZXJzaW9uIC0gJ0EnICsgJ1gnOwotLQkJCSAgICBwYWRfcHRyID0gcDsKLS0JCQkgICAgewotLQkJCSAgICAgIGludCBkaWdpdDsKLS0KLS0JCQkgICAgICBkaWdpdCA9IChpbnQpIG1hbnRpc3NhOwotLQkJCSAgICAgIG1hbnRpc3NhIC09IGRpZ2l0OwotLQkJCSAgICAgICpwKysgPSAnMCcgKyBkaWdpdDsKLS0JCQkgICAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpCi0tCQkJCSAgfHwgbWFudGlzc2EgPiAwLjAgfHwgcHJlY2lzaW9uID4gMCkKLS0JCQkJewotLQkJCQkgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCSAgLyogVGhpcyBsb29wIHRlcm1pbmF0ZXMgYmVjYXVzZSB3ZSBhc3N1bWUKLS0JCQkJICAgICB0aGF0IEZMVF9SQURJWCBpcyBhIHBvd2VyIG9mIDIuICAqLwotLQkJCQkgIHdoaWxlIChtYW50aXNzYSA+IDAuMCkKLS0JCQkJICAgIHsKLS0JCQkJICAgICAgbWFudGlzc2EgKj0gMTYuMDsKLS0JCQkJICAgICAgZGlnaXQgPSAoaW50KSBtYW50aXNzYTsKLS0JCQkJICAgICAgbWFudGlzc2EgLT0gZGlnaXQ7Ci0tCQkJCSAgICAgICpwKysgPSBkaWdpdAotLQkJCQkJICAgICArIChkaWdpdCA8IDEwCi0tCQkJCQkJPyAnMCcKLS0JCQkJCQk6IGRwLT5jb252ZXJzaW9uIC0gMTApOwotLQkJCQkgICAgICBpZiAocHJlY2lzaW9uID4gMCkKLS0JCQkJCXByZWNpc2lvbi0tOwotLQkJCQkgICAgfQotLQkJCQkgIHdoaWxlIChwcmVjaXNpb24gPiAwKQotLQkJCQkgICAgewotLQkJCQkgICAgICAqcCsrID0gJzAnOwotLQkJCQkgICAgICBwcmVjaXNpb24tLTsKLS0JCQkJICAgIH0KLS0JCQkJfQotLQkJCSAgICAgIH0KLS0JCQkgICAgICAqcCsrID0gZHAtPmNvbnZlcnNpb24gLSAnQScgKyAnUCc7Ci0tIyAgaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0JCQkgICAgICB7Ci0tCQkJCXN0YXRpYyBjb25zdCB3Y2hhcl90IGRlY2ltYWxfZm9ybWF0W10gPQotLQkJCQkgIHsgJyUnLCAnKycsICdkJywgJ1wwJyB9OwotLQkJCQlTTlBSSU5URiAocCwgNiArIDEsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0tCQkJICAgICAgfQotLQkJCSAgICAgIHdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQlwKys7Ci0tIyAgZWxzZQotLQkJCSAgICAgIGlmIChzaXplb2YgKERDSEFSX1QpID09IDEpCi0tCQkJCXsKLS0JCQkJICBzcHJpbnRmICgoY2hhciAqKSBwLCAiJStkIiwgZXhwb25lbnQpOwotLQkJCQkgIHdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkgICAgcCsrOwotLQkJCQl9Ci0tCQkJICAgICAgZWxzZQotLQkJCQl7Ci0tCQkJCSAgY2hhciBleHBidWZbNiArIDFdOwotLQkJCQkgIGNvbnN0IGNoYXIgKmVwOwotLQkJCQkgIHNwcmludGYgKGV4cGJ1ZiwgIiUrZCIsIGV4cG9uZW50KTsKLS0JCQkJICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0tCQkJCSAgICBwKys7Ci0tCQkJCX0KLS0jICBlbmRpZgotLQkJCSAgfQotLQkJICAgICAgfQotLSMgZWxzZQotLQkJICAgIGFib3J0ICgpOwotLSMgZW5kaWYKLS0JCSAgfQotLQkJLyogVGhlIGdlbmVyYXRlZCBzdHJpbmcgbm93IGV4dGVuZHMgZnJvbSB0bXAgdG8gcCwgd2l0aCB0aGUKLS0JCSAgIHplcm8gcGFkZGluZyBpbnNlcnRpb24gcG9pbnQgYmVpbmcgYXQgcGFkX3B0ci4gICovCi0tCQlpZiAoaGFzX3dpZHRoICYmIHAgLSB0bXAgPCB3aWR0aCkKLS0JCSAgewotLQkJICAgIHNpemVfdCBwYWQgPSB3aWR0aCAtIChwIC0gdG1wKTsKLS0JCSAgICBEQ0hBUl9UICplbmQgPSBwICsgcGFkOwotLQotLQkJICAgIGlmIChmbGFncyAmIEZMQUdfTEVGVCkKLS0JCSAgICAgIHsKLS0JCQkvKiBQYWQgd2l0aCBzcGFjZXMgb24gdGhlIHJpZ2h0LiAgKi8KLS0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJICAqcCsrID0gJyAnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UgaWYgKChmbGFncyAmIEZMQUdfWkVSTykgJiYgcGFkX3B0ciAhPSBOVUxMKQotLQkJICAgICAgewotLQkJCS8qIFBhZCB3aXRoIHplcm9lcy4gICovCi0tCQkJRENIQVJfVCAqcSA9IGVuZDsKLS0KLS0JCQl3aGlsZSAocCA+IHBhZF9wdHIpCi0tCQkJICAqLS1xID0gKi0tcDsKLS0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJICAqcCsrID0gJzAnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQkvKiBQYWQgd2l0aCBzcGFjZXMgb24gdGhlIGxlZnQuICAqLwotLQkJCURDSEFSX1QgKnEgPSBlbmQ7Ci0tCi0tCQkJd2hpbGUgKHAgPiB0bXApCi0tCQkJICAqLS1xID0gKi0tcDsKLS0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0tCQkJICAqcCsrID0gJyAnOwotLQkJICAgICAgfQotLQotLQkJICAgIHAgPSBlbmQ7Ci0tCQkgIH0KLS0KLS0JCXsKLS0JCSAgc2l6ZV90IGNvdW50ID0gcCAtIHRtcDsKLS0KLS0JCSAgaWYgKGNvdW50ID49IHRtcF9sZW5ndGgpCi0tCQkgICAgLyogdG1wX2xlbmd0aCB3YXMgaW5jb3JyZWN0bHkgY2FsY3VsYXRlZCAtIGZpeCB0aGUKLS0JCSAgICAgICBjb2RlIGFib3ZlISAgKi8KLS0JCSAgICBhYm9ydCAoKTsKLS0KLS0JCSAgLyogTWFrZSByb29tIGZvciB0aGUgcmVzdWx0LiAgKi8KLS0JCSAgaWYgKGNvdW50ID49IGFsbG9jYXRlZCAtIGxlbmd0aCkKLS0JCSAgICB7Ci0tCQkgICAgICBzaXplX3QgbiA9IHhzdW0gKGxlbmd0aCwgY291bnQpOwotLQotLQkJICAgICAgRU5TVVJFX0FMTE9DQVRJT04gKG4pOwotLQkJICAgIH0KLS0KLS0JCSAgLyogQXBwZW5kIHRoZSByZXN1bHQuICAqLwotLQkJICBtZW1jcHkgKHJlc3VsdCArIGxlbmd0aCwgdG1wLCBjb3VudCAqIHNpemVvZiAoRENIQVJfVCkpOwotLQkJICBpZiAodG1wICE9IHRtcGJ1ZikKLS0JCSAgICBmcmVlICh0bXApOwotLQkJICBsZW5ndGggKz0gY291bnQ7Ci0tCQl9Ci0tCSAgICAgIH0KLS0jZW5kaWYKLS0jaWYgKE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRSB8fCBORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLS0JICAgIGVsc2UgaWYgKChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnCi0tCQkgICAgICB8fCBkcC0+Y29udmVyc2lvbiA9PSAnZScgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0UnCi0tCQkgICAgICB8fCBkcC0+Y29udmVyc2lvbiA9PSAnZycgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0cnCi0tCQkgICAgICB8fCBkcC0+Y29udmVyc2lvbiA9PSAnYScgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0EnKQotLQkJICAgICAmJiAoMAotLSMgaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0tCQkJIHx8IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9ET1VCTEUKLS0jIGVsaWYgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFCi0tCQkJIHx8IChhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlID09IFRZUEVfRE9VQkxFCi0tCQkJICAgICAvKiBUaGUgc3lzdGVtcyAobWluZ3cpIHdoaWNoIHByb2R1Y2Ugd3Jvbmcgb3V0cHV0Ci0tCQkJCWZvciBJbmYsIC1JbmYsIGFuZCBOYU4gYWxzbyBkbyBzbyBmb3IgLTAuMC4KLS0JCQkJVGhlcmVmb3JlIHdlIHRyZWF0IHRoaXMgY2FzZSBoZXJlIGFzIHdlbGwuICAqLwotLQkJCSAgICAgJiYgaXNfaW5maW5pdGVfb3JfemVybyAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2RvdWJsZSkpCi0tIyBlbmRpZgotLSMgaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0JCQkgfHwgYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0xPTkdET1VCTEUKLS0jIGVsaWYgTkVFRF9QUklOVEZfSU5GSU5JVEVfTE9OR19ET1VCTEUKLS0JCQkgfHwgKGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9MT05HRE9VQkxFCi0tCQkJICAgICAvKiBTb21lIHN5c3RlbXMgcHJvZHVjZSB3cm9uZyBvdXRwdXQgZm9yIEluZiwKLS0JCQkJLUluZiwgYW5kIE5hTi4gICovCi0tCQkJICAgICAmJiBpc19pbmZpbml0ZWwgKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlKSkKLS0jIGVuZGlmCi0tCQkJKSkKLS0JICAgICAgewotLSMgaWYgKE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUpICYmIChORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRSkKLS0JCWFyZ190eXBlIHR5cGUgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlOwotLSMgZW5kaWYKLS0JCWludCBmbGFncyA9IGRwLT5mbGFnczsKLS0JCWludCBoYXNfd2lkdGg7Ci0tCQlzaXplX3Qgd2lkdGg7Ci0tCQlpbnQgaGFzX3ByZWNpc2lvbjsKLS0JCXNpemVfdCBwcmVjaXNpb247Ci0tCQlzaXplX3QgdG1wX2xlbmd0aDsKLS0JCURDSEFSX1QgdG1wYnVmWzcwMF07Ci0tCQlEQ0hBUl9UICp0bXA7Ci0tCQlEQ0hBUl9UICpwYWRfcHRyOwotLQkJRENIQVJfVCAqcDsKLS0KLS0JCWhhc193aWR0aCA9IDA7Ci0tCQl3aWR0aCA9IDA7Ci0tCQlpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgICAgIHsKLS0JCQlpbnQgYXJnOwotLQotLQkJCWlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotLQkJCSAgYWJvcnQgKCk7Ci0tCQkJYXJnID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCQlpZiAoYXJnIDwgMCkKLS0JCQkgIHsKLS0JCQkgICAgLyogIkEgbmVnYXRpdmUgZmllbGQgd2lkdGggaXMgdGFrZW4gYXMgYSAnLScgZmxhZwotLQkJCSAgICAgICAgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aC4iICAqLwotLQkJCSAgICBmbGFncyB8PSBGTEFHX0xFRlQ7Ci0tCQkJICAgIHdpZHRoID0gKHVuc2lnbmVkIGludCkgKC1hcmcpOwotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHdpZHRoID0gYXJnOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7Ci0tCi0tCQkJZG8KLS0JCQkgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPndpZHRoX2VuZCk7Ci0tCQkgICAgICB9Ci0tCQkgICAgaGFzX3dpZHRoID0gMTsKLS0JCSAgfQotLQotLQkJaGFzX3ByZWNpc2lvbiA9IDA7Ci0tCQlwcmVjaXNpb24gPSAwOwotLQkJaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0tCQkgICAgICB7Ci0tCQkJaW50IGFyZzsKLS0KLS0JCQlpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0tCQkJICBhYm9ydCAoKTsKLS0JCQlhcmcgPSBhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0uYS5hX2ludDsKLS0JCQkvKiAiQSBuZWdhdGl2ZSBwcmVjaXNpb24gaXMgdGFrZW4gYXMgaWYgdGhlIHByZWNpc2lvbgotLQkJCSAgICB3ZXJlIG9taXR0ZWQuIiAgKi8KLS0JCQlpZiAoYXJnID49IDApCi0tCQkJICB7Ci0tCQkJICAgIHByZWNpc2lvbiA9IGFyZzsKLS0JCQkgICAgaGFzX3ByZWNpc2lvbiA9IDE7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgICAgZWxzZQotLQkJICAgICAgewotLQkJCWNvbnN0IEZDSEFSX1QgKmRpZ2l0cCA9IGRwLT5wcmVjaXNpb25fc3RhcnQgKyAxOwotLQotLQkJCXByZWNpc2lvbiA9IDA7Ci0tCQkJd2hpbGUgKGRpZ2l0cCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLS0JCQkgIHByZWNpc2lvbiA9IHhzdW0gKHh0aW1lcyAocHJlY2lzaW9uLCAxMCksICpkaWdpdHArKyAtICcwJyk7Ci0tCQkJaGFzX3ByZWNpc2lvbiA9IDE7Ci0tCQkgICAgICB9Ci0tCQkgIH0KLS0KLS0JCS8qIFBPU0lYIHNwZWNpZmllcyB0aGUgZGVmYXVsdCBwcmVjaXNpb24gdG8gYmUgNiBmb3IgJWYsICVGLAotLQkJICAgJWUsICVFLCBidXQgbm90IGZvciAlZywgJUcuICBJbXBsZW1lbnRhdGlvbnMgYXBwZWFyIHRvIHVzZQotLQkJICAgdGhlIHNhbWUgZGVmYXVsdCBwcmVjaXNpb24gYWxzbyBmb3IgJWcsICVHLiAgKi8KLS0JCWlmICghaGFzX3ByZWNpc2lvbikKLS0JCSAgcHJlY2lzaW9uID0gNjsKLS0KLS0JCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUuICAqLwotLSMgaWYgTkVFRF9QUklOVEZfRE9VQkxFICYmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0tCQl0bXBfbGVuZ3RoID0gKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFID8gTERCTF9ESUcgKyAxIDogREJMX0RJRyArIDEpOwotLSMgZWxpZiBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUgJiYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0JCXRtcF9sZW5ndGggPSAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUgPyBMREJMX0RJRyArIDEgOiAwKTsKLS0jIGVsaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLS0JCXRtcF9sZW5ndGggPSBMREJMX0RJRyArIDE7Ci0tIyBlbGlmIE5FRURfUFJJTlRGX0RPVUJMRQotLQkJdG1wX2xlbmd0aCA9IERCTF9ESUcgKyAxOwotLSMgZWxzZQotLQkJdG1wX2xlbmd0aCA9IDA7Ci0tIyBlbmRpZgotLQkJaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0tCQkgIHRtcF9sZW5ndGggPSBwcmVjaXNpb247Ci0tIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotLSMgIGlmIE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUKLS0JCWlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKLS0jICBlbmRpZgotLQkJICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2YnIHx8IGRwLT5jb252ZXJzaW9uID09ICdGJykKLS0JCSAgICB7Ci0tCQkgICAgICBsb25nIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2RvdWJsZTsKLS0JCSAgICAgIGlmICghKGlzbmFubCAoYXJnKSB8fCBhcmcgKyBhcmcgPT0gYXJnKSkKLS0JCQl7Ci0tCQkJICAvKiBhcmcgaXMgZmluaXRlIGFuZCBub256ZXJvLiAgKi8KLS0JCQkgIGludCBleHBvbmVudCA9IGZsb29ybG9nMTBsIChhcmcgPCAwID8gLWFyZyA6IGFyZyk7Ci0tCQkJICBpZiAoZXhwb25lbnQgPj0gMCAmJiB0bXBfbGVuZ3RoIDwgZXhwb25lbnQgKyBwcmVjaXNpb24pCi0tCQkJICAgIHRtcF9sZW5ndGggPSBleHBvbmVudCArIHByZWNpc2lvbjsKLS0JCQl9Ci0tCQkgICAgfQotLSMgZW5kaWYKLS0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRQotLSMgIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0xPTkdfRE9VQkxFCi0tCQlpZiAodHlwZSA9PSBUWVBFX0RPVUJMRSkKLS0jICBlbmRpZgotLQkJICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2YnIHx8IGRwLT5jb252ZXJzaW9uID09ICdGJykKLS0JCSAgICB7Ci0tCQkgICAgICBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2RvdWJsZTsKLS0JCSAgICAgIGlmICghKGlzbmFuIChhcmcpIHx8IGFyZyArIGFyZyA9PSBhcmcpKQotLQkJCXsKLS0JCQkgIC8qIGFyZyBpcyBmaW5pdGUgYW5kIG5vbnplcm8uICAqLwotLQkJCSAgaW50IGV4cG9uZW50ID0gZmxvb3Jsb2cxMCAoYXJnIDwgMCA/IC1hcmcgOiBhcmcpOwotLQkJCSAgaWYgKGV4cG9uZW50ID49IDAgJiYgdG1wX2xlbmd0aCA8IGV4cG9uZW50ICsgcHJlY2lzaW9uKQotLQkJCSAgICB0bXBfbGVuZ3RoID0gZXhwb25lbnQgKyBwcmVjaXNpb247Ci0tCQkJfQotLQkJICAgIH0KLS0jIGVuZGlmCi0tCQkvKiBBY2NvdW50IGZvciBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KLS0JCXRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxMik7Ci0tCi0tCQlpZiAodG1wX2xlbmd0aCA8IHdpZHRoKQotLQkJICB0bXBfbGVuZ3RoID0gd2lkdGg7Ci0tCi0tCQl0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7IC8qIGFjY291bnQgZm9yIHRyYWlsaW5nIE5VTCAqLwotLQotLQkJaWYgKHRtcF9sZW5ndGggPD0gc2l6ZW9mICh0bXBidWYpIC8gc2l6ZW9mIChEQ0hBUl9UKSkKLS0JCSAgdG1wID0gdG1wYnVmOwotLQkJZWxzZQotLQkJICB7Ci0tCQkgICAgc2l6ZV90IHRtcF9tZW1zaXplID0geHRpbWVzICh0bXBfbGVuZ3RoLCBzaXplb2YgKERDSEFSX1QpKTsKLS0KLS0JCSAgICBpZiAoc2l6ZV9vdmVyZmxvd19wICh0bXBfbWVtc2l6ZSkpCi0tCQkgICAgICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KLS0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCSAgICB0bXAgPSAoRENIQVJfVCAqKSBtYWxsb2MgKHRtcF9tZW1zaXplKTsKLS0JCSAgICBpZiAodG1wID09IE5VTEwpCi0tCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KLS0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCSAgfQotLQotLQkJcGFkX3B0ciA9IE5VTEw7Ci0tCQlwID0gdG1wOwotLQotLSMgaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfTE9OR19ET1VCTEUKLS0jICBpZiBORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFCi0tCQlpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCi0tIyAgZW5kaWYKLS0JCSAgewotLQkJICAgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOwotLQotLQkJICAgIGlmIChpc25hbmwgKGFyZykpCi0tCQkgICAgICB7Ci0tCQkJaWYgKGRwLT5jb252ZXJzaW9uID49ICdBJyAmJiBkcC0+Y29udmVyc2lvbiA8PSAnWicpCi0tCQkJICB7Ci0tCQkJICAgICpwKysgPSAnTic7ICpwKysgPSAnQSc7ICpwKysgPSAnTic7Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLQkJCSAgICAqcCsrID0gJ24nOyAqcCsrID0gJ2EnOyAqcCsrID0gJ24nOwotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQlpbnQgc2lnbiA9IDA7Ci0tCQkJREVDTF9MT05HX0RPVUJMRV9ST1VORElORwotLQotLQkJCUJFR0lOX0xPTkdfRE9VQkxFX1JPVU5ESU5HICgpOwotLQotLQkJCWlmIChzaWduYml0IChhcmcpKSAvKiBhcmcgPCAwLjBMIG9yIG5lZ2F0aXZlIHplcm8gKi8KLS0JCQkgIHsKLS0JCQkgICAgc2lnbiA9IC0xOwotLQkJCSAgICBhcmcgPSAtYXJnOwotLQkJCSAgfQotLQotLQkJCWlmIChzaWduIDwgMCkKLS0JCQkgICpwKysgPSAnLSc7Ci0tCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NIT1dTSUdOKQotLQkJCSAgKnArKyA9ICcrJzsKLS0JCQllbHNlIGlmIChmbGFncyAmIEZMQUdfU1BBQ0UpCi0tCQkJICAqcCsrID0gJyAnOwotLQotLQkJCWlmIChhcmcgPiAwLjBMICYmIGFyZyArIGFyZyA9PSBhcmcpCi0tCQkJICB7Ci0tCQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA+PSAnQScgJiYgZHAtPmNvbnZlcnNpb24gPD0gJ1onKQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICdJJzsgKnArKyA9ICdOJzsgKnArKyA9ICdGJzsKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICB7Ci0tCQkJCSpwKysgPSAnaSc7ICpwKysgPSAnbic7ICpwKysgPSAnZic7Ci0tCQkJICAgICAgfQotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHsKLS0jICBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotLQkJCSAgICBwYWRfcHRyID0gcDsKLS0KLS0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdmJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRicpCi0tCQkJICAgICAgewotLQkJCQljaGFyICpkaWdpdHM7Ci0tCQkJCXNpemVfdCBuZGlnaXRzOwotLQotLQkJCQlkaWdpdHMgPQotLQkJCQkgIHNjYWxlMTBfcm91bmRfZGVjaW1hbF9sb25nX2RvdWJsZSAoYXJnLCBwcmVjaXNpb24pOwotLQkJCQlpZiAoZGlnaXRzID09IE5VTEwpCi0tCQkJCSAgewotLQkJCQkgICAgRU5EX0xPTkdfRE9VQkxFX1JPVU5ESU5HICgpOwotLQkJCQkgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotLQkJCQkgIH0KLS0JCQkJbmRpZ2l0cyA9IHN0cmxlbiAoZGlnaXRzKTsKLS0KLS0JCQkJaWYgKG5kaWdpdHMgPiBwcmVjaXNpb24pCi0tCQkJCSAgZG8KLS0JCQkJICAgIHsKLS0JCQkJICAgICAgLS1uZGlnaXRzOwotLQkJCQkgICAgICAqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkgICAgfQotLQkJCQkgIHdoaWxlIChuZGlnaXRzID4gcHJlY2lzaW9uKTsKLS0JCQkJZWxzZQotLQkJCQkgICpwKysgPSAnMCc7Ci0tCQkJCS8qIEhlcmUgbmRpZ2l0cyA8PSBwcmVjaXNpb24uICAqLwotLQkJCQlpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IHByZWNpc2lvbiA+IDApCi0tCQkJCSAgewotLQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJICAgIGZvciAoOyBwcmVjaXNpb24gPiBuZGlnaXRzOyBwcmVjaXNpb24tLSkKLS0JCQkJICAgICAgKnArKyA9ICcwJzsKLS0JCQkJICAgIHdoaWxlIChuZGlnaXRzID4gMCkKLS0JCQkJICAgICAgewotLQkJCQkJLS1uZGlnaXRzOwotLQkJCQkJKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLS0JCQkJICAgICAgfQotLQkJCQkgIH0KLS0KLS0JCQkJZnJlZSAoZGlnaXRzKTsKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdlJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRScpCi0tCQkJICAgICAgewotLQkJCQlpbnQgZXhwb25lbnQ7Ci0tCi0tCQkJCWlmIChhcmcgPT0gMC4wTCkKLS0JCQkJICB7Ci0tCQkJCSAgICBleHBvbmVudCA9IDA7Ci0tCQkJCSAgICAqcCsrID0gJzAnOwotLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotLQkJCQkgICAgICB7Ci0tCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJZm9yICg7IHByZWNpc2lvbiA+IDA7IHByZWNpc2lvbi0tKQotLQkJCQkJICAqcCsrID0gJzAnOwotLQkJCQkgICAgICB9Ci0tCQkJCSAgfQotLQkJCQllbHNlCi0tCQkJCSAgewotLQkJCQkgICAgLyogYXJnID4gMC4wTC4gICovCi0tCQkJCSAgICBpbnQgYWRqdXN0ZWQ7Ci0tCQkJCSAgICBjaGFyICpkaWdpdHM7Ci0tCQkJCSAgICBzaXplX3QgbmRpZ2l0czsKLS0KLS0JCQkJICAgIGV4cG9uZW50ID0gZmxvb3Jsb2cxMGwgKGFyZyk7Ci0tCQkJCSAgICBhZGp1c3RlZCA9IDA7Ci0tCQkJCSAgICBmb3IgKDs7KQotLQkJCQkgICAgICB7Ci0tCQkJCQlkaWdpdHMgPQotLQkJCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfbG9uZ19kb3VibGUgKGFyZywKLS0JCQkJCQkJCQkgICAgIChpbnQpcHJlY2lzaW9uIC0gZXhwb25lbnQpOwotLQkJCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgRU5EX0xPTkdfRE9VQkxFX1JPVU5ESU5HICgpOwotLQkJCQkJICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCQkJCSAgfQotLQkJCQkJbmRpZ2l0cyA9IHN0cmxlbiAoZGlnaXRzKTsKLS0KLS0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbiArIDEpCi0tCQkJCQkgIGJyZWFrOwotLQkJCQkJaWYgKG5kaWdpdHMgPCBwcmVjaXNpb24KLS0JCQkJCSAgICB8fCBuZGlnaXRzID4gcHJlY2lzaW9uICsgMikKLS0JCQkJCSAgLyogVGhlIGV4cG9uZW50IHdhcyBub3QgZ3Vlc3NlZAotLQkJCQkJICAgICBwcmVjaXNlbHkgZW5vdWdoLiAgKi8KLS0JCQkJCSAgYWJvcnQgKCk7Ci0tCQkJCQlpZiAoYWRqdXN0ZWQpCi0tCQkJCQkgIC8qIE5vbmUgb2YgdHdvIHZhbHVlcyBvZiBleHBvbmVudCBpcwotLQkJCQkJICAgICB0aGUgcmlnaHQgb25lLiAgUHJldmVudCBhbiBlbmRsZXNzCi0tCQkJCQkgICAgIGxvb3AuICAqLwotLQkJCQkJICBhYm9ydCAoKTsKLS0JCQkJCWZyZWUgKGRpZ2l0cyk7Ci0tCQkJCQlpZiAobmRpZ2l0cyA9PSBwcmVjaXNpb24pCi0tCQkJCQkgIGV4cG9uZW50IC09IDE7Ci0tCQkJCQllbHNlCi0tCQkJCQkgIGV4cG9uZW50ICs9IDE7Ci0tCQkJCQlhZGp1c3RlZCA9IDE7Ci0tCQkJCSAgICAgIH0KLS0KLS0JCQkJICAgIC8qIEhlcmUgbmRpZ2l0cyA9IHByZWNpc2lvbisxLiAgKi8KLS0JCQkJICAgICpwKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsKLS0JCQkJICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgcHJlY2lzaW9uID4gMCkKLS0JCQkJICAgICAgewotLQkJCQkJKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJCXdoaWxlIChuZGlnaXRzID4gMCkKLS0JCQkJCSAgewotLQkJCQkJICAgIC0tbmRpZ2l0czsKLS0JCQkJCSAgICAqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkJICB9Ci0tCQkJCSAgICAgIH0KLS0KLS0JCQkJICAgIGZyZWUgKGRpZ2l0cyk7Ci0tCQkJCSAgfQotLQotLQkJCQkqcCsrID0gZHAtPmNvbnZlcnNpb247IC8qICdlJyBvciAnRScgKi8KLS0jICAgaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0JCQkJewotLQkJCQkgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGRlY2ltYWxfZm9ybWF0W10gPQotLQkJCQkgICAgeyAnJScsICcrJywgJy4nLCAnMicsICdkJywgJ1wwJyB9OwotLQkJCQkgIFNOUFJJTlRGIChwLCA2ICsgMSwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkJfQotLQkJCQl3aGlsZSAoKnAgIT0gJ1wwJykKLS0JCQkJICBwKys7Ci0tIyAgIGVsc2UKLS0JCQkJaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLS0JCQkJICB7Ci0tCQkJCSAgICBzcHJpbnRmICgoY2hhciAqKSBwLCAiJSsuMmQiLCBleHBvbmVudCk7Ci0tCQkJCSAgICB3aGlsZSAoKnAgIT0gJ1wwJykKLS0JCQkJICAgICAgcCsrOwotLQkJCQkgIH0KLS0JCQkJZWxzZQotLQkJCQkgIHsKLS0JCQkJICAgIGNoYXIgZXhwYnVmWzYgKyAxXTsKLS0JCQkJICAgIGNvbnN0IGNoYXIgKmVwOwotLQkJCQkgICAgc3ByaW50ZiAoZXhwYnVmLCAiJSsuMmQiLCBleHBvbmVudCk7Ci0tCQkJCSAgICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0tCQkJCSAgICAgIHArKzsKLS0JCQkJICB9Ci0tIyAgIGVuZGlmCi0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZycgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0cnKQotLQkJCSAgICAgIHsKLS0JCQkJaWYgKHByZWNpc2lvbiA9PSAwKQotLQkJCQkgIHByZWNpc2lvbiA9IDE7Ci0tCQkJCS8qIHByZWNpc2lvbiA+PSAxLiAgKi8KLS0KLS0JCQkJaWYgKGFyZyA9PSAwLjBMKQotLQkJCQkgIC8qIFRoZSBleHBvbmVudCBpcyAwLCA+PSAtNCwgPCBwcmVjaXNpb24uCi0tCQkJCSAgICAgVXNlIGZpeGVkLXBvaW50IG5vdGF0aW9uLiAgKi8KLS0JCQkJICB7Ci0tCQkJCSAgICBzaXplX3QgbmRpZ2l0cyA9IHByZWNpc2lvbjsKLS0JCQkJICAgIC8qIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvZXMgdGhhdCBoYXZlIHRvIGJlCi0tCQkJCSAgICAgICBkcm9wcGVkLiAgKi8KLS0JCQkJICAgIHNpemVfdCBuemVyb2VzID0KLS0JCQkJICAgICAgKGZsYWdzICYgRkxBR19BTFQgPyAwIDogcHJlY2lzaW9uIC0gMSk7Ci0tCi0tCQkJCSAgICAtLW5kaWdpdHM7Ci0tCQkJCSAgICAqcCsrID0gJzAnOwotLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJICAgICAgewotLQkJCQkJKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJCXdoaWxlIChuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCSAgewotLQkJCQkJICAgIC0tbmRpZ2l0czsKLS0JCQkJCSAgICAqcCsrID0gJzAnOwotLQkJCQkJICB9Ci0tCQkJCSAgICAgIH0KLS0JCQkJICB9Ci0tCQkJCWVsc2UKLS0JCQkJICB7Ci0tCQkJCSAgICAvKiBhcmcgPiAwLjBMLiAgKi8KLS0JCQkJICAgIGludCBleHBvbmVudDsKLS0JCQkJICAgIGludCBhZGp1c3RlZDsKLS0JCQkJICAgIGNoYXIgKmRpZ2l0czsKLS0JCQkJICAgIHNpemVfdCBuZGlnaXRzOwotLQkJCQkgICAgc2l6ZV90IG56ZXJvZXM7Ci0tCi0tCQkJCSAgICBleHBvbmVudCA9IGZsb29ybG9nMTBsIChhcmcpOwotLQkJCQkgICAgYWRqdXN0ZWQgPSAwOwotLQkJCQkgICAgZm9yICg7OykKLS0JCQkJICAgICAgewotLQkJCQkJZGlnaXRzID0KLS0JCQkJCSAgc2NhbGUxMF9yb3VuZF9kZWNpbWFsX2xvbmdfZG91YmxlIChhcmcsCi0tCQkJCQkJCQkJICAgICAoaW50KShwcmVjaXNpb24gLSAxKSAtIGV4cG9uZW50KTsKLS0JCQkJCWlmIChkaWdpdHMgPT0gTlVMTCkKLS0JCQkJCSAgewotLQkJCQkJICAgIEVORF9MT05HX0RPVUJMRV9ST1VORElORyAoKTsKLS0JCQkJCSAgICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0tCQkJCQkgIH0KLS0JCQkJCW5kaWdpdHMgPSBzdHJsZW4gKGRpZ2l0cyk7Ci0tCi0tCQkJCQlpZiAobmRpZ2l0cyA9PSBwcmVjaXNpb24pCi0tCQkJCQkgIGJyZWFrOwotLQkJCQkJaWYgKG5kaWdpdHMgPCBwcmVjaXNpb24gLSAxCi0tCQkJCQkgICAgfHwgbmRpZ2l0cyA+IHByZWNpc2lvbiArIDEpCi0tCQkJCQkgIC8qIFRoZSBleHBvbmVudCB3YXMgbm90IGd1ZXNzZWQKLS0JCQkJCSAgICAgcHJlY2lzZWx5IGVub3VnaC4gICovCi0tCQkJCQkgIGFib3J0ICgpOwotLQkJCQkJaWYgKGFkanVzdGVkKQotLQkJCQkJICAvKiBOb25lIG9mIHR3byB2YWx1ZXMgb2YgZXhwb25lbnQgaXMKLS0JCQkJCSAgICAgdGhlIHJpZ2h0IG9uZS4gIFByZXZlbnQgYW4gZW5kbGVzcwotLQkJCQkJICAgICBsb29wLiAgKi8KLS0JCQkJCSAgYWJvcnQgKCk7Ci0tCQkJCQlmcmVlIChkaWdpdHMpOwotLQkJCQkJaWYgKG5kaWdpdHMgPCBwcmVjaXNpb24pCi0tCQkJCQkgIGV4cG9uZW50IC09IDE7Ci0tCQkJCQllbHNlCi0tCQkJCQkgIGV4cG9uZW50ICs9IDE7Ci0tCQkJCQlhZGp1c3RlZCA9IDE7Ci0tCQkJCSAgICAgIH0KLS0JCQkJICAgIC8qIEhlcmUgbmRpZ2l0cyA9IHByZWNpc2lvbi4gICovCi0tCi0tCQkJCSAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvZXMKLS0JCQkJICAgICAgIHRoYXQgaGF2ZSB0byBiZSBkcm9wcGVkLiAgKi8KLS0JCQkJICAgIG56ZXJvZXMgPSAwOwotLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSA9PSAwKQotLQkJCQkgICAgICB3aGlsZSAobnplcm9lcyA8IG5kaWdpdHMKLS0JCQkJCSAgICAgJiYgZGlnaXRzW256ZXJvZXNdID09ICcwJykKLS0JCQkJCW56ZXJvZXMrKzsKLS0KLS0JCQkJICAgIC8qIFRoZSBleHBvbmVudCBpcyBub3cgZGV0ZXJtaW5lZC4gICovCi0tCQkJCSAgICBpZiAoZXhwb25lbnQgPj0gLTQKLS0JCQkJCSYmIGV4cG9uZW50IDwgKGxvbmcpcHJlY2lzaW9uKQotLQkJCQkgICAgICB7Ci0tCQkJCQkvKiBGaXhlZC1wb2ludCBub3RhdGlvbjoKLS0JCQkJCSAgIG1heChleHBvbmVudCwwKSsxIGRpZ2l0cywgdGhlbiB0aGUKLS0JCQkJCSAgIGRlY2ltYWwgcG9pbnQsIHRoZW4gdGhlIHJlbWFpbmluZwotLQkJCQkJICAgZGlnaXRzIHdpdGhvdXQgdHJhaWxpbmcgemVyb2VzLiAgKi8KLS0JCQkJCWlmIChleHBvbmVudCA+PSAwKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgc2l6ZV90IGNvdW50ID0gZXhwb25lbnQgKyAxOwotLQkJCQkJICAgIC8qIE5vdGU6IGNvdW50IDw9IHByZWNpc2lvbiA9IG5kaWdpdHMuICAqLwotLQkJCQkJICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0pCi0tCQkJCQkgICAgICAqcCsrID0gZGlnaXRzWy0tbmRpZ2l0c107Ci0tCQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCSAgICAgIHsKLS0JCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJCXdoaWxlIChuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCQkgIHsKLS0JCQkJCQkgICAgLS1uZGlnaXRzOwotLQkJCQkJCSAgICAqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkJCSAgfQotLQkJCQkJICAgICAgfQotLQkJCQkJICB9Ci0tCQkJCQllbHNlCi0tCQkJCQkgIHsKLS0JCQkJCSAgICBzaXplX3QgY291bnQgPSAtZXhwb25lbnQgLSAxOwotLQkJCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJCSAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKQotLQkJCQkJICAgICAgKnArKyA9ICcwJzsKLS0JCQkJCSAgICB3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkgICAgICB7Ci0tCQkJCQkJLS1uZGlnaXRzOwotLQkJCQkJCSpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCQkgICAgICB9Ci0tCQkJCQkgIH0KLS0JCQkJICAgICAgfQotLQkJCQkgICAgZWxzZQotLQkJCQkgICAgICB7Ci0tCQkJCQkvKiBFeHBvbmVudGlhbCBub3RhdGlvbi4gICovCi0tCQkJCQkqcCsrID0gZGlnaXRzWy0tbmRpZ2l0c107Ci0tCQkJCQlpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJCSAgICB3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkgICAgICB7Ci0tCQkJCQkJLS1uZGlnaXRzOwotLQkJCQkJCSpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCQkgICAgICB9Ci0tCQkJCQkgIH0KLS0JCQkJCSpwKysgPSBkcC0+Y29udmVyc2lvbiAtICdHJyArICdFJzsgLyogJ2UnIG9yICdFJyAqLwotLSMgICBpZiBXSURFX0NIQVJfVkVSU0lPTgotLQkJCQkJewotLQkJCQkJICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBkZWNpbWFsX2Zvcm1hdFtdID0KLS0JCQkJCSAgICB7ICclJywgJysnLCAnLicsICcyJywgJ2QnLCAnXDAnIH07Ci0tCQkJCQkgIFNOUFJJTlRGIChwLCA2ICsgMSwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkJCX0KLS0JCQkJCXdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkJICBwKys7Ci0tIyAgIGVsc2UKLS0JCQkJCWlmIChzaXplb2YgKERDSEFSX1QpID09IDEpCi0tCQkJCQkgIHsKLS0JCQkJCSAgICBzcHJpbnRmICgoY2hhciAqKSBwLCAiJSsuMmQiLCBleHBvbmVudCk7Ci0tCQkJCQkgICAgd2hpbGUgKCpwICE9ICdcMCcpCi0tCQkJCQkgICAgICBwKys7Ci0tCQkJCQkgIH0KLS0JCQkJCWVsc2UKLS0JCQkJCSAgewotLQkJCQkJICAgIGNoYXIgZXhwYnVmWzYgKyAxXTsKLS0JCQkJCSAgICBjb25zdCBjaGFyICplcDsKLS0JCQkJCSAgICBzcHJpbnRmIChleHBidWYsICIlKy4yZCIsIGV4cG9uZW50KTsKLS0JCQkJCSAgICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0tCQkJCQkgICAgICBwKys7Ci0tCQkJCQkgIH0KLS0jICAgZW5kaWYKLS0JCQkJICAgICAgfQotLQotLQkJCQkgICAgZnJlZSAoZGlnaXRzKTsKLS0JCQkJICB9Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgYWJvcnQgKCk7Ci0tIyAgZWxzZQotLQkJCSAgICAvKiBhcmcgaXMgZmluaXRlLiAgKi8KLS0JCQkgICAgYWJvcnQgKCk7Ci0tIyAgZW5kaWYKLS0JCQkgIH0KLS0KLS0JCQlFTkRfTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0tCQkgICAgICB9Ci0tCQkgIH0KLS0jICBpZiBORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFCi0tCQllbHNlCi0tIyAgZW5kaWYKLS0jIGVuZGlmCi0tIyBpZiBORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFCi0tCQkgIHsKLS0JCSAgICBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2RvdWJsZTsKLS0KLS0JCSAgICBpZiAoaXNuYW4gKGFyZykpCi0tCQkgICAgICB7Ci0tCQkJaWYgKGRwLT5jb252ZXJzaW9uID49ICdBJyAmJiBkcC0+Y29udmVyc2lvbiA8PSAnWicpCi0tCQkJICB7Ci0tCQkJICAgICpwKysgPSAnTic7ICpwKysgPSAnQSc7ICpwKysgPSAnTic7Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLQkJCSAgICAqcCsrID0gJ24nOyAqcCsrID0gJ2EnOyAqcCsrID0gJ24nOwotLQkJCSAgfQotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQlpbnQgc2lnbiA9IDA7Ci0tCi0tCQkJaWYgKHNpZ25iaXQgKGFyZykpIC8qIGFyZyA8IDAuMCBvciBuZWdhdGl2ZSB6ZXJvICovCi0tCQkJICB7Ci0tCQkJICAgIHNpZ24gPSAtMTsKLS0JCQkgICAgYXJnID0gLWFyZzsKLS0JCQkgIH0KLS0KLS0JCQlpZiAoc2lnbiA8IDApCi0tCQkJICAqcCsrID0gJy0nOwotLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TSE9XU0lHTikKLS0JCQkgICpwKysgPSAnKyc7Ci0tCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NQQUNFKQotLQkJCSAgKnArKyA9ICcgJzsKLS0KLS0JCQlpZiAoYXJnID4gMC4wICYmIGFyZyArIGFyZyA9PSBhcmcpCi0tCQkJICB7Ci0tCQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA+PSAnQScgJiYgZHAtPmNvbnZlcnNpb24gPD0gJ1onKQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICdJJzsgKnArKyA9ICdOJzsgKnArKyA9ICdGJzsKLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UKLS0JCQkgICAgICB7Ci0tCQkJCSpwKysgPSAnaSc7ICpwKysgPSAnbic7ICpwKysgPSAnZic7Ci0tCQkJICAgICAgfQotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHsKLS0jICBpZiBORUVEX1BSSU5URl9ET1VCTEUKLS0JCQkgICAgcGFkX3B0ciA9IHA7Ci0tCi0tCQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotLQkJCSAgICAgIHsKLS0JCQkJY2hhciAqZGlnaXRzOwotLQkJCQlzaXplX3QgbmRpZ2l0czsKLS0KLS0JCQkJZGlnaXRzID0KLS0JCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZG91YmxlIChhcmcsIHByZWNpc2lvbik7Ci0tCQkJCWlmIChkaWdpdHMgPT0gTlVMTCkKLS0JCQkJICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0tCQkJCW5kaWdpdHMgPSBzdHJsZW4gKGRpZ2l0cyk7Ci0tCi0tCQkJCWlmIChuZGlnaXRzID4gcHJlY2lzaW9uKQotLQkJCQkgIGRvCi0tCQkJCSAgICB7Ci0tCQkJCSAgICAgIC0tbmRpZ2l0czsKLS0JCQkJICAgICAgKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLS0JCQkJICAgIH0KLS0JCQkJICB3aGlsZSAobmRpZ2l0cyA+IHByZWNpc2lvbik7Ci0tCQkJCWVsc2UKLS0JCQkJICAqcCsrID0gJzAnOwotLQkJCQkvKiBIZXJlIG5kaWdpdHMgPD0gcHJlY2lzaW9uLiAgKi8KLS0JCQkJaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotLQkJCQkgIHsKLS0JCQkJICAgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCSAgICBmb3IgKDsgcHJlY2lzaW9uID4gbmRpZ2l0czsgcHJlY2lzaW9uLS0pCi0tCQkJCSAgICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgICB3aGlsZSAobmRpZ2l0cyA+IDApCi0tCQkJCSAgICAgIHsKLS0JCQkJCS0tbmRpZ2l0czsKLS0JCQkJCSpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCSAgICAgIH0KLS0JCQkJICB9Ci0tCi0tCQkJCWZyZWUgKGRpZ2l0cyk7Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZScgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0UnKQotLQkJCSAgICAgIHsKLS0JCQkJaW50IGV4cG9uZW50OwotLQotLQkJCQlpZiAoYXJnID09IDAuMCkKLS0JCQkJICB7Ci0tCQkJCSAgICBleHBvbmVudCA9IDA7Ci0tCQkJCSAgICAqcCsrID0gJzAnOwotLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotLQkJCQkgICAgICB7Ci0tCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJZm9yICg7IHByZWNpc2lvbiA+IDA7IHByZWNpc2lvbi0tKQotLQkJCQkJICAqcCsrID0gJzAnOwotLQkJCQkgICAgICB9Ci0tCQkJCSAgfQotLQkJCQllbHNlCi0tCQkJCSAgewotLQkJCQkgICAgLyogYXJnID4gMC4wLiAgKi8KLS0JCQkJICAgIGludCBhZGp1c3RlZDsKLS0JCQkJICAgIGNoYXIgKmRpZ2l0czsKLS0JCQkJICAgIHNpemVfdCBuZGlnaXRzOwotLQotLQkJCQkgICAgZXhwb25lbnQgPSBmbG9vcmxvZzEwIChhcmcpOwotLQkJCQkgICAgYWRqdXN0ZWQgPSAwOwotLQkJCQkgICAgZm9yICg7OykKLS0JCQkJICAgICAgewotLQkJCQkJZGlnaXRzID0KLS0JCQkJCSAgc2NhbGUxMF9yb3VuZF9kZWNpbWFsX2RvdWJsZSAoYXJnLAotLQkJCQkJCQkJCShpbnQpcHJlY2lzaW9uIC0gZXhwb25lbnQpOwotLQkJCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotLQkJCQkJICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0tCQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotLQotLQkJCQkJaWYgKG5kaWdpdHMgPT0gcHJlY2lzaW9uICsgMSkKLS0JCQkJCSAgYnJlYWs7Ci0tCQkJCQlpZiAobmRpZ2l0cyA8IHByZWNpc2lvbgotLQkJCQkJICAgIHx8IG5kaWdpdHMgPiBwcmVjaXNpb24gKyAyKQotLQkJCQkJICAvKiBUaGUgZXhwb25lbnQgd2FzIG5vdCBndWVzc2VkCi0tCQkJCQkgICAgIHByZWNpc2VseSBlbm91Z2guICAqLwotLQkJCQkJICBhYm9ydCAoKTsKLS0JCQkJCWlmIChhZGp1c3RlZCkKLS0JCQkJCSAgLyogTm9uZSBvZiB0d28gdmFsdWVzIG9mIGV4cG9uZW50IGlzCi0tCQkJCQkgICAgIHRoZSByaWdodCBvbmUuICBQcmV2ZW50IGFuIGVuZGxlc3MKLS0JCQkJCSAgICAgbG9vcC4gICovCi0tCQkJCQkgIGFib3J0ICgpOwotLQkJCQkJZnJlZSAoZGlnaXRzKTsKLS0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbikKLS0JCQkJCSAgZXhwb25lbnQgLT0gMTsKLS0JCQkJCWVsc2UKLS0JCQkJCSAgZXhwb25lbnQgKz0gMTsKLS0JCQkJCWFkanVzdGVkID0gMTsKLS0JCQkJICAgICAgfQotLQotLQkJCQkgICAgLyogSGVyZSBuZGlnaXRzID0gcHJlY2lzaW9uKzEuICAqLwotLQkJCQkgICAgKnArKyA9IGRpZ2l0c1stLW5kaWdpdHNdOwotLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotLQkJCQkgICAgICB7Ci0tCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJd2hpbGUgKG5kaWdpdHMgPiAwKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgLS1uZGlnaXRzOwotLQkJCQkJICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0tCQkJCQkgIH0KLS0JCQkJICAgICAgfQotLQotLQkJCQkgICAgZnJlZSAoZGlnaXRzKTsKLS0JCQkJICB9Ci0tCi0tCQkJCSpwKysgPSBkcC0+Y29udmVyc2lvbjsgLyogJ2UnIG9yICdFJyAqLwotLSMgICBpZiBXSURFX0NIQVJfVkVSU0lPTgotLQkJCQl7Ci0tCQkJCSAgc3RhdGljIGNvbnN0IHdjaGFyX3QgZGVjaW1hbF9mb3JtYXRbXSA9Ci0tCQkJCSAgICAvKiBQcm9kdWNlIHRoZSBzYW1lIG51bWJlciBvZiBleHBvbmVudCBkaWdpdHMKLS0JCQkJICAgICAgIGFzIHRoZSBuYXRpdmUgcHJpbnRmIGltcGxlbWVudGF0aW9uLiAgKi8KLS0jICAgIGlmIChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykgJiYgISBkZWZpbmVkIF9fQ1lHV0lOX18KLS0JCQkJICAgIHsgJyUnLCAnKycsICcuJywgJzMnLCAnZCcsICdcMCcgfTsKLS0jICAgIGVsc2UKLS0JCQkJICAgIHsgJyUnLCAnKycsICcuJywgJzInLCAnZCcsICdcMCcgfTsKLS0jICAgIGVuZGlmCi0tCQkJCSAgU05QUklOVEYgKHAsIDYgKyAxLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotLQkJCQl9Ci0tCQkJCXdoaWxlICgqcCAhPSAnXDAnKQotLQkJCQkgIHArKzsKLS0jICAgZWxzZQotLQkJCQl7Ci0tCQkJCSAgc3RhdGljIGNvbnN0IGNoYXIgZGVjaW1hbF9mb3JtYXRbXSA9Ci0tCQkJCSAgICAvKiBQcm9kdWNlIHRoZSBzYW1lIG51bWJlciBvZiBleHBvbmVudCBkaWdpdHMKLS0JCQkJICAgICAgIGFzIHRoZSBuYXRpdmUgcHJpbnRmIGltcGxlbWVudGF0aW9uLiAgKi8KLS0jICAgIGlmIChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykgJiYgISBkZWZpbmVkIF9fQ1lHV0lOX18KLS0JCQkJICAgICIlKy4zZCI7Ci0tIyAgICBlbHNlCi0tCQkJCSAgICAiJSsuMmQiOwotLSMgICAgZW5kaWYKLS0JCQkJICBpZiAoc2l6ZW9mIChEQ0hBUl9UKSA9PSAxKQotLQkJCQkgICAgewotLQkJCQkgICAgICBzcHJpbnRmICgoY2hhciAqKSBwLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotLQkJCQkgICAgICB3aGlsZSAoKnAgIT0gJ1wwJykKLS0JCQkJCXArKzsKLS0JCQkJICAgIH0KLS0JCQkJICBlbHNlCi0tCQkJCSAgICB7Ci0tCQkJCSAgICAgIGNoYXIgZXhwYnVmWzYgKyAxXTsKLS0JCQkJICAgICAgY29uc3QgY2hhciAqZXA7Ci0tCQkJCSAgICAgIHNwcmludGYgKGV4cGJ1ZiwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLS0JCQkJICAgICAgZm9yIChlcCA9IGV4cGJ1ZjsgKCpwID0gKmVwKSAhPSAnXDAnOyBlcCsrKQotLQkJCQkJcCsrOwotLQkJCQkgICAgfQotLQkJCQl9Ci0tIyAgIGVuZGlmCi0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZycgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0cnKQotLQkJCSAgICAgIHsKLS0JCQkJaWYgKHByZWNpc2lvbiA9PSAwKQotLQkJCQkgIHByZWNpc2lvbiA9IDE7Ci0tCQkJCS8qIHByZWNpc2lvbiA+PSAxLiAgKi8KLS0KLS0JCQkJaWYgKGFyZyA9PSAwLjApCi0tCQkJCSAgLyogVGhlIGV4cG9uZW50IGlzIDAsID49IC00LCA8IHByZWNpc2lvbi4KLS0JCQkJICAgICBVc2UgZml4ZWQtcG9pbnQgbm90YXRpb24uICAqLwotLQkJCQkgIHsKLS0JCQkJICAgIHNpemVfdCBuZGlnaXRzID0gcHJlY2lzaW9uOwotLQkJCQkgICAgLyogTnVtYmVyIG9mIHRyYWlsaW5nIHplcm9lcyB0aGF0IGhhdmUgdG8gYmUKLS0JCQkJICAgICAgIGRyb3BwZWQuICAqLwotLQkJCQkgICAgc2l6ZV90IG56ZXJvZXMgPQotLQkJCQkgICAgICAoZmxhZ3MgJiBGTEFHX0FMVCA/IDAgOiBwcmVjaXNpb24gLSAxKTsKLS0KLS0JCQkJICAgIC0tbmRpZ2l0czsKLS0JCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkgICAgICB7Ci0tCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkJd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJICB7Ci0tCQkJCQkgICAgLS1uZGlnaXRzOwotLQkJCQkJICAgICpwKysgPSAnMCc7Ci0tCQkJCQkgIH0KLS0JCQkJICAgICAgfQotLQkJCQkgIH0KLS0JCQkJZWxzZQotLQkJCQkgIHsKLS0JCQkJICAgIC8qIGFyZyA+IDAuMC4gICovCi0tCQkJCSAgICBpbnQgZXhwb25lbnQ7Ci0tCQkJCSAgICBpbnQgYWRqdXN0ZWQ7Ci0tCQkJCSAgICBjaGFyICpkaWdpdHM7Ci0tCQkJCSAgICBzaXplX3QgbmRpZ2l0czsKLS0JCQkJICAgIHNpemVfdCBuemVyb2VzOwotLQotLQkJCQkgICAgZXhwb25lbnQgPSBmbG9vcmxvZzEwIChhcmcpOwotLQkJCQkgICAgYWRqdXN0ZWQgPSAwOwotLQkJCQkgICAgZm9yICg7OykKLS0JCQkJICAgICAgewotLQkJCQkJZGlnaXRzID0KLS0JCQkJCSAgc2NhbGUxMF9yb3VuZF9kZWNpbWFsX2RvdWJsZSAoYXJnLAotLQkJCQkJCQkJCShpbnQpKHByZWNpc2lvbiAtIDEpIC0gZXhwb25lbnQpOwotLQkJCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotLQkJCQkJICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0tCQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotLQotLQkJCQkJaWYgKG5kaWdpdHMgPT0gcHJlY2lzaW9uKQotLQkJCQkJICBicmVhazsKLS0JCQkJCWlmIChuZGlnaXRzIDwgcHJlY2lzaW9uIC0gMQotLQkJCQkJICAgIHx8IG5kaWdpdHMgPiBwcmVjaXNpb24gKyAxKQotLQkJCQkJICAvKiBUaGUgZXhwb25lbnQgd2FzIG5vdCBndWVzc2VkCi0tCQkJCQkgICAgIHByZWNpc2VseSBlbm91Z2guICAqLwotLQkJCQkJICBhYm9ydCAoKTsKLS0JCQkJCWlmIChhZGp1c3RlZCkKLS0JCQkJCSAgLyogTm9uZSBvZiB0d28gdmFsdWVzIG9mIGV4cG9uZW50IGlzCi0tCQkJCQkgICAgIHRoZSByaWdodCBvbmUuICBQcmV2ZW50IGFuIGVuZGxlc3MKLS0JCQkJCSAgICAgbG9vcC4gICovCi0tCQkJCQkgIGFib3J0ICgpOwotLQkJCQkJZnJlZSAoZGlnaXRzKTsKLS0JCQkJCWlmIChuZGlnaXRzIDwgcHJlY2lzaW9uKQotLQkJCQkJICBleHBvbmVudCAtPSAxOwotLQkJCQkJZWxzZQotLQkJCQkJICBleHBvbmVudCArPSAxOwotLQkJCQkJYWRqdXN0ZWQgPSAxOwotLQkJCQkgICAgICB9Ci0tCQkJCSAgICAvKiBIZXJlIG5kaWdpdHMgPSBwcmVjaXNpb24uICAqLwotLQotLQkJCQkgICAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVyb2VzCi0tCQkJCSAgICAgICB0aGF0IGhhdmUgdG8gYmUgZHJvcHBlZC4gICovCi0tCQkJCSAgICBuemVyb2VzID0gMDsKLS0JCQkJICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgPT0gMCkKLS0JCQkJICAgICAgd2hpbGUgKG56ZXJvZXMgPCBuZGlnaXRzCi0tCQkJCQkgICAgICYmIGRpZ2l0c1tuemVyb2VzXSA9PSAnMCcpCi0tCQkJCQluemVyb2VzKys7Ci0tCi0tCQkJCSAgICAvKiBUaGUgZXhwb25lbnQgaXMgbm93IGRldGVybWluZWQuICAqLwotLQkJCQkgICAgaWYgKGV4cG9uZW50ID49IC00Ci0tCQkJCQkmJiBleHBvbmVudCA8IChsb25nKXByZWNpc2lvbikKLS0JCQkJICAgICAgewotLQkJCQkJLyogRml4ZWQtcG9pbnQgbm90YXRpb246Ci0tCQkJCQkgICBtYXgoZXhwb25lbnQsMCkrMSBkaWdpdHMsIHRoZW4gdGhlCi0tCQkJCQkgICBkZWNpbWFsIHBvaW50LCB0aGVuIHRoZSByZW1haW5pbmcKLS0JCQkJCSAgIGRpZ2l0cyB3aXRob3V0IHRyYWlsaW5nIHplcm9lcy4gICovCi0tCQkJCQlpZiAoZXhwb25lbnQgPj0gMCkKLS0JCQkJCSAgewotLQkJCQkJICAgIHNpemVfdCBjb3VudCA9IGV4cG9uZW50ICsgMTsKLS0JCQkJCSAgICAvKiBOb3RlOiBjb3VudCA8PSBwcmVjaXNpb24gPSBuZGlnaXRzLiAgKi8KLS0JCQkJCSAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKQotLQkJCQkJICAgICAgKnArKyA9IGRpZ2l0c1stLW5kaWdpdHNdOwotLQkJCQkJICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgbmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkgICAgICB7Ci0tCQkJCQkJKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJCQl3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0tCQkJCQkJICB7Ci0tCQkJCQkJICAgIC0tbmRpZ2l0czsKLS0JCQkJCQkgICAgKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLS0JCQkJCQkgIH0KLS0JCQkJCSAgICAgIH0KLS0JCQkJCSAgfQotLQkJCQkJZWxzZQotLQkJCQkJICB7Ci0tCQkJCQkgICAgc2l6ZV90IGNvdW50ID0gLWV4cG9uZW50IC0gMTsKLS0JCQkJCSAgICAqcCsrID0gJzAnOwotLQkJCQkJICAgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCQkgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQtLSkKLS0JCQkJCSAgICAgICpwKysgPSAnMCc7Ci0tCQkJCQkgICAgd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJICAgICAgewotLQkJCQkJCS0tbmRpZ2l0czsKLS0JCQkJCQkqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkJICAgICAgfQotLQkJCQkJICB9Ci0tCQkJCSAgICAgIH0KLS0JCQkJICAgIGVsc2UKLS0JCQkJICAgICAgewotLQkJCQkJLyogRXhwb25lbnRpYWwgbm90YXRpb24uICAqLwotLQkJCQkJKnArKyA9IGRpZ2l0c1stLW5kaWdpdHNdOwotLQkJCQkJaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBuZGlnaXRzID4gbnplcm9lcykKLS0JCQkJCSAgewotLQkJCQkJICAgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCQkgICAgd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotLQkJCQkJICAgICAgewotLQkJCQkJCS0tbmRpZ2l0czsKLS0JCQkJCQkqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotLQkJCQkJICAgICAgfQotLQkJCQkJICB9Ci0tCQkJCQkqcCsrID0gZHAtPmNvbnZlcnNpb24gLSAnRycgKyAnRSc7IC8qICdlJyBvciAnRScgKi8KLS0jICAgaWYgV0lERV9DSEFSX1ZFUlNJT04KLS0JCQkJCXsKLS0JCQkJCSAgc3RhdGljIGNvbnN0IHdjaGFyX3QgZGVjaW1hbF9mb3JtYXRbXSA9Ci0tCQkJCQkgICAgLyogUHJvZHVjZSB0aGUgc2FtZSBudW1iZXIgb2YgZXhwb25lbnQgZGlnaXRzCi0tCQkJCQkgICAgICAgYXMgdGhlIG5hdGl2ZSBwcmludGYgaW1wbGVtZW50YXRpb24uICAqLwotLSMgICAgaWYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhIGRlZmluZWQgX19DWUdXSU5fXwotLQkJCQkJICAgIHsgJyUnLCAnKycsICcuJywgJzMnLCAnZCcsICdcMCcgfTsKLS0jICAgIGVsc2UKLS0JCQkJCSAgICB7ICclJywgJysnLCAnLicsICcyJywgJ2QnLCAnXDAnIH07Ci0tIyAgICBlbmRpZgotLQkJCQkJICBTTlBSSU5URiAocCwgNiArIDEsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0tCQkJCQl9Ci0tCQkJCQl3aGlsZSAoKnAgIT0gJ1wwJykKLS0JCQkJCSAgcCsrOwotLSMgICBlbHNlCi0tCQkJCQl7Ci0tCQkJCQkgIHN0YXRpYyBjb25zdCBjaGFyIGRlY2ltYWxfZm9ybWF0W10gPQotLQkJCQkJICAgIC8qIFByb2R1Y2UgdGhlIHNhbWUgbnVtYmVyIG9mIGV4cG9uZW50IGRpZ2l0cwotLQkJCQkJICAgICAgIGFzIHRoZSBuYXRpdmUgcHJpbnRmIGltcGxlbWVudGF0aW9uLiAgKi8KLS0jICAgIGlmIChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykgJiYgISBkZWZpbmVkIF9fQ1lHV0lOX18KLS0JCQkJCSAgICAiJSsuM2QiOwotLSMgICAgZWxzZQotLQkJCQkJICAgICIlKy4yZCI7Ci0tIyAgICBlbmRpZgotLQkJCQkJICBpZiAoc2l6ZW9mIChEQ0hBUl9UKSA9PSAxKQotLQkJCQkJICAgIHsKLS0JCQkJCSAgICAgIHNwcmludGYgKChjaGFyICopIHAsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0tCQkJCQkgICAgICB3aGlsZSAoKnAgIT0gJ1wwJykKLS0JCQkJCQlwKys7Ci0tCQkJCQkgICAgfQotLQkJCQkJICBlbHNlCi0tCQkJCQkgICAgewotLQkJCQkJICAgICAgY2hhciBleHBidWZbNiArIDFdOwotLQkJCQkJICAgICAgY29uc3QgY2hhciAqZXA7Ci0tCQkJCQkgICAgICBzcHJpbnRmIChleHBidWYsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0tCQkJCQkgICAgICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0tCQkJCQkJcCsrOwotLQkJCQkJICAgIH0KLS0JCQkJCX0KLS0jICAgZW5kaWYKLS0JCQkJICAgICAgfQotLQotLQkJCQkgICAgZnJlZSAoZGlnaXRzKTsKLS0JCQkJICB9Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgYWJvcnQgKCk7Ci0tIyAgZWxzZQotLQkJCSAgICAvKiBhcmcgaXMgZmluaXRlLiAgKi8KLS0JCQkgICAgaWYgKCEoYXJnID09IDAuMCkpCi0tCQkJICAgICAgYWJvcnQgKCk7Ci0tCi0tCQkJICAgIHBhZF9wdHIgPSBwOwotLQotLQkJCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2YnIHx8IGRwLT5jb252ZXJzaW9uID09ICdGJykKLS0JCQkgICAgICB7Ci0tCQkJCSpwKysgPSAnMCc7Ci0tCQkJCWlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgcHJlY2lzaW9uID4gMCkKLS0JCQkJICB7Ci0tCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotLQkJCQkgICAgZm9yICg7IHByZWNpc2lvbiA+IDA7IHByZWNpc2lvbi0tKQotLQkJCQkgICAgICAqcCsrID0gJzAnOwotLQkJCQkgIH0KLS0JCQkgICAgICB9Ci0tCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdlJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRScpCi0tCQkJICAgICAgewotLQkJCQkqcCsrID0gJzAnOwotLQkJCQlpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IHByZWNpc2lvbiA+IDApCi0tCQkJCSAgewotLQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLS0JCQkJICAgIGZvciAoOyBwcmVjaXNpb24gPiAwOyBwcmVjaXNpb24tLSkKLS0JCQkJICAgICAgKnArKyA9ICcwJzsKLS0JCQkJICB9Ci0tCQkJCSpwKysgPSBkcC0+Y29udmVyc2lvbjsgLyogJ2UnIG9yICdFJyAqLwotLQkJCQkqcCsrID0gJysnOwotLQkJCQkvKiBQcm9kdWNlIHRoZSBzYW1lIG51bWJlciBvZiBleHBvbmVudCBkaWdpdHMgYXMKLS0JCQkJICAgdGhlIG5hdGl2ZSBwcmludGYgaW1wbGVtZW50YXRpb24uICAqLwotLSMgICBpZiAoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pICYmICEgZGVmaW5lZCBfX0NZR1dJTl9fCi0tCQkJCSpwKysgPSAnMCc7Ci0tIyAgIGVuZGlmCi0tCQkJCSpwKysgPSAnMCc7Ci0tCQkJCSpwKysgPSAnMCc7Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZycgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0cnKQotLQkJCSAgICAgIHsKLS0JCQkJKnArKyA9ICcwJzsKLS0JCQkJaWYgKGZsYWdzICYgRkxBR19BTFQpCi0tCQkJCSAgewotLQkJCQkgICAgc2l6ZV90IG5kaWdpdHMgPQotLQkJCQkgICAgICAocHJlY2lzaW9uID4gMCA/IHByZWNpc2lvbiAtIDEgOiAwKTsKLS0JCQkJICAgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0tCQkJCSAgICBmb3IgKDsgbmRpZ2l0cyA+IDA7IC0tbmRpZ2l0cykKLS0JCQkJICAgICAgKnArKyA9ICcwJzsKLS0JCQkJICB9Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgYWJvcnQgKCk7Ci0tIyAgZW5kaWYKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0JCSAgfQotLSMgZW5kaWYKLS0KLS0JCS8qIFRoZSBnZW5lcmF0ZWQgc3RyaW5nIG5vdyBleHRlbmRzIGZyb20gdG1wIHRvIHAsIHdpdGggdGhlCi0tCQkgICB6ZXJvIHBhZGRpbmcgaW5zZXJ0aW9uIHBvaW50IGJlaW5nIGF0IHBhZF9wdHIuICAqLwotLQkJaWYgKGhhc193aWR0aCAmJiBwIC0gdG1wIDwgd2lkdGgpCi0tCQkgIHsKLS0JCSAgICBzaXplX3QgcGFkID0gd2lkdGggLSAocCAtIHRtcCk7Ci0tCQkgICAgRENIQVJfVCAqZW5kID0gcCArIHBhZDsKLS0KLS0JCSAgICBpZiAoZmxhZ3MgJiBGTEFHX0xFRlQpCi0tCQkgICAgICB7Ci0tCQkJLyogUGFkIHdpdGggc3BhY2VzIG9uIHRoZSByaWdodC4gICovCi0tCQkJZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotLQkJCSAgKnArKyA9ICcgJzsKLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlIGlmICgoZmxhZ3MgJiBGTEFHX1pFUk8pICYmIHBhZF9wdHIgIT0gTlVMTCkKLS0JCSAgICAgIHsKLS0JCQkvKiBQYWQgd2l0aCB6ZXJvZXMuICAqLwotLQkJCURDSEFSX1QgKnEgPSBlbmQ7Ci0tCi0tCQkJd2hpbGUgKHAgPiBwYWRfcHRyKQotLQkJCSAgKi0tcSA9ICotLXA7Ci0tCQkJZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotLQkJCSAgKnArKyA9ICcwJzsKLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJLyogUGFkIHdpdGggc3BhY2VzIG9uIHRoZSBsZWZ0LiAgKi8KLS0JCQlEQ0hBUl9UICpxID0gZW5kOwotLQotLQkJCXdoaWxlIChwID4gdG1wKQotLQkJCSAgKi0tcSA9ICotLXA7Ci0tCQkJZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotLQkJCSAgKnArKyA9ICcgJzsKLS0JCSAgICAgIH0KLS0KLS0JCSAgICBwID0gZW5kOwotLQkJICB9Ci0tCi0tCQl7Ci0tCQkgIHNpemVfdCBjb3VudCA9IHAgLSB0bXA7Ci0tCi0tCQkgIGlmIChjb3VudCA+PSB0bXBfbGVuZ3RoKQotLQkJICAgIC8qIHRtcF9sZW5ndGggd2FzIGluY29ycmVjdGx5IGNhbGN1bGF0ZWQgLSBmaXggdGhlCi0tCQkgICAgICAgY29kZSBhYm92ZSEgICovCi0tCQkgICAgYWJvcnQgKCk7Ci0tCi0tCQkgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIHJlc3VsdC4gICovCi0tCQkgIGlmIChjb3VudCA+PSBhbGxvY2F0ZWQgLSBsZW5ndGgpCi0tCQkgICAgewotLQkJICAgICAgc2l6ZV90IG4gPSB4c3VtIChsZW5ndGgsIGNvdW50KTsKLS0KLS0JCSAgICAgIEVOU1VSRV9BTExPQ0FUSU9OIChuKTsKLS0JCSAgICB9Ci0tCi0tCQkgIC8qIEFwcGVuZCB0aGUgcmVzdWx0LiAgKi8KLS0JCSAgbWVtY3B5IChyZXN1bHQgKyBsZW5ndGgsIHRtcCwgY291bnQgKiBzaXplb2YgKERDSEFSX1QpKTsKLS0JCSAgaWYgKHRtcCAhPSB0bXBidWYpCi0tCQkgICAgZnJlZSAodG1wKTsKLS0JCSAgbGVuZ3RoICs9IGNvdW50OwotLQkJfQotLQkgICAgICB9Ci0tI2VuZGlmCi0tCSAgICBlbHNlCi0tCSAgICAgIHsKLS0JCWFyZ190eXBlIHR5cGUgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlOwotLQkJaW50IGZsYWdzID0gZHAtPmZsYWdzOwotLSNpZiAhVVNFX1NOUFJJTlRGIHx8ICFEQ0hBUl9JU19UQ0hBUiB8fCBFTkFCTEVfVU5JU1RESU8gfHwgTkVFRF9QUklOVEZfRkxBR19aRVJPIHx8IE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLS0JCWludCBoYXNfd2lkdGg7Ci0tCQlzaXplX3Qgd2lkdGg7Ci0tI2VuZGlmCi0tI2lmICFVU0VfU05QUklOVEYgfHwgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotLQkJaW50IGhhc19wcmVjaXNpb247Ci0tCQlzaXplX3QgcHJlY2lzaW9uOwotLSNlbmRpZgotLSNpZiBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQlpbnQgcHJlY19vdXJzZWx2ZXM7Ci0tI2Vsc2UKLS0jCQlkZWZpbmUgcHJlY19vdXJzZWx2ZXMgMAotLSNlbmRpZgotLSNpZiAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPIHx8IE5FRURfUFJJTlRGX0ZMQUdfWkVSTyB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQlpbnQgcGFkX291cnNlbHZlczsKLS0jZWxzZQotLSMJCWRlZmluZSBwYWRfb3Vyc2VsdmVzIDAKLS0jZW5kaWYKLS0JCVRDSEFSX1QgKmZicDsKLS0JCXVuc2lnbmVkIGludCBwcmVmaXhfY291bnQ7Ci0tCQlpbnQgcHJlZml4ZXNbMl07Ci0tI2lmICFVU0VfU05QUklOVEYKLS0JCXNpemVfdCB0bXBfbGVuZ3RoOwotLQkJVENIQVJfVCB0bXBidWZbNzAwXTsKLS0JCVRDSEFSX1QgKnRtcDsKLS0jZW5kaWYKLS0KLS0jaWYgIVVTRV9TTlBSSU5URiB8fCAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPIHx8IE5FRURfUFJJTlRGX0ZMQUdfWkVSTyB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQloYXNfd2lkdGggPSAwOwotLQkJd2lkdGggPSAwOwotLQkJaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQotLQkJICB7Ci0tCQkgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0tCQkgICAgICB7Ci0tCQkJaW50IGFyZzsKLS0KLS0JCQlpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLS0JCQkgIGFib3J0ICgpOwotLQkJCWFyZyA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkJaWYgKGFyZyA8IDApCi0tCQkJICB7Ci0tCQkJICAgIC8qICJBIG5lZ2F0aXZlIGZpZWxkIHdpZHRoIGlzIHRha2VuIGFzIGEgJy0nIGZsYWcKLS0JCQkgICAgICAgIGZvbGxvd2VkIGJ5IGEgcG9zaXRpdmUgZmllbGQgd2lkdGguIiAgKi8KLS0JCQkgICAgZmxhZ3MgfD0gRkxBR19MRUZUOwotLQkJCSAgICB3aWR0aCA9ICh1bnNpZ25lZCBpbnQpICgtYXJnKTsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB3aWR0aCA9IGFyZzsKLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPndpZHRoX3N0YXJ0OwotLQotLQkJCWRvCi0tCQkJICB3aWR0aCA9IHhzdW0gKHh0aW1lcyAod2lkdGgsIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLS0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT53aWR0aF9lbmQpOwotLQkJICAgICAgfQotLQkJICAgIGhhc193aWR0aCA9IDE7Ci0tCQkgIH0KLS0jZW5kaWYKLS0KLS0jaWYgIVVTRV9TTlBSSU5URiB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQloYXNfcHJlY2lzaW9uID0gMDsKLS0JCXByZWNpc2lvbiA9IDY7Ci0tCQlpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLS0JCSAgewotLQkJICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgICAgIHsKLS0JCQlpbnQgYXJnOwotLQotLQkJCWlmICghKGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLS0JCQkgIGFib3J0ICgpOwotLQkJCWFyZyA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OwotLQkJCS8qICJBIG5lZ2F0aXZlIHByZWNpc2lvbiBpcyB0YWtlbiBhcyBpZiB0aGUgcHJlY2lzaW9uCi0tCQkJICAgIHdlcmUgb21pdHRlZC4iICAqLwotLQkJCWlmIChhcmcgPj0gMCkKLS0JCQkgIHsKLS0JCQkgICAgcHJlY2lzaW9uID0gYXJnOwotLQkJCSAgICBoYXNfcHJlY2lzaW9uID0gMTsKLS0JCQkgIH0KLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPnByZWNpc2lvbl9zdGFydCArIDE7Ci0tCi0tCQkJcHJlY2lzaW9uID0gMDsKLS0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT5wcmVjaXNpb25fZW5kKQotLQkJCSAgcHJlY2lzaW9uID0geHN1bSAoeHRpbWVzIChwcmVjaXNpb24sIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLS0JCQloYXNfcHJlY2lzaW9uID0gMTsKLS0JCSAgICAgIH0KLS0JCSAgfQotLSNlbmRpZgotLQotLSNpZiAhVVNFX1NOUFJJTlRGCi0tCQkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIGZvciBjYWxsaW5nCi0tCQkgICBzcHJpbnRmLiAgKi8KLS0JCXsKLS0JCSAgc3dpdGNoIChkcC0+Y29udmVyc2lvbikKLS0JCSAgICB7Ci0tCi0tCQkgICAgY2FzZSAnZCc6IGNhc2UgJ2knOiBjYXNlICd1JzoKLS0jIGlmIEhBVkVfTE9OR19MT05HX0lOVAotLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0tCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLwotLQkJCQkJICkKLS0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLS0JCSAgICAgIGVsc2UKLS0jIGVuZGlmCi0tCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAotLQkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBlbHNlCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKLS0JCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0tCQkJdG1wX2xlbmd0aCA9IHByZWNpc2lvbjsKLS0JCSAgICAgIC8qIE11bHRpcGx5IGJ5IDIsIGFzIGFuIGVzdGltYXRlIGZvciBGTEFHX0dST1VQLiAgKi8KLS0JCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCB0bXBfbGVuZ3RoKTsKLS0JCSAgICAgIC8qIEFkZCAxLCB0byBhY2NvdW50IGZvciBhIGxlYWRpbmcgc2lnbi4gICovCi0tCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7Ci0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBjYXNlICdvJzoKLS0jIGlmIEhBVkVfTE9OR19MT05HX0lOVAotLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0tCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgZWxzZQotLSMgZW5kaWYKLS0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCi0tCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgZWxzZQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCi0tCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0tCQkJdG1wX2xlbmd0aCA9IHByZWNpc2lvbjsKLS0JCSAgICAgIC8qIEFkZCAxLCB0byBhY2NvdW50IGZvciBhIGxlYWRpbmcgc2lnbi4gICovCi0tCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7Ci0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBjYXNlICd4JzogY2FzZSAnWCc6Ci0tIyBpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HTE9OR0lOVCkKLS0JCQl0bXBfbGVuZ3RoID0KLS0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykgKiBDSEFSX0JJVAotLQkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgZWxzZQotLSMgZW5kaWYKLS0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCi0tCQkJCQkgICogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KLS0JCQkJCSApCi0tCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkgICAgICBlbHNlCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKLS0JCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLwotLQkJCQkJICkKLS0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLS0JCSAgICAgIGlmICh0bXBfbGVuZ3RoIDwgcHJlY2lzaW9uKQotLQkJCXRtcF9sZW5ndGggPSBwcmVjaXNpb247Ci0tCQkgICAgICAvKiBBZGQgMiwgdG8gYWNjb3VudCBmb3IgYSBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0uICAqLwotLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDIpOwotLQkJICAgICAgYnJlYWs7Ci0tCi0tCQkgICAgY2FzZSAnZic6IGNhc2UgJ0YnOgotLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFKQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKExEQkxfTUFYX0VYUAotLQkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KLS0JCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCi0tCQkJCQkgKQotLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkJICArIDEwOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KLS0JCSAgICAgIGVsc2UKLS0JCQl0bXBfbGVuZ3RoID0KLS0JCQkgICh1bnNpZ25lZCBpbnQpIChEQkxfTUFYX0VYUAotLQkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KLS0JCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCi0tCQkJCQkgKQotLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0tCQkJICArIDEwOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KLS0JCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCBwcmVjaXNpb24pOwotLQkJICAgICAgYnJlYWs7Ci0tCi0tCQkgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdnJzogY2FzZSAnRyc6Ci0tCQkgICAgICB0bXBfbGVuZ3RoID0KLS0JCQkxMjsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCwgZXhwb25lbnQgZXRjLiAqLwotLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIHByZWNpc2lvbik7Ci0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBjYXNlICdhJzogY2FzZSAnQSc6Ci0tCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCi0tCQkJdG1wX2xlbmd0aCA9Ci0tCQkJICAodW5zaWduZWQgaW50KSAoTERCTF9ESUcKLS0JCQkJCSAgKiAwLjgzMSAvKiBkZWNpbWFsIC0+IGhleGFkZWNpbWFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgZWxzZQotLQkJCXRtcF9sZW5ndGggPQotLQkJCSAgKHVuc2lnbmVkIGludCkgKERCTF9ESUcKLS0JCQkJCSAgKiAwLjgzMSAvKiBkZWNpbWFsIC0+IGhleGFkZWNpbWFsICovCi0tCQkJCQkgKQotLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJICAgICAgaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0tCQkJdG1wX2xlbmd0aCA9IHByZWNpc2lvbjsKLS0JCSAgICAgIC8qIEFjY291bnQgZm9yIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLwotLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDEyKTsKLS0JCSAgICAgIGJyZWFrOwotLQotLQkJICAgIGNhc2UgJ2MnOgotLSMgaWYgSEFWRV9XSU5UX1QgJiYgIVdJREVfQ0hBUl9WRVJTSU9OCi0tCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX1dJREVfQ0hBUikKLS0JCQl0bXBfbGVuZ3RoID0gTUJfQ1VSX01BWDsKLS0JCSAgICAgIGVsc2UKLS0jIGVuZGlmCi0tCQkJdG1wX2xlbmd0aCA9IDE7Ci0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBjYXNlICdzJzoKLS0jIGlmIEhBVkVfV0NIQVJfVAotLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9XSURFX1NUUklORykKLS0JCQl7Ci0tCQkJICB0bXBfbGVuZ3RoID0KLS0JCQkgICAgbG9jYWxfd2NzbGVuIChhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9zdHJpbmcpOwotLQotLSMgIGlmICFXSURFX0NIQVJfVkVSU0lPTgotLQkJCSAgdG1wX2xlbmd0aCA9IHh0aW1lcyAodG1wX2xlbmd0aCwgTUJfQ1VSX01BWCk7Ci0tIyAgZW5kaWYKLS0JCQl9Ci0tCQkgICAgICBlbHNlCi0tIyBlbmRpZgotLQkJCXRtcF9sZW5ndGggPSBzdHJsZW4gKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zdHJpbmcpOwotLQkJICAgICAgYnJlYWs7Ci0tCi0tCQkgICAgY2FzZSAncCc6Ci0tCQkgICAgICB0bXBfbGVuZ3RoID0KLS0JCQkodW5zaWduZWQgaW50KSAoc2l6ZW9mICh2b2lkICopICogQ0hBUl9CSVQKLS0JCQkJCSogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KLS0JCQkJICAgICAgICkKLS0JCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotLQkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIDB4ICovCi0tCQkgICAgICBicmVhazsKLS0KLS0JCSAgICBkZWZhdWx0OgotLQkJICAgICAgYWJvcnQgKCk7Ci0tCQkgICAgfQotLQotLSMgaWYgRU5BQkxFX1VOSVNURElPCi0tCQkgIC8qIFBhZGRpbmcgY29uc2lkZXJzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycywgdGhlcmVmb3JlIHRoZQotLQkJICAgICBudW1iZXIgb2YgZWxlbWVudHMgYWZ0ZXIgcGFkZGluZyBtYXkgYmUKLS0JCSAgICAgICA+IG1heCAodG1wX2xlbmd0aCwgd2lkdGgpCi0tCQkgICAgIGJ1dCBpcyBjZXJ0YWlubHkKLS0JCSAgICAgICA8PSB0bXBfbGVuZ3RoICsgd2lkdGguICAqLwotLQkJICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgd2lkdGgpOwotLSMgZWxzZQotLQkJICAvKiBQYWRkaW5nIGNvbnNpZGVycyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLCBzYXlzIFBPU0lYLiAgKi8KLS0JCSAgaWYgKHRtcF9sZW5ndGggPCB3aWR0aCkKLS0JCSAgICB0bXBfbGVuZ3RoID0gd2lkdGg7Ci0tIyBlbmRpZgotLQotLQkJICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7IC8qIGFjY291bnQgZm9yIHRyYWlsaW5nIE5VTCAqLwotLQkJfQotLQotLQkJaWYgKHRtcF9sZW5ndGggPD0gc2l6ZW9mICh0bXBidWYpIC8gc2l6ZW9mIChUQ0hBUl9UKSkKLS0JCSAgdG1wID0gdG1wYnVmOwotLQkJZWxzZQotLQkJICB7Ci0tCQkgICAgc2l6ZV90IHRtcF9tZW1zaXplID0geHRpbWVzICh0bXBfbGVuZ3RoLCBzaXplb2YgKFRDSEFSX1QpKTsKLS0KLS0JCSAgICBpZiAoc2l6ZV9vdmVyZmxvd19wICh0bXBfbWVtc2l6ZSkpCi0tCQkgICAgICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KLS0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCSAgICB0bXAgPSAoVENIQVJfVCAqKSBtYWxsb2MgKHRtcF9tZW1zaXplKTsKLS0JCSAgICBpZiAodG1wID09IE5VTEwpCi0tCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KLS0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLS0JCSAgfQotLSNlbmRpZgotLQotLQkJLyogRGVjaWRlIHdoZXRoZXIgdG8gaGFuZGxlIHRoZSBwcmVjaXNpb24gb3Vyc2VsdmVzLiAgKi8KLS0jaWYgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotLQkJc3dpdGNoIChkcC0+Y29udmVyc2lvbikKLS0JCSAgewotLQkJICBjYXNlICdkJzogY2FzZSAnaSc6IGNhc2UgJ3UnOgotLQkJICBjYXNlICdvJzoKLS0JCSAgY2FzZSAneCc6IGNhc2UgJ1gnOiBjYXNlICdwJzoKLS0JCSAgICBwcmVjX291cnNlbHZlcyA9IGhhc19wcmVjaXNpb24gJiYgKHByZWNpc2lvbiA+IDApOwotLQkJICAgIGJyZWFrOwotLQkJICBkZWZhdWx0OgotLQkJICAgIHByZWNfb3Vyc2VsdmVzID0gMDsKLS0JCSAgICBicmVhazsKLS0JCSAgfQotLSNlbmRpZgotLQotLQkJLyogRGVjaWRlIHdoZXRoZXIgdG8gcGVyZm9ybSB0aGUgcGFkZGluZyBvdXJzZWx2ZXMuICAqLwotLSNpZiAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPIHx8IE5FRURfUFJJTlRGX0ZMQUdfWkVSTyB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQlzd2l0Y2ggKGRwLT5jb252ZXJzaW9uKQotLQkJICB7Ci0tIyBpZiAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPCi0tCQkgIC8qIElmIHdlIG5lZWQgY29udmVyc2lvbiBmcm9tIFRDSEFSX1RbXSB0byBEQ0hBUl9UW10sIHdlIG5lZWQKLS0JCSAgICAgdG8gcGVyZm9ybSB0aGUgcGFkZGluZyBhZnRlciB0aGlzIGNvbnZlcnNpb24uICBGdW5jdGlvbnMKLS0JCSAgICAgd2l0aCB1bmlzdGRpbyBleHRlbnNpb25zIHBlcmZvcm0gdGhlIHBhZGRpbmcgYmFzZWQgb24KLS0JCSAgICAgY2hhcmFjdGVyIGNvdW50IHJhdGhlciB0aGFuIGVsZW1lbnQgY291bnQuICAqLwotLQkJICBjYXNlICdjJzogY2FzZSAncyc6Ci0tIyBlbmRpZgotLSMgaWYgTkVFRF9QUklOVEZfRkxBR19aRVJPCi0tCQkgIGNhc2UgJ2YnOiBjYXNlICdGJzogY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdnJzogY2FzZSAnRyc6Ci0tCQkgIGNhc2UgJ2EnOiBjYXNlICdBJzoKLS0jIGVuZGlmCi0tCQkgICAgcGFkX291cnNlbHZlcyA9IDE7Ci0tCQkgICAgYnJlYWs7Ci0tCQkgIGRlZmF1bHQ6Ci0tCQkgICAgcGFkX291cnNlbHZlcyA9IHByZWNfb3Vyc2VsdmVzOwotLQkJICAgIGJyZWFrOwotLQkJICB9Ci0tI2VuZGlmCi0tCi0tCQkvKiBDb25zdHJ1Y3QgdGhlIGZvcm1hdCBzdHJpbmcgZm9yIGNhbGxpbmcgc25wcmludGYgb3IKLS0JCSAgIHNwcmludGYuICAqLwotLQkJZmJwID0gYnVmOwotLQkJKmZicCsrID0gJyUnOwotLSNpZiBORUVEX1BSSU5URl9GTEFHX0dST1VQSU5HCi0tCQkvKiBUaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhlICcgZmxhZy4KLS0JCSAgIFByb2R1Y2Ugbm8gZ3JvdXBpbmcgY2hhcmFjdGVycyBpbiB0aGlzIGNhc2U7IHRoaXMgaXMKLS0JCSAgIGFjY2VwdGFibGUgYmVjYXVzZSB0aGUgZ3JvdXBpbmcgaXMgbG9jYWxlIGRlcGVuZGVudC4gICovCi0tI2Vsc2UKLS0JCWlmIChmbGFncyAmIEZMQUdfR1JPVVApCi0tCQkgICpmYnArKyA9ICdcJyc7Ci0tI2VuZGlmCi0tCQlpZiAoZmxhZ3MgJiBGTEFHX0xFRlQpCi0tCQkgICpmYnArKyA9ICctJzsKLS0JCWlmIChmbGFncyAmIEZMQUdfU0hPV1NJR04pCi0tCQkgICpmYnArKyA9ICcrJzsKLS0JCWlmIChmbGFncyAmIEZMQUdfU1BBQ0UpCi0tCQkgICpmYnArKyA9ICcgJzsKLS0JCWlmIChmbGFncyAmIEZMQUdfQUxUKQotLQkJICAqZmJwKysgPSAnIyc7Ci0tCQlpZiAoIXBhZF9vdXJzZWx2ZXMpCi0tCQkgIHsKLS0JCSAgICBpZiAoZmxhZ3MgJiBGTEFHX1pFUk8pCi0tCQkgICAgICAqZmJwKysgPSAnMCc7Ci0tCQkgICAgaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQotLQkJICAgICAgewotLQkJCXNpemVfdCBuID0gZHAtPndpZHRoX2VuZCAtIGRwLT53aWR0aF9zdGFydDsKLS0JCQkvKiBUaGUgd2lkdGggc3BlY2lmaWNhdGlvbiBpcyBrbm93biB0byBjb25zaXN0IG9ubHkKLS0JCQkgICBvZiBzdGFuZGFyZCBBU0NJSSBjaGFyYWN0ZXJzLiAgKi8KLS0JCQlpZiAoc2l6ZW9mIChGQ0hBUl9UKSA9PSBzaXplb2YgKFRDSEFSX1QpKQotLQkJCSAgewotLQkJCSAgICBtZW1jcHkgKGZicCwgZHAtPndpZHRoX3N0YXJ0LCBuICogc2l6ZW9mIChUQ0hBUl9UKSk7Ci0tCQkJICAgIGZicCArPSBuOwotLQkJCSAgfQotLQkJCWVsc2UKLS0JCQkgIHsKLS0JCQkgICAgY29uc3QgRkNIQVJfVCAqbXAgPSBkcC0+d2lkdGhfc3RhcnQ7Ci0tCQkJICAgIGRvCi0tCQkJICAgICAgKmZicCsrID0gKHVuc2lnbmVkIGNoYXIpICptcCsrOwotLQkJCSAgICB3aGlsZSAoLS1uID4gMCk7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgIH0KLS0JCWlmICghcHJlY19vdXJzZWx2ZXMpCi0tCQkgIHsKLS0JCSAgICBpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLS0JCSAgICAgIHsKLS0JCQlzaXplX3QgbiA9IGRwLT5wcmVjaXNpb25fZW5kIC0gZHAtPnByZWNpc2lvbl9zdGFydDsKLS0JCQkvKiBUaGUgcHJlY2lzaW9uIHNwZWNpZmljYXRpb24gaXMga25vd24gdG8gY29uc2lzdCBvbmx5Ci0tCQkJICAgb2Ygc3RhbmRhcmQgQVNDSUkgY2hhcmFjdGVycy4gICovCi0tCQkJaWYgKHNpemVvZiAoRkNIQVJfVCkgPT0gc2l6ZW9mIChUQ0hBUl9UKSkKLS0JCQkgIHsKLS0JCQkgICAgbWVtY3B5IChmYnAsIGRwLT5wcmVjaXNpb25fc3RhcnQsIG4gKiBzaXplb2YgKFRDSEFSX1QpKTsKLS0JCQkgICAgZmJwICs9IG47Ci0tCQkJICB9Ci0tCQkJZWxzZQotLQkJCSAgewotLQkJCSAgICBjb25zdCBGQ0hBUl9UICptcCA9IGRwLT5wcmVjaXNpb25fc3RhcnQ7Ci0tCQkJICAgIGRvCi0tCQkJICAgICAgKmZicCsrID0gKHVuc2lnbmVkIGNoYXIpICptcCsrOwotLQkJCSAgICB3aGlsZSAoLS1uID4gMCk7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tCQkgIH0KLS0KLS0JCXN3aXRjaCAodHlwZSkKLS0JCSAgewotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0JCSAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgotLQkJICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgotLSMgaWYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhIGRlZmluZWQgX19DWUdXSU5fXwotLQkJICAgICpmYnArKyA9ICdJJzsKLS0JCSAgICAqZmJwKysgPSAnNic7Ci0tCQkgICAgKmZicCsrID0gJzQnOwotLQkJICAgIGJyZWFrOwotLSMgZWxzZQotLQkJICAgICpmYnArKyA9ICdsJzsKLS0JCSAgICAvKkZBTExUSFJPVUdIKi8KLS0jIGVuZGlmCi0tI2VuZGlmCi0tCQkgIGNhc2UgVFlQRV9MT05HSU5UOgotLQkJICBjYXNlIFRZUEVfVUxPTkdJTlQ6Ci0tI2lmIEhBVkVfV0lOVF9UCi0tCQkgIGNhc2UgVFlQRV9XSURFX0NIQVI6Ci0tI2VuZGlmCi0tI2lmIEhBVkVfV0NIQVJfVAotLQkJICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6Ci0tI2VuZGlmCi0tCQkgICAgKmZicCsrID0gJ2wnOwotLQkJICAgIGJyZWFrOwotLQkJICBjYXNlIFRZUEVfTE9OR0RPVUJMRToKLS0JCSAgICAqZmJwKysgPSAnTCc7Ci0tCQkgICAgYnJlYWs7Ci0tCQkgIGRlZmF1bHQ6Ci0tCQkgICAgYnJlYWs7Ci0tCQkgIH0KLS0jaWYgTkVFRF9QUklOVEZfRElSRUNUSVZFX0YKLS0JCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnRicpCi0tCQkgICpmYnAgPSAnZic7Ci0tCQllbHNlCi0tI2VuZGlmCi0tCQkgICpmYnAgPSBkcC0+Y29udmVyc2lvbjsKLS0jaWYgVVNFX1NOUFJJTlRGCi0tIyBpZiAhKF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAzKSkKLS0JCWZicFsxXSA9ICclJzsKLS0JCWZicFsyXSA9ICduJzsKLS0JCWZicFszXSA9ICdcMCc7Ci0tIyBlbHNlCi0tCQkvKiBPbiBnbGliYzIgc3lzdGVtcyBmcm9tIGdsaWJjID49IDIuMyAtIHByb2JhYmx5IGFsc28gb2xkZXIKLS0JCSAgIG9uZXMgLSB3ZSBrbm93IHRoYXQgc25wcmludGYncyByZXR1cm5zIHZhbHVlIGNvbmZvcm1zIHRvCi0tCQkgICBJU08gQyA5OTogdGhlIGdsX1NOUFJJTlRGX0RJUkVDVElWRV9OIHRlc3QgcGFzc2VzLgotLQkJICAgVGhlcmVmb3JlIHdlIGNhbiBhdm9pZCB1c2luZyAlbiBpbiB0aGlzIHNpdHVhdGlvbi4KLS0JCSAgIE9uIGdsaWJjMiBzeXN0ZW1zIGZyb20gMjAwNC0xMC0xOCBvciBuZXdlciwgdGhlIHVzZSBvZiAlbgotLQkJICAgaW4gZm9ybWF0IHN0cmluZ3MgaW4gd3JpdGFibGUgbWVtb3J5IG1heSBjcmFzaCB0aGUgcHJvZ3JhbQotLQkJICAgKGlmIGNvbXBpbGVkIHdpdGggX0ZPUlRJRllfU09VUkNFPTIpLCBzbyB3ZSBzaG91bGQgYXZvaWQgaXQKLS0JCSAgIGluIHRoaXMgc2l0dWF0aW9uLiAgKi8KLS0JCWZicFsxXSA9ICdcMCc7Ci0tIyBlbmRpZgotLSNlbHNlCi0tCQlmYnBbMV0gPSAnXDAnOwotLSNlbmRpZgotLQotLQkJLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgZm9yIGNhbGxpbmcgc25wcmludGYgb3Igc3ByaW50Zi4gICovCi0tCQlwcmVmaXhfY291bnQgPSAwOwotLQkJaWYgKCFwYWRfb3Vyc2VsdmVzICYmIGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0tCQkgIHsKLS0JCSAgICBpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLS0JCSAgICAgIGFib3J0ICgpOwotLQkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkgIH0KLS0JCWlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLS0JCSAgewotLQkJICAgIGlmICghKGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLS0JCSAgICAgIGFib3J0ICgpOwotLQkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OwotLQkJICB9Ci0tCi0tI2lmIFVTRV9TTlBSSU5URgotLQkJLyogVGhlIFNOUFJJTlRGIHJlc3VsdCBpcyBhcHBlbmRlZCBhZnRlciByZXN1bHRbMC4ubGVuZ3RoXS4KLS0JCSAgIFRoZSBsYXR0ZXIgaXMgYW4gYXJyYXkgb2YgRENIQVJfVDsgU05QUklOVEYgYXBwZW5kcyBhbgotLQkJICAgYXJyYXkgb2YgVENIQVJfVCB0byBpdC4gIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZQotLQkJICAgc2l6ZW9mIChUQ0hBUl9UKSBkaXZpZGVzIHNpemVvZiAoRENIQVJfVCkgYW5kCi0tCQkgICBhbGlnbm9mIChUQ0hBUl9UKSA8PSBhbGlnbm9mIChEQ0hBUl9UKS4gICovCi0tIyBkZWZpbmUgVENIQVJTX1BFUl9EQ0hBUiAoc2l6ZW9mIChEQ0hBUl9UKSAvIHNpemVvZiAoVENIQVJfVCkpCi0tCQkvKiBQcmVwYXJlIGNoZWNraW5nIHdoZXRoZXIgc25wcmludGYgcmV0dXJucyB0aGUgY291bnQKLS0JCSAgIHZpYSAlbi4gICovCi0tCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7Ci0tCQkqKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCkgPSAnXDAnOwotLSNlbmRpZgotLQotLQkJZm9yICg7OykKLS0JCSAgewotLQkJICAgIGludCBjb3VudCA9IC0xOwotLQotLSNpZiBVU0VfU05QUklOVEYKLS0JCSAgICBpbnQgcmV0Y291bnQgPSAwOwotLQkJICAgIHNpemVfdCBtYXhsZW4gPSBhbGxvY2F0ZWQgLSBsZW5ndGg7Ci0tCQkgICAgLyogU05QUklOVEYgY2FuIGZhaWwgaWYgaXRzIHNlY29uZCBhcmd1bWVudCBpcwotLQkJICAgICAgID4gSU5UX01BWC4gICovCi0tCQkgICAgaWYgKG1heGxlbiA+IElOVF9NQVggLyBUQ0hBUlNfUEVSX0RDSEFSKQotLQkJICAgICAgbWF4bGVuID0gSU5UX01BWCAvIFRDSEFSU19QRVJfRENIQVI7Ci0tCQkgICAgbWF4bGVuID0gbWF4bGVuICogVENIQVJTX1BFUl9EQ0hBUjsKLS0jIGRlZmluZSBTTlBSSU5URl9CVUYoYXJnKSBcCi0tCQkgICAgc3dpdGNoIChwcmVmaXhfY291bnQpCQkJCSAgICBcCi0tCQkgICAgICB7CQkJCQkJCSAgICBcCi0tCQkgICAgICBjYXNlIDA6CQkJCQkJICAgIFwKLS0JCQlyZXRjb3VudCA9IFNOUFJJTlRGICgoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKSwgXAotLQkJCQkJICAgICBtYXhsZW4sIGJ1ZiwJCSAgICBcCi0tCQkJCQkgICAgIGFyZywgJmNvdW50KTsJCSAgICBcCi0tCQkJYnJlYWs7CQkJCQkJICAgIFwKLS0JCSAgICAgIGNhc2UgMToJCQkJCQkgICAgXAotLQkJCXJldGNvdW50ID0gU05QUklOVEYgKChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpLCBcCi0tCQkJCQkgICAgIG1heGxlbiwgYnVmLAkJICAgIFwKLS0JCQkJCSAgICAgcHJlZml4ZXNbMF0sIGFyZywgJmNvdW50KTsJICAgIFwKLS0JCQlicmVhazsJCQkJCQkgICAgXAotLQkJICAgICAgY2FzZSAyOgkJCQkJCSAgICBcCi0tCQkJcmV0Y291bnQgPSBTTlBSSU5URiAoKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCksIFwKLS0JCQkJCSAgICAgbWF4bGVuLCBidWYsCQkgICAgXAotLQkJCQkJICAgICBwcmVmaXhlc1swXSwgcHJlZml4ZXNbMV0sIGFyZywgXAotLQkJCQkJICAgICAmY291bnQpOwkJCSAgICBcCi0tCQkJYnJlYWs7CQkJCQkJICAgIFwKLS0JCSAgICAgIGRlZmF1bHQ6CQkJCQkJICAgIFwKLS0JCQlhYm9ydCAoKTsJCQkJCSAgICBcCi0tCQkgICAgICB9Ci0tI2Vsc2UKLS0jIGRlZmluZSBTTlBSSU5URl9CVUYoYXJnKSBcCi0tCQkgICAgc3dpdGNoIChwcmVmaXhfY291bnQpCQkJCSAgICBcCi0tCQkgICAgICB7CQkJCQkJCSAgICBcCi0tCQkgICAgICBjYXNlIDA6CQkJCQkJICAgIFwKLS0JCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBhcmcpOwkJICAgIFwKLS0JCQlicmVhazsJCQkJCQkgICAgXAotLQkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCi0tCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgcHJlZml4ZXNbMF0sIGFyZyk7CSAgICBcCi0tCQkJYnJlYWs7CQkJCQkJICAgIFwKLS0JCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgXAotLQkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIHByZWZpeGVzWzBdLCBwcmVmaXhlc1sxXSxcCi0tCQkJCQkgYXJnKTsJCQkJICAgIFwKLS0JCQlicmVhazsJCQkJCQkgICAgXAotLQkJICAgICAgZGVmYXVsdDoJCQkJCQkgICAgXAotLQkJCWFib3J0ICgpOwkJCQkJICAgIFwKLS0JCSAgICAgIH0KLS0jZW5kaWYKLS0KLS0JCSAgICBzd2l0Y2ggKHR5cGUpCi0tCQkgICAgICB7Ci0tCQkgICAgICBjYXNlIFRZUEVfU0NIQVI6Ci0tCQkJewotLQkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zY2hhcjsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tCQkgICAgICBjYXNlIFRZUEVfVUNIQVI6Ci0tCQkJewotLQkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91Y2hhcjsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tCQkgICAgICBjYXNlIFRZUEVfU0hPUlQ6Ci0tCQkJewotLQkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zaG9ydDsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tCQkgICAgICBjYXNlIFRZUEVfVVNIT1JUOgotLQkJCXsKLS0JCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdXNob3J0OwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9JTlQ6Ci0tCQkJewotLQkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLQkJICAgICAgY2FzZSBUWVBFX1VJTlQ6Ci0tCQkJewotLQkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91aW50OwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9MT05HSU5UOgotLQkJCXsKLS0JCQkgIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25naW50OwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9VTE9OR0lOVDoKLS0JCQl7Ci0tCQkJICB1bnNpZ25lZCBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWxvbmdpbnQ7Ci0tCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0tCQkJfQotLQkJCWJyZWFrOwotLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLS0JCSAgICAgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKLS0JCQl7Ci0tCQkJICBsb25nIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nbG9uZ2ludDsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tCQkgICAgICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgotLQkJCXsKLS0JCQkgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Vsb25nbG9uZ2ludDsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tI2VuZGlmCi0tCQkgICAgICBjYXNlIFRZUEVfRE9VQkxFOgotLQkJCXsKLS0JCQkgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgotLQkJCXsKLS0JCQkgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0JCSAgICAgIGNhc2UgVFlQRV9DSEFSOgotLQkJCXsKLS0JCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY2hhcjsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tI2lmIEhBVkVfV0lOVF9UCi0tCQkgICAgICBjYXNlIFRZUEVfV0lERV9DSEFSOgotLQkJCXsKLS0JCQkgIHdpbnRfdCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9jaGFyOwotLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotLQkJCX0KLS0JCQlicmVhazsKLS0jZW5kaWYKLS0JCSAgICAgIGNhc2UgVFlQRV9TVFJJTkc6Ci0tCQkJewotLQkJCSAgY29uc3QgY2hhciAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3N0cmluZzsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tI2lmIEhBVkVfV0NIQVJfVAotLQkJICAgICAgY2FzZSBUWVBFX1dJREVfU1RSSU5HOgotLQkJCXsKLS0JCQkgIGNvbnN0IHdjaGFyX3QgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX3N0cmluZzsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tI2VuZGlmCi0tCQkgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKLS0JCQl7Ci0tCQkJICB2b2lkICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfcG9pbnRlcjsKLS0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLS0JCQl9Ci0tCQkJYnJlYWs7Ci0tCQkgICAgICBkZWZhdWx0OgotLQkJCWFib3J0ICgpOwotLQkJICAgICAgfQotLQotLSNpZiBVU0VfU05QUklOVEYKLS0JCSAgICAvKiBQb3J0YWJpbGl0eTogTm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgb2Ygc25wcmludGYoKQotLQkJICAgICAgIGFyZSBJU08gQyA5OSBjb21wbGlhbnQuICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZgotLQkJICAgICAgIGJ5dGVzIHRoYXQgc25wcmludGYoKSBoYXMgcHJvZHVjZWQgb3Igd291bGQgaGF2ZQotLQkJICAgICAgIHByb2R1Y2VkLiAgKi8KLS0JCSAgICBpZiAoY291bnQgPj0gMCkKLS0JCSAgICAgIHsKLS0JCQkvKiBWZXJpZnkgdGhhdCBzbnByaW50ZigpIGhhcyBOVUwtdGVybWluYXRlZCBpdHMKLS0JCQkgICByZXN1bHQuICAqLwotLQkJCWlmIChjb3VudCA8IG1heGxlbgotLQkJCSAgICAmJiAoKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCkpIFtjb3VudF0gIT0gJ1wwJykKLS0JCQkgIGFib3J0ICgpOwotLQkJCS8qIFBvcnRhYmlsaXR5IGhhY2suICAqLwotLQkJCWlmIChyZXRjb3VudCA+IGNvdW50KQotLQkJCSAgY291bnQgPSByZXRjb3VudDsKLS0JCSAgICAgIH0KLS0JCSAgICBlbHNlCi0tCQkgICAgICB7Ci0tCQkJLyogc25wcmludGYoKSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicKLS0JCQkgICBkaXJlY3RpdmUuICAqLwotLQkJCWlmIChmYnBbMV0gIT0gJ1wwJykKLS0JCQkgIHsKLS0JCQkgICAgLyogRG9uJ3QgdXNlIHRoZSAnJW4nIGRpcmVjdGl2ZTsgaW5zdGVhZCwgbG9vawotLQkJCSAgICAgICBhdCB0aGUgc25wcmludGYoKSByZXR1cm4gdmFsdWUuICAqLwotLQkJCSAgICBmYnBbMV0gPSAnXDAnOwotLQkJCSAgICBjb250aW51ZTsKLS0JCQkgIH0KLS0JCQllbHNlCi0tCQkJICB7Ci0tCQkJICAgIC8qIExvb2sgYXQgdGhlIHNucHJpbnRmKCkgcmV0dXJuIHZhbHVlLiAgKi8KLS0JCQkgICAgaWYgKHJldGNvdW50IDwgMCkKLS0JCQkgICAgICB7Ci0tCQkJCS8qIEhQLVVYIDEwLjIwIHNucHJpbnRmKCkgaXMgZG91Ymx5IGRlZmljaWVudDoKLS0JCQkJICAgSXQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAnJW4nIGRpcmVjdGl2ZSwKLS0JCQkJICAgKmFuZCogaXQgcmV0dXJucyAtMSAocmF0aGVyIHRoYW4gdGhlIGxlbmd0aAotLQkJCQkgICB0aGF0IHdvdWxkIGhhdmUgYmVlbiByZXF1aXJlZCkgd2hlbiB0aGUKLS0JCQkJICAgYnVmZmVyIGlzIHRvbyBzbWFsbC4gICovCi0tCQkJCXNpemVfdCBiaWdnZXJfbmVlZCA9Ci0tCQkJCSAgeHN1bSAoeHRpbWVzIChhbGxvY2F0ZWQsIDIpLCAxMik7Ci0tCQkJCUVOU1VSRV9BTExPQ0FUSU9OIChiaWdnZXJfbmVlZCk7Ci0tCQkJCWNvbnRpbnVlOwotLQkJCSAgICAgIH0KLS0JCQkgICAgZWxzZQotLQkJCSAgICAgIGNvdW50ID0gcmV0Y291bnQ7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tI2VuZGlmCi0tCi0tCQkgICAgLyogQXR0ZW1wdCB0byBoYW5kbGUgZmFpbHVyZS4gICovCi0tCQkgICAgaWYgKGNvdW50IDwgMCkKLS0JCSAgICAgIHsKLS0JCQlpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0JCQkgIGZyZWUgKHJlc3VsdCk7Ci0tCQkJaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLQkJCSAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0JCQlDTEVBTlVQICgpOwotLQkJCWVycm5vID0gRUlOVkFMOwotLQkJCXJldHVybiBOVUxMOwotLQkJICAgICAgfQotLQotLSNpZiBVU0VfU05QUklOVEYKLS0JCSAgICAvKiBIYW5kbGUgb3ZlcmZsb3cgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCi0tCQkgICAgICAgSWYgc3VjaCBhbiBvdmVyZmxvdyBvY2N1cnMsIGEgQzk5IGNvbXBsaWFudCBzbnByaW50ZigpCi0tCQkgICAgICAgcmV0dXJucyBhIGNvdW50ID49IG1heGxlbi4gIEhvd2V2ZXIsIGEgbm9uLWNvbXBsaWFudAotLQkJICAgICAgIHNucHJpbnRmKCkgZnVuY3Rpb24gcmV0dXJucyBvbmx5IGNvdW50ID0gbWF4bGVuIC0gMS4gIFRvCi0tCQkgICAgICAgY292ZXIgYm90aCBjYXNlcywgdGVzdCB3aGV0aGVyIGNvdW50ID49IG1heGxlbiAtIDEuICAqLwotLQkJICAgIGlmICgodW5zaWduZWQgaW50KSBjb3VudCArIDEgPj0gbWF4bGVuKQotLQkJICAgICAgewotLQkJCS8qIElmIG1heGxlbiBhbHJlYWR5IGhhcyBhdHRhaW5lZCBpdHMgYWxsb3dlZCBtYXhpbXVtLAotLQkJCSAgIGFsbG9jYXRpbmcgbW9yZSBtZW1vcnkgd2lsbCBub3QgaW5jcmVhc2UgbWF4bGVuLgotLQkJCSAgIEluc3RlYWQgb2YgbG9vcGluZywgYmFpbCBvdXQuICAqLwotLQkJCWlmIChtYXhsZW4gPT0gSU5UX01BWCAvIFRDSEFSU19QRVJfRENIQVIpCi0tCQkJICBnb3RvIG92ZXJmbG93OwotLQkJCWVsc2UKLS0JCQkgIHsKLS0JCQkgICAgLyogTmVlZCBhdCBsZWFzdCBjb3VudCAqIHNpemVvZiAoVENIQVJfVCkgYnl0ZXMuCi0tCQkJICAgICAgIEJ1dCBhbGxvY2F0ZSBwcm9wb3J0aW9uYWxseSwgdG8gYXZvaWQgbG9vcGluZwotLQkJCSAgICAgICBldGVybmFsbHkgaWYgc25wcmludGYoKSByZXBvcnRzIGEgdG9vIHNtYWxsCi0tCQkJICAgICAgIGNvdW50LiAgKi8KLS0JCQkgICAgc2l6ZV90IG4gPQotLQkJCSAgICAgIHhtYXggKHhzdW0gKGxlbmd0aCwKLS0JCQkJCSAgKGNvdW50ICsgVENIQVJTX1BFUl9EQ0hBUiAtIDEpCi0tCQkJCQkgIC8gVENIQVJTX1BFUl9EQ0hBUiksCi0tCQkJCSAgICB4dGltZXMgKGFsbG9jYXRlZCwgMikpOwotLQotLQkJCSAgICBFTlNVUkVfQUxMT0NBVElPTiAobik7Ci0tCQkJICAgIGNvbnRpbnVlOwotLQkJCSAgfQotLQkJICAgICAgfQotLSNlbmRpZgotLQotLSNpZiBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0tCQkgICAgaWYgKHByZWNfb3Vyc2VsdmVzKQotLQkJICAgICAgewotLQkJCS8qIEhhbmRsZSB0aGUgcHJlY2lzaW9uLiAgKi8KLS0JCQlUQ0hBUl9UICpwcmVjX3B0ciA9IAotLSMgaWYgVVNFX1NOUFJJTlRGCi0tCQkJICAoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKTsKLS0jIGVsc2UKLS0JCQkgIHRtcDsKLS0jIGVuZGlmCi0tCQkJc2l6ZV90IHByZWZpeF9jb3VudDsKLS0JCQlzaXplX3QgbW92ZTsKLS0KLS0JCQlwcmVmaXhfY291bnQgPSAwOwotLQkJCS8qIFB1dCB0aGUgYWRkaXRpb25hbCB6ZXJvZXMgYWZ0ZXIgdGhlIHNpZ24uICAqLwotLQkJCWlmIChjb3VudCA+PSAxCi0tCQkJICAgICYmICgqcHJlY19wdHIgPT0gJy0nIHx8ICpwcmVjX3B0ciA9PSAnKycKLS0JCQkJfHwgKnByZWNfcHRyID09ICcgJykpCi0tCQkJICBwcmVmaXhfY291bnQgPSAxOwotLQkJCS8qIFB1dCB0aGUgYWRkaXRpb25hbCB6ZXJvZXMgYWZ0ZXIgdGhlIDB4IHByZWZpeCBpZgotLQkJCSAgIChmbGFncyAmIEZMQUdfQUxUKSB8fCAoZHAtPmNvbnZlcnNpb24gPT0gJ3AnKS4gICovCi0tCQkJZWxzZSBpZiAoY291bnQgPj0gMgotLQkJCQkgJiYgcHJlY19wdHJbMF0gPT0gJzAnCi0tCQkJCSAmJiAocHJlY19wdHJbMV0gPT0gJ3gnIHx8IHByZWNfcHRyWzFdID09ICdYJykpCi0tCQkJICBwcmVmaXhfY291bnQgPSAyOwotLQotLQkJCW1vdmUgPSBjb3VudCAtIHByZWZpeF9jb3VudDsKLS0JCQlpZiAocHJlY2lzaW9uID4gbW92ZSkKLS0JCQkgIHsKLS0JCQkgICAgLyogSW5zZXJ0IHplcm9lcy4gICovCi0tCQkJICAgIHNpemVfdCBpbnNlcnQgPSBwcmVjaXNpb24gLSBtb3ZlOwotLQkJCSAgICBUQ0hBUl9UICpwcmVjX2VuZDsKLS0KLS0jIGlmIFVTRV9TTlBSSU5URgotLQkJCSAgICBzaXplX3QgbiA9Ci0tCQkJICAgICAgeHN1bSAobGVuZ3RoLAotLQkJCQkgICAgKGNvdW50ICsgaW5zZXJ0ICsgVENIQVJTX1BFUl9EQ0hBUiAtIDEpCi0tCQkJCSAgICAvIFRDSEFSU19QRVJfRENIQVIpOwotLQkJCSAgICBsZW5ndGggKz0gKGNvdW50ICsgVENIQVJTX1BFUl9EQ0hBUiAtIDEpIC8gVENIQVJTX1BFUl9EQ0hBUjsKLS0JCQkgICAgRU5TVVJFX0FMTE9DQVRJT04gKG4pOwotLQkJCSAgICBsZW5ndGggLT0gKGNvdW50ICsgVENIQVJTX1BFUl9EQ0hBUiAtIDEpIC8gVENIQVJTX1BFUl9EQ0hBUjsKLS0JCQkgICAgcHJlY19wdHIgPSAoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKTsKLS0jIGVuZGlmCi0tCi0tCQkJICAgIHByZWNfZW5kID0gcHJlY19wdHIgKyBjb3VudDsKLS0JCQkgICAgcHJlY19wdHIgKz0gcHJlZml4X2NvdW50OwotLQotLQkJCSAgICB3aGlsZSAocHJlY19lbmQgPiBwcmVjX3B0cikKLS0JCQkgICAgICB7Ci0tCQkJCXByZWNfZW5kLS07Ci0tCQkJCXByZWNfZW5kW2luc2VydF0gPSBwcmVjX2VuZFswXTsKLS0JCQkgICAgICB9Ci0tCi0tCQkJICAgIHByZWNfZW5kICs9IGluc2VydDsKLS0JCQkgICAgZG8KLS0JCQkgICAgICAqLS1wcmVjX2VuZCA9ICcwJzsKLS0JCQkgICAgd2hpbGUgKHByZWNfZW5kID4gcHJlY19wdHIpOwotLQotLQkJCSAgICBjb3VudCArPSBpbnNlcnQ7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tI2VuZGlmCi0tCi0tI2lmICFEQ0hBUl9JU19UQ0hBUgotLSMgaWYgIVVTRV9TTlBSSU5URgotLQkJICAgIGlmIChjb3VudCA+PSB0bXBfbGVuZ3RoKQotLQkJICAgICAgLyogdG1wX2xlbmd0aCB3YXMgaW5jb3JyZWN0bHkgY2FsY3VsYXRlZCAtIGZpeCB0aGUKLS0JCQkgY29kZSBhYm92ZSEgICovCi0tCQkgICAgICBhYm9ydCAoKTsKLS0jIGVuZGlmCi0tCi0tCQkgICAgLyogQ29udmVydCBmcm9tIFRDSEFSX1RbXSB0byBEQ0hBUl9UW10uICAqLwotLQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnYycgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ3MnKQotLQkJICAgICAgewotLQkJCS8qIHR5cGUgPSBUWVBFX0NIQVIgb3IgVFlQRV9XSURFX0NIQVIgb3IgVFlQRV9TVFJJTkcKLS0JCQkgICBUWVBFX1dJREVfU1RSSU5HLgotLQkJCSAgIFRoZSByZXN1bHQgc3RyaW5nIGlzIG5vdCBjZXJ0YWlubHkgQVNDSUkuICAqLwotLQkJCWNvbnN0IFRDSEFSX1QgKnRtcHNyYzsKLS0JCQlEQ0hBUl9UICp0bXBkc3Q7Ci0tCQkJc2l6ZV90IHRtcGRzdF9sZW47Ci0tCQkJLyogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBUQ0hBUl9UIGlzICdjaGFyJy4gICovCi0tCQkJdHlwZWRlZiBpbnQgVENIQVJfVF92ZXJpZnkKLS0JCQkJICAgIFsyICogKHNpemVvZiAoVENIQVJfVCkgPT0gMSkgLSAxXTsKLS0jIGlmIFVTRV9TTlBSSU5URgotLQkJCXRtcHNyYyA9IChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpOwotLSMgZWxzZQotLQkJCXRtcHNyYyA9IHRtcDsKLS0jIGVuZGlmCi0tCQkJdG1wZHN0ID0gTlVMTDsKLS0JCQl0bXBkc3RfbGVuID0gMDsKLS0JCQlpZiAoRENIQVJfQ09OVl9GUk9NX0VOQ09ESU5HIChsb2NhbGVfY2hhcnNldCAoKSwKLS0JCQkJCQkgICAgICBpY29udmVoX3F1ZXN0aW9uX21hcmssCi0tCQkJCQkJICAgICAgdG1wc3JjLCBjb3VudCwKLS0JCQkJCQkgICAgICBOVUxMLAotLQkJCQkJCSAgICAgICZ0bXBkc3QsICZ0bXBkc3RfbGVuKQotLQkJCSAgICA8IDApCi0tCQkJICB7Ci0tCQkJICAgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotLQkJCSAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLS0JCQkgICAgICBmcmVlIChyZXN1bHQpOwotLQkJCSAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0tCQkJICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLS0JCQkgICAgQ0xFQU5VUCAoKTsKLS0JCQkgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKLS0JCQkgICAgcmV0dXJuIE5VTEw7Ci0tCQkJICB9Ci0tCQkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgdG1wZHN0X2xlbikpOwotLQkJCURDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCB0bXBkc3QsIHRtcGRzdF9sZW4pOwotLQkJCWZyZWUgKHRtcGRzdCk7Ci0tCQkJY291bnQgPSB0bXBkc3RfbGVuOwotLQkJICAgICAgfQotLQkJICAgIGVsc2UKLS0JCSAgICAgIHsKLS0JCQkvKiBUaGUgcmVzdWx0IHN0cmluZyBpcyBBU0NJSS4KLS0JCQkgICBTaW1wbGUgMToxIGNvbnZlcnNpb24uICAqLwotLSMgaWYgVVNFX1NOUFJJTlRGCi0tCQkJLyogSWYgc2l6ZW9mIChEQ0hBUl9UKSA9PSBzaXplb2YgKFRDSEFSX1QpLCBpdCdzIGEKLS0JCQkgICBuby1vcCBjb252ZXJzaW9uLCBpbi1wbGFjZSBvbiB0aGUgYXJyYXkgc3RhcnRpbmcKLS0JCQkgICBhdCAocmVzdWx0ICsgbGVuZ3RoKS4gICovCi0tCQkJaWYgKHNpemVvZiAoRENIQVJfVCkgIT0gc2l6ZW9mIChUQ0hBUl9UKSkKLS0jIGVuZGlmCi0tCQkJICB7Ci0tCQkJICAgIGNvbnN0IFRDSEFSX1QgKnRtcHNyYzsKLS0JCQkgICAgRENIQVJfVCAqdG1wZHN0OwotLQkJCSAgICBzaXplX3QgbjsKLS0KLS0jIGlmIFVTRV9TTlBSSU5URgotLQkJCSAgICBpZiAocmVzdWx0ID09IHJlc3VsdGJ1ZikKLS0JCQkgICAgICB7Ci0tCQkJCXRtcHNyYyA9IChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpOwotLQkJCQkvKiBFTlNVUkVfQUxMT0NBVElPTiB3aWxsIG5vdCBtb3ZlIHRtcHNyYwotLQkJCQkgICAoYmVjYXVzZSBpdCdzIHBhcnQgb2YgcmVzdWx0YnVmKS4gICovCi0tCQkJCUVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIGNvdW50KSk7Ci0tCQkJICAgICAgfQotLQkJCSAgICBlbHNlCi0tCQkJICAgICAgewotLQkJCQkvKiBFTlNVUkVfQUxMT0NBVElPTiB3aWxsIG1vdmUgdGhlIGFycmF5Ci0tCQkJCSAgIChiZWNhdXNlIGl0IHVzZXMgcmVhbGxvYygpLiAgKi8KLS0JCQkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgY291bnQpKTsKLS0JCQkJdG1wc3JjID0gKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCk7Ci0tCQkJICAgICAgfQotLSMgZWxzZQotLQkJCSAgICB0bXBzcmMgPSB0bXA7Ci0tCQkJICAgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIGNvdW50KSk7Ci0tIyBlbmRpZgotLQkJCSAgICB0bXBkc3QgPSByZXN1bHQgKyBsZW5ndGg7Ci0tCQkJICAgIC8qIENvcHkgYmFja3dhcmRzLCBiZWNhdXNlIG9mIG92ZXJsYXBwaW5nLiAgKi8KLS0JCQkgICAgdG1wc3JjICs9IGNvdW50OwotLQkJCSAgICB0bXBkc3QgKz0gY291bnQ7Ci0tCQkJICAgIGZvciAobiA9IGNvdW50OyBuID4gMDsgbi0tKQotLQkJCSAgICAgICotLXRtcGRzdCA9ICh1bnNpZ25lZCBjaGFyKSAqLS10bXBzcmM7Ci0tCQkJICB9Ci0tCQkgICAgICB9Ci0tI2VuZGlmCi0tCi0tI2lmIERDSEFSX0lTX1RDSEFSICYmICFVU0VfU05QUklOVEYKLS0JCSAgICAvKiBNYWtlIHJvb20gZm9yIHRoZSByZXN1bHQuICAqLwotLQkJICAgIGlmIChjb3VudCA+IGFsbG9jYXRlZCAtIGxlbmd0aCkKLS0JCSAgICAgIHsKLS0JCQkvKiBOZWVkIGF0IGxlYXN0IGNvdW50IGVsZW1lbnRzLiAgQnV0IGFsbG9jYXRlCi0tCQkJICAgcHJvcG9ydGlvbmFsbHkuICAqLwotLQkJCXNpemVfdCBuID0KLS0JCQkgIHhtYXggKHhzdW0gKGxlbmd0aCwgY291bnQpLCB4dGltZXMgKGFsbG9jYXRlZCwgMikpOwotLQotLQkJCUVOU1VSRV9BTExPQ0FUSU9OIChuKTsKLS0JCSAgICAgIH0KLS0jZW5kaWYKLS0KLS0JCSAgICAvKiBIZXJlIGNvdW50IDw9IGFsbG9jYXRlZCAtIGxlbmd0aC4gICovCi0tCi0tCQkgICAgLyogUGVyZm9ybSBwYWRkaW5nLiAgKi8KLS0jaWYgIURDSEFSX0lTX1RDSEFSIHx8IEVOQUJMRV9VTklTVERJTyB8fCBORUVEX1BSSU5URl9GTEFHX1pFUk8gfHwgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotLQkJICAgIGlmIChwYWRfb3Vyc2VsdmVzICYmIGhhc193aWR0aCkKLS0JCSAgICAgIHsKLS0JCQlzaXplX3QgdzsKLS0jIGlmIEVOQUJMRV9VTklTVERJTwotLQkJCS8qIE91dHNpZGUgUE9TSVgsIGl0J3MgcHJlZmVycmFibGUgdG8gY29tcGFyZSB0aGUgd2lkdGgKLS0JCQkgICBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgX2NoYXJhY3RlcnNfIG9mIHRoZSBjb252ZXJ0ZWQKLS0JCQkgICB2YWx1ZS4gICovCi0tCQkJdyA9IERDSEFSX01CU05MRU4gKHJlc3VsdCArIGxlbmd0aCwgY291bnQpOwotLSMgZWxzZQotLQkJCS8qIFRoZSB3aWR0aCBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgX2J5dGVzXwotLQkJCSAgIG9mIHRoZSBjb252ZXJ0ZWQgdmFsdWUsIHNheXMgUE9TSVguICAqLwotLQkJCXcgPSBjb3VudDsKLS0jIGVuZGlmCi0tCQkJaWYgKHcgPCB3aWR0aCkKLS0JCQkgIHsKLS0JCQkgICAgc2l6ZV90IHBhZCA9IHdpZHRoIC0gdzsKLS0jIGlmIFVTRV9TTlBSSU5URgotLQkJCSAgICAvKiBNYWtlIHJvb20gZm9yIHRoZSByZXN1bHQuICAqLwotLQkJCSAgICBpZiAoeHN1bSAoY291bnQsIHBhZCkgPiBhbGxvY2F0ZWQgLSBsZW5ndGgpCi0tCQkJICAgICAgewotLQkJCQkvKiBOZWVkIGF0IGxlYXN0IGNvdW50ICsgcGFkIGVsZW1lbnRzLiAgQnV0Ci0tCQkJCSAgIGFsbG9jYXRlIHByb3BvcnRpb25hbGx5LiAgKi8KLS0JCQkJc2l6ZV90IG4gPQotLQkJCQkgIHhtYXggKHhzdW0zIChsZW5ndGgsIGNvdW50LCBwYWQpLAotLQkJCQkJeHRpbWVzIChhbGxvY2F0ZWQsIDIpKTsKLS0KLS0JCQkJbGVuZ3RoICs9IGNvdW50OwotLQkJCQlFTlNVUkVfQUxMT0NBVElPTiAobik7Ci0tCQkJCWxlbmd0aCAtPSBjb3VudDsKLS0JCQkgICAgICB9Ci0tCQkJICAgIC8qIEhlcmUgY291bnQgKyBwYWQgPD0gYWxsb2NhdGVkIC0gbGVuZ3RoLiAgKi8KLS0jIGVuZGlmCi0tCQkJICAgIHsKLS0jIGlmICFEQ0hBUl9JU19UQ0hBUiB8fCBVU0VfU05QUklOVEYKLS0JCQkgICAgICBEQ0hBUl9UICogY29uc3QgcnAgPSByZXN1bHQgKyBsZW5ndGg7Ci0tIyBlbHNlCi0tCQkJICAgICAgRENIQVJfVCAqIGNvbnN0IHJwID0gdG1wOwotLSMgZW5kaWYKLS0JCQkgICAgICBEQ0hBUl9UICpwID0gcnAgKyBjb3VudDsKLS0JCQkgICAgICBEQ0hBUl9UICplbmQgPSBwICsgcGFkOwotLSMgaWYgTkVFRF9QUklOVEZfRkxBR19aRVJPCi0tCQkJICAgICAgRENIQVJfVCAqcGFkX3B0cjsKLS0jICBpZiAhRENIQVJfSVNfVENIQVIKLS0JCQkgICAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2MnCi0tCQkJCSAgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ3MnKQotLQkJCQkvKiBObyB6ZXJvLXBhZGRpbmcgZm9yIHN0cmluZyBkaXJlY3RpdmVzLiAgKi8KLS0JCQkJcGFkX3B0ciA9IE5VTEw7Ci0tCQkJICAgICAgZWxzZQotLSMgIGVuZGlmCi0tCQkJCXsKLS0JCQkJICBwYWRfcHRyID0gKCpycCA9PSAnLScgPyBycCArIDEgOiBycCk7Ci0tCQkJCSAgLyogTm8gemVyby1wYWRkaW5nIG9mICJpbmYiIGFuZCAibmFuIi4gICovCi0tCQkJCSAgaWYgKCgqcGFkX3B0ciA+PSAnQScgJiYgKnBhZF9wdHIgPD0gJ1onKQotLQkJCQkgICAgICB8fCAoKnBhZF9wdHIgPj0gJ2EnICYmICpwYWRfcHRyIDw9ICd6JykpCi0tCQkJCSAgICBwYWRfcHRyID0gTlVMTDsKLS0JCQkJfQotLSMgZW5kaWYKLS0JCQkgICAgICAvKiBUaGUgZ2VuZXJhdGVkIHN0cmluZyBub3cgZXh0ZW5kcyBmcm9tIHJwIHRvIHAsCi0tCQkJCSB3aXRoIHRoZSB6ZXJvIHBhZGRpbmcgaW5zZXJ0aW9uIHBvaW50IGJlaW5nIGF0Ci0tCQkJCSBwYWRfcHRyLiAgKi8KLS0KLS0JCQkgICAgICBjb3VudCA9IGNvdW50ICsgcGFkOyAvKiA9IGVuZCAtIHJwICovCi0tCi0tCQkJICAgICAgaWYgKGZsYWdzICYgRkxBR19MRUZUKQotLQkJCQl7Ci0tCQkJCSAgLyogUGFkIHdpdGggc3BhY2VzIG9uIHRoZSByaWdodC4gICovCi0tCQkJCSAgZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotLQkJCQkgICAgKnArKyA9ICcgJzsKLS0JCQkJfQotLSMgaWYgTkVFRF9QUklOVEZfRkxBR19aRVJPCi0tCQkJICAgICAgZWxzZSBpZiAoKGZsYWdzICYgRkxBR19aRVJPKSAmJiBwYWRfcHRyICE9IE5VTEwpCi0tCQkJCXsKLS0JCQkJICAvKiBQYWQgd2l0aCB6ZXJvZXMuICAqLwotLQkJCQkgIERDSEFSX1QgKnEgPSBlbmQ7Ci0tCi0tCQkJCSAgd2hpbGUgKHAgPiBwYWRfcHRyKQotLQkJCQkgICAgKi0tcSA9ICotLXA7Ci0tCQkJCSAgZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotLQkJCQkgICAgKnArKyA9ICcwJzsKLS0JCQkJfQotLSMgZW5kaWYKLS0JCQkgICAgICBlbHNlCi0tCQkJCXsKLS0JCQkJICAvKiBQYWQgd2l0aCBzcGFjZXMgb24gdGhlIGxlZnQuICAqLwotLQkJCQkgIERDSEFSX1QgKnEgPSBlbmQ7Ci0tCi0tCQkJCSAgd2hpbGUgKHAgPiBycCkKLS0JCQkJICAgICotLXEgPSAqLS1wOwotLQkJCQkgIGZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLS0JCQkJICAgICpwKysgPSAnICc7Ci0tCQkJCX0KLS0JCQkgICAgfQotLQkJCSAgfQotLQkJICAgICAgfQotLSNlbmRpZgotLQotLSNpZiBEQ0hBUl9JU19UQ0hBUiAmJiAhVVNFX1NOUFJJTlRGCi0tCQkgICAgaWYgKGNvdW50ID49IHRtcF9sZW5ndGgpCi0tCQkgICAgICAvKiB0bXBfbGVuZ3RoIHdhcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIC0gZml4IHRoZQotLQkJCSBjb2RlIGFib3ZlISAgKi8KLS0JCSAgICAgIGFib3J0ICgpOwotLSNlbmRpZgotLQotLQkJICAgIC8qIEhlcmUgc3RpbGwgY291bnQgPD0gYWxsb2NhdGVkIC0gbGVuZ3RoLiAgKi8KLS0KLS0jaWYgIURDSEFSX0lTX1RDSEFSIHx8IFVTRV9TTlBSSU5URgotLQkJICAgIC8qIFRoZSBzbnByaW50ZigpIHJlc3VsdCBkaWQgZml0LiAgKi8KLS0jZWxzZQotLQkJICAgIC8qIEFwcGVuZCB0aGUgc3ByaW50ZigpIHJlc3VsdC4gICovCi0tCQkgICAgbWVtY3B5IChyZXN1bHQgKyBsZW5ndGgsIHRtcCwgY291bnQgKiBzaXplb2YgKERDSEFSX1QpKTsKLS0jZW5kaWYKLS0jaWYgIVVTRV9TTlBSSU5URgotLQkJICAgIGlmICh0bXAgIT0gdG1wYnVmKQotLQkJICAgICAgZnJlZSAodG1wKTsKLS0jZW5kaWYKLS0KLS0jaWYgTkVFRF9QUklOVEZfRElSRUNUSVZFX0YKLS0JCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotLQkJICAgICAgewotLQkJCS8qIENvbnZlcnQgdGhlICVmIHJlc3VsdCB0byB1cHBlciBjYXNlIGZvciAlRi4gICovCi0tCQkJRENIQVJfVCAqcnAgPSByZXN1bHQgKyBsZW5ndGg7Ci0tCQkJc2l6ZV90IHJjOwotLQkJCWZvciAocmMgPSBjb3VudDsgcmMgPiAwOyByYy0tLCBycCsrKQotLQkJCSAgaWYgKCpycCA+PSAnYScgJiYgKnJwIDw9ICd6JykKLS0JCQkgICAgKnJwID0gKnJwIC0gJ2EnICsgJ0EnOwotLQkJICAgICAgfQotLSNlbmRpZgotLQotLQkJICAgIGxlbmd0aCArPSBjb3VudDsKLS0JCSAgICBicmVhazsKLS0JCSAgfQotLQkgICAgICB9Ci0tCSAgfQotLSAgICAgIH0KLS0KLS0gICAgLyogQWRkIHRoZSBmaW5hbCBOVUwuICAqLwotLSAgICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7Ci0tICAgIHJlc3VsdFtsZW5ndGhdID0gJ1wwJzsKLS0KLS0gICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYgJiYgbGVuZ3RoICsgMSA8IGFsbG9jYXRlZCkKLS0gICAgICB7Ci0tCS8qIFNocmluayB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpZiBwb3NzaWJsZS4gICovCi0tCURDSEFSX1QgKm1lbW9yeTsKLS0KLS0JbWVtb3J5ID0gKERDSEFSX1QgKikgcmVhbGxvYyAocmVzdWx0LCAobGVuZ3RoICsgMSkgKiBzaXplb2YgKERDSEFSX1QpKTsKLS0JaWYgKG1lbW9yeSAhPSBOVUxMKQotLQkgIHJlc3VsdCA9IG1lbW9yeTsKLS0gICAgICB9Ci0tCi0tICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0gICAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLSAgICBDTEVBTlVQICgpOwotLSAgICAqbGVuZ3RocCA9IGxlbmd0aDsKLS0gICAgLyogTm90ZSB0aGF0IHdlIGNhbiBwcm9kdWNlIGEgYmlnIHN0cmluZyBvZiBhIGxlbmd0aCA+IElOVF9NQVguICBQT1NJWAotLSAgICAgICBzYXlzIHRoYXQgc25wcmludGYoKSBmYWlscyB3aXRoIGVycm5vID0gRU9WRVJGTE9XIGluIHRoaXMgY2FzZSwgYnV0Ci0tICAgICAgIHRoYXQncyBvbmx5IGJlY2F1c2Ugc25wcmludGYoKSByZXR1cm5zIGFuICdpbnQnLiAgVGhpcyBmdW5jdGlvbiBkb2VzCi0tICAgICAgIG5vdCBoYXZlIHRoaXMgbGltaXRhdGlvbi4gICovCi0tICAgIHJldHVybiByZXN1bHQ7Ci0tCi0tICBvdmVyZmxvdzoKLS0gICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0tICAgICAgZnJlZSAocmVzdWx0KTsKLS0gICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotLSAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0tICAgIENMRUFOVVAgKCk7Ci0tICAgIGVycm5vID0gRU9WRVJGTE9XOwotLSAgICByZXR1cm4gTlVMTDsKLS0KLS0gIG91dF9vZl9tZW1vcnk6Ci0tICAgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0tICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLS0gICAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotLSAgb3V0X29mX21lbW9yeV8xOgotLSAgICBDTEVBTlVQICgpOwotLSAgICBlcnJubyA9IEVOT01FTTsKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICB9Ci0tfQotLQotLSN1bmRlZiBUQ0hBUlNfUEVSX0RDSEFSCi0tI3VuZGVmIFNOUFJJTlRGCi0tI3VuZGVmIFVTRV9TTlBSSU5URgotLSN1bmRlZiBEQ0hBUl9DUFkKLS0jdW5kZWYgUFJJTlRGX1BBUlNFCi0tI3VuZGVmIERJUkVDVElWRVMKLS0jdW5kZWYgRElSRUNUSVZFCi0tI3VuZGVmIERDSEFSX0lTX1RDSEFSCi0tI3VuZGVmIFRDSEFSX1QKLS0jdW5kZWYgRENIQVJfVAotLSN1bmRlZiBGQ0hBUl9UCi0tI3VuZGVmIFZBU05QUklOVEYKLS0tLSBhL2ludGwvdmFzbnByaW50Zi5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw3OCArMCwwIEBACi0tLyogdnNwcmludGYgd2l0aCBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCi0tICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZuZGVmIF9WQVNOUFJJTlRGX0gKLS0jZGVmaW5lIF9WQVNOUFJJTlRGX0gKLS0KLS0vKiBHZXQgdmFfbGlzdC4gICovCi0tI2luY2x1ZGUgPHN0ZGFyZy5oPgotLQotLS8qIEdldCBzaXplX3QuICAqLwotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0KLS0jaWZuZGVmIF9fYXR0cmlidXRlX18KLS0vKiBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGluIGdjYyB2ZXJzaW9ucyAyLjUgYW5kIGxhdGVyLiAgKi8KLS0jIGlmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDUpIHx8IF9fU1RSSUNUX0FOU0lfXwotLSMgIGRlZmluZSBfX2F0dHJpYnV0ZV9fKFNwZWMpIC8qIGVtcHR5ICovCi0tIyBlbmRpZgotLS8qIFRoZSBfXy1wcm90ZWN0ZWQgdmFyaWFudHMgb2YgYGZvcm1hdCcgYW5kIGBwcmludGYnIGF0dHJpYnV0ZXMKLS0gICBhcmUgYWNjZXB0ZWQgYnkgZ2NjIHZlcnNpb25zIDIuNi40IChlZmZlY3RpdmVseSAyLjcpIGFuZCBsYXRlci4gICovCi0tIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KQotLSMgIGRlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAotLSMgIGRlZmluZSBfX3ByaW50Zl9fIHByaW50ZgotLSMgZW5kaWYKLS0jZW5kaWYKLS0KLS0jaWZkZWYgX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jZW5kaWYKLS0KLS0vKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgotLSAgIFlvdSBjYW4gcGFzcyBhIHByZWFsbG9jYXRlZCBidWZmZXIgZm9yIHRoZSByZXN1bHQgaW4gUkVTVUxUQlVGIGFuZCBpdHMKLS0gICBzaXplIGluICpMRU5HVEhQOyBvdGhlcndpc2UgeW91IHBhc3MgUkVTVUxUQlVGID0gTlVMTC4KLS0gICBJZiBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyAodGhpcyBtYXkgYmUgPSBSRVNVTFRCVUYKLS0gICBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHdhcyBuZWNlc3NhcnkpIGFuZCBzZXQgKkxFTkdUSFAgdG8gdGhlCi0tICAgbnVtYmVyIG9mIHJlc3VsdGluZyBieXRlcywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICBVcG9uIGVycm9yLCBzZXQKLS0gICBlcnJubyBhbmQgcmV0dXJuIE5VTEwuCi0tCi0tICAgV2hlbiBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIG9jY3VycywgdGhlIHByZWFsbG9jYXRlZCBidWZmZXIgaXMgbGVmdAotLSAgIGFsb25lICh3aXRoIHBvc3NpYmx5IG1vZGlmaWVkIGNvbnRlbnRzKS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlCi0tICAgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBvciBzdGFjay1hbGxvY2F0ZWQgYnVmZmVyLCBsaWtlIHRoaXM6Ci0tCi0tICAgICAgICAgIGNoYXIgYnVmWzEwMF07Ci0tICAgICAgICAgIHNpemVfdCBsZW4gPSBzaXplb2YgKGJ1Zik7Ci0tICAgICAgICAgIGNoYXIgKm91dHB1dCA9IHZhc25wcmludGYgKGJ1ZiwgJmxlbiwgZm9ybWF0LCBhcmdzKTsKLS0gICAgICAgICAgaWYgKG91dHB1dCA9PSBOVUxMKQotLSAgICAgICAgICAgIC4uLiBlcnJvciBoYW5kbGluZyAuLi47Ci0tICAgICAgICAgIGVsc2UKLS0gICAgICAgICAgICB7Ci0tICAgICAgICAgICAgICAuLi4gdXNlIHRoZSBvdXRwdXQgc3RyaW5nIC4uLjsKLS0gICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gYnVmKQotLSAgICAgICAgICAgICAgICBmcmVlIChvdXRwdXQpOwotLSAgICAgICAgICAgIH0KLS0gICovCi0tZXh0ZXJuIGNoYXIgKiBhc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLS0gICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7Ci0tZXh0ZXJuIGNoYXIgKiB2YXNucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0tICAgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOwotLQotLSNpZmRlZiBfX2NwbHVzcGx1cwotLX0KLS0jZW5kaWYKLS0KLS0jZW5kaWYgLyogX1ZBU05QUklOVEZfSCAqLwotLS0tIGEvaW50bC92YXNud3ByaW50Zi5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw0NiArMCwwIEBACi0tLyogdnN3cHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgotLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmbmRlZiBfVkFTTldQUklOVEZfSAotLSNkZWZpbmUgX1ZBU05XUFJJTlRGX0gKLS0KLS0vKiBHZXQgdmFfbGlzdC4gICovCi0tI2luY2x1ZGUgPHN0ZGFyZy5oPgotLQotLS8qIEdldCB3Y2hhcl90LCBzaXplX3QuICAqLwotLSNpbmNsdWRlIDxzdGRkZWYuaD4KLS0KLS0jaWZkZWYJX19jcGx1c3BsdXMKLS1leHRlcm4gIkMiIHsKLS0jZW5kaWYKLS0KLS0vKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgotLSAgIFlvdSBjYW4gcGFzcyBhIHByZWFsbG9jYXRlZCBidWZmZXIgZm9yIHRoZSByZXN1bHQgaW4gUkVTVUxUQlVGIGFuZCBpdHMKLS0gICBzaXplIGluICpMRU5HVEhQOyBvdGhlcndpc2UgeW91IHBhc3MgUkVTVUxUQlVGID0gTlVMTC4KLS0gICBJZiBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyAodGhpcyBtYXkgYmUgPSBSRVNVTFRCVUYKLS0gICBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHdhcyBuZWNlc3NhcnkpIGFuZCBzZXQgKkxFTkdUSFAgdG8gdGhlCi0tICAgbnVtYmVyIG9mIHJlc3VsdGluZyBieXRlcywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICBVcG9uIGVycm9yLCBzZXQKLS0gICBlcnJubyBhbmQgcmV0dXJuIE5VTEwuICAqLwotLWV4dGVybiB3Y2hhcl90ICogYXNud3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKTsKLS1leHRlcm4gd2NoYXJfdCAqIHZhc253cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOwotLQotLSNpZmRlZglfX2NwbHVzcGx1cwotLX0KLS0jZW5kaWYKLS0KLS0jZW5kaWYgLyogX1ZBU05XUFJJTlRGX0ggKi8KLS0tLSBhL2ludGwvdmVyc2lvbi5jCi0rKysgL2Rldi9udWxsCi1AQCAtMSwyNiArMCwwIEBACi0tLyogbGliaW50bCBsaWJyYXJ5IHZlcnNpb24uCi0tICAgQ29weXJpZ2h0IChDKSAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0tICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLS0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0tICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0tCi0tICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLS0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0tICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotLSAgIFVTQS4gICovCi0tCi0tI2lmZGVmIEhBVkVfQ09ORklHX0gKLS0jIGluY2x1ZGUgPGNvbmZpZy5oPgotLSNlbmRpZgotLQotLSNpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0tCi0tLyogVmVyc2lvbiBudW1iZXI6IChtYWpvcjw8MTYpICsgKG1pbm9yPDw4KSArIHN1Ym1pbm9yICovCi0taW50IGxpYmludGxfdmVyc2lvbiA9IExJQklOVExfVkVSU0lPTjsKLS0tLSBhL2ludGwvd3ByaW50Zi1wYXJzZS5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSw3NSArMCwwIEBACi0tLyogUGFyc2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0tICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLS0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0tICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotLQotLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0tICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLS0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS0KLS0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0tICAgVVNBLiAgKi8KLS0KLS0jaWZuZGVmIF9XUFJJTlRGX1BBUlNFX0gKLS0jZGVmaW5lIF9XUFJJTlRGX1BBUlNFX0gKLS0KLS0jaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKLS0KLS0KLS0vKiBGbGFncyAqLwotLSNkZWZpbmUgRkxBR19HUk9VUAkgMQkvKiAnIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCi0tI2RlZmluZSBGTEFHX1NQQUNFCSA4CS8qIHNwYWNlIGZsYWcgKi8KLS0jZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLwotLSNkZWZpbmUgRkxBR19aRVJPCTMyCi0tCi0tLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCi0tI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKLS0KLS0vKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLwotLXR5cGVkZWYgc3RydWN0Ci0tewotLSAgY29uc3Qgd2NoYXJfdCogZGlyX3N0YXJ0OwotLSAgY29uc3Qgd2NoYXJfdCogZGlyX2VuZDsKLS0gIGludCBmbGFnczsKLS0gIGNvbnN0IHdjaGFyX3QqIHdpZHRoX3N0YXJ0OwotLSAgY29uc3Qgd2NoYXJfdCogd2lkdGhfZW5kOwotLSAgc2l6ZV90IHdpZHRoX2FyZ19pbmRleDsKLS0gIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9zdGFydDsKLS0gIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9lbmQ7Ci0tICBzaXplX3QgcHJlY2lzaW9uX2FyZ19pbmRleDsKLS0gIHdjaGFyX3QgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCi0tICBzaXplX3QgYXJnX2luZGV4OwotLX0KLS13Y2hhcl90X2RpcmVjdGl2ZTsKLS0KLS0vKiBBIHBhcnNlZCBmb3JtYXQgc3RyaW5nLiAgKi8KLS10eXBlZGVmIHN0cnVjdAotLXsKLS0gIHNpemVfdCBjb3VudDsKLS0gIHdjaGFyX3RfZGlyZWN0aXZlICpkaXI7Ci0tICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKLS0gIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKLS19Ci0td2NoYXJfdF9kaXJlY3RpdmVzOwotLQotLQotLS8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKLS0gICBpbiBkaXJlY3RpdmVzWzBdLCAuLi4sIGRpcmVjdGl2ZXNbTi0xXSwgYW5kIHNldHMgZGlyZWN0aXZlc1tOXS5kaXJfc3RhcnQKLS0gICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQotLSAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLwotLSNpZmRlZiBTVEFUSUMKLS1TVEFUSUMKLS0jZWxzZQotLWV4dGVybgotLSNlbmRpZgotLWludCB3cHJpbnRmX3BhcnNlIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHdjaGFyX3RfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKLS0KLS0jZW5kaWYgLyogX1dQUklOVEZfUEFSU0VfSCAqLwotLS0tIGEvaW50bC94c2l6ZS5oCi0rKysgL2Rldi9udWxsCi1AQCAtMSwxMDkgKzAsMCBAQAotLS8qIHhzaXplLmggLS0gQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLgotLQotLSAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0KLS0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLS0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0tICAgYW55IGxhdGVyIHZlcnNpb24uCi0tCi0tICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0tICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLQotLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0tICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLS0gICBVU0EuICAqLwotLQotLSNpZm5kZWYgX1hTSVpFX0gKLS0jZGVmaW5lIF9YU0laRV9ICi0tCi0tLyogR2V0IHNpemVfdC4gICovCi0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLQotLS8qIEdldCBTSVpFX01BWC4gICovCi0tI2luY2x1ZGUgPGxpbWl0cy5oPgotLSNpZiBIQVZFX1NURElOVF9ICi0tIyBpbmNsdWRlIDxzdGRpbnQuaD4KLS0jZW5kaWYKLS0KLS0vKiBUaGUgc2l6ZSBvZiBtZW1vcnkgb2JqZWN0cyBpcyBvZnRlbiBjb21wdXRlZCB0aHJvdWdoIGV4cHJlc3Npb25zIG9mCi0tICAgdHlwZSBzaXplX3QuIEV4YW1wbGU6Ci0tICAgICAgdm9pZCogcCA9IG1hbGxvYyAoaGVhZGVyX3NpemUgKyBuICogZWxlbWVudF9zaXplKS4KLS0gICBUaGVzZSBjb21wdXRhdGlvbnMgY2FuIGxlYWQgdG8gb3ZlcmZsb3cuICBXaGVuIHRoaXMgaGFwcGVucywgbWFsbG9jKCkKLS0gICByZXR1cm5zIGEgcGllY2Ugb2YgbWVtb3J5IHRoYXQgaXMgd2F5IHRvbyBzbWFsbCwgYW5kIHRoZSBwcm9ncmFtIHRoZW4KLS0gICBjcmFzaGVzIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCB0aGUgbWVtb3J5LgotLSAgIFRvIGF2b2lkIHRoaXMsIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3JvcyBpbiB0aGlzIGZpbGUgY2hlY2sgZm9yIG92ZXJmbG93LgotLSAgIFRoZSBjb252ZW50aW9uIGlzIHRoYXQgU0laRV9NQVggcmVwcmVzZW50cyBvdmVyZmxvdy4KLS0gICBtYWxsb2MgKFNJWkVfTUFYKSBpcyBub3QgZ3VhcmFudGVlZCB0byBmYWlsIC0tIHRoaW5rIG9mIGEgbWFsbG9jCi0tICAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIG1tYXAgLS0sIGl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIHNpemVfb3ZlcmZsb3dfcCgpCi0tICAgb3Igc2l6ZV9pbl9ib3VuZHNfcCgpIGJlZm9yZSBpbnZva2luZyBtYWxsb2MoKS4KLS0gICBUaGUgZXhhbXBsZSB0aHVzIGJlY29tZXM6Ci0tICAgICAgc2l6ZV90IHNpemUgPSB4c3VtIChoZWFkZXJfc2l6ZSwgeHRpbWVzIChuLCBlbGVtZW50X3NpemUpKTsKLS0gICAgICB2b2lkICpwID0gKHNpemVfaW5fYm91bmRzX3AgKHNpemUpID8gbWFsbG9jIChzaXplKSA6IE5VTEwpOwotLSovCi0tCi0tLyogQ29udmVydCBhbiBhcmJpdHJhcnkgdmFsdWUgPj0gMCB0byB0eXBlIHNpemVfdC4gICovCi0tI2RlZmluZSB4Y2FzdF9zaXplX3QoTikgXAotLSAgKChOKSA8PSBTSVpFX01BWCA/IChzaXplX3QpIChOKSA6IFNJWkVfTUFYKQotLQotLS8qIFN1bSBvZiB0d28gc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLwotLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci0tI2lmIF9fR05VQ19fID49IDMKLS1fX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQotLSNlbmRpZgotLXhzdW0gKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyKQotLXsKLS0gIHNpemVfdCBzdW0gPSBzaXplMSArIHNpemUyOwotLSAgcmV0dXJuIChzdW0gPj0gc2l6ZTEgPyBzdW0gOiBTSVpFX01BWCk7Ci0tfQotLQotLS8qIFN1bSBvZiB0aHJlZSBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi0tc3RhdGljIGlubGluZSBzaXplX3QKLS0jaWYgX19HTlVDX18gPj0gMwotLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0tI2VuZGlmCi0teHN1bTMgKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyLCBzaXplX3Qgc2l6ZTMpCi0tewotLSAgcmV0dXJuIHhzdW0gKHhzdW0gKHNpemUxLCBzaXplMiksIHNpemUzKTsKLS19Ci0tCi0tLyogU3VtIG9mIGZvdXIgc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLwotLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci0tI2lmIF9fR05VQ19fID49IDMKLS1fX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQotLSNlbmRpZgotLXhzdW00IChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMiwgc2l6ZV90IHNpemUzLCBzaXplX3Qgc2l6ZTQpCi0tewotLSAgcmV0dXJuIHhzdW0gKHhzdW0gKHhzdW0gKHNpemUxLCBzaXplMiksIHNpemUzKSwgc2l6ZTQpOwotLX0KLS0KLS0vKiBNYXhpbXVtIG9mIHR3byBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi0tc3RhdGljIGlubGluZSBzaXplX3QKLS0jaWYgX19HTlVDX18gPj0gMwotLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0tI2VuZGlmCi0teG1heCAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpCi0tewotLSAgLyogTm8gZXhwbGljaXQgY2hlY2sgaXMgbmVlZGVkIGhlcmUsIGJlY2F1c2UgZm9yIGFueSBuOgotLSAgICAgbWF4IChTSVpFX01BWCwgbikgPT0gU0laRV9NQVggYW5kIG1heCAobiwgU0laRV9NQVgpID09IFNJWkVfTUFYLiAgKi8KLS0gIHJldHVybiAoc2l6ZTEgPj0gc2l6ZTIgPyBzaXplMSA6IHNpemUyKTsKLS19Ci0tCi0tLyogTXVsdGlwbGljYXRpb24gb2YgYSBjb3VudCB3aXRoIGFuIGVsZW1lbnQgc2l6ZSwgd2l0aCBvdmVyZmxvdyBjaGVjay4KLS0gICBUaGUgY291bnQgbXVzdCBiZSA+PSAwIGFuZCB0aGUgZWxlbWVudCBzaXplIG11c3QgYmUgPiAwLgotLSAgIFRoaXMgaXMgYSBtYWNybywgbm90IGFuIGlubGluZSBmdW5jdGlvbiwgc28gdGhhdCBpdCB3b3JrcyBjb3JyZWN0bHkgZXZlbgotLSAgIHdoZW4gTiBpcyBvZiBhIHdpZGVyIHR1cGUgYW5kIE4gPiBTSVpFX01BWC4gICovCi0tI2RlZmluZSB4dGltZXMoTiwgRUxTSVpFKSBcCi0tICAoKE4pIDw9IFNJWkVfTUFYIC8gKEVMU0laRSkgPyAoc2l6ZV90KSAoTikgKiAoRUxTSVpFKSA6IFNJWkVfTUFYKQotLQotLS8qIENoZWNrIGZvciBvdmVyZmxvdy4gICovCi0tI2RlZmluZSBzaXplX292ZXJmbG93X3AoU0laRSkgXAotLSAgKChTSVpFKSA9PSBTSVpFX01BWCkKLS0vKiBDaGVjayBhZ2FpbnN0IG92ZXJmbG93LiAgKi8KLS0jZGVmaW5lIHNpemVfaW5fYm91bmRzX3AoU0laRSkgXAotLSAgKChTSVpFKSAhPSBTSVpFX01BWCkKLS0KLS0jZW5kaWYgLyogX1hTSVpFX0ggKi8KLS0tLSBhL200L2ludGxtYWNvc3gubTQKLSsrKyBiL200L2ludGxtYWNvc3gubTQKLUBAIC0xLDUwICsxLDcxIEBACi0tIyBpbnRsbWFjb3N4Lm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTcpCi0tZG5sIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotKyMgaW50bG1hY29zeC5tNCBzZXJpYWwgNiAoZ2V0dGV4dC0wLjIwKQotK2RubCBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCwgMjAxNiwgMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSBkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSBkbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSBkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotIGRubAotLWRubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCi0rZG5sIFRoaXMgZmlsZSBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgotIGRubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKLSBkbmwgZnVuY3Rpb25hbGl0eS4KLSBkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAotIGRubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKLS1kbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0rZG5sIGdldHRleHQgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSBkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCi0gCi0tZG5sIENoZWNrcyBmb3Igc3BlY2lhbCBvcHRpb25zIG5lZWRlZCBvbiBNYWNPUyBYLgotK2RubCBDaGVja3MgZm9yIHNwZWNpYWwgb3B0aW9ucyBuZWVkZWQgb24gTWFjIE9TIFguCi0gZG5sIERlZmluZXMgSU5UTF9NQUNPU1hfTElCUy4KLSBBQ19ERUZVTihbZ3RfSU5UTF9NQUNPU1hdLAotIFsKLS0gIGRubCBDaGVjayBmb3IgQVBJIGludHJvZHVjZWQgaW4gTWFjT1MgWCAxMC4yLgotKyAgZG5sIENoZWNrIGZvciBBUEkgaW50cm9kdWNlZCBpbiBNYWMgT1MgWCAxMC40LgotICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlXSwKLS0gICAgZ3RfY3ZfZnVuY19DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlLAotKyAgICBbZ3RfY3ZfZnVuY19DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlXSwKLSAgICAgW2d0X3NhdmVfTElCUz0iJExJQlMiCi0gICAgICBMSUJTPSIkTElCUyAtV2wsLWZyYW1ld29yayAtV2wsQ29yZUZvdW5kYXRpb24iCi0tICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGUHJlZmVyZW5jZXMuaD5dLAotLSAgICAgICBbQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZShOVUxMLCBOVUxMKV0sCi0rICAgICBBQ19MSU5LX0lGRUxTRSgKLSsgICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKLSsgICAgICAgICAgW1sjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZQcmVmZXJlbmNlcy5oPl1dLAotKyAgICAgICAgICBbW0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoTlVMTCwgTlVMTCldXSldLAotICAgICAgICBbZ3RfY3ZfZnVuY19DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlPXllc10sCi0gICAgICAgIFtndF9jdl9mdW5jX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWU9bm9dKQotICAgICAgTElCUz0iJGd0X3NhdmVfTElCUyJdKQotICAgaWYgdGVzdCAkZ3RfY3ZfZnVuY19DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlID0geWVzOyB0aGVuCi0tICAgIEFDX0RFRklORShbSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFXSwgMSwKLS0gICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIE1hY09TIFggZnVuY3Rpb24gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSBpbiB0aGUgQ29yZUZvdW5kYXRpb24gZnJhbWV3b3JrLl0pCi0rICAgIEFDX0RFRklORShbSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFXSwgWzFdLAotKyAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgTWFjIE9TIFggZnVuY3Rpb24gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSBpbiB0aGUgQ29yZUZvdW5kYXRpb24gZnJhbWV3b3JrLl0pCi0gICBmaQotLSAgZG5sIENoZWNrIGZvciBBUEkgaW50cm9kdWNlZCBpbiBNYWNPUyBYIDEwLjMuCi0tICBBQ19DQUNIRV9DSEVDSyhbZm9yIENGTG9jYWxlQ29weUN1cnJlbnRdLCBndF9jdl9mdW5jX0NGTG9jYWxlQ29weUN1cnJlbnQsCi0rICBkbmwgQ2hlY2sgZm9yIEFQSSBpbnRyb2R1Y2VkIGluIE1hYyBPUyBYIDEwLjUuCi0rICBBQ19DQUNIRV9DSEVDSyhbZm9yIENGTG9jYWxlQ29weUN1cnJlbnRdLCBbZ3RfY3ZfZnVuY19DRkxvY2FsZUNvcHlDdXJyZW50XSwKLSAgICAgW2d0X3NhdmVfTElCUz0iJExJQlMiCi0gICAgICBMSUJTPSIkTElCUyAtV2wsLWZyYW1ld29yayAtV2wsQ29yZUZvdW5kYXRpb24iCi0tICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGTG9jYWxlLmg+XSwgW0NGTG9jYWxlQ29weUN1cnJlbnQoKTtdLAotKyAgICAgQUNfTElOS19JRkVMU0UoCi0rICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCi0rICAgICAgICAgIFtbI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGTG9jYWxlLmg+XV0sCi0rICAgICAgICAgIFtbQ0ZMb2NhbGVDb3B5Q3VycmVudCgpO11dKV0sCi0gICAgICAgIFtndF9jdl9mdW5jX0NGTG9jYWxlQ29weUN1cnJlbnQ9eWVzXSwKLSAgICAgICAgW2d0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5Q3VycmVudD1ub10pCi0gICAgICBMSUJTPSIkZ3Rfc2F2ZV9MSUJTIl0pCi0gICBpZiB0ZXN0ICRndF9jdl9mdW5jX0NGTG9jYWxlQ29weUN1cnJlbnQgPSB5ZXM7IHRoZW4KLS0gICAgQUNfREVGSU5FKFtIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlRdLCAxLAotLSAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgTWFjT1MgWCBmdW5jdGlvbiBDRkxvY2FsZUNvcHlDdXJyZW50IGluIHRoZSBDb3JlRm91bmRhdGlvbiBmcmFtZXdvcmsuXSkKLSsgICAgQUNfREVGSU5FKFtIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlRdLCBbMV0sCi0rICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWMgT1MgWCBmdW5jdGlvbiBDRkxvY2FsZUNvcHlDdXJyZW50IGluIHRoZSBDb3JlRm91bmRhdGlvbiBmcmFtZXdvcmsuXSkKLSsgIGZpCi0rICBBQ19DQUNIRV9DSEVDSyhbZm9yIENGTG9jYWxlQ29weVByZWZlcnJlZExhbmd1YWdlc10sIFtndF9jdl9mdW5jX0NGTG9jYWxlQ29weVByZWZlcnJlZExhbmd1YWdlc10sCi0rICAgIFtndF9zYXZlX0xJQlM9IiRMSUJTIgotKyAgICAgTElCUz0iJExJQlMgLVdsLC1mcmFtZXdvcmsgLVdsLENvcmVGb3VuZGF0aW9uIgotKyAgICAgQUNfTElOS19JRkVMU0UoCi0rICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCi0rICAgICAgICAgIFtbI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGTG9jYWxlLmg+XV0sCi0rICAgICAgICAgIFtbQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzKCk7XV0pXSwKLSsgICAgICAgW2d0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzPXllc10sCi0rICAgICAgIFtndF9jdl9mdW5jX0NGTG9jYWxlQ29weVByZWZlcnJlZExhbmd1YWdlcz1ub10pCi0rICAgICBMSUJTPSIkZ3Rfc2F2ZV9MSUJTIl0pCi0rICBpZiB0ZXN0ICRndF9jdl9mdW5jX0NGTG9jYWxlQ29weVByZWZlcnJlZExhbmd1YWdlcyA9IHllczsgdGhlbgotKyAgICBBQ19ERUZJTkUoW0hBVkVfQ0ZMT0NBTEVDT1BZUFJFRkVSUkVETEFOR1VBR0VTXSwgWzFdLAotKyAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgTWFjIE9TIFggZnVuY3Rpb24gQ0ZMb2NhbGVDb3B5UHJlZmVycmVkTGFuZ3VhZ2VzIGluIHRoZSBDb3JlRm91bmRhdGlvbiBmcmFtZXdvcmsuXSkKLSAgIGZpCi0gICBJTlRMX01BQ09TWF9MSUJTPQotLSAgaWYgdGVzdCAkZ3RfY3ZfZnVuY19DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlID0geWVzIHx8IHRlc3QgJGd0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5Q3VycmVudCA9IHllczsgdGhlbgotKyAgaWYgdGVzdCAkZ3RfY3ZfZnVuY19DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlID0geWVzIFwKLSsgICAgIHx8IHRlc3QgJGd0X2N2X2Z1bmNfQ0ZMb2NhbGVDb3B5Q3VycmVudCA9IHllcyBcCi0rICAgICB8fCB0ZXN0ICRndF9jdl9mdW5jX0NGTG9jYWxlQ29weVByZWZlcnJlZExhbmd1YWdlcyA9IHllczsgdGhlbgotICAgICBJTlRMX01BQ09TWF9MSUJTPSItV2wsLWZyYW1ld29yayAtV2wsQ29yZUZvdW5kYXRpb24iCi0gICBmaQotICAgQUNfU1VCU1QoW0lOVExfTUFDT1NYX0xJQlNdKQotLS0tIGEvcG8vQ2hhbmdlTG9nCi0rKysgYi9wby9DaGFuZ2VMb2cKLUBAIC0xLDMgKzEsMTEgQEAKLSsyMDE5LTEyLTA3ICBnZXR0ZXh0aXplICA8YnVnLWdudS1nZXR0ZXh0QGdudS5vcmc+Ci0rCi0rCSogZW5AYm9sZHF1b3QuaGVhZGVyOiBVcGdyYWRlIHRvIGdldHRleHQtMC4yMC4xLgotKwkqIGVuQHF1b3QuaGVhZGVyOiBVcGdyYWRlIHRvIGdldHRleHQtMC4yMC4xLgotKwkqIGluc2VydC1oZWFkZXIuc2luOiBVcGdyYWRlIHRvIGdldHRleHQtMC4yMC4xLgotKwkqIHJlbW92ZS1wb3RjZGF0ZS5zaW46IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjIwLjEuCi0rCSogUnVsZXMtcXVvdDogVXBncmFkZSB0byBnZXR0ZXh0LTAuMjAuMS4KLSsKLSAyMDA5LTA4LTExICBTY290dCBKYW1lcyBSZW1uYW50ICA8c2NvdHRAbmV0c3BsaXQuY29tPgotIAotIAkqIGxpYm5paC5wb3Q6IERpc3RyaWJ1dGUgdGhlIHBvdCBmaWxlCi0tLS0gYS9wby9SdWxlcy1xdW90Ci0rKysgYi9wby9SdWxlcy1xdW90Ci1AQCAtMSw0ICsxLDkgQEAKLSAjIFNwZWNpYWwgTWFrZWZpbGUgcnVsZXMgZm9yIEVuZ2xpc2ggbWVzc2FnZSBjYXRhbG9ncyB3aXRoIHF1b3RhdGlvbiBtYXJrcy4KLSsjCi0rIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSsjIFRoaXMgZmlsZSwgUnVsZXMtcXVvdCwgYW5kIGl0cyBhdXhpbGlhcnkgZmlsZXMgKGxpc3RlZCB1bmRlcgotKyMgRElTVEZJTEVTLmNvbW1vbi5leHRyYTEpIGFyZSBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0rIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGRpc3RyaWJ1dGUsIGFuZCBtb2RpZnkgdGhlbS4KLSAKLSBESVNURklMRVMuY29tbW9uLmV4dHJhMSA9IHF1b3Quc2VkIGJvbGRxdW90LnNlZCBlbkBxdW90LmhlYWRlciBlbkBib2xkcXVvdC5oZWFkZXIgaW5zZXJ0LWhlYWRlci5zaW4gUnVsZXMtcXVvdAotIAotQEAgLTE0LDEzICsxOSwyMyBAQCBlbkBib2xkcXVvdC5wby11cGRhdGU6IGVuQGJvbGRxdW90LnBvLXVwCi0gCi0gLmluc2VydC1oZWFkZXIucG8tdXBkYXRlLWVuOgotIAlAbGFuZz1gZWNobyAkQCB8IHNlZCAtZSAncy9cLnBvLXVwZGF0ZS1lbiQkLy8nYDsgXAotLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IEdFVFRFWFRMSUJESVI9YGNkICQodG9wX3NyY2Rpcikvc3JjICYmIHB3ZGA7IGV4cG9ydCBHRVRURVhUTElCRElSOyBmaTsgXAotKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiAmJiB0ZXN0ICIkKENST1NTX0NPTVBJTElORykiICE9ICJ5ZXMiOyB0aGVuIFBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgR0VUVEVYVExJQkRJUj1gY2QgJCh0b3Bfc3JjZGlyKS9zcmMgJiYgcHdkYDsgZXhwb3J0IEdFVFRFWFRMSUJESVI7IGZpOyBcCi0gCXRtcGRpcj1gcHdkYDsgXAotIAllY2hvICIkJGxhbmc6IjsgXAotIAlsbD1gZWNobyAkJGxhbmcgfCBzZWQgLWUgJ3MvQC4qLy8nYDsgXAotIAlMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgXAotIAljZCAkKHNyY2Rpcik7IFwKLS0JaWYgJChNU0dJTklUKSAtaSAkKERPTUFJTikucG90IC0tbm8tdHJhbnNsYXRvciAtbCAkJGxsIC1vIC0gMj4vZGV2L251bGwgfCBzZWQgLWYgJCR0bXBkaXIvJCRsYW5nLmluc2VydC1oZWFkZXIgfCAkKE1TR0NPTlYpIC10IFVURi04IHwgJChNU0dGSUxURVIpIHNlZCAtZiBgZWNobyAkJGxhbmcgfCBzZWQgLWUgJ3MvLipALy8nYC5zZWQgMj4vZGV2L251bGwgPiAkJHRtcGRpci8kJGxhbmcubmV3LnBvOyB0aGVuIFwKLSsJaWYgJChNU0dJTklUKSAkKE1TR0lOSVRfT1BUSU9OUykgLWkgJChET01BSU4pLnBvdCAtLW5vLXRyYW5zbGF0b3IgLWwgJCRsYW5nIC1vIC0gMj4vZGV2L251bGwgXAotKwkgICB8ICQoU0VEKSAtZiAkJHRtcGRpci8kJGxhbmcuaW5zZXJ0LWhlYWRlciB8ICQoTVNHQ09OVikgLXQgVVRGLTggfCBcCi0rCSAgIHsgY2FzZSBgJChNU0dGSUxURVIpIC0tdmVyc2lvbiB8IHNlZCAxcSB8IHNlZCAtZSAncyxeW14wLTldKiwsJ2AgaW4gXAotKwkgICAgICcnIHwgMC5bMC05XSB8IDAuWzAtOV0uKiB8IDAuMVswLThdIHwgMC4xWzAtOF0uKikgXAotKwkgICAgICAgJChNU0dGSUxURVIpICQoU0VEKSAtZiBgZWNobyAkJGxhbmcgfCBzZWQgLWUgJ3MvLipALy8nYC5zZWQgXAotKwkgICAgICAgOzsgXAotKwkgICAgICopIFwKLSsJICAgICAgICQoTVNHRklMVEVSKSBgZWNobyAkJGxhbmcgfCBzZWQgLWUgJ3MvLipALy8nYCBcCi0rCSAgICAgICA7OyBcCi0rCSAgICAgZXNhYyB9IDI+L2Rldi9udWxsID4gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbyBcCi0rCSAgICAgOyB0aGVuIFwKLSAJICBpZiBjbXAgJCRsYW5nLnBvICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLSAJICAgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKLSAJICBlbHNlIFwKLS0tLSBhL3BvL2VuQGJvbGRxdW90LmhlYWRlcgotKysrIGIvcG8vZW5AYm9sZHF1b3QuaGVhZGVyCi1AQCAtMiw3ICsyLDcgQEAKLSAjIFRoZSBtc2dpZHMgbXVzdCBiZSBBU0NJSSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBjb250YWluIHJlYWwgcXVvdGF0aW9uCi0gIyBjaGFyYWN0ZXJzLCBvbmx5IHN1YnN0aXR1dGVzIGxpa2UgZ3JhdmUgYWNjZW50ICgweDYwKSwgYXBvc3Ryb3BoZSAoMHgyNykKLSAjIGFuZCBkb3VibGUgcXVvdGUgKDB4MjIpLiBUaGVzZSBzdWJzdGl0dXRlcyBsb29rIHN0cmFuZ2U7IHNlZQotLSMgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAotKyMgaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3MvcXVvdGVzLmh0bWwKLSAjCi0gIyBUaGlzIGNhdGFsb2cgdHJhbnNsYXRlcyBncmF2ZSBhY2NlbnQgKDB4NjApIGFuZCBhcG9zdHJvcGhlICgweDI3KSB0bwotICMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KS4KLS0tLSBhL3BvL2VuQHF1b3QuaGVhZGVyCi0rKysgYi9wby9lbkBxdW90LmhlYWRlcgotQEAgLTIsNyArMiw3IEBACi0gIyBUaGUgbXNnaWRzIG11c3QgYmUgQVNDSUkgYW5kIHRoZXJlZm9yZSBjYW5ub3QgY29udGFpbiByZWFsIHF1b3RhdGlvbgotICMgY2hhcmFjdGVycywgb25seSBzdWJzdGl0dXRlcyBsaWtlIGdyYXZlIGFjY2VudCAoMHg2MCksIGFwb3N0cm9waGUgKDB4MjcpCi0gIyBhbmQgZG91YmxlIHF1b3RlICgweDIyKS4gVGhlc2Ugc3Vic3RpdHV0ZXMgbG9vayBzdHJhbmdlOyBzZWUKLS0jIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3MvcXVvdGVzLmh0bWwKLSsjIGh0dHBzOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3F1b3Rlcy5odG1sCi0gIwotICMgVGhpcyBjYXRhbG9nIHRyYW5zbGF0ZXMgZ3JhdmUgYWNjZW50ICgweDYwKSBhbmQgYXBvc3Ryb3BoZSAoMHgyNykgdG8KLSAjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkuCi0tLS0gYS9wby9pbnNlcnQtaGVhZGVyLnNpbgotKysrIGIvcG8vaW5zZXJ0LWhlYWRlci5zaW4KLUBAIC0xLDUgKzEsMTAgQEAKLSAjIFNlZCBzY3JpcHQgdGhhdCBpbnNlcnRzIHRoZSBmaWxlIGNhbGxlZCBIRUFERVIgYmVmb3JlIHRoZSBoZWFkZXIgZW50cnkuCi0gIwotKyMgQ29weXJpZ2h0IChDKSAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotKyMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDEuCi0rIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcwotKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBkaXN0cmlidXRlLCBhbmQgbW9kaWZ5IGl0LgotKyMKLSAjIEF0IGVhY2ggb2NjdXJyZW5jZSBvZiBhIGxpbmUgc3RhcnRpbmcgd2l0aCAibXNnaWQgIiwgd2UgZXhlY3V0ZSB0aGUgZm9sbG93aW5nCi0gIyBjb21tYW5kcy4gQXQgdGhlIGZpcnN0IG9jY3VycmVuY2UsIGluc2VydCB0aGUgZmlsZS4gQXQgdGhlIGZvbGxvd2luZwotICMgb2NjdXJyZW5jZXMsIGRvIG5vdGhpbmcuIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgdGhlIGZvbGxvd2luZwotLS0tIGEvcG8vcmVtb3ZlLXBvdGNkYXRlLnNpbgotKysrIGIvcG8vcmVtb3ZlLXBvdGNkYXRlLnNpbgotQEAgLTEsNiArMSwxMiBAQAotLSMgU2VkIHNjcmlwdCB0aGF0IHJlbW92ZSB0aGUgUE9ULUNyZWF0aW9uLURhdGUgbGluZSBpbiB0aGUgaGVhZGVyIGVudHJ5Ci0rIyBTZWQgc2NyaXB0IHRoYXQgcmVtb3ZlcyB0aGUgUE9ULUNyZWF0aW9uLURhdGUgbGluZSBpbiB0aGUgaGVhZGVyIGVudHJ5Ci0gIyBmcm9tIGEgUE9UIGZpbGUuCi0gIwotKyMgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotKyMgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLSsjIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAotKyMgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsCi0rIyB3aXRob3V0IGFueSB3YXJyYW50eS4KLSsjCi0gIyBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBmb2xsb3dpbmcgb2NjdXJyZW5jZXMgb2YgdGhlCi0gIyBwYXR0ZXJuIGlzIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIGhvbGQgc3BhY2UuCi0gL14iUE9ULUNyZWF0aW9uLURhdGU6IC4qIiQvewpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibmloL2xpYm5paC0xLjAuMy8wMDAxLXNpZ25hbC5jLVNJR0NMRC1hbmQtU0lHQ0hJTEQtYXJlLXNhbWUtb24tc3l0ZW0tVi1zeXMucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zLzAwMDEtc2lnbmFsLmMtU0lHQ0xELWFuZC1TSUdDSElMRC1hcmUtc2FtZS1vbi1zeXRlbS1WLXN5cy5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzYjRiMS4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zLzAwMDEtc2lnbmFsLmMtU0lHQ0xELWFuZC1TSUdDSElMRC1hcmUtc2FtZS1vbi1zeXRlbS1WLXN5cy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUZyb20gZjFiOTk5MmNhZjk5MTBmOWY3YWZhZTQwMTA0NWU0MjU3MmNjODRmZiBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci1EYXRlOiBTYXQsIDEgQXByIDIwMTcgMDg6NTA6MzUgLTA3MDAKLVN1YmplY3Q6IFtQQVRDSF0gc2lnbmFsLmM6IFNJR0NMRCBhbmQgU0lHQ0hJTEQgYXJlIHNhbWUgb24gc3l0ZW0gViBzeXN0ZW1zCi0KLU11c2wgZHJvcHMgdGhlIFNJR0NMRCBsZWdhY3kKLQotU2lnbmVkLW9mZi1ieTogS2hlbSBSYWogPHJhai5raGVtQGdtYWlsLmNvbT4KLS0tLQotIG5paC9zaWduYWwuYyB8IDIgKy0KLSAxIGZpbGUgY2hhbmdlZCwgMSBpbnNlcnRpb24oKyksIDEgZGVsZXRpb24oLSkKLQotZGlmZiAtLWdpdCBhL25paC9zaWduYWwuYyBiL25paC9zaWduYWwuYwotaW5kZXggYTI0MWRmOS4uNjkxYzhlNiAxMDA2NDQKLS0tLSBhL25paC9zaWduYWwuYwotKysrIGIvbmloL3NpZ25hbC5jCi1AQCAtODcsNyArODcsNyBAQCBzdGF0aWMgY29uc3QgU2lnbmFsTmFtZSBzaWduYWxfbmFtZXNbXSA9IHsKLSAJeyBTSUdTVEtGTFQsICJTVEtGTFQiIH0sCi0gI2VuZGlmCi0gCXsgU0lHQ0hMRCwgICAiQ0hMRCIgICB9LAotLQl7IFNJR0NMRCwgICAgIkNMRCIgICAgfSwKLSsJeyBTSUdDSExELCAgICAiQ0xEIiAgIH0sCi0gCXsgU0lHQ09OVCwgICAiQ09OVCIgICB9LAotIAl7IFNJR1NUT1AsICAgIlNUT1AiICAgfSwKLSAJeyBTSUdUU1RQLCAgICJUU1RQIiAgIH0sCi0tLSAKLTIuMTIuMQotCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zL2xpYm5paF8xLjAuMy00dWJ1bnR1MTYucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloLTEuMC4zL2xpYm5paF8xLjAuMy00dWJ1bnR1MTYucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTI1YzguLjAwMDAwMDAKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibmloL2xpYm5paC0xLjAuMy9saWJuaWhfMS4wLjMtNHVidW50dTE2LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMzU5MyArMCwwIEBACi0tLS0gbGlibmloLTEuMC4zLm9yaWcvQ2hhbmdlTG9nCi0rKysgbGlibmloLTEuMC4zL0NoYW5nZUxvZwotQEAgLTEsMyArMSw4NCBAQAotKzIwMTMtMDMtMTMgIFN0ZXZlIExhbmdhc2VrICA8c3RldmUubGFuZ2FzZWtAdWJ1bnR1LmNvbT4KLSsKLSsJKiBuaWgvd2F0Y2guYyAobmloX3dhdGNoX3dhbGtfZmlsdGVyKTogTmV3IE5paEZpbGVGaWx0ZXIgZnVuY3Rpb24KLSsJcGFzc2VkIHRvIG5paF9kaXJfd2Fsa19zY2FuKCkgdG8gZW5zdXJlIHRoZSBuaWhfd2F0Y2hfbmV3KCkgZmlsdGVyCi0rCWZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgTmloV2F0Y2ggZGF0YSByYXRoZXIgdGhhbiB0aGUgZGF0YSBwYXNzZWQgdG8KLSsJdGhlIG5paF9kaXJfd2FsaygpIE5paEZpbGVWaXNpdG9yIGZ1bmN0aW9uIChMUDogIzc3NjUzMikuCi0rCi0rCSogbmloL3Rlc3RzL3Rlc3Rfd2F0Y2guYyAodGVzdF9uZXcpOiBOZXcgdGVzdCAid2l0aCBmaWx0ZXIgYW5kIGRhdGEiCi0rCXRvIGVuc3VyZSBmaWx0ZXIgaXMgcGFzc2VkIGNvcnJlY3QgdmFsdWUuCi0rCi0rMjAxMy0wMi0yOCAgSmFtZXMgSHVudCAgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4KLSsKLSsJKiBSZW1vdmFsIG9mIGdjYyAnbWFsbG9jJyBmdW5jdGlvbiBhdHRyaWJ1dGUgcmVzdWx0aW5nIGZyb20KLSsJICBhIGNsYXJpZmljYXRpb24gaW4gaXRzIGRlc2NyaXB0aW9uIHdoaWNoIG1ha2VzIGl0cyB1c2UgaW52YWxpZC4KLSsJICAoTFA6ICMxMTIzNTg4KS4KLSsKLSsyMDEzLTAyLTA1ICBKYW1lcyBIdW50ICA8amFtZXMuaHVudEB1YnVudHUuY29tPgotKwotKwkqIG5paC9sb2dnaW5nLmM6IG5paF9sb2dfYWJvcnRfbWVzc2FnZSgpOiBSZW1vdmUgZXJyb25lb3VzIGNoZWNrCi0rCSAgbGVmdCBvdmVyIGZyb20gdXNlIG9mIF9fYWJvcnRfbXNnIHdlYWsgc3ltYm9sLgotKwkqIG5paC90ZXN0cy90ZXN0X2xvZ2dpbmcuYzogUmVtb3ZlIHVuZWNlc3NhcnkgY2hlY2sgb24gd2hldGhlcgotKwkgIF9fbmloX2Fib3J0X21zZyBoYXMgYW4gYWRkcmVzcy4KLSsKLSsyMDEyLTEyLTEzICBTdMOpcGhhbmUgR3JhYmVyICA8c3RncmFiZXJAdWJ1bnR1LmNvbT4KLSsKLSsJKiBuaWgtZGJ1cy10b29sL3R5cGUuYywgbmloLWRidXMtdG9vbC9tYXJzaGFsLmM6IFVwZGF0ZSBkYnVzIGNvZGUKLSsJZ2VuZXJhdG9yIHRvIGFsbG93IGZvciBlbXB0eSBsaXN0cyBmb3IgdHlwZSAnYXMnLiAgVGhpcyBkcm9wcyB0aGUKLSsJIT0gTlVMTCBjaGVjayBmb3IgTlVMTCB0ZXJtaW5hdGVkIGFycmF5cyBhbmQgbW92ZXMgdGhlIGl0ZXJhdGlvbgotKwlsb29wIGluc2lkZSBhbiAnaWYnIHN0YXRlbWVudC4KLSsKLSsyMDEyLTEyLTExICBEbWl0cmlqcyBMZWRrb3ZzICA8ZG1pdHJpanMubGVka292c0BjYW5vbmljYWwuY29tPgotKwotKwkqIG5paC9maWxlLmMgKG5paF9kaXJfd2Fsa19zY2FuKTogRmFsbGJhY2sgdG8gbHN0YXQsIGlmIHRoZQotKwlub24tcG9ydGFibGUgZGlyZW50LmRfdHlwZSBpcyBub3QgYXZhaWxhYmxlIChMUDogIzY3MjY0MykgKENsb3NlczoKLSsJIzY5NTYwNCkuCi0rCi0rMjAxMi0xMi0xMCAgUGV0ciBMYXV0cmJhY2ggIDxwbGF1dHJiYUByZWRoYXQuY29tPgotKwotKwkqIG5paC90ZXN0cy90ZXN0X2ZpbGUuYzogZG9uJ3QgdXNlIGRpcmVudC5kX3R5cGUgKG5vdCBwb3J0YWJsZSkKLSsKLSsyMDEyLTEwLTI1ICBKYW1lcyBIdW50ICA8amFtZXMuaHVudEB1YnVudHUuY29tPgotKwotKwkqIG5paC9sb2dnaW5nLmM6IFVzZSBvdXIgb3duIF9fbmloX2Fib3J0X21zZyByYXRoZXIgdGhhbiB0aGUKLSsJKGUpZ2xpYmMgcHJpdmF0ZSBzeW1ib2wgX19hYm9ydF9tc2cgdG8gYXZvaWQgdXBncmFkZSBpc3N1ZXMgKExQOiAjOTk3MzU5KS4KLSsJKiBuaWgvdGVzdHMvdGVzdF9sb2dnaW5nLmM6IFVwZGF0ZSB0ZXN0cyBmb3IgX19uaWhfYWJvcnRfbXNnLgotKwotKzIwMTEtMDgtMzEgIEphbWVzIEh1bnQgIDxqYW1lcy5odW50QHVidW50dS5jb20+Ci0rCi0rCSogbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X2NvbS5uZXRzcGxpdC5OaWguVGVzdF9vYmplY3QuYwotKwkodGVzdF91bml4X2ZkX3RvX3N0cik6IFNhbml0eSBjaGVjayB2YWx1ZSBiZWZvcmUgaW52b2tpbmcgc3RyY2hyIGluCi0rCWNhc2UgaXQgcmV0dXJucyBhZGRyZXNzIG9mIG51bGwgKHdoaWNoIHdvdWxkIGdpdmUgYSBtaXNsZWFkaW5nIHRlc3QKLSsJcGFzcykuCi0rCSogbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X2NvbS5uZXRzcGxpdC5OaWguVGVzdF9wcm94eS5jCi0rCSh0ZXN0X3VuaXhfZmRfdG9fc3RyLCB0ZXN0X3VuaXhfZmRfdG9fc3RyX3N5bmMpOiBTYW5pdHkgY2hlY2sgdmFsdWUKLSsJYmVmb3JlIGludm9raW5nIHN0cmNociBpbiBjYXNlIGl0IHJldHVybnMgYWRkcmVzcyBvZiBudWxsICh3aGljaCB3b3VsZAotKwlnaXZlIGEgbWlzbGVhZGluZyB0ZXN0IHBhc3MpLgotKwkqIG5paC9jb25maWcuYyAoKTogbmloX2NvbmZpZ19ibG9ja19lbmQ6IEFkZCBjaGVjayB0byBlbnN1cmUgc3RyY2hyKCkKLSsJZG9lc24ndCByZXR1cm4gYWRkcmVzcyBvZiBudWxsIHNpbmNlIHRoaXMgd291bGQgcmVzdWx0IGluIGEgbWlzbGVhZGluZwotKwlyZXR1cm4gdmFsdWUgb2YgVFJVRS4KLSsKLSsJKiBuaWgvc3RyaW5nLmMgKG5paF9zdHJfc3BsaXQpOiBGaXhlcyB0byBhdm9pZCBvdmVyLXJ1bm5pbmcKLSsJaW5wdXQgc3RyaW5nIGFuZCBhbHNvIHJldHVybmluZyBhbiBlbXB0eSBzdHJpbmcgYXJyYXkgZW50cnkKLSsJd2hlbiByZXBlYXQgaXMgdHJ1ZSAoTFA6ICM4MzQ4MTMpLgotKwkqIG5paC90ZXN0cy90ZXN0X3N0cmluZy5jICh0ZXN0X3N0cl9zcGxpdCk6IEFkZGVkIGEgbG90IG9mIG5ldwotKwl0ZXN0cyBmb3IgbmloX3N0cl9zcGxpdCgpLgotKwotKzIwMTEtMDgtMjYgIEphbWVzIEh1bnQgIDxqYW1lcy5odW50QHVidW50dS5jb20+Ci0rCi0rCSogbmloL2lvLmMgKG5paF9pb19zZWxlY3RfZmRzKTogRW5zdXJlIG51bWJlciBvZiBmZHMgYmVpbmcgbWFuYWdlZAotKwlpcyB3aXRoaW4gbGltaXRzLgotKwotKwkqIG5paC9jb25maWcuYywgbmloL2Vycm9yLmgsIG5paC9pby5jLCBuaWgvdGVzdF9maWxlcy5oOiBDb3JyZWN0Ci0rCXR5cG9zIGluIGNvbW1lbnRzLgotKwotKzIwMTEtMDYtMjAgIEphbWVzIEh1bnQgIDxqYW1lcy5odW50QHVidW50dS5jb20+Ci0rCi0rCSogbmloL3dhdGNoLmMgKG5paF93YXRjaF9oYW5kbGUpOiBIYW5kbGUgbm9uLWRpcmVjdG9yeSB3YXRjaGVzOwotKwlwcmV2aW91c2x5IGEgZmlsZSB3YXRjaCByZXN1bHRlZCBpbiBhbiBpbnZhbGlkIGZpbGUgcGF0aCBlbmRpbmcgaW4KLSsJYSBzaW5nbGUgc2xhc2ggKExQOiM3NzcwOTcpLgotKwkqIG5paC90ZXN0cy90ZXN0X3dhdGNoLmM6IEFkZGVkIGV4cGxpY2l0IHRlc3QgZm9yIHdhdGNoIG9uIGEgZmlsZS4KLSsKLSAyMDEwLTEyLTIzICBTY290dCBKYW1lcyBSZW1uYW50ICA8c2NvdHRAbmV0c3BsaXQuY29tPgotIAotIAkqIE5FV1M6IFJlbGVhc2UgMS4wLjMKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvd2F0Y2guYwotKysrIGxpYm5paC0xLjAuMy9uaWgvd2F0Y2guYwotQEAgLTIsOCArMiw4IEBACi0gICoKLSAgKiB3YXRjaC5jIC0gd2F0Y2hpbmcgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaW5vdGlmeQotICAqCi0tICogQ29weXJpZ2h0IMKpIDIwMDkgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBDYW5vbmljYWwgTHRkLgotKyAqIENvcHlyaWdodCDCqSAyMDExIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgQ2Fub25pY2FsIEx0ZC4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGFzCi1AQCAtNzEsNiArNzEsOSBAQAotIAkJCQkJICAgICAgdWludDMyX3QgZXZlbnRzLCB1aW50MzJfdCBjb29raWUsCi0gCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAotIAkJCQkJICAgICAgaW50ICpjYXVnaHRfZnJlZSk7Ci0rc3RhdGljIGludCAgICAgICAgICAgICBuaWhfd2F0Y2hfd2Fsa19maWx0ZXIgKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKnBhdGgsCi0rCQkJCQkgICAgICBpbnQgaXNfZGlyKQotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gCi0gLyoqCi1AQCAtOTEsNyArOTQsNyBAQAotICAqIHN1Yi1kaXJlY3RvcmllcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgd2F0Y2hlZC4KLSAgKgotICAqIEFkZGl0aW9uYWxseSwgdGhlIHNldCBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aGluIEBwYXRoIGNhbiBiZQotLSAqIGxpbWl0ZWQgYnkgcGFzc2luZyBhIEBmaWx0ZXIgZnVuY3Rpb24gd2hpY2ggd2lsbCByZWNpZXZlIHRoZSBwYXRocyBhbmQKLSsgKiBsaW1pdGVkIGJ5IHBhc3NpbmcgYSBAZmlsdGVyIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgcGF0aHMgYW5kCi0gICogbWF5IHJldHVybiBUUlVFIHRvIGluZGljYXRlIHRoYXQgdGhlIHBhdGggcmVjZWl2ZWQgc2hvdWxkIG5vdCBiZSB3YXRjaGVkLgotICAqCi0gICogV2hlbiBhIGZpbGUgaXMgY3JlYXRlZCB3aXRoaW4gQHBhdGgsIG9yIG1vdmVkIGZyb20gb3V0c2lkZSB0aGlzIGxvY2F0aW9uCi1AQCAtMTA0LDcgKzEwNyw3IEBACi0gICogZmlsZXMgdGhhdCBleGlzdCB1bmRlciBAcGF0aCB3aGVuIHRoZSB3YXRjaCBpcyBmaXJzdCBhZGRlZC4gIFRoaXMgb25seQotICAqIG9jY3VycyBpZiB0aGUgd2F0Y2ggY2FuIGJlIGFkZGVkLgotICAqCi0tICogVGhpcyBpcyBhIHZlcnkgaGlnaCBsZXZlbCB3cmFwcGVkIGFyb3VuZCB0aGUgaW5vdGlmeSBBUEk7IGxvd2VyIGxldmVscwotKyAqIFRoaXMgaXMgYSB2ZXJ5IGhpZ2ggbGV2ZWwgd3JhcHBlciBhcm91bmQgdGhlIGlub3RpZnkgQVBJOyBsb3dlciBsZXZlbHMKLSAgKiBjYW4gYmUgb2J0YWluZWQgdXNpbmcgdGhlIGlub3RpZnkgQVBJIGl0c2VsZiBhbmQgc29tZSBvZiB0aGUgaGVscGVyCi0gICogZnVuY3Rpb25zIHVzZWQgYnkgdGhpcyBvbmUuCi0gICoKLUBAIC0xODUsNiArMTg4LDM1IEBACi0gfQotIAotIAotKyAvKioKLSsgKiBuaWhfd2F0Y2hfd2Fsa19maWx0ZXI6Ci0rICogQGRhdGE6IE5paFdhdGNoLAotKyAqIEBwYXRoOiBwYXRoIHRvIGZpbGUsCi0rICogQGlzX2RpcjogVFJVRSBpZiBAcGF0aCBpcyBhIGRpcmVjdG9yeS4KLSsgKgotKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBuaWhfZGlyX3dhbGsoKSwgdXNlZCBieSBuaWhfd2F0Y2hfYWRkKCkgdG8gd3JhcAotKyAqIHRoZSB1c2VyLXNwZWNpZmllZCBOaWhGaWxlRmlsdGVyICh3YXRjaC0+ZmlsdGVyKSB3aXRoIGEgZmlsdGVyIHRoYXQgY2FuCi0rICogdGFrZSB3YXRjaCBpdHNlbGYgYXMgYW4gYXJndW1lbnQuCi0rICoKLSsgKiBSZXR1cm5zOiBUUlVFIGlmIHRoZSBwYXRoIHNob3VsZCBiZSBpZ25vcmVkLCBGQUxTRSBvdGhlcndpc2UuCi0rICoqLwotK3N0YXRpYyBpbnQKLStuaWhfd2F0Y2hfd2Fsa19maWx0ZXIgKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBpc19kaXIpCi0rewotKyAgICBOaWhXYXRjaCAqd2F0Y2g7Ci0rCi0rICAgIHdhdGNoID0gKE5paFdhdGNoICopZGF0YTsKLSsKLSsgICAgbmloX2Fzc2VydCAod2F0Y2gpOwotKwotKyAgICAvKiBObyBmaWx0ZXIsIHNvIGFjY2VwdCBhbGwgZmlsZXMgKi8KLSsgICAgaWYgKCEgd2F0Y2gtPmZpbHRlcikKLSsgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSsKLSsgICAgcmV0dXJuIHdhdGNoLT5maWx0ZXIgKHdhdGNoLT5kYXRhLCBwYXRoLCBpc19kaXIpOwotK30KLSsKLSsKLSAvKioKLSAgKiBuaWhfd2F0Y2hfaGFuZGxlX2J5X3dkOgotICAqIEB3YXRjaDogd2F0Y2ggdG8gc2VhcmNoLAotQEAgLTI5NSw3ICszMjcsNyBAQAotIAkgKiBvbmU7IGVycm9ycyB3aXRoaW4gdGhlIHdhbGsgYXJlIHdhcm5lZCBhdXRvbWF0aWNhbGx5LCBzbyBpZiB0aGlzCi0gCSAqIGZhaWxzLCBpdCBtZWFucyB3ZSBsaXRlcmFsbHkgY291bGRuJ3Qgd2F0Y2ggdGhlIHRvcC1sZXZlbC4KLSAJICovCi0tCWlmIChzdWJkaXJzICYmIChuaWhfZGlyX3dhbGsgKHBhdGgsIHdhdGNoLT5maWx0ZXIsCi0rCWlmIChzdWJkaXJzICYmIChuaWhfZGlyX3dhbGsgKHBhdGgsIG5paF93YXRjaF93YWxrX2ZpbHRlciwKLSAJCQkJICAgICAgKE5paEZpbGVWaXNpdG9yKW5paF93YXRjaF9hZGRfdmlzaXRvciwKLSAJCQkJICAgICAgTlVMTCwgd2F0Y2gpIDwgMCkpIHsKLSAJCU5paEVycm9yICplcnI7Ci1AQCAtNDk0LDEyICs1MjYsMjEgQEAKLSAJCXJldHVybjsKLSAJfQotIAotKwkvKiBFdmVyeSBvdGhlciBldmVudCBtdXN0IGNvbWUgd2l0aCBhIG5hbWUgKi8KLSsJaWYgKG5hbWUgJiYgKm5hbWUpIHsKLSAKLS0JLyogRXZlcnkgb3RoZXIgZXZlbnQgbXVzdCBjb21lIHdpdGggYSBuYW1lLiAqLwotLQlpZiAoKCEgbmFtZSkgfHwgc3RyY2hyIChuYW1lLCAnLycpKQotLQkJcmV0dXJuOwotKwkJLyogSWYgbmFtZSByZWZlcnMgdG8gYSBkaXJlY3RvcnksIHRoZXJlIHNob3VsZCBiZSBubyBhc3NvY2lhdGVkCi0rCQkgKiBwYXRoIC0ganVzdCB0aGUgbmFtZSBvZiB0aGUgcGF0aCBlbGVtZW50LgotKwkJICovCi0rCQlpZiAoc3RyY2hyIChuYW1lLCAnLycpKQotKwkJCXJldHVybjsKLSAKLS0JcGF0aCA9IE5JSF9NVVNUIChuaWhfc3ByaW50ZiAoTlVMTCwgIiVzLyVzIiwgaGFuZGxlLT5wYXRoLCBuYW1lKSk7Ci0rCQkvKiBFdmVudCBvY2N1cmVkIGZvciBmaWxlIHdpdGhpbiBhIHdhdGNoZWQgZGlyZWN0b3J5ICovCi0rCQlwYXRoID0gTklIX01VU1QgKG5paF9zcHJpbnRmIChOVUxMLCAiJXMvJXMiLCBoYW5kbGUtPnBhdGgsIG5hbWUpKTsKLSsJfSBlbHNlIHsKLSsJCS8qIEZpbGUgZXZlbnQgb2NjdXJlZCAqLwotKwkJcGF0aCA9IE5JSF9NVVNUIChuaWhfc3RyZHVwIChOVUxMLCBoYW5kbGUtPnBhdGgpKTsKLSsJfQotIAotIAkvKiBDaGVjayB0aGUgZmlsdGVyICovCi0gCWlmICh3YXRjaC0+ZmlsdGVyICYmIHdhdGNoLT5maWx0ZXIgKHdhdGNoLT5kYXRhLCBwYXRoLAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9oYXNoLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2hhc2guaAotQEAgLTE0MSw3ICsxNDEsNyBAQAotICAqIEBoYXNoOiBoYXNoIHRhYmxlIHRvIGl0ZXJhdGUsCi0gICogQGl0ZXI6IG5hbWUgb2YgaXRlcmF0b3IgdmFyaWFibGUuCi0gICoKLS0gKiBFeHBhbnMgdG8gbmVzdGVkIGZvciBzdGF0ZW1lbnRzIHRoYXQgaXRlcmF0ZSBvdmVyIGVhY2ggZW50cnkgaW4gZWFjaAotKyAqIEV4cGFuZHMgdG8gbmVzdGVkIGZvciBzdGF0ZW1lbnRzIHRoYXQgaXRlcmF0ZSBvdmVyIGVhY2ggZW50cnkgaW4gZWFjaAotICAqIGJpbiBvZiBAaGFzaCwgZXhjZXB0IGZvciB0aGUgYmluIGhlYWQgcG9pbnRlciwgc2V0dGluZyBAaXRlciB0byBlYWNoCi0gICogZW50cnkgZm9yIHRoZSBibG9jayB3aXRoaW4gdGhlIGxvb3AuICBBIHZhcmlhYmxlIG5hbWVkIF9AaXRlcl9pIGlzIHVzZWQKLSAgKiB0byBpdGVyYXRlIHRoZSBoYXNoIGJpbnMuCi1AQCAtMjAzLDcgKzIwMyw3IEBACi0gCQkJCSAgIE5paEtleUZ1bmN0aW9uIGtleV9mdW5jdGlvbiwKLSAJCQkJICAgTmloSGFzaEZ1bmN0aW9uIGhhc2hfZnVuY3Rpb24sCi0gCQkJCSAgIE5paENtcEZ1bmN0aW9uIGNtcF9mdW5jdGlvbikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOaWhMaXN0ICogICBuaWhfaGFzaF9hZGQgICAgICAgICAgKE5paEhhc2ggKmhhc2gsIE5paExpc3QgKmVudHJ5KTsKLSBOaWhMaXN0ICogICBuaWhfaGFzaF9hZGRfdW5pcXVlICAgKE5paEhhc2ggKmhhc2gsIE5paExpc3QgKmVudHJ5KTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvbWFpbi5oCi0rKysgbGlibmloLTEuMC4zL25paC9tYWluLmgKLUBAIC0xMzgsNyArMTM4LDcgQEAKLSAKLSBOaWhNYWluTG9vcEZ1bmMgKm5paF9tYWluX2xvb3BfYWRkX2Z1bmMgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkgIE5paE1haW5Mb29wQ2IgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gdm9pZCAgICAgICAgICAgICBuaWhfbWFpbl90ZXJtX3NpZ25hbCAgICAodm9pZCAqZGF0YSwgTmloU2lnbmFsICpzaWduYWwpOwotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9jb21tYW5kLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2NvbW1hbmQuaAotQEAgLTEyMyw3ICsxMjMsNyBAQAotIAotIE5paENvbW1hbmQgKm5paF9jb21tYW5kX2pvaW4gICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQljb25zdCBOaWhDb21tYW5kICphLCBjb25zdCBOaWhDb21tYW5kICpiKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2NvbmZpZy5oCi0rKysgbGlibmloLTEuMC4zL25paC9jb25maWcuaAotQEAgLTE0MCwxMCArMTQwLDEwIEBACi0gY2hhciAqICAgIG5paF9jb25maWdfbmV4dF90b2tlbiAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gCQkJCSAgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcG9zLCBzaXplX3QgKmxpbmVubywKLSAJCQkJICAgICAgY29uc3QgY2hhciAqZGVsaW0sIGludCBkZXF1b3RlKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICBuaWhfY29uZmlnX25leHRfYXJnICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpmaWxlLAotIAkJCQkgICAgICBzaXplX3QgbGVuLCBzaXplX3QgKnBvcywgc2l6ZV90ICpsaW5lbm8pCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gdm9pZCAgICAgIG5paF9jb25maWdfbmV4dF9saW5lICAgICAgIChjb25zdCBjaGFyICpmaWxlLCBzaXplX3QgbGVuLAotIAkJCQkgICAgICBzaXplX3QgKnBvcywgc2l6ZV90ICpsaW5lbm8pOwotIAotQEAgLTE1NSwxNSArMTU1LDE1IEBACi0gCi0gY2hhciAqKiAgIG5paF9jb25maWdfcGFyc2VfYXJncyAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gCQkJCSAgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcG9zLCBzaXplX3QgKmxpbmVubykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgbmloX2NvbmZpZ19wYXJzZV9jb21tYW5kICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqZmlsZSwKLSAJCQkJICAgICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpwb3MsIHNpemVfdCAqbGluZW5vKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICBuaWhfY29uZmlnX3BhcnNlX2Jsb2NrICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpmaWxlLAotIAkJCQkgICAgICBzaXplX3QgbGVuLCBzaXplX3QgKnBvcywgc2l6ZV90ICpsaW5lbm8sCi0gCQkJCSAgICAgIGNvbnN0IGNoYXIgKnR5cGUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gaW50ICAgICAgIG5paF9jb25maWdfc2tpcF9ibG9jayAgICAgIChjb25zdCBjaGFyICpmaWxlLCBzaXplX3QgbGVuLAotIAkJCQkgICAgICBzaXplX3QgKmxpbmVubywgc2l6ZV90ICpwb3MsCi0gCQkJCSAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIHNpemVfdCAqZW5kcG9zKQotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9pby5jCi0rKysgbGlibmloLTEuMC4zL25paC9pby5jCi1AQCAtMiw4ICsyLDggQEAKLSAgKgotICAqIGlvLmMgLSBmaWxlIGFuZCBzb2NrZXQgaW5wdXQvb3V0cHV0IGhhbmRsaW5nCi0gICoKLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotLSAqIENvcHlyaWdodCDCqSAyMDA5IENhbm9uaWNhbCBMdGQuCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBDYW5vbmljYWwgTHRkLgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKLUBAIC0xNjUsNiArMTY1LDcgQEAKLSAJbmloX2Fzc2VydCAocmVhZGZkcyAhPSBOVUxMKTsKLSAJbmloX2Fzc2VydCAod3JpdGVmZHMgIT0gTlVMTCk7Ci0gCW5paF9hc3NlcnQgKGV4Y2VwdGZkcyAhPSBOVUxMKTsKLSsJbmloX2Fzc2VydCAoKm5mZHMgPD0gRkRfU0VUU0laRSk7Ci0gCi0gCW5paF9pb19pbml0ICgpOwotIAotQEAgLTE4Niw2ICsxODcsOSBAQAotIAkJCSpuZmRzID0gbmloX21heCAoKm5mZHMsIHdhdGNoLT5mZCArIDEpOwotIAkJfQotIAl9Ci0rCi0rCS8qIFJlLWNoZWNrIGluIGNhc2Ugd2UgZXhjZWVkZWQgdGhlIGxpbWl0IGluIHRoZSBsb29wICovCi0rCW5paF9hc3NlcnQgKCpuZmRzIDw9IEZEX1NFVFNJWkUpOwotIH0KLSAKLSAvKioKLUBAIC05MDEsNyArOTA1LDcgQEAKLSAgKiByZWFkIGFuZCBwbGFjZWQgaW50byB0aGUgcmVjZWl2ZSBidWZmZXIgb3IgcXVldWUsIGFuZCB0aGUgcmVhZGVyIGZ1bmN0aW9uCi0gICogaXMgY2FsbGVkIGlmIHNldC4KLSAgKgotLSAqIEFueSBkYXRhIG9yIG1lc3NhYWdlcyBpbiB0aGUgc2VuZCBidWZmZXIgb3IgcXVldWUgYXJlIHdyaXR0ZW4gb3V0IGlmIHRoZQotKyAqIEFueSBkYXRhIG9yIG1lc3NhZ2VzIGluIHRoZSBzZW5kIGJ1ZmZlciBvciBxdWV1ZSBhcmUgd3JpdHRlbiBvdXQgaWYgdGhlCi0gICogQGV2ZW50cyBpbmNsdWRlcyBOSUhfSU9fV1JJVEUuCi0gICoKLSAgKiBFcnJvcnMgYXJlIGhhbmRsZWQgd2hlbiBkYXRhIGlzIHJlYWQsIGFuZCByZXN1bHQgaW4gdGhlIGVycm9yIGhhbmRsZWQKLUBAIC0xMjExLDcgKzEyMTUsNyBAQAotICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGxvY2FsIGVuZCBvZiBhIGZpbGUgZGVzY3JpcHRvciBiZWluZwotICAqIG1hbmFnZWQgYnkgTmloSW8gc2hvdWxkIGJlIGNsb3NlZC4gIFVzdWFsbHkgdGhpcyBpcyBiZWNhdXNlIHRoZSByZW1vdGUKLSAgKiBlbmQgaGFzIGJlZW4gY2xvc2VkICh3aXRob3V0IGVycm9yKSBidXQgaXQgY2FuIGFsc28gYmUgYmVjYXVzZSBubwotLSAqIGVycm9yIGhhbmRsZXIgd2FzIGdpdmVuCi0rICogZXJyb3IgaGFuZGxlciB3YXMgZ2l2ZW4uCi0gICoKLSAgKiBOb3JtYWxseSB0aGlzIGp1c3QgY2FsbHMgdGhlIGNsb3NlIGhhbmRsZXIsIG9yIGlmIG5vdCBhdmFpbGFibGUsIGl0Ci0gICogY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYW5kIGZyZWVzIHRoZSBzdHJ1Y3R1cmUgKHdoaWNoIG1heSBiZQotQEAgLTEyOTEsNyArMTI5NSw3IEBACi0gICogQGlvOiBzdHJ1Y3R1cmUgdG8gYmUgZGVzdHJveWVkLgotICAqCi0gICogQ2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIGFuIE5paElvIHN0cnVjdHVyZSBzbyB0aGF0Ci0tICogdGhlIHN0cnVjdHVyZSBjYW4gYmUgZnJlZWQuICBJRiBhbiBlcnJvciBpcyBjYXVnaHQgYnkgY2xvc2luZyB0aGUKLSsgKiB0aGUgc3RydWN0dXJlIGNhbiBiZSBmcmVlZC4gIElmIGFuIGVycm9yIGlzIGNhdWdodCBieSBjbG9zaW5nIHRoZQotICAqIGRlc2NyaXB0b3IsIHRoZSBlcnJvciBoYW5kbGVyIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHRoZSBlcnJvciBiZWluZyByYWlzZWQ7Ci0gICogdGhpcyBhbGxvd3MgeW91IHRvIGdyb3VwIHlvdXIgZXJyb3IgaGFuZGxpbmcgaW4gb25lIHBsYWNlIHJhdGhlciB0aGFuCi0gICogc3BlY2lhbC1jYXNlIGNsb3NlLgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC93YXRjaC5oCi0rKysgbGlibmloLTEuMC4zL25paC93YXRjaC5oCi1AQCAtMTU2LDcgKzE1Niw3IEBACi0gCQkJICAgICBOaWhDcmVhdGVIYW5kbGVyIGNyZWF0ZV9oYW5kbGVyLAotIAkJCSAgICAgTmloTW9kaWZ5SGFuZGxlciBtb2RpZnlfaGFuZGxlciwKLSAJCQkgICAgIE5paERlbGV0ZUhhbmRsZXIgZGVsZXRlX2hhbmRsZXIsIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gaW50ICAgICAgIG5paF93YXRjaF9hZGQgICAgIChOaWhXYXRjaCAqd2F0Y2gsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBzdWJkaXJzKQotIAlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3RyZWUuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvdHJlZS5oCi1AQCAtMzQ0LDkgKzM0NCw5IEBACi0gCi0gdm9pZCAgICAgICAgICBuaWhfdHJlZV9pbml0ICAgICAgICAgICAoTmloVHJlZSAqdHJlZSk7Ci0gTmloVHJlZSAqICAgICBuaWhfdHJlZV9uZXcgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIE5paFRyZWVFbnRyeSAqbmloX3RyZWVfZW50cnlfbmV3ICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOaWhUcmVlICogICAgIG5paF90cmVlX2FkZCAgICAgICAgICAgIChOaWhUcmVlICp0cmVlLCBOaWhUcmVlICpub2RlLAotIAkJCQkgICAgICAgTmloVHJlZVdoZXJlIHdoZXJlKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvZmlsZS5jCi0rKysgbGlibmloLTEuMC4zL25paC9maWxlLmMKLUBAIC02NSw3ICs2NSw3IEBACi0gLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucyAqLwotIHN0YXRpYyBjaGFyICoqbmloX2Rpcl93YWxrX3NjYW4gIChjb25zdCBjaGFyICpwYXRoLCBOaWhGaWxlRmlsdGVyIGZpbHRlciwKLSAJCQkJICB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHN0YXRpYyBpbnQgICAgbmloX2Rpcl93YWxrX3Zpc2l0IChjb25zdCBjaGFyICpkaXJuYW1lLCBOaWhMaXN0ICpkaXJzLAotIAkJCQkgIGNvbnN0IGNoYXIgKnBhdGgsIE5paEZpbGVGaWx0ZXIgZmlsdGVyLAotIAkJCQkgIE5paEZpbGVWaXNpdG9yIHZpc2l0b3IsCi1AQCAtNjE5LDYgKzYxOSw4IEBACi0gCXN0cnVjdCBkaXJlbnQgICplbnQ7Ci0gCWNoYXIgICAgICAgICAgKipwYXRoczsKLSAJc2l6ZV90ICAgICAgICAgIG5wYXRoczsKLSsJaW50ICAgICAgICAgICAgIGlzZGlyOwotKwlzdHJ1Y3Qgc3RhdCAgICAgc3RhdGJ1ZjsKLSAKLSAJbmloX2Fzc2VydCAocGF0aCAhPSBOVUxMKTsKLSAKLUBAIC02NDAsNyArNjQyLDE1IEBACi0gCQlzdWJwYXRoID0gTklIX01VU1QgKG5paF9zcHJpbnRmIChOVUxMLCAiJXMvJXMiLAotIAkJCQkJCSBwYXRoLCBlbnQtPmRfbmFtZSkpOwotIAotLQkJaWYgKGZpbHRlciAmJiBmaWx0ZXIgKGRhdGEsIHN1YnBhdGgsIGVudC0+ZF90eXBlID09IERUX0RJUikpCi0rCQlpZiAoZW50LT5kX3R5cGUgPT0gRFRfVU5LTk9XTikgewotKwkJCWlmICggbHN0YXQgKHN1YnBhdGgsICZzdGF0YnVmKSkKLSsJCQkJaXNkaXIgPSAwOwotKwkJCWVsc2UKLSsJCQkJaXNkaXIgPSBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSk7Ci0rCQl9IGVsc2UKLSsJCQlpc2RpciA9IGVudC0+ZF90eXBlID09IERUX0RJUjsKLSsKLSsJCWlmIChmaWx0ZXIgJiYgZmlsdGVyIChkYXRhLCBzdWJwYXRoLCBpc2RpcikpCi0gCQkJY29udGludWU7Ci0gCi0gCQlOSUhfTVVTVCAobmloX3N0cl9hcnJheV9hZGRwICgmcGF0aHMsIE5VTEwsICZucGF0aHMsIHN1YnBhdGgpKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvYWxsb2MuYwotKysrIGxpYm5paC0xLjAuMy9uaWgvYWxsb2MuYwotQEAgLTExOSw4ICsxMTksNyBAQAotIHN0YXRpYyBpbmxpbmUgaW50ICAgICAgICAgIG5paF9hbGxvY19jb250ZXh0X2ZyZWUgICAoTmloQWxsb2NDdHggKmN0eCk7Ci0gCi0gc3RhdGljIGlubGluZSBOaWhBbGxvY1JlZiAqbmloX2FsbG9jX3JlZl9uZXcgICAgICAgIChOaWhBbGxvY0N0eCAqcGFyZW50LAotLQkJCQkJCSAgICAgTmloQWxsb2NDdHggKmNoaWxkKQotLQlfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSk7Ci0rCQkJCQkJICAgICBOaWhBbGxvY0N0eCAqY2hpbGQpOwotIHN0YXRpYyBpbmxpbmUgdm9pZCAgICAgICAgIG5paF9hbGxvY19yZWZfZnJlZSAgICAgICAoTmloQWxsb2NSZWYgKnJlZik7Ci0gc3RhdGljIGlubGluZSBOaWhBbGxvY1JlZiAqbmloX2FsbG9jX3JlZl9sb29rdXAgICAgIChOaWhBbGxvY0N0eCAqcGFyZW50LAotIAkJCQkJCSAgICAgTmloQWxsb2NDdHggKmNoaWxkKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvdGltZXIuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvdGltZXIuaAotQEAgLTU5LDcgKzU5LDcgQEAKLSAgKiBAbW9udGhzOiBtb250aHMgKDEtMTIpLAotICAqIEB3ZGF5czogZGF5cyBvZiB3ZWVrICgwLTcpLgotICAqCi0tICogSW5kaWRjYXRlcyB3aGVuIHNjaGVkdWxlZCB0aW1lcnMgc2hvdWxkIGJlIHJ1biwgZWFjaCBtZW1iZXIgaXMgYSBiaXQKLSsgKiBJbmRpY2F0ZXMgd2hlbiBzY2hlZHVsZWQgdGltZXJzIHNob3VsZCBiZSBydW4sIGVhY2ggbWVtYmVyIGlzIGEgYml0Ci0gICogZmllbGQgd2hlcmUgdGhlIGJpdCBpcyAxIGlmIHRoZSB0aW1lciBzaG91bGQgYmUgcnVuIGZvciB0aGF0IHZhbHVlIGFuZAotICAqIDAgaWYgbm90LgotICAqKi8KLUBAIC0xMTcsMTQgKzExNywxNCBAQAotIAotIE5paFRpbWVyICpuaWhfdGltZXJfYWRkX3RpbWVvdXQgICAoY29uc3Qgdm9pZCAqcGFyZW50LCB0aW1lX3QgdGltZW91dCwKLSAJCQkJICAgTmloVGltZXJDYiBjYWxsYmFjaywgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBOaWhUaW1lciAqbmloX3RpbWVyX2FkZF9wZXJpb2RpYyAgKGNvbnN0IHZvaWQgKnBhcmVudCwgdGltZV90IHBlcmlvZCwKLSAJCQkJICAgTmloVGltZXJDYiBjYWxsYmFjaywgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBOaWhUaW1lciAqbmloX3RpbWVyX2FkZF9zY2hlZHVsZWQgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJICAgTmloVGltZXJTY2hlZHVsZSAqc2NoZWR1bGUsCi0gCQkJCSAgIE5paFRpbWVyQ2IgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTmloVGltZXIgKm5paF90aW1lcl9uZXh0X2R1ZSAgICAgICAodm9pZCk7Ci0gdm9pZCAgICAgIG5paF90aW1lcl9wb2xsICAgICAgICAgICAodm9pZCk7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2NvbmZpZy5jCi0rKysgbGlibmloLTEuMC4zL25paC9jb25maWcuYwotQEAgLTIsOCArMiw4IEBACi0gICoKLSAgKiBjb25maWcuYyAtIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nCi0gICoKLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotLSAqIENvcHlyaWdodCDCqSAyMDA5IENhbm9uaWNhbCBMdGQuCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBDYW5vbmljYWwgTHRkLgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKLUBAIC02NTcsNyArNjU3LDcgQEAKLSAgKiBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGFyZSBmcmVlZCwgdGhlIHJldHVybmVkIHN0cmluZyB3aWxsIGFsc28gYmUKLSAgKiBmcmVlZC4KLSAgKgotLSAqIFJldHVybnM6IHRoZSBjb21tYW5kIGZvdW5kIG9yIE5VTEwgb24gcmFpc2VkIGVycm9yLgotKyAqIFJldHVybnM6IHRoZSBuZXdseSBhbGxvY2F0ZWQgY29tbWFuZCBmb3VuZCBvciBOVUxMIG9uIHJhaXNlZCBlcnJvci4KLSAgKiovCi0gY2hhciAqCi0gbmloX2NvbmZpZ19wYXJzZV9jb21tYW5kIChjb25zdCB2b2lkICpwYXJlbnQsCi1AQCAtNzE0LDcgKzcxNCw3IEBACi0gICogQGxpbmVubzogbGluZSBudW1iZXIsCi0gICogQHR5cGU6IGJsb2NrIGlkZW50aWZpZXIuCi0gICoKLS0gKiBFeHRyYWN0cyBhIGJsb2NrIG9mIHRleHQgZnJvbSBAbGluZSwgc3RvcHBpbmcgd2hlbiB0aGUgcGhhcnNlICJlbmQgQHR5cGUiCi0rICogRXh0cmFjdHMgYSBibG9jayBvZiB0ZXh0IGZyb20gQGxpbmUsIHN0b3BwaW5nIHdoZW4gdGhlIHBocmFzZSAiZW5kIEB0eXBlIgotICAqIGlzIGVuY291bnRlcmVkIHdpdGhvdXQgYW55IHF1b3RlcyBvciBibGFja3NsYXNoIGVzY2FwaW5nIHdpdGhpbiBpdC4KLSAgKgotICAqIEBmaWxlIG1heSBiZSBhIG1lbW9yeSBtYXBwZWQgZmlsZSwgaW4gd2hpY2ggY2FzZSBAcG9zIHNob3VsZCBiZSBnaXZlbgotQEAgLTk1MCw3ICs5NTAsNyBAQAotIAkJcmV0dXJuIEZBTFNFOwotIAotIAkvKiBNdXN0IGJlIHdoaXRlc3BhY2UgYWZ0ZXIgKi8KLS0JaWYgKCEgc3RyY2hyIChOSUhfQ09ORklHX1dTLCBmaWxlW3AgKyAzXSkpCi0rCWlmIChmaWxlW3AgKyAzXSAmJiAhIHN0cmNociAoTklIX0NPTkZJR19XUywgZmlsZVtwICsgM10pKQotIAkJcmV0dXJuIEZBTFNFOwotIAotIAkvKiBGaW5kIHRoZSBzZWNvbmQgd29yZCAqLwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9vcHRpb24uaAotKysrIGxpYm5paC0xLjAuMy9uaWgvb3B0aW9uLmgKLUBAIC0xMjQsMTEgKzEyNCwxMSBAQAotIGNoYXIgKiogICAgbmloX29wdGlvbl9wYXJzZXIgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdLAotIAkJCQkgICAgICBOaWhPcHRpb24gKm9wdGlvbnMsIGludCBicmVha19ub25vcHQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTmloT3B0aW9uICpuaWhfb3B0aW9uX2pvaW4gICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCSAgICAgIGNvbnN0IE5paE9wdGlvbiAqYSwgY29uc3QgTmloT3B0aW9uICpiKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICAgbmloX29wdGlvbl9jb3VudCAgICAgICAgICAoTmloT3B0aW9uICpvcHRpb24sIGNvbnN0IGNoYXIgKmFyZyk7Ci0gaW50ICAgICAgICBuaWhfb3B0aW9uX2ludCAgICAgICAgICAgIChOaWhPcHRpb24gKm9wdGlvbiwgY29uc3QgY2hhciAqYXJnKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvc2lnbmFsLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL3NpZ25hbC5oCi1AQCAtNzYsNyArNzYsNyBAQAotIAotIE5paFNpZ25hbCAqIG5paF9zaWduYWxfYWRkX2hhbmRsZXIgKGNvbnN0IHZvaWQgKnBhcmVudCwgaW50IHNpZ251bSwKLSAJCQkJICAgTmloU2lnbmFsSGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIHZvaWQgICAgICAgIG5paF9zaWduYWxfaGFuZGxlciAgICAgKGludCBzaWdudW0pOwotIHZvaWQgICAgICAgIG5paF9zaWduYWxfcG9sbCAgICAgICAgKHZvaWQpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC9saXN0LmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2xpc3QuaAotQEAgLTM3LDcgKzM3LDcgQEAKLSAgKiBhZnRlciBhIGtub3duIGVudHJ5LCBhbmQgcmVtb3ZlIGFuIGVudHJ5IGZyb20gdGhlIGxpc3QuCi0gICoKLSAgKiBMaXN0IGVudHJpZXMgbWF5IGJlIGNyZWF0ZWQgaW4gb25lIG9mIHR3byB3YXlzLiAgVGhlIG1vc3QgY29tbW9uIGlzIHRvCi0tICogZW1iZWQgdGhlIE5paExpc3Qgc3RydWN0dXJlIGFzIHRoZSBmcmlzdCBtZW1iZXIgb2YgeW91ciBvd24gc3RydWN0dXJlLAotKyAqIGVtYmVkIHRoZSBOaWhMaXN0IHN0cnVjdHVyZSBhcyB0aGUgZmlyc3QgbWVtYmVyIG9mIHlvdXIgb3duIHN0cnVjdHVyZSwKLSAgKiBhbmQgaW5pdGlhbGlzZSBpdCB3aXRoIG5paF9saXN0X2luaXQoKSBhZnRlciBhbGxvY2F0aW5nIHRoZSBzdHJ1Y3R1cmUuCi0gICogQWx0ZXJuYXRpdmVseSB5b3UgbWF5IGNyZWF0ZSBOaWhMaXN0RW50cnkgc3RydWN0dXJlcyB3aXRoCi0gICogbmloX2xpc3RfZW50cnlfbmV3KCkgYW5kIHBvaW50IGF0IHlvdXIgb3duIGRhdGEgZnJvbSB0aGVtLgotQEAgLTE5NiwxMCArMTk2LDEwIEBACi0gCi0gdm9pZCAgICAgICAgICBuaWhfbGlzdF9pbml0ICAgICAgKE5paExpc3QgKmVudHJ5KTsKLSBOaWhMaXN0ICogICAgIG5paF9saXN0X25ldyAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5paExpc3RFbnRyeSAqbmloX2xpc3RfZW50cnlfbmV3IChjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gCi0gTmloTGlzdCAqICAgICBuaWhfbGlzdF9hZGQgICAgICAgKE5paExpc3QgKmxpc3QsIE5paExpc3QgKmVudHJ5KTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvbG9nZ2luZy5jCi0rKysgbGlibmloLTEuMC4zL25paC9sb2dnaW5nLmMKLUBAIC0zOSwxMSArMzksMTEgQEAKLSAKLSAKLSAvKioKLS0gKiBfX2Fib3J0X21zZzoKLSsgKiBfX25paF9hYm9ydF9tc2c6Ci0gICoKLS0gKiBBIGdsaWJjIHZhcmlhYmxlIHRoYXQga2VlcHMgdGhlIGFzc2VydGlvbiBtZXNzYWdlIGluIHRoZSBjb3JlIGR1bXAuCi0rICogQSB2YXJpYWJsZSB0aGF0IGtlZXBzIHRoZSBhc3NlcnRpb24gbWVzc2FnZSBpbiB0aGUgY29yZSBkdW1wLgotICAqKi8KLS1leHRlcm4gY2hhciAqX19hYm9ydF9tc2cgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKLStjaGFyICpfX25paF9hYm9ydF9tc2cgPSBOVUxMOwotIAotIC8qKgotICAqIGxvZ2dlcjoKLUBAIC0xMTQsMTkgKzExNCwxNiBAQAotICAqIG5paF9sb2dfYWJvcnRfbWVzc2FnZToKLSAgKiBAbWVzc2FnZTogbWVzc2FnZSB0byBiZSBsb2dnZWQuCi0gICoKLS0gKiBTYXZlIEBtZXNzYWdlIGluIHRoZSBnbGliYyBfX2Fib3J0X21zZyB2YXJpYWJsZSBzbyBpdCBjYW4gYmUgcmV0cmlldmVkCi0rICogU2F2ZSBAbWVzc2FnZSBpbiB0aGUgX19uaWhfYWJvcnRfbXNnIHZhcmlhYmxlIHNvIGl0IGNhbiBiZSByZXRyaWV2ZWQKLSAgKiBieSBkZWJ1Z2dlcnMgaWYgd2Ugc2hvdWxkIGNyYXNoIGF0IHRoaXMgcG9pbnQuCi0gICoqLwotIHN0YXRpYyB2b2lkCi0gbmloX2xvZ19hYm9ydF9tZXNzYWdlIChjb25zdCBjaGFyICptZXNzYWdlKQotIHsKLS0JaWYgKCEgJl9fYWJvcnRfbXNnKQotLQkJcmV0dXJuOwotKwlpZiAoX19uaWhfYWJvcnRfbXNnKQotKwkJbmloX2Rpc2NhcmQgKF9fbmloX2Fib3J0X21zZyk7Ci0gCi0tCWlmIChfX2Fib3J0X21zZykKLS0JCW5paF9kaXNjYXJkIChfX2Fib3J0X21zZyk7Ci0tCi0tCV9fYWJvcnRfbXNnID0gTklIX01VU1QgKG5paF9zdHJkdXAgKE5VTEwsIG1lc3NhZ2UpKTsKLSsJX19uaWhfYWJvcnRfbXNnID0gTklIX01VU1QgKG5paF9zdHJkdXAgKE5VTEwsIG1lc3NhZ2UpKTsKLSB9Ci0gCi0gLyoqCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3Rlc3RfZmlsZXMuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdF9maWxlcy5oCi1AQCAtMSw3ICsxLDcgQEAKLSAvKiBsaWJuaWgKLSAgKgotLSAqIENvcHlyaWdodCDCqSAyMDA5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0tICogQ29weXJpZ2h0IMKpIDIwMDkgQ2Fub25pY2FsIEx0ZC4KLSsgKiBDb3B5cmlnaHQgwqkgMjAxMSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgotKyAqIENvcHlyaWdodCDCqSAyMDExIENhbm9uaWNhbCBMdGQuCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBhcwotQEAgLTM5LDcgKzM5LDcgQEAKLSAgKiBURVNUX0ZJTEVOQU1FOgotICAqIEBfdmFyOiB2YXJpYWJsZSB0byBzdG9yZSBmaWxlbmFtZSBpbi4KLSAgKgotLSAqIEdlbmVyYXRlIGEgZmlsZW5hbWUgdGhhdCBtYXkgYmUgdXNlZCBmb3IgdGVzdGluZywgaXQncyB1bmxpbmtlZCBpdCBpZgotKyAqIEdlbmVyYXRlIGEgZmlsZW5hbWUgdGhhdCBtYXkgYmUgdXNlZCBmb3IgdGVzdGluZywgaXQncyB1bmxpbmtlZCBpZiBpdAotICAqIGV4aXN0cyBhbmQgaXQncyB1cCB0byB5b3UgdG8gdW5saW5rIGl0IHdoZW4gZG9uZS4gIEBfdmFyIHNob3VsZCBiZSBhdAotICAqIGxlYXN0IFBBVEhfTUFYIGxvbmcuCi0gICoqLwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0X3Byb2Nlc3MuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdF9wcm9jZXNzLmgKLUBAIC0zNiw3ICszNiw3IEBACi0gICogU3Bhd24gYSBjaGlsZCBpbiB3aGljaCBhIHRlc3QgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IGFmZmVjdGluZyB0aGUKLSAgKiBtYWluIGZsb3cgb2YgdGhlIHByb2Nlc3MuICBUaGUgcGlkIG9mIHRoZSBjaGlsZCBpcyBzdG9yZWQgaW4gQF9waWQuCi0gICoKLS0gKiBUaGlzIG1hY3JvIGVuc3VyZXMgdGhhdCB0aGUgY2hpbGQgaGFzIGJlZ3VuIGV4ZWN0dXRpb24gYmVmb3JlIHRoZQotKyAqIFRoaXMgbWFjcm8gZW5zdXJlcyB0aGF0IHRoZSBjaGlsZCBoYXMgYmVndW4gZXhlY3V0aW9uIGJlZm9yZSB0aGUKLSAgKiBwYXJlbnQgaXMgYWxsb3dlZCB0byBjb250aW51ZSB0aHJvdWdoIHRoZSB1c3VhbCB1c2Ugb2YgYSBwaXBlLgotICAqCi0gICogQSBibG9jayBvZiBjb2RlIHNob3VsZCBmb2xsb3cgdGhpcyBtYWNybywgd2hpY2ggaXMgdGhlIGNvZGUgdGhhdCB3aWxsCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2NoaWxkLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2NoaWxkLmgKLUBAIC05OCw3ICs5OCw3IEBACi0gTmloQ2hpbGRXYXRjaCAqbmloX2NoaWxkX2FkZF93YXRjaCAoY29uc3Qgdm9pZCAqcGFyZW50LCBwaWRfdCBwaWQsCi0gCQkJCSAgICBOaWhDaGlsZEV2ZW50cyBldmVudHMsCi0gCQkJCSAgICBOaWhDaGlsZEhhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSB2b2lkICAgICAgICAgICBuaWhfY2hpbGRfcG9sbCAgICAgICh2b2lkKTsKLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvYWxsb2MuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvYWxsb2MuaAotQEAgLTI5OSw3ICsyOTksNyBAQAotICAqIEl0IGlzIHBlcm1pc3NpYmxlIHRvIHRha2UgcmVmZXJlbmNlcyB0byBmb28gd2l0aGluIGl0cyBzY29wZSwgb3IgYnkKLSAgKiBmdW5jdGlvbnMgY2FsbGVkLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGZyZWVkLiAgQWxzbyBpdCBpcwotICAqIGdlbmVyYWxseSBub25zZW5zaWNhbCB0byBhbGxvY2F0ZSB3aXRoIGEgcGFyZW50LCBzaW5jZSB0aGlzIHRvbyB3aWxsCi0tICogcHJldmVudCBpdCBmcm9tIGJlaWduIGZyZWVkLgotKyAqIHByZXZlbnQgaXQgZnJvbSBiZWluZyBmcmVlZC4KLSAgKiovCi0gI2RlZmluZSBuaWhfbG9jYWwgX19hdHRyaWJ1dGVfXyAoKGNsZWFudXAoX25paF9kaXNjYXJkX2xvY2FsKSkpCi0gCi1AQCAtMzA3LDExICszMDcsMTEgQEAKLSBOSUhfQkVHSU5fRVhURVJOCi0gCi0gdm9pZCAqIG5paF9hbGxvYyAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIHNpemVfdCBzaXplKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIHZvaWQgKiBuaWhfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAodm9pZCAqcHRyLCBjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCSAgICAgIHNpemVfdCBzaXplKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICBuaWhfZnJlZSAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqcHRyKTsKLSBpbnQgICAgbmloX2Rpc2NhcmQgICAgICAgICAgICAgICAgICAgKHZvaWQgKnB0cik7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2lvLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2lvLmgKLUBAIC0yNjksNyArMjY5LDcgQEAKLSBOaWhJb1dhdGNoICogIG5paF9pb19hZGRfd2F0Y2ggICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGludCBmZCwKLSAJCQkJCSAgTmloSW9FdmVudHMgZXZlbnRzLAotIAkJCQkJICBOaWhJb1dhdGNoZXIgd2F0Y2hlciwgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSB2b2lkICAgICAgICAgIG5paF9pb19zZWxlY3RfZmRzICAgICAgICAgIChpbnQgKm5mZHMsIGZkX3NldCAqcmVhZGZkcywKLSAJCQkJCSAgZmRfc2V0ICp3cml0ZWZkcywgZmRfc2V0ICpleGNlcHRmZHMpOwotQEAgLTI3OCwxMiArMjc4LDEyIEBACi0gCi0gCi0gTmloSW9CdWZmZXIgKiBuaWhfaW9fYnVmZmVyX25ldyAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICAgICAgbmloX2lvX2J1ZmZlcl9yZXNpemUgICAgICAgKE5paElvQnVmZmVyICpidWZmZXIsIHNpemVfdCBncm93KTsKLSBjaGFyICogICAgICAgIG5paF9pb19idWZmZXJfcG9wICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkgIE5paElvQnVmZmVyICpidWZmZXIsIHNpemVfdCAqbGVuKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHZvaWQgICAgICAgICAgbmloX2lvX2J1ZmZlcl9zaHJpbmsgICAgICAgKE5paElvQnVmZmVyICpidWZmZXIsIHNpemVfdCBsZW4pOwotIGludCAgICAgICAgICAgbmloX2lvX2J1ZmZlcl9wdXNoICAgICAgICAgKE5paElvQnVmZmVyICpidWZmZXIsCi0gCQkJCQkgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKLUBAIC0yOTEsNyArMjkxLDcgQEAKLSAKLSAKLSBOaWhJb01lc3NhZ2UgKm5paF9pb19tZXNzYWdlX25ldyAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gaW50ICAgICAgICAgICBuaWhfaW9fbWVzc2FnZV9hZGRfY29udHJvbCAoTmloSW9NZXNzYWdlICptZXNzYWdlLCBpbnQgbGV2ZWwsCi0gCQkJCQkgIGludCB0eXBlLCBzb2NrbGVuX3QgbGVuLAotQEAgLTMwMCw3ICszMDAsNyBAQAotIAotIE5paElvTWVzc2FnZSAqbmloX2lvX21lc3NhZ2VfcmVjdiAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgaW50IGZkLAotIAkJCQkJICBzaXplX3QgKmxlbikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBzc2l6ZV90ICAgICAgIG5paF9pb19tZXNzYWdlX3NlbmQgICAgICAgIChOaWhJb01lc3NhZ2UgKm1lc3NhZ2UsIGludCBmZCkKLSAJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotQEAgLTMxMCw3ICszMTAsNyBAQAotIAkJCQkJICBOaWhJb0Nsb3NlSGFuZGxlciBjbG9zZV9oYW5kbGVyLAotIAkJCQkJICBOaWhJb0Vycm9ySGFuZGxlciBlcnJvcl9oYW5kbGVyLAotIAkJCQkJICB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHZvaWQgICAgICAgICAgbmloX2lvX3NodXRkb3duICAgICAgICAgICAgKE5paElvICppbyk7Ci0gaW50ICAgICAgICAgICBuaWhfaW9fZGVzdHJveSAgICAgICAgICAgICAoTmloSW8gKmlvKTsKLSAKLUBAIC0zMTksMTQgKzMxOSwxNCBAQAotIAotIGNoYXIgKiAgICAgICAgbmloX2lvX3JlYWQgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgTmloSW8gKmlvLAotIAkJCQkJICBzaXplX3QgKmxlbikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBpbnQgICAgICAgICAgIG5paF9pb193cml0ZSAgICAgICAgICAgICAgIChOaWhJbyAqaW8sIGNvbnN0IGNoYXIgKnN0ciwKLSAJCQkJCSAgc2l6ZV90IGxlbikKLSAJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICAgICAgbmloX2lvX2dldCAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgTmloSW8gKmlvLAotIAkJCQkJICBjb25zdCBjaGFyICpkZWxpbSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgICAgIG5paF9pb19wcmludGYgICAgICAgICAgICAgIChOaWhJbyAqaW8sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotIAlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvdGVzdF9vdXRwdXQuaAotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdF9vdXRwdXQuaAotQEAgLTYxLDEwICs2MSwxMCBAQAotIAotIC8qKgotICAqIFRFU1RfRkVBVFVSRToKLS0gKiBAX2ZlYXQ6IG5hbWUgb2YgZnVuY3Rpb24gZmVhdHVyZSBiZWluZyB0ZXN0ZWQuCi0rICogQF9mZWF0OiBuYW1lIG9mIGZ1bmN0aW9uIG9yIGdyb3VwIGZlYXR1cmUgYmVpbmcgdGVzdGVkLgotICAqCi0tICogT3V0cHV0IGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgYSBzdWItdGVzdCBvZiBhIGZ1bmN0aW9uIGlzIGJlaW5nCi0tICogcGVyZm9ybWVkLCBzcGVjaWZpY2FsbHkgdGhlIGZlYXR1cmUgbmFtZWQgX2ZlYXQuCi0rICogT3V0cHV0IGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgYSBzdWItdGVzdCBvZiBhIGZ1bmN0aW9uIG9yCi0rICogZ3JvdXAgaXMgYmVpbmcgcGVyZm9ybWVkLCBzcGVjaWZpY2FsbHkgdGhlIGZlYXR1cmUgbmFtZWQgX2ZlYXQuCi0gICoqLwotICNkZWZpbmUgVEVTVF9GRUFUVVJFKF9mZWF0KSBcCi0gCXByaW50ZiAoIi4uLiVzXG4iLCBfZmVhdCk7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL2Vycm9yLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL2Vycm9yLmgKLUBAIC0xLDcgKzEsNyBAQAotIC8qIGxpYm5paAotICAqCi0tICogQ29weXJpZ2h0IMKpIDIwMDkgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBDYW5vbmljYWwgTHRkLgotKyAqIENvcHlyaWdodCDCqSAyMDExIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgQ2Fub25pY2FsIEx0ZC4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGFzCi1AQCAtMTExLDcgKzExMSw3IEBACi0gICogQG1lc3NhZ2U6IGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UuCi0gICoKLSAgKiBSYWlzZXMgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZGV0YWlscyBpbiB0aGUgY3VycmVudCBlcnJvciBjb250ZXh0LAotLSAqIGlmIGFuIHVuaGFuZGxlZCBlcnJvciBhbHJlYWR5IGV4aXN0cyB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZW1taXR0ZWQKLSsgKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQKLSAgKiB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5c3RlbTsgeW91IHNob3VsZCB0cnkgdG8gYXZvaWQgdGhpcy4KLSAgKgotICAqIEBtZXNzYWdlIHNob3VsZCBiZSBhIHN0YXRpYyBzdHJpbmcsIGFzIGl0IHdpbGwgbm90IGJlIGZyZWVkIHdoZW4gdGhlCi1AQCAtMTI2LDcgKzEyNiw3IEBACi0gICogQGZvcm1hdDogZm9ybWF0IHN0cmluZyBmb3IgaHVtYW4tcmVhZGFibGUgbWVzc2FnZS4KLSAgKgotICAqIFJhaXNlcyBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBkZXRhaWxzIGluIHRoZSBjdXJyZW50IGVycm9yIGNvbnRleHQsCi0tICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbW1pdHRlZAotKyAqIGlmIGFuIHVuaGFuZGxlZCBlcnJvciBhbHJlYWR5IGV4aXN0cyB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZW1pdHRlZAotICAqIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtOyB5b3Ugc2hvdWxkIHRyeSB0byBhdm9pZCB0aGlzLgotICAqCi0gICogVGhlIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgZm9yIHRoZSBlcnJvciBpcyBwYXJzZWQgYWNjb3JkaW5nIHRvIEBmb3JtYXQsCi1AQCAtMTQwLDcgKzE0MCw3IEBACi0gICogbmloX2Vycm9yX3JhaXNlX3N5c3RlbToKLSAgKgotICAqIFJhaXNlcyBhbiBlcnJvciB3aXRoIGRldGFpbHMgdGFrZW4gZnJvbSB0aGUgY3VycmVudCB2YWx1ZSBvZiBlcnJubywKLS0gKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtbWl0dGVkCi0rICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbWl0dGVkCi0gICogdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW07IHlvdSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoaXMuCi0gICoqLwotICNkZWZpbmUgbmloX2Vycm9yX3JhaXNlX3N5c3RlbSgpIFwKLUBAIC0xNjIsNyArMTYyLDcgQEAKLSAgKiBAZXJyb3I6IGV4aXN0aW5nIG9iamVjdCB0byByYWlzZS4KLSAgKgotICAqIFJhaXNlcyB0aGUgZXhpc3RpbmcgZXJyb3Igb2JqZWN0IGluIHRoZSBjdXJyZW50IGVycm9yIGNvbnRleHQsCi0tICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbW1pdHRlZAotKyAqIGlmIGFuIHVuaGFuZGxlZCBlcnJvciBhbHJlYWR5IGV4aXN0cyB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZW1pdHRlZAotICAqIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtOyB5b3Ugc2hvdWxkIHRyeSB0byBhdm9pZCB0aGlzLgotICAqCi0gICogVGhpcyBpcyBub3JtYWxseSB1c2VkIHRvIHJhaXNlIGEgdGFrZW4gZXJyb3IgdGhhdCBoYXMgbm90IGJlZW4gaGFuZGxlZCwKLUBAIC0xODIsNyArMTgyLDcgQEAKLSAgKiBAbWVzc2FnZTogaHVtYW4tcmVhZGFibGUgbWVzc2FnZS4KLSAgKgotICAqIFJhaXNlcyBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBkZXRhaWxzIGluIHRoZSBjdXJyZW50IGVycm9yIGNvbnRleHQsCi0tICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbW1pdHRlZAotKyAqIGlmIGFuIHVuaGFuZGxlZCBlcnJvciBhbHJlYWR5IGV4aXN0cyB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZW1pdHRlZAotICAqIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtOyB5b3Ugc2hvdWxkIHRyeSB0byBhdm9pZCB0aGlzLgotICAqCi0gICogV2lsbCByZXR1cm4gZnJvbSB0aGUgY3VycmVudCBmdW5jdGlvbiB3aXRoIEByZXR2YWwsIHdoaWNoIG1heSBiZSBsZWZ0Ci1AQCAtMTk5LDcgKzE5OSw3IEBACi0gICogQHJldHZhbDogcmV0dXJuIHZhbHVlIGZvciBmdW5jdGlvbi4KLSAgKgotICAqIFJhaXNlcyBhbiBlcnJvciB3aXRoIGRldGFpbHMgdGFrZW4gZnJvbSB0aGUgY3VycmVudCB2YWx1ZSBvZiBlcnJubywKLS0gKiBpZiBhbiB1bmhhbmRsZWQgZXJyb3IgYWxyZWFkeSBleGlzdHMgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGVtbWl0dGVkCi0rICogaWYgYW4gdW5oYW5kbGVkIGVycm9yIGFscmVhZHkgZXhpc3RzIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBlbWl0dGVkCi0gICogdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW07IHlvdSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoaXMuCi0gICoKLSAgKiBXaWxsIHJldHVybiBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdpdGggQHJldHZhbCwgd2hpY2ggbWF5IGJlIGxlZnQKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvc3RyaW5nLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloL3N0cmluZy5oCi1AQCAtMzUsNjAgKzM1LDYwIEBACi0gTklIX0JFR0lOX0VYVEVSTgotIAotIGNoYXIgKiBuaWhfc3ByaW50ZiAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLS0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSwgd2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSwgd2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqIG5paF92c3ByaW50ZiAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwKLSAJCQkgICAgIHZhX2xpc3QgYXJncykKLS0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSwgd2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSwgd2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqIG5paF9zdHJkdXAgICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnN0cikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogbmloX3N0cm5kdXAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiBuaWhfc3RyY2F0ICAgICAgICAgICAoY2hhciAqKnN0ciwgY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpzcmMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqIG5paF9zdHJuY2F0ICAgICAgICAgIChjaGFyICoqc3RyLCBjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnNyYywKLSAJCQkgICAgIHNpemVfdCBsZW4pCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqIG5paF9zdHJjYXRfc3ByaW50ZiAgIChjaGFyICoqc3RyLCBjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLS0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSwgd2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSwgd2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqIG5paF9zdHJjYXRfdnNwcmludGYgIChjaGFyICoqc3RyLCBjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLS0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCAwKSwgd2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCAwKSwgd2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqKm5paF9zdHJfc3BsaXQgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnN0ciwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKmRlbGltLCBpbnQgcmVwZWF0KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKipuaWhfc3RyX2FycmF5X25ldyAgICAoY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKipuaWhfc3RyX2FycmF5X2FkZCAgICAoY2hhciAqKiphcnJheSwgY29uc3Qgdm9pZCAqcGFyZW50LCBzaXplX3QgKmxlbiwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKnN0cikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICoqbmloX3N0cl9hcnJheV9hZGRuICAgKGNoYXIgKioqYXJyYXksIGNvbnN0IHZvaWQgKnBhcmVudCwgc2l6ZV90ICpsZW4sCi0gCQkJICAgICBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBzdHJsZW4pCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqKm5paF9zdHJfYXJyYXlfYWRkcCAgIChjaGFyICoqKmFycmF5LCBjb25zdCB2b2lkICpwYXJlbnQsIHNpemVfdCAqbGVuLAotIAkJCSAgICAgdm9pZCAqcHRyKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKipuaWhfc3RyX2FycmF5X2NvcHkgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBzaXplX3QgKmxlbiwKLSAJCQkgICAgIGNoYXIgKiBjb25zdCAqYXJyYXkpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqKm5paF9zdHJfYXJyYXlfYXBwZW5kIChjaGFyICoqKmFycmF5LCBjb25zdCB2b2lkICpwYXJlbnQsIHNpemVfdCAqbGVuLAotIAkJCSAgICAgY2hhciAqIGNvbnN0ICphcmdzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiBuaWhfc3RyX3dyYXAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCi0gCQkgICAgICAgICAgICAgc2l6ZV90IGZpcnN0X2luZGVudCwgc2l6ZV90IGluZGVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBzaXplX3QgbmloX3N0cl9zY3JlZW5fd2lkdGggKHZvaWQpOwotIGNoYXIgKiBuaWhfc3RyX3NjcmVlbl93cmFwICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpzdHIsCi0gCQkJICAgICBzaXplX3QgZmlyc3RfaW5kZW50LCBzaXplX3QgaW5kZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3N0cmluZy5jCi0rKysgbGlibmloLTEuMC4zL25paC9zdHJpbmcuYwotQEAgLTQwNSw3ICs0MDUsNyBAQAotIAkJY29uc3QgY2hhciAgKnB0cjsKLSAKLSAJCS8qIFNraXAgaW5pdGlhbCBkZWxpbWl0ZXJzICovCi0tCQl3aGlsZSAocmVwZWF0ICYmIHN0cmNociAoZGVsaW0sICpzdHIpKQotKwkJd2hpbGUgKHJlcGVhdCAmJiAqc3RyICYmIHN0cmNociAoZGVsaW0sICpzdHIpKQotIAkJCXN0cisrOwotIAotIAkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSB0b2tlbiAqLwotQEAgLTQxMyw2ICs0MTMsMTMgQEAKLSAJCXdoaWxlICgqc3RyICYmICghIHN0cmNociAoZGVsaW0sICpzdHIpKSkKLSAJCQlzdHIrKzsKLSAKLSsJCS8qIERvbid0IGNyZWF0ZSBhbiBlbXB0eSBzdHJpbmcgYXJyYXkgZWxlbWVudCBpbiByZXBlYXQKLSsJCSAqIG1vZGUgaWYgdGhlcmUgaXMgbm8gdG9rZW4gKGFzIGEgcmVzdWx0IG9mIGEKLSsJCSAqIGR1cGxpY2F0ZWQgZGVsaW1pdGVyIGNoYXJhY3RlcikuCi0rCQkgKi8KLSsJCWlmIChyZXBlYXQgJiYgKHN0ciA9PSBwdHIpKQotKwkJCWNvbnRpbnVlOwotKwotIAkJaWYgKCEgbmloX3N0cl9hcnJheV9hZGRuICgmYXJyYXksIHBhcmVudCwgJmxlbiwKLSAJCQkJCSAgcHRyLCBzdHIgLSBwdHIpKSB7Ci0gCQkJbmloX2ZyZWUgKGFycmF5KTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvZmlsZS5oCi0rKysgbGlibmloLTEuMC4zL25paC9maWxlLmgKLUBAIC04Miw3ICs4Miw3IEBACi0gCi0gY2hhciAqbmloX2ZpbGVfcmVhZCAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnBhdGgsCi0gCQkJICAgICBzaXplX3QgKmxlbmd0aCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSB2b2lkICpuaWhfZmlsZV9tYXAgICAgICAgICAgKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywgc2l6ZV90ICpsZW5ndGgpCi0gCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvdGVzdHMvdGVzdF9vcHRpb24uYwotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdHMvdGVzdF9vcHRpb24uYwotQEAgLTE1NzQsNyArMTU3NCw3IEBACi0gCQlvdXRwdXQgPSB0bXBmaWxlICgpOwotIAkJVEVTVF9DSElMRCAocGlkKSB7Ci0gCQkJVEVTVF9ESVZFUlRfU1RET1VUIChvdXRwdXQpIHsKLS0JCQkJY2hhciAqKmFyZ3M7Ci0rCQkJCWNoYXIgKiphcmdzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwotIAotIAkJCQlhcmdzID0gbmloX29wdGlvbl9wYXJzZXIgKE5VTEwsIGFyZ2MsIGFyZ3YsCi0gCQkJCQkJCSAgb3B0aW9ucywgRkFMU0UpOwotQEAgLTE2NTIsNyArMTY1Miw3IEBACi0gCQkJdW5zZXRlbnYgKCJDT0xVTU5TIik7Ci0gCi0gCQkJVEVTVF9ESVZFUlRfU1RET1VUIChvdXRwdXQpIHsKLS0JCQkJY2hhciAqKmFyZ3M7Ci0rCQkJCWNoYXIgKiphcmdzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwotIAotIAkJCQlhcmdzID0gbmloX29wdGlvbl9wYXJzZXIgKE5VTEwsIGFyZ2MsIGFyZ3YsCi0gCQkJCQkJCSAgb3B0aW9ucywgRkFMU0UpOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0cy90ZXN0X2xvZ2dpbmcuYwotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdHMvdGVzdF9sb2dnaW5nLmMKLUBAIC0zMSw3ICszMSw3IEBACi0gI2luY2x1ZGUgPG5paC9tYWluLmg+Ci0gCi0gCi0tZXh0ZXJuIGNoYXIgKl9fYWJvcnRfbXNnIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7Ci0rZXh0ZXJuIGNoYXIgKl9fbmloX2Fib3J0X21zZzsKLSAKLSBzdGF0aWMgTmloTG9nTGV2ZWwgbGFzdF9wcmlvcml0eSA9IE5JSF9MT0dfVU5LTk9XTjsKLSBzdGF0aWMgY2hhciAqICAgICAgbGFzdF9tZXNzYWdlID0gTlVMTDsKLUBAIC0xNTYsNjggKzE1Niw2MyBAQAotIAl9Ci0gCi0gCi0tCS8qIENoZWNrIHRoYXQgYSBmYXRhbCBtZXNzYWdlIGlzIGFsc28gc3RvcmVkIGluIHRoZSBnbGliYyBfX2Fib3J0X21zZwotKwkvKiBDaGVjayB0aGF0IGEgZmF0YWwgbWVzc2FnZSBpcyBhbHNvIHN0b3JlZCBpbiB0aGUgX19uaWhfYWJvcnRfbXNnCi0gCSAqIHZhcmlhYmxlLgotIAkgKi8KLS0JaWYgKCZfX2Fib3J0X21zZykgewotLQkJVEVTVF9GRUFUVVJFICgid2l0aCBmYXRhbCBtZXNzYWdlIik7Ci0tCQlURVNUX0FMTE9DX0ZBSUwgewotLQkJCV9fYWJvcnRfbXNnID0gTlVMTDsKLS0JCQlsYXN0X3ByaW9yaXR5ID0gTklIX0xPR19VTktOT1dOOwotLQkJCWxhc3RfbWVzc2FnZSA9IE5VTEw7Ci0tCi0tCQkJcmV0ID0gbmloX2xvZ19tZXNzYWdlIChOSUhfTE9HX0ZBVEFMLAotLQkJCQkJICAgICAgICJtZXNzYWdlIHdpdGggJXMgJWQgZm9ybWF0dGluZyIsCi0tCQkJCQkgICAgICAgInNvbWUiLCAyMCk7Ci0tCi0tCQkJVEVTVF9FUSAocmV0LCAwKTsKLS0JCQlURVNUX0VRIChsYXN0X3ByaW9yaXR5LCBOSUhfTE9HX0ZBVEFMKTsKLS0JCQlURVNUX0VRX1NUUiAobGFzdF9tZXNzYWdlLCAibWVzc2FnZSB3aXRoIHNvbWUgMjAgZm9ybWF0dGluZyIpOwotLQotLQkJCVRFU1RfTkVfUCAoX19hYm9ydF9tc2csIE5VTEwpOwotLQkJCVRFU1RfQUxMT0NfUEFSRU5UIChfX2Fib3J0X21zZywgTlVMTCk7Ci0tCQkJVEVTVF9FUV9TVFIgKF9fYWJvcnRfbXNnLCAibWVzc2FnZSB3aXRoIHNvbWUgMjAgZm9ybWF0dGluZyIpOwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIGZhdGFsIG1lc3NhZ2UiKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCV9fbmloX2Fib3J0X21zZyA9IE5VTEw7Ci0rCQlsYXN0X3ByaW9yaXR5ID0gTklIX0xPR19VTktOT1dOOwotKwkJbGFzdF9tZXNzYWdlID0gTlVMTDsKLSAKLS0JCQlmcmVlIChsYXN0X21lc3NhZ2UpOwotLQkJfQotKwkJcmV0ID0gbmloX2xvZ19tZXNzYWdlIChOSUhfTE9HX0ZBVEFMLAotKwkJCQkibWVzc2FnZSB3aXRoICVzICVkIGZvcm1hdHRpbmciLAotKwkJCQkic29tZSIsIDIwKTsKLSAKLSsJCVRFU1RfRVEgKHJldCwgMCk7Ci0rCQlURVNUX0VRIChsYXN0X3ByaW9yaXR5LCBOSUhfTE9HX0ZBVEFMKTsKLSsJCVRFU1RfRVFfU1RSIChsYXN0X21lc3NhZ2UsICJtZXNzYWdlIHdpdGggc29tZSAyMCBmb3JtYXR0aW5nIik7Ci0gCi0tCQkvKiBDaGVjayB0aGF0IGEgZmF0YWwgbWVzc2FnZSBjYW4gc2FmZWx5IG92ZXJ3cml0ZSBvbmUgYWxyZWFkeSBzdG9yZWQKLS0JCSAqIGluIHRoZSBnbGliYyBfX2Fib3J0X21zZyB2YXJpYWJsZS4KLS0JCSAqLwotLQkJVEVTVF9GRUFUVVJFICgid2l0aCBzZWNvbmQgZmF0YWwgbWVzc2FnZSIpOwotLQkJVEVTVF9BTExPQ19GQUlMIHsKLS0JCQlURVNUX0FMTE9DX1NBRkUgewotLQkJCQltc2cgPSBuaWhfc3RyZHVwIChOVUxMLCAidGVzdCIpOwotLQkJCX0KLS0KLS0JCQlfX2Fib3J0X21zZyA9IG1zZzsKLS0JCQlURVNUX0ZSRUVfVEFHIChtc2cpOwotLQotLQkJCWxhc3RfcHJpb3JpdHkgPSBOSUhfTE9HX1VOS05PV047Ci0tCQkJbGFzdF9tZXNzYWdlID0gTlVMTDsKLS0KLS0JCQlyZXQgPSBuaWhfbG9nX21lc3NhZ2UgKE5JSF9MT0dfRkFUQUwsCi0tCQkJCQkgICAgICAgIm1lc3NhZ2Ugd2l0aCAlcyAlZCBmb3JtYXR0aW5nIiwKLS0JCQkJCSAgICAgICAic29tZSIsIDIwKTsKLS0KLS0JCQlURVNUX0VRIChyZXQsIDApOwotLQkJCVRFU1RfRVEgKGxhc3RfcHJpb3JpdHksIE5JSF9MT0dfRkFUQUwpOwotLQkJCVRFU1RfRVFfU1RSIChsYXN0X21lc3NhZ2UsICJtZXNzYWdlIHdpdGggc29tZSAyMCBmb3JtYXR0aW5nIik7Ci0tCi0tCQkJVEVTVF9GUkVFIChtc2cpOwotLQotLQkJCVRFU1RfTkVfUCAoX19hYm9ydF9tc2csIE5VTEwpOwotLQkJCVRFU1RfQUxMT0NfUEFSRU5UIChfX2Fib3J0X21zZywgTlVMTCk7Ci0tCQkJVEVTVF9FUV9TVFIgKF9fYWJvcnRfbXNnLCAibWVzc2FnZSB3aXRoIHNvbWUgMjAgZm9ybWF0dGluZyIpOwotKwkJVEVTVF9ORV9QIChfX25paF9hYm9ydF9tc2csIE5VTEwpOwotKwkJVEVTVF9BTExPQ19QQVJFTlQgKF9fbmloX2Fib3J0X21zZywgTlVMTCk7Ci0rCQlURVNUX0VRX1NUUiAoX19uaWhfYWJvcnRfbXNnLCAibWVzc2FnZSB3aXRoIHNvbWUgMjAgZm9ybWF0dGluZyIpOwotIAotLQkJCWZyZWUgKGxhc3RfbWVzc2FnZSk7Ci0tCQl9Ci0tCX0gZWxzZSB7Ci0tCQlwcmludGYgKCJTS0lQOiBfX2Fib3J0X21zZyBub3QgYXZhaWxhYmxlXG4iKTsKLSsJCWZyZWUgKGxhc3RfbWVzc2FnZSk7Ci0gCX0KLSAKLSAKLSsJLyogQ2hlY2sgdGhhdCBhIGZhdGFsIG1lc3NhZ2UgY2FuIHNhZmVseSBvdmVyd3JpdGUgb25lIGFscmVhZHkgc3RvcmVkCi0rCSAqIGluIHRoZSBfX25paF9hYm9ydF9tc2cgdmFyaWFibGUuCi0rCSAqLwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHNlY29uZCBmYXRhbCBtZXNzYWdlIik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlURVNUX0FMTE9DX1NBRkUgewotKwkJCW1zZyA9IG5paF9zdHJkdXAgKE5VTEwsICJ0ZXN0Iik7Ci0rCQl9Ci0rCi0rCQlfX25paF9hYm9ydF9tc2cgPSBtc2c7Ci0rCQlURVNUX0ZSRUVfVEFHIChtc2cpOwotKwotKwkJbGFzdF9wcmlvcml0eSA9IE5JSF9MT0dfVU5LTk9XTjsKLSsJCWxhc3RfbWVzc2FnZSA9IE5VTEw7Ci0rCi0rCQlyZXQgPSBuaWhfbG9nX21lc3NhZ2UgKE5JSF9MT0dfRkFUQUwsCi0rCQkJCSJtZXNzYWdlIHdpdGggJXMgJWQgZm9ybWF0dGluZyIsCi0rCQkJCSJzb21lIiwgMjApOwotKwotKwkJVEVTVF9FUSAocmV0LCAwKTsKLSsJCVRFU1RfRVEgKGxhc3RfcHJpb3JpdHksIE5JSF9MT0dfRkFUQUwpOwotKwkJVEVTVF9FUV9TVFIgKGxhc3RfbWVzc2FnZSwgIm1lc3NhZ2Ugd2l0aCBzb21lIDIwIGZvcm1hdHRpbmciKTsKLSsKLSsJCVRFU1RfRlJFRSAobXNnKTsKLSsKLSsJCVRFU1RfTkVfUCAoX19uaWhfYWJvcnRfbXNnLCBOVUxMKTsKLSsJCVRFU1RfQUxMT0NfUEFSRU5UIChfX25paF9hYm9ydF9tc2csIE5VTEwpOwotKwkJVEVTVF9FUV9TVFIgKF9fbmloX2Fib3J0X21zZywgIm1lc3NhZ2Ugd2l0aCBzb21lIDIwIGZvcm1hdHRpbmciKTsKLSsKLSsJCWZyZWUgKGxhc3RfbWVzc2FnZSk7Ci0rCX0KLSsKLSAJLyogQ2hlY2sgdGhhdCB0aGUgbmloX2RlYnVnIG1hY3JvIHdyYXBzIHRoZSBjYWxsIHByb3Blcmx5IGFuZAotIAkgKiBpbmNsdWRlcyB0aGUgZnVuY3Rpb24gaW4gd2hpY2ggdGhlIG1lc3NhZ2Ugb2NjdXJyZWQuCi0gCSAqLwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0cy90ZXN0X2hhc2guYwotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdHMvdGVzdF9oYXNoLmMKLUBAIC00NzAsNyArNDcwLDggQEAKLSB0ZXN0X2xvb2t1cCAodm9pZCkKLSB7Ci0gCU5paEhhc2ggKmhhc2g7Ci0tCU5paExpc3QgKmVudHJ5MSwgKmVudHJ5MiwgKmVudHJ5MywgKnB0cjsKLSsJTmloTGlzdCAqZW50cnkxLCAqZW50cnkyLCAqcHRyOwotKwlOaWhMaXN0ICplbnRyeTMgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gCi0gCVRFU1RfRlVOQ1RJT04gKCJuaWhfaGFzaF9sb29rdXAiKTsKLSAJaGFzaCA9IG5paF9oYXNoX3N0cmluZ19uZXcgKE5VTEwsIDApOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0cy90ZXN0X21haW4uYwotKysrIGxpYm5paC0xLjAuMy9uaWgvdGVzdHMvdGVzdF9tYWluLmMKLUBAIC00NTcsNyArNDU3LDcgQEAKLSB0ZXN0X21haW5fbG9vcCAodm9pZCkKLSB7Ci0gCU5paE1haW5Mb29wRnVuYyAqZnVuYzsKLS0JTmloVGltZXIgICAgICAgICp0aW1lcjsKLSsJTmloVGltZXIgICAgICAgICp0aW1lciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLSAJaW50ICAgICAgICAgICAgICByZXQ7Ci0gCi0gCS8qIENoZWNrIHRoYXQgd2UgY2FuIHJ1biB0aHJvdWdoIHRoZSBtYWluIGxvb3AsIGFuZCB0aGF0IHRoZQotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC90ZXN0cy90ZXN0X3dhdGNoLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL3Rlc3RzL3Rlc3Rfd2F0Y2guYwotQEAgLTIsOCArMiw4IEBACi0gICoKLSAgKiB0ZXN0X3dhdGNoLmMgLSB0ZXN0IHN1aXRlIGZvciBuaWgvd2F0Y2guYwotICAqCi0tICogQ29weXJpZ2h0IMKpIDIwMDkgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLS0gKiBDb3B5cmlnaHQgwqkgMjAwOSBDYW5vbmljYWwgTHRkLgotKyAqIENvcHlyaWdodCDCqSAyMDExIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0rICogQ29weXJpZ2h0IMKpIDIwMTEgQ2Fub25pY2FsIEx0ZC4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGFzCi1AQCAtMzksNiArMzksOCBAQAotICNpbmNsdWRlIDxuaWgvZXJyb3IuaD4KLSAjaW5jbHVkZSA8bmloL2xvZ2dpbmcuaD4KLSAKLSsvKiBSZWFkICJUaGUgSGl0Y2hoaWtlcnMgR3VpZGUgdG8gdGhlIEdhbGF4eSIgKi8KLSsjZGVmaW5lIEZJTFRFUl9WQUxVRSA0MgotIAotIHN0YXRpYyBpbnQKLSBteV9maWx0ZXIgKHZvaWQgICAgICAgKmRhdGEsCi1AQCAtNTQsNiArNTYsMjYgQEAKLSAJcmV0dXJuIEZBTFNFOwotIH0KLSAKLSsvKiBTZXQgYnkgbXlfZmlsdGVyMiAoKSBzbyBpdCBrbm93cyBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotK3N0YXRpYyBpbnQgbXlfZmlsdGVyMl9jYWxsZWQgPSAwOwotKwotK3N0YXRpYyBpbnQKLStteV9maWx0ZXIyIChpbnQgICAgICAgKnZhbHVlLAotKwkgICBjb25zdCBjaGFyICpwYXRoLAotKwkgICBpbnQgICAgICAgICBpc19kaXIpCi0rewotKwkvKiB3ZSBvbmx5IHdhbnQgdG8gdG9nZ2xlIHRoZSB2YWx1ZSBvbmNlICovCi0rCWlmIChteV9maWx0ZXIyX2NhbGxlZCkKLSsJCXJldHVybiBUUlVFOwotKwotKwlteV9maWx0ZXIyX2NhbGxlZCA9IDE7Ci0rCi0rCW5paF9hc3NlcnQgKHZhbHVlICYmICp2YWx1ZSA9PSBGSUxURVJfVkFMVUUpOwotKwkqdmFsdWUgPSAwOwotKwotKwlyZXR1cm4gRkFMU0U7Ci0rfQotKwotIHN0YXRpYyBpbnQgY3JlYXRlX2NhbGxlZCA9IDA7Ci0gc3RhdGljIGludCBtb2RpZnlfY2FsbGVkID0gMDsKLSBzdGF0aWMgaW50IGRlbGV0ZV9jYWxsZWQgPSAwOwotQEAgLTU1Myw2ICs1NzUsNDQgQEAKLSAJCW5paF9mcmVlICh3YXRjaCk7Ci0gCX0KLSAKLSsJLyogRW5zdXJlIHRoZSBmaWxlIGZpbHRlciBnZXRzIHBhc3NlZCB0aGUgY29ycmVjdCBkYXRhIHBvaW50ZXIuCi0rCSAqLwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIGZpbHRlciBhbmQgZGF0YSIpOwotKwotKwkvKiBFbnN1cmUgd2UgaGF2ZSBhIG5ldyBkaXJlY3RvcnkgKi8KLSsJVEVTVF9GSUxFTkFNRSAoZGlybmFtZSk7Ci0rCW1rZGlyIChkaXJuYW1lLCAwNzU1KTsKLSsKLSsJLyogQ3JlYXRlIGEgc2luZ2xlIGZpbGUgKi8KLSsJc3RyY3B5IChmaWxlbmFtZSwgZGlybmFtZSk7Ci0rCXN0cmNhdCAoZmlsZW5hbWUsICIvZm9vIik7Ci0rCi0rCWZkID0gZm9wZW4gKGZpbGVuYW1lLCAidyIpOwotKwlmcHJpbnRmIChmZCwgInRlc3RcbiIpOwotKwlmY2xvc2UgKGZkKTsKLSsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWludCB3YXRjaF9kYXRhID0gRklMVEVSX1ZBTFVFOwotKwotKwkJLyogUmVzZXQgcmVxdWlyZWQgdG8gYXBwZWFzZSBURVNUX0FMTE9DX0ZBSUwgKi8KLSsJCW15X2ZpbHRlcjJfY2FsbGVkID0gMDsKLSsKLSsJCXdhdGNoID0gbmloX3dhdGNoX25ldyAoTlVMTCwgZGlybmFtZSwKLSsJCQkJVFJVRSwgVFJVRSwKLSsJCQkJKE5paEZpbGVGaWx0ZXIpbXlfZmlsdGVyMiwKLSsJCQkJTlVMTCwgTlVMTCwgTlVMTCwKLSsJCQkJJndhdGNoX2RhdGEpOwotKwotKwkJVEVTVF9ORV9QICh3YXRjaCwgTlVMTCk7Ci0rCi0rCQkvKiBFbnN1cmUgdGhlIGZpbHRlciB3YXMgY2FsbGVkIGFuZCBjaGFuZ2VkIHRoZSB2YWx1ZSAqLwotKwotKwkJVEVTVF9ORSAobXlfZmlsdGVyMl9jYWxsZWQsIDApOwotKwkJVEVTVF9FUSAod2F0Y2hfZGF0YSwgMCk7Ci0rCi0rCQluaWhfZnJlZSAod2F0Y2gpOwotKwl9Ci0rCi0gCXN0cmNweSAoZmlsZW5hbWUsIGRpcm5hbWUpOwotIAlzdHJjYXQgKGZpbGVuYW1lLCAiL2JhciIpOwotIAljaG1vZCAoZmlsZW5hbWUsIDA3NTUpOwotQEAgLTk0NiwxMyArMTAwNiw4MiBAQAotIAluaWhfZXJyb3JfaW5pdCAoKTsKLSAKLSAJVEVTVF9GSUxFTkFNRSAoZGlybmFtZSk7Ci0tCW1rZGlyIChkaXJuYW1lLCAwNzU1KTsKLSsJVEVTVF9FUSAobWtkaXIgKGRpcm5hbWUsIDA3NTUpLCAwKTsKLSAKLS0Jd2F0Y2ggPSBuaWhfd2F0Y2hfbmV3IChOVUxMLCBkaXJuYW1lLCBUUlVFLCBUUlVFLCBteV9maWx0ZXIsCi0tCQkJICAgICAgIG15X2NyZWF0ZV9oYW5kbGVyLCBteV9tb2RpZnlfaGFuZGxlciwKLSsJVEVTVF9GRUFUVVJFICgid2l0aCB3YXRjaGVkIGZpbGUiKTsKLSsJc3RyY3B5IChmaWxlbmFtZSwgZGlybmFtZSk7Ci0rCXN0cmNhdCAoZmlsZW5hbWUsICIvZm9vIik7Ci0rCi0rCS8qIENyZWF0ZSBmaWxlIGZpcnN0IHNpbmNlIHdlIGRvbid0IHNldCBhIGNyZWF0ZSBoYW5kbGVyIG9uIHRoZQotKwkgKiB3YXRjaC4KLSsJICovCi0rCWZkID0gZm9wZW4gKGZpbGVuYW1lLCAidyIpOwotKwlmcHJpbnRmIChmZCwgImJhclxuIik7Ci0rCWZjbG9zZSAoZmQpOwotKwotKwljcmVhdGVfY2FsbGVkID0gMDsKLSsJbW9kaWZ5X2NhbGxlZCA9IDA7Ci0rCWRlbGV0ZV9jYWxsZWQgPSAwOwotKwlsb2dnZXJfY2FsbGVkID0gMDsKLSsJbGFzdF9wYXRoICA9IE5VTEw7Ci0rCWxhc3Rfd2F0Y2ggPSBOVUxMOwotKwlsYXN0X2RhdGEgID0gTlVMTDsKLSsKLSsJd2F0Y2ggPSBuaWhfd2F0Y2hfbmV3IChOVUxMLCBmaWxlbmFtZSwgRkFMU0UsIEZBTFNFLCBOVUxMLAotKwkJCSAgICAgICBOVUxMLCBteV9tb2RpZnlfaGFuZGxlciwKLSAJCQkgICAgICAgbXlfZGVsZXRlX2hhbmRsZXIsICZ3YXRjaCk7Ci0rCVRFU1RfTkVfUCAod2F0Y2gsIE5VTEwpOwotKwotKwkvKiBOb3csIG1vZGlmeSB0aGUgZXhpc3RpbmcgZmlsZSB0byB0cmlnZ2VyIHRoZSBtb2RpZnkgaGFuZGxlci4gKi8KLSsJZmQgPSBmb3BlbiAoZmlsZW5hbWUsICJhKyIpOwotKwlmcHJpbnRmIChmZCwgImJhelxuIik7Ci0rCWZjbG9zZSAoZmQpOwotKwotKwluZmRzID0gMDsKLSsJRkRfWkVSTyAoJnJlYWRmZHMpOwotKwlGRF9aRVJPICgmd3JpdGVmZHMpOwotKwlGRF9aRVJPICgmZXhjZXB0ZmRzKTsKLSsKLSsJbmloX2lvX3NlbGVjdF9mZHMgKCZuZmRzLCAmcmVhZGZkcywgJndyaXRlZmRzLCAmZXhjZXB0ZmRzKTsKLSsJc2VsZWN0IChuZmRzLCAmcmVhZGZkcywgJndyaXRlZmRzLCAmZXhjZXB0ZmRzLCBOVUxMKTsKLSsJbmloX2lvX2hhbmRsZV9mZHMgKCZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwotKwotKwlURVNUX0VRX1NUUiAod2F0Y2gtPnBhdGgsIGZpbGVuYW1lKTsKLSsKLSsJLyogRW5zdXJlIG5vIHJlZ3Jlc3Npb24gdG8gb2xkIGJlaGF2aW91ciAoTFA6Izc3NzA5NykgKi8KLSsJVEVTVF9ORSAobGFzdF9wYXRoWyBzdHJsZW4obGFzdF9wYXRoKSAtIDEgXSwgJy8nKTsKLSsKLSsJVEVTVF9FUV9TVFIgKGxhc3RfcGF0aCwgZmlsZW5hbWUpOwotKwlURVNUX0VRIChtb2RpZnlfY2FsbGVkLCAxKTsKLSsKLSsJdW5saW5rIChmaWxlbmFtZSk7Ci0rCi0rCW5mZHMgPSAwOwotKwlGRF9aRVJPICgmcmVhZGZkcyk7Ci0rCUZEX1pFUk8gKCZ3cml0ZWZkcyk7Ci0rCUZEX1pFUk8gKCZleGNlcHRmZHMpOwotKwotKwluaWhfaW9fc2VsZWN0X2ZkcyAoJm5mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwotKwlzZWxlY3QgKG5mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsIE5VTEwpOwotKwluaWhfaW9faGFuZGxlX2ZkcyAoJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7Ci0gCi0rCVRFU1RfRVEgKGRlbGV0ZV9jYWxsZWQsIDEpOwotIAotKwlybWRpciAoZmlsZW5hbWUpOwotKwluaWhfZnJlZSAobGFzdF9wYXRoKTsKLSsKLSsJY3JlYXRlX2NhbGxlZCA9IDA7Ci0rCW1vZGlmeV9jYWxsZWQgPSAwOwotKwlkZWxldGVfY2FsbGVkID0gMDsKLSsJbG9nZ2VyX2NhbGxlZCA9IDA7Ci0rCWxhc3RfcGF0aCAgPSBOVUxMOwotKwlsYXN0X3dhdGNoID0gTlVMTDsKLSsJbGFzdF9kYXRhICA9IE5VTEw7Ci0rCi0rCi0rCXdhdGNoID0gbmloX3dhdGNoX25ldyAoTlVMTCwgZGlybmFtZSwgVFJVRSwgVFJVRSwgbXlfZmlsdGVyLAotKwkJCSAgICAgICBteV9jcmVhdGVfaGFuZGxlciwgbXlfbW9kaWZ5X2hhbmRsZXIsCi0rCQkJICAgICAgIG15X2RlbGV0ZV9oYW5kbGVyLCAmd2F0Y2gpOwotIAkvKiBDaGVjayB0aGF0IGNyZWF0aW5nIGEgZmlsZSB3aXRoaW4gdGhlIGRpcmVjdG9yeSBiZWluZyB3YXRjaGVkCi0gCSAqIHJlc3VsdHMgaW4gdGhlIGNyZWF0ZSBoYW5kbGVyIGJlaW5nIGNhbGxlZCwgYW5kIHBhc3NlZCB0aGUgZnVsbAotIAkgKiBwYXRoIG9mIHRoZSBjcmVhdGVkIGZpbGUgdG8gaXQuCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloL3Rlc3RzL3Rlc3Rfc3RyaW5nLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL3Rlc3RzL3Rlc3Rfc3RyaW5nLmMKLUBAIC02MTksNiArNjE5LDIxNSBAQAotIAkJbmloX2ZyZWUgKGFycmF5KTsKLSAJfQotIAotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIG5vIHJlcGVhdCBhbmQgbXVsdGlwbGUgaWRlbnRpY2FsIGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgc3RyaW5nIHN0YXJ0Iik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICJcdFx0dGhpcyBpcyBhIHRlc3QiLCAiIFx0IiwgRkFMU0UpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiA3KTsKLSsJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAidGhpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzNdLCAiaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs0XSwgImEiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs1XSwgInRlc3QiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbNl0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIG5vIHJlcGVhdCBhbmQgbXVsdGlwbGUgZGlmZmVyZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgc3RyaW5nIHN0YXJ0Iik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICIgXHR0aGlzIGlzIGEgdGVzdCIsICIgXHQiLCBGQUxTRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDcpOwotKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMl0sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbM10sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzRdLCAiYSIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzVdLCAidGVzdCIpOwotKwkJVEVTVF9FUV9QIChhcnJheVs2XSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggbm8gcmVwZWF0IGFuZCBtdWx0aXBsZSBpZGVudGljYWwgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyB3aXRoaW4gc3RyaW5nIik7Ci0rCVRFU1RfQUxMT0NfRkFJTCB7Ci0rCQlhcnJheSA9IG5paF9zdHJfc3BsaXQgKE5VTEwsICJ0aGlzIGlzICAgYVx0XHR0ZXN0IiwgIiBcdCIsIEZBTFNFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogOCk7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAidGhpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAiaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsyXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzNdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNF0sICJhIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNV0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs2XSwgInRlc3QiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbN10sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIG5vIHJlcGVhdCBhbmQgbXVsdGlwbGUgZGlmZmVyZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgd2l0aGluIHN0cmluZyIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAidGhpcyBpcyBcblx0YVx0dGVzdCIsICIgXHRcbiIsIEZBTFNFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogNyk7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAidGhpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAiaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsyXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzNdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNF0sICJhIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNV0sICJ0ZXN0Iik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzZdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCBubyByZXBlYXQgYW5kIG11bHRpcGxlIGlkZW50aWNhbCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIGF0IHN0cmluZyBlbmQiKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgInRoaXMgaXMgYSB0ZXN0ICAiLCAiIFx0IiwgRkFMU0UpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiA2KTsKLSsJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAiYSIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzNdLCAidGVzdCIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzRdLCAiIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzVdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCBubyByZXBlYXQgYW5kIG11bHRpcGxlIGRpZmZlcmVudCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIGF0IHN0cmluZyBlbmQiKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgInRoaXMgaXMgYSB0ZXN0IFx0IiwgIiBcdCIsIEZBTFNFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogNik7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAidGhpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAiaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsyXSwgImEiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVszXSwgInRlc3QiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs0XSwgIiIpOwotKwkJVEVTVF9FUV9QIChhcnJheVs1XSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggbm8gcmVwZWF0IGFuZCBtdWx0aXBsZSBpZGVudGljYWwgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyBhdCBiZWdpbm5pbmcsIG1pZGRsZSBhbmQgZW5kIG9mIHN0cmluZyIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiICAgdGhpcyBpc1xuXG5cbmEgdGVzdFx0XHRcdCIsICIgXHRcbiIsIEZBTFNFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogMTIpOwotKwkJZm9yIChpID0gMDsgaSA8IDExOyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzJdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbM10sICJ0aGlzIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNF0sICJpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzVdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbNl0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs3XSwgImEiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs4XSwgInRlc3QiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs5XSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzEwXSwgIiIpOwotKwkJVEVTVF9FUV9QIChhcnJheVsxMV0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIG5vIHJlcGVhdCBhbmQgbXVsdGlwbGUgZGlmZmVyZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgYmVnaW5uaW5nLCBtaWRkbGUgYW5kIGVuZCBvZiBzdHJpbmciKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgIjogXG50aGlzIGlzXHQgXG46YSB0ZXN0OlxuICIsICJcbiA6XHQiLCBGQUxTRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDEzKTsKLSsJCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsyXSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzNdLCAidGhpcyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzRdLCAiaXMiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs1XSwgIiIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzZdLCAiIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbN10sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs4XSwgImEiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVs5XSwgInRlc3QiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxMF0sICIiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxMV0sICIiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbMTJdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSAKLSAJLyogQ2hlY2sgdGhhdCB3ZSBjYW4gc3BsaXQgYSBzdHJpbmcgdHJlYXRpbmcgbXVsdGlwbGUgY29uc2VjdXRpdmUKLSAJICogbWF0Y2hpbmcgY2hhcmFjdGVycyBhcyBhIHNpbmdsZSBzZXBhcmF0b3IgdG8gYmUgc2tpcHBlZC4KLUBAIC02NDUsNiArODU0LDE3NyBAQAotIAkJbmloX2ZyZWUgKGFycmF5KTsKLSAJfQotIAotKwkvKiBDaGVjayB0aGF0IHdlIGNhbiBzcGxpdCBhIHN0cmluZyBjb250YWluaW5nIG11bHRpcGxlCi0rCSAqIG9jY3VyZW5jZXMgb2Ygb25lIG9mIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVycyBhdCB0aGUKLSsJICogYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCi0rCSAqLwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHJlcGVhdCBhbmQgbXVsdGlwbGUgaWRlbnRpY2FsIGFkamFjZW50IGRlbGltaXRlciBjaGFyYWN0ZXJzIGF0IHN0cmluZyBzdGFydCIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiXG5cbmhlbGxvIiwgIiBcdFxyXG4iLCBUUlVFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogMik7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiaGVsbG8iKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbMV0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHJlcGVhdCBhbmQgbXVsdGlwbGUgZGlmZmVyZW50IGFkamFjZW50IGRlbGltaXRlciBjaGFyYWN0ZXJzIGF0IHN0cmluZyBzdGFydCIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiXG5cciBoZWxsbyIsICIgXHRcclxuIiwgVFJVRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDIpOwotKwkJZm9yIChpID0gMDsgaSA8IDE7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgImhlbGxvIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzFdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCByZXBlYXQgYW5kIG11bHRpcGxlIGlkZW50aWNhbCBhZGphY2VudCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIHdpdGhpbiBzdHJpbmciKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgImhlbGxvXG5ccndvcmxkIiwgIiBcdFxuXHIiLCBUUlVFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogMyk7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiaGVsbG8iKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxXSwgIndvcmxkIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzJdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCByZXBlYXQgYW5kIG11bHRpcGxlIGRpZmZlcmVudCBhZGphY2VudCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIHdpdGhpbiBzdHJpbmciKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgImhlbGxvXG5cclx0d29ybGQiLCAiIFx0XG5cciIsIFRSVUUpOwotKwotKwkJaWYgKHRlc3RfYWxsb2NfZmFpbGVkKSB7Ci0rCQkJVEVTVF9FUV9QIChhcnJheSwgTlVMTCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlURVNUX0FMTE9DX1NJWkUgKGFycmF5LCBzaXplb2YgKGNoYXIgKikgKiAzKTsKLSsJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0rCQkJVEVTVF9BTExPQ19QQVJFTlQgKGFycmF5W2ldLCBhcnJheSk7Ci0rCi0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMF0sICJoZWxsbyIpOwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzFdLCAid29ybGQiKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbMl0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHJlcGVhdCBhbmQgbXVsdGlwbGUgaWRlbnRpY2FsIGFkamFjZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgc3RyaW5nIGVuZCIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLCAiaGVsbG9cblxuXG5cblxuXG5cbiIsICIgXHRcclxuIiwgVFJVRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDIpOwotKwkJZm9yIChpID0gMDsgaSA8IDE7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgImhlbGxvIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzFdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSsKLSsJVEVTVF9GRUFUVVJFICgid2l0aCByZXBlYXQgYW5kIG11bHRpcGxlIGRpZmZlcmVudCBhZGphY2VudCBkZWxpbWl0ZXIgIgotKwkJCSJjaGFyYWN0ZXJzIGF0IHN0cmluZyBlbmQiKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwgImhlbGxvIFxyXHRcclx0XG4gIiwgIiBcdFxyXG4iLCBUUlVFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogMik7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiaGVsbG8iKTsKLSsJCVRFU1RfRVFfUCAoYXJyYXlbMV0sIE5VTEwpOwotKwotKwkJbmloX2ZyZWUgKGFycmF5KTsKLSsJfQotKwotKwlURVNUX0ZFQVRVUkUgKCJ3aXRoIHJlcGVhdCBhbmQgbXVsdGlwbGUgaWRlbnRpY2FsIGFkamFjZW50IGRlbGltaXRlciAiCi0rCQkJImNoYXJhY3RlcnMgYXQgYmVnaW5uaW5nLCBtaWRkbGUgYW5kIGVuZCBvZiBzdHJpbmciKTsKLSsJVEVTVF9BTExPQ19GQUlMIHsKLSsJCWFycmF5ID0gbmloX3N0cl9zcGxpdCAoTlVMTCwKLSsJCQkJIiAgICAgICAgaGVsbG9cblxuXG4sICB3b3JsZFxuXG5cbiIsCi0rCQkJCSJcclx0XG4gIiwgVFJVRSk7Ci0rCi0rCQlpZiAodGVzdF9hbGxvY19mYWlsZWQpIHsKLSsJCQlURVNUX0VRX1AgKGFycmF5LCBOVUxMKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCVRFU1RfQUxMT0NfU0laRSAoYXJyYXksIHNpemVvZiAoY2hhciAqKSAqIDQpOwotKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSsJCQlURVNUX0FMTE9DX1BBUkVOVCAoYXJyYXlbaV0sIGFycmF5KTsKLSsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVswXSwgImhlbGxvIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMV0sICIsIik7Ci0rCQlURVNUX0VRX1NUUiAoYXJyYXlbMl0sICJ3b3JsZCIpOwotKwkJVEVTVF9FUV9QIChhcnJheVszXSwgTlVMTCk7Ci0rCi0rCQluaWhfZnJlZSAoYXJyYXkpOwotKwl9Ci0rCi0rCVRFU1RfRkVBVFVSRSAoIndpdGggcmVwZWF0IGFuZCBtdWx0aXBsZSBkaWZmZXJlbnQgYWRqYWNlbnQgZGVsaW1pdGVyICIKLSsJCQkiY2hhcmFjdGVycyBhdCBiZWdpbm5pbmcsIG1pZGRsZSBhbmQgZW5kIG9mIHN0cmluZyIpOwotKwlURVNUX0FMTE9DX0ZBSUwgewotKwkJYXJyYXkgPSBuaWhfc3RyX3NwbGl0IChOVUxMLAotKwkJCQkiXG4gICAgXHJcdGhlbGxvXG5cblxyICwgXG5cdFxyd29ybGRcdCBcclxuIFxuIiwKLSsJCQkJIiBcdFxuXHIiLCBUUlVFKTsKLSsKLSsJCWlmICh0ZXN0X2FsbG9jX2ZhaWxlZCkgewotKwkJCVRFU1RfRVFfUCAoYXJyYXksIE5VTEwpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJVEVTVF9BTExPQ19TSVpFIChhcnJheSwgc2l6ZW9mIChjaGFyICopICogNCk7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotKwkJCVRFU1RfQUxMT0NfUEFSRU5UIChhcnJheVtpXSwgYXJyYXkpOwotKwotKwkJVEVTVF9FUV9TVFIgKGFycmF5WzBdLCAiaGVsbG8iKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsxXSwgIiwiKTsKLSsJCVRFU1RfRVFfU1RSIChhcnJheVsyXSwgIndvcmxkIik7Ci0rCQlURVNUX0VRX1AgKGFycmF5WzNdLCBOVUxMKTsKLSsKLSsJCW5paF9mcmVlIChhcnJheSk7Ci0rCX0KLSAKLSAJLyogQ2hlY2sgdGhhdCB3ZSBjYW4gZ2l2ZSBhbiBlbXB0eSBzdHJpbmcsIGFuZCBlbmQgdXAgd2l0aCBhCi0gCSAqIG9uZS1lbGVtZW50IGFycmF5IHRoYXQgb25seSBjb250YWlucyBhIE5VTEwgcG9pbnRlci4KLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgvdGVzdHMvdGVzdF9maWxlLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloL3Rlc3RzL3Rlc3RfZmlsZS5jCi1AQCAtNzI0LDYgKzcyNCwyNSBAQAotIAlyZXR1cm4gRkFMU0U7Ci0gfQotIAotKy8qIGZpbmQgb25seSBmcm9kbyBmaWxlcyAqLwotK3N0YXRpYyBpbnQKLStteV9maWx0ZXJfZnJvZG9fZmlsZSAodm9pZCAgICAgICAqZGF0YSwKLSsJICAgY29uc3QgY2hhciAqcGF0aCwKLSsJICAgaW50ICAgICAgICAgaXNfZGlyKQotK3sKLSsJY2hhciAqc2xhc2g7Ci0rCi0rCWlmIChpc19kaXIpCi0rCQlyZXR1cm4gRkFMU0U7Ci0rCi0rCXNsYXNoID0gc3RycmNociAocGF0aCwgJy8nKTsKLSsJaWYgKHN0cmNtcCAoc2xhc2gsICIvZnJvZG8iKSkKLSsJCXJldHVybiBUUlVFOwotKwotKwlyZXR1cm4gRkFMU0U7Ci0rfQotKwotKwotIHN0YXRpYyBpbnQgbG9nZ2VyX2NhbGxlZCA9IDA7Ci0gCi0gc3RhdGljIGludAotQEAgLTkwNSw2ICs5MjQsNDggQEAKLSAJCVRFU1RfRVFfU1RSICh2LT5wYXRoLCBmaWxlbmFtZSk7Ci0gCi0gCQluaWhfZnJlZSAodmlzaXRlZCk7Ci0rCi0rCQkJCS8qIFRyeSBhbHNvIGludmVyc2UgZmlsdGVyICovCi0rCQlURVNUX0FMTE9DX1NBRkUgewotKwkJCXZpc2l0b3JfY2FsbGVkID0gMDsKLSsJCQl2aXNpdGVkID0gbmloX2xpc3RfbmV3IChOVUxMKTsKLSsJCX0KLSsKLSsJCXJldCA9IG5paF9kaXJfd2FsayAoZGlybmFtZSwgbXlfZmlsdGVyX2Zyb2RvX2ZpbGUsCi0rCQkJCSAgICBteV92aXNpdG9yLCBOVUxMLCAmcmV0KTsKLSsKLSsJCVRFU1RfRVEgKHJldCwgMCk7Ci0rCQlURVNUX0VRICh2aXNpdG9yX2NhbGxlZCwgNCk7Ci0rCi0rCQl2ID0gKFZpc2l0ZWQgKil2aXNpdGVkLT5uZXh0OwotKwkJVEVTVF9FUSAodi0+ZGF0YSwgJnJldCk7Ci0rCQlURVNUX0VRX1NUUiAodi0+ZGlybmFtZSwgZGlybmFtZSk7Ci0rCQlzdHJjcHkgKGZpbGVuYW1lLCBkaXJuYW1lKTsKLSsJCXN0cmNhdCAoZmlsZW5hbWUsICIvYmFyIik7Ci0rCQlURVNUX0VRX1NUUiAodi0+cGF0aCwgZmlsZW5hbWUpOwotKwotKwkJdiA9IChWaXNpdGVkICopdi0+ZW50cnkubmV4dDsKLSsJCVRFU1RfRVEgKHYtPmRhdGEsICZyZXQpOwotKwkJVEVTVF9FUV9TVFIgKHYtPmRpcm5hbWUsIGRpcm5hbWUpOwotKwkJc3RyY3B5IChmaWxlbmFtZSwgZGlybmFtZSk7Ci0rCQlzdHJjYXQgKGZpbGVuYW1lLCAiL2Jhci9mcm9kbyIpOwotKwkJVEVTVF9FUV9TVFIgKHYtPnBhdGgsIGZpbGVuYW1lKTsKLSsKLSsJCXYgPSAoVmlzaXRlZCAqKXYtPmVudHJ5Lm5leHQ7Ci0rCQlURVNUX0VRICh2LT5kYXRhLCAmcmV0KTsKLSsJCVRFU1RfRVFfU1RSICh2LT5kaXJuYW1lLCBkaXJuYW1lKTsKLSsJCXN0cmNweSAoZmlsZW5hbWUsIGRpcm5hbWUpOwotKwkJc3RyY2F0IChmaWxlbmFtZSwgIi9iYXoiKTsKLSsJCVRFU1RfRVFfU1RSICh2LT5wYXRoLCBmaWxlbmFtZSk7Ci0rCi0rCQl2ID0gKFZpc2l0ZWQgKil2LT5lbnRyeS5uZXh0OwotKwkJVEVTVF9FUSAodi0+ZGF0YSwgJnJldCk7Ci0rCQlURVNUX0VRX1NUUiAodi0+ZGlybmFtZSwgZGlybmFtZSk7Ci0rCQlzdHJjcHkgKGZpbGVuYW1lLCBkaXJuYW1lKTsKLSsJCXN0cmNhdCAoZmlsZW5hbWUsICIvZnJvZG8iKTsKLSsJCVRFU1RfRVFfU1RSICh2LT5wYXRoLCBmaWxlbmFtZSk7Ci0rCi0rCQluaWhfZnJlZSAodmlzaXRlZCk7Ci0gCX0KLSAKLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vY29udHJvbAotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vY29udHJvbAotQEAgLTAsMCArMSw4MSBAQAotK1NvdXJjZTogbGlibmloCi0rU2VjdGlvbjogbGlicwotK1ByaW9yaXR5OiByZXF1aXJlZAotK01haW50YWluZXI6IFVidW50dSBEZXZlbG9wZXJzIDx1YnVudHUtZGV2ZWwtZGlzY3Vzc0BsaXN0cy51YnVudHUuY29tPgotK1hTQkMtT3JpZ2luYWwtTWFpbnRhaW5lcjogU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPgotK1N0YW5kYXJkcy1WZXJzaW9uOiAzLjkuNAotK0J1aWxkLURlcGVuZHM6IGRlYmhlbHBlciAoPj0gOSksIHBrZy1jb25maWcgKD49IDAuMjIpLCBsaWJkYnVzLTEtZGV2ICg+PSAxLjQpLCBsaWJleHBhdDEtZGV2ICg+PSAyLjAuMCksIGRidXMgKD49IDEuNCksIGxpYmM2LWRldiAoPj0gMi4xNX4pIHwgbGliYzYuMS1kZXYgKD49IDIuMTV+KSwKLSsgICAgICAgICAgICAgICBkaC1hdXRvcmVjb25mLCBhdXRvcG9pbnQsIGRwa2ctZGV2ICg+PSAxLjE2LjF+KQotKyMgVG8gY3Jvc3MgYnVpbGQgdGhpcyBwYWNrYWdlIGFsc28gbmVlZHM6IGxpYmRidXMtMS1kZXY6bmF0aXZlICg+PSAxLjQpLCBsaWJleHBhdDEtZGV2Om5hdGl2ZSAoPj0gMi4wLjApCi0rIyBCdXQgOm5hdGl2ZSBidWlsZC1kZXBzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCwgc28gaW5zdGVhZCBvbmUgY2FuIGRvCi0rIyAkIGFwdC1nZXQgYnVpbGQtZGVwIGxpYm5paAotKyMgJCBhcHQtZ2V0IGJ1aWxkLWRlcCBsaWJuaWggLWFhcm1oZgotKyMgaW5zdGVhZCB0byBnZXQgYWxsIHJlcXVpcmVkIGJ1aWxkLWRlcHMKLStWY3MtQnpyOiBscDp1YnVudHUvbGlibmloCi0rWFNDLURlYmlhbi1WY3MtR2l0OiBnaXQ6Ly9naXQuZGViaWFuLm9yZy9naXQvY29sbGFiLW1haW50L2xpYm5paC5naXQKLStYU0MtRGViaWFuLVZjcy1Ccm93c2VyOiBodHRwOi8vZ2l0LmRlYmlhbi5vcmcvP3A9Y29sbGFiLW1haW50L2xpYm5paC5naXQ7YT1zdW1tYXJ5Ci0rSG9tZXBhZ2U6IGh0dHBzOi8vbGF1bmNocGFkLm5ldC9saWJuaWgKLSsKLStQYWNrYWdlOiBsaWJuaWgxCi0rQXJjaGl0ZWN0dXJlOiBhbnkKLStQcmUtRGVwZW5kczogJHttaXNjOlByZS1EZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotK011bHRpLUFyY2g6IHNhbWUKLStEZXNjcmlwdGlvbjogTklIIFV0aWxpdHkgTGlicmFyeQotKyBsaWJuaWggaXMgYSBsaWdodC13ZWlnaHQgInN0YW5kYXJkIGxpYnJhcnkiIG9mIEMgZnVuY3Rpb25zIHRvIGVhc2UgdGhlCi0rIGRldmVsb3BtZW50IG9mIG90aGVyIGxpYnJhcmllcyBhbmQgYXBwbGljYXRpb25zLCBlc3BlY2lhbGx5IHRob3NlCi0rIG5vcm1hbGx5IGZvdW5kIGluIC9saWIuCi0rIC4KLSsgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBzaGFyZWQgbGlicmFyeS4KLSsKLStQYWNrYWdlOiBsaWJuaWgtZGV2Ci0rUHJpb3JpdHk6IG9wdGlvbmFsCi0rU2VjdGlvbjogbGliZGV2ZWwKLStBcmNoaXRlY3R1cmU6IGFueQotK011bHRpLUFyY2g6IHNhbWUKLStEZXBlbmRzOiBsaWJuaWgxICg9ICR7YmluYXJ5OlZlcnNpb259KSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotK0Rlc2NyaXB0aW9uOiBOSUggVXRpbGl0eSBMaWJyYXJ5IChkZXZlbG9wbWVudCBmaWxlcykKLSsgbGlibmloIGlzIGEgbGlnaHQtd2VpZ2h0ICJzdGFuZGFyZCBsaWJyYXJ5IiBvZiBDIGZ1bmN0aW9ucyB0byBlYXNlIHRoZQotKyBkZXZlbG9wbWVudCBvZiBvdGhlciBsaWJyYXJpZXMgYW5kIGFwcGxpY2F0aW9ucywgZXNwZWNpYWxseSB0aG9zZQotKyBub3JtYWxseSBmb3VuZCBpbiAvbGliLgotKyAuCi0rIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgc3RhdGljIGxpYnJhcnkgYW5kIEMgaGVhZGVyIGZpbGVzIHdoaWNoIGFyZQotKyBuZWVkZWQgZm9yIGRldmVsb3Bpbmcgc29mdHdhcmUgdXNpbmcgbGlibmloLgotKwotK1BhY2thZ2U6IGxpYm5paC1kYnVzMQotK0FyY2hpdGVjdHVyZTogYW55Ci0rUHJlLURlcGVuZHM6ICR7bWlzYzpQcmUtRGVwZW5kc30KLStEZXBlbmRzOiBsaWJuaWgxICg9ICR7YmluYXJ5OlZlcnNpb259KSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotK011bHRpLUFyY2g6IHNhbWUKLStEZXNjcmlwdGlvbjogTklIIEQtQnVzIEJpbmRpbmdzIExpYnJhcnkKLSsgbGlibmloLWRidXMgaXMgYSBELUJ1cyBiaW5kaW5ncyBsaWJyYXJ5IHRoYXQgaW50ZWdyYXRlcyB3aXRoIHRoZSBtYWluCi0rIGxvb3AgcHJvdmlkZWQgYnkgbGlibmloLgotKyAuCi0rIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgc2hhcmVkIGxpYnJhcnkuCi0rCi0rUGFja2FnZTogbGlibmloLWRidXMtZGV2Ci0rUHJpb3JpdHk6IG9wdGlvbmFsCi0rU2VjdGlvbjogbGliZGV2ZWwKLStBcmNoaXRlY3R1cmU6IGFueQotK011bHRpLUFyY2g6IHNhbWUKLStEZXBlbmRzOiBsaWJuaWgtZGJ1czEgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBsaWJuaWgtZGV2ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotK1JlY29tbWVuZHM6IG5paC1kYnVzLXRvb2wgKD0gJHtiaW5hcnk6VmVyc2lvbn0pCi0rRGVzY3JpcHRpb246IE5JSCBELUJ1cyBCaW5kaW5ncyBMaWJyYXJ5IChkZXZlbG9wbWVudCBmaWxlcykKLSsgbGlibmloLWRidXMgaXMgYSBELUJ1cyBiaW5kaW5ncyBsaWJyYXJ5IHRoYXQgaW50ZWdyYXRlcyB3aXRoIHRoZSBtYWluCi0rIGxvb3AgcHJvdmlkZWQgYnkgbGlibmloLgotKyAuCi0rIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgc3RhdGljIGxpYnJhcnkgYW5kIEMgaGVhZGVyIGZpbGVzIHdoaWNoIGFyZQotKyBuZWVkZWQgZm9yIGRldmVsb3Bpbmcgc29mdHdhcmUgdXNpbmcgbGlibmloLWRidXMuCi0rCi0rUGFja2FnZTogbmloLWRidXMtdG9vbAotK1NlY3Rpb246IGRldmVsCi0rQXJjaGl0ZWN0dXJlOiBhbnkKLStNdWx0aS1BcmNoOiBmb3JlaWduCi0rRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotK1JlY29tbWVuZHM6IGxpYm5paC1kYnVzLWRldiAoPSAke2JpbmFyeTpWZXJzaW9ufSkKLStEZXNjcmlwdGlvbjogTklIIEQtQnVzIEJpbmRpbmcgVG9vbAotKyBuaWgtZGJ1cy10b29sIGdlbmVyYXRlcyBDIHNvdXJjZSBjb2RlIGZyb20gdGhlIEQtQnVzIEludHJvc3BlY3Rpb24gWE1MCi0rIGRhdGEgcHJvdmlkZWQgYnkgbW9zdCBzZXJ2aWNlczsgZWl0aGVyIHRvIG1ha2UgaW1wbGVtZW50aW5nIHRoZQotKyBkZXNjcmliZWQgb2JqZWN0cyBpbiBDIHByb2dyYW1zIG9yIHRvIG1ha2UgcHJveHlpbmcgdG8gdGhlIGRlc2NyaWJlZAotKyByZW1vdGUgb2JqZWN0cyBlYXNpZXIuCi0rIC4KLSsgVGhlIGdlbmVyYXRlZCBjb2RlIHJlcXVpcmVzIGxpYm5paC1kYnVzLWRldiB0byBiZSBjb21waWxlZC4KLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vbGlibmloLWRldi5pbnN0YWxsCi0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9saWJuaWgtZGV2Lmluc3RhbGwKLUBAIC0wLDAgKzEsNiBAQAotK2xpYi8qL2xpYm5paC5hCi0rbGliLyovbGlibmloLnNvCi0rdXNyL2luY2x1ZGUvbGlibmloLmgKLSt1c3IvaW5jbHVkZS9uaWgKLSt1c3IvbGliLyovcGtnY29uZmlnL2xpYm5paC5wYwotK3Vzci9zaGFyZS9hY2xvY2FsL2xpYm5paC5tNAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgxLmRvY3MKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paDEuZG9jcwotQEAgLTAsMCArMSwzIEBACi0rQVVUSE9SUwotK05FV1MKLStSRUFETUUKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vbGlibmloLWRidXMxLmluc3RhbGwKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paC1kYnVzMS5pbnN0YWxsCi1AQCAtMCwwICsxIEBACi0rbGliLyovbGlibmloLWRidXMuc28uKgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgxLmluc3RhbGwKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paDEuaW5zdGFsbAotQEAgLTAsMCArMSBAQAotK2xpYi8qL2xpYm5paC5zby4qCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL3J1bGVzCi0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9ydWxlcwotQEAgLTAsMCArMSw1NCBAQAotKyMhL3Vzci9iaW4vbWFrZSAtZgotKwotK2luY2x1ZGUgL3Vzci9zaGFyZS9kcGtnL2FyY2hpdGVjdHVyZS5tawotKwotKyU6Ci0rCWRoICRAIC0td2l0aCBhdXRvcmVjb25mCi0rCi0rCi0rQ0ZMQUdTIDo9IC1XYWxsIC1mc3RhY2stcHJvdGVjdG9yIC1mUElFICQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENGTEFHUykKLStMREZMQUdTIDo9IC1XbCwtLWFzLW5lZWRlZCAtV2wsLXoscmVscm8gLVdsLC16LG5vdyAtcGllICQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IExERkxBR1MpCi0rCi0rb3ZlcnJpZGVfZGhfYXV0b19jb25maWd1cmU6Ci0raWZlcSAoJChERUJfQlVJTERfR05VX1RZUEUpLCAkKERFQl9IT1NUX0dOVV9UWVBFKSkKLSsJZGhfYXV0b19jb25maWd1cmUgLS0gQ0ZMQUdTPSIkKENGTEFHUykiIExERkxBR1M9IiQoTERGTEFHUykiIFwKLSsJCS0tbGliZGlyPS9saWIvJChERUJfSE9TVF9NVUxUSUFSQ0gpCi0rZWxzZQotKwlkaF9hdXRvX2NvbmZpZ3VyZSAtQiBidWlsZC1kYnVzLXRvb2wvIC0tIENGTEFHUz0iJChDRkxBR1MpIiBMREZMQUdTPSIkKExERkxBR1MpIiBcCi0rCQktLWxpYmRpcj0vbGliLyQoREVCX0JVSUxEX01VTFRJQVJDSCkgXAotKwkJLS1ob3N0PSQoREVCX0JVSUxEX0dOVV9UWVBFKQotKwlkaF9hdXRvX2J1aWxkIC1CIGJ1aWxkLWRidXMtdG9vbC8gLS1wYXJhbGxlbAotKwlkaF9hdXRvX2NvbmZpZ3VyZSAtLSBDRkxBR1M9IiQoQ0ZMQUdTKSIgTERGTEFHUz0iJChMREZMQUdTKSIgXAotKwkJTklIX0RCVVNfVE9PTD0kKENVUkRJUikvYnVpbGQtZGJ1cy10b29sL25paC1kYnVzLXRvb2wvbmloLWRidXMtdG9vbCBcCi0rCQktLWxpYmRpcj0vbGliLyQoREVCX0hPU1RfTVVMVElBUkNIKQotK2VuZGlmCi0rCi0rb3ZlcnJpZGVfZGhfYXV0b19idWlsZDoKLSsJZGhfYXV0b19idWlsZCAtLXBhcmFsbGVsCi0rCi0rb3ZlcnJpZGVfZGhfYXV0b190ZXN0OgotK2lmZXEgKCQoREVCX0JVSUxEX0dOVV9UWVBFKSwgJChERUJfSE9TVF9HTlVfVFlQRSkpCi0rCWRoX2F1dG9fdGVzdCAtLXBhcmFsbGVsCi0rZW5kaWYKLSsKLStvdmVycmlkZV9kaF9hdXRvX2luc3RhbGw6Ci0rCWRoX2F1dG9faW5zdGFsbCAtLSBwa2djb25maWdkaXI9XCQke3ByZWZpeH0vbGliLyQoREVCX0hPU1RfTVVMVElBUkNIKS9wa2djb25maWcKLSsKLStvdmVycmlkZV9kaF9tYWtlc2hsaWJzOgotKwlkaF9tYWtlc2hsaWJzIC1wbGlibmloMSAtViAnbGlibmloMSAoPj0gMS4wLjApJwotKwlkaF9tYWtlc2hsaWJzIC1wbGlibmloLWRidXMxIC1WICdsaWJuaWgtZGJ1czEgKD49IDEuMC4wKScKLSsJZGhfbWFrZXNobGlicyAtTmxpYm5paDEgLU5saWJuaWgtZGJ1czEKLSsKLStvdmVycmlkZV9kaF9zaGxpYmRlcHM6Ci0rCWRoX3NobGliZGVwcwotKwlzZWQgLWkgJ3MvMlwuMTQvMi4xNS8nIGRlYmlhbi8qLnN1YnN0dmFycwotKwlzZWQgLWkgJ3MvPj0gMi4xNSkvPj0gMi4xNX4pL2cnIGRlYmlhbi8qLnN1YnN0dmFycwotKwotKwotKyMgU3ltbGluayAvdXNyL3NoYXJlL2RvYyBkaXJlY3RvcmllcyB0b2dldGhlcgotK292ZXJyaWRlX2RoX2luc3RhbGxkb2NzOgotKwlkaF9pbnN0YWxsZG9jcyAtLWxpbmstZG9jPWxpYm5paDEKLSsKLStvdmVycmlkZV9kaF9jbGVhbjoKLSsJcm0gLXJmIGJ1aWxkLWRidXMtdG9vbC8KLSsJZGhfY2xlYW4KLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vY29tcGF0Ci0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9jb21wYXQKLUBAIC0wLDAgKzEgQEAKLSs5Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL25paC1kYnVzLXRvb2wuaW5zdGFsbAotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vbmloLWRidXMtdG9vbC5pbnN0YWxsCi1AQCAtMCwwICsxLDIgQEAKLSt1c3IvYmluL25paC1kYnVzLXRvb2wKLSt1c3Ivc2hhcmUvbWFuL21hbjEvbmloLWRidXMtdG9vbC4xCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2NvcHlyaWdodAotKysrIGxpYm5paC0xLjAuMy9kZWJpYW4vY29weXJpZ2h0Ci1AQCAtMCwwICsxLDE4IEBACi0rVGhpcyBpcyB0aGUgVWJ1bnR1IHBhY2thZ2Ugb2YgbGlibmloLCB0aGUgTklIIFV0aWxpdHkgTGlicmFyeS4KLSsKLStDb3B5cmlnaHQgwqkgMjAwOSBDYW5vbmljYWwgTHRkLgotK0NvcHlyaWdodCDCqSAyMDA5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KLSsKLStMaWNlbmNlOgotKwotK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0raXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGFzCi0rcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0rCi0rVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLStNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSsKLStPbiBVYnVudHUgc3lzdGVtcywgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0rY2FuIGJlIGZvdW5kIGluIOKAmC91c3Ivc2hhcmUvY29tbW9uLWxpY2Vuc2VzL0dQTC0y4oCZLgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgtZGJ1czEucG9zdGluc3QKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paC1kYnVzMS5wb3N0aW5zdAotQEAgLTAsMCArMSw1MyBAQAotKyMhL2Jpbi9zaAotKwotK3NldCAtZQotKwotK2lmIFsgIiQxIiA9IGNvbmZpZ3VyZSBdOyB0aGVuCi0rICAgICMgQSBkZXBlbmRlbnQgbGlicmFyeSBvZiBVcHN0YXJ0IGhhcyBjaGFuZ2VkLCBzbyByZXN0YXJ0IFVwc3RhcnQKLSsgICAgIyBzdWNoIHRoYXQgaXQgY2FuIHNhZmVseSB1bm1vdW50IHRoZSByb290IGZpbGVzeXN0ZW0gKExQOiAjNzQwMzkwKQotKwotKyAgICAjIFF1ZXJ5IHJ1bm5pbmcgdmVyc2lvbiBvZiBVcHN0YXJ0LCBidXQgb25seSB3aGVuIHdlIGtub3cKLSsgICAgIyB0aGF0IGluaXRjdGwgd2lsbCB3b3JrLgotKyAgICAjCi0rICAgICMgVGhlIGNhbGN1bGF0ZWQgdmVyc2lvbiBzdHJpbmcgbWF5IGJlIHRoZSBudWxsIHN0cmluZyBpZgotKyAgICAjIFVwc3RhcnQgaXMgbm90IHJ1bm5pbmcgKHdoZXJlIGZvciBleGFtcGxlIGFuIGFsdGVybmF0aXZlCi0rICAgICMgaW5pdCBpcyBydW5uaW5nIG91dHNpZGUgYSBjaHJvb3QgZW52aXJvbm1lbnQpIG9yIGlmIHRoZQotKyAgICAjIHF1ZXJ5IGZhaWxlZCBmb3Igc29tZSByZWFzb24uIEhvd2V2ZXIsIHRoZSB2ZXJzaW9uIGNoZWNrCi0rICAgICMgYmVsb3cgaGFuZGxlcyBhIG51bGwgdmVyc2lvbiBzdHJpbmcgY29ycmVjdGx5LgotKyAgICBVUFNUQVJUX1ZFUlNJT05fUlVOTklORz0kKGluaXRjdGwgdmVyc2lvbiAyPi9kZXYvbnVsbCB8XAotKyAgICAgICAgYXdrICd7cHJpbnQgJDN9J3x0ciAtZCAnKScgfHwgOikKLSsKLSsgICAgaWYgaXNjaHJvb3Q7IHRoZW4KLSsgICAgICAgICMgRG8gbm90IGhvbm91ciByZS1leGVjIHdoZW4gcmVxdWVzdGVkIGZyb20gd2l0aGluIGEKLSsgICAgICAgICMgY2hyb290IHNpbmNlOgotKyAgICAgICAgIwotKyAgICAgICAgIyAoYSkgVGhlIHZlcnNpb24gb2YgVXBzdGFydCBvdXRzaWRlIG1pZ2h0IG5vdCBzdXBwb3J0IGl0LgotKyAgICAgICAgIyAoYikgQW4gaXNvbGF0ZWQgZW52aXJvbm1lbnQgc3VjaCBhcyBhIGNocm9vdCBzaG91bGQKLSsgICAgICAgICMgICAgIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSBpdHMgY29udGFpbmluZyBlbnZpcm9ubWVudC4KLSsgICAgICAgICMKLSsgICAgICAgICMgQSBzdWZmaWNpZW50bHkgbmV3IFVwc3RhcnQgd2lsbCBhY3R1YWxseSBoYW5kbGUgYSByZS1leGVjCi0rICAgICAgICAjIHJlcXVlc3QgY29taW5nIGZyb20gdGVsaW5pdCB3aXRoaW4gYSBjaHJvb3QgY29ycmVjdGx5IChieQotKyAgICAgICAgIyBkb2luZyBub3RoaW5nKSBidXQgaXQncyBzaW1wbGUgZW5vdWdoIHRvIHBlcmZvcm0gdGhlIGNoZWNrCi0rICAgICAgICAjIGhlcmUgYW5kIHNhdmUgVXBzdGFydCB0aGUgZWZmb3J0LgotKyAgICAgICAgOgotKyAgICBlbGlmIGRwa2cgLS1jb21wYXJlLXZlcnNpb25zICIkVVBTVEFSVF9WRVJTSU9OX1JVTk5JTkciIGdlIDEuNi4xOyB0aGVuCi0rICAgICAgICAjIFdlIGFyZSBub3QgcnVubmluZyBpbnNpZGUgYSBjaHJvb3QgYW5kIHRoZSBydW5uaW5nIHZlcnNpb24KLSsgICAgICAgICMgb2YgVXBzdGFydCBzdXBwb3J0cyBzdGF0ZWZ1bCByZS1leGVjLCBzbyB3ZSBjYW4KLSsgICAgICAgICMgcmVzdGFydCBpbW1lZGlhdGVseS4KLSsgICAgICAgICMKLSsgICAgICAgICMgWFhYOiBOb3RlIHRoYXQgdGhlIGNoZWNrIG9uIHRoZSBydW5uaW5nIHZlcnNpb24gbXVzdAotKyAgICAgICAgIyByZW1haW4gKmluZGVmaW5pdGVseSogc2luY2UgaXQncyB0aGUgb25seSBzYWZlIHdheSB0bwotKyAgICAgICAgIyBrbm93IGlmIHN0YXRlZnVsIHJlLWV4ZWMgaXMgc3VwcG9ydGVkOiBzaW1wbHkgY2hlY2tpbmcKLSsgICAgICAgICMgcGFja2FnZWQgdmVyc2lvbiBudW1iZXJzIGlzIG5vdCBzdWZmaWNpZW50IHNpbmNlCi0rICAgICAgICAjIHRoZSBwYWNrYWdlIGNvdWxkIGJlIHVwZ3JhZGVkIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgYQotKyAgICAgICAgIyByZWJvb3QuCi0rICAgICAgICB0ZWxpbml0IHUgfHwgOgotKyAgICBlbHNlCi0rICAgICAgICAjIEJlZm9yZSB3ZSBzaHV0ZG93biBvciByZWJvb3QsIHdlIG5lZWQgdG8gcmUtZXhlYyBzbyB0aGF0IHdlCi0rICAgICAgICAjIGNhbiBzYWZlbHkgcmVtb3VudCB0aGUgcm9vdCBmaWxlc3lzdGVtOyB3ZSBjYW4ndCBqdXN0IGRvIHRoYXQKLSsgICAgICAgICMgaGVyZSBiZWNhdXNlIHdlIGxvc2Ugc3RhdGUuCi0rICAgICAgICB0b3VjaCAvdmFyL3J1bi9pbml0LnVwZ3JhZGVkIHx8IDoKLSsgICAgZmkKLStmaQotKwotKyNERUJIRUxQRVIjCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2NoYW5nZWxvZy5ERUJJQU4KLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2NoYW5nZWxvZy5ERUJJQU4KLUBAIC0wLDAgKzEsMTE4IEBACi0rbGlibmloICgxLjAuMy00KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmVidWlsZCBmb3IgbmV3IGxpYmMgdG8gdXBkYXRlIHZlcnNpb25lZCBkZXBlbmRlbmN5OyB0aGlzIGNvbWVzIGZyb20KLSsgICAgdGhlIF9fYWJvcnRfbXNnIGRlcGVuZGVuY3ksIGRwa2ctc2hsaWJzIG5lZWRzIG92ZXJyaWRpbmcgc2luY2UgdGhpcyBpcwotKyAgICBhY3R1YWxseSBhIHdlYWsgbGluaywgYnV0IHRoaXMgcmVidWlsZCBmaXhlcyB0aGluZ3MgZm9yIG5vdy4KLSsgICAgQ2xvc2VzOiAjNjI1MjU3LgotKwotKyAtLSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+ICBNb24sIDAyIE1heSAyMDExIDE1OjA4OjMzIC0wNzAwCi0rCi0rbGlibmloICgxLjAuMy0zKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogTmV3IG1haW50YWluZXIuICBDbG9zZXM6ICM2MjQ0NDIuCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4gIFRodSwgMjggQXByIDIwMTEgMTQ6MjY6MDUgLTA3MDAKLSsKLStsaWJuaWggKDEuMC4zLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBCdW1wIGJ1aWxkIGRlcGVuZGVuY3kgb24gbGliZGJ1cy0xLWRldiBhbmQgZGJ1cyB0byAoPj0gMS40KSBmb3IgVW5peCBmaWxlCi0rICAgIGRlc2NyaXB0b3IgcGFzc2luZyBzdXBwb3J0LgotKwotKyAtLSBNaWNoYWVsIEJpZWJsIDxiaWVibEBkZWJpYW4ub3JnPiAgVGh1LCAxMCBGZWIgMjAxMSAyMDoyNToxOCArMDEwMAotKwotK2xpYm5paCAoMS4wLjMtMXVidW50dTEpIG5hdHR5OyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZWJ1aWxkIHdpdGggbGliYzYtZGV2ICg+PSAyLjEzfikuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBGcmksIDE4IEZlYiAyMDExIDEyOjA5OjI5ICswMTAwCi0rCi0rbGlibmloICgxLjAuMy0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCi0rICAqIEJ1bXAgZGViaGVscGVyIGNvbXBhdGliaWxpdHkgbGV2ZWwgdG8gOCBhbmQgdXBkYXRlIGJ1aWxkIGRlcGVuZGVuY3kKLSsgICAgYWNjb3JkaW5nbHkuCi0rCi0rIC0tIE1pY2hhZWwgQmllYmwgPGJpZWJsQGRlYmlhbi5vcmc+ICBNb24sIDA3IEZlYiAyMDExIDIyOjE5OjEzICswMTAwCi0rCi0rbGlibmloICgxLjAuMi0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogSW5zdGFsbCBsaWJyYXJ5IGRldmVsb3BtZW50IGZpbGVzIHRvIC91c3IvbGliIGFuZCBub3QgL2xpYi4KLSsgICogUmVtb3ZlIGxpYnRvb2wgKi5sYSBmaWxlcyBhcyB0aGVyZSBhcmUgbm8gcmV2ZXJzZSBkZXBlbmRlbmNpZXMgcmVmZXJlbmNpbmcKLSsgICAgdGhlbS4KLSsgICogQnVtcCBTdGFuZGFyZHMtVmVyc2lvbiB0byAzLjkuMS4gTm8gZnVydGhlciBjaGFuZ2VzLgotKwotKyAtLSBNaWNoYWVsIEJpZWJsIDxiaWVibEBkZWJpYW4ub3JnPiAgU3VuLCAwMiBKYW4gMjAxMSAyMTowOTo0MCArMDEwMAotKwotK2xpYm5paCAoMS4wLjItMXVidW50dTMpIG5hdHR5OyB1cmdlbmN5PWxvdwotKwotKyAgKiBEaXNhYmxlIHNvbWUgdGVzdHMgb24gcHBjNjQgdG8gYnVpbGQgYW4gaW5pdGlhbCBwYWNrYWdlLgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgVGh1LCAxOCBOb3YgMjAxMCAxMDo1OTozOCArMDEwMAotKwotK2xpYm5paCAoMS4wLjItMXVidW50dTIpIG1hdmVyaWNrOyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZS1hZGQgLWZQSUUgdG8gdGhlIHRlc3RzdWl0ZSBvbiBhcm1lbCwgcmVtb3ZpbmcgYWxsIGFybWVsLXNwZWNpZmljIHRlc3RzOwotKyAgICBjdXJyZW50IGdjYy00LjQgZG9uJ3Qgc2VlbSBhZmZlY3RlZCBieSB0aGUgSUNFIGFueW1vcmUgKHNlZSBMUCAjMzk4NDAzKS4KLSsKLSsgLS0gTG/Dr2MgTWluaWVyIDxsb2ljLm1pbmllckBsaW5hcm8ub3JnPiAgTW9uLCAyMyBBdWcgMjAxMCAxMDoyNTozMSArMDIwMAotKwotK2xpYm5paCAoMS4wLjItMXVidW50dTEpIG1hdmVyaWNrOyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZWJ1aWxkIHdpdGggbGliYzYtZGV2ICg+PSAyLjEyfiksIGFmdGVyIGNoZWNraW5nIHRoYXQKLSsgICAgX19hYm9ydF9tc2cgaXMgYXZhaWxhYmxlIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGluIGVnbGliYyAyLjEyLgotKyAgKiBEb24ndCBidWlsZCB0aGUgdGVzdHN1aXRlIHdpdGggLWZQSUUgb24gYXJtZWw7IExQOiAjMzk4NDAzLgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgU3VuLCAzMCBNYXkgMjAxMCAwMjo1NDo1NiArMDIwMAotKwotK2xpYm5paCAoMS4wLjItMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIEluaXRpYWwgdXBsb2FkIHRvIERlYmlhbi4gQ2xvc2VzOiAjNTg1MDcxCi0rICAqIEJhc2VkIG9uIHRoZSBVYnVudHUgcGFja2FnZSBmb3IgTHVjaWQgZG9uZSBieSBTY290dCBKYW1lcyBSZW1uYW50IHdpdGggdGhlCi0rICAgIGZvbGxvd2luZyBjaGFuZ2VzOgotKyAgICAtIFN3aXRjaCBwYWNrYWdlcyB0byBwcmlvcml0eSBvcHRpb25hbC4KLSsgICAgLSBVc2UgYmluYXJ5OlZlcnNpb24gaW5zdGVhZCBvZiBTb3VyY2UtVmVyc2lvbi4KLSsgICAgLSBCdW1wIFN0YW5kYXJkcy1WZXJzaW9uIHRvIDMuOC40LgotKyAgICAtIEFkZCBIb21lcGFnZSBhbmQgVmNzLSogZmllbGRzLgotKyAgICAtIERvbid0IHN5bWxpbmsgL3Vzci9zaGFyZS9kb2MgZGlyZWN0b3JpZXMuCi0rICAgIC0gUmVmZXIgdG8gdmVyc2lvbmVkIC91c3Ivc2hhcmUvY29tbW9uLWxpY2Vuc2VzL0dQTC0yIGZpbGUgaW4KLSsgICAgICBkZWJpYW4vY29weXJpZ2h0LgotKyAgICAtIExpc3QgYWxsIHN5bWJvbHMgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHVzaW5nIGEgd2lsZGNhcmQgYW5kIGFkZCBzeW1ib2xzCi0rICAgICAgaW50cm9kdWNlZCBpbiAxLjAuMS4KLSsgICAgLSBVc2UgdGhlIHN5bWJvbHMgZmlsZXMgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IHZlcnNpb24gaW5mbyBpbnN0ZWFkIG9mCi0rICAgICAgc3BlY2lmeWluZyBpdCBtYW51YWxseSB2aWEgc2hsaWJzLgotKyAgICAtIFN3aXRjaCB0byBzb3VyY2UgZm9ybWF0IDMuMCAocXVpbHQpLgotKyAgICAtIEFkZCB3YXRjaCBmaWxlIHRvIHRyYWNrIG5ldyB1cHN0cmVhbSByZWxlYXNlcy4KLSsKLSsgLS0gTWljaGFlbCBCaWVibCA8YmllYmxAZGViaWFuLm9yZz4gIFN1biwgMTMgSnVuIDIwMTAgMjM6MzY6NTIgKzAyMDAKLSsKLStsaWJuaWggKDEuMC4xLTEpIGx1Y2lkOyB1cmdlbmN5PWxvdwotKwotKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZToKLSsgICAgLSBBZGQgbWlzc2luZyBfX25paF8qIHN5bWJvbHMgdG8gbGlua2VyIHZlcnNpb24gc2NyaXB0IHNvIHRoYXQgd2UKLSsgICAgICBjYW4gbGluayBVcHN0YXJ0J3MgdGVzdCBzdWl0ZS4KLSsgICAgLSBHbGliYyBfX2Fib3J0X21zZyBzeW1ib2wgbm93IG9ubHkgbGlua2VkIGFzIGEgd2VhayBzeW1ib2wuCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+ICBUaHUsIDA0IEZlYiAyMDEwIDE0OjUzOjI2IC0wODAwCi0rCi0rbGlibmloICgxLjAuMC0yYnVpbGQxKSBsdWNpZDsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmVidWlsZCB0byBwaWNrIHVwIHJlbGF4ZWQgZGVwZW5kZW5jeSBvbiBsaWJjNiwgYWZ0ZXIgY2hlY2tpbmcgdGhhdAotKyAgICBfX2Fib3J0X21zZyBpcyBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgaW4gZWdsaWJjIDIuMTEuCi0rICAgIExQOiAjNTA4NzAyLgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgTW9uLCAxOCBKYW4gMjAxMCAxNjowOToxMyArMDEwMAotKwotK2xpYm5paCAoMS4wLjAtMikgbHVjaWQ7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIGRlYmlhbi9jb250cm9sOiBBZGQgYnVpbGQtZGVwZW5kZW5jeSBvbiBkYnVzIHNvIHRoZSB0ZXN0IHN1aXRlIGNhbgotKyAgICBwYXNzIG9uIHRoZSBidWlsZGRzLgotKwotKyAtLSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEB1YnVudHUuY29tPiAgU2F0LCAyOCBOb3YgMjAwOSAyMzoyODoyNyArMDAwMAotKwotK2xpYm5paCAoMS4wLjAtMSkgbHVjaWQ7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIEZpcnN0IHVwc3RyZWFtIHJlbGVhc2UuICBQcmV2aW91c2x5IHRoaXMgY29kZSB3YXMgaW5jbHVkZWQgaW4gdGhlCi0rICAgIHVwc3RhcnQsIG1vdW50YWxsIGFuZCB1cmVhZGFoZWFkIHNvdXJjZSBwYWNrYWdlcy4KLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4gIFNhdCwgMjggTm92IDIwMDkgMjE6MTQ6MDAgKzAwMDAKLSsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vbGlibmloMS5zeW1ib2xzCi0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9saWJuaWgxLnN5bWJvbHMKLUBAIC0wLDAgKzEsMiBAQAotK2xpYm5paC5zby4xIGxpYm5paDEgI01JTlZFUiMKLSsgKkBMSUJOSUhfMV8wIDEuMC4wCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL2xpYm5paC1kYnVzLWRldi5pbnN0YWxsCi0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9saWJuaWgtZGJ1cy1kZXYuaW5zdGFsbAotQEAgLTAsMCArMSw1IEBACi0rbGliLyovbGlibmloLWRidXMuYQotK2xpYi8qL2xpYm5paC1kYnVzLnNvCi0rdXNyL2luY2x1ZGUvbGlibmloLWRidXMuaAotK3Vzci9pbmNsdWRlL25paC1kYnVzCi0rdXNyL2xpYi8qL3BrZ2NvbmZpZy9saWJuaWgtZGJ1cy5wYwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9saWJuaWgxLnBvc3RpbnN0Ci0rKysgbGlibmloLTEuMC4zL2RlYmlhbi9saWJuaWgxLnBvc3RpbnN0Ci1AQCAtMCwwICsxLDUzIEBACi0rIyEvYmluL3NoCi0rCi0rc2V0IC1lCi0rCi0raWYgWyAiJDEiID0gY29uZmlndXJlIF07IHRoZW4KLSsgICAgIyBBIGRlcGVuZGVudCBsaWJyYXJ5IG9mIFVwc3RhcnQgaGFzIGNoYW5nZWQsIHNvIHJlc3RhcnQgVXBzdGFydAotKyAgICAjIHN1Y2ggdGhhdCBpdCBjYW4gc2FmZWx5IHVubW91bnQgdGhlIHJvb3QgZmlsZXN5c3RlbSAoTFA6ICM3NDAzOTApCi0rCi0rICAgICMgUXVlcnkgcnVubmluZyB2ZXJzaW9uIG9mIFVwc3RhcnQsIGJ1dCBvbmx5IHdoZW4gd2Uga25vdwotKyAgICAjIHRoYXQgaW5pdGN0bCB3aWxsIHdvcmsuCi0rICAgICMKLSsgICAgIyBUaGUgY2FsY3VsYXRlZCB2ZXJzaW9uIHN0cmluZyBtYXkgYmUgdGhlIG51bGwgc3RyaW5nIGlmCi0rICAgICMgVXBzdGFydCBpcyBub3QgcnVubmluZyAod2hlcmUgZm9yIGV4YW1wbGUgYW4gYWx0ZXJuYXRpdmUKLSsgICAgIyBpbml0IGlzIHJ1bm5pbmcgb3V0c2lkZSBhIGNocm9vdCBlbnZpcm9ubWVudCkgb3IgaWYgdGhlCi0rICAgICMgcXVlcnkgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gSG93ZXZlciwgdGhlIHZlcnNpb24gY2hlY2sKLSsgICAgIyBiZWxvdyBoYW5kbGVzIGEgbnVsbCB2ZXJzaW9uIHN0cmluZyBjb3JyZWN0bHkuCi0rICAgIFVQU1RBUlRfVkVSU0lPTl9SVU5OSU5HPSQoaW5pdGN0bCB2ZXJzaW9uIDI+L2Rldi9udWxsIHxcCi0rICAgICAgICBhd2sgJ3twcmludCAkM30nfHRyIC1kICcpJyB8fCA6KQotKwotKyAgICBpZiBpc2Nocm9vdDsgdGhlbgotKyAgICAgICAgIyBEbyBub3QgaG9ub3VyIHJlLWV4ZWMgd2hlbiByZXF1ZXN0ZWQgZnJvbSB3aXRoaW4gYQotKyAgICAgICAgIyBjaHJvb3Qgc2luY2U6Ci0rICAgICAgICAjCi0rICAgICAgICAjIChhKSBUaGUgdmVyc2lvbiBvZiBVcHN0YXJ0IG91dHNpZGUgbWlnaHQgbm90IHN1cHBvcnQgaXQuCi0rICAgICAgICAjIChiKSBBbiBpc29sYXRlZCBlbnZpcm9ubWVudCBzdWNoIGFzIGEgY2hyb290IHNob3VsZAotKyAgICAgICAgIyAgICAgbm90IGJlIGFibGUgdG8gbW9kaWZ5IGl0cyBjb250YWluaW5nIGVudmlyb25tZW50LgotKyAgICAgICAgIwotKyAgICAgICAgIyBBIHN1ZmZpY2llbnRseSBuZXcgVXBzdGFydCB3aWxsIGFjdHVhbGx5IGhhbmRsZSBhIHJlLWV4ZWMKLSsgICAgICAgICMgcmVxdWVzdCBjb21pbmcgZnJvbSB0ZWxpbml0IHdpdGhpbiBhIGNocm9vdCBjb3JyZWN0bHkgKGJ5Ci0rICAgICAgICAjIGRvaW5nIG5vdGhpbmcpIGJ1dCBpdCdzIHNpbXBsZSBlbm91Z2ggdG8gcGVyZm9ybSB0aGUgY2hlY2sKLSsgICAgICAgICMgaGVyZSBhbmQgc2F2ZSBVcHN0YXJ0IHRoZSBlZmZvcnQuCi0rICAgICAgICA6Ci0rICAgIGVsaWYgZHBrZyAtLWNvbXBhcmUtdmVyc2lvbnMgIiRVUFNUQVJUX1ZFUlNJT05fUlVOTklORyIgZ2UgMS42LjE7IHRoZW4KLSsgICAgICAgICMgV2UgYXJlIG5vdCBydW5uaW5nIGluc2lkZSBhIGNocm9vdCBhbmQgdGhlIHJ1bm5pbmcgdmVyc2lvbgotKyAgICAgICAgIyBvZiBVcHN0YXJ0IHN1cHBvcnRzIHN0YXRlZnVsIHJlLWV4ZWMsIHNvIHdlIGNhbgotKyAgICAgICAgIyByZXN0YXJ0IGltbWVkaWF0ZWx5LgotKyAgICAgICAgIwotKyAgICAgICAgIyBYWFg6IE5vdGUgdGhhdCB0aGUgY2hlY2sgb24gdGhlIHJ1bm5pbmcgdmVyc2lvbiBtdXN0Ci0rICAgICAgICAjIHJlbWFpbiAqaW5kZWZpbml0ZWx5KiBzaW5jZSBpdCdzIHRoZSBvbmx5IHNhZmUgd2F5IHRvCi0rICAgICAgICAjIGtub3cgaWYgc3RhdGVmdWwgcmUtZXhlYyBpcyBzdXBwb3J0ZWQ6IHNpbXBseSBjaGVja2luZwotKyAgICAgICAgIyBwYWNrYWdlZCB2ZXJzaW9uIG51bWJlcnMgaXMgbm90IHN1ZmZpY2llbnQgc2luY2UKLSsgICAgICAgICMgdGhlIHBhY2thZ2UgY291bGQgYmUgdXBncmFkZWQgbXVsdGlwbGUgdGltZXMgd2l0aG91dCBhCi0rICAgICAgICAjIHJlYm9vdC4KLSsgICAgICAgIHRlbGluaXQgdSB8fCA6Ci0rICAgIGVsc2UKLSsgICAgICAgICMgQmVmb3JlIHdlIHNodXRkb3duIG9yIHJlYm9vdCwgd2UgbmVlZCB0byByZS1leGVjIHNvIHRoYXQgd2UKLSsgICAgICAgICMgY2FuIHNhZmVseSByZW1vdW50IHRoZSByb290IGZpbGVzeXN0ZW07IHdlIGNhbid0IGp1c3QgZG8gdGhhdAotKyAgICAgICAgIyBoZXJlIGJlY2F1c2Ugd2UgbG9zZSBzdGF0ZS4KLSsgICAgICAgIHRvdWNoIC92YXIvcnVuL2luaXQudXBncmFkZWQgfHwgOgotKyAgICBmaQotK2ZpCi0rCi0rI0RFQkhFTFBFUiMKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9kZWJpYW4vbGlibmloLWRidXMxLnN5bWJvbHMKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2xpYm5paC1kYnVzMS5zeW1ib2xzCi1AQCAtMCwwICsxLDIgQEAKLStsaWJuaWgtZGJ1cy5zby4xIGxpYm5paC1kYnVzMSAjTUlOVkVSIwotKyAqQExJQk5JSF9EQlVTXzFfMCAxLjAuMAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL2RlYmlhbi9jaGFuZ2Vsb2cKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL2NoYW5nZWxvZwotQEAgLTAsMCArMSwyMTMgQEAKLStsaWJuaWggKDEuMC4zLTR1YnVudHUxNikgcmFyaW5nOyB1cmdlbmN5PWxvdwotKwotKyAgKiBkZWJpYW4ve2xpYm5paDEucG9zdGluc3QsbGlibmloLWRidXMxLnBvc3RpbnN0fTogRm9yY2UgYW4gdXBncmFkZSB0bwotKyAgICByZXN0YXJ0IFVwc3RhcnQgKHRvIHBpY2sgdXAgbmV3IHBhY2thZ2UgdmVyc2lvbikgaWYgdGhlIHJ1bm5pbmcKLSsgICAgaW5zdGFuY2Ugc3VwcG9ydHMgaXQuCi0rICAqIE1lcmdlIG9mIGltcG9ydGFudCBmaXhlcyBmcm9tIGxwOn51cHN0YXJ0LWRldmVsL2xpYm5paC9uaWgKLSsgICAgKExQOiAjNzc2NTMyLCBMUDogIzc3NzA5NywgTFA6ICM4MzQ4MTMsIExQOiAjMTEyMzU4OCkuCi0rCi0rIC0tIEphbWVzIEh1bnQgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4gIFRodSwgMTQgTWFyIDIwMTMgMDk6MTQ6MjIgKzAwMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHUxNSkgcmFyaW5nOyB1cmdlbmN5PWxvdwotKwotKyAgKiBFbmFibGUgY3Jvc3MtYnVpbGRpbmcsIHNhbnMgYWRkaW5nIDpuYXRpdmUgYnVpbGQtZGVwZW5kZW5jaWVzLgotKyAgICBTZWUgY29tbWVudHMgaW4gZGViaWFuL2NvbnRyb2wuCi0rICAqIExpbnRpYW4gZml4ZXMuCi0rCi0rIC0tIERtaXRyaWpzIExlZGtvdnMgPGRtaXRyaWoubGVka292QHVidW50dS5jb20+ICBUdWUsIDA4IEphbiAyMDEzIDE1OjM4OjU4ICswMDAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1MTQpIHJhcmluZzsgdXJnZW5jeT1sb3cKLSsKLSsgICogVXBkYXRlIGRidXMgY29kZSBnZW5lcmF0b3IgdG8gYWxsb3cgZm9yIGVtcHR5IGxpc3RzIGZvciB0eXBlICdhcycuCi0rICAgIFRoaXMgZHJvcHMgdGhlICE9IE5VTEwgY2hlY2sgZm9yIE5VTEwgdGVybWluYXRlZCBhcnJheXMgYW5kIG1vdmVzIHRoZQotKyAgICBpdGVyYXRpb24gbG9vcCBpbnNpZGUgYW4gJ2lmJyBzdGF0ZW1lbnQuCi0rCi0rIC0tIFN0w6lwaGFuZSBHcmFiZXIgPHN0Z3JhYmVyQHVidW50dS5jb20+ICBUaHUsIDEzIERlYyAyMDEyIDEwOjAwOjI3IC0wNTAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1MTMpIHJhcmluZzsgdXJnZW5jeT1sb3cKLSsKLSsgIFsgUGV0ciBMYXV0cmJhY2ggPHBsYXV0cmJhQHJlZGhhdC5jb20+LCBEbWl0cmlqcyBMZWRrb3ZzIF0KLSsgICogRmFsbGJhY2sgdG8gbHN0YXQsIGlmIGRpcmVudC5kX3R5cGUgaXMgbm90IGF2YWlsYWJsZSAobm90IHBvcnRhYmxlKQotKyAgICAoTFA6ICM2NzI2NDMpIChDbG9zZXM6ICM2OTU2MDQpCi0rCi0rIC0tIERtaXRyaWpzIExlZGtvdnMgPGRtaXRyaWoubGVka292QHVidW50dS5jb20+ICBUdWUsIDExIERlYyAyMDEyIDE3OjI2OjUyICswMDAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1MTIpIHJhcmluZzsgdXJnZW5jeT1sb3cKLSsKLSsgICogbmloL2xvZ2dpbmcuYzogVXNlIG91ciBvd24gX19uaWhfYWJvcnRfbXNnIHJhdGhlciB0aGFuIHRoZSAoZSlnbGliYwotKyAgICBwcml2YXRlIHN5bWJvbCBfX2Fib3J0X21zZyB0byBhdm9pZCB1cGdyYWRlIGlzc3VlcyAoTFA6ICM5OTczNTkpLgotKyAgKiBuaWgvdGVzdHMvdGVzdF9sb2dnaW5nLmM6IFVwZGF0ZSB0ZXN0cyBmb3IgX19uaWhfYWJvcnRfbXNnLgotKwotKyAtLSBKYW1lcyBIdW50IDxqYW1lcy5odW50QHVidW50dS5jb20+ICBUaHUsIDI1IE9jdCAyMDEyIDEwOjU3OjMwICswMTAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1MTEpIHF1YW50YWw7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIEFkZGl0aW9uIG9mIGRlYmlhbi9saWJuaWgtZGJ1czEucG9zdGluc3QgYW5kCi0rICAgIGRlYmlhbi9saWJuaWgxLnBvc3RpbnN0IHRvIGZvcmNlIFVwc3RhcnQgcmUtZXhlYyBvbiBzaHV0ZG93bgotKyAgICB0byBhdm9pZCB1bm1vdW50aW5nIGRpc2tzIHVuY2xlYW5seSAoTFA6ICM3NDAzOTApLgotKwotKyAtLSBKYW1lcyBIdW50IDxqYW1lcy5odW50QHVidW50dS5jb20+ICBXZWQsIDAzIE9jdCAyMDEyIDE2OjQ5OjQwICswMTAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1MTApIHF1YW50YWw7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFVwZGF0ZSBjb25maWcuZ3Vlc3Msc3ViIGZvciBhYXJjaDY0Ci0rCi0rIC0tIFdvb2tleSA8d29va2V5QHdvb2t3YXJlLm9yZz4gIE1vbiwgMDEgT2N0IDIwMTIgMTI6NTc6MDUgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHU5KSBwcmVjaXNlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBNYXJrIHRoZSBuaWgtZGJ1cy10b29sIHBhY2thZ2UgTXVsdGktQXJjaDogZm9yZWlnbiBzbyBpdCBjYW4gYmUgdXNlZCBhcwotKyAgICBhIGJ1aWxkLWRlcGVuZGVuY3kgb2YgdXBzdGFydCB3aGVuIGNyb3NzLWJ1aWxkaW5nLgotKwotKyAtLSBTdGV2ZSBMYW5nYXNlayA8c3RldmUubGFuZ2FzZWtAdWJ1bnR1LmNvbT4gIFdlZCwgMTUgRmViIDIwMTIgMjI6NTc6NTAgLTA4MDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHU4KSBwcmVjaXNlOyB1cmdlbmN5PWxvdwotKwotKyAgKiBsaWJuaWgxIG5lZWRzIGEgdmVyc2lvbmVkIFByZS1EZXBlbmQgb24gbGliYzYgaW5zdGVhZCBvZiBqdXN0IGEgRGVwZW5kLAotKyAgICBiZWNhdXNlIGxpYmM2IGl0c2VsZiB1c2VzIHJ1bmxldmVsIGZyb20gdGhlIHVwc3RhcnQgcGFja2FnZSBpbiBpdHMKLSsgICAgcHJlaW5zdCwgd2hpY2ggaW4gdHVybiB1c2VzIGxpYm5paDEsIHdoaWNoIG5lZWRzIHRvIGJlIGxvYWRhYmxlIChpLmUuLAotKyAgICBpdHMgc3ltYm9sIHJlZmVyZW5jZXMgcmVzb2x2ZSkuICBXZSB0aGVyZWZvcmUgbmVlZCB0byBlbnN1cmUgdGhhdAotKyAgICBsaWJuaWgxJ3MgZGVwZW5kZW5jaWVzIGFyZSBhbHdheXMgdW5wYWNrZWQgYmVmb3JlIGxpYm5paDEgaXRzZWxmIGlzCi0rICAgIHVucGFja2VkLiAgV2hpbGUgaGF2aW5nIHNvbWV0aGluZyBmdXJ0aGVyIHVwIHRoZSBzdGFjayAoc3VjaCBhcyB1cHN0YXJ0LAotKyAgICBvciBzb21ldGhpbmcgb24gdG9wIG9mIHVwc3RhcnQpIGJlaW5nIG1hcmtlZCBFc3NlbnRpYWw6IHllcyBhbmQgd2l0aCB0aGUKLSsgICAgbmVjZXNzYXJ5IHByZS1kZXBlbmRzIHdvdWxkIGxldCBhcHQgaGFuZGxlIHRoaXMgZm9yIHVzIHdpdGggaXRzCi0rICAgICJpbW1lZGlhdGUgY29uZmlndXJhdGlvbiIgc3VwcG9ydCwgYnV0IGZvciB2YXJpb3VzIHJlYXNvbnMgd2UgZG9uJ3Qgd2FudAotKyAgICB0byBtYWtlIHVwc3RhcnQgZXNzZW50aWFsLiAgTFA6ICM1MDgwODMuCi0rCi0rIC0tIFN0ZXZlIExhbmdhc2VrIDxzdGV2ZS5sYW5nYXNla0B1YnVudHUuY29tPiAgRnJpLCAxMCBGZWIgMjAxMiAxMjoxMzoyNSAtMDgwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTcpIHByZWNpc2U7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJlbGF4IGRlcGVuZGVuY3kgb24gbGliYzYuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBXZWQsIDA4IEZlYiAyMDEyIDIzOjQzOjIxICswMTAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1NikgcHJlY2lzZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmVidWlsZCB3aXRoIGxpYmM2LWRldiAoPj0gMi4xNX4pLgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgV2VkLCAwOCBGZWIgMjAxMiAyMTo0ODo1NyArMDEwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTUpIHByZWNpc2U7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIE1hcmsgbGlibmloLWRldiBhbmQgbGlibmloLWRidXMtZGV2IE11bHRpLUFyY2g6IHNhbWUgYXMgd2VsbC4KLSsKLSsgLS0gU3RldmUgTGFuZ2FzZWsgPHN0ZXZlLmxhbmdhc2VrQHVidW50dS5jb20+ICBTdW4sIDA2IE5vdiAyMDExIDE0OjQ1OjA3IC0wODAwCi0rCi0rbGlibmloICgxLjAuMy00dWJ1bnR1NCkgcHJlY2lzZTsgdXJnZW5jeT1sb3cKLSsKLSsgICogTWFrZSBsaWJuaWgxIGFuZCBsaWJuaWgtZGJ1czEgaW5zdGFsbGFibGUgdXNpbmcgbXVsdGktYXJjaC4KLSsKLSsgLS0gSmFtZXMgSHVudCA8amFtZXMuaHVudEB1YnVudHUuY29tPiAgVHVlLCAwMSBOb3YgMjAxMSAxNDoyNTowOSAtMDQwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTMpIHByZWNpc2U7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIEJ1aWxkIHRvIGluc3RhbGwgd2l0aCBlZ2xpYmMtMi4xNS4KLSsKLSsgLS0gTWF0dGhpYXMgS2xvc2UgPGRva29AdWJ1bnR1LmNvbT4gIEZyaSwgMTQgT2N0IDIwMTEgMTQ6MDU6MDMgKzAyMDAKLSsKLStsaWJuaWggKDEuMC4zLTR1YnVudHUyKSBvbmVpcmljOyB1cmdlbmN5PWxvdwotKwotKyAgKiBVc2UgZHBrZy1idWlsZGZsYWdzIHRvIGdldCB0aGUgYnVpbGQgZmxhZ3MuCi0rICAqIEJ1aWxkIHdpdGggdGhlIGRlZmF1bHQgYnVpbGQgZmxhZ3MsIGRvbid0IGhhcmQtY29kZSAtT3MuIExQOiAjNzkxMzE1LgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgV2VkLCAxNSBKdW4gMjAxMSAxNjo0NTo0MiArMDIwMAotKwotK2xpYm5paCAoMS4wLjMtNHVidW50dTEpIG9uZWlyaWM7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIE1lcmdlIGZyb20gZGViaWFuIHVuc3RhYmxlLiBSZXRhaW5lZCBVYnVudHUgQnVpbGQtRGVwZW5kcyBhbmQgUHJpb3JpdHkuCi0rCi0rIC0tIEphbWVzIEh1bnQgPGphbWVzLmh1bnRAdWJ1bnR1LmNvbT4gIE1vbiwgMjMgTWF5IDIwMTEgMTk6Mjg6MTkgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4zLTF1YnVudHUxKSBuYXR0eTsgdXJnZW5jeT1sb3cKLSsKLSsgICogUmVidWlsZCB3aXRoIGxpYmM2LWRldiAoPj0gMi4xM34pLgotKwotKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgRnJpLCAxOCBGZWIgMjAxMSAxMjowOToyOSArMDEwMAotKwotK2xpYm5paCAoMS4wLjMtMSkgbmF0dHk7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlOgotKyAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZmlsZSBkZXNjcmlwdG9ycyBvdmVyIEQtQnVzIHRvIG5paC1kYnVzLXRvb2wKLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4gIFRodSwgMjMgRGVjIDIwMTAgMjI6Mjg6MjQgKzAwMDAKLSsKLStsaWJuaWggKDEuMC4yLTIpIG5hdHR5OyB1cmdlbmN5PWxvdwotKwotKyAgKiBSZXZlcnQgdGhlIHByZXZpb3VzIHVwbG9hZC4gIEl0IGlzIG5ldmVyIGFjY2VwdGFibGUgdG8gc2ltcGx5IGRpc2FibGUKLSsgICAgdGVzdHMsIGVzcGVjaWFsbHkgd2hlbiBpdCB0dXJucyBvdXQgdGhhdCB0aGUgdGVzdCB0aGF0IHdhcyBkaXNhYmxlZAotKyAgICB3YXMgZmFpbGluZyBiZWNhdXNlIHRoZXJlIHdhcyBhIHNlcmlvdXMgYnVnIHRoYXQgY291bGQgY2F1c2Uga2VybmVsCi0rICAgIHBhbmljcyBmb3IgcGVvcGxlIG9uIGJvb3QuCi0rCi0rICAgIFRlc3Qgc3VpdGVzIGFyZSBoZXJlIGZvciBhIHJlYXNvbi4KLSsKLSsgICogQnVtcGVkIGxpYmRidXMgQnVpbGQtRGVwZW5kZW5jeSB0byB0aGUgdmVyc2lvbiB3aXRoIHRoZSBidWcgZml4IHRoYXQKLSsgICAgY2F1c2VkIHRoZSB0ZXN0IHN1aXRlIHRvIGZhaWwuCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+ICBXZWQsIDA4IERlYyAyMDEwIDE5OjQwOjE1ICswMDAwCi0rCi0rbGlibmloICgxLjAuMi0xdWJ1bnR1MykgbmF0dHk7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIERpc2FibGUgc29tZSB0ZXN0cyBvbiBwcGM2NCB0byBidWlsZCBhbiBpbml0aWFsIHBhY2thZ2UuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBUaHUsIDE4IE5vdiAyMDEwIDEwOjU5OjM4ICswMTAwCi0rCi0rbGlibmloICgxLjAuMi0xdWJ1bnR1MikgbWF2ZXJpY2s7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJlLWFkZCAtZlBJRSB0byB0aGUgdGVzdHN1aXRlIG9uIGFybWVsLCByZW1vdmluZyBhbGwgYXJtZWwtc3BlY2lmaWMgdGVzdHM7Ci0rICAgIGN1cnJlbnQgZ2NjLTQuNCBkb24ndCBzZWVtIGFmZmVjdGVkIGJ5IHRoZSBJQ0UgYW55bW9yZSAoc2VlIExQICMzOTg0MDMpLgotKwotKyAtLSBMb8OvYyBNaW5pZXIgPGxvaWMubWluaWVyQGxpbmFyby5vcmc+ICBNb24sIDIzIEF1ZyAyMDEwIDEwOjI1OjMxICswMjAwCi0rCi0rbGlibmloICgxLjAuMi0xdWJ1bnR1MSkgbWF2ZXJpY2s7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJlYnVpbGQgd2l0aCBsaWJjNi1kZXYgKD49IDIuMTJ+KSwgYWZ0ZXIgY2hlY2tpbmcgdGhhdAotKyAgICBfX2Fib3J0X21zZyBpcyBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgaW4gZWdsaWJjIDIuMTIuCi0rICAqIERvbid0IGJ1aWxkIHRoZSB0ZXN0c3VpdGUgd2l0aCAtZlBJRSBvbiBhcm1lbDsgTFA6ICMzOTg0MDMuCi0rCi0rIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBTdW4sIDMwIE1heSAyMDEwIDAyOjU0OjU2ICswMjAwCi0rCi0rbGlibmloICgxLjAuMi0xKSBtYXZlcmljazsgdXJnZW5jeT1sb3cKLSsKLSsgICogTmV3IHVwc3RyZWFtIHJlbGVhc2U6Ci0rICAgIC0gUmVuYW1lIEFDX0NPUFlSSUdIVCB0byBOSUhfQ09QWVJJR0hUIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggb3RoZXIKLSsgICAgICBwYWNrYWdlcy4KLSsgICAgLSBBZGQgc2VyaWFsIHRvIGxpYm5paC5tNAotKyAgICAtIEFkZCBOSUhfV0lUSF9MT0NBTF9MSUJOSUggbWFjcm8uCi0rCi0rICAqIEZpeCB1c2Ugb2YgJHtTb3VyY2UtVmVyc2lvbn0gdG8gYmUgJHtiaW5hcnk6VmVyc2lvbn0KLSsgICogQWRkIGRlYmlhbi9zb3VyY2UvZm9ybWF0IHdpdGggIjEuMCIgdG8gYmUgZnV0dXJlIGNvbXBhdGlibGUuCi0rICAqIEJ1bXAgc3RhbmRhcmRzIHZlcnNpb24uCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+ICBUdWUsIDI3IEFwciAyMDEwIDEwOjQ5OjU1IC0wNzAwCi0rCi0rbGlibmloICgxLjAuMS0xKSBsdWNpZDsgdXJnZW5jeT1sb3cKLSsKLSsgICogTmV3IHVwc3RyZWFtIHJlbGVhc2U6Ci0rICAgIC0gQWRkIG1pc3NpbmcgX19uaWhfKiBzeW1ib2xzIHRvIGxpbmtlciB2ZXJzaW9uIHNjcmlwdCBzbyB0aGF0IHdlCi0rICAgICAgY2FuIGxpbmsgVXBzdGFydCdzIHRlc3Qgc3VpdGUuCi0rICAgIC0gR2xpYmMgX19hYm9ydF9tc2cgc3ltYm9sIG5vdyBvbmx5IGxpbmtlZCBhcyBhIHdlYWsgc3ltYm9sLgotKwotKyAtLSBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEB1YnVudHUuY29tPiAgVGh1LCAwNCBGZWIgMjAxMCAxNDo1MzoyNiAtMDgwMAotKwotK2xpYm5paCAoMS4wLjAtMmJ1aWxkMSkgbHVjaWQ7IHVyZ2VuY3k9bG93Ci0rCi0rICAqIFJlYnVpbGQgdG8gcGljayB1cCByZWxheGVkIGRlcGVuZGVuY3kgb24gbGliYzYsIGFmdGVyIGNoZWNraW5nIHRoYXQKLSsgICAgX19hYm9ydF9tc2cgaXMgYXZhaWxhYmxlIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGluIGVnbGliYyAyLjExLgotKyAgICBMUDogIzUwODcwMi4KLSsKLSsgLS0gTWF0dGhpYXMgS2xvc2UgPGRva29AdWJ1bnR1LmNvbT4gIE1vbiwgMTggSmFuIDIwMTAgMTY6MDk6MTMgKzAxMDAKLSsKLStsaWJuaWggKDEuMC4wLTIpIGx1Y2lkOyB1cmdlbmN5PWxvdwotKwotKyAgKiBkZWJpYW4vY29udHJvbDogQWRkIGJ1aWxkLWRlcGVuZGVuY3kgb24gZGJ1cyBzbyB0aGUgdGVzdCBzdWl0ZSBjYW4KLSsgICAgcGFzcyBvbiB0aGUgYnVpbGRkcy4KLSsKLSsgLS0gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4gIFNhdCwgMjggTm92IDIwMDkgMjM6Mjg6MjcgKzAwMDAKLSsKLStsaWJuaWggKDEuMC4wLTEpIGx1Y2lkOyB1cmdlbmN5PWxvdwotKwotKyAgKiBGaXJzdCB1cHN0cmVhbSByZWxlYXNlLiAgUHJldmlvdXNseSB0aGlzIGNvZGUgd2FzIGluY2x1ZGVkIGluIHRoZQotKyAgICB1cHN0YXJ0LCBtb3VudGFsbCBhbmQgdXJlYWRhaGVhZCBzb3VyY2UgcGFja2FnZXMuCi0rCi0rIC0tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+ICBTYXQsIDI4IE5vdiAyMDA5IDIxOjE0OjAwICswMDAwCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvZGViaWFuL3NvdXJjZS9mb3JtYXQKLSsrKyBsaWJuaWgtMS4wLjMvZGViaWFuL3NvdXJjZS9mb3JtYXQKLUBAIC0wLDAgKzEgQEAKLSsxLjAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy9kYnVzX3Byb3h5LmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMvZGJ1c19wcm94eS5oCi1AQCAtMTQ2LDE0ICsxNDYsMTQgQEAKLSAJCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXRoLAotIAkJCQkJICAgIE5paERCdXNMb3N0SGFuZGxlciBsb3N0X2hhbmRsZXIsCi0gCQkJCQkgICAgdm9pZCAqZGF0YSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOaWhEQnVzUHJveHlTaWduYWwgKm5paF9kYnVzX3Byb3h5X2Nvbm5lY3QgKE5paERCdXNQcm94eSAqcHJveHksCi0gCQkJCQkgICAgY29uc3QgTmloREJ1c0ludGVyZmFjZSAqaW50ZXJmYWNlLAotIAkJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gCQkJCQkgICAgTmloREJ1c1NpZ25hbEhhbmRsZXIgaGFuZGxlciwKLSAJCQkJCSAgICB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMvZGJ1c19vYmplY3QuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy9kYnVzX29iamVjdC5oCi1AQCAtNjEsOCArNjEsNyBAQAotIAkJCQkgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCi0gCQkJCSAgICBjb25zdCBjaGFyICpwYXRoLAotIAkJCQkgICAgY29uc3QgTmloREJ1c0ludGVyZmFjZSAqKmludGVyZmFjZXMsCi0tCQkJCSAgICB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSk7Ci0rCQkJCSAgICB2b2lkICpkYXRhKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzL2RidXNfdXRpbC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzL2RidXNfdXRpbC5oCi1AQCAtMjYsNyArMjYsNyBAQAotIE5JSF9CRUdJTl9FWFRFUk4KLSAKLSBjaGFyICpuaWhfZGJ1c19wYXRoIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnJvb3QsIC4uLikKLS0JX19hdHRyaWJ1dGVfXyAoKHNlbnRpbmVsLCB3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgoc2VudGluZWwsIHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMvZGJ1c19wZW5kaW5nX2RhdGEuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy9kYnVzX3BlbmRpbmdfZGF0YS5oCi1AQCAtMTA0LDcgKzEwNCw3IEBACi0gCQkJCQkgICAgICAgTmloREJ1c1JlcGx5SGFuZGxlciBoYW5kbGVyLAotIAkJCQkJICAgICAgIE5paERCdXNFcnJvckhhbmRsZXIgZXJyb3JfaGFuZGxlciwKLSAJCQkJCSAgICAgICB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMvZGJ1c19wcm94eS5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzL2RidXNfcHJveHkuYwotQEAgLTQ2LDExICs0NiwxMSBAQAotIAlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gc3RhdGljIGNoYXIgKm5paF9kYnVzX3Byb3h5X25hbWVfcnVsZSAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkgICAgICAgTmloREJ1c1Byb3h5ICpwcm94eSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBzdGF0aWMgaW50ICAgbmloX2RidXNfcHJveHlfc2lnbmFsX2Rlc3Ryb3kgICAgKE5paERCdXNQcm94eVNpZ25hbCAqcHJveGllZCk7Ci0gc3RhdGljIGNoYXIgKm5paF9kYnVzX3Byb3h5X3NpZ25hbF9ydWxlICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkgICAgICAgTmloREJ1c1Byb3h5U2lnbmFsICpwcm94aWVkKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIC8qIFByb3RvdHlwZXMgZm9yIGhhbmRsZXIgZnVuY3Rpb25zICovCi0gc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0IG5paF9kYnVzX3Byb3h5X25hbWVfb3duZXJfY2hhbmdlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9zeW1ib2wuYwotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3N5bWJvbC5jCi1AQCAtNDAsMTAgKzQwLDEwIEBACi0gLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucyAqLwotIHN0YXRpYyBjaGFyICpzeW1ib2xfc3RyY2F0X2ludGVyZmFjZSAoY2hhciAqKnN0ciwgY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLS0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSwgd2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSwgd2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gc3RhdGljIGNoYXIgKnN5bWJvbF9zdHJjYXRfdGl0bGUgICAgIChjaGFyICoqc3RyLCBjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpLCB3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpLCB3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSAKLSAvKioKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL2RlbWFyc2hhbC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvZGVtYXJzaGFsLmgKLUBAIC0zNyw3ICszNyw3IEBACi0gCQkgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLAotIAkJIGNvbnN0IGNoYXIgKm1lbWJlcl9zeW1ib2wsIGNvbnN0IGNoYXIgKnN5bWJvbCwKLSAJCSBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9zeW1ib2wuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3N5bWJvbC5oCi1AQCAtMjgsMjIgKzI4LDIyIEBACi0gaW50ICAgc3ltYm9sX3ZhbGlkICAgICAoY29uc3QgY2hhciAqc3ltYm9sKTsKLSAKLSBjaGFyICpzeW1ib2xfZnJvbV9uYW1lIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqc3ltYm9sX2ltcGwgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJY29uc3QgY2hhciAqaW50ZXJmYWNlX25hbWUsIGNvbnN0IGNoYXIgKm5hbWUsCi0gCQkJY29uc3QgY2hhciAqcG9zdGZpeCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICpzeW1ib2xfZXh0ZXJuICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQljb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLCBjb25zdCBjaGFyICptaWRmaXgsCi0gCQkJY29uc3QgY2hhciAqc3ltYm9sLCBjb25zdCBjaGFyICpwb3N0Zml4KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKnN5bWJvbF90eXBlZGVmICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCWNvbnN0IGNoYXIgKmludGVyZmFjZV9zeW1ib2wsIGNvbnN0IGNoYXIgKm1pZGZpeCwKLSAJCQljb25zdCBjaGFyICpzeW1ib2wsIGNvbnN0IGNoYXIgKnBvc3RmaXgpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL291dHB1dC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvb3V0cHV0LmgKLUBAIC0zNSw5ICszNSw5IEBACi0gCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICpvdXRwdXRfcHJlYW1ibGUgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcGF0aCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICpvdXRwdXRfc2VudGluZWwgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcGF0aCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvcGFyc2UuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3BhcnNlLmgKLUBAIC05NSw3ICs5NSw3IEBACi0gCi0gUGFyc2VTdGFjayAqcGFyc2Vfc3RhY2tfcHVzaCAoY29uc3Qgdm9pZCAqcGFyZW50LCBOaWhMaXN0ICpzdGFjaywKLSAJCQkgICAgICBQYXJzZVN0YWNrVHlwZSB0eXBlLCB2b2lkICpkYXRhKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIFBhcnNlU3RhY2sgKnBhcnNlX3N0YWNrX3RvcCAgKE5paExpc3QgKnN0YWNrKTsKLSAKLSB2b2lkICAgICAgICBwYXJzZV9zdGFydF90YWcgIChYTUxfUGFyc2VyIHhtbHAsIGNvbnN0IGNoYXIgKnRhZywKLUBAIC0xMDMsNyArMTAzLDcgQEAKLSB2b2lkICAgICAgICBwYXJzZV9lbmRfdGFnICAgIChYTUxfUGFyc2VyIHhtbHAsIGNvbnN0IGNoYXIgKnRhZyk7Ci0gCi0gTm9kZSAqICAgICAgcGFyc2VfeG1sICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBpbnQgZmQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC90eXBlLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90eXBlLmgKLUBAIC05NCw0MyArOTQsNDMgQEAKLSAKLSBjaGFyICogICAgICB0eXBlX29mICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKiBwYXJlbnQsCi0gCQkJCSAgIERCdXNTaWduYXR1cmVJdGVyICppdGVyKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIFR5cGVWYXIgKiAgIHR5cGVfdmFyX25ldyAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICp0eXBlLAotIAkJCQkgICBjb25zdCBjaGFyICpuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICAgIHR5cGVfdmFyX3RvX3N0cmluZyAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBUeXBlVmFyICp2YXIpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICAgdHlwZV92YXJfbGF5b3V0ICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIE5paExpc3QgKnZhcnMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gVHlwZUZ1bmMgKiAgdHlwZV9mdW5jX25ldyAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnR5cGUsCi0gCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICAgdHlwZV9mdW5jX3RvX3N0cmluZyAgIChjb25zdCB2b2lkICpwYXJlbnQsIFR5cGVGdW5jICpmdW5jKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICAgIHR5cGVfZnVuY190b190eXBlZGVmICAoY29uc3Qgdm9pZCAqcGFyZW50LCBUeXBlRnVuYyAqZnVuYykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgICB0eXBlX2Z1bmNfbGF5b3V0ICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgTmloTGlzdCAqZnVuY3MpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gVHlwZVN0cnVjdCAqdHlwZV9zdHJ1Y3RfbmV3ICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICAgdHlwZV9zdHJ1Y3RfdG9fc3RyaW5nIChjb25zdCB2b2lkICpwYXJlbnQsIFR5cGVTdHJ1Y3QgKnN0cnVjdHVyZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgICB0eXBlX3RvX2NvbnN0ICAgICAgICAgKGNoYXIgKip0eXBlLCBjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICAgdHlwZV90b19wb2ludGVyICAgICAgIChjaGFyICoqdHlwZSwgY29uc3Qgdm9pZCAqcGFyZW50KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICAgIHR5cGVfdG9fc3RhdGljICAgICAgICAoY2hhciAqKnR5cGUsIGNvbnN0IHZvaWQgKnBhcmVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICogICAgICB0eXBlX3RvX2V4dGVybiAgICAgICAgKGNoYXIgKip0eXBlLCBjb25zdCB2b2lkICpwYXJlbnQpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgICAgdHlwZV9zdHJjYXRfYXNzZXJ0ICAgIChjaGFyICoqYmxvY2ssIGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJICAgVHlwZVZhciAqdmFyLCBUeXBlVmFyICpwcmV2LCBUeXBlVmFyICpuZXh0KQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9hcmd1bWVudC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvYXJndW1lbnQuaAotQEAgLTYxLDcgKzYxLDcgQEAKLSAKLSBBcmd1bWVudCAqYXJndW1lbnRfbmV3ICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAotIAkJCSAgICAgICBjb25zdCBjaGFyICp0eXBlLCBOaWhEQnVzQXJnRGlyIGRpcmVjdGlvbikKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgYXJndW1lbnRfc3RhcnRfdGFnICAoWE1MX1BhcnNlciB4bWxwLCBjb25zdCBjaGFyICp0YWcsCi0gCQkJICAgICAgIGNoYXIgKiBjb25zdCAqYXR0cikKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL2luZGVudC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvaW5kZW50LmgKLUBAIC0yNiw5ICsyNiw5IEBACi0gTklIX0JFR0lOX0VYVEVSTgotIAotIGNoYXIgKmluZGVudCAgKGNoYXIgKipzdHIsIGNvbnN0IHZvaWQgKnBhcmVudCwgaW50IGxldmVsKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKmNvbW1lbnQgKGNoYXIgKipzdHIsIGNvbnN0IHZvaWQgKnBhcmVudCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvbWFpbi5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvbWFpbi5jCi1AQCAtNTIsMTAgKzUyLDEwIEBACi0gLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCi0gY2hhciAqc291cmNlX2ZpbGVfcGF0aCAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpvdXRwdXRfcGF0aCwKLSAJCQljb25zdCBjaGFyICpmaWxlbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBjaGFyICpoZWFkZXJfZmlsZV9wYXRoIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm91dHB1dF9wYXRoLAotIAkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIAotIC8qKgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvc2lnbmFsLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9zaWduYWwuaAotQEAgLTU4LDcgKzU4LDcgQEAKLSBpbnQgICAgICAgc2lnbmFsX25hbWVfdmFsaWQgICAgICAoY29uc3QgY2hhciAqbmFtZSk7Ci0gCi0gU2lnbmFsICogIHNpZ25hbF9uZXcgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgc2lnbmFsX3N0YXJ0X3RhZyAgICAgICAoWE1MX1BhcnNlciB4bWxwLCBjb25zdCBjaGFyICp0YWcsCi0gCQkJCSAgY2hhciAqIGNvbnN0ICphdHRyKQotQEAgLTc2LDE4ICs3NiwxOCBAQAotIGNoYXIgKiAgICBzaWduYWxfb2JqZWN0X2Z1bmN0aW9uIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJICBJbnRlcmZhY2UgKmludGVyZmFjZSwgU2lnbmFsICpzaWduYWwsCi0gCQkJCSAgTmloTGlzdCAqcHJvdG90eXBlcywgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgc2lnbmFsX3Byb3h5X2Z1bmN0aW9uICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCSAgSW50ZXJmYWNlICppbnRlcmZhY2UsIFNpZ25hbCAqc2lnbmFsLAotIAkJCQkgIE5paExpc3QgKnByb3RvdHlwZXMsIE5paExpc3QgKnR5cGVkZWZzLAotIAkJCQkgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIHNpZ25hbF9hcmdzX2FycmF5ICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkgIEludGVyZmFjZSAqaW50ZXJmYWNlLCBTaWduYWwgKnNpZ25hbCwKLSAJCQkJICBOaWhMaXN0ICpwcm90b3R5cGVzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIE5JSF9FTkRfRVhURVJOCi0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9tYXJzaGFsLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9tYXJzaGFsLmMKLUBAIC00OSw3ICs0OSw3IEBACi0gCQkJICAgICBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmludGVyZmFjZV9zeW1ib2wsCi0gCQkJICAgICBjb25zdCBjaGFyICptZW1iZXJfc3ltYm9sLCBjb25zdCBjaGFyICpzeW1ib2wsCi0gCQkJICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHN0YXRpYyBjaGFyICptYXJzaGFsX2FycmF5ICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCSAgICAgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCi0gCQkJICAgICBjb25zdCBjaGFyICppdGVyX25hbWUsIGNvbnN0IGNoYXIgKm5hbWUsCi1AQCAtNTgsNyArNTgsNyBAQAotIAkJCSAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLAotIAkJCSAgICAgY29uc3QgY2hhciAqbWVtYmVyX3N5bWJvbCwgY29uc3QgY2hhciAqc3ltYm9sLAotIAkJCSAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBzdGF0aWMgY2hhciAqbWFyc2hhbF9zdHJ1Y3QgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkgICAgIERCdXNTaWduYXR1cmVJdGVyICppdGVyLAotIAkJCSAgICAgY29uc3QgY2hhciAqaXRlcl9uYW1lLCBjb25zdCBjaGFyICpuYW1lLAotQEAgLTY3LDcgKzY3LDcgQEAKLSAJCQkgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqaW50ZXJmYWNlX3N5bWJvbCwKLSAJCQkgICAgIGNvbnN0IGNoYXIgKm1lbWJlcl9zeW1ib2wsIGNvbnN0IGNoYXIgKnN5bWJvbCwKLSAJCQkgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gCi0gLyoqCi1AQCAtMzY0LDYgKzM2NCw3IEBACi0gCW5paF9sb2NhbCBUeXBlVmFyICplbGVtZW50X2xlbl92YXIgPSBOVUxMOwotIAluaWhfbG9jYWwgY2hhciAqICAgYmxvY2sgPSBOVUxMOwotIAluaWhfbG9jYWwgY2hhciAqICAgdmFyc19ibG9jayA9IE5VTEw7Ci0rCW5paF9sb2NhbCBjaGFyICogICBsb29wX2Jsb2NrID0gTlVMTDsKLSAKLSAJbmloX2Fzc2VydCAoaXRlciAhPSBOVUxMKTsKLSAJbmloX2Fzc2VydCAoaXRlcl9uYW1lICE9IE5VTEwpOwotQEAgLTQ0OCw3ICs0NDksNyBAQAotIAluaWhfbGlzdF9hZGQgKGxvY2FscywgJmFycmF5X2l0ZXJfdmFyLT5lbnRyeSk7Ci0gCi0gCWlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkpIHsKLS0JCWlmICghIG5paF9zdHJjYXRfc3ByaW50ZiAoJmNvZGUsIHBhcmVudCwKLSsJCWlmICghIG5paF9zdHJjYXRfc3ByaW50ZiAoJmxvb3BfYmxvY2ssIHBhcmVudCwKLSAJCQkJCSAgImZvciAoc2l6ZV90ICVzID0gMDsgJXMgPCAlczsgJXMrKykge1xuIiwKLSAJCQkJCSAgbG9vcF9uYW1lLCBsb29wX25hbWUsIGxlbl9uYW1lLCBsb29wX25hbWUpKSB7Ci0gCQkJbmloX2ZyZWUgKGNvZGUpOwotQEAgLTQ1Niw2ICs0NTcsMTIgQEAKLSAJCX0KLSAJfSBlbHNlIHsKLSAJCWlmICghIG5paF9zdHJjYXRfc3ByaW50ZiAoJmNvZGUsIHBhcmVudCwKLSsJCQkJCSAgImlmICglcykge1xuIiwKLSsJCQkJCSAgbmFtZSkpIHsKLSsJCQluaWhfZnJlZSAoY29kZSk7Ci0rCQkJcmV0dXJuIE5VTEw7Ci0rCQl9Ci0rCQlpZiAoISBuaWhfc3RyY2F0X3NwcmludGYgKCZsb29wX2Jsb2NrLCBwYXJlbnQsCi0gCQkJCQkgICJmb3IgKHNpemVfdCAlcyA9IDA7ICVzWyVzXTsgJXMrKykge1xuIiwKLSAJCQkJCSAgbG9vcF9uYW1lLCBuYW1lLCBsb29wX25hbWUsIGxvb3BfbmFtZSkpIHsKLSAJCQluaWhfZnJlZSAoY29kZSk7Ci1AQCAtNTc2LDcgKzU4Myw3IEBACi0gCX0KLSAKLSAKLS0JaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmY29kZSwgcGFyZW50LAotKwlpZiAoISBuaWhfc3RyY2F0X3NwcmludGYgKCZsb29wX2Jsb2NrLCBwYXJlbnQsCi0gCQkJICAgIiVzIgotIAkJCSAgICJcbiIKLSAJCQkgICAiJXMiCi1AQCAtNTkwLDkgKzU5NywzNCBAQAotIAl9Ci0gCi0gCS8qIENsb3NlIHRoZSBjb250YWluZXIgYWdhaW4gKi8KLSsJaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmbG9vcF9ibG9jaywgcGFyZW50LAotKwkJCQkgICJ9XG4iKSkgewotKwkJbmloX2ZyZWUgKGNvZGUpOwotKwkJcmV0dXJuIE5VTEw7Ci0rCX0KLSsKLSsJaWYgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSkgewotKwkJaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmY29kZSwgcGFyZW50LAotKwkJCQkgIiVzXG4iLCBsb29wX2Jsb2NrKSkgewotKwkJCW5paF9mcmVlIChjb2RlKTsKLSsJCQlyZXR1cm4gTlVMTDsKLSsJCX0KLSsJfQotKwllbHNlIHsKLSsJCWlmICghIGluZGVudCAoJmxvb3BfYmxvY2ssIE5VTEwsIDEpKSB7Ci0rCQkJbmloX2ZyZWUgKGNvZGUpOwotKwkJCXJldHVybiBOVUxMOwotKwkJfQotKwotKwkJaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmY29kZSwgcGFyZW50LAotKwkJCQkgIiVzIgotKwkJCQkgIn1cblxuIiwgbG9vcF9ibG9jaykpIHsKLSsJCQluaWhfZnJlZSAoY29kZSk7Ci0rCQkJcmV0dXJuIE5VTEw7Ci0rCQl9Ci0rCX0KLSsKLSAJaWYgKCEgbmloX3N0cmNhdF9zcHJpbnRmICgmY29kZSwgcGFyZW50LAotLQkJCQkgICJ9XG4iCi0tCQkJCSAgIlxuIgotIAkJCQkgICJpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCYlcywgJiVzKSkge1xuIgotIAkJCQkgICIlcyIKLSAJCQkJICAifVxuIiwKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL2RlbWFyc2hhbC5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvZGVtYXJzaGFsLmMKLUBAIC01MSw3ICs1MSw3IEBACi0gCQkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqaW50ZXJmYWNlX3N5bWJvbCwKLSAJCQkgICAgICAgY29uc3QgY2hhciAqbWVtYmVyX3N5bWJvbCwgY29uc3QgY2hhciAqc3ltYm9sLAotIAkJCSAgICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHN0YXRpYyBjaGFyICpkZW1hcnNoYWxfYXJyYXkgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJICAgICAgIERCdXNTaWduYXR1cmVJdGVyICppdGVyLAotIAkJCSAgICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKLUBAIC02Miw3ICs2Miw3IEBACi0gCQkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqaW50ZXJmYWNlX3N5bWJvbCwKLSAJCQkgICAgICAgY29uc3QgY2hhciAqbWVtYmVyX3N5bWJvbCwgY29uc3QgY2hhciAqc3ltYm9sLAotIAkJCSAgICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIHN0YXRpYyBjaGFyICpkZW1hcnNoYWxfc3RydWN0IChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJICAgICAgIERCdXNTaWduYXR1cmVJdGVyICppdGVyLAotIAkJCSAgICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKLUBAIC03Myw3ICs3Myw3IEBACi0gCQkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqaW50ZXJmYWNlX3N5bWJvbCwKLSAJCQkgICAgICAgY29uc3QgY2hhciAqbWVtYmVyX3N5bWJvbCwgY29uc3QgY2hhciAqc3ltYm9sLAotIAkJCSAgICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIAotIC8qKgotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvaW50ZXJmYWNlLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9pbnRlcmZhY2UuaAotQEAgLTYxLDcgKzYxLDcgQEAKLSAKLSBJbnRlcmZhY2UgKmludGVyZmFjZV9uZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGludCAgICAgICAgaW50ZXJmYWNlX3N0YXJ0X3RhZyAgICAgICAgICAgICAgICAgICAgIChYTUxfUGFyc2VyIHhtbHAsCi0gCQkJCQkJICAgIGNvbnN0IGNoYXIgKnRhZywKLUBAIC04MSwyNiArODEsMjYgQEAKLSAJCQkJCQkgICAgSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gCQkJCQkJICAgIGludCB3aXRoX2hhbmRsZXJzLAotIAkJCQkJCSAgICBOaWhMaXN0ICpwcm90b3R5cGVzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICAgaW50ZXJmYWNlX3NpZ25hbHNfYXJyYXkgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkJICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCQkgICAgSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gCQkJCQkJICAgIGludCB3aXRoX2ZpbHRlcnMsCi0gCQkJCQkJICAgIE5paExpc3QgKnByb3RvdHlwZXMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICBpbnRlcmZhY2VfcHJvcGVydGllc19hcnJheSAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCQkgICAgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJCSAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLSAJCQkJCQkgICAgaW50IHdpdGhfaGFuZGxlcnMsCi0gCQkJCQkJICAgIE5paExpc3QgKnByb3RvdHlwZXMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgICBpbnRlcmZhY2Vfc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCQkgICAgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJCSAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLSAJCQkJCQkgICAgaW50IG9iamVjdCwKLSAJCQkJCQkgICAgTmloTGlzdCAqcHJvdG90eXBlcykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSAKLSBjaGFyICogICAgIGludGVyZmFjZV9wcm94eV9nZXRfYWxsX2Z1bmN0aW9uICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LAotQEAgLTEwOCw3ICsxMDgsNyBAQAotIAkJCQkJCSAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLSAJCQkJCQkgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCQkgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgIGludGVyZmFjZV9wcm94eV9nZXRfYWxsX25vdGlmeV9mdW5jdGlvbiAoY29uc3Qgdm9pZCAqcGFyZW50LAotIAkJCQkJCSAgICBjb25zdCBjaGFyICpwcmVmaXgsCi1AQCAtMTE2LDE0ICsxMTYsMTQgQEAKLSAJCQkJCQkgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCQkgICAgTmloTGlzdCAqdHlwZWRlZnMsCi0gCQkJCQkJICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgICBpbnRlcmZhY2VfcHJveHlfZ2V0X2FsbF9zeW5jX2Z1bmN0aW9uICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCQkgICAgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJCSAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLSAJCQkJCQkgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCQkgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvbWV0aG9kLmgKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC9tZXRob2QuaAotQEAgLTYyLDcgKzYyLDcgQEAKLSBpbnQgICAgICAgbWV0aG9kX25hbWVfdmFsaWQgICAgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSk7Ci0gCi0gTWV0aG9kICogIG1ldGhvZF9uZXcgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgbWV0aG9kX3N0YXJ0X3RhZyAgICAgICAgICAgICAoWE1MX1BhcnNlciB4bWxwLCBjb25zdCBjaGFyICp0YWcsCi0gCQkJCQljaGFyICogY29uc3QgKmF0dHIpCi1AQCAtODIsMzMgKzgyLDMzIEBACi0gCQkJCQlJbnRlcmZhY2UgKmludGVyZmFjZSwgTWV0aG9kICptZXRob2QsCi0gCQkJCQlOaWhMaXN0ICpwcm90b3R5cGVzLCBOaWhMaXN0ICpoYW5kbGVycywKLSAJCQkJCU5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIG1ldGhvZF9yZXBseV9mdW5jdGlvbiAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkJSW50ZXJmYWNlICppbnRlcmZhY2UsIE1ldGhvZCAqbWV0aG9kLAotIAkJCQkJTmloTGlzdCAqcHJvdG90eXBlcywgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgbWV0aG9kX3Byb3h5X2Z1bmN0aW9uICAgICAgICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQlJbnRlcmZhY2UgKmludGVyZmFjZSwgTWV0aG9kICptZXRob2QsCi0gCQkJCQlOaWhMaXN0ICpwcm90b3R5cGVzLCBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICBtZXRob2RfcHJveHlfbm90aWZ5X2Z1bmN0aW9uIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCUludGVyZmFjZSAqaW50ZXJmYWNlLCBNZXRob2QgKm1ldGhvZCwKLSAJCQkJCU5paExpc3QgKnByb3RvdHlwZXMsIE5paExpc3QgKnR5cGVkZWZzLAotIAkJCQkJTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBjaGFyICogICAgbWV0aG9kX3Byb3h5X3N5bmNfZnVuY3Rpb24gICAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQlJbnRlcmZhY2UgKmludGVyZmFjZSwgTWV0aG9kICptZXRob2QsCi0gCQkJCQlOaWhMaXN0ICpwcm90b3R5cGVzLCBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICBtZXRob2RfYXJnc19hcnJheSAgICAgICAgICAgIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCUludGVyZmFjZSAqaW50ZXJmYWNlLCBNZXRob2QgKm1ldGhvZCwKLSAJCQkJCU5paExpc3QgKnByb3RvdHlwZXMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL25vZGUuaAotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL25vZGUuaAotQEAgLTQ3LDcgKzQ3LDcgQEAKLSBpbnQgICAgICAgIG5vZGVfcGF0aF92YWxpZCAgICAgICAoY29uc3QgY2hhciAqbmFtZSk7Ci0gCi0gTm9kZSAqICAgICBub2RlX25ldyAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcGF0aCkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBpbnQgICAgICAgIG5vZGVfc3RhcnRfdGFnICAgICAgICAoWE1MX1BhcnNlciB4bWxwLCBjb25zdCBjaGFyICp0YWcsCi0gCQkJCSAgY2hhciAqIGNvbnN0ICphdHRyKQotQEAgLTU5LDE4ICs1OSwxOCBAQAotIAotIGNoYXIgKiAgICAgbm9kZV9pbnRlcmZhY2VzX2FycmF5IChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJICBOb2RlICpub2RlLCBpbnQgb2JqZWN0LCBOaWhMaXN0ICpwcm90b3R5cGVzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIAotIGNoYXIgKiAgICAgbm9kZV9vYmplY3RfZnVuY3Rpb25zIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJICBOb2RlICpub2RlLAotIAkJCQkgIE5paExpc3QgKnByb3RvdHlwZXMsIE5paExpc3QgKmhhbmRsZXJzLAotIAkJCQkgIE5paExpc3QgKnN0cnVjdHMsIE5paExpc3QgKmV4dGVybnMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgICBub2RlX3Byb3h5X2Z1bmN0aW9ucyAgKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcHJlZml4LAotIAkJCQkgIE5vZGUgKm5vZGUsCi0gCQkJCSAgTmloTGlzdCAqcHJvdG90eXBlcywgTmloTGlzdCAqc3RydWN0cywKLSAJCQkJICBOaWhMaXN0ICp0eXBlZGVmcywgTmloTGlzdCAqZXh0ZXJucykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvbWFyc2hhbC5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvbWFyc2hhbC5oCi1AQCAtMzUsNyArMzUsNyBAQAotIAkgICAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICppbnRlcmZhY2Vfc3ltYm9sLAotIAkgICAgICAgY29uc3QgY2hhciAqbWVtYmVyX3N5bWJvbCwgY29uc3QgY2hhciAqc3ltYm9sLAotIAkgICAgICAgTmloTGlzdCAqc3RydWN0cykKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSAKLSBOSUhfRU5EX0VYVEVSTgotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdHlwZS5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdHlwZS5jCi1AQCAtMTEwMSw3ICsxMTAxLDcgQEAKLSAJbmloX2Fzc2VydCAoYmxvY2sgIT0gTlVMTCk7Ci0gCW5paF9hc3NlcnQgKHZhciAhPSBOVUxMKTsKLSAKLS0JaWYgKCEgc3RyY2hyICh2YXItPnR5cGUsICcqJykpCi0rCWlmICghIHN0cmNociAodmFyLT50eXBlLCAnKicpIHx8ICEgc3RyY21wICh2YXItPnR5cGUsICJjaGFyICogY29uc3QgKiIpKQotIAkJcmV0dXJuICpibG9jazsKLSAKLSAJaWYgKG5leHQgJiYgKCEgc3RyY21wIChuZXh0LT50eXBlLCAic2l6ZV90IikpKSB7Ci0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC9wcm9wZXJ0eS5oCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvcHJvcGVydHkuaAotQEAgLTY1LDcgKzY1LDcgQEAKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gCQkJCQkgICAgICBjb25zdCBjaGFyICp0eXBlLAotIAkJCQkJICAgICAgTmloREJ1c0FjY2VzcyBhY2Nlc3MpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gaW50ICAgICAgIHByb3BlcnR5X3N0YXJ0X3RhZyAgICAgICAgICAgICAgICAgKFhNTF9QYXJzZXIgeG1scCwgY29uc3QgY2hhciAqdGFnLAotIAkJCQkJICAgICAgY2hhciAqIGNvbnN0ICphdHRyKQotQEAgLTg4LDcgKzg4LDcgQEAKLSAJCQkJCSAgICAgIE5paExpc3QgKnByb3RvdHlwZXMsCi0gCQkJCQkgICAgICBOaWhMaXN0ICpoYW5kbGVycywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgIHByb3BlcnR5X29iamVjdF9zZXRfZnVuY3Rpb24gICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCSAgICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotQEAgLTk2LDcgKzk2LDcgQEAKLSAJCQkJCSAgICAgIE5paExpc3QgKnByb3RvdHlwZXMsCi0gCQkJCQkgICAgICBOaWhMaXN0ICpoYW5kbGVycywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIHByb3BlcnR5X3Byb3h5X2dldF9mdW5jdGlvbiAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLUBAIC0xMDQsNyArMTA0LDcgQEAKLSAJCQkJCSAgICAgIFByb3BlcnR5ICpwcm9wZXJ0eSwKLSAJCQkJCSAgICAgIE5paExpc3QgKnByb3RvdHlwZXMsCi0gCQkJCQkgICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICBwcm9wZXJ0eV9wcm94eV9nZXRfbm90aWZ5X2Z1bmN0aW9uIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkgICAgICBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQkgICAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLUBAIC0xMTIsNyArMTEyLDcgQEAKLSAJCQkJCSAgICAgIE5paExpc3QgKnByb3RvdHlwZXMsCi0gCQkJCQkgICAgICBOaWhMaXN0ICp0eXBlZGVmcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIHByb3BlcnR5X3Byb3h5X3NldF9mdW5jdGlvbiAgICAgICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLUBAIC0xMjAsNyArMTIwLDcgQEAKLSAJCQkJCSAgICAgIFByb3BlcnR5ICpwcm9wZXJ0eSwKLSAJCQkJCSAgICAgIE5paExpc3QgKnByb3RvdHlwZXMsCi0gCQkJCQkgICAgICBOaWhMaXN0ICpzdHJ1Y3RzKQotLQlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0LCBtYWxsb2MpKTsKLSsJX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwotIGNoYXIgKiAgICBwcm9wZXJ0eV9wcm94eV9zZXRfbm90aWZ5X2Z1bmN0aW9uIChjb25zdCB2b2lkICpwYXJlbnQsCi0gCQkJCQkgICAgICBjb25zdCBjaGFyICpwcmVmaXgsCi0gCQkJCQkgICAgICBJbnRlcmZhY2UgKmludGVyZmFjZSwKLUBAIC0xMjgsNyArMTI4LDcgQEAKLSAJCQkJCSAgICAgIE5paExpc3QgKnByb3RvdHlwZXMsCi0gCQkJCQkgICAgICBOaWhMaXN0ICp0eXBlZGVmcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gY2hhciAqICAgIHByb3BlcnR5X3Byb3h5X2dldF9zeW5jX2Z1bmN0aW9uICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLUBAIC0xMzYsMTQgKzEzNiwxNCBAQAotIAkJCQkJICAgICAgUHJvcGVydHkgKnByb3BlcnR5LAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gY2hhciAqICAgIHByb3BlcnR5X3Byb3h5X3NldF9zeW5jX2Z1bmN0aW9uICAgKGNvbnN0IHZvaWQgKnBhcmVudCwKLSAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLSAJCQkJCSAgICAgIEludGVyZmFjZSAqaW50ZXJmYWNlLAotIAkJCQkJICAgICAgUHJvcGVydHkgKnByb3BlcnR5LAotIAkJCQkJICAgICAgTmloTGlzdCAqcHJvdG90eXBlcywKLSAJCQkJCSAgICAgIE5paExpc3QgKnN0cnVjdHMpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gTklIX0VORF9FWFRFUk4KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfbWFpbi5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdGVzdHMvdGVzdF9tYWluLmMKLUBAIC0xMDAsMTAgKzEwMCwxMCBAQAotIAotIGV4dGVybiBjaGFyICpzb3VyY2VfZmlsZV9wYXRoIChjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm91dHB1dF9wYXRoLAotIAkJCSAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLS0JX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCwgbWFsbG9jKSk7Ci0rCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKLSBleHRlcm4gY2hhciAqaGVhZGVyX2ZpbGVfcGF0aCAoY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpvdXRwdXRfcGF0aCwKLSAJCQkgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi0tCV9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQsIG1hbGxvYykpOwotKwlfX2F0dHJpYnV0ZV9fICgod2Fybl91bnVzZWRfcmVzdWx0KSk7Ci0gCi0gdm9pZAotIHRlc3Rfc291cmNlX2ZpbGVfcGF0aCAodm9pZCkKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfY29tLm5ldHNwbGl0Lk5paC5UZXN0X29iamVjdC5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdGVzdHMvdGVzdF9jb20ubmV0c3BsaXQuTmloLlRlc3Rfb2JqZWN0LmMKLUBAIC0xMjUyNCw2ICsxMjUyNCw3IEBACi0gCQlkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChyZXBseSwgJml0ZXIpOwotIAotIAkJZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmaXRlciwgJnN0cl92YWx1ZSk7Ci0rCQlURVNUX05FIChzdHJfdmFsdWVbMF0sICdcMCcpOwotIAkJVEVTVF9UUlVFIChzdHJjaHIgKCIwMTIzNDU2Nzg5Iiwgc3RyX3ZhbHVlWzBdKSk7Ci0gCi0gCQlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3Rlc3RzL3Rlc3RfbWFyc2hhbC5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdGVzdHMvdGVzdF9tYXJzaGFsLmMKLUBAIC0xNDc5LDM5ICsxNDc5LDQxIEBACi0gCQkJCSAgICJcdHJldHVybiAtMTtcbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiZm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLS0JCQkJICAgIlx0REJ1c01lc3NhZ2VJdGVyIHZhbHVlX2VsZW1lbnRfaXRlcjtcbiIKLS0JCQkJICAgIlx0Y29uc3QgaW50MTZfdCAqIHZhbHVlX2VsZW1lbnQ7XG4iCi0tCQkJCSAgICJcdHNpemVfdCAgICAgICAgICB2YWx1ZV9lbGVtZW50X2xlbjtcbiIKLSsJCQkJICAgImlmICh2YWx1ZSkge1xuIgotKwkJCQkgICAiXHRmb3IgKHNpemVfdCB2YWx1ZV9pID0gMDsgdmFsdWVbdmFsdWVfaV07IHZhbHVlX2krKykge1xuIgotKwkJCQkgICAiXHRcdERCdXNNZXNzYWdlSXRlciB2YWx1ZV9lbGVtZW50X2l0ZXI7XG4iCi0rCQkJCSAgICJcdFx0Y29uc3QgaW50MTZfdCAqIHZhbHVlX2VsZW1lbnQ7XG4iCi0rCQkJCSAgICJcdFx0c2l6ZV90ICAgICAgICAgIHZhbHVlX2VsZW1lbnRfbGVuO1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2VsZW1lbnQgPSB2YWx1ZVt2YWx1ZV9pXTtcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudF9sZW4gPSB2YWx1ZV9sZW5bdmFsdWVfaV07XG4iCi0rCQkJCSAgICJcdFx0dmFsdWVfZWxlbWVudCA9IHZhbHVlW3ZhbHVlX2ldO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnRfbGVuID0gdmFsdWVfbGVuW3ZhbHVlX2ldO1xuIgotIAkJCQkgICAiXG4iCi0gCi0tCQkJCSAgICJcdC8qIE1hcnNoYWwgYW4gYXJyYXkgb250byB0aGUgbWVzc2FnZSAqL1xuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwgXCJuXCIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0rCQkJCSAgICJcdFx0LyogTWFyc2hhbCBhbiBhcnJheSBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCBEQlVTX1RZUEVfQVJSQVksIFwiblwiLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdGZvciAoc2l6ZV90IHZhbHVlX2VsZW1lbnRfaSA9IDA7IHZhbHVlX2VsZW1lbnRfaSA8IHZhbHVlX2VsZW1lbnRfbGVuOyB2YWx1ZV9lbGVtZW50X2krKykge1xuIgotLQkJCQkgICAiXHRcdGludDE2X3QgdmFsdWVfZWxlbWVudF9lbGVtZW50O1xuIgotKwkJCQkgICAiXHRcdGZvciAoc2l6ZV90IHZhbHVlX2VsZW1lbnRfaSA9IDA7IHZhbHVlX2VsZW1lbnRfaSA8IHZhbHVlX2VsZW1lbnRfbGVuOyB2YWx1ZV9lbGVtZW50X2krKykge1xuIgotKwkJCQkgICAiXHRcdFx0aW50MTZfdCB2YWx1ZV9lbGVtZW50X2VsZW1lbnQ7XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50X2VsZW1lbnQgPSB2YWx1ZV9lbGVtZW50W3ZhbHVlX2VsZW1lbnRfaV07XG4iCi0rCQkJCSAgICJcdFx0XHR2YWx1ZV9lbGVtZW50X2VsZW1lbnQgPSB2YWx1ZV9lbGVtZW50W3ZhbHVlX2VsZW1lbnRfaV07XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0XHQvKiBNYXJzaGFsIGEgaW50MTZfdCBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfSU5UMTYsICZ2YWx1ZV9lbGVtZW50X2VsZW1lbnQpKSB7XG4iCi0tCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0LyogTWFyc2hhbCBhIGludDE2X3Qgb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfSU5UMTYsICZ2YWx1ZV9lbGVtZW50X2VsZW1lbnQpKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0XHR9XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotKwkJCQkgICAiXG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLSAJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotIAkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotIAkJCQkgICAiXHRcdH1cbiIKLS0JCQkJICAgIlx0fVxuIgotLQkJCQkgICAiXG4iCi0tCQkJCSAgICJcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0gCi0rCQkJCSAgICJcdH1cbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotIAkJCQkgICAiaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpKSB7XG4iCi1AQCAtMTc2NiwxNSArMTc2OCwxNyBAQAotIAkJCQkgICAiXHRyZXR1cm4gLTE7XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgImZvciAoc2l6ZV90IHZhbHVlX2kgPSAwOyB2YWx1ZVt2YWx1ZV9pXTsgdmFsdWVfaSsrKSB7XG4iCi0tCQkJCSAgICJcdGNvbnN0IGNoYXIgKnZhbHVlX2VsZW1lbnQ7XG4iCi0rCQkJCSAgICJpZiAodmFsdWUpIHtcbiIKLSsJCQkJICAgIlx0Zm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLSsJCQkJICAgIlx0XHRjb25zdCBjaGFyICp2YWx1ZV9lbGVtZW50O1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2VsZW1lbnQgPSB2YWx1ZVt2YWx1ZV9pXTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50ID0gdmFsdWVbdmFsdWVfaV07XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9lbGVtZW50KSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfZWxlbWVudCkpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlx0fVxuIgotIAkJCQkgICAifVxuIgotIAkJCQkgICAiXG4iCi1AQCAtMTkzMywzNSArMTkzNywzOSBAQAotIAkJCQkgICAiXHRyZXR1cm4gLTE7XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgImZvciAoc2l6ZV90IHZhbHVlX2kgPSAwOyB2YWx1ZVt2YWx1ZV9pXTsgdmFsdWVfaSsrKSB7XG4iCi0tCQkJCSAgICJcdERCdXNNZXNzYWdlSXRlciB2YWx1ZV9lbGVtZW50X2l0ZXI7XG4iCi0tCQkJCSAgICJcdGNoYXIgKiBjb25zdCAqICB2YWx1ZV9lbGVtZW50O1xuIgotKwkJCQkgICAiaWYgKHZhbHVlKSB7XG4iCi0rCQkJCSAgICJcdGZvciAoc2l6ZV90IHZhbHVlX2kgPSAwOyB2YWx1ZVt2YWx1ZV9pXTsgdmFsdWVfaSsrKSB7XG4iCi0rCQkJCSAgICJcdFx0REJ1c01lc3NhZ2VJdGVyIHZhbHVlX2VsZW1lbnRfaXRlcjtcbiIKLSsJCQkJICAgIlx0XHRjaGFyICogY29uc3QgKiAgdmFsdWVfZWxlbWVudDtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHR2YWx1ZV9lbGVtZW50ID0gdmFsdWVbdmFsdWVfaV07XG4iCi0rCQkJCSAgICJcdFx0dmFsdWVfZWxlbWVudCA9IHZhbHVlW3ZhbHVlX2ldO1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdC8qIE1hcnNoYWwgYW4gYXJyYXkgb250byB0aGUgbWVzc2FnZSAqL1xuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwgXCJzXCIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0tCQkJCSAgICJcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0tCQkJCSAgICJcdFx0cmV0dXJuIC0xO1xuIgotLQkJCQkgICAiXHR9XG4iCi0tCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0Zm9yIChzaXplX3QgdmFsdWVfZWxlbWVudF9pID0gMDsgdmFsdWVfZWxlbWVudFt2YWx1ZV9lbGVtZW50X2ldOyB2YWx1ZV9lbGVtZW50X2krKykge1xuIgotLQkJCQkgICAiXHRcdGNvbnN0IGNoYXIgKnZhbHVlX2VsZW1lbnRfZWxlbWVudDtcbiIKLSsJCQkJICAgIlx0XHQvKiBNYXJzaGFsIGFuIGFycmF5IG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwgXCJzXCIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50X2VsZW1lbnQgPSB2YWx1ZV9lbGVtZW50W3ZhbHVlX2VsZW1lbnRfaV07XG4iCi0rCQkJCSAgICJcdFx0aWYgKHZhbHVlX2VsZW1lbnQpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGZvciAoc2l6ZV90IHZhbHVlX2VsZW1lbnRfaSA9IDA7IHZhbHVlX2VsZW1lbnRbdmFsdWVfZWxlbWVudF9pXTsgdmFsdWVfZWxlbWVudF9pKyspIHtcbiIKLSsJCQkJICAgIlx0XHRcdFx0Y29uc3QgY2hhciAqdmFsdWVfZWxlbWVudF9lbGVtZW50O1xuIgotKwkJCQkgICAiXG4iCi0rCQkJCSAgICJcdFx0XHRcdHZhbHVlX2VsZW1lbnRfZWxlbWVudCA9IHZhbHVlX2VsZW1lbnRbdmFsdWVfZWxlbWVudF9pXTtcbiIKLSsJCQkJICAgIlxuIgotKwkJCQkgICAiXHRcdFx0XHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfZWxlbWVudF9lbGVtZW50KSkge1xuIgotKwkJCQkgICAiXHRcdFx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdFx0XHR9XG4iCi0rCQkJCSAgICJcdFx0XHR9XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdFx0LyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfZWxlbWVudF9lbGVtZW50KSkge1xuIgotLQkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YWx1ZV9pdGVyLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotIAkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0gCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0gCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXHR9XG4iCi0tCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLS0JCQkJICAgIlx0XHRyZXR1cm4gLTE7XG4iCi0tCQkJCSAgICJcdH1cbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotIAkJCQkgICAiaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpKSB7XG4iCi1AQCAtMjE5NCwxNiArMjIwMiwxOCBAQAotIAkJCQkgICAiXHRyZXR1cm4gLTE7XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgImZvciAoc2l6ZV90IHZhbHVlX2l0ZW0yX2kgPSAwOyB2YWx1ZV9pdGVtMlt2YWx1ZV9pdGVtMl9pXTsgdmFsdWVfaXRlbTJfaSsrKSB7XG4iCi0tCQkJCSAgICJcdGNvbnN0IGNoYXIgKnZhbHVlX2l0ZW0yX2VsZW1lbnQ7XG4iCi0rCQkJCSAgICJpZiAodmFsdWVfaXRlbTIpIHtcbiIKLSsJCQkJICAgIlx0Zm9yIChzaXplX3QgdmFsdWVfaXRlbTJfaSA9IDA7IHZhbHVlX2l0ZW0yW3ZhbHVlX2l0ZW0yX2ldOyB2YWx1ZV9pdGVtMl9pKyspIHtcbiIKLSsJCQkJICAgIlx0XHRjb25zdCBjaGFyICp2YWx1ZV9pdGVtMl9lbGVtZW50O1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2l0ZW0yX2VsZW1lbnQgPSB2YWx1ZV9pdGVtMlt2YWx1ZV9pdGVtMl9pXTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9pdGVtMl9lbGVtZW50ID0gdmFsdWVfaXRlbTJbdmFsdWVfaXRlbTJfaV07XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhbHVlX2l0ZW0yX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZV9pdGVtMl9lbGVtZW50KSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2l0ZW0yX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YWx1ZV9pdGVtMl9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfaXRlbTJfZWxlbWVudCkpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2l0ZW0yX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXHR9XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLUBAIC0yNjQyLDQxICsyNjUyLDQzIEBACi0gCQkJCSAgICJcdHJldHVybiAtMTtcbiIKLSAJCQkJICAgIn1cbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiZm9yIChzaXplX3QgdmFsdWVfaSA9IDA7IHZhbHVlW3ZhbHVlX2ldOyB2YWx1ZV9pKyspIHtcbiIKLS0JCQkJICAgIlx0REJ1c01lc3NhZ2VJdGVyICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVyO1xuIgotLQkJCQkgICAiXHRjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZW0wO1xuIgotLQkJCQkgICAiXHR1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZW0xO1xuIgotLQkJCQkgICAiXHRjb25zdCBNeVN0cnVjdEFycmF5VmFsdWVFbGVtZW50ICp2YWx1ZV9lbGVtZW50O1xuIgotKwkJCQkgICAiaWYgKHZhbHVlKSB7XG4iCi0rCQkJCSAgICJcdGZvciAoc2l6ZV90IHZhbHVlX2kgPSAwOyB2YWx1ZVt2YWx1ZV9pXTsgdmFsdWVfaSsrKSB7XG4iCi0rCQkJCSAgICJcdFx0REJ1c01lc3NhZ2VJdGVyICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVyO1xuIgotKwkJCQkgICAiXHRcdGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1lbnRfaXRlbTA7XG4iCi0rCQkJCSAgICJcdFx0dWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVtMTtcbiIKLSsJCQkJICAgIlx0XHRjb25zdCBNeVN0cnVjdEFycmF5VmFsdWVFbGVtZW50ICp2YWx1ZV9lbGVtZW50O1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2VsZW1lbnQgPSB2YWx1ZVt2YWx1ZV9pXTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50ID0gdmFsdWVbdmFsdWVfaV07XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhIHN0cnVjdHVyZSBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0tCQkJCSAgICJcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFsdWVfaXRlciwgREJVU19UWVBFX1NUUlVDVCwgTlVMTCwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLS0JCQkJICAgIlx0XHRyZXR1cm4gLTE7XG4iCi0tCQkJCSAgICJcdH1cbiIKLSsJCQkJICAgIlx0XHQvKiBNYXJzaGFsIGEgc3RydWN0dXJlIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLSsJCQkJICAgIlx0XHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9TVFJVQ1QsIE5VTEwsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudF9pdGVtMCA9IHZhbHVlX2VsZW1lbnQtPml0ZW0wO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnRfaXRlbTAgPSB2YWx1ZV9lbGVtZW50LT5pdGVtMDtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfZWxlbWVudF9pdGVtMCkpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLS0JCQkJICAgIlx0fVxuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhbHVlX2VsZW1lbnRfaXRlciwgREJVU19UWVBFX1NUUklORywgJnZhbHVlX2VsZW1lbnRfaXRlbTApKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2VsZW1lbnRfaXRlbTEgPSB2YWx1ZV9lbGVtZW50LT5pdGVtMTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50X2l0ZW0xID0gdmFsdWVfZWxlbWVudC0+aXRlbTE7XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhIHVpbnQzMl90IG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmdmFsdWVfZWxlbWVudF9pdGVtMSkpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLS0JCQkJICAgIlx0fVxuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSB1aW50MzJfdCBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmdmFsdWVfZWxlbWVudF9pdGVtMSkpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLS0JCQkJICAgIlx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlx0fVxuIgotIAkJCQkgICAifVxuIgotIAkJCQkgICAiXG4iCi1AQCAtMjkxMiw0MSArMjkyNCw0MyBAQAotIAkJCQkgICAiXHRyZXR1cm4gLTE7XG4iCi0gCQkJCSAgICJ9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgImZvciAoc2l6ZV90IHZhbHVlX2kgPSAwOyB2YWx1ZVt2YWx1ZV9pXTsgdmFsdWVfaSsrKSB7XG4iCi0tCQkJCSAgICJcdERCdXNNZXNzYWdlSXRlciAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1lbnRfaXRlcjtcbiIKLS0JCQkJICAgIlx0Y29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVtMDtcbiIKLS0JCQkJICAgIlx0dWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbWVudF9pdGVtMTtcbiIKLS0JCQkJICAgIlx0Y29uc3QgTXlEaWN0RW50cnlBcnJheVZhbHVlRWxlbWVudCAqdmFsdWVfZWxlbWVudDtcbiIKLSsJCQkJICAgImlmICh2YWx1ZSkge1xuIgotKwkJCQkgICAiXHRmb3IgKHNpemVfdCB2YWx1ZV9pID0gMDsgdmFsdWVbdmFsdWVfaV07IHZhbHVlX2krKykge1xuIgotKwkJCQkgICAiXHRcdERCdXNNZXNzYWdlSXRlciAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1lbnRfaXRlcjtcbiIKLSsJCQkJICAgIlx0XHRjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtZW50X2l0ZW0wO1xuIgotKwkJCQkgICAiXHRcdHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1lbnRfaXRlbTE7XG4iCi0rCQkJCSAgICJcdFx0Y29uc3QgTXlEaWN0RW50cnlBcnJheVZhbHVlRWxlbWVudCAqdmFsdWVfZWxlbWVudDtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHR2YWx1ZV9lbGVtZW50ID0gdmFsdWVbdmFsdWVfaV07XG4iCi0rCQkJCSAgICJcdFx0dmFsdWVfZWxlbWVudCA9IHZhbHVlW3ZhbHVlX2ldO1xuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdC8qIE1hcnNoYWwgYSBzdHJ1Y3R1cmUgb250byB0aGUgbWVzc2FnZSAqL1xuIgotLQkJCQkgICAiXHRpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsIERCVVNfVFlQRV9ESUNUX0VOVFJZLCBOVUxMLCAmdmFsdWVfZWxlbWVudF9pdGVyKSkge1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLS0JCQkJICAgIlx0fVxuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSBzdHJ1Y3R1cmUgb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFsdWVfaXRlciwgREJVU19UWVBFX0RJQ1RfRU5UUlksIE5VTEwsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0dmFsdWVfZWxlbWVudF9pdGVtMCA9IHZhbHVlX2VsZW1lbnQtPml0ZW0wO1xuIgotKwkJCQkgICAiXHRcdHZhbHVlX2VsZW1lbnRfaXRlbTAgPSB2YWx1ZV9lbGVtZW50LT5pdGVtMDtcbiIKLSAJCQkJICAgIlxuIgotLQkJCQkgICAiXHQvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWVfZWxlbWVudF9pdGVtMCkpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLS0JCQkJICAgIlx0fVxuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqL1xuIgotKwkJCQkgICAiXHRcdGlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhbHVlX2VsZW1lbnRfaXRlciwgREJVU19UWVBFX1NUUklORywgJnZhbHVlX2VsZW1lbnRfaXRlbTApKSB7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0ZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmdmFsdWVfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0fVxuIgotIAkJCQkgICAiXG4iCi0tCQkJCSAgICJcdHZhbHVlX2VsZW1lbnRfaXRlbTEgPSB2YWx1ZV9lbGVtZW50LT5pdGVtMTtcbiIKLSsJCQkJICAgIlx0XHR2YWx1ZV9lbGVtZW50X2l0ZW0xID0gdmFsdWVfZWxlbWVudC0+aXRlbTE7XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0LyogTWFyc2hhbCBhIHVpbnQzMl90IG9udG8gdGhlIG1lc3NhZ2UgKi9cbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmdmFsdWVfZWxlbWVudF9pdGVtMSkpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJnZhbHVlX2l0ZXIsICZ2YWx1ZV9lbGVtZW50X2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotLQkJCQkgICAiXHRcdHJldHVybiAtMTtcbiIKLS0JCQkJICAgIlx0fVxuIgotKwkJCQkgICAiXHRcdC8qIE1hcnNoYWwgYSB1aW50MzJfdCBvbnRvIHRoZSBtZXNzYWdlICovXG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFsdWVfZWxlbWVudF9pdGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmdmFsdWVfZWxlbWVudF9pdGVtMSkpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcik7XG4iCi0rCQkJCSAgICJcdFx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLSsJCQkJICAgIlx0XHRcdHJldHVybiAtMTtcbiIKLSsJCQkJICAgIlx0XHR9XG4iCi0gCQkJCSAgICJcbiIKLS0JCQkJICAgIlx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLS0JCQkJICAgIlx0XHRkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZ2YWx1ZV9pdGVyKTtcbiIKLS0JCQkJICAgIlx0XHRyZXR1cm4gLTE7XG4iCi0rCQkJCSAgICJcdFx0aWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmdmFsdWVfaXRlciwgJnZhbHVlX2VsZW1lbnRfaXRlcikpIHtcbiIKLSsJCQkJICAgIlx0XHRcdGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhbHVlX2l0ZXIpO1xuIgotKwkJCQkgICAiXHRcdFx0cmV0dXJuIC0xO1xuIgotKwkJCQkgICAiXHRcdH1cbiIKLSAJCQkJICAgIlx0fVxuIgotIAkJCQkgICAifVxuIgotIAkJCQkgICAiXG4iCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X2NvbS5uZXRzcGxpdC5OaWguVGVzdF9wcm94eS5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdGVzdHMvdGVzdF9jb20ubmV0c3BsaXQuTmloLlRlc3RfcHJveHkuYwotQEAgLTI3MzU5LDYgKzI3MzU5LDcgQEAKLSAJCVRFU1RfVFJVRSAodW5peF9mZF90b19zdHJfcmVwbGllZCk7Ci0gCi0gCQlURVNUX0VRX1AgKGxhc3RfZGF0YSwgcGFyZW50KTsKLSsJCVRFU1RfTkUgKGxhc3Rfc3RyX3ZhbHVlWzBdLCAnXDAnKTsKLSAJCVRFU1RfVFJVRSAoc3RyY2hyICgiMDEyMzQ1Njc4OSIsIGxhc3Rfc3RyX3ZhbHVlWzBdKSk7Ci0gCQlURVNUX0FMTE9DX1BBUkVOVCAobGFzdF9zdHJfdmFsdWUsIHBhcmVudCk7Ci0gCi1AQCAtMjc2NzMsNiArMjc2NzQsNyBAQAotIAotIAkJVEVTVF9FUSAocmV0LCAwKTsKLSAKLSsJCVRFU1RfTkUgKHN0cl92YWx1ZVswXSwgJ1wwJyk7Ci0gCQlURVNUX1RSVUUgKHN0cmNociAoIjAxMjM0NTY3ODkiLCBzdHJfdmFsdWVbMF0pKTsKLSAJCVRFU1RfQUxMT0NfUEFSRU5UIChzdHJfdmFsdWUsIHBhcmVudCk7Ci0gCi0tLS0gbGlibmloLTEuMC4zLm9yaWcvbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X3Byb3BlcnR5LmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy90ZXN0X3Byb3BlcnR5LmMKLUBAIC04NzMzLDcgKzg3MzMsNyBAQAotIAlUeXBlVmFyICogICAgICAgdmFyOwotIAlOaWhMaXN0RW50cnkgKiAgYXR0cmliOwotIAlOaWhEQnVzUHJveHkgKiAgcHJveHkgPSBOVUxMOwotLQl2b2lkICogICAgICAgICAgcGFyZW50ID0gTlVMTDsKLSsJdm9pZCAqICAgICAgICAgIHBhcmVudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IE5VTEw7Ci0gCXBpZF90ICAgICAgICAgICBwaWQgPSAtMTsKLSAJaW50ICAgICAgICAgICAgIHN0YXR1czsKLSAJREJ1c01lc3NhZ2UgKiAgIG1ldGhvZF9jYWxsOwotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdGVzdHMvZXhwZWN0ZWQvdGVzdF9tZXRob2Rfb2JqZWN0X2Z1bmN0aW9uX3N0YW5kYXJkLmMKLSsrKyBsaWJuaWgtMS4wLjMvbmloLWRidXMtdG9vbC90ZXN0cy9leHBlY3RlZC90ZXN0X21ldGhvZF9vYmplY3RfZnVuY3Rpb25fc3RhbmRhcmQuYwotQEAgLTEzNiwxNyArMTM2LDE5IEBACi0gCQkJZ290byBlbm9tZW07Ci0gCQl9Ci0gCi0tCQlmb3IgKHNpemVfdCBvdXRwdXRfaSA9IDA7IG91dHB1dFtvdXRwdXRfaV07IG91dHB1dF9pKyspIHsKLS0JCQljb25zdCBjaGFyICpvdXRwdXRfZWxlbWVudDsKLSsJCWlmIChvdXRwdXQpIHsKLSsJCQlmb3IgKHNpemVfdCBvdXRwdXRfaSA9IDA7IG91dHB1dFtvdXRwdXRfaV07IG91dHB1dF9pKyspIHsKLSsJCQkJY29uc3QgY2hhciAqb3V0cHV0X2VsZW1lbnQ7Ci0gCi0tCQkJb3V0cHV0X2VsZW1lbnQgPSBvdXRwdXRbb3V0cHV0X2ldOwotKwkJCQlvdXRwdXRfZWxlbWVudCA9IG91dHB1dFtvdXRwdXRfaV07Ci0gCi0tCQkJLyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovCi0tCQkJaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmb3V0cHV0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZvdXRwdXRfZWxlbWVudCkpIHsKLS0JCQkJZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmb3V0cHV0X2l0ZXIpOwotLQkJCQlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKLS0JCQkJcmVwbHkgPSBOVUxMOwotLQkJCQlnb3RvIGVub21lbTsKLSsJCQkJLyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovCi0rCQkJCWlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJm91dHB1dF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmb3V0cHV0X2VsZW1lbnQpKSB7Ci0rCQkJCQlkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZvdXRwdXRfaXRlcik7Ci0rCQkJCQlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKLSsJCQkJCXJlcGx5ID0gTlVMTDsKLSsJCQkJCWdvdG8gZW5vbWVtOwotKwkJCQl9Ci0gCQkJfQotIAkJfQotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdGVzdHMvZXhwZWN0ZWQvdGVzdF9tZXRob2RfcmVwbHlfZnVuY3Rpb25fc3RhbmRhcmQuYwotKysrIGxpYm5paC0xLjAuMy9uaWgtZGJ1cy10b29sL3Rlc3RzL2V4cGVjdGVkL3Rlc3RfbWV0aG9kX3JlcGx5X2Z1bmN0aW9uX3N0YW5kYXJkLmMKLUBAIC03LDcgKzcsNiBAQAotIAlEQnVzTWVzc2FnZUl0ZXIgb3V0cHV0X2l0ZXI7Ci0gCi0gCW5paF9hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7Ci0tCW5paF9hc3NlcnQgKG91dHB1dCAhPSBOVUxMKTsKLSAKLSAJLyogSWYgdGhlIHNlbmRlciBkb2Vzbid0IGNhcmUgYWJvdXQgYSByZXBseSwgZG9uJ3QgYm90aGVyIHdhc3RpbmcKLSAJICogZWZmb3J0IGNvbnN0cnVjdGluZyBhbmQgc2VuZGluZyBvbmUuCi1AQCAtMjgsMTYgKzI3LDE4IEBACi0gCQlyZXR1cm4gLTE7Ci0gCX0KLSAKLS0JZm9yIChzaXplX3Qgb3V0cHV0X2kgPSAwOyBvdXRwdXRbb3V0cHV0X2ldOyBvdXRwdXRfaSsrKSB7Ci0tCQljb25zdCBjaGFyICpvdXRwdXRfZWxlbWVudDsKLS0KLS0JCW91dHB1dF9lbGVtZW50ID0gb3V0cHV0W291dHB1dF9pXTsKLS0KLS0JCS8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqLwotLQkJaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmb3V0cHV0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZvdXRwdXRfZWxlbWVudCkpIHsKLS0JCQlkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZvdXRwdXRfaXRlcik7Ci0tCQkJZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7Ci0tCQkJcmV0dXJuIC0xOwotKwlpZiAob3V0cHV0KSB7Ci0rCQlmb3IgKHNpemVfdCBvdXRwdXRfaSA9IDA7IG91dHB1dFtvdXRwdXRfaV07IG91dHB1dF9pKyspIHsKLSsJCQljb25zdCBjaGFyICpvdXRwdXRfZWxlbWVudDsKLSsKLSsJCQlvdXRwdXRfZWxlbWVudCA9IG91dHB1dFtvdXRwdXRfaV07Ci0rCi0rCQkJLyogTWFyc2hhbCBhIGNoYXIgKiBvbnRvIHRoZSBtZXNzYWdlICovCi0rCQkJaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmb3V0cHV0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZvdXRwdXRfZWxlbWVudCkpIHsKLSsJCQkJZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmb3V0cHV0X2l0ZXIpOwotKwkJCQlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKLSsJCQkJcmV0dXJuIC0xOwotKwkJCX0KLSAJCX0KLSAJfQotIAotLS0tIGxpYm5paC0xLjAuMy5vcmlnL25paC1kYnVzLXRvb2wvdGVzdHMvZXhwZWN0ZWQvdGVzdF9tZXRob2RfcmVwbHlfZnVuY3Rpb25fZGVwcmVjYXRlZC5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdGVzdHMvZXhwZWN0ZWQvdGVzdF9tZXRob2RfcmVwbHlfZnVuY3Rpb25fZGVwcmVjYXRlZC5jCi1AQCAtNyw3ICs3LDYgQEAKLSAJREJ1c01lc3NhZ2VJdGVyIG91dHB1dF9pdGVyOwotIAotIAluaWhfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOwotLQluaWhfYXNzZXJ0IChvdXRwdXQgIT0gTlVMTCk7Ci0gCi0gCS8qIElmIHRoZSBzZW5kZXIgZG9lc24ndCBjYXJlIGFib3V0IGEgcmVwbHksIGRvbid0IGJvdGhlciB3YXN0aW5nCi0gCSAqIGVmZm9ydCBjb25zdHJ1Y3RpbmcgYW5kIHNlbmRpbmcgb25lLgotQEAgLTI4LDE2ICsyNywxOCBAQAotIAkJcmV0dXJuIC0xOwotIAl9Ci0gCi0tCWZvciAoc2l6ZV90IG91dHB1dF9pID0gMDsgb3V0cHV0W291dHB1dF9pXTsgb3V0cHV0X2krKykgewotLQkJY29uc3QgY2hhciAqb3V0cHV0X2VsZW1lbnQ7Ci0tCi0tCQlvdXRwdXRfZWxlbWVudCA9IG91dHB1dFtvdXRwdXRfaV07Ci0tCi0tCQkvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi8KLS0JCWlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJm91dHB1dF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmb3V0cHV0X2VsZW1lbnQpKSB7Ci0tCQkJZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmb3V0cHV0X2l0ZXIpOwotLQkJCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOwotLQkJCXJldHVybiAtMTsKLSsJaWYgKG91dHB1dCkgewotKwkJZm9yIChzaXplX3Qgb3V0cHV0X2kgPSAwOyBvdXRwdXRbb3V0cHV0X2ldOyBvdXRwdXRfaSsrKSB7Ci0rCQkJY29uc3QgY2hhciAqb3V0cHV0X2VsZW1lbnQ7Ci0rCi0rCQkJb3V0cHV0X2VsZW1lbnQgPSBvdXRwdXRbb3V0cHV0X2ldOwotKwotKwkJCS8qIE1hcnNoYWwgYSBjaGFyICogb250byB0aGUgbWVzc2FnZSAqLwotKwkJCWlmICghIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJm91dHB1dF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmb3V0cHV0X2VsZW1lbnQpKSB7Ci0rCQkJCWRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJm91dHB1dF9pdGVyKTsKLSsJCQkJZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7Ci0rCQkJCXJldHVybiAtMTsKLSsJCQl9Ci0gCQl9Ci0gCX0KLSAKLS0tLSBsaWJuaWgtMS4wLjMub3JpZy9uaWgtZGJ1cy10b29sL3Rlc3RzL2V4cGVjdGVkL3Rlc3RfbWV0aG9kX29iamVjdF9mdW5jdGlvbl9ub19pbnB1dC5jCi0rKysgbGlibmloLTEuMC4zL25paC1kYnVzLXRvb2wvdGVzdHMvZXhwZWN0ZWQvdGVzdF9tZXRob2Rfb2JqZWN0X2Z1bmN0aW9uX25vX2lucHV0LmMKLUBAIC04OCwxNyArODgsMTkgQEAKLSAJCQlnb3RvIGVub21lbTsKLSAJCX0KLSAKLS0JCWZvciAoc2l6ZV90IG91dHB1dF9pID0gMDsgb3V0cHV0W291dHB1dF9pXTsgb3V0cHV0X2krKykgewotLQkJCWNvbnN0IGNoYXIgKm91dHB1dF9lbGVtZW50OwotKwkJaWYgKG91dHB1dCkgewotKwkJCWZvciAoc2l6ZV90IG91dHB1dF9pID0gMDsgb3V0cHV0W291dHB1dF9pXTsgb3V0cHV0X2krKykgewotKwkJCQljb25zdCBjaGFyICpvdXRwdXRfZWxlbWVudDsKLSAKLS0JCQlvdXRwdXRfZWxlbWVudCA9IG91dHB1dFtvdXRwdXRfaV07Ci0rCQkJCW91dHB1dF9lbGVtZW50ID0gb3V0cHV0W291dHB1dF9pXTsKLSAKLS0JCQkvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi8KLS0JCQlpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZvdXRwdXRfaXRlciwgREJVU19UWVBFX1NUUklORywgJm91dHB1dF9lbGVtZW50KSkgewotLQkJCQlkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZvdXRwdXRfaXRlcik7Ci0tCQkJCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOwotLQkJCQlyZXBseSA9IE5VTEw7Ci0tCQkJCWdvdG8gZW5vbWVtOwotKwkJCQkvKiBNYXJzaGFsIGEgY2hhciAqIG9udG8gdGhlIG1lc3NhZ2UgKi8KLSsJCQkJaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmb3V0cHV0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZvdXRwdXRfZWxlbWVudCkpIHsKLSsJCQkJCWRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJm91dHB1dF9pdGVyKTsKLSsJCQkJCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOwotKwkJCQkJcmVwbHkgPSBOVUxMOwotKwkJCQkJZ290byBlbm9tZW07Ci0rCQkJCX0KLSAJCQl9Ci0gCQl9Ci0gCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9saWJuaWgvbGlibmloXzEuMC4zLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibmloL2xpYm5paF8xLjAuMy5iYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3YTRlZDEuLjAwMDAwMDAKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbGlibmloL2xpYm5paF8xLjAuMy5iYgorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDEzICBMRyBFbGVjdHJvbmljcywgSW5jLgotCi1TVU1NQVJZID0gImxpYm5paCBsaWJyYXJ5IgotSE9NRVBBR0UgPSAiaHR0cHM6Ly9sYXVuY2hwYWQubmV0L2xpYm5paCIKLURFU0NSSVBUSU9OID0gImxpYm5paCBpcyBhIHNtYWxsIGxpYnJhcnkgZm9yIEMgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgXAotICAgIGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRoYXQsIGRlc3BpdGUgaXRzIG5hbWUsIGFyZSBub3QgaW1wbGVtZW50ZWQgXAotICAgIGVsc2V3aGVyZSBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBzZXQuIFwKLSAgICBcCi0gICAgbGlibmloIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBvdGhlciBDIGxpYnJhcmllcyBzdWNoIGFzIGdsaWIsIFwKLSAgICBleGNlcHQgdGhhdCBpdHMgZm9jdXMgaXMgb24gYSBzbWFsbCBzaXplIGFuZCBpbnRlbmRlZCBmb3IgXAotICAgIGFwcGxpY2F0aW9ucyB0aGF0IHNpdCB2ZXJ5IGxvdyBpbiB0aGUgc29mdHdhcmUgc3RhY2ssIGVzcGVjaWFsbHkgXAotICAgIG91dHNpZGUgb2YgL3Vzci4gXAotICAgIFwKLSAgICBJdCBleHByZXNzbHkgZG9lcyBub3QgcmVpbXBsZW1lbnQgZnVuY3Rpb25zIHRoYXQgYWxyZWFkeSBleGlzdCBpbiBcCi0gICAgbGlicmFyaWVzIG9yZGluYXJpbHkgc2hpcHBlZCBpbiAvbGliIHN1Y2ggbGliYzYsIGFuZCBkb2VzIG5vdCBkbyBcCi0gICAgZm9vbGlzaCB0aGluZ3MgbGlrZSBpbnZlbnQgYXJiaXRyYXJ5IHR5cGVkZWZzIGZvciBwZXJmZWN0bHkgZ29vZCBDIHR5cGVzLiIKLQotU0VDVElPTiA9ICJsaWJzIgotCi1MSUNFTlNFID0gIkdQTC0yLjAiCi1MSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9DT1BZSU5HO21kNT03NTE0MTkyNjBhYTk1NDQ5OWY3YWJhYWJhYTg4MmJiZSIKLQotREVQRU5EUyA9ICJkYnVzIGV4cGF0IgotREVQRU5EU19hcHBlbmRfY2xhc3MtdGFyZ2V0ID0gIiBsaWJuaWgtbmF0aXZlIgotCi1TUkNfVVJJID0gImh0dHBzOi8vbGF1bmNocGFkLm5ldC8ke0JQTn0vMS4wLyR7UFZ9Lytkb3dubG9hZC8ke0JQfS50YXIuZ3ogXAotICAgICAgICAgICBmaWxlOi8vbGlibmloXzEuMC4zLTR1YnVudHUxNi5wYXRjaCBcCi0gICAgICAgICAgIGZpbGU6Ly8wMDAxLXNpZ25hbC5jLVNJR0NMRC1hbmQtU0lHQ0hJTEQtYXJlLXNhbWUtb24tc3l0ZW0tVi1zeXMucGF0Y2ggXAotICAgICAgICAgICBmaWxlOi8vMDAwMS1VcGRhdGUtYXV0b3Rvb2wtZmlsZXMtYWxzby1tYWtlLWl0LXdvcmstd2l0aC1sYXRlc3QtLnBhdGNoIFwKLSAgICAgICAgICAgIgotCi1TUkNfVVJJW21kNXN1bV0gPSAiZGI3OTkwY2U1NWUwMWRhZmZlMTkwMDY1MjRhMWNjYjAiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiODk3NTcyZGY3NTY1YzBhOTBhODE1MzI2NzFlMjNjNjNmOTliNGVmZGUyZWVjYmJmMTFlNzg1N2ZiYzYxZjQwNSIKLQotaW5oZXJpdCBhdXRvdG9vbHMgZ2V0dGV4dAotCi1kb19jb25maWd1cmVfYXBwZW5kICgpIHsKLSAgICAgICAgc2VkIC1pIC1lICdzLGxpYi9wa2djb25maWcsJHtiYXNlbGlifS9wa2djb25maWcsZycgJHtTfS9uaWgvTWFrZWZpbGUuaW4gJHtTfS9uaWgtZGJ1cy9NYWtlZmlsZS5pbgotfQotCi1GSUxFU18ke1BOfS1kZXYgKz0gIiR7bGliZGlyfS9wa2djb25maWcvKiBcCi0gICAgICAgICR7aW5jbHVkZWRpcn0vKiBcCi0gICAgICAgICR7bGliZGlyfS8qLnNvIFwKLSAgICAgICAgJHtkYXRhZGlyfS8qIFwKLSAgICAgICAgIgotCi0jIHRhcmdldCBsaWJuaWggcmVxdWlyZXMgbmF0aXZlIG5paC1kYnVzLXRvb2wKLUJCQ0xBU1NFWFRFTkQgPSAibmF0aXZlIgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbXVsdGlwYXRoLXRvb2xzL211bHRpcGF0aC10b29sc18wLjguMy5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L211bHRpcGF0aC10b29scy9tdWx0aXBhdGgtdG9vbHNfMC44LjMuYmIKaW5kZXggMzU4ZjBjYi4uOWUyZDg2YiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvbXVsdGlwYXRoLXRvb2xzL211bHRpcGF0aC10b29sc18wLjguMy5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9tdWx0aXBhdGgtdG9vbHMvbXVsdGlwYXRoLXRvb2xzXzAuOC4zLmJiCkBAIC03Myw2ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgYmluZGlyPSR7YmFzZV9zYmluZGlyfSBcCiAgICAgICAgICAgICAgICAgTElCPSR7YmFzZV9saWJkaXJ9IGxpYmRpcj0ke2Jhc2VfbGliZGlyfS9tdWx0aXBhdGggXAogICAgICAgICAgICAgICAgIHVuaXRkaXI9JHtzeXN0ZW1kX3N5c3RlbV91bml0ZGlyfSBcCisgICAgICAgICAgICAgICAgbGlidWRldmRpcj0ke25vbmFyY2hfYmFzZV9saWJkaXJ9L3VkZXYgXAogICAgICAgICAgICAgICAgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAic3lzdGVtZCIsICJTWVNURU1EPTIxNiIsICIiLCBkKX0gXAogICAgICAgICAgICAgICAgJwogCkBAIC04Niw2ICs4Nyw5IEBACiAgICAgICAgIGNwICR7V09SS0RJUn0vbXVsdGlwYXRoZC5vZSAke0R9JHtzeXNjb25mZGlyfS9pbml0LmQvbXVsdGlwYXRoZAogICAgIGZpCiAKKyAgICBzZWQgLWkgInM6L3Vzci9saWIvdWRldi9rcGFydHhfaWQ6JHtub25hcmNoX2Jhc2VfbGliZGlyfS91ZGV2L2twYXJ0eF9pZDpnIiBcCisgICAgICAgICR7RH0ke25vbmFyY2hfYmFzZV9saWJkaXJ9L3VkZXYvcnVsZXMuZC8xMS1kbS1tcGF0aC5ydWxlcworCiAgICAgaW5zdGFsbCAtZCAke0R9JHtzeXNjb25mZGlyfQogICAgIGluc3RhbGwgLW0gMDY0NCAke1dPUktESVJ9L211bHRpcGF0aC5jb25mLmV4YW1wbGUgXAogICAgICR7RH0ke3N5c2NvbmZkaXJ9L211bHRpcGF0aC5jb25mLmV4YW1wbGUKQEAgLTEwNiw3ICsxMTAsNyBAQAogCiBQQUNLQUdFUyA9KyAia3BhcnR4IgogRklMRVNfa3BhcnR4ID0gIiR7YmFzZV9zYmluZGlyfS9rcGFydHggXAotICAgICAgICAgICAgICAgICR7bm9uYXJjaF9saWJkaXJ9L3VkZXYva3BhcnR4X2lkIFwKKyAgICAgICAgICAgICAgICAke25vbmFyY2hfYmFzZV9saWJkaXJ9L3VkZXYva3BhcnR4X2lkIFwKICAgICAgICAgICAgICAgICIKIAogUkRFUEVORFNfJHtQTn0gKz0gImtwYXJ0eCIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW4tdm0tdG9vbHMvb3Blbi12bS10b29scy8wMDAxLWhnZnNtb3VudGVyLU1ha2VmaWxlLmFtLXN1cHBvcnQtdXNybWVyZ2UucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuLXZtLXRvb2xzL29wZW4tdm0tdG9vbHMvMDAwMS1oZ2ZzbW91bnRlci1NYWtlZmlsZS5hbS1zdXBwb3J0LXVzcm1lcmdlLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDQzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuLXZtLXRvb2xzL29wZW4tdm0tdG9vbHMvMDAwMS1oZ2ZzbW91bnRlci1NYWtlZmlsZS5hbS1zdXBwb3J0LXVzcm1lcmdlLnBhdGNoCkBAIC0wLDAgKzEsMzMgQEAKK0Zyb20gMzM3OThmM2U0ODRlYmQzNDcwZTlkYTc5MWI3M2I0YjkwYmExMmJjMyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IFlpIFpoYW8gPHlpLnpoYW9Ad2luZHJpdmVyLmNvbT4KK0RhdGU6IFR1ZSwgMTQgSmFuIDIwMjAgMTU6MDQ6MDMgKzA4MDAKK1N1YmplY3Q6IFtQQVRDSF0gaGdmc21vdW50ZXIvTWFrZWZpbGUuYW06IHN1cHBvcnQgdXNybWVyZ2UKKworVGhlcmUgaXMgYSBkb19wYWNrYWdlIGVycm9yIHdoZW4gZW5hYmxlIHVzcm1lcmdlIGZlYXR1cmUgZHVlIHRvIHRoZQoraGFyZGNvZGVkIHNiaW4gZGlyZWN0b3J5LiBSZW1vdmUgdGhpcyBwaWVjZSBvZiBjb2RlIGJlY2F1c2Ugd2UgYWxyZWFkeQorY3JlYXRlIHRoZSBzeW1ib2xpYyBsaW5rIGluIGRvX2luc3RhbGwuCisKK1Vwc3RyZWFtLVN0YXR1czogSW5hcHByb3ByaWF0ZSBbb2Utc3BlY2lmaWNdCisKK1NpZ25lZC1vZmYtYnk6IFlpIFpoYW8gPHlpLnpoYW9Ad2luZHJpdmVyLmNvbT4KKy0tLQorIG9wZW4tdm0tdG9vbHMvaGdmc21vdW50ZXIvTWFrZWZpbGUuYW0gfCAzIC0tLQorIDEgZmlsZSBjaGFuZ2VkLCAzIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvb3Blbi12bS10b29scy9oZ2ZzbW91bnRlci9NYWtlZmlsZS5hbSBiL29wZW4tdm0tdG9vbHMvaGdmc21vdW50ZXIvTWFrZWZpbGUuYW0KK2luZGV4IDdjMWJhMWEuLjU4YmQzZjggMTAwNjQ0CistLS0gYS9vcGVuLXZtLXRvb2xzL2hnZnNtb3VudGVyL01ha2VmaWxlLmFtCisrKysgYi9vcGVuLXZtLXRvb2xzL2hnZnNtb3VudGVyL01ha2VmaWxlLmFtCitAQCAtMzksOSArMzksNiBAQCB1bmluc3RhbGwtaG9vazoKKyAJcm0gLWYgJChERVNURElSKSQoc2JpbmRpcikvbW91bnRfdm1oZ2ZzCisgZWxzZQorIGluc3RhbGwtZXhlYy1ob29rOgorLQktJChNS0RJUl9QKSAkKERFU1RESVIpL3NiaW4KKy0JLSQoTE5fUykgJChERVNURElSKSQoc2JpbmRpcikvbW91bnQudm1oZ2ZzIFwKKy0JCSQoREVTVERJUikvc2Jpbi9tb3VudC52bWhnZnMgJj4gL2Rldi9udWxsCisgdW5pbnN0YWxsLWhvb2s6CisgCXJtIC1mICQoREVTVERJUikvc2Jpbi9tb3VudC52bWhnZnMKKyBlbmRpZiAhRlJFRUJTRAorLS0gCisyLjcuNAorCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuLXZtLXRvb2xzL29wZW4tdm0tdG9vbHNfMTEuMC4xLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3Blbi12bS10b29scy9vcGVuLXZtLXRvb2xzXzExLjAuMS5iYgppbmRleCBlZGE3N2MyLi4zNGE4MWQyIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuLXZtLXRvb2xzL29wZW4tdm0tdG9vbHNfMTEuMC4xLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW4tdm0tdG9vbHMvb3Blbi12bS10b29sc18xMS4wLjEuYmIKQEAgLTQyLDYgKzQyLDcgQEAKICAgICBmaWxlOi8vMDAwMS1NYWtlLUhnZnNDb252ZXJ0RnJvbU50VGltZU5zZWMtYXdhcmUtb2YtNjQtYml0LXRpbWVfLnBhdGNoO3BhdGNoZGlyPS4uIFwKICAgICBmaWxlOi8vMDAwMi1oZ2ZzU2VydmVyTGludXgtQ29uc2lkZXItNjRiaXQtdGltZV90LXBvc3NpYmlsaXR5LnBhdGNoO3BhdGNoZGlyPS4uIFwKICAgICBmaWxlOi8vMDAwMS11dGlsQmFja3RyYWNlLUlnbm9yZS1XYXJyYXktYm91bmRzLnBhdGNoO3BhdGNoZGlyPS4uIFwKKyAgICBmaWxlOi8vMDAwMS1oZ2ZzbW91bnRlci1NYWtlZmlsZS5hbS1zdXBwb3J0LXVzcm1lcmdlLnBhdGNoO3BhdGNoZGlyPS4uIFwKICIKIAogU1JDUkVWID0gImQzZWRmZDE0MmE4MTA5NmY5ZjU4YWZmMTdkODQyMTliNDU3ZjQ5ODciCkBAIC02MCw3ICs2MSw4IEBACiBFWFRSQV9PRUNPTkYgPSAiLS13aXRob3V0LWljdSAtLWRpc2FibGUtbXVsdGltb24gLS1kaXNhYmxlLWRvY3MgXAogICAgICAgICAgLS1kaXNhYmxlLXRlc3RzIC0td2l0aG91dC1ndGttbSAtLXdpdGhvdXQteGVyY2VzIC0td2l0aG91dC1wYW0gXAogICAgICAgICAgLS1kaXNhYmxlLXZnYXV0aCAtLWRpc2FibGUtZGVwbG95cGtnIFwKLSAgICAgICAgIC0td2l0aG91dC1yb290LXByaXZpbGVnZXMgLS13aXRob3V0LWtlcm5lbC1tb2R1bGVzIC0td2l0aC10aXJwYyIKKyAgICAgICAgIC0td2l0aG91dC1yb290LXByaXZpbGVnZXMgLS13aXRob3V0LWtlcm5lbC1tb2R1bGVzIC0td2l0aC10aXJwYyBcCisgICAgICAgICAtLXdpdGgtdWRldi1ydWxlcy1kaXI9JHtub25hcmNoX2Jhc2VfbGliZGlyfS91ZGV2L3J1bGVzLmQiCiAKIE5PX1gxMV9GTEFHUyA9ICItLXdpdGhvdXQteCAtLXdpdGhvdXQtZ3RrMiAtLXdpdGhvdXQtZ3RrMyIKIFgxMV9ERVBFTkRTID0gImxpYnhleHQgbGlieGkgbGlieHJlbmRlciBsaWJ4cmFuZHIgbGlieHRzdCBndGsrIGdkay1waXhidWYiCkBAIC04Myw3ICs4NSwxMCBAQAogUkRFUEVORFNfJHtQTn0gPSAidXRpbC1saW51eCBsaWJkbmV0IGZ1c2UiCiAKIGRvX2luc3RhbGxfYXBwZW5kKCkgewotICAgIGxuIC1zZiAke3NiaW5kaXJ9L21vdW50LnZtaGdmcyAke0R9L3NiaW4vbW91bnQudm1oZ2ZzCisgICAgaWYgISAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywndXNybWVyZ2UnLCd0cnVlJywnZmFsc2UnLGQpfTsgdGhlbgorICAgICAgICBpbnN0YWxsIC1kICR7RH0vc2JpbgorICAgICAgICBsbiAtc2YgJHtzYmluZGlyfS9tb3VudC52bWhnZnMgJHtEfS9zYmluL21vdW50LnZtaGdmcworICAgIGZpCiAgICAgaW5zdGFsbCAtZCAke0R9JHtzeXNjb25mZGlyfS92bXdhcmUtdG9vbHMKICAgICBpZiAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywgJ3N5c3RlbWQnLCAndHJ1ZScsICdmYWxzZScsIGQpfTsgdGhlbgogICAgICAgICBpbnN0YWxsIC1kICR7RH0ke3N5c3RlbWRfdW5pdGRpcn0vc3lzdGVtCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuY3Yvb3BlbmN2LzAwMDEtY2Fyb3RlbmUtUmVwbGFjZS1pcGNwLXVuaXQtZ3Jvd3RoLXdpdGgtaXBhLWNwLXVuaXQtZy5wYXRjaCBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5jdi9vcGVuY3YvMDAwMS1jYXJvdGVuZS1SZXBsYWNlLWlwY3AtdW5pdC1ncm93dGgtd2l0aC1pcGEtY3AtdW5pdC1nLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDMyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuY3Yvb3BlbmN2LzAwMDEtY2Fyb3RlbmUtUmVwbGFjZS1pcGNwLXVuaXQtZ3Jvd3RoLXdpdGgtaXBhLWNwLXVuaXQtZy5wYXRjaApAQCAtMCwwICsxLDU1IEBACitGcm9tIDFlZGM5MjVlY2Q3ZmI1NGQyZGM3ODQ1MjA2OTA4NDQ3NWZiZTJhNzAgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgorRGF0ZTogVGh1LCAxNiBKYW4gMjAyMCAwODo1MjowMCAtMDgwMAorU3ViamVjdDogW1BBVENIXSBjYXJvdGVuZTogUmVwbGFjZSBpcGNwLXVuaXQtZ3Jvd3RoIHdpdGggaXBhLWNwLXVuaXQtZ3Jvd3RoIG9uIGdjYyA+PSAxMAorCitnY2MgMTArIGhhcyByZW5hbWVkIHRoaXMgb3B0aW9uLCB0aGVyZWZvcmUgY2hlY2sgZm9yIGdjYyB2ZXJzaW9uIGJlZm9yZQorZGVjaWRpbmcgd2hpY2ggbmFtZSB0byB1c2UgZm9yIG9wdCBwYXJhbWV0ZXIKKworVXBzdHJlYW0tU3RhdHVzOiBTdWJtaXR0ZWQgW2h0dHBzOi8vZ2l0aHViLmNvbS9vcGVuY3Yvb3BlbmN2L3B1bGwvMTYzNjldCitTaWduZWQtb2ZmLWJ5OiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgorLS0tCisgM3JkcGFydHkvY2Fyb3RlbmUvQ01ha2VMaXN0cy50eHQgICAgIHwgOCArKysrKystLQorIDNyZHBhcnR5L2Nhcm90ZW5lL2hhbC9DTWFrZUxpc3RzLnR4dCB8IDcgKysrKysrLQorIDIgZmlsZXMgY2hhbmdlZCwgMTIgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhLzNyZHBhcnR5L2Nhcm90ZW5lL0NNYWtlTGlzdHMudHh0IGIvM3JkcGFydHkvY2Fyb3RlbmUvQ01ha2VMaXN0cy50eHQKK2luZGV4IGJmYTkzNjhkNzkuLjFjNDNiODViMjggMTAwNjQ0CistLS0gYS8zcmRwYXJ0eS9jYXJvdGVuZS9DTWFrZUxpc3RzLnR4dAorKysrIGIvM3JkcGFydHkvY2Fyb3RlbmUvQ01ha2VMaXN0cy50eHQKK0BAIC0yMCw4ICsyMCwxMiBAQCBpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQykKKyAgICAgIyAtIG1hdGNoVGVtcGxhdGUgYWJvdXQgNS0xMCUKKyAgICAgIyAtIGdvb2RGZWF0dXJlc1RvVHJhY2sgMTAtMjAlCisgICAgICMgLSBjb3JuZXJIYXJyaXMgMzAlIGZvciBzb21lIGNhc2VzCistCistICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke2Nhcm90ZW5lX3NvdXJjZXN9IENPTVBJTEVfRkxBR1MgIi0tcGFyYW0gaXBjcC11bml0LWdyb3d0aD0xMDAwMDAgLS1wYXJhbSBpbmxpbmUtdW5pdC1ncm93dGg9MTAwMDAwIC0tcGFyYW0gbGFyZ2Utc3RhY2stZnJhbWUtZ3Jvd3RoPTUwMDAiKQorKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtjYXJvdGVuZV9zb3VyY2VzfSBDT01QSUxFX0ZMQUdTICItLXBhcmFtIGlubGluZS11bml0LWdyb3d0aD0xMDAwMDAgLS1wYXJhbSBsYXJnZS1zdGFjay1mcmFtZS1ncm93dGg9NTAwMCIpCisrICAgIGlmKENNQUtFX0NYWF9DT01QSUxFUl9WRVJTSU9OIFZFUlNJT05fTEVTUyAiMTAuMC4wIikKKysJICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke2Nhcm90ZW5lX3NvdXJjZXN9IENPTVBJTEVfRkxBR1MgIi0tcGFyYW0gaXBjcC11bml0LWdyb3d0aD0xMDAwMDAgJHtDT01QSUxFX0ZMQUdTfSIpCisrICAgIGVsc2UoKQorKwkgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7Y2Fyb3RlbmVfc291cmNlc30gQ09NUElMRV9GTEFHUyAiLS1wYXJhbSBpcGEtY3AtdW5pdC1ncm93dGg9MTAwMDAwICR7Q09NUElMRV9GTEFHU30iKQorKyAgICBlbmRpZigpCisgZW5kaWYoKQorIAorIGFkZF9saWJyYXJ5KGNhcm90ZW5lX29ianMgT0JKRUNUCitkaWZmIC0tZ2l0IGEvM3JkcGFydHkvY2Fyb3RlbmUvaGFsL0NNYWtlTGlzdHMudHh0IGIvM3JkcGFydHkvY2Fyb3RlbmUvaGFsL0NNYWtlTGlzdHMudHh0CitpbmRleCBjNGI5YWNhZWRkLi5iYmM1YjExYTgwIDEwMDY0NAorLS0tIGEvM3JkcGFydHkvY2Fyb3RlbmUvaGFsL0NNYWtlTGlzdHMudHh0CisrKysgYi8zcmRwYXJ0eS9jYXJvdGVuZS9oYWwvQ01ha2VMaXN0cy50eHQKK0BAIC05MCw3ICs5MCwxMiBAQCBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TICR7Y2Fyb3RlbmVfZGVmc30pCisgICAgICMgICBtYXRjaFRlbXBsYXRlIGFib3V0IDUtMTAlCisgICAgICMgICBnb29kRmVhdHVyZXNUb1RyYWNrIDEwLTIwJQorICAgICAjICAgY29ybmVySGFycmlzIDMwJSBmb3Igc29tZSBjYXNlcworLSAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoaW1wbC5jcHAgJDxUQVJHRVRfT0JKRUNUUzpjYXJvdGVuZV9vYmpzPiBDT01QSUxFX0ZMQUdTICItLXBhcmFtIGlwY3AtdW5pdC1ncm93dGg9MTAwMDAwIC0tcGFyYW0gaW5saW5lLXVuaXQtZ3Jvd3RoPTEwMDAwMCAtLXBhcmFtIGxhcmdlLXN0YWNrLWZyYW1lLWdyb3d0aD01MDAwIikKKysgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGltcGwuY3BwICQ8VEFSR0VUX09CSkVDVFM6Y2Fyb3RlbmVfb2Jqcz4gQ09NUElMRV9GTEFHUyAiLS1wYXJhbSBpbmxpbmUtdW5pdC1ncm93dGg9MTAwMDAwIC0tcGFyYW0gbGFyZ2Utc3RhY2stZnJhbWUtZ3Jvd3RoPTUwMDAiKQorKyAgICBpZihDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBWRVJTSU9OX0xFU1MgIjEwLjAuMCIpCisrICAgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGltcGwuY3BwICQ8VEFSR0VUX09CSkVDVFM6Y2Fyb3RlbmVfb2Jqcz4gQ09NUElMRV9GTEFHUyAiLS1wYXJhbSBpcGNwLXVuaXQtZ3Jvd3RoPTEwMDAwMCAke0NPTVBJTEVfRkxBR1N9IikKKysgICAgZWxzZSgpCisrICAgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGltcGwuY3BwICQ8VEFSR0VUX09CSkVDVFM6Y2Fyb3RlbmVfb2Jqcz4gQ09NUElMRV9GTEFHUyAiLS1wYXJhbSBpcGEtY3AtdW5pdC1ncm93dGg9MTAwMDAwICR7Q09NUElMRV9GTEFHU30iKQorKyAgICBlbmRpZigpCisgIyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoaW1wbC5jcHAgJDxUQVJHRVRfT0JKRUNUUzpjYXJvdGVuZV9vYmpzPiBDT01QSUxFX0ZMQUdTICItLXBhcmFtIGlwY3AtdW5pdC1ncm93dGg9MTAwMDAwIC0tcGFyYW0gaW5saW5lLXVuaXQtZ3Jvd3RoPTEwMDAwMCAtLXBhcmFtIGxhcmdlLXN0YWNrLWZyYW1lLWdyb3d0aD01MDAwIikKKyAgIGVuZGlmKCkKKyAKKy0tIAorMi4yNS4wCisKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5jdi9vcGVuY3ZfNC4xLjAuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuY3Yvb3BlbmN2XzQuMS4wLmJiCmluZGV4IGY2NzljY2IuLmQ3ODFkYTYgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5jdi9vcGVuY3ZfNC4xLjAuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbmN2L29wZW5jdl80LjEuMC5iYgpAQCAtNDgsNiArNDgsNyBAQAogICAgICAgICAgICBmaWxlOi8vMDAwMy1Uby1maXgtZXJyb3JzLWFzLWZvbGxvd2luZy5wYXRjaCBcCiAgICAgICAgICAgIGZpbGU6Ly8wMDAxLVRlbXBvcmFybGl5LXdvcmstYXJvdW5kLWRlcHJlY2F0ZWQtZmZtcGVnLVJBVy1mdW5jdGkucGF0Y2ggXAogICAgICAgICAgICBmaWxlOi8vMDAwMS1Eb250LXVzZS1pc3lzdGVtLnBhdGNoIFwKKyAgICAgICAgICAgZmlsZTovLzAwMDEtY2Fyb3RlbmUtUmVwbGFjZS1pcGNwLXVuaXQtZ3Jvd3RoLXdpdGgtaXBhLWNwLXVuaXQtZy5wYXRjaCBcCiAgICAgICAgICAgIGZpbGU6Ly9kb3dubG9hZC5wYXRjaCBcCiAgICAgICAgICAgICIKIFBWID0gIjQuMS4wIgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvb3BlbnNjL29wZW5zYy8wMDAxLUZpeC1taXNsZWFkaW5nLWNvZGUtaW5kZW50YXRpb24ucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjLzAwMDEtRml4LW1pc2xlYWRpbmctY29kZS1pbmRlbnRhdGlvbi5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3MWI5ZC4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjLzAwMDEtRml4LW1pc2xlYWRpbmctY29kZS1pbmRlbnRhdGlvbi5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLUZyb20gMjgzNTc4NTE5ZWM4M2E4NzkyYjAyNmMxMDMyMjc4OTc4NGQ2MjlkZSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci1EYXRlOiBGcmksIDI3IERlYyAyMDE5IDExOjMzOjU3IC0wODAwCi1TdWJqZWN0OiBbUEFUQ0hdIEZpeCBtaXNsZWFkaW5nIGNvZGUgaW5kZW50YXRpb24KLQotRml4ZXMKLWVycm9yOiBtaXNsZWFkaW5nIGluZGVudGF0aW9uOyBzdGF0ZW1lbnQgaXMgbm90IHBhcnQgb2YgdGhlIHByZXZpb3VzICdpZicgWy1XZXJyb3IsLVdtaXNsZWFkaW5nLWluZGVudGF0aW9uXQotICAgICAgICAgaWYoY2lwaGVyKQotICAgICAgICAgXgotLi4vLi4vLi4vZ2l0L3NyYy9saWJvcGVuc2MvY2FyZC1lbnRlcnNhZmUuYzozNjk6Mjogbm90ZTogcHJldmlvdXMgc3RhdGVtZW50IGlzIGhlcmUKLSAgICAgICAgaWYoc2J1ZikKLSAgICAgICAgXgotVXBzdHJlYW0tU3RhdHVzOiBTdWJtaXR0ZWQgW2h0dHBzOi8vZ2l0aHViLmNvbS9PcGVuU0MvT3BlblNDL3B1bGwvMTg5NF0KLVNpZ25lZC1vZmYtYnk6IEtoZW0gUmFqIDxyYWoua2hlbUBnbWFpbC5jb20+Ci0tLS0KLSBzcmMvbGlib3BlbnNjL2NhcmQtZW50ZXJzYWZlLmMgfCAxMiArKysrKystLS0tLS0KLSBzcmMvdG9vbHMvcGtjczE1LWluaXQuYyAgICAgICAgfCAgNCArKy0tCi0gMiBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCi0KLWRpZmYgLS1naXQgYS9zcmMvbGlib3BlbnNjL2NhcmQtZW50ZXJzYWZlLmMgYi9zcmMvbGlib3BlbnNjL2NhcmQtZW50ZXJzYWZlLmMKLWluZGV4IDNlNDJjMTFmLi5hYmI5ZmQ4MSAxMDA2NDQKLS0tLSBhL3NyYy9saWJvcGVuc2MvY2FyZC1lbnRlcnNhZmUuYwotKysrIGIvc3JjL2xpYm9wZW5zYy9jYXJkLWVudGVyc2FmZS5jCi1AQCAtMzUyLDEwICszNTIsMTAgQEAgc3RhdGljIGludCBlbnRlcnNhZmVfdHJhbnNtaXRfYXBkdShzY19jYXJkX3QgKmNhcmQsIHNjX2FwZHVfdCAqYXBkdSwKLSAJIHNpemVfdCBjaXBoZXJfZGF0YV9zaXplLG1hY19kYXRhX3NpemU7Ci0gCSBpbnQgYmxvY2tzOwotIAkgaW50IHI9U0NfU1VDQ0VTUzsKLS0JdTggKnNidWY9TlVMTDsKLS0Jc2l6ZV90IHNzaXplPTA7Ci0rCSB1OCAqc2J1Zj1OVUxMOwotKwkgc2l6ZV90IHNzaXplPTA7Ci0gCi0tCVNDX0ZVTkNfQ0FMTEVEKGNhcmQtPmN0eCwgU0NfTE9HX0RFQlVHX1ZFUkJPU0UpOwotKwkgU0NfRlVOQ19DQUxMRUQoY2FyZC0+Y3R4LCBTQ19MT0dfREVCVUdfVkVSQk9TRSk7Ci0gCi0gCSBhc3NlcnQoY2FyZCk7Ci0gCSBhc3NlcnQoYXBkdSk7Ci1AQCAtMzYzLDEwICszNjMsMTAgQEAgc3RhdGljIGludCBlbnRlcnNhZmVfdHJhbnNtaXRfYXBkdShzY19jYXJkX3QgKmNhcmQsIHNjX2FwZHVfdCAqYXBkdSwKLSAJIGlmKChjaXBoZXJ8fG1hYykgJiYgKCFrZXl8fChrZXlsZW4hPTggJiYga2V5bGVuIT0xNikpKQotIAkJICBTQ19GVU5DX1JFVFVSTihjYXJkLT5jdHgsIFNDX0xPR19ERUJVR19WRVJCT1NFLCBTQ19FUlJPUl9JTlZBTElEX0FSR1VNRU5UUyk7Ci0gCi0tCXIgPSBzY19hcGR1X2dldF9vY3RldHMoY2FyZC0+Y3R4LCBhcGR1LCAmc2J1ZiwgJnNzaXplLCBTQ19QUk9UT19SQVcpOwotLQlpZiAociA9PSBTQ19TVUNDRVNTKQotKwkgciA9IHNjX2FwZHVfZ2V0X29jdGV0cyhjYXJkLT5jdHgsIGFwZHUsICZzYnVmLCAmc3NpemUsIFNDX1BST1RPX1JBVyk7Ci0rCSBpZiAociA9PSBTQ19TVUNDRVNTKQotIAkJc2NfYXBkdV9sb2coY2FyZC0+Y3R4LCBTQ19MT0dfREVCVUdfVkVSQk9TRSwgc2J1Ziwgc3NpemUsIDEpOwotLQlpZihzYnVmKQotKwkgaWYoc2J1ZikKLSAJCWZyZWUoc2J1Zik7Ci0gCi0gCSBpZihjaXBoZXIpCi1kaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3BrY3MxNS1pbml0LmMgYi9zcmMvdG9vbHMvcGtjczE1LWluaXQuYwotaW5kZXggMWNlNzlmNDUuLjlhNzMxMjFjIDEwMDY0NAotLS0tIGEvc3JjL3Rvb2xzL3BrY3MxNS1pbml0LmMKLSsrKyBiL3NyYy90b29scy9wa2NzMTUtaW5pdC5jCi1AQCAtMjMxMSw4ICsyMzExLDggQEAgZG9fcmVhZF9wcml2YXRlX2tleShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZm9ybWF0LAotIAkJCXIgPSB1dGlsX2dldHBhc3MoJnBhc3NwaHJhc2UsICZsZW4sIHN0ZGluKTsKLSAJCQlpZiAociA8IDAgfHwgIXBhc3NwaHJhc2UpCi0gCQkJCXJldHVybiBTQ19FUlJPUl9JTlRFUk5BTDsKLS0gCQkJciA9IGRvX3JlYWRfcGtjczEyX3ByaXZhdGVfa2V5KGZpbGVuYW1lLAotLSAJCQkJCXBhc3NwaHJhc2UsIHBrLCBjZXJ0cywgbWF4X2NlcnRzKTsKLSsJCQlyID0gZG9fcmVhZF9wa2NzMTJfcHJpdmF0ZV9rZXkoZmlsZW5hbWUsCi0rCQkJCQlwYXNzcGhyYXNlLCBwaywgY2VydHMsIG1heF9jZXJ0cyk7Ci0gCQl9Ci0gCX0gZWxzZSB7Ci0gCQl1dGlsX2Vycm9yKCJFcnJvciB3aGVuIHJlYWRpbmcgcHJpdmF0ZSBrZXkuICIKLS0tIAotMi4yNC4xCi0KZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2MvMDAwMS1SZW1vdmUtcmVkdW5kYW50LWxvZ2dpbmcucGF0Y2ggYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjLzAwMDEtUmVtb3ZlLXJlZHVuZGFudC1sb2dnaW5nLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTFmMWEyLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2MvMDAwMS1SZW1vdmUtcmVkdW5kYW50LWxvZ2dpbmcucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1Gcm9tIGMwMTJmNDY5NjViM2ZlMjRlMzEzNjc3OTZlNTJjMmQwYjE0Y2E1ZDkgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCi1Gcm9tOiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgotRGF0ZTogTW9uLCAxNyBEZWMgMjAxOCAxODo0NDoyMyAtMDgwMAotU3ViamVjdDogW1BBVENIXSBSZW1vdmUgcmVkdW5kYW50IGxvZ2dpbmcKLQotU2FtZSBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGEgZmV3IGxpbmUgYmVsb3cgaW4gc2FtZSBmdW5jdGlvbiwgdGhlIG9ubHkKLWRpZmZlcmVuY2UgaXMgdGhhdCB0aGVyZSBpdCB0YWtlcyBjYXJlIG9mIGNhc2Ugd2hlbiBsYWJlbCBpcyBOVUxMIHBvaW50ZXIKLXVubGlrZSB0aGlzIGxpbmUKLQotc2Vjb25kbHksIGV2ZXJ5IGZ1bmN0aW9uIGNhbGwgdG8gY29zbV93cml0ZV90b2tlbmluZm8oKSBpbiB0aGlzIGZpbGUKLXBhc3NlcyBsYWJlbD1OVUxMLCBhbmQgdGhlbiBpdCB0cmllcyB0byBwcmludCBhIG51bGwgcG9pbnRlcgotCi1GaXhlcyBlcnJvcnMgbGlrZQotc3JjL2xpYm9wZW5zYy9sb2cuaDo0ODo0NzogZXJyb3I6ICclcycgZGlyZWN0aXZlIGFyZ3VtZW50IGlzIG51bGwKLVstV2Vycm9yPWZvcm1hdC1vdmVyZmxvdz1dCi0KLVVwc3RyZWFtLVN0YXR1czogU3VibWl0dGVkIFtodHRwczovL2dpdGh1Yi5jb20vT3BlblNDL09wZW5TQy9wdWxsLzE1NTddCi1TaWduZWQtb2ZmLWJ5OiBLaGVtIFJhaiA8cmFqLmtoZW1AZ21haWwuY29tPgotLS0tCi0gc3JjL3BrY3MxNWluaXQvcGtjczE1LW9iZXJ0aHVyLmMgfCAxIC0KLSAxIGZpbGUgY2hhbmdlZCwgMSBkZWxldGlvbigtKQotCi1JbmRleDogZ2l0L3NyYy9wa2NzMTVpbml0L3BrY3MxNS1vYmVydGh1ci5jCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0gZ2l0Lm9yaWcvc3JjL3BrY3MxNWluaXQvcGtjczE1LW9iZXJ0aHVyLmMKLSsrKyBnaXQvc3JjL3BrY3MxNWluaXQvcGtjczE1LW9iZXJ0aHVyLmMKLUBAIC03MCw3ICs3MCw2IEBAIGNvc21fd3JpdGVfdG9rZW5pbmZvIChzdHJ1Y3Qgc2NfcGtjczE1X2MKLSAJY3R4ID0gcDE1Y2FyZC0+Y2FyZC0+Y3R4OwotIAotIAlTQ19GVU5DX0NBTExFRChjdHgsIFNDX0xPR19ERUJVR19WRVJCT1NFKTsKLS0Jc2NfZGVidWcoY3R4LCBTQ19MT0dfREVCVUdfTk9STUFMLCAiY29zbV93cml0ZV90b2tlbmluZm8oKSBsYWJlbCAnJXMnOyBmbGFncyAweCVYIiwgbGFiZWwsIGZsYWdzKTsKLSAJaWYgKHNjX3Byb2ZpbGVfZ2V0X2ZpbGUocHJvZmlsZSwgQ09TTV9USVRMRSItdG9rZW4taW5mbyIsICZmaWxlKSkgewotIAkJcnYgPSBTQ19FUlJPUl9JTkNPTlNJU1RFTlRfUFJPRklMRTsKLSAJCVNDX1RFU1RfR09UT19FUlIoY3R4LCBTQ19MT0dfREVCVUdfTk9STUFMLCBydiwgIkNhbm5vdCBmaW5kICJDT1NNX1RJVExFIi10b2tlbi1pbmZvIik7CmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjXzAuMTkuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2NfMC4yMC4wLmJiCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L29wZW5zYy9vcGVuc2NfMC4xOS4wLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjXzAuMjAuMC5iYgppbmRleCAwZDc0NGUyLi5hODE1OTgwIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjXzAuMTkuMC5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9vcGVuc2Mvb3BlbnNjXzAuMjAuMC5iYgpAQCAtMTIsMTAgKzEyLDggQEAKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0NPUFlJTkc7bWQ1PTdmYmMzMzgzMDlhYzM4ZmVmY2Q2NGIwNGJiOTAzZTM0IgogCiAjdjAuMTkuMAotU1JDUkVWID0gImYxNjkxZmM5MWZjMTEzMTkxYzNhOGFhZjVmYWNkNjk4MzMzNGVjNDciCitTUkNSRVYgPSAiNDVlMjkwNTZjY2RlNDIyZTcwZWQzNTg1MDg0YTdmMTUwYzYzMjUxNSIKIFNSQ19VUkkgPSAiZ2l0Oi8vZ2l0aHViLmNvbS9PcGVuU0MvT3BlblNDIFwKLSAgICAgICAgICAgZmlsZTovLzAwMDEtUmVtb3ZlLXJlZHVuZGFudC1sb2dnaW5nLnBhdGNoIFwKLSAgICAgICAgICAgZmlsZTovLzAwMDEtRml4LW1pc2xlYWRpbmctY29kZS1pbmRlbnRhdGlvbi5wYXRjaCBcCiAgICAgICAgICAgIgogREVQRU5EUyA9ICJ2aXJ0dWFsL2xpYmljb252IG9wZW5zc2wiCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Bjc2MtbGl0ZS9wY3NjLWxpdGVfMS44LjI1LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvcGNzYy1saXRlL3Bjc2MtbGl0ZV8xLjguMjYuYmIKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvcGNzYy1saXRlL3Bjc2MtbGl0ZV8xLjguMjUuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Bjc2MtbGl0ZS9wY3NjLWxpdGVfMS44LjI2LmJiCmluZGV4IDY4NjllMmMuLjVlNjA4NDYgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Bjc2MtbGl0ZS9wY3NjLWxpdGVfMS44LjI1LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Bjc2MtbGl0ZS9wY3NjLWxpdGVfMS44LjI2LmJiCkBAIC0xMSw4ICsxMSw4IEBACiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9DT1BZSU5HO21kNT02MjhjMDFiYTk4NWVjZmEyMTY3N2Y1ZWUyZDUyMDJmNiIKIAogU1JDX1VSSSA9ICJodHRwczovL3Bjc2NsaXRlLmFwZHUuZnIvZmlsZXMvJHtCUH0udGFyLmJ6MiIKLVNSQ19VUklbbWQ1c3VtXSA9ICJjMjA2NTBhMzYwNjJhYjE2ODlmMzdmMzMwMmM5ODhmMiIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICJkNzZkNzllZGMzMWNmNzZlNzgyYjlmNjk3NDIwZDNkZWZiY2M5MTc3OGMzYzY1MDY1ODA4NmExYjc0OGU4NzkyIgorU1JDX1VSSVttZDVzdW1dID0gIjlkMzY4ODI5OTg0NDlkYWNlZWMyNjdjNjhhMjFmZjBkIgorU1JDX1VSSVtzaGEyNTZzdW1dID0gIjNlYjdiZTdkNmVmNjE4YzBhNDQ0MzE2Y2Y1YzFmMmY5ZDcyMjdhZWRiYTdhMTkyZjM4OWZlM2U3YzBkZmJiZDkiCiAKIGluaGVyaXQgYXV0b3Rvb2xzIHN5c3RlbWQgcGtnY29uZmlnCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Nhc3MvbGlic2Fzc18zLjYuMS5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Nhc3MvbGlic2Fzc18zLjYuMy5iYgpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9zYXNzL2xpYnNhc3NfMy42LjEuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Nhc3MvbGlic2Fzc18zLjYuMy5iYgppbmRleCA0ODBlOTg0Li5kODkzYmUyIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9zYXNzL2xpYnNhc3NfMy42LjEuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvc2Fzcy9saWJzYXNzXzMuNi4zLmJiCkBAIC02LDcgKzYsNyBAQAogaW5oZXJpdCBhdXRvdG9vbHMKIAogU1JDX1VSSSA9ICJnaXQ6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy5naXQ7YnJhbmNoPW1hc3RlciIKLVNSQ1JFViA9ICI0ZDIyOWFmNTUwMGJlMTAyMzg4M2MzOGM0YTY3NWYwZWQ5MTk4MzlkIgorU1JDUkVWID0gImUxYzE2ZTA5YjRhOTUzNzU3YTE1MTQ5ZGVhYWYyOGEzZmQ4MWRjOTciCiAKIFMgPSAiJHtXT1JLRElSfS9naXQiCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3NzaWFwaS9zc2lhcGlfMS4zLjAuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC9zc2lhcGkvc3NpYXBpXzEuMy4wLmJiCmluZGV4IGViMDg2ODEuLmNlNDZjZjUgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3NzaWFwaS9zc2lhcGlfMS4zLjAuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvc3NpYXBpL3NzaWFwaV8xLjMuMC5iYgpAQCAtMzQsMyArMzQsNSBAQAogfQogCiBSREVQRU5EU18ke1BOfSArPSAibWRhZG0iCisKK0NPTVBBVElCTEVfSE9TVF9wb3dlcnBjID0gJ251bGwnCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnMvZXhwb3J0LnBhdGNoIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvdmJveGd1ZXN0ZHJpdmVycy92Ym94Z3Vlc3Rkcml2ZXJzL2V4cG9ydC5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiYTMzMy4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnMvZXhwb3J0LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotSW5kZXg6IHNyYy9WQm94L0FkZGl0aW9ucy9saW51eC9leHBvcnRfbW9kdWxlcy5zaAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIGEvc3JjL1ZCb3gvQWRkaXRpb25zL2xpbnV4L2V4cG9ydF9tb2R1bGVzLnNoCi0rKysgYi9zcmMvVkJveC9BZGRpdGlvbnMvbGludXgvZXhwb3J0X21vZHVsZXMuc2gKLUBAIC00Niw3ICs0NiwxMyBAQAotIFZCT1hfVkVSU0lPTl9NQUpPUj1gc2VkIC1lICJzL14gKlZCT1hfVkVSU0lPTl9NQUpPUiAqPSBcK1woWzAtOV1cK1wpL1wxLzt0O2QiICRQQVRIX1JPT1QvVmVyc2lvbi5rbWtgCi0gVkJPWF9WRVJTSU9OX01JTk9SPWBzZWQgLWUgInMvXiAqVkJPWF9WRVJTSU9OX01JTk9SICo9IFwrXChbMC05XVwrXCkvXDEvO3Q7ZCIgJFBBVEhfUk9PVC9WZXJzaW9uLmtta2AKLSBWQk9YX1ZFUlNJT05fQlVJTEQ9YHNlZCAtZSAicy9eICpWQk9YX1ZFUlNJT05fQlVJTEQgKj0gXCtcKFswLTldXCtcKS9cMS87dDtkIiAkUEFUSF9ST09UL1ZlcnNpb24ua21rYAotLVZCT1hfU1ZOX1JFVj1gc2VkIC1lICdzL14gKlZCT1hfU1ZOX1JFVl9GQUxMQkFDSyAqOj0gXCtcJChwYXRzdWJzdCAqJTosLCAqXCRSZXY6ICpcKFswLTldXCtcKSAqXCQgKikgKi9cMS87dDtkJyAkUEFUSF9ST09UL0NvbmZpZy5rbWtgCi0rVkJPWF9TVk5fQ09ORklHX1JFVj1gc2VkIC1lICdzL14gKlZCT1hfU1ZOX1JFVl9DT05GSUdfRkFMTEJBQ0sgKjo9IFwrXCQocGF0c3Vic3QgKiU6LCwgKlwkUmV2OiAqXChbMC05XVwrXCkgKlwkICopICovXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYAotK1ZCT1hfU1ZOX1ZFUlNJT05fUkVWPWBzZWQgLWUgJ3MvXiAqVkJPWF9TVk5fUkVWX1ZFUlNJT05fRkFMTEJBQ0sgKjo9IFwrXCQocGF0c3Vic3QgKiU6LCwgKlwkUmV2OiAqXChbMC05XVwrXCkgKlwkICopICovXDEvO3Q7ZCcgJFBBVEhfUk9PVC9WZXJzaW9uLmtta2AKLStpZiBbICIkVkJPWF9TVk5fQ09ORklHX1JFViIgLWd0ICIkVkJPWF9TVk5fVkVSU0lPTl9SRVYiIF07IHRoZW4KLSsgICAgVkJPWF9TVk5fUkVWPSRWQk9YX1NWTl9DT05GSUdfUkVWCi0rZWxzZQotKyAgICBWQk9YX1NWTl9SRVY9JFZCT1hfU1ZOX1ZFUlNJT05fUkVWCi0rZmkKLSBWQk9YX1ZFTkRPUj1gc2VkIC1lICdzL14gKlZCT1hfVkVORE9SICo9IFwrXCguXCtcKS9cMS87dDtkJyAkUEFUSF9ST09UL0NvbmZpZy5rbWtgCi0gVkJPWF9WRU5ET1JfU0hPUlQ9YHNlZCAtZSAncy9eICpWQk9YX1ZFTkRPUl9TSE9SVCAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYAotIFZCT1hfUFJPRFVDVD1gc2VkIC1lICdzL14gKlZCT1hfUFJPRFVDVCAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYAotSW5kZXg6IHNyYy9WQm94L0hvc3REcml2ZXJzL2xpbnV4L2V4cG9ydF9tb2R1bGVzLnNoCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0gYS9zcmMvVkJveC9Ib3N0RHJpdmVycy9saW51eC9leHBvcnRfbW9kdWxlcy5zaAotKysrIGIvc3JjL1ZCb3gvSG9zdERyaXZlcnMvbGludXgvZXhwb3J0X21vZHVsZXMuc2gKLUBAIC0xMDAsMTIgKzEwMCwyNiBAQAotIFZCT1hfVkVSU0lPTl9NSU5PUj1gc2VkIC1lICJzL14gKlZCT1hfVkVSU0lPTl9NSU5PUiAqPSBcK1woWzAtOV1cK1wpL1wxLzt0O2QiICRQQVRIX1JPT1QvVmVyc2lvbi5rbWtgCi0gVkJPWF9WRVJTSU9OX0JVSUxEPWBzZWQgLWUgInMvXiAqVkJPWF9WRVJTSU9OX0JVSUxEICo9IFwrXChbMC05XVwrXCkvXDEvO3Q7ZCIgJFBBVEhfUk9PVC9WZXJzaW9uLmtta2AKLSBWQk9YX1ZFUlNJT05fU1RSSU5HPSRWQk9YX1ZFUlNJT05fTUFKT1IuJFZCT1hfVkVSU0lPTl9NSU5PUi4kVkJPWF9WRVJTSU9OX0JVSUxECi0tVkJPWF9TVk5fUkVWPWBzZWQgLWUgJ3MvXiAqVkJPWF9TVk5fUkVWX0ZBTExCQUNLICo6PSBcK1wkKHBhdHN1YnN0IColOiwsICpcJFJldjogKlwoWzAtOV1cK1wpICpcJCAqKSAqL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZCT1hfVkVORE9SPWBzZWQgLWUgJ3MvXiAqVkJPWF9WRU5ET1IgKj0gXCtcKC5cK1wpL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkJPWF9WRU5ET1JfU0hPUlQ9YHNlZCAtZSAncy9eICpWQk9YX1ZFTkRPUl9TSE9SVCAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYCAgICAgICAgICAgICAgICAgICAgICAgICBWQk9YX1BST0RVQ1Q9YHNlZCAtZSAncy9eICpWQk9YX1BST0RVQ1QgKj0gXCtcKC5cK1wpL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZCT1hfQ19ZRUFSPWBkYXRlICslWWAKLStWQk9YX1ZFUlNJT05fQlVJTEQ9YHNlZCAtZSAicy9eICpWQk9YX1ZFUlNJT05fQlVJTEQgKj0gXCtcKFswLTldXCtcKS9cMS87dDtkIiAkUEFUSF9ST09UL1ZlcnNpb24ua21rYAotK1ZCT1hfU1ZOX0NPTkZJR19SRVY9YHNlZCAtZSAncy9eICpWQk9YX1NWTl9SRVZfQ09ORklHX0ZBTExCQUNLICo6PSBcK1wkKHBhdHN1YnN0IColOiwsICpcJFJldjogKlwoWzAtOV1cK1wpICpcJCAqKSAqL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AKLStWQk9YX1NWTl9WRVJTSU9OX1JFVj1gc2VkIC1lICdzL14gKlZCT1hfU1ZOX1JFVl9WRVJTSU9OX0ZBTExCQUNLICo6PSBcK1wkKHBhdHN1YnN0IColOiwsICpcJFJldjogKlwoWzAtOV1cK1wpICpcJCAqKSAqL1wxLzt0O2QnICRQQVRIX1JPT1QvVmVyc2lvbi5rbWtgCi0raWYgWyAiJFZCT1hfU1ZOX0NPTkZJR19SRVYiIC1ndCAiJFZCT1hfU1ZOX1ZFUlNJT05fUkVWIiBdOyB0aGVuCi0rICAgIFZCT1hfU1ZOX1JFVj0kVkJPWF9TVk5fQ09ORklHX1JFVgotK2Vsc2UKLSsgICAgVkJPWF9TVk5fUkVWPSRWQk9YX1NWTl9WRVJTSU9OX1JFVgotK2ZpCi0rVkJPWF9WRU5ET1I9YHNlZCAtZSAncy9eICpWQk9YX1ZFTkRPUiAqPSBcK1woLlwrXCkvXDEvO3Q7ZCcgJFBBVEhfUk9PVC9Db25maWcua21rYAotK1ZCT1hfVkVORE9SX1NIT1JUPWBzZWQgLWUgJ3MvXiAqVkJPWF9WRU5ET1JfU0hPUlQgKj0gXCtcKC5cK1wpL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AKLStWQk9YX1BST0RVQ1Q9YHNlZCAtZSAncy9eICpWQk9YX1BST0RVQ1QgKj0gXCtcKC5cK1wpL1wxLzt0O2QnICRQQVRIX1JPT1QvQ29uZmlnLmtta2AKLStWQk9YX0NfWUVBUj1gZGF0ZSArJVlgCi0rVkJPWF9XSVRIX1BDSV9QQVNTVEhST1VHSD1gc2VkIC1lICJzL14gKlZCT1hfV0lUSF9QQ0lfUEFTU1RIUk9VR0ggKj0gKlwoMVw/XCkvXDEvO3Q7ZCIgJFBBVEhfUk9PVC9Db25maWcua21rYAotIAotIC4gJFBBVEhfVkJPWERSVi9saW51eC9maWxlc192Ym94ZHJ2Ci0gLiAkUEFUSF9WQk9YTkVUL2xpbnV4L2ZpbGVzX3Zib3huZXRmbHQKLSAuICRQQVRIX1ZCT1hBRFAvbGludXgvZmlsZXNfdmJveG5ldGFkcAotLS4gJFBBVEhfVkJPWFBDSS9saW51eC9maWxlc192Ym94cGNpCi0raWYgWyAiJFZCT1hfV0lUSF9QQ0lfUEFTU1RIUk9VR0giIC1lcSAiMSIgXTsgdGhlbgotKyAgICAuICRQQVRIX1ZCT1hQQ0kvbGludXgvZmlsZXNfdmJveHBjaQotK2ZpCi0gCi0gIyBUZW1wb3JhcnkgcGF0aCBmb3IgY3JlYXRpbmcgdGhlIG1vZHVsZXMsIHdpbGwgYmUgcmVtb3ZlZCBsYXRlcgotIHJtIC1yZiAiJFBBVEhfVE1QIgotQEAgLTE4NywxNCArMjAxLDE2IEBACi0gZmkKLSAKLSAjIHZib3hwY2kgKFZpcnR1YWxCb3ggaG9zdCBQQ0kgYWNjZXNzIGtlcm5lbCBtb2R1bGUpCi0tbWtkaXIgJFBBVEhfVE1QL3Zib3hwY2kgfHwgZXhpdCAxCi0tZm9yIGYgaW4gJFZCT1hfVkJPWFBDSV9TT1VSQ0VTOyBkbwotLSAgICBpbnN0YWxsIC1EIC1tIDA2NDQgYGVjaG8gJGZ8Y3V0IC1kJz0nIC1mMWAgIiRQQVRIX1RNUC92Ym94cGNpL2BlY2hvICRmfGN1dCAtZCc+JyAtZjJgIgotLWRvbmUKLS1pZiBbIC1uICIkVkJPWF9XSVRIX0hBUkRFTklORyIgXTsgdGhlbgotLSAgICBjYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQQVRIX1ZCT1hQQ0kvbGludXgvTWFrZWZpbGUgPiAkUEFUSF9UTVAvdmJveHBjaS9NYWtlZmlsZQotLWVsc2UKLS0gICAgc2VkIC1lICJzO1ZCT1hfV0lUSF9IQVJERU5JTkc7O2ciIDwgJFBBVEhfVkJPWFBDSS9saW51eC9NYWtlZmlsZSA+ICRQQVRIX1RNUC92Ym94cGNpL01ha2VmaWxlCi0raWYgWyAiJFZCT1hfV0lUSF9QQ0lfUEFTU1RIUk9VR0giIC1lcSAiMSIgXTsgdGhlbgotKyAgICBta2RpciAkUEFUSF9UTVAvdmJveHBjaSB8fCBleGl0IDEKLSsgICAgZm9yIGYgaW4gJFZCT1hfVkJPWFBDSV9TT1VSQ0VTOyBkbwotKyAgICAgICAgaW5zdGFsbCAtRCAtbSAwNjQ0IGBlY2hvICRmfGN1dCAtZCc9JyAtZjFgICIkUEFUSF9UTVAvdmJveHBjaS9gZWNobyAkZnxjdXQgLWQnPicgLWYyYCIKLSsgICAgZG9uZQotKyAgICBpZiBbIC1uICIkVkJPWF9XSVRIX0hBUkRFTklORyIgXTsgdGhlbgotKyAgICAgICAgY2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUEFUSF9WQk9YUENJL2xpbnV4L01ha2VmaWxlID4gJFBBVEhfVE1QL3Zib3hwY2kvTWFrZWZpbGUKLSsgICAgZWxzZQotKyAgICAgICAgc2VkIC1lICJzO1ZCT1hfV0lUSF9IQVJERU5JTkc7O2ciIDwgJFBBVEhfVkJPWFBDSS9saW51eC9NYWtlZmlsZSA+ICRQQVRIX1RNUC92Ym94cGNpL01ha2VmaWxlCi0rICAgIGZpCi0gZmkKLSAKLSBpbnN0YWxsIC1EIC1tIDA2NDQgJFBBVEhfTElOVVgvTWFrZWZpbGUgJFBBVEhfVE1QL01ha2VmaWxlCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnNfNi4xLjAuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnNfNi4xLjIuYmIKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvdmJveGd1ZXN0ZHJpdmVycy92Ym94Z3Vlc3Rkcml2ZXJzXzYuMS4wLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC92Ym94Z3Vlc3Rkcml2ZXJzL3Zib3hndWVzdGRyaXZlcnNfNi4xLjIuYmIKaW5kZXggYmUxOGIxMC4uNjJjMmI1MCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvdmJveGd1ZXN0ZHJpdmVycy92Ym94Z3Vlc3Rkcml2ZXJzXzYuMS4wLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3Zib3hndWVzdGRyaXZlcnMvdmJveGd1ZXN0ZHJpdmVyc182LjEuMi5iYgpAQCAtMTMsMTAgKzEzLDkgQEAKIAogU1JDX1VSSSA9ICJodHRwOi8vZG93bmxvYWQudmlydHVhbGJveC5vcmcvdmlydHVhbGJveC8ke1BWfS8ke1ZCT1hfTkFNRX0udGFyLmJ6MiBcCiAgICAgZmlsZTovL01ha2VmaWxlLnV0aWxzIFwKLSAgICBmaWxlOi8vZXhwb3J0LnBhdGNoO3BhdGNoZGlyPSR7V09SS0RJUn0vJHtWQk9YX05BTUV9IFwKICIKLVNSQ19VUklbbWQ1c3VtXSA9ICI0ODRiNTUwZjQ2OTJjOWQ2MTg5NmIwOGJiMGExYmU3ZiIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICI0OTAwNWVkOTQ0NTRmODkzZmMzOTU1ZTFlMmI5NjA3ZTg1YzMwMDIzNWNiOTgzYjM5ZDFkZjJjZmNmMjlmMDM5IgorU1JDX1VSSVttZDVzdW1dID0gImY0ZjQyZmQwOTg1NzU1NmIwNGI4MDNmYjk5Y2M2OTA1IgorU1JDX1VSSVtzaGEyNTZzdW1dID0gIjQzMjY1NzZlODQyOGVhMzYyNjE5NGZjODI2NDYzNDc1NzZlOTRjNjFmMTFkNDEyYTY2OWZjOGExMGMyYTFlNjciCiAKIFMgPSAiJHtXT1JLRElSfS92Ym94X21vZHVsZSIKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvd2Vic29ja2V0cHAvd2Vic29ja2V0cHAtMC44LjEvMDAwMS1Db3JyZWN0LWNsYW5nLWNvbXBpbGVyLWZsYWdzLnBhdGNoIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvd2Vic29ja2V0cHAvd2Vic29ja2V0cHAtMC44LjEvMDAwMS1Db3JyZWN0LWNsYW5nLWNvbXBpbGVyLWZsYWdzLnBhdGNoCmluZGV4IDQyMTc4OTcuLmYxZDAzN2YgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtb2UvcmVjaXBlcy1zdXBwb3J0L3dlYnNvY2tldHBwL3dlYnNvY2tldHBwLTAuOC4xLzAwMDEtQ29ycmVjdC1jbGFuZy1jb21waWxlci1mbGFncy5wYXRjaAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC93ZWJzb2NrZXRwcC93ZWJzb2NrZXRwcC0wLjguMS8wMDAxLUNvcnJlY3QtY2xhbmctY29tcGlsZXItZmxhZ3MucGF0Y2gKQEAgLTE4LDcgKzE4LDcgQEAKIGluZGV4IDJkMTMxMTcuLmMxNzM1NGEgMTAwNjQ0CiAtLS0gYS9DTWFrZUxpc3RzLnR4dAogKysrIGIvQ01ha2VMaXN0cy50eHQKLUBAIC0xNDgsNyArMTQ4LDcgQEAgaWYgKEJVSUxEX1RFU1RTIE9SIEJVSUxEX0VYQU1QTEVTKQorQEAgLTE1MCw3ICsxNTAsNyBAQCBpZiAoQlVJTERfVEVTVFMgT1IgQlVJTERfRVhBTVBMRVMpCiAgICAgICAgICBlbmRpZigpCiAgICAgICAgICBzZXQgKFdFQlNPQ0tFVFBQX1BMQVRGT1JNX1RMU19MSUJTIHNzbCBjcnlwdG8pCiAgICAgICAgICBzZXQgKFdFQlNPQ0tFVFBQX0JPT1NUX0xJQlMgc3lzdGVtIHRocmVhZCkKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcGVybC9yZWNpcGVzLXBlcmwvbGliZW5jb2RlL2xpYmVuY29kZS1wZXJsXzMuMDEuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXBlcmwvcmVjaXBlcy1wZXJsL2xpYmVuY29kZS9saWJlbmNvZGUtcGVybF8zLjAyLmJiCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcGVybC9yZWNpcGVzLXBlcmwvbGliZW5jb2RlL2xpYmVuY29kZS1wZXJsXzMuMDEuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcGVybC9yZWNpcGVzLXBlcmwvbGliZW5jb2RlL2xpYmVuY29kZS1wZXJsXzMuMDIuYmIKaW5kZXggYmUzYTI5Ni4uYjMyYmMwMiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1wZXJsL3JlY2lwZXMtcGVybC9saWJlbmNvZGUvbGliZW5jb2RlLXBlcmxfMy4wMS5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXBlcmwvcmVjaXBlcy1wZXJsL2xpYmVuY29kZS9saWJlbmNvZGUtcGVybF8zLjAyLmJiCkBAIC0xNSw4ICsxNSw4IEBACiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9NRVRBLmpzb247YmVnaW5saW5lPTg7ZW5kbGluZT0xMDttZDU9YjEyZTNiZTFlMTdhN2U5OWNhNGY0MjlmZjMyYzI4YjUiCiAKIFNSQ19VUkkgPSAiJHtDUEFOX01JUlJPUn0vYXV0aG9ycy9pZC9EL0RBL0RBTktPR0FJL0VuY29kZS0ke1BWfS50YXIuZ3oiCi1TUkNfVVJJW21kNXN1bV0gPSAiYjA1MjRjYTE1MzVmZjY5NTZjZjFmZjY5NjYxNmM5NGEiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiZDQ1NTVmNTcwNDkxNjQ4ZGJiZDYwMmJjZTc5NjY2NzI4MzRiNGM4ZjQ1YWNhYTY3NTdkZTQ3NGZjYTNhNGQ4NyIKK1NSQ19VUklbbWQ1c3VtXSA9ICI0ZWIwN2JhNmRiMDJkNWI5ODIzMTZlMWRkMDVmNjhiZCIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICI1ODY1YmU0OTUxODcwZjYyZjQzNzIyODE4ZDA3NmQ3NzI0MzA2Yzc1YzhmMjY4MzQ2YjI4MjM1MWNiYzgyMGE4IgogCiBVUFNUUkVBTV9DSEVDS19SRUdFWCA9ICJFbmNvZGVcLSg/UDxwdmVyPihcZCtcLlxkKykpKD8hX1xkKykudGFyIgogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tY21kMi5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tY21kMi5pbmMKaW5kZXggY2VhYTE4MS4uNjgzODFhZCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLWNtZDIuaW5jCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1jbWQyLmluYwpAQCAtMSwxMCArMSwxMCBAQAogU1VNTUFSWSA9ICJFeHRyYSBmZWF0dXJlcyBmb3Igc3RhbmRhcmQgbGlicmFyeSdzIGNtZCBtb2R1bGUiCiBIT01FUEFHRSA9ICJodHRwOi8vcGFja2FnZXMucHl0aG9uLm9yZy9jbWQyLyIKIExJQ0VOU0UgPSAiTUlUIgotTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vTElDRU5TRTttZDU9MDFhZWFiZWE3YWUxNTI5YThlNGI2NzRiNzEwN2Q2YmMiCitMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9MSUNFTlNFO21kNT05NzkxY2QyNGNhN2QxODA3Mzg4Y2NkNTVjZDA2NmRlZiIKIAotU1JDX1VSSVttZDVzdW1dID0gIjkwZGNjYWIzYTIwMTA2YzU0M2VmODVkMmJlZTcyMGJiIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gImJhMjQ0YjA3YzBiNDY1ZmY1NGE2ODM4ZGM2MTkxOTU5OTE0MWRjOTJkZTFiZjAwYmIwYTcwODc1MTg5MTU1ZTYiCitTUkNfVVJJW21kNXN1bV0gPSAiNmRiNjZhMDYyMTBkNWYxZWRiNDQ2OTNiODg3ZWQ2MmIiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiOGFkMTJlZjNjYzQ2ZDAzMDczYzU0NWI2ZTgwYTNmODRhNTkyMWY2NjUzMDczYTYwZTdkOWE3ZmYzYjM1MmM5ZSIKIAogaW5oZXJpdCBweXBpCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1jbWQyXzAuOS4yMi5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1jbWQyXzAuOS4yMy5iYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLWNtZDJfMC45LjIyLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tY21kMl8wLjkuMjMuYmIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1lbmdpbmVpby5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tZW5naW5laW8uaW5jCmluZGV4IDU3YjdiMTguLjljMDY3YzkgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1lbmdpbmVpby5pbmMKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLWVuZ2luZWlvLmluYwpAQCAtOSw1ICs5LDUgQEAKIAogUFlQSV9QQUNLQUdFID0gInB5dGhvbi1lbmdpbmVpbyIKIAotU1JDX1VSSVttZDVzdW1dID0gIjMyN2MxNmNhMDVlOWIwY2M0Zjk5NGI5ZDM1YzdmN2Q3IgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjUwZDEwOGZjN2ZlYjdmOTcwZTZlYmM4NjczMzc1MmViZDcxNDU0NWJiNTYyMjM4M2U2MTM1YmRhZDQ1ZmM5ZmUiCitTUkNfVVJJW21kNXN1bV0gPSAiMTMzNDU0NTJiZTI1YzNiNjNkMDQxZjhmODllNjYyZDEiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiNDdhZTRhOWIzYjRmMmU4YTY4OTI5ZjM3YTUxODMzODgzOGUxMTlmMjRjOWE5MTIxYWY5MmM0OWY4YmVhNTVjMyIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1lbmdpbmVpb18zLjExLjEuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tZW5naW5laW9fMy4xMS4yLmJiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tZW5naW5laW9fMy4xMS4xLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tZW5naW5laW9fMy4xMS4yLmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tamF2YW9iai1weTMuaW5jIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLWphdmFvYmotcHkzLmluYwppbmRleCBiMTBmMDBiLi5lNjY3MDU3IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tamF2YW9iai1weTMuaW5jCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1qYXZhb2JqLXB5My5pbmMKQEAgLTcsOCArNyw4IEBACiBMSUNFTlNFID0gIkFwYWNoZS0yLjAiCiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9zZXR1cC5weTtiZWdpbmxpbmU9MTU7ZW5kbGluZT0yNzttZDU9YWY5Y2UyNmFjMmRlMWI3NDM2ZWIwOGM5MzA4YjRhMWUiCiAKLVNSQ19VUklbbWQ1c3VtXSA9ICIxYzYxODlhMGQ5YWVmNTFkNzRiZmM1MmNkMjk1Mzk5MSIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICJhNTc0NjllNGYwZDBlZWJhNzQ4MmFkOTgzOTU5NWRiNmU5OWNhNGFjNjYzMGE0YzgwNjRkZGE3NWEyMTgyNTQ5IgorU1JDX1VSSVttZDVzdW1dID0gIjM1MmZlMGRmOTMzNmI4Njk5YWQwNzk5ZWYxNTJkYTZiIgorU1JDX1VSSVtzaGEyNTZzdW1dID0gIjE4YzQ0Y2ZhYTIxNDgxMzc4NGE4MjM0MzJiNGFiOTgyOWM5NjI2YjJiMDAwNzIwMTE2MjdiNDAwOGIwMDY3Y2QiCiAKIGluaGVyaXQgcHlwaQogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tamF2YW9iai1weTNfMC4zLjAuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tamF2YW9iai1weTNfMC40LjAuMS5iYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLWphdmFvYmotcHkzXzAuMy4wLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tamF2YW9iai1weTNfMC40LjAuMS5iYgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLWtjb25maWdsaWItMTAuNDIuMC5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24ta2NvbmZpZ2xpYi0xMC40Mi4wLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkNmE2NS4uMDAwMDAwMAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24ta2NvbmZpZ2xpYi0xMC40Mi4wLmluYworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotREVTQ1JJUFRJT04gPSAiS2NvbmZpZ2xpYiBpcyBhIEtjb25maWcgaW1wbGVtZW50YXRpb24gaW4gUHl0aG9uIgotTElDRU5TRSA9ICJJU0MiCi1MSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9MSUNFTlNFLnR4dDttZDU9NzEyMTc3YTcyYTM5Mzc5MDk1NDNlZGEzYWQxYmZiN2MiCi0KLVNSQ19VUklbbWQ1c3VtXSA9ICIyMzA2Mjc5YTA1MGM2YTg4OGYzNGE1NzE5MDQ3ZjIxNyIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICIwMDcwZWI5MDYxZjkyNGUxZmE3YmMyYjFmMGFlZWExZDM4ZTFkZGY5YmJkYmQ0YjVjMzQ2YmNmMWEwODQ4Njc0IgotCi1CQkNMQVNTRVhURU5EID0gIm5hdGl2ZSBuYXRpdmVzZGsiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24ta2NvbmZpZ2xpYi5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24ta2NvbmZpZ2xpYi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyYjI2YgotLS0gL2Rldi9udWxsCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1rY29uZmlnbGliLmluYwpAQCAtMCwwICsxLDggQEAKK0RFU0NSSVBUSU9OID0gIktjb25maWdsaWIgaXMgYSBLY29uZmlnIGltcGxlbWVudGF0aW9uIGluIFB5dGhvbiIKK0xJQ0VOU0UgPSAiSVNDIgorTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vTElDRU5TRS50eHQ7bWQ1PTcxMjE3N2E3MmEzOTM3OTA5NTQzZWRhM2FkMWJmYjdjIgorCitTUkNfVVJJW21kNXN1bV0gPSAiNzg3OWFhMTNkMzA2MjYzZTk1MTQ2NDM5ZDM5NTlmMjMiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiOGRiYjk0NmQ0MWEzM2NlYzJiNjM0MzIzOTNhNDkyMDQ3OWM4YzlmYThkNWJiY2E0NjhjNGU4YTY3M2JlNmUzNiIKKworQkJDTEFTU0VYVEVORCA9ICJuYXRpdmUgbmF0aXZlc2RrIgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBhY2thZ2luZy5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcGFja2FnaW5nLmluYwppbmRleCBjMzJjYWFhLi43Y2VkYWRmIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcGFja2FnaW5nLmluYworKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcGFja2FnaW5nLmluYwpAQCAtMyw4ICszLDggQEAKIExJQ0VOU0UgPSAiQXBhY2hlLTIuMCAmIEJTRCIKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0xJQ0VOU0U7bWQ1PWZhYWRhZWRjYTkyNTFhOTBiMjA1YzkxNjc1NzhjZTkxIgogCi1TUkNfVVJJW21kNXN1bV0gPSAiODY3Y2U3MDk4NGRjN2I4OWJiYmMzY2FjMmE3MmIxNzEiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiMjhiOTI0MTc0ZGY3YTJmYTMyYzE5NTM4MjVmZjI5YzYxZTJmNWUwODIzNDMxNjU0Mzg4MTJmMDBkM2E3ZmM0NyIKK1NSQ19VUklbbWQ1c3VtXSA9ICI5M2Q2Y2NiZGZjYjViNzY5N2I2ZWNlYTUzZWNjMjk0YiIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICJmZTFkODMzMWRmYTdjYzBhODgzYjQ5ZDc1ZmM3NjM4MGIyYWIyNzM0YjIyMGZiYjg3ZDc3NGU0ZmQ0Yjg1MWY4IgogCiBERVBFTkRTICs9ICIke1BZVEhPTl9QTn0tc2V0dXB0b29scy1zY20tbmF0aXZlIgogUkRFUEVORFNfJHtQTn0gKz0gIiR7UFlUSE9OX1BOfS1zaXggJHtQWVRIT05fUE59LXB5cGFyc2luZyIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1wYWNrYWdpbmdfMTkuMi5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1wYWNrYWdpbmdfMjAuMC5iYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBhY2thZ2luZ18xOS4yLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcGFja2FnaW5nXzIwLjAuYmIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1wZXJpcGhlcnkuaW5jIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBlcmlwaGVyeS5pbmMKaW5kZXggZWE0M2U1Zi4uNzE5YzYzNSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBlcmlwaGVyeS5pbmMKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBlcmlwaGVyeS5pbmMKQEAgLTIsNiArMiw2IEBACiBIT01FUEFHRSA9ICJodHRwOi8vcHl0aG9uaG9zdGVkLm9yZy9weXRob24tcGVyaXBoZXJ5LyIKIExJQ0VOU0UgPSAiTUlUIgogCi1MSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9QS0ctSU5GTzttZDU9MTlmOTc4YmQ2YzhhZmUzZmE5ZTQwOGI3MTMzMDUxMmYiCitMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9QS0ctSU5GTzttZDU9MWVjZjVjMjM1NGMyMmZiNWJmZDUzZWVmYjhmOWU2NWIiCiAKIFBZUElfUEFDS0FHRSA9ICJweXRob24tcGVyaXBoZXJ5IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBlcmlwaGVyeV8yLjAuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1wZXJpcGhlcnlfMi4wLjAuYmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjlmM2YuLjAwMDAwMDAKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBlcmlwaGVyeV8yLjAuMC5iYgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotaW5oZXJpdCBweXBpIHNldHVwdG9vbHMKLXJlcXVpcmUgcHl0aG9uLXBlcmlwaGVyeS5pbmMKLQotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjJkZjA1NTI4YTc2NjhkYjRmYjNmYWFmZjUxNmIzNGVkOTllOTAwOWVkOTYxMGE0ZWZlM2VhNmMwZWE4YTNhYWIiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcGVyaXBoZXJ5XzIuMC4xLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBlcmlwaGVyeV8yLjAuMS5iYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAyNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXBlcmlwaGVyeV8yLjAuMS5iYgpAQCAtMCwwICsxLDUgQEAKK2luaGVyaXQgcHlwaSBzZXR1cHRvb2xzCityZXF1aXJlIHB5dGhvbi1wZXJpcGhlcnkuaW5jCisKK1NSQ19VUklbbWQ1c3VtXSA9ICIxZDk1OGYwMjU3NWQ0YTE5NzM0ZWUyZGQ5MjMzNjE1NyIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICI1ZGE0ZDVmNDBmZjg5NzRjZjZjNzI0NTg3YmFhNjc0ZDdlMDU5M2YwN2I2ZjZlZTg5NjEwNGYxMWMxYmUxOGVjIgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXB5cnNpc3RlbnQuaW5jIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXB5cnNpc3RlbnQuaW5jCmluZGV4IGZhZDQ4OGQuLmFlNGYyMWEgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1weXJzaXN0ZW50LmluYworKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcHlyc2lzdGVudC5pbmMKQEAgLTMsOCArMyw4IEBACiBMSUNFTlNFID0gIk1JVCIKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0xJQ0VOQ0UubWl0O21kNT1jYTU3NGYyODkxY2Y1MjhiM2U3YTJlZTU3MDMzN2U3YyIKIAotU1JDX1VSSVttZDVzdW1dID0gIjkwM2M1MThjODgyOWRlNGVlMjU1Y2ZmNjhmZjhkYTQ1IgotU1JDX1VSSVtzaGEyNTZzdW1dID0gImViNjU0NWRiZWIxYWE2OWFiMWZiNDgwOWJmYmY1YTg3MDVlNDRkOTJlZjhmYzdjMjM2MTY4MmE0N2M0NmM3NzgiCitTUkNfVVJJW21kNXN1bV0gPSAiZGE5NDg2ZDAwZWY1YjIxM2Y0MGQ1Y2YzYzViY2E4MmQiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiY2RjN2I1ZTNlZDc3YmVkNjEyNzBhNDdkMzU0MzRhMzA2MTdiOWJlY2RmMjQ3OGFmNzZhZDJjNmFkZTMwNzI4MCIKIAogUkRFUEVORFNfJHtQTn0gKz0gIiBcCiAgICAgJHtQWVRIT05fUE59LXNpeCBcCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcHlyc2lzdGVudF8wLjE1LjUuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tcHlyc2lzdGVudF8wLjE1LjcuYmIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1weXJzaXN0ZW50XzAuMTUuNS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXB5cnNpc3RlbnRfMC4xNS43LmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tc3VwZXJ2aXNvci5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tc3VwZXJ2aXNvci5pbmMKaW5kZXggMTU4Y2Q1Mi4uMWFjMThiYiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXN1cGVydmlzb3IuaW5jCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi1zdXBlcnZpc29yLmluYwpAQCAtNyw4ICs3LDggQEAKIExJQ0VOU0UgPSAiQlNELTQtQ2xhdXNlIgogTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vTElDRU5TRVMudHh0O21kNT01YjRlM2EyMTcyYmJhNGM0N2NkZWQ1ODg1ZTdlNTA3ZSIKIAotU1JDX1VSSVttZDVzdW1dID0gImFjNzBkYWRkMDUxZGNhZjFkMDNjNDY3ZDUxYTNhYWMxIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjU2MDQ0NTdkYTRmYjg5ZDg1MGU3OGMxMjgyMDVmZTQ5MzhjOTI3N2Y4NzMwMTg4NWIzM2M5NGM2MDM2MWU1NzUiCitTUkNfVVJJW21kNXN1bV0gPSAiZWNlYTk0ZWVkYzcwYmE1MTI3ZmRlYjA2NjViY2NhMGQiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiMmRjODZmZTA0NzZlOTQ1ZTYxNDgzZDYxNGNlYjJjZjRmOTNiOTUyODJlYjI0M2JkZjc5MjYyMTk5NDM2MDM4MyIKIAogUFlQSV9QQUNLQUdFID0gInN1cGVydmlzb3IiCiBpbmhlcml0IHB5cGkgc3lzdGVtZApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXRxZG0uaW5jIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXRxZG0uaW5jCmluZGV4IDFlNDEwZjQuLjhhMDUzNGYgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi10cWRtLmluYworKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tdHFkbS5pbmMKQEAgLTcsNyArNyw3IEBACiAKIGluaGVyaXQgcHlwaQogCi1TUkNfVVJJW21kNXN1bV0gPSAiOWEwOTJhNTg3ODA5MDk5NmJiYjBlZDkyYmY1NzJhOGEiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiYzFkNjc3ZjNhODVmYTI5MWIzNGJkZjhmNzcwZjg3NzExOWI5NzU0YjMyNjczNjk5NjUzNTU2Zjg1ZTJjMmYxMyIKK1NSQ19VUklbbWQ1c3VtXSA9ICJhYTNkNWZkMTczYzlmZWE3NDA4Y2FkMTRjMGU3M2Q1ZCIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICI0Nzg5Y2NiYjZmYzEyMmI1YTZhODVkNTEyZTRlNDFmYzVhY2FkNzcyMTY1MzNhNmYyYjhjZTUxZTBmMjY1YzIzIgogCiBCQkNMQVNTRVhURU5EID0gIm5hdGl2ZSBuYXRpdmVzZGsiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tdHFkbV80LjM4LjAuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24tdHFkbV80LjQxLjEuYmIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi10cWRtXzQuMzguMC5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXRxZG1fNC40MS4xLmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2FpdHJlc3MuaW5jIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXdhaXRyZXNzLmluYwppbmRleCBhOGQzMzdmLi4wYzI4OGQ1IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2FpdHJlc3MuaW5jCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi13YWl0cmVzcy5pbmMKQEAgLTYsNSArNiw1IEBACiBMSUNFTlNFID0gIlpQTC0yLjEiCiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9MSUNFTlNFLnR4dDttZDU9NzhjY2IzNjQwZGM4NDFlMWJhZWNiM2UyN2E2OTY2YjIiCiAKLVNSQ19VUklbbWQ1c3VtXSA9ICJlNmI5ZjA0MDZjYjRlNmZlZGNjM2FkZDk2NDExNzg2ZCIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICJmNDExOGNiY2U3NTk4NWZkNjBhZWI0ZjBkNzgxYWJhOGRjN2FlMjhjMThlNTA3NTNlOTEzZDdhN2RlZTc2YjYyIgorU1JDX1VSSVttZDVzdW1dID0gImZkZWVkN2VjMzJiYmJhMDExZTkwODAxMjA4Mzc4Yzg5IgorU1JDX1VSSVtzaGEyNTZzdW1dID0gIjY3YTYwYTM3NmYwZWIzMzVlZDg4OTY3YzQyYjczOTgzYTU4ZDY2YTJhNzJlYjkwMDlhNDI3MjVmNzQ1M2IxNDIiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2FpdHJlc3NfMS40LjEuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2FpdHJlc3NfMS40LjIuYmIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi13YWl0cmVzc18xLjQuMS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXdhaXRyZXNzXzEuNC4yLmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2N3aWR0aC5pbmMgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2N3aWR0aC5pbmMKaW5kZXggMTQyOTQ1MC4uYmJkMGQ1MCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXdjd2lkdGguaW5jCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi13Y3dpZHRoLmluYwpAQCAtMiw3ICsyLDcgQEAKIExJQ0VOU0UgPSAiTUlUIgogTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vTElDRU5TRS50eHQ7bWQ1PTExZmJhNDcyODYyNTg3NDRhNmJjNmU0MzUzMGMzMmExIgogCi1TUkNfVVJJW21kNXN1bV0gPSAiYjNiNmEwYTA4ZjBjOGEzNGQxZGU4Y2Y0NDE1MGE0YWQiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiM2RmMzczNzIyMjZkNmU2M2UxYjFlMWVkYTE1YzU5NGJjYTk4YTIyZDMzYTIzODMyYTkwOTk4ZmFhOTZiYzY1ZSIKK1NSQ19VUklbbWQ1c3VtXSA9ICJkYzY2NzdkMDk5ZTZmNDljMGY2ZmJjMzEwZGUyNjFlOSIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICJmMjhiM2U4YTY0ODNlNWQ0OWU3Zjg5NDlhYzFhNzgzMTRlNzQwMzMzYWUzMDViNGJhNWRlZmQzZTc0ZmIzN2E4IgogCiBCQkNMQVNTRVhURU5EID0gIm5hdGl2ZSBuYXRpdmVzZGsiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2N3aWR0aF8wLjEuNy5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi13Y3dpZHRoXzAuMS44LmJiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24td2N3aWR0aF8wLjEuNy5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXdjd2lkdGhfMC4xLjguYmIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi15YXJsLmluYyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbi15YXJsLmluYwppbmRleCBlYTU1NTQxLi45ODA2NmQ3IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24teWFybC5pbmMKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uLXlhcmwuaW5jCkBAIC0zLDggKzMsOCBAQAogTElDRU5TRSA9ICJBcGFjaGUtMi4wIgogTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vTElDRU5TRTttZDU9YjMzNGZjOTBkNDU5ODNkYjMxOGY1NGZkNWJmNmM5MGIiCiAKLVNSQ19VUklbbWQ1c3VtXSA9ICI5Mjg4OWMzMWZjZTRjOGY4MmI3ZWU5YzJiMmVkOWNkMSIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICIwMjRlY2RjMTJiYzAyYjMyMWJjNjZiNDEzMjdmOTMwZDFjMmM1NDNmYTlhNTYxYjM5ODYxZGE5Mzg4YmE3YWE5IgorU1JDX1VSSVttZDVzdW1dID0gIjA4YmEwZDZlMThmNDYwYjQ0ZDllNTQ1OWYzZDIxN2JhIgorU1JDX1VSSVtzaGEyNTZzdW1dID0gIjU4Y2Q5YzQ2OWVjZWQ1NThjZDgxYWEzZjQ4NGIyOTI0ZTg4OTcwNDllMDY4ODllOGZmMjUxMDQzNWI3ZWY3NGIiCiAKIFBZUElfUEFDS0FHRSA9ICJ5YXJsIgogaW5oZXJpdCBweXBpCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNoZWV0YWhfMy4yLjMuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNoZWV0YWhfMy4yLjQuYmIKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1jaGVldGFoXzMuMi4zLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNoZWV0YWhfMy4yLjQuYmIKaW5kZXggNTJlODU3Ni4uMDU4ODJkMCAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1jaGVldGFoXzMuMi4zLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtY2hlZXRhaF8zLjIuNC5iYgpAQCAtMTAsNiArMTAsNSBAQAogCiBCQkNMQVNTRVhURU5EID0gIm5hdGl2ZSBuYXRpdmVzZGsiCiAKLVNSQ19VUklbbWQ1c3VtXSA9ICI1NjI5NDQ1ZTdmZWY5NjU5ZGEyYjQ5ZTM2YWFjZGJmZiIKLVNSQ19VUklbc2hhMjU2c3VtXSA9ICI3YzQ1MGJjZTA0YTgyZDM0Y2Y2ZDQ4OTkyYzczNmMyMDQ4MjQ2Y2JjMDBmN2I0OTAzYTM5Y2Y5YThlYTM5OTBjIgotCitTUkNfVVJJW21kNXN1bV0gPSAiOGMwYWM2NDMyNjNmZmMzNDU0ZmIzMjEzNDIyODRkMGEiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiY2FhYmI5YzIyOTYxYTM0MTNhYzg1Y2QxZTU1MjVlYzljYTgwZGFlYmE2NTU1ZjRmNjA4MDJiNmMyNTZlMjUyYiIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtY21kMl8wLjkuMjIuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNtZDJfMC45LjIzLmJiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNtZDJfMC45LjIyLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNtZDJfMC45LjIzLmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNvdmVyYWdlXzQuNC4yLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1jb3ZlcmFnZV81LjAuMi5iYgpzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNvdmVyYWdlXzQuNC4yLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWNvdmVyYWdlXzUuMC4yLmJiCmluZGV4IGM5ODNlMGIuLjk0MDcyNzggMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtY292ZXJhZ2VfNC40LjIuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1jb3ZlcmFnZV81LjAuMi5iYgpAQCAtMyw4ICszLDggQEAKIExJQ0VOU0UgPSAiQXBhY2hlLTIuMCIKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0xJQ0VOU0UudHh0O21kNT0yZWU0MTExMmE0NGZlNzAxNGRjZTMzZTI2NDY4YmE5MyIKIAotU1JDX1VSSVttZDVzdW1dID0gIjI5YTlmZTg1Mzc3ZTBmNzMyN2NmNWRiMWUzMzU0ODNmIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjMwOWQ5MWJkN2EzNTA2M2VjN2EwZTRkNzU2NDU0ODhiZmFiM2YwYjY2MzczZTc3MjJmMjNkYTdmNWIwZjM0Y2MiCitTUkNfVVJJW21kNXN1bV0gPSAiODc2YmU1NjJiYzc4ZGVhYzZmYzJhMDZlZTRhNmQ1NTEiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiYjI1MWM3MDkyY2JiNmQ3ODlkNjJkYzljOWU3YzRmYjQ0OGM5MTM4YjUxMjg1YzM2YWViNzI0NjJjYWQzNjAwZSIKIAogaW5oZXJpdCBweXBpIHNldHVwdG9vbHMzCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtZW5naW5laW9fMy4xMS4xLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1lbmdpbmVpb18zLjExLjIuYmIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtZW5naW5laW9fMy4xMS4xLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWVuZ2luZWlvXzMuMTEuMi5iYgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1qYXZhb2JqLXB5M18wLjMuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtamF2YW9iai1weTNfMC40LjAuMS5iYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1qYXZhb2JqLXB5M18wLjMuMC5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1qYXZhb2JqLXB5M18wLjQuMC4xLmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWtjb25maWdsaWJfMTAuNDIuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2NvbmZpZ2xpYl8xMC40Mi4wLmJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIwMzlhLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2NvbmZpZ2xpYl8xMC40Mi4wLmJiCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1yZXF1aXJlIHB5dGhvbi1rY29uZmlnbGliLSR7UFZ9LmluYwotaW5oZXJpdCBweXBpIHNldHVwdG9vbHMzCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWtjb25maWdsaWJfMTMuNy4wLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1rY29uZmlnbGliXzEzLjcuMC5iYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA5NDRmCi0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1rY29uZmlnbGliXzEzLjcuMC5iYgpAQCAtMCwwICsxLDIgQEAKK3JlcXVpcmUgcHl0aG9uLWtjb25maWdsaWIuaW5jCitpbmhlcml0IHB5cGkgc2V0dXB0b29sczMKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2VyYXMtYXBwbGljYXRpb25zXzEuMC42LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1rZXJhcy1hcHBsaWNhdGlvbnNfMS4wLjguYmIKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1rZXJhcy1hcHBsaWNhdGlvbnNfMS4wLjYuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2VyYXMtYXBwbGljYXRpb25zXzEuMC44LmJiCmluZGV4IGQzOGI5OTIuLjQyOTNhNjMgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2VyYXMtYXBwbGljYXRpb25zXzEuMC42LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2VyYXMtYXBwbGljYXRpb25zXzEuMC44LmJiCkBAIC01LDcgKzUsNyBAQAogTElDX0ZJTEVTX0NIS1NVTSA9ICJmaWxlOi8vTElDRU5TRTttZDU9MzY2ZTJmZDNjOTcxNGYxNjJkMzY2M2I2Zjk3Y2ZlNDEiCiAKIFNSQ19VUkkgPSAiZ2l0Oi8vZ2l0aHViLmNvbS9rZXJhcy10ZWFtL2tlcmFzLWFwcGxpY2F0aW9ucy5naXQiCi1TUkNSRVYgPz0gIjYxZGUyMTgxNTcyOGFhNjYzNzdlYmIyYTdiNGMyZjU0OTJhMzRkZDIiCitTUkNSRVYgPz0gIjNiMTgwY2IxMGVkYTY4M2RkYTc5MTNlY2VlMmU2NDg3Mjg4ZDI5MmQiCiAKIAogaW5oZXJpdCBzZXR1cHRvb2xzMwpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1rZXJhcy1wcmVwcm9jZXNzaW5nXzEuMC41LmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1rZXJhcy1wcmVwcm9jZXNzaW5nXzEuMS4wLmJiCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2VyYXMtcHJlcHJvY2Vzc2luZ18xLjAuNS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1rZXJhcy1wcmVwcm9jZXNzaW5nXzEuMS4wLmJiCmluZGV4IDU4YjhjNjIuLmVhY2IzNDAgMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMta2VyYXMtcHJlcHJvY2Vzc2luZ18xLjAuNS5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLWtlcmFzLXByZXByb2Nlc3NpbmdfMS4xLjAuYmIKQEAgLTUsNyArNSw3IEBACiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9MSUNFTlNFO21kNT0xNzQ0YjMyMDUwMGNjMmUzMTEyOTY0ZDAwY2NlN2FhNCIKIAogU1JDX1VSSSA9ICJnaXQ6Ly9naXRodWIuY29tL2tlcmFzLXRlYW0va2VyYXMtcHJlcHJvY2Vzc2luZy5naXQiCi1TUkNSRVYgPz0gIjM2MmZlOWY4ZGFmNTU2MTUxMzI4ZWI1ZDAyYmQ1YWU2MzhjNjUzYjgiCitTUkNSRVYgPz0gImZmOTA2OTZjMDQxNmI3NDM0NGI5MWRmMDk3YjIyOGU2OTQzMzliODgiCiAKIGluaGVyaXQgc2V0dXB0b29sczMKIApkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tb3JlLWl0ZXJ0b29sc183LjIuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtbW9yZS1pdGVydG9vbHNfNy4yLjAuYmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDQ1Y2UuLjAwMDAwMDAKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tb3JlLWl0ZXJ0b29sc183LjIuMC5iYgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW5oZXJpdCBweXBpIHNldHVwdG9vbHMzCi1yZXF1aXJlIHB5dGhvbi1tb3JlLWl0ZXJ0b29scy5pbmMKLQotU1JDX1VSSVttZDVzdW1dID0gImY2NDdiZmQyNzI0M2E3YmViZTUzYjVkZGI2YTNiMWM0IgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjQwOWNkNDhkNGRiNzA1MmFmNDk1YjA5ZGVjNzIxMDExNjM0YWYzNzUzYWUxZWY5MmQyYjMyZjczYTc0NWY4MzIiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLW1vcmUtaXRlcnRvb2xzXzguMS4wLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tb3JlLWl0ZXJ0b29sc184LjEuMC5iYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTA5YzEwCi0tLSAvZGV2L251bGwKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tb3JlLWl0ZXJ0b29sc184LjEuMC5iYgpAQCAtMCwwICsxLDUgQEAKK2luaGVyaXQgcHlwaSBzZXR1cHRvb2xzMworcmVxdWlyZSBweXRob24tbW9yZS1pdGVydG9vbHMuaW5jCisKK1NSQ19VUklbbWQ1c3VtXSA9ICJhNTUyYjA2Y2VjMWJkZjAxZDYwZjk1MmRiY2M5YTAyMSIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICJjNDY4YWRlYzU3ODM4MGI2MjgxYTExNGNiOGE1ZGIzNGViMTExNjI3N2RhOTJkN2M0NmY5MDRmMGI1MmQzMjg4IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tdWx0aWRpY3RfNC41LjIuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLW11bHRpZGljdF80LjcuNC5iYgpzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLW11bHRpZGljdF80LjUuMi5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tdWx0aWRpY3RfNC43LjQuYmIKaW5kZXggNTcxNjdmMi4uZjE2YTdiZSAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tdWx0aWRpY3RfNC41LjIuYmIKKysrIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1tdWx0aWRpY3RfNC43LjQuYmIKQEAgLTUsNSArNSw1IEBACiAKIGluaGVyaXQgcHlwaSBzZXR1cHRvb2xzMwogCi1TUkNfVVJJW21kNXN1bV0gPSAiNWU5ZDhmN2UxYWRhOWEyMjkzMmFlZDZhNzJmODhlNDMiCi1TUkNfVVJJW3NoYTI1NnN1bV0gPSAiMDI0YjgxMjk2OTVhOTUyZWJkOTMzNzNlNDViNWQzNDFkYmI4N2MxN2NlNDk2MzdiMzQwMDAwOTNmMjQzZGQ0ZiIKK1NSQ19VUklbbWQ1c3VtXSA9ICIyMmI0NmY3NTljZjJjYzNjYTFkMmM5ZjgyY2M5YmI3OSIKK1NSQ19VUklbc2hhMjU2c3VtXSA9ICJkN2Q0Mjg0ODhjNjdiMDliMjY5Mjg5NTBhMzk1ZTQxY2M3MmJiOWMzZDVhYmZlOWYwNTIxOTQwZWU0Zjc5NmQ0IgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1vcmRlcmVkLXNldF8zLjAuMS5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtb3JkZXJlZC1zZXRfMy4xLjEuYmIKc2ltaWxhcml0eSBpbmRleCA2OCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1vcmRlcmVkLXNldF8zLjAuMS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1vcmRlcmVkLXNldF8zLjEuMS5iYgppbmRleCA2NjJkM2VlLi4wMTNhMmU3IDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLW9yZGVyZWQtc2V0XzMuMC4xLmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtb3JkZXJlZC1zZXRfMy4xLjEuYmIKQEAgLTMsOCArMyw4IEBACiBMSUNFTlNFID0gIk1JVCIKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL01JVC1MSUNFTlNFO21kNT0yYjM2YmUwZDk5ODU0YWEyYWUyOTJhODAwYTdjMWQ0ZSIKIAotU1JDX1VSSVttZDVzdW1dID0gImE4MDU5YzdiOTljZGUwZjhkZGEwMWRkZWU2YjQzYzJjIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjNkNmZkN2JmZmJiMTVmNjEzYTllOGE2MjgxYmY5N2MyZDY3ZjdiYjg2NzdkZWNhODI0OWRmMmZiZGQ5Y2NlN2IiCitTUkNfVVJJW21kNXN1bV0gPSAiNmUxMjMxMmM4ZGM0YzkwZmU4NDBlODZlOGEzNTI2NDQiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiYTdiZmE4NTg3NDhjNzNiMDk2ZTQzZGIxNGViMjNlMmJjNzE0YTUwM2Y5OTBjODlmYWM4ZmFiOWIwZWU3OTcyNCIKIAogaW5oZXJpdCBweXBpIHNldHVwdG9vbHMzCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcGFja2FnaW5nXzE5LjIuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXBhY2thZ2luZ18yMC4wLmJiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXBhY2thZ2luZ18xOS4yLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXBhY2thZ2luZ18yMC4wLmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXBlcmlwaGVyeV8yLjAuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcGVyaXBoZXJ5XzIuMC4wLmJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM4YmVkLi4wMDAwMDAwCi0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcGVyaXBoZXJ5XzIuMC4wLmJiCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1pbmhlcml0IHB5cGkgc2V0dXB0b29sczMKLXJlcXVpcmUgcHl0aG9uLXBlcmlwaGVyeS5pbmMKLQotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjJkZjA1NTI4YTc2NjhkYjRmYjNmYWFmZjUxNmIzNGVkOTllOTAwOWVkOTYxMGE0ZWZlM2VhNmMwZWE4YTNhYWIiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXBlcmlwaGVyeV8yLjAuMS5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcGVyaXBoZXJ5XzIuMC4xLmJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTQ0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXBlcmlwaGVyeV8yLjAuMS5iYgpAQCAtMCwwICsxLDUgQEAKK2luaGVyaXQgcHlwaSBzZXR1cHRvb2xzMworcmVxdWlyZSBweXRob24tcGVyaXBoZXJ5LmluYworCitTUkNfVVJJW21kNXN1bV0gPSAiMWQ5NThmMDI1NzVkNGExOTczNGVlMmRkOTIzMzYxNTciCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiNWRhNGQ1ZjQwZmY4OTc0Y2Y2YzcyNDU4N2JhYTY3NGQ3ZTA1OTNmMDdiNmY2ZWU4OTYxMDRmMTFjMWJlMThlYyIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcHVsc2VjdGxfMTguMTIuNS5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcHVsc2VjdGxfMjAuMS4yLmJiCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcHVsc2VjdGxfMTguMTIuNS5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1wdWxzZWN0bF8yMC4xLjIuYmIKaW5kZXggOTg4MmVhNi4uN2FjM2FhZiAxMDA2NDQKLS0tIGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1wdWxzZWN0bF8xOC4xMi41LmJiCisrKyBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcHVsc2VjdGxfMjAuMS4yLmJiCkBAIC0zLDggKzMsOCBAQAogTElDRU5TRSA9ICJNSVQiCiBMSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly9DT1BZSU5HO21kNT1mMWQxMDA0ODQ2OWZmOTAxMjMyNjNlYjVlMjE0MDYxZCIKIAotU1JDX1VSSVttZDVzdW1dID0gIjhlNzllZjAwMjg1NmMxODU4MDU4Y2EwYjA4YmYxYTAxIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjQxZGI0ZGQxOWU3Y2QyOGUyNjA5YmFmMmI1NTFmMzQ5OTFmMTg5MDAyNGJlMTE5YjYwNzVhMjg2YWJmYjY1ZDMiCitTUkNfVVJJW21kNXN1bV0gPSAiOTBkMDIyMDRkNjVmNjg0YWYyZmQ3N2E3N2Q1MGVjMDEiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiNGE5N2E0ZjdmY2Q4ZGJlNTYzODA5ODBlOGM5NTE5ZmY0ZTI2NTUyNjA0Nzc2Y2JjNzU1NWU2YTE0ZmYwMjAyZiIKIAogUkRFUEVORFNfJHtQTn0gKz0gInB1bHNlYXVkaW8iCiAKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtcHlyc2lzdGVudF8wLjE1LjUuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXB5cnNpc3RlbnRfMC4xNS43LmJiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXB5cnNpc3RlbnRfMC4xNS41LmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXB5cnNpc3RlbnRfMC4xNS43LmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXN1cGVydmlzb3JfNC4wLjIuYmIgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXN1cGVydmlzb3JfNC4xLjAuYmIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtc3VwZXJ2aXNvcl80LjAuMi5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy1zdXBlcnZpc29yXzQuMS4wLmJiCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXRxZG1fNC4zOC4wLmJiIGIvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy10cWRtXzQuNDEuMS5iYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy10cWRtXzQuMzguMC5iYgpyZW5hbWUgdG8gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy10cWRtXzQuNDEuMS5iYgpkaWZmIC0tZ2l0IGEvbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy13YWl0cmVzc18xLjQuMS5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2FpdHJlc3NfMS40LjIuYmIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2FpdHJlc3NfMS40LjEuYmIKcmVuYW1lIHRvIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2FpdHJlc3NfMS40LjIuYmIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2N3aWR0aF8wLjEuNy5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2N3aWR0aF8wLjEuOC5iYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy13Y3dpZHRoXzAuMS43LmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXdjd2lkdGhfMC4xLjguYmIKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2Vic29ja2V0c184LjAuMi5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2Vic29ja2V0c184LjEuYmIKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy13ZWJzb2NrZXRzXzguMC4yLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXdlYnNvY2tldHNfOC4xLmJiCmluZGV4IDZkYTczY2UuLmIwOWU5NzggMTAwNjQ0Ci0tLSBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2Vic29ja2V0c184LjAuMi5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXdlYnNvY2tldHNfOC4xLmJiCkBAIC02LDggKzYsOCBAQAogCiBpbmhlcml0IHB5cGkgc2V0dXB0b29sczMKIAotU1JDX1VSSVttZDVzdW1dID0gImEzN2YwZTIyYzNhYTVmMWNmMTJhNmEzYWUyMmIzNmNhIgotU1JDX1VSSVtzaGEyNTZzdW1dID0gIjg4MmE3MjY2ZmE4NjdhMmViYjJjMGJhYWEwZjkxNTljYWJmMTMxY2YxOGMxYjQyNzBkNzlhZDQyZjkyMDhkYzUiCitTUkNfVVJJW21kNXN1bV0gPSAiZjEyZDdmMzFmZThkMGIzZTY1YzEyZjg0NWJjZDBhZDgiCitTUkNfVVJJW3NoYTI1NnN1bV0gPSAiNWM2NWQyZGE4YzZiY2UwZmNhMjUyOGY2OWY0NGIyZjk3N2UwNjk1NGM4NTEyYTk1MjIyMmNlYTUwZGFkNDMwZiIKIAogQkJDTEFTU0VYVEVORCA9ICJuYXRpdmUgbmF0aXZlc2RrIgogCmRpZmYgLS1naXQgYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXdoZWVsXzAuMzIuMy5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2hlZWxfMC4zMy42LmJiCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIG1ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMtd2hlZWxfMC4zMi4zLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXdoZWVsXzAuMzMuNi5iYgppbmRleCBlOGMwOGE3Li4wMjViMmVlIDEwMDY0NAotLS0gYS9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXdoZWVsXzAuMzIuMy5iYgorKysgYi9tZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXdoZWVsXzAuMzMuNi5iYgpAQCAtNSw3ICs1LDcgQEAKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0xJQ0VOU0UudHh0O21kNT05ZDY2YjQxYmMyYTA4MGU3MTc0YWNjNWRmZmVjZDc1MiIKIAogU1JDX1VSSSA9ICJnaXQ6Ly9naXRodWIuY29tL3B5cGEvd2hlZWwuZ2l0IgotU1JDUkVWID89ICIxMTU4NGI3OGE1NmI0ZWVkYmE0ZWVkYzU1YzlkYWM4YWEyZGQ3MDcwIgorU1JDUkVWID89ICJiMjI3ZGRkNWJlYWJhNDkyOTQwMTdkMDYxZDUwMWY2ZDQzMzM5M2IwIgogCiAKIGluaGVyaXQgc2V0dXB0b29sczMKZGlmZiAtLWdpdCBhL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMteWFybF8xLjMuMC5iYiBiL21ldGEtb3BlbmVtYmVkZGVkL21ldGEtcHl0aG9uL3JlY2lwZXMtZGV2dG9vbHMvcHl0aG9uL3B5dGhvbjMteWFybF8xLjQuMi5iYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWV0YS1vcGVuZW1iZWRkZWQvbWV0YS1weXRob24vcmVjaXBlcy1kZXZ0b29scy9weXRob24vcHl0aG9uMy15YXJsXzEuMy4wLmJiCnJlbmFtZSB0byBtZXRhLW9wZW5lbWJlZGRlZC9tZXRhLXB5dGhvbi9yZWNpcGVzLWRldnRvb2xzL3B5dGhvbi9weXRob24zLXlhcmxfMS40LjIuYmIK