ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggZDczZDVkNC4uMTMyNWIzMCAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODA5MTMgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODA5Mjcgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDkxMzogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBFdmVuIG1vcmUgY29tbW9uIGNvbnRyb2xzIHN0dWZmLgotCS0gTWFueSBQb3N0U2NyaXB0IGRyaXZlciBpbXByb3ZlbWVudHMuCi0JLSBNb3JlIERPUyBleGVjdXRhYmxlcyBzdXBwb3J0LgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTgwOTI3OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIFN0aWxsIG1vcmUgY29tbW9uIGNvbnRyb2xzIGFuZCBTSEVMTDMyIGZlYXR1cmVzLgorCS0gTUlESSBJL08gc3VwcG9ydC4KKwktIFNldmVyYWwgbmV3IHVuZG9jdW1lbnRlZCBLRVJORUwgZnVuY3Rpb25zLgorCS0gTW9yZSBET1MgZXhlIHN0dWZmIGluY2x1ZGluZyBzb21lIGRlYnVnZ2VyIHN1cHBvcnQuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTcsMTAgKzE4LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDkxMy50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA5MTMudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3N1bnNpdGUvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDkxMy50YXIuZ3oKLSAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDkxMy50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwOTI3LnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDkyNy50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvc3Vuc2l0ZS9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwOTI3LnRhci5negorICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwOTI3LnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmluZGV4IGQxMmY5ZmYuLmJkODQ2MmEgMTAwNjQ0Ci0tLSBhL0FVVEhPUlMKKysrIGIvQVVUSE9SUwpAQCAtMzIsNiArMzIsNyBAQAogQ2Fyc3RlbiBGYWxsZXNlbiwKIFBhdWwgRmFsc3RhZCwKIERhdmlkIEZhdXJlLAorV2VzbGV5IEZpbGFyZG8sCiBDbGF1cyBGaXNjaGVyLAogT2xhZiBGbGViYmUsCiBDaGFkIEZyYWxlaWdoLApAQCAtNDksNiArNTAsNyBAQAogSm9jaGVuIEhvZW5pY2tlLAogT25ubyBIb3ZlcnMsCiBKZWZmcmV5IEhzdSwKK1BldGVyIEh1bm5pc2V0dCwKIE1pZ3VlbCBkZSBJY2F6YSwKIEp1a2thIElpdm9uZW4sCiBMZWUgSmFla2lsLApAQCAtOTEsNiArOTMsNyBAQAogRGltaXRyaWUgTy4gUGF1biwKIEppbSBQZXRlcnNvbiwKIFJvYmVydCBQb3VsaW90LAorUGV0dGVyIFJlaW5ob2xkdHNlbiwKIEtlaXRoIFJleW5vbGRzLAogU2xhdmVuIFJlemljLAogSm9obiBSaWNoYXJkc29uLApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDJiMDA4NjUuLjBlZWE3MzMgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSw0MDYgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBTZXAgMjcgMTQ6MjU6MzggMTk5OCAgUGV0dGVyIFJlaW5ob2xkdHNlbiA8cGVyZUB0ZC5vcmcudWl0Lm5vPgorCisJKiBbZmlsZXMvZHJpdmUuY10KKwlNYWtlIHN1cmUgR2V0RHJpdmVUeXBlMzJBKCkgaGFuZGxlcyBwYXJhbSBOVUxMLiAgQWRkZWQgc29tZQorCWRvYyBvbiBmdW5jdGlvbi4KKworU3VuIFNlcCAyNyAxNDowNzoyNiAxOTk4ICBIdXcgRCBNIERhdmllcyA8ZGF2aWVzaEBhYmFjdXMucGh5c2ljcy5veC5hYy51az4KKworCSogW2NvbnRyb2xzL2VkaXQuY10gW3dpbmRvd3Mvd2luLmNdCisJRG9uJ3QgY2FsbCBTZXRXaW5kb3dMb25nKCkgaW4gRURJVF9XTV9OQ1JFQVRFLgorCUZpeCBTZXRXaW5kb3dMb25nKEdXTF9bRVhdU1RZTEUpIHRvIHdvcmsgZm9yIDE2Yml0IHdpbmRvd3MuIFJlbW92ZQorCVVwZGF0ZVdpbmRvdygpIGNhbGwuIAorCitTdW4gU2VwIDI3IDEzOjQxOjIyIDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbc2NoZWR1bGVyLyouY10gW3NlcnZlci9ldmVudC5jXSBbc2VydmVyL211dGV4LmNdCisJICBbc2VydmVyL3NlbWFwaG9yZS5jXQorCUltcGxlbWVudGVkIHNlcnZlci1zaWRlIHN5bmNocm9uaXNhdGlvbiBvYmplY3RzLgorCitTdW4gU2VwIDI3IDAxOjEzOjM1IDE5OTggIEFsZXggUHJpZW0gPGFsZXhwQHNjaS5rdW4ubmw+CisKKwkqIFtkbGxzL2NvbWN0bDMyL3RyZWV2aWV3LmNdIFtpbmNsdWRlL3RyZWV2aWV3LmhdIFtpbmNsdWRlL2NvbWN0bC5oXQorCVRyZWV2aWV3IGltcGxlbWVudGF0aW9uLgorCisJKiBbZGxscy9jb21jdGwzMi90cmFja2Jhci5jXSBbaW5jbHVkZS90cmFja2Jhci5oXSAKKwlUcmFja2JhciBpbXBsZW1lbnRhdGlvbi4KKworU2F0IFNlcCAyNiAyMDo0OToxMyAxOTk4ICBVbHJpY2ggV2VpZ2FuZCA8d2VpZ2FuZEBpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW2lmMTYzMi90aHVuay5jXSBbdG9vbHMvYnVpbGQuY10gW3dpbjMyL2tlcm5lbDMyLmNdCisJQnVnZml4OiBzZXZlcmFsIHByb2JsZW1zIHdpdGggZmxhdCB0aHVua3MgZml4ZWQuCisKKwkqIFttZW1vcnkvc2VsZWN0b3IuY10KKwlCdWdmaXg6IElzQmFkLi4uUHRyMTYgZGlkbid0IHdvcmsgZm9yIGxpbWl0X2luX3BhZ2VzIHNlZ21lbnRzLgorCisJKiBbc2NoZWR1bGVyL3RocmVhZC5jXQorCUJ1Z2ZpeDogQ3JlYXRlVGhyZWFkOiBBbGxvdyBpZCBwYXJhbWV0ZXIgPT0gTlVMTC4KKworCSogW29iamVjdHMvZ2Rpb2JqLmNdCisJQnVnZml4OiBJc0dESU9iamVjdDogUmV0dXJuIGNvcnJlY3Qgb2JqZWN0IHR5cGUgZm9yIHN0b2NrIG9iamVjdHMuCisKKwkqIFttc2Rvcy9kcG1pLmNdCisJQnVnZml4OiBmaXhlZCB0eXBvIGluIElOVF9Eb1JlYWxNb2RlSW50LgorCisJKiBbbXNkb3MvaW50MjEuY10KKwlCdWdmaXg6IGludDIxIFJFQUQgKm11c3QqIHVzZSBXSU4xNl9ocmVhZCwgbm90IF9ocmVhZDE2LgorCisJKiBbaWYxNjMyL2tlcm5lbC5zcGVjXSBbaWYxNjMyL2R1bW15LmNdIFtpZjE2MzIvdGh1bmsuY10KKwkgIFtsb2FkZXIvbmUvbW9kdWxlLmNdIFtzY2hlZHVsZXIvZXZlbnQuY10gW3NjaGVkdWxlci9zeW5jaHJvLmNdCisJICBbc2NoZWR1bGVyL3RocmVhZC5jXSBbd2luMzIva2VybmVsMzIuY10gW3dpbjMyL29yZGluYWxzLmNdCisJQWRkZWQgbmFtZXMvc3R1YnMgZm9yIGFsbCB1bmRvY3VtZW50ZWQgS0VSTkVMIHJvdXRpbmVzIChXaW45NSkuCisJQWRkZWQgdGhlIGZvbGxvd2luZyB1bmRvYy4gMTYtYml0IGVxdWl2YWxlbnRzIHRvIFdpbjMyIHJvdXRpbmVzOgorCUtFUk5FTC40NDEtNDQzLDQ0OS00NTMsNDU2LTQ2Miw0NzEtNDc2LDQ3OS00ODYsNDg4LgorCUFkZGVkIHN0dWJzIGZvciBzb21lIG90aGVyIEtFUk5FTCByb3V0aW5lcy4KKworCSogW21lbW9yeS9oZWFwLmNdIFttZW1vcnkvZ2xvYmFsLmNdIFtpbmNsdWRlL2dsb2JhbC5oXQorCUltcGxlbWVudGVkIExvY2FsMzIuLi4gMzItYml0IGxvY2FsIGhlYXAgcm91dGluZXMgKEtFUk5FTC4yMDgtMjE1LCAyMjkpLgorCisJKiBbbWlzY2VtdS9pbnN0ci5jXSBbbG9hZGVyL21vZHVsZS5jXSBbaW5jbHVkZS9tb2R1bGUuaF0KKwlJbXBsZW1lbnRlZCBfX0dQIGZhdWx0IGhhbmRsaW5nIGFuZCBIYXNHUEhhbmRsZXIgKEtFUk5FTC4zMzgpLgorCisJKiBbbWlzYy9lcnJvci5jXQorCUltcGxlbWVudGVkIExvZ1BhcmFtRXJyb3JSZWdzIChLRVJORUwuMzI3KS4KKworCSogW2xvYWRlci90YXNrLmNdIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlJbXBsZW1lbnRlZCBHZXRDb2RlSW5mbyAoS0VSTkVMLjEwNCkuCisKKwkqIFtsb2FkZXIvdGFzay5jXSBbc2NoZWR1bGVyL3RocmVhZC5jXSBbaW5jbHVkZS90aHJlYWQuaF0KKwlJbXBsZW1lbnRlZCBbR1NdZXRUaHJlYWRRdWV1ZSBhbmQgW0dTXWV0RmFzdFF1ZXVlIChLRVJORUwuNDYzLzQsIDYyNC81KS4KKworCSogW2lmMTYzMi9nZGkuc3BlY10gW29iamVjdHMvZGMuY10gW29iamVjdHMvZGliLmNdCisJICBbb2JqZWN0cy9iaXRtYXAuY10gW2luY2x1ZGUvd2luZG93cy5oXQorCUJ1Z2ZpeDogZml4ZWQgd3JvbmcgcGFyYW1ldGVyIGZvciBDcmVhdGVESUJTZWN0aW9uMTYuCisJQWRkZWQgW0dTXWV0RElCQ29sb3JUYWJsZTE2LCBzdHViIGZvciBHZXRCb3VuZHNSZWN0MTYuCisJUGFydGlhbGx5IGltcGxlbWVudGVkIEJJVE1BUF9HZXRPYmplY3QxNiBmb3IgRElCcy4KKworCSogW2lmMTYzMi9nZGkuc3BlY10gW3JlbGF5MzIvZ2RpMzIuc3BlY10gW29iamVjdHMvcGFsZXR0ZS5jXQorCUFkZGVkIHNvbWUgR0RJIHN0dWJzLgorCisJKiBbaWYxNjMyL01ha2VmaWxlLmluXSBbaWYxNjMyL2Rpc3BsYXkuc3BlY10gW2lmMTYzMi9tb3VzZS5zcGVjXQorCSAgW2lmMTYzMi9rZXlib2FyZC5zcGVjXSBbaWYxNjMyL2J1aWx0aW4uY10gW3dpbmRvd3Mva2V5Ym9hcmQuY10KKwlBZGRlZCBzb21lIHN0dWJzIGZvciBXaW4xNiBkcml2ZXJzOiBLRVlCT0FSRCwgTU9VU0UsIERJU1BMQVkuCisKKwkqIFtpZjE2MzIvd3Byb2NzLnNwZWNdIFttc2Rvcy92eGQuY10KKwlBZGRlZCBzb21lIHN0dWJzIGZvciBWeERzOiBWTU0sIENvbmZpZ01HLCBUaW1lckFQSS4KKworCSogW21zZG9zL2ludDJmLmNdCisJQWRkZWQgc29tZSBzdHVicyBmb3IgcmVhbC1tb2RlIG5ldHdvcmsgZHJpdmVycy4KKworU2F0IFNlcCAyNiAxODoxODoxOCAxOTk4ICBNYXJjdXMgTWVpc3NuZXIgPG1hcmN1c0BqZXQuZnJhbmtlbi5kZT4KKworCSogW2NvbmZpZ3VyZS5pbl0KKwlNZXJnZWQgaW4gc29tZSBtb3JlIG9mIHRoZSBGcmVlQlNEIHBvcnRzL2VtdWxhdG9ycy93aW5lIHBhdGNoZXMuIAorCShNYWludGFpbmVyKHMpIG9mIHRoaXMgcG9ydDogWW91IGNhbiBqdXN0IHN1Ym1pdCB0aGVzZQorCXBhdGNoZXMgdG8gQWxleGFuZHJlIGRpcmVjdGx5LikKKworCSAqIFtsb2FkZXIvcGVfaW1hZ2UuY10KKwlDaGVjayBmaWxlc2l6ZSBvZiBpbWFnZSBhZ2FpbnN0IHNpemUgZGVyaXZlZCBmcm9tIGhlYWRlcgorCXRvIHNwb3QgdHJ1bmNhdGVkIGV4ZWN1dGVhYmxlcyB3aXRob3V0IGNyYXNoaW5nLgorCisJKiBbZmlsZXMvZGlyZWN0b3J5LmNdCisJU2V0IGVudnZhciAiQ09NU1BFQyIuIE9uZSB3aW4zMighISkgcHJvZ3JhbSBjcmFzaGVzIHdpdGhvdXQgaXQuCisKKwkqIFttdWx0aW1lZGlhL21taW8uY10KKwlBZGRlZCBtbWlvU2V0SW5mbzMyLgorCisJKiBbaW5jbHVkZS9maWxlLmhdCisJUmV0dXJuIFNURF9FUlJPUl9IQU5ETEUgZm9yIEFVWCBhbmQgUFJUIGRvcyBoYW5kbGVzLgorCisJKiBbbG9hZGVyL21vZHVsZS5jXQorCUhhbmRsZSBleGVjdXRlYWJsZXMgd2l0aCBzcGFjZXMgaW4gdGhlaXIgbmFtZXMgYSBiaXQgYmV0dGVyIGluCisJQ3JlYXRlUHJvY2Vzcy4KKworCSogW3JlbGF5MzIvbXN2ZnczMi5zcGVjXVtpZjE2MzIvbXN2aWRlby5zcGVjXVttdWx0aW1lZGlhL21zdmlkZW8uY11baW5jbHVkZS92ZncuaF0KKwlTdGFydGVkIG9uIE1TIFZpZGVvIHN1cHBvcnQgKGNhbiBsb2FkIFdpbjMyIElDTXMpLgorCisJKiBbdG9vbHMvdGVzdHJ1bl0KKwlBIGJpdCBzbWFydGVyIHVzZSBvZiBwcy4KKworCSogW21lbW9yeS92aXJ0dWFsLmNdCisJUmVwb3J0IFBBR0VfR1VBUkRlZCBwYWdlcyBhcyBQQUdFX1BST1RFQ1RFRCAoQXV0b0NBRCBMVCBSMTcgZmFpbHMKKwl3aXRob3V0IHRoYXQgY2hlY2sgKHNpbmNlIFdpbjk1IGRvZXNuJ3Qga25vdyBhYm91dCBQQUdFX0dVQVJEKSkuCisKK1NhdCBTZXAgMjYgMTU6MDQ6MDUgMTk5OCAgT3ZlIEthYXZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CisKKwkqIFtpbmNsdWRlL21pc2NlbXUuaF0gW2lmMTYzMi9idWlsdGluLmNdIFtsb2FkZXIvdGFzay5jXQorCSAgW21pc2NlbXUvaW5zdHIuY10gW21zZG9zL2RwbWkuY10gW21zZG9zL2ludDIxLmNdCisJICBbbXNkb3MvaW50ZXJydXB0cy5jXSBbd2luZG93cy91c2VyLmNdCisJSU5UX1tTfEddZXRIYW5kbGVyIHdhcyByZW5hbWVkIHRvIElOVF9bU3xHXWV0UE1IYW5kbGVyLgorCUFkZGVkIGhhbmRsZXJzIHRvIGRlYWwgd2l0aCByZWFsLW1vZGUgaW50ZXJydXB0czsgRE9TCisJcHJvZ3JhbXMgYXJlIG5vdyBhYmxlIHRvIGhvb2sgcmVhbC1tb2RlIGludGVycnVwdHMuCisKKwkqIFtsb2FkZXIvZG9zL21vZHVsZS5jXSBbbXNkb3MvZG9zbWVtLmNdIFttc2Rvcy9pbnQyMS5jXQorCU1vdmVkIHJlYWwtbW9kZSBpbnRlcnJ1cHQgdGFibGUgaW5pdGlhbGl6YXRpb24gdG8KKwltc2Rvcy9kb3NtZW0uYywgYW5kIG1hZGUgbmV3IFY4NiB0YXNrcyBnZXQgYSBmdWxsIGNvcHkKKwlvZiB0aGUgZXhpc3RpbmcgInN5c3RlbSBtZW1vcnkiIGluc3RlYWQgb2YgYWxtb3N0IGVtcHR5CisJc3BhY2UuIE1pc2MgZml4ZXMuCisKKwkqIFtpbmNsdWRlL2Rvc2V4ZS5oXSBbbG9hZGVyL2Rvcy9tb2R1bGUuY10gW21zZG9zL2RwbWkuY10KKwkgIFttc2Rvcy9pbnQyZi5jXQorCUZpcnN0IHNob3QgYXQgbGV0dGluZyBET1MgcHJvZ3JhbXMgc3RhcnQgdXAgRFBNSSAoYnV0IERQTUkKKwlpcyBzdGlsbCBkaXNhYmxlZCBmb3IgRE9TIHByb2dyYW1zLCBmb3IgcGt1bnppcCdzIHNha2UpLgorCisJKiBbaW5jbHVkZS9kZWJ1Z2dlci5oXSBbZGVidWdnZXIvYnJlYWsuY10gW2RlYnVnZ2VyL2RiZy55XQorCSAgW2RlYnVnZ2VyL3JlZ2lzdGVycy5jXSBbZGVidWdnZXIvbWVtb3J5LmNdIFtkZWJ1Z2dlci9pbmZvLmNdCisJICBbbG9hZGVyL2Rvcy9kb3N2bS5jXQorCUZpcnN0IHNob3QgYXQgbWFraW5nIFdpbmUncyBkZWJ1Z2dlciB3b3JrIGZvciBET1MgcHJvZ3JhbXMuCisJVGhlIC1kZWJ1ZyBmbGFnIHdvcmtzLCBhcyBkbyAibmV4dGkiIGFuZCAic3RlcGkiLgorCitTYXQgU2VwIDI2IDEzOjEzOjEzIDE5OTggIEp1ZXJnZW4gU2NobWllZCA8anVlcmdlbi5zY2htaWVkQG1ldHJvbmV0LmRlPgorCisJKiBbZGxscy9zaGVsbDMyL2RhdGFvYmplY3QuY10KKwlOZXcgY2xhc3NlcyBJRW51bUZPUk1BVEVUQyBpbXBsZW1lbnRlZCwgSURhdGFPYmplY3Qgc3R1YnMuCisJCisJKiBbZGxscy9zaGVsbDMyLyouKl1bcmVsYXkzMi9zaGVsbDMyLnNwZWNdCisJQnVnZml4ZXMuCisJTmV3OiBJQ01fSW5zZXJ0SXRlbSgpLCBJTENyZWF0ZUZyb21QYXRoKCkuCisJSW1wbGVtZW50ZWQ6IElMQ2xvbmVGaXJzdCgpLgorCVN0dWJzOiBJTElzRXF1YWwoKSwgSUxGaW5kQ2hpbGQoKSwgU0hMb2dJTEZyb21GU0lMKCksCisJICBQYXRoTWF0Y2hTcGVjKCksIFBhdGhJc0V4ZSgpLgorCUNoYW5nZWQ6IElMR2V0U2l6ZSgpLCBfSUxJc0Rlc2t0b3AoKSwgUGF0aENvbWJpbmUoKS4KKworCSogW2luY2x1ZGUvc2hsb2JqLmhdCisJTmV3IFNITEdVSUQncworCU5ldyBzdHJ1Y3R1cmVzOiBEVlRBUkdFVERFVklDRTMyLCBTVEdNRURJVU0zMiwgRk9STUFURVRDMzIsCisJQ0xJUEZPUk1BVDMyLgorCU5ldyBpbnRlcmZhY2VzOiBJRW51bUZPUk1BVEVUQywgSURhdGFPYmplY3QsIElDb21tRGxnQnJvd3NlcgorCUlEb2NraW5nV2luZG93RnJhbWUsIElTZXJ2aWNlUHJvdmlkZXIuCisKKwkqIFtkbGxzL3NoZWxsMzIvZm9sZGVycy5jXQorCVN0dWJzIGZvciBJU2hlbGxMaW5rLgorCisJKiBbbG9hZGVyL3Jlc291cmNlLmNdCisJU21hbGwgZml4ZXMuCisKKwkqIFttaXNjL2NydGRsbC5jXVtyZWxheTMyL2NydGRsbC5zcGVjXQorCU5ldyBfX2RsbG9uZXhpdCgpLgorCisJKiBbd2luZG93cy9tZXNzYWdlLmNdCisJU2VuZE5vdGlmeU1lc3NhZ2VBLCBTZW5kTWVzc2FnZUNhbGxCYWNrMzJBIGhhbGYgaW1wbGVtZW50ZWQuCisKKwkqIFtjb250cm9scy9lZGl0LmNdCisJRURJVF9XTV9TZXRUZXh0IHNldCBFRl9VUERBVEUgZmxhZyBub3QgZm9yIEVTX01VTFRJTElORS4KKworCSogW2ZpbGVzL2ZpbGUuY10KKwlIYW5kbGluZyBvZiBmaWxlcG9zaXRpb24gZml4ZWQuCisKK0ZyaSBTZXAgMjUgMTg6MTM6MzAgMTk5OCAgUGF0cmlrIFN0cmlkdmFsbCA8cHNAbGVpc3NuZXIuc2U+CisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0gW2luY2x1ZGUvd2ludHlwZXMuaF0KKwkgIFtvbGUvb2xlMm5scy5oXSBbcmVsYXkzMi9rZXJuZWwzMi5zcGVjXQorCUltcGxlbWVudGVkIEVudW1EYXRlRm9ybWF0cyBhbmQgRW51bVRpbWVGb3JtYXRzLgorCU9ubHkgYWRkcyBVUyBFbmdsaXNoIHN1cHBvcnQuCisKKwkqIFtNYWtlZmlsZS5pbl0gW2NvbmZpZ3VyZS5pbl0gCisJICBbZGxscy9NYWtlZmlsZS5pbl0gW2RsbHMvcHNhcGkvTWFrZWZpbGUuaW5dIAorCSAgW2RsbHMvcHNhcGkvcHNhcGlfbWFpbi5jXSAKKwlOZXcgZmlsZXMgdG8gaW1wbGVtZW50IHN0dWJzIGZvciBQU0FQSS5ETEwgKE5UIG9ubHkpLgorCisJKiBbcmVsYXkzMi9NYWtlZmlsZS5pbl0gW3JlbGF5MzIvYnVpbHRpbjMyLmNdIAorCSAgW3JlbGF5MzIvcHNhcGkuc3BlY10KKwlOZXcgc3BlYyBmaWxlIGZvciBQU0FQSS5ETEwgKE5UIG9ubHkpLgorCisJKiBbc2NoZWR1bGVyL2hhbmRsZS5jXQorCUhBTkRMRV9HZXRPYmpQdHIgc2hvdWxkIG9ubHkgaW50ZXJwcmV0IHRoZSBwc2V1ZG8gaGFuZGxlcyBhcyB0aGUKKwljdXJyZW50IHRocmVhZCBvciB0aGUgY3VycmVudCBwcm9jZXNzIGlmIGEgdGhyZWFkIG9yIGEgcHJvY2VzcyBpcworCXJlcXVlc3RlZC4KKworCSogW2luY2x1ZGUvd2ludmVyc2lvbi5oXSBbbWlzYy92ZXJzaW9uLmNdCisJQWRkcyB0aGUgZ2xvYmFsIGZ1bmN0aW9uIFZFUlNJT05fR2V0VmVyc2lvbigpIHNvIGZ1bmN0aW9ucyBjYW4KKwloYXZlIGRpZmZlcmVudCBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlIC13aW52ZXIgZmxhZy4KKworCSogW2luY2x1ZGUvb2xlZGxnLmhdIFtvbGUvb2xlZGxnLmNdCisJTWlub3IgZml4ZXMuIAorCisJKiBbd2luZG93cy93aW5wcm9jLmNdCisJTWlub3IgY2hhbmdlcy4KKworCSogW2luY2x1ZGUvaW1tLmhdIFttaXNjL2ltbS5jXQorCU5vdyByZXR1cm5zIGNvcnJlY3QgdmFsdWVzIHVuZGVyIGJvdGggV2luZG93cyA5NSBhbmQgTlQgNC4wLgorCitUaHUgU2VwIDI0IDIyOjExOjQ0IDE5OTggIEtyaXN0aWFuIE5pZWxzZW4gIDxrcmlzdGlhbi5uaWVsc2VuQHJpc29lLmRrPgorCisJKiBbY29uZmlndXJlLmluXSBbaW5jbHVkZS9hY2NvbmZpZy5oXSBbaW5jbHVkZS90aHJlYWQuaF0KKwkgIFtzY2hlZHVsZXIvc3lzZGVwcy5jXQorCUF1dG9jb25maWcgdGVzdCBmb3Igbm9uLXJlZW50cmFudCBsaWJjLgorCitXZWQgU2VwIDIzIDE5OjUyOjEyIDE5OTggIE1hdHRoZXcgQmVja2VyIDxtYmVja2VyQGdsYXNzY2l0eS5uZXQ+CisKKwkqIFsqLyouY10KKwlNaXNjZWxsYW5lb3VzIGRvY3VtZW50YXRpb24gdXBkYXRlcyBhbmQgZGVidWdnaW5nIG91dHB1dCAKKwlzdGFuZGFyZGl6YXRpb25zLgorCisJKiBbb2JqZWN0cy9jbGlwcGluZy5jXQorCUFkZGVkIEV4dFNlbGVjdENsaXBSZ24uCisKK1dlZCBTZXAgMjMgMDA6MDM6MjggRURUIDE5OTggIFBldGUgUmF0emxhZmYgPHByYXR6bGFmZkBjZmEuaGFydmFyZC5lZHU+CisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0gW2lmMTYzMi91c2VyLnNwZWNdIFtyZWxheTMyL3VzZXIzMi5zcGVjXQorCSAgW3dpbmRvd3Mva2V5Ym9hcmQuY10KKwlBZGRlZCwgbWFyZ2luYWxseSBpbXBsZW1lbnRlZCwgR2V0S2V5Ym9hcmRMYXlvdXROYW1lKCkuCisJT25seSByZXR1cm5zIFVTIEVuZ2xpc2gga2V5Ym9hcmQgbmFtZS4KKworVHVlIFNlcCAyMiAxNjozMjo0MSAxOTk4ICBNYXJjZWwgQmF1ciA8bWJhdXJAaWlpYy5ldGh6LmNoPgorCisJKiBbcHJvZ3JhbXMvY29udHJvbC8qXQorCU5ldyBXaW5lbGliIGFwcGxpY2F0aW9uLgorCitNb24gU2VwIDIxIDAwOjI5OjE4IDE5OTggIFBldGVyIEh1bm5pc2V0dCA8aHVubmlzZUBub3J0ZWwuY2E+CisKKwkqIFtpbmNsdWRlL2RwbGF5LmhdW211bHRpbWVkaWEvZHBsYXkuY11bb2xlL2NvbXBvYmouY10KKwlBZGRlZCBhbGwgRGlyZWN0UGxheUxvYmJ5IGludGVyZmFjZXMgYW5kIGVuaGFuY2VkIERpcmVjdFBsYXkKKwlhbmQgRGlyZWN0UGxheUxvYmJ5IHN1cHBvcnQuIFN0aWxsIG5vdCBhbGwgdGhhdCBtdWNoLiBVc2VmdWwKKwllbm91Z2ggaWYgeW91IGp1c3QgbmVlZCB0byBzdGFydCBhIHByb2dyYW0sIGRvbid0IHRyeSBhbnkKKwlyZWFsIGRwbGF5L2xvYmJ5IHN0dWZmLgorCisJKiBbZG9jdW1lbnRhdGlvbi9zdGF0dXMvZGlyZWN0cGxheV0KKwlBZGRlZCBhIHZlcnkgbGl0dGxlIGJpdC4KKworCSogW2dyYXBoaWNzL2RkcmF3LmNdCisJLSBDYWxsIHRvIFNldFdpbmRvd0xvbmczMkEgd2Fzbid0IHdvcmtpbmcgYmVjYXVzZSB0aGVyZSB3YXMgbm8KKwkgIG1lbW9yeSBzZXQgYXNpZGUgd2hlbiB0aGUgd2luZG93IGNsYXNzIHdhcyByZWdpc3RlcmVkLgorCS0gRml4ZWQgc29tZSB4bGliIHJlZmVyZW5jZSBjb3VudGluZyBhbmQgY2hhbmdlIHRoZSBiZWhhdmlvdXIKKwkgIG9mIERpcmVjdERyYXdTdXJmYWNlM19TZXRQYWxldHRlIHRvIG1pbWljIG9ic2VydmVkIGJlaGF2aW91cgorCSAgKHBhbGV0dGUgaXMgYXNzb2NpYXRlZCB3aWxsIGFsbCBiYWNrYnVmZmVycykKKwktIEFsc28gc3RvcmVkIGFsbCBwYWxldHRlIGNvbG91ciBmaWVsZHMgYW5kIHNwaXQgYmFjayBvdXIgc2F2ZWQKKwkgIGNvbG91ciBmaWVsZHMgcmF0aGVyIHRoYW4gcXVlcnkgWCBmb3IgdGhlbS4KKwktIEFkZGVkIHBsZW50eSBvZiBBZGRSZWYgYW5kIFJlbGVhc2UgdHJhY2VzLgorCS0gQWRkZWQgWGxpYiBzdXBwb3J0IGZvciB1c2luZyAtZGVza3RvcCBvcHRpb24uCisJLSBGaXhlZCBYbGliIG1lc3NhZ2UgaGFuZGxpbmcuIE1lc3NhZ2VzIHdlcmVuJ3QgYmVpbmcgcGFzc2VkIHRvCisJICB0aGUgYXBwbGljYXRpb24uIEZpeGVzIG1vdXNlIG1vdmVtZW50cyBpbiBzb21lIHhsaWIgRERyYXcgZ2FtZXMuCisJLSBBZGRlZCBhIGZldyBzdHVicy4KKworCSogW3dpbmRvd3Mvd2luLmNdW2luY2x1ZGUvd2luZXJyb3IuaF0KKwlGaXhlZCB1cCBzb21lIGVycm9yIGhhbmRsaW5nIGluIFdJTl9TZXRXaW5kb3dMb25nLiBTZXRMYXN0RXJyb3IKKwl3YXNuJ3QgYmVpbmcgdXNlZC4gQ291bGQgY2F1c2UgcHJvYmxlbXMgd2l0aCAwIHJldHVybiBjb2Rlcy4KKwlBZGRlZCBuZXcgZXJyb3IgaW4gd2luZXJyb3IgKDE0MDApLgorCisJKiBbQVVUSE9SU10gW2luY2x1ZGUvYXV0aG9ycy5oXQorCUFkZGVkIG15c2VsZiBhcyBhIFdpbmUgYXV0aG9yLgorCitTdW4gU2VwIDIwIDIxOjIyOjQ0IDE5OTggIEFsZXhhbmRlciBMYXJzc29uICA8YWxsYUBseXNhdG9yLmxpdS5zZT4KKworCSogW2xvYWRlci9tb2R1bGUuY10KKwlDaGFuZ2VkIEdldE1vZHVsZUZpbGVOYW1lMzJBIHNvIHRoYXQgaXMgcmV0dXJucyB0aGUKKwlsb25nIHZlcnNpb24gb2YgdGhlIGZpbGVuYW1lLiBOb3RlIHRoYXQganVzdCB0aGUgbmFtZQorCWlzIGxvbmcsIG5vdCB0aGUgZGlyZWN0b3JpZXMuCisKK1NhdCBTZXAgMTkgMjA6MDU6MzAgMTk5OCBQZXIgxW5nc3Ry9m0gPHBhbmdAbWluZC5udT4gCisKKwkqIFtjb250cm9scy9tZW51LmNdCisJTWFkZSBhIGNvdXBsZSBvZiBmaXhlcyB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBhbHRlcgorCXRoZWlyIG1lbnVzIGF0IHJ1bnRpbWUuCisKKwkqIFt3aW5kb3dzL2RlZmRsZy5jXQorCVJlbW92ZWQgdGhlIGNhc3Qgb2YgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGRpYWxvZyBwcm9jZWR1cmVzIHRvIGEgMTYtYml0CisJYm9vbC4gVGhlIHJldHVybiB2YWx1ZSBuZWVkcyB0byByZXRhaW4gYWxsIGl0cyAzMiBiaXRzLCBzaW5jZSBpdCBpcyBub3QgCisJYWx3YXlzIGEgYm9vbCwgc3VjaCBhcyB3aGVuIHJlc3BvbmRpbmcgdG8gdGhlIFdNX05DSElUVEVTVCBtZXNzYWdlLgorCitGcmkgU2VwIDE4IDExOjMwOjM4IDE5OTggIFNlcmdleSBUdXJjaGFub3YgPHR1cmNoYW5vdkB1c2EubmV0PgorCisJKiBbbG9hZGVyL3Jlc291cmNlLmNdCisJRml4ZWQgdmVyeSBmdW5ueSBidWcgKHRob3VnaCBncmF2ZWx5IGFmZmVjdGluZyBmdXJ0aGVyIGV4Y2VjdXRpb24pCisJd2l0aCBGaW5kUmVzb3VyY2VbRXhdMzIgZnVuY3Rpb25zLgorCisJKiBbaW5jbHVkZS9tdWx0aW1vbi5oXSBbd2luZG93cy9tdWx0aW1vbi5jXSBbcmVsYXkzMi91c2VyMzIuc3BlY10KKwkgIFtpbmNsdWRlL3dpbmRvd3MuaF0gW3dpbmRvd3Mvc3lzbWV0cmljcy5jXQorCURlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIE11bHRpbW9uaXRvciBBUEkuCisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0gW3dpbmRvd3Mvd2lucG9zLmNdCisJRml4ZWQgaW5jb3JyZWN0IGRlY2xhcmF0aW9uIChhbmQgYmVoYXZpb3VyKSBvZiBHZXRXaW5kb3dSZWN0MzIuCisKK1dlZCBTZXAgMTYgMTA6MjE6MTUgMTk5OCAgR2VyYXJkIFBhdGVsIDxHLlBhdGVsQFdhbmFkb28uZnI+CisKKwkqIFtjb250cm9scy9lZGl0LmNdCisJRml4ZWQgRURJVF9FTV9HZXRMaW5lIHRvIHVzZSBjb3JyZWN0bHkgbGVuZ3RoIG9mIGxpbmVzLgorCitUdWUgU2VwIDE1IDIwOjQwOjE2IDE5OTggIEVyaWMgS29obCA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisKKwkqIFttaXNjL3R3ZWFrLmNdW2luY2x1ZGUvdHdlYWsuaF1bY29udHJvbHMvbWVudS5jXQorCVJlcGxhY2VkIHRoZSB0d2VhayBncmFwaGljIHJvdXRpbmVzIGJ5IGNhbGxzIHRvIERyYXdFZGdlMzIoKS4KKworCSogW21pc2MvdHdlYWsuY11baW5jbHVkZS90d2Vhay5oXVtkb2N1bWVudGF0aW9uL3dpbjk1bG9va10KKwkgIFt3aW5lLmluaV1bKi8qXQorCUNoYW5nZWQgImxvb2sgYW5kIGZlZWwiIHNlbGVjdGlvbi4gQWxsb3dzIFdpbjMuMSwgV2luOTUgYW5kCisJV2luOTggKG5vIEdVSSBjb2RlIGltcGxlbWVudGVkKSBsb29rIGFuZCBmZWVsLgorCisJKiBbZGxscy9jb21jdGwzMi9oZWFkZXIuY11baW5jbHVkZS9oZWFkZXIuaF1baW5jbHVkZS9jb21tY3RybC5oXQorCVN0YXJ0ZWQgY2FsbGJhY2sgaXRlbSBzdXBwb3J0IGFuZCBkaWQgc29tZSBtaW5vciBpbXByb3ZlbWVudHMuCisKKwkqIFtkbGxzL2NvbWN0bDMyL2ltYWdlbGlzdC5jXQorCUZpeGVkIGJ1ZyBpbiB0cmFuc3BhcmVudCBpbWFnZSBkaXNwbGF5LgorCUltYWdlTGlzdF9HZXRJY29uIGlzIHN0aWxsIGJ1Z2d5IDotKAorCisJKiBbZGxscy9jb21jdGwzMi90b29sYmFyLmNdCisJRml4ZWQgYnV0dG9uIGRyYXdpbmcgKHBhcnRpYWwgaGFjaykuCisKKwkqIFtkbGxzL2NvbWN0bDMyL2NvbW1jdHJsLmNdCisJRml4ZWQgTWVudUhlbHAoKS4KKworCSogW2NvbnRyb2xzL2J1dHRvbi5jXQorCUFkZGVkIDNkIGVmZmVjdCBmb3IgZ3JvdXBib3guCisKKwkqIFt3aW5kb3dzL21zZ2JveC5jXQorCUFkZGVkIGZvbnQgc3VwcG9ydCBmb3IgbWVzc2FnZSBib3hlcy4KKworCSogW3dpbmRvd3Mvbm9uY2xpZW50LmNdCisJRml4ZWQgd2luZG93IG1vdmluZyBidWcuCisKKwkqIFtkbGxzL2NvbWN0bDMyLyouY10KKwlWYXJpb3VzIGltcHJvdmVtZW50cy4KKworCSogW2RsbHMvY29tY3RsMzIvbGlzdHZpZXcuY11bZGxscy9jb21jdGwzMi9yZWJhci5jXQorCSAgW2luY2x1ZGUvY29tbWN0cmwuaF0KKwlNb3JlIG1lc3NhZ2VzLgorCisJKiBbd2luZG93cy9zeXNjb2xvci5jXVtpbmNsdWRlL3dpbmRvd3MuaF0KKwlJbnRyb2R1Y2VkIG5ldyBXaW45OCBzeXN0ZW0gY29sb3JzLgorCitUdWUgU2VwIDE1IDE4OjI5OjQ1IDE5OTggV2VzbGV5IEZpbGFyZG8gPGVpZ2h0a25vdHNAYW9sLmNvbT4KKworCSogW2ZpbGVzL3Byb2ZpbGUuY10KKwlBZGRlZCBzdXBwb3J0IGluIFBST0ZJTEVfTG9hZFdpbmVJbmkgZm9yIC1jb25maWcgb3B0aW9uCisKKwkqIFttaXNjL21haW4uY10gW2luY2x1ZGUvb3B0aW9ucy5oXQorCUFkZGVkIC1jb25maWcgb3B0aW9uLgorCitUdWUgU2VwIDE1IDE4OjIyOjI2IDE5OTggIFBldHRlciBSZWluaG9sZHRzZW4gPHBlcmVAdGQub3JnLnVpdC5ubz4KKworCSogW2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW5dCisJTWFrZSBzdXJlIGRpcmVjdG9yeSBleGlzdHMgYmVmb3JlIGluc3RhbGxpbmcgaW50byBpdC4KKworVHVlIFNlcCAxNSAwMTo0NzozMyAxOTk4ICBQYWJsbyBTYXJhdHhhZ2EgPHBhYmxvLnNhcmFjaGFnYUBwaW5nLmJlPgorCisJKiBbb2xlL25scy8qXSBbb2xlL29sZTJubHMuY10gW2luY2x1ZGUvd2lubmxzLmhdCisJRml4ZWQgYSBmZXcgZXJyb3JzIGFuZCBjb21wbGV0ZWQgc29tZSBOTFMgZmlsZXMuCisKK01vbiBTZXAgMTQgMDE6MjM6NDUgMTk5OCAgSm9zZXBoIFByYW5ldmljaCA8a25pZ2h0QGJhbHRpbW9yZS53d2F2ZXMuY29tPgorCisJKiBbaW5jbHVkZS9taXNjZW11LmhdIFttc2Rvcy9pbnRlcnJ1cHRzLmNdCisJUmVtb3ZlZCBhIGNvbXBpbGF0aW9uIHdhcm5pbmcsIGFkZGVkIElOVCAyNSB0byB0aGUgbGlzdCBvZiBpbnRlcnJ1cHRzCisJY2FsbGFibGUgZnJvbSBET1MgYXBwbGljYXRpb25zLCBhZGRlZCBhIGRlYnVnIG1lc3NhZ2Ugd2hlbiB1bnN1cHBvcnRlZAorCWludGVycnVwdHMgYXJlIHVzZWQuCisKK1N1biBTZXAgMTMgMTk6NTU6MjIgMTk5OCAgTGF3c29uIFdoaXRuZXkgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgorCisJKiBbaWYxNjMyL3JlbGF5LmNdCisJQ2FsbFByb2NFeDMyVyBzaG91bGQgbm90IHJldmVyc2UgYXJndW1lbnRzLgorCitTdW4gQXVnIDE3IDIxOjE4OjEyIDE5OTggIEVyaWMgUG91ZWNoICA8ZXJpYy5wb3VlY2hAbGVtZWwuZnI+CisKKwkqIFttdWx0aW1lZGlhL21pZGkuY10gW211bHRpbWVkaWEvaW5pdC5jXSBbbXVsdGltZWRpYS9tbXN5cy5jXSAKKwkgIFtpbmNsdWRlL211bHRpbWVkaWEuaF0gW2luY2x1ZGUvbW1zeXN0ZW0uaF0gCisJICBbbXVsdGltZWRpYS9NYWtlZmlsZS5pbl0gW211bHRpbWVkaWEvbWlkaXBhdGNoLmNdCisJICBbaWYxNjMyL211bHRpbWVkaWEuc3BlY10KKwlNYWRlIE1JREkgaW5wdXQgYW5kIG91dHB1dCBmdW5jdGlvbmFsIG9uIE9TUyBjYXBhYmxlIHN5c3RlbXMuCisKKwkqIFttdWx0aW1lZGlhL3RpbWVyLmNdCisJQ2hhbmdlcyB0byB0cmlnZ2VyIGNhbGxiYWNrcyBhdCB0aGUgYWNjdXJhdGUgcGFjZSBldmVuIHdoZW4KKwlmYWtlIHRpbWVycyBhcmUgdXNlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogRnJpIFNlcCAxMSAxMzoxNDozNSAxOTk4ICBBbmRyZWFzIE1vaHIgPDEwMC4zMDkzNkBnZXJtYW55Lm5ldD4KIAogCSogW2ZpbGVzL2ZpbGUuY10gW2luY2x1ZGUvZmlsZS5oXQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCBkNDQzM2EwLi42Y2MzOGIyIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMjgsNyArMjgsMTAgQEAKIAl0b29scy93cmMgXAogCWNvbnRyb2xzIFwKIAlkbGxzL2NvbWN0bDMyIFwKKwlkbGxzL3BzYXBpIFwKIAlkbGxzL3NoZWxsMzIgXAorCWRsbHMvd2luYXNwaSBcCisJZGxscy93bmFzcGkzMiBcCiAJZmlsZXMgXAogCWdyYXBoaWNzIFwKIAlncmFwaGljcy9tZXRhZmlsZWRydiBcCkBAIC03OSw3ICs4MiwxMCBAQAogTElCT0JKUyA9IFwKIAljb250cm9scy9jb250cm9scy5vIFwKIAlkbGxzL2NvbWN0bDMyL2NvbWN0bDMyLm8gXAorCWRsbHMvcHNhcGkvcHNhcGkubyBcCiAJZGxscy9zaGVsbDMyL3NoZWxsMzIubyBcCisJZGxscy93aW5hc3BpL3dpbmFzcGkubyBcCisJZGxscy93bmFzcGkzMi93bmFzcGkzMi5vIFwKIAlmaWxlcy9maWxlcy5vIFwKIAlncmFwaGljcy9ncmFwaGljcy5vIFwKIAlncmFwaGljcy9tZXRhZmlsZWRydi9tZXRhZmlsZWRydi5vIFwKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBkMzZhNmM3Li5lYWVjZTRkIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0yMDcwLDggKzIwNzAsNTUgQEAKICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CiBmaQogCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2V0cnVuZWxvY2FsZSBpbiAtbHhwZzQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNzU6IGNoZWNraW5nIGZvciBzZXRydW5lbG9jYWxlIGluIC1seHBnNCIgPiY1CithY19saWJfdmFyPWBlY2hvIHhwZzQnXydzZXRydW5lbG9jYWxlIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHhwZzQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHNldHJ1bmVsb2NhbGUoKTsKKworaW50IG1haW4oKSB7CitzZXRydW5lbG9jYWxlKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHhwZzQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1seHBnNCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYRjg2REdBUXVlcnlFeHRlbnNpb24gaW4gLWxYeGY4NmRnYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3NTogY2hlY2tpbmcgZm9yIFhGODZER0FRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2ZGdhIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMTIyOiBjaGVja2luZyBmb3IgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZkZ2EiID4mNQogYWNfbGliX3Zhcj1gZWNobyBYeGY4NmRnYSdfJ1hGODZER0FRdWVyeUV4dGVuc2lvbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMjA3OSw3ICsyMTI2LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sWHhmODZkZ2EgJFhfTElCUyAtbFhleHQgLWxYMTEgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDgzICJjb25maWd1cmUiCisjbGluZSAyMTMwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0yMDkwLDcgKzIxMzcsNyBAQAogWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTIxMTgsMTcgKzIxNjUsMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTIyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6MjE2OTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjcgImNvbmZpZ3VyZSIKKyNsaW5lIDIxNzQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTIxNTYsMTIgKzIyMDMsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIE9wZW4gU291bmQgU3lzdGVtIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE2MDogY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSIiID4mNQorZWNobyAiY29uZmlndXJlOjIyMDc6IGNoZWNraW5nICJmb3IgT3BlbiBTb3VuZCBTeXN0ZW0iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX29wZW5zb3VuZHN5c3RlbScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNjUgImNvbmZpZ3VyZSIKKyNsaW5lIDIyMTIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2lmZGVmIEhBVkVfU1lTX1NPVU5EQ0FSRF9ICkBAIC0yMTgxLDcgKzIyMjgsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE4NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09InllcyIKIGVsc2UKQEAgLTIyMDUsMTIgKzIyNTIsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHVuaW9uIHNlbXVuIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIwOTogY2hlY2tpbmcgImZvciB1bmlvbiBzZW11biIiID4mNQorZWNobyAiY29uZmlndXJlOjIyNTY6IGNoZWNraW5nICJmb3IgdW5pb24gc2VtdW4iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3VuaW9uX3NlbXVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIxNCAiY29uZmlndXJlIgorI2xpbmUgMjI2MSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgpAQCAtMjIxOCw3ICsyMjY1LDcgQEAKIHVuaW9uIHNlbXVuIGZvbwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfdW5pb25fc2VtdW49InllcyIKIGVsc2UKQEAgLTIyNDYsNyArMjI5Myw3IEBACiB0aGVuCiAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNTA6IGNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjk3OiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIyNTQsNyArMjMwMSw3IEBACiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ieWVzIgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjU4ICJjb25maWd1cmUiCisjbGluZSAyMzA1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4odm9pZCkgewpAQCAtMjI2NSw3ICsyMzEyLDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJubyIKIGVsc2UKQEAgLTIyODgsNyArMjMzNSw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5MjogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CitlY2hvICJjb25maWd1cmU6MjMzOTogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19leHRlcm5fcHJlZml4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIzMDAsMTQgKzIzNDcsMTQgQEAKIAkubG9uZyAwCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDQgImNvbmZpZ3VyZSIKKyNsaW5lIDIzNTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZXh0ZXJuIGludCBhY190ZXN0OwogaW50IG1haW4oKSB7CiBpZiAoYWNfdGVzdCkgcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzExOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCkBAIC0yMzMxLDcgKzIzNzgsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM1OiBjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjM4MjogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYXNtX3N0cmluZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMzQxLDE0ICsyMzg4LDE0IEBACiAJLnN0cmluZyAidGVzdCIKIEVPRgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM0NSAiY29uZmlndXJlIgorI2xpbmUgMjM5MiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzOTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfYXNtX3N0cmluZz0ieWVzIgogZWxzZQpAQCAtMjM3NSwyMSArMjQyMiwyMSBAQAogaWYgdGVzdCAiJExJQl9UQVJHRVQiID0gImxpYndpbmUuc28uMS4wIgogdGhlbgogICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzc5OiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNDI2OiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2RsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2NmbGFncz0kQ0ZMQUdTCiAgIENGTEFHUz0iJENGTEFHUyAtZlBJQyAtc2hhcmVkIC1XbCwtc29uYW1lLGNvbmZ0ZXN0LnNvLjEuMCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4NiAiY29uZmlndXJlIgorI2xpbmUgMjQzMyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19kbGw9InllcyIKIGVsc2UKQEAgLTI0MTQsOCArMjQ2MSw0OCBAQAogCiAKIAorZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciByZWVudHJhbnQgbGliYyIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0NjY6IGNoZWNraW5nICJmb3IgcmVlbnRyYW50IGxpYmMiIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X2xpYmNfcmVlbnRyYW50JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgd2luZV9jdl9saWJjX3JlZW50cmFudD15ZXMgCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgoraW50IG15ZXJybm8gPSAwOworY2hhciBidWZbMjU2XTsKK2ludCAqX19lcnJub19sb2NhdGlvbigpe3JldHVybiAmbXllcnJubzt9CittYWluKCl7Y29ubmVjdCgwLGJ1ZiwyNTUpOyBleGl0KCFteWVycm5vKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICB3aW5lX2N2X2xpYmNfcmVlbnRyYW50PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICB3aW5lX2N2X2xpYmNfcmVlbnRyYW50PW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKyAgCitmaQorCitlY2hvICIkYWNfdCIiJHdpbmVfY3ZfbGliY19yZWVudHJhbnQiIDE+JjYKK2lmIHRlc3QgIiR3aW5lX2N2X2xpYmNfcmVlbnRyYW50IiA9ICJubyIgCit0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBOT19SRUVOVFJBTlRfTElCQyAxCitFT0YKKworZmkKKworCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MTk6IGNoZWNraW5nICJmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjUwNjogY2hlY2tpbmcgImZvciByZWVudHJhbnQgWCBsaWJyYXJpZXMiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3hfcmVlbnRyYW50JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTI0NjAsMTIgKzI1NDcsMTIgQEAKIGZvciBhY19mdW5jIGluIGNsb25lIGdldHBhZ2VzaXplIG1lbW1vdmUgc2VuZG1zZyBzaWdhbHRzdGFjayBzdHJlcnJvciBzdHJpY21wIHRjZ2V0YXR0ciB0aW1lZ20gdXNsZWVwIHdhaXQ0IHdhaXRwaWQgdmZzY2FuZgogZG8KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ2NDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNTUxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDY5ICJjb25maWd1cmUiCisjbGluZSAyNTU2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KQEAgLTI0ODgsNyArMjU3NSw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCiBlbHNlCkBAIC0yNTE2LDE3ICsyNjAzLDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUyMDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjI2MDc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTI1ICJjb25maWd1cmUiCisjbGluZSAyNjEyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTMwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjE3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0yNTUzLDEyICsyNjQwLDEyIEBACiBkb25lCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NTc6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQorZWNobyAiY29uZmlndXJlOjI2NDQ6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjIgImNvbmZpZ3VyZSIKKyNsaW5lIDI2NDkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0yNjA5LDEyICsyNjk2LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYxMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQorZWNobyAiY29uZmlndXJlOjI3MDA6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYxOCAiY29uZmlndXJlIgorI2xpbmUgMjcwNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewpAQCAtMjY2Myw3ICsyNzUwLDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc1NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfY29uc3Q9eWVzCiBlbHNlCkBAIC0yNjg0LDEyICsyNzcxLDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY4ODogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAiY29uZmlndXJlOjI3NzU6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2OTMgImNvbmZpZ3VyZSIKKyNsaW5lIDI3ODAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgpAQCAtMjY5Nyw3ICsyNzg0LDcgQEAKICNpbmNsdWRlIDxmbG9hdC5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzAxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzg4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0yNzE0LDcgKzI4MDEsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcxOCAiY29uZmlndXJlIgorI2xpbmUgMjgwNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiBFT0YKQEAgLTI3MzIsNyArMjgxOSw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzM2ICJjb25maWd1cmUiCisjbGluZSAyODIzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KIEVPRgpAQCAtMjc1Myw3ICsyODQwLDcgQEAKICAgOgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzU3ICJjb25maWd1cmUiCisjbGluZSAyODQ0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCkBAIC0yNzY0LDcgKzI4NTEsNyBAQAogZXhpdCAoMCk7IH0KIAogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICA6CiBlbHNlCkBAIC0yNzg4LDEyICsyODc1LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzkyOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyODc5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3OTcgImNvbmZpZ3VyZSIKKyNsaW5lIDI4ODQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2lmIFNURENfSEVBREVSUwpAQCAtMjgyMSw3ICsyOTA4LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODI1OiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1CitlY2hvICJjb25maWd1cmU6MjkxMjogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NpemVvZl9sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjgyOSw3ICsyOTE2LDcgQEAKICAgYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZz0wCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MzMgImNvbmZpZ3VyZSIKKyNsaW5lIDI5MjAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGlvLmg+CiBtYWluKCkKQEAgLTI4NDAsNyArMjkyNyw3IEBACiAgIGV4aXQoMCk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9YGNhdCBjb25mdGVzdHZhbGAKIGVsc2UKQEAgLTI4NjMsNyArMjk1MCw3IEBACiAKIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2VuZG1zZyA9IG5vOyB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNlbmRtc2cgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nIGZvciBzZW5kbXNnIGluIC1sc29ja2V0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyOTU0OiBjaGVja2luZyBmb3Igc2VuZG1zZyBpbiAtbHNvY2tldCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ3NlbmRtc2cgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTI4NzEsNyArMjk1OCw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbHNvY2tldCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODc1ICJjb25maWd1cmUiCisjbGluZSAyOTYyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0yODgyLDcgKzI5NjksNyBAQAogc2VuZG1zZygpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0yOTE1LDEyICszMDAyLDEyIEBACiBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c192ZnNfaCIgPSAieWVzIgogdGhlbgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHN5cy92ZnMuaCBkZWZpbmVzIHN0YXRmcyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MTk6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy92ZnMuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQorZWNobyAiY29uZmlndXJlOjMwMDY6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy92ZnMuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3lzX3Zmc19oYXNfc3RhdGZzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkyNCAiY29uZmlndXJlIgorI2xpbmUgMzAxMSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yOTM3LDcgKzMwMjQsNyBAQAogCQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAyODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIHdpbmVfY3Zfc3lzX3Zmc19oYXNfc3RhdGZzPXllcwogZWxzZQpAQCAtMjk2NCwxMiArMzA1MSwxMiBAQAogaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfc3RhdGZzX2giID0gInllcyIKIHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBzeXMvc3RhdGZzLmggZGVmaW5lcyBzdGF0ZnMiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTY4OiBjaGVja2luZyAid2hldGhlciBzeXMvc3RhdGZzLmggZGVmaW5lcyBzdGF0ZnMiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMDU1OiBjaGVja2luZyAid2hldGhlciBzeXMvc3RhdGZzLmggZGVmaW5lcyBzdGF0ZnMiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NzMgImNvbmZpZ3VyZSIKKyNsaW5lIDMwNjAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMjk4NCw3ICszMDcxLDcgQEAKIAkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTg4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X3N5c19zdGF0ZnNfaGFzX3N0YXRmcz15ZXMKIGVsc2UKQEAgLTMwMTEsMTIgKzMwOTgsMTIgQEAKIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX21vdW50X2giID0gInllcyIKIHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBzeXMvbW91bnQuaCBkZWZpbmVzIHN0YXRmcyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMTU6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9tb3VudC5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CitlY2hvICJjb25maWd1cmU6MzEwMjogY2hlY2tpbmcgIndoZXRoZXIgc3lzL21vdW50LmggZGVmaW5lcyBzdGF0ZnMiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3N5c19tb3VudF9oYXNfc3RhdGZzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAyMCAiY29uZmlndXJlIgorI2xpbmUgMzEwNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0zMDMxLDcgKzMxMTgsNyBAQAogCQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIHdpbmVfY3Zfc3lzX21vdW50X2hhc19zdGF0ZnM9eWVzCiBlbHNlCkBAIC0zMDU3LDcgKzMxNDQsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmZyZWUiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDYxOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JmcmVlIiIgPiY1CitlY2hvICJjb25maWd1cmU6MzE0ODogY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iZnJlZSIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3RhdGZzX2JmcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTMwNjYsNyArMzE1Myw3IEBACiAgICAgICAgIHdpbmVfY3Zfc3RhdGZzX2JmcmVlPW5vCiAgICAgZWxzZQogICAgIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDcwICJjb25maWd1cmUiCisjbGluZSAzMTU3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTMwOTMsNyArMzE4MCw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTg0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zdGF0ZnNfYmZyZWU9eWVzCiBlbHNlCkBAIC0zMTE3LDcgKzMyMDQsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iYXZhaWwiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTIxOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JhdmFpbCIiID4mNQorZWNobyAiY29uZmlndXJlOjMyMDg6IGNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmF2YWlsIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zdGF0ZnNfYmF2YWlsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTMxMjYsNyArMzIxMyw3IEBACiAgICAgICAgIHdpbmVfY3Zfc3RhdGZzX2JhdmFpbD1ubwogICAgIGVsc2UKICAgICAJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEzMCAiY29uZmlndXJlIgorI2xpbmUgMzIxNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0zMTUzLDcgKzMyNDAsNyBAQAogCQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIHdpbmVfY3Zfc3RhdGZzX2JhdmFpbD15ZXMKIGVsc2UKQEAgLTMxNzgsNyArMzI2NSw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciB3b3JraW5nIHNpZ2FsdHN0YWNrIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE4MjogY2hlY2tpbmcgImZvciB3b3JraW5nIHNpZ2FsdHN0YWNrIiIgPiY1CitlY2hvICJjb25maWd1cmU6MzI2OTogY2hlY2tpbmcgImZvciB3b3JraW5nIHNpZ2FsdHN0YWNrIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY193b3JraW5nX3NpZ2FsdHN0YWNrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTMxODcsNyArMzI3NCw3IEBACiAKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE5MSAiY29uZmlndXJlIgorI2xpbmUgMzI3OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTMyMjUsNyArMzMxMiw3IEBACiAJfQogCQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICBhY19jdl9jX3dvcmtpbmdfc2lnYWx0c3RhY2s9InllcyIKIGVsc2UKQEAgLTMyNTIsMTIgKzMzMzksMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIG1zZ19hY2NyaWdodHMgaW4gc3RydWN0IG1zZ2hkciIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNTY6IGNoZWNraW5nICJmb3IgbXNnX2FjY3JpZ2h0cyBpbiBzdHJ1Y3QgbXNnaGRyIiIgPiY1CitlY2hvICJjb25maWd1cmU6MzM0MzogY2hlY2tpbmcgImZvciBtc2dfYWNjcmlnaHRzIGluIHN0cnVjdCBtc2doZHIiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX21zZ19hY2NyaWdodHMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjYxICJjb25maWd1cmUiCisjbGluZSAzMzQ4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CkBAIC0zMjY1LDcgKzMzNTIsNyBAQAogc3RydWN0IG1zZ2hkciBoZHI7IGhkci5tc2dfYWNjcmlnaHRzPTAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjY5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX21zZ19hY2NyaWdodHM9InllcyIKIGVsc2UKQEAgLTMzOTgsNyArMzQ4NSwxMCBAQAogZGVidWdnZXIvTWFrZWZpbGUKIGRsbHMvTWFrZWZpbGUKIGRsbHMvY29tY3RsMzIvTWFrZWZpbGUKK2RsbHMvcHNhcGkvTWFrZWZpbGUKIGRsbHMvc2hlbGwzMi9NYWtlZmlsZQorZGxscy93aW5hc3BpL01ha2VmaWxlCitkbGxzL3duYXNwaTMyL01ha2VmaWxlCiBkb2N1bWVudGF0aW9uL01ha2VmaWxlCiBmaWxlcy9NYWtlZmlsZQogZ3JhcGhpY3MvTWFrZWZpbGUKQEAgLTM0MjIsNiArMzUxMiw3IEBACiBvbGUvTWFrZWZpbGUKIHByb2dyYW1zL01ha2VmaWxlCiBwcm9ncmFtcy9jbG9jay9NYWtlZmlsZQorcHJvZ3JhbXMvY29udHJvbC9NYWtlZmlsZQogcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZQogcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZQogcHJvZ3JhbXMvcmVndGVzdC9NYWtlZmlsZQpAQCAtMzUzNiw3ICszNjI3LDEwIEBACiBkZWJ1Z2dlci9NYWtlZmlsZQogZGxscy9NYWtlZmlsZQogZGxscy9jb21jdGwzMi9NYWtlZmlsZQorZGxscy9wc2FwaS9NYWtlZmlsZQogZGxscy9zaGVsbDMyL01ha2VmaWxlCitkbGxzL3dpbmFzcGkvTWFrZWZpbGUKK2RsbHMvd25hc3BpMzIvTWFrZWZpbGUKIGRvY3VtZW50YXRpb24vTWFrZWZpbGUKIGZpbGVzL01ha2VmaWxlCiBncmFwaGljcy9NYWtlZmlsZQpAQCAtMzU2MCw2ICszNjU0LDcgQEAKIG9sZS9NYWtlZmlsZQogcHJvZ3JhbXMvTWFrZWZpbGUKIHByb2dyYW1zL2Nsb2NrL01ha2VmaWxlCitwcm9ncmFtcy9jb250cm9sL01ha2VmaWxlCiBwcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlCiBwcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlCiBwcm9ncmFtcy9yZWd0ZXN0L01ha2VmaWxlCkBAIC0zNzU0LDYgKzM4NDksMTUgQEAKIHRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQogCiAKK2lmIHRlc3QgIiR3aW5lX2N2X2xpYmNfcmVlbnRyYW50IiA9ICJubyIgCit0aGVuCisgIGVjaG8KKyAgZWNobyAiKioqIFdhcm5pbmc6IG5vbi1yZWVudHJhbnQgbGliYyBkZXRlY3RlZC4gV2luZSB3aWxsIGJlIGJ1aWxkIHdpdGhvdXQiCisgIGVjaG8gIioqKiB0aHJlYWQgc3VwcG9ydC4gQ29uc2lkZXIgdXBncmFkaW5nIGxpYmMgdG8gYSBtb3JlIHJlY2VudCIKKyAgZWNobyAiKioqIHJlZW50cmFudCB2ZXJzaW9uIG9mIGxpYmMuIgorICBlY2hvCitmaQorCiBlY2hvCiBlY2hvICJDb25maWd1cmUgZmluaXNoZWQuICBEbyAnbWFrZSBkZXBlbmQ7IG1ha2UnIHRvIGNvbXBpbGUgV2luZS4iCiBlY2hvCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggZDZhMGM3OC4uMGUwYTE5MCAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtNzksNiArNzksOCBAQAogQUNfQ0hFQ0tfTElCKGkzODYsaTM4Nl9zZXRfbGR0KQogZG5sIENoZWNrIGZvciAtbHcgZm9yIFNvbGFyaXMKIEFDX0NIRUNLX0xJQih3LGlzd2FsbnVtKQorZG5sIENoZWNrIGZvciAtbHhwZzQgZm9yIEZyZWVCU0QKK0FDX0NIRUNLX0xJQih4cGc0LHNldHJ1bmVsb2NhbGUpCiBkbmwgQ2hlY2sgZm9yIFhGcmVlODYgREdBIGV4dGVuc2lvbgogQUNfQ0hFQ0tfTElCKFh4Zjg2ZGdhLFhGODZER0FRdWVyeUV4dGVuc2lvbixBQ19ERUZJTkUoSEFWRV9MSUJYWEY4NkRHQSkgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxYeGY4NmRnYSIsLCRYX0xJQlMgLWxYZXh0IC1sWDExKQogCkBAIC0yMDAsNiArMjAyLDIzIEBACiBmaQogQUNfU1VCU1QoRExMRkxBR1MpCiAKK2RubCAqKioqIENoZWNrIGZvciByZWVudHJhbnQgbGliYyAqKioqCitkbmwKK2RubCBGb3IgY3Jvc3MtY29tcGlsaW5nIHdlIGJsaW5kbHkgYXNzdW1lIHRoYXQgbGliYyBpcyByZWVudHJhbnQuIFRoaXMgaXMKK2RubCBvayBzaW5jZSBub24tcmVlbnRyYW50IGxpYmMgaXMgcXVpdGUgcmFyZSAobW9zdGx5IG9sZCBsaWJjNSB2ZXJzaW9ucykuCisKK0FDX0NBQ0hFX0NIRUNLKCJmb3IgcmVlbnRyYW50IGxpYmMiLCB3aW5lX2N2X2xpYmNfcmVlbnRyYW50LAorICBbQUNfVFJZX1JVTihbaW50IG15ZXJybm8gPSAwOworY2hhciBidWZbMjU2XTsKK2ludCAqX19lcnJub19sb2NhdGlvbigpe3JldHVybiAmbXllcnJubzt9CittYWluKCl7Y29ubmVjdCgwLGJ1ZiwyNTUpOyBleGl0KCFteWVycm5vKTt9XSwKKyAgd2luZV9jdl9saWJjX3JlZW50cmFudD15ZXMsIHdpbmVfY3ZfbGliY19yZWVudHJhbnQ9bm8sCisgIHdpbmVfY3ZfbGliY19yZWVudHJhbnQ9eWVzICkgXSApCitpZiB0ZXN0ICIkd2luZV9jdl9saWJjX3JlZW50cmFudCIgPSAibm8iIAordGhlbgorICBBQ19ERUZJTkUoTk9fUkVFTlRSQU5UX0xJQkMpCitmaQorCiBkbmwgKioqKiBDaGVjayBmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzICoqKioKIGRubAogZG5sIFRoaXMgbWF5IGZhaWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgWCBsaWJyYXJpZXMgYXJlIHJlZW50cmFudCBpZgpAQCAtNDYyLDcgKzQ4MSwxMCBAQAogZGVidWdnZXIvTWFrZWZpbGUKIGRsbHMvTWFrZWZpbGUKIGRsbHMvY29tY3RsMzIvTWFrZWZpbGUKK2RsbHMvcHNhcGkvTWFrZWZpbGUKIGRsbHMvc2hlbGwzMi9NYWtlZmlsZQorZGxscy93aW5hc3BpL01ha2VmaWxlCitkbGxzL3duYXNwaTMyL01ha2VmaWxlCiBkb2N1bWVudGF0aW9uL01ha2VmaWxlCiBmaWxlcy9NYWtlZmlsZQogZ3JhcGhpY3MvTWFrZWZpbGUKQEAgLTQ4Niw2ICs1MDgsNyBAQAogb2xlL01ha2VmaWxlCiBwcm9ncmFtcy9NYWtlZmlsZQogcHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUKK3Byb2dyYW1zL2NvbnRyb2wvTWFrZWZpbGUKIHByb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUKIHByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUKIHByb2dyYW1zL3JlZ3Rlc3QvTWFrZWZpbGUKQEAgLTUwMyw2ICs1MjYsMTUgQEAKIHdpbjMyL01ha2VmaWxlCiB3aW5kb3dzL01ha2VmaWxlIF0pCiAKK2lmIHRlc3QgIiR3aW5lX2N2X2xpYmNfcmVlbnRyYW50IiA9ICJubyIgCit0aGVuCisgIGVjaG8KKyAgZWNobyAiKioqIFdhcm5pbmc6IG5vbi1yZWVudHJhbnQgbGliYyBkZXRlY3RlZC4gV2luZSB3aWxsIGJlIGJ1aWxkIHdpdGhvdXQiCisgIGVjaG8gIioqKiB0aHJlYWQgc3VwcG9ydC4gQ29uc2lkZXIgdXBncmFkaW5nIGxpYmMgdG8gYSBtb3JlIHJlY2VudCIKKyAgZWNobyAiKioqIHJlZW50cmFudCB2ZXJzaW9uIG9mIGxpYmMuIgorICBlY2hvCitmaQorCiBlY2hvCiBlY2hvICJDb25maWd1cmUgZmluaXNoZWQuICBEbyAnbWFrZSBkZXBlbmQ7IG1ha2UnIHRvIGNvbXBpbGUgV2luZS4iCiBlY2hvCmRpZmYgLS1naXQgYS9jb250cm9scy9idXR0b24uYyBiL2NvbnRyb2xzL2J1dHRvbi5jCmluZGV4IDA0NjYzMzkuLjljOGI2MGQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2J1dHRvbi5jCisrKyBiL2NvbnRyb2xzL2J1dHRvbi5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAiYnV0dG9uLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgInR3ZWFrLmgiCiAKIHN0YXRpYyB2b2lkIFBCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDMzIgaERDLCBXT1JEIGFjdGlvbiApOwogc3RhdGljIHZvaWQgUEJfUGFpbnRHcmF5T25HcmF5KEhEQzMyIGhEQyxIRk9OVDMyIGhGb250LFJFQ1QzMiAqcmMsY2hhciAqdGV4dCk7CkBAIC00ODUsNyArNDg2LDcgQEAKIAogc3RhdGljIHZvaWQgR0JfUGFpbnQoIFdORCAqd25kUHRyLCBIREMzMiBoREMsIFdPUkQgYWN0aW9uICkKIHsKLSAgICBSRUNUMzIgcmM7CisgICAgUkVDVDMyIHJjLCByY0ZyYW1lOwogICAgIEJVVFRPTklORk8gKmluZm9QdHIgPSAoQlVUVE9OSU5GTyAqKXduZFB0ci0+d0V4dHJhOwogCiAgICAgaWYgKGFjdGlvbiAhPSBPREFfRFJBV0VOVElSRSkgcmV0dXJuOwpAQCAtNDkzLDggKzQ5NCwyMCBAQAogICAgIEJVVFRPTl9TRU5EX0NUTENPTE9SKCB3bmRQdHIsIGhEQyApOwogCiAgICAgR2V0Q2xpZW50UmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCAmcmMpOwotICAgIEdSQVBIX0RyYXdSZWN0YW5nbGUoIGhEQywgcmMubGVmdCwgcmMudG9wICsgMiwgcmMucmlnaHQgLSAxLCByYy5ib3R0b20gLSAxLAotCQkJIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpICk7CisgICAgaWYgKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spCisJR1JBUEhfRHJhd1JlY3RhbmdsZSggaERDLCByYy5sZWZ0LCByYy50b3AgKyAyLCByYy5yaWdodCAtIDEsIHJjLmJvdHRvbSAtIDEsCisJCQkgICAgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl9XSU5ET1dGUkFNRSkgKTsKKyAgICBlbHNlIHsKKwlURVhUTUVUUklDMzJBIHRtOworCXJjRnJhbWUgPSByYzsKKworCWlmIChpbmZvUHRyLT5oRm9udCkKKwkgICAgU2VsZWN0T2JqZWN0MzIgKGhEQywgaW5mb1B0ci0+aEZvbnQpOworCUdldFRleHRNZXRyaWNzMzJBIChoREMsICZ0bSk7CisJcmNGcmFtZS50b3AgKz0gKHRtLnRtSGVpZ2h0IC8gMikgLSAxOworCURyYXdFZGdlMzIgKGhEQywgJnJjRnJhbWUsIEVER0VfRVRDSEVELCBCRl9SRUNUKTsKKyAgICB9CisKICAgICBpZiAod25kUHRyLT50ZXh0KQogICAgIHsKIAlpZiAoaW5mb1B0ci0+aEZvbnQpIFNlbGVjdE9iamVjdDMyKCBoREMsIGluZm9QdHItPmhGb250ICk7CmRpZmYgLS1naXQgYS9jb250cm9scy9jb21iby5jIGIvY29udHJvbHMvY29tYm8uYwppbmRleCBiN2E0NGRiLi41YWYzNTUyIDEwMDY0NAotLS0gYS9jb250cm9scy9jb21iby5jCisrKyBiL2NvbnRyb2xzL2NvbWJvLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCSBtaTMyLkN0bElEICAgPSBscGhjLT5zZWxmLT53SURtZW51OwogCSBtaTMyLml0ZW1JRCAgPSAtMTsKIAkgbWkzMi5pdGVtV2lkdGggID0gc2l6ZS5jeDsKLQkgbWkzMi5pdGVtSGVpZ2h0ID0gc2l6ZS5jeSAtIDY7CS8qIG93bmVyZHJhd24gY2IgaXMgdGFsbGVyICovCisJIG1pMzIuaXRlbUhlaWdodCA9IHUgLSA2OwkvKiBvd25lcmRyYXduIGNiIGlzIHRhbGxlciAqLwogCSBtaTMyLml0ZW1EYXRhICAgPSAwOwogCSBTZW5kTWVzc2FnZTMyQShscGhjLT5vd25lciwgV01fTUVBU1VSRUlURU0sIAogCQkJCShXUEFSQU0zMiltaTMyLkN0bElELCAoTFBBUkFNKSZtaTMyKTsKQEAgLTE3MiwxMiArMTcyLDEzIEBACiAgICB7CiAgICAgICAgSERDMzIgICAgaERDID0gR2V0REMzMiggbHBoYy0+c2VsZi0+aHduZFNlbGYgKTsKICAgICAgICBIRk9OVDMyICBoUHJldkZvbnQgPSAwOworICAgICAgIFNJWkUzMiAgIGZvbnRfc2l6ZTsKIAogICAgICAgIGlmKCBscGhjLT5oRm9udCApIGhQcmV2Rm9udCA9IFNlbGVjdE9iamVjdDMyKCBoREMsIGxwaGMtPmhGb250ICk7CiAKLSAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMkEoIGhEQywgIjAiLCAxLCAmc2l6ZSk7CisgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MzJBKCBoREMsICIwIiwgMSwgJmZvbnRfc2l6ZSk7CiAKLSAgICAgICBzaXplLmN5ICs9IHNpemUuY3kgLyA0ICsgNCAqIFNZU01FVFJJQ1NfQ1lCT1JERVI7CisgICAgICAgc2l6ZS5jeSA9IGZvbnRfc2l6ZS5jeSArIGZvbnRfc2l6ZS5jeSAvIDQgKyA0ICogU1lTTUVUUklDU19DWUJPUkRFUjsKIAogICAgICAgIGlmKCBoUHJldkZvbnQgKSBTZWxlY3RPYmplY3QzMiggaERDLCBoUHJldkZvbnQgKTsKICAgICAgICBSZWxlYXNlREMzMiggbHBoYy0+c2VsZi0+aHduZFNlbGYsIGhEQyApOwpAQCAtMTA2OSwxMyArMTA3MCwxNCBAQAogCiAgIC8qIENyZWF0ZVdpbmRvdygpIG1heSBzZW5kIGEgYm9ndXMgV01fU0laRSwgaWdub3JlIGl0ICovCiAKLSAgaWYoIHcgPT0gKGxwaGMtPlJlY3RDb21iby5yaWdodCAtIGxwaGMtPlJlY3RDb21iby5sZWZ0KSApCisgIGlmKCB3ID09IChscGhjLT5SZWN0Q29tYm8ucmlnaHQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdCkgKSB7CiAgICAgICBpZiggKENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX1NJTVBMRSkgJiYKIAkgIChoID09IChscGhjLT5SZWN0Q29tYm8uYm90dG9tIC0gbHBoYy0+UmVjdENvbWJvLnRvcCkpICkKICAgICAgICAgICByZXR1cm47CiAgICAgICBlbHNlIGlmKCAobHBoYy0+ZHdTdHlsZSAmIENCU19EUk9QRE9XTikgJiYKIAkgICAgICAgKGggPT0gKGxwaGMtPlJlY3RFZGl0LmJvdHRvbSAtIGxwaGMtPlJlY3RFZGl0LnRvcCkpICApCiAJICAgICAgIHJldHVybjsKKyAgfQogICAKICAgbHBoYy0+UmVjdENvbWJvID0gcmVjdDsKICAgQ0JDYWxjUGxhY2VtZW50KCBscGhjLCAmbHBoYy0+UmVjdEVkaXQsICZscGhjLT5SZWN0QnV0dG9uLCAmcmVjdCApOwpAQCAtMTE0MSwxMSArMTE0MywxMiBAQAogewogICAgSU5UMzIgaW5kZXggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX1NFTEVDVFNUUklORzMyLCAKIAkJCQkgKFdQQVJBTTMyKXN0YXJ0LCAoTFBBUkFNKXBUZXh0ICk7Ci0gICBpZiggaW5kZXggPj0gMCApCisgICBpZiggaW5kZXggPj0gMCApIHsKICAgICAgICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9FRElUICkKIAkgICAgQ0JVcGRhdGVFZGl0KCBscGhjLCBpbmRleCApOwogCWVsc2UKIAkgICAgQ0JQYWludFRleHQoIGxwaGMsIDAgKTsKKyAgIH0KICAgIHJldHVybiAoTFJFU1VMVClpbmRleDsKIH0KIApAQCAtMTQ5MywxNSArMTQ5NiwxNSBAQAogCQkJCSAgICAgICAoTFBTVFIpbFBhcmFtLCAobWVzc2FnZSA9PSBDQl9ESVIzMikpOwogCWNhc2UgQ0JfU0hPV0RST1BET1dOMTY6CiAJY2FzZSBDQl9TSE9XRFJPUERPV04zMjoKLQkJaWYoIENCX0dFVFRZUEUobHBoYykgIT0gQ0JTX1NJTVBMRSApCi0JCSAgICBpZiggd1BhcmFtICkKLQkJICAgIHsKKwkJaWYoIENCX0dFVFRZUEUobHBoYykgIT0gQ0JTX1NJTVBMRSApIHsKKwkJICAgIGlmKCB3UGFyYW0gKSB7CiAJCQlpZiggIShscGhjLT53U3RhdGUgJiBDQkZfRFJPUFBFRCkgKQogCQkJICAgIENCRHJvcERvd24oIGxwaGMgKTsKLQkJICAgIH0KLQkJICAgIGVsc2UgCisJCSAgICB9IGVsc2UgIHsKIAkJCWlmKCBscGhjLT53U3RhdGUgJiBDQkZfRFJPUFBFRCApIAogCQkgICAgICAgICAgICBDQlJvbGxVcCggbHBoYywgRkFMU0UsIFRSVUUgKTsKKwkJICAgIH0KKwkJfQogCQlyZXR1cm4gVFJVRTsKIAogCWNhc2UgQ0JfR0VUQ09VTlQxNjogCmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggOGE5MGUwMS4uZDdiMjgyOSAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtMTc2Niw3ICsxNzY2LDcgQEAKIAlDb3B5UmVjdDMyKCZlcy0+Zm9ybWF0X3JlY3QsIHJjKTsKIAlpZiAoZXMtPnN0eWxlICYgV1NfQk9SREVSKSB7CiAJCUlOVDMyIGJ3ID0gR2V0U3lzdGVtTWV0cmljczMyKFNNX0NYQk9SREVSKSArIDE7Ci0JCWlmKCFUV0VBS19XaW45NUxvb2spCisJCWlmKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spCiAJCQlidyArPSAyOwogCQllcy0+Zm9ybWF0X3JlY3QubGVmdCArPSBidzsKIAkJZXMtPmZvcm1hdF9yZWN0LnRvcCArPSBidzsKQEAgLTIwNjYsOCArMjA2Niw5IEBACiAJCQlyZXR1cm4gMDsKIAl9IGVsc2UKIAkJbGluZSA9IDA7Ci0Jc3JjID0gZXMtPnRleHQgKyBFRElUX0VNX0xpbmVJbmRleCh3bmQsIGVzLCBsaW5lKTsKLQlsZW4gPSBNSU4oKihXT1JEICopbHBjaCwgRURJVF9FTV9MaW5lTGVuZ3RoKHduZCwgZXMsIGxpbmUpKTsKKwlpID0gRURJVF9FTV9MaW5lSW5kZXgod25kLCBlcywgbGluZSk7CisJc3JjID0gZXMtPnRleHQgKyBpOworCWxlbiA9IE1JTigqKFdPUkQgKilscGNoLCBFRElUX0VNX0xpbmVMZW5ndGgod25kLCBlcywgaSkpOwogCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSsrKSB7CiAJCSpscGNoID0gKnNyYzsKIAkJc3JjKys7CkBAIC0zMzY2LDcgKzMzNjcsNyBAQAogCQkJRURJVF9Nb3ZlUGFnZURvd25fTUwod25kLCBlcywgc2hpZnQpOwogCQlicmVhazsKIAljYXNlIFZLX0JBQ0s6Ci0JCWlmICghKGVzLT5zdHlsZSAmIEVTX1JFQURPTkxZKSAmJiAhY29udHJvbCkKKwkJaWYgKCEoZXMtPnN0eWxlICYgRVNfUkVBRE9OTFkpICYmICFjb250cm9sKSB7CiAJCQlpZiAoZXMtPnNlbGVjdGlvbl9zdGFydCAhPSBlcy0+c2VsZWN0aW9uX2VuZCkKIAkJCQlFRElUX1dNX0NsZWFyKHduZCwgZXMpOwogCQkJZWxzZSB7CkBAIC0zMzc1LDkgKzMzNzYsMTAgQEAKIAkJCQlFRElUX01vdmVCYWNrd2FyZCh3bmQsIGVzLCBUUlVFKTsKIAkJCQlFRElUX1dNX0NsZWFyKHduZCwgZXMpOwogCQkJfQorCQl9CiAJCWJyZWFrOwogCWNhc2UgVktfREVMRVRFOgotCQlpZiAoIShlcy0+c3R5bGUgJiBFU19SRUFET05MWSkgJiYgIShzaGlmdCAmJiBjb250cm9sKSkKKwkJaWYgKCEoZXMtPnN0eWxlICYgRVNfUkVBRE9OTFkpICYmICEoc2hpZnQgJiYgY29udHJvbCkpIHsKIAkJCWlmIChlcy0+c2VsZWN0aW9uX3N0YXJ0ICE9IGVzLT5zZWxlY3Rpb25fZW5kKSB7CiAJCQkJaWYgKHNoaWZ0KQogCQkJCQlFRElUX1dNX0N1dCh3bmQsIGVzKTsKQEAgLTM0MDEsNiArMzQwMyw3IEBACiAJCQkJCUVESVRfV01fQ2xlYXIod25kLCBlcyk7CiAJCQkJfQogCQkJfQorCQl9CiAJCWJyZWFrOwogCWNhc2UgVktfSU5TRVJUOgogCQlpZiAoc2hpZnQpIHsKQEAgLTM1MzgsMTMgKzM1NDEsMTkgQEAKIAlpZiAoIShlcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoKmVzKSkpKQogCQlyZXR1cm4gRkFMU0U7CiAJKihFRElUU1RBVEUgKiopd25kLT53RXh0cmEgPSBlczsKLQlpZiAoIShlcy0+aGVhcCA9IEhlYXBDcmVhdGUoMCwgMHgxMDAwMCwgMCkpKQotCQlyZXR1cm4gRkFMU0U7Ci0JZXMtPnN0eWxlID0gY3MtPnN0eWxlOwogCisgICAgICAgLyoKKyAgICAgICAgKiAgICAgIE5vdGU6IHNpbmNlIHRoZSBFRElUU1RBVEUgaGFzIG5vdCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkIHlldCwKKyAgICAgICAgKiAgICAgICAgICAgIHdlIGNhbid0IHVzZSBhbnkgQVBJIGNhbGxzIHRoYXQgbWF5IHNlbmQKKyAgICAgICAgKiAgICAgICAgICAgIFdNX1hYWCBtZXNzYWdlcyBiZWZvcmUgV01fTkNDUkVBVEUgaXMgY29tcGxldGVkLgorICAgICAgICAqLworCisgCWlmICghKGVzLT5oZWFwID0gSGVhcENyZWF0ZSgwLCAweDEwMDAwLCAwKSkpCisgCQlyZXR1cm4gRkFMU0U7CisgCWVzLT5zdHlsZSA9IGNzLT5zdHlsZTsKKyAKIAlpZiAoKGVzLT5zdHlsZSAmIFdTX0JPUkRFUikgJiYgIShlcy0+c3R5bGUgJiBXU19ETEdGUkFNRSkpCi0JCVNldFdpbmRvd0xvbmczMkEod25kLT5od25kU2VsZiwgR1dMX1NUWUxFLCAKLQkJCQllcy0+c3R5bGUgJiB+V1NfQk9SREVSKTsKKwkJd25kLT5kd1N0eWxlICY9IH5XU19CT1JERVI7CiAKIAlpZiAoZXMtPnN0eWxlICYgRVNfTVVMVElMSU5FKSB7CiAJCWVzLT5idWZmZXJfc2l6ZSA9IEJVRlNUQVJUX01VTFRJOwpAQCAtMzc1Niw3ICszNzY1LDcgQEAKIAlpZiAoZm9udCkKIAkJU2VsZWN0T2JqZWN0MzIoZGMsIG9sZF9mb250KTsKIAlSZWxlYXNlREMzMih3bmQtPmh3bmRTZWxmLCBkYyk7Ci0JaWYgKGZvbnQgJiBUV0VBS19XaW45NUxvb2spCisJaWYgKGZvbnQgJiYgKFRXRUFLX1dpbmVMb29rID4gV0lOMzFfTE9PSykpCiAJCUVESVRfRU1fU2V0TWFyZ2lucyh3bmQsIGVzLCBFQ19MRUZUTUFSR0lOIHwgRUNfUklHSFRNQVJHSU4sCiAJCQkJICAgRUNfVVNFRk9OVElORk8sIEVDX1VTRUZPTlRJTkZPKTsKIAlpZiAoZXMtPnN0eWxlICYgRVNfTVVMVElMSU5FKQpAQCAtMzc4Miw2ICszNzkxLDEzIEBACiAgKgogICoJV01fU0VUVEVYVAogICoKKyAqIE5PVEVTCisgKiAgRm9yIG11bHRpbGluZSBjb250cm9scyAoRVNfTVVMVElMSU5FKSwgcmVjZXB0aW9uIG9mIFdNX1NFVFRFWFQgdHJpZ2dlcnM6CisgKiAgVGhlIG1vZGlmaWVkIGZsYWcgaXMgcmVzZXQuIE5vIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQuCisgKgorICogIEZvciBzaW5nbGUtbGluZSBjb250cm9scywgcmVjZXB0aW9uIG9mIFdNX1NFVFRFWFQgdHJpZ2dlcnM6CisgKiAgVGhlIG1vZGlmaWVkIGZsYWcgaXMgcmVzZXQuIEVOX1VQREFURSBhbmQgRU5fQ0hBTkdFIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQuCisgKgogICovCiBzdGF0aWMgdm9pZCBFRElUX1dNX1NldFRleHQoV05EICp3bmQsIEVESVRTVEFURSAqZXMsIExQQ1NUUiB0ZXh0KQogewpAQCAtMzc5NCw4ICszODEwLDEyIEBACiAJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmQsIGVzLCBGQUxTRSwgIiIpOwogCX0KIAllcy0+eF9vZmZzZXQgPSAwOworCWlmIChlcy0+c3R5bGUgJiBFU19NVUxUSUxJTkUpIHsKKwkJZXMtPmZsYWdzICY9IH5FRl9VUERBVEU7CisJfSBlbHNlIHsKKwkJZXMtPmZsYWdzIHw9IEVGX1VQREFURTsKKwl9CiAJZXMtPmZsYWdzICY9IH5FRl9NT0RJRklFRDsKLQllcy0+ZmxhZ3MgJj0gfkVGX1VQREFURTsKIAlFRElUX0VNX1NldFNlbCh3bmQsIGVzLCAwLCAwLCBGQUxTRSk7CiAJRURJVF9FTV9TY3JvbGxDYXJldCh3bmQsIGVzKTsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCA5NTcxMDM0Li5jMWFkOWQyIDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC0yNDg2LDcgKzI0ODYsNyBAQAogCWJyZWFrOwogCiAgICAgY2FzZSBXTV9OQ0NSRUFURToKLQlpZiAoVFdFQUtfV2luOTVMb29rKQorCWlmIChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spCiAJICAgIHduZC0+ZHdFeFN0eWxlIHw9IFdTX0VYX0NMSUVOVEVER0U7CiAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCA4OTQwOTY0Li4xY2JiMWM0IDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0zNSwxNSArMzUsNiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAKIAotVUlOVDMyICBNRU5VX0Jhckl0ZW1Ub3BOdWRnZTsKLVVJTlQzMiAgTUVOVV9CYXJJdGVtTGVmdE51ZGdlOwotVUlOVDMyICBNRU5VX0l0ZW1Ub3BOdWRnZTsKLVVJTlQzMiAgTUVOVV9JdGVtTGVmdE51ZGdlOwotVUlOVDMyICBNRU5VX0hpZ2hsaWdodFRvcE51ZGdlOwotVUlOVDMyICBNRU5VX0hpZ2hsaWdodExlZnROdWRnZTsKLVVJTlQzMiAgTUVOVV9IaWdobGlnaHRCb3R0b21OdWRnZTsKLVVJTlQzMiAgTUVOVV9IaWdobGlnaHRSaWdodE51ZGdlOwotCiAvKiBpbnRlcm5hbCBwb3B1cCBtZW51IHdpbmRvdyBtZXNzYWdlcyAqLwogCiAjZGVmaW5lIE1NX1NFVE1FTlVIQU5ETEUJKFdNX1VTRVIgKyAwKQpAQCAtNjUzLDEwICs2NDQsMTAgQEAKICAgICB7CiAgICAgICAgIGR3U2l6ZSA9IEdldFRleHRFeHRlbnQoIGhkYywgbHBpdGVtLT50ZXh0LCBzdHJsZW4obHBpdGVtLT50ZXh0KSApOwogICAgICAgICBscGl0ZW0tPnJlY3QucmlnaHQgICs9IExPV09SRChkd1NpemUpOwotCWlmIChUV0VBS19XaW45NUxvb2spCi0gICAgICAgICAgICBscGl0ZW0tPnJlY3QuYm90dG9tICs9IE1BWCAoSElXT1JEKGR3U2l6ZSksIHN5c01ldHJpY3NbU01fQ1lNRU5VXS0gMSk7Ci0gICAgICAgIGVsc2UKKwlpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykKICAgICAgICAgICAgIGxwaXRlbS0+cmVjdC5ib3R0b20gKz0gTUFYKCBISVdPUkQoZHdTaXplKSwgU1lTTUVUUklDU19DWU1FTlUgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbHBpdGVtLT5yZWN0LmJvdHRvbSArPSBNQVggKEhJV09SRChkd1NpemUpLCBzeXNNZXRyaWNzW1NNX0NZTUVOVV0tIDEpOwogICAgICAgICBscGl0ZW0tPnhUYWIgPSAwOwogCiAgICAgICAgIGlmIChtZW51QmFyKSBscGl0ZW0tPnJlY3QucmlnaHQgKz0gTUVOVV9CQVJfSVRFTVNfU1BBQ0U7CkBAIC03MTAsNyArNzAxLDcgQEAKIAkgICAgaWYgKChpICE9IHN0YXJ0KSAmJgogCQkobHBpdGVtLT5mVHlwZSAmIChNRl9NRU5VQlJFQUsgfCBNRl9NRU5VQkFSQlJFQUspKSkgYnJlYWs7CiAKLQkgICAgaWYoVFdFQUtfV2luOTVMb29rKQorCSAgICBpZiAoVFdFQUtfV2luZUxvb2sgPiBXSU4zMV9MT09LKQogCQkrK29yZ1k7CiAKIAkgICAgTUVOVV9DYWxjSXRlbVNpemUoIGhkYywgbHBpdGVtLCBod25kT3duZXIsIG9yZ1gsIG9yZ1ksIEZBTFNFICk7CkBAIC03MzUsNyArNzI2LDcgQEAKIAlscHBvcC0+SGVpZ2h0ID0gTUFYKCBscHBvcC0+SGVpZ2h0LCBvcmdZICk7CiAgICAgfQogCi0gICAgaWYoVFdFQUtfV2luOTVMb29rKQorICAgIGlmKFRXRUFLX1dpbmVMb29rID4gV0lOMzFfTE9PSykKIAlscHBvcC0+SGVpZ2h0Kys7CiAKICAgICBscHBvcC0+V2lkdGggID0gbWF4WDsKQEAgLTgzMyw3ICs4MjQsNyBAQAogICAgIGlmIChscGl0ZW0tPmZUeXBlICYgTUZfU1lTTUVOVSkKICAgICB7CiAJaWYoICFJc0ljb25pYzMyKGh3bmQpICkgewotCSAgICBpZihUV0VBS19XaW45NUxvb2spCisJICAgIGlmIChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spCiAJCU5DX0RyYXdTeXNCdXR0b245NSggaHduZCwgaGRjLAogCQkJCSAgICBscGl0ZW0tPmZTdGF0ZSAmCiAJCQkJICAgIChNRl9ISUxJVEUgfCBNRl9NT1VTRVNFTEVDVCkgKTsKQEAgLTg3NCw3ICs4NjUsNyBAQAogICAgIHJlY3QgPSBscGl0ZW0tPnJlY3Q7CiAKICAgICAvKiBEcmF3IHRoZSBiYWNrZ3JvdW5kICovCi0gICAgaWYoVFdFQUtfV2luOTVMb29rKSB7CisgICAgaWYgKFRXRUFLX1dpbmVMb29rID4gV0lOMzFfTE9PSykgewogCXJlY3QubGVmdCArPSAyOwogCXJlY3QucmlnaHQgLT0gMjsKIApAQCAtODk5LDggKzg5MCwxMyBAQAogCiAgICAgaWYgKCFtZW51QmFyICYmIChscGl0ZW0tPmZUeXBlICYgTUZfTUVOVUJBUkJSRUFLKSkKICAgICB7Ci0JaWYoVFdFQUtfV2luOTVMb29rKQotCSAgICBUV0VBS19EcmF3TWVudVNlcGFyYXRvclZlcnQ5NShoZGMsIHJlY3QubGVmdCAtIDEsIDMsIGhlaWdodCAtIDMpOworCS8qIHZlcnRpY2FsIHNlcGFyYXRvciAqLworCWlmIChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spIHsKKwkgICAgUkVDVDMyIHJjID0gcmVjdDsKKwkgICAgcmMudG9wID0gMzsKKwkgICAgcmMuYm90dG9tID0gaGVpZ2h0IC0gMzsKKwkgICAgRHJhd0VkZ2UzMiAoaGRjLCAmcmMsIEVER0VfRVRDSEVELCBCRl9MRUZUKTsKKwl9CiAJZWxzZSB7CiAJICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpICk7CiAJICAgIE1vdmVUbyggaGRjLCByZWN0LmxlZnQsIDAgKTsKQEAgLTkwOSwxMCArOTA1LDE0IEBACiAgICAgfQogICAgIGlmIChscGl0ZW0tPmZUeXBlICYgTUZfU0VQQVJBVE9SKQogICAgIHsKLQlpZihUV0VBS19XaW45NUxvb2spCi0JICAgIFRXRUFLX0RyYXdNZW51U2VwYXJhdG9ySG9yaXo5NShoZGMsIHJlY3QubGVmdCArIDEsCi0JCQkJCSAgIHJlY3QudG9wICsgU0VQQVJBVE9SX0hFSUdIVCAvIDIgKyAxLAotCQkJCQkgICByZWN0LnJpZ2h0IC0gMSk7CisJLyogaG9yaXpvbnRhbCBzZXBhcmF0b3IgKi8KKwlpZiAoVFdFQUtfV2luZUxvb2sgPiBXSU4zMV9MT09LKSB7CisJICAgIFJFQ1QzMiByYyA9IHJlY3Q7CisJICAgIHJjLmxlZnQrKzsKKwkgICAgcmMucmlnaHQtLTsKKwkgICAgcmMudG9wICs9IFNFUEFSQVRPUl9IRUlHSFQgLyAyOworCSAgICBEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9FVENIRUQsIEJGX1RPUCk7CisJfQogCWVsc2UgewogCSAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SX1dJTkRPV0ZSQU1FKSApOwogCSAgICBNb3ZlVG8oIGhkYywgcmVjdC5sZWZ0LCByZWN0LnRvcCArIFNFUEFSQVRPUl9IRUlHSFQvMiApOwpAQCAtMTAwMCwyMSArMTAwMCwxNSBAQAogCSAgICByZWN0LmxlZnQgKz0gTUVOVV9CQVJfSVRFTVNfU1BBQ0UgLyAyOwogCSAgICByZWN0LnJpZ2h0IC09IE1FTlVfQkFSX0lURU1TX1NQQUNFIC8gMjsKIAkgICAgaSA9IHN0cmxlbiggbHBpdGVtLT50ZXh0ICk7Ci0KLQkgICAgcmVjdC50b3AgKz0gTUVOVV9CYXJJdGVtVG9wTnVkZ2U7Ci0JICAgIHJlY3QubGVmdCArPSBNRU5VX0Jhckl0ZW1MZWZ0TnVkZ2U7CiAJfQogCWVsc2UKIAl7CiAJICAgIGZvciAoaSA9IDA7IGxwaXRlbS0+dGV4dFtpXTsgaSsrKQogICAgICAgICAgICAgICAgIGlmICgobHBpdGVtLT50ZXh0W2ldID09ICdcdCcpIHx8IChscGl0ZW0tPnRleHRbaV0gPT0gJ1xiJykpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JICAgIHJlY3QudG9wICs9IE1FTlVfSXRlbVRvcE51ZGdlOwotCSAgICByZWN0LmxlZnQgKz0gTUVOVV9JdGVtTGVmdE51ZGdlOwogCX0KIAotCWlmKCFUV0VBS19XaW45NUxvb2sgfHwgIShscGl0ZW0tPmZTdGF0ZSAmIE1GX0dSQVlFRCkpIHsKKwlpZigoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykgfHwgIShscGl0ZW0tPmZTdGF0ZSAmIE1GX0dSQVlFRCkpIHsKIAkgICAgRHJhd1RleHQzMkEoIGhkYywgbHBpdGVtLT50ZXh0LCBpLCAmcmVjdCwKIAkJCSBEVF9MRUZUIHwgRFRfVkNFTlRFUiB8IERUX1NJTkdMRUxJTkUgKTsKIAl9CkBAIC0xMDgzLDcgKzEwNzcsNyBAQAogCSAgICBQT1BVUE1FTlUgKm1lbnU7CiAKIAkgICAgLyogZHJhdyAzLWQgc2hhZGUgKi8KLQkgICAgaWYoIVRXRUFLX1dpbjk1TG9vaykgeworCSAgICBpZihUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKSB7CiAJCVNlbGVjdE9iamVjdDMyKCBoZGMsIGhTaGFkZUJydXNoICk7CiAJCVNldEJrTW9kZTMyKCBoZGMsIFRSQU5TUEFSRU5UICk7CiAJCXJvcFByZXYgPSBTZXRST1AyMzIoIGhkYywgUjJfTUFTS1BFTiApOwpAQCAtMTE0NCw3ICsxMTM4LDcgQEAKICAgICAKICAgICBGaWxsUmVjdDMyKGhEQywgbHByZWN0LCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfTUVOVSkgKTsKIAotICAgIGlmKCFUV0VBS19XaW45NUxvb2spIHsKKyAgICBpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykgewogCVNlbGVjdE9iamVjdDMyKCBoREMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpICk7CiAJTW92ZVRvKCBoREMsIGxwcmVjdC0+bGVmdCwgbHByZWN0LT5ib3R0b20gKTsKIAlMaW5lVG8zMiggaERDLCBscHJlY3QtPnJpZ2h0LCBscHJlY3QtPmJvdHRvbSApOwpAQCAtMTM2MiwxMCArMTM1NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG1lbnUpICk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZWxzZSBpZiAoc2VuZE1lbnVTZWxlY3QpCisgICAgZWxzZSBpZiAoc2VuZE1lbnVTZWxlY3QpIHsKICAgICAgICAgU2VuZE1lc3NhZ2UxNiggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULCBobWVudSwKICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIGxwcG9wLT53RmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCwgaG1lbnUgKSApOyAKLQorICAgIH0KICAgICBSZWxlYXNlREMzMiggbHBwb3AtPmhXbmQsIGhkYyApOwogfQogCkBAIC0xNDc2LDcgKzE0NzAsMTAgQEAKICAgICBpdGVtLT5mU3RhdGUgPSAoZmxhZ3MgJiBTVEFURV9NQVNLKSAmCiAgICAgICAgIH4oTUZfSElMSVRFIHwgTUZfTU9VU0VTRUxFQ1QgfCBNRl9CWVBPU0lUSU9OKTsKIAotICAgIFNldFJlY3RFbXB0eTMyKCAmaXRlbS0+cmVjdCApOworCisgICAgLyogRG9uJ3QgY2FsbCBTZXRSZWN0RW1wdHkgaGVyZSEgKi8KKworCiAgICAgaWYgKHByZXZUZXh0KSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcHJldlRleHQgKTsKIAogICAgIGRlYnVnX3ByaW50X21lbnVpdGVtKCJNRU5VX1NldEl0ZW1EYXRhIHRvICA6ICIsIGl0ZW0sICIiKTsKQEAgLTE3NDEsMTAgKzE3MzgsMTMgQEAKIAogICAgIC8qIG1lc3NhZ2UgbXVzdCBiZSBzZW5kIGJlZm9yZSB1c2luZyBpdGVtLAogICAgICAgIGJlY2F1c2UgbmVhcmx5IGV2ZXJ5dGhpbmcgbWF5IGJ5IGNoYW5nZWQgYnkgdGhlIGFwcGxpY2F0aW9uICEgKi8KLSAgICByZWN0ID0gaXRlbS0+cmVjdDsKKwogICAgIFNlbmRNZXNzYWdlMTYoIGh3bmRPd25lciwgV01fSU5JVE1FTlVQT1BVUCwgKFdQQVJBTTE2KWl0ZW0tPmhTdWJNZW51LAogCQkgICBNQUtFTE9ORyggbWVudS0+Rm9jdXNlZEl0ZW0sIElTX1NZU1RFTV9NRU5VKG1lbnUpICkpOwogCisgICAgaXRlbSA9ICZtZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV07CisgICAgcmVjdCA9IGl0ZW0tPnJlY3Q7CisKICAgICAvKiBjb3JyZWN0IGl0ZW0gaWYgbW9kaWZpZWQgYXMgYSByZWFjdGlvbiB0byBXTV9JTklUTUVOVVBPUFVQLW1lc3NhZ2UgKi8KICAgICBpZiAoIShpdGVtLT5mU3RhdGUgJiBNRl9ISUxJVEUpKSAKICAgICB7CmRpZmYgLS1naXQgYS9jb250cm9scy9zdGF0aWMuYyBiL2NvbnRyb2xzL3N0YXRpYy5jCmluZGV4IDcwYzY1ZjAuLjY4ZTc1ZjQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3N0YXRpYy5jCisrKyBiL2NvbnRyb2xzL3N0YXRpYy5jCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICBzd2l0Y2ggKHVNc2cpCiAgICAgewogICAgIGNhc2UgV01fTkNDUkVBVEU6Ci0JaWYgKFRXRUFLX1dpbjk1TG9vayAmJiAod25kUHRyLT5kd1N0eWxlICYgU1NfU1VOS0VOKSkKKwlpZiAoKFRXRUFLX1dpbmVMb29rID4gV0lOMzFfTE9PSykgJiYgKHduZFB0ci0+ZHdTdHlsZSAmIFNTX1NVTktFTikpCiAJICAgIHduZFB0ci0+ZHdFeFN0eWxlIHw9IFdTX0VYX1NUQVRJQ0VER0U7CiAKICAgICAgICAgaWYgKHN0eWxlID09IFNTX0lDT04pCkBAIC00MzIsNyArNDMyLDggQEAKICAgICBIQlJVU0gzMiBoYnJ1c2g7CiAgICAgSFBFTjMyIGhwZW47CiAKLSAgICBpZiAoIVRXRUFLX1dpbjk1TG9vaykgcmV0dXJuOworICAgIGlmIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKQorCXJldHVybjsKIAogICAgIEdldENsaWVudFJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgJnJjICk7CiAgICAgaGJydXNoID0gU2VuZE1lc3NhZ2UzMkEoIEdldFBhcmVudDMyKHduZFB0ci0+aHduZFNlbGYpLCBXTV9DVExDT0xPUlNUQVRJQywKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2JyZWFrLmMgYi9kZWJ1Z2dlci9icmVhay5jCmluZGV4IDY4ZGM1ODguLjA0YzI2OWMgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2JyZWFrLmMKKysrIGIvZGVidWdnZXIvYnJlYWsuYwpAQCAtMTEsNiArMTEsOCBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKQEAgLTQyLDEwICs0NCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIERFQlVHX1NldE9wY29kZSggY29uc3QgREJHX0FERFIgKmFkZHIsIEJZVEUgb3AgKQogewotICAgIEJZVEUgKnB0cjsKLQotICAgIGlmIChhZGRyLT5zZWcpIHB0ciA9IChCWVRFICopUFRSX1NFR19PRkZfVE9fTElOKCBhZGRyLT5zZWcsIGFkZHItPm9mZiApOwotICAgIGVsc2UgcHRyID0gKEJZVEUgKilhZGRyLT5vZmY7CisgICAgQllURSAqcHRyID0gREJHX0FERFJfVE9fTElOKGFkZHIpOwogCiAgICAgLyogVGhlcmUgYXJlIGEgY291cGxlIG9mIHByb2JsZW1zIHdpdGggdGhpcy4gT24gTGludXggcHJpb3IgdG8KICAgICAgICAxLjEuNjIsIHRoaXMgY2FsbCBmYWlscyAoRU5PQUNDRVNTKSBkdWUgdG8gYSBidWcgaW4gZnMvZXhlYy5jLgpAQCAtNzIsNyArNzEsOCBAQAogICovCiBzdGF0aWMgQk9PTDMyIERFQlVHX0lzU3RlcE92ZXJJbnN0cigpCiB7Ci0gICAgQllURSAqaW5zdHIgPSAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggQ1NfcmVnKCZERUJVR19jb250ZXh0KSwKKyAgICBCWVRFICppbnN0ciA9IChCWVRFICopQ1RYX1NFR19PRkZfVE9fTElOKCAmREVCVUdfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19yZWcoJkRFQlVHX2NvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpICk7CiAKICAgICBmb3IgKDs7KQpAQCAtMTM4LDcgKzEzOCw4IEBACiAgKi8KIEJPT0wzMiBERUJVR19Jc0ZjdFJldHVybih2b2lkKQogewotICAgIEJZVEUgKmluc3RyID0gKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oIENTX3JlZygmREVCVUdfY29udGV4dCksCisgICAgQllURSAqaW5zdHIgPSAoQllURSAqKUNUWF9TRUdfT0ZGX1RPX0xJTiggJkRFQlVHX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfcmVnKCZERUJVR19jb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKCZERUJVR19jb250ZXh0KSApOwogCiAgICAgZm9yICg7OykKQEAgLTM0Niw5ICszNDcsMTYgQEAKICAgICAgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggZW50cnkuaE1vZHVsZSApKSkgY29udGludWU7CiAgICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpIGNvbnRpbnVlOyAgLyogTGlicmFyeSAqLwogCisgICAgICAgIGlmIChwTW9kdWxlLT5kb3NfaW1hZ2UpIHsgLyogRE9TIG1vZHVsZSAqLworICAgICAgICAgICAgYWRkci5zZWcgPSBwTW9kdWxlLT5jcyB8ICgoRFdPUkQpcE1vZHVsZS0+c2VsZiA8PCAxNik7CisgICAgICAgICAgICBhZGRyLm9mZiA9IHBNb2R1bGUtPmlwOworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRE9TIHRhc2sgJyVzJzogIiwgZW50cnkuc3pNb2R1bGUgKTsKKyAgICAgICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CisgICAgICAgIH0gZWxzZQogICAgICAgICBpZiAoIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikpICAvKiBORSBtb2R1bGUgKi8KICAgICAgICAgewotICAgICAgICAgICAgYWRkci5zZWcgPSBORV9TRUdfVEFCTEUocE1vZHVsZSlbcE1vZHVsZS0+Y3MtMV0uc2VsZWN0b3I7CisgICAgICAgICAgICBhZGRyLnNlZyA9CisJCUdsb2JhbEhhbmRsZVRvU2VsKE5FX1NFR19UQUJMRShwTW9kdWxlKVtwTW9kdWxlLT5jcy0xXS5oU2VnKTsKICAgICAgICAgICAgIGFkZHIub2ZmID0gcE1vZHVsZS0+aXA7CiAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXaW4xNiB0YXNrICclcyc6ICIsIGVudHJ5LnN6TW9kdWxlICk7CiAgICAgICAgICAgICBERUJVR19BZGRCcmVha3BvaW50KCAmYWRkciApOwpAQCAtMzk1LDE0ICs0MDMsMTggQEAKICAgICBEQkdfQUREUiBjb25kX2FkZHI7CiAgICAgaW50IGJwbnVtOwogICAgIHN0cnVjdCBsaXN0X2lkIGxpc3Q7CisgICAgVERCICpwVGFzayA9IChUREIqKUdsb2JhbExvY2sxNiggR2V0Q3VycmVudFRhc2soKSApOwogCiAgICAgICAvKiBJZiBub3Qgc2luZ2xlLXN0ZXBwaW5nLCBiYWNrIHVwIG92ZXIgdGhlIGludDMgaW5zdHJ1Y3Rpb24gKi8KICAgICBpZiAoIShFRkxfcmVnKCZERUJVR19jb250ZXh0KSAmIFNURVBfRkxBRykpIEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpLS07CiAKICAgICBhZGRyLnNlZyA9IENTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgYWRkci5vZmYgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKKyAgICBpZiAoSVNWODYoJkRFQlVHX2NvbnRleHQpKSBhZGRyLnNlZyB8PSAoRFdPUkQpKHBUYXNrPyhwVGFzay0+aE1vZHVsZSk6MCk8PDE2OyBlbHNlCiAgICAgaWYgKElTX1NFTEVDVE9SX1NZU1RFTShhZGRyLnNlZykpIGFkZHIuc2VnID0gMDsKIAorICAgIEdsb2JhbFVubG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisKICAgICBicG51bSA9IERFQlVHX0ZpbmRCcmVha3BvaW50KCAmYWRkciApOwogICAgIGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQgPSAwOyAgLyogZGlzYWJsZSB0aGUgc3RlcC1vdmVyIGJyZWFrcG9pbnQgKi8KIApAQCAtNTE5LDExICs1MzEsMTUgQEAKICAgICB1bnNpZ25lZCBpbnQgKiB2YWx1ZTsKICAgICBlbnVtIGV4ZWNfbW9kZSByZXRfbW9kZTsKICAgICBCWVRFICppbnN0cjsKKyAgICBUREIgKnBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAKICAgICBhZGRyLnNlZyA9IENTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgYWRkci5vZmYgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKKyAgICBpZiAoSVNWODYoJkRFQlVHX2NvbnRleHQpKSBhZGRyLnNlZyB8PSAoRFdPUkQpKHBUYXNrPyhwVGFzay0+aE1vZHVsZSk6MCk8PDE2OyBlbHNlCiAgICAgaWYgKElTX1NFTEVDVE9SX1NZU1RFTShhZGRyLnNlZykpIGFkZHIuc2VnID0gMDsKIAorICAgIEdsb2JhbFVubG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisKICAgICAvKgogICAgICAqIFRoaXMgaXMgdGhlIG1vZGUgd2Ugd2lsbCBiZSBydW5uaW5nIGluIGFmdGVyIHdlIGZpbmlzaC4gIFdlIHdvdWxkIGxpa2UKICAgICAgKiB0byBiZSBhYmxlIHRvIG1vZGlmeSB0aGlzIGluIGNlcnRhaW4gY2FzZXMuCkBAIC01NTUsNyArNTcxLDggQEAKIAltb2RlID0gcmV0X21vZGUgPSBFWEVDX1NURVBJX0lOU1RSOwogICAgICAgfQogCi0gICAgaW5zdHIgPSAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggQ1NfcmVnKCZERUJVR19jb250ZXh0KSwKKyAgICBpbnN0ciA9IChCWVRFICopQ1RYX1NFR19PRkZfVE9fTElOKCAmREVCVUdfY29udGV4dCwKKwkJCQkJQ1NfcmVnKCZERUJVR19jb250ZXh0KSwKIAkJCQkJRUlQX3JlZygmREVCVUdfY29udGV4dCkgKTsKICAgICAvKgogICAgICAqIFNlZSBpZiB0aGUgZnVuY3Rpb24gd2UgYXJlIHN0ZXBwaW5nIGludG8gaGFzIGRlYnVnIGluZm8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZy55IGIvZGVidWdnZXIvZGJnLnkKaW5kZXggOWFhOTVmMi4uYzU2Y2U5NiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGJnLnkKKysrIGIvZGVidWdnZXIvZGJnLnkKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAiY2xhc3MuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAid2luLmgiCkBAIC00NjUsMTggKzQ2NiwyMiBAQAogCQkJCQkJICAgICAgJmRiZ19leGVjX2NvdW50ICkpCiAgICAgewogICAgICAgICBEQkdfQUREUiBhZGRyOworICAgICAgICBUREIgKnBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAKICAgICAgICAgYWRkci5zZWcgPSBDU19yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgICBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOworICAgICAgICBpZiAoSVNWODYoJkRFQlVHX2NvbnRleHQpKSBhZGRyLnNlZyB8PSAoRFdPUkQpKHBUYXNrPyhwVGFzay0+aE1vZHVsZSk6MCk8PDE2OwogCWFkZHIudHlwZSA9IE5VTEw7CiAgICAgICAgIERCR19GSVhfQUREUl9TRUcoICZhZGRyLCAwICk7CiAKKyAgICAgICAgR2xvYmFsVW5sb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKKwogICAgICAgICAvKiBQdXQgdGhlIGRpc3BsYXkgaW4gYSBjb3JyZWN0IHN0YXRlICovCiAKLSAgICAgICAgWFVuZ3JhYlNlcnZlciggZGlzcGxheSApOwotICAgICAgICBYRmx1c2goIGRpc3BsYXkgKTsKKyAgICAgICAgVFNYVW5ncmFiU2VydmVyKCBkaXNwbGF5ICk7CisgICAgICAgIFRTWEZsdXNoKCBkaXNwbGF5ICk7CiAKLSAgICAgICAgbmV3bW9kZSA9IElTX1NFTEVDVE9SXzMyQklUKGFkZHIuc2VnKSA/IDMyIDogMTY7CisgICAgICAgIG5ld21vZGUgPSBJU1Y4NigmREVCVUdfY29udGV4dCkgPyAxNiA6IElTX1NFTEVDVE9SXzMyQklUKGFkZHIuc2VnKSA/IDMyIDogMTY7CiAgICAgICAgIGlmIChuZXdtb2RlICE9IGRiZ19tb2RlKQogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkluICVkIGJpdCBtb2RlLlxuIiwgZGJnX21vZGUgPSBuZXdtb2RlKTsKIApAQCAtNTI2LDcgKzUzMSw3IEBACiAgICAgICAgICAgICBpc3N1ZV9wcm9tcHQoKTsKICAgICAgICAgICAgIHl5cGFyc2UoKTsKICAgICAgICAgICAgIGZsdXNoX3N5bWJvbHMoKTsKLSAgICAgICAgICAgIGFkZHIuc2VnID0gQ1NfcmVnKCZERUJVR19jb250ZXh0KTsKKyAgICAgICAgICAgIGFkZHIuc2VnID0gQ1NfcmVnKCZERUJVR19jb250ZXh0KSB8IChhZGRyLnNlZyYweGZmZmYwMDAwKTsKICAgICAgICAgICAgIGFkZHIub2ZmID0gRUlQX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgICAgICAgICBEQkdfRklYX0FERFJfU0VHKCAmYWRkciwgMCApOwogICAgICAgICAgICAgcmV0X29rID0gREVCVUdfVmFsaWRhdGVSZWdpc3RlcnMoKTsKQEAgLTU2NSw2ICs1NzAsMTMgQEAKIH0KIAogCit2b2lkIGN0eF9kZWJ1ZyggaW50IHNpZ25hbCwgQ09OVEVYVCAqcmVncyApCit7CisgICAgREVCVUdfY29udGV4dCA9ICpyZWdzOworICAgIERFQlVHX01haW4oIHNpZ25hbCApOworICAgICpyZWdzID0gREVCVUdfY29udGV4dDsKK30KKwogdm9pZCB3aW5lX2RlYnVnKCBpbnQgc2lnbmFsLCBTSUdDT05URVhUICpyZWdzICkKIHsKICNpZiAwCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9pbmZvLmMgYi9kZWJ1Z2dlci9pbmZvLmMKaW5kZXggYTFjYjM3OC4uNWRjNjI0NyAxMDA2NDQKLS0tIGEvZGVidWdnZXIvaW5mby5jCisrKyBiL2RlYnVnZ2VyL2luZm8uYwpAQCAtNzksNyArNzksNyBAQAogICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgZmxhZywgJnJ0bi5zeW0sIDAsIAogCQkJCQkJJnJ0bi5saXN0ICk7CiAKLSAgICBpZiAoYWRkci0+c2VnKSBmcHJpbnRmKCBzdGRlcnIsICIweCUwNGx4OiIsIGFkZHItPnNlZyApOworICAgIGlmIChhZGRyLT5zZWcpIGZwcmludGYoIHN0ZGVyciwgIjB4JTA0bHg6IiwgYWRkci0+c2VnJjB4RkZGRiApOwogICAgIGlmIChhZGRybGVuID09IDE2KSBmcHJpbnRmKCBzdGRlcnIsICIweCUwNGx4IiwgYWRkci0+b2ZmICk7CiAgICAgZWxzZSBmcHJpbnRmKCBzdGRlcnIsICIweCUwOGx4IiwgYWRkci0+b2ZmICk7CiAgICAgaWYgKG5hbWUpIGZwcmludGYoIHN0ZGVyciwgIiAoJXMpIiwgbmFtZSApOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvbWVtb3J5LmMgYi9kZWJ1Z2dlci9tZW1vcnkuYwppbmRleCBmYmQ1MDQ3Li5hYTFkZDcxIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9tZW1vcnkuYworKysgYi9kZWJ1Z2dlci9tZW1vcnkuYwpAQCAtOTksNiArOTksNyBAQAogICovCiBCT09MMzIgREVCVUdfSXNCYWRSZWFkUHRyKCBjb25zdCBEQkdfQUREUiAqYWRkcmVzcywgaW50IHNpemUgKQogeworICAgIGlmICghSVNfU0VMRUNUT1JfVjg2KGFkZHJlc3MtPnNlZykpCiAgICAgaWYgKGFkZHJlc3MtPnNlZykgIC8qIHNlZ21lbnRlZCBhZGRyICovCiAgICAgewogICAgICAgICBpZiAoSXNCYWRSZWFkUHRyMTYoIChTRUdQVFIpTUFLRUxPTkcoIChXT1JEKWFkZHJlc3MtPm9mZiwKQEAgLTExNiw2ICsxMTcsNyBAQAogICovCiBCT09MMzIgREVCVUdfSXNCYWRXcml0ZVB0ciggY29uc3QgREJHX0FERFIgKmFkZHJlc3MsIGludCBzaXplICkKIHsKKyAgICBpZiAoIUlTX1NFTEVDVE9SX1Y4NihhZGRyZXNzLT5zZWcpKQogICAgIGlmIChhZGRyZXNzLT5zZWcpICAvKiBzZWdtZW50ZWQgYWRkciAqLwogICAgIHsKICAgICAgICAgLyogTm90ZTogd2UgdXNlIElzQmFkUmVhZFB0ciBoZXJlIGJlY2F1c2Ugd2UgYXJlICovCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWdpc3RlcnMuYyBiL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCmluZGV4IGI2YThhMjMuLjNhN2VkZDEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCisrKyBiL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCkBAIC0xNTYsNiArMTU2LDggQEAKICAgICBHRVRfR1MoIEdTX3JlZygmREVCVUdfY29udGV4dCkgKTsKICAgICBHU19yZWcoJkRFQlVHX2NvbnRleHQpICY9IDB4ZmZmZjsKICNlbmRpZgorICAgIGlmIChJU1Y4NigmREVCVUdfY29udGV4dCkpCisgICAgICAgIChjaGFyKilWODZCQVNFKCZERUJVR19jb250ZXh0KSA9IERPU01FTV9NZW1vcnlCYXNlKDApOwogfQogCiAKQEAgLTI5OCw2ICszMDAsOCBAQAogewogICAgIFdPUkQgY3MsIGRzOwogCisgICAgaWYgKElTVjg2KCZERUJVR19jb250ZXh0KSkgcmV0dXJuIFRSVUU7CisKIC8qIENoZWNrIHRoYXQgYSBzZWxlY3RvciBpcyBhIHZhbGlkIHJpbmctMyBMRFQgc2VsZWN0b3IsIG9yIGEgTlVMTCBzZWxlY3RvciAqLwogI2RlZmluZSBDSEVDS19TRUcoc2VnLG5hbWUpIFwKICAgICBpZiAoKChzZWcpICYgfjMpICYmIFwKQEAgLTMxOSw2ICszMjMsNyBAQAogCiAgICAgLyogQ2hlY2sgdGhhdCBDUyBhbmQgU1MgYXJlIG5vdCBOVUxMICovCiAKKyAgICBpZiAoIUlTVjg2KCZERUJVR19jb250ZXh0KSkKICAgICBpZiAoIShDU19yZWcoJkRFQlVHX2NvbnRleHQpICYgfjMpKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiKioqIEludmFsaWQgdmFsdWUgZm9yIENTIHJlZ2lzdGVyOiAlMDR4XG4iLApkaWZmIC0tZ2l0IGEvZGxscy9NYWtlZmlsZS5pbiBiL2RsbHMvTWFrZWZpbGUuaW4KaW5kZXggNjdlM2E5NS4uZWE4YmM0NiAxMDA2NDQKLS0tIGEvZGxscy9NYWtlZmlsZS5pbgorKysgYi9kbGxzL01ha2VmaWxlLmluCkBAIC0xLDYgKzEsOSBAQAogU1VCRElSUyA9IFwKIAljb21jdGwzMiBcCi0Jc2hlbGwzMgorCXBzYXBpIFwKKwlzaGVsbDMyIFwKKwl3aW5hc3BpIFwKKwl3bmFzcGkzMgogCiBhbGw6ICQoU1VCRElSUykKIApkaWZmIC0tZ2l0IGEvZGxscy9jb21jdGwzMi9hbmltYXRlLmMgYi9kbGxzL2NvbWN0bDMyL2FuaW1hdGUuYwppbmRleCA5MzAzNzExLi45YzJmYzE5IDEwMDY0NAotLS0gYS9kbGxzL2NvbWN0bDMyL2FuaW1hdGUuYworKysgYi9kbGxzL2NvbWN0bDMyL2FuaW1hdGUuYwpAQCAtMTQsNiArMTQsOCBAQAogICovCiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2lubnQuaCIKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAiY29tbWN0cmwuaCIKICNpbmNsdWRlICJhbmltYXRlLmgiCiAjaW5jbHVkZSAid2luLmgiCkBAIC0yMywzNCArMjUsMTM2IEBACiAjZGVmaW5lIEFOSU1BVEVfR2V0SW5mb1B0cih3bmRQdHIpICgoQU5JTUFURV9JTkZPICopd25kUHRyLT53RXh0cmFbMF0pCiAKIAorc3RhdGljIEJPT0wzMgorQU5JTUFURV9Mb2FkUmVzMzJBIChBTklNQVRFX0lORk8gKmluZm9QdHIsIEhJTlNUQU5DRTMyIGhJbnN0LCBMUFNUUiBscE5hbWUpCit7CisgICAgSFJTUkMzMiBocnNyYzsKKyAgICBIR0xPQkFMMzIgaGFuZGxlOworCisgICAgaHJzcmMgPSBGaW5kUmVzb3VyY2UzMkEgKGhJbnN0LCBscE5hbWUsICJBVkkiKTsKKyAgICBpZiAoIWhyc3JjKQorCXJldHVybiBGQUxTRTsKKworICAgIGhhbmRsZSA9IExvYWRSZXNvdXJjZTMyIChoSW5zdCwgaHJzcmMpOworICAgIGlmICghaGFuZGxlKQorCXJldHVybiBGQUxTRTsKKworICAgIGluZm9QdHItPmxwQXZpID0gTG9ja1Jlc291cmNlMzIgKGhhbmRsZSk7CisgICAgaWYgKCFpbmZvUHRyLT5scEF2aSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgQk9PTDMyCitBTklNQVRFX0xvYWRGaWxlMzJBIChBTklNQVRFX0lORk8gKmluZm9QdHIsIExQU1RSIGxwTmFtZSkKK3sKKyAgICBIQU5ETEUzMiBoYW5kbGU7CisKKyAgICBpbmZvUHRyLT5oRmlsZSA9CisJQ3JlYXRlRmlsZTMyQSAobHBOYW1lLCBHRU5FUklDX1JFQUQsIDAsIE5VTEwsIE9QRU5fRVhJU1RJTkcsCisJCSAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIDApOworICAgIGlmICghaW5mb1B0ci0+aEZpbGUpCisJcmV0dXJuIEZBTFNFOworCisgICAgaGFuZGxlID0KKwlDcmVhdGVGaWxlTWFwcGluZzMyQSAoaW5mb1B0ci0+aEZpbGUsIE5VTEwsIFBBR0VfUkVBRE9OTFkgfCBTRUNfQ09NTUlULAorCQkJICAgICAgMCwgMCwgTlVMTCk7CisgICAgaWYgKCFoYW5kbGUpIHsKKwlDbG9zZUhhbmRsZSAoaW5mb1B0ci0+aEZpbGUpOworCWluZm9QdHItPmhGaWxlID0gMDsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaW5mb1B0ci0+bHBBdmkgPSBNYXBWaWV3T2ZGaWxlIChoYW5kbGUsIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOworICAgIGlmICghaW5mb1B0ci0+bHBBdmkpIHsKKwlDbG9zZUhhbmRsZSAoaW5mb1B0ci0+aEZpbGUpOworCWluZm9QdHItPmhGaWxlID0gMDsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIFZPSUQKK0FOSU1BVEVfRnJlZSAoQU5JTUFURV9JTkZPICppbmZvUHRyKQoreworICAgIGlmIChpbmZvUHRyLT5oRmlsZSkgeworCVVubWFwVmlld09mRmlsZSAoaW5mb1B0ci0+bHBBdmkpOworCUNsb3NlSGFuZGxlIChpbmZvUHRyLT5oRmlsZSk7CisJaW5mb1B0ci0+bHBBdmkgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKwlHbG9iYWxGcmVlMzIgKGluZm9QdHItPmxwQXZpKTsKKwlpbmZvUHRyLT5scEF2aSA9IE5VTEw7CisgICAgfQorfQorCisKK3N0YXRpYyBWT0lECitBTklNQVRFX0dldEF2aUluZm8gKGluZm9QdHIpCit7CisKKworfQorCisKIHN0YXRpYyBMUkVTVUxUCiBBTklNQVRFX09wZW4zMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgQU5JTUFURV9JTkZPICppbmZvUHRyID0gQU5JTUFURV9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSElOU1RBTkNFMzIgaEluc3RhbmNlID0gKEhJTlNUQU5DRTMyKXdQYXJhbTsKKworICAgIEFOSU1BVEVfRnJlZSAoaW5mb1B0cik7CiAKICAgICBpZiAoIWxQYXJhbSkgewotCi0JRklYTUUgKGFuaW1hdGUsICJjbG9zZSBhdmk6IGVtcHR5IHN0dWIhXG4iKTsKLQorCVRSQUNFIChhbmltYXRlLCAiY2xvc2luZyBhdmkhXG4iKTsKIAlyZXR1cm4gVFJVRTsKICAgICB9CiAgICAgCiAgICAgaWYgKEhJV09SRChsUGFyYW0pKSB7Ci0KIAlGSVhNRSAoYW5pbWF0ZSwgIihcIiVzXCIpIGVtcHR5IHN0dWIhXG4iLCAoTFBTVFIpbFBhcmFtKTsKIAorCWlmIChBTklNQVRFX0xvYWRSZXMzMkEgKGluZm9QdHIsIGhJbnN0YW5jZSwgKExQU1RSKWxQYXJhbSkpIHsKKworCSAgICBGSVhNRSAoYW5pbWF0ZSwgIkFWSSByZXNvdXJjZSBmb3VuZCFcbiIpOworCisJfQorCWVsc2UgeworCSAgICBGSVhNRSAoYW5pbWF0ZSwgIk5vIEFWSSByZXNvdXJjZSBmb3VuZCFcbiIpOworCSAgICBpZiAoQU5JTUFURV9Mb2FkRmlsZTMyQSAoaW5mb1B0ciwgKExQU1RSKWxQYXJhbSkpIHsKKwkJRklYTUUgKGFuaW1hdGUsICJBVkkgZmlsZSBmb3VuZCFcbiIpOworCSAgICB9CisJICAgIGVsc2UgeworCQlGSVhNRSAoYW5pbWF0ZSwgIk5vIEFWSSBmaWxlIGZvdW5kIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwkgICAgfQorCX0KICAgICB9CiAgICAgZWxzZSB7Ci0KIAlGSVhNRSAoYW5pbWF0ZSwgIigldSkgZW1wdHkgc3R1YiFcbiIsIChXT1JEKUxPV09SRChsUGFyYW0pKTsKIAorCWlmIChBTklNQVRFX0xvYWRSZXMzMkEgKGluZm9QdHIsIGhJbnN0YW5jZSwKKwkJCQlNQUtFSU5UUkVTT1VSQ0UzMkEoKElOVDMyKWxQYXJhbSkpKSB7CisJICAgIEZJWE1FIChhbmltYXRlLCAiQVZJIHJlc291cmNlIGZvdW5kIVxuIik7CisJfQorCWVsc2UgeworCSAgICBGSVhNRSAoYW5pbWF0ZSwgIk5vIEFWSSByZXNvdXJjZSBmb3VuZCFcbiIpOworCSAgICByZXR1cm4gRkFMU0U7CisJfQogICAgIH0KIAorICAgIEFOSU1BVEVfR2V0QXZpSW5mbyAoaW5mb1B0cik7CiAKICAgICByZXR1cm4gVFJVRTsKIH0KIAogCisvLyA8PCBBTklNQVRFX09wZW4zMlcgPj4KKworCiBzdGF0aWMgTFJFU1VMVAogQU5JTUFURV9QbGF5IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewpAQCAtMTMxLDcgKzIzNSw4IEBACiAgICAgQU5JTUFURV9JTkZPICppbmZvUHRyID0gQU5JTUFURV9HZXRJbmZvUHRyKHduZFB0cik7CiAKIAotCisgICAgLyogZnJlZSBhdmkgZGF0YSAqLworICAgIEFOSU1BVEVfRnJlZSAoaW5mb1B0cik7CiAKICAgICAvKiBmcmVlIGFuaW1hdGUgaW5mbyBkYXRhICovCiAgICAgQ09NQ1RMMzJfRnJlZSAoaW5mb1B0cik7CmRpZmYgLS1naXQgYS9kbGxzL2NvbWN0bDMyL2NvbWN0bDMydW5kb2MuYyBiL2RsbHMvY29tY3RsMzIvY29tY3RsMzJ1bmRvYy5jCmluZGV4IGU0NWY3N2YuLjQzMGRkNjcgMTAwNjQ0Ci0tLSBhL2RsbHMvY29tY3RsMzIvY29tY3RsMzJ1bmRvYy5jCisrKyBiL2RsbHMvY29tY3RsMzIvY29tY3RsMzJ1bmRvYy5jCkBAIC0xMCw3ICsxMCw4IEBACiAgKiAgICAgQ09NQ1RMMzIuRExMIChpbnRlcm5hbGx5KS4KICAqCiAgKiBUT0RPCi0gKiAgICAgLSBXcml0ZSBkb2N1bWVudGF0aW9uLgorICogICAgIC0gQWRkIG1vcmUgZnVuY3Rpb25zLgorICogICAgIC0gV3JpdGUgc29tZSBkb2N1bWVudGF0aW9uLgogICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTI3LDYgKzI4LDIyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT01DVEwzMl8xMSBbQ09NQ1RMMzIuMTFdCisgKi8KKworRFdPUkQgV0lOQVBJCitDT01DVEwzMl8xMSAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMywKKwkgICAgIERXT1JEIGR3UGFyYW00LCBEV09SRCBkd1BhcmFtNSwgRFdPUkQgZHdQYXJhbTYpCit7CisKKyAgICBGSVhNRSAoY29tbWN0cmwsICIoJTA4bHgsICUwOGx4LCAlMDhseCwgJTA4bHgsICUwOGx4LCAlMDhseCk6IGVtcHR5IHN0dWJcbiIsCisJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1BhcmFtMywgZHdQYXJhbTQsIGR3UGFyYW01LCBkd1BhcmFtNik7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEFsbG9jIFtDT01DVEwzMi43MV0KICAqCiAgKiBBbGxvY2F0ZXMgbWVtb3J5IGJsb2NrIGZyb20gdGhlIGRsbCdzIGxvY2FsIGhlYXAKQEAgLTE1Myw2ICsxNzAsMjUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBNUlUtQVBJIGlzIGEgc2V0IG9mIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIE1SVShNb3N0IFJlY2VudGx5IFVzZWQpCisgKiBsaXN0cy4KKyAqCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHRhZ01SVUlORk8KK3sKKyAgICBEV09SRCAgZHdQYXJhbTE7CisgICAgRFdPUkQgIGR3UGFyYW0yOworICAgIERXT1JEICBkd1BhcmFtMzsKKyAgICBIS0VZICAgaGtleU1haW47CisgICAgTFBDU1RSIGxwc3pTdWJLZXk7CisgICAgRFdPUkQgIGR3UGFyYW02OworfSBNUlVJTkZPLCAqTFBNUlVJTkZPOworIAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ3JlYXRlTVJVTGlzdEEgW0NPTUNUTDMyLjE1MV0KICAqCiAgKiBQQVJBTVMKQEAgLTE2MSw1NCArMTk3LDIzMyBAQAogICogUkVUVVJOUwogICovCiAKLURXT1JEIFdJTkFQSQotQ3JlYXRlTVJVTGlzdDMyQSAoRFdPUkQgZHdQYXJhbSkKK0xQVk9JRCBXSU5BUEkKK0NyZWF0ZU1SVUxpc3RFeDMyQSAoTFBNUlVJTkZPIGxwbWksIERXT1JEIGR3UGFyYW0yLAorCQkgICAgRFdPUkQgZHdQYXJhbTMsIERXT1JEIGR3UGFyYW00KTsKKworTFBWT0lEIFdJTkFQSQorQ3JlYXRlTVJVTGlzdDMyQSAoTFBNUlVJTkZPIGxwbWkpCiB7Ci0KLSAgICBGSVhNRSAoY29tbWN0cmwsICIoJWx4KVxuIiwgZHdQYXJhbSk7Ci0KLSAgICByZXR1cm4gMTsKKyAgICAgcmV0dXJuIENyZWF0ZU1SVUxpc3RFeDMyQSAobHBtaSwgMCwgMCwgMCk7CiB9CiAKIAogCitEV09SRCBXSU5BUEkKK0ZyZWVNUlVMaXN0MzJBIChMUFZPSUQgcHRyKQoreworICAgIEZJWE1FIChjb21tY3RybCwgIiglcCkgZW1wdHkgc3R1YiFcbiIsIHB0cik7CisKKyAgICBDT01DVEwzMl9GcmVlIChwdHIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworCisKKworCitMUFZPSUQgV0lOQVBJCitDcmVhdGVNUlVMaXN0RXgzMkEgKExQTVJVSU5GTyBscG1pLCBEV09SRCBkd1BhcmFtMiwgRFdPUkQgZHdQYXJhbTMsIERXT1JEIGR3UGFyYW00KQoreworICAgIERXT1JEICBkd0xvY2FsMTsKKyAgICBIS0VZICAgaGtleVJlc3VsdDsKKyAgICBEV09SRCAgZHdMb2NhbDM7CisgICAgTFBWT0lEIGxNUlU7CisgICAgRFdPUkQgIGR3TG9jYWw1OworICAgIERXT1JEICBkd0xvY2FsNjsKKyAgICBEV09SRCAgZHdMb2NhbDc7CisgICAgRFdPUkQgIGR3RGlzcG9zaXRpb247CisKKyAgICAvKiBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgICBMUFZPSUQgcHRyOworCisgICAgRklYTUUgKGNvbW1jdHJsLCAiKCVwKSBlbXB0eSBzdHViIVxuIiwgbHBtaSk7CisKKyAgICBpZiAobHBtaSkgeworCUZJWE1FIChjb21tY3RybCwgIiglbHggJWx4ICVseCAlbHggXCIlc1wiICVseClcbiIsCisJICAgICAgIGxwbWktPmR3UGFyYW0xLCBscG1pLT5kd1BhcmFtMiwgbHBtaS0+ZHdQYXJhbTMsCisJICAgICAgIGxwbWktPmhrZXlNYWluLCBscG1pLT5scHN6U3ViS2V5LCBscG1pLT5kd1BhcmFtNik7CisgICAgfQorCisgICAgLyogZHVtbXkgcG9pbnRlciBjcmVhdGlvbiAqLworICAgIHB0ciA9IENPTUNUTDMyX0FsbG9jICgzMik7CisKKyAgICBGSVhNRSAoY29tbWN0cmwsICItLSByZXQgPSAlcFxuIiwgcHRyKTsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworCitEV09SRCBXSU5BUEkKK0FkZE1SVURhdGEgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwgRFdPUkQgZHdQYXJhbTMpCit7CisKKyAgICBGSVhNRSAoY29tbWN0cmwsICIoJWx4ICVseCAlbHgpIGVtcHR5IHN0dWIhXG4iLAorCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgZHdQYXJhbTMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworRFdPUkQgV0lOQVBJCitGaW5kTVJVRGF0YSAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMywgRFdPUkQgZHdQYXJhbTQpCit7CisKKyAgICBGSVhNRSAoY29tbWN0cmwsICIoJWx4ICVseCAlbHggJWx4KSBlbXB0eSBzdHViIVxuIiwKKwkgICBkd1BhcmFtMSwgZHdQYXJhbTIsIGR3UGFyYW0zLCBkd1BhcmFtNCk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0cl9HZXRQdHJBIFtDT01DVEwzMi4yMzNdCisgKgorICogUEFSQU1TCisgKiAgICAgbHBTcmMgICBbSV0KKyAqICAgICBscERlc3QgIFtPXQorICogICAgIG5NYXhMZW4gW0ldCisgKgorICogUkVUVVJOUworICovCisKK0lOVDMyIFdJTkFQSQorU3RyX0dldFB0cjMyQSAoTFBDU1RSIGxwU3JjLCBMUFNUUiBscERlc3QsIElOVDMyIG5NYXhMZW4pCit7CisgICAgSU5UMzIgbGVuOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKCVwICVwICVkKVxuIiwgbHBTcmMsIGxwRGVzdCwgbk1heExlbik7CisKKyAgICBpZiAoIWxwRGVzdCAmJiBscFNyYykKKwlyZXR1cm4gbHN0cmxlbjMyQSAobHBTcmMpOworCisgICAgaWYgKG5NYXhMZW4gPT0gMCkKKwlyZXR1cm4gMDsKKworICAgIGlmIChscFNyYyA9PSBOVUxMKSB7CisJbHBEZXN0WzBdID0gJ1wwJzsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBsZW4gPSBsc3RybGVuMzJBIChscFNyYyk7CisgICAgaWYgKGxlbiA+PSBuTWF4TGVuKQorCWxlbiA9IG5NYXhMZW4gLSAxOworCisgICAgUnRsTW92ZU1lbW9yeSAobHBEZXN0LCBscFNyYywgbGVuKTsKKyAgICBscERlc3RbbGVuXSA9ICdcMCc7CisKKyAgICByZXR1cm4gbGVuOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU3RyX1NldFB0ckEgW0NPTUNUTDMyLjIzNF0KICAqCiAgKiBQQVJBTVMKLSAqICAgICBkd1BhcmFtMSBbSV0KLSAqICAgICBkd1BhcmFtMiBbSV0KKyAqICAgICBscHBEZXN0IFtPXQorICogICAgIGxwU3JjICAgW0ldCiAgKgogICogUkVUVVJOUwogICovCiAKIEJPT0wzMiBXSU5BUEkKLUNPTUNUTDMyX1N0cl9TZXRQdHJBIChMUFNUUiBscFN0ciwgTFBWT0lEICpscFB0cikKK1N0cl9TZXRQdHIzMkEgKExQU1RSICpscHBEZXN0LCBMUENTVFIgbHBTcmMpCit7CisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKCVwICVwKVxuIiwgbHBwRGVzdCwgbHBTcmMpOworIAorICAgIGlmIChscFNyYykgeworCUxQU1RSIHB0ciA9IENPTUNUTDMyX1JlQWxsb2MgKGxwcERlc3QsIGxzdHJsZW4zMkEgKGxwU3JjKSArIDEpOworCWlmICghcHRyKQorCSAgICByZXR1cm4gRkFMU0U7CisJbHN0cmNweTMyQSAocHRyLCBscFNyYyk7CisJKmxwcERlc3QgPSBwdHI7CisgICAgfQorICAgIGVsc2UgeworCWlmICgqbHBwRGVzdCkgeworCSAgICBDT01DVEwzMl9GcmVlICgqbHBwRGVzdCk7CisJICAgICpscHBEZXN0ID0gTlVMTDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJfR2V0UHRyVyBbQ09NQ1RMMzIuMjM1XQorICoKKyAqIFBBUkFNUworICogICAgIGxwU3JjICAgW0ldCisgKiAgICAgbHBEZXN0ICBbT10KKyAqICAgICBuTWF4TGVuIFtJXQorICoKKyAqIFJFVFVSTlMKKyAqLworCitJTlQzMiBXSU5BUEkKK1N0cl9HZXRQdHIzMlcgKExQQ1dTVFIgbHBTcmMsIExQV1NUUiBscERlc3QsIElOVDMyIG5NYXhMZW4pCiB7CiAgICAgSU5UMzIgbGVuOwotICAgIExQU1RSIHB0cjsKIAotICAgIFRSQUNFIChjb21tY3RybCwgIiglcCAlcClcbiIsIGxwU3RyLCBscFB0cik7CisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKCVwICVwICVkKVxuIiwgbHBTcmMsIGxwRGVzdCwgbk1heExlbik7CisKKyAgICBpZiAoIWxwRGVzdCAmJiBscFNyYykKKwlyZXR1cm4gbHN0cmxlbjMyVyAobHBTcmMpOworCisgICAgaWYgKG5NYXhMZW4gPT0gMCkKKwlyZXR1cm4gMDsKKworICAgIGlmIChscFNyYyA9PSBOVUxMKSB7CisJbHBEZXN0WzBdID0gTCdcMCc7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgbGVuID0gbHN0cmxlbjMyVyAobHBTcmMpOworICAgIGlmIChsZW4gPj0gbk1heExlbikKKwlsZW4gPSBuTWF4TGVuIC0gMTsKKworICAgIFJ0bE1vdmVNZW1vcnkgKGxwRGVzdCwgbHBTcmMsIGxlbipzaXplb2YoV0NIQVIpKTsKKyAgICBscERlc3RbbGVuXSA9IEwnXDAnOworCisgICAgcmV0dXJuIGxlbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0cl9TZXRQdHJXIFtDT01DVEwzMi4yMzZdCisgKgorICogUEFSQU1TCisgKiAgICAgbHBEZXN0IFtPXQorICogICAgIGxwU3JjICBbSV0KKyAqCisgKiBSRVRVUk5TCisgKi8KKworQk9PTDMyIFdJTkFQSQorU3RyX1NldFB0cjMyVyAoTFBXU1RSICpscHBEZXN0LCBMUENXU1RSIGxwU3JjKQoreworICAgIFRSQUNFIChjb21tY3RybCwgIiglcCAlcClcbiIsIGxwcERlc3QsIGxwU3JjKTsKICAKLSAgICBpZiAobHBTdHIpIHsKLQlsZW4gPSBsc3RybGVuMzJBIChscFN0cik7Ci0JcHRyID0gQ09NQ1RMMzJfUmVBbGxvYyAobHBQdHIsIGxlbiArIDEpOwotCWlmICghKHB0cikpCisgICAgaWYgKGxwU3JjKSB7CisJSU5UMzIgbGVuID0gbHN0cmxlbjMyVyAobHBTcmMpICsgMTsKKwlMUFdTVFIgcHRyID0gQ09NQ1RMMzJfUmVBbGxvYyAobHBwRGVzdCwgbGVuICogc2l6ZW9mKFdDSEFSKSk7CisJaWYgKCFwdHIpCiAJICAgIHJldHVybiBGQUxTRTsKLQlsc3RyY3B5MzJBIChwdHIsIGxwU3RyKTsKLQlpZiAoIWxwUHRyKQotCSAgICByZXR1cm4gRkFMU0U7Ci0JKmxwUHRyID0gcHRyOwotCXJldHVybiBUUlVFOworCWxzdHJjcHkzMlcgKHB0ciwgbHBTcmMpOworCSpscHBEZXN0ID0gcHRyOworICAgIH0KKyAgICBlbHNlIHsKKwlpZiAoKmxwcERlc3QpIHsKKwkgICAgQ09NQ1RMMzJfRnJlZSAoKmxwcERlc3QpOworCSAgICAqbHBwRGVzdCA9IE5VTEw7CisJfQogICAgIH0KIAotICAgIGlmICgqbHBQdHIpIHsKLQlDT01DVEwzMl9GcmVlICgqbHBQdHIpOwotCXJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCkBAIC02MzYsNyArODUxLDcgQEAKIEJPT0wzMiBXSU5BUEkKIERQQV9Hcm93IChjb25zdCBIRFBBIGhkcGEsIElOVDMyIG5Hcm93KQogewotICAgIEZJWE1FIChjb21tY3RybCwgIiglcCAlZCkgc3R1YiFcbiIsIGhkcGEsIG5Hcm93KTsKKyAgICBUUkFDRSAoY29tbWN0cmwsICIoJXAgJWQpXG4iLCBoZHBhLCBuR3Jvdyk7CiAKICAgICBpZiAoIWhkcGEpCiAJcmV0dXJuIEZBTFNFOwpAQCAtNjc2LDcgKzg5MSw3IEBACiAgICAgaWYgKCFoZHBhKQogCXJldHVybiBOVUxMOwogCi0gICAgRklYTUUgKGNvbW1jdHJsLCAiKCVwICVwKSBzdHViIVxuIiwgaGRwYSwgaGRwYU5ldyk7CisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKCVwICVwKVxuIiwgaGRwYSwgaGRwYU5ldyk7CiAKICAgICBpZiAoIWhkcGFOZXcpIHsKIAkvKiBjcmVhdGUgYSBuZXcgRFBBICovCkBAIC0xMDE5LDcgKzEyMzQsNyBAQAogICAgIExQVk9JRCB0LCB2OwogICAgIElOVDMyICBpLCBqOwogCi0gICAgaWYgKGwgPiByKSB7CisgICAgaWYgKHIgPiBsKSB7CiAJdiA9IGxwUHRyc1tyXTsKIAlpID0gbCAtIDE7CiAJaiA9IHI7CkBAIC0xMDY0LDcgKzEyNzksOSBAQAogCiAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKCVwICVwIDB4JWx4KVxuIiwgaGRwYSwgcGZuQ29tcGFyZSwgbFBhcmFtKTsKIAotICAgIERQQV9RdWlja1NvcnQgKGhkcGEtPnB0cnMsIDAsIGhkcGEtPm5JdGVtQ291bnQgLSAxLCBwZm5Db21wYXJlLCBsUGFyYW0pOworICAgIGlmICgoaGRwYS0+bkl0ZW1Db3VudCA+IDEpICYmIChoZHBhLT5wdHJzKSkKKwlEUEFfUXVpY2tTb3J0IChoZHBhLT5wdHJzLCAwLCBoZHBhLT5uSXRlbUNvdW50IC0gMSwKKwkJICAgICAgIHBmbkNvbXBhcmUsIGxQYXJhbSk7CiAKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTExMDcsNiArMTMyNCw4IEBACiAJSU5UMzIgbCwgciwgeCwgbjsKIAlMUFZPSUQgKmxwUHRyOwogCisJVFJBQ0UgKGNvbW1jdHJsLCAiYmluYXJ5IHNlYXJjaFxuIik7CisKIAlsID0gKG5TdGFydCA9PSAtMSkgPyAwIDogblN0YXJ0OwogCXIgPSBoZHBhLT5uSXRlbUNvdW50IC0gMTsKIAlscFB0ciA9IGhkcGEtPnB0cnM7CkBAIC0xMTM4LDcgKzEzNTcsNyBAQAogCUxQVk9JRCAqbHBQdHI7CiAJSU5UMzIgIG5JbmRleDsKIAotCUZJWE1FIChjb21tY3RybCwgImxpbmVhciBzZWFyY2hcbiIpOworCVRSQUNFIChjb21tY3RybCwgImxpbmVhciBzZWFyY2hcbiIpOwogCQogCW5JbmRleCA9IChuU3RhcnQgPT0gLTEpPyAwIDogblN0YXJ0OwogCWxwUHRyID0gaGRwYS0+cHRyczsKQEAgLTEyNjcsMyArMTQ4Niw2MyBAQAogICAgIHJldHVybiBhdG9pKGxwU3RyaW5nKTsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTUNUTDMyXzM4NSBbQ09NQ1RMMzIuMzg1XQorICovCisKK0RXT1JEIFdJTkFQSQorQ09NQ1RMMzJfMzg1IChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsIERXT1JEIGR3UGFyYW0zKQoreworCisgICAgRklYTUUgKGNvbW1jdHJsLCAiKCUwOGx4LCAlMDhseCwgJTA4bHgpOiBlbXB0eSBzdHViXG4iLAorCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgZHdQYXJhbTMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT01DVEwzMl8zODYgW0NPTUNUTDMyLjM4Nl0KKyAqLworCitEV09SRCBXSU5BUEkKK0NPTUNUTDMyXzM4NiAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMykKK3sKKworICAgIEZJWE1FIChjb21tY3RybCwgIiglMDhseCwgJTA4bHgsICUwOGx4KTogZW1wdHkgc3R1YlxuIiwKKwkgICBkd1BhcmFtMSwgZHdQYXJhbTIsIGR3UGFyYW0zKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NQ1RMMzJfMzg3IFtDT01DVEwzMi4zODddCisgKi8KKworRFdPUkQgV0lOQVBJCitDT01DVEwzMl8zODcgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwgRFdPUkQgZHdQYXJhbTMpCit7CisKKyAgICBGSVhNRSAoY29tbWN0cmwsICIoJTA4bHgsICUwOGx4LCAlMDhseCk6IGVtcHR5IHN0dWJcbiIsCisJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1BhcmFtMyk7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTUNUTDMyXzM4OCBbQ09NQ1RMMzIuMzg4XQorICovCisKK0RXT1JEIFdJTkFQSQorQ09NQ1RMMzJfMzg4IChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsIERXT1JEIGR3UGFyYW0zKQoreworCisgICAgRklYTUUgKGNvbW1jdHJsLCAiKCUwOGx4LCAlMDhseCwgJTA4bHgpOiBlbXB0eSBzdHViXG4iLAorCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgZHdQYXJhbTMpOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RsbHMvY29tY3RsMzIvY29tbWN0cmwuYyBiL2RsbHMvY29tY3RsMzIvY29tbWN0cmwuYwppbmRleCAwYzZmMDBlLi5iMGI1YzdjIDEwMDY0NAotLS0gYS9kbGxzL2NvbWN0bDMyL2NvbW1jdHJsLmMKKysrIGIvZGxscy9jb21jdGwzMi9jb21tY3RybC5jCkBAIC0zMiwxMCArMzIsMTMgQEAKICAqIENvbUN0bDMyTGliTWFpbiBbSW50ZXJuYWxdIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCAnQ09NQ1RMMzIuRExMJy4KICAqCiAgKiBQQVJBTVMKLSAqICAgICBoaW5zdERMTCAgICBbSV0KKyAqICAgICBoaW5zdERMTCAgICBbSV0gaGFuZGxlIHRvIHRoZSAnZGxscycgaW5zdGFuY2UKICAqICAgICBmZHdSZWFzb24gICBbSV0KICAqICAgICBscHZSZXNlcnZlZCBbSV0KICAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogVFJVRQorICogICAgIEZhaWx1cmU6IEZBTFNFCiAgKi8KIAogQk9PTDMyIFdJTkFQSQpAQCAtNjgsNTkgKzcxLDY0IEBACiAgKiBNZW51SGVscCBbQ09NQ1RMMzIuMl0KICAqCiAgKiBQQVJBTVMKLSAqICAgICB1TXNnCi0gKiAgICAgd1BhcmFtCi0gKiAgICAgbFBhcmFtCi0gKiAgICAgaE1haW5NZW51Ci0gKiAgICAgaEluc3QKLSAqICAgICBod25kU3RhdHVzCi0gKiAgICAgbHB3SURzCisgKiAgICAgdU1zZyAgICAgICBbSV0KKyAqICAgICB3UGFyYW0gICAgIFtJXQorICogICAgIGxQYXJhbSAgICAgW0ldCisgKiAgICAgaE1haW5NZW51ICBbSV0gaGFuZGxlIHRvIHRoZSBhcHBsaWNhdGlvbnMgbWFpbiBtZW51CisgKiAgICAgaEluc3QgICAgICBbSV0KKyAqICAgICBod25kU3RhdHVzIFtJXSBoYW5kbGUgdG8gdGhlIHN0YXR1cyBiYXIgd2luZG93CisgKiAgICAgbHB3SURzICAgICBbSV0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbnRlcmdlcnMgKHNlZSBOT1RFUykKICAqCiAgKiBSRVRVUk5TCi0gKiAgICAgTm9uZQorICogICAgIE5vIHJldHVybiB2YWx1ZQogICoKICAqIE5PVEVTCi0gKiAgICAgU29tZSBmZWF0dXJlcyBhcmUgc3RpbGwgbWlzc2luZyBiZWNhdXNlIG9mIGluY29tcGxldGUgV01fTUVOVVNFTEVDVAotICogICAgIG1lc3NhZ2VzICgxNi0+MzIgYml0IGNvbnZlcnNpb24pLgorICogICAgIFRoZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGlzIGluY29tcGxldGUhCiAgKi8KIAogVk9JRCBXSU5BUEkKIE1lbnVIZWxwIChVSU5UMzIgdU1zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtLCBITUVOVTMyIGhNYWluTWVudSwKIAkgIEhJTlNUQU5DRTMyIGhJbnN0LCBIV05EMzIgaHduZFN0YXR1cywgTFBVSU5UMzIgbHB3SURzKQogewotICAgIGNoYXIgc3pTdGF0dXNUZXh0WzEyOF07CisgICAgVUlOVDMyIHVNZW51SUQgPSAwOwogCi0gICAgaWYgKCFJc1dpbmRvdzMyIChod25kU3RhdHVzKSkgcmV0dXJuOworICAgIGlmICghSXNXaW5kb3czMiAoaHduZFN0YXR1cykpCisJcmV0dXJuOwogCiAgICAgc3dpdGNoICh1TXNnKSB7CiAJY2FzZSBXTV9NRU5VU0VMRUNUOgotICAgICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiV01fTUVOVVNFTEVDVCB3UGFyYW09MHglWCBsUGFyYW09MHglbFhcbiIsCi0gICAgICAgICAgICAgICAgICAgd1BhcmFtLCBsUGFyYW0pOworCSAgICBUUkFDRSAoY29tbWN0cmwsICJXTV9NRU5VU0VMRUNUIHdQYXJhbT0weCVYIGxQYXJhbT0weCVsWFxuIiwKKwkJICAgd1BhcmFtLCBsUGFyYW0pOwogCiAgICAgICAgICAgICBpZiAoKEhJV09SRCh3UGFyYW0pID09IDB4RkZGRikgJiYgKGxQYXJhbSA9PSAwKSkgewogICAgICAgICAgICAgICAgIC8qIG1lbnUgd2FzIGNsb3NlZCAqLworCQlUUkFDRSAoY29tbWN0cmwsICJtZW51IHdhcyBjbG9zZWQhXG4iKTsKICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSAoaHduZFN0YXR1cywgU0JfU0lNUExFLCBGQUxTRSwgMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoSElXT1JEKHdQYXJhbSkgJiBNRl9QT1BVUCkgewotCQkgICAgRklYTUUgKGNvbW1jdHJsLCAicG9wdXAgMHglMDh4IDB4JTA4bHhcbiIsIHdQYXJhbSwgbFBhcmFtKTsKKwkgICAgZWxzZSB7CisJCS8qIG1lbnUgaXRlbSB3YXMgc2VsZWN0ZWQgKi8KKwkJaWYgKEhJV09SRCh3UGFyYW0pICYgTUZfUE9QVVApCisJCSAgICB1TWVudUlEID0gKFVJTlQzMikqKGxwd0lEcysxKTsKKwkJZWxzZQorCQkgICAgdU1lbnVJRCA9IChVSU5UMzIpTE9XT1JEKHdQYXJhbSk7CisJCVRSQUNFIChjb21tY3RybCwgInVNZW51SUQgPSAldVxuIiwgdU1lbnVJRCk7CiAKLSAgICAgICAgICAgICAgICAgICAgc3pTdGF0dXNUZXh0WzBdID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFRSQUNFIChjb21tY3RybCwgIm1lbnUgaXRlbSBzZWxlY3RlZCFcbiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIUxvYWRTdHJpbmczMkEgKGhJbnN0LCBMT1dPUkQod1BhcmFtKSwgc3pTdGF0dXNUZXh0LCAxMjgpKQotICAgICAgICAgICAgICAgICAgICAgICAgc3pTdGF0dXNUZXh0WzBdID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEgKGh3bmRTdGF0dXMsIFNCX1NFVFRFWFQzMkEsIDI1NSB8IFNCVF9OT0JPUkRFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pc3pTdGF0dXNUZXh0KTsKLSAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSAoaHduZFN0YXR1cywgU0JfU0lNUExFLCBUUlVFLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworCQlpZiAodU1lbnVJRCkgeworCQkgICAgQ0hBUiBzelRleHRbMjU2XTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgV0FSTiAoY29tbWN0cmwsICJJbnZhbGlkIE1lc3NhZ2UhXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOworCQkgICAgaWYgKCFMb2FkU3RyaW5nMzJBIChoSW5zdCwgdU1lbnVJRCwgc3pUZXh0LCAyNTYpKQorCQkJc3pUZXh0WzBdID0gMDsKKworCQkgICAgU2VuZE1lc3NhZ2UzMkEgKGh3bmRTdGF0dXMsIFNCX1NFVFRFWFQzMkEsCisJCQkJICAgIDI1NSB8IFNCVF9OT0JPUkRFUlMsIChMUEFSQU0pc3pUZXh0KTsKKwkJICAgIFNlbmRNZXNzYWdlMzJBIChod25kU3RhdHVzLCBTQl9TSU1QTEUsIFRSVUUsIDApOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBXQVJOIChjb21tY3RybCwgIkludmFsaWQgTWVzc2FnZSFcbiIpOworCSAgICBicmVhazsKICAgICB9CiB9CiAKQEAgLTE5OCwxMCArMjA2LDEwIEBACiAgKiAgICAgbHBJbmZvIFtJXSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGludGVnZXJzCiAgKgogICogUkVUVVJOUwotICogICAgIE5vbmUuCisgKiAgICAgTm8gcmV0dXJuIHZhbHVlLgogICoKICAqIE5PVEVTCi0gKgorICogICAgIFRoZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGlzIGluY29tcGxldGUhCiAgKi8KIAogVk9JRCBXSU5BUEkKQEAgLTI0NCw2ICsyNTIsOSBAQAogICogICAgIGxwcmMgIFtJXSBwb2ludGVyIHRvIGEgcmVjdGFuZ2xlCiAgKiAgICAgdGV4dCAgW0ldIHBvaW50ZXIgdG8gdGhlIHRleHQKICAqICAgICBzdHlsZSBbSV0gCisgKgorICogUkVUVVJOUworICogICAgIE5vIHJldHVybiB2YWx1ZS4KICAqLwogCiBWT0lEIFdJTkFQSQpAQCAtMjgxLDYgKzI5Miw5IEBACiAgKiAgICAgbHByYyAgW0ldIHBvaW50ZXIgdG8gYSByZWN0YW5nbGUKICAqICAgICB0ZXh0ICBbSV0gcG9pbnRlciB0byB0aGUgdGV4dAogICogICAgIHN0eWxlIFtJXSAKKyAqCisgKiBSRVRVUk5TCisgKiAgICAgTm8gcmV0dXJuIHZhbHVlLgogICovCiAKIFZPSUQgV0lOQVBJCkBAIC0yOTMsOCArMzA3LDE5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDcmVhdGVTdGF0dXNXaW5kb3czMkEgW0NPTUNUTDMyLjZdW0NPTUNUTDMyLjIxXQorICogQ3JlYXRlU3RhdHVzV2luZG93MzJBIFtDT01DVEwzMi42XVtDT01DVEwzMi4yMV0gQ3JlYXRlcyBhIHN0YXR1cyBiYXIKKyAqCisgKiBQQVJBTVMKKyAqICAgICBzdHlsZSAgW0ldCisgKiAgICAgdGV4dCAgIFtJXQorICogICAgIHBhcmVudCBbSV0gaGFuZGxlIHRvIHRoZSBwYXJlbnQgd2luZG93CisgKiAgICAgd2lkICAgIFtJXQorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBoYW5kbGUgdG8gdGhlIGNvbnRyb2wKKyAqICAgICBGYWlsdXJlOiAwCiAgKi8KKwogSFdORDMyIFdJTkFQSQogQ3JlYXRlU3RhdHVzV2luZG93MzJBIChJTlQzMiBzdHlsZSwgTFBDU1RSIHRleHQsIEhXTkQzMiBwYXJlbnQsIFVJTlQzMiB3aWQpCiB7CkBAIC0zMDYsMjAgKzMzMSw1MSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVN0YXR1c1dpbmRvdzMyVyAgIChDT01DVEwzMi4yMikKKyAqIENyZWF0ZVN0YXR1c1dpbmRvdzMyVyBbQ09NQ1RMMzIuMjJdIENyZWF0ZXMgYSBzdGF0dXMgYmFyIGNvbnRyb2wKKyAqCisgKiBQQVJBTVMKKyAqICAgICBzdHlsZSAgW0ldCisgKiAgICAgdGV4dCAgIFtJXQorICogICAgIHBhcmVudCBbSV0KKyAqICAgICB3aWQgICAgW0ldCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IGhhbmRsZSB0byB0aGUgY29udHJvbAorICogICAgIEZhaWx1cmU6IDAKICAqLwotSFdORDMyIFdJTkFQSSBDcmVhdGVTdGF0dXNXaW5kb3czMlcoIElOVDMyIHN0eWxlLCBMUENXU1RSIHRleHQsIEhXTkQzMiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHdpZCApCisKK0hXTkQzMiBXSU5BUEkKK0NyZWF0ZVN0YXR1c1dpbmRvdzMyVyAoSU5UMzIgc3R5bGUsIExQQ1dTVFIgdGV4dCwgSFdORDMyIHBhcmVudCwgVUlOVDMyIHdpZCkKIHsKLSAgICByZXR1cm4gQ3JlYXRlV2luZG93MzJXKChMUENXU1RSKVNUQVRVU0NMQVNTTkFNRTMyVywgdGV4dCwgc3R5bGUsIAorICAgIHJldHVybiBDcmVhdGVXaW5kb3czMlcoKExQQ1dTVFIpU1RBVFVTQ0xBU1NOQU1FMzJXLCB0ZXh0LCBzdHlsZSwKIAkJCSAgIENXX1VTRURFRkFVTFQzMiwgQ1dfVVNFREVGQVVMVDMyLAotCQkJICAgQ1dfVVNFREVGQVVMVDMyLCBDV19VU0VERUZBVUxUMzIsIAorCQkJICAgQ1dfVVNFREVGQVVMVDMyLCBDV19VU0VERUZBVUxUMzIsCiAJCQkgICBwYXJlbnQsIHdpZCwgMCwgMCk7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlVXBEb3duQ29udHJvbCAgKENPTUNUTDMyLjE2KQorICogQ3JlYXRlVXBEb3duQ29udHJvbCBbQ09NQ1RMMzIuMTZdIENyZWF0ZXMgYW4gVXAtRG93biBjb250cm9sCisgKgorICogUEFSQU1TCisgKiAgICAgc3R5bGUKKyAqICAgICB4CisgKiAgICAgeQorICogICAgIGN4CisgKiAgICAgY3kKKyAqICAgICBwYXJlbnQKKyAqICAgICBpZAorICogICAgIGluc3QKKyAqICAgICBidWRkeQorICogICAgIG1heFZhbCBbSV0KKyAqICAgICBtaW5WYWwgW0ldCisgKiAgICAgY3VyVmFsIFtJXQorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBoYW5kbGUgdG8gdGhlIGNvbnRyb2wKKyAqICAgICBGYWlsdXJlOiAwCiAgKi8KKwogSFdORDMyIFdJTkFQSQogQ3JlYXRlVXBEb3duQ29udHJvbCAoRFdPUkQgc3R5bGUsIElOVDMyIHgsIElOVDMyIHksIElOVDMyIGN4LCBJTlQzMiBjeSwKIAkJICAgICBIV05EMzIgcGFyZW50LCBJTlQzMiBpZCwgSElOU1RBTkNFMzIgaW5zdCwKQEAgLTM0NCw3ICs0MDAsMTAgQEAKICAqIFJlZ2lzdGVycyB0aGUgY29tbW9uIGNvbnRyb2xzLgogICoKICAqIFBBUkFNUwotICogICAgIE5vbmUuCisgKiAgICAgTm8gcGFyYW1ldGVycy4KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgTm8gcmV0dXJuIHZhbHVlcy4KICAqCiAgKiBOT1RFUwogICogICAgIFRoaXMgZnVuY3Rpb24gaXMganVzdCBhIGR1bW15LgpAQCAtMzY0LDcgKzQyMywxMSBAQAogICogUmVnaXN0ZXJzIHRoZSBjb21tb24gY29udHJvbHMuCiAgKgogICogUEFSQU1TCi0gKiAgICAgbHBJbml0Q3RybHMgW0ldIHBvaW50ZXIgdG8gYSBJTklUQ09NTU9OQ09OVFJPTFMgc3RydWN0dXJlLgorICogICAgIGxwSW5pdEN0cmxzIFtJXSBwb2ludGVyIHRvIGFuIElOSVRDT01NT05DT05UUk9MUyBzdHJ1Y3R1cmUuCisgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgICBGYWlsdXJlOiBGQUxTRQogICoKICAqIE5PVEVTCiAgKiAgICAgT25seSB0aGUgYWRkaXRpbmFsIGNvbW1vbiBjb250cm9scyBhcmUgcmVnaXN0ZXJlZCBieSB0aGlzIGZ1bmN0aW9uLgpAQCAtMzk5LDM3ICs0NjIsMzYgQEAKIAkgICAgY2FzZSBJQ0NfSE9US0VZX0NMQVNTOgogCQlicmVhazsKIAotICAgICAgLyogYWR2YW5jZWQgY2xhc3NlcyAtIG5vdCBpbmNsdWRlZCBpbiBXaW45NSAqLwotICAgICAgY2FzZSBJQ0NfREFURV9DTEFTU0VTOgotICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBtb250aCBjYWxlbmRhciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOwotICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBkYXRlIHBpY2tlciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOwotICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0aW1lIHBpY2tlciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOwotICAgICAgICBVUERPV05fUmVnaXN0ZXIgKCk7Ci0gICAgICAgIGJyZWFrOworCSAgICAvKiBhZHZhbmNlZCBjbGFzc2VzIC0gbm90IGluY2x1ZGVkIGluIFdpbjk1ICovCisJICAgIGNhc2UgSUNDX0RBVEVfQ0xBU1NFUzoKKwkJRklYTUUgKGNvbW1jdHJsLCAiTm8gbW9udGggY2FsZW5kYXIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKwkJRklYTUUgKGNvbW1jdHJsLCAiTm8gZGF0ZSBwaWNrZXIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKwkJRklYTUUgKGNvbW1jdHJsLCAiTm8gdGltZSBwaWNrZXIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKwkJYnJlYWs7CiAKLSAgICAgIGNhc2UgSUNDX1VTRVJFWF9DTEFTU0VTOgotCUNPTUJPRVhfUmVnaXN0ZXIgKCk7Ci0gICAgICAgIGJyZWFrOworCSAgICBjYXNlIElDQ19VU0VSRVhfQ0xBU1NFUzoKKwkJQ09NQk9FWF9SZWdpc3RlciAoKTsKKwkJYnJlYWs7CiAKLSAgICAgIGNhc2UgSUNDX0NPT0xfQ0xBU1NFUzoKLQlSRUJBUl9SZWdpc3RlciAoKTsKLSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgSUNDX0NPT0xfQ0xBU1NFUzoKKwkJUkVCQVJfUmVnaXN0ZXIgKCk7CisJCWJyZWFrOwogCi0gICAgICBjYXNlIElDQ19JTlRFUk5FVF9DTEFTU0VTOgotICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyBJUEFkZHJlc3MgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKLSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgSUNDX0lOVEVSTkVUX0NMQVNTRVM6CisJCUZJWE1FIChjb21tY3RybCwgIk5vIElQQWRkcmVzcyBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworCQlicmVhazsKIAotICAgICAgY2FzZSBJQ0NfUEFHRVNDUk9MTEVSX0NMQVNTOgotCVBBR0VSX1JlZ2lzdGVyICgpOwotICAgICAgICBicmVhazsKKwkgICAgY2FzZSBJQ0NfUEFHRVNDUk9MTEVSX0NMQVNTOgorCQlQQUdFUl9SZWdpc3RlciAoKTsKKwkJYnJlYWs7CiAKLSAgICAgIGNhc2UgSUNDX05BVElWRUZOVENUTF9DTEFTUzoKLSAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gbmF0aXZlIGZvbnQgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKLSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgSUNDX05BVElWRUZOVENUTF9DTEFTUzoKKwkJRklYTUUgKGNvbW1jdHJsLCAiTm8gbmF0aXZlIGZvbnQgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKwkJYnJlYWs7CiAKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIFdBUk4gKGNvbW1jdHJsLCAiVW5rbm93biBjbGFzcyEgZHdJQ0M9MHglbFhcbiIsIGR3TWFzayk7Ci0gICAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCQlXQVJOIChjb21tY3RybCwgIlVua25vd24gY2xhc3MhIGR3SUNDPTB4JWxYXG4iLCBkd01hc2spOworCQlicmVhazsKIAl9CiAgICAgfQogCkBAIC00MzgsMTAgKzUwMCwyNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ3JlYXRlVG9vbGJhckV4IFtDT01DVEwzMi4zMl0KKyAqIENyZWF0ZVRvb2xiYXJFeCBbQ09NQ1RMMzIuMzJdIENyZWF0ZXMgYSB0b29sIGJhciB3aW5kb3cKICAqCisgKiBQQVJBTVMKKyAqICAgICBod25kCisgKiAgICAgc3R5bGUKKyAqICAgICB3SUQKKyAqICAgICBuQml0bWFwcworICogICAgIGhCTUluc3QKKyAqICAgICB3Qk1JRAorICogICAgIGxwQnV0dG9ucworICogICAgIGlOdW1CdXR0b25zCisgKiAgICAgZHhCdXR0b24KKyAqICAgICBkeUJ1dHRvbgorICogICAgIGR4Qml0bWFwCisgKiAgICAgZHlCaXRtYXAKKyAqICAgICB1U3RydWN0U2l6ZQogICoKLSAqCisgKiBSRVRVUk5TCisgKiAgICAgU3VjY2VzczogaGFuZGxlIHRvIHRoZSB0b29sIGJhciBjb250cm9sCisgKiAgICAgRmFpbHVyZTogMAogICovCiAKIEhXTkQzMiBXSU5BUEkKQEAgLTYwMCwxMCArNjc4LDI0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDcmVhdGVUb29sYmFyIFtDT01DVEwzMi43XQorICogQ3JlYXRlVG9vbGJhciBbQ09NQ1RMMzIuN10gQ3JlYXRlcyBhIHRvb2wgYmFyIGNvbnRyb2wKICAqCisgKiBQQVJBTVMKKyAqICAgICBod25kCisgKiAgICAgc3R5bGUKKyAqICAgICB3SUQKKyAqICAgICBuQml0bWFwcworICogICAgIGhCTUluc3QKKyAqICAgICB3Qk1JRAorICogICAgIGxwQnV0dG9ucworICogICAgIGlOdW1CdXR0b25zCiAgKgorICogUkVUVVJOUworICogICAgIFN1Y2Nlc3M6IGhhbmRsZSB0byB0aGUgdG9vbCBiYXIgY29udHJvbAorICogICAgIEZhaWx1cmU6IDAKICAqCisgKiBOT1RFUworICogICAgIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbnMgYW55bW9yZS4gVXNlIENyZWF0ZVRvb2xiYXJFeCBpbnN0ZWFkLgogICovCiAKIEhXTkQzMiBXSU5BUEkKQEAgLTYyNSwyMiArNzE3LDI1IEBACiAgKiBQQVJBTVMKICAqICAgICBwZHZpIFtPXSBwb2ludGVyIHRvIHZlcnNpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlLgogICoKLSAqIFJFVVJOUworICogUkVUVVJOUwogICogICAgIFN1Y2Nlc3M6IFNfT0sKICAqICAgICBGYWlsdXJlOiBFX0lOVkFMSURBUkcKKyAqCisgKiBOT1RFUworICogICAgIFJldHVybnMgdmVyc2lvbiBvZiBhIGNvbWN0bDMyLmRsbCBmcm9tIElFNC4wMSBTUDEuCiAgKi8KIAogSFJFU1VMVCBXSU5BUEkKIENPTUNUTDMyX0RsbEdldFZlcnNpb24gKERMTFZFUlNJT05JTkZPICpwZHZpKQogewogICAgIGlmIChwZHZpLT5jYlNpemUgIT0gc2l6ZW9mKERMTFZFUlNJT05JTkZPKSkgewotICAgICAgICBXQVJOKHZlciwgIndyb25nIERMTFZFUlNJT05JTkZPIHNpemUgZnJvbSBhcHAiKTsKKyAgICAgICAgV0FSTiAoY29tbWN0cmwsICJ3cm9uZyBETExWRVJTSU9OSU5GTyBzaXplIGZyb20gYXBwIik7CiAJcmV0dXJuIEVfSU5WQUxJREFSRzsKICAgICB9CiAKICAgICBwZHZpLT5kd01ham9yVmVyc2lvbiA9IDQ7CiAgICAgcGR2aS0+ZHdNaW5vclZlcnNpb24gPSA3MjsKLSAgICBwZHZpLT5kd0J1aWxkTnVtYmVyID0gMjEwNjsKKyAgICBwZHZpLT5kd0J1aWxkTnVtYmVyID0gMzExMDsKICAgICBwZHZpLT5kd1BsYXRmb3JtSUQgPSAxOwogCiAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiJWx1LiVsdS4lbHUuJWx1XG4iLApkaWZmIC0tZ2l0IGEvZGxscy9jb21jdGwzMi9oZWFkZXIuYyBiL2RsbHMvY29tY3RsMzIvaGVhZGVyLmMKaW5kZXggODEzNTEyYy4uYTJkODZmYyAxMDA2NDQKLS0tIGEvZGxscy9jb21jdGwzMi9oZWFkZXIuYworKysgYi9kbGxzL2NvbWN0bDMyL2hlYWRlci5jCkBAIC01LDcgKzUsNyBAQAogICoKICAqICBUT0RPOgogICogICAtIEltYWdlbGlzdCBzdXBwb3J0IChwYXJ0aWFsbHkpLgotICogICAtIENhbGxiYWNrIGl0ZW1zLgorICogICAtIENhbGxiYWNrIGl0ZW1zICh1bmRlciBjb25zdHJ1Y3Rpb24pLgogICogICAtIE9yZGVyIGxpc3Qgc3VwcG9ydC4KICAqICAgLSBDb250cm9sIHNwZWNpZmljIGN1cnNvcnMgKG92ZXIgZGl2aWRlcnMpLgogICogICAtIEhvdHRyYWNrIHN1cHBvcnQgKHBhcnRpYWxseSkuCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImNvbW1jdHJsLmgiCiAjaW5jbHVkZSAiaGVhZGVyLmgiCi0jaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTQ0Niw3ICs0NDUsNyBAQAogSEVBREVSX1NlbmRIZWFkZXJOb3RpZnkgKFdORCAqd25kUHRyLCBVSU5UMzIgY29kZSwgSU5UMzIgaUl0ZW0pCiB7CiAgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOyAgIAotICAgIE5NSEVBREVSQSBubWhkcjsKKyAgICBOTUhFQURFUjMyQSBubWhkcjsKICAgICBIRElURU0zMkEgbm1pdGVtOwogCiAgICAgbm1oZHIuaGRyLmh3bmRGcm9tID0gd25kUHRyLT5od25kU2VsZjsKQEAgLTQ1NSwxMSArNDU0LDEzIEBACiAgICAgbm1oZHIuaUl0ZW0gPSBpSXRlbTsKICAgICBubWhkci5pQnV0dG9uID0gMDsKICAgICBubWhkci5waXRlbSA9ICZubWl0ZW07Ci0gICAgbm1pdGVtLm1hc2sgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzazsKKyAgICBubWl0ZW0ubWFzayA9IDA7CiAgICAgbm1pdGVtLmN4eSA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5jeHk7CiAgICAgbm1pdGVtLmhibSA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5oYm07Ci0gICAgbm1pdGVtLnBzelRleHQgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dDsKLSAgICBubWl0ZW0uY2NoVGV4dE1heCA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5jY2hUZXh0TWF4OworICAgIG5taXRlbS5wc3pUZXh0ID0gTlVMTDsKKyAgICBubWl0ZW0uY2NoVGV4dE1heCA9IDA7CisvLyAgICBubWl0ZW0ucHN6VGV4dCA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5wc3pUZXh0OworLy8gICAgbm1pdGVtLmNjaFRleHRNYXggPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uY2NoVGV4dE1heDsKICAgICBubWl0ZW0uZm10ID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmZtdDsKICAgICBubWl0ZW0ubFBhcmFtID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmxQYXJhbTsKICAgICBubWl0ZW0uaU9yZGVyID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlPcmRlcjsKQEAgLTQ3Myw3ICs0NzQsNyBAQAogc3RhdGljIEJPT0wzMgogSEVBREVSX1NlbmRDbGlja05vdGlmeSAoV05EICp3bmRQdHIsIFVJTlQzMiBjb2RlLCBJTlQzMiBpSXRlbSkKIHsKLSAgICBOTUhFQURFUkEgbm1oZHI7CisgICAgTk1IRUFERVIzMkEgbm1oZHI7CiAKICAgICBubWhkci5oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOwogICAgIG5taGRyLmhkci5pZEZyb20gPSB3bmRQdHItPndJRG1lbnU7CkBAIC00OTksMjEgKzUwMCwxOSBAQAogSEVBREVSX0RlbGV0ZUl0ZW0gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCiB7CiAgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIElOVDMyIGlJdGVtID0gKElOVDMyKXdQYXJhbTsKICAgICBIREMzMiBoZGM7Ci0gICAgSU5UMzIgaUl0ZW07Ci0KLSAgICBpSXRlbSA9IChJTlQzMil3UGFyYW07CiAKICAgICBUUkFDRShoZWFkZXIsICJbaUl0ZW09JWRdXG4iLCBpSXRlbSk7CiAgICAgCi0gICAgaWYgKChpSXRlbSA8IDApIHx8IChpSXRlbSA+IGluZm9QdHItPnVOdW1JdGVtIC0gMSkpCisgICAgaWYgKChpSXRlbSA8IDApIHx8IChpSXRlbSA+PSAoSU5UMzIpaW5mb1B0ci0+dU51bUl0ZW0pKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAoaW5mb1B0ci0+dU51bUl0ZW0gPT0gMSkgewogICAgICAgICBUUkFDRShoZWFkZXIsICJTaW1wbGUgZGVsZXRlIVxuIik7CiAgICAgICAgIGlmIChpbmZvUHRyLT5pdGVtc1swXS5wc3pUZXh0KQotICAgICAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT5pdGVtc1swXS5wc3pUZXh0KTsKLSAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT5pdGVtcyk7CisgICAgICAgICAgICBDT01DVEwzMl9GcmVlIChpbmZvUHRyLT5pdGVtc1swXS5wc3pUZXh0KTsKKyAgICAgICAgQ09NQ1RMMzJfRnJlZSAoaW5mb1B0ci0+aXRlbXMpOwogICAgICAgICBpbmZvUHRyLT5pdGVtcyA9IDA7CiAgICAgICAgIGluZm9QdHItPnVOdW1JdGVtID0gMDsKICAgICB9CkBAIC01MjIsMTEgKzUyMSwxMCBAQAogICAgICAgICBUUkFDRShoZWFkZXIsICJDb21wbGV4IGRlbGV0ZSEgW2lJdGVtPSVkXVxuIiwgaUl0ZW0pOwogCiAgICAgICAgIGlmIChpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCkKLSAgICAgICAgICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQpOworICAgICAgICAgICAgQ09NQ1RMMzJfRnJlZSAoaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQpOwogCiAgICAgICAgIGluZm9QdHItPnVOdW1JdGVtLS07Ci0gICAgICAgIGluZm9QdHItPml0ZW1zID0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoSEVBREVSX0lURU0pICogaW5mb1B0ci0+dU51bUl0ZW0pOworICAgICAgICBpbmZvUHRyLT5pdGVtcyA9IENPTUNUTDMyX0FsbG9jIChzaXplb2YgKEhFQURFUl9JVEVNKSAqIGluZm9QdHItPnVOdW1JdGVtKTsKICAgICAgICAgLyogcHJlIGRlbGV0ZSBjb3B5ICovCiAgICAgICAgIGlmIChpSXRlbSA+IDApIHsKICAgICAgICAgICAgIG1lbWNweSAoJmluZm9QdHItPml0ZW1zWzBdLCAmb2xkSXRlbXNbMF0sCkBAIC01MzksNyArNTM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKGluZm9QdHItPnVOdW1JdGVtIC0gaUl0ZW0pICogc2l6ZW9mKEhFQURFUl9JVEVNKSk7CiAgICAgICAgIH0KIAotICAgICAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIG9sZEl0ZW1zKTsKKyAgICAgICAgQ09NQ1RMMzJfRnJlZSAob2xkSXRlbXMpOwogICAgIH0KIAogICAgIEhFQURFUl9TZXRJdGVtQm91bmRzICh3bmRQdHIpOwpAQCAtNTY1LDYwICs1NjMsNDUgQEAKIEhFQURFUl9HZXRJdGVtMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKLSAgICBIRElURU0zMkEgKnBoZGk7Ci0gICAgSU5UMzIgICAgIGlJdGVtOwotICAgIFVJTlQzMiAgICB1TWFzazsKKyAgICBIRElURU0zMkEgICAqcGhkaSA9IChIRElURU0zMkEqKWxQYXJhbTsKKyAgICBJTlQzMiAgICAgICBuSXRlbSA9IChJTlQzMil3UGFyYW07CisgICAgSEVBREVSX0lURU0gKmxwSXRlbTsKIAotICAgIHBoZGkgPSAoSERJVEVNMzJBKilsUGFyYW07Ci0gICAgaUl0ZW0gPSAoSU5UMzIpd1BhcmFtOwotCi0gICAgaWYgKHBoZGkgPT0gTlVMTCkKKyAgICBpZiAoIXBoZGkpCiAJcmV0dXJuIEZBTFNFOwotICAgIGlmICgoaUl0ZW0gPCAwKSB8fCAoaUl0ZW0gPiBpbmZvUHRyLT51TnVtSXRlbSAtIDEpKQorICAgIGlmICgobkl0ZW0gPCAwKSB8fCAobkl0ZW0gPj0gKElOVDMyKWluZm9QdHItPnVOdW1JdGVtKSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgVFJBQ0UgKGhlYWRlciwgIltpSXRlbT0lZF1cbiIsIGlJdGVtKTsKKyAgICBUUkFDRSAoaGVhZGVyLCAiW25JdGVtPSVkXVxuIiwgbkl0ZW0pOwogCi0gICAgdU1hc2sgPSBwaGRpLT5tYXNrOwotICAgIGlmICh1TWFzayA9PSAwKQorICAgIGlmIChwaGRpLT5tYXNrID09IDApCiAJcmV0dXJuIFRSVUU7Ci0gICAgcGhkaS0+bWFzayA9IDA7CiAKLSAgICBpZiAodU1hc2sgJiBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAmIEhESV9CSVRNQVApIHsKLQlwaGRpLT5oYm0gPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaGJtOwotICAgICAgICBwaGRpLT5tYXNrIHw9IEhESV9CSVRNQVA7CisgICAgbHBJdGVtID0gKEhFQURFUl9JVEVNKikmaW5mb1B0ci0+aXRlbXNbbkl0ZW1dOworICAgIGlmIChwaGRpLT5tYXNrICYgSERJX0JJVE1BUCkKKwlwaGRpLT5oYm0gPSBscEl0ZW0tPmhibTsKKworICAgIGlmIChwaGRpLT5tYXNrICYgSERJX0ZPUk1BVCkKKwlwaGRpLT5mbXQgPSBscEl0ZW0tPmZtdDsKKworICAgIGlmIChwaGRpLT5tYXNrICYgSERJX1dJRFRIKQorCXBoZGktPmN4eSA9IGxwSXRlbS0+Y3h5OworCisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfTFBBUkFNKQorCXBoZGktPmxQYXJhbSA9IGxwSXRlbS0+bFBhcmFtOworCisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfVEVYVCkgeworCWlmIChscEl0ZW0tPnBzelRleHQgIT0gTFBTVFJfVEVYVENBTExCQUNLMzJBKQorCSAgICBsc3RyY3B5bjMyQSAocGhkaS0+cHN6VGV4dCwgbHBJdGVtLT5wc3pUZXh0LCBwaGRpLT5jY2hUZXh0TWF4KTsKKwllbHNlCisJICAgIHBoZGktPnBzelRleHQgPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkE7CiAgICAgfQogCi0gICAgaWYgKHVNYXNrICYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgJiBIRElfRk9STUFUKSB7Ci0JcGhkaS0+Zm10ID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmZtdDsKLSAgICAgICAgcGhkaS0+bWFzayB8PSBIRElfRk9STUFUOwotICAgIH0KKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9JTUFHRSkKKwlwaGRpLT5pSW1hZ2UgPSBscEl0ZW0tPmlJbWFnZTsKIAotICAgIGlmICh1TWFzayAmIGluZm9QdHItPml0ZW1zW2lJdGVtXS5tYXNrICYgSERJX1dJRFRIKSB7Ci0JcGhkaS0+Y3h5ID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmN4eTsKLSAgICAgICAgcGhkaS0+bWFzayB8PSBIRElfV0lEVEg7Ci0gICAgfQotCi0gICAgaWYgKHVNYXNrICYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgJiBIRElfTFBBUkFNKSB7Ci0JcGhkaS0+bFBhcmFtID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmxQYXJhbTsKLSAgICAgICAgcGhkaS0+bWFzayB8PSBIRElfTFBBUkFNOwotICAgIH0KLQotICAgIGlmICh1TWFzayAmIGluZm9QdHItPml0ZW1zW2lJdGVtXS5tYXNrICYgSERJX1RFWFQpIHsKLQlwaGRpLT5wc3pUZXh0ID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQ7Ci0JcGhkaS0+Y2NoVGV4dE1heCA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5jY2hUZXh0TWF4OwotICAgICAgICBwaGRpLT5tYXNrIHw9IEhESV9URVhUOwotICAgIH0KLQotICAgIGlmICh1TWFzayAmIGluZm9QdHItPml0ZW1zW2lJdGVtXS5tYXNrICYgSERJX0lNQUdFKSB7Ci0JcGhkaS0+aUltYWdlID0gaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlJbWFnZTsKLSAgICAgICAgcGhkaS0+bWFzayB8PSBIRElfSU1BR0U7Ci0gICAgfQotCi0gICAgaWYgKHVNYXNrICYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLm1hc2sgJiBIRElfT1JERVIpIHsKLQlwaGRpLT5pT3JkZXIgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaU9yZGVyOwotICAgICAgICBwaGRpLT5tYXNrIHw9IEhESV9PUkRFUjsKLSAgICB9CisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfT1JERVIpCisJcGhkaS0+aU9yZGVyID0gbHBJdGVtLT5pT3JkZXI7CiAKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTYzNywxMyArNjIwLDEwIEBACiBIRUFERVJfR2V0SXRlbVJlY3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIElOVDMyIGlJdGVtOwotICAgIExQUkVDVDMyIGxwUmVjdDsKKyAgICBJTlQzMiBpSXRlbSA9IChJTlQzMil3UGFyYW07CisgICAgTFBSRUNUMzIgbHBSZWN0ID0gKExQUkVDVDMyKWxQYXJhbTsKIAotICAgIGlJdGVtID0gKElOVDMyKXdQYXJhbTsKLSAgICBscFJlY3QgPSAoTFBSRUNUMzIpbFBhcmFtOwotCi0gICAgaWYgKChpSXRlbSA8IDApIHx8IChpSXRlbSA+IGluZm9QdHItPnVOdW1JdGVtIC0gMSkpCisgICAgaWYgKChpSXRlbSA8IDApIHx8IChpSXRlbSA+PSAoSU5UMzIpaW5mb1B0ci0+dU51bUl0ZW0pKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBscFJlY3QtPmxlZnQgICA9IGluZm9QdHItPml0ZW1zW2lJdGVtXS5yZWN0LmxlZnQ7CkBAIC02NzAsNzAgKzY1MCw3MiBAQAogSEVBREVSX0luc2VydEl0ZW0zMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgSEVBREVSX0lORk8gKmluZm9QdHIgPSBIRUFERVJfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIEhESVRFTTMyQSAqcGhkaSA9IChIRElURU0zMkEqKWxQYXJhbTsKLSAgICBJTlQzMiAgICAgaUl0ZW0gPSAoSU5UMzIpd1BhcmFtOwotICAgIEhEQzMyICAgICBoZGM7Ci0gICAgSU5UMzIgICAgIGxlbjsKKyAgICBIRElURU0zMkEgICAqcGhkaSA9IChIRElURU0zMkEqKWxQYXJhbTsKKyAgICBJTlQzMiAgICAgICBuSXRlbSA9IChJTlQzMil3UGFyYW07CisgICAgSEVBREVSX0lURU0gKmxwSXRlbTsKKyAgICBIREMzMiAgICAgICBoZGM7CisgICAgSU5UMzIgICAgICAgbGVuOwogCi0gICAgaWYgKHBoZGkgPT0gTlVMTCkgcmV0dXJuIC0xOwotICAgIGlmIChpSXRlbSA8IDApIHJldHVybiAtMTsKLSAgICBpZiAoaUl0ZW0gPiBpbmZvUHRyLT51TnVtSXRlbSkKLSAgICAgICAgaUl0ZW0gPSBpbmZvUHRyLT51TnVtSXRlbTsKKyAgICBpZiAoKHBoZGkgPT0gTlVMTCkgfHwgKG5JdGVtIDwgMCkpCisJcmV0dXJuIC0xOworCisgICAgaWYgKG5JdGVtID4gaW5mb1B0ci0+dU51bUl0ZW0pCisgICAgICAgIG5JdGVtID0gaW5mb1B0ci0+dU51bUl0ZW07CiAKICAgICBpZiAoaW5mb1B0ci0+dU51bUl0ZW0gPT0gMCkgewotICAgICAgICBpbmZvUHRyLT5pdGVtcyA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKEhFQURFUl9JVEVNKSk7CisgICAgICAgIGluZm9QdHItPml0ZW1zID0gQ09NQ1RMMzJfQWxsb2MgKHNpemVvZiAoSEVBREVSX0lURU0pKTsKICAgICAgICAgaW5mb1B0ci0+dU51bUl0ZW0rKzsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIEhFQURFUl9JVEVNICpvbGRJdGVtcyA9IGluZm9QdHItPml0ZW1zOwogCiAgICAgICAgIGluZm9QdHItPnVOdW1JdGVtKys7Ci0gICAgICAgIGluZm9QdHItPml0ZW1zID0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoSEVBREVSX0lURU0pICogaW5mb1B0ci0+dU51bUl0ZW0pOworICAgICAgICBpbmZvUHRyLT5pdGVtcyA9IENPTUNUTDMyX0FsbG9jIChzaXplb2YgKEhFQURFUl9JVEVNKSAqIGluZm9QdHItPnVOdW1JdGVtKTsKICAgICAgICAgLyogcHJlIGluc2VydCBjb3B5ICovCi0gICAgICAgIGlmIChpSXRlbSA+IDApIHsKKyAgICAgICAgaWYgKG5JdGVtID4gMCkgewogICAgICAgICAgICAgbWVtY3B5ICgmaW5mb1B0ci0+aXRlbXNbMF0sICZvbGRJdGVtc1swXSwKLSAgICAgICAgICAgICAgICAgICAgaUl0ZW0gKiBzaXplb2YoSEVBREVSX0lURU0pKTsKKyAgICAgICAgICAgICAgICAgICAgbkl0ZW0gKiBzaXplb2YoSEVBREVSX0lURU0pKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIHBvc3QgaW5zZXJ0IGNvcHkgKi8KLSAgICAgICAgaWYgKGlJdGVtIDwgaW5mb1B0ci0+dU51bUl0ZW0gLSAxKSB7Ci0gICAgICAgICAgICBtZW1jcHkgKCZpbmZvUHRyLT5pdGVtc1tpSXRlbSsxXSwgJm9sZEl0ZW1zW2lJdGVtXSwKLSAgICAgICAgICAgICAgICAgICAgKGluZm9QdHItPnVOdW1JdGVtIC0gaUl0ZW0pICogc2l6ZW9mKEhFQURFUl9JVEVNKSk7CisgICAgICAgIGlmIChuSXRlbSA8IGluZm9QdHItPnVOdW1JdGVtIC0gMSkgeworICAgICAgICAgICAgbWVtY3B5ICgmaW5mb1B0ci0+aXRlbXNbbkl0ZW0rMV0sICZvbGRJdGVtc1tuSXRlbV0sCisgICAgICAgICAgICAgICAgICAgIChpbmZvUHRyLT51TnVtSXRlbSAtIG5JdGVtKSAqIHNpemVvZihIRUFERVJfSVRFTSkpOwogICAgICAgICB9CiAKLSAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBvbGRJdGVtcyk7CisJQ09NQ1RMMzJfRnJlZSAob2xkSXRlbXMpOwogICAgIH0KIAotICAgIGluZm9QdHItPml0ZW1zW2lJdGVtXS5iRG93biA9IEZBTFNFOworICAgIGxwSXRlbSA9IChIRUFERVJfSVRFTSopJmluZm9QdHItPml0ZW1zW25JdGVtXTsKKyAgICBscEl0ZW0tPmJEb3duID0gRkFMU0U7CiAKLSAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayA9IHBoZGktPm1hc2s7CiAgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfV0lEVEgpCi0gICAgICAgIGluZm9QdHItPml0ZW1zW2lJdGVtXS5jeHkgPSBwaGRpLT5jeHk7CisJbHBJdGVtLT5jeHkgPSBwaGRpLT5jeHk7CiAKICAgICBpZiAocGhkaS0+bWFzayAmIEhESV9URVhUKSB7Ci0gICAgICAgIGxlbiA9IGxzdHJsZW4zMkEgKHBoZGktPnBzelRleHQpOwotICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCA9Ci0gICAgICAgICAgICBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4rMSk7Ci0gICAgICAgIGxzdHJjcHkzMkEgKGluZm9QdHItPml0ZW1zW2lJdGVtXS5wc3pUZXh0LCBwaGRpLT5wc3pUZXh0KTsKLSAgICAgICAgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmNjaFRleHRNYXggPSBwaGRpLT5jY2hUZXh0TWF4OworCWlmIChwaGRpLT5wc3pUZXh0ICE9IExQU1RSX1RFWFRDQUxMQkFDSzMyQSkgeworCSAgICBsZW4gPSBsc3RybGVuMzJBIChwaGRpLT5wc3pUZXh0KTsKKwkgICAgbHBJdGVtLT5wc3pUZXh0ID0gQ09NQ1RMMzJfQWxsb2MgKGxlbisxKTsKKwkgICAgbHN0cmNweTMyQSAobHBJdGVtLT5wc3pUZXh0LCBwaGRpLT5wc3pUZXh0KTsKKwl9CisJZWxzZQorCSAgICBscEl0ZW0tPnBzelRleHQgPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkE7CiAgICAgfQogCiAgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfRk9STUFUKQotICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uZm10ID0gcGhkaS0+Zm10OworCWxwSXRlbS0+Zm10ID0gcGhkaS0+Zm10OwogCiAgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfQklUTUFQKQotICAgICAgICBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaGJtID0gcGhkaS0+aGJtOworICAgICAgICBscEl0ZW0tPmhibSA9IHBoZGktPmhibTsKIAogICAgIGlmIChwaGRpLT5tYXNrICYgSERJX0xQQVJBTSkKLSAgICAgICAgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmxQYXJhbSA9IHBoZGktPmxQYXJhbTsKKyAgICAgICAgbHBJdGVtLT5sUGFyYW0gPSBwaGRpLT5sUGFyYW07CiAKICAgICBpZiAocGhkaS0+bWFzayAmIEhESV9JTUFHRSkKLSAgICAgICAgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlJbWFnZSA9IHBoZGktPmlJbWFnZTsKKyAgICAgICAgbHBJdGVtLT5pSW1hZ2UgPSBwaGRpLT5pSW1hZ2U7CiAKICAgICBpZiAocGhkaS0+bWFzayAmIEhESV9PUkRFUikKLSAgICAgICAgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlPcmRlciA9IHBoZGktPmlPcmRlcjsKKyAgICAgICAgbHBJdGVtLT5pT3JkZXIgPSBwaGRpLT5pT3JkZXI7CiAKICAgICBIRUFERVJfU2V0SXRlbUJvdW5kcyAod25kUHRyKTsKIApAQCAtNzQxLDcgKzcyMyw3IEBACiAgICAgSEVBREVSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKICAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKIAotICAgIHJldHVybiBpSXRlbTsKKyAgICByZXR1cm4gbkl0ZW07CiB9CiAKIApAQCAtNzk4LDYwICs3ODAsNTIgQEAKIHsKICAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CiAgICAgSERJVEVNMzJBICpwaGRpID0gKEhESVRFTTMyQSopbFBhcmFtOwotICAgIElOVDMyIGlJdGVtID0gKElOVDMyKXdQYXJhbTsKKyAgICBJTlQzMiBuSXRlbSA9IChJTlQzMil3UGFyYW07CisgICAgSEVBREVSX0lURU0gKmxwSXRlbTsKICAgICBIREMzMiBoZGM7CiAKICAgICBpZiAocGhkaSA9PSBOVUxMKQogCXJldHVybiBGQUxTRTsKLSAgICBpZiAoKGlJdGVtIDwgMCkgfHwgKGlJdGVtID4gaW5mb1B0ci0+dU51bUl0ZW0gLSAxKSkKKyAgICBpZiAoKG5JdGVtIDwgMCkgfHwgKG5JdGVtID49IChJTlQzMilpbmZvUHRyLT51TnVtSXRlbSkpCiAgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIFRSQUNFIChoZWFkZXIsICJbaUl0ZW09JWRdXG4iLCBpSXRlbSk7CisgICAgVFJBQ0UgKGhlYWRlciwgIltuSXRlbT0lZF1cbiIsIG5JdGVtKTsKIAotICAgIGlmIChIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTUNIQU5HSU5HMzJBLCBpSXRlbSkpCisgICAgaWYgKEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNQ0hBTkdJTkczMkEsIG5JdGVtKSkKIAlyZXR1cm4gRkFMU0U7CiAKLSAgICBpZiAocGhkaS0+bWFzayAmIEhESV9CSVRNQVApIHsKLQlpbmZvUHRyLT5pdGVtc1tpSXRlbV0uaGJtID0gcGhkaS0+aGJtOwotCWluZm9QdHItPml0ZW1zW2lJdGVtXS5tYXNrICB8PSBIRElfQklUTUFQOwotICAgIH0KKyAgICBscEl0ZW0gPSAoSEVBREVSX0lURU0qKSZpbmZvUHRyLT5pdGVtc1tuSXRlbV07CisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfQklUTUFQKQorCWxwSXRlbS0+aGJtID0gcGhkaS0+aGJtOwogCi0gICAgaWYgKHBoZGktPm1hc2sgJiBIRElfRk9STUFUKSB7Ci0JaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmZtdCA9IHBoZGktPmZtdDsKLQlpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAgfD0gSERJX0ZPUk1BVDsKLSAgICB9CisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfRk9STUFUKQorCWxwSXRlbS0+Zm10ID0gcGhkaS0+Zm10OwogCi0gICAgaWYgKHBoZGktPm1hc2sgJiBIRElfTFBBUkFNKSB7Ci0JaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmxQYXJhbSA9IHBoZGktPmxQYXJhbTsKLQlpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAgfD0gSERJX0xQQVJBTTsKLSAgICB9CisgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfTFBBUkFNKQorCWxwSXRlbS0+bFBhcmFtID0gcGhkaS0+bFBhcmFtOwogCiAgICAgaWYgKHBoZGktPm1hc2sgJiBIRElfVEVYVCkgewotICAgICAgICBJTlQzMiBsZW4gPSBsc3RybGVuMzJBIChwaGRpLT5wc3pUZXh0KTsKLSAgICAgICAgaWYgKGluZm9QdHItPml0ZW1zW2lJdGVtXS5wc3pUZXh0KQotCSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGluZm9QdHItPml0ZW1zW2lJdGVtXS5wc3pUZXh0KTsKLSAgICAgICAgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQgPQotICAgICAgICAgICAgSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbGVuKzEpOwotICAgICAgICBsc3RyY3B5MzJBIChpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCwgcGhkaS0+cHN6VGV4dCk7Ci0gICAgICAgIGluZm9QdHItPml0ZW1zW2lJdGVtXS5jY2hUZXh0TWF4ID0gcGhkaS0+Y2NoVGV4dE1heDsKKwlpZiAocGhkaS0+cHN6VGV4dCAhPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpIHsKKwkgICAgSU5UMzIgbGVuID0gbHN0cmxlbjMyQSAocGhkaS0+cHN6VGV4dCk7CisJICAgIGlmIChscEl0ZW0tPnBzelRleHQpCisJCUNPTUNUTDMyX0ZyZWUgKGxwSXRlbS0+cHN6VGV4dCk7CisJICAgIGxwSXRlbS0+cHN6VGV4dCA9IENPTUNUTDMyX0FsbG9jIChsZW4rMSk7CisJICAgIGxzdHJjcHkzMkEgKGxwSXRlbS0+cHN6VGV4dCwgcGhkaS0+cHN6VGV4dCk7CisJfQorCWVsc2UKKwkgICAgbHBJdGVtLT5wc3pUZXh0ID0gTFBTVFJfVEVYVENBTExCQUNLMzJBOwogICAgIH0KIAotICAgIGlmIChwaGRpLT5tYXNrICYgSERJX1dJRFRIKSB7Ci0JaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmN4eSA9IHBoZGktPmN4eTsKLQlpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAgfD0gSERJX1dJRFRIOwotICAgIH0KKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9XSURUSCkKKwlscEl0ZW0tPmN4eSA9IHBoZGktPmN4eTsKIAotICAgIGlmIChwaGRpLT5tYXNrICYgSERJX0lNQUdFKSB7Ci0JaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlJbWFnZSA9IHBoZGktPmlJbWFnZTsKLQlpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAgfD0gSERJX0lNQUdFOwotICAgIH0KKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9JTUFHRSkKKwlscEl0ZW0tPmlJbWFnZSA9IHBoZGktPmlJbWFnZTsKIAotICAgIGlmIChwaGRpLT5tYXNrICYgSERJX09SREVSKSB7Ci0JaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmlPcmRlciA9IHBoZGktPmlPcmRlcjsKLQlpbmZvUHRyLT5pdGVtc1tpSXRlbV0ubWFzayAgfD0gSERJX09SREVSOwotICAgIH0KKyAgICBpZiAocGhkaS0+bWFzayAmIEhESV9PUkRFUikKKwlscEl0ZW0tPmlPcmRlciA9IHBoZGktPmlPcmRlcjsKIAotICAgIEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNQ0hBTkdFRDMyQSwgaUl0ZW0pOworICAgIEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNQ0hBTkdFRDMyQSwgbkl0ZW0pOwogCiAgICAgSEVBREVSX1NldEl0ZW1Cb3VuZHMgKHduZFB0cik7CiAgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CkBAIC04NzAsOCArODQ0LDcgQEAKICAgICBIRk9OVDMyIGhPbGRGb250OwogICAgIEhEQzMyICAgaGRjOwogCi0gICAgaW5mb1B0ciA9IChIRUFERVJfSU5GTyAqKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl9JTkZPKSk7CisgICAgaW5mb1B0ciA9IChIRUFERVJfSU5GTyAqKUNPTUNUTDMyX0FsbG9jIChzaXplb2YoSEVBREVSX0lORk8pKTsKICAgICB3bmRQdHItPndFeHRyYVswXSA9IChEV09SRClpbmZvUHRyOwogCiAgICAgaW5mb1B0ci0+dU51bUl0ZW0gPSAwOwpAQCAtOTAyLDI2ICs4NzUsMjggQEAKIEhFQURFUl9EZXN0cm95IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKLSAgICBJTlQzMiBpSXRlbTsKKyAgICBIRUFERVJfSVRFTSAqbHBJdGVtOworICAgIElOVDMyIG5JdGVtOwogCiAgICAgaWYgKGluZm9QdHItPml0ZW1zKSB7Ci0gICAgICAgIGZvciAoaUl0ZW0gPSAwOyBpSXRlbSA8IGluZm9QdHItPnVOdW1JdGVtOyBpSXRlbSsrKSB7Ci0gICAgICAgICAgICBpZiAoaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLnBzelRleHQpCi0gICAgICAgICAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucHN6VGV4dCk7CisJbHBJdGVtID0gKEhFQURFUl9JVEVNKilpbmZvUHRyLT5pdGVtczsKKyAgICAgICAgZm9yIChuSXRlbSA9IDA7IG5JdGVtIDwgaW5mb1B0ci0+dU51bUl0ZW07IG5JdGVtKyssIGxwSXRlbSsrKSB7CisJICAgIGlmICgobHBJdGVtLT5wc3pUZXh0KSAmJiAobHBJdGVtLT5wc3pUZXh0ICE9IExQU1RSX1RFWFRDQUxMQkFDSzMyQSkpCisJCUNPTUNUTDMyX0ZyZWUgKGxwSXRlbS0+cHN6VGV4dCk7CiAgICAgICAgIH0KLSAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT5pdGVtcyk7CisgICAgICAgIENPTUNUTDMyX0ZyZWUgKGluZm9QdHItPml0ZW1zKTsKICAgICB9CiAKICAgICBpZiAoaW5mb1B0ci0+aGltbCkKIAlJbWFnZUxpc3RfRGVzdHJveSAoaW5mb1B0ci0+aGltbCk7CiAKLSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGluZm9QdHIpOworICAgIENPTUNUTDMyX0ZyZWUgKGluZm9QdHIpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIExSRVNVTFQKK3N0YXRpYyBfX2lubGluZV9fIExSRVNVTFQKIEhFQURFUl9HZXRGb250IChXTkQgKnduZFB0cikKIHsKICAgICBIRUFERVJfSU5GTyAqaW5mb1B0ciA9IEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cik7CkBAIC05MzUsMTYgKzkxMCwxNiBAQAogewogICAgIFBPSU5UMzIgcHQ7CiAgICAgVUlOVDMyICBmbGFnczsKLSAgICBJTlQzMiAgIGlJdGVtOworICAgIElOVDMyICAgbkl0ZW07CiAKICAgICBwdC54ID0gKElOVDMyKUxPV09SRChsUGFyYW0pOyAKICAgICBwdC55ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOwotICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZpSXRlbSk7CisgICAgSEVBREVSX0ludGVybmFsSGl0VGVzdCAod25kUHRyLCAmcHQsICZmbGFncywgJm5JdGVtKTsKIAogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgSERTX0JVVFRPTlMpICYmIChmbGFncyA9PSBISFRfT05IRUFERVIpKQotCUhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9JVEVNREJMQ0xJQ0szMkEsIGlJdGVtKTsKKwlIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTURCTENMSUNLMzJBLCBuSXRlbSk7CiAgICAgZWxzZSBpZiAoKGZsYWdzID09IEhIVF9PTkRJVklERVIpIHx8IChmbGFncyA9PSBISFRfT05ESVZPUEVOKSkKLQlIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fRElWSURFUkRCTENMSUNLMzJBLCBpSXRlbSk7CisJSEVBREVSX1NlbmRIZWFkZXJOb3RpZnkgKHduZFB0ciwgSEROX0RJVklERVJEQkxDTElDSzMyQSwgbkl0ZW0pOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC05NTYsNDUgKzkzMSw0NSBAQAogICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKICAgICBQT0lOVDMyIHB0OwogICAgIFVJTlQzMiAgZmxhZ3M7Ci0gICAgSU5UMzIgICBpSXRlbTsKKyAgICBJTlQzMiAgIG5JdGVtOwogICAgIEhEQzMyICAgaGRjOwogCiAgICAgcHQueCA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsgCiAgICAgcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKLSAgICBIRUFERVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsICZwdCwgJmZsYWdzLCAmaUl0ZW0pOworICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZuSXRlbSk7CiAKICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIEhEU19CVVRUT05TKSAmJiAoZmxhZ3MgPT0gSEhUX09OSEVBREVSKSkgewogCVNldENhcHR1cmUzMiAod25kUHRyLT5od25kU2VsZik7CiAJaW5mb1B0ci0+YkNhcHR1cmVkID0gVFJVRTsgICAKIAlpbmZvUHRyLT5iUHJlc3NlZCAgPSBUUlVFOwotCWluZm9QdHItPmlNb3ZlSXRlbSA9IGlJdGVtOworCWluZm9QdHItPmlNb3ZlSXRlbSA9IG5JdGVtOwogCi0JaW5mb1B0ci0+aXRlbXNbaUl0ZW1dLmJEb3duID0gVFJVRTsKKwlpbmZvUHRyLT5pdGVtc1tuSXRlbV0uYkRvd24gPSBUUlVFOwogCiAJLyogU2VuZCBXTV9DVVNUT01EUkFXICovCiAJaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7Ci0JSEVBREVSX1JlZnJlc2hJdGVtICh3bmRQdHIsIGhkYywgaUl0ZW0pOworCUhFQURFUl9SZWZyZXNoSXRlbSAod25kUHRyLCBoZGMsIG5JdGVtKTsKIAlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKIAotCVRSQUNFIChoZWFkZXIsICJQcmVzc2VkIGl0ZW0gJWQhXG4iLCBpSXRlbSk7CisJVFJBQ0UgKGhlYWRlciwgIlByZXNzZWQgaXRlbSAlZCFcbiIsIG5JdGVtKTsKICAgICB9IAogICAgIGVsc2UgaWYgKChmbGFncyA9PSBISFRfT05ESVZJREVSKSB8fCAoZmxhZ3MgPT0gSEhUX09ORElWT1BFTikpIHsKLQlpZiAoIShIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fQkVHSU5UUkFDSzMyQSwgaUl0ZW0pKSkgeworCWlmICghKEhFQURFUl9TZW5kSGVhZGVyTm90aWZ5ICh3bmRQdHIsIEhETl9CRUdJTlRSQUNLMzJBLCBuSXRlbSkpKSB7CiAJICAgIFNldENhcHR1cmUzMiAod25kUHRyLT5od25kU2VsZik7CiAJICAgIGluZm9QdHItPmJDYXB0dXJlZCA9IFRSVUU7ICAgCiAJICAgIGluZm9QdHItPmJUcmFja2luZyA9IFRSVUU7Ci0JICAgIGluZm9QdHItPmlNb3ZlSXRlbSA9IGlJdGVtOwotCSAgICBpbmZvUHRyLT5uT2xkV2lkdGggPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0uY3h5OwotCSAgICBpbmZvUHRyLT54VHJhY2tPZmZzZXQgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucmVjdC5yaWdodCAtIHB0Lng7CisJICAgIGluZm9QdHItPmlNb3ZlSXRlbSA9IG5JdGVtOworCSAgICBpbmZvUHRyLT5uT2xkV2lkdGggPSBpbmZvUHRyLT5pdGVtc1tuSXRlbV0uY3h5OworCSAgICBpbmZvUHRyLT54VHJhY2tPZmZzZXQgPSBpbmZvUHRyLT5pdGVtc1tuSXRlbV0ucmVjdC5yaWdodCAtIHB0Lng7CiAKIAkgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgSERTX0ZVTExEUkFHKSkgewotCQlpbmZvUHRyLT54T2xkVHJhY2sgPSBpbmZvUHRyLT5pdGVtc1tpSXRlbV0ucmVjdC5yaWdodDsKKwkJaW5mb1B0ci0+eE9sZFRyYWNrID0gaW5mb1B0ci0+aXRlbXNbbkl0ZW1dLnJlY3QucmlnaHQ7CiAJCWhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOwogCQlIRUFERVJfRHJhd1RyYWNrTGluZSAod25kUHRyLCBoZGMsIGluZm9QdHItPnhPbGRUcmFjayk7CiAJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogCSAgICB9CiAKLQkgICAgVFJBQ0UgKGhlYWRlciwgIkJlZ2luIHRyYWNraW5nIGl0ZW0gJWQhXG4iLCBpSXRlbSk7CisJICAgIFRSQUNFIChoZWFkZXIsICJCZWdpbiB0cmFja2luZyBpdGVtICVkIVxuIiwgbkl0ZW0pOwogCX0KICAgICB9CiAKQEAgLTEwMDgsMTUgKzk4MywxNSBAQAogICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKICAgICBQT0lOVDMyIHB0OwogICAgIFVJTlQzMiAgZmxhZ3M7Ci0gICAgSU5UMzIgICBpSXRlbSwgbldpZHRoOworICAgIElOVDMyICAgbkl0ZW0sIG5XaWR0aDsKICAgICBIREMzMiAgIGhkYzsKIAogICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CiAgICAgcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKLSAgICBIRUFERVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsICZwdCwgJmZsYWdzLCAmaUl0ZW0pOworICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZuSXRlbSk7CiAKICAgICBpZiAoaW5mb1B0ci0+YlByZXNzZWQpIHsKLQlpZiAoKGlJdGVtID09IGluZm9QdHItPmlNb3ZlSXRlbSkgJiYgKGZsYWdzID09IEhIVF9PTkhFQURFUikpIHsKKwlpZiAoKG5JdGVtID09IGluZm9QdHItPmlNb3ZlSXRlbSkgJiYgKGZsYWdzID09IEhIVF9PTkhFQURFUikpIHsKIAkgICAgaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXS5iRG93biA9IEZBTFNFOwogCSAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKIAkgICAgSEVBREVSX1JlZnJlc2hJdGVtICh3bmRQdHIsIGhkYywgaW5mb1B0ci0+aU1vdmVJdGVtKTsKQEAgLTEwNDAsOCArMTAxNSw3IEBACiAJICAgIGlmIChIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTUNIQU5HSU5HMzJBLCBpbmZvUHRyLT5pTW92ZUl0ZW0pKQogCQlpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5pTW92ZUl0ZW1dLmN4eSA9IGluZm9QdHItPm5PbGRXaWR0aDsKIAkgICAgZWxzZSB7Ci0JCW5XaWR0aCA9IHB0LnggLSBpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5pTW92ZUl0ZW1dLnJlY3QubGVmdCArCi0JCWluZm9QdHItPnhUcmFja09mZnNldDsKKwkJbldpZHRoID0gcHQueCAtIGluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0ucmVjdC5sZWZ0ICsgaW5mb1B0ci0+eFRyYWNrT2Zmc2V0OwogCQlpZiAobldpZHRoIDwgMCkKIAkJICAgIG5XaWR0aCA9IDA7CiAJCWluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0uY3h5ID0gbldpZHRoOwpAQCAtMTA3MSwxNiArMTA0NSwxNiBAQAogICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKICAgICBQT0lOVDMyIHB0OwogICAgIFVJTlQzMiAgZmxhZ3M7Ci0gICAgSU5UMzIgICBpSXRlbSwgbldpZHRoOworICAgIElOVDMyICAgbkl0ZW0sIG5XaWR0aDsKICAgICBIREMzMiAgIGhkYzsKIAogICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CiAgICAgcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKLSAgICBIRUFERVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsICZwdCwgJmZsYWdzLCAmaUl0ZW0pOworICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZuSXRlbSk7CiAKICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIEhEU19CVVRUT05TKSAmJiAod25kUHRyLT5kd1N0eWxlICYgSERTX0hPVFRSQUNLKSkgewogCWlmIChmbGFncyAmIChISFRfT05IRUFERVIgfCBISFRfT05ESVZJREVSIHwgSEhUX09ORElWT1BFTikpCi0JICAgIGluZm9QdHItPmlIb3RJdGVtID0gaUl0ZW07CisJICAgIGluZm9QdHItPmlIb3RJdGVtID0gbkl0ZW07CiAJZWxzZQogCSAgICBpbmZvUHRyLT5pSG90SXRlbSA9IC0xOwogCWhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOwpAQCAtMTA5MCw3ICsxMDY0LDcgQEAKIAogICAgIGlmIChpbmZvUHRyLT5iQ2FwdHVyZWQpIHsKIAlpZiAoaW5mb1B0ci0+YlByZXNzZWQpIHsKLQkgICAgaWYgKChpSXRlbSA9PSBpbmZvUHRyLT5pTW92ZUl0ZW0pICYmIChmbGFncyA9PSBISFRfT05IRUFERVIpKQorCSAgICBpZiAoKG5JdGVtID09IGluZm9QdHItPmlNb3ZlSXRlbSkgJiYgKGZsYWdzID09IEhIVF9PTkhFQURFUikpCiAJCWluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0uYkRvd24gPSBUUlVFOwogCSAgICBlbHNlCiAJCWluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0uYkRvd24gPSBGQUxTRTsKQEAgLTExMDUsOCArMTA3OSw3IEBACiAJCWlmIChIRUFERVJfU2VuZEhlYWRlck5vdGlmeSAod25kUHRyLCBIRE5fSVRFTUNIQU5HSU5HMzJBLCBpbmZvUHRyLT5pTW92ZUl0ZW0pKQogCQkgICAgaW5mb1B0ci0+aXRlbXNbaW5mb1B0ci0+aU1vdmVJdGVtXS5jeHkgPSBpbmZvUHRyLT5uT2xkV2lkdGg7CiAJCWVsc2UgewotCQkgICAgbldpZHRoID0gcHQueCAtIGluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0ucmVjdC5sZWZ0ICsKLQkJICAgIGluZm9QdHItPnhUcmFja09mZnNldDsKKwkJICAgIG5XaWR0aCA9IHB0LnggLSBpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5pTW92ZUl0ZW1dLnJlY3QubGVmdCArIGluZm9QdHItPnhUcmFja09mZnNldDsKIAkJICAgIGlmIChuV2lkdGggPCAwKQogCQkJbldpZHRoID0gMDsKIAkJICAgIGluZm9QdHItPml0ZW1zW2luZm9QdHItPmlNb3ZlSXRlbV0uY3h5ID0gbldpZHRoOwpAQCAtMTE3MCwxNCArMTE0MywxNCBAQAogICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKICAgICBQT0lOVDMyIHB0OwogICAgIFVJTlQzMiAgZmxhZ3M7Ci0gICAgSU5UMzIgICBpSXRlbTsKKyAgICBJTlQzMiAgIG5JdGVtOwogCiAgICAgVFJBQ0UgKGhlYWRlciwgImNvZGU9MHglWCAgaWQ9MHglWFxuIiwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pKTsKIAogICAgIEdldEN1cnNvclBvczMyICgmcHQpOwogICAgIFNjcmVlblRvQ2xpZW50MzIgKHduZFB0ci0+aHduZFNlbGYsICZwdCk7CiAKLSAgICBIRUFERVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsICZwdCwgJmZsYWdzLCAmaUl0ZW0pOworICAgIEhFQURFUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0LCAmZmxhZ3MsICZuSXRlbSk7CiAKICAgICBpZiAoZmxhZ3MgPT0gSEhUX09ORElWSURFUikKICAgICAgICAgU2V0Q3Vyc29yMzIgKGluZm9QdHItPmhjdXJEaXZpZGVyKTsKQEAgLTEyMzgsMTggKzEyMTEsMjUgQEAKIAljYXNlIEhETV9HRVRJVEVNMzJBOgogCSAgICByZXR1cm4gSEVBREVSX0dldEl0ZW0zMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisvLwljYXNlIEhETV9HRVRJVEVNMzJXOgorCiAJY2FzZSBIRE1fR0VUSVRFTUNPVU5UOgogCSAgICByZXR1cm4gSEVBREVSX0dldEl0ZW1Db3VudCAod25kUHRyKTsKIAogCWNhc2UgSERNX0dFVElURU1SRUNUOgogCSAgICByZXR1cm4gSEVBREVSX0dldEl0ZW1SZWN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAorLy8JY2FzZSBIRE1fR0VUT1JERVJBUlJBWToKKy8vCWNhc2UgSERNX0dFVFVOSUNPREVGT1JNQVQ6CisKIAljYXNlIEhETV9ISVRURVNUOgogCSAgICByZXR1cm4gSEVBREVSX0hpdFRlc3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBIRE1fSU5TRVJUSVRFTTMyQToKIAkgICAgcmV0dXJuIEhFQURFUl9JbnNlcnRJdGVtMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAorLy8JY2FzZSBIRE1fSU5TRVJUSVRFTTMyVzoKKwogCWNhc2UgSERNX0xBWU9VVDoKIAkgICAgcmV0dXJuIEhFQURFUl9MYXlvdXQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCkBAIC0xMjU5LDYgKzEyMzksMTAgQEAKIAljYXNlIEhETV9TRVRJVEVNMzJBOgogCSAgICByZXR1cm4gSEVBREVSX1NldEl0ZW0zMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisvLwljYXNlIEhETV9TRVRJVEVNMzJXOgorLy8JY2FzZSBIRE1fU0VUT1JERVJBUlJBWToKKy8vCWNhc2UgSERNX1NFVFVOSUNPREVGT1JNQVQ6CisKIAogICAgICAgICBjYXNlIFdNX0NSRUFURToKICAgICAgICAgICAgIHJldHVybiBIRUFERVJfQ3JlYXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKZGlmZiAtLWdpdCBhL2RsbHMvY29tY3RsMzIvaW1hZ2VsaXN0LmMgYi9kbGxzL2NvbWN0bDMyL2ltYWdlbGlzdC5jCmluZGV4IDZmYmJkMzMuLjBhZWMwN2QgMTAwNjQ0Ci0tLSBhL2RsbHMvY29tY3RsMzIvaW1hZ2VsaXN0LmMKKysrIGIvZGxscy9jb21jdGwzMi9pbWFnZWxpc3QuYwpAQCAtNSw5ICs1LDcgQEAKICAqCiAgKiAgVE9ETzoKICAqICAgIC0gRml4IHhCaXRtYXAgYW5kIHlCaXRtYXAgaW4gSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdC4KLSAqICAgIC0gRml4IElMRF9UUkFOU1BBUkVOVCBlcnJvciBpbiBJbWFnZUxpc3RfRHJhd0luZGlyZWN0LgotICogICAgLSBGaXggSW1hZ2VMaXN0X0dldEljb24gKG1pZ2h0IGJlIGEgcmVzdWx0IG9mIHRoZQotICogICAgICBJTERfVFJBTlNQQVJFTlQgZXJyb3IgaW4gSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdCkuCisgKiAgICAtIEZpeCBJbWFnZUxpc3RfR2V0SWNvbi4KICAqICAgIC0gRml4IGRyYWcgZnVuY3Rpb25zLgogICogICAgLSBGaXggSW1hZ2VMaXN0X1JlYWQgYW5kIEltYWdlTGlzdF9Xcml0ZS4KICAqICAgIC0gRml4IEltYWdlTGlzdF9TZXRGaWx0ZXIgKHVuZG9jdW1lbnRlZCkuCkBAIC0xNDYsMTEgKzE0NCwxMSBAQAogewogICAgIEhEQzMyICAgIGhkY1NyYywgaGRjRHN0OwogICAgIElOVDMyICAgIG5GaXJzdEluZGV4LCBuSW1hZ2VDb3VudDsKLSAgICBJTlQzMiAgICBuU3RhcnRYLCBuUnVuWCwgblJ1blk7CisgICAgSU5UMzIgICAgblN0YXJ0WDsKICAgICBCSVRNQVAzMiBibXA7CiAKLSAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKC0xKTsKLSAgICBpZiAoaGJtSW1hZ2UgPT0gMCkgcmV0dXJuICgtMSk7CisgICAgaWYgKCFoaW1sIHx8ICFoYm1JbWFnZSkKKwlyZXR1cm4gLTE7CiAKICAgICBHZXRPYmplY3QzMkEgKGhibUltYWdlLCBzaXplb2YoQklUTUFQMzIpLCAoTFBWT0lEKSZibXApOwogICAgIG5JbWFnZUNvdW50ID0gYm1wLmJtV2lkdGggLyBoaW1sLT5jeDsKQEAgLTE1OCw1NiArMTU2LDMzIEBACiAgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSArIG5JbWFnZUNvdW50ID49IGhpbWwtPmNNYXhJbWFnZSkKICAgICAgICAgSU1BR0VMSVNUX0ludGVybmFsRXhwYW5kQml0bWFwcyAoaGltbCwgbkltYWdlQ291bnQpOwogCisgICAgblN0YXJ0WCA9IGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4OworCiAgICAgaGRjU3JjID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwogICAgIGhkY0RzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKIAorICAgIC8qIGNvcHkgaW1hZ2UgYml0bWFwICovCiAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbC0+aGJtSW1hZ2UpOwogICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhibUltYWdlKTsKLQogICAgIEJpdEJsdDMyIChoZGNEc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAogICAgICAgICAgICAgICBibXAuYm1XaWR0aCwgaGltbC0+Y3ksIGhkY1NyYywgMCwgMCwgU1JDQ09QWSk7CiAgICAgICAgICAgCiAgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKICAgICAgICAgaWYgKGhibU1hc2spIHsKKwkgICAgLyogY29weSBtYXNrIGJpdG1hcCAqLwogICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbC0+aGJtTWFzayk7CiAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjLCBoYm1NYXNrKTsKLSAgICAgICAgICAgIEJpdEJsdDMyIChoZGNEc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAotICAgICAgICAgICAgICAgICAgICAgIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwgaGRjU3JjLCAwLCAwLCBTUkNDT1BZKTsKLQotICAgICAgICAgICAgLyogZml4IHRyYW5zcGFyZW50IGFyZWFzIG9mIHRoZSBpbWFnZSBiaXRtYXAqLwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGltbC0+aGJtTWFzayk7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0LCBoaW1sLT5oYm1JbWFnZSk7Ci0gICAgICAgICAgICBuU3RhcnRYID0gaGltbC0+Y0N1ckltYWdlICogaGltbC0+Y3g7Ci0KLSAgICAgICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWwtPmN5OyBuUnVuWSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChuUnVuWCA9IDA7IG5SdW5YIDwgYm1wLmJtV2lkdGg7IG5SdW5YKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEdldFBpeGVsMzIgKGhkY1NyYywgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSkgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY0RzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMCwgMCwgMCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJpdEJsdDMyIChoZGNEc3QsIG5TdGFydFgsIDAsIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwKKwkJICAgICAgaGRjU3JjLCAwLCAwLCBTUkNDT1BZKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNyZWF0ZSBtYXNrIGZyb20gdGhlIGltYWdlbGlzdCdzIGJhY2tncm91bmQgY29sb3IgKi8KKwkgICAgLyogY29weSBtb25vY2hyb21lIGltYWdlIHRvIHRoZSBtYXNrIGJpdG1hcCAqLwogICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaGltbC0+aGJtTWFzayk7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjLCBoaW1sLT5oYm1JbWFnZSk7Ci0gICAgICAgICAgICBuU3RhcnRYID0gaGltbC0+Y0N1ckltYWdlICogaGltbC0+Y3g7Ci0gICAgICAgICAgICBmb3IgKG5SdW5ZID0gMDsgblJ1blkgPCBoaW1sLT5jeTsgblJ1blkrKykgewotICAgICAgICAgICAgICAgIGZvciAoblJ1blggPSAwOyBuUnVuWCA8IGJtcC5ibVdpZHRoOyBuUnVuWCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChHZXRQaXhlbDMyIChoZGNTcmMsIG5TdGFydFggKyBuUnVuWCwgblJ1blkpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICBoaW1sLT5jbHJCaykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjU3JjLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNEc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCKDI1NSwgMjU1LCAyNTUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNEc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCKDAsIDAsIDApKTsgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhibUltYWdlKTsKKwkgICAgU2V0QmtDb2xvcjMyIChoZGNTcmMsIEdldE5lYXJlc3RDb2xvcjMyIChoZGNTcmMsCisJCQkgIEdldFBpeGVsMzIgKGhkY1NyYywgMCwgMCkpKTsKKwkgICAgQml0Qmx0MzIgKGhkY0RzdCwgblN0YXJ0WCwgMCwgYm1wLmJtV2lkdGgsIGhpbWwtPmN5LAorCQkgICAgICBoZGNTcmMsIG5TdGFydFgsIDAsIFNSQ0NPUFkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTcsNyArMTkyLDcgQEAKICAgICBuRmlyc3RJbmRleCA9IGhpbWwtPmNDdXJJbWFnZTsKICAgICBoaW1sLT5jQ3VySW1hZ2UgKz0gbkltYWdlQ291bnQ7CiAKLSAgICByZXR1cm4gKG5GaXJzdEluZGV4KTsKKyAgICByZXR1cm4gbkZpcnN0SW5kZXg7CiB9CiAKIApAQCAtMjQ5LDkgKzIyNCw5IEBACiAgKiBzcGVjaWZpZWQgYml0bWFwIHVzaW5nIHRoZSBtYXNrIGNvbG9yLgogICoKICAqIFBBUkFNUwotICogICAgIGhpbWwgICAgIFtJXSBpbWFnZSBsaXN0IGhhbmRsZS4KLSAqICAgICBoYm1JbWFnZSBbSV0gaW1hZ2UgYml0bWFwIGhhbmRsZS4KLSAqICAgICBjbHJNYXNrICBbSV0gbWFzayBjb2xvci4KKyAqICAgICBoaW1sICAgIFtJXSBoYW5kbGUgdG8gaW1hZ2UgbGlzdC4KKyAqICAgICBoQml0bWFwIFtJXSBoYW5kbGUgdG8gYml0bWFwCisgKiAgICAgY2xyTWFzayBbSV0gbWFzayBjb2xvci4KICAqCiAgKiBSRVRVUk5TCiAgKiAgICAgU3VjY2VzczogSW5kZXggb2YgdGhlIGZpcnN0IG5ldyBpbWFnZS4KQEAgLTI1OSwyMCArMjM0LDE4IEBACiAgKi8KIAogSU5UMzIgV0lOQVBJCi1JbWFnZUxpc3RfQWRkTWFza2VkIChISU1BR0VMSVNUIGhpbWwsIEhCSVRNQVAzMiBoYm1JbWFnZSwgQ09MT1JSRUYgY2xyTWFzaykKK0ltYWdlTGlzdF9BZGRNYXNrZWQgKEhJTUFHRUxJU1QgaGltbCwgSEJJVE1BUDMyIGhCaXRtYXAsIENPTE9SUkVGIGNsck1hc2spCiB7Ci0gICAgSERDMzIgICAgaGRjSW1hZ2VMaXN0LCBoZGNJbWFnZSwgaGRjTWFzazsKKyAgICBIREMzMiAgICBoZGNJbWFnZSwgaGRjTWFzaywgaGRjQml0bWFwOwogICAgIElOVDMyICAgIG5JbmRleCwgbkltYWdlQ291bnQ7CiAgICAgQklUTUFQMzIgYm1wOwotICAgIElOVDMyICAgIG5TdGFydFgsIG5SdW5YLCBuUnVuWTsKLSAgICBDT0xPUlJFRiBia0NvbG9yOwogCiAgICAgaWYgKGhpbWwgPT0gTlVMTCkKLQlyZXR1cm4gKC0xKTsKKwlyZXR1cm4gLTE7CiAKLSAgICBia0NvbG9yID0gKGNsck1hc2sgPT0gQ0xSX05PTkUpID8gaGltbC0+Y2xyQmsgOiBjbHJNYXNrOworICAgIGlmICghR2V0T2JqZWN0MzJBIChoQml0bWFwLCBzaXplb2YoQklUTUFQMzIpLCAmYm1wKSkKKwlyZXR1cm4gLTE7CiAKLSAgICBHZXRPYmplY3QzMkEgKGhibUltYWdlLCBzaXplb2YoQklUTUFQMzIpLCAmYm1wKTsKICAgICBuSW1hZ2VDb3VudCA9IGJtcC5ibVdpZHRoIC8gaGltbC0+Y3g7CiAKICAgICBpZiAoaGltbC0+Y0N1ckltYWdlICsgbkltYWdlQ291bnQgPj0gaGltbC0+Y01heEltYWdlKQpAQCAtMjgxLDM5ICsyNTQsMzQgQEAKICAgICBuSW5kZXggPSBoaW1sLT5jQ3VySW1hZ2U7CiAgICAgaGltbC0+Y0N1ckltYWdlICs9IG5JbWFnZUNvdW50OwogCi0gICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwotICAgIGhkY0ltYWdlID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgIGhkY0ltYWdlICA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBoZGNCaXRtYXAgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CiAKLSAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7Ci0gICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBoYm1JbWFnZSk7Ci0gICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwKLSAgICAgICAgICAgICAgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOworICAgIFNlbGVjdE9iamVjdDMyIChoZGNCaXRtYXAsIGhCaXRtYXApOworICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZSwgaGltbC0+aGJtSW1hZ2UpOworICAgIEJpdEJsdDMyIChoZGNJbWFnZSwgbkluZGV4ICogaGltbC0+Y3gsIDAsIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwKKyAgICAgICAgICAgICAgaGRjQml0bWFwLCAwLCAwLCBTUkNDT1BZKTsKIAogICAgIGlmIChoaW1sLT5oYm1NYXNrKSB7Ci0gICAgICAgIC8qIGNyZWF0ZSBNYXNrICovCisJQ09MT1JSRUYgYmtDb2xvciA9IChjbHJNYXNrICE9IENMUl9ERUZBVUxUKSA/IGNsck1hc2sgOgorCSAgICBHZXROZWFyZXN0Q29sb3IzMiAoaGRjQml0bWFwLCBHZXRQaXhlbDMyIChoZGNCaXRtYXAsIDAsIDApKTsKKworCS8qIGNyZWF0ZSBtYXNrIGZyb20gaW1hZ2UgKi8KICAgICAgICAgaGRjTWFzayA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY01hc2ssIGhpbWwtPmhibU1hc2spOwotICAgICAgICBuU3RhcnRYID0gbkluZGV4ICogaGltbC0+Y3g7Ci0gICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWwtPmN5OyBuUnVuWSsrKSB7Ci0gICAgICAgICAgICBmb3IgKG5SdW5YID0gMDsgblJ1blggPCBibXAuYm1XaWR0aDsgblJ1blgrKykgewotICAgICAgICAgICAgICAgIGlmIChHZXRQaXhlbDMyIChoZGNJbWFnZUxpc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blkpID09Ci0gICAgICAgICAgICAgICAgICAgIGJrQ29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjSW1hZ2VMaXN0LCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMCwgMCwgMCkpOwotICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNNYXNrLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMjU1LCAyNTUsIDI1NSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY01hc2ssIG5TdGFydFggKyBuUnVuWCwgblJ1blksIFJHQigwLCAwLCAwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKworCS8qIGNyZWF0ZSBtb25vY2hyb21lIGltYWdlIHRvIHRoZSBtYXNrIGJpdG1hcCAqLworCVNldEJrQ29sb3IzMiAoaGRjQml0bWFwLCBia0NvbG9yKTsKKwlCaXRCbHQzMiAoaGRjTWFzaywgbkluZGV4ICogaGltbC0+Y3gsIDAsIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwKKwkJICBoZGNCaXRtYXAsIDAsIDAsIFNSQ0NPUFkpOworCiAgICAgICAgIERlbGV0ZURDMzIgKGhkY01hc2spOwogICAgIH0KIAotICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlTGlzdCk7CiAgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2UpOworICAgIERlbGV0ZURDMzIgKGhkY0JpdG1hcCk7CiAgIAotICAgIHJldHVybiAobkluZGV4KTsKKyAgICByZXR1cm4gbkluZGV4OwogfQogCiAKQEAgLTk2OSw2ICs5MzcsOCBAQAogICAgIHsKIAkvKiBkcmF3IHRoZSBtYXNrICovCiAJU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbExvY2FsLT5oYm1NYXNrKTsKKwlTZXRCa0NvbG9yMzIgKGhkY0ltYWdlTGlzdCwgUkdCKDI1NSwgMjU1LCAyNTUpKTsKKwlTZXRUZXh0Q29sb3IzMiAoaGRjSW1hZ2VMaXN0LCBSR0IoMCwgMCwgMCkpOwogCUJpdEJsdDMyIChwaW1sZHAtPmhkY0RzdCwgcGltbGRwLT54LCBwaW1sZHAtPnksIGN4LCBjeSwKIAkJICBoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+Y3ggKiBwaW1sZHAtPmksIDAsCiAJCSAgYk1hc2tUcmFucyA/IFNSQ0FORCA6IFNSQ0NPUFkpOwpAQCAtOTg5LDggKzk1OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBCaXRCbHQzMiAocGltbGRwLT5oZGNEc3QsIHBpbWxkcC0+eCwgcGltbGRwLT55LCBjeCwgY3ksCi0gICAgICAgICAgICAgICAgICBoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+Y3ggKiBwaW1sZHAtPmksIDAsCi0gICAgICAgICAgICAgICAgICBTUkNQQUlOVCk7CisgICAgICAgICAgICAgICAgICBoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+Y3ggKiBwaW1sZHAtPmksIDAsIFNSQ1BBSU5UKTsKIAogICAgICAgICBpZiAoYkJsZW5kMjUgfHwgYkJsZW5kNTApCiAgICAgICAgIHsKQEAgLTEyMjUsNyArMTE5NCw3IEBACiB7CiAgICAgSUNPTklORk8gaWk7CiAgICAgSElDT04zMiAgaEljb247Ci0gICAgSERDMzIgICAgaGRjOworICAgIEhEQzMyICAgIGhkY1NyYywgaGRjRHN0OwogICAgIElOVDMyICAgIG5XaWR0aCwgbkhlaWdodDsKIAogICAgIGlmIChoaW1sID09IE5VTEwpIHJldHVybiAwOwpAQCAtMTIzNCwyNyArMTIwMywzNiBAQAogICAgIG5XaWR0aCA9IEdldFN5c3RlbU1ldHJpY3MzMiAoU01fQ1hJQ09OKTsKICAgICBuSGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljczMyIChTTV9DWUlDT04pOwogCisgICAgaGRjU3JjID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIoMCk7CisgICAgaGRjRHN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIoMCk7CisKICAgICBpaS5mSWNvbiA9IFRSVUU7CiAgICAgaWkueEhvdHNwb3QgPSAwOwogICAgIGlpLnlIb3RzcG90ID0gMDsKLSAgICBpaS5oYm1NYXNrICA9IENyZWF0ZUJpdG1hcDMyIChuV2lkdGgsIG5IZWlnaHQsIDEsIDEsIE5VTEwpOwotICAgIGlpLmhibUNvbG9yID0gQ3JlYXRlQml0bWFwMzIgKG5XaWR0aCwgbkhlaWdodCwgMSwgaGltbC0+dUJpdHNQaXhlbCwgTlVMTCk7CisgICAgaWkuaGJtTWFzayAgPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIgKGhkY0RzdCwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBpaS5oYm1Db2xvciA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAzMiAoaGRjRHN0LCBuV2lkdGgsIG5IZWlnaHQpOwogCi0gICAgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIoMCk7Ci0KLSAgICAvKiBkcmF3IGltYWdlKi8KLSAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBpaS5oYm1Db2xvcik7Ci0gICAgUGF0Qmx0MzIgKGhkYywgMCwgMCwgbldpZHRoLCBuSGVpZ2h0LCBCTEFDS05FU1MpOwotICAgIEltYWdlTGlzdF9EcmF3IChoaW1sLCBpLCBoZGMsIDAsIDAsIGZTdHlsZSB8IElMRF9UUkFOU1BBUkVOVCk7CiAKICAgICAvKiBkcmF3IG1hc2sqLwotICAgIFNlbGVjdE9iamVjdDMyIChoZGMsIGlpLmhibU1hc2spOwotICAgIFBhdEJsdDMyIChoZGMsIDAsIDAsIG5XaWR0aCwgbkhlaWdodCwgV0hJVEVORVNTKTsKLSAgICBJbWFnZUxpc3RfRHJhdyAoaGltbCwgaSwgaGRjLCAwLCAwLCBmU3R5bGUgfCBJTERfTUFTSyk7CisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaWkuaGJtTWFzayk7CisgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKKwlTZWxlY3RPYmplY3QzMiAoaGRjU3JjLCBoaW1sLT5oYm1NYXNrKTsKKwlCaXRCbHQzMiAoaGRjRHN0LCAwLCAwLCBuV2lkdGgsIG5IZWlnaHQsCisJCSAgaGRjU3JjLCBpICogaGltbC0+Y3gsIDAsIFNSQ0NPUFkpOworICAgIH0KKyAgICBlbHNlCisJUGF0Qmx0MzIgKGhkY0RzdCwgMCwgMCwgbldpZHRoLCBuSGVpZ2h0LCBCTEFDS05FU1MpOworCisgICAgLyogZHJhdyBpbWFnZSovCisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdCwgaWkuaGJtQ29sb3IpOworICAgIFNlbGVjdE9iamVjdDMyIChoZGNTcmMsIGhpbWwtPmhibUltYWdlKTsKKyAgICBCaXRCbHQzMiAoaGRjRHN0LCAwLCAwLCBuV2lkdGgsIG5IZWlnaHQsCisJICAgICAgaGRjU3JjLCBpICogaGltbC0+Y3gsIDAsIFNSQ0NPUFkpOwogCiAgICAgaEljb24gPSBDcmVhdGVJY29uSW5kaXJlY3QgKCZpaSk7ICAgIAogCi0gICAgRGVsZXRlREMzMiAoaGRjKTsKKyAgICBEZWxldGVEQzMyIChoZGNTcmMpOworICAgIERlbGV0ZURDMzIgKGhkY0RzdCk7CiAgICAgRGVsZXRlT2JqZWN0MzIgKGlpLmhibU1hc2spOwogICAgIERlbGV0ZU9iamVjdDMyIChpaS5oYm1Db2xvcik7CiAKQEAgLTIwNDAsNyArMjAxOCw3IEBACiAgKiBTZXRzIHRoZSBpbWFnZSBzaXplIG9mIHRoZSBiaXRtYXAgYW5kIGRlbGV0ZXMgYWxsIGltYWdlcy4KICAqCiAgKiBQQVJBTVMKLSAqICAgICBoaW1sIFtJXSBpbWFnZSBsaXN0IGhhbmRsZQorICogICAgIGhpbWwgW0ldIGhhbmRsZSB0byBpbWFnZSBsaXN0CiAgKiAgICAgY3ggICBbSV0gaW1hZ2Ugd2lkdGgKICAqICAgICBjeSAgIFtJXSBpbWFnZSBoZWlnaHQKICAqCkBAIC0yMDU0LDcgKzIwMzIsOCBAQAogewogICAgIElOVDMyIG5Db3VudDsKIAotICAgIGlmIChoaW1sID09IE5VTEwpIHJldHVybiAoRkFMU0UpOworICAgIGlmICghaGltbCkKKwlyZXR1cm4gRkFMU0U7CiAKICAgICAvKiByZW1vdmUgYWxsIGltYWdlcyovCiAgICAgaGltbC0+Y01heEltYWdlICA9IGhpbWwtPmNJbml0aWFsICsgaGltbC0+Y0dyb3c7CkBAIC0yMDg4LDcgKzIwNjcsNyBAQAogICogUmVzaXplcyBhbiBpbWFnZSBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGltYWdlcy4KICAqCiAgKiBQQVJBTVMKLSAqICAgICBoaW1sICAgICAgICBbSV0gaW1hZ2UgbGlzdCBoYW5kbGUKKyAqICAgICBoaW1sICAgICAgICBbSV0gaGFuZGxlIHRvIGltYWdlIGxpc3QKICAqICAgICBpSW1hZ2VDb3VudCBbSV0gbnVtYmVyIG9mIGltYWdlcyBpbiB0aGUgaW1hZ2UgbGlzdAogICoKICAqIFJFVFVSTlMKQEAgLTIxMDMsOSArMjA4MiwxMiBAQAogICAgIEhCSVRNQVAzMiBoYm1OZXdCaXRtYXA7CiAgICAgSU5UMzIgICAgIG5OZXdDb3VudCwgbkNvcHlDb3VudDsKIAotICAgIGlmIChoaW1sID09IE5VTEwpIHJldHVybiAoRkFMU0UpOwotICAgIGlmIChoaW1sLT5jQ3VySW1hZ2UgPD0gaUltYWdlQ291bnQpIHJldHVybiAoRkFMU0UpOwotICAgIGlmIChoaW1sLT5jTWF4SW1hZ2UgPiBpSW1hZ2VDb3VudCkgcmV0dXJuIChUUlVFKTsKKyAgICBpZiAoIWhpbWwpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChoaW1sLT5jQ3VySW1hZ2UgPD0gaUltYWdlQ291bnQpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChoaW1sLT5jTWF4SW1hZ2UgPiBpSW1hZ2VDb3VudCkKKwlyZXR1cm4gVFJVRTsKIAogICAgIG5OZXdDb3VudCA9IGlJbWFnZUNvdW50ICsgaGltbC0+Y0dyb3c7CiAgICAgbkNvcHlDb3VudCA9IF9NSU4oaGltbC0+Y0N1ckltYWdlLCBpSW1hZ2VDb3VudCk7CkBAIC0yMTI2LDcgKzIxMDgsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBXQVJOIChpbWFnZWxpc3QsICJDb3VsZCBub3QgY3JlYXRlIG5ldyBpbWFnZSBiaXRtYXAgIVxuIik7CisgICAgICAgIEVSUiAoaW1hZ2VsaXN0LCAiQ291bGQgbm90IGNyZWF0ZSBuZXcgaW1hZ2UgYml0bWFwICFcbiIpOwogICAgIH0KIAogICAgIGlmIChoaW1sLT5oYm1NYXNrKQpAQCAtMjE0NCw3ICsyMTI2LDcgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIFdBUk4gKGltYWdlbGlzdCwgIkNvdWxkIG5vdCBjcmVhdGUgbmV3IG1hc2sgYml0bWFwIVxuIik7CisgICAgICAgICAgICBFUlIgKGltYWdlbGlzdCwgIkNvdWxkIG5vdCBjcmVhdGUgbmV3IG1hc2sgYml0bWFwIVxuIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxNTYsNyArMjEzOCw3IEBACiAgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSA+IG5Db3B5Q291bnQpCiAgICAgICAgIGhpbWwtPmNDdXJJbWFnZSA9IG5Db3B5Q291bnQ7CiAKLSAgICByZXR1cm4gKFRSVUUpOworICAgIHJldHVybiBUUlVFOwogfQogCiAKQEAgLTIxNzgsOCArMjE2MCwxMiBAQAogQk9PTDMyIFdJTkFQSQogSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZSAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpSW1hZ2UsIElOVDMyIGlPdmVybGF5KQogewotICAgIGlmICgoaU92ZXJsYXkgPCAxKSB8fCAoaU92ZXJsYXkgPiBNQVhfT1ZFUkxBWUlNQUdFKSkgcmV0dXJuIChGQUxTRSk7Ci0gICAgaWYgKChpSW1hZ2UgPCAwKSB8fCAoaUltYWdlID4gaGltbC0+Y0N1ckltYWdlKSkgcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKCFoaW1sKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAoKGlPdmVybGF5IDwgMSkgfHwgKGlPdmVybGF5ID4gTUFYX09WRVJMQVlJTUFHRSkpCisJcmV0dXJuIEZBTFNFOworICAgIGlmICgoaUltYWdlIDwgMCkgfHwgKGlJbWFnZSA+IGhpbWwtPmNDdXJJbWFnZSkpCisJcmV0dXJuIEZBTFNFOwogICAgIAogICAgIGhpbWwtPm5PdmxJZHhbaU92ZXJsYXkgLSAxXSA9IGlJbWFnZTsKICAgICByZXR1cm4gVFJVRTsKQEAgLTIyMTAsOSArMjE5NiwxMCBAQAogQk9PTDMyIFdJTkFQSQogSW1hZ2VMaXN0X1dyaXRlIChISU1BR0VMSVNUIGhpbWwsIExQU1RSRUFNMzIgcHN0bSkKIHsKLSAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworICAgIGlmICghaGltbCkKKwlyZXR1cm4gRkFMU0U7CiAKLSAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOwogCiAgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvZGxscy9jb21jdGwzMi9saXN0dmlldy5jIGIvZGxscy9jb21jdGwzMi9saXN0dmlldy5jCmluZGV4IDkxZmU0Y2IuLjBjMjRkOWMgMTAwNjQ0Ci0tLSBhL2RsbHMvY29tY3RsMzIvbGlzdHZpZXcuYworKysgYi9kbGxzL2NvbWN0bDMyL2xpc3R2aWV3LmMKQEAgLTksOCArOSw4IEBACiAgKiAgICAgRXJpYyA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CiAgKgogICogVE9ETzoKLSAqICAgLSBBbGwgbWVzc2FnZXMuCi0gKiAgIC0gQWxsIG5vdGlmaWNhdGlvbnMuCisgKiAgIC0gTW9zdCBtZXNzYWdlcy4KKyAqICAgLSBNb3N0IG5vdGlmaWNhdGlvbnMuCiAgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTI2LDcgKzI2LDcgQEAKIHN0YXRpYyBWT0lECiBMSVNUVklFV19SZWZyZXNoIChXTkQgKnduZFB0ciwgSERDMzIgaGRjKQogewotICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisvLyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOwogCiAKIApAQCAtMzQsNiArMzQsMTI0IEBACiAKIAogCisvLyA8PCBMSVNUVklFV19BcHByb3hpbWF0ZVZpZXdSZWN0ID4+CisvLyA8PCBMSVNUVklFV19BcnJhbmdlID4+CisvLyA8PCBMSVNUVklFV19DcmVhdGVEcmFnSW1hZ2UgPj4KKworCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfRGVsZXRlQWxsSXRlbXMgKFdORCAqd25kUHRyKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSU5UMzIgbkl0ZW07CisgICAgTElTVFZJRVdfSVRFTSAqbHBJdGVtOworICAgIE5NTElTVFZJRVcgbm1sdjsKKyAgICBCT09MMzIgYk5vdGlmeTsKKworICAgIGlmIChpbmZvUHRyLT5uSXRlbUNvdW50ID09IDApCisJcmV0dXJuIFRSVUU7CisKKyAgICBUUkFDRSAobGlzdHZpZXcsICJcbiIpOworCisgICAgLyogc2VuZCBMVk5fREVMRVRFQUxMSVRFTVMgbm90aWZpY2F0aW9uICovCisgICAgWmVyb01lbW9yeSAoJm5tbHYsIHNpemVvZiAoTk1MSVNUVklFVykpOworICAgIG5tbHYuaGRyLmh3bmRGcm9tID0gd25kUHRyLT5od25kU2VsZjsKKyAgICBubWx2Lmhkci5pZEZyb20gICA9IHduZFB0ci0+d0lEbWVudTsKKyAgICBubWx2Lmhkci5jb2RlICAgICA9IExWTl9ERUxFVEVBTExJVEVNUzsKKyAgICBubWx2LmlJdGVtICAgICAgICA9IC0xOworICAgIGJOb3RpZnkgPQorCSEoQk9PTDMyKVNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJCQkgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm1sdik7CisKKyAgICBubWx2Lmhkci5jb2RlICAgICA9IExWTl9ERUxFVEVJVEVNOworCisgICAgZm9yIChuSXRlbSA9IDA7IG5JdGVtIDwgaW5mb1B0ci0+bkl0ZW1Db3VudDsgbkl0ZW0rKykgeworCS8qIHNlbmQgbm90aWZpY2F0aW9uICovCisJaWYgKGJOb3RpZnkpIHsKKwkgICAgbm1sdi5pSXRlbSA9IG5JdGVtOworCSAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCisJCQkgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm1sdik7CisJfQorCisJLyogZ2V0IGl0ZW0gcG9pbnRlciAqLworCWxwSXRlbSA9IChMSVNUVklFV19JVEVNKilEUEFfR2V0UHRyIChpbmZvUHRyLT5oZHBhSXRlbXMsIG5JdGVtKTsKKworCS8qIGRlbGV0ZSBpdGVtIHN0cmluZ3MgKi8KKwlpZiAoKGxwSXRlbS0+cHN6VGV4dCkgJiYgKGxwSXRlbS0+cHN6VGV4dCAhPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpKQorCSAgICBDT01DVEwzMl9GcmVlIChscEl0ZW0tPnBzelRleHQpOworCisJLyogZnJlZSBpdGVtIGRhdGEgKi8KKwlDT01DVEwzMl9GcmVlIChscEl0ZW0pOworICAgIH0KKworICAgIERQQV9EZWxldGVBbGxQdHJzIChpbmZvUHRyLT5oZHBhSXRlbXMpOworICAgIGluZm9QdHItPm5JdGVtQ291bnQgPSAwOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIExSRVNVTFQKK0xJU1RWSUVXX0RlbGV0ZUNvbHVtbiAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIElOVDMyIG5Db2x1bW4gPSAoSU5UMzIpd1BhcmFtOworCisgICAgLyogRklYTUUgPz8/ICovCisgICAgaWYgKGluZm9QdHItPm5JdGVtQ291bnQgPiAwKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmICghU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmRIZWFkZXIsIEhETV9ERUxFVEVJVEVNLCB3UGFyYW0sIDApKQorCXJldHVybiBGQUxTRTsKKworICAgIGluZm9QdHItPm5Db2x1bW5Db3VudC0tOworCisgICAgRklYTUUgKGxpc3R2aWV3LCAic2VtaSBzdHViIVxuIik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfRGVsZXRlSXRlbSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIElOVDMyIG5JdGVtID0gKElOVDMyKXdQYXJhbTsKKyAgICBMSVNUVklFV19JVEVNICpscEl0ZW07CisgICAgTk1MSVNUVklFVyBubWx2OworCisgICAgaWYgKChuSXRlbSA8IDApIHx8IChuSXRlbSA+PSBpbmZvUHRyLT5uSXRlbUNvdW50KSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBUUkFDRSAobGlzdHZpZXcsICIoJWQpXG4iLCBuSXRlbSk7CisKKyAgICAvKiBzZW5kIG5vdGlmaWNhdGlvbiAqLworICAgIFplcm9NZW1vcnkgKCZubWx2LCBzaXplb2YgKE5NTElTVFZJRVcpKTsKKyAgICBubWx2Lmhkci5od25kRnJvbSA9IHduZFB0ci0+aHduZFNlbGY7CisgICAgbm1sdi5oZHIuaWRGcm9tICAgPSB3bmRQdHItPndJRG1lbnU7CisgICAgbm1sdi5oZHIuY29kZSAgICAgPSBMVk5fREVMRVRFSVRFTTsKKyAgICBubWx2LmlJdGVtICAgICAgICA9IG5JdGVtOworICAgIFNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJICAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJm5tbHYpOworCisgICAgLyogcmVtb3ZlIGZyb20gaXRlbSBhcnJheSAqLworICAgIGxwSXRlbSA9IChMSVNUVklFV19JVEVNKilEUEFfRGVsZXRlUHRyIChpbmZvUHRyLT5oZHBhSXRlbXMsIG5JdGVtKTsKKworICAgIC8qIGRlbGV0ZSBpdGVtIHN0cmluZ3MgKi8KKyAgICBpZiAoKGxwSXRlbS0+cHN6VGV4dCkgJiYgKGxwSXRlbS0+cHN6VGV4dCAhPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpKQorCUNPTUNUTDMyX0ZyZWUgKGxwSXRlbS0+cHN6VGV4dCk7CisKKyAgICAvKiBmcmVlIGl0ZW0gZGF0YSAqLworICAgIENPTUNUTDMyX0ZyZWUgKGxwSXRlbSk7CisKKyAgICBpbmZvUHRyLT5uSXRlbUNvdW50LS07CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyA8PCBMSVNUVklFV19FZGl0TGFiZWwgPj4KKy8vIDw8IExJU1RWSUVXX0Vuc3VyZVZpc2libGUgPj4KIC8vIDw8IExJU1RWSUVXX0ZpbmRJdGVtID4+CiAKIApAQCAtNDcsNiArMTY1LDc1IEBACiAKIAogLy8gPDwgTElTVFZJRVdfR2V0QmtJbWFnZSA+PgorLy8gPDwgTElTVFZJRVdfR2V0Q2FsbGJhY2tNYXNrID4+CisKKworc3RhdGljIExSRVNVTFQKK0xJU1RWSUVXX0dldENvbHVtbjMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIExQTFZDT0xVTU4zMkEgbHBjb2wgPSAoTFBMVkNPTFVNTjMyQSlsUGFyYW07CisgICAgSU5UMzIgbkluZGV4ID0gKElOVDMyKXdQYXJhbTsKKyAgICBIRElURU0zMkEgaGRpOworCisgICAgaWYgKCFscGNvbCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBUUkFDRSAobGlzdHZpZXcsICIoJWQgJXApXG4iLCBuSW5kZXgsIGxwY29sKTsKKworICAgIFplcm9NZW1vcnkgKCZoZGksIHNpemVvZihIRElURU0zMkEpKTsKKworICAgIGlmIChscGNvbC0+bWFzayAmIExWQ0ZfRk1UKQorCWhkaS5tYXNrIHw9IEhESV9GT1JNQVQ7CisKKyAgICBpZiAobHBjb2wtPm1hc2sgJiBMVkNGX1dJRFRIKQorICAgICAgICBoZGkubWFzayB8PSBIRElfV0lEVEg7CisKKyAgICBpZiAobHBjb2wtPm1hc2sgJiBMVkNGX1RFWFQpCisgICAgICAgIGhkaS5tYXNrIHw9IChIRElfVEVYVCB8IEhESV9GT1JNQVQpOworCisgICAgaWYgKGxwY29sLT5tYXNrICYgTFZDRl9JTUFHRSkKKyAgICAgICAgaGRpLm1hc2sgfD0gSERJX0lNQUdFOworCisgICAgaWYgKGxwY29sLT5tYXNrICYgTFZDRl9PUkRFUikKKyAgICAgICAgaGRpLm1hc2sgfD0gSERJX09SREVSOworCisgICAgaWYgKCFTZW5kTWVzc2FnZTMyQSAoaW5mb1B0ci0+aHduZEhlYWRlciwgSERNX0dFVElURU0zMkEsCisJCSAgICB3UGFyYW0sIChMUEFSQU0pJmhkaSkpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGxwY29sLT5tYXNrICYgTFZDRl9GTVQpIHsKKwlscGNvbC0+Zm10ID0gMDsKKworCWlmIChoZGkuZm10ICYgSERGX0xFRlQpCisJICAgIGxwY29sLT5mbXQgfD0gTFZDRk1UX0xFRlQ7CisJZWxzZSBpZiAoaGRpLmZtdCAmIEhERl9SSUdIVCkKKwkgICAgbHBjb2wtPmZtdCB8PSBMVkNGTVRfUklHSFQ7CisJZWxzZSBpZiAoaGRpLmZtdCAmIEhERl9DRU5URVIpCisJICAgIGxwY29sLT5mbXQgfD0gTFZDRk1UX0NFTlRFUjsKKworCWlmIChoZGkuZm10ICYgSERGX0lNQUdFKQorCSAgICBscGNvbC0+Zm10IHw9IExWQ0ZNVF9DT0xfSEFTX0lNQUdFUzsKKyAgICB9CisKKyAgICBpZiAobHBjb2wtPm1hc2sgJiBMVkNGX1dJRFRIKQorCWxwY29sLT5jeCA9IGhkaS5jeHk7CisKKyAgICBpZiAoKGxwY29sLT5tYXNrICYgTFZDRl9URVhUKSAmJiAobHBjb2wtPnBzelRleHQpKQorCWxzdHJjcHluMzJBIChscGNvbC0+cHN6VGV4dCwgaGRpLnBzelRleHQsIGxwY29sLT5jY2hUZXh0TWF4KTsKKworICAgIGlmIChscGNvbC0+bWFzayAmIExWQ0ZfSU1BR0UpCisJbHBjb2wtPmlJbWFnZSA9IGhkaS5pSW1hZ2U7CisKKyAgICBpZiAobHBjb2wtPm1hc2sgJiBMVkNGX09SREVSKQorCWxwY29sLT5pT3JkZXIgPSBoZGkuaU9yZGVyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gPDwgTElTVFZJRVdfR2V0Q29sdW1uMzJXID4+CisvLyA8PCBMSVNUVklFV19HZXRDb2x1bW5PcmRlckFycmF5ID4+CiAKIAogX19pbmxpbmVfXyBzdGF0aWMgTFJFU1VMVApAQCAtNjQsNiArMjUxLDkgQEAKIH0KIAogCisvLyA8PCBMSVNUVklFV19HZXRDb3VudFBlclBhZ2UgPj4KKy8vIDw8IExJU1RWSUVXX0dldEVkaXRDb250cm9sID4+CisvLyA8PCBMSVNUVklFV19HZXRFeHRlbmRlZExpc3R2aWV3U3R5bGUgPj4KIAogCiBfX2lubGluZV9fIHN0YXRpYyBMUkVTVUxUCkBAIC03NSw2ICsyNjUsMTEgQEAKIH0KIAogCisvLyA8PCBMSVNUVklFV19HZXRIb3RDdXJzb3IgPj4KKy8vIDw8IExJU1RWSUVXX0dldEhvdEl0ZW0gPj4KKy8vIDw8IExJU1RWSUVXX0dldEhvdmVyVGltZSA+PgorCisKIHN0YXRpYyBMUkVTVUxUCiBMSVNUVklFV19HZXRJbWFnZUxpc3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CkBAIC05NywxOSArMjkyLDYyIEBACiB9CiAKIAorLy8gPDwgTElTVFZJRVdfR2V0SVNlYXJjaFN0cmluZyA+PgorCisKIHN0YXRpYyBMUkVTVUxUCiBMSVNUVklFV19HZXRJdGVtMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBMVklURU0zMkEgbHBJdGVtID0gKExQTFZJVEVNMzJBKWxQYXJhbTsKKyAgICBMSVNUVklFV19JVEVNICpscFJvdywgKmxwU3ViSXRlbTsKIAotICAgIEZJWE1FIChsaXN0dmlldywgIigweCUwOHgpIGVtcHR5IHN0dWIhXG4iLCB3UGFyYW0pOworICAgIGlmICghbHBJdGVtKQorCXJldHVybiBGQUxTRTsKIAorICAgIGlmICgobHBJdGVtLT5pSXRlbSA8IDApIHx8IChscEl0ZW0tPmlJdGVtID49IGluZm9QdHItPm5JdGVtQ291bnQpKQorCXJldHVybiBGQUxTRTsKIAorICAgIGlmICgobHBJdGVtLT5pU3ViSXRlbSA8IDApIHx8IChscEl0ZW0tPmlTdWJJdGVtID49IGluZm9QdHItPm5Db2x1bW5Db3VudCkpCisJcmV0dXJuIEZBTFNFOworCisgICAgRklYTUUgKGxpc3R2aWV3LCAiKCVkICVkICVwKVxuIiwKKwkgICBscEl0ZW0tPmlJdGVtLCBscEl0ZW0tPmlTdWJJdGVtLCBscEl0ZW0pOworCisgICAgbHBSb3cgPSBEUEFfR2V0UHRyIChpbmZvUHRyLT5oZHBhSXRlbXMsIGxwSXRlbS0+aUl0ZW0pOworICAgIGlmICghbHBSb3cpCisJcmV0dXJuIEZBTFNFOworCisgICAgbHBTdWJJdGVtID0gJmxwUm93W2xwSXRlbS0+aVN1Ykl0ZW1dOworICAgIGlmICghbHBTdWJJdGVtKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmIChscEl0ZW0tPm1hc2sgJiBMVklGX1NUQVRFKQorCWxwSXRlbS0+c3RhdGUgPSBscFN1Ykl0ZW0tPnN0YXRlICYgbHBJdGVtLT5zdGF0ZU1hc2s7CisKKyAgICBpZiAobHBJdGVtLT5tYXNrICYgTFZJRl9URVhUKSB7CisJaWYgKGxwU3ViSXRlbS0+cHN6VGV4dCA9PSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpCisJICAgIGxwSXRlbS0+cHN6VGV4dCA9IExQU1RSX1RFWFRDQUxMQkFDSzMyQTsKKwllbHNlCisJICAgIFN0cl9HZXRQdHIzMkEgKGxwU3ViSXRlbS0+cHN6VGV4dCwgbHBJdGVtLT5wc3pUZXh0LAorCQkJICAgbHBJdGVtLT5jY2hUZXh0TWF4KTsKKyAgICB9CisKKyAgICBpZiAobHBJdGVtLT5tYXNrICYgTFZJRl9JTUFHRSkKKwkgbHBJdGVtLT5pSW1hZ2UgPSBscFN1Ykl0ZW0tPmlJbWFnZTsKKworICAgIGlmIChscEl0ZW0tPm1hc2sgJiBMVklGX1BBUkFNKQorCWxwSXRlbS0+bFBhcmFtID0gbHBTdWJJdGVtLT5sUGFyYW07CisKKyAgICBpZiAobHBJdGVtLT5tYXNrICYgTFZJRl9JTkRFTlQpCisJbHBJdGVtLT5pSW5kZW50ID0gbHBTdWJJdGVtLT5pSW5kZW50OwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAorLy8gPDwgTElTVFZJRVdfR2V0SXRlbTMyVyA+PgorCiAKIF9faW5saW5lX18gc3RhdGljIExSRVNVTFQKIExJU1RWSUVXX0dldEl0ZW1Db3VudCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKQEAgLTExOSw2ICszNTcsOTMgQEAKIH0KIAogCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfR2V0SXRlbVBvc2l0aW9uIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBQT0lOVDMyIGxwUHQgPSAoTFBQT0lOVDMyKWxQYXJhbTsKKyAgICBJTlQzMiBuSW5kZXggPSAoSU5UMzIpd1BhcmFtOworCisgICAgaWYgKCFscFB0KQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAoKG5JbmRleCA8IDApIHx8IChuSW5kZXggPj0gaW5mb1B0ci0+bkl0ZW1Db3VudCkpCisJcmV0dXJuIEZBTFNFOworCisgICAgRklYTUUgKGxpc3R2aWV3LCAicmV0dXJuaW5nIHBvc2l0aW9uIFswLDBdIVxuIik7CisgICAgbHBQdC0+eCA9IDA7CisgICAgbHBQdC0+eSA9IDA7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyA8PCBMSVNUVklFV19HZXRJdGVtUmVjdCA+PgorLy8gPDwgTElTVFZJRVdfR2V0SXRlbVNwYWNpbmcgPj4KKy8vIDw8IExJU1RWSUVXX0dldEl0ZW1TdGF0ZSA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19HZXRJdGVtVGV4dDMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIExQTFZJVEVNMzJBIGxwSXRlbSA9IChMUExWSVRFTTMyQSlsUGFyYW07CisgICAgSU5UMzIgbkl0ZW0gPSAoSU5UMzIpd1BhcmFtOworICAgIExJU1RWSUVXX0lURU0gKmxwUm93LCAqbHBTdWJJdGVtOworCisgICAgVFJBQ0UgKGxpc3R2aWV3LCAiKCVkICVwKVxuIiwgbkl0ZW0sIGxwSXRlbSk7CisKKyAgICBscFJvdyA9IERQQV9HZXRQdHIgKGluZm9QdHItPmhkcGFJdGVtcywgbHBJdGVtLT5pSXRlbSk7CisgICAgaWYgKCFscFJvdykKKwlyZXR1cm4gMDsKKworICAgIGxwU3ViSXRlbSA9ICZscFJvd1tscEl0ZW0tPmlTdWJJdGVtXTsKKyAgICBpZiAoIWxwU3ViSXRlbSkKKwlyZXR1cm4gMDsKKworICAgIGlmIChscFN1Ykl0ZW0tPnBzelRleHQgPT0gTFBTVFJfVEVYVENBTExCQUNLMzJBKSB7CisJbHBJdGVtLT5wc3pUZXh0ID0gTFBTVFJfVEVYVENBTExCQUNLMzJBOworCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisJcmV0dXJuIFN0cl9HZXRQdHIzMkEgKGxwU3ViSXRlbS0+cHN6VGV4dCwgbHBJdGVtLT5wc3pUZXh0LAorCQkJICAgICAgbHBJdGVtLT5jY2hUZXh0TWF4KTsKK30KKworCisvLyA8PCBMSVNUVklFV19HZXRJdGVtVGV4dDMyQSA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19HZXROZXh0SXRlbSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIElOVDMyIG5TdGFydCA9IChJTlQzMil3UGFyYW07CisgICAgVUlOVDMyIHVGbGFncyA9IChVSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisKKyAgICBGSVhNRSAobGlzdHZpZXcsICIoJWQsIDB4JXgpOyBlbXB0eSBzdHViIVxuIiwgblN0YXJ0LCB1RmxhZ3MpOworCisKKyAgICByZXR1cm4gLTE7Cit9CisKKworLy8gPDwgTElTVFZJRVdfR2V0TnVtYmVyT2ZXb3JrQXJlYXMgPj4KKy8vIDw8IExJU1RWSUVXX0dldE9yaWdpbiA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19HZXRTZWxlY3RlZENvdW50IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICBUUkFDRSAobGlzdHZpZXcsICI6IGVtcHR5IHN0dWIgKHJldHVybnMgMCkhXG4iKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8vIDw8IExJU1RWSUVXX0dldFNlbGVjdGlvbk1hcmsgPj4KKwogCiBzdGF0aWMgTFJFU1VMVAogTElTVFZJRVdfR2V0U3RyaW5nV2lkdGgzMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCkBAIC0xMzIsNyArNDU3LDcgQEAKICAgICBpZiAoIWxwc3opCiAJcmV0dXJuIDA7CiAKLSAgICBUUkFDRSAobGlzdHZpZXcsICIoJXMpIGVtcHR5IHN0dWIhXG4iLCBscHN6KTsKKyAgICBUUkFDRSAobGlzdHZpZXcsICIoJXMpXG4iLCBscHN6KTsKIAogICAgIGhGb250ID0gaW5mb1B0ci0+aEZvbnQgPyBpbmZvUHRyLT5oRm9udCA6IEdldFN0b2NrT2JqZWN0MzIgKFNZU1RFTV9GT05UKTsKICAgICBoZGMgPSBHZXREQzMyICgwKTsKQEAgLTE0OSwyMiArNDc0LDQyIEBACiAKIAogCitfX2lubGluZV9fIHN0YXRpYyBMUkVTVUxUCitMSVNUVklFV19HZXRUZXh0QmtDb2xvciAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgcmV0dXJuIGluZm9QdHItPmNsclRleHRCazsKK30KKworCitfX2lubGluZV9fIHN0YXRpYyBMUkVTVUxUCitMSVNUVklFV19HZXRUZXh0Q29sb3IgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTElTVFZJRVdfSU5GTyAqaW5mb1B0ciA9IExJU1RWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIHJldHVybiBpbmZvUHRyLT5jbHJUZXh0OworfQorCisKIHN0YXRpYyBMUkVTVUxUCiBMSVNUVklFV19JbnNlcnRDb2x1bW4zMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgTElTVFZJRVdfSU5GTyAqaW5mb1B0ciA9IExJU1RWSUVXX0dldEluZm9QdHIod25kUHRyKTsKICAgICBMUExWQ09MVU1OMzJBIGxwY29sID0gKExQTFZDT0xVTU4zMkEpbFBhcmFtOworICAgIElOVDMyIG5JbmRleCA9IChJTlQzMil3UGFyYW07CiAgICAgSERJVEVNMzJBIGhkaTsKKyAgICBJTlQzMiBuUmVzdWx0OwogCi0gICAgaWYgKCFscGNvbCkKKyAgICBpZiAoKCFscGNvbCkgfHwgKGluZm9QdHItPm5JdGVtQ291bnQgPiAwKSkKIAlyZXR1cm4gLTE7CiAKLSAgICBUUkFDRSAobGlzdHZpZXcsICIoJWQgJXApIGVtcHR5IHN0dWIhXG4iLCAoSU5UMzIpd1BhcmFtLCBscGNvbCk7CisgICAgRklYTUUgKGxpc3R2aWV3LCAiKCVkICVwKTogc2VtaSBzdHViIVxuIiwgbkluZGV4LCBscGNvbCk7CiAKICAgICBaZXJvTWVtb3J5ICgmaGRpLCBzaXplb2YoSERJVEVNMzJBKSk7CiAKICAgICBpZiAobHBjb2wtPm1hc2sgJiBMVkNGX0ZNVCkgewotCWlmICh3UGFyYW0gPT0gMCkKKwlpZiAobkluZGV4ID09IDApCiAJICAgIGhkaS5mbXQgfD0gSERGX0xFRlQ7CiAJZWxzZSBpZiAobHBjb2wtPmZtdCAmIExWQ0ZNVF9MRUZUKQogCSAgICBoZGkuZm10IHw9IEhERl9MRUZUOwpAQCAtMjAwLDExICs1NDUsOTAgQEAKIAloZGkuaU9yZGVyID0gbHBjb2wtPmlPcmRlcjsKICAgICB9CiAKLSAgICByZXR1cm4gKExSRVNVTFQpU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmRIZWFkZXIsIEhETV9JTlNFUlRJVEVNMzJBLAotCQkJCSAgICB3UGFyYW0sIChMUEFSQU0pJmhkaSk7CisgICAgblJlc3VsdCA9IFNlbmRNZXNzYWdlMzJBIChpbmZvUHRyLT5od25kSGVhZGVyLCBIRE1fSU5TRVJUSVRFTTMyQSwKKwkJCSAgICAgIHdQYXJhbSwgKExQQVJBTSkmaGRpKTsKKyAgICBpZiAoblJlc3VsdCA9PSAtMSkKKwlyZXR1cm4gLTE7CisKKyAgICBpbmZvUHRyLT5uQ29sdW1uQ291bnQrKzsKKworICAgIHJldHVybiBuUmVzdWx0OwogfQogCiAKKy8vIDw8IExJU1RWSUVXX0luc2VydENvbHVtbjMyVyA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19JbnNlcnRJdGVtMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBMVklURU0zMkEgbHBJdGVtID0gKExQTFZJVEVNMzJBKWxQYXJhbTsKKyAgICBMSVNUVklFV19JVEVNICpscExpc3RJdGVtOworICAgIElOVDMyIG5JbmRleDsKKyAgICBOTUxJU1RWSUVXIG5tbHY7CisKKyAgICBpZiAoIWxwSXRlbSkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAoKCFpbmZvUHRyLT5uQ29sdW1uQ291bnQpIHx8IChscEl0ZW0tPmlTdWJJdGVtKSkKKwlyZXR1cm4gLTE7CisKKyAgICBGSVhNRSAobGlzdHZpZXcsICIoJWQgJXApXG4iLCBscEl0ZW0tPmlJdGVtLCBscEl0ZW0pOworCisgICAgbHBMaXN0SXRlbSA9IChMSVNUVklFV19JVEVNKilDT01DVEwzMl9BbGxvYyAoaW5mb1B0ci0+bkNvbHVtbkNvdW50ICogc2l6ZW9mKExJU1RWSUVXX0lURU0pKTsKKyAgICBuSW5kZXggPSBEUEFfSW5zZXJ0UHRyIChpbmZvUHRyLT5oZHBhSXRlbXMsIGxwSXRlbS0+aUl0ZW0sIGxwTGlzdEl0ZW0pOworICAgIGlmIChuSW5kZXggPT0gLTEpCisJcmV0dXJuIC0xOworCisgICAgaWYgKGxwSXRlbS0+bWFzayAmIExWSUZfU1RBVEUpCisJbHBMaXN0SXRlbVswXS5zdGF0ZSA9IGxwSXRlbS0+c3RhdGU7CisKKyAgICBpZiAobHBJdGVtLT5tYXNrICYgTFZJRl9URVhUKSB7CisJaWYgKGxwSXRlbS0+cHN6VGV4dCA9PSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpCisJICAgIGxwTGlzdEl0ZW1bMF0ucHN6VGV4dCA9IExQU1RSX1RFWFRDQUxMQkFDSzMyQTsKKwllbHNlCisJICAgIFN0cl9TZXRQdHIzMkEgKCZscExpc3RJdGVtWzBdLnBzelRleHQsIGxwSXRlbS0+cHN6VGV4dCk7CisgICAgfQorCisgICAgaWYgKGxwSXRlbS0+bWFzayAmIExWSUZfSU1BR0UpCisJbHBMaXN0SXRlbVswXS5pSW1hZ2UgPSBscEl0ZW0tPmlJbWFnZTsKKworICAgIGlmIChscEl0ZW0tPm1hc2sgJiBMVklGX1BBUkFNKQorCWxwTGlzdEl0ZW1bMF0ubFBhcmFtID0gbHBJdGVtLT5sUGFyYW07CisKKyAgICBpZiAobHBJdGVtLT5tYXNrICYgTFZJRl9JTkRFTlQpCisJbHBMaXN0SXRlbVswXS5pSW5kZW50ID0gbHBJdGVtLT5pSW5kZW50OworCisgICAgaW5mb1B0ci0+bkl0ZW1Db3VudCsrOworCisgICAgLyogc2VuZCBub3RpZmljYXRpb24gKi8KKyAgICBaZXJvTWVtb3J5ICgmbm1sdiwgc2l6ZW9mIChOTUxJU1RWSUVXKSk7CisgICAgbm1sdi5oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIG5tbHYuaGRyLmlkRnJvbSAgID0gd25kUHRyLT53SURtZW51OworICAgIG5tbHYuaGRyLmNvZGUgICAgID0gTFZOX0lOU0VSVElURU07CisgICAgbm1sdi5pSXRlbSAgICAgICAgPSBuSW5kZXg7CisgICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAorCQkgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm1sdik7CisKKyAgICByZXR1cm4gbkluZGV4OworfQorCisKKy8vIDw8IExJU1RWSUVXX0luc2VydEl0ZW0zMlcgPj4KKworCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfUmVkcmF3SXRlbXMgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisvLyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgRklYTUUgKGxpc3R2aWV3LCAiKCVkIC0gJWQpOiBlbXB0eSBzdHViIVxuIiwKKwkgICAoSU5UMzIpd1BhcmFtLCAoSU5UMzIpbFBhcmFtKTsKKworICAgIHJldHVybiBUUlVFOworfQorCiAKIAogc3RhdGljIExSRVNVTFQKQEAgLTIxMiwxMCArNjM2LDExIEBACiB7CiAgICAgTElTVFZJRVdfSU5GTyAqaW5mb1B0ciA9IExJU1RWSUVXX0dldEluZm9QdHIod25kUHRyKTsKIAotICAgIGlmICghKGluZm9QdHIpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFpbmZvUHRyKQorCXJldHVybiBGQUxTRTsKIAogICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCi0gICAgVFJBQ0UgKGxpc3R2aWV3LCAiMHglMDZ4XG4iLCAoQ09MT1JSRUYpbFBhcmFtKTsKKyAgICBUUkFDRSAobGlzdHZpZXcsICIweCUwNmx4XG4iLCAoQ09MT1JSRUYpbFBhcmFtKTsKICAgICBpbmZvUHRyLT5jbHJCayA9IChDT0xPUlJFRilsUGFyYW07CiAKICAgICByZXR1cm4gVFJVRTsKQEAgLTIyMyw2ICs2NDgsNjUgQEAKIAogCiBzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfU2V0Q29sdW1uMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBMVkNPTFVNTjMyQSBscGNvbCA9IChMUExWQ09MVU1OMzJBKWxQYXJhbTsKKyAgICBJTlQzMiBuSW5kZXggPSAoSU5UMzIpd1BhcmFtOworICAgIEhESVRFTTMyQSBoZGk7CisKKyAgICBpZiAoIWxwY29sKQorCXJldHVybiAtMTsKKworICAgIEZJWE1FIChsaXN0dmlldywgIiglZCAlcCk6IHNlbWkgc3R1YiFcbiIsIG5JbmRleCwgbHBjb2wpOworCisgICAgWmVyb01lbW9yeSAoJmhkaSwgc2l6ZW9mKEhESVRFTTMyQSkpOworCisgICAgaWYgKGxwY29sLT5tYXNrICYgTFZDRl9GTVQpIHsKKwlpZiAobkluZGV4ID09IDApCisJICAgIGhkaS5mbXQgfD0gSERGX0xFRlQ7CisJZWxzZSBpZiAobHBjb2wtPmZtdCAmIExWQ0ZNVF9MRUZUKQorCSAgICBoZGkuZm10IHw9IEhERl9MRUZUOworCWVsc2UgaWYgKGxwY29sLT5mbXQgJiBMVkNGTVRfUklHSFQpCisJICAgIGhkaS5mbXQgfD0gSERGX1JJR0hUOworCWVsc2UgaWYgKGxwY29sLT5mbXQgJiBMVkNGTVRfQ0VOVEVSKQorCSAgICBoZGkuZm10IHw9IEhERl9DRU5URVI7CisKKwlpZiAobHBjb2wtPmZtdCAmIExWQ0ZNVF9DT0xfSEFTX0lNQUdFUykKKwkgICAgaGRpLmZtdCB8PSBIREZfSU1BR0U7CisJICAgIAorCWhkaS5tYXNrIHw9IEhESV9GT1JNQVQ7CisgICAgfQorCisgICAgaWYgKGxwY29sLT5tYXNrICYgTFZDRl9XSURUSCkgeworICAgICAgICBoZGkubWFzayB8PSBIRElfV0lEVEg7CisJaGRpLmN4eSA9IGxwY29sLT5jeDsKKyAgICB9CisgICAgCisgICAgaWYgKGxwY29sLT5tYXNrICYgTFZDRl9URVhUKSB7CisgICAgICAgIGhkaS5tYXNrIHw9IChIRElfVEVYVCB8IEhESV9GT1JNQVQpOworCWhkaS5wc3pUZXh0ID0gbHBjb2wtPnBzelRleHQ7CisJaGRpLmZtdCB8PSBIREZfU1RSSU5HOworICAgIH0KKworICAgIGlmIChscGNvbC0+bWFzayAmIExWQ0ZfSU1BR0UpIHsKKyAgICAgICAgaGRpLm1hc2sgfD0gSERJX0lNQUdFOworCWhkaS5pSW1hZ2UgPSBscGNvbC0+aUltYWdlOworICAgIH0KKworICAgIGlmIChscGNvbC0+bWFzayAmIExWQ0ZfT1JERVIpIHsKKyAgICAgICAgaGRpLm1hc2sgfD0gSERJX09SREVSOworCWhkaS5pT3JkZXIgPSBscGNvbC0+aU9yZGVyOworICAgIH0KKworICAgIHJldHVybiAoTFJFU1VMVClTZW5kTWVzc2FnZTMyQSAoaW5mb1B0ci0+aHduZEhlYWRlciwgSERNX1NFVElURU0zMkEsCisJCQkJICAgIHdQYXJhbSwgKExQQVJBTSkmaGRpKTsKK30KKworCisKKworc3RhdGljIExSRVNVTFQKIExJU1RWSUVXX1NldEltYWdlTGlzdCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOwpAQCAtMjUyLDYgKzczNiwxNTAgQEAKIAogCiAKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19TZXRJdGVtMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBMVklURU0zMkEgbHBJdGVtID0gKExQTFZJVEVNMzJBKWxQYXJhbTsKKyAgICBMSVNUVklFV19JVEVNICpscFJvdywgKmxwU3ViSXRlbTsKKyAgICBOTUxJU1RWSUVXIG5tbHY7CisKKyAgICBpZiAoIWxwSXRlbSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoKGxwSXRlbS0+aUl0ZW0gPCAwKSB8fCAobHBJdGVtLT5pSXRlbSA+PSBpbmZvUHRyLT5uSXRlbUNvdW50KSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoKGxwSXRlbS0+aVN1Ykl0ZW0gPCAwKSB8fCAobHBJdGVtLT5pU3ViSXRlbSA+PSBpbmZvUHRyLT5uQ29sdW1uQ291bnQpKQorCXJldHVybiBGQUxTRTsKKworICAgIC8qIHNlbmQgTFZOX0lURU1DSEFOR0lORyBub3RpZmljYXRpb24gKi8KKyAgICBaZXJvTWVtb3J5ICgmbm1sdiwgc2l6ZW9mIChOTUxJU1RWSUVXKSk7CisgICAgbm1sdi5oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIG5tbHYuaGRyLmlkRnJvbSAgID0gd25kUHRyLT53SURtZW51OworICAgIG5tbHYuaGRyLmNvZGUgICAgID0gTFZOX0lURU1DSEFOR0lORzsKKyAgICBubWx2LmlJdGVtICAgICAgICA9IGxwSXRlbS0+aUl0ZW07CisgICAgbm1sdi5pU3ViSXRlbSAgICAgPSBscEl0ZW0tPmlTdWJJdGVtOworICAgIG5tbHYudUNoYW5nZWQgICAgID0gbHBJdGVtLT5tYXNrOworCisgICAgaWYgKCFTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCisJCQkgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm1sdikpCisJcmV0dXJuIEZBTFNFOworCisgICAgVFJBQ0UgKGxpc3R2aWV3LCAiKCVkICVkICVwKVxuIiwKKwkgICBscEl0ZW0tPmlJdGVtLCBscEl0ZW0tPmlTdWJJdGVtLCBscEl0ZW0pOworCisgICAgbHBSb3cgPSBEUEFfR2V0UHRyIChpbmZvUHRyLT5oZHBhSXRlbXMsIGxwSXRlbS0+aUl0ZW0pOworICAgIGlmICghbHBSb3cpCisJcmV0dXJuIEZBTFNFOworCisgICAgbHBTdWJJdGVtID0gJmxwUm93W2xwSXRlbS0+aVN1Ykl0ZW1dOworICAgIGlmICghbHBTdWJJdGVtKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmIChscEl0ZW0tPm1hc2sgJiBMVklGX1NUQVRFKQorCWxwU3ViSXRlbS0+c3RhdGUgPSAobHBTdWJJdGVtLT5zdGF0ZSAmIGxwSXRlbS0+c3RhdGVNYXNrKSB8IGxwSXRlbS0+c3RhdGU7CisKKyAgICBpZiAobHBJdGVtLT5tYXNrICYgTFZJRl9URVhUKSB7CisJaWYgKGxwSXRlbS0+cHN6VGV4dCA9PSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpIHsKKwkgICAgaWYgKChscFN1Ykl0ZW0tPnBzelRleHQpICYmCisJCShscFN1Ykl0ZW0tPnBzelRleHQgIT0gTFBTVFJfVEVYVENBTExCQUNLMzJBKSkKKwkJQ09NQ1RMMzJfRnJlZSAobHBTdWJJdGVtLT5wc3pUZXh0KTsKKwkgICAgbHBTdWJJdGVtLT5wc3pUZXh0ID0gTFBTVFJfVEVYVENBTExCQUNLMzJBOworCX0KKwllbHNlIHsKKwkgICAgaWYgKGxwU3ViSXRlbS0+cHN6VGV4dCA9PSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpCisJCWxwU3ViSXRlbS0+cHN6VGV4dCA9IE5VTEw7CisJICAgIFN0cl9TZXRQdHIzMkEgKCZscFN1Ykl0ZW0tPnBzelRleHQsIGxwSXRlbS0+cHN6VGV4dCk7CisJfQorICAgIH0KKworICAgIGlmIChscEl0ZW0tPm1hc2sgJiBMVklGX0lNQUdFKQorCWxwU3ViSXRlbS0+aUltYWdlID0gbHBJdGVtLT5pSW1hZ2U7CisKKyAgICBpZiAobHBJdGVtLT5tYXNrICYgTFZJRl9QQVJBTSkKKwlscFN1Ykl0ZW0tPmxQYXJhbSA9IGxwSXRlbS0+bFBhcmFtOworCisgICAgaWYgKGxwSXRlbS0+bWFzayAmIExWSUZfSU5ERU5UKQorCWxwU3ViSXRlbS0+aUluZGVudCA9IGxwSXRlbS0+aUluZGVudDsKKworICAgIC8qIHNlbmQgTFZOX0lURU1DSEFOR0VEIG5vdGlmaWNhdGlvbiAqLworICAgIG5tbHYuaGRyLmNvZGUgPSBMVk5fSVRFTUNIQU5HRUQ7CisgICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAorCQkgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm1sdik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyA8PCBMSVNUVklFV19TZXRJdGVtMzJXID4+CisvLyA8PCBMSVNUVklFV19TZXRJdGVtQ291bnQgPj4KKworCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfU2V0SXRlbVBvc2l0aW9uIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSU5UMzIgbkluZGV4ID0gKElOVDMyKXdQYXJhbTsKKworICAgIGlmICgobkluZGV4IDwgMCkgfHwgKG5JbmRleCA+PSBpbmZvUHRyLT5uSXRlbUNvdW50KSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBGSVhNRSAobGlzdHZpZXcsICJzZXR0aW5nIHBvc2l0aW9uIFslZCwgJWRdIVxuIiwKKwkgICAoSU5UMzIpTE9XT1JEKGxQYXJhbSksIChJTlQzMilISVdPUkQobFBhcmFtKSk7CisKKyAgICAvKiBGSVhNRTogc2V0IHBvc2l0aW9uICovCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfU2V0VGV4dEJrQ29sb3IgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTElTVFZJRVdfSU5GTyAqaW5mb1B0ciA9IExJU1RWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmICghaW5mb1B0cikKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBzZXQgdGV4dCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgVFJBQ0UgKGxpc3R2aWV3LCAiMHglMDZseFxuIiwgKENPTE9SUkVGKWxQYXJhbSk7CisgICAgaW5mb1B0ci0+Y2xyVGV4dEJrID0gKENPTE9SUkVGKWxQYXJhbTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19TZXRUZXh0Q29sb3IgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTElTVFZJRVdfSU5GTyAqaW5mb1B0ciA9IExJU1RWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmICghaW5mb1B0cikKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBzZXQgdGV4dCBjb2xvciAqLworICAgIFRSQUNFIChsaXN0dmlldywgIjB4JTA2bHhcbiIsIChDT0xPUlJFRilsUGFyYW0pOworICAgIGluZm9QdHItPmNsclRleHQgPSAoQ09MT1JSRUYpbFBhcmFtOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfU29ydEl0ZW1zIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworLy8gICAgTElTVFZJRVdfSU5GTyAqaW5mb1B0ciA9IExJU1RWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIEZJWE1FIChsaXN0dmlldywgImVtcHR5IHN0dWIhXG4iKTsKKworICAgIC8qIGZha2Ugc3VjY2VzcyAqLworICAgIHJldHVybiBUUlVFOworfQorCisKKwogCiBzdGF0aWMgTFJFU1VMVAogTElTVFZJRVdfQ3JlYXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQpAQCAtMjYxLDkgKzg4OSwxMyBAQAogICAgIExPR0ZPTlQzMkEgbG9nRm9udDsKICAgICBEV09SRCBkd1N0eWxlID0gV1NfQ0hJTEQgfCBXU19WSVNJQkxFOyAKIAorICAgIFRSQUNFIChsaXN0dmlldywgInN0eWxlcyAweCUwOGx4IDB4JTA4bHhcbiIsCisJICAgd25kUHRyLT5kd1N0eWxlLCB3bmRQdHItPmR3RXhTdHlsZSk7CiAKICAgICAvKiBpbml0aWFsaXplIGluZm8gc3RydWN0dXJlICovCiAgICAgaW5mb1B0ci0+Y2xyQmsgPSBDTFJfTk9ORTsKKyAgICBpbmZvUHRyLT5jbHJUZXh0ID0gUkdCKDAsIDAsIDApOyAvKiBwcmVsaW1pbmFyeSAqLworICAgIGluZm9QdHItPmNsclRleHRCayA9IFJHQigyNTUsIDI1NSwgMjU1KTsgLyogcHJlbGltaW5hcnkgKi8KIAogICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIExWU19SRVBPUlQpIHx8CiAJICh3bmRQdHItPmR3U3R5bGUgJiBMVlNfTk9DT0xVTU5IRUFERVIpKQpAQCAtMjg2LDggKzkxOCw3IEBACiAgICAgU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmRIZWFkZXIsIFdNX1NFVEZPTlQsCiAJCSAgICAoV1BBUkFNMzIpaW5mb1B0ci0+aEZvbnQsIChMUEFSQU0pVFJVRSk7CiAKLQotICAgIGluZm9QdHItPmhkc2FJdGVtcyA9IERTQV9DcmVhdGUgKHNpemVvZihMSVNUVklFV19JVEVNKSwgMTApOworICAgIGluZm9QdHItPmhkcGFJdGVtcyA9IERQQV9DcmVhdGUgKDEwKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjk4LDcgKzkyOSwxMSBAQAogewogICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CiAKLSAgICBEU0FfRGVzdHJveSAoaW5mb1B0ci0+aGRzYUl0ZW1zKTsKKyAgICAvKiBkZWxldGUgYWxsIGl0ZW1zICovCisgICAgTElTVFZJRVdfRGVsZXRlQWxsSXRlbXMgKHduZFB0cik7CisKKyAgICAvKiBkZXN0cm95IGRwYSAqLworICAgIERQQV9EZXN0cm95IChpbmZvUHRyLT5oZHBhSXRlbXMpOwogCiAgICAgLyogZGVzdHJveSBoZWFkZXIgKi8KICAgICBpZiAoaW5mb1B0ci0+aHduZEhlYWRlcikKQEAgLTMzMCw3ICs5NjUsOCBAQAogCURlbGV0ZU9iamVjdDMyIChoQnJ1c2gpOwogCXJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIApAQCAtMzQ1LDcgKzk4MSw3OCBAQAogCiAvLyA8PCBMSVNUVklFV19IU2Nyb2xsID4+CiAvLyA8PCBMSVNUVklFV19LZXlEb3duID4+Ci0vLyA8PCBMSVNUVklFV19LaWxsRm9jdXMgPj4KKworCitzdGF0aWMgTFJFU1VMVAorTElTVFZJRVdfS2lsbEZvY3VzIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTk1IRFIgbm1oOworCisgICAgRklYTUUgKGxpc3R2aWV3LCAic2VtaSBzdHViIVxuIik7CisKKyAgICBubWguaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIG5taC5pZEZyb20gICA9IHduZFB0ci0+d0lEbWVudTsKKyAgICBubWguY29kZSA9IE5NX0tJTExGT0NVUzsKKworICAgIFNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJICAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJm5taCk7CisKKyAgICBpbmZvUHRyLT5iRm9jdXMgPSBGQUxTRTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19MQnV0dG9uRGJsQ2xrIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTk1MSVNUVklFVyBubWx2OworCisgICAgRklYTUUgKGxpc3R2aWV3LCAic2VtaSBzdHViIVxuIik7CisKKyAgICBaZXJvTWVtb3J5ICgmbm1sdiwgc2l6ZW9mKE5NTElTVFZJRVcpKTsKKyAgICBubWx2Lmhkci5od25kRnJvbSA9IHduZFB0ci0+aHduZFNlbGY7CisgICAgbm1sdi5oZHIuaWRGcm9tICAgPSB3bmRQdHItPndJRG1lbnU7CisgICAgbm1sdi5oZHIuY29kZSA9IE5NX0RCTENMSzsKKyAgICBubWx2LmlJdGVtICAgID0gLTE7CisgICAgbm1sdi5pU3ViSXRlbSA9IDA7CisgICAgbm1sdi5wdEFjdGlvbi54ID0gKElOVDMyKUxPV09SRChsUGFyYW0pOworICAgIG5tbHYucHRBY3Rpb24ueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKKworICAgIFNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJICAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJm5tbHYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK0xJU1RWSUVXX0xCdXR0b25Eb3duIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTk1MSVNUVklFVyBubWx2OworCisgICAgRklYTUUgKGxpc3R2aWV3LCAic2VtaSBzdHViIVxuIik7CisKKyAgICBaZXJvTWVtb3J5ICgmbm1sdiwgc2l6ZW9mKE5NTElTVFZJRVcpKTsKKyAgICBubWx2Lmhkci5od25kRnJvbSA9IHduZFB0ci0+aHduZFNlbGY7CisgICAgbm1sdi5oZHIuaWRGcm9tICAgPSB3bmRQdHItPndJRG1lbnU7CisgICAgbm1sdi5oZHIuY29kZSA9IE5NX0NMSUNLOworICAgIG5tbHYuaUl0ZW0gICAgPSAtMTsKKyAgICBubWx2LmlTdWJJdGVtID0gMDsKKyAgICBubWx2LnB0QWN0aW9uLnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgICAgbm1sdi5wdEFjdGlvbi55ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOworCisgICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAorCQkgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm1sdik7CisKKyAgICBpZiAoIWluZm9QdHItPmJGb2N1cykKKwlTZXRGb2N1czMyICh3bmRQdHItPmh3bmRTZWxmKTsKKworICAgIHJldHVybiAwOworfQogCiAKIHN0YXRpYyBMUkVTVUxUCkBAIC0zODcsNiArMTA5NCwyNSBAQAogCiAKIHN0YXRpYyBMUkVTVUxUCitMSVNUVklFV19Ob3RpZnkgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTElTVFZJRVdfSU5GTyAqaW5mb1B0ciA9IExJU1RWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBMUE5NSERSIGxwbm1oID0gKExQTk1IRFIpbFBhcmFtOworCisgICAgaWYgKGxwbm1oLT5od25kRnJvbSA9PSBpbmZvUHRyLT5od25kSGVhZGVyKSB7CisKKwlGSVhNRSAobGlzdHZpZXcsICJXTV9OT1RJRlkgZnJvbSBoZWFkZXIhXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisKKwlGSVhNRSAobGlzdHZpZXcsICJXTV9OT1RJRlkgZnJvbSB1bmtub3duIHNvdXJjZSFcbiIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCiBMSVNUVklFV19QYWludCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKICAgICBIREMzMiBoZGM7CkBAIC00MDAsNiArMTEyNiw3MyBAQAogfQogCiAKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19SQnV0dG9uRGJsQ2xrIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExJU1RWSUVXX0lORk8gKmluZm9QdHIgPSBMSVNUVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTk1MSVNUVklFVyBubWx2OworCisgICAgRklYTUUgKGxpc3R2aWV3LCAic2VtaSBzdHViIVxuIik7CisKKyAgICBaZXJvTWVtb3J5ICgmbm1sdiwgc2l6ZW9mKE5NTElTVFZJRVcpKTsKKyAgICBubWx2Lmhkci5od25kRnJvbSA9IHduZFB0ci0+aHduZFNlbGY7CisgICAgbm1sdi5oZHIuaWRGcm9tICAgPSB3bmRQdHItPndJRG1lbnU7CisgICAgbm1sdi5oZHIuY29kZSA9IE5NX1JEQkxDTEs7CisgICAgbm1sdi5pSXRlbSAgICA9IC0xOworICAgIG5tbHYuaVN1Ykl0ZW0gPSAwOworICAgIG5tbHYucHRBY3Rpb24ueCA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKKyAgICBubWx2LnB0QWN0aW9uLnkgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisKKyAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCisJCSAgICAoV1BBUkFNMzIpd25kUHRyLT53SURtZW51LCAoTFBBUkFNKSZubWx2KTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19SQnV0dG9uRG93biAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIE5NTElTVFZJRVcgbm1sdjsKKworICAgIEZJWE1FIChsaXN0dmlldywgInNlbWkgc3R1YiFcbiIpOworCisgICAgWmVyb01lbW9yeSAoJm5tbHYsIHNpemVvZihOTUxJU1RWSUVXKSk7CisgICAgbm1sdi5oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIG5tbHYuaGRyLmlkRnJvbSAgID0gd25kUHRyLT53SURtZW51OworICAgIG5tbHYuaGRyLmNvZGUgPSBOTV9SQ0xJQ0s7CisgICAgbm1sdi5pSXRlbSAgICA9IC0xOworICAgIG5tbHYuaVN1Ykl0ZW0gPSAwOworICAgIG5tbHYucHRBY3Rpb24ueCA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKKyAgICBubWx2LnB0QWN0aW9uLnkgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisKKyAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCisJCSAgICAoV1BBUkFNMzIpd25kUHRyLT53SURtZW51LCAoTFBBUkFNKSZubWx2KTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitMSVNUVklFV19TZXRGb2N1cyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIE5NSERSIG5taDsKKworICAgIEZJWE1FIChsaXN0dmlldywgInNlbWkgc3R1YiFcbiIpOworCisgICAgbm1oLmh3bmRGcm9tID0gd25kUHRyLT5od25kU2VsZjsKKyAgICBubWguaWRGcm9tICAgPSB3bmRQdHItPndJRG1lbnU7CisgICAgbm1oLmNvZGUgPSBOTV9TRVRGT0NVUzsKKworICAgIFNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJICAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJm5taCk7CisKKyAgICBpbmZvUHRyLT5iRm9jdXMgPSBUUlVFOworCisgICAgcmV0dXJuIDA7Cit9CiAKIAogc3RhdGljIExSRVNVTFQKQEAgLTQzMywyNCArMTIyNiwyOCBAQAogTElTVFZJRVdfU2l6ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBMSVNUVklFV19JTkZPICppbmZvUHRyID0gTElTVFZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIEhETEFZT1VUIGhsOwotICAgIFdJTkRPV1BPUzMyIHdwOwotICAgIFJFQ1QzMiByYzsKLQotICAgIHJjLnRvcCA9IDA7Ci0gICAgcmMubGVmdCA9IDA7Ci0gICAgcmMucmlnaHQgPSBMT1dPUkQobFBhcmFtKTsKLSAgICByYy5ib3R0b20gPSBISVdPUkQobFBhcmFtKTsKLQotICAgIGhsLnByYyA9ICZyYzsKLSAgICBobC5wd3BvcyA9ICZ3cDsKLSAgICBTZW5kTWVzc2FnZTMyQSAoaW5mb1B0ci0+aHduZEhlYWRlciwgSERNX0xBWU9VVCwgMCwgKExQQVJBTSkmaGwpOwotCi0gICAgU2V0V2luZG93UG9zMzIgKGluZm9QdHItPmh3bmRIZWFkZXIsIHduZFB0ci0+aHduZFNlbGYsCi0JCSAgICB3cC54LCB3cC55LCB3cC5jeCwgd3AuY3ksIHdwLmZsYWdzKTsKIAogICAgIEdldENsaWVudFJlY3QzMiAod25kUHRyLT5od25kU2VsZiwgJmluZm9QdHItPnJjTGlzdCk7Ci0gICAgaW5mb1B0ci0+cmNMaXN0LnRvcCArPSB3cC5jeTsKKworICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBMVlNfUkVQT1JUKSB7CisJSERMQVlPVVQgaGw7CisJV0lORE9XUE9TMzIgd3A7CisJUkVDVDMyIHJjOworCisJcmMudG9wID0gMDsKKwlyYy5sZWZ0ID0gMDsKKwlyYy5yaWdodCA9IExPV09SRChsUGFyYW0pOworCXJjLmJvdHRvbSA9IEhJV09SRChsUGFyYW0pOworCisJaGwucHJjID0gJnJjOworCWhsLnB3cG9zID0gJndwOworCVNlbmRNZXNzYWdlMzJBIChpbmZvUHRyLT5od25kSGVhZGVyLCBIRE1fTEFZT1VULCAwLCAoTFBBUkFNKSZobCk7CisKKwlTZXRXaW5kb3dQb3MzMiAoaW5mb1B0ci0+aHduZEhlYWRlciwgd25kUHRyLT5od25kU2VsZiwKKwkJCXdwLngsIHdwLnksIHdwLmN4LCB3cC5jeSwgd3AuZmxhZ3MpOworCisJaW5mb1B0ci0+cmNMaXN0LnRvcCArPSB3cC5jeTsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQ2MywyNCArMTI2MCw1NCBAQAogCiAgICAgc3dpdGNoICh1TXNnKQogICAgIHsKLS8vCWNhc2UgTFZNX0RFTEVURUFMTElURU1TOgorLy8JY2FzZSBMVk1fQVBQUk9YSU1BVEVWSUVXUkVDVDoKKy8vCWNhc2UgTFZNX0FSUkFOR0U6CisvLwljYXNlIExWTV9DUkVBVEVEUkFHSU1BR0U6CiAKLSAgICAgICAgY2FzZSBMVk1fR0VUQktDT0xPUjoKKwljYXNlIExWTV9ERUxFVEVBTExJVEVNUzoKKwkgICAgcmV0dXJuIExJU1RWSUVXX0RlbGV0ZUFsbEl0ZW1zICh3bmRQdHIpOworCisJY2FzZSBMVk1fREVMRVRFQ09MVU1OOgorCSAgICByZXR1cm4gTElTVFZJRVdfRGVsZXRlQ29sdW1uICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgTFZNX0RFTEVURUlURU06CisJICAgIHJldHVybiBMSVNUVklFV19EZWxldGVJdGVtICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fRURJVExBQkVMOgorLy8JY2FzZSBMVk1fRU5TVVJFVklTSUJMRToKKy8vCWNhc2UgTFZNX0ZJTkRJVEVNOgorCisJY2FzZSBMVk1fR0VUQktDT0xPUjoKIAkgICAgcmV0dXJuIExJU1RWSUVXX0dldEJrQ29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisvLwljYXNlIExWTV9HRVRCS0lNQUdFOgorLy8JY2FzZSBMVk1fR0VUQ0FMTEJBQ0tNQVNLOgogCi0gICAgICAgIGNhc2UgTFZNX0dFVENPTFVNTldJRFRIOgorCWNhc2UgTFZNX0dFVENPTFVNTjMyQToKKwkgICAgcmV0dXJuIExJU1RWSUVXX0dldENvbHVtbjMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgTFZNX0dFVENPTFVNTjMyVzoKKy8vCWNhc2UgTFZNX0dFVENPTFVNTk9SREVSQVJSQVk6CisKKwljYXNlIExWTV9HRVRDT0xVTU5XSURUSDoKIAkgICAgcmV0dXJuIExJU1RWSUVXX0dldENvbHVtbldpZHRoICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAorLy8JY2FzZSBMVk1fR0VUQ09VTlRQRVJQQUdFOgorLy8JY2FzZSBMVk1fR0VURURJVENPTlRST0w6CisvLwljYXNlIExWTV9HRVRFWFRFTkRFRExJU1RWSUVXU1RZTEU6CiAKLSAgICAgICAgY2FzZSBMVk1fR0VUSEVBREVSOgorCWNhc2UgTFZNX0dFVEhFQURFUjoKIAkgICAgcmV0dXJuIExJU1RWSUVXX0dldEhlYWRlciAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgTFZNX0dFVElTRUFSQ0hTVFJJTkc6CisvLwljYXNlIExWTV9HRVRIT1RDVVJTT1I6CisvLwljYXNlIExWTV9HRVRIT1RJVEVNOgorLy8JY2FzZSBMVk1fR0VUSE9WRVJUSU1FOgogCiAJY2FzZSBMVk1fR0VUSU1BR0VMSVNUOgogCSAgICByZXR1cm4gTElTVFZJRVdfR2V0SW1hZ2VMaXN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAorLy8JY2FzZSBMVk1fR0VUSVNFQVJDSFNUUklORzoKKwogCWNhc2UgTFZNX0dFVElURU0zMkE6CiAJICAgIHJldHVybiBMSVNUVklFV19HZXRJdGVtMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIApAQCAtNDg5LDcgKzEzMTYsMjggQEAKIAljYXNlIExWTV9HRVRJVEVNQ09VTlQ6CiAJICAgIHJldHVybiBMSVNUVklFV19HZXRJdGVtQ291bnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIExWTV9HRVRTRUxFQ1RFRENPVU5UOgorCWNhc2UgTFZNX0dFVElURU1QT1NJVElPTjoKKwkgICAgcmV0dXJuIExJU1RWSUVXX0dldEl0ZW1Qb3NpdGlvbiAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgTFZNX0dFVElURU1SRUNUOgorLy8JY2FzZSBMVk1fR0VUSVRFTVNQQUNJTkc6CisvLwljYXNlIExWTV9HRVRJVEVNU1RBVEU6CisKKwljYXNlIExWTV9HRVRJVEVNVEVYVDMyQToKKwkgICAgcmV0dXJuIExJU1RWSUVXX0dldEl0ZW1UZXh0MzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fR0VUSVRFTVRFWFQzMlc6CisKKwljYXNlIExWTV9HRVRORVhUSVRFTToKKwkgICAgcmV0dXJuIExJU1RWSUVXX0dldE5leHRJdGVtICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fR0VUTlVNQkVST0ZXT1JLQVJFQVM6CisvLwljYXNlIExWTV9HRVRPUklHSU46CisKKwljYXNlIExWTV9HRVRTRUxFQ1RFRENPVU5UOgorCSAgICByZXR1cm4gTElTVFZJRVdfR2V0U2VsZWN0ZWRDb3VudCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgTFZNX0dFVFNFTEVDVElPTk1BUks6CiAKIAljYXNlIExWTV9HRVRTVFJJTkdXSURUSDMyQToKIAkgICAgcmV0dXJuIExJU1RWSUVXX0dldFN0cmluZ1dpZHRoMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTQ5NywyNiArMTM0NSw4NSBAQAogLy8JY2FzZSBMVk1fR0VUU1RSSU5HV0lEVEgzMlc6CiAvLwljYXNlIExWTV9HRVRTVUJJVEVNUkVDVDoKIAorCWNhc2UgTFZNX0dFVFRFWFRCS0NPTE9SOgorCSAgICByZXR1cm4gTElTVFZJRVdfR2V0VGV4dEJrQ29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBMVk1fR0VUVEVYVENPTE9SOgorCSAgICByZXR1cm4gTElTVFZJRVdfR2V0VGV4dENvbG9yICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fR0VUVE9PTFRJUFM6CisvLwljYXNlIExWTV9HRVRUT1BJTkRFWDoKKy8vCWNhc2UgTFZNX0dFVFVOSUNPREVGT1JNQVQ6CisvLwljYXNlIExWTV9HRVRWSUVXUkVDVDoKKy8vCWNhc2UgTFZNX0dFVFdPUktBUkVBUzoKKy8vCWNhc2UgTFZNX0hJVFRFU1Q6CisKIAljYXNlIExWTV9JTlNFUlRDT0xVTU4zMkE6CiAJICAgIHJldHVybiBMSVNUVklFV19JbnNlcnRDb2x1bW4zMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0KIC8vCWNhc2UgTFZNX0lOU0VSVENPTFVNTjMyVzoKIAotLy8JY2FzZSBMVk1fSU5TRVJUSVRFTTMyQToKKwljYXNlIExWTV9JTlNFUlRJVEVNMzJBOgorCSAgICByZXR1cm4gTElTVFZJRVdfSW5zZXJ0SXRlbTMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKIC8vCWNhc2UgTFZNX0lOU0VSVElURU0zMlc6CiAKKwljYXNlIExWTV9SRURSQVdJVEVNUzoKKwkgICAgcmV0dXJuIExJU1RWSUVXX1JlZHJhd0l0ZW1zICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fU0NST0xMOgogCiAJY2FzZSBMVk1fU0VUQktDT0xPUjoKIAkgICAgcmV0dXJuIExJU1RWSUVXX1NldEJrQ29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisvLwljYXNlIExWTV9TRVRCS0lNQUdFOgorLy8JY2FzZSBMVk1fU0VUQ0FMTEJBQ0tNQVNLOgorCisJY2FzZSBMVk1fU0VUQ09MVU1OMzJBOgorCSAgICByZXR1cm4gTElTVFZJRVdfU2V0Q29sdW1uMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fU0VUQ09MVU1OMzJXOgorLy8JY2FzZSBMVk1fU0VUQ09MVU1OT1JERVJBUlJBWToKKy8vCWNhc2UgTFZNX1NFVENPTFVNTldJRFRIOgorLy8JY2FzZSBMVk1fU0VURVhURU5ERURMSVNUVklFV1NUWUxFOgorLy8JY2FzZSBMVk1fU0VUSE9UQ1VSU09SOgorLy8JY2FzZSBMVk1fU0VUSE9USVRFTToKKy8vCWNhc2UgTFZNX1NFVEhPVkVSVElNRToKKy8vCWNhc2UgTFZNX1NFVElDT05TUEFDSU5HOgogCQogCWNhc2UgTFZNX1NFVElNQUdFTElTVDoKIAkgICAgcmV0dXJuIExJU1RWSUVXX1NldEltYWdlTGlzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgTFZNX1NFVElURU1QT1NJVElPTjoKKwljYXNlIExWTV9TRVRJVEVNMzJBOgorCSAgICByZXR1cm4gTElTVFZJRVdfU2V0SXRlbTMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgTFZNX1NPUlRJVEVNUzoKKy8vCWNhc2UgTFZNX1NFVElURU0zMlc6CisvLwljYXNlIExWTV9TRVRJVEVNQ09VTlQ6CisKKwljYXNlIExWTV9TRVRJVEVNUE9TSVRJT046CisJICAgIHJldHVybiBMSVNUVklFV19TZXRJdGVtUG9zaXRpb24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIExWTV9TRVRJVEVNUE9TSVRJT04zMjoKKy8vCWNhc2UgTFZNX1NFVElURU1TVEFURToKKy8vCWNhc2UgTFZNX1NFVElURU1URVhUOgorLy8JY2FzZSBMVk1fU0VUU0VMRUNUSU9OTUFSSzoKKworCWNhc2UgTFZNX1NFVFRFWFRCS0NPTE9SOgorCSAgICByZXR1cm4gTElTVFZJRVdfU2V0VGV4dEJrQ29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBMVk1fU0VUVEVYVENPTE9SOgorCSAgICByZXR1cm4gTElTVFZJRVdfU2V0VGV4dENvbG9yICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fU0VUVE9PTFRJUFM6CisvLwljYXNlIExWTV9TRVRVTklDT0RFRk9STUFUOgorLy8JY2FzZSBMVk1fU0VUV09SS0FSRUFTOgorCisJY2FzZSBMVk1fU09SVElURU1TOgorCSAgICByZXR1cm4gTElTVFZJRVdfU29ydEl0ZW1zICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBMVk1fU1VCSVRFTUhJVFRFU1Q6CisvLwljYXNlIExWTV9VUERBVEU6CisKIAogCiAvLwljYXNlIFdNX0NIQVI6CkBAIC01MzgsNiArMTQ0NSwxNiBAQAogCSAgICByZXR1cm4gTElTVFZJRVdfR2V0Rm9udCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIC8vCWNhc2UgV01fSFNDUk9MTDoKKy8vCWNhc2UgV01fS0VZRE9XTjoKKworCWNhc2UgV01fS0lMTEZPQ1VTOgorCSAgICByZXR1cm4gTElTVFZJRVdfS2lsbEZvY3VzICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgV01fTEJVVFRPTkRCTENMSzoKKwkgICAgcmV0dXJuIExJU1RWSUVXX0xCdXR0b25EYmxDbGsgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBXTV9MQlVUVE9ORE9XTjoKKwkgICAgcmV0dXJuIExJU1RWSUVXX0xCdXR0b25Eb3duICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogLy8JY2FzZSBXTV9NT1VTRU1PVkU6CiAvLwkgICAgcmV0dXJuIExJU1RWSUVXX01vdXNlTW92ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC01NDgsMTMgKzE0NjUsMjAgQEAKIAljYXNlIFdNX05DREVTVFJPWToKIAkgICAgcmV0dXJuIExJU1RWSUVXX05DRGVzdHJveSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgV01fTk9USUZZOgorCWNhc2UgV01fTk9USUZZOgorCSAgICByZXR1cm4gTElTVFZJRVdfTm90aWZ5ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogCWNhc2UgV01fUEFJTlQ6CiAJICAgIHJldHVybiBMSVNUVklFV19QYWludCAod25kUHRyLCB3UGFyYW0pOwogCi0vLwljYXNlIFdNX1JCVVRUT05ET1dOOgotLy8JY2FzZSBXTV9TRVRGT0NVUzoKKwljYXNlIFdNX1JCVVRUT05EQkxDTEs6CisJICAgIHJldHVybiBMSVNUVklFV19SQnV0dG9uRGJsQ2xrICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgV01fUkJVVFRPTkRPV046CisJICAgIHJldHVybiBMSVNUVklFV19SQnV0dG9uRG93biAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFdNX1NFVEZPQ1VTOgorCSAgICByZXR1cm4gTElTVFZJRVdfU2V0Rm9jdXMgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBXTV9TRVRGT05UOgogCSAgICByZXR1cm4gTElTVFZJRVdfU2V0Rm9udCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CmRpZmYgLS1naXQgYS9kbGxzL2NvbWN0bDMyL3BhZ2VyLmMgYi9kbGxzL2NvbWN0bDMyL3BhZ2VyLmMKaW5kZXggZTVjMjMxZS4uODE1YTU1ZiAxMDA2NDQKLS0tIGEvZGxscy9jb21jdGwzMi9wYWdlci5jCisrKyBiL2RsbHMvY29tY3RsMzIvcGFnZXIuYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAgICAgU2V0UGFyZW50MzIgKGluZm9QdHItPmh3bmRDaGlsZCwgd25kUHRyLT5od25kU2VsZik7CiAgICAgU2V0V2luZG93UG9zMzIgKGluZm9QdHItPmh3bmRDaGlsZCwgd25kUHRyLT5od25kU2VsZiwKIAkJICAgIDAsIDAsIDQwLCA0MCwgU1dQX1NIT1dXSU5ET1cpOwotICAgIFJlZHJhd1dpbmRvdzMyICh3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCAwLCBSRFdfSU5WQUxJREFURSk7CisgICAgUmVkcmF3V2luZG93MzIgKHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIE5VTEwsIFJEV19JTlZBTElEQVRFKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZGxscy9jb21jdGwzMi9wcm9ncmVzcy5jIGIvZGxscy9jb21jdGwzMi9wcm9ncmVzcy5jCmluZGV4IDNhY2IyOTQuLmFkMDg4NzIgMTAwNjQ0Ci0tLSBhL2RsbHMvY29tY3RsMzIvcHJvZ3Jlc3MuYworKysgYi9kbGxzL2NvbWN0bDMyL3Byb2dyZXNzLmMKQEAgLTgsOSArOCw4IEBACiAgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJwcm9ncmVzcy5oIgogI2luY2x1ZGUgImNvbW1jdHJsLmgiCi0jaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMTg1LDggKzE4NCw3IEBACiAgICAgY2FzZSBXTV9DUkVBVEU6CiAgICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGluZm8gc3RydWN0ICovCiAgICAgICBpbmZvUHRyID0gCi0JKFBST0dSRVNTX0lORk8gKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBST0dSRVNTX0lORk8pKTsKKwkoUFJPR1JFU1NfSU5GTyAqKUNPTUNUTDMyX0FsbG9jIChzaXplb2YoUFJPR1JFU1NfSU5GTykpOwogICAgICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpaW5mb1B0cjsKIAogICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgaW5mbyBzdHJ1Y3QgKi8KQEAgLTIwMCw4ICsxOTgsOCBAQAogICAgICAgYnJlYWs7CiAgICAgCiAgICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgVFJBQ0UocHJvZ3Jlc3MsICJQcm9ncmVzcyBDdHJsIGRlc3RydWN0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQpOwotICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyKTsKKyAgICAgIFRSQUNFIChwcm9ncmVzcywgIlByb2dyZXNzIEN0cmwgZGVzdHJ1Y3Rpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CisgICAgICBDT01DVEwzMl9GcmVlIChpbmZvUHRyKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgpAQCAtMzI4LDExICszMjYsMTIgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBQUk9HUkVTU19SZWdpc3RlciBbSW50ZXJuYWxdCisgKiBQUk9HUkVTU19SZWdpc3RlciBbSW50ZXJuYWxdCiAgKgogICogUmVnaXN0ZXJzIHRoZSBwcm9ncmVzcyBiYXIgd2luZG93IGNsYXNzLgogICogCiAgKi8KKwogdm9pZCAKIFBST0dSRVNTX1JlZ2lzdGVyKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kbGxzL2NvbWN0bDMyL3JlYmFyLmMgYi9kbGxzL2NvbWN0bDMyL3JlYmFyLmMKaW5kZXggYjI3YjVmNS4uMjkzNmQ5NiAxMDA2NDQKLS0tIGEvZGxscy9jb21jdGwzMi9yZWJhci5jCisrKyBiL2RsbHMvY29tY3RsMzIvcmViYXIuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgogI2luY2x1ZGUgInJlYmFyLmgiCi0jaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTQyLDEwICs0MSwyNCBAQAogCiAKIAotCi0KIC8vIDw8IFJFQkFSX0JlZ2luRHJhZyA+PgotLy8gPDwgUkVCQVJfRGVsZXRlQmFuZCA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitSRUJBUl9EZWxldGVCYW5kIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFJFQkFSX0lORk8gKmluZm9QdHIgPSBSRUJBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworICAgIFVJTlQzMiB1QmFuZCA9IChVSU5UMzIpd1BhcmFtOworCisgICAgaWYgKHVCYW5kID49IGluZm9QdHItPnVOdW1CYW5kcykKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBGSVhNRSAocmViYXIsICJkZWxldGluZyBiYW5kICV1IVxuIiwgdUJhbmQpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKwogLy8gPDwgUkVCQVJfRHJhZ01vdmUgPj4KIC8vIDw8IFJFQkFSX0VuZERyYWcgPj4KIC8vIDw8IFJFQkFSX0dldEJhbmRCb3JkZXJzID4+CkBAIC0yNDYsMTYgKzI1OSwxMyBAQAogICAgIFRSQUNFIChyZWJhciwgImluc2VydCBiYW5kIGF0ICV1IVxuIiwgdUluZGV4KTsKIAogICAgIGlmIChpbmZvUHRyLT51TnVtQmFuZHMgPT0gMCkgewotCWluZm9QdHItPmJhbmRzID0KLQkgICAgKFJFQkFSX0JBTkQgKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCSAgICAgc2l6ZW9mIChSRUJBUl9CQU5EKSk7CisJaW5mb1B0ci0+YmFuZHMgPSAoUkVCQVJfQkFORCAqKUNPTUNUTDMyX0FsbG9jIChzaXplb2YgKFJFQkFSX0JBTkQpKTsKIAl1SW5kZXggPSAwOwogICAgIH0KICAgICBlbHNlIHsKIAlSRUJBUl9CQU5EICpvbGRCYW5kcyA9IGluZm9QdHItPmJhbmRzOwogCWluZm9QdHItPmJhbmRzID0KLQkgICAgKFJFQkFSX0JBTkQgKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCSAgICAgKGluZm9QdHItPnVOdW1CYW5kcysxKSpzaXplb2YoUkVCQVJfQkFORCkpOworCSAgICAoUkVCQVJfQkFORCAqKUNPTUNUTDMyX0FsbG9jICgoaW5mb1B0ci0+dU51bUJhbmRzKzEpKnNpemVvZihSRUJBUl9CQU5EKSk7CiAJaWYgKCgoSU5UMzIpdUluZGV4ID09IC0xKSB8fCAodUluZGV4ID4gaW5mb1B0ci0+dU51bUJhbmRzKSkKIAkgICAgdUluZGV4ID0gaW5mb1B0ci0+dU51bUJhbmRzOwogCkBAIC0yNzEsNyArMjgxLDcgQEAKIAkJICAgIChpbmZvUHRyLT51TnVtQmFuZHMgLSB1SW5kZXggLSAxKSAqIHNpemVvZihSRUJBUl9CQU5EKSk7CiAJfQogCi0JSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCAmb2xkQmFuZHMpOworCUNPTUNUTDMyX0ZyZWUgKCZvbGRCYW5kcyk7CiAgICAgfQogCiAgICAgaW5mb1B0ci0+dU51bUJhbmRzKys7CkBAIC0yOTIsOCArMzAyLDcgQEAKICAgICBpZiAoKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9URVhUKSAmJiAobHByYmJpLT5scFRleHQpKSB7CiAJSU5UMzIgbGVuID0gbHN0cmxlbjMyQSAobHByYmJpLT5scFRleHQpOwogCWlmIChsZW4gPiAwKSB7Ci0JICAgIGxwQmFuZC0+bHBUZXh0ID0gCi0JCShMUFNUUilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4gKyAxKTsKKwkgICAgbHBCYW5kLT5scFRleHQgPSAoTFBTVFIpQ09NQ1RMMzJfQWxsb2MgKGxlbiArIDEpOwogCSAgICBsc3RyY3B5MzJBIChscEJhbmQtPmxwVGV4dCwgbHByYmJpLT5scFRleHQpOwogCX0KICAgICB9CkBAIC0zNzcsOCArMzg2LDcgQEAKIC8qCiAJSU5UMzIgbGVuID0gbHN0cmxlbjMyQSAobHByYmJpLT5scFRleHQpOwogCWlmIChsZW4gPiAwKSB7Ci0JICAgIGxwQmFuZC0+bHBUZXh0ID0gCi0JCShMUFNUUilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4gKyAxKTsKKwkgICAgbHBCYW5kLT5scFRleHQgPSAoTFBTVFIpQ09NQ1RMMzJfQWxsb2MgKGxlbiArIDEpOwogCSAgICBsc3RyY3B5MzJBIChscEJhbmQtPmxwVGV4dCwgbHByYmJpLT5scFRleHQpOwogCX0KICovCkBAIC01NjYsMTMgKzU3NCwxMyBAQAogCiAJICAgIC8qIGRlbGV0ZSB0ZXh0IHN0cmluZ3MgKi8KIAkgICAgaWYgKGxwQmFuZC0+bHBUZXh0KSB7Ci0JCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgbHBCYW5kLT5scFRleHQpOworCQlDT01DVEwzMl9GcmVlIChscEJhbmQtPmxwVGV4dCk7CiAJCWxwQmFuZC0+bHBUZXh0ID0gTlVMTDsKIAkgICAgfQogCX0KIAogCS8qIGZyZWUgYmFuZCBhcnJheSAqLwotCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+YmFuZHMpOworCUNPTUNUTDMyX0ZyZWUgKGluZm9QdHItPmJhbmRzKTsKIAlpbmZvUHRyLT5iYW5kcyA9IE5VTEw7CiAgICAgfQogCkBAIC02MDgsNyArNjE2LDEwIEBACiAgICAgc3dpdGNoICh1TXNnKQogICAgIHsKIC8vCWNhc2UgUkJfQkVHSU5EUkFHOgotLy8JY2FzZSBSQl9ERUxFVEVCQU5EOgorCisJY2FzZSBSQl9ERUxFVEVCQU5EOgorCSAgICByZXR1cm4gUkVCQVJfRGVsZXRlQmFuZCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKIC8vCWNhc2UgUkJfRFJBR01PVkU6CiAvLwljYXNlIFJCX0VORERSQUc6CiAvLwljYXNlIFJCX0dFVEJBTkRCT1JERVJTOgpAQCAtNjIxLDcgKzYzMiw2IEBACiAJY2FzZSBSQl9HRVRCQU5ESU5GTzMyQToKIAkgICAgcmV0dXJuIFJFQkFSX0dldEJhbmRJbmZvMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotCiAvLwljYXNlIFJCX0dFVEJBTkRJTkZPMzJXOgogCiAJY2FzZSBSQl9HRVRCQVJIRUlHSFQ6CmRpZmYgLS1naXQgYS9kbGxzL2NvbWN0bDMyL3N0YXR1cy5jIGIvZGxscy9jb21jdGwzMi9zdGF0dXMuYwppbmRleCA2NTM2ZmE5Li5hMmM3MTBlIDEwMDY0NAotLS0gYS9kbGxzL2NvbWN0bDMyL3N0YXR1cy5jCisrKyBiL2RsbHMvY29tY3RsMzIvc3RhdHVzLmMKQEAgLTYsOSArNiw4IEBACiAgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJzdGF0dXMuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgotI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJzdGF0dXMuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC01MjgsMTcgKzUyNywxNiBAQAogICAgIGlmIChvbGROdW1QYXJ0cyA+IHNlbGYtPm51bVBhcnRzKSB7CiAJZm9yIChpID0gc2VsZi0+bnVtUGFydHMgOyBpIDwgb2xkTnVtUGFydHM7IGkrKykgewogCSAgICBpZiAoc2VsZi0+cGFydHNbaV0udGV4dCAmJiAoc2VsZi0+cGFydHNbaV0uc3R5bGUgIT0gU0JUX09XTkVSRFJBVykpCi0JCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwICgpLCAwLCBzZWxmLT5wYXJ0c1tpXS50ZXh0KTsKKwkJQ09NQ1RMMzJfRnJlZSAoc2VsZi0+cGFydHNbaV0udGV4dCk7CiAJfQogICAgIH0KICAgICBlbHNlIGlmIChvbGROdW1QYXJ0cyA8IHNlbGYtPm51bVBhcnRzKSB7Ci0JdG1wID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJc2l6ZW9mKFNUQVRVU1dJTkRPV1BBUlQpICogc2VsZi0+bnVtUGFydHMpOworCXRtcCA9IENPTUNUTDMyX0FsbG9jIChzaXplb2YoU1RBVFVTV0lORE9XUEFSVCkgKiBzZWxmLT5udW1QYXJ0cyk7CiAJZm9yIChpID0gMDsgaSA8IG9sZE51bVBhcnRzOyBpKyspIHsKIAkgICAgdG1wW2ldID0gc2VsZi0+cGFydHNbaV07CiAJfQogCWlmIChzZWxmLT5wYXJ0cykKLQkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHNlbGYtPnBhcnRzKTsKKwkgICAgQ09NQ1RMMzJfRnJlZSAoc2VsZi0+cGFydHMpOwogCXNlbGYtPnBhcnRzID0gdG1wOwogICAgIH0KICAgICAKQEAgLTYxNCwxMCArNjEyLDEwIEBACiAgICAgZWxzZSB7CiAJLyogZHVwbGljYXRlIHN0cmluZyAqLwogCWlmIChwYXJ0LT50ZXh0KQotCSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHBhcnQtPnRleHQpOworCSAgICBDT01DVEwzMl9GcmVlIChwYXJ0LT50ZXh0KTsKIAlwYXJ0LT50ZXh0ID0gMDsKIAlpZiAodGV4dCAmJiAobGVuID0gbHN0cmxlbjMyQSh0ZXh0KSkpIHsKLQkgICAgcGFydC0+dGV4dCA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGxlbisxKTsKKwkgICAgcGFydC0+dGV4dCA9IENPTUNUTDMyX0FsbG9jIChsZW4rMSk7CiAJICAgIGxzdHJjcHkzMkEocGFydC0+dGV4dCwgdGV4dCk7CiAJfQogICAgIH0KQEAgLTY5NCw4ICs2OTIsNyBAQAogICAgIEhEQzMyCWhkYzsKICAgICBTVEFUVVNXSU5ET1dJTkZPICpzZWxmOwogCi0gICAgc2VsZiA9IChTVEFUVVNXSU5ET1dJTkZPKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCQkgc2l6ZW9mKFNUQVRVU1dJTkRPV0lORk8pKTsKKyAgICBzZWxmID0gKFNUQVRVU1dJTkRPV0lORk8qKUNPTUNUTDMyX0FsbG9jIChzaXplb2YoU1RBVFVTV0lORE9XSU5GTykpOwogICAgIHduZFB0ci0+d0V4dHJhWzBdID0gKERXT1JEKXNlbGY7CiAKICAgICBzZWxmLT5udW1QYXJ0cyA9IDE7CkBAIC03MTcsOCArNzE0LDcgQEAKICAgICBzZWxmLT5wYXJ0MC5oSWNvbiA9IDA7CiAKICAgICAvKiBpbml0aWFsaXplIGZpcnN0IHBhcnQgKi8KLSAgICBzZWxmLT5wYXJ0cyA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkgICAgIHNpemVvZihTVEFUVVNXSU5ET1dQQVJUKSk7CisgICAgc2VsZi0+cGFydHMgPSBDT01DVEwzMl9BbGxvYyAoc2l6ZW9mKFNUQVRVU1dJTkRPV1BBUlQpKTsKICAgICBzZWxmLT5wYXJ0c1swXS5ib3VuZCA9IHJlY3Q7CiAgICAgc2VsZi0+cGFydHNbMF0udGV4dCA9IDA7CiAgICAgc2VsZi0+cGFydHNbMF0ueCA9IC0xOwpAQCAtNzI2LDcgKzcyMiw3IEBACiAgICAgc2VsZi0+cGFydHNbMF0uaEljb24gPSAwOwogCiAgICAgaWYgKChsZW4gPSBsc3RybGVuMzJBIChscENyZWF0ZS0+bHBzek5hbWUpKSkgewotICAgICAgICBzZWxmLT5wYXJ0c1swXS50ZXh0ID0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgbGVuICsgMSk7CisgICAgICAgIHNlbGYtPnBhcnRzWzBdLnRleHQgPSBDT01DVEwzMl9BbGxvYyAobGVuICsgMSk7CiAgICAgICAgIGxzdHJjcHkzMkEgKHNlbGYtPnBhcnRzWzBdLnRleHQsIGxwQ3JlYXRlLT5scHN6TmFtZSk7CiAgICAgfQogCkBAIC03ODEsMTEgKzc3NywxMSBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm51bVBhcnRzOyBpKyspIHsKIAlpZiAoc2VsZi0+cGFydHNbaV0udGV4dCAmJiAoc2VsZi0+cGFydHNbaV0uc3R5bGUgIT0gU0JUX09XTkVSRFJBVykpCi0JICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwICgpLCAwLCBzZWxmLT5wYXJ0c1tpXS50ZXh0KTsKKwkgICAgQ09NQ1RMMzJfRnJlZSAoc2VsZi0+cGFydHNbaV0udGV4dCk7CiAgICAgfQogICAgIGlmIChzZWxmLT5wYXJ0MC50ZXh0ICYmIChzZWxmLT5wYXJ0MC5zdHlsZSAhPSBTQlRfT1dORVJEUkFXKSkKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCAoKSwgMCwgc2VsZi0+cGFydDAudGV4dCk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHNlbGYtPnBhcnRzKTsKKwlDT01DVEwzMl9GcmVlIChzZWxmLT5wYXJ0MC50ZXh0KTsKKyAgICBDT01DVEwzMl9GcmVlIChzZWxmLT5wYXJ0cyk7CiAKICAgICAvKiBkZWxldGUgZGVmYXVsdCBmb250ICovCiAgICAgaWYgKHNlbGYtPmhEZWZhdWx0Rm9udCkKQEAgLTc5NSw3ICs3OTEsNyBAQAogICAgIGlmIChzZWxmLT5od25kVG9vbFRpcCkKIAlEZXN0cm95V2luZG93MzIgKHNlbGYtPmh3bmRUb29sVGlwKTsKIAotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwICgpLCAwLCBzZWxmKTsKKyAgICBDT01DVEwzMl9GcmVlIChzZWxmKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtOTM5LDEwICs5MzUsMTAgQEAKICAgICBwYXJ0ID0gJnNlbGYtPnBhcnRzWzBdOwogICAgIC8qIGR1cGxpY2F0ZSBzdHJpbmcgKi8KICAgICBpZiAocGFydC0+dGV4dCkKLSAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHBhcnQtPnRleHQpOworICAgICAgICBDT01DVEwzMl9GcmVlIChwYXJ0LT50ZXh0KTsKICAgICBwYXJ0LT50ZXh0ID0gMDsKICAgICBpZiAobFBhcmFtICYmIChsZW4gPSBsc3RybGVuMzJBKChMUENTVFIpbFBhcmFtKSkpIHsKLSAgICAgICAgcGFydC0+dGV4dCA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGxlbisxKTsKKyAgICAgICAgcGFydC0+dGV4dCA9IENPTUNUTDMyX0FsbG9jIChsZW4rMSk7CiAgICAgICAgIGxzdHJjcHkzMkEgKHBhcnQtPnRleHQsIChMUENTVFIpbFBhcmFtKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RsbHMvY29tY3RsMzIvdG9vbGJhci5jIGIvZGxscy9jb21jdGwzMi90b29sYmFyLmMKaW5kZXggYTFhYzRlMy4uMmE4OWQ0YiAxMDA2NDQKLS0tIGEvZGxscy9jb21jdGwzMi90b29sYmFyLmMKKysrIGIvZGxscy9jb21jdGwzMi90b29sYmFyLmMKQEAgLTQsMTEgKzQsOSBAQAogICogQ29weXJpZ2h0IDE5OTggRXJpYyBLb2hsCiAgKgogICogVE9ETzoKLSAqICAgLSBCaXRtYXAgZHJhd2luZy4KICAqICAgLSBCdXR0b24gd3JhcHBpbmcuCiAgKiAgIC0gTWVzc2FnZXMuCiAgKiAgIC0gTm90aWZpY2F0aW9ucy4KLSAqICAgLSBGaXggVEJfR0VUQklUTUFQRkxBR1MuCiAgKiAgIC0gRml4IFRCX0dFVFJPV1MgYW5kIFRCX1NFVFJPV1MuCiAgKiAgIC0gVG9vbHRpcCBzdXBwb3J0IChhbG1vc3QgY29tcGxldGUpLgogICogICAtIFVuaWNvZGUgc3VwcHBvcnQuCkBAIC0yNywxMSArMjUsMTAgQEAKICAqLwogCiAjaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgorI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJjYWNoZS5oIgogI2luY2x1ZGUgInRvb2xiYXIuaCIKLSNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtNjcsMTMgKzY0LDEzIEBACiBUT09MQkFSX0RyYXdTdHJpbmcgKFRPT0xCQVJfSU5GTyAqaW5mb1B0ciwgVEJVVFRPTl9JTkZPICpidG5QdHIsCiAJCSAgICBIREMzMiBoZGMsIElOVDMyIG5TdGF0ZSkKIHsKLSAgICBSRUNUMzIgcmNUZXh0ID0gYnRuUHRyLT5yZWN0OwotICAgIEhGT05UMzIgaE9sZEZvbnQ7Ci0gICAgSU5UMzIgICBuT2xkQmtNb2RlOworICAgIFJFQ1QzMiAgIHJjVGV4dCA9IGJ0blB0ci0+cmVjdDsKKyAgICBIRk9OVDMyICBoT2xkRm9udDsKKyAgICBJTlQzMiAgICBuT2xkQmtNb2RlOworICAgIENPTE9SUkVGIGNsck9sZDsKIAogICAgIC8qIGRyYXcgdGV4dCAqLwogICAgIGlmICgoYnRuUHRyLT5pU3RyaW5nID4gLTEpICYmIChidG5QdHItPmlTdHJpbmcgPCBpbmZvUHRyLT5uTnVtU3RyaW5ncykpIHsKLQogCUluZmxhdGVSZWN0MzIgKCZyY1RleHQsIC0zLCAtMyk7CiAJcmNUZXh0LnRvcCArPSBpbmZvUHRyLT5uQml0bWFwSGVpZ2h0OwogCWlmIChuU3RhdGUgJiAoVEJTVEFURV9QUkVTU0VEIHwgVEJTVEFURV9DSEVDS0VEKSkKQEAgLTgyLDI4ICs3OSwyNyBAQAogCWhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgaW5mb1B0ci0+aEZvbnQpOwogCW5PbGRCa01vZGUgPSBTZXRCa01vZGUzMiAoaGRjLCBUUkFOU1BBUkVOVCk7CiAJaWYgKCEoblN0YXRlICYgVEJTVEFURV9FTkFCTEVEKSkgewotCSAgICBDT0xPUlJFRiBjbHJPbGQgPSAKLQkJU2V0VGV4dENvbG9yMzIgKGhkYywgR2V0U3lzQ29sb3IzMiAoQ09MT1JfM0RISUxJR0hUKSk7CisJICAgIGNsck9sZCA9IFNldFRleHRDb2xvcjMyIChoZGMsIEdldFN5c0NvbG9yMzIgKENPTE9SXzNESElMSUdIVCkpOwogCSAgICBPZmZzZXRSZWN0MzIgKCZyY1RleHQsIDEsIDEpOwotCSAgICBEcmF3VGV4dDMyQSAoaGRjLCBpbmZvUHRyLT5zdHJpbmdzW2J0blB0ci0+aVN0cmluZ10sIC0xLCAmcmNUZXh0LAotCQkJIERUX0NFTlRFUik7CisJICAgIERyYXdUZXh0MzJBIChoZGMsIGluZm9QdHItPnN0cmluZ3NbYnRuUHRyLT5pU3RyaW5nXSwgLTEsCisJCQkgJnJjVGV4dCwgaW5mb1B0ci0+ZHdEVEZsYWdzKTsKIAkgICAgU2V0VGV4dENvbG9yMzIgKGhkYywgR2V0U3lzQ29sb3IzMiAoQ09MT1JfM0RTSEFET1cpKTsKIAkgICAgT2Zmc2V0UmVjdDMyICgmcmNUZXh0LCAtMSwgLTEpOwotCSAgICBEcmF3VGV4dDMyQSAoaGRjLCBpbmZvUHRyLT5zdHJpbmdzW2J0blB0ci0+aVN0cmluZ10sIC0xLCAmcmNUZXh0LAotCQkJIERUX0NFTlRFUik7Ci0JICAgIFNldFRleHRDb2xvcjMyIChoZGMsIGNsck9sZCk7CisJICAgIERyYXdUZXh0MzJBIChoZGMsIGluZm9QdHItPnN0cmluZ3NbYnRuUHRyLT5pU3RyaW5nXSwgLTEsCisJCQkgJnJjVGV4dCwgaW5mb1B0ci0+ZHdEVEZsYWdzKTsKIAl9CiAJZWxzZSBpZiAoblN0YXRlICYgVEJTVEFURV9JTkRFVEVSTUlOQVRFKSB7Ci0JICAgIENPTE9SUkVGIGNsck9sZCA9IAotCQlTZXRUZXh0Q29sb3IzMiAoaGRjLCBHZXRTeXNDb2xvcjMyIChDT0xPUl8zRFNIQURPVykpOwotCSAgICBEcmF3VGV4dDMyQSAoaGRjLCBpbmZvUHRyLT5zdHJpbmdzW2J0blB0ci0+aVN0cmluZ10sIC0xLCAmcmNUZXh0LAotCQkJIERUX0NFTlRFUik7Ci0JICAgIFNldFRleHRDb2xvcjMyIChoZGMsIGNsck9sZCk7CisJICAgIGNsck9sZCA9IFNldFRleHRDb2xvcjMyIChoZGMsIEdldFN5c0NvbG9yMzIgKENPTE9SXzNEU0hBRE9XKSk7CisJICAgIERyYXdUZXh0MzJBIChoZGMsIGluZm9QdHItPnN0cmluZ3NbYnRuUHRyLT5pU3RyaW5nXSwgLTEsCisJCQkgJnJjVGV4dCwgaW5mb1B0ci0+ZHdEVEZsYWdzKTsKIAl9Ci0JZWxzZQotCSAgICBEcmF3VGV4dDMyQSAoaGRjLCBpbmZvUHRyLT5zdHJpbmdzW2J0blB0ci0+aVN0cmluZ10sIC0xLCAmcmNUZXh0LAotCQkJIERUX0NFTlRFUik7CisJZWxzZSB7CisJICAgIGNsck9sZCA9IFNldFRleHRDb2xvcjMyIChoZGMsIEdldFN5c0NvbG9yMzIgKENPTE9SX0JUTlRFWFQpKTsKKwkgICAgRHJhd1RleHQzMkEgKGhkYywgaW5mb1B0ci0+c3RyaW5nc1tidG5QdHItPmlTdHJpbmddLCAtMSwKKwkJCSAmcmNUZXh0LCBpbmZvUHRyLT5kd0RURmxhZ3MpOworCX0KIAorCVNldFRleHRDb2xvcjMyIChoZGMsIGNsck9sZCk7CiAJU2VsZWN0T2JqZWN0MzIgKGhkYywgaE9sZEZvbnQpOwogCWlmIChuT2xkQmtNb2RlICE9IFRSQU5TUEFSRU5UKQogCSAgICBTZXRCa01vZGUzMiAoaGRjLCBuT2xkQmtNb2RlKTsKQEAgLTExMiw2ICsxMDgsNDYgQEAKIAogCiBzdGF0aWMgdm9pZAorVE9PTEJBUl9EcmF3UGF0dGVybiAoSERDMzIgaGRjLCBMUFJFQ1QzMiBscFJlY3QpCit7CisgICAgSEJSVVNIMzIgaGJyID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgQ0FDSEVfR2V0UGF0dGVybjU1QUFCcnVzaCAoKSk7CisgICAgSU5UMzIgY3ggPSBscFJlY3QtPnJpZ2h0IC0gbHBSZWN0LT5sZWZ0OworICAgIElOVDMyIGN5ID0gbHBSZWN0LT5ib3R0b20gLSBscFJlY3QtPnRvcDsKKyAgICBQYXRCbHQzMiAoaGRjLCBscFJlY3QtPmxlZnQsIGxwUmVjdC0+dG9wLCBjeCwgY3ksIDB4MDBGQTAwODkpOworICAgIFNlbGVjdE9iamVjdDMyIChoZGMsIGhicik7Cit9CisKKworc3RhdGljIHZvaWQKK1RPT0xCQVJfRHJhd01hc2tlZCAoVE9PTEJBUl9JTkZPICppbmZvUHRyLCBUQlVUVE9OX0lORk8gKmJ0blB0ciwKKwkJICAgIEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSkKK3sKKyAgICAvKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBpcyBhIGhhY2sgc2luY2UgaXQgdXNlcyBpbWFnZSBsaXN0CisJICAgICAgaW50ZXJuYWxzIGRpcmVjdGx5ICovCisKKyAgICBIREMzMiBoZGNJbWFnZUxpc3QgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisgICAgSElNQUdFTElTVCBoaW1sID0gaW5mb1B0ci0+aGltbERlZjsKKworICAgIC8qIGRyYXcgdGhlIG1hc2sgKi8KKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKKyAgICBTZXRCa0NvbG9yMzIgKGhkY0ltYWdlTGlzdCwgUkdCKDI1NSwgMjU1LCAyNTUpKTsKKyAgICBTZXRUZXh0Q29sb3IzMiAoaGRjSW1hZ2VMaXN0LCBSR0IoMCwgMCwgMCkpOworCisgICAgU2VsZWN0T2JqZWN0MzIgKGhkYywgR2V0U3lzQ29sb3JCcnVzaDMyIChDT0xPUl8zREhJTElHSFQpKTsKKyAgICBCaXRCbHQzMiAoaGRjLCB4KzEsIHkrMSwgaGltbC0+Y3gsIGhpbWwtPmN5LAorCSAgICAgIGhkY0ltYWdlTGlzdCwgaGltbC0+Y3ggKiBidG5QdHItPmlCaXRtYXAsIDAsCisJCSAgMHhCODA3NEEpOworCisgICAgU2VsZWN0T2JqZWN0MzIgKGhkYywgR2V0U3lzQ29sb3JCcnVzaDMyIChDT0xPUl8zRFNIQURPVykpOworICAgIEJpdEJsdDMyIChoZGMsIHgsIHksIGhpbWwtPmN4LCBoaW1sLT5jeSwKKwkgICAgICBoZGNJbWFnZUxpc3QsIGhpbWwtPmN4ICogYnRuUHRyLT5pQml0bWFwLCAwLAorCQkgIDB4QjgwNzRBKTsKKworICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlTGlzdCk7Cit9CisKKworc3RhdGljIHZvaWQKIFRPT0xCQVJfRHJhd0J1dHRvbiAoV05EICp3bmRQdHIsIFRCVVRUT05fSU5GTyAqYnRuUHRyLCBIREMzMiBoZGMpCiB7CiAgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CkBAIC0xMjksMTIgKzE2NSwxMSBAQAogCiAgICAgLyogZGlzYWJsZWQgKi8KICAgICBpZiAoIShidG5QdHItPmZzU3RhdGUgJiBUQlNUQVRFX0VOQUJMRUQpKSB7Ci0JSElDT04zMiBoSWNvbjsKIAlEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9SQUlTRUQsCiAJCSAgICBCRl9TT0ZUIHwgQkZfUkVDVCB8IEJGX01JRERMRSB8IEJGX0FESlVTVCk7CiAKLS8vCUltYWdlTGlzdF9EcmF3IChpbmZvUHRyLT5oaW1sRGlzLCBidG5QdHItPmlCaXRtYXAsIGhkYywKLS8vCQkJcmMubGVmdCsxLCByYy50b3ArMSwgSUxEX05PUk1BTCk7CisJVE9PTEJBUl9EcmF3TWFza2VkIChpbmZvUHRyLCBidG5QdHIsIGhkYywgcmMubGVmdCsxLCByYy50b3ArMSk7CisKIAlUT09MQkFSX0RyYXdTdHJpbmcgKGluZm9QdHIsIGJ0blB0ciwgaGRjLCBidG5QdHItPmZzU3RhdGUpOwogCXJldHVybjsKICAgICB9CkBAIC0xNTIsNyArMTg3LDYgQEAKICAgICAvKiBjaGVja2VkIFRCU1RZTEVfQ0hFQ0sqLwogICAgIGlmICgoYnRuUHRyLT5mc1N0eWxlICYgVEJTVFlMRV9DSEVDSykgJiYKIAkoYnRuUHRyLT5mc1N0YXRlICYgVEJTVEFURV9DSEVDS0VEKSkgewotCUhCUlVTSDMyIGhicjsKIAlpZiAoYkZsYXQpCiAJICAgIERyYXdFZGdlMzIgKGhkYywgJnJjLCBCRFJfU1VOS0VOT1VURVIsCiAJCQlCRl9SRUNUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKQEAgLTE2MCwxMCArMTk0LDcgQEAKIAkgICAgRHJhd0VkZ2UzMiAoaGRjLCAmcmMsIEVER0VfU1VOS0VOLAogCQkJQkZfUkVDVCB8IEJGX01JRERMRSB8IEJGX0FESlVTVCk7CiAKLQloYnIgPSBTZWxlY3RPYmplY3QzMiAoaGRjLCBDQUNIRV9HZXRQYXR0ZXJuNTVBQUJydXNoICgpKTsKLQlQYXRCbHQzMiAoaGRjLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0IC0gcmMubGVmdCwKLQkJICByYy5ib3R0b20gLSByYy50b3AsIDB4MDBGQTAwODkpOwotCVNlbGVjdE9iamVjdDMyIChoZGMsIGhicik7CisJVE9PTEJBUl9EcmF3UGF0dGVybiAoaGRjLCAmcmMpOwogCUltYWdlTGlzdF9EcmF3IChpbmZvUHRyLT5oaW1sRGVmLCBidG5QdHItPmlCaXRtYXAsIGhkYywKIAkJCXJjLmxlZnQrMiwgcmMudG9wKzIsIElMRF9OT1JNQUwpOwogCVRPT0xCQVJfRHJhd1N0cmluZyAoaW5mb1B0ciwgYnRuUHRyLCBoZGMsIGJ0blB0ci0+ZnNTdGF0ZSk7CkBAIC0xNzIsMTYgKzIwMywxMSBAQAogCiAgICAgLyogaW5kZXRlcm1pbmF0ZSAqLwkKICAgICBpZiAoYnRuUHRyLT5mc1N0YXRlICYgVEJTVEFURV9JTkRFVEVSTUlOQVRFKSB7Ci0JSEJSVVNIMzIgaGJyOwogCURyYXdFZGdlMzIgKGhkYywgJnJjLCBFREdFX1JBSVNFRCwKIAkJICAgIEJGX1NPRlQgfCBCRl9SRUNUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKIAotCWhiciA9IFNlbGVjdE9iamVjdDMyIChoZGMsIENBQ0hFX0dldFBhdHRlcm41NUFBQnJ1c2ggKCkpOwotCVBhdEJsdDMyIChoZGMsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQgLSByYy5sZWZ0LAotCQkgIHJjLmJvdHRvbSAtIHJjLnRvcCwgMHgwMEZBMDA4OSk7Ci0JU2VsZWN0T2JqZWN0MzIgKGhkYywgaGJyKTsKLS8vCUltYWdlTGlzdF9EcmF3IChpbmZvUHRyLT5oaW1sRGlzLCBidG5QdHItPmlCaXRtYXAsIGhkYywKLS8vCQkJcmMubGVmdCsxLCByYy50b3ArMSwgSUxEX05PUk1BTCk7CisJVE9PTEJBUl9EcmF3UGF0dGVybiAoaGRjLCAmcmMpOworCVRPT0xCQVJfRHJhd01hc2tlZCAoaW5mb1B0ciwgYnRuUHRyLCBoZGMsIHJjLmxlZnQrMSwgcmMudG9wKzEpOwogCVRPT0xCQVJfRHJhd1N0cmluZyAoaW5mb1B0ciwgYnRuUHRyLCBoZGMsIGJ0blB0ci0+ZnNTdGF0ZSk7CiAJcmV0dXJuOwogICAgIH0KQEAgLTQ5NSw3ICs1MjEsNyBAQAogICAgIGlmIChscEFkZEJtcC0+aEluc3QgPT0gKEhJTlNUQU5DRTMyKTApIHsKIAluSW5kZXggPSAKIAkgICAgSW1hZ2VMaXN0X0FkZE1hc2tlZCAoaW5mb1B0ci0+aGltbERlZiwgKEhCSVRNQVAzMilscEFkZEJtcC0+bklELAotCQkJCSBHZXRTeXNDb2xvcjMyIChDT0xPUl8zREZBQ0UpKTsKKwkJCQkgQ0xSX0RFRkFVTFQpOwogICAgIH0KICAgICBlbHNlIGlmIChscEFkZEJtcC0+aEluc3QgPT0gSElOU1RfQ09NTUNUUkwpIHsKIAkvKiBhZGQgaW50ZXJuYWwgYml0bWFwcyAqLwpAQCAtNTEwLDcgKzUzNiw3IEBACiAJSEJJVE1BUDMyIGhCbXAgPQogCSAgICBMb2FkQml0bWFwMzJBIChscEFkZEJtcC0+aEluc3QsIChMUFNUUilscEFkZEJtcC0+bklEKTsKIAotCW5JbmRleCA9IEltYWdlTGlzdF9BZGQgKGluZm9QdHItPmhpbWxEZWYsIGhCbXAsIChIQklUTUFQMzIpMCk7CisJbkluZGV4ID0gSW1hZ2VMaXN0X0FkZE1hc2tlZCAoaW5mb1B0ci0+aGltbERlZiwgaEJtcCwgQ0xSX0RFRkFVTFQpOwogCiAJRGVsZXRlT2JqZWN0MzIgKGhCbXApOyAKICAgICB9CkBAIC01MzgsMTcgKzU2NCwxNSBAQAogCiAgICAgaWYgKGluZm9QdHItPm5OdW1CdXR0b25zID09IDApIHsKIAlpbmZvUHRyLT5idXR0b25zID0KLQkgICAgSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJICAgICAgIHNpemVvZiAoVEJVVFRPTl9JTkZPKSAqIG5OZXdCdXR0b25zKTsKKwkgICAgQ09NQ1RMMzJfQWxsb2MgKHNpemVvZihUQlVUVE9OX0lORk8pICogbk5ld0J1dHRvbnMpOwogICAgIH0KICAgICBlbHNlIHsKIAlUQlVUVE9OX0lORk8gKm9sZEJ1dHRvbnMgPSBpbmZvUHRyLT5idXR0b25zOwogCWluZm9QdHItPmJ1dHRvbnMgPQotCSAgICBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgICAgc2l6ZW9mIChUQlVUVE9OX0lORk8pICogbk5ld0J1dHRvbnMpOworCSAgICBDT01DVEwzMl9BbGxvYyAoc2l6ZW9mKFRCVVRUT05fSU5GTykgKiBuTmV3QnV0dG9ucyk7CiAJbWVtY3B5ICgmaW5mb1B0ci0+YnV0dG9uc1swXSwgJm9sZEJ1dHRvbnNbMF0sCiAJCW5PbGRCdXR0b25zICogc2l6ZW9mKFRCVVRUT05fSU5GTykpOwotICAgICAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIG9sZEJ1dHRvbnMpOworICAgICAgICBDT01DVEwzMl9GcmVlIChvbGRCdXR0b25zKTsKICAgICB9CiAKICAgICBpbmZvUHRyLT5uTnVtQnV0dG9ucyA9IG5OZXdCdXR0b25zOwpAQCAtNjA5LDIwICs2MzMsMTkgQEAKIAluSW5kZXggPSBpbmZvUHRyLT5uTnVtU3RyaW5nczsKIAlpZiAoaW5mb1B0ci0+bk51bVN0cmluZ3MgPT0gMCkgewogCSAgICBpbmZvUHRyLT5zdHJpbmdzID0KLQkJSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGNoYXIgKikpOworCQlDT01DVEwzMl9BbGxvYyAoc2l6ZW9mKGNoYXIgKikpOwogCX0KIAllbHNlIHsKIAkgICAgY2hhciAqKm9sZFN0cmluZ3MgPSBpbmZvUHRyLT5zdHJpbmdzOwogCSAgICBpbmZvUHRyLT5zdHJpbmdzID0KLQkJSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCSAgIHNpemVvZihjaGFyICopICogKGluZm9QdHItPm5OdW1TdHJpbmdzICsgMSkpOworCQlDT01DVEwzMl9BbGxvYyAoc2l6ZW9mKGNoYXIgKikgKiAoaW5mb1B0ci0+bk51bVN0cmluZ3MgKyAxKSk7CiAJICAgIG1lbWNweSAoJmluZm9QdHItPnN0cmluZ3NbMF0sICZvbGRTdHJpbmdzWzBdLAogCQkgICAgc2l6ZW9mKGNoYXIgKikgKiBpbmZvUHRyLT5uTnVtU3RyaW5ncyk7Ci0JICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgb2xkU3RyaW5ncyk7CisJICAgIENPTUNUTDMyX0ZyZWUgKG9sZFN0cmluZ3MpOwogCX0KIAogCWluZm9QdHItPnN0cmluZ3NbaW5mb1B0ci0+bk51bVN0cmluZ3NdID0KLQkgICAgSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGNoYXIpKihsZW4rMSkpOworCSAgICBDT01DVEwzMl9BbGxvYyAoc2l6ZW9mKGNoYXIpKihsZW4rMSkpOwogCWxzdHJjcHkzMkEgKGluZm9QdHItPnN0cmluZ3NbaW5mb1B0ci0+bk51bVN0cmluZ3NdLCBzelN0cmluZyk7CiAJaW5mb1B0ci0+bk51bVN0cmluZ3MrKzsKICAgICB9CkBAIC02MzksMjAgKzY2MiwxOSBAQAogCiAJICAgIGlmIChpbmZvUHRyLT5uTnVtU3RyaW5ncyA9PSAwKSB7CiAJCWluZm9QdHItPnN0cmluZ3MgPQotCQkgICAgSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGNoYXIgKikpOworCQkgICAgQ09NQ1RMMzJfQWxsb2MgKHNpemVvZihjaGFyICopKTsKIAkgICAgfQogCSAgICBlbHNlIHsKIAkJY2hhciAqKm9sZFN0cmluZ3MgPSBpbmZvUHRyLT5zdHJpbmdzOwogCQlpbmZvUHRyLT5zdHJpbmdzID0KLQkJICAgIEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkgICAgICAgc2l6ZW9mKGNoYXIgKikgKiAoaW5mb1B0ci0+bk51bVN0cmluZ3MgKyAxKSk7CisJCSAgICBDT01DVEwzMl9BbGxvYyAoc2l6ZW9mKGNoYXIgKikgKiAoaW5mb1B0ci0+bk51bVN0cmluZ3MgKyAxKSk7CiAJCW1lbWNweSAoJmluZm9QdHItPnN0cmluZ3NbMF0sICZvbGRTdHJpbmdzWzBdLAogCQkJc2l6ZW9mKGNoYXIgKikgKiBpbmZvUHRyLT5uTnVtU3RyaW5ncyk7Ci0JCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgb2xkU3RyaW5ncyk7CisJCUNPTUNUTDMyX0ZyZWUgKG9sZFN0cmluZ3MpOwogCSAgICB9CiAKIAkgICAgaW5mb1B0ci0+c3RyaW5nc1tpbmZvUHRyLT5uTnVtU3RyaW5nc10gPQotCQlIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoY2hhcikqKGxlbisxKSk7CisJCUNPTUNUTDMyX0FsbG9jIChzaXplb2YoY2hhcikqKGxlbisxKSk7CiAJICAgIGxzdHJjcHkzMkEgKGluZm9QdHItPnN0cmluZ3NbaW5mb1B0ci0+bk51bVN0cmluZ3NdLCBwKTsKIAkgICAgaW5mb1B0ci0+bk51bVN0cmluZ3MrKzsKIApAQCAtODQxLDcgKzg2Myw3IEBACiAKICAgICBpZiAoaW5mb1B0ci0+bk51bUJ1dHRvbnMgPT0gMSkgewogCVRSQUNFICh0b29sYmFyLCAiIHNpbXBsZSBkZWxldGUhXG4iKTsKLQlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGluZm9QdHItPmJ1dHRvbnMpOworCUNPTUNUTDMyX0ZyZWUgKGluZm9QdHItPmJ1dHRvbnMpOwogCWluZm9QdHItPmJ1dHRvbnMgPSBOVUxMOwogCWluZm9QdHItPm5OdW1CdXR0b25zID0gMDsKICAgICB9CkBAIC04NTAsOCArODcyLDcgQEAKICAgICAgICAgVFJBQ0UodG9vbGJhciwgImNvbXBsZXggZGVsZXRlISBbbkluZGV4PSVkXVxuIiwgbkluZGV4KTsKIAogCWluZm9QdHItPm5OdW1CdXR0b25zLS07Ci0JaW5mb1B0ci0+YnV0dG9ucyA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkJICAgICAgc2l6ZW9mIChUQlVUVE9OX0lORk8pICogaW5mb1B0ci0+bk51bUJ1dHRvbnMpOworCWluZm9QdHItPmJ1dHRvbnMgPSBDT01DVEwzMl9BbGxvYyAoc2l6ZW9mIChUQlVUVE9OX0lORk8pICogaW5mb1B0ci0+bk51bUJ1dHRvbnMpOwogICAgICAgICBpZiAobkluZGV4ID4gMCkgewogICAgICAgICAgICAgbWVtY3B5ICgmaW5mb1B0ci0+YnV0dG9uc1swXSwgJm9sZEJ1dHRvbnNbMF0sCiAgICAgICAgICAgICAgICAgICAgIG5JbmRleCAqIHNpemVvZihUQlVUVE9OX0lORk8pKTsKQEAgLTg2Miw3ICs4ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAoaW5mb1B0ci0+bk51bUJ1dHRvbnMgLSBuSW5kZXgpICogc2l6ZW9mKFRCVVRUT05fSU5GTykpOwogICAgICAgICB9CiAKLSAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBvbGRCdXR0b25zKTsKKwlDT01DVEwzMl9GcmVlIChvbGRCdXR0b25zKTsKICAgICB9CiAKICAgICBUT09MQkFSX0NhbGNUb29sYmFyICh3bmRQdHIpOwpAQCAtOTExLDE3ICs5MzIsMTYgQEAKIAogICAgIG5JbmRleCA9IFRPT0xCQVJfR2V0QnV0dG9uSW5kZXggKGluZm9QdHIsIChJTlQzMil3UGFyYW0pOwogICAgIGlmIChuSW5kZXggPT0gLTEpCi0JcmV0dXJuIDA7CisJcmV0dXJuIC0xOwogCiAgICAgcmV0dXJuIGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5pQml0bWFwOwogfQogCiAKLXN0YXRpYyBMUkVTVUxUCitzdGF0aWMgX19pbmxpbmVfXyBMUkVTVUxUCiBUT09MQkFSX0dldEJpdG1hcEZsYWdzIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIEZJWE1FICh0b29sYmFyLCAic3R1YiFcbiIpOwotICAgIHJldHVybiAwOworICAgIHJldHVybiAoR2V0RGV2aWNlQ2FwczMyICgwLCBMT0dQSVhFTFNYKSA+PSAxMjApID8gVEJCRl9MQVJHRSA6IDA7CiB9CiAKIApAQCAtMTMxMiw4ICsxMzMyLDcgQEAKIAogICAgIG9sZEJ1dHRvbnMgPSBpbmZvUHRyLT5idXR0b25zOwogICAgIGluZm9QdHItPm5OdW1CdXR0b25zKys7Ci0gICAgaW5mb1B0ci0+YnV0dG9ucyA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkJICBzaXplb2YgKFRCVVRUT05fSU5GTykgKiBpbmZvUHRyLT5uTnVtQnV0dG9ucyk7CisgICAgaW5mb1B0ci0+YnV0dG9ucyA9IENPTUNUTDMyX0FsbG9jIChzaXplb2YgKFRCVVRUT05fSU5GTykgKiBpbmZvUHRyLT5uTnVtQnV0dG9ucyk7CiAgICAgLyogcHJlIGluc2VydCBjb3B5ICovCiAgICAgaWYgKG5JbmRleCA+IDApIHsKIAltZW1jcHkgKCZpbmZvUHRyLT5idXR0b25zWzBdLCAmb2xkQnV0dG9uc1swXSwKQEAgLTEzNDgsNyArMTM2Nyw3IEBACiAJCShpbmZvUHRyLT5uTnVtQnV0dG9ucyAtIG5JbmRleCAtIDEpICogc2l6ZW9mKFRCVVRUT05fSU5GTykpOwogICAgIH0KIAotICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgb2xkQnV0dG9ucyk7CisgICAgQ09NQ1RMMzJfRnJlZSAob2xkQnV0dG9ucyk7CiAKICAgICBUT09MQkFSX0NhbGNUb29sYmFyICh3bmRQdHIpOwogCkBAIC0xNDg2LDYgKzE1MDUsNyBAQAogc3RhdGljIExSRVNVTFQKIFRPT0xCQVJfU2F2ZVJlc3RvcmUzMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CisjaWYgMAogICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwogICAgIExQVEJTQVZFUEFSQU1TMzJBIGxwU2F2ZSA9IChMUFRCU0FWRVBBUkFNUzMyQSlsUGFyYW07CiAKQEAgLTE1MDYsNiArMTUyNiw3IEBACiAKIAogICAgIH0KKyNlbmRpZgogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNTY1LDEzICsxNTg2LDEzIEBACiAJaWYgKChidG5QdHItPmlTdHJpbmcgPj0gMCkgfHwgCiAJICAgIChidG5QdHItPmlTdHJpbmcgPCBpbmZvUHRyLT5uTnVtU3RyaW5ncykpIHsKICNpZiAwCi0JICAgIENIQVIgKmxwU3RyaW5nID0gaW5mb1B0ci0+c3RyaW5nc1tidG5QdHItPmlTdHJpbmddOworCSAgICBDSEFSICoqbHBTdHJpbmcgPSAmaW5mb1B0ci0+c3RyaW5nc1tidG5QdHItPmlTdHJpbmddOwogCSAgICBJTlQzMiBsZW4gPSBsc3RybGVuMzJBIChscHRiYmktPnBzelRleHQpOwotCi0JICAgIGxwU3RyaW5nID0gSGVhcFJlQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoY2hhcikqKGxlbisxKSk7Ci0KKwkgICAgKmxwU3RyaW5nID0gQ09NQ1RMMzJfUmVBbGxvYyAobHBTdHJpbmcsIHNpemVvZihjaGFyKSoobGVuKzEpKTsKICNlbmRpZgogCisJICAgIC8qIHRoaXMgaXMgdGhlIHVsdGltYXRlIHNvbGx1dGlvbiAqLworLy8JICAgIFN0cl9TZXRQdHJBICgmaW5mb1B0ci0+c3RyaW5nc1tidG5QdHItPmlTdHJpbmddLCBscHRiYmktPnBzelRleHQpOwogCX0KICAgICB9CiAKQEAgLTE2NTQsNyArMTY3NSwxOCBAQAogfQogCiAKLS8vIDw8IFRPT0xCQVJfU2V0RHJhd1RleHRGbGFncyA+Pgorc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfU2V0RHJhd1RleHRGbGFncyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBEV09SRCBkd1RlbXA7CisKKyAgICBkd1RlbXAgPSBpbmZvUHRyLT5kd0RURmxhZ3M7CisgICAgaW5mb1B0ci0+ZHdEVEZsYWdzID0KKwkoaW5mb1B0ci0+ZHdEVEZsYWdzICYgKERXT1JEKXdQYXJhbSkgfCAoRFdPUkQpbFBhcmFtOworCisgICAgcmV0dXJuIChMUkVTVUxUKWR3VGVtcDsKK30KIAogCiBzdGF0aWMgTFJFU1VMVApAQCAtMTkxMCw2ICsxOTQyLDcgQEAKICAgICBpbmZvUHRyLT5od25kTm90aWZ5ID0gR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpOwogICAgIGluZm9QdHItPmJUcmFuc3BhcmVudCA9ICh3bmRQdHItPmR3U3R5bGUgJiBUQlNUWUxFX0ZMQVQpOwogICAgIGluZm9QdHItPm5Ib3RJdGVtID0gLTE7CisgICAgaW5mb1B0ci0+ZHdEVEZsYWdzID0gRFRfQ0VOVEVSOwogCiAgICAgU3lzdGVtUGFyYW1ldGVyc0luZm8zMkEgKFNQSV9HRVRJQ09OVElUTEVMT0dGT05ULCAwLCAmbG9nRm9udCwgMCk7CiAgICAgaW5mb1B0ci0+aEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QzMkEgKCZsb2dGb250KTsKQEAgLTE5NTEsMTYgKzE5ODQsMTYgQEAKIAogICAgIC8qIGRlbGV0ZSBidXR0b24gZGF0YSAqLwogICAgIGlmIChpbmZvUHRyLT5idXR0b25zKQotCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+YnV0dG9ucyk7CisJQ09NQ1RMMzJfRnJlZSAoaW5mb1B0ci0+YnV0dG9ucyk7CiAKICAgICAvKiBkZWxldGUgc3RyaW5ncyAqLwogICAgIGlmIChpbmZvUHRyLT5zdHJpbmdzKSB7CiAJSU5UMzIgaTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5mb1B0ci0+bk51bVN0cmluZ3M7IGkrKykKIAkgICAgaWYgKGluZm9QdHItPnN0cmluZ3NbaV0pCi0JCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+c3RyaW5nc1tpXSk7CisJCUNPTUNUTDMyX0ZyZWUgKGluZm9QdHItPnN0cmluZ3NbaV0pOwogCi0JSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT5zdHJpbmdzKTsKKwlDT01DVEwzMl9GcmVlIChpbmZvUHRyLT5zdHJpbmdzKTsKICAgICB9CiAKICAgICAvKiBkZXN0cm95IGRlZmF1bHQgaW1hZ2UgbGlzdCAqLwpAQCAtMTk4MCw3ICsyMDEzLDcgQEAKIAlEZWxldGVPYmplY3QzMiAoaW5mb1B0ci0+aEZvbnQpOwogCiAgICAgLyogZnJlZSB0b29sYmFyIGluZm8gZGF0YSAqLwotICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0cik7CisgICAgQ09NQ1RMMzJfRnJlZSAoaW5mb1B0cik7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTIxNzgsNyArMjIxMSwxNSBAQAogfQogCiAKLS8vIDw8IFRPT0xCQVJfTkNBY3RpdmF0ZSA+PgorX19pbmxpbmVfXyBzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9OQ0FjdGl2YXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworLy8gICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIENDU19OT0RJVklERVIpCisJcmV0dXJuIERlZldpbmRvd1Byb2MzMkEgKHduZFB0ci0+aHduZFNlbGYsIFdNX05DQUNUSVZBVEUsCisJCQkJIHdQYXJhbSwgbFBhcmFtKTsKKy8vICAgIGVsc2UKKy8vCXJldHVybiBUT09MQkFSX05DUGFpbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworfQogCiAKIF9faW5saW5lX18gc3RhdGljIExSRVNVTFQKQEAgLTIxOTcsOCArMjIzOCw3IEBACiAgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyOwogCiAgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBpbmZvIHN0cnVjdHVyZSAqLwotICAgIGluZm9QdHIgPSAoVE9PTEJBUl9JTkZPICopSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRPT0xCQVJfSU5GTykpOworICAgIGluZm9QdHIgPSAoVE9PTEJBUl9JTkZPICopQ09NQ1RMMzJfQWxsb2MgKHNpemVvZihUT09MQkFSX0lORk8pKTsKICAgICB3bmRQdHItPndFeHRyYVswXSA9IChEV09SRClpbmZvUHRyOwogCiAgICAgaWYgKGluZm9QdHIgPT0gTlVMTCkgewpAQCAtMjU2OCw3ICsyNjA4LDggQEAKIAljYXNlIFRCX1NFVERJU0FCTEVESU1BR0VMSVNUOgogCSAgICByZXR1cm4gVE9PTEJBUl9TZXREaXNhYmxlZEltYWdlTGlzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgVEJfU0VURFJBV1RFWFRGTEFHUzoJCS8qIDQuNzEgKi8KKwljYXNlIFRCX1NFVERSQVdURVhURkxBR1M6CisJICAgIHJldHVybiBUT09MQkFSX1NldERyYXdUZXh0RmxhZ3MgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBUQl9TRVRFWFRFTkRFRFNUWUxFOgogCSAgICByZXR1cm4gVE9PTEJBUl9TZXRFeHRlbmRlZFN0eWxlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTI2NDAsOCArMjY4MSw4IEBACiAJY2FzZSBXTV9NT1VTRU1PVkU6CiAJICAgIHJldHVybiBUT09MQkFSX01vdXNlTW92ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgV01fTkNBQ1RJVkFURToKLS8vCSAgICByZXR1cm4gVE9PTEJBUl9OQ0FjdGl2YXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwljYXNlIFdNX05DQUNUSVZBVEU6CisJICAgIHJldHVybiBUT09MQkFSX05DQWN0aXZhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBXTV9OQ0NBTENTSVpFOgogCSAgICByZXR1cm4gVE9PTEJBUl9OQ0NhbGNTaXplICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKZGlmZiAtLWdpdCBhL2RsbHMvY29tY3RsMzIvdG9vbHRpcHMuYyBiL2RsbHMvY29tY3RsMzIvdG9vbHRpcHMuYwppbmRleCA5M2VhNWYzLi40MTlmNjA1IDEwMDY0NAotLS0gYS9kbGxzL2NvbWN0bDMyL3Rvb2x0aXBzLmMKKysrIGIvZGxscy9jb21jdGwzMi90b29sdGlwcy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImNvbW1jdHJsLmgiCiAjaW5jbHVkZSAidG9vbHRpcHMuaCIKLSNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMTA4LDggKzEwNyw3IEBACiAJCWlmICh0dG5tZGkudUZsYWdzICYgVFRGX0RJX1NFVElURU0pIHsKIAkJICAgIElOVDMyIGxlbiA9IGxzdHJsZW4zMkEgKHR0bm1kaS5zelRleHQpICsgMTsKIAkJICAgIHRvb2xQdHItPmhpbnN0ID0gMDsKLQkJICAgIHRvb2xQdHItPmxwc3pUZXh0ID0JCi0JCQlIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4pOworCQkgICAgdG9vbFB0ci0+bHBzelRleHQgPQlDT01DVEwzMl9BbGxvYyAobGVuKTsKIAkJICAgIGxzdHJjcHkzMkEgKHRvb2xQdHItPmxwc3pUZXh0LCB0dG5tZGkuc3pUZXh0KTsKIAkJfQogCSAgICB9CkBAIC0xMjQsOCArMTIyLDcgQEAKIAkJaWYgKHR0bm1kaS51RmxhZ3MgJiBUVEZfRElfU0VUSVRFTSkgewogCQkgICAgSU5UMzIgbGVuID0gbHN0cmxlbjMyQSAodHRubWRpLmxwc3pUZXh0KSArIDE7CiAJCSAgICB0b29sUHRyLT5oaW5zdCA9IDA7Ci0JCSAgICB0b29sUHRyLT5scHN6VGV4dCA9CQotCQkJSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbGVuKTsKKwkJICAgIHRvb2xQdHItPmxwc3pUZXh0ID0JQ09NQ1RMMzJfQWxsb2MgKGxlbik7CiAJCSAgICBsc3RyY3B5MzJBICh0b29sUHRyLT5scHN6VGV4dCwgdHRubWRpLmxwc3pUZXh0KTsKIAkJfQogCSAgICB9CkBAIC0xNzcsNyArMTc0LDcgQEAKIFRPT0xUSVBTX1Nob3cgKFdORCAqd25kUHRyLCBUT09MVElQU19JTkZPICppbmZvUHRyKQogewogICAgIFRUVE9PTF9JTkZPICp0b29sUHRyOwotICAgIFBPSU5UMzIgcHQ7CisgICAgUkVDVDMyIHJlY3Q7CiAgICAgU0laRTMyIHNpemU7CiAgICAgTk1IRFIgaGRyOwogCkBAIC0yMTIsMzEgKzIwOSwzNyBAQAogICAgIFRSQUNFICh0b29sdGlwcywgInNpemUgJWQgLSAlZFxuIiwgc2l6ZS5jeCwgc2l6ZS5jeSk7CiAKICAgICBpZiAoKHRvb2xQdHItPnVGbGFncyAmIFRURl9UUkFDSykgJiYgKHRvb2xQdHItPnVGbGFncyAmIFRURl9BQlNPTFVURSkpIHsKLQlwdC54ID0gaW5mb1B0ci0+eFRyYWNrUG9zOwotCXB0LnkgPSBpbmZvUHRyLT55VHJhY2tQb3M7CisJcmVjdC5sZWZ0ID0gaW5mb1B0ci0+eFRyYWNrUG9zOworCXJlY3QudG9wICA9IGluZm9QdHItPnlUcmFja1BvczsKICAgICB9CiAgICAgZWxzZSBpZiAodG9vbFB0ci0+dUZsYWdzICYgVFRGX0NFTlRFUlRJUCkgewotCVJFQ1QzMiByZWN0OworCVJFQ1QzMiByYzsKIAogCWlmICh0b29sUHRyLT51RmxhZ3MgJiBUVEZfSURJU0hXTkQpCi0JICAgIEdldFdpbmRvd1JlY3QzMiAoKEhXTkQzMil0b29sUHRyLT51SWQsICZyZWN0KTsKKwkgICAgR2V0V2luZG93UmVjdDMyICgoSFdORDMyKXRvb2xQdHItPnVJZCwgJnJjKTsKIAllbHNlIHsKLQkgICAgcmVjdCA9IHRvb2xQdHItPnJlY3Q7Ci0JICAgIE1hcFdpbmRvd1BvaW50czMyICh0b29sUHRyLT5od25kLCAoSFdORDMyKTAsIChMUFBPSU5UMzIpJnJlY3QsIDIpOworCSAgICByYyA9IHRvb2xQdHItPnJlY3Q7CisJICAgIE1hcFdpbmRvd1BvaW50czMyICh0b29sUHRyLT5od25kLCAoSFdORDMyKTAsIChMUFBPSU5UMzIpJnJjLCAyKTsKIAl9Ci0JcHQueCA9IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0IC0gc2l6ZS5jeCkgLyAyOwotCXB0LnkgPSByZWN0LmJvdHRvbSArIDI7CisJcmVjdC5sZWZ0ID0gKHJjLmxlZnQgKyByYy5yaWdodCAtIHNpemUuY3gpIC8gMjsKKwlyZWN0LnRvcCAgPSByYy5ib3R0b20gKyAyOwogICAgIH0KICAgICBlbHNlIHsKLQlHZXRDdXJzb3JQb3MzMiAoJnB0KTsKLQlwdC55ICs9IDIwOworCUdldEN1cnNvclBvczMyICgoTFBQT0lOVDMyKSZyZWN0KTsKKwlyZWN0LnRvcCArPSAyMDsKICAgICB9CiAKLSAgICBUUkFDRSAodG9vbHRpcHMsICJwb3MgJWQgLSAlZFxuIiwgcHQueCwgcHQueSk7CisgICAgVFJBQ0UgKHRvb2x0aXBzLCAicG9zICVkIC0gJWRcbiIsIHJlY3QubGVmdCwgcmVjdC50b3ApOworCisgICAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIHNpemUuY3g7CisgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIHNpemUuY3k7CisKKyAgICBBZGp1c3RXaW5kb3dSZWN0RXgzMiAoJnJlY3QsIHduZFB0ci0+ZHdTdHlsZSwgRkFMU0UsIHduZFB0ci0+ZHdFeFN0eWxlKTsKIAogLy8gICAgU2V0V2luZG93UG9zMzIgKHduZFB0ci0+aHduZFNlbGYsIEhXTkRfVE9QLCAxLCAxLAotICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgcHQueCwgcHQueSwKLQkJICAgIHNpemUuY3gsIHNpemUuY3ksIFNXUF9TSE9XV0lORE9XKTsKKyAgICBTZXRXaW5kb3dQb3MzMiAod25kUHRyLT5od25kU2VsZiwgSFdORF9UT1AsIHJlY3QubGVmdCwgcmVjdC50b3AsCisJCSAgICByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSAtIHJlY3QudG9wLAorCQkgICAgU1dQX1NIT1dXSU5ET1cpOwogCiAgICAgU2V0VGltZXIzMiAod25kUHRyLT5od25kU2VsZiwgSURfVElNRVIyLCBpbmZvUHRyLT5uQXV0b1BvcFRpbWUsIDApOwogfQpAQCAtMjYzLDcgKzI2Niw4IEBACiAKICAgICBpbmZvUHRyLT5uQ3VycmVudFRvb2wgPSAtMTsKIAotICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgMCwgMCwgMCwgMCwgU1dQX0hJREVXSU5ET1cpOworICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgMCwgMCwgMCwgMCwKKwkJICAgIFNXUF9OT1pPUkRFUiB8IFNXUF9ISURFV0lORE9XKTsKIH0KIAogCkBAIC00MDYsMTkgKzQxMCwxNiBAQAogCSAgIChscFRvb2xJbmZvLT51RmxhZ3MgJiBUVEZfSURJU0hXTkQpID8gIiBUVEZfSURJU0hXTkQiIDogIiIpOwogCiAgICAgaWYgKGluZm9QdHItPnVOdW1Ub29scyA9PSAwKSB7Ci0JaW5mb1B0ci0+dG9vbHMgPQotCSAgICBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgICAgc2l6ZW9mKFRUVE9PTF9JTkZPKSk7CisJaW5mb1B0ci0+dG9vbHMgPSBDT01DVEwzMl9BbGxvYyAoc2l6ZW9mKFRUVE9PTF9JTkZPKSk7CiAJdG9vbFB0ciA9IGluZm9QdHItPnRvb2xzOwogICAgIH0KICAgICBlbHNlIHsKIAlUVFRPT0xfSU5GTyAqb2xkVG9vbHMgPSBpbmZvUHRyLT50b29sczsKIAlpbmZvUHRyLT50b29scyA9Ci0JICAgIEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0JCSAgICAgICBzaXplb2YoVFRUT09MX0lORk8pICogKGluZm9QdHItPnVOdW1Ub29scyArIDEpKTsKKwkgICAgQ09NQ1RMMzJfQWxsb2MgKHNpemVvZihUVFRPT0xfSU5GTykgKiAoaW5mb1B0ci0+dU51bVRvb2xzICsgMSkpOwogCW1lbWNweSAoaW5mb1B0ci0+dG9vbHMsIG9sZFRvb2xzLAogCQlpbmZvUHRyLT51TnVtVG9vbHMgKiBzaXplb2YoVFRUT09MX0lORk8pKTsKLQlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIG9sZFRvb2xzKTsKKwlDT01DVEwzMl9GcmVlIChvbGRUb29scyk7CiAJdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tpbmZvUHRyLT51TnVtVG9vbHNdOwogICAgIH0KIApAQCAtNDQzLDggKzQ0NCw3IEBACiAJZWxzZSB7CiAJICAgIElOVDMyIGxlbiA9IGxzdHJsZW4zMkEgKGxwVG9vbEluZm8tPmxwc3pUZXh0KTsKIAkgICAgVFJBQ0UgKHRvb2x0aXBzLCAiYWRkIHRleHQgXCIlc1wiIVxuIiwgbHBUb29sSW5mby0+bHBzelRleHQpOwotCSAgICB0b29sUHRyLT5scHN6VGV4dCA9Ci0JCUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbiArIDEpOworCSAgICB0b29sUHRyLT5scHN6VGV4dCA9CUNPTUNUTDMyX0FsbG9jIChsZW4gKyAxKTsKIAkgICAgbHN0cmNweTMyQSAodG9vbFB0ci0+bHBzelRleHQsIGxwVG9vbEluZm8tPmxwc3pUZXh0KTsKIAl9CiAgICAgfQpAQCAtNDU4LDggKzQ1OCw4IEBACiAJICAgIExQVFRfU1VCQ0xBU1NfSU5GTyBscHR0c2kgPQogCQkoTFBUVF9TVUJDTEFTU19JTkZPKUdldFByb3AzMkEgKChIV05EMzIpdG9vbFB0ci0+dUlkLCBUVF9TVUJDTEFTU19QUk9QKTsKIAkgICAgaWYgKGxwdHRzaSA9PSBOVUxMKSB7Ci0JCWxwdHRzaSA9IChMUFRUX1NVQkNMQVNTX0lORk8pSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCgpLAotCQkgICAgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFRUX1NVQkNMQVNTX0lORk8pKTsKKwkJbHB0dHNpID0KKwkJICAgIChMUFRUX1NVQkNMQVNTX0lORk8pQ09NQ1RMMzJfQWxsb2MgKHNpemVvZihUVF9TVUJDTEFTU19JTkZPKSk7CiAJCWxwdHRzaS0+d3BPcmlnUHJvYyA9IAogCQkgICAgKFdORFBST0MzMilTZXRXaW5kb3dMb25nMzJBICgoSFdORDMyKXRvb2xQdHItPnVJZCwKIAkJICAgIEdXTF9XTkRQUk9DLChMT05HKVRPT0xUSVBTX1N1YmNsYXNzUHJvYyk7CkBAIC00NzUsOCArNDc1LDggQEAKIAkgICAgTFBUVF9TVUJDTEFTU19JTkZPIGxwdHRzaSA9CiAJCShMUFRUX1NVQkNMQVNTX0lORk8pR2V0UHJvcDMyQSAodG9vbFB0ci0+aHduZCwgVFRfU1VCQ0xBU1NfUFJPUCk7CiAJICAgIGlmIChscHR0c2kgPT0gTlVMTCkgewotCQlscHR0c2kgPSAoTFBUVF9TVUJDTEFTU19JTkZPKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAoKSwKLQkJICAgIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihUVF9TVUJDTEFTU19JTkZPKSk7CisJCWxwdHRzaSA9CisJCSAgICAoTFBUVF9TVUJDTEFTU19JTkZPKUNPTUNUTDMyX0FsbG9jIChzaXplb2YoVFRfU1VCQ0xBU1NfSU5GTykpOwogCQlscHR0c2ktPndwT3JpZ1Byb2MgPSAKIAkJICAgIChXTkRQUk9DMzIpU2V0V2luZG93TG9uZzMyQSAodG9vbFB0ci0+aHduZCwKIAkJICAgIEdXTF9XTkRQUk9DLChMT05HKVRPT0xUSVBTX1N1YmNsYXNzUHJvYyk7CkBAIC01MjEsNyArNTIxLDcgQEAKICAgICB0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW25Ub29sXTsgCiAgICAgaWYgKCh0b29sUHRyLT5oaW5zdCkgJiYgKHRvb2xQdHItPmxwc3pUZXh0KSkgewogCWlmICh0b29sUHRyLT5scHN6VGV4dCAhPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpCi0JICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgdG9vbFB0ci0+bHBzelRleHQpOworCSAgICBDT01DVEwzMl9GcmVlICh0b29sUHRyLT5scHN6VGV4dCk7CiAgICAgfQogCiAgICAgLyogcmVtb3ZlIHN1YmNsYXNzaW5nICovCkBAIC01MzMsNyArNTMzLDcgQEAKIAkJU2V0V2luZG93TG9uZzMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIEdXTF9XTkRQUk9DLAogCQkJCSAgKExPTkcpbHB0dHNpLT53cE9yaWdQcm9jKTsKIAkJUmVtb3ZlUHJvcDMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIFRUX1NVQkNMQVNTX1BST1ApOwotCQlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgJmxwdHRzaSk7CisJCUNPTUNUTDMyX0ZyZWUgKCZscHR0c2kpOwogCSAgICB9CiAJICAgIGVsc2UKIAkJRVJSICh0b29sdGlwcywgIkludmFsaWQgZGF0YSBoYW5kbGUhXG4iKTsKQEAgLTU0Niw3ICs1NDYsNyBAQAogCQkgICAgU2V0V2luZG93TG9uZzMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIEdXTF9XTkRQUk9DLAogCQkJCSAgICAgIChMT05HKWxwdHRzaS0+d3BPcmlnUHJvYyk7CiAJCSAgICBSZW1vdmVQcm9wMzJBICgoSFdORDMyKXRvb2xQdHItPnVJZCwgVFRfU1VCQ0xBU1NfUFJPUCk7Ci0JCSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgJmxwdHRzaSk7CisJCSAgICBDT01DVEwzMl9GcmVlICgmbHB0dHNpKTsKIAkJfQogCQllbHNlCiAJCSAgICBscHR0c2ktPnVSZWZDb3VudC0tOwpAQCAtNTU4LDE0ICs1NTgsMTMgQEAKIAogICAgIC8qIGRlbGV0ZSB0b29sIGZyb20gdG9vbCBsaXN0ICovCiAgICAgaWYgKGluZm9QdHItPnVOdW1Ub29scyA9PSAxKSB7Ci0JSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT50b29scyk7CisJQ09NQ1RMMzJfRnJlZSAoaW5mb1B0ci0+dG9vbHMpOwogCWluZm9QdHItPnRvb2xzID0gTlVMTDsKICAgICB9CiAgICAgZWxzZSB7CiAJVFRUT09MX0lORk8gKm9sZFRvb2xzID0gaW5mb1B0ci0+dG9vbHM7CiAJaW5mb1B0ci0+dG9vbHMgPQotCSAgICBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgICAgc2l6ZW9mKFRUVE9PTF9JTkZPKSAqIChpbmZvUHRyLT51TnVtVG9vbHMgLSAxKSk7CisJICAgIENPTUNUTDMyX0FsbG9jIChzaXplb2YoVFRUT09MX0lORk8pICogKGluZm9QdHItPnVOdW1Ub29scyAtIDEpKTsKIAogCWlmIChuVG9vbCA+IDApCiAJICAgIG1lbWNweSAoJmluZm9QdHItPnRvb2xzWzBdLCAmb2xkVG9vbHNbMF0sCkBAIC01NzUsNyArNTc0LDcgQEAKIAkgICAgbWVtY3B5ICgmaW5mb1B0ci0+dG9vbHNbblRvb2xdLCAmb2xkVG9vbHNbblRvb2wgKyAxXSwKIAkJICAgIChpbmZvUHRyLT51TnVtVG9vbHMgLSBuVG9vbCAtIDEpICogc2l6ZW9mKFRUVE9PTF9JTkZPKSk7CiAKLQlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIG9sZFRvb2xzKTsKKwlDT01DVEwzMl9GcmVlIChvbGRUb29scyk7CiAgICAgfQogCiAgICAgaW5mb1B0ci0+dU51bVRvb2xzLS07CkBAIC0xMDUxLDkgKzEwNTAsOCBAQAogCSAgICB0b29sUHRyLT5scHN6VGV4dCA9IGxwVG9vbEluZm8tPmxwc3pUZXh0OwogCWVsc2UgewogCSAgICBJTlQzMiBsZW4gPSBsc3RybGVuMzJBIChscFRvb2xJbmZvLT5scHN6VGV4dCk7Ci0JICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgdG9vbFB0ci0+bHBzelRleHQpOwotCSAgICB0b29sUHRyLT5scHN6VGV4dCA9Ci0JCUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbiArIDEpOworCSAgICBDT01DVEwzMl9GcmVlICh0b29sUHRyLT5scHN6VGV4dCk7CisJICAgIHRvb2xQdHItPmxwc3pUZXh0ID0JQ09NQ1RMMzJfQWxsb2MgKGxlbiArIDEpOwogCSAgICBsc3RyY3B5MzJBICh0b29sUHRyLT5scHN6VGV4dCwgbHBUb29sSW5mby0+bHBzelRleHQpOwogCX0KICAgICB9CkBAIC0xMTYwLDkgKzExNTgsOCBAQAogCSAgICB0b29sUHRyLT5scHN6VGV4dCA9IGxwVG9vbEluZm8tPmxwc3pUZXh0OwogCWVsc2UgewogCSAgICBJTlQzMiBsZW4gPSBsc3RybGVuMzJBIChscFRvb2xJbmZvLT5scHN6VGV4dCk7Ci0JICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgdG9vbFB0ci0+bHBzelRleHQpOwotCSAgICB0b29sUHRyLT5scHN6VGV4dCA9Ci0JCUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbiArIDEpOworCSAgICBDT01DVEwzMl9GcmVlICh0b29sUHRyLT5scHN6VGV4dCk7CisJICAgIHRvb2xQdHItPmxwc3pUZXh0ID0JQ09NQ1RMMzJfQWxsb2MgKGxlbiArIDEpOwogCSAgICBsc3RyY3B5MzJBICh0b29sUHRyLT5scHN6VGV4dCwgbHBUb29sSW5mby0+bHBzelRleHQpOwogCX0KICAgICB9CkBAIC0xMTg5LDggKzExODYsNyBAQAogICAgIE5PTkNMSUVOVE1FVFJJQ1MzMkEgbmNsbTsKIAogICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICBpbmZvUHRyID0gKFRPT0xUSVBTX0lORk8gKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCQkgIHNpemVvZihUT09MVElQU19JTkZPKSk7CisgICAgaW5mb1B0ciA9IChUT09MVElQU19JTkZPICopQ09NQ1RMMzJfQWxsb2MgKHNpemVvZihUT09MVElQU19JTkZPKSk7CiAgICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpaW5mb1B0cjsKIAogICAgIGlmIChpbmZvUHRyID09IE5VTEwpIHsKQEAgLTEyMTksNyArMTIxNSw4IEBACiAgICAgaW5mb1B0ci0+bkF1dG9Qb3BUaW1lICAgPSA1MDAwOwogICAgIGluZm9QdHItPm5Jbml0aWFsVGltZSAgID0gNTAwOwogCi0gICAgU2V0V2luZG93UG9zMzIgKHduZFB0ci0+aHduZFNlbGYsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLCBTV1BfSElERVdJTkRPVyk7CisgICAgU2V0V2luZG93UG9zMzIgKHduZFB0ci0+aHduZFNlbGYsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAorCQkgICAgU1dQX05PWk9SREVSIHwgU1dQX0hJREVXSU5ET1cpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMjMwLDE1ICsxMjI3LDE1IEBACiB7CiAgICAgVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciA9IFRPT0xUSVBTX0dldEluZm9QdHIod25kUHRyKTsKICAgICBUVFRPT0xfSU5GTyAqdG9vbFB0cjsKKyAgICBJTlQzMiBpOwogCiAgICAgLyogZnJlZSB0b29scyAqLwogICAgIGlmIChpbmZvUHRyLT50b29scykgewotCUlOVDMyIGk7CiAJZm9yIChpID0gMDsgaSA8IGluZm9QdHItPnVOdW1Ub29sczsgaSsrKSB7CiAJICAgIHRvb2xQdHIgPSAmaW5mb1B0ci0+dG9vbHNbaV07CiAJICAgIGlmICgodG9vbFB0ci0+aGluc3QpICYmICh0b29sUHRyLT5scHN6VGV4dCkpIHsKIAkJaWYgKHRvb2xQdHItPmxwc3pUZXh0ICE9IExQU1RSX1RFWFRDQUxMQkFDSzMyQSkKLQkJICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgdG9vbFB0ci0+bHBzelRleHQpOworCQkgICAgQ09NQ1RMMzJfRnJlZSAodG9vbFB0ci0+bHBzelRleHQpOwogCSAgICB9CiAKIAkgICAgLyogcmVtb3ZlIHN1YmNsYXNzaW5nICovCkBAIC0xMjU0LDE4ICsxMjUxLDE4IEBACiAJCSAgICBTZXRXaW5kb3dMb25nMzJBICgoSFdORDMyKXRvb2xQdHItPnVJZCwgR1dMX1dORFBST0MsCiAJCQkJICAgICAgKExPTkcpbHB0dHNpLT53cE9yaWdQcm9jKTsKIAkJICAgIFJlbW92ZVByb3AzMkEgKChIV05EMzIpdG9vbFB0ci0+dUlkLCBUVF9TVUJDTEFTU19QUk9QKTsKLQkJICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCgpLCAwLCAmbHB0dHNpKTsKKwkJICAgIENPTUNUTDMyX0ZyZWUgKCZscHR0c2kpOwogCQl9CiAJICAgIH0KIAl9Ci0JSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT50b29scyk7CisJQ09NQ1RMMzJfRnJlZSAoaW5mb1B0ci0+dG9vbHMpOwogICAgIH0KIAogICAgIC8qIGRlbGV0ZSBmb250ICovCiAgICAgRGVsZXRlT2JqZWN0MzIgKGluZm9QdHItPmhGb250KTsKIAogICAgIC8qIGZyZWUgdG9vbCB0aXBzIGluZm8gZGF0YSAqLwotICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0cik7CisgICAgQ09NQ1RMMzJfRnJlZSAoaW5mb1B0cik7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTEzMjcsNyArMTMyNCwxMCBAQAogVE9PTFRJUFNfTmNDcmVhdGUgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgd25kUHRyLT5kd1N0eWxlICY9IDB4MDAwMEZGRkY7Ci0gICAgd25kUHRyLT5kd1N0eWxlIHw9IChXU19QT1BVUCB8IFdTX0JPUkRFUik7CisgICAgd25kUHRyLT5kd1N0eWxlIHw9IChXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX0NMSVBTSUJMSU5HUyk7CisKKy8vICAgIEZJWE1FICh0b29sdGlwcywgInN0eWxlIDB4JTA4eFxuIiwgd25kUHRyLT5kd1N0eWxlKTsKKy8vICAgIFNldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmLCBOVUxMKTsKIAogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZGxscy9jb21jdGwzMi90cmFja2Jhci5jIGIvZGxscy9jb21jdGwzMi90cmFja2Jhci5jCmluZGV4IGY4MGY0MzMuLjY0NzA5MTYgMTAwNjQ0Ci0tLSBhL2RsbHMvY29tY3RsMzIvdHJhY2tiYXIuYworKysgYi9kbGxzL2NvbWN0bDMyL3RyYWNrYmFyLmMKQEAgLTEsMjEgKzEsMzEgQEAKIC8qCiAgKiBUcmFja2JhciBjb250cm9sCiAgKgotICogQ29weXJpZ2h0IDE5OTggRXJpYyBLb2hsCisgKiBDb3B5cmlnaHQgMTk5OCBFcmljIEtvaGxpIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KKyAqIENvcHlyaWdodCAxOTk4IEFsZXggUHJpZW0gPGFsZXhwQHNjaS5rdW4ubmw+CiAgKgogICogTk9URVMKLSAqICAgRGV2ZWxvcG1lbnQgaW4gcHJvZ3Jlc3MuIEF1dGhvciBuZWVkZWQhIEFueSB2b2x1bnRlZXJzPwotICogICBJIHdpbGwgb25seSBpbXByb3ZlIHRoaXMgY29udHJvbCBvbmNlIGluIGEgd2hpbGUuCi0gKiAgICAgRXJpYyA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisKICAqCiAgKiBUT0RPOgogICogICAtIFNvbWUgbWVzc2FnZXMuCi0gKiAgIC0gZGlzcGxheSBjb2RlLgotICogICAtIHVzZXIgaW50ZXJhY3Rpb24uCi0gKiAgIC0gdGljIGhhbmRsaW5nLgotICogICAtIEFsbCBub3RpZmljYXRpb25zLgorICogICAtIG1vcmUgZGlzcGxheSBjb2RlLgorICogICAtIGRyYWdnaW5nIHNsaWRlcgorICogICAtIGJldHRlciB0aWMgaGFuZGxpbmcuCisgKiAgIC0gbW9yZSBub3RpZmljYXRpb25zLgorICogICAtIHRvb2x0aXBzCiAgKi8KIAorLyoga25vd24gYnVnczoKKworCS1UQk1fU0VUUkFOR0VNQVggJiBUQk1fU0VUUkFOR0VNSU4gc2hvdWxkIG9ubHkgY2hhbmdlIHRoZSB2aWV3IG9mIHRoZQorICAgdHJhY2tiYXIsIG5vdCB0aGUgYWN0dWFsIGFtb3VudCBvZiB0aWNzIGluIHRoZSBsaXN0LgorCS1UQk1fR0VUVElDICYgVEJNX0dFVFRJQ1BPUyBzaG91bGRuJ3QgcmVseSBvbiBpbmZvUHRyLT50aWNzIGJlaW5nIHNvcnRlZC4KKyAgCS1jb2RlIGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgaG9yaXpvbnRhbCB0cmFja2JhcnMgY29ycmVjdC4KKyovCisKKworCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImNvbW1jdHJsLmgiCiAjaW5jbHVkZSAidHJhY2tiYXIuaCIKQEAgLTI3LDg4ICszNywzMDMgQEAKICNkZWZpbmUgVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpICgoVFJBQ0tCQVJfSU5GTyAqKXduZFB0ci0+d0V4dHJhWzBdKQogCiAKLXN0YXRpYyBWT0lECi1UUkFDS0JBUl9SZWZyZXNoIChXTkQgKnduZFB0ciwgSERDMzIgaGRjKQorLyogVXNlZCBieSBUUkFDS0JBUl9SZWZyZXNoIHRvIGZpbmQgb3V0IHdoaWNoIHBhcnRzIG9mIHRoZSBjb250cm9sIAorCW5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkICovCisKKyNkZWZpbmUgVEJfVEhVTUJDSEFOR0VEIAkxCisjZGVmaW5lIFRCX1NFTEVDVElPTkNIQU5HRUQgMgorCisKKworc3RhdGljIEJPT0wzMiBUUkFDS0JBUl9TZW5kTm90aWZ5IChXTkQgKnduZFB0ciwgVUlOVDMyIGNvZGUpOworCit2b2lkIFRSQUNLQkFSX1JlY2FsY3VsYXRlVGljcyAoVFJBQ0tCQVJfSU5GTyAqaW5mb1B0cikKKwogewotICAgIFRSQUNLQkFSX0lORk8gKmluZm9QdHIgPSBUUkFDS0JBUl9HZXRJbmZvUHRyKHduZFB0cik7Ci0gICAgUkVDVDMyIHJjQ2xpZW50LCByY0NoYW5uZWw7CisgICAgaW50IGksdGljLG5yVGljczsKIAotICAgIEdldENsaWVudFJlY3QzMiAod25kUHRyLT5od25kU2VsZiwgJnJjQ2xpZW50KTsKKwlpZiAoaW5mb1B0ci0+dVRpY0ZyZXEpIAorICAgIAluclRpY3M9KGluZm9QdHItPm5SYW5nZU1heCAtIGluZm9QdHItPm5SYW5nZU1pbikvaW5mb1B0ci0+dVRpY0ZyZXE7CisJZWxzZSB7CisJCW5yVGljcz0wOworCQlIZWFwRnJlZSAoU3lzdGVtSGVhcCwwLGluZm9QdHItPnRpY3MpOworCQlpbmZvUHRyLT50aWNzPU5VTEw7CisJCWluZm9QdHItPnVOdW1UaWNzPTA7CisJCXJldHVybjsKKwl9CiAKLSAgICAvKiBkcmF3IGNoYW5uZWwgKi8KLSAgICByY0NoYW5uZWwgPSBpbmZvUHRyLT5yY0NoYW5uZWw7Ci0gICAgRHJhd0VkZ2UzMiAoaGRjLCAmcmNDaGFubmVsLCBFREdFX1NVTktFTiwgQkZfUkVDVCB8IEJGX0FESlVTVCk7Ci0gICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19FTkFCTEVTRUxSQU5HRSkgewotCS8qIGZpbGwgdGhlIGNoYW5uZWwgKi8KLQlIQlJVU0gzMiBoYnIgPSBDcmVhdGVTb2xpZEJydXNoMzIgKFJHQigyNTUsMjU1LDI1NSkpOwotCUZpbGxSZWN0MzIgKGhkYywgJnJjQ2hhbm5lbCwgaGJyKTsKLQlEZWxldGVPYmplY3QzMiAoaGJyKTsKKyAgICBpZiAobnJUaWNzIT1pbmZvUHRyLT51TnVtVGljcykgeworICAgIAlpbmZvUHRyLT50aWNzPUhlYXBSZUFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBpbmZvUHRyLT50aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5yVGljcysxKSpzaXplb2YgKERXT1JEKSk7CisgICAgCWluZm9QdHItPnVOdW1UaWNzPW5yVGljczsKICAgICB9Ci0KLSAgICAvKiBkcmF3IHRpY2tzICovCi0gICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgVEJTX05PVElDS1MpKSB7Ci0KLSAgICB9Ci0KLSAgICAvKiBkcmF3IHRodW1iICovCi0gICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgVEJTX05PVEhVTUIpKSB7Ci0KLSAgICB9Ci0KLSAgICBpZiAoaW5mb1B0ci0+YkZvY3VzKQotCURyYXdGb2N1c1JlY3QzMiAoaGRjLCAmcmNDbGllbnQpOworCWluZm9QdHItPnVOdW1UaWNzPW5yVGljczsKKyAgICB0aWM9aW5mb1B0ci0+blJhbmdlTWluK2luZm9QdHItPnVUaWNGcmVxOworICAgIGZvciAoaT0wOyBpPG5yVGljczsgaSsrLHRpYys9aW5mb1B0ci0+dVRpY0ZyZXEpCisgICAgICAgICAgICAgICBpbmZvUHRyLT50aWNzW2ldPXRpYzsKIH0KIAogCisKK3N0YXRpYyBJTlQzMgorVFJBQ0tCQVJfQ29udmVydFBvc2l0aW9uVG9UaWMgKFdORCAqd25kUHRyLCBUUkFDS0JBUl9JTkZPICppbmZvUHRyLCBQT0lOVDMyIHB0KSAKK3sKKwlkb3VibGUgbmV3cG9zLG5ld3RpYzsKKyAgICBpbnQgaSxyYW5nZSx3aWR0aCxkZWx0YSxjdXJyZW50ZGVsdGEsY3VycmVudHRpYzsKKworLyogYnVnZ3kgKi8KKworICAgIHJhbmdlPWluZm9QdHItPm5SYW5nZU1heCAtIGluZm9QdHItPm5SYW5nZU1pbjsKKyAgICB3aWR0aD1pbmZvUHRyLT5yY0NoYW5uZWwucmlnaHQgLSBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdDsKKwkKKwluZXdwb3M9KHB0LngtaW5mb1B0ci0+cmNDaGFubmVsLmxlZnQpIC8gKGRvdWJsZSkgd2lkdGg7CisKKwluZXd0aWM9aW5mb1B0ci0+blJhbmdlTWluK25ld3BvcypyYW5nZTsKKwljdXJyZW50dGljPTA7CisJY3VycmVudGRlbHRhPWN1cnJlbnR0aWMtaW5mb1B0ci0+blJhbmdlTWluOworCWZvciAoaT0wOyBpPGluZm9QdHItPnVOdW1UaWNzOyBpKyspIHsKKwkJZGVsdGE9bmV3dGljLWluZm9QdHItPnRpY3NbaV07CisJCWlmICgoZGVsdGE+MCkgJiYgKGRlbHRhPGN1cnJlbnRkZWx0YSkpIHsKKwkJCWN1cnJlbnRkZWx0YT1kZWx0YTsKKwkJCWN1cnJlbnR0aWM9aTsKKwkJfQorCX0KKwlyZXR1cm4gKElOVDMyKSBjdXJyZW50dGljOworfQorCiBzdGF0aWMgVk9JRAotVFJBQ0tCQVJfQ2FsYyAoV05EICp3bmRQdHIsIFRSQUNLQkFSX0lORk8gKmluZm9QdHIsIExQUkVDVDMyIGxwUmVjdCkKK1RSQUNLQkFSX0NhbGMgKFdORCAqd25kUHRyLCBUUkFDS0JBUl9JTkZPICppbmZvUHRyKQogewogICAgIElOVDMyIGN5Q2hhbm5lbDsKKwlSRUNUMzIgbHBSZWN0LCpjaGFubmVsID0gJiBpbmZvUHRyLT5yY0NoYW5uZWw7CisKKyAgICBHZXRDbGllbnRSZWN0MzIgKHduZFB0ci0+aHduZFNlbGYsICZscFJlY3QpOwogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19FTkFCTEVTRUxSQU5HRSkKLQljeUNoYW5uZWwgPSBNQVgoaW5mb1B0ci0+dVRodW1iTGVuIC0gOCwgNCk7CisJCWN5Q2hhbm5lbCA9IE1BWChpbmZvUHRyLT51VGh1bWJMZW4gLSA4LCA0KTsKICAgICBlbHNlCi0JY3lDaGFubmVsID0gNDsKKwkJY3lDaGFubmVsID0gNDsKIAogICAgIC8qIGNhbGN1bGF0ZSBjaGFubmVsIHJlY3QgKi8KICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgVEJTX1ZFUlQpIHsKLQlpbmZvUHRyLT5yY0NoYW5uZWwudG9wID0gbHBSZWN0LT50b3AgKyA4OwotCWluZm9QdHItPnJjQ2hhbm5lbC5ib3R0b20gPSBscFJlY3QtPmJvdHRvbSAtIDg7CisJCWNoYW5uZWwtPnRvcCAgICA9IGxwUmVjdC50b3AgKyA4OworCQljaGFubmVsLT5ib3R0b20gPSBscFJlY3QuYm90dG9tIC0gODsKIAotCWlmICh3bmRQdHItPmR3U3R5bGUgJiBUQlNfQk9USCkgewotCSAgICBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdCA9IChscFJlY3QtPmJvdHRvbSAtIGN5Q2hhbm5lbCApIC8gMjsKLQkgICAgaW5mb1B0ci0+cmNDaGFubmVsLnJpZ2h0ID0gKGxwUmVjdC0+Ym90dG9tICsgY3lDaGFubmVsKSAvIDI7CisJCQlpZiAod25kUHRyLT5kd1N0eWxlICYgVEJTX0JPVEgpIHsKKwkgICAgCQljaGFubmVsLT5sZWZ0ICA9IChscFJlY3QuYm90dG9tIC0gY3lDaGFubmVsKSAvIDI7CisJICAgIAkJY2hhbm5lbC0+cmlnaHQgPSAobHBSZWN0LmJvdHRvbSArIGN5Q2hhbm5lbCkgLyAyOworCQkJfQorCQkJZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgVEJTX0xFRlQpIHsKKwkgICAgCQkJY2hhbm5lbC0+bGVmdCAgPSBscFJlY3QubGVmdCArIDEwOworCSAgICAJCQljaGFubmVsLT5yaWdodCA9IGNoYW5uZWwtPmxlZnQgKyBjeUNoYW5uZWw7CisJCQkJfQorCQkJCWVsc2UgeyAvKiBUQlNfUklHSFQgKi8KKwkgICAgCQkJY2hhbm5lbC0+cmlnaHQgPSBscFJlY3QucmlnaHQgLSAxMDsKKwkgICAgCQkJY2hhbm5lbC0+bGVmdCAgPSBjaGFubmVsLT5yaWdodCAtIGN5Q2hhbm5lbDsKKwkJCQl9CisgICAJfQorICAgCWVsc2UgeworCQkJY2hhbm5lbC0+bGVmdCA9IGxwUmVjdC5sZWZ0ICsgODsKKwkJCWNoYW5uZWwtPnJpZ2h0ID0gbHBSZWN0LnJpZ2h0IC0gODsKKwkJCWlmICh3bmRQdHItPmR3U3R5bGUgJiBUQlNfQk9USCkgeworCSAgICAJCWNoYW5uZWwtPnRvcAkJPSAobHBSZWN0LmJvdHRvbSAtIGN5Q2hhbm5lbCkgLyAyOworCSAgICAJCWNoYW5uZWwtPmJvdHRvbSAJPSAobHBSZWN0LmJvdHRvbSArIGN5Q2hhbm5lbCkgLyAyOworCQkJfQorCQkJZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgVEJTX1RPUCkgeworCSAgICAJCQljaGFubmVsLT50b3AgICAgPSBscFJlY3QudG9wICsgMTA7CisJICAgIAkJCWNoYW5uZWwtPmJvdHRvbSA9IGNoYW5uZWwtPnRvcCArIGN5Q2hhbm5lbDsKKwkJCQl9CisJCQkJZWxzZSB7IC8qIFRCU19CT1RUT00gKi8KKwkgICAgCQkJY2hhbm5lbC0+Ym90dG9tID0gbHBSZWN0LmJvdHRvbSAtIDEwOworCSAgICAJCQljaGFubmVsLT50b3AgICAgPSBjaGFubmVsLT5ib3R0b20gLSBjeUNoYW5uZWw7CisJCQkJfQogCX0KLQllbHNlIGlmICh3bmRQdHItPmR3U3R5bGUgJiBUQlNfTEVGVCkgewotCSAgICBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdCA9IGxwUmVjdC0+bGVmdCArIDEwOwotCSAgICBpbmZvUHRyLT5yY0NoYW5uZWwucmlnaHQgPSBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdCArIGN5Q2hhbm5lbDsKLQl9Ci0JZWxzZSB7Ci0JICAgIC8qIFRCU19SSUdIVCAqLwotCSAgICBpbmZvUHRyLT5yY0NoYW5uZWwucmlnaHQgPSBscFJlY3QtPnJpZ2h0IC0gMTA7Ci0JICAgIGluZm9QdHItPnJjQ2hhbm5lbC5sZWZ0ID0gaW5mb1B0ci0+cmNDaGFubmVsLnJpZ2h0IC0gY3lDaGFubmVsOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JaW5mb1B0ci0+cmNDaGFubmVsLmxlZnQgPSBscFJlY3QtPmxlZnQgKyA4OwotCWluZm9QdHItPnJjQ2hhbm5lbC5yaWdodCA9IGxwUmVjdC0+cmlnaHQgLSA4OwotCi0JaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19CT1RIKSB7Ci0JICAgIGluZm9QdHItPnJjQ2hhbm5lbC50b3AgPSAobHBSZWN0LT5ib3R0b20gLSBjeUNoYW5uZWwgKSAvIDI7Ci0JICAgIGluZm9QdHItPnJjQ2hhbm5lbC5ib3R0b20gPSAobHBSZWN0LT5ib3R0b20gKyBjeUNoYW5uZWwpIC8gMjsKLQl9Ci0JZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgVEJTX1RPUCkgewotCSAgICBpbmZvUHRyLT5yY0NoYW5uZWwudG9wID0gbHBSZWN0LT50b3AgKyAxMDsKLQkgICAgaW5mb1B0ci0+cmNDaGFubmVsLmJvdHRvbSA9IGluZm9QdHItPnJjQ2hhbm5lbC50b3AgKyBjeUNoYW5uZWw7Ci0JfQotCWVsc2UgewotCSAgICAvKiBUQlNfQk9UVE9NICovCi0JICAgIGluZm9QdHItPnJjQ2hhbm5lbC5ib3R0b20gPSBscFJlY3QtPmJvdHRvbSAtIDEwOwotCSAgICBpbmZvUHRyLT5yY0NoYW5uZWwudG9wID0gaW5mb1B0ci0+cmNDaGFubmVsLmJvdHRvbSAtIGN5Q2hhbm5lbDsKLQl9Ci0gICAgfQogfQogCitzdGF0aWMgVk9JRAorVFJBQ0tCQVJfQ2FsY1RodW1iIChXTkQgKnduZFB0ciwgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0cikKKworeworCVJFQ1QzMiAqdGh1bWI7CisJaW50IHJhbmdlLCB3aWR0aDsKKwkKKwl0aHVtYj0maW5mb1B0ci0+cmNUaHVtYjsKKwlyYW5nZT1pbmZvUHRyLT5uUmFuZ2VNYXggLSBpbmZvUHRyLT5uUmFuZ2VNaW47CisgICAgd2lkdGg9aW5mb1B0ci0+cmNDaGFubmVsLnJpZ2h0IC0gaW5mb1B0ci0+cmNDaGFubmVsLmxlZnQ7CisKKwl0aHVtYi0+bGVmdCAgPSBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdCArCisJCQkJCXdpZHRoKig2NTUzNippbmZvUHRyLT5uUG9zL3JhbmdlKS82NTUzNiAtIDU7CisJdGh1bWItPnJpZ2h0ICA9IHRodW1iLT5sZWZ0ICsgMTA7CisJdGh1bWItPnRvcAkgID0gaW5mb1B0ci0+cmNDaGFubmVsLnRvcCAtIDE7CisJdGh1bWItPmJvdHRvbSA9IGluZm9QdHItPnJjQ2hhbm5lbC50b3AgKyBpbmZvUHRyLT51VGh1bWJMZW4gLSA4OworfQorCitzdGF0aWMgVk9JRAorVFJBQ0tCQVJfQ2FsY1NlbGVjdGlvbiAoV05EICp3bmRQdHIsIFRSQUNLQkFSX0lORk8gKmluZm9QdHIpCit7CisJUkVDVDMyICpzZWxlY3Rpb247CisJaW50IHJhbmdlLCB3aWR0aDsKKworCXNlbGVjdGlvbj0gJiBpbmZvUHRyLT5yY1NlbGVjdGlvbjsKKwlyYW5nZT1pbmZvUHRyLT5uUmFuZ2VNYXggLSBpbmZvUHRyLT5uUmFuZ2VNaW47CisgICAgd2lkdGg9aW5mb1B0ci0+cmNDaGFubmVsLnJpZ2h0IC0gaW5mb1B0ci0+cmNDaGFubmVsLmxlZnQ7CisJCisJc2VsZWN0aW9uLT5sZWZ0ICAgPSBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdCArCisJCQkJCQl3aWR0aCooNjU1MzYqaW5mb1B0ci0+blNlbE1pbi9yYW5nZSkvNjU1MzY7CisJc2VsZWN0aW9uLT5yaWdodCAgPSBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdCArCisJCQkJCQl3aWR0aCooNjU1MzYqaW5mb1B0ci0+blNlbE1heC9yYW5nZSkvNjU1MzY7CisJc2VsZWN0aW9uLT50b3AgICAgPSBpbmZvUHRyLT5yY0NoYW5uZWwudG9wICsgMjsKKyAgICBzZWxlY3Rpb24tPmJvdHRvbSA9IGluZm9QdHItPnJjQ2hhbm5lbC5ib3R0b20gLSAyOworfQorCisKKworc3RhdGljIFZPSUQKK1RSQUNLQkFSX1JlZnJlc2ggKFdORCAqd25kUHRyLCBIREMzMiBoZGMpCit7CisJVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKKwlSRUNUMzIgcmNDbGllbnQsIHJjQ2hhbm5lbCwgcmNTZWxlY3Rpb247CisJSEJSVVNIMzIgaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaDMyIChpbmZvUHRyLT5jbHJCayk7CisJSU5UMzIgeCx5LHRpYzsKKwlpbnQgaSxyYW5nZSx3aWR0aDsKKworICAgIEdldENsaWVudFJlY3QzMiAod25kUHRyLT5od25kU2VsZiwgJnJjQ2xpZW50KTsKKwloQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoMzIgKGluZm9QdHItPmNsckJrKTsKKwlGaWxsUmVjdDMyIChoZGMsICZyY0NsaWVudCwgaEJydXNoKTsKKyAgICBEZWxldGVPYmplY3QzMiAoaEJydXNoKTsKKworCQorCQorCWlmIChpbmZvUHRyLT5mbGFncyAmIFRCX1RIVU1CQ0hBTkdFRCkgCisJCVRSQUNLQkFSX0NhbGNUaHVtYgkod25kUHRyLCBpbmZvUHRyKTsKKwlpZiAoaW5mb1B0ci0+ZmxhZ3MgJiBUQl9TRUxFQ1RJT05DSEFOR0VEKQorCQlUUkFDS0JBUl9DYWxjU2VsZWN0aW9uICh3bmRQdHIsIGluZm9QdHIpOworCWluZm9QdHItPmZsYWdzICY9IH4gKFRCX1RIVU1CQ0hBTkdFRCB8IFRCX1NFTEVDVElPTkNIQU5HRUQpOworCisgICAgLyogZHJhdyBjaGFubmVsICovCisKKyAgICByY0NoYW5uZWwgPSBpbmZvUHRyLT5yY0NoYW5uZWw7CisgICAgcmNTZWxlY3Rpb249IGluZm9QdHItPnJjU2VsZWN0aW9uOworICAgIERyYXdFZGdlMzIgKGhkYywgJnJjQ2hhbm5lbCwgRURHRV9TVU5LRU4sIEJGX1JFQ1QgfCBCRl9BREpVU1QpOworCisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19FTkFCTEVTRUxSQU5HRSkgewkJIC8qIGZpbGwgdGhlIGNoYW5uZWwgKi8KKwkJSEJSVVNIMzIgaGJyID0gQ3JlYXRlU29saWRCcnVzaDMyIChSR0IoMjU1LDI1NSwyNTUpKTsKKwkJRmlsbFJlY3QzMiAoaGRjLCAmcmNDaGFubmVsLCBoYnIpOworCQlpZiAocmNTZWxlY3Rpb24ubGVmdCE9cmNTZWxlY3Rpb24ucmlnaHQpIHsKKwkJCWhicj1DcmVhdGVTb2xpZEJydXNoMzIgKENPTE9SX0hJR0hMSUdIVCk7IAorCQkJRmlsbFJlY3QzMiAoaGRjLCAmcmNTZWxlY3Rpb24sIGhicik7CisJCX0KKwkJRGVsZXRlT2JqZWN0MzIgKGhicik7CisgICAgfQorCisKKyAgICAvKiBkcmF3IHRpY3MgKi8KKworICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19OT1RJQ0tTKSkgeworCQlDT0xPUlJFRiBjbHJUaWM9R2V0U3lzQ29sb3IzMiAoQ09MT1JfM0RES1NIQURPVyk7CisKKyAgICAJeD1yY0NoYW5uZWwubGVmdDsKKyAgICAJeT1yY0NoYW5uZWwuYm90dG9tKzI7CisJCXJhbmdlPWluZm9QdHItPm5SYW5nZU1heCAtIGluZm9QdHItPm5SYW5nZU1pbjsKKwkJd2lkdGg9cmNDaGFubmVsLnJpZ2h0IC0gcmNDaGFubmVsLmxlZnQ7CisgICAgCWlmICh3bmRQdHItPmR3U3R5bGUgJiBUQlNfVkVSVCkgeyAvKiBzd2FwIHgveSAqLworICAgICAgICB9CisKKyAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19UT1ApIHx8ICh3bmRQdHItPmR3U3R5bGUgJiBUQlNfQk9USCkpIHsKKyAgICAgICAgLyogZHJhdyB1cHBlciB0aWNzICovCisgICAgIH0KKworLy8gICAgaWYgKCEoKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19UT1ApIHx8ICghKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19CT1RIKSkpKSAKKyAgICAgICAgLyogZHJhdyBsb3dlciB0aWNzICovCisvLyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgVEJTX0FVVE9USUNLUykgCisgICAgICAgIGZvciAoaT0wOyBpPGluZm9QdHItPnVOdW1UaWNzOyBpKyspIHsKKwkJCXRpYz1pbmZvUHRyLT50aWNzW2ldOworCQkJaWYgKCh0aWM+aW5mb1B0ci0+blJhbmdlTWluKSAmJiAodGljPGluZm9QdHItPm5SYW5nZU1heCkpIHsKKyAgICAgICAgICAgIAl4PXJjQ2hhbm5lbC5sZWZ0ICsgd2lkdGgqKDY1NTM2KnRpYy9yYW5nZSkvNjU1MzY7CisgICAgICAgICAgICAJU2V0UGl4ZWwzMiAoaGRjLCB4LHkrNSwgY2xyVGljKTsKKyAgICAgICAgICAgIAlTZXRQaXhlbDMyIChoZGMsIHgseSs2LCBjbHJUaWMpOworICAgICAgICAgICAgCVNldFBpeGVsMzIgKGhkYywgeCx5KzcsIGNsclRpYyk7CisJCQl9CisgICAgICAgICAgfQorCSAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgVEJTX0VOQUJMRVNFTFJBTkdFKSAmJiAKKwkJICAgKHJjU2VsZWN0aW9uLmxlZnQhPXJjU2VsZWN0aW9uLnJpZ2h0KSkgeworCQkJeD1yY0NoYW5uZWwubGVmdCArIHdpZHRoKig2NTUzNippbmZvUHRyLT5uU2VsTWluL3JhbmdlKS82NTUzNiAtIDE7CisgICAgICAgICAgIAlTZXRQaXhlbDMyIChoZGMsIHgseSs2LCBjbHJUaWMpOworICAgICAgICAgICAJU2V0UGl4ZWwzMiAoaGRjLCB4LHkrNywgY2xyVGljKTsKKwkJCXg9cmNDaGFubmVsLmxlZnQgKyB3aWR0aCooNjU1MzYqaW5mb1B0ci0+blNlbE1heC9yYW5nZSkvNjU1MzYgKyAxOyAKKyAgICAgICAgICAgCVNldFBpeGVsMzIgKGhkYywgeCx5KzYsIGNsclRpYyk7CisgICAgICAgICAgIAlTZXRQaXhlbDMyIChoZGMsIHgseSs3LCBjbHJUaWMpOworCQl9CisJCQorCSAgIHg9cmNDaGFubmVsLmxlZnQ7CisgICAgICAgU2V0UGl4ZWwzMiAoaGRjLCB4LHkrNSwgY2xyVGljKTsKKyAgICAgICBTZXRQaXhlbDMyIChoZGMsIHgseSs2LCBjbHJUaWMpOworICAgICAgIFNldFBpeGVsMzIgKGhkYywgeCx5KzcsIGNsclRpYyk7CisgICAgICAgU2V0UGl4ZWwzMiAoaGRjLCB4LHkrOCwgY2xyVGljKTsKKwkgICB4PXJjQ2hhbm5lbC5yaWdodDsKKyAgICAgICBTZXRQaXhlbDMyIChoZGMsIHgseSs1LCBjbHJUaWMpOworICAgICAgIFNldFBpeGVsMzIgKGhkYywgeCx5KzYsIGNsclRpYyk7CisgICAgICAgU2V0UGl4ZWwzMiAoaGRjLCB4LHkrNywgY2xyVGljKTsKKyAgICAgICBTZXRQaXhlbDMyIChoZGMsIHgseSs4LCBjbHJUaWMpOworLy8gICAgIH0KKyAgICB9CisKKyAKKyAgICAgLyogZHJhdyB0aHVtYiAqLworCisgICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19OT1RIVU1CKSkgeworICAgICAgICBIQlJVU0gzMiBoYnIgPSBDcmVhdGVTb2xpZEJydXNoMzIgKENPTE9SX0JBQ0tHUk9VTkQpOworCQlSRUNUMzIgdGh1bWIgPSBpbmZvUHRyLT5yY1RodW1iOworCisJCVNlbGVjdE9iamVjdDMyIChoZGMsIGhicik7CisJCQorCQlpZiAod25kUHRyLT5kd1N0eWxlICYgVEJTX0JPVEgpIHsKKyAgICAgICAgCUZpbGxSZWN0MzIgKGhkYywgJnRodW1iLCBoYnIpOworICAJCQlEcmF3RWRnZTMyIChoZGMsICZ0aHVtYiwgRURHRV9SQUlTRUQsIEJGX1RPUExFRlQpOworCQl9IGVsc2UgeworCisJCVBPSU5UMzIgcG9pbnRzWzZdOworCQlSRUNUMzIgdHJpYW5nbGU7CS8qIGZvciBjb3JyZWN0IHNoYWRvd3Mgb2YgdGh1bWIgKi8KKworIAkJCS8qIGZpcnN0LCBmaWxsIHRoZSB0aHVtYiAqLworCQkKKwkJU2V0UG9seUZpbGxNb2RlMzIgKGhkYyxXSU5ESU5HKTsKKwkJcG9pbnRzWzBdLng9dGh1bWIubGVmdDsKKwkJcG9pbnRzWzBdLnk9dGh1bWIudG9wOworCQlwb2ludHNbMV0ueD10aHVtYi5yaWdodCAtIDE7CisJCXBvaW50c1sxXS55PXRodW1iLnRvcDsKKwkJcG9pbnRzWzJdLng9dGh1bWIucmlnaHQgLSAxOworCQlwb2ludHNbMl0ueT10aHVtYi5ib3R0b20gLTI7CisJCXBvaW50c1szXS54PSh0aHVtYi5yaWdodCArIHRodW1iLmxlZnQtMSkvMjsKKwkJcG9pbnRzWzNdLnk9dGh1bWIuYm90dG9tKzQ7CisJCXBvaW50c1s0XS54PXRodW1iLmxlZnQ7CisJCXBvaW50c1s0XS55PXRodW1iLmJvdHRvbSAtMjsKKwkJcG9pbnRzWzVdLng9cG9pbnRzWzBdLng7CisJCXBvaW50c1s1XS55PXBvaW50c1swXS55OworCQlQb2x5Z29uMzIgKGhkYywgcG9pbnRzLCA2KTsKKwkJRHJhd0VkZ2UzMiAoaGRjLCAmdGh1bWIsIEVER0VfUkFJU0VELCBCRl9UT1BMRUZUKTsKKy8vCQlEcmF3RWRnZTMyIChoZGMsICZ0aHVtYiwgRURHRV9TVU5LRU4sIEJGX0JPVFRPTVJJR0hUKTsKKworCQkJLyogZHJhdyBub3RjaCAqLworCisJCXRyaWFuZ2xlLnJpZ2h0ID0gdGh1bWIucmlnaHQrNTsKKwkJdHJpYW5nbGUubGVmdCAgPSBwb2ludHNbM10ueCs1OworCQl0cmlhbmdsZS50b3AgICA9IHRodW1iLmJvdHRvbSArNTsKKwkJdHJpYW5nbGUuYm90dG9tPSB0aHVtYi5ib3R0b20gKzE7CisJCURyYXdFZGdlMzIgKGhkYywgJnRyaWFuZ2xlLCBFREdFX1NVTktFTiwgQkZfRElBR09OQUwgfCBCRl9UT1AgfCBCRl9SSUdIVCk7CisJCXRyaWFuZ2xlLmxlZnQgID0gdGh1bWIubGVmdCs2OworCQl0cmlhbmdsZS5yaWdodCA9IHBvaW50c1szXS54KzY7CisJCURyYXdFZGdlMzIgKGhkYywgJnRyaWFuZ2xlLCBFREdFX1JBSVNFRCwgQkZfRElBR09OQUwgfCBCRl9UT1AgfCBCRl9MRUZUKTsKKwkJfQorCQlEZWxldGVPYmplY3QzMiAoaGJyKTsKKyAgICAgfQorCisgICAgaWYgKGluZm9QdHItPmJGb2N1cykKKwkJRHJhd0ZvY3VzUmVjdDMyIChoZGMsICZyY0NsaWVudCk7Cit9CisKKworCiAKIHN0YXRpYyBWT0lECiBUUkFDS0JBUl9BbGlnbkJ1ZGRpZXMgKFdORCAqd25kUHRyLCBUUkFDS0JBUl9JTkZPICppbmZvUHRyKQpAQCAtMTY5LDExICszOTQsMTIgQEAKIAogICAgIGluZm9QdHItPm5TZWxNaW4gPSAwOwogICAgIGluZm9QdHItPm5TZWxNYXggPSAwOworCWluZm9QdHItPmZsYWdzIHw9VEJfU0VMRUNUSU9OQ0hBTkdFRDsKIAogICAgIGlmICgoQk9PTDMyKXdQYXJhbSkgewotCUhEQzMyIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOwotCVRSQUNLQkFSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKLQlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKwkJSERDMzIgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisJCVRSQUNLQkFSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKKwkJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0xODYsMTYgKzQxMiwxNSBAQAogICAgIFRSQUNLQkFSX0lORk8gKmluZm9QdHIgPSBUUkFDS0JBUl9HZXRJbmZvUHRyKHduZFB0cik7CiAKICAgICBpZiAoaW5mb1B0ci0+dGljcykgewotCUZJWE1FICh0cmFja2JhciwgImlzIHRoaXMgY29ycmVjdD8/XG4iKTsKLQlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGluZm9QdHItPnRpY3MpOwotCWluZm9QdHItPnRpY3MgPSBOVUxMOwotCWluZm9QdHItPnVOdW1UaWNzID0gMjsKKwkJSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT50aWNzKTsKKwkJaW5mb1B0ci0+dGljcyA9IE5VTEw7CisJCWluZm9QdHItPnVOdW1UaWNzID0gMDsKICAgICB9CiAKICAgICBpZiAod1BhcmFtKSB7Ci0JSERDMzIgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7Ci0JVFJBQ0tCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOwotCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCQlIREMzMiBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwkJVFJBQ0tCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworCQlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTIwNyw5ICs0MzIsOCBAQAogewogICAgIFRSQUNLQkFSX0lORk8gKmluZm9QdHIgPSBUUkFDS0JBUl9HZXRJbmZvUHRyKHduZFB0cik7CiAKLSAgICBpZiAod1BhcmFtKQotCS8qIGJ1ZGR5IGlzIGxlZnQgb3IgYWJvdmUgKi8KLQlyZXR1cm4gKExSRVNVTFQpaW5mb1B0ci0+aHduZEJ1ZGR5TEE7CisgICAgaWYgKHdQYXJhbSkJCSAvKiBidWRkeSBpcyBsZWZ0IG9yIGFib3ZlICovCisJCXJldHVybiAoTFJFU1VMVClpbmZvUHRyLT5od25kQnVkZHlMQTsKIAogICAgIC8qIGJ1ZGR5IGlzIHJpZ2h0IG9yIGJlbG93ICovCiAgICAgcmV0dXJuIChMUkVTVUxUKSBpbmZvUHRyLT5od25kQnVkZHlSQjsKQEAgLTIyMyw3ICs0NDcsNyBAQAogICAgIExQUkVDVDMyIGxwcmMgPSAoTFBSRUNUMzIpbFBhcmFtOwogCiAgICAgaWYgKGxwcmMgPT0gTlVMTCkKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIDA7CiAKICAgICBscHJjLT5sZWZ0ICAgPSBpbmZvUHRyLT5yY0NoYW5uZWwubGVmdDsKICAgICBscHJjLT5yaWdodCAgPSBpbmZvUHRyLT5yY0NoYW5uZWwucmlnaHQ7CkBAIC0yNDksOSArNDczLDkgQEAKICAgICBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19OT1RJQ0tTKQotCXJldHVybiAwOworCQlyZXR1cm4gMDsKIAotICAgIHJldHVybiBpbmZvUHRyLT51TnVtVGljczsKKyAgICByZXR1cm4gaW5mb1B0ci0+dU51bVRpY3MrMjsKIH0KIAogCkBAIC0yNzMsNyArNDk3LDYgQEAKIH0KIAogCi0vLyA8PCBUUkFDS0JBUl9HZXRQVGljcyA+PgogCiAKIHN0YXRpYyBMUkVTVUxUCkBAIC0zMjAsMjAgKzU0Myw3OCBAQAogICAgIHJldHVybiBpbmZvUHRyLT51VGh1bWJMZW47CiB9CiAKK3N0YXRpYyBMUkVTVUxUCitUUkFDS0JBUl9HZXRQVGljcyAoV05EICp3bmRQdHIpCit7CisgICAgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICAKKyAgIHJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+dGljczsKK30KKworc3RhdGljIExSRVNVTFQKK1RSQUNLQkFSX0dldFRodW1iUmVjdCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIExQUkVDVDMyIGxwcmMgPSAoTFBSRUNUMzIpbFBhcmFtOworICAgIAorICAgIGlmIChscHJjID09IE5VTEwpCisgICAJCXJldHVybiAwOyAKKyAgIAorICAgIGxwcmMtPmxlZnQgICA9IGluZm9QdHItPnJjVGh1bWIubGVmdDsKKyAgICBscHJjLT5yaWdodCAgPSBpbmZvUHRyLT5yY1RodW1iLnJpZ2h0OworICAgIGxwcmMtPmJvdHRvbSA9IGluZm9QdHItPnJjVGh1bWIuYm90dG9tOworICAgIGxwcmMtPnRvcCAgICA9IGluZm9QdHItPnJjVGh1bWIudG9wOworICAgCisgICAgcmV0dXJuIDA7Cit9ICAKIAogCi0vLyA8PCBUUkFDS0JBUl9HZXRUaHVtYlJlY3QgPj4KLS8vCWNhc2UgVEJNX0dFVFRJQzoKLS8vCWNhc2UgVEJNX0dFVFRJQ1BPUzoKIAogCisKK3N0YXRpYyBMUkVTVUxUCitUUkFDS0JBUl9HZXRUaWMgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCisKK3sKKyBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworIElOVDMyIGlUaWM7CisKKyBpVGljPShJTlQzMikgd1BhcmFtOworIGlmICgoaVRpYzwwKSB8fCAoaVRpYz5pbmZvUHRyLT51TnVtVGljcykpIAorCXJldHVybiAtMTsKKworIHJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+dGljc1tpVGljXTsKKworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUUkFDS0JBUl9HZXRUaWNQb3MgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCisKK3sKKyBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworIElOVDMyIGlUaWMsIHJhbmdlLCB3aWR0aCwgcG9zOworIAorCisgaVRpYz0oSU5UMzIgKSB3UGFyYW07CisgaWYgKChpVGljPDApIHx8IChpVGljPmluZm9QdHItPnVOdW1UaWNzKSkgCisJcmV0dXJuIC0xOworCisgcmFuZ2U9aW5mb1B0ci0+blJhbmdlTWF4IC0gaW5mb1B0ci0+blJhbmdlTWluOworIHdpZHRoPWluZm9QdHItPnJjQ2hhbm5lbC5yaWdodCAtIGluZm9QdHItPnJjQ2hhbm5lbC5sZWZ0OworIHBvcz1pbmZvUHRyLT5yY0NoYW5uZWwubGVmdCArIHdpZHRoKig2NTUzNippbmZvUHRyLT50aWNzW2lUaWNdL3JhbmdlKS82NTUzNjsKKworCisgcmV0dXJuIChMUkVTVUxUKSBwb3M7Cit9CisKIHN0YXRpYyBMUkVTVUxUCiBUUkFDS0JBUl9HZXRUb29sVGlwcyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19UT09MVElQUykKLQlyZXR1cm4gKExSRVNVTFQpaW5mb1B0ci0+aHduZFRvb2xUaXA7CisJCXJldHVybiAoTFJFU1VMVClpbmZvUHRyLT5od25kVG9vbFRpcDsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzU1LDExICs2MzYsMTEgQEAKIAlGSVhNRSAodHJhY2tiYXIsICJtb3ZlIGJ1ZGR5IVxuIik7CiAgICAgfQogICAgIGVsc2UgewotCS8qIGJ1ZGR5IGlzIHJpZ2h0IG9yIGJlbG93ICovCi0JaHduZFRlbXAgPSBpbmZvUHRyLT5od25kQnVkZHlSQjsKLQlpbmZvUHRyLT5od25kQnVkZHlSQiA9IChIV05EMzIpbFBhcmFtOworCQkvKiBidWRkeSBpcyByaWdodCBvciBiZWxvdyAqLworCQlod25kVGVtcCA9IGluZm9QdHItPmh3bmRCdWRkeVJCOworCQlpbmZvUHRyLT5od25kQnVkZHlSQiA9IChIV05EMzIpbFBhcmFtOwogCi0JRklYTUUgKHRyYWNrYmFyLCAibW92ZSBidWRkeSFcbiIpOworCQlGSVhNRSAodHJhY2tiYXIsICJtb3ZlIGJ1ZGR5IVxuIik7CiAgICAgfQogCiAgICAgVFJBQ0tCQVJfQWxpZ25CdWRkaWVzICh3bmRQdHIsIGluZm9QdHIpOwpAQCAtNDA0LDExICs2ODUsMTIgQEAKIAogICAgIGlmIChpbmZvUHRyLT5uUG9zID4gaW5mb1B0ci0+blJhbmdlTWF4KQogCWluZm9QdHItPm5Qb3MgPSBpbmZvUHRyLT5uUmFuZ2VNYXg7CisJaW5mb1B0ci0+ZmxhZ3MgfD1UQl9USFVNQkNIQU5HRUQ7CiAKICAgICBpZiAod1BhcmFtKSB7Ci0JSERDMzIgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7Ci0JVFJBQ0tCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOwotCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCQlIREMzMiBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwkJVFJBQ0tCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworCQlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTQxOSwyMCArNzAxLDI2IEBACiBUUkFDS0JBUl9TZXRSYW5nZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwotCiAgICAgaW5mb1B0ci0+blJhbmdlTWluID0gKElOVDMyKUxPV09SRChsUGFyYW0pOwogICAgIGluZm9QdHItPm5SYW5nZU1heCA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKIAotICAgIGlmIChpbmZvUHRyLT5uUG9zIDwgaW5mb1B0ci0+blJhbmdlTWluKQotCWluZm9QdHItPm5Qb3MgPSBpbmZvUHRyLT5uUmFuZ2VNaW47CisgICAgaWYgKGluZm9QdHItPm5Qb3MgPCBpbmZvUHRyLT5uUmFuZ2VNaW4pIHsKKwkJaW5mb1B0ci0+blBvcyA9IGluZm9QdHItPm5SYW5nZU1pbjsKKwkJaW5mb1B0ci0+ZmxhZ3MgfD1UQl9USFVNQkNIQU5HRUQ7CisJfQogCi0gICAgaWYgKGluZm9QdHItPm5Qb3MgPiBpbmZvUHRyLT5uUmFuZ2VNYXgpCi0JaW5mb1B0ci0+blBvcyA9IGluZm9QdHItPm5SYW5nZU1heDsKKyAgICBpZiAoaW5mb1B0ci0+blBvcyA+IGluZm9QdHItPm5SYW5nZU1heCkgeworCQlpbmZvUHRyLT5uUG9zID0gaW5mb1B0ci0+blJhbmdlTWF4OworCQlpbmZvUHRyLT5mbGFncyB8PVRCX1RIVU1CQ0hBTkdFRDsKKwl9CisKKwlpbmZvUHRyLT5uUGFnZVNpemU9KGluZm9QdHItPm5SYW5nZU1heCAtICBpbmZvUHRyLT5uUmFuZ2VNaW4pLzU7CisJVFJBQ0tCQVJfUmVjYWxjdWxhdGVUaWNzIChpbmZvUHRyKTsKIAogICAgIGlmICh3UGFyYW0pIHsKLQlIREMzMiBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKLQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7Ci0JUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisJCUhEQzMyIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtNDQ1LDEzICs3MzMsMTggQEAKICAgICBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwogCiAgICAgaW5mb1B0ci0+blJhbmdlTWF4ID0gKElOVDMyKWxQYXJhbTsKLSAgICBpZiAoaW5mb1B0ci0+blBvcyA+IGluZm9QdHItPm5SYW5nZU1heCkKLQlpbmZvUHRyLT5uUG9zID0gaW5mb1B0ci0+blJhbmdlTWF4OworICAgIGlmIChpbmZvUHRyLT5uUG9zID4gaW5mb1B0ci0+blJhbmdlTWF4KSB7CisJCWluZm9QdHItPm5Qb3MgPSBpbmZvUHRyLT5uUmFuZ2VNYXg7CisJCWluZm9QdHItPmZsYWdzIHw9VEJfVEhVTUJDSEFOR0VEOworCX0KKworCWluZm9QdHItPm5QYWdlU2l6ZT0oaW5mb1B0ci0+blJhbmdlTWF4IC0gIGluZm9QdHItPm5SYW5nZU1pbikvNTsKKwlUUkFDS0JBUl9SZWNhbGN1bGF0ZVRpY3MgKGluZm9QdHIpOwogCiAgICAgaWYgKHdQYXJhbSkgewotCUhEQzMyIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOwotCVRSQUNLQkFSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKLQlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKwkJSERDMzIgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisJCVRSQUNLQkFSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKKwkJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC00NjQsMzkgKzc1Nyw2MiBAQAogICAgIFRSQUNLQkFSX0lORk8gKmluZm9QdHIgPSBUUkFDS0JBUl9HZXRJbmZvUHRyKHduZFB0cik7CiAKICAgICBpbmZvUHRyLT5uUmFuZ2VNaW4gPSAoSU5UMzIpbFBhcmFtOwotICAgIGlmIChpbmZvUHRyLT5uUG9zIDwgaW5mb1B0ci0+blJhbmdlTWluKQotCWluZm9QdHItPm5Qb3MgPSBpbmZvUHRyLT5uUmFuZ2VNaW47CisgICAgaWYgKGluZm9QdHItPm5Qb3MgPCBpbmZvUHRyLT5uUmFuZ2VNaW4pIHsKKwkJaW5mb1B0ci0+blBvcyA9IGluZm9QdHItPm5SYW5nZU1pbjsKKwkJaW5mb1B0ci0+ZmxhZ3MgfD1UQl9USFVNQkNIQU5HRUQ7CisJfQorCisJaW5mb1B0ci0+blBhZ2VTaXplPShpbmZvUHRyLT5uUmFuZ2VNYXggLSAgaW5mb1B0ci0+blJhbmdlTWluKS81OworCVRSQUNLQkFSX1JlY2FsY3VsYXRlVGljcyAoaW5mb1B0cik7CiAKICAgICBpZiAod1BhcmFtKSB7Ci0JSERDMzIgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7Ci0JVFJBQ0tCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOwotCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCQlIREMzMiBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwkJVFJBQ0tCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworCQlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIExSRVNVTFQKK1RSQUNLQkFSX1NldFRpY0ZyZXEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCit7CisgICAgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKKwlIREMzMiBoZGM7CisJCisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19BVVRPVElDS1MpIAorICAgICAgICAgICAJaW5mb1B0ci0+dVRpY0ZyZXE9KFVJTlQzMikgd1BhcmFtOyAKKwkKKwlUUkFDS0JBUl9SZWNhbGN1bGF0ZVRpY3MgKGluZm9QdHIpOworCisJaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgVFJBQ0tCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCXJldHVybiAwOworfSAgIAorCiAKIHN0YXRpYyBMUkVTVUxUCiBUUkFDS0JBUl9TZXRTZWwgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKIAotICAgIGlmICghd25kUHRyLT5kd1N0eWxlICYgVEJTX0VOQUJMRVNFTFJBTkdFKQotCXJldHVybiAwOwotCiAgICAgaW5mb1B0ci0+blNlbE1pbiA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKICAgICBpbmZvUHRyLT5uU2VsTWF4ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOworCWluZm9QdHItPmZsYWdzIHw9VEJfU0VMRUNUSU9OQ0hBTkdFRDsKKworICAgIGlmICghd25kUHRyLT5kd1N0eWxlICYgVEJTX0VOQUJMRVNFTFJBTkdFKQorCQlyZXR1cm4gMDsKIAogICAgIGlmIChpbmZvUHRyLT5uU2VsTWluIDwgaW5mb1B0ci0+blJhbmdlTWluKQotCWluZm9QdHItPm5TZWxNaW4gPSBpbmZvUHRyLT5uUmFuZ2VNaW47CisJCWluZm9QdHItPm5TZWxNaW4gPSBpbmZvUHRyLT5uUmFuZ2VNaW47CiAgICAgaWYgKGluZm9QdHItPm5TZWxNYXggPiBpbmZvUHRyLT5uUmFuZ2VNYXgpCi0JaW5mb1B0ci0+blNlbE1heCA9IGluZm9QdHItPm5SYW5nZU1heDsKKwkJaW5mb1B0ci0+blNlbE1heCA9IGluZm9QdHItPm5SYW5nZU1heDsKIAogICAgIGlmICh3UGFyYW0pIHsKLQlIREMzMiBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKLQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7Ci0JUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisJCUhEQzMyIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtNTEyLDEzICs4MjgsMTUgQEAKIAlyZXR1cm4gMDsKIAogICAgIGluZm9QdHItPm5TZWxNYXggPSAoSU5UMzIpbFBhcmFtOworCWluZm9QdHItPmZsYWdzICB8PVRCX1NFTEVDVElPTkNIQU5HRUQ7CisJCiAgICAgaWYgKGluZm9QdHItPm5TZWxNYXggPiBpbmZvUHRyLT5uUmFuZ2VNYXgpCi0JaW5mb1B0ci0+blNlbE1heCA9IGluZm9QdHItPm5SYW5nZU1heDsKKwkJaW5mb1B0ci0+blNlbE1heCA9IGluZm9QdHItPm5SYW5nZU1heDsKIAogICAgIGlmICh3UGFyYW0pIHsKLQlIREMzMiBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKLQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7Ci0JUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisJCUhEQzMyIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtNTM0LDEzICs4NTIsMTQgQEAKIAlyZXR1cm4gMDsKIAogICAgIGluZm9QdHItPm5TZWxNaW4gPSAoSU5UMzIpbFBhcmFtOworCWluZm9QdHItPmZsYWdzICB8PVRCX1NFTEVDVElPTkNIQU5HRUQ7CiAgICAgaWYgKGluZm9QdHItPm5TZWxNaW4gPCBpbmZvUHRyLT5uUmFuZ2VNaW4pCi0JaW5mb1B0ci0+blNlbE1pbiA9IGluZm9QdHItPm5SYW5nZU1pbjsKKwkJaW5mb1B0ci0+blNlbE1pbiA9IGluZm9QdHItPm5SYW5nZU1pbjsKIAogICAgIGlmICh3UGFyYW0pIHsKLQlIREMzMiBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKLQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7Ci0JUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisJCUhEQzMyIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCQlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtNTUxLDEwICs4NzAsMTYgQEAKIFRSQUNLQkFSX1NldFRodW1iTGVuZ3RoIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIFRSQUNLQkFSX0lORk8gKmluZm9QdHIgPSBUUkFDS0JBUl9HZXRJbmZvUHRyKHduZFB0cik7CisJSERDMzIgaGRjOwogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU19GSVhFRExFTkdUSCkKLQlpbmZvUHRyLT51VGh1bWJMZW4gPSAoVUlOVDMyKXdQYXJhbTsKKwkJaW5mb1B0ci0+dVRodW1iTGVuID0gKFVJTlQzMil3UGFyYW07CiAKKwloZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwlpbmZvUHRyLT5mbGFncyB8PVRCX1RIVU1CQ0hBTkdFRDsKKwlUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisJCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTU2NCwxOSArODg5LDI0IEBACiB7CiAgICAgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKICAgICBJTlQzMiBuUG9zID0gKElOVDMyKWxQYXJhbTsKKwlIREMzMiBoZGM7CiAKLSAgICBpZiAoblBvcyA8IGluZm9QdHItPm5SYW5nZU1pbikKLQlyZXR1cm4gRkFMU0U7Ci0gICAgaWYgKG5Qb3MgPiBpbmZvUHRyLT5uUmFuZ2VNYXgpCi0JcmV0dXJuIEZBTFNFOworICAgIGlmICgoblBvcyA8IGluZm9QdHItPm5SYW5nZU1pbikgfHwgKG5Qb3M+IGluZm9QdHItPm5SYW5nZU1heCkpCisJCXJldHVybiBGQUxTRTsKIAotICAgIEZJWE1FICh0cmFja2JhciwgIiVkIC0gZW1wdHkgc3R1YiFcbiIsIG5Qb3MpOworCWluZm9QdHItPnVOdW1UaWNzKys7CisgICAgaW5mb1B0ci0+dGljcz1IZWFwUmVBbGxvYyggU3lzdGVtSGVhcCwgMCwgaW5mb1B0ci0+dGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvUHRyLT51TnVtVGljcykqc2l6ZW9mIChEV09SRCkpOworICAgIGluZm9QdHItPnRpY3NbaW5mb1B0ci0+dU51bVRpY3MtMV09blBvczsKKworIAloZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKyAgICBUUkFDS0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAKICAgICByZXR1cm4gVFJVRTsKIH0KIAogCi0vLwljYXNlIFRCTV9TRVRUSUNGUkVROgogCiAKIHN0YXRpYyBMUkVTVUxUCkBAIC01ODYsNyArOTE2LDcgQEAKICAgICBJTlQzMiBmVGVtcCA9IGluZm9QdHItPmZMb2NhdGlvbjsKIAogICAgIGluZm9QdHItPmZMb2NhdGlvbiA9IChJTlQzMil3UGFyYW07Ci0KKwkKICAgICByZXR1cm4gZlRlbXA7CiB9CiAKQEAgLTYwNSw2ICs5MzUsMTkgQEAKIC8vCWNhc2UgVEJNX1NFVFVOSUNPREVGT1JNQVQ6CiAKIAorc3RhdGljIExSRVNVTFQKK1RSQUNLQkFSX0luaXRpYWxpemVUaHVtYiAoV05EICp3bmRQdHIpCit7CisgICAgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGluZm9QdHItPnVUaHVtYkxlbiA9IDIzOyAgIC8qIGluaXRpYWwgdGh1bWIgbGVuZ3RoICovCisKKwlUUkFDS0JBUl9DYWxjICh3bmRQdHIsaW5mb1B0cik7CisJVFJBQ0tCQVJfQ2FsY1RodW1iICh3bmRQdHIsIGluZm9QdHIpOworCWluZm9QdHItPmZsYWdzICY9IH5UQl9TRUxFQ1RJT05DSEFOR0VEOworCisJcmV0dXJuIDA7Cit9CiAKIAogc3RhdGljIExSRVNVTFQKQEAgLTYxNywxOCArOTYwLDIxIEBACiAgICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpaW5mb1B0cjsKIAogCi0gICAgLyogZGVmYXVsdCB2YWx1ZXMgKi8KLSAgICBpbmZvUHRyLT5uUmFuZ2VNaW4gPSAwOworICAgIGluZm9QdHItPm5SYW5nZU1pbiA9IDA7CQkJIC8qIGRlZmF1bHQgdmFsdWVzICovCiAgICAgaW5mb1B0ci0+blJhbmdlTWF4ID0gMTAwOwogICAgIGluZm9QdHItPm5MaW5lU2l6ZSA9IDE7CiAgICAgaW5mb1B0ci0+blBhZ2VTaXplID0gMjA7CiAgICAgaW5mb1B0ci0+blNlbE1pbiAgID0gMDsKICAgICBpbmZvUHRyLT5uU2VsTWF4ICAgPSAwOwogICAgIGluZm9QdHItPm5Qb3MgICAgICA9IDA7Ci0gICAgaW5mb1B0ci0+dVRodW1iTGVuID0gMjM7ICAgLyogaW5pdGlhbCB0aHVtYiBsZW5ndGggKi8KLSAgICBpbmZvUHRyLT51TnVtVGljcyAgPSAyOyAgICAvKiBkZWZhdWx0IHN0YXJ0IGFuZCBlbmQgdGljICovCiAKKyAgICBpbmZvUHRyLT51TnVtVGljcyAgPSAwOyAgICAvKiBzdGFydCBhbmQgZW5kIHRpYyBhcmUgbm90IGluY2x1ZGVkIGluIGNvdW50Ki8KKwlpbmZvUHRyLT51VGljRnJlcSAgPSAxOworCWluZm9QdHItPnRpY3MJICAgPSBOVUxMOworCWluZm9QdHItPmNsckJrCSAgID0gR2V0U3lzQ29sb3IzMiAoQ09MT1JfQkFDS0dST1VORCk7CiAKKwlUUkFDS0JBUl9Jbml0aWFsaXplVGh1bWIgKHduZFB0cik7CisJCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY2NywxMiArMTAxMyw2NCBAQAogVFJBQ0tCQVJfTEJ1dHRvbkRvd24gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKLQorCWludCBwcmV2UGxhY2UscmFuZ2Usd2lkdGgsY2xpY2tQbGFjZSxwcmV2UG9zOworCQogICAgIFNldEZvY3VzMzIgKHduZFB0ci0+aHduZFNlbGYpOwogCisJY2xpY2tQbGFjZT0oSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgICAgcmFuZ2U9aW5mb1B0ci0+blJhbmdlTWF4IC0gaW5mb1B0ci0+blJhbmdlTWluOworICAgIHdpZHRoPWluZm9QdHItPnJjQ2hhbm5lbC5yaWdodCAtIGluZm9QdHItPnJjQ2hhbm5lbC5sZWZ0OworICAgIHByZXZQbGFjZSA9IGluZm9QdHItPnJjQ2hhbm5lbC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgqKDY1NTM2KmluZm9QdHItPm5Qb3MvcmFuZ2UpLzY1NTM2OworCXByaW50ZiAoIiVkLT4lZFxuIixwcmV2UGxhY2UsY2xpY2tQbGFjZSk7CisKKwlwcmV2UG9zCT0gaW5mb1B0ci0+blBvczsKKwlpZiAoY2xpY2tQbGFjZSA+IHByZXZQbGFjZSkgewkJCQkJLyogc2ltaWxhciB0byBWS19ORVhUICovCisJCWluZm9QdHItPm5Qb3MgKz0gaW5mb1B0ci0+blBhZ2VTaXplOworICAgICAgICBpZiAoaW5mb1B0ci0+blBvcyA+IGluZm9QdHItPm5SYW5nZU1heCkKKwkJCWluZm9QdHItPm5Qb3MgPSBpbmZvUHRyLT5uUmFuZ2VNYXg7CisJCVRSQUNLQkFSX1NlbmROb3RpZnkgKHduZFB0ciwgVEJfUEFHRVVQKTsgIAorCX0gZWxzZSB7CisgICAgICAgIGluZm9QdHItPm5Qb3MgLT0gaW5mb1B0ci0+blBhZ2VTaXplOwkvKiBzaW1pbGFyIHRvIFZLX1BSSU9SICovCisgICAgICAgIGlmIChpbmZvUHRyLT5uUG9zIDwgaW5mb1B0ci0+blJhbmdlTWluKQorICAgICAgICAgICAgaW5mb1B0ci0+blBvcyA9IGluZm9QdHItPm5SYW5nZU1pbjsKKyAgICAgICAgVFJBQ0tCQVJfU2VuZE5vdGlmeSAod25kUHRyLCBUQl9QQUdFRE9XTik7CisJfQorCisJcHJpbnRmICgiJWQtPiVkXG4iLHByZXZQb3MsaW5mb1B0ci0+blBvcyk7CisJaWYgKHByZXZQb3MhPWluZm9QdHItPm5Qb3MpIHsKKyAgICAJSERDMzIgaGRjOworCisgICAgCWhkYz1HZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwkJaW5mb1B0ci0+ZmxhZ3MgfD1UQl9USFVNQkNIQU5HRUQ7CisgICAgCVRSQUNLQkFSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKKyAgICAJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisgCX0KKworCiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBMUkVTVUxUCitUUkFDS0JBUl9MQnV0dG9uVXAgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVFJBQ0tCQVJfSU5GTyAqaW5mb1B0ciA9IFRSQUNLQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIEZJWE1FICh0cmFja2Jhciwic3R1YlxuIik7CisKKwlUUkFDS0JBUl9TZW5kTm90aWZ5ICh3bmRQdHIsIFRCX0VORFRSQUNLKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgTFJFU1VMVAorVFJBQ0tCQVJfQ2FwdHVyZUNoYW5nZWQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgRklYTUUgKHRyYWNrYmFyLCJzdHViXG4iKTsKKworCVRSQUNLQkFSX1NlbmROb3RpZnkgKHduZFB0ciwgVEJfRU5EVFJBQ0spOworCXJldHVybiAwOworfQogCiBzdGF0aWMgTFJFU1VMVAogVFJBQ0tCQVJfUGFpbnQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCkBAIC03MDgsMTEgKzExMDYsOCBAQAogVFJBQ0tCQVJfU2l6ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIFJFQ1QzMiByY0NsaWVudDsKIAotICAgIEdldENsaWVudFJlY3QzMiAod25kUHRyLT5od25kU2VsZiwgJnJjQ2xpZW50KTsKLQotICAgIFRSQUNLQkFSX0NhbGMgKHduZFB0ciwgaW5mb1B0ciwgJnJjQ2xpZW50KTsKKyAgICBUUkFDS0JBUl9DYWxjICh3bmRQdHIsIGluZm9QdHIpOwogICAgIFRSQUNLQkFSX0FsaWduQnVkZGllcyAod25kUHRyLCBpbmZvUHRyKTsKIAogICAgIHJldHVybiAwOwpAQCAtNzIwLDkgKzExMTUsMTExIEBACiAKIAogLy8gPDwgVFJBQ0tCQVJfVGltZXIgPj4KLS8vIDw8IFRSQUNLQkFSX1dpbkluaUNoYW5nZSA+PgogCiAKK3N0YXRpYyBCT09MMzIKK1RSQUNLQkFSX1NlbmROb3RpZnkgKFdORCAqd25kUHRyLCBVSU5UMzIgY29kZSkKKworeworICAgIFRSQUNFICh0cmFja2JhciwgIiV4XG4iLGNvZGUpOworCWlmICh3bmRQdHItPmR3U3R5bGUgJiBUQlNfVkVSVCkgCisgICAgCXJldHVybiAoQk9PTDMyKSBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCAKKwkJCQkJCVdNX1ZTQ1JPTEwsIChXUEFSQU0zMiljb2RlLCAoTFBBUkFNKSB3bmRQdHItPmh3bmRTZWxmKTsKKworICAgCXJldHVybiAoQk9PTDMyKSBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCAKKwkJCQkJCVdNX0hTQ1JPTEwsIChXUEFSQU0zMiljb2RlLCAoTFBBUkFNKSB3bmRQdHItPmh3bmRTZWxmKTsKK30KKworc3RhdGljIExSRVNVTFQKK1RSQUNLQkFSX01vdXNlTW92ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUUkFDS0JBUl9JTkZPICppbmZvUHRyID0gVFJBQ0tCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworCQkJCisJCisgCXJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUUkFDS0JBUl9LZXlEb3duIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRSQUNLQkFSX0lORk8gKmluZm9QdHIgPSBUUkFDS0JBUl9HZXRJbmZvUHRyKHduZFB0cik7CisJSU5UMzIgcG9zOworCisgICAgVFJBQ0UgKHRyYWNrYmFyLCAiJXhcbiIsd1BhcmFtKTsKKworCXBvcz1pbmZvUHRyLT5uUG9zOworCXN3aXRjaCAod1BhcmFtKSB7CisJCWNhc2UgVktfTEVGVDoKKwkJY2FzZSBWS19VUDogCisJCQlpZiAoaW5mb1B0ci0+blBvcyA9PSBpbmZvUHRyLT5uUmFuZ2VNaW4pIHJldHVybiBGQUxTRTsKKwkJCWluZm9QdHItPm5Qb3MgLT0gaW5mb1B0ci0+bkxpbmVTaXplOworCQkJaWYgKGluZm9QdHItPm5Qb3MgPCBpbmZvUHRyLT5uUmFuZ2VNaW4pIAorCQkJCWluZm9QdHItPm5Qb3MgPSBpbmZvUHRyLT5uUmFuZ2VNaW47CisJCQlUUkFDS0JBUl9TZW5kTm90aWZ5ICh3bmRQdHIsIFRCX0xJTkVVUCk7CisJCQlicmVhazsKKwkJY2FzZSBWS19SSUdIVDoKKwkJY2FzZSBWS19ET1dOOiAKKwkJCWlmIChpbmZvUHRyLT5uUG9zID09IGluZm9QdHItPm5SYW5nZU1heCkgcmV0dXJuIEZBTFNFOworCQkJaW5mb1B0ci0+blBvcyArPSBpbmZvUHRyLT5uTGluZVNpemU7CisJCQlpZiAoaW5mb1B0ci0+blBvcyA+IGluZm9QdHItPm5SYW5nZU1heCkgCisJCQkJaW5mb1B0ci0+blBvcyA9IGluZm9QdHItPm5SYW5nZU1heDsKKwkJCVRSQUNLQkFSX1NlbmROb3RpZnkgKHduZFB0ciwgVEJfTElORURPV04pOworICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgVktfTkVYVDoKKwkJCWlmIChpbmZvUHRyLT5uUG9zID09IGluZm9QdHItPm5SYW5nZU1heCkgcmV0dXJuIEZBTFNFOworCQkJaW5mb1B0ci0+blBvcyArPSBpbmZvUHRyLT5uUGFnZVNpemU7CisJCQlpZiAoaW5mb1B0ci0+blBvcyA+IGluZm9QdHItPm5SYW5nZU1heCkgCisJCQkJaW5mb1B0ci0+blBvcyA9IGluZm9QdHItPm5SYW5nZU1heDsKKwkJCSBUUkFDS0JBUl9TZW5kTm90aWZ5ICh3bmRQdHIsIFRCX1BBR0VVUCk7CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBWS19QUklPUjoKKwkJCWlmIChpbmZvUHRyLT5uUG9zID09IGluZm9QdHItPm5SYW5nZU1pbikgcmV0dXJuIEZBTFNFOworCQkJaW5mb1B0ci0+blBvcyAtPSBpbmZvUHRyLT5uUGFnZVNpemU7CisJCQlpZiAoaW5mb1B0ci0+blBvcyA8IGluZm9QdHItPm5SYW5nZU1pbikgCisJCQkJaW5mb1B0ci0+blBvcyA9IGluZm9QdHItPm5SYW5nZU1pbjsKKwkJCVRSQUNLQkFSX1NlbmROb3RpZnkgKHduZFB0ciwgVEJfUEFHRURPV04pOworICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgVktfSE9NRTogCisJCQlpZiAoaW5mb1B0ci0+blBvcyA9PSBpbmZvUHRyLT5uUmFuZ2VNaW4pIHJldHVybiBGQUxTRTsKKwkJCWluZm9QdHItPm5Qb3MgPSBpbmZvUHRyLT5uUmFuZ2VNaW47CisJCQlUUkFDS0JBUl9TZW5kTm90aWZ5ICh3bmRQdHIsIFRCX1RPUCk7CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBWS19FTkQ6IAorCQkJaWYgKGluZm9QdHItPm5Qb3MgPT0gaW5mb1B0ci0+blJhbmdlTWF4KSByZXR1cm4gRkFMU0U7CisJCQlpbmZvUHRyLT5uUG9zID0gaW5mb1B0ci0+blJhbmdlTWF4OworCSAJCVRSQUNLQkFSX1NlbmROb3RpZnkgKHduZFB0ciwgVEJfQk9UVE9NKTsKKyAgICAgICAgICAgIGJyZWFrOworCX0KKworIGlmIChwb3MhPWluZm9QdHItPm5Qb3MpIHsgCisJSERDMzIgaGRjOworCisJaGRjPUdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCWluZm9QdHItPmZsYWdzIHw9VEJfVEhVTUJDSEFOR0VEOworCVRSQUNLQkFSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKKwlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKyB9CisKKyByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIExSRVNVTFQKK1RSQUNLQkFSX0tleVVwIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQoreworCXN3aXRjaCAod1BhcmFtKSB7CisJCWNhc2UgVktfTEVGVDoKKwkJY2FzZSBWS19VUDogCisJCWNhc2UgVktfUklHSFQ6CisJCWNhc2UgVktfRE9XTjogCisJCWNhc2UgVktfTkVYVDoKKwkJY2FzZSBWS19QUklPUjoKKwkJY2FzZSBWS19IT01FOiAKKwkJY2FzZSBWS19FTkQ6IAlUUkFDS0JBUl9TZW5kTm90aWZ5ICh3bmRQdHIsIFRCX0VORFRSQUNLKTsKKwl9CisgcmV0dXJuIFRSVUU7Cit9CisKIExSRVNVTFQgV0lOQVBJCiBUUkFDS0JBUl9XaW5kb3dQcm9jIChIV05EMzIgaHduZCwgVUlOVDMyIHVNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKQEAgLTc1NCw3ICsxMjUxLDggQEAKIAljYXNlIFRCTV9HRVRQT1M6CiAJICAgIHJldHVybiBUUkFDS0JBUl9HZXRQb3MgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFRCTV9HRVRQVElDUzoKKwljYXNlIFRCTV9HRVRQVElDUzoKKwkJIHJldHVybiBUUkFDS0JBUl9HZXRQVGljcyAod25kUHRyKTsKIAogCWNhc2UgVEJNX0dFVFJBTkdFTUFYOgogCSAgICByZXR1cm4gVFJBQ0tCQVJfR2V0UmFuZ2VNYXggKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtNzcxLDEwICsxMjY5LDE1IEBACiAJY2FzZSBUQk1fR0VUVEhVTUJMRU5HVEg6CiAJICAgIHJldHVybiBUUkFDS0JBUl9HZXRUaHVtYkxlbmd0aCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgVEJNX0dFVFRIVU1CUkVDVDoKLS8vCWNhc2UgVEJNX0dFVFRJQzoKLS8vCWNhc2UgVEJNX0dFVFRJQ1BPUzoKKwljYXNlIFRCTV9HRVRUSFVNQlJFQ1Q6CisgICAgICAgIHJldHVybiBUUkFDS0JBUl9HZXRUaHVtYlJlY3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisgICAgY2FzZSBUQk1fR0VUVElDOgorICAgICAgICByZXR1cm4gVFJBQ0tCQVJfR2V0VGljICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKyAKKyAgICBjYXNlIFRCTV9HRVRUSUNQT1M6CisgICAgICAgIHJldHVybiBUUkFDS0JBUl9HZXRUaWNQb3MgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworIAogCWNhc2UgVEJNX0dFVFRPT0xUSVBTOgogCSAgICByZXR1cm4gVFJBQ0tCQVJfR2V0VG9vbFRpcHMgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCkBAIC04MTYsNyArMTMxOSw5IEBACiAJY2FzZSBUQk1fU0VUVElDOgogCSAgICByZXR1cm4gVFJBQ0tCQVJfU2V0VGljICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBUQk1fU0VUVElDRlJFUToKKyAgICBjYXNlIFRCTV9TRVRUSUNGUkVROgorICAgICAgIHJldHVybiBUUkFDS0JBUl9TZXRUaWNGcmVxICh3bmRQdHIsIHdQYXJhbSk7CisKIAogCWNhc2UgVEJNX1NFVFRJUFNJREU6CiAJICAgIHJldHVybiBUUkFDS0JBUl9TZXRUaXBTaWRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTgyNyw3ICsxMzMyLDggQEAKIC8vCWNhc2UgVEJNX1NFVFVOSUNPREVGT1JNQVQ6CiAKIAotLy8JY2FzZSBXTV9DQVBUVVJFQ0hBTkdFRDoKKwljYXNlIFdNX0NBUFRVUkVDSEFOR0VEOgorCSAgICByZXR1cm4gVFJBQ0tCQVJfQ2FwdHVyZUNoYW5nZWQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBXTV9DUkVBVEU6CiAJICAgIHJldHVybiBUUkFDS0JBUl9DcmVhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtODQzLDkgKzEzNDksMTEgQEAKIAljYXNlIFdNX0dFVERMR0NPREU6CiAJICAgIHJldHVybiBETEdDX1dBTlRBUlJPV1M7CiAKLS8vCWNhc2UgV01fS0VZRE9XTjoKLQotLy8JY2FzZSBXTV9LRVlVUDoKKyAJY2FzZSBXTV9LRVlET1dOOgorICAgICAgIHJldHVybiBUUkFDS0JBUl9LZXlEb3duICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgCisgIAljYXNlIFdNX0tFWVVQOgorICAgICAgIHJldHVybiBUUkFDS0JBUl9LZXlVcCAod25kUHRyLCB3UGFyYW0pOwogCiAJY2FzZSBXTV9LSUxMRk9DVVM6CiAJICAgIHJldHVybiBUUkFDS0JBUl9LaWxsRm9jdXMgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtODUzLDEwICsxMzYxLDExIEBACiAJY2FzZSBXTV9MQlVUVE9ORE9XTjoKIAkgICAgcmV0dXJuIFRSQUNLQkFSX0xCdXR0b25Eb3duICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBXTV9MQlVUVE9OVVA6CisJY2FzZSBXTV9MQlVUVE9OVVA6CisJICAgIHJldHVybiBUUkFDS0JBUl9MQnV0dG9uVXAgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFdNX01PVVNFTU9WRToKLS8vCSAgICByZXR1cm4gVFJBQ0tCQVJfTW91c2VNb3ZlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwljYXNlIFdNX01PVVNFTU9WRToKKwkgICAgcmV0dXJuIFRSQUNLQkFSX01vdXNlTW92ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIAljYXNlIFdNX1BBSU5UOgogCSAgICByZXR1cm4gVFJBQ0tCQVJfUGFpbnQgKHduZFB0ciwgd1BhcmFtKTsKQEAgLTg2OSw3ICsxMzc4LDggQEAKIAogLy8JY2FzZSBXTV9USU1FUjoKIAotLy8JY2FzZSBXTV9XSU5JTklDSEFOR0U6CisJY2FzZSBXTV9XSU5JTklDSEFOR0U6CisJCXJldHVybiBUUkFDS0JBUl9Jbml0aWFsaXplVGh1bWIgKHduZFB0cik7CiAKIAlkZWZhdWx0OgogCSAgICBpZiAodU1zZyA+PSBXTV9VU0VSKQpkaWZmIC0tZ2l0IGEvZGxscy9jb21jdGwzMi90cmVldmlldy5jIGIvZGxscy9jb21jdGwzMi90cmVldmlldy5jCmluZGV4IGE0ZWFjNDcuLjliNWZjZjUgMTAwNjQ0Ci0tLSBhL2RsbHMvY29tY3RsMzIvdHJlZXZpZXcuYworKysgYi9kbGxzL2NvbWN0bDMyL3RyZWV2aWV3LmMKQEAgLTEsMTYgKzEsMjggQEAKLS8qCi0gKiBUcmVldmlldyBjb250cm9sCisvKiBUcmVldmlldyBjb250cm9sCiAgKgotICogQ29weXJpZ2h0IDE5OTggRXJpYyBLb2hsCisgKiBDb3B5cmlnaHQgMTk5OCBFcmljIEtvaGwgPGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlPgorICogQ29weXJpZ2h0IDE5OTggQWxleCBQcmllbSA8YWxleHBAc2NpLmt1bi5ubD4KICAqCi0gKiBOT1RFUwotICogICBUaGlzIGlzIGp1c3QgYSBkdW1teSBjb250cm9sLiBBbiBhdXRob3IgaXMgbmVlZGVkISBBbnkgdm9sdW50ZWVycz8KLSAqICAgSSB3aWxsIG9ubHkgaW1wcm92ZSB0aGlzIGNvbnRyb2wgb25jZSBpbiBhIHdoaWxlLgotICogICAgIEVyaWMgPGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlPgogICoKICAqIFRPRE86Ci0gKiAgIC0gQWxsIG1lc3NhZ2VzLgotICogICAtIEFsbCBub3RpZmljYXRpb25zLgorICogICAtIE5lYXJseSBhbGwgbm90aWZpY2F0aW9ucy4KKyAqIAorICogICBsaXN0LWhhbmRsaW5nIHN0dWZmOiBzb3J0LCBzb3J0ZWQgaW5zZXJ0aXRlbS4KKyAqCisgKiAgIHJlZnJlc2h0cmVldmlldzogCQorCQktc21hbGwgYXJyYXkgY29udGFpbmluZyBpbmZvIGFib3V0IHBvc2l0aW9ucy4KKyAJCS1iZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgRHJhd0l0ZW0gKGNvbm5lY3RpbmcgbGluZXMpLgorCQktaW1wbGVtZW50IHBhcnRpYWwgZHJhd2luZz8KKyAqICAgRXhwYW5kOgkJLWN0bG1hY3JvIGV4cGFuZHMgdHdpY2UgLT50b2dnbGUuCisgKiAgLWRyYWcmZHJvcC4KKyAqICAtc2Nyb2xsYmFycy4KKyAqICAtVW5pY29kZSBtZXNzYWdlcworICogIC1UVklURU1FWCAKKyAqCisgKiBGSVhNRXM6ICAKKyAgIC1HZXROZXh0SXRlbTogYWRkIGZsYWcgZm9yIHRyYXZlcnNpbmcgdmlzaWJsZSBpdGVtcyAKKyAgIC1EYmxDbGljazoJY3RsbWFjcm8uZXhlJ3MgTk1fREJMQ0xLIHNlZW1zIHRvIGdvIHdyb25nIChyZXR1cm5zIEZBTFNFKS4KKwkgICAgIAogICovCiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0xOSwyNiArMzEsMjI1IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPiAgICAgIC8qIEZJWE1FOiBsaW51eCBzcGVjaWZpYyAqLworCitzdGF0aWMgaW50IFRSRUVWSUVXX1RpbWVyOworCiAKIAogI2RlZmluZSBUUkVFVklFV19HZXRJbmZvUHRyKHduZFB0cikgKChUUkVFVklFV19JTkZPICopd25kUHRyLT53RXh0cmFbMF0pCiAKIAogCisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPiAgICAgIC8qIEZJWE1FOiBsaW51eCBzcGVjaWZpYyAqLworCitzdGF0aWMgaW50IFRSRUVWSUVXX1RpbWVyOworCisgIAorICAjZGVmaW5lIFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKSAoKFRSRUVWSUVXX0lORk8gKil3bmRQdHItPndFeHRyYVswXSkKKyAgCisgIAorICAKKworc3RhdGljIEJPT0wzMgorVFJFRVZJRVdfU2VuZFNpbXBsZU5vdGlmeSAoV05EICp3bmRQdHIsIFVJTlQzMiBjb2RlKTsKK3N0YXRpYyBCT09MMzIKK1RSRUVWSUVXX1NlbmRUcmVldmlld05vdGlmeSAoV05EICp3bmRQdHIsIFVJTlQzMiBjb2RlLCBVSU5UMzIgYWN0aW9uLCAKKwkJCUlOVDMyIG9sZEl0ZW0sIElOVDMyIG5ld0l0ZW0sIFBPSU5UMzIgcHQpOworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX1NlbGVjdEl0ZW0gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIHZvaWQKK1RSRUVWSUVXX1JlZnJlc2ggKFdORCAqd25kUHRyLCBIREMzMiBoZGMpOworCisKKworCisKKy8qIGhlbHBlciBmdW5jdGlvbnMuIFdvcmsgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHZhbGlkaXR5IG9mIG9wZXJhbmRzIAorICAgaXMgY2hlY2tlZCBiZWZvcmVoYW5kICovCisKKworc3RhdGljIFRSRUVWSUVXX0lURU0gKgorVFJFRVZJRVdfVmFsaWRJdGVtIChUUkVFVklFV19JTkZPICppbmZvUHRyLGludCAgaGFuZGxlKQoreworIAorIGlmICgoIWhhbmRsZSkgfHwgKGhhbmRsZT5pbmZvUHRyLT51TWF4SGFuZGxlKSkgcmV0dXJuIE5VTEw7CisgaWYgKHRlc3RfYml0IChoYW5kbGUsIGluZm9QdHItPmZyZWVMaXN0KSkgcmV0dXJuIE5VTEw7CisKKyByZXR1cm4gJiBpbmZvUHRyLT5pdGVtc1toYW5kbGVdOworfQorCisKKworc3RhdGljIFRSRUVWSUVXX0lURU0gKlRSRUVWSUVXX0dldFByZXZMaXN0SXRlbSAoVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciwgCisJCQkJCVRSRUVWSUVXX0lURU0gKnR2SXRlbSkKKworeworIFRSRUVWSUVXX0lURU0gKndpbmVJdGVtOworCisgaWYgKHR2SXRlbS0+dXBzaWJsaW5nKSAKKwkJcmV0dXJuICgmIGluZm9QdHItPml0ZW1zW3R2SXRlbS0+dXBzaWJsaW5nXSk7CisKKyB3aW5lSXRlbT10dkl0ZW07Cisgd2hpbGUgKHdpbmVJdGVtLT5wYXJlbnQpIHsKKwl3aW5lSXRlbT0mIGluZm9QdHItPml0ZW1zW3dpbmVJdGVtLT5wYXJlbnRdOworCWlmICh3aW5lSXRlbS0+dXBzaWJsaW5nKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gKCYgaW5mb1B0ci0+aXRlbXNbd2luZUl0ZW0tPnVwc2libGluZ10pOworIH0gCisKKyByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFRSRUVWSUVXX0lURU0gKlRSRUVWSUVXX0dldE5leHRMaXN0SXRlbSAoVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciwgCisJCQkJCVRSRUVWSUVXX0lURU0gKnR2SXRlbSkKKworeworIFRSRUVWSUVXX0lURU0gKndpbmVJdGVtOworCisgaWYgKHR2SXRlbS0+c2libGluZykgCisJCXJldHVybiAoJiBpbmZvUHRyLT5pdGVtc1t0dkl0ZW0tPnNpYmxpbmddKTsKKworIHdpbmVJdGVtPXR2SXRlbTsKKyB3aGlsZSAod2luZUl0ZW0tPnBhcmVudCkgeworCXdpbmVJdGVtPSYgaW5mb1B0ci0+aXRlbXMgW3dpbmVJdGVtLT5wYXJlbnRdOworCWlmICh3aW5lSXRlbS0+c2libGluZykgCisgICAgICAgICAgICAgICAgcmV0dXJuICgmIGluZm9QdHItPml0ZW1zIFt3aW5lSXRlbS0+c2libGluZ10pOworIH0gCisKKyByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFRSRUVWSUVXX0lURU0gKlRSRUVWSUVXX0dldExhc3RMaXN0SXRlbSAoVFJFRVZJRVdfSU5GTyAqaW5mb1B0cikKKworeworICBUUkVFVklFV19JVEVNICp3aW5lSXRlbTsKKyAgCisgd2luZUl0ZW09TlVMTDsKKyBpZiAoaW5mb1B0ci0+VG9wUm9vdEl0ZW0pIAorCXdpbmVJdGVtPSYgaW5mb1B0ci0+aXRlbXMgW2luZm9QdHItPlRvcFJvb3RJdGVtXTsKKyB3aGlsZSAod2luZUl0ZW0tPnNpYmxpbmcpIAorCXdpbmVJdGVtPSYgaW5mb1B0ci0+aXRlbXMgW3dpbmVJdGVtLT5zaWJsaW5nXTsKKworIHJldHVybiB3aW5lSXRlbTsKK30KKwkKKyAKKworCitzdGF0aWMgdm9pZAorVFJFRVZJRVdfUmVtb3ZlSXRlbSAoVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciwgVFJFRVZJRVdfSVRFTSAqd2luZUl0ZW0pCisKK3sKKyBUUkVFVklFV19JVEVNICpwYXJlbnRJdGVtLCAqdXBzaWJsaW5nSXRlbSwgKnNpYmxpbmdJdGVtOworIElOVDMyIGlJdGVtOworCisgaUl0ZW09d2luZUl0ZW0tPmhJdGVtOworIHNldF9iaXQgKCBpSXRlbSAmIDMxLCAmaW5mb1B0ci0+ZnJlZUxpc3RbaUl0ZW0gPj41XSk7CisgaW5mb1B0ci0+dU51bUl0ZW1zLS07CisgcGFyZW50SXRlbT1OVUxMOworIGlmICh3aW5lSXRlbS0+cHN6VGV4dCE9TFBTVFJfVEVYVENBTExCQUNLMzJBKSAKKwlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHdpbmVJdGVtLT5wc3pUZXh0KTsKKworIGlmICh3aW5lSXRlbS0+cGFyZW50KSB7CisJcGFyZW50SXRlbT0mIGluZm9QdHItPml0ZW1zWyB3aW5lSXRlbS0+cGFyZW50XTsKKwlpZiAocGFyZW50SXRlbS0+Y0NoaWxkcmVuPT0xKSB7CisJCXBhcmVudEl0ZW0tPmNDaGlsZHJlbj0wOworCQlwYXJlbnRJdGVtLT5maXJzdENoaWxkPTA7ICAgIAorCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJcGFyZW50SXRlbS0+Y0NoaWxkcmVuLS07CisJCWlmIChwYXJlbnRJdGVtLT5maXJzdENoaWxkPT1pSXRlbSkgCisJCQlwYXJlbnRJdGVtLT5maXJzdENoaWxkPXdpbmVJdGVtLT5zaWJsaW5nOworCQl9CisgfQorCisgaWYgKGlJdGVtPT1pbmZvUHRyLT5Ub3BSb290SXRlbSkgCisJaW5mb1B0ci0+VG9wUm9vdEl0ZW09d2luZUl0ZW0tPnNpYmxpbmc7CisgaWYgKHdpbmVJdGVtLT51cHNpYmxpbmcpIHsKKwl1cHNpYmxpbmdJdGVtPSYgaW5mb1B0ci0+aXRlbXMgW3dpbmVJdGVtLT51cHNpYmxpbmddOworCXVwc2libGluZ0l0ZW0tPnNpYmxpbmc9d2luZUl0ZW0tPnNpYmxpbmc7CisgfQorIGlmICh3aW5lSXRlbS0+c2libGluZykgeworCXNpYmxpbmdJdGVtPSYgaW5mb1B0ci0+aXRlbXMgW3dpbmVJdGVtLT5zaWJsaW5nXTsKKwlzaWJsaW5nSXRlbS0+dXBzaWJsaW5nPXdpbmVJdGVtLT51cHNpYmxpbmc7CisgfQorfQorCisKKworc3RhdGljIHZvaWQgVFJFRVZJRVdfUmVtb3ZlQWxsQ2hpbGRyZW4gKFRSRUVWSUVXX0lORk8gKmluZm9QdHIsIAorCQkJCQkgICBUUkVFVklFV19JVEVNICpwYXJlbnRJdGVtKQorCit7CisgVFJFRVZJRVdfSVRFTSAqa2lsbEl0ZW07CisgSU5UMzIJa2lsbDsKKyAKKyBraWxsPXBhcmVudEl0ZW0tPmZpcnN0Q2hpbGQ7Cisgd2hpbGUgKGtpbGwpIHsKKyAJc2V0X2JpdCAoIGtpbGwgJiAzMSwgJmluZm9QdHItPmZyZWVMaXN0W2tpbGwgPj41XSk7CisgCWtpbGxJdGVtPSYgaW5mb1B0ci0+aXRlbXNba2lsbF07CisJaWYgKGtpbGxJdGVtLT5wc3pUZXh0IT1MUFNUUl9URVhUQ0FMTEJBQ0szMkEpIAorCQlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGtpbGxJdGVtLT5wc3pUZXh0KTsKKwlraWxsPWtpbGxJdGVtLT5zaWJsaW5nOworIH0KKyBpbmZvUHRyLT51TnVtSXRlbXMgLT0gcGFyZW50SXRlbS0+Y0NoaWxkcmVuOworIHBhcmVudEl0ZW0tPmZpcnN0Q2hpbGQgPSAwOworIHBhcmVudEl0ZW0tPmNDaGlsZHJlbiA9IDA7Cit9CisKKworCitzdGF0aWMgdm9pZCBUUkVFVklFV19SZW1vdmVUcmVlIChUUkVFVklFV19JTkZPICppbmZvUHRyKQorCQkJCQkgICAKKworeworIFRSRUVWSUVXX0lURU0gKmtpbGxJdGVtOworIGludCBpOworCisJLyogYnVtbWVyOiBpZiB3ZSBkaWRuJ3QgZGVsZXRlIGFueXRoaW5nLCB0ZXN0X2JpdCBpcyBvdmVyaGVhZCAqLworIAorICAgIGZvciAoaT0xOyBpPD1pbmZvUHRyLT51TWF4SGFuZGxlOyBpKyspIAorCWlmICghdGVzdF9iaXQgKGksIGluZm9QdHItPmZyZWVMaXN0KSkgeworCQlraWxsSXRlbT0mIGluZm9QdHItPml0ZW1zIFtpXTsJCisJCWlmIChraWxsSXRlbS0+cHN6VGV4dCE9TFBTVFJfVEVYVENBTExCQUNLMzJBKQorCQkJSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBraWxsSXRlbS0+cHN6VGV4dCk7CisJfSAKKworICAgIGlmIChpbmZvUHRyLT51TnVtUHRyc0FsbG9jZWQpIHsKKyAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT5pdGVtcyk7CisgICAgICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+ZnJlZUxpc3QpOworICAgICAgICBpbmZvUHRyLT51TnVtSXRlbXM9MDsKKyAgICAgICAgaW5mb1B0ci0+dU51bVB0cnNBbGxvY2VkPTA7CisgICAgICAgIGluZm9QdHItPnVNYXhIYW5kbGU9MDsKKyAgICB9ICAgCisKKwkvKiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVtb3ZlIGluZm9QdHIgaXRzZWxmICovCit9CisKKworCisKKworCisKKworCisKIHN0YXRpYyBMUkVTVUxUCiBUUkVFVklFV19HZXRJbWFnZUxpc3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKIAotICAgIHN3aXRjaCAoKElOVDMyKXdQYXJhbSkgewotCWNhc2UgVFZTSUxfTk9STUFMOgotCSAgICByZXR1cm4gKExSRVNVTFQpaW5mb1B0ci0+aGltbE5vcm1hbDsKKyAgVFJBQ0UgKHRyZWV2aWV3LCJcbiIpOwogCi0JY2FzZSBUVlNJTF9TVEFURToKLQkgICAgcmV0dXJuIChMUkVTVUxUKWluZm9QdHItPmhpbWxTdGF0ZTsKLSAgICB9CisgIGlmIChpbmZvUHRyPT1OVUxMKSByZXR1cm4gMDsKIAotICAgIHJldHVybiAoTFJFU1VMVClOVUxMOworICBpZiAoKElOVDMyKXdQYXJhbSA9PSBUVlNJTF9OT1JNQUwpIAorCXJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+aGltbE5vcm1hbDsKKyAgaWYgKChJTlQzMil3UGFyYW0gPT0gVFZTSUxfU1RBVEUpIAorCXJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+aGltbFN0YXRlOworCisgIHJldHVybiAwOwogfQogCiAKQEAgLTY4LDUxICsyNzksODYyIEBACiAKIAogc3RhdGljIExSRVNVTFQKLVRSRUVWSUVXX0NyZWF0ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1RSRUVWSUVXX1NldEl0ZW1IZWlnaHQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCiB7Ci0gICAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0cjsKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgSU5UMzIgcHJldkhlaWdodD1pbmZvUHRyLT51SXRlbUhlaWdodDsKKyAgSERDMzIgaGRjOworICBURVhUTUVUUklDMzJBIHRtOwogCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBpbmZvIHN0cnVjdHVyZSAqLwotICAgIGluZm9QdHIgPSAoVFJFRVZJRVdfSU5GTyAqKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUUkVFVklFV19JTkZPKSk7Ci0gICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpaW5mb1B0cjsKIAotICAgIGlmIChpbmZvUHRyID09IE5VTEwpIHsKLQlFUlIgKHRyZWV2aWV3LCAiY291bGQgbm90IGFsbG9jYXRlIGluZm8gbWVtb3J5IVxuIik7Ci0JcmV0dXJuIDA7CisgIGlmICh3UGFyYW09PS0xKSB7CisJaGRjPUdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCWluZm9QdHItPnVJdGVtSGVpZ2h0PS0xOworCUdldFRleHRNZXRyaWNzMzJBIChoZGMsICZ0bSk7CisgICAgaW5mb1B0ci0+dVJlYWxJdGVtSGVpZ2h0PSB0bS50bUhlaWdodCArIHRtLnRtRXh0ZXJuYWxMZWFkaW5nOworCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCXJldHVybiBwcmV2SGVpZ2h0OworICB9CisKKwkvKiBGSVhNRTogY2hlY2sgd1BhcmFtID4gaW1hZ2VsaXN0IGhlaWdodCAqLworCisgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFRWU19OT05FVkVOSEVJR0hUKSkKKwlpbmZvUHRyLT51SXRlbUhlaWdodCA9IChJTlQzMikgd1BhcmFtICYgMHhmZmZmZmZmZTsKKyAgcmV0dXJuIHByZXZIZWlnaHQ7Cit9CisKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19HZXRJdGVtSGVpZ2h0IChXTkQgKnduZFB0cikKK3sKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgCisgIHJldHVybiBpbmZvUHRyLT51SXRlbUhlaWdodDsKK30KKyAgCitzdGF0aWMgTFJFU1VMVAorVFJFRVZJRVdfU2V0VGV4dENvbG9yIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICBDT0xPUlJFRiBwcmV2Q29sb3I9aW5mb1B0ci0+Y2xyVGV4dDsKKworICBpbmZvUHRyLT5jbHJUZXh0PShDT0xPUlJFRikgbFBhcmFtOworICByZXR1cm4gKExSRVNVTFQpIHByZXZDb2xvcjsKK30KKworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX0dldFRleHRDb2xvciAoV05EICp3bmRQdHIpCit7CisgIFRSRUVWSUVXX0lORk8gKmluZm9QdHIgPSBUUkVFVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisJCisgIHJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+Y2xyVGV4dDsKK30KKworCitzdGF0aWMgSU5UMzIKK1RSRUVWSUVXX0RyYXdJdGVtIChXTkQgKnduZFB0ciwgSERDMzIgaGRjLCBUUkVFVklFV19JVEVNICp3aW5lSXRlbSwgCisJCSAgIFRSRUVWSUVXX0lURU0gKnVwcGVySXRlbSwgaW50IGluZGVudCkKK3sKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgSU5UMzIgIG9sZEJrTW9kZSxjZW50ZXIseHBvczsKKyAgQ09MT1JSRUYgb2xkQmtDb2xvcjsKKyAgVUlOVDMyIHVUZXh0SnVzdGlmeSA9IERUX0xFRlQ7CisgIEhQRU4zMiBoT2xkUGVuLCBobmV3UGVuLGhSb290UGVuOworICBSRUNUMzIgcix1cHBlcjsKKyAgCisgIGhuZXdQZW4gPSBDcmVhdGVQZW4zMihQU19ET1QsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XVEVYVCkgKTsKKyAgaE9sZFBlbiA9IFNlbGVjdE9iamVjdDMyKCBoZGMsIGhuZXdQZW4gKTsKKyAKKyAgcj13aW5lSXRlbS0+cmVjdDsKKyAgaWYgKHVwcGVySXRlbSkgCisJdXBwZXI9dXBwZXJJdGVtLT5yZWN0OworICBlbHNlIHsKKwl1cHBlci50b3A9MDsKKwl1cHBlci5sZWZ0PTg7CisgIH0KKyAgY2VudGVyPShyLnRvcCtyLmJvdHRvbSkvMjsKKyAgeHBvcz1yLmxlZnQrODsKKworICBpZiAod25kUHRyLT5kd1N0eWxlICYgVFZTX0hBU0xJTkVTKSB7CisJUE9JTlQzMiBwb2ludHNbM107CisJaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBUVlNfTElORVNBVFJPT1QpICYmIChpbmRlbnQ9PTApKSB7CisJCXBvaW50c1swXS55PXBvaW50c1sxXS55PWNlbnRlcjsKKwkJcG9pbnRzWzJdLnk9dXBwZXIudG9wOworCQlwb2ludHNbMV0ueD1wb2ludHNbMl0ueD11cHBlci5sZWZ0OworCQlwb2ludHNbMF0ueD11cHBlci5sZWZ0KzEyOworCQlwb2ludHNbMl0ueSs9NTsKKworIAkJUG9seWxpbmUzMiAoaGRjLHBvaW50cywzKTsKKwl9CisJZWxzZSB7CisJCXBvaW50c1swXS55PXBvaW50c1sxXS55PWNlbnRlcjsKKyAgICAgICAgICAgICAgICBwb2ludHNbMl0ueT11cHBlci50b3A7CisgICAgICAgICAgICAgICAgcG9pbnRzWzFdLng9cG9pbnRzWzJdLng9dXBwZXIubGVmdCsxMzsKKyAgICAgICAgICAgICAgICBwb2ludHNbMF0ueD11cHBlci5sZWZ0KzI1OworICAgICAgICAgICAgICAgIHBvaW50c1syXS55Kz01OworIAkJUG9seWxpbmUzMiAoaGRjLHBvaW50cywzKTsKKwl9CisgfQorCisgIERlbGV0ZU9iamVjdDMyKGhuZXdQZW4pOworICBTZWxlY3RPYmplY3QzMihoZGMsIGhPbGRQZW4pOworCisgIGlmICgod25kUHRyLT5kd1N0eWxlICYgVFZTX0hBU0JVVFRPTlMpICYmICh3aW5lSXRlbS0+Y0NoaWxkcmVuKSkgeworLyoKKyAgCWhSb290UGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XKSApOworICAJU2VsZWN0T2JqZWN0MzIoIGhkYywgaFJvb3RQZW4gKTsKKyovCisKKwlSZWN0YW5nbGUzMiAoaGRjLCB4cG9zLTQsIGNlbnRlci00LCB4cG9zKzUsIGNlbnRlcis1KTsKKwlNb3ZlVG9FeDMyIChoZGMsIHhwb3MtMiwgY2VudGVyLCBOVUxMKTsKKwlMaW5lVG8zMiAgIChoZGMsIHhwb3MrMywgY2VudGVyKTsKKwlpZiAoISh3aW5lSXRlbS0+c3RhdGUgJiBUVklTX0VYUEFOREVEKSkgeworCQlNb3ZlVG9FeDMyIChoZGMsIHhwb3MsICAgY2VudGVyLTIsIE5VTEwpOworCQlMaW5lVG8zMiAgIChoZGMsIHhwb3MsICAgY2VudGVyKzMpOworCX0KKyAvKiAJRGVsZXRlT2JqZWN0MzIoaFJvb3RQZW4pOyAqLworICAgICAgICB9CisKKworICB4cG9zKz0xMzsKKworICBpZiAod2luZUl0ZW0tPm1hc2sgJiBUVklGX0lNQUdFKSB7CisJaWYgKHdpbmVJdGVtLT5pSW1hZ2UhPUlfSU1BR0VDQUxMQkFDSykgeworICAJCWlmIChpbmZvUHRyLT5oaW1sTm9ybWFsKSB7CisgIAkJCUltYWdlTGlzdF9EcmF3IChpbmZvUHRyLT5oaW1sTm9ybWFsLHdpbmVJdGVtLT5pSW1hZ2UsIGhkYywKKyAgICAgICAgICAgICAgICAgICAgICAJCQl4cG9zLTIsIHIudG9wKzEsIElMRF9OT1JNQUwpOworICAJCQl4cG9zKz0xNTsKKwkJfQorCX0KKyAgfQorCisgIHIubGVmdD14cG9zOworICBpZiAoKHdpbmVJdGVtLT5tYXNrICYgVFZJRl9URVhUKSAmJiAod2luZUl0ZW0tPnBzelRleHQpKSB7CisJICAgIGlmICh3aW5lSXRlbS0+c3RhdGUgJiBUVklTX1NFTEVDVEVEKSB7CisgICAgICAgICAgICAJb2xkQmtNb2RlID0gU2V0QmtNb2RlMzIoaGRjLCBPUEFRVUUpOworCQlvbGRCa0NvbG9yPSBTZXRCa0NvbG9yMzIgKGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfSElHSExJR0hUKSk7CisJCVNldFRleHRDb2xvcjMyIChoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUVEVYVCkpOworCSAgICB9CisJICAgIGVsc2UgeworICAgICAgICAgICAgCW9sZEJrTW9kZSA9IFNldEJrTW9kZTMyKGhkYywgVFJBTlNQQVJFTlQpOworCSAgICB9CisgICAgICAgICAgICByLmxlZnQgKz0gMzsKKyAgICAgICAgICAgIHIucmlnaHQgLT0gMzsKKwkJCWlmIChpbmZvUHRyLT5jbHJUZXh0PT0tMSkKKyAgICAgICAgICAgIAlTZXRUZXh0Q29sb3IzMiAoaGRjLCBDT0xPUl9CVE5URVhUKTsKKwkJCWVsc2UgCisJCQkJU2V0VGV4dENvbG9yMzIgKGhkYywgaW5mb1B0ci0+Y2xyVGV4dCk7ICAvKiBGSVhNRTogcmV0dmFsICovCisgICAgICAgICAgICBEcmF3VGV4dDMyQShoZGMsIHdpbmVJdGVtLT5wc3pUZXh0LCBsc3RybGVuMzJBKHdpbmVJdGVtLT5wc3pUZXh0KSwKKyAgICAgICAgICAgICAgICAgICZyLCB1VGV4dEp1c3RpZnl8RFRfVkNFTlRFUnxEVF9TSU5HTEVMSU5FKTsKKyAgICAgICAgICAgIGlmIChvbGRCa01vZGUgIT0gVFJBTlNQQVJFTlQpCisgICAgICAgICAgICAgICAgU2V0QmtNb2RlMzIoaGRjLCBvbGRCa01vZGUpOworCSAgICBpZiAod2luZUl0ZW0tPnN0YXRlICYgVFZJU19TRUxFQ1RFRCkKKwkJU2V0QmtDb2xvcjMyIChoZGMsIG9sZEJrQ29sb3IpOworICAgICAgICB9CisKKyByZXR1cm4gd2luZUl0ZW0tPnJlY3QucmlnaHQ7Cit9CisKKworCisKKworCisKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19HZXRJdGVtUmVjdCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgVFJFRVZJRVdfSVRFTSAqd2luZUl0ZW07CisgIElOVDMyIGlJdGVtOworICBMUFJFQ1QzMiBscFJlY3Q7CisKKyAgVFJBQ0UgKHRyZWV2aWV3LCJcbiIpOworICBpZiAoaW5mb1B0cj09TlVMTCkgcmV0dXJuIEZBTFNFOworICAKKyAgaUl0ZW0gPSAoSU5UMzIpbFBhcmFtOworICB3aW5lSXRlbSA9IFRSRUVWSUVXX1ZhbGlkSXRlbSAoaW5mb1B0ciwgaUl0ZW0pOworICBpZiAoIXdpbmVJdGVtKSByZXR1cm4gRkFMU0U7CisKKyAgd2luZUl0ZW09JiBpbmZvUHRyLT5pdGVtc1sgaUl0ZW0gXTsKKyAgaWYgKCF3aW5lSXRlbS0+dmlzaWJsZSkgcmV0dXJuIEZBTFNFOworCisgIGxwUmVjdCA9IChMUFJFQ1QzMilsUGFyYW07CisgIGlmIChscFJlY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCQorICBpZiAoKElOVDMyKSB3UGFyYW0pIHsKKyAgCWxwUmVjdC0+bGVmdAk9IHdpbmVJdGVtLT50ZXh0LmxlZnQ7CisJbHBSZWN0LT5yaWdodAk9IHdpbmVJdGVtLT50ZXh0LnJpZ2h0OworCWxwUmVjdC0+Ym90dG9tCT0gd2luZUl0ZW0tPnRleHQuYm90dG9tOworCWxwUmVjdC0+dG9wCT0gd2luZUl0ZW0tPnRleHQudG9wOworICB9IGVsc2UgeworCWxwUmVjdC0+bGVmdCAJPSB3aW5lSXRlbS0+cmVjdC5sZWZ0OworCWxwUmVjdC0+cmlnaHQJPSB3aW5lSXRlbS0+cmVjdC5yaWdodDsKKwlscFJlY3QtPmJvdHRvbSAgPSB3aW5lSXRlbS0+cmVjdC5ib3R0b207CisJbHBSZWN0LT50b3AJPSB3aW5lSXRlbS0+cmVjdC50b3A7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19HZXRWaXNpYmxlQ291bnQgKFdORCAqd25kUHRyLCAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorCit7CisgIFRSRUVWSUVXX0lORk8gKmluZm9QdHIgPSBUUkVFVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgVFJBQ0UgKHRyZWV2aWV3LCJcbiIpOworCisgIHJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+dVZpc2libGVIZWlnaHQgLyBpbmZvUHRyLT51UmVhbEl0ZW1IZWlnaHQ7Cit9CisKKworCitzdGF0aWMgTFJFU1VMVAorVFJFRVZJRVdfU2V0SXRlbSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgVFJFRVZJRVdfSVRFTSAqd2luZUl0ZW07CisgIFRWX0lURU0gKnR2SXRlbTsKKyAgSU5UMzIgaUl0ZW0sbGVuOworCisgIFRSQUNFICh0cmVldmlldywiXG4iKTsKKyAgdHZJdGVtPShMUFRWSVRFTSkgbFBhcmFtOworICBpSXRlbT10dkl0ZW0tPmhJdGVtOworCisgIHdpbmVJdGVtID0gVFJFRVZJRVdfVmFsaWRJdGVtIChpbmZvUHRyLCBpSXRlbSk7CisgIGlmICghd2luZUl0ZW0pIHJldHVybiBGQUxTRTsKKworICBpZiAodHZJdGVtLT5tYXNrICYgVFZJRl9DSElMRFJFTikgeworICAgICAgICB3aW5lSXRlbS0+Y0NoaWxkcmVuPXR2SXRlbS0+Y0NoaWxkcmVuOworICB9CisKKyAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfSU1BR0UpIHsKKyAgICAgICB3aW5lSXRlbS0+aUltYWdlPXR2SXRlbS0+aUltYWdlOworICB9CisKKyAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfSU5URUdSQUwpIHsKKy8qICAgICAgICB3aW5lSXRlbS0+aUludGVncmFsPXR2SXRlbS0+aUludGVncmFsOyAqLworICB9CisKKyAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfUEFSQU0pIHsKKyAgICAgICAgd2luZUl0ZW0tPmxQYXJhbT10dkl0ZW0tPmxQYXJhbTsKKyAgfQorCisgIGlmICh0dkl0ZW0tPm1hc2sgJiBUVklGX1NFTEVDVEVESU1BR0UpIHsKKyAgICAgICAgd2luZUl0ZW0tPmlTZWxlY3RlZEltYWdlPXR2SXRlbS0+aVNlbGVjdGVkSW1hZ2U7CisgIH0KKworICBpZiAodHZJdGVtLT5tYXNrICYgVFZJRl9TVEFURSkgeworICAgICAgICB3aW5lSXRlbS0+c3RhdGU9dHZJdGVtLT5zdGF0ZSAmIHR2SXRlbS0+c3RhdGVNYXNrOworICB9CisKKyAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfVEVYVCkgeworICAgICAgICBsZW49dHZJdGVtLT5jY2hUZXh0TWF4OworICAgICAgICBpZiAobGVuPndpbmVJdGVtLT5jY2hUZXh0TWF4KSB7CisJCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgd2luZUl0ZW0tPnBzelRleHQpOworICAgICAgICAgICAgICAgIHdpbmVJdGVtLT5wc3pUZXh0PSBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCAKKwkJCQlIRUFQX1pFUk9fTUVNT1JZLCBsZW4rMSk7CisJfQorICAgICAgICBsc3RyY3B5bjMyQSAod2luZUl0ZW0tPnBzelRleHQsIHR2SXRlbS0+cHN6VGV4dCxsZW4pOworICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKworCisKK3N0YXRpYyB2b2lkCitUUkVFVklFV19SZWZyZXNoIChXTkQgKnduZFB0ciwgSERDMzIgaGRjKQorCit7CisgICAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBIRk9OVDMyIGhGb250LCBoT2xkRm9udDsKKyAgICBSRUNUMzIgcmVjdDsKKyAgICBIQlJVU0gzMiBoYnJCazsKKyAgICBJTlQzMiBpSXRlbSwgaW5kZW50LCB4LCB5LCBoZWlnaHQ7CisgICAgSU5UMzIgdmlld3RvcCx2aWV3Ym90dG9tLHZpZXdsZWZ0LHZpZXdyaWdodDsKKyAgICBUUkVFVklFV19JVEVNICp3aW5lSXRlbSwgKnByZXZJdGVtOworCisgICAgVFJBQ0UgKHRyZWV2aWV3LCJcbiIpOworCisgICAgaWYgKFRSRUVWSUVXX1RpbWVyICYgVFZfUkVGUkVTSF9USU1FUl9TRVQpIHsKKwkJS2lsbFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIFRWX1JFRlJFU0hfVElNRVIpOworCQlUUkVFVklFV19UaW1lciAmPSB+VFZfUkVGUkVTSF9USU1FUl9TRVQ7CiAgICAgfQogCi0gICAgaWYgKChUUkVFVklFV19JTkZPKil3bmRQdHItPndFeHRyYVswXSAhPSBpbmZvUHRyKSB7Ci0JRVJSICh0cmVldmlldywgInBvaW50ZXIgYXNzaWdubWVudCBlcnJvciFcbiIpOwotCXJldHVybiAwOwotICAgIH0KKyAgICAKKyAgICBHZXRDbGllbnRSZWN0MzIgKHduZFB0ci0+aHduZFNlbGYsICZyZWN0KTsKKyAgICBpZiAoKHJlY3QubGVmdC1yZWN0LnJpZ2h0ID09MCkgfHwgKHJlY3QudG9wLXJlY3QuYm90dG9tPT0wKSkgcmV0dXJuOworICAgIHZpZXd0b3A9aW5mb1B0ci0+Y3k7CisgICAgdmlld2JvdHRvbT1pbmZvUHRyLT5jeSArIHJlY3QuYm90dG9tLXJlY3QudG9wOworICAgIHZpZXdsZWZ0PWluZm9QdHItPmN4OworICAgIHZpZXdyaWdodD1pbmZvUHRyLT5jeCArIHJlY3QucmlnaHQtcmVjdC5sZWZ0OwogCi0gICAgLyogc2V0IGRlZmF1bHQgc2V0dGluZ3MgKi8KLSAgICBpbmZvUHRyLT5jbHJCayA9IEdldFN5c0NvbG9yMzIgKENPTE9SX1dJTkRPVyk7Ci0gICAgaW5mb1B0ci0+Y2xyVGV4dCA9IEdldFN5c0NvbG9yMzIgKENPTE9SX0JUTlRFWFQpOwotICAgIGluZm9QdHItPmhpbWxOb3JtYWwgPSBOVUxMOwotICAgIGluZm9QdHItPmhpbWxTdGF0ZSA9IE5VTEw7CisJaW5mb1B0ci0+dVZpc2libGVIZWlnaHQ9dmlld2JvdHRvbSAtIHZpZXd0b3A7CisKKyAgICBoRm9udCA9IGluZm9QdHItPmhGb250ID8gaW5mb1B0ci0+aEZvbnQgOiBHZXRTdG9ja09iamVjdDMyIChERUZBVUxUX0dVSV9GT05UKTsKKyAgICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyIChoZGMsIGhGb250KTsKKworICAgIC8qIGRyYXcgYmFja2dyb3VuZCAqLworICAgIGhickJrID0gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1dJTkRPVyk7CisgICAgRmlsbFJlY3QzMihoZGMsICZyZWN0LCBoYnJCayk7CiAKIAotICAgIHJldHVybiAwOworICAgIGlJdGVtPWluZm9QdHItPlRvcFJvb3RJdGVtOworICAgIGluZm9QdHItPmZpcnN0VmlzaWJsZT0wOworICAgIHdpbmVJdGVtPU5VTEw7CisgICAgaW5kZW50PTA7CisgICAgeD15PTA7CisgICAgVFJBQ0UgKHRyZWV2aWV3LCAiWyVkICVkICVkICVkXVxuIix2aWV3dG9wLHZpZXdib3R0b20sdmlld2xlZnQsdmlld3JpZ2h0KTsKKworICAgIHdoaWxlIChpSXRlbSkgeworCQlwcmV2SXRlbT13aW5lSXRlbTsKKyAgICAgICAgd2luZUl0ZW09ICYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dOworCisJCVRSQUNFICh0cmVldmlldywgIiVkICVkIFslZCAlZCAlZCAlZF0gKCVzKVxuIix5LHgsCisJCQl3aW5lSXRlbS0+cmVjdC50b3AsIHdpbmVJdGVtLT5yZWN0LmJvdHRvbSwKKwkJCXdpbmVJdGVtLT5yZWN0LmxlZnQsIHdpbmVJdGVtLT5yZWN0LnJpZ2h0LAorCQkJd2luZUl0ZW0tPnBzelRleHQpOworCisJCWhlaWdodD1pbmZvUHRyLT51UmVhbEl0ZW1IZWlnaHQgKiB3aW5lSXRlbS0+aUludGVncmFsOworCQlpZiAoKHkgPj0gdmlld3RvcCkgJiYgKHkgPD0gdmlld2JvdHRvbSkgJiYKKwkgICAgCSh4ID49IHZpZXdsZWZ0ICApICYmICh4IDw9IHZpZXdyaWdodCkpIHsKKyAgICAgICAgCQl3aW5lSXRlbS0+cmVjdC50b3AgPSB5IC0gaW5mb1B0ci0+Y3kgKyByZWN0LnRvcDsKKyAgICAgICAgCQl3aW5lSXRlbS0+cmVjdC5ib3R0b20gPSB3aW5lSXRlbS0+cmVjdC50b3AgKyBoZWlnaHQgOworICAgICAgICAgCQl3aW5lSXRlbS0+cmVjdC5sZWZ0ID0geCAtIGluZm9QdHItPmN4ICsgcmVjdC5sZWZ0OworICAgICAgICAJCXdpbmVJdGVtLT5yZWN0LnJpZ2h0ID0gcmVjdC5yaWdodDsKKwkJCWlmICghaW5mb1B0ci0+Zmlyc3RWaXNpYmxlKQorCQkJCWluZm9QdHItPmZpcnN0VmlzaWJsZT13aW5lSXRlbS0+aEl0ZW07CisgICAgICAgIAkJVFJFRVZJRVdfRHJhd0l0ZW0gKHduZFB0ciwgaGRjLCB3aW5lSXRlbSwgcHJldkl0ZW0sIGluZGVudCk7CisJCX0KKwkJZWxzZSB7CisJCQl3aW5lSXRlbS0+cmVjdC50b3AgID0gd2luZUl0ZW0tPnJlY3QuYm90dG9tID0gLTE7CisJCQl3aW5lSXRlbS0+cmVjdC5sZWZ0ID0gd2luZUl0ZW0tPnJlY3QucmlnaHQgPSAtMTsKKyAJCX0KKworCQkvKiBsb29rIHVwIG5leHQgaXRlbSAqLworCQorCQlpZiAoKHdpbmVJdGVtLT5maXJzdENoaWxkKSAmJiAod2luZUl0ZW0tPnN0YXRlICYgVFZJU19FWFBBTkRFRCkpIHsKKwkJCWlJdGVtPXdpbmVJdGVtLT5maXJzdENoaWxkOworCQkJaW5kZW50Kys7CisJCQl4Kz1pbmZvUHRyLT51SW5kZW50OworCQl9CisJCWVsc2UgeworCQkJaUl0ZW09d2luZUl0ZW0tPnNpYmxpbmc7CisJCQl3aGlsZSAoKCFpSXRlbSkgJiYgKGluZGVudD4wKSkgeworCQkJCWluZGVudC0tOworCQkJCXgtPWluZm9QdHItPnVJbmRlbnQ7CisJCQkJcHJldkl0ZW09d2luZUl0ZW07CisJCQkJd2luZUl0ZW09JmluZm9QdHItPml0ZW1zW3dpbmVJdGVtLT5wYXJlbnRdOworCQkJCWlJdGVtPXdpbmVJdGVtLT5zaWJsaW5nOworCQkJfQorCQl9CisgICAgICAgIHkgKz1oZWlnaHQ7CisgICAgfQkJCQkvKiB3aGlsZSAqLworCisgICAgaW5mb1B0ci0+dVRvdGFsSGVpZ2h0PXk7CisgICAgaWYgKHkgPj0gKHZpZXdib3R0b20tdmlld3RvcCkpIHsKKyAJCWlmICghKGluZm9QdHItPnVJbnRlcm5hbFN0YXR1cyAmIFRWX1ZTQ1JPTEwpKQorCQkJU2hvd1Njcm9sbEJhcjMyICh3bmRQdHItPmh3bmRTZWxmLCBTQl9WRVJULCBUUlVFKTsKKwkJaW5mb1B0ci0+dUludGVybmFsU3RhdHVzIHw9VFZfVlNDUk9MTDsKKyAJCVNldFNjcm9sbFJhbmdlMzIgKHduZFB0ci0+aHduZFNlbGYsIFNCX1ZFUlQsIDAsIAorCQkJCQl5IC0gaW5mb1B0ci0+dVZpc2libGVIZWlnaHQsIEZBTFNFKTsKKwkJU2V0U2Nyb2xsUG9zMzIgKHduZFB0ci0+aHduZFNlbGYsIFNCX1ZFUlQsIGluZm9QdHItPmN5LCBUUlVFKTsKKwl9CisgICAgZWxzZSB7CisJCWlmIChpbmZvUHRyLT51SW50ZXJuYWxTdGF0dXMgJiBUVl9WU0NST0xMKSAKKwkJCVNob3dTY3JvbGxCYXIzMiAod25kUHRyLT5od25kU2VsZiwgU0JfVkVSVCwgRkFMU0UpOworCQlpbmZvUHRyLT51SW50ZXJuYWxTdGF0dXMgJj0gflRWX1ZTQ1JPTEw7CisJfQorCisKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkRm9udCk7Cit9CisKKworc3RhdGljIExSRVNVTFQgCitUUkVFVklFV19IYW5kbGVUaW1lciAoIFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgIFRSRUVWSUVXX0lORk8gKmluZm9QdHIgPSBUUkVFVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgIEhEQzMyIGhkYzsKKworICBpZiAoIWluZm9QdHIpIHJldHVybiBGQUxTRTsKKyAKKyAgVFJBQ0UgKHRyZWV2aWV3LCAidGltZXJcbiIpOworCisgIHN3aXRjaCAod1BhcmFtKSB7CisJY2FzZSBUVl9SRUZSRVNIX1RJTUVSOgorCQlLaWxsVGltZXIzMiAod25kUHRyLT5od25kU2VsZiwgVFZfUkVGUkVTSF9USU1FUik7CisJCVRSRUVWSUVXX1RpbWVyICY9IH5UVl9SRUZSRVNIX1RJTUVSX1NFVDsKKwkJaGRjPUdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCQlUUkVFVklFV19SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisJCVJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCQlyZXR1cm4gMDsKKwljYXNlIFRWX0VESVRfVElNRVI6CisJCUtpbGxUaW1lcjMyICh3bmRQdHItPmh3bmRTZWxmLCBUVl9FRElUX1RJTUVSKTsKKwkJVFJFRVZJRVdfVGltZXIgJj0gflRWX0VESVRfVElNRVJfU0VUOworCQlyZXR1cm4gMDsKKyB9CisJCQorIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkCitUUkVFVklFV19RdWV1ZVJlZnJlc2ggKFdORCAqd25kUHRyKQorCit7CisgCisgVFJBQ0UgKHRyZWV2aWV3LCJxdWV1ZWRcbiIpOworIGlmIChUUkVFVklFV19UaW1lciAmIFRWX1JFRlJFU0hfVElNRVJfU0VUKSB7CisJS2lsbFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIFRWX1JFRlJFU0hfVElNRVIpOworIH0KKworIFNldFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIFRWX1JFRlJFU0hfVElNRVIsIFRWX1JFRlJFU0hfREVMQVksIDApOworIFRSRUVWSUVXX1RpbWVyfD1UVl9SRUZSRVNIX1RJTUVSX1NFVDsKK30KKworCisKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19HZXRJdGVtIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICBMUFRWSVRFTSAgICAgIHR2SXRlbTsKKyAgVFJFRVZJRVdfSVRFTSAqd2luZUl0ZW07CisgIElOVDMyICAgICAgICAgaUl0ZW0sbGVuOworCisgIFRSQUNFICh0cmVldmlldywiXG4iKTsKKyAgdHZJdGVtPShMUFRWSVRFTSkgbFBhcmFtOworICBpSXRlbT10dkl0ZW0tPmhJdGVtOworCisgIHdpbmVJdGVtID0gVFJFRVZJRVdfVmFsaWRJdGVtIChpbmZvUHRyLCBpSXRlbSk7CisgIGlmICghd2luZUl0ZW0pIHJldHVybiBGQUxTRTsKKworCisgICBpZiAodHZJdGVtLT5tYXNrICYgVFZJRl9DSElMRFJFTikgeworICAgICAgICB0dkl0ZW0tPmNDaGlsZHJlbj13aW5lSXRlbS0+Y0NoaWxkcmVuOworICAgfQorCisgICBpZiAodHZJdGVtLT5tYXNrICYgVFZJRl9IQU5ETEUpIHsKKyAgICAgICAgdHZJdGVtLT5oSXRlbT13aW5lSXRlbS0+aEl0ZW07CisgICB9CisKKyAgIGlmICh0dkl0ZW0tPm1hc2sgJiBUVklGX0lNQUdFKSB7CisgICAgICAgIHR2SXRlbS0+aUltYWdlPXdpbmVJdGVtLT5pSW1hZ2U7CisgICB9CisKKyAgIGlmICh0dkl0ZW0tPm1hc2sgJiBUVklGX0lOVEVHUkFMKSB7CisvKiAgICAgICAgdHZJdGVtLT5pSW50ZWdyYWw9d2luZUl0ZW0tPmlJbnRlZ3JhbDsgKi8KKyAgIH0KKworICAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfUEFSQU0pIHsKKyAgICAgICAgdHZJdGVtLT5sUGFyYW09d2luZUl0ZW0tPmxQYXJhbTsKKyAgIH0KKworICAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfU0VMRUNURURJTUFHRSkgeworICAgICAgICB0dkl0ZW0tPmlTZWxlY3RlZEltYWdlPXdpbmVJdGVtLT5pU2VsZWN0ZWRJbWFnZTsKKyAgIH0KKworICAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfU1RBVEUpIHsKKyAgICAgICAgdHZJdGVtLT5zdGF0ZT13aW5lSXRlbS0+c3RhdGUgJiB0dkl0ZW0tPnN0YXRlTWFzazsKKyAgIH0KKworICAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfVEVYVCkgeworCWxlbj13aW5lSXRlbS0+Y2NoVGV4dE1heDsKKwlpZiAod2luZUl0ZW0tPmNjaFRleHRNYXg+dHZJdGVtLT5jY2hUZXh0TWF4KSAKKwkJbGVuPXR2SXRlbS0+Y2NoVGV4dE1heC0xOworICAgICAgICBsc3RyY3B5bjMyQSAodHZJdGVtLT5wc3pUZXh0LCB0dkl0ZW0tPnBzelRleHQsbGVuKTsKKyAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19HZXROZXh0SXRlbTMyIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorCit7CisgIFRSRUVWSUVXX0lORk8gKmluZm9QdHIgPSBUUkVFVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgIFRSRUVWSUVXX0lURU0gKndpbmVJdGVtOworICBJTlQzMiBpSXRlbSwgZmxhZzsKKworCisgIFRSQUNFICh0cmVldmlldywiaXRlbTolbHUsIGZsYWdzOiV4XG4iLCBsUGFyYW0sIHdQYXJhbSk7CisgIGlmICghaW5mb1B0cikgcmV0dXJuIEZBTFNFOworCisgIGZsYWc9IChJTlQzMikgd1BhcmFtOworICBzd2l0Y2ggKGZsYWcpIHsKKwljYXNlIFRWR05fUk9PVDogCXJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+VG9wUm9vdEl0ZW07CisJY2FzZSBUVkdOX0NBUkVUOiAJcmV0dXJuIChMUkVTVUxUKSBpbmZvUHRyLT5zZWxlY3RlZEl0ZW07CisJY2FzZSBUVkdOX0ZJUlNUVklTSUJMRTogcmV0dXJuIChMUkVTVUxUKSBpbmZvUHRyLT5maXJzdFZpc2libGU7CisJY2FzZSBUVkdOX0RST1BISUxJVEU6CXJldHVybiAoTFJFU1VMVCkgaW5mb1B0ci0+ZHJvcEl0ZW07CisJfQorCQorICBpSXRlbT0gKElOVDMyKSBsUGFyYW07CisgIHdpbmVJdGVtID0gVFJFRVZJRVdfVmFsaWRJdGVtIChpbmZvUHRyLCBpSXRlbSk7CisgIGlmICghd2luZUl0ZW0pIHJldHVybiBGQUxTRTsKKworICBzd2l0Y2ggKGZsYWcpCXsKKwljYXNlIFRWR05fTkVYVDogCXJldHVybiAoTFJFU1VMVCkgd2luZUl0ZW0tPnNpYmxpbmc7CisJY2FzZSBUVkdOX1BSRVZJT1VTOiAJcmV0dXJuIChMUkVTVUxUKSB3aW5lSXRlbS0+dXBzaWJsaW5nOworCWNhc2UgVFZHTl9QQVJFTlQ6IAlyZXR1cm4gKExSRVNVTFQpIHdpbmVJdGVtLT5wYXJlbnQ7CisJY2FzZSBUVkdOX0NISUxEOiAJcmV0dXJuIChMUkVTVUxUKSB3aW5lSXRlbS0+Zmlyc3RDaGlsZDsKKwljYXNlIFRWR05fTEFTVFZJU0lCTEU6ICBGSVhNRSAodHJlZXZpZXcsIlRWR05fTEFTVFZJU0lCTEUgbm90IGltcGxlbWVudGVkXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwljYXNlIFRWR05fTkVYVFZJU0lCTEU6ICB3aW5lSXRlbT1UUkVFVklFV19HZXROZXh0TGlzdEl0ZW0gCisJCQkJCQkoaW5mb1B0cix3aW5lSXRlbSk7CisJCQkJaWYgKHdpbmVJdGVtKSAKKwkJCQkJcmV0dXJuIChMUkVTVUxUKSB3aW5lSXRlbS0+aEl0ZW07CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gKExSRVNVTFQpIDA7CisJY2FzZSBUVkdOX1BSRVZJT1VTVklTSUJMRTogd2luZUl0ZW09VFJFRVZJRVdfR2V0UHJldkxpc3RJdGVtCisJCQkJCQkoaW5mb1B0ciwgd2luZUl0ZW0pOworCQkJCWlmICh3aW5lSXRlbSkgCisJCQkJCXJldHVybiAoTFJFU1VMVCkgd2luZUl0ZW0tPmhJdGVtOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIChMUkVTVUxUKSAwOworCWRlZmF1bHQ6CUZJWE1FICh0cmVldmlldywiVW5rbm93biBtc2cgJXgsaXRlbSAleFxuIiwgZmxhZyxpSXRlbSk7CisJfQorCisgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIExSRVNVTFQKLVRSRUVWSUVXX0Rlc3Ryb3kgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitUUkVFVklFV19HZXRDb3VudCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworIFRSRUVWSUVXX0lORk8gKmluZm9QdHIgPSBUUkVFVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisKKyByZXR1cm4gKExSRVNVTFQpIGluZm9QdHItPnVOdW1JdGVtczsKK30KIAogCiAKIAotICAgIC8qIGZyZWUgdHJlZSB2aWV3IGluZm8gZGF0YSAqLwotICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0cik7CisvKiB0aGUgbWV0aG9kIHVzZWQgYmVsb3cgaXNuJ3QgdGhlIG1vc3QgbWVtb3J5LWZyaWVuZGx5LCBidXQgaXQgYXZvaWRzIAorICAgYSBsb3Qgb2YgbWVtb3J5IHJlYWxsb2NhdGlvbnMgKi8gCisKKy8qIEJUVzogd2Ugd2FzdGUgaGFuZGxlIDA7IDAgaXMgbm90IGFuIGFsbG93ZWQgaGFuZGxlLiBGaXggdGhpcyBieQorICAgICAgICBkZWNyZWFzaW5nIGluZm9wdHItPml0ZW1zIHdpdGggMSwgYW5kIGluY3JlYXNpbmcgaXQgYnkgMSBpZiAKKyAgICAgICAgaXQgaXMgcmVmZXJlbmNlZCBpbiBtbS1oYW5kbGluZyBzdHVmZj8gKi8KKworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX0luc2VydEl0ZW0zMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCisKK3sKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgVFZJTlNFUlRTVFJVQ1QgICpwdGRpOworICBUVl9JVEVNIAkqdHZJdGVtOworICBUUkVFVklFV19JVEVNICp3aW5lSXRlbSwgKnBhcmVudEl0ZW0sICpwcmV2c2liLCAqc2liSXRlbTsKKyAgSU5UMzIJCWlJdGVtLGxpc3RJdGVtcyxpLGxlbjsKKyAgCisgIFRSQUNFICh0cmVldmlldywiXG4iKTsKKyAgcHRkaSA9IChUVklOU0VSVFNUUlVDVCAqKSBsUGFyYW07CisKKwkvKiBjaGVjayBpZiBtZW1vcnkgaXMgYXZhaWxhYmxlICovCisKKyAgaWYgKGluZm9QdHItPnVOdW1QdHJzQWxsb2NlZD09MCkgeworICAgICAgICBpbmZvUHRyLT5pdGVtcyA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVklURU1fQUxMT0Mqc2l6ZW9mIChUUkVFVklFV19JVEVNKSk7CisgICAgICAgIGluZm9QdHItPmZyZWVMaXN0PSBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDErKFRWSVRFTV9BTExPQz4+NSkpICpzaXplb2YgKElOVDMyKSk7CisgICAgICAgIGluZm9QdHItPnVOdW1QdHJzQWxsb2NlZD1UVklURU1fQUxMT0M7CisJaW5mb1B0ci0+VG9wUm9vdEl0ZW09MTsKKyAgIH0KKworICBpZiAoaW5mb1B0ci0+dU51bUl0ZW1zID09IChpbmZvUHRyLT51TnVtUHRyc0FsbG9jZWQtMSkgKSB7CisgICAJVFJFRVZJRVdfSVRFTSAqb2xkSXRlbXMgPSBpbmZvUHRyLT5pdGVtczsKKwlJTlQzMiAqb2xkZnJlZUxpc3QgPSBpbmZvUHRyLT5mcmVlTGlzdDsKKworCWluZm9QdHItPnVOdW1QdHJzQWxsb2NlZCo9MjsKKyAgICAgICAgaW5mb1B0ci0+aXRlbXMgPSBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1B0ci0+dU51bVB0cnNBbGxvY2VkKnNpemVvZiAoVFJFRVZJRVdfSVRFTSkpOworICAgICAgICBpbmZvUHRyLT5mcmVlTGlzdD0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKyhpbmZvUHRyLT51TnVtUHRyc0FsbG9jZWQ+PjUpKSpzaXplb2YgKElOVDMyKSk7CisKKyAgICAgICAgbWVtY3B5ICgmaW5mb1B0ci0+aXRlbXNbMF0sICZvbGRJdGVtc1swXSwKKyAgICAgICAgICAgICAgICAgICAgaW5mb1B0ci0+dU51bVB0cnNBbGxvY2VkLzIgKiBzaXplb2YoVFJFRVZJRVdfSVRFTSkpOworICAgICAgICBtZW1jcHkgKCZpbmZvUHRyLT5mcmVlTGlzdFswXSwgJm9sZGZyZWVMaXN0WzBdLAorICAgICAgICAgICAgICAgICAgICBpbmZvUHRyLT51TnVtUHRyc0FsbG9jZWQ+PjYgKiBzaXplb2YoSU5UMzIpKTsKKworICAgICAgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBvbGRJdGVtcyk7ICAKKyAgICAgICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgb2xkZnJlZUxpc3QpOyAgCisgICAgfQorCisgIGlJdGVtPTA7CisgIGluZm9QdHItPnVOdW1JdGVtcysrOworCisgIGlmIChpbmZvUHRyLT51TWF4SGFuZGxlPT0oaW5mb1B0ci0+dU51bUl0ZW1zLTEpKSAgeyAKKyAgCWlJdGVtPWluZm9QdHItPnVOdW1JdGVtczsKKyAgCWluZm9QdHItPnVNYXhIYW5kbGUrKzsKKyAgfSAKKyAgZWxzZSB7CQkJCQkgLyogY2hlY2sgZnJlZWxpc3QgKi8KKwlmb3IgKGk9MDsgaTxpbmZvUHRyLT51TnVtUHRyc0FsbG9jZWQ+PjU7IGkrKykgeworCQlpZiAoaW5mb1B0ci0+ZnJlZUxpc3RbaV0pIHsKKwkJCWlJdGVtPWZmcyAoaW5mb1B0ci0+ZnJlZUxpc3RbaV0pOworCQkJY2xlYXJfYml0IChpSXRlbSAmIDMxLCAmIGluZm9QdHItPmZyZWVMaXN0W2ldKTsKKwkJCWJyZWFrOworCQl9CisgIAkgfSAKKyAgfQorICBpZiAoIWlJdGVtKSBFUlIgKHRyZWV2aWV3LCAiQXJnaCAtLSBjYW4ndCBmaW5kIGZyZWUgaXRlbS5cbiIpOworICAKKyAgdHZJdGVtPSAmIHB0ZGktPml0ZW07CisgIHdpbmVJdGVtPSYgaW5mb1B0ci0+aXRlbXNbaUl0ZW1dOworCisKKworICBpZiAoKHB0ZGktPmhQYXJlbnQ9PVRWSV9ST09UKSB8fCAocHRkaS0+aFBhcmVudD09MCkpIHsKKwlwYXJlbnRJdGVtPU5VTEw7CisJd2luZUl0ZW0tPnBhcmVudD0wOyAKKwlzaWJJdGVtPSZpbmZvUHRyLT5pdGVtcyBbaW5mb1B0ci0+VG9wUm9vdEl0ZW1dOworCWxpc3RJdGVtcz1pbmZvUHRyLT51TnVtSXRlbXM7CisgIH0KKyAgZWxzZSAgeworCXBhcmVudEl0ZW09ICZpbmZvUHRyLT5pdGVtc1twdGRpLT5oUGFyZW50XTsKKwlpZiAoIXBhcmVudEl0ZW0tPmZpcnN0Q2hpbGQpIAorCQlwYXJlbnRJdGVtLT5maXJzdENoaWxkPWlJdGVtOworCXdpbmVJdGVtLT5wYXJlbnQ9cHRkaS0+aFBhcmVudDsKKwlzaWJJdGVtPSZpbmZvUHRyLT5pdGVtcyBbcGFyZW50SXRlbS0+Zmlyc3RDaGlsZF07CisJcGFyZW50SXRlbS0+Y0NoaWxkcmVuKys7CisJbGlzdEl0ZW1zPXBhcmVudEl0ZW0tPmNDaGlsZHJlbjsKKyAgfQorCisgIHdpbmVJdGVtLT51cHNpYmxpbmc9MDsgIC8qIG5lZWRlZCBpbiBjYXNlIHdlJ3JlIHRoZSBmaXJzdCBpdGVtIGluIGEgbGlzdCAqLyAKKyAgd2luZUl0ZW0tPnNpYmxpbmc9MDsgICAgIAorICB3aW5lSXRlbS0+Zmlyc3RDaGlsZD0wOworCisgIGlmIChsaXN0SXRlbXM+MSkgeworICAgICBwcmV2c2liPU5VTEw7CisgICAgIHN3aXRjaCAocHRkaS0+aEluc2VydEFmdGVyKSB7CisJCWNhc2UgVFZJX0ZJUlNUOiB3aW5lSXRlbS0+c2libGluZz1pbmZvUHRyLT5Ub3BSb290SXRlbTsKKwkJCWluZm9QdHItPlRvcFJvb3RJdGVtPWlJdGVtOworCQkJYnJlYWs7CisJCWNhc2UgVFZJX0xBU1Q6ICAKKwkJCXdoaWxlIChzaWJJdGVtLT5zaWJsaW5nKSB7CisJCQkJcHJldnNpYj1zaWJJdGVtOworCQkJCXNpYkl0ZW09JmluZm9QdHItPml0ZW1zIFtzaWJJdGVtLT5zaWJsaW5nXTsKKwkJCX0KKwkJCXNpYkl0ZW0tPnNpYmxpbmc9aUl0ZW07CisJCQlpZiAocHJldnNpYiE9TlVMTCkgCisJCQkJd2luZUl0ZW0tPnVwc2libGluZz1wcmV2c2liLT5oSXRlbTsKKwkJCWVsc2UKKyAgCQkJCXdpbmVJdGVtLT5zaWJsaW5nPTA7IAkvKiB0ZXJtaW5hdGUgbGlzdCAqLworCQkJYnJlYWs7CisJCWNhc2UgVFZJX1NPUlQ6ICAKKwkJCUZJWE1FICh0cmVldmlldywgIlNvcnRlZCBpbnNlcnQgbm90IGltcGxlbWVudGVkIHlldFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJCisJCQl3aGlsZSAoKHNpYkl0ZW0tPnNpYmxpbmcpICYmIChzaWJJdGVtLT5zaWJsaW5nIT1pSXRlbSkpIHsKKwkJCQlwcmV2c2liPXNpYkl0ZW07CisgICAgICAgICAgICAgICAgc2liSXRlbT0maW5mb1B0ci0+aXRlbXMgW3NpYkl0ZW0tPnNpYmxpbmddOworICAgICAgICAgICAgfQorCQkJaWYgKHNpYkl0ZW0tPnNpYmxpbmcpIAorCQkJCVdBUk4gKHRyZWV2aWV3LCAiQnVnZ3kgcHJvZ3JhbSB0cmllZCB0byBpbnNlcnQgaXRlbSBhZnRlciBub25leGlzdGluZyBoYW5kbGUuIik7CisJCQlzaWJJdGVtLT51cHNpYmxpbmc9aUl0ZW07CisJCQl3aW5lSXRlbS0+c2libGluZz1zaWJJdGVtLT5oSXRlbTsKKwkJCWlmIChwcmV2c2liIT1OVUxMKSAKKwkJCQl3aW5lSXRlbS0+dXBzaWJsaW5nPXByZXZzaWItPmhJdGVtOworCQkJYnJlYWs7CisgICAJfQorICAgfQkKKworCisvKiBGaWxsIGluIGluZm8gc3RydWN0dXJlICovCisKKyAgIHdpbmVJdGVtLT5tYXNrPXR2SXRlbS0+bWFzazsKKyAgIHdpbmVJdGVtLT5oSXRlbT1pSXRlbTsKKyAgIHdpbmVJdGVtLT5pSW50ZWdyYWw9MTsgCisKKyAgIGlmICh0dkl0ZW0tPm1hc2sgJiBUVklGX0NISUxEUkVOKQorCSB3aW5lSXRlbS0+Y0NoaWxkcmVuPXR2SXRlbS0+Y0NoaWxkcmVuOworCisgICBpZiAodHZJdGVtLT5tYXNrICYgVFZJRl9JTUFHRSkgCisJd2luZUl0ZW0tPmlJbWFnZT10dkl0ZW0tPmlJbWFnZTsKKworLyogICBpZiAodHZJdGVtLT5tYXNrICYgVFZJRl9JTlRFR1JBTCkgCisgICAJd2luZUl0ZW0tPmlJbnRlZ3JhbD10dkl0ZW0tPmlJbnRlZ3JhbDsgICovCisgICAKKworICAgaWYgKHR2SXRlbS0+bWFzayAmIFRWSUZfUEFSQU0pIAorCXdpbmVJdGVtLT5sUGFyYW09dHZJdGVtLT5sUGFyYW07CisKKyAgIGlmICh0dkl0ZW0tPm1hc2sgJiBUVklGX1NFTEVDVEVESU1BR0UpIAorCXdpbmVJdGVtLT5pU2VsZWN0ZWRJbWFnZT10dkl0ZW0tPmlTZWxlY3RlZEltYWdlOworCisgICBpZiAodHZJdGVtLT5tYXNrICYgVFZJRl9TVEFURSkgeworCXdpbmVJdGVtLT5zdGF0ZT10dkl0ZW0tPnN0YXRlOworCXdpbmVJdGVtLT5zdGF0ZU1hc2s9dHZJdGVtLT5zdGF0ZU1hc2s7CisgICB9CisKKyAgIGlmICh0dkl0ZW0tPm1hc2sgJiBUVklGX1RFWFQpIHsKKyAgIAlUUkFDRSAodHJlZXZpZXcsIiglcylcbiIsIHR2SXRlbS0+cHN6VGV4dCk7IAorCWlmICh0dkl0ZW0tPnBzelRleHQhPUxQU1RSX1RFWFRDQUxMQkFDSzMyQSkgeworCQlsZW4gPSBsc3RybGVuMzJBICh0dkl0ZW0tPnBzelRleHQpKzE7CisJCXdpbmVJdGVtLT5wc3pUZXh0PQorCQkJSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbGVuKzEpOworCQlsc3RyY3B5MzJBICh3aW5lSXRlbS0+cHN6VGV4dCwgdHZJdGVtLT5wc3pUZXh0KTsKKwkJd2luZUl0ZW0tPmNjaFRleHRNYXg9bGVuOworCX0KKyAgIH0KKworICAgVFJFRVZJRVdfUXVldWVSZWZyZXNoICh3bmRQdHIpOworCisgICByZXR1cm4gKExSRVNVTFQpIGlJdGVtOworfQorCisKKworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX0RlbGV0ZUl0ZW0gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgIFRSRUVWSUVXX0lORk8gKmluZm9QdHIgPSBUUkVFVklFV19HZXRJbmZvUHRyKHduZFB0cik7CisgIElOVDMyIGlJdGVtOworICBQT0lOVDMyIHB0OworICBUUkVFVklFV19JVEVNICp3aW5lSXRlbTsKKworICBUUkFDRSAodHJlZXZpZXcsIlxuIik7CisgIGlmICghaW5mb1B0cikgcmV0dXJuIEZBTFNFOworCisgIGlmICgoSU5UMzIpIGxQYXJhbSA9PSBUVklfUk9PVCkgeworCVRSRUVWSUVXX1JlbW92ZVRyZWUgKGluZm9QdHIpOworICB9IGVsc2UgeworICAJaUl0ZW09IChJTlQzMikgbFBhcmFtOworICAJd2luZUl0ZW0gPSBUUkVFVklFV19WYWxpZEl0ZW0gKGluZm9QdHIsIGlJdGVtKTsKKyAgCWlmICghd2luZUl0ZW0pIHJldHVybiBGQUxTRTsKKwlUUkVFVklFV19TZW5kVHJlZXZpZXdOb3RpZnkgKHduZFB0ciwgVFZOX0RFTEVURUlURU0sIDAsIGlJdGVtLCAwLCBwdCk7CisJVFJFRVZJRVdfUmVtb3ZlSXRlbSAoaW5mb1B0ciwgd2luZUl0ZW0pOworICB9CisKKyAgVFJFRVZJRVdfUXVldWVSZWZyZXNoICh3bmRQdHIpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19HZXRJbmRlbnQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKworIHJldHVybiBpbmZvUHRyLT51SW5kZW50OworfQorCitzdGF0aWMgTFJFU1VMVAorVFJFRVZJRVdfU2V0SW5kZW50IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICBJTlQzMiBuZXdJbmRlbnQ7CisgICAKKyAgbmV3SW5kZW50PShJTlQzMikgd1BhcmFtOworICBpZiAobmV3SW5kZW50IDwgTUlOSU1VTV9JTkRFTlQpIG5ld0luZGVudD1NSU5JTVVNX0lOREVOVDsKKyAgaW5mb1B0ci0+dUluZGVudD1uZXdJbmRlbnQ7CisgIAorICByZXR1cm4gMDsKK30KKworCisKKworCitzdGF0aWMgTFJFU1VMVAorVFJFRVZJRVdfQ3JlYXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRSRUVWSUVXX0lORk8gKmluZm9QdHI7CisJSERDMzIgaGRjOworICAgIFRFWFRNRVRSSUMzMkEgdG07CisgIAorICAgIFRSQUNFICh0cmVldmlldywiXG4iKTsKKyAgICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICAgIGluZm9QdHIgPSAoVFJFRVZJRVdfSU5GTyAqKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRSRUVWSUVXX0lORk8pKTsKKworICAgIHduZFB0ci0+d0V4dHJhWzBdID0gKERXT1JEKWluZm9QdHI7CisKKyAgICBpZiAoaW5mb1B0ciA9PSBOVUxMKSB7CisJCUVSUiAodHJlZXZpZXcsICJjb3VsZCBub3QgYWxsb2NhdGUgaW5mbyBtZW1vcnkhXG4iKTsKKwkJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChUUkVFVklFV19JTkZPKil3bmRQdHItPndFeHRyYVswXSAhPSBpbmZvUHRyKSB7CisJCUVSUiAodHJlZXZpZXcsICJwb2ludGVyIGFzc2lnbm1lbnQgZXJyb3IhXG4iKTsKKwkJcmV0dXJuIDA7CisgICAgfQorCisJaGRjPUdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCisgICAgLyogc2V0IGRlZmF1bHQgc2V0dGluZ3MgKi8KKyAgICBpbmZvUHRyLT51SW50ZXJuYWxTdGF0dXM9MDsKKyAgICBpbmZvUHRyLT51TnVtSXRlbXM9MDsKKyAgICBpbmZvUHRyLT5jbHJCayA9IEdldFN5c0NvbG9yMzIgKENPTE9SX1dJTkRPVyk7CisgICAgaW5mb1B0ci0+Y2xyVGV4dCA9IEdldFN5c0NvbG9yMzIgKENPTE9SX0JUTlRFWFQpOworICAgIGluZm9QdHItPmN5ID0gMDsKKyAgICBpbmZvUHRyLT5jeCA9IDA7CisgICAgaW5mb1B0ci0+dUluZGVudCA9IDE1OworICAgIGluZm9QdHItPmhpbWxOb3JtYWwgPSBOVUxMOworICAgIGluZm9QdHItPmhpbWxTdGF0ZSA9IE5VTEw7CisJaW5mb1B0ci0+dUl0ZW1IZWlnaHQgPSAtMTsKKyAgICBHZXRUZXh0TWV0cmljczMyQSAoaGRjLCAmdG0pOworICAgIGluZm9QdHItPnVSZWFsSXRlbUhlaWdodD0gdG0udG1IZWlnaHQgKyB0bS50bUV4dGVybmFsTGVhZGluZzsKKworICAgIGluZm9QdHItPml0ZW1zID0gTlVMTDsKKyAgICBpbmZvUHRyLT5zZWxlY3RlZEl0ZW09MDsKKyAgICBpbmZvUHRyLT5jbHJUZXh0PS0xOwkvKiB1c2Ugc3lzdGVtIGNvbG9yICovCisgICAgaW5mb1B0ci0+ZHJvcEl0ZW09MDsKKworLyoKKyAgICBpbmZvUHRyLT5od25kTm90aWZ5ID0gR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIGluZm9QdHItPmJUcmFuc3BhcmVudCA9ICh3bmRQdHItPmR3U3R5bGUgJiBUQlNUWUxFX0ZMQVQpOworKi8KKworICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBUQlNUWUxFX1RPT0xUSVBTKSB7CisgICAgICAgIC8qIENyZWF0ZSB0b29sdGlwIGNvbnRyb2wgKi8KKy8vICAgICAgaW5mb1B0ci0+aHduZFRvb2xUaXAgPSBDcmVhdGVXaW5kb3dFeDMyQSAoLi4uLik7CisKKyAgICAgICAgLyogU2VuZCBUVl9UT09MVElQU0NSRUFURUQgbm90aWZpY2F0aW9uICovCisKKyAgICB9CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAKICAgICByZXR1cm4gMDsKIH0KIAogCisKK3N0YXRpYyBMUkVTVUxUIAorVFJFRVZJRVdfRGVzdHJveSAoV05EICp3bmRQdHIpIAoreworICAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyAgICAgCisgICBUUkVFVklFV19SZW1vdmVUcmVlIChpbmZvUHRyKTsKKworICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyKTsKKworICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX1BhaW50IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQoreworICAgIEhEQzMyIGhkYzsKKyAgICBQQUlOVFNUUlVDVDMyIHBzOworCisgICAgaGRjID0gd1BhcmFtPT0wID8gQmVnaW5QYWludDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcHMpIDogKEhEQzMyKXdQYXJhbTsKKyAgICBUUkVFVklFV19RdWV1ZVJlZnJlc2ggKHduZFB0cik7CisgICAgaWYoIXdQYXJhbSkKKyAgICAgICAgRW5kUGFpbnQzMiAod25kUHRyLT5od25kU2VsZiwgJnBzKTsKKyAgICByZXR1cm4gMDsKK30KKworCisKIHN0YXRpYyBMUkVTVUxUCiBUUkVFVklFV19FcmFzZUJhY2tncm91bmQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CkBAIC0xMjAsNiArMTE0Miw3IEBACiAgICAgSEJSVVNIMzIgaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaDMyIChpbmZvUHRyLT5jbHJCayk7CiAgICAgUkVDVDMyIHJlY3Q7CiAKKyAgICBUUkFDRSAodHJlZXZpZXcsIlxuIik7CiAgICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CiAgICAgRmlsbFJlY3QzMiAoKEhEQzMyKXdQYXJhbSwgJnJlY3QsIGhCcnVzaCk7CiAgICAgRGVsZXRlT2JqZWN0MzIgKGhCcnVzaCk7CkBAIC0xMjgsMTYxICsxMTUxLDY1MyBAQAogCiAKIAotTFJFU1VMVCBXSU5BUEkKLVRSRUVWSUVXX1dpbmRvd1Byb2MgKEhXTkQzMiBod25kLCBVSU5UMzIgdU1zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorCisKKyAgCisKKworCitzdGF0aWMgQk9PTDMyCitUUkVFVklFV19TZW5kU2ltcGxlTm90aWZ5IChXTkQgKnduZFB0ciwgVUlOVDMyIGNvZGUpCiB7Ci0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBOTUhEUiBubWhkcjsKIAotICAgIHN3aXRjaCAodU1zZykKLSAgICB7CisgICAgVFJBQ0UgKHRyZWV2aWV3LCAiJXhcbiIsY29kZSk7CisgICAgbm1oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIG5taGRyLmlkRnJvbSAgID0gd25kUHRyLT53SURtZW51OworICAgIG5taGRyLmNvZGUgICAgID0gY29kZTsKIAotICAgIGNhc2UgVFZNX0lOU0VSVElURU0zMkE6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fSU5TRVJUSVRFTTMyQVxuIik7Ci0gICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKEJPT0wzMikgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpbm1oZHIuaWRGcm9tLCAoTFBBUkFNKSZubWhkcik7Cit9CiAKLSAgICBjYXNlIFRWTV9JTlNFUlRJVEVNMzJXOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0lOU0VSVElURU0zMldcbiIpOwotICAgICAgcmV0dXJuIDA7CiAKLSAgICBjYXNlIFRWTV9ERUxFVEVJVEVNOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0RFTEVURUlURU1cbiIpOwotICAgICAgcmV0dXJuIDA7CiAKLSAgICBjYXNlIFRWTV9FWFBBTkQ6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fRVhQQU5EXG4iKTsKLSAgICAgIHJldHVybiAwOwogCi0gICAgY2FzZSBUVk1fR0VUSVRFTVJFQ1Q6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVRFTVJFQ1RcbiIpOwotICAgICAgcmV0dXJuIDA7CitzdGF0aWMgQk9PTDMyCitUUkVFVklFV19TZW5kVHJlZXZpZXdOb3RpZnkgKFdORCAqd25kUHRyLCBVSU5UMzIgY29kZSwgVUlOVDMyIGFjdGlvbiwgCisJCQlJTlQzMiBvbGRJdGVtLCBJTlQzMiBuZXdJdGVtLCBQT0lOVDMyIHB0KQoreworICBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICBOTVRSRUVWSUVXIG5taGRyOworICBUUkVFVklFV19JVEVNICAqd2luZUl0ZW07CiAKLSAgICBjYXNlIFRWTV9HRVRDT1VOVDoKLSAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9HRVRDT1VOVFxuIik7Ci0gICAgICByZXR1cm4gMDsKKyAgVFJBQ0UgKHRyZWV2aWV3LCJjb2RlOiV4IGFjdGlvbjoleCBvbGRpdGVtOiV4IG5ld2l0ZW06JXhcbiIsCisJCSAgY29kZSxhY3Rpb24sb2xkSXRlbSxuZXdJdGVtKTsKKyAgbm1oZHIuaGRyLmh3bmRGcm9tID0gd25kUHRyLT5od25kU2VsZjsKKyAgbm1oZHIuaGRyLmlkRnJvbSA9IHduZFB0ci0+d0lEbWVudTsKKyAgbm1oZHIuaGRyLmNvZGUgPSBjb2RlOworICBubWhkci5hY3Rpb24gPSBhY3Rpb247CisgIGlmIChvbGRJdGVtKSB7CisgIAl3aW5lSXRlbT0mIGluZm9QdHItPml0ZW1zW29sZEl0ZW1dOworICAJbm1oZHIuaXRlbU9sZC5tYXNrIAkJPSB3aW5lSXRlbS0+bWFzazsKKyAgCW5taGRyLml0ZW1PbGQuaEl0ZW0JCT0gd2luZUl0ZW0tPmhJdGVtOworICAJbm1oZHIuaXRlbU9sZC5zdGF0ZQkJPSB3aW5lSXRlbS0+c3RhdGU7CisgIAlubWhkci5pdGVtT2xkLnN0YXRlTWFzawk9IHdpbmVJdGVtLT5zdGF0ZU1hc2s7CisgIAlubWhkci5pdGVtT2xkLmlJbWFnZSAJCT0gd2luZUl0ZW0tPmlJbWFnZTsKKyAgCW5taGRyLml0ZW1PbGQucHN6VGV4dCAJPSB3aW5lSXRlbS0+cHN6VGV4dDsKKyAgCW5taGRyLml0ZW1PbGQuY2NoVGV4dE1heCAJPSB3aW5lSXRlbS0+Y2NoVGV4dE1heDsKKyAgCW5taGRyLml0ZW1PbGQuaUltYWdlIAkJPSB3aW5lSXRlbS0+aUltYWdlOworICAJbm1oZHIuaXRlbU9sZC5pU2VsZWN0ZWRJbWFnZSAJPSB3aW5lSXRlbS0+aVNlbGVjdGVkSW1hZ2U7CisgIAlubWhkci5pdGVtT2xkLmNDaGlsZHJlbiAJPSB3aW5lSXRlbS0+Y0NoaWxkcmVuOworICAJbm1oZHIuaXRlbU9sZC5sUGFyYW0JCT0gd2luZUl0ZW0tPmxQYXJhbTsKKyAgfQogCi0gICAgY2FzZSBUVk1fR0VUSU5ERU5UOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVElOREVOVFxuIik7Ci0gICAgICByZXR1cm4gMDsKKyAgaWYgKG5ld0l0ZW0pIHsKKyAgCXdpbmVJdGVtPSYgaW5mb1B0ci0+aXRlbXNbbmV3SXRlbV07CisgIAlubWhkci5pdGVtTmV3Lm1hc2sgCQk9IHdpbmVJdGVtLT5tYXNrOworICAJbm1oZHIuaXRlbU5ldy5oSXRlbQkJPSB3aW5lSXRlbS0+aEl0ZW07CisgIAlubWhkci5pdGVtTmV3LnN0YXRlCQk9IHdpbmVJdGVtLT5zdGF0ZTsKKyAgCW5taGRyLml0ZW1OZXcuc3RhdGVNYXNrCT0gd2luZUl0ZW0tPnN0YXRlTWFzazsKKyAgCW5taGRyLml0ZW1OZXcuaUltYWdlIAkJPSB3aW5lSXRlbS0+aUltYWdlOworICAJbm1oZHIuaXRlbU5ldy5wc3pUZXh0IAk9IHdpbmVJdGVtLT5wc3pUZXh0OworICAJbm1oZHIuaXRlbU5ldy5jY2hUZXh0TWF4IAk9IHdpbmVJdGVtLT5jY2hUZXh0TWF4OworICAJbm1oZHIuaXRlbU5ldy5pSW1hZ2UgCQk9IHdpbmVJdGVtLT5pSW1hZ2U7CisgIAlubWhkci5pdGVtTmV3LmlTZWxlY3RlZEltYWdlIAk9IHdpbmVJdGVtLT5pU2VsZWN0ZWRJbWFnZTsKKyAgCW5taGRyLml0ZW1OZXcuY0NoaWxkcmVuIAk9IHdpbmVJdGVtLT5jQ2hpbGRyZW47CisgIAlubWhkci5pdGVtTmV3LmxQYXJhbQkJPSB3aW5lSXRlbS0+bFBhcmFtOworICB9CiAKLSAgICBjYXNlIFRWTV9TRVRJTkRFTlQ6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUSU5ERU5UXG4iKTsKLSAgICAgIHJldHVybiAwOworICBubWhkci5wdERyYWcueCA9IHB0Lng7CisgIG5taGRyLnB0RHJhZy55ID0gcHQueTsKIAotCWNhc2UgVFZNX0dFVElNQUdFTElTVDoKLQkgICAgcmV0dXJuIFRSRUVWSUVXX0dldEltYWdlTGlzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisgIHJldHVybiAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm1oZHIpOwogCi0JY2FzZSBUVk1fU0VUSU1BR0VMSVNUOgotCSAgICByZXR1cm4gVFJFRVZJRVdfU2V0SW1hZ2VMaXN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKK30KIAotICAgIGNhc2UgVFZNX0dFVE5FWFRJVEVNOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVE5FWFRJVEVNXG4iKTsKLSAgICAgIHJldHVybiAwOwogCi0gICAgY2FzZSBUVk1fU0VMRUNUSVRFTToKLSAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9TRUxFQ1RJVEVNIFxuIik7Ci0gICAgICByZXR1cm4gMDsKIAotICAgIGNhc2UgVFZNX0dFVElURU0zMkE6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVRFTTMyQVxuIik7Ci0gICAgICByZXR1cm4gMDsKIAotICAgIGNhc2UgVFZNX0dFVElURU0zMlc6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVRFTTMyV1xuIik7Ci0gICAgICByZXR1cm4gMDsKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19FeHBhbmQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyBUUkVFVklFV19JVEVNICp3aW5lSXRlbTsKKyBVSU5UMzIgZmxhZzsKKyBJTlQzMiBleHBhbmRJdGVtOworIFBPSU5UMzIgcHQ7CisgCisgZmxhZz0gKFVJTlQzMikgd1BhcmFtOworIGV4cGFuZEl0ZW09IChJTlQzMikgbFBhcmFtOworIFRSQUNFICh0cmVldmlldywiZmxhZ3M6JXggaXRlbToleFxuIiwgZXhwYW5kSXRlbSwgd1BhcmFtKTsKKyB3aW5lSXRlbSA9IFRSRUVWSUVXX1ZhbGlkSXRlbSAoaW5mb1B0ciwgZXhwYW5kSXRlbSk7CisgaWYgKCF3aW5lSXRlbSkgcmV0dXJuIDA7CisgaWYgKCF3aW5lSXRlbS0+Y0NoaWxkcmVuKSByZXR1cm4gMDsKIAotICAgIGNhc2UgVFZNX1NFVElURU0zMkE6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUSVRFTTMyQVxuIik7Ci0gICAgICByZXR1cm4gMDsKKyBpZiAoZmxhZyAmIFRWRV9UT0dHTEUpIHsJCS8qIEZJWE1FOiBjaGVjayBleGFjdCBiZWhhdmlvdXIgaGVyZSAqLworCWZsYWcgJj0gflRWRV9UT0dHTEU7CQkvKiBpZTogYml0d2lzZSBvcHMgb3IgJ2Nhc2UnIG9wcyAqLworCWlmICh3aW5lSXRlbS0+c3RhdGUgJiBUVklTX0VYUEFOREVEKSAKKwkJZmxhZyB8PSBUVkVfQ09MTEFQU0U7CisJZWxzZQorCQlmbGFnIHw9IFRWRV9FWFBBTkQ7CisgfQogCi0gICAgY2FzZSBUVk1fU0VUSVRFTTMyVzoKLSAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9TRVRJVEVNMzJXXG4iKTsKLSAgICAgIHJldHVybiAwOworIHN3aXRjaCAoZmxhZykgeworICAgIGNhc2UgVFZFX0NPTExBUFNFUkVTRVQ6IAorICAgCQlpZiAoIXdpbmVJdGVtLT5zdGF0ZSAmIFRWSVNfRVhQQU5ERUQpIHJldHVybiAwOworCQl3aW5lSXRlbS0+c3RhdGUgJj0gfihUVklTX0VYUEFOREVET05DRSB8IFRWSVNfRVhQQU5ERUQpOworCQlUUkVFVklFV19SZW1vdmVBbGxDaGlsZHJlbiAoaW5mb1B0ciwgd2luZUl0ZW0pOworCQlicmVhazsKIAotICAgIGNhc2UgVFZNX0VESVRMQUJFTDMyQToKLSAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9FRElUTEFCRUwzMkFcbiIpOwotICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUVkVfQ09MTEFQU0U6IAorCQlpZiAoIXdpbmVJdGVtLT5zdGF0ZSAmIFRWSVNfRVhQQU5ERUQpIHJldHVybiAwOworCQl3aW5lSXRlbS0+c3RhdGUgJj0gflRWSVNfRVhQQU5ERUQ7CisJCWJyZWFrOwogCi0gICAgY2FzZSBUVk1fRURJVExBQkVMMzJXOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0VESVRMQUJFTDMyV1xuIik7Ci0gICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFRWRV9FWFBBTkQ6IAorCQlpZiAod2luZUl0ZW0tPnN0YXRlICYgVFZJU19FWFBBTkRFRCkgcmV0dXJuIDA7CisJCWlmICghKHdpbmVJdGVtLT5zdGF0ZSAmIFRWSVNfRVhQQU5ERURPTkNFKSkgeworICAgIAkJaWYgKFRSRUVWSUVXX1NlbmRUcmVldmlld05vdGlmeSAod25kUHRyLCBUVk5fSVRFTUVYUEFORElORywgCisJCQkJCQkJCQkJCTAsIDAsIGV4cGFuZEl0ZW0sIHB0KSkKKwkJCQkJcmV0dXJuIEZBTFNFOyAJLyogRklYTUU6IE9LPyAqLworCQl3aW5lSXRlbS0+c3RhdGUgfD0gVFZJU19FWFBBTkRFRCB8IFRWSVNfRVhQQU5ERURPTkNFOworICAgIAlUUkVFVklFV19TZW5kVHJlZXZpZXdOb3RpZnkgKHduZFB0ciwgVFZOX0lURU1FWFBBTkRFRCwgCisJCQkJCQkJCQkJCTAsIDAsIGV4cGFuZEl0ZW0sIHB0KTsKKyAJfQorCXdpbmVJdGVtLT5zdGF0ZSB8PSBUVklTX0VYUEFOREVEOworCWJyZWFrOworICAgY2FzZSBUVkVfRVhQQU5EUEFSVElBTDoKKwkJRklYTUUgKHRyZWV2aWV3LCAiVFZFX0VYUEFORFBBUlRJQUwgbm90IGltcGxlbWVudGVkXG4iKTsKKwkJd2luZUl0ZW0tPnN0YXRlIF49VFZJU19FWFBBTkRFRDsKKwkJd2luZUl0ZW0tPnN0YXRlIHw9VFZJU19FWFBBTkRFRE9OQ0U7CisJCWJyZWFrOworICB9CisgCisgVFJFRVZJRVdfUXVldWVSZWZyZXNoICh3bmRQdHIpOwogCi0gICAgY2FzZSBUVk1fR0VURURJVENPTlRST0w6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VURURJVENPTlRST0xcbiIpOwotICAgICAgcmV0dXJuIDA7CisgcmV0dXJuIFRSVUU7Cit9CiAKLSAgICBjYXNlIFRWTV9HRVRWSVNJQkxFQ09VTlQ6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUVklTSUJMRUNPVU5UXG4iKTsKLSAgICAgIHJldHVybiAwOwogCi0gICAgY2FzZSBUVk1fSElUVEVTVDoKLSAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9ISVRURVNUXG4iKTsKLSAgICAgIHJldHVybiAwOwogCi0gICAgY2FzZSBUVk1fQ1JFQVRFRFJBR0lNQUdFOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0NSRUFURURSQUdJTUFHRVxuIik7Ci0gICAgICByZXR1cm4gMDsKK3N0YXRpYyBIVFJFRUlURU0KK1RSRUVWSUVXX0hpdFRlc3QgKFdORCAqd25kUHRyLCBMUFRWSElUVEVTVElORk8gbHBodCkKK3sKKyBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworIFRSRUVWSUVXX0lURU0gKndpbmVJdGVtOworIFJFQ1QzMiByZWN0OworIFVJTlQzMiBzdGF0dXMseCx5OworIAogCi0gICAgY2FzZSBUVk1fU09SVENISUxEUkVOOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX1NPUlRDSElMRFJFTlxuIik7Ci0gICAgICByZXR1cm4gMDsKIAotICAgIGNhc2UgVFZNX0VOU1VSRVZJU0lCTEU6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fRU5TVVJFVklTSUJMRVxuIik7Ci0gICAgICByZXR1cm4gMDsKKyBHZXRDbGllbnRSZWN0MzIgKHduZFB0ci0+aHduZFNlbGYsICZyZWN0KTsKKyBUUkFDRSAodHJlZXZpZXcsIiglZCwlZClcbiIsbHBodC0+cHQueCwgbHBodC0+cHQueSk7CiAKLSAgICBjYXNlIFRWTV9TT1JUQ0hJTERSRU5DQjoKLSAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9TT1JUQ0hJTERSRU5DQlxuIik7Ci0gICAgICByZXR1cm4gMDsKKyBzdGF0dXM9MDsKKyB4PWxwaHQtPnB0Lng7CisgeT1scGh0LT5wdC55OworIGlmICh4IDwgcmVjdC5sZWZ0KSAgc3RhdHVzfD1UVkhUX1RPTEVGVDsKKyBpZiAoeCA+IHJlY3QucmlnaHQpIHN0YXR1c3w9VFZIVF9UT1JJR0hUOworIGlmICh5IDwgcmVjdC50b3AgKSAgc3RhdHVzfD1UVkhUX0FCT1ZFOworIGlmICh5ID4gcmVjdC5ib3R0b20pIHN0YXR1c3w9VFZIVF9CRUxPVzsKKyBpZiAoc3RhdHVzKSB7CisJbHBodC0+ZmxhZ3M9c3RhdHVzOworCXJldHVybiAwOworIH0KIAotICAgIGNhc2UgVFZNX0VOREVESVRMQUJFTE5PVzoKLSAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9FTkRFRElUTEFCRUxOT1dcbiIpOwotICAgICAgcmV0dXJuIDA7CisgaWYgKCFpbmZvUHRyLT5maXJzdFZpc2libGUpIFdBUk4gKHRyZWV2aWV3LCJDYW4ndCBmZXRjaCBmaXJzdCB2aXNpYmxlIGl0ZW0iKTsKKyB3aW5lSXRlbT0maW5mb1B0ci0+aXRlbXMgW2luZm9QdHItPmZpcnN0VmlzaWJsZV07CiAKLSAgICBjYXNlIFRWTV9HRVRJU0VBUkNIU1RSSU5HMzJBOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVElTRUFSQ0hTVFJJTkczMkFcbiIpOwotICAgICAgcmV0dXJuIDA7Cisgd2hpbGUgKCh3aW5lSXRlbSE9TlVMTCkgJiYgKHkgPiB3aW5lSXRlbS0+cmVjdC5ib3R0b20pKQorICAgICAgIHdpbmVJdGVtPVRSRUVWSUVXX0dldE5leHRMaXN0SXRlbSAoaW5mb1B0cix3aW5lSXRlbSk7CisJCisgaWYgKHdpbmVJdGVtPT1OVUxMKSB7CisJbHBodC0+ZmxhZ3M9VFZIVF9OT1dIRVJFOworCXJldHVybiAwOworIH0KIAotICAgIGNhc2UgVFZNX0dFVElTRUFSQ0hTVFJJTkczMlc6Ci0gICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVNFQVJDSFNUUklORzMyV1xuIik7Ci0gICAgICByZXR1cm4gMDsKKyBpZiAoeD53aW5lSXRlbS0+cmVjdC5yaWdodCkgeworCWxwaHQtPmZsYWdzfD1UVkhUX09OSVRFTVJJR0hUOworCXJldHVybiB3aW5lSXRlbS0+aEl0ZW07CisgfQorIAorCQorIGlmICh4PHdpbmVJdGVtLT5yZWN0LmxlZnQrMTApIGxwaHQtPmZsYWdzfD1UVkhUX09OSVRFTUJVVFRPTjsKIAotICAgIGNhc2UgVFZNX1NFVFRPT0xUSVBTOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX1NFVFRPT0xUSVBTXG4iKTsKLSAgICAgIHJldHVybiAwOworIGxwaHQtPmZsYWdzPVRWSFRfT05JVEVNTEFCRUw7ICAgIC8qIEZJWE1FOiBpbXBsZW1lbnQgb3RoZXIgZmxhZ3MgKi8KKwkKIAotICAgIGNhc2UgVFZNX0dFVFRPT0xUSVBTOgotICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVFRPT0xUSVBTXG4iKTsKLSAgICAgIHJldHVybiAwOworIGxwaHQtPmhJdGVtPXdpbmVJdGVtLT5oSXRlbTsKKyByZXR1cm4gd2luZUl0ZW0tPmhJdGVtOworfQogCi0JY2FzZSBXTV9DUkVBVEU6Ci0JICAgIHJldHVybiBUUkVFVklFV19DcmVhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0JY2FzZSBXTV9ERVNUUk9ZOgotCSAgICByZXR1cm4gVFJFRVZJRVdfRGVzdHJveSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVAorVFJFRVZJRVdfSGl0VGVzdDMyIChXTkQgKnduZFB0ciwgTFBBUkFNIGxQYXJhbSkKK3sKKyAKKyAgcmV0dXJuIChMUkVTVUxUKSBUUkVFVklFV19IaXRUZXN0ICh3bmRQdHIsIChMUFRWSElUVEVTVElORk8pIGxQYXJhbSk7Cit9CiAKLS8vCWNhc2UgRU1fRU5BQkxFOgogCi0JY2FzZSBXTV9FUkFTRUJLR05EOgotCSAgICByZXR1cm4gVFJFRVZJRVdfRXJhc2VCYWNrZ3JvdW5kICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotCWNhc2UgV01fR0VURExHQ09ERToKLQkgICAgcmV0dXJuIERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTOwogCi0vLwljYXNlIFdNX1BBSU5UOgotLy8JICAgIHJldHVybiBUUkVFVklFV19QYWludCAod25kUHRyLCB3UGFyYW0pOworTFJFU1VMVAorVFJFRVZJRVdfTEJ1dHRvbkRvdWJsZUNsaWNrIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICBUUkVFVklFV19JVEVNICp3aW5lSXRlbTsKKyAgSU5UMzIgaUl0ZW07CisgIFRWSElUVEVTVElORk8gaHQ7CiAKLS8vCWNhc2UgV01fU0VURk9OVDoKKyAgVFJBQ0UgKHRyZWV2aWV3LCJcbiIpOworICBodC5wdC54ID0gKElOVDMyKUxPV09SRChsUGFyYW0pOworICBodC5wdC55ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOworICBTZXRGb2N1czMyICh3bmRQdHItPmh3bmRTZWxmKTsKIAotLy8JY2FzZSBXTV9USU1FUjoKKyAgaUl0ZW09VFJFRVZJRVdfSGl0VGVzdCAod25kUHRyLCAmaHQpOworICBUUkFDRSAodHJlZXZpZXcsIml0ZW0gJWQgXG4iLGlJdGVtKTsKKyAgd2luZUl0ZW09VFJFRVZJRVdfVmFsaWRJdGVtIChpbmZvUHRyLCBpSXRlbSk7CisgIGlmICghd2luZUl0ZW0pIHJldHVybiAwOworIAorICBpZiAoVFJFRVZJRVdfU2VuZFNpbXBsZU5vdGlmeSAod25kUHRyLCBOTV9EQkxDTEspIT1UUlVFKSB7ICAgICAvKiBGSVhNRSEqLworCXdpbmVJdGVtLT5zdGF0ZSAmPSB+VFZJU19FWFBBTkRFRE9OQ0U7CisJVFJFRVZJRVdfRXhwYW5kICh3bmRQdHIsIChXUEFSQU0zMikgVFZFX1RPR0dMRSwgKExQQVJBTSkgaUl0ZW0pOworIH0KKyByZXR1cm4gVFJVRTsKK30KIAotLy8JY2FzZSBXTV9WU0NST0xMOgogCi0JZGVmYXVsdDoKLQkgICAgaWYgKHVNc2cgPj0gV01fVVNFUikKKworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX0xCdXR0b25Eb3duIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICBJTlQzMiBpSXRlbTsKKyAgVFZISVRURVNUSU5GTyBodDsKKworICBUUkFDRSAodHJlZXZpZXcsIlxuIik7CisgIGh0LnB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgIGh0LnB0LnkgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisKKyAgU2V0Rm9jdXMzMiAod25kUHRyLT5od25kU2VsZik7CisgIGlJdGVtPVRSRUVWSUVXX0hpdFRlc3QgKHduZFB0ciwgJmh0KTsKKyAgVFJBQ0UgKHRyZWV2aWV3LCJpdGVtICVkIFxuIixpSXRlbSk7CisgIGlmIChodC5mbGFncyAmIFRWSFRfT05JVEVNQlVUVE9OKSB7CisJVFJFRVZJRVdfRXhwYW5kICh3bmRQdHIsIChXUEFSQU0zMikgVFZFX1RPR0dMRSwgKExQQVJBTSkgaUl0ZW0pOworICB9CisJCisgIGlmIChUUkVFVklFV19TZWxlY3RJdGVtICh3bmRQdHIsIChXUEFSQU0zMikgVFZHTl9DQVJFVCwgKExQQVJBTSkgaUl0ZW0pKQorCSByZXR1cm4gMDsKKworICAKKyByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVFJFRVZJRVdfUkJ1dHRvbkRvd24gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisKKyByZXR1cm4gMDsKK30KKworCisKKworLyogRklYTUU6IElmIHRoZSBzcGVjaWZpZWQgaXRlbSBpcyB0aGUgY2hpbGQgb2YgYSBjb2xsYXBzZWQgcGFyZW50IGl0ZW0sCitleHBhbmQgcGFyZW50J3MgbGlzdCBvZiBjaGlsZCBpdGVtcyB0byByZXZlYWwgdGhlIHNwZWNpZmllZCBpdGVtLgorKi8KKworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX1NlbGVjdEl0ZW0gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyBUUkVFVklFV19JVEVNICpwcmV2SXRlbSwqd2luZUl0ZW07CisgSU5UMzIgYWN0aW9uLHByZXZTZWxlY3QsIG5ld1NlbGVjdDsKKyBQT0lOVDMyIGR1bW15OworCisgIFRSQUNFICh0cmVldmlldywiaXRlbSAlbHgsIGZsYWcgJXhcbiIsIGxQYXJhbSwgd1BhcmFtKTsKKyAgbmV3U2VsZWN0PSAoSU5UMzIpIGxQYXJhbTsKKyAgd2luZUl0ZW0gPSBUUkVFVklFV19WYWxpZEl0ZW0gKGluZm9QdHIsIG5ld1NlbGVjdCk7CisgIGlmICghd2luZUl0ZW0pIHJldHVybiBGQUxTRTsKKyAgcHJldlNlbGVjdD1pbmZvUHRyLT5zZWxlY3RlZEl0ZW07CisgIHByZXZJdGVtPSBUUkVFVklFV19WYWxpZEl0ZW0gKGluZm9QdHIsIHByZXZTZWxlY3QpOworICBkdW1teS54PTA7CisgIGR1bW15Lnk9MDsKKworICBhY3Rpb249IChJTlQzMikgd1BhcmFtOworCisgIHN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBUVkdOX0NBUkVUOiAKKwkgICAgaWYgKFRSRUVWSUVXX1NlbmRUcmVldmlld05vdGlmeSAod25kUHRyLCBUVk5fU0VMQ0hBTkdJTkcsIFRWQ19CWU1PVVNFLCAKKwkJCQkJCQkJCQlwcmV2U2VsZWN0LCBuZXdTZWxlY3QsZHVtbXkpKSAKKwkJCXJldHVybiBGQUxTRTsgICAgICAgLyogRklYTUU6IE9LPyAqLworCQkKKwkgICAgaWYgKHByZXZJdGVtKSBwcmV2SXRlbS0+c3RhdGUgJj0gflRWSVNfU0VMRUNURUQ7CisgIAkJaW5mb1B0ci0+c2VsZWN0ZWRJdGVtPW5ld1NlbGVjdDsKKwkJd2luZUl0ZW0tPnN0YXRlIHw9VFZJU19TRUxFQ1RFRDsKKwkJVFJFRVZJRVdfU2VuZFRyZWV2aWV3Tm90aWZ5ICh3bmRQdHIsIFRWTl9TRUxDSEFOR0VELCAKKwkJCQlUVkNfQllNT1VTRSwgcHJldlNlbGVjdCwgbmV3U2VsZWN0LCBkdW1teSk7CisJCWJyZWFrOworCWNhc2UgVFZHTl9EUk9QSElMSVRFOiAKKwkJRklYTUUgKHRyZWV2aWV3LCAiRFJPUEhJTElURSBub3QgaW1wbGVtZW50ZWQiKTsKKwkJYnJlYWs7CisJY2FzZSBUVkdOX0ZJUlNUVklTSUJMRToKKwkJRklYTUUgKHRyZWV2aWV3LCAiRklSU1RWSVNJQkxFIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicmVhazsKKyB9CisgCisgVFJFRVZJRVdfUXVldWVSZWZyZXNoICh3bmRQdHIpOworICAKKyByZXR1cm4gVFJVRTsKK30KKworCisKKy8qIEZJWE1FOiBkb2VzIEtFWURPV04gYWxzbyBzZW5kIG5vdGlmaWNhdGlvbnM/PyBJZiBzbywgdXNlIAorICAgVFJFRVZJRVdfU2VsZWN0SXRlbS4KKyovCisgICAKKworc3RhdGljIExSRVNVTFQKK1RSRUVWSUVXX0tleURvd24gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKyBUUkVFVklFV19JVEVNICpwcmV2SXRlbSwqbmV3SXRlbTsKKyBpbnQgcHJldlNlbGVjdDsKKworCisgVFJBQ0UgKHRyZWV2aWV3LCIleCAlbHgiLHdQYXJhbSwgbFBhcmFtKTsKKyBwcmV2U2VsZWN0PWluZm9QdHItPnNlbGVjdGVkSXRlbTsKKyBpZiAoIXByZXZTZWxlY3QpIHJldHVybiBGQUxTRTsKKworIHByZXZJdGVtPSBUUkVFVklFV19WYWxpZEl0ZW0gKGluZm9QdHIsIHByZXZTZWxlY3QpOworIAorIG5ld0l0ZW09TlVMTDsKKyBzd2l0Y2ggKHdQYXJhbSkgeworCWNhc2UgVktfVVA6IAorCQluZXdJdGVtPVRSRUVWSUVXX0dldFByZXZMaXN0SXRlbSAoaW5mb1B0ciwgcHJldkl0ZW0pOworCQlpZiAoIW5ld0l0ZW0pIAorCQkJbmV3SXRlbT0mIGluZm9QdHItPml0ZW1zW2luZm9QdHItPlRvcFJvb3RJdGVtXTsKKwkJYnJlYWs7CisJY2FzZSBWS19ET1dOOiAKKwkJbmV3SXRlbT1UUkVFVklFV19HZXROZXh0TGlzdEl0ZW0gKGluZm9QdHIsIHByZXZJdGVtKTsKKwkJaWYgKCFuZXdJdGVtKSBuZXdJdGVtPXByZXZJdGVtOworCQlicmVhazsKKwljYXNlIFZLX0hPTUU6CisJCW5ld0l0ZW09JiBpbmZvUHRyLT5pdGVtc1tpbmZvUHRyLT5Ub3BSb290SXRlbV07CisJCWJyZWFrOworCWNhc2UgVktfRU5EOgorCQluZXdJdGVtPVRSRUVWSUVXX0dldExhc3RMaXN0SXRlbSAoaW5mb1B0cik7CisJCWJyZWFrOworCWNhc2UgVktfUFJJT1I6CisJY2FzZSBWS19ORVhUOgorCWNhc2UgVktfQkFDSzoKKwljYXNlIFZLX1JFVFVSTjoKKwkJRklYTUUgKHRyZWV2aWV3LCAiJXggbm90IGltcGxlbWVudGVkXG4iLCB3UGFyYW0pOworCQlicmVhazsKKyB9CisKKyBpZiAoIW5ld0l0ZW0pIHJldHVybiBGQUxTRTsKKworIGlmIChwcmV2SXRlbSE9bmV3SXRlbSkgeworIAlwcmV2SXRlbS0+c3RhdGUgJj0gflRWSVNfU0VMRUNURUQ7CisgCW5ld0l0ZW0tPnN0YXRlIHw9IFRWSVNfU0VMRUNURUQ7CisgCWluZm9QdHItPnNlbGVjdGVkSXRlbT1uZXdJdGVtLT5oSXRlbTsKKyAJVFJFRVZJRVdfUXVldWVSZWZyZXNoICh3bmRQdHIpOworIAlyZXR1cm4gVFJVRTsKKyB9CisKKyByZXR1cm4gRkFMU0U7Cit9CisKKworCitzdGF0aWMgTFJFU1VMVAorVFJFRVZJRVdfVlNjcm9sbCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKKworeworICBUUkVFVklFV19JTkZPICppbmZvUHRyID0gVFJFRVZJRVdfR2V0SW5mb1B0cih3bmRQdHIpOworICBpbnQgbWF4SGVpZ2h0OworCisgIFRSQUNFICh0cmVldmlldywid3AgJXgsIGxwICVseFxuIiwgd1BhcmFtLCBsUGFyYW0pOworICBpZiAoIWluZm9QdHItPnVJbnRlcm5hbFN0YXR1cyAmIFRWX1ZTQ1JPTEwpIHJldHVybiBGQUxTRTsKKworICBzd2l0Y2ggKExPV09SRCAod1BhcmFtKSkgeworCWNhc2UgU0JfTElORVVQOiAKKwkJCWlmICghaW5mb1B0ci0+Y3kpIHJldHVybiBGQUxTRTsKKwkJCWluZm9QdHItPmN5IC09IGluZm9QdHItPnVSZWFsSXRlbUhlaWdodDsKKwkJCWlmIChpbmZvUHRyLT5jeSA8IDApIGluZm9QdHItPmN5PTA7CisJCQlicmVhazsKKwljYXNlIFNCX0xJTkVET1dOOiAKKwkJCW1heEhlaWdodD1pbmZvUHRyLT51VG90YWxIZWlnaHQtaW5mb1B0ci0+dVZpc2libGVIZWlnaHQ7CisJCQlpZiAoaW5mb1B0ci0+Y3kgPT0gbWF4SGVpZ2h0KSByZXR1cm4gRkFMU0U7CisJCQlpbmZvUHRyLT5jeSArPSBpbmZvUHRyLT51UmVhbEl0ZW1IZWlnaHQ7CisJCQlpZiAoaW5mb1B0ci0+Y3kgPiBtYXhIZWlnaHQpIAorCQkJCWluZm9QdHItPmN5ID0gbWF4SGVpZ2h0OworCQkJYnJlYWs7CisJY2FzZSBTQl9QQUdFVVA6CQorCQkJaWYgKCFpbmZvUHRyLT5jeSkgcmV0dXJuIEZBTFNFOworCQkJaW5mb1B0ci0+Y3kgLT0gaW5mb1B0ci0+dVZpc2libGVIZWlnaHQ7CisJCQlpZiAoaW5mb1B0ci0+Y3kgPCAwKSBpbmZvUHRyLT5jeT0wOworCQkJYnJlYWs7CisJY2FzZSBTQl9QQUdFRE9XTjoKKwkJCW1heEhlaWdodD1pbmZvUHRyLT51VG90YWxIZWlnaHQtaW5mb1B0ci0+dVZpc2libGVIZWlnaHQ7CisJCQlpZiAoaW5mb1B0ci0+Y3kgPT0gbWF4SGVpZ2h0KSByZXR1cm4gRkFMU0U7CisJCQlpbmZvUHRyLT5jeSArPSBpbmZvUHRyLT51VmlzaWJsZUhlaWdodDsKKyAgICAgICAgICAgIGlmIChpbmZvUHRyLT5jeSA+IG1heEhlaWdodCkKKyAgICAgICAgICAgICAgICBpbmZvUHRyLT5jeSA9IG1heEhlaWdodDsKKwkJCWJyZWFrOworCWNhc2UgU0JfVEhVTUJUUkFDSzogCisJCQlpbmZvUHRyLT5jeSA9IEhJV09SRCAod1BhcmFtKTsKKwkJCWJyZWFrOworCQkJCisgIH0KKyAgCisgIFRSRUVWSUVXX1F1ZXVlUmVmcmVzaCAod25kUHRyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBMUkVTVUxUCitUUkVFVklFV19IU2Nyb2xsIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKSAKK3sKKyAgVFJFRVZJRVdfSU5GTyAqaW5mb1B0ciA9IFRSRUVWSUVXX0dldEluZm9QdHIod25kUHRyKTsKKworICBUUkFDRSAodHJlZXZpZXcsIndwICVseCwgbHAgJXhcbiIsIGxQYXJhbSwgd1BhcmFtKTsKKwkKKyAgaWYgKCFpbmZvUHRyLT51SW50ZXJuYWxTdGF0dXMgJiBUVl9IU0NST0xMKSByZXR1cm4gRkFMU0U7CisgIHJldHVybiBUUlVFOworfQorCisKKworCisgIExSRVNVTFQgV0lOQVBJCisgIFRSRUVWSUVXX1dpbmRvd1Byb2MgKEhXTkQzMiBod25kLCBVSU5UMzIgdU1zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorICB7CisgICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAKKyAgCisgICAgc3dpdGNoICh1TXNnKSB7CisgICAgCWNhc2UgVFZNX0lOU0VSVElURU0zMkE6CisgICAgICAgICAgcmV0dXJuIFRSRUVWSUVXX0luc2VydEl0ZW0zMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgCWNhc2UgVFZNX0lOU0VSVElURU0zMlc6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9JTlNFUlRJVEVNMzJXXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisKKyAgICAJY2FzZSBUVk1fREVMRVRFSVRFTToKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0RlbGV0ZUl0ZW0gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgCWNhc2UgVFZNX0VYUEFORDoKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0V4cGFuZCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAJY2FzZSBUVk1fR0VUSVRFTVJFQ1Q6CisgICAgICAJCXJldHVybiBUUkVFVklFV19HZXRJdGVtUmVjdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAJY2FzZSBUVk1fR0VUQ09VTlQ6CisgICAgICAJCXJldHVybiBUUkVFVklFV19HZXRDb3VudCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAJY2FzZSBUVk1fR0VUSU5ERU5UOgorICAgICAgCQlyZXR1cm4gVFJFRVZJRVdfR2V0SW5kZW50ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIAljYXNlIFRWTV9TRVRJTkRFTlQ6CisgICAgICAJCXJldHVybiBUUkVFVklFV19TZXRJbmRlbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgCWNhc2UgVFZNX0dFVElNQUdFTElTVDoKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0dldEltYWdlTGlzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwkJY2FzZSBUVk1fU0VUSU1BR0VMSVNUOgorCSAgICAJcmV0dXJuIFRSRUVWSUVXX1NldEltYWdlTGlzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAJY2FzZSBUVk1fR0VUTkVYVElURU06CisgICAgICAJCXJldHVybiBUUkVFVklFV19HZXROZXh0SXRlbTMyICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIAljYXNlIFRWTV9TRUxFQ1RJVEVNOgorICAgICAgCQlyZXR1cm4gVFJFRVZJRVdfU2VsZWN0SXRlbSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAJY2FzZSBUVk1fR0VUSVRFTTMyQToKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0dldEl0ZW0gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgCWNhc2UgVFZNX0dFVElURU0zMlc6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9HRVRJVEVNMzJXXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisKKyAgICAJY2FzZSBUVk1fU0VUSVRFTTMyQToKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX1NldEl0ZW0gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgCWNhc2UgVFZNX1NFVElURU0zMlc6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9TRVRJVEVNV1xuIik7CisgICAgICAJCXJldHVybiAwOworCisgICAgCWNhc2UgVFZNX0VESVRMQUJFTDMyQToKKyAgICAgIAkJRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0VESVRMQUJFTDMyQSBcbiIpOworICAgICAgCQlyZXR1cm4gMDsKKworICAgIAljYXNlIFRWTV9FRElUTEFCRUwzMlc6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9FRElUTEFCRUwzMlcgXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisKKyAgICAJY2FzZSBUVk1fR0VURURJVENPTlRST0w6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9HRVRFRElUQ09OVFJPTFxuIik7CisgICAgICAJCXJldHVybiAwOworCisgICAgCWNhc2UgVFZNX0dFVFZJU0lCTEVDT1VOVDoKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0dldFZpc2libGVDb3VudCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAgICAJY2FzZSBUVk1fSElUVEVTVDoKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0hpdFRlc3QzMiAod25kUHRyLCBsUGFyYW0pOworCisgICAgCWNhc2UgVFZNX0NSRUFURURSQUdJTUFHRToKKyAgICAgIAkJRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0NSRUFURURSQUdJTUFHRVxuIik7CisgICAgICAJCXJldHVybiAwOworICAKKyAgICAJY2FzZSBUVk1fU09SVENISUxEUkVOOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU09SVENISUxEUkVOXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisgIAorICAgIAljYXNlIFRWTV9FTlNVUkVWSVNJQkxFOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fRU5TVVJFVklTSUJMRVxuIik7CisgICAgICAJCXJldHVybiAwOworICAKKyAgICAJY2FzZSBUVk1fU09SVENISUxEUkVOQ0I6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9TT1JUQ0hJTERSRU5DQlxuIik7CisgICAgICAJCXJldHVybiAwOworICAKKyAgICAJY2FzZSBUVk1fRU5ERURJVExBQkVMTk9XOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fRU5ERURJVExBQkVMTk9XXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisgIAorICAgIAljYXNlIFRWTV9HRVRJU0VBUkNIU1RSSU5HMzJBOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVNFQVJDSFNUUklORzMyQVxuIik7CisgICAgICAJCXJldHVybiAwOworICAKKyAgICAJY2FzZSBUVk1fR0VUSVNFQVJDSFNUUklORzMyVzoKKyAgICAgIAkJRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVElTRUFSQ0hTVFJJTkczMldcbiIpOworICAgICAgCQlyZXR1cm4gMDsKKyAgCisgICAgCWNhc2UgVFZNX1NFVFRPT0xUSVBTOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUVE9PTFRJUFNcbiIpOworICAgICAgCQlyZXR1cm4gMDsKKyAgCisgICAgCWNhc2UgVFZNX0dFVFRPT0xUSVBTOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUVE9PTFRJUFNcbiIpOworICAgICAgCQlyZXR1cm4gMDsKKyAgCisgICAgCWNhc2UgVFZNX1NFVElOU0VSVE1BUks6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9TRVRJTlNFUlRNQVJLXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisgIAorICAgIAljYXNlIFRWTV9TRVRJVEVNSEVJR0hUOgorICAgICAgCQlyZXR1cm4gVFJFRVZJRVdfU2V0SXRlbUhlaWdodCAod25kUHRyLCB3UGFyYW0pOworICAKKyAgICAJY2FzZSBUVk1fR0VUSVRFTUhFSUdIVDoKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0dldEl0ZW1IZWlnaHQgKHduZFB0cik7CisgIAorICAgIAljYXNlIFRWTV9TRVRCS0NPTE9SOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUQktDT0xPUlxuIik7CisgICAgICAJCXJldHVybiAwOworCQorICAgIAljYXNlIFRWTV9TRVRURVhUQ09MT1I6CisgICAgICAJCXJldHVybiBUUkVFVklFV19TZXRUZXh0Q29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworICAKKyAgICAJY2FzZSBUVk1fR0VUQktDT0xPUjoKKyAgICAgIAkJRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVEJLQ09MT1JcbiIpOworICAgICAgCQlyZXR1cm4gMDsKKyAgCisgICAgCWNhc2UgVFZNX0dFVFRFWFRDT0xPUjoKKyAgICAgIAkJcmV0dXJuIFRSRUVWSUVXX0dldFRleHRDb2xvciAod25kUHRyKTsKKyAgCisgICAgCWNhc2UgVFZNX1NFVFNDUk9MTFRJTUU6CisgICAgICAJCUZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9TRVRTQ1JPTExUSU1FXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisgIAorICAgIAljYXNlIFRWTV9HRVRTQ1JPTExUSU1FOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUU0NST0xMVElNRVxuIik7CisgICAgICAJCXJldHVybiAwOworICAKKyAgICAJY2FzZSBUVk1fU0VUSU5TRVJUTUFSS0NPTE9SOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUSU5TRVJUTUFSS0NPTE9SXG4iKTsKKyAgICAgIAkJcmV0dXJuIDA7CisgIAorICAgIAljYXNlIFRWTV9TRVRVTklDT0RFRk9STUFUOgorICAgICAgCQlGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUVU5JQ09ERUZPUk1BVFxuIik7CisgICAgICAJCXJldHVybiAwOworICAKKyAgICAJY2FzZSBUVk1fR0VUVU5JQ09ERUZPUk1BVDoKKyAgICAgIAkJRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVFVOSUNPREVGT1JNQVRcbiIpOworICAgICAgCQlyZXR1cm4gMDsKKyAgCisvLwkJY2FzZSBXTV9DT01NQU5EOgorICAKKwkJY2FzZSBXTV9DUkVBVEU6CisJCQlyZXR1cm4gVFJFRVZJRVdfQ3JlYXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKyAgCisJCWNhc2UgV01fREVTVFJPWToKKwkJCXJldHVybiBUUkVFVklFV19EZXN0cm95ICh3bmRQdHIpOworICAKKy8vCQljYXNlIFdNX0VOQUJMRToKKyAgCisJCWNhc2UgV01fRVJBU0VCS0dORDoKKwkgICAgCXJldHVybiBUUkVFVklFV19FcmFzZUJhY2tncm91bmQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworICAKKwkJY2FzZSBXTV9HRVRETEdDT0RFOgorCSAgICAJcmV0dXJuIERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTOworICAKKwkJY2FzZSBXTV9QQUlOVDoKKwkgICAgCXJldHVybiBUUkVFVklFV19QYWludCAod25kUHRyLCB3UGFyYW0pOworICAKKy8vCQljYXNlIFdNX0dFVEZPTlQ6CisvLwkJY2FzZSBXTV9TRVRGT05UOgorICAKKwkJY2FzZSBXTV9LRVlET1dOOgorCQkJcmV0dXJuIFRSRUVWSUVXX0tleURvd24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworICAKKyAgCisvLwkJY2FzZSBXTV9LSUxMRk9DVVM6CisvLwkJY2FzZSBXTV9TRVRGT0NVUzoKKyAgCisgIAorCQljYXNlIFdNX0xCVVRUT05ET1dOOgorCQkJcmV0dXJuIFRSRUVWSUVXX0xCdXR0b25Eb3duICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKyAgCisJCWNhc2UgV01fTEJVVFRPTkRCTENMSzoKKwkJCXJldHVybiBUUkVFVklFV19MQnV0dG9uRG91YmxlQ2xpY2sgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworICAKKwkJY2FzZSBXTV9SQlVUVE9ORE9XTjoKKwkJCXJldHVybiBUUkVFVklFV19SQnV0dG9uRG93biAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisgIAorICAKKy8vCQljYXNlIFdNX1NZU0NPTE9SQ0hBTkdFOgorLy8JCWNhc2UgV01fU1RZTEVDSEFOR0VEOgorLy8JCWNhc2UgV01fU0VUUkVEUkFXOgorICAKKwkJY2FzZSBXTV9USU1FUjoKKwkJCXJldHVybiBUUkVFVklFV19IYW5kbGVUaW1lciAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisgIAorLy8JCWNhc2UgV01fU0laRToKKwkJY2FzZSBXTV9IU0NST0xMOiAKKwkJCXJldHVybiBUUkVFVklFV19IU2Nyb2xsICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJY2FzZSBXTV9WU0NST0xMOiAKKwkJCXJldHVybiBUUkVFVklFV19WU2Nyb2xsICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKyAgCisJCWRlZmF1bHQ6CisJICAgIAlpZiAodU1zZyA+PSBXTV9VU0VSKQogCQlGSVhNRSAodHJlZXZpZXcsICJVbmtub3duIG1zZyAlMDR4IHdwPSUwOHggbHA9JTA4bHhcbiIsCi0JCSAgICAgICB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0JICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBIChod25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgfQorICAJCSAgICAgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworICAJICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBIChod25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RsbHMvY29tY3RsMzIvdXBkb3duLmMgYi9kbGxzL2NvbWN0bDMyL3VwZG93bi5jCmluZGV4IGU5M2I1ZWYuLjhjY2M2NGEgMTAwNjQ0Ci0tLSBhL2RsbHMvY29tY3RsMzIvdXBkb3duLmMKKysrIGIvZGxscy9jb21jdGwzMi91cGRvd24uYwpAQCAtMjcsMTQgKzI3LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgogI2luY2x1ZGUgIndpbm5scy5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJ1cGRvd24uaCIKICNpbmNsdWRlICJncmFwaGljcy5oIgotI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC0yNDksNyArMjQ3LDcgQEAKICAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBVRFNfTk9USE9VU0FORFMpKSB7CiAgICAgICBjaGFyIHR4dDJbMjBdLCAqc3JjID0gdHh0MSwgKmRzdCA9IHR4dDI7CiAgICAgICBpZihsZW4lMyA+IDApewotCXN0cm5jcHkoZHN0LCBzcmMsIGxlbiUzKTsKKwlsc3RyY3B5bjMyQSAoZHN0LCBzcmMsIGxlbiUzKTsKIAlkc3QgKz0gbGVuJTM7CiAJc3JjICs9IGxlbiUzOwogICAgICAgfQpAQCAtNTk3LDkgKzU5NSw3IEBACiAgICAgICByZXR1cm4gVFJVRTsKIAogICAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgaW5mb1B0ciA9Ci0JKFVQRE9XTl9JTkZPKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCSBzaXplb2YoVVBET1dOX0lORk8pKTsKKyAgICAgIGluZm9QdHIgPSAoVVBET1dOX0lORk8qKUNPTUNUTDMyX0FsbG9jIChzaXplb2YoVVBET1dOX0lORk8pKTsKICAgICAgIHduZFB0ci0+d0V4dHJhWzBdID0gKERXT1JEKWluZm9QdHI7CiAKICAgICAgIC8qIGluaXRpYWxpemUgdGhlIGluZm8gc3RydWN0ICovCkBAIC02MTgsOSArNjE0LDkgQEAKICAgICAKICAgICBjYXNlIFdNX0RFU1RST1k6CiAgICAgICBpZihpbmZvUHRyLT5BY2NlbFZlY3QpCi0JZnJlZShpbmZvUHRyLT5BY2NlbFZlY3QpOworCUNPTUNUTDMyX0ZyZWUgKGluZm9QdHItPkFjY2VsVmVjdCk7CiAKLSAgICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0cik7CisgICAgICBDT01DVEwzMl9GcmVlIChpbmZvUHRyKTsKICAgICAgIHduZFB0ci0+d0V4dHJhWzBdID0gMDsKIAogICAgICAgVFJBQ0UodXBkb3duLCAiVXBEb3duIEN0cmwgZGVzdHJ1Y3Rpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CkBAIC03MTUsMTMgKzcxMSwxMyBAQAogICAgIGNhc2UgVURNX1NFVEFDQ0VMOgogICAgICAgVFJBQ0UodXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IGFjY2VsIGluZm8sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CiAgICAgICBpZihpbmZvUHRyLT5BY2NlbFZlY3QpewotCWZyZWUoaW5mb1B0ci0+QWNjZWxWZWN0KTsKKwlDT01DVEwzMl9GcmVlIChpbmZvUHRyLT5BY2NlbFZlY3QpOwogCWluZm9QdHItPkFjY2VsQ291bnQgPSAwOwogCWluZm9QdHItPkFjY2VsVmVjdCAgPSAwOwogICAgICAgfQogICAgICAgaWYod1BhcmFtPT0wKQogCXJldHVybiBUUlVFOwotICAgICAgaW5mb1B0ci0+QWNjZWxWZWN0ID0gbWFsbG9jKHdQYXJhbSpzaXplb2YoVURBQ0NFTCkpOworICAgICAgaW5mb1B0ci0+QWNjZWxWZWN0ID0gQ09NQ1RMMzJfQWxsb2MgKHdQYXJhbSpzaXplb2YoVURBQ0NFTCkpOwogICAgICAgaWYoaW5mb1B0ci0+QWNjZWxWZWN0PT0wKQogCXJldHVybiBGQUxTRTsKICAgICAgIG1lbWNweShpbmZvUHRyLT5BY2NlbFZlY3QsICh2b2lkKilsUGFyYW0sIHdQYXJhbSpzaXplb2YoVURBQ0NFTCkpOwpAQCAtODE2LDkgKzgxMiw5IEBACiAKICAgICBkZWZhdWx0OiAKICAgICAgIGlmIChtZXNzYWdlID49IFdNX1VTRVIpIAotCVdBUk4odXBkb3duLCAidW5rbm93biBtc2cgJTA0eCB3cD0lMDR4IGxwPSUwOGx4XG4iLCAKLQkJICAgICBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwotICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7IAorCUVSUiAodXBkb3duLCAidW5rbm93biBtc2cgJTA0eCB3cD0lMDR4IGxwPSUwOGx4XG4iLCAKKwkgICAgIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBIChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7IAogICAgIH0gCiAKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RsbHMvcHNhcGkvTWFrZWZpbGUuaW4gYi9kbGxzL3BzYXBpL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzYxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL3BzYXBpL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTYgQEAKK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXworVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACitUT1BPQkpESVIgPSAuLi8uLgorU1JDRElSICAgID0gQHNyY2RpckAKK1ZQQVRIICAgICA9IEBzcmNkaXJACitNT0RVTEUgICAgPSBwc2FwaQorCitDX1NSQ1MgPSBcCisJcHNhcGlfbWFpbi5jCisKK2FsbDogJChNT0RVTEUpLm8KKworQE1BS0VfUlVMRVNACisKKyMjIyBEZXBlbmRlbmNpZXM6CisKZGlmZiAtLWdpdCBhL2RsbHMvcHNhcGkvcHNhcGlfbWFpbi5jIGIvZGxscy9wc2FwaS9wc2FwaV9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiYzdmNgotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvcHNhcGkvcHNhcGlfbWFpbi5jCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogICAgICBQU0FQSSBsaWJyYXJ5CisgKgorICogICAgICBDb3B5cmlnaHQgMTk5OCAgUGF0cmlrIFN0cmlkdmFsbAorICovCisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbnR5cGVzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInBzYXBpLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW1wdHlXb3JraW5nU2V0IChQU0FQSS4xKQorICovCitCT09MMzIgV0lOQVBJIEVtcHR5V29ya2luZ1NldDMyKEhBTkRMRTMyIGhQcm9jZXNzKQoreworICByZXR1cm4gU2V0UHJvY2Vzc1dvcmtpbmdTZXRTaXplKGhQcm9jZXNzLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW51bURldmljZURyaXZlcnMgKFBTQVBJLjIpCisgKi8KK0JPT0wzMiBXSU5BUEkgRW51bURldmljZURyaXZlcnMoCisgIExQVk9JRCAqbHBJbWFnZUJhc2UsIERXT1JEIGNiLCBMUERXT1JEIGxwY2JOZWVkZWQpCit7CisgIEZJWE1FKHBzYXBpLCAiKCVwLCAlbGQsICVwKTogc3R1YlxuIiwgbHBJbWFnZUJhc2UsIGNiLCBscGNiTmVlZGVkKTsKKworICBpZihscGNiTmVlZGVkKQorICAgICpscGNiTmVlZGVkID0gMDsKKworICByZXR1cm4gVFJVRTsKK30gICAgCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW51bVByb2Nlc3NlcyAoUFNBUEkuMykKKyAqLworQk9PTDMyIFdJTkFQSSBFbnVtUHJvY2Vzc2VzKERXT1JEICpscGlkUHJvY2VzcywgRFdPUkQgY2IsIERXT1JEICpscGNiTmVlZGVkKQoreworICBGSVhNRShwc2FwaSwgIiglcCwgJWxkLCAlcCk6IHN0dWJcbiIsIGxwaWRQcm9jZXNzLGNiLCBscGNiTmVlZGVkKTsKKworICBpZihscGNiTmVlZGVkKQorICAgICpscGNiTmVlZGVkID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW51bVByb2Nlc3NNb2R1bGVzIChQU0FQSS40KQorICovCitCT09MMzIgV0lOQVBJIEVudW1Qcm9jZXNzTW9kdWxlcygKKyAgSEFORExFMzIgaFByb2Nlc3MsIEhNT0RVTEUzMiAqbHBoTW9kdWxlLCBEV09SRCBjYiwgTFBEV09SRCBscGNiTmVlZGVkKQoreworICBGSVhNRShwc2FwaSwgIihoUHJvY2Vzcz0weCUwOHgsICVwLCAlbGQsICVwKTogc3R1YlxuIiwKKyAgICBoUHJvY2VzcywgbHBoTW9kdWxlLCBjYiwgbHBjYk5lZWRlZAorICApOworCisgIGlmKGxwY2JOZWVkZWQpCisgICAgKmxwY2JOZWVkZWQgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIEdldERldmljZURyaXZlckJhc2VOYW1lMzJBIChQU0FQSS41KQorICovCitEV09SRCBXSU5BUEkgR2V0RGV2aWNlRHJpdmVyQmFzZU5hbWUzMkEoCisgIExQVk9JRCBJbWFnZUJhc2UsIExQU1RSIGxwQmFzZU5hbWUsIERXT1JEIG5TaXplKQoreworICBGSVhNRShwc2FwaSwgIiglcCwgJXMsICVsZCk6IHN0dWJcbiIsCisgICAgSW1hZ2VCYXNlLCBkZWJ1Z3N0cl9hKGxwQmFzZU5hbWUpLCBuU2l6ZQorICApOworCisgIGlmKGxwQmFzZU5hbWUgJiYgblNpemUpCisgICAgbHBCYXNlTmFtZVswXSA9ICdcMCc7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldERldmljZURyaXZlckJhc2VOYW1lMzJXIChQU0FQSS42KQorICovCitEV09SRCBXSU5BUEkgR2V0RGV2aWNlRHJpdmVyQmFzZU5hbWUzMlcoCisgIExQVk9JRCBJbWFnZUJhc2UsIExQV1NUUiBscEJhc2VOYW1lLCBEV09SRCBuU2l6ZSkKK3sKKyAgRklYTUUocHNhcGksICIoJXAsICVzLCAlbGQpOiBzdHViXG4iLAorICAgIEltYWdlQmFzZSwgZGVidWdzdHJfdyhscEJhc2VOYW1lKSwgblNpemUKKyAgKTsKKworICBpZihscEJhc2VOYW1lICYmIG5TaXplKQorICAgIGxwQmFzZU5hbWVbMF0gPSAnXDAnOworCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXREZXZpY2VEcml2ZXJGaWxlTmFtZTMyQSAoUFNBUEkuNykKKyAqLworRFdPUkQgV0lOQVBJIEdldERldmljZURyaXZlckZpbGVOYW1lMzJBKAorICBMUFZPSUQgSW1hZ2VCYXNlLCBMUFNUUiBscEZpbGVuYW1lLCBEV09SRCBuU2l6ZSkKK3sKKyAgRklYTUUocHNhcGksICIoJXAsICVzLCAlbGQpOiBzdHViXG4iLAorICAgIEltYWdlQmFzZSwgZGVidWdzdHJfYShscEZpbGVuYW1lKSwgblNpemUKKyAgKTsKKworICBpZihscEZpbGVuYW1lICYmIG5TaXplKQorICAgIGxwRmlsZW5hbWVbMF0gPSAnXDAnOworCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXREZXZpY2VEcml2ZXJGaWxlTmFtZTMyVyAoUFNBUEkuOCkKKyAqLworRFdPUkQgV0lOQVBJIEdldERldmljZURyaXZlckZpbGVOYW1lMzJXKAorICBMUFZPSUQgSW1hZ2VCYXNlLCBMUFdTVFIgbHBGaWxlbmFtZSwgRFdPUkQgblNpemUpCit7CisgIEZJWE1FKHBzYXBpLCAiKCVwLCAlcywgJWxkKTogc3R1YlxuIiwKKyAgICBJbWFnZUJhc2UsIGRlYnVnc3RyX3cobHBGaWxlbmFtZSksIG5TaXplCisgICk7CisKKyAgaWYobHBGaWxlbmFtZSAmJiBuU2l6ZSkKKyAgICBscEZpbGVuYW1lWzBdID0gJ1wwJzsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0TWFwcGVkRmlsZU5hbWUzMkEgKFBTQVBJLjkpCisgKi8KK0RXT1JEIFdJTkFQSSBHZXRNYXBwZWRGaWxlTmFtZTMyQSgKKyAgSEFORExFMzIgaFByb2Nlc3MsIExQVk9JRCBscHYsIExQU1RSIGxwRmlsZW5hbWUsIERXT1JEIG5TaXplKQoreworICBGSVhNRShwc2FwaSwgIihoUHJvY2Vzcz0weCUwOHgsICVwLCAlcywgJWxkKTogc3R1YlxuIiwKKyAgICBoUHJvY2VzcywgbHB2LCBkZWJ1Z3N0cl9hKGxwRmlsZW5hbWUpLCBuU2l6ZQorICApOworCisgIGlmKGxwRmlsZW5hbWUgJiYgblNpemUpCisgICAgbHBGaWxlbmFtZVswXSA9ICdcMCc7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldE1hcHBlZEZpbGVOYW1lMzJXIChQU0FQSS4xMCkKKyAqLworRFdPUkQgV0lOQVBJIEdldE1hcHBlZEZpbGVOYW1lMzJXKAorICBIQU5ETEUzMiBoUHJvY2VzcywgTFBWT0lEIGxwdiwgTFBXU1RSIGxwRmlsZW5hbWUsIERXT1JEIG5TaXplKQoreworICBGSVhNRShwc2FwaSwgIihoUHJvY2Vzcz0weCUwOHgsICVwLCAlcywgJWxkKTogc3R1YlxuIiwKKyAgICBoUHJvY2VzcywgbHB2LCBkZWJ1Z3N0cl93KGxwRmlsZW5hbWUpLCBuU2l6ZQorICApOworCisgIGlmKGxwRmlsZW5hbWUgJiYgblNpemUpCisgICAgbHBGaWxlbmFtZVswXSA9ICdcMCc7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldE1vZHVsZUJhc2VOYW1lMzJBIChQU0FQSS4xMSkKKyAqLworRFdPUkQgV0lOQVBJIEdldE1vZHVsZUJhc2VOYW1lMzJBKAorICBIQU5ETEUzMiBoUHJvY2VzcywgSE1PRFVMRTMyIGhNb2R1bGUsIExQU1RSIGxwQmFzZU5hbWUsIERXT1JEIG5TaXplKQoreworICBGSVhNRShwc2FwaSwgIihoUHJvY2Vzcz0weCUwOHgsIGhNb2R1bGU9MHglMDh4LCAlcywgJWxkKTogc3R1YlxuIiwKKyAgICBoUHJvY2VzcywgaE1vZHVsZSwgZGVidWdzdHJfYShscEJhc2VOYW1lKSwgblNpemUKKyAgKTsKKworICBpZihscEJhc2VOYW1lICYmIG5TaXplKQorICAgIGxwQmFzZU5hbWVbMF0gPSAnXDAnOworCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRNb2R1bGVCYXNlTmFtZTMyVyAoUFNBUEkuMTIpCisgKi8KK0RXT1JEIFdJTkFQSSBHZXRNb2R1bGVCYXNlTmFtZTMyVygKKyAgSEFORExFMzIgaFByb2Nlc3MsIEhNT0RVTEUzMiBoTW9kdWxlLCBMUFdTVFIgbHBCYXNlTmFtZSwgRFdPUkQgblNpemUpCit7CisgIEZJWE1FKHBzYXBpLCAiKGhQcm9jZXNzPTB4JTA4eCwgaE1vZHVsZT0weCUwOHgsICVzLCAlbGQpOiBzdHViXG4iLAorICAgIGhQcm9jZXNzLCBoTW9kdWxlLCBkZWJ1Z3N0cl93KGxwQmFzZU5hbWUpLCBuU2l6ZSk7CisKKyAgaWYobHBCYXNlTmFtZSAmJiBuU2l6ZSkKKyAgICBscEJhc2VOYW1lWzBdID0gJ1wwJzsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0TW9kdWxlRmlsZU5hbWVFeDMyQSAoUFNBUEkuMTMpCisgKi8KK0RXT1JEIFdJTkFQSSBHZXRNb2R1bGVGaWxlTmFtZUV4MzJBKAorICBIQU5ETEUzMiBoUHJvY2VzcywgSE1PRFVMRTMyIGhNb2R1bGUsIExQU1RSIGxwRmlsZW5hbWUsIERXT1JEIG5TaXplKQoreworICBGSVhNRShwc2FwaSwgIihoUHJvY2Vzcz0weCUwOHgsaE1vZHVsZT0weCUwOHgsICVzLCAlbGQpOiBzdHViXG4iLAorICAgIGhQcm9jZXNzLCBoTW9kdWxlLCBkZWJ1Z3N0cl9hKGxwRmlsZW5hbWUpLCBuU2l6ZQorICApOworCisgIGlmKGxwRmlsZW5hbWUmJm5TaXplKQorICAgIGxwRmlsZW5hbWVbMF09J1wwJzsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0TW9kdWxlRmlsZU5hbWVFeDMyVyAoUFNBUEkuMTQpCisgKi8KK0RXT1JEIFdJTkFQSSBHZXRNb2R1bGVGaWxlTmFtZUV4MzJXKAorICBIQU5ETEUzMiBoUHJvY2VzcywgSE1PRFVMRTMyIGhNb2R1bGUsIExQV1NUUiBscEZpbGVuYW1lLCBEV09SRCBuU2l6ZSkKK3sKKyAgRklYTUUocHNhcGksICIoaFByb2Nlc3M9MHglMDh4LGhNb2R1bGU9MHglMDh4LCAlcywgJWxkKTogc3R1YlxuIiwKKyAgICBoUHJvY2VzcywgaE1vZHVsZSwgZGVidWdzdHJfdyhscEZpbGVuYW1lKSwgblNpemUKKyAgKTsKKworICBpZihscEZpbGVuYW1lICYmIG5TaXplKQorICAgIGxwRmlsZW5hbWVbMF0gPSAnXDAnOworCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRNb2R1bGVJbmZvcm1hdGlvbjMyIChQU0FQSS4xNSkKKyAqLworQk9PTDMyIFdJTkFQSSBHZXRNb2R1bGVJbmZvcm1hdGlvbjMyKAorICBIQU5ETEUzMiBoUHJvY2VzcywgSE1PRFVMRTMyIGhNb2R1bGUsIExQTU9EVUxFSU5GTzMyIGxwbW9kaW5mbywgRFdPUkQgY2IpCit7CisgIEZJWE1FKHBzYXBpLCAiKGhQcm9jZXNzPTB4JTA4eCwgaE1vZHVsZT0weCUwOHgsICVwLCAlbGQpOiBzdHViXG4iLAorICAgIGhQcm9jZXNzLCBoTW9kdWxlLCBscG1vZGluZm8sIGNiCisgICk7CisKKyAgbWVtc2V0KGxwbW9kaW5mbywgMCwgY2IpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQcm9jZXNzTWVtb3J5SW5mbzMyIChQU0FQSS4xNikKKyAqLworQk9PTDMyIFdJTkFQSSBHZXRQcm9jZXNzTWVtb3J5SW5mbzMyKAorICBIQU5ETEUzMiBQcm9jZXNzLCBQUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMzMiBwcHNtZW1Db3VudGVycywgRFdPUkQgY2IpCit7CisgIEZJWE1FKHBzYXBpLCAiKGhQcm9jZXNzPTB4JTA4eCwgJXAsICVsZCk6IHN0dWJcbiIsCisgICAgUHJvY2VzcywgcHBzbWVtQ291bnRlcnMsIGNiCisgICk7CisKKyAgbWVtc2V0KHBwc21lbUNvdW50ZXJzLCAwLCBjYik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFdzQ2hhbmdlczMyIChQU0FQSS4xNykKKyAqLworQk9PTDMyIFdJTkFQSSBHZXRXc0NoYW5nZXMzMigKKyAgSEFORExFMzIgaFByb2Nlc3MsIFBQU0FQSV9XU19XQVRDSF9JTkZPUk1BVElPTjMyIGxwV2F0Y2hJbmZvLCBEV09SRCBjYikKK3sKKyAgRklYTUUocHNhcGksICIoaFByb2Nlc3M9MHglMDh4LCAlcCwgJWxkKTogc3R1YlxuIiwKKyAgICBoUHJvY2VzcywgbHBXYXRjaEluZm8sIGNiCisgICk7CisKKyAgbWVtc2V0KGxwV2F0Y2hJbmZvLCAwLCBjYik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEluaXRpYWxpemVQcm9jZXNzRm9yV3NXYXRjaDMyIChQU0FQSS4xOCkKKyAqLworQk9PTDMyIFdJTkFQSSBJbml0aWFsaXplUHJvY2Vzc0ZvcldzV2F0Y2gzMihIQU5ETEUzMiBoUHJvY2VzcykKK3sKKyAgRklYTUUocHNhcGksICIoaFByb2Nlc3M9MHglMDh4KTogc3R1YlxuIiwgaFByb2Nlc3MpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBRdWVyeVdvcmtpbmdTZXQzMiAoUFNBUEkuPykKKyAqIEZJWE1FCisgKiAgICAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byBmaW5kIHRoZSBvcmRpbmFsIGZvciB0aGlzIGZ1bmN0aW9uLAorICogICAgIFRoaXMgbWVhbnMgaXQgY2FuJ3QgYmUgY2FsbGVkIGZyb20gb3V0c2lkZSB0aGUgRExMLgorICovCitCT09MMzIgV0lOQVBJIFF1ZXJ5V29ya2luZ1NldDMyKEhBTkRMRTMyIGhQcm9jZXNzLCBMUFZPSUQgcHYsIERXT1JEIGNiKQoreworICBGSVhNRShwc2FwaSwgIihoUHJvY2Vzcz0weCUwOHgsICVwLCAlbGQpIiwgaFByb2Nlc3MsIHB2LCBjYik7CisKKyAgaWYocHYgJiYgY2IpCisgICAgKChEV09SRCAqKSBwdilbMF0gPSAwOyAvKiBFbXB0eSBXb3JraW5nU2V0ICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL01ha2VmaWxlLmluIGIvZGxscy9zaGVsbDMyL01ha2VmaWxlLmluCmluZGV4IDJhN2YyMDQuLjZhNTgxMTkgMTAwNjQ0Ci0tLSBhL2RsbHMvc2hlbGwzMi9NYWtlZmlsZS5pbgorKysgYi9kbGxzL3NoZWxsMzIvTWFrZWZpbGUuaW4KQEAgLTgsNiArOCw3IEBACiAKIENfU1JDUyA9IFwKIAljb250bWVudS5jIFwKKwlkYXRhb2JqZWN0LmMgXAogCWVudW1pZGxpc3QuYyBcCiAJZm9sZGVycy5jIFwKIAlwaWRsLmMgXApkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL2NvbnRtZW51LmMgYi9kbGxzL3NoZWxsMzIvY29udG1lbnUuYwppbmRleCA5YWE3NThjLi45YmNhNjI2IDEwMDY0NAotLS0gYS9kbGxzL3NoZWxsMzIvY29udG1lbnUuYworKysgYi9kbGxzL3NoZWxsMzIvY29udG1lbnUuYwpAQCAtMTAsMTEgKzEwLDYgQEAKICNpbmNsdWRlICJzaGxvYmouaCIKICNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKIAotI2RlZmluZSBJRE1fRVhQTE9SRSAgMAotI2RlZmluZSBJRE1fT1BFTiAgICAgMQotI2RlZmluZSBJRE1fUkVOQU1FICAgMgotI2RlZmluZSBJRE1fTEFTVCAgICAgSURNX1JFTkFNRQotCiAjZGVmaW5lIF9fVCh4KSAgICAgIHgKICNkZWZpbmUgX1QoeCkgICAgICAgX19UKHgpCiAjZGVmaW5lIFRFWFQgICAgICAgIF9UCkBAIC0xMzIsOCArMTI3LDI2IEBACiAJVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLGNtKTsKIAlyZXR1cm4gY207CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElDTV9JbnNlcnRJdGVtKCkKKyovIAorc3RhdGljIHZvaWQgSUNNX0luc2VydEl0ZW0gKEhNRU5VMzIgaG1lbnUsIFVJTlQzMiBpbmRleE1lbnUsIFVJTlQzMiB3SUQsIFVJTlQzMiBmVHlwZSwgTFBTVFIgZHdUeXBlRGF0YSwgVUlOVDMyIGZTdGF0ZSkKK3sJTUVOVUlURU1JTkZPMzJBCW1paTsKIAotCisJWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisJbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOworCWlmIChmVHlwZSA9PSBNRlRfU0VQQVJBVE9SKQorCXsgbWlpLmZNYXNrID0gTUlJTV9JRCB8IE1JSU1fVFlQRTsKKwl9CisJZWxzZQorCXsgbWlpLmZNYXNrID0gTUlJTV9JRCB8IE1JSU1fVFlQRSB8IE1JSU1fU1RBVEU7CisJICBtaWkuZHdUeXBlRGF0YSA9IGR3VHlwZURhdGE7CisJICBtaWkuZlN0YXRlID0gTUZTX0VOQUJMRUQgfCBNRlNfREVGQVVMVDsKKwl9CisJbWlpLndJRCA9IHdJRDsKKwltaWkuZlR5cGUgPSBmVHlwZTsKKwlJbnNlcnRNZW51SXRlbTMyQSggaG1lbnUsIGluZGV4TWVudSwgVFJVRSwgJm1paSk7Cit9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUNvbnRleHRNZW51X1F1ZXJ5Q29udGV4dE1lbnUoKQogKi8KQEAgLTE0MSw3MSArMTU0LDI4IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgIElDb250ZXh0TWVudV9RdWVyeUNvbnRleHRNZW51KCBMUENPTlRFWFRNRU5VIHRoaXMsIEhNRU5VMzIgaG1lbnUsCiAJCQkJCQkJVUlOVDMyIGluZGV4TWVudSxVSU5UMzIgaWRDbWRGaXJzdCxVSU5UMzIgaWRDbWRMYXN0LFVJTlQzMiB1RmxhZ3MpCiB7CUJPT0wzMgkJCWZFeHBsb3JlIDsKLQlNRU5VSVRFTUlORk8zMkEJbWlpOwogCiAJVFJBQ0Uoc2hlbGwsIiglcCktPihobWVudT0leCBpbmRleG1lbnU9JXggY21kZmlyc3Q9JXggY21kbGFzdD0leCBmbGFncz0leCApXG4iLHRoaXMsIGhtZW51LCBpbmRleE1lbnUsIGlkQ21kRmlyc3QsIGlkQ21kTGFzdCwgdUZsYWdzKTsKKwogCWlmKCEoQ01GX0RFRkFVTFRPTkxZICYgdUZsYWdzKSkKIAl7IGlmKCF0aGlzLT5iQWxsVmFsdWVzKQotICAgICAgeyBmRXhwbG9yZSA9IHVGbGFncyAmIENNRl9FWFBMT1JFOwotICAgICAgICBpZihmRXhwbG9yZSkKLSAgICAgICAgeyBaZXJvTWVtb3J5KCZtaWksIHNpemVvZihtaWkpKTsKLSAgICAgICAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7Ci0gICAgICAgICAgbWlpLmZNYXNrID0gTUlJTV9JRCB8IE1JSU1fVFlQRSB8IE1JSU1fU1RBVEU7Ci0gICAgICAgICAgbWlpLndJRCA9IGlkQ21kRmlyc3QgKyBJRE1fRVhQTE9SRTsKLSAgICAgICAgICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOwotICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gVEVYVCgiJkV4cGxvcmUiKTsKLSAgICAgICAgICBtaWkuZlN0YXRlID0gTUZTX0VOQUJMRUQgfCBNRlNfREVGQVVMVDsKLSAgICAgICAgICBJbnNlcnRNZW51SXRlbTMyQSggaG1lbnUsIGluZGV4TWVudSsrLCBUUlVFLCAmbWlpKTsKKwkgIHsgZkV4cGxvcmUgPSB1RmxhZ3MgJiBDTUZfRVhQTE9SRTsKKwkgICAgaWYoZkV4cGxvcmUpCisJICAgIHsgSUNNX0luc2VydEl0ZW0oaG1lbnUsIGluZGV4TWVudSsrLCBpZENtZEZpcnN0K0lETV9FWFBMT1JFLCBNRlRfU1RSSU5HLCBURVhUKCImRXhwbG9yZSIpLCBNRlNfRU5BQkxFRHxNRlNfREVGQVVMVCk7CisJICAgICAgSUNNX0luc2VydEl0ZW0oaG1lbnUsIGluZGV4TWVudSsrLCBpZENtZEZpcnN0K0lETV9PUEVOLCBNRlRfU1RSSU5HLCBURVhUKCImT3BlbiIpLCBNRlNfRU5BQkxFRCk7CisJICAgIH0KKwkgICAgZWxzZQorICAgICAgICAgICAgeyBJQ01fSW5zZXJ0SXRlbShobWVudSwgaW5kZXhNZW51KyssIGlkQ21kRmlyc3QrSURNX09QRU4sIE1GVF9TVFJJTkcsIFRFWFQoIiZPcGVuIiksIE1GU19FTkFCTEVEfE1GU19ERUZBVUxUKTsKKwkgICAgICBJQ01fSW5zZXJ0SXRlbShobWVudSwgaW5kZXhNZW51KyssIGlkQ21kRmlyc3QrSURNX0VYUExPUkUsIE1GVF9TVFJJTkcsIFRFWFQoIiZFeHBsb3JlIiksIE1GU19FTkFCTEVEKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgIFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOwotICAgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKLSAgICAgICAgICBtaWkuZk1hc2sgPSBNSUlNX0lEIHwgTUlJTV9UWVBFIHwgTUlJTV9TVEFURTsKLSAgICAgICAgICBtaWkud0lEID0gaWRDbWRGaXJzdCArIElETV9PUEVOOwotICAgICAgICAgIG1paS5mVHlwZSA9IE1GVF9TVFJJTkc7Ci0gICAgICAgICAgbWlpLmR3VHlwZURhdGEgPSBURVhUKCImT3BlbiIpOwotICAgICAgICAgIG1paS5mU3RhdGUgPSBNRlNfRU5BQkxFRDsKLSAgICAgICAgICBJbnNlcnRNZW51SXRlbTMyQSggaG1lbnUsIGluZGV4TWVudSsrLCBUUlVFLCAmbWlpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7Ci0gICAgICAgICAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOwotICAgICAgICAgIG1paS5mTWFzayA9IE1JSU1fSUQgfCBNSUlNX1RZUEUgfCBNSUlNX1NUQVRFOwotICAgICAgICAgIG1paS53SUQgPSBpZENtZEZpcnN0ICsgSURNX09QRU47Ci0gICAgICAgICAgbWlpLmZUeXBlID0gTUZUX1NUUklORzsKLSAgICAgICAgICBtaWkuZHdUeXBlRGF0YSA9IFRFWFQoIiZPcGVuIik7Ci0gICAgICAgICAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEIHwgTUZTX0RFRkFVTFQ7Ci0gICAgICAgICAgSW5zZXJ0TWVudUl0ZW0zMkEoIGhtZW51LCBpbmRleE1lbnUrKywgVFJVRSwgJm1paSk7Ci0KLSAgICAgICAgICBaZXJvTWVtb3J5KCZtaWksIHNpemVvZihtaWkpKTsKLSAgICAgICAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7Ci0gICAgICAgICAgbWlpLmZNYXNrID0gTUlJTV9JRCB8IE1JSU1fVFlQRSB8IE1JSU1fU1RBVEU7Ci0gICAgICAgICAgbWlpLndJRCA9IGlkQ21kRmlyc3QgKyBJRE1fRVhQTE9SRTsKLSAgICAgICAgICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOwotICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gVEVYVCgiJkV4cGxvcmUiKTsKLSAgICAgICAgICBtaWkuZlN0YXRlID0gTUZTX0VOQUJMRUQ7Ci0gICAgICAgICAgSW5zZXJ0TWVudUl0ZW0zMkEoIGhtZW51LCBpbmRleE1lbnUrKywgVFJVRSwgJm1paSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih1RmxhZ3MgJiBDTUZfQ0FOUkVOQU1FKQotICAgICAgICB7IFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOwotICAgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKLSAgICAgICAgICBtaWkuZk1hc2sgPSBNSUlNX0lEIHwgTUlJTV9UWVBFOwotICAgICAgICAgIG1paS53SUQgPSAwOwotICAgICAgICAgIG1paS5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgICAgICAgSW5zZXJ0TWVudUl0ZW0zMkEoIGhtZW51LCBpbmRleE1lbnUrKywgVFJVRSwgJm1paSk7Ci0gCi0gICAgICAgICAgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7Ci0gICAgICAgICAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOwotICAgICAgICAgIG1paS5mTWFzayA9IE1JSU1fSUQgfCBNSUlNX1RZUEUgfCBNSUlNX1NUQVRFOwotICAgICAgICAgIG1paS53SUQgPSBpZENtZEZpcnN0ICsgSURNX1JFTkFNRTsKLSAgICAgICAgICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOwotICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gVEVYVCgiJlJlbmFtZSIpOwotICAgICAgICAgIG1paS5mU3RhdGUgPSAoSUNvbnRleHRNZW51X0NhblJlbmFtZUl0ZW1zKHRoaXMpID8gTUZTX0VOQUJMRUQgOiBNRlNfRElTQUJMRUQpOwotICAgICAgICAgIEluc2VydE1lbnVJdGVtMzJBKCBobWVudSwgaW5kZXhNZW51KyssIFRSVUUsICZtaWkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gTUFLRV9IUkVTVUxUKFNFVkVSSVRZX1NVQ0NFU1MsIDAsIChJRE1fTEFTVCArIDEpKTsKLSAgICB9CisgICAgICAgICAgICBpZih1RmxhZ3MgJiBDTUZfQ0FOUkVOQU1FKQorICAgICAgICAgICAgeyBJQ01fSW5zZXJ0SXRlbShobWVudSwgaW5kZXhNZW51KyssIDAsIE1GVF9TRVBBUkFUT1IsIE5VTEwsIDApOworCSAgICAgIElDTV9JbnNlcnRJdGVtKGhtZW51LCBpbmRleE1lbnUrKywgaWRDbWRGaXJzdCtJRE1fUkVOQU1FLCBNRlRfU1RSSU5HLCBURVhUKCImUmVuYW1lIiksIChJQ29udGV4dE1lbnVfQ2FuUmVuYW1lSXRlbXModGhpcykgPyBNRlNfRU5BQkxFRCA6IE1GU19ESVNBQkxFRCkpOworCSAgICB9CisJICB9CisJICByZXR1cm4gTUFLRV9IUkVTVUxUKFNFVkVSSVRZX1NVQ0NFU1MsIDAsIChJRE1fTEFTVCArIDEpKTsKKwl9CiAJcmV0dXJuIE1BS0VfSFJFU1VMVChTRVZFUklUWV9TVUNDRVNTLCAwLCAwKTsKIH0KIApAQCAtMjMwLDQxICsyMDAsNDEgQEAKIAlzd2l0Y2goTE9XT1JEKGxwY21pLT5scFZlcmIpKQogCXsgY2FzZSBJRE1fRVhQTE9SRToKIAkgIGNhc2UgSURNX09QRU46Ci0gICAgICAgIC8qIEZpbmQgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QgdGhhdCBpcyBub3QgYSB2YWx1ZS4gVGhlc2UgY29tbWFuZHMgCi0gICAgICAJc2hvdWxkIG5ldmVyIGJlIGludm9rZWQgaWYgdGhlcmUgaXNuJ3QgYXQgbGVhc3Qgb25lIGtleSBpdGVtIGluIHRoZSBsaXN0LiovCisgICAgICAgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IHRoYXQgaXMgbm90IGEgdmFsdWUuIFRoZXNlIGNvbW1hbmRzIAorICAgICAgCSAgICBzaG91bGQgbmV2ZXIgYmUgaW52b2tlZCBpZiB0aGVyZSBpc24ndCBhdCBsZWFzdCBvbmUgZm9sZGVyIGl0ZW0gaW4gdGhlIGxpc3QuKi8KIAotICAgICAgICBmb3IoaSA9IDA7IHRoaXMtPmFQaWRsc1tpXTsgaSsrKQorCSAgICBmb3IoaSA9IDA7IHRoaXMtPmFQaWRsc1tpXTsgaSsrKQogCSAgICB7IGlmKCFfSUxJc1ZhbHVlKHRoaXMtPmFQaWRsc1tpXSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICB9CiAgICAgICAKLQkJcGlkbFRlbXAgPSBJTENvbWJpbmUodGhpcy0+cFNGUGFyZW50LT5tcGlkbCwgdGhpcy0+YVBpZGxzW2ldKTsKLQkJcGlkbEZRID0gSUxDb21iaW5lKHRoaXMtPnBTRlBhcmVudC0+bXBpZGxOU1Jvb3QsIHBpZGxUZW1wKTsKLQkJU0hGcmVlKHBpZGxUZW1wKTsKKwkgICAgcGlkbFRlbXAgPSBJTENvbWJpbmUodGhpcy0+cFNGUGFyZW50LT5tcGlkbCwgdGhpcy0+YVBpZGxzW2ldKTsKKwkgICAgcGlkbEZRID0gSUxDb21iaW5lKHRoaXMtPnBTRlBhcmVudC0+bXBpZGxOU1Jvb3QsIHBpZGxUZW1wKTsKKwkgICAgU0hGcmVlKHBpZGxUZW1wKTsKICAgICAgIAotCQlaZXJvTWVtb3J5KCZzZWksIHNpemVvZihzZWkpKTsKLQkJc2VpLmNiU2l6ZSA9IHNpemVvZihzZWkpOwotCQlzZWkuZk1hc2sgPSBTRUVfTUFTS19JRExJU1QgfCBTRUVfTUFTS19DTEFTU05BTUU7Ci0JCXNlaS5scElETGlzdCA9IHBpZGxGUTsKLQkJc2VpLmxwQ2xhc3MgPSBURVhUKCJmb2xkZXIiKTsKLQkJc2VpLmh3bmQgPSBscGNtaS0+aHduZDsKLQkJc2VpLm5TaG93ID0gU1dfU0hPV05PUk1BTDsKKwkgICAgWmVyb01lbW9yeSgmc2VpLCBzaXplb2Yoc2VpKSk7CisJICAgIHNlaS5jYlNpemUgPSBzaXplb2Yoc2VpKTsKKwkgICAgc2VpLmZNYXNrID0gU0VFX01BU0tfSURMSVNUIHwgU0VFX01BU0tfQ0xBU1NOQU1FOworCSAgICBzZWkubHBJRExpc3QgPSBwaWRsRlE7CisJICAgIHNlaS5scENsYXNzID0gVEVYVCgiZm9sZGVyIik7CisJICAgIHNlaS5od25kID0gbHBjbWktPmh3bmQ7CisJICAgIHNlaS5uU2hvdyA9IFNXX1NIT1dOT1JNQUw7CiAgICAgICAKLQkJaWYoTE9XT1JEKGxwY21pLT5scFZlcmIpID09IElETV9FWFBMT1JFKQorCSAgICBpZihMT1dPUkQobHBjbWktPmxwVmVyYikgPT0gSURNX0VYUExPUkUpCiAJICAgIHsgc2VpLmxwVmVyYiA9IFRFWFQoImV4cGxvcmUiKTsKLSAgICAgICAgfQotCQllbHNlCi0gICAgICAgIHsgc2VpLmxwVmVyYiA9IFRFWFQoIm9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICBTaGVsbEV4ZWN1dGVFeDMyQSgmc2VpKTsKLQkJU0hGcmVlKHBpZGxGUSk7Ci0gICAgICAgIGJyZWFrOwotCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7IHNlaS5scFZlcmIgPSBURVhUKCJvcGVuIik7CisJICAgIH0KKwkgICAgU2hlbGxFeGVjdXRlRXgzMkEoJnNlaSk7CisJICAgIFNIRnJlZShwaWRsRlEpOworCSAgICBicmVhazsKKwkJCiAJICBjYXNlIElETV9SRU5BTUU6Ci0gICAgICAgIE1lc3NhZ2VCZWVwMzIoTUJfT0spOwotICAgICAgICAvKmhhbmRsZSByZW5hbWUgZm9yIHRoZSB2aWV3IGhlcmUqLwotICAgICAgICBicmVhazsKLSAgIAl9CisJICAgIE1lc3NhZ2VCZWVwMzIoTUJfT0spOworCSAgICAvKmhhbmRsZSByZW5hbWUgZm9yIHRoZSB2aWV3IGhlcmUqLworCSAgICBicmVhazsKKwl9CiAJcmV0dXJuIE5PRVJST1I7CiB9CiAKQEAgLTM2MSw5ICszMzEsOSBAQAogCVRSQUNFKHNoZWxsLCIoJXApLT4oYXBpZGw9JXAgY291bnQ9JXUpXG4iLHRoaXMsIGFQaWRscywgdUl0ZW1Db3VudCk7CiAJaWYodGhpcy0+YVBpZGxzKQogCXsgZm9yKGkgPSAwOyBpIDwgdUl0ZW1Db3VudDsgaSsrKQotICAgICAgeyB0aGlzLT5hUGlkbHNbaV0gPSBJTENsb25lKGFQaWRsc1tpXSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gVFJVRTsKKwkgIHsgdGhpcy0+YVBpZGxzW2ldID0gSUxDbG9uZShhUGlkbHNbaV0pOworCSAgfQorCSAgcmV0dXJuIFRSVUU7CiAgCX0KIAlyZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9kbGxzL3NoZWxsMzIvZGF0YW9iamVjdC5jIGIvZGxscy9zaGVsbDMyL2RhdGFvYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWY3OTBmCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9zaGVsbDMyL2RhdGFvYmplY3QuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqCUlFbnVtRk9STUFURVRDLCBJRGF0YU9iamVjdAorICoKKyAqIHNlbGVjdGluZyBhbmQgZHJvcGluZyBvYmplY3RzIHdpdGhpbiB0aGUgc2hlbGwgYW5kL29yIGNvbW1vbiBkaWFsb2dzCisgKgorICoJQ29weXJpZ2h0IDE5OTgJPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KKyAqLworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAic2hsb2JqLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIElFbnVtRk9STUFURVRDIGltcGxlbWVudGF0aW9uCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtRk9STUFURVRDX1F1ZXJ5SW50ZXJmYWNlIChMUEVOVU1GT1JNQVRFVEMgdGhpcywgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElFbnVtRk9STUFURVRDX0FkZFJlZiAoTFBFTlVNRk9STUFURVRDIHRoaXMpOworc3RhdGljIFVMT05HIFdJTkFQSSBJRW51bUZPUk1BVEVUQ19SZWxlYXNlIChMUEVOVU1GT1JNQVRFVEMgdGhpcyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1GT1JNQVRFVENfTmV4dChMUEVOVU1GT1JNQVRFVEMgdGhpcywgVUxPTkcgY2VsdCwgRk9STUFURVRDMzIgKnJnZWx0LCBVTE9ORyAqcGNlbHRGZXRoZWQpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtRk9STUFURVRDX1NraXAoTFBFTlVNRk9STUFURVRDIHRoaXMsIFVMT05HIGNlbHQpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtRk9STUFURVRDX1Jlc2V0KExQRU5VTUZPUk1BVEVUQyB0aGlzKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bUZPUk1BVEVUQ19DbG9uZShMUEVOVU1GT1JNQVRFVEMgdGhpcywgTFBFTlVNRk9STUFURVRDKiBwcGVudW0pOworCitzdGF0aWMgc3RydWN0IElFbnVtRk9STUFURVRDX1ZUYWJsZSBlZnZ0ID0gCit7CUlFbnVtRk9STUFURVRDX1F1ZXJ5SW50ZXJmYWNlLAorCUlFbnVtRk9STUFURVRDX0FkZFJlZiwKKwlJRW51bUZPUk1BVEVUQ19SZWxlYXNlLAorCUlFbnVtRk9STUFURVRDX05leHQsCisJSUVudW1GT1JNQVRFVENfU2tpcCwKKwlJRW51bUZPUk1BVEVUQ19SZXNldCwKKwlJRW51bUZPUk1BVEVUQ19DbG9uZQorfTsKKworZXh0ZXJuIExQRU5VTUZPUk1BVEVUQyBJRW51bUZPUk1BVEVUQ19Db25zdHJ1Y3RvcihVSU5UMzIgY2ZtdCwgY29uc3QgRk9STUFURVRDMzIgYWZtdFtdKQorewlMUEVOVU1GT1JNQVRFVEMgZWY7CisJRFdPUkQgc2l6ZT1jZm10ICogc2l6ZW9mKEZPUk1BVEVUQzMyKTsKKwkKKwllZj0oTFBFTlVNRk9STUFURVRDKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElFbnVtRk9STUFURVRDKSk7CisJZWYtPnJlZj0xOworCWVmLT5scHZ0Ymw9JmVmdnQ7CisKKwllZi0+cG9zRm10ID0gMDsKKwllZi0+Y291bnRGbXQgPSBjZm10OworCWVmLT5wRm10ID0gU0hBbGxvYyAoc2l6ZSk7CisKKwlpZiAoZWYtPnBGbXQpCisJeyBtZW1jcHkoZWYtPnBGbXQsIGFmbXQsIHNpemUpOworCX0KKworCVRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIixlZik7CisJcmV0dXJuIGVmOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtRk9STUFURVRDX1F1ZXJ5SW50ZXJmYWNlIChMUEVOVU1GT1JNQVRFVEMgdGhpcywgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikKK3sJY2hhciAgICB4cmlpZFs1MF07CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CisJVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKKworCQkJKnBwdk9iaiA9IE5VTEw7CisKKwlpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKQorCXsgKnBwdk9iaiA9IHRoaXM7IAorCX0KKwllbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JRW51bUZPUk1BVEVUQykpCisJeyAqcHB2T2JqID0gKElEYXRhT2JqZWN0Kil0aGlzOworCX0gICAKKworCWlmKCpwcHZPYmopCisJeyAoKihMUEVOVU1GT1JNQVRFVEMqKXBwdk9iaiktPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7ICAgICAgCisJICBUUkFDRShzaGVsbCwiLS0gSW50ZXJmYWNlOiAoJXApLT4oJXApXG4iLHBwdk9iaiwqcHB2T2JqKTsKKwkgIHJldHVybiBTX09LOworCX0KKwlUUkFDRShzaGVsbCwiLS0gSW50ZXJmYWNlOiBFX05PSU5URVJGQUNFXG4iKTsKKwlyZXR1cm4gRV9OT0lOVEVSRkFDRTsKKworfQorc3RhdGljIFVMT05HIFdJTkFQSSBJRW51bUZPUk1BVEVUQ19BZGRSZWYgKExQRU5VTUZPUk1BVEVUQyB0aGlzKQorewlUUkFDRShzaGVsbCwiKCVwKS0+KGNvdW50PSVsdSlcbiIsdGhpcywodGhpcy0+cmVmKSsxKTsKKwlyZXR1cm4gKysodGhpcy0+cmVmKTsKK30KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSUVudW1GT1JNQVRFVENfUmVsZWFzZSAoTFBFTlVNRk9STUFURVRDIHRoaXMpCit7CVRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKKwlpZiAoIS0tKHRoaXMtPnJlZikpIAorCXsgVFJBQ0Uoc2hlbGwsIiBkZXN0cm95aW5nIElFbnVtRk9STUFURVRDKCVwKVxuIix0aGlzKTsKKwkgIGlmICh0aGlzLT5wRm10KQorCSAgeyBTSEZyZWUgKHRoaXMtPnBGbXQpOworCSAgfQorCSAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCSAgcmV0dXJuIDA7CisJfQorCXJldHVybiB0aGlzLT5yZWY7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1GT1JNQVRFVENfTmV4dChMUEVOVU1GT1JNQVRFVEMgdGhpcywgVUxPTkcgY2VsdCwgRk9STUFURVRDMzIgKnJnZWx0LCBVTE9ORyAqcGNlbHRGZXRoZWQpCit7CVVJTlQzMiBjZmV0Y2g7CisJSFJFU1VMVCBocmVzID0gU19GQUxTRTsKKworCVRSQUNFIChzaGVsbCwgIiglcCktPigpXG4iLCB0aGlzKTsKKworICAgICAgICBpZiAodGhpcy0+cG9zRm10IDwgdGhpcy0+Y291bnRGbXQpCisgICAgICAgIHsgY2ZldGNoID0gdGhpcy0+Y291bnRGbXQgLSB0aGlzLT5wb3NGbXQ7CisJICBpZiAoY2ZldGNoID49IGNlbHQpCisJICB7IGNmZXRjaCA9IGNlbHQ7CisJICAgIGhyZXMgPSBTX09LOworCSAgfQorCSAgbWVtY3B5KHJnZWx0LCAmdGhpcy0+cEZtdFt0aGlzLT5wb3NGbXRdLCBjZmV0Y2ggKiBzaXplb2YoRk9STUFURVRDMzIpKTsKKwkgIHRoaXMtPnBvc0ZtdCArPSBjZmV0Y2g7CisJfQorCWVsc2UKKwl7IGNmZXRjaCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGNlbHRGZXRoZWQpCisgICAgICAgIHsgKnBjZWx0RmV0aGVkID0gY2ZldGNoOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhyZXM7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1GT1JNQVRFVENfU2tpcChMUEVOVU1GT1JNQVRFVEMgdGhpcywgVUxPTkcgY2VsdCkKK3sJRklYTUUgKHNoZWxsLCAiKCVwKS0+KG51bT0lbHUpXG4iLCB0aGlzLCBjZWx0KTsKKworCXRoaXMtPnBvc0ZtdCArPSBjZWx0OworCWlmICh0aGlzLT5wb3NGbXQgPiB0aGlzLT5jb3VudEZtdCkKKyAgICAgICAgeyB0aGlzLT5wb3NGbXQgPSB0aGlzLT5jb3VudEZtdDsKKwkgIHJldHVybiBTX0ZBTFNFOworCX0KKwlyZXR1cm4gU19PSzsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bUZPUk1BVEVUQ19SZXNldChMUEVOVU1GT1JNQVRFVEMgdGhpcykKK3sJRklYTUUgKHNoZWxsLCAiKCVwKS0+KClcbiIsIHRoaXMpOworCisgICAgICAgIHRoaXMtPnBvc0ZtdCA9IDA7CisgICAgICAgIHJldHVybiBTX09LOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtRk9STUFURVRDX0Nsb25lKExQRU5VTUZPUk1BVEVUQyB0aGlzLCBMUEVOVU1GT1JNQVRFVEMqIHBwZW51bSkKK3sJRklYTUUgKHNoZWxsLCAiKCVwKS0+KHBwZW51bT0lcClcbiIsIHRoaXMsIHBwZW51bSk7CisJcmV0dXJuIEVfTk9USU1QTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgSURhdGFPYmplY3QgaW1wbGVtZW50YXRpb24KKyovCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGF0YU9iamVjdF9RdWVyeUludGVyZmFjZSAoTFBEQVRBT0JKRUNULCBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKTsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURhdGFPYmplY3RfQWRkUmVmIChMUERBVEFPQkpFQ1QpOworc3RhdGljIFVMT05HIFdJTkFQSSBJRGF0YU9iamVjdF9SZWxlYXNlIChMUERBVEFPQkpFQ1QpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEYXRhT2JqZWN0X0dldERhdGEgKExQREFUQU9CSkVDVCwgTFBGT1JNQVRFVEMzMiBwZm9ybWF0ZXRjSW4sIFNUR01FRElVTTMyICpwbWVkaXVtKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGF0YU9iamVjdF9HZXREYXRhSGVyZShMUERBVEFPQkpFQ1QsIExQRk9STUFURVRDMzIgcGZvcm1hdGV0YywgU1RHTUVESVVNMzIgKnBtZWRpdW0pOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEYXRhT2JqZWN0X1F1ZXJ5R2V0RGF0YShMUERBVEFPQkpFQ1QsIExQRk9STUFURVRDMzIgcGZvcm1hdGV0Yyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfR2V0Q2Fub25pY2FsRm9ybWF0RXRjKExQREFUQU9CSkVDVCwgTFBGT1JNQVRFVEMzMiBwZm9ybWF0ZWN0SW4sIExQRk9STUFURVRDMzIgcGZvcm1hdGV0Y091dCk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfU2V0RGF0YShMUERBVEFPQkpFQ1QsIExQRk9STUFURVRDMzIgcGZvcm1hdGV0YywgU1RHTUVESVVNMzIgKnBtZWRpdW0sIEJPT0wzMiBmUmVsZWFzZSk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfRW51bUZvcm1hdEV0YyhMUERBVEFPQkpFQ1QsIERXT1JEIGR3RGlyZWN0aW9uLCBJRW51bUZPUk1BVEVUQyAqKnBwZW51bUZvcm1hdEV0Yyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfREFkdmlzZSAoTFBEQVRBT0JKRUNULCBMUEZPUk1BVEVUQzMyICpwZm9ybWF0ZXRjLCBEV09SRCBhZHZmLCBJQWR2aXNlU2luayAqcEFkdlNpbmssIERXT1JEICpwZHdDb25uZWN0aW9uKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGF0YU9iamVjdF9EVW5hZHZpc2UoTFBEQVRBT0JKRUNULCBEV09SRCBkd0Nvbm5lY3Rpb24pOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEYXRhT2JqZWN0X0VudW1EQWR2aXNlKExQREFUQU9CSkVDVCwgSUVudW1TVEFUREFUQSAqKnBwZW51bUFkdmlzZSk7CisKK3N0YXRpYyBzdHJ1Y3QgSURhdGFPYmplY3RfVlRhYmxlIGR0b3Z0ID0gCit7CUlEYXRhT2JqZWN0X1F1ZXJ5SW50ZXJmYWNlLAorCUlEYXRhT2JqZWN0X0FkZFJlZiwKKwlJRGF0YU9iamVjdF9SZWxlYXNlLAorCUlEYXRhT2JqZWN0X0dldERhdGEsCisJSURhdGFPYmplY3RfR2V0RGF0YUhlcmUsCisJSURhdGFPYmplY3RfUXVlcnlHZXREYXRhLAorCUlEYXRhT2JqZWN0X0dldENhbm9uaWNhbEZvcm1hdEV0YywKKwlJRGF0YU9iamVjdF9TZXREYXRhLAorCUlEYXRhT2JqZWN0X0VudW1Gb3JtYXRFdGMsCisJSURhdGFPYmplY3RfREFkdmlzZSwKKwlJRGF0YU9iamVjdF9EVW5hZHZpc2UsCisJSURhdGFPYmplY3RfRW51bURBZHZpc2UKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSURhdGFPYmplY3RfQ29uc3RydWN0b3IKKyovCitMUERBVEFPQkpFQ1QgSURhdGFPYmplY3RfQ29uc3RydWN0b3IoSFdORDMyIGh3bmRPd25lciwgTFBTSEVMTEZPTERFUiBwY2YsIExQSVRFTUlETElTVCAqIGFwaXQsIFVJTlQzMiBjcGl0KQorewlMUERBVEFPQkpFQ1QgZHRvOworCWR0bz0oTFBEQVRBT0JKRUNUKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElEYXRhT2JqZWN0KSk7CisJZHRvLT5yZWY9MTsKKwlkdG8tPmxwdnRibD0mZHRvdnQ7CisJVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLGR0byk7CisJcmV0dXJuIGR0bzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElEYXRhT2JqZWN0X1F1ZXJ5SW50ZXJmYWNlCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEYXRhT2JqZWN0X1F1ZXJ5SW50ZXJmYWNlIChMUERBVEFPQkpFQ1QgdGhpcywgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikKK3sJY2hhciAgICB4cmlpZFs1MF07CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CisJVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKKworCSpwcHZPYmogPSBOVUxMOworCisJaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lVbmtub3duKSkgICAgICAgICAgLypJVW5rbm93biovCisJeyAqcHB2T2JqID0gdGhpczsgCisJfQorCWVsc2UgaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lEYXRhT2JqZWN0KSkgIC8qSURhdGFPYmplY3QqLworCXsgKnBwdk9iaiA9IChJRGF0YU9iamVjdCopdGhpczsKKwl9ICAgCisKKwlpZigqcHB2T2JqKQorCXsgKCooTFBEQVRBT0JKRUNUKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgICAgIAorCSAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogKCVwKS0+KCVwKVxuIixwcHZPYmosKnBwdk9iaik7CisJICByZXR1cm4gU19PSzsKKwl9CisJVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7CisJcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9ICAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElEYXRhT2JqZWN0X0FkZFJlZgorKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURhdGFPYmplY3RfQWRkUmVmKExQREFUQU9CSkVDVCB0aGlzKQorewlUUkFDRShzaGVsbCwiKCVwKS0+KGNvdW50PSVsdSlcbiIsdGhpcywodGhpcy0+cmVmKSsxKTsKKwlyZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSURhdGFPYmplY3RfUmVsZWFzZQorKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURhdGFPYmplY3RfUmVsZWFzZShMUERBVEFPQkpFQ1QgdGhpcykKK3sJVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLHRoaXMpOworCWlmICghLS0odGhpcy0+cmVmKSkgCisJeyBUUkFDRShzaGVsbCwiIGRlc3Ryb3lpbmcgSURhdGFPYmplY3QoJXApXG4iLHRoaXMpOworCSAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCSAgcmV0dXJuIDA7CisJfQorCXJldHVybiB0aGlzLT5yZWY7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfR2V0RGF0YSAoTFBEQVRBT0JKRUNUIHRoaXMsIExQRk9STUFURVRDMzIgcGZvcm1hdGV0Y0luLCBTVEdNRURJVU0zMiAqcG1lZGl1bSkKK3sJRklYTUUgKHNoZWxsLCAiKCVwKS0+KClcbiIsIHRoaXMpOworCXJldHVybiBFX05PVElNUEw7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfR2V0RGF0YUhlcmUoTFBEQVRBT0JKRUNUIHRoaXMsIExQRk9STUFURVRDMzIgcGZvcm1hdGV0YywgU1RHTUVESVVNMzIgKnBtZWRpdW0pCit7CUZJWE1FIChzaGVsbCwgIiglcCktPigpXG4iLCB0aGlzKTsKKwlyZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEYXRhT2JqZWN0X1F1ZXJ5R2V0RGF0YShMUERBVEFPQkpFQ1QgdGhpcywgTFBGT1JNQVRFVEMzMiBwZm9ybWF0ZXRjKQorewlGSVhNRSAoc2hlbGwsICIoJXApLT4oKVxuIiwgdGhpcyk7CisJcmV0dXJuIEVfTk9USU1QTDsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGF0YU9iamVjdF9HZXRDYW5vbmljYWxGb3JtYXRFdGMoTFBEQVRBT0JKRUNUIHRoaXMsIExQRk9STUFURVRDMzIgcGZvcm1hdGVjdEluLCBMUEZPUk1BVEVUQzMyIHBmb3JtYXRldGNPdXQpCit7CUZJWE1FIChzaGVsbCwgIiglcCktPigpXG4iLCB0aGlzKTsKKwlyZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEYXRhT2JqZWN0X1NldERhdGEoTFBEQVRBT0JKRUNUIHRoaXMsIExQRk9STUFURVRDMzIgcGZvcm1hdGV0YywgU1RHTUVESVVNMzIgKnBtZWRpdW0sIEJPT0wzMiBmUmVsZWFzZSkKK3sJRklYTUUgKHNoZWxsLCAiKCVwKS0+KClcbiIsIHRoaXMpOworCXJldHVybiBFX05PVElNUEw7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfRW51bUZvcm1hdEV0YyhMUERBVEFPQkpFQ1QgdGhpcywgRFdPUkQgZHdEaXJlY3Rpb24sIElFbnVtRk9STUFURVRDICoqcHBlbnVtRm9ybWF0RXRjKQorewlGSVhNRSAoc2hlbGwsICIoJXApLT4oKVxuIiwgdGhpcyk7CisJcmV0dXJuIEVfTk9USU1QTDsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGF0YU9iamVjdF9EQWR2aXNlIChMUERBVEFPQkpFQ1QgdGhpcywgTFBGT1JNQVRFVEMzMiAqcGZvcm1hdGV0YywgRFdPUkQgYWR2ZiwgSUFkdmlzZVNpbmsgKnBBZHZTaW5rLCBEV09SRCAqcGR3Q29ubmVjdGlvbikKK3sJRklYTUUgKHNoZWxsLCAiKCVwKS0+KClcbiIsIHRoaXMpOworCXJldHVybiBFX05PVElNUEw7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURhdGFPYmplY3RfRFVuYWR2aXNlKExQREFUQU9CSkVDVCB0aGlzLCBEV09SRCBkd0Nvbm5lY3Rpb24pCit7CUZJWE1FIChzaGVsbCwgIiglcCktPigpXG4iLCB0aGlzKTsKKwlyZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEYXRhT2JqZWN0X0VudW1EQWR2aXNlKExQREFUQU9CSkVDVCB0aGlzLCBJRW51bVNUQVREQVRBICoqcHBlbnVtQWR2aXNlKQorewlGSVhNRSAoc2hlbGwsICIoJXApLT4oKVxuIiwgdGhpcyk7CisJcmV0dXJuIEVfTk9USU1QTDsKK30KZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9lbnVtaWRsaXN0LmMgYi9kbGxzL3NoZWxsMzIvZW51bWlkbGlzdC5jCmluZGV4IDk2MGQ2YWMuLjM2NWJlMzIgMTAwNjQ0Ci0tLSBhL2RsbHMvc2hlbGwzMi9lbnVtaWRsaXN0LmMKKysrIGIvZGxscy9zaGVsbDMyL2VudW1pZGxpc3QuYwpAQCAtNTMsMjQgKzUzLDI2IEBACiAgKiAgSUVudW1JRExpc3RfQ29uc3RydWN0b3IKICAqLwogCi1MUEVOVU1JRExJU1QgSUVudW1JRExpc3RfQ29uc3RydWN0b3IoIExQQ1NUUiBscHN6UGF0aCwgRFdPUkQgZHdGbGFncywgSFJFU1VMVCogcFJlc3VsdCkKK0xQRU5VTUlETElTVCBJRW51bUlETGlzdF9Db25zdHJ1Y3RvciggTFBDU1RSIGxwc3pQYXRoLCBEV09SRCBkd0ZsYWdzKQogewlMUEVOVU1JRExJU1QJbHBlaWRsOwogCiAJbHBlaWRsID0gKExQRU5VTUlETElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRW51bUlETGlzdCkpOworCWlmICghIGxwZWlkbCkKKwkgIHJldHVybiBOVUxMOworCiAJbHBlaWRsLT5yZWYgPSAxOwogCWxwZWlkbC0+bHB2dGJsID0gJmVpZGx2dDsKIAlscGVpZGwtPm1wRmlyc3Q9TlVMTDsKIAlscGVpZGwtPm1wTGFzdD1OVUxMOwogCWxwZWlkbC0+bXBDdXJyZW50PU5VTEw7CiAKLQlUUkFDRShzaGVsbCwiKCVwKS0+KCVzIDB4JTA4bHggJXApXG4iLGxwZWlkbCxkZWJ1Z3N0cl9hKGxwc3pQYXRoKSxkd0ZsYWdzLHBSZXN1bHQpOworCVRSQUNFKHNoZWxsLCIoJXApLT4oJXMgZmxhZ3M9MHglMDhseClcbiIsbHBlaWRsLGRlYnVnc3RyX2EobHBzelBhdGgpLGR3RmxhZ3MpOwogCiAJaWYoIUlFbnVtSURMaXN0X0NyZWF0ZUVudW1MaXN0KGxwZWlkbCwgbHBzelBhdGgsIGR3RmxhZ3MpKQotCXsgaWYocFJlc3VsdCkKLQkgIHsgKnBSZXN1bHQgPSBFX09VVE9GTUVNT1JZOwotCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBlaWRsKTsKLQkgICAgcmV0dXJuIE5VTEw7CisJeyBpZiAobHBlaWRsKQorCSAgeyBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBlaWRsKTsKIAkgIH0KKwkgIHJldHVybiBOVUxMOwkgIAogCX0KIAogCVRSQUNFKHNoZWxsLCItLSAoJXApLT4oKVxuIixscGVpZGwpOwpAQCAtMjE0LDcgKzIxNiw3IEBACiAJQ0hBUiAgc3pEcml2ZU5hbWVbNF07CiAJQ0hBUiAgc3pQYXRoW01BWF9QQVRIXTsKICAgICAKLQlUUkFDRShzaGVsbCwiKCVwKS0+KCVzIDB4JTA4bHgpIFxuIix0aGlzLGRlYnVnc3RyX2EobHBzelBhdGgpLGR3RmxhZ3MpOworCVRSQUNFKHNoZWxsLCIoJXApLT4ocGF0aD0lcyBmbGFncz0weCUwOGx4KSBcbiIsdGhpcyxkZWJ1Z3N0cl9hKGxwc3pQYXRoKSxkd0ZsYWdzKTsKIAogCWlmIChscHN6UGF0aCAmJiBscHN6UGF0aFswXSE9J1wwJykKIAl7IHN0cmNweShzelBhdGgsIGxwc3pQYXRoKTsKZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9mb2xkZXJzLmMgYi9kbGxzL3NoZWxsMzIvZm9sZGVycy5jCmluZGV4IDc1Mzc0ZjkuLjQzNzNhM2EgMTAwNjQ0Ci0tLSBhL2RsbHMvc2hlbGwzMi9mb2xkZXJzLmMKKysrIGIvZGxscy9zaGVsbDMyL2ZvbGRlcnMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgIndpbm5scy5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgorI2luY2x1ZGUgInBpZGwuaCIKIAogI2luY2x1ZGUgInNoZWxsMzJfbWFpbi5oIgogCkBAIC00Miw2ICs0MywyNCBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTExJTkssUkVGSUlELExQVk9JRCopOwogc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxMaW5rX0FkZFJlZihMUFNIRUxMTElOSyk7CiBzdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbExpbmtfUmVsZWFzZShMUFNIRUxMTElOSyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19HZXRQYXRoKExQU0hFTExMSU5LLCBMUFNUUixJTlQzMiwgV0lOMzJfRklORF9EQVRBMzJBICosIERXT1JEKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldElETGlzdChMUFNIRUxMTElOSywgTFBJVEVNSURMSVNUICopOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfU2V0SURMaXN0KExQU0hFTExMSU5LLCBMUENJVEVNSURMSVNUKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldERlc2NyaXB0aW9uKExQU0hFTExMSU5LLCBMUFNUUixJTlQzMik7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19TZXREZXNjcmlwdGlvbihMUFNIRUxMTElOSywgTFBDU1RSKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldFdvcmtpbmdEaXJlY3RvcnkoTFBTSEVMTExJTkssIExQU1RSLElOVDMyKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1NldFdvcmtpbmdEaXJlY3RvcnkoTFBTSEVMTExJTkssIExQQ1NUUik7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19HZXRBcmd1bWVudHMoTFBTSEVMTExJTkssIExQU1RSLElOVDMyKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1NldEFyZ3VtZW50cyhMUFNIRUxMTElOSywgTFBDU1RSKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldEhvdGtleShMUFNIRUxMTElOSywgV09SRCAqKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1NldEhvdGtleShMUFNIRUxMTElOSywgV09SRCk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19HZXRTaG93Q21kKExQU0hFTExMSU5LLCBJTlQzMiAqKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1NldFNob3dDbWQoTFBTSEVMTExJTkssIElOVDMyKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldEljb25Mb2NhdGlvbihMUFNIRUxMTElOSywgTFBTVFIsSU5UMzIsSU5UMzIgKik7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19TZXRJY29uTG9jYXRpb24oTFBTSEVMTExJTkssIExQQ1NUUixJTlQzMik7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19TZXRSZWxhdGl2ZVBhdGgoTFBTSEVMTExJTkssIExQQ1NUUiwgRFdPUkQpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfUmVzb2x2ZShMUFNIRUxMTElOSywgSFdORDMyLCBEV09SRCk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19TZXRQYXRoKExQU0hFTExMSU5LLCBMUENTVFIpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ0LDI4ICsxNjMsMjggQEAKICogSVNoZWxsTGluayBJbXBsZW1lbnRhdGlvbgogKi8KIAotc3RhdGljIHN0cnVjdCBJU2hlbGxMaW5rX1ZUYWJsZSBzbHZ0ID0gewotICBJU2hlbGxMaW5rX1F1ZXJ5SW50ZXJmYWNlLAotICBJU2hlbGxMaW5rX0FkZFJlZiwKLSAgSVNoZWxsTGlua19SZWxlYXNlLAotICAgICh2b2lkICopMHhjYWZlMDAwNCwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMDUsCi0gICAgKHZvaWQgKikweGNhZmUwMDA2LAotICAgICh2b2lkICopMHhjYWZlMDAwNywKLSAgICAodm9pZCAqKTB4Y2FmZTAwMDgsCi0gICAgKHZvaWQgKikweGNhZmUwMDA5LAotICAgICh2b2lkICopMHhjYWZlMDAxMCwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMTEsCi0gICAgKHZvaWQgKikweGNhZmUwMDEyLAotICAgICh2b2lkICopMHhjYWZlMDAxMywKLSAgICAodm9pZCAqKTB4Y2FmZTAwMTQsCi0gICAgKHZvaWQgKikweGNhZmUwMDE1LAotICAgICh2b2lkICopMHhjYWZlMDAxNiwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMTcsCi0gICAgKHZvaWQgKikweGNhZmUwMDE4LAotICAgICh2b2lkICopMHhjYWZlMDAxOSwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMjAsCi0gICAgKHZvaWQgKikweGNhZmUwMDIxCitzdGF0aWMgc3RydWN0IElTaGVsbExpbmtfVlRhYmxlIHNsdnQgPSAKK3sJSVNoZWxsTGlua19RdWVyeUludGVyZmFjZSwKKwlJU2hlbGxMaW5rX0FkZFJlZiwKKwlJU2hlbGxMaW5rX1JlbGVhc2UsCisJSVNoZWxsTGlua19HZXRQYXRoLAorCUlTaGVsbExpbmtfR2V0SURMaXN0LAorCUlTaGVsbExpbmtfU2V0SURMaXN0LAorCUlTaGVsbExpbmtfR2V0RGVzY3JpcHRpb24sCisJSVNoZWxsTGlua19TZXREZXNjcmlwdGlvbiwKKwlJU2hlbGxMaW5rX0dldFdvcmtpbmdEaXJlY3RvcnksCisJSVNoZWxsTGlua19TZXRXb3JraW5nRGlyZWN0b3J5LAorCUlTaGVsbExpbmtfR2V0QXJndW1lbnRzLAorCUlTaGVsbExpbmtfU2V0QXJndW1lbnRzLAorCUlTaGVsbExpbmtfR2V0SG90a2V5LAorCUlTaGVsbExpbmtfU2V0SG90a2V5LAorCUlTaGVsbExpbmtfR2V0U2hvd0NtZCwKKwlJU2hlbGxMaW5rX1NldFNob3dDbWQsCisJSVNoZWxsTGlua19HZXRJY29uTG9jYXRpb24sCisJSVNoZWxsTGlua19TZXRJY29uTG9jYXRpb24sCisJSVNoZWxsTGlua19TZXRSZWxhdGl2ZVBhdGgsCisJSVNoZWxsTGlua19SZXNvbHZlLAorCUlTaGVsbExpbmtfU2V0UGF0aAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjcsNCArMjQ2LDg1IEBACiAgIHJldHVybiB0aGlzLT5yZWY7CiB9CiAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldFBhdGgoTFBTSEVMTExJTksgdGhpcywgTFBTVFIgcHN6RmlsZSxJTlQzMiBjY2hNYXhQYXRoLCBXSU4zMl9GSU5EX0RBVEEzMkEgKnBmZCwgRFdPUkQgZkZsYWdzKQorewlGSVhNRShzaGVsbCwiKCVwKS0+KHBmaWxlPSVwIGxlbj0ldSBmaW5kX2RhdGE9JXAgZmxhZ3M9JWx1KVxuIix0aGlzLCBwc3pGaWxlLCBjY2hNYXhQYXRoLCBwZmQsIGZGbGFncyk7CisJc3RybmNweShwc3pGaWxlLCJjOlxcZm9vLmJhciIsIGNjaE1heFBhdGgpOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfR2V0SURMaXN0KExQU0hFTExMSU5LIHRoaXMsIExQSVRFTUlETElTVCAqIHBwaWRsKQorewlGSVhNRShzaGVsbCwiKCVwKS0+KHBwaWRsPSVwKVxuIix0aGlzLCBwcGlkbCk7CisJKnBwaWRsID0gX0lMQ3JlYXRlRGVza3RvcCgpOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfU2V0SURMaXN0KExQU0hFTExMSU5LIHRoaXMsIExQQ0lURU1JRExJU1QgcGlkbCkKK3sJRklYTUUoc2hlbGwsIiglcCktPihwaWRsPSVwKVxuIix0aGlzLCBwaWRsKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldERlc2NyaXB0aW9uKExQU0hFTExMSU5LIHRoaXMsIExQU1RSIHBzek5hbWUsSU5UMzIgY2NoTWF4TmFtZSkKK3sJRklYTUUoc2hlbGwsIiglcCktPiglcCBsZW49JXUpXG4iLHRoaXMsIHBzek5hbWUsIGNjaE1heE5hbWUpOworCXN0cm5jcHkocHN6TmFtZSwiRGVzY3JpcHRpb24sIEZJWE1FIixjY2hNYXhOYW1lKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1NldERlc2NyaXB0aW9uKExQU0hFTExMSU5LIHRoaXMsIExQQ1NUUiBwc3pOYW1lKQorewlGSVhNRShzaGVsbCwiKCVwKS0+KGRlc2M9JXMpXG4iLHRoaXMsIHBzek5hbWUpOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfR2V0V29ya2luZ0RpcmVjdG9yeShMUFNIRUxMTElOSyB0aGlzLCBMUFNUUiBwc3pEaXIsSU5UMzIgY2NoTWF4UGF0aCkKK3sJRklYTUUoc2hlbGwsIiglcCktPigpXG4iLHRoaXMpOworCXN0cm5jcHkocHN6RGlyLCJjOlxcIiwgY2NoTWF4UGF0aCk7CisJcmV0dXJuIE5PRVJST1I7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19TZXRXb3JraW5nRGlyZWN0b3J5KExQU0hFTExMSU5LIHRoaXMsIExQQ1NUUiBwc3pEaXIpCit7CUZJWE1FKHNoZWxsLCIoJXApLT4oZGlyPSVzKVxuIix0aGlzLCBwc3pEaXIpOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfR2V0QXJndW1lbnRzKExQU0hFTExMSU5LIHRoaXMsIExQU1RSIHBzekFyZ3MsSU5UMzIgY2NoTWF4UGF0aCkKK3sJRklYTUUoc2hlbGwsIiglcCktPiglcCBsZW49JXUpXG4iLHRoaXMsIHBzekFyZ3MsIGNjaE1heFBhdGgpOworCXN0cm5jcHkocHN6QXJncywgIiIsIGNjaE1heFBhdGgpOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfU2V0QXJndW1lbnRzKExQU0hFTExMSU5LIHRoaXMsIExQQ1NUUiBwc3pBcmdzKQorewlGSVhNRShzaGVsbCwiKCVwKS0+KGFyZ3M9JXMpXG4iLHRoaXMsIHBzekFyZ3MpOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfR2V0SG90a2V5KExQU0hFTExMSU5LIHRoaXMsIFdPUkQgKnB3SG90a2V5KQorewlGSVhNRShzaGVsbCwiKCVwKS0+KCVwKVxuIix0aGlzLCBwd0hvdGtleSk7CisJKnB3SG90a2V5PTB4MDsKKwlyZXR1cm4gTk9FUlJPUjsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1NldEhvdGtleShMUFNIRUxMTElOSyB0aGlzLCBXT1JEIHdIb3RrZXkpCit7CUZJWE1FKHNoZWxsLCIoJXApLT4oaG90a2V5PSV4KVxuIix0aGlzLCB3SG90a2V5KTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldFNob3dDbWQoTFBTSEVMTExJTksgdGhpcywgSU5UMzIgKnBpU2hvd0NtZCkKK3sJRklYTUUoc2hlbGwsIiglcCktPiglcClcbiIsdGhpcywgcGlTaG93Q21kKTsKKwkqcGlTaG93Q21kPTA7CisJcmV0dXJuIE5PRVJST1I7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19TZXRTaG93Q21kKExQU0hFTExMSU5LIHRoaXMsIElOVDMyIGlTaG93Q21kKQorewlGSVhNRShzaGVsbCwiKCVwKS0+KHNob3djbWQ9JXgpXG4iLHRoaXMsIGlTaG93Q21kKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX0dldEljb25Mb2NhdGlvbihMUFNIRUxMTElOSyB0aGlzLCBMUFNUUiBwc3pJY29uUGF0aCxJTlQzMiBjY2hJY29uUGF0aCxJTlQzMiAqcGlJY29uKQorewlGSVhNRShzaGVsbCwiKCVwKS0+KCVwIGxlbj0ldSBpaWNvbj0lcClcbiIsdGhpcywgcHN6SWNvblBhdGgsIGNjaEljb25QYXRoLCBwaUljb24pOworCXN0cm5jcHkocHN6SWNvblBhdGgsInNoZWxsMzIuZGxsIixjY2hJY29uUGF0aCk7CisJKnBpSWNvbj0xOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfU2V0SWNvbkxvY2F0aW9uKExQU0hFTExMSU5LIHRoaXMsIExQQ1NUUiBwc3pJY29uUGF0aCxJTlQzMiBpSWNvbikKK3sJRklYTUUoc2hlbGwsIiglcCktPihwYXRoPSVzIGlpY29uPSV1KVxuIix0aGlzLCBwc3pJY29uUGF0aCwgaUljb24pOworCXJldHVybiBOT0VSUk9SOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfU2V0UmVsYXRpdmVQYXRoKExQU0hFTExMSU5LIHRoaXMsIExQQ1NUUiBwc3pQYXRoUmVsLCBEV09SRCBkd1Jlc2VydmVkKQorewlGSVhNRShzaGVsbCwiKCVwKS0+KHBhdGg9JXMgJWx4KVxuIix0aGlzLCBwc3pQYXRoUmVsLCBkd1Jlc2VydmVkKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1Jlc29sdmUoTFBTSEVMTExJTksgdGhpcywgSFdORDMyIGh3bmQsIERXT1JEIGZGbGFncykKK3sJRklYTUUoc2hlbGwsIiglcCktPihod25kPSV4IGZsYWdzPSVseClcbiIsdGhpcywgaHduZCwgZkZsYWdzKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1NldFBhdGgoTFBTSEVMTExJTksgdGhpcywgTFBDU1RSIHBzekZpbGUpCit7CUZJWE1FKHNoZWxsLCIoJXApLT4ocGF0aD0lcylcbiIsdGhpcywgcHN6RmlsZSk7CisJcmV0dXJuIE5PRVJST1I7Cit9CiAKZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9waWRsLmMgYi9kbGxzL3NoZWxsMzIvcGlkbC5jCmluZGV4IGNhZWQ2MjQuLjY3Y2NkOTQgMTAwNjQ0Ci0tLSBhL2RsbHMvc2hlbGwzMi9waWRsLmMKKysrIGIvZGxscy9zaGVsbDMyL3BpZGwuYwpAQCAtMyw4ICszLDkgQEAKICAqCiAgKglDb3B5cmlnaHQgMTk5OAlKdWVyZ2VuIFNjaG1pZWQKICAqCi0gKiAgISEhIGN1cnJlbnRseSB3b3JrIGluIHByb2dyZXNzIG9uIGFsbCBjbGFzc2VzICEhIQotICogIDxjb250YWN0IGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZSwgOTgwODAxPgorICogTk9URVMKKyAqICBhIHBpZGwgPT0gTlVMTCBtZWFucyBkZXNrdG9wIGFuZCBpcyBsZWdhbAorICoKICAqLwogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KQEAgLTI5LDE1ICszMCwyNCBAQAogewlEV09SRCB0eXBlOwogCUNIQVIgKiBzekRhdGE7CiAJTFBJVEVNSURMSVNUIHBpZGx0ZW1wID0gcGlkbDsKLQlUUkFDRShwaWRsLCItLS0tLS0tLS0tIHBpZGw9JXAgXG4iLCBwaWRsKTsKLQlkbwotCXsgdHlwZSAgID0gX0lMR2V0RGF0YVBvaW50ZXIocGlkbHRlbXApLT50eXBlOwotCSAgc3pEYXRhID0gX0lMR2V0VGV4dFBvaW50ZXIodHlwZSwgX0lMR2V0RGF0YVBvaW50ZXIocGlkbHRlbXApKTsKKwlpZiAoISBwaWRsdGVtcCkKKwl7IFRSQUNFKHBpZGwsIi0tLS0tLS0tIHBpZGwgPSBOVUxMIChSb290KVxuIik7CisJICByZXR1cm47CisJfQorCVRSQUNFKHBpZGwsIi0tLS0tLS0tIHBpZGw9JXAgXG4iLCBwaWRsKTsKKwlpZiAocGlkbHRlbXAtPm1raWQuY2IpCisJeyBkbworCSAgeyB0eXBlICAgPSBfSUxHZXREYXRhUG9pbnRlcihwaWRsdGVtcCktPnR5cGU7CisJICAgIHN6RGF0YSA9IF9JTEdldFRleHRQb2ludGVyKHR5cGUsIF9JTEdldERhdGFQb2ludGVyKHBpZGx0ZW1wKSk7CiAKLQkgIFRSQUNFKHBpZGwsIi0tLS0gcGlkbD0lcCBzaXplPSV1IHR5cGU9JWx4ICVzXG4iLHBpZGx0ZW1wLCBwaWRsdGVtcC0+bWtpZC5jYix0eXBlLGRlYnVnc3RyX2Eoc3pEYXRhKSk7CisJICAgIFRSQUNFKHBpZGwsIi0tLS0gcGlkbD0lcCBzaXplPSV1IHR5cGU9JWx4ICVzXG4iLHBpZGx0ZW1wLCBwaWRsdGVtcC0+bWtpZC5jYix0eXBlLGRlYnVnc3RyX2Eoc3pEYXRhKSk7CiAKLQkgIHBpZGx0ZW1wID0gSUxHZXROZXh0KHBpZGx0ZW1wKTsKLQl9IHdoaWxlIChwaWRsdGVtcC0+bWtpZC5jYik7CisJICAgIHBpZGx0ZW1wID0gSUxHZXROZXh0KHBpZGx0ZW1wKTsKKwkgIH0gd2hpbGUgKHBpZGx0ZW1wLT5ta2lkLmNiKTsKKwkgIHJldHVybjsKKwl9CisJZWxzZQorCSAgVFJBQ0UocGlkbCwiZW1wdHkgcGlkbCAoRGVza3RvcClcbiIpOwkKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJTEdldERpc3BsYXlOYW1lCQkJW1NIRUxMMzIuMTVdCkBAIC04OCw2ICs5OCw4IEBACiAKICAgVFJBQ0UocGlkbCwiJXBcbiIscGlkbCk7CiAKKyAgcGR1bXAocGlkbCk7CisKICAgaWYgKCFwaWRsKQogICAgIHJldHVybiBOVUxMOwogICAgIApAQCAtMTA0LDggKzExNiw0MCBAQAogICogIGR1cGxpY2F0ZXMgdGhlIGZpcnN0IGlkbGlzdCBvZiBhIGNvbXBsZXggcGlkbAogICovCiBMUElURU1JRExJU1QgV0lOQVBJIElMQ2xvbmVGaXJzdChMUENJVEVNSURMSVNUIHBpZGwpCi17IEZJWE1FKHBpZGwsInBpZGw9JXBcbiIscGlkbCk7Ci0gIHJldHVybiBOVUxMOworewlEV09SRCBsZW47CisJTFBJVEVNSURMSVNUIG5ld3BpZGw9TlVMTDsKKwlUUkFDRShwaWRsLCJwaWRsPSVwXG4iLHBpZGwpOworCQorCWlmIChwaWRsKQorCXsgbGVuID0gcGlkbC0+bWtpZC5jYjsJCisJICBuZXdwaWRsID0gKExQSVRFTUlETElTVCkgU0hBbGxvYyAobGVuKzIpOworCSAgaWYgKG5ld3BpZGwpCisJICB7IG1lbWNweShuZXdwaWRsLHBpZGwsbGVuKTsKKyAgIAkgICAgSUxHZXROZXh0KG5ld3BpZGwpLT5ta2lkLmNiID0gMHgwMDsKKwkgIH0KKwkgfQorCisgIAlyZXR1cm4gbmV3cGlkbDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTElzRXF1YWwgW1NIRUxMMzIuMjFdCisgKgorICovCitCT09MMzIgV0lOQVBJIElMSXNFcXVhbChMUENJVEVNSURMSVNUIHBpZGwxLCBMUENJVEVNSURMSVNUIHBpZGwyKQorewlGSVhNRShwaWRsLCJwaWRsMT0lcCBwaWRsMj0lcCBzdHViXG4iLHBpZGwxLCBwaWRsMik7CisJcGR1bXAgKHBpZGwxKTsKKwlwZHVtcCAocGlkbDIpOworCXJldHVybiBGQUxTRTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTEZpbmRDaGlsZCBbU0hFTEwzMi4yNF0KKyAqCisgKi8KK0RXT1JEIFdJTkFQSSBJTEZpbmRDaGlsZChMUENJVEVNSURMSVNUIHBpZGwxLExQQ0lURU1JRExJU1QgcGlkbDIpCit7CUZJWE1FKHBpZGwsIiVwICVwIHN0dWJcbiIscGlkbDEscGlkbDIpOworCXBkdW1wIChwaWRsMSk7CisJcGR1bXAgKHBpZGwyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyNSw2ICsxNjksOSBAQAogICBpZighcGlkbDEgJiYgIXBpZGwyKQogICB7ICByZXR1cm4gTlVMTDsKICAgfQorCisgIHBkdW1wIChwaWRsMSk7CisgIHBkdW1wIChwaWRsMik7CiAgCiAgIGlmKCFwaWRsMSkKICAgeyBwaWRsTmV3ID0gSUxDbG9uZShwaWRsMik7CkBAIC0xNDksNiArMTk2LDE4IEBACiAgIHJldHVybiBwaWRsTmV3OwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTSExvZ0lMRnJvbUZTSUwgW1NIRUxMMzIuOTVdCisgKgorICogTk9URVMKKyAqICBtaWdodCBiZSB0aGUgcHJlcGVuZGluZyBvZiBNeUNvbXB1dGVyIHRvIGEgZmlsZXN5c3RlbSBwaWRsICg/KQorICovCitMUElURU1JRExJU1QgV0lOQVBJIFNITG9nSUxGcm9tRlNJTChMUElURU1JRExJU1QgcGlkbCkKK3sJRklYTUUocGlkbCwiKHBpZGw9JXApXG4iLHBpZGwpOworCXBkdW1wKHBpZGwpOworCXJldHVybiBJTENsb25lKHBpZGwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSUxHZXRTaXplIFtTSEVMTDMyLjE1Ml0KICAqICBnZXRzIHRoZSBieXRlIHNpemUgb2YgYW4gaWRsaXN0IGluY2x1ZGluZyB6ZXJvIHRlcm1pbmF0b3IgKHBpZGwpCiAgKgpAQCAtMTYyLDE5ICsyMjEsMTkgQEAKICAqICBleHBvcnRlZCBieSBvcmRpbmFsCiAgKi8KIERXT1JEIFdJTkFQSSBJTEdldFNpemUoTFBJVEVNSURMSVNUIHBpZGwpCi17IExQU0hJVEVNSUQgc2kgPSAmKHBpZGwtPm1raWQpOwotICBEV09SRCAgbGVuPTA7Cit7CUxQU0hJVEVNSUQgc2kgPSAmKHBpZGwtPm1raWQpOworCURXT1JEICBsZW49MDsKIAotICBUUkFDRShwaWRsLCJwaWRsPSVwXG4iLHBpZGwpOworCS8qVFJBQ0UocGlkbCwicGlkbD0lcFxuIixwaWRsKTsqLwogCi0gIGlmIChwaWRsKQotICB7IHdoaWxlIChzaS0+Y2IpIAotICAgIHsgbGVuICs9IHNpLT5jYjsKLSAgICAgIHNpICA9IChMUFNISVRFTUlEKSgoKExQQllURSlzaSkrc2ktPmNiKTsKLSAgICB9Ci0gICAgbGVuICs9IDI7CisJaWYgKHBpZGwpCisJeyB3aGlsZSAoc2ktPmNiKSAKKwkgIHsgbGVuICs9IHNpLT5jYjsKKwkgICAgc2kgID0gKExQU0hJVEVNSUQpKCgoTFBCWVRFKXNpKStzaS0+Y2IpOworCSAgfQorCSAgbGVuICs9IDI7CiAJfQotLyogIFRSQUNFKHBpZGwsIi0tIHNpemU9JWx1XG4iLGxlbik7Ki8KKwkvKlRSQUNFKHBpZGwsIi0tIHNpemU9JWx1XG4iLGxlbik7Ki8KIAlyZXR1cm4gbGVuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE5MSw3ICsyNTAsNyBAQAogTFBJVEVNSURMSVNUIFdJTkFQSSBJTEdldE5leHQoTFBJVEVNSURMSVNUIHBpZGwpCiB7CUxQSVRFTUlETElTVCBuZXh0cGlkbDsKIAotCVRSQUNFKHBpZGwsIihwaWRsPSVwKVxuIixwaWRsKTsKKy8qCVRSQUNFKHBpZGwsIihwaWRsPSVwKVxuIixwaWRsKTsqLwogCWlmKHBpZGwpCiAJeyBuZXh0cGlkbCA9IChMUElURU1JRExJU1QpKExQQllURSkoKChMUEJZVEUpcGlkbCkgKyBwaWRsLT5ta2lkLmNiKTsKIAkgIHJldHVybiBuZXh0cGlkbDsKQEAgLTIxMCw4ICsyNjksOCBAQAogICogIERlc3Ryb3lzIHRoZSBwYXNzZWQgaW4gaWRsaXN0IQogICovCiBMUElURU1JRExJU1QgV0lOQVBJIElMQXBwZW5kKExQSVRFTUlETElTVCBwaWRsLExQQ0lURU1JRExJU1QgaXRlbSxCT09MMzIgYkVuZCkKLXsgVFJBQ0UocGlkbCwiKHBpZGw9JXAscGlkbD0lcCwlMDh1KVxuIixwaWRsLGl0ZW0sYkVuZCk7Ci0gIHJldHVybiBOVUxMOworewlGSVhNRShwaWRsLCIocGlkbD0lcCxwaWRsPSVwLCUwOHUpc3R1YlxuIixwaWRsLGl0ZW0sYkVuZCk7CisJcmV0dXJuIE5VTEw7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSUxGcmVlIFtTSEVMTDMyLjE1NV0KQEAgLTIyMiwxMCArMjgxLDMxIEBACiAgKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogICovCiBEV09SRCBXSU5BUEkgSUxGcmVlKExQVk9JRCBwaWRsKSAKLXsgVFJBQ0UocGlkbCwiKHBpZGw9MHglMDhseClcbiIsKERXT1JEKXBpZGwpOwotICBpZiAoIXBpZGwpCi0JCXJldHVybiAwOwotICByZXR1cm4gU0hGcmVlKHBpZGwpOworewlUUkFDRShwaWRsLCIocGlkbD0weCUwOGx4KVxuIiwoRFdPUkQpcGlkbCk7CisJaWYgKCFwaWRsKQorCSAgcmV0dXJuIDA7CisJcmV0dXJuIFNIRnJlZShwaWRsKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTENyZWF0ZUZyb21QYXRoIFtTSEVMTDMyLjE1N10KKyAqCisgKi8KK0xQSVRFTUlETElTVCBXSU5BUEkgSUxDcmVhdGVGcm9tUGF0aChMUFNUUiBwYXRoKSAKK3sJTFBTSEVMTEZPTERFUiBzaGVsbGZvbGRlcjsKKwlMUElURU1JRExJU1QgcGlkbG5ldzsKKwlDSEFSIHBzelRlbXBbTUFYX1BBVEgqMl07CisJTFBXU1RSIGxwc3pEaXNwbGF5TmFtZSA9IChMUFdTVFIpJnBzelRlbXBbMF07CisJRFdPUkQgcGNoRWF0ZW47CisJCisJVFJBQ0UocGlkbCwiKHBhdGg9JXMpXG4iLHBhdGgpOworCQorCUxvY2FsVG9XaWRlQ2hhcjMyKGxwc3pEaXNwbGF5TmFtZSwgcGF0aCwgTUFYX1BBVEgpOworICAKKwlpZiAoU0hHZXREZXNrdG9wRm9sZGVyKCZzaGVsbGZvbGRlcik9PVNfT0spCisJeyBzaGVsbGZvbGRlci0+bHB2dGJsLT5mblBhcnNlRGlzcGxheU5hbWUoc2hlbGxmb2xkZXIsMCwgTlVMTCxscHN6RGlzcGxheU5hbWUsJnBjaEVhdGVuLCZwaWRsbmV3LE5VTEwpOworCSAgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5SZWxlYXNlKHNoZWxsZm9sZGVyKTsKKwl9CisJcmV0dXJuIHBpZGxuZXc7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzAzLDEyICszODMsMTIgQEAKICAqICBfSUxJc0RyaXZlKCkKICAqICBfSUxJc0ZvbGRlcigpCiAgKiAgX0lMSXNWYWx1ZSgpCi0qLworICovCiBCT09MMzIgV0lOQVBJIF9JTElzRGVza3RvcChMUENJVEVNSURMSVNUIHBpZGwpCiB7IFRSQUNFKHBpZGwsIiglcClcbiIscGlkbCk7CiAKICAgaWYgKCEgcGlkbCkKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIFRSVUU7CiAKICAgcmV0dXJuICggIHBpZGwtPm1raWQuY2IgPT0gMHgwMCApOwogfQpAQCAtNjk1LDcgKzc3NSw3IEBACiB7CWlmKCFwaWRsKQogCXsgcmV0dXJuIE5VTEw7CiAJfQotCVRSQUNFKHBpZGwsIiglcClcbiIsICBwaWRsKTsKKy8qCVRSQUNFKHBpZGwsIiglcClcbiIsICBwaWRsKTsqLwogCXJldHVybiAoTFBQSURMREFUQSkoJnBpZGwtPm1raWQuYWJJRCk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTcwMyw3ICs3ODMsNyBAQAogICogZ2V0cyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBzdG9yZWQgaW4gdGhlIHBpZGwKICAqLwogTFBTVFIgV0lOQVBJIF9JTEdldFRleHRQb2ludGVyKFBJRExUWVBFIHR5cGUsIExQUElETERBVEEgcGlkbGRhdGEpCi17CVRSQUNFKHBpZGwsIih0eXBlPSV4IGRhdGE9JXApXG4iLCB0eXBlLCBwaWRsZGF0YSk7Cit7LyoJVFJBQ0UocGlkbCwiKHR5cGU9JXggZGF0YT0lcClcbiIsIHR5cGUsIHBpZGxkYXRhKTsqLwogCiAJaWYoIXBpZGxkYXRhKQogCXsgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kbGxzL3NoZWxsMzIvc2hlbGwzMl9tYWluLmMgYi9kbGxzL3NoZWxsMzIvc2hlbGwzMl9tYWluLmMKaW5kZXggZWEzOTIzNy4uNDk3NTNjNSAxMDA2NDQKLS0tIGEvZGxscy9zaGVsbDMyL3NoZWxsMzJfbWFpbi5jCisrKyBiL2RsbHMvc2hlbGwzMi9zaGVsbDMyX21haW4uYwpAQCAtODksOSArODksMTAgQEAKICAqIGh0dHA6Ly9wcmVtaXVtLm1pY3Jvc29mdC5jb20vbXNkbi9saWJyYXJ5L3RlY2hhcnQvbXNkbjE5My5odG0KICAqLwogCi12b2lkIFdJTkFQSSBDb250cm9sX1J1bkRMTCAoSFdORDMyIGh3bmQsIExQQ1ZPSUQgY29kZSwgTFBDU1RSIGNtZCwgRFdPUkQgYXJnNCkKLXsgRklYTUUoc2hlbGwsICIoJTA4eCwgJXAsIFwiJXNcIiwgJTA4bHgpXG4iLAotCWh3bmQsIGNvZGUgPyBjb2RlIDogIihudWxsKSIsIGNtZCA/IGNtZCA6ICIobnVsbCkiLCBhcmc0KTsKK3ZvaWQgV0lOQVBJIENvbnRyb2xfUnVuRExMKCBIV05EMzIgaHduZCwgTFBDVk9JRCBjb2RlLCBMUENTVFIgY21kLCBEV09SRCBhcmc0ICkKK3sKKyAgICBGSVhNRShzaGVsbCwgIigweCUwOHgsICVwLCAlcywgMHglMDhseCk6IHN0dWJcbiIsIGh3bmQsIGNvZGUsCisgICAgICAgICAgZGVidWdzdHJfYShjbWQpLCBhcmc0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwOCwxMCArMTA5LDEwIEBACiBCT09MMzIgV0lOQVBJIFNoZWxsX0dldEltYWdlTGlzdChISU1BR0VMSVNUICogaW1nbGlzdDEsSElNQUdFTElTVCAqIGltZ2xpc3QyKQogewlXQVJOKHNoZWxsLCIoJXAsJXApOnNlbWktc3R1Yi5cbiIsaW1nbGlzdDEsaW1nbGlzdDIpOwogCWlmIChpbWdsaXN0MSkKLQl7ICppbWdsaXN0MT1TaGVsbEJpZ0ljb25MaXN0OworCXsgKmltZ2xpc3QxPVNoZWxsU21hbGxJY29uTGlzdDsKIAl9CiAJaWYgKGltZ2xpc3QyKQotCXsgKmltZ2xpc3QyPVNoZWxsU21hbGxJY29uTGlzdDsKKwl7ICppbWdsaXN0Mj1TaGVsbEJpZ0ljb25MaXN0OwogCX0KIAogCXJldHVybiBUUlVFOwpAQCAtMzUxLDcgKzM1Miw3IEBACiAgKgogICovCiBMUElURU1JRExJU1QgV0lOQVBJIFNIQnJvd3NlRm9yRm9sZGVyMzJBIChMUEJST1dTRUlORk8zMkEgbHBiaSkKLXsgRklYTUUgKHNoZWxsLCAiKCVseCwlcykgZW1wdHkgc3R1YiFcbiIsIChEV09SRClscGJpLCBscGJpLT5scHN6VGl0bGUpOworeyBGSVhNRSAoc2hlbGwsICIoMHglbHgsJXMpOiBzdHViXG4iLCAoRFdPUkQpbHBiaSwgZGVidWdzdHJfYShscGJpLT5scHN6VGl0bGUpKTsKICAgcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9zaGVsbG9sZS5jIGIvZGxscy9zaGVsbDMyL3NoZWxsb2xlLmMKaW5kZXggYmY3OGJhNi4uNzNkYjY2YSAxMDA2NDQKLS0tIGEvZGxscy9zaGVsbDMyL3NoZWxsb2xlLmMKKysrIGIvZGxscy9zaGVsbDMyL3NoZWxsb2xlLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCXJldHVybiBscGNsZjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIElDbGFzc0ZhY3Rvcnk6OlF1ZXJ5SW50ZXJmYWNlCisgKiAgSUNsYXNzRmFjdG9yeV9RdWVyeUludGVyZmFjZQogICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNsYXNzRmFjdG9yeV9RdWVyeUludGVyZmFjZSgKICAgTFBDTEFTU0ZBQ1RPUlkgdGhpcywgUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2T2JqKQpAQCAtMzE2LDYgKzMxNiw5IEBACiAJZWxzZSBpZiAoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lDb250ZXh0TWVudSkpCiAJeyBwT2JqID0gKElVbmtub3duICopSUNvbnRleHRNZW51X0NvbnN0cnVjdG9yKE5VTEwsIE5VTEwsIDApOwogIAl9IAorCWVsc2UgaWYgKElzRXF1YWxJSUQocmlpZCwgJklJRF9JRGF0YU9iamVjdCkpCisJeyBwT2JqID0gKElVbmtub3duICopSURhdGFPYmplY3RfQ29uc3RydWN0b3IoKTsKKyAJfSAKIAllbHNlCiAJeyBFUlIoc2hlbGwsInVua25vd24gSUlEIHJlcXVlc3RlZFxuXHRJSUQ6XHQlc1xuIix4cmlpZCk7CiAJICByZXR1cm4oRV9OT0lOVEVSRkFDRSk7CmRpZmYgLS1naXQgYS9kbGxzL3NoZWxsMzIvc2hlbGxvcmQuYyBiL2RsbHMvc2hlbGwzMi9zaGVsbG9yZC5jCmluZGV4IGI4YWEzZjguLjI0NWJkN2MgMTAwNjQ0Ci0tLSBhL2RsbHMvc2hlbGwzMi9zaGVsbG9yZC5jCisrKyBiL2RsbHMvc2hlbGwzMi9zaGVsbG9yZC5jCkBAIC0yMzEsMjggKzIzMSwyNiBAQAogICogUGF0aENvbWJpbmUgW1NIRUxMMzIuMzddCiAgKiAKICAqIE5PVEVTCi0gKiAgICAgY29uY2F0X3BhdGhzKGNoYXIqdGFyZ2V0LGNvbnN0IGNoYXIqYWRkKTsKLSAqICAgICBjb25jYXRzICJ0YXJnZXRcXGFkZCIgYW5kIHdyaXRlcyB0aGVtIHRvIHRhcmdldAorICogIGlmIGxwc3pGaWxlPScuJyBza2lwIGl0CiAgKi8KLUxQU1RSIFdJTkFQSSBQYXRoQ29tYmluZShMUFNUUiB0YXJnZXQsTFBTVFIgeDEsTFBTVFIgeDIpIHsKLQljaGFyCWJ1ZlsyNjBdOwotICBUUkFDRShzaGVsbCwiJXMgJXNcbiIseDEseDIpOwotCWlmICgheDIgfHwgIXgyWzBdKSB7Ci0JCWxzdHJjcHkzMkEodGFyZ2V0LHgxKTsKLQkJcmV0dXJuIHRhcmdldDsKK0xQU1RSIFdJTkFQSSBQYXRoQ29tYmluZShMUFNUUiBzekRlc3QsIExQQ1NUUiBscHN6RGlyLCBMUENTVFIgbHBzekZpbGUpIAorewlUUkFDRShzaGVsbCwiJXMgJXNcbiIsbHBzekRpcixscHN6RmlsZSk7CisKKwlpZiAoIWxwc3pGaWxlIHx8ICFscHN6RmlsZVswXSB8fCAobHBzekZpbGVbMF09PScuJyAmJiAhbHBzekZpbGVbMV0pICkgCisJeyBzdHJjcHkoc3pEZXN0LGxwc3pEaXIpOworCSAgcmV0dXJuIHN6RGVzdDsKIAl9Ci0JbHN0cmNweTMyQShidWYseDEpOwotCVBhdGhBZGRCYWNrc2xhc2goYnVmKTsgLyogYXBwZW5kIFwgaWYgbm90IHRoZXJlICovCi0JbHN0cmNhdDMyQShidWYseDIpOwotCWxzdHJjcHkzMkEodGFyZ2V0LGJ1Zik7Ci0JcmV0dXJuIHRhcmdldDsKKwlzdHJjcHkoc3pEZXN0LGxwc3pEaXIpOworCVBhdGhBZGRCYWNrc2xhc2goc3pEZXN0KTsKKwlzdHJjYXQoc3pEZXN0LGxwc3pGaWxlKTsKKwlyZXR1cm4gc3pEZXN0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUGF0aElzVU5DIFtTSEVMTDMyLjM5XQogICogCiAgKiBOT1RFUwotICogICAgIGlzVU5DKGNvbnN0IGNoYXIqcGF0aCk7CisgKiAgICAgUGF0aElzVU5DKGNoYXIqcGF0aCk7CiAgKi8KIEJPT0wzMiBXSU5BUEkgUGF0aElzVU5DKExQQ1NUUiBwYXRoKSB7CiAgIFRSQUNFKHNoZWxsLCIlc1xuIixwYXRoKTsKQEAgLTI2MCw2ICsyNTgsMTQgQEAKIAkJcmV0dXJuIFRSVUU7CiAJcmV0dXJuIEZBTFNFOwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBQYXRoSXNFeGUgW1NIRUxMMzIuNDNdCisgKiAKKyAqLworQk9PTDMyIFdJTkFQSSBQYXRoSXNFeGUgKExQQ1NUUiBwYXRoKQoreyAgVFJBQ0Uoc2hlbGwsInBhdGg9JXNcbiIscGF0aCk7CisgICAgcmV0dXJuIEZBTFNFOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUGF0aEZpbGVFeGlzdHMgW1NIRUxMMzIuNDVdCkBAIC0yNzQsNiArMjgwLDE3IEBACiAgICAgZWxzZQogICAgIAlyZXR1cm4gVFJVRTsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQYXRoTWF0Y2hTcGVjIFtTSEVMTDMyLjQ2XQorICogCisgKiBOT1RFUworICogICAgIHVzZWQgZnJvbSBDT01ETEczMgorICovCisKK0JPT0wzMiBXSU5BUEkgUGF0aE1hdGNoU3BlYyhMUFNUUiB4LCBMUFNUUiB5KSAKK3sJRklYTUUoc2hlbGwsIiVzICVzIHN0dWJcbiIseCx5KTsKKwlyZXR1cm4gVFJVRTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFBhdGhSZXNvbHZlIFtTSEVMTDMyLjUxXQpAQCAtNDE3LDcgKzQzNCw3IEBACiAgKi8KIERXT1JEIFdJTkFQSQogU0hNYXBQSURMVG9TeXN0ZW1JbWFnZUxpc3RJbmRleChMUFNIRUxMRk9MREVSIHNoLERXT1JEIHksRFdPUkQgeikKLXsgRklYTUUoc2hlbGwsIihmb2xkZXI9JXAsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHNoLHkseik7Cit7IEZJWE1FKHNoZWxsLCIoU0Y9JXAscGlkbD0lMDhseCwlMDhseCk6c3R1Yi5cbiIsc2gseSx6KTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTg3Miw3ICs4ODksOCBAQAogICovCiBCT09MMzIgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4MzJBIChMUFNIRUxMRVhFQ1VURUlORk8zMkEgc2VpKQogeyAJQ0hBUiBzelRlbXBbTUFYX1BBVEhdOwotICAJRklYTUUoc2hlbGwsIiVwIHN0dWJcbiIsc2VpKTsKKworICAJRklYTUUoc2hlbGwsIiglcCk6IHN0dWJcbiIsc2VpKTsKIAogCWlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfSURMSVNUKQogCXsgU0hHZXRQYXRoRnJvbUlETGlzdDMyQSAoc2VpLT5scElETGlzdCxzelRlbXApOwpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL3NobGZvbGRlci5jIGIvZGxscy9zaGVsbDMyL3NobGZvbGRlci5jCmluZGV4IDViMDNkY2IuLmY3OGQzY2MgMTAwNjQ0Ci0tLSBhL2RsbHMvc2hlbGwzMi9zaGxmb2xkZXIuYworKysgYi9kbGxzL3NoZWxsMzIvc2hsZm9sZGVyLmMKQEAgLTQsNyArNCw3IEBACiAgKglDb3B5cmlnaHQgMTk5NwlNYXJjdXMgTWVpc3NuZXIKICAqCUNvcHlyaWdodCAxOTk4CUp1ZXJnZW4gU2NobWllZAogICoKLSAqICAhISEgY3VycmVudGx5IHdvcmsgaW4gcHJvZ3Jlc3Mgb24gYWxsIGNsYXNzZXMgOTgwODE4ICEhIQorICogICEhISBjdXJyZW50bHkgd29yayBpbiBwcm9ncmVzcyBvbiBhbGwgY2xhc3NlcyA5ODA5MzAgISEhCiAgKiAgPGNvbnRhY3QganVlcmdlbi5zY2htaWVkQG1ldHJvbmV0LmRlPgogICovCiAKQEAgLTEwNSw4ICsxMDUsOCBAQAogCXNmPShMUFNIRUxMRk9MREVSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElTaGVsbEZvbGRlcikpOwogCXNmLT5yZWY9MTsKIAlzZi0+bHB2dGJsPSZzZnZ0OwotCXNmLT5tbHBzekZvbGRlcj1OVUxMOwotCXNmLT5tcFNGUGFyZW50PXBQYXJlbnQ7CisJc2YtPm1scHN6Rm9sZGVyPU5VTEw7CS8qIHBhdGggb2YgdGhlIGZvbGRlciAqLworCXNmLT5tcFNGUGFyZW50PXBQYXJlbnQ7CS8qIHBhcnJlbnQgc2hlbGxmb2xkZXIgKi8KIAogCVRSQUNFKHNoZWxsLCIoJXApLT4ocGFyZW50PSVwLCBwaWRsPSVwKVxuIixzZixwUGFyZW50LCBwaWRsKTsKIAkKQEAgLTExNCwyNCArMTE0LDI0IEBACiAJc2YtPm1waWRsID0gSUxDbG9uZShwaWRsKTsKIAlzZi0+bXBpZGxOU1Jvb3QgPSBOVUxMOwogCQotCWlmKHNmLT5tcGlkbCkgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBwaWRsPyovCisJaWYoc2YtPm1waWRsKSAgICAgICAgLyogZG8gd2UgaGF2ZSBhIHBpZGw/ICovCiAJeyBkd1NpemUgPSAwOwotCSAgaWYoc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKQorCSAgaWYoc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKQkJLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBwYXJlbnRzIHBhdGggKi8KIAkgIHsgZHdTaXplICs9IHN0cmxlbihzZi0+bXBTRlBhcmVudC0+bWxwc3pGb2xkZXIpICsgMTsKKwkgICAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPihwYXJlbnQncyBwYXRoPSVzKVxuIixzZiwgZGVidWdzdHJfYShzZi0+bXBTRlBhcmVudC0+bWxwc3pGb2xkZXIpKTsKIAkgIH0gICAKLQkgIGR3U2l6ZSArPSBfSUxHZXRGb2xkZXJUZXh0KHNmLT5tcGlkbCxOVUxMLDApOworCSAgZHdTaXplICs9IF9JTEdldEZvbGRlclRleHQoc2YtPm1waWRsLE5VTEwsMCk7IC8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgZm9sZGVybmFtZSovCiAJICBzZi0+bWxwc3pGb2xkZXIgPSBTSEFsbG9jKGR3U2l6ZSk7CiAJICBpZihzZi0+bWxwc3pGb2xkZXIpCiAJICB7ICooc2YtPm1scHN6Rm9sZGVyKT0weDAwOwotCSAgICBpZihzZi0+bXBTRlBhcmVudC0+bWxwc3pGb2xkZXIpCisJICAgIGlmKHNmLT5tcFNGUGFyZW50LT5tbHBzekZvbGRlcikJCS8qIGlmIHRoZSBwYXJlbnQgaGFzIGEgcGF0aCwgZ2V0IGl0Ki8KIAkgICAgeyAgc3RyY3B5KHNmLT5tbHBzekZvbGRlciwgc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKTsKIAkgICAgICAgUGF0aEFkZEJhY2tzbGFzaCAoc2YtPm1scHN6Rm9sZGVyKTsKIAkgICAgfQogCSAgICBfSUxHZXRGb2xkZXJUZXh0KHNmLT5tcGlkbCwgc2YtPm1scHN6Rm9sZGVyK3N0cmxlbihzZi0+bWxwc3pGb2xkZXIpLCBkd1NpemUtc3RybGVuKHNmLT5tbHBzekZvbGRlcikpOworCSAgICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KG15IHBhdGg9JXMpXG4iLHNmLCBkZWJ1Z3N0cl9hKHNmLT5tbHBzekZvbGRlcikpOwogCSAgfQogCX0KLQkKLQlUUkFDRShzaGVsbCwiLS0gKCVwKS0+KCVwLCVwLHBhcmVudD0lcylcbiIsc2YscFBhcmVudCwgcGlkbCwgZGVidWdzdHJfYShzZi0+bWxwc3pGb2xkZXIpKTsKIAlyZXR1cm4gc2Y7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4OCwxNiArMjg4LDE1IEBACiAJSFdORDMyIGh3bmRPd25lciwKIAlEV09SRCBkd0ZsYWdzLAogCUxQRU5VTUlETElTVCogcHBFbnVtSURMaXN0KQoteyBIUkVTVUxUICBocjsKLQlUUkFDRShzaGVsbCwiKCVwKS0+KEhXTkQ9MHglMDh4LDB4JTA4bHgsJXApXG4iLHRoaXMsaHduZE93bmVyLGR3RmxhZ3MscHBFbnVtSURMaXN0KTsKK3sJVFJBQ0Uoc2hlbGwsIiglcCktPihIV05EPTB4JTA4eCBmbGFncz0weCUwOGx4IHBwbGlzdD0lcClcbiIsdGhpcyxod25kT3duZXIsZHdGbGFncyxwcEVudW1JRExpc3QpOwogCi0gICpwcEVudW1JRExpc3QgPSBOVUxMOwotCSpwcEVudW1JRExpc3QgPSBJRW51bUlETGlzdF9Db25zdHJ1Y3RvciAodGhpcy0+bWxwc3pGb2xkZXIsIGR3RmxhZ3MsICZocik7Ci0gIFRSQUNFKHNoZWxsLCItLSAoJXApLT4obmV3IElEIExpc3Q6ICVwKVxuIix0aGlzLCpwcEVudW1JRExpc3QpOwotICBpZighKnBwRW51bUlETGlzdCkKLSAgeyByZXR1cm4gaHI7Ci0gIH0KLSAgcmV0dXJuIFNfT0s7CQkKKwkqcHBFbnVtSURMaXN0ID0gTlVMTDsKKwkqcHBFbnVtSURMaXN0ID0gSUVudW1JRExpc3RfQ29uc3RydWN0b3IgKHRoaXMtPm1scHN6Rm9sZGVyLCBkd0ZsYWdzKTsKKwlUUkFDRShzaGVsbCwiLS0gKCVwKS0+KG5ldyBJRCBMaXN0OiAlcClcbiIsdGhpcywqcHBFbnVtSURMaXN0KTsKKwlpZighKnBwRW51bUlETGlzdCkKKwl7IHJldHVybiBFX09VVE9GTUVNT1JZOworCX0KKwlyZXR1cm4gU19PSzsJCQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgSVNoZWxsRm9sZGVyX0luaXRpYWxpemUoKQpAQCAtNDk2LDE5ICs0OTUsMjEgQEAKICAgZG8KICAgeyBpZiAoKnBpZGx0ZW1wKQogICAgIHsgaWYgKF9JTElzRGVza3RvcCggKnBpZGx0ZW1wKSkKLSAgICAgIHsgKnJnZkluT3V0IHw9IChTRkdBT19GT0xERVIgfCBTRkdBT19IQVNTVUJGT0xERVIgfCBTRkdBT19GSUxFU1lTQU5DRVNUT1IpOworICAgICAgeyAqcmdmSW5PdXQgfD0gKCBTRkdBT19IQVNTVUJGT0xERVIgfCBTRkdBT19GT0xERVIgfCBTRkdBT19EUk9QVEFSR0VUIHwgU0ZHQU9fSEFTUFJPUFNIRUVUIHwgU0ZHQU9fQ0FOTElOSyApOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoX0lMSXNNeUNvbXB1dGVyKCAqcGlkbHRlbXApKQotICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZPTERFUiB8IFNGR0FPX0hBU1NVQkZPTERFUik7CisgICAgICB7ICpyZ2ZJbk91dCB8PSAoIFNGR0FPX0hBU1NVQkZPTERFUiB8IFNGR0FPX0ZPTERFUiB8IFNGR0FPX0ZJTEVTWVNBTkNFU1RPUgorICAgICAgCQkJfCBTRkdBT19EUk9QVEFSR0VUIHwgU0ZHQU9fSEFTUFJPUFNIRUVUIHwgU0ZHQU9fQ0FOUkVOQU1FIHwgU0ZHQU9fQ0FOTElOSyApOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoX0lMSXNEcml2ZSggKnBpZGx0ZW1wKSkKLSAgICAgIHsgKnJnZkluT3V0IHw9IChTRkdBT19GT0xERVIgfCBTRkdBT19IQVNTVUJGT0xERVIgIHwgU0ZHQU9fRklMRVNZU1RFTSk7CisgICAgICB7ICpyZ2ZJbk91dCB8PSAoIFNGR0FPX0hBU1NVQkZPTERFUiB8IFNGR0FPX0ZJTEVTWVNURU0gIHwgU0ZHQU9fRk9MREVSIHwgU0ZHQU9fRklMRVNZU0FOQ0VTVE9SICB8IAorICAgICAgCQkJU0ZHQU9fRFJPUFRBUkdFVCB8IFNGR0FPX0hBU1BST1BTSEVFVCB8IFNGR0FPX0NBTkxJTksgKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKF9JTElzRm9sZGVyKCAqcGlkbHRlbXApKQotICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZPTERFUiB8IFNGR0FPX0hBU1NVQkZPTERFUiB8IFNGR0FPX0ZJTEVTWVNURU0gKTsKKyAgICAgIHsgKnJnZkluT3V0IHw9ICggU0ZHQU9fSEFTU1VCRk9MREVSIHwgU0ZHQU9fRklMRVNZU1RFTSB8IFNGR0FPX0ZPTERFUiB8IFNGR0FPX0NBUEFCSUxJVFlNQVNLICk7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChfSUxJc1ZhbHVlKCAqcGlkbHRlbXApKQotICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZJTEVTWVNURU0pOworICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZJTEVTWVNURU0gfCBTRkdBT19DQVBBQklMSVRZTUFTSyApOwogICAgICAgfQogICAgIH0KICAgICBwaWRsdGVtcCsrOwpAQCAtNjI0LDE3ICs2MjUsMTQgQEAKIAkJCiAJVFJBQ0Uoc2hlbGwsIiglcCktPihwaWRsPSVwLDB4JTA4bHgsJXApXG4iLHRoaXMscGlkbCxkd0ZsYWdzLGxwTmFtZSk7CiAKLQlpZiAoIXBpZGwpCi0JeyAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0JfSAKLQogCXN6U3BlY2lhbFswXT0weDAwOyAKIAlzekRyaXZlWzBdPTB4MDA7CiAKIAkvKiB0ZXN0IGlmIHNpbXBsZShyZWxhdGl2ZSkgb3IgY29tcGxleChhYnNvbHV0ZSkgcGlkbCAqLwogCXBpZGxUZW1wID0gSUxHZXROZXh0KHBpZGwpOwotCWlmIChwaWRsVGVtcC0+bWtpZC5jYj09MHgwMCkKKwlpZiAocGlkbFRlbXAgJiYgcGlkbFRlbXAtPm1raWQuY2I9PTB4MDApCiAJeyBiU2ltcGxlUGlkbCA9IFRSVUU7CisJICBUUkFDRShzaGVsbCwiLS0gc2ltcGxlIHBpZGxcbiIpOwogCX0KIAlpZiAoX0lMSXNEZXNrdG9wKCBwaWRsKSkKIAl7IHN0cmNweSAoc3pUZXh0LCJEZXNrdG9wIik7CkBAIC02NjcsMTIgKzY2NSwxNSBAQAogCSAgeyBjYXNlIFNIR0ROX05PUk1BTDoKIAkgICAgICBfSUxHZXRQaWRsUGF0aCggcGlkbCwgc3pUZXh0LCBNQVhfUEFUSCk7CiAJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBTSEdETl9JTkZPTERFUiB8IFNIR0ROX0ZPUlBBUlNJTkc6IC8qZmFsbCB0aHJ1Ki8KIAkgICAgY2FzZSBTSEdETl9JTkZPTERFUjoKIAkgICAgICBwaWRsVGVtcCA9IElMRmluZExhc3RJRChwaWRsKTsKIAkgICAgICBpZiAocGlkbFRlbXApCiAJICAgICAgeyBfSUxHZXRJdGVtVGV4dCggcGlkbFRlbXAsIHN6VGV4dCwgTUFYX1BBVEgpOwogCSAgICAgIH0KIAkgICAgICBicmVhazsJCQkJCisKIAkgICAgY2FzZSBTSEdETl9GT1JQQVJTSU5HOgogCSAgICAgIGlmIChiU2ltcGxlUGlkbCkKIAkgICAgICB7IC8qIGlmIHRoZSBJU2hlbGxGb2xkZXIgaGFzIHBhcmVudHMsIGdldCB0aGUgcGF0aCBmcm9tIHRoZQpAQCAtNjk2LDYgKzY5Nyw3IEBACiAJICAgICAgfQogCSAgICAgIGJyZWFrOwogCSAgICBkZWZhdWx0OgorCSAgICAgIFRSQUNFKHNoZWxsLCItLS0gd3JvbmcgZmxhZ3M9JWx4XG4iLCBkd0ZsYWdzKTsKIAkgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOwogCSAgfQogCSAgaWYgKChzelRleHRbMF09PTB4MDAgJiYgc3pEcml2ZVswXSE9MHgwMCl8fCAoYlNpbXBsZVBpZGwgJiYgc3pEcml2ZVswXSE9MHgwMCkpCkBAIC03MDYsNyArNzA4LDcgQEAKIAkgIH0KIAl9CiAgIAotCVRSQUNFKHNoZWxsLCItLSAoJXApLT4oJXMsJXMsJXMpXG4iLHRoaXMsc3pTcGVjaWFsLHN6RHJpdmUsc3pUZXh0KTsKKwlUUkFDRShzaGVsbCwiLS0gKCVwKS0+KCVzKVxuIix0aGlzLHN6VGV4dCk7CiAKIAlpZighKGxwTmFtZSkpCiAJeyAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CmRpZmYgLS1naXQgYS9kbGxzL3NoZWxsMzIvc2hsdmlldy5jIGIvZGxscy9zaGVsbDMyL3NobHZpZXcuYwppbmRleCAzOTM5YjM4Li4xMzMyMmY1IDEwMDY0NAotLS0gYS9kbGxzL3NoZWxsMzIvc2hsdmlldy5jCisrKyBiL2RsbHMvc2hlbGwzMi9zaGx2aWV3LmMKQEAgLTEsMTAgKzEsNyBAQAogLyoKICAqCVNoZWxsVmlldwogICoKLSAqCUNvcHlyaWdodCAxOTk4CUp1ZXJnZW4gU2NobWllZAotICoKLSAqICAhISEgY3VycmVudGx5IHdvcmsgaW4gcHJvZ3Jlc3Mgb24gYWxsIGNsYXNzZXMgOTgwODAxICEhIQotICogIDxjb250YWN0IGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KKyAqCUNvcHlyaWdodCAxOTk4CTxqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGU+CiAgKi8KIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC00OCw2ICs0NSw4IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19TZWxlY3RJdGVtKExQU0hFTExWSUVXLCBMUENJVEVNSURMSVNUIHBpZGxJdGVtLCBVSU5UMzIgdUZsYWdzKTsKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0dldEl0ZW1PYmplY3QoTFBTSEVMTFZJRVcsIFVJTlQzMiB1SXRlbSwgUkVGSUlEIHJpaWQsTFBWT0lEICpwcHYpOwogCitzdGF0aWMgQk9PTDMyIFNoZWxsVmlld19DYW5Eb0lEb2NraW5nV2luZG93KExQU0hFTExWSUVXKTsKKwogc3RhdGljIHN0cnVjdCBJU2hlbGxWaWV3X1ZUYWJsZSBzdnZ0ID0gCiB7IElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UsCiAgIElTaGVsbFZpZXdfQWRkUmVmLApAQCAtNzEsOCArNzAsMTcgQEAKICNkZWZpbmUgSURNX1ZJRVdfRklMRVMgIChGQ0lETV9TSFZJRVdGSVJTVCArIDB4NTAwKQogI2RlZmluZSBJRE1fVklFV19JRFcgICAgKEZDSURNX1NIVklFV0ZJUlNUICsgMHg1MDEpCiAjZGVmaW5lIElETV9NWUZJTEVJVEVNICAoRkNJRE1fU0hWSUVXRklSU1QgKyAweDUwMikKKyNkZWZpbmUgSURfTElTVFZJRVcgICAgIDIwMDAKKyNkZWZpbmUgTUVOVV9PRkZTRVQgIDEKKyNkZWZpbmUgTUVOVV9NQVggICAgIDEwMAorI2RlZmluZSBUT09MQkFSX0lEICAgKEwiU0hFTExETExfRGVmVmlldyIpCisvL3dpbmRvd3N4LmgKKyNkZWZpbmUgR0VUX1dNX0NPTU1BTkRfSUQod3AsIGxwKSAgICAgICAgICAgICAgIExPV09SRCh3cCkKKyNkZWZpbmUgR0VUX1dNX0NPTU1BTkRfSFdORCh3cCwgbHApICAgICAgICAgICAgIChIV05EMzIpKGxwKQorI2RlZmluZSBHRVRfV01fQ09NTUFORF9DTUQod3AsIGxwKSAgICAgICAgICAgICAgSElXT1JEKHdwKQorLy8gd2ludXNlci5oCisjZGVmaW5lIFdNX1NFVFRJTkdDSEFOR0UgICAgICAgICAgICAgICAgV01fV0lOSU5JQ0hBTkdFCiAKLSNkZWZpbmUgVE9PTEJBUl9JRCAgIChMIlNoZWxsVmlldyIpCiB0eXBlZGVmIHN0cnVjdAogeyAgaW50ICAgaWRDb21tYW5kOwogICAgaW50ICAgaUltYWdlOwpAQCAtODcsNiArOTUsMTEgQEAKIHsge0lETV9WSUVXX0ZJTEVTLCAwLCBJRFNfVEJfVklFV19GSUxFUywgSURTX01JX1ZJRVdfRklMRVMsIDAsIFRCU1RBVEVfRU5BQkxFRCwgVEJTVFlMRV9CVVRUT059LAogICB7LTEsIDAsIDAsIDAsIDAsIDAsIDB9ICAgCiB9OworQk9PTDMyIGdfYlZpZXdLZXlzOworQk9PTDMyIGdfYlNob3dJRFc7CisKK3R5cGVkZWYgdm9pZCAoQ0FMTEJBQ0sgKlBGTlNIR0VUU0VUVElOR1NQUk9DKShMUFNIRUxMRkxBR1NUQVRFIGxwc2ZzLCBEV09SRCBkd01hc2spOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElTaGVsbFZpZXdfQ29uc3RydWN0b3IKICovCkBAIC0xMDcsMzAgKzEyMCw3MCBAQAogICByZXR1cm4gc3Y7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIGhlbHBlcmZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIElDb21tRGxnQnJvd3NlcgorKgorKi8KK3N0YXRpYyBCT09MMzIgSXNJbkNvbW1EbGcoTFBTSEVMTFZJRVcgdGhpcykKK3sJcmV0dXJuKHRoaXMtPnBDb21tRGxnQnJvd3NlciAhPSBOVUxMKTsKK30KK3N0YXRpYyBIUkVTVUxUIEluY2x1ZGVPYmplY3QoTFBTSEVMTFZJRVcgdGhpcywgTFBDSVRFTUlETElTVCBwaWRsKQorewlpZiAoIElzSW5Db21tRGxnKHRoaXMpICkKKwl7IFRSQUNFKHNoZWxsLCJJQ29tbURsZ0Jyb3dzZXI6OkluY2x1ZGVPYmplY3QgcGlkbD0lcFxuIiwgcGlkbCk7CisJICByZXR1cm4gKHRoaXMtPnBDb21tRGxnQnJvd3Nlci0+bHB2dGJsLT5mbkluY2x1ZGVPYmplY3QodGhpcy0+cENvbW1EbGdCcm93c2VyLCB0aGlzLCBwaWRsKSk7CisJfQorCXJldHVybiBTX09LOworfQorc3RhdGljIEhSRVNVTFQgT25EZWZhdWx0Q29tbWFuZChMUFNIRUxMVklFVyB0aGlzKQorewlpZiAoSXNJbkNvbW1EbGcodGhpcykpCisJeyBUUkFDRShzaGVsbCwiSUNvbW1EbGdCcm93c2VyOjpPbkRlZmF1bHRDb21tYW5kXG4iKTsKKwkgIHJldHVybiAodGhpcy0+cENvbW1EbGdCcm93c2VyLT5scHZ0YmwtPmZuT25EZWZhdWx0Q29tbWFuZCh0aGlzLT5wQ29tbURsZ0Jyb3dzZXIsIHRoaXMpKTsKKwl9CisJcmV0dXJuIFNfRkFMU0U7Cit9CitzdGF0aWMgSFJFU1VMVCBPblN0YXRlQ2hhbmdlKExQU0hFTExWSUVXIHRoaXMsIFVJTlQzMiB1RmxhZ3MpCit7CWlmIChJc0luQ29tbURsZyh0aGlzKSkKKwl7IFRSQUNFKHNoZWxsLCJJQ29tbURsZ0Jyb3dzZXI6Ok9uU3RhdGVDaGFuZ2UgZmxhZ3M9JXhcbiIsIHVGbGFncyk7CisJICByZXR1cm4gKHRoaXMtPnBDb21tRGxnQnJvd3Nlci0+bHB2dGJsLT5mbk9uU3RhdGVDaGFuZ2UodGhpcy0+cENvbW1EbGdCcm93c2VyLCB0aGlzLCB1RmxhZ3MpKTsKKwl9CisJcmV0dXJuIFNfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbFZpZXdfQ3JlYXRlTGlzdCgpCiAqCi0qIE5PVEVTCi0qICBpbnRlcm5hbAogKi8KLSNkZWZpbmUgSURfTElTVFZJRVcgICAgIDIwMDAKIAogQk9PTDMyIFNoZWxsVmlld19DcmVhdGVMaXN0IChMUFNIRUxMVklFVyB0aGlzKQoteyBEV09SRCBkd1N0eWxlOworewlEV09SRCBkd1N0eWxlOwogCi0gIFRSQUNFKHNoZWxsLCIlcFxuIix0aGlzKTsKKwlUUkFDRShzaGVsbCwiJXBcbiIsdGhpcyk7CiAKLSAgZHdTdHlsZSA9IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFIHwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfAotICAJCSBMVlNfSUNPTiB8IExWU19TSEFSRUlNQUdFTElTVFMgfCBMVlNfRURJVExBQkVMUyA7CisJZHdTdHlsZSA9IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFIHwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBMVlNfU0hBUkVJTUFHRUxJU1RTIHwgTFZTX0VESVRMQUJFTFM7CisJc3dpdGNoICh0aGlzLT5Gb2xkZXJTZXR0aW5ncy5WaWV3TW9kZSkKKwl7IGNhc2UgRlZNX0lDT046CWR3U3R5bGUgfD0gTFZTX0lDT047CQlicmVhazsKKwkgIGNhc2UgRlZNX1NNQUxMSUNPTjogCWR3U3R5bGUgfD0gTFZTX1NNQUxMSUNPTjsJYnJlYWs7CisJICBjYXNlIEZWTV9MSVNUOiAJZHdTdHlsZSB8PSBMVlNfTElTVDsJCWJyZWFrOworCSAgY2FzZSBGVk1fREVUQUlMUzogCWR3U3R5bGUgfD0gTFZTX1JFUE9SVDsJCWJyZWFrOworCX0KKwlpZiAodGhpcy0+Rm9sZGVyU2V0dGluZ3MuZkZsYWdzICYmIEZXRl9BVVRPQVJSQU5HRSkJZHdTdHlsZSB8PSBMVlNfQVVUT0FSUkFOR0U7CisJLyppZiAodGhpcy0+Rm9sZGVyU2V0dGluZ3MuZkZsYWdzICYmIEZXRl9ERVNLVE9QKTsgdXNlZCBmcm9tIGV4cGxvcmVyKi8KKwlpZiAodGhpcy0+Rm9sZGVyU2V0dGluZ3MuZkZsYWdzICYmIEZXRl9TSU5HTEVTRUwpCWR3U3R5bGUgfD0gTFZTX1NJTkdMRVNFTDsKIAotICB0aGlzLT5oV25kTGlzdD1DcmVhdGVXaW5kb3dFeDMyQSggV1NfRVhfQ0xJRU5URURHRSxXQ19MSVNUVklFVzMyQSxOVUxMLGR3U3R5bGUsCi0gIAkJCQkJCQkJMCwwLDAsMCwKLSAgCQkJCQkJCQl0aGlzLT5oV25kLChITUVOVTMyKUlEX0xJU1RWSUVXLHNoZWxsMzJfaEluc3RhbmNlLE5VTEwpOworCXRoaXMtPmhXbmRMaXN0PUNyZWF0ZVdpbmRvd0V4MzJBKCBXU19FWF9DTElFTlRFREdFLAorCQkJCQkgIFdDX0xJU1RWSUVXMzJBLAorCQkJCQkgIE5VTEwsCisJCQkJCSAgZHdTdHlsZSwKKwkJCQkJICAwLDAsMCwwLAorICAJCQkJCSAgdGhpcy0+aFduZCwKKwkJCQkJICAoSE1FTlUzMilJRF9MSVNUVklFVywKKwkJCQkJICBzaGVsbDMyX2hJbnN0YW5jZSwKKwkJCQkJICBOVUxMKTsKIAotICBpZighdGhpcy0+aFduZExpc3QpCi0gICAgIHJldHVybiBGQUxTRTsKKwlpZighdGhpcy0+aFduZExpc3QpCisJICByZXR1cm4gRkFMU0U7CiAKLS8vICBVcGRhdGVTaGVsbFNldHRpbmdzKCk7Ci0gIHJldHVybiBUUlVFOworCS8vICBVcGRhdGVTaGVsbFNldHRpbmdzKCk7CisJcmV0dXJuIFRSVUU7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxWaWV3X0luaXRMaXN0KCkKQEAgLTE3Nyw3ICsyMzAsNiBAQAogCiAgIExpc3RWaWV3X1NldEltYWdlTGlzdCh0aGlzLT5oV25kTGlzdCwgU2hlbGxTbWFsbEljb25MaXN0LCBMVlNJTF9TTUFMTCk7CiAgIExpc3RWaWV3X1NldEltYWdlTGlzdCh0aGlzLT5oV25kTGlzdCwgU2hlbGxCaWdJY29uTGlzdCwgTFZTSUxfTk9STUFMKTsKLSAgTGlzdFZpZXdfU2V0QmtDb2xvcih0aGlzLT5oV25kTGlzdCwgMHgwMDgwMDAwMCApOwogICAKICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xODgsMTMgKzI0MCwxMyBAQAogKiAgaW50ZXJuYWwKICovICAgCiBpbnQgQ0FMTEJBQ0sgU2hlbGxWaWV3X0NvbXBhcmVJdGVtcyhMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIsIExQQVJBTSBscERhdGEpCi17IExQU0hFTExGT0xERVIgIHBGb2xkZXIgPSAoTFBTSEVMTEZPTERFUilscERhdGE7Cit7CUxQU0hFTExGT0xERVIgIHBGb2xkZXIgPSAoTFBTSEVMTEZPTERFUilscERhdGE7CiAKLSAgVFJBQ0Uoc2hlbGwsIlxuIik7Ci0gIGlmKCFwRm9sZGVyKQotICAgIHJldHVybiAwOworCVRSQUNFKHNoZWxsLCJcbiIpOworCWlmKCFwRm9sZGVyKQorCSAgcmV0dXJuIDA7CiAKLSByZXR1cm4gKGludClwRm9sZGVyLT5scHZ0YmwtPmZuQ29tcGFyZUlEcyhwRm9sZGVyLCAwLCAoTFBJVEVNSURMSVNUKWxQYXJhbTEsIChMUElURU1JRExJU1QpbFBhcmFtMik7CisJcmV0dXJuIChpbnQpcEZvbGRlci0+bHB2dGJsLT5mbkNvbXBhcmVJRHMocEZvbGRlciwgMCwgKExQSVRFTUlETElTVClsUGFyYW0xLCAoTFBJVEVNSURMSVNUKWxQYXJhbTIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIyMywxMiArMjc1LDE5IEBACiAgICAgICBsdkl0ZW0ubFBhcmFtID0gKExQQVJBTSlJTENsb25lKHBpZGwpOwkJLypzZXQgdGhlIGl0ZW0ncyBkYXRhKi8KICAgICAgIGx2SXRlbS5wc3pUZXh0ID0gTFBTVFJfVEVYVENBTExCQUNLMzJBOwkJLypnZXQgdGV4dCBvbiBhIGNhbGxiYWNrIGJhc2lzKi8KICAgICAgIGx2SXRlbS5pSW1hZ2UgPSBJX0lNQUdFQ0FMTEJBQ0s7CQkJCS8qZ2V0IHRoZSBpbWFnZSBvbiBhIGNhbGxiYWNrIGJhc2lzKi8KLSAgICAgIExpc3RWaWV3X0luc2VydEl0ZW0zMkEodGhpcy0+aFduZExpc3QsICZsdkl0ZW0pOwkvKmFkZCB0aGUgaXRlbSovICAgIAorICAgICAgaWYgKCBTX09LID09IEluY2x1ZGVPYmplY3QodGhpcywgSUxDbG9uZShwaWRsKSApKQkvKiBmaXhtZSBmcmVlIHRoZSBwaWRsKi8KKyAgICAgIHsgTGlzdFZpZXdfSW5zZXJ0SXRlbTMyQSh0aGlzLT5oV25kTGlzdCwgJmx2SXRlbSk7CS8qYWRkIHRoZSBpdGVtKi8gICAgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IFNIRnJlZShwaWRsKTsgLyogbm90IHZpZXdlZCAqLworICAgICAgfQorCiAgICB9CiAKICAgIC8qc29ydCB0aGUgaXRlbXMqLwotICAgTGlzdFZpZXdfU29ydEl0ZW1zKHRoaXMtPmhXbmRMaXN0LCBTaGVsbFZpZXdfQ29tcGFyZUl0ZW1zLCAoTFBBUkFNKXRoaXMtPnBTRlBhcmVudCk7Ci0gICAgIAorICAgLyogTGlzdFZpZXdfU29ydEl0ZW1zKHRoaXMtPmhXbmRMaXN0LCBTaGVsbFZpZXdfQ29tcGFyZUl0ZW1zLCAoTFBBUkFNKXRoaXMtPnBTRlBhcmVudCk7Ki8KKworICAgCiAgICAvKnR1cm4gdGhlIGxpc3R2aWV3J3MgcmVkcmF3aW5nIGJhY2sgb24gYW5kIGZvcmNlIGl0IHRvIGRyYXcqLwogICAgU2VuZE1lc3NhZ2UzMkEodGhpcy0+aFduZExpc3QsIFdNX1NFVFJFRFJBVywgVFJVRSwgMCk7CiAgICBJbnZhbGlkYXRlUmVjdDMyKHRoaXMtPmhXbmRMaXN0LCBOVUxMLCBUUlVFKTsKQEAgLTI0Niw0MyArMzA1LDQ3IEBACiAqLyAgIAogTFJFU1VMVCBTaGVsbFZpZXdfT25DcmVhdGUoTFBTSEVMTFZJRVcgdGhpcykKIHsgVFJBQ0Uoc2hlbGwsIiVwXG4iLHRoaXMpOworCiAgIGlmKFNoZWxsVmlld19DcmVhdGVMaXN0KHRoaXMpKQogICB7ICBpZihTaGVsbFZpZXdfSW5pdExpc3QodGhpcykpCiAgICAgIHsgU2hlbGxWaWV3X0ZpbGxMaXN0KHRoaXMpOwogICAgICB9CiAgIH0KKwogICByZXR1cm4gU19PSzsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU2hlbGxWaWV3X09uU2l6ZSgpCiAqLyAgIAogTFJFU1VMVCBTaGVsbFZpZXdfT25TaXplKExQU0hFTExWSUVXIHRoaXMsIFdPUkQgd1dpZHRoLCBXT1JEIHdIZWlnaHQpCi17IFRSQUNFKHNoZWxsLCIlcCB3aWR0aD0ldSBoZWlnaHQ9JXVcbiIsdGhpcywgd1dpZHRoLHdIZWlnaHQpOwotICAvL3Jlc2l6ZSB0aGUgTGlzdFZpZXcgdG8gZml0IG91ciB3aW5kb3cKLSAgaWYodGhpcy0+aFduZExpc3QpCi0gIHsgTW92ZVdpbmRvdzMyKHRoaXMtPmhXbmRMaXN0LCAwLCAwLCB3V2lkdGgsIHdIZWlnaHQsIFRSVUUpOwotICB9Ci0gIHJldHVybiBTX09LOworewlUUkFDRShzaGVsbCwiJXAgd2lkdGg9JXUgaGVpZ2h0PSV1XG4iLHRoaXMsIHdXaWR0aCx3SGVpZ2h0KTsKKworCS8qcmVzaXplIHRoZSBMaXN0VmlldyB0byBmaXQgb3VyIHdpbmRvdyovCisJaWYodGhpcy0+aFduZExpc3QpCisJeyBNb3ZlV2luZG93MzIodGhpcy0+aFduZExpc3QsIDAsIDAsIHdXaWR0aCwgd0hlaWdodCwgVFJVRSk7CisJfQorCisJcmV0dXJuIFNfT0s7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxWaWV3X0J1aWxkRmlsZU1lbnUoKQogKi8gICAKIEhNRU5VMzIgU2hlbGxWaWV3X0J1aWxkRmlsZU1lbnUoTFBTSEVMTFZJRVcgdGhpcykKLXsgICBDSEFSCQkJc3pUZXh0W01BWF9QQVRIXTsKK3sJQ0hBUgkJCXN6VGV4dFtNQVhfUEFUSF07CiAJTUVOVUlURU1JTkZPMzJBCW1paTsKIAlpbnQJCQkJblRvb2xzLGk7CiAJSE1FTlUzMiAJCWhTdWJNZW51OwogCi0JVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKwlUUkFDRShzaGVsbCwiKCVwKSBzZW1pLXN0dWJcbiIsdGhpcyk7CiAKLSAgICBoU3ViTWVudSA9IENyZWF0ZVBvcHVwTWVudTMyKCk7CisJaFN1Yk1lbnUgPSBDcmVhdGVQb3B1cE1lbnUzMigpOwogCWlmKGhTdWJNZW51KQogCXsgLypnZXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBvdXIgZ2xvYmFsIGFycmF5Ki8KIAkgIGZvcihuVG9vbHMgPSAwOyBnX1Rvb2xzW25Ub29sc10uaWRDb21tYW5kICE9IC0xOyBuVG9vbHMrKyl7fQogCi0JICAvL2FkZCB0aGUgbWVudSBpdGVtcworCSAgLyphZGQgdGhlIG1lbnUgaXRlbXMqLwogCSAgZm9yKGkgPSAwOyBpIDwgblRvb2xzOyBpKyspCi0gICAgICB7IHN0cmNweShzelRleHQsICJkdW1teSA0NCIpOworCSAgeyBzdHJjcHkoc3pUZXh0LCAiZHVtbXkgQnVpbGRGaWxlTWVudSIpOwogICAgICAgCiAJICAgIFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOwogCSAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7CkBAIC0yOTAsMTYgKzM1MywxNiBAQAogCiAJICAgIGlmKFRCU1RZTEVfU0VQICE9IGdfVG9vbHNbaV0uYlN0eWxlKQogCSAgICB7IG1paS5mVHlwZSA9IE1GVF9TVFJJTkc7Ci0gICAgICAgICAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEOwotICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gc3pUZXh0OwotICAgICAgICAgIG1paS53SUQgPSBnX1Rvb2xzW2ldLmlkQ29tbWFuZDsKLSAgICAgICAgfQorCSAgICAgIG1paS5mU3RhdGUgPSBNRlNfRU5BQkxFRDsKKwkgICAgICBtaWkuZHdUeXBlRGF0YSA9IHN6VGV4dDsKKwkgICAgICBtaWkud0lEID0gZ19Ub29sc1tpXS5pZENvbW1hbmQ7CisJICAgIH0KIAkgICAgZWxzZQotICAgICAgICB7IG1paS5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgICAgIH0KLSAgICAgICAgLyogdGFjayB0aGlzIGl0ZW0gb250byB0aGUgZW5kIG9mIHRoZSBtZW51ICovCi0gICAgICAgIEluc2VydE1lbnVJdGVtMzJBKGhTdWJNZW51LCAoVUlOVDMyKS0xLCBUUlVFLCAmbWlpKTsKLSAgICAgIH0KKwkgICAgeyBtaWkuZlR5cGUgPSBNRlRfU0VQQVJBVE9SOworCSAgICB9CisJICAgIC8qIHRhY2sgdGhpcyBpdGVtIG9udG8gdGhlIGVuZCBvZiB0aGUgbWVudSAqLworCSAgICBJbnNlcnRNZW51SXRlbTMyQShoU3ViTWVudSwgKFVJTlQzMiktMSwgVFJVRSwgJm1paSk7CisJICB9CiAJfQogCXJldHVybiBoU3ViTWVudTsKIH0KQEAgLTM2Nyw2ICs0MzAsMjQgQEAKIAl9CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hlbGxWaWV3X1VwZGF0ZU1lbnUoKQorKi8KK0xSRVNVTFQgU2hlbGxWaWV3X1VwZGF0ZU1lbnUoTFBTSEVMTFZJRVcgdGhpcywgSE1FTlUzMiBoTWVudSkKK3sJVFJBQ0Uoc2hlbGwsIiglcCktPihtZW51PTB4JTA4eFxuIix0aGlzLGhNZW51KTsKKwlDaGVja01lbnVJdGVtMzIoaE1lbnUsIElETV9WSUVXX0ZJTEVTLCBNRl9CWUNPTU1BTkQgfCAoZ19iVmlld0tleXMgPyBNRl9DSEVDS0VEOiBNRl9VTkNIRUNLRUQpKTsKKworCWlmKFNoZWxsVmlld19DYW5Eb0lEb2NraW5nV2luZG93KHRoaXMpKQorCXsgRW5hYmxlTWVudUl0ZW0zMihoTWVudSwgSURNX1ZJRVdfSURXLCBNRl9CWUNPTU1BTkQgfCBNRl9FTkFCTEVEKTsKKwkgIENoZWNrTWVudUl0ZW0zMihoTWVudSwgSURNX1ZJRVdfSURXLCBNRl9CWUNPTU1BTkQgfCAoZ19iU2hvd0lEVyA/IE1GX0NIRUNLRUQ6IE1GX1VOQ0hFQ0tFRCkpOworCX0KKwllbHNlCisJeyBFbmFibGVNZW51SXRlbTMyKGhNZW51LCBJRE1fVklFV19JRFcsIE1GX0JZQ09NTUFORCB8IE1GX0RJU0FCTEVEIHwgTUZfR1JBWUVEKTsKKwkgIENoZWNrTWVudUl0ZW0zMihoTWVudSwgSURNX1ZJRVdfSURXLCBNRl9CWUNPTU1BTkQgfCBNRl9VTkNIRUNLRUQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsVmlld19PbkRlYWN0aXZhdGUoKQogKgogKiBOT1RFUwpAQCAtMzkxLDY0ICs0NzIsNjMgQEAKICovICAgCiBMUkVTVUxUIFNoZWxsVmlld19PbkFjdGl2YXRlKExQU0hFTExWSUVXIHRoaXMsIFVJTlQzMiB1U3RhdGUpCiB7CU9MRU1FTlVHUk9VUFdJRFRIUzMyICAgb213ID0geyB7MCwgMCwgMCwgMCwgMCwgMH0gfTsKLSAgICBNRU5VSVRFTUlORk8zMkEgICAgICAgICBtaWk7Ci0gICAgQ0hBUiAgICAgICAgICAgICAgICBzelRleHRbTUFYX1BBVEhdOworCU1FTlVJVEVNSU5GTzMyQSAgICAgICAgIG1paTsKKwlDSEFSICAgICAgICAgICAgICAgIHN6VGV4dFtNQVhfUEFUSF07CiAKIAlUUkFDRShzaGVsbCwiJXAgdVN0YXRlPSV4XG4iLHRoaXMsdVN0YXRlKTsgICAgCiAKIAkvL2Rvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBzdGF0ZSBpc24ndCByZWFsbHkgY2hhbmdpbmcKIAlpZih0aGlzLT51U3RhdGUgPT0gdVN0YXRlKQogCXsgcmV0dXJuIFNfT0s7Ci0gICAgfQorCX0KIAogCVNoZWxsVmlld19PbkRlYWN0aXZhdGUodGhpcyk7CiAKIAkvL29ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgYWN0aXZlCiAJaWYodVN0YXRlICE9IFNWVUlBX0RFQUNUSVZBVEUpCiAJeyAvL21lcmdlIHRoZSBtZW51cwotICAgICAgdGhpcy0+aE1lbnUgPSBDcmVhdGVNZW51MzIoKTsKKwkgIHRoaXMtPmhNZW51ID0gQ3JlYXRlTWVudTMyKCk7CiAgICAKIAkgIGlmKHRoaXMtPmhNZW51KQogCSAgeyB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuSW5zZXJ0TWVudXNTQih0aGlzLT5wU2hlbGxCcm93c2VyLCB0aGlzLT5oTWVudSwgJm9tdyk7CiAKLSAgICAgICAgLy9idWlsZCB0aGUgdG9wIGxldmVsIG1lbnUKLSAgICAgICAgLy9nZXQgdGhlIG1lbnUgaXRlbSdzIHRleHQKLSAgICAgICAgc3RyY3B5KHN6VGV4dCwiZHVtbXkgMzEiKTsKKwkgICAgLypidWlsZCB0aGUgdG9wIGxldmVsIG1lbnUgZ2V0IHRoZSBtZW51IGl0ZW0ncyB0ZXh0Ki8KKwkgICAgc3RyY3B5KHN6VGV4dCwiZHVtbXkgMzEiKTsKICAgICAgIAotICAgICAgICBaZXJvTWVtb3J5KCZtaWksIHNpemVvZihtaWkpKTsKLSAgICAgICAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOwotICAgICAgICBtaWkuZk1hc2sgPSBNSUlNX1NVQk1FTlUgfCBNSUlNX1RZUEUgfCBNSUlNX1NUQVRFOwotICAgICAgICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOwotICAgICAgICBtaWkuZlN0YXRlID0gTUZTX0VOQUJMRUQ7Ci0gICAgICAgIG1paS5kd1R5cGVEYXRhID0gc3pUZXh0OwotICAgICAgICBtaWkuaFN1Yk1lbnUgPSBTaGVsbFZpZXdfQnVpbGRGaWxlTWVudSh0aGlzKTsKKwkgICAgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisJICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKKwkgICAgbWlpLmZNYXNrID0gTUlJTV9TVUJNRU5VIHwgTUlJTV9UWVBFIHwgTUlJTV9TVEFURTsKKwkgICAgbWlpLmZUeXBlID0gTUZUX1NUUklORzsKKwkgICAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEOworCSAgICBtaWkuZHdUeXBlRGF0YSA9IHN6VGV4dDsKKwkgICAgbWlpLmhTdWJNZW51ID0gU2hlbGxWaWV3X0J1aWxkRmlsZU1lbnUodGhpcyk7CiAKLSAgICAgICAgLy9pbnNlcnQgb3VyIG1lbnUgaW50byB0aGUgbWVudSBiYXIKLSAgICAgICAgaWYobWlpLmhTdWJNZW51KQotICAgICAgICB7IEluc2VydE1lbnVJdGVtMzJBKHRoaXMtPmhNZW51LCBGQ0lETV9NRU5VX0hFTFAsIEZBTFNFLCAmbWlpKTsKLSAgICAgICAgfQorCSAgICAvKmluc2VydCBvdXIgbWVudSBpbnRvIHRoZSBtZW51IGJhciovCisJICAgIGlmKG1paS5oU3ViTWVudSkKKwkgICAgeyBJbnNlcnRNZW51SXRlbTMyQSh0aGlzLT5oTWVudSwgRkNJRE1fTUVOVV9IRUxQLCBGQUxTRSwgJm1paSk7CisJICAgIH0KIAotICAgICAgICAvL2dldCB0aGUgdmlldyBtZW51IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0Ci0gICAgICAgIFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOwotICAgICAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7Ci0gICAgICAgIG1paS5mTWFzayA9IE1JSU1fU1VCTUVOVTsKKwkgICAgLypnZXQgdGhlIHZpZXcgbWVudSBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCovCisJICAgIFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOworCSAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7CisJICAgIG1paS5mTWFzayA9IE1JSU1fU1VCTUVOVTsKICAgICAgIAogCSAgICBpZihHZXRNZW51SXRlbUluZm8zMkEodGhpcy0+aE1lbnUsIEZDSURNX01FTlVfVklFVywgRkFMU0UsICZtaWkpKQogCSAgICB7IFNoZWxsVmlld19NZXJnZVZpZXdNZW51KHRoaXMsIG1paS5oU3ViTWVudSk7Ci0gICAgICAgIH0KKwkgICAgfQogCi0gICAgICAgIC8vYWRkIHRoZSBpdGVtcyB0aGF0IHNob3VsZCBvbmx5IGJlIGFkZGVkIGlmIHdlIGhhdmUgdGhlIGZvY3VzCi0gICAgICAgIGlmKFNWVUlBX0FDVElWQVRFX0ZPQ1VTID09IHVTdGF0ZSkKKwkgICAgLyphZGQgdGhlIGl0ZW1zIHRoYXQgc2hvdWxkIG9ubHkgYmUgYWRkZWQgaWYgd2UgaGF2ZSB0aGUgZm9jdXMqLworCSAgICBpZihTVlVJQV9BQ1RJVkFURV9GT0NVUyA9PSB1U3RhdGUpCiAJICAgIHsgLy9nZXQgdGhlIGZpbGUgbWVudSBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdAogCSAgICAgIFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOwotICAgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKKwkgICAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7CiAJICAgICAgbWlpLmZNYXNrID0gTUlJTV9TVUJNRU5VOwogICAgICAgCiAJICAgICAgaWYoR2V0TWVudUl0ZW1JbmZvMzJBKHRoaXMtPmhNZW51LCBGQ0lETV9NRU5VX0ZJTEUsIEZBTFNFLCAmbWlpKSkKIAkgICAgICB7IFNoZWxsVmlld19NZXJnZUZpbGVNZW51KHRoaXMsIG1paS5oU3ViTWVudSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5TZXRNZW51U0IodGhpcy0+cFNoZWxsQnJvd3NlciwgdGhpcy0+aE1lbnUsIDAsIHRoaXMtPmhXbmQpOworCSAgICAgIH0KKwkgICAgfQorCSAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mblNldE1lbnVTQih0aGlzLT5wU2hlbGxCcm93c2VyLCB0aGlzLT5oTWVudSwgMCwgdGhpcy0+aFduZCk7CiAJICB9CiAJfQogCXRoaXMtPnVTdGF0ZSA9IHVTdGF0ZTsKQEAgLTQ2MiwxOCArNTQyLDE2IEBACiAqICBpbnRlcm5hbAogKi8KIExSRVNVTFQgU2hlbGxWaWV3X09uU2V0Rm9jdXMoTFBTSEVMTFZJRVcgdGhpcykKLXsgVFJBQ0Uoc2hlbGwsIiVwXG4iLHRoaXMpOwotICAvKiBUZWxsIHRoZSBicm93c2VyIG9uZSBvZiBvdXIgd2luZG93cyBoYXMgcmVjZWl2ZWQgdGhlIGZvY3VzLiBUaGlzIHNob3VsZCBhbHdheXMgCi0gIGJlIGRvbmUgYmVmb3JlIG1lcmdpbmcgbWVudXMgKE9uQWN0aXZhdGUgbWVyZ2VzIHRoZSBtZW51cykgaWYgb25lIG9mIG91ciAKLSAgd2luZG93cyBoYXMgdGhlIGZvY3VzLiovCi0gIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5PblZpZXdXaW5kb3dBY3RpdmUodGhpcy0+cFNoZWxsQnJvd3Nlcix0aGlzKTsKLSAgU2hlbGxWaWV3X09uQWN0aXZhdGUodGhpcywgU1ZVSUFfQUNUSVZBVEVfRk9DVVMpOworewlUUkFDRShzaGVsbCwiJXBcbiIsdGhpcyk7CisJLyogVGVsbCB0aGUgYnJvd3NlciBvbmUgb2Ygb3VyIHdpbmRvd3MgaGFzIHJlY2VpdmVkIHRoZSBmb2N1cy4gVGhpcyBzaG91bGQgYWx3YXlzIAorCWJlIGRvbmUgYmVmb3JlIG1lcmdpbmcgbWVudXMgKE9uQWN0aXZhdGUgbWVyZ2VzIHRoZSBtZW51cykgaWYgb25lIG9mIG91ciAKKwl3aW5kb3dzIGhhcyB0aGUgZm9jdXMuKi8KKwl0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuT25WaWV3V2luZG93QWN0aXZlKHRoaXMtPnBTaGVsbEJyb3dzZXIsdGhpcyk7CisJU2hlbGxWaWV3X09uQWN0aXZhdGUodGhpcywgU1ZVSUFfQUNUSVZBVEVfRk9DVVMpOwogCi0gIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi1CT09MMzIgZ19iVmlld0tleXM7Ci1CT09MMzIgZ19iU2hvd0lEVzsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbFZpZXdfT25LaWxsRm9jdXMoKQogKi8gICAKQEAgLTQ4NywxMTIgKzU2NSw4NSBAQAogKiBTaGVsbFZpZXdfQWRkUmVtb3ZlRG9ja2luZ1dpbmRvdygpCiAqLyAgIAogQk9PTDMyIFNoZWxsVmlld19BZGRSZW1vdmVEb2NraW5nV2luZG93KExQU0hFTExWSUVXIHRoaXMsIEJPT0wzMiBiQWRkKQotewlUUkFDRShzaGVsbCwiKCVwKS0+KGJhZGQ9MHglMDh4KSBzdHViXG4iLHRoaXMsYkFkZCk7Ci0JcmV0dXJuIEZBTFNFOwotLyoKLQlCT09MMzIgICAgICAgICAgICAgIGJSZXR1cm4gPSBGQUxTRTsKLQlIUkVTVUxUMzIgICAgICAgICAgIGhyOwotCUlTZXJ2aWNlUHJvdmlkZXIgICpwU1A7Ci0qLworewlCT09MMzIJYlJldHVybiA9IEZBTFNFOworCUhSRVNVTFQJaHI7CisJTFBTRVJWSUNFUFJPVklERVIJcFNQOworCUxQRE9DS0lOR1dJTkRPV0ZSQU1FCXBGcmFtZTsKKwkKKwlGSVhNRShzaGVsbCwiKCVwKS0+KGJhZGQ9MHglMDh4KSBzdHViXG4iLHRoaXMsYkFkZCk7CisKIAkvKiBnZXQgdGhlIGJyb3dzZXIncyBJU2VydmljZVByb3ZpZGVyICovCi0vKglociA9IHRoaXMtPnBTaGVsbEJyb3dzZXItPlF1ZXJ5SW50ZXJmYWNlKChSRUZJSUQpSUlEX0lTZXJ2aWNlUHJvdmlkZXIsIChMUFZPSUQqKSZwU1ApOworCWhyID0gdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKHRoaXMtPnBTaGVsbEJyb3dzZXIsIChSRUZJSUQpJklJRF9JU2VydmljZVByb3ZpZGVyLCAoTFBWT0lEKikmcFNQKTsKIAlpZihTVUNDRUVERUQoaHIpKQotCXsKLQlJRG9ja2luZ1dpbmRvd0ZyYW1lICpwRnJhbWU7Ci0qLwotCS8qZ2V0IHRoZSBJRG9ja2luZ1dpbmRvd0ZyYW1lIHBvaW50ZXIqLwotLyoKLQlociA9IHBTUC0+UXVlcnlTZXJ2aWNlKFNJRF9TU2hlbGxCcm93c2VyLCBJSURfSURvY2tpbmdXaW5kb3dGcmFtZSwgKExQVk9JRCopJnBGcmFtZSk7Ci0JaWYoU1VDQ0VFREVEKGhyKSkKLQl7IGlmKGJBZGQpCi0JICB7IGhyID0gU19PSzsKLQkJaWYoIXRoaXMtPnBEb2NraW5nV2luZG93KQotCQl7IC8vY3JlYXRlIHRoZSB0b29sYmFyIG9iamVjdAotCSAgICAgIHRoaXMtPnBEb2NraW5nV2luZG93ID0gbmV3IENEb2NraW5nV2luZG93KHRoaXMsIHRoaXMtPmhXbmQpOwotCSAgICB9Ci0KLQkgICAgaWYodGhpcy0+cERvY2tpbmdXaW5kb3cpCi0gICAgICAgIHsgLy9hZGQgdGhlIHRvb2xiYXIgb2JqZWN0Ci0JICAgICAgaHIgPSBwRnJhbWUtPkFkZFRvb2xiYXIoKElEb2NraW5nV2luZG93Kil0aGlzLT5wRG9ja2luZ1dpbmRvdywgVE9PTEJBUl9JRCwgMCk7Ci0KLQkgICAgICBpZihTVUNDRUVERUQoaHIpKQotICAgICAgICAgIHsgYlJldHVybiA9IFRSVUU7CisJeyAvKmdldCB0aGUgSURvY2tpbmdXaW5kb3dGcmFtZSBwb2ludGVyKi8KKwkgIGhyID0gcFNQLT5scHZ0YmwtPmZuUXVlcnlTZXJ2aWNlKHBTUCwgJlNJRF9TU2hlbGxCcm93c2VyLCAmSUlEX0lEb2NraW5nV2luZG93RnJhbWUsIChMUFZPSUQqKSZwRnJhbWUpOworCSAgaWYoU1VDQ0VFREVEKGhyKSkKKwkgIHsgaWYoYkFkZCkKKwkgICAgeyBociA9IFNfT0s7CisJICAgICAgLyppZighdGhpcy0+cERvY2tpbmdXaW5kb3cpCisJICAgICAgeyAvL2NyZWF0ZSB0aGUgdG9vbGJhciBvYmplY3QKKwkgICAgICAgIHRoaXMtPnBEb2NraW5nV2luZG93ID0gRG9ja2luZ1dpbmRvd19Db25zdHJ1Y3Rvcih0aGlzLCB0aGlzLT5oV25kKTsKIAkgICAgICB9Ci0JICAgIH0KLQkgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgaWYodGhpcy0+cERvY2tpbmdXaW5kb3cpCi0gICAgICAgIHsgaHIgPSBwRnJhbWUtPlJlbW92ZVRvb2xiYXIoKElEb2NraW5nV2luZG93Kil0aGlzLT5wRG9ja2luZ1dpbmRvdywgRFdGUkZfTk9STUFMKTsKIAotCSAgICAgIGlmKFNVQ0NFRURFRChocikpCi0gICAgICAgICAgeyovCi0gICAgICAgICAgICAvKiBSZW1vdmVUb29sYmFyIHNob3VsZCByZWxlYXNlIHRoZSB0b29sYmFyIG9iamVjdCB3aGljaCB3aWxsIGNhdXNlIAotICAgICAgICAgICAgaXQgdG8gZGVzdHJveSBpdHNlbGYuIE91ciB0b29sYmFyIG9iamVjdCBpcyBubyBsb25nZXIgdmFsaWQgYXQgCi0gICAgICAgICAgICB0aGlzIHBvaW50LiovCisJICAgICAgaWYodGhpcy0+cERvY2tpbmdXaW5kb3cpCisJICAgICAgeyAvL2FkZCB0aGUgdG9vbGJhciBvYmplY3QKKwkgICAgICAgIGhyID0gcEZyYW1lLT5scHZ0YmwtPmZuQWRkVG9vbGJhcihwRnJhbWUsIChJRG9ja2luZ1dpbmRvdyopdGhpcy0+cERvY2tpbmdXaW5kb3csIFRPT0xCQVJfSUQsIDApOworCisJICAgICAgICBpZihTVUNDRUVERUQoaHIpKQorCSAgICAgICAgeyBiUmV0dXJuID0gVFJVRTsKKwkgICAgICAgIH0KKwkgICAgICB9Ki8KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsgLyppZih0aGlzLT5wRG9ja2luZ1dpbmRvdykKKwkgICAgICB7IGhyID0gcEZyYW1lLT4tPmxwdnRibC0+Zm5SZW1vdmVUb29sYmFyKHBGcmFtZSwgKElEb2NraW5nV2luZG93Kil0aGlzLT5wRG9ja2luZ1dpbmRvdywgRFdGUkZfTk9STUFMKTsKKworCSAgICAgICAgaWYoU1VDQ0VFREVEKGhyKSkKKwkgICAgICAgIHsgLy8gUmVtb3ZlVG9vbGJhciBzaG91bGQgcmVsZWFzZSB0aGUgdG9vbGJhciBvYmplY3Qgd2hpY2ggd2lsbCBjYXVzZSAKKwkgICAgICAgICAgLy9pdCB0byBkZXN0cm95IGl0c2VsZi4gT3VyIHRvb2xiYXIgb2JqZWN0IGlzIG5vIGxvbmdlciB2YWxpZCBhdCAKKwkgICAgICAgICAgLy90aGlzIHBvaW50LgogICAgICAgICAgICAgCi0vKiAgICAgICAgICB0aGlzLT5wRG9ja2luZ1dpbmRvdyA9IE5VTEw7Ci0JICAgICAgICBiUmV0dXJuID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgIH0KKwkgICAgICAgICAgdGhpcy0+cERvY2tpbmdXaW5kb3cgPSBOVUxMOworCSAgICAgICAgICBiUmV0dXJuID0gVFJVRTsKKwkgICAgICAgIH0KKwkgICAgICB9Ki8KIAkgICAgfQotCSAgICBwRnJhbWUtPlJlbGVhc2UoKTsKLSAgICAgIH0KLQkgIHBTUC0+UmVsZWFzZSgpOworCSAgICBwRnJhbWUtPmxwdnRibC0+Zm5SZWxlYXNlKHBGcmFtZSk7CisJICB9CisJICBwU1AtPmxwdnRibC0+Zm5SZWxlYXNlKHBTUCk7CiAJfQotCXJldHVybiBiUmV0dXJuOyovCisJcmV0dXJuIGJSZXR1cm47CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbFZpZXdfQ2FuRG9JRG9ja2luZ1dpbmRvdygpCiAqLyAgIAogQk9PTDMyIFNoZWxsVmlld19DYW5Eb0lEb2NraW5nV2luZG93KExQU0hFTExWSUVXIHRoaXMpCi17CVRSQUNFKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7Ci0JcmV0dXJuIEZBTFNFOwotLyoKLQlCT09MMzIgICAgICAgICAgICAgIGJSZXR1cm4gPSBGQUxTRTsKLQlIUkVTVUxUMzIgICAgICAgICAgIGhyOwotCUlTZXJ2aWNlUHJvdmlkZXIJKnBTUDsKLQlJRG9ja2luZ1dpbmRvd0ZyYW1lICpwRnJhbWU7Ci0KLQkvL2dldCB0aGUgYnJvd3NlcidzIElTZXJ2aWNlUHJvdmlkZXIKLQlociA9IHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5RdWVyeUludGVyZmFjZSh0aGlzLT5wU2hlbGxCcm93c2VyLCAoUkVGSUlEKUlJRF9JU2VydmljZVByb3ZpZGVyLCAoTFBWT0lEKikmcFNQKTsKK3sJQk9PTDMyIGJSZXR1cm4gPSBGQUxTRTsKKwlIUkVTVUxUIGhyOworCUxQU0VSVklDRVBST1ZJREVSIHBTUDsKKwlMUERPQ0tJTkdXSU5ET1dGUkFNRSBwRnJhbWU7CisJCisJRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKwkKKwkvKmdldCB0aGUgYnJvd3NlcidzIElTZXJ2aWNlUHJvdmlkZXIqLworCWhyID0gdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKHRoaXMtPnBTaGVsbEJyb3dzZXIsIChSRUZJSUQpJklJRF9JU2VydmljZVByb3ZpZGVyLCAoTFBWT0lEKikmcFNQKTsKIAlpZihocj09U19PSykKLQl7IGhyID0gcFNQLT5scHZ0YmwtPmZuUXVlcnlTZXJ2aWNlKHBTUCwgU0lEX1NTaGVsbEJyb3dzZXIsIElJRF9JRG9ja2luZ1dpbmRvd0ZyYW1lLCAoTFBWT0lEKikmcEZyYW1lKTsKKwl7IGhyID0gcFNQLT5scHZ0YmwtPmZuUXVlcnlTZXJ2aWNlKHBTUCwgJlNJRF9TU2hlbGxCcm93c2VyLCAmSUlEX0lEb2NraW5nV2luZG93RnJhbWUsIChMUFZPSUQqKSZwRnJhbWUpOwogICAgCSAgaWYoU1VDQ0VFREVEKGhyKSkKLSAgICAgIHsgYlJldHVybiA9IFRSVUU7Ci0gICAgICAgIHBGcmFtZS0+bHB2dGJsLT5mblJlbGVhc2UocEZyYW1lKTsKLSAgICAgIH0KLQlwU1AtPmxwdnRibC0+Zm5SZWxlYXNlKHBTUCk7CisJICB7IGJSZXR1cm4gPSBUUlVFOworCSAgICBwRnJhbWUtPmxwdnRibC0+Zm5SZWxlYXNlKHBGcmFtZSk7CisJICB9CisJICBwU1AtPmxwdnRibC0+Zm5SZWxlYXNlKHBTUCk7CiAJfQotCXJldHVybiBiUmV0dXJuOyovCi19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogU2hlbGxWaWV3X1VwZGF0ZU1lbnUoKQotKi8KLUxSRVNVTFQgU2hlbGxWaWV3X1VwZGF0ZU1lbnUoTFBTSEVMTFZJRVcgdGhpcywgSE1FTlUzMiBoTWVudSkKLXsJVFJBQ0Uoc2hlbGwsIiglcCktPihtZW51PTB4JTA4eFxuIix0aGlzLGhNZW51KTsKLQlDaGVja01lbnVJdGVtMzIoaE1lbnUsIElETV9WSUVXX0ZJTEVTLCBNRl9CWUNPTU1BTkQgfCAoZ19iVmlld0tleXMgPyBNRl9DSEVDS0VEOiBNRl9VTkNIRUNLRUQpKTsKLQotCWlmKFNoZWxsVmlld19DYW5Eb0lEb2NraW5nV2luZG93KHRoaXMpKQotCXsgRW5hYmxlTWVudUl0ZW0zMihoTWVudSwgSURNX1ZJRVdfSURXLCBNRl9CWUNPTU1BTkQgfCBNRl9FTkFCTEVEKTsKLQkgIENoZWNrTWVudUl0ZW0zMihoTWVudSwgSURNX1ZJRVdfSURXLCBNRl9CWUNPTU1BTkQgfCAoZ19iU2hvd0lEVyA/IE1GX0NIRUNLRUQ6IE1GX1VOQ0hFQ0tFRCkpOwotCX0KLQllbHNlCi0JeyBFbmFibGVNZW51SXRlbTMyKGhNZW51LCBJRE1fVklFV19JRFcsIE1GX0JZQ09NTUFORCB8IE1GX0RJU0FCTEVEIHwgTUZfR1JBWUVEKTsKLQkgIENoZWNrTWVudUl0ZW0zMihoTWVudSwgSURNX1ZJRVdfSURXLCBNRl9CWUNPTU1BTkQgfCBNRl9VTkNIRUNLRUQpOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYlJldHVybjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTaGVsbFZpZXdfVXBkYXRlU2hlbGxTZXR0aW5ncygpCi0gICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiB2b2lkIChDQUxMQkFDSyAqUEZOU0hHRVRTRVRUSU5HU1BST0MpKExQU0hFTExGTEFHU1RBVEUgbHBzZnMsIERXT1JEIGR3TWFzayk7Ci0KLQorKi8KIHZvaWQgU2hlbGxWaWV3X1VwZGF0ZVNoZWxsU2V0dGluZ3MoTFBTSEVMTFZJRVcgdGhpcykKLXsJVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKK3sJRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKIAlyZXR1cm4gOwogLyoKIAlTSEVMTEZMQUdTVEFURSAgICAgICBzZnM7CkBAIC02NDEsMTQgKzY5MiwxMiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIE1FTlVfT0ZGU0VUICAxCi0jZGVmaW5lIE1FTlVfTUFYICAgICAxMDAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgU2hlbGxWaWV3X0RvQ29udGV4dE1lbnUoKQogKi8gICAKIHZvaWQgU2hlbGxWaWV3X0RvQ29udGV4dE1lbnUoTFBTSEVMTFZJRVcgdGhpcywgV09SRCB4LCBXT1JEIHksIEJPT0wzMiBmRGVmYXVsdCkKLXsJVUlOVDMyCQl1Q29tbWFuZCwgaSwgdVNlbGVjdGVkID0gTGlzdFZpZXdfR2V0U2VsZWN0ZWRDb3VudCh0aGlzLT5oV25kTGlzdCk7Cit7CVVJTlQzMgl1Q29tbWFuZCwgaSwgdVNlbGVjdGVkID0gTGlzdFZpZXdfR2V0U2VsZWN0ZWRDb3VudCh0aGlzLT5oV25kTGlzdCk7CisJRFdPUkQJd0ZsYWdzOwogCUhNRU5VMzIgaE1lbnU7CiAJQk9PTDMyICBmRXhwbG9yZSA9IEZBTFNFOwogCUhXTkQzMiAgaHduZFRyZWUgPSAwOwpAQCAtNjYzLDcgKzcxMiw3IEBACiAJYVNlbGVjdGVkSXRlbXMgPSAoTFBJVEVNSURMSVNUKilTSEFsbG9jKHVTZWxlY3RlZCAqIHNpemVvZihMUElURU1JRExJU1QpKTsKIAogCWlmKGFTZWxlY3RlZEl0ZW1zKQotCXsgVFJBQ0Uoc2hlbGwsIi0tIGFTZWxlY3RlZEl0ZW1zXG4iKTsKKwl7IFRSQUNFKHNoZWxsLCItLSBJdGVtcyBzZWxlY3RlZCA9JXVcbiIsIHVTZWxlY3RlZCk7CiAJICBaZXJvTWVtb3J5KCZsdkl0ZW0sIHNpemVvZihsdkl0ZW0pKTsKIAkgIGx2SXRlbS5tYXNrID0gTFZJRl9TVEFURSB8IExWSUZfUEFSQU07CiAJICBsdkl0ZW0uc3RhdGVNYXNrID0gTFZJU19TRUxFQ1RFRDsKQEAgLTY3NSwxOSArNzI0LDI1IEBACiAJICB7IGlmKGx2SXRlbS5zdGF0ZSAmIExWSVNfU0VMRUNURUQpCiAJICAgIHsgYVNlbGVjdGVkSXRlbXNbaV0gPSAoTFBJVEVNSURMSVNUKWx2SXRlbS5sUGFyYW07CiAJICAgICAgaSsrOworCSAgICAgIFRSQUNFKHNoZWxsLCItLSBzZWxlY3RlZCBJdGVtIGZvdW5kXG4iKTsKIAkgICAgfQogCSAgICBsdkl0ZW0uaUl0ZW0rKzsKIAkgIH0KIAotCSAgdGhpcy0+cFNGUGFyZW50LT5scHZ0YmwtPmZuR2V0VUlPYmplY3RPZih0aGlzLT5wU0ZQYXJlbnQsIHRoaXMtPmhXbmRQYXJlbnQsIHVTZWxlY3RlZCwKLSAgICAgIAkJCQkoTFBDSVRFTUlETElTVCopYVNlbGVjdGVkSXRlbXMsICZJSURfSUNvbnRleHRNZW51LCBOVUxMLChMUFZPSUQqKSZwQ29udGV4dE1lbnUpOworCSAgdGhpcy0+cFNGUGFyZW50LT5scHZ0YmwtPmZuR2V0VUlPYmplY3RPZigJdGhpcy0+cFNGUGFyZW50LAorCQkJCQkJCXRoaXMtPmhXbmRQYXJlbnQsCisJCQkJCQkJdVNlbGVjdGVkLAorCQkJCQkJCShMUENJVEVNSURMSVNUKilhU2VsZWN0ZWRJdGVtcywKKwkJCQkJCQkmSUlEX0lDb250ZXh0TWVudSwKKwkJCQkJCQlOVUxMLAorCQkJCQkJCShMUFZPSUQqKSZwQ29udGV4dE1lbnUpOwogICAgCiAJICBpZihwQ29udGV4dE1lbnUpCiAJICB7IFRSQUNFKHNoZWxsLCItLSBwQ29udGV4dE1lbnVcbiIpOwogCSAgICBoTWVudSA9IENyZWF0ZVBvcHVwTWVudTMyKCk7CiAKLSAgICAgICAgLyogU2VlIGlmIHdlIGFyZSBpbiBFeHBsb3JlIG9yIE9wZW4gbW9kZS4gSWYgdGhlIGJyb3dzZXIncyB0cmVlIGlzIHByZXNlbnQsIAotICAgICAgICB0aGVuIHdlIGFyZSBpbiBFeHBsb3JlIG1vZGUuKi8KKyAgICAgICAgICAgIC8qIFNlZSBpZiB3ZSBhcmUgaW4gRXhwbG9yZSBvciBPcGVuIG1vZGUuIElmIHRoZSBicm93c2VyJ3MgdHJlZSBpcyBwcmVzZW50LCAKKyAgICAgICAgICAgIHRoZW4gd2UgYXJlIGluIEV4cGxvcmUgbW9kZS4qLwogICAgICAgICAKIAkgICAgZkV4cGxvcmUgPSBGQUxTRTsKIAkgICAgaHduZFRyZWUgPSAwOwpAQCAtNjk2LDEwICs3NTEsMTIgQEAKIAkgICAgICBmRXhwbG9yZSA9IFRSVUU7CiAJICAgIH0KIAotCSAgICBpZihoTWVudSAmJiBTVUNDRUVERUQocENvbnRleHRNZW51LT5scHZ0YmwtPmZuUXVlcnlDb250ZXh0TWVudShwQ29udGV4dE1lbnUsCi0gICAgICAgIAkJCQkJaE1lbnUsMCxNRU5VX09GRlNFVCxNRU5VX01BWCxDTUZfTk9STUFMIHwgCi0JCQkJCQkJKHVTZWxlY3RlZCAhPSAxID8gMCA6IENNRl9DQU5SRU5BTUUpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZkV4cGxvcmUgPyBDTUZfRVhQTE9SRSA6IDApKSkpCisJICAgIGlmKGhNZW51ICYmIFNVQ0NFRURFRChwQ29udGV4dE1lbnUtPmxwdnRibC0+Zm5RdWVyeUNvbnRleHRNZW51KCBwQ29udGV4dE1lbnUsCisJCQkJCQkJCQkgICAgaE1lbnUsCisJCQkJCQkJCQkgICAgMCwKKwkJCQkJCQkJCSAgICBNRU5VX09GRlNFVCwKKwkJCQkJCQkJCSAgICBNRU5VX01BWCwKKwkJCQkJCQkJCSAgICBDTUZfTk9STUFMIHwgKHVTZWxlY3RlZCAhPSAxID8gMCA6IENNRl9DQU5SRU5BTUUpIHwgKGZFeHBsb3JlID8gQ01GX0VYUExPUkUgOiAwKSkpKQogCSAgICB7IGlmKGZEZWZhdWx0KQogCSAgICAgIHsgVFJBQ0Uoc2hlbGwsIi0tIGZEZWZhdWx0XG4iKTsKIAkgICAgICAgIHVDb21tYW5kID0gMDsKQEAgLTcyNSwxNiArNzgyLDMxIEBACiAJICAgICAgfQogICAgICAgICAgCiAJICAgICAgaWYodUNvbW1hbmQgPiAwKQotCSAgICAgIHsgVFJBQ0Uoc2hlbGwsIi0tICEgdUNvbW1hbmRcbiIpOwotCSAgICAgICAgWmVyb01lbW9yeSgmY21pLCBzaXplb2YoY21pKSk7Ci0JICAgICAgICBjbWkuY2JTaXplID0gc2l6ZW9mKGNtaSk7Ci0JICAgICAgICBjbWkuaHduZCA9IHRoaXMtPmhXbmRQYXJlbnQ7Ci0JICAgICAgICBjbWkubHBWZXJiID0gKExQQ1NUUilNQUtFSU5UUkVTT1VSQ0UzMkEodUNvbW1hbmQgLSBNRU5VX09GRlNFVCk7CisJICAgICAgeyBUUkFDRShzaGVsbCwiLS0gdUNvbW1hbmQ9JXVcbiIsIHVDb21tYW5kKTsKKwkgICAgICAgIGlmICgoKHVDb21tYW5kLU1FTlVfT0ZGU0VUKSA9PSBJRE1fRVhQTE9SRSkgfHwgKCh1Q29tbWFuZC1NRU5VX09GRlNFVCkgID09IElETV9PUEVOKSkKKwkJeyBpZiAoSXNJbkNvbW1EbGcodGhpcykpCQkJLyogYXJlIHdlIHBhcnQgb2YgYSBjb21tY3RybD8gKi8KKwkJICB7IFRSQUNFKHNoZWxsLCItLSBmbk9uRGVmYXVsdENvbW1hbmRcbiIpOworCQkgICAgT25EZWZhdWx0Q29tbWFuZCh0aGlzKTsKKwkJICB9CisJCSAgZWxzZQkJCQkJLyogd2UgYXJlIGFjdGluZyB3aXRoIGEgZnVsbCBmZWF0dXJlZCBJU2hlbGxCcm93c2VyICovCisJCSAgeyBUUkFDRShzaGVsbCwiLS0gZm5Ccm93c2VPYmplY3QgcGlkbCA9JXBcbiIsIGFTZWxlY3RlZEl0ZW1zWzBdKTsKKwkJICAgIHdGbGFncyA9IFNCU1BfREVGQlJPV1NFUiB8IFNCU1BfREVGTU9ERSB8IFNCU1BfUkVMQVRJVkU7CisJCSAgICB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuQnJvd3NlT2JqZWN0KAl0aGlzLT5wU2hlbGxCcm93c2VyLCAKKwkJCQkJCQkJYVNlbGVjdGVkSXRlbXNbMF0sIAorCQkJCQkJCQl3RmxhZ3MpOworCQkgIH0KKwkJfQorCQllbHNlCisJCXsgWmVyb01lbW9yeSgmY21pLCBzaXplb2YoY21pKSk7CisJICAgICAgICAgIGNtaS5jYlNpemUgPSBzaXplb2YoY21pKTsKKwkgICAgICAgICAgY21pLmh3bmQgPSB0aGlzLT5oV25kUGFyZW50OworCSAgICAgICAgICBjbWkubHBWZXJiID0gKExQQ1NUUilNQUtFSU5UUkVTT1VSQ0UzMkEodUNvbW1hbmQgLSBNRU5VX09GRlNFVCk7CiAJCQlwQ29udGV4dE1lbnUtPmxwdnRibC0+Zm5JbnZva2VDb21tYW5kKHBDb250ZXh0TWVudSwgJmNtaSk7CisJCX0KIAkgICAgICB9CiAJICAgICAgRGVzdHJveU1lbnUzMihoTWVudSk7CiAJICAgIH0KLQkgIHBDb250ZXh0TWVudS0+bHB2dGJsLT5mblJlbGVhc2UocENvbnRleHRNZW51KTsKKwkgICAgcENvbnRleHRNZW51LT5scHZ0YmwtPmZuUmVsZWFzZShwQ29udGV4dE1lbnUpOwogCSAgfQogCSAgU0hGcmVlKGFTZWxlY3RlZEl0ZW1zKTsKIAl9CkBAIC03NjEsNyArODMzLDcgQEAKIAkgICAgYnJlYWs7CiAKIAkgIGRlZmF1bHQ6Ci0JICAgIEZJWE1FKHNoZWxsLCItLSB1bmtub3duIGNvbW1hbmRcbiIpOworCSAgICBGSVhNRShzaGVsbCwiLS0gQ09NTUFORCB1bmhhbmRsZWRcbiIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc4Miw0NCArODU0LDQ1IEBACiAJVFJBQ0Uoc2hlbGwsIiVwIEN0bElEPSV1IGxwbm1oLT5jb2RlPSV4XG4iLHRoaXMsQ3RsSUQsbHBubWgtPmNvZGUpOwogICAKIAlzd2l0Y2gobHBubWgtPmNvZGUpCi0JeyAgIGNhc2UgTk1fU0VURk9DVVM6Ci0JICAgIFRSQUNFKHNoZWxsLCJOTV9TRVRGT0NVUyAlcFxuIix0aGlzKTsKKwl7IGNhc2UgTk1fU0VURk9DVVM6CisJICAgIFRSQUNFKHNoZWxsLCItLSBOTV9TRVRGT0NVUyAlcFxuIix0aGlzKTsKIAkgICAgU2hlbGxWaWV3X09uU2V0Rm9jdXModGhpcyk7CiAJICAgIGJyZWFrOwogCiAJICBjYXNlIE5NX0tJTExGT0NVUzoKLQkgICAgVFJBQ0Uoc2hlbGwsIk5NX0tJTExGT0NVUyAlcFxuIix0aGlzKTsKKwkgICAgVFJBQ0Uoc2hlbGwsIi0tIE5NX0tJTExGT0NVUyAlcFxuIix0aGlzKTsKIAkgICAgU2hlbGxWaWV3X09uRGVhY3RpdmF0ZSh0aGlzKTsKIAkgICAgYnJlYWs7CiAKIAkgIGNhc2UgSEROX0VORFRSQUNLMzJBOgotCSAgICBUUkFDRShzaGVsbCwiSEROX0VORFRSQUNLMzJBICVwXG4iLHRoaXMpOworCSAgICBUUkFDRShzaGVsbCwiLS0gSEROX0VORFRSQUNLMzJBICVwXG4iLHRoaXMpOwogCSAgICAvKm5Db2x1bW4xID0gTGlzdFZpZXdfR2V0Q29sdW1uV2lkdGgodGhpcy0+aFduZExpc3QsIDApOwogCSAgICBuQ29sdW1uMiA9IExpc3RWaWV3X0dldENvbHVtbldpZHRoKHRoaXMtPmhXbmRMaXN0LCAxKTsqLwotCSAgICByZXR1cm4gMDsKKwkgICAgYnJlYWs7CiAgICAKIAkgIGNhc2UgTFZOX0RFTEVURUlURU06Ci0JICAgIFRSQUNFKHNoZWxsLCJMVk5fREVMRVRFSVRFTSAlcFxuIix0aGlzKTsKKwkgICAgVFJBQ0Uoc2hlbGwsIi0tIExWTl9ERUxFVEVJVEVNICVwXG4iLHRoaXMpOwogCSAgICBTSEZyZWUoKExQSVRFTUlETElTVClscG5tbHYtPmxQYXJhbSk7ICAgICAvKmRlbGV0ZSB0aGUgcGlkbCBiZWNhdXNlIHdlIG1hZGUgYSBjb3B5IG9mIGl0Ki8KIAkgICAgYnJlYWs7CiAgICAKLSNpZmRlZiBMVk5fSVRFTUFDVElWQVRFCi0JICBjYXNlIExWTl9JVEVNQUNUSVZBVEU6Ci0jZWxzZQogCSAgY2FzZSBOTV9EQkxDTEs6CiAJICBjYXNlIE5NX1JFVFVSTjoKLSNlbmRpZgotCSAgICBUUkFDRShzaGVsbCwiTFZOX0lURU1BQ1RJVkFURSB8IE5NX1JFVFVSTiAlcFxuIix0aGlzKTsKKwkgICAgVFJBQ0Uoc2hlbGwsIi0tIE5NX1JFVFVSTnxOTV9EQkxDTEsgaWdub3JlZCwgd2FpdGluZyBmb3IgTFZOX0lURU1BQ1RJVkFURVxuIik7CisJICAgIGJyZWFrOworCisJICBjYXNlIExWTl9JVEVNQUNUSVZBVEU6CisJICAgIFRSQUNFKHNoZWxsLCItLSBMVk5fSVRFTUFDVElWQVRFICVwXG4iLHRoaXMpOwogCSAgICBTaGVsbFZpZXdfRG9Db250ZXh0TWVudSh0aGlzLCAwLCAwLCBUUlVFKTsKLQkgICAgcmV0dXJuIDA7CisJICAgIGJyZWFrOwogICAgCiAJICBjYXNlIE5NX1JDTElDSzoKLQkgICAgVFJBQ0Uoc2hlbGwsIk5NX1JDTElDSyAlcFxuIix0aGlzKTsKKwkgICAgVFJBQ0Uoc2hlbGwsIi0tIE5NX1JDTElDSyAlcFxuIix0aGlzKTsKIAkgICAgZHdDdXJzb3IgPSBHZXRNZXNzYWdlUG9zKCk7CiAJICAgIFNoZWxsVmlld19Eb0NvbnRleHRNZW51KHRoaXMsIExPV09SRChkd0N1cnNvciksIEhJV09SRChkd0N1cnNvciksIEZBTFNFKTsKKwkgICAgYnJlYWs7CiAKIAkgIGNhc2UgTFZOX0dFVERJU1BJTkZPMzJBOgotCSAgICBUUkFDRShzaGVsbCwiTFZOX0dFVERJU1BJTkZPMzJBICVwXG4iLHRoaXMpOworCSAgICBUUkFDRShzaGVsbCwiLS0gTFZOX0dFVERJU1BJTkZPMzJBICVwXG4iLHRoaXMpOwogCSAgICBwaWRsID0gKExQSVRFTUlETElTVClscGRpLT5pdGVtLmxQYXJhbTsKIAogCkBAIC04NTgsMjcgKzkzMSw0MCBAQAogCSAgICAgIH0KIAkgICAgfQogCSAgICBUUkFDRShzaGVsbCwiLS0gdGV4dD0lcyBpbWFnZT0leFxuIixscGRpLT5pdGVtLnBzelRleHQsIGxwZGktPml0ZW0uaUltYWdlKTsKLQkgICAgcmV0dXJuIDA7CisJICAgIGJyZWFrOwogCiAJICBjYXNlIE5NX0NMSUNLOgotCSAgICBUUkFDRShzaGVsbCwiTk1fQ0xJQ0sgJXBcbiIsdGhpcyk7CisJICAgIFdBUk4oc2hlbGwsIi0tIE5NX0NMSUNLICVwXG4iLHRoaXMpOwogCSAgICBicmVhazsKIAogCSAgY2FzZSBMVk5fSVRFTUNIQU5HSU5HOgotCSAgICBUUkFDRShzaGVsbCwiTFZOX0lURU1DSEFOR0lORyAlcFxuIix0aGlzKTsKKwkgICAgV0FSTihzaGVsbCwiLS0gTFZOX0lURU1DSEFOR0lORyAlcFxuIix0aGlzKTsKIAkgICAgYnJlYWs7CiAKIAkgIGNhc2UgTFZOX0lURU1DSEFOR0VEOgotCSAgICBUUkFDRShzaGVsbCwiTFZOX0lURU1DSEFOR0VEICVwXG4iLHRoaXMpOworCSAgICBXQVJOKHNoZWxsLCItLSBMVk5fSVRFTUNIQU5HRUQgJXBcbiIsdGhpcyk7CisJICAgIE9uU3RhdGVDaGFuZ2UodGhpcywgQ0RCT1NDX1NFTENIQU5HRSk7ICAKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgTFZOX0RFTEVURUFMTElURU1TOgorCSAgICBXQVJOKHNoZWxsLCItLSBMVk5fREVMRVRFQUxMSVRFTVMgJXBcbiIsdGhpcyk7CisJICAgIGJyZWFrOworCisJICBjYXNlIExWTl9JTlNFUlRJVEVNOgorCSAgICBXQVJOKHNoZWxsLCItLSBMVk5fSU5TRVJUSVRFTSAlcFxuIix0aGlzKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgTFZOX0JFR0lORFJBRzoKKwkgICAgV0FSTihzaGVsbCwiLS0gTFZOX0JFR0lORFJBRyAlcFxuIix0aGlzKTsKIAkgICAgYnJlYWs7CiAKIAkgIGNhc2UgTk1fQ1VTVE9NRFJBVzoKLQkgICAgVFJBQ0Uoc2hlbGwsIk5NX0NVU1RPTURSQVcgJXBcbiIsdGhpcyk7CisJICAgIFdBUk4oc2hlbGwsIk5NX0NVU1RPTURSQVcgJXBcbiIsdGhpcyk7CiAJICAgIGJyZWFrOwogCiAJICBkZWZhdWx0OgotCSAgICBXQVJOIChzaGVsbCwiLS0gV01fTk9USUZZIHVuaGFuZGxlZFxuIik7Ci0JICAgIHJldHVybiAwOworCSAgICBGSVhNRSAoc2hlbGwsIi0tIFdNX05PVElGWSB1bmhhbmRsZWRcbiIpOworCSAgICBicmVhazs7CiAJfQogCXJldHVybiAwOwogfQpAQCAtODg2LDIzICs5NzIsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU2hlbGxWaWV3X1duZFByb2MKICovCi0vL3dpbmRvd3N4LmgKLSNkZWZpbmUgR0VUX1dNX0NPTU1BTkRfSUQod3AsIGxwKSAgICAgICAgICAgICAgIExPV09SRCh3cCkKLSNkZWZpbmUgR0VUX1dNX0NPTU1BTkRfSFdORCh3cCwgbHApICAgICAgICAgICAgIChIV05EMzIpKGxwKQotI2RlZmluZSBHRVRfV01fQ09NTUFORF9DTUQod3AsIGxwKSAgICAgICAgICAgICAgSElXT1JEKHdwKQotLy8gd2ludXNlci5oCi0jZGVmaW5lIFdNX1NFVFRJTkdDSEFOR0UgICAgICAgICAgICAgICAgV01fV0lOSU5JQ0hBTkdFCiAKIExSRVNVTFQgQ0FMTEJBQ0sgU2hlbGxWaWV3X1duZFByb2MoSFdORDMyIGhXbmQsIFVJTlQzMiB1TWVzc2FnZSwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogeyBMUFNIRUxMVklFVyBwVGhpcyA9IChMUFNIRUxMVklFVylHZXRXaW5kb3dMb25nMzJBKGhXbmQsIEdXTF9VU0VSREFUQSk7CiAgIExQQ1JFQVRFU1RSVUNUMzJBIGxwY3M7CiAgIERXT1JEIGR3Q3Vyc29yOwogICAKLSAgRklYTUUoc2hlbGwsIihod25kPSV4IG1zZz0leCB3cGFybT0leCBscGFybT0lbHgpXG4iLGhXbmQsIHVNZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisgIFRSQUNFKHNoZWxsLCIoaHduZD0leCBtc2c9JXggd3Bhcm09JXggbHBhcm09JWx4KVxuIixoV25kLCB1TWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICAgIAogICBzd2l0Y2ggKHVNZXNzYWdlKQogICB7IGNhc2UgV01fTkNDUkVBVEU6Ci0gICAgICB7IFRSQUNFKHNoZWxsLCJXTV9OQ0NSRUFURVxuIik7CisgICAgICB7IFRSQUNFKHNoZWxsLCItLSBXTV9OQ0NSRUFURVxuIik7CiAgICAgICAgIGxwY3MgPSAoTFBDUkVBVEVTVFJVQ1QzMkEpbFBhcmFtOwogICAgICAgICBwVGhpcyA9IChMUFNIRUxMVklFVykobHBjcy0+bHBDcmVhdGVQYXJhbXMpOwogICAgICAgICBTZXRXaW5kb3dMb25nMzJBKGhXbmQsIEdXTF9VU0VSREFUQSwgKExPTkcpcFRoaXMpOwpAQCAtOTExLDg3ICs5OTEsNTAgQEAKICAgICAgIGJyZWFrOwogICAgCiAgICBjYXNlIFdNX1NJWkU6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fU0laRVxuIik7CisgICAgICBUUkFDRShzaGVsbCwiLS0gV01fU0laRVxuIik7CiAgICAgICByZXR1cm4gU2hlbGxWaWV3X09uU2l6ZShwVGhpcyxMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOwogICAgCiAgICBjYXNlIFdNX1NFVEZPQ1VTOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX1NFVEZPQ1VTXG4iKTsgICAKKyAgICAgIFRSQUNFKHNoZWxsLCItLSBXTV9TRVRGT0NVU1xuIik7ICAgCiAgICAgICByZXR1cm4gU2hlbGxWaWV3X09uU2V0Rm9jdXMocFRoaXMpOwogIAogICAgY2FzZSBXTV9LSUxMRk9DVVM6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fS0lMTEZPQ1VTXG4iKTsKKyAgICAgIFRSQUNFKHNoZWxsLCItLSBXTV9LSUxMRk9DVVNcbiIpOwogICAJICByZXR1cm4gU2hlbGxWaWV3X09uS2lsbEZvY3VzKHBUaGlzKTsKIAogICAgY2FzZSBXTV9DUkVBVEU6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fQ1JFQVRFXG4iKTsKKyAgICAgIFRSQUNFKHNoZWxsLCItLSBXTV9DUkVBVEVcbiIpOwogICAgICAgcmV0dXJuIFNoZWxsVmlld19PbkNyZWF0ZShwVGhpcyk7CiAKICAgIGNhc2UgV01fU0hPV1dJTkRPVzoKLSAgICAgIFRSQUNFKHNoZWxsLCJXTV9TSE9XV0lORE9XXG4iKTsKKyAgICAgIFRSQUNFKHNoZWxsLCItLSBXTV9TSE9XV0lORE9XXG4iKTsKICAgICAgIFVwZGF0ZVdpbmRvdzMyKHBUaGlzLT5oV25kTGlzdCk7CiAgICAgICBicmVhazsKIAogICAgY2FzZSBXTV9BQ1RJVkFURToKLSAgICAgIFRSQUNFKHNoZWxsLCJXTV9BQ1RJVkFURVxuIik7CisgICAgICBUUkFDRShzaGVsbCwiLS0gV01fQUNUSVZBVEVcbiIpOwogICAgICAgcmV0dXJuIFNoZWxsVmlld19PbkFjdGl2YXRlKHBUaGlzLCBTVlVJQV9BQ1RJVkFURV9GT0NVUyk7CiAgICAKICAgIGNhc2UgV01fQ09NTUFORDoKLSAgICAgIFRSQUNFKHNoZWxsLCJXTV9DT01NQU5EXG4iKTsKKyAgICAgIFRSQUNFKHNoZWxsLCItLSBXTV9DT01NQU5EXG4iKTsKICAgICAgIHJldHVybiBTaGVsbFZpZXdfT25Db21tYW5kKHBUaGlzLCBHRVRfV01fQ09NTUFORF9JRCh3UGFyYW0sIGxQYXJhbSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9XTV9DT01NQU5EX0NNRCh3UGFyYW0sIGxQYXJhbSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9XTV9DT01NQU5EX0hXTkQod1BhcmFtLCBsUGFyYW0pKTsKICAgIAogICAgY2FzZSBXTV9JTklUTUVOVVBPUFVQOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX0lOSVRNRU5VUE9QVVBcbiIpOworICAgICAgVFJBQ0Uoc2hlbGwsIi0tIFdNX0lOSVRNRU5VUE9QVVBcbiIpOwogICAgICAgcmV0dXJuIFNoZWxsVmlld19VcGRhdGVNZW51KHBUaGlzLCAoSE1FTlUzMil3UGFyYW0pOwogICAgCiAgICBjYXNlIFdNX05PVElGWToKLSAgICAgIFRSQUNFKHNoZWxsLCJXTV9OT1RJRllcbiIpOworICAgICAgVFJBQ0Uoc2hlbGwsIi0tIFdNX05PVElGWVxuIik7CiAgICAgICByZXR1cm4gU2hlbGxWaWV3X09uTm90aWZ5KHBUaGlzLChVSU5UMzIpd1BhcmFtLCAoTFBOTUhEUilsUGFyYW0pOwogCiAgICBjYXNlIFdNX1NFVFRJTkdDSEFOR0U6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fU0VUVElOR0NIQU5HRVxuIik7CisgICAgICBUUkFDRShzaGVsbCwiLS0gV01fU0VUVElOR0NIQU5HRVxuIik7CiAgICAgICByZXR1cm4gU2hlbGxWaWV3X09uU2V0dGluZ0NoYW5nZShwVGhpcywoTFBDU1RSKWxQYXJhbSk7CiAKLS8qIC0tLS0tLS0tLS0tLS0qLwotICAgY2FzZSBXTV9NT1ZFOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX01PVkVcbiIpOyAgIAotICAgICAgYnJlYWs7Ci0gICAKLSAgIGNhc2UgV01fQUNUSVZBVEVBUFA6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fQUNUSVZBVEVBUFBcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgV01fTk9USUZZRk9STUFUOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX05PVElGWUZPUk1BVFxuIik7Ci0gICAgICBicmVhazsKLQotICAgY2FzZSBXTV9OQ1BBSU5UOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX05DUEFJTlRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgV01fRVJBU0VCS0dORDoKLSAgICAgIFRSQUNFKHNoZWxsLCJXTV9FUkFTRUJLR05EXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICBjYXNlIFdNX1BBSU5UOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX1BBSU5UXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICBjYXNlIFdNX05DQ0FMQ1NJWkU6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fTkNDQUxDU0laRVxuIik7Ci0gICAgICBicmVhazsKLQotICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0lORzoKLSAgICAgIFRSQUNFKHNoZWxsLCJXTV9XSU5ET1dQT1NDSEFOR0lOR1xuIik7Ci0gICAgICBicmVhazsKLQotICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0VEOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX1dJTkRPV1BPU0NIQU5HRURcbiIpOwotICAgICAgYnJlYWs7Ci0KICAgIGNhc2UgV01fUEFSRU5UTk9USUZZOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX1BBUkVOVE5PVElGWVxuIik7CisgICAgICBUUkFDRShzaGVsbCwiLS0gV01fUEFSRU5UTk9USUZZXG4iKTsKICAgICAgIGlmICggTE9XT1JEKHdQYXJhbSkgPT0gV01fUkJVVFRPTkRPV04gKSAvKiBmaXhtZTogc2hvdWxkIG5vdCBiZSBoYW5kbGVkIGhlcmUqLwogICAgICAgeyBkd0N1cnNvciA9IEdldE1lc3NhZ2VQb3MoKTsKIAlTaGVsbFZpZXdfRG9Db250ZXh0TWVudShwVGhpcywgTE9XT1JEKGR3Q3Vyc29yKSwgSElXT1JEKGR3Q3Vyc29yKSwgRkFMU0UpOwpAQCAtOTk5LDE5ICsxMDQyLDkyIEBACiAgICAgICB9CiAgICAgICBicmVhazsKIAorLyogLS0tLS0tLS0tLS0tLSovCisgICBjYXNlIFdNX01PVkU6CisgICAgICBXQVJOKHNoZWxsLCItLSBXTV9NT1ZFXG4iKTsgICAKKyAgICAgIGJyZWFrOworICAgCisgICBjYXNlIFdNX0FDVElWQVRFQVBQOgorICAgICAgV0FSTihzaGVsbCwiLS0gV01fQUNUSVZBVEVBUFBcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fTk9USUZZRk9STUFUOgorICAgICAgV0FSTihzaGVsbCwiLS0gV01fTk9USUZZRk9STUFUXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdNX05DUEFJTlQ6CisgICAgICBXQVJOKHNoZWxsLCItLSBXTV9OQ1BBSU5UXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdNX0VSQVNFQktHTkQ6CisgICAgICBXQVJOKHNoZWxsLCItLSBXTV9FUkFTRUJLR05EXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdNX1BBSU5UOgorICAgICAgV0FSTihzaGVsbCwiLS0gV01fUEFJTlRcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fTkNDQUxDU0laRToKKyAgICAgIFdBUk4oc2hlbGwsIi0tIFdNX05DQ0FMQ1NJWkVcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fV0lORE9XUE9TQ0hBTkdJTkc6CisgICAgICBXQVJOKHNoZWxsLCItLSBXTV9XSU5ET1dQT1NDSEFOR0lOR1xuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0VEOgorICAgICAgV0FSTihzaGVsbCwiLS0gV01fV0lORE9XUE9TQ0hBTkdFRFxuIik7CisgICAgICBicmVhazsKKwogICAgY2FzZSBXTV9NT1VTRUFDVElWQVRFOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX01PVVNFQUNUSVZBVEVcbiIpOworICAgICAgV0FSTihzaGVsbCwiLS0gV01fTU9VU0VBQ1RJVkFURVxuIik7CiAgICAgICBicmVhazsKIAogICAgY2FzZSBXTV9TRVRDVVJTT1I6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fU0VUQ1VSU09SXG4iKTsKKyAgICAgIFdBUk4oc2hlbGwsIi0tIFdNX1NFVENVUlNPUlxuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgV0FSTihzaGVsbCwiLS0gV01fREVTVFJPWVxuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9OQ0RFU1RST1k6CisgICAgICBXQVJOKHNoZWxsLCItLSBXTV9OQ0RFU1RST1lcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fQ09OVEVYVE1FTlU6CisgICAgICBXQVJOKHNoZWxsLCItLSBXTV9DT05URVhUTUVOVVxuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9NRU5VU0VMRUNUOgorICAgICAgV0FSTihzaGVsbCwiLS0gV01fTUVOVVNFTEVDVFxuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9DQVBUVVJFQ0hBTkdFRDoKKyAgICAgIFdBUk4oc2hlbGwsIi0tIFdNX0NBUFRVUkVDSEFOR0VEXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdNX0NISUxEQUNUSVZBVEU6CisgICAgICBXQVJOKHNoZWxsLCItLSBXTV9DSElMREFDVElWQVRFXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdNX0VOVEVSSURMRToKKyAgICAgIFdBUk4oc2hlbGwsIi0tIFdNX0VOVEVSSURMRVxuIik7CisgICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgIEZJWE1FKHNoZWxsLCItLSBNRVNTQUdFIHVuaGFuZGxlZFxuIik7CiAgICAgICBicmVhazsKICAgfQogICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSAoaFduZCwgdU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKIH0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogIFRoZSBJTlRFUkZBQ0Ugb2YgdGhlIElTaGVsbFZpZXcgb2JqZWN0CisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElTaGVsbFZpZXc6OlF1ZXJ5SW50ZXJmYWNlCiAqLwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTFZJRVcgdGhpcyxSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCkBAIC0xMDQ5LDcgKzExNjUsNyBAQAogc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxWaWV3X1JlbGVhc2UoTFBTSEVMTFZJRVcgdGhpcykKIHsgVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLHRoaXMpOwogICBpZiAoIS0tKHRoaXMtPnJlZikpIAotICB7IFRSQUNFKHNoZWxsLCIgZGVzdHJveWluZyBJRW51bUlETGlzdCglcClcbiIsdGhpcyk7CisgIHsgVFJBQ0Uoc2hlbGwsIiBkZXN0cm95aW5nIElTaGVsbFZpZXcoJXApXG4iLHRoaXMpOwogCiAgICAgaWYodGhpcy0+cFNGUGFyZW50KQogICAgICAgIHRoaXMtPnBTRlBhcmVudC0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cFNGUGFyZW50KTsKQEAgLTEwNjMsMTAgKzExNzksMTAgQEAKICogIFNoZWxsVmlld19HZXRXaW5kb3cKICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRXaW5kb3coTFBTSEVMTFZJRVcgdGhpcyxIV05EMzIgKiBwaFduZCkKLXsgVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKLSAqcGhXbmQgPSB0aGlzLT5oV25kOworewlUUkFDRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworCSpwaFduZCA9IHRoaXMtPmhXbmQ7CiAKLSByZXR1cm4gU19PSzsKKwlyZXR1cm4gU19PSzsKIH0KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0NvbnRleHRTZW5zaXRpdmVIZWxwKExQU0hFTExWSUVXIHRoaXMsQk9PTDMyIGZFbnRlck1vZGUpCiB7IEZJWE1FKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7CkBAIC0xMDk1LDk0ICsxMjExLDExNCBAQAogCUxSRVNVTFQJbFJlc3VsdDsKIAlpbnQJCW5QYXJ0QXJyYXlbMV0gPSB7LTF9OwogCi0JRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKLQkvL2Rvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBzdGF0ZSBpc24ndCByZWFsbHkgY2hhbmdpbmcKKwlGSVhNRShzaGVsbCwiKCVwKS0+KHN0YXRlPSV4KSBzdHViXG4iLHRoaXMsIHVTdGF0ZSk7CisJLypkb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgc3RhdGUgaXNuJ3QgcmVhbGx5IGNoYW5naW5nKi8KIAlpZih0aGlzLT51U3RhdGUgPT0gdVN0YXRlKQogCXsgcmV0dXJuIFNfT0s7Ci0gICAgfQorCX0KIAotCS8vT25BY3RpdmF0ZSBoYW5kbGVzIHRoZSBtZW51IG1lcmdpbmcgYW5kIGludGVybmFsIHN0YXRlCisJLypPbkFjdGl2YXRlIGhhbmRsZXMgdGhlIG1lbnUgbWVyZ2luZyBhbmQgaW50ZXJuYWwgc3RhdGUqLwogCVNoZWxsVmlld19PbkFjdGl2YXRlKHRoaXMsIHVTdGF0ZSk7CiAKLQkvL3JlbW92ZSB0aGUgZG9ja2luZyB3aW5kb3cKKwkvKnJlbW92ZSB0aGUgZG9ja2luZyB3aW5kb3cqLwogCWlmKGdfYlNob3dJRFcpCiAJeyBTaGVsbFZpZXdfQWRkUmVtb3ZlRG9ja2luZ1dpbmRvdyh0aGlzLCBGQUxTRSk7Ci0gICAgfQorCX0KIAotCS8vb25seSBkbyB0aGlzIGlmIHdlIGFyZSBhY3RpdmUKKwkvKm9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgYWN0aXZlKi8KIAlpZih1U3RhdGUgIT0gU1ZVSUFfREVBQ1RJVkFURSkKIAl7IC8vdXBkYXRlIHRoZSBzdGF0dXMgYmFyCiAJICAgc3RyY3B5KHN6TmFtZSwgImR1bW15MzIiKTsKICAgIAotCSAgdGhpcy0+cFNGUGFyZW50LT5scHZ0YmwtPmZuR2V0Rm9sZGVyUGF0aCh0aGlzLT5wU0ZQYXJlbnQsIHN6TmFtZSArIHN0cmxlbihzek5hbWUpLCBzaXplb2Yoc3pOYW1lKSAtIHN0cmxlbihzek5hbWUpKTsKKwkgIHRoaXMtPnBTRlBhcmVudC0+bHB2dGJsLT5mbkdldEZvbGRlclBhdGgoIHRoaXMtPnBTRlBhcmVudCwKKwkgIAkJCQkJICAgIHN6TmFtZSArIHN0cmxlbihzek5hbWUpLAorCQkJCQkJICAgIHNpemVvZihzek5hbWUpIC0gc3RybGVuKHN6TmFtZSkpOwogCiAJICAvKiBzZXQgdGhlIG51bWJlciBvZiBwYXJ0cyAqLwotCSAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mblNlbmRDb250cm9sTXNnKHRoaXMtPnBTaGVsbEJyb3dzZXIsRkNXX1NUQVRVUywKLSAgICAgIAkJCQkgU0JfU0VUUEFSVFMsIDEsIChMUEFSQU0pblBhcnRBcnJheSwgJmxSZXN1bHQpOworCSAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mblNlbmRDb250cm9sTXNnKHRoaXMtPnBTaGVsbEJyb3dzZXIsCisJICAJCQkJCQlGQ1dfU1RBVFVTLAorCQkJCQkJCVNCX1NFVFBBUlRTLAorCQkJCQkJCTEsCisJCQkJCQkJKExQQVJBTSluUGFydEFycmF5LAorCQkJCQkJCSZsUmVzdWx0KTsKIAogCSAgLyogc2V0IHRoZSB0ZXh0IGZvciB0aGUgcGFydHMgKi8KLQkgIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5TZW5kQ29udHJvbE1zZyh0aGlzLT5wU2hlbGxCcm93c2VyLEZDV19TVEFUVVMsCi0gICAgICAJCQkJIFNCX1NFVFRFWFQzMkEsIDAsIChMUEFSQU0pc3pOYW1lLCAmbFJlc3VsdCk7CisJICB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuU2VuZENvbnRyb2xNc2codGhpcy0+cFNoZWxsQnJvd3NlciwKKwkJCQkJCQlGQ1dfU1RBVFVTLAorCQkJCQkJCVNCX1NFVFRFWFQzMkEsCisJCQkJCQkJMCwKKwkJCQkJCQkoTFBBUkFNKXN6TmFtZSwKKwkJCQkJCQkmbFJlc3VsdCk7CiAKIAkgIC8vYWRkIHRoZSBkb2NraW5nIHdpbmRvdyBpZiBuZWNlc3NhcnkKIAkgIGlmKGdfYlNob3dJRFcpCiAJICB7IFNoZWxsVmlld19BZGRSZW1vdmVEb2NraW5nV2luZG93KHRoaXMsIFRSVUUpOwotICAgICAgfQorCSAgfQogCX0KIAlyZXR1cm4gU19PSzsKIH0KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1JlZnJlc2goTFBTSEVMTFZJRVcgdGhpcykKLXsJVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKK3sJVFJBQ0Uoc2hlbGwsIiglcClcbiIsdGhpcyk7CisKIAlMaXN0Vmlld19EZWxldGVBbGxJdGVtcyh0aGlzLT5oV25kTGlzdCk7CiAJU2hlbGxWaWV3X0ZpbGxMaXN0KHRoaXMpOworCiAJcmV0dXJuIFNfT0s7CiB9CiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19DcmVhdGVWaWV3V2luZG93KExQU0hFTExWSUVXIHRoaXMsIElTaGVsbFZpZXcgKmxwUHJldlZpZXcsCiAgICAgICAgICAgICAgICAgICAgICBMUENGT0xERVJTRVRUSU5HUyBscGZzLCBJU2hlbGxCcm93c2VyICogcHNiLFJFQ1QzMiAqIHByY1ZpZXcsIEhXTkQzMiAgKnBoV25kKQoteyAgV05EQ0xBU1MzMkEgd2M7Ci0gICAqcGhXbmQgPSAwOworewlXTkRDTEFTUzMyQSB3YzsKKwkqcGhXbmQgPSAwOwogCi0gICBUUkFDRShzaGVsbCwiKCVwKS0+KHNobHZpZXc9JXAgc2V0PSVwIHNobGJycz0lcCByZWM9JXAgaHduZD0lcCkgaW5jb21wbGV0ZVxuIix0aGlzLCBscFByZXZWaWV3LGxwZnMsIHBzYiwgcHJjVmlldywgcGhXbmQpOwotICAgVFJBQ0Uoc2hlbGwsIi0tIGxlZnQ9JWkgdG9wPSVpIHJpZ2h0PSVpIGJvdHRvbT0laVxuIixwcmNWaWV3LT5sZWZ0LHByY1ZpZXctPnRvcCwgcHJjVmlldy0+cmlnaHQsIHByY1ZpZXctPmJvdHRvbSk7CisJVFJBQ0Uoc2hlbGwsIiglcCktPihzaGx2aWV3PSVwIHNldD0lcCBzaGxicnM9JXAgcmVjPSVwIGh3bmQ9JXApIGluY29tcGxldGVcbiIsdGhpcywgbHBQcmV2VmlldyxscGZzLCBwc2IsIHByY1ZpZXcsIHBoV25kKTsKKwlUUkFDRShzaGVsbCwiLS0gdm1vZGU9JXggZmxhZ3M9JXggbGVmdD0laSB0b3A9JWkgcmlnaHQ9JWkgYm90dG9tPSVpXG4iLGxwZnMtPlZpZXdNb2RlLCBscGZzLT5mRmxhZ3MgLHByY1ZpZXctPmxlZnQscHJjVmlldy0+dG9wLCBwcmNWaWV3LT5yaWdodCwgcHJjVmlldy0+Ym90dG9tKTsKKworCS8qc2V0IHVwIHRoZSBtZW1iZXIgdmFyaWFibGVzKi8KKwl0aGlzLT5wU2hlbGxCcm93c2VyID0gcHNiOworCXRoaXMtPkZvbGRlclNldHRpbmdzID0gKmxwZnM7CisKKwkvKmdldCBvdXIgcGFyZW50IHdpbmRvdyovCisJdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mbkFkZFJlZih0aGlzLT5wU2hlbGxCcm93c2VyKTsKKwl0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuR2V0V2luZG93KHRoaXMtPnBTaGVsbEJyb3dzZXIsICYodGhpcy0+aFduZFBhcmVudCkpOworCisJLyogdHJ5IHRvIGdldCB0aGUgSUNvbW1EbGdCcm93c2VySW50ZXJmYWNlICovCisJdGhpcy0+cENvbW1EbGdCcm93c2VyPU5VTEw7CisJaWYgKCBTVUNDRUVERUQgKHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5RdWVyeUludGVyZmFjZSggdGhpcy0+cFNoZWxsQnJvd3NlciwKKwkJCQkJCQkJICAgICAgICAmSUlEX0lDb21tRGxnQnJvd3NlciwKKwkJCQkJCQkJCShMUFZPSUQqKSAmdGhpcy0+cENvbW1EbGdCcm93c2VyKSkpCisJeyBUUkFDRShzaGVsbCwiLS0gQ29tbURsZ0Jyb3dzZXJcbiIpOworCX0KKwkgICAKKwkvKmlmIG91ciB3aW5kb3cgY2xhc3MgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gZG8gc28qLworCWlmKCFHZXRDbGFzc0luZm8zMkEoc2hlbGwzMl9oSW5zdGFuY2UsIFNWX0NMQVNTX05BTUUsICZ3YykpCisJeyBaZXJvTWVtb3J5KCZ3Yywgc2l6ZW9mKHdjKSk7CisJICB3Yy5zdHlsZSAgICAgICAgICA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOworCSAgd2MubHBmblduZFByb2MgICAgPSAoV05EUFJPQzMyKSBTaGVsbFZpZXdfV25kUHJvYzsKKwkgIHdjLmNiQ2xzRXh0cmEgICAgID0gMDsKKwkgIHdjLmNiV25kRXh0cmEgICAgID0gMDsKKwkgIHdjLmhJbnN0YW5jZSAgICAgID0gc2hlbGwzMl9oSW5zdGFuY2U7CisJICB3Yy5oSWNvbiAgICAgICAgICA9IDA7CisJICB3Yy5oQ3Vyc29yICAgICAgICA9IExvYWRDdXJzb3IzMkEgKDAsIElEQ19BUlJPVzMyQSk7CisJICB3Yy5oYnJCYWNrZ3JvdW5kICA9IChIQlJVU0gzMikgKENPTE9SX1dJTkRPVyArIDEpOworCSAgd2MubHBzek1lbnVOYW1lICAgPSBOVUxMOworCSAgd2MubHBzekNsYXNzTmFtZSAgPSBTVl9DTEFTU19OQU1FOwogICAgCi0vL2lmIG91ciB3aW5kb3cgY2xhc3MgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gZG8gc28KLSAgaWYoIUdldENsYXNzSW5mbzMyQShzaGVsbDMyX2hJbnN0YW5jZSwgU1ZfQ0xBU1NfTkFNRSwgJndjKSkKLSAgeyBaZXJvTWVtb3J5KCZ3Yywgc2l6ZW9mKHdjKSk7Ci0gICAgd2Muc3R5bGUgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKLSAgICB3Yy5scGZuV25kUHJvYyAgICA9IChXTkRQUk9DMzIpIFNoZWxsVmlld19XbmRQcm9jOwotICAgIHdjLmNiQ2xzRXh0cmEgICAgID0gMDsKLSAgICB3Yy5jYlduZEV4dHJhICAgICA9IDA7Ci0gICAgd2MuaEluc3RhbmNlICAgICAgPSBzaGVsbDMyX2hJbnN0YW5jZTsKLSAgICB3Yy5oSWNvbiAgICAgICAgICA9IDA7Ci0gICAgd2MuaEN1cnNvciAgICAgICAgPSBMb2FkQ3Vyc29yMzJBICgwLCBJRENfQVJST1czMkEpOwotICAgIHdjLmhickJhY2tncm91bmQgID0gKEhCUlVTSDMyKSAoQ09MT1JfV0lORE9XICsgMSk7Ci0gICAgd2MubHBzek1lbnVOYW1lICAgPSBOVUxMOwotICAgIHdjLmxwc3pDbGFzc05hbWUgID0gU1ZfQ0xBU1NfTkFNRTsKLSAgIAotICAgIGlmKCFSZWdpc3RlckNsYXNzMzJBKCZ3YykpCi0gICAgICByZXR1cm4gRV9GQUlMOwotICAgfQotICAgLy9zZXQgdXAgdGhlIG1lbWJlciB2YXJpYWJsZXMKLSAgIHRoaXMtPnBTaGVsbEJyb3dzZXIgPSBwc2I7Ci0gICB0aGlzLT5Gb2xkZXJTZXR0aW5ncyA9ICpscGZzOworCSAgaWYoIVJlZ2lzdGVyQ2xhc3MzMkEoJndjKSkKKwkgICAgcmV0dXJuIEVfRkFJTDsKKwl9CiAKLSAgIC8vZ2V0IG91ciBwYXJlbnQgd2luZG93Ci0gICB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuR2V0V2luZG93KHRoaXMtPnBTaGVsbEJyb3dzZXIsICYodGhpcy0+aFduZFBhcmVudCkpOwotCi0gICAqcGhXbmQgPSBDcmVhdGVXaW5kb3dFeDMyQSgwLCBTVl9DTEFTU19OQU1FLCBOVUxMLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19DTElQU0lCTElOR1MsCisJKnBoV25kID0gQ3JlYXRlV2luZG93RXgzMkEoMCwgU1ZfQ0xBU1NfTkFNRSwgTlVMTCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQ0xJUFNJQkxJTkdTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJjVmlldy0+bGVmdCwgcHJjVmlldy0+dG9wLCBwcmNWaWV3LT5yaWdodCAtIHByY1ZpZXctPmxlZnQsIHByY1ZpZXctPmJvdHRvbSAtIHByY1ZpZXctPnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmhXbmRQYXJlbnQsIDAsIHNoZWxsMzJfaEluc3RhbmNlLCAoTFBWT0lEKXRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBpZighKnBoV25kKQotICAgICByZXR1cm4gRV9GQUlMOworCWlmKCEqcGhXbmQpCisJICByZXR1cm4gRV9GQUlMOwogCi0gICB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMtPnBTaGVsbEJyb3dzZXIpOwotCi0gICByZXR1cm4gU19PSzsKKwlyZXR1cm4gU19PSzsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfRGVzdHJveVZpZXdXaW5kb3coTFBTSEVMTFZJRVcgdGhpcykKLXsJVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKK3sJVFJBQ0Uoc2hlbGwsIiglcClcbiIsdGhpcyk7CiAKIAkvKk1ha2UgYWJzb2x1dGVseSBzdXJlIGFsbCBvdXIgVUkgaXMgY2xlYW5lZCB1cC4qLwogCUlTaGVsbFZpZXdfVUlBY3RpdmF0ZSh0aGlzLCBTVlVJQV9ERUFDVElWQVRFKTsKQEAgLTExOTQsMTAgKzEzMzAsMTUgQEAKIAlyZXR1cm4gU19PSzsKIH0KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0dldEN1cnJlbnRJbmZvKExQU0hFTExWSUVXIHRoaXMsIExQRk9MREVSU0VUVElOR1MgbHBmcykKLXsgRklYTUUoc2hlbGwsIiglcCktPiglcClzdHViXG4iLHRoaXMsIGxwZnMpOwotCi0gICpscGZzID0gdGhpcy0+Rm9sZGVyU2V0dGluZ3M7Ci0gIHJldHVybiBTX09LOworewlUUkFDRShzaGVsbCwiKCVwKS0+KCVwKSB2bW9kZT0leCBmbGFncz0leFxuIix0aGlzLCBscGZzLCAKKwkJdGhpcy0+Rm9sZGVyU2V0dGluZ3MuVmlld01vZGUsIHRoaXMtPkZvbGRlclNldHRpbmdzLmZGbGFncyk7CisgIAorCWlmIChscGZzKQorCXsgKmxwZnMgPSB0aGlzLT5Gb2xkZXJTZXR0aW5nczsKKwkgIHJldHVybiBOT0VSUk9SOworCX0KKwllbHNlCisJICByZXR1cm4gRV9JTlZBTElEQVJHOwogfQogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfQWRkUHJvcGVydHlTaGVldFBhZ2VzKExQU0hFTExWSUVXIHRoaXMsIERXT1JEIGR3UmVzZXJ2ZWQsTFBGTkFERFBST1BTSEVFVFBBR0UgbHBmbiwgTFBBUkFNIGxwYXJhbSkKIHsgRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKQEAgLTEyMTEsMTEgKzEzNTIsMTEgQEAKIHsgRklYTUUoc2hlbGwsIiglcCktPihwaWRsPSVwLCAweCUwOHgpIHN0dWJcbiIsdGhpcywgcGlkbEl0ZW0sIHVGbGFncyk7CiAgIHJldHVybiBFX05PVElNUEw7CiB9Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRJdGVtT2JqZWN0KExQU0hFTExWSUVXIHRoaXMsIFVJTlQzMiB1SXRlbSwgUkVGSUlEIHJpaWQsTFBWT0lEICpwcHZPdXQpCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRJdGVtT2JqZWN0KExQU0hFTExWSUVXIHRoaXMsIFVJTlQzMiB1SXRlbSwgUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2T3V0KQogeyBjaGFyICAgIHhyaWlkWzUwXTsKICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CiAKLSAgRklYTUUoc2hlbGwsIiglcCktPigweCUwOHgsXG5cdCVzLCAlcClzdHViXG4iLHRoaXMsIHVJdGVtLCB4cmlpZCwgcHB2T3V0KTsKKyAgRklYTUUoc2hlbGwsIiglcCktPih1SXRlbT0weCUwOHgsXG5cdElJRD0lcywgcHB2PSVwKXN0dWJcbiIsdGhpcywgdUl0ZW0sIHhyaWlkLCBwcHZPdXQpOwogCiAgICpwcHZPdXQgPSBOVUxMOwogICByZXR1cm4gRV9OT1RJTVBMOwpkaWZmIC0tZ2l0IGEvZGxscy93aW5hc3BpL01ha2VmaWxlLmluIGIvZGxscy93aW5hc3BpL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODNlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL3dpbmFzcGkvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNSBAQAorREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCitUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKK1RPUE9CSkRJUiA9IC4uLy4uCitTUkNESVIgICAgPSBAc3JjZGlyQAorVlBBVEggICAgID0gQHNyY2RpckAKK01PRFVMRSAgICA9IHdpbmFzcGkKKworQ19TUkNTID0gXAorCXdpbmFzcGkxNi5jCisKK2FsbDogJChNT0RVTEUpLm8KKworQE1BS0VfUlVMRVNACisKKyMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS9kbGxzL3dpbmFzcGkvd2luYXNwaTE2LmMgYi9kbGxzL3dpbmFzcGkvd2luYXNwaTE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2YzNmZAotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvd2luYXNwaS93aW5hc3BpMTYuYwpAQCAtMCwwICsxLDQ5MiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxkdC5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNhbGxiYWNrLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImFzcGkuaCIKKyNpbmNsdWRlICJ3aW5hc3BpLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgIm1pc2NlbXUuaCIKKworCisvKiBGSVhNRSEKKyAqIDEpIFJlc2lkdWFsIGJ5dGUgbGVuZ3RoIHJlcG9ydGluZyBub3QgaGFuZGxlZAorICogMikgTWFrZSB0aGlzIGNvZGUgcmUtZW50cmFudCBmb3IgbXVsdGl0aHJlYWRpbmcKKyAqIDMpIE9ubHkgbGludXggc3VwcG9ydGVkIHNvIGZhcgorICovCisKKyNpZmRlZiBsaW51eAorc3RhdGljIGludAorQVNQSV9PcGVuRGV2aWNlMTYoU1JCX0V4ZWNTQ1NJQ21kMTYgKnByYikKK3sKKyAgICBpbnQJZmQ7CisgICAgY2hhcglpZHN0clsyMF07CisgICAgY2hhcglkZXZpY2Vfc3RyWzUwXTsKKyAgICBBU1BJX0RFVklDRV9JTkZPICpjdXJyOworCisgICAgLyogc2VhcmNoIGxpc3Qgb2YgZGV2aWNlcyB0byBzZWUgaWYgd2UndmUgb3BlbmVkIGl0IGFscmVhZHkuCisgICAgICogVGhlcmUgaXMgbm90IGFuIGV4cGxpY2l0IG9wZW4vY2xvc2UgaW4gQVNQSSBsYW5kLCBzbyBob3BlZnVsbHkKKyAgICAgKiBrZWVwaW5nIGEgZGV2aWNlIG9wZW4gd29uJ3QgYmUgYSBwcm9ibGVtLgorICAgICAqLworCisgICAgZm9yIChjdXJyID0gQVNQSV9vcGVuX2RldmljZXM7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0KSB7CisJaWYgKGN1cnItPmhvc3RJZCA9PSBwcmItPlNSQl9IYUlkICYmCisJICAgIGN1cnItPnRhcmdldCA9PSBwcmItPlNSQl9UYXJnZXQgJiYKKwkgICAgY3Vyci0+bHVuID09IHByYi0+U1JCX0x1bikgeworCSAgICByZXR1cm4gY3Vyci0+ZmQ7CisJfQorICAgIH0KKworICAgIC8qIGRldmljZSB3YXNuJ3QgY2FjaGVkLCBnbyBhaGVhZCBhbmQgb3BlbiBpdCAqLworICAgIHNwcmludGYoaWRzdHIsICJzY3NpIGMlMWR0JTFkZCUxZCIsIHByYi0+U1JCX0hhSWQsIHByYi0+U1JCX1RhcmdldCwgcHJiLT5TUkJfTHVuKTsKKworICAgIGlmICghUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKGlkc3RyLCAiRGV2aWNlIiwgIiIsIGRldmljZV9zdHIsIHNpemVvZihkZXZpY2Vfc3RyKSkpIHsKKwlUUkFDRShhc3BpLCAiVHJ5aW5nIHRvIG9wZW4gdW5saXN0ZWQgc2NzaSBkZXZpY2UgJXNcbiIsIGlkc3RyKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgVFJBQ0UoYXNwaSwgIk9wZW5pbmcgZGV2aWNlICVzPSVzXG4iLCBpZHN0ciwgZGV2aWNlX3N0cik7CisKKyAgICBmZCA9IG9wZW4oZGV2aWNlX3N0ciwgT19SRFdSKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKwlpbnQgc2F2ZV9lcnJvciA9IGVycm5vOworCUVSUihhc3BpLCAiRXJyb3Igb3BlbmluZyBkZXZpY2UgJXMsIGVycm5vPSVkXG4iLCBkZXZpY2Vfc3RyLCBzYXZlX2Vycm9yKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogZGV2aWNlIGlzIG5vdyBvcGVuICovCisgICAgY3VyciA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKEFTUElfREVWSUNFX0lORk8pICk7CisgICAgY3Vyci0+ZmQgPSBmZDsKKyAgICBjdXJyLT5ob3N0SWQgPSBwcmItPlNSQl9IYUlkOworICAgIGN1cnItPnRhcmdldCA9IHByYi0+U1JCX1RhcmdldDsKKyAgICBjdXJyLT5sdW4gPSBwcmItPlNSQl9MdW47CisKKyAgICAvKiBpbnNlcnQgbmV3IHJlY29yZCBhdCBiZWdpbm5pbmcgb2Ygb3BlbiBkZXZpY2UgbGlzdCAqLworICAgIGN1cnItPm5leHQgPSBBU1BJX29wZW5fZGV2aWNlczsKKyAgICBBU1BJX29wZW5fZGV2aWNlcyA9IGN1cnI7CisgICAgcmV0dXJuIGZkOworfQorCisKK3N0YXRpYyB2b2lkCitBU1BJX0RlYnVnUHJpbnRDbWQoU1JCX0V4ZWNTQ1NJQ21kMTYgKnByYiwgVUlOVDE2IG1vZGUpCit7CisgIEJZVEUJY21kOworICBpbnQJaTsKKyAgQllURSAqY2RiOworICBCWVRFICpscEJ1ZiA9IDA7CisgIGRiZ19kZWNsX3N0cihhc3BpLCA1MTIpOworCisgIHN3aXRjaCAobW9kZSkKKyAgeworICAgICAgY2FzZSBBU1BJX0RPUzoKKwkvKiB0cmFuc2xhdGUgcmVhbCBtb2RlIGFkZHJlc3MgKi8KKwlpZiAocHJiLT5TUkJfQnVmUG9pbnRlcikKKwkgICAgbHBCdWYgPSAoQllURSAqKURPU01FTV9NYXBSZWFsVG9MaW5lYXIoKFVJTlQzMilwcmItPlNSQl9CdWZQb2ludGVyKTsKKwlicmVhazsKKyAgICAgIGNhc2UgQVNQSV9XSU4xNjoKKwlscEJ1ZiA9IFBUUl9TRUdfVE9fTElOKHByYi0+U1JCX0J1ZlBvaW50ZXIpOworCWJyZWFrOworICB9CisKKyAgc3dpdGNoIChwcmItPkNEQkJ5dGVbMF0pIHsKKyAgY2FzZSBDTURfSU5RVUlSWToKKyAgICBUUkFDRShhc3BpLCAie1xuIik7CisgICAgVFJBQ0UoYXNwaSwgIlx0RVZQRDogJWRcbiIsIHByYi0+Q0RCQnl0ZVsxXSAmIDEpOworICAgIFRSQUNFKGFzcGksICJcdExVTjogJWRcbiIsIChwcmItPkNEQkJ5dGVbMV0gJiAweGMpID4+IDEpOworICAgIFRSQUNFKGFzcGksICJcdFBBR0UgQ09ERTogJWRcbiIsIHByYi0+Q0RCQnl0ZVsyXSk7CisgICAgVFJBQ0UoYXNwaSwgIlx0QUxMT0NBVElPTiBMRU5HVEg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOworICAgIFRSQUNFKGFzcGksICJcdENPTlRST0w6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNV0pOworICAgIFRSQUNFKGFzcGksICJ9XG4iKTsKKyAgICBicmVhazsKKyAgY2FzZSBDTURfU0NBTl9TQ0FOOgorICAgIFRSQUNFKGFzcGksICJUcmFuc2ZlciBMZW5ndGg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOworICAgIGJyZWFrOworICB9CisKKyAgVFJBQ0UoYXNwaSwgIkhvc3QgQWRhcHRlcjogJWRcbiIsIHByYi0+U1JCX0hhSWQpOworICBUUkFDRShhc3BpLCAiRmxhZ3M6ICVkXG4iLCBwcmItPlNSQl9GbGFncyk7CisgIGlmIChUQVJHRVRfVE9fSE9TVChwcmIpKSB7CisgICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2ZlcjogVGFyZ2V0IHRvIGhvc3QuIExlbmd0aCBjaGVja2VkLlxuIik7CisgIH0KKyAgZWxzZSBpZiAoSE9TVF9UT19UQVJHRVQocHJiKSkgeworICAgIFRSQUNFKGFzcGksICJcdERhdGEgdHJhbnNmZXI6IEhvc3QgdG8gdGFyZ2V0LiBMZW5ndGggY2hlY2tlZC5cbiIpOworICB9CisgIGVsc2UgaWYgKE5PX0RBVEFfVFJBTlNGRVJFRChwcmIpKSB7CisgICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2Zlcjogbm9uZVxuIik7CisgIH0KKyAgZWxzZSB7CisgICAgV0FSTihhc3BpLCAiXHRUcmFuc2ZlciBieSBzY3NpIGNtZC4gTGVuZ3RoIG5vdCBjaGVja2VkXG4iKTsKKyAgfQorCisgIFRSQUNFKGFzcGksICJcdFJlc2lkdWFsIGJ5dGUgbGVuZ3RoIHJlcG9ydGluZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgVFJBQ0UoYXNwaSwgIlx0TGlua2luZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDIgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgVFJBQ0UoYXNwaSwgIlx0UG9zdGluZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDEgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgVFJBQ0UoYXNwaSwgIlRhcmdldDogJWRcbiIsIHByYi0+U1JCX1RhcmdldCk7CisgIFRSQUNFKGFzcGksICJMdW46ICVkXG4iLCBwcmItPlNSQl9MdW4pOworICBUUkFDRShhc3BpLCAiQnVmTGVuOiAlbGRcbiIsIHByYi0+U1JCX0J1Zkxlbik7CisgIFRSQUNFKGFzcGksICJTZW5zZUxlbjogJWRcbiIsIHByYi0+U1JCX1NlbnNlTGVuKTsKKyAgVFJBQ0UoYXNwaSwgIkJ1ZlB0cjogJWx4ICglcClcbiIsIHByYi0+U1JCX0J1ZlBvaW50ZXIsIGxwQnVmKTsKKyAgVFJBQ0UoYXNwaSwgIkxpbmtQb2ludGVyICVseFxuIiwgcHJiLT5TUkJfUnN2ZDEpOworICBUUkFDRShhc3BpLCAiQ0RCIExlbmd0aDogJWRcbiIsIHByYi0+U1JCX0NEQkxlbik7CisgIFRSQUNFKGFzcGksICJQT1NUIFByb2M6ICVseFxuIiwgKERXT1JEKSBwcmItPlNSQl9Qb3N0UHJvYyk7CisgIGNkYiA9ICZwcmItPkNEQkJ5dGVbMF07CisgIGNtZCA9IHByYi0+Q0RCQnl0ZVswXTsKKyAgZm9yIChpID0gMDsgaSA8IHByYi0+U1JCX0NEQkxlbjsgaSsrKSB7CisgICAgaWYgKGkgIT0gMCkgZHNwcmludGYoYXNwaSwgIiwiKTsKKyAgICBkc3ByaW50Zihhc3BpLCAiJTAyeCIsICpjZGIrKyk7CisgIH0KKyAgVFJBQ0UoYXNwaSwgIkNEQiBidWZmZXJbJXNdXG4iLCBkYmdfc3RyKGFzcGkpKTsKK30KKworc3RhdGljIHZvaWQKK0FTUElfUHJpbnRTZW5zZUFyZWExNihTUkJfRXhlY1NDU0lDbWQxNiAqcHJiKQoreworICBpbnQJaTsKKyAgQllURSAqY2RiOworICBkYmdfZGVjbF9zdHIoYXNwaSwgNTEyKTsKKworICBjZGIgPSAmcHJiLT5DREJCeXRlWzBdOworICBmb3IgKGkgPSAwOyBpIDwgcHJiLT5TUkJfU2Vuc2VMZW47IGkrKykgeworICAgIGlmIChpKSBkc3ByaW50Zihhc3BpLCAiLCIpOworICAgIGRzcHJpbnRmKGFzcGksICIlMDJ4IiwgKmNkYisrKTsKKyAgfQorICBUUkFDRShhc3BpLCAiU2Vuc2VBcmVhWyVzXVxuIiwgZGJnX3N0cihhc3BpKSk7Cit9CisKK3N0YXRpYyB2b2lkCitBU1BJX0RlYnVnUHJpbnRSZXN1bHQoU1JCX0V4ZWNTQ1NJQ21kMTYgKnByYiwgVUlOVDE2IG1vZGUpCit7CisgIEJZVEUgKmxwQnVmID0gMDsKKworICBzd2l0Y2ggKG1vZGUpCisgIHsKKyAgICAgIGNhc2UgQVNQSV9ET1M6CisJLyogdHJhbnNsYXRlIHJlYWwgbW9kZSBhZGRyZXNzICovCisJaWYgKHByYi0+U1JCX0J1ZlBvaW50ZXIpCisJICAgIGxwQnVmID0gKEJZVEUgKilET1NNRU1fTWFwUmVhbFRvTGluZWFyKChVSU5UMzIpcHJiLT5TUkJfQnVmUG9pbnRlcik7CisJYnJlYWs7CisgICAgICBjYXNlIEFTUElfV0lOMTY6CisJbHBCdWYgPSBQVFJfU0VHX1RPX0xJTihwcmItPlNSQl9CdWZQb2ludGVyKTsKKwlicmVhazsKKyAgfQorCisgIHN3aXRjaCAocHJiLT5DREJCeXRlWzBdKSB7CisgIGNhc2UgQ01EX0lOUVVJUlk6CisgICAgVFJBQ0UoYXNwaSwgIlZlbmRvcjogJyVzJ1xuIiwgbHBCdWYgKyBJTlFVSVJZX1ZFTkRPUik7CisgICAgYnJlYWs7CisgIGNhc2UgQ01EX1RFU1RfVU5JVF9SRUFEWToKKyAgICBBU1BJX1ByaW50U2Vuc2VBcmVhMTYocHJiKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgV09SRAorQVNQSV9FeGVjU2NzaUNtZChEV09SRCBwdHJQUkIsIFVJTlQxNiBtb2RlKQoreworICBTUkJfRXhlY1NDU0lDbWQxNiAqbHBQUkIgPSAwOworICBzdHJ1Y3Qgc2dfaGVhZGVyICpzZ19oZCwgKnNnX3JlcGx5X2hkcjsKKyAgaW50CXN0YXR1czsKKyAgQllURSAqbHBCdWYgPSAwOworICBpbnQJaW5fbGVuLCBvdXRfbGVuOworICBpbnQJZXJyb3JfY29kZSA9IDA7CisgIGludAlmZDsKKworICBzd2l0Y2ggKG1vZGUpCisgIHsKKyAgICAgIGNhc2UgQVNQSV9ET1M6CisJaWYgKHB0clBSQikKKwkgICAgbHBQUkIgPSAoU1JCX0V4ZWNTQ1NJQ21kMTYgKilET1NNRU1fTWFwUmVhbFRvTGluZWFyKHB0clBSQik7CisJYnJlYWs7CisgICAgICBjYXNlIEFTUElfV0lOMTY6CisJbHBQUkIgPSBQVFJfU0VHX1RPX0xJTihwdHJQUkIpOworCWJyZWFrOworICB9CisKKyAgQVNQSV9EZWJ1Z1ByaW50Q21kKGxwUFJCLCBtb2RlKTsKKworICBmZCA9IEFTUElfT3BlbkRldmljZTE2KGxwUFJCKTsKKyAgaWYgKGZkID09IC0xKSB7CisgICAgICBFUlIoYXNwaSwgIkZhaWxlZDogY291bGQgbm90IG9wZW4gZGV2aWNlLiBEZXZpY2UgcGVybWlzc2lvbnMgIT9cbiIpOworICAgICAgbHBQUkItPlNSQl9TdGF0dXMgPSBTU19FUlI7CisgICAgICByZXR1cm4gU1NfRVJSOworICB9CisKKyAgc2dfaGQgPSBOVUxMOworICBzZ19yZXBseV9oZHIgPSBOVUxMOworCisgIGxwUFJCLT5TUkJfU3RhdHVzID0gU1NfUEVORElORzsKKworICBzd2l0Y2ggKG1vZGUpCisgIHsKKyAgICAgIGNhc2UgQVNQSV9ET1M6CisJLyogdHJhbnNsYXRlIHJlYWwgbW9kZSBhZGRyZXNzICovCisJaWYgKHB0clBSQikKKwkgICAgbHBCdWYgPSAoQllURSAqKURPU01FTV9NYXBSZWFsVG9MaW5lYXIoKFVJTlQzMilscFBSQi0+U1JCX0J1ZlBvaW50ZXIpOworCWJyZWFrOworICAgICAgY2FzZSBBU1BJX1dJTjE2OgorCWxwQnVmID0gUFRSX1NFR19UT19MSU4obHBQUkItPlNSQl9CdWZQb2ludGVyKTsKKwlicmVhazsKKyAgfQorCisgIGlmICghbHBQUkItPlNSQl9DREJMZW4pIHsKKyAgICAgIFdBUk4oYXNwaSwgIkZhaWxlZDogbHBQUkItPlNSQl9DREJMZW4gPSAwLlxuIik7CisgICAgICBscFBSQi0+U1JCX1N0YXR1cyA9IFNTX0VSUjsKKyAgICAgIHJldHVybiBTU19FUlI7CisgIH0KKworICAvKiBidWlsZCB1cCBzZ19oZWFkZXIgKyBzY3NpIGNtZCAqLworICBpZiAoSE9TVF9UT19UQVJHRVQobHBQUkIpKSB7CisgICAgLyogc2VuZCBoZWFkZXIsIGNvbW1hbmQsIGFuZCB0aGVuIGRhdGEgKi8KKyAgICBpbl9sZW4gPSBTQ1NJX09GRiArIGxwUFJCLT5TUkJfQ0RCTGVuICsgbHBQUkItPlNSQl9CdWZMZW47CisgICAgc2dfaGQgPSAoc3RydWN0IHNnX2hlYWRlciAqKSBtYWxsb2MoaW5fbGVuKTsKKyAgICBtZW1zZXQoc2dfaGQsIDAsIFNDU0lfT0ZGKTsKKyAgICBtZW1jcHkoc2dfaGQgKyAxLCAmbHBQUkItPkNEQkJ5dGVbMF0sIGxwUFJCLT5TUkJfQ0RCTGVuKTsKKyAgICBpZiAobHBQUkItPlNSQl9CdWZMZW4pIHsKKyAgICAgIG1lbWNweSgoKEJZVEUgKikgc2dfaGQpICsgU0NTSV9PRkYgKyBscFBSQi0+U1JCX0NEQkxlbiwgbHBCdWYsIGxwUFJCLT5TUkJfQnVmTGVuKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLyogc2VuZCBoZWFkZXIgYW5kIGNvbW1hbmQgLSBubyBkYXRhICovCisgICAgaW5fbGVuID0gU0NTSV9PRkYgKyBscFBSQi0+U1JCX0NEQkxlbjsKKyAgICBzZ19oZCA9IChzdHJ1Y3Qgc2dfaGVhZGVyICopIG1hbGxvYyhpbl9sZW4pOworICAgIG1lbXNldChzZ19oZCwgMCwgU0NTSV9PRkYpOworICAgIG1lbWNweShzZ19oZCArIDEsICZscFBSQi0+Q0RCQnl0ZVswXSwgbHBQUkItPlNSQl9DREJMZW4pOworICB9CisKKyAgaWYgKFRBUkdFVF9UT19IT1NUKGxwUFJCKSkgeworICAgIG91dF9sZW4gPSBTQ1NJX09GRiArIGxwUFJCLT5TUkJfQnVmTGVuOworICAgIHNnX3JlcGx5X2hkciA9IChzdHJ1Y3Qgc2dfaGVhZGVyICopIG1hbGxvYyhvdXRfbGVuKTsKKyAgICBtZW1zZXQoc2dfcmVwbHlfaGRyLCAwLCBTQ1NJX09GRik7CisgICAgc2dfaGQtPnJlcGx5X2xlbiA9IG91dF9sZW47CisgIH0KKyAgZWxzZSB7CisgICAgb3V0X2xlbiA9IFNDU0lfT0ZGOworICAgIHNnX3JlcGx5X2hkciA9IChzdHJ1Y3Qgc2dfaGVhZGVyICopIG1hbGxvYyhvdXRfbGVuKTsKKyAgICBtZW1zZXQoc2dfcmVwbHlfaGRyLCAwLCBTQ1NJX09GRik7CisgICAgc2dfaGQtPnJlcGx5X2xlbiA9IG91dF9sZW47CisgIH0KKworICBzdGF0dXMgPSB3cml0ZShmZCwgc2dfaGQsIGluX2xlbik7CisgIGlmIChzdGF0dXMgPCAwIHx8IHN0YXR1cyAhPSBpbl9sZW4pIHsKKyAgICAgIGludCBteWVycm9yID0gZXJybm87CisKKyAgICBXQVJOKGFzcGksICJOb3QgZW5vdWdoIGJ5dGVzIHdyaXR0ZW4gdG8gc2NzaSBkZXZpY2UgYnl0ZXM9JWQgLi4gJWRcbiIsIGluX2xlbiwgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworCWlmIChteWVycm9yID09IEVOT01FTSkgeworCSAgICBNU0coIkFTUEk6IExpbnV4IGdlbmVyaWMgc2NzaSBkcml2ZXJcbiAgWW91IHByb2JhYmx5IG5lZWQgdG8gcmUtY29tcGlsZSB5b3VyIGtlcm5lbCB3aXRoIGEgbGFyZ2VyIFNHX0JJR19CVUZGIHZhbHVlIChzZy5oKVxuICBTdWdnZXN0IDEzMDU2MFxuIik7CisJfQorCVdBUk4oYXNwaSwgImVycm5vOiA9ICVkXG4iLCBteWVycm9yKTsKKyAgICB9CisgICAgZ290byBlcnJvcl9leGl0OworICB9CisKKyAgc3RhdHVzID0gcmVhZChmZCwgc2dfcmVwbHlfaGRyLCBvdXRfbGVuKTsKKyAgaWYgKHN0YXR1cyA8IDAgfHwgc3RhdHVzICE9IG91dF9sZW4pIHsKKyAgICBXQVJOKGFzcGksICJub3QgZW5vdWdoIGJ5dGVzIHJlYWQgZnJvbSBzY3NpIGRldmljZSVkXG4iLCBzdGF0dXMpOworICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgfQorCisgIGlmIChzZ19yZXBseV9oZHItPnJlc3VsdCAhPSAwKSB7CisgICAgZXJyb3JfY29kZSA9IHNnX3JlcGx5X2hkci0+cmVzdWx0OworICAgIFdBUk4oYXNwaSwgInJlcGx5IGhlYWRlciBlcnJvciAoJWQpXG4iLCBzZ19yZXBseV9oZHItPnJlc3VsdCk7CisgICAgZ290byBlcnJvcl9leGl0OworICB9CisKKyAgaWYgKFRBUkdFVF9UT19IT1NUKGxwUFJCKSAmJiBscFBSQi0+U1JCX0J1ZkxlbikgeworICAgIG1lbWNweShscEJ1Ziwgc2dfcmVwbHlfaGRyICsgMSwgbHBQUkItPlNSQl9CdWZMZW4pOworICB9CisKKyAgLyogY29weSBpbiBzZW5zZSBidWZmZXIgdG8gYW1vdW50IHRoYXQgaXMgYXZhaWxhYmxlIGluIGNsaWVudCAqLworICBpZiAobHBQUkItPlNSQl9TZW5zZUxlbikgeworICAgIGludCBzZW5zZV9sZW4gPSBscFBSQi0+U1JCX1NlbnNlTGVuOworICAgIGlmIChscFBSQi0+U1JCX1NlbnNlTGVuID4gMTYpCisgICAgICBzZW5zZV9sZW4gPSAxNjsKKyAgICBtZW1jcHkoU0VOU0VfQlVGRkVSKGxwUFJCKSwgJnNnX3JlcGx5X2hkci0+c2Vuc2VfYnVmZmVyWzBdLCBzZW5zZV9sZW4pOworICB9CisKKworICBscFBSQi0+U1JCX1N0YXR1cyA9IFNTX0NPTVA7CisgIGxwUFJCLT5TUkJfSGFTdGF0ID0gSEFTVEFUX09LOworICBscFBSQi0+U1JCX1RhcmdTdGF0ID0gU1RBVFVTX0dPT0Q7CisKKyAgLyogbm93IGRvIHBvc3RpbmcgKi8KKworICBpZiAoQVNQSV9QT1NUSU5HKGxwUFJCKSAmJiBscFBSQi0+U1JCX1Bvc3RQcm9jKSB7CisgICAgVFJBQ0UoYXNwaSwgIlBvc3QgUm91dGluZSAoJWx4KSBjYWxsZWRcbiIsIChEV09SRCkgbHBQUkItPlNSQl9Qb3N0UHJvYyk7CisgICAgc3dpdGNoIChtb2RlKQorICAgIHsKKyAgICAgIGNhc2UgQVNQSV9ET1M6CisgICAgICB7CisJU0VHUFRSIHNwUFJCID0gTWFwTFMobHBQUkIpOworCisJQ2FsbGJhY2tzLT5DYWxsQVNQSVBvc3RQcm9jKGxwUFJCLT5TUkJfUG9zdFByb2MsIHNwUFJCKTsJCisJVW5NYXBMUyhzcFBSQik7CisJYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFTUElfV0lOMTY6CisgICAgICAgIENhbGxiYWNrcy0+Q2FsbEFTUElQb3N0UHJvYyhscFBSQi0+U1JCX1Bvc3RQcm9jLCBwdHJQUkIpOworCWJyZWFrOworICAgIH0KKyAgfQorCisgIGZyZWUoc2dfcmVwbHlfaGRyKTsKKyAgZnJlZShzZ19oZCk7CisgIEFTUElfRGVidWdQcmludFJlc3VsdChscFBSQiwgbW9kZSk7CisgIHJldHVybiBTU19DT01QOworICAKK2Vycm9yX2V4aXQ6CisgIGlmIChlcnJvcl9jb2RlID09IEVCVVNZKSB7CisgICAgICBscFBSQi0+U1JCX1N0YXR1cyA9IFNTX0FTUElfSVNfQlVTWTsKKyAgICAgIFRSQUNFKGFzcGksICJEZXZpY2UgYnVzeVxuIik7CisgIH0KKyAgZWxzZSB7CisgICAgICBXQVJOKGFzcGksICJGYWlsZWRcbiIpOworICAgICAgbHBQUkItPlNSQl9TdGF0dXMgPSBTU19FUlI7CisgIH0KKworICAvKiBJJ20gbm90IHN1cmUgZXhhY3RseSBlcnJvciBjb2RlcyB3b3JrIGhlcmUKKyAgICogV2UgcHJvYmFibHkgc2hvdWxkIHNldCBscFBSQi0+U1JCX1RhcmdTdGF0LCBTUkJfSGFTdGF0ID8KKyAgICovCisgIFdBUk4oYXNwaSwgImVycm9yX2V4aXRcbiIpOworICBmcmVlKHNnX3JlcGx5X2hkcik7CisgIGZyZWUoc2dfaGQpOworICByZXR1cm4gbHBQUkItPlNSQl9TdGF0dXM7Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEdldEFTUElTdXBwb3J0SW5mbzE2ICAgKFdJTkFTUEkuMSkKKyAqLworCitXT1JEIFdJTkFQSSBHZXRBU1BJU3VwcG9ydEluZm8xNigpCit7CisjaWZkZWYgbGludXgKKyAgICBUUkFDRShhc3BpLCAiR0VUQVNQSVN1cHBvcnRJbmZvMTZcbiIpOworICAgIC8qIGhpZ2ggYnl0ZSBTU19DT01QIC0gbG93IGJ5dGUgbnVtYmVyIG9mIGhvc3QgYWRhcHRlcnMuCisgICAgICogRklYTUUhISEgVGhlIG51bWJlciBvZiBob3N0IGFkYXB0ZXJzIGlzIGluY29ycmVjdC4KKyAgICAgKiBJJ20gbm90IHN1cmUgaG93IHRvIGRldGVybWluZSB0aGlzIHVuZGVyIGxpbnV4IGV0Yy4KKyAgICAgKi8KKyAgICByZXR1cm4gKChTU19DT01QIDw8IDgpIHwgMSk7CisjZWxzZQorICAgIHJldHVybiAoKFNTX0NPTVAgPDwgOCkgfCAwKTsKKyNlbmRpZgorfQorCisKK0RXT1JEIEFTUElfU2VuZEFTUElDb21tYW5kKERXT1JEIHB0clNSQiwgVUlOVDE2IG1vZGUpCit7CisjaWZkZWYgbGludXgKKyAgTFBTUkIxNiBscFNSQiA9IDA7CisKKyAgc3dpdGNoIChtb2RlKQorICB7CisgICAgICBjYXNlIEFTUElfRE9TOgorCWlmIChwdHJTUkIpCisJICAgIGxwU1JCID0gKExQU1JCMTYpRE9TTUVNX01hcFJlYWxUb0xpbmVhcihwdHJTUkIpOworCWJyZWFrOworICAgICAgY2FzZSBBU1BJX1dJTjE2OgorCWxwU1JCID0gUFRSX1NFR19UT19MSU4ocHRyU1JCKTsKKwlicmVhazsKKyAgfQorCisgIHN3aXRjaCAobHBTUkItPmNvbW1vbi5TUkJfQ21kKSB7CisgIGNhc2UgU0NfSEFfSU5RVUlSWToKKyAgICBscFNSQi0+aW5xdWlyeS5TUkJfU3RhdHVzID0gU1NfQ09NUDsgICAgICAgLyogY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIGlmIChscFNSQi0+aW5xdWlyeS5TUkJfNTVBQVNpZ25hdHVyZSA9PSAweDU1YWEpIHsKKwlUUkFDRShhc3BpLCAiRXh0ZW5kZWQgcmVxdWVzdCBkZXRlY3RlZCAoQWRhcHRlYydzIEFTUEl4RE9TKS5cbldlIGRvbid0IHN1cHBvcnQgaXQgYXQgdGhlIG1vbWVudC5cbiIpOworICAgIH0KKyAgICBscFNSQi0+aW5xdWlyeS5TUkJfRXh0QnVmZmVyU2l6ZSA9IDB4MjAwMDsgLyogYm9ndXMgdmFsdWUgKi8KKyAgICBscFNSQi0+aW5xdWlyeS5IQV9Db3VudCA9IDE7ICAgICAgICAgICAgICAgLyogbm90IGFsd2F5cyAqLworICAgIGxwU1JCLT5pbnF1aXJ5LkhBX1NDU0lfSUQgPSA3OyAgICAgICAgICAgICAvKiBub3QgYWx3YXlzIElEIDcgKi8KKyAgICBzdHJjYXQobHBTUkItPmlucXVpcnkuSEFfTWFuYWdlcklkLCAiV2luZSBBU1BJMTYiKTsgLyogbWF4IDE1IGNoYXJzICovCisgICAgc3RyY2F0KGxwU1JCLT5pbnF1aXJ5LkhBX0lkZW50aWZpZXIsICJXaW5lIGhvc3QiKTsgLyogRklYTUU6IHJldHVybiBob3N0CithZGFwdGVyIG5hbWUgKi8KKyAgICBtZW1zZXQobHBTUkItPmlucXVpcnkuSEFfVW5pcXVlLCAwLCAxNik7IC8qIGRlZmF1bHQgSEFfVW5pcXVlIGNvbnRlbnQgKi8KKyAgICBscFNSQi0+aW5xdWlyeS5IQV9VbmlxdWVbNl0gPSAweDAyOyAvKiBNYXhpbXVtIFRyYW5zZmVyIExlbmd0aCAoMTI4SywgQnl0ZT4gNC03KSAqLworICAgIEZJWE1FKGFzcGksICJBU1BJOiBQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgU0NfSEFfSU5RVUlSWSBmb3IgYWRhcHRlciAlZC5cbiIsIGxwU1JCLT5pbnF1aXJ5LlNSQl9IYUlkKTsKKyAgICByZXR1cm4gU1NfQ09NUDsKKyAgY2FzZSBTQ19HRVRfREVWX1RZUEU6CisgICAgRklYTUUoYXNwaSwgIk5vdCBpbXBsZW1lbnRlZCBTQ19HRVRfREVWX1RZUEVcbiIpOworICAgIGJyZWFrOworICBjYXNlIFNDX0VYRUNfU0NTSV9DTUQ6CisgICAgcmV0dXJuIEFTUElfRXhlY1Njc2lDbWQoKERXT1JEKXB0clNSQiwgbW9kZSk7CisgICAgYnJlYWs7CisgIGNhc2UgU0NfUkVTRVRfREVWOgorICAgIEZJWE1FKGFzcGksICJOb3QgaW1wbGVtZW50ZWQgU0NfUkVTRVRfREVWXG4iKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBXQVJOKGFzcGksICJVbmtub3duIGNvbW1hbmQgJWRcbiIsIGxwU1JCLT5jb21tb24uU1JCX0NtZCk7CisgIH0KKyAgcmV0dXJuIFNTX0lOVkFMSURfU1JCOworI2Vsc2UKKyAgcmV0dXJuIFNTX0lOVkFMSURfU1JCOworI2VuZGlmCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTZW5kQVNQSUNvbW1hbmQxNiAgIChXSU5BU1BJLjIpCisgKi8KK1dPUkQgV0lOQVBJIFNlbmRBU1BJQ29tbWFuZDE2KFNFR1BUUiBzZWdwdHJfc3JiKQoreworI2lmZGVmIGxpbnV4CisgICAgcmV0dXJuIEFTUElfU2VuZEFTUElDb21tYW5kKHNlZ3B0cl9zcmIsIEFTUElfV0lOMTYpOworI2Vsc2UKKyAgICByZXR1cm4gMDsgCisjZW5kaWYKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEdldEFTUElETExWZXJzaW9uMTYgICAoV0lOQVNQSS40KQorICovCisKK0RXT1JEIFdJTkFQSSBHZXRBU1BJRExMVmVyc2lvbjE2KCkKK3sKKyNpZmRlZiBsaW51eAorCXJldHVybiAoRFdPUkQpMjsKKyNlbHNlCisJcmV0dXJuIChEV09SRCkwOworI2VuZGlmCit9CisKKwordm9pZCBXSU5BUEkgQVNQSV9ET1NfZnVuYyhEV09SRCBzcmIpCit7CisgICAgICAgQVNQSV9TZW5kQVNQSUNvbW1hbmQoc3JiLCBBU1BJX0RPUyk7Cit9CisKKworLyogcmV0dXJucyBhIHJlYWwgbW9kZSBjYWxsIGFkZHJlc3MgdG8gQVNQSV9ET1NfZnVuYygpICovCit2b2lkIEFTUElfRE9TX0hhbmRsZUludChDT05URVhUICpjb250ZXh0KQoreworI2lmZGVmIGxpbnV4CisgICAgICAgRkFSUFJPQzE2IERPU19mdW5jOworICAgICAgIERXT1JEIGRvczsKKyAgICAgICBMUEJZVEUgZG9zcHRyOworCisgICAgICAgRE9TX2Z1bmMgPSBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIkFTUElfRE9TX2Z1bmMiKTsKKyAgICAgICBkb3MgPSBHbG9iYWxET1NBbGxvYyg1KTsKKyAgICAgICBkb3NwdHIgPSAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTihMT1dPUkQoZG9zKSwgMCk7CisgICAgICAgKmRvc3B0cisrID0gMHhlYTsgLyogbGptcCAqLworICAgICAgICooRkFSUFJPQzE2ICopZG9zcHRyID0gRE9TX2Z1bmM7CisKKyAgICAgICAqKERXT1JEICopUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKQorICAgICAgICAgICAgICAgPSBNQUtFTE9ORygwLCBISVdPUkQoZG9zKSk7IC8qIHJlYWwgbW9kZSBhZGRyZXNzICovCisgICAgICAgUkVTRVRfQ0ZMQUcoY29udGV4dCk7CisgICAgICAgQVhfcmVnKGNvbnRleHQpID0gQ1hfcmVnKGNvbnRleHQpOworI2Vsc2UKKyAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RsbHMvd25hc3BpMzIvTWFrZWZpbGUuaW4gYi9kbGxzL3duYXNwaTMyL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjJiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL3duYXNwaTMyL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTUgQEAKK0RFRlMgICAgICA9IEBETExGTEFHU0AgLURfX1dJTkVfXworVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACitUT1BPQkpESVIgPSAuLi8uLgorU1JDRElSICAgID0gQHNyY2RpckAKK1ZQQVRIICAgICA9IEBzcmNkaXJACitNT0RVTEUgICAgPSB3bmFzcGkzMgorCitDX1NSQ1MgPSBcCisJd2luYXNwaTMyLmMKKworYWxsOiAkKE1PRFVMRSkubworCitATUFLRV9SVUxFU0AKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL2RsbHMvd25hc3BpMzIvd2luYXNwaTMyLmMgYi9kbGxzL3duYXNwaTMyL3dpbmFzcGkzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDdmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL3duYXNwaTMyL3dpbmFzcGkzMi5jCkBAIC0wLDAgKzEsMzczIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGR0Lmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Y2FsbGJhY2suaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiYXNwaS5oIgorI2luY2x1ZGUgInduYXNwaTMyLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgIm1pc2NlbXUuaCIKKworCisvKiBGSVhNRSEKKyAqIDEpIFJlc2lkdWFsIGJ5dGUgbGVuZ3RoIHJlcG9ydGluZyBub3QgaGFuZGxlZAorICogMikgTWFrZSB0aGlzIGNvZGUgcmUtZW50cmFudCBmb3IgbXVsdGl0aHJlYWRpbmcKKyAqIDMpIE9ubHkgbGludXggc3VwcG9ydGVkIHNvIGZhcgorICovCisKKyNpZmRlZiBsaW51eAorc3RhdGljIGludAorQVNQSV9PcGVuRGV2aWNlMzIoU1JCX0V4ZWNTQ1NJQ21kMzIgKnByYikKK3sKKyAgICBpbnQJZmQ7CisgICAgY2hhcglpZHN0clsyMF07CisgICAgY2hhcglkZXZpY2Vfc3RyWzUwXTsKKyAgICBBU1BJX0RFVklDRV9JTkZPICpjdXJyOworCisgICAgLyogc2VhcmNoIGxpc3Qgb2YgZGV2aWNlcyB0byBzZWUgaWYgd2UndmUgb3BlbmVkIGl0IGFscmVhZHkuCisgICAgICogVGhlcmUgaXMgbm90IGFuIGV4cGxpY2l0IG9wZW4vY2xvc2UgaW4gQVNQSSBsYW5kLCBzbyBob3BlZnVsbHkKKyAgICAgKiBrZWVwaW5nIGEgZGV2aWNlIG9wZW4gd29uJ3QgYmUgYSBwcm9ibGVtLgorICAgICAqLworCisgICAgZm9yIChjdXJyID0gQVNQSV9vcGVuX2RldmljZXM7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0KSB7CisJaWYgKGN1cnItPmhvc3RJZCA9PSBwcmItPlNSQl9IYUlkICYmCisJICAgIGN1cnItPnRhcmdldCA9PSBwcmItPlNSQl9UYXJnZXQgJiYKKwkgICAgY3Vyci0+bHVuID09IHByYi0+U1JCX0x1bikgeworCSAgICByZXR1cm4gY3Vyci0+ZmQ7CisJfQorICAgIH0KKworICAgIC8qIGRldmljZSB3YXNuJ3QgY2FjaGVkLCBnbyBhaGVhZCBhbmQgb3BlbiBpdCAqLworICAgIHNwcmludGYoaWRzdHIsICJzY3NpIGMlMWR0JTFkZCUxZCIsIHByYi0+U1JCX0hhSWQsIHByYi0+U1JCX1RhcmdldCwgcHJiLT5TUkJfTHVuKTsKKworICAgIGlmICghUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKGlkc3RyLCAiRGV2aWNlIiwgIiIsIGRldmljZV9zdHIsIHNpemVvZihkZXZpY2Vfc3RyKSkpIHsKKwlUUkFDRShhc3BpLCAiVHJ5aW5nIHRvIG9wZW4gdW5saXN0ZWQgc2NzaSBkZXZpY2UgJXNcbiIsIGlkc3RyKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgVFJBQ0UoYXNwaSwgIk9wZW5pbmcgZGV2aWNlICVzPSVzXG4iLCBpZHN0ciwgZGV2aWNlX3N0cik7CisKKyAgICBmZCA9IG9wZW4oZGV2aWNlX3N0ciwgT19SRFdSKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKwlpbnQgc2F2ZV9lcnJvciA9IGVycm5vOworCUVSUihhc3BpLCAiRXJyb3Igb3BlbmluZyBkZXZpY2UgJXMsIGVycm5vPSVkXG4iLCBkZXZpY2Vfc3RyLCBzYXZlX2Vycm9yKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogZGV2aWNlIGlzIG5vdyBvcGVuICovCisgICAgY3VyciA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKEFTUElfREVWSUNFX0lORk8pICk7CisgICAgY3Vyci0+ZmQgPSBmZDsKKyAgICBjdXJyLT5ob3N0SWQgPSBwcmItPlNSQl9IYUlkOworICAgIGN1cnItPnRhcmdldCA9IHByYi0+U1JCX1RhcmdldDsKKyAgICBjdXJyLT5sdW4gPSBwcmItPlNSQl9MdW47CisKKyAgICAvKiBpbnNlcnQgbmV3IHJlY29yZCBhdCBiZWdpbm5pbmcgb2Ygb3BlbiBkZXZpY2UgbGlzdCAqLworICAgIGN1cnItPm5leHQgPSBBU1BJX29wZW5fZGV2aWNlczsKKyAgICBBU1BJX29wZW5fZGV2aWNlcyA9IGN1cnI7CisgICAgcmV0dXJuIGZkOworfQorCisKK3N0YXRpYyB2b2lkCitBU1BJX0RlYnVnUHJpbnRDbWQzMihTUkJfRXhlY1NDU0lDbWQzMiAqcHJiKQoreworICBCWVRFCWNtZDsKKyAgaW50CWk7CisgIEJZVEUgKmNkYjsKKyAgZGJnX2RlY2xfc3RyKGFzcGksIDUxMik7CisKKyAgc3dpdGNoIChwcmItPkNEQkJ5dGVbMF0pIHsKKyAgY2FzZSBDTURfSU5RVUlSWToKKyAgICBUUkFDRShhc3BpLCAie1xuIik7CisgICAgVFJBQ0UoYXNwaSwgIlx0RVZQRDogJWRcbiIsIHByYi0+Q0RCQnl0ZVsxXSAmIDEpOworICAgIFRSQUNFKGFzcGksICJcdExVTjogJWRcbiIsIChwcmItPkNEQkJ5dGVbMV0gJiAweGMpID4+IDEpOworICAgIFRSQUNFKGFzcGksICJcdFBBR0UgQ09ERTogJWRcbiIsIHByYi0+Q0RCQnl0ZVsyXSk7CisgICAgVFJBQ0UoYXNwaSwgIlx0QUxMT0NBVElPTiBMRU5HVEg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOworICAgIFRSQUNFKGFzcGksICJcdENPTlRST0w6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNV0pOworICAgIFRSQUNFKGFzcGksICJ9XG4iKTsKKyAgICBicmVhazsKKyAgY2FzZSBDTURfU0NBTl9TQ0FOOgorICAgIFRSQUNFKGFzcGksICJUcmFuc2ZlciBMZW5ndGg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOworICAgIGJyZWFrOworICB9CisKKyAgVFJBQ0UoYXNwaSwgIkhvc3QgQWRhcHRlcjogJWRcbiIsIHByYi0+U1JCX0hhSWQpOworICBUUkFDRShhc3BpLCAiRmxhZ3M6ICVkXG4iLCBwcmItPlNSQl9GbGFncyk7CisgIGlmIChUQVJHRVRfVE9fSE9TVChwcmIpKSB7CisgICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2ZlcjogVGFyZ2V0IHRvIGhvc3QuIExlbmd0aCBjaGVja2VkLlxuIik7CisgIH0KKyAgZWxzZSBpZiAoSE9TVF9UT19UQVJHRVQocHJiKSkgeworICAgIFRSQUNFKGFzcGksICJcdERhdGEgdHJhbnNmZXI6IEhvc3QgdG8gdGFyZ2V0LiBMZW5ndGggY2hlY2tlZC5cbiIpOworICB9CisgIGVsc2UgaWYgKE5PX0RBVEFfVFJBTlNGRVJFRChwcmIpKSB7CisgICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2Zlcjogbm9uZVxuIik7CisgIH0KKyAgZWxzZSB7CisgICAgV0FSTihhc3BpLCAiXHRUcmFuc2ZlciBieSBzY3NpIGNtZC4gTGVuZ3RoIG5vdCBjaGVja2VkLlxuIik7CisgIH0KKworICBUUkFDRShhc3BpLCAiXHRSZXNpZHVhbCBieXRlIGxlbmd0aCByZXBvcnRpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHg0ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisgIFRSQUNFKGFzcGksICJcdExpbmtpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHgyID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisgIFRSQUNFKGFzcGksICJcdFBvc3RpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHgxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisgIFRSQUNFKGFzcGksICJUYXJnZXQ6ICVkXG4iLCBwcmItPlNSQl9UYXJnZXQpOworICBUUkFDRShhc3BpLCAiTHVuOiAlZFxuIiwgcHJiLT5TUkJfTHVuKTsKKyAgVFJBQ0UoYXNwaSwgIkJ1ZkxlbjogJWxkXG4iLCBwcmItPlNSQl9CdWZMZW4pOworICBUUkFDRShhc3BpLCAiU2Vuc2VMZW46ICVkXG4iLCBwcmItPlNSQl9TZW5zZUxlbik7CisgIFRSQUNFKGFzcGksICJCdWZQdHI6ICVwXG4iLCBwcmItPlNSQl9CdWZQb2ludGVyKTsKKyAgVFJBQ0UoYXNwaSwgIkNEQiBMZW5ndGg6ICVkXG4iLCBwcmItPlNSQl9DREJMZW4pOworICBUUkFDRShhc3BpLCAiUE9TVCBQcm9jOiAlbHhcbiIsIChEV09SRCkgcHJiLT5TUkJfUG9zdFByb2MpOworICBjZGIgPSAmcHJiLT5DREJCeXRlWzBdOworICBjbWQgPSBwcmItPkNEQkJ5dGVbMF07CisgIGZvciAoaSA9IDA7IGkgPCBwcmItPlNSQl9DREJMZW47IGkrKykgeworICAgIGlmIChpICE9IDApIGRzcHJpbnRmKGFzcGksICIsIik7CisgICAgZHNwcmludGYoYXNwaSwgIiUwMngiLCAqY2RiKyspOworICB9CisgIFRSQUNFKGFzcGksICJDREIgYnVmZmVyWyVzXVxuIiwgZGJnX3N0cihhc3BpKSk7Cit9CisKK3N0YXRpYyB2b2lkCitBU1BJX1ByaW50U2Vuc2VBcmVhMzIoU1JCX0V4ZWNTQ1NJQ21kMzIgKnByYikKK3sKKyAgaW50CWk7CisgIEJZVEUgKmNkYjsKKyAgZGJnX2RlY2xfc3RyKGFzcGksIDUxMik7CisKKyAgY2RiID0gJnByYi0+Q0RCQnl0ZVswXTsKKyAgZm9yIChpID0gMDsgaSA8IHByYi0+U1JCX1NlbnNlTGVuOyBpKyspIHsKKyAgICBpZiAoaSkgZHNwcmludGYoYXNwaSwgIiwiKTsKKyAgICBkc3ByaW50Zihhc3BpLCAiJTAyeCIsICpjZGIrKyk7CisgIH0KKyAgVFJBQ0UoYXNwaSwgIlNlbnNlQXJlYVslc11cbiIsIGRiZ19zdHIoYXNwaSkpOworfQorCitzdGF0aWMgdm9pZAorQVNQSV9EZWJ1Z1ByaW50UmVzdWx0MzIoU1JCX0V4ZWNTQ1NJQ21kMzIgKnByYikKK3sKKworICBzd2l0Y2ggKHByYi0+Q0RCQnl0ZVswXSkgeworICBjYXNlIENNRF9JTlFVSVJZOgorICAgIFRSQUNFKGFzcGksICJWZW5kb3I6ICclcydcbiIsIHByYi0+U1JCX0J1ZlBvaW50ZXIgKyBJTlFVSVJZX1ZFTkRPUik7CisgICAgYnJlYWs7CisgIGNhc2UgQ01EX1RFU1RfVU5JVF9SRUFEWToKKyAgICBBU1BJX1ByaW50U2Vuc2VBcmVhMzIocHJiKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgV09SRAorQVNQSV9FeGVjU2NzaUNtZDMyKFNSQl9FeGVjU0NTSUNtZDMyICpscFBSQikKK3sKKyAgc3RydWN0IHNnX2hlYWRlciAqc2dfaGQsICpzZ19yZXBseV9oZHI7CisgIGludAlzdGF0dXM7CisgIGludAlpbl9sZW4sIG91dF9sZW47CisgIGludAllcnJvcl9jb2RlID0gMDsKKyAgaW50CWZkOworCisgIEFTUElfRGVidWdQcmludENtZDMyKGxwUFJCKTsKKworICBmZCA9IEFTUElfT3BlbkRldmljZTMyKGxwUFJCKTsKKyAgaWYgKGZkID09IC0xKSB7CisgICAgICBFUlIoYXNwaSwgIkZhaWxlZDogY291bGQgbm90IG9wZW4gZGV2aWNlLiBEZXZpY2UgcGVybWlzc2lvbnMgIT9cbiIpOworICAgICAgbHBQUkItPlNSQl9TdGF0dXMgPSBTU19FUlI7CisgICAgICByZXR1cm4gU1NfRVJSOworICB9CisKKyAgc2dfaGQgPSBOVUxMOworICBzZ19yZXBseV9oZHIgPSBOVUxMOworCisgIGxwUFJCLT5TUkJfU3RhdHVzID0gU1NfUEVORElORzsKKworICBpZiAoIWxwUFJCLT5TUkJfQ0RCTGVuKSB7CisgICAgICBXQVJOKGFzcGksICJGYWlsZWQ6IGxwUFJCLT5TUkJfQ0RCTGVuID0gMC5cbiIpOworICAgICAgbHBQUkItPlNSQl9TdGF0dXMgPSBTU19FUlI7CisgICAgICByZXR1cm4gU1NfRVJSOworICB9CisKKyAgLyogYnVpbGQgdXAgc2dfaGVhZGVyICsgc2NzaSBjbWQgKi8KKyAgaWYgKEhPU1RfVE9fVEFSR0VUKGxwUFJCKSkgeworICAgIC8qIHNlbmQgaGVhZGVyLCBjb21tYW5kLCBhbmQgdGhlbiBkYXRhICovCisgICAgaW5fbGVuID0gU0NTSV9PRkYgKyBscFBSQi0+U1JCX0NEQkxlbiArIGxwUFJCLT5TUkJfQnVmTGVuOworICAgIHNnX2hkID0gKHN0cnVjdCBzZ19oZWFkZXIgKikgbWFsbG9jKGluX2xlbik7CisgICAgbWVtc2V0KHNnX2hkLCAwLCBTQ1NJX09GRik7CisgICAgbWVtY3B5KHNnX2hkICsgMSwgJmxwUFJCLT5DREJCeXRlWzBdLCBscFBSQi0+U1JCX0NEQkxlbik7CisgICAgaWYgKGxwUFJCLT5TUkJfQnVmTGVuKSB7CisgICAgICBtZW1jcHkoKChCWVRFICopIHNnX2hkKSArIFNDU0lfT0ZGICsgbHBQUkItPlNSQl9DREJMZW4sIGxwUFJCLT5TUkJfQnVmUG9pbnRlciwgbHBQUkItPlNSQl9CdWZMZW4pOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvKiBzZW5kIGhlYWRlciBhbmQgY29tbWFuZCAtIG5vIGRhdGEgKi8KKyAgICBpbl9sZW4gPSBTQ1NJX09GRiArIGxwUFJCLT5TUkJfQ0RCTGVuOworICAgIHNnX2hkID0gKHN0cnVjdCBzZ19oZWFkZXIgKikgbWFsbG9jKGluX2xlbik7CisgICAgbWVtc2V0KHNnX2hkLCAwLCBTQ1NJX09GRik7CisgICAgbWVtY3B5KHNnX2hkICsgMSwgJmxwUFJCLT5DREJCeXRlWzBdLCBscFBSQi0+U1JCX0NEQkxlbik7CisgIH0KKworICBpZiAoVEFSR0VUX1RPX0hPU1QobHBQUkIpKSB7CisgICAgb3V0X2xlbiA9IFNDU0lfT0ZGICsgbHBQUkItPlNSQl9CdWZMZW47CisgICAgc2dfcmVwbHlfaGRyID0gKHN0cnVjdCBzZ19oZWFkZXIgKikgbWFsbG9jKG91dF9sZW4pOworICAgIG1lbXNldChzZ19yZXBseV9oZHIsIDAsIFNDU0lfT0ZGKTsKKyAgICBzZ19oZC0+cmVwbHlfbGVuID0gb3V0X2xlbjsKKyAgfQorICBlbHNlIHsKKyAgICBvdXRfbGVuID0gU0NTSV9PRkY7CisgICAgc2dfcmVwbHlfaGRyID0gKHN0cnVjdCBzZ19oZWFkZXIgKikgbWFsbG9jKG91dF9sZW4pOworICAgIG1lbXNldChzZ19yZXBseV9oZHIsIDAsIFNDU0lfT0ZGKTsKKyAgICBzZ19oZC0+cmVwbHlfbGVuID0gb3V0X2xlbjsKKyAgfQorCisgIHN0YXR1cyA9IHdyaXRlKGZkLCBzZ19oZCwgaW5fbGVuKTsKKyAgaWYgKHN0YXR1cyA8IDAgfHwgc3RhdHVzICE9IGluX2xlbikgeworICAgICAgaW50IG15ZXJyb3IgPSBlcnJubzsKKworICAgIFdBUk4oYXNwaSwgIk5vdCBlbm91Z2ggYnl0ZXMgd3JpdHRlbiB0byBzY3NpIGRldmljZSBieXRlcz0lZCAuLiAlZFxuIiwgaW5fbGVuLCBzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisJaWYgKG15ZXJyb3IgPT0gRU5PTUVNKSB7CisJICAgIE1TRygiQVNQSTogTGludXggZ2VuZXJpYyBzY3NpIGRyaXZlclxuICBZb3UgcHJvYmFibHkgbmVlZCB0byByZS1jb21waWxlIHlvdXIga2VybmVsIHdpdGggYSBsYXJnZXIgU0dfQklHX0JVRkYgdmFsdWUgKHNnLmgpXG4gIFN1Z2dlc3QgMTMwNTYwXG4iKTsKKwl9CisJV0FSTihhc3BpLCAiZXJybm86ID0gJWRcbiIsIG15ZXJyb3IpOworICAgIH0KKyAgICBnb3RvIGVycm9yX2V4aXQ7CisgIH0KKworICBzdGF0dXMgPSByZWFkKGZkLCBzZ19yZXBseV9oZHIsIG91dF9sZW4pOworICBpZiAoc3RhdHVzIDwgMCB8fCBzdGF0dXMgIT0gb3V0X2xlbikgeworICAgIFdBUk4oYXNwaSwgIm5vdCBlbm91Z2ggYnl0ZXMgcmVhZCBmcm9tIHNjc2kgZGV2aWNlJWRcbiIsIHN0YXR1cyk7CisgICAgZ290byBlcnJvcl9leGl0OworICB9CisKKyAgaWYgKHNnX3JlcGx5X2hkci0+cmVzdWx0ICE9IDApIHsKKyAgICBlcnJvcl9jb2RlID0gc2dfcmVwbHlfaGRyLT5yZXN1bHQ7CisgICAgV0FSTihhc3BpLCAicmVwbHkgaGVhZGVyIGVycm9yICglZClcbiIsIHNnX3JlcGx5X2hkci0+cmVzdWx0KTsKKyAgICBnb3RvIGVycm9yX2V4aXQ7CisgIH0KKworICBpZiAoVEFSR0VUX1RPX0hPU1QobHBQUkIpICYmIGxwUFJCLT5TUkJfQnVmTGVuKSB7CisgICAgbWVtY3B5KGxwUFJCLT5TUkJfQnVmUG9pbnRlciwgc2dfcmVwbHlfaGRyICsgMSwgbHBQUkItPlNSQl9CdWZMZW4pOworICB9CisKKyAgLyogY29weSBpbiBzZW5zZSBidWZmZXIgdG8gYW1vdW50IHRoYXQgaXMgYXZhaWxhYmxlIGluIGNsaWVudCAqLworICBpZiAobHBQUkItPlNSQl9TZW5zZUxlbikgeworICAgIGludCBzZW5zZV9sZW4gPSBscFBSQi0+U1JCX1NlbnNlTGVuOworICAgIGlmIChscFBSQi0+U1JCX1NlbnNlTGVuID4gMTYpCisgICAgICBzZW5zZV9sZW4gPSAxNjsKKyAgICBtZW1jcHkoU0VOU0VfQlVGRkVSKGxwUFJCKSwgJnNnX3JlcGx5X2hkci0+c2Vuc2VfYnVmZmVyWzBdLCBzZW5zZV9sZW4pOworICB9CisKKworICBscFBSQi0+U1JCX1N0YXR1cyA9IFNTX0NPTVA7CisgIGxwUFJCLT5TUkJfSGFTdGF0ID0gSEFTVEFUX09LOworICBscFBSQi0+U1JCX1RhcmdTdGF0ID0gU1RBVFVTX0dPT0Q7CisKKyAgLyogbm93IGRvIHBvc3RpbmcgKi8KKworICBpZiAobHBQUkItPlNSQl9Qb3N0UHJvYykgeworICAgIGlmIChBU1BJX1BPU1RJTkcobHBQUkIpKSB7CisgICAgICBUUkFDRShhc3BpLCAiUG9zdCBSb3V0aW5lICglbHgpIGNhbGxlZFxuIiwgKERXT1JEKSBscFBSQi0+U1JCX1Bvc3RQcm9jKTsKKyAgICAgICgqbHBQUkItPlNSQl9Qb3N0UHJvYykobHBQUkIpOworICAgIH0KKyAgICBlbHNlCisgICAgaWYgKGxwUFJCLT5TUkJfRmxhZ3MgJiBTUkJfRVZFTlRfTk9USUZZKSB7CisgICAgICBUUkFDRShhc3BpLCAiU2V0dGluZyBldmVudCAlMDR4XG4iLCAoSEFORExFMzIpbHBQUkItPlNSQl9Qb3N0UHJvYyk7CisgICAgICBTZXRFdmVudCgoSEFORExFMzIpbHBQUkItPlNSQl9Qb3N0UHJvYyk7IC8qIEZJWE1FOiBjb3JyZWN0ID8gKi8KKyAgICB9CisgIH0KKyAgZnJlZShzZ19yZXBseV9oZHIpOworICBmcmVlKHNnX2hkKTsKKyAgQVNQSV9EZWJ1Z1ByaW50UmVzdWx0MzIobHBQUkIpOworICByZXR1cm4gU1NfQ09NUDsKKyAgCitlcnJvcl9leGl0OgorICBpZiAoZXJyb3JfY29kZSA9PSBFQlVTWSkgeworICAgICAgbHBQUkItPlNSQl9TdGF0dXMgPSBTU19BU1BJX0lTX0JVU1k7CisgICAgICBUUkFDRShhc3BpLCAiRGV2aWNlIGJ1c3lcbiIpOworICB9CisgIGVsc2UgeworICAgICAgV0FSTihhc3BpLCAiRmFpbGVkXG4iKTsKKyAgICAgIGxwUFJCLT5TUkJfU3RhdHVzID0gU1NfRVJSOworICB9CisKKyAgLyogSSdtIG5vdCBzdXJlIGV4YWN0bHkgZXJyb3IgY29kZXMgd29yayBoZXJlCisgICAqIFdlIHByb2JhYmx5IHNob3VsZCBzZXQgbHBQUkItPlNSQl9UYXJnU3RhdCwgU1JCX0hhU3RhdCA/CisgICAqLworICBXQVJOKGFzcGksICJlcnJvcl9leGl0XG4iKTsKKyAgZnJlZShzZ19yZXBseV9oZHIpOworICBmcmVlKHNnX2hkKTsKKyAgcmV0dXJuIGxwUFJCLT5TUkJfU3RhdHVzOworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBHZXRBU1BJMzJTdXBwb3J0SW5mbzMyCQlbV05BU1BJMzIuMF0KKyAqCisgKiBDaGVja3MgaWYgdGhlIEFTUEkgc3Vic3lzdGVtIGlzIGluaXRpYWxpemVkIGNvcnJlY3RseS4KKyAqCisgKiBSRVRVUk5TCisgKiAgICBISVdPUkQ6IDAuCisgKiAgICBISUJZVEUgb2YgTE9XT1JEOiBzdGF0dXMgKFNTX0NPTVAgb3IgU1NfRkFJTEVEX0lOSVQpCisgKiAgICBMT0JZVEUgb2YgTE9XT1JEOiAjIG9mIGhvc3QgYWRhcHRlcnMuICAKKyAqLworRFdPUkQgV0lOQVBJIEdldEFTUEkzMlN1cHBvcnRJbmZvMzIoKQoreworICAgIHJldHVybiAoKFNTX0NPTVAgPDwgOCkgfCAxKTsgLyogRklYTUU6IGdldCAjIG9mIGhvc3QgYWRhcHRlcnMgaW5zdGFsbGVkICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTZW5kQVNQSTMyQ29tbWFuZDMyIChXTkFTUEkzMi4xKQorICovCitEV09SRCBXSU5BUEkgU2VuZEFTUEkzMkNvbW1hbmQzMihMUFNSQjMyIGxwU1JCKQoreworI2lmZGVmIGxpbnV4CisgIHN3aXRjaCAobHBTUkItPmNvbW1vbi5TUkJfQ21kKSB7CisgIGNhc2UgU0NfSEFfSU5RVUlSWToKKyAgICBscFNSQi0+aW5xdWlyeS5TUkJfU3RhdHVzID0gU1NfQ09NUDsgICAgICAgLyogY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIGxwU1JCLT5pbnF1aXJ5LkhBX0NvdW50ID0gMTsgICAgICAgICAgICAgICAvKiBub3QgYWx3YXlzICovCisgICAgbHBTUkItPmlucXVpcnkuSEFfU0NTSV9JRCA9IDc7ICAgICAgICAgICAgIC8qIG5vdCBhbHdheXMgSUQgNyAqLworICAgIHN0cmNhdChscFNSQi0+aW5xdWlyeS5IQV9NYW5hZ2VySWQsICJBU1BJIGZvciBXSU4zMiIpOyAvKiBtYXggMTUgY2hhcnMsIGRvbid0IGNoYW5nZSAqLworICAgIHN0cmNhdChscFNSQi0+aW5xdWlyeS5IQV9JZGVudGlmaWVyLCAiV2luZSBob3N0Iik7IC8qIEZJWE1FOiByZXR1cm4gaG9zdCBhZGFwdGVyIG5hbWUgKi8KKyAgICBtZW1zZXQobHBTUkItPmlucXVpcnkuSEFfVW5pcXVlLCAwLCAxNik7IC8qIGRlZmF1bHQgSEFfVW5pcXVlIGNvbnRlbnQgKi8KKyAgICBscFNSQi0+aW5xdWlyeS5IQV9VbmlxdWVbNl0gPSAweDAyOyAvKiBNYXhpbXVtIFRyYW5zZmVyIExlbmd0aCAoMTI4SywgQnl0ZT4gNC03KSAqLworICAgIEZJWE1FKGFzcGksICJBU1BJOiBQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgU0NfSEFfSU5RVUlSWSBmb3IgYWRhcHRlciAlZC5cbiIsIGxwU1JCLT5pbnF1aXJ5LlNSQl9IYUlkKTsKKyAgICByZXR1cm4gU1NfQ09NUDsKKyAgY2FzZSBTQ19HRVRfREVWX1RZUEU6CisgICAgRklYTUUoYXNwaSwgIk5vdCBpbXBsZW1lbnRlZCBTQ19HRVRfREVWX1RZUEVcbiIpOworICAgIGJyZWFrOworICBjYXNlIFNDX0VYRUNfU0NTSV9DTUQ6CisgICAgcmV0dXJuIEFTUElfRXhlY1Njc2lDbWQzMigmbHBTUkItPmNtZCk7CisgICAgYnJlYWs7CisgIGNhc2UgU0NfUkVTRVRfREVWOgorICAgIEZJWE1FKGFzcGksICJOb3QgaW1wbGVtZW50ZWQgU0NfUkVTRVRfREVWXG4iKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBXQVJOKGFzcGksICJVbmtub3duIGNvbW1hbmQgJWRcbiIsIGxwU1JCLT5jb21tb24uU1JCX0NtZCk7CisgIH0KKyAgcmV0dXJuIFNTX0lOVkFMSURfU1JCOworI2Vsc2UKKyAgcmV0dXJuIFNTX0lOVkFMSURfU1JCOworI2VuZGlmCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBHZXRBU1BJMzJETExWZXJzaW9uMzIgICAoV05BU1BJMzIuMykKKyAqLworCitEV09SRCBXSU5BUEkgR2V0QVNQSTMyRExMVmVyc2lvbjMyKCkKK3sKKyNpZmRlZiBsaW51eAorICAgICAgICByZXR1cm4gKERXT1JEKTE7CisjZWxzZQorICAgICAgICByZXR1cm4gKERXT1JEKTA7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbiBiL2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW4KaW5kZXggZmI1NTFiZC4uNWUxZTU4OSAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbgorKysgYi9kb2N1bWVudGF0aW9uL01ha2VmaWxlLmluCkBAIC01MCw2ICs1MCw3IEBACiAJZm9yIGkgaW4gJChJTkNMVURFUyk7IGRvICQoTE5fUykgJChUT1BTUkNESVIpLyQkaSAkJGkgfHwgZXhpdCAxOyBkb25lCiAKIGluc3RhbGw6OiAKKwlbIC1kICQobWFuZGlyKSBdIHx8IG1rZGlyIC1wICQobWFuZGlyKQogCSQoSU5TVEFMTF9EQVRBKSAkKFNSQ0RJUikvd2luZS5tYW4gJChtYW5kaXIpL3dpbmUkKG1hbmV4dCkKIAogdW5pbnN0YWxsOjoKQEAgLTU3LDYgKzU4LDcgQEAKIAogIyBOb3QgZG9uZSBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgbWFrZWluZm8gYnVncwogaW5zdGFsbF9pbmZvOiAkKElORk9GSUxFUykKKwlbIC1kICQoaW5mb2RpcikgXSB8fCBta2RpciAtcCAkKGluZm9kaXIpCiAJZm9yIGkgaW4gJChJTkZPRklMRVMpOyBkbyAkKElOU1RBTExfREFUQSkgJCRpICQoaW5mb2RpcikvJCRpOyBkb25lCiAKIHVuaW5zdGFsbF9pbmZvOgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9jZHJvbS1sYWJlbHMgYi9kb2N1bWVudGF0aW9uL2Nkcm9tLWxhYmVscwppbmRleCAzNjI5N2M1Li5hMmYyYmNhIDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL2Nkcm9tLWxhYmVscworKysgYi9kb2N1bWVudGF0aW9uL2Nkcm9tLWxhYmVscwpAQCAtMSwzICsxLDUgQEAKKyoqKiBWT0xVTUUgTEFCRUwKKwogSWYgYSBwcm9ncmFtIGRlcGVuZHMgb24gdGhlIGNvcnJlY3QgbGFiZWwgYW5kL29yIHNlcmlhbCBudW1iZXIgZm9yIHRoZQogQ0QtUm9tLCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gZXh0cmFjdCB0aGF0IGluZm9ybWF0aW9uOgogCkBAIC04LDYgKzEwLDggQEAKIHdpbmUuaW5pLy53aW5lcmMgZmlsZSBsaWtlOgogTGFiZWw9PHRoZSBsYWJlbD4KIAorKioqIFNFUklBTCBOVU1CRVIKKwogW0ZJWE1FOiBpZiBzb21lb25lIGtub3dzIGhvdyB0byBnZXQgdGhlIHNlcmlhbCBudW1iZXIgaW4gTGludXgsIHBsZWFzZQogICAgICAgICBwdXQgdGhpcyBpbmZvcm1hdGlvbiBoZXJlXS4KIApAQCAtMzksNCArNDMsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CisKK1Byb2JhYmx5IHlvdSBjYW4gZ2V0IHRoYXQgaW5mb3JtYXRpb24gYWxzbyBmcm9tIHRoZSBGaWxlIE1hbmFnZXIgaW4KK1dpbmRvd3MuCisKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIHZvbGluZm8uYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyoqKiBEUklWRSBMRVRURVIKKworU29tZSBpbnN0YWxsZWQgcHJvZ3JhbXMgb25seSBsb29rIGZvciB0aGUgQ0QtUm9tIGluIHRoZSBkcml2ZSBsZXR0ZXIKK3RoYXQgdGhlIENELVJvbSBoYWQgd2hlbiB0aGUgcHJvZ3JhbSB3YXMgaW5zdGFsbGVkLiBJbiB0aGlzIGNhc2UsIG1ha2UKK3N1cmUgeW91IHVzZSB0aGUgY29ycmVjdCBsZXR0ZXIsIGVzcGVjaWFsbHkgaWYgeW91IGluc3RhbGxlZCB0aGUKK3Byb2dyYW0gdW5kZXIgV2luZG93cyBhbmQgYXJlIG5vdyB0cnlpbmcgdG8gcnVuIGl0IGluIFdpbmUuCitTb21lIHByb2dyYW1zIHJlcG9ydGVkbHkgc3RvcmUgdGhlIGRyaXZlIGxldHRlciBpbiB0aGVpciAuSU5JIGZpbGUsCitzbyB5b3UgbWlnaHQgbG9vayB0aGVyZSBhbmQgdHJ5IHRvIGNoYW5nZSBpdC4KZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vY29tbW9uX2NvbnRyb2xzIGIvZG9jdW1lbnRhdGlvbi9jb21tb25fY29udHJvbHMKaW5kZXggNjljMmM5Zi4uMTNkMTFiZCAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9jb21tb25fY29udHJvbHMKKysrIGIvZG9jdW1lbnRhdGlvbi9jb21tb25fY29udHJvbHMKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgIER1bW15IHdyaXR0ZW4gYnkgRXJpYyBLb2hsLiA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CiAKICAgU3RhdHVzOgotICAgICAgLSBEdW1teSBjb250cm9sLiBObyBmdW5jdGlvbmFsaXR5LgorICAgICAgRHVtbXkgY29udHJvbC4gTm8gZnVuY3Rpb25hbGl0eS4KIAogICBOb3RlczoKICAgICAgIEF1dGhvciBuZWVkZWQhISBBbnkgdm9sdW50ZWVycz8/CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICBEdW1teSB3cml0dGVuIGJ5IEVyaWMgS29obC4gPGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlPgogCiAgIFN0YXR1czoKLSAgICAgIC0gRHVtbXkgY29udHJvbC4gTm8gZnVuY3Rpb25hbGl0eS4KKyAgICAgIER1bW15IGNvbnRyb2wuIE5vIGZ1bmN0aW9uYWxpdHkuCiAKICAgTm90ZXM6CiAgICAgICBBdXRob3IgbmVlZGVkISEgQW55IHZvbHVudGVlcnM/PwpAQCAtNTcsNyArNTcsNyBAQAogMy4zIERhdGUgYW5kIFRpbWUgUGlja2VyIENvbnRyb2wKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFN0YXR1czoKLSAgICAgIC0gTm90aGluZyBkb25lIGF0IGFsbC4KKyAgICAgIE5vdGhpbmcgZG9uZSBhdCBhbGwuCiAKICAgTm90ZXM6CiAgICAgICBBdXRob3IgbmVlZGVkISEgQW55IHZvbHVudGVlcnM/PwpAQCAtNjYsNyArNjYsNyBAQAogMy40IERyYWcgTGlzdCBCb3ggQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTdGF0dXM6Ci0gICAgICAtIE5vdGhpbmcgZG9uZSBhdCBhbGwuCisgICAgICBOb3RoaW5nIGRvbmUgYXQgYWxsLgogCiAgIE5vdGVzOgogICAgICAgQXV0aG9yIG5lZWRlZCEhIEFueSB2b2x1bnRlZXJzPz8KQEAgLTc1LDcgKzc1LDcgQEAKIDMuNSBGbGF0IFNjcm9sbCBCYXIgQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFN0YXR1czoKLSAgICAgIC0gTm90aGluZyBkb25lIGF0IGFsbC4KKyAgICAgIE5vdGhpbmcgZG9uZSBhdCBhbGwuCiAKICAgTm90ZXM6CiAgICAgICBBdXRob3IgbmVlZGVkISEgQW55IHZvbHVudGVlcnM/PwpAQCAtODcsNyArODcsNyBAQAogICAgICAgRXJpYyBLb2hsIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KIAogICBTdGF0dXM6Ci0gICAgICAtIEFsbW9zdCBmaW5pc2hlZC4KKyAgICAgIEFsbW9zdCBmaW5pc2hlZC4KIAogCiAzLjcgSG90IEtleSBDb250cm9sCkBAIC0xMDgsMTggKzEwOCwxMyBAQAogICAgICAgRXJpYyBLb2hsIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KIAogICBTdGF0dXM6Ci0gICAgICAtIEFsbW9zdCBmaW5pc2hlZC4KLQotICBOb3RlczoKLSAgICAgIE1vc3Qgb2YgbXkgdGVzdCBwcm9ncmFtcyB3b3JrIGFzIGV4cGVjdGVkLiBCdXQgd2hlbiBpbWFnZSBsaXN0cyBhcmUgdXNlZAotICAgICAgaW4gb3RoZXIgY29udHJvbHMgKGUuZy4gVG9vbGJhcikgdGhleSBkb24ndCBzZWVtIHRvIGJlIGVycm9yLWZyZWUuCi0gICAgICBJdCBsb29rcyBsaWtlIEkgaGF2ZSB0byBkbyBhIG1ham9yIHJlLXdyaXRlICh1c2UgRElCJ3MgaW5zdGVhZCBvZiBEREIncykuCisgICAgICBBbG1vc3QgZmluaXNoZWQuCiAKIAogMy45IElQIEFkZHJlc3MgQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTdGF0dXM6Ci0gICAgICAtIE5vdGhpbmcgZG9uZSBhdCBhbGwuCisgICAgICBOb3RoaW5nIGRvbmUgYXQgYWxsLgogCiAgIE5vdGVzOgogICAgICAgQXV0aG9yIG5lZWRlZCEhIEFueSB2b2x1bnRlZXJzPz8KQEAgLTEyOSw5ICsxMjQsMTAgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQXV0aG9yOgogICAgICAgRHVtbXkgd3JpdHRlbiBieSBFcmljIEtvaGwuIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KKyAgICAgIEJlbiBXaWxsaWFtcyA8LmVkdT4KIAogICBTdGF0dXM6Ci0gICAgICAtIERldmVsb3BtZW50IGluIHByb2dyZXNzLgorICAgICAgVW5kZXIgY29uc3RydWN0aW9uLgogCiAgIE5vdGVzOgogICAgICAgQXV0aG9yIG5lZWRlZCEhIEFueSB2b2x1bnRlZXJzPz8KQEAgLTE0MCwxMyArMTM2LDIyIEBACiAzLjExIE1vbnRoIENhbGVuZGFyIENvbnRyb2wKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTdGF0dXM6Ci0gICAgICAtIE5vdGhpbmcgZG9uZSBhdCBhbGwuCisgICAgICBOb3RoaW5nIGRvbmUgYXQgYWxsLgogCiAgIE5vdGVzOgogICAgICAgQXV0aG9yIG5lZWRlZCEhIEFueSB2b2x1bnRlZXJzPz8KIAogCi0zLjEyIFBhZ2VyIENvbnRyb2wKKzMuMTIgTmF0aXZlIGZvbnQgY29udHJvbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFN0YXR1czoKKyAgICAgIE5vdGhpbmcgZG9uZSBhdCBhbGwuCisKKyAgTm90ZXM6CisgICAgICBBdXRob3IgbmVlZGVkISEgQW55IHZvbHVudGVlcnM/PworCisKKzMuMTMgUGFnZXIgQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEF1dGhvcjoKICAgICAgIER1bW15IHdyaXR0ZW4gYnkgRXJpYyBLb2hsLgpAQCAtMTU4LDE0ICsxNjMsMTQgQEAKICAgICAgIEF1dGhvciBuZWVkZWQhISBBbnkgdm9sdW50ZWVycz8/CiAKIAotMy4xMyBQcm9ncmVzcyBCYXIgQ29udHJvbAorMy4xNCBQcm9ncmVzcyBCYXIgQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBdXRob3I6CiAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBieSBEaW1pdHJpZSBPLiBQYXVuLgogICAgICAgRml4ZXMgYW5kIGltcHJvdmVtZW50cyBieSBFcmljIEtvaGwuCiAKICAgU3RhdHVzOgotICAgICAgLSBBbG1vc3QgZmluaXNoZWQgKHNob3VsZCBiZWhhdmUgbGlrZSB0aGUgb3JpZ2luYWwpLgorICAgICAgQWxtb3N0IGZpbmlzaGVkIChzaG91bGQgYmVoYXZlIGxpa2UgdGhlIG9yaWdpbmFsKS4KIAogICBOb3RlczoKICAgICAgIFdNX0dFVEZPTlQgYW5kIFdNX1NFVEZPTlQgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIFRoZXkgc2VlbSB0byBiZQpAQCAtMTc0LDcgKzE3OSw3IEBACiAgICAgICB0ZXh0dWFsIGluZm9ybWF0aW9uIChlLmcuIHBlcmNlbnRhZ2UpIHRoZXNlIG1lc3NhZ2VzIHdvdWxkIG1ha2Ugc2Vuc2UuCiAKIAotMy4xNCBQcm9wZXJ0eSBTaGVldAorMy4xNSBQcm9wZXJ0eSBTaGVldAogLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBdXRob3I6CiAgICAgICBBbmRlcnMgQ2FybHNzb24gPGFuZGVycy5jYXJsc3NvbkBsaW51eC5udT4KQEAgLTE4NywzMyArMTkyLDMzIEBACiAgICAgICBUYWIgY29udHJvbCBtdXN0IGJlIGltcGxlbWVudGVkIGZpcnN0LgogCiAKLTMuMTUgUmViYXIgQ29udHJvbCAoQ29vbCBCYXIpCiszLjE2IFJlYmFyIENvbnRyb2wgKENvb2wgQmFyKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQXV0aG9yOgogICAgICAgRHVtbXkgd3JpdHRlbiBieSBFcmljIEtvaGwuCiAKICAgU3RhdHVzOgotICAgICAgLSBEdW1teSBjb250cm9sLiBObyBmdW5jdGlvbmFsaXR5LgorICAgICAgRHVtbXkgY29udHJvbC4gTm8gZnVuY3Rpb25hbGl0eS4KIAogICBOb3RlczoKICAgICAgIEF1dGhvciBuZWVkZWQhISBBbnkgdm9sdW50ZWVycz8/CiAKIAotMy4xNiBTdGF0dXMgQmFyIENvbnRyb2wKKzMuMTcgU3RhdHVzIEJhciBDb250cm9sCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBdXRob3I6CiAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBieSBCcnVjZSBNaWxuZXIuCiAgICAgICBGaXhlcyBhbmQgaW1wcm92ZW1lbnRzIGJ5IEVyaWMgS29obC4KIAogICBTdGF0dXM6Ci0gICAgICAtIEFsbW9zdCBmaW5pc2hlZC4KKyAgICAgIEFsbW9zdCBmaW5pc2hlZC4KIAogICBOb3RlczoKICAgICAgIC0gVW5pY29kZSBzdXBwb3J0IGlzIHN0aWxsIG1pc3NpbmcuCiAgICAgICAtIFRvb2x0aXAgaW50ZWdyYXRpb24gaXMgYWxtb3N0IGNvbXBsZXRlLgogCiAKLTMuMTcgVGFiIENvbnRyb2wKKzMuMTggVGFiIENvbnRyb2wKIC0tLS0tLS0tLS0tLS0tLS0KICAgQXV0aG9yOgogICAgICAgQW5kZXJzIENhcmxzc29uIDxhbmRlcnMuY2FybHNzb25AbGludXgubnU+CkBAIC0yMjMsNyArMjI4LDcgQEAKICAgICAgIC0gTm90IHlldCBwdWJsaXNoZWQuCiAKIAotMy4xOCBUb29sYmFyIENvbnRyb2wKKzMuMTkgVG9vbGJhciBDb250cm9sCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBdXRob3I6CiAgICAgICBFcmljIEtvaGwgPGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlPgpAQCAtMjM2LDcgKzI0MSw3IEBACiAgICAgICAtIEJpdG1hcHMgYXJlIG5vdCBjb3JyZWN0bHkgZGlzcGxheWVkLgogCiAKLTMuMTkgVG9vbHRpcCBDb250cm9sCiszLjIwIFRvb2x0aXAgQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQXV0aG9yOgogICAgICAgRXJpYyBLb2hsIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KQEAgLTI0OCw3ICsyNTMsNyBAQAogICAgICAgLSBVbmljb2RlIHN1cHBvcnQgaXMgc3RpbGwgbWlzc2luZy4KIAogCi0zLjIwIFRyYWNrYmFyIENvbnRyb2wKKzMuMjEgVHJhY2tiYXIgQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEF1dGhvcjoKICAgICAgIER1bW15IHdyaXR0ZW4gYnkgRXJpYyBLb2hsIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KQEAgLTI1OCw3ICsyNjMsNyBAQAogICAgICAgVW5kZXIgY29uc3RydWN0aW9uLgogCiAKLTMuMjEgVHJlZSBWaWV3IENvbnRyb2wKKzMuMjIgVHJlZSBWaWV3IENvbnRyb2wKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQXV0aG9yOgogICAgICAgRHVtbXkgd3JpdHRlbiBieSBFcmljIEtvaGwuCkBAIC0yNjgsNyArMjczLDcgQEAKICAgICAgIFVuZGVyIGNvbnRzdHJ1Y3Rpb24uCiAKIAotMy4yMiBVcGRvd24gQ29udHJvbAorMy4yMyBVcGRvd24gQ29udHJvbAogLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBdXRob3I6CiAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBieSBEaW1pdHJpZSBPLiBQYXVuLgpAQCAtMzA2LDMwICszMTEsMzEgQEAKICAgSGF2ZSBhIGxvb2sgYXQgcmVsYXkzMi9jb21jdGwzMi5zcGVjLgogCiAKLTUuMSBEeW1uYW1pYyBTdG9yYWdlIEFycmF5cyAoRFNBKQorNS4xIER5bW5hbWljIFN0b3JhZ2UgQXJyYXkgKERTQSkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBNb3N0IG9mIHRoZSBEU0EgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZC4gSSB1c2VkIFRBU0tNQU4uRVhFIHRvIHdyaXRlIHRoZW0uCi0gIFNpbmNlIFRBU0tNQU4uRVhFIGRvZXNuJ3QgYmFpbCBvdXQgb3IgY3Jhc2ggSSB0aGluayBJJ3ZlIGRvbmUgaXQgcmlnaHQuCisgIFRoZSBEU0EgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHN0b3JlIGFuZCBtYW5hZ2UgZHluYW1pYyBhcnJheXMgb2YgZml4ZWQgc2l6ZQorICBtZW1vcnkgYmxvY2tzLiBUaGV5IGFyZSB1c2VkIGJ5IFRBU0tNQU4uRVhFLCBFeHBsb3JlciwgSUU0IGFuZCBvdGhlcgorICBQcm9ncmFtcyBhbmQgRExMJ3MgdGhhdCBhcmUgInBhcnRzIG9mIHRoZSBXaW5kb3dzIE9wZXJhdGluZyBTeXN0ZW0iLgorICBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGNvbXBsZXRlLgogCiAgIEhhdmUgYSBsb29rIGF0IHRoZSBzb3VyY2UgY29kZSB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbi4KIAotICBGdXJ0aGVyIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLi4uCiAKLQotNS4yIER5bmFtaWMgUG9pbnRlciBBcnJheXMgPz8/IChEUEEpCis1LjIgRHluYW1pYyBQb2ludGVyIEFycmF5IChEUEEpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgU2ltaWxhciB0byB0aGUgRFNBIGZ1bmN0aW9ucywgYnV0IHRoZXkganVzdCBzdG9yZSBwb2ludGVycy4gSSBoYXZlIHdyaXR0ZW4KLSAgc29tZSBzdHVicyBhbmQgc2VtaS1zdHVicy4gVGhleSBhcmUgdXNlZCBieSBFeHBsb3JlciBhbmQgSUU0IGJ1dCB0aGUgCi0gIGltcGxlbWVudGF0aW9uIGlzIHN0aWxsIGluY29tcGxldGUgc2luY2UgYm90aCBwcm9ncmFtcyBzZWVtIHRvIGNyYXNoIGJlY2F1c2UKLSAgb2Ygb3RoZXIgaW5jb21wbGV0ZSBmdW5jdGlvbnMuCisgIFNpbWlsYXIgdG8gdGhlIERTQSBmdW5jdGlvbnMsIGJ1dCB0aGV5IGp1c3Qgc3RvcmUgcG9pbnRlcnMuIFRoZXkgYXJlIHVzZWQgYnkKKyAgRXhwbG9yZXIsIElFNCBhbmQgb3RoZXIgUHJvZ3JhbXMgYW5kIERMTCdzIHRoYXQgYXJlICJwYXJ0cyBvZiB0aGUgV2luZG93cworICBPcGVyYXRpbmcgU3lzdGVtIi4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb21wbGV0ZS4KIAogICBIYXZlIGEgbG9vayBhdCB0aGUgc291cmNlIGNvZGUgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uCi0gIEZ1cnRoZXIgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHdyaXR0ZW4uLi4KIAogCiA1LjMgIk1vc3QgUmVjZW50bHkgVXNlZCIgLSBMaXN0IChNUlUpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIEN1cnJlbnRseSBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUhCisgIFRoZSBmdW5jdGlvbiAnQ09NQ1RMMzJfMTU3KCknIGNvdWxkIGJlIGNhbGxlZCAnQ3JlYXRlTVJVTGlzdEV4MzJBKCknLgorICBPbmx5IHN0dWJzIGFyZSBpbXBsZW1lbnRlZCB0byBrZWVwIEV4cGxvcmVyIGZyb20gYmFpbGluZyBvdXQuCisKKyAgTm8gbW9yZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXQgdGhpcyB0aW1lIQogCiAKIDUuNCBNZW51SGVscApAQCAtMzUzLDYgKzM1OSwxNCBAQAogICAuLi4KIAogCis1LjcgT3RoZXIgdW5kb2N1bWVudGVkIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU2V2ZXJhbCBvdGhlciB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IElFNC4KKworICBDT01DVEwzMl8xMSwgQ09NQ1RMXzM4NSwgQ09NQ1RMMzJfMzg2IGFuZCBDT01DVEwzMl8zODguCisgIFRoZWlyIHN0dWJzIGFyZSBpbXBsZW1lbnRlZCB0byBrZWVwIElFNCBmcm9tIGJhaWxpbmcgb3V0LgorCisKIDYuIEVwaWxvZ3VlCiAtLS0tLS0tLS0tLQogICBZb3Ugc2VlLCBtdWNoIHdvcmsgaGFzIHN0aWxsIHRvIGJlIGRvbmUuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB3cml0aW5nCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2RlYnVnZ2luZyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCmluZGV4IGI5MjljOGYuLjc4N2MzZDMgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCisrKyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCkBAIC0xLDYgKzEsMzcgQEAKIFRoaXMgZmlsZSBkZXNjcmliZXMgd2hlcmUgdG8gc3RhcnQgZGVidWdnaW5nIFdpbmUgYW5kIGhvdyB0byB3cml0ZQogdXNlZnVsIGJ1ZyByZXBvcnRzLgogCitUbyBhdm9pZCBkZWJ1Z2dpbmcKKz09PT09PT09PT09PT09PT09PQorCitTb21ldGltZXMgeW91IGNhbiBicmluZyBhcHBsaWNhdGlvbnMgdG8gcnVuIGJ5IHVzaW5nIHNvbWUgb2YgdGhlCituYXRpdmUgV2luZG93cyBETEwncywgdG9nZXRoZXIgd2l0aCBXaW5lLiBIZXJlIGFyZSBzb21lIFRpcHMgYnkKK0p1ZXJnZW4gU2NobWllZCBvbiBob3cgdG8gcHJvY2VlZC4gVGhpcyBhc3N1bWVzIHRoYXQgeW91ciBDOlx3aW5kb3dzCitkaXJlY3RvcnkgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIG5vdCBwb2ludCB0byBhIG5hdGl2ZSBXaW5kb3dzCitpbnN0YWxsYXRpb24gYnV0IGlzIGluIGEgc2VwYXJhdGUgVW5peCBmaWxlIHN5c3RlbS4gKEZvciBpbnN0YW5jZSwKK0M6XHdpbmRvd3MgaXMgcmVhbGx5IC9ob21lL2Vnby93aW5lL2RyaXZlcy9jKS4KKworLSBDcmVhdGUgZW1wdHkgQzpcd2luZG93cyBhbmQgQzpcd2luZG93c1xzeXN0ZW0gZGlyZWN0b3JpZXMuCisgIERvIG5vdCBwb2ludCBXaW5lIHRvIGEgV2luZG93cyBkaXJlY3RvcnkgZnVsbCBvZiBvbGQgaW5zdGFsbGF0aW9ucworICBhbmQgYSBtZXNzeSByZWdpc3RyeS4gKFdpbmUgY3JlYXRlcyBhIHNwZWNpYWwgcmVnaXN0cnkgaW4geW91ciBob21lCisgIGRpcmVjdG9yeSwgaW4gJEhPTUUvLndpbmUvKi5yZWcuIFBlcmhhcHMgeW91IGhhdmUgdG8gcmVtb3ZlIHRoZXNlCisgIGZpbGVzKS4KKy0gUnVuIHRoZSBhcHBsaWNhdGlvbiB3aXRoICAgLWRlYnVnbXNnICttb2R1bGUsK2ZpbGUgICB0byBmaW5kIG91dAorICB3aGljaCBmaWxlcyBhcmUgbmVlZGVkLiBDb3B5IHRoZSByZXF1aXJlZCBETEwncyBvbmUgYnkgb25lIHRvIHRoZQorICBDOlx3aW5kb3dzXHN5c3RlbSBkaXJlY3RvcnkuCistIE5vdGUgdGhhdCBzb21lIG5ldHdvcmsgRExMJ3MgYXJlIG5vdCBuZWVkZWQgZXZlbiB0aG91Z2ggV2luZSBpcworICBsb29raW5nIGZvciB0aGVtLiBEbyBub3QgY29weSB0aGUgTVBSLkRMTCBpbnRvIHRoZSBkaXJlY3RvcnksCisgIHVzZSB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uCistIENvcHkgU0hFTEwvU0hFTEwzMiBhbmQgQ09NRExHL0NPTURMRzMyIENPTU1DVFJML0NPTUNUTDMyCisgIG9ubHkgYXMgcGFpcnMgdG8geW91ciBXaW5lIGRpcmVjdG9yeSAodGhlc2UgRExMJ3MgYXJlCisgICJjbGVhbiIgdG8gdXNlKQorLSBCZSBjb25zaXN0ZW50OiBVc2Ugb25seSBETExTIGZyb20gdGhlIHNhbWUgV2luZG93cyB2ZXJzaW9uCisgIHRvZ2V0aGVyLgorLSBQdXQgcmVnZWRpdC5leGUgaW4gdGhlIEM6XHdpbmRvd3MgZGlyZWN0b3J5IChvZmZpY2U5NSBpbXBvcnRzCisgIGEgKi5yZWcgZmlsZSB3aGVuIGl0IHJ1bnMgd2l0aCBhIGVtcHR5IHJlZ2lzdHJ5LCBkb24ndCBrbm93CisgIGFib3V0IG9mZmljZTk3KS4KKworCiBDcmFzaGVzCiA9PT09PT09CiAKQEAgLTMzNiwzICszNjcsMzAgQEAKIAogcGVkdW1wOiBodHRwOi8vb2FrLm9ha2xhbmQuZWR1L3B1Yi9zaW10ZWxuZXQvd2luOTUvcHJvZy9wZWR1bXAuemlwCiBEdW1wcyB0aGUgaW1wb3J0cyBhbmQgZXhwb3J0cyBvZiBhIFBFIChQb3J0YWJsZSBFeGVjdXRhYmxlKSBETEwuCisKKworU29tZSBiYXNpYyBkZWJ1Z2dlciB1c2FnZXM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQWZ0ZXIgc3RhcnRpbmcgeW91IHByb2dyYW0gd2l0aAorICB3aW5lIC1kZWJ1ZyBteXByb2cuZXhlCit0aGUgcHJvZ3JhbSBsb2FkcyBhbmQgeW91IGdldCBhIHByb21wdCBhdCB0aGUgcHJvZ3JhbSBzdGFydGluZyBwb2ludC4KK1RoZW4geW91IGNhbiBzZXQgYnJlYWtwb2ludHM6CisgIGIgUm91dGluZU5hbWUgICAgICAoYnkgb3V0aW5lIG5hbWUpIE9SCisgIGIgKjB4ODEyNTc1ICAgICAgICAoYnkgYWRkcmVzcykKK1RoZW4geW91IGhpdCAnYycgKGNvbnRpbnVlKSB0byBydW4gdGhlIHByb2dyYW0uIEl0IHN0b3BzIGF0Cit0aGUgYnJlYWtwb2ludC4gWW91IGNhbiB0eXBlCisgIHN0ZXAgICAgICAgICAgICAgICAodG8gc3RlcCBvbmUgbGluZSkgT1IKKyAgc3RlcGkgICAgICAgICAgICAgICh0byBzdGVwIG9uZSBtYWNoaW5lIGluc3RydWN0aW9uIGF0IGEgdGltZTsKKyAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBpdCBoZWxwcyB0byBrbm93IHRoZSBiYXNpYyAzODYKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiBzZXQpCisgIGluZm8gcmVnICAgICAgICAgICAodG8gc2VlIHJlZ2lzdGVycykKKyAgaW5mbyBzdGFjayAgICAgICAgICh0byBzZWUgaGV4IHZhbHVlcyBpbiB0aGUgc3RhY2spCisgIGluZm8gbG9jYWwgICAgICAgICAodG8gc2VlIGxvY2FsIHZhcmlhYmxlcykKKyAgbGlzdCA8bGluZSBudW1iZXI+ICh0byBsaXN0IHNvdXJjZSBjb2RlKQorICB4IDx2YXJpYWJsZSBuYW1lPiAgKHRvIGV4YW1pbmUgYSB2YXJpYWJsZTsgb25seSB3b3JrcyBpZiBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uKQorICB4IDB4NDI2OTk3OCAgICAgICAgKHRvIGV4YW1pbmUgYSBtZW1vcnkgbG9jYXRpb24pCisgID8gICAgICAgICAgICAgICAgICAoaGVscCkKKyAgcSAgICAgICAgICAgICAgICAgIChxdWl0KQorQnkgaGl0dGluZyBFbnRlciwgeW91IHJlcGVhdCB0aGUgbGFzdCBjb21tYW5kLgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9zdGF0dXMvZGlyZWN0cGxheSBiL2RvY3VtZW50YXRpb24vc3RhdHVzL2RpcmVjdHBsYXkKaW5kZXggNjljODU5YS4uNmU3ZjFlOSAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9zdGF0dXMvZGlyZWN0cGxheQorKysgYi9kb2N1bWVudGF0aW9uL3N0YXR1cy9kaXJlY3RwbGF5CkBAIC01LDEzICs1LDE4IEBACiB0byBzZWUgd2hhdCBoYXMgYmVlbiBpbXBsZW1lbnRlZC4gIFN0YXkgdHVuZWQgZm9yIHNvbWUgaW5mb3JtYXRpb24gaGVyZSBvbmNlCiB0aGVyZSBpcyBtb3JlIGltcGxlbWVudGF0aW9uIChhbmQgSSBmaWd1cmUgb3V0IHdoYXQgdGhlIGhlY2sgSSdtIGRvaW5nKS4KIAotVGhlIGZpbGVzIGFyZSBpbmNsdWRlL2RwbGF5LmggYW5kIG11bHRpbWVkaWEvZHBsYXkuYy4KK1RoZSBmaWxlcyBhcmUgaW5jbHVkZS9kcGxheS5oIGFuZCBtdWx0aW1lZGlhL2RwbGF5LmMuIFRoZXkncmUgZ2V0dGluZyBhIAorbGl0dGxlIGN1bWJlcnNvbWUgYXQgcHJlc2VudCBwZXJoYXBzIHRoZXkgd2lsbCBiZSBicm9rZW4gb3V0IGluIGEgbGF0ZXIKK3ZlcnNpb24uCiAKIEkgdGhpbmsgSSBjYW4gc2FmZWx5IHNheSB0aGF0IGFueSBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBkaXJlY3QgcGxheQogb3IgZGlyZWN0IHBsYXkgbG9iYnkgd2lsbCBub3Qgd29yayBhdCB0aGlzIHBvaW50LiBQcmlvcml0eSB3aWxsIGJlIHRvIGdldAotbHNlcnZlci5leGUgYW5kIHN0YXIgd2FycyByZWJlbGxpb24gZ29pbmcgKGF0IGxlYXN0IHRoZSBkaXJlY3QgcGxheSBwb3J0aW9ucykuCitsc2VydmVyLmV4ZSBmcm9tIHRoZSBzZGsgcnVubmluZy4KIAogCiAKIFRPRE86Ci0gIEp1c3QgYWJvdXQgZXZlcnl0aGluZworICAtIEp1c3QgYWJvdXQgZXZlcnl0aGluZworCisKK1BldGVyIEh1bm5pc2V0dCAgLSAgaHVubmlzZUBub3J0ZWwuY2EKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vc3RhdHVzL211bHRpbWVkaWEgYi9kb2N1bWVudGF0aW9uL3N0YXR1cy9tdWx0aW1lZGlhCmluZGV4IDA0YWZjYTkuLmQ0NWM2MTEgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vc3RhdHVzL211bHRpbWVkaWEKKysrIGIvZG9jdW1lbnRhdGlvbi9zdGF0dXMvbXVsdGltZWRpYQpAQCAtNTcsMTQgKzU3LDIzIEBACiAgICBUaGV5IGNhbGwgdGhlIGxvd2xldmVsIGRyaXZlciBmdW5jdGlvbnMgaW4gbXVsdGltZWRpYS9taWRpLmMgdXNpbmcgdGhlCiAgICBtaWRNZXNzYWdlIGFuZCB0aGUgbW9kTWVzc2FnZSBmdW5jdGlvbnMuCiAKLSAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGNvbXBsZXRlbHkgYnJva2VuLiAoSSB0aGluayBvcGVuKCksIHJlYWQoKQotICAgYW5kIHdyaXRlKCkgb2YgdGhlIC9kZXYvbWlkaSBkZXZpY2Ugd291bGQgbWFrZSB0aGlzIGltcGxlbWVudGF0aW9uIG5lYXJseQotICAgY29tcGxldGUuLi4pCisgICBUaGUgbG93bGV2ZWwgYXVkaW8gZHJpdmVyIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGZvciB0aGUKKyAgIE9wZW5Tb3VuZFN5c3RlbSAoT1NTKSBhcyBzdXBwbGllZCBpbiB0aGUgTGludXggYW5kIEZyZWVCU0Qga2VybmVscyBieQorICAgNEZyb250IFRlY2hub2xvZ2llcyAoaHR0cDovL3d3dy40ZnJvbnQtdGVjaC5jb20vKS4gVGhlIHByZXNlbmNlIG9mIHRoaXMKKyAgIGRyaXZlciBpcyBjaGVja2VkIGJ5IGNvbmZpZ3VyZSAoZGVwZW5kcyBvbiB0aGUgPHN5cy9zb3VuZGNhcmQuaD4gZmlsZSkuCisgICBCb3RoIE1pZGkgaW4gYW5kIE1pZGkgb3V0IGFyZSBwcm92aWRlZC4gVGhlIHR5cGUgb2YgTUlESSBkZXZpY2VzIHN1cHBvcnRlZAorICAgaXMgZXh0ZXJuYWwgTUlESSBwb3J0IChyZXF1aXJlcyBhbiBNSURJIGNhcGFibGUgZGV2aWNlIC0ga2V5Ym9hcmQuLi4pIGFuZAorICAgT1BMLzIgc3ludGhlc2lzICh0aGUgT1BMLzJwYXRjaGVzIGZvciBhbGwgaW5zdHJ1bWVudHMgYXJlIGluIG1pZGlQYXRjaC5jKS4KIAogICAgVE9ETzoKLSAgIAktIEltcGxlbWVudCBjb3JyZWN0IE1JREkgb3V0cHV0CiAJLSBEbyBub3QgaW1wbGVtZW50IGEgc29mdHdhcmUgc3ludGhlc2l6ZXIuIFRoaXMgc2hvdWxkIGJlIGRvbmUKIAkgIHVzaW5nIE1JREkgbG9vcGJhY2sgZGV2aWNlcyBpbiBhbiBleHRlcm5hbCBwcm9ncmFtIChsaWtlIHRpbWlkaXR5KS4KKwkgIHRoZSBvbmx5IHRyb3VibGUgaXMgdGhhdCB0aW1pZGl0eSBpcyBHUEwnZWQuLi4KKyAgICAgICAgLSB1c2UgYmV0dGVyIGluc3RydW1lbnQgZGVmaW5pdGlvbiBmb3IgT1BMLzIgKG1pZGlQYXRjaC5jKQorICAgICAgICAtIGhhdmUgYSBsb29rIGF0IE9QTC8zID8KKwktIGEgaGFjayBpcyB1c2VkIGluIG1tc3lzdGVtLmMgKHNldHRpbmcgcmVzZXJ2ZWQgdG8gdGhlIDMyIGJpdCBsaW5lYXIKKwkgIGFkZHJlc3Mgb2YgdGhlIGJsb2NrIHdoYXRldmVyIHRoZSBjYWxsIGlzIG1hZGUgZnJvbSAxNiBvciAzMiBiaXRzIAorCSAgY29kZS4uLikuIHRoaXMgc2hvdWxkIGJlIGluIG1pZGkuYyBJIHRoaW5rCiAKIDEuNCBUaW1lcnMKIApkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi93aW45NWxvb2sgYi9kb2N1bWVudGF0aW9uL3dpbjk1bG9vawppbmRleCBkZGFiMDVhLi5lZDg3ZjY4IDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL3dpbjk1bG9vaworKysgYi9kb2N1bWVudGF0aW9uL3dpbjk1bG9vawpAQCAtMSw4ICsxLDggQEAKLVdpbjk1IGludGVyZmFjZSBjb2RlIGlzIGJlaW5nIGludHJvZHVjZWQuCitXaW45NS9XaW45OCBpbnRlcmZhY2UgY29kZSBpcyBiZWluZyBpbnRyb2R1Y2VkLgogCiBJbnN0ZWFkIG9mIGNvbXBpbGluZyBXaW5lIGZvciBXaW4zLjEgdnMuIFdpbjk1IHVzaW5nICNkZWZpbmUgc3dpdGNoZXMsCiB0aGUgY29kZSBub3cgbG9va3MgaW4gYSBzcGVjaWFsIFtUd2Vha3MuTGF5b3V0XSBzZWN0aW9uIG9mIHdpbmUuY29uZgotZm9yIGEgIldpbjk1TG9vaz10cnVlIiBlbnRyeS4KK2ZvciBhICJXaW5lTG9vaz1XaW45NSIgb3IgIldpbmVMb29rPVdpbjk4IiBlbnRyeS4KIAogQSBmZXcgbmV3IHNlY3Rpb25zIGFuZCBhIG51bWJlciBvZiBlbnRyaWVzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUKIHdpbmUuY29uZiBmaWxlIC0tIHRoZXNlIGFyZSBmb3IgZGVidWdnaW5nIHRoZSBXaW45NSB0d2Vha3Mgb25seSBhbmQgbWF5CkBAIC0yMCwxMyArMjAsNSBAQAogU3lzdGVtRml4ZWQueHh4ICAgICAgICAgICAgICAgIyBTYW1lIHBhcmFtZXRlcnMgZm9yIHRoZSBTeXN0ZW0gZml4ZWQgdHlwZWZhY2UKIAogW1R3ZWFrLkxheW91dF0KLVdpbjk1TG9vaz1bdHJ1ZXxmYWxzZV0gICAgICAgICMgRW5hYmxlcy9kaXNhYmxlcyB0aGUgV2luOTUgbG9vayBhbmQgZmVlbAotTWVudUJhckl0ZW1Ub3BOdWRnZT08cGl4ZWxzPiAgIyBOdWRnZXMgdGhlIG1lbnUgYmFyIGl0ZW1zIGRvd24vdXAKLU1lbnVCYXJJdGVtTGVmdE51ZGdlPTxwaXhlbHM+ICMgTnVkZ2VzIHRoZSBtZW51IGJhciBpdGVtcyBsZWZ0L3JpZ2h0Ci1NZW51SXRlbVRvcE51ZGdlPTxwaXhlbHM+ICAgICAjIE51ZGdlcyB0aGUgbWVudSBpdGVtcyBkb3duL3VwCi1NZW51SXRlbUxlZnROdWRnZT08cGl4ZWxzPiAgICAjIE51ZGdlcyB0aGUgbWVudSBpdGVtcyBsZWZ0L3JpZ2h0Ci1NZW51SGlnaGxpZ2h0VG9wTnVkZ2U9PHBpeGVscz4gIyBOdWRnZXMgdGhlIHRvcCBvZiB0aGUgaGlnaGxpZ2h0IGJhcgotTWVudUhpZ2hsaWdodExlZnROdWRnZT08cGl4ZWxzPiAjIE51ZGdlcyB0aGUgbGVmdCBzaWRlIG9mIHRoZSBoaWdobGlnaHQgYmFyCi1NZW51SGlnaGxpZ2h0UmlnaHROdWRnZT08cGl4ZWxzPiAjIE51ZGdlcyB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaGlnaGxpZ2h0IGJhcgotTWVudUhpZ2hsaWdodEJvdHRvbU51ZGdlPTxwaXhlbHM+ICMgTnVkZ2VzIHRoZSBib3R0b20gb2YgdGhlIGhpZ2hsaWdodCBiYXIKK1dpbmVMb29rPVtXaW4zMXxXaW45NXxXaW45OF0gICMgQ2hhbmdlcyBXaW5lJ3MgbG9vayBhbmQgZmVlbAogCmRpZmYgLS1naXQgYS9maWxlcy9kaXJlY3RvcnkuYyBiL2ZpbGVzL2RpcmVjdG9yeS5jCmluZGV4IGNkY2JhMDguLmRiYWFkOTAgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RpcmVjdG9yeS5jCisrKyBiL2ZpbGVzL2RpcmVjdG9yeS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCkBAIC03NiwxNiArNzcsMjAgQEAKICAgICAgICAgRFJJVkVfQ2hkaXIoIGRyaXZlLCBjd2QgKTsKICAgICB9CiAKLSAgICBpZiAoIShESVJfR2V0UGF0aCggIndpbmRvd3MiLCAiYzpcXHdpbmRvd3MiLCAmRElSX1dpbmRvd3MgKSkpCisgICAgaWYgKCEoRElSX0dldFBhdGgoICJ3aW5kb3dzIiwgImM6XFx3aW5kb3dzIiwgJkRJUl9XaW5kb3dzICkpIHx8CisJIShESVJfR2V0UGF0aCggInN5c3RlbSIsICJjOlxcd2luZG93c1xcc3lzdGVtIiwgJkRJUl9TeXN0ZW0gKSkgfHwKKwkhKERJUl9HZXRQYXRoKCAidGVtcCIsICJjOlxcd2luZG93cyIsICZ0bXBfZGlyICkpKQorICAgIHsKKwlQUk9GSUxFX1VzYWdlV2luZUluaSgpOwogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIShESVJfR2V0UGF0aCggInN5c3RlbSIsICJjOlxcd2luZG93c1xcc3lzdGVtIiwgJkRJUl9TeXN0ZW0gKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmICghKERJUl9HZXRQYXRoKCAidGVtcCIsICJjOlxcd2luZG93cyIsICZ0bXBfZGlyICkpKQotICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaWYgKC0xID09IGFjY2VzcyggdG1wX2Rpci5sb25nX25hbWUsIFdfT0sgKSkKICAgICB7CiAgICAgCWlmIChlcnJubz09RUFDQ0VTKQotCQlNU0coIldhcm5pbmc6IFRoZSBUZW1wb3JhcnkgRGlyZWN0b3J5IChhcyBzcGVjaWZpZWQgaW4gd2luZS5jb25mIG9yIH4vLndpbmVyYykgaXMgTk9UIHdyaXRlYWJsZS4gUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbi5cbiIpOworCXsKKwkJTVNHKCJXYXJuaW5nOiBUaGUgVGVtcG9yYXJ5IERpcmVjdG9yeSAoYXMgc3BlY2lmaWVkIGluIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlKSBpcyBOT1Qgd3JpdGVhYmxlLlxuIik7CisJCVBST0ZJTEVfVXNhZ2VXaW5lSW5pKCk7CisJfQogCWVsc2UKIAkJTVNHKCJXYXJuaW5nOiBBY2Nlc3MgdG8gVGVtcG9yYXJ5IERpcmVjdG9yeSBmYWlsZWQgKCVzKS5cbiIsCiAJCSAgICBzdHJlcnJvcihlcnJubykpOwpAQCAtMTA0LDYgKzEwOSw3IEBACiAgICAgLyogU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KIAogICAgIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEoICJQQVRIIiwgcGF0aCApOworICAgIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEoICJDT01TUEVDIiwgImM6XFxjb21tYW5kLmNvbSIgKTsKICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKCAiVEVNUCIsIHRtcF9kaXIuc2hvcnRfbmFtZSApOwogICAgIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEoICJ3aW5kaXIiLCBESVJfV2luZG93cy5zaG9ydF9uYW1lICk7CiAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggIndpbnN5c2RpciIsIERJUl9TeXN0ZW0uc2hvcnRfbmFtZSApOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZG9zX2ZzLmMgYi9maWxlcy9kb3NfZnMuYwppbmRleCBmNjYyZWFjLi4xNDgxNDI5IDEwMDY0NAotLS0gYS9maWxlcy9kb3NfZnMuYworKysgYi9maWxlcy9kb3NfZnMuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggMGZhMDhjNS4uMzU5Y2FhNSAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC03NjksMTMgKzc2OSw0MyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXREcml2ZVR5cGUzMkEgICAoS0VSTkVMMzIuMjA4KQorICoKKyAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRpc2sgZHJpdmUgc3BlY2lmaWVkLiAgSWYgcm9vdCBpcyBOVUxMIHRoZQorICogcm9vdCBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgdXNlZC4KKyAqCisgKiBSRVRVUk5TCisgKgorICogIFR5cGUgb2YgZHJpdmUgKGZyb20gV2luMzIgU0RLKToKKyAqCisgKiAgIERSSVZFX1VOS05PV04gICAgIHVuYWJsZSB0byBmaW5kIG91dCBhbnl0aGluZyBhYm91dCB0aGUgZHJpdmUKKyAqICAgRFJJVkVfTk9fUk9PVF9ESVIgbm9uZXhpc3RhbmQgcm9vdCBkaXIKKyAqICAgRFJJVkVfUkVNT1ZBQkxFICAgdGhlIGRpc2sgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFjaGluZQorICogICBEUklWRV9GSVhFRCAgICAgICB0aGUgZGlzayBjYW4gbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFjaGluZQorICogICBEUklWRV9SRU1PVEUgICAgICBuZXR3b3JrIGRpc2sKKyAqICAgRFJJVkVfQ0RST00gICAgICAgQ0RST00gZHJpdmUKKyAqICAgRFJJVkVfUkFNRElTSyAgICAgdmlydHVhbCBkaXNrIGluIHJhbQorICoKKyAqICAgRFJJVkVfRE9FU05PVEVYSVNUIFhYWCBOb3QgdmFsaWQgcmV0dXJuIHZhbHVlCisgKiAgIAorICogQlVHUworICoKKyAqICBDdXJyZW50bHkgcmV0dXJucyBEUklWRV9ET0VTTk9URVhJU1Qgd2hlbiBpdCByZWFsbHkgc2hvdWxkIHJldHVybgorICogIERSSVZFX1VOS05PV04gb3IgRFJJVkVfTk9fUk9PVF9ESVIuICBEUklWRV9SQU1ESVNLIGlzIHVuc3VwcG9ydGVkLgorICogIFNob3VsZCBkZXRlcm1pbmUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHVzZSB0aGF0IHJvb3QgaWYgcGFyYW0gaXMKKyAqICBOVUxMLgogICovCi1VSU5UMzIgV0lOQVBJIEdldERyaXZlVHlwZTMyQSggTFBDU1RSIHJvb3QgKQorVUlOVDMyIFdJTkFQSSBHZXREcml2ZVR5cGUzMkEoTFBDU1RSIHJvb3QgLyogU3RyaW5nIGRlc2NyaWJpbmcgZHJpdmUgKi8pCiB7Ci0gICAgVFJBQ0UoZG9zZnMsICIoJXMpXG4iLCByb290ICk7CisgICAgVFJBQ0UoZG9zZnMsICIoJXMpXG4iLCBOVUxMICE9IHJvb3QgPyByb290IDogIk5VTEwiKTsKKyAgICBpZiAoTlVMTCA9PSByb290KQorICAgIHsKKwlGSVhNRShkb3NmcywiKE5VTEwpIHNob3VsZCB1c2UgY3VycmVudCBkaXIsIGhhcmRjb2RlZCBjOiBpbnN0ZWFkXG4iKTsKKyAgICAgICAgcm9vdCA9ICJDOiI7CisgICAgfQorCiAgICAgaWYgKChyb290WzFdKSAmJiAocm9vdFsxXSAhPSAnOicpKQogICAgIHsKLSAgICAgICAgV0FSTihkb3NmcywgImludmFsaWQgcm9vdCAnJXMnXG4iLCByb290ICk7CisgICAgICAgIFdBUk4oZG9zZnMsICJpbnZhbGlkIHJvb3QgJyVzJ1xuIiwgTlVMTCAhPSByb290ID8gcm9vdCA6ICJOVUxMIik7CiAgICAgICAgIHJldHVybiBEUklWRV9ET0VTTk9URVhJU1Q7CiAgICAgfQogICAgIHN3aXRjaChEUklWRV9HZXRUeXBlKHRvdXBwZXIocm9vdFswXSkgLSAnQScpKQpkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IDIwNWM2MzAuLjQ2YjU1YzMgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTExOSw2ICsxMTksNyBAQAogICAgICAgICAgICAgRklMRV9TZXREb3NFcnJvcigpOwogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCX0KKwlmaWxlLT5wb3MgKz0gcmVzdWx0OwogCSpscE51bWJlck9mQ2hhcnMgPSByZXN1bHQ7CiAJcmV0dXJuIFRSVUU7CiB9CkBAIC0xNTYsNyArMTU3LDggQEAKIAkJcmVzdWx0ID0gd3JpdGUoZmlsZS0+dW5peF9oYW5kbGUsIGxwQnVmZmVyLCBuTnVtYmVyT2ZDaGFycyk7CiAJCWlmIChyZXN1bHQgIT0gLTEpIHsKIAkJCSpscE51bWJlck9mQ2hhcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKwkJCWZpbGUtPnBvcyArPSByZXN1bHQ7CisJCQlyZXR1cm4gVFJVRTsKIAkJfQogCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKIAkJCUZJTEVfU2V0RG9zRXJyb3IoKTsKZGlmZiAtLWdpdCBhL2ZpbGVzL3Byb2ZpbGUuYyBiL2ZpbGVzL3Byb2ZpbGUuYwppbmRleCBlOTIxNTEzLi42NmYxZDMxIDEwMDY0NAotLS0gYS9maWxlcy9wcm9maWxlLmMKKysrIGIvZmlsZXMvcHJvZmlsZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnUFJPRklMRUtFWQogewpAQCAtNTcsNiArNTgsOSBAQAogLyogV2luZSBwcm9maWxlIG5hbWUgaW4gJEhPTUUgZGlyZWN0b3J5OyBtdXN0IGJlZ2luIHdpdGggc2xhc2ggKi8KIHN0YXRpYyBjb25zdCBjaGFyIFBST0ZJTEVfV2luZUluaU5hbWVbXSA9ICIvLndpbmVyYyI7CiAKKy8qIFdpbmUgcHJvZmlsZTogdGhlIHByb2ZpbGUgZmlsZSBiZWluZyB1c2VkICovCitzdGF0aWMgY2hhciBQUk9GSUxFX1dpbmVJbmlVc2VkW01BWF9QQVRITkFNRV9MRU5dID0gIiI7CisKIC8qIENoZWNrIGZvciBjb21tZW50cyBpbiBwcm9maWxlICovCiAjZGVmaW5lIElTX0VOVFJZX0NPTU1FTlQoc3RyKSAgKChzdHIpWzBdID09ICc7JykKIApAQCAtODI0LDEwICs4MjgsMjAgQEAKICAgICBjb25zdCBjaGFyICpwOwogICAgIEZJTEUgKmY7CiAKKyAgICBpZiAoIChPcHRpb25zLmNvbmZpZ0ZpbGVOYW1lIT1OVUxMKSAmJiAoZiA9IGZvcGVuKE9wdGlvbnMuY29uZmlnRmlsZU5hbWUsICJyIikpICkKKyAgICB7CisgICAgICAvKiBPcGVuIC1jb25maWcgc3BlY2lmaWVkIGZpbGUgKi8KKyAgICAgIFdpbmVQcm9maWxlID0gUFJPRklMRV9Mb2FkICggZik7CisgICAgICBmY2xvc2UgKCBmICk7CisgICAgICBzdHJuY3B5KFBST0ZJTEVfV2luZUluaVVzZWQsT3B0aW9ucy5jb25maWdGaWxlTmFtZSxNQVhfUEFUSE5BTUVfTEVOLTEpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCiAgICAgaWYgKCAocCA9IGdldGVudiggIldJTkVfSU5JIiApKSAmJiAoZiA9IGZvcGVuKCBwLCAiciIgKSkgKQogICAgICAgewogCVdpbmVQcm9maWxlID0gUFJPRklMRV9Mb2FkKCBmICk7CiAJZmNsb3NlKCBmICk7CisJc3RybmNweShQUk9GSUxFX1dpbmVJbmlVc2VkLHAsTUFYX1BBVEhOQU1FX0xFTi0xKTsKIAlyZXR1cm4gMTsKICAgICAgIH0KICAgICBpZiAoKHAgPSBnZXRlbnYoICJIT01FIiApKSAhPSBOVUxMKQpAQCAtODM4LDYgKzg1Miw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFdpbmVQcm9maWxlID0gUFJPRklMRV9Mb2FkKCBmICk7CiAgICAgICAgICAgICBmY2xvc2UoIGYgKTsKKwkgICAgc3RybmNweShQUk9GSUxFX1dpbmVJbmlVc2VkLGJ1ZmZlcixNQVhfUEFUSE5BTUVfTEVOLTEpOwogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KICAgICB9CkBAIC04NDksNiArODY0LDcgQEAKICAgICB7CiAgICAgICAgIFdpbmVQcm9maWxlID0gUFJPRklMRV9Mb2FkKCBmICk7CiAgICAgICAgIGZjbG9zZSggZiApOworCXN0cm5jcHkoUFJPRklMRV9XaW5lSW5pVXNlZCxXSU5FX0lOSV9HTE9CQUwsTUFYX1BBVEhOQU1FX0xFTi0xKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIE1TRyggIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlICVzIG9yICRIT01FJXNcbiIsCkBAIC04NTgsNiArODc0LDI2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUFJPRklMRV9Vc2FnZVdpbmVJbmkKKyAqCisgKiBFeHBsYWluIHRoZSB3aW5lLmluaSBmaWxlIHRvIHRob3NlIHdobyBkb24ndCByZWFkIGRvY3VtZW50YXRpb24uCisgKiBLZWVwIGJlbG93IG9uZSBzY3JlZW5mdWwgaW4gbGVuZ3RoIHNvIHRoYXQgZXJyb3IgbWVzc2FnZXMgYWJvdmUgYXJlCisgKiBub3RpY2VkLgorICovCit2b2lkIFBST0ZJTEVfVXNhZ2VXaW5lSW5pKHZvaWQpCit7CisgICAgTVNHKCJQZXJoYXBzIHlvdSBoYXZlIG5vdCBwcm9wZXJseSBlZGl0ZWQgb3IgY3JlYXRlZCAiCisJInlvdXIgV2luZSBjb25maWd1cmF0aW9uIGZpbGUuXG4iKTsKKyAgICBNU0coIlRoaXMgaXMgZWl0aGVyICVzIG9yICRIT01FJXNcbiIsV0lORV9JTklfR0xPQkFMLFBST0ZJTEVfV2luZUluaU5hbWUpOworICAgIE1TRygiICBvciBpdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSAtY29uZmlnIG9wdGlvbiBvciBmcm9tXG4iCisgICAgICAgICIgIHRoZSBXSU5FX0lOSSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiIpOworICAgIGlmICgqUFJPRklMRV9XaW5lSW5pVXNlZCkKKwlNU0coIldpbmUgaGFzIHVzZWQgJXMgYXMgY29uZmlndXJhdGlvbiBmaWxlLlxuIiwgUFJPRklMRV9XaW5lSW5pVXNlZCk7CisgICAgLyogUlRGTSwgc28gdG8gc2F5ICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUFJPRklMRV9HZXRTdHJpbmdJdGVtCiAgKgogICogIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgdHVybnMgYSBzdHJpbmcgJ3h4eCwgeXl5LCB6enonIGludG8gCmRpZmYgLS1naXQgYS9ncmFwaGljcy9kZHJhdy5jIGIvZ3JhcGhpY3MvZGRyYXcuYwppbmRleCAzZTAwNzQyLi43NjcwODMyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9kZHJhdy5jCisrKyBiL2dyYXBoaWNzL2RkcmF3LmMKQEAgLTE4LDYgKzE4LDkgQEAKICAqCSAgcnVubmluZyBYIGNsaWVudHMsIGV2ZW4gdGhvdWdoIEkgYW0gcG9sbGluZyBYIGV2ZW50cyBhbmQgYW5zd2VyaW5nCiAgKgkgIHRoZW0uIEJ1dCB5b3UgY2FuIHN3aXRjaCB0byBhbm90aGVyIGNvbnNvbGUgKGN0cmwtYWx0LWZ4KSBhbmQKICAqCSAgImtpbGxhbGwgd2luZSIgcHJvY2Vzc2VzLiBBbnkgaGVscCBvbiB0aGlzIG9uZSBhcHByZWNpYXRlZC4gLU1hcmN1cworICogICAgICAgIE5PVEU6IFRoZSBoYW5naW5nIG9ubHkgc2VlbXMgdG8gaGFwcGVuIHdpdGggLW1hbmFnZWQuIEkgaGF2ZSAKKyAqICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBzdXBwb3J0IGZvciB0aGUgLWRlc2t0b3Agb3B0aW9uLiBUaGlzIHNlZW1zCisgKiAgICAgICAgICAgICAgdG8gbm90IGhhdmUgdGhlIGhhbmdpbmcgcHJvYmxlbXMuIC0gUGV0ZXIgSHVubmlzZXR0CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgpAQCAtMzU5LDggKzM2MiwxMiBAQAogCVhsaWJfTWVzc2FnZVB1bXAodGhpcy0+cy5kZHJhdy0+ZS54bGliLndpbmRvdyk7CiAKIAlUUkFDRShkZHJhdywiKCVwKS0+VW5sb2NrKCVwKVxuIix0aGlzLHN1cmZhY2UpOworCiAJaWYgKCF0aGlzLT5zLmRkcmF3LT5lLnhsaWIucGFpbnRhYmxlKQotCQlyZXR1cm4gMDsKKyAgICAgICAgeworCQlyZXR1cm4gRERfT0s7CisgICAgICAgIH0KKwogCVRTWFB1dEltYWdlKAkJZGlzcGxheSwKIAkJCQl0aGlzLT5zLmRkcmF3LT5lLnhsaWIuZHJhd2FibGUsCiAJCQkJRGVmYXVsdEdDT2ZTY3JlZW4oc2NyZWVuKSwKQEAgLTM3MCw3ICszNzcsOCBAQAogCQkJCXRoaXMtPnQueGxpYi5pbWFnZS0+aGVpZ2h0CiAJKTsKIAlUU1hTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LHRoaXMtPnMuZGRyYXctPmUueGxpYi5kcmF3YWJsZSx0aGlzLT5zLnBhbGV0dGUtPmNtKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBERF9PSzsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhd1N1cmZhY2UzX0ZsaXAoCkBAIC00MjMsNiArNDMxLDcgQEAKIAkJZWxzZQogCQkJZmxpcHRvID0gdGhpczsKIAl9CisgIAogCVRTWFB1dEltYWdlKGRpc3BsYXksCiAJCQkJdGhpcy0+cy5kZHJhdy0+ZS54bGliLmRyYXdhYmxlLAogCQkJCURlZmF1bHRHQ09mU2NyZWVuKHNjcmVlbiksCkBAIC00NDQsMTEgKzQ1Myw0OSBAQAogCXJldHVybiAwOwogfQogCisvKiBUaGUgSURpcmVjdERyYXdTdXJmYWNlMzo6U2V0UGFsZXR0ZSBtZXRob2QgYXR0YWNoZXMgdGhlIHNwZWNpZmllZAorICogRGlyZWN0RHJhd1BhbGV0dGUgb2JqZWN0IHRvIGEgc3VyZmFjZS4gVGhlIHN1cmZhY2UgdXNlcyB0aGlzIHBhbGV0dGUgZm9yIGFsbAorICogc3Vic2VxdWVudCBvcGVyYXRpb25zLiBUaGUgcGFsZXR0ZSBjaGFuZ2UgdGFrZXMgcGxhY2UgaW1tZWRpYXRlbHkuCisgKi8KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UzX1NldFBhbGV0dGUoCiAJTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcyxMUERJUkVDVERSQVdQQUxFVFRFIHBhbAogKSB7CiAJVFJBQ0UoZGRyYXcsIiglcCktPlNldFBhbGV0dGUoJXApXG4iLHRoaXMscGFsKTsKLQl0aGlzLT5zLnBhbGV0dGUgPSBwYWw7IC8qIHByb2JhYmx5IGFkZHJlZiBpdCB0b28gKi8KKworICAgICAgICAvKiBBY2NvcmRpbmcgdG8gc3BlYywgd2UgYXJlIG9ubHkgc3VwcG9zZWQgdG8gCisgICAgICAgICAqIEFkZFJlZiBpZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBwYWxldHRlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoIHRoaXMtPnMucGFsZXR0ZSAhPSBwYWwgKQorICAgICAgICB7CisgICAgICAgICAgaWYoIHBhbCAhPSBOVUxMICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwYWwtPmxwdnRibC0+Zm5BZGRSZWYoIHBhbCApOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiggdGhpcy0+cy5wYWxldHRlICE9IE5VTEwgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnMucGFsZXR0ZS0+bHB2dGJsLT5mblJlbGVhc2UoIHRoaXMtPnMucGFsZXR0ZSApOworICAgICAgICAgIH0KKwkgIHRoaXMtPnMucGFsZXR0ZSA9IHBhbDsgCisKKyAgICAgICAgICAvKiBJIHRoaW5rIHRoYXQgd2UgbmVlZCB0byBhdHRhY2ggaXQgdG8gYWxsIGJhY2tidWZmZXJzLi4uKi8KKyAgICAgICAgICBpZiggdGhpcy0+cy5iYWNrYnVmZmVyICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgaWYoIHRoaXMtPnMuYmFja2J1ZmZlci0+cy5wYWxldHRlICkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0aGlzLT5zLmJhY2tidWZmZXItPnMucGFsZXR0ZS0+bHB2dGJsLT5mblJlbGVhc2UoCisgICAgICAgICAgICAgICAgIHRoaXMtPnMuYmFja2J1ZmZlci0+cy5wYWxldHRlICk7CisgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICB0aGlzLT5zLmJhY2tidWZmZXItPnMucGFsZXR0ZSA9IHBhbDsKKyAgICAgICAgICAgICBpZiggcGFsICkKKyAgICAgICAgICAgICB7IAkKKyAgICAgICAgICAgICAgICBwYWwtPmxwdnRibC0+Zm5BZGRSZWYoIHBhbCApOworICAgICAgICAgICAgIH0gCisgICAgICAgICAgIH0KKyAgICAgIAorICAgICAgICAgIC8qIFBlcmZvcm0gdGhlIHJlZnJlc2ggKi8KKyAgICAgICAgICBUU1hTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LHRoaXMtPnMuZGRyYXctPmUueGxpYi5kcmF3YWJsZSx0aGlzLT5zLnBhbGV0dGUtPmNtKTsKKyAgICAgICAgfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4MywxMiArNjMwLDE0IEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19BZGRSZWYoTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcykgewotCVRSQUNFKGRkcmF3LCIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKyAgICAgICAgVFJBQ0UoIGRkcmF3LCAiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgdGhpcywgdGhpcy0+cmVmICk7CisKIAlyZXR1cm4gKysodGhpcy0+cmVmKTsKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBER0FfSURpcmVjdERyYXdTdXJmYWNlM19SZWxlYXNlKExQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMpIHsKLQlUUkFDRShkZHJhdywiKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworICAgICAgICBUUkFDRSggZGRyYXcsICIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCB0aGlzLCB0aGlzLT5yZWYgKTsKKwogI2lmZGVmIEhBVkVfTElCWFhGODZER0EKIAlpZiAoIS0tKHRoaXMtPnJlZikpIHsKIAkJdGhpcy0+cy5kZHJhdy0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cy5kZHJhdyk7CkBAIC02MDYsMTMgKzY1NSwyMyBAQAogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdTdXJmYWNlM19SZWxlYXNlKExQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMpIHsKLQlUUkFDRShkZHJhdywiKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworICAgICAgICBUUkFDRSggZGRyYXcsICIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCB0aGlzLCB0aGlzLT5yZWYgKTsKKwogCWlmICghLS0odGhpcy0+cmVmKSkgewogCQl0aGlzLT5zLmRkcmF3LT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5zLmRkcmF3KTsKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMtPnMuc3VyZmFjZSk7CisKKyAgICAgICAgICAgICAgICBpZiggdGhpcy0+cy5iYWNrYnVmZmVyICkKKyAJCXsKKwkJICB0aGlzLT5zLmJhY2tidWZmZXItPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPnMuYmFja2J1ZmZlcik7CisgCQl9CisKIAkJdGhpcy0+dC54bGliLmltYWdlLT5kYXRhID0gTlVMTDsKIAkJVFNYRGVzdHJveUltYWdlKHRoaXMtPnQueGxpYi5pbWFnZSk7CiAJCXRoaXMtPnQueGxpYi5pbWFnZSA9IDA7CisKKyAgICAgICAgICAgICAgICB0aGlzLT5zLnBhbGV0dGUtPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPnMucGFsZXR0ZSk7CisKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC02MjQsMTYgKzY4MywyNSBAQAogKSB7CiAgICAgICAgIFRSQUNFKGRkcmF3LCAiKCVwKS0+R2V0QXR0YWNoZWRTdXJmYWNlKCVwLCVwKVxuIiwKIAkJICAgICB0aGlzLCBscGRkc2QsIGxwZHNmKTsKKwogCWlmIChUUkFDRV9PTihkZHJhdykpIHsKIAkJVFJBQ0UoZGRyYXcsIgljYXBzICIpOwogCQlfZHVtcF9ERFNDQVBTKGxwZGRzZC0+ZHdDYXBzKTsKIAl9CisKIAlpZiAoIShscGRkc2QtPmR3Q2FwcyAmIEREU0NBUFNfQkFDS0JVRkZFUikpIHsKIAkJRklYTUUoZGRyYXcsIndob29wcywgY2FuIG9ubHkgaGFuZGxlIGJhY2tidWZmZXJzIGZvciBub3dcbiIpOwogCQlyZXR1cm4gRV9GQUlMOwogCX0KKwogCS8qIEZJWE1FOiBzaG91bGQgaGFuZGxlIG1vcmUgdGhhbiBvbmUgYmFja2J1ZmZlciAqLwogCSpscGRzZiA9IHRoaXMtPnMuYmFja2J1ZmZlcjsKKyAKKyAgICAgICAgaWYoIHRoaXMtPnMuYmFja2J1ZmZlciApCisgICAgICAgIHsKKyAgICAgICAgICB0aGlzLT5zLmJhY2tidWZmZXItPmxwdnRibC0+Zm5BZGRSZWYoIHRoaXMtPnMuYmFja2J1ZmZlciApOworICAgICAgICB9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzI3LDEwICs3OTUsMjEgQEAKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTNfU2V0Q29sb3JLZXkoCi0JTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcyxEV09SRCB4LExQRERDT0xPUktFWSBja2V5CisJTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcywgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIGNrZXkKICkgewotCUZJWE1FKGRkcmF3LCIoJXApLT4oMHglMDhseCwlcCksc3R1YiFcbiIsdGhpcyx4LGNrZXkpOwotCXJldHVybiAwOworCUZJWE1FKGRkcmF3LCIoJXApLT4oMHglMDhseCwlcCksc3R1YiFcbiIsdGhpcyxkd0ZsYWdzLGNrZXkpOworCisgICAgICAgIGlmKCBkd0ZsYWdzICYgRERDS0VZX1NSQ0JMVCApCisgICAgICAgIHsKKyAgICAgICAgICAgZHdGbGFncyAmPSB+RERDS0VZX1NSQ0JMVDsKKyAgICAgICAgfSAKKworICAgICAgICBpZiggZHdGbGFncyApCisgICAgICAgIHsKKyAgICAgICAgICBUUkFDRSggZGRyYXcsICJ1bmhhbmRsZWQgZHdGbGFnczogJTA4bHhcbiIsIGR3RmxhZ3MgKTsKKyAgICAgICAgfQorCisJcmV0dXJuIEREX09LOwogfQogCiBzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTNfVlRhYmxlIGRnYV9kZHMzdnQgPSB7CkBAIC04MzAsNiArOTA5LDggQEAKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJfUmVsZWFzZShMUERJUkVDVERSQVdDTElQUEVSIHRoaXMpIHsKKyAgICAgICAgVFJBQ0UoIGRkcmF3LCAiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgdGhpcywgdGhpcy0+cmVmICk7CisKIAl0aGlzLT5yZWYtLTsKIAlpZiAodGhpcy0+cmVmKQogCQlyZXR1cm4gdGhpcy0+cmVmOwpAQCAtODc4LDExICs5NTksMjAgQEAKIAkJcmV0dXJuIERERVJSX0dFTkVSSUM7CiAJfQogCWZvciAoaT0wO2k8Y291bnQ7aSsrKSB7CisjaWYgMAorUEgKIAkJeGMucGl4ZWwgPSBpK3N0YXJ0OwogCQlUU1hRdWVyeUNvbG9yKGRpc3BsYXksdGhpcy0+Y20sJnhjKTsKIAkJcGFsZW50W2ldLnBlUmVkID0geGMucmVkPj44OwogCQlwYWxlbnRbaV0ucGVHcmVlbiA9IHhjLmdyZWVuPj44OwogCQlwYWxlbnRbaV0ucGVCbHVlID0geGMuYmx1ZT4+ODsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgcGFsZW50W2ldLnBlUmVkICAgPSB0aGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlUmVkOworICAgICAgICAgICAgICAgIHBhbGVudFtpXS5wZUJsdWUgID0gdGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZUJsdWU7CisgICAgICAgICAgICAgICAgcGFsZW50W2ldLnBlR3JlZW4gPSB0aGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlR3JlZW47CisgICAgICAgICAgICAgICAgcGFsZW50W2ldLnBlRmxhZ3MgPSB0aGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlRmxhZ3M7CisKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC05MDgsMTAgKzk5OCwxMyBAQAogCQl4Yy5ncmVlbiA9IHBhbGVudFtpXS5wZUdyZWVuPDw4OwogCQl4Yy5mbGFncyA9IERvUmVkfERvQmx1ZXxEb0dyZWVuOwogCQl4Yy5waXhlbCA9IHN0YXJ0K2k7CisKIAkJVFNYU3RvcmVDb2xvcihkaXNwbGF5LHRoaXMtPmNtLCZ4Yyk7CisKIAkJdGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZVJlZCA9IHBhbGVudFtpXS5wZVJlZDsKIAkJdGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZUJsdWUgPSBwYWxlbnRbaV0ucGVCbHVlOwogCQl0aGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlR3JlZW4gPSBwYWxlbnRbaV0ucGVHcmVlbjsKKyAgICAgICAgICAgICAgICB0aGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlRmxhZ3MgPSBwYWxlbnRbaV0ucGVGbGFnczsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC05NDIsMTAgKzEwMzUsMTMgQEAKIAkJeGMuZ3JlZW4gPSBwYWxlbnRbaV0ucGVHcmVlbjw8ODsKIAkJeGMuZmxhZ3MgPSBEb1JlZHxEb0JsdWV8RG9HcmVlbjsKIAkJeGMucGl4ZWwgPSBpK3N0YXJ0OworCiAJCVRTWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCiAJCXRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVSZWQgPSBwYWxlbnRbaV0ucGVSZWQ7CiAJCXRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVCbHVlID0gcGFsZW50W2ldLnBlQmx1ZTsKIAkJdGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZUdyZWVuID0gcGFsZW50W2ldLnBlR3JlZW47CisgICAgICAgICAgICAgICAgdGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZUZsYWdzID0gcGFsZW50W2ldLnBlRmxhZ3M7CiAJfQogCVRTWEY4NkRHQUluc3RhbGxDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksdGhpcy0+Y20pOwogCXJldHVybiAwOwpAQCAtOTU1LDYgKzEwNTEsNyBAQAogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKExQRElSRUNURFJBV1BBTEVUVEUgdGhpcykgeworICAgICAgICBUUkFDRSggZGRyYXcsICIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCB0aGlzLCB0aGlzLT5yZWYgKTsKIAlpZiAoIS0tKHRoaXMtPnJlZikpIHsKIAkJaWYgKHRoaXMtPmNtKSB7CiAJCQlUU1hGcmVlQ29sb3JtYXAoZGlzcGxheSx0aGlzLT5jbSk7CkBAIC05NjcsNiArMTA2NCw4IEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZihMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMpIHsKKworICAgICAgICBUUkFDRSggZGRyYXcsICIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCB0aGlzLCB0aGlzLT5yZWYgKTsKIAlyZXR1cm4gKysodGhpcy0+cmVmKTsKIH0KIApAQCAtOTc2LDIxICsxMDc1LDM5IEBACiAJcmV0dXJuIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRDsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZV9HZXRDYXBzKAorICAgICAgICAgTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzLCBMUERXT1JEIGxwZHdDYXBzICkKK3sKKyAgIEZJWE1FKCBkZHJhdywgIiglcCktPiglcCkgc3R1Yi5cbiIsIHRoaXMsIGxwZHdDYXBzICk7CisgICByZXR1cm4gRERfT0s7Cit9IAorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlX1F1ZXJ5SW50ZXJmYWNlKAorICAgICAgICBMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaiApIAoreworICBjaGFyICAgIHhyZWZpaWRbNTBdOworCisgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKyAgRklYTUUoZGRyYXcsIiglcCktPiglcywlcCkgc3R1Yi5cbiIsdGhpcyx4cmVmaWlkLG9iaik7CisKKyAgcmV0dXJuIFNfT0s7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlX1ZUYWJsZSBkZ2FfZGRwYWx2dCA9IHsKLQkodm9pZCopMSwKKwlJRGlyZWN0RHJhd1BhbGV0dGVfUXVlcnlJbnRlcmZhY2UsCiAJSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZiwKIAlJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZSwKLQkodm9pZCopNCwKKwlJRGlyZWN0RHJhd1BhbGV0dGVfR2V0Q2FwcywKIAlJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcywKIAlJRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZSwKIAlER0FfSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlX1ZUYWJsZSB4bGliX2RkcGFsdnQgPSB7Ci0JKHZvaWQqKTEsCisJSURpcmVjdERyYXdQYWxldHRlX1F1ZXJ5SW50ZXJmYWNlLAogCUlEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYsCiAJSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UsCi0JKHZvaWQqKTQsCisJSURpcmVjdERyYXdQYWxldHRlX0dldENhcHMsCiAJSURpcmVjdERyYXdQYWxldHRlX0dldEVudHJpZXMsCiAJSURpcmVjdERyYXdQYWxldHRlX0luaXRpYWxpemUsCiAJWGxpYl9JRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcwpAQCAtMTAzNiwxMiArMTE1MywxNSBAQAogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3QzRF9BZGRSZWYoTFBESVJFQ1QzRCB0aGlzKSB7CisgICAgICAgIFRSQUNFKCBkZHJhdywgIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIHRoaXMsIHRoaXMtPnJlZiApOworCiAgICAgICAgIHJldHVybiArKyh0aGlzLT5yZWYpOwogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3QzRF9SZWxlYXNlKExQRElSRUNUM0QgdGhpcykKIHsKLSAgICAgICAgVFJBQ0UoZGRyYXcsIiglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKyAgICAgICAgVFJBQ0UoIGRkcmF3LCAiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgdGhpcywgdGhpcy0+cmVmICk7CisKICAgICAgICAgaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAgICAgICAgICAgICAgICAgdGhpcy0+ZGRyYXctPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPmRkcmF3KTsKICAgICAgICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CkBAIC0xMDUwLDYgKzExNzAsMTggQEAKICAgICAgICAgcmV0dXJuIHRoaXMtPnJlZjsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3QzRF9Jbml0aWFsaXplKAorICAgICAgICAgTFBESVJFQ1QzRCB0aGlzLCBSRUZJSUQgcmVmaWlkICkKK3sKKyAgLyogRklYTUU6IE5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCAqLworICBjaGFyICAgIHhyZWZpaWRbNTBdOworCisgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKyAgRklYTUUoZGRyYXcsIiglcCktPiglcyk6c3R1Yi5cbiIsdGhpcyx4cmVmaWlkKTsKKyAgCisgIHJldHVybiBEREVSUl9BTFJFQURZSU5JVElBTElaRUQ7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlJRGlyZWN0M0QKICAqLwpAQCAtMTA1Nyw3ICsxMTg5LDcgQEAKIAkodm9pZCopSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlLAogCSh2b2lkKilJRGlyZWN0M0RfQWRkUmVmLAogCSh2b2lkKilJRGlyZWN0M0RfUmVsZWFzZSwKLQkodm9pZCopNCwKKwlJRGlyZWN0M0RfSW5pdGlhbGl6ZSwKIAkodm9pZCopNSwKIAkodm9pZCopNiwKIAkodm9pZCopNywKQEAgLTEwNjksNiArMTIwMSw4IEBACiAgKgkJCQlJRGlyZWN0M0QyCiAgKi8KIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdDNEMl9SZWxlYXNlKExQRElSRUNUM0QyIHRoaXMpIHsKKyAgICAgICAgVFJBQ0UoIGRkcmF3LCAiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgdGhpcywgdGhpcy0+cmVmICk7CisKIAlpZiAoIS0tKHRoaXMtPnJlZikpIHsKIAkJdGhpcy0+ZGRyYXctPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPmRkcmF3KTsKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwpAQCAtMTEwNyw2ICsxMjQxLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJSURpcmVjdERyYXcKICAqLworCisvKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY2JXbmRFeHRyYSBmb3Igc3RvcmFnZSBvZiB0aGUgdGhpcyBwdHIgZm9yIHRoZSB3aW5kb3cuCisgKiBQbGVhc2UgYWRqdXN0IGFsbG9jYXRpb24gaW4gWGxpYl9EaXJlY3REcmF3Q3JlYXRlIGlmIHlvdSBzdG9yZSBtb3JlIGRhdGEgaGVyZS4KKyAqLworc3RhdGljIElOVDMyIGRkcmF3WGxpYlRoaXNPZmZzZXQgPSAwOworCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKAogCUxQRElSRUNURFJBVzIgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuawogKSB7CkBAIC0xMTkxLDggKzEzMzEsMTAgQEAKIAlMUERJUkVDVERSQVcyIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmsKICkgewogCVhJbWFnZSAqaW1nOworCiAJVFJBQ0UoZGRyYXcsICIoJXApLT5DcmVhdGVTdXJmYWNlKCVwLCVwLCVwKVxuIiwKIAkJICAgICB0aGlzLGxwZGRzZCxscGRzZixscHVuayk7CisKIAlpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CiAJCWZwcmludGYoc3RkZXJyLCJbdz0lbGQsaD0lbGQsZmxhZ3MgIixscGRkc2QtPmR3V2lkdGgsbHBkZHNkLT5kd0hlaWdodCk7CiAJCV9kdW1wX0REU0QobHBkZHNkLT5kd0ZsYWdzKTsKQEAgLTEyMDIsOSArMTM0NCwxMiBAQAogCX0KIAogCSpscGRzZiA9IChMUERJUkVDVERSQVdTVVJGQUNFKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZSkpOworCiAJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKLQkoKmxwZHNmKS0+cmVmID0gMTsKLQkoKmxwZHNmKS0+bHB2dGJsID0gKExQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFKSZ4bGliX2RkczN2dDsKKwkoKmxwZHNmKS0+cy5kZHJhdyAgICAgICAgICAgICA9IHRoaXM7CisJKCpscGRzZiktPnJlZiAgICAgICAgICAgICAgICAgPSAxOworCSgqbHBkc2YpLT5scHZ0YmwgICAgICAgICAgICAgID0gKExQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFKSZ4bGliX2RkczN2dDsKKwogCWlmICgJKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfQ0FQUykgJiYgCiAJCShscGRkc2QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19PRkZTQ1JFRU5QTEFJTikKIAkpIHsKQEAgLTEyMjUsNyArMTM3MCw2IEBACiAJCSgqbHBkc2YpLT5zLndpZHRoCT0gbHBkZHNkLT5kd1dpZHRoOwogCQkoKmxwZHNmKS0+cy5oZWlnaHQJPSBscGRkc2QtPmR3SGVpZ2h0OwogCX0KLQkoKmxwZHNmKS0+cy5kZHJhdyA9IHRoaXM7CiAKIAl7CiAJKCpscGRzZiktPnQueGxpYi5pbWFnZSA9IGltZyA9CkBAIC0xMjUxLDcgKzEzOTUsMTAgQEAKIAkJCUZJWE1FKGRkcmF3LCJ1cmtzLCB3YW50cyB0byBoYXZlIG1vcmUgdGhhbiBvbmUgYmFja2J1ZmZlciAoJWxkKSFcbiIsbHBkZHNkLT5kd0JhY2tCdWZmZXJDb3VudCk7CiAKIAkJKCpscGRzZiktPnMuYmFja2J1ZmZlciA9IGJhY2sgPSAoTFBESVJFQ1REUkFXU1VSRkFDRTMpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdERyYXdTdXJmYWNlMykpOworCiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisJCWJhY2stPnMuZGRyYXcgPSB0aGlzOworCiAJCWJhY2stPnJlZiA9IDE7CiAJCWJhY2stPmxwdnRibCA9IChMUERJUkVDVERSQVdTVVJGQUNFM19WVEFCTEUpJnhsaWJfZGRzM3Z0OwogCQkvKiBGSVhNRTogITggYml0IGltYWdlcyAqLwpAQCAtMTI3Myw3ICsxNDIwLDYgQEAKIAkJKTsKIAkJYmFjay0+cy53aWR0aCA9IHRoaXMtPmQud2lkdGg7CiAJCWJhY2stPnMuaGVpZ2h0ID0gdGhpcy0+ZC5oZWlnaHQ7Ci0JCWJhY2stPnMuZGRyYXcgPSB0aGlzOwogCQliYWNrLT5zLmxwaXRjaCA9IGJhY2stPnQueGxpYi5pbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7CiAJCWJhY2stPnMuYmFja2J1ZmZlciA9IE5VTEw7IC8qIGRvZXMgbm90IGhhdmUgYSBiYWNrYnVmZmVyLCBpdCBpcwogCQkJCQkgICAgKiBvbmUhICovCkBAIC0xMzE2LDcgKzE0NjIsNyBAQAogCSAgICAgIGRzcHJpbnRmKGRkcmF3LCAiJXMgIiwgZmxhZ21hcFtpXS5uYW1lKTsKIAkgIFRSQUNFKGRkcmF3LCIJY29vcGVyYXRpdmUgbGV2ZWwgJXNcbiIsIGRiZ19zdHIoZGRyYXcpKTsKIAl9Ci0vKgl0aGlzLT5kLm1haW53aW5kb3cgPSBod25kOyovCisgICAgICAgIHRoaXMtPmQubWFpbldpbmRvdyA9IGh3bmQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MDQsMTIgKzE1NTAsMjUgQEAKIAkJMCwKIAkJTlVMTAogCSk7Ci0JU2V0V2luZG93TG9uZzMyQSh0aGlzLT5lLnhsaWIud2luZG93LDAsKExPTkcpdGhpcyk7CisKKyAgICAgICAgLyogU3RvcmUgdGhpcyB3aXRoIHRoZSB3aW5kb3cuIFdlJ2xsIHVzZSBpdCBmb3IgdGhlIHdpbmRvdyBwcm9jZWR1cmUgKi8KKwlTZXRXaW5kb3dMb25nMzJBKHRoaXMtPmUueGxpYi53aW5kb3csZGRyYXdYbGliVGhpc09mZnNldCwoTE9ORyl0aGlzKTsKKwogCXRoaXMtPmUueGxpYi5wYWludGFibGUgPSAxOworCiAJU2hvd1dpbmRvdzMyKHRoaXMtPmUueGxpYi53aW5kb3csVFJVRSk7CiAJVXBkYXRlV2luZG93MzIodGhpcy0+ZS54bGliLndpbmRvdyk7CisKIAlhc3NlcnQodGhpcy0+ZS54bGliLndpbmRvdyk7Ci0JdGhpcy0+ZS54bGliLmRyYXdhYmxlID0gV0lOX0ZpbmRXbmRQdHIodGhpcy0+ZS54bGliLndpbmRvdyktPndpbmRvdzsKKworICAgICAgICB0aGlzLT5lLnhsaWIuZHJhd2FibGUgID0gV0lOX0ZpbmRXbmRQdHIodGhpcy0+ZS54bGliLndpbmRvdyktPndpbmRvdzsgIAorCisgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgYSBjb250ZXh0IGZvciB0aGlzIHdpbmRvdy4gSG9zdCBvZmYgdGhlIGRlc2t0b3AgKi8KKyAgICAgICAgaWYoICF0aGlzLT5lLnhsaWIuZHJhd2FibGUgKQorICAgICAgICB7CisgICAgICAgICAgIHRoaXMtPmUueGxpYi5kcmF3YWJsZSA9IFdJTl9HZXREZXNrdG9wKCktPndpbmRvdzsKKyAgICAgICAgfQorCiAJdGhpcy0+ZC53aWR0aAk9IHdpZHRoOwogCXRoaXMtPmQuaGVpZ2h0CT0gaGVpZ2h0OwogCS8qIGFkanVzdCBmYl9oZWlnaHQsIHNvIHdlIGRvbid0IG92ZXJsYXAgKi8KQEAgLTE1MDMsMTYgKzE2NjIsMjMgQEAKIAlpZiAoKmxwZGRwYWwgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CiAJKCpscGRkcGFsKS0+cmVmID0gMTsKIAkoKmxwZGRwYWwpLT5pbnN0YWxsZWQgPSAwOworCiAJKCpscGRkcGFsKS0+ZGRyYXcgPSAoTFBESVJFQ1REUkFXKXRoaXM7CisgICAgICAgIHRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisKIAlpZiAodGhpcy0+ZC5kZXB0aDw9OCkgewogCQkoKmxwZGRwYWwpLT5jbSA9IFRTWENyZWF0ZUNvbG9ybWFwKGRpc3BsYXksdGhpcy0+ZS54bGliLmRyYXdhYmxlLERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLEFsbG9jQWxsKTsKIAkJLyogbGF0ZXIgaW5zdGFsbGVkIC4uLiAKIAkJICogVFNYSW5zdGFsbENvbG9ybWFwKGRpc3BsYXksKCpscGRkcGFsKS0+Y20pOwogCQkgKiBUU1hTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LHRoaXMtPmUueGxpYi5kcmF3YWJsZSwoKmxwZGRwYWwpLT5jbSk7CiAJCSAqLwotCX0gZWxzZQorCX0gCisgICAgICAgIGVsc2UKKyAgICAgICAgewogCQkvKiB3ZSBkb24ndCB3YW50IHBhbGV0dGVzIGluIGhpY29sb3Igb3IgdHJ1ZWNvbG9yICovCiAJCSgqbHBkZHBhbCktPmNtID0gMDsKKyAgICAgICAgfQorCiAJKCpscGRkcGFsKS0+bHB2dGJsID0gJnhsaWJfZGRwYWx2dDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NDUsMTAgKzE3MTEsMTQgQEAKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfQWRkUmVmKExQRElSRUNURFJBVzIgdGhpcykgeworICAgICAgICBUUkFDRSggZGRyYXcsICIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCB0aGlzLCB0aGlzLT5yZWYgKTsKKwogCXJldHVybiArKyh0aGlzLT5yZWYpOwogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKKyAgICAgICAgVFJBQ0UoIGRkcmF3LCAiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgdGhpcywgdGhpcy0+cmVmICk7CisKICNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAJCVRTWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwKTsKQEAgLTE1NjMsNiArMTczMyw4IEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKKyAgICAgICAgVFJBQ0UoIGRkcmF3LCAiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgdGhpcywgdGhpcy0+cmVmICk7CisKIAlpZiAoIS0tKHRoaXMtPnJlZikpIHsKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwogCQlyZXR1cm4gMDsKQEAgLTE3NzksNiArMTk1MSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0NvbXBhY3QoCisgICAgICAgICAgTFBESVJFQ1REUkFXMiB0aGlzICkKK3sKKyAgRklYTUUoZGRyYXcsIiglcCktPigpXG4iLCB0aGlzICk7CisgCisgIHJldHVybiBERF9PSzsKK30KKworCiAvKiBOb3RlOiBIYWNrIHNvIHdlIGNhbiByZXVzZSB0aGUgb2xkIGZ1bmN0aW9ucyB3aXRob3V0IGNvbXBpbGVyIHdhcm5pbmdzICovCiAjaWZkZWYgX19HTlVDX18KICMgZGVmaW5lIFhDQVNUKGZ1bikJKHR5cGVvZihkZ2FfZGR2dC5mbiMjZnVuKSkKQEAgLTE3OTAsNyArMTk3MSw3IEBACiAJWENBU1QoUXVlcnlJbnRlcmZhY2UpREdBX0lEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSwKIAlYQ0FTVChBZGRSZWYpSURpcmVjdERyYXcyX0FkZFJlZiwKIAlYQ0FTVChSZWxlYXNlKURHQV9JRGlyZWN0RHJhdzJfUmVsZWFzZSwKLQlYQ0FTVChDb21wYWN0KTQsCisJWENBU1QoQ29tcGFjdClJRGlyZWN0RHJhdzJfQ29tcGFjdCwKIAlYQ0FTVChDcmVhdGVDbGlwcGVyKUlEaXJlY3REcmF3Ml9DcmVhdGVDbGlwcGVyLAogCVhDQVNUKENyZWF0ZVBhbGV0dGUpREdBX0lEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlLAogCVhDQVNUKENyZWF0ZVN1cmZhY2UpREdBX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlLApAQCAtMTgxNiw3ICsxOTk3LDcgQEAKIAlYQ0FTVChRdWVyeUludGVyZmFjZSlYbGliX0lEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSwKIAlYQ0FTVChBZGRSZWYpSURpcmVjdERyYXcyX0FkZFJlZiwKIAlYQ0FTVChSZWxlYXNlKVhsaWJfSURpcmVjdERyYXcyX1JlbGVhc2UsCi0JWENBU1QoQ29tcGFjdCk0LAorCVhDQVNUKENvbXBhY3QpSURpcmVjdERyYXcyX0NvbXBhY3QsCiAJWENBU1QoQ3JlYXRlQ2xpcHBlcilJRGlyZWN0RHJhdzJfQ3JlYXRlQ2xpcHBlciwKIAlYQ0FTVChDcmVhdGVQYWxldHRlKVhsaWJfSURpcmVjdERyYXcyX0NyZWF0ZVBhbGV0dGUsCiAJWENBU1QoQ3JlYXRlU3VyZmFjZSlYbGliX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlLApAQCAtMTg0Myw2ICsyMDI0LDcgQEAKICAqCiAgKi8KIAorCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZSgKIAlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoLERXT1JEIHh4LERXT1JEIHl5CiApIHsKQEAgLTE4ODEsNyArMjA2Myw3IEBACiAJREdBX0lEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSwKIAlJRGlyZWN0RHJhdzJfQWRkUmVmLAogCURHQV9JRGlyZWN0RHJhdzJfUmVsZWFzZSwKLQkodm9pZCopNCwKKwlJRGlyZWN0RHJhdzJfQ29tcGFjdCwKIAlJRGlyZWN0RHJhdzJfQ3JlYXRlQ2xpcHBlciwKIAlER0FfSURpcmVjdERyYXcyX0NyZWF0ZVBhbGV0dGUsCiAJREdBX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlLApAQCAtMTkwOCw3ICsyMDkwLDcgQEAKIAlYbGliX0lEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSwKIAlJRGlyZWN0RHJhdzJfQWRkUmVmLAogCVhsaWJfSURpcmVjdERyYXcyX1JlbGVhc2UsCi0JKHZvaWQqKTQsCisJSURpcmVjdERyYXcyX0NvbXBhY3QsCiAJSURpcmVjdERyYXcyX0NyZWF0ZUNsaXBwZXIsCiAJWGxpYl9JRGlyZWN0RHJhdzJfQ3JlYXRlUGFsZXR0ZSwKIAlYbGliX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlLApAQCAtMTk4NywyMiArMjE2OSw2NSBAQAogI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9MSUJYWEY4NkRHQSkgKi8KIH0KIAotTFJFU1VMVCBXSU5BUEkgWGxpYl9ERFduZFByb2MoSFdORDMyIGh3bmQsVUlOVDMyIG1zZyxXUEFSQU0zMiB3UGFyYW0sTFBBUkFNIGxQYXJhbSkgewotCUxSRVNVTFQJcmV0OwotCS8qRklYTUUoZGRyYXcsIigweCUwNHgsJXMsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIiwoaW50KWh3bmQsU1BZX0dldE1zZ05hbWUobXNnKSwobG9uZyl3UGFyYW0sKGxvbmcpbFBhcmFtKTsgKi8KLQlpZiAobXNnPT1XTV9QQUlOVCl7Ci0JCUxQRElSRUNURFJBVyBkZHJhdyA9IChMUERJUkVDVERSQVcpR2V0V2luZG93TG9uZzMyQShod25kLDApOworTFJFU1VMVCBXSU5BUEkgWGxpYl9ERFduZFByb2MoSFdORDMyIGh3bmQsVUlOVDMyIG1zZyxXUEFSQU0zMiB3UGFyYW0sTFBBUkFNIGxQYXJhbSkKK3sKKyAgIExSRVNVTFQgcmV0OworICAgTFBESVJFQ1REUkFXIGRkcmF3ID0gTlVMTDsKKyAgIERXT1JEIGxhc3RFcnJvcjsKIAotCQlpZiAoZGRyYXcpCi0JCQlkZHJhdy0+ZS54bGliLnBhaW50YWJsZSA9IDE7Ci0JfQorICAgLypGSVhNRShkZHJhdywiKDB4JTA0eCwlcywweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLChpbnQpaHduZCxTUFlfR2V0TXNnTmFtZShtc2cpLChsb25nKXdQYXJhbSwobG9uZylsUGFyYW0pOyAqLworCisgICBTZXRMYXN0RXJyb3IoIEVSUk9SX1NVQ0NFU1MgKTsKKyAgIGRkcmF3ICA9IChMUERJUkVDVERSQVcpR2V0V2luZG93TG9uZzMyQSggaHduZCwgZGRyYXdYbGliVGhpc09mZnNldCApOworICAgaWYoICghZGRyYXcpICAmJgorICAgICAgICggKCBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKSApICE9IEVSUk9SX1NVQ0NFU1MgKQorICAgICApIAorICAgeworICAgICBFUlIoIGRkcmF3LCAiVW5hYmxlIHRvIHJldHJpZXZlIHRoaXMgcHRyIGZyb20gd2luZG93LiBFcnJvciAlMDhseFxuIiwgbGFzdEVycm9yICk7CisgICB9CisKKyAgIGlmKCBkZHJhdyApCisgICB7CisgICAgICAvKiBQZXJmb3JtIGFueSBzcGVjaWFsIGRpcmVjdCBkcmF3IGZ1bmN0aW9ucyAqLworICAgICAgaWYgKG1zZz09V01fUEFJTlQpCisgICAgICB7CisgICAgICAgIGRkcmF3LT5lLnhsaWIucGFpbnRhYmxlID0gMTsKKyAgICAgIH0gCisKKyAgICAgIC8qIE5vdyBsZXQgdGhlIGFwcGxpY2F0aW9uIGRlYWwgd2l0aCB0aGUgcmVzdCBvZiB0aGlzICovCisgICAgICBpZiggZGRyYXctPmQubWFpbldpbmRvdyApCisgICAgICB7CisgICAgCisgICAgICAgIC8qIERvbid0IHRoaW5rIHRoYXQgd2UgYWN0dWFsbHkgbmVlZCB0byBjYWxsIHRoaXMgYnV0Li4uIAorICAgICAgICAgICBtaWdodCBhcyB3ZWxsIGJlIG9uIHRoZSBzYWZlIHNpZGUgb2YgdGhpbmdzLi4uICovCisgICAgICAgIHJldCA9IERlZldpbmRvd1Byb2MzMkEoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKworICAgICAgICBpZiggIXJldCApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBkaWRuJ3QgaGFuZGxlIHRoZSBtZXNzYWdlIC0gZ2l2ZSBpdCB0byB0aGUgYXBwbGljYXRpb24gKi8KKyAgICAgICAgICByZXQgPSBDYWxsV2luZG93UHJvYzMyQSggV0lOX0ZpbmRXbmRQdHIoIGRkcmF3LT5kLm1haW5XaW5kb3cgKS0+d2lucHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJhdy0+ZC5tYWluV2luZG93LCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldCA9IERlZldpbmRvd1Byb2MzMkEoIGRkcmF3LT5kLm1haW5XaW5kb3csIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgIH0gCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKIAlyZXQgPSBEZWZXaW5kb3dQcm9jMzJBKGh3bmQsbXNnLHdQYXJhbSxsUGFyYW0pOwotCXJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKIH0KIAogSFJFU1VMVCBXSU5BUEkgWGxpYl9EaXJlY3REcmF3Q3JlYXRlKCBMUERJUkVDVERSQVcgKmxwbHBERCwgTFBVTktOT1dOIHBVbmtPdXRlcikgewogCVdORENMQVNTMzJBCXdjOwogCWludAkJaGF2ZV94c2htID0gMDsKKyAgICAgICAgV05EKiAgICAgICAgICAgIHBQYXJlbnRXaW5kb3c7IAogCiAJKmxwbHBERCA9IChMUERJUkVDVERSQVcpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdERyYXcpKTsKIAkoKmxwbHBERCktPmxwdnRibCA9ICZ4bGliX2RkdnQ7CkBAIC0yMDEyLDggKzIyMzcsMTQgQEAKIAl3Yy5zdHlsZQk9IENTX0dMT0JBTENMQVNTOwogCXdjLmxwZm5XbmRQcm9jCT0gWGxpYl9ERFduZFByb2M7CiAJd2MuY2JDbHNFeHRyYQk9IDA7Ci0Jd2MuY2JXbmRFeHRyYQk9IDA7Ci0Jd2MuaEluc3RhbmNlCT0gMDsKKwl3Yy5jYlduZEV4dHJhCT0gLyogRGVmaW5lcyBleHRyYSBtZW0gZm9yIHdpbmRvdy4gVGhpcyBpcyB1c2VkIGZvciBzdG9yaW5nIHRoaXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBMUERJUkVDVERSQVcgKTsgLyogIGRkcmF3WGxpYlRoaXNPZmZzZXQgKi8KKworICAgICAgICAvKiBXZSBjYW4gYmUgYSBjaGlsZCBvZiB0aGUgZGVza3RvcCBzaW5jZSB3ZSdyZSByZWFsbHkgaW1wb3J0YW50ICovCisgICAgICAgIHBQYXJlbnRXaW5kb3cgICA9IFdJTl9HZXREZXNrdG9wKCk7CisJd2MuaEluc3RhbmNlCT0gcFBhcmVudFdpbmRvdyA/IHBQYXJlbnRXaW5kb3ctPmh3bmRTZWxmIDogMDsKKyAgICAgICAgd2MuaEluc3RhbmNlICAgID0gMDsgCisKIAl3Yy5oSWNvbgk9IDA7CiAJd2MuaEN1cnNvcgk9IChIQ1VSU09SMzIpSURDX0FSUk9XMzJBOwogCXdjLmhickJhY2tncm91bmQ9IE5VTExfQlJVU0g7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9lc2NhcGUuYyBiL2dyYXBoaWNzL2VzY2FwZS5jCmluZGV4IGM3YmFjMmMuLmQzZjU0ZjIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2VzY2FwZS5jCisrKyBiL2dyYXBoaWNzL2VzY2FwZS5jCkBAIC0xMTYsOSArMTE2LDI3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotSU5UMzIgV0lOQVBJIEV4dEVzY2FwZTMyKEhEQzMyIGhkYyxJTlQzMiBuRXNjYXBlLElOVDMyIGNiSW5wdXQsTFBDU1RSIHgsSU5UMzIgY2JPdXRwdXQsTFBTVFIgb3V0KSB7Ci0JRklYTUUoZHJpdmVyLCIoMHglMDR4LDB4JXgsJWQsJXMsJWQsJXApLHN0dWIhXG4iLAotCQloZGMsbkVzY2FwZSxjYklucHV0LHgsY2JPdXRwdXQsb3V0Ci0JKTsKLQlyZXR1cm4gMTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlFeHRFc2NhcGUzMglbR0RJMzIuOTVdCisgKgorICogUEFSQU1TCisgKiAgICBoZGMgICAgICAgICBbSV0gSGFuZGxlIHRvIGRldmljZSBjb250ZXh0CisgKiAgICBuRXNjYXBlICAgICBbSV0gRXNjYXBlIGZ1bmN0aW9uCisgKiAgICBjYklucHV0ICAgICBbSV0gTnVtYmVyIG9mIGJ5dGVzIGluIGlucHV0IHN0cnVjdHVyZQorICogICAgbHBzekluRGF0YSAgW0ldIFBvaW50ZXIgdG8gaW5wdXQgc3RydWN0dXJlCisgKiAgICBjYk91dHB1dCAgICBbSV0gTnVtYmVyIG9mIGJ5dGVzIGluIG91dHB1dCBzdHJ1Y3R1cmUKKyAqICAgIGxwc3pPdXREYXRhIFtPXSBQb2ludGVyIHRvIG91dHB1dCBzdHJ1Y3R1cmUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiA+MAorICogICAgTm90IGltcGxlbWVudGVkOiAwCisgKiAgICBGYWlsdXJlOiA8MAorICovCitJTlQzMiBXSU5BUEkgRXh0RXNjYXBlMzIoIEhEQzMyIGhkYywgSU5UMzIgbkVzY2FwZSwgSU5UMzIgY2JJbnB1dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscHN6SW5EYXRhLCBJTlQzMiBjYk91dHB1dCwgTFBTVFIgbHBzek91dERhdGEgKQoreworICAgIEZJWE1FKGRyaXZlciwiKDB4JTA0eCwweCV4LCVkLCVzLCVkLCVwKTpzdHViXG4iLAorICAgICAgICAgIGhkYyxuRXNjYXBlLGNiSW5wdXQsZGVidWdzdHJfYShscHN6SW5EYXRhKSxjYk91dHB1dCxscHN6T3V0RGF0YSk7CisgICAgcmV0dXJuIDA7CiB9CisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BhaW50aW5nLmMgYi9ncmFwaGljcy9wYWludGluZy5jCmluZGV4IDU3YjMzMTYuLjBjN2QzYTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BhaW50aW5nLmMKKysrIGIvZ3JhcGhpY3MvcGFpbnRpbmcuYwpAQCAtODEyLDggKzgxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExQUkVDVDMyIGxwcmNGcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMUFJFQ1QzMiBscHJjVG8gKQogewotICAgIEZJWE1FKGdkaSwiKCV4LCVkLCVwLCVwKTogZW1wdHkgc3R1YiFcbiIsCi0JICBod25kLCBpZEFuaSwgbHByY0Zyb20sIGxwcmNUbyApOworICAgIEZJWE1FKGdkaSwiKDB4JXgsJWQsJXAsJXApOiBzdHViXG4iLGh3bmQsaWRBbmksbHByY0Zyb20sbHByY1RvKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcGF0aC5jIGIvZ3JhcGhpY3MvcGF0aC5jCmluZGV4IDlmZDIzY2EuLmJkNWRmZmQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BhdGguYworKysgYi9ncmFwaGljcy9wYXRoLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogSU5UMTYgV0lOQVBJIEdldFBhdGgxNihIREMxNiBoZGMsIExQUE9JTlQxNiBwUG9pbnRzLCBMUEJZVEUgcFR5cGVzLAogICAgSU5UMTYgblNpemUpCiB7Ci0gICBGSVhNRShnZGksICJVbmltcGxlbWVudGVkIHN0dWJcbiIpOworICAgRklYTUUoZ2RpLCAiKCVkLCVwLCVwKTogc3R1YlxuIixoZGMscFBvaW50cyxwVHlwZXMpOwogCiAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi94Zm9udC5jIGIvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMKaW5kZXggMjdjNTAwOS4uYWM4NjAyMiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMKQEAgLTczLDE4ICs3MywxOCBAQAogCQkJICB7ICItYWRvYmUtaGVsdmV0aWNhLSIsICJBcmlhbCIgfQogCQkJICB9OwogCi0vKiBDaGFyc2V0IHRyYW5zbGF0aW9uIHRhYmxlLCBjcDEyNS0uLiBlbmNvZGVkIGZvbnRzIGFyZSBwcm9kdWNlZCBieQotICogdGhlIGZudDJiZGYgKi8KKy8qIENoYXJzZXQgdHJhbnNsYXRpb24gdGFibGUsIG1pY3Jvc29mdC1jcDEyNS4uIGVuY29kZWQgZm9udHMgYXJlIHByb2R1Y2VkIGJ5CisgKiB0aGUgZm50MmJkZiBvciB0aGUgVHJ1ZSBUeXBlIFgxMSBmb250IHNlcnZlcnMgKi8KIAogc3RhdGljIGludAkgbnVtQ1BUcmFuc2xhdGlvbiA9IDg7Ci1zdGF0aWMgQllURQkgQ1BUcmFuc2xhdGlvbltdID0geyBFRV9DSEFSU0VULAkvKiBjcDEyNS0wICovCi0JCQkJICAgICBSVVNTSUFOX0NIQVJTRVQsCS8qIGNwMTI1LTEgKi8KLQkJCQkgICAgIEFOU0lfQ0hBUlNFVCwJLyogY3AxMjUtMiAqLwotCQkJCSAgICAgR1JFRUtfQ0hBUlNFVCwJLyogY3AxMjUtMyAqLwotCQkJCSAgICAgVFVSS0lTSF9DSEFSU0VULAkvKiBjcDEyNS00ICovCi0JCQkJICAgICBIRUJSRVdfQ0hBUlNFVCwJLyogY3AxMjUtNSAqLwotCQkJCSAgICAgQVJBQklDX0NIQVJTRVQsCS8qIGNwMTI1LTYgKi8KLQkJCQkgICAgIEJBTFRJQ19DSEFSU0VUCS8qIGNwMTI1LTcgKi8KK3N0YXRpYyBCWVRFCSBDUFRyYW5zbGF0aW9uW10gPSB7IEVFX0NIQVJTRVQsCS8qIGNwMTI1MCAqLworCQkJCSAgICAgUlVTU0lBTl9DSEFSU0VULAkvKiBjcDEyNTEgKi8KKwkJCQkgICAgIEFOU0lfQ0hBUlNFVCwJLyogY3AxMjUyICovCisJCQkJICAgICBHUkVFS19DSEFSU0VULAkvKiBjcDEyNTMgKi8KKwkJCQkgICAgIFRVUktJU0hfQ0hBUlNFVCwJLyogY3AxMjU0ICovCisJCQkJICAgICBIRUJSRVdfQ0hBUlNFVCwJLyogY3AxMjU1ICovCisJCQkJICAgICBBUkFCSUNfQ0hBUlNFVCwJLyogY3AxMjU2ICovCisJCQkJICAgICBCQUxUSUNfQ0hBUlNFVAkvKiBjcDEyNTcgKi8KIAkJCQkgICB9OyAKIAogVUlOVDE2CQkJWFRleHRDYXBzID0gVENfT1BfQ0hBUkFDVEVSIHwgVENfT1BfU1RST0tFIHwKQEAgLTEwNCw3ICsxMDQsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIqCUlOSUdsb2JhbE1ldHJpY3MgPSAiRm9udE1ldHJpY3MiOwogCiBzdGF0aWMgY29uc3QgY2hhcioJTEZEU2VwYXJhdG9yID0gIiotIjsKLXN0YXRpYyBjb25zdCBjaGFyKglsb2NhbE1TRW5jb2RpbmcgPSAiY3AxMjUtIjsKK3N0YXRpYyBjb25zdCBjaGFyKglsb2NhbE1TRW5jb2RpbmcgPSAibWljcm9zb2Z0LWNwMTI1IjsKIHN0YXRpYyBjb25zdCBjaGFyKglpc284ODU5RW5jb2RpbmcgPSAiaXNvODg1OS0iOwogc3RhdGljIGNvbnN0IGNoYXIqCWlzbzY0NkVuY29kaW5nID0gImlzbzY0Ni4xOTkxLSI7CiBzdGF0aWMgY29uc3QgY2hhcioJYW5zaUVuY29kaW5nID0gImFuc2ktIjsKQEAgLTM3Miw3ICszNzIsNyBAQAogICAgICBmaS0+ZmlfZmxhZ3MgfD0gRklfRU5DX0lTTzY0NjsKICAgIGVsc2UgaWYoIHN0cnN0cihscGNoLCBhbnNpRW5jb2RpbmcpICkJLyogZm50MmJkZiBwcm9kdWNlcyAtYW5zaS0wIExGRCAqLwogICAgICBmaS0+ZmlfZmxhZ3MgfD0gRklfRU5DX0FOU0k7Ci0gICBlbHNlCQkJCQkJLyogLi4uIGFuZCAtY3AxMjUteCAqLworICAgZWxzZQkJCQkJCS8qIC4uLiBhbmQgLW1pY3Jvc29mdC1jcDEyNXggKi8KICAgIHsKIAlmaS0+ZGYuZGZDaGFyU2V0ID0gT0VNX0NIQVJTRVQ7CiAJaWYoICFzdHJuY2FzZWNtcChscGNoLCBsb2NhbE1TRW5jb2RpbmcsIDYpICkKQEAgLTM4NCw3ICszODQsOCBAQAogCQlmaS0+ZGYuZGZDaGFyU2V0ID0gQ1BUcmFuc2xhdGlvbltpXTsKIAkgICAgfQogCX0KLQllbHNlIGlmKCBzdHJzdHIobHBjaCwgImZvbnRzcGVjaWZpYyIpICkKKwllbHNlIGlmKCBzdHJzdHIobHBjaCwgImZvbnRzcGVjaWZpYyIpIHx8CisJCSBzdHJzdHIobHBjaCwgIm1pY3Jvc29mdC1zeW1ib2wiKSApCiAJICAgIGZpLT5kZi5kZkNoYXJTZXQgPSBTWU1CT0xfQ0hBUlNFVDsKICAgIH0KICAgIHJldHVybiBUUlVFOwkJCQkJCkBAIC0xOTkzLDE0ICsxOTk0LDE0IEBACiAgIGludCBpOwogICBjaGFyICpjcCwgKnN0YXJ0OwogCi0gIFhHZXRGb250UHJvcGVydHkoIHBmby0+ZnMsIFhBX0ZPTlQsICZuYW1lQXRvbSApOwotICBmb250TmFtZSA9IFhHZXRBdG9tTmFtZSggZGlzcGxheSwgbmFtZUF0b20gKTsKKyAgVFNYR2V0Rm9udFByb3BlcnR5KCBwZm8tPmZzLCBYQV9GT05ULCAmbmFtZUF0b20gKTsKKyAgZm9udE5hbWUgPSBUU1hHZXRBdG9tTmFtZSggZGlzcGxheSwgbmFtZUF0b20gKTsKICAgZm9yKGkgPSAwLCBjcCA9IGZvbnROYW1lOyBpIDwgNzsgaSsrKSB7CiAgICAgY3AgPSBzdHJjaHIoY3AsICctJyk7CiAgICAgY3ArKzsKICAgfQogICBpZigqY3AgIT0gJ1snKSB7Ci0gICAgWEZyZWUoZm9udE5hbWUpOworICAgIFRTWEZyZWUoZm9udE5hbWUpOwogICAgIHJldHVybiBGQUxTRTsKICAgfQogICBzdGFydCA9IGNwOwpAQCAtMjAxMCwxMCArMjAxMSwxMCBAQAogI2RlZmluZSBQWCBwZm8tPmxwWDExVHJhbnMKIAogICBzc2NhbmYoc3RhcnQsICJbJWYlZiVmJWZdIiwgJlBYLT5hLCAmUFgtPmIsICZQWC0+YywgJlBYLT5kKTsKLSAgWEZyZWUoZm9udE5hbWUpOworICBUU1hGcmVlKGZvbnROYW1lKTsKIAotICBYR2V0Rm9udFByb3BlcnR5KCBwZm8tPmZzLCBSQVdfQVNDRU5ULCAmUFgtPlJBV19BU0NFTlQgKTsKLSAgWEdldEZvbnRQcm9wZXJ0eSggcGZvLT5mcywgUkFXX0RFU0NFTlQsICZQWC0+UkFXX0RFU0NFTlQgKTsKKyAgVFNYR2V0Rm9udFByb3BlcnR5KCBwZm8tPmZzLCBSQVdfQVNDRU5ULCAmUFgtPlJBV19BU0NFTlQgKTsKKyAgVFNYR2V0Rm9udFByb3BlcnR5KCBwZm8tPmZzLCBSQVdfREVTQ0VOVCwgJlBYLT5SQVdfREVTQ0VOVCApOwogCiAgIFBYLT5waXhlbHNpemUgPSBoeXBvdChQWC0+YSwgUFgtPmIpOwogICBQWC0+YXNjZW50ID0gUFgtPnBpeGVsc2l6ZSAvIDEwMDAuMCAqIFBYLT5SQVdfQVNDRU5UOwpkaWZmIC0tZ2l0IGEvaWYxNjMyL01ha2VmaWxlLmluIGIvaWYxNjMyL01ha2VmaWxlLmluCmluZGV4IDM5MmI1MGEuLmY5Y2Q2MTggMTAwNjQ0Ci0tLSBhL2lmMTYzMi9NYWtlZmlsZS5pbgorKysgYi9pZjE2MzIvTWFrZWZpbGUuaW4KQEAgLTYsOSArNiwxMSBAQAogTU9EVUxFICAgID0gaWYxNjMyCiAKIERMTFMgPSBcCisJYXZpZmlsZS5zcGVjIFwKIAljb21tZGxnLnNwZWMgXAogCWNvbXBvYmouc3BlYyBcCiAJZGRlbWwuc3BlYyBcCisJZGlzcGxheS5zcGVjIFwKIAlnZGkuc3BlYyBcCiAJa2VybmVsLnNwZWMgXAogCWtleWJvYXJkLnNwZWMgXApkaWZmIC0tZ2l0IGEvaWYxNjMyL2F2aWZpbGUuc3BlYyBiL2lmMTYzMi9hdmlmaWxlLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2ZTkzMAotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi9hdmlmaWxlLnNwZWMKQEAgLTAsMCArMSw2MiBAQAorbmFtZQlhdmlmaWxlCit0eXBlCXdpbjE2CisKKzEgICBzdHViICAgICBXRVAKKzIgICBzdHViICAgICBETExHRVRDTEFTU09CSkVDVAorMyAgIHN0dWIgICAgIERMTENBTlVOTE9BRE5PVworNCAgIHN0dWIgICAgIF9fX0VYUE9SVEVEU1RVQgorMTAgIHN0dWIgICAgIF9JSURfSUFWSVNUUkVBTQorMTEgIHN0dWIgICAgIF9JSURfSUFWSUZJTEUKKzEyICBzdHViICAgICBfSUlEX0lBVklFRElUU1RSRUFNCisxMyAgc3R1YiAgICAgX0lJRF9JR0VURlJBTUUKKzE0ICBzdHViICAgICBfQ0xTSURfQVZJU0lNUExFVU5NQVJTSEFMCisxMDAgc3R1YiAgICAgQVZJRklMRUlOSVQKKzEwMSBzdHViICAgICBBVklGSUxFRVhJVAorMTAyIHN0dWIgICAgIEFWSUZJTEVPUEVOCisxMDMgc3R1YiAgICAgQVZJU1RSRUFNT1BFTkZST01GSUxFCisxMDQgc3R1YiAgICAgQVZJU1RSRUFNQ1JFQVRFCisxMDUgc3R1YiAgICAgQVZJTUFLRUNPTVBSRVNTRURTVFJFQU0KKzEwNiBzdHViICAgICBBVklNQUtFRklMRUZST01TVFJFQU1TCisxMDcgc3R1YiAgICAgQVZJTUFLRVNUUkVBTUZST01DTElQQk9BUkQKKzExMCBzdHViICAgICBBVklTVFJFQU1HRVRGUkFNRQorMTExIHN0dWIgICAgIEFWSVNUUkVBTUdFVEZSQU1FQ0xPU0UKKzExMiBzdHViICAgICBBVklTVFJFQU1HRVRGUkFNRU9QRU4KKzEyMCBzdHViICAgICBfQVZJU0FWRQorMTIxIHN0dWIgICAgIEFWSVNBVkVWCisxMjIgc3R1YiAgICAgQVZJU0FWRU9QVElPTlMKKzEyMyBzdHViICAgICBBVklCVUlMREZJTFRFUgorMTI0IHN0dWIgICAgIEFWSVNBVkVPUFRJT05TRlJFRQorMTMwIHN0dWIgICAgIEFWSVNUUkVBTVNUQVJUCisxMzEgc3R1YiAgICAgQVZJU1RSRUFNTEVOR1RICisxMzIgc3R1YiAgICAgQVZJU1RSRUFNVElNRVRPU0FNUExFCisxMzMgc3R1YiAgICAgQVZJU1RSRUFNU0FNUExFVE9USU1FCisxNDAgc3R1YiAgICAgQVZJRklMRUFERFJFRgorMTQxIHN0dWIgICAgIEFWSUZJTEVSRUxFQVNFCisxNDIgc3R1YiAgICAgQVZJRklMRUlORk8KKzE0MyBzdHViICAgICBBVklGSUxFR0VUU1RSRUFNCisxNDQgc3R1YiAgICAgQVZJRklMRUNSRUFURVNUUkVBTQorMTQ2IHN0dWIgICAgIEFWSUZJTEVXUklURURBVEEKKzE0NyBzdHViICAgICBBVklGSUxFUkVBRERBVEEKKzE0OCBzdHViICAgICBBVklGSUxFRU5EUkVDT1JECisxNjAgc3R1YiAgICAgQVZJU1RSRUFNQUREUkVGCisxNjEgc3R1YiAgICAgQVZJU1RSRUFNUkVMRUFTRQorMTYyIHN0dWIgICAgIEFWSVNUUkVBTUlORk8KKzE2MyBzdHViICAgICBBVklTVFJFQU1GSU5EU0FNUExFCisxNjQgc3R1YiAgICAgQVZJU1RSRUFNUkVBREZPUk1BVAorMTY1IHN0dWIgICAgIEFWSVNUUkVBTVJFQUREQVRBCisxNjYgc3R1YiAgICAgQVZJU1RSRUFNV1JJVEVEQVRBCisxNjcgc3R1YiAgICAgQVZJU1RSRUFNUkVBRAorMTY4IHN0dWIgICAgIEFWSVNUUkVBTVdSSVRFCisxNjkgc3R1YiAgICAgQVZJU1RSRUFNU0VURk9STUFUCisxODAgc3R1YiAgICAgRURJVFNUUkVBTUNPUFkKKzE4MSBzdHViICAgICBFRElUU1RSRUFNQ1VUCisxODIgc3R1YiAgICAgRURJVFNUUkVBTVBBU1RFCisxODQgc3R1YiAgICAgQ1JFQVRFRURJVEFCTEVTVFJFQU0KKzE4NSBzdHViICAgICBBVklQVVRGSUxFT05DTElQQk9BUkQKKzE4NyBzdHViICAgICBBVklHRVRGUk9NQ0xJUEJPQVJECisxODggc3R1YiAgICAgQVZJQ0xFQVJDTElQQk9BUkQKKzE5MCBzdHViICAgICBFRElUU1RSRUFNQ0xPTkUKKzE5MSBzdHViICAgICBFRElUU1RSRUFNU0VUTkFNRQorMTkyIHN0dWIgICAgIEVESVRTVFJFQU1TRVRJTkZPCisyMDAgc3R1YiAgICAgQVZJU1RSRUFNQkVHSU5TVFJFQU1JTkcKKzIwMSBzdHViICAgICBBVklTVFJFQU1FTkRTVFJFQU1JTkcKZGlmZiAtLWdpdCBhL2lmMTYzMi9idWlsdGluLmMgYi9pZjE2MzIvYnVpbHRpbi5jCmluZGV4IGMyMGNhMTYuLmJlMTBiNTIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9idWlsdGluLmMKKysrIGIvaWYxNjMyL2J1aWx0aW4uYwpAQCAtNDYsOSArNDYsMTEgQEAKIAogLyogMTYtYml0IERMTHMgKi8KIAorZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgQVZJRklMRV9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgQ09NTURMR19EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgQ09NUE9CSl9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgRERFTUxfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIERJU1BMQVlfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIEdESV9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgS0VSTkVMX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBLRVlCT0FSRF9EZXNjcmlwdG9yOwpAQCAtOTIsOCArOTQsMTAgQEAKICAgICB7ICZVU0VSX0Rlc2NyaXB0b3IsICAgICBETExfRkxBR19BTFdBWVNfVVNFRCB9LAogICAgIHsgJkdESV9EZXNjcmlwdG9yLCAgICAgIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCiAgICAgeyAmU1lTVEVNX0Rlc2NyaXB0b3IsICAgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKKyAgICB7ICZESVNQTEFZX0Rlc2NyaXB0b3IsICBETExfRkxBR19BTFdBWVNfVVNFRCB9LAogICAgIHsgJldQUk9DU19EZXNjcmlwdG9yLCAgIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCiAgICAgeyAmV0lOREVCVUdfRGVzY3JpcHRvciwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZBVklGSUxFX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAogICAgIHsgJkNPTU1ETEdfRGVzY3JpcHRvciwgIERMTF9GTEFHX05PVF9VU0VEIH0sCiAgICAgeyAmQ09NUE9CSl9EZXNjcmlwdG9yLCAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKICAgICB7ICZEREVNTF9EZXNjcmlwdG9yLCAgICBETExfRkxBR19OT1RfVVNFRCB9LApAQCAtMTU5LDEwICsxNjMsMTAgQEAKICAgICAvKiBBbGxvY2F0ZSB0aGUgY29kZSBzZWdtZW50ICovCiAKICAgICBwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKLSAgICBwU2VnVGFibGUtPnNlbGVjdG9yID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkZXNjci0+Y29kZV9zdGFydCwKKyAgICBwU2VnVGFibGUtPmhTZWcgPSBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRlc2NyLT5jb2RlX3N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdUYWJsZS0+bWluc2l6ZSwgaE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBUUlVFLCBGQUxTRSwgTlVMTCApOwotICAgIGlmICghcFNlZ1RhYmxlLT5zZWxlY3RvcikgcmV0dXJuIDA7CisgICAgaWYgKCFwU2VnVGFibGUtPmhTZWcpIHJldHVybiAwOwogICAgIHBTZWdUYWJsZSsrOwogCiAgICAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc2VnbWVudCAqLwpAQCAtMTcwLDEzICsxNzQsMTQgQEAKICAgICBtaW5zaXplID0gcFNlZ1RhYmxlLT5taW5zaXplID8gcFNlZ1RhYmxlLT5taW5zaXplIDogMHgxMDAwMDsKICAgICBtaW5zaXplICs9IHBNb2R1bGUtPmhlYXBfc2l6ZTsKICAgICBpZiAobWluc2l6ZSA+IDB4MTAwMDApIG1pbnNpemUgPSAweDEwMDAwOwotICAgIHBTZWdUYWJsZS0+c2VsZWN0b3IgPSBHTE9CQUxfQWxsb2MoIEdNRU1fRklYRUQsIG1pbnNpemUsCisgICAgcFNlZ1RhYmxlLT5oU2VnID0gR0xPQkFMX0FsbG9jKCBHTUVNX0ZJWEVELCBtaW5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKTsKLSAgICBpZiAoIXBTZWdUYWJsZS0+c2VsZWN0b3IpIHJldHVybiAwOwotICAgIGlmIChwU2VnVGFibGUtPm1pbnNpemUpIG1lbWNweSggR2xvYmFsTG9jazE2KCBwU2VnVGFibGUtPnNlbGVjdG9yICksCisgICAgaWYgKCFwU2VnVGFibGUtPmhTZWcpIHJldHVybiAwOworICAgIGlmIChwU2VnVGFibGUtPm1pbnNpemUpIG1lbWNweSggR2xvYmFsTG9jazE2KCBwU2VnVGFibGUtPmhTZWcgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kYXRhX3N0YXJ0LCBwU2VnVGFibGUtPm1pbnNpemUpOwogICAgIGlmIChwTW9kdWxlLT5oZWFwX3NpemUpCi0gICAgICAgIExvY2FsSW5pdCggcFNlZ1RhYmxlLT5zZWxlY3RvciwgcFNlZ1RhYmxlLT5taW5zaXplLCBtaW5zaXplICk7CisgICAgICAgIExvY2FsSW5pdCggR2xvYmFsSGFuZGxlVG9TZWwocFNlZ1RhYmxlLT5oU2VnKSwKKwkJcFNlZ1RhYmxlLT5taW5zaXplLCBtaW5zaXplICk7CiAKICAgICBORV9SZWdpc3Rlck1vZHVsZSggcE1vZHVsZSApOwogICAgIHJldHVybiBoTW9kdWxlOwpAQCAtMjA3LDkgKzIxMiw5IEBACiAgICAgLyogU2V0IHRoZSBVU0VSIGFuZCBHREkgaGVhcCBzZWxlY3RvcnMgKi8KIAogICAgIHBNb2R1bGUgICAgICA9IE5FX0dldFB0ciggR2V0TW9kdWxlSGFuZGxlMTYoICJVU0VSIiApKTsKLSAgICBVU0VSX0hlYXBTZWwgPSAoTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxKS0+c2VsZWN0b3I7CisgICAgVVNFUl9IZWFwU2VsID0gcE1vZHVsZSA/IEdsb2JhbEhhbmRsZVRvU2VsKChORV9TRUdfVEFCTEUoIHBNb2R1bGUgKSArIHBNb2R1bGUtPmRncm91cCAtIDEpLT5oU2VnKSA6IDA7CiAgICAgcE1vZHVsZSAgICAgID0gTkVfR2V0UHRyKCBHZXRNb2R1bGVIYW5kbGUxNiggIkdESSIgKSk7Ci0gICAgR0RJX0hlYXBTZWwgID0gKE5FX1NFR19UQUJMRSggcE1vZHVsZSApICsgcE1vZHVsZS0+ZGdyb3VwIC0gMSktPnNlbGVjdG9yOworICAgIEdESV9IZWFwU2VsICA9IHBNb2R1bGUgPyBHbG9iYWxIYW5kbGVUb1NlbCgoTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxKS0+aFNlZykgOiAwOwogCiAgICAgLyogSW5pdGlhbGl6ZSBLRVJORUwuMTc4IChfX1dJTkZMQUdTKSB3aXRoIHRoZSBjb3JyZWN0IGZsYWdzIHZhbHVlICovCiAKQEAgLTI1NCw3ICsyNTksNyBAQAogICAgICAgICBGQVJQUk9DMTYgcHJvYyA9IE5FX0dldEVudHJ5UG9pbnQoIGhNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklSU1RfSU5URVJSVVBUX09SRElOQUwgKyB2ZWN0b3IgKTsKICAgICAgICAgYXNzZXJ0KHByb2MpOwotICAgICAgICBJTlRfU2V0SGFuZGxlciggdmVjdG9yLCBwcm9jICk7CisgICAgICAgIElOVF9TZXRQTUhhbmRsZXIoIHZlY3RvciwgcHJvYyApOwogICAgIH0KIAogICAgIFNOT09QMTZfSW5pdCgpOwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2Rpc3BsYXkuc3BlYyBiL2lmMTYzMi9kaXNwbGF5LnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2NTdkOAotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi9kaXNwbGF5LnNwZWMKQEAgLTAsMCArMSwzNSBAQAorbmFtZQlkaXNwbGF5Cit0eXBlCXdpbjE2CisKKzEgICBzdHViIEJpdEJsdAorMiAgIHN0dWIgQ29sb3JJbmZvCiszICAgc3R1YiBDb250cm9sCis0ICAgc3R1YiBEaXNhYmxlCis1ICAgc3R1YiBFbmFibGUKKzYgICBzdHViIEVudW1Gb250cworNyAgIHN0dWIgRW51bU9iagorOCAgIHN0dWIgT3V0cHV0Cis5ICAgc3R1YiBQaXhlbAorMTAgIHN0dWIgUmVhbGl6ZU9iamVjdAorMTEgIHN0dWIgU3RyQmx0CisxMiAgc3R1YiBTY2FuTFIKKzEzICBzdHViIERldmljZU1vZGUKKzE0ICBzdHViIEV4dFRleHRPdXQKKzE1ICBzdHViIEdldENoYXJXaWR0aAorMTYgIHN0dWIgRGV2aWNlQml0bWFwCisxNyAgc3R1YiBGYXN0Qm9yZGVyCisxOCAgc3R1YiBTZXRBdHRyaWJ1dGUKKzE5ICBzdHViIERldmljZUJpdG1hcEJpdHMKKzIwICBzdHViIENyZWF0ZUJpdG1hcAorMjEgIHN0dWIgRElCU2NyZWVuQmx0Cis5MCAgc3R1YiBEb19Qb2x5bGluZXMKKzkxICBzdHViIERvX1NjYW5saW5lcworOTIgIHN0dWIgU2F2ZVNjcmVlbkJpdG1hcAorMTAxIHBhc2NhbDE2IElucXVpcmUocHRyKSBEaXNwbGF5SW5xdWlyZQorMTAyIHBhc2NhbDE2IFNldEN1cnNvcihwdHIpIERpc3BsYXlTZXRDdXJzb3IKKzEwMyBwYXNjYWwxNiBNb3ZlQ3Vyc29yKHdvcmQgd29yZCkgRGlzcGxheU1vdmVDdXJzb3IKKzE0MCBzdHViIENoZWNrQ3Vyc29yCis1MDAgcGFzY2FsMTYgVXNlclJlcGFpbnREaXNhYmxlKHdvcmQpIFVzZXJSZXBhaW50RGlzYWJsZQorNjAwIHN0dWIgSW5rUmVhZHkKKzYwMSBzdHViIEdldExQRGV2aWNlCisKZGlmZiAtLWdpdCBhL2lmMTYzMi9kdW1teS5jIGIvaWYxNjMyL2R1bW15LmMKaW5kZXggZDgxYTE1OS4uYzVmMTJlMiAxMDA2NDQKLS0tIGEvaWYxNjMyL2R1bW15LmMKKysrIGIvaWYxNjMyL2R1bW15LmMKQEAgLTMxLDcgKzMxLDYgQEAKIGxvbmcgV0lOQVBJIHN0dWJfR0RJXzU1Nih2b2lkKSB7IEZJWE1FKHJlbGF5LCAic3R1YlxuIik7IHJldHVybiAwOyB9CiBsb25nIFdJTkFQSSBzdHViX0dESV81NTgodm9pZCkgeyBGSVhNRShyZWxheSwgInN0dWJcbiIpOyByZXR1cm4gMDsgfQogbG9uZyBXSU5BUEkgc3R1Yl9HRElfNTY5KHZvaWQpIHsgRklYTUUocmVsYXksICJzdHViXG4iKTsgcmV0dXJuIDA7IH0KLWxvbmcgV0lOQVBJIHN0dWJfS0VSTkVMXzQ1MCh2b2lkKSB7IEZJWE1FKHJlbGF5LCAic3R1YlxuIik7IHJldHVybiAwOyB9CiBsb25nIFdJTkFQSSBzdHViX1VTRVJfNDg5KHZvaWQpIHsgRklYTUUocmVsYXksICJzdHViXG4iKTsgcmV0dXJuIDA7IH0KIGxvbmcgV0lOQVBJIHN0dWJfVVNFUl80OTAodm9pZCkgeyBGSVhNRShyZWxheSwgInN0dWJcbiIpOyByZXR1cm4gMDsgfQogbG9uZyBXSU5BUEkgc3R1Yl9VU0VSXzQ5Mih2b2lkKSB7IEZJWE1FKHJlbGF5LCAic3R1YlxuIik7IHJldHVybiAwOyB9CkBAIC01Myw0ICs1MiwzIEBACiBsb25nIFdJTkFQSSBzdHViX1VTRVJfOTIwKHZvaWQpIHsgRklYTUUocmVsYXksICJzdHViXG4iKTsgcmV0dXJuIDA7IH0KIGxvbmcgV0lOQVBJIHN0dWJfVVNFUl85MjIodm9pZCkgeyBGSVhNRShyZWxheSwgInN0dWJcbiIpOyByZXR1cm4gMDsgfQogbG9uZyBXSU5BUEkgc3R1Yl9VU0VSXzkyMyh2b2lkKSB7IEZJWE1FKHJlbGF5LCAic3R1YlxuIik7IHJldHVybiAwOyB9Ci1sb25nIFdJTkFQSSBzdHViX0tFUk5FTF83MDAodm9pZCkgeyBGSVhNRShyZWxheSwgInN0dWJcbiIpOyByZXR1cm4gMTsgfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IDhmZGNjODguLmIyMDBiZGEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTExNyw4ICsxMTcsOCBAQAogMTA2IHBhc2NhbCBTZXRCaXRtYXBCaXRzKHdvcmQgbG9uZyBwdHIpIFNldEJpdG1hcEJpdHMxNgogMTE3IHBhc2NhbCBTZXREQ09yZyh3b3JkIHNfd29yZCBzX3dvcmQpIFNldERDT3JnCiAxMTkgcGFzY2FsMTYgQWRkRm9udFJlc291cmNlKHN0cikgQWRkRm9udFJlc291cmNlMTYKLSMxMjEgcGFzY2FsIERlYXRoCi0jMTIyIHBhc2NhbCBSZVN1clJlY3Rpb24KKzEyMSBzdHViIERlYXRoCisxMjIgc3R1YiBSZVN1clJlY3Rpb24KIDEyMyBwYXNjYWwxNiBQbGF5TWV0YUZpbGUod29yZCB3b3JkKSBQbGF5TWV0YUZpbGUxNgogMTI0IHBhc2NhbDE2IEdldE1ldGFGaWxlKHN0cikgR2V0TWV0YUZpbGUxNgogMTI1IHBhc2NhbDE2IENyZWF0ZU1ldGFGaWxlKHN0cikgQ3JlYXRlTWV0YUZpbGUxNgpAQCAtMTYxLDcgKzE2MSw3IEBACiAxOTEgcGFzY2FsICAgR2V0RENIb29rKHdvcmQgcHRyKSBUSFVOS19HZXREQ0hvb2sKIDE5MiBwYXNjYWwxNiBTZXRIb29rRmxhZ3Mod29yZCB3b3JkKSBTZXRIb29rRmxhZ3MKIDE5MyBzdHViIFNldEJvdW5kc1JlY3QKLTE5NCBzdHViIEdldEJvdW5kc1JlY3QKKzE5NCBwYXNjYWwxNiBHZXRCb3VuZHNSZWN0KHdvcmQgcHRyIHdvcmQpIEdldEJvdW5kc1JlY3QxNgogMTk1IHN0dWIgU2VsZWN0Qml0bWFwCiAxOTYgcGFzY2FsMTYgU2V0TWV0YUZpbGVCaXRzQmV0dGVyKHdvcmQpIFNldE1ldGFGaWxlQml0c0JldHRlcgogMjAxIHN0dWIgRE1CSVRCTFQKQEAgLTI4OSw3ICsyODksNyBAQAogNDYwIHN0dWIgR0RJVEFTS1RFUk1JTkFUSU9OCiA0NjEgcGFzY2FsMTYgU2V0T2JqZWN0T3duZXIod29yZCB3b3JkKSBTZXRPYmplY3RPd25lcjE2CiA0NjIgcGFzY2FsMTYgSXNHRElPYmplY3Qod29yZCkgSXNHRElPYmplY3QKLTQ2MyBzdHViIE1BS0VPQkpFQ1RQUklWQVRFCis0NjMgcGFzY2FsMTYgTWFrZU9iamVjdFByaXZhdGUod29yZCB3b3JkKSBNYWtlT2JqZWN0UHJpdmF0ZQogNDY0IHN0dWIgRklYVVBCT0dVU1BVQkxJU0hFUk1FVEFGSUxFCiA0NjUgcGFzY2FsMTYgUmVjdFZpc2libGUod29yZCBwdHIpIFJlY3RWaXNpYmxlMTYKIDQ2NiBwYXNjYWwxNiBSZWN0SW5SZWdpb24od29yZCBwdHIpIFJlY3RJblJlZ2lvbjE2CkBAIC0zMTUsNyArMzE1LDcgQEAKIDQ4NSBwYXNjYWwxNiBTY2FsZVdpbmRvd0V4dEV4KHdvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHB0cikKICAgICAgICAgICAgICBTY2FsZVdpbmRvd0V4dEV4MTYKIDQ4NiBwYXNjYWwxNiBHZXRBc3BlY3RSYXRpb0ZpbHRlckV4KHdvcmQgcHRyKSBHZXRBc3BlY3RSYXRpb0ZpbHRlckV4MTYKLTQ4OSBwYXNjYWwxNiBDcmVhdGVESUJTZWN0aW9uKHdvcmQgcHRyIHdvcmQgcHRyIHdvcmQgbG9uZykgQ3JlYXRlRElCU2VjdGlvbjE2Cis0ODkgcGFzY2FsMTYgQ3JlYXRlRElCU2VjdGlvbih3b3JkIHB0ciB3b3JkIHB0ciBsb25nIGxvbmcpIENyZWF0ZURJQlNlY3Rpb24xNgogNDkwIHN0dWIgQ2xvc2VFbmhNZXRhZmlsZQogNDkxIHN0dWIgQ29weUVuaE1ldGFmaWxlCiA0OTIgc3R1YiBDcmVhdGVFbmhNZXRhZmlsZQpAQCAtMzcxLDEwICszNzEsMTAgQEAKIDU1NiBwYXNjYWwxNiBHRElfNTU2KCkgc3R1Yl9HRElfNTU2CiA1NTggcGFzY2FsMTYgR0RJXzU1OCgpIHN0dWJfR0RJXzU1OAogNTY5IHBhc2NhbDE2IEdESV81NjkoKSBzdHViX0dESV81NjkKLTYwMiBzdHViIFNldERJQkNvbG9yVGFibGUKLTYwMyBzdHViIEdldERJQkNvbG9yVGFibGUKKzYwMiBwYXNjYWwxNiBTZXRESUJDb2xvclRhYmxlKHdvcmQgd29yZCB3b3JkIHB0cikgU2V0RElCQ29sb3JUYWJsZTE2Cis2MDMgcGFzY2FsMTYgR2V0RElCQ29sb3JUYWJsZSh3b3JkIHdvcmQgd29yZCBwdHIpIEdldERJQkNvbG9yVGFibGUxNgogNjA0IHN0dWIgU2V0U29saWRCcnVzaAotNjA1IHN0dWIgU3lzRGVsZXRlT2JqZWN0Cis2MDUgcGFzY2FsMTYgU3lzRGVsZXRlT2JqZWN0KHdvcmQpIERlbGV0ZU9iamVjdDE2ICAgICMgPz8/CiA2MDYgc3R1YiBTZXRNYWdpY0NvbG9ycwogNjA3IHN0dWIgR2V0UmVnaW9uRGF0YQogNjA4IHN0dWIgRXh0Q3JlYXRlUmVnaW9uCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggZjE1ZDU2OC4uOGIxNjFmOCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMiw2ICsyLDkgQEAKIHR5cGUJd2luMTYKIGZpbGUJa3JubDM4Ni5leGUKIAorIyAxLTIwNyBhcmUgdGhlIGJhc2ljIGZ1bmN0aW9ucywgdGhvc2UgYXJlICh3aXRoIG1pbm9yIHZhcmlhdGlvbnMpCisjIHByZXNlbnQgaW4gd2luMzEsIHdpbjk1IGFuZCBudDM1MQorCiAxICAgc3R1YiBGYXRhbEV4aXQKIDIgICBzdHViIEV4aXRLZXJuZWwKIDMgICBwYXNjYWwgR2V0VmVyc2lvbigpIEdldFZlcnNpb24xNgpAQCAtMTAyLDcgKzEwNSw3IEBACiAxMDEgc3R1YiBOb0hvb2tEb3NDYWxsCiAxMDIgcmVnaXN0ZXIgRE9TM0NhbGwoKSBET1MzQ2FsbAogMTAzIHJlZ2lzdGVyIE5ldEJJT1NDYWxsKCkgTmV0QklPU0NhbGwKLTEwNCBzdHViIEdldENvZGVJbmZvCisxMDQgcGFzY2FsMTYgR2V0Q29kZUluZm8oc2VncHRyIHB0cikgR2V0Q29kZUluZm8KIDEwNSBwYXNjYWwxNiBHZXRFeGVWZXJzaW9uKCkgR2V0RXhlVmVyc2lvbgogMTA2IHBhc2NhbCBTZXRTd2FwQXJlYVNpemUod29yZCkgU2V0U3dhcEFyZWFTaXplMTYKIDEwNyBwYXNjYWwxNiBTZXRFcnJvck1vZGUod29yZCkgU2V0RXJyb3JNb2RlMTYKQEAgLTIwNywyNiArMjEwLDMyIEBACiAyMDUgc3R1YiBDVldCcmVhawogMjA2IHBhc2NhbDE2IEFsbG9jU2VsZWN0b3JBcnJheSh3b3JkKSBBbGxvY1NlbGVjdG9yQXJyYXkKIDIwNyBwYXNjYWwxNiBJc0RCQ1NMZWFkQnl0ZSh3b3JkKSBJc0RCQ1NMZWFkQnl0ZTE2Ci0yMDggc3R1YiBLRVJORUxfMjA4Ci0yMDkgc3R1YiBLRVJORUxfMjA5Ci0yMTAgc3R1YiBLRVJORUxfMjEwCi0yMTEgc3R1YiBLRVJORUxfMjExCi0yMTMgc3R1YiBLRVJORUxfMjEzCi0yMTQgc3R1YiBLRVJORUxfMjE0Ci0yMTYgcGFzY2FsICAgUmVnRW51bUtleShsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ0VudW1LZXkxNgotMjE3IHBhc2NhbCAgIFJlZ09wZW5LZXkobG9uZyBzdHIgcHRyKSBSZWdPcGVuS2V5MTYKLTIxOCBwYXNjYWwgICBSZWdDcmVhdGVLZXkobG9uZyBzdHIgcHRyKSBSZWdDcmVhdGVLZXkxNgotMjE5IHBhc2NhbCAgIFJlZ0RlbGV0ZUtleShsb25nIHN0cikgUmVnRGVsZXRlS2V5MTYKLTIyMCBwYXNjYWwgICBSZWdDbG9zZUtleShsb25nKSBSZWdDbG9zZUtleQotMjIxIHBhc2NhbCAgIFJlZ1NldFZhbHVlKGxvbmcgc3RyIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlMTYKLTIyMiBwYXNjYWwgICBSZWdEZWxldGVWYWx1ZShsb25nIHN0cikgUmVnRGVsZXRlVmFsdWUxNgotMjIzIHBhc2NhbCAgIFJlZ0VudW1WYWx1ZShsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1WYWx1ZTE2Ci0yMjQgcGFzY2FsICAgUmVnUXVlcnlWYWx1ZShsb25nIHN0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlMTYKLTIyNSBwYXNjYWwgICBSZWdRdWVyeVZhbHVlRXgobG9uZyBzdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXgxNgotMjI2IHBhc2NhbCAgIFJlZ1NldFZhbHVlRXgobG9uZyBzdHIgbG9uZyBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZUV4MTYKLTIyNyBwYXNjYWwgICBSZWdGbHVzaEtleShsb25nKSBSZWdGbHVzaEtleQorCisKKyMgMjA4LTIzNyBhcmUgV2luOTUgZXh0ZW5zaW9uczsgYSBmZXcgb2YgdGhvc2UgYXJlIGFsc28gcHJlc2VudCBpbiBXaW5OVAorCisyMDggcGFzY2FsIEsyMDgod29yZCBsb25nIGxvbmcgbG9uZykgTG9jYWwzMkluaXQKKzIwOSBwYXNjYWwgSzIwOShsb25nIGxvbmcgd29yZCBsb25nKSBMb2NhbDMyQWxsb2MKKzIxMCBwYXNjYWwgSzIxMChsb25nIGxvbmcgd29yZCBsb25nIGxvbmcpIExvY2FsMzJSZUFsbG9jCisyMTEgcGFzY2FsIEsyMTEobG9uZyBsb25nIHdvcmQpIExvY2FsMzJGcmVlCisyMTMgcGFzY2FsIEsyMTMobG9uZyBsb25nIHdvcmQgd29yZCkgTG9jYWwzMlRyYW5zbGF0ZQorMjE0IHBhc2NhbCBLMjE0KGxvbmcgbG9uZyB3b3JkKSBMb2NhbDMyU2l6ZQorMjE1IHBhc2NhbCBLMjE1KGxvbmcgd29yZCkgTG9jYWwzMlZhbGlkSGFuZGxlICAjIFdpbjk1IG9ubHkgLS0gQ09ORkxJQ1QhCisjMjE1IHN0dWIgV09XU2hvdWxkV2VTYXlXaW45NSAgICAgICAgICAgICAgICAgICMgV2luTlQgb25seSAtLSBDT05GTElDVCEKKzIxNiBwYXNjYWwgUmVnRW51bUtleShsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ0VudW1LZXkxNiAgICAgICAgICAgICAgICAgICAgIyBCb3RoIDk1L05UCisyMTcgcGFzY2FsIFJlZ09wZW5LZXkobG9uZyBzdHIgcHRyKSBSZWdPcGVuS2V5MTYgICAgICAgICAgICAgICAgICAgICAgICAgICMgQm90aCA5NS9OVAorMjE4IHBhc2NhbCBSZWdDcmVhdGVLZXkobG9uZyBzdHIgcHRyKSBSZWdDcmVhdGVLZXkxNgorMjE5IHBhc2NhbCBSZWdEZWxldGVLZXkobG9uZyBzdHIpIFJlZ0RlbGV0ZUtleTE2CisyMjAgcGFzY2FsIFJlZ0Nsb3NlS2V5KGxvbmcpIFJlZ0Nsb3NlS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQm90aCA5NS9OVAorMjIxIHBhc2NhbCBSZWdTZXRWYWx1ZShsb25nIHN0ciBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZTE2CisyMjIgcGFzY2FsIFJlZ0RlbGV0ZVZhbHVlKGxvbmcgc3RyKSBSZWdEZWxldGVWYWx1ZTE2CisyMjMgcGFzY2FsIFJlZ0VudW1WYWx1ZShsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1WYWx1ZTE2ICMgQm90aCA5NS9OVAorMjI0IHBhc2NhbCBSZWdRdWVyeVZhbHVlKGxvbmcgc3RyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWUxNgorMjI1IHBhc2NhbCBSZWdRdWVyeVZhbHVlRXgobG9uZyBzdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXgxNgorMjI2IHBhc2NhbCBSZWdTZXRWYWx1ZUV4KGxvbmcgc3RyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeDE2CisyMjcgcGFzY2FsIFJlZ0ZsdXNoS2V5KGxvbmcpIFJlZ0ZsdXNoS2V5CiAyMjggc3R1YiBLMjI4Ci0yMjkgc3R1YiBLMjI5CisyMjkgcGFzY2FsMTYgSzIyOShsb25nKSBMb2NhbDMyR2V0U2VnbWVudAogMjMwIHBhc2NhbCBHbG9iYWxTbWFydFBhZ2VMb2NrKHdvcmQpIEdsb2JhbFBhZ2VMb2NrICM/CiAyMzEgc3R1YiBHbG9iYWxTbWFydFBhZ2VVbmxvY2sKIDIzMiBzdHViIFJlZ0xvYWRLZXkKQEAgLTIzNCw5ICsyNDMsMTkgQEAKIDIzNCBzdHViIFJlZ1NhdmVLZXkKIDIzNSBzdHViIEludmFsaWRhdGVObHNDYWNoZQogMjM2IHN0dWIgR2V0UHJvZHVjdE5hbWUKLTIzNyBzdHViIEtFUk5FTF8yMzcKLTI2MiBzdHViIEtFUk5FTF8yNjIKLTI2MyBzdHViIEtFUk5FTF8yNjMKKzIzNyBzdHViIEsyMzcKKworCisjIDI2Mi0yNzQgYXJlIFdpbk5UIGV4dGVuc2lvbnM7IHRob3NlIGFyZSBub3QgcHJlc2VudCBpbiBXaW45NQorCisyNjIgc3R1YiBXT1dXYWl0Rm9yTXNnQW5kRXZlbnQKKzI2MyBzdHViIFdPV01zZ0JveAorMjczIHN0dWIgSzI3MworMjc0IHN0dWIgR2V0U2hvcnRQYXRoTmFtZQorCisKKyMgMzEwLTM1NiBhcmUgYWdhaW4gc2hhcmVkIGJldHdlZW4gYWxsIHZlcnNpb25zCisKIDMxMCBwYXNjYWwxNiBMb2NhbEhhbmRsZURlbHRhKHdvcmQpIExvY2FsSGFuZGxlRGVsdGEKIDMxMSBwYXNjYWwgR2V0U2V0S2VybmVsRE9TUHJvYyhwdHIpIEdldFNldEtlcm5lbERPU1Byb2MKIDMxNCBzdHViIERlYnVnRGVmaW5lU2VnbWVudApAQCAtMjQ1LDEyICsyNjQsMTEgQEAKIDMxOCBzdHViIEZhdGFsRXhpdEhvb2sKIDMxOSBzdHViIEZsdXNoQ2FjaGVkRmlsZUhhbmRsZQogMzIwIHBhc2NhbDE2IElzVGFzayh3b3JkKSBJc1Rhc2sKLTMyMSBzdHViIEtFUk5FTF8zMjEKIDMyMyByZXR1cm4gSXNSb21Nb2R1bGUgMiAwCiAzMjQgcGFzY2FsMTYgTG9nRXJyb3Iod29yZCBwdHIpIExvZ0Vycm9yCiAzMjUgcGFzY2FsMTYgTG9nUGFyYW1FcnJvcih3b3JkIHB0ciBwdHIpIExvZ1BhcmFtRXJyb3IKIDMyNiByZXR1cm4gSXNSb21GaWxlIDIgMAotMzI3IHN0dWIgS0VSTkVMXzMyNworMzI3IHJlZ2lzdGVyIEszMjcoKSBMb2dQYXJhbUVycm9yUmVncwogMzI4IHN0dWIgX0RlYnVnT3V0cHV0CiAzMjkgcGFzY2FsMTYgSzMyOShzdHIgd29yZCkgRGVidWdGaWxsQnVmZmVyCiAzMzIgbG9uZyBUSEhPT0soMCAwIDAgMCAwIDAgMCAwKQpAQCAtMjU4LDExICsyNzYsMTEgQEAKIDMzNSBwYXNjYWwxNiBJc0JhZFdyaXRlUHRyKHNlZ3B0ciB3b3JkKSBJc0JhZFdyaXRlUHRyMTYKIDMzNiBwYXNjYWwxNiBJc0JhZENvZGVQdHIoc2VncHRyKSBJc0JhZENvZGVQdHIxNgogMzM3IHBhc2NhbDE2IElzQmFkU3RyaW5nUHRyKHNlZ3B0ciB3b3JkKSBJc0JhZFN0cmluZ1B0cjE2Ci0zMzggc3R1YiBIYXNHUEhhbmRsZXIKKzMzOCBwYXNjYWwxNiBIYXNHUEhhbmRsZXIoc2VncHRyKSBIYXNHUEhhbmRsZXIKIDMzOSBwYXNjYWwxNiBEaWFnUXVlcnkoKSBEaWFnUXVlcnkKIDM0MCBwYXNjYWwxNiBEaWFnT3V0cHV0KHN0cikgRGlhZ091dHB1dAogMzQxIHBhc2NhbCBUb29sSGVscEhvb2socHRyKSBUb29sSGVscEhvb2sKLTM0MiBzdHViIF9fR1AKKzM0MiB3b3JkIF9fR1AoMCAwIDAgMCkKIDM0MyBzdHViIFJlZ2lzdGVyV2luT2xkQXBIb29rCiAzNDQgc3R1YiBHZXRXaW5PbGRBcEhvb2tzCiAzNDUgcGFzY2FsMTYgSXNTaGFyZWRTZWxlY3Rvcih3b3JkKSBJc1NoYXJlZFNlbGVjdG9yCkBAIC0yNzEsMjIgKzI4OSw0MCBAQAogMzQ4IHBhc2NhbDE2IGhtZW1jcHkocHRyIHB0ciBsb25nKSBobWVtY3B5CiAzNDkgcGFzY2FsICAgX2hyZWFkKHdvcmQgc2VncHRyIGxvbmcpIFdJTjE2X2hyZWFkCiAzNTAgcGFzY2FsICAgX2h3cml0ZSh3b3JkIHB0ciBsb25nKSBfaHdyaXRlMTYKLSMzNTEgQlVOTllfMzUxCiszNTEgc3R1YiBCVU5OWV8zNTEKIDM1MiBwYXNjYWwgICBsc3RyY2F0bihzZWdzdHIgc3RyIHdvcmQpIGxzdHJjYXRuMTYKIDM1MyBwYXNjYWwgICBsc3RyY3B5bihzZWdwdHIgc3RyIHdvcmQpIGxzdHJjcHluMTYKIDM1NCBwYXNjYWwgICBHZXRBcHBDb21wYXRGbGFncyh3b3JkKSBHZXRBcHBDb21wYXRGbGFnczE2CiAzNTUgcGFzY2FsMTYgR2V0V2luRGVidWdJbmZvKHB0ciB3b3JkKSBHZXRXaW5EZWJ1Z0luZm8KIDM1NiBwYXNjYWwxNiBTZXRXaW5EZWJ1Z0luZm8ocHRyKSBTZXRXaW5EZWJ1Z0luZm8KKworCisjIDM1Ny0zNjUgYXJlIHByZXNlbnQgaW4gV2luOTUgb25seQorIyBOb3RlIHRoYXQgZnJvbSBoZXJlIG9uIG1vc3Qgb2YgdGhlIFdpbjk1LW9ubHkgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCAKKyMgb3JkaW5hbC1vbmx5OyB0aGUgbmFtZXMgZ2l2ZW4gaGVyZSBhcmUgbW9zdGx5IGd1ZXNzZXMgOi0pCisKIDM1NyBwYXNjYWwgTWFwU0woc2VncHRyKSBNYXBTTAogMzU4IHBhc2NhbCBNYXBMUyhsb25nKSBNYXBMUwogMzU5IHBhc2NhbCBVbk1hcExTKHNlZ3B0cikgVW5NYXBMUwogMzYwIHBhc2NhbDE2IE9wZW5GaWxlRXgoc3RyIHB0ciB3b3JkKSBPcGVuRmlsZTE2Ci0jMzYxIFBJR0xFVF8zNjEKKzM2MSByZXR1cm4gUElHTEVUXzM2MSAwIDAKKzM2MiBzdHViIFRodW5rVGVybWluYXRlUHJvY2VzcwogMzY1IHN0dWIgS0VSTkVMXzM2NQorCisKKyMgNDAzLTQwNCBhcmUgY29tbW9uIHRvIGFsbCB2ZXJzaW9ucworCiA0MDMgcGFzY2FsMTYgRmFyU2V0T3duZXIod29yZCB3b3JkKSBGYXJTZXRPd25lcgogNDA0IHBhc2NhbDE2IEZhckdldE93bmVyKHdvcmQpIEZhckdldE93bmVyCisKKworIyA0MDYtNDk0IGFyZSBwcmVzZW50IG9ubHkgaW4gV2luOTUKKwogNDA2IHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdAogNDA3IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTdHJ1Y3QKKzQwOCBzdHViIEtFUk5FTF80MDgKKzQwOSBzdHViIEtFUk5FTF80MDkKKzQxMCBzdHViIENyZWF0ZVByb2Nlc3NGcm9tV2luRXhlYwogNDExIHBhc2NhbCAgIEdldEN1cnJlbnREaXJlY3RvcnkobG9uZyBwdHIpIEdldEN1cnJlbnREaXJlY3RvcnkxNgogNDEyIHBhc2NhbDE2IFNldEN1cnJlbnREaXJlY3RvcnkocHRyKSBTZXRDdXJyZW50RGlyZWN0b3J5MTYKIDQxMyBwYXNjYWwxNiBGaW5kRmlyc3RGaWxlKHB0ciBwdHIpIEZpbmRGaXJzdEZpbGUxNgpAQCAtMjk5LDM3ICszMzUsNzYgQEAKIDQyMCBwYXNjYWwgICBHZXRGaWxlQXR0cmlidXRlcyhwdHIpIEdldEZpbGVBdHRyaWJ1dGVzMTYKIDQyMSBwYXNjYWwxNiBTZXRGaWxlQXR0cmlidXRlcyhwdHIgbG9uZykgU2V0RmlsZUF0dHJpYnV0ZXMxNgogNDIyIHBhc2NhbDE2IEdldERpc2tGcmVlU3BhY2UocHRyIHB0ciBwdHIgcHRyIHB0cikgR2V0RGlza0ZyZWVTcGFjZTE2IAorNDIzIHN0dWIgTG9nQXBpVGhrCiA0MzEgcGFzY2FsMTYgSXNQZUZvcm1hdChzdHIgd29yZCkgSXNQZUZvcm1hdAogNDMyIHN0dWIgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUKIDQzNCBzdHViIEtFUk5FTF80MzQKLTQzNSBzdHViIEtFUk5FTF80MzUKLTQzOSBzdHViIEtFUk5FTF80MzkKLTQ0MCBzdHViIEtFUk5FTF80NDAKLTQ0NCBzdHViIEtFUk5FTF80NDQKLTQ0NSBzdHViIEtFUk5FTF80NDUKLTQ0NiBzdHViIEtFUk5FTF80NDYKKzQzNSBzdHViIEdldFRhc2tGbGFncworNDM2IHN0dWIgX0NvbmZpcm1TeXNMZXZlbAorNDM3IHN0dWIgX0NoZWNrTm90U3lzTGV2ZWwKKzQzOCBzdHViIF9DcmVhdGVTeXNMZXZlbAorNDM5IHN0dWIgX0VudGVyU3lzTGV2ZWwKKzQ0MCBzdHViIF9MZWF2ZVN5c0xldmVsCis0NDEgcGFzY2FsIENyZWF0ZVRocmVhZDE2KHB0ciBsb25nIHNlZ3B0ciBzZWdwdHIgbG9uZyBwdHIpIFRIVU5LX0NyZWF0ZVRocmVhZDE2Cis0NDIgcGFzY2FsIFZXaW4zMl9FdmVudENyZWF0ZSgpIFZXaW4zMl9FdmVudENyZWF0ZQorNDQzIHBhc2NhbCBWV2luMzJfRXZlbnREZXN0cm95KGxvbmcpIFZXaW4zMl9FdmVudERlc3Ryb3kKKzQ0NCBzdHViIEtFUk5FTF80NDQgICAgICMgTG9jYWwzMiA/Pz8KKzQ0NSBzdHViIEtFUk5FTF80NDUgICAgICMgTG9jYWwzMiA/Pz8KKzQ0NiBzdHViIEtFUk5FTF80NDYgICAgICMgTG9jYWwzMiA/Pz8KIDQ0NyBzdHViIEtFUk5FTF80NDcKKzQ0OCBzdHViIEtFUk5FTF80NDgKIDQ0OSBwYXNjYWwgR2V0cFdpbjE2TG9jaygpIEdldHBXaW4xNkxvY2sxNgotNDUwIHBhc2NhbDE2IEtFUk5FTF80NTAoKSBzdHViX0tFUk5FTF80NTAKLTQ1MiBzdHViIEtFUk5FTF80NTIKLTQ1MyBzdHViIEtFUk5FTF80NTMKKzQ1MCBwYXNjYWwgVldpbjMyX0V2ZW50V2FpdChsb25nKSBWV2luMzJfRXZlbnRXYWl0Cis0NTEgcGFzY2FsIFZXaW4zMl9FdmVudFNldChsb25nKSBWV2luMzJfRXZlbnRTZXQKKzQ1MiBwYXNjYWwgTG9hZExpYnJhcnkzMihzdHIpIExvYWRMaWJyYXJ5MzJBCis0NTMgcGFzY2FsIEdldFByb2NBZGRyZXNzMzIobG9uZyBzdHIpIEdldFByb2NBZGRyZXNzMzIKIDQ1NCBlcXVhdGUgX19GTEFUQ1MgMCAgICMgaW5pdGlhbGl6ZWQgYnkgQlVJTFRJTl9Jbml0KCkKIDQ1NSBlcXVhdGUgX19GTEFURFMgMCAgICMgaW5pdGlhbGl6ZWQgYnkgQlVJTFRJTl9Jbml0KCkKLTQ3MSBwYXNjYWwgS0VSTkVMXzQ3MSgpIF9LRVJORUxfNDcxCi00NzIgcmVnaXN0ZXIgS0VSTkVMXzQ3MigpIF9LRVJORUxfNDcyCi00NzMgc3R1YiBLRVJORUxfNDczCi00NzUgcmVnaXN0ZXIgS0VSTkVMXzQ3NSgpIF9LRVJORUxfNDc1Ci00ODAgc3R1YiBLRVJORUxfNDgwCi00ODEgc3R1YiBLRVJORUxfNDgxCi00ODIgcGFzY2FsIExvYWRMaWJyYXJ5MzIoc3RyKSBMb2FkTGlicmFyeTMyQQorNDU2IHBhc2NhbCBEZWZSZXNvdXJjZUhhbmRsZXIod29yZCB3b3JkIHdvcmQpIE5FX0RlZlJlc291cmNlSGFuZGxlcgorNDU3IHBhc2NhbCBDcmVhdGVXMzJFdmVudChsb25nIGxvbmcpIFdJTjE2X0NyZWF0ZUV2ZW50Cis0NTggcGFzY2FsIFNldFczMkV2ZW50KGxvbmcpIFNldEV2ZW50Cis0NTkgcGFzY2FsIFJlc2V0VzMyRXZlbnQobG9uZykgUmVzZXRFdmVudAorNDYwIHBhc2NhbCBXYWl0Rm9yU2luZ2xlT2JqZWN0KGxvbmcgbG9uZykgV0lOMTZfV2FpdEZvclNpbmdsZU9iamVjdAorNDYxIHBhc2NhbCBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKGxvbmcgcHRyIGxvbmcgbG9uZykgV0lOMTZfV2FpdEZvck11bHRpcGxlT2JqZWN0cworNDYyIHBhc2NhbCBHZXRDdXJyZW50VGhyZWFkSWQoKSBHZXRDdXJyZW50VGhyZWFkSWQKKzQ2MyBwYXNjYWwgU2V0VGhyZWFkUXVldWUobG9uZyB3b3JkKSBTZXRUaHJlYWRRdWV1ZQorNDY0IHBhc2NhbCBHZXRUaHJlYWRRdWV1ZShsb25nKSBHZXRUaHJlYWRRdWV1ZQorNDY1IHN0dWIgTnVrZVByb2Nlc3MKKzQ2NiBzdHViIEV4aXRQcm9jZXNzCis0Njcgc3R1YiBXT0FDcmVhdGVDb25zb2xlCis0Njggc3R1YiBXT0FTcGF3bkNvbkFwcAorNDY5IHN0dWIgV09BR2ltbWVUaXRsZQorNDcwIHN0dWIgV09BRGVzdHJveUNvbnNvbGUKKzQ3MSBwYXNjYWwgR2V0Q3VycmVudFByb2Nlc3NJZCgpIEdldEN1cnJlbnRQcm9jZXNzSWQKKzQ3MiByZWdpc3RlciBNYXBISW5zdExTKCkgV0lOMTZfTWFwSEluc3RMUworNDczIHJlZ2lzdGVyIE1hcEhJbnN0U0woKSBXSU4xNl9NYXBISW5zdFNMCis0NzQgcGFzY2FsIENsb3NlVzMySGFuZGxlKGxvbmcpIENsb3NlSGFuZGxlCis0NzUgcmVnaXN0ZXIgR2V0VEVCU2VsZWN0b3JGUygpIEdldFRFQlNlbGVjdG9yRlMKKzQ3NiBwYXNjYWwgQ29udmVydFRvR2xvYmFsSGFuZGxlKGxvbmcpIENvbnZlcnRUb0dsb2JhbEhhbmRsZQorNDc3IHN0dWIgV09BRnVsbFNjcmVlbgorNDc4IHN0dWIgV09BVGVybWluYXRlUHJvY2VzcworNDc5IHBhc2NhbCBLRVJORUxfNDc5KGxvbmcpIFZXaW4zMl9FdmVudFNldCAgIyA/Pz8KKzQ4MCBwYXNjYWwxNiBfRW50ZXJXaW4xNkxvY2soKSBTWVNMRVZFTF9FbnRlcldpbjE2TG9jaworNDgxIHBhc2NhbDE2IF9MZWF2ZVdpbjE2TG9jaygpIFNZU0xFVkVMX0xlYXZlV2luMTZMb2NrCis0ODIgcGFzY2FsIExvYWRTeXN0ZW1MaWJyYXJ5MzIoc3RyKSBMb2FkTGlicmFyeTMyQSAgICMgRklYTUUhCis0ODMgcGFzY2FsIEdldE1vZHVsZUZpbGVOYW1lMzIobG9uZyBzdHIgbG9uZykgR2V0TW9kdWxlRmlsZU5hbWUzMkEKKzQ4NCBwYXNjYWwgU2V0UHJvY2Vzc0RXT1JEKGxvbmcgc193b3JkIGxvbmcpIFNldFByb2Nlc3NEd29yZAogNDg1IHBhc2NhbCBHZXRQcm9jZXNzRFdPUkQobG9uZyBzX3dvcmQpIEdldFByb2Nlc3NEd29yZAotNDg2IHN0dWIgS0VSTkVMXzQ4NgorNDg2IHBhc2NhbCBGcmVlTGlicmFyeTMyKGxvbmcpIEZyZWVMaWJyYXJ5MzIKKzQ4NyBzdHViIE1hcFByb2Nlc3NIYW5kbGUKKzQ4OCBwYXNjYWwgR2V0TW9kdWxlSGFuZGxlMzIoc3RyKSBHZXRNb2R1bGVIYW5kbGUzMkEKKzQ4OSBzdHViIEtFUk5FTF80ODkgICMgVldpbjMyX0Jvb3N0V2l0aERlY2F5Cis0OTAgc3R1YiBLRVJORUxfNDkwCiA0OTEgc3R1YiBSZWdpc3RlclNlcnZpY2VQcm9jZXNzCis0OTIgc3R1YiBXT0FBYm9ydAorNDkzIHN0dWIgVVRJbml0Cis0OTQgc3R1YiBLRVJORUxfNDk0CiAKLSMgVGhvc2Ugc3R1YnMgY2FuIGJlIGZvdW5kIGluIFdpbmRvd05UMy41MSBrcm5sMzg2LmV4ZS4gU29tZSBhcmUgdXNlZCBieSBXaW45NQotIyB0b28sIHNvbWUgc2VlbSB0byBzcGVjaWZ5IGRpZmZlcmVudCBmdW5jdGlvbnMgaW4gV2luOTUuLi4gVWdoLgorCisjIDUwMC01NDQgYXJlIFdpbk5UIGV4dGVuc2lvbnM7IHNvbWUgYXJlIGFsc28gYXZhaWxhYmxlIGluIFdpbjk1CisKIDUwMCBwYXNjYWwgV09XMTZDYWxsKHdvcmQgd29yZCB3b3JkKSBXT1cxNkNhbGwKLTUwMSBzdHViIEtEREJHT1VUCis1MDEgc3R1YiBLRERCR09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBCb3RoIE5ULzk1ICg/KQogNTAyIHN0dWIgV09XR0VUTkVYVFZETUNPTU1BTkQKIDUwMyBzdHViIFdPV1JFR0lTVEVSU0hFTExXSU5ET1dIQU5ETEUKIDUwNCBzdHViIFdPV0xPQURNT0RVTEUKQEAgLTM0MCwxNCArNDE1LDE0IEBACiA1MDkgc3R1YiBXT1dLSUxMUkVNT1RFVEFTSwogNTExIHN0dWIgV09XS0lMTFJFTU9URVRBU0sKIDUxMiBzdHViIFdPV1FVRVJZREVCVUcKLTUxMyBwYXNjYWwgICBMb2FkTGlicmFyeUV4MzJXKHB0ciBsb25nIGxvbmcpIExvYWRMaWJyYXJ5RXgzMlcxNgotNTE0IHBhc2NhbDE2IEZyZWVMaWJyYXJ5MzJXKGxvbmcpIEZyZWVMaWJyYXJ5MzIKLTUxNSBwYXNjYWwgICBHZXRQcm9jQWRkcmVzczMyVyhsb25nIHN0cikgR2V0UHJvY0FkZHJlc3MzMgotNTE2IHBhc2NhbCBHZXRWRE1Qb2ludGVyMzJXKHNlZ3B0ciBsb25nKSBHZXRWRE1Qb2ludGVyMzJXCi01MTcgcGFzY2FsIENhbGxQcm9jMzJXKCkgV0lOMTZfQ2FsbFByb2MzMlcKLTUxOCBwYXNjYWwgQ2FsbFByb2NFeDMyVygpIFdJTjE2X0NhbGxQcm9jRXgzMlcgCis1MTMgcGFzY2FsICAgTG9hZExpYnJhcnlFeDMyVyhwdHIgbG9uZyBsb25nKSBMb2FkTGlicmFyeUV4MzJXMTYgIyBCb3RoIE5ULzk1Cis1MTQgcGFzY2FsMTYgRnJlZUxpYnJhcnkzMlcobG9uZykgRnJlZUxpYnJhcnkzMiAgICAgICAgICAgICAgICAgIyBCb3RoIE5ULzk1Cis1MTUgcGFzY2FsICAgR2V0UHJvY0FkZHJlc3MzMlcobG9uZyBzdHIpIEdldFByb2NBZGRyZXNzMzIgICAgICAgIyBCb3RoIE5ULzk1Cis1MTYgcGFzY2FsICAgR2V0VkRNUG9pbnRlcjMyVyhzZWdwdHIgbG9uZykgR2V0VkRNUG9pbnRlcjMyVyAgICAgIyBCb3RoIE5ULzk1Cis1MTcgcGFzY2FsICAgQ2FsbFByb2MzMlcoKSBXSU4xNl9DYWxsUHJvYzMyVyAgICAgICAgICAgICAgICAgICAgIyBCb3RoIE5ULzk1Cis1MTggcGFzY2FsICAgQ2FsbFByb2NFeDMyVygpIFdJTjE2X0NhbGxQcm9jRXgzMlcgICAgICAgICAgICAgICAgIyBCb3RoIE5ULzk1CiA1MTkgc3R1YiBFWElUS0VSTkVMVEhVTksKLSMgdGhlIF9fTU9EXyB2YXJpYWJsZXMgYXJlIFdPUkQgZGF0YXJlZmVyZW5jZXMuCisjIHRoZSBfX01PRF8gdmFyaWFibGVzIGFyZSBXT1JEIGRhdGFyZWZlcmVuY2VzLCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGludmVudGVkLgogNTIwIGVxdWF0ZSBfX01PRF9LRVJORUwgNDIwMAogNTIxIGVxdWF0ZSBfX01PRF9ES0VSTkVMIDQyMDEKIDUyMiBlcXVhdGUgX19NT0RfVVNFUiA0MjAzCkBAIC0zNjEsMjUgKzQzNiw4MyBAQAogNTMwIGVxdWF0ZSBfX01PRF9UT09MSEVMUCA0MjExCiA1MzEgZXF1YXRlIF9fTU9EX01NRURJQSA0MjEyCiA1MzIgZXF1YXRlIF9fTU9EX0NPTU1ETEcgNDIxMwotNTQwIHN0dWIgS0VSTkVMXzU0MAogNTQxIHN0dWIgV09XU0VURVhJVE9OTEFTVEFQUAogNTQ0IHN0dWIgV09XU0VUQ09NUEFUSEFORExFCiAKLTYwMCBzdHViIEtFUk5FTF82MDAKLTYwMSBzdHViIEtFUk5FTF82MDEKLTYwNCBzdHViIEtFUk5FTF82MDQKLTYwNSBzdHViIEtFUk5FTF82MDUKLTYwNiBzdHViIEtFUk5FTF82MDYKLTYwNyBwYXNjYWwgS0VSTkVMXzYwNyhsb25nIGxvbmcgbG9uZykgX0tFUk5FTF82MDcKLTYwOCBwYXNjYWwgS0VSTkVMXzYwOChsb25nIGxvbmcgbG9uZykgX0tFUk5FTF82MDgKLTYxMSBwYXNjYWwgS0VSTkVMXzYxMShsb25nIGxvbmcpIF9LRVJORUxfNjExCi02MTIgc3R1YiBLRVJORUxfNjEyCi02MTMgc3R1YiBLRVJORUxfNjEzCi02MTQgc3R1YiBLRVJORUxfNjE0Ci02MTkgcGFzY2FsIEtFUk5FTF82MTkod29yZCBsb25nIGxvbmcpIF9LRVJORUxfNjE5Ci02MjEgc3R1YiBLRVJORUxfNjIxCisKKyMgNTMxLTU2OCBhcmUgV2luOTUtb25seSBleHRlbnNpb25zLgorIyBOT1RFOiBPcmRpbmFscyA1MzEsNTMyLDU0MSBjbGFzaCB3aXRoIHRoZSBXaW5OVCBleHRlbnNpb25zIGdpdmVuIGFib3ZlISBBcmdoIQorCisjNTMxIHN0dWIgQ29udmVydENsaXBib2FyZEhhbmRsZUxTCisjNTMyIHN0dWIgQ29udmVydENsaXBib2FyZEhhbmRsZVNMCis1MzMgc3R1YiBDb252ZXJ0RERFSGFuZGxlTFMKKzUzNCBzdHViIENvbnZlcnREREVIYW5kbGVTTAorNTM1IHBhc2NhbCBWV2luMzJfQm9vc3RUaHJlYWRHcm91cChsb25nIGxvbmcpIFZXaW4zMl9Cb29zdFRocmVhZEdyb3VwCis1MzYgcGFzY2FsIFZXaW4zMl9Cb29zdFRocmVhZFN0YXRpYyhsb25nIGxvbmcpIFZXaW4zMl9Cb29zdFRocmVhZFN0YXRpYworNTM3IHN0dWIgS0VSTkVMXzUzNworNTM4IHN0dWIgVGh1bmtUaGVUZW1wbGF0ZUhhbmRsZQorNTQwIHN0dWIgS0VSTkVMXzU0MAorIzU0MSBzdHViIEtFUk5FTF81NDEKKzU0MiBzdHViIEtFUk5FTF81NDIKKzU0MyBzdHViIEtFUk5FTF81NDMKKzU2MCBzdHViIEtFUk5FTF81NjAgICMgKHRodW5rbGV0KSAgIyBJbml0VGh1bmtsZXRIYW5kbGVyCis1NjEgc3R1YiBLRVJORUxfNTYxICAjICh0aHVua2xldCkgICMgQWxsb2NMU1RodW5rbGV0Cis1NjIgc3R1YiBLRVJORUxfNTYyICAjICh0aHVua2xldCkgICMgQWxsb2NTTFRodW5rbGV0Cis1NjMgc3R1YiBLRVJORUxfNTYzICAjICh0aHVua2xldCkgICMgRmluZFNMVGh1bmtsZXQKKzU2NCBzdHViIEtFUk5FTF81NjQgICMgKHRodW5rbGV0KSAgIyBGaW5kTFNUaHVua2xldAorNTY1IHN0dWIgS0VSTkVMXzU2NSAgIyAodGh1bmtsZXQpICAjIEFsbG9jTFNUaHVua2xldF9TcGVjaWFsCis1NjYgc3R1YiBLRVJORUxfNTY2ICAjICh0aHVua2xldCkgICMgQWxsb2NTTFRodW5rbGV0X1NwZWNpYWwKKzU2NyBzdHViIEtFUk5FTF81NjcgICMgKHRodW5rbGV0KSAgIyBBbGxvY0xTVGh1bmtsZXRFeAorNTY4IHN0dWIgS0VSTkVMXzU2OCAgIyAodGh1bmtsZXQpICAjIEFsbG9jU0xUaHVua2xldEV4CisKKworIyA2MDAtNjUzIGFyZSBXaW45NSBvbmx5CisKKzYwMCBzdHViIEtFUk5FTF82MDAgICMgQWxsb2NTZWxlY3RvciAoPykKKzYwMSBzdHViIEtFUk5FTF82MDEgICMgRnJlZVNlbGVjdG9yICg/KQorNjAyIHN0dWIgR2V0Q3VycmVudEhJbnN0YW5jZURTCis2MDMgc3R1YiBLRVJORUxfNjAzICAjIE91dHB1dERlYnVnU3RyaW5nICg/KQorNjA0IHN0dWIgS0VSTkVMXzYwNCAgIyAoY2JjbGllbnQpICMgVGh1bmtfQ0JDbGllbnQKKzYwNSBzdHViIEtFUk5FTF82MDUgICMgKHRodW5rbGV0KSAjIEFsbG9jU0xUaHVua2xldAorNjA2IHN0dWIgS0VSTkVMXzYwNiAgIyAodGh1bmtsZXQpICMgQWxsb2NMU1RodW5rbGV0Cis2MDcgcGFzY2FsIEtFUk5FTF82MDcobG9uZyBsb25nIGxvbmcpIF9LRVJORUxfNjA3ICAjIEFsbG9jTFNUaHVua2xldF9TeXN0aHVuaworNjA4IHBhc2NhbCBLRVJORUxfNjA4KGxvbmcgbG9uZyBsb25nKSBfS0VSTkVMXzYwOCAgIyBBbGxvY1NMVGh1bmtsZXRfU3lzdGh1bmsKKzYwOSBzdHViIEtFUk5FTF82MDkgICMgKHRodW5rbGV0KSAjIEZpbmRTTFRodW5rbGV0Cis2MTAgc3R1YiBLRVJORUxfNjEwICAjICh0aHVua2xldCkgIyBGaW5kTFNUaHVua2xldAorNjExIHBhc2NhbDE2IEtFUk5FTF82MTEobG9uZyBsb25nKSBfS0VSTkVMXzYxMSAgIyBGcmVlVGh1bmtsZXQKKzYxMiBwYXNjYWwxNiBLRVJORUxfNjEyKHB0cikgX0tFUk5FTF82MTIgICMgSXNTTFRodW5rbGV0Cis2MTMgc3R1YiBLRVJORUxfNjEzICAjIChjYmNsaWVudCkKKzYxNCBzdHViIEtFUk5FTF82MTQgICMgKGNiY2xpZW50KQorNjE1IHN0dWIgS0VSTkVMXzYxNSAgIyAoY2JjbGllbnQpCis2MTYgc3R1YiBLRVJORUxfNjE2ICAjIChjYmNsaWVudCkKKzYxNyBzdHViIEtFUk5FTF82MTcgICMgKGNiY2xpZW50KQorNjE4IHN0dWIgS0VSTkVMXzYxOCAgIyAoY2JjbGllbnQpCis2MTkgcGFzY2FsMTYgUmVnaXN0ZXJDQkNsaWVudCh3b3JkIGxvbmcgbG9uZykgUmVnaXN0ZXJDQkNsaWVudAorNjIwIHN0dWIgS0VSTkVMXzYyMCAgIyAoY2JjbGllbnQpCis2MjEgc3R1YiBLRVJORUxfNjIxICAjIChjYmNsaWVudCkKKzYyMiBzdHViIFVuUmVnaXN0ZXJDQkNsaWVudAorNjIzIHBhc2NhbDE2IEluaXRDQkNsaWVudChsb25nKSBJbml0Q0JDbGllbnQKKzYyNCBwYXNjYWwgU2V0RmFzdFF1ZXVlKGxvbmcgbG9uZykgU2V0RmFzdFF1ZXVlCis2MjUgcGFzY2FsIEdldEZhc3RRdWV1ZSgpIEdldEZhc3RRdWV1ZQorNjI2IHN0dWIgU21hc2hFbnZpcm9ubWVudAogNjI3IHN0dWIgSXNCYWRGbGF0UmVhZFdyaXRlUHRyCiA2MzAgcmVnaXN0ZXIgQzE2VGhrU0woKSBDMTZUaGtTTAogNjMxIHJlZ2lzdGVyIEMxNlRoa1NMMDEoKSBDMTZUaGtTTDAxCiA2NTEgcGFzY2FsIFRodW5rQ29ubmVjdDE2KHN0ciBzdHIgd29yZCBsb25nIHB0ciBzdHIgd29yZCkgVGh1bmtDb25uZWN0MTYKLTcwMCBwYXNjYWwgS0VSTkVMXzcwMCgpIHN0dWJfS0VSTkVMXzcwMAorNjUyIHN0dWIgSXNUaHJlYWRJZAorNjUzIHN0dWIgT2tXaXRoS2VybmVsVG9DaGFuZ2VVc2VycworCisKKyMgNzAwLTcwNCBhcmUgV2luOTUgb25seQorCis3MDAgcGFzY2FsIFNTSW5pdCgpIFNTSW5pdAorNzAxIHN0dWIgU1NPbkJpZ1N0YWNrCis3MDIgc3R1YiBTU0NhbGwKKzcwMyBzdHViIENhbGxQcm9jMzJXRml4Cis3MDQgc3R1YiBTU0NvbmZpcm1TbWFsbFN0YWNrCisKKworIyBXaW45NSBrcm5sMzg2LmV4ZSBhbHNvIGV4cG9ydHMgb3JkaW5hbHMgODAyLTg2NCwKKyMgaG93ZXZlciwgdGhvc2Ugc2VlbSB0byBiZSBvbmx5IGNhbGxiYWNrIHN0dWJzIHRoYXQgYXJlCisjIG5ldmVyIGNhbGxlZCBkaXJlY3RseSBieSBvdGhlciBtb2R1bGVzIC4uLgorCmRpZmYgLS1naXQgYS9pZjE2MzIva2V5Ym9hcmQuc3BlYyBiL2lmMTYzMi9rZXlib2FyZC5zcGVjCmluZGV4IDUwZTk5NjAuLjE4OWM1OWUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXlib2FyZC5zcGVjCisrKyBiL2lmMTYzMi9rZXlib2FyZC5zcGVjCkBAIC0xLDkgKzEsOSBAQAogbmFtZQlrZXlib2FyZAogdHlwZQl3aW4xNgogCi0jMQlwYXNjYWwJSW5xdWlyZQotIzIJcGFzY2FsCUVuYWJsZQotIzMJcGFzY2FsCURpc2FibGUKKzEgICBwYXNjYWwxNiBJbnF1aXJlKHB0cikgS2V5Ym9hcmRJbnF1aXJlCisyICAgcGFzY2FsMTYgRW5hYmxlKHNlZ3B0ciBwdHIpIEtleWJvYXJkRW5hYmxlCiszICAgcGFzY2FsMTYgRGlzYWJsZSgpIEtleWJvYXJkRGlzYWJsZQogNCAgIHBhc2NhbDE2IFRvQXNjaWkod29yZCB3b3JkIHB0ciBwdHIgd29yZCkgVG9Bc2NpaTE2CiA1ICAgcGFzY2FsMTYgQW5zaVRvT2VtKHN0ciBwdHIpIEFuc2lUb09lbTE2CiA2ICAgcGFzY2FsMTYgT2VtVG9BbnNpKHN0ciBwdHIpIE9lbVRvQW5zaTE2CmRpZmYgLS1naXQgYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCmluZGV4IGQxM2FlMTIuLmQ3MDEyNmMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjCisrKyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCkBAIC00OSw3ICs0OSw3IEBACiAzMDEgICAgcGFzY2FsICBtaWRpSW5HZXROdW1EZXZzKCkgbWlkaUluR2V0TnVtRGV2czE2CiAzMDIgICAgcGFzY2FsICBtaWRpSW5HZXREZXZDYXBzKHdvcmQgcHRyIHdvcmQpIG1pZGlJbkdldERldkNhcHMxNgogMzAzICAgIHBhc2NhbCAgbWlkaUluR2V0RXJyb3JUZXh0KHdvcmQgcHRyIHdvcmQpIG1pZGlJbkdldEVycm9yVGV4dDE2Ci0zMDQgICAgcGFzY2FsICBtaWRpSW5PcGVuKHB0ciB3b3JkIHB0ciBsb25nIGxvbmcgbG9uZykgbWlkaUluT3BlbjE2CiszMDQgICAgcGFzY2FsICBtaWRpSW5PcGVuKHB0ciB3b3JkIGxvbmcgbG9uZyBsb25nKSBtaWRpSW5PcGVuMTYKIDMwNSAgICBwYXNjYWwgIG1pZGlJbkNsb3NlKHdvcmQpIG1pZGlJbkNsb3NlMTYKIDMwNiAgICBwYXNjYWwgIG1pZGlJblByZXBhcmVIZWFkZXIod29yZCBwdHIgd29yZCkgbWlkaUluUHJlcGFyZUhlYWRlcjE2CiAzMDcgICAgcGFzY2FsICBtaWRpSW5VbnByZXBhcmVIZWFkZXIod29yZCBwdHIgd29yZCkgbWlkaUluVW5wcmVwYXJlSGVhZGVyMTYKQEAgLTE1NSw3ICsxNTUsNyBAQAogMTIxMyAgIHBhc2NhbCAgbW1pb1dyaXRlKHdvcmQgcHRyIGxvbmcpIG1taW9Xcml0ZTE2CiAxMjE0ICAgcGFzY2FsICBtbWlvU2Vlayh3b3JkIGxvbmcgd29yZCkgbW1pb1NlZWsxNgogMTIxNSAgIHBhc2NhbCAgbW1pb0dldEluZm8od29yZCBwdHIgd29yZCkgbW1pb0dldEluZm8xNgotMTIxNiAgIHBhc2NhbCAgTU1JT1NFVElORk8od29yZCBwdHIgd29yZCkgbW1pb1NldEluZm8KKzEyMTYgICBwYXNjYWwgIE1NSU9TRVRJTkZPKHdvcmQgcHRyIHdvcmQpIG1taW9TZXRJbmZvMTYKIDEyMTcgICBwYXNjYWwgIE1NSU9TRVRCVUZGRVIod29yZCBwdHIgbG9uZyB3b3JkKSBtbWlvU2V0QnVmZmVyCiAxMjE4ICAgcGFzY2FsICBtbWlvRmx1c2god29yZCB3b3JkKSBtbWlvRmx1c2gxNgogMTIxOSAgIHBhc2NhbCAgbW1pb0FkdmFuY2Uod29yZCBwdHIgd29yZCkgbW1pb0FkdmFuY2UxNgpkaWZmIC0tZ2l0IGEvaWYxNjMyL21vdXNlLnNwZWMgYi9pZjE2MzIvbW91c2Uuc3BlYwppbmRleCBmYTVkYWM4Li4zNzlmM2U1IDEwMDY0NAotLS0gYS9pZjE2MzIvbW91c2Uuc3BlYworKysgYi9pZjE2MzIvbW91c2Uuc3BlYwpAQCAtMSw5ICsxLDkgQEAKIG5hbWUJbW91c2UKIHR5cGUJd2luMTYKIAotMSBzdHViIElOUVVJUkUKLTIgc3R1YiBFTkFCTEUKLTMgc3R1YiBESVNBQkxFCisxIHBhc2NhbDE2IElucXVpcmUocHRyKSBNb3VzZUlucXVpcmUKKzIgcGFzY2FsMTYgRW5hYmxlKHNlZ3B0cikgTW91c2VFbmFibGUKKzMgcGFzY2FsMTYgRGlzYWJsZSgpIE1vdXNlRGlzYWJsZQogNCBzdHViIE1PVVNFR0VUSU5UVkVDVAogNSBzdHViIEdFVFNFVE1PVVNFREFUQQogI0NvbnRyb2wgUGFuZWwgdGhpbmtzIHRoaXMgaXMgaW1wbGVtZW50ZWQgaWYgaXQgaXMgYXZhaWxhYmxlCmRpZmYgLS1naXQgYS9pZjE2MzIvcmVsYXkuYyBiL2lmMTYzMi9yZWxheS5jCmluZGV4IDJkNWUzM2UuLmVlN2FmMjcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9yZWxheS5jCisrKyBiL2lmMTYzMi9yZWxheS5jCkBAIC00MjUsNiArNDI1LDcgQEAKIAlEV09SRCAqYXJncywgcmV0OwogICAgICAgICBWQV9MSVNUMTYgdmFsaXN0OwogCWludCBpOworCWludCBhaXg7CiAJZGJnX2RlY2xfc3RyKHJlbGF5LCAxMDI0KTsKIAogICAgICAgICBWQV9TVEFSVDE2KCB2YWxpc3QgKTsKQEAgLTQzNCwxNyArNDM1LDIzIEBACiAJZHNwcmludGYocmVsYXksICJDYWxsUHJvYzMyVyglbGQsJWxkLCVwLCBFeCVkIGFyZ3NbIixucm9mYXJncyxhcmdjb252bWFzayxwcm9jMzIsRXgpOwogCWFyZ3MgPSAoRFdPUkQqKUhFQVBfeGFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXT1JEKSpucm9mYXJncyApOworCS8qIENhbGxQcm9jRXggZG9lc24ndCBuZWVkIGl0cyBhcmdzIHJldmVyc2VkICovCiAJZm9yIChpPTA7aTxucm9mYXJncztpKyspIHsKKwkJaWYgKEV4KSB7CisJCSAgIGFpeCA9IGk7CisJCX0gZWxzZSB7CisJCSAgIGFpeCA9IG5yb2ZhcmdzIC0gaSAtIDE7CisJCX0KIAkJaWYgKGFyZ2NvbnZtYXNrICYgKDE8PGkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIHB0ciA9IFZBX0FSRzE2KCB2YWxpc3QsIFNFR1BUUiApOwotICAgICAgICAgICAgICAgICAgICBhcmdzW25yb2ZhcmdzLWktMV0gPSAoRFdPUkQpUFRSX1NFR19UT19MSU4ocHRyKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnc1thaXhdID0gKERXT1JEKVBUUl9TRUdfVE9fTElOKHB0cik7CiAgICAgICAgICAgICAgICAgICAgIGRzcHJpbnRmKHJlbGF5LCIlMDhseCglcCksIixwdHIsUFRSX1NFR19UT19MSU4ocHRyKSk7CiAJCX0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhcmdzW25yb2ZhcmdzLWktMV0gPSBWQV9BUkcxNiggdmFsaXN0LCBEV09SRCApOwotICAgICAgICAgICAgICAgICAgICBkc3ByaW50ZihyZWxheSwiJWxkLCIsYXJnc1tucm9mYXJncy1pLTFdKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnc1thaXhdID0gVkFfQVJHMTYoIHZhbGlzdCwgRFdPUkQgKTsKKyAgICAgICAgICAgICAgICAgICAgZHNwcmludGYocmVsYXksIiVsZCwiLGFyZ3NbYWl4XSk7CiAJCX0KIAl9CiAJZHNwcmludGYocmVsYXksIl0pIik7CmRpZmYgLS1naXQgYS9pZjE2MzIvc2hlbGwuc3BlYyBiL2lmMTYzMi9zaGVsbC5zcGVjCmluZGV4IGY4YTk5YjIuLmVhZGRjOTUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zaGVsbC5zcGVjCisrKyBiL2lmMTYzMi9zaGVsbC5zcGVjCkBAIC0zMiw3ICszMiw3IEBACiAxMDIgcGFzY2FsMTYgUmVnaXN0ZXJTaGVsbEhvb2sod29yZCB3b3JkKSBSZWdpc3RlclNoZWxsSG9vawogMTAzIHBhc2NhbCAgIFNoZWxsSG9va1Byb2Mod29yZCB3b3JkIGxvbmcpIFNoZWxsSG9va1Byb2MKIAotIyAgMTU3IFJFU1RBUlRESUFMT0cKKzE1NyBzdHViIFJFU1RBUlRESUFMT0cKICMgIDE2NiBQSUNLSUNPTkRMRwogCiAyNjIgcGFzY2FsMTYgRHJpdmVUeXBlKGxvbmcpIEdldERyaXZlVHlwZTE2CmRpZmYgLS1naXQgYS9pZjE2MzIvdGh1bmsuYyBiL2lmMTYzMi90aHVuay5jCmluZGV4IDM5ZDViMWQuLmYxZjYwZDAgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90aHVuay5jCisrKyBiL2lmMTYzMi90aHVuay5jCkBAIC01NjYsNiArNTY2LDI4IEBACiAgICAgcmV0dXJuIGRlZlNpZ25hbFByb2MxNjsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfQ3JlYXRlVGhyZWFkMTYgICAoS0VSTkVMLjQ0MSkKKyAqLworc3RhdGljIERXT1JEIENBTExCQUNLIFRIVU5LX1N0YXJ0VGhyZWFkMTYoIExQVk9JRCB0aHJlYWRBcmdzICkKK3sKKyAgICBGQVJQUk9DMTYgc3RhcnQgPSAoKEZBUlBST0MxNiAqKXRocmVhZEFyZ3MpWzBdOworICAgIERXT1JEICAgICBwYXJhbSA9ICgoRFdPUkQgKil0aHJlYWRBcmdzKVsxXTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGhyZWFkQXJncyApOworCisgICAgcmV0dXJuIENhbGxUbzE2X2xvbmdfbCggc3RhcnQsIHBhcmFtICk7Cit9CitIQU5ETEUzMiBXSU5BUEkgVEhVTktfQ3JlYXRlVGhyZWFkMTYoIFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLCBEV09SRCBzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFSUFJPQzE2IHN0YXJ0LCBTRUdQVFIgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzLCBMUERXT1JEIGlkICkKK3sKKyAgICBEV09SRCAqdGhyZWFkQXJncyA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMipzaXplb2YoRFdPUkQpICk7CisgICAgaWYgKCF0aHJlYWRBcmdzKSByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKKyAgICB0aHJlYWRBcmdzWzBdID0gKERXT1JEKXN0YXJ0OworICAgIHRocmVhZEFyZ3NbMV0gPSAoRFdPUkQpcGFyYW07CisKKyAgICByZXR1cm4gQ3JlYXRlVGhyZWFkKCBzYSwgc3RhY2ssIFRIVU5LX1N0YXJ0VGhyZWFkMTYsIHRocmVhZEFyZ3MsIGZsYWdzLCBpZCApOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSFVOS19XT1dDYWxsYmFjazE2RXgJKFdPVzMyLjMpKEtFUk5FTDMyLjU1KQpAQCAtNzgzLDcgKzgwNSw3IEBACiAKICAgICAqeCsrID0gMHhCODsgKigoV09SRCAqKXgpKysgPSBkczsKICAgICAqeCsrID0gMHg4RTsgKngrKyA9IDB4QzA7Ci0gICAgKngrKyA9IDB4NjA7ICp4KysgPSAweDBGOyAqeCsrID0gMHhCNzsgKngrKyA9IDB4Qzk7CisgICAgKngrKyA9IDB4NjY7ICp4KysgPSAweDBGOyAqeCsrID0gMHhCNzsgKngrKyA9IDB4Qzk7CiAgICAgKngrKyA9IDB4Njc7ICp4KysgPSAweDY2OyAqeCsrID0gMHgyNjsgKngrKyA9IDB4OEI7CiAgICAgICAgICAgICAgICAgICp4KysgPSAweDkxOyAqKChEV09SRCAqKXgpKysgPSBFRFhfcmVnKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCA2NmEzYmI1Li5hOTFmYTAwIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTQzMSw3ICs0MzEsNyBAQAogNDczIHBhc2NhbCAgIEFuc2lQcmV2KHNlZ3B0ciBzZWdwdHIpIEFuc2lQcmV2MTYKIDQ3NSBwYXNjYWwxNiBTZXRTY3JvbGxJbmZvKHdvcmQgc193b3JkIHB0ciB3b3JkKSBTZXRTY3JvbGxJbmZvMTYKIDQ3NiBwYXNjYWwxNiBHZXRTY3JvbGxJbmZvKHdvcmQgc193b3JkIHB0cikgR2V0U2Nyb2xsSW5mbzE2Ci00Nzcgc3R1YiBHZXRLZXlib2FyZExheW91dE5hbWUKKzQ3NyBwYXNjYWwxNiBHZXRLZXlib2FyZExheW91dE5hbWUocHRyKSBHZXRLZXlib2FyZExheW91dE5hbWUxNgogNDc4IHN0dWIgTG9hZEtleWJvYXJkTGF5b3V0CiA0Nzkgc3R1YiBNZW51SXRlbUZyb21Qb2ludAogNDgwIHN0dWIgR2V0VXNlckxvY2FsT2JqVHlwZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbmFzcGkuc3BlYyBiL2lmMTYzMi93aW5hc3BpLnNwZWMKaW5kZXggYWIyZDc3Yi4uMDFhZjBmOCAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbmFzcGkuc3BlYworKysgYi9pZjE2MzIvd2luYXNwaS5zcGVjCkBAIC00LDUgKzQsNSBAQAogMQlwYXNjYWwxNiBHZXRBU1BJU3VwcG9ydEluZm8oKSBHZXRBU1BJU3VwcG9ydEluZm8xNgogMglwYXNjYWwxNiBTZW5kQVNQSUNvbW1hbmQoc2VncHRyKSBTZW5kQVNQSUNvbW1hbmQxNgogMyAgICAgICBzdHViIElOU0VSVElOQVNQSUNIQUlOCi00CXBhc2NhbCBHRVRBU1BJRExMVkVSU0lPTigpIEdldEFTUElETExWZXJzaW9uCis0CXBhc2NhbCBHRVRBU1BJRExMVkVSU0lPTigpIEdldEFTUElETExWZXJzaW9uMTYKIDUJc3R1YiBfX19FWFBPUlRFRFNUVUIKZGlmZiAtLWdpdCBhL2lmMTYzMi93cHJvY3Muc3BlYyBiL2lmMTYzMi93cHJvY3Muc3BlYwppbmRleCAzNjk1YTc0Li5lYjlhYTRiIDEwMDY0NAotLS0gYS9pZjE2MzIvd3Byb2NzLnNwZWMKKysrIGIvaWYxNjMyL3dwcm9jcy5zcGVjCkBAIC0yODEsOSArMjgxLDEyIEBACiAjCiAjNDAwK1ZYRF9JRCByZWdpc3RlciA8VnhEIGhhbmRsZXI+KCkgPFZ4RCBoYW5kbGVyPgogIworNDAxIHJlZ2lzdGVyIFZYRF9WTU0oKSBWWERfVk1NCiA0MDUgcmVnaXN0ZXIgVlhEX1RpbWVyKCkgVlhEX1RpbWVyCiA0MTQgcmVnaXN0ZXIgVlhEX0NvbW0oKSBWWERfQ29tbQogIzQxNSByZWdpc3RlciBWWERfUHJpbnRlcigpIFZYRF9QcmludGVyCiA0MjMgcmVnaXN0ZXIgVlhEX1NoZWxsKCkgVlhEX1NoZWxsCiA0MzMgcmVnaXN0ZXIgVlhEX1BhZ2VGaWxlKCkgVlhEX1BhZ2VGaWxlCiA0NDUgcmVnaXN0ZXIgVlhEX1dpbjMycygpIFZYRF9XaW4zMnMKKzQ1MSByZWdpc3RlciBWWERfQ29uZmlnTUcoKSBWWERfQ29uZmlnTUcKKzE0OTAgcmVnaXN0ZXIgVlhEX1RpbWVyQVBJKCkgVlhEX1RpbWVyQVBJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjY29uZmlnLmggYi9pbmNsdWRlL2FjY29uZmlnLmgKaW5kZXggZjAyODdlYS4uNjZlY2UyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY2NvbmZpZy5oCisrKyBiL2luY2x1ZGUvYWNjb25maWcuaApAQCAtMjQsNiArMjQsOSBAQAogLyogRGVmaW5lIGlmIFggbGlicmFyaWVzIGFyZSBub3QgcmVlbnRyYW50IChjb21waWxlZCB3aXRob3V0IC1EX1JFRU5UUkFOVCkuICAqLwogI3VuZGVmIE5PX1JFRU5UUkFOVF9YMTEKIAorLyogRGVmaW5lIGlmIGxpYmMgaXMgbm90IHJlZW50cmFudCAgKi8KKyN1bmRlZiBOT19SRUVOVFJBTlRfTElCQworCiAvKiBEZWZpbmUgaWYgYWxsIGRlYnVnIG1lc3NhZ2VzIGFyZSB0byBiZSBjb21waWxlZCBvdXQgKi8KICN1bmRlZiBOT19ERUJVR19NU0dTCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5pbWF0ZS5oIGIvaW5jbHVkZS9hbmltYXRlLmgKaW5kZXggODg2N2E5Zi4uNjY1ZmM2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hbmltYXRlLmgKKysrIGIvaW5jbHVkZS9hbmltYXRlLmgKQEAgLTEwLDcgKzEwLDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnQU5JTUFURV9JTkZPCiB7Ci0gICAgRFdPUkQgZHdEdW1teTsKKyAgICBMUFZPSUQgIGxwQXZpOyAgIC8qIHBvaW50ZXIgdG8gYXZpIGRhdGEgKi8KKyAgICBIRklMRTMyIGhGaWxlOyAgIC8qIGhhbmRsZSB0byBhdmkgZmlsZSAqLwogfSBBTklNQVRFX0lORk87CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc3BpLmggYi9pbmNsdWRlL2FzcGkuaAppbmRleCA5Y2VhZmQ5Li5lMTlkMzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzcGkuaAorKysgYi9pbmNsdWRlL2FzcGkuaApAQCAtMSwxNzMgKzEsMTE4IEBACisvKiBBU1BJIGRlZmluaXRpb25zIHVzZWQgZm9yIGJvdGggV05BU1BJMTYgYW5kIFdOQVNQSTMyICovCisKICNpZiAhZGVmaW5lZChBU1BJX0gpCiAjZGVmaW5lIEFTUElfSAogCiAjcHJhZ21hIHBhY2soMSkKIAotI2RlZmluZSBTU19QRU5ESU5HCTB4MDAKLSNkZWZpbmUgU1NfQ09NUAkJMHgwMQotI2RlZmluZSBTU19BQk9SVEVECTB4MDIKLSNkZWZpbmUgU1NfRVJSCQkweDA0Ci0jZGVmaW5lIFNTX09MRF9NQU5BR0UJMHhlMQotI2RlZmluZSBTU19JTExFR0FMX01PREUJMHhlMgotI2RlZmluZSBTU19OT19BU1BJCTB4ZTMKLSNkZWZpbmUgU1NfRkFJTEVEX0lOSVQJMHhlNAotI2RlZmluZSBTU19JTlZBTElEX0hBCTB4ODEKLSNkZWZpbmUgU1NfSU5WQUxJRF9TUkIJMHhlMAotI2RlZmluZSBTU19BU1BJX0lTX0JVU1kJMHhlNQotI2RlZmluZSBTU19CVUZGRVJfVE9fQklHCTB4ZTYKKyNkZWZpbmUgU1NfUEVORElORyAgICAgIDB4MDAKKyNkZWZpbmUgU1NfQ09NUCAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1NfQUJPUlRFRCAgICAgIDB4MDIKKyNkZWZpbmUgU1NfRVJSICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU1NfT0xEX01BTkFHRSAgIDB4ZTEKKyNkZWZpbmUgU1NfSUxMRUdBTF9NT0RFIDB4ZTIKKyNkZWZpbmUgU1NfTk9fQVNQSSAgICAgIDB4ZTMKKyNkZWZpbmUgU1NfRkFJTEVEX0lOSVQgIDB4ZTQKKyNkZWZpbmUgU1NfSU5WQUxJRF9IQSAgIDB4ODEKKyNkZWZpbmUgU1NfSU5WQUxJRF9TUkIgIDB4ZTAKKyNkZWZpbmUgU1NfQVNQSV9JU19CVVNZIDB4ZTUKKyNkZWZpbmUgU1NfQlVGRkVSX1RPX0JJRyAgICAgICAgMHhlNgogCi0jZGVmaW5lIFNDX0hBX0lOUVVJUlkJCTB4MDAKLSNkZWZpbmUgU0NfR0VUX0RFVl9UWVBFIAkweDAxCi0jZGVmaW5lIFNDX0VYRUNfU0NTSV9DTUQJMHgwMgotI2RlZmluZSBTQ19BQk9SVF9TUkIJCTB4MDMKLSNkZWZpbmUgU0NfUkVTRVRfREVWCQkweDA0CisjZGVmaW5lIFNDX0hBX0lOUVVJUlkgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0NfR0VUX0RFVl9UWVBFICAgICAgICAgMHgwMQorI2RlZmluZSBTQ19FWEVDX1NDU0lfQ01EICAgICAgICAweDAyCisjZGVmaW5lIFNDX0FCT1JUX1NSQiAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU0NfUkVTRVRfREVWICAgICAgICAgICAgMHgwNAorCiAKIC8qIEhvc3QgYWRhcHRlciBzdGF0dXMgY29kZXMgKi8KLSNkZWZpbmUgSEFTVEFUX09LCQkweDAwCi0jZGVmaW5lIEhBU1RBVF9TRUxfVE8JCTB4MTEKLSNkZWZpbmUgSEFTVEFUX0RPX0RVCQkweDEyCi0jZGVmaW5lIEhBU1RBVF9CVVNfRlJFRQkJMHgxMwotI2RlZmluZSBIQVNUQVRfUEhBU0VfRVJSCTB4MTQKKyNkZWZpbmUgSEFTVEFUX09LICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBIQVNUQVRfU0VMX1RPICAgICAgICAgICAweDExCisjZGVmaW5lIEhBU1RBVF9ET19EVSAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgSEFTVEFUX0JVU19GUkVFICAgICAgICAgMHgxMworI2RlZmluZSBIQVNUQVRfUEhBU0VfRVJSICAgICAgICAweDE0CiAKIC8qIFRhcmdldCBzdGF0dXMgY29kZXMgKi8KLSNkZWZpbmUgU1RBVFVTX0dPT0QJCTB4MDAKLSNkZWZpbmUgU1RBVFVTX0NIS0NPTkQJCTB4MDIKLSNkZWZpbmUgU1RBVFVTX0JVU1kJCTB4MDgKLSNkZWZpbmUgU1RBVFVTX1JFU0NPTkYJCTB4MTgKKyNkZWZpbmUgU1RBVFVTX0dPT0QgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTVEFUVVNfQ0hLQ09ORCAgICAgICAgICAweDAyCisjZGVmaW5lIFNUQVRVU19CVVNZICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgU1RBVFVTX1JFU0NPTkYgICAgICAgICAgMHgxOAorCisjaWZkZWYgbGludXgKKworLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgc2dfaGVhZGVyIGZyb20gL3Vzci9zcmMvbGludXgvaW5jbHVkZS9zY3NpL3NnLmgKKyAqIGtlcm5lbCAyLjAuMzAKKyAqIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBhdCBzb21lIHBvaW50LCBidXQgZm9yIHRob3NlIHdobyBkb24ndCBoYXZlCisgKiBrZXJuZWxzIGluc3RhbGxlZCwgSSB0aGluayB0aGlzIHNob3VsZCBzdGlsbCB3b3JrLgorICoKKyAqLworCitzdHJ1Y3Qgc2dfaGVhZGVyCisgeworICBpbnQgcGFja19sZW47ICAgIC8qIGxlbmd0aCBvZiBpbmNvbWluZyBwYWNrZXQgPDQwOTYgKGluY2x1ZGluZyBoZWFkZXIpICovCisgIGludCByZXBseV9sZW47ICAgLyogbWF4aW11bSBsZW5ndGggPDQwOTYgb2YgZXhwZWN0ZWQgcmVwbHkgKi8KKyAgaW50IHBhY2tfaWQ7ICAgICAvKiBpZCBudW1iZXIgb2YgcGFja2V0ICovCisgIGludCByZXN1bHQ7ICAgICAgLyogMD09b2ssIG90aGVyd2lzZSByZWZlciB0byBlcnJubyBjb2RlcyAqLworICB1bnNpZ25lZCBpbnQgdHdlbHZlX2J5dGU6MTsgLyogRm9yY2UgMTIgYnl0ZSBjb21tYW5kIGxlbmd0aCBmb3IgZ3JvdXAgNiAmIDcKK2NvbW1hbmRzICAqLworICB1bnNpZ25lZCBpbnQgb3RoZXJfZmxhZ3M6MzE7ICAgICAgICAgICAgICAgICAgLyogZm9yIGZ1dHVyZSB1c2UgKi8KKyAgdW5zaWduZWQgY2hhciBzZW5zZV9idWZmZXJbMTZdOyAvKiB1c2VkIG9ubHkgYnkgcmVhZHMgKi8KKyAgLyogY29tbWFuZCBmb2xsb3dzIHRoZW4gZGF0YSBmb3IgY29tbWFuZCAqLworIH07CisKKyNkZWZpbmUgU0NTSV9PRkYgc2l6ZW9mKHN0cnVjdCBzZ19oZWFkZXIpCisjZW5kaWYKKworI2RlZmluZSBBU1BJX1BPU1RJTkcocHJiKSAocHJiLT5TUkJfRmxhZ3MgJiAweDEpCisKKyNkZWZpbmUgSE9TVF9UT19UQVJHRVQocHJiKSAoKChwcmItPlNSQl9GbGFncz4+MykgJiAweDMpID09IDB4MikKKyNkZWZpbmUgVEFSR0VUX1RPX0hPU1QocHJiKSAoKChwcmItPlNSQl9GbGFncz4+MykgJiAweDMpID09IDB4MSkKKyNkZWZpbmUgTk9fREFUQV9UUkFOU0ZFUkVEKHByYikgKCgocHJiLT5TUkJfRmxhZ3M+PjMpICYgMHgzKSA9PSAweDMpCisKKyNkZWZpbmUgU1JCX0VOQUJMRV9SRVNJRFVBTF9DT1VOVCAweDQKKyNkZWZpbmUgU1JCX0VWRU5UX05PVElGWSAweDQwIC8qIEVuYWJsZSBBU1BJIGV2ZW50IG5vdGlmaWNhdGlvbiAqLworCisjZGVmaW5lIElOUVVJUllfVkVORE9SICAgICAgICAgIDgKKworI2RlZmluZSBNVVNURUtfU0NTSV9BUkVBX0FORF9XSU5ET1dTIDB4MDQKKyNkZWZpbmUgTVVTVEVLX1NDU0lfUkVBRF9TQ0FOTkVEX0RBVEEgMHgwOAorI2RlZmluZSBNVVNURUtfU0NTSV9HRVRfSU1BR0VfU1RBVFVTIDB4MGYKKyNkZWZpbmUgTVVTVEVLX1NDU0lfQURGX0FORF9CQUNLVFJBQ0UgMHgxMAorI2RlZmluZSBNVVNURUtfU0NTSV9DQ0RfRElTVEFOQ0UgMHgxMQorI2RlZmluZSBNVVNURUtfU0NTSV9TVEFSVF9TVE9QIDB4MWIKKworI2RlZmluZSBDTURfVEVTVF9VTklUX1JFQURZIDB4MDAKKyNkZWZpbmUgQ01EX1JFUVVFU1RfU0VOU0UgMHgwMworI2RlZmluZSBDTURfSU5RVUlSWSAweDEyCisKKy8qIHNjYW5uZXIgY29tbWFuZHMgLSBqdXN0IGZvciBkZWJ1ZyAqLworI2RlZmluZSBDTURfU0NBTl9HRVRfREFUQV9CVUZGRVJfU1RBVFVTIDB4MzQKKyNkZWZpbmUgQ01EX1NDQU5fR0VUX1dJTkRPVyAweDI1CisjZGVmaW5lIENNRF9TQ0FOX09CSkVDVF9QT1NJVElPTiAweDMxCisjZGVmaW5lIENNRF9TQ0FOX1JFQUQgMHgyOAorI2RlZmluZSBDTURfU0NBTl9SRUxFQVNFX1VOSVQgMHgxNworI2RlZmluZSBDTURfU0NBTl9SRVNFUlZFX1VOSVQgMHgxNgorI2RlZmluZSBDTURfU0NBTl9TQ0FOIDB4MWIKKyNkZWZpbmUgQ01EX1NDQU5fU0VORCAweDJhCisjZGVmaW5lIENNRF9TQ0FOX0NIQU5HRV9ERUZJTklUSU9OIDB4NDAKKworI2RlZmluZSBJTlFVUklZX0NNRExFTiA2CisjZGVmaW5lIElOUVVSSVlfUkVQTFlfTEVOIDk2CisjZGVmaW5lIElOUVVJUllfVkVORE9SIDgKKworI2RlZmluZSBTRU5TRV9CVUZGRVIocHJiKSAoJnByYi0+Q0RCQnl0ZVtwcmItPlNSQl9DREJMZW5dKQogCiAKLXR5cGVkZWYgdW5pb24gU1JCMTYgKiBMUFNSQjE2OwotCi1zdHJ1Y3QgU1JCX0hhSW5xdWlyeTE2IHsKLSAgQllURQlTUkJfY21kOwotICBCWVRFCVNSQl9TdGF0dXM7Ci0gIEJZVEUJU1JCX0hhSWQ7Ci0gIEJZVEUJU1JCX0ZsYWdzOwotICBXT1JECVNSQl81NUFBU2lnbmF0dXJlOwotICBXT1JECVNSQl9FeHRCdWZmZXJTaXplOwotICBCWVRFCUhBX0NvdW50OwotICBCWVRFCUhBX1NDU0lfSUQ7Ci0gIEJZVEUJSEFfTWFuYWdlcklkWzE2XTsKLSAgQllURQlIQV9JZGVudGlmaWVyWzE2XTsKLSAgQllURQlIQV9VbmlxdWVbMTZdOwotICBCWVRFCUhBX0V4dEJ1ZmZlcls0XTsKLX0gV0lORV9QQUNLRUQ7Ci0KLXR5cGVkZWYgc3RydWN0IFNSQl9IYUlucXVpcnkxNiBTUkJfSGFJbnF1aXJ5MTY7Ci0KLXN0cnVjdCBTUkJfRXhlY1NDU0lDbWQxNiB7Ci0gIEJZVEUgICAgICAgIFNSQl9DbWQ7ICAgICAgICAgICAgICAgIC8qIEFTUEkgY29tbWFuZCBjb2RlCSAgICAgIChXKSAgKi8KLSAgQllURSAgICAgICAgU1JCX1N0YXR1czsgICAgICAgICAgICAgLyogQVNQSSBjb21tYW5kIHN0YXR1cyBieXRlICAgICAoUikgICovCi0gIEJZVEUgICAgICAgIFNSQl9IYUlkOyAgICAgICAgICAgICAgIC8qIEFTUEkgaG9zdCBhZGFwdGVyIG51bWJlciAgICAgKFcpICAqLwotICBCWVRFICAgICAgICBTUkJfRmxhZ3M7ICAgICAgICAgICAgICAvKiBBU1BJIHJlcXVlc3QgZmxhZ3MJICAgICAgKFcpICAqLwotICBEV09SRCAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgICAgICAvKiBSZXNlcnZlZCwgTVVTVCA9IDAJICAgICAgKC0pICAqLwotICBCWVRFICAgICAgICBTUkJfVGFyZ2V0OyAgICAgICAgICAgICAvKiBUYXJnZXQncyBTQ1NJIElECSAgICAgIChXKSAgKi8KLSAgQllURSAgICAgICAgU1JCX0x1bjsgICAgICAgICAgICAgICAgLyogVGFyZ2V0J3MgTFVOIG51bWJlcgkgICAgICAoVykgICovCi0gIERXT1JEICAgICAgIFNSQl9CdWZMZW47ICAgICAgICAgICAgIC8qIERhdGEgQWxsb2NhdGlvbiBMZW5ndGhQRyAgICAgKFcvUikqLwotICBCWVRFICAgICAgICBTUkJfU2Vuc2VMZW47ICAgICAgICAgICAvKiBTZW5zZSBBbGxvY2F0aW9uIExlbmd0aCAgICAgIChXKSAgKi8KLSAgU0VHUFRSICAgICAgU1JCX0J1ZlBvaW50ZXI7ICAgICAgICAgLyogRGF0YSBCdWZmZXIgUG9pbnRlcgkgICAgICAoVykgICovCi0gIERXT1JEICAgICAgIFNSQl9Sc3ZkMTsgICAgICAgICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMAkgICAgICAoLS9XKSovCi0gIEJZVEUgICAgICAgIFNSQl9DREJMZW47ICAgICAgICAgICAgIC8qIENEQiBMZW5ndGggPSA2CQkgICAgICAoVykgICovCi0gIEJZVEUgICAgICAgIFNSQl9IYVN0YXQ7ICAgICAgICAgICAgIC8qIEhvc3QgQWRhcHRlciBTdGF0dXMJICAgICAgKFIpICAqLwotICBCWVRFICAgICAgICBTUkJfVGFyZ1N0YXQ7ICAgICAgICAgICAvKiBUYXJnZXQgU3RhdHVzCQkgICAgICAoUikgICovCi0gIEZBUlBST0MxNiAgIFNSQl9Qb3N0UHJvYzsJICAgICAgLyogUG9zdCByb3V0aW5lCQkgICAgICAoVykgICovCi0gIEJZVEUgICAgICAgIFNSQl9Sc3ZkMlszNF07ICAgICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMCAgICAgICAgICAgICAgICAqLwotICBCWVRFCQlDREJCeXRlWzBdOwkgICAgICAvKiBTQ1NJIENCRCAtIHZhcmlhYmxlIGxlbmd0aCAgIChXKSAgKi8KLSAgLyogdmFyaWFibGUgZXhhbXBsZSBmb3IgNiBieXRlIGNiZAotICAgKiBCWVRFICAgICAgICBDREJCeXRlWzZdOyAgICAgICAgICAgICAqIFNDU0kgQ0RCICAgICAgICAgICAgICAgICAgICAoVykgKgotICAgKiBCWVRFICAgICAgICBTZW5zZUFyZWE2W1NFTlNFX0xFTl07ICAqIFJlcXVlc3QgU2Vuc2UgYnVmZmVyIAkoUikgKgotICAgKi8KLX0gV0lORV9QQUNLRUQgOwotCi10eXBlZGVmIHN0cnVjdCBTUkJfRXhlY1NDU0lDbWQxNiBTUkJfRXhlY1NDU0lDbWQxNjsKLQotc3RydWN0IFNSQl9FeGVjU0NTSUNtZDMyIHsKLSAgQllURSAgICAgICAgU1JCX0NtZDsgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgY29kZSA9IFNDX0VYRUNfU0NTSV9DTUQgKi8KLSAgQllURSAgICAgICAgU1JCX1N0YXR1czsgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgc3RhdHVzIGJ5dGUgKi8KLSAgQllURSAgICAgICAgU1JCX0hhSWQ7ICAgICAgICAgICAvKiBBU1BJIGhvc3QgYWRhcHRlciBudW1iZXIgKi8KLSAgQllURSAgICAgICAgU1JCX0ZsYWdzOyAgICAgICAgICAvKiBBU1BJIHJlcXVlc3QgZmxhZ3MgKi8KLSAgRFdPUkQgICAgICAgU1JCX0hkcl9Sc3ZkOyAgICAgICAvKiBSZXNlcnZlZCAqLwotICBCWVRFICAgICAgICBTUkJfVGFyZ2V0OyAgICAgICAgIC8qIFRhcmdldCdzIFNDU0kgSUQgKi8KLSAgQllURSAgICAgICAgU1JCX0x1bjsgICAgICAgICAgICAvKiBUYXJnZXQncyBMVU4gbnVtYmVyICovCi0gIFdPUkQgICAgICAgIFNSQl9Sc3ZkMTsgICAgICAgICAgLyogUmVzZXJ2ZWQgZm9yIEFsaWdubWVudCAqLwotICBEV09SRCAgICAgICBTUkJfQnVmTGVuOyAgICAgICAgIC8qIERhdGEgQWxsb2NhdGlvbiBMZW5ndGggKi8KLSAgQllURSAgICAgICAgKlNSQl9CdWZQb2ludGVyOyAgICAvKiBEYXRhIEJ1ZmZlciBQb2ludCAqLwotICBCWVRFICAgICAgICBTUkJfU2Vuc2VMZW47ICAgICAgIC8qIFNlbnNlIEFsbG9jYXRpb24gTGVuZ3RoICovCi0gIEJZVEUgICAgICAgIFNSQl9DREJMZW47ICAgICAgICAgLyogQ0RCIExlbmd0aCAqLwotICBCWVRFICAgICAgICBTUkJfSGFTdGF0OyAgICAgICAgIC8qIEhvc3QgQWRhcHRlciBTdGF0dXMgKi8KLSAgQllURSAgICAgICAgU1JCX1RhcmdTdGF0OyAgICAgICAvKiBUYXJnZXQgU3RhdHVzICovCi0gIHZvaWQgICAgICAgICgqU1JCX1Bvc3RQcm9jKSgpOyAgLyogUG9zdCByb3V0aW5lICovCi0gIHZvaWQgICAgICAgICpTUkJfUnN2ZDI7ICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KLSAgQllURSAgICAgICAgU1JCX1JzdmQzWzE2XTsgICAgICAvKiBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uICovCi0gIEJZVEUgICAgICAgIENEQkJ5dGVbMTZdOyAgICAgICAgLyogU0NTSSBDREIgKi8KLSAgQllURSAgICAgICAgU2Vuc2VBcmVhWzBdOyAgICAgICAvKiBSZXF1ZXN0IHNlbnNlIGJ1ZmZlciAtIHZhciBsZW5ndGggKi8KKy8qIEp1c3QgYSBjb250YWluZXIgZm9yIHNlZWluZyB3aGF0IGRldmljZXMgYXJlIG9wZW4gKi8KK3N0cnVjdCBBU1BJX0RFVklDRV9JTkZPIHsKKyAgICBzdHJ1Y3QgQVNQSV9ERVZJQ0VfSU5GTyAqICAgbmV4dDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZmQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RJZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsdW47CiB9OwogCi10eXBlZGVmIHN0cnVjdCBTUkJfRXhlY1NDU0lDbWQzMiBTUkJfRXhlY1NDU0lDbWQzMjsKLQotc3RydWN0IFNSQl9BYm9ydDE2IHsKLSAgQllURSAgICAgICAgU1JCX0NtZDsgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgY29kZSA9IFNDX0FCT1JUX1NSQiAqLwotICBCWVRFICAgICAgICBTUkJfU3RhdHVzOyAgICAgICAgIC8qIEFTUEkgY29tbWFuZCBzdGF0dXMgYnl0ZSAqLwotICBCWVRFICAgICAgICBTUkJfSGFJZDsgICAgICAgICAgIC8qIEFTUEkgaG9zdCBhZGFwdGVyIG51bWJlciAqLwotICBCWVRFICAgICAgICBTUkJfRmxhZ3M7ICAgICAgICAgIC8qIEFTUEkgcmVxdWVzdCBmbGFncyAqLwotICBEV09SRCAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMCAqLwotICBMUFNSQjE2ICAgICBTUkJfVG9BYm9ydDsgICAgICAgIC8qIFBvaW50ZXIgdG8gU1JCIHRvIGFib3J0ICovCi19IFdJTkVfUEFDS0VEOwotCi10eXBlZGVmIHN0cnVjdCBTUkJfQWJvcnQxNiBTUkJfQWJvcnQxNjsKLQotc3RydWN0IFNSQl9CdXNEZXZpY2VSZXNldDE2IHsKLSAgQllURSAgICAgICAgU1JCX0NtZDsgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgY29kZSA9IFNDX1JFU0VUX0RFViAqLwotICBCWVRFICAgICAgICBTUkJfU3RhdHVzOyAgICAgICAgIC8qIEFTUEkgY29tbWFuZCBzdGF0dXMgYnl0ZSAqLwotICBCWVRFICAgICAgICBTUkJfSGFJZDsgICAgICAgICAgIC8qIEFTUEkgaG9zdCBhZGFwdGVyIG51bWJlciAqLwotICBCWVRFICAgICAgICBTUkJfRmxhZ3M7ICAgICAgICAgIC8qIEFTUEkgcmVxdWVzdCBmbGFncyAqLwotICBEV09SRCAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMCAqLwotICBCWVRFICAgICAgICBTUkJfVGFyZ2V0OyAgICAgICAgIC8qIFRhcmdldCdzIFNDU0kgSUQgKi8KLSAgQllURSAgICAgICAgU1JCX0x1bjsgICAgICAgICAgICAvKiBUYXJnZXQncyBMVU4gbnVtYmVyICovCi0gIEJZVEUgICAgICAgIFNSQl9SZXNldFJzdmQxWzE0XTsgLyogUmVzZXJ2ZWQsIE1VU1QgPSAwICovCi0gIEJZVEUgICAgICAgIFNSQl9IYVN0YXQ7ICAgICAgICAgLyogSG9zdCBBZGFwdGVyIFN0YXR1cyAqLwotICBCWVRFICAgICAgICBTUkJfVGFyZ1N0YXQ7ICAgICAgIC8qIFRhcmdldCBTdGF0dXMgKi8KLSAgU0VHUFRSICAgICAgU1JCX1Bvc3RQcm9jOyAgICAgICAvKiBQb3N0IHJvdXRpbmUgKi8KLSAgQllURSAgICAgICAgU1JCX1Jlc2V0UnN2ZDJbMzRdOyAvKiBSZXNlcnZlZCwgTVVTVCA9IDAgKi8KLX0gV0lORV9QQUNLRUQ7Ci0KLXR5cGVkZWYgc3RydWN0IFNSQl9CdXNEZXZpY2VSZXNldDE2IFNSQl9CdXNEZXZpY2VSZXNldDE2OwotCi1zdHJ1Y3QgU1JCX0dERVZCbG9jazE2IHsKLSAgQllURSAgICAgICAgU1JCX0NtZDsgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgY29kZSA9IFNDX0dFVF9ERVZfVFlQRSAqLwotICBCWVRFICAgICAgICBTUkJfU3RhdHVzOyAgICAgICAgIC8qIEFTUEkgY29tbWFuZCBzdGF0dXMgYnl0ZSAqLwotICBCWVRFICAgICAgICBTUkJfSGFJZDsgICAgICAgICAgIC8qIEFTUEkgaG9zdCBhZGFwdGVyIG51bWJlciAqLwotICBCWVRFICAgICAgICBTUkJfRmxhZ3M7ICAgICAgICAgIC8qIEFTUEkgcmVxdWVzdCBmbGFncyAqLwotICBEV09SRCAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMCAqLwotICBCWVRFICAgICAgICBTUkJfVGFyZ2V0OyAgICAgICAgIC8qIFRhcmdldCdzIFNDU0kgSUQgKi8KLSAgQllURSAgICAgICAgU1JCX0x1bjsgICAgICAgICAgICAvKiBUYXJnZXQncyBMVU4gbnVtYmVyICovCi0gIEJZVEUgICAgICAgIFNSQl9EZXZpY2VUeXBlOyAgICAgLyogVGFyZ2V0J3MgcGVyaXBoZXJhbCBkZXZpY2UgdHlwZSAqLwotfSBXSU5FX1BBQ0tFRDsKLQotdHlwZWRlZiBzdHJ1Y3QgU1JCX0dERVZCbG9jazE2IFNSQl9HREVWQmxvY2sxNjsKLQotCi0KLXN0cnVjdCBTUkJfQ29tbW9uMTYgewotICBCWVRFCVNSQl9jbWQ7Ci19OwotCi0KLXR5cGVkZWYgc3RydWN0IFNSQl9Db21tb24xNiBTUkJfQ29tbW9uMTY7Ci0KLQotdW5pb24gU1JCMTYgewotICBTUkJfQ29tbW9uMTYJCWNvbW1vbjsKLSAgU1JCX0hhSW5xdWlyeTE2CWlucXVpcnk7Ci0gIFNSQl9FeGVjU0NTSUNtZDE2CWNtZDsKLSAgU1JCX0Fib3J0MTYJCWFib3J0OwotICBTUkJfQnVzRGV2aWNlUmVzZXQxNglyZXNldDsKLSAgU1JCX0dERVZCbG9jazE2CWRldnR5cGU7Ci19OwotCi10eXBlZGVmIHVuaW9uIFNSQjE2IFNSQjE2OwotCi0KLQordHlwZWRlZiBzdHJ1Y3QgQVNQSV9ERVZJQ0VfSU5GTyBBU1BJX0RFVklDRV9JTkZPOworc3RhdGljIEFTUElfREVWSUNFX0lORk8gKkFTUElfb3Blbl9kZXZpY2VzID0gTlVMTDsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2F1dGhvcnMuaCBiL2luY2x1ZGUvYXV0aG9ycy5oCmluZGV4IDg0ODE4MzcuLmU5MzBjOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXV0aG9ycy5oCisrKyBiL2luY2x1ZGUvYXV0aG9ycy5oCkBAIC0zMCw2ICszMCw3IEBACiAgICAgIkNhcnN0ZW4gRmFsbGVzZW4iLAogICAgICJQYXVsIEZhbHN0YWQiLAogICAgICJEYXZpZCBGYXVyZSIsCisgICAgIldlc2xleSBGaWxhcmRvIiwKICAgICAiQ2xhdXMgRmlzY2hlciIsCiAgICAgIk9sYWYgRmxlYmJlIiwKICAgICAiQ2hhZCBGcmFsZWlnaCIsCkBAIC00Nyw2ICs0OCw3IEBACiAgICAgIkpvY2hlbiBIb2VuaWNrZSIsCiAgICAgIk9ubm8gSG92ZXJzIiwKICAgICAiSmVmZnJleSBIc3UiLAorICAgICJQZXRlciBIdW5uaXNldHQiLAogICAgICJNaWd1ZWwgZGUgSWNhemEiLAogICAgICJKdWtrYSBJaXZvbmVuIiwKICAgICAiTGVlIEphZWtpbCIsCkBAIC04OSw2ICs5MSw3IEBACiAgICAgIkRpbWl0cmllIE8uIFBhdW4iLAogICAgICJKaW0gUGV0ZXJzb24iLAogICAgICJSb2JlcnQgUG91bGlvdCIsCisgICAgIlBldHRlciBSZWluaG9sZHRzZW4iLAogICAgICJLZWl0aCBSZXlub2xkcyIsCiAgICAgIlNsYXZlbiBSZXppYyIsCiAgICAgIkpvaG4gUmljaGFyZHNvbiIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1jdHJsLmggYi9pbmNsdWRlL2NvbW1jdHJsLmgKaW5kZXggNGQ0MTQwNS4uY2Y3MmIwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tY3RybC5oCisrKyBiL2luY2x1ZGUvY29tbWN0cmwuaApAQCAtNDE1LDI2ICs0MTUsMjcgQEAKICNkZWZpbmUgSERNX0dFVElURU1DT1VOVCAgICAgICAgKEhETV9GSVJTVCswKQogI2RlZmluZSBIRE1fSU5TRVJUSVRFTTMyQSAgICAgICAoSERNX0ZJUlNUKzEpCiAjZGVmaW5lIEhETV9JTlNFUlRJVEVNMzJXICAgICAgIChIRE1fRklSU1QrMTApCi0jZGVmaW5lIEhETV9JTlNFUlRJVEVNIFdJTkVMSUJfTkFNRV9BVyhIRE1fSU5TRVJUSVRFTSkKKyNkZWZpbmUgSERNX0lOU0VSVElURU0JCVdJTkVMSUJfTkFNRV9BVyhIRE1fSU5TRVJUSVRFTSkKICNkZWZpbmUgSERNX0RFTEVURUlURU0gICAgICAgICAgKEhETV9GSVJTVCsyKQogI2RlZmluZSBIRE1fR0VUSVRFTTMyQSAgICAgICAgICAoSERNX0ZJUlNUKzMpCiAjZGVmaW5lIEhETV9HRVRJVEVNMzJXICAgICAgICAgIChIRE1fRklSU1QrMTEpCi0jZGVmaW5lIEhETV9HRVRJVEVNIFdJTkVMSUJfTkFNRV9BVyhIRE1fR0VUSVRFTSkKKyNkZWZpbmUgSERNX0dFVElURU0JCVdJTkVMSUJfTkFNRV9BVyhIRE1fR0VUSVRFTSkKICNkZWZpbmUgSERNX1NFVElURU0zMkEgICAgICAgICAgKEhETV9GSVJTVCs0KQogI2RlZmluZSBIRE1fU0VUSVRFTTMyVyAgICAgICAgICAoSERNX0ZJUlNUKzEyKQotI2RlZmluZSBIRE1fU0VUSVRFTSBXSU5FTElCX05BTUVfQVcoSERNX1NFVElURU0pCisjZGVmaW5lIEhETV9TRVRJVEVNCQlXSU5FTElCX05BTUVfQVcoSERNX1NFVElURU0pCiAjZGVmaW5lIEhETV9MQVlPVVQgICAgICAgICAgICAgIChIRE1fRklSU1QrNSkKICNkZWZpbmUgSERNX0hJVFRFU1QgICAgICAgICAgICAgKEhETV9GSVJTVCs2KQogI2RlZmluZSBIRE1fR0VUSVRFTVJFQ1QgICAgICAgICAoSERNX0ZJUlNUKzcpCiAjZGVmaW5lIEhETV9TRVRJTUFHRUxJU1QgICAgICAgIChIRE1fRklSU1QrOCkKICNkZWZpbmUgSERNX0dFVElNQUdFTElTVCAgICAgICAgKEhETV9GSVJTVCs5KQogCi0KICNkZWZpbmUgSERNX09SREVSVE9JTkRFWCAgICAgICAgKEhETV9GSVJTVCsxNSkKICNkZWZpbmUgSERNX0NSRUFURURSQUdJTUFHRSAgICAgKEhETV9GSVJTVCsxNikKICNkZWZpbmUgSERNX0dFVE9SREVSQVJSQVkgICAgICAgKEhETV9GSVJTVCsxNykKICNkZWZpbmUgSERNX1NFVE9SREVSQVJSQVkgICAgICAgKEhETV9GSVJTVCsxOCkKICNkZWZpbmUgSERNX1NFVEhPVERJVklERVIgICAgICAgKEhETV9GSVJTVCsxOSkKKyNkZWZpbmUgSERNX0dFVFVOSUNPREVGT1JNQVQgICAgQ0NNX0dFVFVOSUNPREVGT1JNQVQKKyNkZWZpbmUgSERNX1NFVFVOSUNPREVGT1JNQVQgICAgQ0NNX1NFVFVOSUNPREVGT1JNQVQKIAogI2RlZmluZSBIRE5fRklSU1QgICAgICAgICAgICAgICAoMFUtMzAwVSkKICNkZWZpbmUgSEROX0xBU1QgICAgICAgICAgICAgICAgKDBVLTM5OVUpCkBAIC00NjgsNyArNDY5LDYgQEAKICNkZWZpbmUgSEROX0JFR0lORFJBQ0sgICAgICAgICAgKEhETl9GSVJTVC0xMCkKICNkZWZpbmUgSEROX0VORERSQUNLICAgICAgICAgICAgKEhETl9GSVJTVC0xMSkKIAotCiB0eXBlZGVmIHN0cnVjdCBfSERfTEFZT1VUCiB7CiAgICAgUkVDVDMyICAgICAgKnByYzsKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCiAjZGVmaW5lIEhEX0xBWU9VVCAgIEhETEFZT1VUCiAKLXR5cGVkZWYgc3RydWN0IF9IRF9JVEVNQQordHlwZWRlZiBzdHJ1Y3QgX0hEX0lURU0zMkEKIHsKICAgICBVSU5UMzIgICAgbWFzazsKICAgICBJTlQzMiAgICAgY3h5OwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAgICAgSU5UMzIgICAgIGlPcmRlcjsKIH0gSERJVEVNMzJBLCAqTFBIRElURU0zMkE7CiAKLXR5cGVkZWYgc3RydWN0IF9IRF9JVEVNVwordHlwZWRlZiBzdHJ1Y3QgX0hEX0lURU0zMlcKIHsKICAgICBVSU5UMzIgICAgbWFzazsKICAgICBJTlQzMiAgICAgY3h5OwpAQCAtNTE5LDQ4ICs1MTksOTEgQEAKIAogI2RlZmluZSBIRF9ISVRURVNUSU5GTyAgIEhESElUVEVTVElORk8KIAotdHlwZWRlZiBzdHJ1Y3QgdGFnTk1IRUFERVJBCit0eXBlZGVmIHN0cnVjdCB0YWdOTUhFQURFUjMyQQogewogICAgIE5NSERSICAgICBoZHI7CiAgICAgSU5UMzIgICAgIGlJdGVtOwogICAgIElOVDMyICAgICBpQnV0dG9uOwogICAgIEhESVRFTTMyQSAqcGl0ZW07Ci19IE5NSEVBREVSQSwgKkxQTk1IRUFERVJBOworfSBOTUhFQURFUjMyQSwgKkxQTk1IRUFERVIzMkE7CiAKLSNpZm5kZWYgX19XSU5FX18KK3R5cGVkZWYgc3RydWN0IHRhZ05NSEVBREVSMzJXCit7CisgICAgTk1IRFIgICAgIGhkcjsKKyAgICBJTlQzMiAgICAgaUl0ZW07CisgICAgSU5UMzIgICAgIGlCdXR0b247CisgICAgSERJVEVNMzJXICpwaXRlbTsKK30gTk1IRUFERVIzMlcsICpMUE5NSEVBREVSMzJXOworCisjZGVmaW5lIE5NSEVBREVSCQlXSU5FTElCX05BTUVfQVcoTk1IRUFERVIpCisjZGVmaW5lIExQTk1IRUFERVIJCVdJTkVMSUJfTkFNRV9BVyhMUE5NSEVBREVSKQorCit0eXBlZGVmIHN0cnVjdCB0YWdOTUhERElTUElORk8zMkEKK3sKKyAgICBOTUhEUiAgICAgaGRyOworICAgIElOVDMyICAgICBpSXRlbTsKKyAgICBVSU5UMzIgICAgbWFzazsKKyAgICBMUFNUUiAgICAgcHN6VGV4dDsKKyAgICBJTlQzMiAgICAgY2NoVGV4dE1heDsKKyAgICBJTlQzMiAgICAgaUltYWdlOworICAgIExQQVJBTSAgICBsUGFyYW07Cit9IE5NSERESVNQSU5GTzMyQSwgKkxQTk1IRERJU1BJTkZPMzJBOworCit0eXBlZGVmIHN0cnVjdCB0YWdOTUhERElTUElORk8zMlcKK3sKKyAgICBOTUhEUiAgICAgaGRyOworICAgIElOVDMyICAgICBpSXRlbTsKKyAgICBVSU5UMzIgICAgbWFzazsKKyAgICBMUFdTVFIgICAgcHN6VGV4dDsKKyAgICBJTlQzMiAgICAgY2NoVGV4dE1heDsKKyAgICBJTlQzMiAgICAgaUltYWdlOworICAgIExQQVJBTSAgICBsUGFyYW07Cit9IE5NSERESVNQSU5GTzMyVywgKkxQTk1IRERJU1BJTkZPMzJXOworCisjZGVmaW5lIE5NSERESVNQSU5GTwkJV0lORUxJQl9OQU1FX0FXKE5NSERESVNQSU5GTykKKyNkZWZpbmUgTFBOTUhERElTUElORk8JCVdJTkVMSUJfTkFNRV9BVyhMUE5NSERESVNQSU5GTykKKwogI2RlZmluZSBIZWFkZXJfR2V0SXRlbUNvdW50KGh3bmRIRCkgXAotICAoSU5UMzIpU05ETVNHKChod25kSEQpLEhETV9HRVRJVEVNQ09VTlQsMCwwTCkKLSNkZWZpbmUgSGVhZGVyX0luc2VydEl0ZW0oaHduZEhELGkscGhkaSkgXAotICAoSU5UMzIpU05ETVNHKChod25kSEQpLEhETV9JTlNFUlRJVEVNLChXUEFSQU0zMikoSU5UMzIpKGkpLChMUEFSQU0pKGNvbnN0IEhESVRFTSAqKShwaGRpKSkKKyAgKElOVDMyKVNlbmRNZXNzYWdlMzJBKChod25kSEQpLEhETV9HRVRJVEVNQ09VTlQsMCwwTCkKKyNkZWZpbmUgSGVhZGVyX0luc2VydEl0ZW0zMkEoaHduZEhELGkscGhkaSkgXAorICAoSU5UMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmRIRCksSERNX0lOU0VSVElURU0zMkEsKFdQQVJBTTMyKShJTlQzMikoaSksKExQQVJBTSkoY29uc3QgSERJVEVNMzJBKikocGhkaSkpCisjZGVmaW5lIEhlYWRlcl9JbnNlcnRJdGVtMzJXKGh3bmRIRCxpLHBoZGkpIFwKKyAgKElOVDMyKVNlbmRNZXNzYWdlMzJXKChod25kSEQpLEhETV9JTlNFUlRJVEVNMzJXLChXUEFSQU0zMikoSU5UMzIpKGkpLChMUEFSQU0pKGNvbnN0IEhESVRFTTMyVyopKHBoZGkpKQorI2RlZmluZSBIZWFkZXJfSW5zZXJ0SXRlbSBXSU5FTElCX05BTUVfQVcoSGVhZGVyX0luc2VydEl0ZW0pCiAjZGVmaW5lIEhlYWRlcl9EZWxldGVJdGVtKGh3bmRIRCxpKSBcCi0gIChCT09MMzIpU05ETVNHKChod25kSEQpLEhETV9ERUxFVEVJVEVNLChXUEFSQU0zMikoSU5UMzIpKGkpLDBMKQotI2RlZmluZSBIZWFkZXJfR2V0SXRlbShod25kSEQsaSxwaGRpKSBcCi0gIChCT09MMzIpU05ETVNHKChod25kSEQpLEhETV9HRVRJVEVNLChXUEFSQU0zMikoSU5UMzIpKGkpLChMUEFSQU0pKEhESVRFTSAqKShwaGRpKSkKLSNkZWZpbmUgSGVhZGVyX1NldEl0ZW0oaHduZEhELGkscGhkaSkgXAotICAoQk9PTDMyKVNORE1TRygoaHduZEhEKSxIRE1fU0VUSVRFTSwoV1BBUkFNMzIpKElOVDMyKShpKSwoTFBBUkFNKShjb25zdCBIRElURU0gKikocGhkaSkpCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmRIRCksSERNX0RFTEVURUlURU0sKFdQQVJBTTMyKShJTlQzMikoaSksMEwpCisjZGVmaW5lIEhlYWRlcl9HZXRJdGVtMzJBKGh3bmRIRCxpLHBoZGkpIFwKKyAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQSgoaHduZEhEKSxIRE1fR0VUSVRFTTMyQSwoV1BBUkFNMzIpKElOVDMyKShpKSwoTFBBUkFNKShIRElURU0zMkEqKShwaGRpKSkKKyNkZWZpbmUgSGVhZGVyX0dldEl0ZW0zMlcoaHduZEhELGkscGhkaSkgXAorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJXKChod25kSEQpLEhETV9HRVRJVEVNMzJXLChXUEFSQU0zMikoSU5UMzIpKGkpLChMUEFSQU0pKEhESVRFTTMyVyopKHBoZGkpKQorI2RlZmluZSBIZWFkZXJfR2V0SXRlbSBXSU5FTElCX05BTUVfQVcoSGVhZGVyX0dldEl0ZW0pCisjZGVmaW5lIEhlYWRlcl9TZXRJdGVtMzJBKGh3bmRIRCxpLHBoZGkpIFwKKyAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQSgoaHduZEhEKSxIRE1fU0VUSVRFTTMyQSwoV1BBUkFNMzIpKElOVDMyKShpKSwoTFBBUkFNKShjb25zdCBIRElURU0zMkEqKShwaGRpKSkKKyNkZWZpbmUgSGVhZGVyX1NldEl0ZW0zMlcoaHduZEhELGkscGhkaSkgXAorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJXKChod25kSEQpLEhETV9TRVRJVEVNMzJXLChXUEFSQU0zMikoSU5UMzIpKGkpLChMUEFSQU0pKGNvbnN0IEhESVRFTTMyVyopKHBoZGkpKQorI2RlZmluZSBIZWFkZXJfU2V0SXRlbSBXSU5FTElCX05BTUVfQVcoSGVhZGVyX1NldEl0ZW0pCiAjZGVmaW5lIEhlYWRlcl9MYXlvdXQoaHduZEhELHBsYXlvdXQpIFwKLSAgKEJPT0wzMilTTkRNU0coKGh3bmRIRCksSERNX0xBWU9VVCwwLChMUEFSQU0pKExQSERMQVlPVVQpKHBsYXlvdXQpKQorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kSEQpLEhETV9MQVlPVVQsMCwoTFBBUkFNKShMUEhETEFZT1VUKShwbGF5b3V0KSkKICNkZWZpbmUgSGVhZGVyX0dldEl0ZW1SZWN0KGh3bmQsaUl0ZW0sbHByYykgXAotICAoQk9PTDMyKVNORE1TRygoaHduZCksSERNX0dFVElURU1SRUNULChXUEFSQU0zMilpSXRlbSwoTFBBUkFNKWxwcmMpCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9HRVRJVEVNUkVDVCwoV1BBUkFNMzIpaUl0ZW0sKExQQVJBTSlscHJjKQogI2RlZmluZSBIZWFkZXJfU2V0SW1hZ2VMaXN0KGh3bmQsaGltbCkgXAotICAoSElNQUdFTElTVClTTkRNU0coKGh3bmQpLEhETV9TRVRJTUFHRUxJU1QsMCwoTFBBUkFNKWhpbWwpCisgIChISU1BR0VMSVNUKVNlbmRNZXNzYWdlMzJBKChod25kKSxIRE1fU0VUSU1BR0VMSVNULDAsKExQQVJBTSloaW1sKQogI2RlZmluZSBIZWFkZXJfR2V0SW1hZ2VMaXN0KGh3bmQpIFwKLSAgKEhJTUFHRUxJU1QpU05ETVNHKChod25kKSxIRE1fR0VUSU1BR0VMSVNULDAsMCkKKyAgKEhJTUFHRUxJU1QpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9HRVRJTUFHRUxJU1QsMCwwKQogI2RlZmluZSBIZWFkZXJfT3JkZXJUb0luZGV4KGh3bmQsaSkgXAotICAoSU5UMzIpU05ETVNHKChod25kKSxIRE1fT1JERVJUT0lOREVYLChXUEFSQU0zMilpLDApCisgIChJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksSERNX09SREVSVE9JTkRFWCwoV1BBUkFNMzIpaSwwKQogI2RlZmluZSBIZWFkZXJfQ3JlYXRlRHJhZ0ltYWdlKGh3bmQsaSkgXAotICAoSElNQUdFTElTVClTTkRNU0coKGh3bmQpLEhETV9DUkVBVEVEUkFHSU1BR0UsKFdQQVJBTTMyKWksMCkKKyAgKEhJTUFHRUxJU1QpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9DUkVBVEVEUkFHSU1BR0UsKFdQQVJBTTMyKWksMCkKICNkZWZpbmUgSGVhZGVyX0dldE9yZGVyQXJyYXkoaHduZCxpQ291bnQsbHBpKSBcCi0gIChCT09MMzIpU05ETVNHKChod25kKSxIRE1fR0VUT1JERVJBUlJBWSwoV1BBUkFNMzIpaUNvdW50LChMUEFSQU0pbHBpKQorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kKSxIRE1fR0VUT1JERVJBUlJBWSwoV1BBUkFNMzIpaUNvdW50LChMUEFSQU0pbHBpKQogI2RlZmluZSBIZWFkZXJfU2V0T3JkZXJBcnJheShod25kLGlDb3VudCxscGkpIFwKLSAgKEJPT0wzMilTTkRNU0coKGh3bmQpLEhETV9TRVRPUkRFUkFSUkFZLChXUEFSQU0zMilpQ291bnQsKExQQVJBTSlscGkpCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9TRVRPUkRFUkFSUkFZLChXUEFSQU0zMilpQ291bnQsKExQQVJBTSlscGkpCiAjZGVmaW5lIEhlYWRlcl9TZXRIb3REaXZpZGVyKGh3bmQsZlBvcyxkdykgXAotICAoSU5UMzIpU05ETVNHKChod25kKSxIRE1fU0VUSE9URElWSURFUiwoV1BBUkFNMzIpZlBvcywoTFBBUkFNKWR3KQorICAoSU5UMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9TRVRIT1RESVZJREVSLChXUEFSQU0zMilmUG9zLChMUEFSQU0pZHcpCiAjZGVmaW5lIEhlYWRlcl9TZXRVbmljb2RlRm9ybWF0KGh3bmQsZlVuaWNvZGUpIFwKLSAgKEJPT0wzMilTTkRNU0coKGh3bmQpLEhETV9TRVRVTklDT0RFRk9STUFULChXUEFSQU0zMikoZlVuaWNvZGUpLDApCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9TRVRVTklDT0RFRk9STUFULChXUEFSQU0zMikoZlVuaWNvZGUpLDApCiAjZGVmaW5lIEhlYWRlcl9HZXRVbmljb2RlRm9ybWF0KGh3bmQpIFwKLSAgKEJPT0wzMilTTkRNU0coKGh3bmQpLEhETV9HRVRVTklDT0RFRk9STUFULDAsMCkKLSNlbmRpZiAvKiAjaWZuZGVmIF9fV0lORV9fICovCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9HRVRVTklDT0RFRk9STUFULDAsMCkKIAogCiAvKiBUb29sYmFyICovCkBAIC02MDIsNyArNjQ1LDggQEAKICNkZWZpbmUgVEJJRl9MUEFSQU0gICAgICAgICAgICAgMHgwMDAwMDAxMAogI2RlZmluZSBUQklGX0NPTU1BTkQgICAgICAgICAgICAweDAwMDAwMDIwCiAjZGVmaW5lIFRCSUZfU0laRSAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSAKKworI2RlZmluZSBUQkJGX0xBUkdFCQkweDAwMDEgCiAKICNkZWZpbmUgVEJfRU5BQkxFQlVUVE9OICAgICAgICAgIChXTV9VU0VSKzEpCiAjZGVmaW5lIFRCX0NIRUNLQlVUVE9OICAgICAgICAgICAoV01fVVNFUisyKQpAQCAtMTM0Miw2ICsxMzg2LDMzMCBAQAogI2RlZmluZSBUVk5fRklSU1QgICAgICAgICAgICAgICAoMFUtNDAwVSkKICNkZWZpbmUgVFZOX0xBU1QgICAgICAgICAgICAgICAgKDBVLTQ5OVUpCiAKKyNkZWZpbmUgVFZOX1NFTENIQU5HSU5HICAgICAgICAgKFRWTl9GSVJTVC0xKQorI2RlZmluZSBUVk5fU0VMQ0hBTkdFRCAgICAgICAgICAoVFZOX0ZJUlNULTIpCisjZGVmaW5lIFRWTl9HRVRESVNQSU5GTyAgICAgICAgIChUVk5fRklSU1QtMykKKyNkZWZpbmUgVFZOX1NFVERJU1BJTkZPICAgICAgICAgKFRWTl9GSVJTVC00KQorI2RlZmluZSBUVk5fSVRFTUVYUEFORElORyAgICAgICAoVFZOX0ZJUlNULTUpCisjZGVmaW5lIFRWTl9JVEVNRVhQQU5ERUQgICAgICAgIChUVk5fRklSU1QtNikKKyNkZWZpbmUgVFZOX0JFR0lORFJBRyAgICAgICAgICAgKFRWTl9GSVJTVC03KQorI2RlZmluZSBUVk5fQkVHSU5SRFJBRyAgICAgICAgICAoVFZOX0ZJUlNULTgpCisjZGVmaW5lIFRWTl9ERUxFVEVJVEVNICAgICAgICAgIChUVk5fRklSU1QtOSkKKyNkZWZpbmUgVFZOX0JFR0lOTEFCRUxFRElUICAgICAgKFRWTl9GSVJTVC0xMCkKKyNkZWZpbmUgVFZOX0VORExBQkVMRURJVCAgICAgICAgKFRWTl9GSVJTVC0xMSkKKyNkZWZpbmUgVFZOX0tFWURPV04gICAgICAgICAgICAgKFRWTl9GSVJTVC0xMikKKyNkZWZpbmUgVFZOX0dFVElORk9USVBBICAgICAgICAgKFRWTl9GSVJTVC0xMykKKyNkZWZpbmUgVFZOX0dFVElORk9USVBXICAgICAgICAgKFRWTl9GSVJTVC0xNCkKKyNkZWZpbmUgVFZOX1NJTkdMRUVYUEFORCAgICAgICAgKFRWTl9GSVJTVC0xNSkKKworCisjZGVmaW5lIFRWTl9TRUxDSEFOR0lOR1cgICAgICAgIChUVk5fRklSU1QtNTApCisjZGVmaW5lIFRWTl9TRUxDSEFOR0VEVyAgICAgICAgIChUVk5fRklSU1QtNTEpCisjZGVmaW5lIFRWTl9HRVRESVNQSU5GT1cgICAgICAgIChUVk5fRklSU1QtNTIpCisjZGVmaW5lIFRWTl9TRVRESVNQSU5GT1cgICAgICAgIChUVk5fRklSU1QtNTMpCisjZGVmaW5lIFRWTl9JVEVNRVhQQU5ESU5HVyAgICAgIChUVk5fRklSU1QtNTQpCisjZGVmaW5lIFRWTl9JVEVNRVhQQU5ERURXICAgICAgIChUVk5fRklSU1QtNTUpCisjZGVmaW5lIFRWTl9CRUdJTkRSQUdXICAgICAgICAgIChUVk5fRklSU1QtNTYpCisjZGVmaW5lIFRWTl9CRUdJTlJEUkFHVyAgICAgICAgIChUVk5fRklSU1QtNTcpCisjZGVmaW5lIFRWTl9ERUxFVEVJVEVNVyAgICAgICAgIChUVk5fRklSU1QtNTgpCisjZGVmaW5lIFRWTl9CRUdJTkxBQkVMRURJVFcgICAgIChUVk5fRklSU1QtNTkpCisjZGVmaW5lIFRWTl9FTkRMQUJFTEVESVRXICAgICAgIChUVk5fRklSU1QtNjApCisKKworCisjZGVmaW5lIFRWSUZfVEVYVCAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFZJRl9JTUFHRSAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBUVklGX1BBUkFNICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRWSUZfU1RBVEUgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgVFZJRl9IQU5ETEUgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBUVklGX1NFTEVDVEVESU1BR0UgICAgMHgwMDIwCisjZGVmaW5lIFRWSUZfQ0hJTERSRU4gICAgICAgICAweDAwNDAKKyNkZWZpbmUgVFZJRl9JTlRFR1JBTCAgICAgICAgIDB4MDA4MAorI2RlZmluZSBUVklGX0RJX1NFVElURU0JCSAgMHgxMDAwCisKKyNkZWZpbmUgVFZJX1JPT1QgICAgICAgICAgICAgIDB4ZmZmZjAwMDAgICAgICAvKiAtNjU1MzYgKi8KKyNkZWZpbmUgVFZJX0ZJUlNUICAgICAgICAgICAgIDB4ZmZmZjAwMDEgICAgICAvKiAtNjU1MzUgKi8KKyNkZWZpbmUgVFZJX0xBU1QgICAgICAgICAgICAgIDB4ZmZmZjAwMDIgICAgICAvKiAtNjU1MzQgKi8KKyNkZWZpbmUgVFZJX1NPUlQgICAgICAgICAgICAgIDB4ZmZmZjAwMDMgICAgICAvKiAtNjU1MzMgKi8KKworI2RlZmluZSBUVklTX0ZPQ1VTRUQgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRWSVNfU0VMRUNURUQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFZJU19DVVQgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBUVklTX0RST1BISUxJVEVEICAgICAgMHgwMDA4CisjZGVmaW5lIFRWSVNfQk9MRCAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgVFZJU19FWFBBTkRFRCAgICAgICAgIDB4MDAyMAorI2RlZmluZSBUVklTX0VYUEFOREVET05DRSAgICAgMHgwMDQwCisjZGVmaW5lIFRWSVNfT1ZFUkxBWU1BU0sgICAgICAweDBmMDAKKyNkZWZpbmUgVFZJU19TVEFURUlNQUdFTUFTSyAgIDB4ZjAwMAorI2RlZmluZSBUVklTX1VTRVJNQVNLICAgICAgICAgMHhmMDAwCisKKyNkZWZpbmUgVFZIVF9OT1dIRVJFICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUVkhUX09OSVRFTUlDT04gICAgICAgMHgwMDAyCisjZGVmaW5lIFRWSFRfT05JVEVNTEFCRUwgICAgICAweDAwMDQKKyNkZWZpbmUgVFZIVF9PTklURU1JTkRFTlQgICAgIDB4MDAwOAorI2RlZmluZSBUVkhUX09OSVRFTUJVVFRPTiAgICAgMHgwMDEwCisjZGVmaW5lIFRWSFRfT05JVEVNUklHSFQgICAgICAweDAwMjAKKyNkZWZpbmUgVFZIVF9PTklURU1TVEFURUlDT04gIDB4MDA0MAorI2RlZmluZSBUVkhUX09OSVRFTSAgICAgICAgICAgMHgwMDQ2CisjZGVmaW5lIFRWSFRfQUJPVkUgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgVFZIVF9CRUxPVyAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBUVkhUX1RPUklHSFQgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFRWSFRfVE9MRUZUICAgICAgICAgICAweDA4MDAKKworI2RlZmluZSBUVlNfSEFTQlVUVE9OUyAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRWU19IQVNMSU5FUyAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFZTX0xJTkVTQVRST09UICAgICAgIDB4MDAwNAorI2RlZmluZSBUVlNfRURJVExBQkVMUyAgICAgICAgMHgwMDA4CisjZGVmaW5lIFRWU19ESVNBQkxFRFJBR0RST1AgICAweDAwMTAKKyNkZWZpbmUgVFZTX1NIT1dTRUxBTFdBWVMgICAgIDB4MDAyMAorI2RlZmluZSBUVlNfUlRMUkVBRElORyAgICAgICAgMHgwMDQwCisjZGVmaW5lIFRWU19OT1RPT0xUSVBTICAgICAgICAweDAwODAKKyNkZWZpbmUgVFZTX0NIRUNLQk9YRVMgICAgICAgIDB4MDEwMAorI2RlZmluZSBUVlNfVFJBQ0tTRUxFQ1QgICAgICAgMHgwMjAwCisjZGVmaW5lIFRWU19TSU5HTEVFWFBBTkQgCSAgMHgwNDAwCisjZGVmaW5lIFRWU19JTkZPVElQICAgICAgCSAgMHgwODAwCisjZGVmaW5lIFRWU19GVUxMUk9XU0VMRUNUCSAgMHgxMDAwCisjZGVmaW5lIFRWU19OT1NDUk9MTCAgICAgCSAgMHgyMDAwCisjZGVmaW5lIFRWU19OT05FVkVOSEVJR0hUCSAgMHg0MDAwCisKKyNkZWZpbmUgVFZTX1NIQVJFRElNQUdFTElTVFMgIDB4MDAwMAorI2RlZmluZSBUVlNfUFJJVkFURUlNQUdFTElTVFMgMHgwNDAwCisKKworI2RlZmluZSBUVkVfQ09MTEFQU0UgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRWRV9FWFBBTkQgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFZFX1RPR0dMRSAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBUVkVfRVhQQU5EUEFSVElBTCAgICAgMHg0MDAwCisjZGVmaW5lIFRWRV9DT0xMQVBTRVJFU0VUICAgICAweDgwMDAKKworI2RlZmluZSBUVkdOX1JPT1QgICAgICAgICAgICAgMAorI2RlZmluZSBUVkdOX05FWFQgICAgICAgICAgICAgMQorI2RlZmluZSBUVkdOX1BSRVZJT1VTICAgICAgICAgMgorI2RlZmluZSBUVkdOX1BBUkVOVCAgICAgICAgICAgMworI2RlZmluZSBUVkdOX0NISUxEICAgICAgICAgICAgNAorI2RlZmluZSBUVkdOX0ZJUlNUVklTSUJMRSAgICAgNQorI2RlZmluZSBUVkdOX05FWFRWSVNJQkxFICAgICAgNgorI2RlZmluZSBUVkdOX1BSRVZJT1VTVklTSUJMRSAgNworI2RlZmluZSBUVkdOX0RST1BISUxJVEUgICAgICAgOAorI2RlZmluZSBUVkdOX0NBUkVUICAgICAgICAgICAgOQorI2RlZmluZSBUVkdOX0xBU1RWSVNJQkxFICAgICAgMTAKKworI2RlZmluZSBUVkNfVU5LTk9XTiAgICAgICAgICAgMHgwMAorI2RlZmluZSBUVkNfQllNT1VTRSAgICAgICAgICAgMHgwMQorI2RlZmluZSBUVkNfQllLRVlCT0FSRCAgICAgICAgMHgwMgorCisKK3R5cGVkZWYgSEFORExFMzIgSFRSRUVJVEVNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICBVSU5UMzIgbWFzazsKKyAgICAgIEhUUkVFSVRFTSBoSXRlbTsKKyAgICAgIFVJTlQzMiBzdGF0ZTsKKyAgICAgIFVJTlQzMiBzdGF0ZU1hc2s7CisgICAgICBMUFNUUiBwc3pUZXh0OworICAgICAgaW50IGNjaFRleHRNYXg7CisgICAgICBpbnQgaUltYWdlOworICAgICAgaW50IGlTZWxlY3RlZEltYWdlOworICAgICAgaW50IGNDaGlsZHJlbjsKKyAgICAgIExQQVJBTSBsUGFyYW07Cit9IFRWX0lURU0sICpMUFRWSVRFTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgVUlOVDMyIG1hc2s7CisgICAgICBIVFJFRUlURU0gaEl0ZW07CisgICAgICBVSU5UMzIgc3RhdGU7CisgICAgICBVSU5UMzIgc3RhdGVNYXNrOworICAgICAgTFBTVFIgcHN6VGV4dDsKKyAgICAgIGludCBjY2hUZXh0TWF4OworICAgICAgaW50IGlJbWFnZTsKKyAgICAgIGludCBpU2VsZWN0ZWRJbWFnZTsKKyAgICAgIGludCBjQ2hpbGRyZW47CisgICAgICBMUEFSQU0gbFBhcmFtOworICAgICAgaW50IGlJbnRlZ3JhbDsKK30gVFZfSVRFTUVYLCAqTFBUVklURU1FWDsKKworI2RlZmluZSBUVklURU0gVFZfSVRFTQorCisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVFZJTlNFUlRTVFJVQ1QgeworICAgICAgICBIVFJFRUlURU0gaFBhcmVudDsKKyAgICAgICAgSFRSRUVJVEVNIGhJbnNlcnRBZnRlcjsKKyAgICAgICAgVFZfSVRFTSBpdGVtOworfSBUVklOU0VSVFNUUlVDVCwgKkxQVFZJTlNFUlRTVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IHRhZ05NVFJFRVZJRVcgeworCU5NSERSCWhkcjsKKwlVSU5UMzIJYWN0aW9uOworCVRWSVRFTQlpdGVtT2xkOworCVRWSVRFTQlpdGVtTmV3OworCVBPSU5UMzIJcHREcmFnOworfSBOTVRSRUVWSUVXLCAqTFBOTVRSRUVWSUVXOworCit0eXBlZGVmIHN0cnVjdCB0YWdUVkRJU1BJTkZPIHsKKwlOTUhEUgloZHI7CisJVFZJVEVNCWl0ZW07Cit9IE5NVFZESVNQSU5GTywgKkxQTk1UVkRJU1BJTkZPOworCisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVFZISVRURVNUSU5GTyB7CisgICAgICAgIFBPSU5UMzIgcHQ7CisgICAgICAgIFVJTlQzMiBmbGFnczsKKyAgICAgICAgSFRSRUVJVEVNIGhJdGVtOworfSBUVkhJVFRFU1RJTkZPLCAqTFBUVkhJVFRFU1RJTkZPOworCisKKyNkZWZpbmUgVHJlZVZpZXdfSW5zZXJ0SXRlbShod25kSEQsIHBoZGkpIFwKKyAgKElOVDMyKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX0lOU0VSVElURU0sIDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShMUFRWX0lOU0VSVFNUUlVDVCkocGhkaSkpCisjZGVmaW5lIFRyZWVWaWV3X0RlbGV0ZUl0ZW0oaHduZCwgaEl0ZW0pIFwKKyAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9ERUxFVEVJVEVNLCAwLCAoTFBBUkFNKShIVFJFRUlURU0pKGhJdGVtKSkKKyNkZWZpbmUgVHJlZVZpZXdfRGVsZXRlQWxsSXRlbXMoaHduZCkgXAorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX0RFTEVURUlURU0sIDAsIChMUEFSQU0pVFZJX1JPT1QpCisjZGVmaW5lIFRyZWVWaWV3X0V4cGFuZChod25kLCBoaXRlbSwgY29kZSkgXAorIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fRVhQQU5ELCAoV1BBUkFNKWNvZGUsIFwKKwkoTFBBUkFNKShIVFJFRUlURU0pKGhpdGVtKSkKKworI2RlZmluZSBUcmVlVmlld19HZXRJdGVtUmVjdChod25kLCBoaXRlbSwgcHJjLCBjb2RlKSBcCisgKCooSFRSRUVJVEVNICopcHJjID0gKGhpdGVtKSwgKEJPT0wpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBcCisJCQlUVk1fR0VUSVRFTVJFQ1QsIChXUEFSQU0zMikoY29kZSksIChMUEFSQU0pKFJFQ1QgKikocHJjKSkpCisKKyNkZWZpbmUgVHJlZVZpZXdfR2V0Q291bnQoaHduZCkgXAorICAgIChVSU5UMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fR0VUQ09VTlQsIDAsIDApCisjZGVmaW5lIFRyZWVWaWV3X0dldEluZGVudChod25kKSBcCisgICAgKFVJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9HRVRJTkRFTlQsIDAsIDApCisjZGVmaW5lIFRyZWVWaWV3X1NldEluZGVudChod25kLCBpbmRlbnQpIFwKKyAgICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX1NFVElOREVOVCwgKFdQQVJBTSlpbmRlbnQsIDApCisKKyNkZWZpbmUgVHJlZVZpZXdfR2V0SW1hZ2VMaXN0KGh3bmQsIGlJbWFnZSkgXAorICAgIChISU1BR0VMSVNUKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX0dFVElNQUdFTElTVCwgaUltYWdlLCAwKQorCisjZGVmaW5lIFRyZWVWaWV3X1NldEltYWdlTGlzdChod25kLCBoaW1sLCBpSW1hZ2UpIFwKKyAgICAoSElNQUdFTElTVClTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9TRVRJTUFHRUxJU1QsIGlJbWFnZSwgXAorIChMUEFSQU0pKFVJTlQzMikoSElNQUdFTElTVCkoaGltbCkpCisKKyNkZWZpbmUgVHJlZVZpZXdfR2V0TmV4dEl0ZW0oaHduZCwgaGl0ZW0sIGNvZGUpIFwKKyAgICAoSFRSRUVJVEVNKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX0dFVE5FWFRJVEVNLCAoV1BBUkFNKWNvZGUsXAorKExQQVJBTSkoSFRSRUVJVEVNKSAoaGl0ZW0pKQorCisjZGVmaW5lIFRyZWVWaWV3X0dldENoaWxkKGh3bmQsIGhpdGVtKSBcCisJIAkgVHJlZVZpZXdfR2V0TmV4dEl0ZW0oaHduZCwgaGl0ZW0gLCBUVkdOX0NISUxEKQorI2RlZmluZSBUcmVlVmlld19HZXROZXh0U2libGluZyhod25kLCBoaXRlbSkgXAorCQlUcmVlVmlld19HZXROZXh0SXRlbShod25kLCBoaXRlbSAsIFRWR05fTkVYVCkKKyNkZWZpbmUgVHJlZVZpZXdfR2V0UHJldlNpYmxpbmcoaHduZCwgaGl0ZW0pIFwKKwkJVHJlZVZpZXdfR2V0TmV4dEl0ZW0oaHduZCwgaGl0ZW0gLCBUVkdOX1BSRVZJT1VTKQorI2RlZmluZSBUcmVlVmlld19HZXRQYXJlbnQoaHduZCwgaGl0ZW0pIFwKKwkJVHJlZVZpZXdfR2V0TmV4dEl0ZW0oaHduZCwgaGl0ZW0gLCBUVkdOX1BBUkVOVCkKKyNkZWZpbmUgVHJlZVZpZXdfR2V0Rmlyc3RWaXNpYmxlKGh3bmQpICBcCisJCVRyZWVWaWV3X0dldE5leHRJdGVtKGh3bmQsIE5VTEwsIFRWR05fRklSU1RWSVNJQkxFKQorI2RlZmluZSBUcmVlVmlld19HZXRMYXN0VmlzaWJsZShod25kKSAgIFwKKwkJVHJlZVZpZXdfR2V0TmV4dEl0ZW0oaHduZCwgTlVMTCwgVFZHTl9MQVNUVklTSUJMRSkKKyNkZWZpbmUgVHJlZVZpZXdfR2V0TmV4dFZpc2libGUoaHduZCwgaGl0ZW0pIFwKKwkJVHJlZVZpZXdfR2V0TmV4dEl0ZW0oaHduZCwgaGl0ZW0gLCBUVkdOX05FWFRWSVNJQkxFKQorI2RlZmluZSBUcmVlVmlld19HZXRQcmV2VmlzaWJsZShod25kLCBoaXRlbSkgXAorCQlUcmVlVmlld19HZXROZXh0SXRlbShod25kLCBoaXRlbSAsIFRWR05fUFJFVklPVVNWSVNJQkxFKQorI2RlZmluZSBUcmVlVmlld19HZXRTZWxlY3Rpb24oaHduZCkgXAorCQlUcmVlVmlld19HZXROZXh0SXRlbShod25kLCBOVUxMLCBUVkdOX0NBUkVUKQorI2RlZmluZSBUcmVlVmlld19HZXREcm9wSGlsaWdodChod25kKSBcCisJCVRyZWVWaWV3X0dldE5leHRJdGVtKGh3bmQsIE5VTEwsIFRWR05fRFJPUEhJTElURSkKKyNkZWZpbmUgVHJlZVZpZXdfR2V0Um9vdChod25kKSBcCisJCVRyZWVWaWV3X0dldE5leHRJdGVtKGh3bmQsIE5VTEwsIFRWR05fUk9PVCkKKyNkZWZpbmUgVHJlZVZpZXdfR2V0TGFzdFZpc2libGUoaHduZCkgXAorCQlUcmVlVmlld19HZXROZXh0SXRlbShod25kLCBOVUxMLCBUVkdOX0xBU1RWSVNJQkxFKQorCisKKyNkZWZpbmUgVHJlZVZpZXdfU2VsZWN0KGh3bmQsIGhpdGVtLCBjb2RlKSBcCisgKFVJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9TRUxFQ1RJVEVNLCAoV1BBUkFNKWNvZGUsIFwKKyhMUEFSQU0pKFVJTlQzMikoaGl0ZW0pKQorCisKKyNkZWZpbmUgVHJlZVZpZXdfU2VsZWN0SXRlbShod25kLCBoaXRlbSkgXAorCQlUcmVlVmlld19TZWxlY3QoaHduZCwgaGl0ZW0sIFRWR05fQ0FSRVQpCisjZGVmaW5lIFRyZWVWaWV3X1NlbGVjdERyb3BUYXJnZXQoaHduZCwgaGl0ZW0pIFwKKyAgICAgICAgCVRyZWVWaWV3X1NlbGVjdChod25kLCBoaXRlbSwgVFZHTl9EUk9QSElMSVRFKQorLyogRklYTUUKKyNkZWZpbmUgVHJlZVZpZXdfU2VsZWN0U2V0Rmlyc3RWaXNpYmxlKGh3bmQsIGhpdGVtKSAgXCAKKwkJVHJlZVZpZXdfU2VsZWN0KGh3bmQsIGhpdGVtLCBUVkdOX0ZJUlNUVklTSUJMRSkKKyovCisKKyNkZWZpbmUgVHJlZVZpZXdfR2V0SXRlbShod25kLCBwaXRlbSkgXAorIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fR0VUSVRFTSwgMCwgKExQQVJBTSkgKFRWX0lURU0gKikocGl0ZW0pKQorCisjZGVmaW5lIFRyZWVWaWV3X1NldEl0ZW0oaHduZCwgcGl0ZW0pIFwKKyAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX1NFVElURU0sIDAsIChMUEFSQU0pKGNvbnN0IFRWX0lURU0gKikocGl0ZW0pKSAKKworI2RlZmluZSBUcmVlVmlld19FZGl0TGFiZWwoaHduZCwgaGl0ZW0pIFwKKyAgICAoSFdORClTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9FRElUTEFCRUwsIDAsIChMUEFSQU0pKEhUUkVFSVRFTSkoaGl0ZW0pKQorCisKKyNkZWZpbmUgVHJlZVZpZXdfR2V0RWRpdENvbnRyb2woaHduZCkgXAorICAgIChIV05EKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX0dFVEVESVRDT05UUk9MLCAwLCAwKQorCisjZGVmaW5lIFRyZWVWaWV3X0dldFZpc2libGVDb3VudChod25kKSBcCisgICAgKFVJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9HRVRWSVNJQkxFQ09VTlQsIDAsIDApCisKKyNkZWZpbmUgVHJlZVZpZXdfSGl0VGVzdChod25kLCBscGh0KSBcCisgICAgKEhUUkVFSVRFTSlTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9ISVRURVNULCAwLFwKKyhMUEFSQU0pKExQVFZfSElUVEVTVElORk8pKGxwaHQpKQorCisjZGVmaW5lIFRyZWVWaWV3X0NyZWF0ZURyYWdJbWFnZShod25kLCBoaXRlbSkgXAorICAgIChISU1BR0VMSVNUKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX0NSRUFURURSQUdJTUFHRSwgMCxcCisoTFBBUkFNKShIVFJFRUlURU0pKGhpdGVtKSkKKworI2RlZmluZSBUcmVlVmlld19Tb3J0Q2hpbGRyZW4oaHduZCwgaGl0ZW0sIHJlY3Vyc2UpIFwKKyAgICAoQk9PTClTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9TT1JUQ0hJTERSRU4sIChXUEFSQU0pcmVjdXJzZSxcCisoTFBBUkFNKShIVFJFRUlURU0pKGhpdGVtKSkKKworI2RlZmluZSBUcmVlVmlld19FbnN1cmVWaXNpYmxlKGh3bmQsIGhpdGVtKSBcCisgICAgKEJPT0wpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fRU5TVVJFVklTSUJMRSwgMCwgKExQQVJBTSkoVUlOVDMyKShoaXRlbSkpCisKKyNkZWZpbmUgVHJlZVZpZXdfU29ydENoaWxkcmVuQ0IoaHduZCwgcHNvcnQsIHJlY3Vyc2UpIFwKKyAgICAoQk9PTClTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9TT1JUQ0hJTERSRU5DQiwgKFdQQVJBTSlyZWN1cnNlLCBcCisgICAgKExQQVJBTSkoTFBUVl9TT1JUQ0IpKHBzb3J0KSkKKworI2RlZmluZSBUcmVlVmlld19FbmRFZGl0TGFiZWxOb3coaHduZCwgZkNhbmNlbCkgXAorICAgIChCT09MKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX0VOREVESVRMQUJFTE5PVywgKFdQQVJBTSlmQ2FuY2VsLCAwKQorCisjZGVmaW5lIFRyZWVWaWV3X0dldElTZWFyY2hTdHJpbmcoaHduZFRWLCBscHN6KSBcCisgICAgKEJPT0wpU2VuZE1lc3NhZ2UzMkEoKGh3bmRUViksIFRWTV9HRVRJU0VBUkNIU1RSSU5HLCAwLCBcCisJCQkJCQkJKExQQVJBTSkoTFBUU1RSKWxwc3opCisKKyNkZWZpbmUgVHJlZVZpZXdfU2V0SXRlbUhlaWdodChod25kLCAgaUhlaWdodCkgXAorICAgIChJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9TRVRJVEVNSEVJR0hULCAoV1BBUkFNKWlIZWlnaHQsIDApCisjZGVmaW5lIFRyZWVWaWV3X0dldEl0ZW1IZWlnaHQoaHduZCkgXAorICAgIChJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9HRVRJVEVNSEVJR0hULCAwLCAwKQorCisjZGVmaW5lIFRyZWVWaWV3X1NldEJrQ29sb3IoaHduZCwgY2xyKSBcCisgICAgKENPTE9SUkVGKVNlbmRNZXNzYWdlMzJBKChod25kKSwgVFZNX1NFVEJLQ09MT1IsIDAsIChMUEFSQU0pY2xyKQorCisjZGVmaW5lIFRyZWVWaWV3X1NldFRleHRDb2xvcihod25kLCBjbHIpIFwKKyAgICAoQ09MT1JSRUYpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fU0VUVEVYVENPTE9SLCAwLCAoTFBBUkFNKWNscikKKworI2RlZmluZSBUcmVlVmlld19HZXRCa0NvbG9yKGh3bmQpIFwKKyAgICAoQ09MT1JSRUYpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fR0VUQktDT0xPUiwgMCwgMCkKKworI2RlZmluZSBUcmVlVmlld19HZXRUZXh0Q29sb3IoaHduZCkgXAorICAgIChDT0xPUlJFRilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9HRVRURVhUQ09MT1IsIDAsIDApCisKKyNkZWZpbmUgVHJlZVZpZXdfU2V0U2Nyb2xsVGltZShod25kLCB1VGltZSkgXAorICAgIChVSU5UMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fU0VUU0NST0xMVElNRSwgdVRpbWUsIDApCisKKyNkZWZpbmUgVHJlZVZpZXdfR2V0U2Nyb2xsVGltZShod25kKSBcCisgICAgKFVJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksIFRWTV9HRVRTQ1JPTExUSU1FLCAwLCAwKQorCisjZGVmaW5lIFRyZWVWaWV3X1NldEluc2VydE1hcmtDb2xvcihod25kLCBjbHIpIFwKKyAgICAoQ09MT1JSRUYpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fU0VUSU5TRVJUTUFSS0NPTE9SLCAwLCAoTFBBUkFNKWNscikKKyNkZWZpbmUgVHJlZVZpZXdfR2V0SW5zZXJ0TWFya0NvbG9yKGh3bmQpIFwKKyAgICAoQ09MT1JSRUYpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLCBUVk1fR0VUSU5TRVJUTUFSS0NPTE9SLCAwLCAwKQorCisKKworCisKKworCisKIAogLyogTGlzdHZpZXcgY29udHJvbCAqLwogCkBAIC0xNDU2LDE0ICsxODI0LDYzIEBACiAjZGVmaW5lIExWTV9JTlNFUlRDT0xVTU4gICAgICAgIFdJTkVMSUJfTkFNRV9BVyhMVk1fSU5TRVJUQ09MVU1OKQogI2RlZmluZSBMVk1fREVMRVRFQ09MVU1OICAgICAgICAoTFZNX0ZJUlNUKzI4KQogI2RlZmluZSBMVk1fR0VUQ09MVU1OV0lEVEggICAgICAoTFZNX0ZJUlNUKzI5KQotI2RlZmluZSBMVk1fR0VUSEVBREVSICAgICAgICAgICAoTFZNX0ZJUlNUKzMwKQorI2RlZmluZSBMVk1fU0VUQ09MVU1OV0lEVEggICAgICAoTFZNX0ZJUlNUKzMwKQorI2RlZmluZSBMVk1fR0VUSEVBREVSICAgICAgICAgICAoTFZNX0ZJUlNUKzMxKQogCisjZGVmaW5lIExWTV9DUkVBVEVEUkFHSU1BR0UgICAgIChMVk1fRklSU1QrMzMpCisjZGVmaW5lIExWTV9HRVRWSUVXUkVDVCAgICAgICAgIChMVk1fRklSU1QrMzQpCisjZGVmaW5lIExWTV9HRVRURVhUQ09MT1IgICAgICAgIChMVk1fRklSU1QrMzUpCisjZGVmaW5lIExWTV9TRVRURVhUQ09MT1IgICAgICAgIChMVk1fRklSU1QrMzYpCisjZGVmaW5lIExWTV9HRVRURVhUQktDT0xPUiAgICAgIChMVk1fRklSU1QrMzcpCisjZGVmaW5lIExWTV9TRVRURVhUQktDT0xPUiAgICAgIChMVk1fRklSU1QrMzgpCisjZGVmaW5lIExWTV9HRVRUT1BJTkRFWCAgICAgICAgIChMVk1fRklSU1QrMzkpCisjZGVmaW5lIExWTV9HRVRDT1VOVFBFUlBBR0UgICAgIChMVk1fRklSU1QrNDApCisjZGVmaW5lIExWTV9HRVRPUklHSU4gICAgICAgICAgIChMVk1fRklSU1QrNDEpCisjZGVmaW5lIExWTV9VUERBVEUgICAgICAgICAgICAgIChMVk1fRklSU1QrNDIpCisjZGVmaW5lIExWTV9TRVRJVEVNU1RBVEUgICAgICAgIChMVk1fRklSU1QrNDMpCisjZGVmaW5lIExWTV9HRVRJVEVNU1RBVEUgICAgICAgIChMVk1fRklSU1QrNDQpCisjZGVmaW5lIExWTV9HRVRJVEVNVEVYVDMyQSAgICAgIChMVk1fRklSU1QrNDUpCisjZGVmaW5lIExWTV9HRVRJVEVNVEVYVDMyVyAgICAgIChMVk1fRklSU1QrMTE1KQorI2RlZmluZSBMVk1fR0VUSVRFTVRFWFQgICAgICAgICBXSU5FTElCX05BTUVfQVcoTFZNX0dFVElURU1URVhUKQorI2RlZmluZSBMVk1fU0VUSVRFTVRFWFQzMkEgICAgICAoTFZNX0ZJUlNUKzQ2KQorI2RlZmluZSBMVk1fU0VUSVRFTVRFWFQzMlcgICAgICAoTFZNX0ZJUlNUKzExNikKKyNkZWZpbmUgTFZNX1NFVElURU1URVhUICAgICAgICAgV0lORUxJQl9OQU1FX0FXKExWTV9TRVRJVEVNVEVYVCkKKyNkZWZpbmUgTFZNX1NFVElURU1DT1VOVCAgICAgICAgKExWTV9GSVJTVCs0NykKICNkZWZpbmUgTFZNX1NPUlRJVEVNUyAgICAgICAgICAgKExWTV9GSVJTVCs0OCkKKyNkZWZpbmUgTFZNX1NFVElURU1QT1NJVElPTjMyICAgKExWTV9GSVJTVCs0OSkKICNkZWZpbmUgTFZNX0dFVFNFTEVDVEVEQ09VTlQgICAgKExWTV9GSVJTVCs1MCkKLQorI2RlZmluZSBMVk1fR0VUSVRFTVNQQUNJTkcgICAgICAoTFZNX0ZJUlNUKzUxKQorI2RlZmluZSBMVk1fR0VUSVNFQVJDSFNUUklORzMyQSAoTFZNX0ZJUlNUKzUyKQorI2RlZmluZSBMVk1fR0VUSVNFQVJDSFNUUklORzMyVyAoTFZNX0ZJUlNUKzExNykKKyNkZWZpbmUgTFZNX0dFVElTRUFSQ0hTVFJJTkcgICAgV0lORUxJQl9OQU1FX0FXKExWTV9HRVRJU0VBUkNIU1RSSU5HKQorI2RlZmluZSBMVk1fU0VUSUNPTlNQQUNJTkcgICAgICAoTFZNX0ZJUlNUKzUzKQogI2RlZmluZSBMVk1fU0VURVhURU5ERURMSVNUVklFV1NUWUxFIChMVk1fRklSU1QrNTQpCiAjZGVmaW5lIExWTV9HRVRFWFRFTkRFRExJU1RWSUVXU1RZTEUgKExWTV9GSVJTVCs1NSkKKyNkZWZpbmUgTFZNX0dFVFNVQklURU1SRUNUICAgICAgKExWTV9GSVJTVCs1NikKKyNkZWZpbmUgTFZNX1NVQklURU1ISVRURVNUICAgICAgKExWTV9GSVJTVCs1NykKKyNkZWZpbmUgTFZNX1NFVENPTFVNTk9SREVSQVJSQVkgKExWTV9GSVJTVCs1OCkKKyNkZWZpbmUgTFZNX0dFVENPTFVNTk9SREVSQVJSQVkgKExWTV9GSVJTVCs1OSkKKyNkZWZpbmUgTFZNX1NFVEhPVElURU0gICAgICAgICAgKExWTV9GSVJTVCs2MCkKKyNkZWZpbmUgTFZNX0dFVEhPVElURU0gICAgICAgICAgKExWTV9GSVJTVCs2MSkKKyNkZWZpbmUgTFZNX1NFVEhPVENVUlNPUiAgICAgICAgKExWTV9GSVJTVCs2MikKKyNkZWZpbmUgTFZNX0dFVEhPVENVUlNPUiAgICAgICAgKExWTV9GSVJTVCs2MykKKyNkZWZpbmUgTFZNX0FQUFJPWElNQVRFVklFV1JFQ1QgKExWTV9GSVJTVCs2NCkKKyNkZWZpbmUgTFZNX1NFVFdPUktBUkVBUyAgICAgICAgKExWTV9GSVJTVCs2NSkKKyNkZWZpbmUgTFZNX0dFVFNFTEVDVElPTk1BUksgICAgKExWTV9GSVJTVCs2NikKKyNkZWZpbmUgTFZNX1NFVFNFTEVDVElPTk1BUksgICAgKExWTV9GSVJTVCs2NykKKyNkZWZpbmUgTFZNX1NFVEJLSU1BR0UzMkEgICAgICAgKExWTV9GSVJTVCs2OCkKKyNkZWZpbmUgTFZNX1NFVEJLSU1BR0UzMlcgICAgICAgKExWTV9GSVJTVCsxMzgpCisjZGVmaW5lIExWTV9TRVRCS0lNQUdFICAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhMVk1fU0VUQktJTUFHRSkKKyNkZWZpbmUgTFZNX0dFVEJLSU1BR0UzMkEgICAgICAgKExWTV9GSVJTVCs2OSkKKyNkZWZpbmUgTFZNX0dFVEJLSU1BR0UzMlcgICAgICAgKExWTV9GSVJTVCsxMzkpCisjZGVmaW5lIExWTV9HRVRCS0lNQUdFICAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhMVk1fR0VUQktJTUFHRSkKKyNkZWZpbmUgTFZNX0dFVFdPUktBUkVBUyAgICAgICAgKExWTV9GSVJTVCs3MCkKKyNkZWZpbmUgTFZNX1NFVEhPVkVSVElNRSAgICAgICAgKExWTV9GSVJTVCs3MSkKKyNkZWZpbmUgTFZNX0dFVEhPVkVSVElNRSAgICAgICAgKExWTV9GSVJTVCs3MikKKyNkZWZpbmUgTFZNX0dFVE5VTUJFUk9GV09SS0FSRUFTIChMVk1fRklSU1QrNzMpCisjZGVmaW5lIExWTV9TRVRUT09MVElQUyAgICAgICAgIChMVk1fRklSU1QrNzQpCiAKKyNkZWZpbmUgTFZNX0dFVFRPT0xUSVBTICAgICAgICAgKExWTV9GSVJTVCs3OCkKIAogI2RlZmluZSBMVk5fRklSU1QgICAgICAgICAgICAgICAoMFUtMTAwVSkKICNkZWZpbmUgTFZOX0xBU1QgICAgICAgICAgICAgICAgKDBVLTE5OVUpCkBAIC0xNzQ3LDIyICsyMTY0LDI5IEBACiAjZGVmaW5lIEFDTl9TVEFSVCAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQUNOX1NUT1AgICAgICAgICAgICAgICAgMgogCi0jaWZuZGVmIF9fV0lORV9fCi0jZGVmaW5lIEFuaW1hdGVfQ3JlYXRlKGh3bmRQLGlkLGR3U3R5bGUsaEluc3RhbmNlKSBcCi0gICAgQ3JlYXRlV2luZG93KEFOSU1BVEVfQ0xBU1MsTlVMTCxkd1N0eWxlLDAsMCwwLDAsaHduZFAsKEhNRU5VMzIpKGlkKSxoSW5zdGFuY2UsTlVMTCkKLSNkZWZpbmUgQW5pbWF0ZV9PcGVuKGh3bmQsc3pOYW1lKSBcCi0gICAgKEJPT0wzMilTTkRNU0coaHduZCxBQ01fT1BFTiwwLChMUEFSQU0pKExQVFNUUikoc3pOYW1lKSkKLSNkZWZpbmUgQW5pbWF0ZV9PcGVuRXgoaHduZCxoSW5zdCxzek5hbWUpIFwKLSAgICAoQk9PTDMyKVNORE1TRyhod25kLEFDTV9PUEVOLChXUEFSQU0zMiloSW5zdCwoTFBBUkFNKShMUFRTVFIpKHN6TmFtZSkpCisjZGVmaW5lIEFuaW1hdGVfQ3JlYXRlMzJBKGh3bmRQLGlkLGR3U3R5bGUsaEluc3RhbmNlKSBcCisgICAgQ3JlYXRlV2luZG93MzJBKEFOSU1BVEVfQ0xBU1MzMkEsTlVMTCxkd1N0eWxlLDAsMCwwLDAsaHduZFAsKEhNRU5VMzIpKGlkKSxoSW5zdGFuY2UsTlVMTCkKKyNkZWZpbmUgQW5pbWF0ZV9DcmVhdGUzMlcoaHduZFAsaWQsZHdTdHlsZSxoSW5zdGFuY2UpIFwKKyAgICBDcmVhdGVXaW5kb3czMlcoQU5JTUFURV9DTEFTUzMyVyxOVUxMLGR3U3R5bGUsMCwwLDAsMCxod25kUCwoSE1FTlUzMikoaWQpLGhJbnN0YW5jZSxOVUxMKQorI2RlZmluZSBBbmltYXRlX0NyZWF0ZSBXSU5FTElCX05BTUVfQVcoQW5pbWF0ZV9DcmVhdGUpCisjZGVmaW5lIEFuaW1hdGVfT3BlbjMyQShod25kLHN6TmFtZSkgXAorICAgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoaHduZCxBQ01fT1BFTjMyQSwwLChMUEFSQU0pKExQU1RSKShzek5hbWUpKQorI2RlZmluZSBBbmltYXRlX09wZW4zMlcoaHduZCxzek5hbWUpIFwKKyAgICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJXKGh3bmQsQUNNX09QRU4zMlcsMCwoTFBBUkFNKShMUFdTVFIpKHN6TmFtZSkpCisjZGVmaW5lIEFuaW1hdGVfT3BlbiBXSU5FTElCX05BTUVfQVcoQW5pbWF0ZV9PcGVuKQorI2RlZmluZSBBbmltYXRlX09wZW5FeDMyQShod25kLGhJbnN0LHN6TmFtZSkgXAorICAgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoaHduZCxBQ01fT1BFTjMyQSwoV1BBUkFNMzIpaEluc3QsKExQQVJBTSkoTFBTVFIpKHN6TmFtZSkpCisjZGVmaW5lIEFuaW1hdGVfT3BlbkV4MzJXKGh3bmQsaEluc3Qsc3pOYW1lKSBcCisgICAgKEJPT0wzMilTZW5kTWVzc2FnZTMyVyhod25kLEFDTV9PUEVOMzJXLChXUEFSQU0zMiloSW5zdCwoTFBBUkFNKShMUFdTVFIpKHN6TmFtZSkpCisjZGVmaW5lIEFuaW1hdGVfT3BlbkV4IFdJTkVMSUJfTkFNRV9BVyhBbmltYXRlX09wZW5FeCkKICNkZWZpbmUgQW5pbWF0ZV9QbGF5KGh3bmQsZnJvbSx0byxyZXApIFwKLSAgICAoQk9PTDMyKVNORE1TRyhod25kLEFDTV9QTEFZLChXUEFSQU0zMikoVUlOVDMyKShyZXApLChMUEFSQU0pTUFLRUxPTkcoZnJvbSx0bykpCisgICAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQShod25kLEFDTV9QTEFZLChXUEFSQU0zMikoVUlOVDMyKShyZXApLChMUEFSQU0pTUFLRUxPTkcoZnJvbSx0bykpCiAjZGVmaW5lIEFuaW1hdGVfU3RvcChod25kKSBcCi0gICAgKEJPT0wzMilTTkRNU0coaHduZCxBQ01fU1RPUCwwLDApCisgICAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQShod25kLEFDTV9TVE9QLDAsMCkKICNkZWZpbmUgQW5pbWF0ZV9DbG9zZShod25kKSBcCi0gICAgQW5pbWF0ZV9PcGVuKGh3bmQsTlVMTCkKKyAgICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKGh3bmQsQUNNX09QRU4zMkEsMCwwKQogI2RlZmluZSBBbmltYXRlX1NlZWsoaHduZCxmcmFtZSkgXAotICAgIEFuaW1hdGVfUGxheShod25kLGZyYW1lLGZyYW1lLDEpCi0jZW5kaWYgIC8qIF9fV0lORV9fICovCisgICAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQShod25kLEFDTV9QTEFZLDEsKExQQVJBTSlNQUtFTE9ORyhmcmFtZSxmcmFtZSkpCiAKIAogCkBAIC0xNzc4LDYgKzIyMDIsMTQgQEAKIERXT1JEICBXSU5BUEkgQ09NQ1RMMzJfR2V0U2l6ZSAoTFBWT0lEIGxwTWVtKTsKIAogCitJTlQzMiAgV0lOQVBJIFN0cl9HZXRQdHIzMkEgKExQQ1NUUiBscFNyYywgTFBTVFIgbHBEZXN0LCBJTlQzMiBuTWF4TGVuKTsKK0JPT0wzMiBXSU5BUEkgU3RyX1NldFB0cjMyQSAoTFBTVFIgKmxwcERlc3QsIExQQ1NUUiBscFNyYyk7CitJTlQzMiAgV0lOQVBJIFN0cl9HZXRQdHIzMlcgKExQQ1dTVFIgbHBTcmMsIExQV1NUUiBscERlc3QsIElOVDMyIG5NYXhMZW4pOworQk9PTDMyIFdJTkFQSSBTdHJfU2V0UHRyMzJXIChMUFdTVFIgKmxwcERlc3QsIExQQ1dTVFIgbHBTcmMpOworI2RlZmluZSBTdHJfR2V0UHRyIFdJTkVMSUJfTkFNRV9BVyhTdHJfR2V0UHRyKQorI2RlZmluZSBTdHJfU2V0UHRyIFdJTkVMSUJfTkFNRV9BVyhTdHJfU2V0UHRyKQorCisKIC8qIER5bmFtaWMgU3RvcmFnZSBBcnJheSAqLwogCiB0eXBlZGVmIHN0cnVjdCBfRFNBCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZy5oLmluIGIvaW5jbHVkZS9jb25maWcuaC5pbgppbmRleCA3M2ZjMzA0Li4wZmIxMzNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZy5oLmluCisrKyBiL2luY2x1ZGUvY29uZmlnLmguaW4KQEAgLTM2LDYgKzM2LDkgQEAKIC8qIERlZmluZSBpZiBYIGxpYnJhcmllcyBhcmUgbm90IHJlZW50cmFudCAoY29tcGlsZWQgd2l0aG91dCAtRF9SRUVOVFJBTlQpLiAgKi8KICN1bmRlZiBOT19SRUVOVFJBTlRfWDExCiAKKy8qIERlZmluZSBpZiBsaWJjIGlzIG5vdCByZWVudHJhbnQgICovCisjdW5kZWYgTk9fUkVFTlRSQU5UX0xJQkMKKwogLyogRGVmaW5lIGlmIGFsbCBkZWJ1ZyBtZXNzYWdlcyBhcmUgdG8gYmUgY29tcGlsZWQgb3V0ICovCiAjdW5kZWYgTk9fREVCVUdfTVNHUwogCkBAIC0xNjEsMyArMTY0LDYgQEAKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3IGxpYnJhcnkgKC1sdykuICAqLwogI3VuZGVmIEhBVkVfTElCVworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHhwZzQgbGlicmFyeSAoLWx4cGc0KS4gICovCisjdW5kZWYgSEFWRV9MSUJYUEc0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RkcmF3LmggYi9pbmNsdWRlL2RkcmF3LmgKaW5kZXggZGI4NzY2Ni4uOWMyMGVlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZHJhdy5oCisrKyBiL2luY2x1ZGUvZGRyYXcuaApAQCAtNDMxLDYgKzQzMSwxNCBAQAogI2RlZmluZSBERENBUFMyX0NBTkZMSVBPRERFVkVOCQkweDAwMDAyMDAwCiAjZGVmaW5lIEREQ0FQUzJfQ0FOQk9CSEFSRFdBUkUJCTB4MDAwMDQwMDAKIAorCisvKiBTZXQvR2V0IENvbG91ciBLZXkgRmxhZ3MgKi8KKyNkZWZpbmUgRERDS0VZX0NPTE9SU1BBQ0UgIDB4MDAwMDAwMDEgIC8qIFN0cnVjdCBpcyBpbmdsZSBjb2xvdXIgc3BhY2UgKi8KKyNkZWZpbmUgRERDS0VZX0RFU1RCTFQgICAgIDB4MDAwMDAwMDIgIC8qIFRvIGJlIHVzZWQgYXMgZGVzdCBmb3IgYmx0ICovCisjZGVmaW5lIEREQ0tFWV9ERVNUT1ZFUkxBWSAweDAwMDAwMDA0ICAvKiBUbyBiZSB1c2VkIGFzIGRlc3QgZm9yIENLIG92ZXJsYXlzICovCisjZGVmaW5lIEREQ0tFWV9TUkNCTFQgICAgICAweDAwMDAwMDA4ICAvKiBUbyBiZSB1c2VkIGFzIHNyYyBmb3IgYmx0ICovCisjZGVmaW5lIEREQ0tFWV9TUkNPVkVSTEFZICAweDAwMDAwMDEwICAvKiBUbyBiZSB1c2VkIGFzIHNyYyBmb3IgQ0sgb3ZlcmxheXMgKi8KKwogdHlwZWRlZiBzdHJ1Y3QgX0REQ09MT1JLRVkKIHsKIAlEV09SRAlkd0NvbG9yU3BhY2VMb3dWYWx1ZTsvKiBsb3cgYm91bmRhcnkgb2YgY29sb3Igc3BhY2UgdGhhdCBpcyB0bwpAQCAtODc2LDYgKzg4NCw3IEBACiBzdHJ1Y3QgX2NvbW1vbl9kaXJlY3RkcmF3ZGF0YSB7CiAgICAgRFdPUkQJCQlkZXB0aDsKICAgICBEV09SRAkJCWhlaWdodCx3aWR0aDsJLyogU2V0RGlzcGxheU1vZGUgKi8KKyAgICBIV05EMzIgICAgICAgICAgICAgICAgICAgICAgbWFpbldpbmRvdzsgICAgIC8qIFNldENvb3BlcmF0aXZlTGV2ZWwgKi8KIH07CiAKIHN0cnVjdCBfZGdhX2RpcmVjdGRyYXdkYXRhIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWcuaCBiL2luY2x1ZGUvZGVidWcuaAppbmRleCA5NzFkNDcyLi4yZDI3OWFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVnLmgKKysrIGIvaW5jbHVkZS9kZWJ1Zy5oCkBAIC01OSwzMiArNTksMzIgQEAKICNkZWZpbmUgZGJjaF9ob3RrZXkgNTEKICNkZWZpbmUgZGJjaF9pY29uIDUyCiAjZGVmaW5lIGRiY2hfaW1hZ2VsaXN0IDUzCi0jZGVmaW5lIGRiY2hfaW50IDU0Ci0jZGVmaW5lIGRiY2hfaW50MTAgNTUKLSNkZWZpbmUgZGJjaF9pbnQyMSA1NgotI2RlZmluZSBkYmNoX2ludDMxIDU3Ci0jZGVmaW5lIGRiY2hfa2V5IDU4Ci0jZGVmaW5lIGRiY2hfa2V5Ym9hcmQgNTkKLSNkZWZpbmUgZGJjaF9sZHQgNjAKLSNkZWZpbmUgZGJjaF9saXN0Ym94IDYxCi0jZGVmaW5lIGRiY2hfbGlzdHZpZXcgNjIKLSNkZWZpbmUgZGJjaF9sb2NhbCA2MwotI2RlZmluZSBkYmNoX21jaSA2NAotI2RlZmluZSBkYmNoX21jaWFuaW0gNjUKLSNkZWZpbmUgZGJjaF9tY2l3YXZlIDY2Ci0jZGVmaW5lIGRiY2hfbWRpIDY3Ci0jZGVmaW5lIGRiY2hfbWVudSA2OAotI2RlZmluZSBkYmNoX21lc3NhZ2UgNjkKLSNkZWZpbmUgZGJjaF9tZXRhZmlsZSA3MAotI2RlZmluZSBkYmNoX21pZGkgNzEKLSNkZWZpbmUgZGJjaF9tbWF1eCA3MgotI2RlZmluZSBkYmNoX21taW8gNzMKLSNkZWZpbmUgZGJjaF9tbXN5cyA3NAotI2RlZmluZSBkYmNoX21tdGltZSA3NQotI2RlZmluZSBkYmNoX21vZHVsZSA3NgotI2RlZmluZSBkYmNoX21wciA3NwotI2RlZmluZSBkYmNoX21zZyA3OAotI2RlZmluZSBkYmNoX21zdmlkZW8gNzkKKyNkZWZpbmUgZGJjaF9pbW0gNTQKKyNkZWZpbmUgZGJjaF9pbnQgNTUKKyNkZWZpbmUgZGJjaF9pbnQxMCA1NgorI2RlZmluZSBkYmNoX2ludDIxIDU3CisjZGVmaW5lIGRiY2hfaW50MzEgNTgKKyNkZWZpbmUgZGJjaF9rZXkgNTkKKyNkZWZpbmUgZGJjaF9rZXlib2FyZCA2MAorI2RlZmluZSBkYmNoX2xkdCA2MQorI2RlZmluZSBkYmNoX2xpc3Rib3ggNjIKKyNkZWZpbmUgZGJjaF9saXN0dmlldyA2MworI2RlZmluZSBkYmNoX2xvY2FsIDY0CisjZGVmaW5lIGRiY2hfbWNpIDY1CisjZGVmaW5lIGRiY2hfbWNpYW5pbSA2NgorI2RlZmluZSBkYmNoX21jaXdhdmUgNjcKKyNkZWZpbmUgZGJjaF9tZGkgNjgKKyNkZWZpbmUgZGJjaF9tZW51IDY5CisjZGVmaW5lIGRiY2hfbWVzc2FnZSA3MAorI2RlZmluZSBkYmNoX21ldGFmaWxlIDcxCisjZGVmaW5lIGRiY2hfbWlkaSA3MgorI2RlZmluZSBkYmNoX21tYXV4IDczCisjZGVmaW5lIGRiY2hfbW1pbyA3NAorI2RlZmluZSBkYmNoX21tc3lzIDc1CisjZGVmaW5lIGRiY2hfbW10aW1lIDc2CisjZGVmaW5lIGRiY2hfbW9kdWxlIDc3CisjZGVmaW5lIGRiY2hfbXByIDc4CisjZGVmaW5lIGRiY2hfbXNnIDc5CiAjZGVmaW5lIGRiY2hfbm9uY2xpZW50IDgwCiAjZGVmaW5lIGRiY2hfbnRkbGwgODEKICNkZWZpbmUgZGJjaF9vbGUgODIKQEAgLTk2LDU0ICs5Niw1NSBAQAogI2RlZmluZSBkYmNoX3Byb2ZpbGUgODgKICNkZWZpbmUgZGJjaF9wcm9ncmVzcyA4OQogI2RlZmluZSBkYmNoX3Byb3AgOTAKLSNkZWZpbmUgZGJjaF9wc2RydiA5MQotI2RlZmluZSBkYmNoX3JlYmFyIDkyCi0jZGVmaW5lIGRiY2hfcmVnIDkzCi0jZGVmaW5lIGRiY2hfcmVnaW9uIDk0Ci0jZGVmaW5lIGRiY2hfcmVsYXkgOTUKLSNkZWZpbmUgZGJjaF9yZXNvdXJjZSA5NgotI2RlZmluZSBkYmNoX3MgOTcKLSNkZWZpbmUgZGJjaF9zY3JvbGwgOTgKLSNkZWZpbmUgZGJjaF9zZWN1cml0eSA5OQotI2RlZmluZSBkYmNoX3NlZ21lbnQgMTAwCi0jZGVmaW5lIGRiY2hfc2VsZWN0b3IgMTAxCi0jZGVmaW5lIGRiY2hfc2VtIDEwMgotI2RlZmluZSBkYmNoX3NlbmRtc2cgMTAzCi0jZGVmaW5lIGRiY2hfc2hlbGwgMTA0Ci0jZGVmaW5lIGRiY2hfc2htIDEwNQotI2RlZmluZSBkYmNoX3Nub29wIDEwNgotI2RlZmluZSBkYmNoX3NvdW5kIDEwNwotI2RlZmluZSBkYmNoX3N0YXRpYyAxMDgKLSNkZWZpbmUgZGJjaF9zdGF0dXNiYXIgMTA5Ci0jZGVmaW5lIGRiY2hfc3RyZXNzIDExMAotI2RlZmluZSBkYmNoX3N0cmluZyAxMTEKLSNkZWZpbmUgZGJjaF9zeXNjb2xvciAxMTIKLSNkZWZpbmUgZGJjaF9zeXN0ZW0gMTEzCi0jZGVmaW5lIGRiY2hfdGFiIDExNAotI2RlZmluZSBkYmNoX3Rhc2sgMTE1Ci0jZGVmaW5lIGRiY2hfdGV4dCAxMTYKLSNkZWZpbmUgZGJjaF90aHJlYWQgMTE3Ci0jZGVmaW5lIGRiY2hfdGh1bmsgMTE4Ci0jZGVmaW5lIGRiY2hfdGltZXIgMTE5Ci0jZGVmaW5lIGRiY2hfdG9vbGJhciAxMjAKLSNkZWZpbmUgZGJjaF90b29saGVscCAxMjEKLSNkZWZpbmUgZGJjaF90b29sdGlwcyAxMjIKLSNkZWZpbmUgZGJjaF90cmFja2JhciAxMjMKLSNkZWZpbmUgZGJjaF90cmVldmlldyAxMjQKLSNkZWZpbmUgZGJjaF90d2VhayAxMjUKLSNkZWZpbmUgZGJjaF91aXRvb2xzIDEyNgotI2RlZmluZSBkYmNoX3VwZG93biAxMjcKLSNkZWZpbmUgZGJjaF92ZXIgMTI4Ci0jZGVmaW5lIGRiY2hfdmlydHVhbCAxMjkKLSNkZWZpbmUgZGJjaF92eGQgMTMwCi0jZGVmaW5lIGRiY2hfd2luIDEzMQotI2RlZmluZSBkYmNoX3dpbjE2ZHJ2IDEzMgotI2RlZmluZSBkYmNoX3dpbjMyIDEzMwotI2RlZmluZSBkYmNoX3dpbmcgMTM0Ci0jZGVmaW5lIGRiY2hfd2luc29jayAxMzUKLSNkZWZpbmUgZGJjaF93bmV0IDEzNgotI2RlZmluZSBkYmNoX3gxMSAxMzcKLSNkZWZpbmUgZGJjaF94MTFkcnYgMTM4CisjZGVmaW5lIGRiY2hfcHNhcGkgOTEKKyNkZWZpbmUgZGJjaF9wc2RydiA5MgorI2RlZmluZSBkYmNoX3JlYmFyIDkzCisjZGVmaW5lIGRiY2hfcmVnIDk0CisjZGVmaW5lIGRiY2hfcmVnaW9uIDk1CisjZGVmaW5lIGRiY2hfcmVsYXkgOTYKKyNkZWZpbmUgZGJjaF9yZXNvdXJjZSA5NworI2RlZmluZSBkYmNoX3MgOTgKKyNkZWZpbmUgZGJjaF9zY3JvbGwgOTkKKyNkZWZpbmUgZGJjaF9zZWN1cml0eSAxMDAKKyNkZWZpbmUgZGJjaF9zZWdtZW50IDEwMQorI2RlZmluZSBkYmNoX3NlbGVjdG9yIDEwMgorI2RlZmluZSBkYmNoX3NlbSAxMDMKKyNkZWZpbmUgZGJjaF9zZW5kbXNnIDEwNAorI2RlZmluZSBkYmNoX3NoZWxsIDEwNQorI2RlZmluZSBkYmNoX3NobSAxMDYKKyNkZWZpbmUgZGJjaF9zbm9vcCAxMDcKKyNkZWZpbmUgZGJjaF9zb3VuZCAxMDgKKyNkZWZpbmUgZGJjaF9zdGF0aWMgMTA5CisjZGVmaW5lIGRiY2hfc3RhdHVzYmFyIDExMAorI2RlZmluZSBkYmNoX3N0cmVzcyAxMTEKKyNkZWZpbmUgZGJjaF9zdHJpbmcgMTEyCisjZGVmaW5lIGRiY2hfc3lzY29sb3IgMTEzCisjZGVmaW5lIGRiY2hfc3lzdGVtIDExNAorI2RlZmluZSBkYmNoX3RhYiAxMTUKKyNkZWZpbmUgZGJjaF90YXNrIDExNgorI2RlZmluZSBkYmNoX3RleHQgMTE3CisjZGVmaW5lIGRiY2hfdGhyZWFkIDExOAorI2RlZmluZSBkYmNoX3RodW5rIDExOQorI2RlZmluZSBkYmNoX3RpbWVyIDEyMAorI2RlZmluZSBkYmNoX3Rvb2xiYXIgMTIxCisjZGVmaW5lIGRiY2hfdG9vbGhlbHAgMTIyCisjZGVmaW5lIGRiY2hfdG9vbHRpcHMgMTIzCisjZGVmaW5lIGRiY2hfdHJhY2tiYXIgMTI0CisjZGVmaW5lIGRiY2hfdHJlZXZpZXcgMTI1CisjZGVmaW5lIGRiY2hfdHdlYWsgMTI2CisjZGVmaW5lIGRiY2hfdWl0b29scyAxMjcKKyNkZWZpbmUgZGJjaF91cGRvd24gMTI4CisjZGVmaW5lIGRiY2hfdmVyIDEyOQorI2RlZmluZSBkYmNoX3ZpcnR1YWwgMTMwCisjZGVmaW5lIGRiY2hfdnhkIDEzMQorI2RlZmluZSBkYmNoX3dpbiAxMzIKKyNkZWZpbmUgZGJjaF93aW4xNmRydiAxMzMKKyNkZWZpbmUgZGJjaF93aW4zMiAxMzQKKyNkZWZpbmUgZGJjaF93aW5nIDEzNQorI2RlZmluZSBkYmNoX3dpbnNvY2sgMTM2CisjZGVmaW5lIGRiY2hfd25ldCAxMzcKKyNkZWZpbmUgZGJjaF94MTEgMTM4CisjZGVmaW5lIGRiY2hfeDExZHJ2IDEzOQogLyogRGVmaW5pdGlvbnMgZm9yIGNsYXNzZXMgaWRlbnRpZmllcnMgKi8KICNkZWZpbmUgZGJjbF9maXhtZSAwCiAjZGVmaW5lIGRiY2xfZXJyIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdkZWZzLmggYi9pbmNsdWRlL2RlYnVnZGVmcy5oCmluZGV4IDdmZjZmZDcuLjEwNGZiYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdkZWZzLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2RlZnMuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAjZW5kaWYKIAotI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UIDEzOQorI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UIDE0MAogI2lmZGVmIERFQlVHX1JVTlRJTUUKIHNob3J0IGRlYnVnX21zZ19lbmFibGVkW11bREVCVUdfQ0xBU1NfQ09VTlRdID0gewogezEsIDEsIDAsIDB9LApAQCAtMTQ2LDYgKzE0Niw3IEBACiB7MSwgMSwgMCwgMH0sCiB7MSwgMSwgMCwgMH0sCiB7MSwgMSwgMCwgMH0sCit7MSwgMSwgMCwgMH0sCiB9OwogY29uc3QgY2hhciogZGVidWdfY2hfbmFtZVtdID0gewogIjEiLApAQCAtMjAyLDYgKzIwMyw3IEBACiAiaG90a2V5IiwKICJpY29uIiwKICJpbWFnZWxpc3QiLAorImltbSIsCiAiaW50IiwKICJpbnQxMCIsCiAiaW50MjEiLApAQCAtMjI3LDcgKzIyOSw2IEBACiAibW9kdWxlIiwKICJtcHIiLAogIm1zZyIsCi0ibXN2aWRlbyIsCiAibm9uY2xpZW50IiwKICJudGRsbCIsCiAib2xlIiwKQEAgLTIzOSw2ICsyNDAsNyBAQAogInByb2ZpbGUiLAogInByb2dyZXNzIiwKICJwcm9wIiwKKyJwc2FwaSIsCiAicHNkcnYiLAogInJlYmFyIiwKICJyZWciLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Z2dlci5oIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCmluZGV4IDg2NjYzNGQuLjkwZDQ1YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdnZXIuaAorKysgYi9pbmNsdWRlL2RlYnVnZ2VyLmgKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJzaWdfY29udGV4dC5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCisjaW5jbHVkZSAibWlzY2VtdS5oIgogCiAjZGVmaW5lIFNURVBfRkxBRyAweDEwMCAvKiBzaW5nbGUgc3RlcCBmbGFnICovCiAKQEAgLTg1LDEzICs4NiwyMCBAQAogdHlwZWRlZiBzdHJ1Y3Qgd2luZV9sb2NhbHMgV2luZUxvY2FsczsKIAogCisjZGVmaW5lIERCR19WODZfTU9EVUxFKHNlZykgKChzZWcpPj4xNikKKyNkZWZpbmUgSVNfU0VMRUNUT1JfVjg2KHNlZykgREJHX1Y4Nl9NT0RVTEUoc2VnKQorCiAjZGVmaW5lIERCR19GSVhfQUREUl9TRUcoYWRkcixkZWZhdWx0KSB7IFwKICAgICAgIGlmICgoYWRkciktPnNlZyA9PSAweGZmZmZmZmZmKSAoYWRkciktPnNlZyA9IChkZWZhdWx0KTsgXAorICAgICAgaWYgKCFJU19TRUxFQ1RPUl9WODYoKGFkZHIpLT5zZWcpKSBcCiAgICAgICBpZiAoSVNfU0VMRUNUT1JfU1lTVEVNKChhZGRyKS0+c2VnKSkgKGFkZHIpLT5zZWcgPSAwOyB9CiAKICNkZWZpbmUgREJHX0FERFJfVE9fTElOKGFkZHIpIFwKKyAgICAoSVNfU0VMRUNUT1JfVjg2KChhZGRyKS0+c2VnKSBcCisgICAgICA/IChjaGFyKikoRE9TTUVNX01lbW9yeUJhc2UoREJHX1Y4Nl9NT0RVTEUoKGFkZHIpLT5zZWcpKSArIFwKKyAgICAgICAgICgoKChhZGRyKS0+c2VnKSYweEZGRkYpPDw0KSsoYWRkciktPm9mZikgOiBcCiAgICAgKElTX1NFTEVDVE9SX1NZU1RFTSgoYWRkciktPnNlZykgPyAoY2hhciAqKShhZGRyKS0+b2ZmIFwKLSAgICAgIDogKGNoYXIgKilQVFJfU0VHX09GRl9UT19MSU4oKGFkZHIpLT5zZWcsKGFkZHIpLT5vZmYpKQorICAgICAgOiAoY2hhciAqKVBUUl9TRUdfT0ZGX1RPX0xJTigoYWRkciktPnNlZywoYWRkciktPm9mZikpKQogCiAjZGVmaW5lIERCR19DSEVDS19SRUFEX1BUUihhZGRyLGxlbikgXAogICAgICghREVCVUdfSXNCYWRSZWFkUHRyKChhZGRyKSwobGVuKSkgfHwgXApAQCAtMzEwLDYgKzMxOCw3IEBACiBleHRlcm4gdm9pZCBERUJVR19EaXNhc3NlbWJsZSggY29uc3QgREJHX0FERFIgKiwgY29uc3QgREJHX0FERFIqLCBpbnQgb2Zmc2V0ICk7CiAKICAgLyogZGVidWdnZXIvZGJnLnkgKi8KK2V4dGVybiB2b2lkIGN0eF9kZWJ1ZyggaW50IHNpZ25hbCwgQ09OVEVYVCAqcmVncyApOwogZXh0ZXJuIHZvaWQgd2luZV9kZWJ1ZyggaW50IHNpZ25hbCwgU0lHQ09OVEVYVCAqcmVncyApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9ERUJVR0dFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVndG9vbHMuaCBiL2luY2x1ZGUvZGVidWd0b29scy5oCmluZGV4IDQwZmNiMWUuLjdiNjM1NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWd0b29scy5oCisrKyBiL2luY2x1ZGUvZGVidWd0b29scy5oCkBAIC0zNyw4ICszNyw4IEBACiAjZGVmaW5lIERQUklOVEYoZm9ybWF0LCBhcmdzLi4uKSBmcHJpbnRmKHN0ZGRlYiwgZm9ybWF0LCAjIyBhcmdzKQogCiAjZGVmaW5lIERQUklOVEZfKGNsLCBjaCwgZm9ybWF0LCBhcmdzLi4uKSBcCi0gIGlmKCFERUJVR0dJTkcoY2wsIGNoKSkgOyBcCi0gIGVsc2UgRFBSSU5URigjIGNsICI6IiAjIGNoICI6JXMgIiBmb3JtYXQsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisgIGRvIHtpZighREVCVUdHSU5HKGNsLCBjaCkpIDsgXAorICBlbHNlIERQUklOVEYoIyBjbCAiOiIgIyBjaCAiOiVzICIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKIAogLyogdXNlIGNvbmZpZ3VyZSB0byBhbGxvdyB1c2VyIHRvIGNvbXBpbGUgb3V0IGRlYnVnZ2luZyBtZXNzYWdlcyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Rvc2V4ZS5oIGIvaW5jbHVkZS9kb3NleGUuaAppbmRleCAzZWI4MmY1Li4wNGQ5ZmZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2Rvc2V4ZS5oCisrKyBiL2luY2x1ZGUvZG9zZXhlLmgKQEAgLTE2LDYgKzE2LDcgQEAKICBMUFZPSUQgaW1nOwogIHVuc2lnbmVkIGltZ19vZnM7CiAgV09SRCBwc3Bfc2VnLGxvYWRfc2VnOworIFdPUkQgZHBtaV9zZWcsZHBtaV9zZWwsZHBtaV9mbGFnOwogIEhNT0RVTEUxNiBoTW9kdWxlOwogIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgVk04NjsKICBpbnQgZm4sIHN0YXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcGxheS5oIGIvaW5jbHVkZS9kcGxheS5oCmluZGV4IGY5ZDY0OWUuLmQ5YTExNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHBsYXkuaAorKysgYi9pbmNsdWRlL2RwbGF5LmgKQEAgLTIsOSArMiw5IEBACiAjaWZuZGVmIF9fV0lORV9EUExBWV9ICiAjZGVmaW5lIF9fV0lORV9EUExBWV9ICiAKLSNpbmNsdWRlICJtbXN5c3RlbS5oIgorI3ByYWdtYSBwYWNrKDEpCiAKLS8qIFJldHVybiBWYWx1ZXMgKi8KKy8qIFJldHVybiBWYWx1ZXMgZm9yIERpcmVjdCBQbGF5ICovCiAjZGVmaW5lIF9GQUNEUCAgMHg4NzcKICNkZWZpbmUgTUFLRV9EUEhSRVNVTFQoIGNvZGUgKSAgICBNQUtFX0hSRVNVTFQoIDEsIF9GQUNEUCwgY29kZSApCiAKQEAgLTM0LDggKzM0LDggQEAKICNkZWZpbmUgRFBFUlJfTk9OQU1FU0VSVkVSRk9VTkQgICAgICAgICBNQUtFX0RQSFJFU1VMVCggMjAwICkKICNkZWZpbmUgRFBFUlJfTk9QTEFZRVJTICAgICAgICAgICAgICAgICBNQUtFX0RQSFJFU1VMVCggMjEwICkKICNkZWZpbmUgRFBFUlJfTk9TRVNTSU9OUyAgICAgICAgICAgICAgICBNQUtFX0RQSFJFU1VMVCggMjIwICkKLSNkZWZpbmUgRFBFUlJfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRV9QRU5ESU5HCi0jZGVmaW5lIERQRVJSX1NFTkRUT09CSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfRFBIUkVTVUxUKCAyMzAgKQorI2RlZmluZSBEUEVSUl9QRU5ESU5HICAgICAgICAgICAgICAgICAgIEVfUEVORElORworI2RlZmluZSBEUEVSUl9TRU5EVE9PQklHICAgICAgICAgICAgICAgIE1BS0VfRFBIUkVTVUxUKCAyMzAgKQogI2RlZmluZSBEUEVSUl9USU1FT1VUICAgICAgICAgICAgICAgICAgIE1BS0VfRFBIUkVTVUxUKCAyNDAgKQogI2RlZmluZSBEUEVSUl9VTkFWQUlMQUJMRSAgICAgICAgICAgICAgIE1BS0VfRFBIUkVTVUxUKCAyNTAgKQogI2RlZmluZSBEUEVSUl9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgIEVfTk9USU1QTApAQCAtMTA3LDExICsxMDcsNyBAQAogLyogR1VJRCBmb3IgTW9kZW0gc2VydmljZSBwcm92aWRlciB7NDRFQUE3NjAtQ0I2OC0xMWNmLTlDNEUtMDBBMEM5MDU0MjVFfSAqLwogREVGSU5FX0dVSUQoRFBTUEdVSURfTU9ERU0sIDB4NDRlYWE3NjAsIDB4Y2I2OCwgMHgxMWNmLCAweDljLCAweDRlLCAweDAsIDB4YTAsIDB4YzksIDB4NSwgMHg0MiwgMHg1ZSk7CiAKLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qIERpcmVjdCBQbGF5ICovCi10eXBlZGVmIHN0cnVjdCBJRGlyZWN0UGxheSAgICAgICAgSURpcmVjdFBsYXksICpMUERJUkVDVFBMQVk7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0UGxheSBJRGlyZWN0UGxheSwgKkxQRElSRUNUUExBWTsKIAogLyogRGlyZWN0IFBsYXkgMiAqLwogdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdFBsYXkyICAgICAgIElEaXJlY3RQbGF5MiwgKkxQRElSRUNUUExBWTI7CkBAIC0xNTQsNjAgKzE1MCwxMTAgQEAKIHsKICAgICBEV09SRCAgIGR3U2l6ZTsgICAgICAgICAgICAgCiAgICAgRFdPUkQgICBkd0ZsYWdzOyAgICAgICAgICAgIC8qIE5vdCB1c2VkIG11c3QgYmUgMCAqLwotICAgIHVuaW9uIHBsYXllclNob3J0TmFtZSAgICAgICAvKiBQbGF5ZXIncyBIYW5kbGU/ICovCisKKyAgICB1bmlvbiAvKnBsYXllclNob3J0TmFtZSAqLyAgICAgIC8qIFBsYXllcidzIEhhbmRsZT8gKi8KICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIExQV1NUUiAgbHBzelNob3J0TmFtZTsgIAogICAgICAgICBMUFNUUiAgIGxwc3pTaG9ydE5hbWVBOyAKLSAgICB9OwotICAgIHVuaW9uIHBsYXllckxvbmdOYW1lICAgICAgICAvKiBQbGF5ZXIncyBmb3JtYWwvcmVhbCBuYW1lICovCisgICAgfXBzbjsKKworICAgIHVuaW9uIC8qcGxheWVyTG9uZ05hbWUgKi8gICAgICAgLyogUGxheWVyJ3MgZm9ybWFsL3JlYWwgbmFtZSAqLwogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIExQV1NUUiAgbHBzekxvbmdOYW1lOyAgCiAgICAgICAgIExQU1RSICAgbHBzekxvbmdOYW1lQTsgIAotICAgIH07CisgICAgfXBsbjsKIAogfSBEUE5BTUUsICpMUERQTkFNRTsKIAorI2RlZmluZSBEUExPTkdOQU1FTEVOICAgICA1MgorI2RlZmluZSBEUFNIT1JUTkFNRUxFTiAgICAyMAorI2RlZmluZSBEUFNFU1NJT05OQU1FTEVOICAzMgorI2RlZmluZSBEUFBBU1NXT1JETEVOICAgICAxNgorI2RlZmluZSBEUFVTRVJSRVNFUlZFRCAgICAxNgorCit0eXBlZGVmIHN0cnVjdCB0YWdEUFNFU1NJT05ERVNDCit7CisgICAgRFdPUkQgICBkd1NpemU7CisgICAgR1VJRCAgICBndWlkU2Vzc2lvbjsKKyAgICBEV09SRCAgIGR3U2Vzc2lvbjsKKyAgICBEV09SRCAgIGR3TWF4UGxheWVyczsKKyAgICBEV09SRCAgIGR3Q3VycmVudFBsYXllcnM7CisgICAgRFdPUkQgICBkd0ZsYWdzOworICAgIGNoYXIgICAgc3pTZXNzaW9uTmFtZVsgRFBTRVNTSU9OTkFNRUxFTiBdOworICAgIGNoYXIgICAgc3pVc2VyRmllbGRbIERQVVNFUlJFU0VSVkVEIF07CisgICAgRFdPUkQgICBkd1Jlc2VydmVkMTsKKyAgICBjaGFyICAgIHN6UGFzc3dvcmRbIERQUEFTU1dPUkRMRU4gXTsKKyAgICBEV09SRCAgIGR3UmVzZXJ2ZWQyOworICAgIERXT1JEICAgZHdVc2VyMTsKKyAgICBEV09SRCAgIGR3VXNlcjI7CisgICAgRFdPUkQgICBkd1VzZXIzOworICAgIERXT1JEICAgZHdVc2VyNDsKK30gRFBTRVNTSU9OREVTQywgKkxQRFBTRVNTSU9OREVTQzsKKwogdHlwZWRlZiBzdHJ1Y3QgdGFnRFBTRVNTSU9OREVTQzIKIHsKICAgICBEV09SRCAgIGR3U2l6ZTsgICAgICAgICAgICAgCiAgICAgRFdPUkQgICBkd0ZsYWdzOyAgICAgICAgICAgCiAgICAgR1VJRCAgICBndWlkSW5zdGFuY2U7ICAgICAgCi0gICAgR1VJRCAgICBndWlkQXBwbGljYXRpb247ICAgCisgICAgR1VJRCAgICBndWlkQXBwbGljYXRpb247ICAgLyogR1VJRCBvZiB0aGUgRFAgYXBwbGljYXRpb24sIEdVSURfTlVMTCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbCBhcHBsaWNhdGlvbnMhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgRFdPUkQgICBkd01heFBsYXllcnM7ICAgICAgCi0gICAgRFdPUkQgICBkd0N1cnJlbnRQbGF5ZXJzOyAgCisgICAgRFdPUkQgICBkd0N1cnJlbnRQbGF5ZXJzOyAgIC8qIChyZWFkIG9ubHkgdmFsdWUpICovCiAKLSAgICB1bmlvbiBzZXNzaW9uTmFtZQorICAgIHVuaW9uICAvKiBTZXNzaW9uIG5hbWUgKi8KICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgTFBXU1RSICBscHN6U2Vzc2lvbk5hbWU7ICAKICAgICAgICAgTFBTVFIgICBscHN6U2Vzc2lvbk5hbWVBOyAKLSAgICB9OworICAgIH1zZXNzOwogCi0gICAgdW5pb24gb3B0bmxTZXNzaW9uUGFzc3dkCisgICAgdW5pb24gIC8qIE9wdGlvbmFsIHBhc3N3b3JkICovCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBMUFdTVFIgIGxwc3pQYXNzd29yZDsgICAKICAgICAgICAgTFBTVFIgICBscHN6UGFzc3dvcmRBOyAgCi0gICAgfTsKKyAgICB9cGFzczsKIAogICAgIERXT1JEICAgZHdSZXNlcnZlZDE7ICAgICAgIAogICAgIERXT1JEICAgZHdSZXNlcnZlZDI7Ci0gICAgRFdPUkQgICBkd1VzZXIxOyAgICAgICAgICAKKworICAgIERXT1JEICAgZHdVc2VyMTsgICAgICAgIC8qIEZvciB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uICovICAKICAgICBEV09SRCAgIGR3VXNlcjI7CiAgICAgRFdPUkQgICBkd1VzZXIzOwogICAgIERXT1JEICAgZHdVc2VyNDsKIH0gRFBTRVNTSU9OREVTQzIsICpMUERQU0VTU0lPTkRFU0MyOwordHlwZWRlZiBjb25zdCBEUFNFU1NJT05ERVNDMiogTFBDRFBTRVNTSU9OREVTQzI7CisKKyNkZWZpbmUgRFBPUEVOX0pPSU4gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIERQT1BFTl9DUkVBVEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBEUE9QRU5fUkVUVVJOU1RBVFVTICAgICAgICAgICAgIERQRU5VTVNFU1NJT05TX1JFVFVSTlNUQVRVUworCisjZGVmaW5lIERQU0VTU0lPTl9ORVdQTEFZRVJTRElTQUJMRUQgICAgMHgwMDAwMDAwMQorI2RlZmluZSBEUFNFU1NJT05fTUlHUkFURUhPU1QgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRFBTRVNTSU9OX05PTUVTU0FHRUlEICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERQU0VTU0lPTl9KT0lORElTQUJMRUQgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBEUFNFU1NJT05fS0VFUEFMSVZFICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRFBTRVNTSU9OX05PREFUQU1FU1NBR0VTICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIERQU0VTU0lPTl9TRUNVUkVTRVJWRVIgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBEUFNFU1NJT05fUFJJVkFURSAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRFBTRVNTSU9OX1BBU1NXT1JEUkVRVUlSRUQgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIERQU0VTU0lPTl9NVUxUSUNBU1RTRVJWRVIgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBEUFNFU1NJT05fQ0xJRU5UU0VSVkVSICAgICAgICAgIDB4MDAwMDEwMDAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnRFBMQ09OTkVDVElPTgogewogICAgIERXT1JEICAgICAgICAgICAgICAgZHdTaXplOyAgICAgICAgICAKICAgICBEV09SRCAgICAgICAgICAgICAgIGR3RmxhZ3M7ICAgICAgICAgIAotICAgIExQRFBTRVNTSU9OREVTQzIgICAgbHBTZXNzaW9uRGVzYzsgICAKLSAgICBMUERQTkFNRSAgICAgICAgICAgIGxwUGxheWVyTmFtZTsgICAgCi0gICAgR1VJRCAgICAgICAgICAgICAgICBndWlkU1A7ICAgICAgICAgIAotICAgIExQVk9JRCAgICAgICAgICAgICAgbHBBZGRyZXNzOyAgICAgICAKLSAgICBEV09SRCAgICAgICAgICAgICAgIGR3QWRkcmVzc1NpemU7ICAKKyAgICBMUERQU0VTU0lPTkRFU0MyICAgIGxwU2Vzc2lvbkRlc2M7ICAvKiBQdHIgdG8gc2Vzc2lvbiBkZXNjIHRvIHVzZSBmb3IgY29ubmVjdCAqLyAgCisgICAgTFBEUE5BTUUgICAgICAgICAgICBscFBsYXllck5hbWU7ICAgLyogUHRyIHRvIHBsYXllciBuYW1lIHN0cnVjdHVyZSAqLworICAgIEdVSUQgICAgICAgICAgICAgICAgZ3VpZFNQOyAgICAgICAgIC8qIEdVSUQgb2YgU2VydmljZSBQcm92aWRlciB0byB1c2UgKi8gCisgICAgTFBWT0lEICAgICAgICAgICAgICBscEFkZHJlc3M7ICAgICAgLyogUHRyIHRvIEFkZHJlc3Mgb2YgU2VydmljZSBQcm92aWRlciB0byB1c2UgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgIGR3QWRkcmVzc1NpemU7ICAvKiBTaXplIG9mIGFkZHJlc3MgZGF0YSAqLwogfSBEUExDT05ORUNUSU9OLCAqTFBEUExDT05ORUNUSU9OOwogCisvKiBEUExDT05ORUNUSU9OIGZsYWdzIChmb3IgZHdGbGFncykgKi8KKyNkZWZpbmUgRFBMQ09OTkVDVElPTl9DUkVBVEVTRVNTSU9OIERQT1BFTl9DUkVBVEUKKyNkZWZpbmUgRFBMQ09OTkVDVElPTl9KT0lOU0VTU0lPTiAgIERQT1BFTl9KT0lOCisKIHR5cGVkZWYgc3RydWN0IHRhZ0RQTEFQUElORk8KIHsKICAgICBEV09SRCAgICAgICBkd1NpemU7ICAgICAgICAgICAgCkBAIC0yMzAsNiArMjc2LDYyIEBACiB9IERQQ09NUE9VTkRBRERSRVNTRUxFTUVOVCwgKkxQRFBDT01QT1VOREFERFJFU1NFTEVNRU5UOwogdHlwZWRlZiBjb25zdCBEUENPTVBPVU5EQUREUkVTU0VMRU1FTlQgKkxQQ0RQQ09NUE9VTkRBRERSRVNTRUxFTUVOVDsKIAordHlwZWRlZiBzdHJ1Y3QgdGFnRFBDSEFUCit7CisgICAgRFdPUkQgICAgICAgICAgICAgICBkd1NpemU7CisgICAgRFdPUkQgICAgICAgICAgICAgICBkd0ZsYWdzOworICAgIHVuaW9uCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBzdHJpbmcKKyAgICAgICAgTFBXU1RSICBscHN6TWVzc2FnZTsgICAvLyBVbmljb2RlCisgICAgICAgIExQU1RSICAgbHBzek1lc3NhZ2VBOyAgLy8gQU5TSQorICAgIH1tc2dzdHI7Cit9IERQQ0hBVCwgKkxQRFBDSEFUOworCit0eXBlZGVmIHN0cnVjdCB0YWdEUFNFQ1VSSVRZREVTQworeworICAgIERXT1JEIGR3U2l6ZTsgICAgICAgICAgICAgICAgICAgLy8gU2l6ZSBvZiBzdHJ1Y3R1cmUKKyAgICBEV09SRCBkd0ZsYWdzOyAgICAgICAgICAgICAgICAgIC8vIE5vdCB1c2VkLiBNdXN0IGJlIHplcm8uCisgICAgdW5pb24KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNTUEkgcHJvdmlkZXIgbmFtZQorICAgICAgICBMUFdTVFIgIGxwc3pTU1BJUHJvdmlkZXI7ICAgLy8gVW5pY29kZQorICAgICAgICBMUFNUUiAgIGxwc3pTU1BJUHJvdmlkZXJBOyAgLy8gQU5TSQorICAgIH1zc3BpOworICAgIHVuaW9uCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDQVBJIHByb3ZpZGVyIG5hbWUKKyAgICAgICAgTFBXU1RSIGxwc3pDQVBJUHJvdmlkZXI7ICAgIC8vIFVuaWNvZGUKKyAgICAgICAgTFBTVFIgIGxwc3pDQVBJUHJvdmlkZXJBOyAgIC8vIEFOU0kKKyAgICB9Y2FwaTsKKyAgICBEV09SRCBkd0NBUElQcm92aWRlclR5cGU7ICAgICAgIC8vIENyeXB0byBTZXJ2aWNlIFByb3ZpZGVyIHR5cGUKKyAgICBEV09SRCBkd0VuY3J5cHRpb25BbGdvcml0aG07ICAgIC8vIEVuY3J5cHRpb24gQWxnb3JpdGhtIHR5cGUKK30gRFBTRUNVUklUWURFU0MsICpMUERQU0VDVVJJVFlERVNDOworCit0eXBlZGVmIGNvbnN0IERQU0VDVVJJVFlERVNDICpMUENEUFNFQ1VSSVRZREVTQzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRFBDUkVERU5USUFMUworeworICAgIERXT1JEIGR3U2l6ZTsgICAgICAgICAgICAgICAvLyBTaXplIG9mIHN0cnVjdHVyZQorICAgIERXT1JEIGR3RmxhZ3M7ICAgICAgICAgICAgICAvLyBOb3QgdXNlZC4gTXVzdCBiZSB6ZXJvLgorICAgIHVuaW9uCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgbmFtZSBvZiB0aGUgYWNjb3VudAorICAgICAgICBMUFdTVFIgIGxwc3pVc2VybmFtZTsgICAvLyBVbmljb2RlCisgICAgICAgIExQU1RSICAgbHBzelVzZXJuYW1lQTsgIC8vIEFOU0kKKyAgICB9bmFtZTsKKyAgICB1bmlvbgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzd29yZCBvZiB0aGUgYWNjb3VudAorICAgICAgICBMUFdTVFIgIGxwc3pQYXNzd29yZDsgICAvLyBVbmljb2RlCisgICAgICAgIExQU1RSICAgbHBzelBhc3N3b3JkQTsgIC8vIEFOU0kKKyAgICB9cGFzczsKKyAgICB1bmlvbgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb21haW4gbmFtZSBvZiB0aGUgYWNjb3VudAorICAgICAgICBMUFdTVFIgIGxwc3pEb21haW47ICAgICAvLyBVbmljb2RlCisgICAgICAgIExQU1RSICAgbHBzekRvbWFpbkE7ICAgIC8vIEFOU0kKKyAgICB9ZG9tYWluOworfSBEUENSRURFTlRJQUxTLCAqTFBEUENSRURFTlRJQUxTOworCit0eXBlZGVmIGNvbnN0IERQQ1JFREVOVElBTFMgKkxQQ0RQQ1JFREVOVElBTFM7CisKKworCiB0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sqIExQRFBFTlVNRFBDQUxMQkFDS1cpKAogICAgIExQR1VJRCAgICAgIGxwZ3VpZFNQLAogICAgIExQV1NUUiAgICAgIGxwU1BOYW1lLApAQCAtMjU1LDkgKzM1NywxNiBAQAogICAgIERXT1JEICAgICAgIGR3RmxhZ3MsCiAgICAgTFBWT0lEICAgICAgbHBDb250ZXh0KTsKIAordHlwZWRlZiBCT09MMzIgKENBTExCQUNLKiBMUERQRU5VTVNFU1NJT05TQ0FMTEJBQ0spKAorICAgIExQRFBTRVNTSU9OREVTQyBscERQU2Vzc2lvbkRlc2MsCisgICAgTFBWT0lEICAgICAgbHBDb250ZXh0LAorICAgIExQRFdPUkQgICAgIGxwZHdUaW1lT3V0LAorICAgIERXT1JEICAgICAgIGR3RmxhZ3MpOworCisKIGV4dGVybiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RQbGF5RW51bWVyYXRlQSggTFBEUEVOVU1EUENBTExCQUNLQSwgTFBWT0lEICk7CiBleHRlcm4gSFJFU1VMVCBXSU5BUEkgRGlyZWN0UGxheUVudW1lcmF0ZVcoIExQRFBFTlVNRFBDQUxMQkFDS1csIExQVk9JRCApOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIERpcmVjdFBsYXlDcmVhdGUoIExQR1VJRCBscEdVSUQsIExQRElSRUNUUExBWSAqbHBscERQLCBJVW5rbm93biAqcFVuayk7CitleHRlcm4gSFJFU1VMVCBXSU5BUEkgRGlyZWN0UGxheUNyZWF0ZSggTFBHVUlEIGxwR1VJRCwgTFBESVJFQ1RQTEFZMiAqbHBscERQLCBJVW5rbm93biAqcFVuayk7CiAKIAogLyogRGlyZWN0IFBsYXkgTG9iYnkgMSAqLwpAQCAtMjY4LDggKzM3Nyw4IEBACiB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0UGxheUxvYmJ5MiAgICBJRGlyZWN0UGxheUxvYmJ5MiwgKkxQRElSRUNUUExBWUxPQkJZMjsKIHR5cGVkZWYgc3RydWN0IElEaXJlY3RQbGF5TG9iYnkyICAgIElEaXJlY3RQbGF5TG9iYnkyQSwgKkxQRElSRUNUUExBWUxPQkJZMkE7CiAKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RQbGF5TG9iYnlDcmVhdGVXKExQR1VJRCwgTFBESVJFQ1RQTEFZTE9CQlkyICosIElVbmtub3duICosIExQVk9JRCwgRFdPUkQgKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBKExQR1VJRCwgTFBESVJFQ1RQTEFZTE9CQlkyQSAqLCBJVW5rbm93biAqLCBMUFZPSUQsIERXT1JEICk7CitleHRlcm4gSFJFU1VMVCBXSU5BUEkgRGlyZWN0UGxheUxvYmJ5Q3JlYXRlVyhMUEdVSUQsIExQRElSRUNUUExBWUxPQkJZICosIElVbmtub3duICosIExQVk9JRCwgRFdPUkQgKTsKK2V4dGVybiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBKExQR1VJRCwgTFBESVJFQ1RQTEFZTE9CQllBICosIElVbmtub3duICosIExQVk9JRCwgRFdPUkQgKTsKIAogCiAKQEAgLTI3NywxNyArMzg2LDMxIEBACiAgICAgUkVGR1VJRCAgICAgICAgIGd1aWREYXRhVHlwZSwKICAgICBEV09SRCAgICAgICAgICAgZHdEYXRhU2l6ZSwKICAgICBMUENWT0lEICAgICAgICAgbHBEYXRhLAotICAgIExQVk9JRCAgICAgICAgICBscENvbnRleHQpOworICAgIExQVk9JRCAgICAgICAgICBscENvbnRleHQgKTsKIAogdHlwZWRlZiBCT09MMzIgKENBTExCQUNLKiBMUERQTEVOVU1BRERSRVNTVFlQRVNDQUxMQkFDSykoCiAgICAgUkVGR1VJRCAgICAgICAgIGd1aWREYXRhVHlwZSwKICAgICBMUFZPSUQgICAgICAgICAgbHBDb250ZXh0LAotICAgIERXT1JEICAgICAgICAgICBkd0ZsYWdzKTsKKyAgICBEV09SRCAgICAgICAgICAgZHdGbGFncyApOwogCiB0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sqIExQRFBMRU5VTUxPQ0FMQVBQTElDQVRJT05TQ0FMTEJBQ0spKAogICAgIExQQ0RQTEFQUElORk8gICBscEFwcEluZm8sCiAgICAgTFBWT0lEICAgICAgICAgIGxwQ29udGV4dCwKLSAgICBEV09SRCAgICAgICAgICAgZHdGbGFncyk7CisgICAgRFdPUkQgICAgICAgICAgIGR3RmxhZ3MgKTsKKwordHlwZWRlZiBCT09MMzIgKENBTExCQUNLKiBMUERQRU5VTVBMQVlFUlNDQUxMQkFDSzIpKAorICAgIERQSUQgICAgICAgICAgICBkcElkLAorICAgIERXT1JEICAgICAgICAgICBkd1BsYXllclR5cGUsCisgICAgTFBDRFBOQU1FICAgICAgIGxwTmFtZSwKKyAgICBEV09SRCAgICAgICAgICAgZHdGbGFncywKKyAgICBMUFZPSUQgICAgICAgICAgbHBDb250ZXh0ICk7CisKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyogTFBEUEVOVU1TRVNTSU9OU0NBTExCQUNLMikoCisgICAgTFBDRFBTRVNTSU9OREVTQzIgICBscFRoaXNTRCwKKyAgICBMUERXT1JEICAgICAgICAgICAgIGxwZHdUaW1lT3V0LAorICAgIERXT1JEICAgICAgICAgICAgICAgZHdGbGFncywKKyAgICBMUFZPSUQgICAgICAgICAgICAgIGxwQ29udGV4dCApOworCiAKIAogI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKQEAgLTI5NiwzNiArNDE5LDMzNCBAQAogI2RlZmluZSBGQVIKICNkZWZpbmUgVEhJU18gVEhJUywKIAotI2RlZmluZSBUSElTIExQRElSRUNUUExBWUxPQkJZMiB0aGlzCi10eXBlZGVmIHN0cnVjdCB0YWdMUERJUkVDVFBMQVlMT0JCWTJfVlRBQkxFIHsKKyNkZWZpbmUgVEhJUyBMUERJUkVDVFBMQVkyIHRoaXMKK3R5cGVkZWYgc3RydWN0IHRhZ0xQRElSRUNUUExBWTJfVlRBQkxFCit7CisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpICAgICAgIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAgICAgICAgKFRISVMpICBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgICAgICAgKFRISVMpIFBVUkU7CisKKyAgICAvKioqIElEaXJlY3RQbGF5MiBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoQWRkUGxheWVyVG9Hcm91cCkgICAgIChUSElTXyBEUElELCBEUElEKSBQVVJFOworICAgIFNURE1FVEhPRChDbG9zZSkgICAgICAgICAgICAgICAgKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKENyZWF0ZUdyb3VwKSAgICAgICAgICAoVEhJU18gTFBEUElELExQRFBOQU1FLExQVk9JRCxEV09SRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoQ3JlYXRlUGxheWVyKSAgICAgICAgIChUSElTXyBMUERQSUQsTFBEUE5BTUUsSEFORExFMzIsTFBWT0lELERXT1JELERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChEZWxldGVQbGF5ZXJGcm9tR3JvdXApKFRISVNfIERQSUQsRFBJRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRGVzdHJveUdyb3VwKSAgICAgICAgIChUSElTXyBEUElEKSBQVVJFOworICAgIFNURE1FVEhPRChEZXN0cm95UGxheWVyKSAgICAgICAgKFRISVNfIERQSUQpIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1Hcm91cFBsYXllcnMpICAgICAoVEhJU18gRFBJRCxMUEdVSUQsTFBEUEVOVU1QTEFZRVJTQ0FMTEJBQ0syLExQVk9JRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRW51bUdyb3VwcykgICAgICAgICAgIChUSElTXyBMUEdVSUQsTFBEUEVOVU1QTEFZRVJTQ0FMTEJBQ0syLExQVk9JRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRW51bVBsYXllcnMpICAgICAgICAgIChUSElTXyBMUEdVSUQsTFBEUEVOVU1QTEFZRVJTQ0FMTEJBQ0syLExQVk9JRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRW51bVNlc3Npb25zKSAgICAgICAgIChUSElTXyBMUERQU0VTU0lPTkRFU0MyLERXT1JELExQRFBFTlVNU0VTU0lPTlNDQUxMQkFDSzIsTFBWT0lELERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRDYXBzKSAgICAgICAgICAgICAgKFRISVNfIExQRFBDQVBTLERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRHcm91cERhdGEpICAgICAgICAgKFRISVNfIERQSUQsTFBWT0lELExQRFdPUkQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldEdyb3VwTmFtZSkgICAgICAgICAoVEhJU18gRFBJRCxMUFZPSUQsTFBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0TWVzc2FnZUNvdW50KSAgICAgIChUSElTXyBEUElELCBMUERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRQbGF5ZXJBZGRyZXNzKSAgICAgKFRISVNfIERQSUQsTFBWT0lELExQRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFBsYXllckNhcHMpICAgICAgICAoVEhJU18gRFBJRCxMUERQQ0FQUyxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0UGxheWVyRGF0YSkgICAgICAgIChUSElTXyBEUElELExQVk9JRCxMUERXT1JELERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRQbGF5ZXJOYW1lKSAgICAgICAgKFRISVNfIERQSUQsTFBWT0lELExQRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFNlc3Npb25EZXNjKSAgICAgICAoVEhJU18gTFBWT0lELExQRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEluaXRpYWxpemUpICAgICAgICAgICAoVEhJU18gTFBHVUlEKSBQVVJFOworICAgIFNURE1FVEhPRChPcGVuKSAgICAgICAgICAgICAgICAgKFRISVNfIExQRFBTRVNTSU9OREVTQzIsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFJlY2VpdmUpICAgICAgICAgICAgICAoVEhJU18gTFBEUElELExQRFBJRCxEV09SRCxMUFZPSUQsTFBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2VuZCkgICAgICAgICAgICAgICAgIChUSElTXyBEUElELCBEUElELCBEV09SRCwgTFBWT0lELCBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0R3JvdXBEYXRhKSAgICAgICAgIChUSElTXyBEUElELExQVk9JRCxEV09SRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0R3JvdXBOYW1lKSAgICAgICAgIChUSElTXyBEUElELExQRFBOQU1FLERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRQbGF5ZXJEYXRhKSAgICAgICAgKFRISVNfIERQSUQsTFBWT0lELERXT1JELERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRQbGF5ZXJOYW1lKSAgICAgICAgKFRISVNfIERQSUQsTFBEUE5BTUUsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldFNlc3Npb25EZXNjKSAgICAgICAoVEhJU18gTFBEUFNFU1NJT05ERVNDMixEV09SRCkgUFVSRTsKK30gRElSRUNUUExBWTJfVlRBQkxFLCAqTFBESVJFQ1RQTEFZMl9WVEFCTEU7CisjdW5kZWYgVEhJUworCisjZGVmaW5lIFRISVMgTFBESVJFQ1RQTEFZMyB0aGlzCit0eXBlZGVmIHN0cnVjdCB0YWdMUERJUkVDVFBMQVkzX1ZUQUJMRQoreworICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAgICAgICAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgICAgICAgIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpICAgICAgIChUSElTKSBQVVJFOworCisgICAgLyoqKiBJRGlyZWN0UGxheTIgbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKEFkZFBsYXllclRvR3JvdXApICAgICAoVEhJU18gRFBJRCwgRFBJRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoQ2xvc2UpICAgICAgICAgICAgICAgIChUSElTKSBQVVJFOworICAgIFNURE1FVEhPRChDcmVhdGVHcm91cCkgICAgICAgICAgKFRISVNfIExQRFBJRCxMUERQTkFNRSxMUFZPSUQsRFdPUkQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKENyZWF0ZVBsYXllcikgICAgICAgICAoVEhJU18gTFBEUElELExQRFBOQU1FLEhBTkRMRTMyLExQVk9JRCxEV09SRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRGVsZXRlUGxheWVyRnJvbUdyb3VwKShUSElTXyBEUElELERQSUQpIFBVUkU7CisgICAgU1RETUVUSE9EKERlc3Ryb3lHcm91cCkgICAgICAgICAoVEhJU18gRFBJRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRGVzdHJveVBsYXllcikgICAgICAgIChUSElTXyBEUElEKSBQVVJFOworICAgIFNURE1FVEhPRChFbnVtR3JvdXBQbGF5ZXJzKSAgICAgKFRISVNfIERQSUQsTFBHVUlELExQRFBFTlVNUExBWUVSU0NBTExCQUNLMixMUFZPSUQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1Hcm91cHMpICAgICAgICAgICAoVEhJU18gTFBHVUlELExQRFBFTlVNUExBWUVSU0NBTExCQUNLMixMUFZPSUQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1QbGF5ZXJzKSAgICAgICAgICAoVEhJU18gTFBHVUlELExQRFBFTlVNUExBWUVSU0NBTExCQUNLMixMUFZPSUQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1TZXNzaW9ucykgICAgICAgICAoVEhJU18gTFBEUFNFU1NJT05ERVNDMixEV09SRCxMUERQRU5VTVNFU1NJT05TQ0FMTEJBQ0syLExQVk9JRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0Q2FwcykgICAgICAgICAgICAgIChUSElTXyBMUERQQ0FQUyxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0R3JvdXBEYXRhKSAgICAgICAgIChUSElTXyBEUElELExQVk9JRCxMUERXT1JELERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRHcm91cE5hbWUpICAgICAgICAgKFRISVNfIERQSUQsTFBWT0lELExQRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldE1lc3NhZ2VDb3VudCkgICAgICAoVEhJU18gRFBJRCwgTFBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0UGxheWVyQWRkcmVzcykgICAgIChUSElTXyBEUElELExQVk9JRCxMUERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRQbGF5ZXJDYXBzKSAgICAgICAgKFRISVNfIERQSUQsTFBEUENBUFMsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFBsYXllckRhdGEpICAgICAgICAoVEhJU18gRFBJRCxMUFZPSUQsTFBEV09SRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0UGxheWVyTmFtZSkgICAgICAgIChUSElTXyBEUElELExQVk9JRCxMUERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRTZXNzaW9uRGVzYykgICAgICAgKFRISVNfIExQVk9JRCxMUERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChJbml0aWFsaXplKSAgICAgICAgICAgKFRISVNfIExQR1VJRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoT3BlbikgICAgICAgICAgICAgICAgIChUSElTXyBMUERQU0VTU0lPTkRFU0MyLERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChSZWNlaXZlKSAgICAgICAgICAgICAgKFRISVNfIExQRFBJRCxMUERQSUQsRFdPUkQsTFBWT0lELExQRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNlbmQpICAgICAgICAgICAgICAgICAoVEhJU18gRFBJRCwgRFBJRCwgRFdPUkQsIExQVk9JRCwgRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldEdyb3VwRGF0YSkgICAgICAgICAoVEhJU18gRFBJRCxMUFZPSUQsRFdPUkQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldEdyb3VwTmFtZSkgICAgICAgICAoVEhJU18gRFBJRCxMUERQTkFNRSxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0UGxheWVyRGF0YSkgICAgICAgIChUSElTXyBEUElELExQVk9JRCxEV09SRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0UGxheWVyTmFtZSkgICAgICAgIChUSElTXyBEUElELExQRFBOQU1FLERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRTZXNzaW9uRGVzYykgICAgICAgKFRISVNfIExQRFBTRVNTSU9OREVTQzIsRFdPUkQpIFBVUkU7CisKKyAgICAvKioqIElEaXJlY3RQbGF5MyBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoQWRkR3JvdXBUb0dyb3VwKSAgICAgICAgICAgIChUSElTXyBEUElELCBEUElEKSBQVVJFOworICAgIFNURE1FVEhPRChDcmVhdGVHcm91cEluR3JvdXApICAgICAgICAgKFRISVNfIERQSUQsTFBEUElELExQRFBOQU1FLExQVk9JRCxEV09SRCxEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRGVsZXRlR3JvdXBGcm9tR3JvdXApICAgICAgIChUSElTXyBEUElELERQSUQpIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1Db25uZWN0aW9ucykgICAgICAgICAgICAoVEhJU18gTFBDR1VJRCxMUERQRU5VTUNPTk5FQ1RJT05TQ0FMTEJBQ0ssTFBWT0lELERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChFbnVtR3JvdXBzSW5Hcm91cCkgICAgICAgICAgKFRISVNfIERQSUQsTFBHVUlELExQRFBFTlVNUExBWUVSU0NBTExCQUNLMixMUFZPSUQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldEdyb3VwQ29ubmVjdGlvblNldHRpbmdzKSAoVEhJU18gRFdPUkQsIERQSUQsIExQVk9JRCwgTFBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoSW5pdGlhbGl6ZUNvbm5lY3Rpb24pICAgICAgIChUSElTXyBMUFZPSUQsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNlY3VyZU9wZW4pICAgICAgICAgICAgICAgICAoVEhJU18gTFBDRFBTRVNTSU9OREVTQzIsRFdPUkQsTFBDRFBTRUNVUklUWURFU0MsTFBDRFBDUkVERU5USUFMUykgUFVSRTsKKyAgICBTVERNRVRIT0QoU2VuZENoYXRNZXNzYWdlKSAgICAgICAgICAgIChUSElTXyBEUElELERQSUQsRFdPUkQsTFBEUENIQVQpOworICAgIFNURE1FVEhPRChTZXRHcm91cENvbm5lY3Rpb25TZXR0aW5ncykgKFRISVNfIERXT1JELERQSUQsTFBEUExDT05ORUNUSU9OKSBQVVJFOworICAgIFNURE1FVEhPRChTdGFydFNlc3Npb24pICAgICAgICAgICAgICAgKFRISVNfIERXT1JELERQSUQpOworICAgIFNURE1FVEhPRChHZXRHcm91cEZsYWdzKSAgICAgICAgICAgICAgKFRISVNfIERQSUQsTFBEV09SRCk7CisgICAgU1RETUVUSE9EKEdldEdyb3VwUGFyZW50KSAgICAgICAgICAgICAoVEhJU18gRFBJRCxMUERQSUQpOworICAgIFNURE1FVEhPRChHZXRQbGF5ZXJBY2NvdW50KSAgICAgICAgICAgKFRISVNfIERQSUQsIERXT1JELCBMUFZPSUQsIExQRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFBsYXllckZsYWdzKSAgICAgICAgICAgICAoVEhJU18gRFBJRCxMUERXT1JEKTsKK30gRElSRUNUUExBWTNfVlRBQkxFLCAqTFBESVJFQ1RQTEFZM19WVEFCTEU7CisjdW5kZWYgVEhJUworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWFjcm9zIGZvciBhIG5pY2VyIGludGVyZmFjZSB0byBEaXJlY3RQbGF5IAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDT00gSW50ZXJmYWNlICovCisjZGVmaW5lIElEaXJlY3RQbGF5X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAgICAgICAgICAgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheV9BZGRSZWYocCkgICAgICAgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5BZGRSZWYocCkKKyNkZWZpbmUgSURpcmVjdFBsYXlfUmVsZWFzZShwKSAgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQorCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9RdWVyeUludGVyZmFjZShwLGEsYikgICAgICAgICAgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTJfQWRkUmVmKHApICAgICAgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5BZGRSZWYocCkKKyNkZWZpbmUgSURpcmVjdFBsYXkyX1JlbGVhc2UocCkgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQorCisjZGVmaW5lIElEaXJlY3RQbGF5M19RdWVyeUludGVyZmFjZShwLGEsYikgICAgICAgICAgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTNfQWRkUmVmKHApICAgICAgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5BZGRSZWYocCkKKyNkZWZpbmUgSURpcmVjdFBsYXkzX1JlbGVhc2UocCkgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQorCisvKiBEaXJlY3QgUGxheSAxJjIgSW50ZXJmYWNlICovCisjZGVmaW5lIElEaXJlY3RQbGF5X0FkZFBsYXllclRvR3JvdXAocCxhLGIpICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFBsYXllclRvR3JvdXAocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5X0Nsb3NlKHApICAgICAgICAgICAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkNsb3NlKHApCisjZGVmaW5lIElEaXJlY3RQbGF5X0NyZWF0ZUdyb3VwKHAsYSxiLGMpICAgICAgICAgICAgKHApLT5scFZ0YmwtPkNyZWF0ZUdyb3VwKHAsYSxiLGMpCisjZGVmaW5lIElEaXJlY3RQbGF5X0NyZWF0ZVBsYXllcihwLGEsYixjLGQpICAgICAgICAgKHApLT5scFZ0YmwtPkNyZWF0ZVBsYXllcihwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5X0RlbGV0ZVBsYXllckZyb21Hcm91cChwLGEsYikgICAgKHApLT5scFZ0YmwtPkRlbGV0ZVBsYXllckZyb21Hcm91cChwLGEsYikKKyNkZWZpbmUgSURpcmVjdFBsYXlfRGVzdHJveUdyb3VwKHAsYSkgICAgICAgICAgICAgICAocCktPmxwVnRibC0+RGVzdHJveUdyb3VwKHAsYSkKKyNkZWZpbmUgSURpcmVjdFBsYXlfRGVzdHJveVBsYXllcihwLGEpICAgICAgICAgICAgICAocCktPmxwVnRibC0+RGVzdHJveVBsYXllcihwLGEpCisjZGVmaW5lIElEaXJlY3RQbGF5X0VuYWJsZU5ld1BsYXllcnMocCxhKSAgICAgICAgICAgKHApLT5scFZ0YmwtPkVuYWJsZU5ld1BsYXllcnMocCxhKQorI2RlZmluZSBJRGlyZWN0UGxheV9FbnVtR3JvdXBQbGF5ZXJzKHAsYSxiLGMsZCkgICAgIChwKS0+bHBWdGJsLT5FbnVtR3JvdXBQbGF5ZXJzKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXlfRW51bUdyb3VwcyhwLGEsYixjLGQpICAgICAgICAgICAocCktPmxwVnRibC0+RW51bUdyb3VwcyhwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5X0VudW1QbGF5ZXJzKHAsYSxiLGMsZCkgICAgICAgICAgKHApLT5scFZ0YmwtPkVudW1QbGF5ZXJzKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXlfRW51bVNlc3Npb25zKHAsYSxiLGMsZCxlKSAgICAgICAocCktPmxwVnRibC0+RW51bVNlc3Npb25zKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheV9HZXRDYXBzKHAsYSkgICAgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5HZXRDYXBzKHAsYSkKKyNkZWZpbmUgSURpcmVjdFBsYXlfR2V0TWVzc2FnZUNvdW50KHAsYSxiKSAgICAgICAgICAocCktPmxwVnRibC0+R2V0TWVzc2FnZUNvdW50KHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheV9HZXRQbGF5ZXJDYXBzKHAsYSxiKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5HZXRQbGF5ZXJDYXBzKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheV9HZXRQbGF5ZXJOYW1lKHAsYSxiLGMsZCxlKSAgICAgIChwKS0+bHBWdGJsLT5HZXRQbGF5ZXJOYW1lKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheV9Jbml0aWFsaXplKHAsYSkgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5Jbml0aWFsaXplKHAsYSkKKyNkZWZpbmUgSURpcmVjdFBsYXlfT3BlbihwLGEpICAgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+T3BlbihwLGEpCisjZGVmaW5lIElEaXJlY3RQbGF5X1JlY2VpdmUocCxhLGIsYyxkLGUpICAgICAgICAgICAgKHApLT5scFZ0YmwtPlJlY2VpdmUocCxhLGIsYyxkLGUpCisjZGVmaW5lIElEaXJlY3RQbGF5X1NhdmVTZXNzaW9uKHAsYSkgICAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPlNhdmVTZXNzaW9uKHAsYSkKKyNkZWZpbmUgSURpcmVjdFBsYXlfU2VuZChwLGEsYixjLGQsZSkgICAgICAgICAgICAgICAocCktPmxwVnRibC0+U2VuZChwLGEsYixjLGQsZSkKKyNkZWZpbmUgSURpcmVjdFBsYXlfU2V0UGxheWVyTmFtZShwLGEsYixjKSAgICAgICAgICAocCktPmxwVnRibC0+U2V0UGxheWVyTmFtZShwLGEsYixjKQorCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9BZGRQbGF5ZXJUb0dyb3VwKHAsYSxiKSAgICAgICAgKHApLT5scFZ0YmwtPkFkZFBsYXllclRvR3JvdXAocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9DbG9zZShwKSAgICAgICAgICAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkNsb3NlKHApCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9DcmVhdGVHcm91cChwLGEsYixjLGQsZSkgICAgICAgKHApLT5scFZ0YmwtPkNyZWF0ZUdyb3VwKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheTJfQ3JlYXRlUGxheWVyKHAsYSxiLGMsZCxlLGYpICAgIChwKS0+bHBWdGJsLT5DcmVhdGVQbGF5ZXIocCxhLGIsYyxkLGUsZikKKyNkZWZpbmUgSURpcmVjdFBsYXkyX0RlbGV0ZVBsYXllckZyb21Hcm91cChwLGEsYikgICAocCktPmxwVnRibC0+RGVsZXRlUGxheWVyRnJvbUdyb3VwKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTJfRGVzdHJveUdyb3VwKHAsYSkgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5EZXN0cm95R3JvdXAocCxhKQorI2RlZmluZSBJRGlyZWN0UGxheTJfRGVzdHJveVBsYXllcihwLGEpICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5EZXN0cm95UGxheWVyKHAsYSkKKyNkZWZpbmUgSURpcmVjdFBsYXkyX0VudW1Hcm91cFBsYXllcnMocCxhLGIsYyxkLGUpICAocCktPmxwVnRibC0+RW51bUdyb3VwUGxheWVycyhwLGEsYixjLGQsZSkKKyNkZWZpbmUgSURpcmVjdFBsYXkyX0VudW1Hcm91cHMocCxhLGIsYyxkKSAgICAgICAgICAocCktPmxwVnRibC0+RW51bUdyb3VwcyhwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9FbnVtUGxheWVycyhwLGEsYixjLGQpICAgICAgICAgKHApLT5scFZ0YmwtPkVudW1QbGF5ZXJzKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXkyX0VudW1TZXNzaW9ucyhwLGEsYixjLGQsZSkgICAgICAocCktPmxwVnRibC0+RW51bVNlc3Npb25zKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheTJfR2V0Q2FwcyhwLGEsYikgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5HZXRDYXBzKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTJfR2V0TWVzc2FnZUNvdW50KHAsYSxiKSAgICAgICAgIChwKS0+bHBWdGJsLT5HZXRNZXNzYWdlQ291bnQocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9HZXRHcm91cERhdGEocCxhLGIsYyxkKSAgICAgICAgKHApLT5scFZ0YmwtPkdldEdyb3VwRGF0YShwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9HZXRHcm91cE5hbWUocCxhLGIsYykgICAgICAgICAgKHApLT5scFZ0YmwtPkdldEdyb3VwTmFtZShwLGEsYixjKQorI2RlZmluZSBJRGlyZWN0UGxheTJfR2V0UGxheWVyQWRkcmVzcyhwLGEsYixjKSAgICAgIChwKS0+bHBWdGJsLT5HZXRQbGF5ZXJBZGRyZXNzKHAsYSxiLGMpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9HZXRQbGF5ZXJDYXBzKHAsYSxiLGMpICAgICAgICAgKHApLT5scFZ0YmwtPkdldFBsYXllckNhcHMocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXkyX0dldFBsYXllckRhdGEocCxhLGIsYyxkKSAgICAgICAocCktPmxwVnRibC0+R2V0UGxheWVyRGF0YShwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9HZXRQbGF5ZXJOYW1lKHAsYSxiLGMpICAgICAgICAgKHApLT5scFZ0YmwtPkdldFBsYXllck5hbWUocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXkyX0dldFNlc3Npb25EZXNjKHAsYSxiKSAgICAgICAgICAocCktPmxwVnRibC0+R2V0U2Vzc2lvbkRlc2MocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9Jbml0aWFsaXplKHAsYSkgICAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkluaXRpYWxpemUocCxhKQorI2RlZmluZSBJRGlyZWN0UGxheTJfT3BlbihwLGEsYikgICAgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5PcGVuKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTJfUmVjZWl2ZShwLGEsYixjLGQsZSkgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWNlaXZlKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheTJfU2VuZChwLGEsYixjLGQsZSkgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5TZW5kKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheTJfU2V0R3JvdXBEYXRhKHAsYSxiLGMsZCkgICAgICAgIChwKS0+bHBWdGJsLT5TZXRHcm91cERhdGEocCxhLGIsYyxkKQorI2RlZmluZSBJRGlyZWN0UGxheTJfU2V0R3JvdXBOYW1lKHAsYSxiLGMpICAgICAgICAgIChwKS0+bHBWdGJsLT5TZXRHcm91cE5hbWUocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXkyX1NldFBsYXllckRhdGEocCxhLGIsYyxkKSAgICAgICAocCktPmxwVnRibC0+U2V0UGxheWVyRGF0YShwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5Ml9TZXRQbGF5ZXJOYW1lKHAsYSxiLGMpICAgICAgICAgKHApLT5scFZ0YmwtPlNldFBsYXllck5hbWUocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXkyX1NldFNlc3Npb25EZXNjKHAsYSxiKSAgICAgICAgICAocCktPmxwVnRibC0+U2V0U2Vzc2lvbkRlc2MocCxhLGIpCisKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0FkZFBsYXllclRvR3JvdXAocCxhLGIpICAgICAgICAocCktPmxwVnRibC0+QWRkUGxheWVyVG9Hcm91cChwLGEsYikKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0Nsb3NlKHApICAgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+Q2xvc2UocCkKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0NyZWF0ZUdyb3VwKHAsYSxiLGMsZCxlKSAgICAgICAocCktPmxwVnRibC0+Q3JlYXRlR3JvdXAocCxhLGIsYyxkLGUpCisjZGVmaW5lIElEaXJlY3RQbGF5M19DcmVhdGVQbGF5ZXIocCxhLGIsYyxkLGUsZikgICAgKHApLT5scFZ0YmwtPkNyZWF0ZVBsYXllcihwLGEsYixjLGQsZSxmKQorI2RlZmluZSBJRGlyZWN0UGxheTNfRGVsZXRlUGxheWVyRnJvbUdyb3VwKHAsYSxiKSAgIChwKS0+bHBWdGJsLT5EZWxldGVQbGF5ZXJGcm9tR3JvdXAocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5M19EZXN0cm95R3JvdXAocCxhKSAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkRlc3Ryb3lHcm91cChwLGEpCisjZGVmaW5lIElEaXJlY3RQbGF5M19EZXN0cm95UGxheWVyKHAsYSkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkRlc3Ryb3lQbGF5ZXIocCxhKQorI2RlZmluZSBJRGlyZWN0UGxheTNfRW51bUdyb3VwUGxheWVycyhwLGEsYixjLGQsZSkgIChwKS0+bHBWdGJsLT5FbnVtR3JvdXBQbGF5ZXJzKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheTNfRW51bUdyb3VwcyhwLGEsYixjLGQpICAgICAgICAgIChwKS0+bHBWdGJsLT5FbnVtR3JvdXBzKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0VudW1QbGF5ZXJzKHAsYSxiLGMsZCkgICAgICAgICAocCktPmxwVnRibC0+RW51bVBsYXllcnMocCxhLGIsYyxkKQorI2RlZmluZSBJRGlyZWN0UGxheTNfRW51bVNlc3Npb25zKHAsYSxiLGMsZCxlKSAgICAgIChwKS0+bHBWdGJsLT5FbnVtU2Vzc2lvbnMocCxhLGIsYyxkLGUpCisjZGVmaW5lIElEaXJlY3RQbGF5M19HZXRDYXBzKHAsYSxiKSAgICAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkdldENhcHMocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5M19HZXRNZXNzYWdlQ291bnQocCxhLGIpICAgICAgICAgKHApLT5scFZ0YmwtPkdldE1lc3NhZ2VDb3VudChwLGEsYikKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0dldEdyb3VwRGF0YShwLGEsYixjLGQpICAgICAgICAocCktPmxwVnRibC0+R2V0R3JvdXBEYXRhKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0dldEdyb3VwTmFtZShwLGEsYixjKSAgICAgICAgICAocCktPmxwVnRibC0+R2V0R3JvdXBOYW1lKHAsYSxiLGMpCisjZGVmaW5lIElEaXJlY3RQbGF5M19HZXRQbGF5ZXJBZGRyZXNzKHAsYSxiLGMpICAgICAgKHApLT5scFZ0YmwtPkdldFBsYXllckFkZHJlc3MocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0dldFBsYXllckNhcHMocCxhLGIsYykgICAgICAgICAocCktPmxwVnRibC0+R2V0UGxheWVyQ2FwcyhwLGEsYixjKQorI2RlZmluZSBJRGlyZWN0UGxheTNfR2V0UGxheWVyRGF0YShwLGEsYixjLGQpICAgICAgIChwKS0+bHBWdGJsLT5HZXRQbGF5ZXJEYXRhKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0dldFBsYXllck5hbWUocCxhLGIsYykgICAgICAgICAocCktPmxwVnRibC0+R2V0UGxheWVyTmFtZShwLGEsYixjKQorI2RlZmluZSBJRGlyZWN0UGxheTNfR2V0U2Vzc2lvbkRlc2MocCxhLGIpICAgICAgICAgIChwKS0+bHBWdGJsLT5HZXRTZXNzaW9uRGVzYyhwLGEsYikKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0luaXRpYWxpemUocCxhKSAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+SW5pdGlhbGl6ZShwLGEpCisjZGVmaW5lIElEaXJlY3RQbGF5M19PcGVuKHAsYSxiKSAgICAgICAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPk9wZW4ocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5M19SZWNlaXZlKHAsYSxiLGMsZCxlKSAgICAgICAgICAgKHApLT5scFZ0YmwtPlJlY2VpdmUocCxhLGIsYyxkLGUpCisjZGVmaW5lIElEaXJlY3RQbGF5M19TZW5kKHAsYSxiLGMsZCxlKSAgICAgICAgICAgICAgKHApLT5scFZ0YmwtPlNlbmQocCxhLGIsYyxkLGUpCisjZGVmaW5lIElEaXJlY3RQbGF5M19TZXRHcm91cERhdGEocCxhLGIsYyxkKSAgICAgICAgKHApLT5scFZ0YmwtPlNldEdyb3VwRGF0YShwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5M19TZXRHcm91cE5hbWUocCxhLGIsYykgICAgICAgICAgKHApLT5scFZ0YmwtPlNldEdyb3VwTmFtZShwLGEsYixjKQorI2RlZmluZSBJRGlyZWN0UGxheTNfU2V0UGxheWVyRGF0YShwLGEsYixjLGQpICAgICAgIChwKS0+bHBWdGJsLT5TZXRQbGF5ZXJEYXRhKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXkzX1NldFBsYXllck5hbWUocCxhLGIsYykgICAgICAgICAocCktPmxwVnRibC0+U2V0UGxheWVyTmFtZShwLGEsYixjKQorI2RlZmluZSBJRGlyZWN0UGxheTNfU2V0U2Vzc2lvbkRlc2MocCxhLGIpICAgICAgICAgIChwKS0+bHBWdGJsLT5TZXRTZXNzaW9uRGVzYyhwLGEsYikKKworCisvKiBEaXJlY3QgUGxheSAzIEludGVyZmFjZS4gKi8KKworI2RlZmluZSBJRGlyZWN0UGxheTNfQWRkR3JvdXBUb0dyb3VwKHAsYSxiKSAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkR3JvdXBUb0dyb3VwKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTNfQ3JlYXRlR3JvdXBJbkdyb3VwKHAsYSxiLGMsZCxlLGYpIChwKS0+bHBWdGJsLT5DcmVhdGVHcm91cEluR3JvdXAocCxhLGIsYyxkLGUsZikKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0RlbGV0ZUdyb3VwRnJvbUdyb3VwKHAsYSxiKSAgICAgICAgKHApLT5scFZ0YmwtPkRlbGV0ZUdyb3VwRnJvbUdyb3VwKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTNfRW51bUNvbm5lY3Rpb25zKHAsYSxiLGMsZCkgICAgICAgICAocCktPmxwVnRibC0+RW51bUNvbm5lY3Rpb25zKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0VudW1Hcm91cHNJbkdyb3VwKHAsYSxiLGMsZCxlKSAocCktPmxwVnRibC0+RW51bUdyb3Vwc0luR3JvdXAocCxhLGIsYyxkLGUpCisjZGVmaW5lIElEaXJlY3RQbGF5M19HZXRHcm91cENvbm5lY3Rpb25TZXR0aW5ncyhwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5HZXRHcm91cENvbm5lY3Rpb25TZXR0aW5ncyhwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5M19Jbml0aWFsaXplQ29ubmVjdGlvbihwLGEsYikgICAgICAgIChwKS0+bHBWdGJsLT5Jbml0aWFsaXplQ29ubmVjdGlvbihwLGEsYikKKyNkZWZpbmUgSURpcmVjdFBsYXkzX1NlY3VyZU9wZW4ocCxhLGIsYyxkKSAgICAgICAgICAocCktPmxwVnRibC0+U2VjdXJlT3BlbihwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5M19TZW5kQ2hhdE1lc3NhZ2UocCxhLGIsYyxkKSAgICAgKHApLT5scFZ0YmwtPlNlbmRDaGF0TWVzc2FnZShwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5M19TZXRHcm91cENvbm5lY3Rpb25TZXR0aW5ncyhwLGEsYixjKSAocCktPmxwVnRibC0+U2V0R3JvdXBDb25uZWN0aW9uU2V0dGluZ3MocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXkzX1N0YXJ0U2Vzc2lvbihwLGEsYikgICAgICAgICAgICAocCktPmxwVnRibC0+U3RhcnRTZXNzaW9uKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTNfR2V0R3JvdXBGbGFncyhwLGEsYikgICAgICAgICAgIChwKS0+bHBWdGJsLT5HZXRHcm91cEZsYWdzKHAsYSxiKQorI2RlZmluZSBJRGlyZWN0UGxheTNfR2V0R3JvdXBQYXJlbnQocCxhLGIpICAgICAgICAgIChwKS0+bHBWdGJsLT5HZXRHcm91cFBhcmVudChwLGEsYikKKyNkZWZpbmUgSURpcmVjdFBsYXkzX0dldFBsYXllckFjY291bnQocCxhLGIsYyxkKSAgICAocCktPmxwVnRibC0+R2V0UGxheWVyQWNjb3VudChwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5M19HZXRQbGF5ZXJGbGFncyhwLGEsYikgICAgICAgICAgKHApLT5scFZ0YmwtPkdldFBsYXllckZsYWdzKHAsYSxiKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRElSRUNUIFBMQVkgTE9CQlkgVklSVFVBTCBUQUJMRSBERUZJTklUSU9OUyAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjZGVmaW5lIFRISVMgTFBESVJFQ1RQTEFZTE9CQlkgdGhpcwordHlwZWRlZiBzdHJ1Y3QgdGFnTFBESVJFQ1RQTEFZTE9CQllfVlRBQkxFIAorewogICAgIC8qICBJVW5rbm93biBNZXRob2RzICJJbmhlcml0ZWQgTWV0aG9kcyIgKi8KICAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpICAgICAgIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOwotICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAgICAgICAgKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpICAgICAgICAoVEhJUykgIFBVUkU7CiAgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAgICAgICAoVEhJUykgUFVSRTsKIAogICAgIC8qICBJRGlyZWN0UGxheUxvYmJ5IE1ldGhvZHMgKi8KLSAgICBTVERNRVRIT0QoQ29ubmVjdCkgICAgICAgICAgICAgIChUSElTXyBEV09SRCwgTFBESVJFQ1RQTEFZMiAqLCBJVW5rbm93biAqKSBQVVJFOwotICAgIFNURE1FVEhPRChDcmVhdGVBZGRyZXNzKSAgICAgICAgKFRISVNfIFJFRkdVSUQsIFJFRkdVSUQsIExQQ1ZPSUQsIERXT1JELCBMUFZPSUQsIExQRFdPUkQpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEVudW1BZGRyZXNzKSAgICAgICAgICAoVEhJU18gTFBEUEVOVU1BRERSRVNTQ0FMTEJBQ0ssIExQQ1ZPSUQsIERXT1JELCBMUFZPSUQpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEVudW1BZGRyZXNzVHlwZXMpICAgICAoVEhJU18gTFBEUExFTlVNQUREUkVTU1RZUEVTQ0FMTEJBQ0ssIFJFRkdVSUQsIExQVk9JRCwgRFdPUkQpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEVudW1Mb2NhbEFwcGxpY2F0aW9ucykoVEhJU18gTFBEUExFTlVNTE9DQUxBUFBMSUNBVElPTlNDQUxMQkFDSywgTFBWT0lELCBEV09SRCkgUFVSRTsKLSAgICBTVERNRVRIT0QoR2V0Q29ubmVjdGlvblNldHRpbmdzKShUSElTXyBEV09SRCwgTFBWT0lELCBMUERXT1JEKSBQVVJFOwotICAgIFNURE1FVEhPRChSZWNlaXZlTG9iYnlNZXNzYWdlKSAgKFRISVNfIERXT1JELCBEV09SRCwgTFBEV09SRCwgTFBWT0lELCBMUERXT1JEKSBQVVJFOwotICAgIFNURE1FVEhPRChSdW5BcHBsaWNhdGlvbikgICAgICAgKFRISVNfIERXT1JELCBMUERXT1JELCBMUERQTENPTk5FQ1RJT04sIEhBTkRMRTMyKSBQVVJFOwotICAgIFNURE1FVEhPRChTZW5kTG9iYnlNZXNzYWdlKSAgICAgKFRISVNfIERXT1JELCBEV09SRCwgTFBWT0lELCBEV09SRCkgUFVSRTsKLSAgICBTVERNRVRIT0QoU2V0Q29ubmVjdGlvblNldHRpbmdzKShUSElTXyBEV09SRCwgRFdPUkQsIExQRFBMQ09OTkVDVElPTikgUFVSRTsKKyAgICBTVERNRVRIT0QoQ29ubmVjdCkgICAgICAgICAgICAgIChUSElTXyBEV09SRCwgTFBESVJFQ1RQTEFZICosIElVbmtub3duICopIFBVUkU7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoQ3JlYXRlQWRkcmVzcykgICAgICAgIChUSElTXyBSRUZHVUlELCBSRUZHVUlELCBMUENWT0lELCBEV09SRCwgTFBWT0lELCBMUERXT1JEKSBQVVJFOyAgICAgICAKKyAgICBTVERNRVRIT0QoRW51bUFkZHJlc3MpICAgICAgICAgIChUSElTXyBMUERQRU5VTUFERFJFU1NDQUxMQkFDSywgTFBDVk9JRCwgRFdPUkQsIExQVk9JRCkgUFVSRTsgICAgICAgICAKKyAgICBTVERNRVRIT0QoRW51bUFkZHJlc3NUeXBlcykgICAgIChUSElTXyBMUERQTEVOVU1BRERSRVNTVFlQRVNDQUxMQkFDSywgUkVGR1VJRCwgTFBWT0lELCBEV09SRCkgUFVSRTsgICAKKyAgICBTVERNRVRIT0QoRW51bUxvY2FsQXBwbGljYXRpb25zKShUSElTXyBMUERQTEVOVU1MT0NBTEFQUExJQ0FUSU9OU0NBTExCQUNLLCBMUFZPSUQsIERXT1JEKSBQVVJFOyAgICAgICAKKyAgICBTVERNRVRIT0QoR2V0Q29ubmVjdGlvblNldHRpbmdzKShUSElTXyBEV09SRCwgTFBWT0lELCBMUERXT1JEKSBQVVJFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoUmVjZWl2ZUxvYmJ5TWVzc2FnZSkgIChUSElTXyBEV09SRCwgRFdPUkQsIExQRFdPUkQsIExQVk9JRCwgTFBEV09SRCkgUFVSRTsgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoUnVuQXBwbGljYXRpb24pICAgICAgIChUSElTXyBEV09SRCwgTFBEV09SRCwgTFBEUExDT05ORUNUSU9OLCBIQU5ETEUzMikgUFVSRTsgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoU2VuZExvYmJ5TWVzc2FnZSkgICAgIChUSElTXyBEV09SRCwgRFdPUkQsIExQVk9JRCwgRFdPUkQpIFBVUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoU2V0Q29ubmVjdGlvblNldHRpbmdzKShUSElTXyBEV09SRCwgRFdPUkQsIExQRFBMQ09OTkVDVElPTikgUFVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoU2V0TG9iYnlNZXNzYWdlRXZlbnQpIChUSElTXyBEV09SRCwgRFdPUkQsIEhBTkRMRTMyKSBQVVJFOworCisKK30gRElSRUNUUExBWUxPQkJZX1ZUQUJMRSwgKkxQRElSRUNUUExBWUxPQkJZX1ZUQUJMRTsKKyN1bmRlZiBUSElTCisKKyNkZWZpbmUgVEhJUyBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcwordHlwZWRlZiBzdHJ1Y3QgdGFnTFBESVJFQ1RQTEFZTE9CQlkyX1ZUQUJMRSAKK3sKKyAgICAvKiAgSVVua25vd24gTWV0aG9kcyAiSW5oZXJpdGVkIE1ldGhvZHMiICovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAgICAgICAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgICAgICAgIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpICAgICAgIChUSElTKSBQVVJFOworCisgICAgLyogIElEaXJlY3RQbGF5TG9iYnkgTWV0aG9kcyAqLworICAgIFNURE1FVEhPRChDb25uZWN0KSAgICAgICAgICAgICAgKFRISVNfIERXT1JELCBMUERJUkVDVFBMQVkyICosIElVbmtub3duICopIFBVUkU7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoQ3JlYXRlQWRkcmVzcykgICAgICAgIChUSElTXyBSRUZHVUlELCBSRUZHVUlELCBMUENWT0lELCBEV09SRCwgTFBWT0lELCBMUERXT1JEKSBQVVJFOyAgICAgICAKKyAgICBTVERNRVRIT0QoRW51bUFkZHJlc3MpICAgICAgICAgIChUSElTXyBMUERQRU5VTUFERFJFU1NDQUxMQkFDSywgTFBDVk9JRCwgRFdPUkQsIExQVk9JRCkgUFVSRTsgICAgICAgICAKKyAgICBTVERNRVRIT0QoRW51bUFkZHJlc3NUeXBlcykgICAgIChUSElTXyBMUERQTEVOVU1BRERSRVNTVFlQRVNDQUxMQkFDSywgUkVGR1VJRCwgTFBWT0lELCBEV09SRCkgUFVSRTsgICAKKyAgICBTVERNRVRIT0QoRW51bUxvY2FsQXBwbGljYXRpb25zKShUSElTXyBMUERQTEVOVU1MT0NBTEFQUExJQ0FUSU9OU0NBTExCQUNLLCBMUFZPSUQsIERXT1JEKSBQVVJFOyAgICAgICAKKyAgICBTVERNRVRIT0QoR2V0Q29ubmVjdGlvblNldHRpbmdzKShUSElTXyBEV09SRCwgTFBWT0lELCBMUERXT1JEKSBQVVJFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoUmVjZWl2ZUxvYmJ5TWVzc2FnZSkgIChUSElTXyBEV09SRCwgRFdPUkQsIExQRFdPUkQsIExQVk9JRCwgTFBEV09SRCkgUFVSRTsgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoUnVuQXBwbGljYXRpb24pICAgICAgIChUSElTXyBEV09SRCwgTFBEV09SRCwgTFBEUExDT05ORUNUSU9OLCBIQU5ETEUzMikgUFVSRTsgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoU2VuZExvYmJ5TWVzc2FnZSkgICAgIChUSElTXyBEV09SRCwgRFdPUkQsIExQVk9JRCwgRFdPUkQpIFBVUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBTVERNRVRIT0QoU2V0Q29ubmVjdGlvblNldHRpbmdzKShUSElTXyBEV09SRCwgRFdPUkQsIExQRFBMQ09OTkVDVElPTikgUFVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBTVERNRVRIT0QoU2V0TG9iYnlNZXNzYWdlRXZlbnQpIChUSElTXyBEV09SRCwgRFdPUkQsIEhBTkRMRTMyKSBQVVJFOwogCiAgICAgLyogIElEaXJlY3RQbGF5TG9iYnkyIE1ldGhvZHMgKi8KICAgICBTVERNRVRIT0QoQ3JlYXRlQ29tcG91bmRBZGRyZXNzKShUSElTXyBMUENEUENPTVBPVU5EQUREUkVTU0VMRU1FTlQsIERXT1JELCBMUFZPSUQsIExQRFdPUkQpIFBVUkU7CiAKIH0gRElSRUNUUExBWUxPQkJZMl9WVEFCTEUsICpMUERJUkVDVFBMQVlMT0JCWTJfVlRBQkxFOworI3VuZGVmIFRISVMKIAotLyogSXMgdGhpcyByaWdodD8gSG93IGRvZXMgb25lIGtub3c/ICovCi1zdHJ1Y3QgSURpcmVjdFBsYXlMb2JieTIgewotICAgIExQRElSRUNUUExBWUxPQkJZMl9WVEFCTEUgbHB2dGJsOwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgcmVmOwotfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWFjcm9zIGZvciBhIG5pY2VyIGludGVyZmFjZSB0byBEaXJlY3RQbGF5TG9iYnkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ09NIEludGVyZmFjZSAqLworCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnlfUXVlcnlJbnRlcmZhY2UocCxhLGIpICAgICAgICAgICAgICAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnlfQWRkUmVmKHApICAgICAgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkUmVmKHApCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnlfUmVsZWFzZShwKSAgICAgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQorCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAgICAgICAgICAgICAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX0FkZFJlZihwKSAgICAgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkUmVmKHApCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX1JlbGVhc2UocCkgICAgICAgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQorCisvKiBEaXJlY3QgUGxheSBMb2JieSAxICovCisKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9Db25uZWN0KHAsYSxiLGMpICAgICAgICAgICAgICAgICAgIChwKS0+bHBWdGJsLT5Db25uZWN0KHAsYSxiLGMpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnlfQ3JlYXRlQWRkcmVzcyhwLGEsYixjLGQsZSxmKSAgICAgICAocCktPmxwVnRibC0+Q3JlYXRlQWRkcmVzcyhwLGEsYixjLGQsZSxmKQorI2RlZmluZSBJRGlyZWN0UGxheUxvYmJ5X0VudW1BZGRyZXNzKHAsYSxiLGMsZCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkVudW1BZGRyZXNzKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9FbnVtQWRkcmVzc1R5cGVzKHAsYSxiLGMsZCkgICAgICAgIChwKS0+bHBWdGJsLT5FbnVtQWRkcmVzc1R5cGVzKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9FbnVtTG9jYWxBcHBsaWNhdGlvbnMocCxhLGIsYykgICAgIChwKS0+bHBWdGJsLT5FbnVtTG9jYWxBcHBsaWNhdGlvbnMocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9HZXRDb25uZWN0aW9uU2V0dGluZ3MocCxhLGIsYykgICAgIChwKS0+bHBWdGJsLT5HZXRDb25uZWN0aW9uU2V0dGluZ3MocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9SZWNlaXZlTG9iYnlNZXNzYWdlKHAsYSxiLGMsZCxlKSAgIChwKS0+bHBWdGJsLT5SZWNlaXZlTG9iYnlNZXNzYWdlKHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0UGxheUxvYmJ5X1J1bkFwcGxpY2F0aW9uKHAsYSxiLGMsZCkgICAgICAgICAgKHApLT5scFZ0YmwtPlJ1bkFwcGxpY2F0aW9uKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9TZW5kTG9iYnlNZXNzYWdlKHAsYSxiLGMsZCkgICAgICAgIChwKS0+bHBWdGJsLT5TZW5kTG9iYnlNZXNzYWdlKHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9TZXRDb25uZWN0aW9uU2V0dGluZ3MocCxhLGIsYykgICAgIChwKS0+bHBWdGJsLT5TZXRDb25uZWN0aW9uU2V0dGluZ3MocCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieV9TZXRMb2JieU1lc3NhZ2VFdmVudChwLGEsYixjKSAgICAgIChwKS0+bHBWdGJsLT5TZXRMb2JieU1lc3NhZ2VFdmVudChwLGEsYixjKQorCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX0Nvbm5lY3QocCxhLGIsYykgICAgICAgICAgICAgICAgICAocCktPmxwVnRibC0+Q29ubmVjdChwLGEsYixjKQorI2RlZmluZSBJRGlyZWN0UGxheUxvYmJ5Ml9DcmVhdGVBZGRyZXNzKHAsYSxiLGMsZCxlLGYpICAgICAgKHApLT5scFZ0YmwtPkNyZWF0ZUFkZHJlc3MocCxhLGIsYyxkLGUsZikKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieTJfRW51bUFkZHJlc3MocCxhLGIsYyxkKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5FbnVtQWRkcmVzcyhwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX0VudW1BZGRyZXNzVHlwZXMocCxhLGIsYyxkKSAgICAgICAocCktPmxwVnRibC0+RW51bUFkZHJlc3NUeXBlcyhwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX0VudW1Mb2NhbEFwcGxpY2F0aW9ucyhwLGEsYixjKSAgICAocCktPmxwVnRibC0+RW51bUxvY2FsQXBwbGljYXRpb25zKHAsYSxiLGMpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX0dldENvbm5lY3Rpb25TZXR0aW5ncyhwLGEsYixjKSAgICAocCktPmxwVnRibC0+R2V0Q29ubmVjdGlvblNldHRpbmdzKHAsYSxiLGMpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX1JlY2VpdmVMb2JieU1lc3NhZ2UocCxhLGIsYyxkLGUpICAocCktPmxwVnRibC0+UmVjZWl2ZUxvYmJ5TWVzc2FnZShwLGEsYixjLGQsZSkKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieTJfUnVuQXBwbGljYXRpb24ocCxhLGIsYyxkKSAgICAgICAgIChwKS0+bHBWdGJsLT5SdW5BcHBsaWNhdGlvbihwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX1NlbmRMb2JieU1lc3NhZ2UocCxhLGIsYyxkKSAgICAgICAocCktPmxwVnRibC0+U2VuZExvYmJ5TWVzc2FnZShwLGEsYixjLGQpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX1NldENvbm5lY3Rpb25TZXR0aW5ncyhwLGEsYixjKSAgICAocCktPmxwVnRibC0+U2V0Q29ubmVjdGlvblNldHRpbmdzKHAsYSxiLGMpCisjZGVmaW5lIElEaXJlY3RQbGF5TG9iYnkyX1NldExvYmJ5TWVzc2FnZUV2ZW50KHAsYSxiLGMpICAgICAocCktPmxwVnRibC0+U2V0TG9iYnlNZXNzYWdlRXZlbnQocCxhLGIsYykKKworCisvKiBEaXJlY3QgUGxheSBMb2JieSAyICovCisKKyNkZWZpbmUgSURpcmVjdFBsYXlMb2JieTJfQ3JlYXRlQ29tcG91bmRBZGRyZXNzKHAsYSxiLGMsZCkgICAocCktPmxwVnRibC0+Q3JlYXRlQ29tcG91bmRBZGRyZXNzKHAsYSxiLGMsZCkKIAogI3ByYWdtYSBwYWNrKDQpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmlsZS5oIGIvaW5jbHVkZS9maWxlLmgKaW5kZXggZWI1NDcwOC4uYjhmZGZmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9maWxlLmgKKysrIGIvaW5jbHVkZS9maWxlLmgKQEAgLTQ3LDYgKzQ3LDggQEAKICgoKGhhbmRsZSk9PTApID8gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpIDogXAogICgoaGFuZGxlKT09MSkgPyBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpIDogXAogICgoaGFuZGxlKT09MikgPyBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSkgOiBcCisgKChoYW5kbGUpPT0zKSA/IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKSA6IFwKKyAoKGhhbmRsZSk9PTQpID8gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpIDogXAogICgoaGFuZGxlKT49MHg0MDApID8gaGFuZGxlIDogXAogIChoYW5kbGUpLTUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2xvYmFsLmggYi9pbmNsdWRlL2dsb2JhbC5oCmluZGV4IDc3NWYzMWUuLjA2MDc0ZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ2xvYmFsLmgKKysrIGIvaW5jbHVkZS9nbG9iYWwuaApAQCAtMjIsNiArMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wxNiBpczMyQml0LCBCT09MMTYgaXNSZWFkT25seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE1EQVRBICpzaG1kYXRhKTsKIGV4dGVybiBCT09MMTYgR0xPQkFMX0ZyZWVCbG9jayggSEdMT0JBTDE2IGhhbmRsZSApOworZXh0ZXJuIEJPT0wxNiBHTE9CQUxfTW92ZUJsb2NrKCBIR0xPQkFMMTYgaGFuZGxlLCBjb25zdCB2b2lkICpwdHIsIERXT1JEIHNpemUgKTsKIGV4dGVybiBIR0xPQkFMMTYgR0xPQkFMX0FsbG9jKCBXT1JEIGZsYWdzLCBEV09SRCBzaXplLCBIR0xPQkFMMTYgaE93bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wxNiBpc0NvZGUsIEJPT0wxNiBpczMyQml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wxNiBpc1JlYWRPbmx5ICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hlYWRlci5oIGIvaW5jbHVkZS9oZWFkZXIuaAppbmRleCAyOThmNjdiLi4wYWI5NjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hlYWRlci5oCisrKyBiL2luY2x1ZGUvaGVhZGVyLmgKQEAgLTEwLDExICsxMCw5IEBACiAKIHR5cGVkZWYgc3RydWN0IAogewotICAgIFVJTlQzMiAgICBtYXNrOwogICAgIElOVDMyICAgICBjeHk7CiAgICAgSEJJVE1BUDMyIGhibTsKICAgICBMUFNUUiAgICAgcHN6VGV4dDsKLSAgICBJTlQzMiAgICAgY2NoVGV4dE1heDsKICAgICBJTlQzMiAgICAgZm10OwogICAgIExQQVJBTSAgICBsUGFyYW07CiAgICAgSU5UMzIgICAgIGlJbWFnZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaW1tLmggYi9pbmNsdWRlL2ltbS5oCmluZGV4IDViNDBhNmIuLjMxZWUzNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaW1tLmgKKysrIGIvaW5jbHVkZS9pbW0uaApAQCAtNSw4ICs1LDEwIEBACiAjaWZuZGVmIF9fV0lORV9JTU1fSAogI2RlZmluZSBfX1dJTkVfSU1NX0gKIAotdHlwZWRlZiBEV09SRCBISU1DMzI7Ci10eXBlZGVmIERXT1JEIEhJTUNDMzI7CisjaW5jbHVkZSAid2ludHlwZXMuaCIKKwordHlwZWRlZiBIQU5ETEUzMiBISU1DMzI7Cit0eXBlZGVmIEhBTkRMRTMyIEhJTUNDMzI7CiAKIHR5cGVkZWYgSEtMMzIgKkxQSEtMMzI7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvazMyb2JqLmggYi9pbmNsdWRlL2szMm9iai5oCmluZGV4IDBlMWRhZDMuLmIwZTg2MzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvazMyb2JqLmgKKysrIGIvaW5jbHVkZS9rMzJvYmouaApAQCAtNjIsOCArNjIsOCBAQAogZXh0ZXJuIEJPT0wzMiBLMzJPQkpfSXNWYWxpZCggSzMyT0JKICpwdHIsIEszMk9CSl9UWVBFIHR5cGUgKTsKIGV4dGVybiBCT09MMzIgSzMyT0JKX0FkZE5hbWUoIEszMk9CSiAqb2JqLCBMUENTVFIgbmFtZSApOwogZXh0ZXJuIEszMk9CSiAqSzMyT0JKX0NyZWF0ZSggSzMyT0JKX1RZUEUgdHlwZSwgRFdPUkQgc2l6ZSwgTFBDU1RSIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsIFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFMzIgKmhhbmRsZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcnZlcl9oYW5kbGUsIERXT1JEIGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLCBIQU5ETEUzMiAqaGFuZGxlICk7CiBleHRlcm4gSzMyT0JKICpLMzJPQkpfRmluZE5hbWUoIExQQ1NUUiBuYW1lICk7CiBleHRlcm4gSzMyT0JKICpLMzJPQkpfRmluZE5hbWVUeXBlKCBMUENTVFIgbmFtZSwgSzMyT0JKX1RZUEUgdHlwZSApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpc3R2aWV3LmggYi9pbmNsdWRlL2xpc3R2aWV3LmgKaW5kZXggMTA3OTVlNy4uODY5Yzc5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saXN0dmlldy5oCisrKyBiL2luY2x1ZGUvbGlzdHZpZXcuaApAQCAtMTYsMjMgKzE2LDI2IEBACiAgICAgTFBBUkFNIGxQYXJhbTsKICAgICBJTlQzMiAgaUluZGVudDsKIAotICAgIEhEU0EgICBoZHNhSXRlbTsKIH0gTElTVFZJRVdfSVRFTTsKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdMSVNUVklFV19JTkZPCiB7CiAgICAgQ09MT1JSRUYgICBjbHJCazsKKyAgICBDT0xPUlJFRiAgIGNsclRleHQ7CisgICAgQ09MT1JSRUYgICBjbHJUZXh0Qms7CiAgICAgSElNQUdFTElTVCBoaW1sTm9ybWFsOwogICAgIEhJTUFHRUxJU1QgaGltbFNtYWxsOwogICAgIEhJTUFHRUxJU1QgaGltbFN0YXRlOwogICAgIElOVDMyICAgICAgbkl0ZW1Db3VudDsKKyAgICBJTlQzMiAgICAgIG5Db2x1bW5Db3VudDsKICAgICBIV05EMzIgICAgIGh3bmRIZWFkZXI7CiAgICAgSEZPTlQzMiAgICBoRGVmYXVsdEZvbnQ7CiAgICAgSEZPTlQzMiAgICBoRm9udDsKICAgICBSRUNUMzIgICAgIHJjTGlzdDsgICAgICAgLyogImNsaWVudCIgYXJlYSBvZiB0aGUgbGlzdCAod2l0aG91dCBoZWFkZXIpICovCisgICAgQk9PTDMyICAgICBiRm9jdXM7CiAKLSAgICBIRFNBICAgICAgIGhkc2FJdGVtczsKKyAgICBIRFBBICAgICAgIGhkcGFJdGVtczsKIAogfSBMSVNUVklFV19JTkZPOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21pc2NlbXUuaCBiL2luY2x1ZGUvbWlzY2VtdS5oCmluZGV4IDljMmIyNmEuLmE5Y2I3NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWlzY2VtdS5oCisrKyBiL2luY2x1ZGUvbWlzY2VtdS5oCkBAIC0zMCw4ICszMCwxMiBAQAogZXh0ZXJuIFVJTlQzMiBET1NNRU1fTWFwTGluZWFyVG9Eb3MoTFBWT0lEKTsgLyogbGluZWFyIFdpbmUgdG8gRE9TICovCiAKIC8qIG1zZG9zL2ludGVycnVwdHMuYyAqLwotZXh0ZXJuIEZBUlBST0MxNiBJTlRfR2V0SGFuZGxlciggQllURSBpbnRudW0gKTsKLWV4dGVybiB2b2lkIElOVF9TZXRIYW5kbGVyKCBCWVRFIGludG51bSwgRkFSUFJPQzE2IGhhbmRsZXIgKTsKK2V4dGVybiBGQVJQUk9DMTYgSU5UX0dldFBNSGFuZGxlciggQllURSBpbnRudW0gKTsKK2V4dGVybiB2b2lkIElOVF9TZXRQTUhhbmRsZXIoIEJZVEUgaW50bnVtLCBGQVJQUk9DMTYgaGFuZGxlciApOworZXh0ZXJuIEZBUlBST0MxNiBJTlRfR2V0Uk1IYW5kbGVyKCBCWVRFIGludG51bSApOworZXh0ZXJuIHZvaWQgSU5UX1NldFJNSGFuZGxlciggQllURSBpbnRudW0sIEZBUlBST0MxNiBoYW5kbGVyICk7CitleHRlcm4gRkFSUFJPQzE2IElOVF9DdHhHZXRIYW5kbGVyKCBDT05URVhUICpjb250ZXh0LCBCWVRFIGludG51bSApOworZXh0ZXJuIHZvaWQgSU5UX0N0eFNldEhhbmRsZXIoIENPTlRFWFQgKmNvbnRleHQsIEJZVEUgaW50bnVtLCBGQVJQUk9DMTYgaGFuZGxlciApOwogZXh0ZXJuIGludCBJTlRfUmVhbE1vZGVJbnRlcnJ1cHQoIEJZVEUgaW50bnVtLCBQQ09OVEVYVCBjb250ZXh0ICk7CiAKIC8qIG1zZG9zL2lvcG9ydHMuYyAqLwpAQCAtMzksNiArNDMsOSBAQAogZXh0ZXJuIERXT1JEIElPX2lucG9ydCggaW50IHBvcnQsIGludCBjb3VudCApOwogZXh0ZXJuIHZvaWQgSU9fb3V0cG9ydCggaW50IHBvcnQsIGludCBjb3VudCwgRFdPUkQgdmFsdWUgKTsKIAorLyogbXNkb3MvaW50MTAuYyAqLworZXh0ZXJuIHZvaWQgV0lOQVBJIElOVF9JbnQxMEhhbmRsZXIoQ09OVEVYVCopOworCiAvKiBtc2Rvcy9pbnQxYS5jICovCiBleHRlcm4gRFdPUkQgSU5UMUFfR2V0VGlja3NTaW5jZU1pZG5pZ2h0KHZvaWQpOwogZXh0ZXJuIHZvaWQgV0lOQVBJIElOVF9JbnQxYUhhbmRsZXIoQ09OVEVYVCopOwpAQCAtNDYsOSArNTMsMTUgQEAKIC8qIG1zZG9zL2ludDIwLmMgKi8KIGV4dGVybiB2b2lkIFdJTkFQSSBJTlRfSW50MjBIYW5kbGVyKENPTlRFWFQqKTsKIAorLyogbXNkb3MvaW50MjUuYyAqLworZXh0ZXJuIHZvaWQgV0lOQVBJIElOVF9JbnQyNUhhbmRsZXIoQ09OVEVYVCopOworCiAvKiBtc2Rvcy9pbnQyZi5jICovCiBleHRlcm4gdm9pZCBXSU5BUEkgSU5UX0ludDJmSGFuZGxlcihDT05URVhUKik7CiAKKy8qIG1zZG9zL2ludDMxLmMgKi8KK2V4dGVybiB2b2lkIFdJTkFQSSBJTlRfSW50MzFIYW5kbGVyKENPTlRFWFQqKTsKKwogLyogbG9hZGVyL3NpZ25hbC5jICovCiBleHRlcm4gQk9PTDMyIFNJR05BTF9Jbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgU0lHTkFMX1NldEhhbmRsZXIoIGludCBzaWcsIHZvaWQgKCpmdW5jKSgpLCBpbnQgZmxhZ3MgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW1zeXN0ZW0uaCBiL2luY2x1ZGUvbW1zeXN0ZW0uaAppbmRleCAxZTEwMjE1Li5iZjM0ZjE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21tc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9tbXN5c3RlbS5oCkBAIC0yNzU5LDYgKzI3NTksNyBAQAogCUhNSURJMTYJCWhNaWRpOwogCURXT1JECQlkd0NhbGxiYWNrOwogCURXT1JECQlkd0luc3RhbmNlOworCVVJTlQxNgl3RGV2SUQ7CiB9IE1JRElPUEVOREVTQywgKkxQTUlESU9QRU5ERVNDOwogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21vZHVsZS5oIGIvaW5jbHVkZS9tb2R1bGUuaAppbmRleCBiYzBlMjVmLi45NmNhMjE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbW9kdWxlLmgKQEAgLTYzLDcgKzYzLDggQEAKICAgICBXT1JEICAgICAgc2l6ZTsgICAgICAvKiBTZWdtZW50IHNpemUgb24gZGlzayAqLwogICAgIFdPUkQgICAgICBmbGFnczsgICAgIC8qIFNlZ21lbnQgZmxhZ3MgKi8KICAgICBXT1JEICAgICAgbWluc2l6ZTsgICAvKiBNaW4uIHNpemUgb2Ygc2VnbWVudCBpbiBtZW1vcnkgKi8KLSAgICBIQU5ETEUxNiAgc2VsZWN0b3I7ICAvKiBTZWxlY3RvciBvZiBzZWdtZW50IGluIG1lbW9yeSAqLworICAgIEhBTkRMRTE2ICBoU2VnOyAgICAgIC8qIFNlbGVjdG9yIG9yIGhhbmRsZSAoc2VsZWN0b3IgLSAxKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mIHNlZ21lbnQgaW4gbWVtb3J5ICovCiB9IFNFR1RBQkxFRU5UUlk7CiAKIApAQCAtMTQzLDYgKzE0NCw3IEBACiBleHRlcm4gSE1PRFVMRTMyIE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggY29uc3QgT0ZTVFJVQ1QgKm9mcyApOwogZXh0ZXJuIEZBUlBST0MxNiBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIGNvbnN0IGNoYXIgKm5hbWUgKTsKIGV4dGVybiBGQVJQUk9DMTYgV0lOQVBJIFdJTjMyX0dldFByb2NBZGRyZXNzMTYoIEhNT0RVTEUzMiBobW9kdWxlLCBMUENTVFIgbmFtZSApOworZXh0ZXJuIFNFR1BUUiBXSU5BUEkgSGFzR1BIYW5kbGVyKCBTRUdQVFIgYWRkcmVzcyApOwogCiAvKiBsb2FkZXIvbmUvbW9kdWxlLmMgKi8KIGV4dGVybiBORV9NT0RVTEUgKk5FX0dldFB0ciggSE1PRFVMRTE2IGhNb2R1bGUgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXVsdGltZWRpYS5oIGIvaW5jbHVkZS9tdWx0aW1lZGlhLmgKaW5kZXggZDJkY2M5Yy4uODQzMjI4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tdWx0aW1lZGlhLmgKKysrIGIvaW5jbHVkZS9tdWx0aW1lZGlhLmgKQEAgLTI5LDcgKzI5LDExIEBACiAKICNpbmNsdWRlIDxzeXMvZXJybm8uaD4KIAorI2lmZGVmIEhBVkVfT1NTCisjZGVmaW5lIE1JRElfU0VRICIvZGV2L3NlcXVlbmNlciIKKyNlbHNlCiAjZGVmaW5lIE1JRElfREVWICIvZGV2L21pZGkiCisjZW5kaWYKIAogI2lmZGVmIFNPVU5EX1ZFUlNJT04KICNkZWZpbmUgSU9DVEwoYSxiLGMpCQlpb2N0bChhLGIsJmMpCkBAIC0zOCw0MCArNDIsNTMgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7CisjaWZuZGVmIEhBVkVfT1NTCiAJaW50CQl1bml4ZGV2OworI2VuZGlmCiAJaW50CQlzdGF0ZTsKIAlEV09SRAkJYnVmc2l6ZTsKLQlNSURJT1BFTkRFU0MJbWlkaURlc2M7CisJTFBNSURJT1BFTkRFU0MJbWlkaURlc2M7CiAJV09SRAkJd0ZsYWdzOwogCUxQTUlESUhEUiAJbHBRdWV1ZUhkcjsKIAlEV09SRAkJZHdUb3RhbFBsYXllZDsKKyNpZmRlZiBIQVZFX09TUworCXVuc2lnbmVkIGNoYXIJaW5jb21pbmdbM107CisJdW5zaWduZWQgY2hhcglpbmNQcmV2OworCWNoYXIJCWluY0xlbjsKKwlEV09SRAkJc3RhcnRUaW1lOworI2VuZGlmCiB9IExJTlVYX01JRElJTjsKIAogdHlwZWRlZiBzdHJ1Y3QgeworI2lmbmRlZiBIQVZFX09TUwogCWludAkJdW5peGRldjsKKyNlbmRpZgogCWludAkJc3RhdGU7CiAJRFdPUkQJCWJ1ZnNpemU7Ci0JTUlESU9QRU5ERVNDCW1pZGlEZXNjOworCUxQTUlESU9QRU5ERVNDCW1pZGlEZXNjOwogCVdPUkQJCXdGbGFnczsKIAlMUE1JRElIRFIgCWxwUXVldWVIZHI7CiAJRFdPUkQJCWR3VG90YWxQbGF5ZWQ7CisjaWZkZWYgSEFWRV9PU1MKKwl2b2lkKgkJbHBFeHRyYTsJIAkvKiBhY2NvcmRpbmcgdG8gcG9ydCB0eXBlIChNSURJLCBGTS4uLiksIGV4dHJhIGRhdGEgd2hlbiBuZWVkZWQgKi8KKyNlbmRpZgogfSBMSU5VWF9NSURJT1VUOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JaW50CW5Vc2VDb3VudDsgICAgICAgICAgLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gKi8KLQlCT09MMTYJZlNoYXJlYWJsZTsgICAgICAgICAvKiBUUlVFIGlmIGZpcnN0IG9wZW4gd2FzIHNoYXJlYWJsZSAqLwotCVdPUkQJd05vdGlmeURldmljZUlEOyAgICAvKiBNQ0kgZGV2aWNlIElEIHdpdGggYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwotCUhBTkRMRTE2IGhDYWxsYmFjazsgICAgICAgICAvKiBDYWxsYmFjayBoYW5kbGUgZm9yIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCi0JSE1NSU8xNgloRmlsZTsJICAgICAgICAgICAgLyogbW1pbyBmaWxlIGhhbmRsZSBvcGVuIGFzIEVsZW1lbnQJCSovCi0JRFdPUkQJZHdCZWdpbkRhdGE7Ci0JRFdPUkQJZHdUb3RhbExlbjsKLQlXT1JECXdGb3JtYXQ7Ci0JV09SRAluVHJhY2tzOwotCVdPUkQJblRlbXBvOworCWludAkJblVzZUNvdW50OyAgICAgICAgICAJLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gKi8KKwlCT09MMTYJCWZTaGFyZWFibGU7ICAgICAgICAgCS8qIFRSVUUgaWYgZmlyc3Qgb3BlbiB3YXMgc2hhcmVhYmxlICovCisJV09SRAkJd05vdGlmeURldmljZUlEOyAgICAJLyogTUNJIGRldmljZSBJRCB3aXRoIGEgcGVuZGluZyBub3RpZmljYXRpb24gKi8KKwlIQU5ETEUxNiAJaENhbGxiYWNrOyAgICAgICAgIAkvKiBDYWxsYmFjayBoYW5kbGUgZm9yIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCisJSE1NSU8xNgkJaEZpbGU7CSAgICAgICAgICAgIAkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudAkJKi8KKwlEV09SRAkJZHdCZWdpbkRhdGE7CisJRFdPUkQJCWR3VG90YWxMZW47CisJV09SRAkJd0Zvcm1hdDsKKwlXT1JECQluVHJhY2tzOworCVdPUkQJCW5UZW1wbzsKIAlNQ0lfT1BFTl9QQVJNUzE2IG9wZW5QYXJtczsKIC8qIAlNSURJSERSCU1pZGlIZHI7ICovCiAJSExPQ0FMMTYJaE1pZGlIZHI7Ci0JV09SRAlkd1N0YXR1czsKKwlXT1JECQlkd1N0YXR1czsKIH0gTElOVVhfTUNJTUlESTsKIAogLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdWx0aW1vbi5oIGIvaW5jbHVkZS9tdWx0aW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjI2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL211bHRpbW9uLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIE11bHRpbW9uaXRvciBBUElzCisgKgorICogQ29weXJpZ2h0IDE5OTggVHVyY2hhbm92IFNlcmdleQorICovCisKKyNpZm5kZWYgX19XSU5FX01VTFRJTU9OX0gKKyNkZWZpbmUgX19XSU5FX01VTFRJTU9OX0gKKworI2RlZmluZSBNT05JVE9SX0RFRkFVTFRUT05VTEwgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNT05JVE9SX0RFRkFVTFRUT1BSSU1BUlkgICAgMHgwMDAwMDAwMQorI2RlZmluZSBNT05JVE9SX0RFRkFVTFRUT05FQVJFU1QgICAgMHgwMDAwMDAwMgorCisjZGVmaW5lIEhNT05JVE9SIEhBTkRMRTMyIAorCitITU9OSVRPUiBXSU5BUEkgTW9uaXRvckZyb21Qb2ludChQT0lOVDMyIHB0LCBEV09SRCBkd0ZsYWdzKTsKKworSE1PTklUT1IgV0lOQVBJIE1vbml0b3JGcm9tUmVjdChMUFJFQ1QzMiBscHJjLCBEV09SRCBkd0ZsYWdzKTsKKworSE1PTklUT1IgV0lOQVBJIE1vbml0b3JGcm9tV2luZG93KEhXTkQzMiBod25kLCBEV09SRCBkd0ZsYWdzKTsKKworI2RlZmluZSBNT05JVE9SSU5GT0ZfUFJJTUFSWSAgICAgICAgMHgwMDAwMDAwMQorCisjaWZuZGVmIENDSERFVklDRU5BTUUKKyNkZWZpbmUgQ0NIREVWSUNFTkFNRSAzMgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRhZ01PTklUT1JJTkZPCit7CisgICAgRFdPUkQgICBjYlNpemU7CisgICAgUkVDVDMyICByY01vbml0b3I7CisgICAgUkVDVDMyICByY1dvcms7CisgICAgRFdPUkQgICBkd0ZsYWdzOworfSBNT05JVE9SSU5GTywgKkxQTU9OSVRPUklORk87CisKK3R5cGVkZWYgc3RydWN0IHRhZ01PTklUT1JJTkZPRVgzMkEKK3sKKyAgICBNT05JVE9SSU5GTyBkdW1teTsKKyAgICBDSEFSICAgICAgICBzekRldmljZVtDQ0hERVZJQ0VOQU1FXTsKK30gTU9OSVRPUklORk9FWDMyQSwgKkxQTU9OSVRPUklORk9FWDMyQTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTU9OSVRPUklORk9FWDMyVworeworICAgIE1PTklUT1JJTkZPIGR1bW15OworICAgIFdDSEFSICAgICAgIHN6RGV2aWNlW0NDSERFVklDRU5BTUVdOworfSBNT05JVE9SSU5GT0VYMzJXLCAqTFBNT05JVE9SSU5GT0VYMzJXOworCitERUNMX1dJTkVMSUJfVFlQRV9BVyAoTU9OSVRPSU5GT0VYKQorREVDTF9XSU5FTElCX1RZUEVfQVcgKExQTU9OSVRPUklORk9FWFcpCisKK0JPT0wzMiBXSU5BUEkgR2V0TW9uaXRvckluZm8zMkEoSE1PTklUT1IgaE1vbml0b3IsIExQTU9OSVRPUklORk8gbHBtaSk7CitCT09MMzIgV0lOQVBJIEdldE1vbml0b3JJbmZvMzJXKEhNT05JVE9SIGhNb25pdG9yLCBMUE1PTklUT1JJTkZPIGxwbWkpOworCisjZGVmaW5lIEdldE1vbml0b3JJbmZvIFdJTkVMSUJfTkFNRV9BVyhHZXRNb25pdG9ySW5mbykKKwordHlwZWRlZiBCT09MMzIgKENBTExCQUNLKiBNT05JVE9SRU5VTVBST0MpKEhNT05JVE9SLCBIREMzMiwgTFBSRUNUMzIsIExQQVJBTSk7CisKK0JPT0wzMiBXSU5BUEkgRW51bURpc3BsYXlNb25pdG9ycygKKyAgICBIREMzMiAgICAgICAgICAgICBoZGMsCisgICAgTFBSRUNUMzIgICAgICAgICBscHJjQ2xpcCwKKyAgICBNT05JVE9SRU5VTVBST0MgbHBmbkVudW0sCisgICAgTFBBUkFNICAgICAgICAgIGR3RGF0YSk7CisgICAgCisjZW5kaWYgX19XSU5FX01VTFRJTU9OX0gKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vbGVkbGcuaCBiL2luY2x1ZGUvb2xlZGxnLmgKaW5kZXggMWI5MzdmYy4uMWI3Y2U1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vbGVkbGcuaAorKysgYi9pbmNsdWRlL29sZWRsZy5oCkBAIC0xMCwzMiArMTAsMzIgQEAKICNkZWZpbmUgT0xFVUlfT0sgICAgICAxIC8qIE9LIGJ1dHRvbiBwcmVzc2VkICovIAogI2RlZmluZSBPTEVVSV9DQU5DRUwgIDIgLyogQ2FuY2VsIGJ1dHRvbiBwcmVzc2VkICovCiAKLXR5cGVkZWYgdm9pZCAqTFBPTEVVSUlOU0VSVE9CSkVDVEE7IC8qIEZJWE1FOiBzdHViICovCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlJTlNFUlRPQkpFQ1RXOyAvKiBGSVhNRTogc3R1YiAqLwordHlwZWRlZiB2b2lkICpMUE9MRVVJSU5TRVJUT0JKRUNUMzJBOyAvKiBGSVhNRTogc3R1YiAqLwordHlwZWRlZiB2b2lkICpMUE9MRVVJSU5TRVJUT0JKRUNUMzJXOyAvKiBGSVhNRTogc3R1YiAqLwogCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlQQVNURVNQRUNJQUxBOyAgLyogRklYTUU6IHN0dWIgKi8KLXR5cGVkZWYgdm9pZCAqTFBPTEVVSVBBU1RFU1BFQ0lBTFc7ICAvKiBGSVhNRTogc3R1YiAqLwordHlwZWRlZiB2b2lkICpMUE9MRVVJUEFTVEVTUEVDSUFMMzJBOyAgLyogRklYTUU6IHN0dWIgKi8KK3R5cGVkZWYgdm9pZCAqTFBPTEVVSVBBU1RFU1BFQ0lBTDMyVzsgIC8qIEZJWE1FOiBzdHViICovCiAKLXR5cGVkZWYgdm9pZCAqTFBPTEVVSUVESVRMSU5LU0E7ICAvKiBGSVhNRTogc3R1YiAqLwotdHlwZWRlZiB2b2lkICpMUE9MRVVJRURJVExJTktTVzsgIC8qIEZJWE1FOiBzdHViICovCit0eXBlZGVmIHZvaWQgKkxQT0xFVUlFRElUTElOS1MzMkE7ICAvKiBGSVhNRTogc3R1YiAqLwordHlwZWRlZiB2b2lkICpMUE9MRVVJRURJVExJTktTMzJXOyAgLyogRklYTUU6IHN0dWIgKi8KIAotdHlwZWRlZiB2b2lkICpMUE9MRVVJQ0hBTkdFSUNPTkE7IC8qIEZJWE1FOiBzdHViICovCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlDSEFOR0VJQ09OVzsgLyogRklYTUU6IHN0dWIgKi8KK3R5cGVkZWYgdm9pZCAqTFBPTEVVSUNIQU5HRUlDT04zMkE7IC8qIEZJWE1FOiBzdHViICovCit0eXBlZGVmIHZvaWQgKkxQT0xFVUlDSEFOR0VJQ09OMzJXOyAvKiBGSVhNRTogc3R1YiAqLwogCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlDT05WRVJUQTsgLyogRklYTUU6IHN0dWIgKi8KLXR5cGVkZWYgdm9pZCAqTFBPTEVVSUNPTlZFUlRXOyAvKiBGSVhNRTogc3R1YiAqLwordHlwZWRlZiB2b2lkICpMUE9MRVVJQ09OVkVSVDMyQTsgLyogRklYTUU6IHN0dWIgKi8KK3R5cGVkZWYgdm9pZCAqTFBPTEVVSUNPTlZFUlQzMlc7IC8qIEZJWE1FOiBzdHViICovCiAKLXR5cGVkZWYgdm9pZCAqTFBPTEVVSUJVU1lBOyAvKiBGSVhNRTogc3R1YiAqLwotdHlwZWRlZiB2b2lkICpMUE9MRVVJQlVTWVc7IC8qIEZJWE1FOiBzdHViICovCit0eXBlZGVmIHZvaWQgKkxQT0xFVUlCVVNZMzJBOyAvKiBGSVhNRTogc3R1YiAqLwordHlwZWRlZiB2b2lkICpMUE9MRVVJQlVTWTMyVzsgLyogRklYTUU6IHN0dWIgKi8KIAotdHlwZWRlZiB2b2lkICpMUE9MRVVJTElOS0NPTlRBSU5FUkE7IC8qIEZJWE1FOiBzdHViICovCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlMSU5LQ09OVEFJTkVSVzsgLyogRklYTUU6IHN0dWIgKi8KK3R5cGVkZWYgdm9pZCAqTFBPTEVVSUxJTktDT05UQUlORVIzMkE7IC8qIEZJWE1FOiBzdHViICovCit0eXBlZGVmIHZvaWQgKkxQT0xFVUlMSU5LQ09OVEFJTkVSMzJXOyAvKiBGSVhNRTogc3R1YiAqLwogCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlPQkpFQ1RQUk9QU0E7IC8qIEZJWE1FOiBzdHViICovCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlPQkpFQ1RQUk9QU1c7IC8qIEZJWE1FOiBzdHViICovCit0eXBlZGVmIHZvaWQgKkxQT0xFVUlPQkpFQ1RQUk9QUzMyQTsgLyogRklYTUU6IHN0dWIgKi8KK3R5cGVkZWYgdm9pZCAqTFBPTEVVSU9CSkVDVFBST1BTMzJXOyAvKiBGSVhNRTogc3R1YiAqLwogCi10eXBlZGVmIHZvaWQgKkxQT0xFVUlDSEFOR0VTT1VSQ0VBOyAvKiBGSVhNRTogc3R1YiAqLwotdHlwZWRlZiB2b2lkICpMUE9MRVVJQ0hBTkdFU09VUkNFVzsgLyogRklYTUU6IHN0dWIgKi8KK3R5cGVkZWYgdm9pZCAqTFBPTEVVSUNIQU5HRVNPVVJDRTMyQTsgLyogRklYTUU6IHN0dWIgKi8KK3R5cGVkZWYgdm9pZCAqTFBPTEVVSUNIQU5HRVNPVVJDRTMyVzsgLyogRklYTUU6IHN0dWIgKi8KIAogI2VuZGlmICAvKiBfX1dJTkVfT0xFRExHX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcHRpb25zLmggYi9pbmNsdWRlL29wdGlvbnMuaAppbmRleCAyYjlmY2ViLi44ZjA0N2FiIDEwMDY0NAotLS0gYS9pbmNsdWRlL29wdGlvbnMuaAorKysgYi9pbmNsdWRlL29wdGlvbnMuaApAQCAtMTAsNiArMTAsMTAgQEAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogCiAgIC8qIFN1cHBvcnRlZCBsYW5ndWFnZXMgKi8KKyAgLyogV2hlbiBhZGRpbmcgYSBuZXcgbGFuZ3VhZ2UgbG9vayBhdCBvbGUvb2xlMm5scy5jIAorICAgKiBmb3IgdGhlIExBTkdfWHggbmFtZSB0byBjaG9vc2UsIGFuZCB1bmNvbW1lbnQgdGhlcmUKKyAgICogdGhlIHByb3BlciBjYXNlIGxpbmUKKyAgICovCiB0eXBlZGVmIGVudW0KIHsKICAgICBMQU5HX0VuLCAgLyogRW5nbGlzaCAqLwpAQCAtMTksMTQgKzIzLDE0IEBACiAgICAgTEFOR19GciwgIC8qIEZyZW5jaCAqLwogICAgIExBTkdfRmksICAvKiBGaW5uaXNoICovCiAgICAgTEFOR19EYSwgIC8qIERhbmlzaCAqLwotICAgIExBTkdfQ3osICAvKiBDemVjaCAqLworICAgIExBTkdfQ3MsICAvKiBDemVjaCAqLwogICAgIExBTkdfRW8sICAvKiBFc3BlcmFudG8gKi8KICAgICBMQU5HX0l0LCAgLyogSXRhbGlhbiAqLwogICAgIExBTkdfS28sICAvKiBLb3JlYW4gKi8KICAgICBMQU5HX0h1LCAgLyogSHVuZ2FyaWFuICovCiAgICAgTEFOR19QbCwgIC8qIFBvbGlzaCAqLwotICAgIExBTkdfUG8sICAvKiBQb3J0dWd1ZXNlICovCi0gICAgTEFOR19TdywgIC8qIFN3ZWRpc2ggKi8KKyAgICBMQU5HX1B0LCAgLyogUG9ydHVndWVzZSAqLworICAgIExBTkdfU3YsICAvKiBTd2VkaXNoICovCiAgICAgTEFOR19DYSAgIC8qIENhdGFsYW4gKi8KIH0gV0lORV9MQU5HVUFHRTsKIApAQCAtNjQsNiArNjgsNyBAQAogICAgIFdJTkVfTEFOR1VBR0UgbGFuZ3VhZ2U7IC8qIEN1cnJlbnQgbGFuZ3VhZ2UgKi8KICAgICBpbnQgICAgbWFuYWdlZDsJICAgIC8qIE1hbmFnZWQgd2luZG93cyAqLwogICAgIGludCAgICBwZXJmZWN0R3JhcGhpY3M7IC8qIEZhdm9yIGNvcnJlY3RuZXNzIG92ZXIgc3BlZWQgZm9yIGdyYXBoaWNzICovCisgICAgY2hhciAqIGNvbmZpZ0ZpbGVOYW1lOyAgLyogQ29tbWFuZCBsaW5lIGNvbmZpZyBmaWxlICovCiB9OwogCiBleHRlcm4gc3RydWN0IG9wdGlvbnMgT3B0aW9uczsKQEAgLTcxLDYgKzc2LDcgQEAKIC8qIFByb2ZpbGUgZnVuY3Rpb25zICovCiAKIGV4dGVybiBpbnQgUFJPRklMRV9Mb2FkV2luZUluaSh2b2lkKTsKK2V4dGVybiB2b2lkIFBST0ZJTEVfVXNhZ2VXaW5lSW5pKHZvaWQpOwogZXh0ZXJuIGludCBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoIGNvbnN0IGNoYXIgKnNlY3Rpb24sIGNvbnN0IGNoYXIgKmtleV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZiwgY2hhciAqYnVmZmVyLCBpbnQgbGVuICk7CiBleHRlcm4gaW50IFBST0ZJTEVfR2V0V2luZUluaUludCggY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqa2V5X25hbWUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BzYXBpLmggYi9pbmNsdWRlL3BzYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0ZmY5NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHNhcGkuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogICAgICBwc2FwaS5oICAgICAgICAtICAgICAgIERlY2xhcmF0aW9ucyBmb3IgUFNBUEkKKyAqLworCisjaWZuZGVmIF9fV0lORV9QU0FQSV9ICisjZGVmaW5lIF9fV0lORV9QU0FQSV9ICisKK3R5cGVkZWYgc3RydWN0IF9NT0RVTEVJTkZPMzIgeworICBMUFZPSUQgbHBCYXNlT2ZEbGw7CisgIERXT1JEIFNpemVPZkltYWdlOworICBMUFZPSUQgRW50cnlQb2ludDsKK30gTU9EVUxFSU5GTzMyLCAqTFBNT0RVTEVJTkZPMzI7CisKK3R5cGVkZWYgc3RydWN0IF9QUk9DRVNTX01FTU9SWV9DT1VOVEVSUzMyIHsgIAorICBEV09SRCBjYjsgICAgCisgIERXT1JEIFBhZ2VGYXVsdENvdW50OworICBEV09SRCBQZWFrV29ya2luZ1NldFNpemU7CisgIERXT1JEIFdvcmtpbmdTZXRTaXplOworICBEV09SRCBRdW90YVBlYWtQYWdlZFBvb2xVc2FnZTsKKyAgRFdPUkQgUXVvdGFQYWdlZFBvb2xVc2FnZTsKKyAgRFdPUkQgUXVvdGFQZWFrTm9uUGFnZWRQb29sVXNhZ2U7ICAKKyAgRFdPUkQgUXVvdGFOb25QYWdlZFBvb2xVc2FnZTsKKyAgRFdPUkQgUGFnZWZpbGVVc2FnZTsgICAgCisgIERXT1JEIFBlYWtQYWdlZmlsZVVzYWdlOworfSBQUk9DRVNTX01FTU9SWV9DT1VOVEVSUzMyOwordHlwZWRlZiBQUk9DRVNTX01FTU9SWV9DT1VOVEVSUzMyICpQUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMzMjsKKwordHlwZWRlZiBzdHJ1Y3QgX1BTQVBJX1dTX1dBVENIX0lORk9STUFUSU9OMzIgeworICBMUFZPSUQgRmF1bHRpbmdQYzsKKyAgTFBWT0lEIEZhdWx0aW5nVmE7Cit9IFBTQVBJX1dTX1dBVENIX0lORk9STUFUSU9OMzIsICpQUFNBUElfV1NfV0FUQ0hfSU5GT1JNQVRJT04zMjsKKworI2VuZGlmICAvKiBfX1dJTkVfUFNBUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zZXJ2ZXIuaCBiL2luY2x1ZGUvc2VydmVyLmgKaW5kZXggMzBlMDlhYy4uZTkzY2VhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zZXJ2ZXIuaAorKysgYi9pbmNsdWRlL3NlcnZlci5oCkBAIC0xNTIsOSArMTUyLDEwNSBAQAogI2RlZmluZSBTRUxFQ1RfQUxFUlRBQkxFIDQKICNkZWZpbmUgU0VMRUNUX1RJTUVPVVQgICA4CiAKKworLyogQ3JlYXRlIGFuIGV2ZW50ICovCitzdHJ1Y3QgY3JlYXRlX2V2ZW50X3JlcXVlc3QKK3sKKyAgICBpbnQgICAgICAgICAgbWFudWFsX3Jlc2V0OyAgLyogbWFudWFsIHJlc2V0IGV2ZW50ICovCisgICAgaW50ICAgICAgICAgIGluaXRpYWxfc3RhdGU7IC8qIGluaXRpYWwgc3RhdGUgb2YgdGhlIGV2ZW50ICovCisgICAgaW50ICAgICAgICAgIGluaGVyaXQ7ICAgICAgIC8qIGluaGVyaXQgZmxhZyAqLworICAgIC8qIGNoYXIgbmFtZVtdICovCit9Oworc3RydWN0IGNyZWF0ZV9ldmVudF9yZXBseQoreworICAgIGludCAgICAgICAgICBoYW5kbGU7ICAgICAgICAvKiBoYW5kbGUgdG8gdGhlIGV2ZW50ICovCit9OworCisvKiBFdmVudCBvcGVyYXRpb24gKi8KK3N0cnVjdCBldmVudF9vcF9yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgICBoYW5kbGU7ICAgICAgIC8qIGhhbmRsZSB0byBldmVudCAqLworICAgIGludCAgICAgICAgICAgb3A7ICAgICAgICAgICAvKiBldmVudCBvcGVyYXRpb24gKHNlZSBiZWxvdykgKi8KK307CitlbnVtIGV2ZW50X29wIHsgUFVMU0VfRVZFTlQsIFNFVF9FVkVOVCwgUkVTRVRfRVZFTlQgfTsKKworCisvKiBDcmVhdGUgYSBtdXRleCAqLworc3RydWN0IGNyZWF0ZV9tdXRleF9yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIG93bmVkOyAgICAgICAgIC8qIGluaXRpYWxseSBvd25lZD8gKi8KKyAgICBpbnQgICAgICAgICAgaW5oZXJpdDsgICAgICAgLyogaW5oZXJpdCBmbGFnICovCisgICAgLyogY2hhciBuYW1lW10gKi8KK307CitzdHJ1Y3QgY3JlYXRlX211dGV4X3JlcGx5Cit7CisgICAgaW50ICAgICAgICAgIGhhbmRsZTsgICAgICAgIC8qIGhhbmRsZSB0byB0aGUgbXV0ZXggKi8KK307CisKKworLyogUmVsZWFzZSBhIG11dGV4ICovCitzdHJ1Y3QgcmVsZWFzZV9tdXRleF9yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIGhhbmRsZTsgICAgICAgIC8qIGhhbmRsZSB0byB0aGUgbXV0ZXggKi8KK307CisKKworLyogQ3JlYXRlIGEgc2VtYXBob3JlICovCitzdHJ1Y3QgY3JlYXRlX3NlbWFwaG9yZV9yZXF1ZXN0Cit7CisgICAgdW5zaWduZWQgaW50IGluaXRpYWw7ICAgICAgIC8qIGluaXRpYWwgY291bnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgbWF4OyAgICAgICAgICAgLyogbWF4aW11bSBjb3VudCAqLworICAgIGludCAgICAgICAgICBpbmhlcml0OyAgICAgICAvKiBpbmhlcml0IGZsYWcgKi8KKyAgICAvKiBjaGFyIG5hbWVbXSAqLworfTsKK3N0cnVjdCBjcmVhdGVfc2VtYXBob3JlX3JlcGx5Cit7CisgICAgaW50ICAgICAgICAgIGhhbmRsZTsgICAgICAgIC8qIGhhbmRsZSB0byB0aGUgc2VtYXBob3JlICovCit9OworCisKKy8qIFJlbGVhc2UgYSBzZW1hcGhvcmUgKi8KK3N0cnVjdCByZWxlYXNlX3NlbWFwaG9yZV9yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIGhhbmRsZTsgICAgICAgIC8qIGhhbmRsZSB0byB0aGUgc2VtYXBob3JlICovCisgICAgdW5zaWduZWQgaW50IGNvdW50OyAgICAgICAgIC8qIGNvdW50IHRvIGFkZCB0byBzZW1hcGhvcmUgKi8KK307CitzdHJ1Y3QgcmVsZWFzZV9zZW1hcGhvcmVfcmVwbHkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcHJldl9jb3VudDsgICAgLyogcHJldmlvdXMgc2VtYXBob3JlIGNvdW50ICovCit9OworCisvKiBPcGVuIGEgbmFtZWQgb2JqZWN0IChldmVudCwgbXV0ZXgsIHNlbWFwaG9yZSkgKi8KK3N0cnVjdCBvcGVuX25hbWVkX29ial9yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogb2JqZWN0IHR5cGUgKHNlZSBiZWxvdykgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWNjZXNzOyAgICAgICAvKiB3YW50ZWQgYWNjZXNzIHJpZ2h0cyAqLworICAgIGludCAgICAgICAgICBpbmhlcml0OyAgICAgIC8qIGluaGVyaXQgZmxhZyAqLworICAgIC8qIGNoYXIgbmFtZVtdICovCit9OworZW51bSBvcGVuX25hbWVkX29iaiB7IE9QRU5fRVZFTlQsIE9QRU5fTVVURVgsIE9QRU5fU0VNQVBIT1JFIH07CisKK3N0cnVjdCBvcGVuX25hbWVkX29ial9yZXBseQoreworICAgIGludCAgICAgICAgICBoYW5kbGU7ICAgICAgICAvKiBoYW5kbGUgdG8gdGhlIG9iamVjdCAqLworfTsKKworCiAvKiBjbGllbnQtc2lkZSBmdW5jdGlvbnMgKi8KIAogI2lmbmRlZiBfX1dJTkVfU0VSVkVSX18KKworLyogY2xpZW50IGNvbW11bmljYXRpb24gZnVuY3Rpb25zICovCitlbnVtIHJlcXVlc3Q7CisjZGVmaW5lIENIRUNLX0xFTihsZW4sd2FudGVkKSBcCisgIGlmICgobGVuKSA9PSAod2FudGVkKSkgOyBcCisgIGVsc2UgQ0xJRU5UX1Byb3RvY29sRXJyb3IoIF9fRlVOQ1RJT05fXyAiOiBsZW4gJWQgIT0gJWRcbiIsIChsZW4pLCAod2FudGVkKSApOworZXh0ZXJuIHZvaWQgQ0xJRU5UX1Byb3RvY29sRXJyb3IoIGNvbnN0IGNoYXIgKmVyciwgLi4uICk7CitleHRlcm4gdm9pZCBDTElFTlRfU2VuZFJlcXVlc3QoIGVudW0gcmVxdWVzdCByZXEsIGludCBwYXNzX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgLi4uIC8qIGFyZ18xLCBsZW5fMSwgZXRjLiAqLyApOworZXh0ZXJuIHVuc2lnbmVkIGludCBDTElFTlRfV2FpdFJlcGx5KCBpbnQgKmxlbiwgaW50ICpwYXNzZWRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCAuLi4gLyogYXJnXzEsIGxlbl8xLCBldGMuICovICk7CisKIHN0cnVjdCBfVEhEQjsKIGV4dGVybiBpbnQgQ0xJRU5UX05ld1RocmVhZCggc3RydWN0IF9USERCICp0aGRiLCBpbnQgKnRoYW5kbGUsIGludCAqcGhhbmRsZSApOwogZXh0ZXJuIGludCBDTElFTlRfSW5pdFRocmVhZCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VydmVyL29iamVjdC5oIGIvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmgKaW5kZXggNTI2ODA2MS4uYTk2OGRkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmgKKysrIGIvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmgKQEAgLTEyLDYgKzEyLDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKICNpbmNsdWRlICJzZXJ2ZXIvcmVxdWVzdC5oIgogCiAvKiBrZXJuZWwgb2JqZWN0cyAqLwpAQCAtMzcsMTIgKzM4LDE2IEBACiAgICAgc3RydWN0IG9iamVjdF9uYW1lICAgICAgICpuYW1lOwogfTsKIAotZXh0ZXJuIHZvaWQgaW5pdF9vYmplY3QoIHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgKm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lICk7CitleHRlcm4gdm9pZCAqbWVtX2FsbG9jKCBzaXplX3Qgc2l6ZSApOyAgLyogbWFsbG9jIHdyYXBwZXIgKi8KK2V4dGVybiBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfbmFtZWRfb2JqZWN0KCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyAqb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplICk7CitleHRlcm4gaW50IGluaXRfb2JqZWN0KCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzICpvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lICk7CiAvKiBncmFiL3JlbGVhc2Vfb2JqZWN0IGNhbiB0YWtlIGFueSBwb2ludGVyLCBidXQgeW91IGJldHRlciBtYWtlIHN1cmUgKi8KIC8qIHRoYXQgdGhlIHRoaW5nIHBvaW50ZWQgdG8gc3RhcnRzIHdpdGggYSBzdHJ1Y3Qgb2JqZWN0Li4uICovCiBleHRlcm4gc3RydWN0IG9iamVjdCAqZ3JhYl9vYmplY3QoIHZvaWQgKm9iaiApOwogZXh0ZXJuIHZvaWQgcmVsZWFzZV9vYmplY3QoIHZvaWQgKm9iaiApOworZXh0ZXJuIHN0cnVjdCBvYmplY3QgKmZpbmRfb2JqZWN0KCBjb25zdCBjaGFyICpuYW1lICk7CiAKIC8qIHJlcXVlc3QgaGFuZGxlcnMgKi8KIApAQCAtOTcsNiArMTAyLDMxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhY2Nlc3MsIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzICpvcHMgKTsKIGV4dGVybiBpbnQgZHVwbGljYXRlX2hhbmRsZSggc3RydWN0IHByb2Nlc3MgKnNyYywgaW50IHNyY19oYW5kbGUsIHN0cnVjdCBwcm9jZXNzICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfaGFuZGxlLCB1bnNpZ25lZCBpbnQgYWNjZXNzLCBpbnQgaW5oZXJpdCwgaW50IG9wdGlvbnMgKTsKK2V4dGVybiBpbnQgb3Blbl9vYmplY3QoIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzICpvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWNjZXNzLCBpbnQgaW5oZXJpdCApOworCisvKiBldmVudCBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIHN0cnVjdCBvYmplY3QgKmNyZWF0ZV9ldmVudCggY29uc3QgY2hhciAqbmFtZSwgaW50IG1hbnVhbF9yZXNldCwgaW50IGluaXRpYWxfc3RhdGUgKTsKK2V4dGVybiBpbnQgb3Blbl9ldmVudCggdW5zaWduZWQgaW50IGFjY2VzcywgaW50IGluaGVyaXQsIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2V4dGVybiBpbnQgcHVsc2VfZXZlbnQoIGludCBoYW5kbGUgKTsKK2V4dGVybiBpbnQgc2V0X2V2ZW50KCBpbnQgaGFuZGxlICk7CitleHRlcm4gaW50IHJlc2V0X2V2ZW50KCBpbnQgaGFuZGxlICk7CisKKworLyogbXV0ZXggZnVuY3Rpb25zICovCisKK2V4dGVybiBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfbXV0ZXgoIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvd25lZCApOworZXh0ZXJuIGludCBvcGVuX211dGV4KCB1bnNpZ25lZCBpbnQgYWNjZXNzLCBpbnQgaW5oZXJpdCwgY29uc3QgY2hhciAqbmFtZSApOworZXh0ZXJuIGludCByZWxlYXNlX211dGV4KCBpbnQgaGFuZGxlICk7CitleHRlcm4gdm9pZCBhYmFuZG9uX211dGV4ZXMoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOworCisKKy8qIHNlbWFwaG9yZSBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIHN0cnVjdCBvYmplY3QgKmNyZWF0ZV9zZW1hcGhvcmUoIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBpbml0aWFsLCB1bnNpZ25lZCBpbnQgbWF4ICk7CitleHRlcm4gaW50IG9wZW5fc2VtYXBob3JlKCB1bnNpZ25lZCBpbnQgYWNjZXNzLCBpbnQgaW5oZXJpdCwgY29uc3QgY2hhciAqbmFtZSApOworZXh0ZXJuIGludCByZWxlYXNlX3NlbWFwaG9yZSggaW50IGhhbmRsZSwgdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgKnByZXZfY291bnQgKTsKIAogZXh0ZXJuIGludCBkZWJ1Z19sZXZlbDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zZXJ2ZXIvcmVxdWVzdC5oIGIvaW5jbHVkZS9zZXJ2ZXIvcmVxdWVzdC5oCmluZGV4IGI4ODJlYmMuLjJkYzgwYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2VydmVyL3JlcXVlc3QuaAorKysgYi9pbmNsdWRlL3NlcnZlci9yZXF1ZXN0LmgKQEAgLTE1LDYgKzE1LDEzIEBACiAgICAgUkVRX0RVUF9IQU5ETEUsCiAgICAgUkVRX09QRU5fUFJPQ0VTUywKICAgICBSRVFfU0VMRUNULAorICAgIFJFUV9DUkVBVEVfRVZFTlQsCisgICAgUkVRX0VWRU5UX09QLAorICAgIFJFUV9DUkVBVEVfTVVURVgsCisgICAgUkVRX1JFTEVBU0VfTVVURVgsCisgICAgUkVRX0NSRUFURV9TRU1BUEhPUkUsCisgICAgUkVRX1JFTEVBU0VfU0VNQVBIT1JFLAorICAgIFJFUV9PUEVOX05BTUVEX09CSiwKICAgICBSRVFfTkJfUkVRVUVTVFMKIH07CiAKQEAgLTMzLDYgKzQwLDEzIEBACiBERUNMX0hBTkRMRVIoZHVwX2hhbmRsZSk7CiBERUNMX0hBTkRMRVIob3Blbl9wcm9jZXNzKTsKIERFQ0xfSEFORExFUihzZWxlY3QpOworREVDTF9IQU5ETEVSKGNyZWF0ZV9ldmVudCk7CitERUNMX0hBTkRMRVIoZXZlbnRfb3ApOworREVDTF9IQU5ETEVSKGNyZWF0ZV9tdXRleCk7CitERUNMX0hBTkRMRVIocmVsZWFzZV9tdXRleCk7CitERUNMX0hBTkRMRVIoY3JlYXRlX3NlbWFwaG9yZSk7CitERUNMX0hBTkRMRVIocmVsZWFzZV9zZW1hcGhvcmUpOworREVDTF9IQU5ETEVSKG9wZW5fbmFtZWRfb2JqKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoYW5kbGVyIHsKICAgICB2b2lkICAgICAgICgqaGFuZGxlcikoKTsKQEAgLTQ4LDYgKzYyLDEzIEBACiAgICAgeyAodm9pZCgqKSgpKXJlcV9kdXBfaGFuZGxlLCBzaXplb2Yoc3RydWN0IGR1cF9oYW5kbGVfcmVxdWVzdCkgfSwKICAgICB7ICh2b2lkKCopKCkpcmVxX29wZW5fcHJvY2Vzcywgc2l6ZW9mKHN0cnVjdCBvcGVuX3Byb2Nlc3NfcmVxdWVzdCkgfSwKICAgICB7ICh2b2lkKCopKCkpcmVxX3NlbGVjdCwgc2l6ZW9mKHN0cnVjdCBzZWxlY3RfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpcmVxX2NyZWF0ZV9ldmVudCwgc2l6ZW9mKHN0cnVjdCBjcmVhdGVfZXZlbnRfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpcmVxX2V2ZW50X29wLCBzaXplb2Yoc3RydWN0IGV2ZW50X29wX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKXJlcV9jcmVhdGVfbXV0ZXgsIHNpemVvZihzdHJ1Y3QgY3JlYXRlX211dGV4X3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKXJlcV9yZWxlYXNlX211dGV4LCBzaXplb2Yoc3RydWN0IHJlbGVhc2VfbXV0ZXhfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpcmVxX2NyZWF0ZV9zZW1hcGhvcmUsIHNpemVvZihzdHJ1Y3QgY3JlYXRlX3NlbWFwaG9yZV9yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlyZXFfcmVsZWFzZV9zZW1hcGhvcmUsIHNpemVvZihzdHJ1Y3QgcmVsZWFzZV9zZW1hcGhvcmVfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpcmVxX29wZW5fbmFtZWRfb2JqLCBzaXplb2Yoc3RydWN0IG9wZW5fbmFtZWRfb2JqX3JlcXVlc3QpIH0sCiB9OwogI2VuZGlmICAvKiBXQU5UX1JFUVVFU1RfSEFORExFUlMgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zZXJ2ZXIvdGhyZWFkLmggYi9pbmNsdWRlL3NlcnZlci90aHJlYWQuaAppbmRleCA3ZjdkZjhkLi5jOWMzNzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NlcnZlci90aHJlYWQuaAorKysgYi9pbmNsdWRlL3NlcnZlci90aHJlYWQuaApAQCAtMTcsNiArMTcsNyBAQAogCiBzdHJ1Y3QgcHJvY2VzczsKIHN0cnVjdCB0aHJlYWRfd2FpdDsKK3N0cnVjdCBtdXRleDsKIAogZW51bSBydW5fc3RhdGUgeyBTVEFSVElORywgUlVOTklORywgVEVSTUlOQVRFRCB9OwogCkBAIC0yOCw2ICsyOSw3IEBACiAgICAgc3RydWN0IHRocmVhZCAgICAgICpwcm9jX25leHQ7IC8qIHBlci1wcm9jZXNzIHRocmVhZCBsaXN0ICovCiAgICAgc3RydWN0IHRocmVhZCAgICAgICpwcm9jX3ByZXY7CiAgICAgc3RydWN0IHByb2Nlc3MgICAgICpwcm9jZXNzOworICAgIHN0cnVjdCBtdXRleCAgICAgICAqbXV0ZXg7ICAgICAvKiBsaXN0IG9mIGN1cnJlbnRseSBvd25lZCBtdXRleGVzICovCiAgICAgc3RydWN0IHRocmVhZF93YWl0ICp3YWl0OyAgICAgIC8qIGN1cnJlbnQgd2FpdCBjb25kaXRpb24gaWYgc2xlZXBpbmcgKi8KICAgICBpbnQgICAgICAgICAgICAgICAgIGVycm9yOyAgICAgLyogY3VycmVudCBlcnJvciBjb2RlICovCiAgICAgZW51bSBydW5fc3RhdGUgICAgICBzdGF0ZTsgICAgIC8qIHJ1bm5pbmcgc3RhdGUgKi8KQEAgLTU3LDYgKzU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGludCB0aW1lb3V0ICk7CiBleHRlcm4gdm9pZCB3YWtlX3VwKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCBtYXggKTsKIAorI2RlZmluZSBHRVRfRVJST1IoKSAgICAgKGN1cnJlbnQtPmVycm9yKQogI2RlZmluZSBTRVRfRVJST1IoZXJyKSAgKGN1cnJlbnQtPmVycm9yID0gKGVycikpCiAjZGVmaW5lIENMRUFSX0VSUk9SKCkgICAoY3VycmVudC0+ZXJyb3IgPSAwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NoZWxsLmggYi9pbmNsdWRlL3NoZWxsLmgKaW5kZXggMzQ3NWNhNC4uZjRmZDY3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaGVsbC5oCisrKyBiL2luY2x1ZGUvc2hlbGwuaApAQCAtMjI0LDcgKzIyNCw3IEBACiAqICBzdHJpbmcgYW5kIHBhdGggZnVuY3Rpb25zCiAqLwogTFBTVFIgV0lOQVBJIFBhdGhBZGRCYWNrc2xhc2goTFBTVFIgcGF0aCk7CQotTFBTVFIgV0lOQVBJIFBhdGhDb21iaW5lKExQU1RSIHRhcmdldCxMUFNUUiB4MSxMUFNUUiB4Mik7CitMUFNUUiBXSU5BUEkgUGF0aENvbWJpbmUoTFBTVFIgc3pEZXN0LCBMUENTVFIgbHBzekRpciwgTFBDU1RSIGxwc3pGaWxlKTsKIExQU1RSIFdJTkFQSSBQYXRoUmVtb3ZlQmxhbmtzKExQU1RSIHN0cik7CiBMUFNUUiBXSU5BUEkgUGF0aEZpbmRGaWxlbmFtZShMUFNUUiBmbik7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaGxvYmouaCBiL2luY2x1ZGUvc2hsb2JqLmgKaW5kZXggZmQ0NTk5ZC4uMDUwZjU0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaGxvYmouaAorKysgYi9pbmNsdWRlL3NobG9iai5oCkBAIC0zMCwxNSArMzAsNDAgQEAKIHR5cGVkZWYgc3RydWN0IHRhZ1NIRUxMRVhUSU5JVAkqTFBTSEVMTEVYVElOSVQsSVNoZWxsRXh0SW5pdDsKIHR5cGVkZWYgc3RydWN0IHRhZ0VOVU1JRExJU1QJKkxQRU5VTUlETElTVCwJSUVudW1JRExpc3Q7CiB0eXBlZGVmIHN0cnVjdCB0YWdTSEVMTEZPTERFUgkqTFBTSEVMTEZPTERFUiwJSVNoZWxsRm9sZGVyOwotdHlwZWRlZiBzdHJ1Y3QgdGFnU0hFTExWSUVXCQkqTFBTSEVMTFZJRVcsCUlTaGVsbFZpZXc7Cit0eXBlZGVmIHN0cnVjdCB0YWdTSEVMTFZJRVcJKkxQU0hFTExWSUVXLAlJU2hlbGxWaWV3OwogdHlwZWRlZiBzdHJ1Y3QgdGFnU0hFTExCUk9XU0VSCSpMUFNIRUxMQlJPV1NFUixJU2hlbGxCcm93c2VyOwotCi10eXBlZGVmIHN0cnVjdCBJRGF0YU9iamVjdAkJSURhdGFPYmplY3QsCSpMUERBVEFPQkpFQ1Q7Ci0KK3R5cGVkZWYgc3RydWN0IHRhZ0RBVEFPQkpFQ1QJKkxQREFUQU9CSkVDVCwJSURhdGFPYmplY3Q7Cit0eXBlZGVmIHN0cnVjdCB0YWdTSEVMTElDT04JKkxQU0hFTExJQ09OLAlJU2hlbGxJY29uOwordHlwZWRlZiBzdHJ1Y3QgdGFnRE9DS0lOR1dJTkRPV0ZSQU1FCSpMUERPQ0tJTkdXSU5ET1dGUkFNRSwJSURvY2tpbmdXaW5kb3dGcmFtZTsKK3R5cGVkZWYgc3RydWN0IHRhZ1NFUlZJQ0VQUk9WSURFUgkqTFBTRVJWSUNFUFJPVklERVIsCUlTZXJ2aWNlUHJvdmlkZXI7Cit0eXBlZGVmIHN0cnVjdCB0YWdDT01NRExHQlJPV1NFUgkqTFBDT01NRExHQlJPV1NFUiwJSUNvbW1EbGdCcm93c2VyOwordHlwZWRlZiBzdHJ1Y3QgdGFnRU5VTUZPUk1BVEVUQwkqTFBFTlVNRk9STUFURVRDLAlJRW51bUZPUk1BVEVUQzsKKyAKK3R5cGVkZWYgc3RydWN0IElBZHZpc2VTaW5rCQlJQWR2aXNlU2luaywJKkxQSUFEVklTRVNJTks7Cit0eXBlZGVmIHN0cnVjdCBJRW51bVNUQVREQVRBCQlJRW51bVNUQVREQVRBLAkqTFBFTlVNU1RBVERBVEE7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hFTEwgSUQKICovCi0vKiBzaGVsbDMyIGNsYXNzaWRzICovCisvKiBzdHJhbmdlIE9iamVjdHMgKi8KK0RFRklORV9TSExHVUlEKElJRF9JRW51bVVua25vd24sCTB4MDAwMDAxMDBMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JRW51bVN0cmluZywJCTB4MDAwMDAxMDFMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JRW51bU1vbmlrZXIsCTB4MDAwMDAxMDJMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JRW51bUZPUk1BVEVUQywJMHgwMDAwMDEwM0wsIDAsIDApOworREVGSU5FX1NITEdVSUQoSUlEX0lFbnVtT0xFVkVSQiwJMHgwMDAwMDEwNEwsIDAsIDApOworREVGSU5FX1NITEdVSUQoSUlEX0lFbnVtU1RBVERBVEEsCTB4MDAwMDAxMDVMLCAwLCAwKTsKKworREVGSU5FX1NITEdVSUQoSUlEX0lQZXJzaXN0U3RyZWFtLAkweDAwMDAwMTA5TCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSVBlcnNpc3RTdG9yYWdlLAkweDAwMDAwMTBBTCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSVBlcnNpc3RGaWxlLAkweDAwMDAwMTBCTCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSVBlcnNpc3QsCQkweDAwMDAwMTBDTCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSVZpZXdPYmplY3QsCQkweDAwMDAwMTBETCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSURhdGFPYmplY3QsCQkweDAwMDAwMTBFTCwgMCwgMCk7CisKK0RFRklORV9HVUlEIChJSURfSVNlcnZpY2VQcm92aWRlciwJMHg2RDUxNDBDMUwsIDB4NzQzNiwgMHgxMUNFLCAweDgwLCAweDM0LCAweDAwLCAweEFBLCAweDAwLCAweDYwLCAweDA5LCAweEZBKTsKK0RFRklORV9HVUlEIChJSURfSURvY2tpbmdXaW5kb3csCTB4MDEyZGQ5MjBMLCAweDdCMjYsIDB4MTFEMCwgMHg4QywgMHhBOSwgMHgwMCwgMHhBMCwgMHhDOSwgMHgyRCwgMHhCRiwgMHhFOCk7CitERUZJTkVfR1VJRCAoSUlEX0lEb2NraW5nV2luZG93U2l0ZSwJMHgyQTM0MkZDMkwsIDB4N0IyNiwgMHgxMUQwLCAweDhDLCAweEE5LCAweDAwLCAweEEwLCAweEM5LCAweDJELCAweEJGLCAweEU4KTsKK0RFRklORV9HVUlEIChJSURfSURvY2tpbmdXaW5kb3dGcmFtZSwJMHg0N0QyNjU3QUwsIDB4N0IyNywgMHgxMUQwLCAweDhDLCAweEE5LCAweDAwLCAweEEwLCAweEM5LCAweDJELCAweEJGLCAweEU4KTsKKwogREVGSU5FX1NITEdVSUQoQ0xTSURfU2hlbGxEZXNrdG9wLCAgICAgIDB4MDAwMjE0MDBMLCAwLCAwKTsKIERFRklORV9TSExHVUlEKENMU0lEX1NoZWxsTGluaywgICAgICAgICAweDAwMDIxNDAxTCwgMCwgMCk7CiAvKiBzaGVsbDMyIGZvcm1hdGlkcyAqLwpAQCAtNTEsNiArNzYsNyBAQAogIC8qIHNoZWxsMzJpbnRlcmZhY2UgaWRzICovCiBERUZJTkVfU0hMR1VJRChJSURfSU5ld1Nob3J0Y3V0SG9va0EsICAgMHgwMDAyMTRFMUwsIDAsIDApOwogREVGSU5FX1NITEdVSUQoSUlEX0lTaGVsbEJyb3dzZXIsICAgICAgIDB4MDAwMjE0RTJMLCAwLCAwKTsKKyNkZWZpbmUgU0lEX1NTaGVsbEJyb3dzZXIgSUlEX0lTaGVsbEJyb3dzZXIKIERFRklORV9TSExHVUlEKElJRF9JU2hlbGxWaWV3LCAgICAgICAgICAweDAwMDIxNEUzTCwgMCwgMCk7CiBERUZJTkVfU0hMR1VJRChJSURfSUNvbnRleHRNZW51LCAgICAgICAgMHgwMDAyMTRFNEwsIDAsIDApOwogREVGSU5FX1NITEdVSUQoSUlEX0lTaGVsbEljb24sICAgICAgICAgIDB4MDAwMjE0RTVMLCAwLCAwKTsKQEAgLTk1LDYgKzEyMSwxMiBAQAogICovCiAjZGVmaW5lIFRISVMgTFBDT05URVhUTUVOVSB0aGlzCiAKKy8qIGRlZmF1bHQgbWVudSBpdGVtcyovCisjZGVmaW5lIElETV9FWFBMT1JFICAwCisjZGVmaW5lIElETV9PUEVOICAgICAxCisjZGVmaW5lIElETV9SRU5BTUUgICAyCisjZGVmaW5lIElETV9MQVNUICAgICBJRE1fUkVOQU1FCisKIC8qIFF1ZXJ5Q29udGV4dE1lbnUgdUZsYWdzICovCiAjZGVmaW5lIENNRl9OT1JNQUwgICAgICAgICAgICAgIDB4MDAwMDAwMDAKICNkZWZpbmUgQ01GX0RFRkFVTFRPTkxZICAgICAgICAgMHgwMDAwMDAwMQpAQCAtMjA1LDYgKzIzNywxMDAgQEAKIAogI3VuZGVmIFRISVMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURhdGEgc3RydWN0dXJlcworICovCit0eXBlZGVmIHN0cnVjdAorewlEV09SRCB0ZFNpemU7CisJV09SRCB0ZERyaXZlck5hbWVPZmZzZXQ7CisJV09SRCB0ZERldmljZU5hbWVPZmZzZXQ7CisJV09SRCB0ZFBvcnROYW1lT2Zmc2V0OworCVdPUkQgdGRFeHREZXZtb2RlT2Zmc2V0OworCUJZVEUgdGREYXRhWyAxIF07Cit9ICAgRFZUQVJHRVRERVZJQ0UzMjsKKwordHlwZWRlZiBXT1JEIENMSVBGT1JNQVQzMiwgKkxQQ0xJUEZPUk1BVDMyOworCit0eXBlZGVmIHN0cnVjdCAKK3sJRFdPUkQgdHltZWQ7CisJdW5pb24gCisJeyBIQklUTUFQMzIgaEJpdG1hcDsKKwkgIC8qSE1FVEFGSUxFUElDVDMyIGhNZXRhRmlsZVBpY3Q7Ki8KKwkgIC8qSEVOSE1FVEFGSUxFMzIgaEVuaE1ldGFGaWxlOyovCisJICBIR0xPQkFMMzIgaEdsb2JhbDsKKwkgIExQT0xFU1RSMzIgbHBzekZpbGVOYW1lOworCSAgSVN0cmVhbTMyICpwc3RtOworCSAgSVN0b3JhZ2UzMiAqcHN0ZzsKKyAgICAgICAgfSB1OworCUlVbmtub3duICpwVW5rRm9yUmVsZWFzZTsKK30gU1RHTUVESVVNMzI7ICAgCisgCit0eXBlZGVmIHN0cnVjdCAKK3sJQ0xJUEZPUk1BVDMyIGNmRm9ybWF0OworCURWVEFSR0VUREVWSUNFMzIgKnB0ZDsKKwlEV09SRCBkd0FzcGVjdDsKKwlMT05HIGxpbmRleDsKKwlEV09SRCB0eW1lZDsKK30gRk9STUFURVRDMzIsICpMUEZPUk1BVEVUQzMyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElFbnVtRk9STUFURVRDIGludGVyZmFjZQorICovCisjZGVmaW5lIFRISVMgTFBFTlVNRk9STUFURVRDIHRoaXMKKwordHlwZWRlZiBzdHJ1Y3QgSUVudW1GT1JNQVRFVENfVlRhYmxlIAoreyAgICAvKiBJVW5rbm93biBtZXRob2RzICovCisJU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworCS8qIElFbnVtRk9STUFURVRDIG1ldGhvZHMgKi8KKwlTVERNRVRIT0QgKE5leHQpKFRISVNfIFVMT05HIGNlbHQsIEZPUk1BVEVUQzMyICpyZ2VsdCwgVUxPTkcgKnBjZWx0RmV0aGVkKSBQVVJFOworCVNURE1FVEhPRCAoU2tpcCkoVEhJU18gVUxPTkcgY2VsdCkgUFVSRTsKKwlTVERNRVRIT0QgKFJlc2V0KShUSElTKSBQVVJFOworCVNURE1FVEhPRCAoQ2xvbmUpKFRISVNfIElFbnVtRk9STUFURVRDICoqIHBwZW51bSkgUFVSRTsKK30gSUVudW1GT1JNQVRFVENfVlRhYmxlLCpMUEVOVU1GT1JNQVRFVENfVlRBQkxFOworCitzdHJ1Y3QgdGFnRU5VTUZPUk1BVEVUQworewlMUEVOVU1GT1JNQVRFVENfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCSByZWY7CisgICAgICAgIFVJTlQzMglwb3NGbXQ7CisgICAgICAgIFVJTlQzMgljb3VudEZtdDsKKyAgICAgICAgTFBGT1JNQVRFVEMzMiBwRm10OworfTsKKworI3VuZGVmIFRISVMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGF0YU9iamVjdCBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBUSElTIExQREFUQU9CSkVDVCB0aGlzCisKK3R5cGVkZWYgc3RydWN0IElEYXRhT2JqZWN0X1ZUYWJsZSAKK3sJLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOworCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworCisJU1RETUVUSE9EIChHZXREYXRhICkoVEhJU18gTFBGT1JNQVRFVEMzMiBwZm9ybWF0ZXRjSW4sIFNUR01FRElVTTMyICpwbWVkaXVtKSBQVVJFOworCVNURE1FVEhPRCAoR2V0RGF0YUhlcmUpKFRISVNfIExQRk9STUFURVRDMzIgcGZvcm1hdGV0YywgU1RHTUVESVVNMzIgKnBtZWRpdW0pIFBVUkU7CisgICAgICAgIFNURE1FVEhPRCAoUXVlcnlHZXREYXRhKShUSElTXyBMUEZPUk1BVEVUQzMyIHBmb3JtYXRldGMpIFBVUkU7CisgICAgICAgIFNURE1FVEhPRCAoR2V0Q2Fub25pY2FsRm9ybWF0RXRjKShUSElTXyBMUEZPUk1BVEVUQzMyIHBmb3JtYXRlY3RJbiwgTFBGT1JNQVRFVEMzMiBwZm9ybWF0ZXRjT3V0KSBQVVJFOworICAgICAgICBTVERNRVRIT0QgKFNldERhdGEpKFRISVNfIExQRk9STUFURVRDMzIgcGZvcm1hdGV0YywgU1RHTUVESVVNMzIgKnBtZWRpdW0sIEJPT0wzMiBmUmVsZWFzZSkgUFVSRTsKKyAgICAgICAgU1RETUVUSE9EIChFbnVtRm9ybWF0RXRjKShUSElTXyBEV09SRCBkd0RpcmVjdGlvbiwgSUVudW1GT1JNQVRFVEMgKipwcGVudW1Gb3JtYXRFdGMpIFBVUkU7CisgICAgICAgIFNURE1FVEhPRCAoREFkdmlzZSApKFRISVNfIExQRk9STUFURVRDMzIgKnBmb3JtYXRldGMsIERXT1JEIGFkdmYsIElBZHZpc2VTaW5rICpwQWR2U2luaywgRFdPUkQgKnBkd0Nvbm5lY3Rpb24pIFBVUkU7CisgICAgICAgIFNURE1FVEhPRCAoRFVuYWR2aXNlKShUSElTXyBEV09SRCBkd0Nvbm5lY3Rpb24pIFBVUkU7CisgICAgICAgIFNURE1FVEhPRCAoRW51bURBZHZpc2UpKFRISVNfIElFbnVtU1RBVERBVEEgKipwcGVudW1BZHZpc2UpIFBVUkU7Cit9IElEYXRhT2JqZWN0X1ZUYWJsZSwqTFBEQVRBT0JKRUNUX1ZUQUJMRTsKKworc3RydWN0IHRhZ0RBVEFPQkpFQ1QKK3sJTFBEQVRBT0JKRUNUX1ZUQUJMRQlscHZ0Ymw7CisJRFdPUkQJCQkgcmVmOworfTsKKworI3VuZGVmIFRISVMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElTaGVsbEV4dEluaXQgaW50ZXJmYWNlCiAgKi8KICNkZWZpbmUgVEhJUyBMUFNIRUxMRVhUSU5JVCB0aGlzCkBAIC00MDIsMTkgKzUyOCw1MCBAQAogfTsKIAogZXh0ZXJuIExQU0hFTExGT0xERVIgcGRlc2t0b3Bmb2xkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hlbGxmb2xkZXIgQVBJCisqLworRFdPUkQgV0lOQVBJIFNIR2V0RGVza3RvcEZvbGRlcihMUFNIRUxMRk9MREVSICopOwogI3VuZGVmIFRISVMKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJU2hlbGxCcm93c2VyIGludGVyZmFjZQogKi8KICNkZWZpbmUgVEhJUyBMUFNIRUxMQlJPV1NFUiB0aGlzCisvKiB0YXJnZXRzIGZvciBHZXRXaW5kb3cvU2VuZENvbnRyb2xNc2cgKi8KKyNkZWZpbmUgRkNXX1NUQVRVUwkJMHgwMDAxCisjZGVmaW5lIEZDV19UT09MQkFSCQkweDAwMDIKKyNkZWZpbmUgRkNXX1RSRUUJCTB4MDAwMworI2RlZmluZSBGQ1dfSU5URVJORVRCQVIJCTB4MDAwNgorI2RlZmluZSBGQ1dfUFJPR1JFU1MJCTB4MDAwOAogCi0jZGVmaW5lIEZDV19TVEFUVVMgICAgICAweDAwMDEKLSNkZWZpbmUgRkNXX1RPT0xCQVIgICAgIDB4MDAwMgotI2RlZmluZSBGQ1dfVFJFRSAgICAgICAgMHgwMDAzCi0jZGVmaW5lIEZDV19JTlRFUk5FVEJBUiAweDAwMDYKLSNkZWZpbmUgRkNXX1BST0dSRVNTICAgIDB4MDAwOAorLyogd0ZsYWdzIGZvciBCcm93c2VPYmplY3QqLworI2RlZmluZSBTQlNQX0RFRkJST1dTRVIJCTB4MDAwMAorI2RlZmluZSBTQlNQX1NBTUVCUk9XU0VSCTB4MDAwMQorI2RlZmluZSBTQlNQX05FV0JST1dTRVIJCTB4MDAwMgogCisjZGVmaW5lIFNCU1BfREVGTU9ERQkJMHgwMDAwCisjZGVmaW5lIFNCU1BfT1BFTk1PREUJCTB4MDAxMAorI2RlZmluZSBTQlNQX0VYUExPUkVNT0RFCTB4MDAyMAorCisjZGVmaW5lIFNCU1BfQUJTT0xVVEUJCTB4MDAwMAorI2RlZmluZSBTQlNQX1JFTEFUSVZFCQkweDEwMDAKKyNkZWZpbmUgU0JTUF9QQVJFTlQJCTB4MjAwMAorI2RlZmluZSBTQlNQX05BVklHQVRFQkFDSwkweDQwMDAKKyNkZWZpbmUgU0JTUF9OQVZJR0FURUZPUldBUkQJMHg4MDAwCisKKyNkZWZpbmUgU0JTUF9BTExPV19BVVRPTkFWSUdBVEUJCTB4MTAwMDAKKworI2RlZmluZSBTQlNQX0lOSVRJQVRFREJZSExJTktGUkFNRQkweDgwMDAwMDAwCisjZGVmaW5lIFNCU1BfUkVESVJFQ1QJCQkweDQwMDAwMDAwCisjZGVmaW5lIFNCU1BfV1JJVEVOT0hJU1RPUlkJCTB4MDgwMDAwMDAKKworLyogdUZsYWdlIGZvciBTZXRUb29sYmFySXRlbXMgKi8KKyNkZWZpbmUgRkNUX01FUkdFICAgICAgIDB4MDAwMQorI2RlZmluZSBGQ1RfQ09ORklHQUJMRSAgMHgwMDAyCisjZGVmaW5lIEZDVF9BRERUT0VORCAgICAweDAwMDQKKyAKIHR5cGVkZWYgc3RydWN0IElTaGVsbEJyb3dzZXJfVlRhYmxlIAogeyAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKioKICAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOwpAQCAtNTM2LDcgKzY5Myw3IEBACiAgICAgU1RETUVUSE9EKFNhdmVWaWV3U3RhdGUpKFRISVMpIFBVUkU7CiAgICAgU1RETUVUSE9EKFNlbGVjdEl0ZW0pKFRISVNfIExQQ0lURU1JRExJU1QgcGlkbEl0ZW0sIFVJTlQzMiB1RmxhZ3MpIFBVUkU7CiAgICAgU1RETUVUSE9EKEdldEl0ZW1PYmplY3QpKFRISVNfIFVJTlQzMiB1SXRlbSwgUkVGSUlEIHJpaWQsTFBWT0lEICpwcHYpIFBVUkU7Ci19IElTaGVsbFZpZXdfVlRhYmxlLCpMUFNIRUxMVklFV19WVEFCTEU7OworfSBJU2hlbGxWaWV3X1ZUYWJsZSwqTFBTSEVMTFZJRVdfVlRBQkxFOwogCiBzdHJ1Y3QgdGFnU0hFTExWSUVXIAogeyBMUFNIRUxMVklFV19WVEFCTEUgbHB2dGJsOwpAQCAtNTQ0LDYgKzcwMSw3IEBACiAgIExQSVRFTUlETElTVCAgICAgICBtcGlkbDsKICAgTFBTSEVMTEZPTERFUiAgICAgIHBTRlBhcmVudDsKICAgTFBTSEVMTEJST1dTRVIgICAgIHBTaGVsbEJyb3dzZXI7CisgIExQQ09NTURMR0JST1dTRVIgICBwQ29tbURsZ0Jyb3dzZXI7CiAgIEhXTkQzMiAgICAgICAgICAgICBoV25kOwogICBIV05EMzIgICAgICAgICAgICAgaFduZExpc3Q7CiAgIEZPTERFUlNFVFRJTkdTICAgICBGb2xkZXJTZXR0aW5nczsKQEAgLTU1MywxMCArNzExLDM3IEBACiB9OwogCiB0eXBlZGVmIEdVSUQgU0hFTExWSUVXSUQ7Ci0jZGVmaW5lIFNWX0NMQVNTX05BTUUgICAoIlNoZWxsVmlld0NsYXNzIikKKyNkZWZpbmUgU1ZfQ0xBU1NfTkFNRSAgICgiU0hFTExETExfRGVmVmlldyIpCiAKICN1bmRlZiBUSElTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUNvbW1EbGdCcm93c2VyIGludGVyZmFjZQorICovCisjZGVmaW5lIFRISVMgTFBDT01NRExHQlJPV1NFUiB0aGlzCiAKKy8qIGZvciBPblN0YXRlQ2hhbmdlKi8KKyNkZWZpbmUgQ0RCT1NDX1NFVEZPQ1VTICAgICAweDAwMDAwMDAwCisjZGVmaW5lIENEQk9TQ19LSUxMRk9DVVMgICAgMHgwMDAwMDAwMQorI2RlZmluZSBDREJPU0NfU0VMQ0hBTkdFICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0RCT1NDX1JFTkFNRSAgICAgICAweDAwMDAwMDAzCisKK3R5cGVkZWYgc3RydWN0IElDb21tRGxnQnJvd3Nlcl9WVGFibGUKK3sgICAvKiBJVW5rbm93biBtZXRob2RzICovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpICBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgKFRISVMpIFBVUkU7CisKKyAgICAvKiBJQ29tbURsZ0Jyb3dzZXIgbWV0aG9kcyAqLworICAgIFNURE1FVEhPRChPbkRlZmF1bHRDb21tYW5kKSAoVEhJU18gIExQU0hFTExWSUVXIHBwc2h2KSBQVVJFOworICAgIFNURE1FVEhPRChPblN0YXRlQ2hhbmdlKSAoVEhJU18gTFBTSEVMTFZJRVcgcHBzaHYsIFVMT05HIHVDaGFuZ2UpIFBVUkU7CisgICAgU1RETUVUSE9EKEluY2x1ZGVPYmplY3QpIChUSElTXyBMUFNIRUxMVklFVyBwcHNodiwgTFBDSVRFTUlETElTVCBwaWRsKSBQVVJFOworfSBJQ29tbURsZ0Jyb3dzZXJfVlRhYmxlLCpMUENPTU1ETEdCUk9XU0VSX1ZUQUJMRTsKKworc3RydWN0IHRhZ0NPTU1ETEdCUk9XU0VSCit7IExQQ09NTURMR0JST1dTRVJfVlRBQkxFIGxwdnRibDsKKyAgRFdPUkQJCQkgICAgIHJlZjsKK307CisjdW5kZWYgVEhJUwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElTaGVsbExpbmsgaW50ZXJmYWNlCiAgKi8KQEAgLTY2Niw3ICs4NTEsNyBAQAogICovCiAKICNkZWZpbmUgVEhJUyBMUFNIRUxMSUNPTiB0aGlzCi10eXBlZGVmIHN0cnVjdCBJU2hlbGxJY29uIElTaGVsbEljb24sKkxQU0hFTExJQ09OOworCiB0eXBlZGVmIHN0cnVjdCBJU2hlbGxJY29uX1ZUYWJsZQogeyAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOwpAQCAtNjc3LDI0ICs4NjIsNzMgQEAKICAgU1RETUVUSE9EKEdldEljb25PZikoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsLCBVSU5UMzIgZmxhZ3MsIExQSU5UMzIgbHBJY29uSW5kZXgpIFBVUkU7CiB9IElTaGVsbEljb25fVlRhYmxlLCpMUFNIRUxMSUNPTl9WVEFCTEU7CiAKLXN0cnVjdCBJU2hlbGxJY29uCitzdHJ1Y3QgdGFnU0hFTExJQ09OCiB7IExQU0hFTExJQ09OX1ZUQUJMRSBscHZ0Ymw7CiAgIERXT1JEIHJlZjsKIH07CiAjdW5kZWYgVEhJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEb2NraW5nV2luZG93RnJhbWUgaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgVEhJUyBMUERPQ0tJTkdXSU5ET1dGUkFNRSB0aGlzCiAKKyNkZWZpbmUgRFdGUkZfTk9STUFMCQkweDAwMDAgIC8qIGZlbW92ZSB0b29sYmFyIGZsYWdzKi8KKyNkZWZpbmUgRFdGUkZfREVMRVRFQ09ORklHREFUQQkweDAwMDEKKyNkZWZpbmUgRFdGQUZfSElEREVOCQkweDAwMDEgICAvKiBhZGQgdG9sYmFyKi8KIAordHlwZWRlZiBzdHJ1Y3QgSURvY2tpbmdXaW5kb3dGcmFtZV9WVGFibGUKK3sgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworICAgIC8qKiogSU9sZVdpbmRvdyBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoR2V0V2luZG93KSAoVEhJU18gSFdORDMyICogbHBod25kKSBQVVJFOworICAgIFNURE1FVEhPRChDb250ZXh0U2Vuc2l0aXZlSGVscCkgKFRISVNfIEJPT0wzMiBmRW50ZXJNb2RlKSBQVVJFOworCisgICAgLyoqKiBJRG9ja2luZ1dpbmRvd0ZyYW1lIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChBZGRUb29sYmFyKSAoVEhJU18gSVVua25vd24qIHB1bmtTcmMsIExQQ1dTVFIgcHdzekl0ZW0sIERXT1JEIGR3QWRkRmxhZ3MpIFBVUkU7CisgICAgU1RETUVUSE9EKFJlbW92ZVRvb2xiYXIpIChUSElTXyBJVW5rbm93biogcHVua1NyYywgRFdPUkQgZHdSZW1vdmVGbGFncykgUFVSRTsKKyAgICBTVERNRVRIT0QoRmluZFRvb2xiYXIpIChUSElTXyBMUENXU1RSIHB3c3pJdGVtLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmopIFBVUkU7Cit9IElEb2NraW5nV2luZG93RnJhbWVfVlRhYmxlLCAqTFBET0NLSU5HV0lORE9XRlJBTUVfVlRBQkxFOworCitzdHJ1Y3QgdGFnRE9DS0lOR1dJTkRPV0ZSQU1FCit7IExQRE9DS0lOR1dJTkRPV0ZSQU1FX1ZUQUJMRSBscHZ0Ymw7CisgIERXT1JEIHJlZjsKK307CisKKyN1bmRlZiBUSElTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVNlcnZpY2VQcm92aWRlciBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBUSElTIExQU0VSVklDRVBST1ZJREVSIHRoaXMKKwordHlwZWRlZiBzdHJ1Y3QgSVNlcnZpY2VQcm92aWRlcl9WVGFibGUKK3sJLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOworCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworCVNURE1FVEhPRChRdWVyeVNlcnZpY2UpKFRISVNfIFJFRkdVSUQgZ3VpZFNlcnZpY2UsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKK30gSVNlcnZpY2VQcm92aWRlcl9WVGFibGUsICpMUFNFUlZJQ0VQUk9WSURFUl9WVEFCTEU7CisKK3N0cnVjdCB0YWdTRVJWSUNFUFJPVklERVIKK3sJTFBTRVJWSUNFUFJPVklERVJfVlRBQkxFIGxwdnRibDsKKwlEV09SRCByZWY7Cit9OyAgICAgICAgICAgCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ2xhc3MgY29uc3RydWN0b3JzCiAgKi8KICNpZmRlZiBfX1dJTkVfXwotZXh0ZXJuIExQQ0xBU1NGQUNUT1JZIElDbGFzc0ZhY3RvcnlfQ29uc3RydWN0b3IoKTsKLWV4dGVybiBMUENPTlRFWFRNRU5VIElDb250ZXh0TWVudV9Db25zdHJ1Y3RvcihMUFNIRUxMRk9MREVSLCBMUENJVEVNSURMSVNUICosIFVJTlQzMik7Ci1leHRlcm4gTFBTSEVMTEZPTERFUiBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoTFBTSEVMTEZPTERFUixMUElURU1JRExJU1QpOwotZXh0ZXJuIExQU0hFTExWSUVXIElTaGVsbFZpZXdfQ29uc3RydWN0b3IoKTsKLWV4dGVybiBMUFNIRUxMTElOSyBJU2hlbGxMaW5rX0NvbnN0cnVjdG9yKCk7Ci1leHRlcm4gTFBFTlVNSURMSVNUIElFbnVtSURMaXN0X0NvbnN0cnVjdG9yKExQQ1NUUixEV09SRCxIUkVTVUxUKik7Ci1leHRlcm4gTFBFWFRSQUNUSUNPTiBJRXh0cmFjdEljb25fQ29uc3RydWN0b3IoTFBJVEVNSURMSVNUKTsKK2V4dGVybiBMUERBVEFPQkpFQ1QJSURhdGFPYmplY3RfQ29uc3RydWN0b3IoKTsKK2V4dGVybiBMUEVOVU1GT1JNQVRFVEMJSUVudW1GT1JNQVRFVENfQ29uc3RydWN0b3IoVUlOVDMyLCBjb25zdCBGT1JNQVRFVEMzMiBbXSk7CisKK2V4dGVybiBMUENMQVNTRkFDVE9SWQlJQ2xhc3NGYWN0b3J5X0NvbnN0cnVjdG9yKCk7CitleHRlcm4gTFBDT05URVhUTUVOVQlJQ29udGV4dE1lbnVfQ29uc3RydWN0b3IoTFBTSEVMTEZPTERFUiwgTFBDSVRFTUlETElTVCAqLCBVSU5UMzIpOworZXh0ZXJuIExQU0hFTExGT0xERVIJSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yKExQU0hFTExGT0xERVIsTFBJVEVNSURMSVNUKTsKK2V4dGVybiBMUFNIRUxMVklFVwlJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKCk7CitleHRlcm4gTFBTSEVMTExJTksJSVNoZWxsTGlua19Db25zdHJ1Y3RvcigpOworZXh0ZXJuIExQRU5VTUlETElTVAlJRW51bUlETGlzdF9Db25zdHJ1Y3RvcihMUENTVFIsRFdPUkQpOworZXh0ZXJuIExQRVhUUkFDVElDT04JSUV4dHJhY3RJY29uX0NvbnN0cnVjdG9yKExQSVRFTUlETElTVCk7CiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBTaGVsbCBFeGVjdXRlIEFQSQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeXNtZXRyaWNzLmggYi9pbmNsdWRlL3N5c21ldHJpY3MuaAppbmRleCAxMDFmMzE3Li5iZmI2Y2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c21ldHJpY3MuaAorKysgYi9pbmNsdWRlL3N5c21ldHJpY3MuaApAQCAtMTI5LDYgKzEyOSwxMyBAQAogI2RlZmluZSBTWVNNRVRSSUNTX01JREVBU1RFTkFCTEVEICAgICAgIHN5c01ldHJpY3NbU01fTUlERUFTVEVOQUJMRURdICAgICAgIC8qIDc0ICovCiAjZGVmaW5lIFNZU01FVFJJQ1NfTU9VU0VXSEVFTFBSRVNFTlQgICAgc3lzTWV0cmljc1tTTV9NT1VTRVdIRUVMUFJFU0VOVF0gICAgLyogNzUgKi8KIAorI2RlZmluZSBTWVNNRVRSSUNTX0NYVklSVFVBTFNDUkVFTglzeXNNZXRyaWNzW1NNX0NYVklSVFVBTFNDUkVFTl0JICAgIC8qIDc3ICovCisjZGVmaW5lIFNZU01FVFJJQ1NfQ1lWSVJUVUFMU0NSRUVOCXN5c01ldHJpY3NbU01fQ1lWSVJUVUFMU0NSRUVOXQkgICAgLyogNzcgKi8KKyNkZWZpbmUgU1lTTUVUUklDU19ZVklSVFVBTFNDUkVFTglzeXNNZXRyaWNzW1NNX1lWSVJUVUFMU0NSRUVOXQkgICAgLyogNzggKi8KKyNkZWZpbmUgU1lTTUVUUklDU19YVklSVFVBTFNDUkVFTglzeXNNZXRyaWNzW1NNX1hWSVJUVUFMU0NSRUVOXQkgICAgLyogNzkgKi8KKyNkZWZpbmUgU1lTTUVUUklDU19DTU9OSVRPUlMJCXN5c01ldHJpY3NbU01fQ01PTklUT1JTXQkgICAgLyogODEgKi8KKyNkZWZpbmUgU1lTTUVUUklDU19TQU1FRElTUExBWUZPUk1BVAlzeXNNZXRyaWNzW1NNX1NBTUVESVNQTEFZRk9STUFUXSAgICAvKiA4MiAqLworCiBleHRlcm4gdm9pZCBTWVNNRVRSSUNTX0luaXQodm9pZCk7ICAvKiBzeXNtZXRyaWNzLmMgKi8KIGV4dGVybiBzaG9ydCBzeXNNZXRyaWNzW1NNX0NNRVRSSUNTKzFdOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RocmVhZC5oIGIvaW5jbHVkZS90aHJlYWQuaAppbmRleCAyMmU2MmJmLi42MGM0MjIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RocmVhZC5oCisrKyBiL2luY2x1ZGUvdGhyZWFkLmgKQEAgLTcsMTIgKzcsMjkgQEAKICNpZm5kZWYgX19XSU5FX1RIUkVBRF9ICiAjZGVmaW5lIF9fV0lORV9USFJFQURfSAogCisjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiazMyb2JqLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIiAgLyogZm9yIFNFVF9GUyAqLwogCisjaWZkZWYgbGludXgKKyNkZWZpbmUgSEFWRV9DTE9ORV9TWVNDQUxMCisjZW5kaWYKKworLyogVGhpcyBpcyB3aGF0IHdlIHdpbGwgdXNlIG9uICpCU0QsIG9uY2UgdGhyZWFkcyB1c2luZyByZm9yaygpIGdldAorICogaW1wbGVtZW50ZWQ6CisgKgorICogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKKyAqICNkZWZpbmUgSEFWRV9SRk9SSworICogI2VuZGlmCisgKi8KKworI2lmIChkZWZpbmVkKEhBVkVfQ0xPTkVfU1lTQ0FMTCkgfHwgZGVmaW5lZChIQVZFX1JGT1JLKSkgJiYgIWRlZmluZWQoTk9fUkVFTlRSQU5UX0xJQkMpCisjZGVmaW5lIFVTRV9USFJFQURTCisjZW5kaWYKKwogc3RydWN0IF9QREIzMjsKIAogLyogVGhyZWFkIGV4Y2VwdGlvbiBibG9jayAqLwpAQCAtMTMzLDYgKzE1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydF9hZGRyLCBMUFZPSUQgcGFyYW0gKTsKIGV4dGVybiBUSERCICpUSFJFQURfQ3VycmVudCh2b2lkKTsKIGV4dGVybiBCT09MMzIgVEhSRUFEX0lzV2luMTYoIFRIREIgKnRoZGIgKTsKK2V4dGVybiBUSERCICpUSFJFQURfSWRUb1RIREIoIERXT1JEIGlkICk7CiBleHRlcm4gdm9pZCBUSFJFQURfU3RhcnQoIFRIREIgKnRoZGIgKTsKIGV4dGVybiBUSERCICpUSFJFQURfR2V0UHRyKCBIQU5ETEUzMiBoYW5kbGUsIERXT1JEIGFjY2VzcywgaW50ICpzZXJ2ZXJfaGFuZGxlICk7CiBleHRlcm4gdm9pZCBUSFJFQURfQWRkUXVldWUoIFRIUkVBRF9RVUVVRSAqcXVldWUsIFRIREIgKnRocmVhZCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90b29sYmFyLmggYi9pbmNsdWRlL3Rvb2xiYXIuaAppbmRleCAxZjRmNDQzLi4zNTYwMDY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Rvb2xiYXIuaAorKysgYi9pbmNsdWRlL3Rvb2xiYXIuaApAQCAtNTMsNiArNTMsNyBAQAogICAgIEJPT0wzMiAgICAgYlRyYW5zcGFyZW50OyAgICAvKiBiYWNrZ3JvdW5kIHRyYW5zcGFyZW5jeSBmbGFnICovCiAgICAgQk9PTDMyICAgICBiQXV0b1NpemU7ICAgICAgIC8qIGF1dG8gc2l6ZSBkZWFkbG9jayBpbmRpY2F0b3IgKi8KICAgICBEV09SRCAgICAgIGR3RXhTdHlsZTsgICAgICAgLyogZXh0ZW5kZWQgdG9vbGJhciBzdHlsZSAqLworICAgIERXT1JEICAgICAgZHdEVEZsYWdzOyAgICAgICAvKiBEcmF3VGV4dCBmbGFncyAqLwogCiAgICAgQ09MT1JSRUYgICBjbHJJbnNlcnRNYXJrOyAgIC8qIGluc2VydCBtYXJrIGNvbG9yICovCiAgICAgUkVDVDMyICAgICByY0JvdW5kOyAgICAgICAgIC8qIGJvdW5kaW5nIHJlY3RhbmdsZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90b29sdGlwcy5oIGIvaW5jbHVkZS90b29sdGlwcy5oCmluZGV4IGQwZDBjNzIuLmMzOGU5NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdG9vbHRpcHMuaAorKysgYi9pbmNsdWRlL3Rvb2x0aXBzLmgKQEAgLTMwLDI1ICszMCwyNiBAQAogCiB0eXBlZGVmIHN0cnVjdCB0YWdUT09MVElQU19JTkZPCiB7Ci0gICAgQ0hBUiAgICAgICAgc3pUaXBUZXh0W0lORk9USVBTSVpFXTsKLSAgICBCT09MMzIgICAgICBiQWN0aXZlOwotICAgIEJPT0wzMiAgICAgIGJUcmFja0FjdGl2ZTsKLSAgICBVSU5UMzIgICAgICB1TnVtVG9vbHM7Ci0gICAgQ09MT1JSRUYgICAgY2xyQms7Ci0gICAgQ09MT1JSRUYgICAgY2xyVGV4dDsKLSAgICBIRk9OVDMyICAgICBoRm9udDsKLSAgICBJTlQzMiAgICAgICB4VHJhY2tQb3M7Ci0gICAgSU5UMzIgICAgICAgeVRyYWNrUG9zOwotICAgIElOVDMyICAgICAgIG5NYXhUaXBXaWR0aDsKLSAgICBJTlQzMiAgICAgICBuVG9vbDsKLSAgICBJTlQzMiAgICAgICBuT2xkVG9vbDsKLSAgICBJTlQzMiAgICAgICBuQ3VycmVudFRvb2w7Ci0gICAgSU5UMzIgICAgICAgblRyYWNrVG9vbDsKLSAgICBJTlQzMiAgICAgICBuQXV0b21hdGljVGltZTsKLSAgICBJTlQzMiAgICAgICBuUmVzaG93VGltZTsKLSAgICBJTlQzMiAgICAgICBuQXV0b1BvcFRpbWU7Ci0gICAgSU5UMzIgICAgICAgbkluaXRpYWxUaW1lOwotICAgIFJFQ1QzMiAgICAgIHJjTWFyZ2luOworICAgIENIQVIgICAgICAgc3pUaXBUZXh0W0lORk9USVBTSVpFXTsKKyAgICBCT09MMzIgICAgIGJBY3RpdmU7CisgICAgQk9PTDMyICAgICBiVHJhY2tBY3RpdmU7CisgICAgVUlOVDMyICAgICB1TnVtVG9vbHM7CisgICAgQ09MT1JSRUYgICBjbHJCazsKKyAgICBDT0xPUlJFRiAgIGNsclRleHQ7CisgICAgSEZPTlQzMiAgICBoRm9udDsKKyAgICBJTlQzMiAgICAgIHhUcmFja1BvczsKKyAgICBJTlQzMiAgICAgIHlUcmFja1BvczsKKyAgICBJTlQzMiAgICAgIG5NYXhUaXBXaWR0aDsKKyAgICBJTlQzMiAgICAgIG5Ub29sOworICAgIElOVDMyICAgICAgbk9sZFRvb2w7CisgICAgSU5UMzIgICAgICBuQ3VycmVudFRvb2w7CisgICAgSU5UMzIgICAgICBuVHJhY2tUb29sOworICAgIElOVDMyICAgICAgbkF1dG9tYXRpY1RpbWU7CisgICAgSU5UMzIgICAgICBuUmVzaG93VGltZTsKKyAgICBJTlQzMiAgICAgIG5BdXRvUG9wVGltZTsKKyAgICBJTlQzMiAgICAgIG5Jbml0aWFsVGltZTsKKyAgICBSRUNUMzIgICAgIHJjTWFyZ2luOworCiAgICAgVFRUT09MX0lORk8gKnRvb2xzOwogfSBUT09MVElQU19JTkZPOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNrYmFyLmggYi9pbmNsdWRlL3RyYWNrYmFyLmgKaW5kZXggZjllZTFlOC4uM2RhNWE2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFja2Jhci5oCisrKyBiL2luY2x1ZGUvdHJhY2tiYXIuaApAQCAtMTgsMTMgKzE4LDE3IEBACiAgICAgSU5UMzIgIG5Qb3M7CiAgICAgVUlOVDMyIHVUaHVtYkxlbjsKICAgICBVSU5UMzIgdU51bVRpY3M7CisJVUlOVDMyICB1VGljRnJlcTsKICAgICBIV05EMzIgaHduZFRvb2xUaXA7CiAgICAgSFdORDMyIGh3bmRCdWRkeUxBOwogICAgIEhXTkQzMiBod25kQnVkZHlSQjsKICAgICBJTlQzMiAgZkxvY2F0aW9uOwotCisJQ09MT1JSRUYgY2xyQms7CisJCisJSU5UMzIgIGZsYWdzOwogICAgIEJPT0wzMiBiRm9jdXM7CiAgICAgUkVDVDMyIHJjQ2hhbm5lbDsKKyAgICBSRUNUMzIgcmNTZWxlY3Rpb247CiAgICAgUkVDVDMyIHJjVGh1bWI7CiAgICAgTFBMT05HIHRpY3M7CiB9IFRSQUNLQkFSX0lORk87CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyZWV2aWV3LmggYi9pbmNsdWRlL3RyZWV2aWV3LmgKaW5kZXggMGMzMTVkNC4uMmUxOWZhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmVldmlldy5oCisrKyBiL2luY2x1ZGUvdHJlZXZpZXcuaApAQCAtMiwxOSArMiw3OSBAQAogICogVHJlZXZpZXcgY2xhc3MgZXh0cmEgaW5mbwogICoKICAqIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAorICogQ29weXJpZ2h0IDE5OTggQWxleCBQcmllbQogICovCiAKICNpZm5kZWYgX19XSU5FX1RSRUVWSUVXX0gKICNkZWZpbmUgX19XSU5FX1RSRUVWSUVXX0gKIAorI2RlZmluZSBNSU5JTVVNX0lOREVOVCAxMAorCisKKyNkZWZpbmUgVFZJVEVNX0FMTE9DCTE2CisjZGVmaW5lIFRWX1JFRlJFU0hfVElNRVIgMQkKKyNkZWZpbmUgVFZfRURJVF9USU1FUiAgICAyCisjZGVmaW5lIFRWX1JFRlJFU0hfVElNRVJfU0VUIDEgIAorI2RlZmluZSBUVl9FRElUX1RJTUVSX1NFVCAyICAKKyNkZWZpbmUgVFZfUkVGUkVTSF9ERUxBWSAxMDAgICAgIC8qIDEwMCBtcyBkZWxheSBiZXR3ZWVuIHR3byByZWZyZXNoZXMgKi8KKyNkZWZpbmUgVFZfREVGQVVMVElURU1IRUlHSFQgMTUKKworLyogaW50ZXJuYWwgc3RydWN0dXJlcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIG1hc2s7CisgICAgSFRSRUVJVEVNIGhJdGVtOworICAgIFVJTlQzMiBzdGF0ZTsKKyAgICBVSU5UMzIgc3RhdGVNYXNrOworICAgIExQU1RSIHBzelRleHQ7CisgICAgaW50IGNjaFRleHRNYXg7CisgICAgaW50IGlJbWFnZTsKKyAgICBpbnQgaVNlbGVjdGVkSW1hZ2U7CisgICAgaW50IGNDaGlsZHJlbjsKKyAgICBMUEFSQU0gbFBhcmFtOworICAgIGludCBpSW50ZWdyYWw7CisJaW50IGNsclRleHQ7CisJCisJaW50IHBhcmVudDsJICAgIC8qIGhhbmRsZSB0byBwYXJlbnQgb3IgMCBpZiBhdCByb290Ki8KKwlpbnQgZmlyc3RDaGlsZDsgICAgIC8qIGhhbmRsZSB0byBmaXJzdCBjaGlsZCBvciAwIGlmIG5vIGNoaWxkKi8KKwlpbnQgc2libGluZzsgICAgICAgIC8qIGhhbmRsZSB0byBuZXh0IGl0ZW0gaW4gbGlzdCwgMCBpZiBsYXN0ICovCisJaW50IHVwc2libGluZzsgICAgICAvKiBoYW5kbGUgdG8gcHJldmlvdXMgaXRlbSBpbiBsaXN0LCAwIGlmIGZpcnN0ICovCisJaW50IHZpc2libGU7CisgICAgICAgIFJFQ1QzMiByZWN0OworCVJFQ1QzMiB0ZXh0OworfSBUUkVFVklFV19JVEVNOworCisKKyNkZWZpbmUgVFZfSFNDUk9MTCAJMHgwMSAgICAvKiB0cmVldmlldyB0b28gbGFyZ2UgdG8gZml0IGluIHdpbmRvdyAqLworI2RlZmluZSBUVl9WU0NST0xMIAkweDAyCS8qIChob3Jpem9udGFsL3ZlcnRpY2FsKSAqLworCiB0eXBlZGVmIHN0cnVjdCB0YWdUUkVFVklFV19JTkZPCiB7Ci0gICAgQ09MT1JSRUYgY2xyQms7CisgICAgVUlOVDMyCXVJbnRlcm5hbFN0YXR1czsJCQorICAgIFVJTlQzMiAgdU51bUl0ZW1zOwkvKiBudW1iZXIgb2YgdmFsaWQgVFJFRVZJRVdfSVRFTXMgKi8KKyAgICBVSU5UMzIJdU51bVB0cnNBbGxvY2VkOyAKKyAgICBVSU5UMzIJdU1heEhhbmRsZTsJLyogbmVlZGVkIGZvciBkZWxldGVfaXRlbSAqLworICAgIEhUUkVFSVRFTSAJVG9wUm9vdEl0ZW07CS8qIGhhbmRsZSB0byBmaXJzdCBpdGVtIGluIHRyZWV2aWV3ICovCisKKwlVSU5UMzIJdUl0ZW1IZWlnaHQ7CQkvKiBpdGVtIGhlaWdodCwgLTEgZm9yIGRlZmF1bHQgaXRlbSBoZWlnaHQgKi8KKwlVSU5UMzIgCXVSZWFsSXRlbUhlaWdodDsJLyogcmVhbCBpdGVtIGhlaWdodCBpbiBwaXhlbHMgKi8KKwlVSU5UMzIJdVZpc2libGVIZWlnaHQ7CSAgICAvKiB2aXNpYmxlIGhlaWdodCBvZiB0cmVldmlldyBpbiBwaXhlbHMgKi8KKyAgICBVSU5UMzIJdVRvdGFsSGVpZ2h0OwkJLyogdG90YWwgaGVpZ2h0IG9mIHRyZWV2aWV3IGluIHBpeGVscyAqLworICAgIFVJTlQzMgl1SW5kZW50OwkJLyogaW5kZW50YXRpb24gaW4gcGl4ZWxzICovCisgICAgSFRSRUVJVEVNCXNlbGVjdGVkSXRlbTsgICAvKiBoYW5kbGUgdG8gc2VsZWN0ZWQgaXRlbSBvciAwIGlmIG5vbmUgKi8KKyAgICBIVFJFRUlURU0gICBmaXJzdFZpc2libGU7CS8qIGhhbmRsZSB0byBmaXJzdCB2aXNpYmxlIGl0ZW0gKi8KKyAgICBIVFJFRUlURU0gICBkcm9wSXRlbTsJLyogaGFuZGxlIHRvIGl0ZW0gc2VsZWN0ZWQgYnkgZHJhZyBjdXJzb3IgKi8KKyAgICBJTlQzMgljeCxjeTsJCS8qIGN1cnJlbnQgeC95IHBsYWNlIGluIGxpc3QgKi8KKyAgICBDT0xPUlJFRiBjbHJCazsJCQogICAgIENPTE9SUkVGIGNsclRleHQ7CisgICAgSEZPTlQzMiAgICAgaEZvbnQ7CiAKLSAgICBISU1BR0VMSVNUIGhpbWxOb3JtYWw7CisgICAgSElNQUdFTElTVCBoaW1sTm9ybWFsOwkKICAgICBISU1BR0VMSVNUIGhpbWxTdGF0ZTsKLQorICAgIFRSRUVWSUVXX0lURU0gKml0ZW1zOwkvKiBpdGVtbGlzdCAqLworICAgIElOVDMyCSpmcmVlTGlzdDsJLyogYml0bWFwIGluZGljYXRpbmcgd2hpY2ggZWxlbWVudHMgYXJlIHZhbGlkICovCisJCQkJLyogMT12YWxpZCwgMD1mcmVlOyAJKi8KKwkJCQkvKiBzaXplIG9mIGxpc3Q9IHVOdW1QdHJzQWxsb2NlZC8zMiAqLwogCiB9IFRSRUVWSUVXX0lORk87CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHdlYWsuaCBiL2luY2x1ZGUvdHdlYWsuaAppbmRleCAwNmJmZmVlLi5iOWMzOWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3R3ZWFrLmgKKysrIGIvaW5jbHVkZS90d2Vhay5oCkBAIC0xMSwxMyArMTEsMTcgQEAKIAogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAKK3R5cGVkZWYgZW51bQoreworICAgIFdJTjMxX0xPT0ssCisgICAgV0lOOTVfTE9PSywKKyAgICBXSU45OF9MT09LCit9IFdJTkVfTE9PSzsKKworCiBpbnQgIFRXRUFLX0luaXQodm9pZCk7CiBpbnQgIFRXRUFLX0NoZWNrQ29uZmlndXJhdGlvbih2b2lkKTsKLXZvaWQgIFRXRUFLX0RyYXdSZWxpZWZSZWN0OTUoSERDMzIsIFJFQ1QzMiBjb25zdCAqKTsKLXZvaWQgIFRXRUFLX0RyYXdSZXZSZWxpZWZSZWN0OTUoSERDMzIsIFJFQ1QzMiBjb25zdCAqKTsKLXZvaWQgIFRXRUFLX0RyYXdNZW51U2VwYXJhdG9ySG9yaXo5NShIREMzMiwgVUlOVDMyLCBVSU5UMzIsIFVJTlQzMik7Ci12b2lkICBUV0VBS19EcmF3TWVudVNlcGFyYXRvclZlcnQ5NShIREMzMiwgVUlOVDMyLCBVSU5UMzIsIFVJTlQzMik7Ci1leHRlcm4gaW50ICBUV0VBS19XaW45NUxvb2s7Ci1leHRlcm4gaW50ICBUV0VBS19XaW5lSW5pdGlhbGl6ZWQ7CisKK2V4dGVybiBXSU5FX0xPT0sgVFdFQUtfV2luZUxvb2s7CiAKICNlbmRpZiAvKiBfX1dJTkVfVFdFQUtfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92ZXJzaW9uLmggYi9pbmNsdWRlL3ZlcnNpb24uaAppbmRleCAwMDYyZTA1Li40OWU1MWU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3ZlcnNpb24uaApAQCAtMSArMSBAQAotI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDkxMyIKKyNkZWZpbmUgV0lORV9SRUxFQVNFX0lORk8gIldpbmUgcmVsZWFzZSA5ODA5MjciCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Zmdy5oIGIvaW5jbHVkZS92ZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTAwZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS92ZncuaApAQCAtMCwwICsxLDI3MiBAQAorI2lmbmRlZiBfX1dJTkVfVkZXX0gKKyNkZWZpbmUgX19XSU5FX1ZGV19ICisKKyNpbmNsdWRlIDx3aW50eXBlcy5oPgorI2luY2x1ZGUgPGRyaXZlci5oPgorCisjZGVmaW5lIFZGV0FQSQlXSU5BUEkKKyNkZWZpbmUgVkZXQVBJVglXSU5BUElWCisKK0RXT1JEIFZGV0FQSSBWaWRlb0ZvcldpbmRvd3NWZXJzaW9uKHZvaWQpOworCisjaWZuZGVmIGF2aVRXT0NDCisjZGVmaW5lIGF2aVRXT0NDKGNoMCwgY2gxKSAoKFdPUkQpKEJZVEUpKGNoMCkgfCAoKFdPUkQpKEJZVEUpKGNoMSkgPDwgOCkpCisjZW5kaWYKKworI2RlZmluZSBJQ1RZUEVfVklERU8JbW1pb0ZPVVJDQygndicsICdpJywgJ2QnLCAnYycpCisjZGVmaW5lIElDVFlQRV9BVURJTwltbWlvRk9VUkNDKCdhJywgJ3UnLCAnZCcsICdjJykKKworCisvKiBJbnN0YWxsYWJsZSBDb21wcmVzc29yIE0/ICovCisKKy8qIEhJQzMyIHN0cnVjdCAoc2FtZSBsYXlvdXQgYXMgV2luOTUgb25lKSAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnV0lORV9ISUMgeworCURXT1JECQltYWdpYzsJCS8qIDAwOiAnU21hZycgKi8KKwlIQU5ETEUzMgljdXJ0aHJlYWQ7CS8qIDA0OiAqLworCURXT1JECQl0eXBlOwkJLyogMDg6ICovCisJRFdPUkQJCWhhbmRsZXI7CS8qIDBDOiAqLworCUhEUlZSMzIJCWhkcnY7CQkvKiAxMDogKi8KKwlEV09SRAkJcHJpdmF0ZTsJLyogMTQ6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gZHJ2ICovCisJRkFSUFJPQzMyCWRyaXZlcnByb2M7CS8qIDE4OiAqLworCURXT1JECQl4MTsJCS8qIDFjOiBuYW1lPyAqLworCVdPUkQJCXgyOwkJLyogMjA6ICovCisJRFdPUkQJCXgzOwkJLyogMjI6ICovCisJCQkJCS8qIDI2OiAqLworfSBXSU5FX0hJQzsKKworLyogZXJyb3IgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lCUlDRVJSX09LCQkwCisjZGVmaW5lCUlDRVJSX0RPTlREUkFXCQkxCisjZGVmaW5lCUlDRVJSX05FV1BBTEVUVEUJMgorI2RlZmluZQlJQ0VSUl9HT1RPS0VZRlJBTUUJMworI2RlZmluZQlJQ0VSUl9TVE9QRFJBV0lORwk0CisKKyNkZWZpbmUJSUNFUlJfVU5TVVBQT1JURUQJLTEKKyNkZWZpbmUJSUNFUlJfQkFERk9STUFUCQktMgorI2RlZmluZQlJQ0VSUl9NRU1PUlkJCS0zCisjZGVmaW5lCUlDRVJSX0lOVEVSTkFMCQktNAorI2RlZmluZQlJQ0VSUl9CQURGTEFHUwkJLTUKKyNkZWZpbmUJSUNFUlJfQkFEUEFSQU0JCS02CisjZGVmaW5lCUlDRVJSX0JBRFNJWkUJCS03CisjZGVmaW5lCUlDRVJSX0JBREhBTkRMRQkJLTgKKyNkZWZpbmUJSUNFUlJfQ0FOVFVQREFURQktOQorI2RlZmluZQlJQ0VSUl9BQk9SVAkJLTEwCisjZGVmaW5lCUlDRVJSX0VSUk9SCQktMTAwCisjZGVmaW5lCUlDRVJSX0JBREJJVERFUFRICS0yMDAKKyNkZWZpbmUJSUNFUlJfQkFESU1BR0VTSVpFCS0yMDEKKworI2RlZmluZQlJQ0VSUl9DVVNUT00JCS00MDAKKworLyogSUNNIE1lc3NhZ2VzICovCisjZGVmaW5lCUlDTV9VU0VSCQkoRFJWX1VTRVIrMHgwMDAwKQorCisvKiBJQ00gZHJpdmVyIG1lc3NhZ2UgcmFuZ2UgKi8KKyNkZWZpbmUJSUNNX1JFU0VSVkVEX0xPVwkoRFJWX1VTRVIrMHgxMDAwKQorI2RlZmluZQlJQ01fUkVTRVJWRURfSElHSAkoRFJWX1VTRVIrMHgyMDAwKQorI2RlZmluZQlJQ01fUkVTRVJWRUQJCUlDTV9SRVNFUlZFRF9MT1cKKworI2RlZmluZQlJQ01fR0VUU1RBVEUJCShJQ01fUkVTRVJWRUQrMCkKKyNkZWZpbmUJSUNNX1NFVFNUQVRFCQkoSUNNX1JFU0VSVkVEKzEpCisjZGVmaW5lCUlDTV9HRVRJTkZPCQkoSUNNX1JFU0VSVkVEKzIpCisKKyNkZWZpbmUJSUNNX0NPTkZJR1VSRQkJKElDTV9SRVNFUlZFRCsxMCkKKyNkZWZpbmUJSUNNX0FCT1VUCQkoSUNNX1JFU0VSVkVEKzExKQorLyogKi8KKworI2RlZmluZQlJQ01fR0VUREVGQVVMVFFVQUxJVFkJKElDTV9SRVNFUlZFRCszMCkKKyNkZWZpbmUJSUNNX0dFVFFVQUxJVFkJCShJQ01fUkVTRVJWRUQrMzEpCisjZGVmaW5lCUlDTV9TRVRRVUFMSVRZCQkoSUNNX1JFU0VSVkVEKzMyKQorCisjZGVmaW5lCUlDTV9TRVQJCQkoSUNNX1JFU0VSVkVEKzQwKQorI2RlZmluZQlJQ01fR0VUCQkJKElDTV9SRVNFUlZFRCs0MSkKKworLyogMiBjb25zdGFudCBGT1VSQ0MgY29kZXMgKi8KKyNkZWZpbmUgSUNNX0ZSQU1FUkFURQkJbW1pb0ZPVVJDQygnRicsJ3InLCdtJywnUicpCisjZGVmaW5lIElDTV9LRVlGUkFNRVJBVEUJbW1pb0ZPVVJDQygnSycsJ2UnLCd5JywnUicpCisKKyNkZWZpbmUJSUNNX0NPTVBSRVNTX0dFVF9GT1JNQVQJCShJQ01fVVNFUis0KQorI2RlZmluZQlJQ01fQ09NUFJFU1NfR0VUX1NJWkUJCShJQ01fVVNFUis1KQorI2RlZmluZQlJQ01fQ09NUFJFU1NfUVVFUlkJCShJQ01fVVNFUis2KQorI2RlZmluZQlJQ01fQ09NUFJFU1NfQkVHSU4JCShJQ01fVVNFUis3KQorI2RlZmluZQlJQ01fQ09NUFJFU1MJCQkoSUNNX1VTRVIrOCkKKyNkZWZpbmUJSUNNX0NPTVBSRVNTX0VORAkJKElDTV9VU0VSKzkpCisKKyNkZWZpbmUJSUNNX0RFQ09NUFJFU1NfR0VUX0ZPUk1BVAkoSUNNX1VTRVIrMTApCisjZGVmaW5lCUlDTV9ERUNPTVBSRVNTX1FVRVJZCQkoSUNNX1VTRVIrMTEpCisjZGVmaW5lCUlDTV9ERUNPTVBSRVNTX0JFR0lOCQkoSUNNX1VTRVIrMTIpCisjZGVmaW5lCUlDTV9ERUNPTVBSRVNTCQkJKElDTV9VU0VSKzEzKQorI2RlZmluZQlJQ01fREVDT01QUkVTU19FTkQJCShJQ01fVVNFUisxNCkKKyNkZWZpbmUJSUNNX0RFQ09NUFJFU1NfU0VUX1BBTEVUVEUJKElDTV9VU0VSKzI5KQorI2RlZmluZQlJQ01fREVDT01QUkVTU19HRVRfUEFMRVRURQkoSUNNX1VTRVIrMzApCisKKyNkZWZpbmUJSUNNX0RSQVdfUVVFUlkJCQkoSUNNX1VTRVIrMzEpCisjZGVmaW5lCUlDTV9EUkFXX0JFR0lOCQkJKElDTV9VU0VSKzE1KQorI2RlZmluZQlJQ01fRFJBV19HRVRfUEFMRVRURQkJKElDTV9VU0VSKzE2KQorI2RlZmluZQlJQ01fRFJBV19TVEFSVAkJCShJQ01fVVNFUisxOCkKKyNkZWZpbmUJSUNNX0RSQVdfU1RPUAkJCShJQ01fVVNFUisxOSkKKyNkZWZpbmUJSUNNX0RSQVdfRU5ECQkJKElDTV9VU0VSKzIxKQorI2RlZmluZQlJQ01fRFJBV19HRVRUSU1FCQkoSUNNX1VTRVIrMzIpCisjZGVmaW5lCUlDTV9EUkFXCQkJKElDTV9VU0VSKzMzKQorI2RlZmluZQlJQ01fRFJBV19XSU5ET1cJCQkoSUNNX1VTRVIrMzQpCisjZGVmaW5lCUlDTV9EUkFXX1NFVFRJTUUJCShJQ01fVVNFUiszNSkKKyNkZWZpbmUJSUNNX0RSQVdfUkVBTElaRQkJKElDTV9VU0VSKzM2KQorI2RlZmluZQlJQ01fRFJBV19GTFVTSAkJCShJQ01fVVNFUiszNykKKyNkZWZpbmUJSUNNX0RSQVdfUkVOREVSQlVGRkVSCQkoSUNNX1VTRVIrMzgpCisKKyNkZWZpbmUJSUNNX0RSQVdfU1RBUlRfUExBWQkJKElDTV9VU0VSKzM5KQorI2RlZmluZQlJQ01fRFJBV19TVE9QX1BMQVkJCShJQ01fVVNFUis0MCkKKworI2RlZmluZQlJQ01fRFJBV19TVUdHRVNURk9STUFUCQkoSUNNX1VTRVIrNTApCisjZGVmaW5lCUlDTV9EUkFXX0NIQU5HRVBBTEVUVEUJCShJQ01fVVNFUis1MSkKKworI2RlZmluZQlJQ01fR0VUQlVGRkVSU1dBTlRFRAkJKElDTV9VU0VSKzQxKQorCisjZGVmaW5lCUlDTV9HRVRERUZBVUxUS0VZRlJBTUVSQVRFCShJQ01fVVNFUis0MikKKworI2RlZmluZQlJQ01fREVDT01QUkVTU0VYX0JFR0lOCQkoSUNNX1VTRVIrNjApCisjZGVmaW5lCUlDTV9ERUNPTVBSRVNTRVhfUVVFUlkJCShJQ01fVVNFUis2MSkKKyNkZWZpbmUJSUNNX0RFQ09NUFJFU1NFWAkJKElDTV9VU0VSKzYyKQorI2RlZmluZQlJQ01fREVDT01QUkVTU0VYX0VORAkJKElDTV9VU0VSKzYzKQorCisjZGVmaW5lCUlDTV9DT01QUkVTU19GUkFNRVNfSU5GTwkoSUNNX1VTRVIrNzApCisjZGVmaW5lCUlDTV9TRVRfU1RBVFVTX1BST0MJCShJQ01fVVNFUis3MikKKworLyogc3RydWN0cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQJZHdTaXplOwkJLyogMDA6IHNpemUgKi8KKwlEV09SRAlmY2NUeXBlOwkvKiAwNDogdHlwZSAndmlkYycgdXN1YWxseSAqLworCURXT1JECWZjY0hhbmRsZXI7CS8qIDA4OiAqLworCURXT1JECWR3VmVyc2lvbjsJLyogMGM6IHZlcnNpb24gb2YgY29tcG1hbiBvcGVuaW5nIHlvdSAqLworCURXT1JECWR3RmxhZ3M7CS8qIDEwOiBMT1dPUkQgaXMgdHlwZSBzcGVjaWZpYyAqLworCUxSRVNVTFQJZHdFcnJvcjsJLyogMTQ6ICovCisJTFBWT0lECXBWMVJlc2VydmVkOwkvKiAxODogKi8KKwlMUFZPSUQJcFYyUmVzZXJ2ZWQ7CS8qIDFjOiAqLworCURXT1JECWRuRGV2Tm9kZTsJLyogMjA6ICovCisJCQkJLyogMjQ6ICovCit9IElDT1BFTiwqTFBJQ09QRU47CisKKy8qIFZhbHVlcyBmb3IgZHdGbGFncyBvZiBJQ09wZW4oKSAqLworI2RlZmluZQlJQ01PREVfQ09NUFJFU1MJCTEKKyNkZWZpbmUJSUNNT0RFX0RFQ09NUFJFU1MJMgorI2RlZmluZQlJQ01PREVfRkFTVERFQ09NUFJFU1MJMworI2RlZmluZQlJQ01PREVfUVVFUlkJCTQKKyNkZWZpbmUJSUNNT0RFX0ZBU1RDT01QUkVTUwk1CisjZGVmaW5lCUlDTU9ERV9EUkFXCQk4CisKKy8qIHF1YWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgSUNRVUFMSVRZX0xPVyAgICAgICAwCisjZGVmaW5lIElDUVVBTElUWV9ISUdIICAgICAgMTAwMDAKKyNkZWZpbmUgSUNRVUFMSVRZX0RFRkFVTFQgICAtMQorCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQJZHdTaXplOwkJLyogMDA6ICovCisJRFdPUkQJZmNjVHlwZTsJLyogMDQ6Y29tcHJlc3NvciB0eXBlICAgICAndmlkYycgJ2F1ZGMnICovCisJRFdPUkQJZmNjSGFuZGxlcjsJLyogMDg6Y29tcHJlc3NvciBzdWItdHlwZSAncmxlICcgJ2pwZWcnICdwY20gJyovCisJRFdPUkQJZHdGbGFnczsJLyogMGM6ZmxhZ3MgTE9XT1JEIGlzIHR5cGUgc3BlY2lmaWMgKi8KKwlEV09SRAlkd1ZlcnNpb247CS8qIDEwOnZlcnNpb24gb2YgdGhlIGRyaXZlciAqLworCURXT1JECWR3VmVyc2lvbklDTTsJLyogMTQ6dmVyc2lvbiBvZiB0aGUgSUNNIHVzZWQgKi8KKwkvKgorCSAqIHVuZGVyIFdpbjMyLCB0aGUgZHJpdmVyIGFsd2F5cyByZXR1cm5zIFVOSUNPREUgc3RyaW5ncy4KKwkgKi8KKwlXQ0hBUglzek5hbWVbMTZdOwkJLyogMTg6c2hvcnQgbmFtZSAqLworCVdDSEFSCXN6RGVzY3JpcHRpb25bMTI4XTsJLyogMzg6bG9uZyBuYW1lICovCisJV0NIQVIJc3pEcml2ZXJbMTI4XTsJCS8qIDEzODpkcml2ZXIgdGhhdCBjb250YWlucyBjb21wcmVzc29yKi8KKwkJCQkJLyogMjM4OiAqLworfSBJQ0lORk8zMjsKKworCisvKiBGbGFncyBmb3IgdGhlIDxkd0ZsYWdzPiBmaWVsZCBvZiB0aGUgPElDSU5GTz4gc3RydWN0dXJlLiAqLworI2RlZmluZQlWSURDRl9RVUFMSVRZCQkweDAwMDEgIC8qIHN1cHBvcnRzIHF1YWxpdHkgKi8KKyNkZWZpbmUJVklEQ0ZfQ1JVTkNICQkweDAwMDIgIC8qIHN1cHBvcnRzIGNydW5jaGluZyB0byBhIGZyYW1lIHNpemUgKi8KKyNkZWZpbmUJVklEQ0ZfVEVNUE9SQUwJCTB4MDAwNCAgLyogc3VwcG9ydHMgaW50ZXItZnJhbWUgY29tcHJlc3MgKi8KKyNkZWZpbmUJVklEQ0ZfQ09NUFJFU1NGUkFNRVMJMHgwMDA4ICAvKiB3YW50cyB0aGUgY29tcHJlc3MgYWxsIGZyYW1lcyBtZXNzYWdlICovCisjZGVmaW5lCVZJRENGX0RSQVcJCTB4MDAxMCAgLyogc3VwcG9ydHMgZHJhd2luZyAqLworI2RlZmluZQlWSURDRl9GQVNUVEVNUE9SQUxDCTB4MDAyMCAgLyogZG9lcyBub3QgbmVlZCBwcmV2IGZyYW1lIG9uIGNvbXByZXNzICovCisjZGVmaW5lCVZJRENGX0ZBU1RURU1QT1JBTEQJMHgwMDgwICAvKiBkb2VzIG5vdCBuZWVkIHByZXYgZnJhbWUgb24gZGVjb21wcmVzcyAqLworI2RlZmluZQlWSURDRl9RVUFMSVRZVElNRQkweDAwNDAgIC8qIHN1cHBvcnRzIHRlbXBvcmFsIHF1YWxpdHkgKi8KKworI2RlZmluZQlWSURDRl9GQVNUVEVNUE9SQUwJKFZJRENGX0ZBU1RURU1QT1JBTEN8VklEQ0ZfRkFTVFRFTVBPUkFMRCkKKworCisvKiBmdW5jdGlvbiBzaG9ydGN1dHMgKi8KKy8qIElDTV9BQk9VVCAqLworI2RlZmluZSBJQ01GX0FCT1VUX1FVRVJZICAgICAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIElDUXVlcnlBYm91dChoaWMpIFwKKwkoSUNTZW5kTWVzc2FnZShoaWMsSUNNX0FCT1VULChEV09SRCktMSxJQ01GX0FCT1VUX1FVRVJZKT09SUNFUlJfT0spCisKKyNkZWZpbmUgSUNBYm91dChoaWMsIGh3bmQpIFwKKwlJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fQUJPVVQsKERXT1JEKShVSU5UKShod25kKSwwKQorCisvKiBJQ01fQ09ORklHVVJFICovCisjZGVmaW5lIElDTUZfQ09ORklHVVJFX1FVRVJZCTB4MDAwMDAwMDEKKyNkZWZpbmUgSUNRdWVyeUNvbmZpZ3VyZShoaWMpIFwKKwkoSUNTZW5kTWVzc2FnZShoaWMsSUNNX0NPTkZJR1VSRSwoRFdPUkQpLTEsSUNNRl9DT05GSUdVUkVfUVVFUlkpPT1JQ0VSUl9PSykKKworI2RlZmluZSBJQ0NvbmZpZ3VyZShoaWMsaHduZCkgXAorCUlDU2VuZE1lc3NhZ2UoaGljLElDTV9DT05GSUdVUkUsKERXT1JEKShVSU5UKShod25kKSwwKQorCisvKiBEZWNvbXByZXNzaW9uIHN0dWZmICovCisjZGVmaW5lIElDREVDT01QUkVTU19IVVJSWVVQCQkweDgwMDAwMDAwCS8qIGRvbid0IGRyYXcganVzdCBidWZmZXIgKGh1cnJ5IHVwISkgKi8KKyNkZWZpbmUgSUNERUNPTVBSRVNTX1VQREFURQkJMHg0MDAwMDAwMAkvKiBkb24ndCBkcmF3IGp1c3QgdXBkYXRlIHNjcmVlbiAqLworI2RlZmluZSBJQ0RFQ09NUFJFU1NfUFJFUk9MCQkweDIwMDAwMDAwCS8qIHRoaXMgZnJhbWUgaXMgYmVmb3JlIHJlYWwgc3RhcnQgKi8KKyNkZWZpbmUgSUNERUNPTVBSRVNTX05VTExGUkFNRQkJMHgxMDAwMDAwMAkvKiByZXBlYXQgbGFzdCBmcmFtZSAqLworI2RlZmluZSBJQ0RFQ09NUFJFU1NfTk9US0VZRlJBTUUJMHgwODAwMDAwMAkvKiB0aGlzIGZyYW1lIGlzIG5vdCBhIGtleSBmcmFtZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRFdPUkQJCWR3RmxhZ3M7CS8qIGZsYWdzIChmcm9tIEFWSSBpbmRleC4uLikgKi8KKyAgICBMUEJJVE1BUElORk9IRUFERVIJbHBiaUlucHV0OwkvKiBCSVRNQVBJTkZPIG9mIGNvbXByZXNzZWQgZGF0YSAqLworICAgIExQVk9JRAkJbHBJbnB1dDsJLyogY29tcHJlc3NlZCBkYXRhICovCisgICAgTFBCSVRNQVBJTkZPSEVBREVSCWxwYmlPdXRwdXQ7CS8qIERJQiB0byBkZWNvbXByZXNzIHRvICovCisgICAgTFBWT0lECQlscE91dHB1dDsKKyAgICBEV09SRAkJY2tpZDsJCS8qIGNraWQgZnJvbSBBVkkgZmlsZSAqLworfSBJQ0RFQ09NUFJFU1M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRAkJZHdGbGFnczsKKyAgICBMUEJJVE1BUElORk9IRUFERVIJbHBiaVNyYzsKKyAgICBMUFZPSUQJCWxwU3JjOworICAgIExQQklUTUFQSU5GT0hFQURFUglscGJpRHN0OworICAgIExQVk9JRAkJbHBEc3Q7CisKKyAgICAvKiBjaGFuZ2VkIGZvciBJQ01fREVDT01QUkVTU0VYICovCisgICAgSU5UMzIJCXhEc3Q7ICAgICAgIC8qIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSAqLworICAgIElOVDMyCQl5RHN0OworICAgIElOVDMyCQlkeERzdDsKKyAgICBJTlQzMgkJZHlEc3Q7CisKKyAgICBJTlQzMgkJeFNyYzsgICAgICAgLyogc291cmNlIHJlY3RhbmdsZSAqLworICAgIElOVDMyCQl5U3JjOworICAgIElOVDMyCQlkeFNyYzsKKyAgICBJTlQzMgkJZHlTcmM7Cit9IElDREVDT01QUkVTU0VYOworCisjZGVmaW5lIElDRFJBV19RVUVSWSAgICAgICAgMHgwMDAwMDAwMUwgICAvLyB0ZXN0IGZvciBzdXBwb3J0CisjZGVmaW5lIElDRFJBV19GVUxMU0NSRUVOICAgMHgwMDAwMDAwMkwgICAvLyBkcmF3IHRvIGZ1bGwgc2NyZWVuCisjZGVmaW5lIElDRFJBV19IREMgICAgICAgICAgMHgwMDAwMDAwNEwgICAvLyBkcmF3IHRvIGEgSERDL0hXTkQKKworCitCT09MMzIJVkZXQVBJCUlDSW5mbzMyKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIElDSU5GTzMyICogbHBpY2luZm8pOworTFJFU1VMVAlWRldBUEkJSUNHZXRJbmZvMzIoSElDMzIgaGljLElDSU5GTzMyICpwaWNpbmZvLCBEV09SRCBjYik7CitISUMzMglWRldBUEkJSUNPcGVuMzIoRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgVUlOVDMyIHdNb2RlKTsKK0xSRVNVTFQJVkZXQVBJCUlDU2VuZE1lc3NhZ2UzMihISUMzMiBoaWMsIFVJTlQzMiBtc2csIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKK0RXT1JECVZGV0FQSVYJSUNEcmF3QmVnaW4zMigKKyAgICAgICAgSElDMzIJCQloaWMsCisgICAgICAgIERXT1JECQkJZHdGbGFncywvKiBmbGFncyAqLworICAgICAgICBIUEFMRVRURTMyCQlocGFsLAkvKiBwYWxldHRlIHRvIGRyYXcgd2l0aCAqLworICAgICAgICBIV05EMzIJCQlod25kLAkvKiB3aW5kb3cgdG8gZHJhdyB0byAqLworICAgICAgICBIREMzMgkJCWhkYywJLyogSERDIHRvIGRyYXcgdG8gKi8KKyAgICAgICAgSU5UMzIJCQl4RHN0LAkvKiBkZXN0aW5hdGlvbiByZWN0YW5nbGUgKi8KKyAgICAgICAgSU5UMzIJCQl5RHN0LAorICAgICAgICBJTlQzMgkJCWR4RHN0LAorICAgICAgICBJTlQzMgkJCWR5RHN0LAorICAgICAgICBMUEJJVE1BUElORk9IRUFERVIJbHBiaSwJLyogZm9ybWF0IG9mIGZyYW1lIHRvIGRyYXcgKi8KKyAgICAgICAgSU5UMzIJCQl4U3JjLAkvKiBzb3VyY2UgcmVjdGFuZ2xlICovCisgICAgICAgIElOVDMyCQkJeVNyYywKKyAgICAgICAgSU5UMzIJCQlkeFNyYywKKyAgICAgICAgSU5UMzIJCQlkeVNyYywKKyAgICAgICAgRFdPUkQJCQlkd1JhdGUsCS8qIGZyYW1lcy9zZWNvbmQgPSAoZHdSYXRlL2R3U2NhbGUpICovCisgICAgICAgIERXT1JECQkJZHdTY2FsZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5hc3BpLmggYi9pbmNsdWRlL3dpbmFzcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODFkZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS93aW5hc3BpLmgKQEAgLTAsMCArMSwxMDAgQEAKKyNpZiAhZGVmaW5lZChXSU5BU1BJX0gpCisjZGVmaW5lIFdJTkFTUElfSAorCisjcHJhZ21hIHBhY2soMSkKKworI2RlZmluZSBBU1BJX0RPUyAgICAgICAgMQorI2RlZmluZSBBU1BJX1dJTjE2ICAgICAgMgorCit0eXBlZGVmIHVuaW9uIFNSQjE2ICogTFBTUkIxNjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU1JCX0hhSW5xdWlyeTE2IHsKKyAgQllURQlTUkJfQ21kOworICBCWVRFCVNSQl9TdGF0dXM7CisgIEJZVEUJU1JCX0hhSWQ7CisgIEJZVEUJU1JCX0ZsYWdzOworICBXT1JECVNSQl81NUFBU2lnbmF0dXJlOworICBXT1JECVNSQl9FeHRCdWZmZXJTaXplOworICBCWVRFCUhBX0NvdW50OworICBCWVRFCUhBX1NDU0lfSUQ7CisgIEJZVEUJSEFfTWFuYWdlcklkWzE2XTsKKyAgQllURQlIQV9JZGVudGlmaWVyWzE2XTsKKyAgQllURQlIQV9VbmlxdWVbMTZdOworICBCWVRFCUhBX0V4dEJ1ZmZlcls0XTsKK30gU1JCX0hhSW5xdWlyeTE2IFdJTkVfUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfRXhlY1NDU0lDbWQxNiB7CisgIEJZVEUgICAgICAgIFNSQl9DbWQ7ICAgICAgICAgICAgICAgIC8qIEFTUEkgY29tbWFuZCBjb2RlCSAgICAgIChXKSAgKi8KKyAgQllURSAgICAgICAgU1JCX1N0YXR1czsgICAgICAgICAgICAgLyogQVNQSSBjb21tYW5kIHN0YXR1cyBieXRlICAgICAoUikgICovCisgIEJZVEUgICAgICAgIFNSQl9IYUlkOyAgICAgICAgICAgICAgIC8qIEFTUEkgaG9zdCBhZGFwdGVyIG51bWJlciAgICAgKFcpICAqLworICBCWVRFICAgICAgICBTUkJfRmxhZ3M7ICAgICAgICAgICAgICAvKiBBU1BJIHJlcXVlc3QgZmxhZ3MJICAgICAgKFcpICAqLworICBEV09SRCAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgICAgICAvKiBSZXNlcnZlZCwgTVVTVCA9IDAJICAgICAgKC0pICAqLworICBCWVRFICAgICAgICBTUkJfVGFyZ2V0OyAgICAgICAgICAgICAvKiBUYXJnZXQncyBTQ1NJIElECSAgICAgIChXKSAgKi8KKyAgQllURSAgICAgICAgU1JCX0x1bjsgICAgICAgICAgICAgICAgLyogVGFyZ2V0J3MgTFVOIG51bWJlcgkgICAgICAoVykgICovCisgIERXT1JEICAgICAgIFNSQl9CdWZMZW47ICAgICAgICAgICAgIC8qIERhdGEgQWxsb2NhdGlvbiBMZW5ndGhQRyAgICAgKFcvUikqLworICBCWVRFICAgICAgICBTUkJfU2Vuc2VMZW47ICAgICAgICAgICAvKiBTZW5zZSBBbGxvY2F0aW9uIExlbmd0aCAgICAgIChXKSAgKi8KKyAgU0VHUFRSICAgICAgU1JCX0J1ZlBvaW50ZXI7ICAgICAgICAgLyogRGF0YSBCdWZmZXIgUG9pbnRlcgkgICAgICAoVykgICovCisgIERXT1JEICAgICAgIFNSQl9Sc3ZkMTsgICAgICAgICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMAkgICAgICAoLS9XKSovCisgIEJZVEUgICAgICAgIFNSQl9DREJMZW47ICAgICAgICAgICAgIC8qIENEQiBMZW5ndGggPSA2CQkgICAgICAoVykgICovCisgIEJZVEUgICAgICAgIFNSQl9IYVN0YXQ7ICAgICAgICAgICAgIC8qIEhvc3QgQWRhcHRlciBTdGF0dXMJICAgICAgKFIpICAqLworICBCWVRFICAgICAgICBTUkJfVGFyZ1N0YXQ7ICAgICAgICAgICAvKiBUYXJnZXQgU3RhdHVzCQkgICAgICAoUikgICovCisgIEZBUlBST0MxNiAgIFNSQl9Qb3N0UHJvYzsJICAgICAgLyogUG9zdCByb3V0aW5lCQkgICAgICAoVykgICovCisgIEJZVEUgICAgICAgIFNSQl9Sc3ZkMlszNF07ICAgICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMCAgICAgICAgICAgICAgICAqLworICBCWVRFCQlDREJCeXRlWzBdOwkgICAgICAvKiBTQ1NJIENCRCAtIHZhcmlhYmxlIGxlbmd0aCAgIChXKSAgKi8KKyAgLyogdmFyaWFibGUgZXhhbXBsZSBmb3IgNiBieXRlIGNiZAorICAgKiBCWVRFICAgICAgICBDREJCeXRlWzZdOyAgICAgICAgICAgICAqIFNDU0kgQ0RCICAgICAgICAgICAgICAgICAgICAoVykgKgorICAgKiBCWVRFICAgICAgICBTZW5zZUFyZWE2W1NFTlNFX0xFTl07ICAqIFJlcXVlc3QgU2Vuc2UgYnVmZmVyIAkoUikgKgorICAgKi8KK30gU1JCX0V4ZWNTQ1NJQ21kMTYgV0lORV9QQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1NSQl9BYm9ydDE2IHsKKyAgQllURSAgICAgICAgU1JCX0NtZDsgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgY29kZSA9IFNDX0FCT1JUX1NSQiAqLworICBCWVRFICAgICAgICBTUkJfU3RhdHVzOyAgICAgICAgIC8qIEFTUEkgY29tbWFuZCBzdGF0dXMgYnl0ZSAqLworICBCWVRFICAgICAgICBTUkJfSGFJZDsgICAgICAgICAgIC8qIEFTUEkgaG9zdCBhZGFwdGVyIG51bWJlciAqLworICBCWVRFICAgICAgICBTUkJfRmxhZ3M7ICAgICAgICAgIC8qIEFTUEkgcmVxdWVzdCBmbGFncyAqLworICBEV09SRCAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMCAqLworICBMUFNSQjE2ICAgICBTUkJfVG9BYm9ydDsgICAgICAgIC8qIFBvaW50ZXIgdG8gU1JCIHRvIGFib3J0ICovCit9IFNSQl9BYm9ydDE2IFdJTkVfUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfQnVzRGV2aWNlUmVzZXQxNiB7CisgIEJZVEUgICAgICAgIFNSQl9DbWQ7ICAgICAgICAgICAgLyogQVNQSSBjb21tYW5kIGNvZGUgPSBTQ19SRVNFVF9ERVYgKi8KKyAgQllURSAgICAgICAgU1JCX1N0YXR1czsgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgc3RhdHVzIGJ5dGUgKi8KKyAgQllURSAgICAgICAgU1JCX0hhSWQ7ICAgICAgICAgICAvKiBBU1BJIGhvc3QgYWRhcHRlciBudW1iZXIgKi8KKyAgQllURSAgICAgICAgU1JCX0ZsYWdzOyAgICAgICAgICAvKiBBU1BJIHJlcXVlc3QgZmxhZ3MgKi8KKyAgRFdPUkQgICAgICAgU1JCX0hkcl9Sc3ZkOyAgICAgICAvKiBSZXNlcnZlZCwgTVVTVCA9IDAgKi8KKyAgQllURSAgICAgICAgU1JCX1RhcmdldDsgICAgICAgICAvKiBUYXJnZXQncyBTQ1NJIElEICovCisgIEJZVEUgICAgICAgIFNSQl9MdW47ICAgICAgICAgICAgLyogVGFyZ2V0J3MgTFVOIG51bWJlciAqLworICBCWVRFICAgICAgICBTUkJfUmVzZXRSc3ZkMVsxNF07IC8qIFJlc2VydmVkLCBNVVNUID0gMCAqLworICBCWVRFICAgICAgICBTUkJfSGFTdGF0OyAgICAgICAgIC8qIEhvc3QgQWRhcHRlciBTdGF0dXMgKi8KKyAgQllURSAgICAgICAgU1JCX1RhcmdTdGF0OyAgICAgICAvKiBUYXJnZXQgU3RhdHVzICovCisgIFNFR1BUUiAgICAgIFNSQl9Qb3N0UHJvYzsgICAgICAgLyogUG9zdCByb3V0aW5lICovCisgIEJZVEUgICAgICAgIFNSQl9SZXNldFJzdmQyWzM0XTsgLyogUmVzZXJ2ZWQsIE1VU1QgPSAwICovCit9IFNSQl9CdXNEZXZpY2VSZXNldDE2IFdJTkVfUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfR0RFVkJsb2NrMTYgeworICBCWVRFICAgICAgICBTUkJfQ21kOyAgICAgICAgICAgIC8qIEFTUEkgY29tbWFuZCBjb2RlID0gU0NfR0VUX0RFVl9UWVBFICovCisgIEJZVEUgICAgICAgIFNSQl9TdGF0dXM7ICAgICAgICAgLyogQVNQSSBjb21tYW5kIHN0YXR1cyBieXRlICovCisgIEJZVEUgICAgICAgIFNSQl9IYUlkOyAgICAgICAgICAgLyogQVNQSSBob3N0IGFkYXB0ZXIgbnVtYmVyICovCisgIEJZVEUgICAgICAgIFNSQl9GbGFnczsgICAgICAgICAgLyogQVNQSSByZXF1ZXN0IGZsYWdzICovCisgIERXT1JEICAgICAgIFNSQl9IZHJfUnN2ZDsgICAgICAgLyogUmVzZXJ2ZWQsIE1VU1QgPSAwICovCisgIEJZVEUgICAgICAgIFNSQl9UYXJnZXQ7ICAgICAgICAgLyogVGFyZ2V0J3MgU0NTSSBJRCAqLworICBCWVRFICAgICAgICBTUkJfTHVuOyAgICAgICAgICAgIC8qIFRhcmdldCdzIExVTiBudW1iZXIgKi8KKyAgQllURSAgICAgICAgU1JCX0RldmljZVR5cGU7ICAgICAvKiBUYXJnZXQncyBwZXJpcGhlcmFsIGRldmljZSB0eXBlICovCit9IFNSQl9HREVWQmxvY2sxNiBXSU5FX1BBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU1JCX0NvbW1vbjE2IHsKKyAgQllURQlTUkJfQ21kOworfSBTUkJfQ29tbW9uMTY7CisKK3VuaW9uIFNSQjE2IHsKKyAgU1JCX0NvbW1vbjE2CQljb21tb247CisgIFNSQl9IYUlucXVpcnkxNglpbnF1aXJ5OworICBTUkJfRXhlY1NDU0lDbWQxNgljbWQ7CisgIFNSQl9BYm9ydDE2CQlhYm9ydDsKKyAgU1JCX0J1c0RldmljZVJlc2V0MTYJcmVzZXQ7CisgIFNSQl9HREVWQmxvY2sxNglkZXZ0eXBlOworfTsKKwordHlwZWRlZiB1bmlvbiBTUkIxNiBTUkIxNjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmJhc2UuaCBiL2luY2x1ZGUvd2luYmFzZS5oCmluZGV4IDE2OTM4ZjIuLjQ3ODc4ZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luYmFzZS5oCisrKyBiL2luY2x1ZGUvd2luYmFzZS5oCkBAIC0xODksNiArMTg5LDggQEAKIHZvaWQgICAgICBXSU5BUEkgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpscENyaXQpOwogdm9pZCAgICAgIFdJTkFQSSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpscENyaXQpOwogSEFORExFMzIgIFdJTkFQSSBPcGVuUHJvY2VzcyhEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBpZCk7CitCT09MMzIgICAgV0lOQVBJIEdldFByb2Nlc3NXb3JraW5nU2V0U2l6ZShIQU5ETEUzMixMUERXT1JELExQRFdPUkQpOworQk9PTDMyICAgIFdJTkFQSSBTZXRQcm9jZXNzV29ya2luZ1NldFNpemUoSEFORExFMzIsRFdPUkQsRFdPUkQpOwogdm9pZCAgICAgIFdJTkFQSSBSYWlzZUV4Y2VwdGlvbihEV09SRCxEV09SRCxEV09SRCxjb25zdCBMUERXT1JEKTsKIEJPT0wzMiAgICBXSU5BUEkgVGVybWluYXRlUHJvY2VzcyhIQU5ETEUzMixEV09SRCk7CiBCT09MMzIgICAgV0lOQVBJIFRlcm1pbmF0ZVRocmVhZChIQU5ETEUzMixEV09SRCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IDg3NjVlNjguLmFmNTRkNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0xMDUzLDYgKzEwNTMsNyBAQAogI2RlZmluZSBDT0xPUl9CVE5URVhUCQkgICAxOAogI2RlZmluZSBDT0xPUl9JTkFDVElWRUNBUFRJT05URVhUICAxOQogI2RlZmluZSBDT0xPUl9CVE5ISUdITElHSFQgICAgICAgICAyMAorLyogd2luOTUgY29sb3JzICovCiAjZGVmaW5lIENPTE9SXzNEREtTSEFET1cgICAgICAgICAgIDIxCiAjZGVmaW5lIENPTE9SXzNETElHSFQgICAgICAgICAgICAgIDIyCiAjZGVmaW5lIENPTE9SX0lORk9URVhUICAgICAgICAgICAgIDIzCkBAIC0xMDYzLDYgKzEwNjQsMTEgQEAKICNkZWZpbmUgQ09MT1JfM0RISUdITElHSFQgICAgICAgICAgQ09MT1JfQlROSElHSExJR0hUCiAjZGVmaW5lIENPTE9SXzNESElMSUdIVCAgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVAogI2RlZmluZSBDT0xPUl9CVE5ISUxJR0hUICAgICAgICAgICBDT0xPUl9CVE5ISUdITElHSFQKKy8qIHdpbjk4IGNvbG9ycyAqLworI2RlZmluZSBDT0xPUl9BTFRFUk5BVEVCVE5GQUNFICAgICAgICAgMjUgIC8qIHVuZG9jdW1lbnRlZCwgY29uc3RhbnQncyBuYW1lIHVua25vd24gKi8KKyNkZWZpbmUgQ09MT1JfSE9UTElHSFQgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIENPTE9SX0dSQURJRU5UQUNUSVZFQ0FQVElPTiAgICAyNworI2RlZmluZSBDT0xPUl9HUkFESUVOVElOQUNUSVZFQ0FQVElPTiAgMjgKIAogICAvKiBXTV9DVExDT0xPUiB2YWx1ZXMgKi8KICNkZWZpbmUgQ1RMQ09MT1JfTVNHQk9YICAgICAgICAgICAgIDAKQEAgLTEwNzcsNiArMTA4MywxNSBAQAogI2RlZmluZSBJQ01fT04gICAgMgogI2RlZmluZSBJQ01fUVVFUlkgMwogCisgIC8qIEJvdW5kcyBBY2N1bXVsYXRpb24gQVBJcyAqLworI2RlZmluZSBEQ0JfUkVTRVQgICAgICAgMHgwMDAxCisjZGVmaW5lIERDQl9BQ0NVTVVMQVRFICAweDAwMDIKKyNkZWZpbmUgRENCX0RJUlRZICAgICAgIERDQl9BQ0NVTVVMQVRFCisjZGVmaW5lIERDQl9TRVQgICAgICAgICAoRENCX1JFU0VUIHwgRENCX0FDQ1VNVUxBVEUpCisjZGVmaW5lIERDQl9FTkFCTEUgICAgICAweDAwMDQKKyNkZWZpbmUgRENCX0RJU0FCTEUgICAgIDB4MDAwOAorCisKICAgLyogQml0bWFwcyAqLwogCiB0eXBlZGVmIHN0cnVjdApAQCAtMjA1MCw4ICsyMDY1LDE0IEBACiAjZGVmaW5lIFNNX1NMT1dNQUNISU5FCSAgICAgIDczCiAjZGVmaW5lIFNNX01JREVBU1RFTkFCTEVEICAgICA3NAogI2RlZmluZSBTTV9NT1VTRVdIRUVMUFJFU0VOVCAgNzUKKyNkZWZpbmUgU01fWFZJUlRVQUxTQ1JFRU4gICAgIDc2CisjZGVmaW5lIFNNX1lWSVJUVUFMU0NSRUVOICAgICA3NworI2RlZmluZSBTTV9DWFZJUlRVQUxTQ1JFRU4gICAgNzgKKyNkZWZpbmUgU01fQ1lWSVJUVUFMU0NSRUVOICAgIDc5CisjZGVmaW5lIFNNX0NNT05JVE9SUyAgICAgICAgICA4MAorI2RlZmluZSBTTV9TQU1FRElTUExBWUZPUk1BVCAgODEKKyNkZWZpbmUgU01fQ01FVFJJQ1MgICAgICAgICAgIDgzCiAKLSNkZWZpbmUgU01fQ01FVFJJQ1MgICAgICAgICAgIDc2CiAKICAgLyogRGV2aWNlLWluZGVwZW5kZW50IGJpdG1hcHMgKi8KIApAQCAtNjI5Myw2ICs2MzE0LDE1IEBACiAgICAgRFdPUkQgZHdQbGF0Zm9ybUlEOwogfSBETExWRVJTSU9OSU5GTzsKIAordHlwZWRlZiBzdHJ1Y3QgX1NFR0lORk8geworICAgIFVJTlQxNiAgICBvZmZTZWdtZW50OworICAgIFVJTlQxNiAgICBjYlNlZ21lbnQ7CisgICAgVUlOVDE2ICAgIGZsYWdzOworICAgIFVJTlQxNiAgICBjYkFsbG9jOworICAgIEhHTE9CQUwxNiBoOworICAgIFVJTlQxNiAgICBhbGlnblNoaWZ0OworICAgIFVJTlQxNiAgICByZXNlcnZlZFsyXTsKK30gU0VHSU5GTzsKIAogCiAjcHJhZ21hIHBhY2soNCkKQEAgLTYzMzgsNyArNjM2OCw3IEBACiBJTlQxNiAgICAgICBXSU5BUEkgR2V0Q29tbUVycm9yKElOVDE2LExQQ09NU1RBVCk7CiBVSU5UMTYgICAgICBXSU5BUEkgR2V0Q29tbUV2ZW50TWFzayhJTlQxNixVSU5UMTYpOwogSEJSVVNIMTYgICAgV0lOQVBJIEdldENvbnRyb2xCcnVzaChIV05EMTYsSERDMTYsVUlOVDE2KTsKLVZPSUQgICAgICAgIFdJTkFQSSBHZXRDb2RlSW5mbyhGQVJQUk9DMTYsTFBWT0lEKTsKK1ZPSUQgICAgICAgIFdJTkFQSSBHZXRDb2RlSW5mbyhGQVJQUk9DMTYsU0VHSU5GTyopOwogSEZPTlQxNiAgICAgV0lOQVBJIEdldEN1ckxvZ0ZvbnQoSERDMTYpOwogSEFORExFMTYgICAgV0lOQVBJIEdldEN1cnJlbnRQREIodm9pZCk7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0Q3VycmVudFBvc2l0aW9uKEhEQzE2KTsKQEAgLTY1MTUsNiArNjU0NSw5IEBACiBCT09MMzIgICAgICBXSU5BUEkgRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscyhITU9EVUxFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIERvc0RhdGVUaW1lVG9GaWxlVGltZShXT1JELFdPUkQsTFBGSUxFVElNRSk7CiBCT09MMzIgICAgICBXSU5BUEkgRHVwbGljYXRlSGFuZGxlKEhBTkRMRTMyLEhBTkRMRTMyLEhBTkRMRTMyLEhBTkRMRTMyKixEV09SRCxCT09MMzIsRFdPUkQpOworQk9PTDMyICAgICAgV0lOQVBJIEVudW1EYXRlRm9ybWF0czMyQShEQVRFRk1UX0VOVU1QUk9DMzJBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncyk7CitCT09MMzIgICAgICBXSU5BUEkgRW51bURhdGVGb3JtYXRzMzJXKERBVEVGTVRfRU5VTVBST0MzMlcgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKTsKKyNkZWZpbmUgICAgIEVudW1EYXRlRm9ybWF0cyBXSU5FTElCX05BTUVfQVcoRW51bURhdGVGb3JtYXRzKQogSU5UMzIgICAgICAgV0lOQVBJIEVudW1Qcm9wc0V4MzJBKEhXTkQzMixQUk9QRU5VTVBST0NFWDMyQSxMUEFSQU0pOwogSU5UMzIgICAgICAgV0lOQVBJIEVudW1Qcm9wc0V4MzJXKEhXTkQzMixQUk9QRU5VTVBST0NFWDMyVyxMUEFSQU0pOwogI2RlZmluZSAgICAgRW51bVByb3BzRXggV0lORUxJQl9OQU1FX0FXKEVudW1Qcm9wc0V4KQpAQCAtNjUzOCw2ICs2NTcxLDkgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlczMyVyhMT0NBTEVfRU5VTVBST0MzMlcsRFdPUkQpOwogI2RlZmluZSAgICAgRW51bVN5c3RlbUxvY2FsZXMgV0lORUxJQl9OQU1FX0FXKEVudW1TeXN0ZW1Mb2NhbGVzKQogQk9PTDMyICAgICAgV0lOQVBJIEVudW1UaHJlYWRXaW5kb3dzKERXT1JELFdOREVOVU1QUk9DMzIsTFBBUkFNKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBFbnVtVGltZUZvcm1hdHMzMkEoVElNRUZNVF9FTlVNUFJPQzMyQSBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpOworQk9PTDMyICAgICAgV0lOQVBJIEVudW1UaW1lRm9ybWF0czMyVyhUSU1FRk1UX0VOVU1QUk9DMzJXIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncyk7CisjZGVmaW5lICAgICBFbnVtVGltZUZvcm1hdHMgV0lORUxJQl9OQU1FX0FXKEVudW1UaW1lRm9ybWF0cykKIFZPSUQgICAgICAgIFdJTkFQSSBFeGl0UHJvY2VzcyhEV09SRCk7CiBWT0lEICAgICAgICBXSU5BUEkgRXhpdFRocmVhZChEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgRXhpdFdpbmRvd3NFeChVSU5UMzIsRFdPUkQpOwpAQCAtNzE5Nyw3ICs3MjMzLDcgQEAKIEhCUlVTSDMyICAgIFdJTkFQSSBDcmVhdGVESUJQYXR0ZXJuQnJ1c2gzMihIR0xPQkFMMzIsVUlOVDMyKTsKICNkZWZpbmUgICAgIENyZWF0ZURJQlBhdHRlcm5CcnVzaCBXSU5FTElCX05BTUUoQ3JlYXRlRElCUGF0dGVybkJydXNoKQogSEJJVE1BUDE2ICAgV0lOQVBJIENyZWF0ZURJQlNlY3Rpb24xNiAoSERDMTYsIEJJVE1BUElORk8gKiwgVUlOVDE2LAotCQkJCSAgICAgICBMUFZPSUQgKiosIEhBTkRMRTE2LCBEV09SRCBvZmZzZXQpOworCQkJCSAgICAgICBMUFZPSUQgKiosIEhBTkRMRTMyLCBEV09SRCBvZmZzZXQpOwogSEJJVE1BUDMyICAgV0lOQVBJIENyZWF0ZURJQlNlY3Rpb24zMiAoSERDMzIsIEJJVE1BUElORk8gKiwgVUlOVDMyLAogCQkJCSAgICAgICBMUFZPSUQgKiosIEhBTkRMRTMyLCBEV09SRCBvZmZzZXQpOwogI2RlZmluZSAgICAgQ3JlYXRlRElCU2VjdGlvbiBXSU5FTElCX05BTUUoQ3JlYXRlRElCU2VjdGlvbikKQEAgLTc2NTEsNiArNzY4Nyw5IEBACiBJTlQxNiAgICAgICBXSU5BUEkgR2V0QmtNb2RlMTYoSERDMTYpOwogSU5UMzIgICAgICAgV0lOQVBJIEdldEJrTW9kZTMyKEhEQzMyKTsKICNkZWZpbmUgICAgIEdldEJrTW9kZSBXSU5FTElCX05BTUUoR2V0QmtNb2RlKQorVUlOVDE2ICAgICAgV0lOQVBJIEdldEJvdW5kc1JlY3QxNihIREMxNixMUFJFQ1QxNixVSU5UMTYpOworVUlOVDMyICAgICAgV0lOQVBJIEdldEJvdW5kc1JlY3QzMihIREMzMixMUFJFQ1QzMixVSU5UMzIpOworI2RlZmluZSAgICAgR2V0Qm91bmRzUmVjdCBXSU5FTElCX05BTUUoR2V0Qm91bmRzUmVjdCkKIEhXTkQxNiAgICAgIFdJTkFQSSBHZXRDYXB0dXJlMTYodm9pZCk7CiBIV05EMzIgICAgICBXSU5BUEkgR2V0Q2FwdHVyZTMyKHZvaWQpOwogI2RlZmluZSAgICAgR2V0Q2FwdHVyZSBXSU5FTElCX05BTUUoR2V0Q2FwdHVyZSkKQEAgLTc4MzMsNiArNzg3MiwxMCBAQAogSU5UMzIgICAgICAgV0lOQVBJIEdldEtleU5hbWVUZXh0MzJBKExPTkcsTFBTVFIsSU5UMzIpOwogSU5UMzIgICAgICAgV0lOQVBJIEdldEtleU5hbWVUZXh0MzJXKExPTkcsTFBXU1RSLElOVDMyKTsKICNkZWZpbmUgICAgIEdldEtleU5hbWVUZXh0IFdJTkVMSUJfTkFNRV9BVyhHZXRLZXlOYW1lVGV4dCkKK0lOVDE2ICAgICAgIFdJTkFQSSBHZXRLZXlib2FyZExheW91dE5hbWUxNihMUFNUUik7CitJTlQzMiAgICAgICBXSU5BUEkgR2V0S2V5Ym9hcmRMYXlvdXROYW1lMzJBKExQU1RSKTsKK0lOVDMyICAgICAgIFdJTkFQSSBHZXRLZXlib2FyZExheW91dE5hbWUzMlcoTFBXU1RSKTsKKyNkZWZpbmUgICAgIEdldEtleWJvYXJkTGF5b3V0TmFtZSBXSU5FTElCX05BTUVfQVcoR2V0S2V5Ym9hcmRMYXlvdXROYW1lKQogV09SRCAgICAgICAgV0lOQVBJIEdldEtleVN0YXRlMTYoSU5UMTYpOwogV09SRCAgICAgICAgV0lOQVBJIEdldEtleVN0YXRlMzIoSU5UMzIpOwogI2RlZmluZSAgICAgR2V0S2V5U3RhdGUgV0lORUxJQl9OQU1FKEdldEtleVN0YXRlKQpAQCAtODEyNiw3ICs4MTY5LDcgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRXaW5kb3dQbGFjZW1lbnQzMihIV05EMzIsTFBXSU5ET1dQTEFDRU1FTlQzMik7CiAjZGVmaW5lICAgICBHZXRXaW5kb3dQbGFjZW1lbnQgV0lORUxJQl9OQU1FKEdldFdpbmRvd1BsYWNlbWVudCkKIHZvaWQgICAgICAgIFdJTkFQSSBHZXRXaW5kb3dSZWN0MTYoSFdORDE2LExQUkVDVDE2KTsKLXZvaWQgICAgICAgIFdJTkFQSSBHZXRXaW5kb3dSZWN0MzIoSFdORDMyLExQUkVDVDMyKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBHZXRXaW5kb3dSZWN0MzIoSFdORDMyLExQUkVDVDMyKTsKICNkZWZpbmUgICAgIEdldFdpbmRvd1JlY3QgV0lORUxJQl9OQU1FKEdldFdpbmRvd1JlY3QpCiBJTlQxNiAgICAgICBXSU5BUEkgR2V0V2luZG93UmduMTYoSFdORDE2LEhSR04xNik7CiBJTlQzMiAgICAgICBXSU5BUEkgR2V0V2luZG93UmduMzIoSFdORDMyLEhSR04zMik7CkBAIC04NzgxLDYgKzg4MjQsOSBAQAogSU5UMTYgICAgICAgV0lOQVBJIFNldEJrTW9kZTE2KEhEQzE2LElOVDE2KTsKIElOVDMyICAgICAgIFdJTkFQSSBTZXRCa01vZGUzMihIREMzMixJTlQzMik7CiAjZGVmaW5lICAgICBTZXRCa01vZGUgV0lORUxJQl9OQU1FKFNldEJrTW9kZSkKK1VJTlQxNiAgICAgIFdJTkFQSSBTZXRCb3VuZHNSZWN0MTYoSERDMTYsTFBSRUNUMTYsVUlOVDE2KTsKK1VJTlQzMiAgICAgIFdJTkFQSSBTZXRCb3VuZHNSZWN0MzIoSERDMzIsTFBSRUNUMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgIFNldEJvdW5kc1JlY3QgV0lORUxJQl9OQU1FKFNldEJvdW5kc1JlY3QpCiBIV05EMTYgICAgICBXSU5BUEkgU2V0Q2FwdHVyZTE2KEhXTkQxNik7CiBIV05EMzIgICAgICBXSU5BUEkgU2V0Q2FwdHVyZTMyKEhXTkQzMik7CiAjZGVmaW5lICAgICBTZXRDYXB0dXJlIFdJTkVMSUJfTkFNRShTZXRDYXB0dXJlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5lcnJvci5oIGIvaW5jbHVkZS93aW5lcnJvci5oCmluZGV4IDFkMzY4ZmIuLjMwOTYxN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZXJyb3IuaAorKysgYi9pbmNsdWRlL3dpbmVycm9yLmgKQEAgLTcxLDYgKzcxLDcgQEAKICNkZWZpbmUgRVJST1JfTk9fTkVUV09SSyAgICAgICAgICAgIDEyMjIKICNkZWZpbmUgRVJST1JfQUxSRUFEWV9JTklUSUFMSVpFRCAgIDEyNDcKICNkZWZpbmUgRVJST1JfUFJJVklMRUdFX05PVF9IRUxEICAgIDEzMTQKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9XSU5ET1dfSEFORExFIDE0MDAKICNkZWZpbmUgRVJST1JfQ0FOTk9UX0ZJTkRfV05EX0NMQVNTIDE0MDcKICNkZWZpbmUgRVJST1JfV0lORE9XX09GX09USEVSX1RIUkVBRCAxNDA4CiAjZGVmaW5lIEVSUk9SX0NMQVNTX0FMUkVBRFlfRVhJU1RTICAxNDEwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm5scy5oIGIvaW5jbHVkZS93aW5ubHMuaAppbmRleCA1MDI0OTk4Li5jZWNiMTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbm5scy5oCisrKyBiL2luY2x1ZGUvd2lubmxzLmgKQEAgLTE5NCw3ICsxOTQsNyBAQAogI2RlZmluZSBTVUJMQU5HX0RFRkFVTFQgICAgICAgICAgICAgICAgICAweDAxICAgIC8qIHVzZXIgZGVmYXVsdCAqLwogI2RlZmluZSBTVUJMQU5HX1NZU19ERUZBVUxUICAgICAgICAgICAgICAweDAyICAgIC8qIHN5c3RlbSBkZWZhdWx0ICovCiAKLSNkZWZpbmUgU1VCTEFOR19BUkFCSUMgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUEgICAgICAweDAxCiAjZGVmaW5lIFNVQkxBTkdfQVJBQklDX0lSQVEgICAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgU1VCTEFOR19BUkFCSUNfRUdZUFQgICAgICAgICAgICAgMHgwMwogI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19MSUJZQSAgICAgICAgICAgICAweDA0CkBAIC0yMDMsMTggKzIwMywxOSBAQAogI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBICAgICAgICAgICAweDA3CiAjZGVmaW5lIFNVQkxBTkdfQVJBQklDX09NQU4gICAgICAgICAgICAgIDB4MDgKICNkZWZpbmUgU1VCTEFOR19BUkFCSUNfWUVNRU4gICAgICAgICAgICAgMHgwOQotI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19TWVJJQSAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIFNVQkxBTkdfQVJBQklDX0pPUkRBTiAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgU1VCTEFOR19BUkFCSUNfTEVCQU5PTiAgICAgICAgICAgMHgxMgotI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19LVVdBSVQgICAgICAgICAgICAweDEzCi0jZGVmaW5lIFNVQkxBTkdfQVJBQklDX1VBRSAgICAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgU1VCTEFOR19BUkFCSUNfQkFIUkFJTiAgICAgICAgICAgMHgxNQotI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19RQVRBUiAgICAgICAgICAgICAweDE2CisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX1NZUklBICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgU1VCTEFOR19BUkFCSUNfSk9SREFOICAgICAgICAgICAgMHgwYgorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OICAgICAgICAgICAweDBjCisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX0tVV0FJVCAgICAgICAgICAgIDB4MGQKKyNkZWZpbmUgU1VCTEFOR19BUkFCSUNfVUFFICAgICAgICAgICAgICAgMHgwZQorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOICAgICAgICAgICAweDBmCisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX1FBVEFSICAgICAgICAgICAgIDB4MTAKICNkZWZpbmUgU1VCTEFOR19DSElORVNFX1RSQURJVElPTkFMICAgICAgMHgwMQogI2RlZmluZSBTVUJMQU5HX0NISU5FU0VfU0lNUExJRklFRCAgICAgICAweDAyCiAjZGVmaW5lIFNVQkxBTkdfQ0hJTkVTRV9IT05HS09ORyAgICAgICAgIDB4MDMKICNkZWZpbmUgU1VCTEFOR19DSElORVNFX1NJTkdBUE9SRSAgICAgICAgMHgwNAotI2RlZmluZSBTVUJMQU5HX0RVVENIICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVSAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgU1VCTEFOR19EVVRDSF9ORVRIRVJMQU5EUyAgICAgICAgMHgwMQogI2RlZmluZSBTVUJMQU5HX0RVVENIX0JFTEdJQU4gICAgICAgICAgICAweDAyCiAjZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9VUyAgICAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1VLICAgICAgICAgICAgICAgMHgwMgpAQCAtMjI1LDQwICsyMjYsNDkgQEAKICNkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1NBRlJJQ0EgICAgICAgICAgMHgwNwogI2RlZmluZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSAgICAgICAgICAweDA4CiAjZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9DQVJSSUJFQU4gICAgICAgIDB4MDkKLSNkZWZpbmUgU1VCTEFOR19GUkVOQ0ggICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFICAgICAgICAgICAweDBhCisjZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCAgICAgICAgIDB4MGIKKyNkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFICAgICAgICAgMHgwYworI2RlZmluZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVMgICAgICAweDBkCisjZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0ZSQU5DRSAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgU1VCTEFOR19GUkVOQ0hfQkVMR0lBTiAgICAgICAgICAgMHgwMgogI2RlZmluZSBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTiAgICAgICAgICAweDAzCiAjZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1NXSVNTICAgICAgICAgICAgIDB4MDQKICNkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRyAgICAgICAgMHgwNQotI2RlZmluZSBTVUJMQU5HX0dFUk1BTiAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PTkFDTyAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgU1VCTEFOR19HRVJNQU5fR0VSTUFOWSAgICAgICAgICAgMHgwMQogI2RlZmluZSBTVUJMQU5HX0dFUk1BTl9TV0lTUyAgICAgICAgICAgICAweDAyCiAjZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOICAgICAgICAgIDB4MDMKICNkZWZpbmUgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRyAgICAgICAgMHgwNAogI2RlZmluZSBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOICAgICAweDA1Ci0jZGVmaW5lIFNVQkxBTkdfSVRBTElBTiAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1VCTEFOR19JVEFMSUFOX0lUQUxJQSAgICAgICAgICAgMHgwMQogI2RlZmluZSBTVUJMQU5HX0lUQUxJQU5fU1dJU1MgICAgICAgICAgICAweDAyCi0jZGVmaW5lIFNVQkxBTkdfS09SRUFOICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1VCTEFOR19LT1JFQU5fV0FOU1VORyAgICAgICAgICAgMHgwMQogI2RlZmluZSBTVUJMQU5HX0tPUkVBTl9KT0hBQiAgICAgICAgICAgICAweDAyCiAjZGVmaW5lIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTCAgICAgICAgIDB4MDEKICNkZWZpbmUgU1VCTEFOR19OT1JXRUdJQU5fTllOT1JTSyAgICAgICAgMHgwMgotI2RlZmluZSBTVUJMQU5HX1BPUlRVR1VFU0UgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNVQkxBTkdfUE9SVFVHVUVTRV9QT1JUVUdBTCAgICAgIDB4MDIKICNkZWZpbmUgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTiAgICAgMHgwMQotI2RlZmluZSBTVUJMQU5HX1NQQU5JU0ggICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9TUEFJTl9UUkFEICAgICAgIDB4MDEKICNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX01FWElDQU4gICAgICAgICAgMHgwMgotI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfTU9ERVJOICAgICAgICAgICAweDAzCisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9TUEFJTl9NT0RFUk4gICAgIDB4MDMKICNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSAgICAgICAgMHgwNAogI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFSSUNBICAgICAgICAweDA1CiAjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQU5BTUEgICAgICAgICAgIDB4MDYKICNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTiAgICAgICAgMHgwNwogI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBICAgICAgICAweDA4CiAjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSAgICAgICAgIDB4MDkKLSNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BFUlUgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BICAgICAgICAweDExCi0jZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SICAgICAgICAgIDB4MTIKLSNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NISUxFICAgICAgICAgICAgMHgxMwotI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWSAgICAgICAgICAweDE0Ci0jZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSAgICAgICAgIDB4MTUKLSNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEgICAgICAgICAgMHgxNgorI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEVSVSAgICAgICAgICAgICAweDBhCisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEgICAgICAgIDB4MGIKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IgICAgICAgICAgMHgwYworI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUgICAgICAgICAgICAweDBkCisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZICAgICAgICAgIDB4MGUKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZICAgICAgICAgMHgwZgorI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQSAgICAgICAgICAweDEwCisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUyAgICAgICAgIDB4MTEKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQSAgICAgICAgMHgxMgorI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08gICAgICAweDEzCisKIAogLyogU29ydCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBTT1JUX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAweDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2ludHlwZXMuaCBiL2luY2x1ZGUvd2ludHlwZXMuaAppbmRleCA4OTU2NzZkLi5lM2Q0NTk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnR5cGVzLmgKKysrIGIvaW5jbHVkZS93aW50eXBlcy5oCkBAIC0xNjksMTAgKzE2OSwxNCBAQAogREVDTEFSRV9IQU5ETEUoSFdBVkVPVVQpOwogREVDTEFSRV9IQU5ETEUoSFdORCk7CiBERUNMQVJFX0hBTkRMRShIS0wpOworREVDTEFSRV9IQU5ETEUoSElDKTsKICN1bmRlZiBERUNMQVJFX0hBTkRMRQogCiAvKiBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVycyB0eXBlcyAqLwogCit0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sqIERBVEVGTVRfRU5VTVBST0MzMkEpKExQU1RSKTsKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyogREFURUZNVF9FTlVNUFJPQzMyVykoTFBXU1RSKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKERBVEVGTVRfRU5VTVBST0MpCiB0eXBlZGVmIExSRVNVTFQgKENBTExCQUNLICpETEdQUk9DMTYpKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKIHR5cGVkZWYgTFJFU1VMVCAoQ0FMTEJBQ0sgKkRMR1BST0MzMikoSFdORDMyLFVJTlQzMixXUEFSQU0zMixMUEFSQU0pOwogREVDTF9XSU5FTElCX1RZUEUoRExHUFJPQykKQEAgLTIwNSw2ICsyMDksOSBAQAogdHlwZWRlZiBCT09MMzIgIChDQUxMQkFDSyAqUFJPUEVOVU1QUk9DRVgzMkEpKEhXTkQzMixMUENTVFIsSEFORExFMzIsTFBBUkFNKTsKIHR5cGVkZWYgQk9PTDMyICAoQ0FMTEJBQ0sgKlBST1BFTlVNUFJPQ0VYMzJXKShIV05EMzIsTFBDV1NUUixIQU5ETEUzMixMUEFSQU0pOwogREVDTF9XSU5FTElCX1RZUEVfQVcoUFJPUEVOVU1QUk9DRVgpCit0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sqIFRJTUVGTVRfRU5VTVBST0MzMkEpKExQU1RSKTsKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyogVElNRUZNVF9FTlVNUFJPQzMyVykoTFBXU1RSKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKFRJTUVGTVRfRU5VTVBST0MpCiB0eXBlZGVmIFZPSUQgICAgKENBTExCQUNLICpUSU1FUlBST0MxNikoSFdORDE2LFVJTlQxNixVSU5UMTYsRFdPUkQpOwogdHlwZWRlZiBWT0lEICAgIChDQUxMQkFDSyAqVElNRVJQUk9DMzIpKEhXTkQzMixVSU5UMzIsVUlOVDMyLERXT1JEKTsKIERFQ0xfV0lORUxJQl9UWVBFKFRJTUVSUFJPQykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2ludmVyc2lvbi5oIGIvaW5jbHVkZS93aW52ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2MDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvd2ludmVyc2lvbi5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX19XSU5FX1dJTlZFUlNJT05fSAorI2RlZmluZSBfX1dJTkVfV0lOVkVSU0lPTl9ICisKK3R5cGVkZWYgZW51bQoreworICAgIFdJTjMxLCAvKiBXaW5kb3dzIDMuMSAqLworICAgIFdJTjk1LCAgIC8qIFdpbmRvd3MgOTUgKi8KKyAgICBOVDM1MSwgICAvKiBXaW5kb3dzIE5UIDMuNTEgKi8KKyAgICBOVDQwLCAgICAvKiBXaW5kb3dzIE5UIDQuMCAqLyAgCisgICAgTkJfV0lORE9XU19WRVJTSU9OUworfSBXSU5ET1dTX1ZFUlNJT047CisKK2V4dGVybiBXSU5ET1dTX1ZFUlNJT04gVkVSU0lPTl9HZXRWZXJzaW9uKCk7IAorZXh0ZXJuIGNoYXIgKlZFUlNJT05fR2V0VmVyc2lvbk5hbWUoKTsgCisKKyNlbmRpZiAgLyogX19XSU5FX1dJTlZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93bmFzcGkzMi5oIGIvaW5jbHVkZS93bmFzcGkzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MmE2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3duYXNwaTMyLmgKQEAgLTAsMCArMSw5NiBAQAorI2lmICFkZWZpbmVkKFdOQVNQSTMyX0gpCisjZGVmaW5lIFdOQVNQSTMyX0gKKworI3ByYWdtYSBwYWNrKDEpCisKK3R5cGVkZWYgdW5pb24gU1JCMzIgKiBMUFNSQjMyOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfSGFJbnF1aXJ5MzIgeworIEJZVEUgIFNSQl9DbWQ7ICAgICAgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgY29kZSA9IFNDX0hBX0lOUVVJUlkgKi8KKyBCWVRFICBTUkJfU3RhdHVzOyAgICAgICAgICAgICAgLyogQVNQSSBjb21tYW5kIHN0YXR1cyBieXRlICovCisgQllURSAgU1JCX0hhSWQ7ICAgICAgICAgICAgICAgIC8qIEFTUEkgaG9zdCBhZGFwdGVyIG51bWJlciAqLworIEJZVEUgIFNSQl9GbGFnczsgICAgICAgICAgICAgICAvKiBBU1BJIHJlcXVlc3QgZmxhZ3MgKi8KKyBEV09SRCAgU1JCX0hkcl9Sc3ZkOyAgICAgICAgICAgLyogUmVzZXJ2ZWQsIE1VU1QgPSAwICovCisgQllURSAgSEFfQ291bnQ7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBob3N0IGFkYXB0ZXJzIHByZXNlbnQgKi8KKyBCWVRFICBIQV9TQ1NJX0lEOyAgICAgICAgICAgICAgLyogU0NTSSBJRCBvZiBob3N0IGFkYXB0ZXIgKi8KKyBCWVRFICBIQV9NYW5hZ2VySWRbMTZdOyAgICAgICAgLyogU3RyaW5nIGRlc2NyaWJpbmcgdGhlIG1hbmFnZXIgKi8KKyBCWVRFICBIQV9JZGVudGlmaWVyWzE2XTsgICAgICAgLyogU3RyaW5nIGRlc2NyaWJpbmcgdGhlIGhvc3QgYWRhcHRlciAqLworIEJZVEUgIEhBX1VuaXF1ZVsxNl07ICAgICAgICAgICAvKiBIb3N0IEFkYXB0ZXIgVW5pcXVlIHBhcmFtZXRlcnMgKi8KKyBXT1JEICBIQV9Sc3ZkMTsKK30gU1JCX0hhSW5xdWlyeTMyIFdJTkVfUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfRXhlY1NDU0lDbWQzMiB7CisgIEJZVEUgICAgICAgIFNSQl9DbWQ7ICAgICAgICAgICAgLyogQVNQSSBjb21tYW5kIGNvZGUgPSBTQ19FWEVDX1NDU0lfQ01EICovCisgIEJZVEUgICAgICAgIFNSQl9TdGF0dXM7ICAgICAgICAgLyogQVNQSSBjb21tYW5kIHN0YXR1cyBieXRlICovCisgIEJZVEUgICAgICAgIFNSQl9IYUlkOyAgICAgICAgICAgLyogQVNQSSBob3N0IGFkYXB0ZXIgbnVtYmVyICovCisgIEJZVEUgICAgICAgIFNSQl9GbGFnczsgICAgICAgICAgLyogQVNQSSByZXF1ZXN0IGZsYWdzICovCisgIERXT1JEICAgICAgIFNSQl9IZHJfUnN2ZDsgICAgICAgLyogUmVzZXJ2ZWQgKi8KKyAgQllURSAgICAgICAgU1JCX1RhcmdldDsgICAgICAgICAvKiBUYXJnZXQncyBTQ1NJIElEICovCisgIEJZVEUgICAgICAgIFNSQl9MdW47ICAgICAgICAgICAgLyogVGFyZ2V0J3MgTFVOIG51bWJlciAqLworICBXT1JEICAgICAgICBTUkJfUnN2ZDE7ICAgICAgICAgIC8qIFJlc2VydmVkIGZvciBBbGlnbm1lbnQgKi8KKyAgRFdPUkQgICAgICAgU1JCX0J1ZkxlbjsgICAgICAgICAvKiBEYXRhIEFsbG9jYXRpb24gTGVuZ3RoICovCisgIEJZVEUgICAgICAgICpTUkJfQnVmUG9pbnRlcjsgICAgLyogRGF0YSBCdWZmZXIgUG9pbnQgKi8KKyAgQllURSAgICAgICAgU1JCX1NlbnNlTGVuOyAgICAgICAvKiBTZW5zZSBBbGxvY2F0aW9uIExlbmd0aCAqLworICBCWVRFICAgICAgICBTUkJfQ0RCTGVuOyAgICAgICAgIC8qIENEQiBMZW5ndGggKi8KKyAgQllURSAgICAgICAgU1JCX0hhU3RhdDsgICAgICAgICAvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzICovCisgIEJZVEUgICAgICAgIFNSQl9UYXJnU3RhdDsgICAgICAgLyogVGFyZ2V0IFN0YXR1cyAqLworICB2b2lkICAgICAgICAoKlNSQl9Qb3N0UHJvYykoKTsgIC8qIFBvc3Qgcm91dGluZSAqLworICB2b2lkICAgICAgICAqU1JCX1JzdmQyOyAgICAgICAgIC8qIFJlc2VydmVkICovCisgIEJZVEUgICAgICAgIFNSQl9Sc3ZkM1sxNl07ICAgICAgLyogUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiAqLworICBCWVRFICAgICAgICBDREJCeXRlWzE2XTsgICAgICAgIC8qIFNDU0kgQ0RCICovCisgIEJZVEUgICAgICAgIFNlbnNlQXJlYVswXTsgICAgICAgLyogUmVxdWVzdCBzZW5zZSBidWZmZXIgLSB2YXIgbGVuZ3RoICovCit9IFNSQl9FeGVjU0NTSUNtZDMyIFdJTkVfUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfQWJvcnQzMiB7CisgIEJZVEUgICAgICAgIFNSQl9DbWQ7ICAgICAgICAgICAgLyogQVNQSSBjb21tYW5kIGNvZGUgPSBTQ19BQk9SVF9TUkIgKi8KKyAgQllURSAgICAgICAgU1JCX1N0YXR1czsgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgc3RhdHVzIGJ5dGUgKi8KKyAgQllURSAgICAgICAgU1JCX0hhSWQ7ICAgICAgICAgICAvKiBBU1BJIGhvc3QgYWRhcHRlciBudW1iZXIgKi8KKyAgQllURSAgICAgICAgU1JCX0ZsYWdzOyAgICAgICAgICAvKiBSZXNlcnZlZCAqLworICBEV09SRCAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgIC8qIFJlc2VydmVkLCBNVVNUID0gMCAqLworICBMUFNSQjMyICAgICBTUkJfVG9BYm9ydDsgICAgICAgIC8qIFBvaW50ZXIgdG8gU1JCIHRvIGFib3J0ICovCit9IFNSQl9BYm9ydDMyIFdJTkVfUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfQnVzRGV2aWNlUmVzZXQzMiB7CisgQllURSAgICAgICAgIFNSQl9DbWQ7ICAgICAgICAgICAgICAgICAgLyogQVNQSSBjb21tYW5kIGNvZGUgPSBTQ19SRVNFVF9ERVYgKi8KKyBCWVRFICAgICAgICAgU1JCX1N0YXR1czsgICAgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgc3RhdHVzIGJ5dGUgKi8KKyBCWVRFICAgICAgICAgU1JCX0hhSWQ7ICAgICAgICAgICAgICAgICAvKiBBU1BJIGhvc3QgYWRhcHRlciBudW1iZXIgKi8KKyBCWVRFICAgICAgICAgU1JCX0ZsYWdzOyAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworIERXT1JEICAgICAgICBTUkJfSGRyX1JzdmQ7ICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgQllURSAgICAgICAgIFNSQl9UYXJnZXQ7ICAgICAgICAgICAgICAgLyogVGFyZ2V0J3MgU0NTSSBJRCAqLworIEJZVEUgICAgICAgICBTUkJfTHVuOyAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCdzIExVTiBudW1iZXIgKi8KKyBCWVRFICAgICAgICAgU1JCX1JzdmQxWzEyXTsgICAgICAgICAgICAvKiBSZXNlcnZlZCBmb3IgQWxpZ25tZW50ICovCisgQllURSAgICAgICAgIFNSQl9IYVN0YXQ7ICAgICAgICAgICAgICAgLyogSG9zdCBBZGFwdGVyIFN0YXR1cyAqLworIEJZVEUgICAgICAgICBTUkJfVGFyZ1N0YXQ7ICAgICAgICAgICAgIC8qIFRhcmdldCBTdGF0dXMgKi8KKyB2b2lkICAgICAgICAgKCpTUkJfUG9zdFByb2MpKCk7ICAgICAgICAvKiBQb3N0IHJvdXRpbmUgKi8KKyB2b2lkICAgICAgICAgKlNSQl9Sc3ZkMjsgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworIEJZVEUgICAgICAgICBTUkJfUnN2ZDNbMzJdOyAgICAgICAgICAgIC8qIFJlc2VydmVkICovCit9IFNSQl9CdXNEZXZpY2VSZXNldDMyIFdJTkVfUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCB0YWdTUkJfR0RFVkJsb2NrMzIgeworIEJZVEUgIFNSQl9DbWQ7ICAgICAgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgY29kZSA9IFNDX0dFVF9ERVZfVFlQRSAqLworIEJZVEUgIFNSQl9TdGF0dXM7ICAgICAgICAgICAgICAvKiBBU1BJIGNvbW1hbmQgc3RhdHVzIGJ5dGUgKi8KKyBCWVRFICBTUkJfSGFJZDsgICAgICAgICAgICAgICAgLyogQVNQSSBob3N0IGFkYXB0ZXIgbnVtYmVyICovCisgQllURSAgU1JCX0ZsYWdzOyAgICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgRFdPUkQgIFNSQl9IZHJfUnN2ZDsgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgQllURSAgU1JCX1RhcmdldDsgICAgICAgICAgICAgIC8qIFRhcmdldCdzIFNDU0kgSUQgKi8KKyBCWVRFICBTUkJfTHVuOyAgICAgICAgICAgICAgICAgLyogVGFyZ2V0J3MgTFVOIG51bWJlciAqLworIEJZVEUgIFNSQl9EZXZpY2VUeXBlOyAgICAgICAgICAvKiBUYXJnZXQncyBwZXJpcGhlcmFsIGRldmljZSB0eXBlICovCisgQllURSAgU1JCX1JzdmQxOworfSBTUkJfR0RFVkJsb2NrMzIgV0lORV9QQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1NSQl9Db21tb24zMiB7CisgIEJZVEUgIFNSQl9DbWQ7Cit9IFNSQl9Db21tb24zMjsKKwordW5pb24gU1JCMzIgeworICBTUkJfQ29tbW9uMzIgICAgICAgICAgY29tbW9uOworICBTUkJfSGFJbnF1aXJ5MzIgICAgICAgaW5xdWlyeTsKKyAgU1JCX0V4ZWNTQ1NJQ21kMzIgICAgIGNtZDsKKyAgU1JCX0Fib3J0MzIgICAgICAgICAgIGFib3J0OworICBTUkJfQnVzRGV2aWNlUmVzZXQzMiAgcmVzZXQ7CisgIFNSQl9HREVWQmxvY2szMiAgICAgICBkZXZ0eXBlOworfTsKKwordHlwZWRlZiB1bmlvbiBTUkIzMiBTUkIzMjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sb2FkZXIvZG9zL01ha2VmaWxlLmluIGIvbG9hZGVyL2Rvcy9NYWtlZmlsZS5pbgppbmRleCAyNTc0MjVkLi4yMGY3ZjlmIDEwMDY0NAotLS0gYS9sb2FkZXIvZG9zL01ha2VmaWxlLmluCisrKyBiL2xvYWRlci9kb3MvTWFrZWZpbGUuaW4KQEAgLTE0LDcgKzE0LDcgQEAKIGFsbDogJChNT0RVTEUpLm8gJChQUk9HUkFNUykKIAogZG9zbW9kOiBkb3Ntb2QuYwotCSQoQ0MpICQoQUxMQ0ZMQUdTKSAtbyBkb3Ntb2QgZG9zbW9kLmMKKwkkKENDKSAkKEFMTENGTEFHUykgLW8gZG9zbW9kICQoU1JDRElSKS9kb3Ntb2QuYwogCiBATUFLRV9SVUxFU0AKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL2Rvcy9kb3N2bS5jIGIvbG9hZGVyL2Rvcy9kb3N2bS5jCmluZGV4IDliNGFiYjguLjIyMjNhMDggMTAwNjQ0Ci0tLSBhL2xvYWRlci9kb3MvZG9zdm0uYworKysgYi9sb2FkZXIvZG9zL2Rvc3ZtLmMKQEAgLTkxLDggKzkxLDkgQEAKICAgY2FzZSBWTTg2X1NJR05BTDoKICAgIHByaW50ZigiVHJhcHBlZCBzaWduYWxcbiIpOwogICAgcmV0PS0xOyBicmVhazsKLSAgY2FzZSBWTTg2X1VOS05PV046CisgIGNhc2UgVk04Nl9VTktOT1dOOiAvKiB1bmhhbmRsZWQgR1BGICovCiAgICBET1NWTV9EdW1wKGxwRG9zVGFzayk7CisgICBjdHhfZGVidWcoU0lHU0VHViwmY29udGV4dCk7CiAgICBicmVhazsKICAgY2FzZSBWTTg2X0lOVHg6CiAgICBUUkFDRShpbnQsIkRPUyBFWEUgY2FsbHMgSU5UICUwMnggd2l0aCBBWD0lMDRseFxuIixWTTg2X0FSRyhscERvc1Rhc2stPmZuKSxjb250ZXh0LkVheCk7CkBAIC0xMDIsNyArMTAzLDggQEAKICAgY2FzZSBWTTg2X1BJQ1JFVFVSTjoKICAgIHByaW50ZigiVHJhcHBlZCBkdWUgdG8gcGVuZGluZyBQSUMgcmVxdWVzdFxuIik7IGJyZWFrOwogICBjYXNlIFZNODZfVFJBUDoKLSAgIHByaW50ZigiVHJhcHBlZCBkZWJ1ZyByZXF1ZXN0XG4iKTsgYnJlYWs7CisgICBjdHhfZGVidWcoU0lHVFJBUCwmY29udGV4dCk7CisgICBicmVhazsKICAgZGVmYXVsdDoKICAgIERPU1ZNX0R1bXAobHBEb3NUYXNrKTsKICB9CmRpZmYgLS1naXQgYS9sb2FkZXIvZG9zL21vZHVsZS5jIGIvbG9hZGVyL2Rvcy9tb2R1bGUuYwppbmRleCAyNDk0MTM1Li5jMGY3ZTg1IDEwMDY0NAotLS0gYS9sb2FkZXIvZG9zL21vZHVsZS5jCisrKyBiL2xvYWRlci9kb3MvbW9kdWxlLmMKQEAgLTE5LDEyICsxOSwxNCBAQAogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJkb3NleGUuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCiAKICNpZmRlZiBNWl9TVVBQT1JURUQKIApAQCAtMzYsMzUgKzM4LDEyIEBACiAjdW5kZWYgTVpfTUFQU0VMRgogCiAjZGVmaW5lIEJJT1NfREFUQV9TRUdNRU5UIDB4NDAKLSNkZWZpbmUgQklPU19TRUdNRU5UIEJJT1NTRUcgLyogQklPU1NFRyBpcyBkZWZpbmVkIHRvIDB4ZjAwMCBpbiBzeXMvdm04Ni5oICovCi0jZGVmaW5lIFNUVUJfU0VHTUVOVCBCSU9TX1NFR01FTlQKICNkZWZpbmUgU1RBUlRfT0ZGU0VUIDAKICNkZWZpbmUgUFNQX1NJWkUgMHgxMAogCiAjZGVmaW5lIFNFRzE2KHB0cixzZWcpICgoTFBWT0lEKSgoQllURSopcHRyKygoRFdPUkQpKHNlZyk8PDQpKSkKICNkZWZpbmUgU0VHUFRSMTYocHRyLHNlZ3B0cikgKChMUFZPSUQpKChCWVRFKilwdHIrKChEV09SRClTRUxFQ1RPUk9GKHNlZ3B0cik8PDQpK09GRlNFVE9GKHNlZ3B0cikpKQogCi0jZGVmaW5lIFNUVUIoeCkgKDB4OTBDRjAwQ0R8KHg8PDgpKSAvKiBJTlQgeDsgSVJFVDsgTk9QICovCi0KLXN0YXRpYyB2b2lkIE1aX0luaXRTeXN0ZW0oIExQVk9JRCBscEltYWdlICkKLXsKLSBTRUdQVFIqaXNyPWxwSW1hZ2U7Ci0gRFdPUkQqc3R1Yj1TRUcxNihscEltYWdlLFNUVUJfU0VHTUVOVCk7Ci0gaW50IHg7Ci0gCi0gLyogaW5pdGlhbGl6ZSBJU1IgdGFibGUgdG8gbWFrZSBpdCBwb2ludCB0byBJTlQgc3R1YnMgaW4gQklPU1NFRzsKLSAgICBMaW51eCBvbmx5IHNlbmRzIElOVHMgcGVyZm9ybWVkIGZyb20gb3IgZGVzdGluZWQgdG8gQklPU1NFRyBhdCB1cywKLSAgICBpZiB0aGUgaW50X3JldmVjdG9yZWQgdGFibGUgaXMgZW1wdHkuCi0gICAgVGhpcyBhbGxvd3MgRE9TIHByb2dyYW1zIHRvIGhvb2sgaW50ZXJydXB0cywgYXMgd2VsbCBhcyB1c2UgdGhlaXIKLSAgICBmYW1pbGlhciByZXRmIHRyaWNrcyB0byBjYWxsIHRoZW0uLi4gKi8KLSAvKiAobm90ZSB0aGF0IHRoZSBob29raW5nIG1pZ2h0IG5vdCBhY3R1YWxseSB3b3JrIHNpbmNlIERPUzNDYWxsIHN0dWZmCi0gICAgIGlzbid0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCB0aGUgRE9TIFZNIHlldC4uLikgKi8KLSBUUkFDRShtb2R1bGUsIkluaXRpYWxpemluZyBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlXG4iKTsKLSBmb3IgKHg9MDsgeDwyNTY7IHgrKykgaXNyW3hdPVBUUl9TRUdfT0ZGX1RPX1NFR1BUUihTVFVCX1NFR01FTlQseCo0KTsKLSBUUkFDRShtb2R1bGUsIkluaXRpYWxpemluZyBpbnRlcnJ1cHQgc3R1YiB0YWJsZVxuIik7Ci0gZm9yICh4PTA7IHg8MjU2OyB4KyspIHN0dWJbeF09U1RVQih4KTsKLX0KLQogc3RhdGljIHZvaWQgTVpfSW5pdFBTUCggTFBWT0lEIGxwUFNQLCBMUENTVFIgY21kbGluZSwgTFBDU1RSIGVudiApCiB7CiAgUERCKnBzcD1scFBTUDsKQEAgLTg3LDYgKzY2LDM2IEBACiAgLyogRklYTUU6IGludGVncmF0ZSB0aGUgUERCIHN0dWZmIGZyb20gV2luZSAobG9hZGVyL3Rhc2suYykgKi8KIH0KIAorc3RhdGljIGNoYXIgZW50ZXJfcG1bXT17CisgMHg1MCwgICAgICAgICAgIC8qIHB1c2h3ICVheCAqLworIDB4NTIsICAgICAgICAgICAvKiBwdXNodyAlZHggKi8KKyAweDU1LCAgICAgICAgICAgLyogcHVzaHcgJWJwICovCisgMHg4OSwweEU1LCAgICAgIC8qIG1vdncgJXNwLCVicCAqLworLyogZ2V0IHJldHVybiBDUyAqLworIDB4OEIsMHg1NiwweDA4LCAvKiBtb3Z3IDgoJWJwKSwlZHggKi8KKy8qIGp1c3QgY2FsbCBpbnQgMzEgaGVyZSB0byBnZXQgaW50byBwcm90ZWN0ZWQgbW9kZS4uLiAqLworLyogaXQnbGwgY2hlY2sgd2hldGhlciBpdCB3YXMgY2FsbGVkIGZyb20gZHBtaV9zZWcuLi4gKi8KKyAweENELDB4MzEsICAgICAgLyogaW50IDB4MzEgKi8KKy8qIGZpeHVwIG91ciBzdGFjazsgcmV0dXJuIGFkZHJlc3Mgd2lsbCBiZSBsb3N0LCBidXQgd2Ugd29uJ3Qgd29ycnkgcXVpdGUgeWV0ICovCisgMHg4RSwweEQwLCAgICAgIC8qIG1vdncgJWF4LCVzcyAqLworIDB4ODksMHhFQywgICAgICAvKiBtb3Z3ICVicCwlc3AgKi8KKy8qIHNldCByZXR1cm4gQ1MgKi8KKyAweDg5LDB4NTYsMHgwOCwgLyogbW92dyAlZHgsOCglYnApICovCisgMHg1RCwgICAgICAgICAgIC8qIHBvcHcgJWJwICovCisgMHg1QSwgICAgICAgICAgIC8qIHBvcHcgJWR4ICovCisgMHg1OCwgICAgICAgICAgIC8qIHBvcHcgJWF4ICovCisgMHhDQiAgICAgICAgICAgIC8qIHJldGYgKi8KK307CisKK3N0YXRpYyB2b2lkIE1aX0luaXREUE1JKCBMUERPU1RBU0sgbHBEb3NUYXNrICkKK3sKKyBMUEJZVEUgc3RhcnQ9RE9TTUVNX0dldEJsb2NrKGxwRG9zVGFzay0+aE1vZHVsZSxzaXplb2YoZW50ZXJfcG0pLCYobHBEb3NUYXNrLT5kcG1pX3NlZykpOworIAorIGxwRG9zVGFzay0+ZHBtaV9zZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBzdGFydCwgc2l6ZW9mKGVudGVyX3BtKSwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgVFJVRSApOworCisgbWVtY3B5KHN0YXJ0LGVudGVyX3BtLHNpemVvZihlbnRlcl9wbSkpOworfQorCiBpbnQgTVpfSW5pdE1lbW9yeSggTFBET1NUQVNLIGxwRG9zVGFzaywgTkVfTU9EVUxFICpwTW9kdWxlICkKIHsKICBpbnQgeDsKQEAgLTExOCwxMCArMTI3LDkgQEAKICBwTW9kdWxlLT5kb3NfaW1hZ2U9bHBEb3NUYXNrLT5pbWc7CiAKICAvKiBpbml0aWFsaXplIHRoZSBtZW1vcnkgKi8KLSBNWl9Jbml0U3lzdGVtKGxwRG9zVGFzay0+aW1nKTsKICBUUkFDRShtb2R1bGUsIkluaXRpYWxpemluZyBET1MgbWVtb3J5IHN0cnVjdHVyZXNcbiIpOwotIC8qIEZJWE1FOiBtYWtlIERPU01FTV9Jbml0IGNvcHkgc3RhdGljIGRvc21lbSBtZW1vcnkgaW50byBuZXdseSBhbGxvY2F0ZWQgc2hhcmVkIG1lbW9yeSAqLwogIERPU01FTV9Jbml0KGxwRG9zVGFzay0+aE1vZHVsZSk7CisgTVpfSW5pdERQTUkobHBEb3NUYXNrKTsKICByZXR1cm4gMzI7CiB9CiAKQEAgLTE5NSw3ICsyMDMsMTggQEAKICAgfQogIH0KIAorIC8qIGluaXRpYWxpemUgbW9kdWxlIHZhcmlhYmxlcyAqLworIHBNb2R1bGUtPmNzPWxwRG9zVGFzay0+bG9hZF9zZWcrbXpfaGVhZGVyLmVfY3M7CisgcE1vZHVsZS0+aXA9bXpfaGVhZGVyLmVfaXA7CisgcE1vZHVsZS0+c3M9bHBEb3NUYXNrLT5sb2FkX3NlZyttel9oZWFkZXIuZV9zczsKKyBwTW9kdWxlLT5zcD1tel9oZWFkZXIuZV9zcDsKKyBwTW9kdWxlLT5zZWxmX2xvYWRpbmdfc2VsPWxwRG9zVGFzay0+cHNwX3NlZzsKKworIFRSQUNFKG1vZHVsZSwiZW50cnkgcG9pbnQ6ICUwNHg6JTA0eFxuIixwTW9kdWxlLT5jcyxwTW9kdWxlLT5pcCk7CisKICAvKiBpbml0aWFsaXplIHZtODYgc3RydWN0ICovCisgLyogbm90ZTogdGhpcyBtYXkgYmUgbW92ZWQgc29vbiwgdG8gYmUgYWJsZSB0byByZW1vdmUgVk04NiBmcm9tIGxwRG9zVGFzaworICAgIChnb3QgdGlyZWQgb2YgYWxsIHRob3NlIGNvbXBpbGVyIHdhcm5pbmdzLCBhbmQgZG9uJ3QgbGlrZSB0aGUgc3lzdGVtIGRlcGVuZGVuY3kpICovCiAgbWVtc2V0KCZscERvc1Rhc2stPlZNODYsMCxzaXplb2YobHBEb3NUYXNrLT5WTTg2KSk7CiAgbHBEb3NUYXNrLT5WTTg2LnJlZ3MuY3M9bHBEb3NUYXNrLT5sb2FkX3NlZyttel9oZWFkZXIuZV9jczsKICBscERvc1Rhc2stPlZNODYucmVncy5laXA9bXpfaGVhZGVyLmVfaXA7CkBAIC0yMTAsNyArMjI5LDYgQEAKIAogaW50IE1aX0luaXRUYXNrKCBMUERPU1RBU0sgbHBEb3NUYXNrICkKIHsKLSBleHRlcm4gY2hhciAqIERFQlVHX2FyZ3YwOwogIGludCByZWFkX2ZkWzJdLHdyaXRlX2ZkWzJdOwogIHBpZF90IGNoaWxkOwogIGNoYXIgKmZuYW1lLCpmYXJnLGFyZ1sxNl0sZnByb2NbNjRdLHBhdGhbMjU2XSwqZnBhdGg7CkBAIC0yNTAsOSArMjY4LDEzIEBACiAgICAgaWYgKChlcnJubz09RUlOVFIpfHwoZXJybm89PUVBR0FJTikpIGNvbnRpbnVlOwogICAgIC8qIGZhaWx1cmUgKi8KICAgICBFUlIobW9kdWxlLCJkb3Ntb2QgaGFzIGZhaWxlZCB0byBpbml0aWFsaXplXG4iKTsKKyAgICBpZiAobHBEb3NUYXNrLT5tbV9uYW1lWzBdIT0wKSB1bmxpbmsobHBEb3NUYXNrLT5tbV9uYW1lKTsKICAgICByZXR1cm4gMDsKICAgIH0KICAgfSB3aGlsZSAoMCk7CisgIC8qIHRoZSBjaGlsZCBoYXMgbm93IG1tYXBlZCB0aGUgdGVtcCBmaWxlLCBpdCdzIG5vdyBzYWZlIHRvIHVubGluay4KKyAgICogZG8gaXQgaGVyZSB0byBhdm9pZCBsZWF2aW5nIGEgbWVzcyBpbiAvdG1wIGlmL3doZW4gV2luZSBjcmFzaGVzLi4uICovCisgIGlmIChscERvc1Rhc2stPm1tX25hbWVbMF0hPTApIHVubGluayhscERvc1Rhc2stPm1tX25hbWUpOwogICAvKiBhbGwgc3lzdGVtcyBhcmUgbm93IGdvICovCiAgfSBlbHNlIHsKICAgLyogY2hpbGQgcHJvY2VzcyAqLwpAQCAtMjY2LDcgKzI4OCw3IEBACiAgIC8qIGhtbSwgdGhleSBkaWRuJ3QgaW5zdGFsbCBwcm9wZXJseSAqLwogICBleGVjbCgibG9hZGVyL2Rvcy9kb3Ntb2QiLGZuYW1lLGZhcmcsTlVMTCk7CiAgIC8qIGxhc3QgcmVzb3J0LCB0cnkgdG8gZmluZCBpdCB0aHJvdWdoIGFyZ3ZbMF0gKi8KLSAgZnBhdGg9c3RycmNocihzdHJjcHkocGF0aCxERUJVR19hcmd2MCksJy8nKTsKKyAgZnBhdGg9c3RycmNocihzdHJjcHkocGF0aCxPcHRpb25zLmFyZ3YwKSwnLycpOwogICBpZiAoZnBhdGgpIHsKICAgIHN0cmNweShmcGF0aCwiL2xvYWRlci9kb3MvZG9zbW9kIik7CiAgICBleGVjbChwYXRoLGZuYW1lLGZhcmcsTlVMTCk7CkBAIC0zMjMsMTEgKzM0NSw2IEBACiAgICByZXR1cm4gZXJyOwogICB9CiAgIGVyciA9IE1aX0luaXRUYXNrKCBscERvc1Rhc2sgKTsKLSAgaWYgKGxwRG9zVGFzay0+bW1fbmFtZVswXSE9MCkgewotICAgLyogd2UgdW5saW5rIHRoZSB0ZW1wIGZpbGUgaGVyZSB0byBhdm9pZCBsZWF2aW5nIGEgbWVzcyBpbiAvdG1wCi0gICAgICBpZi93aGVuIFdpbmUgY3Jhc2hlczsgdGhlIG1hcHBpbmcgc3RpbGwgcmVtYWlucyBvcGVuLCB0aG91Z2ggKi8KLSAgIHVubGluayhscERvc1Rhc2stPm1tX25hbWUpOwotICB9CiAgIGlmIChlcnI8MzIpIHsKICAgIE1aX0tpbGxNb2R1bGUoIGxwRG9zVGFzayApOwogICAgLyogRklYTUU6IGNsZWFudXAgaE1vZHVsZSAqLwpAQCAtMzUxLDYgKzM2OCw4IEBACiAgY2xvc2UobHBEb3NUYXNrLT5yZWFkX3BpcGUpOwogIGNsb3NlKGxwRG9zVGFzay0+d3JpdGVfcGlwZSk7CiAga2lsbChscERvc1Rhc2stPnRhc2ssU0lHVEVSTSk7CisgaWYgKGxwRG9zVGFzay0+ZHBtaV9zZWwpCisgIFVuTWFwTFMoUFRSX1NFR19PRkZfVE9fU0VHUFRSKGxwRG9zVGFzay0+ZHBtaV9zZWwsMCkpOwogfQogCiBpbnQgTVpfUnVuTW9kdWxlKCBMUERPU1RBU0sgbHBEb3NUYXNrICkKZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCAxYmJlMTFhLi4xYTQ3NjRhIDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC00NTYsMTIgKzQ1NiwzNSBAQAogCiAgICAgaWYgKGxwQXBwbGljYXRpb25OYW1lKQogICAgICAgICBsc3RyY3B5bjMyQShuYW1lLCBscEFwcGxpY2F0aW9uTmFtZSwgc2l6ZW9mKG5hbWUpIC0gNCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY2hhciAqcHRyID0gc3RyY2hyKGxwQ29tbWFuZExpbmUsICcgJyk7Ci0gICAgICAgIGludCBsZW4gPSAocHRyPyBwdHItbHBDb21tYW5kTGluZSA6IHN0cmxlbihscENvbW1hbmRMaW5lKSkgKyAxOwotICAgICAgICBpZiAobGVuID4gc2l6ZW9mKG5hbWUpIC0gNCkgbGVuID0gc2l6ZW9mKG5hbWUpIC0gNDsKLSAgICAgICAgbHN0cmNweW4zMkEobmFtZSwgbHBDb21tYW5kTGluZSwgbGVuKTsKKyAgICBlbHNlIHsKKyAgICAgICAgY2hhcgkqcHRyOworICAgICAgICBpbnQJbGVuOworCisJLyogVGFrZSBjYXJlIG9mZiAuZXhlcyB3aXRoIHNwYWNlcyBpbiB0aGVpciBuYW1lcyAqLworCXB0ciA9IHN0cmNocihscENvbW1hbmRMaW5lLCAnICcpOworCWRvIHsKKwkgICAgbGVuID0gKHB0cj8gcHRyLWxwQ29tbWFuZExpbmUgOiBzdHJsZW4obHBDb21tYW5kTGluZSkpICsgMTsKKwkgICAgaWYgKGxlbiA+IHNpemVvZihuYW1lKSAtIDQpIGxlbiA9IHNpemVvZihuYW1lKSAtIDQ7CisJICAgIGxzdHJjcHluMzJBKG5hbWUsIGxwQ29tbWFuZExpbmUsIGxlbik7CisJICAgIGlmICghc3RyY2hyKG5hbWUsICdcXCcpICYmICFzdHJjaHIobmFtZSwgJy4nKSkKKwkJc3RyY2F0KG5hbWUsICIuZXhlIik7CisJICAgIGZwcmludGYoc3RkZXJyLCJsb29raW5nIGZvcjogJXNcbiIsbmFtZSk7CisJICAgIGlmIChHZXRGaWxlQXR0cmlidXRlczMyQShuYW1lKSE9LTEpCisJICAgIAlicmVhazsKKwkgICAgLyogaWYgdGhlcmUgaXMgYSBzcGFjZSBhbmQgbm8gZmlsZSBmb3VuZCB5ZXQsIGluY2x1ZGUgdGhlIHdvcmQKKwkgICAgICogdXAgdG8gdGhlIG5leHQgc3BhY2UgdG9vLiBJZiB0aGVyZSBpcyBubyBuZXh0IHNwYWNlLCBqdXN0CisJICAgICAqIHVzZSB0aGUgZmlyc3Qgd29yZC4KKwkgICAgICovCisJICAgIGlmIChwdHIpIHsKKwkgICAgCXB0ciA9IHN0cmNocihwdHIrMSwgJyAnKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHB0ciA9IHN0cmNocihscENvbW1hbmRMaW5lLCAnICcpOworCQlsZW4gPSAocHRyPyBwdHItbHBDb21tYW5kTGluZSA6IHN0cmxlbihscENvbW1hbmRMaW5lKSkgKyAxOworCQlpZiAobGVuID4gc2l6ZW9mKG5hbWUpIC0gNCkgbGVuID0gc2l6ZW9mKG5hbWUpIC0gNDsKKwkJbHN0cmNweW4zMkEobmFtZSwgbHBDb21tYW5kTGluZSwgbGVuKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9IHdoaWxlICgxKTsKICAgICB9CiAKICAgICBpZiAoIXN0cmNocihuYW1lLCAnXFwnKSAmJiAhc3RyY2hyKG5hbWUsICcuJykpCkBAIC02MTMsMTQgKzYzNiwyMiBAQAogICAgICAgICBEV09SRCBzaXplCQkvKiBbaW5dIHNpemUgb2YgZmlsZW5hbWVidWZmZXIgKi8KICkgeyAgICAgICAgICAgICAgICAgICAKICAgICBXSU5FX01PRFJFRiAqd20gPSBNT0RVTEUzMl9Mb29rdXBITU9EVUxFKFBST0NFU1NfQ3VycmVudCgpLGhNb2R1bGUpOworICAgIGNoYXIgKnA7CiAKICAgICBpZiAoIXdtKSAvKiBjYW4gaGFwcGVuIG9uIHN0YXJ0IHVwIG9yIHRoZSBsaWtlICovCiAgICAgCXJldHVybiAwOwogCiAgICAgLyogRklYTUU6IHdlIHNob3VsZCBwcm9iYWJseSBnZXQgYSByZWFsIGxvbmcgbmFtZSwgYnV0IHdtLT5sb25nbmFtZQogICAgICAqIGlzIGN1cnJlbnRseSBhIFVOSVggZmlsZW5hbWUhCisgICAgICogVXNlIHRoZSBtb2R1bGUgbmFtZSB0byBhdCBsZWFzdCBnZXQgdGhlIGxvbmcgdmVyc2lvbiBvZiB0aGUgZmlsZW5hbWUuCiAgICAgICovCiAgICAgbHN0cmNweW4zMkEoIGxwRmlsZU5hbWUsIHdtLT5zaG9ydG5hbWUsIHNpemUgKTsKKyAgICBpZiAoIChwID0gc3RycmNociggbHBGaWxlTmFtZSwgJ1xcJyApKSApIHsKKyAgICAgIHArKzsKKyAgICAgIHNpemUgLT0gKHAtbHBGaWxlTmFtZSk7CisgICAgICBsc3RyY3B5bjMyQSggcCwgd20tPm1vZG5hbWUsIHNpemUpOworICAgIH0KKyAgICAgICAKICAgICBUUkFDRShtb2R1bGUsICIlc1xuIiwgbHBGaWxlTmFtZSApOwogICAgIHJldHVybiBzdHJsZW4obHBGaWxlTmFtZSk7CiB9ICAgICAgICAgICAgICAgICAgIApAQCAtNzA0LDcgKzczNSw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRnJlZUxpYnJhcnkzMihISU5TVEFOQ0UzMiBoTGliTW9kdWxlKQogewotICAgIEZJWE1FKG1vZHVsZSwiKCUwOHgpOiBzdHViXG4iLCBoTGliTW9kdWxlKTsKKyAgICBGSVhNRShtb2R1bGUsIigweCUwOHgpOiBzdHViXG4iLCBoTGliTW9kdWxlKTsKICAgICByZXR1cm4gVFJVRTsgIC8qIEZJWE1FICovCiB9CiAKQEAgLTEwMDgsMyArMTAzOSw0NCBAQAogICAgIGlmICghd20gfHwgKHdtLT50eXBlICE9IE1PRFVMRTMyX1BFKSkgcmV0dXJuIChMUElNQUdFX05UX0hFQURFUlMpMDsKICAgICByZXR1cm4gUEVfSEVBREVSKHdtLT5tb2R1bGUpOwogfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBIYXNHUEhhbmRsZXIgICAgICAgICAgICAgICAgICAgIChLRVJORUwuMzM4KQorICovCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgX0dQSEFORExFUkRFRgoreworICAgIFdPUkQgc2VsZWN0b3I7CisgICAgV09SRCByYW5nZVN0YXJ0OworICAgIFdPUkQgcmFuZ2VFbmQ7CisgICAgV09SRCBoYW5kbGVyOworfSBHUEhBTkRMRVJERUY7CisjcHJhZ21hIHBhY2soNCkKKworU0VHUFRSIFdJTkFQSSBIYXNHUEhhbmRsZXIoIFNFR1BUUiBhZGRyZXNzICkKK3sKKyAgICBITU9EVUxFMTYgaE1vZHVsZTsKKyAgICBTRUdQVFIgZ3BQdHI7CisgICAgR1BIQU5ETEVSREVGICpncEhhbmRsZXI7CisgICAKKyAgICBpZiAoICAgIChoTW9kdWxlID0gRmFyR2V0T3duZXIoIFNFTEVDVE9ST0YoYWRkcmVzcykgKSkgIT0gMAorICAgICAgICAgJiYgKGdwUHRyID0gKFNFR1BUUilXSU4zMl9HZXRQcm9jQWRkcmVzczE2KCBoTW9kdWxlLCAiX19HUCIgKSkgIT0gMAorICAgICAgICAgJiYgIUlzQmFkUmVhZFB0cjE2KCBncFB0ciwgc2l6ZW9mKEdQSEFORExFUkRFRikgKQorICAgICAgICAgJiYgKGdwSGFuZGxlciA9IFBUUl9TRUdfVE9fTElOKCBncFB0ciApKSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHdoaWxlIChncEhhbmRsZXItPnNlbGVjdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICAgIFNFTEVDVE9ST0YoYWRkcmVzcykgPT0gZ3BIYW5kbGVyLT5zZWxlY3RvcgorICAgICAgICAgICAgICAgICAmJiBPRkZTRVRPRihhZGRyZXNzKSAgID49IGdwSGFuZGxlci0+cmFuZ2VTdGFydAorICAgICAgICAgICAgICAgICAmJiBPRkZTRVRPRihhZGRyZXNzKSAgIDwgIGdwSGFuZGxlci0+cmFuZ2VFbmQgICkKKyAgICAgICAgICAgICAgICByZXR1cm4gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBncEhhbmRsZXItPnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwSGFuZGxlci0+aGFuZGxlciApOworICAgICAgICAgICAgZ3BIYW5kbGVyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lL21vZHVsZS5jIGIvbG9hZGVyL25lL21vZHVsZS5jCmluZGV4IGZiM2IxNjguLjNlMTkzYWMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9tb2R1bGUuYworKysgYi9sb2FkZXIvbmUvbW9kdWxlLmMKQEAgLTgzLDkgKzgzLDkgQEAKICAgICBEVU1QKCAiU2VnbWVudCB0YWJsZTpcbiIgKTsKICAgICBwU2VnID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICk7CiAgICAgZm9yIChpID0gMDsgaSA8IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrLCBwU2VnKyspCi0gICAgICAgIERVTVAoICIlMDJ4OiBwb3M9JWQgc2l6ZT0lZCBmbGFncz0lMDR4IG1pbnNpemU9JWQgc2VsPSUwNHhcbiIsCisgICAgICAgIERVTVAoICIlMDJ4OiBwb3M9JWQgc2l6ZT0lZCBmbGFncz0lMDR4IG1pbnNpemU9JWQgaFNlZz0lMDR4XG4iLAogCSAgICAgIGkgKyAxLCBwU2VnLT5maWxlcG9zLCBwU2VnLT5zaXplLCBwU2VnLT5mbGFncywKLQkgICAgICBwU2VnLT5taW5zaXplLCBwU2VnLT5zZWxlY3RvciApOworCSAgICAgIHBTZWctPm1pbnNpemUsIHBTZWctPmhTZWcgKTsKIAogICAgICAgLyogRHVtcCB0aGUgcmVzb3VyY2UgdGFibGUgKi8KICAgICBEVU1QKCAiLS0tXG4iICk7CkBAIC0zMzIsNyArMzMyLDcgQEAKICAgICB9CiAKICAgICBpZiAoc2VsID09IDB4ZmUpIHNlbCA9IDB4ZmZmZjsgIC8qIGNvbnN0YW50IGVudHJ5ICovCi0gICAgZWxzZSBzZWwgPSAoV09SRCkoRFdPUkQpTkVfU0VHX1RBQkxFKHBNb2R1bGUpW3NlbC0xXS5zZWxlY3RvcjsKKyAgICBlbHNlIHNlbCA9IEdsb2JhbEhhbmRsZVRvU2VsKE5FX1NFR19UQUJMRShwTW9kdWxlKVtzZWwtMV0uaFNlZyk7CiAgICAgaWYgKHNlbD09MHhmZmZmKQogCXJldHVybiAoRkFSUFJPQzE2KVBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggc2VsLCBvZmZzZXQgKTsKICAgICBpZiAoIWZuU05PT1AxNl9HZXRQcm9jQWRkcmVzczE2KQpAQCAtMTE3MCwzICsxMTcwLDE3IEBACiBSRUdTX0VOVFJZUE9JTlQoTWFwSEluc3RTTCkgewogCUVBWF9yZWcoY29udGV4dCkgPSBNYXBITW9kdWxlU0woRUFYX3JlZyhjb250ZXh0KSk7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlXSU4xNl9NYXBISW5zdExTCQkoS0VSTkVMLjQ3MikKKyAqLworVk9JRCBXSU5BUEkgV0lOMTZfTWFwSEluc3RMUyggQ09OVEVYVCAqY29udGV4dCApIHsKKwlFQVhfcmVnKGNvbnRleHQpID0gTWFwSE1vZHVsZUxTKEVBWF9yZWcoY29udGV4dCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0lOMTZfTWFwSEluc3RTTAkJKEtFUk5FTC40NzMpCisgKi8KK1ZPSUQgV0lOQVBJIFdJTjE2X01hcEhJbnN0U0woIENPTlRFWFQgKmNvbnRleHQgKSB7CisJRUFYX3JlZyhjb250ZXh0KSA9IE1hcEhNb2R1bGVTTChFQVhfcmVnKGNvbnRleHQpKTsKK30KZGlmZiAtLWdpdCBhL2xvYWRlci9uZS9zZWdtZW50LmMgYi9sb2FkZXIvbmUvc2VnbWVudC5jCmluZGV4IDgyMTVjMzAuLjMxYzg1MjIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9zZWdtZW50LmMKKysrIGIvbG9hZGVyL25lL3NlZ21lbnQuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCisjZGVmaW5lIFNFTCh4KSBHbG9iYWxIYW5kbGVUb1NlbCh4KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBORV9HZXRSZWxvY0FkZHJOYW1lCkBAIC03MywyNyArNzQsMjcgQEAKICAgICBpZiAoIXBTZWctPmZpbGVwb3MpIHJldHVybiBUUlVFOyAgLyogTm8gZmlsZSBpbWFnZSwganVzdCByZXR1cm4gKi8KIAkKICAgICBmZCA9IE5FX09wZW5GaWxlKCBwTW9kdWxlICk7Ci0gICAgVFJBQ0UobW9kdWxlLCAiTG9hZGluZyBzZWdtZW50ICVkLCBzZWxlY3Rvcj0lMDR4LCBmbGFncz0lMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yLCBwU2VnLT5mbGFncyApOworICAgIFRSQUNFKG1vZHVsZSwgIkxvYWRpbmcgc2VnbWVudCAlZCwgaFNlZz0lMDR4LCBmbGFncz0lMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPmhTZWcsIHBTZWctPmZsYWdzICk7CiAgICAgbHNlZWsoIGZkLCBwU2VnLT5maWxlcG9zIDw8IHBNb2R1bGUtPmFsaWdubWVudCwgU0VFS19TRVQgKTsKICAgICBpZiAocFNlZy0+c2l6ZSkgc2l6ZSA9IHBTZWctPnNpemU7CiAgICAgZWxzZSBpZiAocFNlZy0+bWluc2l6ZSkgc2l6ZSA9IHBTZWctPm1pbnNpemU7CiAgICAgZWxzZSBzaXplID0gMHgxMDAwMDsKLSAgICBtZW0gPSBHbG9iYWxMb2NrMTYocFNlZy0+c2VsZWN0b3IpOworICAgIG1lbSA9IEdsb2JhbExvY2sxNihwU2VnLT5oU2VnKTsKICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0VMRkxPQUQgJiYgc2VnbnVtID4gMSkKICAgICB7CiAgCS8qIEltcGxlbWVudCBzZWxmIGxvYWRpbmcgc2VnbWVudHMgKi8KICAJU0VMRkxPQURIRUFERVIgKnNlbGZsb2FkaGVhZGVyOwogICAgICAgICBTVEFDSzE2RlJBTUUgKnN0YWNrMTZUb3A7CiAgICAgICAgIERXT1JEIG9sZHN0YWNrOwotIAlXT1JEIG9sZHNlbGVjdG9yLCBuZXdzZWxlY3RvcjsKKyAJV09SRCBvbGRfaFNlZywgbmV3X2hTZWc7CiAgICAgICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogICAgICAgICBIRklMRTMyIGhmID0gRklMRV9EdXBVbml4SGFuZGxlKCBmZCApOwogCiAgCXNlbGZsb2FkaGVhZGVyID0gKFNFTEZMT0FESEVBREVSICopCi0gCQlQVFJfU0VHX09GRl9UT19MSU4ocFNlZ1RhYmxlLT5zZWxlY3RvciwwKTsKKyAJCVBUUl9TRUdfT0ZGX1RPX0xJTihTRUwocFNlZ1RhYmxlLT5oU2VnKSwwKTsKICAJb2xkc3RhY2sgPSB0aGRiLT5jdXJfc3RhY2s7Ci0gCW9sZHNlbGVjdG9yID0gcFNlZy0+c2VsZWN0b3I7CisgCW9sZF9oU2VnID0gcFNlZy0+aFNlZzsKICAJdGhkYi0+Y3VyX3N0YWNrID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKHBNb2R1bGUtPnNlbGZfbG9hZGluZ19zZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwIC0gc2l6ZW9mKCpzdGFjazE2VG9wKSk7CiAgICAgICAgIHN0YWNrMTZUb3AgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4odGhkYi0+Y3VyX3N0YWNrKTsKQEAgLTEwNywyNyArMTA4LDI3IEBACiAgICAgICAgIHN0YWNrMTZUb3AtPmNzID0gMDsKIAlUUkFDRShkbGwsIkNhbGxMb2FkQXBwU2VnUHJvYyhobW9kdWxlPTB4JTA0eCxoZj0weCUwNHgsc2VnbnVtPSVkXG4iLAogCQlwTW9kdWxlLT5zZWxmLGhmLHNlZ251bSApOwotIAluZXdzZWxlY3RvciA9IENhbGxiYWNrcy0+Q2FsbExvYWRBcHBTZWdQcm9jKHNlbGZsb2FkaGVhZGVyLT5Mb2FkQXBwU2VnLAorIAluZXdfaFNlZyA9IENhbGxiYWNrcy0+Q2FsbExvYWRBcHBTZWdQcm9jKHNlbGZsb2FkaGVhZGVyLT5Mb2FkQXBwU2VnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2R1bGUtPnNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEZJTEUzMl9UT19IRklMRTE2KGhmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdudW0gKTsKLQlUUkFDRShkbGwsIlJldCBDYWxsTG9hZEFwcFNlZ1Byb2M6IHNlbGVjdG9yID0gMHglMDR4XG4iLG5ld3NlbGVjdG9yKTsKKwlUUkFDRShkbGwsIlJldCBDYWxsTG9hZEFwcFNlZ1Byb2M6IGhTZWcgPSAweCUwNHhcbiIsbmV3X2hTZWcpOwogICAgICAgICBfbGNsb3NlMzIoIGhmICk7Ci0gCWlmIChuZXdzZWxlY3RvciAhPSBvbGRzZWxlY3RvcikgeworIAlpZiAoU0VMKG5ld19oU2VnKSAhPSBTRUwob2xkX2hTZWcpKSB7CiAgCSAgLyogU2VsZiBsb2FkZXJzIGxpa2UgY3JlYXRpbmcgdGhlaXIgb3duIHNlbGVjdG9yczsgCiAgCSAgICogdGhleSBsb3ZlIGFza2luZyBmb3IgdHJvdWJsZSB0byBXaW5lIGRldmVsb3BlcnMKICAJICAgKi8KICAJICBpZiAoc2VnbnVtID09IHBNb2R1bGUtPmRncm91cCkgewotIAkgICAgbWVtY3B5KFBUUl9TRUdfT0ZGX1RPX0xJTihvbGRzZWxlY3RvciwwKSwKLSAJCSAgIFBUUl9TRUdfT0ZGX1RPX0xJTihuZXdzZWxlY3RvciwwKSwgCisgCSAgICBtZW1jcHkoUFRSX1NFR19PRkZfVE9fTElOKFNFTChvbGRfaFNlZyksMCksCisgCQkgICBQVFJfU0VHX09GRl9UT19MSU4oU0VMKG5ld19oU2VnKSwwKSwgCiAgCQkgICBwU2VnLT5taW5zaXplID8gcFNlZy0+bWluc2l6ZSA6IDB4MTAwMDApOwotIAkgICAgRnJlZVNlbGVjdG9yKG5ld3NlbGVjdG9yKTsKLSAJICAgIHBTZWctPnNlbGVjdG9yID0gb2xkc2VsZWN0b3I7Ci0gCSAgICBUUkFDRShtb2R1bGUsICJOZXcgc2VsZWN0b3IgYWxsb2NhdGVkIGZvciBkZ3JvdXAgc2VnbWVudDpPbGQ9JWQsTmV3PSVkXG4iLCAKLSAgICAgICAgICAgICAgICBvbGRzZWxlY3RvciwgbmV3c2VsZWN0b3IpOworIAkgICAgRnJlZVNlbGVjdG9yKFNFTChuZXdfaFNlZykpOworIAkgICAgcFNlZy0+aFNlZyA9IG9sZF9oU2VnOworIAkgICAgVFJBQ0UobW9kdWxlLCAiTmV3IGhTZWcgYWxsb2NhdGVkIGZvciBkZ3JvdXAgc2VnbWVudDpPbGQ9JWQsTmV3PSVkXG4iLCAKKyAgICAgICAgICAgICAgICBvbGRfaFNlZywgbmV3X2hTZWcpOwogIAkgIH0gZWxzZSB7Ci0gCSAgICBGcmVlU2VsZWN0b3IocFNlZy0+c2VsZWN0b3IpOwotIAkgICAgcFNlZy0+c2VsZWN0b3IgPSBuZXdzZWxlY3RvcjsKKyAJICAgIEZyZWVTZWxlY3RvcihTRUwocFNlZy0+aFNlZykpOworIAkgICAgcFNlZy0+aFNlZyA9IG5ld19oU2VnOwogIAkgIH0KICAJfSAKICAJCkBAIC0xNjYsMTQgKzE2NywxNCBAQAogICAgIHJlYWQoIGZkLCAmY291bnQsIHNpemVvZihjb3VudCkgKTsKICAgICBpZiAoIWNvdW50KSByZXR1cm4gVFJVRTsKIAotICAgIFRSQUNFKGZpeHVwLCAiRml4dXBzIGZvciAlLipzLCBzZWdtZW50ICVkLCBzZWxlY3RvciAlMDR4XG4iLAorICAgIFRSQUNFKGZpeHVwLCAiRml4dXBzIGZvciAlLipzLCBzZWdtZW50ICVkLCBoU2VnICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwKLSAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yICk7Ci0gICAgVFJBQ0Uoc2VnbWVudCwgIkZpeHVwcyBmb3IgJS4qcywgc2VnbWVudCAlZCwgc2VsZWN0b3IgJTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPmhTZWcgKTsKKyAgICBUUkFDRShzZWdtZW50LCAiRml4dXBzIGZvciAlLipzLCBzZWdtZW50ICVkLCBoU2VnICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwKLSAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yICk7CisgICAgICAgICAgICAgICAgICAgc2VnbnVtLCBwU2VnLT5oU2VnICk7CiAKICAgICByZWxvY19lbnRyaWVzID0gKHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MgKil4bWFsbG9jKGNvdW50ICogc2l6ZW9mKHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MpKTsKICAgICBpZiAocmVhZCggZmQsIHJlbG9jX2VudHJpZXMsIGNvdW50ICogc2l6ZW9mKHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MpKSAhPQpAQCAtMjY4LDcgKzI2OSw3IEBACiAJICAgIH0KIAkgICAgZWxzZQogCSAgICB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IChGQVJQUk9DMTYpUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBwU2VnVGFibGVbcmVwLT50YXJnZXQxLTFdLnNlbGVjdG9yLCByZXAtPnRhcmdldDIgKTsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gKEZBUlBST0MxNilQVFJfU0VHX09GRl9UT19TRUdQVFIoIFNFTChwU2VnVGFibGVbcmVwLT50YXJnZXQxLTFdLmhTZWcpLCByZXAtPnRhcmdldDIgKTsKIAkgICAgfQogCSAgICAKIAkgICAgVFJBQ0UoIGZpeHVwLCIlZDogJTA0eDolMDR4ICVzXG4iLCAKQEAgLTMwNiw3ICszMDcsNyBAQAogCiAgICAgICAgIGlmIChhZGRpdGl2ZSkKICAgICAgICAgewotICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKKyAgICAgICAgICAgIHNwID0gUFRSX1NFR19PRkZfVE9fTElOKCBTRUwocFNlZy0+aFNlZyksIG9mZnNldCApOwogICAgICAgICAgICAgVFJBQ0UoIGZpeHVwLCIgICAgJTA0eDolMDR4XG4iLCBvZmZzZXQsICpzcCApOwogICAgICAgICAgICAgc3dpdGNoIChyZXAtPmFkZHJlc3NfdHlwZSAmIDB4N2YpCiAgICAgICAgICAgICB7CkBAIC0zMzUsNyArMzM2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgZG8KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOworICAgICAgICAgICAgICAgIHNwID0gUFRSX1NFR19PRkZfVE9fTElOKCBTRUwocFNlZy0+aFNlZyksIG9mZnNldCApOwogICAgICAgICAgICAgICAgIG5leHRfb2Zmc2V0ID0gKnNwOwogICAgICAgICAgICAgICAgIFRSQUNFKCBmaXh1cCwiICAgICUwNHg6JTA0eFxuIiwgb2Zmc2V0LCAqc3AgKTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlcC0+YWRkcmVzc190eXBlICYgMHg3ZikKQEAgLTM1Niw3ICszNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIHVua25vd247CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChuZXh0X29mZnNldCA9PSBvZmZzZXQpIGJyZWFrOyAgLyogYXZvaWQgaW5maW5pdGUgbG9vcCAqLwotICAgICAgICAgICAgICAgIGlmIChuZXh0X29mZnNldCA+PSBHbG9iYWxTaXplMTYocFNlZy0+c2VsZWN0b3IpKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobmV4dF9vZmZzZXQgPj0gR2xvYmFsU2l6ZTE2KHBTZWctPmhTZWcpKSBicmVhazsKICAgICAgICAgICAgICAgICBvZmZzZXQgPSBuZXh0X29mZnNldDsKICAgICAgICAgICAgIH0gd2hpbGUgKG9mZnNldCAhPSAweGZmZmYpOwogICAgICAgICB9CkBAIC0zOTIsMTQgKzM5MywxNCBAQAogICAgICAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKICAgICAgICAgSE1PRFVMRTE2IGhzZWxmbG9hZCA9IEdldE1vZHVsZUhhbmRsZTE2KCJXUFJPQ1MiKTsKICAgICAgICAgRFdPUkQgb2xkc3RhY2s7Ci0gICAgICAgIFdPUkQgc2F2ZWRfZGdyb3VwID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cCAtIDFdLnNlbGVjdG9yOworICAgICAgICBXT1JEIHNhdmVkX2hTZWcgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uaFNlZzsKIAogICAgICAgICBUUkFDRShtb2R1bGUsICIlLipzIGlzIGEgc2VsZi1sb2FkaW5nIG1vZHVsZSFcbiIsCiAJCSAgICAgKigoQllURSopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAogCQkgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxKTsKICAgICAgICAgaWYgKCFORV9Mb2FkU2VnbWVudCggcE1vZHVsZSwgMSApKSByZXR1cm4gRkFMU0U7CiAgICAgICAgIHNlbGZsb2FkaGVhZGVyID0gKFNFTEZMT0FESEVBREVSICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX0xJTihwU2VnVGFibGUtPnNlbGVjdG9yLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSX1NFR19PRkZfVE9fTElOKFNFTChwU2VnVGFibGUtPmhTZWcpLCAwKTsKICAgICAgICAgc2VsZmxvYWRoZWFkZXItPkVudHJ5QWRkclByb2MgPSBORV9HZXRFbnRyeVBvaW50KGhzZWxmbG9hZCwyNyk7CiAgICAgICAgIHNlbGZsb2FkaGVhZGVyLT5NeUFsbG9jICA9IE5FX0dldEVudHJ5UG9pbnQoaHNlbGZsb2FkLDI4KTsKICAgICAgICAgc2VsZmxvYWRoZWFkZXItPlNldE93bmVyID0gTkVfR2V0RW50cnlQb2ludChHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksNDAzKTsKQEAgLTQyNSw4ICs0MjYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRklMRTMyX1RPX0hGSUxFMTYoaGYpKTsKIAlUUkFDRShkbGwsIlJldHVybiBmcm9tIENhbGxCb290QXBwUHJvY1xuIik7CiAgICAgICAgIF9sY2xvc2UzMihoZik7Ci0gICAgICAgIC8qIHNvbWUgQm9vdEFwcCBwcm9jcyBvdmVyd3JpdGUgdGhlIHNlbGVjdG9yIG9mIGRncm91cCAqLwotICAgICAgICBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3IgPSBzYXZlZF9kZ3JvdXA7CisgICAgICAgIC8qIHNvbWUgQm9vdEFwcCBwcm9jcyBvdmVyd3JpdGUgdGhlIHNlZ21lbnQgaGFuZGxlIG9mIGRncm91cCAqLworICAgICAgICBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uaFNlZyA9IHNhdmVkX2hTZWc7CiAgICAgICAgIHRoZGItPmN1cl9zdGFjayA9IG9sZHN0YWNrOwogCiAJLyogRklYTUUKQEAgLTQ2MCw3ICs0NjEsNyBAQAogCiAgICAgcFNlZ1RhYmxlID0gTkVfU0VHX1RBQkxFKHBNb2R1bGUpOwogICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19TSU5HTEVEQVRBKQotICAgICAgICBkZ3JvdXAgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwLTFdLnNlbGVjdG9yOworICAgICAgICBkZ3JvdXAgPSBTRUwocFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cC0xXS5oU2VnKTsKIAogICAgIFRSQUNFKG1vZHVsZSwgIiglMDR4KVxuIiwgcE1vZHVsZS0+c2VsZiApOwogICAgIHAgPSAoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5lbnRyeV90YWJsZTsKQEAgLTQ5MSwxMCArNDkyLDEwIEBACiAJICAgICAqLwogCSAgICBpZiAoc2VsID09IDB4ZmYpIHsgLyogbW92ZWFibGUgKi8KIAkJZHNwcmludGYobW9kdWxlLCAiKCUwMngpIG8gJTA0eCIsIHBbM10sICooV09SRCAqKShwKzQpICk7Ci0JCWZpeHVwX3B0ciA9IChjaGFyICopR0VUX1NFTF9CQVNFKHBTZWdUYWJsZVtwWzNdLTFdLnNlbGVjdG9yKSArICooV09SRCAqKShwICsgNCk7CisJCWZpeHVwX3B0ciA9IChjaGFyICopR0VUX1NFTF9CQVNFKFNFTChwU2VnVGFibGVbcFszXS0xXS5oU2VnKSkgKyAqKFdPUkQgKikocCArIDQpOwogCSAgICB9IGVsc2UgeyAvKiBmaXhlZCAqLwogCQlkc3ByaW50Zihtb2R1bGUsICJvZmZzZXQgJTA0eCIsICooV09SRCAqKShwKzEpICk7Ci0JCWZpeHVwX3B0ciA9IChjaGFyICopR0VUX1NFTF9CQVNFKHBTZWdUYWJsZVtzZWwtMV0uc2VsZWN0b3IpICsgCisJCWZpeHVwX3B0ciA9IChjaGFyICopR0VUX1NFTF9CQVNFKFNFTChwU2VnVGFibGVbc2VsLTFdLmhTZWcpKSArIAogCQkgICooV09SRCAqKShwICsgMSk7CiAJICAgIH0KIAkgICAgVFJBQ0UobW9kdWxlLCAiJXMgU2lnbmF0dXJlOiAlMDJ4ICUwMnggJTAyeCxmZiAleFxuIiwKQEAgLTU2NCw3ICs1NjUsNyBAQAogICAgIGVsc2UgIC8qIERBVEEgU0lOR0xFIERMTCAqLwogICAgIHsKIAlpZiAocE1vZHVsZS0+ZGdyb3VwKSB7Ci0gICAgICAgICAgICAqZHMgICA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAtMV0uc2VsZWN0b3I7CisgICAgICAgICAgICAqZHMgICA9IFNFTChwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwLTFdLmhTZWcpOwogICAgICAgICAgICAgKmhlYXAgPSBwTW9kdWxlLT5oZWFwX3NpemU7CiAJfQogCWVsc2UgLyogaG1tLCBETEwgaGFzIG5vIGRncm91cCwKQEAgLTYyNSw3ICs2MjYsNyBAQAogICAgIERTX3JlZygmY29udGV4dCkgID0gZHM7CiAgICAgRVNfcmVnKCZjb250ZXh0KSAgPSBkczsgICAvKiB3aG8ga25vd3MgLi4uICovCiAKLSAgICBDU19yZWcoJmNvbnRleHQpICA9IHBTZWdUYWJsZVtwTW9kdWxlLT5jcy0xXS5zZWxlY3RvcjsKKyAgICBDU19yZWcoJmNvbnRleHQpICA9IFNFTChwU2VnVGFibGVbcE1vZHVsZS0+Y3MtMV0uaFNlZyk7CiAgICAgRUlQX3JlZygmY29udGV4dCkgPSBwTW9kdWxlLT5pcDsKICAgICBFQlBfcmVnKCZjb250ZXh0KSA9IE9GRlNFVE9GKFRIUkVBRF9DdXJyZW50KCktPmN1cl9zdGFjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoV09SRCkmKChTVEFDSzE2RlJBTUUqKTApLT5icDsKQEAgLTczMywxMyArNzM0LDEzIEBACiAgICAgfQogCiAgICAgcFNlZ21lbnQgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKSArIHBNb2R1bGUtPmRncm91cCAtIDE7Ci0gICAgaWYgKHByZXYpICpwcmV2ID0gcFNlZ21lbnQtPnNlbGVjdG9yOworICAgIGlmIChwcmV2KSAqcHJldiA9IFNFTChwU2VnbWVudC0+aFNlZyk7CiAKICAgICAgIC8qIGlmIGl0J3MgYSBsaWJyYXJ5LCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb25seSB0aGUgZmlyc3QgdGltZSAqLwotICAgIGlmIChwU2VnbWVudC0+c2VsZWN0b3IpCisgICAgaWYgKHBTZWdtZW50LT5oU2VnKQogICAgIHsKLSAgICAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX0xJQk1PRFVMRSkgcmV0dXJuIHBTZWdtZW50LT5zZWxlY3RvcjsKLSAgICAgICAgaWYgKGxpYl9vbmx5KSByZXR1cm4gcFNlZ21lbnQtPnNlbGVjdG9yOworICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSByZXR1cm4gU0VMKHBTZWdtZW50LT5oU2VnKTsKKyAgICAgICAgaWYgKGxpYl9vbmx5KSByZXR1cm4gU0VMKHBTZWdtZW50LT5oU2VnKTsKICAgICB9CiAKICAgICBtaW5zaXplID0gcFNlZ21lbnQtPm1pbnNpemUgPyBwU2VnbWVudC0+bWluc2l6ZSA6IDB4MTAwMDA7CkBAIC03NDgsNyArNzQ5LDcgQEAKICAgICBoTmV3SW5zdGFuY2UgPSBHTE9CQUxfQWxsb2MoIEdNRU1fWkVST0lOSVQgfCBHTUVNX0ZJWEVELCBtaW5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+c2VsZiwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOwogICAgIGlmICghaE5ld0luc3RhbmNlKSByZXR1cm4gMDsKLSAgICBwU2VnbWVudC0+c2VsZWN0b3IgPSBoTmV3SW5zdGFuY2U7CisgICAgcFNlZ21lbnQtPmhTZWcgPSBoTmV3SW5zdGFuY2U7CiAgICAgcFNlZ21lbnQtPmZsYWdzIHw9IE5FX1NFR0ZMQUdTX0FMTE9DQVRFRDsKICAgICByZXR1cm4gaE5ld0luc3RhbmNlOwogfQpAQCAtNzc1LDcgKzc3Niw3IEBACiBzdGF0aWMgV09SRCBORV9OZTJNZW1GbGFncyhXT1JEIGZsYWdzKQogeyAKICAgICBXT1JEIG1lbWZsYWdzID0gMDsKLSNpZiAwCisjaWYgMQogICAgIGlmIChmbGFncyAmIE5FX1NFR0ZMQUdTX0RJU0NBUkRBQkxFKSAKICAgICAgIG1lbWZsYWdzIHw9IEdNRU1fRElTQ0FSREFCTEU7CiAgICAgaWYgKGZsYWdzICYgTkVfU0VHRkxBR1NfTU9WRUFCTEUgfHwgCkBAIC03ODgsOCArNzg5LDggQEAKICAgICBtZW1mbGFncyB8PSBHTUVNX1pFUk9JTklUOwogI2Vsc2UKICAgICBtZW1mbGFncyA9IEdNRU1fWkVST0lOSVQgfCBHTUVNX0ZJWEVEOwotICAgIHJldHVybiBtZW1mbGFnczsKICNlbmRpZgorICAgIHJldHVybiBtZW1mbGFnczsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04MjAsMTIgKzgyMSwxMiBAQAogICAgICAgICBpZiAoaSA9PSBwTW9kdWxlLT5zcykgbWluc2l6ZSArPSBwTW9kdWxlLT5zdGFja19zaXplOwogCS8qIFRoZSBER1JPVVAgaXMgYWxsb2NhdGVkIGJ5IE5FX0NyZWF0ZUluc3RhbmNlICovCiAgICAgICAgIGlmIChpID09IHBNb2R1bGUtPmRncm91cCkgY29udGludWU7Ci0gICAgICAgIHBTZWdtZW50LT5zZWxlY3RvciA9IEdMT0JBTF9BbGxvYyggTkVfTmUyTWVtRmxhZ3MocFNlZ21lbnQtPmZsYWdzKSwKKyAgICAgICAgcFNlZ21lbnQtPmhTZWcgPSBHTE9CQUxfQWxsb2MoIE5FX05lMk1lbUZsYWdzKHBTZWdtZW50LT5mbGFncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNpemUsIHBNb2R1bGUtPnNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEocFNlZ21lbnQtPmZsYWdzICYgTkVfU0VHRkxBR1NfREFUQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIC8qcFNlZ21lbnQtPmZsYWdzICYgTkVfU0VHRkxBR1NfUkVBRE9OTFkqLyApOwotICAgICAgICBpZiAoIXBTZWdtZW50LT5zZWxlY3RvcikgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBTZWdtZW50LT5oU2VnKSByZXR1cm4gRkFMU0U7CiAJcFNlZ21lbnQtPmZsYWdzIHw9IE5FX1NFR0ZMQUdTX0FMTE9DQVRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9pbWFnZS5jIGIvbG9hZGVyL3BlX2ltYWdlLmMKaW5kZXggZGQyNmIyYi4uOTQyZTVhMyAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX2ltYWdlLmMKKysrIGIvbG9hZGVyL3BlX2ltYWdlLmMKQEAgLTQ3NCw4ICs0NzQsMTIgQEAKICAqLwogc3RhdGljIEhNT0RVTEUzMiBQRV9Mb2FkSW1hZ2UoIEhGSUxFMzIgaEZpbGUgKQogewotICAgIEhNT0RVTEUzMiBoTW9kdWxlOwotICAgIEhBTkRMRTMyIG1hcHBpbmc7CisgICAgSE1PRFVMRTMyCWhNb2R1bGU7CisgICAgSEFORExFMzIJbWFwcGluZzsKKyAgICBpbnQJCWkscmF3c2l6ZSA9IDA7CisgICAgSU1BR0VfU0VDVElPTl9IRUFERVIJKnBlX3NlYzsKKyAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTgliaGZpOworCiAKICAgICAvKiBtYXAgdGhlIFBFIGZpbGUgc29tZXdoZXJlICovCiAgICAgbWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nMzJBKCBoRmlsZSwgTlVMTCwgUEFHRV9SRUFET05MWSB8IFNFQ19DT01NSVQsCkBAIC01MTksNiArNTIzLDI0IEBACiAgICAgICAgIH0KICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CisgICAgLyogZmluZCBvdXQgaG93IGxhcmdlIHRoaXMgZXhlY3V0ZWFibGUgc2hvdWxkIGJlICovCisgICAgcGVfc2VjID0gUEVfU0VDVElPTlMoaE1vZHVsZSk7CisgICAgZm9yIChpPTA7aTxQRV9IRUFERVIoaE1vZHVsZSktPkZpbGVIZWFkZXIuTnVtYmVyT2ZTZWN0aW9ucztpKyspIHsKKyAgICAJaWYgKHBlX3NlY1tpXS5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSkKKwkgICAgY29udGludWU7CisJaWYgKHBlX3NlY1tpXS5Qb2ludGVyVG9SYXdEYXRhK3BlX3NlY1tpXS5TaXplT2ZSYXdEYXRhID4gcmF3c2l6ZSkKKwkgICAgcmF3c2l6ZSA9IHBlX3NlY1tpXS5Qb2ludGVyVG9SYXdEYXRhK3BlX3NlY1tpXS5TaXplT2ZSYXdEYXRhOworICAgIH0KKyAgICBpZiAoR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaEZpbGUsJmJoZmkpKSB7CisgICAgCS8qIEZJWE1FOiA2NCBiaXQgKi8KKyAgICAJaWYgKGJoZmkubkZpbGVTaXplTG93IDwgcmF3c2l6ZSkgeworCSAgICBFUlIod2luMzIsIlBFIG1vZHVsZSBpcyB0b28gc21hbGwgKGhlYWRlcjogJWQsIGZpbGVzaXplOiAlZCksIHByb2JhYmx5IHRydW5jYXRlZCBkb3dubG9hZD9cbiIscmF3c2l6ZSxiaGZpLm5GaWxlU2l6ZUxvdyk7CisJICAgIGdvdG8gZXJyb3I7CisJfQorICAgIH0KKyAgICAvKiBFbHNlIC4uLiBIbW0sIHdlIGhhdmUgb3BlbmVkIGl0LCBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgaW5mbz8KKyAgICAgKiBBbnl3YXksIGRvbid0IGNhcmUgaW4gdGhpcyBjYXNlCisgICAgICovCiAgICAgcmV0dXJuIGhNb2R1bGU7CiAKIGVycm9yOgpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Jlc291cmNlLmMgYi9sb2FkZXIvcmVzb3VyY2UuYwppbmRleCA2ZDExYjU1Li5hODczMDc2IDEwMDY0NAotLS0gYS9sb2FkZXIvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcmVzb3VyY2UuYwpAQCAtMzQsMTMgKzM0LDEzIEBACiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBGaW5kUmVzb3VyY2UzMkEoIEhNT0RVTEUzMiBoTW9kdWxlLCBMUENTVFIgbmFtZSwgTFBDU1RSIHR5cGUpCiB7Ci0gICAgcmV0dXJuIEZpbmRSZXNvdXJjZUV4MzJBKGhNb2R1bGUsbmFtZSx0eXBlLFdJTkVfTGFuZ3VhZ2VJZCk7CisgICAgcmV0dXJuIEZpbmRSZXNvdXJjZUV4MzJBKGhNb2R1bGUsdHlwZSxuYW1lLFdJTkVfTGFuZ3VhZ2VJZCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgRmluZFJlc291cmNlRXgzMkEgICAgKEtFUk5FTDMyLjEyOSkKICAqLwotSEFORExFMzIgV0lOQVBJIEZpbmRSZXNvdXJjZUV4MzJBKCBITU9EVUxFMzIgaE1vZHVsZSwgTFBDU1RSIG5hbWUsIExQQ1NUUiB0eXBlLAorSEFORExFMzIgV0lOQVBJIEZpbmRSZXNvdXJjZUV4MzJBKCBITU9EVUxFMzIgaE1vZHVsZSwgTFBDU1RSIHR5cGUsIExQQ1NUUiBuYW1lLAogCQkJCSAgIFdPUkQgbGFuZwogKSB7CiAgICAgTFBXU1RSIHhuYW1lLHh0eXBlOwpAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICB4dHlwZSA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdHlwZSk7CiAgICAgZWxzZQogICAgICAgICB4dHlwZSA9IChMUFdTVFIpdHlwZTsKLSAgICByZXQgPSBGaW5kUmVzb3VyY2VFeDMyVyggaE1vZHVsZSwgeG5hbWUsIHh0eXBlLCBsYW5nICk7CisgICAgcmV0ID0gRmluZFJlc291cmNlRXgzMlcoIGhNb2R1bGUsIHh0eXBlLCB4bmFtZSwgbGFuZyApOwogICAgIGlmIChISVdPUkQoKERXT1JEKW5hbWUpKSBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeG5hbWUgKTsKICAgICBpZiAoSElXT1JEKChEV09SRCl0eXBlKSkgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHh0eXBlICk7CiAgICAgcmV0dXJuIHJldDsKQEAgLTY0LDE0ICs2NCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBGaW5kUmVzb3VyY2VFeDMyVyAgICAoS0VSTkVMMzIuMTMwKQogICovCi1IUlNSQzMyIFdJTkFQSSBGaW5kUmVzb3VyY2VFeDMyVyggSE1PRFVMRTMyIGhNb2R1bGUsIExQQ1dTVFIgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHR5cGUsIFdPUkQgbGFuZyApCitIUlNSQzMyIFdJTkFQSSBGaW5kUmVzb3VyY2VFeDMyVyggSE1PRFVMRTMyIGhNb2R1bGUsIExQQ1dTVFIgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIG5hbWUsIFdPUkQgbGFuZyApCiB7CUhSU1JDMzIgcmV0OwogICAgIFdJTkVfTU9EUkVGCSp3bSA9IE1PRFVMRTMyX0xvb2t1cEhNT0RVTEUoUFJPQ0VTU19DdXJyZW50KCksaE1vZHVsZSk7CiAgICAgSFJTUkMzMglocnNyYzsKIAotICAgIFRSQUNFKHJlc291cmNlLCAibW9kdWxlPSUwOHggdHlwZT0lcyBuYW1lPSVzXG4iLAotCSAgaE1vZHVsZSwKKyAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDh4KCVzKSB0eXBlPSVzIG5hbWU9JXNcbiIsCisJICBoTW9kdWxlLCB3bS0+bW9kbmFtZSwKIAkgIGRlYnVncmVzX3cgKHR5cGUpLAogCSAgZGVidWdyZXNfdyAobmFtZSkpOwogCkBAIC04NSw3ICs4NSw3IEBACiAJY2FzZSBNT0RVTEUzMl9QRToKIAkgICAgcmV0ID0gIFBFX0ZpbmRSZXNvdXJjZUV4MzJXKHdtLG5hbWUsdHlwZSxsYW5nKTsKICAgICAgICAgaWYgKCByZXQ9PTAgKQotICAgICAgICAgIEVSUihyZXNvdXJjZSwiKDB4JTA4bHgoJXMpLCVzIG5vdCBmb3VuZCFcbiIsaE1vZHVsZSx3bS0+bW9kbmFtZSxkZWJ1Z3Jlc193IChuYW1lKSk7CisgICAgICAgICAgRVJSKHJlc291cmNlLCIoMHglMDh4KCVzKSwlcyBub3QgZm91bmQhXG4iLGhNb2R1bGUsd20tPm1vZG5hbWUsZGVidWdyZXNfdyAobmFtZSkpOwogCSAgICByZXR1cm4gcmV0OwogCWRlZmF1bHQ6CiAJICAgIEVSUihtb2R1bGUsInVua25vd24gbW9kdWxlIHR5cGUgJWRcbiIsd20tPnR5cGUpOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAgKi8KIEhSU1JDMzIgV0lOQVBJIEZpbmRSZXNvdXJjZTMyVyhISU5TVEFOQ0UzMiBoTW9kdWxlLCBMUENXU1RSIG5hbWUsIExQQ1dTVFIgdHlwZSkKIHsKLSAgICByZXR1cm4gRmluZFJlc291cmNlRXgzMlcoaE1vZHVsZSxuYW1lLHR5cGUsV0lORV9MYW5ndWFnZUlkKTsKKyAgICByZXR1cm4gRmluZFJlc291cmNlRXgzMlcoaE1vZHVsZSx0eXBlLG5hbWUsV0lORV9MYW5ndWFnZUlkKTsKIH0KIAogCkBAIC00NTcsNyArNDU3LDcgQEAKICAgICB9CiAgICAgRnJlZVJlc291cmNlMTYoIGhtZW0gKTsKIAotICAgIFRSQUNFKHJlc291cmNlLCInJXMnIGNvcGllZCAhXG4iLCBidWZmZXIpOworICAgIFRSQUNFKHJlc291cmNlLCInJXMnIGxvYWRlZCAhXG4iLCBidWZmZXIpOwogICAgIHJldHVybiBpOwogfQogCkBAIC01MDcsNyArNTA3LDcgQEAKICNlbmRpZgogICAgIH0KIAotICAgIFRSQUNFKHJlc291cmNlLCInJXMnIGNvcGllZCAhXG4iLCAoY2hhciAqKWJ1ZmZlcik7CisgICAgVFJBQ0UocmVzb3VyY2UsIiVzIGxvYWRlZCAhXG4iLCBkZWJ1Z3N0cl93KGJ1ZmZlcikpOwogICAgIHJldHVybiBpOwogfQogCkBAIC01ODIsNyArNTgyLDcgQEAKICAgICBUUkFDRShyZXNvdXJjZSwgImluc3RhbmNlID0gJTA4bHgsIGlkID0gJTA4bHgsIGJ1ZmZlciA9ICVwLCBsZW5ndGggPSAlbGRcbiIsIChEV09SRClpbnN0YW5jZSwgKERXT1JEKWlkLCBidWZmZXIsIChEV09SRClidWZsZW4pOwogCiAgICAgLypGSVhNRTogSSBhbSBub3Qgc3VyZSBhYm91dCB0aGUgJzEnIC4uLiBCdXQgSSd2ZSBvbmx5IHNlZW4gdGhvc2UgZW50cmllcyovCi0gICAgaHJzcmMgPSBGaW5kUmVzb3VyY2VFeDMyVyhpbnN0YW5jZSwoTFBXU1RSKTEsUlRfTUVTU0FHRUxJU1QzMlcsbGFuZyk7CisgICAgaHJzcmMgPSBGaW5kUmVzb3VyY2VFeDMyVyhpbnN0YW5jZSxSVF9NRVNTQUdFTElTVDMyVywoTFBXU1RSKTEsbGFuZyk7CiAgICAgaWYgKCFocnNyYykgcmV0dXJuIDA7CiAgICAgaG1lbSA9IExvYWRSZXNvdXJjZTMyKCBpbnN0YW5jZSwgaHJzcmMgKTsKICAgICBpZiAoIWhtZW0pIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggZGYwNjM1My4uZTU1MjA3ZSAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC0yOTAsOCArMjkwLDggQEAKICAgICAgICAgQ09OVEVYVCBjb250ZXh0OwogCiAgICAgICAgIG1lbXNldCggJmNvbnRleHQsIDAsIHNpemVvZihjb250ZXh0KSApOwotICAgICAgICBDU19yZWcoJmNvbnRleHQpICA9IHBTZWdUYWJsZVtwTW9kdWxlLT5jcyAtIDFdLnNlbGVjdG9yOwotICAgICAgICBEU19yZWcoJmNvbnRleHQpICA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvcjsKKyAgICAgICAgQ1NfcmVnKCZjb250ZXh0KSAgPSBHbG9iYWxIYW5kbGVUb1NlbChwU2VnVGFibGVbcE1vZHVsZS0+Y3MgLSAxXS5oU2VnKTsKKyAgICAgICAgRFNfcmVnKCZjb250ZXh0KSAgPSBHbG9iYWxIYW5kbGVUb1NlbChwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uaFNlZyk7CiAgICAgICAgIEVTX3JlZygmY29udGV4dCkgID0gcFRhc2stPmhQREI7CiAgICAgICAgIEVJUF9yZWcoJmNvbnRleHQpID0gcE1vZHVsZS0+aXA7CiAgICAgICAgIEVCWF9yZWcoJmNvbnRleHQpID0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKQEAgLTM4Myw5ICszODMsOSBAQAogICAgIHBUYXNrLT5wZGIuZGlzcGF0Y2hlclswXSA9IDB4OWE7ICAvKiBsam1wICovCiAgICAgUFVUX0RXT1JEKCZwVGFzay0+cGRiLmRpc3BhdGNoZXJbMV0sIChEV09SRClORV9HZXRFbnRyeVBvaW50KAogICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksIDEwMiApKTsgIC8qIEtFUk5FTC4xMDIgaXMgRE9TM0NhbGwoKSAqLwotICAgIHBUYXNrLT5wZGIuc2F2ZWRpbnQyMiA9IElOVF9HZXRIYW5kbGVyKCAweDIyICk7Ci0gICAgcFRhc2stPnBkYi5zYXZlZGludDIzID0gSU5UX0dldEhhbmRsZXIoIDB4MjMgKTsKLSAgICBwVGFzay0+cGRiLnNhdmVkaW50MjQgPSBJTlRfR2V0SGFuZGxlciggMHgyNCApOworICAgIHBUYXNrLT5wZGIuc2F2ZWRpbnQyMiA9IElOVF9HZXRQTUhhbmRsZXIoIDB4MjIgKTsKKyAgICBwVGFzay0+cGRiLnNhdmVkaW50MjMgPSBJTlRfR2V0UE1IYW5kbGVyKCAweDIzICk7CisgICAgcFRhc2stPnBkYi5zYXZlZGludDI0ID0gSU5UX0dldFBNSGFuZGxlciggMHgyNCApOwogICAgIHBUYXNrLT5wZGIuZmlsZUhhbmRsZXNQdHIgPQogICAgICAgICBQVFJfU0VHX09GRl9UT19TRUdQVFIoIEdsb2JhbEhhbmRsZVRvU2VsKHBUYXNrLT5oUERCKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSYoKFBEQiAqKTApLT5maWxlSGFuZGxlcyApOwpAQCAtMTA5MSw2ICsxMDkxLDUzIEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBHZXRDb2RlSW5mbyAgICAoS0VSTkVMLjEwNCkKKyAqLworVk9JRCBXSU5BUEkgR2V0Q29kZUluZm8oIEZBUlBST0MxNiBwcm9jLCBTRUdJTkZPICpzZWdJbmZvICkKK3sKKyAgICBCWVRFICp0aHVuayA9IChCWVRFICopUFRSX1NFR19UT19MSU4oIHByb2MgKTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBOVUxMOworICAgIFNFR1RBQkxFRU5UUlkgKnBTZWcgPSBOVUxMOworICAgIFdPUkQgc2VnTnI7CisKKyAgICAvKiBwcm9jIGlzIGVpdGhlciBhIHRodW5rLCBvciBlbHNlIGEgcGFpciBvZiBtb2R1bGUgaGFuZGxlCisgICAgICAgYW5kIHNlZ21lbnQgbnVtYmVyLiBJbiB0aGUgZmlyc3QgY2FzZSwgd2UgYWxzbyBuZWVkIHRvCisgICAgICAgZXh0cmFjdCBtb2R1bGUgYW5kIHNlZ21lbnQgbnVtYmVyLiAqLworCisgICAgaWYgKCh0aHVua1swXSA9PSAweGI4KSAmJiAodGh1bmtbM10gPT0gMHhlYSkpCisgICAgeworICAgICAgICBXT1JEIHNlbGVjdG9yID0gdGh1bmtbNl0gKyAodGh1bmtbN10gPDwgOCk7CisgICAgICAgIHBNb2R1bGUgPSBORV9HZXRQdHIoIEdsb2JhbEhhbmRsZTE2KCBzZWxlY3RvciApICk7CisgICAgICAgIHBTZWcgPSBwTW9kdWxlPyBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKSA6IE5VTEw7CisKKyAgICAgICAgaWYgKCBwTW9kdWxlICkKKyAgICAgICAgICAgIGZvciAoIHNlZ05yID0gMDsgc2VnTnIgPCBwTW9kdWxlLT5zZWdfY291bnQ7IHNlZ05yKyssIHBTZWcrKyApCisgICAgICAgICAgICAgICAgaWYgKCBHbG9iYWxIYW5kbGVUb1NlbChwU2VnLT5oU2VnKSA9PSBzZWxlY3RvciApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICggcE1vZHVsZSAmJiBzZWdOciA+PSBwTW9kdWxlLT5zZWdfY291bnQgKQorICAgICAgICAgICAgcFNlZyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBNb2R1bGUgPSBORV9HZXRQdHIoIEhJV09SRCggcHJvYyApICk7CisgICAgICAgIHNlZ05yICAgPSBMT1dPUkQoIHByb2MgKTsKKworICAgICAgICBpZiAoIHBNb2R1bGUgJiYgc2VnTnIgPCBwTW9kdWxlLT5zZWdfY291bnQgKQorICAgICAgICAgICAgcFNlZyA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApICsgc2VnTnI7CisgICAgfQorCisgICAgLyogZmlsbCBpbiBzZWdtZW50IGluZm9ybWF0aW9uICovCisKKyAgICBzZWdJbmZvLT5vZmZTZWdtZW50ID0gcFNlZz8gcFNlZy0+ZmlsZXBvcyA6IDA7CisgICAgc2VnSW5mby0+Y2JTZWdtZW50ICA9IHBTZWc/IHBTZWctPnNpemUgOiAwOworICAgIHNlZ0luZm8tPmZsYWdzICAgICAgPSBwU2VnPyBwU2VnLT5mbGFncyA6IDA7CisgICAgc2VnSW5mby0+Y2JBbGxvYyAgICA9IHBTZWc/IHBTZWctPm1pbnNpemUgOiAwOworICAgIHNlZ0luZm8tPmggICAgICAgICAgPSBwU2VnPyBwU2VnLT5oU2VnIDogMDsKKyAgICBzZWdJbmZvLT5hbGlnblNoaWZ0ID0gcE1vZHVsZT8gcE1vZHVsZS0+YWxpZ25tZW50IDogMDsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgRGVmaW5lSGFuZGxlVGFibGUxNiAgICAoS0VSTkVMLjk0KQpAQCAtMTEzMyw2ICsxMTgwLDU2IEBACiAgICAgcmV0dXJuIHBUYXNrLT5oUXVldWU7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFRocmVhZFF1ZXVlICAoS0VSTkVMLjQ2MykKKyAqLworSFFVRVVFMTYgV0lOQVBJIFNldFRocmVhZFF1ZXVlKCBEV09SRCB0aHJlYWQsIEhRVUVVRTE2IGhRdWV1ZSApCit7CisgICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9JZFRvVEhEQiggdGhyZWFkICk7CisgICAgSFFVRVVFMTYgb2xkUXVldWUgPSB0aGRiPyB0aGRiLT50ZWIucXVldWUgOiAwOworCisgICAgaWYgKCB0aGRiICkKKyAgICB7CisgICAgICAgIHRoZGItPnRlYi5xdWV1ZSA9IGhRdWV1ZTsKKworICAgICAgICBpZiAoIEdldFRhc2tRdWV1ZSggdGhkYi0+cHJvY2Vzcy0+dGFzayApID09IG9sZFF1ZXVlICkKKyAgICAgICAgICAgIFNldFRhc2tRdWV1ZSggdGhkYi0+cHJvY2Vzcy0+dGFzaywgaFF1ZXVlICk7CisgICAgfQorCisgICAgcmV0dXJuIG9sZFF1ZXVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRUaHJlYWRRdWV1ZSAgKEtFUk5FTC40NjQpCisgKi8KK0hRVUVVRTE2IFdJTkFQSSBHZXRUaHJlYWRRdWV1ZSggRFdPUkQgdGhyZWFkICkKK3sKKyAgICBUSERCICp0aGRiID0gVEhSRUFEX0lkVG9USERCKCB0aHJlYWQgKTsKKyAgICByZXR1cm4gKEhRVUVVRTE2KSh0aGRiPyB0aGRiLT50ZWIucXVldWUgOiAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0RmFzdFF1ZXVlICAoS0VSTkVMLjYyNCkKKyAqLworVk9JRCBXSU5BUEkgU2V0RmFzdFF1ZXVlKCBEV09SRCB0aHJlYWQsIEhBTkRMRTMyIGhRdWV1ZSApCit7CisgICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9JZFRvVEhEQiggdGhyZWFkICk7CisgICAgaWYgKCB0aGRiICkgdGhkYi0+dGViLnF1ZXVlID0gKEhRVUVVRTE2KSBoUXVldWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEZhc3RRdWV1ZSAgKEtFUk5FTC42MjUpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBHZXRGYXN0UXVldWUoIHZvaWQgKQoreworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOworICAgIGlmICghdGhkYikgcmV0dXJuIDA7CisKKyAgICBpZiAoISh0aGRiLT50ZWIucXVldWUpKQorICAgICAgICBGSVhNRSggdGFzaywgIigpOiBzaG91bGQgaW5pdGlhbGl6ZSB0aHJlYWQtbG9jYWwgcXVldWUsIGV4cGVjdCBmYWlsdXJlIVxuIiApOworCisgICAgcmV0dXJuIChIQU5ETEUzMil0aGRiLT50ZWIucXVldWU7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFN3aXRjaFN0YWNrVG8gICAoS0VSTkVMLjEwOCkKZGlmZiAtLWdpdCBhL21lbW9yeS9nbG9iYWwuYyBiL21lbW9yeS9nbG9iYWwuYwppbmRleCBmZDhiYjViLi43OTllYjlmIDEwMDY0NAotLS0gYS9tZW1vcnkvZ2xvYmFsLmMKKysrIGIvbWVtb3J5L2dsb2JhbC5jCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCisvKiAweGZmZmYgc29tZXRpbWVzIHNlZW1zIHRvIG1lYW46IENVUlJFTlRfRFMgKi8KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTczLDYgKzE3NCwzMCBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHTE9CQUxfTW92ZUJsb2NrCisgKi8KK0JPT0wxNiBHTE9CQUxfTW92ZUJsb2NrKCBIR0xPQkFMMTYgaGFuZGxlLCBjb25zdCB2b2lkICpwdHIsIERXT1JEIHNpemUgKQoreworICAgIFdPUkQgc2VsOworICAgIEdMT0JBTEFSRU5BICpwQXJlbmE7CisKKyAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIFRSVUU7CisgICAgc2VsID0gR2xvYmFsSGFuZGxlVG9TZWwoIGhhbmRsZSApOyAKKyAgICBpZiAoIVZBTElEX0hBTkRMRShzZWwpKQorICAgIAlyZXR1cm4gRkFMU0U7CisgICAgcEFyZW5hID0gR0VUX0FSRU5BX1BUUihzZWwpOworICAgIGlmIChwQXJlbmEtPnNlbENvdW50ICE9IDEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBcmVuYS0+YmFzZSA9IChEV09SRClwdHI7CisgICAgcEFyZW5hLT5zaXplID0gc2l6ZTsKKworICAgIFNFTEVDVE9SX01vdmVCbG9jayggc2VsLCBwdHIgKTsKKyAgICBTZXRTZWxlY3RvckxpbWl0KCBzZWwsIHNpemUtMSApOworCisgICAgcmV0dXJuIFRSVUU7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdMT0JBTF9BbGxvYwpkaWZmIC0tZ2l0IGEvbWVtb3J5L2hlYXAuYyBiL21lbW9yeS9oZWFwLmMKaW5kZXggM2JjYzM5Ni4uMDVkYzhmYSAxMDA2NDQKLS0tIGEvbWVtb3J5L2hlYXAuYworKysgYi9tZW1vcnkvaGVhcC5jCkBAIC0yLDYgKzIsNyBAQAogICogV2luMzIgaGVhcCBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAgKi8KIAogI2luY2x1ZGUgPGFzc2VydC5oPgpAQCAtOSw2ICsxMCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgIndpbm50LmgiCkBAIC00MjYsMTcgKzQyOCwxMDQgQEAKICAgICB9CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEhFQVBfSW5pdFN1YkhlYXAKKyAqLworc3RhdGljIEJPT0wzMiBIRUFQX0luaXRTdWJIZWFwKCBIRUFQICpoZWFwLCBMUFZPSUQgYWRkcmVzcywgRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNvbW1pdFNpemUsIERXT1JEIHRvdGFsU2l6ZSApCit7CisgICAgU1VCSEVBUCAqc3ViaGVhcCA9IChTVUJIRUFQICopYWRkcmVzczsKKyAgICBXT1JEIHNlbGVjdG9yID0gMDsKKyAgICBGUkVFX0xJU1RfRU5UUlkgKnBFbnRyeTsKKyAgICBpbnQgaTsKKworICAgIC8qIENvbW1pdCBtZW1vcnkgKi8KKworICAgIGlmICghVmlydHVhbEFsbG9jKGFkZHJlc3MsIGNvbW1pdFNpemUsIE1FTV9DT01NSVQsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpKQorICAgIHsKKyAgICAgICAgV0FSTihoZWFwLCAiQ291bGQgbm90IGNvbW1pdCAlMDhseCBieXRlcyBmb3Igc3ViLWhlYXAgJTA4bHhcbiIsCisgICAgICAgICAgICAgICAgICAgY29tbWl0U2l6ZSwgKERXT1JEKWFkZHJlc3MgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGEgc2VsZWN0b3IgaWYgbmVlZGVkICovCisKKyAgICBpZiAoZmxhZ3MgJiBIRUFQX1dJTkVfU0VHUFRSKQorICAgIHsKKyAgICAgICAgc2VsZWN0b3IgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBhZGRyZXNzLCB0b3RhbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIRUFQX1dJTkVfQ09ERVNFRykgPyBTRUdNRU5UX0NPREUgOiBTRUdNRU5UX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIRUFQX1dJTkVfQ09ERVNFRykgIT0gMCwgRkFMU0UgKTsKKyAgICAgICAgaWYgKCFzZWxlY3RvcikKKyAgICAgICAgeworICAgICAgICAgICAgV0FSTihoZWFwLCAiQ291bGQgbm90IGFsbG9jYXRlIHNlbGVjdG9yXG4iICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaWxsIHRoZSBzdWItaGVhcCBzdHJ1Y3R1cmUgKi8KKworICAgIHN1YmhlYXAtPmhlYXAgICAgICAgPSBoZWFwOworICAgIHN1YmhlYXAtPnNlbGVjdG9yICAgPSBzZWxlY3RvcjsKKyAgICBzdWJoZWFwLT5zaXplICAgICAgID0gdG90YWxTaXplOworICAgIHN1YmhlYXAtPmNvbW1pdFNpemUgPSBjb21taXRTaXplOworICAgIHN1YmhlYXAtPm1hZ2ljICAgICAgPSBTVUJIRUFQX01BR0lDOworCisgICAgaWYgKCBzdWJoZWFwICE9IChTVUJIRUFQICopaGVhcCApCisgICAgeworICAgICAgICAvKiBJZiB0aGlzIGlzIGEgc2Vjb25kYXJ5IHN1YmhlYXAsIGluc2VydCBpdCBpbnRvIGxpc3QgKi8KKworICAgICAgICBzdWJoZWFwLT5oZWFkZXJTaXplID0gc2l6ZW9mKFNVQkhFQVApOworICAgICAgICBzdWJoZWFwLT5uZXh0ICAgICAgID0gaGVhcC0+c3ViaGVhcC5uZXh0OworICAgICAgICBoZWFwLT5zdWJoZWFwLm5leHQgID0gc3ViaGVhcDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogSWYgdGhpcyBpcyBhIHByaW1hcnkgc3ViaGVhcCwgaW5pdGlhbGl6ZSBtYWluIGhlYXAgKi8KKworICAgICAgICBzdWJoZWFwLT5oZWFkZXJTaXplID0gc2l6ZW9mKEhFQVApOworICAgICAgICBzdWJoZWFwLT5uZXh0ICAgICAgID0gTlVMTDsKKyAgICAgICAgaGVhcC0+bmV4dCAgICAgICAgICA9IE5VTEw7CisgICAgICAgIGhlYXAtPmZsYWdzICAgICAgICAgPSBmbGFnczsKKyAgICAgICAgaGVhcC0+bWFnaWMgICAgICAgICA9IEhFQVBfTUFHSUM7CisKKyAgICAgICAgLyogQnVpbGQgdGhlIGZyZWUgbGlzdHMgKi8KKworICAgICAgICBmb3IgKGkgPSAwLCBwRW50cnkgPSBoZWFwLT5mcmVlTGlzdDsgaSA8IEhFQVBfTkJfRlJFRV9MSVNUUzsgaSsrLCBwRW50cnkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEVudHJ5LT5zaXplICAgICAgICAgICA9IEhFQVBfZnJlZUxpc3RTaXplc1tpXTsKKyAgICAgICAgICAgIHBFbnRyeS0+YXJlbmEuc2l6ZSAgICAgPSAwIHwgQVJFTkFfRkxBR19GUkVFOworICAgICAgICAgICAgcEVudHJ5LT5hcmVuYS5uZXh0ICAgICA9IGkgPCBIRUFQX05CX0ZSRUVfTElTVFMtMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYXAtPmZyZWVMaXN0W2krMV0uYXJlbmEgOiAmaGVhcC0+ZnJlZUxpc3RbMF0uYXJlbmE7CisgICAgICAgICAgICBwRW50cnktPmFyZW5hLnByZXYgICAgID0gaSA/ICZoZWFwLT5mcmVlTGlzdFtpLTFdLmFyZW5hIDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFwLT5mcmVlTGlzdFtIRUFQX05CX0ZSRUVfTElTVFMtMV0uYXJlbmE7CisgICAgICAgICAgICBwRW50cnktPmFyZW5hLnRocmVhZElkID0gMDsKKyAgICAgICAgICAgIHBFbnRyeS0+YXJlbmEubWFnaWMgICAgPSBBUkVOQV9GUkVFX01BR0lDOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBjcml0aWNhbCBzZWN0aW9uICovCisKKyAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJmhlYXAtPmNyaXRTZWN0aW9uICk7CisgICAgICAgIGlmICghU3lzdGVtSGVhcCkgSEVBUF9TeXN0ZW1Mb2NrID0gJmhlYXAtPmNyaXRTZWN0aW9uOworICAgIH0KKyAKKyAgICAvKiBDcmVhdGUgdGhlIGZpcnN0IGZyZWUgYmxvY2sgKi8KKworICAgIEhFQVBfQ3JlYXRlRnJlZUJsb2NrKCBzdWJoZWFwLCAoTFBCWVRFKXN1YmhlYXAgKyBzdWJoZWFwLT5oZWFkZXJTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViaGVhcC0+c2l6ZSAtIHN1YmhlYXAtPmhlYWRlclNpemUgKTsKKworICAgIHJldHVybiBUUlVFOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBIRUFQX0NyZWF0ZVN1YkhlYXAKICAqCiAgKiBDcmVhdGUgYSBzdWItaGVhcCBvZiB0aGUgZ2l2ZW4gc2l6ZS4KKyAqIElmIGhlYXAgPT0gTlVMTCwgY3JlYXRlcyBhIG1haW4gaGVhcC4KICAqLwotc3RhdGljIFNVQkhFQVAgKkhFQVBfQ3JlYXRlU3ViSGVhcCggRFdPUkQgZmxhZ3MsIERXT1JEIGNvbW1pdFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCB0b3RhbFNpemUgKQorc3RhdGljIFNVQkhFQVAgKkhFQVBfQ3JlYXRlU3ViSGVhcCggSEVBUCAqaGVhcCwgRFdPUkQgZmxhZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY29tbWl0U2l6ZSwgRFdPUkQgdG90YWxTaXplICkKIHsKLSAgICBTVUJIRUFQICpzdWJoZWFwOwotICAgIFdPUkQgc2VsZWN0b3IgPSAwOworICAgIExQVk9JRCBhZGRyZXNzOwogCiAgICAgLyogUm91bmQtdXAgc2l6ZXMgb24gYSA2NEsgYm91bmRhcnkgKi8KIApAQCAtNDU0LDQ2ICs1NDMsMjQgQEAKIAogICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgYmxvY2sgKi8KIAotICAgIGlmICghKHN1YmhlYXAgPSBWaXJ0dWFsQWxsb2MoIE5VTEwsIHRvdGFsU2l6ZSwKKyAgICBpZiAoIShhZGRyZXNzID0gVmlydHVhbEFsbG9jKCBOVUxMLCB0b3RhbFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNX1JFU0VSVkUsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKSkpCiAgICAgewogICAgICAgICBXQVJOKGhlYXAsICJDb3VsZCBub3QgVmlydHVhbEFsbG9jICUwOGx4IGJ5dGVzXG4iLAogICAgICAgICAgICAgICAgICB0b3RhbFNpemUgKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICghVmlydHVhbEFsbG9jKHN1YmhlYXAsIGNvbW1pdFNpemUsIE1FTV9DT01NSVQsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpKQorCisgICAgLyogSW5pdGlhbGl6ZSBzdWJoZWFwICovCisKKyAgICBpZiAoIUhFQVBfSW5pdFN1YkhlYXAoIGhlYXA/IGhlYXAgOiAoSEVBUCAqKWFkZHJlc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgZmxhZ3MsIGNvbW1pdFNpemUsIHRvdGFsU2l6ZSApKQogICAgIHsKLSAgICAgICAgV0FSTihoZWFwLCAiQ291bGQgbm90IGNvbW1pdCAlMDhseCBieXRlcyBmb3Igc3ViLWhlYXAgJTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgIGNvbW1pdFNpemUsIChEV09SRClzdWJoZWFwICk7Ci0gICAgICAgIFZpcnR1YWxGcmVlKCBzdWJoZWFwLCAwLCBNRU1fUkVMRUFTRSApOworICAgICAgICBWaXJ0dWFsRnJlZSggYWRkcmVzcywgMCwgTUVNX1JFTEVBU0UgKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLyogQWxsb2NhdGUgYSBzZWxlY3RvciBpZiBuZWVkZWQgKi8KLQotICAgIGlmIChmbGFncyAmIEhFQVBfV0lORV9TRUdQVFIpCi0gICAgewotICAgICAgICBzZWxlY3RvciA9IFNFTEVDVE9SX0FsbG9jQmxvY2soIHN1YmhlYXAsIHRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEhFQVBfV0lORV9DT0RFU0VHKSA/IFNFR01FTlRfQ09ERSA6IFNFR01FTlRfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEhFQVBfV0lORV9DT0RFU0VHKSAhPSAwLCBGQUxTRSApOwotICAgICAgICBpZiAoIXNlbGVjdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBXQVJOKGhlYXAsICJDb3VsZCBub3QgYWxsb2NhdGUgc2VsZWN0b3JcbiIgKTsKLSAgICAgICAgICAgIFZpcnR1YWxGcmVlKCBzdWJoZWFwLCAwLCBNRU1fUkVMRUFTRSApOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaWxsIHRoZSBzdWItaGVhcCBzdHJ1Y3R1cmUgKi8KLQotICAgIHN1YmhlYXAtPnNpemUgICAgICAgPSB0b3RhbFNpemU7Ci0gICAgc3ViaGVhcC0+Y29tbWl0U2l6ZSA9IGNvbW1pdFNpemU7Ci0gICAgc3ViaGVhcC0+aGVhZGVyU2l6ZSA9IHNpemVvZigqc3ViaGVhcCk7Ci0gICAgc3ViaGVhcC0+bmV4dCAgICAgICA9IE5VTEw7Ci0gICAgc3ViaGVhcC0+aGVhcCAgICAgICA9IE5VTEw7Ci0gICAgc3ViaGVhcC0+bWFnaWMgICAgICA9IFNVQkhFQVBfTUFHSUM7Ci0gICAgc3ViaGVhcC0+c2VsZWN0b3IgICA9IHNlbGVjdG9yOwotICAgIHJldHVybiBzdWJoZWFwOworICAgIHJldHVybiAoU1VCSEVBUCAqKWFkZHJlc3M7CiB9CiAKIApAQCAtNTM4LDIwICs2MDUsMTMgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHNpemUgKz0gc2l6ZW9mKFNVQkhFQVApICsgc2l6ZW9mKEFSRU5BX0ZSRUUpOwotICAgIGlmICghKHN1YmhlYXAgPSBIRUFQX0NyZWF0ZVN1YkhlYXAoIGhlYXAtPmZsYWdzLCBzaXplLAorICAgIGlmICghKHN1YmhlYXAgPSBIRUFQX0NyZWF0ZVN1YkhlYXAoIGhlYXAsIGhlYXAtPmZsYWdzLCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCggSEVBUF9ERUZfU0laRSwgc2l6ZSApICkpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIC8qIEluc2VydCB0aGUgbmV3IHN1Yi1oZWFwIGluIHRoZSBsaXN0ICovCi0KLSAgICBzdWJoZWFwLT5oZWFwID0gaGVhcDsKLSAgICBzdWJoZWFwLT5uZXh0ID0gaGVhcC0+c3ViaGVhcC5uZXh0OwotICAgIGhlYXAtPnN1YmhlYXAubmV4dCA9IHN1YmhlYXA7Ci0gICAgc2l6ZSA9IHN1YmhlYXAtPnNpemU7CiAgICAgVFJBQ0UoaGVhcCwgImNyZWF0ZWQgbmV3IHN1Yi1oZWFwICUwOGx4IG9mICUwOGx4IGJ5dGVzIGZvciBoZWFwICUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgKERXT1JEKXN1YmhlYXAsIHNpemUsIChEV09SRCloZWFwICk7CisgICAgICAgICAgICAgICAgKERXT1JEKXN1YmhlYXAsIHNpemUsIChEV09SRCloZWFwICk7CiAKLSAgICBIRUFQX0NyZWF0ZUZyZWVCbG9jayggc3ViaGVhcCwgc3ViaGVhcCArIDEsIHNpemUgLSBzaXplb2YoKnN1YmhlYXApICk7CiAgICAgKnBwU3ViSGVhcCA9IHN1YmhlYXA7CiAgICAgcmV0dXJuIChBUkVOQV9GUkVFICopKHN1YmhlYXAgKyAxKTsKIH0KQEAgLTgwOSwxMCArODY5LDcgQEAKICAgICAgICAgICAgICAgICBEV09SRCBpbml0aWFsU2l6ZSwgLyogW2luXSBJbml0aWFsIGhlYXAgc2l6ZSAqLwogICAgICAgICAgICAgICAgIERXT1JEIG1heFNpemUgICAgICAvKiBbaW5dIE1heGltdW0gaGVhcCBzaXplICovCiApIHsKLSAgICBpbnQgaTsKLSAgICBIRUFQICpoZWFwOwogICAgIFNVQkhFQVAgKnN1YmhlYXA7Ci0gICAgRlJFRV9MSVNUX0VOVFJZICpwRW50cnk7CiAKICAgICAvKiBBbGxvY2F0ZSB0aGUgaGVhcCBibG9jayAqLwogCkBAIC04MjEsNTAgKzg3OCwxNSBAQAogICAgICAgICBtYXhTaXplID0gSEVBUF9ERUZfU0laRTsKICAgICAgICAgZmxhZ3MgfD0gSEVBUF9HUk9XQUJMRTsKICAgICB9Ci0gICAgaWYgKCEoc3ViaGVhcCA9IEhFQVBfQ3JlYXRlU3ViSGVhcCggZmxhZ3MsIGluaXRpYWxTaXplLCBtYXhTaXplICkpKQorICAgIGlmICghKHN1YmhlYXAgPSBIRUFQX0NyZWF0ZVN1YkhlYXAoIE5VTEwsIGZsYWdzLCBpbml0aWFsU2l6ZSwgbWF4U2l6ZSApKSkKICAgICB7CiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgLyogRmlsbCB0aGUgaGVhcCBzdHJ1Y3R1cmUgKi8KLQotICAgIGhlYXAgPSAoSEVBUCAqKXN1YmhlYXA7Ci0gICAgc3ViaGVhcC0+aGVhcCAgICAgICA9IGhlYXA7Ci0gICAgc3ViaGVhcC0+aGVhZGVyU2l6ZSA9IHNpemVvZihIRUFQKTsKLSAgICBoZWFwLT5uZXh0ICAgICAgICAgID0gTlVMTDsKLSAgICBoZWFwLT5mbGFncyAgICAgICAgID0gZmxhZ3M7Ci0gICAgaGVhcC0+bWFnaWMgICAgICAgICA9IEhFQVBfTUFHSUM7Ci0KLSAgICAvKiBCdWlsZCB0aGUgZnJlZSBsaXN0cyAqLwotCi0gICAgZm9yIChpID0gMCwgcEVudHJ5ID0gaGVhcC0+ZnJlZUxpc3Q7IGkgPCBIRUFQX05CX0ZSRUVfTElTVFM7IGkrKywgcEVudHJ5KyspCi0gICAgewotICAgICAgICBwRW50cnktPnNpemUgICAgICAgICAgID0gSEVBUF9mcmVlTGlzdFNpemVzW2ldOwotICAgICAgICBwRW50cnktPmFyZW5hLnNpemUgICAgID0gMCB8IEFSRU5BX0ZMQUdfRlJFRTsKLSAgICAgICAgcEVudHJ5LT5hcmVuYS5uZXh0ICAgICA9IGkgPCBIRUFQX05CX0ZSRUVfTElTVFMtMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgJmhlYXAtPmZyZWVMaXN0W2krMV0uYXJlbmEgOiAmaGVhcC0+ZnJlZUxpc3RbMF0uYXJlbmE7Ci0gICAgICAgIHBFbnRyeS0+YXJlbmEucHJldiAgICAgPSBpID8gJmhlYXAtPmZyZWVMaXN0W2ktMV0uYXJlbmEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYXAtPmZyZWVMaXN0W0hFQVBfTkJfRlJFRV9MSVNUUy0xXS5hcmVuYTsKLSAgICAgICAgcEVudHJ5LT5hcmVuYS50aHJlYWRJZCA9IDA7Ci0gICAgICAgIHBFbnRyeS0+YXJlbmEubWFnaWMgICAgPSBBUkVOQV9GUkVFX01BR0lDOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSB0aGUgZmlyc3QgZnJlZSBibG9jayAqLwotCi0gICAgSEVBUF9DcmVhdGVGcmVlQmxvY2soIHN1YmhlYXAsIGhlYXAgKyAxLCBzdWJoZWFwLT5zaXplIC0gc2l6ZW9mKCpoZWFwKSApOwotCi0gICAgLyogSW5pdGlhbGl6ZSBjcml0aWNhbCBzZWN0aW9uICovCi0KLSAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmaGVhcC0+Y3JpdFNlY3Rpb24gKTsKLSAgICBpZiAoIVN5c3RlbUhlYXApIEhFQVBfU3lzdGVtTG9jayA9ICZoZWFwLT5jcml0U2VjdGlvbjsKLQotICAgIC8qIFdlIGFyZSBkb25lICovCi0KLSAgICByZXR1cm4gKEhBTkRMRTMyKWhlYXA7CisgICAgcmV0dXJuIChIQU5ETEUzMilzdWJoZWFwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEhlYXBEZXN0cm95ICAgKEtFUk5FTDMyLjMzNykKICAqIFJFVFVSTlMKQEAgLTEzNTQsMyArMTM3Niw0NTMgQEAKICAgICBsc3RyY3B5V3RvQSggcmV0LCBzdHIgKTsKICAgICByZXR1cm4gcmV0OwogfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAzMi1iaXQgbG9jYWwgaGVhcCBmdW5jdGlvbnMgKFdpbjk1OyB1bmRvY3VtZW50ZWQpCisgKi8KKworI2RlZmluZSBIVEFCTEVfU0laRSAgICAgIDB4MTAwMDAKKyNkZWZpbmUgSFRBQkxFX1BBR0VTSVpFICAweDEwMDAKKyNkZWZpbmUgSFRBQkxFX05QQUdFUyAgICAoSFRBQkxFX1NJWkUgLyBIVEFCTEVfUEFHRVNJWkUpCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgX0xPQ0FMMzJIRUFERVIKK3sKKyAgICBXT1JEICAgICBmcmVlTGlzdEZpcnN0W0hUQUJMRV9OUEFHRVNdOworICAgIFdPUkQgICAgIGZyZWVMaXN0U2l6ZVtIVEFCTEVfTlBBR0VTXTsKKyAgICBXT1JEICAgICBmcmVlTGlzdExhc3RbSFRBQkxFX05QQUdFU107CisKKyAgICBEV09SRCAgICBzZWxlY3RvclRhYmxlT2Zmc2V0OworICAgIFdPUkQgICAgIHNlbGVjdG9yVGFibGVTaXplOworICAgIFdPUkQgICAgIHNlbGVjdG9yRGVsdGE7CisKKyAgICBEV09SRCAgICBzZWdtZW50OworICAgIExQQllURSAgIGJhc2U7CisKKyAgICBEV09SRCAgICBsaW1pdDsKKyAgICBEV09SRCAgICBmbGFnczsKKworICAgIERXT1JEICAgIG1hZ2ljOworICAgIEhBTkRMRTMyIGhlYXA7CisKK30gTE9DQUwzMkhFQURFUjsKKyNwcmFnbWEgcGFjayg0KQorCisjZGVmaW5lIExPQ0FMMzJfTUFHSUMgICAgKChEV09SRCkoJ0wnIHwgKCdIJzw8OCkgfCAoJzMnPDwxNikgfCAoJzInPDwyNCkpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2NhbDMySW5pdCAgIChLRVJORUwuMjA4KQorICovCitIQU5ETEUzMiBXSU5BUEkgTG9jYWwzMkluaXQoIFdPUkQgc2VnbWVudCwgRFdPUkQgdGFibGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBoZWFwU2l6ZSwgRFdPUkQgZmxhZ3MgKQoreworICAgIERXT1JEIHRvdFNpemUsIHNlZ1NpemUgPSAwOworICAgIExQQllURSBiYXNlOworICAgIExPQ0FMMzJIRUFERVIgKmhlYWRlcjsKKyAgICBIRUFQICpoZWFwOworICAgIFdPUkQgKnNlbGVjdG9yVGFibGU7CisgICAgV09SRCBzZWxlY3RvckV2ZW4sIHNlbGVjdG9yT2RkOworICAgIGludCBpLCBuckJsb2NrczsKKworICAgIC8qIERldGVybWluZSBuZXcgaGVhcCBzaXplICovCisKKyAgICBpZiAoIHNlZ21lbnQgKQorICAgICAgICBpZiAoIChzZWdTaXplID0gR2V0U2VsZWN0b3JMaW1pdCggc2VnbWVudCApKSA9PSAwICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWdTaXplKys7CisKKyAgICBpZiAoIGhlYXBTaXplID09IC0xTCApCisgICAgICAgIGhlYXBTaXplID0gMTAyNEwqMTAyNEw7ICAgLyogRklYTUUgKi8KKworICAgIGhlYXBTaXplID0gKGhlYXBTaXplICsgMHhmZmZmKSAmIDB4ZmZmZjAwMDA7CisgICAgc2VnU2l6ZSAgPSAoc2VnU2l6ZSAgKyAweDBmZmYpICYgMHhmZmZmZjAwMDsKKyAgICB0b3RTaXplICA9IHNlZ1NpemUgKyBIVEFCTEVfU0laRSArIGhlYXBTaXplOworCisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgYW5kIGluaXRpYWxpemUgaGVhcCAqLworCisgICAgaWYgKCAhKGJhc2UgPSBWaXJ0dWFsQWxsb2MoIE5VTEwsIHRvdFNpemUsIE1FTV9SRVNFUlZFLCBQQUdFX1JFQURXUklURSApKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhVmlydHVhbEFsbG9jKCBiYXNlLCBzZWdTaXplICsgSFRBQkxFX1BBR0VTSVpFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FTV9DT01NSVQsIFBBR0VfUkVBRFdSSVRFICkgKQorICAgIHsKKyAgICAgICAgVmlydHVhbEZyZWUoIGJhc2UsIDAsIE1FTV9SRUxFQVNFICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGhlYXAgPSAoSEVBUCAqKShiYXNlICsgc2VnU2l6ZSArIEhUQUJMRV9TSVpFKTsKKyAgICBpZiAoICFIRUFQX0luaXRTdWJIZWFwKCBoZWFwLCAoTFBWT0lEKWhlYXAsIDAsIDB4MTAwMDAsIGhlYXBTaXplICkgKQorICAgIHsKKyAgICAgICAgVmlydHVhbEZyZWUoIGJhc2UsIDAsIE1FTV9SRUxFQVNFICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCisgICAgLyogU2V0IHVwIGhlYWRlciBhbmQgaGFuZGxlIHRhYmxlICovCisgICAgCisgICAgaGVhZGVyID0gKExPQ0FMMzJIRUFERVIgKikoYmFzZSArIHNlZ1NpemUpOworICAgIGhlYWRlci0+YmFzZSAgICA9IGJhc2U7CisgICAgaGVhZGVyLT5saW1pdCAgID0gSFRBQkxFX1BBR0VTSVpFLTE7CisgICAgaGVhZGVyLT5mbGFncyAgID0gMDsKKyAgICBoZWFkZXItPm1hZ2ljICAgPSBMT0NBTDMyX01BR0lDOworICAgIGhlYWRlci0+aGVhcCAgICA9IChIQU5ETEUzMiloZWFwOworCisgICAgaGVhZGVyLT5mcmVlTGlzdEZpcnN0WzBdID0gc2l6ZW9mKExPQ0FMMzJIRUFERVIpOworICAgIGhlYWRlci0+ZnJlZUxpc3RMYXN0WzBdICA9IEhUQUJMRV9QQUdFU0laRSAtIDQ7CisgICAgaGVhZGVyLT5mcmVlTGlzdFNpemVbMF0gID0gKEhUQUJMRV9QQUdFU0laRSAtIHNpemVvZihMT0NBTDMySEVBREVSKSkgLyA0OworCisgICAgZm9yIChpID0gaGVhZGVyLT5mcmVlTGlzdEZpcnN0WzBdOyBpIDwgaGVhZGVyLT5mcmVlTGlzdExhc3RbMF07IGkgKz0gNCkKKyAgICAgICAgKihEV09SRCAqKSgoTFBCWVRFKWhlYWRlciArIGkpID0gaSs0OworCisgICAgaGVhZGVyLT5mcmVlTGlzdEZpcnN0WzFdID0gMHhmZmZmOworCisKKyAgICAvKiBTZXQgdXAgc2VsZWN0b3IgdGFibGUgKi8KKyAgCisgICAgbnJCbG9ja3MgICAgICA9ICh0b3RTaXplICsgMHg3ZmZmKSA+PiAxNTsgCisgICAgc2VsZWN0b3JUYWJsZSA9IChMUFdPUkQpIEhlYXBBbGxvYyggaGVhZGVyLT5oZWFwLCAgMCwgbnJCbG9ja3MgKiAyICk7CisgICAgc2VsZWN0b3JFdmVuICA9IFNFTEVDVE9SX0FsbG9jQmxvY2soIGJhc2UsIHRvdFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdNRU5UX0RBVEEsIEZBTFNFLCBGQUxTRSApOworICAgIHNlbGVjdG9yT2RkICAgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBiYXNlICsgMHg4MDAwLCB0b3RTaXplIC0gMHg4MDAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHTUVOVF9EQVRBLCBGQUxTRSwgRkFMU0UgKTsKKyAgICAKKyAgICBpZiAoICFzZWxlY3RvclRhYmxlIHx8ICFzZWxlY3RvckV2ZW4gfHwgIXNlbGVjdG9yT2RkICkKKyAgICB7CisgICAgICAgIGlmICggc2VsZWN0b3JUYWJsZSApIEhlYXBGcmVlKCBoZWFkZXItPmhlYXAsIDAsIHNlbGVjdG9yVGFibGUgKTsKKyAgICAgICAgaWYgKCBzZWxlY3RvckV2ZW4gICkgU0VMRUNUT1JfRnJlZUJsb2NrKCBzZWxlY3RvckV2ZW4sIHRvdFNpemUgPj4gMTYgKTsKKyAgICAgICAgaWYgKCBzZWxlY3Rvck9kZCAgICkgU0VMRUNUT1JfRnJlZUJsb2NrKCBzZWxlY3Rvck9kZCwgKHRvdFNpemUtMHg4MDAwKSA+PiAxNiApOworICAgICAgICBIZWFwRGVzdHJveSggaGVhZGVyLT5oZWFwICk7CisgICAgICAgIFZpcnR1YWxGcmVlKCBiYXNlLCAwLCBNRU1fUkVMRUFTRSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBoZWFkZXItPnNlbGVjdG9yVGFibGVPZmZzZXQgPSAoTFBCWVRFKXNlbGVjdG9yVGFibGUgLSBoZWFkZXItPmJhc2U7CisgICAgaGVhZGVyLT5zZWxlY3RvclRhYmxlU2l6ZSAgID0gbnJCbG9ja3MgKiA0OyAgLyogPz8/IFdpbjk1IGRvZXMgaXQgdGhpcyB3YXkhICovCisgICAgaGVhZGVyLT5zZWxlY3RvckRlbHRhICAgICAgID0gc2VsZWN0b3JFdmVuIC0gc2VsZWN0b3JPZGQ7CisgICAgaGVhZGVyLT5zZWdtZW50ICAgICAgICAgICAgID0gc2VnbWVudD8gc2VnbWVudCA6IHNlbGVjdG9yRXZlbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuckJsb2NrczsgaSsrKQorICAgICAgICBzZWxlY3RvclRhYmxlW2ldID0gKGkgJiAxKT8gc2VsZWN0b3JPZGQgICsgKChpID4+IDEpIDw8IF9fQUhTSElGVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdG9yRXZlbiArICgoaSA+PiAxKSA8PCBfX0FIU0hJRlQpOworCisgICAgLyogTW92ZSBvbGQgc2VnbWVudCAqLworCisgICAgaWYgKCBzZWdtZW50ICkKKyAgICB7CisgICAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIHNvbWV3aGF0IHVnbHkgYW5kIHJlbGllcyBvbiBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgZGV0YWlscyBhYm91dCAxNi1iaXQgZ2xvYmFsIG1lbW9yeSBoYW5kbGVzIC4uLiAqLworCisgICAgICAgIExQQllURSBvbGRCYXNlID0gKExQQllURSlHZXRTZWxlY3RvckJhc2UoIHNlZ21lbnQgKTsKKyAgICAgICAgbWVtY3B5KCBiYXNlLCBvbGRCYXNlLCBzZWdTaXplICk7CisgICAgICAgIEdMT0JBTF9Nb3ZlQmxvY2soIHNlZ21lbnQsIGJhc2UsIHRvdFNpemUgKTsKKyAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIG9sZEJhc2UgKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChIQU5ETEUzMiloZWFkZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExvY2FsMzJfU2VhcmNoSGFuZGxlCisgKi8KK3N0YXRpYyBMUERXT1JEIExvY2FsMzJfU2VhcmNoSGFuZGxlKCBMT0NBTDMySEVBREVSICpoZWFkZXIsIERXT1JEIGFkZHIgKQoreworICAgIExQRFdPUkQgaGFuZGxlOworCisgICAgZm9yICggaGFuZGxlID0gKExQRFdPUkQpKChMUEJZVEUpaGVhZGVyICsgc2l6ZW9mKExPQ0FMMzJIRUFERVIpKTsKKyAgICAgICAgICBoYW5kbGUgPCAoTFBEV09SRCkoKExQQllURSloZWFkZXIgKyBoZWFkZXItPmxpbWl0KTsKKyAgICAgICAgICBoYW5kbGUrKykKKyAgICB7CisgICAgICAgIGlmICgqaGFuZGxlID09IGFkZHIpCisgICAgICAgICAgICByZXR1cm4gaGFuZGxlOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2NhbDMyX1RvSGFuZGxlCisgKi8KK3N0YXRpYyBWT0lEIExvY2FsMzJfVG9IYW5kbGUoIExPQ0FMMzJIRUFERVIgKmhlYWRlciwgSU5UMTYgdHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhZGRyLCBMUERXT1JEICpoYW5kbGUsIExQQllURSAqcHRyICkKK3sKKyAgICAqaGFuZGxlID0gTlVMTDsKKyAgICAqcHRyICAgID0gTlVMTDsKKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgLTI6ICAgIC8qIDE2OjE2IHBvaW50ZXIsIG5vIGhhbmRsZXMgKi8KKyAgICAgICAgICAgICpwdHIgICAgPSBQVFJfU0VHX1RPX0xJTiggYWRkciApOworICAgICAgICAgICAgKmhhbmRsZSA9IChMUERXT1JEKSpwdHI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIC0xOiAgICAvKiAzMi1iaXQgb2Zmc2V0LCBubyBoYW5kbGVzICovCisgICAgICAgICAgICAqcHRyICAgID0gaGVhZGVyLT5iYXNlICsgYWRkcjsKKyAgICAgICAgICAgICpoYW5kbGUgPSAoTFBEV09SRCkqcHRyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAwOiAgICAgLyogaGFuZGxlICovCisgICAgICAgICAgICBpZiAoICAgIGFkZHIgPj0gc2l6ZW9mKExPQ0FMMzJIRUFERVIpIAorICAgICAgICAgICAgICAgICAmJiBhZGRyIDwgIGhlYWRlci0+bGltaXQgJiYgIShhZGRyICYgMykgCisgICAgICAgICAgICAgICAgICYmICooTFBEV09SRCkoKExQQllURSloZWFkZXIgKyBhZGRyKSA+PSBIVEFCTEVfU0laRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IChMUERXT1JEKSgoTFBCWVRFKWhlYWRlciArIGFkZHIpOworICAgICAgICAgICAgICAgICpwdHIgICAgPSBoZWFkZXItPmJhc2UgKyAqKmhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTogICAgIC8qIDE2OjE2IHBvaW50ZXIgKi8KKyAgICAgICAgICAgICpwdHIgICAgPSBQVFJfU0VHX1RPX0xJTiggYWRkciApOworICAgICAgICAgICAgKmhhbmRsZSA9IExvY2FsMzJfU2VhcmNoSGFuZGxlKCBoZWFkZXIsICpwdHIgLSBoZWFkZXItPmJhc2UgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjogICAgIC8qIDMyLWJpdCBvZmZzZXQgKi8KKyAgICAgICAgICAgICpwdHIgICAgPSBoZWFkZXItPmJhc2UgKyBhZGRyOworICAgICAgICAgICAgKmhhbmRsZSA9IExvY2FsMzJfU2VhcmNoSGFuZGxlKCBoZWFkZXIsICpwdHIgLSBoZWFkZXItPmJhc2UgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTG9jYWwzMl9Gcm9tSGFuZGxlCisgKi8KK3N0YXRpYyBWT0lEIExvY2FsMzJfRnJvbUhhbmRsZSggTE9DQUwzMkhFQURFUiAqaGVhZGVyLCBJTlQxNiB0eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKmFkZHIsIExQRFdPUkQgaGFuZGxlLCBMUEJZVEUgcHRyICkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIC0yOiAgICAvKiAxNjoxNiBwb2ludGVyICovCisgICAgICAgIGNhc2UgIDE6CisgICAgICAgIHsKKyAgICAgICAgICAgIFdPUkQgKnNlbFRhYmxlID0gKExQV09SRCkoaGVhZGVyLT5iYXNlICsgaGVhZGVyLT5zZWxlY3RvclRhYmxlT2Zmc2V0KTsKKyAgICAgICAgICAgIERXT1JEIG9mZnNldCAgID0gKExQQllURSlwdHIgLSBoZWFkZXItPmJhc2U7CisgICAgICAgICAgICAqYWRkciA9IE1BS0VMT05HKCBvZmZzZXQgJiAweDdmZmYsIHNlbFRhYmxlW29mZnNldCA+PiAxNV0gKTsgCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAtMTogICAgLyogMzItYml0IG9mZnNldCAqLworICAgICAgICBjYXNlICAyOgorICAgICAgICAgICAgKmFkZHIgPSBwdHIgLSBoZWFkZXItPmJhc2U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICAwOiAgICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICphZGRyID0gKExQQllURSloYW5kbGUgLSAoTFBCWVRFKWhlYWRlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTG9jYWwzMkFsbG9jICAgKEtFUk5FTC4yMDkpCisgKi8KK0RXT1JEIFdJTkFQSSBMb2NhbDMyQWxsb2MoIEhBTkRMRTMyIGhlYXAsIERXT1JEIHNpemUsIElOVDE2IHR5cGUsIERXT1JEIGZsYWdzICkKK3sKKyAgICBMT0NBTDMySEVBREVSICpoZWFkZXIgPSAoTE9DQUwzMkhFQURFUiAqKWhlYXA7CisgICAgTFBEV09SRCBoYW5kbGU7CisgICAgTFBCWVRFIHB0cjsKKyAgICBEV09SRCBhZGRyOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5ICovCisgICAgcHRyID0gSGVhcEFsbG9jKCBoZWFkZXItPmhlYXAsIAorICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgTE1FTV9NT1ZFQUJMRSk/IEhFQVBfWkVST19NRU1PUlkgOiAwLCBzaXplICk7CisgICAgaWYgKCFwdHIpIHJldHVybiAwOworCisKKyAgICAvKiBBbGxvY2F0ZSBoYW5kbGUgaWYgcmVxdWVzdGVkICovCisgICAgaWYgKHR5cGUgPj0gMCkKKyAgICB7CisgICAgICAgIGludCBwYWdlLCBpOworCisgICAgICAgIC8qIEZpbmQgZmlyc3QgcGFnZSBvZiBoYW5kbGUgdGFibGUgd2l0aCBmcmVlIHNsb3RzICovCisgICAgICAgIGZvciAocGFnZSA9IDA7IHBhZ2UgPCBIVEFCTEVfTlBBR0VTOyBwYWdlKyspCisgICAgICAgICAgICBpZiAoaGVhZGVyLT5mcmVlTGlzdEZpcnN0W3BhZ2VdICE9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChwYWdlID09IEhUQUJMRV9OUEFHRVMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdBUk4oIGhlYXAsICJPdXQgb2YgaGFuZGxlcyFcbiIgKTsKKyAgICAgICAgICAgIEhlYXBGcmVlKCBoZWFkZXItPmhlYXAsIDAsIHB0ciApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB2aXJnaW4gcGFnZSwgaW5pdGlhbGl6ZSBpdCAqLworICAgICAgICBpZiAoaGVhZGVyLT5mcmVlTGlzdEZpcnN0W3BhZ2VdID09IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAhVmlydHVhbEFsbG9jKCAoTFBCWVRFKWhlYWRlciArIChwYWdlIDw8IDEyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV0FSTiggaGVhcCwgIkNhbm5vdCBncm93IGhhbmRsZSB0YWJsZSFcbiIgKTsKKyAgICAgICAgICAgICAgICBIZWFwRnJlZSggaGVhZGVyLT5oZWFwLCAwLCBwdHIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaGVhZGVyLT5saW1pdCArPSBIVEFCTEVfUEFHRVNJWkU7CisKKyAgICAgICAgICAgIGhlYWRlci0+ZnJlZUxpc3RGaXJzdFtwYWdlXSA9IDA7CisgICAgICAgICAgICBoZWFkZXItPmZyZWVMaXN0TGFzdFtwYWdlXSAgPSBIVEFCTEVfUEFHRVNJWkUgLSA0OworICAgICAgICAgICAgaGVhZGVyLT5mcmVlTGlzdFNpemVbcGFnZV0gID0gSFRBQkxFX1BBR0VTSVpFIC8gNDsKKyAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSFRBQkxFX1BBR0VTSVpFOyBpICs9IDQpCisgICAgICAgICAgICAgICAgKihEV09SRCAqKSgoTFBCWVRFKWhlYWRlciArIGkpID0gaSs0OworCisgICAgICAgICAgICBpZiAocGFnZSA8IDMxKSAKKyAgICAgICAgICAgICAgICBoZWFkZXItPmZyZWVMaXN0Rmlyc3RbcGFnZSsxXSA9IDB4ZmZmZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFsbG9jYXRlIGhhbmRsZSBzbG90IGZyb20gcGFnZSAqLworICAgICAgICBoYW5kbGUgPSAoTFBEV09SRCkoKExQQllURSloZWFkZXIgKyBoZWFkZXItPmZyZWVMaXN0Rmlyc3RbcGFnZV0pOworICAgICAgICBpZiAoLS1oZWFkZXItPmZyZWVMaXN0U2l6ZVtwYWdlXSA9PSAwKQorICAgICAgICAgICAgaGVhZGVyLT5mcmVlTGlzdEZpcnN0W3BhZ2VdID0gaGVhZGVyLT5mcmVlTGlzdExhc3RbcGFnZV0gPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZWFkZXItPmZyZWVMaXN0Rmlyc3RbcGFnZV0gPSAqaGFuZGxlOworCisgICAgICAgIC8qIFN0b3JlIDMyLWJpdCBvZmZzZXQgaW4gaGFuZGxlIHNsb3QgKi8KKyAgICAgICAgKmhhbmRsZSA9IHB0ciAtIGhlYWRlci0+YmFzZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaGFuZGxlID0gKExQRFdPUkQpcHRyOworICAgICAgICBoZWFkZXItPmZsYWdzIHw9IDE7CisgICAgfQorCisKKyAgICAvKiBDb252ZXJ0IGhhbmRsZSB0byByZXF1ZXN0ZWQgb3V0cHV0IHR5cGUgKi8KKyAgICBMb2NhbDMyX0Zyb21IYW5kbGUoIGhlYWRlciwgdHlwZSwgJmFkZHIsIGhhbmRsZSwgcHRyICk7CisgICAgcmV0dXJuIGFkZHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExvY2FsMzJSZUFsbG9jICAgKEtFUk5FTC4yMTApCisgKi8KK0RXT1JEIFdJTkFQSSBMb2NhbDMyUmVBbGxvYyggSEFORExFMzIgaGVhcCwgRFdPUkQgYWRkciwgSU5UMTYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgRFdPUkQgZmxhZ3MgKQoreworICAgIExPQ0FMMzJIRUFERVIgKmhlYWRlciA9IChMT0NBTDMySEVBREVSICopaGVhcDsKKyAgICBMUERXT1JEIGhhbmRsZTsKKyAgICBMUEJZVEUgcHRyOworCisgICAgaWYgKCFhZGRyKQorICAgICAgICByZXR1cm4gTG9jYWwzMkFsbG9jKCBoZWFwLCBzaXplLCB0eXBlLCBmbGFncyApOworCisgICAgLyogUmV0cmlldmUgaGFuZGxlIGFuZCBwb2ludGVyICovCisgICAgTG9jYWwzMl9Ub0hhbmRsZSggaGVhZGVyLCB0eXBlLCBhZGRyLCAmaGFuZGxlLCAmcHRyICk7CisgICAgaWYgKCFoYW5kbGUpIHJldHVybiBGQUxTRTsKKworICAgIC8qIFJlYWxsb2NhdGUgbWVtb3J5IGJsb2NrICovCisgICAgcHRyID0gSGVhcFJlQWxsb2MoIGhlYWRlci0+aGVhcCwgCisgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIExNRU1fTU9WRUFCTEUpPyBIRUFQX1pFUk9fTUVNT1JZIDogMCwgCisgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgc2l6ZSApOworICAgIGlmICghcHRyKSByZXR1cm4gMDsKKworICAgIC8qIE1vZGlmeSBoYW5kbGUgKi8KKyAgICBpZiAodHlwZSA+PSAwKQorICAgICAgICAqaGFuZGxlID0gcHRyIC0gaGVhZGVyLT5iYXNlOworICAgIGVsc2UKKyAgICAgICAgaGFuZGxlID0gKExQRFdPUkQpcHRyOworCisgICAgLyogQ29udmVydCBoYW5kbGUgdG8gcmVxdWVzdGVkIG91dHB1dCB0eXBlICovCisgICAgTG9jYWwzMl9Gcm9tSGFuZGxlKCBoZWFkZXIsIHR5cGUsICZhZGRyLCBoYW5kbGUsIHB0ciApOworICAgIHJldHVybiBhZGRyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2NhbDMyRnJlZSAgIChLRVJORUwuMjExKQorICovCitCT09MMzIgV0lOQVBJIExvY2FsMzJGcmVlKCBIQU5ETEUzMiBoZWFwLCBEV09SRCBhZGRyLCBJTlQxNiB0eXBlICkKK3sKKyAgICBMT0NBTDMySEVBREVSICpoZWFkZXIgPSAoTE9DQUwzMkhFQURFUiAqKWhlYXA7CisgICAgTFBEV09SRCBoYW5kbGU7CisgICAgTFBCWVRFIHB0cjsKKworICAgIC8qIFJldHJpZXZlIGhhbmRsZSBhbmQgcG9pbnRlciAqLworICAgIExvY2FsMzJfVG9IYW5kbGUoIGhlYWRlciwgdHlwZSwgYWRkciwgJmhhbmRsZSwgJnB0ciApOworICAgIGlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBGcmVlIGhhbmRsZSBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAodHlwZSA+PSAwKQorICAgIHsKKyAgICAgICAgaW50IG9mZnNldCA9IChMUEJZVEUpaGFuZGxlIC0gKExQQllURSloZWFkZXI7CisgICAgICAgIGludCBwYWdlICAgPSBvZmZzZXQgPj4gMTI7CisKKyAgICAgICAgLyogUmV0dXJuIGhhbmRsZSBzbG90IHRvIHBhZ2UgZnJlZSBsaXN0ICovCisgICAgICAgIGlmIChoZWFkZXItPmZyZWVMaXN0U2l6ZVtwYWdlXSsrID09IDApCisgICAgICAgICAgICBoZWFkZXItPmZyZWVMaXN0Rmlyc3RbcGFnZV0gPSBoZWFkZXItPmZyZWVMaXN0TGFzdFtwYWdlXSAgPSBvZmZzZXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICooTFBEV09SRCkoKExQQllURSloZWFkZXIgKyBoZWFkZXItPmZyZWVMaXN0TGFzdFtwYWdlXSkgPSBvZmZzZXQsCisgICAgICAgICAgICBoZWFkZXItPmZyZWVMaXN0TGFzdFtwYWdlXSA9ICpoYW5kbGU7CisKKyAgICAgICAgKmhhbmRsZSA9IDA7CisKKyAgICAgICAgLyogU2hyaW5rIGhhbmRsZSB0YWJsZSB3aGVuIHBvc3NpYmxlICovCisgICAgICAgIHdoaWxlIChwYWdlID4gMCAmJiBoZWFkZXItPmZyZWVMaXN0U2l6ZVtwYWdlXSA9PSBIVEFCTEVfUEFHRVNJWkUgLyA0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIFZpcnR1YWxGcmVlKCAoTFBCWVRFKWhlYWRlciArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlci0+bGltaXQgJiB+KEhUQUJMRV9QQUdFU0laRS0xKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVEFCTEVfUEFHRVNJWkUsIE1FTV9ERUNPTU1JVCApICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaGVhZGVyLT5saW1pdCAtPSBIVEFCTEVfUEFHRVNJWkU7CisgICAgICAgICAgICBoZWFkZXItPmZyZWVMaXN0Rmlyc3RbcGFnZV0gPSAtMTsKKyAgICAgICAgICAgIHBhZ2UtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5ICovCisgICAgcmV0dXJuIEhlYXBGcmVlKCBoZWFkZXItPmhlYXAsIDAsIHB0ciApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2NhbDMyVHJhbnNsYXRlICAgKEtFUk5FTC4yMTMpCisgKi8KK0RXT1JEIFdJTkFQSSBMb2NhbDMyVHJhbnNsYXRlKCBIQU5ETEUzMiBoZWFwLCBEV09SRCBhZGRyLCBJTlQxNiB0eXBlMSwgSU5UMTYgdHlwZTIgKQoreworICAgIExPQ0FMMzJIRUFERVIgKmhlYWRlciA9IChMT0NBTDMySEVBREVSICopaGVhcDsKKyAgICBMUERXT1JEIGhhbmRsZTsKKyAgICBMUEJZVEUgcHRyOworCisgICAgTG9jYWwzMl9Ub0hhbmRsZSggaGVhZGVyLCB0eXBlMSwgYWRkciwgJmhhbmRsZSwgJnB0ciApOworICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKKworICAgIExvY2FsMzJfRnJvbUhhbmRsZSggaGVhZGVyLCB0eXBlMiwgJmFkZHIsIGhhbmRsZSwgcHRyICk7CisgICAgcmV0dXJuIGFkZHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExvY2FsMzJTaXplICAgKEtFUk5FTC4yMTQpCisgKi8KK0RXT1JEIFdJTkFQSSBMb2NhbDMyU2l6ZSggSEFORExFMzIgaGVhcCwgRFdPUkQgYWRkciwgSU5UMTYgdHlwZSApCit7CisgICAgTE9DQUwzMkhFQURFUiAqaGVhZGVyID0gKExPQ0FMMzJIRUFERVIgKiloZWFwOworICAgIExQRFdPUkQgaGFuZGxlOworICAgIExQQllURSBwdHI7CisKKyAgICBMb2NhbDMyX1RvSGFuZGxlKCBoZWFkZXIsIHR5cGUsIGFkZHIsICZoYW5kbGUsICZwdHIgKTsKKyAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gSGVhcFNpemUoIGhlYWRlci0+aGVhcCwgMCwgcHRyICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExvY2FsMzJWYWxpZEhhbmRsZSAgIChLRVJORUwuMjE1KQorICovCitCT09MMzIgV0lOQVBJIExvY2FsMzJWYWxpZEhhbmRsZSggSEFORExFMzIgaGVhcCwgV09SRCBhZGRyICkKK3sKKyAgICBMT0NBTDMySEVBREVSICpoZWFkZXIgPSAoTE9DQUwzMkhFQURFUiAqKWhlYXA7CisgICAgTFBEV09SRCBoYW5kbGU7CisgICAgTFBCWVRFIHB0cjsKKworICAgIExvY2FsMzJfVG9IYW5kbGUoIGhlYWRlciwgMCwgYWRkciwgJmhhbmRsZSwgJnB0ciApOworICAgIHJldHVybiBoYW5kbGUgIT0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTG9jYWwzMkdldFNlZ21lbnQgICAoS0VSTkVMLjIyOSkKKyAqLworV09SRCBXSU5BUEkgTG9jYWwzMkdldFNlZ21lbnQoIEhBTkRMRTMyIGhlYXAgKQoreworICAgIExPQ0FMMzJIRUFERVIgKmhlYWRlciA9IChMT0NBTDMySEVBREVSICopaGVhcDsKKyAgICByZXR1cm4gaGVhZGVyLT5zZWdtZW50OworfQorCisKZGlmZiAtLWdpdCBhL21lbW9yeS9sb2NhbC5jIGIvbWVtb3J5L2xvY2FsLmMKaW5kZXggNWU0MTkyYy4uOWQ4ZmU4NyAxMDA2NDQKLS0tIGEvbWVtb3J5L2xvY2FsLmMKKysrIGIvbWVtb3J5L2xvY2FsLmMKQEAgLTM0NSw3ICszNDUsOCBAQAogCWlmICgocE1vZHVsZSA9IE5FX0dldFB0ciggc2VsZWN0b3IgKSkpCiAJewogCSAgICBTRUdUQUJMRUVOVFJZICpwU2VnID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxOwotCSAgICBpZiAocE1vZHVsZS0+ZGdyb3VwICYmIChwU2VnLT5zZWxlY3RvciA9PSBzZWxlY3RvcikpIHsKKwkgICAgaWYgKHBNb2R1bGUtPmRncm91cCAmJiAoR2xvYmFsSGFuZGxlVG9TZWwocFNlZy0+aFNlZykgPT0gc2VsZWN0b3IpKQorCSAgICB7CiAJCS8qIFdlIGNhbid0IGp1c3QgdXNlIHRoZSBzaW1wbGUgbWV0aG9kIG9mIHVzaW5nIHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgICAqIG9mIG1pbnNpemUgKyBzdGFja3NpemUsIHNpbmNlIHRoZXJlIGFyZSBwcm9ncmFtcyB0aGF0CiAgICAgICAgICAgICAgICAgICogcmVzaXplIHRoZSBkYXRhIHNlZ21lbnQgYmVmb3JlIGNhbGxpbmcgSW5pdFRhc2soKS4gU28sCkBAIC0xNjAyLDcgKzE2MDMsOCBAQAogICAgIFdPUkQgZHM7CiAKICAgICBpZiAoIShwTW9kdWxlID0gTkVfR2V0UHRyKCBtb2R1bGUgKSkpIHJldHVybiAwOwotICAgIGRzID0gKE5FX1NFR19UQUJMRSggcE1vZHVsZSApICsgcE1vZHVsZS0+ZGdyb3VwIC0gMSktPnNlbGVjdG9yOworICAgIGRzID0KKyAgICBHbG9iYWxIYW5kbGVUb1NlbCgoTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxKS0+aFNlZyk7CiAgICAgcmV0dXJuIE1BS0VMT05HKCBMT0NBTF9Db3VudEZyZWUoIGRzICksIExPQ0FMX0hlYXBTaXplKCBkcyApICk7CiB9CiAKZGlmZiAtLWdpdCBhL21lbW9yeS9zZWxlY3Rvci5jIGIvbWVtb3J5L3NlbGVjdG9yLmMKaW5kZXggODU5Y2M2YS4uMTZiZGRjNiAxMDA2NDQKLS0tIGEvbWVtb3J5L3NlbGVjdG9yLmMKKysrIGIvbWVtb3J5L3NlbGVjdG9yLmMKQEAgLTQwNiw3ICs0MDYsNyBAQAogICAgIGlmIChJU19TRUxFQ1RPUl9GUkVFKHNlbCkpIHJldHVybiBUUlVFOwogICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoc2VsKSwgJmVudHJ5ICk7CiAgICAgaWYgKGVudHJ5LnR5cGUgIT0gU0VHTUVOVF9DT0RFKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoT0ZGU0VUT0YobHBmbikgPiBlbnRyeS5saW1pdCkgcmV0dXJuIFRSVUU7CisgICAgaWYgKE9GRlNFVE9GKGxwZm4pID4gR0VUX1NFTF9MSU1JVChzZWwpKSByZXR1cm4gVFJVRTsKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTQyNSw3ICs0MjUsNyBAQAogICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoc2VsKSwgJmVudHJ5ICk7CiAgICAgaWYgKChlbnRyeS50eXBlID09IFNFR01FTlRfQ09ERSkgJiYgZW50cnkucmVhZF9vbmx5KSByZXR1cm4gVFJVRTsKICAgICBpZiAoc3RybGVuKFBUUl9TRUdfVE9fTElOKHB0cikpIDwgc2l6ZSkgc2l6ZSA9IHN0cmxlbihQVFJfU0VHX1RPX0xJTihwdHIpKTsKLSAgICBpZiAoT0ZGU0VUT0YocHRyKSArIHNpemUgLSAxID4gZW50cnkubGltaXQpIHJldHVybiBUUlVFOworICAgIGlmIChPRkZTRVRPRihwdHIpICsgc2l6ZSAtIDEgPiBHRVRfU0VMX0xJTUlUKHNlbCkpIHJldHVybiBUUlVFOwogICAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtNDQzLDcgKzQ0Myw3IEBACiAgICAgaWYgKElTX1NFTEVDVE9SX0ZSRUUoc2VsKSkgcmV0dXJuIFRSVUU7CiAgICAgTERUX0dldEVudHJ5KCBTRUxFQ1RPUl9UT19FTlRSWShzZWwpLCAmZW50cnkgKTsKICAgICBpZiAoKGVudHJ5LnR5cGUgPT0gU0VHTUVOVF9DT0RFKSAmJiBlbnRyeS5yZWFkX29ubHkpIHJldHVybiBUUlVFOwotICAgIGlmIChPRkZTRVRPRihwdHIpICsgc2l6ZSAtIDEgPiBlbnRyeS5saW1pdCkgcmV0dXJuIFRSVUU7CisgICAgaWYgKE9GRlNFVE9GKHB0cikgKyBzaXplIC0gMSA+IEdFVF9TRUxfTElNSVQoc2VsKSkgcmV0dXJuIFRSVUU7CiAgICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC00NjEsNyArNDYxLDcgQEAKICAgICBpZiAoSVNfU0VMRUNUT1JfRlJFRShzZWwpKSByZXR1cm4gVFJVRTsKICAgICBMRFRfR2V0RW50cnkoIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCksICZlbnRyeSApOwogICAgIGlmICgoZW50cnkudHlwZSA9PSBTRUdNRU5UX0NPREUpIHx8IGVudHJ5LnJlYWRfb25seSkgcmV0dXJuIFRSVUU7Ci0gICAgaWYgKE9GRlNFVE9GKHB0cikgKyBzaXplIC0gMSA+IGVudHJ5LmxpbWl0KSByZXR1cm4gVFJVRTsKKyAgICBpZiAoT0ZGU0VUT0YocHRyKSArIHNpemUgLSAxID4gR0VUX1NFTF9MSU1JVChzZWwpKSByZXR1cm4gVFJVRTsKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKZGlmZiAtLWdpdCBhL21lbW9yeS92aXJ0dWFsLmMgYi9tZW1vcnkvdmlydHVhbC5jCmluZGV4IDNiNGU5NGYuLjU4YWEzMmEgMTAwNjQ0Ci0tLSBhL21lbW9yeS92aXJ0dWFsLmMKKysrIGIvbWVtb3J5L3ZpcnR1YWwuYwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTMxMCw4ICszMTEsMTAgQEAKICkgewogICAgIGlmIChwcm90ZWN0KSB7CiAgICAgCSpwcm90ZWN0ID0gVklSVFVBTF9XaW4zMkZsYWdzW3Zwcm90ICYgMHgwZl07Ci0gICAgCWlmICh2cHJvdCAmIFZQUk9UX0dVQVJEKSAqcHJvdGVjdCB8PSBQQUdFX0dVQVJEOworLyogICAgCWlmICh2cHJvdCAmIFZQUk9UX0dVQVJEKSAqcHJvdGVjdCB8PSBQQUdFX0dVQVJEOyovCiAgICAgCWlmICh2cHJvdCAmIFZQUk9UX05PQ0FDSEUpICpwcm90ZWN0IHw9IFBBR0VfTk9DQUNIRTsKKworICAgIAlpZiAodnByb3QgJiBWUFJPVF9HVUFSRCkgKnByb3RlY3QgPSBQQUdFX05PQUNDRVNTOwogICAgIH0KIAogICAgIGlmIChzdGF0ZSkgKnN0YXRlID0gKHZwcm90ICYgVlBST1RfQ09NTUlUVEVEKSA/IE1FTV9DT01NSVQgOiBNRU1fUkVTRVJWRTsKZGlmZiAtLWdpdCBhL21pc2MvTWFrZWZpbGUuaW4gYi9taXNjL01ha2VmaWxlLmluCmluZGV4IGJjNWY3ODMuLjJhYjhmNTQgMTAwNjQ0Ci0tLSBhL21pc2MvTWFrZWZpbGUuaW4KKysrIGIvbWlzYy9NYWtlZmlsZS5pbgpAQCAtNiw3ICs2LDYgQEAKIE1PRFVMRSAgICA9IG1pc2MKIAogQ19TUkNTID0gXAotCWFzcGkuYyBcCiAJY2FsbGJhY2suYyBcCiAJY29tbS5jIFwKIAljb21tZGxnLmMgXApkaWZmIC0tZ2l0IGEvbWlzYy9hc3BpLmMgYi9taXNjL2FzcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1OTJhOS4uMDAwMDAwMAotLS0gYS9taXNjL2FzcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGR0Lmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Y2FsbGJhY2suaD4KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAiYXNwaS5oIgotI2luY2x1ZGUgIm9wdGlvbnMuaCIKLSNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJtaXNjZW11LmgiCi0KLQotLyogRklYTUUhCi0gKiAxKSBSZXNpZHVhbCBieXRlIGxlbmd0aCByZXBvcnRpbmcgbm90IGhhbmRsZWQKLSAqIDIpIE1ha2UgdGhpcyBjb2RlIHJlLWVudHJhbnQgZm9yIG11bHRpdGhyZWFkaW5nCi0gKiAzKSBPbmx5IGxpbnV4IHN1cHBvcnRlZCBzbyBmYXIKLSAqLwotCi0jaWZkZWYgbGludXgKLQotLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgc2dfaGVhZGVyIGZyb20gL3Vzci9zcmMvbGludXgvaW5jbHVkZS9zY3NpL3NnLmgKLSAqIGtlcm5lbCAyLjAuMzAKLSAqIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBhdCBzb21lIHBvaW50LCBidXQgZm9yIHRob3NlIHdobyBkb24ndCBoYXZlCi0gKiBrZXJuZWxzIGluc3RhbGxlZCwgSSB0aGluayB0aGlzIHNob3VsZCBzdGlsbCB3b3JrLgotICoKLSAqLwotCi1zdHJ1Y3Qgc2dfaGVhZGVyCi0gewotICBpbnQgcGFja19sZW47ICAgIC8qIGxlbmd0aCBvZiBpbmNvbWluZyBwYWNrZXQgPDQwOTYgKGluY2x1ZGluZyBoZWFkZXIpICovCi0gIGludCByZXBseV9sZW47ICAgLyogbWF4aW11bSBsZW5ndGggPDQwOTYgb2YgZXhwZWN0ZWQgcmVwbHkgKi8KLSAgaW50IHBhY2tfaWQ7ICAgICAvKiBpZCBudW1iZXIgb2YgcGFja2V0ICovCi0gIGludCByZXN1bHQ7ICAgICAgLyogMD09b2ssIG90aGVyd2lzZSByZWZlciB0byBlcnJubyBjb2RlcyAqLwotICB1bnNpZ25lZCBpbnQgdHdlbHZlX2J5dGU6MTsgLyogRm9yY2UgMTIgYnl0ZSBjb21tYW5kIGxlbmd0aCBmb3IgZ3JvdXAgNiAmIDcgY29tbWFuZHMgICovCi0gIHVuc2lnbmVkIGludCBvdGhlcl9mbGFnczozMTsJCQkvKiBmb3IgZnV0dXJlIHVzZSAqLwotICB1bnNpZ25lZCBjaGFyIHNlbnNlX2J1ZmZlclsxNl07IC8qIHVzZWQgb25seSBieSByZWFkcyAqLwotICAvKiBjb21tYW5kIGZvbGxvd3MgdGhlbiBkYXRhIGZvciBjb21tYW5kICovCi0gfTsKLQotI2RlZmluZSBTQ1NJX09GRiBzaXplb2Yoc3RydWN0IHNnX2hlYWRlcikKLSNlbmRpZgotCi0jZGVmaW5lIEFTUElfUE9TVElORyhwcmIpIChwcmItPlNSQl9GbGFncyAmIDB4MSkKLQotI2RlZmluZSBIT1NUX1RPX1RBUkdFVChwcmIpICgoKHByYi0+U1JCX0ZsYWdzPj4zKSAmIDB4MykgPT0gMHgyKQotI2RlZmluZSBUQVJHRVRfVE9fSE9TVChwcmIpICgoKHByYi0+U1JCX0ZsYWdzPj4zKSAmIDB4MykgPT0gMHgxKQotI2RlZmluZSBOT19EQVRBX1RSQU5TRkVSRUQocHJiKSAoKChwcmItPlNSQl9GbGFncz4+MykgJiAweDMpID09IDB4MykKLQotI2RlZmluZSBTUkJfRU5BQkxFX1JFU0lEVUFMX0NPVU5UIDB4NAotCi0jZGVmaW5lIElOUVVJUllfVkVORE9SCQk4Ci0KLSNkZWZpbmUgTVVTVEVLX1NDU0lfQVJFQV9BTkRfV0lORE9XUyAweDA0Ci0jZGVmaW5lIE1VU1RFS19TQ1NJX1JFQURfU0NBTk5FRF9EQVRBIDB4MDgKLSNkZWZpbmUgTVVTVEVLX1NDU0lfR0VUX0lNQUdFX1NUQVRVUyAweDBmCi0jZGVmaW5lIE1VU1RFS19TQ1NJX0FERl9BTkRfQkFDS1RSQUNFIDB4MTAKLSNkZWZpbmUgTVVTVEVLX1NDU0lfQ0NEX0RJU1RBTkNFIDB4MTEKLSNkZWZpbmUgTVVTVEVLX1NDU0lfU1RBUlRfU1RPUCAweDFiCi0KLSNkZWZpbmUgQ01EX1RFU1RfVU5JVF9SRUFEWSAweDAwCi0jZGVmaW5lIENNRF9SRVFVRVNUX1NFTlNFIDB4MDMKLSNkZWZpbmUgQ01EX0lOUVVJUlkgMHgxMgotCi0vKiBzY2FubmVyIGNvbW1hbmRzIC0ganVzdCBmb3IgZGVidWcgKi8KLSNkZWZpbmUgQ01EX1NDQU5fR0VUX0RBVEFfQlVGRkVSX1NUQVRVUyAweDM0Ci0jZGVmaW5lIENNRF9TQ0FOX0dFVF9XSU5ET1cgMHgyNQotI2RlZmluZSBDTURfU0NBTl9PQkpFQ1RfUE9TSVRJT04gMHgzMQotI2RlZmluZSBDTURfU0NBTl9SRUFEIDB4MjgKLSNkZWZpbmUgQ01EX1NDQU5fUkVMRUFTRV9VTklUIDB4MTcKLSNkZWZpbmUgQ01EX1NDQU5fUkVTRVJWRV9VTklUIDB4MTYKLSNkZWZpbmUgQ01EX1NDQU5fU0NBTiAweDFiCi0jZGVmaW5lIENNRF9TQ0FOX1NFTkQgMHgyYQotI2RlZmluZSBDTURfU0NBTl9DSEFOR0VfREVGSU5JVElPTiAweDQwCi0KLSNkZWZpbmUgSU5RVVJJWV9DTURMRU4gNgotI2RlZmluZSBJTlFVUklZX1JFUExZX0xFTiA5NgotI2RlZmluZSBJTlFVSVJZX1ZFTkRPUiA4Ci0KLSNkZWZpbmUgU0VOU0VfQlVGRkVSKHByYikgKCZwcmItPkNEQkJ5dGVbcHJiLT5TUkJfQ0RCTGVuXSkKLQotCi0vKiBKdXN0IGEgY29udGFpbmVyIGZvciBzZWVpbmcgd2hhdCBkZXZpY2VzIGFyZSBvcGVuICovCi1zdHJ1Y3QgQVNQSV9ERVZJQ0VfSU5GTyB7Ci0gICAgc3RydWN0IEFTUElfREVWSUNFX0lORk8gKgluZXh0OwotICAgIGludAkJCQlmZDsKLSAgICBpbnQJCQkJaG9zdElkOwotICAgIGludAkJCQl0YXJnZXQ7Ci0gICAgaW50CQkJCWx1bjsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IEFTUElfREVWSUNFX0lORk8gQVNQSV9ERVZJQ0VfSU5GTzsKLXN0YXRpYyBBU1BJX0RFVklDRV9JTkZPICpBU1BJX29wZW5fZGV2aWNlcyA9IE5VTEw7Ci0KLXN0YXRpYyBCT09MMTYgRE9TQVNQSSA9IEZBTFNFOwotCi0jaWZkZWYgbGludXgKLXN0YXRpYyBpbnQKLUFTUElfT3BlbkRldmljZTE2KFNSQl9FeGVjU0NTSUNtZDE2ICpwcmIpCi17Ci0gICAgaW50CWZkOwotICAgIGNoYXIJaWRzdHJbMjBdOwotICAgIGNoYXIJZGV2aWNlX3N0cls1MF07Ci0gICAgQVNQSV9ERVZJQ0VfSU5GTyAqY3VycjsKLQotICAgIC8qIHNlYXJjaCBsaXN0IG9mIGRldmljZXMgdG8gc2VlIGlmIHdlJ3ZlIG9wZW5lZCBpdCBhbHJlYWR5LgotICAgICAqIFRoZXJlIGlzIG5vdCBhbiBleHBsaWNpdCBvcGVuL2Nsb3NlIGluIEFTUEkgbGFuZCwgc28gaG9wZWZ1bGx5Ci0gICAgICoga2VlcGluZyBhIGRldmljZSBvcGVuIHdvbid0IGJlIGEgcHJvYmxlbS4KLSAgICAgKi8KLQotICAgIGZvciAoY3VyciA9IEFTUElfb3Blbl9kZXZpY2VzOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dCkgewotCWlmIChjdXJyLT5ob3N0SWQgPT0gcHJiLT5TUkJfSGFJZCAmJgotCSAgICBjdXJyLT50YXJnZXQgPT0gcHJiLT5TUkJfVGFyZ2V0ICYmCi0JICAgIGN1cnItPmx1biA9PSBwcmItPlNSQl9MdW4pIHsKLQkgICAgcmV0dXJuIGN1cnItPmZkOwotCX0KLSAgICB9Ci0KLSAgICAvKiBkZXZpY2Ugd2Fzbid0IGNhY2hlZCwgZ28gYWhlYWQgYW5kIG9wZW4gaXQgKi8KLSAgICBzcHJpbnRmKGlkc3RyLCAic2NzaSBjJTFkdCUxZGQlMWQiLCBwcmItPlNSQl9IYUlkLCBwcmItPlNSQl9UYXJnZXQsIHByYi0+U1JCX0x1bik7Ci0KLSAgICBpZiAoIVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyhpZHN0ciwgIkRldmljZSIsICIiLCBkZXZpY2Vfc3RyLCBzaXplb2YoZGV2aWNlX3N0cikpKSB7Ci0JVFJBQ0UoYXNwaSwgIlRyeWluZyB0byBvcGVuIHVubGlzdGVkIHNjc2kgZGV2aWNlICVzXG4iLCBpZHN0cik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIFRSQUNFKGFzcGksICJPcGVuaW5nIGRldmljZSAlcz0lc1xuIiwgaWRzdHIsIGRldmljZV9zdHIpOwotCi0gICAgZmQgPSBvcGVuKGRldmljZV9zdHIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID09IC0xKSB7Ci0JaW50IHNhdmVfZXJyb3IgPSBlcnJubzsKLQlXQVJOKGFzcGksICJFcnJvciBvcGVuaW5nIGRldmljZSBlcnJubz0lZFxuIiwgc2F2ZV9lcnJvcik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGRldmljZSBpcyBub3cgb3BlbiAqLwotICAgIGN1cnIgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihBU1BJX0RFVklDRV9JTkZPKSApOwotICAgIGN1cnItPmZkID0gZmQ7Ci0gICAgY3Vyci0+aG9zdElkID0gcHJiLT5TUkJfSGFJZDsKLSAgICBjdXJyLT50YXJnZXQgPSBwcmItPlNSQl9UYXJnZXQ7Ci0gICAgY3Vyci0+bHVuID0gcHJiLT5TUkJfTHVuOwotCi0gICAgLyogaW5zZXJ0IG5ldyByZWNvcmQgYXQgYmVnaW5uaW5nIG9mIG9wZW4gZGV2aWNlIGxpc3QgKi8KLSAgICBjdXJyLT5uZXh0ID0gQVNQSV9vcGVuX2RldmljZXM7Ci0gICAgQVNQSV9vcGVuX2RldmljZXMgPSBjdXJyOwotICAgIHJldHVybiBmZDsKLX0KLQotCi1zdGF0aWMgdm9pZAotQVNQSV9EZWJ1Z1ByaW50Q21kMTYoU1JCX0V4ZWNTQ1NJQ21kMTYgKnByYikKLXsKLSAgQllURQljbWQ7Ci0gIGludAlpOwotICBCWVRFICpjZGI7Ci0gIEJZVEUgKmxwQnVmOwotICBkYmdfZGVjbF9zdHIoYXNwaSwgNTEyKTsKLQotICBpZiAoKERPU0FTUEkpICYmIChwcmItPlNSQl9CdWZQb2ludGVyKSkgLyogdHJhbnNsYXRlIHJlYWwgbW9kZSBhZGRyZXNzICovCi0gICAgbHBCdWYgPSAoQllURSAqKURPU01FTV9NYXBSZWFsVG9MaW5lYXIoKFVJTlQzMilwcmItPlNSQl9CdWZQb2ludGVyKTsKLSAgZWxzZQotICAgIGxwQnVmID0gUFRSX1NFR19UT19MSU4ocHJiLT5TUkJfQnVmUG9pbnRlcik7Ci0KLSAgc3dpdGNoIChwcmItPkNEQkJ5dGVbMF0pIHsKLSAgY2FzZSBDTURfSU5RVUlSWToKLSAgICBUUkFDRShhc3BpLCAie1xuIik7Ci0gICAgVFJBQ0UoYXNwaSwgIlx0RVZQRDogJWRcbiIsIHByYi0+Q0RCQnl0ZVsxXSAmIDEpOwotICAgIFRSQUNFKGFzcGksICJcdExVTjogJWRcbiIsIChwcmItPkNEQkJ5dGVbMV0gJiAweGMpID4+IDEpOwotICAgIFRSQUNFKGFzcGksICJcdFBBR0UgQ09ERTogJWRcbiIsIHByYi0+Q0RCQnl0ZVsyXSk7Ci0gICAgVFJBQ0UoYXNwaSwgIlx0QUxMT0NBVElPTiBMRU5HVEg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOwotICAgIFRSQUNFKGFzcGksICJcdENPTlRST0w6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNV0pOwotICAgIFRSQUNFKGFzcGksICJ9XG4iKTsKLSAgICBicmVhazsKLSAgY2FzZSBDTURfU0NBTl9TQ0FOOgotICAgIFRSQUNFKGFzcGksICJUcmFuc2ZlciBMZW5ndGg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgVFJBQ0UoYXNwaSwgIkhvc3QgQWRhcHRlcjogJWRcbiIsIHByYi0+U1JCX0hhSWQpOwotICBUUkFDRShhc3BpLCAiRmxhZ3M6ICVkXG4iLCBwcmItPlNSQl9GbGFncyk7Ci0gIGlmIChUQVJHRVRfVE9fSE9TVChwcmIpKSB7Ci0gICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2ZlcjogVGFyZ2V0IHRvIGhvc3QuIExlbmd0aCBjaGVja2VkLlxuIik7Ci0gIH0KLSAgZWxzZSBpZiAoSE9TVF9UT19UQVJHRVQocHJiKSkgewotICAgIFRSQUNFKGFzcGksICJcdERhdGEgdHJhbnNmZXI6IEhvc3QgdG8gdGFyZ2V0LiBMZW5ndGggY2hlY2tlZC5cbiIpOwotICB9Ci0gIGVsc2UgaWYgKE5PX0RBVEFfVFJBTlNGRVJFRChwcmIpKSB7Ci0gICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2Zlcjogbm9uZVxuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgV0FSTihhc3BpLCAiXHRUcmFuc2ZlciBieSBzY3NpIGNtZC4gTGVuZ3RoIG5vdCBjaGVja2VkXG4iKTsKLSAgfQotCi0gIFRSQUNFKGFzcGksICJcdFJlc2lkdWFsIGJ5dGUgbGVuZ3RoIHJlcG9ydGluZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLSAgVFJBQ0UoYXNwaSwgIlx0TGlua2luZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDIgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLSAgVFJBQ0UoYXNwaSwgIlx0UG9zdGluZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDEgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLSAgVFJBQ0UoYXNwaSwgIlRhcmdldDogJWRcbiIsIHByYi0+U1JCX1RhcmdldCk7Ci0gIFRSQUNFKGFzcGksICJMdW46ICVkXG4iLCBwcmItPlNSQl9MdW4pOwotICBUUkFDRShhc3BpLCAiQnVmTGVuOiAlbGRcbiIsIHByYi0+U1JCX0J1Zkxlbik7Ci0gIFRSQUNFKGFzcGksICJTZW5zZUxlbjogJWRcbiIsIHByYi0+U1JCX1NlbnNlTGVuKTsKLSAgVFJBQ0UoYXNwaSwgIkJ1ZlB0cjogJWx4ICglcClcbiIsIHByYi0+U1JCX0J1ZlBvaW50ZXIsIGxwQnVmKTsKLSAgVFJBQ0UoYXNwaSwgIkxpbmtQb2ludGVyICVseFxuIiwgcHJiLT5TUkJfUnN2ZDEpOwotICBUUkFDRShhc3BpLCAiQ0RCIExlbmd0aDogJWRcbiIsIHByYi0+U1JCX0NEQkxlbik7Ci0gIFRSQUNFKGFzcGksICJQT1NUIFByb2M6ICVseFxuIiwgKERXT1JEKSBwcmItPlNSQl9Qb3N0UHJvYyk7Ci0gIGNkYiA9ICZwcmItPkNEQkJ5dGVbMF07Ci0gIGNtZCA9IHByYi0+Q0RCQnl0ZVswXTsKLSAgZm9yIChpID0gMDsgaSA8IHByYi0+U1JCX0NEQkxlbjsgaSsrKSB7Ci0gICAgaWYgKGkgIT0gMCkgZHNwcmludGYoYXNwaSwgIiwiKTsKLSAgICBkc3ByaW50Zihhc3BpLCAiJTAyeCIsICpjZGIrKyk7Ci0gIH0KLSAgVFJBQ0UoYXNwaSwgIkNEQiBidWZmZXJbJXNdXG4iLCBkYmdfc3RyKGFzcGkpKTsKLX0KLQotc3RhdGljIHZvaWQKLVByaW50U2Vuc2VBcmVhMTYoU1JCX0V4ZWNTQ1NJQ21kMTYgKnByYikKLXsKLSAgaW50CWk7Ci0gIEJZVEUgKmNkYjsKLSAgZGJnX2RlY2xfc3RyKGFzcGksIDUxMik7Ci0KLSAgY2RiID0gJnByYi0+Q0RCQnl0ZVswXTsKLSAgZm9yIChpID0gMDsgaSA8IHByYi0+U1JCX1NlbnNlTGVuOyBpKyspIHsKLSAgICBpZiAoaSkgZHNwcmludGYoYXNwaSwgIiwiKTsKLSAgICBkc3ByaW50Zihhc3BpLCAiJTAyeCIsICpjZGIrKyk7Ci0gIH0KLSAgVFJBQ0UoYXNwaSwgIlNlbnNlQXJlYVslc11cbiIsIGRiZ19zdHIoYXNwaSkpOwotfQotCi1zdGF0aWMgdm9pZAotQVNQSV9EZWJ1Z1ByaW50UmVzdWx0MTYoU1JCX0V4ZWNTQ1NJQ21kMTYgKnByYikKLXsKLSAgQllURSAqbHBCdWY7Ci0KLSAgaWYgKChET1NBU1BJKSAmJiAocHJiLT5TUkJfQnVmUG9pbnRlcikpIC8qIHRyYW5zbGF0ZSByZWFsIG1vZGUgYWRkcmVzcyAqLwotICAgIGxwQnVmID0gKEJZVEUgKilET1NNRU1fTWFwUmVhbFRvTGluZWFyKChVSU5UMzIpcHJiLT5TUkJfQnVmUG9pbnRlcik7Ci0gIGVsc2UKLSAgICBscEJ1ZiA9IFBUUl9TRUdfVE9fTElOKHByYi0+U1JCX0J1ZlBvaW50ZXIpOwotCi0gIHN3aXRjaCAocHJiLT5DREJCeXRlWzBdKSB7Ci0gIGNhc2UgQ01EX0lOUVVJUlk6Ci0gICAgVFJBQ0UoYXNwaSwgIlZlbmRvcjogJXNcbiIsIGxwQnVmICsgSU5RVUlSWV9WRU5ET1IpOwotICAgIGJyZWFrOwotICBjYXNlIENNRF9URVNUX1VOSVRfUkVBRFk6Ci0gICAgUHJpbnRTZW5zZUFyZWExNihwcmIpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLXN0YXRpYyBXT1JECi1BU1BJX0V4ZWNTY3NpQ21kMTYoU1JCX0V4ZWNTQ1NJQ21kMTYgKnByYiwgU0VHUFRSIHNlZ3B0cl9wcmIpCi17Ci0gIHN0cnVjdCBzZ19oZWFkZXIgKnNnX2hkLCAqc2dfcmVwbHlfaGRyOwotICBpbnQJc3RhdHVzOwotICBCWVRFICpscEJ1ZjsKLSAgaW50CWluX2xlbiwgb3V0X2xlbjsKLSAgaW50CWVycm9yX2NvZGUgPSAwOwotICBpbnQJZmQ7Ci0KLSAgQVNQSV9EZWJ1Z1ByaW50Q21kMTYocHJiKTsKLQotICBmZCA9IEFTUElfT3BlbkRldmljZTE2KHByYik7Ci0gIGlmIChmZCA9PSAtMSkgewotICAgICAgV0FSTihhc3BpLCAiQVNQSV9FeGVjU2NzaUNtZDE2IGZhaWxlZDogY291bGQgbm90IG9wZW4gZGV2aWNlLlxuIik7Ci0gICAgICBwcmItPlNSQl9TdGF0dXMgPSBTU19FUlI7Ci0gICAgICByZXR1cm4gU1NfRVJSOwotICB9Ci0KLSAgc2dfaGQgPSBOVUxMOwotICBzZ19yZXBseV9oZHIgPSBOVUxMOwotCi0gIHByYi0+U1JCX1N0YXR1cyA9IFNTX1BFTkRJTkc7Ci0gIGlmICgoRE9TQVNQSSkgJiYgKHByYi0+U1JCX0J1ZlBvaW50ZXIpKSAvKiB0cmFuc2xhdGUgcmVhbCBtb2RlIGFkZHJlc3MgKi8KLSAgICBscEJ1ZiA9IChCWVRFICopRE9TTUVNX01hcFJlYWxUb0xpbmVhcigoVUlOVDMyKXByYi0+U1JCX0J1ZlBvaW50ZXIpOwotICBlbHNlCi0gICAgbHBCdWYgPSBQVFJfU0VHX1RPX0xJTihwcmItPlNSQl9CdWZQb2ludGVyKTsKLQotICBpZiAoIXByYi0+U1JCX0NEQkxlbikgewotICAgICAgV0FSTihhc3BpLCAiQVNQSV9FeGVjU2NzaUNtZDE2IGZhaWxlZDogcHJiLT5TUkJfQ0RCTGVuID0gMC5cbiIpOwotICAgICAgcHJiLT5TUkJfU3RhdHVzID0gU1NfRVJSOwotICAgICAgcmV0dXJuIFNTX0VSUjsKLSAgfQotCi0gIC8qIGJ1aWxkIHVwIHNnX2hlYWRlciArIHNjc2kgY21kICovCi0gIGlmIChIT1NUX1RPX1RBUkdFVChwcmIpKSB7Ci0gICAgLyogc2VuZCBoZWFkZXIsIGNvbW1hbmQsIGFuZCB0aGVuIGRhdGEgKi8KLSAgICBpbl9sZW4gPSBTQ1NJX09GRiArIHByYi0+U1JCX0NEQkxlbiArIHByYi0+U1JCX0J1ZkxlbjsKLSAgICBzZ19oZCA9IChzdHJ1Y3Qgc2dfaGVhZGVyICopIG1hbGxvYyhpbl9sZW4pOwotICAgIG1lbXNldChzZ19oZCwgMCwgU0NTSV9PRkYpOwotICAgIG1lbWNweShzZ19oZCArIDEsICZwcmItPkNEQkJ5dGVbMF0sIHByYi0+U1JCX0NEQkxlbik7Ci0gICAgaWYgKHByYi0+U1JCX0J1ZkxlbikgewotICAgICAgbWVtY3B5KCgoQllURSAqKSBzZ19oZCkgKyBTQ1NJX09GRiArIHByYi0+U1JCX0NEQkxlbiwgbHBCdWYsIHByYi0+U1JCX0J1Zkxlbik7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIC8qIHNlbmQgaGVhZGVyIGFuZCBjb21tYW5kIC0gbm8gZGF0YSAqLwotICAgIGluX2xlbiA9IFNDU0lfT0ZGICsgcHJiLT5TUkJfQ0RCTGVuOwotICAgIHNnX2hkID0gKHN0cnVjdCBzZ19oZWFkZXIgKikgbWFsbG9jKGluX2xlbik7Ci0gICAgbWVtc2V0KHNnX2hkLCAwLCBTQ1NJX09GRik7Ci0gICAgbWVtY3B5KHNnX2hkICsgMSwgJnByYi0+Q0RCQnl0ZVswXSwgcHJiLT5TUkJfQ0RCTGVuKTsKLSAgfQotCi0gIGlmIChUQVJHRVRfVE9fSE9TVChwcmIpKSB7Ci0gICAgb3V0X2xlbiA9IFNDU0lfT0ZGICsgcHJiLT5TUkJfQnVmTGVuOwotICAgIHNnX3JlcGx5X2hkciA9IChzdHJ1Y3Qgc2dfaGVhZGVyICopIG1hbGxvYyhvdXRfbGVuKTsKLSAgICBtZW1zZXQoc2dfcmVwbHlfaGRyLCAwLCBTQ1NJX09GRik7Ci0gICAgc2dfaGQtPnJlcGx5X2xlbiA9IG91dF9sZW47Ci0gIH0KLSAgZWxzZSB7Ci0gICAgb3V0X2xlbiA9IFNDU0lfT0ZGOwotICAgIHNnX3JlcGx5X2hkciA9IChzdHJ1Y3Qgc2dfaGVhZGVyICopIG1hbGxvYyhvdXRfbGVuKTsKLSAgICBtZW1zZXQoc2dfcmVwbHlfaGRyLCAwLCBTQ1NJX09GRik7Ci0gICAgc2dfaGQtPnJlcGx5X2xlbiA9IG91dF9sZW47Ci0gIH0KLQotICBzdGF0dXMgPSB3cml0ZShmZCwgc2dfaGQsIGluX2xlbik7Ci0gIGlmIChzdGF0dXMgPCAwIHx8IHN0YXR1cyAhPSBpbl9sZW4pIHsKLSAgICAgIGludCBteWVycm9yID0gZXJybm87Ci0KLSAgICBXQVJOKGFzcGksICJOb3QgZW5vdWdoIGJ5dGVzIHdyaXR0ZW4gdG8gc2NzaSBkZXZpY2UgYnl0ZXM9JWQgLi4gJWRcbiIsIGluX2xlbiwgc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzIDwgMCkgewotCWlmIChteWVycm9yID09IEVOT01FTSkgewotCSAgICBNU0coIkFTUEk6IExpbnV4IGdlbmVyaWMgc2NzaSBkcml2ZXJcbiAgWW91IHByb2JhYmx5IG5lZWQgdG8gcmUtY29tcGlsZSB5b3VyIGtlcm5lbCB3aXRoIGEgbGFyZ2VyIFNHX0JJR19CVUZGIHZhbHVlIChzZy5oKVxuICBTdWdnZXN0IDEzMDU2MFxuIik7Ci0JfQotCVdBUk4oYXNwaSwgImVycm5vOiA9ICVkXG4iLCBteWVycm9yKTsKLSAgICB9Ci0gICAgZ290byBlcnJvcl9leGl0OwotICB9Ci0KLSAgc3RhdHVzID0gcmVhZChmZCwgc2dfcmVwbHlfaGRyLCBvdXRfbGVuKTsKLSAgaWYgKHN0YXR1cyA8IDAgfHwgc3RhdHVzICE9IG91dF9sZW4pIHsKLSAgICBXQVJOKGFzcGksICJub3QgZW5vdWdoIGJ5dGVzIHJlYWQgZnJvbSBzY3NpIGRldmljZSVkXG4iLCBzdGF0dXMpOwotICAgIGdvdG8gZXJyb3JfZXhpdDsKLSAgfQotCi0gIGlmIChzZ19yZXBseV9oZHItPnJlc3VsdCAhPSAwKSB7Ci0gICAgZXJyb3JfY29kZSA9IHNnX3JlcGx5X2hkci0+cmVzdWx0OwotICAgIFdBUk4oYXNwaSwgInJlcGx5IGhlYWRlciBlcnJvciAoJWQpXG4iLCBzZ19yZXBseV9oZHItPnJlc3VsdCk7Ci0gICAgZ290byBlcnJvcl9leGl0OwotICB9Ci0KLSAgaWYgKFRBUkdFVF9UT19IT1NUKHByYikgJiYgcHJiLT5TUkJfQnVmTGVuKSB7Ci0gICAgbWVtY3B5KGxwQnVmLCBzZ19yZXBseV9oZHIgKyAxLCBwcmItPlNSQl9CdWZMZW4pOwotICB9Ci0KLSAgLyogY29weSBpbiBzZW5zZSBidWZmZXIgdG8gYW1vdW50IHRoYXQgaXMgYXZhaWxhYmxlIGluIGNsaWVudCAqLwotICBpZiAocHJiLT5TUkJfU2Vuc2VMZW4pIHsKLSAgICBpbnQgc2Vuc2VfbGVuID0gcHJiLT5TUkJfU2Vuc2VMZW47Ci0gICAgaWYgKHByYi0+U1JCX1NlbnNlTGVuID4gMTYpCi0gICAgICBzZW5zZV9sZW4gPSAxNjsKLSAgICBtZW1jcHkoU0VOU0VfQlVGRkVSKHByYiksICZzZ19yZXBseV9oZHItPnNlbnNlX2J1ZmZlclswXSwgc2Vuc2VfbGVuKTsKLSAgfQotCi0KLSAgcHJiLT5TUkJfU3RhdHVzID0gU1NfQ09NUDsKLSAgcHJiLT5TUkJfSGFTdGF0ID0gSEFTVEFUX09LOwotICBwcmItPlNSQl9UYXJnU3RhdCA9IFNUQVRVU19HT09EOwotCi0gIC8qIG5vdyBkbyAgcG9zdGluZyAqLwotCi0gIGlmIChBU1BJX1BPU1RJTkcocHJiKSAmJiBwcmItPlNSQl9Qb3N0UHJvYykgewotICAgIFRSQUNFKGFzcGksICJQb3N0IFJvdXRpbmUgKCVseCkgY2FsbGVkXG4iLCAoRFdPUkQpIHByYi0+U1JCX1Bvc3RQcm9jKTsKLSAgICBDYWxsYmFja3MtPkNhbGxBU1BJUG9zdFByb2MocHJiLT5TUkJfUG9zdFByb2MsIHNlZ3B0cl9wcmIpOwotICB9Ci0KLSAgZnJlZShzZ19yZXBseV9oZHIpOwotICBmcmVlKHNnX2hkKTsKLSAgQVNQSV9EZWJ1Z1ByaW50UmVzdWx0MTYocHJiKTsKLSAgcmV0dXJuIFNTX0NPTVA7Ci0gIAotZXJyb3JfZXhpdDoKLSAgaWYgKGVycm9yX2NvZGUgPT0gRUJVU1kpIHsKLSAgICAgIHByYi0+U1JCX1N0YXR1cyA9IFNTX0FTUElfSVNfQlVTWTsKLSAgICAgIFRSQUNFKGFzcGksICJEZXZpY2UgYnVzeVxuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgICBXQVJOKGFzcGksICJBU1BJX0dlbmVyaWNIYW5kbGVTY3NpQ21kIGZhaWxlZFxuIik7Ci0gICAgICBwcmItPlNSQl9TdGF0dXMgPSBTU19FUlI7Ci0gIH0KLQotICAvKiBJJ20gbm90IHN1cmUgZXhhY3RseSBlcnJvciBjb2RlcyB3b3JrIGhlcmUKLSAgICogV2UgcHJvYmFibHkgc2hvdWxkIHNldCBwcmItPlNSQl9UYXJnU3RhdCwgU1JCX0hhU3RhdCA/Ci0gICAqLwotICBXQVJOKGFzcGksICJBU1BJX0dlbmVyaWNIYW5kbGVTY3NpQ21kOiBlcnJvcl9leGl0XG4iKTsKLSAgZnJlZShzZ19yZXBseV9oZHIpOwotICBmcmVlKHNnX2hkKTsKLSAgcmV0dXJuIHByYi0+U1JCX1N0YXR1czsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgIEdldEFTUElTdXBwb3J0SW5mbzE2ICAgKFdJTkFTUEkuMSkKLSAqLwotCi1XT1JEIFdJTkFQSSBHZXRBU1BJU3VwcG9ydEluZm8xNigpCi17Ci0jaWZkZWYgbGludXgKLSAgICBUUkFDRShhc3BpLCAiR0VUQVNQSVN1cHBvcnRJbmZvXG4iKTsKLSAgICAvKiBoaWdoIGJ5dGUgU1NfQ09NUCAtIGxvdyBieXRlIG51bWJlciBvZiBob3N0IGFkYXB0ZXJzLgotICAgICAqIEZJWE1FISEhIFRoZSBudW1iZXIgb2YgaG9zdCBhZGFwdGVycyBpcyBpbmNvcnJlY3QuCi0gICAgICogSSdtIG5vdCBzdXJlIGhvdyB0byBkZXRlcm1pbmUgdGhpcyB1bmRlciBsaW51eCBldGMuCi0gICAgICovCi0gICAgcmV0dXJuICgoU1NfQ09NUCA8PCA4KSB8IDB4MSk7Ci0jZWxzZQotICAgIHJldHVybiAoKFNTX0NPTVAgPDwgOCkgfCAweDApOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgU2VuZEFTUElDb21tYW5kMTYgICAoV0lOQVNQSS4yKQotICovCi0KLVdPUkQgV0lOQVBJIFNlbmRBU1BJQ29tbWFuZDE2KFNFR1BUUiBzZWdwdHJfc3JiKQotewotI2lmZGVmIGxpbnV4Ci0gIExQU1JCMTYgbHBTUkIgPSBQVFJfU0VHX1RPX0xJTihzZWdwdHJfc3JiKTsKLQotICBzd2l0Y2ggKGxwU1JCLT5jb21tb24uU1JCX2NtZCkgewotICBjYXNlIFNDX0hBX0lOUVVJUlk6Ci0gICAgbHBTUkItPmlucXVpcnkuU1JCX1N0YXR1cyA9IDB4MTsgICAgICAgICAgIC8qIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBscFNSQi0+aW5xdWlyeS5TUkJfSGFJZCA9IDE7ICAgICAgICAgICAgICAgLyogYm9ndXMgdmFsdWUgKi8KLSAgICBscFNSQi0+aW5xdWlyeS5IQV9Db3VudCA9IDE7ICAgICAgICAgICAgICAgLyogbm90IGFsd2F5cyAqLwotICAgIGxwU1JCLT5pbnF1aXJ5LkhBX1NDU0lfSUQgPSA3OyAgICAgICAgICAgICAvKiBub3QgYWx3YXlzIElEIDcgKi8KLSAgICBzdHJjYXQobHBTUkItPmlucXVpcnkuSEFfTWFuYWdlcklkLCAiV2luZSBBU1BJIik7IC8qIG1heCAxNSBjaGFycyAqLwotICAgIGxwU1JCLT5pbnF1aXJ5LlNSQl81NUFBU2lnbmF0dXJlID0gMHg1NWFhOyAvKiBjb3JyZWN0ID8/PyAqLwotICAgIGxwU1JCLT5pbnF1aXJ5LlNSQl9FeHRCdWZmZXJTaXplID0gMHgyMDAwOyAvKiBib2d1cyB2YWx1ZSAqLwotICAgIEZJWE1FKGFzcGksICJBU1BJOiBQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgU0NfSEFfSU5RVUlSWVxuIik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0NfR0VUX0RFVl9UWVBFOgotICAgIEZJWE1FKGFzcGksICJOb3QgaW1wbGVtZW50ZWQgU0NfR0VUX0RFVl9UWVBFXG4iKTsKLSAgICBicmVhazsKLSAgY2FzZSBTQ19FWEVDX1NDU0lfQ01EOgotICAgIHJldHVybiBBU1BJX0V4ZWNTY3NpQ21kMTYoJmxwU1JCLT5jbWQsIHNlZ3B0cl9zcmIpOwotICAgIGJyZWFrOwotICBjYXNlIFNDX1JFU0VUX0RFVjoKLSAgICBGSVhNRShhc3BpLCAiTm90IGltcGxlbWVudGVkIFNDX1JFU0VUX0RFVlxuIik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgV0FSTihhc3BpLCAiVW5rbm93biBjb21tYW5kICVkXG4iLCBscFNSQi0+Y29tbW9uLlNSQl9jbWQpOwotICB9Ci0gIHJldHVybiBTU19JTlZBTElEX1NSQjsKLSNlbHNlCi0gIHJldHVybiBTU19JTlZBTElEX1NSQjsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgIEdldEFTUElETExWZXJzaW9uICAgKFdJTkFTUEkuNCkKLSAqLwotCi1EV09SRCBXSU5BUEkgR2V0QVNQSURMTFZlcnNpb24oKQotewotI2lmZGVmIGxpbnV4Ci0JcmV0dXJuIChEV09SRCkyOwotI2Vsc2UKLQlyZXR1cm4gKERXT1JEKTA7Ci0jZW5kaWYKLX0KLQotCi12b2lkIFdJTkFQSSBBU1BJX0RPU19mdW5jKERXT1JEIHNyYikKLXsKLSAgICAgICBMUFNSQjE2IGxwU1JCID0gKExQU1JCMTYpRE9TTUVNX01hcFJlYWxUb0xpbmVhcihzcmIpOwotICAgICAgIFNFR1BUUiBzcFNSQiA9IE1hcExTKGxwU1JCKTsKLQotICAgICAgIFRSQUNFKGFzcGksICJET1NBU1BJOiBmdW5jdGlvbiAjJWRcbiIsIGxwU1JCLT5jb21tb24uU1JCX2NtZCk7Ci0gICAgICAgRE9TQVNQSSA9IFRSVUU7Ci0gICAgICAgU2VuZEFTUElDb21tYW5kMTYoc3BTUkIpOwotICAgICAgIERPU0FTUEkgPSBGQUxTRTsKLSAgICAgICBVbk1hcExTKHNwU1JCKTsKLX0KLQotCi0vKiByZXR1cm5zIGEgcmVhbCBtb2RlIGNhbGwgYWRkcmVzcyB0byBBU1BJX0RPU19mdW5jKCkgKi8KLXZvaWQgQVNQSV9ET1NfSGFuZGxlSW50KENPTlRFWFQgKmNvbnRleHQpCi17Ci0jaWZkZWYgbGludXgKLSAgICAgICBGQVJQUk9DMTYgRE9TX2Z1bmM7Ci0gICAgICAgRFdPUkQgZG9zOwotICAgICAgIExQQllURSBkb3NwdHI7Ci0KLSAgICAgICBET1NfZnVuYyA9IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiQVNQSV9ET1NfZnVuYyIpOwotICAgICAgIGRvcyA9IEdsb2JhbERPU0FsbG9jKDUpOwotICAgICAgIGRvc3B0ciA9IChCWVRFICopUFRSX1NFR19PRkZfVE9fTElOKExPV09SRChkb3MpLCAwKTsKLSAgICAgICAqZG9zcHRyKysgPSAweGVhOyAvKiBsam1wICovCi0gICAgICAgKihGQVJQUk9DMTYgKilkb3NwdHIgPSBET1NfZnVuYzsKLQotICAgICAgICooRFdPUkQgKilQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpCi0gICAgICAgICAgICAgICA9IE1BS0VMT05HKDAsIEhJV09SRChkb3MpKTsgLyogcmVhbCBtb2RlIGFkZHJlc3MgKi8KLSAgICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsKLSAgICAgICBBWF9yZWcoY29udGV4dCkgPSBDWF9yZWcoY29udGV4dCk7Ci0jZWxzZQotICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIEdldEFTUEkzMlN1cHBvcnRJbmZvCQlbV05BU1BJMzIuMF0KLSAqCi0gKiBDaGVja3MgaWYgdGhlIEFTUEkgc3Vic3lzdGVtIGlzIGluaXRpYWxpemVkIGNvcnJlY3RseS4KLSAqCi0gKiBSRVRVUk5TCi0gKiAgICBISVdPUkQ6IDAuCi0gKiAgICBISUJZVEUgb2YgTE9XT1JEOiBzdGF0dXMgKFNTX0NPTVAgb3IgU1NfRkFJTEVEX0lOSVQpCi0gKiAgICBMT0JZVEUgb2YgTE9XT1JEOiAjIG9mIGhvc3QgYWRhcHRlcnMuICAKLSAqLwotRFdPUkQgV0lOQVBJIEdldEFTUEkzMlN1cHBvcnRJbmZvKCkKLXsKLSAgICByZXR1cm4gKFNTX0NPTVAgPDwgOCkgfCAxOyAvKiBGSVhNRTogZ2V0ICMgb2YgaG9zdCBhZGFwdGVycyBpbnN0YWxsZWQgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCAwMDdmNDczLi5jZDMxYTQ2IDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtMTQ0OCw3ICsxNDQ4LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBQcmludERsZzMyQSggTFBQUklOVERMRzMyQSBwcmludGRsZyApCiB7Ci0gICAgRklYTUUoY29tbWRsZywgImVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRShjb21tZGxnLCAiKCVwKTogc3R1YlxuIixwcmludGRsZyk7CiAgICAgLyogQWx0b3VnaCByZXR1cm5pbmcgRkFMU0UgaXMgdGhlb3JpY2FseSB0aGUgcmlnaHQgdGhpbmcKICAgICAgKiBtb3N0IHByb2dyYW1zIGNoZWNrIGZvciBhIHByaW50ZXIgYXQgc3RhcnR1cCwgYW5kIGlmCiAgICAgICogbm9uZSBpcyBmb3VuZCBwb3B1cCBQcmludERsZzMyQSgpLCBpZiBpdCBmYWlscyB0aGUgcHJvZ3JhbQpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggODVlOTlkZS4uNjJlZGE3ZCAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0xNjEsNyArMTYxLDcgQEAKICAqLwogSU5UMzIgX19jZGVjbCBDUlRETExfX2ZpbmRuZXh0KERXT1JEIGhhbmQsc3RydWN0IGZpbmRfdCogeDIpCiB7Ci0gIEZJWE1FKGNydGRsbCwgIjooJWQsJXApOiBzdHViXG4iLGhhbmQseDIpOworICBGSVhNRShjcnRkbGwsICI6KCVsZCwlcCk6IHN0dWJcbiIsaGFuZCx4Mik7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBGQUxTRTsKIH0KQEAgLTE5MjksMyArMTkyOSw5IEBACiAJfQogCXJldHVybiAwOwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBfX2RsbG9uZXhpdCAgICAgICAgICAgKENSVERMTC4yNSkKKyAqLworVk9JRCBfX2NkZWNsIENSVERMTF9fZGxsb25leGl0ICgpCit7CUZJWE1FKGNydGRsbCwic3R1YlxuIik7CisgfQpkaWZmIC0tZ2l0IGEvbWlzYy9kZGVtbC5jIGIvbWlzYy9kZGVtbC5jCmluZGV4IDA2OWIxZmMuLjk5MTZhZTEgMTAwNjQ0Ci0tLSBhL21pc2MvZGRlbWwuYworKysgYi9taXNjL2RkZW1sLmMKQEAgLTU1LDExICs1NSwxNCBAQAogVUlOVDMyIFdJTkFQSSBEZGVJbml0aWFsaXplMzJXKCBMUERXT1JEIHBpZEluc3QsIFBGTkNBTExCQUNLMzIgcGZuQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGFmQ21kLCBEV09SRCB1bFJlcyApCiB7Ci0gICAgRklYTUUoZGRlbWwsICIoJXAsJXAsJWxkLCVsZCk6IHN0dWJcbiIscGlkSW5zdCxwZm5DYWxsYmFjayxhZkNtZCx1bFJlcyk7CisgICAgRklYTUUoZGRlbWwsICIoJXAsJXAsMHglbHgsJWxkKTogc3R1YlxuIixwaWRJbnN0LHBmbkNhbGxiYWNrLGFmQ21kLHVsUmVzKTsKIAogICAgIGlmKHBpZEluc3QpCiAgICAgICAqcGlkSW5zdCA9IDA7CiAKKyAgICBpZiggdWxSZXMgKQorICAgICAgICBFUlIoZGRlLCAiUmVzZXJ2ZWQgdmFsdWUgbm90IHplcm8/ICBXaGF0IGRvZXMgdGhpcyBtZWFuP1xuIik7CisKICAgICByZXR1cm4gRE1MRVJSX05PX0VSUk9SOwogfQogCkBAIC0xODQsNyArMTg3LDggQEAKIEhDT05WIFdJTkFQSSBEZGVDb25uZWN0MzIoIERXT1JEIGlkSW5zdCwgSFNaIGhzelNlcnZpY2UsIEhTWiBoc3pUb3BpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09OVkNPTlRFWFQzMiBwQ0MgKQogewotICAgIEZJWE1FKCBkZGVtbCwgIiguLi4pOiBzdHViXG4iKTsKKyAgICBGSVhNRShkZGVtbCwgIigweCVseCwlbGQsJWxkLCVwKTogc3R1YlxuIixpZEluc3QsaHN6U2VydmljZSxoc3pUb3BpYywKKyAgICAgICAgICBwQ0MpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yMDIsMTYgKzIwNiwxOSBAQAogICovCiBCT09MMTYgV0lOQVBJIERkZVNldFVzZXJIYW5kbGUoIEhDT05WIGhDb252LCBEV09SRCBpZCwgRFdPUkQgaFVzZXIgKQogewotICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRSggZGRlbWwsICIoJWxkLCVsZCwlbGQpOiBzdHViXG4iLGhDb252LGlkLCBoVXNlciApOwogICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgRGRlQ3JlYXRlRGF0YUhhbmRsZSAoRERFTUwuMTQpCiAgKi8KLUhEREVEQVRBIFdJTkFQSSBEZGVDcmVhdGVEYXRhSGFuZGxlKCBEV09SRCBpZEluc3QsIExQQllURSBwU3JjLCBEV09SRCBjYiwgRFdPUkQgY2JPZmYsIEhTWiBoc3pJdGVtLCBVSU5UMTYgd0ZtdCwgVUlOVDE2IGFmQ21kICkKK0hEREVEQVRBIFdJTkFQSSBEZGVDcmVhdGVEYXRhSGFuZGxlKCBEV09SRCBpZEluc3QsIExQQllURSBwU3JjLCBEV09SRCBjYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2JPZmYsIEhTWiBoc3pJdGVtLCBVSU5UMTYgd0ZtdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGFmQ21kICkKIHsKLSAgICBGSVhNRSggZGRlbWwsICJlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiKCVsZCwlcCwlbGQsJWxkLCVsZCwlZCwlZCk6IHN0dWJcbiIsaWRJbnN0LHBTcmMsY2IsY2JPZmYsCisgICAgICAgICAgIGhzekl0ZW0sIHdGbXQsIGFmQ21kICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2MvZXJyb3IuYyBiL21pc2MvZXJyb3IuYwppbmRleCA0ZjMyZDBiLi4yNDhmZDJmIDEwMDY0NAotLS0gYS9taXNjL2Vycm9yLmMKKysrIGIvbWlzYy9lcnJvci5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjZGVmaW5lIEVycm9yU3RyaW5nKG1hbmlmZXN0KSB7IG1hbmlmZXN0LCAjIG1hbmlmZXN0IH0KQEAgLTE1MywzICsxNTQsMzQgQEAKIAkgKi8KIAlNU0coIiglcywgJXAsICVwKVxuIiwgR2V0UGFyYW1FcnJvclN0cmluZyh1RXJyKSwgbHBmbiwgbHB2UGFyYW0pOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJTG9nUGFyYW1FcnJvclJlZ3MgKEtFUk5FTC4zMjcpCisqLwordm9pZCBXSU5BUEkgTG9nUGFyYW1FcnJvclJlZ3MoIENPTlRFWFQgKmNvbnRleHQgKQoreworCVVJTlQxNiB1RXJyID0gQlhfcmVnKCBjb250ZXh0ICk7CisgICAgICAgIEZBUlBST0MxNiBscGZuID0gKEZBUlBST0MxNilQVFJfU0VHX09GRl9UT19TRUdQVFIoIENTX3JlZyhjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlQX3JlZyhjb250ZXh0KSApOworICAgICAgICBMUFZPSUQgbHB2UGFyYW0gPSAoTFBWT0lEKU1BS0VMT05HKCBBWF9yZWcoIGNvbnRleHQgKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyggY29udGV4dCApICk7CisJCisJTG9nUGFyYW1FcnJvciggdUVyciwgbHBmbiwgbHB2UGFyYW0gKTsKKworCWlmICghKHVFcnIgJiBFUlJfV0FSTklORykpCisJeworCQkvKiBBYm9ydCBjdXJyZW50IHByb2NlZHVyZTogVW53aW5kIHN0YWNrIGZyYW1lIGFuZCBqdW1wCisJCSAgIHRvIGVycm9yIGhhbmRsZXIgKGxvY2F0aW9uIGF0IFticC0yXSkgKi8KKworCQlXT1JEICpzdGFjayA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggU1NfcmVnKCBjb250ZXh0ICksIAorCQkJCQkJICBCUF9yZWcoIGNvbnRleHQgKSk7CisJCVNQX3JlZyggY29udGV4dCApID0gQlBfcmVnKCBjb250ZXh0ICkgLSAyOworCQlCUF9yZWcoIGNvbnRleHQgKSA9IHN0YWNrWzBdICYgMHhmZmZlOworCisJCUlQX3JlZyggY29udGV4dCApID0gc3RhY2tbLTFdOworCisJCUVBWF9yZWcoIGNvbnRleHQgKSA9IEVDWF9yZWcoIGNvbnRleHQgKSA9IEVEWF9yZWcoIGNvbnRleHQgKSA9IDA7CisJCUVTX3JlZyggY29udGV4dCkgPSAwOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy9pbW0uYyBiL21pc2MvaW1tLmMKaW5kZXggNTc5NDc3ZC4uOWMyMGFlMyAxMDA2NDQKLS0tIGEvbWlzYy9pbW0uYworKysgYi9taXNjL2ltbS5jCkBAIC01LDUzMiArNSw3MTIgQEAKICAqLwogCiAjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIndpbnZlcnNpb24uaCIKICNpbmNsdWRlICJpbW0uaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tQXNzb2NpYXRlQ29udGV4dDMyIChJTU0zMi4xKQogICovCi0KIEhJTUMzMiBXSU5BUEkgSW1tQXNzb2NpYXRlQ29udGV4dDMyKEhXTkQzMiBoV25kLCBISU1DMzIgaElNQykKIHsKLQlyZXR1cm4gTlVMTDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgMHglMDh4KTogc3R1YlxuIixoV25kLGhJTUMpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gTlVMTDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tQ29uZmlndXJlSU1FMzJBIChJTU0zMi4yKQogICovCi0KLUJPT0wzMiBXSU5BUEkgSW1tQ29uZmlndXJlSU1FMzJBKEhLTDMyIGhLTCwgSFdORDMyIGhXbmQsIERXT1JEIGR3TW9kZSwgTFBWT0lEIGxwRGF0YSkKK0JPT0wzMiBXSU5BUEkgSW1tQ29uZmlndXJlSU1FMzJBKAorICBIS0wzMiBoS0wsIEhXTkQzMiBoV25kLCBEV09SRCBkd01vZGUsIExQVk9JRCBscERhdGEpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAweCUwOHgsICVsZCwgJXApOiBzdHViXG4iLAorICAgIGhLTCwgaFduZCwgZHdNb2RlLCBscERhdGEKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1Db25maWd1cmVJTUUzMlcgKElNTTMyLjMpCiAgKi8KLQotQk9PTDMyIFdJTkFQSSBJbW1Db25maWd1cmVJTUUzMlcoSEtMMzIgaEtMLCBIV05EMzIgaFduZCwgRFdPUkQgZHdNb2RlLCBMUFZPSUQgbHBEYXRhKQorQk9PTDMyIFdJTkFQSSBJbW1Db25maWd1cmVJTUUzMlcoCisgIEhLTDMyIGhLTCwgSFdORDMyIGhXbmQsIERXT1JEIGR3TW9kZSwgTFBWT0lEIGxwRGF0YSkKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgsIDB4JTA4eCwgJWxkLCAlcCk6IHN0dWJcbiIsCisgICAgaEtMLCBoV25kLCBkd01vZGUsIGxwRGF0YQorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUNyZWF0ZUNvbnRleHQzMiAoSU1NMzIuNCkKICAqLwotCiBISU1DMzIgV0lOQVBJIEltbUNyZWF0ZUNvbnRleHQzMigpCiB7Ci0JcmV0dXJuIE5VTEw7CisgIEZJWE1FKGltbSwgIigpOiBzdHViXG4iKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbURlc3Ryb3lDb250ZXh0MzIgKElNTTMyLjcpCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBJbW1EZXN0cm95Q29udGV4dDMyKEhJTUMzMiBoSU1DKQogewotCXJldHVybiBGQUxTRTsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCk6IHN0dWJcbiIsaElNQyk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1FbnVtUmVnaXN0ZXJXb3JkMzJBIChJTU0zMi4xMCkKICAqLwotCiBVSU5UMzIgV0lOQVBJIEltbUVudW1SZWdpc3RlcldvcmQzMkEoCi0gICAgSEtMMzIgaEtMLCBSRUdJU1RFUldPUkRFTlVNUFJPQ0EgbHBmbkVudW1Qcm9jLCAKLQlMUENTVFIgbHBzelJlYWRpbmcsIERXT1JEIGR3U3R5bGUsIAotCUxQQ1NUUiBscHN6UmVnaXN0ZXIsIExQVk9JRCBscERhdGEpCisgIEhLTDMyIGhLTCwgUkVHSVNURVJXT1JERU5VTVBST0NBIGxwZm5FbnVtUHJvYywKKyAgTFBDU1RSIGxwc3pSZWFkaW5nLCBEV09SRCBkd1N0eWxlLAorICBMUENTVFIgbHBzelJlZ2lzdGVyLCBMUFZPSUQgbHBEYXRhKQogewotCXJldHVybiAwOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcCwgJXMsICVsZCwgJXMsICVwKTogc3R1YlxuIiwKKyAgICBoS0wsIGxwZm5FbnVtUHJvYywgCisgICAgZGVidWdzdHJfYShscHN6UmVhZGluZyksIGR3U3R5bGUsCisgICAgZGVidWdzdHJfYShscHN6UmVnaXN0ZXIpLCBscERhdGEKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUVudW1SZWdpc3RlcldvcmQzMlcgKElNTTMyLjExKQogICovCi0KIFVJTlQzMiBXSU5BUEkgSW1tRW51bVJlZ2lzdGVyV29yZDMyVygKLSAgICBIS0wzMiBoS0wsIFJFR0lTVEVSV09SREVOVU1QUk9DVyBscGZuRW51bVByb2MsCi0JTFBDV1NUUiBscHN6UmVhZGluZywgRFdPUkQgZHdTdHlsZSwgCi0JTFBDV1NUUiBscHN6UmVnaXN0ZXIsIExQVk9JRCBscERhdGEpCisgIEhLTDMyIGhLTCwgUkVHSVNURVJXT1JERU5VTVBST0NXIGxwZm5FbnVtUHJvYywKKyAgTFBDV1NUUiBscHN6UmVhZGluZywgRFdPUkQgZHdTdHlsZSwKKyAgTFBDV1NUUiBscHN6UmVnaXN0ZXIsIExQVk9JRCBscERhdGEpCiB7Ci0JcmV0dXJuIDA7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVwLCAlcywgJWxkLCAlcywgJXApOiBzdHViXG4iLAorICAgIGhLTCwgbHBmbkVudW1Qcm9jLCAKKyAgICBkZWJ1Z3N0cl93KGxwc3pSZWFkaW5nKSwgZHdTdHlsZSwKKyAgICBkZWJ1Z3N0cl93KGxwc3pSZWdpc3RlciksIGxwRGF0YQorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tRXNjYXBlMzJBIChJTU0zMi4xMikKICAqLwotCi1MUkVTVUxUIFdJTkFQSSBJbW1Fc2NhcGUzMkEoSEtMMzIgaEtMLCBISU1DMzIgaElNQywgVUlOVDMyIHVFc2NhcGUsIExQVk9JRCBscERhdGEpCitMUkVTVUxUIFdJTkFQSSBJbW1Fc2NhcGUzMkEoCisgIEhLTDMyIGhLTCwgSElNQzMyIGhJTUMsIAorICBVSU5UMzIgdUVzY2FwZSwgTFBWT0lEIGxwRGF0YSkKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgMHglMDh4LCAlZCwgJXApOiBzdHViXG4iLAorICAgIGhLTCwgaElNQywgdUVzY2FwZSwgbHBEYXRhCisgICk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1Fc2NhcGUzMlcgKElNTTMyLjEzKQogICovCi0KLUxSRVNVTFQgV0lOQVBJIEltbUVzY2FwZTMyVyhIS0wzMiBoS0wsIEhJTUMzMiBoSU1DLCBVSU5UMzIgdUVzY2FwZSwgTFBWT0lEIGxwRGF0YSkKK0xSRVNVTFQgV0lOQVBJIEltbUVzY2FwZTMyVygKKyAgSEtMMzIgaEtMLCBISU1DMzIgaElNQywKKyAgVUlOVDMyIHVFc2NhcGUsIExQVk9JRCBscERhdGEpCiB7Ci0JcmV0dXJuIDA7CisgIEZJWE1FKGltbSwgIigweCUwOHgsIDB4JTA4eCwgJWQsICVwKTogc3R1YlxuIiwKKyAgICBoS0wsIGhJTUMsIHVFc2NhcGUsIGxwRGF0YQorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0Q2FuZGlkYXRlTGlzdDMyQSAoSU1NMzIuMTUpCiAgKi8KLQotRFdPUkQgV0lOQVBJIEltbUdldENhbmRpZGF0ZUxpc3QzMkEoSElNQzMyIGhJTUMsIERXT1JEIGRlSW5kZXgsIExQQ0FORElEQVRFTElTVCBscENhbmRMaXN0LCBEV09SRCBkd0J1ZkxlbikKK0RXT1JEIFdJTkFQSSBJbW1HZXRDYW5kaWRhdGVMaXN0MzJBKAorICBISU1DMzIgaElNQywgRFdPUkQgZGVJbmRleCwgCisgIExQQ0FORElEQVRFTElTVCBscENhbmRMaXN0LCBEV09SRCBkd0J1ZkxlbikKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJWxkLCAlcCwgJWxkKTogc3R1YlxuIiwKKyAgICBoSU1DLCBkZUluZGV4LAorICAgIGxwQ2FuZExpc3QsIGR3QnVmTGVuCisgICk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRDYW5kaWRhdGVMaXN0Q291bnQzMkEgKElNTTMyLjE2KQogICovCi0KLURXT1JEIFdJTkFQSSBJbW1HZXRDYW5kaWRhdGVMaXN0Q291bnQzMkEoSElNQzMyIGhJTUMsIExQRFdPUkQgbHBkd0xpc3RDb3VudCkKK0RXT1JEIFdJTkFQSSBJbW1HZXRDYW5kaWRhdGVMaXN0Q291bnQzMkEoCisgIEhJTUMzMiBoSU1DLCBMUERXT1JEIGxwZHdMaXN0Q291bnQpCiB7Ci0JcmV0dXJuIDA7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVwKTogc3R1YlxuIiwgaElNQywgbHBkd0xpc3RDb3VudCk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRDYW5kaWRhdGVMaXN0Q291bnQzMlcgKElNTTMyLjE3KQogICovCi0KLURXT1JEIFdJTkFQSSBJbW1HZXRDYW5kaWRhdGVMaXN0Q291bnQzMlcoSElNQzMyIGhJTUMsIExQRFdPUkQgbHBkd0xpc3RDb3VudCkKK0RXT1JEIFdJTkFQSSBJbW1HZXRDYW5kaWRhdGVMaXN0Q291bnQzMlcoCisgIEhJTUMzMiBoSU1DLCBMUERXT1JEIGxwZHdMaXN0Q291bnQpCiB7Ci0JcmV0dXJuIDA7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVwKTogc3R1YlxuIiwgaElNQywgbHBkd0xpc3RDb3VudCk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRDYW5kaWRhdGVMaXN0MzJXIChJTU0zMi4xOCkKICAqLwotCi1EV09SRCBXSU5BUEkgSW1tR2V0Q2FuZGlkYXRlTGlzdDMyVyhISU1DMzIgaElNQywgRFdPUkQgZGVJbmRleCwgTFBDQU5ESURBVEVMSVNUIGxwQ2FuZExpc3QsIERXT1JEIGR3QnVmTGVuKQorRFdPUkQgV0lOQVBJIEltbUdldENhbmRpZGF0ZUxpc3QzMlcoCisgIEhJTUMzMiBoSU1DLCBEV09SRCBkZUluZGV4LCAKKyAgTFBDQU5ESURBVEVMSVNUIGxwQ2FuZExpc3QsIERXT1JEIGR3QnVmTGVuKQogewotCXJldHVybiAwOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlbGQsICVwLCAlbGQpOiBzdHViXG4iLAorICAgIGhJTUMsIGRlSW5kZXgsCisgICAgbHBDYW5kTGlzdCwgZHdCdWZMZW4KKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldENhbmRpZGF0ZVdpbmRvdzMyIChJTU0zMi4xOSkKICAqLwotCi1CT09MMzIgV0lOQVBJIEltbUdldENhbmRpZGF0ZVdpbmRvdzMyKEhJTUMzMiBoSU1DLCBEV09SRCBkd0J1ZkxlbiwgTFBDQU5ESURBVEVGT1JNIGxwQ2FuZGlkYXRlKQorQk9PTDMyIFdJTkFQSSBJbW1HZXRDYW5kaWRhdGVXaW5kb3czMigKKyAgSElNQzMyIGhJTUMsIERXT1JEIGR3QnVmTGVuLCBMUENBTkRJREFURUZPUk0gbHBDYW5kaWRhdGUpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlbGQsICVwKTogc3R1YlxuIiwgaElNQywgZHdCdWZMZW4sIGxwQ2FuZGlkYXRlKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRDb21wb3NpdGlvbkZvbnQzMkEgKElNTTMyLjIwKQogICovCi0KIEJPT0wzMiBXSU5BUEkgSW1tR2V0Q29tcG9zaXRpb25Gb250MzJBKEhJTUMzMiBoSU1DLCBMUExPR0ZPTlQzMkEgbHBsZikKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVwKTogc3R1YlxuIiwgaElNQywgbHBsZik7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0Q29tcG9zaXRpb25Gb250MzJXIChJTU0zMi4yMSkKICAqLwotCiBCT09MMzIgV0lOQVBJIEltbUdldENvbXBvc2l0aW9uRm9udDMyVyhISU1DMzIgaElNQywgTFBMT0dGT05UMzJXIGxwbGYpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcCk6IHN0dWJcbiIsIGhJTUMsIGxwbGYpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldENvbXBvc2l0aW9uU3RyaW5nMzJBIChJTU0zMi4yMikKICAqLwotCi1MT05HIFdJTkFQSSBJbW1HZXRDb21wb3NpdGlvblN0cmluZzMyQShISU1DMzIgaElNQywgRFdPUkQgZHdJbmRleCwgTFBWT0lEIGxwQnVmLCBEV09SRCBkd0J1ZkxlbikKK0xPTkcgV0lOQVBJIEltbUdldENvbXBvc2l0aW9uU3RyaW5nMzJBKAorICBISU1DMzIgaElNQywgRFdPUkQgZHdJbmRleCwgTFBWT0lEIGxwQnVmLCBEV09SRCBkd0J1ZkxlbikKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJWxkLCAlcCwgJWxkKTogc3R1YlxuIiwKKyAgICBoSU1DLCBkd0luZGV4LCBscEJ1ZiwgZHdCdWZMZW4KKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgc3dpdGNoKFZFUlNJT05fR2V0VmVyc2lvbigpKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgRklYTUUoaW1tLCAiJXMgbm90IHN1cHBvcnRlZCIsVkVSU0lPTl9HZXRWZXJzaW9uTmFtZSgpKTsKKyAgICBjYXNlIFdJTjk1OgorICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CisgICAgY2FzZSBOVDQwOgorICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRDb21wb3NpdGlvblN0cmluZzMyVyAoSU1NMzIuMjMpCiAgKi8KLQotTE9ORyBXSU5BUEkgSW1tR2V0Q29tcG9zaXRpb25TdHJpbmczMlcoSElNQzMyIGhJTUMsIERXT1JEIGR3SW5kZXgsIExQVk9JRCBscEJ1ZiwgRFdPUkQgZHdCdWZMZW4pCitMT05HIFdJTkFQSSBJbW1HZXRDb21wb3NpdGlvblN0cmluZzMyVygKKyAgSElNQzMyIGhJTUMsIERXT1JEIGR3SW5kZXgsIAorICBMUFZPSUQgbHBCdWYsIERXT1JEIGR3QnVmTGVuKQogewotCXJldHVybiAwOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlbGQsICVwLCAlbGQpOiBzdHViXG4iLAorICAgIGhJTUMsIGR3SW5kZXgsIGxwQnVmLCBkd0J1ZkxlbgorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICBzd2l0Y2goVkVSU0lPTl9HZXRWZXJzaW9uKCkpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBGSVhNRShpbW0sICIlcyBub3Qgc3VwcG9ydGVkIixWRVJTSU9OX0dldFZlcnNpb25OYW1lKCkpOworICAgIGNhc2UgV0lOOTU6CisgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKKyAgICBjYXNlIE5UNDA6CisgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldENvbXBvc2l0aW9uV2luZG93MzIgKElNTTMyLjI0KQogICovCi0KIEJPT0wzMiBXSU5BUEkgSW1tR2V0Q29tcG9zaXRpb25XaW5kb3czMihISU1DMzIgaElNQywgTFBDT01QT1NJVElPTkZPUk0gbHBDb21wRm9ybSkKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJXApOiBzdHViXG4iLCBoSU1DLCBscENvbXBGb3JtKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldENvbnRleHQzMiAoSU1NMzIuMjUpCiAgKi8KLQogSElNQzMyIFdJTkFQSSBJbW1HZXRDb250ZXh0MzIoSFdORDMyIGhXbmQpCiB7Ci0JcmV0dXJuIE5VTEw7CisgIEZJWE1FKGltbSwgIigweCUwOHgpOiBzdHViXG4iLCBoV25kKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldENvbnZlcnNpb25MaXN0MzJBIChJTU0zMi4yNikKICAqLwotCiBEV09SRCBXSU5BUEkgSW1tR2V0Q29udmVyc2lvbkxpc3QzMkEoCi0JSEtMMzIgaEtMLCBISU1DMzIgaElNQywKLQlMUENTVFIgcFNyYywgTFBDQU5ESURBVEVMSVNUIGxwRHN0LAotCURXT1JEIGR3QnVmTGVuLCBVSU5UMzIgdUZsYWcpCisgIEhLTDMyIGhLTCwgSElNQzMyIGhJTUMsCisgIExQQ1NUUiBwU3JjLCBMUENBTkRJREFURUxJU1QgbHBEc3QsCisgIERXT1JEIGR3QnVmTGVuLCBVSU5UMzIgdUZsYWcpCiB7Ci0JcmV0dXJuIDA7CisgIEZJWE1FKGltbSwgIigweCUwOHgsIDB4JTA4eCwgJXMsICVwLCAlbGQsICVkKTogc3R1YlxuIiwKKyAgICBoS0wsIGhJTUMsIGRlYnVnc3RyX2EocFNyYyksIGxwRHN0LCBkd0J1ZkxlbiwgdUZsYWcKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldENvbnZlcnNpb25MaXN0MzJXIChJTU0zMi4yNykKICAqLwotCiBEV09SRCBXSU5BUEkgSW1tR2V0Q29udmVyc2lvbkxpc3QzMlcoCi0JSEtMMzIgaEtMLCBISU1DMzIgaElNQywKLQlMUENXU1RSIHBTcmMsIExQQ0FORElEQVRFTElTVCBscERzdCwKLQlEV09SRCBkd0J1ZkxlbiwgVUlOVDMyIHVGbGFnKQorICBIS0wzMiBoS0wsIEhJTUMzMiBoSU1DLAorICBMUENXU1RSIHBTcmMsIExQQ0FORElEQVRFTElTVCBscERzdCwKKyAgRFdPUkQgZHdCdWZMZW4sIFVJTlQzMiB1RmxhZykKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgMHglMDh4LCAlcywgJXAsICVsZCwgJWQpOiBzdHViXG4iLAorICAgIGhLTCwgaElNQywgZGVidWdzdHJfdyhwU3JjKSwgbHBEc3QsIGR3QnVmTGVuLCB1RmxhZworICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0Q29udmVyc2lvblN0YXR1czMyIChJTU0zMi4yOCkKICAqLwotCiBCT09MMzIgV0lOQVBJIEltbUdldENvbnZlcnNpb25TdGF0dXMzMigKLQlISU1DMzIgaElNQywgTFBEV09SRCBscGZkd0NvbnZlcnNpb24sIExQRFdPUkQgbHBmZHdTZW50ZW5jZSkKKyAgSElNQzMyIGhJTUMsIExQRFdPUkQgbHBmZHdDb252ZXJzaW9uLCBMUERXT1JEIGxwZmR3U2VudGVuY2UpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcCwgJXApOiBzdHViXG4iLAorICAgIGhJTUMsIGxwZmR3Q29udmVyc2lvbiwgbHBmZHdTZW50ZW5jZQorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldERlZmF1bHRJTUVXbmQzMiAoSU1NMzIuMjkpCiAgKi8KLQogSFdORDMyIFdJTkFQSSBJbW1HZXREZWZhdWx0SU1FV25kMzIoSFdORDMyIGhXbmQpCiB7Ci0JcmV0dXJuIE5VTEw7CisgIEZJWE1FKGltbSwgIigweCUwOHgpOiBzdHViXG4iLCBoV25kKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldERlc2NyaXB0aW9uMzJBIChJTU0zMi4zMCkKICAqLwotCi1VSU5UMzIgV0lOQVBJIEltbUdldERlc2NyaXB0aW9uMzJBKEhLTDMyIGhLTCwgTFBTVFIgbHBzekRlc2NyaXB0aW9uLCBVSU5UMzIgdUJ1ZkxlbikKK1VJTlQzMiBXSU5BUEkgSW1tR2V0RGVzY3JpcHRpb24zMkEoCisgIEhLTDMyIGhLTCwgTFBTVFIgbHBzekRlc2NyaXB0aW9uLCBVSU5UMzIgdUJ1ZkxlbikKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJXMsICVkKTogc3R1YlxuIiwKKyAgICBoS0wsIGRlYnVnc3RyX2EobHBzekRlc2NyaXB0aW9uKSwgdUJ1ZkxlbgorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0RGVzY3JpcHRpb24zMlcgKElNTTMyLjMxKQogICovCi0KIFVJTlQzMiBXSU5BUEkgSW1tR2V0RGVzY3JpcHRpb24zMlcoSEtMMzIgaEtMLCBMUFdTVFIgbHBzekRlc2NyaXB0aW9uLCBVSU5UMzIgdUJ1ZkxlbikKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJXMsICVkKTogc3R1YlxuIiwKKyAgICBoS0wsIGRlYnVnc3RyX3cobHBzekRlc2NyaXB0aW9uKSwgdUJ1ZkxlbgorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0R3VpZGVMaW5lMzJBIChJTU0zMi4zMikKICAqLwotCi1EV09SRCBXSU5BUEkgSW1tR2V0R3VpZGVMaW5lMzJBKEhJTUMzMiBoSU1DLCBEV09SRCBkd0luZGV4LCBMUFNUUiBscEJ1ZiwgRFdPUkQgZHdCdWZMZW4pCitEV09SRCBXSU5BUEkgSW1tR2V0R3VpZGVMaW5lMzJBKAorICBISU1DMzIgaElNQywgRFdPUkQgZHdJbmRleCwgTFBTVFIgbHBCdWYsIERXT1JEIGR3QnVmTGVuKQogewotCXJldHVybiAwOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlbGQsICVzLCAlbGQpOiBzdHViXG4iLAorICAgIGhJTUMsIGR3SW5kZXgsIGRlYnVnc3RyX2EobHBCdWYpLCBkd0J1ZkxlbgorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0R3VpZGVMaW5lMzJXIChJTU0zMi4zMykKICAqLwotCiBEV09SRCBXSU5BUEkgSW1tR2V0R3VpZGVMaW5lMzJXKEhJTUMzMiBoSU1DLCBEV09SRCBkd0luZGV4LCBMUFdTVFIgbHBCdWYsIERXT1JEIGR3QnVmTGVuKQogewotCXJldHVybiAwOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlbGQsICVzLCAlbGQpOiBzdHViXG4iLAorICAgIGhJTUMsIGR3SW5kZXgsIGRlYnVnc3RyX3cobHBCdWYpLCBkd0J1ZkxlbgorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0SU1FRmlsZU5hbWUzMkEgKElNTTMyLjM4KQogICovCi0KLVVJTlQzMiBXSU5BUEkgSW1tR2V0SU1FRmlsZU5hbWUzMkEoSEtMMzIgaEtMLCBMUFNUUiBscHN6RmlsZU5hbWUsIFVJTlQzMiB1QnVmTGVuKQorVUlOVDMyIFdJTkFQSSBJbW1HZXRJTUVGaWxlTmFtZTMyQSgKKyAgSEtMMzIgaEtMLCBMUFNUUiBscHN6RmlsZU5hbWUsIFVJTlQzMiB1QnVmTGVuKQogewotCXJldHVybiAwOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcywgJWQpOiBzdHViXG4iLAorICAgIGhLTCwgZGVidWdzdHJfYShscHN6RmlsZU5hbWUpLCB1QnVmTGVuCisgICk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRJTUVGaWxlTmFtZTMyVyAoSU1NMzIuMzkpCiAgKi8KLQotVUlOVDMyIFdJTkFQSSBJbW1HZXRJTUVGaWxlTmFtZTMyVyhIS0wzMiBoS0wsIExQV1NUUiBscHN6RmlsZU5hbWUsIFVJTlQzMiB1QnVmTGVuKQorVUlOVDMyIFdJTkFQSSBJbW1HZXRJTUVGaWxlTmFtZTMyVygKKyAgSEtMMzIgaEtMLCBMUFdTVFIgbHBzekZpbGVOYW1lLCBVSU5UMzIgdUJ1ZkxlbikKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJXMsICVkKTogc3R1YlxuIiwKKyAgICBoS0wsIGRlYnVnc3RyX3cobHBzekZpbGVOYW1lKSwgdUJ1ZkxlbgorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0T3BlblN0YXR1czMyIChJTU0zMi40MCkKICAqLwotCiBCT09MMzIgV0lOQVBJIEltbUdldE9wZW5TdGF0dXMzMihISU1DMzIgaElNQykKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgpOiBzdHViXG4iLCBoSU1DKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRQcm9wZXJ0eTMyIChJTU0zMi40MSkKICAqLwotCiBEV09SRCBXSU5BUEkgSW1tR2V0UHJvcGVydHkzMihIS0wzMiBoS0wsIERXT1JEIGZkd0luZGV4KQogewotCXJldHVybiAwOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlbGQpOiBzdHViXG4iLCBoS0wsIGZkd0luZGV4KTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldFJlZ2lzdGVyV29yZFN0eWxlMzJBIChJTU0zMi40MikKICAqLwotCi1VSU5UMzIgV0lOQVBJIEltbUdldFJlZ2lzdGVyV29yZFN0eWxlMzJBKEhLTDMyIGhLTCwgVUlOVDMyIG5JdGVtLCBMUFNUWUxFQlVGQSBscFN0eWxlQnVmKQorVUlOVDMyIFdJTkFQSSBJbW1HZXRSZWdpc3RlcldvcmRTdHlsZTMyQSgKKyAgSEtMMzIgaEtMLCBVSU5UMzIgbkl0ZW0sIExQU1RZTEVCVUZBIGxwU3R5bGVCdWYpCiB7Ci0JcmV0dXJuIDA7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVkLCAlcCk6IHN0dWJcbiIsIGhLTCwgbkl0ZW0sIGxwU3R5bGVCdWYpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tR2V0UmVnaXN0ZXJXb3JkU3R5bGUzMlcgKElNTTMyLjQzKQogICovCi0KLVVJTlQzMiBXSU5BUEkgSW1tR2V0UmVnaXN0ZXJXb3JkU3R5bGUzMlcoSEtMMzIgaEtMLCBVSU5UMzIgbkl0ZW0sIExQU1RZTEVCVUZXIGxwU3R5bGVCdWYpCitVSU5UMzIgV0lOQVBJIEltbUdldFJlZ2lzdGVyV29yZFN0eWxlMzJXKAorICBIS0wzMiBoS0wsIFVJTlQzMiBuSXRlbSwgTFBTVFlMRUJVRlcgbHBTdHlsZUJ1ZikKIHsKLQlyZXR1cm4gMDsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJWQsICVwKTogc3R1YlxuIiwgaEtMLCBuSXRlbSwgbHBTdHlsZUJ1Zik7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1HZXRTdGF0dXNXaW5kb3dQb3MzMiAoSU1NMzIuNDQpCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBJbW1HZXRTdGF0dXNXaW5kb3dQb3MzMihISU1DMzIgaElNQywgTFBQT0lOVDMyIGxwcHRQb3MpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcCk6IHN0dWJcbiIsIGhJTUMsIGxwcHRQb3MpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUdldFZpcnR1YWxLZXkzMiAoSU1NMzIuNDUpCiAgKi8KLQogVUlOVDMyIFdJTkFQSSBJbW1HZXRWaXJ0dWFsS2V5MzIoSFdORDMyIGhXbmQpCiB7Ci0JcmV0dXJuIDA7CisgIEZJWE1FKGltbSwgIigweCUwOHgpOiBzdHViXG4iLCBoV25kKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgc3dpdGNoKFZFUlNJT05fR2V0VmVyc2lvbigpKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgRklYTUUoaW1tLCAiJXMgbm90IHN1cHBvcnRlZCIsIFZFUlNJT05fR2V0VmVyc2lvbk5hbWUoKSk7CisgICAgY2FzZSBXSU45NToKKyAgICAgIHJldHVybiBWS19QUk9DRVNTS0VZOworICAgIGNhc2UgTlQ0MDoKKyAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tSW5zdGFsbElNRTMyQSAoSU1NMzIuNDYpCiAgKi8KLQotSEtMMzIgV0lOQVBJIEltbUluc3RhbGxJTUUzMkEoTFBDU1RSIGxwc3pJTUVGaWxlTmFtZSwgTFBDU1RSIGxwc3pMYXlvdXRUZXh0KQorSEtMMzIgV0lOQVBJIEltbUluc3RhbGxJTUUzMkEoCisgIExQQ1NUUiBscHN6SU1FRmlsZU5hbWUsIExQQ1NUUiBscHN6TGF5b3V0VGV4dCkKIHsKLQlyZXR1cm4gTlVMTDsKKyAgRklYTUUoaW1tLCAiKCVzLCAlcyk6IHN0dWJcbiIsCisgICAgZGVidWdzdHJfYShscHN6SU1FRmlsZU5hbWUpLCBkZWJ1Z3N0cl9hKGxwc3pMYXlvdXRUZXh0KQorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gTlVMTDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tSW5zdGFsbElNRTMyVyAoSU1NMzIuNDcpCiAgKi8KLQotSEtMMzIgV0lOQVBJIEltbUluc3RhbGxJTUUzMlcoTFBDV1NUUiBscHN6SU1FRmlsZU5hbWUsIExQQ1dTVFIgbHBzekxheW91dFRleHQpCitIS0wzMiBXSU5BUEkgSW1tSW5zdGFsbElNRTMyVygKKyAgTFBDV1NUUiBscHN6SU1FRmlsZU5hbWUsIExQQ1dTVFIgbHBzekxheW91dFRleHQpCiB7Ci0JcmV0dXJuIE5VTEw7CisgIEZJWE1FKGltbSwgIiglcywgJXMpOiBzdHViXG4iLAorICAgIGRlYnVnc3RyX3cobHBzeklNRUZpbGVOYW1lKSwgZGVidWdzdHJfdyhscHN6TGF5b3V0VGV4dCkKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbUlzSU1FMzIgKElNTTMyLjQ4KQogICovCi0KIEJPT0wzMiBXSU5BUEkgSW1tSXNJTUUzMihIS0wzMiBoS0wpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4KTogc3R1YlxuIiwgaEtMKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1Jc1VJTWVzc2FnZTMyQSAoSU1NMzIuNDkpCiAgKi8KLQotQk9PTDMyIFdJTkFQSSBJbW1Jc1VJTWVzc2FnZTMyQShIV05EMzIgaFduZElNRSwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorQk9PTDMyIFdJTkFQSSBJbW1Jc1VJTWVzc2FnZTMyQSgKKyAgSFdORDMyIGhXbmRJTUUsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVkLCAlZCwgJWxkKTogc3R1YlxuIiwKKyAgICBoV25kSU1FLCBtc2csIHdQYXJhbSwgbFBhcmFtCisgICk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tSXNVSU1lc3NhZ2UzMlcgKElNTTMyLjUwKQogICovCi0KLUJPT0wzMiBXSU5BUEkgSW1tSXNVSU1lc3NhZ2UzMlcoSFdORDMyIGhXbmRJTUUsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK0JPT0wzMiBXSU5BUEkgSW1tSXNVSU1lc3NhZ2UzMlcoCisgIEhXTkQzMiBoV25kSU1FLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlZCwgJWQsICVsZCk6IHN0dWJcbiIsCisgICAgaFduZElNRSwgbXNnLCB3UGFyYW0sIGxQYXJhbQorICApOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbU5vdGlmeUlNRTMyIChJTU0zMi41MykKICAqLwotCi1CT09MMzIgV0lOQVBJIEltbU5vdGlmeUlNRTMyKEhJTUMzMiBoSU1DLCBEV09SRCBkd0FjdGlvbiwgRFdPUkQgZHdJbmRleCwgRFdPUkQgZHdWYWx1ZSkKK0JPT0wzMiBXSU5BUEkgSW1tTm90aWZ5SU1FMzIoCisgIEhJTUMzMiBoSU1DLCBEV09SRCBkd0FjdGlvbiwgRFdPUkQgZHdJbmRleCwgRFdPUkQgZHdWYWx1ZSkKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVsZCwgJWxkLCAlbGQpOiBzdHViXG4iLAorICAgIGhJTUMsIGR3QWN0aW9uLCBkd0luZGV4LCBkd1ZhbHVlCisgICk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tUmVnaXN0ZXJXb3JkMzJBIChJTU0zMi41NSkKICAqLwotCi1CT09MMzIgV0lOQVBJIEltbVJlZ2lzdGVyV29yZDMyQShIS0wzMiBoS0wsIExQQ1NUUiBscHN6UmVhZGluZywgRFdPUkQgZHdTdHlsZSwgTFBDU1RSIGxwc3pSZWdpc3RlcikKK0JPT0wzMiBXSU5BUEkgSW1tUmVnaXN0ZXJXb3JkMzJBKAorICBIS0wzMiBoS0wsIExQQ1NUUiBscHN6UmVhZGluZywgRFdPUkQgZHdTdHlsZSwgTFBDU1RSIGxwc3pSZWdpc3RlcikKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVzLCAlbGQsICVzKTogc3R1YlxuIiwKKyAgICBoS0wsIGRlYnVnc3RyX2EobHBzelJlYWRpbmcpLCBkd1N0eWxlLCBkZWJ1Z3N0cl9hKGxwc3pSZWdpc3RlcikKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1SZWdpc3RlcldvcmQzMlcgKElNTTMyLjU2KQogICovCi0KLUJPT0wzMiBXSU5BUEkgSW1tUmVnaXN0ZXJXb3JkMzJXKEhLTDMyIGhLTCwgTFBDV1NUUiBscHN6UmVhZGluZywgRFdPUkQgZHdTdHlsZSwgTFBDV1NUUiBscHN6UmVnaXN0ZXIpCitCT09MMzIgV0lOQVBJIEltbVJlZ2lzdGVyV29yZDMyVygKKyAgSEtMMzIgaEtMLCBMUENXU1RSIGxwc3pSZWFkaW5nLCBEV09SRCBkd1N0eWxlLCBMUENXU1RSIGxwc3pSZWdpc3RlcikKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVzLCAlbGQsICVzKTogc3R1YlxuIiwKKyAgICBoS0wsIGRlYnVnc3RyX3cobHBzelJlYWRpbmcpLCBkd1N0eWxlLCBkZWJ1Z3N0cl93KGxwc3pSZWdpc3RlcikKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1SZWxlYXNlQ29udGV4dDMyIChJTU0zMi41NykKICAqLwotCiBCT09MMzIgV0lOQVBJIEltbVJlbGVhc2VDb250ZXh0MzIoSFdORDMyIGhXbmQsIEhJTUMzMiBoSU1DKQogewotCXJldHVybiBGQUxTRTsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgMHglMDh4KTogc3R1YlxuIiwgaFduZCwgaElNQyk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tU2V0Q2FuZGlkYXRlV2luZG93MzIgKElNTTMyLjU4KQogICovCi0KLUJPT0wzMiBXSU5BUEkgSW1tU2V0Q2FuZGlkYXRlV2luZG93MzIgKEhJTUMzMiBoSU1DLCBMUENBTkRJREFURUZPUk0gbHBDYW5kaWRhdGUpCitCT09MMzIgV0lOQVBJIEltbVNldENhbmRpZGF0ZVdpbmRvdzMyKAorICBISU1DMzIgaElNQywgTFBDQU5ESURBVEVGT1JNIGxwQ2FuZGlkYXRlKQogewotCXJldHVybiBGQUxTRTsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJXApOiBzdHViXG4iLCBoSU1DLCBscENhbmRpZGF0ZSk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tU2V0Q29tcG9zaXRpb25Gb250MzJBIChJTU0zMi41OSkKICAqLwotCiBCT09MMzIgV0lOQVBJIEltbVNldENvbXBvc2l0aW9uRm9udDMyQShISU1DMzIgaElNQywgTFBMT0dGT05UMzJBIGxwbGYpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcCk6IHN0dWJcbiIsIGhJTUMsIGxwbGYpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEltbVNldENvbXBvc2l0aW9uRm9udDMyVyAoSU1NMzIuNjApCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBJbW1TZXRDb21wb3NpdGlvbkZvbnQzMlcoSElNQzMyIGhJTUMsIExQTE9HRk9OVDMyVyBscGxmKQogewotCXJldHVybiBGQUxTRTsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJXApOiBzdHViXG4iLCBoSU1DLCBscGxmKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1TZXRDb21wb3NpdGlvblN0cmluZzMyQSAoSU1NMzIuNjEpCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBJbW1TZXRDb21wb3NpdGlvblN0cmluZzMyQSgKLQlISU1DMzIgaElNQywgRFdPUkQgZHdJbmRleCwgCi0JTFBDVk9JRCBscENvbXAsIERXT1JEIGR3Q29tcExlbiwgCi0JTFBDVk9JRCBscFJlYWQsIERXT1JEIGR3UmVhZExlbikKKyAgSElNQzMyIGhJTUMsIERXT1JEIGR3SW5kZXgsIAorICBMUENWT0lEIGxwQ29tcCwgRFdPUkQgZHdDb21wTGVuLCAKKyAgTFBDVk9JRCBscFJlYWQsIERXT1JEIGR3UmVhZExlbikKIHsKLQlyZXR1cm4gRkFMU0U7CisgIEZJWE1FKGltbSwgIigweCUwOHgsICVsZCwgJXAsICVsZCwgJXAsICVsZCk6IHN0dWJcbiIsCisgICAgaElNQywgZHdJbmRleCwgbHBDb21wLCBkd0NvbXBMZW4sIGxwUmVhZCwgZHdSZWFkTGVuCisgICk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tU2V0Q29tcG9zaXRpb25TdHJpbmczMlcgKElNTTMyLjYyKQogICovCi0KIEJPT0wzMiBXSU5BUEkgSW1tU2V0Q29tcG9zaXRpb25TdHJpbmczMlcoCiAJSElNQzMyIGhJTUMsIERXT1JEIGR3SW5kZXgsCiAJTFBDVk9JRCBscENvbXAsIERXT1JEIGR3Q29tcExlbiwKIAlMUENWT0lEIGxwUmVhZCwgRFdPUkQgZHdSZWFkTGVuKQogewotCXJldHVybiBGQUxTRTsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJWxkLCAlcCwgJWxkLCAlcCwgJWxkKTogc3R1YlxuIiwKKyAgICBoSU1DLCBkd0luZGV4LCBscENvbXAsIGR3Q29tcExlbiwgbHBSZWFkLCBkd1JlYWRMZW4KKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1TZXRDb21wb3NpdGlvbldpbmRvdzMyIChJTU0zMi42MykKICAqLwotCi1CT09MMzIgV0lOQVBJIEltbVNldENvbXBvc2l0aW9uV2luZG93MzIoSElNQzMyIGhJTUMsIExQQ09NUE9TSVRJT05GT1JNIGxwQ29tcEZvcm0pCitCT09MMzIgV0lOQVBJIEltbVNldENvbXBvc2l0aW9uV2luZG93MzIoCisgIEhJTUMzMiBoSU1DLCBMUENPTVBPU0lUSU9ORk9STSBscENvbXBGb3JtKQogewotCXJldHVybiBGQUxTRTsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJXApOiBzdHViXG4iLCBoSU1DLCBscENvbXBGb3JtKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1TZXRDb252ZXJzaW9uU3RhdHVzMzIgKElNTTMyLjY0KQogICovCi0KLUJPT0wzMiBXSU5BUEkgSW1tU2V0Q29udmVyc2lvblN0YXR1czMyKEhJTUMzMiBoSU1DLCBEV09SRCBmZHdDb252ZXJzaW9uLCBEV09SRCBmZHdTZW50ZW5jZSkKK0JPT0wzMiBXSU5BUEkgSW1tU2V0Q29udmVyc2lvblN0YXR1czMyKAorICBISU1DMzIgaElNQywgRFdPUkQgZmR3Q29udmVyc2lvbiwgRFdPUkQgZmR3U2VudGVuY2UpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlbGQsICVsZCk6IHN0dWJcbiIsCisgICAgaElNQywgZmR3Q29udmVyc2lvbiwgZmR3U2VudGVuY2UKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1TZXRPcGVuU3RhdHVzMzIgKElNTTMyLjY2KQogICovCi0KIEJPT0wzMiBXSU5BUEkgSW1tU2V0T3BlblN0YXR1czMyKEhJTUMzMiBoSU1DLCBCT09MMzIgZk9wZW4pCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlZCk6IHN0dWJcbiIsIGhJTUMsIGZPcGVuKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBJbW1TZXRTdGF0dXNXaW5kb3dQb3MzMiAoSU1NMzIuNjcpCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBJbW1TZXRTdGF0dXNXaW5kb3dQb3MzMihISU1DMzIgaElNQywgTFBQT0lOVDMyIGxwcHRQb3MpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcCk6IHN0dWJcbiIsIGhJTUMsIGxwcHRQb3MpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tU2ltdWxhdGVIb3RLZXkzMiAoSU1NMzIuNjkpCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBJbW1TaW11bGF0ZUhvdEtleTMyKEhXTkQzMiBoV25kLCBEV09SRCBkd0hvdEtleUlEKQogewotCXJldHVybiBGQUxTRTsKKyAgRklYTUUoaW1tLCAiKDB4JTA4eCwgJWxkKTogc3R1YlxuIiwgaFduZCwgZHdIb3RLZXlJRCk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW1tVW5yZWdpc3RlcldvcmQzMkEgKElNTTMyLjcyKQogICovCi0KLUJPT0wzMiBXSU5BUEkgSW1tVW5yZWdpc3RlcldvcmQzMkEoSEtMMzIgaEtMLCBMUENTVFIgbHBzelJlYWRpbmcsIERXT1JEIGR3U3R5bGUsIExQQ1NUUiBscHN6VW5yZWdpc3RlcikKK0JPT0wzMiBXSU5BUEkgSW1tVW5yZWdpc3RlcldvcmQzMkEoCisgIEhLTDMyIGhLTCwgTFBDU1RSIGxwc3pSZWFkaW5nLCBEV09SRCBkd1N0eWxlLCBMUENTVFIgbHBzelVucmVnaXN0ZXIpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcywgJWxkLCAlcyk6IHN0dWJcbiIsCisgICAgaEtMLCBkZWJ1Z3N0cl9hKGxwc3pSZWFkaW5nKSwgZHdTdHlsZSwgZGVidWdzdHJfYShscHN6VW5yZWdpc3RlcikKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUzOSw4ICs3MTksMTIgQEAKICAqICAgICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGZpbmQgdGhlIG9yZGluYWwgZm9yIHRoaXMgZnVuY3Rpb24sCiAgKiAgICAgVGhpcyBtZWFucyBpdCBjYW4ndCBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBETEwuCiAgKi8KLQotQk9PTDMyIFdJTkFQSSBJbW1VbnJlZ2lzdGVyV29yZDMyVyhIS0wzMiBoS0wsIExQQ1dTVFIgbHBzelJlYWRpbmcsIERXT1JEIGR3U3R5bGUsIExQQ1dTVFIgbHBzelVucmVnaXN0ZXIpCitCT09MMzIgV0lOQVBJIEltbVVucmVnaXN0ZXJXb3JkMzJXKAorICBIS0wzMiBoS0wsIExQQ1dTVFIgbHBzelJlYWRpbmcsIERXT1JEIGR3U3R5bGUsIExQQ1dTVFIgbHBzelVucmVnaXN0ZXIpCiB7Ci0JcmV0dXJuIEZBTFNFOworICBGSVhNRShpbW0sICIoMHglMDh4LCAlcywgJWxkLCAlcyk6IHN0dWJcbiIsCisgICAgaEtMLCBkZWJ1Z3N0cl93KGxwc3pSZWFkaW5nKSwgZHdTdHlsZSwgZGVidWdzdHJfdyhscHN6VW5yZWdpc3RlcikKKyAgKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9sc3RyLmMgYi9taXNjL2xzdHIuYwppbmRleCBiMmI0YWUwLi5jMTIxYWQ0IDEwMDY0NAotLS0gYS9taXNjL2xzdHIuYworKysgYi9taXNjL2xzdHIuYwpAQCAtNjY4LDcgKzY2OCw3IEBACiAJaWYgKG5TaXplICYmIHRhbGxvY2VkPG5TaXplKSB7CiAJCXRhcmdldCA9IChjaGFyKilIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksdGFyZ2V0LG5TaXplKTsKIAl9Ci0gICAgVFJBQ0UocmVzb3VyY2UsIi0tICVzXG4iLHRhcmdldCk7CisgICAgVFJBQ0UocmVzb3VyY2UsIi0tICVzXG4iLGRlYnVnc3RyX2EodGFyZ2V0KSk7CiAJaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIpIHsKIAkJLyogblNpemUgaXMgdGhlIE1JTklNVU0gc2l6ZSAqLwogCQkqKChMUFZPSUQqKWxwQnVmZmVyKSA9IChMUFZPSUQpTG9jYWxBbGxvYzMyKEdNRU1fWkVST0lOSVQsdGFsbG9jZWQpOwpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAwOTI1ZjVkLi44MzBmOTg0IDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMzMsMjQgKzMzLDMyIEBACiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgInZlcnNpb24uaCIKIAorLyogd2hlbiBhZGRpbmcgbmV3IGxhbmd1YWdlcyBsb29rIGF0IG9sZS9vbGUybmxzLmMgCisgKiBmb3IgcHJvcGVyIGlzbyBuYW1lIGFuZCBXaW5kb3dzIGNvZGUgKGFkZCAweDA0MDAgCisgKiB0byB0aGUgY29kZSBsaXN0ZWQgdGhlcmUpCisgKi8KIGNvbnN0IFdJTkVfTEFOR1VBR0VfREVGIExhbmd1YWdlc1tdID0KIHsKICAgICB7IkVuIiwweDA0MDl9LAkvKiBMQU5HX0VuICovCiAgICAgeyJFcyIsMHgwNDBBfSwJLyogTEFOR19FcyAqLwogICAgIHsiRGUiLDB4MDQwN30sCS8qIExBTkdfRGUgKi8KICAgICB7Ik5vIiwweDA0MTR9LAkvKiBMQU5HX05vICovCi0gICAgeyJGciIsMHgwNDAwfSwJLyogTEFOR19GciAqLworICAgIHsiRnIiLDB4MDQwQ30sCS8qIExBTkdfRnIgKi8KICAgICB7IkZpIiwweDA0MEJ9LAkvKiBMQU5HX0ZpICovCiAgICAgeyJEYSIsMHgwNDA2fSwJLyogTEFOR19EYSAqLwotICAgIHsiQ3oiLDB4MDQwNX0sCS8qIExBTkdfQ3ogKi8KLSAgICB7IkVvIiwweDA0MjV9LAkvKiBMQU5HX0VvICovCisgICAgeyJDcyIsMHgwNDA1fSwJLyogTEFOR19DcyAqLworICAgIHsiRW8iLDB4MDQ4Zn0sCS8qIExBTkdfRW8gKi8KICAgICB7Ikl0IiwweDA0MTB9LAkvKiBMQU5HX0l0ICovCiAgICAgeyJLbyIsMHgwNDEyfSwJLyogTEFOR19LbyAqLwotICAgIHsiSHUiLDB4MDQzNn0sCS8qIExBTkdfSHUgKi8KKyAgICB7Ikh1IiwweDA0MGV9LAkvKiBMQU5HX0h1ICovCiAgICAgeyJQbCIsMHgwNDE1fSwJLyogTEFOR19QbCAqLwotICAgIHsiUG8iLDB4MDQxNn0sCS8qIExBTkdfUG8gKi8KLSAgICB7IlN3IiwweDA0MTd9LAkvKiBMQU5HX1N3ICovCi0gICAgeyJDYSIsMHgwNDI2fSwJLyogTEFOR19DYSAqLworICAgIHsiUHQiLDB4MDQxNn0sCS8qIExBTkdfUHQgKi8KKyAgICB7IlN2IiwweDA0MWR9LAkvKiBMQU5HX1N2ICovCisgICAgeyJDYSIsMHgwNDAzfSwJLyogTEFOR19DYSAqLworLyogZm9yIGNvbXBhdGliaWxpdHkgd2hpdGggbm9uLWlzbyBuYW1lcyBwcmV2aW91c2x5IHVzZWQgKi8KKyAgICB7IlN3IiwweDA0MWR9LCAgICAgIC8qIExBTkdfU3YgKi8KKyAgICB7IkN6IiwweDA0MDV9LCAgICAgIC8qIExBTkdfQ3MgKi8KKyAgICB7IlBvIiwweDA0MTZ9LCAgICAgIC8qIExBTkdfUHQgKi8KICAgICB7TlVMTCwwfQogfTsKIApAQCAtODYsNyArOTQsOCBAQAogICAgIExBTkdfRW4sCiAjZW5kaWYKICAgICBGQUxTRSwgICAgICAgICAgLyogTWFuYWdlZCB3aW5kb3dzICovCi0gICAgRkFMU0UgICAgICAgICAgIC8qIFBlcmZlY3QgZ3JhcGhpY3MgKi8KKyAgICBGQUxTRSwgICAgICAgICAgLyogUGVyZmVjdCBncmFwaGljcyAqLworICAgIE5VTEwgICAgICAgICAgICAvKiBBbHRlcm5hdGUgY29uZmlnIGZpbGUgbmFtZSAqLwogfTsKIAogCkBAIC0xMDksNyArMTE4LDggQEAKICAgICB7ICItZmFpbHJlYWRvbmx5IiwgICIuZmFpbHJlYWRvbmx5IiwgICAgWHJtb3B0aW9uTm9BcmcsICAoY2FkZHJfdCkib24iIH0sCiAgICAgeyAiLW1vZGUiLCAgICAgICAgICAiLm1vZGUiLCAgICAgICAgICAgIFhybW9wdGlvblNlcEFyZywgKGNhZGRyX3QpTlVMTCB9LAogICAgIHsgIi1tYW5hZ2VkIiwgICAgICAgIi5tYW5hZ2VkIiwgICAgICAgICBYcm1vcHRpb25Ob0FyZywgIChjYWRkcl90KSJvZmYifSwKLSAgICB7ICItd2ludmVyIiwgICAgICAgICIud2ludmVyIiwgICAgICAgICAgWHJtb3B0aW9uU2VwQXJnLCAoY2FkZHJfdClOVUxMIH0KKyAgICB7ICItd2ludmVyIiwgICAgICAgICIud2ludmVyIiwgICAgICAgICAgWHJtb3B0aW9uU2VwQXJnLCAoY2FkZHJfdClOVUxMIH0sCisgICAgeyAiLWNvbmZpZyIsICAgICAgICAiLmNvbmZpZyIsICAgICAgICAgIFhybW9wdGlvblNlcEFyZywgKGNhZGRyX3QpTlVMTCB9CiB9OwogCiAjZGVmaW5lIE5CX09QVElPTlMgIChzaXplb2Yob3B0aW9uc1RhYmxlKSAvIHNpemVvZihvcHRpb25zVGFibGVbMF0pKQpAQCAtMTIwLDYgKzEzMCw3IEBACiAgICJcbiIgXAogICAiT3B0aW9uczpcbiIgXAogICAiICAgIC1iYWNraW5nc3RvcmUgICBUdXJuIG9uIGJhY2tpbmcgc3RvcmVcbiIgXAorICAiICAgIC1jb25maWcgbmFtZSAgICBTcGVjaWZ5IGNvbmZpZyBmaWxlIHRvIHVzZVxuIiBcCiAgICIgICAgLWRlYnVnICAgICAgICAgIEVudGVyIGRlYnVnZ2VyIGJlZm9yZSBzdGFydGluZyBhcHBsaWNhdGlvblxuIiBcCiAgICIgICAgLWRlYnVnbXNnIG5hbWUgIFR1cm4gZGVidWdnaW5nLW1lc3NhZ2VzIG9uIG9yIG9mZlxuIiBcCiAgICIgICAgLWRlcHRoIG4gICAgICAgIENoYW5nZSB0aGUgZGVwdGggdG8gdXNlIGZvciBtdWx0aXBsZS1kZXB0aCBzY3JlZW5zXG4iIFwKQEAgLTEzMCw3ICsxNDEsNyBAQAogICAiICAgIC1maXhlZG1hcCAgICAgICBVc2UgYSBcInN0YW5kYXJkXCIgY29sb3IgbWFwXG4iIFwKICAgIiAgICAtaGVscCAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgbWVzc2FnZVxuIiBcCiAgICIgICAgLWljb25pYyAgICAgICAgIFN0YXJ0IGFzIGFuIGljb25cbiIgXAotICAiICAgIC1sYW5ndWFnZSB4eCAgICBTZXQgdGhlIGxhbmd1YWdlIChvbmUgb2YgRW4sRXMsRGUsTm8sRnIsRmksRGEsQ3osRW8sSXQsS28sXG4gICAgICAgICAgICAgICAgICAgIEh1LFBsLFBvLFN3LENhKVxuIiBcCisgICIgICAgLWxhbmd1YWdlIHh4ICAgIFNldCB0aGUgbGFuZ3VhZ2UgKG9uZSBvZiBDYSxDcyxEYSxEZSxFbixFbyxFcyxGaSxGcixIdSxJdCxcbiAgICAgICAgICAgICAgICAgICAgS28sTm8sUGwsUHQsU3YpXG4iIFwKICAgIiAgICAtbWFuYWdlZCAgICAgICAgQWxsb3cgdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIG1hbmFnZSBjcmVhdGVkIHdpbmRvd3NcbiIgXAogICAiICAgIC1tb2RlIG1vZGUgICAgICBTdGFydCBXaW5lIGluIGEgcGFydGljdWxhciBtb2RlIChzdGFuZGFyZCBvciBlbmhhbmNlZClcbiIgXAogICAiICAgIC1uYW1lIG5hbWUgICAgICBTZXQgdGhlIGFwcGxpY2F0aW9uIG5hbWVcbiIgXApAQCAtNTAyLDYgKzUxMyw4IEBACiAKICAgICAgIGlmIChNQUlOX0dldFJlc291cmNlKCBkYiwgIi53aW52ZXIiLCAmdmFsdWUpKQogICAgICAgICAgIFZFUlNJT05fUGFyc2VWZXJzaW9uKCAoY2hhciopdmFsdWUuYWRkciApOworICAgICAgaWYgKE1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLmNvbmZpZyIsICZ2YWx1ZSkpCisgICAgICAgICBPcHRpb25zLmNvbmZpZ0ZpbGVOYW1lID0geHN0cmR1cCgoY2hhciAqKXZhbHVlLmFkZHIpOwogfQogCiAKQEAgLTExODksNiArMTIwMiw2IEBACiAqLwogRkFSUFJPQzE2IFdJTkFQSSBGaWxlQ0RSKEZBUlBST0MxNiB4KQogewotCUZJWE1FKGZpbGUsIiglOHgpOiBzdHViXG4iLCAoaW50KSB4KTsKKwlGSVhNRShmaWxlLCIoMHglOHgpOiBzdHViXG4iLCAoaW50KSB4KTsKIAlyZXR1cm4gKEZBUlBST0MxNilUUlVFOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9udGRsbC5jIGIvbWlzYy9udGRsbC5jCmluZGV4IDQ4MTg4YWEuLjVjOTEzMjggMTAwNjQ0Ci0tLSBhL21pc2MvbnRkbGwuYworKysgYi9taXNjL250ZGxsLmMKQEAgLTYyNCw3ICs2MjQsNyBAQAogICovCiBEV09SRCBXSU5BUEkgTnRRdWVyeU9iamVjdCggRFdPUkQgeDEsIERXT1JEIHgyICxEV09SRCB4MywgRFdPUkQgeDQsIERXT1JEIHg1ICkKIHsKLSAgICBGSVhNRShudGRsbCwiKCVseCwlbHgsJWx4LCVseCwlbHgpOiBzdHViXG4iLHgxLHgyLHgzLHg0LHg1KTsKKyAgICBGSVhNRShudGRsbCwiKDB4JWx4LCVseCwlbHgsJWx4LCVseCk6IHN0dWJcbiIseDEseDIseDMseDQseDUpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9taXNjL3ByaW50ZHJ2LmMgYi9taXNjL3ByaW50ZHJ2LmMKaW5kZXggYTIxNDZlNS4uYmI5ZTJkMSAxMDA2NDQKLS0tIGEvbWlzYy9wcmludGRydi5jCisrKyBiL21pc2MvcHJpbnRkcnYuYwpAQCAtMjM3LDExICsyMzcsMTIgQEAKIEJPT0wzMiBXSU5BUEkgT3BlblByaW50ZXIzMkEoTFBTVFIgbHBQcmludGVyTmFtZSxIQU5ETEUzMiAqcGhQcmludGVyLAogCQkJICAgICBMUFBSSU5URVJfREVGQVVMVFMzMkEgcERlZmF1bHQpCiB7Ci0gICAgRklYTUUocHJpbnQsIiglcywlcCwlcCk6c3R1Yi5cbiIsCi0JICAgIGxwUHJpbnRlck5hbWUsIHBoUHJpbnRlciwgcERlZmF1bHQpOworICAgIEZJWE1FKHByaW50LCIoJXMsJXAsJXApOnN0dWJcbiIsZGVidWdzdHJfYShscFByaW50ZXJOYW1lKSwgcGhQcmludGVyLAorICAgICAgICAgIHBEZWZhdWx0KTsKICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgIHJldHVybiBGQUxTRTsKIH0KKwogQk9PTDMyICBXSU5BUEkgRW51bVByaW50ZXJzMzJBKERXT1JEIGR3VHlwZSwgTFBTVFIgbHBzek5hbWUsCiAJCQkgICAgICAgRFdPUkQgZHdMZXZlbCwgTFBCWVRFIGxwYlByaW50ZXJzLAogCQkJICAgICAgIERXT1JEIGNiQnVmLCBMUERXT1JEIGxwZHdOZWVkZWQsCkBAIC0yNjQsNyArMjY1LDggQEAKIEJPT0wzMiBXSU5BUEkKIERlbGV0ZVByaW50ZXJEcml2ZXIzMkEgKExQU1RSIHBOYW1lLCBMUFNUUiBwRW52aXJvbm1lbnQsIExQU1RSIHBEcml2ZXJOYW1lKQogewotICAgIEZJWE1FKHByaW50LCAiKCVzLCVzLCVzKTpzdHViIVxuIiwgcE5hbWUsIHBFbnZpcm9ubWVudCwgcERyaXZlck5hbWUpOworICAgIEZJWE1FKHByaW50LCIoJXMsJXMsJXMpOnN0dWJcbiIsZGVidWdzdHJfYShwTmFtZSksZGVidWdzdHJfYShwRW52aXJvbm1lbnQpLAorICAgICAgICAgIGRlYnVnc3RyX2EocERyaXZlck5hbWUpKTsKICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgIHJldHVybiBGQUxTRTsKIH0KQEAgLTI3Myw3ICsyNzUsOCBAQAogQk9PTDMyIFdJTkFQSQogRGVsZXRlTW9uaXRvcjMyQSAoTFBTVFIgcE5hbWUsIExQU1RSIHBFbnZpcm9ubWVudCwgTFBTVFIgcE1vbml0b3JOYW1lKQogewotICAgIEZJWE1FKHByaW50LCAiKCVzLCVzLCVzKTpzdHViIVxuIiwgcE5hbWUsIHBFbnZpcm9ubWVudCwgcE1vbml0b3JOYW1lKTsKKyAgICBGSVhNRShwcmludCwiKCVzLCVzLCVzKTpzdHViXG4iLGRlYnVnc3RyX2EocE5hbWUpLGRlYnVnc3RyX2EocEVudmlyb25tZW50KSwKKyAgICAgICAgICBkZWJ1Z3N0cl9hKHBNb25pdG9yTmFtZSkpOwogICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgcmV0dXJuIEZBTFNFOwogfQpAQCAtMjgyLDcgKzI4NSw4IEBACiBCT09MMzIgV0lOQVBJCiBEZWxldGVQb3J0MzJBIChMUFNUUiBwTmFtZSwgSFdORDMyIGhXbmQsIExQU1RSIHBQb3J0TmFtZSkKIHsKLSAgICBGSVhNRShwcmludCwgIiglcywweCUwOHgsJXMpOnN0dWIhXG4iLCBwTmFtZSwgaFduZCwgcFBvcnROYW1lKTsKKyAgICBGSVhNRShwcmludCwiKCVzLDB4JTA4eCwlcyk6c3R1YlxuIixkZWJ1Z3N0cl9hKHBOYW1lKSxoV25kLAorICAgICAgICAgIGRlYnVnc3RyX2EocFBvcnROYW1lKSk7CiAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9taXNjL3JlZ2lzdHJ5LmMgYi9taXNjL3JlZ2lzdHJ5LmMKaW5kZXggYjBiODFhOC4uNjdhYzI0NiAxMDA2NDQKLS0tIGEvbWlzYy9yZWdpc3RyeS5jCisrKyBiL21pc2MvcmVnaXN0cnkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpkaWZmIC0tZ2l0IGEvbWlzYy90d2Vhay5jIGIvbWlzYy90d2Vhay5jCmluZGV4IDk1MmUxNDEuLjljZTQ0ZTAgMTAwNjQ0Ci0tLSBhL21pc2MvdHdlYWsuYworKysgYi9taXNjL3R3ZWFrLmMKQEAgLTIxLDEwMiArMjEsMjIgQEAKICAqICAgUmV2aXNpb24gaGlzdG9yeQogICogICAgICAgIDAzLUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQogICogICAgICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24uCi0gKgogICogICAgICAgIDA1LUF1Zy0xOTk4IEVyaWMgS29obCAoZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGUpCiAgKiAgICAgICAgICAgICBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCisgKiAgICAgICAgMjItU2VwLTE5OTggRXJpYyBLb2hsIChla29obEBhYm8ucmhlaW4temVpdHVuZy5kZSkKKyAqICAgICAgICAgICAgIFJlbW92ZWQgbW9yZSB1bnVzZWQgY29kZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlICJ0c194bGliLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiZGMuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImdyYXBoaWNzLmgiCi0jaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJ0d2Vhay5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLQotCi0vKiBQYXJhbWV0ZXJzIGZvciBjb250cm9scy9tZW51LmMgKi8KLWV4dGVybiBVSU5UMzIgIE1FTlVfQmFySXRlbVRvcE51ZGdlOwotZXh0ZXJuIFVJTlQzMiAgTUVOVV9CYXJJdGVtTGVmdE51ZGdlOwotZXh0ZXJuIFVJTlQzMiAgTUVOVV9JdGVtVG9wTnVkZ2U7Ci1leHRlcm4gVUlOVDMyICBNRU5VX0l0ZW1MZWZ0TnVkZ2U7Ci1leHRlcm4gVUlOVDMyICBNRU5VX0hpZ2hsaWdodFRvcE51ZGdlOwotZXh0ZXJuIFVJTlQzMiAgTUVOVV9IaWdobGlnaHRMZWZ0TnVkZ2U7Ci1leHRlcm4gVUlOVDMyICBNRU5VX0hpZ2hsaWdodEJvdHRvbU51ZGdlOwotZXh0ZXJuIFVJTlQzMiAgTUVOVV9IaWdobGlnaHRSaWdodE51ZGdlOwotCisjaW5jbHVkZSAidHdlYWsuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogLyogR2VuZXJhbCBvcHRpb25zICovCi0jaWYgZGVmaW5lZChXSU5fOTVfTE9PSykKLWludCAgVFdFQUtfV2luOTVMb29rID0gMTsKLSNlbHNlCi1pbnQgIFRXRUFLX1dpbjk1TG9vayA9IDA7Ci0jZW5kaWYKIAotaW50ICBUV0VBS19XaW5lSW5pdGlhbGl6ZWQgPSAwOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgIGludCAgVFdFQUtfTWVudUluaXQoKQotICogCi0gKiAgIEluaXRpYWxpemVzIHRoZSBXaW45NSB0d2Vha3MgdG8gdGhlIG1lbnUgY29kZS4gIFNlZSBjb250cm9scy9tZW51LmMuCi0gKiAgIFJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgc3VjY2VzcyAobm9uLXplcm8pIG9yIGZhaWx1cmUuCi0gKgotICogICBSZXZpc2lvbiBoaXN0b3J5Ci0gKiAgICAgICAgMDYtSnVsLTE5OTcgRGF2ZSBDdXRoYmVydCAoZGFjdXRAZWNlLmNtdS5lZHUpCi0gKiAgICAgICAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgIFRXRUFLX01lbnVJbml0KCkKLXsKLSAgICBNRU5VX0Jhckl0ZW1Ub3BOdWRnZSA9Ci0JUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiTWVudUJhckl0ZW1Ub3BOdWRnZSIsIDApOwotICAgIE1FTlVfQmFySXRlbUxlZnROdWRnZSA9Ci0JUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiTWVudUJhckl0ZW1MZWZ0TnVkZ2UiLCAwKTsKLSAgICBNRU5VX0l0ZW1Ub3BOdWRnZSA9Ci0JUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiTWVudUl0ZW1Ub3BOdWRnZSIsIDApOwotICAgIE1FTlVfSXRlbUxlZnROdWRnZSA9Ci0JUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiTWVudUl0ZW1MZWZ0TnVkZ2UiLCAwKTsKLSAgICBNRU5VX0hpZ2hsaWdodFRvcE51ZGdlID0KLQlQUk9GSUxFX0dldFdpbmVJbmlJbnQoIlR3ZWFrLkxheW91dCIsICJNZW51SGlnaGxpZ2h0VG9wTnVkZ2UiLCAwKTsKLSAgICBNRU5VX0hpZ2hsaWdodExlZnROdWRnZSA9Ci0JUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiTWVudUhpZ2hsaWdodExlZnROdWRnZSIsIDApOwotICAgIE1FTlVfSGlnaGxpZ2h0Qm90dG9tTnVkZ2UgPQotCVBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuTGF5b3V0IiwgIk1lbnVIaWdobGlnaHRCb3R0b21OdWRnZSIsIDApOwotICAgIE1FTlVfSGlnaGxpZ2h0UmlnaHROdWRnZSA9Ci0JUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiTWVudUhpZ2hsaWdodFJpZ2h0TnVkZ2UiLCAwKTsKLQotICAgIHJldHVybiAxOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgIGludCAgVFdFQUtfVmFySW5pdCgpCi0gKgotICogICBJbml0aWFsaXplcyB0aGUgbWlzY2VsbGFuZW91cyB2YXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIHR3ZWFrCi0gKiAgIHJvdXRpbmVzLiAgUmV0dXJuIHZhbHVlIGlzIG5vbi16ZXJvIG9uIHN1Y2Nlc3MuCi0gKgotICogICBSZXZpc2lvbiBoaXN0b3J5Ci0gKiAgICAgICAgMDctSnVsLTE5OTcgRGF2ZSBDdXRoYmVydCAoZGFjdXRAZWNlLmNtdS5lZHUpCi0gKiAgICAgICAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgIFRXRUFLX1ZhckluaXQoKQotewotICAgIFRXRUFLX1dpbjk1TG9vayA9IFBST0ZJTEVfR2V0V2luZUluaUJvb2woIlR3ZWFrLkxheW91dCIsICJXaW45NUxvb2siLCAwKTsKLQotICAgIFRSQUNFKHR3ZWFrLCAiVXNpbmcgJXMgbG9vayBhbmQgZmVlbC5cbiIsCi0JCSBUV0VBS19XaW45NUxvb2sgPyAiV2luOTUiIDogIldpbjMuMSIpOwotICAgIHJldHVybiAxOwotfQorV0lORV9MT09LIFRXRUFLX1dpbmVMb29rID0gV0lOMzFfTE9PSzsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjksMTMgKzQ5LDUwIEBACiAgKiAgIFJldmlzaW9uIGhpc3RvcnkKICAqICAgICAgICAwNS1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKICAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgorICogICAgICAgIDIyLVNlcC0xOTk4IEVyaWMgS29obCAoZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGUpCisgKiAgICAgICAgICAgICBSZW1vdmVkIHVudXNlZCBjb2RlIGFuZCBhZGRlZCBXaW45OCBvcHRpb24uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgIFRXRUFLX0luaXQoKQoraW50IFRXRUFLX0luaXQgKHZvaWQpCiB7Ci0gICAgVFdFQUtfVmFySW5pdCgpOwotICAgIFRXRUFLX01lbnVJbml0KCk7CisgICAgY2hhciBzekluaVN0cmluZ1s4MF07CisKKyAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcgKCJUd2Vhay5MYXlvdXQiLCAiV2luOTVMb29rIiwgIlRlc3RTdHJpbmciLAorCQkJICAgICAgc3pJbmlTdHJpbmcsIDgwKTsKKyAgICBpZiAoc3RybmNtcCAoc3pJbmlTdHJpbmcsICJUZXN0U3RyaW5nIiwgMTApKSB7CisJaWYgKFBST0ZJTEVfR2V0V2luZUluaUJvb2wgKCJUd2Vhay5MYXlvdXQiLCAiV2luOTVMb29rIiwgMCkpIHsKKwkgICAgVFdFQUtfV2luZUxvb2sgPSBXSU45NV9MT09LOworCSAgICBUUkFDRSAodHdlYWssICJVc2luZyBXaW45NSBsb29rIGFuZCBmZWVsLlxuIik7CisJfQorCWVsc2UgeworCSAgICBUV0VBS19XaW5lTG9vayA9IFdJTjMxX0xPT0s7CisJICAgIFRSQUNFICh0d2VhaywgIlVzaW5nIFdpbjMuMSBsb29rIGFuZCBmZWVsLlxuIik7CisJfQorCUVSUiAodHdlYWssCisJICAgICAiUmVwbGFjZSBcIldpbjk1TG9va1wiIGJ5IFwiV2luZUxvb2tcIiBpbiB5b3VyIFwid2luZS5pbmlcIiFcbiIpOworICAgIH0KKworICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyAoIlR3ZWFrLkxheW91dCIsICJXaW5lTG9vayIsICJXaW4zMSIsCisJCQkgICAgICBzekluaVN0cmluZywgODApOworCisgICAgaWYgKCFzdHJuY2FzZWNtcCAoc3pJbmlTdHJpbmcsICJXaW4zMSIsIDUpKSB7CisJVFdFQUtfV2luZUxvb2sgPSBXSU4zMV9MT09LOworCVRSQUNFICh0d2VhaywgIlVzaW5nIFdpbjMuMSBsb29rIGFuZCBmZWVsLlxuIik7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoc3pJbmlTdHJpbmcsICJXaW45NSIsIDUpKSB7CisJVFdFQUtfV2luZUxvb2sgPSBXSU45NV9MT09LOworCVRSQUNFICh0d2VhaywgIlVzaW5nIFdpbjk1IGxvb2sgYW5kIGZlZWwuXG4iKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzekluaVN0cmluZywgIldpbjk4IiwgNSkpIHsKKwlUV0VBS19XaW5lTG9vayA9IFdJTjk4X0xPT0s7CisJVFJBQ0UgKHR3ZWFrLCAiVXNpbmcgV2luOTggbG9vayBhbmQgZmVlbC5cbiIpOworICAgIH0KKyAgICBlbHNlIHsKKwlUV0VBS19XaW5lTG9vayA9IFdJTjMxX0xPT0s7CisJVFJBQ0UgKHR3ZWFrLCAiVXNpbmcgV2luMy4xIGxvb2sgYW5kIGZlZWwuXG4iKTsKKyAgICB9CisKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTU2LDI0NyArMTEzLDMgQEAKIHsKICAgICByZXR1cm4gMTsKIH0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFR3ZWFrIGdyYXBoaWMgc3Vic3lzdGVtLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgdm9pZCAgVFdFQUtfRHJhd1JlbGllZlJlY3Q5NSgKLSAqICAgICAgSERDMzIgIGhkYywgICAgICAgICAgICAgICAvLyBEZXZpY2UgY29udGV4dCBvbiB3aGljaCB0byBkcmF3Ci0gKiAgICAgIFJFQ1QzMiBjb25zdCAgKnJlY3QgKSAgICAgLy8gUmVjdGFuZ2xlIHRvIHVzZQotICoKLSAqICAgRHJhd3MgdGhlIGRvdWJsZS1ib3JkZXJlZCBXaW45NS1zdHlsZSByZWxpZWYgcmVjdGFuZ2xlLgotICoKLSAqICAgQnVncwotICogICAgICAgIFRoZXJlIGFyZSBzb21lIGNoZWNrcyBtaXNzaW5nIGZyb20gdGhpcyBmdW5jdGlvbi4gIFBlcmhhcHMgdGhlCi0gKiAgICAgICAgU2VsZWN0T2JqZWN0MzIgY2FsbHMgc2hvdWxkIGJlIGV4YW1pbmVkPyAgSGFzbid0IGZhaWxlZCBvbiBtZSAoeWV0KS4KLSAqCi0gKiAgICAgICAgU2hvdWxkIEkgcmVhbGx5IGJlIGNhbGxpbmcgWCBmdW5jdGlvbnMgZGlyZWN0bHkgZnJvbSBoZXJlPyAgSXQgaXMKLSAqICAgICAgICBhbiBvcHRpbWl6YXRpb24sIGJ1dCBzaG91bGQgSSBiZSBvcHRpbWl6aW5nIGFscGhhIGNvZGU/ICBQcm9iYWJseQotICogICAgICAgIG5vdC4KLSAqCi0gKiAgIFJldmlzaW9uIGhpc3RvcnkKLSAqICAgICAgICAwOC1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKLSAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAgVFdFQUtfRHJhd1JlbGllZlJlY3Q5NSgKLSAgICBIREMzMiAgaGRjLAotICAgIFJFQ1QzMiBjb25zdCAgKnJlY3QgKQotewotICAgIERDICAqZGM7Ci0gICAgSFBFTjMyICBwcmV2cGVuOwotCi0gICAgaWYoKGRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIERDX01BR0lDKSkpIHsKLQotCS8qIERyYXcgdGhlIHRvcC9sZWZ0IGxpbmVzIGZpcnN0ICovCi0JcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zRExJR0hUKSk7Ci0JRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAotCQkgIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+dG9wKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCi0JCSAgcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gMSk7Ci0KLQlTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfM0RISUdITElHSFQpKTsKLQlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0ICsgMSwKLQkJICByZWN0LT50b3AgKyAxLCByZWN0LT5yaWdodCAtIDIsIHJlY3QtPnRvcCArIDEpOwotCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQgKyAxLAotCQkgIHJlY3QtPnRvcCArIDEsIHJlY3QtPmxlZnQgKyAxLCByZWN0LT5ib3R0b20gLSAyKTsKLQotCi0JLyogTm93IHRoZSBib3R0b20vcmlnaHQgbGluZXMgKi8KLQlTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfM0RES1NIQURPVykpOwotCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQsCi0JCSAgcmVjdC0+Ym90dG9tIC0gMSwgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT5ib3R0b20gLSAxKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5yaWdodCAtIDEsCi0JCSAgcmVjdC0+dG9wLCByZWN0LT5yaWdodCAtIDEsIHJlY3QtPmJvdHRvbSAtIDEpOwotCi0JU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNEU0hBRE9XKSk7Ci0JRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCi0JCSAgcmVjdC0+Ym90dG9tIC0gMiwgcmVjdC0+cmlnaHQgLSAyLCByZWN0LT5ib3R0b20gLSAyKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5yaWdodCAtIDIsCi0JCSAgcmVjdC0+dG9wICsgMSwgcmVjdC0+cmlnaHQgLSAyLCByZWN0LT5ib3R0b20gLSAyKTsKLQkKLQlTZWxlY3RPYmplY3QzMihoZGMsIHByZXZwZW4pOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICB2b2lkICBUV0VBS19EcmF3UmV2UmVsaWVmUmVjdDk1KAotICogICAgICBIREMzMiAgaGRjLCAgICAgICAgICAgICAgIC8vIERldmljZSBjb250ZXh0IG9uIHdoaWNoIHRvIGRyYXcKLSAqICAgICAgUkVDVDMyIGNvbnN0ICAqcmVjdCApICAgICAvLyBSZWN0YW5nbGUgdG8gdXNlCi0gKgotICogICBEcmF3cyB0aGUgZG91YmxlLWJvcmRlcmVkIFdpbjk1LXN0eWxlIHJlbGllZiByZWN0YW5nbGUuCi0gKgotICogICBCdWdzCi0gKiAgICAgICAgVGhlcmUgYXJlIHNvbWUgY2hlY2tzIG1pc3NpbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLiAgUGVyaGFwcyB0aGUKLSAqICAgICAgICBTZWxlY3RPYmplY3QzMiBjYWxscyBzaG91bGQgYmUgZXhhbWluZWQ/ICBIYXNuJ3QgZmFpbGVkIG9uIG1lICh5ZXQpLgotICoKLSAqICAgICAgICBTaG91bGQgSSByZWFsbHkgYmUgY2FsbGluZyBYIGZ1bmN0aW9ucyBkaXJlY3RseSBmcm9tIGhlcmU/ICBJdCBpcwotICogICAgICAgIGFuIG9wdGltaXphdGlvbiwgYnV0IHNob3VsZCBJIGJlIG9wdGltaXppbmcgYWxwaGEgY29kZT8gIFByb2JhYmx5Ci0gKiAgICAgICAgbm90LgotICoKLSAqICAgUmV2aXNpb24gaGlzdG9yeQotICogICAgICAgIDA4LUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQotICogICAgICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICBUV0VBS19EcmF3UmV2UmVsaWVmUmVjdDk1KAotICAgIEhEQzMyICBoZGMsCi0gICAgUkVDVDMyIGNvbnN0ICAqcmVjdCApCi17Ci0gICAgREMgICpkYzsKLSAgICBIUEVOMzIgIHByZXZwZW47Ci0KLSAgICBpZigoZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgRENfTUFHSUMpKSkgewotCi0JLyogRHJhdyB0aGUgdG9wL2xlZnQgbGluZXMgZmlyc3QgKi8KLQlwcmV2cGVuID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNEU0hBRE9XKSk7Ci0JRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAotCQkgIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+dG9wKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCi0JCSAgcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gMSk7Ci0KLQlTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfM0RES1NIQURPVykpOwotCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQgKyAxLAotCQkgIHJlY3QtPnRvcCArIDEsIHJlY3QtPnJpZ2h0IC0gMiwgcmVjdC0+dG9wICsgMSk7Ci0JVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCi0JCSAgcmVjdC0+dG9wICsgMSwgcmVjdC0+bGVmdCArIDEsIHJlY3QtPmJvdHRvbSAtIDIpOwotCi0KLQkvKiBOb3cgdGhlIGJvdHRvbS9yaWdodCBsaW5lcyAqLwotCVNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zREhJR0hMSUdIVCkpOwotCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQsCi0JCSAgcmVjdC0+Ym90dG9tIC0gMSwgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT5ib3R0b20gLSAxKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5yaWdodCAtIDEsCi0JCSAgcmVjdC0+dG9wLCByZWN0LT5yaWdodCAtIDEsIHJlY3QtPmJvdHRvbSAtIDEpOwotCi0JU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNETElHSFQpKTsKLQlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0ICsgMSwKLQkJICByZWN0LT5ib3R0b20gLSAyLCByZWN0LT5yaWdodCAtIDIsIHJlY3QtPmJvdHRvbSAtIDIpOwotCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPnJpZ2h0IC0gMiwKLQkJICByZWN0LT50b3AgKyAxLCByZWN0LT5yaWdodCAtIDIsIHJlY3QtPmJvdHRvbSAtIDIpOwotCQotCVNlbGVjdE9iamVjdDMyKGhkYywgcHJldnBlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgdm9pZCAgVFdFQUtfRHJhd01lbnVTZXBhcmF0b3JIb3Jpejk1KAotICogICAgICBIREMzMiAgaGRjLCAgICAgICAgICAgICAgIC8vIERldmljZSBjb250ZXh0IG9uIHdoaWNoIHRvIGRyYXcKLSAqICAgICAgVUlOVDMyICB4YzEsICAgICAgICAgICAgICAvLyBMZWZ0IHgtY29vcmRpbmF0ZQotICogICAgICBVSU5UMzIgIHljLCAgICAgICAgICAgICAgIC8vIFktY29vcmRpbmF0ZSBvZiB0aGUgTE9XRVIgbGluZQotICogICAgICBVSU5UMzIgIHhjMiApICAgICAgICAgICAgIC8vIFJpZ2h0IHgtY29vcmRpbmF0ZQotICoKLSAqICAgRHJhd3MgYSBob3Jpem9udGFsIG1lbnUgc2VwYXJhdG9yIGJhciBXaW4gOTUgc3R5bGUuCi0gKgotICogICBCdWdzCi0gKiAgICAgICAgU2FtZSBhcyB0aG9zZSBmb3IgRHJhd1JlbGllZlJlY3Q5NS4KLSAqCi0gKiAgIFJldmlzaW9uIGhpc3RvcnkKLSAqICAgICAgICAwOC1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKLSAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgotICogICAgICAgIDExLUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQotICogICAgICAgICAgICAgQ2hhbmdlZCBuYW1lIGZyb20gRHJhd01lbnVTZXBhcmF0b3I5NQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAgVFdFQUtfRHJhd01lbnVTZXBhcmF0b3JIb3Jpejk1KAotICAgIEhEQzMyICBoZGMsCi0gICAgVUlOVDMyICB4YzEsCi0gICAgVUlOVDMyICB5YywKLSAgICBVSU5UMzIgIHhjMiApCi17Ci0gICAgREMgICpkYzsKLSAgICBIUEVOMzIgIHByZXZwZW47Ci0KLSAgICBpZigoZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgRENfTUFHSUMpKSkgewotCi0JLyogRHJhdyB0aGUgdG9wIGxpbmUgKi8KLQlwcmV2cGVuID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNEU0hBRE9XKSk7Ci0JRENfU2V0dXBHQ0ZvclBlbihkYyk7Ci0JVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgeGMxLCB5YyAtIDEsIHhjMiwKLQkJICB5YyAtIDEpOwotCi0JLyogQW5kIHRoZSBib3R0b20gbGluZSAqLwotCVNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zREhJR0hMSUdIVCkpOwotCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHhjMSwgeWMsIHhjMiwgeWMpOwotCi0JU2VsZWN0T2JqZWN0MzIoaGRjLCBwcmV2cGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgdm9pZCAgVFdFQUtfRHJhd01lbnVTZXBhcmF0b3JWZXJ0OTUoCi0gKiAgICAgIEhEQzMyICBoZGMsICAgICAgICAgICAgICAgLy8gRGV2aWNlIGNvbnRleHQgb24gd2hpY2ggdG8gZHJhdwotICogICAgICBVSU5UMzIgIHhjLCAgICAgICAgICAgICAgIC8vIFgtY29vcmRpbmF0ZSBvZiB0aGUgUklHSFQgbGluZQotICogICAgICBVSU5UMzIgIHljMSwgICAgICAgICAgICAgIC8vIHRvcCBZLWNvb3JkaW5hdGUKLSAqICAgICAgVUlOVDMyICB5YzIgKSAgICAgICAgICAgICAvLyBib3R0b20gWS1jb29yZGluYXRlCi0gKgotICogICBEcmF3cyBhIHZlcnRpY2FsIG1lbnUgc2VwYXJhdG9yIGJhciBXaW4gOTUgc3R5bGUuCi0gKgotICogICBCdWdzCi0gKiAgICAgICAgU2FtZSBhcyB0aG9zZSBmb3IgRHJhd1JlbGllZlJlY3Q5NS4KLSAqCi0gKiAgIFJldmlzaW9uIGhpc3RvcnkKLSAqICAgICAgICAxMS1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKLSAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAgVFdFQUtfRHJhd01lbnVTZXBhcmF0b3JWZXJ0OTUoCi0gICAgSERDMzIgIGhkYywKLSAgICBVSU5UMzIgIHhjLAotICAgIFVJTlQzMiAgeWMxLAotICAgIFVJTlQzMiAgeWMyICkKLXsKLSAgICBEQyAgKmRjOwotICAgIEhQRU4zMiAgcHJldnBlbjsKLQotICAgIGlmKChkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQykpKSB7Ci0KLQkvKiBEcmF3IHRoZSB0b3AgbGluZSAqLwotCXByZXZwZW4gPSBTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfM0RTSEFET1cpKTsKLQlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKLQlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4YywgeWMxLCB4YywKLQkJICB5YzIpOwotCi0JLyogQW5kIHRoZSBib3R0b20gbGluZSAqLwotCVNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zREhJR0hMSUdIVCkpOwotCURDX1NldHVwR0NGb3JQZW4oZGMpOwotCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHhjICsgMSwgeWMxLCB4YyArIDEsCi0JCSAgeWMyKTsKLQotCVNlbGVjdE9iamVjdDMyKGhkYywgcHJldnBlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvbWlzYy92ZXJzaW9uLmMgYi9taXNjL3ZlcnNpb24uYwppbmRleCAxODE1ODhmLi40NWMxNDg2IDEwMDY0NAotLS0gYS9taXNjL3ZlcnNpb24uYworKysgYi9taXNjL3ZlcnNpb24uYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKICAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgorICogQ29weXJpZ2h0IDE5OTggUGF0cmlrIFN0cmlkdmFsbAogICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTEyLDE1ICsxMyw3IEBACiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAib2xlLmgiCi0KLXR5cGVkZWYgZW51bQotewotICAgIFdJTjMxLCAvKiBXaW5kb3dzIDMuMSAqLwotICAgIFdJTjk1LCAvKiBXaW5kb3dzIDk1ICovCi0gICAgTlQzNTEsIC8qIFdpbmRvd3MgTlQgMy41MSAqLwotICAgIE5UNDAsICAvKiBXaW5kb3dzIE5UIDQuMCAqLwotICAgIE5CX1ZFUlNJT05TCi19IFZFUlNJT047CisjaW5jbHVkZSAid2ludmVyc2lvbi5oIgogCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMzEsNyArMjQsNyBAQAogCiAKIC8qIEZJWE1FOiBjb21wYXJlIHZhbHVlcyBiZWxvdyB3aXRoIG9yaWdpbmFsIGFuZCBmaXggKi8KLXN0YXRpYyBjb25zdCBWRVJTSU9OX0RBVEEgVmVyc2lvbkRhdGFbTkJfVkVSU0lPTlNdID0KK3N0YXRpYyBjb25zdCBWRVJTSU9OX0RBVEEgVmVyc2lvbkRhdGFbTkJfV0lORE9XU19WRVJTSU9OU10gPQogewogICAgIC8qIFdJTjMxICovCiAgICAgewpAQCAtNzEsNyArNjQsNyBAQAogICAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpWZXJzaW9uTmFtZXNbTkJfVkVSU0lPTlNdID0KK3N0YXRpYyBjb25zdCBjaGFyICpWZXJzaW9uTmFtZXNbTkJfV0lORE9XU19WRVJTSU9OU10gPQogewogICAgICJ3aW4zMSIsCiAgICAgIndpbjk1IiwKQEAgLTgxLDcgKzc0LDcgQEAKIAogLyogdGhlIGN1cnJlbnQgdmVyc2lvbiBoYXMgbm90IGJlZW4gYXV0b2RldGVjdGVkIGJ1dCBmb3JjZWQgdmlhIGNtZGxpbmUgKi8KIHN0YXRpYyBCT09MMzIgdmVyc2lvbkZvcmNlZCA9IEZBTFNFOwotc3RhdGljIFZFUlNJT04gZGVmYXVsdFZlcnNpb24gPSBXSU4zMTsKK3N0YXRpYyBXSU5ET1dTX1ZFUlNJT04gZGVmYXVsdFZlcnNpb24gPSBXSU4zMTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTAsMjcgKzgzLDI3IEBACiB2b2lkIFZFUlNJT05fUGFyc2VWZXJzaW9uKCBjaGFyICphcmcgKQogewogICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOQl9WRVJTSU9OUzsgaSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCBOQl9XSU5ET1dTX1ZFUlNJT05TOyBpKyspCiAgICAgewogICAgICAgICBpZiAoIXN0cmNtcCggVmVyc2lvbk5hbWVzW2ldLCBhcmcgKSkKICAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdFZlcnNpb24gPSAoVkVSU0lPTilpOworICAgICAgICAgICAgZGVmYXVsdFZlcnNpb24gPSAoV0lORE9XU19WRVJTSU9OKWk7CiAgICAgICAgICAgICB2ZXJzaW9uRm9yY2VkID0gVFJVRTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KICAgICBNU0coIkludmFsaWQgd2ludmVyIHZhbHVlICclcycgc3BlY2lmaWVkLlxuIiwgYXJnICk7CiAgICAgTVNHKCJWYWxpZCB2ZXJzaW9ucyBhcmU6IiApOwotICAgIGZvciAoaSA9IDA7IGkgPCBOQl9WRVJTSU9OUzsgaSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCBOQl9XSU5ET1dTX1ZFUlNJT05TOyBpKyspCiAgICAgICAgIE1TRygiICclcyclYyIsIFZlcnNpb25OYW1lc1tpXSwKLQkgICAgKGkgPT0gTkJfVkVSU0lPTlMgLSAxKSA/ICdcbicgOiAnLCcgKTsKKwkgICAgKGkgPT0gTkJfV0lORE9XU19WRVJTSU9OUyAtIDEpID8gJ1xuJyA6ICcsJyApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFZFUlNJT05fZ2V0X3ZlcnNpb24KKyAqICAgICAgICAgVkVSU0lPTl9HZXRWZXJzaW9uCiAgKi8KLXN0YXRpYyBWRVJTSU9OIFZFUlNJT05fR2V0VmVyc2lvbih2b2lkKQorV0lORE9XU19WRVJTSU9OIFZFUlNJT05fR2V0VmVyc2lvbih2b2lkKQogewogICAgIExQSU1BR0VfTlRfSEVBREVSUyBwZWhlYWRlcjsJCiAKQEAgLTE0MywxMiArMTM2LDM0IEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgVkVSU0lPTl9HZXRWZXJzaW9uTmFtZQorICovCitjaGFyICpWRVJTSU9OX0dldFZlcnNpb25OYW1lKCkKK3sKKyAgV0lORE9XU19WRVJTSU9OIHZlciA9IFZFUlNJT05fR2V0VmVyc2lvbigpOworICBzd2l0Y2godmVyKQorICAgIHsKKyAgICBjYXNlIFdJTjMxOgorICAgICAgcmV0dXJuICJXaW5kb3dzIDMuMSI7CisgICAgY2FzZSBXSU45NTogIAorICAgICAgcmV0dXJuICJXaW5kb3dzIDk1IjsKKyAgICBjYXNlIE5UMzUxOgorICAgICAgcmV0dXJuICJXaW5kb3dzIE5UIDMuNTEiOworICAgIGNhc2UgTlQ0MDoKKyAgICAgIHJldHVybiAiV2luZG93cyBOVCA0LjAiOworICAgIGRlZmF1bHQ6CisgICAgICBGSVhNRSh2ZXIsIldpbmRvd3MgdmVyc2lvbiAlZCBub3QgbmFtZWQiLHZlcik7CisgICAgICByZXR1cm4gIldpbmRvd3MgPFVua25vd24+IjsKKyAgICB9Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBHZXRWZXJzaW9uMTYgICAoS0VSTkVMLjMpCiAgKi8KIExPTkcgV0lOQVBJIEdldFZlcnNpb24xNih2b2lkKQogewotICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgV0lORE9XU19WRVJTSU9OIHZlciA9IFZFUlNJT05fR2V0VmVyc2lvbigpOwogICAgIHJldHVybiBWZXJzaW9uRGF0YVt2ZXJdLmdldFZlcnNpb24xNjsKIH0KIApAQCAtMTU4LDcgKzE3Myw3IEBACiAgKi8KIExPTkcgV0lOQVBJIEdldFZlcnNpb24zMih2b2lkKQogewotICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgV0lORE9XU19WRVJTSU9OIHZlciA9IFZFUlNJT05fR2V0VmVyc2lvbigpOwogICAgIHJldHVybiBWZXJzaW9uRGF0YVt2ZXJdLmdldFZlcnNpb24zMjsKIH0KIApAQCAtMTY4LDcgKzE4Myw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgR2V0VmVyc2lvbkV4MTYoT1NWRVJTSU9OSU5GTzE2ICp2KQogewotICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgV0lORE9XU19WRVJTSU9OIHZlciA9IFZFUlNJT05fR2V0VmVyc2lvbigpOwogICAgIGlmICh2LT5kd09TVmVyc2lvbkluZm9TaXplICE9IHNpemVvZihPU1ZFUlNJT05JTkZPMTYpKQogICAgIHsKICAgICAgICAgV0FSTih2ZXIsIndyb25nIE9TVkVSU0lPTklORk8gc2l6ZSBmcm9tIGFwcCIpOwpAQCAtMTg4LDcgKzIwMyw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0VmVyc2lvbkV4MzJBKE9TVkVSU0lPTklORk8zMkEgKnYpCiB7Ci0gICAgVkVSU0lPTiB2ZXIgPSBWRVJTSU9OX0dldFZlcnNpb24oKTsKKyAgICBXSU5ET1dTX1ZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CiAgICAgaWYgKHYtPmR3T1NWZXJzaW9uSW5mb1NpemUgIT0gc2l6ZW9mKE9TVkVSU0lPTklORk8zMkEpKQogICAgIHsKICAgICAgICAgV0FSTih2ZXIsIndyb25nIE9TVkVSU0lPTklORk8gc2l6ZSBmcm9tIGFwcCIpOwpAQCAtMjA4LDcgKzIyMyw4IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0VmVyc2lvbkV4MzJXKE9TVkVSU0lPTklORk8zMlcgKnYpCiB7Ci0gICAgVkVSU0lPTiB2ZXIgPSBWRVJTSU9OX0dldFZlcnNpb24oKTsKKyAgICBXSU5ET1dTX1ZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisKICAgICBpZiAodi0+ZHdPU1ZlcnNpb25JbmZvU2l6ZSE9c2l6ZW9mKE9TVkVSU0lPTklORk8zMlcpKQogICAgIHsKICAgICAgICAgV0FSTih2ZXIsIndyb25nIE9TVkVSU0lPTklORk8gc2l6ZSBmcm9tIGFwcCIpOwpAQCAtMzE5LDcgKzMzNSw3IEBACiB2b2lkIFdJTkFQSSBEaWFnT3V0cHV0KExQQ1NUUiBzdHIpCiB7CiAgICAgICAgIC8qIEZJWE1FICovCi0JRFBSSU5URigiRElBR09VVFBVVDolc1xuIixzdHIpOworCURQUklOVEYoIkRJQUdPVVRQVVQ6JXNcbiIsIGRlYnVnc3RyX2Eoc3RyKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzI3LDcgKzM0Myw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgT2FCdWlsZFZlcnNpb24oKQogewotICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgV0lORE9XU19WRVJTSU9OIHZlciA9IFZFUlNJT05fR2V0VmVyc2lvbigpOwogCiAgICAgc3dpdGNoKFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbjMyKQogICAgIHsKZGlmZiAtLWdpdCBhL21pc2Mvd2luc29jay5jIGIvbWlzYy93aW5zb2NrLmMKaW5kZXggYjMyODc5NC4uMGZiOGExYSAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrLmMKKysrIGIvbWlzYy93aW5zb2NrLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCmRpZmYgLS1naXQgYS9taXNjZW11L2luc3RyLmMgYi9taXNjZW11L2luc3RyLmMKaW5kZXggNDFlYWE1Yi4uOTFkNDJiNSAxMDA2NDQKLS0tIGEvbWlzY2VtdS9pbnN0ci5jCisrKyBiL21pc2NlbXUvaW5zdHIuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgInNpZ19jb250ZXh0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTI5NSw2ICsyOTYsNyBAQAogQk9PTDMyIElOU1RSX0VtdWxhdGVJbnN0cnVjdGlvbiggU0lHQ09OVEVYVCAqY29udGV4dCApCiB7CiAgICAgaW50IHByZWZpeCwgc2VncHJlZml4LCBwcmVmaXhsZW4sIGxlbiwgcmVwWCwgbG9uZ19vcCwgbG9uZ19hZGRyOworICAgIFNFR1BUUiBncEhhbmRsZXI7CiAgICAgQllURSAqaW5zdHI7CiAKICAgICAvKiBDaGVjayBmb3IgcGFnZS1mYXVsdCAqLwpAQCAtNTczLDcgKzU3NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRkFSUFJPQzE2IGFkZHIgPSBJTlRfR2V0SGFuZGxlciggaW5zdHJbMV0gKTsKKyAgICAgICAgICAgICAgICBGQVJQUk9DMTYgYWRkciA9IElOVF9HZXRQTUhhbmRsZXIoIGluc3RyWzFdICk7CiAgICAgICAgICAgICAgICAgV09SRCAqc3RhY2sgPSAoV09SRCAqKVNUQUNLX1BUUiggY29udGV4dCApOwogICAgICAgICAgICAgICAgIC8qIFB1c2ggdGhlIGZsYWdzIGFuZCByZXR1cm4gYWRkcmVzcyBvbiB0aGUgc3RhY2sgKi8KICAgICAgICAgICAgICAgICAqKC0tc3RhY2spID0gRkxfc2lnKGNvbnRleHQpOwpAQCAtNjU3LDYgKzY1OSwyMyBAQAogICAJICAgIEVJUF9zaWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMTsKICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KKworCisgICAgLyogQ2hlY2sgZm9yIFdpbjE2IF9fR1AgaGFuZGxlciAqLworICAgIGdwSGFuZGxlciA9IEhhc0dQSGFuZGxlciggUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBDU19zaWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJUF9zaWcoY29udGV4dCkgKSApOworICAgIGlmIChncEhhbmRsZXIpCisgICAgeworICAgICAgICBXT1JEICpzdGFjayA9IChXT1JEICopU1RBQ0tfUFRSKCBjb250ZXh0ICk7CisgICAgICAgICotLXN0YWNrID0gQ1Nfc2lnKGNvbnRleHQpOworICAgICAgICAqLS1zdGFjayA9IEVJUF9zaWcoY29udGV4dCk7CisgICAgICAgIFNUQUNLX3NpZyhjb250ZXh0KSAtPSAyKnNpemVvZihXT1JEKTsKKworICAgICAgICBDU19zaWcoY29udGV4dCkgPSBTRUxFQ1RPUk9GKCBncEhhbmRsZXIgKTsKKyAgICAgICAgRUlQX3NpZyhjb250ZXh0KSA9IE9GRlNFVE9GKCBncEhhbmRsZXIgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCiAgICAgTVNHKCJVbmV4cGVjdGVkIFdpbmRvd3MgcHJvZ3JhbSBzZWdmYXVsdCIKICAgICAgICAgICAgICAgICAgICAgIiAtIG9wY29kZSA9ICV4XG4iLCAqaW5zdHIpOwogICAgIHJldHVybiBGQUxTRTsgIC8qIFVuYWJsZSB0byBlbXVsYXRlIGl0ICovCmRpZmYgLS1naXQgYS9tc2Rvcy9kb3NtZW0uYyBiL21zZG9zL2Rvc21lbS5jCmluZGV4IDg1ZWU5NGQuLjI2N2I2YTQgMTAwNjQ0Ci0tLSBhL21zZG9zL2Rvc21lbS5jCisrKyBiL21zZG9zL2Rvc21lbS5jCkBAIC0xMDIsMTMgKzEwMiwxMyBAQAogICB1bnNpZ25lZCAgICAgIGZyZWU7CiB9IGRvc21lbV9pbmZvOwogCi1zdGF0aWMgZG9zbWVtX2VudHJ5KiAJcm9vdF9ibG9jayA9IE5VTEw7Ci1zdGF0aWMgZG9zbWVtX2luZm8qCWluZm9fYmxvY2sgPSBOVUxMOwotCiAjZGVmaW5lIE5FWFRfQkxPQ0soYmxvY2spIFwKICAgICAgICAgKGRvc21lbV9lbnRyeSopKCgoY2hhciopKGJsb2NrKSkgKyBcCiAJIHNpemVvZihkb3NtZW1fZW50cnkpICsgKChibG9jayktPnNpemUgJiBETV9CTE9DS19NQVNLKSkKIAorI2RlZmluZSBWTV9TVFVCKHgpICgweDkwQ0YwMENEfCh4PDw4KSkgLyogSU5UIHg7IElSRVQ7IE5PUCAqLworI2RlZmluZSBWTV9TVFVCX1NFR01FTlQgMHhmMDAwICAgICAgICAgLyogQklPUyBzZWdtZW50ICovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERPU01FTV9NZW1vcnlCYXNlCiAgKgpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgZWxzZQogICAgICAgICByZXR1cm4gRE9TTUVNX2Rvc21lbTsKIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBET1NNRU1fTWVtb3J5VG9wCiAgKgpAQCAtMTM1LDcgKzEzNSw1MSBAQAogewogICAgIHJldHVybiBET1NNRU1fTWVtb3J5QmFzZShoTW9kdWxlKSsweDlGRkZDOyAvKiA2NDBLICovCiB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRE9TTUVNX0luZm9CbG9jaworICoKKyAqIEdldHMgdGhlIERPUyBtZW1vcnkgaW5mbyBibG9jay4KKyAqLworc3RhdGljIGRvc21lbV9pbmZvICpET1NNRU1fSW5mb0Jsb2NrKEhNT0RVTEUxNiBoTW9kdWxlKQoreworICAgIHJldHVybiAoZG9zbWVtX2luZm8qKShET1NNRU1fTWVtb3J5QmFzZShoTW9kdWxlKSsweDEwMDAwKTsgLyogNjRLICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERPU01FTV9Sb290QmxvY2sKKyAqCisgKiBHZXRzIHRoZSBET1MgbWVtb3J5IHJvb3QgYmxvY2suCisgKi8KK3N0YXRpYyBkb3NtZW1fZW50cnkgKkRPU01FTV9Sb290QmxvY2soSE1PRFVMRTE2IGhNb2R1bGUpCit7CisgICAgLyogZmlyc3QgYmxvY2sgaGFzIHRvIGJlIHBhcmFncmFwaC1hbGlnbmVkICovCisgICAgcmV0dXJuIChkb3NtZW1fZW50cnkqKSgoKGNoYXIqKURPU01FTV9JbmZvQmxvY2soaE1vZHVsZSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChzaXplb2YoZG9zbWVtX2luZm8pICsgMHhmKSAmIH4weGYpIC0gc2l6ZW9mKGRvc21lbV9lbnRyeSkpKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERPU01FTV9GaWxsSXNyVGFibGUKKyAqCisgKiBGaWxsIHRoZSBpbnRlcnJ1cHQgdGFibGUgd2l0aCBmYWtlIEJJT1MgY2FsbHMgdG8gQklPU1NFRyAoMHhmMDAwKS4KKyAqCisgKiBOT1RFUzoKKyAqIExpbnV4IG5vcm1hbGx5IG9ubHkgdHJhcHMgSU5UcyBwZXJmb3JtZWQgZnJvbSBvciBkZXN0aW5lZCB0byBCSU9TU0VHCisgKiBmb3IgdXMgdG8gaGFuZGxlLCBpZiB0aGUgaW50X3JldmVjdG9yZWQgdGFibGUgaXMgZW1wdHkuIEZpbGxpbmcgdGhlCisgKiBpbnRlcnJ1cHQgdGFibGUgd2l0aCBjYWxscyB0byBJTlQgc3R1YnMgaW4gQklPU1NFRyBhbGxvd3MgRE9TIHByb2dyYW1zCisgKiB0byBob29rIGludGVycnVwdHMsIGFzIHdlbGwgYXMgdXNlIHRoZWlyIGZhbWlsaWFyIHJldGYgdHJpY2tzIHRvIGNhbGwKKyAqIHRoZW0sIEFORCBsZXQgV2luZSBoYW5kbGUgYW55IHVuaG9va2VkIGludGVycnVwdHMgdHJhbnNwYXJlbnRseS4KKyAqLworc3RhdGljIHZvaWQgRE9TTUVNX0ZpbGxJc3JUYWJsZShITU9EVUxFMTYgaE1vZHVsZSkKK3sKKyAgICBTRUdQVFIgKmlzciA9IChTRUdQVFIqKURPU01FTV9NZW1vcnlCYXNlKGhNb2R1bGUpOworICAgIERXT1JEICpzdHViID0gKERXT1JEKikoKGNoYXIqKWlzciArIChWTV9TVFVCX1NFR01FTlQgPDwgNCkpOworICAgIGludCB4OworIAorICAgIGZvciAoeD0wOyB4PDI1NjsgeCsrKSBpc3JbeF09UFRSX1NFR19PRkZfVE9fU0VHUFRSKFZNX1NUVUJfU0VHTUVOVCx4KjQpOworICAgIGZvciAoeD0wOyB4PDI1NjsgeCsrKSBzdHViW3hdPVZNX1NUVUIoeCk7Cit9IAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBET1NNRU1fRmlsbEJpb3NTZWdtZW50CiAgKgpAQCAtMjUyLDE2ICsyOTYsMTAgQEAKICAgIC8qIExvdyA2NEtiIGFyZSByZXNlcnZlZCBmb3IgRE9TL0JJT1Mgc28gdGhlIHVzZWFibGUgYXJlYSBzdGFydHMgYXQKICAgICAqIDEwMDA6MDAwMCBhbmQgZW5kcyBhdCA5RkZGOkZGRUYuICovCiAKLSAgICBjaGFyKiAgICAgICAgICAgICAgIGRvc21lbSA9IERPU01FTV9NZW1vcnlCYXNlKGhNb2R1bGUpOworICAgIGRvc21lbV9pbmZvKiAgICAgICAgaW5mb19ibG9jayA9IERPU01FTV9JbmZvQmxvY2soaE1vZHVsZSk7CisgICAgZG9zbWVtX2VudHJ5KiAgICAgICByb290X2Jsb2NrID0gRE9TTUVNX1Jvb3RCbG9jayhoTW9kdWxlKTsKICAgICBkb3NtZW1fZW50cnkqICAgICAgIGRtOwogCi0gICAgLyogRklYTUU6IHRoZXNlIHN0YXRpYyB2YXJpYWJsZXMgY2FuJ3QgY29wZSB3aXRoIHNldmVyYWwgRE9TIGhlYXBzICovCi0gICAgaW5mb19ibG9jayA9IChkb3NtZW1faW5mbyopKCBkb3NtZW0gKyAweDEwMDAwICk7Ci0KLSAgICAvKiBmaXJzdCBibG9jayBoYXMgdG8gYmUgcGFyYWdyYXBoLWFsaWduZWQgcmVsYXRpdmUgdG8gdGhlIERPU01FTV9kb3NtZW0gKi8KLQotICAgIHJvb3RfYmxvY2sgPSAoZG9zbWVtX2VudHJ5KikoIGRvc21lbSArIDB4MTAwMDAgKwotICAgICAgICAgICAgICAgICAoKCgoc2l6ZW9mKGRvc21lbV9pbmZvKSArIDB4ZikgJiB+MHhmKSAtIHNpemVvZihkb3NtZW1fZW50cnkpKSkpOwogICAgIHJvb3RfYmxvY2stPnNpemUgPSBET1NNRU1fTWVtb3J5VG9wKGhNb2R1bGUpIC0gKCgoY2hhciopcm9vdF9ibG9jaykgKyBzaXplb2YoZG9zbWVtX2VudHJ5KSk7CiAKICAgICBpbmZvX2Jsb2NrLT5ibG9ja3MgPSAwOwpAQCAtMjk5LDEzICszMzcsMjIgQEAKICAgICAgICAgfQogICAgICAgICBET1NNRU1fQmlvc1NlZyA9IEdMT0JBTF9DcmVhdGVCbG9jayhHTUVNX0ZJWEVELERPU01FTV9kb3NtZW0rMHg0MDAsMHgxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApOworICAgICAgICBET1NNRU1fRmlsbElzclRhYmxlKDApOwogICAgICAgICBET1NNRU1fRmlsbEJpb3NTZWdtZW50KCk7CiAgICAgICAgIERPU01FTV9Jbml0TWVtb3J5KDApOwogICAgICAgICBET1NNRU1fSW5pdENvbGxhdGVUYWJsZSgpOwogICAgICAgICBET1NNRU1fSW5pdEVycm9yVGFibGUoKTsKICAgICB9CiAgICAgZWxzZQorICAgIHsKKyNpZiAwCisgICAgICAgIERPU01FTV9GaWxsSXNyVGFibGUoaE1vZHVsZSk7CiAgICAgICAgIERPU01FTV9Jbml0TWVtb3J5KGhNb2R1bGUpOworI2Vsc2UKKyAgICAgICAgLyogYm9vdHN0cmFwIHRoZSBuZXcgVjg2IHRhc2sgd2l0aCBhIGNvcHkgb2YgdGhlICJzeXN0ZW0iIG1lbW9yeSAqLworICAgICAgICBtZW1jcHkoRE9TTUVNX01lbW9yeUJhc2UoaE1vZHVsZSksIERPU01FTV9kb3NtZW0sIDB4MTAwMDAwKTsKKyNlbmRpZgorICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMzI5LDEzICszNzYsMTQgQEAKIHsKICAgIFVJTlQzMiAgCSBibG9ja3NpemU7CiAgICBjaGFyICAgICAgICAgKmJsb2NrID0gTlVMTDsKKyAgIGRvc21lbV9pbmZvICAqaW5mb19ibG9jayA9IERPU01FTV9JbmZvQmxvY2soaE1vZHVsZSk7CiAgICBkb3NtZW1fZW50cnkgKmRtOwogI2lmZGVmIF9fRE9TTUVNX0RFQlVHXwogICAgZG9zbWVtX2VudHJ5ICpwcmV2ID0gTlVMTDsKICNlbmRpZgogIAogICAgaWYoIHNpemUgPiBpbmZvX2Jsb2NrLT5mcmVlICkgcmV0dXJuIE5VTEw7Ci0gICBkbSA9IHJvb3RfYmxvY2s7CisgICBkbSA9IERPU01FTV9Sb290QmxvY2soaE1vZHVsZSk7CiAKICAgIHdoaWxlIChkbSAmJiBkbS0+c2l6ZSAhPSBETV9CTE9DS19URVJNSU5BTCkKICAgIHsKQEAgLTM5OSw3ICs0NDcsOSBAQAogICovCiBCT09MMzIgRE9TTUVNX0ZyZWVCbG9jayhITU9EVUxFMTYgaE1vZHVsZSwgdm9pZCogcHRyKQogewotICAgaWYoIHB0ciA+PSAodm9pZCopKCgoY2hhciopcm9vdF9ibG9jaykgKyBzaXplb2YoZG9zbWVtX2VudHJ5KSkgJiYKKyAgIGRvc21lbV9pbmZvICAqaW5mb19ibG9jayA9IERPU01FTV9JbmZvQmxvY2soaE1vZHVsZSk7CisKKyAgIGlmKCBwdHIgPj0gKHZvaWQqKSgoKGNoYXIqKURPU01FTV9Sb290QmxvY2soaE1vZHVsZSkpICsgc2l6ZW9mKGRvc21lbV9lbnRyeSkpICYmCiAgICAgICAgcHRyIDwgKHZvaWQqKURPU01FTV9NZW1vcnlUb3AoaE1vZHVsZSkgJiYgISgoKChjaGFyKilwdHIpCiAgICAgICAgICAgICAgICAgICAtIERPU01FTV9NZW1vcnlCYXNlKGhNb2R1bGUpKSAmIDB4ZikgKQogICAgewpAQCAtNDI3LDggKzQ3Nyw5IEBACiBMUFZPSUQgRE9TTUVNX1Jlc2l6ZUJsb2NrKEhNT0RVTEUxNiBoTW9kdWxlLCB2b2lkKiBwdHIsIFVJTlQzMiBzaXplLCBVSU5UMTYqIHBzZWcpCiB7CiAgICBjaGFyICAgICAgICAgKmJsb2NrID0gTlVMTDsKKyAgIGRvc21lbV9pbmZvICAqaW5mb19ibG9jayA9IERPU01FTV9JbmZvQmxvY2soaE1vZHVsZSk7CiAKLSAgIGlmKCBwdHIgPj0gKHZvaWQqKSgoKGNoYXIqKXJvb3RfYmxvY2spICsgc2l6ZW9mKGRvc21lbV9lbnRyeSkpICYmCisgICBpZiggcHRyID49ICh2b2lkKikoKChjaGFyKilET1NNRU1fUm9vdEJsb2NrKGhNb2R1bGUpKSArIHNpemVvZihkb3NtZW1fZW50cnkpKSAmJgogICAgICAgIHB0ciA8ICh2b2lkKilET1NNRU1fTWVtb3J5VG9wKGhNb2R1bGUpICYmICEoKCgoY2hhciopcHRyKQogICAgICAgICAgICAgICAgICAgLSBET1NNRU1fTWVtb3J5QmFzZShoTW9kdWxlKSkgJiAweGYpICkKICAgIHsKQEAgLTQ5MSw3ICs1NDIsNyBAQAogICAgVUlOVDMyICAJIGJsb2Nrc2l6ZSwgYXZhaWxhYmxlID0gMDsKICAgIGRvc21lbV9lbnRyeSAqZG07CiAgICAKLSAgIGRtID0gcm9vdF9ibG9jazsKKyAgIGRtID0gRE9TTUVNX1Jvb3RCbG9jayhoTW9kdWxlKTsKIAogICAgd2hpbGUgKGRtICYmIGRtLT5zaXplICE9IERNX0JMT0NLX1RFUk1JTkFMKQogICAgewpkaWZmIC0tZ2l0IGEvbXNkb3MvZHBtaS5jIGIvbXNkb3MvZHBtaS5jCmluZGV4IDQ4YWU3NTYuLjY2ZmI1YmIgMTAwNjQ0Ci0tLSBhL21zZG9zL2RwbWkuYworKysgYi9tc2Rvcy9kcG1pLmMKQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKICNpbmNsdWRlICJtc2Rvcy5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJkb3NleGUuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCkBAIC0xODksNyArMTkxLDcgQEAKICAgICBJTlRfR2V0UmVhbE1vZGVDb250ZXh0KCBjYWxsLCAmcmVhbG1vZGVfY3R4ICk7CiAKICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsKLSAgICBpZiAoSU5UX1JlYWxNb2RlSW50ZXJydXB0KCBCTF9yZWcoY29udGV4dCksIGNvbnRleHQgKSkKKyAgICBpZiAoSU5UX1JlYWxNb2RlSW50ZXJydXB0KCBCTF9yZWcoY29udGV4dCksICZyZWFsbW9kZV9jdHggKSkKICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICBpZiAoRUZMX3JlZyhjb250ZXh0KSYxKSB7CiAgICAgICBGSVhNRShpbnQzMSwiJTAyeDogRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4XG4iLApAQCAtMzI2LDYgKzMyOCw0NCBAQAogICAgIH0KIH0KIAorI2lmZGVmIE1aX1NVUFBPUlRFRAorLyogKHNlZSBsb2FkZXIvZG9zL21vZHVsZS5jLCBmdW5jdGlvbiBNWl9Jbml0RFBNSSkgKi8KKworc3RhdGljIHZvaWQgU3RhcnRQTSggQ09OVEVYVCAqY29udGV4dCwgTFBET1NUQVNLIGxwRG9zVGFzayApCit7CisgICAgY2hhciAqYmFzZSA9IERPU01FTV9NZW1vcnlCYXNlKDApOworICAgIFVJTlQxNiBjcywgc3MsIGRzLCBlczsKKyAgICBDT05URVhUIHBtX2N0eDsKKworICAgIFJFU0VUX0NGTEFHKGNvbnRleHQpOworICAgIGxwRG9zVGFzay0+ZHBtaV9mbGFnID0gQVhfcmVnKGNvbnRleHQpOworLyogb3VyIG1vZGUgc3dpdGNoIHdyYXBwZXIgaGF2ZSBwbGFjZWQgdGhlIGRlc2lyZWQgQ1MgaW50byBEWCAqLworICAgIGNzID0gU0VMRUNUT1JfQWxsb2NCbG9jayggYmFzZSArIChEV09SRCkoRFhfcmVnKGNvbnRleHQpPDw0KSwgMHgxMDAwMCwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgRkFMU0UgKTsKKyAgICBzcyA9IFNFTEVDVE9SX0FsbG9jQmxvY2soIGJhc2UgKyAoRFdPUkQpKFNTX3JlZyhjb250ZXh0KTw8NCksIDB4MTAwMDAsIFNFR01FTlRfREFUQSwgRkFMU0UsIEZBTFNFICk7CisgICAgZHMgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBiYXNlICsgKERXT1JEKShEU19yZWcoY29udGV4dCk8PDQpLCAweDEwMDAwLCBTRUdNRU5UX0RBVEEsIEZBTFNFLCBGQUxTRSApOworICAgIGVzID0gU0VMRUNUT1JfQWxsb2NCbG9jayggYmFzZSArIChEV09SRCkobHBEb3NUYXNrLT5wc3Bfc2VnPDw0KSwgMHgxMDAsIFNFR01FTlRfREFUQSwgRkFMU0UsIEZBTFNFICk7CisKKyAgICBwbV9jdHggPSAqY29udGV4dDsKKyAgICBDU19yZWcoJnBtX2N0eCkgPSBscERvc1Rhc2stPmRwbWlfc2VsOworLyogb3VyIG1vZGUgc3dpdGNoIHdyYXBwZXIgZXhwZWN0cyB0aGUgbmV3IENTIGluIERYLCBhbmQgdGhlIG5ldyBTUyBpbiBBWCAqLworICAgIEFYX3JlZygmcG1fY3R4KSA9IHNzOworICAgIERYX3JlZygmcG1fY3R4KSA9IGNzOworICAgIERTX3JlZygmcG1fY3R4KSA9IGRzOworICAgIEVTX3JlZygmcG1fY3R4KSA9IGVzOworICAgIEZTX3JlZygmcG1fY3R4KSA9IDA7CisgICAgR1NfcmVnKCZwbV9jdHgpID0gMDsKKworICAgIFRSQUNFKGludDMxLCJET1MgcHJvZ3JhbSBpcyBub3cgZW50ZXJpbmcgcHJvdGVjdGVkIG1vZGVcbiIpOworICAgIENhbGxiYWNrcy0+Q2FsbFJlZ2lzdGVyU2hvcnRQcm9jKCZwbV9jdHgsIDApOworCisgICAgLyogaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWZmYWlycywgd2Ugd29uJ3QgZXZlciBhY3R1YWxseSByZXR1cm4gaGVyZS4uLiAqLworCisgICAgVW5NYXBMUyhQVFJfU0VHX09GRl9UT19TRUdQVFIoZXMsMCkpOworICAgIFVuTWFwTFMoUFRSX1NFR19PRkZfVE9fU0VHUFRSKGRzLDApKTsKKyAgICBVbk1hcExTKFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzcywwKSk7CisgICAgVW5NYXBMUyhQVFJfU0VHX09GRl9UT19TRUdQVFIoY3MsMCkpOworfQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgSU5UX0ludDMxSGFuZGxlcgpAQCAtMzQ3LDYgKzM4NywyMyBAQAogICAgIERXT1JEIGR3OwogICAgIEJZVEUgKnB0cjsKIAorICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gcFRhc2sgPyBORV9HZXRQdHIoIHBUYXNrLT5oTW9kdWxlICkgOiBOVUxMOworCisgICAgR2xvYmFsVW5sb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKKworI2lmZGVmIE1aX1NVUFBPUlRFRAorICAgIGlmIChJU1Y4Nihjb250ZXh0KSAmJiBwTW9kdWxlICYmIHBNb2R1bGUtPmxwRG9zVGFzaykgeworICAgICAgICAvKiBDYWxsZWQgZnJvbSByZWFsIG1vZGUsIGNoZWNrIGlmIGl0J3Mgb3VyIHdyYXBwZXIgKi8KKyAgICAgICAgVFJBQ0UoaW50MzEsImNhbGxlZCBmcm9tIHJlYWwgbW9kZVxuIik7CisgICAgICAgIGlmIChDU19yZWcoY29udGV4dCk9PXBNb2R1bGUtPmxwRG9zVGFzay0+ZHBtaV9zZWcpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHByb3RlY3RlZCBtb2RlIHN3aXRjaCAqLworICAgICAgICAgICAgU3RhcnRQTShjb250ZXh0LHBNb2R1bGUtPmxwRG9zVGFzayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKwogICAgIFJFU0VUX0NGTEFHKGNvbnRleHQpOwogICAgIHN3aXRjaChBWF9yZWcoY29udGV4dCkpCiAgICAgewpAQCAtNTAzLDcgKzU2MCw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHgwMjA0OiAgLyogR2V0IHByb3RlY3RlZCBtb2RlIGludGVycnVwdCB2ZWN0b3IgKi8KICAgICAJVFJBQ0UoaW50MzEsImdldCBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciAoMHglMDJ4KSwgc3R1YiFcbiIsQkxfcmVnKGNvbnRleHQpKTsKLQlkdyA9IChEV09SRClJTlRfR2V0SGFuZGxlciggQkxfcmVnKGNvbnRleHQpICk7CisJZHcgPSAoRFdPUkQpSU5UX0dldFBNSGFuZGxlciggQkxfcmVnKGNvbnRleHQpICk7CiAJQ1hfcmVnKGNvbnRleHQpID0gSElXT1JEKGR3KTsKIAlEWF9yZWcoY29udGV4dCkgPSBMT1dPUkQoZHcpOwogCWJyZWFrOwpAQCAtNTExLDkgKzU2OCw5IEBACiAgICAgY2FzZSAweDAyMDU6ICAvKiBTZXQgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0IHZlY3RvciAqLwogICAgIAlUUkFDRShpbnQzMSwic2V0IHByb3RlY3RlZCBtb2RlIGludGVycnVwdCBoYW5kbGVyICgweCUwMngsJXApLCBzdHViIVxuIiwKICAgICAgICAgICAgIEJMX3JlZyhjb250ZXh0KSxQVFJfU0VHX09GRl9UT19MSU4oQ1hfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOwotCUlOVF9TZXRIYW5kbGVyKCBCTF9yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoRkFSUFJPQzE2KVBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggQ1hfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApKTsKKwlJTlRfU2V0UE1IYW5kbGVyKCBCTF9yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGQVJQUk9DMTYpUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBDWF9yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIDB4MDMwMDogIC8qIFNpbXVsYXRlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKi8KZGlmZiAtLWdpdCBhL21zZG9zL2ludDIxLmMgYi9tc2Rvcy9pbnQyMS5jCmluZGV4IGExN2I2MzAuLjU1ZTE5YTggMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDIxLmMKKysrIGIvbXNkb3MvaW50MjEuYwpAQCAtODE3LDEyICs4MTcsMTIgQEAKIAogc3RhdGljIHZvaWQgRGVsZXRlRmlsZUZDQiggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0gICAgRklYTUUoaW50MjEsICIoJXApOiBub3QgaW1wbGVtZW50ZWQgeWV0XG4iLCBjb250ZXh0KTsKKyAgICBGSVhNRShpbnQyMSwgIiglcCk6IHN0dWJcbiIsIGNvbnRleHQpOwogfQogCiBzdGF0aWMgdm9pZCBSZW5hbWVGaWxlRkNCKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBGSVhNRShpbnQyMSwgIiglcCk6IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIsIGNvbnRleHQpOworICAgIEZJWE1FKGludDIxLCAiKCVwKTogc3R1YlxuIiwgY29udGV4dCk7CiB9CiAKIApAQCAtODk1LDE5ICs4OTUsMTggQEAKICAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBJTlQyMV9TZXRDdXJyZW50UFNQKENPTlRFWFQgKmNvbnRleHQpCitzdGF0aWMgdm9pZCBJTlQyMV9TZXRDdXJyZW50UFNQKFdPUkQgcHNwKQogewotLyogRklYTUUgLSBXaGF0IGlzIHRoaXMgTVogc3R1ZmYgYW5kIHdoYXQgaWYgaXQgaXNuJ3Qgc3VwcG9ydGVkPz8gKi8KICNpZmRlZiBNWl9TVVBQT1JURUQKICAgICBUREIgKnBUYXNrID0gaE1vZHVsZSA/IE5VTEwgOiAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gKGhNb2R1bGUgfHwgcFRhc2spID8gTkVfR2V0UHRyKCBoTW9kdWxlID8gaE1vZHVsZSA6IHBUYXNrLT5oTW9kdWxlICkgOiBOVUxMOwogICAgIAogICAgIEdsb2JhbFVubG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAgICAgaWYgKHBNb2R1bGUtPmxwRG9zVGFzaykKLSAgICAgICAgcE1vZHVsZS0+bHBEb3NUYXNrLT5wc3Bfc2VnID0gQlhfcmVnKGNvbnRleHQpOwotI2Vsc2UKLSAgICBGSVhNRShpbnQyMSwgIk1aIE5vdCBTdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcE1vZHVsZS0+bHBEb3NUYXNrLT5wc3Bfc2VnID0gcHNwOworICAgIGVsc2UKICNlbmRpZgorICAgICAgICBFUlIoaW50MjEsICJDYW5ub3QgY2hhbmdlIFBTUCBmb3Igbm9uLURPUyB0YXNrIVxuIik7CiB9CiAgICAgCiBzdGF0aWMgV09SRCBJTlQyMV9HZXRDdXJyZW50UFNQKCkKQEAgLTExNjUsNyArMTE2NCw3IEBACiAgICAgICAgIGJyZWFrOwogCQkKICAgICBjYXNlIDB4MjU6IC8qIFNFVCBJTlRFUlJVUFQgVkVDVE9SICovCi0gICAgICAgIElOVF9TZXRIYW5kbGVyKCBBTF9yZWcoY29udGV4dCksCisgICAgICAgIElOVF9DdHhTZXRIYW5kbGVyKCBjb250ZXh0LCBBTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoRkFSUFJPQzE2KVBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBicmVhazsKQEAgLTEyNzEsNyArMTI3MCw3IEBACiAgICAgY2FzZSAweDM1OiAvKiBHRVQgSU5URVJSVVBUIFZFQ1RPUiAqLwogICAgICAgICBUUkFDRShpbnQyMSwiR0VUIElOVEVSUlVQVCBWRUNUT1IgMHglMDJ4XG4iLEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIHsKLSAgICAgICAgICAgIEZBUlBST0MxNiBhZGRyID0gSU5UX0dldEhhbmRsZXIoIEFMX3JlZyhjb250ZXh0KSApOworICAgICAgICAgICAgRkFSUFJPQzE2IGFkZHIgPSBJTlRfQ3R4R2V0SGFuZGxlciggY29udGV4dCwgQUxfcmVnKGNvbnRleHQpICk7CiAgICAgICAgICAgICBFU19yZWcoY29udGV4dCkgPSBTRUxFQ1RPUk9GKGFkZHIpOwogICAgICAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gT0ZGU0VUT0YoYWRkcik7CiAgICAgICAgIH0KQEAgLTEzNjAsMTAgKzEzNTksMTcgQEAKICAgICAgICAgVFJBQ0UoaW50MjEsIlJFQUQgZnJvbSAlZCB0byAlMDRsWDolMDRYIGZvciAlZCBieXRlXG4iLEJYX3JlZyhjb250ZXh0KSwKIAkgICAgICBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSApOwogICAgICAgICB7Ci0gICAgICAgICAgICBMT05HIHJlc3VsdCA9IF9ocmVhZDE2KCBCWF9yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpICk7CisgICAgICAgICAgICBMT05HIHJlc3VsdDsKKyAgICAgICAgICAgIGlmIChJU1Y4Nihjb250ZXh0KSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBfaHJlYWQxNiggQlhfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFdJTjE2X2hyZWFkKCBCWF9yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggRFNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIGJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKICAgICAgICAgICAgIGVsc2UgQVhfcmVnKGNvbnRleHQpID0gKFdPUkQpcmVzdWx0OwogICAgICAgICB9CkBAIC0xNTQ4LDYgKzE1NTQsMTAgQEAKIAkgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAJICAgIH0KKworICAgICAgICBjYXNlIDB4ZTA6ICAvKiBTdW4gUEMtTkZTIEFQSSAqLworICAgICAgICAgICAgLyogbm90IGluc3RhbGxlZCAqLworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwpAQCAtMTY3MSw5ICsxNjgxLDggQEAKICAgICAgICAgZWxzZSBBWF9yZWcoY29udGV4dCkgPSAwOyAgLyogT0sgKi8KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAweDUwOiAvKiBTRVQgQ1VSUkVOVCBQUk9DRVNTIElEIChTRVQgUFNQIEFERFJFU1MpICovCi0gICAgICAgIFRSQUNFKGludDIxLCAiU0VUIENVUlJFTlQgUFJPQ0VTUyBJRCAoR0VUIFBTUCBBRERSRVNTKVxuIik7Ci0gICAgICAgIC8qIEZJWE1FOiBJcyB0aGlzIHJpZ2h0PyAqLwotICAgICAgICBJTlQyMV9TZXRDdXJyZW50UFNQKGNvbnRleHQpOworICAgICAgICBUUkFDRShpbnQyMSwgIlNFVCBDVVJSRU5UIFBST0NFU1MgSUQgKFNFVCBQU1AgQUREUkVTUylcbiIpOworICAgICAgICBJTlQyMV9TZXRDdXJyZW50UFNQKEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHg1MTogLyogR0VUIFBTUCBBRERSRVNTICovCiAgICAgICAgIFRSQUNFKGludDIxLCJHRVQgQ1VSUkVOVCBQUk9DRVNTIElEIChHRVQgUFNQIEFERFJFU1MpXG4iKTsKQEAgLTE3MTUsNyArMTcyNCw3IEBACiAgICAgICAgICAgICAgICAgRklMRVRJTUUgZmlsZXRpbWU7CiAgICAgICAgICAgICAgICAgVFJBQ0UoaW50MjEsIkdFVCBGSUxFIERBVEUgQU5EIFRJTUUgZm9yIGhhbmRsZSAlZFxuIiwKIAkJICAgICAgQlhfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICBpZiAoIUdldEZpbGVUaW1lKCBCWF9yZWcoY29udGV4dCksIE5VTEwsIE5VTEwsICZmaWxldGltZSApKQorICAgICAgICAgICAgICAgIGlmICghR2V0RmlsZVRpbWUoIEhGSUxFMTZfVE9fSEZJTEUzMihCWF9yZWcoY29udGV4dCkpLCBOVUxMLCBOVUxMLCAmZmlsZXRpbWUgKSkKIAkJICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CiAgICAgICAgICAgICAgICAgZWxzZSBGaWxlVGltZVRvRG9zRGF0ZVRpbWUoICZmaWxldGltZSwgJkRYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNYX3JlZyhjb250ZXh0KSApOwpAQCAtMjEwNiw2ICsyMTE1LDcgQEAKIAogRkFSUFJPQzE2IFdJTkFQSSBHZXRTZXRLZXJuZWxET1NQcm9jKEZBUlBST0MxNiBEb3NQcm9jKQogewotCUZJWE1FKGludDIxLCAiKERvc1Byb2M9JTA4eCk7XG4iLCAoVUlOVDMyKURvc1Byb2MpOworCUZJWE1FKGludDIxLCAiKERvc1Byb2M9MHglMDh4KTogc3R1YlxuIiwgKFVJTlQzMilEb3NQcm9jKTsKIAlyZXR1cm4gTlVMTDsKIH0KKwpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MmYuYyBiL21zZG9zL2ludDJmLmMKaW5kZXggMDU1OWZmZi4uN2E4OGQ4MCAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MmYuYworKysgYi9tc2Rvcy9pbnQyZi5jCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImRvc2V4ZS5oIgogLyogI2RlZmluZSBERUJVR19JTlQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC0zNCw2ICszNiwyMSBAQAogICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAweGZmOyAvKiBzaGFyZSBpcyBpbnN0YWxsZWQgKi8KICAgICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIDB4MTE6ICAvKiBOZXR3b3JrIFJlZGlyZWN0b3IgLyBJRlNGVU5DICovCisgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgwMDogIC8qIEluc3RhbGwgY2hlY2sgKi8KKyAgICAgICAgICAgIC8qIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ODA6ICAvKiBFbmhhbmNlZCBzZXJ2aWNlcyAtIEluc3RhbGwgY2hlY2sgKi8KKyAgICAgICAgICAgIC8qIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyZiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKICAgICBjYXNlIDB4MTI6CiAgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQogICAgICAgICB7CkBAIC0xMzEsMTYgKzE0OCw0OSBAQAogICAgICAgICAgICAgLyogcmV0dXJuIG5vdGhpbmcgLT4gTmV0V2FyZSBub3QgaW5zdGFsbGVkICovCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKKwkgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MmYgKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHhiNzogIC8qIGFwcGVuZCAqLwogICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAwOyAvKiBub3QgaW5zdGFsbGVkICovCiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhiODogIC8qIG5ldHdvcmsgKi8KKyAgICAgICAgc3dpdGNoIChBTF9yZWcoY29udGV4dCkpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAweDAwOiAgLyogSW5zdGFsbCBjaGVjayAqLworICAgICAgICAgICAgLyogbm90IGluc3RhbGxlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDJmICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBjYXNlIDB4YmQ6ICAvKiBzb21lIE5vdmVsbCBuZXR3b3JrIGluc3RhbGwgY2hlY2sgPz8/ICovCiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4YTVhNTsgLyogcHJldGVuZCB0byBoYXZlIE5vdmVsbCBJUFggaW5zdGFsbGVkICovCiAJYnJlYWs7CisgICAgY2FzZSAweGJmOiAgLyogUkVESVJJRlMuRVhFICovCisgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgwMDogIC8qIEluc3RhbGwgY2hlY2sgKi8KKyAgICAgICAgICAgIC8qIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyZiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQ3OiAgLyogQmFueWFuIFZpbmVzICovCisgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgwMTogIC8qIEluc3RhbGwgY2hlY2sgLSBHZXQgSW50IE51bWJlciAqLworICAgICAgICAgICAgLyogbm90IGluc3RhbGxlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDJmICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBjYXNlIDB4ZmE6ICAvKiBXYXRjb20gZGVidWdnZXIgY2hlY2ssIHJldHVybnMgMHg2NjYgaWYgaW5zdGFsbGVkICovCiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0yMDAsMTAgKzI1MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlhEX0JBU0UgKyBCWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgaWYgKCFhZGRyKSAgLyogbm90IHN1cHBvcnRlZCAqLwogICAgICAgICB7Ci0JICAgIFdBUk4oaW50LCJBcHBsaWNhdGlvbiBhdHRlbXB0ZWQgdG8gYWNjZXNzIFZ4RCAlMDR4XG4iLAorCSAgICBFUlIoaW50LCJBY2Nlc3NpbmcgdW5rbm93biBWeEQgJTA0eCAtIEV4cGVjdCBhIGZhaWx1cmUgbm93LlxuIiwKICAgICAgICAgICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSApOwotCSAgICBXQVJOKGludCwiVGhpcyBkZXZpY2UgaXMgbm90IGtub3duIHRvIFdpbmUuIik7Ci0JICAgIFdBUk4oaW50LCJFeHBlY3QgYSBmYWlsdXJlIG5vd1xuIik7CiAgICAgICAgIH0KIAlFU19yZWcoY29udGV4dCkgPSBTRUxFQ1RPUk9GKGFkZHIpOwogCURJX3JlZyhjb250ZXh0KSA9IE9GRlNFVE9GKGFkZHIpOwpAQCAtMjEzLDIxICsyNjEsMjggQEAKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMDsgIC8qIFJ1bm5pbmcgdW5kZXIgRFBNSSAqLwogICAgICAgICBicmVhazsKIAotICAgIC8qIEZJWE1FOiBpcyB0aGlzIHJpZ2h0PyAgU3BlY3Mgc2F5IHRoYXQgdGhpcyBzaG91bGQgb25seSBiZSBjYWxsYWJsZQotICAgICAgIGluIHJlYWwgKHY4NikgbW9kZSB3aGljaCB3ZSBuZXZlciBlbnRlci4gICovCi0gICAgLyogRklYTUU6IHdlIGRvIG5vdywgYW5kIHRoaXMgYnJlYWtzIHBrdW56aXAgKi8KICAgICBjYXNlIDB4ODc6IC8qIERQTUkgaW5zdGFsbGF0aW9uIGNoZWNrICovCisjaWYgMSAgIC8qIERQTUkgc3RpbGwgYnJlYWtzIHBrdW56aXAgKi8KICAgICAgICAgaWYgKElTVjg2KGNvbnRleHQpKSBicmVhazsgLyogc28gYmFpbCBvdXQgZm9yIG5vdyBpZiBpbiB2ODYgbW9kZSAqLworI2VuZGlmCiAgICAgICAgIHsKKyAgICAgICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisgICAgICAgICAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBwVGFzayA/IE5FX0dldFB0ciggcFRhc2stPmhNb2R1bGUgKSA6IE5VTEw7CiAJICAgIFNZU1RFTV9JTkZPIHNpOwogCisgICAgICAgICAgICBHbG9iYWxVbmxvY2sxNiggR2V0Q3VycmVudFRhc2soKSApOwogCSAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CiAJICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDAwMDsgLyogRFBNSSBJbnN0YWxsZWQgKi8KICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IDB4MDAwMTsgLyogMzJiaXRzIGF2YWlsYWJsZSAqLwogICAgICAgICAgICAgQ0xfcmVnKGNvbnRleHQpID0gc2kud1Byb2Nlc3NvckxldmVsOwogICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gMHgwMDVhOyAvKiBEUE1JIG1ham9yL21pbm9yIDAuOTAgKi8KICAgICAgICAgICAgIFNJX3JlZyhjb250ZXh0KSA9IDA7ICAgICAgLyogIyBvZiBwYXJhLiBvZiBET1MgZXh0ZW5kZWQgcHJpdmF0ZSBkYXRhICovCi0gICAgICAgICAgICBFU19yZWcoY29udGV4dCkgPSAwOyAgICAgIC8qIEVTOkRJIGlzIERQTUkgc3dpdGNoIGVudHJ5IHBvaW50ICovCisjaWZkZWYgTVpfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgIC8qIEVTOkRJIGlzIERQTUkgc3dpdGNoIGVudHJ5IHBvaW50ICovCisgICAgICAgICAgICBpZiAocE1vZHVsZSAmJiBwTW9kdWxlLT5scERvc1Rhc2spCisgICAgICAgICAgICAgICAgRVNfcmVnKGNvbnRleHQpID0gcE1vZHVsZS0+bHBEb3NUYXNrLT5kcG1pX3NlZzsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIEVTX3JlZyhjb250ZXh0KSA9IDA7CiAgICAgICAgICAgICBESV9yZWcoY29udGV4dCkgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21zZG9zL2ludGVycnVwdHMuYyBiL21zZG9zL2ludGVycnVwdHMuYwppbmRleCA3OWM3MTQ0Li5hNDRhNGNhIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnRlcnJ1cHRzLmMKKysrIGIvbXNkb3MvaW50ZXJydXB0cy5jCkBAIC0xOCwyNiArMTgsODAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIElOVF9HZXRIYW5kbGVyCisgKgkgICAgSU5UX0dldFBNSGFuZGxlcgogICoKLSAqIFJldHVybiB0aGUgaW50ZXJydXB0IHZlY3RvciBmb3IgYSBnaXZlbiBpbnRlcnJ1cHQuCisgKiBSZXR1cm4gdGhlIHByb3RlY3RlZCBtb2RlIGludGVycnVwdCB2ZWN0b3IgZm9yIGEgZ2l2ZW4gaW50ZXJydXB0LgogICovCi1GQVJQUk9DMTYgSU5UX0dldEhhbmRsZXIoIEJZVEUgaW50bnVtICkKK0ZBUlBST0MxNiBJTlRfR2V0UE1IYW5kbGVyKCBCWVRFIGludG51bSApCiB7CiAgICAgcmV0dXJuIElOVF9WZWN0b3JzW2ludG51bV07CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBJTlRfU2V0SGFuZGxlcgorICoJICAgIElOVF9TZXRQTUhhbmRsZXIKKyAqCisgKiBTZXQgdGhlIHByb3RlY3RlZCBtb2RlIGludGVycnVwdCBoYW5kbGVyIGZvciBhIGdpdmVuIGludGVycnVwdC4KKyAqLwordm9pZCBJTlRfU2V0UE1IYW5kbGVyKCBCWVRFIGludG51bSwgRkFSUFJPQzE2IGhhbmRsZXIgKQoreworICAgIFRSQUNFKGludCwgIlNldCBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgdmVjdG9yICUwMnggPC0gJTA0eDolMDR4XG4iLAorICAgICAgICAgICAgICAgICBpbnRudW0sIEhJV09SRChoYW5kbGVyKSwgTE9XT1JEKGhhbmRsZXIpICk7CisgICAgSU5UX1ZlY3RvcnNbaW50bnVtXSA9IGhhbmRsZXI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBJTlRfR2V0Uk1IYW5kbGVyCisgKgorICogUmV0dXJuIHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IHZlY3RvciBmb3IgYSBnaXZlbiBpbnRlcnJ1cHQuCisgKi8KK0ZBUlBST0MxNiBJTlRfR2V0Uk1IYW5kbGVyKCBCWVRFIGludG51bSApCit7CisgICAgcmV0dXJuICgoRkFSUFJPQzE2KilET1NNRU1fTWVtb3J5QmFzZSgwKSlbaW50bnVtXTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIElOVF9TZXRSTUhhbmRsZXIKKyAqCisgKiBTZXQgdGhlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgYSBnaXZlbiBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgSU5UX1NldFJNSGFuZGxlciggQllURSBpbnRudW0sIEZBUlBST0MxNiBoYW5kbGVyICkKK3sKKyAgICBUUkFDRShpbnQsICJTZXQgcmVhbCBtb2RlIGludGVycnVwdCB2ZWN0b3IgJTAyeCA8LSAlMDR4OiUwNHhcbiIsCisgICAgICAgICAgICAgICAgIGludG51bSwgSElXT1JEKGhhbmRsZXIpLCBMT1dPUkQoaGFuZGxlcikgKTsKKyAgICAoKEZBUlBST0MxNiopRE9TTUVNX01lbW9yeUJhc2UoMCkpW2ludG51bV0gPSBoYW5kbGVyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgSU5UX0N0eEdldEhhbmRsZXIKKyAqCisgKiBSZXR1cm4gdGhlIGludGVycnVwdCB2ZWN0b3IgZm9yIGEgZ2l2ZW4gaW50ZXJydXB0LgorICovCitGQVJQUk9DMTYgSU5UX0N0eEdldEhhbmRsZXIoIENPTlRFWFQgKmNvbnRleHQsIEJZVEUgaW50bnVtICkKK3sKKyAgICBpZiAoSVNWODYoY29udGV4dCkpCisgICAgICAgIHJldHVybiAoKEZBUlBST0MxNiopVjg2QkFTRShjb250ZXh0KSlbaW50bnVtXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBJTlRfR2V0UE1IYW5kbGVyKGludG51bSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBJTlRfQ3R4U2V0SGFuZGxlcgogICoKICAqIFNldCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGEgZ2l2ZW4gaW50ZXJydXB0LgogICovCi12b2lkIElOVF9TZXRIYW5kbGVyKCBCWVRFIGludG51bSwgRkFSUFJPQzE2IGhhbmRsZXIgKQordm9pZCBJTlRfQ3R4U2V0SGFuZGxlciggQ09OVEVYVCAqY29udGV4dCwgQllURSBpbnRudW0sIEZBUlBST0MxNiBoYW5kbGVyICkKIHsKLSAgICBUUkFDRShpbnQsICJTZXQgaW50ZXJydXB0IHZlY3RvciAlMDJ4IDwtICUwNHg6JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgaW50bnVtLCBISVdPUkQoaGFuZGxlciksIExPV09SRChoYW5kbGVyKSApOwotICAgIElOVF9WZWN0b3JzW2ludG51bV0gPSBoYW5kbGVyOworICAgIGlmIChJU1Y4Nihjb250ZXh0KSkgeworICAgICAgICBUUkFDRShpbnQsICJTZXQgcmVhbCBtb2RlIGludGVycnVwdCB2ZWN0b3IgJTAyeCA8LSAlMDR4OiUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICBpbnRudW0sIEhJV09SRChoYW5kbGVyKSwgTE9XT1JEKGhhbmRsZXIpICk7CisgICAgICAgICgoRkFSUFJPQzE2KilWODZCQVNFKGNvbnRleHQpKVtpbnRudW1dID0gaGFuZGxlcjsKKyAgICB9IGVsc2UKKyAgICAgICAgSU5UX1NldFBNSGFuZGxlcihpbnRudW0sIGhhbmRsZXIpOwogfQogCiAKQEAgLTYzLDEwICsxMTcsMTcgQEAKICAgICAgICAgY2FzZSAweDIxOgogICAgICAgICAgICAgRE9TM0NhbGwoY29udGV4dCk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDI1OgorICAgICAgICAgICAgSU5UX0ludDI1SGFuZGxlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDB4MmY6CiAgICAgICAgICAgICBJTlRfSW50MmZIYW5kbGVyKGNvbnRleHQpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzMToKKyAgICAgICAgICAgIElOVF9JbnQzMUhhbmRsZXIoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEZJWE1FKGludCwgIlVua25vd24gSW50ZXJydXB0IGluIERPUyBtb2RlOiAweCV4XG4iLCBpbnRudW0pOwogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbXNkb3MvdnhkLmMgYi9tc2Rvcy92eGQuYwppbmRleCBjYWFjN2EzLi4wMTFjMTE3IDEwMDY0NAotLS0gYS9tc2Rvcy92eGQuYworKysgYi9tc2Rvcy92eGQuYwpAQCAtMzQsNiArMzQsMjcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVlhEX1ZNTQorICovCit2b2lkIFZYRF9WTU0gKCBDT05URVhUICpjb250ZXh0ICkKK3sKKyAgICB1bnNpZ25lZCBzZXJ2aWNlID0gQVhfcmVnKGNvbnRleHQpOworCisgICAgVFJBQ0UodnhkLCJbJTA0eF0gVk1NICBcbiIsIChVSU5UMTYpc2VydmljZSk7CisKKyAgICBzd2l0Y2goc2VydmljZSkKKyAgICB7CisgICAgY2FzZSAweDAwMDA6IC8qIHZlcnNpb24gKi8KKyAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gVlhEX1dpblZlcnNpb24oKTsKKyAgICAgICAgUkVTRVRfQ0ZMQUcoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgVlhEX0JBUkYoIGNvbnRleHQsICJWTU0iICk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBWWERfUGFnZUZpbGUKICAqLwogdm9pZCBXSU5BUEkgVlhEX1BhZ2VGaWxlKCBDT05URVhUICpjb250ZXh0ICkKQEAgLTE5OSw2ICsyMjAsNjEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVlhEX1RpbWVyQVBJCisgKi8KK3ZvaWQgVlhEX1RpbWVyQVBJICggQ09OVEVYVCAqY29udGV4dCApCit7CisgICAgc3RhdGljIERXT1JEIGNsb2NrVGlja3MgPSAwOworICAgIHN0YXRpYyBXT1JEIGNsb2NrVGlja1NlbGVjdG9yID0gMDsKKworICAgIHVuc2lnbmVkIHNlcnZpY2UgPSBBWF9yZWcoY29udGV4dCk7CisKKyAgICBUUkFDRSh2eGQsIlslMDR4XSBUaW1lckFQSSAgXG4iLCAoVUlOVDE2KXNlcnZpY2UpOworCisgICAgc3dpdGNoKHNlcnZpY2UpCisgICAgeworICAgIGNhc2UgMHgwMDAwOiAvKiB2ZXJzaW9uICovCisgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IFZYRF9XaW5WZXJzaW9uKCk7CisgICAgICAgIFJFU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwMDA5OiAvKiBnZXQgc3lzdGVtIHRpbWUgc2VsZWN0b3IgKi8KKyAgICAgICAgRklYTUUodnhkLCAiR2V0X1N5c3RlbV9UaW1lX1NlbGVjdG9yOiB0aGlzIGNsb2NrIGRvZXNuJ3QgdGljayFcbiIpOworCisgICAgICAgIGlmICggIWNsb2NrVGlja1NlbGVjdG9yICkKKyAgICAgICAgICAgIGNsb2NrVGlja1NlbGVjdG9yID0gU0VMRUNUT1JfQWxsb2NCbG9jayggJmNsb2NrVGlja3MsIHNpemVvZihEV09SRCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdNRU5UX0RBVEEsIEZBTFNFLCBUUlVFICk7CisgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IGNsb2NrVGlja1NlbGVjdG9yOworICAgICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBWWERfQkFSRiggY29udGV4dCwgIlZUREFQSSIgKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZYRF9Db25maWdNRworICovCit2b2lkIFZYRF9Db25maWdNRyAoIENPTlRFWFQgKmNvbnRleHQgKQoreworICAgIHVuc2lnbmVkIHNlcnZpY2UgPSBBWF9yZWcoY29udGV4dCk7CisKKyAgICBUUkFDRSh2eGQsIlslMDR4XSBDb25maWdNRyAgXG4iLCAoVUlOVDE2KXNlcnZpY2UpOworCisgICAgc3dpdGNoKHNlcnZpY2UpCisgICAgeworICAgIGNhc2UgMHgwMDAwOiAvKiB2ZXJzaW9uICovCisgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IFZYRF9XaW5WZXJzaW9uKCk7CisgICAgICAgIFJFU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIFZYRF9CQVJGKCBjb250ZXh0LCAiQ09ORklHTUciICk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBWWERfV2luMzJzCiAgKgogICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZXMgb2YgdGhlIFdpbjMycyBWeEQuCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL01ha2VmaWxlLmluIGIvbXVsdGltZWRpYS9NYWtlZmlsZS5pbgppbmRleCA4NzYyZDI1Li4yNWUyMzEyIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL01ha2VmaWxlLmluCisrKyBiL211bHRpbWVkaWEvTWFrZWZpbGUuaW4KQEAgLTE1LDYgKzE1LDcgQEAKIAltY2ljZGEuYyBcCiAJbWNpc3RyaW5nLmMgXAogCW1pZGkuYyBcCisJbWlkaXBhdGNoLmMgXAogCW1peGVyLmMgXAogCW1tYXV4LmMgXAogCW1taW8uYyBcCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2RwbGF5LmMgYi9tdWx0aW1lZGlhL2RwbGF5LmMKaW5kZXggZWVmMzU0Mi4uZTczMTZmOCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9kcGxheS5jCisrKyBiL211bHRpbWVkaWEvZHBsYXkuYwpAQCAtMSw3MiArMSw1NTUgQEAKLS8qIERpcmVjdCBQbGF5IDMgYW5kIERpcmVjdCBQbGF5IExvYmJ5IDEgSW1wbGVtZW50YXRpb24KLSAqIFByZXNlbnRseSBvbmx5IHRoZSBMb2JieSBza2VsZXRvbiBpcyBpbXBsZW1lbnRlZC4gICAgICAgICAgICAgICAgICAgIAorLyogRGlyZWN0IFBsYXkgMyBhbmQgRGlyZWN0IFBsYXkgTG9iYnkgMiBJbXBsZW1lbnRhdGlvbgogICoKICAqIENvcHlyaWdodCAxOTk4IC0gUGV0ZXIgSHVubmlzZXR0CiAgKgorICogPHByZXNlbnRseSB1bmRlciBjb25zdHJ1Y3Rpb24gLSBjb250YWN0IGh1bm5pc2VAbm9ydGVsLmNhPgorICoKICAqLwotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAid2ludHlwZXMuaCIKLSNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImludGVyZmFjZXMuaCIKLSNpbmNsdWRlICJtbXN5c3RlbS5oIgotI2luY2x1ZGUgImRwbGF5LmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgIndpbnJlZy5oIgorI2luY2x1ZGUgImNvbXBvYmouaCIKKyNpbmNsdWRlICJkcGxheS5oIgorCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CisKKyNkZWZpbmUgSXNFcXVhbEdVSUQocmd1aWQxLCByZ3VpZDIpICghbWVtY21wKHJndWlkMSwgcmd1aWQyLCBzaXplb2YoR1VJRCkpKQorI2RlZmluZSBJc0VxdWFsSUlEKHJpaWQxLCByaWlkMikgSXNFcXVhbEdVSUQocmlpZDEsIHJpaWQyKQorI2RlZmluZSBJc0VxdWFsQ0xTSUQocmNsc2lkMSwgcmNsc2lkMikgSXNFcXVhbEdVSUQocmNsc2lkMSwgcmNsc2lkMikKKworc3RydWN0IElEaXJlY3RQbGF5TG9iYnkgeworICAgIExQRElSRUNUUExBWUxPQkJZX1ZUQUJMRSBscFZ0Ymw7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgIHJlZjsKKyAgICBMUERQTENPTk5FQ1RJT04gICAgICAgICAgbHBTZXNzaW9uOworfTsKKworc3RydWN0IElEaXJlY3RQbGF5TG9iYnkyIHsKKyAgICBMUERJUkVDVFBMQVlMT0JCWTJfVlRBQkxFIGxwVnRibDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgIHJlZjsKKyAgICBMUERQTENPTk5FQ1RJT04gICAgICAgICAgIGxwU2Vzc2lvbjsKK307CiAKIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlfUXVlcnlJbnRlcmZhY2UKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHZpcnR1YWwgdGFibGVzICovCitzdGF0aWMgRElSRUNUUExBWUxPQkJZX1ZUQUJMRSAgZGlyZWN0UGxheUxvYmJ5QVZUOworc3RhdGljIERJUkVDVFBMQVlMT0JCWV9WVEFCTEUgIGRpcmVjdFBsYXlMb2JieVdWVDsKK3N0YXRpYyBESVJFQ1RQTEFZTE9CQlkyX1ZUQUJMRSBkaXJlY3RQbGF5TG9iYnkyQVZUOworc3RhdGljIERJUkVDVFBMQVlMT0JCWTJfVlRBQkxFIGRpcmVjdFBsYXlMb2JieTJXVlQ7CisKK3N0cnVjdCBJRGlyZWN0UGxheTIgeworICBMUERJUkVDVFBMQVkyX1ZUQUJMRSBscFZ0Ymw7CisgIFVMT05HICAgICAgICAgICAgICAgIHJlZjsKK307CisKK3N0cnVjdCBJRGlyZWN0UGxheTMgeworICBMUERJUkVDVFBMQVkzX1ZUQUJMRSBscFZ0Ymw7CisgIFVMT05HICAgICAgICAgICAgICAgIHJlZjsKK307CisKKworc3RhdGljIERJUkVDVFBMQVkyX1ZUQUJMRSBkaXJlY3RQbGF5MkFWVDsKK3N0YXRpYyBESVJFQ1RQTEFZMl9WVEFCTEUgZGlyZWN0UGxheTJXVlQ7CitzdGF0aWMgRElSRUNUUExBWTNfVlRBQkxFIGRpcmVjdFBsYXkzQVZUOworc3RhdGljIERJUkVDVFBMQVkzX1ZUQUJMRSBkaXJlY3RQbGF5M1dWVDsKKworLyogUm91dGluZSB0byBkZWxldGUgdGhlIGVudGlyZSBEUExDT05ORUNUSU9OIHRyZWUuIFdvcmtzIGZvciBib3RoIHVuaWNvZGUgYW5kIGFzY2lpLiAqLwordm9pZCBkZWxldGVEUENvbm5lY3Rpb24oIExQRFBMQ09OTkVDVElPTiogcHRyVG9EZWxldGUgKQoreworIAorICAvKiBUaGlzIGlzIG1vc3QgZGVmaW5pdGVseSB3cm9uZy4gV2UncmUgbm90IGV2ZW4ga2VlcGluZyBkd0N1cnJlbnRQbGF5ZXJzIG92ZXIgdGhpcyAqLworICAgTFBEUExDT05ORUNUSU9OIHRvRGVsZXRlID0gKnB0clRvRGVsZXRlOworCisgICBGSVhNRSggZHBsYXksICJpbmNvbXBsZXRlLlxuIiApOworCisgICBpZiggIXRvRGVsZXRlICkKKyAgICAgcmV0dXJuOworICAgIAorICAgLyogQ2xlYXIgb3V0IERQU0VTU0lPTkRFU0MyICovCisgICBpZiggdG9EZWxldGUtPmxwU2Vzc2lvbkRlc2MgKQorICAgeworICAgICBpZiggdG9EZWxldGUtPmxwU2Vzc2lvbkRlc2MtPnNlc3MubHBzelNlc3Npb25OYW1lICkKKyAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdG9EZWxldGUtPmxwU2Vzc2lvbkRlc2MtPnNlc3MubHBzelNlc3Npb25OYW1lICk7CisKKyAgICAgaWYoIHRvRGVsZXRlLT5scFNlc3Npb25EZXNjLT5wYXNzLmxwc3pQYXNzd29yZCApIAorICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0b0RlbGV0ZS0+bHBTZXNzaW9uRGVzYy0+cGFzcy5scHN6UGFzc3dvcmQgKTsgCisKKyAgICAgaWYoIHRvRGVsZXRlLT5scFNlc3Npb25EZXNjICk7ICAKKyAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdG9EZWxldGUtPmxwU2Vzc2lvbkRlc2MgKTsgCisgICB9CisKKyAgIC8qIENsZWFyIG91dCBMUERQTkFNRSAqLworICAgaWYoIHRvRGVsZXRlLT5scFBsYXllck5hbWUgKQorICAgeyAKKyAgICAgaWYoIHRvRGVsZXRlLT5scFBsYXllck5hbWUtPnBzbi5scHN6U2hvcnROYW1lICkKKyAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdG9EZWxldGUtPmxwUGxheWVyTmFtZS0+cHNuLmxwc3pTaG9ydE5hbWUgKTsKKworICAgICBpZiggdG9EZWxldGUtPmxwUGxheWVyTmFtZS0+cGxuLmxwc3pMb25nTmFtZSApIAorICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0b0RlbGV0ZS0+bHBQbGF5ZXJOYW1lLT5wbG4ubHBzekxvbmdOYW1lICk7CisKKyAgICAgaWYoIHRvRGVsZXRlLT5scFBsYXllck5hbWUgKSAKKyAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdG9EZWxldGUtPmxwUGxheWVyTmFtZSApOworICAgfQorCisgICAvKiBDbGVhciBvdXQgbHBBZGRyZXNzLiBUTyBETy4uLk9uY2Ugd2UgYWN0dWFsbHkgY29weSBpdC4gKi8KKworICAgLyogQ2xlYXIgb3V0IERQTENPTk5FQ1RJT04gKi8KKyAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0b0RlbGV0ZSApOworCisgICB0b0RlbGV0ZSA9IE5VTEw7Cit9CisKKworI2lmIDAKKy8qIFJvdXRpbmUgd2hpY2ggY29waWVzIGFuZCBhbGxvY2F0ZXMgYWxsIHRoZSBzdG9yZSByZXF1aXJlZCBmb3IgdGhlIERQTENPTk5FQ1RJT04gc3RydWN0LiAqLwordm9pZCByZWJ1aWxkRFBDb25uZWN0aW9uVyggTFBEUExDT05ORUNUSU9OIGRlc3QsIExQRFBMQ09OTkVDVElPTiBzcmMgKQoreworIAorICAvKiBOZWVkIHRvIGRlbGV0ZSBldmVyeXRoaW5nIHRoYXQgYWxyZWFkeSBleGlzdHMgZmlyc3QgKi8KKyAgRklYTUUoIGRwbGF5LCAiZnVuY3Rpb24gaXMgaW5jb21wbGV0ZS5cbiIgKTsgCisKKyAgaWYoICFzcmMgKQorICB7CisgICAgLyogTm90aGluZyB0byBjb3B5Li4uaG1tbS4uLiovCisgICAgRVJSKCBkcGxheSwgIm5vdGhpbmcgdG8gY29weVxuIiApOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIENvcHkgRFBMQ09OTkVDVElPTiBzdHJ1Y3QuIElmIGRlc3QgaXNuJ3QgTlVMTCB0aGVuIHdlIGhhdmUgYSBEUExDT05ORUNUSU9OCisgICAgIHN0cnVjdCBidXQgdGhhdCdzIGl0CisgICAqLworICBpZiggZGVzdCA9PSBOVUxMICkKKyAgeworICAgIGRlc3QgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZiggKnNyYyApICk7CisgIH0KKyAgbWVtY3B5KCBkZXN0LCBzcmMsIHNpemVvZiggKnNyYyApICk7CisKKyAgLyogQ29weSBMUERQU0VTU0lPTkRFU0MyIHN0cnVjdCAqLworICBpZiggc3JjLT5scFNlc3Npb25EZXNjICkKKyAgeworICAgIGRlc3QtPmxwU2Vzc2lvbkRlc2MgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCAqKHNyYy0+bHBTZXNzaW9uRGVzYykgKSApOworCisgICAgbWVtY3B5KCBkZXN0LT5scFNlc3Npb25EZXNjLCBzcmMtPmxwU2Vzc2lvbkRlc2MsCisgICAgICAgICAgICBzaXplb2YoICooc3JjLT5scFNlc3Npb25EZXNjKSApICk7IAorCisgICAgaWYoIHNyYy0+bHBTZXNzaW9uRGVzYyApCisgICAgeyAKKyAgICAgIC8qIEhtbW0uLi5kbyB3ZSBoYXZlIHRvIGFzc3VtZSB0aGUgc3lzdGVtIGhlYXA/ICovIAorICAgICAgZGVzdC0+bHBTZXNzaW9uRGVzYy0+c2Vzcy5scHN6U2Vzc2lvbk5hbWUgPSBIRUFQX3N0cmR1cFcoIEdldFByb2Nlc3NIZWFwKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5scFNlc3Npb25EZXNjLT5zZXNzLmxwc3pTZXNzaW9uTmFtZSApOworICAgIH0KKworICAgIGlmKCBzcmMtPmxwU2Vzc2lvbkRlc2MtPnBhc3MubHBzelBhc3N3b3JkICkKKyAgICB7CisgICAgICBkZXN0LT5scFNlc3Npb25EZXNjLT5wYXNzLmxwc3pQYXNzd29yZCA9IEhFQVBfc3RyZHVwVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmxwU2Vzc2lvbkRlc2MtPnBhc3MubHBzelBhc3N3b3JkICk7CisgICAgfQorICAgIGRlc3QtPmxwU2Vzc2lvbkRlc2MtPmR3UmVzZXJ2ZWQxID0gc3JjLT5scFNlc3Npb25EZXNjLT5kd1Jlc2VydmVkMiA9IDA7CisgIH0KKworICAvKiBDb3B5IERQTkFNRSBzdHJ1Y3QgKi8JCisgIGlmKCBzcmMtPmxwUGxheWVyTmFtZSApCisgIHsKKyAgICBkZXN0LT5scFBsYXllck5hbWUgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZiggKihzcmMtPmxwUGxheWVyTmFtZSkgKSApOyAKKyAgICBtZW1jcHkoIGRlc3QtPmxwUGxheWVyTmFtZSwgc3JjLT5scFBsYXllck5hbWUsIHNpemVvZiggKihzcmMtPmxwUGxheWVyTmFtZSkgKSApOyAKKworICAgIGlmKCBzcmMtPmxwUGxheWVyTmFtZS0+cHNuLmxwc3pTaG9ydE5hbWUgKQorICAgIHsgCisgICAgICBkZXN0LT5scFBsYXllck5hbWUtPnBzbi5scHN6U2hvcnROYW1lID0gSEVBUF9zdHJkdXBXKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5scFBsYXllck5hbWUtPnBzbi5scHN6U2hvcnROYW1lICk7CisgICAgfQorIAorICAgIGlmKCBzcmMtPmxwUGxheWVyTmFtZS0+cGxuLmxwc3pMb25nTmFtZSApCisgICAgeworICAgICAgZGVzdC0+bHBQbGF5ZXJOYW1lLT5wbG4ubHBzekxvbmdOYW1lID0gSEVBUF9zdHJkdXBXKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmxwUGxheWVyTmFtZS0+cGxuLmxwc3pMb25nTmFtZSApOworICAgIH0KKyAgfQorCisgIC8qIENvcHkgQWRkcmVzcyBvZiBTZXJ2aWNlIFByb3ZpZGVyIC1UQkQgKi8KKyAgaWYoIHNyYy0+bHBBZGRyZXNzICkgCisgIHsKKyAgICAvKiBXaGF0IGRvIHdlIGRvIGhlcmU/ICovIAorICB9IAorCit9CisKKyNlbmRpZgorCisvKiBSb3V0aW5lIGNhbGxlZCB3aGVuIHN0YXJ0aW5nIHVwIHRoZSBzZXJ2ZXIgdGhyZWFkICovCitEV09SRCBEUExvYmJ5X1NwYXduX1NlcnZlciggTFBWT0lEIHN0YXJ0RGF0YSApCit7CisgIERQU0VTU0lPTkRFU0MyKiBscFNlc3Npb24gPSAoRFBTRVNTSU9OREVTQzIqKSBzdGFydERhdGE7CisgIERXT1JEIHNlc3Npb25Ed0ZsYWdzID0gbHBTZXNzaW9uLT5kd0ZsYWdzOworIAorICBUUkFDRSggZHBsYXksICJzcGF3aW5nIHRocmVhZCBmb3IgbHBDb25uPSVwIGR3RmxhZ3M9JTA4bHhcbiIsIGxwU2Vzc2lvbiwgc2Vzc2lvbkR3RmxhZ3MgKTsKKyAgRklYTUUoIGRwbGF5LCAidGhyZWFkIG5lZWRzIHNvbWV0aGluZyB0byBkb1xuIiApOyAKKworLypmb3IoOzspKi8KKyAgeworICAgICAKKyAgICAvKiBDaGVjayBvdXQgdGhlIGNvbm5lY3Rpb24gZmxhZ3MgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gZG8uIEVuc3VyZSB3ZSBoYXZlIAorICAgICAgIG5vIGxlZnRvdmVyIGJpdHMgaW4gdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICBpZiggc2Vzc2lvbkR3RmxhZ3MgJiBEUFNFU1NJT05fQ0xJRU5UU0VSVkVSICkKKyAgICB7CisgICAgICAgLyogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2hpY2ggaXMgcmVxdWVzdGluZyB0aGUgY3JlYXRpb24KKyAgICAgICAgKiBvZiB0aGlzIHNlc3Npb24gaXMgZ29pbmcgdG8gYmUgdGhlIHNlcnZlciAoYXBwbGljYXRpb24vcGxheWVyKQorICAgICAgICAqLyAKKyAgICAgICBpZiggc2Vzc2lvbkR3RmxhZ3MgJiBEUFNFU1NJT05fU0VDVVJFU0VSVkVSICkKKyAgICAgICB7CisgICAgICAgICBzZXNzaW9uRHdGbGFncyAmPSB+RFBTRVNTSU9OX1NFQ1VSRVNFUlZFUjsgCisgICAgICAgfQorICAgICAgIHNlc3Npb25Ed0ZsYWdzICY9IH5EUFNFU1NJT05fQ0xJRU5UU0VSVkVSOyAgCisgICAgfQorCisgICAgaWYoIHNlc3Npb25Ed0ZsYWdzICYgRFBTRVNTSU9OX0pPSU5ESVNBQkxFRCApCisgICAgeworICAgICAgIHNlc3Npb25Ed0ZsYWdzICY9IH5EUFNFU1NJT05fSk9JTkRJU0FCTEVEOyAKKyAgICB9IAorCisgICAgaWYoIHNlc3Npb25Ed0ZsYWdzICYgRFBTRVNTSU9OX0tFRVBBTElWRSApCisgICAgeworICAgICAgIHNlc3Npb25Ed0ZsYWdzICY9IH5EUFNFU1NJT05fS0VFUEFMSVZFOworICAgIH0KKworICAgIGlmKCBzZXNzaW9uRHdGbGFncyAmIERQU0VTU0lPTl9NSUdSQVRFSE9TVCApCisgICAgeworICAgICAgIHNlc3Npb25Ed0ZsYWdzICY9IH5EUFNFU1NJT05fTUlHUkFURUhPU1Q7CisgICAgfQorCisgICAgaWYoIHNlc3Npb25Ed0ZsYWdzICYgRFBTRVNTSU9OX01VTFRJQ0FTVFNFUlZFUiApCisgICAgeworICAgICAgIHNlc3Npb25Ed0ZsYWdzICY9IH5EUFNFU1NJT05fTVVMVElDQVNUU0VSVkVSOworICAgIH0KKworICAgIGlmKCBzZXNzaW9uRHdGbGFncyAmIERQU0VTU0lPTl9ORVdQTEFZRVJTRElTQUJMRUQgKQorICAgIHsKKyAgICAgICBzZXNzaW9uRHdGbGFncyAmPSB+RFBTRVNTSU9OX05FV1BMQVlFUlNESVNBQkxFRDsgCisgICAgfQorCisgICAgaWYoIHNlc3Npb25Ed0ZsYWdzICYgRFBTRVNTSU9OX05PREFUQU1FU1NBR0VTICkKKyAgICB7CisgICAgICAgc2Vzc2lvbkR3RmxhZ3MgJj0gfkRQU0VTU0lPTl9OT0RBVEFNRVNTQUdFUzsgCisgICAgfSAKKworICAgIGlmKCBzZXNzaW9uRHdGbGFncyAmIERQU0VTU0lPTl9OT01FU1NBR0VJRCApCisgICAgeworICAgICAgIHNlc3Npb25Ed0ZsYWdzICY9IH5EUFNFU1NJT05fTk9NRVNTQUdFSUQ7CisgICAgfQorCisgICAgaWYoIHNlc3Npb25Ed0ZsYWdzICYgRFBTRVNTSU9OX1BBU1NXT1JEUkVRVUlSRUQgKQorICAgIHsKKyAgICAgICBzZXNzaW9uRHdGbGFncyAmPSB+RFBTRVNTSU9OX1BBU1NXT1JEUkVRVUlSRUQ7CisgICAgfQorCisgIH0KKworICBFeGl0VGhyZWFkKDApOworICByZXR1cm4gMDsgCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERpcmVjdCBQbGF5IGFuZCBEaXJlY3QgUGxheSBMb2JieSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorCisvKiBUaGUgQ09NIGludGVyZmFjZSBmb3IgdXB2ZXJzaW9uaW5nIGFuIGludGVyZmFjZQorICogV2UndmUgYmVlbiBnaXZlbiBhIEdVSUQgKHJpaWQpIGFuZCB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlIHByZXNlbnQKKyAqIGludGVyZmFjZSB3aXRoIHRoYXQgb2YgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2UuCisgKgorICogU25pcCBmcm9tIHNvbWUgTWljcm9zb2Z0IGRvY3VtZW50OgorICogVGhlcmUgYXJlIGZvdXIgcmVxdWlyZW1lbnRzIGZvciBpbXBsZW1lbnRhdGlvbnMgb2YgUXVlcnlJbnRlcmZhY2UgKEluIHRoZXNlCisgKiBjYXNlcywgIm11c3Qgc3VjY2VlZCIgbWVhbnMgIm11c3Qgc3VjY2VlZCBiYXJyaW5nIGNhdGFzdHJvcGhpYyBmYWlsdXJlLiIpOgorICoKKyAqICAqIFRoZSBzZXQgb2YgaW50ZXJmYWNlcyBhY2Nlc3NpYmxlIG9uIGFuIG9iamVjdCB0aHJvdWdoCisgKiAgICBJVW5rbm93bjo6UXVlcnlJbnRlcmZhY2UgbXVzdCBiZSBzdGF0aWMsIG5vdCBkeW5hbWljLiBUaGlzIG1lYW5zIHRoYXQKKyAqICAgIGlmIGEgY2FsbCB0byBRdWVyeUludGVyZmFjZSBmb3IgYSBwb2ludGVyIHRvIGEgc3BlY2lmaWVkIGludGVyZmFjZQorICogICAgc3VjY2VlZHMgdGhlIGZpcnN0IHRpbWUsIGl0IG11c3Qgc3VjY2VlZCBhZ2FpbiwgYW5kIGlmIGl0IGZhaWxzIHRoZQorICogICAgZmlyc3QgdGltZSwgaXQgbXVzdCBmYWlsIG9uIGFsbCBzdWJzZXF1ZW50IHF1ZXJpZXMuCisgKiAgKiBJdCBtdXN0IGJlIHN5bW1ldHJpYyB+VyBpZiBhIGNsaWVudCBob2xkcyBhIHBvaW50ZXIgdG8gYW4gaW50ZXJmYWNlIG9uCisgKiAgICBhbiBvYmplY3QsIGFuZCBxdWVyaWVzIGZvciB0aGF0IGludGVyZmFjZSwgdGhlIGNhbGwgbXVzdCBzdWNjZWVkLgorICogICogSXQgbXVzdCBiZSByZWZsZXhpdmUgflcgaWYgYSBjbGllbnQgaG9sZGluZyBhIHBvaW50ZXIgdG8gb25lIGludGVyZmFjZQorICogICAgcXVlcmllcyBzdWNjZXNzZnVsbHkgZm9yIGFub3RoZXIsIGEgcXVlcnkgdGhyb3VnaCB0aGUgb2J0YWluZWQgcG9pbnRlcgorICogICAgZm9yIHRoZSBmaXJzdCBpbnRlcmZhY2UgbXVzdCBzdWNjZWVkLgorICogICogSXQgbXVzdCBiZSB0cmFuc2l0aXZlIH5XIGlmIGEgY2xpZW50IGhvbGRpbmcgYSBwb2ludGVyIHRvIG9uZSBpbnRlcmZhY2UKKyAqICAgIHF1ZXJpZXMgc3VjY2Vzc2Z1bGx5IGZvciBhIHNlY29uZCwgYW5kIHRocm91Z2ggdGhhdCBwb2ludGVyIHF1ZXJpZXMKKyAqICAgIHN1Y2Nlc3NmdWxseSBmb3IgYSB0aGlyZCBpbnRlcmZhY2UsIGEgcXVlcnkgZm9yIHRoZSBmaXJzdCBpbnRlcmZhY2UKKyAqICAgIHRocm91Z2ggdGhlIHBvaW50ZXIgZm9yIHRoZSB0aGlyZCBpbnRlcmZhY2UgbXVzdCBzdWNjZWVkLgorICoKKyAqICBBcyB5b3UgY2FuIHNlZSwgdGhpcyBpbnRlcmZhY2UgZG9lc24ndCBxdWFsaWZ5IGJ1dCB3aWxsIG1vc3QgbGlrZWx5CisgKiAgYmUgZ29vZCBlbm91Z2ggZm9yIHRoZSB0aW1lIGJlaW5nLgorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfUXVlcnlJbnRlcmZhY2UKKyggTFBESVJFQ1RQTEFZTE9CQllBIHRoaXMsCisgIFJFRklJRCByaWlkLAorICBMUFZPSUQqIHBwdk9iaiApCit7CisgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsgCit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5V19RdWVyeUludGVyZmFjZQorKCBMUERJUkVDVFBMQVlMT0JCWSB0aGlzLAorICBSRUZJSUQgcmlpZCwKKyAgTFBWT0lEKiBwcHZPYmogKQoreworICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MkFfUXVlcnlJbnRlcmZhY2UKKyggTFBESVJFQ1RQTEFZTE9CQlkyQSB0aGlzLAorICBSRUZJSUQgcmlpZCwKKyAgTFBWT0lEKiBwcHZPYmogKQoreworICAvKiBDb21wYXJlIHJpaWRzLiBXZSBrbm93IHRoaXMgb2JqZWN0IGlzIGEgZGlyZWN0IHBsYXkgbG9iYnkgMkEgb2JqZWN0LgorICAgICBJZiB3ZSBhcmUgYXNraW5nIGFib3V0IHRoZSBzYW1lIHR5cGUgb2YgaW50ZXJmYWNlIHdlJ3JlIGZpbmUuCisgICAqLworICBpZiggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sIHJpaWQgKSAgfHwKKyAgICAgIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3RQbGF5TG9iYnkyQSwgcmlpZCApCisgICAgKQorICB7CisgICAgdGhpcy0+bHBWdGJsLT5mbkFkZFJlZiggdGhpcyApOworICAgICpwcHZPYmogPSB0aGlzOworICAgIHJldHVybiBTX09LOworICB9CisgIC8qIFRoZXkncmUgcmVxdWVzdGluZyBhIHVuaWNvZGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlICovCisgIGVsc2UgaWYoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3RQbGF5TG9iYnkyLCByaWlkICkgKQorICB7CisgICAgIExQRElSRUNUUExBWUxPQkJZMiBscERwTCA9IChMUERJUkVDVFBMQVlMT0JCWTIpKCpwcHZPYmopOworCisgICAgIGxwRHBMID0gKExQRElSRUNUUExBWUxPQkJZMilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIElEaXJlY3RQbGF5TG9iYnkyICkgKTsKKworICAgIGlmKCAhbHBEcEwgKQorICAgIHsKKyAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOworICAgIH0KKworICAgIGxwRHBMLT5scFZ0YmwgPSAmZGlyZWN0UGxheUxvYmJ5MldWVDsKKyAgICBscERwTC0+cmVmICAgID0gMTsKKworICAgIHJldHVybiBTX09LOworICB9CisKKyAgLyogVW5leHBlY3RlZCBpbnRlcmZhY2UgcmVxdWVzdCEgKi8gCisgICpwcHZPYmogPSBOVUxMOworICByZXR1cm4gRV9OT0lOVEVSRkFDRTsgCit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJXX1F1ZXJ5SW50ZXJmYWNlCiAoIExQRElSRUNUUExBWUxPQkJZMiB0aGlzLAogICBSRUZJSUQgcmlpZCwKICAgTFBWT0lEKiBwcHZPYmogKQogewotICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7Ci0gIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKLX0KIAotc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X0FkZFJlZgotKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcyApCisgIC8qIENvbXBhcmUgcmlpZHMuIFdlIGtub3cgdGhpcyBvYmplY3QgaXMgYSBkaXJlY3QgcGxheSBsb2JieSAyIG9iamVjdC4KKyAgICAgSWYgd2UgYXJlIGFza2luZyBhYm91dCB0aGUgc2FtZSB0eXBlIG9mIGludGVyZmFjZSB3ZSdyZSBmaW5lLgorICAgKi8KKyAgaWYoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByaWlkICkgfHwKKyAgICAgIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3RQbGF5TG9iYnkyLCByaWlkICkgCisgICAgKQorICB7CisgICAgdGhpcy0+bHBWdGJsLT5mbkFkZFJlZiggdGhpcyApOworICAgICpwcHZPYmogPSB0aGlzOworICAgIHJldHVybiBTX09LOworICB9CisgIGVsc2UgaWYoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3RQbGF5TG9iYnkyQSwgcmlpZCApICkKKyAgeworICAgICBMUERJUkVDVFBMQVlMT0JCWTJBIGxwRHBMID0gKExQRElSRUNUUExBWUxPQkJZMkEpKCpwcHZPYmopOworCisgICAgIGxwRHBMID0gKExQRElSRUNUUExBWUxPQkJZMkEpSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBJRGlyZWN0UGxheUxvYmJ5MkEgKSApOworCisgICAgaWYoICFscERwTCApCisgICAgeworICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisgICAgfQorCisgICAgbHBEcEwtPmxwVnRibCA9ICZkaXJlY3RQbGF5TG9iYnkyQVZUOworICAgIGxwRHBMLT5yZWYgICAgPSAxOworCisgICAgcmV0dXJuIFNfT0s7CisgIH0KKworICAvKiBVbmV4cGVjdGVkIGludGVyZmFjZSByZXF1ZXN0ISAqLworICAqcHB2T2JqID0gTlVMTDsKKyAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisKK307CisKKy8qIAorICogU2ltcGxlIHByb2NlZHVyZS4gSnVzdCBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0aGlzCisgKiBzdHJ1Y3R1cmUgYW5kIHJldHVybiB0aGUgbmV3IHJlZmVyZW5jZSBjb3VudC4KKyAqLworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5QV9BZGRSZWYKKyggTFBESVJFQ1RQTEFZTE9CQllBIHRoaXMgKQogewogICArKyh0aGlzLT5yZWYpOwotICBUUkFDRSggZHBsYXksIiByZWYgY291bnQgbm93ICVsZFxuIiwgdGhpcy0+cmVmICk7CisgIFRSQUNFKCBkcGxheSwicmVmIGNvdW50IG5vdyAlbHVcbiIsIHRoaXMtPnJlZiApOwogICByZXR1cm4gKHRoaXMtPnJlZik7CiB9CitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX0FkZFJlZgorKCBMUERJUkVDVFBMQVlMT0JCWSB0aGlzICkKK3sKKyAgcmV0dXJuIElEaXJlY3RQbGF5TG9iYnlBX0FkZFJlZiggKExQRElSRUNUUExBWUxPQkJZKSB0aGlzICk7Cit9CiAKLXN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdFBsYXlMb2JieV9SZWxlYXNlCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyQV9BZGRSZWYKKyggTFBESVJFQ1RQTEFZTE9CQlkyQSB0aGlzICkKK3sKKyAgcmV0dXJuIElEaXJlY3RQbGF5TG9iYnlBX0FkZFJlZiggKExQRElSRUNUUExBWUxPQkJZKSB0aGlzICk7Cit9OworCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyV19BZGRSZWYKICggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMgKQogeworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieUFfQWRkUmVmKCAoTFBESVJFQ1RQTEFZTE9CQlkpIHRoaXMgKTsKK307CisKKworLyoKKyAqIFNpbXBsZSBDT00gcHJvY2VkdXJlLiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIHRoaXMgb2JqZWN0LgorICogSWYgdGhlIG9iamVjdCBubyBsb25nZXIgaGFzIGFueSByZWZlcmVuY2UgY291bnRzLCBmcmVlIHVwIHRoZSBhc3NvY2lhdGVkCisgKiBtZW1vcnkuCisgKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfUmVsZWFzZQorKCBMUERJUkVDVFBMQVlMT0JCWUEgdGhpcyApCit7CisgIFRSQUNFKCBkcGxheSwgInJlZiBjb3VudCBkZWNyZW1lbmV0ZWQgZnJvbSAlbHVcbiIsIHRoaXMtPnJlZiApOworCiAgIHRoaXMtPnJlZi0tOwogCi0gIFRSQUNFKCBkcGxheSwgIiByZWYgY291bnQgbm93ICVsZFxuIiwgdGhpcy0+cmVmICk7Ci0gIAogICAvKiBEZWFsbG9jYXRlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KICAgaWYoICEodGhpcy0+cmVmKSApCiAgIHsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGhpcyApOyAKLSAgICByZXR1cm4gMDsKKyAgICBkZWxldGVEUENvbm5lY3Rpb24oIHRoaXMtPmxwU2Vzc2lvbiApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aGlzICk7CisgICAgcmV0dXJuIFNfT0s7CiAgIH0KIAogICByZXR1cm4gdGhpcy0+cmVmOworCiB9CitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX1JlbGVhc2UKKyggTFBESVJFQ1RQTEFZTE9CQlkgdGhpcyApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5QV9SZWxlYXNlKCAoTFBESVJFQ1RQTEFZTE9CQllBKSB0aGlzICk7Cit9CitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyQV9SZWxlYXNlCisoIExQRElSRUNUUExBWUxPQkJZMkEgdGhpcyApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5QV9SZWxlYXNlKCAoTFBESVJFQ1RQTEFZTE9CQllBKSB0aGlzICk7Cit9OworCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyV19SZWxlYXNlCisoIExQRElSRUNUUExBWUxPQkJZMiB0aGlzICkKK3sKKyAgcmV0dXJuIElEaXJlY3RQbGF5TG9iYnlBX1JlbGVhc2UoIChMUERJUkVDVFBMQVlMT0JCWUEpIHRoaXMgKTsKK307CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAKICAqIENvbm5lY3RzIGFuIGFwcGxpY2F0aW9uIHRvIHRoZSBzZXNzaW9uIHNwZWNpZmllZCBieSB0aGUgRFBMQ09OTkVDVElPTgogICogc3RydWN0dXJlIGN1cnJlbnRseSBzdG9yZWQgd2l0aCB0aGUgRGlyZWN0UGxheUxvYmJ5IG9iamVjdC4KICAqCi0gKiBSZXR1cm5zIGEgSURpcmVjdFBsYXkyIG9yIElEaXJlY3RQbGF5MkEgaW50ZXJmYWNlLgorICogUmV0dXJucyBhIElEaXJlY3RQbGF5IGludGVyZmFjZS4KICAqCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X0Nvbm5lY3QKLSggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfQ29ubmVjdAorKCBMUERJUkVDVFBMQVlMT0JCWUEgdGhpcywKICAgRFdPUkQgZHdGbGFncywKLSAgTFBESVJFQ1RQTEFZMiogbHBscERQLAorICBMUERJUkVDVFBMQVkqIGxwbHBEUCwKICAgSVVua25vd24qIHBVbmspCiB7Ci0gIEZJWE1FKCBkcGxheSwgIjpzdHViXG4iKTsKKyAgRklYTUUoIGRwbGF5LCAiOiBkd0ZsYWdzPSUwOGx4ICVwICVwIHN0dWJcbiIsIGR3RmxhZ3MsIGxwbHBEUCwgcFVuayApOwogICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Ci19Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJBX0Nvbm5lY3QKKyggTFBESVJFQ1RQTEFZTE9CQlkyQSB0aGlzLAorICBEV09SRCBkd0ZsYWdzLAorICBMUERJUkVDVFBMQVkqIGxwbHBEUCwKKyAgSVVua25vd24qIHBVbmspCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5QV9Db25uZWN0KCAoTFBESVJFQ1RQTEFZTE9CQllBKXRoaXMsIGR3RmxhZ3MsIGxwbHBEUCwgcFVuayApOworfTsKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX0Nvbm5lY3QKKyggTFBESVJFQ1RQTEFZTE9CQlkgdGhpcywKKyAgRFdPUkQgZHdGbGFncywKKyAgTFBESVJFQ1RQTEFZKiBscGxwRFAsCisgIElVbmtub3duKiBwVW5rKQoreworICBMUERJUkVDVFBMQVkyQSBkaXJlY3RQbGF5MkE7CisgIExQRElSRUNUUExBWTIgIGRpcmVjdFBsYXkyVzsKKyAgSFJFU1VMVCAgICAgICAgY3JlYXRlUkM7CisKKyAgRklYTUUoIGRwbGF5LCAiOiBkd0ZsYWdzPSUwOGx4ICVwICVwIHN0dWJcbiIsIGR3RmxhZ3MsIGxwbHBEUCwgcFVuayApOworCisjaWYgMAorCisgIC8qIFNlZSBkcGJ1aWxkXzQzMDEudHh0ICovCisgIC8qIENyZWF0ZSB0aGUgZGlyZWN0IHBsYXkgMiBXIGludGVyZmFjZSAqLworICBpZiggKCAoIGNyZWF0ZVJDID0gRGlyZWN0UGxheUNyZWF0ZSggTlVMTCwgJmRpcmVjdFBsYXkyQSwgcFVuayApICkgIT0gRFBfT0sgKSB8fAorICAgICAgKCAoIGNyZWF0ZVJDID0gZGlyZWN0UGxheTJBLT5scFZ0YmwtPmZuUXVlcnlJbnRlcmZhY2UKKyAgICAgICAgICAgKCBkaXJlY3RQbGF5MkEsIElJRF9JRGlyZWN0UGxheTIsICZkaXJlY3RQbGF5MlcgKSApICE9IERQX09LICkKKyAgICApCisgIHsKKyAgICAgRVJSKCBkcGxheSwgImVycm9yIGNyZWF0aW5nIERpcmVjdCBQbGF5IDIgKFcpIGludGVyZmFjZS4gUmV0dXJuIENvZGUgPSAlZC5cbiIsIGNyZWF0ZVJDICk7CisgICAgIHJldHVybiBjcmVhdGVSQzsKKyAgfQorCisgIC8qIEFsbCB0aGUgc3R1ZmYgYmVsb3cgdGhpcyBpcyBXUk9ORyEgKi8KKyAgaWYoIHRoaXMtPmxwU2Vzc2lvbi0+ZHdGbGFncyA9PSBEUExDT05ORUNUSU9OX0NSRUFURVNFU1NJT04gKQorICB7CisgICAgRFdPUkQgdGhyZWFkSWRTaW5rOworCisgICAgLyogU3Bhd24gYSB0aHJlYWQgdG8gZGVhbCB3aXRoIGFsbCBvZiB0aGlzIGFuZCB0byBoYW5kbGUgdGhlIGluY29tbWluZyByZXF1ZXN0cyAqLworICAgIHRocmVhZElkU2luayA9IENyZWF0ZVRocmVhZCggTlVMTCwgMCwgJkRQTG9iYnlfU3Bhd25fU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKXRoaXMtPmxwU2Vzc2lvbi0+bHBDb25uLT5scFNlc3Npb25EZXNjLCAwLCAmdGhyZWFkSWRTaW5rICk7ICAKKworICB9CisgIGVsc2UgaWYgKCB0aGlzLT5scFNlc3Npb24tPmR3RmxhZ3MgPT0gRFBMQ09OTkVDVElPTl9KT0lOU0VTU0lPTiApIAorICB7CisgICAgLyogTGV0J3Mgc2VhcmNoIGZvciBhIG1hdGNoaW5nIHNlc3Npb24gKi8KKyAgICBGSVhNRSggZHBsYXksICJqb2luaW5nIHNlc3Npb24gbm90IHlldCBzdXBwb3J0ZWQuXG4iKTsKKyAgICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7CisgIH0KKyAgZWxzZSAvKiBVbmtub3duIHR5cGUgb2YgY29ubmVjdGlvbiByZXF1ZXN0ICovCisgIHsKKyAgICAgRVJSKCBkcGxheSwgIjogVW5rbm93biBjb25uZWN0aW9uIHJlcXVlc3QgbHBDb25uLT5kd0ZsYWdzPSUwOGx4XG4iLAorICAgICAgICAgIGxwQ29ubi0+ZHdGbGFncyApOyAKKworICAgICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7CisgIH0KKworICAvKiBUaGlzIGRvZXMgdGhlIHdvcmsgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzLi4uCisgICAgIElEaXJlY3RQbGF5Mzo6SW5pdGlhbGl6ZUNvbm5lY3Rpb24sCisgICAgIElEaXJlY3RQbGF5Mzo6RW51bVNlc3Npb25zLAorICAgICBJRGlyZWN0UGxheTM6Ok9wZW4KKyAgICovCisgIAorCisjZW5kaWYKKworICByZXR1cm4gRFBfT0s7CisKK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MldfQ29ubmVjdAorKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcywKKyAgRFdPUkQgZHdGbGFncywKKyAgTFBESVJFQ1RQTEFZKiBscGxwRFAsCisgIElVbmtub3duKiBwVW5rKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieVdfQ29ubmVjdCggKExQRElSRUNUUExBWUxPQkJZKXRoaXMsIGR3RmxhZ3MsIGxwbHBEUCwgcFVuayApOyAKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc3LDggKzU2MCwyMSBAQAogICogaW50ZXJwcmV0IGFzIGEgbmV0d29yayBhZGRyZXNzLgogICoKICAqLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlfQ3JlYXRlQWRkcmVzcwotKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcywKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5QV9DcmVhdGVBZGRyZXNzCisoIExQRElSRUNUUExBWUxPQkJZIHRoaXMsCisgIFJFRkdVSUQgZ3VpZFNQLAorICBSRUZHVUlEIGd1aWREYXRhVHlwZSwKKyAgTFBDVk9JRCBscERhdGEsCisgIERXT1JEIGR3RGF0YVNpemUsCisgIExQVk9JRCBscEFkZHJlc3MsCisgIExQRFdPUkQgbHBkd0FkZHJlc3NTaXplICkKK3sKKyAgRklYTUUoIGRwbGF5LCAiOnN0dWJcbiIpOworICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJBX0NyZWF0ZUFkZHJlc3MKKyggTFBESVJFQ1RQTEFZTE9CQlkyQSB0aGlzLAogICBSRUZHVUlEIGd1aWRTUCwKICAgUkVGR1VJRCBndWlkRGF0YVR5cGUsCiAgIExQQ1ZPSUQgbHBEYXRhLCAKQEAgLTg2LDkgKzU4MiwzNyBAQAogICBMUFZPSUQgbHBBZGRyZXNzLCAKICAgTFBEV09SRCBscGR3QWRkcmVzc1NpemUgKQogeworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieUFfQ3JlYXRlQWRkcmVzcyggKExQRElSRUNUUExBWUxPQkJZKXRoaXMsIGd1aWRTUCwgZ3VpZERhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRGF0YSwgZHdEYXRhU2l6ZSwgbHBBZGRyZXNzLCBscGR3QWRkcmVzc1NpemUgKTsgCit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieVdfQ3JlYXRlQWRkcmVzcworKCBMUERJUkVDVFBMQVlMT0JCWSB0aGlzLAorICBSRUZHVUlEIGd1aWRTUCwKKyAgUkVGR1VJRCBndWlkRGF0YVR5cGUsCisgIExQQ1ZPSUQgbHBEYXRhLAorICBEV09SRCBkd0RhdGFTaXplLAorICBMUFZPSUQgbHBBZGRyZXNzLAorICBMUERXT1JEIGxwZHdBZGRyZXNzU2l6ZSApCit7CiAgIEZJWE1FKCBkcGxheSwgIjpzdHViXG4iKTsKICAgcmV0dXJuIERQRVJSX09VVE9GTUVNT1JZOwotfQorfTsKKworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJXX0NyZWF0ZUFkZHJlc3MKKyggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCisgIFJFRkdVSUQgZ3VpZFNQLAorICBSRUZHVUlEIGd1aWREYXRhVHlwZSwKKyAgTFBDVk9JRCBscERhdGEsCisgIERXT1JEIGR3RGF0YVNpemUsCisgIExQVk9JRCBscEFkZHJlc3MsCisgIExQRFdPUkQgbHBkd0FkZHJlc3NTaXplICkKK3sKKyAgcmV0dXJuIElEaXJlY3RQbGF5TG9iYnlXX0NyZWF0ZUFkZHJlc3MoIChMUERJUkVDVFBMQVlMT0JCWSl0aGlzLCBndWlkU1AsIGd1aWREYXRhVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscERhdGEsIGR3RGF0YVNpemUsIGxwQWRkcmVzcywgbHBkd0FkZHJlc3NTaXplICk7Cit9OworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTk2LDE2ICs2MjAsNTAgQEAKICAqIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aXRoIGxwQ29udGV4dCwgZm9yIGVhY2ggb2YgdGhlIGNodW5rcy4KICAqCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X0VudW1BZGRyZXNzCi0oIExQRElSRUNUUExBWUxPQkJZMiB0aGlzLAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlBX0VudW1BZGRyZXNzCisoIExQRElSRUNUUExBWUxPQkJZQSB0aGlzLAorICBMUERQRU5VTUFERFJFU1NDQUxMQkFDSyBscEVudW1BZGRyZXNzQ2FsbGJhY2ssCisgIExQQ1ZPSUQgbHBBZGRyZXNzLAorICBEV09SRCBkd0FkZHJlc3NTaXplLAorICBMUFZPSUQgbHBDb250ZXh0ICkKK3sKKyAgRklYTUUoIGRwbGF5LCAiOnN0dWJcbiIpOworICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJBX0VudW1BZGRyZXNzCisoIExQRElSRUNUUExBWUxPQkJZMkEgdGhpcywKICAgTFBEUEVOVU1BRERSRVNTQ0FMTEJBQ0sgbHBFbnVtQWRkcmVzc0NhbGxiYWNrLCAKICAgTFBDVk9JRCBscEFkZHJlc3MsCiAgIERXT1JEIGR3QWRkcmVzc1NpemUsIAogICBMUFZPSUQgbHBDb250ZXh0ICkKIHsKKyAgcmV0dXJuIElEaXJlY3RQbGF5TG9iYnlBX0VudW1BZGRyZXNzKCAoTFBESVJFQ1RQTEFZTE9CQllBKXRoaXMsIGxwRW51bUFkZHJlc3NDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEFkZHJlc3MsIGR3QWRkcmVzc1NpemUsIGxwQ29udGV4dCApOworfTsKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX0VudW1BZGRyZXNzCisoIExQRElSRUNUUExBWUxPQkJZIHRoaXMsCisgIExQRFBFTlVNQUREUkVTU0NBTExCQUNLIGxwRW51bUFkZHJlc3NDYWxsYmFjaywKKyAgTFBDVk9JRCBscEFkZHJlc3MsCisgIERXT1JEIGR3QWRkcmVzc1NpemUsCisgIExQVk9JRCBscENvbnRleHQgKQorewogICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKLX0KK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MldfRW51bUFkZHJlc3MKKyggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCisgIExQRFBFTlVNQUREUkVTU0NBTExCQUNLIGxwRW51bUFkZHJlc3NDYWxsYmFjaywKKyAgTFBDVk9JRCBscEFkZHJlc3MsCisgIERXT1JEIGR3QWRkcmVzc1NpemUsCisgIExQVk9JRCBscENvbnRleHQgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieVdfRW51bUFkZHJlc3MoIChMUERJUkVDVFBMQVlMT0JCWSl0aGlzLCBscEVudW1BZGRyZXNzQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBBZGRyZXNzLCBkd0FkZHJlc3NTaXplLCBscENvbnRleHQgKTsKK307CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTEzLDE2ICs2NzEsNTAgQEAKICAqIGJ1aWxkIHRoZSBEaXJlY3RQbGF5IEFkZHJlc3MuCiAgKgogICovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieV9FbnVtQWRkcmVzc1R5cGVzCi0oIExQRElSRUNUUExBWUxPQkJZMiB0aGlzLAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlBX0VudW1BZGRyZXNzVHlwZXMKKyggTFBESVJFQ1RQTEFZTE9CQllBIHRoaXMsCiAgIExQRFBMRU5VTUFERFJFU1NUWVBFU0NBTExCQUNLIGxwRW51bUFkZHJlc3NUeXBlQ2FsbGJhY2ssCi0gIFJFRkdVSUQgZ3VpZFNQLCAKKyAgUkVGR1VJRCBndWlkU1AsCiAgIExQVk9JRCBscENvbnRleHQsCiAgIERXT1JEIGR3RmxhZ3MgKQogewogICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKLX0KK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MkFfRW51bUFkZHJlc3NUeXBlcworKCBMUERJUkVDVFBMQVlMT0JCWTJBIHRoaXMsCisgIExQRFBMRU5VTUFERFJFU1NUWVBFU0NBTExCQUNLIGxwRW51bUFkZHJlc3NUeXBlQ2FsbGJhY2ssCisgIFJFRkdVSUQgZ3VpZFNQLCAKKyAgTFBWT0lEIGxwQ29udGV4dCwKKyAgRFdPUkQgZHdGbGFncyApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5QV9FbnVtQWRkcmVzc1R5cGVzKCAoTFBESVJFQ1RQTEFZTE9CQllBKXRoaXMsIGxwRW51bUFkZHJlc3NUeXBlQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkU1AsIGxwQ29udGV4dCwgZHdGbGFncyApOworfTsKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX0VudW1BZGRyZXNzVHlwZXMKKyggTFBESVJFQ1RQTEFZTE9CQlkgdGhpcywKKyAgTFBEUExFTlVNQUREUkVTU1RZUEVTQ0FMTEJBQ0sgbHBFbnVtQWRkcmVzc1R5cGVDYWxsYmFjaywKKyAgUkVGR1VJRCBndWlkU1AsCisgIExQVk9JRCBscENvbnRleHQsCisgIERXT1JEIGR3RmxhZ3MgKQoreworICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CisgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MldfRW51bUFkZHJlc3NUeXBlcworKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcywKKyAgTFBEUExFTlVNQUREUkVTU1RZUEVTQ0FMTEJBQ0sgbHBFbnVtQWRkcmVzc1R5cGVDYWxsYmFjaywKKyAgUkVGR1VJRCBndWlkU1AsCisgIExQVk9JRCBscENvbnRleHQsCisgIERXT1JEIGR3RmxhZ3MgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieVdfRW51bUFkZHJlc3NUeXBlcyggKExQRElSRUNUUExBWUxPQkJZKXRoaXMsIGxwRW51bUFkZHJlc3NUeXBlQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkU1AsIGxwQ29udGV4dCwgZHdGbGFncyApOworfTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMzAsMTUgKzcyMiw0NiBAQAogICogaW52b2tpbmcgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggbHBDb250ZXh0LgogICoKICAqLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlfRW51bUxvY2FsQXBwbGljYXRpb25zCi0oIExQRElSRUNUUExBWUxPQkJZMiB0aGlzLAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX0VudW1Mb2NhbEFwcGxpY2F0aW9ucworKCBMUERJUkVDVFBMQVlMT0JCWSB0aGlzLAogICBMUERQTEVOVU1MT0NBTEFQUExJQ0FUSU9OU0NBTExCQUNLIGEsCiAgIExQVk9JRCBscENvbnRleHQsCiAgIERXT1JEIGR3RmxhZ3MgKQogewogICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKLX0KK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MldfRW51bUxvY2FsQXBwbGljYXRpb25zCisoIExQRElSRUNUUExBWUxPQkJZMiB0aGlzLAorICBMUERQTEVOVU1MT0NBTEFQUExJQ0FUSU9OU0NBTExCQUNLIGEsCisgIExQVk9JRCBscENvbnRleHQsCisgIERXT1JEIGR3RmxhZ3MgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieVdfRW51bUxvY2FsQXBwbGljYXRpb25zKCAoTFBESVJFQ1RQTEFZTE9CQlkpdGhpcywgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDb250ZXh0LCBkd0ZsYWdzICk7IAorfTsKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlBX0VudW1Mb2NhbEFwcGxpY2F0aW9ucworKCBMUERJUkVDVFBMQVlMT0JCWUEgdGhpcywKKyAgTFBEUExFTlVNTE9DQUxBUFBMSUNBVElPTlNDQUxMQkFDSyBhLAorICBMUFZPSUQgbHBDb250ZXh0LAorICBEV09SRCBkd0ZsYWdzICkKK3sKKyAgRklYTUUoIGRwbGF5LCAiOnN0dWJcbiIpOworICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJBX0VudW1Mb2NhbEFwcGxpY2F0aW9ucworKCBMUERJUkVDVFBMQVlMT0JCWTJBIHRoaXMsCisgIExQRFBMRU5VTUxPQ0FMQVBQTElDQVRJT05TQ0FMTEJBQ0sgYSwKKyAgTFBWT0lEIGxwQ29udGV4dCwKKyAgRFdPUkQgZHdGbGFncyApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5QV9FbnVtTG9jYWxBcHBsaWNhdGlvbnMoIChMUERJUkVDVFBMQVlMT0JCWUEpdGhpcywgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDb250ZXh0LCBkd0ZsYWdzICk7IAorfTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNTAsMTYgKzc3Myw1OCBAQAogICogICAgICAgIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSBhbGxvY2F0ZWQgYnkgb3VyIGNhbGxlciB3aGljaCBjYW4gdGhlbgogICogICAgICAgIGNhbGwgdGhpcyBwcm9jZWR1cmUvbWV0aG9kIGFnYWluIHdpdGggYSB2YWxpZCBkYXRhIHBvaW50ZXIuCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X0dldENvbm5lY3Rpb25TZXR0aW5ncwotKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcywKLSAgRFdPUkQgZHdBcHBJRCwgCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfR2V0Q29ubmVjdGlvblNldHRpbmdzCisoIExQRElSRUNUUExBWUxPQkJZQSB0aGlzLAorICBEV09SRCBkd0FwcElELAogICBMUFZPSUQgbHBEYXRhLAogICBMUERXT1JEIGxwZHdEYXRhU2l6ZSApCiB7Ci0gIExQRFBMQ09OTkVDVElPTiBscENvbm5lY3Rpb25TZXR0aW5nczsKKyAgRklYTUUoIGRwbGF5LCAiOiBzZW1pIHN0dWIgJXAgJTA4bHggJXAgJXAgXG4iLCB0aGlzLCBkd0FwcElELCBscERhdGEsIGxwZHdEYXRhU2l6ZSApOworIAorICAvKiBBcHBsaWNhdGlvbiBpcyByZXF1ZXN0aW5nIHVzIHRvIGdpdmUgdGhlIHJlcXVpcmVkIHNpemUgKi8KKyAgaWYgKCAhbHBEYXRhICkKKyAgeworICAgIC8qIExldCdzIGNoZWNrIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCB0aGUgYXBwbGljYXRpb24gaGFzIGFsbG9jYXRlZCAqLworICAgIGlmKCAqbHBkd0RhdGFTaXplID49IHNpemVvZiggRFBMQ09OTkVDVElPTiApICkKKyAgICB7CisgICAgICByZXR1cm4gRFBfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAqbHBkd0RhdGFTaXplID0gc2l6ZW9mKCBEUExDT05ORUNUSU9OICk7CisgICAgICByZXR1cm4gRFBFUlJfQlVGRkVSVE9PU01BTEw7CisgICAgfQorICB9CiAKKyAgLyogRmlsbCBpbiB0aGUgZmllbGRzIC0gbGV0IHRoZW0ganVzdCB1c2UgdGhlIHB0cnMgKi8KKyAgaWYoICgoTFBEUExDT05ORUNUSU9OKWxwRGF0YSktPmxwU2Vzc2lvbkRlc2MgKQorICB7CisgICAgCisgIH0KKyAgbWVtY3B5KCBscERhdGEsIHRoaXMtPmxwU2Vzc2lvbiwgc2l6ZW9mKCAqKHRoaXMtPmxwU2Vzc2lvbikgKSApOworCisgIHJldHVybiBEUF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyQV9HZXRDb25uZWN0aW9uU2V0dGluZ3MKKyggTFBESVJFQ1RQTEFZTE9CQlkyQSB0aGlzLAorICBEV09SRCBkd0FwcElELAorICBMUFZPSUQgbHBEYXRhLAorICBMUERXT1JEIGxwZHdEYXRhU2l6ZSApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5QV9HZXRDb25uZWN0aW9uU2V0dGluZ3MoIChMUERJUkVDVFBMQVlMT0JCWUEpdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdBcHBJRCwgbHBEYXRhLCBscGR3RGF0YVNpemUgKTsgCit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5V19HZXRDb25uZWN0aW9uU2V0dGluZ3MKKyggTFBESVJFQ1RQTEFZTE9CQlkgdGhpcywKKyAgRFdPUkQgZHdBcHBJRCwKKyAgTFBWT0lEIGxwRGF0YSwKKyAgTFBEV09SRCBscGR3RGF0YVNpemUgKQorewogICBGSVhNRSggZHBsYXksICI6c2VtaSBzdHViICVwICUwOGx4ICVwICVwIFxuIiwgdGhpcywgZHdBcHBJRCwgbHBEYXRhLCBscGR3RGF0YVNpemUgKTsKIAorICAvKiBBcHBsaWNhdGlvbiBpcyByZXF1ZXN0aW5nIHVzIHRvIGdpdmUgdGhlIHJlcXVpcmVkIHNpemUgKi8gCiAgIGlmICggIWxwRGF0YSApCiAgIHsKICAgICAvKiBMZXQncyBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbGxvY2F0ZWQgKi8KQEAgLTE3NCwxMiArODM5LDIwIEBACiAgICAgfQogICB9CiAKLSAgLyogT2sgd2UgYXNzdW1lIHRoYXQgd2UndmUgYmVlbiBnaXZlbiBhIGJ1ZmZlciB0aGF0IGlzIGxhcmdlIGVub3VnaCBmb3Igb3VyIG5lZWRzICovCi0gIGxwQ29ubmVjdGlvblNldHRpbmdzID0gKCBMUERQTENPTk5FQ1RJT04gKSBscERhdGE7IAorICAvKiBGaWxsIGluIHRoZSBmaWVsZHMgLSBsZXQgdGhlbSBqdXN0IHVzZSB0aGUgcHRycyAqLworICBtZW1jcHkoIGxwRGF0YSwgdGhpcy0+bHBTZXNzaW9uLCBzaXplb2YoICoodGhpcy0+bHBTZXNzaW9uKSApICk7CiAKLSAgLyogRmlsbCBpbiB0aGUgZmllbGRzICovCisgIHJldHVybiBEUF9PSzsKK307CiAKLSAgcmV0dXJuIERQRVJSX05PVExPQkJJRUQ7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJXX0dldENvbm5lY3Rpb25TZXR0aW5ncworKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcywKKyAgRFdPUkQgZHdBcHBJRCwKKyAgTFBWT0lEIGxwRGF0YSwKKyAgTFBEV09SRCBscGR3RGF0YVNpemUgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieVdfR2V0Q29ubmVjdGlvblNldHRpbmdzKCAoTFBESVJFQ1RQTEFZTE9CQlkpdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdBcHBJRCwgbHBEYXRhLCBscGR3RGF0YVNpemUgKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODgsOCArODYxLDggQEAKICAqIGFwcGxpY2F0aW9uLiBBbGwgbWVzc2FnZXMgYXJlIHF1ZXVlZCB1bnRpbCByZWNlaXZlZC4KICAqCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X1JlY2VpdmVMb2JieU1lc3NhZ2UKLSggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfUmVjZWl2ZUxvYmJ5TWVzc2FnZQorKCBMUERJUkVDVFBMQVlMT0JCWUEgdGhpcywKICAgRFdPUkQgZHdGbGFncywKICAgRFdPUkQgZHdBcHBJRCwKICAgTFBEV09SRCBscGR3TWVzc2FnZUZsYWdzLApAQCAtMTk5LDcgKzg3Miw0NSBAQAogICBGSVhNRSggZHBsYXksICI6c3R1YiAlcCAlMDhseCAlMDhseCAlcCAlcCAlcFxuIiwgdGhpcywgZHdGbGFncywgZHdBcHBJRCwgbHBkd01lc3NhZ2VGbGFncywgbHBEYXRhLAogICAgICAgICAgbHBkd0RhdGFTaXplICk7CiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKLX0KK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MkFfUmVjZWl2ZUxvYmJ5TWVzc2FnZQorKCBMUERJUkVDVFBMQVlMT0JCWTJBIHRoaXMsCisgIERXT1JEIGR3RmxhZ3MsCisgIERXT1JEIGR3QXBwSUQsCisgIExQRFdPUkQgbHBkd01lc3NhZ2VGbGFncywKKyAgTFBWT0lEIGxwRGF0YSwKKyAgTFBEV09SRCBscGR3RGF0YVNpemUgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieUFfUmVjZWl2ZUxvYmJ5TWVzc2FnZSggKExQRElSRUNUUExBWUxPQkJZQSl0aGlzLCBkd0ZsYWdzLCBkd0FwcElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwZHdNZXNzYWdlRmxhZ3MsIGxwRGF0YSwgbHBkd0RhdGFTaXplICk7Cit9OworCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5V19SZWNlaXZlTG9iYnlNZXNzYWdlCisoIExQRElSRUNUUExBWUxPQkJZIHRoaXMsCisgIERXT1JEIGR3RmxhZ3MsCisgIERXT1JEIGR3QXBwSUQsCisgIExQRFdPUkQgbHBkd01lc3NhZ2VGbGFncywKKyAgTFBWT0lEIGxwRGF0YSwKKyAgTFBEV09SRCBscGR3RGF0YVNpemUgKQoreworICBGSVhNRSggZHBsYXksICI6c3R1YiAlcCAlMDhseCAlMDhseCAlcCAlcCAlcFxuIiwgdGhpcywgZHdGbGFncywgZHdBcHBJRCwgbHBkd01lc3NhZ2VGbGFncywgbHBEYXRhLAorICAgICAgICAgbHBkd0RhdGFTaXplICk7CisgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MldfUmVjZWl2ZUxvYmJ5TWVzc2FnZQorKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcywKKyAgRFdPUkQgZHdGbGFncywKKyAgRFdPUkQgZHdBcHBJRCwKKyAgTFBEV09SRCBscGR3TWVzc2FnZUZsYWdzLAorICBMUFZPSUQgbHBEYXRhLAorICBMUERXT1JEIGxwZHdEYXRhU2l6ZSApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5V19SZWNlaXZlTG9iYnlNZXNzYWdlKCAoTFBESVJFQ1RQTEFZTE9CQlkpdGhpcywgZHdGbGFncywgZHdBcHBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3TWVzc2FnZUZsYWdzLCBscERhdGEsIGxwZHdEYXRhU2l6ZSApOworfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjA3LDggKzkxOCw4IEBACiAgKiBjb25uZWN0IHRvIGEgc2Vzc2lvbi4KICAqCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X1J1bkFwcGxpY2F0aW9uCi0oIExQRElSRUNUUExBWUxPQkJZMiB0aGlzLAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlBX1J1bkFwcGxpY2F0aW9uCisoIExQRElSRUNUUExBWUxPQkJZQSB0aGlzLAogICBEV09SRCBkd0ZsYWdzLAogICBMUERXT1JEIGxwZHdBcHBJRCwKICAgTFBEUExDT05ORUNUSU9OIGxwQ29ubiwKQEAgLTIxNiw3ICs5MjcsNDEgQEAKIHsKICAgRklYTUUoIGRwbGF5LCAiOnN0dWJcbiIpOwogICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Ci19Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJBX1J1bkFwcGxpY2F0aW9uCisoIExQRElSRUNUUExBWUxPQkJZMkEgdGhpcywKKyAgRFdPUkQgZHdGbGFncywKKyAgTFBEV09SRCBscGR3QXBwSUQsCisgIExQRFBMQ09OTkVDVElPTiBscENvbm4sCisgIEhBTkRMRTMyIGhSZWNlaXZlRXZlbnQgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieUFfUnVuQXBwbGljYXRpb24oIChMUERJUkVDVFBMQVlMT0JCWUEpdGhpcywgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3QXBwSUQsIGxwQ29ubiwgaFJlY2VpdmVFdmVudCApOworfTsKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX1J1bkFwcGxpY2F0aW9uCisoIExQRElSRUNUUExBWUxPQkJZIHRoaXMsCisgIERXT1JEIGR3RmxhZ3MsCisgIExQRFdPUkQgbHBkd0FwcElELAorICBMUERQTENPTk5FQ1RJT04gbHBDb25uLAorICBIQU5ETEUzMiBoUmVjZWl2ZUV2ZW50ICkKK3sKKyAgRklYTUUoIGRwbGF5LCAiOnN0dWJcbiIpOworICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJXX1J1bkFwcGxpY2F0aW9uCisoIExQRElSRUNUUExBWUxPQkJZMiB0aGlzLAorICBEV09SRCBkd0ZsYWdzLAorICBMUERXT1JEIGxwZHdBcHBJRCwKKyAgTFBEUExDT05ORUNUSU9OIGxwQ29ubiwKKyAgSEFORExFMzIgaFJlY2VpdmVFdmVudCApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5V19SdW5BcHBsaWNhdGlvbiggKExQRElSRUNUUExBWUxPQkJZKXRoaXMsIGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd0FwcElELCBscENvbm4sIGhSZWNlaXZlRXZlbnQgKTsKK307CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjI0LDggKzk2OSw4IEBACiAgKiBBbGwgbWVzc2FnZXMgYXJlIHF1ZXVlZCB1bnRpbCByZWNlaXZlZC4KICAqCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X1NlbmRMb2JieU1lc3NhZ2UKLSggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfU2VuZExvYmJ5TWVzc2FnZQorKCBMUERJUkVDVFBMQVlMT0JCWUEgdGhpcywKICAgRFdPUkQgZHdGbGFncywKICAgRFdPUkQgZHdBcHBJRCwKICAgTFBWT0lEIGxwRGF0YSwKQEAgLTIzMyw3ICs5NzgsNDEgQEAKIHsKICAgRklYTUUoIGRwbGF5LCAiOnN0dWJcbiIpOwogICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7Ci19Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJBX1NlbmRMb2JieU1lc3NhZ2UKKyggTFBESVJFQ1RQTEFZTE9CQlkyQSB0aGlzLAorICBEV09SRCBkd0ZsYWdzLAorICBEV09SRCBkd0FwcElELAorICBMUFZPSUQgbHBEYXRhLAorICBEV09SRCBkd0RhdGFTaXplICkKK3sKKyAgcmV0dXJuIElEaXJlY3RQbGF5TG9iYnlBX1NlbmRMb2JieU1lc3NhZ2UoIChMUERJUkVDVFBMQVlMT0JCWUEpdGhpcywgZHdGbGFncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0FwcElELCBscERhdGEsIGR3RGF0YVNpemUgKTsgCit9OworCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5V19TZW5kTG9iYnlNZXNzYWdlCisoIExQRElSRUNUUExBWUxPQkJZIHRoaXMsCisgIERXT1JEIGR3RmxhZ3MsCisgIERXT1JEIGR3QXBwSUQsCisgIExQVk9JRCBscERhdGEsCisgIERXT1JEIGR3RGF0YVNpemUgKQoreworICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CisgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MldfU2VuZExvYmJ5TWVzc2FnZQorKCBMUERJUkVDVFBMQVlMT0JCWTIgdGhpcywKKyAgRFdPUkQgZHdGbGFncywKKyAgRFdPUkQgZHdBcHBJRCwKKyAgTFBWT0lEIGxwRGF0YSwKKyAgRFdPUkQgZHdEYXRhU2l6ZSApCit7CisgIHJldHVybiBJRGlyZWN0UGxheUxvYmJ5V19TZW5kTG9iYnlNZXNzYWdlKCAoTFBESVJFQ1RQTEFZTE9CQlkpdGhpcywgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0FwcElELCBscERhdGEsIGR3RGF0YVNpemUgKTsKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI0MSw0NiArMTAyMCwxNDEgQEAKICAqIG5lZWRlZCB0byBzdGFydCBhbmQgY29ubmVjdCBhbiBhcHBsaWNhdGlvbi4KICAqCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X1NldENvbm5lY3Rpb25TZXR0aW5ncworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX1NldENvbm5lY3Rpb25TZXR0aW5ncworKCBMUERJUkVDVFBMQVlMT0JCWSB0aGlzLAorICBEV09SRCBkd0ZsYWdzLAorICBEV09SRCBkd0FwcElELAorICBMUERQTENPTk5FQ1RJT04gbHBDb25uICkKK3sKKyAgRklYTUUoIGRwbGF5LCAiOiB0aGlzPSVwLCBkd0ZsYWdzPSUwOGx4LCBkd0FwcElkPSUwOGx4LCBscENvbm49JXA6IHNlbWkgc3R1YlxuIiwKKyAgICAgICAgIHRoaXMsIGR3RmxhZ3MsIGR3QXBwSUQsIGxwQ29ubiApOworCisgIC8qIFBhcmFtYXRlciBjaGVjayAqLworICBpZiggZHdGbGFncyB8fCAhdGhpcyB8fCAhbHBDb25uICkKKyAgeworICAgIEVSUiggZHBsYXksICJpbnZhbGlkIHBhcmFtZXRlcnMuXG4iKTsKKyAgICByZXR1cm4gRFBFUlJfSU5WQUxJRFBBUkFNUzsKKyAgfQorCisgIC8qIFNlZSBpZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KKyAgICogZHdBcHBJRCA9PSAwIGluZGljYXRlcyB0aGF0IHRoaXMgcmVxdWVzdCBpc24ndCBhc3NvY2lhdGVkIHdpdGggYSBjb25uZWN0aW9uLgorICAgKi8KKyAgaWYoIGR3QXBwSUQgKQorICB7CisgICAgIEZJWE1FKCBkcGxheSwgIjogQ29ubmVjdGlvbiBkd0FwcElEPSUwOGx4IGdpdmVuLiBOb3QgaW1wbGVtZW50ZWQgeWV0LlxuIiwKKyAgICAgICAgICAgIGR3QXBwSUQgKTsKKworICAgICAvKiBOZWVkIHRvIGFkZCBhIGNoZWNrIGZvciB0aGlzIGFwcGxpY2F0aW9uIElkLi4uKi8KKyAgICAgcmV0dXJuIERQRVJSX05PVExPQkJJRUQ7CisgIH0KKworICBpZiggIGxwQ29ubi0+ZHdTaXplICE9IHNpemVvZihEUExDT05ORUNUSU9OKSApCisgIHsKKyAgICBFUlIoIGRwbGF5LCAiOiBvbGQvbmV3IERQTENPTk5FQ1RJT04gdHlwZT8gU2l6ZT0lMDhseCB2cy4gZXhwZWN0ZWQ9JXVsIGJ5dGVzXG4iLCAKKyAgICAgICAgIGxwQ29ubi0+ZHdTaXplLCBzaXplb2YoIERQTENPTk5FQ1RJT04gKSApOworICAgIHJldHVybiBEUEVSUl9JTlZBTElEUEFSQU1TOworICB9CisKKyAgLyogTmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGUgbHBDb25uLT5scFNlc3Npb25EZXNjIHRvIGZpZ3VyZSBvdXQKKyAgICogd2hhdCB0eXBlIG9mIHNlc3Npb24gd2UgbmVlZCB0byBqb2luL2NyZWF0ZS4KKyAgICovCisgIGlmKCAgKCFscENvbm4tPmxwU2Vzc2lvbkRlc2MgKSB8fCAKKyAgICAgICAoIGxwQ29ubi0+bHBTZXNzaW9uRGVzYy0+ZHdTaXplICE9IHNpemVvZiggRFBTRVNTSU9OREVTQzIgKSApCisgICAgKQorICB7CisgICAgRVJSKCBkcGxheSwgIkRQU0VTU0lPTkRFU0MgcGFzc2VkIGluPyBTaXplPSUwOGx4IHZzLiBleHBlY3RlZD0ldWwgYnl0ZXNcbiIsCisgICAgICAgICBscENvbm4tPmxwU2Vzc2lvbkRlc2MtPmR3U2l6ZSwgc2l6ZW9mKCBEUFNFU1NJT05ERVNDMiApICk7CisgICAgcmV0dXJuIERQRVJSX0lOVkFMSURQQVJBTVM7CisgIH0KKworICAvKiBOZWVkIHRvIGFjdHVhbGx5IHN0b3JlIHRoZSBzdHVmZiBoZXJlICovCisKKyAgcmV0dXJuIERQRVJSX09VVE9GTUVNT1JZOworfTsKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyV19TZXRDb25uZWN0aW9uU2V0dGluZ3MKICggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCiAgIERXT1JEIGR3RmxhZ3MsCiAgIERXT1JEIGR3QXBwSUQsCiAgIExQRFBMQ09OTkVDVElPTiBscENvbm4gKQogeworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieVdfU2V0Q29ubmVjdGlvblNldHRpbmdzKCAoTFBESVJFQ1RQTEFZTE9CQlkpdGhpcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MsIGR3QXBwSUQsIGxwQ29ubiApOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfU2V0Q29ubmVjdGlvblNldHRpbmdzCisoIExQRElSRUNUUExBWUxPQkJZQSB0aGlzLAorICBEV09SRCBkd0ZsYWdzLAorICBEV09SRCBkd0FwcElELAorICBMUERQTENPTk5FQ1RJT04gbHBDb25uICkKK3sKICAgRklYTUUoIGRwbGF5LCAiOiB0aGlzPSVwLCBkd0ZsYWdzPSUwOGx4LCBkd0FwcElkPSUwOGx4LCBscENvbm49JXA6IHN0dWJcbiIsCiAgICAgICAgICB0aGlzLCBkd0ZsYWdzLCBkd0FwcElELCBscENvbm4gKTsKLQotICAvKiBQYXJhbWF0ZXIgY2hlY2sgKi8KLSAgaWYoIGR3RmxhZ3MgfHwgIXRoaXMgfHwgIWxwQ29ubiApCi0gIHsKLSAgICByZXR1cm4gRFBFUlJfSU5WQUxJRFBBUkFNUzsKLSAgfQotCi0gIGlmKCAhKCBscENvbm4tPmR3U2l6ZSA9PSBzaXplb2YoRFBMQ09OTkVDVElPTikgKSApCi0gIHsKLSAgICAvKiBJcyB0aGlzIHRoZSByaWdodCByZXR1cm4gY29kZT8gKi8KLSAgICByZXR1cm4gRFBFUlJfSU5WQUxJRFBBUkFNUzsKLSAgfQotCiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyQV9TZXRDb25uZWN0aW9uU2V0dGluZ3MKKyggTFBESVJFQ1RQTEFZTE9CQlkyQSB0aGlzLAorICBEV09SRCBkd0ZsYWdzLAorICBEV09SRCBkd0FwcElELAorICBMUERQTENPTk5FQ1RJT04gbHBDb25uICkKK3sKKyAgcmV0dXJuIElEaXJlY3RQbGF5TG9iYnlBX1NldENvbm5lY3Rpb25TZXR0aW5ncyggKExQRElSRUNUUExBWUxPQkJZQSl0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzLCBkd0FwcElELCBscENvbm4gKTsKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFJlZ2lzdGVycyBhbiBldmVudCB0aGF0IHdpbGwgYmUgc2V0IHdoZW4gYSBsb2JieSBtZXNzYWdlIGlzIHJlY2VpdmVkLgogICoKICAqLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlfU2V0TG9iYnlNZXNzYWdlRXZlbnQKLSggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieUFfU2V0TG9iYnlNZXNzYWdlRXZlbnQKKyggTFBESVJFQ1RQTEFZTE9CQllBIHRoaXMsCiAgIERXT1JEIGR3RmxhZ3MsCiAgIERXT1JEIGR3QXBwSUQsCiAgIEhBTkRMRTMyIGhSZWNlaXZlRXZlbnQgKQogewogICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKLX0KK307CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5X0NyZWF0ZUNvbXBvdW5kQWRkcmVzcworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyQV9TZXRMb2JieU1lc3NhZ2VFdmVudAorKCBMUERJUkVDVFBMQVlMT0JCWTJBIHRoaXMsCisgIERXT1JEIGR3RmxhZ3MsCisgIERXT1JEIGR3QXBwSUQsCisgIEhBTkRMRTMyIGhSZWNlaXZlRXZlbnQgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieUFfU2V0TG9iYnlNZXNzYWdlRXZlbnQoIChMUERJUkVDVFBMQVlMT0JCWUEpdGhpcywgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0FwcElELCBoUmVjZWl2ZUV2ZW50ICk7IAorfTsKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnlXX1NldExvYmJ5TWVzc2FnZUV2ZW50CisoIExQRElSRUNUUExBWUxPQkJZIHRoaXMsCisgIERXT1JEIGR3RmxhZ3MsCisgIERXT1JEIGR3QXBwSUQsCisgIEhBTkRMRTMyIGhSZWNlaXZlRXZlbnQgKQoreworICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CisgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKK307CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0UGxheUxvYmJ5MldfU2V0TG9iYnlNZXNzYWdlRXZlbnQKKyggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCisgIERXT1JEIGR3RmxhZ3MsCisgIERXT1JEIGR3QXBwSUQsCisgIEhBTkRMRTMyIGhSZWNlaXZlRXZlbnQgKQoreworICByZXR1cm4gSURpcmVjdFBsYXlMb2JieVdfU2V0TG9iYnlNZXNzYWdlRXZlbnQoIChMUERJUkVDVFBMQVlMT0JCWSl0aGlzLCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3QXBwSUQsIGhSZWNlaXZlRXZlbnQgKTsgCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlZ2lzdGVycyBhbiBldmVudCB0aGF0IHdpbGwgYmUgc2V0IHdoZW4gYSBsb2JieSBtZXNzYWdlIGlzIHJlY2VpdmVkLgorICoKKyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RQbGF5TG9iYnkyV19DcmVhdGVDb21wb3VuZEFkZHJlc3MKICggTFBESVJFQ1RQTEFZTE9CQlkyIHRoaXMsCiAgIExQQ0RQQ09NUE9VTkRBRERSRVNTRUxFTUVOVCBscEVsZW1lbnRzLAogICBEV09SRCBkd0VsZW1lbnRDb3VudCwKQEAgLTI4OSwyNSArMTE2Myw5MyBAQAogewogICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKLX0KK307CiAKLS8qIERpcmVjdCBQbGF5IExvYmJ5IDIgVmlydHVhbCBUYWJsZSBmb3IgbWV0aG9kcyAqLwotc3RhdGljIHN0cnVjdCB0YWdMUERJUkVDVFBMQVlMT0JCWTJfVlRBQkxFIGxvYmJ5MlZUID0gewotICBJRGlyZWN0UGxheUxvYmJ5X1F1ZXJ5SW50ZXJmYWNlLAotICBJRGlyZWN0UGxheUxvYmJ5X0FkZFJlZiwgCi0gIElEaXJlY3RQbGF5TG9iYnlfUmVsZWFzZSwKLSAgSURpcmVjdFBsYXlMb2JieV9Db25uZWN0LAotICBJRGlyZWN0UGxheUxvYmJ5X0NyZWF0ZUFkZHJlc3MsCi0gIElEaXJlY3RQbGF5TG9iYnlfRW51bUFkZHJlc3MsCi0gIElEaXJlY3RQbGF5TG9iYnlfRW51bUFkZHJlc3NUeXBlcywKLSAgSURpcmVjdFBsYXlMb2JieV9FbnVtTG9jYWxBcHBsaWNhdGlvbnMsCi0gIElEaXJlY3RQbGF5TG9iYnlfR2V0Q29ubmVjdGlvblNldHRpbmdzLAotICBJRGlyZWN0UGxheUxvYmJ5X1JlY2VpdmVMb2JieU1lc3NhZ2UsCi0gIElEaXJlY3RQbGF5TG9iYnlfUnVuQXBwbGljYXRpb24sCi0gIElEaXJlY3RQbGF5TG9iYnlfU2VuZExvYmJ5TWVzc2FnZSwKLSAgSURpcmVjdFBsYXlMb2JieV9TZXRDb25uZWN0aW9uU2V0dGluZ3MsCi0gIElEaXJlY3RQbGF5TG9iYnlfU2V0TG9iYnlNZXNzYWdlRXZlbnQsCi0gIElEaXJlY3RQbGF5TG9iYnlfQ3JlYXRlQ29tcG91bmRBZGRyZXNzCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFBsYXlMb2JieTJBX0NyZWF0ZUNvbXBvdW5kQWRkcmVzcworKCBMUERJUkVDVFBMQVlMT0JCWTJBIHRoaXMsCisgIExQQ0RQQ09NUE9VTkRBRERSRVNTRUxFTUVOVCBscEVsZW1lbnRzLAorICBEV09SRCBkd0VsZW1lbnRDb3VudCwKKyAgTFBWT0lEIGxwQWRkcmVzcywKKyAgTFBEV09SRCBscGR3QWRkcmVzc1NpemUgKQoreworICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CisgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKK307CisKKworLyogRGlyZWN0IFBsYXkgTG9iYnkgMSAoYXNjaWkpIFZpcnR1YWwgVGFibGUgZm9yIG1ldGhvZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFnTFBESVJFQ1RQTEFZTE9CQllfVlRBQkxFIGRpcmVjdFBsYXlMb2JieUFWVCA9IHsKKyAgSURpcmVjdFBsYXlMb2JieUFfUXVlcnlJbnRlcmZhY2UsCisgIElEaXJlY3RQbGF5TG9iYnlBX0FkZFJlZiwKKyAgSURpcmVjdFBsYXlMb2JieUFfUmVsZWFzZSwKKyAgSURpcmVjdFBsYXlMb2JieUFfQ29ubmVjdCwKKyAgSURpcmVjdFBsYXlMb2JieUFfQ3JlYXRlQWRkcmVzcywKKyAgSURpcmVjdFBsYXlMb2JieUFfRW51bUFkZHJlc3MsCisgIElEaXJlY3RQbGF5TG9iYnlBX0VudW1BZGRyZXNzVHlwZXMsCisgIElEaXJlY3RQbGF5TG9iYnlBX0VudW1Mb2NhbEFwcGxpY2F0aW9ucywKKyAgSURpcmVjdFBsYXlMb2JieUFfR2V0Q29ubmVjdGlvblNldHRpbmdzLAorICBJRGlyZWN0UGxheUxvYmJ5QV9SZWNlaXZlTG9iYnlNZXNzYWdlLAorICBJRGlyZWN0UGxheUxvYmJ5QV9SdW5BcHBsaWNhdGlvbiwKKyAgSURpcmVjdFBsYXlMb2JieUFfU2VuZExvYmJ5TWVzc2FnZSwKKyAgSURpcmVjdFBsYXlMb2JieUFfU2V0Q29ubmVjdGlvblNldHRpbmdzLAorICBJRGlyZWN0UGxheUxvYmJ5QV9TZXRMb2JieU1lc3NhZ2VFdmVudAorfTsKKworLyogRGlyZWN0IFBsYXkgTG9iYnkgMSAodW5pY29kZSkgVmlydHVhbCBUYWJsZSBmb3IgbWV0aG9kcyAqLworc3RhdGljIHN0cnVjdCB0YWdMUERJUkVDVFBMQVlMT0JCWV9WVEFCTEUgZGlyZWN0UGxheUxvYmJ5V1ZUID0geworICBJRGlyZWN0UGxheUxvYmJ5V19RdWVyeUludGVyZmFjZSwKKyAgSURpcmVjdFBsYXlMb2JieVdfQWRkUmVmLAorICBJRGlyZWN0UGxheUxvYmJ5V19SZWxlYXNlLAorICBJRGlyZWN0UGxheUxvYmJ5V19Db25uZWN0LAorICBJRGlyZWN0UGxheUxvYmJ5V19DcmVhdGVBZGRyZXNzLCAKKyAgSURpcmVjdFBsYXlMb2JieVdfRW51bUFkZHJlc3MsCisgIElEaXJlY3RQbGF5TG9iYnlXX0VudW1BZGRyZXNzVHlwZXMsCisgIElEaXJlY3RQbGF5TG9iYnlXX0VudW1Mb2NhbEFwcGxpY2F0aW9ucywKKyAgSURpcmVjdFBsYXlMb2JieVdfR2V0Q29ubmVjdGlvblNldHRpbmdzLAorICBJRGlyZWN0UGxheUxvYmJ5V19SZWNlaXZlTG9iYnlNZXNzYWdlLAorICBJRGlyZWN0UGxheUxvYmJ5V19SdW5BcHBsaWNhdGlvbiwKKyAgSURpcmVjdFBsYXlMb2JieVdfU2VuZExvYmJ5TWVzc2FnZSwKKyAgSURpcmVjdFBsYXlMb2JieVdfU2V0Q29ubmVjdGlvblNldHRpbmdzLAorICBJRGlyZWN0UGxheUxvYmJ5V19TZXRMb2JieU1lc3NhZ2VFdmVudAorfTsKKworCisvKiBEaXJlY3QgUGxheSBMb2JieSAyIChhc2NpaSkgVmlydHVhbCBUYWJsZSBmb3IgbWV0aG9kcyAqLworc3RhdGljIHN0cnVjdCB0YWdMUERJUkVDVFBMQVlMT0JCWTJfVlRBQkxFIGRpcmVjdFBsYXlMb2JieTJBVlQgPSB7CisgIElEaXJlY3RQbGF5TG9iYnkyQV9RdWVyeUludGVyZmFjZSwKKyAgSURpcmVjdFBsYXlMb2JieTJBX0FkZFJlZiwKKyAgSURpcmVjdFBsYXlMb2JieTJBX1JlbGVhc2UsCisgIElEaXJlY3RQbGF5TG9iYnkyQV9Db25uZWN0LAorICBJRGlyZWN0UGxheUxvYmJ5MkFfQ3JlYXRlQWRkcmVzcywKKyAgSURpcmVjdFBsYXlMb2JieTJBX0VudW1BZGRyZXNzLAorICBJRGlyZWN0UGxheUxvYmJ5MkFfRW51bUFkZHJlc3NUeXBlcywKKyAgSURpcmVjdFBsYXlMb2JieTJBX0VudW1Mb2NhbEFwcGxpY2F0aW9ucywKKyAgSURpcmVjdFBsYXlMb2JieTJBX0dldENvbm5lY3Rpb25TZXR0aW5ncywKKyAgSURpcmVjdFBsYXlMb2JieTJBX1JlY2VpdmVMb2JieU1lc3NhZ2UsCisgIElEaXJlY3RQbGF5TG9iYnkyQV9SdW5BcHBsaWNhdGlvbiwKKyAgSURpcmVjdFBsYXlMb2JieTJBX1NlbmRMb2JieU1lc3NhZ2UsCisgIElEaXJlY3RQbGF5TG9iYnkyQV9TZXRDb25uZWN0aW9uU2V0dGluZ3MsCisgIElEaXJlY3RQbGF5TG9iYnkyQV9TZXRMb2JieU1lc3NhZ2VFdmVudCwKKyAgSURpcmVjdFBsYXlMb2JieTJBX0NyZWF0ZUNvbXBvdW5kQWRkcmVzcyAKK307CisKKy8qIERpcmVjdCBQbGF5IExvYmJ5IDIgKHVuaWNvZGUpIFZpcnR1YWwgVGFibGUgZm9yIG1ldGhvZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFnTFBESVJFQ1RQTEFZTE9CQlkyX1ZUQUJMRSBkaXJlY3RQbGF5TG9iYnkyV1ZUID0geworICBJRGlyZWN0UGxheUxvYmJ5MldfUXVlcnlJbnRlcmZhY2UsCisgIElEaXJlY3RQbGF5TG9iYnkyV19BZGRSZWYsIAorICBJRGlyZWN0UGxheUxvYmJ5MldfUmVsZWFzZSwKKyAgSURpcmVjdFBsYXlMb2JieTJXX0Nvbm5lY3QsCisgIElEaXJlY3RQbGF5TG9iYnkyV19DcmVhdGVBZGRyZXNzLAorICBJRGlyZWN0UGxheUxvYmJ5MldfRW51bUFkZHJlc3MsCisgIElEaXJlY3RQbGF5TG9iYnkyV19FbnVtQWRkcmVzc1R5cGVzLAorICBJRGlyZWN0UGxheUxvYmJ5MldfRW51bUxvY2FsQXBwbGljYXRpb25zLAorICBJRGlyZWN0UGxheUxvYmJ5MldfR2V0Q29ubmVjdGlvblNldHRpbmdzLAorICBJRGlyZWN0UGxheUxvYmJ5MldfUmVjZWl2ZUxvYmJ5TWVzc2FnZSwKKyAgSURpcmVjdFBsYXlMb2JieTJXX1J1bkFwcGxpY2F0aW9uLAorICBJRGlyZWN0UGxheUxvYmJ5MldfU2VuZExvYmJ5TWVzc2FnZSwKKyAgSURpcmVjdFBsYXlMb2JieTJXX1NldENvbm5lY3Rpb25TZXR0aW5ncywKKyAgSURpcmVjdFBsYXlMb2JieTJXX1NldExvYmJ5TWVzc2FnZUV2ZW50LAorICBJRGlyZWN0UGxheUxvYmJ5MldfQ3JlYXRlQ29tcG91bmRBZGRyZXNzCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMTUsNyArMTI1Nyw3IEBACiAgKgogICovCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBKCBMUEdVSUQgbHBHVUlERFNQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1RQTEFZTE9CQlkyQSAqbHBscERQTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUUExBWUxPQkJZQSAqbHBscERQTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpscFVuaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEYXRhU2l6ZSApCkBAIC0zMzIsMTggKzEyNzQsMjYgQEAKICAgICAgcmV0dXJuIERQRVJSX0lOVkFMSURQQVJBTVM7CiAgIH0KIAotICAqbHBscERQTCA9IChMUERJUkVDVFBMQVlMT0JCWTJBKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBJRGlyZWN0UGxheUxvYmJ5MkEgKSApOworICAvKiBZZXMuLi5yZWFsbHkgd2Ugc2hvdWxkIGJyZSByZXR1cm5pbmcgYSBsb2JieSAxIG9iamVjdCAqLworICAqbHBscERQTCA9IChMUERJUkVDVFBMQVlMT0JCWUEpSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIElEaXJlY3RQbGF5TG9iYnlBICkgKTsKIAogICBpZiggISAoKmxwbHBEUEwpICkKICAgewogICAgICByZXR1cm4gRFBFUlJfT1VUT0ZNRU1PUlk7CiAgIH0KIAotICAoKmxwbHBEUEwpLT5scHZ0YmwgPSAmbG9iYnkyVlQ7CisgICgqbHBscERQTCktPmxwVnRibCA9ICZkaXJlY3RQbGF5TG9iYnlBVlQ7CiAgICgqbHBscERQTCktPnJlZiAgICA9IDE7CiAKLSAgLyogU3RpbGwgc29tZSBzdHVmZiB0byBkbyBoZXJlICovCisgICgqbHBscERQTCktPmxwU2Vzc2lvbiA9IChMUERQTENPTk5FQ1RJT04pSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9aRVJPX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggRFBMQ09OTkVDVElPTiApICk7CisgICgqbHBscERQTCktPmxwU2Vzc2lvbi0+ZHdTaXplID0gc2l6ZW9mKCBEUExDT05ORUNUSU9OICk7CisKKyAgKCpscGxwRFBMKS0+bHBTZXNzaW9uLT5scFNlc3Npb25EZXNjID0gKExQRFBTRVNTSU9OREVTQzIpSGVhcEFsbG9jKAorICAgICAgICAgIEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZiggRFBTRVNTSU9OREVTQzIgKSApOworICAoKmxwbHBEUEwpLT5scFNlc3Npb24tPmxwU2Vzc2lvbkRlc2MtPmR3U2l6ZSA9IHNpemVvZiggRFBTRVNTSU9OREVTQzIgKTsgCiAKICAgcmV0dXJuIERQX09LOwogfQpAQCAtMzUzLDcgKzEzMDMsNyBAQAogICoKICAqLwogSFJFU1VMVCBXSU5BUEkgRGlyZWN0UGxheUxvYmJ5Q3JlYXRlVyggTFBHVUlEIGxwR1VJRERTUCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVFBMQVlMT0JCWTIgKmxwbHBEUEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVFBMQVlMT0JCWSAqbHBscERQTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpscFVuaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscERhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEYXRhU2l6ZSApCkBAIC0zNjcsMjAgKzEzMTcsMzEgQEAKICAgaWYgKCBscEdVSUREU1AgfHwgbHBVbmsgfHwgbHBEYXRhIHx8IGR3RGF0YVNpemUgKQogICB7CiAgICAgICpscGxwRFBMID0gTlVMTDsKKyAgICAgRVJSKCBkcGxheSwgIkJhZCBwYXJhbWV0ZXJzIVxuIiApOwogICAgICByZXR1cm4gRFBFUlJfSU5WQUxJRFBBUkFNUzsKICAgfQogCi0gICpscGxwRFBMID0gKExQRElSRUNUUExBWUxPQkJZMilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBJRGlyZWN0UGxheUxvYmJ5MiApICk7CisgIC8qIFllcy4uLnJlYWxseSB3ZSBzaG91bGQgYnJlIHJldHVybmluZyBhIGxvYmJ5IDEgb2JqZWN0ICovCisgICpscGxwRFBMID0gKExQRElSRUNUUExBWUxPQkJZKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIElEaXJlY3RQbGF5TG9iYnkgKSApOwogCiAgIGlmKCAhKmxwbHBEUEwpCiAgIHsKICAgICAgcmV0dXJuIERQRVJSX09VVE9GTUVNT1JZOwogICB9CiAKLSAgKCpscGxwRFBMKS0+bHB2dGJsID0gJmxvYmJ5MlZUOworICAoKmxwbHBEUEwpLT5scFZ0YmwgPSAmZGlyZWN0UGxheUxvYmJ5V1ZUOwogICAoKmxwbHBEUEwpLT5yZWYgICAgPSAxOwogCisKKyAgKCpscGxwRFBMKS0+bHBTZXNzaW9uID0gKExQRFBMQ09OTkVDVElPTilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9aRVJPX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggRFBMQ09OTkVDVElPTiApICk7CisgICgqbHBscERQTCktPmxwU2Vzc2lvbi0+ZHdTaXplID0gc2l6ZW9mKCBEUExDT05ORUNUSU9OICk7CisgICgqbHBscERQTCktPmxwU2Vzc2lvbi0+bHBTZXNzaW9uRGVzYyA9IChMUERQU0VTU0lPTkRFU0MyKUhlYXBBbGxvYygKKyAgICAgICAgICBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoIERQU0VTU0lPTkRFU0MyICkgKTsKKyAgKCpscGxwRFBMKS0+bHBTZXNzaW9uLT5scFNlc3Npb25EZXNjLT5kd1NpemUgPSBzaXplb2YoIERQU0VTU0lPTkRFU0MyICk7IAorCiAgIHJldHVybiBEUF9PSzsKIAogfQpAQCAtNDk5LDcgKzE0NjAsNyBAQAogCiAgIHJldHVybiBEUF9PSzsKIAotfQorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIERpcmVjdFBsYXlFbnVtZXJhdGVXIChEUExBWVguMykKQEAgLTUxMiwxNyArMTQ3Myw0MCBAQAogCiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsgCiAKLX0KK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBEaXJlY3RQbGF5Q3JlYXRlIChEUExBWVguMSkgKERQTEFZLjEpCiAgKgogICovCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RQbGF5Q3JlYXRlCi0oIExQR1VJRCBscEdVSUQsIExQRElSRUNUUExBWSAqbHBscERQLCBJVW5rbm93biAqcFVuaykKKyggTFBHVUlEIGxwR1VJRCwgTFBESVJFQ1RQTEFZMiAqbHBscERQLCBJVW5rbm93biAqcFVuaykKIHsKIAogICBGSVhNRSggZHBsYXksICI6c3R1YlxuIik7CiAgIHJldHVybiBEUEVSUl9PVVRPRk1FTU9SWTsKIAotfQorICBUUkFDRShkcGxheSwiXG4iICk7CisKKyAgaWYoIHBVbmsgIT0gTlVMTCApCisgIHsKKyAgICAvKiBIbW1tLi4ud29uZGVyIHdoYXQgdGhpcyBtZWFucyEgKi8KKyAgICBFUlIoZHBsYXksICJXaGF0IGRvZXMgYSBOVUxMIGhlcmUgbWVhbj9cbiIgKTsgCisgICAgcmV0dXJuIERQRVJSX09VVE9GTUVNT1JZOworICB9CisKKyAgKmxwbHBEUCA9IChMUERJUkVDVFBMQVkpSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggKipscGxwRFAgKSApOworCisgIGlmKCAhKmxwbHBEUCApCisgIHsKKyAgICAgcmV0dXJuIERQRVJSX09VVE9GTUVNT1JZOworICB9CisKKyAgKCpscGxwRFApLT5scFZ0YmwgPSAmZGlyZWN0UGxheTJBVlQ7CisgICgqbHBscERQKS0+cmVmICAgID0gMTsKKworICByZXR1cm4gRFBfT0s7CisKK307CisKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvaW5pdC5jIGIvbXVsdGltZWRpYS9pbml0LmMKaW5kZXggN2QxMzhjOC4uMGUzZTBiMCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9pbml0LmMKKysrIGIvbXVsdGltZWRpYS9pbml0LmMKQEAgLTEsMyArMSw1IEBACisvKiAtKi0gdGFiLXdpZHRoOiA4OyBjLWJhc2ljLW9mZnNldDogNCAtKi0gKi8KKwogLyoKICAqIEluaXRpYWxpemF0aW9uIHByb2NlZHVyZXMgZm9yIG11bHRpbWVkaWEKICAqCkBAIC0xNSw4ICsxNywxMyBAQAogCiAjaWZkZWYgSEFWRV9PU1MKIAotZXh0ZXJuIGludCBNT0RNX05VTURFVlM7Ci1leHRlcm4gTFBNSURJT1VUQ0FQUzE2IG1pZGlEZXZpY2VzW01BWF9NSURJT1VURFJWXTsKK2V4dGVybiBpbnQgCQlNT0RNX05VTURFVlM7CitleHRlcm4gaW50CQlNT0RNX05VTUZNU1lOVEhERVZTOworZXh0ZXJuIGludAkJTU9ETV9OVU1NSURJREVWUzsKK2V4dGVybiBMUE1JRElPVVRDQVBTMTYJbWlkaU91dERldmljZXNbTUFYX01JRElPVVREUlZdOworCitleHRlcm4gaW50CQlNSURNX05VTURFVlM7CitleHRlcm4gTFBNSURJSU5DQVBTMTYJbWlkaUluRGV2aWNlcyBbTUFYX01JRElJTkRSVl07CiAKICNlbmRpZgogCkBAIC0yOSwyMyArMzYsMjUgQEAKICNpZmRlZiBIQVZFX09TUwogaW50IHVuaXhUb1dpbmRvd3NEZXZpY2VUeXBlKGludCB0eXBlKQogewotICAvKiBNT0RfTUlESVBPUlQgICAgIG91dHB1dCBwb3J0IAotICAgKiBNT0RfU1lOVEggICAgICAgIGdlbmVyaWMgaW50ZXJuYWwgc3ludGggCi0gICAqIE1PRF9TUVNZTlRIICAgICAgc3F1YXJlIHdhdmUgaW50ZXJuYWwgc3ludGggCi0gICAqIE1PRF9GTVNZTlRIICAgICAgRk0gaW50ZXJuYWwgc3ludGggCi0gICAqIE1PRF9NQVBQRVIgICAgICAgTUlESSBtYXBwZXIKLSAgICovCi0KLSAgLyogRklYTUUgSXMgdGhpcyByZWFsbHkgdGhlIGNvcnJlY3QgZXF1aXZhbGVuY2UgZnJvbSBVTklYIHRvIFdpbmRvd3MgU291bmQgdHlwZSAqLwotCi0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFNZTlRIX1RZUEVfRk06ICAgICByZXR1cm4gTU9EX0ZNU1lOVEg7Ci0gIGNhc2UgU1lOVEhfVFlQRV9TQU1QTEU6IHJldHVybiBNT0RfU1lOVEg7Ci0gIGNhc2UgU1lOVEhfVFlQRV9NSURJOiAgIHJldHVybiBNT0RfTUlESVBPUlQ7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSKG1pZGksICJDYW5ub3QgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoaXMgbWlkaSBkZXZpY2UuIEFzc3VtaW5nIEZNIFN5bnRoXG4iKTsKLSAgICByZXR1cm4gTU9EX0ZNU1lOVEg7Ci0gIH0KKyAgICAvKiBNT0RfTUlESVBPUlQgICAgIG91dHB1dCBwb3J0IAorICAgICAqIE1PRF9TWU5USCAgICAgICAgZ2VuZXJpYyBpbnRlcm5hbCBzeW50aCAKKyAgICAgKiBNT0RfU1FTWU5USCAgICAgIHNxdWFyZSB3YXZlIGludGVybmFsIHN5bnRoIAorICAgICAqIE1PRF9GTVNZTlRIICAgICAgRk0gaW50ZXJuYWwgc3ludGggCisgICAgICogTU9EX01BUFBFUiAgICAgICBNSURJIG1hcHBlcgorICAgICAqLworICAgIAorICAgIC8qIEZJWE1FIElzIHRoaXMgcmVhbGx5IHRoZSBjb3JyZWN0IGVxdWl2YWxlbmNlIGZyb20gVU5JWCB0byAKKyAgICAgICBXaW5kb3dzIFNvdW5kIHR5cGUgKi8KKyAgICAKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFNZTlRIX1RZUEVfRk06ICAgICByZXR1cm4gTU9EX0ZNU1lOVEg7CisgICAgY2FzZSBTWU5USF9UWVBFX1NBTVBMRTogcmV0dXJuIE1PRF9TWU5USDsKKyAgICBjYXNlIFNZTlRIX1RZUEVfTUlESTogICByZXR1cm4gTU9EX01JRElQT1JUOworICAgIGRlZmF1bHQ6CisJRVJSKG1pZGksICJDYW5ub3QgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoaXMgbWlkaSBkZXZpY2UuICIKKwkgICAgIkFzc3VtaW5nIEZNIFN5bnRoXG4iKTsKKwlyZXR1cm4gTU9EX0ZNU1lOVEg7CisgICAgfQogfQogI2VuZGlmCiAKQEAgLTU1LDEzNSArNjQsMTg2IEBACiAgKiBJbml0aWFsaXplcyB0aGUgTUlESSBkZXZpY2VzIGluZm9ybWF0aW9uIHZhcmlhYmxlcwogICoKICAqLwotQk9PTDMyIE1VTFRJTUVESUFfSW5pdCAodm9pZCkKK0JPT0wzMiBNVUxUSU1FRElBX0luaXQodm9pZCkKIHsKICNpZmRlZiBIQVZFX09TUwotICBpbnQgaSwgc3RhdHVzLCBudW1zeW50aGRldnM9MjU1LCBudW1taWRpZGV2cz0yNTU7Ci0gIHN0cnVjdCBzeW50aF9pbmZvIHNpbmZvOwotICBzdHJ1Y3QgbWlkaV9pbmZvIG1pbmZvOwotICBpbnQgZmQ7ICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIE1JRElfREVWICovCi0KLSAgVFJBQ0UgKG1pZGksICJJbml0aWFsaXppbmcgdGhlIE1JREkgdmFyaWFibGVzLlxuIik7Ci0gIC8qIHRyeSB0byBvcGVuIGRldmljZSAqLwotICBmZCA9IG9wZW4oTUlESV9ERVYsIE9fV1JPTkxZKTsKLSAgaWYgKGZkID09IC0xKSB7Ci0gICAgVFJBQ0UgKG1pZGksICJObyBzb3VuZGNhcmRzIGZvdW5kczogdW5hYmxlIHRvIG9wZW4gYCVzJy5cbiIsIE1JRElfREVWKTsKLSAgICByZXR1cm4gVFJVRTsKLSAgfQotCi0gIC8qIGZpbmQgaG93IG1hbnkgU3ludGggZGV2aWNlcyBhcmUgdGhlcmUgaW4gdGhlIHN5c3RlbSAqLwotICBzdGF0dXMgPSBpb2N0bChmZCwgU05EQ1RMX1NFUV9OUlNZTlRIUywgJm51bXN5bnRoZGV2cyk7Ci0KLSAgaWYgKG51bXN5bnRoZGV2cyA+IE1BWF9NSURJT1VURFJWKSB7Ci0gICAgRVJSIChtaWRpLCAiTUFYX01JRElPVVREUlYgd2FzIGVub3VnaCBmb3IgdGhlIG51bWJlciBvZiBkZXZpY2VzLiBTb21lIEZNIGRldmljZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlLlxuIik7Ci0gICAgbnVtc3ludGhkZXZzID0gTUFYX01JRElPVVREUlY7Ci0gIH0KLSAgCi0gIGlmIChzdGF0dXMgPT0gLTEpIHsKLSAgICBFUlIgKG1pZGksICJpb2N0bCBmYWlsZWQuXG4iKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLQotICBmb3IgKGkgPSAwIDsgaSA8IG51bXN5bnRoZGV2cyA7IGkrKykgewotICAgIExQTUlESU9VVENBUFMxNiB0bXBscENhcHM7Ci0KLSAgICBzaW5mby5kZXZpY2UgPSBpOwotICAgIHN0YXR1cyA9IGlvY3RsKGZkLCBTTkRDVExfU1lOVEhfSU5GTywgJnNpbmZvKTsKLSAgICBpZiAoc3RhdHVzID09IC0xKSB7Ci0gICAgICBFUlIobWlkaSwgImlvY3RsIGZhaWxlZC5cbiIpOwotICAgICAgY2xvc2UoZmQpOwotICAgICAgcmV0dXJuIFRSVUU7CisgICAgaW50IAkJaSwgc3RhdHVzLCBudW1zeW50aGRldnMgPSAyNTUsIG51bW1pZGlkZXZzID0gMjU1OworICAgIHN0cnVjdCBzeW50aF9pbmZvIAlzaW5mbzsKKyAgICBzdHJ1Y3QgbWlkaV9pbmZvIAltaW5mbzsKKyAgICBpbnQgCQlmZDsgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciBmb3IgTUlESV9TRVEgKi8KKyAgICAKKyAgICBUUkFDRShtaWRpLCAiSW5pdGlhbGl6aW5nIHRoZSBNSURJIHZhcmlhYmxlcy5cbiIpOworICAgIAorICAgIC8qIHRyeSB0byBvcGVuIGRldmljZSAqLworICAgIC8qIEZJWE1FOiBzaG91bGQgdXNlIGZ1bmN0aW9uIG1pZGlPcGVuU2VxKCkgaW4gbWlkaS5jICovCisgICAgZmQgPSBvcGVuKE1JRElfU0VRLCBPX1dST05MWSk7CisgICAgaWYgKGZkID09IC0xKSB7CisJVFJBQ0UobWlkaSwgIk5vIHNlcXVlbmNlciBmb3VuZDogdW5hYmxlIHRvIG9wZW4gYCVzJy5cbiIsIE1JRElfU0VRKTsKKwlyZXR1cm4gVFJVRTsKICAgICB9Ci0KLSAgICB0bXBscENhcHMgPSB4bWFsbG9jIChzaXplb2YgKE1JRElPVVRDQVBTMTYpKTsKLSAgICAvKiBXZSBhbHNvIGhhdmUgdGhlIGluZm9ybWF0aW9uIHNpbmZvLnN5bnRoX3N1YnR5cGUsIG5vdCB1c2VkIGhlcmUKLSAgICAgKi8KICAgICAKLSAgICAvKiBNYW51ZmFjIElELiBXZSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyB3aXRoIHNvdW5kY2FyZC5oCi0gICAgICogRG9lcyBub3Qgc2VlbSB0byBiZSBhIHByb2JsZW0sIGJlY2F1c2UgaW4gbW1zeXN0ZW0uaCBvbmx5Ci0gICAgICogTWljcm9zb2Z0J3MgSUQgaXMgbGlzdGVkLgotICAgICAqLwotICAgIHRtcGxwQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCi0gICAgdG1wbHBDYXBzLT53UGlkID0gMHgwMDAxOyAJLyogRklYTUUgUHJvZHVjdCBJRCAgKi8KLSAgICB0bXBscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gMHgwMDE7IC8qIFByb2R1Y3QgVmVyc2lvbi4gV2Ugc2ltcGx5IHNheSAiMSIgKi8KLSAgICBzdHJjcHkodG1wbHBDYXBzLT5zelBuYW1lLCBzaW5mby5uYW1lKTsKLQotICAgIHRtcGxwQ2Fwcy0+d1RlY2hub2xvZ3kgPSB1bml4VG9XaW5kb3dzRGV2aWNlVHlwZSAoc2luZm8uc3ludGhfdHlwZSk7Ci0gICAgdG1wbHBDYXBzLT53Vm9pY2VzICAgICA9IHNpbmZvLm5yX3ZvaWNlczsKLQotICAgIC8qIEZJWE1FIElzIGl0IHBvc3NpYmxlIHRvIGtub3cgdGhlIG1heGltdW0KLSAgICAgKiBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIG5vdGVzIG9mIGEgc291bmRjYXJkID8KLSAgICAgKiBJIGJlbGVpdmUgd2UgZG9uJ3QgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLCBidXQKLSAgICAgKiBpdCdzIHByb2JhYmx5IGVxdWFsIG9yIG1vcmUgdGhhbiB3Vm9pY2VzCi0gICAgICovCi0gICAgdG1wbHBDYXBzLT53Tm90ZXMgICAgICA9IHNpbmZvLm5yX3ZvaWNlczsgIAotCi0gICAgLyogRklYTUUgRG8gd2UgaGF2ZSB0aGlzIGluZm9ybWF0aW9uPwotICAgICAqIEFzc3VtaW5nIHRoZSBzb3VuZGNhcmRzIGNhbiBoYW5kbGUKLSAgICAgKiBNSURJQ0FQU19WT0xVTUUgYW5kIE1JRElDQVBTX0xSVk9MVU1FIGJ1dAotICAgICAqIG5vdCBNSURJQ0FQU19DQUNIRS4KLSAgICAgKi8KLSAgICB0bXBscENhcHMtPmR3U3VwcG9ydCAgID0gTUlESUNBUFNfVk9MVU1FfE1JRElDQVBTX0xSVk9MVU1FOworICAgIC8qIGZpbmQgaG93IG1hbnkgU3ludGggZGV2aWNlcyBhcmUgdGhlcmUgaW4gdGhlIHN5c3RlbSAqLworICAgIHN0YXR1cyA9IGlvY3RsKGZkLCBTTkRDVExfU0VRX05SU1lOVEhTLCAmbnVtc3ludGhkZXZzKTsKICAgICAKLSAgICBtaWRpRGV2aWNlc1tpXSA9IHRtcGxwQ2FwczsKLSAgICAKLSAgICBUUkFDRShtaWRpLCJ0ZWNobiA9ICVkIHZvaWNlcz0lZCBub3RlcyA9ICVkIHN1cHBvcnQgPSAlbGRcbiIsdG1wbHBDYXBzLT53VGVjaG5vbG9neSx0bXBscENhcHMtPndWb2ljZXMsdG1wbHBDYXBzLT53Tm90ZXMsdG1wbHBDYXBzLT5kd1N1cHBvcnQpOwotICB9Ci0gIAotICAvKiBmaW5kIGhvdyBtYW55IE1JREkgZGV2aWNlcyBhcmUgdGhlcmUgaW4gdGhlIHN5c3RlbSAqLwotICBzdGF0dXMgPSBpb2N0bChmZCwgU05EQ1RMX1NFUV9OUk1JRElTLCAmbnVtbWlkaWRldnMpOwotICBpZiAoc3RhdHVzID09IC0xKSB7Ci0gICAgRVJSKG1pZGksICJpb2N0bCBmYWlsZWQuXG4iKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLQotICBpZiAobnVtc3ludGhkZXZzICsgbnVtbWlkaWRldnMgPiBNQVhfTUlESU9VVERSVikgewotICAgIEVSUihtaWRpLCAiTUFYX01JRElPVVREUlYgd2FzIGVub3VnaCBmb3IgdGhlIG51bWJlciBvZiBkZXZpY2VzLiBTb21lIE1JREkgZGV2aWNlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUuXG4iKTsKLSAgICBudW1taWRpZGV2cyA9IE1BWF9NSURJT1VURFJWIC0gbnVtc3ludGhkZXZzOwotICB9Ci0KLSAgLyogd2luZG93cyBkb2VzIG5vdCBzZWVtIHRvIGRpZmVyZW50aWF0ZSBTeW50aCBmcm9tIE1JREkgZGV2aWNlcyAqLwotICBNT0RNX05VTURFVlMgPSBudW1zeW50aGRldnMgKyBudW1taWRpZGV2czsKLSAgCi0gIGZvciAoaSA9IDAgOyBpIDwgbnVtbWlkaWRldnMgOyBpKyspIHsKLSAgICBMUE1JRElPVVRDQVBTMTYgdG1wbHBDYXBzOwotCi0gICAgbWluZm8uZGV2aWNlID0gaTsKLSAgICBzdGF0dXMgPSBpb2N0bChmZCwgU05EQ1RMX01JRElfSU5GTywgJm1pbmZvKTsKICAgICBpZiAoc3RhdHVzID09IC0xKSB7Ci0gICAgICBFUlIobWlkaSwgImlvY3RsIGZhaWxlZC5cbiIpOwotICAgICAgY2xvc2UoZmQpOwotICAgICAgcmV0dXJuIFRSVUU7CisJRVJSKG1pZGksICJpb2N0bCBmb3IgbnIgc3ludGggZmFpbGVkLlxuIik7CisJY2xvc2UoZmQpOworCXJldHVybiBUUlVFOwogICAgIH0KLQotICAgIHRtcGxwQ2FwcyA9IHhtYWxsb2MgKHNpemVvZiAoTUlESU9VVENBUFMxNikpOwotICAgIC8qIFRoaXMgd2hvbGUgcGFydCBpcyBzb21ld2hhdCBvYnNjdXJlIHRvIG1lLiBJJ2xsIGtlZXAgdHJ5aW5nIHRvIGRpZwotICAgICAgIGluZm8gYWJvdXQgaXQuIElmIHlvdSBoYXBwZW4gdG8ga25vdywgcGxlYXNlIHRlbGwgdXMuIFRoZSB2ZXJ5IGRlc2NyaXRpdmUKLSAgICAgICBtaW5mby5kZXZfdHlwZSB3YXMgbm90IHVzZWQgaGVyZS4KLSAgICAgKi8KLSAgICB0bXBscENhcHMtPndNaWQgPSAweDAwRkY7IAkvKiBNYW51ZmFjIElELiBXZSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyB3aXRoIHNvdW5kY2FyZC5oCi0JCQkJICAgRG9lcyBub3Qgc2VlbSB0byBiZSBhIHByb2JsZW0sIGJlY2F1c2UgaW4gbW1zeXN0ZW0uaCBvbmx5Ci0JCQkJICAgTWljcm9zb2Z0J3MgSUQgaXMgbGlzdGVkICovCi0gICAgdG1wbHBDYXBzLT53UGlkID0gMHgwMDAxOyAJLyogRklYTUUgUHJvZHVjdCBJRCAqLwotICAgIHRtcGxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSAweDAwMTsgLyogUHJvZHVjdCBWZXJzaW9uLiBXZSBzaW1wbHkgc2F5ICIxIiAqLwotICAgIHN0cmNweSh0bXBscENhcHMtPnN6UG5hbWUsIG1pbmZvLm5hbWUpOwotCi0gICAgdG1wbHBDYXBzLT53VGVjaG5vbG9neSA9ICBNT0RfTUlESVBPUlQ7IC8qIEZJWE1FIElzIHRoaXMgcmlnaHQ/ICovCi0gICAgdG1wbHBDYXBzLT53Vm9pY2VzICAgICA9IDE2OyAgICAgICAgICAgIC8qIERvZXMgaXQgbWFrZSBhbnkgZGlmZmVyZW5jZT8gKi8KLSAgICB0bXBscENhcHMtPndOb3RlcyAgICAgID0gMTY7ICAgICAgICAgICAgLyogRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlPyAqLwotICAgIHRtcGxwQ2Fwcy0+ZHdTdXBwb3J0ICAgPSBNSURJQ0FQU19WT0xVTUV8TUlESUNBUFNfTFJWT0xVTUU7IC8qIEZJWE1FIERvZXMgaXQgbWFrZSBhbnkgZGlmZmVyZW5jZT8gKi8KLQotICAgIG1pZGlEZXZpY2VzW251bXN5bnRoZGV2cyArIGldID0gdG1wbHBDYXBzOwotCi0gICAgVFJBQ0UobWlkaSwidGVjaG4gPSAlZCB2b2ljZXM9JWQgbm90ZXMgPSAlZCBzdXBwb3J0ID0gJWxkXG4iLHRtcGxwQ2Fwcy0+d1RlY2hub2xvZ3ksdG1wbHBDYXBzLT53Vm9pY2VzLHRtcGxwQ2Fwcy0+d05vdGVzLHRtcGxwQ2Fwcy0+ZHdTdXBwb3J0KTsKLSAgfQotICAKLSAgLyogY2xvc2UgZmlsZSBhbmQgZXhpdCAqLwotICBjbG9zZShmZCk7Ci0KKyAgICAKKyAgICBpZiAobnVtc3ludGhkZXZzID4gTUFYX01JRElPVVREUlYpIHsKKwlFUlIobWlkaSwgIk1BWF9NSURJT1VURFJWIHdhcyBlbm91Z2ggZm9yIHRoZSBudW1iZXIgb2YgZGV2aWNlcy4gIgorCSAgICAiU29tZSBGTSBkZXZpY2VzIHdpbGwgbm90IGJlIGF2YWlsYWJsZS5cbiIpOworCW51bXN5bnRoZGV2cyA9IE1BWF9NSURJT1VURFJWOworICAgIH0KKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtc3ludGhkZXZzOyBpKyspIHsKKwlMUE1JRElPVVRDQVBTMTYgdG1wbHBDYXBzOworCQorCXNpbmZvLmRldmljZSA9IGk7CisJc3RhdHVzID0gaW9jdGwoZmQsIFNORENUTF9TWU5USF9JTkZPLCAmc2luZm8pOworCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkgICAgRVJSKG1pZGksICJpb2N0bCBmb3Igc3ludGggaW5mbyBmYWlsZWQuXG4iKTsKKwkgICAgY2xvc2UoZmQpOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisJCisJdG1wbHBDYXBzID0geG1hbGxvYyhzaXplb2YoTUlESU9VVENBUFMxNikpOworCS8qIFdlIGFsc28gaGF2ZSB0aGUgaW5mb3JtYXRpb24gc2luZm8uc3ludGhfc3VidHlwZSwgbm90IHVzZWQgaGVyZQorCSAqLworCQorCS8qIE1hbnVmYWMgSUQuIFdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGlzIHdpdGggc291bmRjYXJkLmgKKwkgKiBEb2VzIG5vdCBzZWVtIHRvIGJlIGEgcHJvYmxlbSwgYmVjYXVzZSBpbiBtbXN5c3RlbS5oIG9ubHkKKwkgKiBNaWNyb3NvZnQncyBJRCBpcyBsaXN0ZWQuCisJICovCisJdG1wbHBDYXBzLT53TWlkID0gMHgwMEZGOyAKKwl0bXBscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBGSVhNRSBQcm9kdWN0IElEICAqLworCS8qIFByb2R1Y3QgVmVyc2lvbi4gV2Ugc2ltcGx5IHNheSAiMSIgKi8KKwl0bXBscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gMHgwMDE7IAorCXN0cmNweSh0bXBscENhcHMtPnN6UG5hbWUsIHNpbmZvLm5hbWUpOworCQorCXRtcGxwQ2Fwcy0+d1RlY2hub2xvZ3kgPSB1bml4VG9XaW5kb3dzRGV2aWNlVHlwZShzaW5mby5zeW50aF90eXBlKTsKKwl0bXBscENhcHMtPndWb2ljZXMgICAgID0gc2luZm8ubnJfdm9pY2VzOworCQorCS8qIEZJWE1FIElzIGl0IHBvc3NpYmxlIHRvIGtub3cgdGhlIG1heGltdW0KKwkgKiBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIG5vdGVzIG9mIGEgc291bmRjYXJkID8KKwkgKiBJIGJlbGlldmUgd2UgZG9uJ3QgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLCBidXQKKwkgKiBpdCdzIHByb2JhYmx5IGVxdWFsIG9yIG1vcmUgdGhhbiB3Vm9pY2VzCisJICovCisJdG1wbHBDYXBzLT53Tm90ZXMgICAgICA9IHNpbmZvLm5yX3ZvaWNlczsgIAorCQorCS8qIEZJWE1FIERvIHdlIGhhdmUgdGhpcyBpbmZvcm1hdGlvbj8KKwkgKiBBc3N1bWluZyB0aGUgc291bmRjYXJkcyBjYW4gaGFuZGxlCisJICogTUlESUNBUFNfVk9MVU1FIGFuZCBNSURJQ0FQU19MUlZPTFVNRSBidXQKKwkgKiBub3QgTUlESUNBUFNfQ0FDSEUuCisJICovCisJdG1wbHBDYXBzLT5kd1N1cHBvcnQgICA9IE1JRElDQVBTX1ZPTFVNRXxNSURJQ0FQU19MUlZPTFVNRTsKKwkKKwltaWRpT3V0RGV2aWNlc1tpXSA9IHRtcGxwQ2FwczsKKwkKKwlpZiAoc2luZm8uY2FwYWJpbGl0aWVzICYgU1lOVEhfQ0FQX0lOUFVUKSB7CisJICAgIEZJWE1FKG1pZGksICJTeW50aGV0aXplciBzdXBwb3J0IE1JREkgaW4uIE5vdCBzdXBwb3J0ZWQgeWV0IChwbGVhc2UgcmVwb3J0KVxuIik7CisJfQorCQorCVRSQUNFKG1pZGksICJuYW1lPSclcycsIHRlY2huPSVkIHZvaWNlcz0lZCBub3Rlcz0lZCBzdXBwb3J0PSVsZFxuIiwgCisJICAgICAgdG1wbHBDYXBzLT5zelBuYW1lLCB0bXBscENhcHMtPndUZWNobm9sb2d5LAorCSAgICAgIHRtcGxwQ2Fwcy0+d1ZvaWNlcywgdG1wbHBDYXBzLT53Tm90ZXMsIHRtcGxwQ2Fwcy0+ZHdTdXBwb3J0KTsKKwlUUkFDRShtaWRpLCJPU1MgaW5mbzogc3ludGggc3VidHlwZT0lZCBjYXBhPSVYaFxuIiwgCisJICAgICAgc2luZm8uc3ludGhfc3VidHlwZSwgc2luZm8uY2FwYWJpbGl0aWVzKTsKKyAgICB9CisgICAgCisgICAgLyogZmluZCBob3cgbWFueSBNSURJIGRldmljZXMgYXJlIHRoZXJlIGluIHRoZSBzeXN0ZW0gKi8KKyAgICBzdGF0dXMgPSBpb2N0bChmZCwgU05EQ1RMX1NFUV9OUk1JRElTLCAmbnVtbWlkaWRldnMpOworICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKKwlFUlIobWlkaSwgImlvY3RsIG9uIG5yIG1pZGkgZmFpbGVkLlxuIik7CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIAorICAgIC8qIEZJWE1FOiB0aGUgdHdvIHJlc3RyaWN0aW9ucyBiZWxvdyBjb3VsZCBiZSBsb29zZW4gaW4gc29tZSBjYXNlcyAqLworICAgIGlmIChudW1zeW50aGRldnMgKyBudW1taWRpZGV2cyA+IE1BWF9NSURJT1VURFJWKSB7CisJRVJSKG1pZGksICJNQVhfTUlESU9VVERSViB3YXMgbm90IGVub3VnaCBmb3IgdGhlIG51bWJlciBvZiBkZXZpY2VzLiAiCisJICAgICJTb21lIE1JREkgZGV2aWNlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUuXG4iKTsKKwludW1taWRpZGV2cyA9IE1BWF9NSURJT1VURFJWIC0gbnVtc3ludGhkZXZzOworICAgIH0KKyAgICAKKyAgICBpZiAobnVtbWlkaWRldnMgPiBNQVhfTUlESUlORFJWKSB7CisJRVJSKG1pZGksICJNQVhfTUlESUlORFJWIHdhcyBub3QgZW5vdWdoIGZvciB0aGUgbnVtYmVyIG9mIGRldmljZXMuICIKKwkgICAgIlNvbWUgTUlESSBkZXZpY2VzIHdpbGwgbm90IGJlIGF2YWlsYWJsZS5cbiIpOworCW51bW1pZGlkZXZzID0gTUFYX01JRElJTkRSVjsKKyAgICB9CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IG51bW1pZGlkZXZzOyBpKyspIHsKKwlMUE1JRElPVVRDQVBTMTYgdG1wbHBPdXRDYXBzOworCUxQTUlESUlOQ0FQUzE2ICB0bXBscEluQ2FwczsKKwkKKwltaW5mby5kZXZpY2UgPSBpOworCXN0YXR1cyA9IGlvY3RsKGZkLCBTTkRDVExfTUlESV9JTkZPLCAmbWluZm8pOworCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkgICAgRVJSKG1pZGksICJpb2N0bCBvbiBtaWRpIGluZm8gZmFpbGVkLlxuIik7CisJICAgIGNsb3NlKGZkKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorCQorCXRtcGxwT3V0Q2FwcyA9IHhtYWxsb2Moc2l6ZW9mKE1JRElPVVRDQVBTMTYpKTsKKwkvKiBUaGlzIHdob2xlIHBhcnQgaXMgc29tZXdoYXQgb2JzY3VyZSB0byBtZS4gSSdsbCBrZWVwIHRyeWluZyB0byBkaWcKKwkgICBpbmZvIGFib3V0IGl0LiBJZiB5b3UgaGFwcGVuIHRvIGtub3csIHBsZWFzZSB0ZWxsIHVzLiBUaGUgdmVyeSAKKwkgICBkZXNjcml0aXZlIG1pbmZvLmRldl90eXBlIHdhcyBub3QgdXNlZCBoZXJlLgorCSovCisJLyogTWFudWZhYyBJRC4gV2UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoaXMgd2l0aCBzb3VuZGNhcmQuaAorCSAgIERvZXMgbm90IHNlZW0gdG8gYmUgYSBwcm9ibGVtLCBiZWNhdXNlIGluIG1tc3lzdGVtLmggb25seQorCSAgIE1pY3Jvc29mdCdzIElEIGlzIGxpc3RlZCAqLworCXRtcGxwT3V0Q2Fwcy0+d01pZCA9IDB4MDBGRjsgCQorCXRtcGxwT3V0Q2Fwcy0+d1BpZCA9IDB4MDAwMTsgCS8qIEZJWE1FIFByb2R1Y3QgSUQgKi8KKwkvKiBQcm9kdWN0IFZlcnNpb24uIFdlIHNpbXBseSBzYXkgIjEiICovCisJdG1wbHBPdXRDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDAxOyAKKwlzdHJjcHkodG1wbHBPdXRDYXBzLT5zelBuYW1lLCBtaW5mby5uYW1lKTsKKwkKKwl0bXBscE91dENhcHMtPndUZWNobm9sb2d5ID0gTU9EX01JRElQT1JUOyAvKiBGSVhNRSBJcyB0aGlzIHJpZ2h0PyAqLworCS8qIERvZXMgaXQgbWFrZSBhbnkgZGlmZmVyZW5jZT8gKi8KKwl0bXBscE91dENhcHMtPndWb2ljZXMgICAgID0gMTY7ICAgICAgICAgICAgCisJLyogRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlPyAqLworCXRtcGxwT3V0Q2Fwcy0+d05vdGVzICAgICAgPSAxNjsKKwkvKiBGSVhNRSBEb2VzIGl0IG1ha2UgYW55IGRpZmZlcmVuY2U/ICovCisJdG1wbHBPdXRDYXBzLT5kd1N1cHBvcnQgICA9IE1JRElDQVBTX1ZPTFVNRXxNSURJQ0FQU19MUlZPTFVNRTsgCisJCisJbWlkaU91dERldmljZXNbbnVtc3ludGhkZXZzICsgaV0gPSB0bXBscE91dENhcHM7CisJCisJdG1wbHBJbkNhcHMgPSB4bWFsbG9jKHNpemVvZihNSURJT1VUQ0FQUzE2KSk7CisJLyogVGhpcyB3aG9sZSBwYXJ0IGlzIHNvbWV3aGF0IG9ic2N1cmUgdG8gbWUuIEknbGwga2VlcCB0cnlpbmcgdG8gZGlnCisJICAgaW5mbyBhYm91dCBpdC4gSWYgeW91IGhhcHBlbiB0byBrbm93LCBwbGVhc2UgdGVsbCB1cy4gVGhlIHZlcnkgCisJICAgZGVzY3JpdGl2ZSBtaW5mby5kZXZfdHlwZSB3YXMgbm90IHVzZWQgaGVyZS4KKwkqLworCS8qIE1hbnVmYWMgSUQuIFdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGlzIHdpdGggc291bmRjYXJkLmgKKwkgICBEb2VzIG5vdCBzZWVtIHRvIGJlIGEgcHJvYmxlbSwgYmVjYXVzZSBpbiBtbXN5c3RlbS5oIG9ubHkKKwkgICBNaWNyb3NvZnQncyBJRCBpcyBsaXN0ZWQgKi8KKwl0bXBscEluQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCQorCXRtcGxwSW5DYXBzLT53UGlkID0gMHgwMDAxOyAJLyogRklYTUUgUHJvZHVjdCBJRCAqLworCS8qIFByb2R1Y3QgVmVyc2lvbi4gV2Ugc2ltcGx5IHNheSAiMSIgKi8KKwl0bXBscEluQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSAweDAwMTsgCisJc3RyY3B5KHRtcGxwSW5DYXBzLT5zelBuYW1lLCBtaW5mby5uYW1lKTsKKwkKKwkvKiBGSVhNRSA6IGNvdWxkIHdlIGdldCBiZXR0ZXIgaW5mb3JtYXRpb24gdGhhbiB0aGF0ID8gKi8KKwl0bXBscEluQ2Fwcy0+ZHdTdXBwb3J0ICAgPSBNSURJQ0FQU19WT0xVTUV8TUlESUNBUFNfTFJWT0xVTUU7IAorCQorCW1pZGlJbkRldmljZXNbaV0gPSB0bXBscEluQ2FwczsKKwkKKwlUUkFDRShtaWRpLCJuYW1lPSclcycgdGVjaG49JWQgdm9pY2VzPSVkIG5vdGVzPSVkIHN1cHBvcnQ9JWxkXG4iLAorCSAgICAgIHRtcGxwT3V0Q2Fwcy0+c3pQbmFtZSwgdG1wbHBPdXRDYXBzLT53VGVjaG5vbG9neSwgdG1wbHBPdXRDYXBzLT53Vm9pY2VzLAorCSAgICAgIHRtcGxwT3V0Q2Fwcy0+d05vdGVzLCB0bXBscE91dENhcHMtPmR3U3VwcG9ydCk7CisJVFJBQ0UobWlkaSwiT1NTIGluZm86IG1pZGkgZGV2LXR5cGU9JWQsIGNhcGE9JWRcbiIsIAorCSAgICAgIG1pbmZvLmRldl90eXBlLCBtaW5mby5jYXBhYmlsaXRpZXMpOworICAgIH0KKyAgICAKKyAgICAvKiB3aW5kb3dzIGRvZXMgbm90IHNlZW0gdG8gZGlmZmVyZW50aWF0ZSBTeW50aCBmcm9tIE1JREkgZGV2aWNlcyAqLworICAgIE1PRE1fTlVNRk1TWU5USERFVlMgPSBudW1zeW50aGRldnM7CisgICAgTU9ETV9OVU1NSURJREVWUyAgICA9IG51bW1pZGlkZXZzOworICAgIE1PRE1fTlVNREVWUyAgICAgICAgPSBudW1zeW50aGRldnMgKyBudW1taWRpZGV2czsKKyAgICAKKyAgICBNSURNX05VTURFVlMgICAgICAgID0gbnVtbWlkaWRldnM7CisgICAgCisgICAgLyogY2xvc2UgZmlsZSBhbmQgZXhpdCAqLworICAgIGNsb3NlKGZkKTsJCiAjZW5kaWYgLyogSEFWRV9PU1MgKi8KLSAgCi0gIHJldHVybiBUUlVFOworICAgIAorICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpLmMgYi9tdWx0aW1lZGlhL21pZGkuYwppbmRleCBjN2NhZTVhLi4zMjAwZTllIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21pZGkuYworKysgYi9tdWx0aW1lZGlhL21pZGkuYwpAQCAtMSwxNSArMSwyMyBAQAorLyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCisKIC8qCiAgKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICAqCiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCiAgKi8KIAorLyogCisgKiBFcmljIFBPVUVDSCA6IDk4LzcgY2hhbmdlcyBmb3IgbWFraW5nIHRoaXMgTUlESSBkcml2ZXIgd29yayBvbiBPU1MKKyAqIGN1cnJlbnQgc3VwcG9ydCBpcyBsaW1pdGVkIHRvIE1JREkgcG9ydHMgb2YgT1NTIHN5c3RlbXMKKyAqLworCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJtdWx0aW1lZGlhLmgiCkBAIC0xOCwyOTQgKzI2LDMyNyBAQAogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCiAKLXN0YXRpYyBMSU5VWF9NSURJSU4JTWlkaUluRGV2W01BWF9NSURJSU5EUlZdOworc3RhdGljIExJTlVYX01JRElJTglNaWRpSW5EZXYgW01BWF9NSURJSU5EUlYgXTsKIHN0YXRpYyBMSU5VWF9NSURJT1VUCU1pZGlPdXREZXZbTUFYX01JRElPVVREUlZdOwogc3RhdGljIExJTlVYX01DSU1JREkJTUNJTWlkaURldltNQVhfTUNJTUlESURSVl07CiAKLS8qIHRoaXMgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBNSURJIGRldmljZXMgZm91bmQgKi8KLWludCBNT0RNX05VTURFVlMgPSAwOworLyogdGhpcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIE1JREkgb3V0IGRldmljZXMgZm91bmQgKi8KK2ludCAJTU9ETV9OVU1ERVZTID0gMDsJCQkJCisvKiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgRk0gc3ludGhldGl6ZXJzIChpbmRleCBmcm9tIDAgdG8gCisgICBOVU1GTVNZTlRIREVWUyAtIDEpICovCitpbnQJTU9ETV9OVU1GTVNZTlRIREVWUyA9IDA7CQorLyogdGhpcyBpcyB0aGUgbnVtYmVyIG9mIE1pZGkgcG9ydHMgKGluZGV4IGZyb20gTlVNRk1TWU5USERFVlMgdG8gCisgICBOVU1GTVNZTlRIREVWUyArIE5VTU1JRElERVZTIC0gMSkgKi8KK2ludAlNT0RNX05VTU1JRElERVZTID0gMDsJCQorCisvKiB0aGlzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgTUlESSBvdXQgZGV2aWNlcyBmb3VuZCAqLworaW50IAlNSURNX05VTURFVlMgPSAwOwkJCQkKKworI2lmZGVmIEhBVkVfT1NTCitzdGF0aWMJaW50CQltaWRpU2VxRkQgPSAtMTsKK3N0YXRpYwlpbnQJCW51bU9wZW5NaWRpU2VxID0gMDsKK3N0YXRpYwlVSU5UMzIJCW1pZGlJblRpbWVySUQgPSAwOworc3RhdGljCWludAkJbnVtU3RhcnRlZE1pZGlJbiA9IDA7CisjZW5kaWYgLyogSEFWRV9PU1MgKi8KIAogLyogdGhpcyBzdHJ1Y3R1cmUgaG9sZHMgcG9pbnRlcnMgd2l0aCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBNSURJCi0gKiBkZXZpY2UgZm91bmQuCisgKiBvdXQgZGV2aWNlIGZvdW5kLgogICovCi1MUE1JRElPVVRDQVBTMTYgbWlkaURldmljZXNbTUFYX01JRElPVVREUlZdOworTFBNSURJT1VUQ0FQUzE2IG1pZGlPdXREZXZpY2VzW01BWF9NSURJT1VURFJWXTsKKworLyogdGhpcyBzdHJ1Y3R1cmUgaG9sZHMgcG9pbnRlcnMgd2l0aCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBNSURJCisgKiBpbiBkZXZpY2UgZm91bmQuCisgKi8KK0xQTUlESUlOQ0FQUzE2ICBtaWRpSW5EZXZpY2VzIFtNQVhfTUlESUlORFJWXTsKKworLyogCisgKiBGSVhNRSA6IGFsbCB0ZXN0cyBvbiBkZXZpY2UgSUQgZm9yIG1pZFhYWCBhbmQgbW9kWVlZIGFyZSBtYWRlIGFnYWluc3QgCisgKiBNQVhfTUlESXh4RFJWICh3aGVuIHRoZXkgYXJlIG1hZGUpIGJ1dCBzaG91bGQgYmUgZG9uZSBhZ2FpbnN0IHRoZSBhY3R1YWwKKyAqIG51bWJlciBvZiBtaWRpIGRldmljZXMgZm91bmQuLi4KKyAqIGNoZWNrIGFsc28gd2hlbiBIQVZFX09TUyBpcyBkZWZpbmVkIHRoYXQgbWlkaURlc2MgaXMgbm90IE5VTEwKKyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCU1JRElfTm90aWZ5Q2xpZW50CQkJW2ludGVybmFsXQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9Ob3RpZnlDbGllbnQoVUlOVDE2IHdEZXZJRCwgV09SRCB3TXNnLCAKLQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCisJCQkgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCVRSQUNFKG1pZGksIndEZXZJRCA9ICUwNFggd01zZyA9ICVkIGR3UGFybTEgPSAlMDRsWCBkd1BhcmFtMiA9ICUwNGxYXG4iLHdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQotCXN3aXRjaCAod01zZykgewotCWNhc2UgTU9NX09QRU46Ci0JY2FzZSBNT01fQ0xPU0U6Ci0JY2FzZSBNT01fRE9ORToKLQkgIGlmICh3RGV2SUQgPiBNQVhfTUlESU9VVERSVikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkgIAotCSAgaWYgKE1pZGlPdXREZXZbd0RldklEXS53RmxhZ3MgIT0gRENCX05VTEwgJiYgIURyaXZlckNhbGxiYWNrKAotCQlNaWRpT3V0RGV2W3dEZXZJRF0ubWlkaURlc2MuZHdDYWxsYmFjaywgCi0JCU1pZGlPdXREZXZbd0RldklEXS53RmxhZ3MsIAotCQlNaWRpT3V0RGV2W3dEZXZJRF0ubWlkaURlc2MuaE1pZGksIAotICAgICAgICAgICAgICAgIHdNc2csIAotCQlNaWRpT3V0RGV2W3dEZXZJRF0ubWlkaURlc2MuZHdJbnN0YW5jZSwgCi0gICAgICAgICAgICAgICAgZHdQYXJhbTEsIAotICAgICAgICAgICAgICAgIGR3UGFyYW0yKSkgewotCSAgICBXQVJOKG1pZGksImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7Ci0JICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE1JTV9PUEVOOgotCWNhc2UgTUlNX0NMT1NFOgotCSAgaWYgKHdEZXZJRCA+IE1BWF9NSURJSU5EUlYpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JICAKLQlpZiAoTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzICE9IERDQl9OVUxMICYmICFEcml2ZXJDYWxsYmFjaygKLQkJTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MuZHdDYWxsYmFjaywgTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzLCAKLQkJTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MuaE1pZGksIHdNc2csIAotCQlNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpKSB7Ci0JICAgIFdBUk4obWNpd2F2ZSwiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Ci0JCX0KLQkgIGJyZWFrOwotCX0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgRFdPUkQgCQlkd0NhbGxCYWNrOworICAgIFVJTlQxNiAJCXVGbGFnczsKKyAgICBIQU5ETEUxNiAJCWhEZXY7CisgICAgRFdPUkQgCQlkd0luc3RhbmNlOworICAgIAorICAgIFRSQUNFKG1pZGksIndEZXZJRCA9ICUwNFggd01zZyA9ICVkIGR3UGFybTEgPSAlMDRsWCBkd1BhcmFtMiA9ICUwNGxYXG4iLCAKKwkgIHdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICAKKyAgICBzd2l0Y2ggKHdNc2cpIHsKKyAgICBjYXNlIE1PTV9PUEVOOgorICAgIGNhc2UgTU9NX0NMT1NFOgorICAgIGNhc2UgTU9NX0RPTkU6CisJaWYgKHdEZXZJRCA+IE1BWF9NSURJT1VURFJWKSAKKwkgICAgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwkKKwlkd0NhbGxCYWNrID0gTWlkaU91dERldlt3RGV2SURdLm1pZGlEZXNjLT5kd0NhbGxiYWNrOworCXVGbGFncyA9IE1pZGlPdXREZXZbd0RldklEXS53RmxhZ3M7CisJaERldiA9IE1pZGlPdXREZXZbd0RldklEXS5taWRpRGVzYy0+aE1pZGk7CisJZHdJbnN0YW5jZSA9IE1pZGlPdXREZXZbd0RldklEXS5taWRpRGVzYy0+ZHdJbnN0YW5jZTsKKwlicmVhazsKKwkKKyAgICBjYXNlIE1JTV9PUEVOOgorICAgIGNhc2UgTUlNX0NMT1NFOgorICAgIGNhc2UgTUlNX0RBVEE6CisgICAgY2FzZSBNSU1fRVJST1I6CisJaWYgKHdEZXZJRCA+IE1BWF9NSURJSU5EUlYpIAorCSAgICByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworCQorCWR3Q2FsbEJhY2sgPSBNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy0+ZHdDYWxsYmFjazsKKwl1RmxhZ3MgPSBNaWRpSW5EZXZbd0RldklEXS53RmxhZ3M7CisJaERldiA9IE1pZGlJbkRldlt3RGV2SURdLm1pZGlEZXNjLT5oTWlkaTsKKwlkd0luc3RhbmNlID0gTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MtPmR3SW5zdGFuY2U7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlXQVJOKG1pZGksICJVbnN1cHBvcnRlZCBNU1ctTUlESSBtZXNzYWdlICV1XG4iLCB3TXNnKTsKKwlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gRHJpdmVyQ2FsbGJhY2soZHdDYWxsQmFjaywgdUZsYWdzLCBoRGV2LCB3TXNnLCBkd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpID8KKwkwIDogTUNJRVJSX0lOVEVSTkFMOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1JRElfUmVhZEJ5dGUJCQlbaW50ZXJuYWxdCQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9SZWFkQnl0ZShVSU5UMTYgd0RldklELCBCWVRFICpscGJ5dCkKIHsKLQlpZiAobHBieXQgIT0gTlVMTCkgewotCQlpZiAobW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUilscGJ5dCwKLQkJCShsb25nKSBzaXplb2YoQllURSkpID09IChsb25nKSBzaXplb2YoQllURSkpIHsKLQkJCXJldHVybiAwOwotCQl9CisgICAgaWYgKGxwYnl0ICE9IE5VTEwpIHsKKwlpZiAobW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUilscGJ5dCwKKwkJICAgICAgIChsb25nKSBzaXplb2YoQllURSkpID09IChsb25nKSBzaXplb2YoQllURSkpIHsKKwkgICAgcmV0dXJuIDA7CiAJfQotCVdBUk4obWlkaSwgImVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7Ci0JcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQorICAgIH0KKyAgICBXQVJOKG1pZGksICJlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworICAgIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTUlESV9SZWFkV29yZAkJCVtpbnRlcm5hbF0JCiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX1JlYWRXb3JkKFVJTlQxNiB3RGV2SUQsIExQV09SRCBscHcpCiB7Ci0JQllURQloaWJ5dGUsIGxvYnl0ZTsKLQlpZiAobHB3ICE9IE5VTEwpIHsKLQkJaWYgKE1JRElfUmVhZEJ5dGUod0RldklELCAmaGlieXRlKSA9PSAwKSB7Ci0JCQlpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZsb2J5dGUpID09IDApIHsKLQkJCQkqbHB3ID0gKChXT1JEKWhpYnl0ZSA8PCA4KSArIGxvYnl0ZTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQlXQVJOKG1pZGksICJlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwotCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci19CisgICAgQllURQloaWJ5dGUsIGxvYnl0ZTsKIAorICAgIGlmIChscHcgIT0gTlVMTCkgeworCWlmIChNSURJX1JlYWRCeXRlKHdEZXZJRCwgJmhpYnl0ZSkgPT0gMCkgeworCSAgICBpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZsb2J5dGUpID09IDApIHsKKwkJKmxwdyA9ICgoV09SRCloaWJ5dGUgPDwgOCkgKyBsb2J5dGU7CisJCXJldHVybiAwOworCSAgICB9CisJfQorICAgIH0KKyAgICBXQVJOKG1pZGksICJlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworICAgIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1JRElfUmVhZExvbmcJCQlbaW50ZXJuYWxdCQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9SZWFkTG9uZyhVSU5UMTYgd0RldklELCBMUERXT1JEIGxwZHcpCiB7Ci0JV09SRAloaXdvcmQsIGxvd29yZDsKLQlpZiAobHBkdyAhPSBOVUxMKSB7Ci0JCWlmIChNSURJX1JlYWRXb3JkKHdEZXZJRCwgJmhpd29yZCkgPT0gMCkgewotCQkJaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmbG93b3JkKSA9PSAwKSB7Ci0JCQkJKmxwZHcgPSBNQUtFTE9ORyhsb3dvcmQsIGhpd29yZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JV0FSTihtaWRpLCAiZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKLQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotfQorICAgIFdPUkQJaGl3b3JkLCBsb3dvcmQ7CiAKKyAgICBpZiAobHBkdyAhPSBOVUxMKSB7CisJaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmaGl3b3JkKSA9PSAwKSB7CisJICAgIGlmIChNSURJX1JlYWRXb3JkKHdEZXZJRCwgJmxvd29yZCkgPT0gMCkgeworCQkqbHBkdyA9IE1BS0VMT05HKGxvd29yZCwgaGl3b3JkKTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgfQorICAgIFdBUk4obWlkaSwgImVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisgICAgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgCQkJCU1JRElfUmVhZFZhcnlMZW4JCVtpbnRlcm5hbF0JCiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX1JlYWRWYXJ5TGVuKFVJTlQxNiB3RGV2SUQsIExQRFdPUkQgbHBkdykKIHsKLQlCWVRFCWJ5dGU7Ci0JRFdPUkQJdmFsdWU7Ci0JaWYgKGxwZHcgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZieXRlKSAhPSAwKSB7Ci0JCVdBUk4obWlkaSwgImVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7Ci0JCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JfQotCXZhbHVlID0gKERXT1JEKShieXRlICYgMHg3Rik7Ci0Jd2hpbGUgKGJ5dGUgJiAweDgwKSB7Ci0JCWlmIChNSURJX1JlYWRCeXRlKHdEZXZJRCwgJmJ5dGUpICE9IDApIHsKLQkJCVdBUk4obWlkaSwgImVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7Ci0JCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQl9Ci0JCXZhbHVlID0gKHZhbHVlIDw8IDcpICsgKGJ5dGUgJiAweDdGKTsKLQl9Ci0JKmxwZHcgPSB2YWx1ZTsKLS8qCi0JVFJBQ0UobWlkaSwgInZhbD0lMDhsWCBcbiIsIHZhbHVlKTsKLSovCi0JcmV0dXJuIDA7Ci19CisgICAgQllURQlieXRlOworICAgIERXT1JECXZhbHVlOwogCisgICAgaWYgKGxwZHcgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKyAgICBpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZieXRlKSAhPSAwKSB7CisJV0FSTihtaWRpLCAiZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIH0KKyAgICB2YWx1ZSA9IChEV09SRCkoYnl0ZSAmIDB4N0YpOworICAgIHdoaWxlIChieXRlICYgMHg4MCkgeworCWlmIChNSURJX1JlYWRCeXRlKHdEZXZJRCwgJmJ5dGUpICE9IDApIHsKKwkgICAgV0FSTihtaWRpLCAiZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwkgICAgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwl9CisJdmFsdWUgPSAodmFsdWUgPDwgNykgKyAoYnl0ZSAmIDB4N0YpOworICAgIH0KKyAgICAqbHBkdyA9IHZhbHVlOworICAgIC8qCisgICAgICBUUkFDRShtaWRpLCAidmFsPSUwOGxYIFxuIiwgdmFsdWUpOworICAgICovCisgICAgcmV0dXJuIDA7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1JRElfUmVhZE1UaGQJCQlbaW50ZXJuYWxdCQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9SZWFkTVRoZChVSU5UMTYgd0RldklELCBEV09SRCBkd09mZnNldCkKIHsKLQlEV09SRAl0b2JlcmVhZDsKLQlGT1VSQ0MJZm91cmNjOwotCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgpO1xuIiwgd0RldklELCBkd09mZnNldCk7Ci0JaWYgKG1taW9TZWVrMzIoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7Ci0JCVdBUk4obWlkaSwgImNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOwotCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCX0KLQlpZiAobW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikmZm91cmNjLAotCQkobG9uZykgc2l6ZW9mKEZPVVJDQykpICE9IChsb25nKSBzaXplb2YoRk9VUkNDKSkKLQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoTUlESV9SZWFkTG9uZyh3RGV2SUQsICZ0b2JlcmVhZCkgIT0gMCkKLQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoTUlESV9SZWFkV29yZCh3RGV2SUQsICZNQ0lNaWRpRGV2W3dEZXZJRF0ud0Zvcm1hdCkgIT0gMCkKLQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoTUlESV9SZWFkV29yZCh3RGV2SUQsICZNQ0lNaWRpRGV2W3dEZXZJRF0ublRyYWNrcykgIT0gMCkKLQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoTUlESV9SZWFkV29yZCh3RGV2SUQsICZNQ0lNaWRpRGV2W3dEZXZJRF0ublRlbXBvKSAhPSAwKQotCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCVRSQUNFKG1pZGksICJ0b2JlcmVhZD0lMDhsWCwgd0Zvcm1hdD0lMDRYIG5UcmFja3M9JTA0WCBuVGVtcG89JTA0WFxuIiwKLQkJdG9iZXJlYWQsIE1DSU1pZGlEZXZbd0RldklEXS53Rm9ybWF0LAotCQlNQ0lNaWRpRGV2W3dEZXZJRF0ublRyYWNrcywKLQkJTUNJTWlkaURldlt3RGV2SURdLm5UZW1wbyk7Ci0JdG9iZXJlYWQgLT0gMyAqIHNpemVvZihXT1JEKTsKLS8qCi0JCW50cmtzID0gcmVhZDE2Yml0ICgpOwotCQlNZl9kaXZpc2lvbiA9IGRpdmlzaW9uID0gcmVhZDE2Yml0ICgpOwotKi8KLQlyZXR1cm4gMDsKLX0KKyAgICBEV09SRAl0b2JlcmVhZDsKKyAgICBGT1VSQ0MJZm91cmNjOwogCisgICAgVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3T2Zmc2V0KTsKKyAgICBpZiAobW1pb1NlZWszMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKKwlXQVJOKG1pZGksICJjYW4ndCBzZWVrIGF0ICUwOGxYIGJlZ2luIG9mICdNVGhkJyBcbiIsIGR3T2Zmc2V0KTsKKwlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIH0KKyAgICBpZiAobW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikmZm91cmNjLAorCQkgICAobG9uZykgc2l6ZW9mKEZPVVJDQykpICE9IChsb25nKSBzaXplb2YoRk9VUkNDKSkKKwlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIGlmIChNSURJX1JlYWRMb25nKHdEZXZJRCwgJnRvYmVyZWFkKSAhPSAwKQorCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldlt3RGV2SURdLndGb3JtYXQpICE9IDApCisJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKyAgICBpZiAoTUlESV9SZWFkV29yZCh3RGV2SUQsICZNQ0lNaWRpRGV2W3dEZXZJRF0ublRyYWNrcykgIT0gMCkKKwlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIGlmIChNSURJX1JlYWRXb3JkKHdEZXZJRCwgJk1DSU1pZGlEZXZbd0RldklEXS5uVGVtcG8pICE9IDApCisJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKyAgICBUUkFDRShtaWRpLCAidG9iZXJlYWQ9JTA4bFgsIHdGb3JtYXQ9JTA0WCBuVHJhY2tzPSUwNFggblRlbXBvPSUwNFhcbiIsCisJICB0b2JlcmVhZCwgTUNJTWlkaURldlt3RGV2SURdLndGb3JtYXQsCisJICBNQ0lNaWRpRGV2W3dEZXZJRF0ublRyYWNrcywKKwkgIE1DSU1pZGlEZXZbd0RldklEXS5uVGVtcG8pOworICAgIHRvYmVyZWFkIC09IDMgKiBzaXplb2YoV09SRCk7CisgICAgLyoKKyAgICAgIG50cmtzID0gcmVhZDE2Yml0ICgpOworICAgICAgTWZfZGl2aXNpb24gPSBkaXZpc2lvbiA9IHJlYWQxNmJpdCAoKTsKKyAgICAqLworICAgIHJldHVybiAwOworfQogCiBzdGF0aWMgRFdPUkQgTUlESV9SZWFkTVRyayhVSU5UMTYgd0RldklELCBEV09SRCBkd09mZnNldCkKIHsKLQlEV09SRAl0b2JlcmVhZDsKLQlGT1VSQ0MJZm91cmNjOwotCWlmIChtbWlvU2VlazMyKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgZHdPZmZzZXQsIFNFRUtfU0VUKSAhPSBkd09mZnNldCkgewotCQlXQVJOKG1pZGksICJjYW4ndCBzZWVrIGF0ICUwOGxYIGJlZ2luIG9mICdNVGhkJyBcbiIsIGR3T2Zmc2V0KTsKLQkJfQotCWlmIChtbWlvUmVhZDMyKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsCi0JCShsb25nKSBzaXplb2YoRk9VUkNDKSkgIT0gKGxvbmcpIHNpemVvZihGT1VSQ0MpKSB7Ci0JCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JCX0KLQlpZiAoTUlESV9SZWFkTG9uZyh3RGV2SUQsICZ0b2JlcmVhZCkgIT0gMCkgewotCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQl9Ci0JVFJBQ0UobWlkaSwgInRvYmVyZWFkPSUwOGxYXG4iLCB0b2JlcmVhZCk7Ci0JdG9iZXJlYWQgLT0gMyAqIHNpemVvZihXT1JEKTsKLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IHRvYmVyZWFkOwotCXJldHVybiAwOwotfQorICAgIERXT1JECXRvYmVyZWFkOworICAgIEZPVVJDQwlmb3VyY2M7CiAKKyAgICBpZiAobW1pb1NlZWszMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKKwlXQVJOKG1pZGksICJjYW4ndCBzZWVrIGF0ICUwOGxYIGJlZ2luIG9mICdNVGhkJyBcbiIsIGR3T2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKG1taW9SZWFkMzIoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKKwkJICAgKGxvbmcpIHNpemVvZihGT1VSQ0MpKSAhPSAobG9uZykgc2l6ZW9mKEZPVVJDQykpIHsKKwlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIH0KKyAgICBpZiAoTUlESV9SZWFkTG9uZyh3RGV2SUQsICZ0b2JlcmVhZCkgIT0gMCkgeworCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgfQorICAgIFRSQUNFKG1pZGksICJ0b2JlcmVhZD0lMDhsWFxuIiwgdG9iZXJlYWQpOworICAgIHRvYmVyZWFkIC09IDMgKiBzaXplb2YoV09SRCk7CisgICAgTUNJTWlkaURldlt3RGV2SURdLmR3VG90YWxMZW4gPSB0b2JlcmVhZDsKKyAgICByZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTUlESV9tY2lPcGVuCQkJW2ludGVybmFsXQkKICAqLwogc3RhdGljIERXT1JEIE1JRElfbWNpT3BlbihVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TMTYgbHBQYXJtcykKIHsKLQlNSURJT1BFTkRFU0MgCU1pZGlEZXNjOwotCURXT1JECQlkd1JldDsKLQlEV09SRAkJZHdPZmZzZXQ7Ci0JTFBTVFIJCWxwc3RyRWxlbWVudE5hbWU7Ci0JY2hhcgkJc3RyWzEyOF07Ci0KLQlUUkFDRShtaWRpLCAiKCUwOGxYLCAlcClcbiIsIGR3RmxhZ3MsIGxwUGFybXMpOwotCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0KLQlpZiAoTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudCA+IDApIHsKLQkJLyogVGhlIGRyaXZlciBhbHJlYWR5IG9wZW4gb24gdGhpcyBjaGFubmVsICovCi0JCS8qIElmIHRoZSBkcml2ZXIgd2FzIG9wZW5lZCBzaGFyZWFibGUgYmVmb3JlIGFuZCB0aGlzIG9wZW4gc3BlY2lmaWVzICovCi0JCS8qIHNoYXJlYWJsZSB0aGVuIGluY3JlbWVudCB0aGUgdXNlIGNvdW50ICovCi0JCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSAmJiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkpCi0JCQkrK01DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQ7Ci0JCWVsc2UKLQkJCXJldHVybiBNQ0lFUlJfTVVTVF9VU0VfU0hBUkVBQkxFOwotCX0gZWxzZSB7Ci0JCU1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPSAxOwotCQlNQ0lNaWRpRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7Ci0JCU1DSU1pZGlEZXZbd0RldklEXS5oTWlkaUhkciA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoTUlESUhEUikpOworICAgIE1JRElPUEVOREVTQyAJTWlkaURlc2M7CisgICAgRFdPUkQJCWR3UmV0OworICAgIERXT1JECQlkd09mZnNldDsKKyAgICBMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKKyAgICBjaGFyCQlzdHJbMTI4XTsKKyAgICAKKyAgICBUUkFDRShtaWRpLCAiKCUwOGxYLCAlcClcbiIsIGR3RmxhZ3MsIGxwUGFybXMpOworICAgIGlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgCisgICAgaWYgKE1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CisJLyogVGhlIGRyaXZlciBhbHJlYWR5IG9wZW4gb24gdGhpcyBjaGFubmVsICovCisJLyogSWYgdGhlIGRyaXZlciB3YXMgb3BlbmVkIHNoYXJlYWJsZSBiZWZvcmUgYW5kIHRoaXMgb3BlbiBzcGVjaWZpZXMgKi8KKwkvKiBzaGFyZWFibGUgdGhlbiBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudCAqLworCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSAmJiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkpCisJICAgICsrTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudDsKKwllbHNlCisJICAgIHJldHVybiBNQ0lFUlJfTVVTVF9VU0VfU0hBUkVBQkxFOworICAgIH0gZWxzZSB7CisJTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudCA9IDE7CisJTUNJTWlkaURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOworCU1DSU1pZGlEZXZbd0RldklEXS5oTWlkaUhkciA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoTUlESUhEUikpOworICAgIH0KKyAgICAKKyAgICBUUkFDRShtaWRpLCAid0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisgICAgLyoJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOyovCisgICAgVFJBQ0UobWlkaSwgImxwUGFybXMtPndEZXZJRD0lMDRYXG4iLCBscFBhcm1zLT53RGV2aWNlSUQpOworICAgIFRSQUNFKG1pZGksICJiZWZvcmUgT1BFTl9FTEVNRU5UXG4iKTsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKKwlscHN0ckVsZW1lbnROYW1lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOworCVRSQUNFKG1pZGksICJNQ0lfT1BFTl9FTEVNRU5UICclcycgIVxuIiwgbHBzdHJFbGVtZW50TmFtZSk7CisJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKKwkgICAgc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7CisJICAgIENoYXJVcHBlcjMyQShzdHIpOworCSAgICBNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSBtbWlvT3BlbjE2KHN0ciwgTlVMTCwgCisJCQkJCQkgIE1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQURXUklURSB8IE1NSU9fRVhDTFVTSVZFKTsKKwkgICAgaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7CisJCVdBUk4obWlkaSwgImNhbid0IGZpbmQgZmlsZT0nJXMnICFcbiIsIHN0cik7CisJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CisJICAgIH0KKwl9IGVsc2UgCisJICAgIE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9IDA7CisgICAgfQorICAgIFRSQUNFKG1pZGksICJoRmlsZT0ldVxuIiwgTUNJTWlkaURldlt3RGV2SURdLmhGaWxlKTsKKyAgICBtZW1jcHkoJk1DSU1pZGlEZXZbd0RldklEXS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNUzE2KSk7CisgICAgTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKKyAgICBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOworICAgIE1DSU1pZGlEZXZbd0RldklEXS5kd0JlZ2luRGF0YSA9IDA7CisgICAgTUNJTWlkaURldlt3RGV2SURdLmR3VG90YWxMZW4gPSAwOworICAgIE1pZGlEZXNjLmhNaWRpID0gMDsKKyAgICBpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlICE9IDApIHsKKwlNTUNLSU5GTwlja01haW5SSUZGOworCWlmIChtbWlvRGVzY2VuZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsICZja01haW5SSUZGLCBOVUxMLCAwKSAhPSAwKSB7CisJICAgIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJfQotCi0JVFJBQ0UobWlkaSwgIndEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwotLyoJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOyovCi0JVFJBQ0UobWlkaSwgImxwUGFybXMtPndEZXZJRD0lMDRYXG4iLCBscFBhcm1zLT53RGV2aWNlSUQpOwotCVRSQUNFKG1pZGksICJiZWZvcmUgT1BFTl9FTEVNRU5UXG4iKTsKLQlpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKLQkJbHBzdHJFbGVtZW50TmFtZSA9IChMUFNUUilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKLQkJVFJBQ0UobWlkaSwgIk1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKLQkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKLQkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwotCQkJQ2hhclVwcGVyMzJBKHN0cik7Ci0JCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSBtbWlvT3BlbjE2KHN0ciwgTlVMTCwgCi0JCQkJTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRFdSSVRFIHwgTU1JT19FWENMVVNJVkUpOwotCQkJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0JCQkJV0FSTihtaWRpLCAiY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgc3RyKTsKLQkJCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwotCQkJfQotCQl9IGVsc2UgCi0JCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSAwOworCVRSQUNFKG1pZGksIlBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKKwkgICAgICAoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsCisJICAgICAgY2tNYWluUklGRi5ja3NpemUpOworCWR3T2Zmc2V0ID0gMDsKKwlpZiAoY2tNYWluUklGRi5ja2lkID09IG1taW9GT1VSQ0MoJ1InLCAnTScsICdJJywgJ0QnKSkgeworCSAgICBUUkFDRShtaWRpLCAiaXMgYSAnUk1JRCcgZmlsZSBcbiIpOworCSAgICBkd09mZnNldCA9IGNrTWFpblJJRkYuZHdEYXRhT2Zmc2V0OwogCX0KLQlUUkFDRShtaWRpLCAiaEZpbGU9JXVcbiIsIE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSk7Ci0JbWVtY3B5KCZNQ0lNaWRpRGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVMxNikpOwotCU1DSU1pZGlEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7Ci0JTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdCZWdpbkRhdGEgPSAwOwotCU1DSU1pZGlEZXZbd0RldklEXS5kd1RvdGFsTGVuID0gMDsKLQlNaWRpRGVzYy5oTWlkaSA9IDA7Ci0JaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSAhPSAwKSB7Ci0JCU1NQ0tJTkZPCWNrTWFpblJJRkY7Ci0JCWlmIChtbWlvRGVzY2VuZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsICZja01haW5SSUZGLCBOVUxMLCAwKSAhPSAwKSB7Ci0JCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQl9Ci0JCVRSQUNFKG1pZGksIlBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKLQkJCQkoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsCi0JCQkJY2tNYWluUklGRi5ja3NpemUpOwotCQlkd09mZnNldCA9IDA7Ci0JCWlmIChja01haW5SSUZGLmNraWQgPT0gbW1pb0ZPVVJDQygnUicsICdNJywgJ0knLCAnRCcpKSB7Ci0JCQlUUkFDRShtaWRpLCAiaXMgYSAnUk1JRCcgZmlsZSBcbiIpOwotCQkJZHdPZmZzZXQgPSBja01haW5SSUZGLmR3RGF0YU9mZnNldDsKLQkJfQotCQlpZiAoY2tNYWluUklGRi5ja2lkICE9IG1taW9GT1VSQ0MoJ00nLCAnVCcsICdoJywgJ2QnKSkgewotCQkJV0FSTihtaWRpLCAidW5rbm93biBmb3JtYXQgIVxuIik7Ci0JCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQl9Ci0JCWlmIChNSURJX1JlYWRNVGhkKHdEZXZJRCwgZHdPZmZzZXQpICE9IDApIHsKLQkJCVdBUk4obWlkaSwgImNhbid0IHJlYWQgJ01UaGQnIGhlYWRlciBcbiIpOwotCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJfQotCQlkd09mZnNldCA9IG1taW9TZWVrMzIoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwLCBTRUVLX0NVUik7Ci0JCWlmIChNSURJX1JlYWRNVHJrKHdEZXZJRCwgZHdPZmZzZXQpICE9IDApIHsKLQkJCVdBUk4obWlkaSwgImNhbid0IHJlYWQgJ01UcmsnIGhlYWRlciBcbiIpOwotCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJfQotCQlkd09mZnNldCA9IG1taW9TZWVrMzIoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwLCBTRUVLX0NVUik7Ci0JCU1DSU1pZGlEZXZbd0RldklEXS5kd0JlZ2luRGF0YSA9IGR3T2Zmc2V0OwotCQlUUkFDRShtaWRpLCAiQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAotCQkJCShMUFNUUikmY2tNYWluUklGRi5ja2lkLCAoTFBTVFIpJmNrTWFpblJJRkYuZmNjVHlwZSwKLQkJCQlja01haW5SSUZGLmNrc2l6ZSk7CisJaWYgKGNrTWFpblJJRkYuY2tpZCAhPSBtbWlvRk9VUkNDKCdNJywgJ1QnLCAnaCcsICdkJykpIHsKKwkgICAgV0FSTihtaWRpLCAidW5rbm93biBmb3JtYXQgIVxuIik7CisJICAgIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJfQotCi0JZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9PUEVOLCAwLCAoRFdPUkQpJk1pZGlEZXNjLCBDQUxMQkFDS19OVUxMKTsKLS8qCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fT1BFTiwgMCwgKERXT1JEKSZNaWRpRGVzYywgQ0FMTEJBQ0tfTlVMTCk7Ki8KLQotCXJldHVybiAwOworCWlmIChNSURJX1JlYWRNVGhkKHdEZXZJRCwgZHdPZmZzZXQpICE9IDApIHsKKwkgICAgV0FSTihtaWRpLCAiY2FuJ3QgcmVhZCAnTVRoZCcgaGVhZGVyIFxuIik7CisJICAgIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisJfQorCWR3T2Zmc2V0ID0gbW1pb1NlZWszMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKKwlpZiAoTUlESV9SZWFkTVRyayh3RGV2SUQsIGR3T2Zmc2V0KSAhPSAwKSB7CisJICAgIFdBUk4obWlkaSwgImNhbid0IHJlYWQgJ01UcmsnIGhlYWRlciBcbiIpOworCSAgICByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworCX0KKwlkd09mZnNldCA9IG1taW9TZWVrMzIoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwLCBTRUVLX0NVUik7CisJTUNJTWlkaURldlt3RGV2SURdLmR3QmVnaW5EYXRhID0gZHdPZmZzZXQ7CisJVFJBQ0UobWlkaSwgIkNodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKKwkgICAgICAoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsCisJICAgICAgY2tNYWluUklGRi5ja3NpemUpOworICAgIH0KKyAgICAKKyAgICBkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX09QRU4sIDAsIChEV09SRCkmTWlkaURlc2MsIENBTExCQUNLX05VTEwpOworICAgIC8qCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fT1BFTiwgMCwgKERXT1JEKSZNaWRpRGVzYywgQ0FMTEJBQ0tfTlVMTCk7Ki8KKyAgICAKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMTMsNDU4ICszNTQsNjc3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaVN0b3AoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewotCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7Ci0JaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwotCVRSQUNFKG1pZGksICJNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCi0JCQkmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOwotCXJldHVybiAwOworICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisgICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKyAgICBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOworICAgIFRSQUNFKG1pZGksICJNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCisJICAmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOworICAgIHJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQkJCU1JRElfbWNpQ2xvc2UJCVtpbnRlcm5hbF0KKyAqIAkJCQlNSURJX21jaUNsb3NlCQkJW2ludGVybmFsXQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lDbG9zZShVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7Ci0JRFdPUkQJCWR3UmV0OwotCi0JVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKLQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKLQkJTUlESV9tY2lTdG9wKHdEZXZJRCwgTUNJX1dBSVQsIGxwUGFybXMpOwotCQl9Ci0JTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKLQlNQ0lNaWRpRGV2W3dEZXZJRF0ublVzZUNvdW50LS07Ci0JaWYgKE1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPT0gMCkgewotCQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlICE9IDApIHsKLQkJCW1taW9DbG9zZTMyKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgMCk7Ci0JCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSAwOwotCQkJVFJBQ0UobWlkaSwgImhGaWxlIGNsb3NlZCAhXG4iKTsKLQkJfQotCQlVU0VSX0hFQVBfRlJFRShNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOwotCQlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX0NMT1NFLCAwLCAwTCwgMEwpOwotCQlpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLS8qCi0JCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fQ0xPU0UsIDAsIDBMLCAwTCk7Ci0JCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotKi8KLQkJfQotCXJldHVybiAwOworICAgIERXT1JECQlkd1JldDsKKyAgICAKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOworICAgIGlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgeworCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCBscFBhcm1zKTsKKyAgICB9CisgICAgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKKyAgICBNQ0lNaWRpRGV2W3dEZXZJRF0ublVzZUNvdW50LS07CisgICAgaWYgKE1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPT0gMCkgeworCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgIT0gMCkgeworCSAgICBtbWlvQ2xvc2UzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDApOworCSAgICBNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSAwOworCSAgICBUUkFDRShtaWRpLCAiaEZpbGUgY2xvc2VkICFcbiIpOworCX0KKwlVU0VSX0hFQVBfRlJFRShNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOworCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CisJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisJLyoKKwkgIGR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CisJICBpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwkqLworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQlNSURJX21jaVBsYXkJCVtpbnRlcm5hbF0KKyAqIAkJCQlNSURJX21jaVBsYXkJCQlbaW50ZXJuYWxdCiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQogewotCWludAkJY291bnQsc3RhcnQsZW5kOwotCUxQTUlESUhEUglscE1pZGlIZHI7Ci0JRFdPUkQJCWR3RGF0YSxkd1JldDsKLQlMUFdPUkQJCXB0cjsKLQotCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7Ci0JaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0JCVdBUk4obWlkaSwgImNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAotCQkJCShEV09SRClNQ0lNaWRpRGV2W3dEZXZJRF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwotCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwotCX0KLQlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7Ci0JaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewotCQlzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCi0JCVRSQUNFKG1pZGksICJNQ0lfRlJPTT0lZCBcbiIsIHN0YXJ0KTsKLQl9Ci0JaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKLQkJZW5kID0gbHBQYXJtcy0+ZHdUbzsKLQkJVFJBQ0UobWlkaSwgIk1DSV9UTz0lZCBcbiIsIGVuZCk7Ci0JfQorICAgIGludAkJCWNvdW50LHN0YXJ0LGVuZDsKKyAgICBMUE1JRElIRFIJCWxwTWlkaUhkcjsKKyAgICBEV09SRAkJZHdEYXRhLGR3UmV0OworICAgIExQV09SRAkJcHRyOworICAgIAorICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisgICAgaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7CisJV0FSTihtaWRpLCAiY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCisJICAgICAoRFdPUkQpTUNJTWlkaURldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKKwlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOworICAgIH0KKyAgICBzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CisgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgeworCXN0YXJ0ID0gbHBQYXJtcy0+ZHdGcm9tOyAKKwlUUkFDRShtaWRpLCAiTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CisgICAgfQorICAgIGlmIChkd0ZsYWdzICYgTUNJX1RPKSB7CisJZW5kID0gbHBQYXJtcy0+ZHdUbzsKKwlUUkFDRShtaWRpLCAiTUNJX1RPPSVkIFxuIiwgZW5kKTsKKyAgICB9CiAjaWYgMAotCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlUUkFDRShtaWRpLCAiTUNJX05PVElGWSAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKLQkJc3dpdGNoKGZvcmsoKSkgewotCQljYXNlIC0xOgotCQkJV0FSTihtaWRpLCAiQ2FuJ3QgJ2ZvcmsnIHByb2Nlc3MgIVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQkJVFJBQ0UobWlkaSwgInByb2Nlc3Mgc3RhcnRlZCAhIHBsYXkgaW4gYmFja2dyb3VuZCAuLi5cbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlUUkFDRShtaWRpLCAicHJvY2VzcyBzdGFydGVkICEgcmV0dXJuIHRvIGNhbGxlci4uLlxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQorICAgIGlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgeworCVRSQUNFKG1pZGksICJNQ0lfTk9USUZZICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCXN3aXRjaChmb3JrKCkpIHsKKwljYXNlIC0xOgorCSAgICBXQVJOKG1pZGksICJDYW4ndCAnZm9yaycgcHJvY2VzcyAhXG4iKTsKKwkgICAgYnJlYWs7CisJY2FzZSAwOgorCSAgICBUUkFDRShtaWRpLCAicHJvY2VzcyBzdGFydGVkICEgcGxheSBpbiBiYWNrZ3JvdW5kIC4uLlxuIik7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIFRSQUNFKG1pZGksICJwcm9jZXNzIHN0YXJ0ZWQgISByZXR1cm4gdG8gY2FsbGVyLi4uXG4iKTsKKwkgICAgcmV0dXJuIDA7CiAJfQorICAgIH0KICNlbmRpZgotCi0JbHBNaWRpSGRyID0gVVNFUl9IRUFQX0xJTl9BRERSKE1DSU1pZGlEZXZbd0RldklEXS5oTWlkaUhkcik7Ci0KLQlscE1pZGlIZHItPmxwRGF0YSA9IChMUFNUUil4bWFsbG9jKDEyMDApOwotCWlmIChscE1pZGlIZHItPmxwRGF0YSA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGggPSAxMDI0OwotCWxwTWlkaUhkci0+ZHdVc2VyID0gMEw7Ci0JbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7Ci0JZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwotCi0vKglUUkFDRShtaWRpLCAiYWZ0ZXIgTU9ETV9QUkVQQVJFIFxuIik7ICovCi0KLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwotCXdoaWxlKE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7Ci0JCVRSQUNFKG1pZGksICJNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCi0JCQkmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOwotCi0JCXB0ciA9IChMUFdPUkQpbHBNaWRpSGRyLT5scERhdGE7Ci0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGg7IGNvdW50KyspIHsKLQkJCWlmIChNSURJX1JlYWRWYXJ5TGVuKHdEZXZJRCwgJmR3RGF0YSkgIT0gMCkgYnJlYWs7Ci0JCQkqcHRyID0gTE9XT1JEKGR3RGF0YSk7Ci0JCX0KLS8qCi0JCWNvdW50ID0gbW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGxwTWlkaUhkci0+bHBEYXRhLCBscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoKTsKLSovCi0JCVRSQUNFKG1pZGksICJhZnRlciByZWFkIGNvdW50ID0gJWRcbiIsY291bnQpOwotCi0JCWlmIChjb3VudCA8IDEpIGJyZWFrOwotCQlscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OwotCQlUUkFDRShtaWRpLCAiYmVmb3JlIE1PRE1fTE9OR0RBVEEgbHBNaWRpSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCi0JCQkJCWxwTWlkaUhkciwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwotCQlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX0xPTkdEQVRBLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwotCQlpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQkgIHN3aXRjaCAoZHdSZXQpIHsKLQkJICBjYXNlIE1NU1lTRVJSX05PVEVOQUJMRUQ6Ci0JCSAgICByZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfUkVBRFk7Ci0JCSAgICAKLQkJICBjYXNlIE1JRElFUlJfTk9ERVZJQ0U6Ci0JCSAgICByZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwotCi0JCSAgY2FzZSBNSURJRVJSX1VOUFJFUEFSRUQ6Ci0JCSAgICByZXR1cm4gTUNJRVJSX0RSSVZFUl9JTlRFUk5BTDsKLQotCQkgIGNhc2UgTUlESUVSUl9TVElMTFBMQVlJTkc6Ci0JCSAgICByZXR1cm4gTUNJRVJSX1NFUV9QT1JUX0lOVVNFOwotCi0JCSAgY2FzZSBNTVNZU0VSUl9JTlZBTFBBUkFNOgotCQkgICAgcmV0dXJuIE1DSUVSUl9DQU5OT1RfTE9BRF9EUklWRVI7Ci0JCSAgCi0JCSAgZGVmYXVsdDoKLQkJICAgIHJldHVybiBNQ0lFUlJfRFJJVkVSOwotCQkgIH0JCi0JCX0KLQkgICAgICB9Ci0JZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9VTlBSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7Ci0JaWYgKGxwTWlkaUhkci0+bHBEYXRhICE9IE5VTEwpIHsKLQkJZnJlZShscE1pZGlIZHItPmxwRGF0YSk7Ci0JCWxwTWlkaUhkci0+bHBEYXRhID0gTlVMTDsKKyAgICAKKyAgICBscE1pZGlIZHIgPSBVU0VSX0hFQVBfTElOX0FERFIoTUNJTWlkaURldlt3RGV2SURdLmhNaWRpSGRyKTsKKyAgICAKKyAgICBscE1pZGlIZHItPmxwRGF0YSA9IChMUFNUUil4bWFsbG9jKDEyMDApOworICAgIGlmIChscE1pZGlIZHItPmxwRGF0YSA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGggPSAxMDI0OworICAgIGxwTWlkaUhkci0+ZHdVc2VyID0gMEw7CisgICAgbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7CisgICAgZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOworICAgIAorICAgIC8qCVRSQUNFKG1pZGksICJhZnRlciBNT0RNX1BSRVBBUkUgXG4iKTsgKi8KKyAgICAKKyAgICBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOworICAgIHdoaWxlKE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CisJVFJBQ0UobWlkaSwgIk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cz0lcCAlZFxuIiwKKwkgICAgICAmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOworCQorCXB0ciA9IChMUFdPUkQpbHBNaWRpSGRyLT5scERhdGE7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbHBNaWRpSGRyLT5kd0J1ZmZlckxlbmd0aDsgY291bnQrKykgeworCSAgICBpZiAoTUlESV9SZWFkVmFyeUxlbih3RGV2SUQsICZkd0RhdGEpICE9IDApIGJyZWFrOworCSAgICAqcHRyID0gTE9XT1JEKGR3RGF0YSk7CiAJfQotCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7Ci0JaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCVRSQUNFKG1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7Ci0JCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCisJLyoKKwkgIGNvdW50ID0gbW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGxwTWlkaUhkci0+bHBEYXRhLCBscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoKTsKKwkqLworCVRSQUNFKG1pZGksICJhZnRlciByZWFkIGNvdW50ID0gJWRcbiIsY291bnQpOworCQorCWlmIChjb3VudCA8IDEpIGJyZWFrOworCWxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkID0gY291bnQ7CisJVFJBQ0UobWlkaSwgImJlZm9yZSBNT0RNX0xPTkdEQVRBIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAorCSAgICAgIGxwTWlkaUhkciwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOworCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fTE9OR0RBVEEsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CisJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKwkgICAgc3dpdGNoIChkd1JldCkgeworCSAgICBjYXNlIE1NU1lTRVJSX05PVEVOQUJMRUQ6CisJCXJldHVybiBNQ0lFUlJfREVWSUNFX05PVF9SRUFEWTsKKwkJCisJICAgIGNhc2UgTUlESUVSUl9OT0RFVklDRToKKwkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKKwkJCisJICAgIGNhc2UgTUlESUVSUl9VTlBSRVBBUkVEOgorCQlyZXR1cm4gTUNJRVJSX0RSSVZFUl9JTlRFUk5BTDsKKwkJCisJICAgIGNhc2UgTUlESUVSUl9TVElMTFBMQVlJTkc6CisJCXJldHVybiBNQ0lFUlJfU0VRX1BPUlRfSU5VU0U7CisJCQorCSAgICBjYXNlIE1NU1lTRVJSX0lOVkFMUEFSQU06CisJCXJldHVybiBNQ0lFUlJfQ0FOTk9UX0xPQURfRFJJVkVSOworCQkKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIE1DSUVSUl9EUklWRVI7CisJICAgIH0JCisJfQorICAgIH0KKyAgICBkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKKyAgICBpZiAobHBNaWRpSGRyLT5scERhdGEgIT0gTlVMTCkgeworCWZyZWUobHBNaWRpSGRyLT5scERhdGEpOworCWxwTWlkaUhkci0+bHBEYXRhID0gTlVMTDsKKyAgICB9CisgICAgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKKwlUUkFDRShtaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwotCX0KLQlyZXR1cm4gMDsKLSAgICAgIH0KLQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTUlESV9tY2lSZWNvcmQJCQlbaW50ZXJuYWxdCiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaVJlY29yZChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9SRUNPUkRfUEFSTVMgbHBQYXJtcykKIHsKLQlpbnQJCQlzdGFydCwgZW5kOwotCUxQTUlESUhEUglscE1pZGlIZHI7Ci0JRFdPUkQJCWR3UmV0OwotCi0JVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKLQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID09IDApIHsKLQkJV0FSTihtaWRpLCAiY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCi0JCQkoRFdPUkQpTUNJTWlkaURldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKLQkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKLQl9Ci0Jc3RhcnQgPSAxOyAJCWVuZCA9IDk5OTk5OwotCWlmIChkd0ZsYWdzICYgTUNJX0ZST00pIHsKLQkJc3RhcnQgPSBscFBhcm1zLT5kd0Zyb207IAotCQlUUkFDRShtaWRpLCAiTUNJX0ZST009JWQgXG4iLCBzdGFydCk7Ci0JfQotCWlmIChkd0ZsYWdzICYgTUNJX1RPKSB7Ci0JCWVuZCA9IGxwUGFybXMtPmR3VG87Ci0JCVRSQUNFKG1pZGksICJNQ0lfVE89JWQgXG4iLCBlbmQpOwotCX0KLQlscE1pZGlIZHIgPSBVU0VSX0hFQVBfTElOX0FERFIoTUNJTWlkaURldlt3RGV2SURdLmhNaWRpSGRyKTsKLQlscE1pZGlIZHItPmxwRGF0YSA9IChMUFNUUikgeG1hbGxvYygxMjAwKTsKLQlscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoID0gMTAyNDsKLQlscE1pZGlIZHItPmR3VXNlciA9IDBMOwotCWxwTWlkaUhkci0+ZHdGbGFncyA9IDBMOwotCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKLQlUUkFDRShtaWRpLCAiYWZ0ZXIgTUlETV9QUkVQQVJFIFxuIik7Ci0JTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfUkVDT1JEOwotCXdoaWxlKE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7Ci0JCVRSQUNFKG1pZGksICJNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCi0JCQkmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOwotCQlscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fU1RBUlQsIDAsIDBMLCAwTCk7Ci0JCVRSQUNFKG1pZGksICJhZnRlciBNSURNX1NUQVJUIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAotCQkJCQlscE1pZGlIZHIsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKLQkJaWYgKGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkID09IDApIGJyZWFrOwotCX0KLQlUUkFDRShtaWRpLCAiYmVmb3JlIE1JRE1fVU5QUkVQQVJFIFxuIik7Ci0JZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9VTlBSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7Ci0JVFJBQ0UobWlkaSwgImFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7Ci0JaWYgKGxwTWlkaUhkci0+bHBEYXRhICE9IE5VTEwpIHsKLQkJZnJlZShscE1pZGlIZHItPmxwRGF0YSk7Ci0JCWxwTWlkaUhkci0+bHBEYXRhID0gTlVMTDsKLQl9Ci0JTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKLQlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJVFJBQ0UobWlkaSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKLQkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKKyAgICBpbnQJCQlzdGFydCwgZW5kOworICAgIExQTUlESUhEUgkJbHBNaWRpSGRyOworICAgIERXT1JECQlkd1JldDsKKyAgICAKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworICAgIGlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgeworCVdBUk4obWlkaSwgImNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAorCSAgICAgKERXT1JEKU1DSU1pZGlEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CisJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKKyAgICB9CisgICAgc3RhcnQgPSAxOyAJCWVuZCA9IDk5OTk5OworICAgIGlmIChkd0ZsYWdzICYgTUNJX0ZST00pIHsKKwlzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCisJVFJBQ0UobWlkaSwgIk1DSV9GUk9NPSVkIFxuIiwgc3RhcnQpOworICAgIH0KKyAgICBpZiAoZHdGbGFncyAmIE1DSV9UTykgeworCWVuZCA9IGxwUGFybXMtPmR3VG87CisJVFJBQ0UobWlkaSwgIk1DSV9UTz0lZCBcbiIsIGVuZCk7CisgICAgfQorICAgIGxwTWlkaUhkciA9IFVTRVJfSEVBUF9MSU5fQUREUihNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOworICAgIGxwTWlkaUhkci0+bHBEYXRhID0gKExQU1RSKSB4bWFsbG9jKDEyMDApOworICAgIGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGggPSAxMDI0OworICAgIGxwTWlkaUhkci0+ZHdVc2VyID0gMEw7CisgICAgbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7CisgICAgZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOworICAgIFRSQUNFKG1pZGksICJhZnRlciBNSURNX1BSRVBBUkUgXG4iKTsKKyAgICBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9SRUNPUkQ7CisgICAgd2hpbGUoTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKKwlUUkFDRShtaWRpLCAiTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAorCSAgICAgICZNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMsIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyk7CisJbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOworCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fU1RBUlQsIDAsIDBMLCAwTCk7CisJVFJBQ0UobWlkaSwgImFmdGVyIE1JRE1fU1RBUlQgbHBNaWRpSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCisJICAgICAgbHBNaWRpSGRyLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CisJaWYgKGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkID09IDApIGJyZWFrOworICAgIH0KKyAgICBUUkFDRShtaWRpLCAiYmVmb3JlIE1JRE1fVU5QUkVQQVJFIFxuIik7CisgICAgZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9VTlBSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CisgICAgVFJBQ0UobWlkaSwgImFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CisgICAgaWYgKGxwTWlkaUhkci0+bHBEYXRhICE9IE5VTEwpIHsKKwlmcmVlKGxwTWlkaUhkci0+bHBEYXRhKTsKKwlscE1pZGlIZHItPmxwRGF0YSA9IE5VTEw7CisgICAgfQorICAgIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CisgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CisJVFJBQ0UobWlkaSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKKwltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1JRElfbWNpUGF1c2UJCQlbaW50ZXJuYWxdCiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKLQlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwotCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JcmV0dXJuIDA7CisgICAgVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKyAgICBpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworICAgIHJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1JRElfbWNpUmVzdW1lCQkJW2ludGVybmFsXQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewotCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7Ci0JaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlyZXR1cm4gMDsKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworICAgIGlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgcmV0dXJuIDA7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTUlESV9tY2lTZXQJCQlbaW50ZXJuYWxdCiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaVNldChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRVRfUEFSTVMgbHBQYXJtcykKIHsKLQlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwotCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JVFJBQ0UobWlkaSwgImR3VGltZUZvcm1hdD0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdUaW1lRm9ybWF0KTsKLQlUUkFDRShtaWRpLCAiZHdBdWRpbz0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdBdWRpbyk7Ci0JaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7Ci0JCXN3aXRjaCAobHBQYXJtcy0+ZHdUaW1lRm9ybWF0KSB7Ci0JCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0JCQlUUkFDRShtaWRpLCAiTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfRk9STUFUX0JZVEVTOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9GT1JNQVRfQllURVMgIVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfRk9STUFUX1NBTVBMRVM6Ci0JCQlUUkFDRShtaWRpLCAiTUNJX0ZPUk1BVF9TQU1QTEVTICFcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlXQVJOKG1pZGksICJiYWQgdGltZSBmb3JtYXQgIVxuIik7Ci0JCQlyZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKLQkJfQorICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisgICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKyAgICBUUkFDRShtaWRpLCAiZHdUaW1lRm9ybWF0PSUwOGxYXG4iLCBscFBhcm1zLT5kd1RpbWVGb3JtYXQpOworICAgIFRSQUNFKG1pZGksICJkd0F1ZGlvPSUwOGxYXG4iLCBscFBhcm1zLT5kd0F1ZGlvKTsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfVElNRV9GT1JNQVQpIHsKKwlzd2l0Y2ggKGxwUGFybXMtPmR3VGltZUZvcm1hdCkgeworCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CisJICAgIFRSQUNFKG1pZGksICJNQ0lfRk9STUFUX01JTExJU0VDT05EUyAhXG4iKTsKKwkgICAgYnJlYWs7CisJY2FzZSBNQ0lfRk9STUFUX0JZVEVTOgorCSAgICBUUkFDRShtaWRpLCAiTUNJX0ZPUk1BVF9CWVRFUyAhXG4iKTsKKwkgICAgYnJlYWs7CisJY2FzZSBNQ0lfRk9STUFUX1NBTVBMRVM6CisJICAgIFRSQUNFKG1pZGksICJNQ0lfRk9STUFUX1NBTVBMRVMgIVxuIik7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIFdBUk4obWlkaSwgImJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKKwkgICAgcmV0dXJuIE1DSUVSUl9CQURfVElNRV9GT1JNQVQ7CiAJfQotCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9WSURFTykgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKLQlpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwotCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX0NMT1NFRCkgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKLQlpZiAoZHdGbGFncyAmIE1DSV9TRVRfQVVESU8pCi0JCVRSQUNFKG1pZGksICJNQ0lfU0VUX0FVRElPICFcbiIpOwotCWlmIChkd0ZsYWdzICYmIE1DSV9TRVRfT04pIHsKLQkJVFJBQ0UobWlkaSwgIk1DSV9TRVRfT04gIVxuIik7Ci0JCWlmIChkd0ZsYWdzICYmIE1DSV9TRVRfQVVESU9fTEVGVCkKLQkJCVRSQUNFKG1pZGksICJNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7Ci0JCWlmIChkd0ZsYWdzICYmIE1DSV9TRVRfQVVESU9fUklHSFQpCi0JCQlUUkFDRShtaWRpLCAiTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKLQl9Ci0JaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09GRikKLQkJVFJBQ0UobWlkaSwgIk1DSV9TRVRfT0ZGICFcbiIpOwotCWlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfTUFTVEVSKQotCQlUUkFDRShtaWRpLCAiTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOwotCWlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfU0xBVkUpCi0JCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9TTEFWRSAhXG4iKTsKLQlpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX09GRlNFVCkKLQkJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU0VUX09GRlNFVCAhXG4iKTsKLQlpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1BPUlQpCi0JCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOwotCWlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfVEVNUE8pCi0JCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9URU1QTyAhXG4iKTsKLSAJcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9WSURFTykgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX0NMT1NFRCkgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfQVVESU8pCisJVFJBQ0UobWlkaSwgIk1DSV9TRVRfQVVESU8gIVxuIik7CisgICAgaWYgKGR3RmxhZ3MgJiYgTUNJX1NFVF9PTikgeworCVRSQUNFKG1pZGksICJNQ0lfU0VUX09OICFcbiIpOworCWlmIChkd0ZsYWdzICYmIE1DSV9TRVRfQVVESU9fTEVGVCkKKwkgICAgVFJBQ0UobWlkaSwgIk1DSV9TRVRfQVVESU9fTEVGVCAhXG4iKTsKKwlpZiAoZHdGbGFncyAmJiBNQ0lfU0VUX0FVRElPX1JJR0hUKQorCSAgICBUUkFDRShtaWRpLCAiTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKKyAgICB9CisgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09GRikKKwlUUkFDRShtaWRpLCAiTUNJX1NFVF9PRkYgIVxuIik7CisgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9NQVNURVIpCisJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU0VUX01BU1RFUiAhXG4iKTsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1NMQVZFKQorCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9TTEFWRSAhXG4iKTsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX09GRlNFVCkKKwlUUkFDRShtaWRpLCAiTUNJX1NFUV9TRVRfT0ZGU0VUICFcbiIpOworICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfUE9SVCkKKwlUUkFDRShtaWRpLCAiTUNJX1NFUV9TRVRfUE9SVCAhXG4iKTsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1RFTVBPKQorCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9URU1QTyAhXG4iKTsKKyAgICByZXR1cm4gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQlNSURJX21jaVN0YXR1cwkJW2ludGVybmFsXQorICogCQkJCU1JRElfbWNpU3RhdHVzCQkJW2ludGVybmFsXQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7Ci0JVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKLQlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7Ci0JCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKLQkJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6Ci0JCQlscFBhcm1zLT5kd1JldHVybiA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfU1RBVFVTX0xFTkdUSDoKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gNTU1NTsKLQkJCWlmIChkd0ZsYWdzICYgTUNJX1RSQUNLKSB7Ci0JCQkJbHBQYXJtcy0+ZHdUcmFjayA9IDE7Ci0JCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAyMjIyOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX1NUQVRVU19NT0RFOgotCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfTU9ERV9TVE9QOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzoKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9TVEFUVVNfUE9TSVRJT046Ci0JCQlscFBhcm1zLT5kd1JldHVybiA9IDMzMzM7Ci0JCQlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpCi0JCQkJbHBQYXJtcy0+ZHdJdGVtID0gMTsKLQkJCWlmIChkd0ZsYWdzICYgTUNJX1RSQUNLKSB7Ci0JCQkJbHBQYXJtcy0+ZHdUcmFjayA9IDE7Ci0JCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSA3Nzc7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9TVEFUVVNfUkVBRFkgIVxuIik7Ci0JCQlscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7Ci0JCQlscFBhcm1zLT5kd1JldHVybiA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX1NFUV9TVEFUVVNfRElWVFlQRToKLQkJCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NUQVRVU19ESVZUWVBFICFcbiIpOwotCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX1NFUV9TVEFUVVNfTUFTVEVSOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX01BU1RFUiAhXG4iKTsKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9TRVFfU1RBVFVTX1NMQVZFOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX1NMQVZFICFcbiIpOwotCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX1NFUV9TVEFUVVNfT0ZGU0VUOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX09GRlNFVCAhXG4iKTsKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9TRVFfU1RBVFVTX1BPUlQ6Ci0JCQlUUkFDRShtaWRpLCAiTUNJX1NFUV9TVEFUVVNfUE9SVCAhXG4iKTsKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9TRVFfU1RBVFVTX1RFTVBPOgotCQkJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX1RFTVBPICFcbiIpOwotCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlXQVJOKG1pZGksICJ1bmtub3dtIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKLQkJCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Ci0JCX0KKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworICAgIGlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX0lURU0pIHsKKwlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CisJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6CisJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSBNQ0lfU1RBVFVTX0xFTkdUSDoKKwkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSA1NTU1OworCSAgICBpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgeworCQlscFBhcm1zLT5kd1RyYWNrID0gMTsKKwkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAyMjIyOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NUQVRVU19NT0RFOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1DSV9NT0RFX1NUT1A7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgorCSAgICBUUkFDRShtaWRpLCAiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UICFcbiIpOworCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NUQVRVU19QT1NJVElPTjoKKwkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAzMzMzOworCSAgICBpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpCisJCWxwUGFybXMtPmR3SXRlbSA9IDE7CisJICAgIGlmIChkd0ZsYWdzICYgTUNJX1RSQUNLKSB7CisJCWxwUGFybXMtPmR3VHJhY2sgPSAxOworCQlscFBhcm1zLT5kd1JldHVybiA9IDc3NzsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIE1DSV9TVEFUVVNfUkVBRFk6CisJICAgIFRSQUNFKG1pZGksICJNQ0lfU1RBVFVTX1JFQURZICFcbiIpOworCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NUQVRVU19USU1FX0ZPUk1BVDoKKwkgICAgVFJBQ0UobWlkaSwgIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CisJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NFUV9TVEFUVVNfRElWVFlQRToKKwkgICAgVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX0RJVlRZUEUgIVxuIik7CisJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKKwkgICAgYnJlYWs7CisJY2FzZSBNQ0lfU0VRX1NUQVRVU19NQVNURVI6CisJICAgIFRSQUNFKG1pZGksICJNQ0lfU0VRX1NUQVRVU19NQVNURVIgIVxuIik7CisJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKKwkgICAgYnJlYWs7CisJY2FzZSBNQ0lfU0VRX1NUQVRVU19TTEFWRToKKwkgICAgVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX1NMQVZFICFcbiIpOworCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NFUV9TVEFUVVNfT0ZGU0VUOgorCSAgICBUUkFDRShtaWRpLCAiTUNJX1NFUV9TVEFUVVNfT0ZGU0VUICFcbiIpOworCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX1NFUV9TVEFUVVNfUE9SVDoKKwkgICAgVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX1BPUlQgIVxuIik7CisJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKKwkgICAgYnJlYWs7CisJY2FzZSBNQ0lfU0VRX1NUQVRVU19URU1QTzoKKwkgICAgVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX1RFTVBPICFcbiIpOworCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIFdBUk4obWlkaSwgInVua25vd20gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOworCSAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogCX0KLQlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJVFJBQ0UobWlkaSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKLQkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKKyAgICB9CisgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CisJVFJBQ0UobWlkaSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKKwltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKLQl9Ci0gCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTUlESV9tY2lHZXREZXZDYXBzCQlbaW50ZXJuYWxdCiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaUdldERldkNhcHMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgCi0JCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKKwkJCQlMUE1DSV9HRVRERVZDQVBTX1BBUk1TIGxwUGFybXMpCiB7Ci0JVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKLQlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWlmIChkd0ZsYWdzICYgTUNJX0dFVERFVkNBUFNfSVRFTSkgewotCQlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7Ci0JCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1JFQ09SRDoKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9HRVRERVZDQVBTX0hBU19BVURJTzoKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9HRVRERVZDQVBTX0hBU19WSURFTzoKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRToKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX0dFVERFVkNBUFNfVVNFU19GSUxFUzoKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9HRVRERVZDQVBTX0NPTVBPVU5EX0RFVklDRToKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9FSkVDVDoKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUExBWToKLQkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9TQVZFOgotCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBGQUxTRTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKLQkJfQorICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisgICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKyAgICBpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKKwlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CisJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX0FVRElPOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX1ZJREVPOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IEZBTFNFOworCSAgICBicmVhazsKKwljYXNlIE1DSV9HRVRERVZDQVBTX0RFVklDRV9UWVBFOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1DSV9ERVZUWVBFX1NFUVVFTkNFUjsKKwkgICAgYnJlYWs7CisJY2FzZSBNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IEZBTFNFOworCSAgICBicmVhazsKKwljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9QTEFZOgorCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkU6CisJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAJfQotIAlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTUlESV9tY2lJbmZvCQkJW2ludGVybmFsXQogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lJbmZvKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMxNiBscFBhcm1zKQogewotCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7Ci0JaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlscFBhcm1zLT5scHN0clJldHVybiA9IE5VTEw7Ci0Jc3dpdGNoKGR3RmxhZ3MpIHsKLQljYXNlIE1DSV9JTkZPX1BST0RVQ1Q6Ci0JCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gIkxpbnV4IFNvdW5kIFN5c3RlbSAwLjUiOwotCQlicmVhazsKLQljYXNlIE1DSV9JTkZPX0ZJTEU6Ci0JCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gIkZpbGVOYW1lIjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKLQl9Ci0JaWYgKGxwUGFybXMtPmxwc3RyUmV0dXJuICE9IE5VTEwpCi0JCWxwUGFybXMtPmR3UmV0U2l6ZSA9IHN0cmxlbihscFBhcm1zLT5scHN0clJldHVybik7Ci0JZWxzZQotCQlscFBhcm1zLT5kd1JldFNpemUgPSAwOwotIAlyZXR1cm4gMDsKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworICAgIGlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSBOVUxMOworICAgIHN3aXRjaChkd0ZsYWdzKSB7CisgICAgY2FzZSBNQ0lfSU5GT19QUk9EVUNUOgorCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gIkxpbnV4IFNvdW5kIFN5c3RlbSAwLjUiOworCWJyZWFrOworICAgIGNhc2UgTUNJX0lORk9fRklMRToKKwlscFBhcm1zLT5scHN0clJldHVybiA9ICJGaWxlTmFtZSI7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOworICAgIH0KKyAgICBpZiAobHBQYXJtcy0+bHBzdHJSZXR1cm4gIT0gTlVMTCkKKwlscFBhcm1zLT5kd1JldFNpemUgPSBzdHJsZW4obHBQYXJtcy0+bHBzdHJSZXR1cm4pOworICAgIGVsc2UKKwlscFBhcm1zLT5kd1JldFNpemUgPSAwOworICAgIHJldHVybiAwOwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjaWZkZWYgSEFWRV9PU1MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJbWlkaU9wZW5TZXEJCQkJW2ludGVybmFsXQorICovCitzdGF0aWMgaW50IG1pZGlPcGVuU2VxKHZvaWQpCit7CisgICAgaWYgKG51bU9wZW5NaWRpU2VxID09IDApIHsKKwltaWRpU2VxRkQgPSBvcGVuKE1JRElfU0VRLCBPX1JEV1IsIDApOworCWlmIChtaWRpU2VxRkQgPT0gLTEpIHsKKwkgICAgRVJSKG1pZGksICJjYW4ndCBvcGVuICclcycgISAoJWQpXG4iLCBNSURJX1NFUSwgZXJybm8pOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmIChmY250bChtaWRpU2VxRkQsIEZfU0VURkwsIE9fTk9OQkxPQ0spIDwgMCkgeworCSAgICBXQVJOKG1pZGksICJjYW4ndCBzZXQgc2VxdWVuY2VyIGZkIHRvIG5vbiBibG9ja2luZyAoJWQpXG4iLCBlcnJubyk7CisJICAgIGNsb3NlKG1pZGlTZXFGRCk7CisJICAgIG1pZGlTZXFGRCA9IC0xOworCSAgICByZXR1cm4gLTE7CisJfQorCWlvY3RsKG1pZGlTZXFGRCwgU05EQ1RMX1NFUV9SRVNFVCk7CisgICAgfQorICAgIG51bU9wZW5NaWRpU2VxKys7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJbWlkaUNsb3NlU2VxCQkJCVtpbnRlcm5hbF0KKyAqLworc3RhdGljIGludCBtaWRpQ2xvc2VTZXEodm9pZCkKK3sKKyAgICBpZiAoLS1udW1PcGVuTWlkaVNlcSA9PSAwKSB7CisJY2xvc2UobWlkaVNlcUZEKTsKKwltaWRpU2VxRkQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZJWE1FOiB0aGlzIGlzIGEgYmFkIGlkZWEsIGl0J3MgZXZlbiBub3Qgc3RhdGljLi4uICovCitTRVFfREVGSU5FQlVGKDEwMjQpOworCisvKiBGSVhNRTogdGhpcyBpcyBub3QgcmVlbnRyYW50LCBub3Qgc3RhdGljIC0gYmVjYXVzZSBvZiBnbG9iYWwgdmFyaWFibGUgCisgKiBfc2VxYnVmIGFuZCBhbC4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJc2VxYnVmX2R1bXAJCQkJW2ludGVybmFsXQorICovCit2b2lkIHNlcWJ1Zl9kdW1wKHZvaWQpCit7CisgICAgaWYgKF9zZXFidWZwdHIpIHsKKwlpZiAod3JpdGUobWlkaVNlcUZELCBfc2VxYnVmLCBfc2VxYnVmcHRyKSA9PSAtMSkgeworCSAgICBXQVJOKG1pZGksICJDYW4ndCB3cml0ZSBkYXRhIHRvIHNlcXVlbmNlciAoJWQvJWQpIVxuIiwgCisJCSBtaWRpU2VxRkQsIGVycm5vKTsKKwl9CisJLyogRklYTUU6CisJICoJaW4gYW55IGNhc2UgYnVmZmVyIGlzIGxvc3Qgc28gdGhhdCBpZiBtYW55IGVycm9ycyBvY2N1ciB0aGUgYnVmZmVyIAorCSAqIHdpbGwgbm90IG92ZXJydW4gCisJICovCisJX3NlcWJ1ZnB0ciA9IDA7CisgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfT1NTICovCisKKyNpZmRlZiBIQVZFX09TUworCitzdGF0aWMgdm9pZCBtaWRSZWNlaXZlQ2hhcihXT1JEIHdEZXZJRCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgRFdPUkQgZHdUaW1lKQoreworICAgIERXT1JECQl0b1NlbmQgPSAwOworICAgIAorICAgIFRSQUNFKG1pZGksICJBZGRpbmcgJTAyeGggdG8gJWRbJWRdXG4iLAorCSAgdmFsdWUsIHdEZXZJRCwgTWlkaUluRGV2W3dEZXZJRF0uaW5jTGVuKTsKKyAgICAKKyAgICBpZiAod0RldklEID49IE1BWF9NSURJSU5EUlYpIHsKKwlXQVJOKG1pZGksICJiYWQgZGV2SURcbiIpOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKE1pZGlJbkRldlt3RGV2SURdLnN0YXRlID09IDApIHsKKwlUUkFDRShtaWRpLCAiaW5wdXQgbm90IHN0YXJ0ZWQsIHRocm93biBhd2F5XG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChNaWRpSW5EZXZbd0RldklEXS5zdGF0ZSAmIDIpIHsgLyogc3lzdGVtIGV4Y2x1c2l2ZSAqLworCUxQTUlESUhEUglwdHIgPSBNaWRpSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyOworCVdPUkQgCQkJc2JmYiA9IEZBTFNFOworCQorCWlmIChwdHIpIHsKKwkgICAgKChMUFNUUikocHRyLT5yZXNlcnZlZCkpW3B0ci0+ZHdCeXRlc1JlY29yZGVkKytdID0gdmFsdWU7CisJICAgIGlmIChwdHItPmR3Qnl0ZXNSZWNvcmRlZCA9PSBwdHItPmR3QnVmZmVyTGVuZ3RoKSB7CisJCXNiZmIgPSBUUlVFOworCSAgICB9IAorCX0KKwlpZiAodmFsdWUgPT0gMHhGNykgeyAvKiB0aGVuIGVuZCAqLworCSAgICBNaWRpSW5EZXZbd0RldklEXS5zdGF0ZSAmPSB+MjsKKwkgICAgc2JmYiA9IFRSVUU7CisJfQorCWlmIChzYmZiICYmIHB0ciAhPSBOVUxMKSB7CisJICAgIHB0ciA9IE1pZGlJbkRldlt3RGV2SURdLmxwUXVldWVIZHI7CisJICAgIHB0ci0+ZHdGbGFncyAmPSB+TUhEUl9JTlFVRVVFOworCSAgICBwdHItPmR3RmxhZ3MgfD0gTUhEUl9ET05FOworCSAgICBNaWRpSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyID0gKExQTUlESUhEUilwdHItPmxwTmV4dDsKKwkgICAgaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTUlNX0xPTkdEQVRBLCAoRFdPUkQpcHRyLCBkd1RpbWUpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKwkJV0FSTihtaWRpLCAiQ291bGRuJ3Qgbm90aWZ5IGNsaWVudFxuIik7CisJICAgIH0KKwl9CisJcmV0dXJuOworICAgIH0KKyAgICAKKyNkZWZpbmUgSVNfQ01EKF94KQkoKChfeCkgJiAweDgwKSA9PSAweDgwKQorI2RlZmluZSBJU19TWVNfQ01EKF94KQkoKChfeCkgJiAweEYwKSA9PSAweEYwKQorICAgIAorICAgIGlmICghSVNfQ01EKHZhbHVlKSAmJiBNaWRpSW5EZXZbd0RldklEXS5pbmNMZW4gPT0gMCkgeyAvKiB0cnkgdG8gcmV1c2Ugb2xkIGNtZCAqLworCWlmIChJU19DTUQoTWlkaUluRGV2W3dEZXZJRF0uaW5jUHJldikgJiYgIUlTX1NZU19DTUQoTWlkaUluRGV2W3dEZXZJRF0uaW5jUHJldikpIHsKKwkgICAgTWlkaUluRGV2W3dEZXZJRF0uaW5jb21pbmdbMF0gPSBNaWRpSW5EZXZbd0RldklEXS5pbmNQcmV2OworCSAgICBNaWRpSW5EZXZbd0RldklEXS5pbmNMZW4gPSAxOworCSAgICBUUkFDRShtaWRpLCAiUmV1c2luZyBvbGQgY29tbWFuZCAlMDJ4aFxuIiwgTWlkaUluRGV2W3dEZXZJRF0uaW5jUHJldik7CisJfSBlbHNlIHsKKwkgICAgRklYTUUobWlkaSwgImVycm9yIGZvciBtaWRpLWluLCBzaG91bGQgZ2VuZXJhdGUgTUlNX0VSUk9SIG5vdGlmaWNhdGlvbjoiCisJCSAgIiBwcmV2PSUwMlhoLCBpbmNMZW49JTAyWGhcbiIsIAorCQkgIE1pZGlJbkRldlt3RGV2SURdLmluY1ByZXYsIE1pZGlJbkRldlt3RGV2SURdLmluY0xlbik7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorICAgIE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWyhpbnQpKE1pZGlJbkRldlt3RGV2SURdLmluY0xlbisrKV0gPSB2YWx1ZTsKKyAgICBpZiAoTWlkaUluRGV2W3dEZXZJRF0uaW5jTGVuID09IDEgJiYgIUlTX1NZU19DTUQoTWlkaUluRGV2W3dEZXZJRF0uaW5jb21pbmdbMF0pKSB7CisJLyogc3RvcmUgbmV3IGNtZCwganVzdCBpbiBjYXNlICovCisJTWlkaUluRGV2W3dEZXZJRF0uaW5jUHJldiA9IE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWzBdOworICAgIH0KKyAgICAKKyN1bmRlZiBJU19DTUQoX3gpCisjdW5kZWYgSVNfU1lTX0NNRChfeCkKKyAgICAKKyAgICBzd2l0Y2ggKE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWzBdICYgMHhGMCkgeworICAgIGNhc2UgTUlESV9OT1RFT0ZGOgorICAgIGNhc2UgTUlESV9OT1RFT046CisgICAgY2FzZSBNSURJX0tFWV9QUkVTU1VSRToKKyAgICBjYXNlIE1JRElfQ1RMX0NIQU5HRToKKyAgICBjYXNlIE1JRElfUElUQ0hfQkVORDoKKwlpZiAoTWlkaUluRGV2W3dEZXZJRF0uaW5jTGVuID09IDMpIHsKKwkgICAgdG9TZW5kID0gKE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWzJdIDw8IDE2KSB8IAorCQkoTWlkaUluRGV2W3dEZXZJRF0uaW5jb21pbmdbMV0gPDwgIDgpIHwKKwkJKE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWzBdIDw8ICAwKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBNSURJX1BHTV9DSEFOR0U6CisgICAgY2FzZSBNSURJX0NITl9QUkVTU1VSRToKKwlpZiAoTWlkaUluRGV2W3dEZXZJRF0uaW5jTGVuID09IDIpIHsKKwkgICAgdG9TZW5kID0gKE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWzFdIDw8ICA4KSB8CisJCShNaWRpSW5EZXZbd0RldklEXS5pbmNvbWluZ1swXSA8PCAgMCk7CisJfQorCWJyZWFrOworICAgIGNhc2UgTUlESV9TWVNURU1fUFJFRklYOgorCWlmIChNaWRpSW5EZXZbd0RldklEXS5pbmNvbWluZ1swXSA9PSAweEYwKSB7CisJICAgIE1pZGlJbkRldlt3RGV2SURdLnN0YXRlIHw9IDI7CisJICAgIE1pZGlJbkRldlt3RGV2SURdLmluY0xlbiA9IDA7CisJfSBlbHNlIHsJCQorCSAgICBpZiAoTWlkaUluRGV2W3dEZXZJRF0uaW5jTGVuID09IDEpIHsKKwkJdG9TZW5kID0gKE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWzBdIDw8ICAwKTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCVdBUk4obWlkaSwgIlRoaXMgc2hvdWxkbid0IGhhcHBlbiAoJTAyWClcbiIsIE1pZGlJbkRldlt3RGV2SURdLmluY29taW5nWzBdKTsKKyAgICB9CisgICAgaWYgKHRvU2VuZCAhPSAwKSB7CisJVFJBQ0UobWlkaSwgIlNlbmRpbmcgZXZlbnQgJTA4bHhcbiIsIHRvU2VuZCk7CisJTWlkaUluRGV2W3dEZXZJRF0uaW5jTGVuID0JMDsKKwlkd1RpbWUgLT0gTWlkaUluRGV2W3dEZXZJRF0uc3RhcnRUaW1lOworCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1JTV9EQVRBLCB0b1NlbmQsIGR3VGltZSkgIT0gTU1TWVNFUlJfTk9FUlJPUikgeworCSAgICBXQVJOKG1pZGksICJDb3VsZG4ndCBub3RpZnkgY2xpZW50XG4iKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgVk9JRCBtaWRUaW1lQ2FsbGJhY2soSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFVJTlQzMiBpZCwgRFdPUkQgZHdUaW1lKQoreworICAgIHVuc2lnbmVkCWNoYXIJCWJ1ZmZlclsyNTZdOworICAgIGludAkJCQkJbGVuLCBpZHg7CisgICAgCisgICAgVFJBQ0UobWlkaSwgIiglMDRYLCAlZCwgJWQsICVsdSlcbiIsIGh3bmQsIG1zZywgaWQsIGR3VGltZSk7CisgICAgCisgICAgbGVuID0gcmVhZChtaWRpU2VxRkQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIAorICAgIGlmICgobGVuICUgNCkgIT0gMCkgeworCVdBUk4obWlkaSwgImJhZCBsZW5ndGggJWQgKCVkKVxuIiwgbGVuLCBlcnJubyk7CisJcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgKSB7CisJaWYgKGJ1ZmZlcltpZHhdICYgMHg4MCkgeworCSAgICBUUkFDRShtaWRpLCAKKwkJICAicmVhZGluZzw4PiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIAorCQkgIGJ1ZmZlcltpZHggKyAwXSwgYnVmZmVyW2lkeCArIDFdLCAKKwkJICBidWZmZXJbaWR4ICsgMl0sIGJ1ZmZlcltpZHggKyAzXSwgCisJCSAgYnVmZmVyW2lkeCArIDRdLCBidWZmZXJbaWR4ICsgNV0sIAorCQkgIGJ1ZmZlcltpZHggKyA2XSwgYnVmZmVyW2lkeCArIDddKTsKKwkgICAgaWR4ICs9IDg7CisJfSBlbHNlIHsKKwkgICAgc3dpdGNoIChidWZmZXJbaWR4ICsgMF0pIHsKKwkgICAgY2FzZSBTRVFfV0FJVDoKKwkgICAgY2FzZSBTRVFfRUNITzoKKwkJYnJlYWs7CisJICAgIGNhc2UgU0VRX01JRElQVVRDOgorCQltaWRSZWNlaXZlQ2hhcihidWZmZXJbaWR4ICsgMl0sIGJ1ZmZlcltpZHggKyAxXSwgZHdUaW1lKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCVRSQUNFKG1pZGksICJVbnN1cHBvcnRlZCBldmVudCAlZFxuIiwgYnVmZmVyW2lkeCArIDBdKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWR4ICs9IDQ7CisJfQkJCQkKKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9PU1MgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWlkR2V0RGV2Q2FwcwkJCVtpbnRlcm5hbF0KICAqLwogc3RhdGljIERXT1JEIG1pZEdldERldkNhcHMoV09SRCB3RGV2SUQsIExQTUlESUlOQ0FQUzE2IGxwQ2FwcywgRFdPUkQgZHdTaXplKQogewotCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwotCWxwQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCSAgICAgICAgLyogTWFudWZhYyBJRCAqLwotCWxwQ2Fwcy0+d1BpZCA9IDB4MDAwMTsgCSAgICAgICAgLyogUHJvZHVjdCBJRCAqLwotCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSAweDAwMTsgLyogUHJvZHVjdCBWZXJzaW9uICovCi0Jc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSwgIkxpbnV4IE1JRElJTiBEcml2ZXIiKTsKLQotCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOworICAgIExQTUlESUlOQ0FQUzE2CXRtcGxwQ2FwczsKKyAgICAKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKKyAgICAKKyAgICBpZiAod0RldklEID49IE1JRE1fTlVNREVWUykgeworCXJldHVybiBNTVNZU0VSUl9CQURERVZJQ0VJRDsKKyAgICB9CisgICAgaWYgKGxwQ2FwcyA9PSBOVUxMKSB7CisJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisgICAgfQorICAgIAorICAgIHRtcGxwQ2FwcyA9IG1pZGlJbkRldmljZXNbd0RldklEXTsKKyAgICBscENhcHMtPndNaWQgPSB0bXBscENhcHMtPndNaWQ7ICAKKyAgICBscENhcHMtPndQaWQgPSB0bXBscENhcHMtPndQaWQ7ICAKKyAgICBscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gdG1wbHBDYXBzLT52RHJpdmVyVmVyc2lvbjsgIAorICAgIHN0cmNweShscENhcHMtPnN6UG5hbWUsIHRtcGxwQ2Fwcy0+c3pQbmFtZSk7ICAgIAorICAgIGlmIChkd1NpemUgPT0gc2l6ZW9mKE1JRElJTkNBUFMxNikpIHsgCisJLyogd2Ugc2hvdWxkIHJ1biB3aW4gOTUsIHNvIG1ha2UgdXNlIG9mIGR3U3VwcG9ydCAqLworCWxwQ2Fwcy0+ZHdTdXBwb3J0ID0gdG1wbHBDYXBzLT5kd1N1cHBvcnQ7CisgICAgfSBlbHNlIGlmIChkd1NpemUgIT0gc2l6ZW9mKE1JRElJTkNBUFMxNikgLSBzaXplb2YoRFdPUkQpKSB7CisJVFJBQ0UobWlkaSwgImJhZCBzaXplIGZvciBscENhcHNcbiIpOworCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NzIsNDYgKzEwMzIsODUgQEAKICAqLwogc3RhdGljIERXT1JEIG1pZE9wZW4oV09SRCB3RGV2SUQsIExQTUlESU9QRU5ERVNDIGxwRGVzYywgRFdPUkQgZHdGbGFncykKIHsKLQlpbnQJCW1pZGk7Ci0JVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwotCWlmIChscERlc2MgPT0gTlVMTCkgewotCQlXQVJOKG1pZGksICJJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisgICAgVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOworICAgIAorICAgIGlmIChscERlc2MgPT0gTlVMTCkgeworCVdBUk4obWlkaSwgIkludmFsaWQgUGFyYW1ldGVyICFcbiIpOworCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgIH0KKyAgICAvKiBGSVhNRSA6CisgICAgICoJaG93IHRvIGNoZWNrIHRoYXQgY29udGVudCBvZiBscERlc2MgaXMgY29ycmVjdCA/CisgICAgICovCisgICAgaWYgKHdEZXZJRCA+PSBNQVhfTUlESUlORFJWKSB7CisJV0FSTihtaWRpLCJ3RGV2SUQgdG9vIGxhcmdlICgldSkgIVxuIiwgd0RldklEKTsKKwlyZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7CisgICAgfQorICAgIGlmIChNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYyAhPSAwKSB7CisJV0FSTihtaWRpLCAiZGV2aWNlIGFscmVhZHkgb3BlbiAhXG4iKTsKKwlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOworICAgIH0KKyAgICBpZiAoKGR3RmxhZ3MgJiB+Q0FMTEJBQ0tfVFlQRU1BU0spICE9IDApIHsgCisJRklYTUUobWlkaSwgIk5vIHN1cHBvcnQgZm9yIE1JRElfSU9fU1RBVFVTIGluIGR3RmxhZ3NcbiIpOworCXJldHVybiBNTVNZU0VSUl9JTlZBTEZMQUc7CisgICAgfQorICAgIAorI2lmZGVmIEhBVkVfT1NTCisgICAgaWYgKG1pZGlPcGVuU2VxKCkgPCAwKSB7CisJcmV0dXJuIE1NU1lTRVJSX0VSUk9SOworICAgIH0KKyAgICAKKyAgICBpZiAobnVtU3RhcnRlZE1pZGlJbisrID09IDApIHsKKwltaWRpSW5UaW1lcklEID0gU2V0VGltZXIzMigwLCAwLCAyNTAsIG1pZFRpbWVDYWxsYmFjayk7CisJaWYgKCFtaWRpSW5UaW1lcklEKSB7CisJICAgIG51bVN0YXJ0ZWRNaWRpSW4gPSAwOworCSAgICBXQVJOKG1pZGksICJDb3VsZG4ndCBzdGFydCB0aW1lciBmb3IgbWlkaS1pblxuIik7CisJICAgIG1pZGlDbG9zZVNlcSgpOworCSAgICByZXR1cm4gTU1TWVNFUlJfRVJST1I7CiAJfQotCWlmICh3RGV2SUQgPj0gTUFYX01JRElJTkRSVikgewotCQlUUkFDRShtaWRpLCJNQVhfTUlESUlORFJWIHJlYWNoZWQgIVxuIik7Ci0JCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQ7Ci0JfQorCVRSQUNFKG1pZGksICJTdGFydGluZyB0aW1lciAoJXUpIGZvciBtaWRpLWluXG4iLCBtaWRpSW5UaW1lcklEKTsKKyAgICB9CisjZWxzZSAvKiBIQVZFX09TUyAqLworICAgIHsKKwlpbnQJCW1pZGkgPSBvcGVuKE1JRElfREVWLCBPX1dST05MWSwgMCk7CisJCiAJTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9IDA7Ci0JbWlkaSA9IG9wZW4gKE1JRElfREVWLCBPX1JET05MWSwgMCk7CiAJaWYgKG1pZGkgPT0gLTEpIHsKLQkJV0FSTihtaWRpLCJjYW4ndCBvcGVuICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKwkgICAgV0FSTihtaWRpLCJjYW4ndCBvcGVuICclcycgKCVkKSFcbiIsIE1JRElfREVWLCBlcnJubyk7CQkJCisJICAgIHJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQ7CiAJfQotCU1pZGlJbkRldlt3RGV2SURdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOwotCXN3aXRjaChNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MpIHsKLQkJY2FzZSBEQ0JfTlVMTDoKLQkJCVRSQUNFKG1pZGksIkNBTExCQUNLX05VTEwgIVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBEQ0JfV0lORE9XOgotCQkJVFJBQ0UobWlkaSwgIkNBTExCQUNLX1dJTkRPVyAhXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIERDQl9UQVNLOgotCQkJVFJBQ0UobWlkaSwgIkNBTExCQUNLX1RBU0sgIVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBEQ0JfRlVOQ1RJT046Ci0JCQlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7Ci0JCQlicmVhazsKLQl9Ci0JTWlkaUluRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IE5VTEw7CiAJTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9IG1pZGk7Ci0JTWlkaUluRGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7Ci0JTWlkaUluRGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDB4M0ZGRjsKLQlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCVdBUk4obWlkaSwiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07Ci0JfQotCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX09TUyAqLworICAgIAorICAgIE1pZGlJbkRldlt3RGV2SURdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOworICAgIHN3aXRjaChNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MpIHsKKyAgICBjYXNlIERDQl9OVUxMOgorCVRSQUNFKG1pZGksIkNBTExCQUNLX05VTEwgIVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBEQ0JfV0lORE9XOgorCVRSQUNFKG1pZGksICJDQUxMQkFDS19XSU5ET1cgIVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBEQ0JfVEFTSzoKKwlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKKwlicmVhazsKKyAgICBjYXNlIERDQl9GVU5DVElPTjoKKwlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfRlVOQ1RJT04gKCUwOGxYKSFcbiIsIGxwRGVzYy0+ZHdDYWxsYmFjayk7CisJYnJlYWs7CisgICAgfQorICAgIE1pZGlJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOworICAgIE1pZGlJbkRldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgPSAwOworICAgIE1pZGlJbkRldlt3RGV2SURdLmJ1ZnNpemUgPSAweDNGRkY7CisgICAgTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MgPSBscERlc2M7CisgICAgTWlkaUluRGV2W3dEZXZJRF0uc3RhdGUgPSAwOworI2lmZGVmIEhBVkVfT1NTCisgICAgTWlkaUluRGV2W3dEZXZJRF0uaW5jTGVuID0gMDsKKyAgICBNaWRpSW5EZXZbd0RldklEXS5zdGFydFRpbWUgPSAwOworI2VuZGlmIC8qIEhBVkVfT1NTICovCisgICAgaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTUlNX09QRU4sIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgeworCVdBUk4obWlkaSwiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKyAgICB9CisgICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODE5LDI4ICsxMTE4LDc2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRDbG9zZShXT1JEIHdEZXZJRCkKIHsKLQlUUkFDRShtaWRpLCAiKCUwNFgpO1xuIiwgd0RldklEKTsKLQlpZiAoTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCVdBUk4obWlkaSwiY2FuJ3QgY2xvc2UgIVxuIik7Ci0JCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCX0KLQljbG9zZShNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2KTsKLQlNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2ID0gMDsKLQlNaWRpSW5EZXZbd0RldklEXS5idWZzaXplID0gMDsKLQlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fQ0xPU0UsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQlXQVJOKG1pZGksImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7Ci0JCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwotCX0KLQlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKKyAgICBpbnQJCXJldCA9IE1NU1lTRVJSX05PRVJST1I7CisgICAgCisgICAgVFJBQ0UobWlkaSwgIiglMDRYKTtcbiIsIHdEZXZJRCk7CisgICAgCisgICAgaWYgKHdEZXZJRCA+PSBNQVhfTUlESUlORFJWKSB7CisJV0FSTihtaWRpLCJ3RGV2SUQgdG9vIGJpZiAoJXUpICFcbiIsIHdEZXZJRCk7CisJcmV0dXJuIE1NU1lTRVJSX0JBRERFVklDRUlEOworICAgIH0KKyAgICBpZiAoTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MgPT0gMCkgeworCVdBUk4obWlkaSwgImRldmljZSBub3Qgb3BlbmVkICFcbiIpOworCXJldHVybiBNTVNZU0VSUl9FUlJPUjsKKyAgICB9CisgICAgaWYgKE1pZGlJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgIT0gMCkgeworCXJldHVybiBNSURJRVJSX1NUSUxMUExBWUlORzsKKyAgICB9CisgICAgCisjaWZkZWYgSEFWRV9PU1MKKyAgICBpZiAobWlkaVNlcUZEID09IC0xKSB7CisJV0FSTihtaWRpLCJvb29wcyAhXG4iKTsKKwlyZXR1cm4gTU1TWVNFUlJfRVJST1I7CisgICAgfQorICAgIGlmICgtLW51bVN0YXJ0ZWRNaWRpSW4gPT0gMCkgeworCVRSQUNFKG1pZGksICJTdG9wcGluZyB0aW1lciBmb3IgbWlkaS1pblxuIik7CisJaWYgKCFLaWxsVGltZXIzMigwLCBtaWRpSW5UaW1lcklEKSkgeworCSAgICBXQVJOKG1pZGksICJDb3VsZG4ndCBzdG9wIHRpbWVyIGZvciBtaWRpLWluXG4iKTsKKwl9CQkJCisJbWlkaUluVGltZXJJRCA9IDA7CisgICAgfQorICAgIG1pZGlDbG9zZVNlcSgpOworI2Vsc2UgLyogSEFWRV9PU1MgKi8KKyAgICBpZiAoTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJV0FSTihtaWRpLCJvb29wcyAhXG4iKTsKKwlyZXR1cm4gTU1TWVNFUlJfRVJST1I7CisgICAgfQorICAgIGNsb3NlKE1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYpOworICAgIE1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYgPSAwOworI2VuZGlmIC8qIEhBVkVfT1NTICovCisgICAgTWlkaUluRGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDA7CisgICAgaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTUlNX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKwlXQVJOKG1pZGksImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJcmV0ID0gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKyAgICB9CisgICAgTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MgPSAwOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQkJCW1pZEFkZEJ1ZmZlcgkJW2ludGVybmFsXQorICogCQkJCW1pZEFkZEJ1ZmZlcgkJCVtpbnRlcm5hbF0KICAqLwogc3RhdGljIERXT1JEIG1pZEFkZEJ1ZmZlcihXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewotCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworICAgIAorICAgIGlmIChscE1pZGlIZHIgPT0gTlVMTCkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisgICAgaWYgKHNpemVvZihNSURJSERSKSAhPSBkd1NpemUpIHJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgIGlmIChscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoID09IDApIHJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgIGlmIChscE1pZGlIZHItPmR3RmxhZ3MgJiBNSERSX0lOUVVFVUUpIHJldHVybiBNSURJRVJSX1NUSUxMUExBWUlORzsKKyAgICBpZiAoIShscE1pZGlIZHItPmR3RmxhZ3MgJiBNSERSX1BSRVBBUkVEKSkgcmV0dXJuIE1JRElFUlJfVU5QUkVQQVJFRDsKKyAgICAKKyAgICBpZiAoTWlkaUluRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9PSAwKSB7CisJTWlkaUluRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IGxwTWlkaUhkcjsKKyAgICB9IGVsc2UgeworCUxQTUlESUhEUglwdHI7CisJCisJZm9yIChwdHIgPSBNaWRpSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyOyAKKwkgICAgIHB0ci0+bHBOZXh0ICE9IDA7IAorCSAgICAgcHRyID0gKExQTUlESUhEUilwdHItPmxwTmV4dCk7CisJcHRyLT5scE5leHQgPSAoc3RydWN0IG1pZGloZHJfdGFnKilscE1pZGlIZHI7CisgICAgfQorICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg0OCw4ICsxMTk1LDE4IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRQcmVwYXJlKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7Ci0JcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CisgICAgVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisgICAgCisgICAgaWYgKGR3U2l6ZSAhPSBzaXplb2YoTUlESUhEUikgfHwgbHBNaWRpSGRyID09IDAgfHwgCisJbHBNaWRpSGRyLT5scERhdGEgPT0gMCB8fCBscE1pZGlIZHItPmR3RmxhZ3MgIT0gMCB8fCAKKwlscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoID49IDB4MTAwMDB1bCkKKwlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKyAgICAKKyAgICBscE1pZGlIZHItPmxwTmV4dCA9IDA7CisgICAgbHBNaWRpSGRyLT5kd0ZsYWdzIHw9IE1IRFJfUFJFUEFSRUQ7CisgICAgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOworICAgIAorICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg1Nyw4ICsxMjE0LDE4IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRVbnByZXBhcmUoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKLQlUUkFDRShtaWRpLCAiKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKKyAgICAKKyAgICBpZiAoZHdTaXplICE9IHNpemVvZihNSURJSERSKSB8fCBscE1pZGlIZHIgPT0gMCB8fCAKKwlscE1pZGlIZHItPmxwRGF0YSA9PSAwIHx8IGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGggPj0gMHgxMDAwMHVsKQorCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgIAorICAgIGlmICghKGxwTWlkaUhkci0+ZHdGbGFncyAmIE1IRFJfUFJFUEFSRUQpKSByZXR1cm4gTUlESUVSUl9VTlBSRVBBUkVEOworICAgIGlmIChscE1pZGlIZHItPmR3RmxhZ3MgJiBNSERSX0lOUVVFVUUpIHJldHVybiBNSURJRVJSX1NUSUxMUExBWUlORzsKKyAgICAKKyAgICBscE1pZGlIZHItPmR3RmxhZ3MgJj0gfk1IRFJfUFJFUEFSRUQ7CisgICAgCisgICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODY2LDggKzEyMzMsMjEgQEAKICAqLwogc3RhdGljIERXT1JEIG1pZFJlc2V0KFdPUkQgd0RldklEKQogewotCVRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOwotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworICAgIERXT1JECQlkd1RpbWUgPSBHZXRUaWNrQ291bnQoKTsKKyAgICAKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgpO1xuIiwgd0RldklEKTsKKyAgICAKKyAgICB3aGlsZSAoTWlkaUluRGV2W3dEZXZJRF0ubHBRdWV1ZUhkcikgeworCU1pZGlJbkRldlt3RGV2SURdLmxwUXVldWVIZHItPmR3RmxhZ3MgJj0gfk1IRFJfSU5RVUVVRTsKKwlNaWRpSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyLT5kd0ZsYWdzIHw9IE1IRFJfRE9ORTsKKwlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fTE9OR0RBVEEsIAorCQkJICAgICAgKERXT1JEKU1pZGlJbkRldlt3RGV2SURdLmxwUXVldWVIZHIsIGR3VGltZSkgIT0gTU1TWVNFUlJfTk9FUlJPUikgeworCSAgICBXQVJOKG1pZGksICJDb3VsZG4ndCBub3RpZnkgY2xpZW50XG4iKTsKKwl9CisJTWlkaUluRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IChMUE1JRElIRFIpTWlkaUluRGV2W3dEZXZJRF0ubHBRdWV1ZUhkci0+bHBOZXh0OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIAogCkBAIC04NzYsODggKzEyNTYsMjI5IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRTdGFydChXT1JEIHdEZXZJRCkKIHsKLQlUUkFDRShtaWRpLCAiKCUwNFgpO1xuIiwgd0RldklEKTsKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgpO1xuIiwgd0RldklEKTsKKyAgICAKKyAgICAvKiBGSVhNRSA6IHNob3VsZCB0ZXN0IHZhbHVlIG9mIHdEZXZJRCAqLworICAgIAorI2lmZGVmIEhBVkVfT1NTCisgICAgTWlkaUluRGV2W3dEZXZJRF0uc3RhdGUgPSAxOworICAgIE1pZGlJbkRldlt3RGV2SURdLnN0YXJ0VGltZSA9IEdldFRpY2tDb3VudCgpOworICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOworI2Vsc2UKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKyNlbmRpZiAvKiBIQVZFX09TUyAqLwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQltaWRTdG9wCQkJCQlbaW50ZXJuYWxdCiAgKi8KIHN0YXRpYyBEV09SRCBtaWRTdG9wKFdPUkQgd0RldklEKQogewotCVRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOwotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworICAgIFRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOworICAgIAorICAgIC8qIEZJWE1FIDogc2hvdWxkIHRlc3QgdmFsdWUgb2Ygd0RldklEICovCisgICAgCisjaWZkZWYgSEFWRV9PU1MKKyAgICBNaWRpSW5EZXZbd0RldklEXS5zdGF0ZSA9IDA7CisgICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CisjZWxzZSAvKiBIQVZFX09TUyAqLworICAgIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworI2VuZGlmIC8qIEhBVkVfT1NTICovCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQltaWRNZXNzYWdlCQkJCVtzYW1wbGUgZHJpdmVyXQogICovCiBEV09SRCBXSU5BUEkgbWlkTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAotCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCisJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JVFJBQ0UobWlkaSwgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAotCQkJd0RldklELCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0Jc3dpdGNoKHdNc2cpIHsKLQljYXNlIE1JRE1fT1BFTjoKLQkJcmV0dXJuIG1pZE9wZW4od0RldklELChMUE1JRElPUEVOREVTQylkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWNhc2UgTUlETV9DTE9TRToKLQkJcmV0dXJuIG1pZENsb3NlKHdEZXZJRCk7Ci0JY2FzZSBNSURNX0FEREJVRkZFUjoKLQkJcmV0dXJuIG1pZEFkZEJ1ZmZlcih3RGV2SUQsKExQTUlESUhEUilkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWNhc2UgTUlETV9QUkVQQVJFOgotCQlyZXR1cm4gbWlkUHJlcGFyZSh3RGV2SUQsKExQTUlESUhEUilkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWNhc2UgTUlETV9VTlBSRVBBUkU6Ci0JCXJldHVybiBtaWRVbnByZXBhcmUod0RldklELChMUE1JRElIRFIpZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQljYXNlIE1JRE1fR0VUREVWQ0FQUzoKLQkJcmV0dXJuIG1pZEdldERldkNhcHMod0RldklELChMUE1JRElJTkNBUFMxNilkd1BhcmFtMSxkd1BhcmFtMik7Ci0JY2FzZSBNSURNX0dFVE5VTURFVlM6Ci0JCXJldHVybiAwOwotCWNhc2UgTUlETV9SRVNFVDoKLQkJcmV0dXJuIG1pZFJlc2V0KHdEZXZJRCk7Ci0JY2FzZSBNSURNX1NUQVJUOgotCQlyZXR1cm4gbWlkU3RhcnQod0RldklEKTsKLQljYXNlIE1JRE1fU1RPUDoKLQkJcmV0dXJuIG1pZFN0b3Aod0RldklEKTsKLQl9Ci0JcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJICB3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBzd2l0Y2god01zZykgeworICAgIGNhc2UgTUlETV9PUEVOOgorCXJldHVybiBtaWRPcGVuKHdEZXZJRCwoTFBNSURJT1BFTkRFU0MpZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBjYXNlIE1JRE1fQ0xPU0U6CisJcmV0dXJuIG1pZENsb3NlKHdEZXZJRCk7CisgICAgY2FzZSBNSURNX0FEREJVRkZFUjoKKwlyZXR1cm4gbWlkQWRkQnVmZmVyKHdEZXZJRCwoTFBNSURJSERSKWR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgY2FzZSBNSURNX1BSRVBBUkU6CisJcmV0dXJuIG1pZFByZXBhcmUod0RldklELChMUE1JRElIRFIpZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBjYXNlIE1JRE1fVU5QUkVQQVJFOgorCXJldHVybiBtaWRVbnByZXBhcmUod0RldklELChMUE1JRElIRFIpZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBjYXNlIE1JRE1fR0VUREVWQ0FQUzoKKwlyZXR1cm4gbWlkR2V0RGV2Q2Fwcyh3RGV2SUQsKExQTUlESUlOQ0FQUzE2KWR3UGFyYW0xLGR3UGFyYW0yKTsKKyAgICBjYXNlIE1JRE1fR0VUTlVNREVWUzoKKwlyZXR1cm4gTUlETV9OVU1ERVZTOyAKKyAgICBjYXNlIE1JRE1fUkVTRVQ6CisJcmV0dXJuIG1pZFJlc2V0KHdEZXZJRCk7CisgICAgY2FzZSBNSURNX1NUQVJUOgorCXJldHVybiBtaWRTdGFydCh3RGV2SUQpOworICAgIGNhc2UgTUlETV9TVE9QOgorCXJldHVybiBtaWRTdG9wKHdEZXZJRCk7CisgICAgZGVmYXVsdDoKKwlUUkFDRShtaWRpLCAiVW5zdXBwb3J0ZWQgbWVzc2FnZVxuIik7CisgICAgfQorICAgIHJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjaWZkZWYgSEFWRV9PU1MKKwordHlwZWRlZiBzdHJ1Y3Qgc1ZvaWNlIHsKKyAgICBpbnQJCQlub3RlOwkJCS8qIDAgbWVhbnMgbm90IHVzZWQgKi8KKyAgICBpbnQJCQljaGFubmVsOworICAgIHVuc2lnbmVkCQljbnRNYXJrIDogMzAsCisJICAgICAgICAgICAgICAgIHN0YXR1cyA6IDI7CisjZGVmaW5lIHNWU19VTlVTRUQJMAorI2RlZmluZSBzVlNfUExBWUlORwkxCisjZGVmaW5lIHNWU19TVVNUQUlORUQJMgorfSBzVm9pY2U7CisKK3R5cGVkZWYgc3RydWN0IHNDaGFubmVsIHsKKyAgICBpbnQJCQlwcm9ncmFtOworICAgIAorICAgIGludAkJCWJlbmRlcjsKKyAgICBpbnQJCQliZW5kZXJSYW5nZTsKKyAgICAvKiBjb250cm9sZXJzICovCisgICAgaW50CQkJYmFuazsJCS8qIENUTF9CQU5LX1NFTEVDVCAqLworICAgIGludAkJCXZvbHVtZTsJCS8qIENUTF9NQUlOX1ZPTFVNRSAqLworICAgIGludAkJCWJhbGFuY2U7CS8qIENUTF9CQUxBTkNFICAgICAqLworICAgIGludAkJCWV4cHJlc3Npb247CS8qIENUTF9FWFBSRVNTSU9OICAqLworICAgIGludAkJCXN1c3RhaW47CS8qIENUTF9TVVNUQUlOICAgICAqLworICAgIAorICAgIHVuc2lnbmVkIGNoYXIJbnJnUG10TVNCOwkvKiBOb24gcmVnaXN0ZXIgUGFyYW1ldGVycyAqLworICAgIHVuc2lnbmVkIGNoYXIJbnJnUG10TFNCOworICAgIHVuc2lnbmVkIGNoYXIJcmVnUG10TVNCOwkvKiBOb24gcmVnaXN0ZXIgUGFyYW1ldGVycyAqLworICAgIHVuc2lnbmVkIGNoYXIJcmVnUG10TFNCOworfSBzQ2hhbm5lbDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0ZNZXh0cmEgeworICAgIHVuc2lnbmVkCQljb3VudGVyOworICAgIGludAkJCWRydW1TZXRNYXNrOworICAgIHNDaGFubmVsCQljaGFubmVsWzE2XTsJLyogTUlESSBoYXMgb25seSAxNiBjaGFubmVscyAqLworICAgIHNWb2ljZQkJdm9pY2VbMV07CS8qIGR5biBhbGxvY2F0ZWQgYWNjb3JkaW5nIHRvIHNvdW5kIGNhcmQgKi8KKyAgICAvKiBkbyBub3QgYXBwZW5kIGZpZWxkcyBiZWxvdyB2b2ljZVsxXSBzaW5jZSB0aGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSAKKyAgICAgKiBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHZvaWNlcyBvbiB0aGUgRk0gc3ludGguLi4KKyAgICAgKi8KK30gc0ZNZXh0cmE7CisKK2V4dGVybgl1bnNpZ25lZCBjaGFyIG1pZGlGTUluc3RydW1lbnRQYXRjaGVzWzE2ICogMTI4XTsKK2V4dGVybgl1bnNpZ25lZCBjaGFyIG1pZGlGTURydW1zUGF0Y2hlcyAgICAgWzE2ICogMTI4XTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQltb2RGTUxvYWQJCQkJW2ludGVybmFsXQorICovCitzdGF0aWMgaW50IG1vZEZNTG9hZChpbnQgZGV2KQoreworICAgIGludAkJCQlpOworICAgIHN0cnVjdCBzYmlfaW5zdHJ1bWVudAlzYmk7CisgICAgCisgICAgc2JpLmRldmljZSA9IGRldjsKKyAgICBzYmkua2V5ID0gRk1fUEFUQ0g7CisgICAgCisgICAgbWVtc2V0KHNiaS5vcGVyYXRvcnMgKyAxNiwgMCwgMTYpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCXNiaS5jaGFubmVsID0gaTsKKwltZW1jcHkoc2JpLm9wZXJhdG9ycywgbWlkaUZNSW5zdHJ1bWVudFBhdGNoZXMgKyBpICogMTYsIDE2KTsKKwkKKwlpZiAod3JpdGUobWlkaVNlcUZELCAoY2hhciopJnNiaSwgc2l6ZW9mKHNiaSkpID09IC0xKSB7CisJICAgIFdBUk4obWlkaSwgIkNvdWxkbid0IHdyaXRlIHBhdGNoIGZvciBpbnN0cnVtZW50ICVkICglZCkhXG4iLCBzYmkuY2hhbm5lbCwgZXJybm8pOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0gCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJc2JpLmNoYW5uZWwgPSAxMjggKyBpOworCW1lbWNweShzYmkub3BlcmF0b3JzLCBtaWRpRk1EcnVtc1BhdGNoZXMgKyBpICogMTYsIDE2KTsKKwkKKwlpZiAod3JpdGUobWlkaVNlcUZELCAoY2hhciopJnNiaSwgc2l6ZW9mKHNiaSkpID09IC0xKSB7CisJICAgIFdBUk4obWlkaSwgIkNvdWxkbid0IHdyaXRlIHBhdGNoIGZvciBkcnVtICVkICglZCkhXG4iLCBzYmkuY2hhbm5lbCwgZXJybm8pOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0gCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJbW9kRk1SZXNldAkJCQlbaW50ZXJuYWxdCisgKi8KK3N0YXRpYwl2b2lkIG1vZEZNUmVzZXQoV09SRCB3RGV2SUQpCit7CisgICAgc0ZNZXh0cmEqCWV4dHJhICAgPSAoc0ZNZXh0cmEqKU1pZGlPdXREZXZbd0RldklEXS5scEV4dHJhOworICAgIHNWb2ljZSogCXZvaWNlICAgPSBleHRyYS0+dm9pY2U7CisgICAgc0NoYW5uZWwqCWNoYW5uZWwgPSBleHRyYS0+Y2hhbm5lbDsKKyAgICBpbnQJCWk7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndWb2ljZXM7IGkrKykgeworCWlmICh2b2ljZVtpXS5zdGF0dXMgIT0gc1ZTX1VOVVNFRCkgeworCSAgICBTRVFfU1RPUF9OT1RFKHdEZXZJRCwgaSwgdm9pY2VbaV0ubm90ZSwgNjQpOworCX0KKwlTRVFfS0VZX1BSRVNTVVJFKHdEZXZJRCwgaSwgMTI3LCAwKTsKKwlTRVFfQ09OVFJPTCh3RGV2SUQsIGksIFNFUV9WT0xNT0RFLCBWT0xfTUVUSE9EX0xJTkVBUik7CisJdm9pY2VbaV0ubm90ZSA9IDA7CisJdm9pY2VbaV0uY2hhbm5lbCA9IC0xOworCXZvaWNlW2ldLmNudE1hcmsgPSAwOworCXZvaWNlW2ldLnN0YXR1cyA9IHNWU19VTlVTRUQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJY2hhbm5lbFtpXS5wcm9ncmFtID0gMDsKKwljaGFubmVsW2ldLmJlbmRlciA9IDgxOTI7CisJY2hhbm5lbFtpXS5iZW5kZXJSYW5nZSA9IDI7CisJY2hhbm5lbFtpXS5iYW5rID0gMDsKKwljaGFubmVsW2ldLnZvbHVtZSA9IDEyNzsKKwljaGFubmVsW2ldLmJhbGFuY2UgPSA2NDsKKwljaGFubmVsW2ldLmV4cHJlc3Npb24gPSAwOwkKKwljaGFubmVsW2ldLnN1c3RhaW4gPSAwOwkKKyAgICB9CisgICAgZXh0cmEtPmNvdW50ZXIgPSAwOworICAgIGV4dHJhLT5kcnVtU2V0TWFzayA9IDEgPDwgOTsgLyogY2hhbm5lbCAxMCBpcyBub3JtYWxseSBkcnVtcywgc29tZXRpbWVzIDE2IGFsc28gKi8KKyAgICBTRVFfRFVNUEJVRigpOworfQorCisjZGVmaW5lCQlJU19EUlVNX0NIQU5ORUwoX3h0cmEsIF9jaG4pCSgoX3h0cmEpLT5kcnVtU2V0TWFzayAmICgxIDw8IChfY2huKSkpCisKKyNlbmRpZiAvKiBIQVZFX09TUyAqLworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltb2RHZXREZXZDYXBzCQkJW2ludGVybmFsXQogICovCi1zdGF0aWMgRFdPUkQgbW9kR2V0RGV2Q2FwcyhXT1JEIHdEZXZJRCwgTFBNSURJT1VUQ0FQUzE2IGxwQ2FwcywgRFdPUkQgZHdTaXplKQorc3RhdGljIERXT1JEIG1vZEdldERldkNhcHMoV09SRCB3RGV2SUQsIExQTUlESU9VVENBUFMxNiBscENhcHMsIAorCQkJICAgRFdPUkQgZHdTaXplKQogewotICBMUE1JRElPVVRDQVBTMTYgdG1wbHBDYXBzOwotCi0JVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7Ci0gIGlmICh3RGV2SUQgPT0gKFdPUkQpIE1JRElfTUFQUEVSKSB7IAorICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOworICAgIGlmICh3RGV2SUQgPT0gKFdPUkQpIE1JRElfTUFQUEVSKSB7IAogCWxwQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCS8qIE1hbnVmYWMgSUQgKi8KIAlscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBQcm9kdWN0IElEICovCiAJbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDAxOyAvKiBQcm9kdWN0IFZlcnNpb24gKi8KLSAgICBzdHJjcHkobHBDYXBzLT5zelBuYW1lLCAiTUlESSBNYXBlciAobm90IGZ1bmN0aW9uYWwgeWV0KSIpOwotICAgIGxwQ2Fwcy0+d1RlY2hub2xvZ3kgPSBNT0RfRk1TWU5USDsgLyogRklYTUUgRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlID8gKi8KLSAgICBscENhcHMtPndWb2ljZXMgICAgID0gMTQ7ICAgICAgIC8qIEZJWE1FICovCi0gICAgbHBDYXBzLT53Tm90ZXMgICAgICA9IDE0OyAgICAgICAvKiBGSVhNRSAqLwotICAgIGxwQ2Fwcy0+ZHdTdXBwb3J0ICAgPSBNSURJQ0FQU19WT0xVTUV8TUlESUNBUFNfTFJWT0xVTUU7IC8qIEZJWE1FIERvZXMgaXQgbWFrZSBhbnkgZGlmZmVyZW5jZSA/ICovCi0gIH0gZWxzZSB7Ci0gICAgLyogRklYTUUgVGhlcmUgaXMgYSB3YXkgdG8gZG8gaXQgc28gZWFzaWx5LCBidXQgSSdtIHRvbwotICAgICAqIHNsZWVweSB0byB0aGluayBhbmQgSSB3YW50IHRvIHRlc3QKLSovCi0gICAgdG1wbHBDYXBzID0gbWlkaURldmljZXMgW3dEZXZJRF07Ci0gICAgbHBDYXBzLT53TWlkID0gdG1wbHBDYXBzLT53TWlkOyAgCi0gICAgbHBDYXBzLT53UGlkID0gdG1wbHBDYXBzLT53UGlkOyAgCi0gICAgbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IHRtcGxwQ2Fwcy0+dkRyaXZlclZlcnNpb247ICAKLSAgICBzdHJjcHkobHBDYXBzLT5zelBuYW1lLCB0bXBscENhcHMtPnN6UG5hbWUpOyAgICAKLSAgICBscENhcHMtPndUZWNobm9sb2d5ID0gdG1wbHBDYXBzLT53VGVjaG5vbG9neTsKLSAgICBscENhcHMtPndWb2ljZXMgPSB0bXBscENhcHMtPndWb2ljZXM7ICAKLSAgICBscENhcHMtPndOb3RlcyA9IHRtcGxwQ2Fwcy0+d05vdGVzOyAgCi0gICAgbHBDYXBzLT5kd1N1cHBvcnQgPSB0bXBscENhcHMtPmR3U3VwcG9ydDsgIAotICB9Ci0JcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CisJc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSwgIk1JREkgTWFwcGVyIChub3QgZnVuY3Rpb25hbCB5ZXQpIik7CisJLyogRklYTUUgRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlID8gKi8KKwlscENhcHMtPndUZWNobm9sb2d5ID0gTU9EX0ZNU1lOVEg7IAorCWxwQ2Fwcy0+d1ZvaWNlcyAgICAgPSAxNDsgICAgICAgLyogRklYTUUgKi8KKwlscENhcHMtPndOb3RlcyAgICAgID0gMTQ7ICAgICAgIC8qIEZJWE1FICovCisJLyogRklYTUUgRG9lcyBpdCBtYWtlIGFueSBkaWZmZXJlbmNlID8gKi8KKwlscENhcHMtPmR3U3VwcG9ydCAgID0gTUlESUNBUFNfVk9MVU1FfE1JRElDQVBTX0xSVk9MVU1FOyAKKyAgICB9IGVsc2UgeworCUxQTUlESU9VVENBUFMxNgl0bXBscENhcHM7CisJCisJaWYgKHdEZXZJRCA+PSBNT0RNX05VTURFVlMpIHsKKwkgICAgVFJBQ0UobWlkaSwgIk1BWF9NSURJT1VURFJWIHJlYWNoZWQgIVxuIik7CisJICAgIHJldHVybiBNTVNZU0VSUl9CQURERVZJQ0VJRDsKKwl9CisJLyogRklYTUUgVGhlcmUgaXMgYSB3YXkgdG8gZG8gaXQgc28gZWFzaWx5LCBidXQgSSdtIHRvbworCSAqIHNsZWVweSB0byB0aGluayBhbmQgSSB3YW50IHRvIHRlc3QKKwkgKi8KKwkKKwl0bXBscENhcHMgPSBtaWRpT3V0RGV2aWNlc1t3RGV2SURdOworCWxwQ2Fwcy0+d01pZCA9IHRtcGxwQ2Fwcy0+d01pZDsgIAorCWxwQ2Fwcy0+d1BpZCA9IHRtcGxwQ2Fwcy0+d1BpZDsgIAorCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSB0bXBscENhcHMtPnZEcml2ZXJWZXJzaW9uOyAgCisJc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSwgdG1wbHBDYXBzLT5zelBuYW1lKTsgICAgCisJbHBDYXBzLT53VGVjaG5vbG9neSA9IHRtcGxwQ2Fwcy0+d1RlY2hub2xvZ3k7CisJbHBDYXBzLT53Vm9pY2VzID0gdG1wbHBDYXBzLT53Vm9pY2VzOyAgCisJbHBDYXBzLT53Tm90ZXMgPSB0bXBscENhcHMtPndOb3RlczsgIAorCWxwQ2Fwcy0+ZHdTdXBwb3J0ID0gdG1wbHBDYXBzLT5kd1N1cHBvcnQ7CisgICAgfQorICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk2NSw0OCArMTQ4NiwxMDEgQEAKICAqLwogc3RhdGljIERXT1JEIG1vZE9wZW4oV09SRCB3RGV2SUQsIExQTUlESU9QRU5ERVNDIGxwRGVzYywgRFdPUkQgZHdGbGFncykKIHsKLQlpbnQJCW1pZGk7Ci0KLQlUUkFDRShtaWRpLCAiKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSB7Ci0JCVdBUk4obWlkaSwgIkludmFsaWQgUGFyYW1ldGVyICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSB7CisJV0FSTihtaWRpLCAiSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CisJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisgICAgfQorICAgIGlmICh3RGV2SUQgPj0gTUFYX01JRElPVVREUlYpIHsKKwlUUkFDRShtaWRpLCJNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOworCXJldHVybiBNTVNZU0VSUl9CQURERVZJQ0VJRDsKKyAgICB9CisgICAgaWYgKE1pZGlPdXREZXZbd0RldklEXS5taWRpRGVzYyAhPSAwKSB7CisJV0FSTihtaWRpLCAiZGV2aWNlIGFscmVhZHkgb3BlbiAhXG4iKTsKKwlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOworICAgIH0KKyAgICBpZiAoKGR3RmxhZ3MgJiB+Q0FMTEJBQ0tfVFlQRU1BU0spICE9IDApIHsgCisJV0FSTihtaWRpLCAiYmFkIGR3RmxhZ3NcbiIpOworCXJldHVybiBNTVNZU0VSUl9JTlZBTEZMQUc7CisgICAgfQorICAgIAorI2lmZGVmIEhBVkVfT1NTCisgICAgTWlkaU91dERldlt3RGV2SURdLmxwRXh0cmEgPSAwOworICAgIAorICAgIHN3aXRjaCAobWlkaU91dERldmljZXNbd0RldklEXS0+d1RlY2hub2xvZ3kpIHsKKyAgICBjYXNlIE1PRF9GTVNZTlRIOgorCXsKKwkgICAgdm9pZCoJZXh0cmEgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc0ZNZXh0cmEpICsgCisJCQkJCXNpemVvZihzdHJ1Y3Qgc1ZvaWNlKSAqIAorCQkJCQkobWlkaU91dERldmljZXNbd0RldklEXS0+d1ZvaWNlcyAtIDEpKTsKKwkgICAgCisJICAgIGlmIChleHRyYSA9PSAwKSB7CisJCVdBUk4obWlkaSwgImNhbid0IGFsbG9jIGV4dHJhIGRhdGEgIVxuIik7CisJCXJldHVybiBNTVNZU0VSUl9OT01FTTsKKwkgICAgfQorCSAgICBNaWRpT3V0RGV2W3dEZXZJRF0ubHBFeHRyYSA9IGV4dHJhOworCSAgICBpZiAobWlkaU9wZW5TZXEoKSA8IDApIHsKKwkJTWlkaU91dERldlt3RGV2SURdLmxwRXh0cmEgPSAwOworCQlmcmVlKGV4dHJhKTsKKwkJcmV0dXJuIE1NU1lTRVJSX0VSUk9SOworCSAgICB9CisJICAgIGlmIChtb2RGTUxvYWQod0RldklEKSA8IDApIHsKKwkJbWlkaUNsb3NlU2VxKCk7CisJCU1pZGlPdXREZXZbd0RldklEXS5scEV4dHJhID0gMDsKKwkJZnJlZShleHRyYSk7CisJCXJldHVybiBNTVNZU0VSUl9FUlJPUjsKKwkgICAgfQorCSAgICBtb2RGTVJlc2V0KHdEZXZJRCk7CiAJfQotCWlmICh3RGV2SUQ+PSBNQVhfTUlESU9VVERSVikgewotCQlUUkFDRShtaWRpLCJNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOyAvKiBGSVhNRSBpc24ndCBNTVNZU0VSUl9CQURERVZJQ0VJRCB0aGUgcmlnaHQgYW5zd2VyID8gKi8KKwlicmVhazsKKyAgICBjYXNlIE1PRF9NSURJUE9SVDoKKwlpZiAobWlkaU9wZW5TZXEoKSA8IDApIHsKKwkgICAgcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlXQVJOKG1pZGksIlRlY2hub2xvZ3kgbm90IHN1cHBvcnRlZCAoeWV0KSAlZCAhXG4iLCAKKwkgICAgIG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndUZWNobm9sb2d5KTsKKwlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKyAgICB9CisjZWxzZSAvKiBIQVZFX09TUyAqLworICAgIHsJCisJaW50CW1pZGkgPSBvcGVuIChNSURJX0RFViwgT19XUk9OTFksIDApOwogCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID0gMDsKLQltaWRpID0gb3BlbiAoTUlESV9ERVYsIE9fV1JPTkxZLCAwKTsKIAlpZiAobWlkaSA9PSAtMSkgewotCQlXQVJOKG1pZGksICJjYW4ndCBvcGVuICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKwkgICAgV0FSTihtaWRpLCAiY2FuJ3Qgb3BlbiAhXG4iKTsKKwkgICAgcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAl9Ci0JTWlkaU91dERldlt3RGV2SURdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOwotCXN3aXRjaChNaWRpT3V0RGV2W3dEZXZJRF0ud0ZsYWdzKSB7Ci0JY2FzZSBEQ0JfTlVMTDoKLQkJVFJBQ0UobWlkaSwiQ0FMTEJBQ0tfTlVMTCAhXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBEQ0JfV0lORE9XOgotCQlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfV0lORE9XICFcbiIpOwotCQlicmVhazsKLQljYXNlIERDQl9UQVNLOgotCQlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBEQ0JfRlVOQ1RJT046Ci0JCVRSQUNFKG1pZGksICJDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKLQkJYnJlYWs7Ci0JfQotCU1pZGlPdXREZXZbd0RldklEXS5scFF1ZXVlSGRyID0gTlVMTDsKIAlNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IG1pZGk7Ci0JTWlkaU91dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgPSAwOwotCU1pZGlPdXREZXZbd0RldklEXS5idWZzaXplID0gMHgzRkZGOwotCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1PTV9PUEVOLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJV0FSTihtaWRpLCJjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKLQl9Ci0JVFJBQ0UobWlkaSwgIlN1Y2Nlc2Z1bCB1bml4ZGV2PSVkICFcbiIsIG1pZGkpOwotCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX09TUyAqLwkKKyAgICAKKyAgICBNaWRpT3V0RGV2W3dEZXZJRF0ud0ZsYWdzID0gSElXT1JEKGR3RmxhZ3MgJiBDQUxMQkFDS19UWVBFTUFTSyk7CisgICAgc3dpdGNoKE1pZGlPdXREZXZbd0RldklEXS53RmxhZ3MpIHsKKyAgICBjYXNlIERDQl9OVUxMOgorCVRSQUNFKG1pZGksIkNBTExCQUNLX05VTEwgIVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBEQ0JfV0lORE9XOgorCVRSQUNFKG1pZGksICJDQUxMQkFDS19XSU5ET1cgIVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBEQ0JfVEFTSzoKKwlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKKwlicmVhazsKKyAgICBjYXNlIERDQl9GVU5DVElPTjoKKwlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CisJYnJlYWs7CisgICAgfQorICAgIE1pZGlPdXREZXZbd0RldklEXS5scFF1ZXVlSGRyID0gTlVMTDsKKyAgICBNaWRpT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7CisgICAgTWlkaU91dERldlt3RGV2SURdLmJ1ZnNpemUgPSAweDNGRkY7CisgICAgTWlkaU91dERldlt3RGV2SURdLm1pZGlEZXNjID0gbHBEZXNjOworICAgIAorICAgIGlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1PTV9PUEVOLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKwlXQVJOKG1pZGksImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisgICAgfQorICAgIFRSQUNFKG1pZGksICJTdWNjZXNmdWwgIVxuIik7CisgICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKIApAQCAtMTAxNSwxOSArMTU4OSw1NCBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kQ2xvc2UoV09SRCB3RGV2SUQpCiB7Ci0JVFJBQ0UobWlkaSwgIiglMDRYKTtcbiIsIHdEZXZJRCk7Ci0JaWYgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJV0FSTihtaWRpLCJjYW4ndCBjbG9zZSAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7Ci0JfQotCWNsb3NlKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2KTsKLQlNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IDA7Ci0JTWlkaU91dERldlt3RGV2SURdLmJ1ZnNpemUgPSAwOwotCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1PTV9DTE9TRSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCVdBUk4obWlkaSwiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07Ci0JfQotCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOworICAgIGludAlyZXQgPSBNTVNZU0VSUl9OT0VSUk9SOworCisgICAgVFJBQ0UobWlkaSwgIiglMDRYKTtcbiIsIHdEZXZJRCk7CisgICAgCisgICAgaWYgKE1pZGlPdXREZXZbd0RldklEXS5taWRpRGVzYyA9PSAwKSB7CisJV0FSTihtaWRpLCAiZGV2aWNlIG5vdCBvcGVuZWQgIVxuIik7CisJcmV0dXJuIE1NU1lTRVJSX0VSUk9SOworICAgIH0KKyAgICAvKiBGSVhNRTogc2hvdWxkIHRlc3QgdGhhdCBubyBwZW5kaW5nIGJ1ZmZlciBpcyBzdGlsbCBpbiB0aGUgcXVldWUgZm9yCisgICAgICogcGxheWluZyAqLworICAgIAorI2lmZGVmIEhBVkVfT1NTCQorICAgIGlmIChtaWRpU2VxRkQgPT0gLTEpIHsKKwlXQVJOKG1pZGksImNhbid0IGNsb3NlICFcbiIpOworCXJldHVybiBNTVNZU0VSUl9FUlJPUjsKKyAgICB9CisgICAgCisgICAgc3dpdGNoIChtaWRpT3V0RGV2aWNlc1t3RGV2SURdLT53VGVjaG5vbG9neSkgeworICAgIGNhc2UgTU9EX0ZNU1lOVEg6CisgICAgY2FzZSBNT0RfTUlESVBPUlQ6CisJbWlkaUNsb3NlU2VxKCk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlXQVJOKG1pZGksIlRlY2hub2xvZ3kgbm90IHN1cHBvcnRlZCAoeWV0KSAlZCAhXG4iLCAKKwkgICAgIG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndUZWNobm9sb2d5KTsKKwlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKyAgICB9CisgICAgCisgICAgaWYgKE1pZGlPdXREZXZbd0RldklEXS5scEV4dHJhICE9IDApIHsKKwlmcmVlKE1pZGlPdXREZXZbd0RldklEXS5scEV4dHJhKTsKKwlNaWRpT3V0RGV2W3dEZXZJRF0ubHBFeHRyYSA9IDA7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCVdBUk4obWlkaSwiY2FuJ3QgY2xvc2UgIVxuIik7CisJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CisgICAgfQorICAgIGNsb3NlKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2KTsKKyAgICBNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IDA7CisjZW5kaWYgLyogSEFWRV9PU1MgKi8KKyAgICAKKyAgICBNaWRpT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDA7CisgICAgaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTU9NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKwlXQVJOKG1pZGksImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJcmV0ID0gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKyAgICB9CisgICAgTWlkaU91dERldlt3RGV2SURdLm1pZGlEZXNjID0gMDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwMzUsMTkgKzE2NDQsMjk4IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtb2REYXRhKFdPUkQgd0RldklELCBEV09SRCBkd1BhcmFtKQogewotCVdPUkQJZXZlbnQ7Ci0KLQlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7Ci0JaWYgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLSAgICAgICAgCVdBUk4obWlkaSwiY2FuJ3QgcGxheSAhXG4iKTsKKyAgICBXT1JECWV2dCA9IExPQllURShMT1dPUkQoZHdQYXJhbSkpOworICAgIFdPUkQJZDEgID0gSElCWVRFKExPV09SRChkd1BhcmFtKSk7CisgICAgV09SRAlkMiAgPSBMT0JZVEUoSElXT1JEKGR3UGFyYW0pKTsKKyAgICAKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CisgICAgCisjaWZkZWYgSEFWRV9PU1MKKyAgICBpZiAobWlkaVNlcUZEID09IC0xKSB7CisJV0FSTihtaWRpLCJjYW4ndCBwbGF5ICFcbiIpOworCXJldHVybiBNSURJRVJSX05PREVWSUNFOworICAgIH0KKyAgICBzd2l0Y2ggKG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndUZWNobm9sb2d5KSB7CisgICAgY2FzZSBNT0RfRk1TWU5USDoKKwkvKiBGSVhNRToKKwkgKgktIGNob3J1cyBkZXB0aCBjb250cm9sbGVyIGlzIG5vdCB1c2VkCisJICovCisJeworCSAgICBzRk1leHRyYSoJZXh0cmEgICA9IChzRk1leHRyYSopTWlkaU91dERldlt3RGV2SURdLmxwRXh0cmE7CisJICAgIHNWb2ljZSogCXZvaWNlICAgPSBleHRyYS0+dm9pY2U7CisJICAgIHNDaGFubmVsKgljaGFubmVsID0gZXh0cmEtPmNoYW5uZWw7CisJICAgIGludAkJY2huID0gKGV2dCAmIDB4MEYpOworCSAgICBpbnQJCWksIG52OworCSAgICAKKwkgICAgc3dpdGNoIChldnQgJiAweEYwKSB7CisJICAgIGNhc2UgTUlESV9OT1RFT0ZGOgorCQlmb3IgKGkgPSAwOyBpIDwgbWlkaU91dERldmljZXNbd0RldklEXS0+d1ZvaWNlczsgaSsrKSB7CisJCQkJLyogZG9uJ3Qgc3RvcCBzdXN0YWluZWQgbm90ZXMgKi8KKwkJICAgIGlmICh2b2ljZVtpXS5zdGF0dXMgPT0gc1ZTX1BMQVlJTkcgJiYgdm9pY2VbaV0uY2hhbm5lbCA9PSBjaG4gJiYgdm9pY2VbaV0ubm90ZSA9PSBkMSkgeworCQkJdm9pY2VbaV0uc3RhdHVzID0gc1ZTX1VOVVNFRDsKKwkJCVNFUV9TVE9QX05PVEUod0RldklELCBpLCBkMSwgZDIpOworCQkgICAgfQorCQl9CisJCWJyZWFrOwkKKwkgICAgY2FzZSBNSURJX05PVEVPTjoKKwkJaWYgKGQyID09IDApIHsgLyogbm90ZSBvZmYgaWYgdmVsb2NpdHkgPT0gMCAqLworCQkgICAgZm9yIChpID0gMDsgaSA8IG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndWb2ljZXM7IGkrKykgeworCQkJLyogZG9uJ3Qgc3RvcCBzdXN0YWluZWQgbm90ZXMgKi8KKwkJCWlmICh2b2ljZVtpXS5zdGF0dXMgPT0gc1ZTX1BMQVlJTkcgJiYgdm9pY2VbaV0uY2hhbm5lbCA9PSBjaG4gJiYgdm9pY2VbaV0ubm90ZSA9PSBkMSkgeworCQkJICAgIHZvaWNlW2ldLnN0YXR1cyA9IHNWU19VTlVTRUQ7CisJCQkgICAgU0VRX1NUT1BfTk9URSh3RGV2SUQsIGksIGQxLCA2NCk7CisJCQl9CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQkvKiBmaW5kaW5nIG91dCBpbiB0aGlzIG9yZGVyIDoKKwkJICoJLSBhbiBlbXB0eSB2b2ljZQorCQkgKgktIGlmIHJlcGxheWluZyB0aGUgc2FtZSBub3RlIG9uIHRoZSBzYW1lIGNoYW5uZWwKKwkJICoJLSB0aGUgb2xkZXIgdm9pY2UgKExSVSkKKwkJICovCisJCWZvciAoaSA9IG52ID0gMDsgaSA8IG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndWb2ljZXM7IGkrKykgeworCQkgICAgaWYgKHZvaWNlW2ldLnN0YXR1cyA9PSBzVlNfVU5VU0VEIHx8IAorCQkJKHZvaWNlW2ldLm5vdGUgPT0gZDEgJiYgdm9pY2VbaV0uY2hhbm5lbCA9PSBjaG4pKSB7CisJCQludiA9IGk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGlmICh2b2ljZVtpXS5jbnRNYXJrIDwgdm9pY2VbMF0uY250TWFyaykgeworCQkJbnYgPSBpOworCQkgICAgfQorCQl9CisJCVRSQUNFKG1pZGksIAorCQkgICAgICAicGxheWluZyBvbiB2b2ljZT0lZCwgcGdtPSVkLCBwYW49MHglMDJYLCB2b2w9MHglMDJYLCAiCisJCSAgICAgICJiZW5kZXI9MHglMDJYLCBub3RlPTB4JTAyWCwgdmVsPTB4JTAyWFxuIiwgCisJCSAgICAgIG52LCBjaGFubmVsW2Nobl0ucHJvZ3JhbSwgCisJCSAgICAgIGNoYW5uZWxbY2huXS5iYWxhbmNlLCAKKwkJICAgICAgY2hhbm5lbFtjaG5dLnZvbHVtZSwgCisJCSAgICAgIGNoYW5uZWxbY2huXS5iZW5kZXIsIGQxLCBkMik7CisJCQorCQlTRVFfU0VUX1BBVENIKHdEZXZJRCwgbnYsIElTX0RSVU1fQ0hBTk5FTChleHRyYSwgY2huKSA/IAorCQkJICAgICAgKDEyOCArIGQxKSA6IGNoYW5uZWxbY2huXS5wcm9ncmFtKTsKKwkJU0VRX0JFTkRFUl9SQU5HRSh3RGV2SUQsIG52LCBjaGFubmVsW2Nobl0uYmVuZGVyUmFuZ2UgKiAxMDApOworCQlTRVFfQkVOREVSKHdEZXZJRCwgbnYsIGNoYW5uZWxbY2huXS5iZW5kZXIpOworCQlTRVFfQ09OVFJPTCh3RGV2SUQsIG52LCBDVExfUEFOLCBjaGFubmVsW2Nobl0uYmFsYW5jZSk7CisJCVNFUV9DT05UUk9MKHdEZXZJRCwgbnYsIENUTF9FWFBSRVNTSU9OLCBjaGFubmVsW2Nobl0uZXhwcmVzc2lvbik7CisjaWYgMAkKKwkJLyogRklYTUU6IGRvZXMgbm90IHJlYWxseSBzZWVtIHRvIHdvcmsgb24gbXkgU0IgY2FyZCBhbmQKKwkJICogc2NyZXdzIGV2ZXJ5dGhpbmcgdXAuLi4gc28gbGF5IGl0IGRvd24KKwkJICovCisJCVNFUV9DT05UUk9MKHdEZXZJRCwgbnYsIENUTF9NQUlOX1ZPTFVNRSwgY2hhbm5lbFtjaG5dLnZvbHVtZSk7CisjZW5kaWYJCisJCVNFUV9TVEFSVF9OT1RFKHdEZXZJRCwgbnYsIGQxLCBkMik7CisJCXZvaWNlW252XS5zdGF0dXMgPSBjaGFubmVsW2Nobl0uc3VzdGFpbiA/IHNWU19TVVNUQUlORUQgOiBzVlNfUExBWUlORzsKKwkJdm9pY2VbbnZdLm5vdGUgPSBkMTsKKwkJdm9pY2VbbnZdLmNoYW5uZWwgPSBjaG47CisJCXZvaWNlW252XS5jbnRNYXJrID0gZXh0cmEtPmNvdW50ZXIrKzsKKwkJYnJlYWs7CisJICAgIGNhc2UgTUlESV9LRVlfUFJFU1NVUkU6CisJCWZvciAoaSA9IDA7IGkgPCBtaWRpT3V0RGV2aWNlc1t3RGV2SURdLT53Vm9pY2VzOyBpKyspIHsKKwkJICAgIGlmICh2b2ljZVtpXS5zdGF0dXMgIT0gc1ZTX1VOVVNFRCAmJiB2b2ljZVtpXS5jaGFubmVsID09IGNobiAmJiB2b2ljZVtpXS5ub3RlID09IGQxKSB7CisJCQlTRVFfS0VZX1BSRVNTVVJFKHdEZXZJRCwgaSwgZDEsIGQyKTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBNSURJX0NUTF9DSEFOR0U6CisJCXN3aXRjaCAoZDEpIHsKKwkJY2FzZSBDVExfQkFOS19TRUxFQ1Q6CWNoYW5uZWxbY2huXS5iYW5rID0gZDI7CQlicmVhazsKKwkJY2FzZSBDVExfTUFJTl9WT0xVTUU6CWNoYW5uZWxbY2huXS52b2x1bWUgPSBkMjsJYnJlYWs7CisJCWNhc2UgQ1RMX1BBTjoJCWNoYW5uZWxbY2huXS5iYWxhbmNlID0gZDI7CWJyZWFrOworCQljYXNlIENUTF9FWFBSRVNTSU9OOgljaGFubmVsW2Nobl0uZXhwcmVzc2lvbiA9IGQyOwlicmVhazsKKwkJY2FzZSBDVExfU1VTVEFJTjoJY2hhbm5lbFtjaG5dLnN1c3RhaW4gPSBkMjsKKwkJICAgIGlmIChkMikgeworCQkJZm9yIChpID0gMDsgaSA8IG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndWb2ljZXM7IGkrKykgeworCQkJICAgIGlmICh2b2ljZVtpXS5zdGF0dXMgPT0gc1ZTX1BMQVlJTkcgJiYgdm9pY2VbaV0uY2hhbm5lbCA9PSBjaG4pIHsKKwkJCQl2b2ljZVtpXS5zdGF0dXMgPSBzVlNfU1VTVEFJTkVEOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWlkaU91dERldmljZXNbd0RldklEXS0+d1ZvaWNlczsgaSsrKSB7CisJCQkgICAgaWYgKHZvaWNlW2ldLnN0YXR1cyA9PSBzVlNfU1VTVEFJTkVEICYmIHZvaWNlW2ldLmNoYW5uZWwgPT0gY2huKSB7CisJCQkJdm9pY2VbaV0uc3RhdHVzID0gc1ZTX1VOVVNFRDsKKwkJCQlTRVFfU1RPUF9OT1RFKHdEZXZJRCwgaSwgdm9pY2VbaV0ubm90ZSwgNjQpOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlIENUTF9OT05SRUdfUEFSTV9OVU1fTFNCOgljaGFubmVsW2Nobl0ubnJnUG10TFNCID0gZDI7CWJyZWFrOworCQljYXNlIENUTF9OT05SRUdfUEFSTV9OVU1fTVNCOgljaGFubmVsW2Nobl0ubnJnUG10TVNCID0gZDI7CWJyZWFrOworCQljYXNlIENUTF9SRUdJU1RfUEFSTV9OVU1fTFNCOgljaGFubmVsW2Nobl0ucmVnUG10TFNCID0gZDI7CWJyZWFrOworCQljYXNlIENUTF9SRUdJU1RfUEFSTV9OVU1fTVNCOgljaGFubmVsW2Nobl0ucmVnUG10TVNCID0gZDI7CWJyZWFrOworCQkgICAgCisJCWNhc2UgQ1RMX0RBVEFfRU5UUlk6CisJCSAgICBzd2l0Y2ggKChjaGFubmVsW2Nobl0ucmVnUG10TVNCIDw8IDgpIHwgY2hhbm5lbFtjaG5dLnJlZ1BtdExTQikgeworCQkgICAgY2FzZSAweDAwMDA6IAorCQkJaWYgKGNoYW5uZWxbY2huXS5iZW5kZXJSYW5nZSAhPSBkMikgeworCQkJICAgIGNoYW5uZWxbY2huXS5iZW5kZXJSYW5nZSA9IGQyOworCQkJICAgIGZvciAoaSA9IDA7IGkgPCBtaWRpT3V0RGV2aWNlc1t3RGV2SURdLT53Vm9pY2VzOyBpKyspIHsKKwkJCQlpZiAodm9pY2VbaV0uY2hhbm5lbCA9PSBjaG4pIHsKKwkJCQkgICAgU0VRX0JFTkRFUl9SQU5HRSh3RGV2SUQsIGksIGNoYW5uZWxbY2huXS5iZW5kZXJSYW5nZSk7CisJCQkJfQorCQkJICAgIH0KKwkJCX0KKwkJCWJyZWFrOworCQkJCisJCSAgICBjYXNlIDB4N0Y3RjoKKwkJCWNoYW5uZWxbY2huXS5iZW5kZXJSYW5nZSA9IDI7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWlkaU91dERldmljZXNbd0RldklEXS0+d1ZvaWNlczsgaSsrKSB7CisJCQkgICAgaWYgKHZvaWNlW2ldLmNoYW5uZWwgPT0gY2huKSB7CisJCQkJU0VRX0JFTkRFUl9SQU5HRSh3RGV2SUQsIGksIGNoYW5uZWxbY2huXS5iZW5kZXJSYW5nZSk7CisJCQkgICAgfQorCQkJfQorCQkJYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkJVFJBQ0UobWlkaSwgIkRhdGEgZW50cnk6IHJlZ1BtdD0weCUwMnglMDJ4LCBucmdQbXQ9MHglMDJ4JTAyeCB3aXRoICV4XG4iLAorCQkJICAgICAgY2hhbm5lbFtjaG5dLnJlZ1BtdE1TQiwgY2hhbm5lbFtjaG5dLnJlZ1BtdExTQiwKKwkJCSAgICAgIGNoYW5uZWxbY2huXS5ucmdQbXRNU0IsIGNoYW5uZWxbY2huXS5ucmdQbXRMU0IsCisJCQkgICAgICBkMik7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQkgICAgCisJCWNhc2UgMHg3ODogLyogYWxsIHNvdW5kcyBvZmYgKi8KKwkJICAgIGZvciAoaSA9IDA7IGkgPCBtaWRpT3V0RGV2aWNlc1t3RGV2SURdLT53Vm9pY2VzOyBpKyspIHsKKwkJCWlmICh2b2ljZVtpXS5zdGF0dXMgIT0gc1ZTX1VOVVNFRCAmJiB2b2ljZVtpXS5jaGFubmVsID09IGNobikgeworCQkJICAgIHZvaWNlW2ldLnN0YXR1cyA9IHNWU19VTlVTRUQ7CisJCQkgICAgU0VRX1NUT1BfTk9URSh3RGV2SUQsIGksIHZvaWNlW2ldLm5vdGUsIDApOworCQkJfQorCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgMHg3QjogLyogYWxsIG5vdGVzIG9mZiAqLworCQkgICAgZm9yIChpID0gMDsgaSA8IG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndWb2ljZXM7IGkrKykgeworCQkJaWYgKHZvaWNlW2ldLnN0YXR1cyA9PSBzVlNfUExBWUlORyAmJiB2b2ljZVtpXS5jaGFubmVsID09IGNobikgeworCQkJICAgIHZvaWNlW2ldLnN0YXR1cyA9IHNWU19VTlVTRUQ7CisJCQkgICAgU0VRX1NUT1BfTk9URSh3RGV2SUQsIGksIHZvaWNlW2ldLm5vdGUsIDApOworCQkJfQorCQkgICAgfQorCQkgICAgYnJlYWs7CQorCQlkZWZhdWx0OgorCQkgICAgVFJBQ0UobWlkaSwgIkRyb3BwaW5nIE1JREkgY29udHJvbCBldmVudCAweCUwMngoJTAyeCkgb24gY2hhbm5lbCAlZFxuIiwgCisJCQkgIGQxLCBkMiwgY2huKTsKKwkJICAgIGJyZWFrOworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIE1JRElfUEdNX0NIQU5HRToKKwkJY2hhbm5lbFtjaG5dLnByb2dyYW0gPSBkMTsKKwkJYnJlYWs7CisJICAgIGNhc2UgTUlESV9DSE5fUFJFU1NVUkU6CisJCWZvciAoaSA9IDA7IGkgPCBtaWRpT3V0RGV2aWNlc1t3RGV2SURdLT53Vm9pY2VzOyBpKyspIHsKKwkJICAgIGlmICh2b2ljZVtpXS5zdGF0dXMgIT0gc1ZTX1VOVVNFRCAmJiB2b2ljZVtpXS5jaGFubmVsID09IGNobikgeworCQkJU0VRX0tFWV9QUkVTU1VSRSh3RGV2SUQsIGksIHZvaWNlW2ldLm5vdGUsIGQxKTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBNSURJX1BJVENIX0JFTkQ6CisJCWNoYW5uZWxbY2huXS5iZW5kZXIgPSAoZDIgPDwgNykgKyBkMTsKKwkJZm9yIChpID0gMDsgaSA8IG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndWb2ljZXM7IGkrKykgeworCQkgICAgaWYgKHZvaWNlW2ldLmNoYW5uZWwgPT0gY2huKSB7CisJCQlTRVFfQkVOREVSKHdEZXZJRCwgaSwgY2hhbm5lbFtjaG5dLmJlbmRlcik7CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgTUlESV9TWVNURU1fUFJFRklYOgorCQlzd2l0Y2ggKGV2dCAmIDB4MEYpIHsKKwkJY2FzZSAweDBGOiAJLyogUmVzZXQgKi8KKwkJICAgIG1vZEZNUmVzZXQod0RldklEKTsKKwkJICAgIGJyZWFrOyAKKwkJZGVmYXVsdDoKKwkJICAgIFdBUk4obWlkaSwgCisJCQkgIlVuc3VwcG9ydGVkICh5ZXQpIHN5c3RlbSBldmVudCAlMDJ4XG4iLCAKKwkJCSBldnQgJiAweDBGKTsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoJCisJCVdBUk4obWlkaSwgIkludGVybmFsIGVycm9yLCBzaG91bGRuJ3QgaGFwcGVuXG4iKTsKKwkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgY2FzZSBNT0RfTUlESVBPUlQ6CisJeworCSAgICBpbnQJZGV2ID0gd0RldklEIC0gTU9ETV9OVU1GTVNZTlRIREVWUzsKKwkgICAgaWYgKGRldiA8IDApIHsKKwkJV0FSTihtaWRpLCAiSW50ZXJuYWwgZXJyb3Igb24gZGV2SUQgKCV1KSAhXG4iLCB3RGV2SUQpOwogCQlyZXR1cm4gTUlESUVSUl9OT0RFVklDRTsKKwkgICAgfQorCSAgICAKKwkgICAgc3dpdGNoIChldnQgJiAweEYwKSB7CisJICAgIGNhc2UgTUlESV9OT1RFT0ZGOgorCSAgICBjYXNlIE1JRElfTk9URU9OOgorCSAgICBjYXNlIE1JRElfS0VZX1BSRVNTVVJFOgorCSAgICBjYXNlIE1JRElfQ1RMX0NIQU5HRToKKwkgICAgY2FzZSBNSURJX1BJVENIX0JFTkQ6CisJCVNFUV9NSURJT1VUKGRldiwgZXZ0KTsJCisJCVNFUV9NSURJT1VUKGRldiwgZDEpOwkKKwkJU0VRX01JRElPVVQoZGV2LCBkMik7IAkKKwkJYnJlYWs7CisJICAgIGNhc2UgTUlESV9QR01fQ0hBTkdFOgorCSAgICBjYXNlIE1JRElfQ0hOX1BSRVNTVVJFOgorCQlTRVFfTUlESU9VVChkZXYsIGV2dCk7CQorCQlTRVFfTUlESU9VVChkZXYsIGQxKTsJCQkJCQkJCQkJCisJCWJyZWFrOwkKKwkgICAgY2FzZSBNSURJX1NZU1RFTV9QUkVGSVg6CisJCXN3aXRjaCAoZXZ0ICYgMHgwRikgeworCQljYXNlIDB4MDA6CS8qIFN5c3RlbSBFeGNsdXNpdmUsIGRvbid0IGRvIGl0IG9uIG1vZERhdGEsIAorCQkJCSAqIHNob3VsZCByZXF1aXJlIG1vZExvbmdEYXRhKi8KKwkJY2FzZSAweDAxOgkvKiBVbmRlZmluZWQgKi8KKwkJY2FzZSAweDA0OgkvKiBVbmRlZmluZWQuICovCisJCWNhc2UgMHgwNToJLyogVW5kZWZpbmVkLiAqLworCQljYXNlIDB4MDc6CS8qIEVuZCBvZiBFeGNsdXNpdmUuICovCisJCWNhc2UgMHgwOToJLyogVW5kZWZpbmVkLiAqLworCQljYXNlIDB4MEQ6CS8qIFVuZGVmaW5lZC4gKi8KKwkJICAgIGJyZWFrOworCQljYXNlIDB4MDY6CS8qIFR1bmUgUmVxdWVzdCAqLworCQljYXNlIDB4MDg6CS8qIFRpbWluZyBDbG9jay4gKi8KKwkJY2FzZSAweDBBOgkvKiBTdGFydC4gKi8KKwkJY2FzZSAweDBCOgkvKiBDb250aW51ZSAqLworCQljYXNlIDB4MEM6CS8qIFN0b3AgKi8KKwkJY2FzZSAweDBFOiAJLyogQWN0aXZlIFNlbnNpbmcuICovCisJCSAgICBTRVFfTUlESU9VVChkZXYsIGV2dCk7CQorCQkgICAgYnJlYWs7CisJCWNhc2UgMHgwRjogCS8qIFJlc2V0ICovCisJCQkJLyogU0VRX01JRElPVVQoZGV2LCBldnQpOworCQkJCSAgIHRoaXMgb3RoZXIgd2F5IG1heSBiZSBiZXR0ZXIgKi8KKwkJICAgIFNFUV9NSURJT1VUKGRldiwgTUlESV9TWVNURU1fUFJFRklYKTsKKwkJICAgIFNFUV9NSURJT1VUKGRldiwgMHg3ZSk7CisJCSAgICBTRVFfTUlESU9VVChkZXYsIDB4N2YpOworCQkgICAgU0VRX01JRElPVVQoZGV2LCAweDA5KTsKKwkJICAgIFNFUV9NSURJT1VUKGRldiwgMHgwMSk7CisJCSAgICBTRVFfTUlESU9VVChkZXYsIDB4ZjcpOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgwMzoJLyogU29uZyBTZWxlY3QuICovCisJCSAgICBTRVFfTUlESU9VVChkZXYsIGV2dCk7CQorCQkgICAgU0VRX01JRElPVVQoZGV2LCBkMSk7CSAgCQkJCQkJCQkJCisJCWNhc2UgMHgwMjoJLyogU29uZyBQb3NpdGlvbiBQb2ludGVyLiAqLworCQkgICAgU0VRX01JRElPVVQoZGV2LCBldnQpOwkKKwkJICAgIFNFUV9NSURJT1VUKGRldiwgZDEpOworCQkgICAgU0VRX01JRElPVVQoZGV2LCBkMik7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KIAl9Ci0JZXZlbnQgPSBMT1dPUkQoZHdQYXJhbSk7Ci0JaWYgKHdyaXRlIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiwgCi0JCSZldmVudCwgc2l6ZW9mKFdPUkQpKSAhPSBzaXplb2YoV09SRCkpIHsKLQkJV0FSTihtaWRpLCAiZXJyb3Igd3JpdHRpbmcgdW5peGRldiAhXG4iKTsKLQl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlXQVJOKG1pZGksICJUZWNobm9sb2d5IG5vdCBzdXBwb3J0ZWQgKHlldCkgJWQgIVxuIiwgCisJICAgICBtaWRpT3V0RGV2aWNlc1t3RGV2SURdLT53VGVjaG5vbG9neSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CisgICAgfQorICAgIAorICAgIFNFUV9EVU1QQlVGKCk7CisgICAgVFJBQ0UobWlkaSwgImRvbmVcbiIpOworI2Vsc2UKKyAgICBpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCVdBUk4obWlkaSwiY2FuJ3QgcGxheSAhXG4iKTsKKwlyZXR1cm4gTUlESUVSUl9OT0RFVklDRTsKKyAgICB9CisgICAgeworCVdPUkQJZXZlbnQgPSBMT1dPUkQoZHdQYXJhbSk7CisJaWYgKHdyaXRlIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiwgCisJCSAgICZldmVudCwgc2l6ZW9mKGV2ZW50KSkgIT0gc2l6ZW9mKFdPUkQpKSB7CisJICAgIFdBUk4obWlkaSwgImVycm9yIHdyaXR0aW5nIHVuaXhkZXYgIVxuIik7CisJfQorICAgIH0KKyNlbmRpZiAvKiBIQVZFX09TUyAqLworICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwNTUsNTEgKzE5NDMsOTYgQEAKICAqLwogc3RhdGljIERXT1JEIG1vZExvbmdEYXRhKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JaW50CQljb3VudDsKLQlMUFdPUkQJcHRyOwotCWludCAgICAgZW47Ci0KLQlUUkFDRShtaWRpLCAiKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKLQlpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotICAgICAgICBXQVJOKG1pZGksImNhbid0IHBsYXkgIVxuIik7Ci0JCXJldHVybiBNSURJRVJSX05PREVWSUNFOwotCQl9Ci0JaWYgKGxwTWlkaUhkci0+bHBEYXRhID09IE5VTEwpIHJldHVybiBNSURJRVJSX1VOUFJFUEFSRUQ7Ci0JaWYgKCEobHBNaWRpSGRyLT5kd0ZsYWdzICYgTUhEUl9QUkVQQVJFRCkpIHJldHVybiBNSURJRVJSX1VOUFJFUEFSRUQ7Ci0JaWYgKGxwTWlkaUhkci0+ZHdGbGFncyAmIE1IRFJfSU5RVUVVRSkgcmV0dXJuIE1JRElFUlJfU1RJTExQTEFZSU5HOwotCWxwTWlkaUhkci0+ZHdGbGFncyAmPSB+TUhEUl9ET05FOwotCWxwTWlkaUhkci0+ZHdGbGFncyB8PSBNSERSX0lOUVVFVUU7Ci0JVFJBQ0UobWlkaSwgImR3Qnl0ZXNSZWNvcmRlZCAlbHUgIVxuIiwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwotCVRSQUNFKG1pZGksICIgICAgICAgICAgICAgICAgICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCi0JCSAgICAgbHBNaWRpSGRyLT5scERhdGFbMF0sIGxwTWlkaUhkci0+bHBEYXRhWzFdLAotCQkgICAgIGxwTWlkaUhkci0+bHBEYXRhWzJdLCBscE1pZGlIZHItPmxwRGF0YVszXSk7Ci0vKgotCWNvdW50ID0gd3JpdGUgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2LCAKLQkJbHBNaWRpSGRyLT5scERhdGEsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKLSovCi0JcHRyID0gKExQV09SRClscE1pZGlIZHItPmxwRGF0YTsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZDsgY291bnQrKykgewotCQlpZiAod3JpdGUgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2LCBwdHIsIAotCQkJc2l6ZW9mKFdPUkQpKSAhPSBzaXplb2YoV09SRCkpIGJyZWFrOwotCQlwdHIrKzsKKyAgICBpbnQJCWNvdW50OworICAgIAorICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworICAgIAorI2lmZGVmIEhBVkVfT1NTCisgICAgaWYgKG1pZGlTZXFGRCA9PSAtMSkgeworCVdBUk4obWlkaSwiY2FuJ3QgcGxheSAhXG4iKTsKKwlyZXR1cm4gTUlESUVSUl9OT0RFVklDRTsKKyAgICB9CisjZWxzZSAvKiBIQVZFX09TUyAqLworICAgIGlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJV0FSTihtaWRpLCJjYW4ndCBwbGF5ICFcbiIpOworCXJldHVybiBNSURJRVJSX05PREVWSUNFOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX09TUyAqLworICAgIAorICAgIGlmIChscE1pZGlIZHItPmxwRGF0YSA9PSBOVUxMKSAKKwlyZXR1cm4gTUlESUVSUl9VTlBSRVBBUkVEOworICAgIGlmICghKGxwTWlkaUhkci0+ZHdGbGFncyAmIE1IRFJfUFJFUEFSRUQpKSAKKwlyZXR1cm4gTUlESUVSUl9VTlBSRVBBUkVEOworICAgIGlmIChscE1pZGlIZHItPmR3RmxhZ3MgJiBNSERSX0lOUVVFVUUpIAorCXJldHVybiBNSURJRVJSX1NUSUxMUExBWUlORzsKKyAgICBscE1pZGlIZHItPmR3RmxhZ3MgJj0gfk1IRFJfRE9ORTsKKyAgICBscE1pZGlIZHItPmR3RmxhZ3MgfD0gTUhEUl9JTlFVRVVFOworICAgIFRSQUNFKG1pZGksICJkd0J5dGVzUmVjb3JkZWQgJWx1ICFcbiIsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKKyAgICBUUkFDRShtaWRpLCAiICAgICAgICAgICAgICAgICAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCSAgKChMUEJZVEUpKGxwTWlkaUhkci0+cmVzZXJ2ZWQpKVswXSwKKwkgICgoTFBCWVRFKShscE1pZGlIZHItPnJlc2VydmVkKSlbMV0sCisJICAoKExQQllURSkobHBNaWRpSGRyLT5yZXNlcnZlZCkpWzJdLAorCSAgKChMUEJZVEUpKGxwTWlkaUhkci0+cmVzZXJ2ZWQpKVszXSk7CisjaWZkZWYgSEFWRV9PU1MKKyAgICBzd2l0Y2ggKG1pZGlPdXREZXZpY2VzW3dEZXZJRF0tPndUZWNobm9sb2d5KSB7CisgICAgY2FzZSBNT0RfRk1TWU5USDoKKwkvKiBGSVhNRTogSSBkb24ndCB0aGluayB0aGVyZSBpcyBtdWNoIHRvIGRvIGhlcmUgKi8KKwlicmVhazsKKyAgICBjYXNlIE1PRF9NSURJUE9SVDoKKwlpZiAoKChMUEJZVEUpbHBNaWRpSGRyLT5yZXNlcnZlZClbMF0gIT0gMHhGMCkgeworCSAgICAvKiBTZW5kIGVuZCBvZiBTeXN0ZW0gRXhjbHVzaXZlICovCisJICAgIFNFUV9NSURJT1VUKHdEZXZJRCAtIE1PRE1fTlVNRk1TWU5USERFVlMsIDB4RjApOworCSAgICBUUkFDRShtaWRpLCAiQWRkaW5nIG1pc3NpbmcgMHhGMCBtYXJrZXIgYXQgdGhlIGJlZ2luaW5nIG9mICIKKwkJICAic3lzdGVtIGV4Y2x1c2l2ZSBieXRlIHN0cmVhbVxuIik7CiAJfQotCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQ7IGNvdW50KyspIHsKKwkgICAgU0VRX01JRElPVVQod0RldklEIC0gTU9ETV9OVU1GTVNZTlRIREVWUywgCisJCQkoKExQQllURSlscE1pZGlIZHItPnJlc2VydmVkKVtjb3VudF0pOwkKKwl9CisJaWYgKCgoTFBCWVRFKWxwTWlkaUhkci0+cmVzZXJ2ZWQpW2NvdW50IC0gMV0gIT0gMHhGNykgeworCSAgICAvKiBTZW5kIGVuZCBvZiBTeXN0ZW0gRXhjbHVzaXZlICovCisJICAgIFNFUV9NSURJT1VUKHdEZXZJRCAtIE1PRE1fTlVNRk1TWU5USERFVlMsIDB4RjcpOworCSAgICBUUkFDRShtaWRpLCAiQWRkaW5nIG1pc3NpbmcgMHhGNyBtYXJrZXIgYXQgdGhlIGVuZCBvZiAiCisJCSAgInN5c3RlbSBleGNsdXNpdmUgYnl0ZSBzdHJlYW1cbiIpOworCX0KKwlTRVFfRFVNUEJVRigpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJV0FSTihtaWRpLCAiVGVjaG5vbG9neSBub3Qgc3VwcG9ydGVkICh5ZXQpICVkICFcbiIsIAorCSAgICAgbWlkaU91dERldmljZXNbd0RldklEXS0+d1RlY2hub2xvZ3kpOworCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworICAgIH0KKyNlbHNlIC8qIEhBVkVfT1NTICovCisgICAgeworCUxQV09SRAlwdHIgPSAoTFBXT1JEKWxwTWlkaUhkci0+cmVzZXJ2ZWQ7CisJaW50CQllbjsKKwkKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZDsgY291bnQrKykgeworCSAgICBpZiAod3JpdGUoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIAorCQkgICAgICBwdHIsIHNpemVvZihXT1JEKSkgIT0gc2l6ZW9mKFdPUkQpKSAKKwkJYnJlYWs7CisJICAgIHB0cisrOworCX0KKwkKIAllbiA9IGVycm5vOwogCVRSQUNFKG1pZGksICJhZnRlciB3cml0ZSBjb3VudCA9ICVkXG4iLGNvdW50KTsKIAlpZiAoY291bnQgIT0gbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpIHsKLQkJV0FSTihtaWRpLCAiZXJyb3Igd3JpdHRpbmcgdW5peGRldiAjJWQgISAoJWQgIT0gJWxkKVxuIiwKLQkJCSAgICAgTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIGNvdW50LCAKLQkJCSAgICAgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwotCQlUUkFDRShtaWRpLCAiXHRlcnJubyA9ICVkIGVycm9yID0gJXNcbiIsZW4sc3RyZXJyb3IoZW4pKTsKLQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CisJICAgIFdBUk4obWlkaSwgImVycm9yIHdyaXR0aW5nIHVuaXhkZXYgIyVkICEgKCVkICE9ICVsZClcbiIsCisJCSBNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiwgY291bnQsIAorCQkgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOworCSAgICBUUkFDRShtaWRpLCAiXHRlcnJubyA9ICVkIGVycm9yID0gJXNcbiIsZW4sc3RyZXJyb3IoZW4pKTsKKwkgICAgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQotCWxwTWlkaUhkci0+ZHdGbGFncyAmPSB+TUhEUl9JTlFVRVVFOwotCWxwTWlkaUhkci0+ZHdGbGFncyB8PSBNSERSX0RPTkU7Ci0JaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTU9NX0RPTkUsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQlXQVJOKG1pZGksImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7Ci0JCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwotCX0KLQlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9PU1MgKi8KKyAgICAKKyAgICBscE1pZGlIZHItPmR3RmxhZ3MgJj0gfk1IRFJfSU5RVUVVRTsKKyAgICBscE1pZGlIZHItPmR3RmxhZ3MgfD0gTUhEUl9ET05FOworICAgIGlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1PTV9ET05FLCAoRFdPUkQpbHBNaWRpSGRyLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgeworCVdBUk4obWlkaSwiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKyAgICB9CisgICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTEwNywyMSArMjA0MCwyOCBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewotCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwotCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCVdBUk4obWlkaSwiY2FuJ3QgcHJlcGFyZSAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7Ci0JfQotCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7Ci0JCVRSQUNFKG1pZGksImFscmVhZHkgcHJlcGFyZSAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7Ci0JfQotCU1pZGlPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkID0gMDsKLQlNaWRpT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IFBUUl9TRUdfVE9fTElOKGxwTWlkaUhkcik7Ci0JaWYgKGxwTWlkaUhkci0+ZHdGbGFncyAmIE1IRFJfSU5RVUVVRSkgcmV0dXJuIE1JRElFUlJfU1RJTExQTEFZSU5HOwotCWxwTWlkaUhkci0+ZHdGbGFncyB8PSBNSERSX1BSRVBBUkVEOwotCWxwTWlkaUhkci0+ZHdGbGFncyAmPSB+TUhEUl9ET05FOwotCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOworICAgIFRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworICAgIAorI2lmZGVmIEhBVkVfT1NTCisgICAgaWYgKG1pZGlTZXFGRCA9PSAtMSkgeworCVdBUk4obWlkaSwiY2FuJ3QgcHJlcGFyZSAhXG4iKTsKKwlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKyAgICB9CisjZWxzZSAvKiBIQVZFX09TUyAqLworICAgIGlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJV0FSTihtaWRpLCJjYW4ndCBwcmVwYXJlICFcbiIpOworCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX09TUyAqLworICAgIGlmIChkd1NpemUgIT0gc2l6ZW9mKE1JRElIRFIpIHx8IGxwTWlkaUhkciA9PSAwIHx8IAorCWxwTWlkaUhkci0+bHBEYXRhID09IDAgfHwgbHBNaWRpSGRyLT5kd0ZsYWdzICE9IDAgfHwgCisJbHBNaWRpSGRyLT5kd0J1ZmZlckxlbmd0aCA+PSAweDEwMDAwdWwpCisJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisgICAgCisgICAgbHBNaWRpSGRyLT5scE5leHQgPSAwOworICAgIGxwTWlkaUhkci0+ZHdGbGFncyB8PSBNSERSX1BSRVBBUkVEOworICAgIGxwTWlkaUhkci0+ZHdGbGFncyAmPSB+TUhEUl9ET05FOworICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExMjksMTIgKzIwNjksMjQgQEAKICAqLwogc3RhdGljIERXT1JEIG1vZFVucHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewotCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwotCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCVdBUk4obWlkaSwiY2FuJ3QgdW5wcmVwYXJlICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLQl9Ci0JcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CisgICAgVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisjaWZkZWYgSEFWRV9PU1MKKyAgICBpZiAobWlkaVNlcUZEID09IC0xKSB7CisJV0FSTihtaWRpLCJjYW4ndCB1bnByZXBhcmUgIVxuIik7CisJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CisgICAgfQorI2Vsc2UgLyogSEFWRV9PU1MgKi8KKyAgICBpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCVdBUk4obWlkaSwiY2FuJ3QgdW5wcmVwYXJlICFcbiIpOworCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX09TUyAqLworICAgIGlmIChkd1NpemUgIT0gc2l6ZW9mKE1JRElIRFIpIHx8IGxwTWlkaUhkciA9PSAwKQorCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgIGlmIChscE1pZGlIZHItPmR3RmxhZ3MgJiBNSERSX0lOUVVFVUUpCisJcmV0dXJuIE1JRElFUlJfU1RJTExQTEFZSU5HOworICAgIGxwTWlkaUhkci0+ZHdGbGFncyAmPSB+TUhEUl9QUkVQQVJFRDsKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTQyLDEwMiArMjA5NCwxMDYgQEAKICAqLwogc3RhdGljIERXT1JEIG1vZFJlc2V0KFdPUkQgd0RldklEKQogewotCVRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOwotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworICAgIFRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOworICAgIC8qIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCA6CisgICAgICoJdHVybiBvZmYgZXZlcnkgbm90ZSwgcmVtb3ZlIHN1c3RhaW4gb24gYWxsIGNoYW5uZWxzCisgICAgICoJcmVtb3ZlIGFueSBwZW5kaW5nIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltb2RNZXNzYWdlCQkJW3NhbXBsZSBkcml2ZXJdCiAgKi8KIERXT1JEIFdJTkFQSSBtb2RNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCi0JCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKKwkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlUUkFDRShtaWRpLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCi0JCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQlzd2l0Y2god01zZykgewotCWNhc2UgTU9ETV9PUEVOOgotCQlyZXR1cm4gbW9kT3Blbih3RGV2SUQsIChMUE1JRElPUEVOREVTQylkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWNhc2UgTU9ETV9DTE9TRToKLQkJcmV0dXJuIG1vZENsb3NlKHdEZXZJRCk7Ci0JY2FzZSBNT0RNX0RBVEE6Ci0JCXJldHVybiBtb2REYXRhKHdEZXZJRCwgZHdQYXJhbTEpOwotCWNhc2UgTU9ETV9MT05HREFUQToKLQkJcmV0dXJuIG1vZExvbmdEYXRhKHdEZXZJRCwgKExQTUlESUhEUilkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWNhc2UgTU9ETV9QUkVQQVJFOgotCQlyZXR1cm4gbW9kUHJlcGFyZSh3RGV2SUQsIChMUE1JRElIRFIpZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQljYXNlIE1PRE1fVU5QUkVQQVJFOgotCQlyZXR1cm4gbW9kVW5wcmVwYXJlKHdEZXZJRCwgKExQTUlESUhEUilkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWNhc2UgTU9ETV9HRVRERVZDQVBTOgotCQlyZXR1cm4gbW9kR2V0RGV2Q2Fwcyh3RGV2SUQsKExQTUlESU9VVENBUFMxNilkd1BhcmFtMSxkd1BhcmFtMik7Ci0JY2FzZSBNT0RNX0dFVE5VTURFVlM6Ci0JCXJldHVybiBNT0RNX05VTURFVlM7Ci0JY2FzZSBNT0RNX0dFVFZPTFVNRToKLQkJcmV0dXJuIDA7Ci0JY2FzZSBNT0RNX1NFVFZPTFVNRToKLQkJcmV0dXJuIDA7Ci0JY2FzZSBNT0RNX1JFU0VUOgotCQlyZXR1cm4gbW9kUmVzZXQod0RldklEKTsKLQl9Ci0JcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKyAgICBUUkFDRShtaWRpLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJICB3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBzd2l0Y2god01zZykgeworICAgIGNhc2UgTU9ETV9PUEVOOgorCXJldHVybiBtb2RPcGVuKHdEZXZJRCwgKExQTUlESU9QRU5ERVNDKWR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgY2FzZSBNT0RNX0NMT1NFOgorCXJldHVybiBtb2RDbG9zZSh3RGV2SUQpOworICAgIGNhc2UgTU9ETV9EQVRBOgorCXJldHVybiBtb2REYXRhKHdEZXZJRCwgZHdQYXJhbTEpOworICAgIGNhc2UgTU9ETV9MT05HREFUQToKKwlyZXR1cm4gbW9kTG9uZ0RhdGEod0RldklELCAoTFBNSURJSERSKWR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgY2FzZSBNT0RNX1BSRVBBUkU6CisJcmV0dXJuIG1vZFByZXBhcmUod0RldklELCAoTFBNSURJSERSKWR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgY2FzZSBNT0RNX1VOUFJFUEFSRToKKwlyZXR1cm4gbW9kVW5wcmVwYXJlKHdEZXZJRCwgKExQTUlESUhEUilkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgIGNhc2UgTU9ETV9HRVRERVZDQVBTOgorCXJldHVybiBtb2RHZXREZXZDYXBzKHdEZXZJRCwoTFBNSURJT1VUQ0FQUzE2KWR3UGFyYW0xLGR3UGFyYW0yKTsKKyAgICBjYXNlIE1PRE1fR0VUTlVNREVWUzoKKwlyZXR1cm4gTU9ETV9OVU1ERVZTOworICAgIGNhc2UgTU9ETV9HRVRWT0xVTUU6CisJcmV0dXJuIDA7CisgICAgY2FzZSBNT0RNX1NFVFZPTFVNRToKKwlyZXR1cm4gMDsKKyAgICBjYXNlIE1PRE1fUkVTRVQ6CisJcmV0dXJuIG1vZFJlc2V0KHdEZXZJRCk7CisgICAgZGVmYXVsdDoKKwlUUkFDRShtaWRpLCAiVW5zdXBwb3J0ZWQgbWVzc2FnZVxuIik7CisgICAgfQorICAgIHJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTUlESV9Ecml2ZXJQcm9jCQlbc2FtcGxlIGRyaXZlcl0KICAqLwogTE9ORyBNSURJX0RyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKIAkJICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0Jc3dpdGNoKHdNc2cpIHsKLQljYXNlIERSVl9MT0FEOgotCQlyZXR1cm4gMTsKLQljYXNlIERSVl9GUkVFOgotCQlyZXR1cm4gMTsKLQljYXNlIERSVl9PUEVOOgotCQlyZXR1cm4gMTsKLQljYXNlIERSVl9DTE9TRToKLQkJcmV0dXJuIDE7Ci0JY2FzZSBEUlZfRU5BQkxFOgotCQlyZXR1cm4gMTsKLQljYXNlIERSVl9ESVNBQkxFOgotCQlyZXR1cm4gMTsKLQljYXNlIERSVl9RVUVSWUNPTkZJR1VSRToKLQkJcmV0dXJuIDE7Ci0JY2FzZSBEUlZfQ09ORklHVVJFOgotCQlNZXNzYWdlQm94MTYoMCwgIlNhbXBsZSBNaWRpIExpbnV4IERyaXZlciAhIiwgCi0JCQkgICAgICJNTUxpbnV4IERyaXZlciIsIE1CX09LKTsKLQkJcmV0dXJuIDE7Ci0JY2FzZSBEUlZfSU5TVEFMTDoKLQkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwotCWNhc2UgRFJWX1JFTU9WRToKLQkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwotCWNhc2UgTUNJX09QRU5fRFJJVkVSOgotCWNhc2UgTUNJX09QRU46Ci0JCXJldHVybiBNSURJX21jaU9wZW4oZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9PUEVOX1BBUk1TMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKLQljYXNlIE1DSV9DTE9TRV9EUklWRVI6Ci0JY2FzZSBNQ0lfQ0xPU0U6Ci0JCXJldHVybiBNSURJX21jaUNsb3NlKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwotCWNhc2UgTUNJX1BMQVk6Ci0JCXJldHVybiBNSURJX21jaVBsYXkoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9QTEFZX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7Ci0JY2FzZSBNQ0lfUkVDT1JEOgotCQlyZXR1cm4gTUlESV9tY2lSZWNvcmQoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9SRUNPUkRfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKLQljYXNlIE1DSV9TVE9QOgotCQlyZXR1cm4gTUlESV9tY2lTdG9wKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwotCWNhc2UgTUNJX1NFVDoKLQkJcmV0dXJuIE1JRElfbWNpU2V0KGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU0VUX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7Ci0JY2FzZSBNQ0lfUEFVU0U6Ci0JCXJldHVybiBNSURJX21jaVBhdXNlKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwotCWNhc2UgTUNJX1JFU1VNRToKLQkJcmV0dXJuIE1JRElfbWNpUmVzdW1lKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwotCWNhc2UgTUNJX1NUQVRVUzoKLQkJcmV0dXJuIE1JRElfbWNpU3RhdHVzKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU1RBVFVTX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7Ci0JY2FzZSBNQ0lfR0VUREVWQ0FQUzoKLQkJcmV0dXJuIE1JRElfbWNpR2V0RGV2Q2Fwcyhkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFVERFVkNBUFNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKLQljYXNlIE1DSV9JTkZPOgotCQlyZXR1cm4gTUlESV9tY2lJbmZvKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfSU5GT19QQVJNUzE2KVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIERlZkRyaXZlclByb2MoZHdEZXZJRCwgaERyaXYsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0JfQorICAgIHN3aXRjaCh3TXNnKSB7CisgICAgY2FzZSBEUlZfTE9BRDoKKwlyZXR1cm4gMTsKKyAgICBjYXNlIERSVl9GUkVFOgorCXJldHVybiAxOworICAgIGNhc2UgRFJWX09QRU46CisJcmV0dXJuIDE7CisgICAgY2FzZSBEUlZfQ0xPU0U6CisJcmV0dXJuIDE7CisgICAgY2FzZSBEUlZfRU5BQkxFOgorCXJldHVybiAxOworICAgIGNhc2UgRFJWX0RJU0FCTEU6CisJcmV0dXJuIDE7CisgICAgY2FzZSBEUlZfUVVFUllDT05GSUdVUkU6CisJcmV0dXJuIDE7CisgICAgY2FzZSBEUlZfQ09ORklHVVJFOgorCU1lc3NhZ2VCb3gxNigwLCAiU2FtcGxlIE1pZGkgTGludXggRHJpdmVyICEiLCAKKwkJICAgICAiTU1MaW51eCBEcml2ZXIiLCBNQl9PSyk7CisJcmV0dXJuIDE7CisgICAgY2FzZSBEUlZfSU5TVEFMTDoKKwlyZXR1cm4gRFJWQ05GX1JFU1RBUlQ7CisgICAgY2FzZSBEUlZfUkVNT1ZFOgorCXJldHVybiBEUlZDTkZfUkVTVEFSVDsKKyAgICBjYXNlIE1DSV9PUEVOX0RSSVZFUjoKKyAgICBjYXNlIE1DSV9PUEVOOgorCXJldHVybiBNSURJX21jaU9wZW4oZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9PUEVOX1BBUk1TMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKKyAgICBjYXNlIE1DSV9DTE9TRV9EUklWRVI6CisgICAgY2FzZSBNQ0lfQ0xPU0U6CisJcmV0dXJuIE1JRElfbWNpQ2xvc2UoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CisgICAgY2FzZSBNQ0lfUExBWToKKwlyZXR1cm4gTUlESV9tY2lQbGF5KGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUExBWV9QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworICAgIGNhc2UgTUNJX1JFQ09SRDoKKwlyZXR1cm4gTUlESV9tY2lSZWNvcmQoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9SRUNPUkRfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKKyAgICBjYXNlIE1DSV9TVE9QOgorCXJldHVybiBNSURJX21jaVN0b3AoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CisgICAgY2FzZSBNQ0lfU0VUOgorCXJldHVybiBNSURJX21jaVNldChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NFVF9QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworICAgIGNhc2UgTUNJX1BBVVNFOgorCXJldHVybiBNSURJX21jaVBhdXNlKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworICAgIGNhc2UgTUNJX1JFU1VNRToKKwlyZXR1cm4gTUlESV9tY2lSZXN1bWUoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CisgICAgY2FzZSBNQ0lfU1RBVFVTOgorCXJldHVybiBNSURJX21jaVN0YXR1cyhkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NUQVRVU19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworICAgIGNhc2UgTUNJX0dFVERFVkNBUFM6CisJcmV0dXJuIE1JRElfbWNpR2V0RGV2Q2Fwcyhkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFVERFVkNBUFNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKKyAgICBjYXNlIE1DSV9JTkZPOgorCXJldHVybiBNSURJX21jaUluZm8oZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9JTkZPX1BBUk1TMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKKyAgICBkZWZhdWx0OgorCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgIH0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpcGF0Y2guYyBiL211bHRpbWVkaWEvbWlkaXBhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlNWQyNwotLS0gL2Rldi9udWxsCisrKyBiL211bHRpbWVkaWEvbWlkaXBhdGNoLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIC0qLSB0YWItd2lkdGg6IDg7IGMtYmFzaWMtb2Zmc2V0OiA0IC0qLSAqLworCisvKgorICogRk0gcGF0Y2hlcyBmb3Igd2luZSBNSURJIGRyaXZlcgorICoKKyAqLworCisvKiAKKyAqIEVyaWMgUE9VRUNIIDogTUlESSBGTSBwYXRjaGVzIGZvciBHTSBpbnN0cnVtZW50cworICovCisKKyNkZWZpbmUJTk9UX0RFRklORUQJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisKK3Vuc2lnbmVkIGNoYXIgbWlkaUZNSW5zdHJ1bWVudFBhdGNoZXNbMTI4ICogMTZdID0geworLyogICAwIEFjb3VzdGljIEdyYW5kIFBpYW5vICAgICAgICAgICAgICovIDB4MjEsIDB4MTEsIDB4NGMsIDB4MDAsIDB4ZjEsIDB4ZjIsIDB4NjMsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICAxIEJyaWdodCBBY291c3RpYyBQaWFubyAgICAgICAgICAgICovIDB4MDEsIDB4MTEsIDB4NGYsIDB4MDAsIDB4ZjEsIDB4ZDIsIDB4NTMsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICAyIEVsZWN0cmljIEdyYW5kIFBpYW5vICAgICAgICAgICAgICovIDB4MDEsIDB4MDEsIDB4NGYsIDB4MDQsIDB4ZjEsIDB4ZDIsIDB4NTAsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICAzIEhvbmt5LVRvbmsgUGlhbm8gICAgICAgICAgICAgICAgICovIDB4ODEsIDB4MTMsIDB4OWQsIDB4MDAsIDB4ZjIsIDB4ZjIsIDB4NTEsIDB4ZjEsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICA0IFJob2RlcyBQaWFubyAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MDEsIDB4NGYsIDB4MDQsIDB4ZjEsIDB4ZDIsIDB4NTAsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICA1IENob3J1c2VkIFBpYW5vICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MTEsIDB4NGQsIDB4MDAsIDB4ZjEsIDB4ZDIsIDB4NjAsIDB4N2IsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICA2IEhhcnBzaWNob3JkICAgICAgICAgICAgICAgICAgICAgICovIDB4MzIsIDB4MTYsIDB4ODcsIDB4ODAsIDB4YTEsIDB4N2QsIDB4MTAsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICA3IENsYXZpbmV0ICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MTMsIDB4MDgsIDB4ODAsIDB4MDAsIDB4ZmIsIDB4ZTgsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICA4IENlbGVzdGEgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MTQsIDB4MDQsIDB4MDcsIDB4MDAsIDB4OTMsIDB4YjYsIDB4NzMsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICA5IEdsb2NrZW5zcGllbCAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MTIsIDB4NGYsIDB4MDAsIDB4ZjIsIDB4ZjIsIDB4NjAsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDEwIE11c2ljIEJveCAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDExIFZpYnJhcGhvbmUgICAgICAgICAgICAgICAgICAgICAgICovIDB4NDQsIDB4NjAsIDB4NTMsIDB4ODAsIDB4ZjUsIDB4ZmQsIDB4MzMsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDEyIE1hcmltYmEgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDUsIDB4MDEsIDB4NGUsIDB4MDAsIDB4ZGEsIDB4ZjksIDB4MjUsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDEzIFh5bG9waG9uZSAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MTEsIDB4MzEsIDB4MmQsIDB4MDAsIDB4YzgsIDB4ZjUsIDB4MmYsIDB4ZjUsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDE0IFR1YnVsYXIgQmVsbHMgICAgICAgICAgICAgICAgICAgICovIDB4MDMsIDB4MTcsIDB4NGYsIDB4MDMsIDB4ZjEsIDB4ZjIsIDB4NTMsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDE1IER1bGNpbWVyICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDE2IEhhbW1vbmQgT3JnYW4gICAgICAgICAgICAgICAgICAgICovIDB4NzIsIDB4NzEsIDB4Y2QsIDB4ODAsIDB4OTEsIDB4OTEsIDB4MmEsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDE3IFBlcmN1c3NpdmUgT3JnYW4gICAgICAgICAgICAgICAgICovIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4ZDYsIDB4YjUsIDB4NGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDE4IFJvY2sgT3JnYW4gICAgICAgICAgICAgICAgICAgICAgICovIDB4NzIsIDB4NzAsIDB4Y2UsIDB4ODAsIDB4OWYsIDB4OTQsIDB4MTIsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDE5IENodXJjaCBPcmdhbiAgICAgICAgICAgICAgICAgICAgICovIDB4YTUsIDB4YjEsIDB4ZDIsIDB4ODAsIDB4ODEsIDB4ZjEsIDB4MDMsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDIwIFJlZWQgT3JnYW4gICAgICAgICAgICAgICAgICAgICAgICovIDB4M2UsIDB4YjEsIDB4MjksIDB4ODAsIDB4ZmIsIDB4YTAsIDB4ZjAsIDB4OWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDIxIEFjY29yZGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MjQsIDB4MzEsIDB4NGYsIDB4MDAsIDB4ZjIsIDB4NTIsIDB4MGIsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDIyIEhhcm1vbmljYSAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MjIsIDB4ZjIsIDB4OGYsIDB4NDAsIDB4NDEsIDB4NjEsIDB4MDMsIDB4MDUsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDIzIFRhbmdvIEFjY29yZGlvbiAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDI0IEFjb3VzdGljIE55bG9uIEd1aXRhciAgICAgICAgICAgICovIDB4MDEsIDB4MDEsIDB4MTEsIDB4MDAsIDB4ZjIsIDB4ZjUsIDB4MWYsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDI1IEFjb3VzdGljIFN0ZWVsIEd1aXRhciAgICAgICAgICAgICovIDB4MDEsIDB4YTEsIDB4NDYsIDB4MDMsIDB4ZjEsIDB4MzEsIDB4ODMsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDI2IEVsZWN0cmljIEphenogR3VpdGFyICAgICAgICAgICAgICovIDB4MDMsIDB4MTEsIDB4NWUsIDB4MDAsIDB4ODUsIDB4ZDIsIDB4NTEsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDI3IEVsZWN0cmljIENsZWFuIEd1aXRhciAgICAgICAgICAgICovIDB4MzIsIDB4MTYsIDB4ODcsIDB4ODAsIDB4YTEsIDB4N2QsIDB4MTAsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDI4IEVsZWN0cmljIE11dGVkIEd1aXRhciAgICAgICAgICAgICovIDB4MTMsIDB4MTEsIDB4OTYsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MjEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDI5IE92ZXJkcml2ZW4gR3VpdGFyICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MTQsIDB4OGYsIDB4ODAsIDB4ODIsIDB4ODIsIDB4N2QsIDB4N2QsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDMwIERpc3RvcnRpb24gR3VpdGFyICAgICAgICAgICAgICAgICovIDB4MDUsIDB4MDEsIDB4OGYsIDB4ODAsIDB4ZGEsIDB4ZjksIDB4MTUsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDMxIEd1aXRhciBIYXJtb25pY3MgICAgICAgICAgICAgICAgICovIDB4YzMsIDB4MDEsIDB4MDUsIDB4MGQsIDB4OTEsIDB4ZjEsIDB4MWYsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDMyIEFjb3VzdGljIEJhc3MgICAgICAgICAgICAgICAgICAgICovIDB4MjEsIDB4MDEsIDB4MmEsIDB4MDAsIDB4ZjIsIDB4ZjUsIDB4MWYsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDMzIEVsZWN0cmljIEJhc3MgRmluZ2VyZWQgICAgICAgICAgICovIDB4MDEsIDB4MjEsIDB4MTUsIDB4ODAsIDB4MjUsIDB4NjUsIDB4MmYsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDM0IEVsZWN0cmljIEJhc3MgUGlja2VkICAgICAgICAgICAgICovIDB4MDEsIDB4MDEsIDB4MWQsIDB4MDAsIDB4ZjIsIDB4ZjUsIDB4ZWYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDM1IEZyZXRsZXNzIEJhc3MgICAgICAgICAgICAgICAgICAgICovIDB4MzAsIDB4MjEsIDB4MWUsIDB4MDAsIDB4ZjIsIDB4ZjUsIDB4ZWYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDM2IFNsYXAgQmFzcyAxICAgICAgICAgICAgICAgICAgICAgICovIDB4MjAsIDB4MjEsIDB4NDAsIDB4MDAsIDB4N2IsIDB4NzUsIDB4MDQsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDM3IFNsYXAgQmFzcyAyICAgICAgICAgICAgICAgICAgICAgICovIDB4MjAsIDB4MjEsIDB4NDAsIDB4MDAsIDB4N2IsIDB4ZjUsIDB4MDQsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDM4IFN5bnRoIEJhc3MgMSAgICAgICAgICAgICAgICAgICAgICovIDB4NDEsIDB4OTEsIDB4ODMsIDB4MDAsIDB4NjUsIDB4MzIsIDB4MDUsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDM5IFN5bnRoIEJhc3MgMiAgICAgICAgICAgICAgICAgICAgICovIDB4MzAsIDB4YjEsIDB4ODgsIDB4ODAsIDB4ZDUsIDB4NjEsIDB4MTksIDB4MWIsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQwIFZpb2xpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4NzIsIDB4NjIsIDB4MWMsIDB4MDUsIDB4NTEsIDB4NTIsIDB4MDMsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQxIFZpb2xhICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4NzAsIDB4NzEsIDB4ZDAsIDB4ODAsIDB4NTIsIDB4MzEsIDB4MTEsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQyIENlbGxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4NzAsIDB4NzEsIDB4YzUsIDB4ODAsIDB4NTIsIDB4MzEsIDB4MTEsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQzIENvbnRyYWJhc3MgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4ODMsIDB4YjYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQ0IFRyZW1vbG8gU3RyaW5ncyAgICAgICAgICAgICAgICAgICovIDB4NzEsIDB4YTEsIDB4OGIsIDB4NDAsIDB4NzEsIDB4NDIsIDB4MTEsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQ1IFBpenppY2F0byBTdHJpbmdzICAgICAgICAgICAgICAgICovIDB4ZjIsIDB4ZTEsIDB4NDAsIDB4ODAsIDB4ZjUsIDB4ZmQsIDB4YTgsIDB4YWQsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQ2IE9yY2hlc3RyYWwgSGFycCAgICAgICAgICAgICAgICAgICovIDB4MjEsIDB4MTEsIDB4MTEsIDB4MDAsIDB4YTMsIDB4YzQsIDB4NDMsIDB4MjIsIDB4MDIsIDB4MDAsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQ3IFRpbXBhbmkgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQ4IFN0cmluZyBFbnNlbWJsZSAxICAgICAgICAgICAgICAgICovIDB4ZTEsIDB4MjEsIDB4NGYsIDB4MDAsIDB4YzEsIDB4MzIsIDB4ZDMsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDQ5IFN0cmluZyBFbnNlbWJsZSAyICAgICAgICAgICAgICAgICovIDB4ZTEsIDB4MjEsIDB4NGYsIDB4MDAsIDB4YjEsIDB4MTIsIDB4ZDMsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDUwIFN5bnRoIFN0cmluZ3MgMSAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDUxIFN5bnRoIFN0cmluZ3MgMiAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDUyIENob2lyIEFhaHMgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDUzIFZvaWNlIG9vaHMgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDU0IFN5bnRoIFZvaWNlICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDU1IE9yY2hlc3RyYSBIaXQgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDU2IFRydW1wZXQgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MzEsIDB4YTEsIDB4MWMsIDB4ODAsIDB4NDEsIDB4OTIsIDB4MGIsIDB4M2IsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDU3IFRyb21ib25lICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MjEsIDB4YTEsIDB4MTgsIDB4ODAsIDB4NTMsIDB4NTIsIDB4MWQsIDB4M2IsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDU4IFR1YmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MjEsIDB4MjEsIDB4MTksIDB4ODAsIDB4NDMsIDB4ODUsIDB4OGMsIDB4MmYsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDU5IE11dGVkIFRydW1wZXQgICAgICAgICAgICAgICAgICAgICovIDB4MzEsIDB4YTEsIDB4MWMsIDB4ODAsIDB4NDEsIDB4OTIsIDB4MGIsIDB4M2IsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDYwIEZyZW5jaCBIb3JuICAgICAgICAgICAgICAgICAgICAgICovIDB4MjEsIDB4MjEsIDB4OWYsIDB4ODAsIDB4NTMsIDB4YWEsIDB4NWEsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDYxIEJyYXNzIFNlY3Rpb24gICAgICAgICAgICAgICAgICAgICovIDB4MjEsIDB4MjEsIDB4MTYsIDB4MDAsIDB4NzEsIDB4ODEsIDB4YWUsIDB4OWUsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDYyIFN5bnRoIEJyYXNzIDEgICAgICAgICAgICAgICAgICAgICovIDB4NjEsIDB4NjAsIDB4MWMsIDB4MDAsIDB4NzEsIDB4ODEsIDB4YWUsIDB4MmUsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDYzIFN5bnRoIEJyYXNzIDIgICAgICAgICAgICAgICAgICAgICovIDB4MjEsIDB4MjEsIDB4OGUsIDB4ODAsIDB4YmIsIDB4OTAsIDB4MjksIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDY0IFNvcHJhbm8gU2F4ICAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MTIsIDB4NGYsIDB4MDAsIDB4NzEsIDB4NTIsIDB4NTMsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDY1IEFsdG8gU2F4ICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MTMsIDB4NGYsIDB4MDAsIDB4NzEsIDB4NjIsIDB4NTMsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDY2IFRlbm9yIFNheCAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MTMsIDB4OGQsIDB4MDAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4N2MsIDB4MDEsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDY3IEJhcml0b25lIFNheCAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MTIsIDB4NGYsIDB4MDAsIDB4NzEsIDB4MjIsIDB4NTMsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDY4IE9ib2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4NzEsIDB4NjIsIDB4YzUsIDB4MDUsIDB4NmUsIDB4OGIsIDB4MTcsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDY5IEVuZ2xpc2ggSG9ybiAgICAgICAgICAgICAgICAgICAgICovIDB4ZTEsIDB4ZTQsIDB4MjMsIDB4MDAsIDB4NzEsIDB4ODIsIDB4YWUsIDB4OWUsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDcwIEJhc3Nvb24gICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MzAsIDB4YjEsIDB4Y2QsIDB4ODAsIDB4ZDUsIDB4NjEsIDB4MTksIDB4MWIsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDcxIENsYXJpbmV0ICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MzIsIDB4YTEsIDB4MWMsIDB4ODAsIDB4NTEsIDB4ODIsIDB4MTUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDcyIFBpY2NvbG8gICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4ZTQsIDB4ZTQsIDB4MGYsIDB4MDAsIDB4NzAsIDB4NjAsIDB4MGYsIDB4OWYsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDczIEZsdXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4ZTEsIDB4NjEsIDB4MjcsIDB4ODAsIDB4NTMsIDB4NTMsIDB4OGEsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDc0IFJlY29yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4NjEsIDB4NjEsIDB4MjcsIDB4ODAsIDB4NzQsIDB4NjUsIDB4OGYsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDc1IFBhbiBGbHV0ZSAgICAgICAgICAgICAgICAgICAgICAgICovIDB4ZTAsIDB4YTEsIDB4ZWMsIDB4MDAsIDB4NmUsIDB4NjUsIDB4OGYsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDc2IEJvdHRsZSBCbG93ICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDc3IFNoYWt1aGFzaGkgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDc4IFdoaXN0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDc5IE9jYXJpbmEgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDgwIFN5bnRoIGxlYWQgMSAtIFNxIHdhdmUgbGVhZCAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDgxIFN5bnRoIGxlYWQgMiAtIFNhd3Rvb3RoIFdhdmUgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDgyIFN5bnRoIGxlYWQgMyAtIENhbGlvcGUgbGVhZCAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDgzIFN5bnRoIGxlYWQgNCAtIENoaWZmIGxlYWQgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDg0IFN5bnRoIGxlYWQgNSAtIENoYXJhbmcgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDg1IFN5bnRoIGxlYWQgNiAtIFNvbG8gU3ludGggVm9pY2UgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDg2IFN5bnRoIGxlYWQgNyAtIEJyaWdodCBTYXcgV2F2ZSAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDg3IFN5bnRoIGxlYWQgOCAtIEJyYXNzIGFuZCBMZWFkICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDg4IFN5bnRoIHBhZCAxIC0gRmFudGFzaWEgUGFkICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDg5IFN5bnRoIHBhZCAyIC0gV2FybSBQYWQgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDkwIFN5bnRoIHBhZCAzIC0gUG9seSBTeW50aCBQYWQgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDkxIFN5bnRoIHBhZCA0IC0gU3BhY2UgVm9pY2UgUGFkICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDkyIFN5bnRoIHBhZCA1IC0gQm93ZWQgR2xhc3MgUGFkICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDkzIFN5bnRoIHBhZCA2IC0gTWV0YWwgUGFkICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDk0IFN5bnRoIHBhZCA3IC0gSGFsbyBQYWQgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDk1IFN5bnRoIHBhZCA4IC0gU3dlZXAgUGFkICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDk2IFN5bnRoIFNGWCAxIC0gSWNlIFJhaW4gICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDk3IFN5bnRoIFNGWCAyIC0gU291bmR0cmFjayAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDk4IFN5bnRoIFNGWCAzIC0gQ3J5c3RhbCAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogIDk5IFN5bnRoIFNGWCA0IC0gQXRobW9zcGhlcmUgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTAwIFN5bnRoIFNGWCA1IC0gQnJpZ2h0bmVzcyAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTAxIFN5bnRoIFNGWCA2IC0gR29ibGluICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTAyIFN5bnRoIFNGWCA3IC0gRWNobyBkcm9wcyAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTAzIFN5bnRoIFNGWCA4IC0gU3RhciBUaGVtZSAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTA0IFNpdGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MDgsIDB4NDAsIDB4MDAsIDB4ZjIsIDB4ZjIsIDB4NTQsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTA1IEJhbmpvICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MzEsIDB4MTYsIDB4ODcsIDB4ODAsIDB4YTEsIDB4N2QsIDB4MTEsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTA2IFNoYW1pc2VuICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTA3IEtvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MGUsIDB4MDIsIDB4NDAsIDB4MDAsIDB4MDksIDB4ZjcsIDB4NTMsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTA4IEthbGltYmEgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTA5IEJhZ3BpcGUgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MzEsIDB4MjIsIDB4NDMsIDB4MDUsIDB4NmUsIDB4OGIsIDB4MTcsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTEwIEZpZGRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTExIFNoYW5haSAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTEyIFRpbmtsZSBCZWxsICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTEzIEFnb2dvICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTE0IFN0ZWVsIERydW1zICAgICAgICAgICAgICAgICAgICAgICovIDB4MDAsIDB4MDAsIDB4MGIsIDB4MDAsIDB4YTgsIDB4ZDYsIDB4NGMsIDB4NGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTE1IFdvb2RibG9jayAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDIsIDB4MTEsIDB4NGYsIDB4MDAsIDB4NzEsIDB4NTIsIDB4NTMsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTE2IFRhaWtvIERydW0gICAgICAgICAgICAgICAgICAgICAgICovIDB4MTIsIDB4MDIsIDB4MGIsIDB4MDAsIDB4OTUsIDB4ZDQsIDB4NGMsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTE3IE1lbG9kaWMgVG9tICAgICAgICAgICAgICAgICAgICAgICovIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4ZmEsIDB4ZGEsIDB4YmYsIDB4YmYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTE4IFN5bnRoIERydW0gICAgICAgICAgICAgICAgICAgICAgICovIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjYsIDB4ZjAsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTE5IFJldmVyc2UgQ3ltYmFsICAgICAgICAgICAgICAgICAgICovIDB4NjQsIDB4MDMsIDB4MDAsIDB4NDAsIDB4YjIsIDB4OTcsIDB4ODIsIDB4ZDQsIDB4MDIsIDB4MDEsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTIwIEd1aXRhciBGcmV0IE5vaXNlICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTIxIEJyZWF0aCBOb2lzZSAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTIyIFNlYXNob3JlICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTIzIEJpcmQgVHdlZXQgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTI0IFRlbGVwaG9uZSBSaW5nICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTI1IEhlbGljb3B0ZXIgICAgICAgICAgICAgICAgICAgICAgICovIDB4ZjAsIDB4ZTIsIDB4MDAsIDB4YzAsIDB4MWUsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTI2IEFwcGxhdXNlICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MDcsIDB4MDEsIDB4ODcsIDB4ODAsIDB4ZjAsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogMTI3IEd1bnNob3QgICAgICAgICAgICAgICAgICAgICAgICAgICovIDB4MGMsIDB4NTAsIDB4MDAsIDB4MjEsIDB4ZjgsIDB4MDksIDB4YjYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorfTsKKwordW5zaWduZWQgY2hhciBtaWRpRk1EcnVtc1BhdGNoZXNbMTYgKiAxMjhdID0geworLyogICAgIDEgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAgMiBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgICAzIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgIDQgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAgNSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgICA2IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgIDcgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAgOCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgICA5IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMTAgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAxMSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDEyIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMTMgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAxNCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDE1IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMTYgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAxNyBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDE4IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMTkgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAyMCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDIxIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMjIgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAyMyBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDI0IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMjUgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAyNiBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDI3IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMjggTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAyOSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDMwIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMzEgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAzMiBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDMzIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgMzQgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICAzNSBBY291c3RpYyBCYXNzIERydW0gICAgICAqLyAweDAwLCAweDAwLCAweDBkLCAweDAwLCAweGU4LCAweGE1LCAweGVmLCAweGZmLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKy8qICAgIDM2IEJhc3MgRHJ1bSAxICAgICAgICAgICAgICovIDB4MDAsIDB4MDAsIDB4MGIsIDB4MDAsIDB4YTgsIDB4ZDYsIDB4NGMsIDB4NGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorLyogICAgMzcgU2lkZSBTdGljayAgICAgICAgICAgICAgKi8gTk9UX0RFRklORUQKKy8qICAgIDM4IEFjb3VzdGljIFNuYXJlICAgICAgICAgICovIDB4MmUsIDB4MDIsIDB4MGEsIDB4MWIsIDB4ZmYsIDB4ZjYsIDB4MGYsIDB4NGEsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIHNuYXJlICAgICovCisvKiAgICAzOSBIYW5kIENsYXAgICAgICAgICAgICAgICAqLyBOT1RfREVGSU5FRAorLyogICAgNDAgRWxlY3RyaWMgU25hcmUgICAgICAgICAgKi8gMHgwYywgMHhkMCwgMHgwMCwgMHgwMCwgMHhjNywgMHg3MCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogcmtzbmFyZSAgKi8KKy8qICAgIDQxIExvdyBGbG9vciBUb20gICAgICAgICAgICovIE5PVF9ERUZJTkVECisvKiAgICA0MiBDbG9zZWQgSGktSGF0ICAgICAgICAgICAqLyAweDY0LCAweDAzLCAweDAyLCAweDQwLCAweGIyLCAweDk3LCAweGEyLCAweGQ0LCAweDAyLCAweDAxLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiBjeW1iYWwgICAqLworLyogICAgNDMgSGlnaCBGbG9vciBUb20gICAgICAgICAgKi8gTk9UX0RFRklORUQKKy8qICAgIDQ0IFBlZGFsIEhpLUhhdCAgICAgICAgICAgICovIE5PVF9ERUZJTkVECisvKiAgICA0NSBMb3cgVG9tICAgICAgICAgICAgICAgICAqLyAweDAxLCAweDAyLCAweDAwLCAweDAwLCAweGZhLCAweGRhLCAweGJmLCAweGJmLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiB0b20gICAgICAqLworLyogICAgNDYgT3BlbiBIaS1IYXQgICAgICAgICAgICAgKi8gTk9UX0RFRklORUQKKy8qICAgIDQ3IExvdy1NaWQgVG9tICAgICAgICAgICAgICovIDB4MDIsIDB4MzAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4ZTAsIDB4OTcsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIHRvbTIgICAgICovCisvKiAgICA0OCBIaS1NaWQgVG9tICAgICAgICAgICAgICAqLyBOT1RfREVGSU5FRAorLyogICAgNDkgQ3Jhc2ggQ3ltYmFsIDEgICAgICAgICAgKi8gTk9UX0RFRklORUQKKy8qICAgIDUwIEhpZ2ggVG9tICAgICAgICAgICAgICAgICovIE5PVF9ERUZJTkVECisvKiAgICA1MSBSaWRlIEN5bWJhbCAxICAgICAgICAgICAqLyAweDY0LCAweDAzLCAweDAwLCAweDQwLCAweGIyLCAweDk3LCAweDgyLCAweGQ0LCAweDAyLCAweDAxLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiBiY3ltYmFsICAqLyAKKy8qICAgIDUyIENoaW5lc2UgQ3ltYmFsICAgICAgICAgICovIE5PVF9ERUZJTkVECisvKiAgICA1MyBSaWRlIEJlbGwgICAgICAgICAgICAgICAqLyBOT1RfREVGSU5FRAorLyogICAgNTQgVGFtYm91cmluZSAgICAgICAgICAgICAgKi8gTk9UX0RFRklORUQKKy8qICAgIDU1IFNwbGFzaCBDeW1iYWwgICAgICAgICAgICovIE5PVF9ERUZJTkVECisvKiAgICA1NiBDb3diZWxsICAgICAgICAgICAgICAgICAqLyBOT1RfREVGSU5FRAorLyogICAgNTcgQ3Jhc2ggQ3ltYmFsIDIgICAgICAgICAgKi8gTk9UX0RFRklORUQKKy8qICAgIDU4IFZpYnJhc2wJCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNTkgUmlkZSBDeW1iYWwJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA2MCBIaSBCb24JCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNjEgTG93IEJvbgkJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA2MiBNdXRlIEhpIENvbgkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDYzIE9wZW4gSGkgQ29uCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNjQgTG93IENvbgkJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA2NSBIaWdoIFRpbWJhCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNjYgTG93IFRpbWJhCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNjcgSGlnaCBBZ28JCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNjggTG93IEFnbwkJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA2OSBDYWJhCQkJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA3MCBNYXJhYwkJCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNzEgU2hvcnQgV2hpc3QJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA3MiBMb25nIFdoaXN0CQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNzMgU2hvcnQgR3VpCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNzQgTG9uZyBHdWkJCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgNzUgQ2xhdgkJCQkJCQkqLyAweDEzLCAweDA4LCAweDgwLCAweDAwLCAweGZiLCAweGU4LCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiBjbGF2ZXMgICAqLworLyogICAgNzYgSGkgV29vZCBCbG8JCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA3NyBMb3cgV29vZCBCbG8JCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDc4IE11dGUgQ3VpCQkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDc5IE9wZW4gQ3VpCQkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDgwIE11dGUgVHJpYW5nCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgODEgT3BlbiBUcmlhbmcJCQkJCSovIDB4MjYsIDB4MWUsIDB4MDMsIDB4MDAsIDB4ZTAsIDB4ZmYsIDB4ZjAsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIHRyaWFuZ2xlICovCisvKiAgICA4MiBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDgzIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgODQgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA4NSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDg2IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgODcgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA4OCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDg5IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgOTAgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA5MSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDkyIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgOTMgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA5NCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDk1IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgOTYgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgICA5NyBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgIDk4IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAgOTkgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDEwMCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTAxIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMDIgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDEwMyBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTA0IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMDUgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDEwNiBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTA3IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMDggTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDEwOSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTEwIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMTEgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDExMiBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTEzIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMTQgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDExNSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTE2IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMTcgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDExOCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTE5IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMjAgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDEyMSBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTIyIE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMjMgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDEyNCBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTI1IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorLyogICAxMjYgTm90IGRlZmluZWQJCQkJCSovIE5PVF9ERUZJTkVECisvKiAgIDEyNyBOb3QgZGVmaW5lZAkJCQkJKi8gTk9UX0RFRklORUQKKy8qICAgMTI4IE5vdCBkZWZpbmVkCQkJCQkqLyBOT1RfREVGSU5FRAorfTsKKyAKKwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbWlvLmMgYi9tdWx0aW1lZGlhL21taW8uYwppbmRleCA4NDQzY2ExLi40NDg2NmRlIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21taW8uYworKysgYi9tdWx0aW1lZGlhL21taW8uYwpAQCAtNTk5LDkgKzU5OSwyNCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCW1taW9TZXRJbmZvICAgIAkJW01NU1lTVEVNLjEyMTZdCi0qLwotVUlOVDE2IFdJTkFQSSBtbWlvU2V0SW5mbyhITU1JTzE2IGhtbWlvLCBjb25zdCBNTUlPSU5GTzE2ICogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKKyAqIAkJCQltbWlvU2V0SW5mbyAgICAJCVtNTVNZU1RFTS4xMjE2XQorICovCitVSU5UMTYgV0lOQVBJIG1taW9TZXRJbmZvMTYoSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpCit7CisJTFBNTUlPSU5GTzE2CWxwbW1pbmZvOworCVRSQUNFKG1taW8sICJtbWlvU2V0SW5mb1xuIik7CisJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CisJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOworCWxwbW1pbmZvLT5wY2hOZXh0CT0gbHBtbWlvaW5mby0+cGNoTmV4dDsKKwlscG1taW5mby0+cGNoRW5kUmVhZAk9IGxwbW1pb2luZm8tPnBjaEVuZFJlYWQ7CisJR2xvYmFsVW5sb2NrMTYoaG1taW8pOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltbWlvU2V0SW5mbyAgICAJCVtXSU5NTS4xMzBdCisgKi8KK1VJTlQzMiBXSU5BUEkgbW1pb1NldEluZm8zMihITU1JTzMyIGhtbWlvLCBjb25zdCBNTUlPSU5GTzMyICogbHBtbWlvaW5mbywgVUlOVDMyIHVGbGFncykKIHsKIAlMUE1NSU9JTkZPMTYJbHBtbWluZm87CiAJVFJBQ0UobW1pbywgIm1taW9TZXRJbmZvXG4iKTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCBkZWZmYTFhLi4zZTJmN2IzIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMKKysrIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCkBAIC0xLDMgKzEsNSBAQAorLyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCisKIC8qCiAgKiBNTVNZVEVNIGZ1bmN0aW9ucwogICoKQEAgLTY1LDggKzY3LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1NU1lTVEVNX0RldklEVG9JbmRleAlbaW50ZXJuYWxdCiAgKi8KLWludCBNTVNZU1RFTV9EZXZJRFRvSW5kZXgoVUlOVDE2IHdEZXZJRCkgewotCXJldHVybiB3RGV2SUQgLSBNTVNZU1RFTV9NQUdJQzsKK2ludCBNTVNZU1RFTV9EZXZJRFRvSW5kZXgoVUlOVDE2IHdEZXZJRCkgCit7CisgICAgcmV0dXJuIHdEZXZJRCAtIE1NU1lTVEVNX01BR0lDOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc0LDIxICs3NywyMyBAQAogICovCiBVSU5UMTYgTU1TWVNURU1fRmlyc3REZXZJRCh2b2lkKQogewotCXJldHVybiBNTVNZU1RFTV9NQUdJQzsKKyAgICByZXR1cm4gTU1TWVNURU1fTUFHSUM7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCU1NU1lTVEVNX05leHREZXZJZAlbaW50ZXJuYWxdCiAgKi8KLVVJTlQxNiBNTVNZU1RFTV9OZXh0RGV2SUQoVUlOVDE2IHdEZXZJRCkgewotCXJldHVybiB3RGV2SUQgKyAxOworVUlOVDE2IE1NU1lTVEVNX05leHREZXZJRChVSU5UMTYgd0RldklEKSAKK3sKKyAgICByZXR1cm4gd0RldklEICsgMTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJTU1TWVNURU1fRGV2SWRWYWxpZAlbaW50ZXJuYWxdCiAgKi8KLUJPT0wzMiBNTVNZU1RFTV9EZXZJRFZhbGlkKFVJTlQxNiB3RGV2SUQpIHsKLQlyZXR1cm4gd0RldklEID49IDB4MEYwMCAmJiB3RGV2SUQgPCAoMHgwRjAwICsgTUFYTUNJRFJJVkVSUyk7CitCT09MMzIgTU1TWVNURU1fRGV2SURWYWxpZChVSU5UMTYgd0RldklEKSAKK3sKKyAgICByZXR1cm4gd0RldklEID49IDB4MEYwMCAmJiB3RGV2SUQgPCAoMHgwRjAwICsgTUFYTUNJRFJJVkVSUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTcsMjUgKzEwMiwyNSBAQAogaW50IFdJTkFQSSBNTVNZU1RFTV9XRVAoSElOU1RBTkNFMTYgaEluc3RhbmNlLCBXT1JEIHdEYXRhU2VnLAogICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBjYkhlYXBTaXplLCBMUFNUUiBscENtZExpbmUpCiB7Ci0JRklYTUUobW1zeXMsICJTVFVCOiBVbmxvYWRpbmcgTU1TeXN0ZW0gRExMIC4uLiBoSW5zdD0lMDRYIFxuIiwKLQkgICAgICBoSW5zdGFuY2UpOwotCXJldHVybihUUlVFKTsKKyAgICBGSVhNRShtbXN5cywgIlNUVUI6IFVubG9hZGluZyBNTVN5c3RlbSBETEwgLi4uIGhJbnN0PSUwNFggXG4iLAorCSAgaEluc3RhbmNlKTsKKyAgICByZXR1cm4oVFJVRSk7CiB9CiAKLXZvaWQKLU1NU1lTVEVNX01NVElNRTMydG8xNihMUE1NVElNRTE2IG1tdDE2LExQTU1USU1FMzIgbW10MzIpIHsKLQltbXQxNi0+d1R5cGUgPSBtbXQzMi0+d1R5cGU7Ci0JLyogbGF5b3V0IG9mIHJlc3QgaXMgdGhlIHNhbWUgZm9yIDMyLzE2ICovCi0JbWVtY3B5KCYobW10MzItPnUpLCYobW10MTYtPnUpLHNpemVvZihtbXQxNi0+dSkpOwordm9pZCBNTVNZU1RFTV9NTVRJTUUzMnRvMTYoTFBNTVRJTUUxNiBtbXQxNixMUE1NVElNRTMyIG1tdDMyKSAKK3sKKyAgICBtbXQxNi0+d1R5cGUgPSBtbXQzMi0+d1R5cGU7CisgICAgLyogbGF5b3V0IG9mIHJlc3QgaXMgdGhlIHNhbWUgZm9yIDMyLzE2ICovCisgICAgbWVtY3B5KCYobW10MzItPnUpLCYobW10MTYtPnUpLHNpemVvZihtbXQxNi0+dSkpOwogfQogCi12b2lkCi1NTVNZU1RFTV9NTVRJTUUxNnRvMzIoTFBNTVRJTUUzMiBtbXQzMixMUE1NVElNRTE2IG1tdDE2KSB7Ci0JbW10MzItPndUeXBlID0gbW10MTYtPndUeXBlOwotCS8qIGxheW91dCBvZiByZXN0IGlzIHRoZSBzYW1lIGZvciAzMi8xNiwKLQkgKiBOb3RlOiBtbXQxNi0+dSBpcyAyIGJ5dGVzIHNtYWxsZXIgdGhhbiBtbXQzMi0+dQotCSAqLwotCW1lbWNweSgmKG1tdDE2LT51KSwmKG1tdDMyLT51KSxzaXplb2YobW10MTYtPnUpKTsKK3ZvaWQgTU1TWVNURU1fTU1USU1FMTZ0bzMyKExQTU1USU1FMzIgbW10MzIsTFBNTVRJTUUxNiBtbXQxNikgCit7CisgICAgbW10MzItPndUeXBlID0gbW10MTYtPndUeXBlOworICAgIC8qIGxheW91dCBvZiByZXN0IGlzIHRoZSBzYW1lIGZvciAzMi8xNiwKKyAgICAgKiBOb3RlOiBtbXQxNi0+dSBpcyAyIGJ5dGVzIHNtYWxsZXIgdGhhbiBtbXQzMi0+dQorICAgICAqLworICAgIG1lbWNweSgmKG1tdDE2LT51KSwmKG1tdDMyLT51KSxzaXplb2YobW10MTYtPnUpKTsKIH0KIAogSEFORExFMzIJUGxheVNvdW5kX2hUaHJlYWQgPSAwOwpAQCAtNDQ0LDcgKzQ0OSw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgbW1zeXN0ZW1HZXRWZXJzaW9uMzIoKQogewotCXJldHVybiBtbXN5c3RlbUdldFZlcnNpb24xNigpOworICAgIHJldHVybiBtbXN5c3RlbUdldFZlcnNpb24xNigpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ1Myw1NyArNDU4LDU4IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbW1zeXN0ZW1HZXRWZXJzaW9uMTYoKQogewotCVRSQUNFKG1tc3lzLCAiMy4xMCAoV2luOTU/KVxuIik7Ci0JcmV0dXJuIDB4MDMwYTsKKyAgICBUUkFDRShtbXN5cywgIjMuMTAgKFdpbjk1PylcbiIpOworICAgIHJldHVybiAweDAzMGE7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJRHJpdmVyUHJvYwlbTU1TWVNURU0uNl0KLSovCisgKiAJCQkJRHJpdmVyUHJvYwlbTU1TWVNURU0uNl0KKyAqLwogTFJFU1VMVCBXSU5BUEkgRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAogICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JcmV0dXJuIERydkRlZkRyaXZlclByb2MoZHdEZXZJRCwgaERyaXYsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgcmV0dXJuIERydkRlZkRyaXZlclByb2MoZHdEZXZJRCwgaERyaXYsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJRHJpdmVyQ2FsbGJhY2sJW01NU1lTVEVNLjMxXQotKi8KKyAqIAkJCQlEcml2ZXJDYWxsYmFjawlbTU1TWVNURU0uMzFdCisgKi8KIEJPT0wxNiBXSU5BUEkgRHJpdmVyQ2FsbGJhY2soRFdPUkQgZHdDYWxsQmFjaywgVUlOVDE2IHVGbGFncywgSEFORExFMTYgaERldiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA4bFgsICUwNFgsICUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpOyAhXG4iLAotCQlkd0NhbGxCYWNrLCB1RmxhZ3MsIGhEZXYsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQlzd2l0Y2godUZsYWdzICYgRENCX1RZUEVNQVNLKSB7Ci0JCWNhc2UgRENCX05VTEw6Ci0JCQlUUkFDRShtbXN5cywgIkNBTExCQUNLX05VTEwgIVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBEQ0JfV0lORE9XOgotCQkJVFJBQ0UobW1zeXMsICJDQUxMQkFDS19XSU5ET1cgPSAlMDRsWCBoYW5kbGUgPSAlMDRYIVxuIixkd0NhbGxCYWNrLGhEZXYpOwotCQkJaWYgKCFJc1dpbmRvdzMyKGR3Q2FsbEJhY2spKSByZXR1cm4gRkFMU0U7Ci0JCQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoRGV2KTsKLQkJCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0JCQlQb3N0TWVzc2FnZTE2KChIV05EMTYpZHdDYWxsQmFjaywgd01zZywgaERldiwgZHdQYXJhbTEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRENCX1RBU0s6Ci0JCQlUUkFDRShtbXN5cywgIkNBTExCQUNLX1RBU0sgIVxuIik7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCWNhc2UgRENCX0ZVTkNUSU9OOgotCQkJVFJBQ0UobW1zeXMsICJDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKLQkJCUNhbGxiYWNrcy0+Q2FsbERyaXZlckNhbGxiYWNrKCAoRkFSUFJPQzE2KWR3Q2FsbEJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaERldiwgd01zZywgZHdVc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UGFyYW0xLCBkd1BhcmFtMiApOwotCQkJYnJlYWs7Ci0JCWNhc2UgRENCX0ZVTkMzMjoKLQkJCVRSQUNFKG1tc3lzLCAiQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7Ci0JCQkoKExQRFJWQ0FMTEJBQ0szMilkd0NhbGxCYWNrKSggaERldiwgd01zZywgZHdVc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UGFyYW0xLCBkd1BhcmFtMiApOwotCQkJYnJlYWs7Ci0JCX0KLQlyZXR1cm4gVFJVRTsKKyAgICBUUkFDRShtbXN5cywgIiglMDhsWCwgJTA0WCwgJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7ICFcbiIsCisJICBkd0NhbGxCYWNrLCB1RmxhZ3MsIGhEZXYsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBzd2l0Y2godUZsYWdzICYgRENCX1RZUEVNQVNLKSB7CisgICAgY2FzZSBEQ0JfTlVMTDoKKwlUUkFDRShtbXN5cywgIkNBTExCQUNLX05VTEwgIVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBEQ0JfV0lORE9XOgorCVRSQUNFKG1tc3lzLCAiQ0FMTEJBQ0tfV0lORE9XID0gJTA0bFggaGFuZGxlID0gJTA0WCFcbiIsCisJICAgICAgZHdDYWxsQmFjayxoRGV2KTsKKwlpZiAoIUlzV2luZG93MzIoZHdDYWxsQmFjaykgfHwgVVNFUl9IRUFQX0xJTl9BRERSKGhEZXYpID09IE5VTEwpCisJICAgIHJldHVybiBGQUxTRTsKKwkKKwlQb3N0TWVzc2FnZTE2KChIV05EMTYpZHdDYWxsQmFjaywgd01zZywgaERldiwgZHdQYXJhbTEpOworCWJyZWFrOworICAgIGNhc2UgRENCX1RBU0s6CisJVFJBQ0UobW1zeXMsICJDQUxMQkFDS19UQVNLICFcbiIpOworCXJldHVybiBGQUxTRTsKKyAgICBjYXNlIERDQl9GVU5DVElPTjoKKwlUUkFDRShtbXN5cywgIkNBTExCQUNLX0ZVTkNUSU9OICFcbiIpOworCUNhbGxiYWNrcy0+Q2FsbERyaXZlckNhbGxiYWNrKCAoRkFSUFJPQzE2KWR3Q2FsbEJhY2ssCisJCQkJICAgICAgIGhEZXYsIHdNc2csIGR3VXNlciwKKwkJCQkgICAgICAgZHdQYXJhbTEsIGR3UGFyYW0yICk7CisJYnJlYWs7CisgICAgY2FzZSBEQ0JfRlVOQzMyOgorCVRSQUNFKG1tc3lzLCAiQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CisJKChMUERSVkNBTExCQUNLMzIpZHdDYWxsQmFjaykoIGhEZXYsIHdNc2csIGR3VXNlciwKKwkJCQkgICAgICAgZHdQYXJhbTEsIGR3UGFyYW0yICk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlXQVJOKG1tc3lzLCAiVW5rbm93biBjYWxsYmFjayB0eXBlXG4iKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTE0LDE3ICs1MjAsMTcgQEAKICAqIEZJWE1FOiBhbHNvIGZpeCBkd0luc3RhbmNlIHBhc3NpbmcgdG8gbWl4TWVzc2FnZSAKICAqLwogc3RhdGljIFVJTlQzMiBfZ2V0X21peGVySURfZnJvbV9oYW5kbGUoSE1JWEVST0JKMzIgaG1peCxEV09SRCBkd0ZsYWdzKSB7Ci0JLyogRklYTUU6IENoZWNrIGR3RmxhZ3MgZm9yIE1JWEVSX09CSkVDVEZfeHh4eCBlbnRyaWVzIGFuZCBtb2RpZnkgaG1peCAKLQkgKiBhY2NvcmRpbmdseS4gRm9yIG5vdyB3ZSBhbHdheXMgdXNlIG1peGVyZGV2aWNlIDAuIAotCSAqLwotCXJldHVybiAwOworICAgIC8qIEZJWE1FOiBDaGVjayBkd0ZsYWdzIGZvciBNSVhFUl9PQkpFQ1RGX3h4eHggZW50cmllcyBhbmQgbW9kaWZ5IGhtaXggCisgICAgICogYWNjb3JkaW5nbHkuIEZvciBub3cgd2UgYWx3YXlzIHVzZSBtaXhlcmRldmljZSAwLiAKKyAgICAgKi8KKyAgICByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyR2V0TnVtRGV2cwkJW1dJTk1NLjEwOF0KICAqLwogVUlOVDMyIFdJTkFQSSBtaXhlckdldE51bURldnMzMigpIAogewotCXJldHVybiBtaXhlckdldE51bURldnMxNigpOworICAgIHJldHVybiBtaXhlckdldE51bURldnMxNigpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUzMiwxMSArNTM4LDExIEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWl4ZXJHZXROdW1EZXZzMTYoKSAKIHsKLQlVSU5UMTYJY291bnQ7Ci0KLQljb3VudCA9IG1peE1lc3NhZ2UoMCxNWERNX0dFVE5VTURFVlMsMEwsMEwsMEwpOwotCVRSQUNFKG1tYXV4LCJtaXhlckdldE51bURldnMgcmV0dXJucyAlZFxuIixjb3VudCk7Ci0JcmV0dXJuIGNvdW50OworICAgIFVJTlQxNgljb3VudDsKKyAgICAKKyAgICBjb3VudCA9IG1peE1lc3NhZ2UoMCxNWERNX0dFVE5VTURFVlMsMEwsMEwsMEwpOworICAgIFRSQUNFKG1tYXV4LCJtaXhlckdldE51bURldnMgcmV0dXJucyAlZFxuIixjb3VudCk7CisgICAgcmV0dXJuIGNvdW50OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU0NCwzMiArNTUwLDMyIEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgbWl4ZXJHZXREZXZDYXBzMzJXKFVJTlQzMiBkZXZpZCxMUE1JWEVSQ0FQUzMyVyBtaXhjYXBzLFVJTlQzMiBzaXplKSAKIHsKLQlNSVhFUkNBUFMxNgltaWMxNjsKLQlVSU5UMzIJcmV0ID0gbWl4ZXJHZXREZXZDYXBzMTYoZGV2aWQsJm1pYzE2LHNpemVvZihtaWMxNikpOwotCi0JbWl4Y2Fwcy0+d01pZCA9IG1pYzE2LndNaWQ7Ci0JbWl4Y2Fwcy0+d1BpZCA9IG1pYzE2LndQaWQ7Ci0JbWl4Y2Fwcy0+dkRyaXZlclZlcnNpb24gPSBtaWMxNi52RHJpdmVyVmVyc2lvbjsKLQlsc3RyY3B5QXRvVyhtaXhjYXBzLT5zelBuYW1lLG1pYzE2LnN6UG5hbWUpOwotCW1peGNhcHMtPmZkd1N1cHBvcnQgPSBtaWMxNi5mZHdTdXBwb3J0OwotCW1peGNhcHMtPmNEZXN0aW5hdGlvbnMgPSBtaWMxNi5jRGVzdGluYXRpb25zOwotCXJldHVybiByZXQ7CisgICAgTUlYRVJDQVBTMTYJbWljMTY7CisgICAgVUlOVDMyCXJldCA9IG1peGVyR2V0RGV2Q2FwczE2KGRldmlkLCZtaWMxNixzaXplb2YobWljMTYpKTsKKyAgICAKKyAgICBtaXhjYXBzLT53TWlkID0gbWljMTYud01pZDsKKyAgICBtaXhjYXBzLT53UGlkID0gbWljMTYud1BpZDsKKyAgICBtaXhjYXBzLT52RHJpdmVyVmVyc2lvbiA9IG1pYzE2LnZEcml2ZXJWZXJzaW9uOworICAgIGxzdHJjcHlBdG9XKG1peGNhcHMtPnN6UG5hbWUsbWljMTYuc3pQbmFtZSk7CisgICAgbWl4Y2Fwcy0+ZmR3U3VwcG9ydCA9IG1pYzE2LmZkd1N1cHBvcnQ7CisgICAgbWl4Y2Fwcy0+Y0Rlc3RpbmF0aW9ucyA9IG1pYzE2LmNEZXN0aW5hdGlvbnM7CisgICAgcmV0dXJuIHJldDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyR2V0RGV2Q2FwcwkJW1dJTk1NLjEwMV0KICAqLwogVUlOVDMyIFdJTkFQSSBtaXhlckdldERldkNhcHMzMkEoVUlOVDMyIGRldmlkLExQTUlYRVJDQVBTMzJBIG1peGNhcHMsVUlOVDMyIHNpemUpIAogewotCU1JWEVSQ0FQUzE2CW1pYzE2OwotCVVJTlQzMglyZXQgPSBtaXhlckdldERldkNhcHMxNihkZXZpZCwmbWljMTYsc2l6ZW9mKG1pYzE2KSk7Ci0KLQltaXhjYXBzLT53TWlkID0gbWljMTYud01pZDsKLQltaXhjYXBzLT53UGlkID0gbWljMTYud1BpZDsKLQltaXhjYXBzLT52RHJpdmVyVmVyc2lvbiA9IG1pYzE2LnZEcml2ZXJWZXJzaW9uOwotCXN0cmNweShtaXhjYXBzLT5zelBuYW1lLG1pYzE2LnN6UG5hbWUpOwotCW1peGNhcHMtPmZkd1N1cHBvcnQgPSBtaWMxNi5mZHdTdXBwb3J0OwotCW1peGNhcHMtPmNEZXN0aW5hdGlvbnMgPSBtaWMxNi5jRGVzdGluYXRpb25zOwotCXJldHVybiByZXQ7CisgICAgTUlYRVJDQVBTMTYJbWljMTY7CisgICAgVUlOVDMyCXJldCA9IG1peGVyR2V0RGV2Q2FwczE2KGRldmlkLCZtaWMxNixzaXplb2YobWljMTYpKTsKKyAgICAKKyAgICBtaXhjYXBzLT53TWlkID0gbWljMTYud01pZDsKKyAgICBtaXhjYXBzLT53UGlkID0gbWljMTYud1BpZDsKKyAgICBtaXhjYXBzLT52RHJpdmVyVmVyc2lvbiA9IG1pYzE2LnZEcml2ZXJWZXJzaW9uOworICAgIHN0cmNweShtaXhjYXBzLT5zelBuYW1lLG1pYzE2LnN6UG5hbWUpOworICAgIG1peGNhcHMtPmZkd1N1cHBvcnQgPSBtaWMxNi5mZHdTdXBwb3J0OworICAgIG1peGNhcHMtPmNEZXN0aW5hdGlvbnMgPSBtaWMxNi5jRGVzdGluYXRpb25zOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTc3LDI2MSArNTgzLDI3OCBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1peGVyR2V0RGV2Q2FwczE2KFVJTlQxNiBkZXZpZCxMUE1JWEVSQ0FQUzE2IG1peGNhcHMsVUlOVDE2IHNpemUpIAogewotCUZJWE1FKG1tc3lzLCJzaG91bGQgdGhpcyBiZSBhIGZpeG1lP1xuIik7Ci0JcmV0dXJuIG1peE1lc3NhZ2UoZGV2aWQsTVhETV9HRVRERVZDQVBTLDBMLChEV09SRCltaXhjYXBzLChEV09SRClzaXplKTsKKyAgICBGSVhNRShtbXN5cywic2hvdWxkIHRoaXMgYmUgYSBmaXhtZT9cbiIpOworICAgIHJldHVybiBtaXhNZXNzYWdlKGRldmlkLE1YRE1fR0VUREVWQ0FQUywwTCwoRFdPUkQpbWl4Y2FwcywoRFdPUkQpc2l6ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyT3BlbgkJW1dJTk1NLjExMF0KICAqLwogVUlOVDMyIFdJTkFQSSBtaXhlck9wZW4zMihMUEhNSVhFUjMyIGxwaG1peCxVSU5UMzIgdURldmljZUlELERXT1JEIGR3Q2FsbGJhY2ssCi1EV09SRCBkd0luc3RhbmNlLERXT1JEIGZkd09wZW4pIAorCQkJICBEV09SRCBkd0luc3RhbmNlLERXT1JEIGZkd09wZW4pIAogewotCUhNSVhFUjE2CWhtaXgxNjsKLQlVSU5UMzIJCXJldDsKLQotCUZJWE1FKG1tc3lzLCIoJXAsJWQsJTA4bHgsJTA4bHgsJTA4bHgpOiBzZW1pIHN0dWI/XG4iLAotCSAgICAgIGxwaG1peCx1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLGZkd09wZW4pOwotCXJldCA9IG1peGVyT3BlbjE2KCZobWl4MTYsdURldmljZUlELGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSxmZHdPcGVuKTsKLQlpZiAobHBobWl4KSAqbHBobWl4ID0gaG1peDE2OwotCXJldHVybiByZXQ7CisgICAgSE1JWEVSMTYJaG1peDE2OworICAgIFVJTlQzMglyZXQ7CisgICAgCisgICAgRklYTUUobW1zeXMsIiglcCwlZCwlMDhseCwlMDhseCwlMDhseCk6IHNlbWkgc3R1Yj9cbiIsCisJICBscGhtaXgsdURldmljZUlELGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSxmZHdPcGVuKTsKKyAgICByZXQgPSBtaXhlck9wZW4xNigmaG1peDE2LHVEZXZpY2VJRCxkd0NhbGxiYWNrLGR3SW5zdGFuY2UsZmR3T3Blbik7CisgICAgaWYgKGxwaG1peCkgKmxwaG1peCA9IGhtaXgxNjsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlck9wZW4KICAqLwogVUlOVDE2IFdJTkFQSSBtaXhlck9wZW4xNihMUEhNSVhFUjE2IGxwaG1peCxVSU5UMTYgdURldmljZUlELERXT1JEIGR3Q2FsbGJhY2ssCi1EV09SRCBkd0luc3RhbmNlLERXT1JEIGZkd09wZW4pIAorCQkJICBEV09SRCBkd0luc3RhbmNlLERXT1JEIGZkd09wZW4pIAogewotCUhNSVhFUjE2CWhtaXg7Ci0JTFBNSVhFUk9QRU5ERVNDCWxwbW9kOwotCUJPT0wzMgkJbWFwcGVyZmxhZyA9ICh1RGV2aWNlSUQ9PTApOwotCURXT1JECQlkd1JldDsKLQotCVRSQUNFKG1tc3lzLCIoJXAsJWQsJTA4bHgsJTA4bHgsJTA4bHgpXG4iLAotCSAgICAgIGxwaG1peCx1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLGZkd09wZW4pOwotCWhtaXggPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JWEVST1BFTkRFU0MpKTsKLQlpZiAobHBobWl4KSAqbHBobWl4ID0gaG1peDsKLQlscG1vZCA9IChMUE1JWEVST1BFTkRFU0MpVVNFUl9IRUFQX0xJTl9BRERSKGhtaXgpOwotCWxwbW9kLT5obXggPSBobWl4OwotCWxwbW9kLT5kd0NhbGxiYWNrID0gZHdDYWxsYmFjazsKLQlscG1vZC0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7Ci0JaWYgKHVEZXZpY2VJRCA+PSBNQVhNSVhFUkRSSVZFUlMpCi0JCXVEZXZpY2VJRCA9IDA7Ci0Jd2hpbGUodURldmljZUlEIDwgTUFYTUlYRVJEUklWRVJTKSB7Ci0JCWR3UmV0PW1peE1lc3NhZ2UodURldmljZUlELE1YRE1fT1BFTixkd0luc3RhbmNlLChEV09SRClscG1vZCxmZHdPcGVuKTsKLQkJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOwotCQlpZiAoIW1hcHBlcmZsYWcpIGJyZWFrOwotCQl1RGV2aWNlSUQrKzsKLQl9Ci0JbHBtb2QtPnVEZXZpY2VJRCA9IHVEZXZpY2VJRDsKLQlyZXR1cm4gZHdSZXQ7CisgICAgSE1JWEVSMTYJCWhtaXg7CisgICAgTFBNSVhFUk9QRU5ERVNDCWxwbW9kOworICAgIEJPT0wzMgkJbWFwcGVyZmxhZyA9ICh1RGV2aWNlSUQ9PTApOworICAgIERXT1JECQlkd1JldDsKKyAgICAKKyAgICBUUkFDRShtbXN5cywiKCVwLCVkLCUwOGx4LCUwOGx4LCUwOGx4KVxuIiwKKwkgIGxwaG1peCx1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLGZkd09wZW4pOworICAgIGhtaXggPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JWEVST1BFTkRFU0MpKTsKKyAgICBpZiAobHBobWl4KSAqbHBobWl4ID0gaG1peDsKKyAgICBscG1vZCA9IChMUE1JWEVST1BFTkRFU0MpVVNFUl9IRUFQX0xJTl9BRERSKGhtaXgpOworICAgIGxwbW9kLT5obXggPSBobWl4OworICAgIGxwbW9kLT5kd0NhbGxiYWNrID0gZHdDYWxsYmFjazsKKyAgICBscG1vZC0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7CisgICAgaWYgKHVEZXZpY2VJRCA+PSBNQVhNSVhFUkRSSVZFUlMpCisJdURldmljZUlEID0gMDsKKyAgICB3aGlsZSh1RGV2aWNlSUQgPCBNQVhNSVhFUkRSSVZFUlMpIHsKKwlkd1JldD1taXhNZXNzYWdlKHVEZXZpY2VJRCxNWERNX09QRU4sZHdJbnN0YW5jZSwoRFdPUkQpbHBtb2QsZmR3T3Blbik7CisJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOworCWlmICghbWFwcGVyZmxhZykgYnJlYWs7CisJdURldmljZUlEKys7CisgICAgfQorICAgIGxwbW9kLT51RGV2aWNlSUQgPSB1RGV2aWNlSUQ7CisgICAgcmV0dXJuIGR3UmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckNsb3NlCQlbV0lOTU0uOThdCiAgKi8KLVVJTlQzMiBXSU5BUEkgbWl4ZXJDbG9zZTMyKEhNSVhFUjMyIGhtaXgpIHsKLQlyZXR1cm4gbWl4ZXJDbG9zZTE2KGhtaXgpOworVUlOVDMyIFdJTkFQSSBtaXhlckNsb3NlMzIoSE1JWEVSMzIgaG1peCkgCit7CisgICAgcmV0dXJuIG1peGVyQ2xvc2UxNihobWl4KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWl4ZXJDbG9zZQogICovCi1VSU5UMTYgV0lOQVBJIG1peGVyQ2xvc2UxNihITUlYRVIxNiBobWl4KSB7Ci0JTFBNSVhFUk9QRU5ERVNDCWxwbW9kOwotCi0JRklYTUUobW1zeXMsIiglMDR4KTogc2VtaS1zdHViP1xuIixobWl4KTsKLQlscG1vZCA9IChMUE1JWEVST1BFTkRFU0MpVVNFUl9IRUFQX0xJTl9BRERSKGhtaXgpOwotCXJldHVybiBtaXhNZXNzYWdlKGxwbW9kLT51RGV2aWNlSUQsTVhETV9DTE9TRSxscG1vZC0+ZHdJbnN0YW5jZSwwTCwwTCk7CitVSU5UMTYgV0lOQVBJIG1peGVyQ2xvc2UxNihITUlYRVIxNiBobWl4KSAKK3sKKyAgICBMUE1JWEVST1BFTkRFU0MJbHBtb2Q7CisgICAgCisgICAgRklYTUUobW1zeXMsIiglMDR4KTogc2VtaS1zdHViP1xuIixobWl4KTsKKyAgICBscG1vZCA9IChMUE1JWEVST1BFTkRFU0MpVVNFUl9IRUFQX0xJTl9BRERSKGhtaXgpOworICAgIHJldHVybiBtaXhNZXNzYWdlKGxwbW9kLT51RGV2aWNlSUQsTVhETV9DTE9TRSxscG1vZC0+ZHdJbnN0YW5jZSwwTCwwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyR2V0SUQJCVtXSU5NTS4xMDNdCiAgKi8KLVVJTlQzMiBXSU5BUEkgbWl4ZXJHZXRJRDMyKEhNSVhFUk9CSjMyIGhtaXgsTFBVSU5UMzIgbHBpZCxEV09SRCBmZHdJRCkgewotCVVJTlQxNgl4aWQ7CitVSU5UMzIgV0lOQVBJIG1peGVyR2V0SUQzMihITUlYRVJPQkozMiBobWl4LExQVUlOVDMyIGxwaWQsRFdPUkQgZmR3SUQpIAoreworICAgIFVJTlQxNgl4aWQ7ICAgIAorICAgIFVJTlQzMglyZXQgPSBtaXhlckdldElEMTYoaG1peCwmeGlkLGZkd0lEKTsKIAotCVVJTlQzMglyZXQgPSBtaXhlckdldElEMTYoaG1peCwmeGlkLGZkd0lEKTsKLQlpZiAoKmxwaWQpICpscGlkID0geGlkOwotCXJldHVybiByZXQ7CisgICAgaWYgKCpscGlkKSAqbHBpZCA9IHhpZDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldElECiAgKi8KLVVJTlQxNiBXSU5BUEkgbWl4ZXJHZXRJRDE2KEhNSVhFUk9CSjE2IGhtaXgsTFBVSU5UMTYgbHBpZCxEV09SRCBmZHdJRCkgewotCUZJWE1FKG1tc3lzLCIoJTA0eCk6IHNlbWktc3R1YlxuIixobWl4KTsKLQlyZXR1cm4gX2dldF9taXhlcklEX2Zyb21faGFuZGxlKGhtaXgsZmR3SUQpOworVUlOVDE2IFdJTkFQSSBtaXhlckdldElEMTYoSE1JWEVST0JKMTYgaG1peCxMUFVJTlQxNiBscGlkLERXT1JEIGZkd0lEKSAKK3sKKyAgICBGSVhNRShtbXN5cywiKCUwNHgpOiBzZW1pLXN0dWJcbiIsaG1peCk7CisgICAgcmV0dXJuIF9nZXRfbWl4ZXJJRF9mcm9tX2hhbmRsZShobWl4LGZkd0lEKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWl4ZXJHZXRDb250cm9sRGV0YWlsc0EJW1dJTk1NLjk5XQogICovCi1VSU5UMzIgV0lOQVBJIG1peGVyR2V0Q29udHJvbERldGFpbHMzMkEoSE1JWEVST0JKMzIgaG1peCxMUE1JWEVSQ09OVFJPTERFVEFJTFMzMiBscG1jZCxEV09SRCBmZHdEZXRhaWxzKSB7Ci0JRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1jZCxmZHdEZXRhaWxzKTsKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKK1VJTlQzMiBXSU5BUEkgbWl4ZXJHZXRDb250cm9sRGV0YWlsczMyQShITUlYRVJPQkozMiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzMyIGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtY2QsZmR3RGV0YWlscyk7CisgICAgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyR2V0Q29udHJvbERldGFpbHNXCVtXSU5NTS4xMDBdCiAgKi8KLVVJTlQzMiBXSU5BUEkgbWl4ZXJHZXRDb250cm9sRGV0YWlsczMyVyhITUlYRVJPQkozMiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzMyIGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIHsKLQlGSVhNRShtbXN5cywiKCUwNHgsJXAsJTA4bHgpOiBzdHViIVxuIiwJaG1peCxscG1jZCxmZHdEZXRhaWxzKTsKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKK1VJTlQzMiBXSU5BUEkgbWl4ZXJHZXRDb250cm9sRGV0YWlsczMyVyhITUlYRVJPQkozMiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzMyIGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLAlobWl4LGxwbWNkLGZkd0RldGFpbHMpOworICAgIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldENvbnRyb2xEZXRhaWxzCVtNTVNZU1RFTS44MDhdCiAgKi8KLVVJTlQxNiBXSU5BUEkgbWl4ZXJHZXRDb250cm9sRGV0YWlsczE2KEhNSVhFUk9CSjE2IGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMTYgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewotCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtY2QsZmR3RGV0YWlscyk7Ci0JcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CitVSU5UMTYgV0lOQVBJIG1peGVyR2V0Q29udHJvbERldGFpbHMxNihITUlYRVJPQkoxNiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzE2IGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtY2QsZmR3RGV0YWlscyk7CisgICAgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyR2V0TGluZUNvbnRyb2xzQQlbV0lOTU0uMTA0XQogICovCi1VSU5UMzIgV0lOQVBJIG1peGVyR2V0TGluZUNvbnRyb2xzMzJBKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkxJTkVDT05UUk9MUzMyQSBscG1sYyxEV09SRCBmZHdDb250cm9scykgewotCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtbGMsZmR3Q29udHJvbHMpOwotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworVUlOVDMyIFdJTkFQSSBtaXhlckdldExpbmVDb250cm9sczMyQShITUlYRVJPQkozMiBobWl4LExQTUlYRVJMSU5FQ09OVFJPTFMzMkEgbHBtbGMsRFdPUkQgZmR3Q29udHJvbHMpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtbGMsZmR3Q29udHJvbHMpOworICAgIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldExpbmVDb250cm9sc1cJW1dJTk1NLjEwNV0KICAqLwotVUlOVDMyIFdJTkFQSSBtaXhlckdldExpbmVDb250cm9sczMyVyhITUlYRVJPQkozMiBobWl4LExQTUlYRVJMSU5FQ09OVFJPTFMzMlcgbHBtbGMsRFdPUkQgZmR3Q29udHJvbHMpIHsKLQlGSVhNRShtbXN5cywiKCUwNHgsJXAsJTA4bHgpOiBzdHViIVxuIixobWl4LGxwbWxjLGZkd0NvbnRyb2xzKTsKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKK1VJTlQzMiBXSU5BUEkgbWl4ZXJHZXRMaW5lQ29udHJvbHMzMlcoSE1JWEVST0JKMzIgaG1peCxMUE1JWEVSTElORUNPTlRST0xTMzJXIGxwbWxjLERXT1JEIGZkd0NvbnRyb2xzKSAKK3sKKyAgICBGSVhNRShtbXN5cywiKCUwNHgsJXAsJTA4bHgpOiBzdHViIVxuIixobWl4LGxwbWxjLGZkd0NvbnRyb2xzKTsKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWl4ZXJHZXRMaW5lQ29udHJvbHMJW01NU1lTVEVNLjgwN10KICAqLwotVUlOVDE2IFdJTkFQSSBtaXhlckdldExpbmVDb250cm9sczE2KEhNSVhFUk9CSjE2IGhtaXgsTFBNSVhFUkxJTkVDT05UUk9MUzE2IGxwbWxjLERXT1JEIGZkd0NvbnRyb2xzKSB7Ci0JRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1sYyxmZHdDb250cm9scyk7Ci0JcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CitVSU5UMTYgV0lOQVBJIG1peGVyR2V0TGluZUNvbnRyb2xzMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSTElORUNPTlRST0xTMTYgbHBtbGMsRFdPUkQgZmR3Q29udHJvbHMpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtbGMsZmR3Q29udHJvbHMpOworICAgIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldExpbmVJbmZvQQlbV0lOTU0uMTA2XQogICovCi1VSU5UMzIgV0lOQVBJIG1peGVyR2V0TGluZUluZm8zMkEoSE1JWEVST0JKMzIgaG1peCxMUE1JWEVSTElORTMyQSBscG1sLERXT1JEIGZkd0luZm8pIHsKLQlNSVhFUkxJTkUxNgltbDE2OwotCVVJTlQzMgkJcmV0OwotCi0JbWwxNi5kd0Rlc3RpbmF0aW9uID0gbHBtbC0+ZHdEZXN0aW5hdGlvbjsKLQlGSVhNRShtbXN5cywiKCUwNHgsJXAsJTA4bHgpOiBzdHViIVxuIixobWl4LGxwbWwsZmR3SW5mbyk7Ci0JcmV0ID0gbWl4ZXJHZXRMaW5lSW5mbzE2KGhtaXgsJm1sMTYsZmR3SW5mbyk7Ci0JbHBtbC0+Y2JTdHJ1Y3QgPSBzaXplb2YoKmxwbWwpOwotCWxwbWwtPmR3U291cmNlID0gbWwxNi5kd1NvdXJjZTsKLQlscG1sLT5kd0xpbmVJRCA9IG1sMTYuZHdMaW5lSUQ7Ci0JbHBtbC0+ZmR3TGluZSA9IG1sMTYuZmR3TGluZTsKLQlscG1sLT5kd1VzZXIgPSBtbDE2LmR3VXNlcjsKLQlscG1sLT5kd0NvbXBvbmVudFR5cGUgPSBtbDE2LmR3Q29tcG9uZW50VHlwZTsKLQlscG1sLT5jQ2hhbm5lbHMgPSBtbDE2LmNDaGFubmVsczsKLQlscG1sLT5jQ29ubmVjdGlvbnMgPSBtbDE2LmNDb25uZWN0aW9uczsKLQlscG1sLT5jQ29udHJvbHMgPSBtbDE2LmNDb250cm9sczsKLQlzdHJjcHkobHBtbC0+c3pTaG9ydE5hbWUsbWwxNi5zelNob3J0TmFtZSk7Ci0Jc3RyY3B5KGxwbWwtPnN6TmFtZSxtbDE2LnN6TmFtZSk7Ci0JbHBtbC0+VGFyZ2V0LmR3VHlwZSA9IG1sMTYuVGFyZ2V0LmR3VHlwZTsKLQlscG1sLT5UYXJnZXQuZHdEZXZpY2VJRCA9IG1sMTYuVGFyZ2V0LmR3RGV2aWNlSUQ7Ci0JbHBtbC0+VGFyZ2V0LndNaWQgPSBtbDE2LlRhcmdldC53TWlkOwotCWxwbWwtPlRhcmdldC53UGlkID0gbWwxNi5UYXJnZXQud1BpZDsKLQlscG1sLT5UYXJnZXQudkRyaXZlclZlcnNpb24gPSBtbDE2LlRhcmdldC52RHJpdmVyVmVyc2lvbjsKLQlzdHJjcHkobHBtbC0+VGFyZ2V0LnN6UG5hbWUsbWwxNi5UYXJnZXQuc3pQbmFtZSk7Ci0JcmV0dXJuIHJldDsKK1VJTlQzMiBXSU5BUEkgbWl4ZXJHZXRMaW5lSW5mbzMyQShITUlYRVJPQkozMiBobWl4LExQTUlYRVJMSU5FMzJBIGxwbWwsRFdPUkQgZmR3SW5mbykgCit7CisgICAgTUlYRVJMSU5FMTYJCW1sMTY7CisgICAgVUlOVDMyCQlyZXQ7CisgICAgCisgICAgbWwxNi5kd0Rlc3RpbmF0aW9uID0gbHBtbC0+ZHdEZXN0aW5hdGlvbjsKKyAgICBGSVhNRShtbXN5cywiKCUwNHgsJXAsJTA4bHgpOiBzdHViIVxuIixobWl4LGxwbWwsZmR3SW5mbyk7CisgICAgcmV0ID0gbWl4ZXJHZXRMaW5lSW5mbzE2KGhtaXgsJm1sMTYsZmR3SW5mbyk7CisgICAgbHBtbC0+Y2JTdHJ1Y3QgPSBzaXplb2YoKmxwbWwpOworICAgIGxwbWwtPmR3U291cmNlID0gbWwxNi5kd1NvdXJjZTsKKyAgICBscG1sLT5kd0xpbmVJRCA9IG1sMTYuZHdMaW5lSUQ7CisgICAgbHBtbC0+ZmR3TGluZSA9IG1sMTYuZmR3TGluZTsKKyAgICBscG1sLT5kd1VzZXIgPSBtbDE2LmR3VXNlcjsKKyAgICBscG1sLT5kd0NvbXBvbmVudFR5cGUgPSBtbDE2LmR3Q29tcG9uZW50VHlwZTsKKyAgICBscG1sLT5jQ2hhbm5lbHMgPSBtbDE2LmNDaGFubmVsczsKKyAgICBscG1sLT5jQ29ubmVjdGlvbnMgPSBtbDE2LmNDb25uZWN0aW9uczsKKyAgICBscG1sLT5jQ29udHJvbHMgPSBtbDE2LmNDb250cm9sczsKKyAgICBzdHJjcHkobHBtbC0+c3pTaG9ydE5hbWUsbWwxNi5zelNob3J0TmFtZSk7CisgICAgc3RyY3B5KGxwbWwtPnN6TmFtZSxtbDE2LnN6TmFtZSk7CisgICAgbHBtbC0+VGFyZ2V0LmR3VHlwZSA9IG1sMTYuVGFyZ2V0LmR3VHlwZTsKKyAgICBscG1sLT5UYXJnZXQuZHdEZXZpY2VJRCA9IG1sMTYuVGFyZ2V0LmR3RGV2aWNlSUQ7CisgICAgbHBtbC0+VGFyZ2V0LndNaWQgPSBtbDE2LlRhcmdldC53TWlkOworICAgIGxwbWwtPlRhcmdldC53UGlkID0gbWwxNi5UYXJnZXQud1BpZDsKKyAgICBscG1sLT5UYXJnZXQudkRyaXZlclZlcnNpb24gPSBtbDE2LlRhcmdldC52RHJpdmVyVmVyc2lvbjsKKyAgICBzdHJjcHkobHBtbC0+VGFyZ2V0LnN6UG5hbWUsbWwxNi5UYXJnZXQuc3pQbmFtZSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWl4ZXJHZXRMaW5lSW5mb1cJW1dJTk1NLjEwN10KICAqLwotVUlOVDMyIFdJTkFQSSBtaXhlckdldExpbmVJbmZvMzJXKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkxJTkUzMlcgbHBtbCxEV09SRCBmZHdJbmZvKSB7Ci0JTUlYRVJMSU5FMTYJbWwxNjsKLQlVSU5UMzIJCXJldDsKLQotCW1sMTYuZHdEZXN0aW5hdGlvbiA9IGxwbWwtPmR3RGVzdGluYXRpb247Ci0JRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1sLGZkd0luZm8pOwotCXJldCA9IG1peGVyR2V0TGluZUluZm8xNihobWl4LCZtbDE2LGZkd0luZm8pOwotCWxwbWwtPmNiU3RydWN0ID0gc2l6ZW9mKCpscG1sKTsKLQlscG1sLT5kd1NvdXJjZSA9IG1sMTYuZHdTb3VyY2U7Ci0JbHBtbC0+ZHdMaW5lSUQgPSBtbDE2LmR3TGluZUlEOwotCWxwbWwtPmZkd0xpbmUgPSBtbDE2LmZkd0xpbmU7Ci0JbHBtbC0+ZHdVc2VyID0gbWwxNi5kd1VzZXI7Ci0JbHBtbC0+ZHdDb21wb25lbnRUeXBlID0gbWwxNi5kd0NvbXBvbmVudFR5cGU7Ci0JbHBtbC0+Y0NoYW5uZWxzID0gbWwxNi5jQ2hhbm5lbHM7Ci0JbHBtbC0+Y0Nvbm5lY3Rpb25zID0gbWwxNi5jQ29ubmVjdGlvbnM7Ci0JbHBtbC0+Y0NvbnRyb2xzID0gbWwxNi5jQ29udHJvbHM7Ci0JbHN0cmNweUF0b1cobHBtbC0+c3pTaG9ydE5hbWUsbWwxNi5zelNob3J0TmFtZSk7Ci0JbHN0cmNweUF0b1cobHBtbC0+c3pOYW1lLG1sMTYuc3pOYW1lKTsKLQlscG1sLT5UYXJnZXQuZHdUeXBlID0gbWwxNi5UYXJnZXQuZHdUeXBlOwotCWxwbWwtPlRhcmdldC5kd0RldmljZUlEID0gbWwxNi5UYXJnZXQuZHdEZXZpY2VJRDsKLQlscG1sLT5UYXJnZXQud01pZCA9IG1sMTYuVGFyZ2V0LndNaWQ7Ci0JbHBtbC0+VGFyZ2V0LndQaWQgPSBtbDE2LlRhcmdldC53UGlkOwotCWxwbWwtPlRhcmdldC52RHJpdmVyVmVyc2lvbiA9IG1sMTYuVGFyZ2V0LnZEcml2ZXJWZXJzaW9uOwotCS8qbHN0cmNweUF0b1cobHBtbC0+VGFyZ2V0LnN6UG5hbWUsbWwxNi5UYXJnZXQuc3pQbmFtZSk7Ki8KLQlyZXR1cm4gcmV0OworVUlOVDMyIFdJTkFQSSBtaXhlckdldExpbmVJbmZvMzJXKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkxJTkUzMlcgbHBtbCxEV09SRCBmZHdJbmZvKSAKK3sKKyAgICBNSVhFUkxJTkUxNgkJbWwxNjsKKyAgICBVSU5UMzIJCXJldDsKKyAgICAKKyAgICBtbDE2LmR3RGVzdGluYXRpb24gPSBscG1sLT5kd0Rlc3RpbmF0aW9uOworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtbCxmZHdJbmZvKTsKKyAgICByZXQgPSBtaXhlckdldExpbmVJbmZvMTYoaG1peCwmbWwxNixmZHdJbmZvKTsKKyAgICBscG1sLT5jYlN0cnVjdCA9IHNpemVvZigqbHBtbCk7CisgICAgbHBtbC0+ZHdTb3VyY2UgPSBtbDE2LmR3U291cmNlOworICAgIGxwbWwtPmR3TGluZUlEID0gbWwxNi5kd0xpbmVJRDsKKyAgICBscG1sLT5mZHdMaW5lID0gbWwxNi5mZHdMaW5lOworICAgIGxwbWwtPmR3VXNlciA9IG1sMTYuZHdVc2VyOworICAgIGxwbWwtPmR3Q29tcG9uZW50VHlwZSA9IG1sMTYuZHdDb21wb25lbnRUeXBlOworICAgIGxwbWwtPmNDaGFubmVscyA9IG1sMTYuY0NoYW5uZWxzOworICAgIGxwbWwtPmNDb25uZWN0aW9ucyA9IG1sMTYuY0Nvbm5lY3Rpb25zOworICAgIGxwbWwtPmNDb250cm9scyA9IG1sMTYuY0NvbnRyb2xzOworICAgIGxzdHJjcHlBdG9XKGxwbWwtPnN6U2hvcnROYW1lLG1sMTYuc3pTaG9ydE5hbWUpOworICAgIGxzdHJjcHlBdG9XKGxwbWwtPnN6TmFtZSxtbDE2LnN6TmFtZSk7CisgICAgbHBtbC0+VGFyZ2V0LmR3VHlwZSA9IG1sMTYuVGFyZ2V0LmR3VHlwZTsKKyAgICBscG1sLT5UYXJnZXQuZHdEZXZpY2VJRCA9IG1sMTYuVGFyZ2V0LmR3RGV2aWNlSUQ7CisgICAgbHBtbC0+VGFyZ2V0LndNaWQgPSBtbDE2LlRhcmdldC53TWlkOworICAgIGxwbWwtPlRhcmdldC53UGlkID0gbWwxNi5UYXJnZXQud1BpZDsKKyAgICBscG1sLT5UYXJnZXQudkRyaXZlclZlcnNpb24gPSBtbDE2LlRhcmdldC52RHJpdmVyVmVyc2lvbjsKKyAgICAvKmxzdHJjcHlBdG9XKGxwbWwtPlRhcmdldC5zelBuYW1lLG1sMTYuVGFyZ2V0LnN6UG5hbWUpOyovCisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWl4ZXJHZXRMaW5lSW5mbwlbTU1TWVNURU0uODA1XQogICovCi1VSU5UMTYgV0lOQVBJIG1peGVyR2V0TGluZUluZm8xNihITUlYRVJPQkoxNiBobWl4LExQTUlYRVJMSU5FMTYgbHBtbCxEV09SRCBmZHdJbmZvKSB7Ci0JVUlOVDE2IGRldmlkID0gIF9nZXRfbWl4ZXJJRF9mcm9tX2hhbmRsZShobWl4LGZkd0luZm8pOwotCi0JRklYTUUobW1zeXMsIiglMDR4LCVwW2xpbmUgJTA4bHhdLCUwOGx4KSAtIHNlbWktc3R1Yj9cbiIsCi0JICAgICAgaG1peCxscG1sLGxwbWwtPmR3RGVzdGluYXRpb24sZmR3SW5mbyk7Ci0JcmV0dXJuIG1peE1lc3NhZ2UoZGV2aWQsTVhETV9HRVRMSU5FSU5GTywwLChEV09SRClscG1sLGZkd0luZm8pOworVUlOVDE2IFdJTkFQSSBtaXhlckdldExpbmVJbmZvMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSTElORTE2IGxwbWwsRFdPUkQgZmR3SW5mbykgCit7CisgICAgVUlOVDE2IGRldmlkID0gIF9nZXRfbWl4ZXJJRF9mcm9tX2hhbmRsZShobWl4LGZkd0luZm8pOworICAgIAorICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcFtsaW5lICUwOGx4XSwlMDhseCkgLSBzZW1pLXN0dWI/XG4iLAorCSAgaG1peCxscG1sLGxwbWwtPmR3RGVzdGluYXRpb24sZmR3SW5mbyk7CisgICAgcmV0dXJuIG1peE1lc3NhZ2UoZGV2aWQsTVhETV9HRVRMSU5FSU5GTywwLChEV09SRClscG1sLGZkd0luZm8pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlclNldENvbnRyb2xEZXRhaWxzCVtXSU5NTS4xMTFdCiAgKi8KLVVJTlQzMiBXSU5BUEkgbWl4ZXJTZXRDb250cm9sRGV0YWlsczMyKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewotCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtY2QsZmR3RGV0YWlscyk7Ci0JcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CitVSU5UMzIgV0lOQVBJIG1peGVyU2V0Q29udHJvbERldGFpbHMzMihITUlYRVJPQkozMiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzMyIGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtY2QsZmR3RGV0YWlscyk7CisgICAgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyU2V0Q29udHJvbERldGFpbHMJW01NU1lTVEVNLjgwOV0KICAqLwotVUlOVDE2IFdJTkFQSSBtaXhlclNldENvbnRyb2xEZXRhaWxzMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSQ09OVFJPTERFVEFJTFMxNiBscG1jZCxEV09SRCBmZHdEZXRhaWxzKSB7Ci0JRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1jZCxmZHdEZXRhaWxzKTsKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKK1VJTlQxNiBXSU5BUEkgbWl4ZXJTZXRDb250cm9sRGV0YWlsczE2KEhNSVhFUk9CSjE2IGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMTYgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgCit7CisgICAgRklYTUUobW1zeXMsIiglMDR4LCVwLCUwOGx4KTogc3R1YiFcbiIsaG1peCxscG1jZCxmZHdEZXRhaWxzKTsKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWl4ZXJNZXNzYWdlCQlbV0lOTU0uMTA5XQogICovCi1VSU5UMzIgV0lOQVBJIG1peGVyTWVzc2FnZTMyKEhNSVhFUjMyIGhtaXgsVUlOVDMyIHVNc2csRFdPUkQgZHdQYXJhbTEsRFdPUkQgZHdQYXJhbTIpIHsKLQlMUE1JWEVST1BFTkRFU0MJbHBtb2Q7Ci0JVUlOVDE2CXVEZXZpY2VJRDsKLQotCWxwbW9kID0gKExQTUlYRVJPUEVOREVTQylVU0VSX0hFQVBfTElOX0FERFIoaG1peCk7Ci0JaWYgKGxwbW9kKQotCQl1RGV2aWNlSUQgPSBscG1vZC0+dURldmljZUlEOwotCWVsc2UKLQkJdURldmljZUlEID0gMDsKLQlGSVhNRShtbXN5cywiKCUwNGx4LCVkLCUwOGx4LCUwOGx4KTogc2VtaS1zdHViP1xuIiwKLQkgICAgICAoRFdPUkQpaG1peCx1TXNnLGR3UGFyYW0xLGR3UGFyYW0yKTsKLQlyZXR1cm4gbWl4TWVzc2FnZSh1RGV2aWNlSUQsdU1zZywwTCxkd1BhcmFtMSxkd1BhcmFtMik7CitVSU5UMzIgV0lOQVBJIG1peGVyTWVzc2FnZTMyKEhNSVhFUjMyIGhtaXgsVUlOVDMyIHVNc2csRFdPUkQgZHdQYXJhbTEsRFdPUkQgZHdQYXJhbTIpIAoreworICAgIExQTUlYRVJPUEVOREVTQwlscG1vZDsKKyAgICBVSU5UMTYJCXVEZXZpY2VJRDsKKyAgICAKKyAgICBscG1vZCA9IChMUE1JWEVST1BFTkRFU0MpVVNFUl9IRUFQX0xJTl9BRERSKGhtaXgpOworICAgIGlmIChscG1vZCkKKwl1RGV2aWNlSUQgPSBscG1vZC0+dURldmljZUlEOworICAgIGVsc2UKKwl1RGV2aWNlSUQgPSAwOworICAgIEZJWE1FKG1tc3lzLCIoJTA0bHgsJWQsJTA4bHgsJTA4bHgpOiBzZW1pLXN0dWI/XG4iLAorCSAgKERXT1JEKWhtaXgsdU1zZyxkd1BhcmFtMSxkd1BhcmFtMik7CisgICAgcmV0dXJuIG1peE1lc3NhZ2UodURldmljZUlELHVNc2csMEwsZHdQYXJhbTEsZHdQYXJhbTIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlck1lc3NhZ2UJCVtNTVNZU1RFTS44MDRdCiAgKi8KLVVJTlQxNiBXSU5BUEkgbWl4ZXJNZXNzYWdlMTYoSE1JWEVSMTYgaG1peCxVSU5UMTYgdU1zZyxEV09SRCBkd1BhcmFtMSxEV09SRCBkd1BhcmFtMikgewotCUxQTUlYRVJPUEVOREVTQwlscG1vZDsKLQlVSU5UMTYJdURldmljZUlEOwotCi0JbHBtb2QgPSAoTFBNSVhFUk9QRU5ERVNDKVVTRVJfSEVBUF9MSU5fQUREUihobWl4KTsKLQlpZiAobHBtb2QpCi0JCXVEZXZpY2VJRCA9IGxwbW9kLT51RGV2aWNlSUQ7Ci0JZWxzZQotCQl1RGV2aWNlSUQgPSAwOwotCUZJWE1FKG1tc3lzLCIoJTA0eCwlZCwlMDhseCwlMDhseCkgLSBzZW1pLXN0dWI/XG4iLAotCSAgICAgIGhtaXgsdU1zZyxkd1BhcmFtMSxkd1BhcmFtMik7Ci0JcmV0dXJuIG1peE1lc3NhZ2UodURldmljZUlELHVNc2csMEwsZHdQYXJhbTEsZHdQYXJhbTIpOworVUlOVDE2IFdJTkFQSSBtaXhlck1lc3NhZ2UxNihITUlYRVIxNiBobWl4LFVJTlQxNiB1TXNnLERXT1JEIGR3UGFyYW0xLERXT1JEIGR3UGFyYW0yKSAKK3sKKyAgICBMUE1JWEVST1BFTkRFU0MJbHBtb2Q7CisgICAgVUlOVDE2CQl1RGV2aWNlSUQ7CisgICAgCisgICAgbHBtb2QgPSAoTFBNSVhFUk9QRU5ERVNDKVVTRVJfSEVBUF9MSU5fQUREUihobWl4KTsKKyAgICBpZiAobHBtb2QpCisJdURldmljZUlEID0gbHBtb2QtPnVEZXZpY2VJRDsKKyAgICBlbHNlCisJdURldmljZUlEID0gMDsKKyAgICBGSVhNRShtbXN5cywiKCUwNHgsJWQsJTA4bHgsJTA4bHgpIC0gc2VtaS1zdHViP1xuIiwKKwkgIGhtaXgsdU1zZyxkd1BhcmFtMSxkd1BhcmFtMik7CisgICAgcmV0dXJuIG1peE1lc3NhZ2UodURldmljZUlELHVNc2csMEwsZHdQYXJhbTEsZHdQYXJhbTIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgzOSw3ICs4NjIsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIGF1eEdldE51bURldnMzMigpCiB7Ci0JcmV0dXJuIGF1eEdldE51bURldnMxNigpOworICAgIHJldHVybiBhdXhHZXROdW1EZXZzMTYoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04NDcsMTEgKzg3MCwxMSBAQAogICovCiBVSU5UMTYgV0lOQVBJIGF1eEdldE51bURldnMxNigpCiB7Ci0JVUlOVDE2CWNvdW50ID0gMDsKLQlUUkFDRShtbXN5cywgImF1eEdldE51bURldnMgIVxuIik7Ci0JY291bnQgKz0gYXV4TWVzc2FnZSgwLCBBVVhETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKLQlUUkFDRShtbXN5cywgImF1eEdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOwotCXJldHVybiBjb3VudDsKKyAgICBVSU5UMTYJY291bnQgPSAwOworICAgIFRSQUNFKG1tc3lzLCAiYXV4R2V0TnVtRGV2cyAhXG4iKTsKKyAgICBjb3VudCArPSBhdXhNZXNzYWdlKDAsIEFVWERNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOworICAgIFRSQUNFKG1tc3lzLCAiYXV4R2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CisgICAgcmV0dXJuIGNvdW50OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg1OSwxNiArODgyLDE2IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgYXV4R2V0RGV2Q2FwczMyVyhVSU5UMzIgdURldmljZUlELExQQVVYQ0FQUzMyVyBscENhcHMsVUlOVDMyIHVTaXplKQogewotCUFVWENBUFMxNglhYzE2OwotCVVJTlQzMglyZXQgPSBhdXhHZXREZXZDYXBzMTYodURldmljZUlELCZhYzE2LHNpemVvZihhYzE2KSk7Ci0KLQlscENhcHMtPndNaWQgPSBhYzE2LndNaWQ7Ci0JbHBDYXBzLT53UGlkID0gYWMxNi53UGlkOwotCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSBhYzE2LnZEcml2ZXJWZXJzaW9uOwotCWxzdHJjcHlBdG9XKGxwQ2Fwcy0+c3pQbmFtZSxhYzE2LnN6UG5hbWUpOwotCWxwQ2Fwcy0+d1RlY2hub2xvZ3kgPSBhYzE2LndUZWNobm9sb2d5OwotCWxwQ2Fwcy0+ZHdTdXBwb3J0ID0gYWMxNi5kd1N1cHBvcnQ7Ci0JcmV0dXJuIHJldDsKKyAgICBBVVhDQVBTMTYJYWMxNjsKKyAgICBVSU5UMzIJcmV0ID0gYXV4R2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwmYWMxNixzaXplb2YoYWMxNikpOworICAgIAorICAgIGxwQ2Fwcy0+d01pZCA9IGFjMTYud01pZDsKKyAgICBscENhcHMtPndQaWQgPSBhYzE2LndQaWQ7CisgICAgbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IGFjMTYudkRyaXZlclZlcnNpb247CisgICAgbHN0cmNweUF0b1cobHBDYXBzLT5zelBuYW1lLGFjMTYuc3pQbmFtZSk7CisgICAgbHBDYXBzLT53VGVjaG5vbG9neSA9IGFjMTYud1RlY2hub2xvZ3k7CisgICAgbHBDYXBzLT5kd1N1cHBvcnQgPSBhYzE2LmR3U3VwcG9ydDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg3NiwxNiArODk5LDE2IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgYXV4R2V0RGV2Q2FwczMyQShVSU5UMzIgdURldmljZUlELExQQVVYQ0FQUzMyQSBscENhcHMsVUlOVDMyIHVTaXplKQogewotCUFVWENBUFMxNglhYzE2OwotCVVJTlQzMglyZXQgPSBhdXhHZXREZXZDYXBzMTYodURldmljZUlELCZhYzE2LHNpemVvZihhYzE2KSk7Ci0KLQlscENhcHMtPndNaWQgPSBhYzE2LndNaWQ7Ci0JbHBDYXBzLT53UGlkID0gYWMxNi53UGlkOwotCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSBhYzE2LnZEcml2ZXJWZXJzaW9uOwotCXN0cmNweShscENhcHMtPnN6UG5hbWUsYWMxNi5zelBuYW1lKTsKLQlscENhcHMtPndUZWNobm9sb2d5ID0gYWMxNi53VGVjaG5vbG9neTsKLQlscENhcHMtPmR3U3VwcG9ydCA9IGFjMTYuZHdTdXBwb3J0OwotCXJldHVybiByZXQ7CisgICAgQVVYQ0FQUzE2CWFjMTY7CisgICAgVUlOVDMyCXJldCA9IGF1eEdldERldkNhcHMxNih1RGV2aWNlSUQsJmFjMTYsc2l6ZW9mKGFjMTYpKTsKKyAgICAKKyAgICBscENhcHMtPndNaWQgPSBhYzE2LndNaWQ7CisgICAgbHBDYXBzLT53UGlkID0gYWMxNi53UGlkOworICAgIGxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSBhYzE2LnZEcml2ZXJWZXJzaW9uOworICAgIHN0cmNweShscENhcHMtPnN6UG5hbWUsYWMxNi5zelBuYW1lKTsKKyAgICBscENhcHMtPndUZWNobm9sb2d5ID0gYWMxNi53VGVjaG5vbG9neTsKKyAgICBscENhcHMtPmR3U3VwcG9ydCA9IGFjMTYuZHdTdXBwb3J0OworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODkzLDEwICs5MTYsMTAgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBhdXhHZXREZXZDYXBzMTYoVUlOVDE2IHVEZXZpY2VJRCxMUEFVWENBUFMxNiBscENhcHMsIFVJTlQxNiB1U2l6ZSkKIHsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpICFcbiIsIAotCQkJCQl1RGV2aWNlSUQsIGxwQ2FwcywgdVNpemUpOwotCXJldHVybiBhdXhNZXNzYWdlKHVEZXZpY2VJRCwgQVVYRE1fR0VUREVWQ0FQUywKLQkJCQkwTCwgKERXT1JEKWxwQ2FwcywgKERXT1JEKXVTaXplKTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpICFcbiIsIAorCSAgdURldmljZUlELCBscENhcHMsIHVTaXplKTsKKyAgICByZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsIEFVWERNX0dFVERFVkNBUFMsCisJCSAgICAgIDBMLCAoRFdPUkQpbHBDYXBzLCAoRFdPUkQpdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTkwNCw3ICs5MjcsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIGF1eEdldFZvbHVtZTMyKFVJTlQzMiB1RGV2aWNlSUQsIERXT1JEICogbHBkd1ZvbHVtZSkKIHsKLQlyZXR1cm4gYXV4R2V0Vm9sdW1lMTYodURldmljZUlELGxwZHdWb2x1bWUpOworICAgIHJldHVybiBhdXhHZXRWb2x1bWUxNih1RGV2aWNlSUQsbHBkd1ZvbHVtZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTEyLDggKzkzNSw4IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgYXV4R2V0Vm9sdW1lMTYoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKQogewotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwKSAhXG4iLCB1RGV2aWNlSUQsIGxwZHdWb2x1bWUpOwotCXJldHVybiBhdXhNZXNzYWdlKHVEZXZpY2VJRCwgQVVYRE1fR0VUVk9MVU1FLCAwTCwgKERXT1JEKWxwZHdWb2x1bWUsIDBMKTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCkgIVxuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKKyAgICByZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsIEFVWERNX0dFVFZPTFVNRSwgMEwsIChEV09SRClscGR3Vm9sdW1lLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTIxLDcgKzk0NCw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgYXV4U2V0Vm9sdW1lMzIoVUlOVDMyIHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpCiB7Ci0JcmV0dXJuIGF1eFNldFZvbHVtZTE2KHVEZXZpY2VJRCxkd1ZvbHVtZSk7CisgICAgcmV0dXJuIGF1eFNldFZvbHVtZTE2KHVEZXZpY2VJRCxkd1ZvbHVtZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTI5LDggKzk1Miw4IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgYXV4U2V0Vm9sdW1lMTYoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpCiB7Ci0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA4bFgpICFcbiIsIHVEZXZpY2VJRCwgZHdWb2x1bWUpOwotCXJldHVybiBhdXhNZXNzYWdlKHVEZXZpY2VJRCwgQVVYRE1fU0VUVk9MVU1FLCAwTCwgZHdWb2x1bWUsIDBMKTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlMDhsWCkgIVxuIiwgdURldmljZUlELCBkd1ZvbHVtZSk7CisgICAgcmV0dXJuIGF1eE1lc3NhZ2UodURldmljZUlELCBBVVhETV9TRVRWT0xVTUUsIDBMLCBkd1ZvbHVtZSwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTkzOCwyMCArOTYxLDIwIEBACiAgKi8KIERXT1JEIFdJTkFQSSBhdXhPdXRNZXNzYWdlMzIoVUlOVDMyIHVEZXZpY2VJRCxVSU5UMzIgdU1lc3NhZ2UsRFdPUkQgZHcxLERXT1JEIGR3MikKIHsKLQlzd2l0Y2ggKHVNZXNzYWdlKSB7Ci0JY2FzZSBBVVhETV9HRVROVU1ERVZTOgotCWNhc2UgQVVYRE1fR0VUVk9MVU1FOgotCWNhc2UgQVVYRE1fU0VUVk9MVU1FOgotCQkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLwotCQlicmVhazsKLQljYXNlIEFVWERNX0dFVERFVkNBUFM6Ci0JCXJldHVybiBhdXhHZXREZXZDYXBzMzJBKHVEZXZpY2VJRCwoTFBBVVhDQVBTMzJBKWR3MSxkdzIpOwotCWRlZmF1bHQ6Ci0JCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAotCQkgICAgdURldmljZUlELHVNZXNzYWdlLGR3MSxkdzIpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGF1eE1lc3NhZ2UodURldmljZUlELHVNZXNzYWdlLDBMLGR3MSxkdzIpOworICAgIHN3aXRjaCAodU1lc3NhZ2UpIHsKKyAgICBjYXNlIEFVWERNX0dFVE5VTURFVlM6CisgICAgY2FzZSBBVVhETV9HRVRWT0xVTUU6CisgICAgY2FzZSBBVVhETV9TRVRWT0xVTUU6CisJLyogbm8gYXJndW1lbnQgY29udmVyc2lvbiBuZWVkZWQgKi8KKwlicmVhazsKKyAgICBjYXNlIEFVWERNX0dFVERFVkNBUFM6CisJcmV0dXJuIGF1eEdldERldkNhcHMzMkEodURldmljZUlELChMUEFVWENBUFMzMkEpZHcxLGR3Mik7CisgICAgZGVmYXVsdDoKKwlFUlIobW1zeXMsIiglMDR4LCUwNHgsJTA4bHgsJTA4bHgpOiB1bmhhbmRsZWQgbWVzc2FnZVxuIiwKKwkgICAgdURldmljZUlELHVNZXNzYWdlLGR3MSxkdzIpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsdU1lc3NhZ2UsMEwsZHcxLGR3Mik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTU5LDIzICs5ODIsMjMgQEAKICAqLwogRFdPUkQgV0lOQVBJIGF1eE91dE1lc3NhZ2UxNihVSU5UMTYgdURldmljZUlELCBVSU5UMTYgdU1lc3NhZ2UsIERXT1JEIGR3MSwgRFdPUkQgZHcyKQogewotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAotCQkJCXVEZXZpY2VJRCwgdU1lc3NhZ2UsIGR3MSwgZHcyKTsKLQlzd2l0Y2ggKHVNZXNzYWdlKSB7Ci0JY2FzZSBBVVhETV9HRVROVU1ERVZTOgotCWNhc2UgQVVYRE1fU0VUVk9MVU1FOgotCQkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLwotCQlicmVhazsKLQljYXNlIEFVWERNX0dFVFZPTFVNRToKLQkJcmV0dXJuIGF1eEdldFZvbHVtZTE2KHVEZXZpY2VJRCwoTFBEV09SRClQVFJfU0VHX1RPX0xJTihkdzEpKTsKLQljYXNlIEFVWERNX0dFVERFVkNBUFM6Ci0JCXJldHVybiBhdXhHZXREZXZDYXBzMTYodURldmljZUlELChMUEFVWENBUFMxNilQVFJfU0VHX1RPX0xJTihkdzEpLGR3Mik7Ci0JZGVmYXVsdDoKLQkJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCi0JCSAgICB1RGV2aWNlSUQsdU1lc3NhZ2UsZHcxLGR3Mik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsIHVNZXNzYWdlLCAwTCwgZHcxLCBkdzIpOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAorCSAgdURldmljZUlELCB1TWVzc2FnZSwgZHcxLCBkdzIpOworICAgIHN3aXRjaCAodU1lc3NhZ2UpIHsKKyAgICBjYXNlIEFVWERNX0dFVE5VTURFVlM6CisgICAgY2FzZSBBVVhETV9TRVRWT0xVTUU6CisJLyogbm8gYXJndW1lbnQgY29udmVyc2lvbiBuZWVkZWQgKi8KKwlicmVhazsKKyAgICBjYXNlIEFVWERNX0dFVFZPTFVNRToKKwlyZXR1cm4gYXV4R2V0Vm9sdW1lMTYodURldmljZUlELChMUERXT1JEKVBUUl9TRUdfVE9fTElOKGR3MSkpOworICAgIGNhc2UgQVVYRE1fR0VUREVWQ0FQUzoKKwlyZXR1cm4gYXV4R2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwoTFBBVVhDQVBTMTYpUFRSX1NFR19UT19MSU4oZHcxKSxkdzIpOworICAgIGRlZmF1bHQ6CisJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJICAgIHVEZXZpY2VJRCx1TWVzc2FnZSxkdzEsZHcyKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGF1eE1lc3NhZ2UodURldmljZUlELCB1TWVzc2FnZSwgMEwsIGR3MSwgZHcyKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05ODMsMTIgKzEwMDYsMTIgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBtY2lHZXRFcnJvclN0cmluZzMyVyhEV09SRCB3RXJyb3IsTFBXU1RSIGxwc3RyQnVmZmVyLFVJTlQzMiB1TGVuZ3RoKQogewotCUxQU1RSCWJ1ZnN0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsdUxlbmd0aCk7Ci0JQk9PTDMyCXJldCA9IG1jaUdldEVycm9yU3RyaW5nMzJBKHdFcnJvcixidWZzdHIsdUxlbmd0aCk7Ci0KLQlsc3RyY3B5QXRvVyhscHN0ckJ1ZmZlcixidWZzdHIpOwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxidWZzdHIpOwotCXJldHVybiByZXQ7CisgICAgTFBTVFIJYnVmc3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCx1TGVuZ3RoKTsKKyAgICBCT09MMzIJcmV0ID0gbWNpR2V0RXJyb3JTdHJpbmczMkEod0Vycm9yLGJ1ZnN0cix1TGVuZ3RoKTsKKyAgICAKKyAgICBsc3RyY3B5QXRvVyhscHN0ckJ1ZmZlcixidWZzdHIpOworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxidWZzdHIpOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTk2LDcgKzEwMTksNyBAQAogICovCiBCT09MMzIgV0lOQVBJIG1jaUdldEVycm9yU3RyaW5nMzJBKERXT1JEIHdFcnJvcixMUFNUUiBscHN0ckJ1ZmZlcixVSU5UMzIgdUxlbmd0aCkKIHsKLQlyZXR1cm4gbWNpR2V0RXJyb3JTdHJpbmcxNih3RXJyb3IsbHBzdHJCdWZmZXIsdUxlbmd0aCk7CisgICAgcmV0dXJuIG1jaUdldEVycm9yU3RyaW5nMTYod0Vycm9yLGxwc3RyQnVmZmVyLHVMZW5ndGgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwMDQsMjc1ICsxMDI3LDI3NSBAQAogICovCiBCT09MMTYgV0lOQVBJIG1jaUdldEVycm9yU3RyaW5nMTYoRFdPUkQgd0Vycm9yLExQU1RSIGxwc3RyQnVmZmVyLFVJTlQxNiB1TGVuZ3RoKQogewotCUxQU1RSCW1zZ3B0cjsKLQlUUkFDRShtbXN5cywgIiglMDhsWCwgJXAsICVkKTtcbiIsIAotCSAgICAgICB3RXJyb3IsIGxwc3RyQnVmZmVyLCB1TGVuZ3RoKTsKLQlpZiAoKGxwc3RyQnVmZmVyID09IE5VTEwpIHx8ICh1TGVuZ3RoIDwgMSkpIHJldHVybihGQUxTRSk7Ci0JbHBzdHJCdWZmZXJbMF0gPSAnXDAnOwotCXN3aXRjaCh3RXJyb3IpIHsKLQkJY2FzZSBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ6Ci0JCQltc2dwdHIgPSAiSW52YWxpZCBNQ0kgZGV2aWNlIElELiBVc2UgdGhlIElEIHJldHVybmVkIHdoZW4gb3BlbmluZyB0aGUgTUNJIGRldmljZS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1VOUkVDT0dOSVpFRF9LRVlXT1JEOgotCQkJbXNncHRyID0gIlRoZSBkcml2ZXIgY2Fubm90IHJlY29nbml6ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgcGFyYW1ldGVyLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ6Ci0JCQltc2dwdHIgPSAiVGhlIGRyaXZlciBjYW5ub3QgcmVjb2duaXplIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0hBUkRXQVJFOgotCQkJbXNncHRyID0gIlRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHlvdXIgbWVkaWEgZGV2aWNlLiBNYWtlIHN1cmUgaXQgaXMgd29ya2luZyBjb3JyZWN0bHkgb3IgY29udGFjdCB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlci4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0lOVkFMSURfREVWSUNFX05BTUU6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgbm90IG9wZW4gb3IgaXMgbm90IHJlY29nbml6ZWQgYnkgTUNJLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfT1VUX09GX01FTU9SWToKLQkJCW1zZ3B0ciA9ICJOb3QgZW5vdWdoIG1lbW9yeSBhdmFpbGFibGUgZm9yIHRoaXMgdGFzay4gXG5RdWl0IG9uZSBvciBtb3JlIGFwcGxpY2F0aW9ucyB0byBpbmNyZWFzZSBhdmFpbGFibGUgbWVtb3J5LCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9ERVZJQ0VfT1BFTjoKLQkJCW1zZ3B0ciA9ICJUaGUgZGV2aWNlIG5hbWUgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGFzIGFuIGFsaWFzIGJ5IHRoaXMgYXBwbGljYXRpb24uIFVzZSBhIHVuaXF1ZSBhbGlhcy4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0NBTk5PVF9MT0FEX0RSSVZFUjoKLQkJCW1zZ3B0ciA9ICJUaGVyZSBpcyBhbiB1bmRldGVjdGFibGUgcHJvYmxlbSBpbiBsb2FkaW5nIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGRyaXZlci4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX01JU1NJTkdfQ09NTUFORF9TVFJJTkc6Ci0JCQltc2dwdHIgPSAiTm8gY29tbWFuZCB3YXMgc3BlY2lmaWVkLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfUEFSQU1fT1ZFUkZMT1c6Ci0JCQltc2dwdHIgPSAiVGhlIG91dHB1dCBzdHJpbmcgd2FzIHRvIGxhcmdlIHRvIGZpdCBpbiB0aGUgcmV0dXJuIGJ1ZmZlci4gSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX01JU1NJTkdfU1RSSU5HX0FSR1VNRU5UOgotCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgY29tbWFuZCByZXF1aXJlcyBhIGNoYXJhY3Rlci1zdHJpbmcgcGFyYW1ldGVyLiBQbGVhc2UgcHJvdmlkZSBvbmUuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9CQURfSU5URUdFUjoKLQkJCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIGludGVnZXIgaXMgaW52YWxpZCBmb3IgdGhpcyBjb21tYW5kLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfUEFSU0VSX0lOVEVSTkFMOgotCQkJbXNncHRyID0gIlRoZSBkZXZpY2UgZHJpdmVyIHJldHVybmVkIGFuIGludmFsaWQgcmV0dXJuIHR5cGUuIENoZWNrIHdpdGggdGhlIGRldmljZSBtYW51ZmFjdHVyZXIgYWJvdXQgb2J0YWluaW5nIGEgbmV3IGRyaXZlci4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0RSSVZFUl9JTlRFUk5BTDoKLQkJCW1zZ3B0ciA9ICJUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGRyaXZlci4gQ2hlY2sgd2l0aCB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlciBhYm91dCBvYnRhaW5pbmcgYSBuZXcgZHJpdmVyLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfTUlTU0lOR19QQVJBTUVURVI6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBjb21tYW5kIHJlcXVpcmVzIGEgcGFyYW1ldGVyLiBQbGVhc2Ugc3VwcGx5IG9uZS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOgotCQkJbXNncHRyID0gIlRoZSBNQ0kgZGV2aWNlIHlvdSBhcmUgdXNpbmcgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9GSUxFX05PVF9GT1VORDoKLQkJCW1zZ3B0ciA9ICJDYW5ub3QgZmluZCB0aGUgc3BlY2lmaWVkIGZpbGUuIE1ha2Ugc3VyZSB0aGUgcGF0aCBhbmQgZmlsZW5hbWUgYXJlIGNvcnJlY3QuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9ERVZJQ0VfTk9UX1JFQURZOgotCQkJbXNncHRyID0gIlRoZSBkZXZpY2UgZHJpdmVyIGlzIG5vdCByZWFkeS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0lOVEVSTkFMOgotCQkJbXNncHRyID0gIkEgcHJvYmxlbSBvY2N1cnJlZCBpbiBpbml0aWFsaXppbmcgTUNJLiBUcnkgcmVzdGFydGluZyBXaW5kb3dzLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfRFJJVkVSOgotCQkJbXNncHRyID0gIlRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBkZXZpY2UgZHJpdmVyLiBUaGUgZHJpdmVyIGhhcyBjbG9zZWQuIENhbm5vdCBhY2Nlc3MgZXJyb3IuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9DQU5OT1RfVVNFX0FMTDoKLQkJCW1zZ3B0ciA9ICJDYW5ub3QgdXNlICdhbGwnIGFzIHRoZSBkZXZpY2UgbmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX01VTFRJUExFOgotCQkJbXNncHRyID0gIkVycm9ycyBvY2N1cnJlZCBpbiBtb3JlIHRoYW4gb25lIGRldmljZS4gU3BlY2lmeSBlYWNoIGNvbW1hbmQgYW5kIGRldmljZSBzZXBhcmF0ZWx5IHRvIGRldGVybWluZSB3aGljaCBkZXZpY2VzIGNhdXNlZCB0aGUgZXJyb3IiOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0VYVEVOU0lPTl9OT1RfRk9VTkQ6Ci0JCQltc2dwdHIgPSAiQ2Fubm90IGRldGVybWluZSB0aGUgZGV2aWNlIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9uLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfT1VUT0ZSQU5HRToKLQkJCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpcyBvdXQgb2YgcmFuZ2UgZm9yIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0ZMQUdTX05PVF9DT01QQVRJQkxFOgotCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0ZJTEVfTk9UX1NBVkVEOgotCQkJbXNncHRyID0gIkNhbm5vdCBzYXZlIHRoZSBzcGVjaWZpZWQgZmlsZS4gTWFrZSBzdXJlIHlvdSBoYXZlIGVub3VnaCBkaXNrIHNwYWNlIG9yIGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIG5ldHdvcmsuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9ERVZJQ0VfVFlQRV9SRVFVSVJFRDoKLQkJCW1zZ3B0ciA9ICJDYW5ub3QgZmluZCB0aGUgc3BlY2lmaWVkIGRldmljZS4gTWFrZSBzdXJlIGl0IGlzIGluc3RhbGxlZCBvciB0aGF0IHRoZSBkZXZpY2UgbmFtZSBpcyBzcGVsbGVkIGNvcnJlY3RseS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0RFVklDRV9MT0NLRUQ6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgbm93IGJlaW5nIGNsb3NlZC4gV2FpdCBhIGZldyBzZWNvbmRzLCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9EVVBMSUNBVEVfQUxJQVM6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBhbGlhcyBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4gVXNlIGEgdW5pcXVlIGFsaWFzLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfQkFEX0NPTlNUQU5UOgotCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGlzIGludmFsaWQgZm9yIHRoaXMgY29tbWFuZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX01VU1RfVVNFX1NIQVJFQUJMRToKLQkJCW1zZ3B0ciA9ICJUaGUgZGV2aWNlIGRyaXZlciBpcyBhbHJlYWR5IGluIHVzZS4gVG8gc2hhcmUgaXQsIHVzZSB0aGUgJ3NoYXJlYWJsZScgcGFyYW1ldGVyIHdpdGggZWFjaCAnb3BlbicgY29tbWFuZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX01JU1NJTkdfREVWSUNFX05BTUU6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBjb21tYW5kIHJlcXVpcmVzIGFuIGFsaWFzLCBmaWxlLCBkcml2ZXIsIG9yIGRldmljZSBuYW1lLiBQbGVhc2Ugc3VwcGx5IG9uZS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDoKLQkJCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIHZhbHVlIGZvciB0aGUgdGltZSBmb3JtYXQgaXMgaW52YWxpZC4gUmVmZXIgdG8gdGhlIE1DSSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBmb3JtYXRzLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfTk9fQ0xPU0lOR19RVU9URToKLQkJCW1zZ3B0ciA9ICJBIGNsb3NpbmcgZG91YmxlLXF1b3RhdGlvbiBtYXJrIGlzIG1pc3NpbmcgZnJvbSB0aGUgcGFyYW1ldGVyIHZhbHVlLiBQbGVhc2Ugc3VwcGx5IG9uZS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0RVUExJQ0FURV9GTEFHUzoKLQkJCW1zZ3B0ciA9ICJBIHBhcmFtZXRlciBvciB2YWx1ZSB3YXMgc3BlY2lmaWVkIHR3aWNlLiBPbmx5IHNwZWNpZnkgaXQgb25jZS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0lOVkFMSURfRklMRToKLQkJCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIGZpbGUgY2Fubm90IGJlIHBsYXllZCBvbiB0aGUgc3BlY2lmaWVkIE1DSSBkZXZpY2UuIFRoZSBmaWxlIG1heSBiZSBjb3JydXB0LCBvciBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s6Ci0JCQltc2dwdHIgPSAiQSBudWxsIHBhcmFtZXRlciBibG9jayB3YXMgcGFzc2VkIHRvIE1DSS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1VOTkFNRURfUkVTT1VSQ0U6Ci0JCQltc2dwdHIgPSAiQ2Fubm90IHNhdmUgYW4gdW5uYW1lZCBmaWxlLiBTdXBwbHkgYSBmaWxlbmFtZS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX05FV19SRVFVSVJFU19BTElBUzoKLQkJCW1zZ3B0ciA9ICJZb3UgbXVzdCBzcGVjaWZ5IGFuIGFsaWFzIHdoZW4gdXNpbmcgdGhlICduZXcnIHBhcmFtZXRlci4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX05PVElGWV9PTl9BVVRPX09QRU46Ci0JCQltc2dwdHIgPSAiQ2Fubm90IHVzZSB0aGUgJ25vdGlmeScgZmxhZyB3aXRoIGF1dG8tb3BlbmVkIGRldmljZXMuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9OT19FTEVNRU5UX0FMTE9XRUQ6Ci0JCQltc2dwdHIgPSAiQ2Fubm90IHVzZSBhIGZpbGVuYW1lIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9OT05BUFBMSUNBQkxFX0ZVTkNUSU9OOgotCQkJbXNncHRyID0gIkNhbm5vdCBjYXJyeSBvdXQgdGhlIGNvbW1hbmRzIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuIENvcnJlY3QgdGhlIGNvbW1hbmQgc2VxdWVuY2UsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0lMTEVHQUxfRk9SX0FVVE9fT1BFTjoKLQkJCW1zZ3B0ciA9ICJDYW5ub3QgY2Fycnkgb3V0IHRoZSBzcGVjaWZpZWQgY29tbWFuZCBvbiBhbiBhdXRvLW9wZW5lZCBkZXZpY2UuIFdhaXQgdW50aWwgdGhlIGRldmljZSBpcyBjbG9zZWQsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0ZJTEVOQU1FX1JFUVVJUkVEOgotCQkJbXNncHRyID0gIlRoZSBmaWxlbmFtZSBpcyBpbnZhbGlkLiBNYWtlIHN1cmUgdGhlIGZpbGVuYW1lIGlzIG5vdCBsb25nZXIgdGhhbiA4IGNoYXJhY3RlcnMsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kIGFuZCBhbiBleHRlbnNpb24uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9FWFRSQV9DSEFSQUNURVJTOgotCQkJbXNncHRyID0gIkNhbm5vdCBzcGVjaWZ5IGV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgYSBzdHJpbmcgZW5jbG9zZWQgaW4gcXVvdGF0aW9uIG1hcmtzLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfREVWSUNFX05PVF9JTlNUQUxMRUQ6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLiBVc2UgdGhlIERyaXZlcnMgb3B0aW9uIGluIENvbnRyb2wgUGFuZWwgdG8gaW5zdGFsbCB0aGUgZGV2aWNlLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfR0VUX0NEOgotCQkJbXNncHRyID0gIkNhbm5vdCBhY2Nlc3MgdGhlIHNwZWNpZmllZCBmaWxlIG9yIE1DSSBkZXZpY2UuIFRyeSBjaGFuZ2luZyBkaXJlY3RvcmllcyBvciByZXN0YXJ0aW5nIHlvdXIgY29tcHV0ZXIuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9TRVRfQ0Q6Ci0JCQltc2dwdHIgPSAiQ2Fubm90IGFjY2VzcyB0aGUgc3BlY2lmaWVkIGZpbGUgb3IgTUNJIGRldmljZSBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBjYW5ub3QgY2hhbmdlIGRpcmVjdG9yaWVzLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfU0VUX0RSSVZFOgotCQkJbXNncHRyID0gIkNhbm5vdCBhY2Nlc3Mgc3BlY2lmaWVkIGZpbGUgb3IgTUNJIGRldmljZSBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBjYW5ub3QgY2hhbmdlIGRyaXZlcy4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX0RFVklDRV9MRU5HVEg6Ci0JCQltc2dwdHIgPSAiU3BlY2lmeSBhIGRldmljZSBvciBkcml2ZXIgbmFtZSB0aGF0IGlzIGxlc3MgdGhhbiA3OSBjaGFyYWN0ZXJzLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfREVWSUNFX09SRF9MRU5HVEg6Ci0JCQltc2dwdHIgPSAiU3BlY2lmeSBhIGRldmljZSBvciBkcml2ZXIgbmFtZSB0aGF0IGlzIGxlc3MgdGhhbiA2OSBjaGFyYWN0ZXJzLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfTk9fSU5URUdFUjoKLQkJCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIGNvbW1hbmQgcmVxdWlyZXMgYW4gaW50ZWdlciBwYXJhbWV0ZXIuIFBsZWFzZSBwcm92aWRlIG9uZS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1dBVkVfT1VUUFVUU0lOVVNFOgotCQkJbXNncHRyID0gIkFsbCB3YXZlIGRldmljZXMgdGhhdCBjYW4gcGxheSBmaWxlcyBpbiB0aGUgY3VycmVudCBmb3JtYXQgYXJlIGluIHVzZS4gV2FpdCB1bnRpbCBhIHdhdmUgZGV2aWNlIGlzIGZyZWUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1dBVkVfU0VUT1VUUFVUSU5VU0U6Ci0JCQltc2dwdHIgPSAiQ2Fubm90IHNldCB0aGUgY3VycmVudCB3YXZlIGRldmljZSBmb3IgcGxheSBiYWNrIGJlY2F1c2UgaXQgaXMgaW4gdXNlLiBXYWl0IHVudGlsIHRoZSBkZXZpY2UgaXMgZnJlZSwgYW5kIHRoZW4gdHJ5IGFnYWluLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfV0FWRV9JTlBVVFNJTlVTRToKLQkJCW1zZ3B0ciA9ICJBbGwgd2F2ZSBkZXZpY2VzIHRoYXQgY2FuIHJlY29yZCBmaWxlcyBpbiB0aGUgY3VycmVudCBmb3JtYXQgYXJlIGluIHVzZS4gV2FpdCB1bnRpbCBhIHdhdmUgZGV2aWNlIGlzIGZyZWUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1dBVkVfU0VUSU5QVVRJTlVTRToKLQkJCW1zZ3B0ciA9ICJDYW5ub3Qgc2V0IHRoZSBjdXJyZW50IHdhdmUgZGV2aWNlIGZvciByZWNvcmRpbmcgYmVjYXVzZSBpdCBpcyBpbiB1c2UuIFdhaXQgdW50aWwgdGhlIGRldmljZSBpcyBmcmVlLCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9XQVZFX09VVFBVVFVOU1BFQ0lGSUVEOgotCQkJbXNncHRyID0gIkFueSBjb21wYXRpYmxlIHdhdmVmb3JtIHBsYXliYWNrIGRldmljZSBtYXkgYmUgdXNlZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1dBVkVfSU5QVVRVTlNQRUNJRklFRDoKLQkJCW1zZ3B0ciA9ICJBbnkgY29tcGF0aWJsZSB3YXZlZm9ybSByZWNvcmRpbmcgZGV2aWNlIG1heSBiZSB1c2VkLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfV0FWRV9PVVRQVVRTVU5TVUlUQUJMRToKLQkJCW1zZ3B0ciA9ICJObyB3YXZlIGRldmljZSB0aGF0IGNhbiBwbGF5IGZpbGVzIGluIHRoZSBjdXJyZW50IGZvcm1hdCBpcyBpbnN0YWxsZWQuIFVzZSB0aGUgRHJpdmVycyBvcHRpb24gdG8gaW5zdGFsbCB0aGUgd2F2ZSBkZXZpY2UuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9XQVZFX1NFVE9VVFBVVFVOU1VJVEFCTEU6Ci0JCQltc2dwdHIgPSAiVGhlIGRldmljZSB5b3UgYXJlIHRyeWluZyB0byBwbGF5IHRvIGNhbm5vdCByZWNvZ25pemUgdGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9XQVZFX0lOUFVUU1VOU1VJVEFCTEU6Ci0JCQltc2dwdHIgPSAiTm8gd2F2ZSBkZXZpY2UgdGhhdCBjYW4gcmVjb3JkIGZpbGVzIGluIHRoZSBjdXJyZW50IGZvcm1hdCBpcyBpbnN0YWxsZWQuIFVzZSB0aGUgRHJpdmVycyBvcHRpb24gdG8gaW5zdGFsbCB0aGUgd2F2ZSBkZXZpY2UuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9XQVZFX1NFVElOUFVUVU5TVUlUQUJMRToKLQkJCW1zZ3B0ciA9ICJUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHJlY29yZCBmcm9tIGNhbm5vdCByZWNvZ25pemUgdGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9OT19XSU5ET1c6Ci0JCQltc2dwdHIgPSAiVGhlcmUgaXMgbm8gZGlzcGxheSB3aW5kb3cuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9DUkVBVEVXSU5ET1c6Ci0JCQltc2dwdHIgPSAiQ291bGQgbm90IGNyZWF0ZSBvciB1c2Ugd2luZG93LiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfRklMRV9SRUFEOgotCQkJbXNncHRyID0gIkNhbm5vdCByZWFkIHRoZSBzcGVjaWZpZWQgZmlsZS4gTWFrZSBzdXJlIHRoZSBmaWxlIGlzIHN0aWxsIHByZXNlbnQsIG9yIGNoZWNrIHlvdXIgZGlzayBvciBuZXR3b3JrIGNvbm5lY3Rpb24uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9GSUxFX1dSSVRFOgotCQkJbXNncHRyID0gIkNhbm5vdCB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBlbm91Z2ggZGlzayBzcGFjZSBvciBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSBuZXR3b3JrLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfU0VRX0RJVl9JTkNPTVBBVElCTEU6Ci0JCQltc2dwdHIgPSAiVGhlIHRpbWUgZm9ybWF0cyBvZiB0aGUgXCJzb25nIHBvaW50ZXJcIiBhbmQgU01QVEUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gWW91IGNhbid0IHVzZSB0aGVtIHRvZ2V0aGVyLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfU0VRX05PTUlESVBSRVNFTlQ6Ci0JCQltc2dwdHIgPSAiVGhlIHN5c3RlbSBoYXMgbm8gaW5zdGFsbGVkIE1JREkgZGV2aWNlcy4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiBmcm9tIHRoZSBDb250cm9sIFBhbmVsIHRvIGluc3RhbGwgYSBNSURJIGRyaXZlci4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1NFUV9QT1JUX0lOVVNFOgotCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgTUlESSBwb3J0IGlzIGFscmVhZHkgaW4gdXNlLiBXYWl0IHVudGlsIGl0IGlzIGZyZWU7IHRoZSB0cnkgYWdhaW4uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1DSUVSUl9TRVFfUE9SVF9NQVBOT0RFVklDRToKLQkJCW1zZ3B0ciA9ICJUaGUgY3VycmVudCBNSURJIE1hcHBlciBzZXR1cCByZWZlcnMgdG8gYSBNSURJIGRldmljZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIHRoZSBNSURJIE1hcHBlciBvcHRpb24gZnJvbSB0aGUgQ29udHJvbCBQYW5lbCB0byBlZGl0IHRoZSBzZXR1cC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1NFUV9QT1JUX01JU0NFUlJPUjoKLQkJCW1zZ3B0ciA9ICJBbiBlcnJvciBvY2N1cnJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9ydC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1NFUV9QT1JUX05PTkVYSVNURU5UOgotCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgTUlESSBkZXZpY2UgaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLiBVc2UgdGhlIERyaXZlcnMgb3B0aW9uIGZyb20gdGhlIENvbnRyb2wgUGFuZWwgdG8gaW5zdGFsbCBhIE1JREkgZGV2aWNlLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lFUlJfU0VRX1BPUlRVTlNQRUNJRklFRDoKLQkJCW1zZ3B0ciA9ICJUaGUgc3lzdGVtIGRvZXNub3QgaGF2ZSBhIGN1cnJlbnQgTUlESSBwb3J0IHNwZWNpZmllZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJRVJSX1NFUV9USU1FUjoKLQkJCW1zZ3B0ciA9ICJBbGwgbXVsdGltZWRpYSB0aW1lcnMgYXJlIGJlaW5nIHVzZWQgYnkgb3RoZXIgYXBwbGljYXRpb25zLiBRdWl0IG9uZSBvZiB0aGVzZSBhcHBsaWNhdGlvbnM7IHRoZW4sIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0KLS8qIAotbXNnIyA1MTMgOiB2Y3IKLW1zZyMgNTE0IDogdmlkZW9kaXNjCi1tc2cjIDUxNSA6IG92ZXJsYXkKLW1zZyMgNTE2IDogY2RhdWRpbwotbXNnIyA1MTcgOiBkYXQKLW1zZyMgNTE4IDogc2Nhbm5lcgotbXNnIyA1MTkgOiBhbmltYXRpb24KLW1zZyMgNTIwIDogZGlnaXRhbHZpZGVvCi1tc2cjIDUyMSA6IG90aGVyCi1tc2cjIDUyMiA6IHdhdmVhdWRpbwotbXNnIyA1MjMgOiBzZXF1ZW5jZXIKLW1zZyMgNTI0IDogbm90IHJlYWR5Ci1tc2cjIDUyNSA6IHN0b3BwZWQKLW1zZyMgNTI2IDogcGxheWluZwotbXNnIyA1MjcgOiByZWNvcmRpbmcKLW1zZyMgNTI4IDogc2Vla2luZwotbXNnIyA1MjkgOiBwYXVzZWQKLW1zZyMgNTMwIDogb3BlbgotbXNnIyA1MzEgOiBmYWxzZQotbXNnIyA1MzIgOiB0cnVlCi1tc2cjIDUzMyA6IG1pbGxpc2Vjb25kcwotbXNnIyA1MzQgOiBobXMKLW1zZyMgNTM1IDogbXNmCi1tc2cjIDUzNiA6IGZyYW1lcwotbXNnIyA1MzcgOiBzbXB0ZSAyNAotbXNnIyA1MzggOiBzbXB0ZSAyNQotbXNnIyA1MzkgOiBzbXB0ZSAzMAotbXNnIyA1NDAgOiBzbXB0ZSAzMCBkcm9wCi1tc2cjIDU0MSA6IGJ5dGVzCi1tc2cjIDU0MiA6IHNhbXBsZXMKLW1zZyMgNTQzIDogdG1zZgotKi8KLQkJZGVmYXVsdDoKLQkJCW1zZ3B0ciA9ICJVbmtub3duIE1DSSBFcnJvciAhXG4iOwotCQkJYnJlYWs7Ci0JfQotICAgICAgICBsc3RyY3B5bjMyQShscHN0ckJ1ZmZlciwgbXNncHRyLCB1TGVuZ3RoKTsKLQlUUkFDRShtbXN5cywgIm1zZyA9ICVzO1xuIiwgbXNncHRyKTsKLQlyZXR1cm4gVFJVRTsKKyAgICBMUFNUUgltc2dwdHI7CisgICAgVFJBQ0UobW1zeXMsICIoJTA4bFgsICVwLCAlZCk7XG4iLCAKKwkgIHdFcnJvciwgbHBzdHJCdWZmZXIsIHVMZW5ndGgpOworICAgIGlmICgobHBzdHJCdWZmZXIgPT0gTlVMTCkgfHwgKHVMZW5ndGggPCAxKSkgcmV0dXJuKEZBTFNFKTsKKyAgICBscHN0ckJ1ZmZlclswXSA9ICdcMCc7CisgICAgc3dpdGNoKHdFcnJvcikgeworICAgIGNhc2UgTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOgorCW1zZ3B0ciA9ICJJbnZhbGlkIE1DSSBkZXZpY2UgSUQuIFVzZSB0aGUgSUQgcmV0dXJuZWQgd2hlbiBvcGVuaW5nIHRoZSBNQ0kgZGV2aWNlLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfVU5SRUNPR05JWkVEX0tFWVdPUkQ6CisJbXNncHRyID0gIlRoZSBkcml2ZXIgY2Fubm90IHJlY29nbml6ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgcGFyYW1ldGVyLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ6CisJbXNncHRyID0gIlRoZSBkcml2ZXIgY2Fubm90IHJlY29nbml6ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9IQVJEV0FSRToKKwltc2dwdHIgPSAiVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggeW91ciBtZWRpYSBkZXZpY2UuIE1ha2Ugc3VyZSBpdCBpcyB3b3JraW5nIGNvcnJlY3RseSBvciBjb250YWN0IHRoZSBkZXZpY2UgbWFudWZhY3R1cmVyLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRToKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgbm90IG9wZW4gb3IgaXMgbm90IHJlY29nbml6ZWQgYnkgTUNJLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfT1VUX09GX01FTU9SWToKKwltc2dwdHIgPSAiTm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlIGZvciB0aGlzIHRhc2suIFxuUXVpdCBvbmUgb3IgbW9yZSBhcHBsaWNhdGlvbnMgdG8gaW5jcmVhc2UgYXZhaWxhYmxlIG1lbW9yeSwgYW5kIHRoZW4gdHJ5IGFnYWluLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfREVWSUNFX09QRU46CisJbXNncHRyID0gIlRoZSBkZXZpY2UgbmFtZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgYXMgYW4gYWxpYXMgYnkgdGhpcyBhcHBsaWNhdGlvbi4gVXNlIGEgdW5pcXVlIGFsaWFzLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfQ0FOTk9UX0xPQURfRFJJVkVSOgorCW1zZ3B0ciA9ICJUaGVyZSBpcyBhbiB1bmRldGVjdGFibGUgcHJvYmxlbSBpbiBsb2FkaW5nIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGRyaXZlci4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX01JU1NJTkdfQ09NTUFORF9TVFJJTkc6CisJbXNncHRyID0gIk5vIGNvbW1hbmQgd2FzIHNwZWNpZmllZC4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1BBUkFNX09WRVJGTE9XOgorCW1zZ3B0ciA9ICJUaGUgb3V0cHV0IHN0cmluZyB3YXMgdG8gbGFyZ2UgdG8gZml0IGluIHRoZSByZXR1cm4gYnVmZmVyLiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfTUlTU0lOR19TVFJJTkdfQVJHVU1FTlQ6CisJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgY29tbWFuZCByZXF1aXJlcyBhIGNoYXJhY3Rlci1zdHJpbmcgcGFyYW1ldGVyLiBQbGVhc2UgcHJvdmlkZSBvbmUuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9CQURfSU5URUdFUjoKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBpbnRlZ2VyIGlzIGludmFsaWQgZm9yIHRoaXMgY29tbWFuZC4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1BBUlNFUl9JTlRFUk5BTDoKKwltc2dwdHIgPSAiVGhlIGRldmljZSBkcml2ZXIgcmV0dXJuZWQgYW4gaW52YWxpZCByZXR1cm4gdHlwZS4gQ2hlY2sgd2l0aCB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlciBhYm91dCBvYnRhaW5pbmcgYSBuZXcgZHJpdmVyLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfRFJJVkVSX0lOVEVSTkFMOgorCW1zZ3B0ciA9ICJUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGRyaXZlci4gQ2hlY2sgd2l0aCB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlciBhYm91dCBvYnRhaW5pbmcgYSBuZXcgZHJpdmVyLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfTUlTU0lOR19QQVJBTUVURVI6CisJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgY29tbWFuZCByZXF1aXJlcyBhIHBhcmFtZXRlci4gUGxlYXNlIHN1cHBseSBvbmUuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjoKKwltc2dwdHIgPSAiVGhlIE1DSSBkZXZpY2UgeW91IGFyZSB1c2luZyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgY29tbWFuZC4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOgorCW1zZ3B0ciA9ICJDYW5ub3QgZmluZCB0aGUgc3BlY2lmaWVkIGZpbGUuIE1ha2Ugc3VyZSB0aGUgcGF0aCBhbmQgZmlsZW5hbWUgYXJlIGNvcnJlY3QuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9ERVZJQ0VfTk9UX1JFQURZOgorCW1zZ3B0ciA9ICJUaGUgZGV2aWNlIGRyaXZlciBpcyBub3QgcmVhZHkuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9JTlRFUk5BTDoKKwltc2dwdHIgPSAiQSBwcm9ibGVtIG9jY3VycmVkIGluIGluaXRpYWxpemluZyBNQ0kuIFRyeSByZXN0YXJ0aW5nIFdpbmRvd3MuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9EUklWRVI6CisJbXNncHRyID0gIlRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBkZXZpY2UgZHJpdmVyLiBUaGUgZHJpdmVyIGhhcyBjbG9zZWQuIENhbm5vdCBhY2Nlc3MgZXJyb3IuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9DQU5OT1RfVVNFX0FMTDoKKwltc2dwdHIgPSAiQ2Fubm90IHVzZSAnYWxsJyBhcyB0aGUgZGV2aWNlIG5hbWUgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9NVUxUSVBMRToKKwltc2dwdHIgPSAiRXJyb3JzIG9jY3VycmVkIGluIG1vcmUgdGhhbiBvbmUgZGV2aWNlLiBTcGVjaWZ5IGVhY2ggY29tbWFuZCBhbmQgZGV2aWNlIHNlcGFyYXRlbHkgdG8gZGV0ZXJtaW5lIHdoaWNoIGRldmljZXMgY2F1c2VkIHRoZSBlcnJvciI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfRVhURU5TSU9OX05PVF9GT1VORDoKKwltc2dwdHIgPSAiQ2Fubm90IGRldGVybWluZSB0aGUgZGV2aWNlIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9uLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfT1VUT0ZSQU5HRToKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaXMgb3V0IG9mIHJhbmdlIGZvciB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9GTEFHU19OT1RfQ09NUEFUSUJMRToKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfRklMRV9OT1RfU0FWRUQ6CisJbXNncHRyID0gIkNhbm5vdCBzYXZlIHRoZSBzcGVjaWZpZWQgZmlsZS4gTWFrZSBzdXJlIHlvdSBoYXZlIGVub3VnaCBkaXNrIHNwYWNlIG9yIGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIG5ldHdvcmsuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9ERVZJQ0VfVFlQRV9SRVFVSVJFRDoKKwltc2dwdHIgPSAiQ2Fubm90IGZpbmQgdGhlIHNwZWNpZmllZCBkZXZpY2UuIE1ha2Ugc3VyZSBpdCBpcyBpbnN0YWxsZWQgb3IgdGhhdCB0aGUgZGV2aWNlIG5hbWUgaXMgc3BlbGxlZCBjb3JyZWN0bHkuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9ERVZJQ0VfTE9DS0VEOgorCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIGRldmljZSBpcyBub3cgYmVpbmcgY2xvc2VkLiBXYWl0IGEgZmV3IHNlY29uZHMsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX0RVUExJQ0FURV9BTElBUzoKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBhbGlhcyBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4gVXNlIGEgdW5pcXVlIGFsaWFzLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfQkFEX0NPTlNUQU5UOgorCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpcyBpbnZhbGlkIGZvciB0aGlzIGNvbW1hbmQuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9NVVNUX1VTRV9TSEFSRUFCTEU6CisJbXNncHRyID0gIlRoZSBkZXZpY2UgZHJpdmVyIGlzIGFscmVhZHkgaW4gdXNlLiBUbyBzaGFyZSBpdCwgdXNlIHRoZSAnc2hhcmVhYmxlJyBwYXJhbWV0ZXIgd2l0aCBlYWNoICdvcGVuJyBjb21tYW5kLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfTUlTU0lOR19ERVZJQ0VfTkFNRToKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBjb21tYW5kIHJlcXVpcmVzIGFuIGFsaWFzLCBmaWxlLCBkcml2ZXIsIG9yIGRldmljZSBuYW1lLiBQbGVhc2Ugc3VwcGx5IG9uZS4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDoKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCB2YWx1ZSBmb3IgdGhlIHRpbWUgZm9ybWF0IGlzIGludmFsaWQuIFJlZmVyIHRvIHRoZSBNQ0kgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgZm9ybWF0cy4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX05PX0NMT1NJTkdfUVVPVEU6CisJbXNncHRyID0gIkEgY2xvc2luZyBkb3VibGUtcXVvdGF0aW9uIG1hcmsgaXMgbWlzc2luZyBmcm9tIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIFBsZWFzZSBzdXBwbHkgb25lLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfRFVQTElDQVRFX0ZMQUdTOgorCW1zZ3B0ciA9ICJBIHBhcmFtZXRlciBvciB2YWx1ZSB3YXMgc3BlY2lmaWVkIHR3aWNlLiBPbmx5IHNwZWNpZnkgaXQgb25jZS4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX0lOVkFMSURfRklMRToKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBmaWxlIGNhbm5vdCBiZSBwbGF5ZWQgb24gdGhlIHNwZWNpZmllZCBNQ0kgZGV2aWNlLiBUaGUgZmlsZSBtYXkgYmUgY29ycnVwdCwgb3Igbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdC4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOgorCW1zZ3B0ciA9ICJBIG51bGwgcGFyYW1ldGVyIGJsb2NrIHdhcyBwYXNzZWQgdG8gTUNJLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfVU5OQU1FRF9SRVNPVVJDRToKKwltc2dwdHIgPSAiQ2Fubm90IHNhdmUgYW4gdW5uYW1lZCBmaWxlLiBTdXBwbHkgYSBmaWxlbmFtZS4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX05FV19SRVFVSVJFU19BTElBUzoKKwltc2dwdHIgPSAiWW91IG11c3Qgc3BlY2lmeSBhbiBhbGlhcyB3aGVuIHVzaW5nIHRoZSAnbmV3JyBwYXJhbWV0ZXIuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9OT1RJRllfT05fQVVUT19PUEVOOgorCW1zZ3B0ciA9ICJDYW5ub3QgdXNlIHRoZSAnbm90aWZ5JyBmbGFnIHdpdGggYXV0by1vcGVuZWQgZGV2aWNlcy4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX05PX0VMRU1FTlRfQUxMT1dFRDoKKwltc2dwdHIgPSAiQ2Fubm90IHVzZSBhIGZpbGVuYW1lIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9OT05BUFBMSUNBQkxFX0ZVTkNUSU9OOgorCW1zZ3B0ciA9ICJDYW5ub3QgY2Fycnkgb3V0IHRoZSBjb21tYW5kcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiBDb3JyZWN0IHRoZSBjb21tYW5kIHNlcXVlbmNlLCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9JTExFR0FMX0ZPUl9BVVRPX09QRU46CisJbXNncHRyID0gIkNhbm5vdCBjYXJyeSBvdXQgdGhlIHNwZWNpZmllZCBjb21tYW5kIG9uIGFuIGF1dG8tb3BlbmVkIGRldmljZS4gV2FpdCB1bnRpbCB0aGUgZGV2aWNlIGlzIGNsb3NlZCwgYW5kIHRoZW4gdHJ5IGFnYWluLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfRklMRU5BTUVfUkVRVUlSRUQ6CisJbXNncHRyID0gIlRoZSBmaWxlbmFtZSBpcyBpbnZhbGlkLiBNYWtlIHN1cmUgdGhlIGZpbGVuYW1lIGlzIG5vdCBsb25nZXIgdGhhbiA4IGNoYXJhY3RlcnMsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kIGFuZCBhbiBleHRlbnNpb24uIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9FWFRSQV9DSEFSQUNURVJTOgorCW1zZ3B0ciA9ICJDYW5ub3Qgc3BlY2lmeSBleHRyYSBjaGFyYWN0ZXJzIGFmdGVyIGEgc3RyaW5nIGVuY2xvc2VkIGluIHF1b3RhdGlvbiBtYXJrcy4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOgorCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIGRldmljZSBpcyBub3QgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uIFVzZSB0aGUgRHJpdmVycyBvcHRpb24gaW4gQ29udHJvbCBQYW5lbCB0byBpbnN0YWxsIHRoZSBkZXZpY2UuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9HRVRfQ0Q6CisJbXNncHRyID0gIkNhbm5vdCBhY2Nlc3MgdGhlIHNwZWNpZmllZCBmaWxlIG9yIE1DSSBkZXZpY2UuIFRyeSBjaGFuZ2luZyBkaXJlY3RvcmllcyBvciByZXN0YXJ0aW5nIHlvdXIgY29tcHV0ZXIuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9TRVRfQ0Q6CisJbXNncHRyID0gIkNhbm5vdCBhY2Nlc3MgdGhlIHNwZWNpZmllZCBmaWxlIG9yIE1DSSBkZXZpY2UgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gY2Fubm90IGNoYW5nZSBkaXJlY3Rvcmllcy4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1NFVF9EUklWRToKKwltc2dwdHIgPSAiQ2Fubm90IGFjY2VzcyBzcGVjaWZpZWQgZmlsZSBvciBNQ0kgZGV2aWNlIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIGNhbm5vdCBjaGFuZ2UgZHJpdmVzLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfREVWSUNFX0xFTkdUSDoKKwltc2dwdHIgPSAiU3BlY2lmeSBhIGRldmljZSBvciBkcml2ZXIgbmFtZSB0aGF0IGlzIGxlc3MgdGhhbiA3OSBjaGFyYWN0ZXJzLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfREVWSUNFX09SRF9MRU5HVEg6CisJbXNncHRyID0gIlNwZWNpZnkgYSBkZXZpY2Ugb3IgZHJpdmVyIG5hbWUgdGhhdCBpcyBsZXNzIHRoYW4gNjkgY2hhcmFjdGVycy4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX05PX0lOVEVHRVI6CisJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgY29tbWFuZCByZXF1aXJlcyBhbiBpbnRlZ2VyIHBhcmFtZXRlci4gUGxlYXNlIHByb3ZpZGUgb25lLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfV0FWRV9PVVRQVVRTSU5VU0U6CisJbXNncHRyID0gIkFsbCB3YXZlIGRldmljZXMgdGhhdCBjYW4gcGxheSBmaWxlcyBpbiB0aGUgY3VycmVudCBmb3JtYXQgYXJlIGluIHVzZS4gV2FpdCB1bnRpbCBhIHdhdmUgZGV2aWNlIGlzIGZyZWUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1dBVkVfU0VUT1VUUFVUSU5VU0U6CisJbXNncHRyID0gIkNhbm5vdCBzZXQgdGhlIGN1cnJlbnQgd2F2ZSBkZXZpY2UgZm9yIHBsYXkgYmFjayBiZWNhdXNlIGl0IGlzIGluIHVzZS4gV2FpdCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZyZWUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1dBVkVfSU5QVVRTSU5VU0U6CisJbXNncHRyID0gIkFsbCB3YXZlIGRldmljZXMgdGhhdCBjYW4gcmVjb3JkIGZpbGVzIGluIHRoZSBjdXJyZW50IGZvcm1hdCBhcmUgaW4gdXNlLiBXYWl0IHVudGlsIGEgd2F2ZSBkZXZpY2UgaXMgZnJlZSwgYW5kIHRoZW4gdHJ5IGFnYWluLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfV0FWRV9TRVRJTlBVVElOVVNFOgorCW1zZ3B0ciA9ICJDYW5ub3Qgc2V0IHRoZSBjdXJyZW50IHdhdmUgZGV2aWNlIGZvciByZWNvcmRpbmcgYmVjYXVzZSBpdCBpcyBpbiB1c2UuIFdhaXQgdW50aWwgdGhlIGRldmljZSBpcyBmcmVlLCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9XQVZFX09VVFBVVFVOU1BFQ0lGSUVEOgorCW1zZ3B0ciA9ICJBbnkgY29tcGF0aWJsZSB3YXZlZm9ybSBwbGF5YmFjayBkZXZpY2UgbWF5IGJlIHVzZWQuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9XQVZFX0lOUFVUVU5TUEVDSUZJRUQ6CisJbXNncHRyID0gIkFueSBjb21wYXRpYmxlIHdhdmVmb3JtIHJlY29yZGluZyBkZXZpY2UgbWF5IGJlIHVzZWQuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9XQVZFX09VVFBVVFNVTlNVSVRBQkxFOgorCW1zZ3B0ciA9ICJObyB3YXZlIGRldmljZSB0aGF0IGNhbiBwbGF5IGZpbGVzIGluIHRoZSBjdXJyZW50IGZvcm1hdCBpcyBpbnN0YWxsZWQuIFVzZSB0aGUgRHJpdmVycyBvcHRpb24gdG8gaW5zdGFsbCB0aGUgd2F2ZSBkZXZpY2UuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9XQVZFX1NFVE9VVFBVVFVOU1VJVEFCTEU6CisJbXNncHRyID0gIlRoZSBkZXZpY2UgeW91IGFyZSB0cnlpbmcgdG8gcGxheSB0byBjYW5ub3QgcmVjb2duaXplIHRoZSBjdXJyZW50IGZpbGUgZm9ybWF0LiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfV0FWRV9JTlBVVFNVTlNVSVRBQkxFOgorCW1zZ3B0ciA9ICJObyB3YXZlIGRldmljZSB0aGF0IGNhbiByZWNvcmQgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZm9ybWF0IGlzIGluc3RhbGxlZC4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiB0byBpbnN0YWxsIHRoZSB3YXZlIGRldmljZS4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1dBVkVfU0VUSU5QVVRVTlNVSVRBQkxFOgorCW1zZ3B0ciA9ICJUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHJlY29yZCBmcm9tIGNhbm5vdCByZWNvZ25pemUgdGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9OT19XSU5ET1c6CisJbXNncHRyID0gIlRoZXJlIGlzIG5vIGRpc3BsYXkgd2luZG93LiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfQ1JFQVRFV0lORE9XOgorCW1zZ3B0ciA9ICJDb3VsZCBub3QgY3JlYXRlIG9yIHVzZSB3aW5kb3cuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9GSUxFX1JFQUQ6CisJbXNncHRyID0gIkNhbm5vdCByZWFkIHRoZSBzcGVjaWZpZWQgZmlsZS4gTWFrZSBzdXJlIHRoZSBmaWxlIGlzIHN0aWxsIHByZXNlbnQsIG9yIGNoZWNrIHlvdXIgZGlzayBvciBuZXR3b3JrIGNvbm5lY3Rpb24uIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9GSUxFX1dSSVRFOgorCW1zZ3B0ciA9ICJDYW5ub3Qgd3JpdGUgdG8gdGhlIHNwZWNpZmllZCBmaWxlLiBNYWtlIHN1cmUgeW91IGhhdmUgZW5vdWdoIGRpc2sgc3BhY2Ugb3IgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgbmV0d29yay4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1NFUV9ESVZfSU5DT01QQVRJQkxFOgorCW1zZ3B0ciA9ICJUaGUgdGltZSBmb3JtYXRzIG9mIHRoZSBcInNvbmcgcG9pbnRlclwiIGFuZCBTTVBURSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBZb3UgY2FuJ3QgdXNlIHRoZW0gdG9nZXRoZXIuIjsKKwlicmVhazsKKyAgICBjYXNlIE1DSUVSUl9TRVFfTk9NSURJUFJFU0VOVDoKKwltc2dwdHIgPSAiVGhlIHN5c3RlbSBoYXMgbm8gaW5zdGFsbGVkIE1JREkgZGV2aWNlcy4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiBmcm9tIHRoZSBDb250cm9sIFBhbmVsIHRvIGluc3RhbGwgYSBNSURJIGRyaXZlci4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1NFUV9QT1JUX0lOVVNFOgorCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIE1JREkgcG9ydCBpcyBhbHJlYWR5IGluIHVzZS4gV2FpdCB1bnRpbCBpdCBpcyBmcmVlOyB0aGUgdHJ5IGFnYWluLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfU0VRX1BPUlRfTUFQTk9ERVZJQ0U6CisJbXNncHRyID0gIlRoZSBjdXJyZW50IE1JREkgTWFwcGVyIHNldHVwIHJlZmVycyB0byBhIE1JREkgZGV2aWNlIHRoYXQgaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLiBVc2UgdGhlIE1JREkgTWFwcGVyIG9wdGlvbiBmcm9tIHRoZSBDb250cm9sIFBhbmVsIHRvIGVkaXQgdGhlIHNldHVwLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfU0VRX1BPUlRfTUlTQ0VSUk9SOgorCW1zZ3B0ciA9ICJBbiBlcnJvciBvY2N1cnJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9ydC4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1NFUV9QT1JUX05PTkVYSVNURU5UOgorCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIE1JREkgZGV2aWNlIGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiBmcm9tIHRoZSBDb250cm9sIFBhbmVsIHRvIGluc3RhbGwgYSBNSURJIGRldmljZS4iOworCWJyZWFrOworICAgIGNhc2UgTUNJRVJSX1NFUV9QT1JUVU5TUEVDSUZJRUQ6CisJbXNncHRyID0gIlRoZSBzeXN0ZW0gZG9lc25vdCBoYXZlIGEgY3VycmVudCBNSURJIHBvcnQgc3BlY2lmaWVkLiI7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lFUlJfU0VRX1RJTUVSOgorCW1zZ3B0ciA9ICJBbGwgbXVsdGltZWRpYSB0aW1lcnMgYXJlIGJlaW5nIHVzZWQgYnkgb3RoZXIgYXBwbGljYXRpb25zLiBRdWl0IG9uZSBvZiB0aGVzZSBhcHBsaWNhdGlvbnM7IHRoZW4sIHRyeSBhZ2Fpbi4iOworCWJyZWFrOworCQorCS8qIAorCSAgIG1zZyMgNTEzIDogdmNyCisJICAgbXNnIyA1MTQgOiB2aWRlb2Rpc2MKKwkgICBtc2cjIDUxNSA6IG92ZXJsYXkKKwkgICBtc2cjIDUxNiA6IGNkYXVkaW8KKwkgICBtc2cjIDUxNyA6IGRhdAorCSAgIG1zZyMgNTE4IDogc2Nhbm5lcgorCSAgIG1zZyMgNTE5IDogYW5pbWF0aW9uCisJICAgbXNnIyA1MjAgOiBkaWdpdGFsdmlkZW8KKwkgICBtc2cjIDUyMSA6IG90aGVyCisJICAgbXNnIyA1MjIgOiB3YXZlYXVkaW8KKwkgICBtc2cjIDUyMyA6IHNlcXVlbmNlcgorCSAgIG1zZyMgNTI0IDogbm90IHJlYWR5CisJICAgbXNnIyA1MjUgOiBzdG9wcGVkCisJICAgbXNnIyA1MjYgOiBwbGF5aW5nCisJICAgbXNnIyA1MjcgOiByZWNvcmRpbmcKKwkgICBtc2cjIDUyOCA6IHNlZWtpbmcKKwkgICBtc2cjIDUyOSA6IHBhdXNlZAorCSAgIG1zZyMgNTMwIDogb3BlbgorCSAgIG1zZyMgNTMxIDogZmFsc2UKKwkgICBtc2cjIDUzMiA6IHRydWUKKwkgICBtc2cjIDUzMyA6IG1pbGxpc2Vjb25kcworCSAgIG1zZyMgNTM0IDogaG1zCisJICAgbXNnIyA1MzUgOiBtc2YKKwkgICBtc2cjIDUzNiA6IGZyYW1lcworCSAgIG1zZyMgNTM3IDogc21wdGUgMjQKKwkgICBtc2cjIDUzOCA6IHNtcHRlIDI1CisJICAgbXNnIyA1MzkgOiBzbXB0ZSAzMAorCSAgIG1zZyMgNTQwIDogc21wdGUgMzAgZHJvcAorCSAgIG1zZyMgNTQxIDogYnl0ZXMKKwkgICBtc2cjIDU0MiA6IHNhbXBsZXMKKwkgICBtc2cjIDU0MyA6IHRtc2YKKwkqLworICAgIGRlZmF1bHQ6CisJbXNncHRyID0gIlVua25vd24gTUNJIEVycm9yICFcbiI7CisJYnJlYWs7CisgICAgfQorICAgIGxzdHJjcHluMzJBKGxwc3RyQnVmZmVyLCBtc2dwdHIsIHVMZW5ndGgpOworICAgIFRSQUNFKG1tc3lzLCAibXNnID0gJXM7XG4iLCBtc2dwdHIpOworICAgIHJldHVybiBUUlVFOwogfQogCiAKQEAgLTEyODEsMTIgKzEzMDQsMTIgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBtY2lEcml2ZXJOb3RpZnkoSFdORDE2IGhXbmRDYWxsQmFjaywgVUlOVDE2IHdEZXZJRCwgVUlOVDE2IHdTdGF0dXMpCiB7Ci0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXUsICUwNFgpXG4iLCBoV25kQ2FsbEJhY2ssIHdEZXZJRCwgd1N0YXR1cyk7Ci0JaWYgKCFJc1dpbmRvdzMyKGhXbmRDYWxsQmFjaykpIHJldHVybiBGQUxTRTsKLQlUUkFDRShtbXN5cywgImJlZm9yZSBQb3N0TWVzc2FnZVxuIik7Ci0JUG9zdE1lc3NhZ2UxNiggaFduZENhbGxCYWNrLCBNTV9NQ0lOT1RJRlksIHdTdGF0dXMsIAotICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyh3RGV2SUQsIDApKTsKLQlyZXR1cm4gVFJVRTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAldSwgJTA0WClcbiIsIGhXbmRDYWxsQmFjaywgd0RldklELCB3U3RhdHVzKTsKKyAgICBpZiAoIUlzV2luZG93MzIoaFduZENhbGxCYWNrKSkgcmV0dXJuIEZBTFNFOworICAgIFRSQUNFKG1tc3lzLCAiYmVmb3JlIFBvc3RNZXNzYWdlXG4iKTsKKyAgICBQb3N0TWVzc2FnZTE2KCBoV25kQ2FsbEJhY2ssIE1NX01DSU5PVElGWSwgd1N0YXR1cywgCisJCSAgIE1BS0VMT05HKHdEZXZJRCwgMCkpOworICAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyOTUsMTg2ICsxMzE4LDE3NyBAQAogCiBEV09SRCBtY2lPcGVuKERXT1JEIGR3UGFyYW0sIExQTUNJX09QRU5fUEFSTVMxNiBscDE2UGFybXMpCiB7Ci0JY2hhcglzdHJbMTI4XTsKLQlMUE1DSV9PUEVOX1BBUk1TMTYgbHBQYXJtczsKLQlVSU5UMTYJdURldlR5cCA9IDA7Ci0JVUlOVDE2CXdEZXZJRCA9IE1NU1lTVEVNX0ZpcnN0RGV2SUQoKTsKLQlEV09SRCBkd3JldDsKLQotCWxwUGFybXMgPSBQVFJfU0VHX1RPX0xJTihscDE2UGFybXMpOwotCVRSQUNFKG1tc3lzLCAiKCUwOGxYLCAlcCAoJXApKVxuIiwgZHdQYXJhbSwgbHAxNlBhcm1zLCBscFBhcm1zKTsKLQlpZiAobHAxNlBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0KLQl3aGlsZShHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSAhPSAwKSB7Ci0JCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOwotCQlpZiAoIU1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSkgewotCQkJVFJBQ0UobW1zeXMsICJNQVhNQ0lEUklWRVJTIHJlYWNoZWQgIVxuIik7Ci0JCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQl9CisgICAgY2hhcgkJc3RyWzEyOF07CisgICAgTFBNQ0lfT1BFTl9QQVJNUzE2CWxwUGFybXM7CisgICAgVUlOVDE2CQl1RGV2VHlwID0gMDsKKyAgICBVSU5UMTYJCXdEZXZJRCA9IE1NU1lTVEVNX0ZpcnN0RGV2SUQoKTsKKyAgICBEV09SRCAJCWR3cmV0OworICAgIAorICAgIGxwUGFybXMgPSBQVFJfU0VHX1RPX0xJTihscDE2UGFybXMpOworICAgIFRSQUNFKG1tc3lzLCAiKCUwOGxYLCAlcCAoJXApKVxuIiwgZHdQYXJhbSwgbHAxNlBhcm1zLCBscFBhcm1zKTsKKyAgICBpZiAobHAxNlBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisgICAgCisgICAgd2hpbGUoR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUgIT0gMCkgeworCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOworCWlmICghTU1TWVNURU1fRGV2SURWYWxpZCh3RGV2SUQpKSB7CisJICAgIFRSQUNFKG1tc3lzLCAiTUFYTUNJRFJJVkVSUyByZWFjaGVkICFcbiIpOworCSAgICByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCX0KLQlUUkFDRShtbXN5cywgIndEZXZJRD0lMDRYIFxuIiwgd0RldklEKTsKLQltZW1jcHkoR2V0T3BlbkRydih3RGV2SUQpLGxwUGFybXMsc2l6ZW9mKCpscFBhcm1zKSk7Ci0KLQlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKLQkJY2hhcgkqcywqdDsKLQotCQlUUkFDRShtbXN5cywibHBzdHJFbGVtZW50TmFtZT0nJXMnXG4iLAotCQkJKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpCi0JCSk7Ci0JCXM9KGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwotCQl0PXN0cnJjaHIocywnLicpOwotCQlpZiAodCkgewotCQkJR2V0UHJvZmlsZVN0cmluZzMyQSgibWNpIGV4dGVuc2lvbnMiLHQrMSwiKiIsc3RyLHNpemVvZihzdHIpKTsKLQkJCUNoYXJVcHBlcjMyQShzdHIpOwotCQkJVFJBQ0UobW1zeXMsICJzdHIgPSAlcyBcbiIsIHN0cik7Ci0JCQlpZiAoc3RyY21wKHN0ciwgIkNEQVVESU8iKSA9PSAwKSB7Ci0JCQkJdURldlR5cCA9IE1DSV9ERVZUWVBFX0NEX0FVRElPOwotCQkJfSBlbHNlCi0JCQlpZiAoc3RyY21wKHN0ciwgIldBVkVBVURJTyIpID09IDApIHsKLQkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU87Ci0JCQl9IGVsc2UKLQkJCWlmIChzdHJjbXAoc3RyLCAiU0VRVUVOQ0VSIikgPT0gMCkJewotCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI7Ci0JCQl9IGVsc2UKLQkJCWlmIChzdHJjbXAoc3RyLCAiQU5JTUFUSU9OMSIpID09IDApIHsKLQkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfQU5JTUFUSU9OOwotCQkJfSBlbHNlCi0JCQlpZiAoc3RyY21wKHN0ciwgIkFWSVZJREVPIikgPT0gMCkgewotCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOwotCQkJfSBlbHNlIAotCQkJaWYgKHN0cmNtcChzdHIsIioiKSA9PSAwKSB7Ci0JCQkJVFJBQ0UobW1zeXMsIk5vIFttY2kgZXh0ZW5zaW9uc10gZW50cnkgZm9yICVzIGZvdW5kLlxuIix0KTsKLQkJCQlyZXR1cm4gTUNJRVJSX0VYVEVOU0lPTl9OT1RfRk9VTkQ7CisgICAgfQorICAgIFRSQUNFKG1tc3lzLCAid0RldklEPSUwNFggXG4iLCB3RGV2SUQpOworICAgIG1lbWNweShHZXRPcGVuRHJ2KHdEZXZJRCksbHBQYXJtcyxzaXplb2YoKmxwUGFybXMpKTsKKyAgICAKKyAgICBpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKKwljaGFyCSpzLCp0OworCQorCVRSQUNFKG1tc3lzLCJscHN0ckVsZW1lbnROYW1lPSclcydcbiIsCisJICAgICAgKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpCisJICAgICAgKTsKKwlzPShjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKKwl0PXN0cnJjaHIocywnLicpOworCWlmICh0KSB7CisJICAgIEdldFByb2ZpbGVTdHJpbmczMkEoIm1jaSBleHRlbnNpb25zIix0KzEsIioiLHN0cixzaXplb2Yoc3RyKSk7CisJICAgIENoYXJVcHBlcjMyQShzdHIpOworCSAgICBUUkFDRShtbXN5cywgInN0ciA9ICVzIFxuIiwgc3RyKTsKKwkgICAgaWYgKHN0cmNtcChzdHIsICJDREFVRElPIikgPT0gMCkgeworCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfQ0RfQVVESU87CisJICAgIH0gZWxzZSBpZiAoc3RyY21wKHN0ciwgIldBVkVBVURJTyIpID09IDApIHsKKwkJdURldlR5cCA9IE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOworCSAgICB9IGVsc2UgaWYgKHN0cmNtcChzdHIsICJTRVFVRU5DRVIiKSA9PSAwKQl7CisJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI7CisJICAgIH0gZWxzZSBpZiAoc3RyY21wKHN0ciwgIkFOSU1BVElPTjEiKSA9PSAwKSB7CisJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9BTklNQVRJT047CisJICAgIH0gZWxzZSBpZiAoc3RyY21wKHN0ciwgIkFWSVZJREVPIikgPT0gMCkgeworCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzsKKwkgICAgfSBlbHNlIGlmIChzdHJjbXAoc3RyLCIqIikgPT0gMCkgeworCQlUUkFDRShtbXN5cywiTm8gW21jaSBleHRlbnNpb25zXSBlbnRyeSBmb3IgJXMgZm91bmQuXG4iLHQpOworCQlyZXR1cm4gTUNJRVJSX0VYVEVOU0lPTl9OT1RfRk9VTkQ7CiAjaWYgdGVzdGluZzE2Ci0JCQl9IGVsc2UgIHsKLQkJCQlIRFJWUjE2IGhkcnYgPSBPcGVuRHJpdmVyKHN0ciwibWNpIixOVUxMKTsKLQkJCQlpZiAoaGRydikgewotCQkJCQlITU9EVUxFMTYJaG1vZDsKLQotCQkJCQlobW9kID0gR2V0RHJpdmVyTW9kdWxlSGFuZGxlKGhkcnYpOwotCQkJCQlHZXREcnYod0RldklEKS0+aGRydiA9IGhkcnY7Ci0JCQkJCUdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jID0gR2V0UHJvY0FkZHJlc3MxNihobW9kLFNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUCgiRFJJVkVSUFJPQyIpKSk7Ci0JCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9PVEhFUjsKLQkJCQl9IGVsc2UgewotCQkJCQlGSVhNRShtbXN5cywgIlttY2kgZXh0ZW5zaW9uc10gZW50cnkgJXMgZm9yICVzIG5vdCBzdXBwb3J0ZWQuXG4iLHN0cix0KTsKLQkJCQkJcmV0dXJuIE1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDsKLQkJCQl9Ci0jZW5kaWYKLQkJCX0KLQkJfSBlbHNlCi0JCQlyZXR1cm4gTUNJRVJSX0VYVEVOU0lPTl9OT1RfRk9VTkQ7Ci0JfQotCi0JaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9BTElBUykgewotCQlUUkFDRShtbXN5cywgIkFsaWFzPSclcycgIVxuIiwKLQkJCShjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckFsaWFzKSk7Ci0gICAgICAgICAgICAgICAgR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckFsaWFzID0gKExQU1RSKVNFR1BUUl9HRVQoCi0gICAgICAgICAgICAgICAgICAgIFNFR1BUUl9TVFJEVVAoKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyQWxpYXMpKSk7Ci0JCS8qIG1wbGF5ZXIgZG9lcyBhbGxvY2F0ZSBhbGlhcyB0byBDREFVRElPICovCi0JfQotCWlmIChkd1BhcmFtICYgTUNJX09QRU5fVFlQRSkgewotCQlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX1RZUEVfSUQpIHsKLQkJCVRSQUNFKG1tc3lzLCAiRGV2PSUwOGx4IVxuIiwgKERXT1JEKWxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7Ci0JCQl1RGV2VHlwID0gTE9XT1JEKChEV09SRClscFBhcm1zLT5scHN0ckRldmljZVR5cGUpOwotIAkJCUdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlPShMUFNUUilscFBhcm1zLT5scHN0ckRldmljZVR5cGU7CisJICAgIH0gZWxzZSAgeworCQlIRFJWUjE2IGhkcnYgPSBPcGVuRHJpdmVyKHN0ciwibWNpIixOVUxMKTsKKwkJaWYgKGhkcnYpIHsKKwkJICAgIEhNT0RVTEUxNglobW9kOworCQkgICAgCisJCSAgICBobW9kID0gR2V0RHJpdmVyTW9kdWxlSGFuZGxlKGhkcnYpOworCQkgICAgR2V0RHJ2KHdEZXZJRCktPmhkcnYgPSBoZHJ2OworCQkgICAgR2V0RHJ2KHdEZXZJRCktPmRyaXZlcnByb2MgPSBHZXRQcm9jQWRkcmVzczE2KGhtb2QsU0VHUFRSX0dFVChTRUdQVFJfU1RSRFVQKCJEUklWRVJQUk9DIikpKTsKKwkJICAgIHVEZXZUeXAgPSBNQ0lfREVWVFlQRV9PVEhFUjsKIAkJfSBlbHNlIHsKLQkJCWlmIChscFBhcm1zLT5scHN0ckRldmljZVR5cGUgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJCVRSQUNFKG1tc3lzLCAiRGV2PSclcycgIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckRldmljZVR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlPShMUFNUUilTRUdQVFJfR0VUKAotICAgICAgICAgICAgICBTRUdQVFJfU1RSRFVQKChjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckRldmljZVR5cGUpKSk7Ci0JCQlzdHJjcHkoc3RyLCBQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckRldmljZVR5cGUpKTsKLQkJCUNoYXJVcHBlcjMyQShzdHIpOwotCQkJaWYgKHN0cmNtcChzdHIsICJDREFVRElPIikgPT0gMCkgewotCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsKLQkJCX0gZWxzZQotCQkJaWYgKHN0cmNtcChzdHIsICJXQVZFQVVESU8iKSA9PSAwKSB7Ci0JCQkJdURldlR5cCA9IE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOwotCQkJfSBlbHNlCi0JCQlpZiAoc3RyY21wKHN0ciwgIlNFUVVFTkNFUiIpID09IDApCXsKLQkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOwotCQkJfSBlbHNlCi0JCQlpZiAoc3RyY21wKHN0ciwgIkFOSU1BVElPTjEiKSA9PSAwKSB7Ci0JCQkJdURldlR5cCA9IE1DSV9ERVZUWVBFX0FOSU1BVElPTjsKLQkJCX0gZWxzZQotCQkJaWYgKHN0cmNtcChzdHIsICJBVklWSURFTyIpID09IDApIHsKLQkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzsKLQkJCX0gZWxzZSB7Ci0jaWYgdGVzdGluZzE2Ci0JCQkJSERSVlIxNiBoZHJ2OwotCQkJCVRSQUNFKG1tc3lzLCJ0cnlpbmcgdG8gbG9hZCBkcml2ZXIuLi5cbiIpOwotCQkJCWhkcnYgPSBPcGVuRHJpdmVyKHN0ciwibWNpIixOVUxMKTsKLQkJCQlpZiAoaGRydikgewotCQkJCQlITU9EVUxFMTYJaG1vZDsKLQotCQkJCQlobW9kID0gR2V0RHJpdmVyTW9kdWxlSGFuZGxlKGhkcnYpOwotCQkJCQlHZXREcnYod0RldklEKS0+aGRydiA9IGhkcnY7Ci0JCQkJCUdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jID0gR2V0UHJvY0FkZHJlc3MxNihobW9kLFNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUCgiRFJJVkVSUFJPQyIpKSk7Ci0JCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9PVEhFUjsKLQkJCQl9IGVsc2UKLSNlbmRpZgotCQkJCQlyZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwotCQkJfQorCQkgICAgRklYTUUobW1zeXMsICJbbWNpIGV4dGVuc2lvbnNdIGVudHJ5ICVzIGZvciAlcyBub3Qgc3VwcG9ydGVkLlxuIixzdHIsdCk7CisJCSAgICByZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwogCQl9Ci0JfQotCUdldERydih3RGV2SUQpLT5tb2RwLndUeXBlID0gdURldlR5cDsKLQlHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQgPSAwOyAgLyogRklYTUU/IGZvciBtdWx0aXBsZSBkZXZpY2VzICovCi0JbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOwotCVRSQUNFKG1tc3lzLCAibWNpZGV2PSVkLCB1RGV2VHlwPSUwNFggd0RldmljZUlEPSUwNFggIVxuIiwgCi0JCQkJd0RldklELCB1RGV2VHlwLCBscFBhcm1zLT53RGV2aWNlSUQpOwotCXN3aXRjaCh1RGV2VHlwKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86Ci0JICBkd3JldCA9IENEQVVESU9fRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLAotCQkJCSAgICAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKLQkgIGR3cmV0ID0gIFdBVkVfRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKLQkJCQkgICBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKLQkgIGJyZWFrOwotCWNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOgotCSAgZHdyZXQgPSBNSURJX0RyaXZlclByb2MoIDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCi0JCQkJICBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKLQkgIGJyZWFrOwotICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKLQkgIGR3cmV0ID0gQU5JTV9Ecml2ZXJQcm9jKCAwLCAwLCBNQ0lfT1BFTl9EUklWRVIsIAotCQkJCSAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOgotCSAgVFJBQ0UobW1zeXMsICJObyBESUdJVEFMX1ZJREVPIHlldCAhXG4iKTsKLQkgIHJldHVybiBNQ0lFUlJfREVWSUNFX05PVF9JTlNUQUxMRUQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0jaWYgdGVzdGluZzE2Ci0JICBkd3JldCA9IENhbGxiYWNrcy0+Q2FsbERyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPmRyaXZlcnByb2MsMCxHZXREcnYod0RldklEKS0+aGRydixNQ0lfT1BFTl9EUklWRVIsZHdQYXJhbSwoRFdPUkQpbHAxNlBhcm1zKTsKLQkgIFdBUk4obW1zeXMsICJJbnZhbGlkIERldmljZSBOYW1lICclMDhseCcgIVxuIiwgKERXT1JEKWxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7CiAjZW5kaWYKLQkgIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRTsKLSAgICAgICAgfQotCi0KLQlpZiAoZHdQYXJhbSZNQ0lfTk9USUZZKQotCSAgbWNpRHJpdmVyTm90aWZ5KGxwUGFybXMtPmR3Q2FsbGJhY2ssd0RldklELAotCQkJICAoZHdyZXQ9PTA/TUNJX05PVElGWV9TVUNDRVNTRlVMOk1DSV9OT1RJRllfRkFJTFVSRSkpOwotCi0JLyogb25seSBoYW5kbGVkIGRldmljZXMgZmFsbCB0aHJvdWdoICovCi0JVFJBQ0UobW1zeXMsICJ3RGV2SUQgPSAlMDRYIHdEZXZpY2VJRCA9ICVkIGR3cmV0ID0gJWxkXG4iLHdEZXZJRCwgbHBQYXJtcy0+d0RldmljZUlELCBkd3JldCk7Ci0JcmV0dXJuIGR3cmV0OworCSAgICB9CisJfSBlbHNlCisJICAgIHJldHVybiBNQ0lFUlJfRVhURU5TSU9OX05PVF9GT1VORDsKKyAgICB9CisgICAgCisgICAgaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9BTElBUykgeworCVRSQUNFKG1tc3lzLCAiQWxpYXM9JyVzJyAhXG4iLAorCSAgICAgIChjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckFsaWFzKSk7CisJR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckFsaWFzID0gKExQU1RSKVNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUCgoY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJBbGlhcykpKTsKKwkvKiBtcGxheWVyIGRvZXMgYWxsb2NhdGUgYWxpYXMgdG8gQ0RBVURJTyAqLworICAgIH0KKyAgICBpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX1RZUEUpIHsKKwlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX1RZUEVfSUQpIHsKKwkgICAgVFJBQ0UobW1zeXMsICJEZXY9JTA4bHghXG4iLCAoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKKwkgICAgdURldlR5cCA9IExPV09SRCgoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKKwkgICAgR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckRldmljZVR5cGU9KExQU1RSKWxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZTsKKwl9IGVsc2UgeworCSAgICBpZiAobHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisJICAgIFRSQUNFKG1tc3lzLCAiRGV2PSclcycgIVxuIiwKKwkJICAoY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKSk7CisJICAgIEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlPShMUFNUUilTRUdQVFJfR0VUKAorCQkJCQkJCQkgIFNFR1BUUl9TVFJEVVAoKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSkpKTsKKwkgICAgc3RyY3B5KHN0ciwgUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKSk7CisJICAgIENoYXJVcHBlcjMyQShzdHIpOworCSAgICBpZiAoc3RyY21wKHN0ciwgIkNEQVVESU8iKSA9PSAwKSB7CisJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsKKwkgICAgfSBlbHNlIGlmIChzdHJjbXAoc3RyLCAiV0FWRUFVRElPIikgPT0gMCkgeworCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU87CisJICAgIH0gZWxzZSBpZiAoc3RyY21wKHN0ciwgIlNFUVVFTkNFUiIpID09IDApCXsKKwkJdURldlR5cCA9IE1DSV9ERVZUWVBFX1NFUVVFTkNFUjsKKwkgICAgfSBlbHNlIGlmIChzdHJjbXAoc3RyLCAiQU5JTUFUSU9OMSIpID09IDApIHsKKwkJdURldlR5cCA9IE1DSV9ERVZUWVBFX0FOSU1BVElPTjsKKwkgICAgfSBlbHNlIGlmIChzdHJjbXAoc3RyLCAiQVZJVklERU8iKSA9PSAwKSB7CisJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOworCSAgICB9IGVsc2UgeworI2lmIHRlc3RpbmcxNgorCQlIRFJWUjE2IGhkcnY7CisJCVRSQUNFKG1tc3lzLCJ0cnlpbmcgdG8gbG9hZCBkcml2ZXIuLi5cbiIpOworCQloZHJ2ID0gT3BlbkRyaXZlcihzdHIsIm1jaSIsTlVMTCk7CisJCWlmIChoZHJ2KSB7CisJCSAgICBITU9EVUxFMTYJaG1vZDsKKwkJICAgIAorCQkgICAgaG1vZCA9IEdldERyaXZlck1vZHVsZUhhbmRsZShoZHJ2KTsKKwkJICAgIEdldERydih3RGV2SUQpLT5oZHJ2ID0gaGRydjsKKwkJICAgIEdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jID0gR2V0UHJvY0FkZHJlc3MxNihobW9kLFNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUCgiRFJJVkVSUFJPQyIpKSk7CisJCSAgICB1RGV2VHlwID0gTUNJX0RFVlRZUEVfT1RIRVI7CisJCX0gZWxzZQorI2VuZGlmCisJCSAgICByZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOworCSAgICB9CisJfQorICAgIH0KKyAgICBHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSA9IHVEZXZUeXA7CisgICAgR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlEID0gMDsgIC8qIEZJWE1FPyBmb3IgbXVsdGlwbGUgZGV2aWNlcyAqLworICAgIGxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsKKyAgICBUUkFDRShtbXN5cywgIm1jaWRldj0lZCwgdURldlR5cD0lMDRYIHdEZXZpY2VJRD0lMDRYICFcbiIsIAorCSAgd0RldklELCB1RGV2VHlwLCBscFBhcm1zLT53RGV2aWNlSUQpOworICAgIHN3aXRjaCh1RGV2VHlwKSB7CisgICAgY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzoKKwlkd3JldCA9IENEQVVESU9fRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLAorCQkJCSAgICBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKKwlicmVhazsKKyAgICBjYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOgorCWR3cmV0ID0gIFdBVkVfRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKKwkJCQkgIGR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOworCWJyZWFrOworICAgIGNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOgorCWR3cmV0ID0gTUlESV9Ecml2ZXJQcm9jKCAwLCAwLCBNQ0lfT1BFTl9EUklWRVIsIAorCQkJCSBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKKwlicmVhazsKKyAgICBjYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKKwlkd3JldCA9IEFOSU1fRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKKwkJCQkgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CisJYnJlYWs7CisgICAgY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOgorCVRSQUNFKG1tc3lzLCAiTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7CisJcmV0dXJuIE1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDsKKyAgICBkZWZhdWx0OgorI2lmIHRlc3RpbmcxNgorCWR3cmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYywwLEdldERydih3RGV2SUQpLT5oZHJ2LE1DSV9PUEVOX0RSSVZFUixkd1BhcmFtLChEV09SRClscDE2UGFybXMpOworCVdBUk4obW1zeXMsICJJbnZhbGlkIERldmljZSBOYW1lICclMDhseCcgIVxuIiwgKERXT1JEKWxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7CisjZW5kaWYKKwlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX05BTUU7CisgICAgfQorICAgIAorICAgIAorICAgIGlmIChkd1BhcmFtJk1DSV9OT1RJRlkpCisJbWNpRHJpdmVyTm90aWZ5KGxwUGFybXMtPmR3Q2FsbGJhY2ssd0RldklELAorCQkJKGR3cmV0PT0wP01DSV9OT1RJRllfU1VDQ0VTU0ZVTDpNQ0lfTk9USUZZX0ZBSUxVUkUpKTsKKyAgICAKKyAgICAvKiBvbmx5IGhhbmRsZWQgZGV2aWNlcyBmYWxsIHRocm91Z2ggKi8KKyAgICBUUkFDRShtbXN5cywgIndEZXZJRCA9ICUwNFggd0RldmljZUlEID0gJWQgZHdyZXQgPSAlbGRcbiIsd0RldklELCBscFBhcm1zLT53RGV2aWNlSUQsIGR3cmV0KTsKKyAgICByZXR1cm4gZHdyZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJbWNpR2V0RHJpdmVyRGF0YQkJCVtNTVNZU1RFTS43MDhdCiAgKi8KLURXT1JEIFdJTkFQSSBtY2lHZXREcml2ZXJEYXRhMTYoSERSVlIxNiBoZHJ2KSB7Ci0gICAgICAgIEZJWE1FKG1tc3lzLCIoJTA0eCk6IHN0dWIhXG4iLGhkcnYpOwotCXJldHVybiAweDQyOworRFdPUkQgV0lOQVBJIG1jaUdldERyaXZlckRhdGExNihIRFJWUjE2IGhkcnYpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCk6IHN0dWIhXG4iLGhkcnYpOworICAgIHJldHVybiAweDQyOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCW1jaVNldERyaXZlckRhdGEJCQlbTU1TWVNURU0uNzA3XQogICovCi1EV09SRCBXSU5BUEkgbWNpU2V0RHJpdmVyRGF0YTE2KEhEUlZSMTYgaGRydixEV09SRCBkYXRhKSB7Ci0JRklYTUUobW1zeXMsIiglMDR4LCUwOGx4KTogc3R1YiFcbiIsaGRydixkYXRhKTsKLQlyZXR1cm4gMDsKK0RXT1JEIFdJTkFQSSBtY2lTZXREcml2ZXJEYXRhMTYoSERSVlIxNiBoZHJ2LERXT1JEIGRhdGEpIAoreworICAgIEZJWE1FKG1tc3lzLCIoJTA0eCwlMDhseCk6IHN0dWIhXG4iLGhkcnYsZGF0YSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ4Miw0NiArMTQ5Niw0OSBAQAogICovCiBEV09SRCBtY2lDbG9zZShVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7Ci0JRFdPUkQJZHdSZXQgPSBNQ0lFUlJfSU5URVJOQUw7Ci0KLQlUUkFDRShtbXN5cywgIiglMDR4LCAlMDhsWCwgJXApXG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwotCWlmKHdEZXZJRD09TUNJX0FMTF9ERVZJQ0VfSUQpIHsKLQkgIEZJWE1FKG1tc3lzLCAidW5oYW5kbGVkIE1DSV9BTExfREVWSUNFX0lEXG4iKTsKLQkgIHJldHVybiBNQ0lFUlJfQ0FOTk9UX1VTRV9BTEw7Ci0JfQotCXN3aXRjaChHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSkgewotCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86Ci0JCWR3UmV0ID0gQ0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwwLAorICAgIERXT1JECWR3UmV0ID0gTUNJRVJSX0lOVEVSTkFMOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNHgsICUwOGxYLCAlcClcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CisgICAgaWYod0RldklEPT1NQ0lfQUxMX0RFVklDRV9JRCkgeworCUZJWE1FKG1tc3lzLCAidW5oYW5kbGVkIE1DSV9BTExfREVWSUNFX0lEXG4iKTsKKwlyZXR1cm4gTUNJRVJSX0NBTk5PVF9VU0VfQUxMOworICAgIH0KKyAgICBzd2l0Y2goR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUpIHsKKyAgICBjYXNlIE1DSV9ERVZUWVBFX0NEX0FVRElPOgorCWR3UmV0ID0gQ0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwwLAogCQkJCSAgIE1DSV9DTE9TRSwgZHdQYXJhbSwgKERXT1JEKWxwUGFybXMpOwotCQlicmVhazsKLQljYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOgotCQlkd1JldCA9IFdBVkVfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsIDAsIAotCQkJCQlNQ0lfQ0xPU0UsIGR3UGFyYW0sCi0JCQkJCShEV09SRClscFBhcm1zKTsKLQkJYnJlYWs7Ci0JY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6Ci0JCWR3UmV0ID0gTUlESV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwgMCwgCi0JCQkJCU1DSV9DTE9TRSwgZHdQYXJhbSwKLQkJCQkJKERXT1JEKWxwUGFybXMpOwotCQlicmVhazsKKwlicmVhazsKKyAgICBjYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOgorCWR3UmV0ID0gV0FWRV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwgMCwgCisJCQkJTUNJX0NMT1NFLCBkd1BhcmFtLAorCQkJCShEV09SRClscFBhcm1zKTsKKwlicmVhazsKKyAgICBjYXNlIE1DSV9ERVZUWVBFX1NFUVVFTkNFUjoKKwlkd1JldCA9IE1JRElfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsIDAsIAorCQkJCU1DSV9DTE9TRSwgZHdQYXJhbSwKKwkJCQkoRFdPUkQpbHBQYXJtcyk7CisJYnJlYWs7CiAJLyoKLQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKLQkJZHdSZXQgPSBBTklNX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELCAwLCAKLQkJCQkJTUNJX0NMT1NFLCBkd1BhcmFtLAotCQkJCQkoRFdPUkQpbHBQYXJtcyk7Ci0JCWJyZWFrOwotCSAqLwotCWRlZmF1bHQ6Ci0JCWR3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYyxHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsR2V0RHJ2KHdEZXZJRCktPmhkcnYsTUNJX0NMT1NFLGR3UGFyYW0sKERXT1JEKWxwUGFybXMpOwotCX0KLQlHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSA9IDA7Ci0KLQlpZiAoZHdQYXJhbSZNQ0lfTk9USUZZKQotCSAgbWNpRHJpdmVyTm90aWZ5KGxwUGFybXMtPmR3Q2FsbGJhY2ssd0RldklELAotCQkJICAoZHdSZXQ9PTA/TUNJX05PVElGWV9TVUNDRVNTRlVMOk1DSV9OT1RJRllfRkFJTFVSRSkpOwotCi0JVFJBQ0UobW1zeXMsICJyZXR1cm5zICVsZFxuIixkd1JldCk7Ci0JcmV0dXJuIGR3UmV0OworCSAgY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046CisJICBkd1JldCA9IEFOSU1fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsIDAsIAorCSAgTUNJX0NMT1NFLCBkd1BhcmFtLAorCSAgKERXT1JEKWxwUGFybXMpOworCSAgYnJlYWs7CisJKi8KKyAgICBkZWZhdWx0OgorCWR3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYywKKwkJCQkJICBHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsCisJCQkJCSAgR2V0RHJ2KHdEZXZJRCktPmhkcnYsTUNJX0NMT1NFLGR3UGFyYW0sCisJCQkJCSAgKERXT1JEKWxwUGFybXMpOworICAgIH0KKyAgICBHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSA9IDA7CisgICAgCisgICAgaWYgKGR3UGFyYW0mTUNJX05PVElGWSkKKwltY2lEcml2ZXJOb3RpZnkobHBQYXJtcy0+ZHdDYWxsYmFjayx3RGV2SUQsCisJCQkoZHdSZXQ9PTA/TUNJX05PVElGWV9TVUNDRVNTRlVMOk1DSV9OT1RJRllfRkFJTFVSRSkpOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAicmV0dXJucyAlbGRcbiIsZHdSZXQpOworICAgIHJldHVybiBkd1JldDsKIH0KIAogCkBAIC0xNTMwLDQ3ICsxNTQ3LDQ4IEBACiAgKi8KIERXT1JEIG1jaVN5c0luZm8oRFdPUkQgZHdGbGFncywgTFBNQ0lfU1lTSU5GT19QQVJNUzE2IGxwUGFybXMpCiB7Ci0JaW50CWxlbjsKLQlMUFNUUglwdHI7Ci0JTFBTVFIJbHBzdHJSZXR1cm47Ci0JRFdPUkQJKmxwZHdSZXQ7Ci0JTFBTVFIJU3lzRmlsZSA9ICJTWVNURU0uSU5JIjsKLQlUUkFDRShtY2ksICIoJTA4bFgsICUwOGxYKVxuIiwgZHdGbGFncywgKERXT1JEKWxwUGFybXMpOwotCWxwc3RyUmV0dXJuID0gUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJSZXR1cm4pOwotCXN3aXRjaChkd0ZsYWdzKSB7Ci0JY2FzZSBNQ0lfU1lTSU5GT19RVUFOVElUWToKLQkJVFJBQ0UobWNpLCAiTUNJX1NZU0lORk9fUVVBTlRJVFkgXG4iKTsKLQkJbHBkd1JldCA9IChEV09SRCAqKWxwc3RyUmV0dXJuOwotCQkqKGxwZHdSZXQpID0gSW5zdGFsbGVkQ291bnQ7Ci0JCXJldHVybiAwOwotCWNhc2UgTUNJX1NZU0lORk9fSU5TVEFMTE5BTUU6Ci0JCVRSQUNFKG1jaSwgIk1DSV9TWVNJTkZPX0lOU1RBTExOQU1FIFxuIik7Ci0JCWlmIChscEluc3RhbGxOYW1lcyA9PSBOVUxMKSB7Ci0JCQlJbnN0YWxsZWRDb3VudCA9IDA7Ci0JCQlJbnN0YWxsZWRMaXN0TGVuID0gMDsKLQkJCXB0ciA9IGxwSW5zdGFsbE5hbWVzID0geG1hbGxvYygyMDQ4KTsKLQkJCUdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCJtY2kiLCBOVUxMLCAiIiwgbHBJbnN0YWxsTmFtZXMsIDIwMDAsIFN5c0ZpbGUpOwotCQkJd2hpbGUoc3RybGVuKHB0cikgPiAwKSB7Ci0JCQkJVFJBQ0UobWNpLCAiLS0tPiAnJXMnIFxuIiwgcHRyKTsKLQkJCQlsZW4gPSBzdHJsZW4ocHRyKSArIDE7Ci0JCQkJcHRyICs9IGxlbjsKLQkJCQlJbnN0YWxsZWRMaXN0TGVuICs9IGxlbjsKLQkJCQlJbnN0YWxsZWRDb3VudCsrOwotCQkJfQotCQl9Ci0JCWlmIChscFBhcm1zLT5kd1JldFNpemUgPCBJbnN0YWxsZWRMaXN0TGVuKQotCQkJbHN0cmNweW4zMkEobHBzdHJSZXR1cm4sIGxwSW5zdGFsbE5hbWVzLCBscFBhcm1zLT5kd1JldFNpemUgLSAxKTsKLQkJZWxzZQotCQkJc3RyY3B5KGxwc3RyUmV0dXJuLCBscEluc3RhbGxOYW1lcyk7Ci0JCXJldHVybiAwOwotCWNhc2UgTUNJX1NZU0lORk9fTkFNRToKLQkJVFJBQ0UobWNpLCAiTUNJX1NZU0lORk9fTkFNRSBcbiIpOwotCQlyZXR1cm4gMDsKLQljYXNlIE1DSV9TWVNJTkZPX09QRU46Ci0JCVRSQUNFKG1jaSwgIk1DSV9TWVNJTkZPX09QRU4gXG4iKTsKLQkJcmV0dXJuIDA7CisgICAgaW50CQlsZW47CisgICAgTFBTVFIJcHRyOworICAgIExQU1RSCWxwc3RyUmV0dXJuOworICAgIERXT1JECSpscGR3UmV0OworICAgIExQU1RSCVN5c0ZpbGUgPSAiU1lTVEVNLklOSSI7CisgICAgCisgICAgVFJBQ0UobWNpLCAiKCUwOGxYLCAlMDhsWClcbiIsIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKKyAgICBscHN0clJldHVybiA9IFBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyUmV0dXJuKTsKKyAgICBzd2l0Y2goZHdGbGFncykgeworICAgIGNhc2UgTUNJX1NZU0lORk9fUVVBTlRJVFk6CisJVFJBQ0UobWNpLCAiTUNJX1NZU0lORk9fUVVBTlRJVFkgXG4iKTsKKwlscGR3UmV0ID0gKERXT1JEICopbHBzdHJSZXR1cm47CisJKihscGR3UmV0KSA9IEluc3RhbGxlZENvdW50OworCXJldHVybiAwOworICAgIGNhc2UgTUNJX1NZU0lORk9fSU5TVEFMTE5BTUU6CisJVFJBQ0UobWNpLCAiTUNJX1NZU0lORk9fSU5TVEFMTE5BTUUgXG4iKTsKKwlpZiAobHBJbnN0YWxsTmFtZXMgPT0gTlVMTCkgeworCSAgICBJbnN0YWxsZWRDb3VudCA9IDA7CisJICAgIEluc3RhbGxlZExpc3RMZW4gPSAwOworCSAgICBwdHIgPSBscEluc3RhbGxOYW1lcyA9IHhtYWxsb2MoMjA0OCk7CisJICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCJtY2kiLCBOVUxMLCAiIiwgbHBJbnN0YWxsTmFtZXMsIDIwMDAsIFN5c0ZpbGUpOworCSAgICB3aGlsZShzdHJsZW4ocHRyKSA+IDApIHsKKwkJVFJBQ0UobWNpLCAiLS0tPiAnJXMnIFxuIiwgcHRyKTsKKwkJbGVuID0gc3RybGVuKHB0cikgKyAxOworCQlwdHIgKz0gbGVuOworCQlJbnN0YWxsZWRMaXN0TGVuICs9IGxlbjsKKwkJSW5zdGFsbGVkQ291bnQrKzsKKwkgICAgfQogCX0KLQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKwlpZiAobHBQYXJtcy0+ZHdSZXRTaXplIDwgSW5zdGFsbGVkTGlzdExlbikKKwkgICAgbHN0cmNweW4zMkEobHBzdHJSZXR1cm4sIGxwSW5zdGFsbE5hbWVzLCBscFBhcm1zLT5kd1JldFNpemUgLSAxKTsKKwllbHNlCisJICAgIHN0cmNweShscHN0clJldHVybiwgbHBJbnN0YWxsTmFtZXMpOworCXJldHVybiAwOworICAgIGNhc2UgTUNJX1NZU0lORk9fTkFNRToKKwlUUkFDRShtY2ksICJNQ0lfU1lTSU5GT19OQU1FIFxuIik7CisJcmV0dXJuIDA7CisgICAgY2FzZSBNQ0lfU1lTSU5GT19PUEVOOgorCVRSQUNFKG1jaSwgIk1DSV9TWVNJTkZPX09QRU4gXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU3OCwxMzMgKzE1OTYsMTM0IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWNpTG9hZENvbW1hbmRSZXNvdXJjZTE2KEhBTkRMRTE2IGhpbnN0LExQQ1NUUiByZXNuYW1lLFVJTlQxNiB0eXBlKQogewotICAgICAgY2hhciAgICAgICAgICAgIGJ1ZlsyMDBdOwotICAgICAgT0ZTVFJVQ1QgICAgICAgIG9mczsKLSAgICAgIEhBTkRMRTE2ICAgICAgICB4aGluc3Q7Ci0gICAgICBIUlNSQzE2ICAgICAgICAgaHJzcmM7Ci0gICAgICBIR0xPQkFMMTYgICAgICAgaG1lbTsKLSAgICAgIExQU1RSICAgICAgICAgICBzZWdzdHI7Ci0gICAgICBTRUdQVFIgICAgICAgICAgeG1lbTsKLSAgICAgIExQQllURSAgICAgICAgICBsbWVtOwotICAgICAgc3RhdGljIFVJTlQxNiAgIG1jaWRldnR5cGUgPSAwOwotCi0gICAgICBGSVhNRShtbXN5cywiKCUwNHgsJXMsJWQpOiBzdHViIVxuIixoaW5zdCxyZXNuYW1lLHR5cGUpOwotICAgICAgaWYgKCFsc3RyY21waTMyQShyZXNuYW1lLCJjb3JlIikpIHsKLSAgICAgICAgICAgICAgRklYTUUobW1zeXMsIiguLi4sXCJjb3JlXCIsLi4uKSwgaGF2ZSB0byB1c2UgaW50ZXJuYWwgdGFibGVzLi4uIChub3QgdGhlcmUgeWV0KVxuIik7Ci0gICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgLyogaWYgZmlsZSBleGlzdHMgInJlc25hbWUubWNpIiwgdGhlbiBsb2FkIHJlc291cmNlICJyZXNuYW1lIiBmcm9tIGl0Ci0gICAgICAgKiBvdGhlcndpc2UgZGlyZWN0bHkgZnJvbSBkcml2ZXIKLSAgICAgICAqLwotICAgICAgc3RyY3B5KGJ1ZixyZXNuYW1lKTsKLSAgICAgIHN0cmNhdChidWYsIi5tY2kiKTsKLSAgICAgIGlmIChPcGVuRmlsZTMyKGJ1Ziwmb2ZzLE9GX0VYSVNUKSE9SEZJTEVfRVJST1IzMikgewotICAgICAgICAgICAgICB4aGluc3QgPSBMb2FkTGlicmFyeTE2KGJ1Zik7Ci0gICAgICAgICAgICAgIGlmICh4aGluc3QgPjMyKQotICAgICAgICAgICAgICAgICAgICAgIGhpbnN0ID0geGhpbnN0OwotICAgICAgfSAvKiBlbHNlIHVzZSBwYXNzZWQgaGluc3QgKi8KLSAgICAgIHNlZ3N0ciA9IFNFR1BUUl9TVFJEVVAocmVzbmFtZSk7Ci0gICAgICBocnNyYyA9IEZpbmRSZXNvdXJjZTE2KGhpbnN0LFNFR1BUUl9HRVQoc2Vnc3RyKSx0eXBlKTsKLSAgICAgIFNFR1BUUl9GUkVFKHNlZ3N0cik7Ci0gICAgICBpZiAoIWhyc3JjKSB7Ci0gICAgICAgICAgICAgIFdBUk4obW1zeXMsIm5vIHNwZWNpYWwgY29tbWFuZGxpc3QgZm91bmQgaW4gcmVzb3VyY2VcbiIpOwotICAgICAgICAgICAgICByZXR1cm4gTUNJX05PX0NPTU1BTkRfVEFCTEU7Ci0gICAgICB9Ci0gICAgICBobWVtID0gTG9hZFJlc291cmNlMTYoaGluc3QsaHJzcmMpOwotICAgICAgaWYgKCFobWVtKSB7Ci0gICAgICAgICAgICAgIFdBUk4obW1zeXMsImNvdWxkbid0IGxvYWQgcmVzb3VyY2U/P1xuIik7Ci0gICAgICAgICAgICAgIHJldHVybiBNQ0lfTk9fQ09NTUFORF9UQUJMRTsKLSAgICAgIH0KLSAgICAgIHhtZW0gPSBXSU4xNl9Mb2NrUmVzb3VyY2UxNihobWVtKTsKLSAgICAgIGlmICgheG1lbSkgewotICAgICAgICAgICAgICBXQVJOKG1tc3lzLCJjb3VsZG4ndCBsb2NrIHJlc291cmNlPz9cbiIpOwotICAgICAgICAgICAgICBGcmVlUmVzb3VyY2UxNihobWVtKTsKLSAgICAgICAgICAgICAgcmV0dXJuIE1DSV9OT19DT01NQU5EX1RBQkxFOwotICAgICAgfQotICAgICAgbG1lbSA9IFBUUl9TRUdfVE9fTElOKHhtZW0pOwotICAgICAgVFJBQ0UobW1zeXMsImZpcnN0IHJlc291cmNlIGVudHJ5IGlzICVzXG4iLChjaGFyKilsbWVtKTsKLSAgICAgIC8qIHBhcnNlIHJlc291cmNlLCByZWdpc3RlciBzdHVmZiwgcmV0dXJuIHVuaXF1ZSBpZCAqLwotICAgICAgcmV0dXJuICsrbWNpZGV2dHlwZTsKKyAgICBjaGFyICAgICAgICAgICAgYnVmWzIwMF07CisgICAgT0ZTVFJVQ1QgICAgICAgIG9mczsKKyAgICBIQU5ETEUxNiAgICAgICAgeGhpbnN0OworICAgIEhSU1JDMTYgICAgICAgICBocnNyYzsKKyAgICBIR0xPQkFMMTYgICAgICAgaG1lbTsKKyAgICBMUFNUUiAgICAgICAgICAgc2Vnc3RyOworICAgIFNFR1BUUiAgICAgICAgICB4bWVtOworICAgIExQQllURSAgICAgICAgICBsbWVtOworICAgIHN0YXRpYyBVSU5UMTYgICBtY2lkZXZ0eXBlID0gMDsKKyAgICAKKyAgICBGSVhNRShtbXN5cywiKCUwNHgsJXMsJWQpOiBzdHViIVxuIixoaW5zdCxyZXNuYW1lLHR5cGUpOworICAgIGlmICghbHN0cmNtcGkzMkEocmVzbmFtZSwiY29yZSIpKSB7CisJRklYTUUobW1zeXMsIiguLi4sXCJjb3JlXCIsLi4uKSwgaGF2ZSB0byB1c2UgaW50ZXJuYWwgdGFibGVzLi4uIChub3QgdGhlcmUgeWV0KVxuIik7CisJcmV0dXJuIDA7CisgICAgfQorICAgIC8qIGlmIGZpbGUgZXhpc3RzICJyZXNuYW1lLm1jaSIsIHRoZW4gbG9hZCByZXNvdXJjZSAicmVzbmFtZSIgZnJvbSBpdAorICAgICAqIG90aGVyd2lzZSBkaXJlY3RseSBmcm9tIGRyaXZlcgorICAgICAqLworICAgIHN0cmNweShidWYscmVzbmFtZSk7CisgICAgc3RyY2F0KGJ1ZiwiLm1jaSIpOworICAgIGlmIChPcGVuRmlsZTMyKGJ1Ziwmb2ZzLE9GX0VYSVNUKSE9SEZJTEVfRVJST1IzMikgeworCXhoaW5zdCA9IExvYWRMaWJyYXJ5MTYoYnVmKTsKKwlpZiAoeGhpbnN0ID4zMikKKwkgICAgaGluc3QgPSB4aGluc3Q7CisgICAgfSAvKiBlbHNlIHVzZSBwYXNzZWQgaGluc3QgKi8KKyAgICBzZWdzdHIgPSBTRUdQVFJfU1RSRFVQKHJlc25hbWUpOworICAgIGhyc3JjID0gRmluZFJlc291cmNlMTYoaGluc3QsU0VHUFRSX0dFVChzZWdzdHIpLHR5cGUpOworICAgIFNFR1BUUl9GUkVFKHNlZ3N0cik7CisgICAgaWYgKCFocnNyYykgeworCVdBUk4obW1zeXMsIm5vIHNwZWNpYWwgY29tbWFuZGxpc3QgZm91bmQgaW4gcmVzb3VyY2VcbiIpOworCXJldHVybiBNQ0lfTk9fQ09NTUFORF9UQUJMRTsKKyAgICB9CisgICAgaG1lbSA9IExvYWRSZXNvdXJjZTE2KGhpbnN0LGhyc3JjKTsKKyAgICBpZiAoIWhtZW0pIHsKKwlXQVJOKG1tc3lzLCJjb3VsZG4ndCBsb2FkIHJlc291cmNlPz9cbiIpOworCXJldHVybiBNQ0lfTk9fQ09NTUFORF9UQUJMRTsKKyAgICB9CisgICAgeG1lbSA9IFdJTjE2X0xvY2tSZXNvdXJjZTE2KGhtZW0pOworICAgIGlmICgheG1lbSkgeworCVdBUk4obW1zeXMsImNvdWxkbid0IGxvY2sgcmVzb3VyY2U/P1xuIik7CisJRnJlZVJlc291cmNlMTYoaG1lbSk7CisJcmV0dXJuIE1DSV9OT19DT01NQU5EX1RBQkxFOworICAgIH0KKyAgICBsbWVtID0gUFRSX1NFR19UT19MSU4oeG1lbSk7CisgICAgVFJBQ0UobW1zeXMsImZpcnN0IHJlc291cmNlIGVudHJ5IGlzICVzXG4iLChjaGFyKilsbWVtKTsKKyAgICAvKiBwYXJzZSByZXNvdXJjZSwgcmVnaXN0ZXIgc3R1ZmYsIHJldHVybiB1bmlxdWUgaWQgKi8KKyAgICByZXR1cm4gKyttY2lkZXZ0eXBlOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJbWNpU291bmQJCQkJW2ludGVybmFsXQogICogIG5vdCB1c2VkIGFueW1vcmUgPz8KLQotRFdPUkQgbWNpU291bmQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfU09VTkRfUEFSTVMgbHBQYXJtcykKLXsKLQlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWlmIChkd1BhcmFtICYgTUNJX1NPVU5EX05BTUUpCi0JCVRSQUNFKG1jaSwgImZpbGU9JyVzJyAhXG4iLCBscFBhcm1zLT5scHN0clNvdW5kTmFtZSk7Ci0JcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKLX0KKyAKKyBEV09SRCBtY2lTb3VuZChVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9TT1VORF9QQVJNUyBscFBhcm1zKQorIHsKKyBpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworIGlmIChkd1BhcmFtICYgTUNJX1NPVU5EX05BTUUpCisgVFJBQ0UobWNpLCAiZmlsZT0nJXMnICFcbiIsIGxwUGFybXMtPmxwc3RyU291bmROYW1lKTsKKyByZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOworIH0KICAqCiAgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgKl9tY2lDb21tYW5kVG9TdHJpbmcoVUlOVDE2IHdNc2cpCiB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEwMF07Ci0KKyAgICBzdGF0aWMgY2hhciBidWZmZXJbMTAwXTsKKyAgICAKICNkZWZpbmUgQ0FTRShzKSBjYXNlIChzKTogcmV0dXJuICNzCi0KLQlzd2l0Y2ggKHdNc2cpIHsKLQkJQ0FTRShNQ0lfT1BFTik7Ci0JCUNBU0UoTUNJX0NMT1NFKTsKLQkJQ0FTRShNQ0lfRVNDQVBFKTsKLQkJQ0FTRShNQ0lfUExBWSk7Ci0JCUNBU0UoTUNJX1NFRUspOwotCQlDQVNFKE1DSV9TVE9QKTsKLQkJQ0FTRShNQ0lfUEFVU0UpOwotCQlDQVNFKE1DSV9JTkZPKTsKLQkJQ0FTRShNQ0lfR0VUREVWQ0FQUyk7Ci0JCUNBU0UoTUNJX1NQSU4pOwotCQlDQVNFKE1DSV9TRVQpOwotCQlDQVNFKE1DSV9TVEVQKTsKLQkJQ0FTRShNQ0lfUkVDT1JEKTsKLQkJQ0FTRShNQ0lfU1lTSU5GTyk7Ci0JCUNBU0UoTUNJX0JSRUFLKTsKLQkJQ0FTRShNQ0lfU0FWRSk7Ci0JCUNBU0UoTUNJX1NUQVRVUyk7Ci0JCUNBU0UoTUNJX0NVRSk7Ci0JCUNBU0UoTUNJX1JFQUxJWkUpOwotCQlDQVNFKE1DSV9XSU5ET1cpOwotCQlDQVNFKE1DSV9QVVQpOwotCQlDQVNFKE1DSV9XSEVSRSk7Ci0JCUNBU0UoTUNJX0ZSRUVaRSk7Ci0JCUNBU0UoTUNJX1VORlJFRVpFKTsKLQkJQ0FTRShNQ0lfTE9BRCk7Ci0JCUNBU0UoTUNJX0NVVCk7Ci0JCUNBU0UoTUNJX0NPUFkpOwotCQlDQVNFKE1DSV9QQVNURSk7Ci0JCUNBU0UoTUNJX1VQREFURSk7Ci0JCUNBU0UoTUNJX1JFU1VNRSk7Ci0JCUNBU0UoTUNJX0RFTEVURSk7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKGJ1ZmZlciwgIiUwNFgiLCB3TXNnKTsKLQkJCXJldHVybiBidWZmZXI7Ci0KLQl9CisgICAgCisgICAgc3dpdGNoICh3TXNnKSB7CisJQ0FTRShNQ0lfT1BFTik7CisJQ0FTRShNQ0lfQ0xPU0UpOworCUNBU0UoTUNJX0VTQ0FQRSk7CisJQ0FTRShNQ0lfUExBWSk7CisJQ0FTRShNQ0lfU0VFSyk7CisJQ0FTRShNQ0lfU1RPUCk7CisJQ0FTRShNQ0lfUEFVU0UpOworCUNBU0UoTUNJX0lORk8pOworCUNBU0UoTUNJX0dFVERFVkNBUFMpOworCUNBU0UoTUNJX1NQSU4pOworCUNBU0UoTUNJX1NFVCk7CisJQ0FTRShNQ0lfU1RFUCk7CisJQ0FTRShNQ0lfUkVDT1JEKTsKKwlDQVNFKE1DSV9TWVNJTkZPKTsKKwlDQVNFKE1DSV9CUkVBSyk7CisJQ0FTRShNQ0lfU0FWRSk7CisJQ0FTRShNQ0lfU1RBVFVTKTsKKwlDQVNFKE1DSV9DVUUpOworCUNBU0UoTUNJX1JFQUxJWkUpOworCUNBU0UoTUNJX1dJTkRPVyk7CisJQ0FTRShNQ0lfUFVUKTsKKwlDQVNFKE1DSV9XSEVSRSk7CisJQ0FTRShNQ0lfRlJFRVpFKTsKKwlDQVNFKE1DSV9VTkZSRUVaRSk7CisJQ0FTRShNQ0lfTE9BRCk7CisJQ0FTRShNQ0lfQ1VUKTsKKwlDQVNFKE1DSV9DT1BZKTsKKwlDQVNFKE1DSV9QQVNURSk7CisJQ0FTRShNQ0lfVVBEQVRFKTsKKwlDQVNFKE1DSV9SRVNVTUUpOworCUNBU0UoTUNJX0RFTEVURSk7CisgICAgZGVmYXVsdDoKKwlzcHJpbnRmKGJ1ZmZlciwgIiUwNFgiLCB3TXNnKTsKKwlyZXR1cm4gYnVmZmVyOworCQorICAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWNpU2VuZENvbW1hbmRBCQkJW1dJTk1NLjQ5XQogICovCiBEV09SRCBXSU5BUEkgbWNpU2VuZENvbW1hbmQzMkEoVUlOVDMyIHdEZXZJRCwgVUlOVDMyIHdNc2csIERXT1JEIGR3UGFyYW0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3UGFyYW0yKQorCQkJICAgICAgIERXT1JEIGR3UGFyYW0yKQogewotICAgIEZJWE1FKG1tc3lzLCIoJTA4eCwlcywlMDhseCwlMDhseCk6IHN0dWIhXG4iLAorICAgIEZJWE1FKG1tc3lzLCIoMHglMDh4LCVzLCUwOGx4LCUwOGx4KTogc3R1YiBcbiIsCiAJICB3RGV2SUQsX21jaUNvbW1hbmRUb1N0cmluZyh3TXNnKSxkd1BhcmFtMSxkd1BhcmFtMik7CiAgICAgc3dpdGNoICh3TXNnKSB7Ci0gICAgY2FzZSBNQ0lfT1BFTjogewotICAgIAlMUE1DSV9PUEVOX1BBUk1TMzJBCWxwbW9wID0gKExQTUNJX09QRU5fUEFSTVMzMkEpZHdQYXJhbTI7Ci0gICAgCVRSQUNFKG1tc3lzLCIJTUNJX09QRU4oJXMsJXMsJXMpXG4iLAotCSAgICAgIChkd1BhcmFtMSZNQ0lfT1BFTl9UWVBFKSAgID9scG1vcC0+bHBzdHJEZXZpY2VUeXBlOiI8bnVsbD4iLAotCSAgICAgIChkd1BhcmFtMSZNQ0lfT1BFTl9FTEVNRU5UKT8oSElXT1JEKGxwbW9wLT5scHN0ckVsZW1lbnROYW1lKT9scG1vcC0+bHBzdHJFbGVtZW50TmFtZToiPGlkPiIpOiI8bnVsbD4iLAotCSAgICAgIChkd1BhcmFtMSZNQ0lfT1BFTl9BTElBUykgID9scG1vcC0+bHBzdHJBbGlhczoiPG51bGw+IgotCSk7Ci0JYnJlYWs7Ci0gICAgfQorICAgIGNhc2UgTUNJX09QRU46IAorCXsKKwkgICAgTFBNQ0lfT1BFTl9QQVJNUzMyQQlscG1vcCA9IChMUE1DSV9PUEVOX1BBUk1TMzJBKWR3UGFyYW0yOworCSAgICBUUkFDRShtbXN5cywiCU1DSV9PUEVOKCVzLCVzLCVzKVxuIiwKKwkJICAoZHdQYXJhbTEmTUNJX09QRU5fVFlQRSkgICA/bHBtb3AtPmxwc3RyRGV2aWNlVHlwZToiPG51bGw+IiwKKwkJICAoZHdQYXJhbTEmTUNJX09QRU5fRUxFTUVOVCk/KEhJV09SRChscG1vcC0+bHBzdHJFbGVtZW50TmFtZSk/bHBtb3AtPmxwc3RyRWxlbWVudE5hbWU6IjxpZD4iKToiPG51bGw+IiwKKwkJICAoZHdQYXJhbTEmTUNJX09QRU5fQUxJQVMpICA/bHBtb3AtPmxwc3RyQWxpYXM6IjxudWxsPiIKKwkJICApOworCSAgICBicmVhazsKKwl9CiAgICAgfQogICAgIHJldHVybiAweDE7IC8qICFvayAqLwogfQpAQCAtMTcxNiw3NyArMTczNSw3OCBAQAogewogICAgIEhEUlZSMTYgaERydiA9IDA7CiAgICAgVFJBQ0UobWNpLCAiKCUwNFgsICVzLCAlMDhsWCwgJTA4bFgpXG4iLCAKLSAgICAgICAgICAgICAgICB3RGV2SUQsIF9tY2lDb21tYW5kVG9TdHJpbmcod01zZyksIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0gICAgc3dpdGNoKHdNc2cpCi0gICAgeworCSAgd0RldklELCBfbWNpQ29tbWFuZFRvU3RyaW5nKHdNc2cpLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgIHN3aXRjaCh3TXNnKSB7CiAgICAgY2FzZSBNQ0lfT1BFTjoKLSAgICAgICAgcmV0dXJuIG1jaU9wZW4oZHdQYXJhbTEsIChMUE1DSV9PUEVOX1BBUk1TMTYpZHdQYXJhbTIpOworCXJldHVybiBtY2lPcGVuKGR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9QQVJNUzE2KWR3UGFyYW0yKTsKICAgICBjYXNlIE1DSV9DTE9TRToKLSAgICAgICAgcmV0dXJuIG1jaUNsb3NlKCB3RGV2SUQsIGR3UGFyYW0xLAotICAgICAgICAgICAgICAgICAgICAgICAgIChMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CisJcmV0dXJuIG1jaUNsb3NlKCB3RGV2SUQsIGR3UGFyYW0xLAorCQkJIChMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAgICAgY2FzZSBNQ0lfU1lTSU5GTzoKLSAgICAgICAgcmV0dXJuIG1jaVN5c0luZm8oIGR3UGFyYW0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQTUNJX1NZU0lORk9fUEFSTVMxNilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworCXJldHVybiBtY2lTeXNJbmZvKCBkd1BhcmFtMSwKKwkJCSAgIChMUE1DSV9TWVNJTkZPX1BBUk1TMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2goR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzoKLSAgICAgICAgICAgIHJldHVybiBDREFVRElPX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELCBoRHJ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLSAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKLSAgICAgICAgICAgIHJldHVybiBXQVZFX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELCBoRHJ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLSAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6Ci0gICAgICAgICAgICByZXR1cm4gTUlESV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwgaERydiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0JLyoKLSAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gQU5JTV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwgaERydiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0gCSAqLwotICAgICAgICBkZWZhdWx0OgotCSAgICByZXR1cm4gQ2FsbGJhY2tzLT5DYWxsRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYyxHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsR2V0RHJ2KHdEZXZJRCktPmhkcnYsTUNJX0NMT1NFLGR3UGFyYW0xLGR3UGFyYW0yKTsKLQotICAgICAgICAgICAgV0FSTihtY2ksICJ1bmtub3duIGRldmljZSB0eXBlPSUwNFggIVxuIiwgCi0JCQkgR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUpOwotICAgICAgICB9CisJc3dpdGNoKEdldERydih3RGV2SUQpLT5tb2RwLndUeXBlKSB7CisJY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzoKKwkgICAgcmV0dXJuIENEQVVESU9fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsIGhEcnYsIAorCQkJCSAgICAgIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKKwkgICAgcmV0dXJuIFdBVkVfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsIGhEcnYsIAorCQkJCSAgIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisJY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6CisJICAgIHJldHVybiBNSURJX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELCBoRHJ2LCAKKwkJCQkgICB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworCSAgICAvKgorCSAgICAgIGNhc2UgTUNJX0RFVlRZUEVfQU5JTUFUSU9OOgorCSAgICAgIHJldHVybiBBTklNX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELCBoRHJ2LCAKKwkgICAgICB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworCSAgICAqLworCWRlZmF1bHQ6CisJICAgIHJldHVybiBDYWxsYmFja3MtPkNhbGxEcml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jLAorCQkJCQkgICAgIEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwKKwkJCQkJICAgICBHZXREcnYod0RldklEKS0+aGRydiwKKwkJCQkJICAgICBNQ0lfQ0xPU0UsZHdQYXJhbTEsZHdQYXJhbTIpOworCSAgICAKKwkgICAgV0FSTihtY2ksICJ1bmtub3duIGRldmljZSB0eXBlPSUwNFggIVxuIiwgCisJCSBHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSk7CisJfQogICAgIH0KICAgICByZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltY2lHZXREZXZpY2VJRAkgICAgICAgCVtNTVNZU1RFTS43MDNdCi0qLworICogCQkJCW1jaUdldERldmljZUlECSAgICAgICAJW01NU1lTVEVNLjcwM10KKyAqLwogVUlOVDE2IFdJTkFQSSBtY2lHZXREZXZpY2VJRCAoTFBDU1RSIGxwc3RyTmFtZSkKIHsKICAgICBVSU5UMTYgd0RldklEOwotCisgICAgCiAgICAgVFJBQ0UobWNpLCAiKFwiJXNcIilcbiIsIGxwc3RyTmFtZSk7CiAgICAgaWYgKGxwc3RyTmFtZSAmJiAhbHN0cmNtcGkzMkEobHBzdHJOYW1lLCAiQUxMIikpCi0gICAgICAgIHJldHVybiBNQ0lfQUxMX0RFVklDRV9JRDsKLQorCXJldHVybiBNQ0lfQUxMX0RFVklDRV9JRDsKKyAgICAKICAgICBpZiAoIWxwc3RyTmFtZSkKIAlyZXR1cm4gMDsKLQorICAgIAogICAgIHdEZXZJRCA9IE1NU1lTVEVNX0ZpcnN0RGV2SUQoKTsKICAgICB3aGlsZShNTVNZU1RFTV9EZXZJRFZhbGlkKHdEZXZJRCkgJiYgR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUpIHsKIAlpZiAoR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckRldmljZVR5cGUgJiYgCi0gICAgICAgICAgICBzdHJjbXAoUFRSX1NFR19UT19MSU4oR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckRldmljZVR5cGUpLCBscHN0ck5hbWUpID09IDApCisJICAgIHN0cmNtcChQVFJfU0VHX1RPX0xJTihHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZSksIGxwc3RyTmFtZSkgPT0gMCkKIAkgICAgcmV0dXJuIHdEZXZJRDsKLQorCQogCWlmIChHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyQWxpYXMgJiYgCi0gICAgICAgICAgICBzdHJjbXAoUFRSX1NFR19UT19MSU4oR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckFsaWFzKSwgbHBzdHJOYW1lKSA9PSAwKQorCSAgICBzdHJjbXAoUFRSX1NFR19UT19MSU4oR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckFsaWFzKSwgbHBzdHJOYW1lKSA9PSAwKQogCSAgICByZXR1cm4gd0RldklEOwotCisJCiAJd0RldklEID0gTU1TWVNURU1fTmV4dERldklEKHdEZXZJRCk7CiAgICAgfQotCisgICAgCiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJbWNpU2V0WWllbGRQcm9jCQlbTU1TWVNURU0uNzE0XQotKi8KKyAqIAkJCQltY2lTZXRZaWVsZFByb2MJCVtNTVNZU1RFTS43MTRdCisgKi8KIEJPT0wxNiBXSU5BUEkgbWNpU2V0WWllbGRQcm9jIChVSU5UMTYgdURldmljZUlELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZSUVMRFBST0MgZnBZaWVsZFByb2MsIERXT1JEIGR3WWllbGREYXRhKQogewpAQCAtMTc5NCwyNCArMTgxNCwyNCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCW1jaUdldERldmljZUlERnJvbUVsZW1lbnRJRAlbTU1TWVNURU0uNzE1XQotKi8KKyAqIAkJCQltY2lHZXREZXZpY2VJREZyb21FbGVtZW50SUQJW01NU1lTVEVNLjcxNV0KKyAqLwogVUlOVDE2IFdJTkFQSSBtY2lHZXREZXZpY2VJREZyb21FbGVtZW50SUQoRFdPUkQgZHdFbGVtZW50SUQsIExQQ1NUUiBscHN0clR5cGUpCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJbWNpR2V0WWllbGRQcm9jCQlbTU1TWVNURU0uNzE2XQotKi8KKyAqIAkJCQltY2lHZXRZaWVsZFByb2MJCVtNTVNZU1RFTS43MTZdCisgKi8KIFlJRUxEUFJPQyBXSU5BUEkgbWNpR2V0WWllbGRQcm9jKFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEICogbHBkd1lpZWxkRGF0YSkKIHsKICAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltY2lHZXRDcmVhdG9yVGFzawlbTU1TWVNURU0uNzE3XQotKi8KKyAqIAkJCQltY2lHZXRDcmVhdG9yVGFzawlbTU1TWVNURU0uNzE3XQorICovCiBIVEFTSzE2IFdJTkFQSSBtY2lHZXRDcmVhdG9yVGFzayhVSU5UMTYgdURldmljZUlEKQogewogICAgIHJldHVybiAwOwpAQCAtMTgyMiwxOCArMTg0MiwxOCBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlPdXRHZXROdW1EZXZzMzIodm9pZCkKIHsKLQlyZXR1cm4gbWlkaU91dEdldE51bURldnMxNigpOworICAgIHJldHVybiBtaWRpT3V0R2V0TnVtRGV2czE2KCk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaWRpT3V0R2V0TnVtRGV2cwlbTU1TWVNURU0uMjAxXQogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRHZXROdW1EZXZzMTYodm9pZCkKIHsKLQlVSU5UMTYJY291bnQgPSAwOwotCVRSQUNFKG1tc3lzLCAibWlkaU91dEdldE51bURldnNcbiIpOwotCWNvdW50ICs9IG1vZE1lc3NhZ2UoMCwgTU9ETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKLQlUUkFDRShtbXN5cywgIm1pZGlPdXRHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKLQlyZXR1cm4gY291bnQ7CisgICAgVUlOVDE2CWNvdW50ID0gMDsKKyAgICBUUkFDRShtbXN5cywgIm1pZGlPdXRHZXROdW1EZXZzXG4iKTsKKyAgICBjb3VudCArPSBtb2RNZXNzYWdlKDAsIE1PRE1fR0VUTlVNREVWUywgMEwsIDBMLCAwTCk7CisgICAgVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CisgICAgcmV0dXJuIGNvdW50OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NDEsNDAgKzE4NjEsNDAgQEAKICAqLwogVUlOVDMyIFdJTkFQSSBtaWRpT3V0R2V0RGV2Q2FwczMyVyhVSU5UMzIgdURldmljZUlELExQTUlESU9VVENBUFMzMlcgbHBDYXBzLCBVSU5UMzIgdVNpemUpCiB7Ci0JTUlESU9VVENBUFMxNgltb2MxNjsKLQlVSU5UMzIJCXJldDsKLQotCXJldCA9IG1pZGlPdXRHZXREZXZDYXBzMTYodURldmljZUlELCZtb2MxNixzaXplb2YobW9jMTYpKTsKLQlscENhcHMtPndNaWQJCT0gbW9jMTYud01pZDsKLQlscENhcHMtPndQaWQJCT0gbW9jMTYud1BpZDsKLQlscENhcHMtPnZEcml2ZXJWZXJzaW9uCT0gbW9jMTYudkRyaXZlclZlcnNpb247Ci0JbHN0cmNweUF0b1cobHBDYXBzLT5zelBuYW1lLG1vYzE2LnN6UG5hbWUpOwotCWxwQ2Fwcy0+d1RlY2hub2xvZ3kJPSBtb2MxNi53VGVjaG5vbG9neTsKLQlscENhcHMtPndWb2ljZXMJCT0gbW9jMTYud1ZvaWNlczsKLQlscENhcHMtPndOb3RlcwkJPSBtb2MxNi53Tm90ZXM7Ci0JbHBDYXBzLT53Q2hhbm5lbE1hc2sJPSBtb2MxNi53Q2hhbm5lbE1hc2s7Ci0JbHBDYXBzLT5kd1N1cHBvcnQJPSBtb2MxNi5kd1N1cHBvcnQ7Ci0JcmV0dXJuIHJldDsKKyAgICBNSURJT1VUQ0FQUzE2CW1vYzE2OworICAgIFVJTlQzMgkJcmV0OworICAgIAorICAgIHJldCA9IG1pZGlPdXRHZXREZXZDYXBzMTYodURldmljZUlELCZtb2MxNixzaXplb2YobW9jMTYpKTsKKyAgICBscENhcHMtPndNaWQJCT0gbW9jMTYud01pZDsKKyAgICBscENhcHMtPndQaWQJCT0gbW9jMTYud1BpZDsKKyAgICBscENhcHMtPnZEcml2ZXJWZXJzaW9uCT0gbW9jMTYudkRyaXZlclZlcnNpb247CisgICAgbHN0cmNweUF0b1cobHBDYXBzLT5zelBuYW1lLG1vYzE2LnN6UG5hbWUpOworICAgIGxwQ2Fwcy0+d1RlY2hub2xvZ3kJPSBtb2MxNi53VGVjaG5vbG9neTsKKyAgICBscENhcHMtPndWb2ljZXMJCT0gbW9jMTYud1ZvaWNlczsKKyAgICBscENhcHMtPndOb3RlcwkJPSBtb2MxNi53Tm90ZXM7CisgICAgbHBDYXBzLT53Q2hhbm5lbE1hc2sJPSBtb2MxNi53Q2hhbm5lbE1hc2s7CisgICAgbHBDYXBzLT5kd1N1cHBvcnQJPSBtb2MxNi5kd1N1cHBvcnQ7CisgICAgcmV0dXJuIHJldDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1pZGlPdXRHZXREZXZDYXBzQQlbV0lOTU0uNzVdCiAgKi8KIFVJTlQzMiBXSU5BUEkgbWlkaU91dEdldERldkNhcHMzMkEoVUlOVDMyIHVEZXZpY2VJRCxMUE1JRElPVVRDQVBTMzJBIGxwQ2FwcywgVUlOVDMyIHVTaXplKQogewotCU1JRElPVVRDQVBTMTYJbW9jMTY7Ci0JVUlOVDMyCQlyZXQ7Ci0KLQlyZXQgPSBtaWRpT3V0R2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwmbW9jMTYsc2l6ZW9mKG1vYzE2KSk7Ci0JbHBDYXBzLT53TWlkCQk9IG1vYzE2LndNaWQ7Ci0JbHBDYXBzLT53UGlkCQk9IG1vYzE2LndQaWQ7Ci0JbHBDYXBzLT52RHJpdmVyVmVyc2lvbgk9IG1vYzE2LnZEcml2ZXJWZXJzaW9uOwotCXN0cmNweShscENhcHMtPnN6UG5hbWUsbW9jMTYuc3pQbmFtZSk7Ci0JbHBDYXBzLT53VGVjaG5vbG9neQk9IG1vYzE2LndUZWNobm9sb2d5OwotCWxwQ2Fwcy0+d1ZvaWNlcwkJPSBtb2MxNi53Vm9pY2VzOwotCWxwQ2Fwcy0+d05vdGVzCQk9IG1vYzE2LndOb3RlczsKLQlscENhcHMtPndDaGFubmVsTWFzawk9IG1vYzE2LndDaGFubmVsTWFzazsKLQlscENhcHMtPmR3U3VwcG9ydAk9IG1vYzE2LmR3U3VwcG9ydDsKLQlyZXR1cm4gcmV0OworICAgIE1JRElPVVRDQVBTMTYJbW9jMTY7CisgICAgVUlOVDMyCQlyZXQ7CisgICAgCisgICAgcmV0ID0gbWlkaU91dEdldERldkNhcHMxNih1RGV2aWNlSUQsJm1vYzE2LHNpemVvZihtb2MxNikpOworICAgIGxwQ2Fwcy0+d01pZAkJPSBtb2MxNi53TWlkOworICAgIGxwQ2Fwcy0+d1BpZAkJPSBtb2MxNi53UGlkOworICAgIGxwQ2Fwcy0+dkRyaXZlclZlcnNpb24JPSBtb2MxNi52RHJpdmVyVmVyc2lvbjsKKyAgICBzdHJjcHkobHBDYXBzLT5zelBuYW1lLG1vYzE2LnN6UG5hbWUpOworICAgIGxwQ2Fwcy0+d1RlY2hub2xvZ3kJPSBtb2MxNi53VGVjaG5vbG9neTsKKyAgICBscENhcHMtPndWb2ljZXMJCT0gbW9jMTYud1ZvaWNlczsKKyAgICBscENhcHMtPndOb3RlcwkJPSBtb2MxNi53Tm90ZXM7CisgICAgbHBDYXBzLT53Q2hhbm5lbE1hc2sJPSBtb2MxNi53Q2hhbm5lbE1hc2s7CisgICAgbHBDYXBzLT5kd1N1cHBvcnQJPSBtb2MxNi5kd1N1cHBvcnQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODgyLDggKzE5MDIsOCBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRHZXREZXZDYXBzMTYoVUlOVDE2IHVEZXZpY2VJRCxMUE1JRElPVVRDQVBTMTYgbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7Ci0JVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0RGV2Q2Fwc1xuIik7Ci0JcmV0dXJuIG1vZE1lc3NhZ2UodURldmljZUlELE1PRE1fR0VUREVWQ0FQUywwLChEV09SRClscENhcHMsdVNpemUpOworICAgIFRSQUNFKG1tc3lzLCAibWlkaU91dEdldERldkNhcHNcbiIpOworICAgIHJldHVybiBtb2RNZXNzYWdlKHVEZXZpY2VJRCxNT0RNX0dFVERFVkNBUFMsMCwoRFdPUkQpbHBDYXBzLHVTaXplKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODkxLDggKzE5MTEsOCBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlPdXRHZXRFcnJvclRleHQzMkEoVUlOVDMyIHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMzIgdVNpemUpCiB7Ci0JVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0RXJyb3JUZXh0XG4iKTsKLQlyZXR1cm4gbWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpOworICAgIFRSQUNFKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CisgICAgcmV0dXJuIG1pZGlHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOTAwLDIyICsxOTIwLDIzIEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgbWlkaU91dEdldEVycm9yVGV4dDMyVyhVSU5UMzIgdUVycm9yLCBMUFdTVFIgbHBUZXh0LCBVSU5UMzIgdVNpemUpCiB7Ci0JTFBTVFIJeHN0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsdVNpemUpOwotCVVJTlQzMglyZXQ7Ci0KLQlUUkFDRShtbXN5cywgIm1pZGlPdXRHZXRFcnJvclRleHRcbiIpOwotCXJldCA9IG1pZGlHZXRFcnJvclRleHQodUVycm9yLCB4c3RyLCB1U2l6ZSk7Ci0JbHN0cmNweUF0b1cobHBUZXh0LHhzdHIpOwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx4c3RyKTsKLQlyZXR1cm4gcmV0OworICAgIExQU1RSCXhzdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHVTaXplKTsKKyAgICBVSU5UMzIJcmV0OworICAgIAorICAgIFRSQUNFKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CisgICAgcmV0ID0gbWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIHhzdHIsIHVTaXplKTsKKyAgICBsc3RyY3B5QXRvVyhscFRleHQseHN0cik7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHhzdHIpOworICAgIHJldHVybiByZXQ7CiB9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1pZGlPdXRHZXRFcnJvclRleHQgCVtNTVNZU1RFTS4yMDNdCiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaU91dEdldEVycm9yVGV4dDE2KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewotICAgICAgICBUUkFDRShtbXN5cywgIm1pZGlPdXRHZXRFcnJvclRleHRcbiIpOwotCXJldHVybiBtaWRpR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSk7CisgICAgVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0RXJyb3JUZXh0XG4iKTsKKyAgICByZXR1cm4gbWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE5MjMsNDQgKzE5NDQsNDQgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBtaWRpR2V0RXJyb3JUZXh0KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewotCUxQU1RSCW1zZ3B0cjsKLQlpZiAoKGxwVGV4dCA9PSBOVUxMKSB8fCAodVNpemUgPCAxKSkgcmV0dXJuKEZBTFNFKTsKLQlscFRleHRbMF0gPSAnXDAnOwotCXN3aXRjaCh1RXJyb3IpIHsKLQkJY2FzZSBNSURJRVJSX1VOUFJFUEFSRUQ6Ci0JCQltc2dwdHIgPSAiVGhlIE1JREkgaGVhZGVyIHdhcyBub3QgcHJlcGFyZWQuIFVzZSB0aGUgUHJlcGFyZSBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBoZWFkZXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUlESUVSUl9TVElMTFBMQVlJTkc6Ci0JCQltc2dwdHIgPSAiQ2Fubm90IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gd2hpbGUgbWVkaWEgZGF0YSBpcyBzdGlsbCBwbGF5aW5nLiBSZXNldCB0aGUgZGV2aWNlLCBvciB3YWl0IHVudGlsIHRoZSBkYXRhIGlzIGZpbmlzaGVkIHBsYXlpbmcuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1JRElFUlJfTk9NQVA6Ci0JCQltc2dwdHIgPSAiQSBNSURJIG1hcCB3YXMgbm90IGZvdW5kLiBUaGVyZSBtYXkgYmUgYSBwcm9ibGVtIHdpdGggdGhlIGRyaXZlciwgb3IgdGhlIE1JRElNQVAuQ0ZHIGZpbGUgbWF5IGJlIGNvcnJ1cHQgb3IgbWlzc2luZy4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUlESUVSUl9OT1RSRUFEWToKLQkJCW1zZ3B0ciA9ICJUaGUgcG9ydCBpcyB0cmFuc21pdHRpbmcgZGF0YSB0byB0aGUgZGV2aWNlLiBXYWl0IHVudGlsIHRoZSBkYXRhIGhhcyBiZWVuIHRyYW5zbWl0dGVkLCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1JRElFUlJfTk9ERVZJQ0U6Ci0JCQltc2dwdHIgPSAiVGhlIGN1cnJlbnQgTUlESSBNYXBwZXIgc2V0dXAgcmVmZXJzIHRvIGEgTUlESSBkZXZpY2UgdGhhdCBpcyBub3QgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uIFVzZSBNSURJIE1hcHBlciB0byBlZGl0IHRoZSBzZXR1cC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUlESUVSUl9JTlZBTElEU0VUVVA6Ci0JCQltc2dwdHIgPSAiVGhlIGN1cnJlbnQgTUlESSBzZXR1cCBpcyBkYW1hZ2VkLiBDb3B5IHRoZSBvcmlnaW5hbCBNSURJTUFQLkNGRyBmaWxlIHRvIHRoZSBXaW5kb3dzIFNZU1RFTSBkaXJlY3RvcnksIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0vKgotbXNnIyAzMzYgOiBDYW5ub3QgdXNlIHRoZSBzb25nLXBvaW50ZXIgdGltZSBmb3JtYXQgYW5kIHRoZSBTTVBURSB0aW1lLWZvcm1hdCB0b2dldGhlci4KLW1zZyMgMzM3IDogVGhlIHNwZWNpZmllZCBNSURJIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZS4gV2FpdCB1bnRpbCBpdCBpcyBmcmVlLCBhbmQgdGhlbiB0cnkgYWdhaW4uCi1tc2cjIDMzOCA6IFRoZSBzcGVjaWZpZWQgTUlESSBkZXZpY2UgaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLiBVc2UgdGhlIERyaXZlcnMgb3B0aW9uIGluIENvbnRyb2wgUGFuZWwgdG8gaW5zdGFsbCB0aGUgZHJpdmVyLgotbXNnIyAzMzkgOiBUaGUgY3VycmVudCBNSURJIE1hcHBlciBzZXR1cCByZWZlcnMgdG8gYSBNSURJIGRldmljZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIE1JREkgTWFwcGVyIHRvIGVkaXQgdGhlIHNldHVwLgotbXNnIyAzNDAgOiBBbiBlcnJvciBvY2N1cnJlZCB1c2luZyB0aGUgc3BlY2lmaWVkIHBvcnQuCi1tc2cjIDM0MSA6IEFsbCBtdWx0aW1lZGlhIHRpbWVycyBhcmUgYmVpbmcgdXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbnMuIFF1aXQgb25lIG9mIHRoZXNlIGFwcGxpY2F0aW9ucywgYW5kIHRoZW4gdHJ5IGFnYWluLgotbXNnIyAzNDIgOiBUaGVyZSBpcyBubyBjdXJyZW50IE1JREkgcG9ydC4KLW1zZyMgMzQzIDogVGhlcmUgYXJlIG5vIE1JREkgZGV2aWNlcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiBpbiBDb250cm9sIFBhbmVsIHRvIGluc3RhbGwgdGhlIGRyaXZlci4KLSovCi0JCWRlZmF1bHQ6Ci0JCQltc2dwdHIgPSAiVW5rbm93biBNSURJIEVycm9yICFcbiI7Ci0JCQlicmVhazsKLQkJfQotCWxzdHJjcHluMzJBKGxwVGV4dCwgbXNncHRyLCB1U2l6ZSk7Ci0JcmV0dXJuIFRSVUU7CisgICAgTFBTVFIJbXNncHRyOworICAgIGlmICgobHBUZXh0ID09IE5VTEwpIHx8ICh1U2l6ZSA8IDEpKSByZXR1cm4oRkFMU0UpOworICAgIGxwVGV4dFswXSA9ICdcMCc7CisgICAgc3dpdGNoKHVFcnJvcikgeworICAgIGNhc2UgTUlESUVSUl9VTlBSRVBBUkVEOgorCW1zZ3B0ciA9ICJUaGUgTUlESSBoZWFkZXIgd2FzIG5vdCBwcmVwYXJlZC4gVXNlIHRoZSBQcmVwYXJlIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIGhlYWRlciwgYW5kIHRoZW4gdHJ5IGFnYWluLiI7CisJYnJlYWs7CisgICAgY2FzZSBNSURJRVJSX1NUSUxMUExBWUlORzoKKwltc2dwdHIgPSAiQ2Fubm90IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gd2hpbGUgbWVkaWEgZGF0YSBpcyBzdGlsbCBwbGF5aW5nLiBSZXNldCB0aGUgZGV2aWNlLCBvciB3YWl0IHVudGlsIHRoZSBkYXRhIGlzIGZpbmlzaGVkIHBsYXlpbmcuIjsKKwlicmVhazsKKyAgICBjYXNlIE1JRElFUlJfTk9NQVA6CisJbXNncHRyID0gIkEgTUlESSBtYXAgd2FzIG5vdCBmb3VuZC4gVGhlcmUgbWF5IGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBkcml2ZXIsIG9yIHRoZSBNSURJTUFQLkNGRyBmaWxlIG1heSBiZSBjb3JydXB0IG9yIG1pc3NpbmcuIjsKKwlicmVhazsKKyAgICBjYXNlIE1JRElFUlJfTk9UUkVBRFk6CisJbXNncHRyID0gIlRoZSBwb3J0IGlzIHRyYW5zbWl0dGluZyBkYXRhIHRvIHRoZSBkZXZpY2UuIFdhaXQgdW50aWwgdGhlIGRhdGEgaGFzIGJlZW4gdHJhbnNtaXR0ZWQsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOworCWJyZWFrOworICAgIGNhc2UgTUlESUVSUl9OT0RFVklDRToKKwltc2dwdHIgPSAiVGhlIGN1cnJlbnQgTUlESSBNYXBwZXIgc2V0dXAgcmVmZXJzIHRvIGEgTUlESSBkZXZpY2UgdGhhdCBpcyBub3QgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uIFVzZSBNSURJIE1hcHBlciB0byBlZGl0IHRoZSBzZXR1cC4iOworCWJyZWFrOworICAgIGNhc2UgTUlESUVSUl9JTlZBTElEU0VUVVA6CisJbXNncHRyID0gIlRoZSBjdXJyZW50IE1JREkgc2V0dXAgaXMgZGFtYWdlZC4gQ29weSB0aGUgb3JpZ2luYWwgTUlESU1BUC5DRkcgZmlsZSB0byB0aGUgV2luZG93cyBTWVNURU0gZGlyZWN0b3J5LCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKKwlicmVhazsKKwkvKgorCSAgbXNnIyAzMzYgOiBDYW5ub3QgdXNlIHRoZSBzb25nLXBvaW50ZXIgdGltZSBmb3JtYXQgYW5kIHRoZSBTTVBURSB0aW1lLWZvcm1hdCB0b2dldGhlci4KKwkgIG1zZyMgMzM3IDogVGhlIHNwZWNpZmllZCBNSURJIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZS4gV2FpdCB1bnRpbCBpdCBpcyBmcmVlLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICBtc2cjIDMzOCA6IFRoZSBzcGVjaWZpZWQgTUlESSBkZXZpY2UgaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLiBVc2UgdGhlIERyaXZlcnMgb3B0aW9uIGluIENvbnRyb2wgUGFuZWwgdG8gaW5zdGFsbCB0aGUgZHJpdmVyLgorCSAgbXNnIyAzMzkgOiBUaGUgY3VycmVudCBNSURJIE1hcHBlciBzZXR1cCByZWZlcnMgdG8gYSBNSURJIGRldmljZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIE1JREkgTWFwcGVyIHRvIGVkaXQgdGhlIHNldHVwLgorCSAgbXNnIyAzNDAgOiBBbiBlcnJvciBvY2N1cnJlZCB1c2luZyB0aGUgc3BlY2lmaWVkIHBvcnQuCisJICBtc2cjIDM0MSA6IEFsbCBtdWx0aW1lZGlhIHRpbWVycyBhcmUgYmVpbmcgdXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbnMuIFF1aXQgb25lIG9mIHRoZXNlIGFwcGxpY2F0aW9ucywgYW5kIHRoZW4gdHJ5IGFnYWluLgorCSAgbXNnIyAzNDIgOiBUaGVyZSBpcyBubyBjdXJyZW50IE1JREkgcG9ydC4KKwkgIG1zZyMgMzQzIDogVGhlcmUgYXJlIG5vIE1JREkgZGV2aWNlcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiBpbiBDb250cm9sIFBhbmVsIHRvIGluc3RhbGwgdGhlIGRyaXZlci4KKwkqLworICAgIGRlZmF1bHQ6CisJbXNncHRyID0gIlVua25vd24gTUlESSBFcnJvciAhXG4iOworCWJyZWFrOworICAgIH0KKyAgICBsc3RyY3B5bjMyQShscFRleHQsIG1zZ3B0ciwgdVNpemUpOworICAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE5NjksNDkgKzE5OTAsNTQgQEAKIFVJTlQzMiBXSU5BUEkgbWlkaU91dE9wZW4zMihITUlESU9VVDMyICogbHBoTWlkaU91dCwgVUlOVDMyIHVEZXZpY2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NhbGxiYWNrLCBEV09SRCBkd0luc3RhbmNlLCBEV09SRCBkd0ZsYWdzKQogewotCUhNSURJT1VUMTYJaG1vMTY7Ci0JVUlOVDMyCQlyZXQ7Ci0KLQlyZXQgPSBtaWRpT3V0T3BlbjE2KCZobW8xNix1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLAotCQkJICAgIENBTExCQUNLMzJDT05WKGR3RmxhZ3MpKTsKLQlpZiAobHBoTWlkaU91dCkgKmxwaE1pZGlPdXQgPSBobW8xNjsKLQlyZXR1cm4gcmV0OworICAgIEhNSURJT1VUMTYJaG1vMTY7CisgICAgVUlOVDMyCXJldDsKKyAgICAKKyAgICByZXQgPSBtaWRpT3V0T3BlbjE2KCZobW8xNix1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLAorCQkJQ0FMTEJBQ0szMkNPTlYoZHdGbGFncykpOworICAgIGlmIChscGhNaWRpT3V0KSAqbHBoTWlkaU91dCA9IGhtbzE2OworICAgIHJldHVybiByZXQ7CiB9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1pZGlPdXRPcGVuICAgIAkJW01NU1lTVEVNLjIwNF0KICAqLwogVUlOVDE2IFdJTkFQSSBtaWRpT3V0T3BlbjE2KEhNSURJT1VUMTYgKiBscGhNaWRpT3V0LCBVSU5UMTYgdURldmljZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3Q2FsbGJhY2ssIERXT1JEIGR3SW5zdGFuY2UsIERXT1JEIGR3RmxhZ3MpCiB7Ci0JSE1JREkxNgloTWlkaU91dDsKLQlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JRFdPUkQJZHdSZXQgPSAwOwotCUJPT0wzMgliTWFwcGVyRmxnID0gRkFMU0U7Ci0JaWYgKGxwaE1pZGlPdXQgIT0gTlVMTCkgKmxwaE1pZGlPdXQgPSAwOwotCVRSQUNFKG1tc3lzLCAiKCVwLCAlZCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKLQkJbHBoTWlkaU91dCwgdURldmljZUlELCBkd0NhbGxiYWNrLCBkd0luc3RhbmNlLCBkd0ZsYWdzKTsKLQlpZiAodURldmljZUlEID09IChVSU5UMTYpTUlESV9NQVBQRVIpIHsKLQkJVFJBQ0UobW1zeXMsICJNSURJX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKLQkJYk1hcHBlckZsZyA9IFRSVUU7Ci0JCXVEZXZpY2VJRCA9IDA7Ci0JfQotCWhNaWRpT3V0ID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihNSURJT1BFTkRFU0MpKTsKLQlpZiAobHBoTWlkaU91dCAhPSBOVUxMKSAqbHBoTWlkaU91dCA9IGhNaWRpT3V0OwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpCi0JCXJldHVybiBNTVNZU0VSUl9OT01FTTsKLQlscERlc2MtPmhNaWRpID0gaE1pZGlPdXQ7Ci0JbHBEZXNjLT5kd0NhbGxiYWNrID0gZHdDYWxsYmFjazsKLQlscERlc2MtPmR3SW5zdGFuY2UgPSBkd0luc3RhbmNlOwotCXdoaWxlKHVEZXZpY2VJRCA8IE1BWE1JRElEUklWRVJTKSB7Ci0JCWR3UmV0ID0gbW9kTWVzc2FnZSh1RGV2aWNlSUQsIE1PRE1fT1BFTiwgCi0JCQlscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscERlc2MsIDBMKTsKLQkJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOwotCQlpZiAoIWJNYXBwZXJGbGcpIGJyZWFrOwotCQl1RGV2aWNlSUQrKzsKLQkJVFJBQ0UobW1zeXMsICJNSURJX01BUFBFUiBtb2RlICEgdHJ5IG5leHQgZHJpdmVyLi4uXG4iKTsKLQl9Ci0JcmV0dXJuIGR3UmV0OworICAgIEhNSURJMTYJCQloTWlkaU91dDsKKyAgICBMUE1JRElPUEVOREVTQwkJbHBEZXNjOworICAgIERXT1JECQkJZHdSZXQgPSAwOworICAgIEJPT0wzMgkJCWJNYXBwZXJGbGcgPSBGQUxTRTsKKyAgICAKKyAgICBpZiAobHBoTWlkaU91dCAhPSBOVUxMKSAqbHBoTWlkaU91dCA9IDA7CisgICAgVFJBQ0UobW1zeXMsICIoJXAsICVkLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCSAgbHBoTWlkaU91dCwgdURldmljZUlELCBkd0NhbGxiYWNrLCBkd0luc3RhbmNlLCBkd0ZsYWdzKTsKKyAgICBpZiAodURldmljZUlEID09IChVSU5UMTYpTUlESV9NQVBQRVIpIHsKKwlUUkFDRShtbXN5cywgIk1JRElfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOworCWJNYXBwZXJGbGcgPSBUUlVFOworCXVEZXZpY2VJRCA9IDA7CisgICAgfQorICAgIGhNaWRpT3V0ID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihNSURJT1BFTkRFU0MpKTsKKyAgICBpZiAobHBoTWlkaU91dCAhPSBOVUxMKSAKKwkqbHBoTWlkaU91dCA9IGhNaWRpT3V0OworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpCisJcmV0dXJuIE1NU1lTRVJSX05PTUVNOworICAgIGxwRGVzYy0+aE1pZGkgPSBoTWlkaU91dDsKKyAgICBscERlc2MtPmR3Q2FsbGJhY2sgPSBkd0NhbGxiYWNrOworICAgIGxwRGVzYy0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7CisgICAgCisgICAgd2hpbGUodURldmljZUlEIDwgTUFYTUlESURSSVZFUlMpIHsKKwlkd1JldCA9IG1vZE1lc3NhZ2UodURldmljZUlELCBNT0RNX09QRU4sIAorCQkJICAgbHBEZXNjLT5kd0luc3RhbmNlLCAoRFdPUkQpbHBEZXNjLCBkd0ZsYWdzKTsKKwlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7CisJaWYgKCFiTWFwcGVyRmxnKSBicmVhazsKKwl1RGV2aWNlSUQrKzsKKwlUUkFDRShtbXN5cywgIk1JRElfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOworICAgIH0KKyAgICBscERlc2MtPndEZXZJRCA9IHVEZXZpY2VJRDsKKyAgICByZXR1cm4gZHdSZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjAxOSw3ICsyMDQ1LDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSBtaWRpT3V0Q2xvc2UzMihITUlESU9VVDMyIGhNaWRpT3V0KQogewotCXJldHVybiBtaWRpT3V0Q2xvc2UxNihoTWlkaU91dCk7CisgICAgcmV0dXJuIG1pZGlPdXRDbG9zZTE2KGhNaWRpT3V0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDI3LDExICsyMDUzLDExIEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaU91dENsb3NlMTYoSE1JRElPVVQxNiBoTWlkaU91dCkKIHsKLQlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhNaWRpT3V0KTsKLQlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOworICAgIExQTUlESU9QRU5ERVNDCWxwRGVzYzsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaE1pZGlPdXQpOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gbW9kTWVzc2FnZShscERlc2MtPndEZXZJRCwgTU9ETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwNDAsNyArMjA2NiwxNCBAQAogVUlOVDMyIFdJTkFQSSBtaWRpT3V0UHJlcGFyZUhlYWRlcjMyKEhNSURJT1VUMzIgaE1pZGlPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDMyIHVTaXplKQogewotCXJldHVybiBtaWRpT3V0UHJlcGFyZUhlYWRlcjE2KGhNaWRpT3V0LGxwTWlkaU91dEhkcix1U2l6ZSk7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAorCSAgaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBscE1pZGlPdXRIZHItPnJlc2VydmVkID0gKERXT1JEKWxwTWlkaU91dEhkci0+bHBEYXRhOworICAgIHJldHVybiBtb2RNZXNzYWdlKGxwRGVzYy0+d0RldklELCBNT0RNX1BSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJCSAgICAgIChEV09SRClscE1pZGlPdXRIZHIsIChEV09SRCl1U2l6ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjA0OSwxMyArMjA4MiwxNCBAQAogVUlOVDE2IFdJTkFQSSBtaWRpT3V0UHJlcGFyZUhlYWRlcjE2KEhNSURJT1VUMTYgaE1pZGlPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKQogewotCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpXG4iLCAKLQkJCQkJaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gbW9kTWVzc2FnZSgwLCBNT0RNX1BSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCi0JCQkgIChEV09SRClscE1pZGlPdXRIZHIsIChEV09SRCl1U2l6ZSk7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAorCSAgaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBscE1pZGlPdXRIZHItPnJlc2VydmVkID0gKERXT1JEKVBUUl9TRUdfVE9fTElOKGxwTWlkaU91dEhkci0+bHBEYXRhKTsKKyAgICByZXR1cm4gbW9kTWVzc2FnZShscERlc2MtPndEZXZJRCwgTU9ETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgICAoRFdPUkQpbHBNaWRpT3V0SGRyLCAoRFdPUkQpdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwNjQsMjEgKzIwOTgsMjIgQEAKIFVJTlQzMiBXSU5BUEkgbWlkaU91dFVucHJlcGFyZUhlYWRlcjMyKEhNSURJT1VUMzIgaE1pZGlPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJSERSICogbHBNaWRpT3V0SGRyLCBVSU5UMzIgdVNpemUpCiB7Ci0JcmV0dXJuIG1pZGlPdXRVbnByZXBhcmVIZWFkZXIxNihoTWlkaU91dCxscE1pZGlPdXRIZHIsdVNpemUpOworICAgIHJldHVybiBtaWRpT3V0VW5wcmVwYXJlSGVhZGVyMTYoaE1pZGlPdXQsbHBNaWRpT3V0SGRyLHVTaXplKTsKIH0KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWlkaU91dFVucHJlcGFyZUhlYWRlcglbTU1TWVNURU0uMjA3XQogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRVbnByZXBhcmVIZWFkZXIxNihITUlESU9VVDE2IGhNaWRpT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlPdXRIZHIsIFVJTlQxNiB1U2l6ZSkKKwkJCQkgICAgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKQogewotCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpXG4iLCAKLQkJCQkJaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gbW9kTWVzc2FnZSgwLCBNT0RNX1VOUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKLQkJCQkJCShEV09SRClscE1pZGlPdXRIZHIsIChEV09SRCl1U2l6ZSk7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAorCSAgaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gbW9kTWVzc2FnZShscERlc2MtPndEZXZJRCwgTU9ETV9VTlBSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJCSAgICAgIChEV09SRClscE1pZGlPdXRIZHIsIChEV09SRCl1U2l6ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjA4NiwxOCArMjEyMSwxOSBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlPdXRTaG9ydE1zZzMyKEhNSURJT1VUMzIgaE1pZGlPdXQsIERXT1JEIGR3TXNnKQogewotCXJldHVybiBtaWRpT3V0U2hvcnRNc2cxNihoTWlkaU91dCxkd01zZyk7CisgICAgcmV0dXJuIG1pZGlPdXRTaG9ydE1zZzE2KGhNaWRpT3V0LGR3TXNnKTsKIH0KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWlkaU91dFNob3J0TXNnCQlbTU1TWVNURU0uMjA4XQogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRTaG9ydE1zZzE2KEhNSURJT1VUMTYgaE1pZGlPdXQsIERXT1JEIGR3TXNnKQogewotCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlMDhsWClcbiIsIGhNaWRpT3V0LCBkd01zZyk7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiBtb2RNZXNzYWdlKDAsIE1PRE1fREFUQSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd01zZywgMEwpOworICAgIExQTUlESU9QRU5ERVNDCWxwRGVzYzsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlMDhsWClcbiIsIGhNaWRpT3V0LCBkd01zZyk7CisgICAgbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiBtb2RNZXNzYWdlKGxwRGVzYy0+d0RldklELCBNT0RNX0RBVEEsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdNc2csIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTA2LDcgKzIxNDIsNyBAQAogVUlOVDMyIFdJTkFQSSBtaWRpT3V0TG9uZ01zZzMyKEhNSURJT1VUMzIgaE1pZGlPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDMyIHVTaXplKQogewotCXJldHVybiBtaWRpT3V0TG9uZ01zZzE2KGhNaWRpT3V0LGxwTWlkaU91dEhkcix1U2l6ZSk7CisgICAgcmV0dXJuIG1pZGlPdXRMb25nTXNnMTYoaE1pZGlPdXQsbHBNaWRpT3V0SGRyLHVTaXplKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTE1LDEzICsyMTUxLDEzIEBACiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRMb25nTXNnMTYoSE1JRElPVVQxNiBoTWlkaU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJSERSICogbHBNaWRpT3V0SGRyLCBVSU5UMTYgdVNpemUpCiB7Ci0JTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAotCQkJCWhNaWRpT3V0LCBscE1pZGlPdXRIZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9MT05HREFUQSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKLQkJCQkJCShEV09SRClscE1pZGlPdXRIZHIsIChEV09SRCl1U2l6ZSk7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAorCSAgaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gbW9kTWVzc2FnZShscERlc2MtPndEZXZJRCwgTU9ETV9MT05HREFUQSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKKwkJICAgICAgKERXT1JEKWxwTWlkaU91dEhkciwgKERXT1JEKXVTaXplKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTI5LDcgKzIxNjUsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlPdXRSZXNldDMyKEhNSURJT1VUMzIgaE1pZGlPdXQpCiB7Ci0JcmV0dXJuIG1pZGlPdXRSZXNldDE2KGhNaWRpT3V0KTsKKyAgICByZXR1cm4gbWlkaU91dFJlc2V0MTYoaE1pZGlPdXQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIxMzcsMTEgKzIxNzMsMTEgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBtaWRpT3V0UmVzZXQxNihITUlESU9VVDE2IGhNaWRpT3V0KQogewotCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaE1pZGlPdXQpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gbW9kTWVzc2FnZSgwLCBNT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoTWlkaU91dCk7CisgICAgbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiBtb2RNZXNzYWdlKGxwRGVzYy0+d0RldklELCBNT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjE0OSwxNSArMjE4NSwxNSBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlPdXRHZXRWb2x1bWUzMihVSU5UMzIgdURldmljZUlELCBEV09SRCAqIGxwZHdWb2x1bWUpCiB7Ci0JcmV0dXJuIG1pZGlPdXRHZXRWb2x1bWUxNih1RGV2aWNlSUQsbHBkd1ZvbHVtZSk7CisgICAgcmV0dXJuIG1pZGlPdXRHZXRWb2x1bWUxNih1RGV2aWNlSUQsbHBkd1ZvbHVtZSk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaWRpT3V0R2V0Vm9sdW1lCVtNTVNZU1RFTS4yMTFdCiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaU91dEdldFZvbHVtZTE2KFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEICogbHBkd1ZvbHVtZSkKIHsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlcCk7XG4iLCB1RGV2aWNlSUQsIGxwZHdWb2x1bWUpOwotCXJldHVybiBtb2RNZXNzYWdlKHVEZXZpY2VJRCwgTU9ETV9HRVRWT0xVTUUsIDBMLCAoRFdPUkQpbHBkd1ZvbHVtZSwgMEwpOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwKTtcbiIsIHVEZXZpY2VJRCwgbHBkd1ZvbHVtZSk7CisgICAgcmV0dXJuIG1vZE1lc3NhZ2UodURldmljZUlELCBNT0RNX0dFVFZPTFVNRSwgMEwsIChEV09SRClscGR3Vm9sdW1lLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjE2NSw3ICsyMjAxLDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSBtaWRpT3V0U2V0Vm9sdW1lMzIoVUlOVDMyIHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpCiB7Ci0JcmV0dXJuIG1pZGlPdXRTZXRWb2x1bWUxNih1RGV2aWNlSUQsZHdWb2x1bWUpOworICAgIHJldHVybiBtaWRpT3V0U2V0Vm9sdW1lMTYodURldmljZUlELGR3Vm9sdW1lKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTczLDggKzIyMDksOCBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRTZXRWb2x1bWUxNihVSU5UMTYgdURldmljZUlELCBEV09SRCBkd1ZvbHVtZSkKIHsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlMDhsWCk7XG4iLCB1RGV2aWNlSUQsIGR3Vm9sdW1lKTsKLQlyZXR1cm4gbW9kTWVzc2FnZSh1RGV2aWNlSUQsIE1PRE1fU0VUVk9MVU1FLCAwTCwgZHdWb2x1bWUsIDBMKTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlMDhsWCk7XG4iLCB1RGV2aWNlSUQsIGR3Vm9sdW1lKTsKKyAgICByZXR1cm4gbW9kTWVzc2FnZSh1RGV2aWNlSUQsIE1PRE1fU0VUVk9MVU1FLCAwTCwgZHdWb2x1bWUsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTgzLDcgKzIyMTksNyBAQAogVUlOVDMyIFdJTkFQSSBtaWRpT3V0Q2FjaGVQYXRjaGVzMzIoSE1JRElPVVQzMiBoTWlkaU91dCwgVUlOVDMyIHVCYW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqIGxwd1BhdGNoQXJyYXksIFVJTlQzMiB1RmxhZ3MpCiB7Ci0JcmV0dXJuIG1pZGlPdXRDYWNoZVBhdGNoZXMxNihoTWlkaU91dCx1QmFuayxscHdQYXRjaEFycmF5LHVGbGFncyk7CisgICAgcmV0dXJuIG1pZGlPdXRDYWNoZVBhdGNoZXMxNihoTWlkaU91dCx1QmFuayxscHdQYXRjaEFycmF5LHVGbGFncyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjE5Miw5ICsyMjI4LDkgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaU91dENhY2hlUGF0Y2hlczE2KEhNSURJT1VUMTYgaE1pZGlPdXQsIFVJTlQxNiB1QmFuaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKiBscHdQYXRjaEFycmF5LCBVSU5UMTYgdUZsYWdzKQogewotICAgICAgICAvKiBub3QgcmVhbGx5IG5lY2Vzc2FyeSB0byBzdXBwb3J0IHRoaXMgKi8KLQlGSVhNRShtbXN5cywgIm5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKLQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworICAgIC8qIG5vdCByZWFsbHkgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhpcyAqLworICAgIEZJWE1FKG1tc3lzLCAibm90IHN1cHBvcnRlZCB5ZXRcbiIpOworICAgIHJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjIwMyw3ICsyMjM5LDcgQEAKIFVJTlQzMiBXSU5BUEkgbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMzMihITUlESU9VVDMyIGhNaWRpT3V0LCBVSU5UMzIgdVBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKiBscHdLZXlBcnJheSwgVUlOVDMyIHVGbGFncykKIHsKLQlyZXR1cm4gbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMxNihoTWlkaU91dCx1UGF0Y2gsbHB3S2V5QXJyYXksdUZsYWdzKTsKKyAgICByZXR1cm4gbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMxNihoTWlkaU91dCx1UGF0Y2gsbHB3S2V5QXJyYXksdUZsYWdzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjEyLDggKzIyNDgsOCBAQAogVUlOVDE2IFdJTkFQSSBtaWRpT3V0Q2FjaGVEcnVtUGF0Y2hlczE2KEhNSURJT1VUMTYgaE1pZGlPdXQsIFVJTlQxNiB1UGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqIGxwd0tleUFycmF5LCBVSU5UMTYgdUZsYWdzKQogewotCUZJWE1FKG1tc3lzLCAibm90IHN1cHBvcnRlZCB5ZXRcbiIpOwotCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CisgICAgRklYTUUobW1zeXMsICJub3Qgc3VwcG9ydGVkIHlldFxuIik7CisgICAgcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjIxLDEyICsyMjU3LDEyIEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgbWlkaU91dEdldElEMzIoSE1JRElPVVQzMiBoTWlkaU91dCwgVUlOVDMyICogbHB1RGV2aWNlSUQpCiB7Ci0JVUlOVDE2CXhpZDsKLQlVSU5UMzIJcmV0OwotCi0JcmV0ID0gbWlkaU91dEdldElEMTYoaE1pZGlPdXQsJnhpZCk7Ci0JKmxwdURldmljZUlEID0geGlkOwotCXJldHVybiByZXQ7CisgICAgVUlOVDE2CXhpZDsKKyAgICBVSU5UMzIJcmV0OworICAgIAorICAgIHJldCA9IG1pZGlPdXRHZXRJRDE2KGhNaWRpT3V0LCZ4aWQpOworICAgICpscHVEZXZpY2VJRCA9IHhpZDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIyMzQsOCArMjI3MCw4IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaU91dEdldElEMTYoSE1JRElPVVQxNiBoTWlkaU91dCwgVUlOVDE2ICogbHB1RGV2aWNlSUQpCiB7Ci0JVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0SURcbiIpOwotCXJldHVybiAwOworICAgIFRSQUNFKG1tc3lzLCAibWlkaU91dEdldElEXG4iKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjQ0LDM0ICsyMjgwLDM0IEBACiBEV09SRCBXSU5BUEkgbWlkaU91dE1lc3NhZ2UzMihITUlESU9VVDMyIGhNaWRpT3V0LCBVSU5UMzIgdU1lc3NhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAotCQkJaE1pZGlPdXQsIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlzd2l0Y2ggKHVNZXNzYWdlKSB7Ci0JY2FzZSBNT0RNX09QRU46Ci0JCUZJWE1FKG1tc3lzLCJjYW4ndCBoYW5kbGUgTU9ETV9PUEVOIVxuIik7Ci0JCXJldHVybiAwOwotCWNhc2UgTU9ETV9HRVRERVZDQVBTOgotCQlyZXR1cm4gbWlkaU91dEdldERldkNhcHMzMkEoaE1pZGlPdXQsKExQTUlESU9VVENBUFMzMkEpZHdQYXJhbTEsZHdQYXJhbTIpOwotCWNhc2UgTU9ETV9HRVROVU1ERVZTOgotCWNhc2UgTU9ETV9SRVNFVDoKLQljYXNlIE1PRE1fQ0xPU0U6Ci0JY2FzZSBNT0RNX0dFVFZPTFVNRToKLQljYXNlIE1PRE1fU0VUVk9MVU1FOgotCWNhc2UgTU9ETV9MT05HREFUQToKLQljYXNlIE1PRE1fUFJFUEFSRToKLQljYXNlIE1PRE1fVU5QUkVQQVJFOgotCQkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCSAgICAgICAgRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCi0JCSAgICBoTWlkaU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbW9kTWVzc2FnZSgwLCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgIExQTUlESU9QRU5ERVNDCWxwRGVzYzsKKyAgICAKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKKwkgIGhNaWRpT3V0LCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgc3dpdGNoICh1TWVzc2FnZSkgeworICAgIGNhc2UgTU9ETV9PUEVOOgorCUZJWE1FKG1tc3lzLCJjYW4ndCBoYW5kbGUgTU9ETV9PUEVOIVxuIik7CisJcmV0dXJuIDA7CisgICAgY2FzZSBNT0RNX0dFVERFVkNBUFM6CisJcmV0dXJuIG1pZGlPdXRHZXREZXZDYXBzMzJBKGhNaWRpT3V0LChMUE1JRElPVVRDQVBTMzJBKWR3UGFyYW0xLGR3UGFyYW0yKTsKKyAgICBjYXNlIE1PRE1fR0VUTlVNREVWUzoKKyAgICBjYXNlIE1PRE1fUkVTRVQ6CisgICAgY2FzZSBNT0RNX0NMT1NFOgorICAgIGNhc2UgTU9ETV9HRVRWT0xVTUU6CisgICAgY2FzZSBNT0RNX1NFVFZPTFVNRToKKyAgICBjYXNlIE1PRE1fTE9OR0RBVEE6CisgICAgY2FzZSBNT0RNX1BSRVBBUkU6CisgICAgY2FzZSBNT0RNX1VOUFJFUEFSRToKKwkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJICAgIGhNaWRpT3V0LHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG1vZE1lc3NhZ2UobHBEZXNjLT53RGV2SUQsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjI4MCwzNiArMjMxNiwzNiBAQAogRFdPUkQgV0lOQVBJIG1pZGlPdXRNZXNzYWdlMTYoSE1JRElPVVQxNiBoTWlkaU91dCwgVUlOVDE2IHVNZXNzYWdlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0KLQlUUkFDRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKLQkJCWhNaWRpT3V0LCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0Jc3dpdGNoICh1TWVzc2FnZSkgewotCWNhc2UgTU9ETV9PUEVOOgotCQlGSVhNRShtbXN5cywiY2FuJ3QgaGFuZGxlIE1PRE1fT1BFTiFcbiIpOwotCQlyZXR1cm4gMDsKLQljYXNlIE1PRE1fR0VUTlVNREVWUzoKLQljYXNlIE1PRE1fUkVTRVQ6Ci0JY2FzZSBNT0RNX0NMT1NFOgotCWNhc2UgTU9ETV9TRVRWT0xVTUU6Ci0JCS8qIG5vIGFyZ3VtZW50IGNvbnZlcnNpb24gbmVlZGVkICovCi0JCWJyZWFrOwotCWNhc2UgTU9ETV9HRVRWT0xVTUU6Ci0JCXJldHVybiBtaWRpT3V0R2V0Vm9sdW1lMTYoaE1pZGlPdXQsKExQRFdPUkQpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpKTsKLQljYXNlIE1PRE1fTE9OR0RBVEE6Ci0JCXJldHVybiBtaWRpT3V0TG9uZ01zZzE2KGhNaWRpT3V0LChMUE1JRElIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKLQljYXNlIE1PRE1fUFJFUEFSRToKLQkJcmV0dXJuIG1pZGlPdXRQcmVwYXJlSGVhZGVyMTYoaE1pZGlPdXQsKExQTUlESUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwotCWNhc2UgTU9ETV9VTlBSRVBBUkU6Ci0JCXJldHVybiBtaWRpT3V0VW5wcmVwYXJlSGVhZGVyMTYoaE1pZGlPdXQsKExQTUlESUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwotCWRlZmF1bHQ6Ci0JCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAotCQkgICAgaE1pZGlPdXQsdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIG1vZE1lc3NhZ2UoMCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBMUE1JRElPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJICBoTWlkaU91dCwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHN3aXRjaCAodU1lc3NhZ2UpIHsKKyAgICBjYXNlIE1PRE1fT1BFTjoKKwlGSVhNRShtbXN5cywiY2FuJ3QgaGFuZGxlIE1PRE1fT1BFTiFcbiIpOworCXJldHVybiAwOworICAgIGNhc2UgTU9ETV9HRVROVU1ERVZTOgorICAgIGNhc2UgTU9ETV9SRVNFVDoKKyAgICBjYXNlIE1PRE1fQ0xPU0U6CisgICAgY2FzZSBNT0RNX1NFVFZPTFVNRToKKwkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLworCWJyZWFrOworICAgIGNhc2UgTU9ETV9HRVRWT0xVTUU6CisJcmV0dXJuIG1pZGlPdXRHZXRWb2x1bWUxNihoTWlkaU91dCwoTFBEV09SRClQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSkpOworICAgIGNhc2UgTU9ETV9MT05HREFUQToKKwlyZXR1cm4gbWlkaU91dExvbmdNc2cxNihoTWlkaU91dCwoTFBNSURJSERSKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7CisgICAgY2FzZSBNT0RNX1BSRVBBUkU6CisJcmV0dXJuIG1pZGlPdXRQcmVwYXJlSGVhZGVyMTYoaE1pZGlPdXQsKExQTUlESUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOworICAgIGNhc2UgTU9ETV9VTlBSRVBBUkU6CisJcmV0dXJuIG1pZGlPdXRVbnByZXBhcmVIZWFkZXIxNihoTWlkaU91dCwoTFBNSURJSERSKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7CisgICAgZGVmYXVsdDoKKwlFUlIobW1zeXMsIiglMDR4LCUwNHgsJTA4bHgsJTA4bHgpOiB1bmhhbmRsZWQgbWVzc2FnZVxuIiwKKwkgICAgaE1pZGlPdXQsdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbW9kTWVzc2FnZShscERlc2MtPndEZXZJRCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMzE3LDcgKzIzNTMsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlJbkdldE51bURldnMzMih2b2lkKQogewotCXJldHVybiBtaWRpSW5HZXROdW1EZXZzMTYoKTsKKyAgICByZXR1cm4gbWlkaUluR2V0TnVtRGV2czE2KCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjMyNSwxMSArMjM2MSwxMSBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJbkdldE51bURldnMxNih2b2lkKQogewotCVVJTlQxNgljb3VudCA9IDA7Ci0JVFJBQ0UobW1zeXMsICJtaWRpSW5HZXROdW1EZXZzXG4iKTsKLQljb3VudCArPSBtaWRNZXNzYWdlKDAsIE1JRE1fR0VUTlVNREVWUywgMEwsIDBMLCAwTCk7Ci0JVFJBQ0UobW1zeXMsICJtaWRpSW5HZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKLQlyZXR1cm4gY291bnQ7CisgICAgVUlOVDE2CWNvdW50ID0gMDsKKyAgICBUUkFDRShtbXN5cywgIm1pZGlJbkdldE51bURldnNcbiIpOworICAgIGNvdW50ICs9IG1pZE1lc3NhZ2UoMCwgTUlETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKKyAgICBUUkFDRShtbXN5cywgIm1pZGlJbkdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOworICAgIHJldHVybiBjb3VudDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMzM4LDE1ICsyMzc0LDE1IEBACiBVSU5UMzIgV0lOQVBJIG1pZGlJbkdldERldkNhcHMzMlcoVUlOVDMyIHVEZXZpY2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE1JRElJTkNBUFMzMlcgbHBDYXBzLCBVSU5UMzIgdVNpemUpCiB7Ci0JTUlESUlOQ0FQUzE2CW1pYzE2OwotCVVJTlQzMgkJcmV0ID0gbWlkaUluR2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwmbWljMTYsdVNpemUpOwotCi0JbHBDYXBzLT53TWlkID0gbWljMTYud01pZDsKLQlscENhcHMtPndQaWQgPSBtaWMxNi53UGlkOwotCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSBtaWMxNi52RHJpdmVyVmVyc2lvbjsKLQlsc3RyY3B5QXRvVyhscENhcHMtPnN6UG5hbWUsbWljMTYuc3pQbmFtZSk7Ci0JbHBDYXBzLT5kd1N1cHBvcnQgPSBtaWMxNi5kd1N1cHBvcnQ7Ci0JcmV0dXJuIHJldDsKKyAgICBNSURJSU5DQVBTMTYJbWljMTY7CisgICAgVUlOVDMyCQlyZXQgPSBtaWRpSW5HZXREZXZDYXBzMTYodURldmljZUlELCZtaWMxNix1U2l6ZSk7CisgICAgCisgICAgbHBDYXBzLT53TWlkID0gbWljMTYud01pZDsKKyAgICBscENhcHMtPndQaWQgPSBtaWMxNi53UGlkOworICAgIGxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSBtaWMxNi52RHJpdmVyVmVyc2lvbjsKKyAgICBsc3RyY3B5QXRvVyhscENhcHMtPnN6UG5hbWUsbWljMTYuc3pQbmFtZSk7CisgICAgbHBDYXBzLT5kd1N1cHBvcnQgPSBtaWMxNi5kd1N1cHBvcnQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMzU1LDI1ICsyMzkxLDI1IEBACiBVSU5UMzIgV0lOQVBJIG1pZGlJbkdldERldkNhcHMzMkEoVUlOVDMyIHVEZXZpY2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE1JRElJTkNBUFMzMkEgbHBDYXBzLCBVSU5UMzIgdVNpemUpCiB7Ci0JTUlESUlOQ0FQUzE2CW1pYzE2OwotCVVJTlQzMgkJcmV0ID0gbWlkaUluR2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwmbWljMTYsdVNpemUpOwotCi0JbHBDYXBzLT53TWlkID0gbWljMTYud01pZDsKLQlscENhcHMtPndQaWQgPSBtaWMxNi53UGlkOwotCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSBtaWMxNi52RHJpdmVyVmVyc2lvbjsKLQlzdHJjcHkobHBDYXBzLT5zelBuYW1lLG1pYzE2LnN6UG5hbWUpOwotCWxwQ2Fwcy0+ZHdTdXBwb3J0ID0gbWljMTYuZHdTdXBwb3J0OwotCXJldHVybiByZXQ7CisgICAgTUlESUlOQ0FQUzE2CW1pYzE2OworICAgIFVJTlQzMgkJcmV0ID0gbWlkaUluR2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwmbWljMTYsdVNpemUpOworICAgIAorICAgIGxwQ2Fwcy0+d01pZCA9IG1pYzE2LndNaWQ7CisgICAgbHBDYXBzLT53UGlkID0gbWljMTYud1BpZDsKKyAgICBscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gbWljMTYudkRyaXZlclZlcnNpb247CisgICAgc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSxtaWMxNi5zelBuYW1lKTsKKyAgICBscENhcHMtPmR3U3VwcG9ydCA9IG1pYzE2LmR3U3VwcG9ydDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaWRpSW5HZXREZXZDYXBzCVtNTVNZU1RFTS4zMDJdCiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaUluR2V0RGV2Q2FwczE2KFVJTlQxNiB1RGV2aWNlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNSURJSU5DQVBTMTYgbHBDYXBzLCBVSU5UMTYgdVNpemUpCisJCQkJIExQTUlESUlOQ0FQUzE2IGxwQ2FwcywgVUlOVDE2IHVTaXplKQogewotCVRSQUNFKG1tc3lzLCAibWlkaUluR2V0RGV2Q2Fwc1xuIik7Ci0JcmV0dXJuIG1pZE1lc3NhZ2UodURldmljZUlELE1JRE1fR0VUREVWQ0FQUywwLChEV09SRClscENhcHMsdVNpemUpOzsKKyAgICBUUkFDRShtbXN5cywgIm1pZGlJbkdldERldkNhcHNcbiIpOworICAgIHJldHVybiBtaWRNZXNzYWdlKHVEZXZpY2VJRCxNSURNX0dFVERFVkNBUFMsMCwoRFdPUkQpbHBDYXBzLHVTaXplKTs7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjM4MSwxOCArMjQxNywxOCBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlJbkdldEVycm9yVGV4dDMyVyhVSU5UMzIgdUVycm9yLCBMUFdTVFIgbHBUZXh0LCBVSU5UMzIgdVNpemUpCiB7Ci0JTFBTVFIJeHN0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsdVNpemUpOwotCVVJTlQzMglyZXQgPSBtaWRpSW5HZXRFcnJvclRleHQxNih1RXJyb3IseHN0cix1U2l6ZSk7Ci0JbHN0cmNweUF0b1cobHBUZXh0LHhzdHIpOwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx4c3RyKTsKLQlyZXR1cm4gcmV0OworICAgIExQU1RSCXhzdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHVTaXplKTsKKyAgICBVSU5UMzIJcmV0ID0gbWlkaUluR2V0RXJyb3JUZXh0MTYodUVycm9yLHhzdHIsdVNpemUpOworICAgIGxzdHJjcHlBdG9XKGxwVGV4dCx4c3RyKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAseHN0cik7CisgICAgcmV0dXJuIHJldDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1pZGlJbkdldEVycm9yVGV4dCAJCVtXSU5NTS42MV0KICAqLwogVUlOVDMyIFdJTkFQSSBtaWRpSW5HZXRFcnJvclRleHQzMkEoVUlOVDMyIHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMzIgdVNpemUpCiB7Ci0JcmV0dXJuIG1pZGlJbkdldEVycm9yVGV4dDE2KHVFcnJvcixscFRleHQsdVNpemUpOworICAgIHJldHVybiBtaWRpSW5HZXRFcnJvclRleHQxNih1RXJyb3IsbHBUZXh0LHVTaXplKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNDAwLDggKzI0MzYsOCBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJbkdldEVycm9yVGV4dDE2KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewotCVRSQUNFKG1tc3lzLCAibWlkaUluR2V0RXJyb3JUZXh0XG4iKTsKLQlyZXR1cm4gKG1pZGlHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKSk7CisgICAgVFJBQ0UobW1zeXMsICJtaWRpSW5HZXRFcnJvclRleHRcbiIpOworICAgIHJldHVybiAobWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNDEwLDEwICsyNDQ2LDEyIEBACiBVSU5UMzIgV0lOQVBJIG1pZGlJbk9wZW4zMihITUlESUlOMzIgKiBscGhNaWRpSW4sIFVJTlQzMiB1RGV2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NhbGxiYWNrLCBEV09SRCBkd0luc3RhbmNlLCBEV09SRCBkd0ZsYWdzKQogewotCUhNSURJSU4xNgl4aG1pZDE2OwotCVVJTlQzMiByZXQgPSBtaWRpSW5PcGVuMTYoJnhobWlkMTYsdURldmljZUlELGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSxkd0ZsYWdzKTsKLQlpZiAobHBoTWlkaUluKSAqbHBoTWlkaUluID0geGhtaWQxNjsKLQlyZXR1cm4gcmV0OworICAgIEhNSURJSU4xNgl4aG1pZDE2OworICAgIFVJTlQzMiAJCXJldCA9IG1pZGlJbk9wZW4xNigmeGhtaWQxNix1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLAorCQkJCQkgICBDQUxMQkFDSzMyQ09OVihkd0ZsYWdzKSk7CisgICAgaWYgKGxwaE1pZGlJbikgCisJKmxwaE1pZGlJbiA9IHhobWlkMTY7CisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNDIyLDM1ICsyNDYwLDQyIEBACiBVSU5UMTYgV0lOQVBJIG1pZGlJbk9wZW4xNihITUlESUlOMTYgKiBscGhNaWRpSW4sIFVJTlQxNiB1RGV2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NhbGxiYWNrLCBEV09SRCBkd0luc3RhbmNlLCBEV09SRCBkd0ZsYWdzKQogewotCUhNSURJMTYJaE1pZGlJbjsKLQlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JRFdPUkQJZHdSZXQgPSAwOwotCUJPT0wzMgliTWFwcGVyRmxnID0gRkFMU0U7Ci0KLQlpZiAobHBoTWlkaUluICE9IE5VTEwpICpscGhNaWRpSW4gPSAwOwotCVRSQUNFKG1tc3lzLCAiKCVwLCAlZCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKLQkJbHBoTWlkaUluLCB1RGV2aWNlSUQsIGR3Q2FsbGJhY2ssIGR3SW5zdGFuY2UsIGR3RmxhZ3MpOwotCWlmICh1RGV2aWNlSUQgPT0gKFVJTlQxNilNSURJX01BUFBFUikgewotCQlUUkFDRShtbXN5cywgIk1JRElfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOwotCQliTWFwcGVyRmxnID0gVFJVRTsKLQkJdURldmljZUlEID0gMDsKLQl9Ci0JaE1pZGlJbiA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoTUlESU9QRU5ERVNDKSk7Ci0JaWYgKGxwaE1pZGlJbiAhPSBOVUxMKSAqbHBoTWlkaUluID0gaE1pZGlJbjsKLQlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT01FTTsKLQlscERlc2MtPmhNaWRpID0gaE1pZGlJbjsKLQlscERlc2MtPmR3Q2FsbGJhY2sgPSBkd0NhbGxiYWNrOwotCWxwRGVzYy0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7Ci0Jd2hpbGUodURldmljZUlEIDwgTUFYTUlESURSSVZFUlMpIHsKLQkJZHdSZXQgPSBtaWRNZXNzYWdlKHVEZXZpY2VJRCwgTUlETV9PUEVOLCAKLQkJCWxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWxwRGVzYywgMEwpOwotCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7Ci0JCWlmICghYk1hcHBlckZsZykgYnJlYWs7Ci0JCXVEZXZpY2VJRCsrOwotCQlUUkFDRShtbXN5cywgIk1JRElfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOwotCX0KLQlyZXR1cm4gZHdSZXQ7CisgICAgSE1JREkxNgkJCWhNaWRpSW47CisgICAgTFBNSURJT1BFTkRFU0MJCWxwRGVzYzsKKyAgICBEV09SRAkJCWR3UmV0ID0gMDsKKyAgICBCT09MMzIJCQliTWFwcGVyRmxnID0gRkFMU0U7CisgICAgCisgICAgaWYgKGxwaE1pZGlJbiAhPSBOVUxMKSAKKwkqbHBoTWlkaUluID0gMDsKKyAgICBUUkFDRShtbXN5cywgIiglcCwgJWQsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJICBscGhNaWRpSW4sIHVEZXZpY2VJRCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7CisgICAgaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KU1JRElfTUFQUEVSKSB7CisJVFJBQ0UobW1zeXMsICJNSURJX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKKwliTWFwcGVyRmxnID0gVFJVRTsKKwl1RGV2aWNlSUQgPSAwOworICAgIH0KKyAgICBoTWlkaUluID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihNSURJT1BFTkRFU0MpKTsKKyAgICBpZiAobHBoTWlkaUluICE9IE5VTEwpIAorCSpscGhNaWRpSW4gPSBoTWlkaUluOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgCisJcmV0dXJuIE1NU1lTRVJSX05PTUVNOworICAgIGxwRGVzYy0+aE1pZGkgPSBoTWlkaUluOworICAgIGxwRGVzYy0+ZHdDYWxsYmFjayA9IGR3Q2FsbGJhY2s7CisgICAgbHBEZXNjLT5kd0luc3RhbmNlID0gZHdJbnN0YW5jZTsKKyAgICAKKyAgICB3aGlsZSAodURldmljZUlEIDwgTUFYTUlESURSSVZFUlMpIHsKKwlkd1JldCA9IG1pZE1lc3NhZ2UodURldmljZUlELCBNSURNX09QRU4sIAorCQkJICAgbHBEZXNjLT5kd0luc3RhbmNlLCAoRFdPUkQpbHBEZXNjLCBkd0ZsYWdzKTsKKwlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgCisJICAgIGJyZWFrOworCWlmICghYk1hcHBlckZsZykgCisJICAgIGJyZWFrOworCXVEZXZpY2VJRCsrOworCVRSQUNFKG1tc3lzLCAiTUlESV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CisgICAgfQorICAgIGxwRGVzYy0+d0RldklEID0gdURldmljZUlEOworICAgIHJldHVybiBkd1JldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNDU4LDcgKzI1MDMsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlJbkNsb3NlMzIoSE1JRElJTjMyIGhNaWRpSW4pCiB7Ci0JcmV0dXJuIG1pZGlJbkNsb3NlMTYoaE1pZGlJbik7CisgICAgcmV0dXJuIG1pZGlJbkNsb3NlMTYoaE1pZGlJbik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjQ2NiwxMSArMjUxMSwxMSBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJbkNsb3NlMTYoSE1JRElJTjE2IGhNaWRpSW4pCiB7Ci0JTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCVRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoTWlkaUluKTsKLQlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gbWlkTWVzc2FnZSgwLCBNSURNX0NMT1NFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoTWlkaUluKTsKKyAgICBscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gbWlkTWVzc2FnZShscERlc2MtPndEZXZJRCwgTUlETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI0NzksNyArMjUyNCwxNSBAQAogVUlOVDMyIFdJTkFQSSBtaWRpSW5QcmVwYXJlSGVhZGVyMzIoSE1JRElJTjMyIGhNaWRpSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQzMiB1U2l6ZSkKIHsKLQlyZXR1cm4gbWlkaUluUHJlcGFyZUhlYWRlcjE2KGhNaWRpSW4sbHBNaWRpSW5IZHIsdVNpemUpOworICAgIExQTUlESU9QRU5ERVNDCWxwRGVzYzsKKyAgICAKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpXG4iLCAKKwkgIGhNaWRpSW4sIGxwTWlkaUluSGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgbHBNaWRpSW5IZHItPnJlc2VydmVkID0gKERXT1JEKWxwTWlkaUluSGRyLT5scERhdGE7CisgICAgcmV0dXJuIG1pZE1lc3NhZ2UobHBEZXNjLT53RGV2SUQsIE1JRE1fUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKKwkJICAgICAgKERXT1JEKWxwTWlkaUluSGRyLCAoRFdPUkQpdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI0ODgsMTMgKzI1NDEsMTUgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaUluUHJlcGFyZUhlYWRlcjE2KEhNSURJSU4xNiBoTWlkaUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UMTYgdVNpemUpCiB7Ci0JTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAotCQkJCQloTWlkaUluLCBscE1pZGlJbkhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiBtaWRNZXNzYWdlKDAsIE1JRE1fUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKLQkJCQkJCShEV09SRClscE1pZGlJbkhkciwgKERXT1JEKXVTaXplKTsKKyAgICBMUE1JRElPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICVkKVxuIiwgCisJICBoTWlkaUluLCBscE1pZGlJbkhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGxwTWlkaUluSGRyLT5yZXNlcnZlZCA9IChEV09SRClQVFJfU0VHX1RPX0xJTihscE1pZGlJbkhkci0+bHBEYXRhKTsKKyAgICByZXR1cm4gbWlkTWVzc2FnZShscERlc2MtPndEZXZJRCwgTUlETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgICAoRFdPUkQpbHBNaWRpSW5IZHIsIChEV09SRCl1U2l6ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjUwMyw3ICsyNTU4LDcgQEAKIFVJTlQzMiBXSU5BUEkgbWlkaUluVW5wcmVwYXJlSGVhZGVyMzIoSE1JRElJTjMyIGhNaWRpSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVDMyIHVTaXplKQogewotCXJldHVybiBtaWRpSW5VbnByZXBhcmVIZWFkZXIxNihoTWlkaUluLGxwTWlkaUluSGRyLHVTaXplKTsKKyAgICByZXR1cm4gbWlkaUluVW5wcmVwYXJlSGVhZGVyMTYoaE1pZGlJbixscE1pZGlJbkhkcix1U2l6ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjUxMiwxMyArMjU2NywxMyBAQAogVUlOVDE2IFdJTkFQSSBtaWRpSW5VbnByZXBhcmVIZWFkZXIxNihITUlESUlOMTYgaE1pZGlJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UMTYgdVNpemUpCiB7Ci0JTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAotCQkJCQloTWlkaUluLCBscE1pZGlJbkhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiBtaWRNZXNzYWdlKDAsIE1JRE1fVU5QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAotCQkJCQkJKERXT1JEKWxwTWlkaUluSGRyLCAoRFdPUkQpdVNpemUpOworICAgIExQTUlESU9QRU5ERVNDCWxwRGVzYzsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpXG4iLCAKKwkgIGhNaWRpSW4sIGxwTWlkaUluSGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgcmV0dXJuIG1pZE1lc3NhZ2UobHBEZXNjLT53RGV2SUQsIE1JRE1fVU5QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgICAoRFdPUkQpbHBNaWRpSW5IZHIsIChEV09SRCl1U2l6ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjUyNyw3ICsyNTgyLDcgQEAKIFVJTlQzMiBXSU5BUEkgbWlkaUluQWRkQnVmZmVyMzIoSE1JRElJTjMyIGhNaWRpSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVDMyIHVTaXplKQogewotCXJldHVybiBtaWRpSW5BZGRCdWZmZXIxNihoTWlkaUluLGxwTWlkaUluSGRyLHVTaXplKTsKKyAgICByZXR1cm4gbWlkaUluQWRkQnVmZmVyMTYoaE1pZGlJbixscE1pZGlJbkhkcix1U2l6ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjUzNiw4ICsyNTkxLDggQEAKIFVJTlQxNiBXSU5BUEkgbWlkaUluQWRkQnVmZmVyMTYoSE1JRElJTjE2IGhNaWRpSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVDE2IHVTaXplKQogewotCVRSQUNFKG1tc3lzLCAibWlkaUluQWRkQnVmZmVyXG4iKTsKLQlyZXR1cm4gMDsKKyAgICBUUkFDRShtbXN5cywgIm1pZGlJbkFkZEJ1ZmZlclxuIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjU0NSw3ICsyNjAwLDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSBtaWRpSW5TdGFydDMyKEhNSURJSU4zMiBoTWlkaUluKQogewotCXJldHVybiBtaWRpSW5TdGFydDE2KGhNaWRpSW4pOworICAgIHJldHVybiBtaWRpSW5TdGFydDE2KGhNaWRpSW4pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI1NTMsOCArMjYwOCwxMyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJblN0YXJ0MTYoSE1JRElJTjE2IGhNaWRpSW4pCiB7Ci0JVFJBQ0UobW1zeXMsICJtaWRpSW5TdGFydFxuIik7Ci0JcmV0dXJuIDA7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoTWlkaUluKTsKKyAgICBscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIAorCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gbWlkTWVzc2FnZShscERlc2MtPndEZXZJRCwgTUlETV9TVEFSVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI1NjIsNyArMjYyMiw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgbWlkaUluU3RvcDMyKEhNSURJSU4zMiBoTWlkaUluKQogewotCXJldHVybiBtaWRpSW5TdG9wMTYoaE1pZGlJbik7CisgICAgcmV0dXJuIG1pZGlJblN0b3AxNihoTWlkaUluKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNTcwLDggKzI2MzAsMTMgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBtaWRpSW5TdG9wMTYoSE1JRElJTjE2IGhNaWRpSW4pCiB7Ci0JVFJBQ0UobW1zeXMsICJtaWRpSW5TdG9wXG4iKTsKLQlyZXR1cm4gMDsKKyAgICBMUE1JRElPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhNaWRpSW4pOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgCisJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiBtaWRNZXNzYWdlKGxwRGVzYy0+d0RldklELCBNSURNX1NUT1AsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNTc5LDcgKzI2NDQsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlJblJlc2V0MzIoSE1JRElJTjMyIGhNaWRpSW4pCiB7Ci0JcmV0dXJuIG1pZGlJblJlc2V0MTYoaE1pZGlJbik7CisgICAgcmV0dXJuIG1pZGlJblJlc2V0MTYoaE1pZGlJbik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjU4NywyNiArMjY1Miw0OSBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJblJlc2V0MTYoSE1JRElJTjE2IGhNaWRpSW4pCiB7Ci0JVFJBQ0UobW1zeXMsICJtaWRpSW5SZXNldFxuIik7Ci0JcmV0dXJuIDA7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoTWlkaUluKTsKKyAgICBscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIAorCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gbWlkTWVzc2FnZShscERlc2MtPndEZXZJRCwgTUlETV9SRVNFVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaWRpSW5HZXRJRAkJCVtXSU5NTS42M10KICAqLwotVUlOVDMyIFdJTkFQSSBtaWRpSW5HZXRJRDMyKEhNSURJSU4zMiBoTWlkaUluLCBVSU5UMzIgKiBscHVEZXZpY2VJRCkKK1VJTlQzMiBXSU5BUEkgbWlkaUluR2V0SUQzMihITUlESUlOMzIgaE1pZGlJbiwgVUlOVDMyKiBscHVEZXZpY2VJRCkKIHsKLQlUUkFDRShtbXN5cywgIm1pZGlJbkdldElEXG4iKTsKLQlyZXR1cm4gMDsKKyAgICBMUE1JRElPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJXApXG4iLCBoTWlkaUluLCBscHVEZXZpY2VJRCk7CisgICAgbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSAKKwlyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgaWYgKGxwdURldmljZUlEID09IE5VTEwpIAorCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgICpscHVEZXZpY2VJRCA9IGxwRGVzYy0+d0RldklEOworICAgIAorICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaWRpSW5HZXRJRAkJCVtNTVNZU1RFTS4zMTJdCiAgKi8KLVVJTlQxNiBXSU5BUEkgbWlkaUluR2V0SUQxNihITUlESUlOMTYgaE1pZGlJbiwgVUlOVDE2ICogbHB1RGV2aWNlSUQpCitVSU5UMTYgV0lOQVBJIG1pZGlJbkdldElEMTYoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQxNiogbHB1RGV2aWNlSUQpCiB7Ci0JVFJBQ0UobW1zeXMsICJtaWRpSW5HZXRJRFxuIik7Ci0JcmV0dXJuIDA7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwKVxuIiwgaE1pZGlJbiwgbHB1RGV2aWNlSUQpOworICAgIGxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgCisJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGlmIChscHVEZXZpY2VJRCA9PSBOVUxMKSAKKwlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKyAgICAqbHB1RGV2aWNlSUQgPSBscERlc2MtPndEZXZJRDsKKyAgICAKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjE1LDM2ICsyNzAzLDM5IEBACiBEV09SRCBXSU5BUEkgbWlkaUluTWVzc2FnZTMyKEhNSURJSU4zMiBoTWlkaUluLCBVSU5UMzIgdU1lc3NhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAotCQkJaE1pZGlJbiwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0Jc3dpdGNoICh1TWVzc2FnZSkgewotCWNhc2UgTUlETV9PUEVOOgotCQlGSVhNRShtbXN5cywiY2FuJ3QgaGFuZGxlIE1JRE1fT1BFTiFcbiIpOwotCQlyZXR1cm4gMDsKLQljYXNlIE1JRE1fR0VUREVWQ0FQUzoKLQkJcmV0dXJuIG1pZGlJbkdldERldkNhcHMzMkEoaE1pZGlJbiwoTFBNSURJSU5DQVBTMzJBKWR3UGFyYW0xLGR3UGFyYW0yKTsKLQljYXNlIE1JRE1fR0VUTlVNREVWUzoKLQljYXNlIE1JRE1fUkVTRVQ6Ci0JY2FzZSBNSURNX1NUT1A6Ci0JY2FzZSBNSURNX1NUQVJUOgotCWNhc2UgTUlETV9DTE9TRToKLQkJLyogbm8gYXJndW1lbnQgY29udmVyc2lvbiBuZWVkZWQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBNSURNX1BSRVBBUkU6Ci0JCXJldHVybiBtaWRpSW5QcmVwYXJlSGVhZGVyMzIoaE1pZGlJbiwoTFBNSURJSERSKWR3UGFyYW0xLGR3UGFyYW0yKTsKLQljYXNlIE1JRE1fVU5QUkVQQVJFOgotCQlyZXR1cm4gbWlkaUluVW5wcmVwYXJlSGVhZGVyMzIoaE1pZGlJbiwoTFBNSURJSERSKWR3UGFyYW0xLGR3UGFyYW0yKTsKLQljYXNlIE1JRE1fQUREQlVGRkVSOgotCQlyZXR1cm4gbWlkaUluQWRkQnVmZmVyMzIoaE1pZGlJbiwoTFBNSURJSERSKWR3UGFyYW0xLGR3UGFyYW0yKTsKLQlkZWZhdWx0OgotCQlFUlIobW1zeXMsIiglMDR4LCUwNHgsJTA4bHgsJTA4bHgpOiB1bmhhbmRsZWQgbWVzc2FnZVxuIiwKLQkJICAgIGhNaWRpSW4sdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIG1pZE1lc3NhZ2UoMCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBMUE1JRElPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJICBoTWlkaUluLCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIAorCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICAKKyAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CisgICAgY2FzZSBNSURNX09QRU46CisJRklYTUUobW1zeXMsImNhbid0IGhhbmRsZSBNSURNX09QRU4hXG4iKTsKKwlyZXR1cm4gMDsKKyAgICBjYXNlIE1JRE1fR0VUREVWQ0FQUzoKKwlyZXR1cm4gbWlkaUluR2V0RGV2Q2FwczMyQShoTWlkaUluLChMUE1JRElJTkNBUFMzMkEpZHdQYXJhbTEsZHdQYXJhbTIpOworICAgIGNhc2UgTUlETV9HRVROVU1ERVZTOgorICAgIGNhc2UgTUlETV9SRVNFVDoKKyAgICBjYXNlIE1JRE1fU1RPUDoKKyAgICBjYXNlIE1JRE1fU1RBUlQ6CisgICAgY2FzZSBNSURNX0NMT1NFOgorCS8qIG5vIGFyZ3VtZW50IGNvbnZlcnNpb24gbmVlZGVkICovCisJYnJlYWs7CisgICAgY2FzZSBNSURNX1BSRVBBUkU6CisJcmV0dXJuIG1pZGlJblByZXBhcmVIZWFkZXIzMihoTWlkaUluLChMUE1JRElIRFIpZHdQYXJhbTEsZHdQYXJhbTIpOworICAgIGNhc2UgTUlETV9VTlBSRVBBUkU6CisJcmV0dXJuIG1pZGlJblVucHJlcGFyZUhlYWRlcjMyKGhNaWRpSW4sKExQTUlESUhEUilkd1BhcmFtMSxkd1BhcmFtMik7CisgICAgY2FzZSBNSURNX0FEREJVRkZFUjoKKwlyZXR1cm4gbWlkaUluQWRkQnVmZmVyMzIoaE1pZGlJbiwoTFBNSURJSERSKWR3UGFyYW0xLGR3UGFyYW0yKTsKKyAgICBkZWZhdWx0OgorCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAorCSAgICBoTWlkaUluLHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG1pZE1lc3NhZ2UoMCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjUzLDM2ICsyNzQ0LDM2IEBACiBEV09SRCBXSU5BUEkgbWlkaUluTWVzc2FnZTE2KEhNSURJSU4xNiBoTWlkaUluLCBVSU5UMTYgdU1lc3NhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAotCQkJaE1pZGlJbiwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0Jc3dpdGNoICh1TWVzc2FnZSkgewotCWNhc2UgTUlETV9PUEVOOgotCQlXQVJOKG1tc3lzLCJjYW4ndCBoYW5kbGUgTUlETV9PUEVOIVxuIik7Ci0JCXJldHVybiAwOwotCWNhc2UgTUlETV9HRVRERVZDQVBTOgotCQlyZXR1cm4gbWlkaUluR2V0RGV2Q2FwczE2KGhNaWRpSW4sKExQTUlESUlOQ0FQUzE2KVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7Ci0JY2FzZSBNSURNX0dFVE5VTURFVlM6Ci0JY2FzZSBNSURNX1JFU0VUOgotCWNhc2UgTUlETV9TVE9QOgotCWNhc2UgTUlETV9TVEFSVDoKLQljYXNlIE1JRE1fQ0xPU0U6Ci0JCS8qIG5vIGFyZ3VtZW50IGNvbnZlcnNpb24gbmVlZGVkICovCi0JCWJyZWFrOwotCWNhc2UgTUlETV9QUkVQQVJFOgotCQlyZXR1cm4gbWlkaUluUHJlcGFyZUhlYWRlcjE2KGhNaWRpSW4sKExQTUlESUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwotCWNhc2UgTUlETV9VTlBSRVBBUkU6Ci0JCXJldHVybiBtaWRpSW5VbnByZXBhcmVIZWFkZXIxNihoTWlkaUluLChMUE1JRElIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKLQljYXNlIE1JRE1fQUREQlVGRkVSOgotCQlyZXR1cm4gbWlkaUluQWRkQnVmZmVyMTYoaE1pZGlJbiwoTFBNSURJSERSKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7Ci0JZGVmYXVsdDoKLQkJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCi0JCSAgICBoTWlkaUluLHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBtaWRNZXNzYWdlKDAsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgTFBNSURJT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAorCSAgaE1pZGlJbiwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgc3dpdGNoICh1TWVzc2FnZSkgeworICAgIGNhc2UgTUlETV9PUEVOOgorCVdBUk4obW1zeXMsImNhbid0IGhhbmRsZSBNSURNX09QRU4hXG4iKTsKKwlyZXR1cm4gMDsKKyAgICBjYXNlIE1JRE1fR0VUREVWQ0FQUzoKKwlyZXR1cm4gbWlkaUluR2V0RGV2Q2FwczE2KGhNaWRpSW4sKExQTUlESUlOQ0FQUzE2KVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7CisgICAgY2FzZSBNSURNX0dFVE5VTURFVlM6CisgICAgY2FzZSBNSURNX1JFU0VUOgorICAgIGNhc2UgTUlETV9TVE9QOgorICAgIGNhc2UgTUlETV9TVEFSVDoKKyAgICBjYXNlIE1JRE1fQ0xPU0U6CisJLyogbm8gYXJndW1lbnQgY29udmVyc2lvbiBuZWVkZWQgKi8KKwlicmVhazsKKyAgICBjYXNlIE1JRE1fUFJFUEFSRToKKwlyZXR1cm4gbWlkaUluUHJlcGFyZUhlYWRlcjE2KGhNaWRpSW4sKExQTUlESUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOworICAgIGNhc2UgTUlETV9VTlBSRVBBUkU6CisJcmV0dXJuIG1pZGlJblVucHJlcGFyZUhlYWRlcjE2KGhNaWRpSW4sKExQTUlESUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOworICAgIGNhc2UgTUlETV9BRERCVUZGRVI6CisJcmV0dXJuIG1pZGlJbkFkZEJ1ZmZlcjE2KGhNaWRpSW4sKExQTUlESUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOworICAgIGRlZmF1bHQ6CisJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJICAgIGhNaWRpSW4sdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbWlkTWVzc2FnZSgwLCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQogCiAKQEAgLTI2OTAsNyArMjc4MSw3IEBACiAgKiAJCQkJd2F2ZU91dEdldE51bURldnMJCVtNTVNZU1RFTS40MDFdCiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZU91dEdldE51bURldnMzMigpIHsKLQlyZXR1cm4gd2F2ZU91dEdldE51bURldnMxNigpOworICAgIHJldHVybiB3YXZlT3V0R2V0TnVtRGV2czE2KCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjY5OCw2MSArMjc4OSw2MSBAQAogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRHZXROdW1EZXZzMTYoKQogewotCVVJTlQxNgljb3VudCA9IDA7Ci0JVFJBQ0UobW1zeXMsICJ3YXZlT3V0R2V0TnVtRGV2c1xuIik7Ci0JY291bnQgKz0gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwotCVRSQUNFKG1tc3lzLCAid2F2ZU91dEdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOwotCXJldHVybiBjb3VudDsKKyAgICBVSU5UMTYJY291bnQgPSAwOworICAgIFRSQUNFKG1tc3lzLCAid2F2ZU91dEdldE51bURldnNcbiIpOworICAgIGNvdW50ICs9IHdvZE1lc3NhZ2UoIE1NU1lTVEVNX0ZpcnN0RGV2SUQoKSwgV09ETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKKyAgICBUUkFDRShtbXN5cywgIndhdmVPdXRHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKKyAgICByZXR1cm4gY291bnQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdhdmVPdXRHZXREZXZDYXBzCQlbTU1TWVNURU0uNDAyXQogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRHZXREZXZDYXBzMTYoVUlOVDE2IHVEZXZpY2VJRCwgV0FWRU9VVENBUFMxNiAqIGxwQ2FwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHVTaXplKQorCQkJCSAgVUlOVDE2IHVTaXplKQogewotCWlmICh1RGV2aWNlSUQgPiB3YXZlT3V0R2V0TnVtRGV2czE2KCkgLSAxKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7Ci0JaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KVdBVkVfTUFQUEVSKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7IC8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgd2F2ZSBtYXBwZXIgPyAqLwotCVRSQUNFKG1tc3lzLCAid2F2ZU91dEdldERldkNhcHNcbiIpOwotCXJldHVybiB3b2RNZXNzYWdlKHVEZXZpY2VJRCwgV09ETV9HRVRERVZDQVBTLCAwTCwgKERXT1JEKWxwQ2FwcywgdVNpemUpOworICAgIGlmICh1RGV2aWNlSUQgPiB3YXZlT3V0R2V0TnVtRGV2czE2KCkgLSAxKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7CisgICAgaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KVdBVkVfTUFQUEVSKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7IC8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgd2F2ZSBtYXBwZXIgPyAqLworICAgIFRSQUNFKG1tc3lzLCAid2F2ZU91dEdldERldkNhcHNcbiIpOworICAgIHJldHVybiB3b2RNZXNzYWdlKHVEZXZpY2VJRCwgV09ETV9HRVRERVZDQVBTLCAwTCwgKERXT1JEKWxwQ2FwcywgdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl3YXZlT3V0R2V0RGV2Q2Fwc0EJCVtXSU5NTS4xNjJdCiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZU91dEdldERldkNhcHMzMkEoVUlOVDMyIHVEZXZpY2VJRCwgTFBXQVZFT1VUQ0FQUzMyQSBscENhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB1U2l6ZSkKKwkJCQkgICBVSU5UMzIgdVNpemUpCiB7Ci0JV0FWRU9VVENBUFMxNgl3b2MxNjsKLQlVSU5UMTYgcmV0ID0gd2F2ZU91dEdldERldkNhcHMxNih1RGV2aWNlSUQsJndvYzE2LHNpemVvZih3b2MxNikpOwotCQotCWxwQ2Fwcy0+d01pZCA9IHdvYzE2LndNaWQ7Ci0JbHBDYXBzLT53UGlkID0gd29jMTYud1BpZDsKLQlscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gd29jMTYudkRyaXZlclZlcnNpb247Ci0Jc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSx3b2MxNi5zelBuYW1lKTsKLQlscENhcHMtPmR3Rm9ybWF0cyA9IHdvYzE2LmR3Rm9ybWF0czsKLQlscENhcHMtPndDaGFubmVscyA9IHdvYzE2LndDaGFubmVsczsKLQlscENhcHMtPmR3U3VwcG9ydCA9IHdvYzE2LmR3U3VwcG9ydDsKLQlyZXR1cm4gcmV0OworICAgIFdBVkVPVVRDQVBTMTYJd29jMTY7CisgICAgVUlOVDE2IHJldCA9IHdhdmVPdXRHZXREZXZDYXBzMTYodURldmljZUlELCZ3b2MxNixzaXplb2Yod29jMTYpKTsKKyAgICAKKyAgICBscENhcHMtPndNaWQgPSB3b2MxNi53TWlkOworICAgIGxwQ2Fwcy0+d1BpZCA9IHdvYzE2LndQaWQ7CisgICAgbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IHdvYzE2LnZEcml2ZXJWZXJzaW9uOworICAgIHN0cmNweShscENhcHMtPnN6UG5hbWUsd29jMTYuc3pQbmFtZSk7CisgICAgbHBDYXBzLT5kd0Zvcm1hdHMgPSB3b2MxNi5kd0Zvcm1hdHM7CisgICAgbHBDYXBzLT53Q2hhbm5lbHMgPSB3b2MxNi53Q2hhbm5lbHM7CisgICAgbHBDYXBzLT5kd1N1cHBvcnQgPSB3b2MxNi5kd1N1cHBvcnQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd2F2ZU91dEdldERldkNhcHNXCQlbV0lOTU0uMTYzXQogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVPdXRHZXREZXZDYXBzMzJXKFVJTlQzMiB1RGV2aWNlSUQsIExQV0FWRU9VVENBUFMzMlcgbHBDYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgdVNpemUpCisJCQkJICAgVUlOVDMyIHVTaXplKQogewotCVdBVkVPVVRDQVBTMTYJd29jMTY7Ci0JVUlOVDMyIHJldCA9IHdhdmVPdXRHZXREZXZDYXBzMTYodURldmljZUlELCZ3b2MxNixzaXplb2Yod29jMTYpKTsKLQotCWxwQ2Fwcy0+d01pZCA9IHdvYzE2LndNaWQ7Ci0JbHBDYXBzLT53UGlkID0gd29jMTYud1BpZDsKLQlscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gd29jMTYudkRyaXZlclZlcnNpb247Ci0JbHN0cmNweUF0b1cobHBDYXBzLT5zelBuYW1lLHdvYzE2LnN6UG5hbWUpOwotCWxwQ2Fwcy0+ZHdGb3JtYXRzID0gd29jMTYuZHdGb3JtYXRzOwotCWxwQ2Fwcy0+d0NoYW5uZWxzID0gd29jMTYud0NoYW5uZWxzOwotCWxwQ2Fwcy0+ZHdTdXBwb3J0ID0gd29jMTYuZHdTdXBwb3J0OwotCXJldHVybiByZXQ7CisgICAgV0FWRU9VVENBUFMxNgl3b2MxNjsKKyAgICBVSU5UMzIgcmV0ID0gd2F2ZU91dEdldERldkNhcHMxNih1RGV2aWNlSUQsJndvYzE2LHNpemVvZih3b2MxNikpOworICAgIAorICAgIGxwQ2Fwcy0+d01pZCA9IHdvYzE2LndNaWQ7CisgICAgbHBDYXBzLT53UGlkID0gd29jMTYud1BpZDsKKyAgICBscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gd29jMTYudkRyaXZlclZlcnNpb247CisgICAgbHN0cmNweUF0b1cobHBDYXBzLT5zelBuYW1lLHdvYzE2LnN6UG5hbWUpOworICAgIGxwQ2Fwcy0+ZHdGb3JtYXRzID0gd29jMTYuZHdGb3JtYXRzOworICAgIGxwQ2Fwcy0+d0NoYW5uZWxzID0gd29jMTYud0NoYW5uZWxzOworICAgIGxwQ2Fwcy0+ZHdTdXBwb3J0ID0gd29jMTYuZHdTdXBwb3J0OworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc2MCw4ICsyODUxLDggQEAKICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlT3V0R2V0RXJyb3JUZXh0MTYoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpCiB7Ci0JVFJBQ0UobW1zeXMsICJ3YXZlT3V0R2V0RXJyb3JUZXh0XG4iKTsKLQlyZXR1cm4od2F2ZUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpKTsKKyAgICBUUkFDRShtbXN5cywgIndhdmVPdXRHZXRFcnJvclRleHRcbiIpOworICAgIHJldHVybih3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI3NjksNyArMjg2MCw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZU91dEdldEVycm9yVGV4dDMyQShVSU5UMzIgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQzMiB1U2l6ZSkKIHsKLQlyZXR1cm4od2F2ZU91dEdldEVycm9yVGV4dDE2KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOworICAgIHJldHVybih3YXZlT3V0R2V0RXJyb3JUZXh0MTYodUVycm9yLCBscFRleHQsIHVTaXplKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc3NywxMiArMjg2OCwxMiBAQAogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVPdXRHZXRFcnJvclRleHQzMlcoVUlOVDMyIHVFcnJvciwgTFBXU1RSIGxwVGV4dCwgVUlOVDMyIHVTaXplKQogewotCUxQU1RSCXhzdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHVTaXplKTsKLQlVSU5UMzIJcmV0ID0gd2F2ZU91dEdldEVycm9yVGV4dDMyQSh1RXJyb3IsIHhzdHIsIHVTaXplKTsKLQkKLQlsc3RyY3B5QXRvVyhscFRleHQseHN0cik7Ci0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHhzdHIpOwotCXJldHVybiByZXQ7CisgICAgTFBTVFIJeHN0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsdVNpemUpOworICAgIFVJTlQzMglyZXQgPSB3YXZlT3V0R2V0RXJyb3JUZXh0MzJBKHVFcnJvciwgeHN0ciwgdVNpemUpOworICAgIAorICAgIGxzdHJjcHlBdG9XKGxwVGV4dCx4c3RyKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAseHN0cik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC0yNzkxLDY2ICsyODgyLDY2IEBACiAgKi8KIHN0YXRpYyBVSU5UMTYgd2F2ZUdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKLQlMUFNUUgltc2dwdHI7Ci0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICVkKTtcbiIsIAotCSAgICAgICB1RXJyb3IsIGxwVGV4dCwgdVNpemUpOwotCWlmICgobHBUZXh0ID09IE5VTEwpIHx8ICh1U2l6ZSA8IDEpKSByZXR1cm4oRkFMU0UpOwotCWxwVGV4dFswXSA9ICdcMCc7Ci0Jc3dpdGNoKHVFcnJvcikgewotCQljYXNlIE1NU1lTRVJSX05PRVJST1I6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBjb21tYW5kIHdhcyBjYXJyaWVkIG91dC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1TWVNFUlJfRVJST1I6Ci0JCQltc2dwdHIgPSAiVW5kZWZpbmVkIGV4dGVybmFsIGVycm9yLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBNTVNZU0VSUl9CQURERVZJQ0VJRDoKLQkJCW1zZ3B0ciA9ICJBIGRldmljZSBJRCBoYXMgYmVlbiB1c2VkIHRoYXQgaXMgb3V0IG9mIHJhbmdlIGZvciB5b3VyIHN5c3RlbS4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1TWVNFUlJfTk9URU5BQkxFRDoKLQkJCW1zZ3B0ciA9ICJUaGUgZHJpdmVyIHdhcyBub3QgZW5hYmxlZC4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1TWVNFUlJfQUxMT0NBVEVEOgotCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgZGV2aWNlIGlzIGFscmVhZHkgaW4gdXNlLiBXYWl0IHVudGlsIGl0IGlzIGZyZWUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1TWVNFUlJfSU5WQUxIQU5ETEU6Ci0JCQltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBkZXZpY2UgaGFuZGxlIGlzIGludmFsaWQuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1NU1lTRVJSX05PRFJJVkVSOgotCQkJbXNncHRyID0gIlRoZXJlIGlzIG5vIGRyaXZlciBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gIVxuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1NU1lTRVJSX05PTUVNOgotCQkJbXNncHRyID0gIk5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZSBmb3IgdGhpcyB0YXNrLiBRdWl0IG9uZSBvciBtb3JlIGFwcGxpY2F0aW9ucyB0byBpbmNyZWFzZSBhdmFpbGFibGUgbWVtb3J5LCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1NU1lTRVJSX05PVFNVUFBPUlRFRDoKLQkJCW1zZ3B0ciA9ICJUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSB0aGUgQ2FwYWJpbGl0aWVzIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBmdW5jdGlvbnMgYW5kIG1lc3NhZ2VzIHRoZSBkcml2ZXIgc3VwcG9ydHMuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1NU1lTRVJSX0JBREVSUk5VTToKLQkJCW1zZ3B0ciA9ICJBbiBlcnJvciBudW1iZXIgd2FzIHNwZWNpZmllZCB0aGF0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzeXN0ZW0uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1NU1lTRVJSX0lOVkFMRkxBRzoKLQkJCW1zZ3B0ciA9ICJBbiBpbnZhbGlkIGZsYWcgd2FzIHBhc3NlZCB0byBhIHN5c3RlbSBmdW5jdGlvbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1TWVNFUlJfSU5WQUxQQVJBTToKLQkJCW1zZ3B0ciA9ICJBbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkIHRvIGEgc3lzdGVtIGZ1bmN0aW9uLiI7Ci0JCQlicmVhazsKLQkJY2FzZSBXQVZFUlJfQkFERk9STUFUOgotCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgY2Fubm90IGJlIHRyYW5zbGF0ZWQuIFVzZSB0aGUgQ2FwYWJpbGl0aWVzIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgc3VwcG9ydGVkIGZvcm1hdHMiOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0FWRVJSX1NUSUxMUExBWUlORzoKLQkJCW1zZ3B0ciA9ICJDYW5ub3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB3aGlsZSBtZWRpYSBkYXRhIGlzIHN0aWxsIHBsYXlpbmcuIFJlc2V0IHRoZSBkZXZpY2UsIG9yIHdhaXQgdW50aWwgdGhlIGRhdGEgaXMgZmluaXNoZWQgcGxheWluZy4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0FWRVJSX1VOUFJFUEFSRUQ6Ci0JCQltc2dwdHIgPSAiVGhlIHdhdmUgaGVhZGVyIHdhcyBub3QgcHJlcGFyZWQuIFVzZSB0aGUgUHJlcGFyZSBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBoZWFkZXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0FWRVJSX1NZTkM6Ci0JCQltc2dwdHIgPSAiQ2Fubm90IG9wZW4gdGhlIGRldmljZSB3aXRob3V0IHVzaW5nIHRoZSBXQVZFX0FMTE9XU1lOQyBmbGFnLiBVc2UgdGhlIGZsYWcsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQltc2dwdHIgPSAiVW5rbm93biBNTVNZU1RFTSBFcnJvciAhXG4iOwotCQkJYnJlYWs7Ci0JCX0KLQlsc3RyY3B5bjMyQShscFRleHQsIG1zZ3B0ciwgdVNpemUpOwotCXJldHVybiBUUlVFOworICAgIExQU1RSCW1zZ3B0cjsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpO1xuIiwgCisJICB1RXJyb3IsIGxwVGV4dCwgdVNpemUpOworICAgIGlmICgobHBUZXh0ID09IE5VTEwpIHx8ICh1U2l6ZSA8IDEpKSByZXR1cm4oRkFMU0UpOworICAgIGxwVGV4dFswXSA9ICdcMCc7CisgICAgc3dpdGNoKHVFcnJvcikgeworICAgIGNhc2UgTU1TWVNFUlJfTk9FUlJPUjoKKwltc2dwdHIgPSAiVGhlIHNwZWNpZmllZCBjb21tYW5kIHdhcyBjYXJyaWVkIG91dC4iOworCWJyZWFrOworICAgIGNhc2UgTU1TWVNFUlJfRVJST1I6CisJbXNncHRyID0gIlVuZGVmaW5lZCBleHRlcm5hbCBlcnJvci4iOworCWJyZWFrOworICAgIGNhc2UgTU1TWVNFUlJfQkFEREVWSUNFSUQ6CisJbXNncHRyID0gIkEgZGV2aWNlIElEIGhhcyBiZWVuIHVzZWQgdGhhdCBpcyBvdXQgb2YgcmFuZ2UgZm9yIHlvdXIgc3lzdGVtLiI7CisJYnJlYWs7CisgICAgY2FzZSBNTVNZU0VSUl9OT1RFTkFCTEVEOgorCW1zZ3B0ciA9ICJUaGUgZHJpdmVyIHdhcyBub3QgZW5hYmxlZC4iOworCWJyZWFrOworICAgIGNhc2UgTU1TWVNFUlJfQUxMT0NBVEVEOgorCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZS4gV2FpdCB1bnRpbCBpdCBpcyBmcmVlLCBhbmQgdGhlbiB0cnkgYWdhaW4uIjsKKwlicmVhazsKKyAgICBjYXNlIE1NU1lTRVJSX0lOVkFMSEFORExFOgorCW1zZ3B0ciA9ICJUaGUgc3BlY2lmaWVkIGRldmljZSBoYW5kbGUgaXMgaW52YWxpZC4iOworCWJyZWFrOworICAgIGNhc2UgTU1TWVNFUlJfTk9EUklWRVI6CisJbXNncHRyID0gIlRoZXJlIGlzIG5vIGRyaXZlciBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gIVxuIjsKKwlicmVhazsKKyAgICBjYXNlIE1NU1lTRVJSX05PTUVNOgorCW1zZ3B0ciA9ICJOb3QgZW5vdWdoIG1lbW9yeSBhdmFpbGFibGUgZm9yIHRoaXMgdGFzay4gUXVpdCBvbmUgb3IgbW9yZSBhcHBsaWNhdGlvbnMgdG8gaW5jcmVhc2UgYXZhaWxhYmxlIG1lbW9yeSwgYW5kIHRoZW4gdHJ5IGFnYWluLiI7CisJYnJlYWs7CisgICAgY2FzZSBNTVNZU0VSUl9OT1RTVVBQT1JURUQ6CisJbXNncHRyID0gIlRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4gVXNlIHRoZSBDYXBhYmlsaXRpZXMgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9ucyBhbmQgbWVzc2FnZXMgdGhlIGRyaXZlciBzdXBwb3J0cy4iOworCWJyZWFrOworICAgIGNhc2UgTU1TWVNFUlJfQkFERVJSTlVNOgorCW1zZ3B0ciA9ICJBbiBlcnJvciBudW1iZXIgd2FzIHNwZWNpZmllZCB0aGF0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzeXN0ZW0uIjsKKwlicmVhazsKKyAgICBjYXNlIE1NU1lTRVJSX0lOVkFMRkxBRzoKKwltc2dwdHIgPSAiQW4gaW52YWxpZCBmbGFnIHdhcyBwYXNzZWQgdG8gYSBzeXN0ZW0gZnVuY3Rpb24uIjsKKwlicmVhazsKKyAgICBjYXNlIE1NU1lTRVJSX0lOVkFMUEFSQU06CisJbXNncHRyID0gIkFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gYSBzeXN0ZW0gZnVuY3Rpb24uIjsKKwlicmVhazsKKyAgICBjYXNlIFdBVkVSUl9CQURGT1JNQVQ6CisJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgY2Fubm90IGJlIHRyYW5zbGF0ZWQuIFVzZSB0aGUgQ2FwYWJpbGl0aWVzIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgc3VwcG9ydGVkIGZvcm1hdHMiOworCWJyZWFrOworICAgIGNhc2UgV0FWRVJSX1NUSUxMUExBWUlORzoKKwltc2dwdHIgPSAiQ2Fubm90IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gd2hpbGUgbWVkaWEgZGF0YSBpcyBzdGlsbCBwbGF5aW5nLiBSZXNldCB0aGUgZGV2aWNlLCBvciB3YWl0IHVudGlsIHRoZSBkYXRhIGlzIGZpbmlzaGVkIHBsYXlpbmcuIjsKKwlicmVhazsKKyAgICBjYXNlIFdBVkVSUl9VTlBSRVBBUkVEOgorCW1zZ3B0ciA9ICJUaGUgd2F2ZSBoZWFkZXIgd2FzIG5vdCBwcmVwYXJlZC4gVXNlIHRoZSBQcmVwYXJlIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIGhlYWRlciwgYW5kIHRoZW4gdHJ5IGFnYWluLiI7CisJYnJlYWs7CisgICAgY2FzZSBXQVZFUlJfU1lOQzoKKwltc2dwdHIgPSAiQ2Fubm90IG9wZW4gdGhlIGRldmljZSB3aXRob3V0IHVzaW5nIHRoZSBXQVZFX0FMTE9XU1lOQyBmbGFnLiBVc2UgdGhlIGZsYWcsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJbXNncHRyID0gIlVua25vd24gTU1TWVNURU0gRXJyb3IgIVxuIjsKKwlicmVhazsKKyAgICB9CisgICAgbHN0cmNweW4zMkEobHBUZXh0LCBtc2dwdHIsIHVTaXplKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yODYxLDExICsyOTUyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFBXQVZFRk9STUFURVggbHBGb3JtYXQsIERXT1JEIGR3Q2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncykKIHsKLQlIV0FWRU9VVDE2CWh3bzE2OwotCVVJTlQzMglyZXQ9d2F2ZU91dE9wZW4xNigmaHdvMTYsdURldmljZUlELGxwRm9ybWF0LGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSwKLQkJCQkgIENBTExCQUNLMzJDT05WKGR3RmxhZ3MpKTsKLQlpZiAobHBoV2F2ZU91dCkgKmxwaFdhdmVPdXQ9aHdvMTY7Ci0JcmV0dXJuIHJldDsKKyAgICBIV0FWRU9VVDE2CWh3bzE2OworICAgIFVJTlQzMglyZXQgPSB3YXZlT3V0T3BlbjE2KCZod28xNix1RGV2aWNlSUQsbHBGb3JtYXQsZHdDYWxsYmFjayxkd0luc3RhbmNlLAorCQkJCSAgICBDQUxMQkFDSzMyQ09OVihkd0ZsYWdzKSk7CisKKyAgICBpZiAobHBoV2F2ZU91dCkgKmxwaFdhdmVPdXQ9aHdvMTY7CisgICAgcmV0dXJuIHJldDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQl3YXZlT3V0T3BlbgkJCVtNTVNZU1RFTS40MDRdCkBAIC0yODc0LDQ2ICsyOTY2LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFBXQVZFRk9STUFURVggbHBGb3JtYXQsIERXT1JEIGR3Q2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncykKIHsKLQlIV0FWRU9VVDE2CWhXYXZlT3V0OwotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlEV09SRAkJZHdSZXQgPSAwOwotCUJPT0wzMgkJYk1hcHBlckZsZyA9IEZBTFNFOwotCi0JVFJBQ0UobW1zeXMsICIoJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKLQkJbHBoV2F2ZU91dCwgdURldmljZUlELCBscEZvcm1hdCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7Ci0JaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkKLQkJVFJBQ0UobW1zeXMsICJXQVZFX0ZPUk1BVF9RVUVSWSByZXF1ZXN0ZWQgIVxuIik7Ci0JaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KVdBVkVfTUFQUEVSKSB7Ci0JCVRSQUNFKG1tc3lzLCAiV0FWRV9NQVBQRVIgbW9kZSByZXF1ZXN0ZWQgIVxuIik7Ci0JCWJNYXBwZXJGbGcgPSBUUlVFOwotCQl1RGV2aWNlSUQgPSAwOwotCX0KLQlpZiAobHBGb3JtYXQgPT0gTlVMTCkgcmV0dXJuIFdBVkVSUl9CQURGT1JNQVQ7Ci0KLQloV2F2ZU91dCA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoV0FWRU9QRU5ERVNDKSk7Ci0JaWYgKGxwaFdhdmVPdXQgIT0gTlVMTCkgKmxwaFdhdmVPdXQgPSBoV2F2ZU91dDsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9NRU07Ci0JbHBEZXNjLT5oV2F2ZSA9IGhXYXZlT3V0OwotCWxwRGVzYy0+bHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKWxwRm9ybWF0OyAgLyogc2hvdWxkIHRoZSBzdHJ1Y3QgYmUgY29waWVkIGlzbyBwb2ludGVyPyAqLwotCWxwRGVzYy0+ZHdDYWxsQmFjayA9IGR3Q2FsbGJhY2s7Ci0JbHBEZXNjLT5kd0luc3RhbmNlID0gZHdJbnN0YW5jZTsKLQlpZiAodURldmljZUlEID49IE1BWFdBVkVEUklWRVJTKQotCQl1RGV2aWNlSUQgPSAwOwotCXdoaWxlKHVEZXZpY2VJRCA8IE1BWFdBVkVEUklWRVJTKSB7Ci0JCWR3UmV0ID0gd29kTWVzc2FnZSh1RGV2aWNlSUQsIFdPRE1fT1BFTiwgCi0JCQlscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscERlc2MsIGR3RmxhZ3MpOwotCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7Ci0JCWlmICghYk1hcHBlckZsZykgYnJlYWs7Ci0JCXVEZXZpY2VJRCsrOwotCQlUUkFDRShtbXN5cywgIldBVkVfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOwotCX0KLQlscERlc2MtPnVEZXZpY2VJRCA9IHVEZXZpY2VJRDsgIC8qIHNhdmUgcGh5c2ljYWwgRGV2aWNlIElEICovCi0JaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkgewotCQlUUkFDRShtbXN5cywgIkVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKLQkJZHdSZXQgPSB3YXZlT3V0Q2xvc2UzMihoV2F2ZU91dCk7Ci0JfQotCXJldHVybiBkd1JldDsKKyAgICBIV0FWRU9VVDE2CWhXYXZlT3V0OworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICBEV09SRAkJZHdSZXQgPSAwOworICAgIEJPT0wzMgkJYk1hcHBlckZsZyA9IEZBTFNFOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCVwLCAlZCwgJXAsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJICBscGhXYXZlT3V0LCB1RGV2aWNlSUQsIGxwRm9ybWF0LCBkd0NhbGxiYWNrLCBkd0luc3RhbmNlLCBkd0ZsYWdzKTsKKyAgICBpZiAoZHdGbGFncyAmIFdBVkVfRk9STUFUX1FVRVJZKQorCVRSQUNFKG1tc3lzLCAiV0FWRV9GT1JNQVRfUVVFUlkgcmVxdWVzdGVkICFcbiIpOworICAgIGlmICh1RGV2aWNlSUQgPT0gKFVJTlQxNilXQVZFX01BUFBFUikgeworCVRSQUNFKG1tc3lzLCAiV0FWRV9NQVBQRVIgbW9kZSByZXF1ZXN0ZWQgIVxuIik7CisJYk1hcHBlckZsZyA9IFRSVUU7CisJdURldmljZUlEID0gMDsKKyAgICB9CisgICAgaWYgKGxwRm9ybWF0ID09IE5VTEwpIHJldHVybiBXQVZFUlJfQkFERk9STUFUOworICAgIAorICAgIGhXYXZlT3V0ID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihXQVZFT1BFTkRFU0MpKTsKKyAgICBpZiAobHBoV2F2ZU91dCAhPSBOVUxMKSAqbHBoV2F2ZU91dCA9IGhXYXZlT3V0OworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT01FTTsKKyAgICBscERlc2MtPmhXYXZlID0gaFdhdmVPdXQ7CisgICAgbHBEZXNjLT5scEZvcm1hdCA9IChMUFdBVkVGT1JNQVQpbHBGb3JtYXQ7ICAvKiBzaG91bGQgdGhlIHN0cnVjdCBiZSBjb3BpZWQgaXNvIHBvaW50ZXI/ICovCisgICAgbHBEZXNjLT5kd0NhbGxCYWNrID0gZHdDYWxsYmFjazsKKyAgICBscERlc2MtPmR3SW5zdGFuY2UgPSBkd0luc3RhbmNlOworICAgIGlmICh1RGV2aWNlSUQgPj0gTUFYV0FWRURSSVZFUlMpCisJdURldmljZUlEID0gMDsKKyAgICB3aGlsZSh1RGV2aWNlSUQgPCBNQVhXQVZFRFJJVkVSUykgeworCWR3UmV0ID0gd29kTWVzc2FnZSh1RGV2aWNlSUQsIFdPRE1fT1BFTiwgCisJCQkgICBscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscERlc2MsIGR3RmxhZ3MpOworCWlmIChkd1JldCA9PSBNTVNZU0VSUl9OT0VSUk9SKSBicmVhazsKKwlpZiAoIWJNYXBwZXJGbGcpIGJyZWFrOworCXVEZXZpY2VJRCsrOworCVRSQUNFKG1tc3lzLCAiV0FWRV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CisgICAgfQorICAgIGxwRGVzYy0+dURldmljZUlEID0gdURldmljZUlEOyAgLyogc2F2ZSBwaHlzaWNhbCBEZXZpY2UgSUQgKi8KKyAgICBpZiAoZHdGbGFncyAmIFdBVkVfRk9STUFUX1FVRVJZKSB7CisJVFJBQ0UobW1zeXMsICJFbmQgb2YgV0FWRV9GT1JNQVRfUVVFUlkgIVxuIik7CisJZHdSZXQgPSB3YXZlT3V0Q2xvc2UzMihoV2F2ZU91dCk7CisgICAgfQorICAgIHJldHVybiBkd1JldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yOTIxLDM1ICszMDEzLDM1IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZU91dENsb3NlMzIoSFdBVkVPVVQzMiBoV2F2ZU91dCkKIHsKLQlyZXR1cm4gd2F2ZU91dENsb3NlMTYoaFdhdmVPdXQpOworICAgIHJldHVybiB3YXZlT3V0Q2xvc2UxNihoV2F2ZU91dCk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl3YXZlT3V0Q2xvc2UJCVtNTVNZU1RFTS40MDVdCiAgKi8KIFVJTlQxNiBXSU5BUEkgd2F2ZU91dENsb3NlMTYoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0KLQlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVPdXQpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fQ0xPU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlT3V0KTsKKyAgICBscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX0NMT1NFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdhdmVPdXRQcmVwYXJlSGVhZGVyCVtXSU5NTS4xNzVdCiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZU91dFByZXBhcmVIZWFkZXIzMihIV0FWRU9VVDMyIGhXYXZlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVZFSERSICogbHBXYXZlT3V0SGRyLCBVSU5UMzIgdVNpemUpCisJCQkJICAgICBXQVZFSERSICogbHBXYXZlT3V0SGRyLCBVSU5UMzIgdVNpemUpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAotCQkJCQloV2F2ZU91dCwgbHBXYXZlT3V0SGRyLCB1U2l6ZSk7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAotCQkJICAgKERXT1JEKWxwV2F2ZU91dEhkcix1U2l6ZSk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKKwkgIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKKyAgICBscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1BSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJCSAgICAgICAoRFdPUkQpbHBXYXZlT3V0SGRyLHVTaXplKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdhdmVPdXRQcmVwYXJlSGVhZGVyCVtNTVNZU1RFTS40MDZdCkBAIC0yOTU3LDE5ICszMDQ5LDE5IEBACiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRQcmVwYXJlSGVhZGVyMTYoSFdBVkVPVVQxNiBoV2F2ZU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVZFSERSICogbHBXYXZlT3V0SGRyLCBVSU5UMTYgdVNpemUpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCUxQQllURQkJc2F2ZWRkYXRhID0gbHBXYXZlT3V0SGRyLT5scERhdGE7Ci0JVUlOVDE2CQlyZXQ7Ci0KLQlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgCi0JCQkJCWhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JbHBXYXZlT3V0SGRyLT5scERhdGEgPSBQVFJfU0VHX1RPX0xJTihscFdhdmVPdXRIZHItPmxwRGF0YSk7Ci0JcmV0ID0gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKLQkJCSAgIChEV09SRClscFdhdmVPdXRIZHIsdVNpemUpOwotCWxwV2F2ZU91dEhkci0+bHBEYXRhID0gc2F2ZWRkYXRhOwotCXJldHVybiByZXQ7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIExQQllURQkJc2F2ZWRkYXRhID0gbHBXYXZlT3V0SGRyLT5scERhdGE7CisgICAgVUlOVDE2CQlyZXQ7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAorCSAgaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBscFdhdmVPdXRIZHItPmxwRGF0YSA9IFBUUl9TRUdfVE9fTElOKGxwV2F2ZU91dEhkci0+bHBEYXRhKTsKKyAgICByZXQgPSB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgICAoRFdPUkQpbHBXYXZlT3V0SGRyLHVTaXplKTsKKyAgICBscFdhdmVPdXRIZHItPmxwRGF0YSA9IHNhdmVkZGF0YTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI5NzgsMzQgKzMwNzAsMzQgQEAKIFVJTlQzMiBXSU5BUEkgd2F2ZU91dFVucHJlcGFyZUhlYWRlcjMyKEhXQVZFT1VUMzIgaFdhdmVPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVZFSERSICogbHBXYXZlT3V0SGRyLCBVSU5UMzIgdVNpemUpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAotCQkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXT0RNX1VOUFJFUEFSRSxscERlc2MtPmR3SW5zdGFuY2UsIAotCQkJCQkoRFdPUkQpbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKKwkgIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKKyAgICBscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgcmV0dXJuIHdvZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsV09ETV9VTlBSRVBBUkUsbHBEZXNjLT5kd0luc3RhbmNlLCAKKwkJICAgICAgKERXT1JEKWxwV2F2ZU91dEhkciwgdVNpemUpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd2F2ZU91dFVucHJlcGFyZUhlYWRlcglbTU1TWVNURU0uNDA3XQogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRVbnByZXBhcmVIZWFkZXIxNihIV0FWRU9VVDE2IGhXYXZlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVIRFIgKiBscFdhdmVPdXRIZHIsIFVJTlQxNiB1U2l6ZSkKKwkJCQkgICAgICAgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwgVUlOVDE2IHVTaXplKQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlMUEJZVEUJCXNhdmVkZGF0YSA9IGxwV2F2ZU91dEhkci0+bHBEYXRhOwotCVVJTlQxNgkJcmV0OwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAotCQkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlscFdhdmVPdXRIZHItPmxwRGF0YSA9IFBUUl9TRUdfVE9fTElOKGxwV2F2ZU91dEhkci0+bHBEYXRhKTsKLQlyZXQgPSB3b2RNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdPRE1fVU5QUkVQQVJFLGxwRGVzYy0+ZHdJbnN0YW5jZSwgCi0JCQkgIChEV09SRClscFdhdmVPdXRIZHIsIHVTaXplKTsKLQlscFdhdmVPdXRIZHItPmxwRGF0YSA9IHNhdmVkZGF0YTsKLQlyZXR1cm4gcmV0OworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICBMUEJZVEUJCXNhdmVkZGF0YSA9IGxwV2F2ZU91dEhkci0+bHBEYXRhOworICAgIFVJTlQxNgkJcmV0OworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKKwkgIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKKyAgICBscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgbHBXYXZlT3V0SGRyLT5scERhdGEgPSBQVFJfU0VHX1RPX0xJTihscFdhdmVPdXRIZHItPmxwRGF0YSk7CisgICAgcmV0ID0gd29kTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXT0RNX1VOUFJFUEFSRSxscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgIChEV09SRClscFdhdmVPdXRIZHIsIHVTaXplKTsKKyAgICBscFdhdmVPdXRIZHItPmxwRGF0YSA9IHNhdmVkZGF0YTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMwMTQsMzAgKzMxMDYsMzAgQEAKIFVJTlQzMiBXSU5BUEkgd2F2ZU91dFdyaXRlMzIoSFdBVkVPVVQzMiBoV2F2ZU91dCwgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHVTaXplKQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlscFdhdmVPdXRIZHItPnJlc2VydmVkID0gKERXT1JEKWxwV2F2ZU91dEhkci0+bHBEYXRhOwotCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9XUklURSwgbHBEZXNjLT5kd0luc3RhbmNlLCAoRFdPUkQpbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZU91dCwgbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGxwV2F2ZU91dEhkci0+cmVzZXJ2ZWQgPSAoRFdPUkQpbHBXYXZlT3V0SGRyLT5scERhdGE7CisgICAgcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1dSSVRFLCBscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscFdhdmVPdXRIZHIsIHVTaXplKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdhdmVPdXRXcml0ZQkJW01NU1lTVEVNLjQwOF0KICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlT3V0V3JpdGUxNihIV0FWRU9VVDE2IGhXYXZlT3V0LCBXQVZFSERSICogbHBXYXZlT3V0SGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHVTaXplKQorCQkJICAgICBVSU5UMTYgdVNpemUpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCVVJTlQxNgkJcmV0OwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JbHBXYXZlT3V0SGRyLT5yZXNlcnZlZD0oRFdPUkQpbHBXYXZlT3V0SGRyLT5scERhdGE7LypzYXZlIG9yaWdpbmFsIHB0ciovCi0JbHBXYXZlT3V0SGRyLT5scERhdGEgPSBQVFJfU0VHX1RPX0xJTihscFdhdmVPdXRIZHItPmxwRGF0YSk7Ci0JcmV0ID0gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fV1JJVEUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWxwV2F2ZU91dEhkciwgdVNpemUpOwotCWxwV2F2ZU91dEhkci0+bHBEYXRhID0gKExQQllURSlscFdhdmVPdXRIZHItPnJlc2VydmVkOwotCXJldHVybiByZXQ7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIFVJTlQxNgkJcmV0OworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZU91dCwgbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGxwV2F2ZU91dEhkci0+cmVzZXJ2ZWQ9KERXT1JEKWxwV2F2ZU91dEhkci0+bHBEYXRhOy8qc2F2ZSBvcmlnaW5hbCBwdHIqLworICAgIGxwV2F2ZU91dEhkci0+bHBEYXRhID0gUFRSX1NFR19UT19MSU4obHBXYXZlT3V0SGRyLT5scERhdGEpOworICAgIHJldCA9IHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1dSSVRFLCBscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscFdhdmVPdXRIZHIsIHVTaXplKTsKKyAgICBscFdhdmVPdXRIZHItPmxwRGF0YSA9IChMUEJZVEUpbHBXYXZlT3V0SGRyLT5yZXNlcnZlZDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMwNDUsNyArMzEzNyw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZU91dFBhdXNlMzIoSFdBVkVPVVQzMiBoV2F2ZU91dCkKIHsKLQlyZXR1cm4gd2F2ZU91dFBhdXNlMTYoaFdhdmVPdXQpOworICAgIHJldHVybiB3YXZlT3V0UGF1c2UxNihoV2F2ZU91dCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzA1MywxMiArMzE0NSwxMiBAQAogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRQYXVzZTE2KEhXQVZFT1VUMTYgaFdhdmVPdXQpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlT3V0KTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1BBVVNFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZU91dCk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9QQVVTRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMwNjYsMTkgKzMxNTgsMjAgQEAKICAqLwogVUlOVDMyIFdJTkFQSSB3YXZlT3V0UmVzdGFydDMyKEhXQVZFT1VUMzIgaFdhdmVPdXQpCiB7Ci0JcmV0dXJuIHdhdmVPdXRSZXN0YXJ0MTYoaFdhdmVPdXQpOworICAgIHJldHVybiB3YXZlT3V0UmVzdGFydDE2KGhXYXZlT3V0KTsKIH0KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd2F2ZU91dFJlc3RhcnQJCVtNTVNZU1RFTS40MTBdCiAgKi8KIFVJTlQxNiBXSU5BUEkgd2F2ZU91dFJlc3RhcnQxNihIV0FWRU9VVDE2IGhXYXZlT3V0KQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQotCVRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZU91dCk7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9SRVNUQVJULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZU91dCk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9SRVNUQVJULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzA4Niw3ICszMTc5LDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSB3YXZlT3V0UmVzZXQzMihIV0FWRU9VVDMyIGhXYXZlT3V0KQogewotCXJldHVybiB3YXZlT3V0UmVzZXQxNihoV2F2ZU91dCk7CisgICAgcmV0dXJuIHdhdmVPdXRSZXNldDE2KGhXYXZlT3V0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMDk0LDExICszMTg3LDExIEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgd2F2ZU91dFJlc2V0MTYoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlT3V0KTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZU91dCk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9SRVNFVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMxMDcsMTMgKzMyMDAsMTMgQEAKIFVJTlQzMiBXSU5BUEkgd2F2ZU91dEdldFBvc2l0aW9uMzIoSFdBVkVPVVQzMiBoV2F2ZU91dCwgTFBNTVRJTUUzMiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB1U2l6ZSkKIHsKLQlNTVRJTUUxNgltbXQxNjsKLQlVSU5UMzIgcmV0OwotCQotCW1tdDE2LndUeXBlID0gbHBUaW1lLT53VHlwZTsKLQlyZXQgPSB3YXZlT3V0R2V0UG9zaXRpb24xNihoV2F2ZU91dCwmbW10MTYsc2l6ZW9mKG1tdDE2KSk7Ci0JTU1TWVNURU1fTU1USU1FMTZ0bzMyKGxwVGltZSwmbW10MTYpOwotCXJldHVybiByZXQ7CisgICAgTU1USU1FMTYJbW10MTY7CisgICAgVUlOVDMyIHJldDsKKyAgICAKKyAgICBtbXQxNi53VHlwZSA9IGxwVGltZS0+d1R5cGU7CisgICAgcmV0ID0gd2F2ZU91dEdldFBvc2l0aW9uMTYoaFdhdmVPdXQsJm1tdDE2LHNpemVvZihtbXQxNikpOworICAgIE1NU1lTVEVNX01NVElNRTE2dG8zMihscFRpbWUsJm1tdDE2KTsKKyAgICByZXR1cm4gcmV0OwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd2F2ZU91dEdldFBvc2l0aW9uCVtNTVNZU1RFTS40MTJdCkBAIC0zMTIxLDEyICszMjE0LDEyIEBACiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRHZXRQb3NpdGlvbjE2KEhXQVZFT1VUMTYgaFdhdmVPdXQsTFBNTVRJTUUxNiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB1U2l6ZSkKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFRpbWUsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX0dFVFBPUywgbHBEZXNjLT5kd0luc3RhbmNlLCAKLQkJCQkJCQkoRFdPUkQpbHBUaW1lLCAoRFdPUkQpdVNpemUpOworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwVGltZSwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fR0VUUE9TLCBscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgICAgKERXT1JEKWxwVGltZSwgKERXT1JEKXVTaXplKTsKIH0KIAogI2RlZmluZSBXQVZFT1VUX1NIT1JUQ1VUXzEoeHgsWFgsYXR5cGUpIFwKQEAgLTMxNDgsNyArMzI0MSw3IEBACiBXQVZFT1VUX1NIT1JUQ1VUXzEoU2V0UGl0Y2gsU0VUUElUQ0gsRFdPUkQpCiBXQVZFT1VUX1NIT1JUQ1VUXzEoR2V0UGxheWJhY2tSYXRlLEdFVFBMQVlCQUNLUkFURSxEV09SRCopCiBXQVZFT1VUX1NIT1JUQ1VUXzEoU2V0UGxheWJhY2tSYXRlLFNFVFBMQVlCQUNLUkFURSxEV09SRCkKLQorICAgIAogI2RlZmluZSBXQVZFT1VUX1NIT1JUQ1VUXzIoeHgsWFgsYXR5cGUpIFwKIAlVSU5UMzIgV0lOQVBJIHdhdmVPdXQjI3h4IyMzMihVSU5UMzIgZGV2aWQsIGF0eXBlIHgpCQlcCiB7CQkJCQkJCQkJXApAQCAtMzE1OSwyNiArMzI1MiwyNiBAQAogCVRSQUNFKG1tc3lzLCAid2F2ZU91dCIjeHgiKCUwNFgsICUwOGx4KTtcbiIsIGRldmlkLChEV09SRCl4KTsJXAogCXJldHVybiB3b2RNZXNzYWdlKGRldmlkLCBXT0RNXyMjWFgsIDBMLAkoRFdPUkQpeCwgMEwpOwkJXAogfQotCQotCisgICAgCisgICAgCiBXQVZFT1VUX1NIT1JUQ1VUXzIoR2V0Vm9sdW1lLEdFVFZPTFVNRSxEV09SRCopCiBXQVZFT1VUX1NIT1JUQ1VUXzIoU2V0Vm9sdW1lLFNFVFZPTFVNRSxEV09SRCkKLQotCisgICAgCisgICAgCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl3YXZlT3V0QnJlYWtMb29wIAlbTU1TWVNURU0uNDE5XQogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVPdXRCcmVha0xvb3AzMihIV0FWRU9VVDMyIGhXYXZlT3V0KQogewotCXJldHVybiB3YXZlT3V0QnJlYWtMb29wMTYoaFdhdmVPdXQpOworICAgIHJldHVybiB3YXZlT3V0QnJlYWtMb29wMTYoaFdhdmVPdXQpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd2F2ZU91dEJyZWFrTG9vcCAJW01NU1lTVEVNLjQxOV0KICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlT3V0QnJlYWtMb29wMTYoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKLQlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVPdXQpOwotCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVPdXQpOworICAgIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMTg2LDI2ICszMjc5LDI2IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZU91dEdldElEMzIoSFdBVkVPVVQzMiBoV2F2ZU91dCwgVUlOVDMyICogbHB1RGV2aWNlSUQpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwKTtcbiIsIGhXYXZlT3V0LCBscHVEZXZpY2VJRCk7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCWlmIChscHVEZXZpY2VJRCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JKmxwdURldmljZUlEID0gbHBEZXNjLT51RGV2aWNlSUQ7Ci0gICAgICAgIHJldHVybiAwOworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCk7XG4iLCBoV2F2ZU91dCwgbHB1RGV2aWNlSUQpOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgICpscHVEZXZpY2VJRCA9IGxwRGVzYy0+dURldmljZUlEOworICAgIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd2F2ZU91dEdldElECSAJW01NU1lTVEVNLjQyMF0KICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlT3V0R2V0SUQxNihIV0FWRU9VVDE2IGhXYXZlT3V0LCBVSU5UMTYgKiBscHVEZXZpY2VJRCkKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXApO1xuIiwgaFdhdmVPdXQsIGxwdURldmljZUlEKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JaWYgKGxwdURldmljZUlEID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQkqbHB1RGV2aWNlSUQgPSBscERlc2MtPnVEZXZpY2VJRDsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwKTtcbiIsIGhXYXZlT3V0LCBscHVEZXZpY2VJRCk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGlmIChscHVEZXZpY2VJRCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgKmxwdURldmljZUlEID0gbHBEZXNjLT51RGV2aWNlSUQ7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzIxNCw0MSArMzMwNyw0MSBAQAogRFdPUkQgV0lOQVBJIHdhdmVPdXRNZXNzYWdlMzIoSFdBVkVPVVQzMiBoV2F2ZU91dCwgVUlOVDMyIHVNZXNzYWdlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0KLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0Jc3dpdGNoICh1TWVzc2FnZSkgewotCWNhc2UgV09ETV9HRVROVU1ERVZTOgotCWNhc2UgV09ETV9HRVRQT1M6Ci0JY2FzZSBXT0RNX0dFVFZPTFVNRToKLQljYXNlIFdPRE1fR0VUUElUQ0g6Ci0JY2FzZSBXT0RNX0dFVFBMQVlCQUNLUkFURToKLQljYXNlIFdPRE1fU0VUVk9MVU1FOgotCWNhc2UgV09ETV9TRVRQSVRDSDoKLQljYXNlIFdPRE1fU0VUUExBWUJBQ0tSQVRFOgotCWNhc2UgV09ETV9SRVNFVDoKLQljYXNlIFdPRE1fUEFVU0U6Ci0JY2FzZSBXT0RNX1BSRVBBUkU6Ci0JY2FzZSBXT0RNX1VOUFJFUEFSRToKLQljYXNlIFdPRE1fU1RPUDoKLQljYXNlIFdPRE1fQ0xPU0U6Ci0JCS8qIG5vIGFyZ3VtZW50IGNvbnZlcnNpb24gbmVlZGVkICovCi0JCWJyZWFrOwotCWNhc2UgV09ETV9XUklURToKLQkJcmV0dXJuIHdhdmVPdXRXcml0ZTMyKGhXYXZlT3V0LChMUFdBVkVIRFIpZHdQYXJhbTEsZHdQYXJhbTIpOwotCWNhc2UgV09ETV9HRVRERVZDQVBTOgotCQkvKiBGSVhNRTogVU5JQ09ERS9BTlNJPyAqLwotCQlyZXR1cm4gd2F2ZU91dEdldERldkNhcHMzMkEoaFdhdmVPdXQsKExQV0FWRU9VVENBUFMzMkEpZHdQYXJhbTEsZHdQYXJhbTIpOwotCWNhc2UgV09ETV9PUEVOOgotCQlGSVhNRShtbXN5cywiY2FuJ3QgaGFuZGxlIFdPRE1fT1BFTiwgcGxlYXNlIHJlcG9ydC5cbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlFUlIobW1zeXMsIigweCUwNHgsMHglMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCi0JCSAgICBoV2F2ZU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CisgICAgY2FzZSBXT0RNX0dFVE5VTURFVlM6CisgICAgY2FzZSBXT0RNX0dFVFBPUzoKKyAgICBjYXNlIFdPRE1fR0VUVk9MVU1FOgorICAgIGNhc2UgV09ETV9HRVRQSVRDSDoKKyAgICBjYXNlIFdPRE1fR0VUUExBWUJBQ0tSQVRFOgorICAgIGNhc2UgV09ETV9TRVRWT0xVTUU6CisgICAgY2FzZSBXT0RNX1NFVFBJVENIOgorICAgIGNhc2UgV09ETV9TRVRQTEFZQkFDS1JBVEU6CisgICAgY2FzZSBXT0RNX1JFU0VUOgorICAgIGNhc2UgV09ETV9QQVVTRToKKyAgICBjYXNlIFdPRE1fUFJFUEFSRToKKyAgICBjYXNlIFdPRE1fVU5QUkVQQVJFOgorICAgIGNhc2UgV09ETV9TVE9QOgorICAgIGNhc2UgV09ETV9DTE9TRToKKwkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLworCWJyZWFrOworICAgIGNhc2UgV09ETV9XUklURToKKwlyZXR1cm4gd2F2ZU91dFdyaXRlMzIoaFdhdmVPdXQsKExQV0FWRUhEUilkd1BhcmFtMSxkd1BhcmFtMik7CisgICAgY2FzZSBXT0RNX0dFVERFVkNBUFM6CisJLyogRklYTUU6IFVOSUNPREUvQU5TST8gKi8KKwlyZXR1cm4gd2F2ZU91dEdldERldkNhcHMzMkEoaFdhdmVPdXQsKExQV0FWRU9VVENBUFMzMkEpZHdQYXJhbTEsZHdQYXJhbTIpOworICAgIGNhc2UgV09ETV9PUEVOOgorCUZJWE1FKG1tc3lzLCJjYW4ndCBoYW5kbGUgV09ETV9PUEVOLCBwbGVhc2UgcmVwb3J0LlxuIik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlFUlIobW1zeXMsIigweCUwNHgsMHglMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJICAgIGhXYXZlT3V0LHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMyNTcsNDUgKzMzNTAsNDUgQEAKIERXT1JEIFdJTkFQSSB3YXZlT3V0TWVzc2FnZTE2KEhXQVZFT1VUMTYgaFdhdmVPdXQsIFVJTlQxNiB1TWVzc2FnZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXN3aXRjaCAodU1lc3NhZ2UpIHsKLQljYXNlIFdPRE1fR0VUTlVNREVWUzoKLQljYXNlIFdPRE1fU0VUVk9MVU1FOgotCWNhc2UgV09ETV9TRVRQSVRDSDoKLQljYXNlIFdPRE1fU0VUUExBWUJBQ0tSQVRFOgotCWNhc2UgV09ETV9SRVNFVDoKLQljYXNlIFdPRE1fUEFVU0U6Ci0JY2FzZSBXT0RNX1NUT1A6Ci0JY2FzZSBXT0RNX0NMT1NFOgotCQkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLwotCQlicmVhazsKLQljYXNlIFdPRE1fR0VUUE9TOgotCQlyZXR1cm4gd2F2ZU91dEdldFBvc2l0aW9uMTYoaFdhdmVPdXQsKExQTU1USU1FMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKLQljYXNlIFdPRE1fR0VUVk9MVU1FOgotCQlyZXR1cm4gd2F2ZU91dEdldFZvbHVtZTE2KGhXYXZlT3V0LChMUERXT1JEKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSk7Ci0JY2FzZSBXT0RNX0dFVFBJVENIOgotCQlyZXR1cm4gd2F2ZU91dEdldFBpdGNoMTYoaFdhdmVPdXQsKExQRFdPUkQpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpKTsKLQljYXNlIFdPRE1fR0VUUExBWUJBQ0tSQVRFOgotCQlyZXR1cm4gd2F2ZU91dEdldFBsYXliYWNrUmF0ZTE2KGhXYXZlT3V0LChMUERXT1JEKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSk7Ci0JY2FzZSBXT0RNX0dFVERFVkNBUFM6Ci0JCXJldHVybiB3YXZlT3V0R2V0RGV2Q2FwczE2KGhXYXZlT3V0LChMUFdBVkVPVVRDQVBTMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKLQljYXNlIFdPRE1fUFJFUEFSRToKLQkJcmV0dXJuIHdhdmVPdXRQcmVwYXJlSGVhZGVyMTYoaFdhdmVPdXQsKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwotCWNhc2UgV09ETV9VTlBSRVBBUkU6Ci0JCXJldHVybiB3YXZlT3V0VW5wcmVwYXJlSGVhZGVyMTYoaFdhdmVPdXQsKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwotCWNhc2UgV09ETV9XUklURToKLQkJcmV0dXJuIHdhdmVPdXRXcml0ZTE2KGhXYXZlT3V0LChMUFdBVkVIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKLQljYXNlIFdPRE1fT1BFTjoKLQkJRklYTUUobW1zeXMsImNhbid0IGhhbmRsZSBXT0RNX09QRU4sIHBsZWFzZSByZXBvcnQuXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRVJSKG1tc3lzLCIoMHglMDR4LDB4JTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAotCQkgICAgaFdhdmVPdXQsdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIpOwotCX0KLQlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CisgICAgY2FzZSBXT0RNX0dFVE5VTURFVlM6CisgICAgY2FzZSBXT0RNX1NFVFZPTFVNRToKKyAgICBjYXNlIFdPRE1fU0VUUElUQ0g6CisgICAgY2FzZSBXT0RNX1NFVFBMQVlCQUNLUkFURToKKyAgICBjYXNlIFdPRE1fUkVTRVQ6CisgICAgY2FzZSBXT0RNX1BBVVNFOgorICAgIGNhc2UgV09ETV9TVE9QOgorICAgIGNhc2UgV09ETV9DTE9TRToKKwkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLworCWJyZWFrOworICAgIGNhc2UgV09ETV9HRVRQT1M6CisJcmV0dXJuIHdhdmVPdXRHZXRQb3NpdGlvbjE2KGhXYXZlT3V0LChMUE1NVElNRTE2KVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7CisgICAgY2FzZSBXT0RNX0dFVFZPTFVNRToKKwlyZXR1cm4gd2F2ZU91dEdldFZvbHVtZTE2KGhXYXZlT3V0LChMUERXT1JEKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSk7CisgICAgY2FzZSBXT0RNX0dFVFBJVENIOgorCXJldHVybiB3YXZlT3V0R2V0UGl0Y2gxNihoV2F2ZU91dCwoTFBEV09SRClQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSkpOworICAgIGNhc2UgV09ETV9HRVRQTEFZQkFDS1JBVEU6CisJcmV0dXJuIHdhdmVPdXRHZXRQbGF5YmFja1JhdGUxNihoV2F2ZU91dCwoTFBEV09SRClQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSkpOworICAgIGNhc2UgV09ETV9HRVRERVZDQVBTOgorCXJldHVybiB3YXZlT3V0R2V0RGV2Q2FwczE2KGhXYXZlT3V0LChMUFdBVkVPVVRDQVBTMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKKyAgICBjYXNlIFdPRE1fUFJFUEFSRToKKwlyZXR1cm4gd2F2ZU91dFByZXBhcmVIZWFkZXIxNihoV2F2ZU91dCwoTFBXQVZFSERSKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7CisgICAgY2FzZSBXT0RNX1VOUFJFUEFSRToKKwlyZXR1cm4gd2F2ZU91dFVucHJlcGFyZUhlYWRlcjE2KGhXYXZlT3V0LChMUFdBVkVIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKKyAgICBjYXNlIFdPRE1fV1JJVEU6CisJcmV0dXJuIHdhdmVPdXRXcml0ZTE2KGhXYXZlT3V0LChMUFdBVkVIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKKyAgICBjYXNlIFdPRE1fT1BFTjoKKwlGSVhNRShtbXN5cywiY2FuJ3QgaGFuZGxlIFdPRE1fT1BFTiwgcGxlYXNlIHJlcG9ydC5cbiIpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJRVJSKG1tc3lzLCIoMHglMDR4LDB4JTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAorCSAgICBoV2F2ZU91dCx1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7CisgICAgfQorICAgIHJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzAzLDcgKzMzOTYsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVJbkdldE51bURldnMzMigpCiB7Ci0JcmV0dXJuIHdhdmVJbkdldE51bURldnMxNigpOworICAgIHJldHVybiB3YXZlSW5HZXROdW1EZXZzMTYoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzExLDExICszNDA0LDExIEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgd2F2ZUluR2V0TnVtRGV2czE2KCkKIHsKLQlVSU5UMTYJY291bnQgPSAwOwotCVRSQUNFKG1tc3lzLCAid2F2ZUluR2V0TnVtRGV2c1xuIik7Ci0JY291bnQgKz0gd2lkTWVzc2FnZSgwLCBXSURNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwotCVRSQUNFKG1tc3lzLCAid2F2ZUluR2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7Ci0JcmV0dXJuIGNvdW50OworICAgIFVJTlQxNgljb3VudCA9IDA7CisgICAgVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXROdW1EZXZzXG4iKTsKKyAgICBjb3VudCArPSB3aWRNZXNzYWdlKDAsIFdJRE1fR0VUTlVNREVWUywgMEwsIDBMLCAwTCk7CisgICAgVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKKyAgICByZXR1cm4gY291bnQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzMyMyw0MSArMzQxNiw0MSBAQAogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVJbkdldERldkNhcHMzMlcoVUlOVDMyIHVEZXZpY2VJRCwgTFBXQVZFSU5DQVBTMzJXIGxwQ2FwcywgVUlOVDMyIHVTaXplKQogewotCVdBVkVJTkNBUFMxNgl3aWMxNjsKLQlVSU5UMzIJcmV0ID0gd2F2ZUluR2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwmd2ljMTYsdVNpemUpOwotCi0JbHBDYXBzLT53TWlkID0gd2ljMTYud01pZDsKLQlscENhcHMtPndQaWQgPSB3aWMxNi53UGlkOwotCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSB3aWMxNi52RHJpdmVyVmVyc2lvbjsKLQlsc3RyY3B5QXRvVyhscENhcHMtPnN6UG5hbWUsd2ljMTYuc3pQbmFtZSk7Ci0JbHBDYXBzLT5kd0Zvcm1hdHMgPSB3aWMxNi5kd0Zvcm1hdHM7Ci0JbHBDYXBzLT53Q2hhbm5lbHMgPSB3aWMxNi53Q2hhbm5lbHM7Ci0KLQlyZXR1cm4gcmV0OworICAgIFdBVkVJTkNBUFMxNgl3aWMxNjsKKyAgICBVSU5UMzIJcmV0ID0gd2F2ZUluR2V0RGV2Q2FwczE2KHVEZXZpY2VJRCwmd2ljMTYsdVNpemUpOworICAgIAorICAgIGxwQ2Fwcy0+d01pZCA9IHdpYzE2LndNaWQ7CisgICAgbHBDYXBzLT53UGlkID0gd2ljMTYud1BpZDsKKyAgICBscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gd2ljMTYudkRyaXZlclZlcnNpb247CisgICAgbHN0cmNweUF0b1cobHBDYXBzLT5zelBuYW1lLHdpYzE2LnN6UG5hbWUpOworICAgIGxwQ2Fwcy0+ZHdGb3JtYXRzID0gd2ljMTYuZHdGb3JtYXRzOworICAgIGxwQ2Fwcy0+d0NoYW5uZWxzID0gd2ljMTYud0NoYW5uZWxzOworICAgIAorICAgIHJldHVybiByZXQ7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl3YXZlSW5HZXREZXZDYXBzQSAJCVtXSU5NTS4xNDZdCiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZUluR2V0RGV2Q2FwczMyQShVSU5UMzIgdURldmljZUlELCBMUFdBVkVJTkNBUFMzMkEgbHBDYXBzLCBVSU5UMzIgdVNpemUpCiB7Ci0JV0FWRUlOQ0FQUzE2CXdpYzE2OwotCVVJTlQzMglyZXQgPSB3YXZlSW5HZXREZXZDYXBzMTYodURldmljZUlELCZ3aWMxNix1U2l6ZSk7Ci0JCi0JbHBDYXBzLT53TWlkID0gd2ljMTYud01pZDsKLQlscENhcHMtPndQaWQgPSB3aWMxNi53UGlkOwotCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSB3aWMxNi52RHJpdmVyVmVyc2lvbjsKLQlzdHJjcHkobHBDYXBzLT5zelBuYW1lLHdpYzE2LnN6UG5hbWUpOwotCWxwQ2Fwcy0+ZHdGb3JtYXRzID0gd2ljMTYuZHdGb3JtYXRzOwotCWxwQ2Fwcy0+d0NoYW5uZWxzID0gd2ljMTYud0NoYW5uZWxzOwotCXJldHVybiByZXQ7CisgICAgV0FWRUlOQ0FQUzE2CXdpYzE2OworICAgIFVJTlQzMglyZXQgPSB3YXZlSW5HZXREZXZDYXBzMTYodURldmljZUlELCZ3aWMxNix1U2l6ZSk7CisgICAgCisgICAgbHBDYXBzLT53TWlkID0gd2ljMTYud01pZDsKKyAgICBscENhcHMtPndQaWQgPSB3aWMxNi53UGlkOworICAgIGxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSB3aWMxNi52RHJpdmVyVmVyc2lvbjsKKyAgICBzdHJjcHkobHBDYXBzLT5zelBuYW1lLHdpYzE2LnN6UG5hbWUpOworICAgIGxwQ2Fwcy0+ZHdGb3JtYXRzID0gd2ljMTYuZHdGb3JtYXRzOworICAgIGxwQ2Fwcy0+d0NoYW5uZWxzID0gd2ljMTYud0NoYW5uZWxzOworICAgIHJldHVybiByZXQ7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl3YXZlSW5HZXREZXZDYXBzIAkJW01NU1lTVEVNLjUwMl0KICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlSW5HZXREZXZDYXBzMTYoVUlOVDE2IHVEZXZpY2VJRCwgTFBXQVZFSU5DQVBTMTYgbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7Ci0JVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXREZXZDYXBzXG4iKTsKLQlyZXR1cm4gd2lkTWVzc2FnZSh1RGV2aWNlSUQsIFdJRE1fR0VUREVWQ0FQUywgMEwsIChEV09SRClscENhcHMsIHVTaXplKTsKKyAgICBUUkFDRShtbXN5cywgIndhdmVJbkdldERldkNhcHNcbiIpOworICAgIHJldHVybiB3aWRNZXNzYWdlKHVEZXZpY2VJRCwgV0lETV9HRVRERVZDQVBTLCAwTCwgKERXT1JEKWxwQ2FwcywgdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMzNjUsOCArMzQ1OCw4IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZUluR2V0RXJyb3JUZXh0MzJBKFVJTlQzMiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDMyIHVTaXplKQogewotICAgVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXRFcnJvclRleHRcbiIpOwotICAgcmV0dXJuKHdhdmVHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKSk7CisgICAgVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXRFcnJvclRleHRcbiIpOworICAgIHJldHVybih3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMzNzQsMTIgKzM0NjcsMTIgQEAKICAqLwogVUlOVDMyIFdJTkFQSSB3YXZlSW5HZXRFcnJvclRleHQzMlcoVUlOVDMyIHVFcnJvciwgTFBXU1RSIGxwVGV4dCwgVUlOVDMyIHVTaXplKQogewotCUxQU1RSIHR4dCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsdVNpemUpOwotCVVJTlQzMglyZXQgPSB3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgdHh0LCB1U2l6ZSk7Ci0KLQlsc3RyY3B5QXRvVyhscFRleHQsdHh0KTsKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdHh0KTsKLQlyZXR1cm4gcmV0OworICAgIExQU1RSIHR4dCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsdVNpemUpOworICAgIFVJTlQzMglyZXQgPSB3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgdHh0LCB1U2l6ZSk7CisgICAgCisgICAgbHN0cmNweUF0b1cobHBUZXh0LHR4dCk7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHR4dCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzg3LDggKzM0ODAsOCBAQAogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVJbkdldEVycm9yVGV4dDE2KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewotICAgVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXRFcnJvclRleHRcbiIpOwotICAgcmV0dXJuKHdhdmVHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKSk7CisgICAgVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXRFcnJvclRleHRcbiIpOworICAgIHJldHVybih3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOwogfQogCiAKQEAgLTMzOTksMTAgKzM0OTIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExQV0FWRUZPUk1BVCBscEZvcm1hdCwgRFdPUkQgZHdDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3SW5zdGFuY2UsIERXT1JEIGR3RmxhZ3MpCiB7Ci0JSFdBVkVJTjE2CWh3aW4xNjsKLQlVSU5UMzIJcmV0PXdhdmVJbk9wZW4xNigmaHdpbjE2LHVEZXZpY2VJRCxscEZvcm1hdCxkd0NhbGxiYWNrLGR3SW5zdGFuY2UsZHdGbGFncyk7Ci0JaWYgKGxwaFdhdmVJbikgKmxwaFdhdmVJbiA9IGh3aW4xNjsKLQlyZXR1cm4gcmV0OworICAgIEhXQVZFSU4xNglod2luMTY7CisgICAgVUlOVDMyCXJldCA9IHdhdmVJbk9wZW4xNigmaHdpbjE2LHVEZXZpY2VJRCxscEZvcm1hdCxkd0NhbGxiYWNrLGR3SW5zdGFuY2UsCisJCQkJIENBTExCQUNLMzJDT05WKGR3RmxhZ3MpKTsKKyAgICBpZiAobHBoV2F2ZUluKSAqbHBoV2F2ZUluID0gaHdpbjE2OworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzQxMiw0MiArMzUwNiw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFBXQVZFRk9STUFUIGxwRm9ybWF0LCBEV09SRCBkd0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncykKIHsKLQlIV0FWRUlOMTYgaFdhdmVJbjsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JRFdPUkQJZHdSZXQgPSAwOwotCUJPT0wzMgliTWFwcGVyRmxnID0gRkFMU0U7Ci0JVFJBQ0UobW1zeXMsICIoJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKLQkJbHBoV2F2ZUluLCB1RGV2aWNlSUQsIGxwRm9ybWF0LCBkd0NhbGxiYWNrLCBkd0luc3RhbmNlLCBkd0ZsYWdzKTsKLQlpZiAoZHdGbGFncyAmIFdBVkVfRk9STUFUX1FVRVJZKQotCQlUUkFDRShtbXN5cywgIldBVkVfRk9STUFUX1FVRVJZIHJlcXVlc3RlZCAhXG4iKTsKLQlpZiAodURldmljZUlEID09IChVSU5UMTYpV0FWRV9NQVBQRVIpIHsKLQkJVFJBQ0UobW1zeXMsICJXQVZFX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKLQkJYk1hcHBlckZsZyA9IFRSVUU7Ci0JCXVEZXZpY2VJRCA9IDA7Ci0JfQotCWlmIChscEZvcm1hdCA9PSBOVUxMKSByZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKLQloV2F2ZUluID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihXQVZFT1BFTkRFU0MpKTsKLQlpZiAobHBoV2F2ZUluICE9IE5VTEwpICpscGhXYXZlSW4gPSBoV2F2ZUluOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PTUVNOwotCWxwRGVzYy0+aFdhdmUgPSBoV2F2ZUluOwotCWxwRGVzYy0+bHBGb3JtYXQgPSBscEZvcm1hdDsKLQlscERlc2MtPmR3Q2FsbEJhY2sgPSBkd0NhbGxiYWNrOwotCWxwRGVzYy0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7Ci0Jd2hpbGUodURldmljZUlEIDwgTUFYV0FWRURSSVZFUlMpIHsKLQkJZHdSZXQgPSB3aWRNZXNzYWdlKHVEZXZpY2VJRCwgV0lETV9PUEVOLCAKLQkJCWxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWxwRGVzYywgMEwpOwotCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7Ci0JCWlmICghYk1hcHBlckZsZykgYnJlYWs7Ci0JCXVEZXZpY2VJRCsrOwotCQlUUkFDRShtbXN5cywgIldBVkVfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOwotCX0KLQlscERlc2MtPnVEZXZpY2VJRCA9IHVEZXZpY2VJRDsKLQlpZiAoZHdGbGFncyAmIFdBVkVfRk9STUFUX1FVRVJZKSB7Ci0JCVRSQUNFKG1tc3lzLCAiRW5kIG9mIFdBVkVfRk9STUFUX1FVRVJZICFcbiIpOwotCQlkd1JldCA9IHdhdmVJbkNsb3NlMTYoaFdhdmVJbik7Ci0JfQotCXJldHVybiBkd1JldDsKKyAgICBIV0FWRUlOMTYgaFdhdmVJbjsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgRFdPUkQJZHdSZXQgPSAwOworICAgIEJPT0wzMgliTWFwcGVyRmxnID0gRkFMU0U7CisgICAgVFJBQ0UobW1zeXMsICIoJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwkgIGxwaFdhdmVJbiwgdURldmljZUlELCBscEZvcm1hdCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7CisgICAgaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkKKwlUUkFDRShtbXN5cywgIldBVkVfRk9STUFUX1FVRVJZIHJlcXVlc3RlZCAhXG4iKTsKKyAgICBpZiAodURldmljZUlEID09IChVSU5UMTYpV0FWRV9NQVBQRVIpIHsKKwlUUkFDRShtbXN5cywgIldBVkVfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOworCWJNYXBwZXJGbGcgPSBUUlVFOworCXVEZXZpY2VJRCA9IDA7CisgICAgfQorICAgIGlmIChscEZvcm1hdCA9PSBOVUxMKSByZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKKyAgICBoV2F2ZUluID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihXQVZFT1BFTkRFU0MpKTsKKyAgICBpZiAobHBoV2F2ZUluICE9IE5VTEwpICpscGhXYXZlSW4gPSBoV2F2ZUluOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PTUVNOworICAgIGxwRGVzYy0+aFdhdmUgPSBoV2F2ZUluOworICAgIGxwRGVzYy0+bHBGb3JtYXQgPSBscEZvcm1hdDsKKyAgICBscERlc2MtPmR3Q2FsbEJhY2sgPSBkd0NhbGxiYWNrOworICAgIGxwRGVzYy0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7CisgICAgd2hpbGUodURldmljZUlEIDwgTUFYV0FWRURSSVZFUlMpIHsKKwlkd1JldCA9IHdpZE1lc3NhZ2UodURldmljZUlELCBXSURNX09QRU4sIAorCQkJICAgbHBEZXNjLT5kd0luc3RhbmNlLCAoRFdPUkQpbHBEZXNjLCAwTCk7CisJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOworCWlmICghYk1hcHBlckZsZykgYnJlYWs7CisJdURldmljZUlEKys7CisJVFJBQ0UobW1zeXMsICJXQVZFX01BUFBFUiBtb2RlICEgdHJ5IG5leHQgZHJpdmVyLi4uXG4iKTsKKyAgICB9CisgICAgbHBEZXNjLT51RGV2aWNlSUQgPSB1RGV2aWNlSUQ7CisgICAgaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkgeworCVRSQUNFKG1tc3lzLCAiRW5kIG9mIFdBVkVfRk9STUFUX1FVRVJZICFcbiIpOworCWR3UmV0ID0gd2F2ZUluQ2xvc2UxNihoV2F2ZUluKTsKKyAgICB9CisgICAgcmV0dXJuIGR3UmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM0NTUsNjggKzM1NDksNjggQEAKICAqLwogVUlOVDMyIFdJTkFQSSB3YXZlSW5DbG9zZTMyKEhXQVZFSU4zMiBoV2F2ZUluKQogewotCXJldHVybiB3YXZlSW5DbG9zZTE2KGhXYXZlSW4pOworICAgIHJldHVybiB3YXZlSW5DbG9zZTE2KGhXYXZlSW4pOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd2F2ZUluQ2xvc2UJCQlbTU1TWVNURU0uNTA1XQogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVJbkNsb3NlMTYoSFdBVkVJTjE2IGhXYXZlSW4pCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlSW4pOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX0NMT1NFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZUluKTsKKyAgICBscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl3YXZlSW5QcmVwYXJlSGVhZGVyCQlbV0lOTU0uMTU1XQogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVJblByZXBhcmVIZWFkZXIzMihIV0FWRUlOMzIgaFdhdmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVZFSERSICogbHBXYXZlSW5IZHIsIFVJTlQzMiB1U2l6ZSkKKwkJCQkgICAgV0FWRUhEUiAqIGxwV2F2ZUluSGRyLCBVSU5UMzIgdVNpemUpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAotCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCWlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JbHBXYXZlSW5IZHIgPSBscFdhdmVJbkhkcjsKLQlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKLSAgICAJbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JVFJBQ0UobW1zeXMsICJscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKLQkJbHBXYXZlSW5IZHItPmxwRGF0YSwgbHBXYXZlSW5IZHItPmR3QnVmZmVyTGVuZ3RoKTsKLQlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXSURNX1BSRVBBUkUsbHBEZXNjLT5kd0luc3RhbmNlLCAKLQkJCSAgKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKKwkgIGhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBscFdhdmVJbkhkciA9IGxwV2F2ZUluSGRyOworICAgIGxwV2F2ZUluSGRyLT5scE5leHQgPSBOVUxMOworICAgIGxwV2F2ZUluSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOworICAgIFRSQUNFKG1tc3lzLCAibHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCisJICBscFdhdmVJbkhkci0+bHBEYXRhLCBscFdhdmVJbkhkci0+ZHdCdWZmZXJMZW5ndGgpOworICAgIHJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fUFJFUEFSRSxscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgICAoRFdPUkQpbHBXYXZlSW5IZHIsIHVTaXplKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdhdmVJblByZXBhcmVIZWFkZXIJCVtNTVNZU1RFTS41MDZdCiAgKi8KIFVJTlQxNiBXSU5BUEkgd2F2ZUluUHJlcGFyZUhlYWRlcjE2KEhXQVZFSU4xNiBoV2F2ZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVDE2IHVTaXplKQorCQkJCSAgICBXQVZFSERSICogbHBXYXZlSW5IZHIsIFVJTlQxNiB1U2l6ZSkKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JTFBCWVRFCQlzYXZlZGRhdGEgPSBscFdhdmVJbkhkci0+bHBEYXRhOwotCVVJTlQxNgkJcmV0OwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAotCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCWlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JbHBXYXZlSW5IZHIgPSBscFdhdmVJbkhkcjsKLQlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKLSAgICAJbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0KLQlUUkFDRShtbXN5cywgImxwRGF0YT0lcCBzaXplPSVsdSBcbiIsIAotCQlscFdhdmVJbkhkci0+bHBEYXRhLCBscFdhdmVJbkhkci0+ZHdCdWZmZXJMZW5ndGgpOwotCWxwV2F2ZUluSGRyLT5scERhdGEgPSBQVFJfU0VHX1RPX0xJTihscFdhdmVJbkhkci0+bHBEYXRhKTsKLQlyZXQgPSB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fUFJFUEFSRSxscERlc2MtPmR3SW5zdGFuY2UsIAotCQkJICAoRFdPUkQpbHBXYXZlSW5IZHIsdVNpemUpOwotCWxwV2F2ZUluSGRyLT5scERhdGEgPSBzYXZlZGRhdGE7Ci0JcmV0dXJuIHJldDsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgTFBCWVRFCQlzYXZlZGRhdGEgPSBscFdhdmVJbkhkci0+bHBEYXRhOworICAgIFVJTlQxNgkJcmV0OworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKKwkgIGhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBscFdhdmVJbkhkciA9IGxwV2F2ZUluSGRyOworICAgIGxwV2F2ZUluSGRyLT5scE5leHQgPSBOVUxMOworICAgIGxwV2F2ZUluSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAibHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCisJICBscFdhdmVJbkhkci0+bHBEYXRhLCBscFdhdmVJbkhkci0+ZHdCdWZmZXJMZW5ndGgpOworICAgIGxwV2F2ZUluSGRyLT5scERhdGEgPSBQVFJfU0VHX1RPX0xJTihscFdhdmVJbkhkci0+bHBEYXRhKTsKKyAgICByZXQgPSB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fUFJFUEFSRSxscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgIChEV09SRClscFdhdmVJbkhkcix1U2l6ZSk7CisgICAgbHBXYXZlSW5IZHItPmxwRGF0YSA9IHNhdmVkZGF0YTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTM1MjYsMTggKzM2MjAsMTggQEAKIFVJTlQzMiBXSU5BUEkgd2F2ZUluVW5wcmVwYXJlSGVhZGVyMzIoSFdBVkVJTjMyIGhXYXZlSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVDMyIHVTaXplKQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKLQkJCQkJCWhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQkvKlVTRVJfSEVBUF9GUkVFKEhJV09SRCgoRFdPUkQpbHBXYXZlSW5IZHItPmxwRGF0YSkpOyBGSVhNRSAqLwotCWxwV2F2ZUluSGRyLT5scERhdGEgPSBOVUxMOwotCWxwV2F2ZUluSGRyLT5scE5leHQgPSBOVUxMOwotCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fVU5QUkVQQVJFLGxwRGVzYy0+ZHdJbnN0YW5jZSwgCi0JCQkgIChEV09SRClscFdhdmVJbkhkciwgdVNpemUpOworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICAKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgCisJICBoV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgLypVU0VSX0hFQVBfRlJFRShISVdPUkQoKERXT1JEKWxwV2F2ZUluSGRyLT5scERhdGEpKTsgRklYTUUgKi8KKyAgICBscFdhdmVJbkhkci0+bHBEYXRhID0gTlVMTDsKKyAgICBscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKKyAgICByZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXSURNX1VOUFJFUEFSRSxscERlc2MtPmR3SW5zdGFuY2UsIAorCQkgICAgICAoRFdPUkQpbHBXYXZlSW5IZHIsIHVTaXplKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdhdmVJblVucHJlcGFyZUhlYWRlcglbTU1TWVNURU0uNTA3XQpAQCAtMzU0NSwxOCArMzYzOSwxOCBAQAogVUlOVDE2IFdJTkFQSSB3YXZlSW5VbnByZXBhcmVIZWFkZXIxNihIV0FWRUlOMTYgaFdhdmVJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FWRUhEUiAqIGxwV2F2ZUluSGRyLCBVSU5UMTYgdVNpemUpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAotCQkJCQkJaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlpZiAobHBXYXZlSW5IZHIgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCS8qVVNFUl9IRUFQX0ZSRUUoSElXT1JEKChEV09SRClscFdhdmVJbkhkci0+bHBEYXRhKSk7IEZJWE1FICovCi0JbHBXYXZlSW5IZHItPmxwRGF0YSA9IE5VTEw7Ci0JbHBXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7Ci0JcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsV0lETV9VTlBSRVBBUkUsbHBEZXNjLT5kd0luc3RhbmNlLCAKLQkJCSAgKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKKwkgIGhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICAvKlVTRVJfSEVBUF9GUkVFKEhJV09SRCgoRFdPUkQpbHBXYXZlSW5IZHItPmxwRGF0YSkpOyBGSVhNRSAqLworICAgIGxwV2F2ZUluSGRyLT5scERhdGEgPSBOVUxMOworICAgIGxwV2F2ZUluSGRyLT5scE5leHQgPSBOVUxMOworICAgIHJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fVU5QUkVQQVJFLGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJCSAgICAgIChEV09SRClscFdhdmVJbkhkciwgdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM1NjUsMTkgKzM2NTksMTkgQEAKIFVJTlQzMiBXSU5BUEkgd2F2ZUluQWRkQnVmZmVyMzIoSFdBVkVJTjMyIGhXYXZlSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVDMyIHVTaXplKQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCWlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JbHBXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7Ci0JbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JVFJBQ0UobW1zeXMsICJscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKLQkJbHBXYXZlSW5IZHItPmxwRGF0YSwgbHBXYXZlSW5IZHItPmR3QnVmZmVyTGVuZ3RoKTsKLQlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9BRERCVUZGRVIsIGxwRGVzYy0+ZHdJbnN0YW5jZSwKLQkJCQkJCQkJKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7Ci0JCisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgbHBXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7CisgICAgbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7CisgICAgVFJBQ0UobW1zeXMsICJscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKKwkgIGxwV2F2ZUluSGRyLT5scERhdGEsIGxwV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7CisgICAgcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fQUREQlVGRkVSLCBscERlc2MtPmR3SW5zdGFuY2UsCisJCSAgICAgIChEV09SRClscFdhdmVJbkhkciwgdVNpemUpOworICAgIAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM1ODYsMjIgKzM2ODAsMjIgQEAKIFVJTlQxNiBXSU5BUEkgd2F2ZUluQWRkQnVmZmVyMTYoSFdBVkVJTjE2IGhXYXZlSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVDE2IHVTaXplKQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlVSU5UMTYJCXJldDsKLQotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCWlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JbHBXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7Ci0JbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JbHBXYXZlSW5IZHItPmxwRGF0YSA9IFBUUl9TRUdfVE9fTElOKGxwV2F2ZUluSGRyLT5scERhdGEpOwotCVRSQUNFKG1tc3lzLCAibHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCi0JCWxwV2F2ZUluSGRyLT5scERhdGEsIGxwV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7Ci0JcmV0ID0gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9BRERCVUZGRVIsIGxwRGVzYy0+ZHdJbnN0YW5jZSwKLQkJCSAgKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7Ci0JLypscFdhdmVJbkhkci0+bHBEYXRhID0gc2F2ZWRkYXRhOyovCi0JcmV0dXJuIHJldDsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgVUlOVDE2CQlyZXQ7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKKyAgICBscFdhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKKyAgICBscFdhdmVJbkhkci0+bHBEYXRhID0gUFRSX1NFR19UT19MSU4obHBXYXZlSW5IZHItPmxwRGF0YSk7CisgICAgVFJBQ0UobW1zeXMsICJscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKKwkgIGxwV2F2ZUluSGRyLT5scERhdGEsIGxwV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7CisgICAgcmV0ID0gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9BRERCVUZGRVIsIGxwRGVzYy0+ZHdJbnN0YW5jZSwKKwkJICAgICAoRFdPUkQpbHBXYXZlSW5IZHIsIHVTaXplKTsKKyAgICAvKmxwV2F2ZUluSGRyLT5scERhdGEgPSBzYXZlZGRhdGE7Ki8KKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM2MDksNyArMzcwMyw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZUluU3RhcnQzMihIV0FWRUlOMzIgaFdhdmVJbikKIHsKLQlyZXR1cm4gd2F2ZUluU3RhcnQxNihoV2F2ZUluKTsKKyAgICByZXR1cm4gd2F2ZUluU3RhcnQxNihoV2F2ZUluKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNjE3LDEyICszNzExLDEyIEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgd2F2ZUluU3RhcnQxNihIV0FWRUlOMTYgaFdhdmVJbikKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0KLQlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVJbik7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7Ci0JaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsV0lETV9TVEFSVCxscERlc2MtPmR3SW5zdGFuY2UsMCwwKTsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlSW4pOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fU1RBUlQsbHBEZXNjLT5kd0luc3RhbmNlLDAsMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzYzMCw3ICszNzI0LDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSB3YXZlSW5TdG9wMzIoSFdBVkVJTjMyIGhXYXZlSW4pCiB7Ci0JcmV0dXJuIHdhdmVJblN0b3AxNihoV2F2ZUluKTsKKyAgICByZXR1cm4gd2F2ZUluU3RvcDE2KGhXYXZlSW4pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM2MzgsMTIgKzM3MzIsMTIgQEAKICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlSW5TdG9wMTYoSFdBVkVJTjE2IGhXYXZlSW4pCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlSW4pOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX1NUT1AsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlSW4pOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX1NUT1AsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNjUxLDcgKzM3NDUsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVJblJlc2V0MzIoSFdBVkVJTjMyIGhXYXZlSW4pCiB7Ci0JcmV0dXJuIHdhdmVJblJlc2V0MTYoaFdhdmVJbik7CisgICAgcmV0dXJuIHdhdmVJblJlc2V0MTYoaFdhdmVJbik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzY1OSwxMiArMzc1MywxMiBAQAogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVJblJlc2V0MTYoSFdBVkVJTjE2IGhXYXZlSW4pCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlSW4pOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fUkVTRVQsbHBEZXNjLT5kd0luc3RhbmNlLDAsMCk7CisgICAgTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworICAgIAorICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZUluKTsKKyAgICBscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICByZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXSURNX1JFU0VULGxwRGVzYy0+ZHdJbnN0YW5jZSwwLDApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM2NzMsMTEgKzM3NjcsMTEgQEAKIFVJTlQzMiBXSU5BUEkgd2F2ZUluR2V0UG9zaXRpb24zMihIV0FWRUlOMzIgaFdhdmVJbiwgTFBNTVRJTUUzMiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHVTaXplKQogewotCU1NVElNRTE2IG1tdDE2OwotCVVJTlQzMglyZXQgPSB3YXZlSW5HZXRQb3NpdGlvbjE2KGhXYXZlSW4sJm1tdDE2LHVTaXplKTsKLQotCU1NU1lTVEVNX01NVElNRTE2dG8zMihscFRpbWUsJm1tdDE2KTsKLQlyZXR1cm4gcmV0OworICAgIE1NVElNRTE2CW1tdDE2OworICAgIFVJTlQzMglyZXQgPSB3YXZlSW5HZXRQb3NpdGlvbjE2KGhXYXZlSW4sJm1tdDE2LHVTaXplKTsKKyAgICAKKyAgICBNTVNZU1RFTV9NTVRJTUUxNnRvMzIobHBUaW1lLCZtbXQxNik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNjg2LDEzICszNzgwLDEzIEBACiBVSU5UMTYgV0lOQVBJIHdhdmVJbkdldFBvc2l0aW9uMTYoSFdBVkVJTjE2IGhXYXZlSW4sTFBNTVRJTUUxNiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHVTaXplKQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQotCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFRpbWUsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9HRVRQT1MsIGxwRGVzYy0+ZHdJbnN0YW5jZSwKLQkJCSAgKERXT1JEKWxwVGltZSwgKERXT1JEKXVTaXplKTsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlSW4sIGxwVGltZSwgdVNpemUpOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIHJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX0dFVFBPUywgbHBEZXNjLT5kd0luc3RhbmNlLAorCQkgICAgICAoRFdPUkQpbHBUaW1lLCAoRFdPUkQpdVNpemUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM3MDAsMTQgKzM3OTQsMTQgQEAKICAqLwogVUlOVDMyIFdJTkFQSSB3YXZlSW5HZXRJRDMyKEhXQVZFSU4zMiBoV2F2ZUluLCBVSU5UMzIgKiBscHVEZXZpY2VJRCkKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0KLQlUUkFDRShtbXN5cywgIndhdmVJbkdldElEXG4iKTsKLQlpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCSpscHVEZXZpY2VJRCA9IGxwRGVzYy0+dURldmljZUlEOwotCXJldHVybiAwOworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICAKKyAgICBUUkFDRShtbXN5cywgIndhdmVJbkdldElEXG4iKTsKKyAgICBpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgICpscHVEZXZpY2VJRCA9IGxwRGVzYy0+dURldmljZUlEOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTM3MTYsMTQgKzM4MTAsMTQgQEAKICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlSW5HZXRJRDE2KEhXQVZFSU4xNiBoV2F2ZUluLCBVSU5UMTYgKiBscHVEZXZpY2VJRCkKIHsKLQlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0KLQlUUkFDRShtbXN5cywgIndhdmVJbkdldElEXG4iKTsKLQlpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCSpscHVEZXZpY2VJRCA9IGxwRGVzYy0+dURldmljZUlEOwotCXJldHVybiAwOworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICAKKyAgICBUUkFDRShtbXN5cywgIndhdmVJbkdldElEXG4iKTsKKyAgICBpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgIGxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworICAgIGlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworICAgICpscHVEZXZpY2VJRCA9IGxwRGVzYy0+dURldmljZUlEOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM3MzIsMzcgKzM4MjYsMzcgQEAKIERXT1JEIFdJTkFQSSB3YXZlSW5NZXNzYWdlMzIoSFdBVkVJTjMyIGhXYXZlSW4sIFVJTlQzMiB1TWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQotCUZJWE1FKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCksRklYTUUhXG4iLCAKLQkgICAgICBoV2F2ZUluLCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKLQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlzd2l0Y2ggKHVNZXNzYWdlKSB7Ci0JY2FzZSBXSURNX09QRU46Ci0JCUZJWE1FKG1tc3lzLCAiY2Fubm90IGhhbmRsZSBXSURNX09QRU4sIHBsZWFzZSByZXBvcnQuXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBXSURNX0dFVE5VTURFVlM6Ci0JY2FzZSBXSURNX0dFVFBPUzoKLQljYXNlIFdJRE1fQ0xPU0U6Ci0JY2FzZSBXSURNX1NUT1AgOgotCWNhc2UgV0lETV9SRVNFVDoKLQljYXNlIFdJRE1fU1RBUlQ6Ci0JY2FzZSBXSURNX1BSRVBBUkU6Ci0JY2FzZSBXSURNX1VOUFJFUEFSRToKLQljYXNlIFdJRE1fQUREQlVGRkVSOgotCWNhc2UgV0lETV9QQVVTRToKLQkJLyogbm8gYXJndW1lbnQgY29udmVyc2lvbiBuZWVkZWQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBXSURNX0dFVERFVkNBUFM6Ci0JCS8qRklYTUU6IEFOU0kvVU5JQ09ERSAqLwotCQlyZXR1cm4gd2F2ZUluR2V0RGV2Q2FwczMyQShoV2F2ZUluLChMUFdBVkVJTkNBUFMzMkEpZHdQYXJhbTEsZHdQYXJhbTIpOwotCWRlZmF1bHQ6Ci0JCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAotCQkgICAgaFdhdmVJbix1TWVzc2FnZSxkd1BhcmFtMSxkd1BhcmFtMik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBMUFdBVkVPUEVOREVTQwlscERlc2M7CisgICAgCisgICAgRklYTUUobW1zeXMsICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKSxGSVhNRSFcbiIsIAorCSAgaFdhdmVJbiwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CisgICAgaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisgICAgc3dpdGNoICh1TWVzc2FnZSkgeworICAgIGNhc2UgV0lETV9PUEVOOgorCUZJWE1FKG1tc3lzLCAiY2Fubm90IGhhbmRsZSBXSURNX09QRU4sIHBsZWFzZSByZXBvcnQuXG4iKTsKKwlicmVhazsKKyAgICBjYXNlIFdJRE1fR0VUTlVNREVWUzoKKyAgICBjYXNlIFdJRE1fR0VUUE9TOgorICAgIGNhc2UgV0lETV9DTE9TRToKKyAgICBjYXNlIFdJRE1fU1RPUCA6CisgICAgY2FzZSBXSURNX1JFU0VUOgorICAgIGNhc2UgV0lETV9TVEFSVDoKKyAgICBjYXNlIFdJRE1fUFJFUEFSRToKKyAgICBjYXNlIFdJRE1fVU5QUkVQQVJFOgorICAgIGNhc2UgV0lETV9BRERCVUZGRVI6CisgICAgY2FzZSBXSURNX1BBVVNFOgorCS8qIG5vIGFyZ3VtZW50IGNvbnZlcnNpb24gbmVlZGVkICovCisJYnJlYWs7CisgICAgY2FzZSBXSURNX0dFVERFVkNBUFM6CisJLypGSVhNRTogQU5TSS9VTklDT0RFICovCisJcmV0dXJuIHdhdmVJbkdldERldkNhcHMzMkEoaFdhdmVJbiwoTFBXQVZFSU5DQVBTMzJBKWR3UGFyYW0xLGR3UGFyYW0yKTsKKyAgICBkZWZhdWx0OgorCUVSUihtbXN5cywiKCUwNHgsJTA0eCwlMDhseCwlMDhseCk6IHVuaGFuZGxlZCBtZXNzYWdlXG4iLAorCSAgICBoV2F2ZUluLHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzc3MSw0MCArMzg2NSw0MCBAQAogRFdPUkQgV0lOQVBJIHdhdmVJbk1lc3NhZ2UxNihIV0FWRUlOMTYgaFdhdmVJbiwgVUlOVDE2IHVNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCi0JRklYTUUobW1zeXMsICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKSxGSVhNRSFcbiIsIAotCSAgICAgIGhXYXZlSW4sIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwotCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXN3aXRjaCAodU1lc3NhZ2UpIHsKLQljYXNlIFdJRE1fT1BFTjoKLQkJRklYTUUobW1zeXMsImNhbm5vdCBoYW5kbGUgV0lETV9PUEVOLCBwbGVhc2UgcmVwb3J0LlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgV0lETV9HRVROVU1ERVZTOgotCWNhc2UgV0lETV9DTE9TRToKLQljYXNlIFdJRE1fU1RPUCA6Ci0JY2FzZSBXSURNX1JFU0VUOgotCWNhc2UgV0lETV9TVEFSVDoKLQljYXNlIFdJRE1fUEFVU0U6Ci0JCS8qIG5vIGFyZ3VtZW50IGNvbnZlcnNpb24gbmVlZGVkICovCi0JCWJyZWFrOwotCWNhc2UgV0lETV9HRVRERVZDQVBTOgotCQlyZXR1cm4gd2F2ZUluR2V0RGV2Q2FwczE2KGhXYXZlSW4sKExQV0FWRUlOQ0FQUzE2KVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7Ci0JY2FzZSBXSURNX0dFVFBPUzoKLQkJcmV0dXJuIHdhdmVJbkdldFBvc2l0aW9uMTYoaFdhdmVJbiwoTFBNTVRJTUUxNilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwotCWNhc2UgV0lETV9QUkVQQVJFOgotCQlyZXR1cm4gd2F2ZUluUHJlcGFyZUhlYWRlcjE2KGhXYXZlSW4sKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOwotCWNhc2UgV0lETV9VTlBSRVBBUkU6Ci0JCXJldHVybiB3YXZlSW5VbnByZXBhcmVIZWFkZXIxNihoV2F2ZUluLChMUFdBVkVIRFIpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKLQljYXNlIFdJRE1fQUREQlVGRkVSOgotCQlyZXR1cm4gd2F2ZUluQWRkQnVmZmVyMTYoaFdhdmVJbiwoTFBXQVZFSERSKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSxkd1BhcmFtMik7Ci0JZGVmYXVsdDoKLQkJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCi0JCSAgICBoV2F2ZUluLHVNZXNzYWdlLGR3UGFyYW0xLGR3UGFyYW0yKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgIExQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKyAgICAKKyAgICBGSVhNRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpLEZJWE1FIVxuIiwgCisJICBoV2F2ZUluLCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKKyAgICBpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKyAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CisgICAgY2FzZSBXSURNX09QRU46CisJRklYTUUobW1zeXMsImNhbm5vdCBoYW5kbGUgV0lETV9PUEVOLCBwbGVhc2UgcmVwb3J0LlxuIik7CisJYnJlYWs7CisgICAgY2FzZSBXSURNX0dFVE5VTURFVlM6CisgICAgY2FzZSBXSURNX0NMT1NFOgorICAgIGNhc2UgV0lETV9TVE9QIDoKKyAgICBjYXNlIFdJRE1fUkVTRVQ6CisgICAgY2FzZSBXSURNX1NUQVJUOgorICAgIGNhc2UgV0lETV9QQVVTRToKKwkvKiBubyBhcmd1bWVudCBjb252ZXJzaW9uIG5lZWRlZCAqLworCWJyZWFrOworICAgIGNhc2UgV0lETV9HRVRERVZDQVBTOgorCXJldHVybiB3YXZlSW5HZXREZXZDYXBzMTYoaFdhdmVJbiwoTFBXQVZFSU5DQVBTMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKKyAgICBjYXNlIFdJRE1fR0VUUE9TOgorCXJldHVybiB3YXZlSW5HZXRQb3NpdGlvbjE2KGhXYXZlSW4sKExQTU1USU1FMTYpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpLGR3UGFyYW0yKTsKKyAgICBjYXNlIFdJRE1fUFJFUEFSRToKKwlyZXR1cm4gd2F2ZUluUHJlcGFyZUhlYWRlcjE2KGhXYXZlSW4sKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOworICAgIGNhc2UgV0lETV9VTlBSRVBBUkU6CisJcmV0dXJuIHdhdmVJblVucHJlcGFyZUhlYWRlcjE2KGhXYXZlSW4sKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOworICAgIGNhc2UgV0lETV9BRERCVUZGRVI6CisJcmV0dXJuIHdhdmVJbkFkZEJ1ZmZlcjE2KGhXYXZlSW4sKExQV0FWRUhEUilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMSksZHdQYXJhbTIpOworICAgIGRlZmF1bHQ6CisJRVJSKG1tc3lzLCIoJTA0eCwlMDR4LCUwOGx4LCUwOGx4KTogdW5oYW5kbGVkIG1lc3NhZ2VcbiIsCisJICAgIGhXYXZlSW4sdU1lc3NhZ2UsZHdQYXJhbTEsZHdQYXJhbTIpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODEyLDggKzM5MDYsOCBAQAogICovCiBIRFJWUjE2IFdJTkFQSSBEcnZPcGVuKExQU1RSIGxwRHJpdmVyTmFtZSwgTFBTVFIgbHBTZWN0aW9uTmFtZSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlUUkFDRShtbXN5cywiKCclcycsJyVzJywlMDhsWCk7XG4iLGxwRHJpdmVyTmFtZSxscFNlY3Rpb25OYW1lLGxQYXJhbSk7Ci0JcmV0dXJuIE9wZW5Ecml2ZXIxNihscERyaXZlck5hbWUsIGxwU2VjdGlvbk5hbWUsIGxQYXJhbSk7CisgICAgVFJBQ0UobW1zeXMsIignJXMnLCclcycsJTA4bFgpO1xuIixscERyaXZlck5hbWUsbHBTZWN0aW9uTmFtZSxsUGFyYW0pOworICAgIHJldHVybiBPcGVuRHJpdmVyMTYobHBEcml2ZXJOYW1lLCBscFNlY3Rpb25OYW1lLCBsUGFyYW0pOwogfQogCiAKQEAgLTM4MjIsOCArMzkxNiw4IEBACiAgKi8KIExSRVNVTFQgV0lOQVBJIERydkNsb3NlKEhEUlZSMTYgaERydnIsIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikKIHsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwgaERydnIsIGxQYXJhbTEsIGxQYXJhbTIpOwotCXJldHVybiBDbG9zZURyaXZlcjE2KGhEcnZyLCBsUGFyYW0xLCBsUGFyYW0yKTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwgaERydnIsIGxQYXJhbTEsIGxQYXJhbTIpOworICAgIHJldHVybiBDbG9zZURyaXZlcjE2KGhEcnZyLCBsUGFyYW0xLCBsUGFyYW0yKTsKIH0KIAogCkBAIC0zODMzLDExICszOTI3LDExIEBACiBMUkVTVUxUIFdJTkFQSSBEcnZTZW5kTWVzc2FnZShIRFJWUjE2IGhEcml2ZXIsIFdPUkQgbXNnLCBMUEFSQU0gbFBhcmFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKQogewotCURXT1JEIAlkd0RyaXZlcklEID0gMDsKLQlGSVhNRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwKLQkJCQkJaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKLQkvKiBGSVhNRTogd3JvbmcgLi4uICovCi0JcmV0dXJuIENEQVVESU9fRHJpdmVyUHJvYyhkd0RyaXZlcklELCBoRHJpdmVyLCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOworICAgIERXT1JEIAlkd0RyaXZlcklEID0gMDsKKyAgICBGSVhNRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwKKwkgIGhEcml2ZXIsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CisgICAgLyogRklYTUU6IHdyb25nIC4uLiAqLworICAgIHJldHVybiBDREFVRElPX0RyaXZlclByb2MoZHdEcml2ZXJJRCwgaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODQ1LDcgKzM5MzksNyBAQAogICovCiBIQU5ETEUxNiBXSU5BUEkgRHJ2R2V0TW9kdWxlSGFuZGxlMTYoSERSVlIxNiBoRHJ2cikKIHsKLSAgICAgICAgcmV0dXJuIEdldERyaXZlck1vZHVsZUhhbmRsZTE2KGhEcnZyKTsKKyAgICByZXR1cm4gR2V0RHJpdmVyTW9kdWxlSGFuZGxlMTYoaERydnIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM4NTQsMzIgKzM5NDgsMzIgQEAKIExSRVNVTFQgV0lOQVBJIERydkRlZkRyaXZlclByb2MoRFdPUkQgZHdEcml2ZXJJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RHJpdmVySUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgIHJldHVybiBEZWZEcml2ZXJQcm9jKGR3RHJpdmVySUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltbVRocmVhZENyZWF0ZQkJW01NU1lTVEVNLjExMjBdCiAgKi8KIExSRVNVTFQgV0lOQVBJIG1tVGhyZWFkQ3JlYXRlMTYoTFBWT0lEIHgxLCBMUFdPUkQgeDIsIERXT1JEIHgzLCBEV09SRCB4NCkgewotCUZJWE1FKG1tc3lzLCIoJXAsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIix4MSx4Mix4Myx4NCk7Ci0JKngyID0gMHhiYWJlOwotCXJldHVybiAwOworICAgIEZJWE1FKG1tc3lzLCIoJXAsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIix4MSx4Mix4Myx4NCk7CisgICAgKngyID0gMHhiYWJlOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltbVRocmVhZEdldFRhc2sJCVtNTVNZU1RFTS4xMTI1XQogICovCiBMUkVTVUxUIFdJTkFQSSBtbVRocmVhZEdldFRhc2sxNihXT1JEIGhuZCkgewotCUZJWE1FKG1tc3lzLCIoJTA0eCk6IHN0dWIhXG4iLGhuZCk7Ci0JcmV0dXJuIEdldEN1cnJlbnRUYXNrKCk7CisgICAgRklYTUUobW1zeXMsIiglMDR4KTogc3R1YiFcbiIsaG5kKTsKKyAgICByZXR1cm4gR2V0Q3VycmVudFRhc2soKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbW1UaHJlYWRTaWduYWwJCVtNTVNZU1RFTS4xMTIxXQogICovCiBMUkVTVUxUIFdJTkFQSSBtbVRocmVhZFNpZ25hbDE2KFdPUkQgaG5kKSB7Ci0JRklYTUUobW1zeXMsIiglMDR4KTogc3R1YiFcbiIsaG5kKTsKLQlyZXR1cm4gMDsKKyAgICBGSVhNRShtbXN5cywiKCUwNHgpOiBzdHViIVxuIixobmQpOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM4OTIsMjQgKzM5ODYsMjQgQEAKICAgICBXT1JEIHNlbDEsIHNlbDI7CiAgICAgTE9BRFBBUkFNUyAqbHA7CiAgICAgSElOU1RBTkNFMTYgcmV0LCBoYW5kbGU7Ci0KKyAgICAKICAgICBUUkFDRShtbXN5cywiKCVwLCVwLCUwOGx4KTtcbiIsbHBobmQsaE1tVGFzayx4Mik7CiAgICAgY21kbGluZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMHgwZCk7CiAgICAgY21kbGluZVswXSA9IDB4MGQ7CiAgICAgKERXT1JEKWNtZGxpbmVbMV0gPSAoRFdPUkQpbHBobmQ7CiAgICAgKERXT1JEKWNtZGxpbmVbNV0gPSB4MjsKICAgICAoRFdPUkQpY21kbGluZVs5XSA9IDA7Ci0KKyAgICAKICAgICBzZWwxID0gU0VMRUNUT1JfQWxsb2NCbG9jayhjbWRsaW5lLCAweDBkLCBTRUdNRU5UX0RBVEEsIEZBTFNFLCBGQUxTRSk7CiAgICAgc2VsMiA9IFNFTEVDVE9SX0FsbG9jQmxvY2soJnNob3dDbWQsIHNpemVvZihzaG93Q21kKSwKLQkJU0VHTUVOVF9EQVRBLCBGQUxTRSwgRkFMU0UpOwotCisJCQkgICAgICAgU0VHTUVOVF9EQVRBLCBGQUxTRSwgRkFMU0UpOworICAgIAogICAgIGxwID0gKExPQURQQVJBTVMgKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKExPQURQQVJBTVMpKTsKICAgICBscC0+aEVudmlyb25tZW50ID0gMDsKICAgICBscC0+Y21kTGluZSA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzZWwxLCAwKTsKICAgICBscC0+c2hvd0NtZCA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzZWwyLCAwKTsKICAgICBscC0+cmVzZXJ2ZWQgPSAwOwotCisgICAgCiAgICAgcmV0ID0gTG9hZE1vZHVsZTE2KCJjOlxcd2luZG93c1xcbW10YXNrLnRzayIsIGxwKTsKICAgICBpZiAocmV0IDwgMzIpIHsKIAlpZiAocmV0KQpAQCAtMzkyNCwyOSArNDAxOCwzMSBAQAogICAgIH0KICAgICBpZiAoaE1tVGFzaykKIAkqKEhJTlNUQU5DRTE2ICopUFRSX1NFR19UT19MSU4oaE1tVGFzaykgPSBoYW5kbGU7Ci0KKyAgICAKICAgICBVbk1hcExTKFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzZWwyLCAwKSk7CiAgICAgVW5NYXBMUyhQVFJfU0VHX09GRl9UT19TRUdQVFIoc2VsMSwgMCkpOwotCisgICAgCiAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHApOwogICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNtZGxpbmUpOwotCisgICAgCiAgICAgcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbW1UYXNrU2lnbmFsCQlbTU1TWVNURU0uOTAzXQogICovCi1MUkVTVUxUIFdJTkFQSSBtbVRhc2tTaWduYWwxNihIVEFTSzE2IGh0KSB7Ci0JVFJBQ0UobW1zeXMsIiglMDR4KTtcbiIsaHQpOwotCXJldHVybiBQb3N0QXBwTWVzc2FnZTE2KGh0LFdNX1VTRVIsMCwwKTsKK0xSRVNVTFQgV0lOQVBJIG1tVGFza1NpZ25hbDE2KEhUQVNLMTYgaHQpIAoreworICAgIFRSQUNFKG1tc3lzLCIoJTA0eCk7XG4iLGh0KTsKKyAgICByZXR1cm4gUG9zdEFwcE1lc3NhZ2UxNihodCxXTV9VU0VSLDAsMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1jaURyaXZlcllpZWxkCQlbTU1TWVNURU0uNzEwXQogICovCi1MUkVTVUxUIFdJTkFQSSBtY2lEcml2ZXJZaWVsZDE2KEhBTkRMRTE2IGhuZCkgewotCUZJWE1FKG1tc3lzLCIoJTA0eCk6IHN0dWIhXG4iLGhuZCk7Ci0JcmV0dXJuIDA7CitMUkVTVUxUIFdJTkFQSSBtY2lEcml2ZXJZaWVsZDE2KEhBTkRMRTE2IGhuZCkgCit7CisgICAgRklYTUUobW1zeXMsIiglMDR4KTogc3R1YiFcbiIsaG5kKTsKKyAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tc3ZpZGVvLmMgYi9tdWx0aW1lZGlhL21zdmlkZW8uYwppbmRleCAzODdmODViLi5iYmQyZWEwIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21zdmlkZW8uYworKysgYi9tdWx0aW1lZGlhL21zdmlkZW8uYwpAQCAtMSwyMSArMSwxNTMgQEAKLS8qCi0gKiBNU1ZJREVPIHByb2NlZHVyZXMKLSAqCi0gKiBDb3B5cmlnaHQgMTk5OCBMdWl6IE90YXZpbyBMLiBab3J6ZWxsYQorLyoJCQkJICAgCisgKiBDb3B5cmlnaHQgMTk5OCBNYXJjdXMgTWVpc3NuZXIKICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZHJpdmVyLmgiCisjaW5jbHVkZSAibW1zeXN0ZW0uaCIKKyNpbmNsdWRlICJvbGUyLmgiCisjaW5jbHVkZSAidmZ3LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbiAgICAgW01TVklERU8uMl0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgkJW01TVkZXMzIuMl1bTVNWSURFTy4yXQorICogUmV0dXJucyB0aGUgdmVyc2lvbiBpbiBtYWpvci5taW5vciBmb3JtLgorICogSW4gV2luZG93czk1IHRoaXMgcmV0dXJucyAweDA0MDAwM2I2ICg0Ljk1MCkKICAqLwotRFdPUkQgV0lOQVBJIFZpZGVvRm9yV2luZG93c1ZlcnNpb24gKCkKLXsKK0RXT1JEIFdJTkFQSQorVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbih2b2lkKSB7CisJcmV0dXJuIDB4MDQwMDAzQjY7IC8qIDQuOTUwICovCit9CiAKLSAgRklYTUUgKG1zdmlkZW8sICIodm9pZCk6IHN0dWJcbiIpOworLyogc3lzdGVtLmluaTogW2RyaXZlcnMzMl0gKi8KIAotICAvKiBXaGF0IHNob3VsZCBiZSByZXR1cm5lZD8gKi8KLSAgcmV0dXJuIDE7Ci0gIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJSUNJbmZvCQkJCVtNU1ZGVzMyLjMzXQorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGluc3RhbGxhYmxlIGNvbXByZXNzb3IuIFJldHVybiBUUlVFIGlmIHRoZXJlCisgKiBpcyBvbmUuCisgKi8KK0JPT0wzMiBXSU5BUEkKK0lDSW5mbzMyKAorCURXT1JEIGZjY1R5cGUsCQkvKiBbaW5dIHR5cGUgb2YgY29tcHJlc3NvciAoJ3ZpZGMnKSAqLworCURXT1JEIGZjY0hhbmRsZXIsCS8qIFtpbl0gPG4+dGggY29tcHJlc3NvciAqLworCUlDSU5GTzMyICpscGljaW5mbwkvKiBbb3V0XSBpbmZvcm1hdGlvbiBhYm91dCBjb21wcmVzc29yICovCispIHsKKwljaGFyCXR5cGVbNV0sYnVmWzIwMDBdOworCisJbWVtY3B5KHR5cGUsJmZjY1R5cGUsNCk7dHlwZVs0XT0wOworCVRSQUNFKG1tc3lzLCIoJXMsJWxkLCVwKS5cbiIsdHlwZSxmY2NIYW5kbGVyLGxwaWNpbmZvKTsKKwkvKiBkb2VzIE9wZW5Ecml2ZXIvQ2xvc2VEcml2ZXIgKi8KKwlscGljaW5mby0+ZHdTaXplID0gc2l6ZW9mKElDSU5GTzMyKTsKKwlscGljaW5mby0+ZmNjVHlwZSA9IGZjY1R5cGU7CisJbHBpY2luZm8tPmR3RmxhZ3MgPSAwOworCWlmIChHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQSgiZHJpdmVyczMyIixOVUxMLE5VTEwsYnVmLDIwMDAsInN5c3RlbS5pbmkiKSkgeworCQljaGFyICpzID0gYnVmOworCQl3aGlsZSAoKnMpIHsKKwkJCWlmICghbHN0cm5jbXBpMzJBKHR5cGUscyw0KSkgeworCQkJCWlmKCFmY2NIYW5kbGVyLS0pIHsKKwkJCQkJbHBpY2luZm8tPmZjY0hhbmRsZXIgPSBtbWlvU3RyaW5nVG9GT1VSQ0MzMkEocys1LDApOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQl9CisJCQlzPXMrbHN0cmxlbjMyQShzKSsxOyAvKiBlaXRoZXIgbmV4dCBjaGFyIG9yIFwwICovCisJCX0KKwl9CisJcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJQ09wZW4JCQkJW01TVkZXMzIuMzddCisgKiBPcGVucyBhbiBpbnN0YWxsYWJsZSBjb21wcmVzc29yLiBSZXR1cm4gc3BlY2lhbCBoYW5kbGUuCisgKi8KK0hJQzMyIFdJTkFQSQorSUNPcGVuMzIoRFdPUkQgZmNjVHlwZSxEV09SRCBmY2NIYW5kbGVyLFVJTlQzMiB3TW9kZSkgeworCWNoYXIJCXR5cGVbNV0saGFuZGxlcls1XSxjb2RlY25hbWVbMjBdOworCUlDT1BFTgkJaWNvcGVuOworCUhEUlZSMzIJCWhkcnY7CisJV0lORV9ISUMJKndoaWM7CisKKwltZW1jcHkodHlwZSwmZmNjVHlwZSw0KTt0eXBlWzRdPTA7CisJbWVtY3B5KGhhbmRsZXIsJmZjY0hhbmRsZXIsNCk7aGFuZGxlcls0XT0wOworCVRSQUNFKG1tc3lzLCIoJXMsJXMsMHglMDhseClcbiIsdHlwZSxoYW5kbGVyLChEV09SRCl3TW9kZSk7CisJc3ByaW50Zihjb2RlY25hbWUsIiVzLiVzIix0eXBlLGhhbmRsZXIpOworCWhkcnY9T3BlbkRyaXZlcjMyQShjb2RlY25hbWUsImRyaXZlcnMzMiIsMCk7CisJaWYgKCFoZHJ2KQorCQlyZXR1cm4gMDsKKwl3aGljID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoV0lORV9ISUMpKTsKKwl3aGljLT5oZHJ2CT0gaGRydjsKKwl3aGljLT5kcml2ZXJwcm9jPSBHZXRQcm9jQWRkcmVzczMyKEdldERyaXZlck1vZHVsZUhhbmRsZTMyKGhkcnYpLCJEcml2ZXJQcm9jIik7CisJLyogV2VsbCwgbFBhcmFtMiBpcyBpbiBmYWN0IGEgTFBWSURFT19PUEVOX1BBUk1TLCBidXQgaXQgaGFzIHRoZSAKKwkgKiBzYW1lIGxheW91dCBhcyBJQ09QRU4KKwkgKi8KKwlpY29wZW4uZmNjVHlwZQkJPSBmY2NUeXBlOworCWljb3Blbi5mY2NIYW5kbGVyCT0gZmNjSGFuZGxlcjsKKwlpY29wZW4uZHdTaXplCQk9IHNpemVvZihJQ09QRU4pOworCS8qIEZJWE1FOiBmaWxsIG91dCByZXN0IHRvby4uLiAqLworCXdoaWMtPnByaXZhdGUJPSB3aGljLT5kcml2ZXJwcm9jKDAsaGRydixEUlZfT1BFTiwwLCZpY29wZW4pOworCXJldHVybiAoSElDMzIpd2hpYzsKK30KKworTFJFU1VMVCBXSU5BUEkKK0lDR2V0SW5mbzMyKEhJQzMyIGhpYyxJQ0lORk8zMiAqcGljaW5mbyxEV09SRCBjYikgeworCUxSRVNVTFQJCXJldDsKKwlXSU5FX0hJQwkqd2hpYyA9IChXSU5FX0hJQyopaGljOworCisJVFJBQ0UobW1zeXMsIigweCUwOGx4LCVwLCVsZClcbiIsKERXT1JEKWhpYyxwaWNpbmZvLGNiKTsKKwlyZXQgPSBJQ1NlbmRNZXNzYWdlMzIod2hpYyxJQ01fR0VUSU5GTywoRFdPUkQpcGljaW5mbyxjYik7CisJVFJBQ0UobW1zeXMsIgktPiAweCUwOGx4XG4iLHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCitISUMzMiBXSU5BUEkKK0lDTG9jYXRlKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIExQQklUTUFQSU5GT0hFQURFUiBscGJpSW4sCisJIExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0LCBXT1JEIHdGbGFncworKSB7CisJRklYTUUobW1zeXMsInN0dWIhXG4iKTsKKwlyZXR1cm4gMDsKK30KKworTFJFU1VMVCBWRldBUEkKK0lDU2VuZE1lc3NhZ2UzMihISUMzMiBoaWMsVUlOVDMyIG1zZyxEV09SRCBsUGFyYW0xLERXT1JEIGxQYXJhbTIpIHsKKwlMUkVTVUxUCQlyZXQ7CisJV0lORV9ISUMJKndoaWMgPSAoV0lORV9ISUMqKWhpYzsKKworCXN3aXRjaCAobXNnKSB7CisJY2FzZSBJQ01fR0VUSU5GTzoKKwkJRklYTUUobW1zeXMsIigweCUwOGx4LElDTV9HRVRJTkZPLDB4JTA4bHgsMHglMDhseClcbiIsKERXT1JEKWhpYyxsUGFyYW0xLGxQYXJhbTIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlGSVhNRShtbXN5cywiKDB4JTA4bHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpXG4iLChEV09SRCloaWMsKERXT1JEKW1zZyxsUGFyYW0xLGxQYXJhbTIpOworCX0KKwlyZXQgPSB3aGljLT5kcml2ZXJwcm9jKHdoaWMtPnByaXZhdGUsd2hpYy0+aGRydixtc2csbFBhcmFtMSxsUGFyYW0yKTsKKwlGSVhNRShtbXN5cywiCS0+IDB4JTA4bHhcbiIscmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKK0RXT1JECVZGV0FQSVYJSUNEcmF3QmVnaW4zMigKKyAgICAgICAgSElDMzIJCQloaWMsCisgICAgICAgIERXT1JECQkJZHdGbGFncywvKiBmbGFncyAqLworICAgICAgICBIUEFMRVRURTMyCQlocGFsLAkvKiBwYWxldHRlIHRvIGRyYXcgd2l0aCAqLworICAgICAgICBIV05EMzIJCQlod25kLAkvKiB3aW5kb3cgdG8gZHJhdyB0byAqLworICAgICAgICBIREMzMgkJCWhkYywJLyogSERDIHRvIGRyYXcgdG8gKi8KKyAgICAgICAgSU5UMzIJCQl4RHN0LAkvKiBkZXN0aW5hdGlvbiByZWN0YW5nbGUgKi8KKyAgICAgICAgSU5UMzIJCQl5RHN0LAorICAgICAgICBJTlQzMgkJCWR4RHN0LAorICAgICAgICBJTlQzMgkJCWR5RHN0LAorICAgICAgICBMUEJJVE1BUElORk9IRUFERVIJbHBiaSwJLyogZm9ybWF0IG9mIGZyYW1lIHRvIGRyYXcgKi8KKyAgICAgICAgSU5UMzIJCQl4U3JjLAkvKiBzb3VyY2UgcmVjdGFuZ2xlICovCisgICAgICAgIElOVDMyCQkJeVNyYywKKyAgICAgICAgSU5UMzIJCQlkeFNyYywKKyAgICAgICAgSU5UMzIJCQlkeVNyYywKKyAgICAgICAgRFdPUkQJCQlkd1JhdGUsCS8qIGZyYW1lcy9zZWNvbmQgPSAoZHdSYXRlL2R3U2NhbGUpICovCisgICAgICAgIERXT1JECQkJZHdTY2FsZSkgeworCQlyZXR1cm4gMDsKK30KKworSEFORExFMzIgLyogSERSQVdESUIgKi8gV0lOQVBJCitEcmF3RGliT3BlbjMyKCkgeworCUZJWE1FKG1tc3lzLCJzdHViIVxuIik7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL3RpbWUuYyBiL211bHRpbWVkaWEvdGltZS5jCmluZGV4IDc0MjY2MDUuLmI0YjZlYjAgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvdGltZS5jCisrKyBiL211bHRpbWVkaWEvdGltZS5jCkBAIC0xLDMgKzEsNSBAQAorLyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCisKIC8qCiAgKiBNTVNZVEVNIHRpbWUgZnVuY3Rpb25zCiAgKgpAQCAtNiw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAibGR0LmgiCkBAIC0xNiwzMyArMTksMzQgQEAKICNpbmNsdWRlICJtbXN5c3RlbS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKIAotc3RhdGljIEJPT0wzMiBtbVRpbWVTdGFydGVkID0gRkFMU0U7CisjZGVmaW5lIFVTRV9GQUtFX01NX1RJTUVSUworCiBzdGF0aWMgTU1USU1FMTYgbW1TeXNUaW1lTVM7CiBzdGF0aWMgTU1USU1FMTYgbW1TeXNUaW1lU01QVEU7CiAKLS8qIHRoaXMgaXMgdXNlZCB0byBhdm9pZCBpbmZpbml0ZSBsb29wIGluIHRpbWVHZXRUaW1lLCBiZWNhdXNlCi0gICBvZiB0aGUgZmFrZWQgbXVsdGltZWRpYSB0aW1lcnMsIGFuZCB3aWxsIGRlc2FwcGVhciBhcyBzb29uIGFzCi0gICB0aGUgdGltZXJzIGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkuCi0gKi8KLXN0YXRpYyBpbnQgdGltZV9jYWxsZWQ9MDsKLQogdHlwZWRlZiBzdHJ1Y3QgdGFnVElNRVJFTlRSWSB7Ci0gICAgVUlOVDMyCXdEZWxheTsKLSAgICBVSU5UMzIJd1Jlc29sOwotICAgIEZBUlBST0MxNiBscEZ1bmM7Ci0gICAgSElOU1RBTkNFMzIJaEluc3RhbmNlOwotICAgIERXT1JECWR3VXNlcjsKLSAgICBVSU5UMzIJd0ZsYWdzOwotICAgIFVJTlQzMgl3VGltZXJJRDsKLSAgICBVSU5UMzIJd0N1clRpbWU7Ci0gICAgVUlOVDMyCWlzd2luMzI7Ci0gICAgc3RydWN0IHRhZ1RJTUVSRU5UUlkgKk5leHQ7Ci0gICAgRFdPUkQJdHJpZ2dlcnRpbWU7CisgICAgVUlOVDMyCQkJd0RlbGF5OworICAgIFVJTlQzMgkJCXdSZXNvbDsKKyAgICBGQVJQUk9DMTYgCQkJbHBGdW5jOworICAgIEhJTlNUQU5DRTMyCQkJaEluc3RhbmNlOworICAgIERXT1JECQkJZHdVc2VyOworICAgIFVJTlQzMgkJCXdGbGFnczsKKyAgICBVSU5UMzIJCQl3VGltZXJJRDsKKyAgICBVSU5UMzIJCQl3Q3VyVGltZTsKKyAgICBVSU5UMzIJCQlpc1dpbjMyOworICAgIHN0cnVjdCB0YWdUSU1FUkVOVFJZKglOZXh0OwogfSBUSU1FUkVOVFJZLCAqTFBUSU1FUkVOVFJZOwogCiBzdGF0aWMgTFBUSU1FUkVOVFJZIGxwVGltZXJMaXN0ID0gTlVMTDsKIAorI2lmZGVmIFVTRV9GQUtFX01NX1RJTUVSUworc3RhdGljIERXT1JEIGR3TGFzdENCVGljayA9IDA7CitzdGF0aWMgQk9PTDMyIGJVc2VGYWtlVGltZXJzID0gRkFMU0U7CitzdGF0aWMgV09SRCB3SW5DYWxsQmFja0xvb3AgPSAwOworI2VuZGlmCisKIC8qCiAgKiBGSVhNRQogICogV2UncmUgdXNpbmcgIjEiIGFzIHRoZSBtaW5pbnVtIHJlc29sdXRpb24gdG8gdGhlIHRpbWVyLApAQCAtNTIsNDYgKzU2LDM0IEBACiAjZGVmaW5lIE1NU1lTVElNRV9NSU5JTlRFUlZBTCAoMSkKICNkZWZpbmUgTU1TWVNUSU1FX01BWElOVEVSVkFMICg2NTUzNSkKIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBjaGVja19NTXRpbWVycwotICovCi1zdGF0aWMgVk9JRCBjaGVja19NTXRpbWVycygpCitzdGF0aWMJdm9pZAlUSU1FX1RyaWdnZXJDYWxsQmFjayhMUFRJTUVSRU5UUlkgbHBUaW1lciwgRFdPUkQgZHdDdXJyZW50KQogewotICAgIExQVElNRVJFTlRSWSBscFRpbWVyID0gbHBUaW1lckxpc3Q7Ci0gICAgRFdPUkQJY3VydGljayA9IEdldFRpY2tDb3VudCgpOwotCi0gICAgd2hpbGUgKGxwVGltZXIgIT0gTlVMTCkgewotICAgIAlpZiAobHBUaW1lci0+dHJpZ2dlcnRpbWUgPD0gY3VydGljaykgewotCSAgICBscFRpbWVyLT53Q3VyVGltZSA9IGxwVGltZXItPndEZWxheTsKLQotCSAgICBpZiAobHBUaW1lci0+bHBGdW5jICE9IChGQVJQUk9DMTYpIE5VTEwpIHsKLQkJVFJBQ0UobW10aW1lLCAiYmVmb3JlIENhbGxCYWNrMTYgIVxuIik7Ci0JCVRSQUNFKG1tdGltZSwgImxwRnVuYz0lcCB3VGltZXJJRD0lMDRYIGR3VXNlcj0lMDhsWCAhXG4iLAotCQkJbHBUaW1lci0+bHBGdW5jLCBscFRpbWVyLT53VGltZXJJRCwgbHBUaW1lci0+ZHdVc2VyKTsKLQkJVFJBQ0UobW10aW1lLCAiaEluc3RhbmNlPSUwNFggIVxuIiwgbHBUaW1lci0+aEluc3RhbmNlKTsKLQotCi0vKiAgICAgICAgLSBUaW1lUHJvYyBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBoZXJlIGlzIHNvbWV0aGluZyBzdHJhbmdlLCB1bmRlciBXaW5kb3dzIDMuMXggaXQgaXMgY2FsbGVkIAotICogICAgICAgICAgZHVyaW5nIGludGVycnVwdCB0aW1lLCAgaXMgYWxsb3dlZCB0byBleGVjdXRlIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgQVBJIGNhbGxzIChsaWtlCi0gKgkgICAgUG9zdE1lc3NhZ2UpLCBhbmQgbXVzdCByZXNpZGUgaW4gRExMICh0aGVyZWZvcmUgdXNlcyBzdGFjayBvZiBhY3RpdmUgYXBwbGljYXRpb24pLiBTbyBJIAotICogICAgICAgICAgZ3Vlc3MgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB2aWEgU2V0VGltZXIgaGFzIHRvIGJlIGltcHJvdmVkIHVwb24uCQkKLSAqLwotIAkJaWYgKGxwVGltZXItPmlzd2luMzIpCi0JCQlscFRpbWVyLT5scEZ1bmMobHBUaW1lci0+d1RpbWVySUQsMCxscFRpbWVyLT5kd1VzZXIsMCwwKTsKLQkJZWxzZQotCQkJQ2FsbGJhY2tzLT5DYWxsVGltZUZ1bmNQcm9jKGxwVGltZXItPmxwRnVuYywKLQkJCQkJCSAgICBscFRpbWVyLT53VGltZXJJRCwwLAotCQkJCQkJICAgIGxwVGltZXItPmR3VXNlciwwLDAKLQkJCSk7Ci0KLQkJVFJBQ0UobW10aW1lLCAiYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKLQkgICAgfQotCSAgICBpZiAobHBUaW1lci0+d0ZsYWdzICYgVElNRV9PTkVTSE9UKQotCQl0aW1lS2lsbEV2ZW50MzIobHBUaW1lci0+d1RpbWVySUQpOwotCX0KLQlscFRpbWVyID0gbHBUaW1lci0+TmV4dDsKKyAgICBscFRpbWVyLT53Q3VyVGltZSA9IGxwVGltZXItPndEZWxheTsKKyAgICAKKyAgICBpZiAobHBUaW1lci0+bHBGdW5jICE9IChGQVJQUk9DMTYpIE5VTEwpIHsKKwlUUkFDRShtbXRpbWUsICJiZWZvcmUgQ2FsbEJhY2sxNiAoJWx1KSFcbiIsIGR3Q3VycmVudCk7CisJVFJBQ0UobW10aW1lLCAibHBGdW5jPSVwIHdUaW1lcklEPSUwNFggZHdVc2VyPSUwOGxYICFcbiIsCisJICAgICAgbHBUaW1lci0+bHBGdW5jLCBscFRpbWVyLT53VGltZXJJRCwgbHBUaW1lci0+ZHdVc2VyKTsKKwlUUkFDRShtbXRpbWUsICJoSW5zdGFuY2U9JTA0WCAhXG4iLCBscFRpbWVyLT5oSW5zdGFuY2UpOworCQorCQorCS8qIC0gVGltZVByb2MgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaGVyZSBpcyBzb21ldGhpbmcgc3RyYW5nZSwgdW5kZXIgV2luZG93cyAzLjF4IGl0IGlzIGNhbGxlZCAKKwkgKiAJCWR1cmluZyBpbnRlcnJ1cHQgdGltZSwgIGlzIGFsbG93ZWQgdG8gZXhlY3V0ZSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mIEFQSSBjYWxscyAobGlrZQorCSAqCSAgICAJUG9zdE1lc3NhZ2UpLCBhbmQgbXVzdCByZXNpZGUgaW4gRExMICh0aGVyZWZvcmUgdXNlcyBzdGFjayBvZiBhY3RpdmUgYXBwbGljYXRpb24pLiBTbyBJIAorCSAqICAgICAgIGd1ZXNzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdmlhIFNldFRpbWVyIGhhcyB0byBiZSBpbXByb3ZlZCB1cG9uLgkJCisJICovCisJaWYgKGxwVGltZXItPmlzV2luMzIpCisJICAgIGxwVGltZXItPmxwRnVuYyhscFRpbWVyLT53VGltZXJJRCwwLGxwVGltZXItPmR3VXNlciwwLDApOworCWVsc2UKKwkgICAgQ2FsbGJhY2tzLT5DYWxsVGltZUZ1bmNQcm9jKGxwVGltZXItPmxwRnVuYywKKwkJCQkJbHBUaW1lci0+d1RpbWVySUQsMCwKKwkJCQkJbHBUaW1lci0+ZHdVc2VyLDAsMCk7CisJCisJVFJBQ0UobW10aW1lLCAiYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKICAgICB9CisgICAgaWYgKGxwVGltZXItPndGbGFncyAmIFRJTUVfT05FU0hPVCkKKwl0aW1lS2lsbEV2ZW50MzIobHBUaW1lci0+d1RpbWVySUQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwMCw0OSArOTIsMjcgQEAKIHN0YXRpYyBWT0lEIFRJTUVfTU1TeXNUaW1lQ2FsbGJhY2soIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGlkLCBEV09SRCBkd1RpbWUgKQogewotICAgIExQVElNRVJFTlRSWSBscFRpbWVyID0gbHBUaW1lckxpc3Q7CisgICAgTFBUSU1FUkVOVFJZIGxwVGltZXI7CisgICAgCiAgICAgbW1TeXNUaW1lTVMudS5tcyArPSBNTVNZU1RJTUVfTUlOSU5URVJWQUw7CiAgICAgbW1TeXNUaW1lU01QVEUudS5zbXB0ZS5mcmFtZSsrOwotICAgIHdoaWxlIChscFRpbWVyICE9IE5VTEwpIHsKLQlscFRpbWVyLT53Q3VyVGltZS0tOwotCWlmIChscFRpbWVyLT53Q3VyVGltZSA9PSAwKSB7Ci0JICAgIGxwVGltZXItPndDdXJUaW1lID0gbHBUaW1lci0+d0RlbGF5OworICAgIAorI2lmZGVmIFVTRV9GQUtFX01NX1RJTUVSUworICAgIGlmIChiVXNlRmFrZVRpbWVycykKKwlkd0xhc3RDQlRpY2sgPSBHZXRUaWNrQ291bnQoKTsKIAotCSAgICBpZiAobHBUaW1lci0+bHBGdW5jICE9IChGQVJQUk9DMTYpIE5VTEwpIHsKLQkJVFJBQ0UobW10aW1lLCAiYmVmb3JlIENhbGxCYWNrMTYgIVxuIik7Ci0JCVRSQUNFKG1tdGltZSwgImxwRnVuYz0lcCB3VGltZXJJRD0lMDRYIGR3VXNlcj0lMDhsWCAhXG4iLAotCQkJbHBUaW1lci0+bHBGdW5jLCBscFRpbWVyLT53VGltZXJJRCwgbHBUaW1lci0+ZHdVc2VyKTsKLQkJVFJBQ0UobW10aW1lLCAiaEluc3RhbmNlPSUwNFggIVxuIiwgbHBUaW1lci0+aEluc3RhbmNlKTsKLQotLyogVGhpcyBpcyB3cm9uZyAobHBGdW5jIGlzIE5VTEwgYWxsIHRoZSB0aW1lKQotCi0gICAJICAgICAgICBscEZ1bmMgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggbHBUaW1lci0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRPcmRpbmFsKGxwVGltZXItPmhJbnN0YW5jZSwiVGltZXJDYWxsQmFjayIgKSk7Ci0JCVRSQUNFKG1tdGltZSwgImxwRnVuYz0lMDhseCAhXG4iLCBscEZ1bmMpOwotKi8KLQotCi0vKiAgICAgICAgLSBUaW1lUHJvYyBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBoZXJlIGlzIHNvbWV0aGluZyBzdHJhbmdlLCB1bmRlciBXaW5kb3dzIDMuMXggaXQgaXMgY2FsbGVkIAotICogICAgICAgICAgZHVyaW5nIGludGVycnVwdCB0aW1lLCAgaXMgYWxsb3dlZCB0byBleGVjdXRlIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgQVBJIGNhbGxzIChsaWtlCi0gKgkgICAgUG9zdE1lc3NhZ2UpLCBhbmQgbXVzdCByZXNpZGUgaW4gRExMICh0aGVyZWZvcmUgdXNlcyBzdGFjayBvZiBhY3RpdmUgYXBwbGljYXRpb24pLiBTbyBJIAotICogICAgICAgICAgZ3Vlc3MgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB2aWEgU2V0VGltZXIgaGFzIHRvIGJlIGltcHJvdmVkIHVwb24uCQkKLSAqLwotIAkJaWYgKGxwVGltZXItPmlzd2luMzIpCi0JCQlscFRpbWVyLT5scEZ1bmMobHBUaW1lci0+d1RpbWVySUQsMCxscFRpbWVyLT5kd1VzZXIsMCwwKTsKLQkJZWxzZQotCQkJQ2FsbGJhY2tzLT5DYWxsVGltZUZ1bmNQcm9jKGxwVGltZXItPmxwRnVuYywKLQkJCQkJCSAgICBscFRpbWVyLT53VGltZXJJRCwwLAotCQkJCQkJICAgIGxwVGltZXItPmR3VXNlciwwLDAKLQkJCSk7Ci0KLQkJVFJBQ0UobW10aW1lLCAiYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKLQkJZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKCF3SW5DYWxsQmFja0xvb3ArKykKKyNlbmRpZgorCWZvciAobHBUaW1lciA9IGxwVGltZXJMaXN0OyBscFRpbWVyICE9IE5VTEw7IGxwVGltZXIgPSBscFRpbWVyLT5OZXh0KSB7CisJICAgIGlmIChscFRpbWVyLT53Q3VyVGltZSA8IE1NU1lTVElNRV9NSU5JTlRFUlZBTCkgeworCQlUSU1FX1RyaWdnZXJDYWxsQmFjayhscFRpbWVyLCBkd1RpbWUpOwkJCQorCSAgICB9IGVsc2UgeworCQlscFRpbWVyLT53Q3VyVGltZSAtPSBNTVNZU1RJTUVfTUlOSU5URVJWQUw7CiAJICAgIH0KLQkgICAgaWYgKGxwVGltZXItPndGbGFncyAmIFRJTUVfT05FU0hPVCkKLQkJdGltZUtpbGxFdmVudDMyKGxwVGltZXItPndUaW1lcklEKTsKIAl9Ci0JbHBUaW1lciA9IGxwVGltZXItPk5leHQ7Ci0gICAgfQorI2lmZGVmIFVTRV9GQUtFX01NX1RJTUVSUworICAgIHdJbkNhbGxCYWNrTG9vcC0tOworI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTUwLDYgKzEyMCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIFN0YXJ0TU1UaW1lKCkKIHsKKyAgICBzdGF0aWMgQk9PTDMyIAltbVRpbWVTdGFydGVkID0gRkFMU0U7CisgICAgCiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKSB7CiAJbW1UaW1lU3RhcnRlZCA9IFRSVUU7CiAJbW1TeXNUaW1lTVMud1R5cGUgPSBUSU1FX01TOwpAQCAtMTYxLDcgKzEzMywxMyBAQAogCW1tU3lzVGltZVNNUFRFLnUuc21wdGUuZnJhbWUgPSAwOwogCW1tU3lzVGltZVNNUFRFLnUuc21wdGUuZnBzID0gMDsKIAltbVN5c1RpbWVTTVBURS51LnNtcHRlLmR1bW15ID0gMDsKLQlTZXRUaW1lcjMyKCAwLCAxLCBNTVNZU1RJTUVfTUlOSU5URVJWQUwsIFRJTUVfTU1TeXNUaW1lQ2FsbGJhY2sgKTsKKwlTZXRUaW1lcjMyKCAwLCAwLCBNTVNZU1RJTUVfTUlOSU5URVJWQUwsIFRJTUVfTU1TeXNUaW1lQ2FsbGJhY2sgKTsKKyNpZmRlZiBVU0VfRkFLRV9NTV9USU1FUlMKKwliVXNlRmFrZVRpbWVycyA9IFBST0ZJTEVfR2V0V2luZUluaUJvb2woIm9wdGlvbnMiLCAiTU1GYWtlVGltZXJzIiwgVFJVRSk7CisJVFJBQ0UobW10aW1lLCAiRmFrZVRpbWVyPSVjXG4iLCBiVXNlRmFrZVRpbWVycyA/ICdZJyA6ICdOJyk7CisJaWYgKGJVc2VGYWtlVGltZXJzKQorCSAgICBkd0xhc3RDQlRpY2sgPSBHZXRUaWNrQ291bnQoKTsKKyNlbmRpZgogICAgIH0KIH0KIApAQCAtMTcxLDggKzE0OSw3IEBACiBNTVJFU1VMVDMyIFdJTkFQSSB0aW1lR2V0U3lzdGVtVGltZTMyKExQTU1USU1FMzIgbHBUaW1lLCBVSU5UMzIgd1NpemUpCiB7CiAgICAgVFJBQ0UobW1zeXMsICIoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOwotICAgIGlmICghbW1UaW1lU3RhcnRlZCkKLQlTdGFydE1NVGltZSgpOworICAgIFN0YXJ0TU1UaW1lKCk7CiAgICAgbHBUaW1lLT53VHlwZSA9IFRJTUVfTVM7CiAgICAgbHBUaW1lLT51Lm1zID0gbW1TeXNUaW1lTVMudS5tczsKICAgICByZXR1cm4gMDsKQEAgLTE4NCwxMyArMTYxLDQ3IEBACiBNTVJFU1VMVDE2IFdJTkFQSSB0aW1lR2V0U3lzdGVtVGltZTE2KExQTU1USU1FMTYgbHBUaW1lLCBVSU5UMTYgd1NpemUpCiB7CiAgICAgVFJBQ0UobW1zeXMsICIoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOwotICAgIGlmICghbW1UaW1lU3RhcnRlZCkKLQlTdGFydE1NVGltZSgpOworICAgIFN0YXJ0TU1UaW1lKCk7CiAgICAgbHBUaW1lLT53VHlwZSA9IFRJTUVfTVM7CiAgICAgbHBUaW1lLT51Lm1zID0gbW1TeXNUaW1lTVMudS5tczsKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljCVdPUkQJdGltZVNldEV2ZW50SW50ZXJuYWwoVUlOVDMyIHdEZWxheSxVSU5UMzIgd1Jlc29sLAorCQkJCSAgICAgRkFSUFJPQzE2IGxwRnVuYyxEV09SRCBkd1VzZXIsCisJCQkJICAgICBVSU5UMzIgd0ZsYWdzLCBVSU5UMTYgaXNXaW4zMikKK3sKKyAgICBXT1JEIAkJd05ld0lEID0gMDsKKyAgICBMUFRJTUVSRU5UUlkJbHBOZXdUaW1lcjsKKyAgICBMUFRJTUVSRU5UUlkJbHBUaW1lciA9IGxwVGltZXJMaXN0OworICAgIAorICAgIFRSQUNFKG1tdGltZSwgIigldSwgJXUsICVwLCAlMDhsWCwgJTA0WCk7XG4iLAorCSAgd0RlbGF5LCB3UmVzb2wsIGxwRnVuYywgZHdVc2VyLCB3RmxhZ3MpOworICAgIFN0YXJ0TU1UaW1lKCk7CisgICAgbHBOZXdUaW1lciA9IChMUFRJTUVSRU5UUlkpeG1hbGxvYyhzaXplb2YoVElNRVJFTlRSWSkpOworICAgIGlmIChscE5ld1RpbWVyID09IE5VTEwpCisJcmV0dXJuIDA7CisgICAgd2hpbGUgKGxwVGltZXIgIT0gTlVMTCkgeworCXdOZXdJRCA9IE1BWCh3TmV3SUQsIGxwVGltZXItPndUaW1lcklEKTsKKwlscFRpbWVyID0gbHBUaW1lci0+TmV4dDsKKyAgICB9CisgICAgCisgICAgbHBOZXdUaW1lci0+TmV4dCA9IGxwVGltZXJMaXN0OworICAgIGxwVGltZXJMaXN0ID0gbHBOZXdUaW1lcjsKKyAgICBscE5ld1RpbWVyLT53VGltZXJJRCA9IHdOZXdJRCArIDE7CisgICAgbHBOZXdUaW1lci0+d0N1clRpbWUgPSB3RGVsYXk7CisgICAgbHBOZXdUaW1lci0+d0RlbGF5ID0gd0RlbGF5OworICAgIGxwTmV3VGltZXItPndSZXNvbCA9IHdSZXNvbDsKKyAgICBscE5ld1RpbWVyLT5scEZ1bmMgPSBscEZ1bmM7CisgICAgbHBOZXdUaW1lci0+aXNXaW4zMiA9IGlzV2luMzI7CisgICAgbHBOZXdUaW1lci0+aEluc3RhbmNlID0gR2V0VGFza0RTKCk7CisgICAgVFJBQ0UobW10aW1lLCAiaEluc3RhbmNlPSUwNFggIVxuIiwgbHBOZXdUaW1lci0+aEluc3RhbmNlKTsKKyAgICBUUkFDRShtbXRpbWUsICJscEZ1bmM9JXAgIVxuIiwgaXNXaW4zMiA/IGxwRnVuYyA6IFBUUl9TRUdfVE9fTElOKGxwRnVuYykpOworICAgIGxwTmV3VGltZXItPmR3VXNlciA9IGR3VXNlcjsKKyAgICBscE5ld1RpbWVyLT53RmxhZ3MgPSB3RmxhZ3M7CisgICAgcmV0dXJuIGxwTmV3VGltZXItPndUaW1lcklEOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl0aW1lU2V0RXZlbnQJCVtNTVNZU1RFTS42MDJdCiAgKi8KQEAgLTE5OCwzOCArMjA5LDggQEAKIAkJCQkgTFBUSU1FQ0FMTEJBQ0szMiBscEZ1bmMsRFdPUkQgZHdVc2VyLAogCQkJCSBVSU5UMzIgd0ZsYWdzKQogewotICAgIFdPUkQgd05ld0lEID0gMDsKLSAgICBMUFRJTUVSRU5UUlkgbHBOZXdUaW1lcjsKLSAgICBMUFRJTUVSRU5UUlkgbHBUaW1lciA9IGxwVGltZXJMaXN0OwotCi0gICAgVFJBQ0UobW10aW1lLCAiKCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCi0JCSAgd0RlbGF5LCB3UmVzb2wsIGxwRnVuYywgZHdVc2VyLCB3RmxhZ3MpOwotICAgIGlmICghbW1UaW1lU3RhcnRlZCkKLQlTdGFydE1NVGltZSgpOwotICAgIGxwTmV3VGltZXIgPSAoTFBUSU1FUkVOVFJZKXhtYWxsb2Moc2l6ZW9mKFRJTUVSRU5UUlkpKTsKLSAgICBpZiAobHBOZXdUaW1lciA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIHdoaWxlIChscFRpbWVyICE9IE5VTEwpIHsKLQl3TmV3SUQgPSBNQVgod05ld0lELCBscFRpbWVyLT53VGltZXJJRCk7Ci0JbHBUaW1lciA9IGxwVGltZXItPk5leHQ7Ci0gICAgfQotCi0gICAgbHBOZXdUaW1lci0+TmV4dCA9IGxwVGltZXJMaXN0OwotICAgIGxwVGltZXJMaXN0ID0gbHBOZXdUaW1lcjsKLSAgICBscE5ld1RpbWVyLT53VGltZXJJRCA9IHdOZXdJRCArIDE7Ci0gICAgbHBOZXdUaW1lci0+d0N1clRpbWUgPSB3RGVsYXk7Ci0gICAgbHBOZXdUaW1lci0+dHJpZ2dlcnRpbWUgPSB3RGVsYXkrR2V0VGlja0NvdW50KCk7Ci0gICAgbHBOZXdUaW1lci0+d0RlbGF5ID0gd0RlbGF5OwotICAgIGxwTmV3VGltZXItPndSZXNvbCA9IHdSZXNvbDsKLSAgICBscE5ld1RpbWVyLT5scEZ1bmMgPSAoRkFSUFJPQzE2KSBscEZ1bmM7Ci0gICAgbHBOZXdUaW1lci0+aXN3aW4zMiA9IDE7Ci0gICAgbHBOZXdUaW1lci0+aEluc3RhbmNlID0gR2V0VGFza0RTKCk7Ci0JVFJBQ0UobW10aW1lLCAiaEluc3RhbmNlPSUwNFggIVxuIiwgbHBOZXdUaW1lci0+aEluc3RhbmNlKTsKLQlUUkFDRShtbXRpbWUsICJscEZ1bmM9JXAgIVxuIiwgCi0JCQkJbHBGdW5jKTsKLSAgICBscE5ld1RpbWVyLT5kd1VzZXIgPSBkd1VzZXI7Ci0gICAgbHBOZXdUaW1lci0+d0ZsYWdzID0gd0ZsYWdzOwotICAgIHJldHVybiBscE5ld1RpbWVyLT53VGltZXJJRDsKKyAgICByZXR1cm4gdGltZVNldEV2ZW50SW50ZXJuYWwod0RlbGF5LCB3UmVzb2wsIChGQVJQUk9DMTYpbHBGdW5jLCAKKwkJCQlkd1VzZXIsIHdGbGFncywgMSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjM5LDM3ICsyMjAsOCBAQAogCQkJCSBMUFRJTUVDQUxMQkFDSzE2IGxwRnVuYyxEV09SRCBkd1VzZXIsCiAJCQkJIFVJTlQxNiB3RmxhZ3MpCiB7Ci0gICAgV09SRCB3TmV3SUQgPSAwOwotICAgIExQVElNRVJFTlRSWSBscE5ld1RpbWVyOwotICAgIExQVElNRVJFTlRSWSBscFRpbWVyID0gbHBUaW1lckxpc3Q7Ci0gICAgVFJBQ0UobW10aW1lLCAiKCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCi0JCSAgd0RlbGF5LCB3UmVzb2wsIGxwRnVuYywgZHdVc2VyLCB3RmxhZ3MpOwotICAgIGlmICghbW1UaW1lU3RhcnRlZCkKLQlTdGFydE1NVGltZSgpOwotICAgIGxwTmV3VGltZXIgPSAoTFBUSU1FUkVOVFJZKXhtYWxsb2Moc2l6ZW9mKFRJTUVSRU5UUlkpKTsKLSAgICBpZiAobHBOZXdUaW1lciA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIHdoaWxlIChscFRpbWVyICE9IE5VTEwpIHsKLQl3TmV3SUQgPSBNQVgod05ld0lELCBscFRpbWVyLT53VGltZXJJRCk7Ci0JbHBUaW1lciA9IGxwVGltZXItPk5leHQ7Ci0gICAgfQotCi0gICAgbHBOZXdUaW1lci0+TmV4dCA9IGxwVGltZXJMaXN0OwotICAgIGxwVGltZXJMaXN0ID0gbHBOZXdUaW1lcjsKLSAgICBscE5ld1RpbWVyLT53VGltZXJJRCA9IHdOZXdJRCArIDE7Ci0gICAgbHBOZXdUaW1lci0+d0N1clRpbWUgPSB3RGVsYXk7Ci0gICAgbHBOZXdUaW1lci0+d0RlbGF5ID0gd0RlbGF5OwotICAgIGxwTmV3VGltZXItPnRyaWdnZXJ0aW1lID0gd0RlbGF5K0dldFRpY2tDb3VudCgpOwotICAgIGxwTmV3VGltZXItPndSZXNvbCA9IHdSZXNvbDsKLSAgICBscE5ld1RpbWVyLT5scEZ1bmMgPSAoRkFSUFJPQzE2KSBscEZ1bmM7Ci0gICAgbHBOZXdUaW1lci0+aXN3aW4zMiA9IDA7Ci0gICAgbHBOZXdUaW1lci0+aEluc3RhbmNlID0gR2V0VGFza0RTKCk7Ci0JVFJBQ0UobW10aW1lLCAiaEluc3RhbmNlPSUwNFggIVxuIiwgbHBOZXdUaW1lci0+aEluc3RhbmNlKTsKLQlUUkFDRShtbXRpbWUsICIobHBGdW5jKT0lcCAhXG4iLCAKLQkJCQlQVFJfU0VHX1RPX0xJTihscEZ1bmMpKTsKLSAgICBscE5ld1RpbWVyLT5kd1VzZXIgPSBkd1VzZXI7Ci0gICAgbHBOZXdUaW1lci0+d0ZsYWdzID0gd0ZsYWdzOwotICAgIHJldHVybiBscE5ld1RpbWVyLT53VGltZXJJRDsKKyAgICByZXR1cm4gdGltZVNldEV2ZW50SW50ZXJuYWwod0RlbGF5LCB3UmVzb2wsIChGQVJQUk9DMTYpbHBGdW5jLCAKKwkJCQlkd1VzZXIsIHdGbGFncywgMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc3LDE1ICsyMjksMTYgQEAKICAqLwogTU1SRVNVTFQzMiBXSU5BUEkgdGltZUtpbGxFdmVudDMyKFVJTlQzMiB3SUQpCiB7Ci0gICAgTFBUSU1FUkVOVFJZIHhscHRpbWVyLCpscFRpbWVyID0gJmxwVGltZXJMaXN0OwotICAgIHdoaWxlICgqbHBUaW1lcikgeworICAgIExQVElNRVJFTlRSWSoJbHBUaW1lcjsKKyAgICAKKyAgICBmb3IgKGxwVGltZXIgPSAmbHBUaW1lckxpc3Q7ICpscFRpbWVyOyBscFRpbWVyID0gJigoKmxwVGltZXIpLT5OZXh0KSkgewogCWlmICh3SUQgPT0gKCpscFRpbWVyKS0+d1RpbWVySUQpIHsKLQkgICAgeGxwdGltZXIgPSAoKmxwVGltZXIpLT5OZXh0OworCSAgICBMUFRJTUVSRU5UUlkgeGxwdGltZXIgPSAoKmxwVGltZXIpLT5OZXh0OworCSAgICAKIAkgICAgZnJlZSgqbHBUaW1lcik7CiAJICAgICpscFRpbWVyID0geGxwdGltZXI7CiAJICAgIHJldHVybiBUUlVFOwogCX0KLQlscFRpbWVyID0gJigoKmxwVGltZXIpLT5OZXh0KTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0zMDQsOCArMjU3LDcgQEAKIE1NUkVTVUxUMzIgV0lOQVBJIHRpbWVHZXREZXZDYXBzMzIoTFBUSU1FQ0FQUzMyIGxwQ2FwcyxVSU5UMzIgd1NpemUpCiB7CiAgICAgVFJBQ0UobW10aW1lLCAiKCVwLCAldSkgIVxuIiwgbHBDYXBzLCB3U2l6ZSk7Ci0gICAgaWYgKCFtbVRpbWVTdGFydGVkKQotCVN0YXJ0TU1UaW1lKCk7CisgICAgU3RhcnRNTVRpbWUoKTsKICAgICBscENhcHMtPndQZXJpb2RNaW4gPSBNTVNZU1RJTUVfTUlOSU5URVJWQUw7CiAgICAgbHBDYXBzLT53UGVyaW9kTWF4ID0gTU1TWVNUSU1FX01BWElOVEVSVkFMOwogICAgIHJldHVybiAwOwpAQCAtMzE3LDggKzI2OSw3IEBACiBNTVJFU1VMVDE2IFdJTkFQSSB0aW1lR2V0RGV2Q2FwczE2KExQVElNRUNBUFMxNiBscENhcHMsIFVJTlQxNiB3U2l6ZSkKIHsKICAgICBUUkFDRShtbXRpbWUsICIoJXAsICV1KSAhXG4iLCBscENhcHMsIHdTaXplKTsKLSAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCi0JU3RhcnRNTVRpbWUoKTsKKyAgICBTdGFydE1NVGltZSgpOwogICAgIGxwQ2Fwcy0+d1BlcmlvZE1pbiA9IE1NU1lTVElNRV9NSU5JTlRFUlZBTDsKICAgICBscENhcHMtPndQZXJpb2RNYXggPSBNTVNZU1RJTUVfTUFYSU5URVJWQUw7CiAgICAgcmV0dXJuIDA7CkBAIC0zMzAsMTAgKzI4MSw5IEBACiBNTVJFU1VMVDMyIFdJTkFQSSB0aW1lQmVnaW5QZXJpb2QzMihVSU5UMzIgd1BlcmlvZCkKIHsKICAgICBUUkFDRShtbXRpbWUsICIoJXUpICFcbiIsIHdQZXJpb2QpOwotICAgIGlmICghbW1UaW1lU3RhcnRlZCkKLQlTdGFydE1NVGltZSgpOworICAgIFN0YXJ0TU1UaW1lKCk7CiAgICAgaWYgKHdQZXJpb2QgPCBNTVNZU1RJTUVfTUlOSU5URVJWQUwgfHwgd1BlcmlvZCA+IE1NU1lTVElNRV9NQVhJTlRFUlZBTCkgCi0gICAgICAgIHJldHVybiBUSU1FUlJfTk9DQU5ETzsKKwlyZXR1cm4gVElNRVJSX05PQ0FORE87CiAgICAgcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM0MiwxMCArMjkyLDkgQEAKIE1NUkVTVUxUMTYgV0lOQVBJIHRpbWVCZWdpblBlcmlvZDE2KFVJTlQxNiB3UGVyaW9kKQogewogICAgIFRSQUNFKG1tdGltZSwgIigldSkgIVxuIiwgd1BlcmlvZCk7Ci0gICAgaWYgKCFtbVRpbWVTdGFydGVkKQotCVN0YXJ0TU1UaW1lKCk7CisgICAgU3RhcnRNTVRpbWUoKTsKICAgICBpZiAod1BlcmlvZCA8IE1NU1lTVElNRV9NSU5JTlRFUlZBTCB8fCB3UGVyaW9kID4gTU1TWVNUSU1FX01BWElOVEVSVkFMKSAKLSAgICAgICAgcmV0dXJuIFRJTUVSUl9OT0NBTkRPOworCXJldHVybiBUSU1FUlJfTk9DQU5ETzsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzU1LDggKzMwNCw5IEBACiBNTVJFU1VMVDMyIFdJTkFQSSB0aW1lRW5kUGVyaW9kMzIoVUlOVDMyIHdQZXJpb2QpCiB7CiAgICAgVFJBQ0UobW10aW1lLCAiKCV1KSAhXG4iLCB3UGVyaW9kKTsKKyAgICBTdGFydE1NVGltZSgpOwogICAgIGlmICh3UGVyaW9kIDwgTU1TWVNUSU1FX01JTklOVEVSVkFMIHx8IHdQZXJpb2QgPiBNTVNZU1RJTUVfTUFYSU5URVJWQUwpIAotICAgICAgICByZXR1cm4gVElNRVJSX05PQ0FORE87CisJcmV0dXJuIFRJTUVSUl9OT0NBTkRPOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNjcsNyArMzE3LDcgQEAKIHsKICAgICBUUkFDRShtbXRpbWUsICIoJXUpICFcbiIsIHdQZXJpb2QpOwogICAgIGlmICh3UGVyaW9kIDwgTU1TWVNUSU1FX01JTklOVEVSVkFMIHx8IHdQZXJpb2QgPiBNTVNZU1RJTUVfTUFYSU5URVJWQUwpIAotICAgICAgICByZXR1cm4gVElNRVJSX05PQ0FORE87CisJcmV0dXJuIFRJTUVSUl9OT0NBTkRPOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNzYsMzcgKzMyNiwzOCBAQAogICovCiBEV09SRCBXSU5BUEkgdGltZUdldFRpbWUoKQogewotICAvKiBGSVhNRSBhbGwgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSB0byBiZSBpcwotICAgICAgIGxvbmcgcmVzdWx0OwotICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWU7Ci0gICAgICAgVFJBQ0UobW10aW1lLCJ0aW1lR2V0VGltZSgpOyAhXG4iKTsKLSAgICAgICBnZXR0aW1lb2ZkYXkoJnRpbWUsIDApOwotICAgICAgIHJlc3VsdCA9ICgoKGxvbmcpdGltZS50dl9zZWMgKiAobG9uZykxMDAwKSArICgobG9uZyl0aW1lLnR2X3VzZWMgLyAobG9uZykxMDAwKSk7Ci0KLSAgICAgYnV0IHRoZSBtdWx0aW1lZGlhIHRpbWVycyBhcmUgbm90IGltcGxlbWVudGVkIGNvcnJlY3RseSwgc28gYWxsIHRoZSByZXN0Ci0gICAgIGlzIGEgd29ya2Fyb3VuZCB0byBmYWtlIHRoZW0uCi0gICAgICAgCi0gICAqLyAgCi0gICAgc3RhdGljIERXT1JEIGxhc3R0aWNrPTA7Ci0gICAgRFdPUkQJbmV3dGljazsKLQotICAgIFRSQUNFKG1tdGltZSwgIiFcbiIpOwotICAgIGlmICghbW1UaW1lU3RhcnRlZCkKLQlTdGFydE1NVGltZSgpOwotICAgIG5ld3RpY2sgPSBHZXRUaWNrQ291bnQoKTsKLSAgICBtbVN5c1RpbWVNUy51Lm1zKz1uZXd0aWNrLWxhc3R0aWNrOyAvKiBGSVhNRTogZmFrZWQgdGltZXIgKi8KLSAgICBpZiAobmV3dGljayE9bGFzdHRpY2spCi0KLSAgICBpZiAoIXRpbWVfY2FsbGVkKSB7IC8qIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpZiB0aW1lR2V0VGltZSBpcyBjYWxsZWQKLQkJCSAgIGluc2lkZSBjaGVja19NTXRpbWVycwotCQkJICovCi0gICAgICB0aW1lX2NhbGxlZCsrOwotICAgIAljaGVja19NTXRpbWVycygpOwotICAgICAgdGltZV9jYWxsZWQtLTsKLSAgICB9ICAgIC8vY2hlY2tfTU10aW1lcnMoKTsKLSAgICBsYXN0dGljayA9IG5ld3RpY2s7Ci0gICAgVFJBQ0UobW10aW1lLCAiVGltZSA9ICVsZFxuIixtbVN5c1RpbWVNUy51Lm1zKTsKLQotCi0gICAgcmV0dXJuIG1tU3lzVGltZU1TLnUubXM7CisgICAgRFdPUkQJZHdOZXdUaWNrID0gR2V0VGlja0NvdW50KCk7CisgICAgCisjaWZkZWYgVVNFX0ZBS0VfTU1fVElNRVJTCisgICAgaWYgKGJVc2VGYWtlVGltZXJzKSB7CisJaWYgKHdJbkNhbGxCYWNrTG9vcCsrKSB7IAorCSAgICBEV09SRAkJZHdEZWx0YTsKKwkgICAgCisJICAgIFN0YXJ0TU1UaW1lKCk7CisJICAgIAorCSAgICBpZiAoZHdOZXdUaWNrIDwgZHdMYXN0Q0JUaWNrKSB7CisJCUVSUihtbXRpbWUsICJkd05ld1RpY2soJWx1KSA8IGR3TGFzdENCVGljayglbHUpXG4iLCBkd05ld1RpY2ssIGR3TGFzdENCVGljayk7CisJICAgIH0KKwkgICAgZHdEZWx0YSA9IGR3TmV3VGljayAtIGR3TGFzdENCVGljazsKKwkgICAgaWYgKGR3RGVsdGEgPiBNTVNZU1RJTUVfTUlOSU5URVJWQUwpIHsKKwkJTFBUSU1FUkVOVFJZIGxwVGltZXI7CisJCQorCQltbVN5c1RpbWVNUy51Lm1zICs9IGR3RGVsdGE7IC8qIEZJWE1FOiBmYWtlZCB0aW1lciAqLworCQlkd0xhc3RDQlRpY2sgPSBkd05ld1RpY2s7CisJCWZvciAobHBUaW1lciA9IGxwVGltZXJMaXN0OyBscFRpbWVyICE9IE5VTEw7IGxwVGltZXIgPSBscFRpbWVyLT5OZXh0KSB7CisJCSAgICBpZiAobHBUaW1lci0+d0N1clRpbWUgPCBkd0RlbHRhKSB7CisJCQlUSU1FX1RyaWdnZXJDYWxsQmFjayhscFRpbWVyLCBkd05ld1RpY2spOworCQkgICAgfSBlbHNlIHsKKwkJCWxwVGltZXItPndDdXJUaW1lIC09IGR3RGVsdGE7CisJCSAgICB9CisJCX0KKwkJZHdOZXdUaWNrID0gbW1TeXNUaW1lTVMudS5tczsKKwkgICAgfQorCX0KKwl3SW5DYWxsQmFja0xvb3AtLTsKKyAgICB9CisjZW5kaWYKKyAgICBUUkFDRShtbXRpbWUsICJUaW1lID0gJWxkXG4iLCBkd05ld1RpY2spOworICAgIAorICAgIHJldHVybiBkd05ld1RpY2s7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdG1hcC5jIGIvb2JqZWN0cy9iaXRtYXAuYwppbmRleCAyNDgwZjI3Li4yZGE0Mzc0IDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdG1hcC5jCisrKyBiL29iamVjdHMvYml0bWFwLmMKQEAgLTg2OCw4ICs4NjgsMjUgQEAKIHsKICAgICBpZiAoYm1wLT5kaWIpCiAgICAgewotCUZJWE1FKGJpdG1hcCwgIm5vdCBpbXBsZW1lbnRlZCBmb3IgRElCc1xuIik7Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmICggY291bnQgPD0gc2l6ZW9mKEJJVE1BUDE2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJJVE1BUDMyICpibXAzMiA9ICZibXAtPmRpYi0+ZGliU2VjdGlvbi5kc0JtOworCSAgICBCSVRNQVAxNiBibXAxNjsKKwkgICAgYm1wMTYuYm1UeXBlICAgICAgID0gYm1wMzItPmJtVHlwZTsKKwkgICAgYm1wMTYuYm1XaWR0aCAgICAgID0gYm1wMzItPmJtV2lkdGg7CisJICAgIGJtcDE2LmJtSGVpZ2h0ICAgICA9IGJtcDMyLT5ibUhlaWdodDsKKwkgICAgYm1wMTYuYm1XaWR0aEJ5dGVzID0gYm1wMzItPmJtV2lkdGhCeXRlczsKKwkgICAgYm1wMTYuYm1QbGFuZXMgICAgID0gYm1wMzItPmJtUGxhbmVzOworCSAgICBibXAxNi5ibUJpdHNQaXhlbCAgPSBibXAzMi0+Ym1CaXRzUGl4ZWw7CisJICAgIGJtcDE2LmJtQml0cyAgICAgICA9IE5VTEw7CisJICAgIG1lbWNweSggYnVmZmVyLCAmYm1wMTYsIGNvdW50ICk7CisJICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKwkgICAgRklYTUUoYml0bWFwLCAibm90IGltcGxlbWVudGVkIGZvciBESUJzOiBjb3VudCAlZFxuIiwgY291bnQpOworCSAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jbGlwcGluZy5jIGIvb2JqZWN0cy9jbGlwcGluZy5jCmluZGV4IDc4YjNkNzkuLjNmM2FkMzAgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY2xpcHBpbmcuYworKysgYi9vYmplY3RzL2NsaXBwaW5nLmMKQEAgLTgzLDYgKzgzLDE1IEBACiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUV4dFNlbGVjdENsaXBSZ24JW0dESTMyLjk3XQorICovCitJTlQzMiBXSU5BUEkgRXh0U2VsZWN0Q2xpcFJnbiggSERDMzIgaGRjLCBIUkdOMzIgaHJnbiwgSU5UMzIgZm5Nb2RlICkKK3sKKyAgICBpZiAoZm5Nb2RlICE9IFJHTl9DT1BZKQorICAgICAgICBGSVhNRShjbGlwcGluZywgIlVuaW1wbGVtZW50ZWQgbW9kZTogJWRcbiIsIGZuTW9kZSk7IAorICAgIHJldHVybiBTZWxlY3RDbGlwUmduMzIoIGhkYywgaHJnbiApOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZWxlY3RWaXNSZ24gICAgKEdESS4xMDUpCmRpZmYgLS1naXQgYS9vYmplY3RzL2RjLmMgYi9vYmplY3RzL2RjLmMKaW5kZXggYjFhZDk1ZS4uYTc4NzQ3NSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kYy5jCisrKyBiL29iamVjdHMvZGMuYwpAQCAtMTUwNiwzICsxNTA2LDEzIEBACiAvKkZJWE1FICAgIE5lZWQgdG8gdG8gd2hhdGV2ZXIgR2V0Q29sb3JTcGFjZSBhY3R1YWxseSBkb2VzICovCiAgICAgcmV0dXJuIDA7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEJvdW5kc1JlY3QxNiAgICAoR0RJLjE5NCkKKyAqLworVUlOVDE2IFdJTkFQSSBHZXRCb3VuZHNSZWN0MTYoSERDMTYgaGRjLCBMUFJFQ1QxNiByZWN0LCBVSU5UMTYgZmxhZ3MpCit7CisgICAgRklYTUUoZGMsICIoKTogc3R1YlxuIik7CisgICAgcmV0dXJuIERDQl9SRVNFVDsgICAvKiBib3VuZGluZyByZWN0YW5nbGUgYWx3YXlzIGVtcHR5ICovCit9CisKZGlmZiAtLWdpdCBhL29iamVjdHMvZGliLmMgYi9vYmplY3RzL2RpYi5jCmluZGV4IDNiMWE4MWEuLjk1NTIzODEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGliLmMKKysrIGIvb2JqZWN0cy9kaWIuYwpAQCAtMTM4MSw2ICsxMzgxLDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldERJQkNvbG9yVGFibGUxNiAgICAoR0RJLjYwMikKKyAqLworVUlOVDE2IFdJTkFQSSBTZXRESUJDb2xvclRhYmxlMTYoIEhEQzE2IGhkYywgVUlOVDE2IHN0YXJ0cG9zLCBVSU5UMTYgZW50cmllcywKKwkJCQkgIFJHQlFVQUQgKmNvbG9ycyApCit7CisgICAgcmV0dXJuIFNldERJQkNvbG9yVGFibGUzMiggaGRjLCBzdGFydHBvcywgZW50cmllcywgY29sb3JzICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldERJQkNvbG9yVGFibGUzMiAgICAoR0RJMzIuMzExKQogICovCiBVSU5UMzIgV0lOQVBJIFNldERJQkNvbG9yVGFibGUzMiggSERDMzIgaGRjLCBVSU5UMzIgc3RhcnRwb3MsIFVJTlQzMiBlbnRyaWVzLApAQCAtMTQyNCw2ICsxNDMzLDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldERJQkNvbG9yVGFibGUxNiAgICAoR0RJLjYwMykKKyAqLworVUlOVDE2IFdJTkFQSSBHZXRESUJDb2xvclRhYmxlMTYoIEhEQzE2IGhkYywgVUlOVDE2IHN0YXJ0cG9zLCBVSU5UMTYgZW50cmllcywKKwkJCQkgIFJHQlFVQUQgKmNvbG9ycyApCit7CisgICAgcmV0dXJuIEdldERJQkNvbG9yVGFibGUzMiggaGRjLCBzdGFydHBvcywgZW50cmllcywgY29sb3JzICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldERJQkNvbG9yVGFibGUzMiAgICAoR0RJMzIuMTY5KQogICovCiBVSU5UMzIgV0lOQVBJIEdldERJQkNvbG9yVGFibGUzMiggSERDMzIgaGRjLCBVSU5UMzIgc3RhcnRwb3MsIFVJTlQzMiBlbnRyaWVzLApAQCAtMTk0OSw3ICsxOTY3LDcgQEAKICAqICAgICAgICAgICBDcmVhdGVESUJTZWN0aW9uMTYgICAgKEdESS40ODkpCiAgKi8KIEhCSVRNQVAxNiBXSU5BUEkgQ3JlYXRlRElCU2VjdGlvbjE2IChIREMxNiBoZGMsIEJJVE1BUElORk8gKmJtaSwgVUlOVDE2IHVzYWdlLAotCQkJCSAgICAgTFBWT0lEICoqYml0cywgSEFORExFMTYgc2VjdGlvbiwKKwkJCQkgICAgIExQVk9JRCAqKmJpdHMsIEhBTkRMRTMyIHNlY3Rpb24sCiAJCQkJICAgICBEV09SRCBvZmZzZXQpCiB7CiAgICAgcmV0dXJuIENyZWF0ZURJQlNlY3Rpb24zMihoZGMsIGJtaSwgdXNhZ2UsIGJpdHMsIHNlY3Rpb24sIG9mZnNldCk7CmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDk1NTc1YjQuLmQzYzFjNzkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0xMDI4LDkgKzEwMjgsOCBAQAogICovCiBEV09SRCBXSU5BUEkgU2V0TWFwcGVyRmxhZ3MzMiggSERDMzIgaERDLCBEV09SRCBkd0ZsYWcgKQogewotICAgIEZJWE1FKGZvbnQsICIoJTA0eCwgJTA4bFgpIC0tIEVtcHR5IFN0dWIgIVxuIiwKLQkJICBoREMsIGR3RmxhZyk7Ci0gICAgcmV0dXJuIDBMOworICAgIEZJWE1FKGZvbnQsICIoMHglMDR4LCAweCUwOGx4KTogc3R1YiAtIGhhcm1sZXNzXG4iLCBoREMsIGR3RmxhZyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTEwMSw3ICsxMTAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBHTFlQSE1FVFJJQ1MxNiBscGdtLCBEV09SRCBjYkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyLCBjb25zdCBNQVQyICpscG1hdDIgKQogewotICAgIEZJWE1FKGZvbnQsIiglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApOiBlbXB0eSBzdHViIVxuIiwKKyAgICBGSVhNRShmb250LCIoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKTogc3R1YlxuIiwKIAkgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOwogICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KIH0KQEAgLTExMTQsNyArMTExMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUzMyIGxwZ20sIERXT1JEIGNiQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyLCBjb25zdCBNQVQyICpscG1hdDIgKQogewotICAgIEZJWE1FKGZvbnQsIiglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApOiBlbXB0eSBzdHViIVxuIiwKKyAgICBGSVhNRShmb250LCIoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKTogc3R1YlxuIiwKIAkgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOwogICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KIH0KQEAgLTExMjYsNyArMTEyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUzMyIGxwZ20sIERXT1JEIGNiQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyLCBjb25zdCBNQVQyICpscG1hdDIgKQogewotICAgIEZJWE1FKGZvbnQsIiglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApOiBlbXB0eSBzdHViIVxuIiwKKyAgICBGSVhNRShmb250LCIoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKTogc3R1YlxuIiwKIAkgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOwogICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KIH0KQEAgLTExNTQsNyArMTE1Myw3IEBACiAgICAgICogZW51bWJlcmVkIHdpdGggRW51bUZvbnRzL0VudW1Gb250RmFtaWxpZXMKICAgICAgKiBscHN6Q3VycmVudFBhdGggY2FuIGJlIE5VTEwKICAgICAgKi8KLSAgICBGSVhNRShmb250LCIoJWxkLCVzLCVzLCVzKTogZW1wdHkgc3R1YlxuIiwKKyAgICBGSVhNRShmb250LCIoJWxkLCVzLCVzLCVzKTogc3R1YlxuIiwKIAkgIGZIaWRkZW4sIGxwc3pSZXNvdXJjZUZpbGUsIGxwc3pGb250RmlsZSwgbHBzekN1cnJlbnRQYXRoICk7CiAgICAgcmV0dXJuIEZBTFNFOyAvKiBjcmVhdGUgZmFpbGVkICovCiB9CkBAIC0xMTY3LDcgKzExNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscHN6Rm9udEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pDdXJyZW50UGF0aCApCiB7Ci0gICAgRklYTUUoZm9udCwiKCVsZCwlcCwlcCwlcCk6IGVtcHR5IHN0dWJcbiIsCisgICAgRklYTUUoZm9udCwiKCVsZCwlcCwlcCwlcCk6IHN0dWJcbiIsCiAJICBmSGlkZGVuLCBscHN6UmVzb3VyY2VGaWxlLCBscHN6Rm9udEZpbGUsIGxwc3pDdXJyZW50UGF0aCApOwogICAgIHJldHVybiBGQUxTRTsgLyogY3JlYXRlIGZhaWxlZCAqLwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9nZGlvYmouYyBiL29iamVjdHMvZ2Rpb2JqLmMKaW5kZXggY2ExMjk1OS4uYzY4MGZmMCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC03ODgsMjAgKzc4OCw1NiBAQAogICovCiBCT09MMTYgV0lOQVBJIElzR0RJT2JqZWN0KCBIR0RJT0JKMTYgaGFuZGxlICkKIHsKKyAgICBVSU5UMTYgbWFnaWMgPSAwOworCiAgICAgaWYgKGhhbmRsZSA+PSBGSVJTVF9TVE9DS19IQU5ETEUgKSAKLQlyZXR1cm4gVFJVRTsKKyAgICB7CisgICAgICAgIHN3aXRjaCAoaGFuZGxlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU1RPQ0tfV0hJVEVfQlJVU0g6CisgICAgICAgIGNhc2UgU1RPQ0tfTFRHUkFZX0JSVVNIOgorICAgICAgICBjYXNlIFNUT0NLX0dSQVlfQlJVU0g6CisgICAgICAgIGNhc2UgU1RPQ0tfREtHUkFZX0JSVVNIOgorICAgICAgICBjYXNlIFNUT0NLX0JMQUNLX0JSVVNIOgorICAgICAgICBjYXNlIFNUT0NLX0hPTExPV19CUlVTSDoKKyAgICAgICAgICAgIG1hZ2ljID0gQlJVU0hfTUFHSUM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUT0NLX1dISVRFX1BFTjoKKyAgICAgICAgY2FzZSBTVE9DS19CTEFDS19QRU46CisgICAgICAgIGNhc2UgU1RPQ0tfTlVMTF9QRU4gOgorICAgICAgICAgICAgbWFnaWMgPSBQRU5fTUFHSUM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUT0NLX09FTV9GSVhFRF9GT05UOgorICAgICAgICBjYXNlIFNUT0NLX0FOU0lfRklYRURfRk9OVDoKKyAgICAgICAgY2FzZSBTVE9DS19BTlNJX1ZBUl9GT05UOgorICAgICAgICBjYXNlIFNUT0NLX1NZU1RFTV9GT05UOgorICAgICAgICBjYXNlIFNUT0NLX0RFVklDRV9ERUZBVUxUX0ZPTlQ6CisgICAgICAgIGNhc2UgU1RPQ0tfU1lTVEVNX0ZJWEVEX0ZPTlQ6CisgICAgICAgIGNhc2UgU1RPQ0tfREVGQVVMVF9HVUlfRk9OVDoKKyAgICAgICAgICAgIG1hZ2ljID0gRk9OVF9NQUdJQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RPQ0tfREVGQVVMVF9QQUxFVFRFOgorICAgICAgICAgICAgbWFnaWMgPSBQQUxFVFRFX01BR0lDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAgICAgZWxzZQogICAgIHsKIAlHRElPQkpIRFIgKm9iamVjdCA9IChHRElPQkpIRFIgKikgR0RJX0hFQVBfTE9DSyggaGFuZGxlICk7CiAJaWYgKG9iamVjdCkKIAl7Ci0JICAgIFVJTlQxNiBtYWdpYyA9IG9iamVjdC0+d01hZ2ljOworCSAgICBtYWdpYyA9IG9iamVjdC0+d01hZ2ljOwogCSAgICBHRElfSEVBUF9VTkxPQ0soIGhhbmRsZSApOwotCSAgICBpZiAobWFnaWMgPj0gUEVOX01BR0lDICYmIG1hZ2ljIDw9IE1FVEFGSUxFX0RDX01BR0lDKQotCQlyZXR1cm4gbWFnaWMgLSBQRU5fTUFHSUMgKyAxOwogCX0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKG1hZ2ljID49IFBFTl9NQUdJQyAmJiBtYWdpYyA8PSBNRVRBRklMRV9EQ19NQUdJQykKKyAgICAgICAgcmV0dXJuIG1hZ2ljIC0gUEVOX01BR0lDICsgMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKIH0KIAogCkBAIC04MjMsNiArODU5LDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1ha2VPYmplY3RQcml2YXRlICAgIChHREkuNDYzKQorICovCit2b2lkIFdJTkFQSSBNYWtlT2JqZWN0UHJpdmF0ZSggSEdESU9CSjE2IGhhbmRsZSwgQk9PTDE2IHByaXZhdGUgKQoreworICAgIC8qIEZJWE1FICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2RpRmx1c2ggICAgKEdESTMyLjEyOCkKICAqLwogQk9PTDMyIFdJTkFQSSBHZGlGbHVzaCh2b2lkKQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9vZW1iaXRtYXAuYyBiL29iamVjdHMvb2VtYml0bWFwLmMKaW5kZXggNmEwMTZjZS4uZTllOWU5ZSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9vZW1iaXRtYXAuYworKysgYi9vYmplY3RzL29lbWJpdG1hcC5jCkBAIC01MzQsMjEgKzUzNCw3IEBACiAgKi8KIEJPT0wzMiBPQk1fSW5pdCgpCiB7Ci0gICAgaWYoVFdFQUtfV2luOTVMb29rKSB7Ci0JT0JNX1BpeG1hcHNfRGF0YVtPQk1fWk9PTUQgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fem9vbWRfOTU7Ci0JT0JNX1BpeG1hcHNfRGF0YVtPQk1fUkVEVUNFRCAtIE9CTV9GSVJTVF0uZGF0YSA9IG9ibV9yZWR1Y2VkXzk1OwotCU9CTV9QaXhtYXBzX0RhdGFbT0JNX1pPT00gLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fem9vbV85NTsKLQlPQk1fUGl4bWFwc19EYXRhW09CTV9SRURVQ0UgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fcmVkdWNlXzk1OwotCU9CTV9QaXhtYXBzX0RhdGFbT0JNX0NMT1NFIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX2Nsb3NlXzk1OwotICAgICAgICBPQk1fUGl4bWFwc19EYXRhW09CTV9SRVNUT1JFIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3Jlc3RvcmVfOTU7Ci0gICAgICAgIE9CTV9QaXhtYXBzX0RhdGFbT0JNX1JFU1RPUkVEIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3Jlc3RvcmVkXzk1OwotCi0gICAgICAgIE9CTV9JY29uc19EYXRhW09JQ19IQU5EIC0gT0lDX0ZJUlNUXSA9IG9pY19oYW5kXzk1OwotICAgICAgICBPQk1fSWNvbnNfRGF0YVtPSUNfUVVFUyAtIE9JQ19GSVJTVF0gPSBvaWNfcXVlc185NTsKLSAgICAgICAgT0JNX0ljb25zX0RhdGFbT0lDX0JBTkcgLSBPSUNfRklSU1RdID0gb2ljX2JhbmdfOTU7Ci0gICAgICAgIE9CTV9JY29uc19EYXRhW09JQ19OT1RFIC0gT0lDX0ZJUlNUXSA9IG9pY19ub3RlXzk1OwotICAgIH0KLSAgICBlbHNlIHsKKyAgICBpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykgewogCU9CTV9QaXhtYXBzX0RhdGFbT0JNX1pPT01EIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3pvb21kOwogCU9CTV9QaXhtYXBzX0RhdGFbT0JNX1JFRFVDRUQgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fcmVkdWNlZDsKIAlPQk1fUGl4bWFwc19EYXRhW09CTV9aT09NIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3pvb207CkBAIC01NjIsNiArNTQ4LDIwIEBACiAgICAgICAgIE9CTV9JY29uc19EYXRhW09JQ19CQU5HIC0gT0lDX0ZJUlNUXSA9IG9pY19iYW5nOwogICAgICAgICBPQk1fSWNvbnNfRGF0YVtPSUNfTk9URSAtIE9JQ19GSVJTVF0gPSBvaWNfbm90ZTsKICAgICB9CisgICAgZWxzZSB7CisJT0JNX1BpeG1hcHNfRGF0YVtPQk1fWk9PTUQgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fem9vbWRfOTU7CisJT0JNX1BpeG1hcHNfRGF0YVtPQk1fUkVEVUNFRCAtIE9CTV9GSVJTVF0uZGF0YSA9IG9ibV9yZWR1Y2VkXzk1OworCU9CTV9QaXhtYXBzX0RhdGFbT0JNX1pPT00gLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fem9vbV85NTsKKwlPQk1fUGl4bWFwc19EYXRhW09CTV9SRURVQ0UgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fcmVkdWNlXzk1OworCU9CTV9QaXhtYXBzX0RhdGFbT0JNX0NMT1NFIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX2Nsb3NlXzk1OworICAgICAgICBPQk1fUGl4bWFwc19EYXRhW09CTV9SRVNUT1JFIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3Jlc3RvcmVfOTU7CisgICAgICAgIE9CTV9QaXhtYXBzX0RhdGFbT0JNX1JFU1RPUkVEIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3Jlc3RvcmVkXzk1OworCisgICAgICAgIE9CTV9JY29uc19EYXRhW09JQ19IQU5EIC0gT0lDX0ZJUlNUXSA9IG9pY19oYW5kXzk1OworICAgICAgICBPQk1fSWNvbnNfRGF0YVtPSUNfUVVFUyAtIE9JQ19GSVJTVF0gPSBvaWNfcXVlc185NTsKKyAgICAgICAgT0JNX0ljb25zX0RhdGFbT0lDX0JBTkcgLSBPSUNfRklSU1RdID0gb2ljX2JhbmdfOTU7CisgICAgICAgIE9CTV9JY29uc19EYXRhW09JQ19OT1RFIC0gT0lDX0ZJUlNUXSA9IG9pY19ub3RlXzk1OworICAgIH0KIAogICAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wYWxldHRlLmMgYi9vYmplY3RzL3BhbGV0dGUuYwppbmRleCBiNDhiN2M4Li5kNWFlOWVlIDEwMDY0NAotLS0gYS9vYmplY3RzL3BhbGV0dGUuYworKysgYi9vYmplY3RzL3BhbGV0dGUuYwpAQCAtMTgsNiArMTgsOSBAQAogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCitGQVJQUk9DMzIgcGZuU2VsZWN0UGFsZXR0ZSA9IE5VTEw7CitGQVJQUk9DMzIgcGZuUmVhbGl6ZVBhbGV0dGUgPSBOVUxMOworCiBzdGF0aWMgVUlOVDMyIFN5c3RlbVBhbGV0dGVVc2UgPSBTWVNQQUxfU1RBVElDOyAgLyogY3VycmVudGx5IG5vdCBjb25zaWRlcmVkICovCiAKIHN0YXRpYyBIUEFMRVRURTE2IGhQcmltYXJ5UGFsZXR0ZSA9IDA7IC8qIHVzZWQgZm9yIFdNX1BBTEVUVEVDSEFOR0VEICovCkBAIC0xMjUsNyArMTI4LDcgQEAKIEhQQUxFVFRFMzIgV0lOQVBJIENyZWF0ZUhhbGZ0b25lUGFsZXR0ZSgKICAgICBIREMzMiBoZGMpIC8qIFtpbl0gSGFuZGxlIHRvIGRldmljZSBjb250ZXh0ICovCiB7Ci0gICAgRklYTUUocGFsZXR0ZSwiKCV4KTogc3R1YlxuIiwgaGRjKTsKKyAgICBGSVhNRShwYWxldHRlLCIoMHgleCk6IHN0dWJcbiIsIGhkYyk7CiAgICAgcmV0dXJuIChIUEFMRVRURTMyKU5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvdGV4dC5jIGIvb2JqZWN0cy90ZXh0LmMKaW5kZXggMDhlODBkMy4uYWMzMTY0MSAxMDA2NDQKLS0tIGEvb2JqZWN0cy90ZXh0LmMKKysrIGIvb2JqZWN0cy90ZXh0LmMKQEAgLTMyMyw3ICszMjMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgIExQUkVDVDMyIHJlY3QsIFVJTlQzMiBmbGFncywgTFBEUkFXVEVYVFBBUkFNUyBkdHAgKQogewogICAgIFRSQUNFKHRleHQsIiglZCwnJXMnLCVkLCVwLDB4JTA4eCwlcClcbiIsaGRjLHN0cixjb3VudCxyZWN0LGZsYWdzLGR0cCk7Ci0gICAgRklYTUUodGV4dCwiaWdub3JlcyBleHRlbmRlZCBmdW5jdGlvbmFsaXR5XG4iKTsKKyAgICBpZihkdHApIHsKKyAgICAgICAgRklYTUUodGV4dCwiSWdub3JlcyBwYXJhbXM6JWQsJWQsJWQsJWQsJWRcbiIsZHRwLT5jYlNpemUsCisgICAgICAgICAgICAgICAgICAgZHRwLT5pVGFiTGVuZ3RoLGR0cC0+aUxlZnRNYXJnaW4sZHRwLT5pUmlnaHRNYXJnaW4sCisgICAgICAgICAgICAgICAgICAgZHRwLT51aUxlbmd0aERyYXduKTsKKyAgICB9CiAgICAgcmV0dXJuIERyYXdUZXh0MzJBKGhkYyxzdHIsY291bnQscmVjdCxmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL29sZS9jb21wb2JqLmMgYi9vbGUvY29tcG9iai5jCmluZGV4IDMwZDA4NjkuLmNmODViNzIgMTAwNjQ0Ci0tLSBhL29sZS9jb21wb2JqLmMKKysrIGIvb2xlL2NvbXBvYmouYwpAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgImRzb3VuZC5oIgogI2luY2x1ZGUgImRpbnB1dC5oIgogI2luY2x1ZGUgImQzZC5oIgorI2luY2x1ZGUgImRwbGF5LmgiCisKIAogTFBNQUxMT0MxNiBjdXJyZW50TWFsbG9jMTY9TlVMTDsKIExQTUFMTE9DMzIgY3VycmVudE1hbGxvYzMyPU5VTEw7CmRpZmYgLS1naXQgYS9vbGUvbmxzL2Fmay5ubHMgYi9vbGUvbmxzL2Fmay5ubHMKaW5kZXggYjY3YmY0NC4uZDRkMWUyNSAxMDA2NDQKLS0tIGEvb2xlL25scy9hZmsubmxzCisrKyBiL29sZS9ubHMvYWZrLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBBZnJpa2FhbnMgKFNvdXRoIEFmcmljYSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MzYiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBZnJpa2FhbnMiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImFmayIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiQWZyaWthYW5zIikKIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlNvdXRoIEFmcmljYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiWkFGIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJTdWlkIEFmcmlrYSIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQzNiIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvYXJhLm5scyBiL29sZS9ubHMvYXJhLm5scwppbmRleCBhM2FjOWQ0Li43MGQyY2YyIDEwMDY0NAotLS0gYS9vbGUvbmxzL2FyYS5ubHMKKysrIGIvb2xlL25scy9hcmEubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIEFyYWJpYyAoU2F1ZGkgQXJhYmlhKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQwMSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkFyYWJpYyAoU2F1ZGkgQXJhYmlhKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiYXJhIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiU2F1ZGkgQXJhYmlhIikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvYXJiLm5scyBiL29sZS9ubHMvYXJiLm5scwppbmRleCA1NDk5ZDhhLi44NDViNDQxIDEwMDY0NAotLS0gYS9vbGUvbmxzL2FyYi5ubHMKKysrIGIvb2xlL25scy9hcmIubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIEFyYWJpYyAoTGViYW5vbikKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDMwMDEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBcmFiaWMgKExlYmFub24pIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJhcmwiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJMZWJhbm9uIikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvYXJlLm5scyBiL29sZS9ubHMvYXJlLm5scwppbmRleCA1ZmQxNDc4Li5jMWM2NGZjIDEwMDY0NAotLS0gYS9vbGUvbmxzL2FyZS5ubHMKKysrIGIvb2xlL25scy9hcmUubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIEFyYWJpYyAoRWd5cHQpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwYzAxIikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiQXJhYmljIChFZ3lwdCkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImFyZSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkVneXB0IikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvYXJnLm5scyBiL29sZS9ubHMvYXJnLm5scwppbmRleCBhNmFhZjE0Li5jYjNkMDYzIDEwMDY0NAotLS0gYS9vbGUvbmxzL2FyZy5ubHMKKysrIGIvb2xlL25scy9hcmcubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIEFyYWJpYyAoQWxnZXJpYSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDE0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBcmFiaWMgKEFsZ2VyaWEpIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJhcnMiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJBbGdlcmlhIikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvYXJpLm5scyBiL29sZS9ubHMvYXJpLm5scwppbmRleCBmNzdjNmJiLi5jMjdjMDkwIDEwMDY0NAotLS0gYS9vbGUvbmxzL2FyaS5ubHMKKysrIGIvb2xlL25scy9hcmkubmxzCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICoJT0xFMk5MUyBsaWJyYXJ5Ci0gKiAgICAgIEFyYWJpYworICogICAgICBBcmFiaWMgKElyYXEpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwODAxIikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiQXJhYmljIChJcmFxKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiYXJpIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiSXJhcSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Fyay5ubHMgYi9vbGUvbmxzL2Fyay5ubHMKaW5kZXggZjI2NWI0OS4uNDc4OWQ5MSAxMDA2NDQKLS0tIGEvb2xlL25scy9hcmsubmxzCisrKyBiL29sZS9ubHMvYXJrLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBBcmFiaWMgKEt1d2FpdCkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDM0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBcmFiaWMgKEt1d2FpdCkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImFyayIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkt1d2FpdCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiS1dUIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2FybS5ubHMgYi9vbGUvbmxzL2FybS5ubHMKaW5kZXggNDVmMTdkMi4uMjU5OTIxMyAxMDA2NDQKLS0tIGEvb2xlL25scy9hcm0ubmxzCisrKyBiL29sZS9ubHMvYXJtLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBBcmFiaWMgKE1hcm9jY28pCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxODAxIikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiQXJhYmljIChNYXJvY2NvKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiYXJzIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiTWFyb2NjbyIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Fyby5ubHMgYi9vbGUvbmxzL2Fyby5ubHMKaW5kZXggZWVhZjY3ZC4uNTZmY2U3YyAxMDA2NDQKLS0tIGEvb2xlL25scy9hcm8ubmxzCisrKyBiL29sZS9ubHMvYXJvLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBBcmFiaWMgKE9tYW4pCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgyMDAxIikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiQXJhYmljIChPbWFuKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiYXJzIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiT21hbiIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2FycS5ubHMgYi9vbGUvbmxzL2FycS5ubHMKaW5kZXggNWU1MDIwYy4uMTFjNTFkMCAxMDA2NDQKLS0tIGEvb2xlL25scy9hcnEubmxzCisrKyBiL29sZS9ubHMvYXJxLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBBcmFiaWMgKFF1YXRhcikKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDQwMDEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBcmFiaWMgKFF1YXRhcikiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImFycSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlF1YXRhciIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Fycy5ubHMgYi9vbGUvbmxzL2Fycy5ubHMKaW5kZXggNGZjYmIzNS4uZWZlYjkyMSAxMDA2NDQKLS0tIGEvb2xlL25scy9hcnMubmxzCisrKyBiL29sZS9ubHMvYXJzLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBBcmFiaWMgKFN5cmlhKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MjgwMSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkFyYWJpYyAoU3lyaWEpIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJhcnMiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJTeXJpYSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2FydC5ubHMgYi9vbGUvbmxzL2FydC5ubHMKaW5kZXggNzNlYjg4NS4uMjJlNzAwOSAxMDA2NDQKLS0tIGEvb2xlL25scy9hcnQubmxzCisrKyBiL29sZS9ubHMvYXJ0Lm5scwpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqCU9MRTJOTFMgbGlicmFyeQotICogICAgICBBcmFiaWMgKFR1bmVzaWEpCisgKiAgICAgIEFyYWJpYyAoVHVuaXNpYSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDFjMDEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBcmFiaWMgKFR1bmlzaWEpIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJhcnQiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJUdW5pc2lhIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJUVU4iKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvYXJ1Lm5scyBiL29sZS9ubHMvYXJ1Lm5scwppbmRleCBkYjJjNTBlLi5iMzFmMmRlIDEwMDY0NAotLS0gYS9vbGUvbmxzL2FydS5ubHMKKysrIGIvb2xlL25scy9hcnUubmxzCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICoJT0xFMk5MUyBsaWJyYXJ5Ci0gKiAgICAgIEFyYWJpYyAoYXJ1KQorICogICAgICBBcmFiaWMgKFVBRSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDM4MDEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBcmFiaWMgKFVuaXRlZCBBcmFiIEVtaXJhdGVzKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiYXJ1IikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiKQogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDAxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9iZWwubmxzIGIvb2xlL25scy9iZWwubmxzCmluZGV4IDMyOGMyYWIuLmE0MTQxOTUgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvYmVsLm5scworKysgYi9vbGUvbmxzL2JlbC5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgQmVsYXJ1c2lhbgogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQyMyIpCiAvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkJlbGFydXNzaWFuIikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJCZWxhcnVzcyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiYmVsIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MjMiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Jnci5ubHMgYi9vbGUvbmxzL2Jnci5ubHMKaW5kZXggYWFhYWQzYi4uZjExMDBhZSAxMDA2NDQKLS0tIGEvb2xlL25scy9iZ3IubmxzCisrKyBiL29sZS9ubHMvYmdyLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBCdWxnYXJpYQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQwMiIpCiAvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJCdWxnYXJpYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImJnciIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkJ1bGdhcmlhIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJiZ3IiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwMiIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvY2F0Lm5scyBiL29sZS9ubHMvY2F0Lm5scwppbmRleCA4NDE1NjEwLi5hNjI3YTlhIDEwMDY0NAotLS0gYS9vbGUvbmxzL2NhdC5ubHMKKysrIGIvb2xlL25scy9jYXQubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBDYXRhbGFuCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDAzIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJDYXRhbOAiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkNhdGFsYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImNhdCIpCkBAIC0xMyw4ICsxMyw4IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJTcGFpbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRVNQIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJFc3BhbnlhIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDMiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjM0IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NMSVNULCIiKSAqLwpAQCAtMzgsMTQgKzM4LDE0IEBACiBMT0NWQUwoTE9DQUxFX1NEQVRFLCIvIikKIExPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQogTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJkZC9NTS95eXl5IikKLUxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQgZCBNTU1NIHl5eXkiKSAqLworTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCBkIE1NTU0geXl5eSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpCmRpZmYgLS1naXQgYS9vbGUvbmxzL2NodC5ubHMgYi9vbGUvbmxzL2NodC5ubHMKaW5kZXggOWRhZmQ0ZC4uZmQ1Yjg3NSAxMDA2NDQKLS0tIGEvb2xlL25scy9jaHQubmxzCisrKyBiL29sZS9ubHMvY2h0Lm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBDaGluZXNlIChUYWl3YW4pCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDA0IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkNoaW5lc2UgKFRhaXdhbikiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkNoaW5lc2UgKFRhaXdhbikiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImNodCIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkNoaW5hIChUYWl3YW4pIikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwNCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvY3plLm5scyBiL29sZS9ubHMvY3plLm5scwppbmRleCA0MGJmMzhkLi5lNDdlOTMyIDEwMDY0NAotLS0gYS9vbGUvbmxzL2N6ZS5ubHMKKysrIGIvb2xlL25scy9jemUubmxzCkBAIC00LDcgKzQsNyBAQAogICoJKEN6ZWNoIHN0cmluZ3MgaW4gaXNvLTg4NTktMikKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MDUiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiQ3plY2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImN6ZSIpCkBAIC0xNCw3ICsxNCw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJDemVjaCBSZXB1YmxpYyIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCLIZXNr4SBSZXB1Ymxpa2EiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDUiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQyIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODk1IikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MywxMCArNDMsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikKZGlmZiAtLWdpdCBhL29sZS9ubHMvZGFuLm5scyBiL29sZS9ubHMvZGFuLm5scwppbmRleCA2YmFlZmZmLi5lMGViYzJmIDEwMDY0NAotLS0gYS9vbGUvbmxzL2Rhbi5ubHMKKysrIGIvb2xlL25scy9kYW4ubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBEZW5tYXJrCiAgKi8KIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjYiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQwNiIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRGFuc2siKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkRhbmlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZGFuIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkRlbm1hcmsiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkRLIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJEYW5tYXJrIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiNiIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwNiIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDUiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZGVhLm5scyBiL29sZS9ubHMvZGVhLm5scwppbmRleCAzNWMzZWIwLi5mNjYyMTg5IDEwMDY0NAotLS0gYS9vbGUvbmxzL2RlYS5ubHMKKysrIGIvb2xlL25scy9kZWEubmxzCkBAIC0zLDkgKzMsOSBAQAogICogICAgICBBdXN0cmlhCiAgKi8KICAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDBjMDciKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkRldXRzY2giKQotTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkdlcm1hbiIpCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiR2VybWFuIChBdXN0cmlhKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZGVhIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCLWc3RlcnJlaWNoIikKIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQxIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkF1c3RyaWEiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkFUUyIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwi1nN0ZXJyZWljaCIpCi1MT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDciKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQxIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2RlYy5ubHMgYi9vbGUvbmxzL2RlYy5ubHMKaW5kZXggZWQyYjBhMC4uODMzOTdiMSAxMDA2NDQKLS0tIGEvb2xlL25scy9kZWMubmxzCisrKyBiL29sZS9ubHMvZGVjLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgRnVlcnN0ZW50dW0gTGllY2h0ZW5zdGVpbgogICovCiAgCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxNDA3IikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJEZXV0c2NoIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJHZXJtYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImRlYyIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJMaWVjaHRlbnN0ZWluIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJMSUUiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkxpZWNodGVuc3RlaW4iKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDA3IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI0MSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9kZWwubmxzIGIvb2xlL25scy9kZWwubmxzCmluZGV4IDcwMzA3YTYuLjkyNTI5MzIgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZGVsLm5scworKysgYi9vbGUvbmxzL2RlbC5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIEx1eGVtYm91cmcgKEdlcm1hbikKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxMDA3IikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJEZXV0c2NoIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJHZXJtYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImRldSIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJMdXhlbWJ1cmciKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkxVWCIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiTHV4ZW1ib3VyZyIpCi1MT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDciKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ5IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Rlcy5ubHMgYi9vbGUvbmxzL2Rlcy5ubHMKaW5kZXggNjFlNWFlNy4uMGE3ZGQwYSAxMDA2NDQKLS0tIGEvb2xlL25scy9kZXMubmxzCisrKyBiL29sZS9ubHMvZGVzLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgU3dpdHplcmxhbmQgKEdlcm1hbikKICAqLwogIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDgwNyIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRGV1dHNjaCIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiR2VybWFuIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJkZXMiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiU3dpdHplcmxhbmQiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIlNnIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJTY2h3ZWl6IikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDgwNyIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDEiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZGV1Lm5scyBiL29sZS9ubHMvZGV1Lm5scwppbmRleCA3Yjk5ZGU3Li45MDFmNTM5IDEwMDY0NAotLS0gYS9vbGUvbmxzL2RldS5ubHMKKysrIGIvb2xlL25scy9kZXUubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBHZXJtYW55CiAgKi8KIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQwNyIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRGV1dHNjaCIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiR2VybWFuIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJkZXUiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiR2VybWFueSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRGUiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkRldXRzY2hsYW5kIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwNyIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZW1wdHkubmxzIGIvb2xlL25scy9lbXB0eS5ubHMKaW5kZXggNzY0ODU2OS4uNjQ2NjI4YSAxMDA2NDQKLS0tIGEvb2xlL25scy9lbXB0eS5ubHMKKysrIGIvb2xlL25scy9lbXB0eS5ubHMKQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKKy8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCisvKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbmEubmxzIGIvb2xlL25scy9lbmEubmxzCmluZGV4IGYzZmEwMWEuLjgyMTMyMDUgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW5hLm5scworKysgYi9vbGUvbmxzL2VuYS5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIEF1c3RyYWxpYQogICovCiAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDgwOSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjB4MGMwOSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIkVuZ2xpc2ggKEF1c3RyYWxpYSkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJFbmdsaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAiZW5hIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksICJBdXN0cmFsaWEiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsICJBVVMiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJBdXN0cmFsaWEiKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDgwOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIweDA0MDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICI0NCIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI4NTAiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbmIubmxzIGIvb2xlL25scy9lbmIubmxzCmluZGV4IGYxYjU5YjEuLjc0YjA1YmQgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW5iLm5scworKysgYi9vbGUvbmxzL2VuYi5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIENhcmliYmVhbgogICovCiAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDgwOSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjB4MjQwOSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIkVuZ2xpc2ggKENhcmliYmVhbikiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJFbmdsaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAiZW5iIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksICJDYXJpYmJlYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsICJDQVIiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJDYXJyaWJlYW4iKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDgwOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIweDI0MDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICI0NCIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI4NTAiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbmMubmxzIGIvb2xlL25scy9lbmMubmxzCmluZGV4IDlkOTJlZTMuLjE4NzY2ZDYgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW5jLm5scworKysgYi9vbGUvbmxzL2VuYy5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIENhbmFkYSAoRW5nbGlzaCkKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA0MDkiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIweDEwMDkiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChDYW5hZGEpIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgImVuYyIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiQ2FuYWRhIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiQ0FOIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCAiQ2FuYWRhIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjA0MDkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMHgwNDA5IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiMSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI0MzciKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbmcubmxzIGIvb2xlL25scy9lbmcubmxzCmluZGV4IDhiZDI5ODcuLjdjYzdjODcgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW5nLm5scworKysgYi9vbGUvbmxzL2VuZy5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFVuaXRlZCBLaW5nZG9tCiAgKi8KIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIwODA5IikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMHgwODA5IikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCAiRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgImVuZyIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiVW5pdGVkIEtpbmdkb20iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsICJHQlIiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJVbml0ZWQgS2luZ2RvbSIpCi1MT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIwODA5IikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjB4MDQwOSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwgIjQ0IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwgIjg1MCIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCAiMTI1MiIpCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Vuai5ubHMgYi9vbGUvbmxzL2Vuai5ubHMKaW5kZXggYWVmMTNiNy4uZmEzNDc5NyAxMDA2NDQKLS0tIGEvb2xlL25scy9lbmoubmxzCisrKyBiL29sZS9ubHMvZW5qLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgSmFtYWljYQogICovCiAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDgwOSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjB4MjAwOSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIkVuZ2xpc2ggKEphbWFpY2EpIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgImVuaiIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiSmFtYWljYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwgIkpBTSIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwgIkphbWFpY2EiKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDgwOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIweDA0MDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICI0NCIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI4NTAiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbmwubmxzIGIvb2xlL25scy9lbmwubmxzCmluZGV4IDgwMjgxNGEuLjIxYzlhMGIgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW5sLm5scworKysgYi9vbGUvbmxzL2VubC5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgRW5nbGlzaCBCZWxpemUKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA0MDkiKQotTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjB4MjgwOSIpCitMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIkVuZ2xpc2ggKEJlbGl6ZSkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJFbmdsaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAiZW5sIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCAiRW5nbGlzaCIpCiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCAiMSIpCi1MT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyIpCi1MT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyIpCi1MT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwgIlVTQSIpCi1MT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwgIlVuaXRlZCBTdGF0ZXMiKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDQwOSIpCitMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCAiQmVsaXplIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksICJCZWxpemUiKQorLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsICIiKSAqLworTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJCZWxpemUiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMHgwNDA5IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiMSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI0MzciKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbnMubmxzIGIvb2xlL25scy9lbnMubmxzCmluZGV4IDA3YThlOGMuLjM2MWExMTAgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW5zLm5scworKysgYi9vbGUvbmxzL2Vucy5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFNvdXRoIEFmcmljYSAoRW5nbGlzaCkKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA4MDkiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIweDFjMDkiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChTb3V0aCBBZnJpY2EpIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgImVucyIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiU291dGggQWZyaWNhIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiWkFGIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCAiU291dGggQWZyaWNhIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjA4MDkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMHgwNDA5IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiNDQiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCAiODUwIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsICIxMjUyIikKZGlmZiAtLWdpdCBhL29sZS9ubHMvZW50Lm5scyBiL29sZS9ubHMvZW50Lm5scwppbmRleCA0YjllYzYzLi5kNjgyMWFiIDEwMDY0NAotLS0gYS9vbGUvbmxzL2VudC5ubHMKKysrIGIvb2xlL25scy9lbnQubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIFRyaW5pZGFkICYgVG9iYWdvCiAgKi8KIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIwNDA5IikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMHgyYzA5IikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCAiRW5nbGlzaCAoVHJpbmlkYWQgJiBUb2JhZ28pIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgImVudCIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwgIkVuZ2xpc2giKQotTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwgIjEiKQorLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwgIiIpICovCiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCAiVHJpbmlkYWQgJiBUb2JhZ28iKQogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwgIlRyaW5pZGFkICYgVG9iYWdvIikKLUxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiVVNBIikKLUxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCAiVW5pdGVkIFN0YXRlcyIpCi1MT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIwNDA5IikKKy8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCAiVHJpbmlkYWQgJiBUb2JhZ28iKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMHgyYzA5IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiMSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI0MzciKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbnUubmxzIGIvb2xlL25scy9lbnUubmxzCmluZGV4IDcxOGYyZjMuLjY0NDEzNjQgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW51Lm5scworKysgYi9vbGUvbmxzL2VudS5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFVuaXRlZCBTdGF0ZXMKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA0MDkiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIweDA0MDkiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwgIkVuZ2xpc2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsICJlbnUiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwgIlVuaXRlZCBTdGF0ZXMiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsICJVU0EiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJVbml0ZWQgU3RhdGVzIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjA0MDkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMHgwNDA5IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiMSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI0MzciKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lbnoubmxzIGIvb2xlL25scy9lbnoubmxzCmluZGV4IDg2OWI3OWIuLjVjZmZlMWQgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZW56Lm5scworKysgYi9vbGUvbmxzL2Vuei5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgTmV3IFplYWxhbmQKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA4MDkiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIweDE0MDkiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChOZXcgWmVhbGFuZCkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJFbmdsaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAiZW56IikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCAiRW5nbGlzaCIpCi1MT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCAiNDQiKQorLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwgIiIpICovCiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCAiTmV3IFplYWxhbmQiKQogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwgIk5ldyBaZWFsYW5kIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiTlpMIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCAiTmV3IFplYWxhbmQiKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDgwOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIweDA0MDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICI0NCIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI4NTAiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9lc2EubmxzIGIvb2xlL25scy9lc2EubmxzCmluZGV4IGE0MTY4NjYuLjY3YTBjYjkgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZXNhLm5scworKysgYi9vbGUvbmxzL2VzYS5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFNwYW5pc2ggKFBhbmFtYSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDE4MGEiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGHxb2wiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlNwYW5pc2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzYSIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJQYW5hbWEiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIlBBTiIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiUGFuYW3hIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9lc2IubmxzIGIvb2xlL25scy9lc2IubmxzCmluZGV4IGVhZTIyODMuLjU1NTU5ZTMgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZXNiLm5scworKysgYi9vbGUvbmxzL2VzYi5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFNwYW5pc2ggKEJvbGl2aWEpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHg0MDBhIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJlc2IiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiQm9saXZpYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiQk9MIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJCb2xpdmlhIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9lc2MubmxzIGIvb2xlL25scy9lc2MubmxzCmluZGV4IDQ4YWM0ZmMuLjkzMWQwYjYgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZXNjLm5scworKysgYi9vbGUvbmxzL2VzYy5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFNwYW5pc2ggKENvc3RhIFJpY2EpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxNDBhIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJlc2EiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiQ29zdGEgUmljYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiQ1JJIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJDb3N0YSBSaWNhIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgxNDBhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIExPQ1ZBTChMT0NBTEVfUzExNTksICJBTSIpCmRpZmYgLS1naXQgYS9vbGUvbmxzL2VzZC5ubHMgYi9vbGUvbmxzL2VzZC5ubHMKaW5kZXggNDAzNjE0MS4uOGFkMTgxNSAxMDA2NDQKLS0tIGEvb2xlL25scy9lc2QubmxzCisrKyBiL29sZS9ubHMvZXNkLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MWMwYSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwYfFvbCIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZXNkIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkRvbWluaWNhbiBSZXB1YmxpYyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRE1BIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJSZXD6YmxpY2EgRG9taW5pY2FuYSIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXNlLm5scyBiL29sZS9ubHMvZXNlLm5scwppbmRleCA5N2NiMDkyLi4xM2Q5YmJiIDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzZS5ubHMKKysrIGIvb2xlL25scy9lc2UubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBTcGFuaXNoIChFbCBTYWx2YWRvcikKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDQ0MGEiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGHxb2wiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlNwYW5pc2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzZSIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJFbCBTYWx2YWRvciIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiU1ZEIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJFbCBTYWx2YWRvciIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXNmLm5scyBiL29sZS9ubHMvZXNmLm5scwppbmRleCAyNzg0MTk2Li4xMjYxY2UxIDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzZi5ubHMKKysrIGIvb2xlL25scy9lc2YubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBTcGFuaXNoIChFY3VhZG9yKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MzAwYSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwYfFvbCIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZXNmIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkVjdWFkb3IiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkVDVSIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiRWN1YWRvciIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXNnLm5scyBiL29sZS9ubHMvZXNnLm5scwppbmRleCAwNzNjNTg4Li42ZjQwZTk0IDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzZy5ubHMKKysrIGIvb2xlL25scy9lc2cubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBTcGFuaXNoIChHdWF0ZW1hbGEpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxMDBhIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJlc2ciKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiR3VhdGVtYWxhIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJHVE0iKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkd1YXRlbWFsYSIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXNoLm5scyBiL29sZS9ubHMvZXNoLm5scwppbmRleCA0NmFkYjFjLi41Y2NkMTQ0IDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzaC5ubHMKKysrIGIvb2xlL25scy9lc2gubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBTcGFuaXNoIChIb25kdXJhcykKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDQ4MGEiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGHxb2wiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlNwYW5pc2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzaCIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJIb25kdXJhcyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiSE5EIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJIb25kdXJhcyIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KQEAgLTQzLDEwICs0MywxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9lc2kubmxzIGIvb2xlL25scy9lc2kubmxzCmluZGV4IDBjYTgyZDMuLjlmOGM2OGUgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZXNpLm5scworKysgYi9vbGUvbmxzL2VzaS5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFNwYW5pc2ggKE5pY2FyYWd1YSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDRjMGEiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGHxb2wiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlNwYW5pc2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzaSIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJOaWNhcmFndWEiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIk5JQyIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiTmljYXJhZ3VhIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9lc2wubmxzIGIvb2xlL25scy9lc2wubmxzCmluZGV4IDJmOTMzOWEuLmYzYTBlYjEgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZXNsLm5scworKysgYi9vbGUvbmxzL2VzbC5ubHMKQEAgLTMsMTkgKzMsMTkgQEAKICAqICAgICAgU3BhbmlzaCAoQ2hpbGUpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCi1MT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiU3BhbmlzaCAoQ2hpbGUpIikKLUxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDM0MGEiKQorTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGHxb2wgKENoaWxlKSIpCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCAoQ2hpbGUpIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJlc2wiKQotTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkVzcGGAb2wiKQorTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkVzcGHxb2wiKQogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJDaGlsZSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJDaGlsZSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiQ0hMIikKLS8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJDaGlsZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiQ2hpbGUiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTElTVCwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIiIpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KQEAgLTU3LDIxICs1NywyMSBAQAogCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwibHVuZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIm1hcnRlcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywibWk/cmNvbGVzIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJtaelyY29sZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsImp1ZXZlcyIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwidmllcm5lcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwicz9hYmFkbyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwic+FiYWRvIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJkb21pbmdvIikKIAotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1biIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwibWFyIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtaT8iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsImp1ZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidmllIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIiIpICovCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwibHVuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJtYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIm1p6SIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwianVlIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJ2aWUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsInPhYiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiZG9tIikKIAotLyogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsImVuZXJvIikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsImZlYnJlcm8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywibWFyem8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiYWJyaWwiKQpAQCAtOTksOCArOTksOCBAQAogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsImRpYyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKIAotLyogTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIiIpICovCitMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2VzbS5ubHMgYi9vbGUvbmxzL2VzbS5ubHMKaW5kZXggNjk5MDU5NC4uZjdkZmRlNCAxMDA2NDQKLS0tIGEvb2xlL25scy9lc20ubmxzCisrKyBiL29sZS9ubHMvZXNtLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgTWV4aWNvCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwODBhIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIChNZXhpY28pIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIChNZXhpY28pIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJlc20iKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiTWV4aWNvIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJNeCIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiTWV4aWNvIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9lc24ubmxzIGIvb2xlL25scy9lc24ubmxzCmluZGV4IDY4MGYwNDguLmJkMWIwOTAgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZXNuLm5scworKysgYi9vbGUvbmxzL2Vzbi5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgU3BhbmlzaCAoTW9kZXJuIFNvcnQpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwYzBhIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIC0gTW9kZXJuIFNvcnQiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzbiIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRXNwYfFvbCAoTW9kZXJubykiKQogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJFc3Bh8WEiKQogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiU3BhaW4iKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkVzIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJFU1AiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkVzcGHxYSIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXNvLm5scyBiL29sZS9ubHMvZXNvLm5scwppbmRleCA4NzgwMTA1Li4xYmZlMGYwIDEwMDY0NAotLS0gYS9vbGUvbmxzL2Vzby5ubHMKKysrIGIvb2xlL25scy9lc28ubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIFNwYW5pc2ggKENvbG9tYmlhKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi1MT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgyNDBhIikKK0xPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIChDb2xvbWJpYSkiKQorTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlNwYW5pc2ggKENvbG9tYmlhKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZXNnIikKLUxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJFc3BhgG9sIikKK0xPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJFc3Bh8W9sIikKIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJDb2xvbWJpYSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJDb2xvbWJpYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiQ09MIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJDb2xvbWJpYSIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KQEAgLTU3LDIxICs1NywyMSBAQAogCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwibHVuZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIm1hcnRlcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywibWk/cmNvbGVzIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJtaelyY29sZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsImp1ZXZlcyIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwidmllcm5lcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwicz9hYmFkbyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwic+FiYWRvIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJkb21pbmdvIikKIAotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1biIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwibWFyIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtaT8iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsImp1ZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidmllIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIiIpICovCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwibHVuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJtYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIm1p6SIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwianVlIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJ2aWUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsInPhYiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiZG9tIikKIAotLyogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsImVuZXJvIikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsImZlYnJlcm8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywibWFyem8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiYWJyaWwiKQpAQCAtOTksOCArOTksOCBAQAogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsImRpYyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKIAotLyogTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIiIpICovCitMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIiIpICovCkBAIC0xMDgsNCArMTA4LDMgQEAKIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIiKSAqLwogCi0vKiBjYWxlbmRhcmlvIGdyZWdvcmlhbm8gKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXNwLm5scyBiL29sZS9ubHMvZXNwLm5scwppbmRleCBkYmJjMGYzLi44N2I1OWRhIDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzcC5ubHMKKysrIGIvb2xlL25scy9lc3AubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBTcGFuaXNoIChUcmFkaXRpb25hbCBTb3J0KQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQwYSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwYfFvbCIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCAtIFRyYWRpdGlvbmFsIFNvcnQiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzcCIpCkBAIC0xMSw5ICsxMSw5IEBACiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiRXNwYfFhIikKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlNwYWluIikKLUxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJFcyIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRVNQIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJFc3Bh8WEiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2VzcGVyYW50by5ubHMgYi9vbGUvbmxzL2VzcGVyYW50by5ubHMKaW5kZXggNjYxMWEzYy4uNThjZDgwMSAxMDA2NDQKLS0tIGEvb2xlL25scy9lc3BlcmFudG8ubmxzCisrKyBiL29sZS9ubHMvZXNwZXJhbnRvLm5scwpAQCAtNSw5ICs1LDEzIEBACiAgKiAgICAgIEVzcGVyYW50byBzZWVtcyBub3QgdG8gYmUgc3VwcG9ydGVkIGJ5IFdpbmRvd3MKICAqCiAgKiAgICAgIFRPRE86IElTTyBudW1lcmljYWwgSUQgZm9yIGxhbmd1YWdlID8KKyAqCisgKglJIGNob29zZSAweDhmIGZvciBlc3BlcmFudG8gbGFuZ3VhZ2UgYXMgaXQgaXMgaGlnaCBlbm91Z2gKKyAqCW5vdCB0byBiZSBhdHRyaWJ1dGVkIHRvIGFub3RoZXIgbGFuZ3VhZ2UgaW4gdGhlIGltbWVkaWF0ZQorICoJZnV0dXJlIChhcyBvZiAxOTk4MDkwMSB0aGUgbGFzdCBvZmZpY2lhbCBsYW5ndWFnZUlEIGlzIDB4NTEpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQ4ZiIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwZXJhbnRvIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJFc3BlcmFudG8iKQogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImRldSIpICovCkBAIC0xNyw3ICsyMSw3IEBACiAvKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgSVNPIElEIG9mIGxhbmcgVE9ETyAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0OGYiKSAvKiBJU08gSUQgb2YgbGFuZyBUT0RPICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiMyIpIC8qIGlzIHRoaXMgcmlnaHQ/IFRPRE8gKi8KIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsIjMiKSAvKiBpcyB0aGlzIHJpZ2h0PyBUT0RPICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Vzci5ubHMgYi9vbGUvbmxzL2Vzci5ubHMKaW5kZXggMzYwMjdhZi4uNWE3NTZkZCAxMDA2NDQKLS0tIGEvb2xlL25scy9lc3IubmxzCisrKyBiL29sZS9ubHMvZXNyLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBTcGFuaXNoIChQZXJ1KQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi1MT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgyODBhIikKK0xPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIChQZXL6KSIpCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCAoUGVydSkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzZiIpCi1MT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRXNwYYBvbCIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRXNwYfFvbCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwotTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiUGVydSIpCitMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJQZXL6IikKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlBlcnUiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIlBFUiIpCi1MT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiUGVydSIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiUGVy+iIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KQEAgLTU3LDIxICs1NywyMSBAQAogCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwibHVuZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIm1hcnRlcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywibWk/cmNvbGVzIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJtaelyY29sZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsImp1ZXZlcyIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwidmllcm5lcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwicz9hYmFkbyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwic+FiYWRvIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJkb21pbmdvIikKIAotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1biIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwibWFyIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtaT8iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsImp1ZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidmllIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIiIpICovCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwibHVuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJtYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIm1p6SIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwianVlIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJ2aWUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsInPhYiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiZG9tIikKIAotLyogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsImVuZXJvIikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsImZlYnJlcm8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywibWFyem8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiYWJyaWwiKQpAQCAtOTksOCArOTksOCBAQAogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsImRpYyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKIAotLyogTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIiIpICovCitMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIiIpICovCkBAIC0xMDgsNCArMTA4LDMgQEAKIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIiKSAqLwogCi0vKiBjYWxlbmRhcmlvIGdyZWdvcmlhbm8gKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXNzLm5scyBiL29sZS9ubHMvZXNzLm5scwppbmRleCA2YmVhNzgxLi41NDVhMzJhIDEwMDY0NAotLS0gYS9vbGUvbmxzL2Vzcy5ubHMKKysrIGIvb2xlL25scy9lc3MubmxzCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICoJT0xFMk5MUyBsaWJyYXJ5Ci0gKiAgICAgIFNwYW5pc2ggKEFyZ2VudGluaWEpCisgKiAgICAgIFNwYW5pc2ggKEFyZ2VudGluYSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlNwYW5pc2giKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MmMwYSIpCitMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwYfFvbCAoQXJnZW50aW5hKSIpCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCAoQXJnZW50aW5hKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZXNnIikKLUxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJFc3BhgG9sIikKK0xPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJFc3Bh8W9sIikKIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCi1MT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJBcmdlbnRpbmlhIikKLUxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkFyZ2VudGluaWEiKQorTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiQXJnZW50aW5hIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkFyZ2VudGluYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiQVJHIikKLUxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJBcmdlbnRpbmlhIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJBcmdlbnRpbmEiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIkFNIikKQEAgLTU3LDIxICs1NywyMSBAQAogCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwibHVuZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIm1hcnRlcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywibWk/cmNvbGVzIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJtaelyY29sZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsImp1ZXZlcyIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwidmllcm5lcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwicz9hYmFkbyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwic+FiYWRvIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJkb21pbmdvIikKIAotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1biIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwibWFyIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtaT8iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsImp1ZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidmllIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIiIpICovCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwibHVuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJtYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIm1p6SIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwianVlIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJ2aWUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsInPhYiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiZG9tIikKIAotLyogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsImVuZXJvIikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsImZlYnJlcm8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywibWFyem8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiYWJyaWwiKQpAQCAtOTksOCArOTksOCBAQAogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsImRpYyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKIAotLyogTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIiIpICovCitMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIiIpICovCkBAIC0xMDgsNCArMTA4LDMgQEAKIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIiKSAqLwogCi0vKiBjYWxlbmRhcmlvIGdyZWdvcmlhbm8gKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXN0Lm5scyBiL29sZS9ubHMvZXN0Lm5scwppbmRleCA3YTI5NDY1Li5mZDBiNDkxIDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzdC5ubHMKKysrIGIvb2xlL25scy9lc3QubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBFc3RvbmlhCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDI1IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkVzdG9uaWFuIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJlc3QiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiRXN0b25pYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRWUiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQyNSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXN1Lm5scyBiL29sZS9ubHMvZXN1Lm5scwppbmRleCA1MGU5ZGZmLi42OTAxYmM0IDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzdS5ubHMKKysrIGIvb2xlL25scy9lc3UubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBTcGFuaXNoIChQdWVydG8gUmljbykKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDUwMGEiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGHxb2wgKFB1ZXJ0byBSaWNvKSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCAoUHVlcnRvIFJpY28pIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJlc3UiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiUHVlcnRvIFJpY28iKQogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiUHVlcnRvIFJpY28iKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2Vzdi5ubHMgYi9vbGUvbmxzL2Vzdi5ubHMKaW5kZXggZGFjNjM5ZS4uYzQ2OWJiZiAxMDA2NDQKLS0tIGEvb2xlL25scy9lc3YubmxzCisrKyBiL29sZS9ubHMvZXN2Lm5scwpAQCAtMywxOSArMywxOSBAQAogICogICAgICBTcGFuaXNoIChWZW5lenVlbGEpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KLUxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDIwMGEiKQorTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGHxb2wgKFZlbmV6dWVsYSkiKQorTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlNwYW5pc2ggKFZlbmV6dWVsYSkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzdiIpCi1MT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRXNwYYBvbCIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRXNwYfFvbCAoVmVuZXp1ZWxhKSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiVmVuZXp1ZWxhIikKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlZlbmV6dWVsYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiVkVOIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJWZW5lenVlbGEiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTElTVCwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIiIpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KQEAgLTU3LDIxICs1NywyMSBAQAogCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwibHVuZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIm1hcnRlcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywibWk/cmNvbGVzIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJtaelyY29sZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsImp1ZXZlcyIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwidmllcm5lcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwicz9hYmFkbyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwic+FiYWRvIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJkb21pbmdvIikKIAotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1biIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwibWFyIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtaT8iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsImp1ZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidmllIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIiIpICovCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwibHVuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJtYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIm1p6SIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwianVlIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJ2aWUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsInPhYiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiZG9tIikKIAotLyogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsImVuZXJvIikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsImZlYnJlcm8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywibWFyem8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiYWJyaWwiKQpAQCAtOTksOCArOTksOCBAQAogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsImRpYyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKIAotLyogTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIiIpICovCitMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIiIpICovCkBAIC0xMDgsNCArMTA4LDMgQEAKIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIiKSAqLwogCi0vKiBjYWxlbmRhcmlvIGdyZWdvcmlhbm8gKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZXN5Lm5scyBiL29sZS9ubHMvZXN5Lm5scwppbmRleCAyZjhiOWFjLi45OThkYzYwIDEwMDY0NAotLS0gYS9vbGUvbmxzL2VzeS5ubHMKKysrIGIvb2xlL25scy9lc3kubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIFNwYW5pc2ggKFVydWd1YXkpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCi1MT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwYYBvbCIpCi1MT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgzODBhIikKK0xPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3Bh8W9sIChVcnVndWF5KSIpCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3BhbmlzaCAoVXJ1Z3VheSkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzeSIpCi1MT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiVXJ1Z3VheSIpCi0vKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJFc3Bh8W9sIChVcnVndWF5KSIpCitMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCI1OTgiKQorTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiVXJ1Z3VheSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJVcnVndWF5IikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJVUlkiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlVydWd1YXkiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDM4MGEiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtMjYsOCArMjYsOCBAQAogLyogTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKSAqLwogTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTLCAiMDEyMzQ1Njc4OSIpCi1MT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiTlUkIikKLUxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wsICJVWVUiKQorTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksIlUkUyIpCitMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MLCAiVVlQIikKIC8qIExPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVAsIiwiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVAsIi4iKSAqLwogTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcsIjM7MCIpCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KQEAgLTU3LDE5ICs1NywxOSBAQAogCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwibHVuZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIm1hcnRlcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywibWk/cmNvbGVzIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJtaelyY29sZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsImp1ZXZlcyIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwidmllcm5lcyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwicz9hYmFkbyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwic+FiYWRvIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJkb21pbmdvIikKIAotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1biIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwibWFyIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtaT8iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsImp1ZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidmllIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIiIpICovCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwibHVuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJtYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIm1p6SIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwianVlIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJ2aWUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsInPhYiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiZG9tIikKIAogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiZW5lcm8iKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwiZmVicmVybyIpCkBAIC05OSw4ICs5OSw4IEBACiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiZGljIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQogCi0vKiBMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwgIiIpCitMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKIC8qIExPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOLCAiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOLCAiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTLCAiIikgKi8KQEAgLTEwOCw0ICsxMDgsMyBAQAogLyogTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMsICIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSwgIiIpICovCiAKLS8qIGNhbGVuZGFyaW8gZ3JlZ29yaWFubyAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9lc3oubmxzIGIvb2xlL25scy9lc3oubmxzCmluZGV4IDAxYWQzMTguLjhmNmZiNGYgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZXN6Lm5scworKysgYi9vbGUvbmxzL2Vzei5ubHMKQEAgLTMsMTkgKzMsMjAgQEAKICAqICAgICAgU3BhbmlzaCAoUGFyYWd1YXkpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KLUxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIikKKworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4M2MwYSIpCitMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwYfFvbCAoUGFyYWd1YXkpIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTcGFuaXNoIChQYXJhZ3VheSkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVzeiIpCi1MT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiUGFyYWd1YXkiKQorTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkVzcGHxb2wgKFBhcmFndWF5KSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIlBhcmFndWF5IikKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlBhcmFndWF5IikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJQUlkiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlBhcmFndWF5IikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0xJU1QsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIiKSAqLwpAQCAtNDIsMTAgKzQzLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCkBAIC01NywxOSArNTgsMTkgQEAKIAogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsImx1bmVzIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJtYXJ0ZXMiKQotTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIm1pP3Jjb2xlcyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywibWnpcmNvbGVzIikKIExPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJqdWV2ZXMiKQogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsInZpZXJuZXMiKQotTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsInM/YWJhZG8iKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsInPhYmFkbyIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiZG9taW5nbyIpCiAKLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJsdW4iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIm1hciIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywibWk/IikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJqdWUiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsInZpZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCIiKSAqLworTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1biIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwibWFyIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtaekiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsImp1ZSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidmllIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJz4WIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsImRvbSIpCiAKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsImVuZXJvIikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsImZlYnJlcm8iKQpAQCAtOTksOCArMTAwLDggQEAKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJkaWMiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCiAKLS8qIExPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwgIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICIiKSAqLworTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikKK0xPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIi0iKQogLyogTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sICIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04sICIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsICIiKSAqLwpAQCAtMTA4LDQgKzEwOSwzIEBACiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUywgIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiIikgKi8KIAotLyogY2FsZW5kYXJpbyBncmVnb3JpYW5vICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2V1cS5ubHMgYi9vbGUvbmxzL2V1cS5ubHMKaW5kZXggYzY2MzlmZS4uY2M5Mzk3YyAxMDA2NDQKLS0tIGEvb2xlL25scy9ldXEubmxzCisrKyBiL29sZS9ubHMvZXVxLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgQmFzcXVlCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNGQyIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFdXNrYXJhIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJCYXNxdWUiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImV1cSIpCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KQEAgLTYzLDEzICs2MywxMyBAQAogTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsImxhcnVuYmF0YSIpCiBMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiaWdhbmRlYSIpCiAKLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJsdW4iKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIm1hciIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywibWk/IikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJqdWUiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsInZpZSIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCIiKSAqLworTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImxlaCIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwiYXJ0IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJhemsiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsInRlZyIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwidGlyIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJsYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsImlnYSIpCiAKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsInVydGFycmlsYSIpCiBMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJvdHNhaWxhIikKZGlmZiAtLWdpdCBhL29sZS9ubHMvZmluLm5scyBiL29sZS9ubHMvZmluLm5scwppbmRleCA2Y2Q5NTRjLi4xYWVkOGRmIDEwMDY0NAotLS0gYS9vbGUvbmxzL2Zpbi5ubHMKKysrIGIvb2xlL25scy9maW4ubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIEZpbmxhbmQKICAqLwogIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjExIikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MGIiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIlN1b21pIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJGaW5uaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJmaW4iKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsInN1b21pIikKLUxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQ5IikKK0xPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjM1OCIpCiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJTdW9taSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJGaW5sYW5kIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJGaW4iKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlN1b21pIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMTEiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGIiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjM1OCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9mb3MubmxzIGIvb2xlL25scy9mb3MubmxzCmluZGV4IDFlY2U4YzYuLjU5NzUxM2QgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZm9zLm5scworKysgYi9vbGUvbmxzL2Zvcy5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgRmFyb2UgSXNsYW5kcwogICovCiAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKLUxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQzOCIpCisvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJGYXJvZXNlIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJmb3MiKQotTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsImY/cm95c2t0IikKK0xPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJm5nJveXNrdCIpCiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIyOTgiKQogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkZhcm9lIElzbGFuZHMiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkZSUyIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiRnJveWFyIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQzOCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDAiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvZnJhLm5scyBiL29sZS9ubHMvZnJhLm5scwppbmRleCBlYjQxYzA3Li5iZGY1MTY3IDEwMDY0NAotLS0gYS9vbGUvbmxzL2ZyYS5ubHMKKysrIGIvb2xlL25scy9mcmEubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBGcmFuY2UKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MGMiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkZyYW7nYWlzIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJGcmVuY2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImZyYSIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJGcmFuY2UiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkZSQSIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiRnJhbmNlIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBjIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9mcmIubmxzIGIvb2xlL25scy9mcmIubmxzCmluZGV4IGRiYmQ3YjYuLjMyYzE3NmQgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZnJiLm5scworKysgYi9vbGUvbmxzL2ZyYi5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIEJlbGdpdW0KICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA4MGMiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkZyYW7nYWlzIChCZWxnaXF1ZSkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkZyZW5jaCAoQmVsZ2l1bSkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImZyYiIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJCZWxnaXVtIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJCRUwiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkJlbGdpcXVlIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBjIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9mcmMubmxzIGIvb2xlL25scy9mcmMubmxzCmluZGV4IGZmY2RkNDYuLmIyMDg4MjAgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZnJjLm5scworKysgYi9vbGUvbmxzL2ZyYy5ubHMKQEAgLTMsOSArMyw5IEBACiAgKiAgICAgIENhbmFkYSAoRnJlbmNoKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi1MT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiRnJlbmNoIikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDBjMGMiKQorTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkZyYW7nYWlzIChDYW5hZGEpIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJGcmVuY2ggKENhbmFkYSkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImZyYyIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiZnJhbudhaXMiKQogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkNhbmFkYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiQ0FOIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJDYW5hZGEiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGMiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2ZybC5ubHMgYi9vbGUvbmxzL2ZybC5ubHMKaW5kZXggYjg1NzEyMy4uMTkxZWZmYiAxMDA2NDQKLS0tIGEvb2xlL25scy9mcmwubmxzCisrKyBiL29sZS9ubHMvZnJsLm5scwpAQCAtMyw5ICszLDkgQEAKICAqICAgICAgTHV4ZW1idXJnIChGcmVuY2gpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCi1MT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRnJhbudhaXMiKQotTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkZyZW5jaCIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxNDBjIikKK0xPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJGcmFu52FpcyAoTHV4ZW1ib3VyZykiKQorTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkZyZW5jaCAoTHV4ZW1ib3VyZykiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImZybCIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiZnJhbudhaXMiKQogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiMzUyIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkx1eGVtYnVyZyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiTFVYIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJMdXhlbWJvdXJnIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBjIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9mcnMubmxzIGIvb2xlL25scy9mcnMubmxzCmluZGV4IGE5NmEwMjAuLjdiYjdlMTcgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZnJzLm5scworKysgYi9vbGUvbmxzL2Zycy5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFN3aXR6ZXJsYW5kIChGcmVuY2gpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxMDBjIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJGcmFu52FpcyAoU3Vpc3NlKSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiRnJlbmNoIChTd2l0emVybGFuZCkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImZycyIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJTd2l0emVybGFuZCIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJTdWlzc2UiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGMiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2dyYy5ubHMgYi9vbGUvbmxzL2dyYy5ubHMKaW5kZXggNTRmODFhYS4uMzU3MTRhNiAxMDA2NDQKLS0tIGEvb2xlL25scy9ncmMubmxzCisrKyBiL29sZS9ubHMvZ3JjLm5scwpAQCAtNCw3ICs0LDcgQEAKICAqCShHcmVlayBzdHJpbmdzIGluIGlzby04ODU5LTcpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDA4IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkdyZWVrIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJncmMiKQpAQCAtMTQsNyArMTQsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiR3JlZWNlIikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQwOCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MywxMCArNDMsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvaHJ2Lm5scyBiL29sZS9ubHMvaHJ2Lm5scwppbmRleCBiOWY0MmU4Li5hYWM4YTlkIDEwMDY0NAotLS0gYS9vbGUvbmxzL2hydi5ubHMKKysrIGIvb2xlL25scy9ocnYubmxzCkBAIC00LDcgKzQsNyBAQAogICoJKENyb2F0aWFuIHN0cmluZ3MgaW4gaXNvLTg4NTktMikKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MWEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiQ3JvYXRpYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImhydiIpCkBAIC0xNCw3ICsxNCw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJDcm9hdGlhIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJIUlYiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkhydmF0c2thIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDFhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQzLDEwICs0MywxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpAQCAtNzksMTIgKzc5LDEyIEBACiBMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJtYWoiKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwianVuIikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsImp1bCIpCi1MT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJhdWd1c3QiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiYXVndXN0IikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksInNlcHRlbWJhciIpCiBMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwib2t0b2JhciIpCiBMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwibm92ZW1iYXIiKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsImRlY2VtYmFyIikKLUxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCIiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCiAKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsImphbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJmZWIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9odW4ubmxzIGIvb2xlL25scy9odW4ubmxzCmluZGV4IDliZWMwYjcuLjU0ODNkMDMgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvaHVuLm5scworKysgYi9vbGUvbmxzL2h1bi5ubHMKQEAgLTQsNyArNCw3IEBACiAgKgkoSHVuZ2FyaWFuIHN0cmluZ3MgaW4gaXNvLTg4NTktMikKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDBlIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJNYWd5YXIiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkh1bmdhcmlhbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiaHVuIikKQEAgLTE0LDcgKzE0LDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkh1bmdhcnkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkh1IikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJNYWd5YXJvcnN64WciKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDBlIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIzNiIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MiIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCI4NTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9pbmQubmxzIGIvb2xlL25scy9pbmQubmxzCmluZGV4IDdjOTYxMGYuLjI2YjI2OWEgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvaW5kLm5scworKysgYi9vbGUvbmxzL2luZC5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIEluZG9uZXNpYSAoQmFoYXNhKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQyMSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImluZCIpCkBAIC0xMyw3ICsxMyw3IEBACiAvKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9pcmwubmxzIGIvb2xlL25scy9pcmwubmxzCmluZGV4IGY3YjEyNjYuLmExMGYwZGYgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvaXJsLm5scworKysgYi9vbGUvbmxzL2lybC5ubHMKQEAgLTMsOCArMyw4IEBACiAgKiAgICAgIElyZWxhbmQKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA0MDkiKQotTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMHgxODA5IikKK0xPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCAiRW5nbGlzaCAoSXJlbGFuZCkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJFbmdsaXNoIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAiaXJsIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCAiRW5nbGlzaCIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiSXJlbGFuZCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwgIklSTCIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwgIkVpcmUiKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDQwOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIweDA0MDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICIzNTMiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCAiNDM3IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsICIxMjUyIikKZGlmZiAtLWdpdCBhL29sZS9ubHMvaXNsLm5scyBiL29sZS9ubHMvaXNsLm5scwppbmRleCAyYzc1NjIwLi4xY2RjNDhmIDEwMDY0NAotLS0gYS9vbGUvbmxzL2lzbC5ubHMKKysrIGIvb2xlL25scy9pc2wubmxzCkBAIC00LDcgKzQsNyBAQAogICoJKEljZWxhbmRpYyBzdHJpbmdzIGluIGlzby04ODU5LTEpCiAgKi8KIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQwZiIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwizXNsZW5zayIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiSWNlbGFuZGljIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJpc2wiKQpAQCAtMTQsOSArMTQsOSBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiSWNlbGFuZCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiSXMiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIs1zbGFuZCIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MGYiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjM1NCIpCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MSIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwogTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCiBMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKZGlmZiAtLWdpdCBhL29sZS9ubHMvaXRhLm5scyBiL29sZS9ubHMvaXRhLm5scwppbmRleCBjODc4YmUzLi4xZmZlNTI3IDEwMDY0NAotLS0gYS9vbGUvbmxzL2l0YS5ubHMKKysrIGIvb2xlL25scy9pdGEubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBJdGFseQogICovCiAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDQxMCIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiSXRhbGlhbm8iKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkl0YWxpYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIml0YSIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJJdGFseSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiSVRMIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJJdGFsaWEiKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHg0MTAiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjM5IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2l0cy5ubHMgYi9vbGUvbmxzL2l0cy5ubHMKaW5kZXggNzY0ZGNmZC4uMzcwNDdmYiAxMDA2NDQKLS0tIGEvb2xlL25scy9pdHMubmxzCisrKyBiL29sZS9ubHMvaXRzLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgU3dpdHplcmxhbmQgKEl0YWxpYW5vKQogICovCiAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA4MTAiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkl0YWxpYW5vIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJJdGFsaWFuIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJpdHMiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiU3dpdHplcmFuZCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiQ0hFIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJTdml6emVyYSIpCi1MT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MTAiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQxIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2pwbi5ubHMgYi9vbGUvbmxzL2pwbi5ubHMKaW5kZXggMDIyNjgwOC4uN2EyMjU5NiAxMDA2NDQKLS0tIGEvb2xlL25scy9qcG4ubmxzCisrKyBiL29sZS9ubHMvanBuLm5scwpAQCAtNCw3ICs0LDcgQEAKICAqCShKYXBhbmVzZSBzdHJpbmdzIGluIEVVQy1KUCkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MTEiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIsb8y9y47CIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiSmFwYW5lc2UiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImpwbiIpCkBAIC0xNCw3ICsxNCw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJKYXBhbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiSlBOIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCLG/MvcIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDExIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI4MSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDMsMTAgKzQzLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2tvai5ubHMgYi9vbGUvbmxzL2tvai5ubHMKaW5kZXggNGRlOTIxMC4uNGNiYzZhNCAxMDA2NDQKLS0tIGEvb2xlL25scy9rb2oubmxzCisrKyBiL29sZS9ubHMva29qLm5scwpAQCAtMywxNCArMywxNCBAQAogICogICAgICBLb3JlYW4gKEpvaGFiKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDgxMiIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiS29yZWFuIChKb2hhYikiKSAKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJLb3JlYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImtvaiIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIktvcmVhIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJLT1IiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMva29yLm5scyBiL29sZS9ubHMva29yLm5scwppbmRleCAwNjQ0ZjAwLi41MzVjMGYxIDEwMDY0NAotLS0gYS9vbGUvbmxzL2tvci5ubHMKKysrIGIvb2xlL25scy9rb3IubmxzCkBAIC00LDcgKzQsNyBAQAogICogICAgICBzdHJpbmcgdXNpbmcgY29kZXBhZ2UgOTQ5CiAgKi8KICAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIxOCIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDEyIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJcMzA3XDMyMVwyNjFcMjcxXDI3NlwzNTYiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIktvcmVhbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwia29yIikKQEAgLTE0LDcgKzE0LDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIktvcmVhIChTb3V0aCkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIktPUiIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiXDI2NFwzNTNcMzA3XDMyMVwyNzFcMzE2XDI2MVwyNzEiKQotTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIxOCIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQxMiIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiODIiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI5NDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwiOTQ5IikKZGlmZiAtLWdpdCBhL29sZS9ubHMvbHRoLm5scyBiL29sZS9ubHMvbHRoLm5scwppbmRleCBhYWY1YWViLi5jMWFiNjllIDEwMDY0NAotLS0gYS9vbGUvbmxzL2x0aC5ubHMKKysrIGIvb2xlL25scy9sdGgubmxzCkBAIC00LDcgKzQsNyBAQAogICoJKExpdGh1YW5pYW4gc3RyaW5ncyBpbiBCQUxUSUMgY2hhcnNldCkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MjciKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiTGl0aHVhbmlhbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwibHRoIikKQEAgLTE0LDcgKzE0LDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkxpdGh1YW5pYSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MjciKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDMsMTAgKzQzLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL2x2aS5ubHMgYi9vbGUvbmxzL2x2aS5ubHMKaW5kZXggM2EwYTFiNi4uNDgyOWJhNiAxMDA2NDQKLS0tIGEvb2xlL25scy9sdmkubmxzCisrKyBiL29sZS9ubHMvbHZpLm5scwpAQCAtNCw3ICs0LDcgQEAKICAqCShMYXR2aWFuIHN0cmluZ3MgaW4gQkFMVElDIGNoYXJzZXQpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDI2IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkxhdHZpYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImx2aSIpCkBAIC0xNCw3ICsxNCw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJMYXR2aWEiKQogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDI2IikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQzLDEwICs0MywxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9ubGIubmxzIGIvb2xlL25scy9ubGIubmxzCmluZGV4IDEwZjkzOTMuLjllMTMyMzUgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvbmxiLm5scworKysgYi9vbGUvbmxzL25sYi5ubHMKQEAgLTMsOSArMyw5IEBACiAgKiAgICAgIER1dGNoIChCZWxnaXVtKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLwotTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIk5lZGVybGFuZHMiKQotTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkR1dGNoIikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA4MTMiKQorTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIk5lZGVybGFuZHMgKEJlbGdp6ykiKQorTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkR1dGNoIChCZWxnaXVtKSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwibmxiIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJOZWRlcmxhbmRzIikKIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjMyIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkJlbGdpdW0iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkJFTCIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiQmVsZ2nrIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDEzIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIzMiIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL25sZC5ubHMgYi9vbGUvbmxzL25sZC5ubHMKaW5kZXggMTA5YzY0NS4uMGY2MDBlZiAxMDA2NDQKLS0tIGEvb2xlL25scy9ubGQubmxzCisrKyBiL29sZS9ubHMvbmxkLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgRHV0Y2ggKE5ldGhlcmxhbmRzKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQxMyIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiTmVkZXJsYW5kcyIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiRHV0Y2giKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIm5sZCIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJOZXRoZXJsYW5kcyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiTkxEIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJOZWRlcmxhbmQiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MTMiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjMxIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvbmxzLm5scyBiL29sZS9ubHMvbmxzLm5scwppbmRleCA2ZGE3Yjg3Li42YWMxZTk1IDEwMDY0NAotLS0gYS9vbGUvbmxzL25scy5ubHMKKysrIGIvb2xlL25scy9ubHMubmxzCkBAIC0xMyw3ICsxMyw3IEBACiAvKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDEzIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTAiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9ub24ubmxzIGIvb2xlL25scy9ub24ubmxzCmluZGV4IDhiNDFkNjQuLjZjZTk1MDEgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvbm9uLm5scworKysgYi9vbGUvbmxzL25vbi5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgTm9yd2F5IChOeW5vcnNrKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDgxNCIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiTm9yd2VnaWFuIChOeW5vcnNrKSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiTm9yd2VnaWFuIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJub24iKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIm55bm9yc2siKQogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDciKQotLyBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiTm9yZWciKQogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiTm9yd2F5IikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJOT1IiKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIk5vcmVnIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwODE0IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI0NyIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MCIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL25vci5ubHMgYi9vbGUvbmxzL25vci5ubHMKaW5kZXggZjIzNTViMS4uNWViZjI2NiAxMDA2NDQKLS0tIGEvb2xlL25scy9ub3IubmxzCisrKyBiL29sZS9ubHMvbm9yLm5scwpAQCAtNCw3ICs0LDcgQEAKICAqCShOb3J3ZWdpYW4gc3RyaW5ncyBpbiBpc28tODg1OS0xKQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQxNCIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiTm9yc2sgKEJva23lbCkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIk5vcndlZ2lhbiAoQm9rbWFhbCkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIm5vciIpCkBAIC0xNCw3ICsxNCw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJOb3J3YXkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIk5PUiIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiTm9yZ2UiKQotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MTQiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ3IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MywxMCArNDMsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvcGxrLm5scyBiL29sZS9ubHMvcGxrLm5scwppbmRleCA5Y2U2ZjI4Li5kYjdmNzQ3IDEwMDY0NAotLS0gYS9vbGUvbmxzL3Bsay5ubHMKKysrIGIvb2xlL25scy9wbGsubmxzCkBAIC00LDcgKzQsNyBAQAogICoJKFBvbGlzaCBzdHJpbmdzIGluIGlzby04ODU5LTIpCiAgKi8KICAgICAgICAgCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDE1IikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJQb2xza2kiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlBvbGlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgInBsayIpCkBAIC0xNCw3ICsxNCw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJQb2xhbmQiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIlBMWiIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiUG9sc2thIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDQxNSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCIxMjUyIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9wdGIubmxzIGIvb2xlL25scy9wdGIubmxzCmluZGV4IDg5OTExNmMuLjZjNjY2NjggMTAwNjQ0Ci0tLSBhL29sZS9ubHMvcHRiLm5scworKysgYi9vbGUvbmxzL3B0Yi5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIEJyYXppbAogICovCiAKLUxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDQxNiIpCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjB4MDQxNiIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIlBvcnR1Z3VcMzUycyAoQnJhc2lsKSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwgIlByb3R1Z3Vlc2UiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsICJwdGIiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwgIkJyYXppbCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwgIkJSQSIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwgIkJyYXNpbCIpCi1MT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIwNDA5IikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjB4MDQxNiIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwgIjU1IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwgIjg1MCIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCAiMTI1MiIpCmRpZmYgLS1naXQgYS9vbGUvbmxzL3B0Zy5ubHMgYi9vbGUvbmxzL3B0Zy5ubHMKaW5kZXggOThmYTJlMi4uZTE1YzI2YyAxMDA2NDQKLS0tIGEvb2xlL25scy9wdGcubmxzCisrKyBiL29sZS9ubHMvcHRnLm5scwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgUG9ydHVnYWwKICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA0MTYiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIweDA4MTYiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJQb3J0dWd1XDM1MnMiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJQcm90dWd1ZXNlIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAicHRnIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksICJQb3J0dWdhbCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwgIlBURyIpCiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwgIlBvcnR1Z2FsIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjA0MDkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMHgwNDE2IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiMzUxIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwgIjg1MCIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCAiMTI1MiIpCmRpZmYgLS1naXQgYS9vbGUvbmxzL3JvbS5ubHMgYi9vbGUvbmxzL3JvbS5ubHMKaW5kZXggYTg1ZDJjYi4uOGViYTRmMSAxMDA2NDQKLS0tIGEvb2xlL25scy9yb20ubmxzCisrKyBiL29sZS9ubHMvcm9tLm5scwpAQCAtNCw3ICs0LDcgQEAKICAqCShSb21hbmlhbiBzdHJpbmdzIGluIGlzby04ODU5LTIpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDE4IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlJvbWFuaWFuIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJyb20iKQpAQCAtMTQsNyArMTQsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiUm9tYW5pYSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiUk9NIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MTgiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQwIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MywxMCArNDMsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvcnVzLm5scyBiL29sZS9ubHMvcnVzLm5scwppbmRleCBkNWMyZjYzLi5lMzdkOWFhIDEwMDY0NAotLS0gYS9vbGUvbmxzL3J1cy5ubHMKKysrIGIvb2xlL25scy9ydXMubmxzCkBAIC00LDcgKzQsNyBAQAogICoJKHJ1c3NpYW4gc3RyaW5ncyBpbiBrb2k4LXIpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDE5IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlJ1c3NpYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsInJ1cyIpCkBAIC00MywxMCArNDMsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvc2t5Lm5scyBiL29sZS9ubHMvc2t5Lm5scwppbmRleCA5MGY3ZTA1Li45ODAwZjJmIDEwMDY0NAotLS0gYS9vbGUvbmxzL3NreS5ubHMKKysrIGIvb2xlL25scy9za3kubmxzCkBAIC00LDcgKzQsNyBAQAogICoJKFNsb3Zha2lhbiBzdHJpbmdzIGluIGlzby04ODU5LTIpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwNDFiIikKIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJTbG92ZW7oaW5hIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTbG92YWsiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsInNreSIpCkBAIC0xNCw3ICsxNCw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJTbG92YWtpYSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJTbG92ZW5za+EgUmVwdWJsaWthIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDFiIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4OTUiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQzLDEwICs0MywxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9zbHYubmxzIGIvb2xlL25scy9zbHYubmxzCmluZGV4IGRiYTM5ZDkuLmU3ZTczMTEgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvc2x2Lm5scworKysgYi9vbGUvbmxzL3Nsdi5ubHMKQEAgLTQsNyArNCw3IEBACiAgKgkoU2xvdmVuaWFuIHN0cmluZ3MgaW4gaXNvLTg4NTktMikKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MjQiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU2xvdmVuaWFuIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJzbHYiKQpAQCAtMTQsNyArMTQsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiU2xvdmVuaWEiKQogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDI0IikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQzLDEwICs0MywxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9zcWkubmxzIGIvb2xlL25scy9zcWkubmxzCmluZGV4IDQxMWM3MTkuLmUxNTBmMGMgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvc3FpLm5scworKysgYi9vbGUvbmxzL3NxaS5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgQWxiYW5pYQogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQxYyIpCiAvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJBbGJhbmlhbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwic3FpIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJTaHFpcD9yaWEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiQWxiYW5pYSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MWMiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL3NyYi5ubHMgYi9vbGUvbmxzL3NyYi5ubHMKaW5kZXggMTZmZDA5ZS4uYWE3NTQ0MyAxMDA2NDQKLS0tIGEvb2xlL25scy9zcmIubmxzCisrKyBiL29sZS9ubHMvc3JiLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBTZXJiaWEKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDBjMWEiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTZXJiaWFuIChjeXJpbGxpYykiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsInNyYiIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIll1Z29zbGF2aWEiKQogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwYzFhIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy9zcmwubmxzIGIvb2xlL25scy9zcmwubmxzCmluZGV4IGFlNGJiN2QuLjhiYTc2YWYgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvc3JsLm5scworKysgYi9vbGUvbmxzL3NybC5ubHMKQEAgLTMsMTcgKzMsMTcgQEAKICAqICAgICAgU2VyYmlhbiAoTGF0aW4pCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwODFhIikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU2VyYmlhbiAobGF0aW4pIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJzcmwiKQogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIiIpICovCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJZdWdvc2xhdmlhIikKIC8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjB4MDgxYSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCitMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKIC8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikgKi8KZGlmZiAtLWdpdCBhL29sZS9ubHMvc3ZlLm5scyBiL29sZS9ubHMvc3ZlLm5scwppbmRleCBjMDc2NzMwLi4zZDFkNDlmIDEwMDY0NAotLS0gYS9vbGUvbmxzL3N2ZS5ubHMKKysrIGIvb2xlL25scy9zdmUubmxzCkBAIC0zLDcgKzMsNyBAQAogICogICAgICBTd2VkZW4KICAqLwogCi1MT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMWQiKQorTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQxZCIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiU3ZlbnNrYSIpCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3dlZGlzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwic3ZlIikKQEAgLTEzLDcgKzEzLDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlN3ZWRlbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiU1ZFIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJTdmVyaWdlIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMWQiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MWQiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ1IikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUwIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsIjEyNTIiKQpkaWZmIC0tZ2l0IGEvb2xlL25scy9zdmYubmxzIGIvb2xlL25scy9zdmYubmxzCmluZGV4IGM1MTc3NzUuLmIwZmExOGQgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvc3ZmLm5scworKysgYi9vbGUvbmxzL3N2Zi5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIEZpbmxhbmQgKFN3ZWRpc2gpCiAgKi8KIAotTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjFkIikKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA4MWQiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIlN2ZW5za2EiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlN3ZWRpc2ggKEZpbmxhbmQpIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJzdmUiKQpAQCAtMTMsNyArMTMsNyBAQAogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiRmlubGFuZCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRklOIikKIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJGaW5sYW5kIikKLUxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMWQiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA4MWQiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ1IikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL3Ryay5ubHMgYi9vbGUvbmxzL3Ryay5ubHMKaW5kZXggYzFjZWNlZC4uMjNkZDY1YyAxMDA2NDQKLS0tIGEvb2xlL25scy90cmsubmxzCisrKyBiL29sZS9ubHMvdHJrLm5scwpAQCAtNCw3ICs0LDcgQEAKICAqCShUdXJraXNoIHN0cmluZ3MgaW4gaXNvLTg4NTktOSkKICAqLwogCi0vKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIweDA0MWYiKQogLyogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIiIpICovCiBMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiVHVya2lzaCIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwidHJrIikKQEAgLTE0LDcgKzE0LDcgQEAKIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlR1cmtleSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJU/HJraXllIikKLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDFmIikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQzLDEwICs0MywxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL25scy91a3IubmxzIGIvb2xlL25scy91a3IubmxzCmluZGV4IGQyYzI3ZjMuLjY4YTdkY2UgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvdWtyLm5scworKysgYi9vbGUvbmxzL3Vrci5ubHMKQEAgLTMsNyArMyw3IEBACiAgKiAgICAgIFVrcmFpbmlhbgogICovCiAKLS8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjB4MDQyMiIpCiAvKiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiIikgKi8KIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJVa3JhaW5pYW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsInVrciIpCkBAIC0xMyw3ICsxMyw3IEBACiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJVa3JhaW5pYSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MjIiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL3poaC5ubHMgYi9vbGUvbmxzL3poaC5ubHMKaW5kZXggNjVjOGM2My4uNTgyYWMzYiAxMDA2NDQKLS0tIGEvb2xlL25scy96aGgubmxzCisrKyBiL29sZS9ubHMvemhoLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBDaGluZXNlIChIb25nIEtvbmcpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwYzA0IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkNoaW5lc2UgKEhvbmcgS29uZykiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsInpoaCIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkhvbmcgS29uZyIpCiAvKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDQiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogLyogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIiIpICovCmRpZmYgLS1naXQgYS9vbGUvbmxzL3poaS5ubHMgYi9vbGUvbmxzL3poaS5ubHMKaW5kZXggZjQyN2VmNC4uNjEyNzVhNyAxMDA2NDQKLS0tIGEvb2xlL25scy96aGkubmxzCisrKyBiL29sZS9ubHMvemhpLm5scwpAQCAtMywxNyArMywxNyBAQAogICogICAgICBDaGluZXNlIChTaW5nYXBvcmUpCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgxMDA0IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkNoaW5lc2UgKFNpbmdhcG9yZSkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsInpoaSIpCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlNpbmdhcG9yZSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiU0dQIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIiKSAqLworTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIweDA0MDQiKQogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpAQCAtNDIsMTAgKzQyLDEwIEBACiAvKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwotLyogTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCiAvKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwogTE9DVkFMKExPQ0FMRV9TMTE1OSwgIkFNIikKZGlmZiAtLWdpdCBhL29sZS9ubHMvemhzLm5scyBiL29sZS9ubHMvemhzLm5scwppbmRleCA4OWZiMmZlLi44N2IyNzNiIDEwMDY0NAotLS0gYS9vbGUvbmxzL3pocy5ubHMKKysrIGIvb2xlL25scy96aHMubmxzCkBAIC0zLDE3ICszLDE3IEBACiAgKiAgICAgIFBlb3BsZSdzIHJlcHVibGljIG9mIENoaW5hCiAgKi8KIAotLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIiIpICovCitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMHgwODA0IikKIC8qIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCIiKSAqLwotLyogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlBlb3BsZSdzIHJlcHVibGljIG9mIENoaW5hIikgKi8KKy8qIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJDaGluZXNlIChQZW9wbGUncyByZXB1YmxpYyBvZiBDaGluYSIpICovCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiemhzIikKIC8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiIikgKi8KIC8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIiIpICovCi0vKiBMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCIiKSAqLworTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiUGVvcGxlJ3MgcmVwdWJsaWMgb2YgQ2hpbmEiKQogLyogTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIiIpICovCiAvKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiIikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiIikgKi8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMHgwNDA0IikKIC8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KQEAgLTQyLDEwICs0MiwxMCBAQAogLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCi0vKiBMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KLS8qIExPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQogLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KIC8qIExPQ1ZBTChMT0NBTEVfUzExNTksICIiKSAqLwpkaWZmIC0tZ2l0IGEvb2xlL29sZTJubHMuYyBiL29sZS9vbGUybmxzLmMKaW5kZXggNGQ5NzMyOWIuLmEwZmYzN2QgMTAwNjQ0Ci0tLSBhL29sZS9vbGUybmxzLmMKKysrIGIvb2xlL29sZTJubHMuYwpAQCAtMTMzLDcgKzEzMywxNjEgQEAKIAlMQ0lECQlsYW5naWQ7CiAJY29uc3QgY2hhcgkqbGFuZ25hbWU7CiB9IGxhbmd1YWdlc1tdPXsKLQl7MHgwNDAxLCJBcmFiaXNjaCJ9LAorCXsweDA0MDEsIkFyYWJpYyAoU2F1ZGkgQXJhYmlhKSJ9LAorCXsweDA4MDEsIkFyYWJpYyAoSXJhcSkifSwKKwl7MHgwYzAxLCJBcmFiaWMgKEVneXB0KSJ9LAorCXsweDEwMDEsIkFyYWJpYyAoTGlieWEpIn0sCisJezB4MTQwMSwiQXJhYmljIChBbGdlcmlhKSJ9LAorCXsweDE4MDEsIkFyYWJpYyAoTW9yb2NjbykifSwKKwl7MHgxYzAxLCJBcmFiaWMgKFR1bmlzaWEpIn0sCisJezB4MjAwMSwiQXJhYmljIChPbWFuKSJ9LAorCXsweDI0MDEsIkFyYWJpYyAoWWVtZW4pIn0sCisJezB4MjgwMSwiQXJhYmljIChTeXJpYSkifSwKKwl7MHgyYzAxLCJBcmFiaWMgKEpvcmRhbikifSwKKwl7MHgzMDAxLCJBcmFiaWMgKExlYmFub24pIn0sCisJezB4MzQwMSwiQXJhYmljIChLdXdhaXQpIn0sCisJezB4MzgwMSwiQXJhYmljIChVbml0ZWQgQXJhYiBFbWlyYXRlcykifSwKKwl7MHgzYzAxLCJBcmFiaWMgKEJhaHJhaW4pIn0sCisJezB4NDAwMSwiQXJhYmljIChRYXRhcikifSwKKwl7MHgwNDAyLCJCdWxnYXJpYW4ifSwKKwl7MHgwNDAzLCJDYXRhbGFuIn0sCisJezB4MDQwNCwiQ2hpbmVzZSAoVGFpd2FuKSJ9LAorCXsweDA4MDQsIkNoaW5lc2UgKFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hKSJ9LAorCXsweDBjMDQsIkNoaW5lc2UgKEhvbmcgS29uZykifSwKKwl7MHgxMDA0LCJDaGluZXNlIChTaW5nYXBvcmUpIn0sCisJezB4MTQwNCwiQ2hpbmVzZSAoTWFjYXUpIn0sCisJezB4MDQwNSwiQ3plY2gifSwKKwl7MHgwNDA2LCJEYW5pc2gifSwKKwl7MHgwNDA3LCJHZXJtYW4gKEdlcm1hbnkpIn0sCisJezB4MDgwNywiR2VybWFuIChTd2l0emVybGFuZCkifSwKKwl7MHgwYzA3LCJHZXJtYW4gKEF1c3RyaWEpIn0sCisJezB4MTAwNywiR2VybWFuIChMdXhlbWJvdXJnKSJ9LAorCXsweDE0MDcsIkdlcm1hbiAoTGllY2h0ZW5zdGVpbikifSwKKwl7MHgwNDA4LCJHcmVlayJ9LAorCXsweDA0MDksIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIn0sCisJezB4MDgwOSwiRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIn0sCisJezB4MGMwOSwiRW5nbGlzaCAoQXVzdHJhbGlhKSJ9LAorCXsweDEwMDksIkVuZ2xpc2ggKENhbmFkYSkifSwKKwl7MHgxNDA5LCJFbmdsaXNoIChOZXcgWmVhbGFuZCkifSwKKwl7MHgxODA5LCJFbmdsaXNoIChJcmVsYW5kKSJ9LAorCXsweDFjMDksIkVuZ2xpc2ggKFNvdXRoIEFmcmljYSkifSwKKwl7MHgyMDA5LCJFbmdsaXNoIChKYW1haWNhKSJ9LAorCXsweDI0MDksIkVuZ2xpc2ggKENhcmliYmVhbikifSwKKwl7MHgyODA5LCJFbmdsaXNoIChCZWxpemUpIn0sCisJezB4MmMwOSwiRW5nbGlzaCAoVHJpbmlkYWQpIn0sCisJezB4MzAwOSwiRW5nbGlzaCAoWmltYmFid2UpIn0sCisJezB4MzQwOSwiRW5nbGlzaCAoUGhpbGlwcGluZXMpIn0sCisJezB4MDQwYSwiU3BhbmlzaCAoU3BhaW4sIHRyYWRpdGlvbmFsIHNvcnRpbmcpIn0sCisJezB4MDgwYSwiU3BhbmlzaCAoTWV4aWNvKSJ9LAorCXsweDBjMGEsIlNwYW5pc2ggKFNwYWluLCBpbnRlcm5hdGlvbmFsIHNvcnRpbmcpIn0sCisJezB4MTAwYSwiU3BhbmlzaCAoR3VhdGVtYWxhKSJ9LAorCXsweDE0MGEsIlNwYW5pc2ggKENvc3RhIFJpY2EpIn0sCisJezB4MTgwYSwiU3BhbmlzaCAoUGFuYW1hKSJ9LAorCXsweDFjMGEsIlNwYW5pc2ggKERvbWluaWNhbiBSZXB1YmxpYykifSwKKwl7MHgyMDBhLCJTcGFuaXNoIChWZW5lenVlbGEpIn0sCisJezB4MjQwYSwiU3BhbmlzaCAoQ29sb21iaWEpIn0sCisJezB4MjgwYSwiU3BhbmlzaCAoUGVydSkifSwKKwl7MHgyYzBhLCJTcGFuaXNoIChBcmdlbnRpbmEpIn0sCisJezB4MzAwYSwiU3BhbmlzaCAoRWN1YWRvcikifSwKKwl7MHgzNDBhLCJTcGFuaXNoIChDaGlsZSkifSwKKwl7MHgzODBhLCJTcGFuaXNoIChVcnVndWF5KSJ9LAorCXsweDNjMGEsIlNwYW5pc2ggKFBhcmFndWF5KSJ9LAorCXsweDQwMGEsIlNwYW5pc2ggKEJvbGl2aWEpIn0sCisJezB4NDQwYSwiU3BhbmlzaCAoRWwgU2FsdmFkb3IpIn0sCisJezB4NDgwYSwiU3BhbmlzaCAoSG9uZHVyYXMpIn0sCisJezB4NGMwYSwiU3BhbmlzaCAoTmljYXJhZ3VhKSJ9LAorCXsweDUwMGEsIlNwYW5pc2ggKFB1ZXJ0byBSaWNvKSJ9LAorCXsweDA0MGIsIkZpbm5pc2gifSwKKwl7MHgwNDBjLCJGcmVuY2ggKEZyYW5jZSkifSwKKwl7MHgwODBjLCJGcmVuY2ggKEJlbGdpdW0pIn0sCisJezB4MGMwYywiRnJlbmNoIChDYW5hZGEpIn0sCisJezB4MTAwYywiRnJlbmNoIChTd2l0emVybGFuZCkifSwKKwl7MHgxNDBjLCJGcmVuY2ggKEx1eGVtYm91cmcpIn0sCisJezB4MTgwYywiRnJlbmNoIChNb25hY28pIn0sCisJezB4MDQwZCwiSGVicmV3In0sCisJezB4MDQwZSwiSHVuZ2FyaWFuIn0sCisJezB4MDQwZiwiSWNlbGFuZGljIn0sCisJezB4MDQxMCwiSXRhbGlhbiAoSXRhbHkpIn0sCisJezB4MDgxMCwiSXRhbGlhbiAoU3dpdHplcmxhbmQpIn0sCisJezB4MDQxMSwiSmFwYW5lc2UifSwKKwl7MHgwNDEyLCJLb3JlYW4gKFdhbnN1bmcpIn0sCisJezB4MDgxMiwiS29yZWFuIChKb2hhYikifSwKKwl7MHgwNDEzLCJEdXRjaCAoTmV0aGVybGFuZHMpIn0sCisJezB4MDgxMywiRHV0Y2ggKEJlbGdpdW0pIn0sCisJezB4MDQxNCwiTm9yd2VnaWFuIChCb2ttYWwpIn0sCisJezB4MDgxNCwiTm9yd2VnaWFuIChOeW5vcnNrKSJ9LAorCXsweDA0MTUsIlBvbGlzaCJ9LAorCXsweDA0MTYsIlBvcnR1Z3Vlc2UgKEJyYXppbCkifSwKKwl7MHgwODE2LCJQb3J0dWd1ZXNlIChQb3J0dWdhbCkifSwKKwl7MHgwNDE3LCJSaGFldG8gUm9tYW5pYyJ9LAorCXsweDA0MTgsIlJvbWFuaWFuIn0sCisJezB4MDgxOCwiTW9sZGF2aWFuIn0sCisJezB4MDQxOSwiUnVzc2lhbiAoUnVzc2lhKSJ9LAorCXsweDA4MTksIlJ1c3NpYW4gKE1vbGRhdmlhKSJ9LAorCXsweDA0MWEsIkNyb2F0aWFuIn0sCisJezB4MDgxYSwiU2VyYmlhbiAobGF0aW4pIn0sCisJezB4MGMxYSwiU2VyYmlhbiAoY3lyaWxsaWMpIn0sCisJezB4MDQxYiwiU2xvdmFrIn0sCisJezB4MDQxYywiQWxiYW5pYW4ifSwKKwl7MHgwNDFkLCJTd2VkaXNoIChTd2VkZW4pIn0sCisJezB4MDgxZCwiU3dlZGlzaCAoRmlubGFuZCkifSwKKwl7MHgwNDFlLCJUaGFpIn0sCisJezB4MDQxZiwiVHVya2lzaCJ9LAorCXsweDA0MjAsIlVyZHUifSwKKwl7MHgwNDIxLCJJbmRvbmVzaWFuIn0sCisJezB4MDQyMiwiVWtyYWluaWFuIn0sCisJezB4MDQyMywiQmVsYXJ1c2lhbiJ9LAorCXsweDA0MjQsIlNsb3ZlbmUifSwKKwl7MHgwNDI1LCJFc3RvbmlhbiJ9LAorCXsweDA0MjYsIkxhdHZpYW4ifSwKKwl7MHgwNDI3LCJMaXRodWFuaWFuIChtb2Rlcm4pIn0sCisJezB4MDgyNywiTGl0aHVhbmlhbiAoY2xhc3NpYykifSwKKwl7MHgwNDI4LCJNYW9yaSJ9LAorCXsweDA0MjksIkZhcnNpIn0sCisJezB4MDQyYSwiVmlldG5hbWVzZSJ9LAorCXsweDA0MmIsIkFybWVuaWFuIn0sCisJezB4MDQyYywiQXplcmkgKGxhdGluKSJ9LAorCXsweDA4MmMsIkF6ZXJpIChjeXJpbGxpYykifSwKKwl7MHgwNDJkLCJCYXNxdWUifSwKKwl7MHgwNDJlLCJTb3JiaWFuIn0sCisJezB4MDQyZiwiTWFjZWRvbmlhbiJ9LAorCXsweDA0MzAsIlN1dHUifSwKKwl7MHgwNDMxLCJUc29uZ2EifSwKKwl7MHgwNDMyLCJUc3dhbmEifSwKKwl7MHgwNDMzLCJWZW5kYSJ9LAorCXsweDA0MzQsIlhob3NhIn0sCisJezB4MDQzNSwiWnVsdSJ9LAorCXsweDA0MzYsIkFmcmlrYWFucyJ9LAorCXsweDA0MzcsIkdlb3JnaWFuIn0sCisJezB4MDQzOCwiRmFlcm9lc2UifSwKKwl7MHgwNDM5LCJIaW5kaSJ9LAorCXsweDA0M2EsIk1hbHRlc2UifSwKKwl7MHgwNDNiLCJTYWFtaSJ9LAorCXsweDA0M2MsIklyaXNoIGdhZWxpYyJ9LAorCXsweDA4M2MsIlNjb3R0aXNoIGdhZWxpYyJ9LAorCXsweDA0M2UsIk1hbGF5IChNYWxheXNpYSkifSwKKwl7MHgwODNlLCJNYWxheSAoQnJ1bmVpIERhcnVzc2FsYW0pIn0sCisJezB4MDQzZiwiS2F6YWsifSwKKwl7MHgwNDQxLCJTd2FoaWxpIn0sCisJezB4MDQ0MywiVXpiZWsgKGxhdGluKSJ9LAorCXsweDA4NDMsIlV6YmVrIChjeXJpbGxpYykifSwKKwl7MHgwNDQ0LCJUYXRhciJ9LAorCXsweDA0NDUsIkJlbmdhbGkifSwKKwl7MHgwNDQ2LCJQdW5qYWJpIn0sCisJezB4MDQ0NywiR3VqYXJhdGkifSwKKwl7MHgwNDQ4LCJPcml5YSJ9LAorCXsweDA0NDksIlRhbWlsIn0sCisJezB4MDQ0YSwiVGVsdWd1In0sCisJezB4MDQ0YiwiS2FubmFkYSJ9LAorCXsweDA0NGMsIk1hbGF5YWxhbSJ9LAorCXsweDA0NGQsIkFzc2FtZXNlIn0sCisJezB4MDQ0ZSwiTWFyYXRoaSJ9LAorCXsweDA0NGYsIlNhbnNrcml0In0sCisJezB4MDQ1NywiS29ua2FuaSJ9LAorCXsweDA0OGYsIkVzcGVyYW50byJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KKwl7MHgwMDAwLCJVbmtub3duIn0KKyAgICB9LCBsYW5ndWFnZXNfZGVbXT17CisJezB4MDQwMSwiQXJhYmljIn0sCiAJezB4MDQwMiwiQnVsZ2FyaXNjaCJ9LAogCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCiAJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCkBAIC0xNjMsNyArMzE3LDcgQEAKIAl7MHgwNDFDLCJBbGJhbmlzY2gifSwKIAl7MHgwNDFELCJTY2h3ZWRpc2NoIn0sCiAJezB4MDQxRSwiVGhhaSJ9LAotCXsweDA0MUYsIlR8cmtpc2NoIn0sCisJezB4MDQxRiwiVPxya2lzY2gifSwKIAl7MHgwNDIwLCJVcmR1In0sCiAJezB4MDQyMSwiQmFoYXNhIn0sCiAJezB4MDgwNCwiVmVyZWluZmFjaHRlcyBDaGluZXNpc2NoIn0sCkBAIC0xODcsMzYgKzM0MSw4NyBAQAogTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKCkKIHsKIC8qIERlZmF1bHQgc29ydGluZywgbmV1dHJhbCBzdWJsYW5ndWFnZSAqLworLyogbGFuZ3VhZ2UgbmFtZXMgZm9sbG93aW5nIElTTyA2MzkgKHJmYyAxNzY2KSAqLwogICAgIHN3aXRjaChPcHRpb25zLmxhbmd1YWdlKQogICAgIHsKKyAvKiBjYXNlIExBTkdfQXI6IHJldHVybiAweDAxOyAqLyAgICAgIC8qIEFyYWJpYyAqLwogIC8qIGNhc2UgTEFOR19CdTogcmV0dXJuIDB4MDI7ICovICAgICAgLyogQnVsZ2FyaWFuICovCi0gLyogY2FzZSBMQU5HX0NoOiByZXR1cm4gMHgwNDsgKi8gICAgICAvKiBDaGluZXNlICovCi0gICAgY2FzZSBMQU5HX0N6OiByZXR1cm4gMHgwNTsgICAgICAgICAvKiBDemVjaCAqLworICAgIGNhc2UgTEFOR19DYTogcmV0dXJuIDB4MDM7ICAgICAgICAgLyogQ2F0YWxhbiAqLworIC8qIGNhc2UgTEFOR19aaDogcmV0dXJuIDB4MDQ7ICovICAgICAgLyogQ2hpbmVzZSAqLworICAgIGNhc2UgTEFOR19DczogcmV0dXJuIDB4MDU7ICAgICAgICAgLyogQ3plY2ggKi8KICAgICBjYXNlIExBTkdfRGE6IHJldHVybiAweDA2OyAgICAgICAgIC8qIERhbmlzaCAqLwogICAgIGNhc2UgTEFOR19EZTogcmV0dXJuIDB4MDc7ICAgICAgICAgLyogR2VybWFuICovCi0gLyogY2FzZSBMQU5HX0dyOiByZXR1cm4gMHgwODsgKi8gICAgICAvKiBHcmVlayAqLworIC8qIGNhc2UgTEFOR19FbDogcmV0dXJuIDB4MDg7ICovICAgICAgLyogR3JlZWsgKi8KICAgICBjYXNlIExBTkdfRW46IHJldHVybiAweDA5OyAgICAgICAgIC8qIEVuZ2xpc2ggKi8KICAgICBjYXNlIExBTkdfRXM6IHJldHVybiAweDBhOyAgICAgICAgIC8qIFNwYW5pc2ggKi8KICAgICBjYXNlIExBTkdfRmk6IHJldHVybiAweDBiOyAgICAgICAgIC8qIEZpbm5pc2ggKi8KICAgICBjYXNlIExBTkdfRnI6IHJldHVybiAweDBjOyAgICAgICAgIC8qIEZyZW5jaCAqLworIC8qIGNhc2UgTEFOR19JdzogcmV0dXJuIDB4MGQ7ICovICAgICAgLyogSGVicmV3ICovCiAgICAgY2FzZSBMQU5HX0h1OiByZXR1cm4gMHgwZTsgICAgICAgICAvKiBIdW5nYXJpYW4gKi8KICAvKiBjYXNlIExBTkdfSWM6IHJldHVybiAweDBmOyAqLyAgICAgIC8qIEljZWxhbmRpYyAqLwogICAgIGNhc2UgTEFOR19JdDogcmV0dXJuIDB4MTA7ICAgICAgICAgLyogSXRhbGlhbiAqLwotIC8qIGNhc2UgTEFOR19KcDogcmV0dXJuIDB4MTE7ICovICAgICAgLyogSmFwYW5lc2UgKi8KKyAvKiBjYXNlIExBTkdfSmE6IHJldHVybiAweDExOyAqLyAgICAgIC8qIEphcGFuZXNlICovCiAgICAgY2FzZSBMQU5HX0tvOiByZXR1cm4gMHgxMjsgICAgICAgICAvKiBLb3JlYW4gKi8KLSAvKiBjYXNlIExBTkdfRHU6IHJldHVybiAweDEzOyAqLyAgICAgIC8qIER1dGNoICovCisgLyogY2FzZSBMQU5HX05sOiByZXR1cm4gMHgxMzsgKi8gICAgICAvKiBEdXRjaCAqLwogICAgIGNhc2UgTEFOR19ObzogcmV0dXJuIDB4MTQ7ICAgICAgICAgLyogTm9yd2VnaWFuICovCiAgICAgY2FzZSBMQU5HX1BsOiByZXR1cm4gMHgxNTsgICAgICAgICAvKiBQb2xpc2ggKi8KLSAgICBjYXNlIExBTkdfUG86IHJldHVybiAweDE2OyAgICAgICAgIC8qIFBvcnR1Z3Vlc2UgKi8KKyAgICBjYXNlIExBTkdfUHQ6IHJldHVybiAweDE2OyAgICAgICAgIC8qIFBvcnR1Z3Vlc2UgKi8KKyAvKiBjYXNlIExBTkdfUm06IHJldHVybiAweDE3OyAqLyAgICAgIC8qIFJoYWV0by1yb21hbmNlICovICAgCiAgLyogY2FzZSBMQU5HX1JvOiByZXR1cm4gMHgxODsgKi8gICAgICAvKiBSb21hbmlhbiAqLwogIC8qIGNhc2UgTEFOR19SdTogcmV0dXJuIDB4MTk7ICovICAgICAgLyogUnVzc2lhbiAqLwotIC8qIGNhc2UgTEFOR19DcjogcmV0dXJuIDB4MWE7ICovICAgICAgLyogQ3JvYXRpYW4gKi8KLSAvKiBjYXNlIExBTkdfU2w6IHJldHVybiAweDFiOyAqLyAgICAgIC8qIFNsb3ZhayAqLwotICAgIGNhc2UgTEFOR19TdzogcmV0dXJuIDB4MWQ7ICAgICAgICAgLyogU3dlZGlzaCAqLwotIC8qIGNhc2UgTEFOR19UdTogcmV0dXJuIDB4MWY7ICovICAgICAgLyogVHVya2lzaCAqLwotIC8qIGNhc2UgTEFOR19TdjogcmV0dXJuIDB4MjQ7ICovICAgICAgLyogU2xvdmVuaWFuICovCi0gICAgY2FzZSBMQU5HX0VvOiByZXR1cm4gMHgyNTsgICAgICAgICAvKiBFc3BlcmFudG8gKG5vdCBvZmZpY2lhbCkgKi8KLSAgICBjYXNlIExBTkdfQ2E6IHJldHVybiAweDI2OyAgICAgICAgIC8qIENhdGFsYW4gKi8KKyAvKiBjYXNlIExBTkdfSHI6IHJldHVybiAweDFhOyAqLyAgICAgIC8qIENyb2F0aWFuICovCisgLyogY2FzZSBMQU5HX1NrOiByZXR1cm4gMHgxYjsgKi8gICAgICAvKiBTbG92YWsgKi8KKyAvKiBjYXNlIExBTkdfU3E6IHJldHVybiAweDFjOyAqLyAgICAgIC8qIEFsYmFuaWFuICovCisgICAgY2FzZSBMQU5HX1N2OiByZXR1cm4gMHgxZDsgICAgICAgICAvKiBTd2VkaXNoICovCisgLyogY2FzZSBMQU5HX1RoOiByZXR1cm4gMHgxZTsgKi8gICAgICAvKiBUaGFpICovCisgLyogY2FzZSBMQU5HX1RyOiByZXR1cm4gMHgxZjsgKi8gICAgICAvKiBUdXJraXNoICovCisgLyogY2FzZSBMQU5HX1VyOiByZXR1cm4gMHgyMDsgKi8gICAgICAvKiBVcmR1ICovCisgLyogY2FzZSBMQU5HX0luOiByZXR1cm4gMHgyMTsgKi8gICAgICAvKiBJbmRvbmVzaWFuICovCisgLyogY2FzZSBMQU5HX1VrOiByZXR1cm4gMHgyMjsgKi8gICAgICAvKiBVa3JhaW5pYW4gKi8KKyAvKiBjYXNlIExBTkdfQmU6IHJldHVybiAweDIzOyAqLyAgICAgIC8qIEJlbGFydXNpYW4gKi8KKyAvKiBjYXNlIExBTkdfU2w6IHJldHVybiAweDI0OyAqLyAgICAgIC8qIFNsb3ZlbmlhbiAqLworIC8qIGNhc2UgTEFOR19FdDogcmV0dXJuIDB4MjU7ICovICAgICAgLyogRXN0b25pYW4gKi8KKyAvKiBjYXNlIExBTkdfTHY6IHJldHVybiAweDI2OyAqLyAgICAgIC8qIExhdHZpYW4gKi8KKyAvKiBjYXNlIExBTkdfTHQ6IHJldHVybiAweDI3OyAqLyAgICAgIC8qIExpdGh1YW5pYW4gKi8KKyAvKiBjYXNlIExBTkdfTWk6IHJldHVybiAweDI4OyAqLyAgICAgIC8qIE1hb3JpICovCisgLyogY2FzZSBMQU5HX0ZhOiByZXR1cm4gMHgyOTsgKi8gICAgICAvKiBGYXJzaSAqLworIC8qIGNhc2UgTEFOR19WaTogcmV0dXJuIDB4MmE7ICovICAgICAgLyogVmlldG5hbWVzZSAqLworIC8qIGNhc2UgTEFOR19IeTogcmV0dXJuIDB4MmI7ICovICAgICAgLyogQXJtZW5pYW4gKi8KKyAvKiBjYXNlIExBTkdfQXo6IHJldHVybiAweDJjOyAqLyAgICAgIC8qIEF6ZXJpICovCisgLyogY2FzZSBMQU5HX0V1OiByZXR1cm4gMHgyZDsgKi8gICAgICAvKiBCYXNxdWUgKi8KKyAvKiBjYXNlIExBTkdfPz86IHJldHVybiAweDJlOyAqLyAgICAgIC8qIFNvcmJpYW4gKi8KKyAvKiBjYXNlIExBTkdfTWs6IHJldHVybiAweDJmOyAqLyAgICAgIC8qIE1hY2Vkb25pYW4gKi8KKyAvKiBjYXNlIExBTkdfPz86IHJldHVybiAweDMwOyAqLyAgICAgIC8qIFN1dHUgKi8KKyAvKiBjYXNlIExBTkdfVHM6IHJldHVybiAweDMxOyAqLyAgICAgIC8qIFRzb25nYSAqLworIC8qIGNhc2UgTEFOR18/PzogcmV0dXJuIDB4MzI7ICovICAgICAgLyogVHN3YW5hICovCisgLyogY2FzZSBMQU5HXz8/OiByZXR1cm4gMHgzMzsgKi8gICAgICAvKiBWZW5kYSAqLworIC8qIGNhc2UgTEFOR19YaDogcmV0dXJuIDB4MzQ7ICovICAgICAgLyogWGhvc2EgKi8KKyAvKiBjYXNlIExBTkdfWnU6IHJldHVybiAweDM1OyAqLyAgICAgIC8qIFp1bHUgKi8KKyAvKiBjYXNlIExBTkdfQWY6IHJldHVybiAweDM2OyAqLyAgICAgIC8qIEFmcmlrYWFucyAqLworIC8qIGNhc2UgTEFOR19LYTogcmV0dXJuIDB4Mzc7ICovICAgICAgLyogR2VvcmdpYW4gKi8KKyAvKiBjYXNlIExBTkdfRm86IHJldHVybiAweDM4OyAqLyAgICAgIC8qIEZhZXJvZXNlICovCisgLyogY2FzZSBMQU5HX0hpOiByZXR1cm4gMHgzOTsgKi8gICAgICAvKiBIaW5kaSAqLworIC8qIGNhc2UgTEFOR19NdDogcmV0dXJuIDB4M2E7ICovICAgICAgLyogTWFsdGVzZSAqLworIC8qIGNhc2UgTEFOR18/PzogcmV0dXJuIDB4M2I7ICovICAgICAgLyogU2FhbWkgKi8KKyAvKiBjYXNlIExBTkdfR2E6IHJldHVybiAweDNjOyAqLyAgICAgIC8qIEdhZWxpYyAqLworIC8qIGNhc2UgTEFOR19NczogcmV0dXJuIDB4M2U7ICovICAgICAgLyogTWFsYXkgKi8KKyAvKiBjYXNlIExBTkdfS2s6IHJldHVybiAweDNmOyAqLyAgICAgIC8qIEthemFraCAqLworIC8qIGNhc2UgTEFOR19TdzogcmV0dXJuIDB4NDE7ICovICAgICAgLyogU3dhaGlsaSAqLworIC8qIGNhc2UgTEFOR19VejogcmV0dXJuIDB4NDM7ICovICAgICAgLyogVXpiZWsgKi8KKyAvKiBjYXNlIExBTkdfVHQ6IHJldHVybiAweDQ0OyAqLyAgICAgIC8qIFRhdGFyICovCisgLyogY2FzZSBMQU5HX0JuOiByZXR1cm4gMHg0NTsgKi8gICAgICAvKiBCZW5nYWxpICovCisgLyogY2FzZSBMQU5HX1BhOiByZXR1cm4gMHg0NjsgKi8gICAgICAvKiBQdW5qYWJpICovCisgLyogY2FzZSBMQU5HX0d1OiByZXR1cm4gMHg0NzsgKi8gICAgICAvKiBHdWphcmF0aSAqLworIC8qIGNhc2UgTEFOR19PcjogcmV0dXJuIDB4NDg7ICovICAgICAgLyogT3JpeWEgKi8KKyAvKiBjYXNlIExBTkdfVGE6IHJldHVybiAweDQ5OyAqLyAgICAgIC8qIFRhbWlsICovCisgLyogY2FzZSBMQU5HX1RlOiByZXR1cm4gMHg0YTsgKi8gICAgICAvKiBUZWx1Z3UgKi8KKyAvKiBjYXNlIExBTkdfS246IHJldHVybiAweDRiOyAqLyAgICAgIC8qIEthbm5hZGEgKi8KKyAvKiBjYXNlIExBTkdfTWw6IHJldHVybiAweDRjOyAqLyAgICAgIC8qIE1hbGF5YWxhbSAqLworIC8qIGNhc2UgTEFOR19BczogcmV0dXJuIDB4NGQ7ICovICAgICAgLyogQXNzYW1lc2UgKi8KKyAvKiBjYXNlIExBTkdfTXI6IHJldHVybiAweDRlOyAqLyAgICAgIC8qIE1hcmF0aGkgKi8KKyAvKiBjYXNlIExBTkdfU2E6IHJldHVybiAweDRmOyAqLyAgICAgIC8qIFNhbnNrcml0ICovCisgLyogY2FzZSBMQU5HXz8/OiByZXR1cm4gMHg1NzsgKi8gICAgICAvKiBLb25rYW5pICovCisgICAgY2FzZSBMQU5HX0VvOiByZXR1cm4gMHg4ZjsgICAgICAgICAvKiBFc3BlcmFudG8gKG5vdCBvZmZpY2lhbCBudW1iZXIpICovCiAKICAgICBkZWZhdWx0OgogCXJldHVybiAweDAwOyAgICAgICAgICAgICAgICAgICAvKiBOZXV0cmFsIGxhbmd1YWdlICovCkBAIC0zNjIsMTkgKzU2NywxOSBAQAogCX0KICAgICBicmVhazsgIC8qIExBTkcoUGwpICovCiAKLSAgICBjYXNlIExBTkdfUG86CisgICAgY2FzZSBMQU5HX1B0OgogICAgIAlzd2l0Y2ggKExDVHlwZSkgewogI2luY2x1ZGUgIm5scy9wdGIubmxzIgogCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7CiAJfQotICAgIGJyZWFrOyAvKiBMQU5HKFBvKSAqLworICAgIGJyZWFrOyAvKiBMQU5HKFB0KSAqLwogCi0gICAgY2FzZSBMQU5HX1N3OgorICAgIGNhc2UgTEFOR19TdjoKICAgICAJc3dpdGNoIChMQ1R5cGUpIHsKICNpbmNsdWRlICJubHMvc3ZlLm5scyIKIAlkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwogCX0KLSAgICBicmVhazsgLyogTEFORyhTdykgKi8KKyAgICBicmVhazsgLyogTEFORyhTdikgKi8KIAogLypJbnNlcnQgb3RoZXIgbGFuZ3VhZ2VzIGhlcmUqLwogCkBAIC0yNTUzLDYgKzI3NTgsOTEgQEAKICAgIAogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHMzMkEJKEtFUk5FTDMyLjE5OCkKKyAqLworQk9PTDMyIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHMzMkEoCisgIERBVEVGTVRfRU5VTVBST0MzMkEgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCAgRFdPUkQgZHdGbGFncykKK3sKKyAgRklYTUUob2xlLCAiT25seSBVUyBFbmdsaXNoIHN1cHBvcnRlZFxuIik7CisKKyAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQorICAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHN3aXRjaChkd0ZsYWdzKQorICAgIHsKKyAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CisJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXkiKSkgcmV0dXJuIFRSVUU7CisJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXl5eSIpKSByZXR1cm4gVFJVRTsKKwlpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5IikpIHJldHVybiBUUlVFOworCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXl5eSIpKSByZXR1cm4gVFJVRTsKKwlpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOworCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU1NLXl5IikpIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOworICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgorICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIE1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CisgICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKKyAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOworICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CisgICAgICBkZWZhdWx0OgorCUZJWE1FKG9sZSwgIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKKwlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworCXJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0czMyVwkoS0VSTkVMMzIuMTk5KQorICovCitCT09MMzIgV0lOQVBJIEVudW1EYXRlRm9ybWF0czMyVygKKyAgREFURUZNVF9FTlVNUFJPQzMyVyBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCit7CisgIEZJWE1FKG9sZSwgIiglcCwgJWxkLCAlbGQpOiBzdHViXG4iLCBscERhdGVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHMzMkEJKEtFUk5FTDMyLjIxMCkKKyAqLworQk9PTDMyIFdJTkFQSSBFbnVtVGltZUZvcm1hdHMzMkEoCisgIFRJTUVGTVRfRU5VTVBST0MzMkEgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQoreworICBGSVhNRShvbGUsICJPbmx5IFVTIEVuZ2xpc2ggc3VwcG9ydGVkXG4iKTsKKworICBpZighbHBUaW1lRm10RW51bVByb2MpCisgICAgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYoZHdGbGFncykKKyAgICB7CisgICAgICBGSVhNRShvbGUsICJVbmtub3duIHRpbWUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCisgICAgfQorICAKKyAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOworICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOworICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CisgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0czMyVwkoS0VSTkVMMzIuMjExKQorICovCitCT09MMzIgV0lOQVBJIEVudW1UaW1lRm9ybWF0czMyVygKKyAgVElNRUZNVF9FTlVNUFJPQzMyVyBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCit7CisgIEZJWE1FKG9sZSwgIiglcCwlbGQsJWxkKTogc3R1YiIsIGxwVGltZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdDMyQQkoS0VSTkVMMzIuMzU1KQpkaWZmIC0tZ2l0IGEvb2xlL29sZWRsZy5jIGIvb2xlL29sZWRsZy5jCmluZGV4IDUxZDYwNTEuLjhiMDEwZjIgMTAwNjQ0Ci0tLSBhL29sZS9vbGVkbGcuYworKysgYi9vbGUvb2xlZGxnLmMKQEAgLTE1LDE2ICsxNSwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlVUlBZGRWZXJiTWVudTMyQSAoT0xFRExHLjEpCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBPbGVVSUFkZFZlcmJNZW51MzJBKAotICAgIExQT0xFT0JKRUNUIGxwT2xlT2JqLCBMUENTVFIgbHBzelNob3J0VHlwZSwKLSAgICBITUVOVTMyIGhNZW51LCBVSU5UMzIgdVBvcywgVUlOVDMyIHVJRFZlcmJNaW4sIFVJTlQzMiB1SURWZXJiTWF4LAotICAgIEJPT0wzMiBiQWRkQ29udmVydCwgVUlOVDMyIGlkQ29udmVydCwgSE1FTlUzMiAqbHBoTWVudSkKKyAgTFBPTEVPQkpFQ1QgbHBPbGVPYmosIExQQ1NUUiBscHN6U2hvcnRUeXBlLAorICBITUVOVTMyIGhNZW51LCBVSU5UMzIgdVBvcywgVUlOVDMyIHVJRFZlcmJNaW4sIFVJTlQzMiB1SURWZXJiTWF4LAorICBCT09MMzIgYkFkZENvbnZlcnQsIFVJTlQzMiBpZENvbnZlcnQsIEhNRU5VMzIgKmxwaE1lbnUpCiB7Ci0gIEZJWE1FKG9sZSwiKCVwLCVzLDB4JTA4eCwlZCwlZCwlZCwlZCwlZCwlcCk6IHN0dWJcbiIsCi0JbHBPbGVPYmosIGxwc3pTaG9ydFR5cGUsCi0gICAgICAgIGhNZW51LCB1UG9zLCB1SURWZXJiTWluLCB1SURWZXJiTWF4LAotICAgICAgICBiQWRkQ29udmVydCwgaWRDb252ZXJ0LCBscGhNZW51CisgIEZJWE1FKG9sZSwgIiglcCwgJXMsIDB4JTA4eCwgJWQsICVkLCAlZCwgJWQsICVkLCAlcCk6IHN0dWJcbiIsCisgICAgbHBPbGVPYmosIGRlYnVnc3RyX2EobHBzelNob3J0VHlwZSksCisgICAgaE1lbnUsIHVQb3MsIHVJRFZlcmJNaW4sIHVJRFZlcmJNYXgsCisgICAgYkFkZENvbnZlcnQsIGlkQ29udmVydCwgbHBoTWVudQogICApOwogICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICByZXR1cm4gRkFMU0U7CkBAIC0zMywxNiArMzIsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJQWRkVmVyYk1lbnUzMlcgKE9MRURMRy4xNCkKICAqLwotCiBCT09MMzIgV0lOQVBJIE9sZVVJQWRkVmVyYk1lbnUzMlcoCi0gICAgTFBPTEVPQkpFQ1QgbHBPbGVPYmosIExQQ1dTVFIgbHBzelNob3J0VHlwZSwKLSAgICBITUVOVTMyIGhNZW51LCBVSU5UMzIgdVBvcywgVUlOVDMyIHVJRFZlcmJNaW4sIFVJTlQzMiB1SURWZXJiTWF4LAotICAgIEJPT0wzMiBiQWRkQ29udmVydCwgVUlOVDMyIGlkQ29udmVydCwgSE1FTlUzMiAqbHBoTWVudSkKKyAgTFBPTEVPQkpFQ1QgbHBPbGVPYmosIExQQ1dTVFIgbHBzelNob3J0VHlwZSwKKyAgSE1FTlUzMiBoTWVudSwgVUlOVDMyIHVQb3MsIFVJTlQzMiB1SURWZXJiTWluLCBVSU5UMzIgdUlEVmVyYk1heCwKKyAgQk9PTDMyIGJBZGRDb252ZXJ0LCBVSU5UMzIgaWRDb252ZXJ0LCBITUVOVTMyICpscGhNZW51KQogewotICBGSVhNRShvbGUsIiglcCwlcywweCUwOHgsJWQsJWQsJWQsJWQsJWQsJXApOiBzdHViXG4iLAotCWxwT2xlT2JqLCBscHN6U2hvcnRUeXBlLAotICAgICAgICBoTWVudSwgdVBvcywgdUlEVmVyYk1pbiwgdUlEVmVyYk1heCwKLSAgICAgICAgYkFkZENvbnZlcnQsIGlkQ29udmVydCwgbHBoTWVudQorICBGSVhNRShvbGUsICIoJXAsICVzLCAweCUwOHgsICVkLCAlZCwgJWQsICVkLCAlZCwgJXApOiBzdHViXG4iLAorICAgIGxwT2xlT2JqLCBkZWJ1Z3N0cl93KGxwc3pTaG9ydFR5cGUpLAorICAgIGhNZW51LCB1UG9zLCB1SURWZXJiTWluLCB1SURWZXJiTWF4LAorICAgIGJBZGRDb252ZXJ0LCBpZENvbnZlcnQsIGxwaE1lbnUKICAgKTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIEZBTFNFOwpAQCAtNTEsMTEgKzQ5LDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSUNhbkNvbnZlcnRPckFjdGl2YXRlQXMzMiAoT0xFRExHLjIpCiAgKi8KLQogQk9PTDMyIFdJTkFQSSBPbGVVSUNhbkNvbnZlcnRPckFjdGl2YXRlQXMzMigKICAgICBSRUZDTFNJRCByQ2xzaWQsIEJPT0wzMiBmSXNMaW5rZWRPYmplY3QsIFdPUkQgd0Zvcm1hdCkKIHsKLSAgRklYTUUob2xlLCJzdHViXG4iKTsKKyAgRklYTUUob2xlLCAiKCVwLCAlZCwgJWhkKTogc3R1YlxuIiwKKyAgICByQ2xzaWQsIGZJc0xpbmtlZE9iamVjdCwgd0Zvcm1hdAorICApOwogICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICByZXR1cm4gRkFMU0U7CiB9CkBAIC02MywxMCArNjIsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlVUlJbnNlcnRPYmplY3QzMkEgKE9MRURMRy4zKQogICovCi0KLVVJTlQzMiBXSU5BUEkgT2xlVUlJbnNlcnRPYmplY3QzMkEoTFBPTEVVSUlOU0VSVE9CSkVDVEEgbHBPbGVVSUluc2VydE9iamVjdCkKK1VJTlQzMiBXSU5BUEkgT2xlVUlJbnNlcnRPYmplY3QzMkEoTFBPTEVVSUlOU0VSVE9CSkVDVDMyQSBscE9sZVVJSW5zZXJ0T2JqZWN0KQogewotICBGSVhNRShvbGUsIiglcCk6IHN0dWJcbiIsbHBPbGVVSUluc2VydE9iamVjdCk7CisgIEZJWE1FKG9sZSwgIiglcCk6IHN0dWJcbiIsIGxwT2xlVUlJbnNlcnRPYmplY3QpOwogICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICByZXR1cm4gT0xFVUlfRkFMU0U7CiB9CkBAIC03NCwxMCArNzIsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlVUlJbnNlcnRPYmplY3QzMlcgKE9MRURMRy4yMCkKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJSW5zZXJ0T2JqZWN0MzJXKExQT0xFVUlJTlNFUlRPQkpFQ1RXIGxwT2xlVUlJbnNlcnRPYmplY3QpCitVSU5UMzIgV0lOQVBJIE9sZVVJSW5zZXJ0T2JqZWN0MzJXKExQT0xFVUlJTlNFUlRPQkpFQ1QzMlcgbHBPbGVVSUluc2VydE9iamVjdCkKIHsKLSAgRklYTUUob2xlLCIoJXApOiBzdHViXG4iLGxwT2xlVUlJbnNlcnRPYmplY3QpOworICBGSVhNRShvbGUsICIoJXApOiBzdHViXG4iLCBscE9sZVVJSW5zZXJ0T2JqZWN0KTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIE9MRVVJX0ZBTFNFOwogfQpAQCAtODUsMTAgKzgyLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJUGFzdGVTcGVjaWFsMzJBIChPTEVETEcuNCkKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJUGFzdGVTcGVjaWFsMzJBKExQT0xFVUlQQVNURVNQRUNJQUxBIGxwT2xlVUlQYXN0ZVNwZWNpYWwpCitVSU5UMzIgV0lOQVBJIE9sZVVJUGFzdGVTcGVjaWFsMzJBKExQT0xFVUlQQVNURVNQRUNJQUwzMkEgbHBPbGVVSVBhc3RlU3BlY2lhbCkKIHsKLSAgRklYTUUob2xlLCIoJXApOiBzdHViXG4iLGxwT2xlVUlQYXN0ZVNwZWNpYWwpOworICBGSVhNRShvbGUsICIoJXApOiBzdHViXG4iLCBscE9sZVVJUGFzdGVTcGVjaWFsKTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIE9MRVVJX0ZBTFNFOwogfQpAQCAtOTYsMTAgKzkyLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJUGFzdGVTcGVjaWFsMzJXIChPTEVETEcuMjIpCiAgKi8KLQotVUlOVDMyIFdJTkFQSSBPbGVVSVBhc3RlU3BlY2lhbDMyVyhMUE9MRVVJUEFTVEVTUEVDSUFMVyBscE9sZVVJUGFzdGVTcGVjaWFsKQorVUlOVDMyIFdJTkFQSSBPbGVVSVBhc3RlU3BlY2lhbDMyVyhMUE9MRVVJUEFTVEVTUEVDSUFMMzJXIGxwT2xlVUlQYXN0ZVNwZWNpYWwpCiB7Ci0gIEZJWE1FKG9sZSwiKCVwKTogc3R1YlxuIixscE9sZVVJUGFzdGVTcGVjaWFsKTsKKyAgRklYTUUob2xlLCAiKCVwKTogc3R1YlxuIiwgbHBPbGVVSVBhc3RlU3BlY2lhbCk7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBPTEVVSV9GQUxTRTsKIH0KQEAgLTEwNywxMCArMTAyLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJRWRpdExpbmtzMzJBIChPTEVETEcuNSkKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJRWRpdExpbmtzMzJBKExQT0xFVUlFRElUTElOS1NBIGxwT2xlVUlFZGl0TGlua3MpCitVSU5UMzIgV0lOQVBJIE9sZVVJRWRpdExpbmtzMzJBKExQT0xFVUlFRElUTElOS1MzMkEgbHBPbGVVSUVkaXRMaW5rcykKIHsKLSAgRklYTUUob2xlLCIoJXApOiBzdHViXG4iLGxwT2xlVUlFZGl0TGlua3MpOworICBGSVhNRShvbGUsICIoJXApOiBzdHViXG4iLCBscE9sZVVJRWRpdExpbmtzKTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIE9MRVVJX0ZBTFNFOwogfQpAQCAtMTE4LDEwICsxMTIsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlVUlFZGl0TGlua3MzMlcgKE9MRURMRy4xOSkKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJRWRpdExpbmtzMzJXKExQT0xFVUlFRElUTElOS1NXIGxwT2xlVUlFZGl0TGlua3MpCitVSU5UMzIgV0lOQVBJIE9sZVVJRWRpdExpbmtzMzJXKExQT0xFVUlFRElUTElOS1MzMlcgbHBPbGVVSUVkaXRMaW5rcykKIHsKLSAgRklYTUUob2xlLCIoJXApOiBzdHViXG4iLGxwT2xlVUlFZGl0TGlua3MpOworICBGSVhNRShvbGUsICIoJXApOiBzdHViXG4iLCBscE9sZVVJRWRpdExpbmtzKTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIE9MRVVJX0ZBTFNFOwogfQpAQCAtMTI5LDEwICsxMjIsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJQ2hhbmdlSWNvbjMyQSAoT0xFRExHLjYpCiAgKi8KLQotVUlOVDMyIFdJTkFQSSBPbGVVSUNoYW5nZUljb24zMkEoTFBPTEVVSUNIQU5HRUlDT05BIGxwT2xlVUlDaGFuZ2VJY29uKQorVUlOVDMyIFdJTkFQSSBPbGVVSUNoYW5nZUljb24zMkEoCisgIExQT0xFVUlDSEFOR0VJQ09OMzJBIGxwT2xlVUlDaGFuZ2VJY29uKQogewotICBGSVhNRShvbGUsIiglcCk6IHN0dWJcbiIsbHBPbGVVSUNoYW5nZUljb24pOworICBGSVhNRShvbGUsICIoJXApOiBzdHViXG4iLCBscE9sZVVJQ2hhbmdlSWNvbik7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBPTEVVSV9GQUxTRTsKIH0KQEAgLTE0MCwxMCArMTMzLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSUNoYW5nZUljb24zMlcgKE9MRURMRy4xNikKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJQ2hhbmdlSWNvbjMyVyhMUE9MRVVJQ0hBTkdFSUNPTlcgbHBPbGVVSUNoYW5nZUljb24pCitVSU5UMzIgV0lOQVBJIE9sZVVJQ2hhbmdlSWNvbjMyVygKKyAgTFBPTEVVSUNIQU5HRUlDT04zMlcgbHBPbGVVSUNoYW5nZUljb24pCiB7Ci0gIEZJWE1FKG9sZSwiKCVwKTogc3R1YlxuIixscE9sZVVJQ2hhbmdlSWNvbik7CisgIEZJWE1FKG9sZSwgIiglcCk6IHN0dWJcbiIsIGxwT2xlVUlDaGFuZ2VJY29uKTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIE9MRVVJX0ZBTFNFOwogfQpAQCAtMTUxLDEwICsxNDQsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlVUlDb252ZXJ0MzJBIChPTEVETEcuNykKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJQ29udmVydDMyQShMUE9MRVVJQ09OVkVSVEEgbHBPbGVVSUNvbnZlcnQpCitVSU5UMzIgV0lOQVBJIE9sZVVJQ29udmVydDMyQShMUE9MRVVJQ09OVkVSVDMyQSBscE9sZVVJQ29udmVydCkKIHsKLSAgRklYTUUob2xlLCIoJXApOiBzdHViXG4iLGxwT2xlVUlDb252ZXJ0KTsKKyAgRklYTUUob2xlLCAiKCVwKTogc3R1YlxuIiwgbHBPbGVVSUNvbnZlcnQpOwogICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICByZXR1cm4gT0xFVUlfRkFMU0U7CiB9CkBAIC0xNjIsMTAgKzE1NCw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSUNvbnZlcnQzMlcgKE9MRURMRy4xOCkKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJQ29udmVydDMyVyhMUE9MRVVJQ09OVkVSVFcgbHBPbGVVSUNvbnZlcnQpCitVSU5UMzIgV0lOQVBJIE9sZVVJQ29udmVydDMyVyhMUE9MRVVJQ09OVkVSVDMyVyBscE9sZVVJQ29udmVydCkKIHsKLSAgRklYTUUob2xlLCIoJXApOiBzdHViXG4iLGxwT2xlVUlDb252ZXJ0KTsKKyAgRklYTUUob2xlLCAiKCVwKTogc3R1YlxuIiwgbHBPbGVVSUNvbnZlcnQpOwogICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICByZXR1cm4gT0xFVUlfRkFMU0U7CiB9CkBAIC0xNzMsMTAgKzE2NCw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSUJ1c3kzMkEgKE9MRURMRy44KQogICovCi0KLVVJTlQzMiBXSU5BUEkgT2xlVUlCdXN5MzJBKExQT0xFVUlCVVNZQSBscE9sZVVJQnVzeSkKK1VJTlQzMiBXSU5BUEkgT2xlVUlCdXN5MzJBKExQT0xFVUlCVVNZMzJBIGxwT2xlVUlCdXN5KQogewotICBGSVhNRShvbGUsIiglcCk6IHN0dWJcbiIsbHBPbGVVSUJ1c3kpOworICBGSVhNRShvbGUsICIoJXApOiBzdHViXG4iLCBscE9sZVVJQnVzeSk7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBPTEVVSV9GQUxTRTsKIH0KQEAgLTE4NCwxMCArMTc0LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJQnVzeTMyVyAoT0xFRExHLjE1KQogICovCi0KLVVJTlQzMiBXSU5BUEkgT2xlVUlCdXN5MzJXKExQT0xFVUlCVVNZVyBscE9sZVVJQnVzeSkKK1VJTlQzMiBXSU5BUEkgT2xlVUlCdXN5MzJXKExQT0xFVUlCVVNZMzJXIGxwT2xlVUlCdXN5KQogewotICBGSVhNRShvbGUsIiglcCk6IHN0dWJcbiIsbHBPbGVVSUJ1c3kpOworICBGSVhNRShvbGUsICIoJXApOiBzdHViXG4iLCBscE9sZVVJQnVzeSk7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBPTEVVSV9GQUxTRTsKIH0KQEAgLTE5NSwxMyArMTg0LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSVVwZGF0ZUxpbmtzMzJBIChPTEVETEcuOSkKICAqLwotCiBCT09MMzIgV0lOQVBJIE9sZVVJVXBkYXRlTGlua3MzMkEoCi0gICAgTFBPTEVVSUxJTktDT05UQUlORVJBIGxwT2xlVUlMaW5rQ250ciwKLSAgICBIV05EMzIgaHduZFBhcmVudCwgTFBTVFIgbHBzelRpdGxlLCBJTlQzMiBjTGlua3MpCisgIExQT0xFVUlMSU5LQ09OVEFJTkVSMzJBIGxwT2xlVUlMaW5rQ250ciwKKyAgSFdORDMyIGh3bmRQYXJlbnQsIExQU1RSIGxwc3pUaXRsZSwgSU5UMzIgY0xpbmtzKQogewotICBGSVhNRShvbGUsIiglcCwweCUwOHgsJXMsJWQpOiBzdHViXG4iLAotCWxwT2xlVUlMaW5rQ250cixod25kUGFyZW50LGxwc3pUaXRsZSwgY0xpbmtzKTsKKyAgRklYTUUob2xlLCIoJXAsIDB4JTA4eCwgJXMsICVkKTogc3R1YlxuIiwKKyAgICBscE9sZVVJTGlua0NudHIsIGh3bmRQYXJlbnQsIGRlYnVnc3RyX2EobHBzelRpdGxlKSwgY0xpbmtzCisgICk7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBGQUxTRTsKIH0KQEAgLTIxMiwxMiArMjAxLDEzIEBACiAgKiAgICAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byBmaW5kIHRoZSBvcmRpbmFsIGZvciB0aGlzIGZ1bmN0aW9uLAogICogICAgIFRoaXMgbWVhbnMgaXQgY2FuJ3QgYmUgY2FsbGVkIGZyb20gb3V0c2lkZSB0aGUgRExMLgogICovCi0KIEJPT0wzMiBXSU5BUEkgT2xlVUlVcGRhdGVMaW5rczMyVygKLSAgICBMUE9MRVVJTElOS0NPTlRBSU5FUlcgbHBPbGVVSUxpbmtDbnRyLAotICAgIEhXTkQzMiBod25kUGFyZW50LCBMUFdTVFIgbHBzelRpdGxlLCBJTlQzMiBjTGlua3MpCisgIExQT0xFVUlMSU5LQ09OVEFJTkVSMzJXIGxwT2xlVUlMaW5rQ250ciwKKyAgSFdORDMyIGh3bmRQYXJlbnQsIExQV1NUUiBscHN6VGl0bGUsIElOVDMyIGNMaW5rcykKIHsKLSAgRklYTUUob2xlLCIoJXAsMHglMDh4LCVzLCVkKTogc3R1YlxuIixscE9sZVVJTGlua0NudHIsaHduZFBhcmVudCxscHN6VGl0bGUsIGNMaW5rcyk7CisgIEZJWE1FKG9sZSwgIiglcCwgMHglMDh4LCAlcywgJWQpOiBzdHViXG4iLAorICAgIGxwT2xlVUlMaW5rQ250ciwgaHduZFBhcmVudCwgZGVidWdzdHJfdyhscHN6VGl0bGUpLCBjTGlua3MKKyAgKTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIEZBTFNFOwogfQpAQCAtMjI1LDEwICsyMTUsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJUHJvbXB0VXNlcjMyQSAoT0xFRExHLjEwKQogICovCi0KLUlOVDMyIF9fY2RlY2wgT2xlVUlQcm9tcHRVc2VyMzJBKElOVDMyIG5UZW1wbGF0ZSwgSFdORDMyIGh3bmRQYXJlbnQsIC4uLikKK0lOVDMyIF9fY2RlY2wgT2xlVUlQcm9tcHRVc2VyMzJBKAorICBJTlQzMiBuVGVtcGxhdGUsIEhXTkQzMiBod25kUGFyZW50LCAuLi4pCiB7Ci0gIEZJWE1FKG9sZSwiKCVkLDB4JTA4eCwuLi4pOiBzdHViXG4iLG5UZW1wbGF0ZSxod25kUGFyZW50KTsKKyAgRklYTUUob2xlLCAiKCVkLCAweCUwOHgsIC4uLik6IHN0dWJcbiIsIG5UZW1wbGF0ZSwgaHduZFBhcmVudCk7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBPTEVVSV9GQUxTRTsKIH0KQEAgLTIzNiwxMCArMjI2LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSVByb21wdFVzZXIzMlcgKE9MRURMRy4xMykKICAqLwotCi1JTlQzMiBfX2NkZWNsIE9sZVVJUHJvbXB0VXNlcjMyVyhJTlQzMiBuVGVtcGxhdGUsIEhXTkQzMiBod25kUGFyZW50LCAuLi4pCitJTlQzMiBfX2NkZWNsIE9sZVVJUHJvbXB0VXNlcjMyVygKKyAgSU5UMzIgblRlbXBsYXRlLCBIV05EMzIgaHduZFBhcmVudCwgLi4uKQogewotICBGSVhNRShvbGUsIiglZCwweCUwOHgsLi4uKTogc3R1YlxuIixuVGVtcGxhdGUsaHduZFBhcmVudCk7CisgIEZJWE1FKG9sZSwgIiglZCwgMHglMDh4LCAuLi4pOiBzdHViXG4iLCBuVGVtcGxhdGUsIGh3bmRQYXJlbnQpOwogICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICByZXR1cm4gT0xFVUlfRkFMU0U7CiB9CkBAIC0yNDcsMTAgKzIzNywxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlVUlPYmplY3RQcm9wZXJ0aWVzMzJBIChPTEVETEcuMTEpCiAgKi8KLQotVUlOVDMyIFdJTkFQSSBPbGVVSU9iamVjdFByb3BlcnRpZXMzMkEoTFBPTEVVSU9CSkVDVFBST1BTQSBscE9sZVVJT2JqZWN0UHJvcHMpCitVSU5UMzIgV0lOQVBJIE9sZVVJT2JqZWN0UHJvcGVydGllczMyQSgKKyAgTFBPTEVVSU9CSkVDVFBST1BTMzJBIGxwT2xlVUlPYmplY3RQcm9wcykKIHsKLSAgRklYTUUob2xlLCIoJXApOiBzdHViXG4iLGxwT2xlVUlPYmplY3RQcm9wcyk7CisgIEZJWE1FKG9sZSwgIiglcCk6IHN0dWJcbiIsIGxwT2xlVUlPYmplY3RQcm9wcyk7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBPTEVVSV9GQUxTRTsKIH0KQEAgLTI1OCwxMCArMjQ4LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSU9iamVjdFByb3BlcnRpZXMzMlcgKE9MRURMRy4yMSkKICAqLwotCi1VSU5UMzIgV0lOQVBJIE9sZVVJT2JqZWN0UHJvcGVydGllczMyVyhMUE9MRVVJT0JKRUNUUFJPUFNXIGxwT2xlVUlPYmplY3RQcm9wcykKK1VJTlQzMiBXSU5BUEkgT2xlVUlPYmplY3RQcm9wZXJ0aWVzMzJXKAorICBMUE9MRVVJT0JKRUNUUFJPUFMzMlcgbHBPbGVVSU9iamVjdFByb3BzKQogewotICBGSVhNRShvbGUsIiglcCk6IHN0dWJcbiIsbHBPbGVVSU9iamVjdFByb3BzKTsKKyAgRklYTUUob2xlLCAiKCVwKTogc3R1YlxuIiwgbHBPbGVVSU9iamVjdFByb3BzKTsKICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgcmV0dXJuIE9MRVVJX0ZBTFNFOwogfQpAQCAtMjY5LDEwICsyNTksMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVVJQ2hhbmdlU291cmNlMzJBIChPTEVETEcuMTIpCiAgKi8KLQotVUlOVDMyIE9sZVVJQ2hhbmdlU291cmNlMzJBKExQT0xFVUlDSEFOR0VTT1VSQ0VBIGxwT2xlVUlDaGFuZ2VTb3VyY2UpCitVSU5UMzIgV0lOQVBJIE9sZVVJQ2hhbmdlU291cmNlMzJBKAorICBMUE9MRVVJQ0hBTkdFU09VUkNFMzJBIGxwT2xlVUlDaGFuZ2VTb3VyY2UpCiB7Ci0gIEZJWE1FKG9sZSwiKCVwKTogc3R1YlxuIixscE9sZVVJQ2hhbmdlU291cmNlKTsKKyAgRklYTUUob2xlLCAiKCVwKTogc3R1YlxuIiwgbHBPbGVVSUNoYW5nZVNvdXJjZSk7CiAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgIHJldHVybiBPTEVVSV9GQUxTRTsKIH0KQEAgLTI4MCwxMCArMjcwLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVVSUNoYW5nZVNvdXJjZTMyVyAoT0xFRExHLjE3KQogICovCi0KLVVJTlQzMiBPbGVVSUNoYW5nZVNvdXJjZTMyVyhMUE9MRVVJQ0hBTkdFU09VUkNFVyBscE9sZVVJQ2hhbmdlU291cmNlKQorVUlOVDMyIFdJTkFQSSBPbGVVSUNoYW5nZVNvdXJjZTMyVygKKyAgTFBPTEVVSUNIQU5HRVNPVVJDRTMyVyBscE9sZVVJQ2hhbmdlU291cmNlKQogewotICBGSVhNRShvbGUsIiglcCk6IHN0dWJcbiIsbHBPbGVVSUNoYW5nZVNvdXJjZSk7CisgIEZJWE1FKG9sZSwgIiglcCk6IHN0dWJcbiIsIGxwT2xlVUlDaGFuZ2VTb3VyY2UpOwogICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICByZXR1cm4gT0xFVUlfRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL01ha2VmaWxlLmluCmluZGV4IDY4NmY1YjMuLjNkNDk4ZTcgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL01ha2VmaWxlLmluCkBAIC0xLDUgKzEsNiBAQAogU1VCRElSUyA9IFwKIAljbG9jayBcCisJY29udHJvbCBcCiAJbm90ZXBhZCBcCiAJcHJvZ21hbiBcCiAJcmVndGVzdCBcCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jb250cm9sL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvY29udHJvbC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M0MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvY29udHJvbC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI3IEBACitERUZTICAgICAgPSAtRFdJTkVMSUIKK1RPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAorVE9QT0JKRElSID0gLi4vLi4KK1NSQ0RJUiAgICA9IEBzcmNkaXJACitWUEFUSCAgICAgPSBAc3JjZGlyQAorTU9EVUxFICAgID0gbm9uZQorUFJPR1JBTVMgID0gY29udHJvbAorQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKKworQ19TUkNTID0gY29udHJvbC5jCisKK2FsbDogJChQUk9HUkFNUykKKworQE1BS0VfUlVMRVNACisKK2NvbnRyb2w6ICQoT0JKUykKKwkkKENDKSAtbyBjb250cm9sICQoT0JKUykgJChMRE9QVElPTlMpICQoQUxMX0xJQlMpCisKK2luc3RhbGw6IGR1bW15CisJJChJTlNUQUxMX1BST0dSQU0pIGNvbnRyb2wgJChiaW5kaXIpL2NvbnRyb2wKKwordW5pbnN0YWxsOiBkdW1teQorCSQoUk0pICQoYmluZGlyKS9jb250cm9sCisKK2R1bW15OgorCisjIyMgRGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY29udHJvbC9jb250cm9sLmMgYi9wcm9ncmFtcy9jb250cm9sL2NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVlMGIxCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvY29udHJvbC9jb250cm9sLmMKQEAgLTAsMCArMSw1MyBAQAorLyogCisgKiAgIENvbnRyb2wKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqICAgVG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpbmUgbGljZW5zZQorICovCisKKyNpbmNsdWRlIDx3aW4uaD4KKyNpbmNsdWRlIDxzaGVsbC5oPgorI2luY2x1ZGUgInBhcmFtcy5oIgorCit2b2lkIGxhdW5jaChjaGFyIHdoYXRbMjU1XSkKK3sgCisgIEhJTlNUQU5DRSBoQ2hpbGQ7CisgIGNoYXIgc3pBcmdzWzI1NV07CisKKyAgbHN0cmNweShzekFyZ3MsIHN6RVhFQ19BUkdTKTsKKyAgc3RyY2F0KHN6QXJncywgd2hhdCk7CisKKyAgaENoaWxkID0gU2hlbGxFeGVjdXRlKChIV05EKTAsIDAsIHN6RVhFQ19QUkVGSVgsIHN6QXJncywgIiIsIFNXX1NIT1dOT1JNQUwpOworICBleGl0KDApOworfQorCitpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXYsIENIQVIgKnN6UGFyYW0sIElOVCBhcmdjKSAKK3sKKworICBjaGFyIHN6UGFyYW1zWzI1NV07CisgIGxzdHJjcHkoc3pQYXJhbXMsIHN6UGFyYW0pOworICBDaGFyVXBwZXIoc3pQYXJhbXMpOworCisgIHN3aXRjaCAoYXJnYykgeworICAgIGNhc2UgMDogIC8qIG5vIHBhcmFtZXRlcnMgLSBwb3AgdXAgd2hvbGUgIkNvbnRyb2wgUGFuZWwiIGJ5IGRlZmF1bHQgKi8KKyAgICAgICAgICAgICBsYXVuY2goIiIpOworICAgICAgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxOiAgLyogY2hlY2sgZm9yIG9wdGlvbmFsIHBhcmFtZXRlciAqLworICAgICAgICAgICAgIGlmIChzdHJjbXAoc3pQYXJhbXMsc3pQX0RFU0tUT1ApICAgICAgPT0wKSBsYXVuY2goc3pDX0RFU0tUT1ApOworICAgICAgICAgICAgIGlmIChzdHJjbXAoc3pQYXJhbXMsc3pQX0NPTE9SKSAgICAgICAgPT0wKSBsYXVuY2goc3pDX0NPTE9SKTsKKyAgICAgICAgICAgICBpZiAoc3RyY21wKHN6UGFyYW1zLHN6UF9EQVRFVElNRSkgICAgID09MCkgbGF1bmNoKHN6Q19EQVRFVElNRSk7CisgICAgICAgICAgICAgaWYgKHN0cmNtcChzelBhcmFtcyxzelBfREVTS1RPUCkgICAgICA9PTApIGxhdW5jaChzekNfREVTS1RPUCk7CisgICAgICAgICAgICAgaWYgKHN0cmNtcChzelBhcmFtcyxzelBfSU5URVJOQVRJT05BTCk9PTApIGxhdW5jaChzekNfSU5URVJOQVRJT05BTCk7CisgICAgICAgICAgICAgaWYgKHN0cmNtcChzelBhcmFtcyxzelBfS0VZQk9BUkQpICAgICA9PTApIGxhdW5jaChzekNfS0VZQk9BUkQpOworICAgICAgICAgICAgIGlmIChzdHJjbXAoc3pQYXJhbXMsc3pQX01PVVNFKSAgICAgICAgPT0wKSBsYXVuY2goc3pDX01PVVNFKTsKKyAgICAgICAgICAgICBpZiAoc3RyY21wKHN6UGFyYW1zLHN6UF9QT1JUUykgICAgICAgID09MCkgbGF1bmNoKHN6Q19QT1JUUyk7CisgICAgICAgICAgICAgaWYgKHN0cmNtcChzelBhcmFtcyxzelBfUFJJTlRFUlMpICAgICA9PTApIGxhdW5jaChzekNfUFJJTlRFUlMpOworCisgICAgICAgICAgICAgLyogY291bGRuJ3QgcmVjb2duaXplIGRlc2lyZWQgcGFuZWwsIGdvaW5nIGRlZmF1bHQgbW9kZSAqLworICAgICAgICAgICAgIGxhdW5jaCgiIik7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiBwcmludGYoIlN5bnRheCBlcnJvci4iKTsKKyAgfQorICByZXR1cm4gMDsgIAorfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY29udHJvbC9jcGxfbGlzdCBiL3Byb2dyYW1zL2NvbnRyb2wvY3BsX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkYzkzOAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2NvbnRyb2wvY3BsX2xpc3QKQEAgLTAsMCArMSw2NiBAQAorCitBbHBoYWJldGljYWwgTGlzdCBvZiBXaW5kb3dzIDk1IENvbnRyb2wgUGFuZWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpbGVuYW1lICAgICAgIERlc2NyaXB0aW9uCisKK0FQUFdJWi5DUEwgICAgIFNvZnR3YXJlIFByb3BlcnRpZXMKK0RFU0suQ1BMICAgICAgIERlc2t0b3AgUHJvcGVydGllcworICAgICAgICAgICAgICAgLCwwIC0gQmFja2dyb3VuZCBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAsLDEgLSBTY3JlZW4gU2F2ZXIgUHJvcGVydGllcworICAgICAgICAgICAgICAgLCwyIC0gQ29sb3IgUHJvcGVydGllcworSU5FVENQTC5DUEwgICAgSW50ZXJuZXQgUHJvcGVydGllcyAoZG9lcyBub3QgdGFrZSBhcmd1bWVudHMpCitJTlRMLkNQTCAgICAgICBJbnRlcm5hdGlvbiBDb3VudHJ5L1RpbWV6b25lIFByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICwsMCAtIENvdW50cnktc3BlY2lmaWMgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICwsMSAtIE51bWJlcnMKKyAgICAgICAgICAgICAgICwsMiAtIEN1cnJlbmN5CisgICAgICAgICAgICAgICAsLDMgLSBDbG9jaworICAgICAgICAgICAgICAgLCw0IC0gRGF0ZQorSk9ZLkNQTCAgICAgICAgSm95c3RpY2sgUHJvcGVydGllcworTUFJTi5DUEwgICAgICAgQDAgICAtIE1vdXNlIEJ1dHRvbnMgUHJvcGVydGllcyAKKyAgICAgICAgICAgICAgIEAxICAgLSBLZXlib2FyZCBTcGVlZCBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICBAMSwxIC0gS2V5Ym9hcmQgTGFuZ3VhZ2UgUHJvcGVydGllcworICAgICAgICAgICAgICAgQDEsMiAtIEtleWJvYXJkIEdlbmVyYWwgUHJvcGVydGllcworICAgICAgICAgICAgICAgQDIgICAtIFByaW50ZXIKKyAgICAgICAgICAgICAgIEAzICAgLSBGb250cworICAgICAgICAgICAgICAgQDQgICAtIEVuZXJneQorTU1TWVMuQ1BMICAgICAgTXVsdGltZWRpYSBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAsLDAgIC0gQXVkaW8KKyAgICAgICAgICAgICAgICwsMSAgLSBWaWRlbworICAgICAgICAgICAgICAgLCwyICAtIE1JREkKKyAgICAgICAgICAgICAgICwsMyAgLSBBdWRpbyBDRAorICAgICAgICAgICAgICAgLCw0ICAtIEV4dGVuZGVkIChNdWx0aW1lZGlhIGRyaXZlcnMpCitNT0RFTS5DUEwgICAgICBNb2RlbSBQcm9wZXJ0aWVzIChkb2VzIG5vdCB0YWtlIHBhcmFtZXRlcnMpCitNU1dFQkNQTC5DUEwgICBQZXJzb25hbCBXZWJTZXJ2ZXIgUHJvcGVydGllcyAoY29tZXMgd2l0aCBXaW45NSA0LjBCKSAKKyAgICAgICAgICAgICAgIChkb2VzIG5vdCB0YWtlIHBhcmFtZXRlcnMpCitORVRDUEwuQ1BMICAgICBOZXR3b3JrIChkb2VzIG5vdCB0YWtlIHBhcmFtZXRlcnMpCitQQVNTV09SRC5DUEwgICBQYXNzd29yZCBQcm9wZXJ0aWVzIChkb2VzIG5vdCB0YWtlIHBhcmFtZXRlcnMpCitTWVNETS5DUEwgICAgICBTeXN0ZW0gUHJvcGVydGllcworICAgICAgICAgICAgICAgLCwwIC0gR2VuZXJpYworICAgICAgICAgICAgICAgLCwxIC0gRGV2aWNlIE1hbmFnZXIKKyAgICAgICAgICAgICAgICwsMiAtIEhhcmR3YXJlIFByb2ZpbGVzCisgICAgICAgICAgICAgICAsLDMgLSBBZHZhbmNlZCBGZWF0dXJlcworVEVMRVBIT04uQ1BMICAgVGVsZXBob25lIFByb3BlcnRpZXMgKHJlbmFtZWQgdG8gVEVMRVBIT04uQ1AkIGlmIG5vdCBpbnN0YWxsZWQpCisgICAgICAgICAgICAgICAoZG9lcyBub3QgdGFrZSBwYXJhbWV0ZXJzKQorVElNRURBVEUuQ1BMICAgVGltZS9EYXRlIFByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICwsMCAtIERhdGUgYW5kIFRpbWUKKyAgICAgICAgICAgICAgICwsMSAtIFRpbWV6b25lCisgICAgICAgICAgICAgICAsLG0gLSBzdW1tZXIvd2ludGVydGltZSBub3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgIChpc3N1ZWQgYnkga2VybmVsMzIuZGxsIG9uIHdpbmRvd3Mgc3RhcnR1cCkKKworCisKK0FscGhhYmV0aWNhbCBMaXN0IG9mIGFsaWVuIENQTHMgLyBydW5kbGwgY29tbWFuZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGNvbW1hbmQ6IGFtb3ZpZS5vY3gsUnVuRGxsCitkZXNjcmlwdGlvbjogcnVuIEFjdGl2ZU1vdmllIFZpZXdlcgorCisgICAgY29tbWFuZDogZGVza2NwMTYuZGxsLFFVSUNLUkVTX1JVTkRMTEVOVFJZCitkZXNjcmlwdGlvbjogc2hvdyBTVkdBIGRpc3BsYXkgbWFuYWdlciBpbiB0YXNrIGJhcgorCisgICAgY29tbWFuZDogc2hlbGwzMi5kbGwsU0hIZWxwU2hvcnRjdXRzX1J1bkRMTCBQcmludGVyc0ZvbGRlcgorZGVzY3JpcHRpb246IHNob3cgIlByaW50ZXJzIiBFeHBsb3JlciBXaW5kb3cKKworKGFkZCB5b3VyIGFsaWVuIGNvbW1hbmRzIGhlcmUpCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2NvbnRyb2wvbGNjbWFrZS5iYXQgYi9wcm9ncmFtcy9jb250cm9sL2xjY21ha2UuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmRlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jb250cm9sL2xjY21ha2UuYmF0CkBAIC0wLDAgKzEsMTkgQEAKK0BFQ0hPIE9GRg0KK3JlbQ0KK3JlbSAgIHRoaXMgaXMgYSBxdWljayBhbmQgZGlydHkgYmF0Y2ggZmlsZSB0byByZWNvbXBpbGUgY29udHJvbC5leGUNCityZW0gICBpbiBhIG5hdGl2ZSB3aW5kb3dzIGVudmlyb25tZW50IHVzaW5nIExDQy4gWW91IG1heSB3YW50IHRvIGVkaXQgDQorcmVtICAgdGhlIGZvbGxvd2luZyBsaW5lLCB3aGljaCBzaG91bGQgcG9pbnQgdG8geW91ciBMQ0MgYmFzZSBkaXJlY3Rvcnk6DQorcmVtIA0KKw0KK3NldCBMQ0NESVI9QzpcTENDDQorDQorcmVtICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorcmVtICAgIGl0J3Mgc2FmZSBub3QgdG8gY2hhbmdlIGFueXRoaW5nIGJlaGluZCB0aGlzIGxpbmUNCityZW0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitpZiBleGlzdCBjb250cm9sLm9iaiBkZWwgY29udHJvbC5vYmoNCislTENDRElSJVxiaW5cbGNjLmV4ZSAtZzIgLUklTENDRElSJVxpbmNsdWRlXCAtRFdJTjMyIGNvbnRyb2wuYw0KKyVMQ0NESVIlXGJpblxsY2NsbmsuZXhlIC1vIGNvbnRyb2wyLmV4ZSBjb250cm9sLm9iaiAlTENDRElSJVxsaWJcc2hlbGwzMi5saWINCitpZiBleGlzdCBjb250cm9sLm9iaiBkZWwgY29udHJvbC5vYmoNCisNCis6RVhJVA0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2NvbnRyb2wvcGFyYW1zLmggYi9wcm9ncmFtcy9jb250cm9sL3BhcmFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDg2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jb250cm9sL3BhcmFtcy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIAorICogICBDb250cm9sCisgKiAgIENvcHlyaWdodCAoQykgMTk5OCBieSBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKiAgIFRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaW5lIGxpY2Vuc2UKKyAqLworCisvKiBhbHBoYWJldGljYWwgbGlzdCBvZiByZWNvZ25pemVkIG9wdGlvbmFsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgc3pQX0NPTE9SICAgICAgICAgICJDT0xPUiIKKyNkZWZpbmUgc3pQX0RBVEVUSU1FICAgICAgICJEQVRFL1RJTUUiCisjZGVmaW5lIHN6UF9ERVNLVE9QICAgICAgICAiREVTS1RPUCIKKyNkZWZpbmUgc3pQX0lOVEVSTkFUSU9OQUwgICJJTlRFUk5BVElPTkFMIgorI2RlZmluZSBzelBfS0VZQk9BUkQgICAgICAgIktFWUJPQVJEIgorI2RlZmluZSBzelBfTU9VU0UgICAgICAgICAgIk1PVVNFIgorI2RlZmluZSBzelBfUE9SVFMgICAgICAgICAgIlBPUlRTIgorI2RlZmluZSBzelBfUFJJTlRFUlMgICAgICAgIlBSSU5URVJTIgorCisKKy8qIGFscGhhYmV0aWNhbCBsaXN0IG9mIGFwcHJvcHJpYXRlIGNvbW1hbmRzIHRvIGV4ZWN1dGUgKi8KKworI2RlZmluZSBzekVYRUNfUFJFRklYICAgICAgInJ1bmRsbDMyLmV4ZSIKKyNkZWZpbmUgc3pFWEVDX0FSR1MgICAgICAgICJTaGVsbDMyLmRsbCxDb250cm9sX1J1bkRMTCAiCisKKyNkZWZpbmUgc3pDX0NPTE9SICAgICAgICAgICJkZXNrLmNwbCwsMiIKKyNkZWZpbmUgc3pDX0RBVEVUSU1FICAgICAgICJkYXRldGltZS5jcGwiCisjZGVmaW5lIHN6Q19ERVNLVE9QICAgICAgICAiZGVzay5jcGwiCisjZGVmaW5lIHN6Q19GT05UUyAgICAgICAgICAibWFpbi5jcGwgQDMiCisjZGVmaW5lIHN6Q19JTlRFUk5BVElPTkFMICAiaW50bC5jcGwiCisjZGVmaW5lIHN6Q19LRVlCT0FSRCAgICAgICAibWFpbi5jcGwgQDEiCisjZGVmaW5lIHN6Q19NT1VTRSAgICAgICAgICAibWFpbi5jcGwiCisjZGVmaW5lIHN6Q19QT1JUUyAgICAgICAgICAic3lzZG0uY3BsLCwxIgorI2RlZmluZSBzekNfUFJJTlRFUlMgICAgICAgIm1haW4uY3BsIEAyIgpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9NYWtlZmlsZS5pbiBiL3JlbGF5MzIvTWFrZWZpbGUuaW4KaW5kZXggOWQ4NzE5NC4uYjNiZmE3NCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9NYWtlZmlsZS5pbgorKysgYi9yZWxheTMyL01ha2VmaWxlLmluCkBAIC0yOSw2ICsyOSw3IEBACiAJb2xlY2xpMzIuc3BlYyBcCiAJb2xlZGxnLnNwZWMgXAogCW9sZXN2cjMyLnNwZWMgXAorCXBzYXBpLnNwZWMgXAogCXJhc2FwaTMyLnNwZWMgXAogCXNoZWxsMzIuc3BlYyBcCiAJdGFwaTMyLnNwZWMgXApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9idWlsdGluMzIuYyBiL3JlbGF5MzIvYnVpbHRpbjMyLmMKaW5kZXggMTgwODFhOS4uNDJmZmQwYiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9idWlsdGluMzIuYworKysgYi9yZWxheTMyL2J1aWx0aW4zMi5jCkBAIC01MSw2ICs1MSw3IEBACiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgT0xFQ0xJMzJfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBPTEVETEdfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBPTEVTVlIzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFBTQVBJX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgUkFTQVBJMzJfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBTSEVMTDMyX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgVEFQSTMyX0Rlc2NyaXB0b3I7CkBAIC04OCw2ICs4OSw3IEBACiAgICAgeyAmT0xFQ0xJMzJfRGVzY3JpcHRvciwgRkFMU0UgfSwKICAgICB7ICZPTEVETEdfRGVzY3JpcHRvciwgICBGQUxTRSB9LAogICAgIHsgJk9MRVNWUjMyX0Rlc2NyaXB0b3IsIEZBTFNFIH0sCisgICAgeyAmUFNBUElfRGVzY3JpcHRvciwgICAgRkFMU0UgfSwKICAgICB7ICZSQVNBUEkzMl9EZXNjcmlwdG9yLCBGQUxTRSB9LAogICAgIHsgJlNIRUxMMzJfRGVzY3JpcHRvciwgIFRSVUUgIH0sCiAgICAgeyAmVEFQSTMyX0Rlc2NyaXB0b3IsICAgRkFMU0UgfSwKZGlmZiAtLWdpdCBhL3JlbGF5MzIvY29tY3RsMzIuc3BlYyBiL3JlbGF5MzIvY29tY3RsMzIuc3BlYwppbmRleCBlMWYzNWU1Li4xNmRmMzhlIDEwMDY0NAotLS0gYS9yZWxheTMyL2NvbWN0bDMyLnNwZWMKKysrIGIvcmVsYXkzMi9jb21jdGwzMi5zcGVjCkBAIC0xNiw3ICsxNiw3IEBACiAgIDggc3RkY2FsbCBDcmVhdGVNYXBwZWRCaXRtYXAobG9uZyBsb25nIGxvbmcgcHRyIGxvbmcpIENyZWF0ZU1hcHBlZEJpdG1hcAogICA5IHN0dWIgQ09NQ1RMMzJfOQogIDEwIHN0dWIgQ09NQ1RMMzJfMTAKLSAxMSBzdHViIENPTUNUTDMyXzExCisgMTEgc3RkY2FsbCBDT01DVEwzMl8xMShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgQ09NQ1RMMzJfMTEKICAxMiBzdHViIENjdGwxNjMyX1RodW5rRGF0YTMyCiAgMTMgc3R1YiBNYWtlRHJhZ0xpc3QKICAxNCBzdHViIExCSXRlbUZyb21QdApAQCAtOTQsMjQgKzk0LDI0IEBACiAgODYgc3R1YiBVbmluaXRpYWxpemVGbGF0U0IKICA4NyBzdHViIF9UcmFja01vdXNlRXZlbnQKIAotMTUxIHN0ZGNhbGwgQ3JlYXRlTVJVTGlzdEEobG9uZykgQ3JlYXRlTVJVTGlzdDMyQQotMTUyIHN0dWIgRnJlZU1SVUxpc3RANAorMTUxIHN0ZGNhbGwgQ3JlYXRlTVJVTGlzdEEocHRyKSBDcmVhdGVNUlVMaXN0MzJBCisxNTIgc3RkY2FsbCBGcmVlTVJVTGlzdChsb25nKSBGcmVlTVJVTGlzdDMyQQogMTUzIHN0dWIgQWRkTVJVU3RyaW5nQUA4CiAxNTQgc3R1YiBFbnVtTVJVTGlzdEFAMTYKIDE1NSBzdHViIEZpbmRNUlVTdHJpbmdBQDEyCiAxNTYgc3R1YiBEZWxNUlVTdHJpbmdAOAotMTU3IHN0dWIgQ09NQ1RMMzJfMTU3CisxNTcgc3RkY2FsbCBDT01DVEwzMl8xNTcocHRyIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVNUlVMaXN0RXgzMkEKIAogMTYzIHN0dWIgQ3JlYXRlUGFnZQogMTY0IHN0dWIgQ3JlYXRlUHJveHlQYWdlCiAKLTE2NyBzdHViIEFkZE1SVURhdGFAMTIKLTE2OSBzdHViIEZpbmRNUlVEYXRhQDE2CisxNjcgc3RkY2FsbCBBZGRNUlVEYXRhKGxvbmcgbG9uZyBsb25nKSBBZGRNUlVEYXRhCisxNjkgc3RkY2FsbCBGaW5kTVJVRGF0YShsb25nIGxvbmcgbG9uZyBsb25nKSBGaW5kTVJVRGF0YQogCi0yMzMgc3R1YiBTdHJfR2V0UHRyQQotMjM0IHN0ZGNhbGwgU3RyX1NldFB0ckEobG9uZyBsb25nKSBDT01DVEwzMl9TdHJfU2V0UHRyQQotMjM1IHN0dWIgU3RyX0dldFB0clcKLTIzNiBzdHViIFN0cl9TZXRQdHJXCisyMzMgc3RkY2FsbCBTdHJfR2V0UHRyQShzdHIgc3RyIGxvbmcpIFN0cl9HZXRQdHIzMkEKKzIzNCBzdGRjYWxsIFN0cl9TZXRQdHJBKHN0ciBzdHIpIFN0cl9TZXRQdHIzMkEKKzIzNSBzdGRjYWxsIFN0cl9HZXRQdHJXKHdzdHIgd3N0ciBsb25nKSBTdHJfR2V0UHRyMzJXCisyMzYgc3RkY2FsbCBTdHJfU2V0UHRyVyh3c3RyIHdzdHIpIFN0cl9TZXRQdHIzMlcKIAogMzIwIHN0ZGNhbGwgRFNBX0NyZWF0ZShsb25nIGxvbmcpIERTQV9DcmVhdGUKIDMyMSBzdGRjYWxsIERTQV9EZXN0cm95KHB0cikgRFNBX0Rlc3Ryb3kKQEAgLTE2OCwxMCArMTY4LDEwIEBACiAzODIgc3R1YiBTbW9vdGhTY3JvbGxXaW5kb3dANAogMzgzIHN0dWIgRG9SZWFkZXJNb2RlQDQKIDM4NCBzdHViIFNldFBhdGhXb3JkQnJlYWtQcm9jQDgKLTM4NSBzdHViIENPTUNUTDMyXzM4NQotMzg2IHN0dWIgQ09NQ1RMMzJfMzg2Ci0zODcgc3R1YiBDT01DVEwzMl8zODcKLTM4OCBzdHViIENPTUNUTDMyXzM4OAorMzg1IHN0ZGNhbGwgQ09NQ1RMMzJfMzg1KGxvbmcgbG9uZyBsb25nKSBDT01DVEwzMl8zODUKKzM4NiBzdGRjYWxsIENPTUNUTDMyXzM4Nihsb25nIGxvbmcgbG9uZykgQ09NQ1RMMzJfMzg2CiszODcgc3RkY2FsbCBDT01DVEwzMl8zODcobG9uZyBsb25nIGxvbmcpIENPTUNUTDMyXzM4NworMzg4IHN0ZGNhbGwgQ09NQ1RMMzJfMzg4KGxvbmcgbG9uZyBsb25nKSBDT01DVEwzMl8zODgKIDM4OSBzdHViIENPTUNUTDMyXzM4OQogMzkwIHN0dWIgQ09NQ1RMMzJfMzkwCiAKZGlmZiAtLWdpdCBhL3JlbGF5MzIvY3J0ZGxsLnNwZWMgYi9yZWxheTMyL2NydGRsbC5zcGVjCmluZGV4IDhkMTVmYzcuLjk5Zjk2N2IgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvY3J0ZGxsLnNwZWMKKysrIGIvcmVsYXkzMi9jcnRkbGwuc3BlYwpAQCAtMjYsNyArMjYsNyBAQAogIDIyIGNkZWNsIF9fR2V0TWFpbkFyZ3MocHRyIHB0ciBwdHIgbG9uZykgQ1JURExMX19HZXRNYWluQXJncwogIDIzIGV4dGVybiBfX2FyZ2NfZGxsIENSVERMTF9hcmdjX2RsbAogIDI0IGV4dGVybiBfX2FyZ3ZfZGxsIENSVERMTF9hcmd2X2RsbAotIDI1IHN0dWIgX19kbGxvbmV4aXQKKyAyNSBjZGVjbCBfX2RsbG9uZXhpdCgpIENSVERMTF9fZGxsb25leGl0CiAgMjYgc3R1YiBfX2Rvc2Vycm5vCiAgMjcgc3R1YiBfX2ZwZWNvZGUKICAyOCBzdHViIF9faXNhc2NpaQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9nZGkzMi5zcGVjIGIvcmVsYXkzMi9nZGkzMi5zcGVjCmluZGV4IDhmMzEwMDAuLjNjYjc3MjcgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvZ2RpMzIuc3BlYworKysgYi9yZWxheTMyL2dkaTMyLnNwZWMKQEAgLTk4LDcgKzk4LDcgQEAKICA5NCBzdGRjYWxsIEV4dENyZWF0ZVJlZ2lvbihwdHIgbG9uZyBwdHIpIEV4dENyZWF0ZVJlZ2lvbgogIDk1IHN0ZGNhbGwgRXh0RXNjYXBlKGxvbmcgbG9uZyBsb25nIHB0ciBsb25nIHB0cikgRXh0RXNjYXBlMzIKICA5NiBzdGRjYWxsIEV4dEZsb29kRmlsbChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEV4dEZsb29kRmlsbDMyCi0gOTcgc3R1YiBFeHRTZWxlY3RDbGlwUmduCisgOTcgc3RkY2FsbCBFeHRTZWxlY3RDbGlwUmduKGxvbmcgbG9uZyBsb25nKSBFeHRTZWxlY3RDbGlwUmduCiAgOTggc3RkY2FsbCBFeHRUZXh0T3V0QShsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBzdHIgbG9uZyBwdHIpIEV4dFRleHRPdXQzMkEKICA5OSBzdGRjYWxsIEV4dFRleHRPdXRXKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyIHdzdHIgbG9uZyBwdHIpIEV4dFRleHRPdXQzMlcKIDEwMCBzdGRjYWxsIEZpbGxQYXRoKGxvbmcpIEZpbGxQYXRoMzIKQEAgLTM4OSwzICszODksNiBAQAogMzg0IHN0dWIgVXBkYXRlSUNNUmVnS2V5VwogMzg1IHN0dWIgZ2RpUGxheVNwb29sU3RyZWFtCiAzODYgc3RkY2FsbCBTZXRPYmplY3RPd25lcihsb25nIGxvbmcpIFNldE9iamVjdE93bmVyMzIKKzM4NyBzdHViIFVwZGF0ZUlDTVJlZ0tleQorMzg4IGV4dGVybiBwZm5SZWFsaXplUGFsZXR0ZSBwZm5SZWFsaXplUGFsZXR0ZQorMzg5IGV4dGVybiBwZm5TZWxlY3RQYWxldHRlIHBmblNlbGVjdFBhbGV0dGUKZGlmZiAtLWdpdCBhL3JlbGF5MzIva2VybmVsMzIuc3BlYyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwppbmRleCA3ZTExZWY1Li45MmQyMjVlIDEwMDY0NAotLS0gYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMKKysrIGIvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCkBAIC0yMTIsOCArMjEyLDggQEAKIDE5NSBzdGRjYWxsIEVudGVyQ3JpdGljYWxTZWN0aW9uKHB0cikgRW50ZXJDcml0aWNhbFNlY3Rpb24KIDE5NiBzdHViIEVudW1DYWxlbmRhckluZm9BCiAxOTcgc3R1YiBFbnVtQ2FsZW5kYXJJbmZvVwotMTk4IHN0dWIgRW51bURhdGVGb3JtYXRzQQotMTk5IHN0dWIgRW51bURhdGVGb3JtYXRzVworMTk4IHN0ZGNhbGwgRW51bURhdGVGb3JtYXRzQShwdHIgbG9uZyBsb25nKSBFbnVtRGF0ZUZvcm1hdHMzMkEKKzE5OSBzdGRjYWxsIEVudW1EYXRlRm9ybWF0c1cocHRyIGxvbmcgbG9uZykgRW51bURhdGVGb3JtYXRzMzJXCiAyMDAgc3RkY2FsbCBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBKGxvbmcgc3RyIHN0ciBwdHIgbG9uZykgRW51bVJlc291cmNlTGFuZ3VhZ2VzMzJBCiAyMDEgc3RkY2FsbCBFbnVtUmVzb3VyY2VMYW5ndWFnZXNXKGxvbmcgd3N0ciB3c3RyIHB0ciBsb25nKSBFbnVtUmVzb3VyY2VMYW5ndWFnZXMzMlcKIDIwMiBzdGRjYWxsIEVudW1SZXNvdXJjZU5hbWVzQShsb25nIHN0ciBwdHIgbG9uZykgRW51bVJlc291cmNlTmFtZXMzMkEKQEAgLTIyNCw4ICsyMjQsOCBAQAogMjA3IHN0ZGNhbGwgRW51bVN5c3RlbUNvZGVQYWdlc1cocHRyIGxvbmcpIEVudW1TeXN0ZW1Db2RlUGFnZXMzMlcKIDIwOCBzdGRjYWxsIEVudW1TeXN0ZW1Mb2NhbGVzQShwdHIgbG9uZykgRW51bVN5c3RlbUxvY2FsZXMzMkEKIDIwOSBzdGRjYWxsIEVudW1TeXN0ZW1Mb2NhbGVzVyhwdHIgbG9uZykgRW51bVN5c3RlbUxvY2FsZXMzMlcKLTIxMCBzdHViIEVudW1UaW1lRm9ybWF0c0EKLTIxMSBzdHViIEVudW1UaW1lRm9ybWF0c1cKKzIxMCBzdGRjYWxsIEVudW1UaW1lRm9ybWF0c0EocHRyIGxvbmcgbG9uZykgRW51bVRpbWVGb3JtYXRzMzJBCisyMTEgc3RkY2FsbCBFbnVtVGltZUZvcm1hdHNXKHB0ciBsb25nIGxvbmcpIEVudW1UaW1lRm9ybWF0czMyVwogMjEyIHN0dWIgRXJhc2VUYXBlCiAyMTMgc3RkY2FsbCBFc2NhcGVDb21tRnVuY3Rpb24obG9uZyBsb25nKSBFc2NhcGVDb21tRnVuY3Rpb24zMgogMjE0IHN0ZGNhbGwgRXhpdFByb2Nlc3MobG9uZykgRXhpdFByb2Nlc3MKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbXN2ZnczMi5zcGVjIGIvcmVsYXkzMi9tc3ZmdzMyLnNwZWMKaW5kZXggMWY3NTQ2MS4uZTgyOTU3NyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9tc3ZmdzMyLnNwZWMKKysrIGIvcmVsYXkzMi9tc3ZmdzMyLnNwZWMKQEAgLTEsNyArMSw3IEBACiBuYW1lCW1zdmZ3MzIKIHR5cGUJd2luMzIKIAotICAyIHN0dWIgICAgVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgorICAyIHN0ZGNhbGwgVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbigpIFZpZGVvRm9yV2luZG93c1ZlcnNpb24KICAgMyBzdHViICAgIERyYXdEaWJCZWdpbgogICA0IHN0dWIgICAgRHJhd0RpYkNoYW5nZVBhbGV0dGUKICAgNSBzdHViICAgIERyYXdEaWJDbG9zZQpAQCAtOSw3ICs5LDcgQEAKICAgNyBzdHViICAgIERyYXdEaWJFbmQKICAgOCBzdHViICAgIERyYXdEaWJHZXRCdWZmZXIKICAgOSBzdHViICAgIERyYXdEaWJHZXRQYWxldHRlCi0gMTAgc3R1YiAgICBEcmF3RGliT3BlbgorIDEwIHN0ZGNhbGwgRHJhd0RpYk9wZW4oKSBEcmF3RGliT3BlbjMyCiAgMTEgc3R1YiAgICBEcmF3RGliUHJvZmlsZURpc3BsYXkKICAxMiBzdHViICAgIERyYXdEaWJSZWFsaXplCiAgMTMgc3R1YiAgICBEcmF3RGliU2V0UGFsZXR0ZQpAQCAtMjcsMTkgKzI3LDE5IEBACiAgMjUgc3R1YiAgICBJQ0NvbXByZXNzb3JGcmVlCiAgMjYgc3R1YiAgICBJQ0RlY29tcHJlc3MKICAyNyBzdHViICAgIElDRHJhdwotIDI4IHN0dWIgICAgSUNEcmF3QmVnaW4KKyAyOCBzdGRjYWxsIElDRHJhd0JlZ2luKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSUNEcmF3QmVnaW4zMgogIDI5IHN0dWIgICAgSUNHZXREaXNwbGF5Rm9ybWF0Ci0gMzAgc3R1YiAgICBJQ0dldEluZm8KKyAzMCBzdGRjYWxsIElDR2V0SW5mbyhsb25nIHB0ciBsb25nKSBJQ0dldEluZm8zMgogIDMxIHN0dWIgICAgSUNJbWFnZUNvbXByZXNzCiAgMzIgc3R1YiAgICBJQ0ltYWdlRGVjb21wcmVzcwotIDMzIHN0dWIgICAgSUNJbmZvCisgMzMgc3RkY2FsbCBJQ0luZm8obG9uZyBsb25nIHB0cikgSUNJbmZvMzIKICAzNCBzdHViICAgIElDSW5zdGFsbAogIDM1IHN0dWIgICAgSUNMb2NhdGUKICAzNiBzdHViICAgIElDTVRodW5rMzIKLSAzNyBzdHViICAgIElDT3BlbgorIDM3IHN0ZGNhbGwgSUNPcGVuKGxvbmcgbG9uZyBsb25nKSBJQ09wZW4zMgogIDM4IHN0dWIgICAgSUNPcGVuRnVuY3Rpb24KICAzOSBzdHViICAgIElDUmVtb3ZlCi0gNDAgc3R1YiAgICBJQ1NlbmRNZXNzYWdlCisgNDAgc3RkY2FsbCBJQ1NlbmRNZXNzYWdlKGxvbmcgbG9uZyBsb25nIGxvbmcpIElDU2VuZE1lc3NhZ2UzMgogIDQxIHN0dWIgICAgSUNTZXFDb21wcmVzc0ZyYW1lCiAgNDIgc3R1YiAgICBJQ1NlcUNvbXByZXNzRnJhbWVFbmQKICA0MyBzdHViICAgIElDU2VxQ29tcHJlc3NGcmFtZVN0YXJ0CmRpZmYgLS1naXQgYS9yZWxheTMyL3BzYXBpLnNwZWMgYi9yZWxheTMyL3BzYXBpLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMzFkYgotLS0gL2Rldi9udWxsCisrKyBiL3JlbGF5MzIvcHNhcGkuc3BlYwpAQCAtMCwwICsxLDIxIEBACituYW1lICAgIHBzYXBpCit0eXBlICAgIHdpbjMyCisKKyAgMSBzdHViIEVtcHR5V29ya2luZ1NldAorICAyIHN0dWIgRW51bURldmljZURyaXZlcnMKKyAgMyBzdHViIEVudW1Qcm9jZXNzTW9kdWxlcworICA0IHN0dWIgRW51bVByb2Nlc3NlcworICA1IHN0dWIgR2V0RGV2aWNlRHJpdmVyQmFzZU5hbWVBCisgIDYgc3R1YiBHZXREZXZpY2VEcml2ZXJCYXNlTmFtZVcKKyAgNyBzdHViIEdldERldmljZURyaXZlckZpbGVOYW1lQQorICA4IHN0dWIgR2V0RGV2aWNlRHJpdmVyRmlsZU5hbWVXCisgIDkgc3R1YiBHZXRNYXBwZWRGaWxlTmFtZUEKKyAxMCBzdHViIEdldE1hcHBlZEZpbGVOYW1lVworIDExIHN0dWIgR2V0TW9kdWxlQmFzZU5hbWVBCisgMTIgc3R1YiBHZXRNb2R1bGVCYXNlTmFtZVcKKyAxMyBzdHViIEdldE1vZHVsZUZpbGVOYW1lRXhBCisgMTQgc3R1YiBHZXRNb2R1bGVGaWxlTmFtZUV4VworIDE1IHN0dWIgR2V0TW9kdWxlSW5mb3JtYXRpb24KKyAxNiBzdHViIEdldFByb2Nlc3NNZW1vcnlJbmZvCisgMTcgc3R1YiBHZXRXc0NoYW5nZXMKKyAxOCBzdHViIEluaXRpYWxpemVQcm9jZXNzRm9yV3NXYXRjaApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9zaGVsbDMyLnNwZWMgYi9yZWxheTMyL3NoZWxsMzIuc3BlYwppbmRleCBkN2ZkNmQwLi5jNDE2ZWViIDEwMDY0NAotLS0gYS9yZWxheTMyL3NoZWxsMzIuc3BlYworKysgYi9yZWxheTMyL3NoZWxsMzIuc3BlYwpAQCAtMjQsMTIgKzI0LDEyIEBACiAgIDE2IHN0ZGNhbGwgSUxGaW5kTGFzdElEKHB0cikgSUxGaW5kTGFzdElECiAgIDE3IHN0ZGNhbGwgSUxSZW1vdmVMYXN0SURANChwdHIpIElMUmVtb3ZlTGFzdElECiAgIDE4IHN0ZGNhbGwgSUxDbG9uZShwdHIpIElMQ2xvbmUKLSAgMTkgc3R1YiBJTENsb25lRmlyc3RANAorICAxOSBzdGRjYWxsIElMQ2xvbmVGaXJzdCAocHRyKSBJTENsb25lRmlyc3QKICAgMjAgc3R1YiBJTEdsb2JhbENsb25lQDQKLSAgMjEgc3R1YiBJTElzRXF1YWxAOAorICAyMSBzdGRjYWxsIElMSXNFcXVhbCAocHRyIHB0cikgSUxJc0VxdWFsCiAgIDIyIHN0ZGNhbGwgQ29udHJvbF9SdW5ETEwobG9uZyBsb25nIGxvbmcgbG9uZykgQ29udHJvbF9SdW5ETEwgIyBleHBvcnRlZCBieSBuYW1lCiAgIDIzIHN0dWIgSUxJc1BhcmVudEAxMgotICAyNCBzdHViIElMRmluZENoaWxkQDgKKyAgMjQgc3RkY2FsbCBJTEZpbmRDaGlsZCAobG9uZyBsb25nKSBJTEZpbmRDaGlsZAogICAyNSBzdGRjYWxsIElMQ29tYmluZShwdHIgcHRyKSBJTENvbWJpbmUKICAgMjYgc3R1YiBJTExvYWRGcm9tU3RyZWFtQDgKICAgMjcgc3R1YiBJTFNhdmVUb1N0cmVhbUA4CkBAIC00OCwxMCArNDgsMTAgQEAKICAgNDAgc3R1YiBQYXRoSXNSZWxhdGl2ZQogICA0MSBzdHViIENvbnRyb2xfUnVuRExMQSAgICMgZXhwb3J0ZWQgYnkgbmFtZQogICA0MiBzdHViIENvbnRyb2xfUnVuRExMVyAgICMgZXhwb3J0ZWQgYnkgbmFtZQotICA0MyBzdHViIFBhdGhJc0V4ZQorICA0MyBzdGRjYWxsIFBhdGhJc0V4ZSAocHRyKSBQYXRoSXNFeGUKICAgNDQgc3R1YiBEb0Vudmlyb25tZW50U3Vic3RBICAgIyBleHBvcnRlZCBieSBuYW1lCiAgIDQ1IHN0ZGNhbGwgUGF0aEZpbGVFeGlzdHMoc3RyKSBQYXRoRmlsZUV4aXN0cwotICA0NiBzdHViIFBhdGhNYXRjaFNwZWMKKyAgNDYgc3RkY2FsbCBQYXRoTWF0Y2hTcGVjIChzdHIgc3RyKSBQYXRoTWF0Y2hTcGVjCiAgIDQ3IHN0dWIgUGF0aE1ha2VVbmlxdWVOYW1lCiAgIDQ4IHN0dWIgUGF0aFNldERsZ0l0ZW1QYXRoCiAgIDQ5IHN0dWIgUGF0aFF1YWxpZnkKQEAgLTEwMCw3ICsxMDAsNyBAQAogICA5MiBzdHViIFBhdGhHZXRTaG9ydFBhdGgKICAgOTMgc3R1YiBXaW4zMkNyZWF0ZURpcmVjdG9yeQogICA5NCBzdHViIFdpbjMyUmVtb3ZlRGlyZWN0b3J5Ci0gIDk1IHN0dWIgU0hMb2dJTEZyb21GU0lMCisgIDk1IHN0ZGNhbGwgU0hMb2dJTEZyb21GU0lMIChwdHIpIFNITG9nSUxGcm9tRlNJTAogICA5NiBzdHViIFN0clJldFRvU3RyTgogICA5NyBzdHViIFNIV2FpdEZvckZpbGVUb09wZW4KICAgOTggc3R1YiBTSEdldFJlYWxJREwKQEAgLTE2Miw3ICsxNjIsNyBAQAogIDE1NCBzdHViIElMQXBwZW5kCiAgMTU1IHN0ZGNhbGwgSUxGcmVlKHB0cikgSUxGcmVlCiAgMTU2IHN0dWIgSUxHbG9iYWxGcmVlCi0gMTU3IHN0dWIgSUxDcmVhdGVGcm9tUGF0aAorIDE1NyBzdGRjYWxsIElMQ3JlYXRlRnJvbVBhdGggKHB0cikgSUxDcmVhdGVGcm9tUGF0aAogIDE1OCBzdGRjYWxsIFBhdGhHZXRFeHRlbnNpb24oc3RyIGxvbmcgbG9uZykgUGF0aEdldEV4dGVuc2lvbgogIDE1OSBzdHViIFBhdGhJc0RpcmVjdG9yeQogIDE2MCBzdHViIFNITmV0Q29ubmVjdGlvbkRpYWxvZwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi91c2VyMzIuc3BlYyBiL3JlbGF5MzIvdXNlcjMyLnNwZWMKaW5kZXggNTdhMjE1ZC4uOWU4Nzg4YiAxMDA2NDQKLS0tIGEvcmVsYXkzMi91c2VyMzIuc3BlYworKysgYi9yZWxheTMyL3VzZXIzMi5zcGVjCkBAIC0yNTIsOCArMjUyLDggQEAKIDI0OSBzdGRjYWxsIEdldEtleVN0YXRlKGxvbmcpIEdldEtleVN0YXRlMzIKIDI1MCBzdGRjYWxsIEdldEtleWJvYXJkTGF5b3V0KGxvbmcpIEdldEtleWJvYXJkTGF5b3V0CiAyNTEgc3RkY2FsbCBHZXRLZXlib2FyZExheW91dExpc3QobG9uZyBwdHIpIEdldEtleWJvYXJkTGF5b3V0TGlzdAotMjUyIHN0dWIgR2V0S2V5Ym9hcmRMYXlvdXROYW1lQQotMjUzIHN0dWIgR2V0S2V5Ym9hcmRMYXlvdXROYW1lVworMjUyIHN0ZGNhbGwgR2V0S2V5Ym9hcmRMYXlvdXROYW1lQShwdHIpIEdldEtleWJvYXJkTGF5b3V0TmFtZTMyQQorMjUzIHN0ZGNhbGwgR2V0S2V5Ym9hcmRMYXlvdXROYW1lVyhwdHIpIEdldEtleWJvYXJkTGF5b3V0TmFtZTMyVwogMjU0IHN0ZGNhbGwgR2V0S2V5Ym9hcmRTdGF0ZShwdHIpIEdldEtleWJvYXJkU3RhdGUKIDI1NSBzdGRjYWxsIEdldEtleWJvYXJkVHlwZShsb25nKSBHZXRLZXlib2FyZFR5cGUzMgogMjU2IHN0ZGNhbGwgR2V0TGFzdEFjdGl2ZVBvcHVwKGxvbmcpIEdldExhc3RBY3RpdmVQb3B1cDMyCkBAIC02MDgsNyArNjA4LDkgQEAKIDYwNCBzdHViIENoYW5nZURpc3BsYXlTZXR0aW5nc0EKIDYwNSBzdHViIENoYW5nZURpc3BsYXlTZXR0aW5nc1cKIDYwNiBzdGRjYWxsIFNldFdpbmRvd1RleHQobG9uZyBzdHIpIFNldFdpbmRvd1RleHQzMkEKLTYwNyBzdHViIEdldE1vbml0b3JJbmZvQQotNjA4IHN0dWIgTW9uaXRvckZyb21XaW5kb3cKLTYwOSBzdHViIE1vbml0b3JGcm9tUmVjdAotNjEwIHN0dWIgTW9uaXRvckZyb21Qb2ludAorNjA3IHN0ZGNhbGwgR2V0TW9uaXRvckluZm9BKGxvbmcgcHRyKSBHZXRNb25pdG9ySW5mbzMyQQorNjA4IHN0ZGNhbGwgR2V0TW9uaXRvckluZm9XKGxvbmcgcHRyKSBHZXRNb25pdG9ySW5mbzMyVworNjA5IHN0ZGNhbGwgTW9uaXRvckZyb21XaW5kb3cobG9uZyBsb25nKSBNb25pdG9yRnJvbVBvaW50Cis2MTAgc3RkY2FsbCBNb25pdG9yRnJvbVJlY3QocHRyIGxvbmcpIE1vbml0b3JGcm9tUmVjdAorNjExIHN0ZGNhbGwgTW9uaXRvckZyb21Qb2ludChwdHIgbG9uZykgTW9uaXRvckZyb21Qb2ludAorNjEyIHN0ZGNhbGwgRW51bURpc3BsYXlNb25pdG9ycyhsb25nIHB0ciBwdHIgbG9uZykgRW51bURpc3BsYXlNb25pdG9ycwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi93aW5tbS5zcGVjIGIvcmVsYXkzMi93aW5tbS5zcGVjCmluZGV4IDk4ZDUxY2MuLmYzNzE2YjkgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvd2lubW0uc3BlYworKysgYi9yZWxheTMyL3dpbm1tLnNwZWMKQEAgLTEzMCw3ICsxMzAsNyBAQAogMTI3IHN0ZGNhbGwgbW1pb1NlZWsobG9uZyBsb25nIGxvbmcpIG1taW9TZWVrMzIKIDEyOCBzdHViIG1taW9TZW5kTWVzc2FnZQogMTI5IHN0dWIgbW1pb1NldEJ1ZmZlcgotMTMwIHN0dWIgbW1pb1NldEluZm8KKzEzMCBzdGRjYWxsIG1taW9TZXRJbmZvKGxvbmcgcHRyIGxvbmcpIG1taW9TZXRJbmZvMzIKIDEzMSBzdGRjYWxsIG1taW9TdHJpbmdUb0ZPVVJDQ0Eoc3RyIGxvbmcpIG1taW9TdHJpbmdUb0ZPVVJDQzMyQQogMTMyIHN0ZGNhbGwgbW1pb1N0cmluZ1RvRk9VUkNDVyh3c3RyIGxvbmcpIG1taW9TdHJpbmdUb0ZPVVJDQzMyVwogMTMzIHN0dWIgbW1pb1dyaXRlCmRpZmYgLS1naXQgYS9yZWxheTMyL3duYXNwaTMyLnNwZWMgYi9yZWxheTMyL3duYXNwaTMyLnNwZWMKaW5kZXggNzdmMzBmMS4uM2Y0ZTg0NyAxMDA2NDQKLS0tIGEvcmVsYXkzMi93bmFzcGkzMi5zcGVjCisrKyBiL3JlbGF5MzIvd25hc3BpMzIuc3BlYwpAQCAtMSw2ICsxLDYgQEAKIG5hbWUJd25hc3BpMzIKIHR5cGUJd2luMzIKIAotMCBzdGRjYWxsIEdldEFTUEkzMlN1cHBvcnRJbmZvKCkgR2V0QVNQSTMyU3VwcG9ydEluZm8KLTEgc3R1YiBTZW5kQVNQSTMyQ29tbWFuZAorMCBzdGRjYWxsIEdldEFTUEkzMlN1cHBvcnRJbmZvKCkgR2V0QVNQSTMyU3VwcG9ydEluZm8zMgorMSBzdGRjYWxsIFNlbmRBU1BJMzJDb21tYW5kKHB0cikgU2VuZEFTUEkzMkNvbW1hbmQzMgogMyBzdHViIEdldEFTUEkzMkRMTFZlcnNpb24KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9jbGllbnQuYyBiL3NjaGVkdWxlci9jbGllbnQuYwppbmRleCBlMzlkODJkLi4xZTdhYTQ0IDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvY2xpZW50LmMKKysrIGIvc2NoZWR1bGVyL2NsaWVudC5jCkBAIC0xNSw4ICsxNSw4IEBACiAKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAic2VydmVyLmgiCiAjaW5jbHVkZSAic2VydmVyL3JlcXVlc3QuaCIKKyNpbmNsdWRlICJzZXJ2ZXIuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogCiAvKiBTb21lIHZlcnNpb25zIG9mIGdsaWJjIGRvbid0IGRlZmluZSB0aGlzICovCkBAIC0yNCwxNCArMjQsMTEgQEAKICNkZWZpbmUgU0NNX1JJR0hUUyAxCiAjZW5kaWYKIAotI2RlZmluZSBDSEVDS19MRU4obGVuLHdhbnRlZCkgXAotICBpZiAoKGxlbikgPT0gKHdhbnRlZCkpIDsgXAotICBlbHNlIENMSUVOVF9Qcm90b2NvbEVycm9yKCBfX0ZVTkNUSU9OX18gIjogbGVuICVkICE9ICVkXG4iLCAobGVuKSwgKHdhbnRlZCkgKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0xJRU5UX1Byb3RvY29sRXJyb3IKICAqLwotc3RhdGljIHZvaWQgQ0xJRU5UX1Byb3RvY29sRXJyb3IoIGNvbnN0IGNoYXIgKmVyciwgLi4uICkKK3ZvaWQgQ0xJRU5UX1Byb3RvY29sRXJyb3IoIGNvbnN0IGNoYXIgKmVyciwgLi4uICkKIHsKICAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKICAgICB2YV9saXN0IGFyZ3M7CkBAIC05Niw4ICs5Myw4IEBACiAgKgogICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4KICAqLwotc3RhdGljIHZvaWQgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBlbnVtIHJlcXVlc3QgcmVxLCBpbnQgcGFzc19mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIC4uLiAvKiBhcmdfMSwgbGVuXzEsIGV0Yy4gKi8gKQordm9pZCBDTElFTlRfU2VuZFJlcXVlc3QoIGVudW0gcmVxdWVzdCByZXEsIGludCBwYXNzX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCAuLi4gLyogYXJnXzEsIGxlbl8xLCBldGMuICovICkKIHsKICAgICBzdHJ1Y3QgaW92ZWMgdmVjWzE2XTsKICAgICB2YV9saXN0IGFyZ3M7CkBAIC0xOTgsOCArMTk1LDggQEAKICAqCiAgKiBXYWl0IGZvciBhIHJlcGx5IGZyb20gdGhlIHNlcnZlci4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBDTElFTlRfV2FpdFJlcGx5KCBpbnQgKmxlbiwgaW50ICpwYXNzZWRfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCAuLi4gLyogYXJnXzEsIGxlbl8xLCBldGMuICovICkKK3Vuc2lnbmVkIGludCBDTElFTlRfV2FpdFJlcGx5KCBpbnQgKmxlbiwgaW50ICpwYXNzZWRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIC4uLiAvKiBhcmdfMSwgbGVuXzEsIGV0Yy4gKi8gKQogewogICAgIHN0cnVjdCBpb3ZlYyB2ZWNbMTZdOwogICAgIHZhX2xpc3QgYXJnczsKQEAgLTQ1NCw0ICs0NTEsMyBAQAogICAgIENIRUNLX0xFTiggbGVuLCBzaXplb2YocmVwbHkpICk7CiAgICAgcmV0dXJuIHJlcGx5LnNpZ25hbGVkOwogfQotCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvZXZlbnQuYyBiL3NjaGVkdWxlci9ldmVudC5jCmluZGV4IDFjYTlkMTYuLjY1MGJmNmUgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9ldmVudC5jCisrKyBiL3NjaGVkdWxlci9ldmVudC5jCkBAIC0xMSw2ICsxMSw5IEBACiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJzeXNsZXZlbC5oIgorI2luY2x1ZGUgInNlcnZlci9yZXF1ZXN0LmgiCisjaW5jbHVkZSAic2VydmVyLmgiCiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC04MywxMiArODYsMjQgQEAKIEhBTkRMRTMyIFdJTkFQSSBDcmVhdGVFdmVudDMyQSggU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBtYW51YWxfcmVzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpbml0aWFsX3N0YXRlLCBMUENTVFIgbmFtZSApCiB7CisgICAgc3RydWN0IGNyZWF0ZV9ldmVudF9yZXF1ZXN0IHJlcTsKKyAgICBzdHJ1Y3QgY3JlYXRlX2V2ZW50X3JlcGx5IHJlcGx5OworICAgIGludCBsZW4gPSBuYW1lID8gc3RybGVuKG5hbWUpICsgMSA6IDA7CiAgICAgSEFORExFMzIgaGFuZGxlOwogICAgIEVWRU5UICpldmVudDsKIAorICAgIHJlcS5tYW51YWxfcmVzZXQgPSBtYW51YWxfcmVzZXQ7CisgICAgcmVxLmluaXRpYWxfc3RhdGUgPSBpbml0aWFsX3N0YXRlOworICAgIHJlcS5pbmhlcml0ID0gKHNhICYmIChzYS0+bkxlbmd0aD49c2l6ZW9mKCpzYSkpICYmIHNhLT5iSW5oZXJpdEhhbmRsZSk7CisKKyAgICBDTElFTlRfU2VuZFJlcXVlc3QoIFJFUV9DUkVBVEVfRVZFTlQsIC0xLCAyLCAmcmVxLCBzaXplb2YocmVxKSwgbmFtZSwgbGVuICk7CisgICAgQ0xJRU5UX1dhaXRSZXBseSggJmxlbiwgTlVMTCwgMSwgJnJlcGx5LCBzaXplb2YocmVwbHkpICk7CisgICAgQ0hFQ0tfTEVOKCBsZW4sIHNpemVvZihyZXBseSkgKTsKKyAgICBpZiAocmVwbHkuaGFuZGxlID09IC0xKSByZXR1cm4gTlVMTDsKKwogICAgIFNZU1RFTV9MT0NLKCk7Ci0gICAgZXZlbnQgPSAoRVZFTlQgKilLMzJPQkpfQ3JlYXRlKCBLMzJPQkpfRVZFTlQsIHNpemVvZigqZXZlbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgRVZFTlRfQUxMX0FDQ0VTUywgc2EsICZoYW5kbGUgKTsKKyAgICBldmVudCA9IChFVkVOVCAqKUszMk9CSl9DcmVhdGUoIEszMk9CSl9FVkVOVCwgc2l6ZW9mKCpldmVudCksIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5oYW5kbGUsIEVWRU5UX0FMTF9BQ0NFU1MsIHNhLCAmaGFuZGxlICk7CiAgICAgaWYgKGV2ZW50KQogICAgIHsKICAgICAgICAgLyogRmluaXNoIGluaXRpYWxpemluZyBpdCAqLwpAQCAtMTE0LDYgKzEyOSwxNCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTjE2X0NyZWF0ZUV2ZW50ICAgIChLRVJORUwuNDU3KQorICovCitIQU5ETEUzMiBXSU5BUEkgV0lOMTZfQ3JlYXRlRXZlbnQoIEJPT0wzMiBtYW51YWxfcmVzZXQsIEJPT0wzMiBpbml0aWFsX3N0YXRlICkKK3sKKyAgICByZXR1cm4gQ3JlYXRlRXZlbnQzMkEoIE5VTEwsIG1hbnVhbF9yZXNldCwgaW5pdGlhbF9zdGF0ZSwgTlVMTCApOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9wZW5FdmVudDMyQSAgICAoS0VSTkVMMzIuNTM2KQpAQCAtMTUwLDE0ICsxNzMsMjMgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBQdWxzZUV2ZW50KCBIQU5ETEUzMiBoYW5kbGUgKQogeworICAgIHN0cnVjdCBldmVudF9vcF9yZXF1ZXN0IHJlcTsKICAgICBFVkVOVCAqZXZlbnQ7CiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBpZiAoIShldmVudCA9IChFVkVOVCAqKUhBTkRMRV9HZXRPYmpQdHIoUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0VWRU5ULCBFVkVOVF9NT0RJRllfU1RBVEUsIE5VTEwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0VWRU5ULCBFVkVOVF9NT0RJRllfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXEuaGFuZGxlICkpKQogICAgIHsKICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIGlmIChyZXEuaGFuZGxlICE9IC0xKQorICAgIHsKKyAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICByZXEub3AgPSBQVUxTRV9FVkVOVDsKKyAgICAgICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfRVZFTlRfT1AsIC0xLCAxLCAmcmVxLCBzaXplb2YocmVxKSApOworICAgICAgICByZXR1cm4gIUNMSUVOVF9XYWl0UmVwbHkoIE5VTEwsIE5VTEwsIDAgKTsKKyAgICB9CiAgICAgZXZlbnQtPnNpZ25hbGVkID0gVFJVRTsKICAgICBTWU5DX1dha2VVcCggJmV2ZW50LT53YWl0X3F1ZXVlLCBldmVudC0+bWFudWFsX3Jlc2V0ID8gSU5GSU5JVEUzMiA6IDEgKTsKICAgICBldmVudC0+c2lnbmFsZWQgPSBGQUxTRTsKQEAgLTE3MiwxNCArMjA0LDIzIEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0RXZlbnQoIEhBTkRMRTMyIGhhbmRsZSApCiB7CisgICAgc3RydWN0IGV2ZW50X29wX3JlcXVlc3QgcmVxOwogICAgIEVWRU5UICpldmVudDsKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICghKGV2ZW50ID0gKEVWRU5UICopSEFORExFX0dldE9ialB0cihQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRVZFTlQsIEVWRU5UX01PRElGWV9TVEFURSwgTlVMTCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRVZFTlQsIEVWRU5UX01PRElGWV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcS5oYW5kbGUgKSkpCiAgICAgewogICAgICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgaWYgKHJlcS5oYW5kbGUgIT0gLTEpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJlcS5vcCA9IFNFVF9FVkVOVDsKKyAgICAgICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfRVZFTlRfT1AsIC0xLCAxLCAmcmVxLCBzaXplb2YocmVxKSApOworICAgICAgICByZXR1cm4gIUNMSUVOVF9XYWl0UmVwbHkoIE5VTEwsIE5VTEwsIDAgKTsKKyAgICB9CiAgICAgZXZlbnQtPnNpZ25hbGVkID0gVFJVRTsKICAgICBTWU5DX1dha2VVcCggJmV2ZW50LT53YWl0X3F1ZXVlLCBldmVudC0+bWFudWFsX3Jlc2V0ID8gSU5GSU5JVEUzMiA6IDEgKTsKICAgICBLMzJPQkpfRGVjQ291bnQoICZldmVudC0+aGVhZGVyICk7CkBAIC0xOTMsMTQgKzIzNCwyMyBAQAogICovCiBCT09MMzIgV0lOQVBJIFJlc2V0RXZlbnQoIEhBTkRMRTMyIGhhbmRsZSApCiB7CisgICAgc3RydWN0IGV2ZW50X29wX3JlcXVlc3QgcmVxOwogICAgIEVWRU5UICpldmVudDsKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICghKGV2ZW50ID0gKEVWRU5UICopSEFORExFX0dldE9ialB0cihQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRVZFTlQsIEVWRU5UX01PRElGWV9TVEFURSwgTlVMTCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRVZFTlQsIEVWRU5UX01PRElGWV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcS5oYW5kbGUgKSkpCiAgICAgewogICAgICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgaWYgKHJlcS5oYW5kbGUgIT0gLTEpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJlcS5vcCA9IFJFU0VUX0VWRU5UOworICAgICAgICBDTElFTlRfU2VuZFJlcXVlc3QoIFJFUV9FVkVOVF9PUCwgLTEsIDEsICZyZXEsIHNpemVvZihyZXEpICk7CisgICAgICAgIHJldHVybiAhQ0xJRU5UX1dhaXRSZXBseSggTlVMTCwgTlVMTCwgMCApOworICAgIH0KICAgICBldmVudC0+c2lnbmFsZWQgPSBGQUxTRTsKICAgICBLMzJPQkpfRGVjQ291bnQoICZldmVudC0+aGVhZGVyICk7CiAgICAgU1lTVEVNX1VOTE9DSygpOwpAQCAtMjcyLDMgKzMyMiw0OCBAQAogICAgIG9iai0+dHlwZSA9IEszMk9CSl9VTktOT1dOOwogICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBldmVudCApOwogfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IFRoZSBXaW45NSBWV2luMzJfRXZlbnQgcm91dGluZXMgZ2l2ZW4gYmVsb3cgYXJlIHJlYWxseSBsb3ctbGV2ZWwKKyAqICAgICAgIHJvdXRpbmVzIGltcGxlbWVudGVkIGRpcmVjdGx5IGJ5IFZXaW4zMi4gVGhlIHVzZXItbW9kZSBsaWJyYXJpZXMKKyAqICAgICAgIGltcGxlbWVudCBXaW4zMiBzeW5jaHJvbmlzYXRpb24gcm91dGluZXMgb24gdG9wIG9mIHRoZXNlIGxvdy1sZXZlbAorICogICAgICAgcHJpbWl0aXZlcy4gV2UgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQgaGVyZSA6LSkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFZXaW4zMl9FdmVudENyZWF0ZQkoS0VSTkVMLjQ0MikKKyAqLworSEFORExFMzIgV0lOQVBJIFZXaW4zMl9FdmVudENyZWF0ZShWT0lEKQoreworICAgIHJldHVybiBDcmVhdGVFdmVudDMyQSggTlVMTCwgRkFMU0UsIDAsIE5VTEwgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBWV2luMzJfRXZlbnREZXN0cm95CShLRVJORUwuNDQzKQorICovCitWT0lEIFdJTkFQSSBWV2luMzJfRXZlbnREZXN0cm95KEhBTkRMRTMyIGV2ZW50KQoreworICAgIENsb3NlSGFuZGxlKCBldmVudCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFZXaW4zMl9FdmVudFdhaXQJKEtFUk5FTC40NTApIAorICovCitWT0lEIFdJTkFQSSBWV2luMzJfRXZlbnRXYWl0KEhBTkRMRTMyIGV2ZW50KQoreworICAgIFNZU0xFVkVMX1JlbGVhc2VXaW4xNkxvY2soKTsKKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBldmVudCwgSU5GSU5JVEUzMiApOworICAgIFNZU0xFVkVMX1Jlc3RvcmVXaW4xNkxvY2soKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBWV2luMzJfRXZlbnRTZXQJKEtFUk5FTC40NTEpCisgKi8KK1ZPSUQgV0lOQVBJIFZXaW4zMl9FdmVudFNldChIQU5ETEUzMiBldmVudCkKK3sKKyAgICBTZXRFdmVudCggZXZlbnQgKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2hhbmRsZS5jIGIvc2NoZWR1bGVyL2hhbmRsZS5jCmluZGV4IDBmNWJkYzAuLjNkZmQwM2EgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9oYW5kbGUuYworKysgYi9zY2hlZHVsZXIvaGFuZGxlLmMKQEAgLTE2MywyMyArMTYzLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIGVudHJ5LT5hY2Nlc3MsIGFjY2VzcyApOwogICAgICAgICBwdHIgPSBlbnRyeS0+cHRyOwogICAgICAgICBpZiAoc2VydmVyX2hhbmRsZSkgKnNlcnZlcl9oYW5kbGUgPSBlbnRyeS0+c2VydmVyOwotICAgICAgICBpZiAocHRyICYmICgodHlwZSA9PSBLMzJPQkpfVU5LTk9XTikgfHwgKHB0ci0+dHlwZSA9PSB0eXBlKSkpCi0gICAgICAgICAgICBLMzJPQkpfSW5jQ291bnQoIHB0ciApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwdHIgPSBOVUxMOwogICAgIH0KICAgICBlbHNlIGlmIChoYW5kbGUgPT0gQ1VSUkVOVF9USFJFQURfUFNFVURPSEFORExFKQogICAgIHsKICAgICAgICBwdHIgPSAoSzMyT0JKICopVEhSRUFEX0N1cnJlbnQoKTsKICAgICAgICBpZiAoc2VydmVyX2hhbmRsZSkgKnNlcnZlcl9oYW5kbGUgPSBDVVJSRU5UX1RIUkVBRF9QU0VVRE9IQU5ETEU7Ci0gICAgICAgSzMyT0JKX0luY0NvdW50KCBwdHIgKTsKICAgICB9CiAgICAgZWxzZSBpZiAoaGFuZGxlID09IENVUlJFTlRfUFJPQ0VTU19QU0VVRE9IQU5ETEUpCiAgICAgewogICAgICAgIHB0ciA9IChLMzJPQkogKilQUk9DRVNTX0N1cnJlbnQoKTsKICAgICAgICBpZiAoc2VydmVyX2hhbmRsZSkgKnNlcnZlcl9oYW5kbGUgPSBDVVJSRU5UX1BST0NFU1NfUFNFVURPSEFORExFOwotICAgICAgIEszMk9CSl9JbmNDb3VudCggcHRyICk7CiAgICAgfQorCisgICAgaWYgKHB0ciAmJiAoKHR5cGUgPT0gSzMyT0JKX1VOS05PV04pIHx8IChwdHItPnR5cGUgPT0gdHlwZSkpKQorICAgICAgICBLMzJPQkpfSW5jQ291bnQoIHB0ciApOworICAgIGVsc2UKKyAgICAgICAgcHRyID0gTlVMTDsKKwogICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICBpZiAoIXB0cikgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOwogICAgIHJldHVybiBwdHI7CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvazMyb2JqLmMgYi9zY2hlZHVsZXIvazMyb2JqLmMKaW5kZXggYWViY2E2MS4uN2VhYWI2MCAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL2szMm9iai5jCisrKyBiL3NjaGVkdWxlci9rMzJvYmouYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAgKiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGVycm9yIF9vcl8gaWYgdGhlIG9iamVjdCBhbHJlYWR5IGV4aXN0ZWQuCiAgKiBUaGUgcmVmY291bnQgb2YgdGhlIG9iamVjdCBtdXN0IGJlIGRlY3JlbWVudGVkIG9uY2UgaXQgaXMgaW5pdGlhbGl6ZWQuCiAgKi8KLUszMk9CSiAqSzMyT0JKX0NyZWF0ZSggSzMyT0JKX1RZUEUgdHlwZSwgRFdPUkQgc2l6ZSwgTFBDU1RSIG5hbWUsCitLMzJPQkogKkszMk9CSl9DcmVhdGUoIEszMk9CSl9UWVBFIHR5cGUsIERXT1JEIHNpemUsIExQQ1NUUiBuYW1lLCBpbnQgc2VydmVyX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgYWNjZXNzLCBTRUNVUklUWV9BVFRSSUJVVEVTICpzYSwgSEFORExFMzIgKmhhbmRsZSkKIHsKICAgICBCT09MMzIgaW5oZXJpdCA9IChzYSAmJiAoc2EtPm5MZW5ndGg+PXNpemVvZigqc2EpKSAmJiBzYS0+YkluaGVyaXRIYW5kbGUpOwpAQCAtMTc3LDEyICsxNzcsMTMgQEAKICAgICAgICAgaWYgKG9iai0+dHlwZSA9PSB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7Ci0gICAgICAgICAgICAqaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQsIC0xICk7CisgICAgICAgICAgICAqaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQsIHNlcnZlcl9oYW5kbGUgKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfRFVQX05BTUUgKTsKICAgICAgICAgICAgICpoYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOworICAgICAgICAgICAgaWYgKHNlcnZlcl9oYW5kbGUgIT0gLTEpIENMSUVOVF9DbG9zZUhhbmRsZSggc2VydmVyX2hhbmRsZSApOwogICAgICAgICB9CiAgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTk1LDYgKzE5Niw3IEBACiAgICAgewogICAgICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgICAgICpoYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOworICAgICAgICBpZiAoc2VydmVyX2hhbmRsZSAhPSAtMSkgQ0xJRU5UX0Nsb3NlSGFuZGxlKCBzZXJ2ZXJfaGFuZGxlICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBvYmotPnR5cGUgICAgID0gdHlwZTsKQEAgLTIwOSwxMiArMjExLDEzIEBACiAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBvYmogKTsKICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgICAgICAqaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKKyAgICAgICAgaWYgKHNlcnZlcl9oYW5kbGUgIT0gLTEpIENMSUVOVF9DbG9zZUhhbmRsZSggc2VydmVyX2hhbmRsZSApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBBbGxvY2F0ZSBhIGhhbmRsZSAqLwogCi0gICAgKmhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0LCAtMSApOworICAgICpoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCBvYmosIGFjY2VzcywgaW5oZXJpdCwgc2VydmVyX2hhbmRsZSApOwogICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICByZXR1cm4gb2JqOwogfQpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL211dGV4LmMgYi9zY2hlZHVsZXIvbXV0ZXguYwppbmRleCAwODRmYWUwLi40YTMyZTE1IDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvbXV0ZXguYworKysgYi9zY2hlZHVsZXIvbXV0ZXguYwpAQCAtMTEsNiArMTEsOCBAQAogI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAic2VydmVyL3JlcXVlc3QuaCIKKyNpbmNsdWRlICJzZXJ2ZXIuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgX01VVEVYCiB7CkBAIC04MSwxMiArODMsMjQgQEAKIEhBTkRMRTMyIFdJTkFQSSBDcmVhdGVNdXRleDMyQSggU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBvd25lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG5hbWUgKQogeworICAgIHN0cnVjdCBjcmVhdGVfbXV0ZXhfcmVxdWVzdCByZXE7CisgICAgc3RydWN0IGNyZWF0ZV9tdXRleF9yZXBseSByZXBseTsKKyAgICBpbnQgbGVuID0gbmFtZSA/IHN0cmxlbihuYW1lKSArIDEgOiAwOwogICAgIEhBTkRMRTMyIGhhbmRsZTsKICAgICBNVVRFWCAqbXV0ZXg7CiAKKyAgICByZXEub3duZWQgICA9IG93bmVyOworICAgIHJlcS5pbmhlcml0ID0gKHNhICYmIChzYS0+bkxlbmd0aD49c2l6ZW9mKCpzYSkpICYmIHNhLT5iSW5oZXJpdEhhbmRsZSk7CisKKyAgICBDTElFTlRfU2VuZFJlcXVlc3QoIFJFUV9DUkVBVEVfTVVURVgsIC0xLCAyLCAmcmVxLCBzaXplb2YocmVxKSwgbmFtZSwgbGVuICk7CisgICAgQ0xJRU5UX1dhaXRSZXBseSggJmxlbiwgTlVMTCwgMSwgJnJlcGx5LCBzaXplb2YocmVwbHkpICk7CisgICAgQ0hFQ0tfTEVOKCBsZW4sIHNpemVvZihyZXBseSkgKTsKKyAgICBpZiAocmVwbHkuaGFuZGxlID09IC0xKSByZXR1cm4gTlVMTDsKKwogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgbXV0ZXggPSAoTVVURVggKilLMzJPQkpfQ3JlYXRlKCBLMzJPQkpfTVVURVgsIHNpemVvZigqbXV0ZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTVVURVhfQUxMX0FDQ0VTUywgc2EsICZoYW5kbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHJlcGx5LmhhbmRsZSwgTVVURVhfQUxMX0FDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhLCAmaGFuZGxlICk7CiAgICAgaWYgKG11dGV4KQogICAgIHsKICAgICAgICAgLyogRmluaXNoIGluaXRpYWxpemluZyBpdCAqLwpAQCAtMTY1LDE0ICsxNzksMjIgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBSZWxlYXNlTXV0ZXgoIEhBTkRMRTMyIGhhbmRsZSApCiB7CisgICAgc3RydWN0IHJlbGVhc2VfbXV0ZXhfcmVxdWVzdCByZXE7CiAgICAgTVVURVggKm11dGV4OwogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKCEobXV0ZXggPSAoTVVURVggKilIQU5ETEVfR2V0T2JqUHRyKFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9NVVRFWCwgTVVURVhfTU9ESUZZX1NUQVRFLCBOVUxMKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9NVVRFWCwgTVVURVhfTU9ESUZZX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxLmhhbmRsZSApKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICBpZiAocmVxLmhhbmRsZSAhPSAtMSkKKyAgICB7CisgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICAgICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfUkVMRUFTRV9NVVRFWCwgLTEsIDEsICZyZXEsIHNpemVvZihyZXEpICk7CisgICAgICAgIHJldHVybiAhQ0xJRU5UX1dhaXRSZXBseSggTlVMTCwgTlVMTCwgMCApOworICAgIH0KICAgICBpZiAoIW11dGV4LT5jb3VudCB8fCAobXV0ZXgtPm93bmVyICE9IEdldEN1cnJlbnRUaHJlYWRJZCgpKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9wcm9jZXNzLmMgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCmluZGV4IGFkYWY3ODIuLjRmZmNkMWYgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9wcm9jZXNzLmMKKysrIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwpAQCAtNjQ5LDEyICs2NDksMjQgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0UHJvY2Vzc1dvcmtpbmdTZXRTaXplICAgIChLRVJORUwzMikKKyAqCQlTZXRQcm9jZXNzV29ya2luZ1NldFNpemUJW0tFUk5FTDMyLjY2Ml0KKyAqIFNldHMgdGhlIG1pbi9tYXggd29ya2luZyBzZXQgc2l6ZXMgZm9yIGEgc3BlY2lmaWVkIHByb2Nlc3MuCisgKgorICogUEFSQU1TCisgKiAgICBoUHJvY2VzcyBbSV0gSGFuZGxlIHRvIHRoZSBwcm9jZXNzIG9mIGludGVyZXN0CisgKiAgICBtaW5zZXQgICBbSV0gU3BlY2lmaWVzIG1pbmltdW0gd29ya2luZyBzZXQgc2l6ZQorICogICAgbWF4c2V0ICAgW0ldIFNwZWNpZmllcyBtYXhpbXVtIHdvcmtpbmcgc2V0IHNpemUKKyAqCisgKiBSRVRVUk5TICBTVEQKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRQcm9jZXNzV29ya2luZ1NldFNpemUoSEFORExFMzIgaFByb2Nlc3MsRFdPUkQgbWluc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbWF4c2V0KQogewotICAgIEZJWE1FKHByb2Nlc3MsIigweCUwOHgsJWxkLCVsZCk6IHN0dWJcbiIsaFByb2Nlc3MsbWluc2V0LG1heHNldCk7CisgICAgRklYTUUocHJvY2VzcywiKDB4JTA4eCwlbGQsJWxkKTogc3R1YiAtIGhhcm1sZXNzXG4iLGhQcm9jZXNzLG1pbnNldCxtYXhzZXQpOworICAgIGlmKCggbWluc2V0ID09IC0xKSAmJiAobWF4c2V0ID09IC0xKSkgeworICAgICAgICAvKiBUcmltIHRoZSB3b3JraW5nIHNldCB0byB6ZXJvICovCisgICAgICAgIC8qIFN3YXAgdGhlIHByb2Nlc3Mgb3V0IG9mIHBoeXNpY2FsIFJBTSAqLworICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3NlbWFwaG9yZS5jIGIvc2NoZWR1bGVyL3NlbWFwaG9yZS5jCmluZGV4IDYyNjE1MGUuLjdjNzFhMTAgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zZW1hcGhvcmUuYworKysgYi9zY2hlZHVsZXIvc2VtYXBob3JlLmMKQEAgLTExLDYgKzExLDggQEAKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgInNlcnZlci9yZXF1ZXN0LmgiCisjaW5jbHVkZSAic2VydmVyLmgiCiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC00NCw2ICs0Niw5IEBACiBIQU5ETEUzMiBXSU5BUEkgQ3JlYXRlU2VtYXBob3JlMzJBKCBTRUNVUklUWV9BVFRSSUJVVEVTICpzYSwgTE9ORyBpbml0aWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBtYXgsIExQQ1NUUiBuYW1lICkKIHsKKyAgICBzdHJ1Y3QgY3JlYXRlX3NlbWFwaG9yZV9yZXF1ZXN0IHJlcTsKKyAgICBzdHJ1Y3QgY3JlYXRlX3NlbWFwaG9yZV9yZXBseSByZXBseTsKKyAgICBpbnQgbGVuID0gbmFtZSA/IHN0cmxlbihuYW1lKSArIDEgOiAwOwogICAgIEhBTkRMRTMyIGhhbmRsZTsKICAgICBTRU1BUEhPUkUgKnNlbTsKIApAQCAtNTUsOSArNjAsMTkgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CiAgICAgfQogCisgICAgcmVxLmluaXRpYWwgPSAodW5zaWduZWQgaW50KWluaXRpYWw7CisgICAgcmVxLm1heCAgICAgPSAodW5zaWduZWQgaW50KW1heDsKKyAgICByZXEuaW5oZXJpdCA9IChzYSAmJiAoc2EtPm5MZW5ndGg+PXNpemVvZigqc2EpKSAmJiBzYS0+YkluaGVyaXRIYW5kbGUpOworCisgICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfQ1JFQVRFX1NFTUFQSE9SRSwgLTEsIDIsICZyZXEsIHNpemVvZihyZXEpLCBuYW1lLCBsZW4gKTsKKyAgICBDTElFTlRfV2FpdFJlcGx5KCAmbGVuLCBOVUxMLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKKyAgICBDSEVDS19MRU4oIGxlbiwgc2l6ZW9mKHJlcGx5KSApOworICAgIGlmIChyZXBseS5oYW5kbGUgPT0gLTEpIHJldHVybiBOVUxMOworCiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBzZW0gPSAoU0VNQVBIT1JFICopSzMyT0JKX0NyZWF0ZSggSzMyT0JKX1NFTUFQSE9SRSwgc2l6ZW9mKCpzZW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBTRU1BUEhPUkVfQUxMX0FDQ0VTUywgc2EsICZoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCByZXBseS5oYW5kbGUsIFNFTUFQSE9SRV9BTExfQUNDRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYSwgJmhhbmRsZSk7CiAgICAgaWYgKHNlbSkKICAgICB7CiAgICAgICAgIC8qIEZpbmlzaCBpbml0aWFsaXppbmcgaXQgKi8KQEAgLTExOSwxNiArMTM0LDM1IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgUmVsZWFzZVNlbWFwaG9yZSggSEFORExFMzIgaGFuZGxlLCBMT05HIGNvdW50LCBMT05HICpwcmV2aW91cyApCiB7CisgICAgc3RydWN0IHJlbGVhc2Vfc2VtYXBob3JlX3JlcXVlc3QgcmVxOwogICAgIFNFTUFQSE9SRSAqc2VtOwogCisgICAgaWYgKGNvdW50IDwgMCkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICghKHNlbSA9IChTRU1BUEhPUkUgKilIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU1BUEhPUkVfTU9ESUZZX1NUQVRFLCBOVUxMICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU1BUEhPUkVfTU9ESUZZX1NUQVRFLCAmcmVxLmhhbmRsZSApKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICBpZiAocmVxLmhhbmRsZSAhPSAtMSkKKyAgICB7CisgICAgICAgIHN0cnVjdCByZWxlYXNlX3NlbWFwaG9yZV9yZXBseSByZXBseTsKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJlcS5jb3VudCA9ICh1bnNpZ25lZCBpbnQpY291bnQ7CisgICAgICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX1JFTEVBU0VfU0VNQVBIT1JFLCAtMSwgMSwgJnJlcSwgc2l6ZW9mKHJlcSkgKTsKKyAgICAgICAgaWYgKENMSUVOVF9XYWl0UmVwbHkoICZsZW4sIE5VTEwsIDEsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIENIRUNLX0xFTiggbGVuLCBzaXplb2YocmVwbHkpICk7CisgICAgICAgIGlmIChwcmV2aW91cykgKnByZXZpb3VzID0gcmVwbHkucHJldl9jb3VudDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQogICAgIGlmIChwcmV2aW91cykgKnByZXZpb3VzID0gc2VtLT5jb3VudDsKICAgICBpZiAoc2VtLT5jb3VudCArIGNvdW50ID4gc2VtLT5tYXgpCiAgICAgewpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3N5bmNocm8uYyBiL3NjaGVkdWxlci9zeW5jaHJvLmMKaW5kZXggNGVkOWEyNS4uZjdiYTM4MSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3N5bmNocm8uYworKysgYi9zY2hlZHVsZXIvc3luY2hyby5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAic3lzbGV2ZWwuaCIKICNpbmNsdWRlICJzZXJ2ZXIuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC0zOTgsMyArMzk5LDM0IEBACiB7CiAgICAgcmV0dXJuIFNZTkNfRG9XYWl0KCBjb3VudCwgaGFuZGxlcywgd2FpdF9hbGwsIHRpbWVvdXQsIGFsZXJ0YWJsZSwgRkFMU0UgKTsKIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXSU4xNl9XYWl0Rm9yU2luZ2xlT2JqZWN0ICAgKEtFUk5FTC40NjApCisgKi8KK0RXT1JEIFdJTkFQSSBXSU4xNl9XYWl0Rm9yU2luZ2xlT2JqZWN0KCBIQU5ETEUzMiBoYW5kbGUsIERXT1JEIHRpbWVvdXQgKQoreworICAgIERXT1JEIHJldHZhbDsKKworICAgIFNZU0xFVkVMX1JlbGVhc2VXaW4xNkxvY2soKTsKKyAgICByZXR2YWwgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBoYW5kbGUsIHRpbWVvdXQgKTsKKyAgICBTWVNMRVZFTF9SZXN0b3JlV2luMTZMb2NrKCk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXSU4xNl9XYWl0Rm9yTXVsdGlwbGVPYmplY3RzICAgKEtFUk5FTC40NjEpCisgKi8KK0RXT1JEIFdJTkFQSSBXSU4xNl9XYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCBEV09SRCBjb3VudCwgY29uc3QgSEFORExFMzIgKmhhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHdhaXRfYWxsLCBEV09SRCB0aW1lb3V0ICkKK3sKKyAgICBEV09SRCByZXR2YWw7CisKKyAgICBTWVNMRVZFTF9SZWxlYXNlV2luMTZMb2NrKCk7CisgICAgcmV0dmFsID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyggY291bnQsIGhhbmRsZXMsIHdhaXRfYWxsLCB0aW1lb3V0ICk7CisgICAgU1lTTEVWRUxfUmVzdG9yZVdpbjE2TG9jaygpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3N5c2RlcHMuYyBiL3NjaGVkdWxlci9zeXNkZXBzLmMKaW5kZXggOWVjM2I3YS4uZjg4M2YxMiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3N5c2RlcHMuYworKysgYi9zY2hlZHVsZXIvc3lzZGVwcy5jCkBAIC0yMiw3ICsyMiw3IEBACiAvKiBYbGliIGNyaXRpY2FsIHNlY3Rpb24gKEZJWE1FOiBkb2VzIG5vdCBiZWxvbmcgaGVyZSkgKi8KIENSSVRJQ0FMX1NFQ1RJT04gWDExRFJWX0NyaXRTZWN0aW9uID0geyAwLCB9OwogCi0jaWZkZWYgX19saW51eF9fCisjaWZkZWYgSEFWRV9DTE9ORV9TWVNDQUxMCiAjIGlmZGVmIEhBVkVfU0NIRURfSAogIyAgaW5jbHVkZSA8c2NoZWQuaD4KICMgZW5kaWYKQEAgLTM1LDEwICszNSwxMCBAQAogLyogSWYgd2UgZGlkbid0IGdldCB0aGUgZmxhZ3MsIHdlIHByb2JhYmx5IGRpZG4ndCBnZXQgdGhlIHByb3RvdHlwZSBlaXRoZXIgKi8KIGV4dGVybiBpbnQgY2xvbmUoIGludCAoKmZuKSh2b2lkICphcmcpLCB2b2lkICpzdGFjaywgaW50IGZsYWdzLCB2b2lkICphcmcgKTsKICMgZW5kaWYgIC8qIENMT05FX1ZNICovCi0jZW5kaWYgIC8qIF9fbGludXhfXyAqLworI2VuZGlmICAvKiBIQVZFX0NMT05FX1NZU0NBTEwgKi8KIAogCi0jaWZkZWYgX19saW51eF9fCisjaWZkZWYgVVNFX1RIUkVBRFMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIF9fZXJybm9fbG9jYXRpb24KICAqCkBAIC04NCw3ICs4NCw3IEBACiAgICAgU0VUX0ZTKCB0aGRiLT50ZWJfc2VsICk7CiAgICAgVEhSRUFEX1N0YXJ0KCB0aGRiICk7CiB9Ci0jZW5kaWYgIC8qIF9fbGludXhfXyAqLworI2VuZGlmICAvKiBVU0VfVEhSRUFEUyAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTUsMTUgKzk1LDIzIEBACiAgKi8KIGludCBTWVNERVBTX1NwYXduVGhyZWFkKCBUSERCICp0aHJlYWQgKQogewotI2lmZGVmIF9fbGludXhfXworI2lmZGVmIFVTRV9USFJFQURTCisKKyNpZmRlZiBIQVZFX0NMT05FX1NZU0NBTEwKICAgICBpZiAoY2xvbmUoIChpbnQgKCopKHZvaWQgKikpU1lTREVQU19TdGFydFRocmVhZCwgdGhyZWFkLT50ZWIuc3RhY2tfdG9wLAogICAgICAgICAgICAgICAgQ0xPTkVfVk0gfCBDTE9ORV9GUyB8IENMT05FX0ZJTEVTIHwgU0lHQ0hMRCwgdGhyZWFkICkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgLyogRklYTUU6IGNsb3NlIHRoZSBjaGlsZCBzb2NrZXQgaW4gdGhlIHBhcmVudCBwcm9jZXNzICovCiAvKiAgICBjbG9zZSggdGhyZWFkLT5zb2NrZXQgKTsqLwotI2Vsc2UKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9SRk9SSworICAgIEZJWE1FKHRocmVhZCwgIlRocmVhZHMgdXNpbmcgcmZvcmsoKSBub3QgaW1wbGVtZW50ZWRcbiIgKTsKKyNlbmRpZgorCisjZWxzZSAgLyogIVVTRV9USFJFQURTICovCiAgICAgRklYTUUodGhyZWFkLCAiQ3JlYXRlVGhyZWFkOiBzdHViXG4iICk7Ci0jZW5kaWYgIC8qIF9fbGludXhfXyAqLworI2VuZGlmICAvKiBVU0VfVEhSRUFEUyAqLwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvdGhyZWFkLmMgYi9zY2hlZHVsZXIvdGhyZWFkLmMKaW5kZXggYjgzNmI5Yy4uM2EwZmY5NyAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3RocmVhZC5jCisrKyBiL3NjaGVkdWxlci90aHJlYWQuYwpAQCAtODMsNiArODMsMzMgQEAKICAgICB9CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIUkVBRF9JZFRvVEhEQgorICoKKyAqIENvbnZlcnQgYSB0aHJlYWQgaWQgdG8gYSBUSERCLCBtYWtpbmcgc3VyZSBpdCBpcyB2YWxpZC4KKyAqLworVEhEQiAqVEhSRUFEX0lkVG9USERCKCBEV09SRCBpZCApCit7CisgICAgVEhEQiAqdGhkYjsKKworICAgIGlmICghaWQpIHJldHVybiBUSFJFQURfQ3VycmVudCgpOworICAgIHRoZGIgPSBUSFJFQURfSURfVE9fVEhEQiggaWQgKTsKKyAgICBpZiAoIUszMk9CSl9Jc1ZhbGlkKCAmdGhkYi0+aGVhZGVyLCBLMzJPQkpfVEhSRUFEICkpCisgICAgeworICAgICAgICAvKiBBbGxvdyB0YXNrIGhhbmRsZXMgdG8gYmUgdXNlZDsgY29udmVydCB0byBtYWluIHRocmVhZCAqLworICAgICAgICBpZiAoIElzVGFzayggaWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBpZCApOworICAgICAgICAgICAgaWYgKHBUYXNrKSByZXR1cm4gcFRhc2stPnRoZGI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB0aGRiOworfQorCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEhSRUFEX0FkZFF1ZXVlCkBAIC0zNjEsNyArMzg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVBRF9BTExfQUNDRVNTLCBpbmhlcml0LCBzZXJ2ZXJfaGFuZGxlICk7CiAgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKSBnb3RvIGVycm9yOwogICAgIGlmIChTWVNERVBTX1NwYXduVGhyZWFkKCB0aHJlYWQgKSA9PSAtMSkgZ290byBlcnJvcjsKLSAgICAqaWQgPSBUSERCX1RPX1RIUkVBRF9JRCggdGhyZWFkICk7CisgICAgaWYgKGlkKSAqaWQgPSBUSERCX1RPX1RIUkVBRF9JRCggdGhyZWFkICk7CiAgICAgcmV0dXJuIGhhbmRsZTsKIAogZXJyb3I6CkBAIC04ODIsMyArOTA5LDE5IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZXaW4zMl9Cb29zdFRocmVhZEdyb3VwIFtLRVJORUwuNTM1XQorICovCitWT0lEIFdJTkFQSSBWV2luMzJfQm9vc3RUaHJlYWRHcm91cCggRFdPUkQgdGhyZWFkSWQsIElOVDMyIGJvb3N0ICkKK3sKKyAgICBGSVhNRSh0aHJlYWQsICIoMHglMDhseCwlZCk6IHN0dWJcbiIsIHRocmVhZElkLCBib29zdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWV2luMzJfQm9vc3RUaHJlYWRTdGF0aWMgW0tFUk5FTC41MzZdCisgKi8KK1ZPSUQgV0lOQVBJIFZXaW4zMl9Cb29zdFRocmVhZFN0YXRpYyggRFdPUkQgdGhyZWFkSWQsIElOVDMyIGJvb3N0ICkKK3sKKyAgICBGSVhNRSh0aHJlYWQsICIoMHglMDhseCwlZCk6IHN0dWJcbiIsIHRocmVhZElkLCBib29zdCk7Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZlci9NYWtlZmlsZS5pbiBiL3NlcnZlci9NYWtlZmlsZS5pbgppbmRleCAwMWI2N2YxLi43ZWM0NmY4IDEwMDY0NAotLS0gYS9zZXJ2ZXIvTWFrZWZpbGUuaW4KKysrIGIvc2VydmVyL01ha2VmaWxlLmluCkBAIC02LDkgKzYsMTIgQEAKIE1PRFVMRSAgICA9IHNlcnZlcgogCiBDX1NSQ1MgPSBcCisJZXZlbnQuYyBcCisJbXV0ZXguYyBcCiAJb2JqZWN0LmMgXAogCXByb2Nlc3MuYyBcCiAJcmVxdWVzdC5jIFwKKwlzZW1hcGhvcmUuYyBcCiAJc29ja2V0LmMgXAogCXRocmVhZC5jIFwKIAl0cmFjZS5jCmRpZmYgLS1naXQgYS9zZXJ2ZXIvZXZlbnQuYyBiL3NlcnZlci9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOWRkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2ZXIvZXZlbnQuYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIFNlcnZlci1zaWRlIGV2ZW50IG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAic2VydmVyL3RocmVhZC5oIgorCitzdHJ1Y3QgZXZlbnQKK3sKKyAgICBzdHJ1Y3Qgb2JqZWN0ICBvYmo7ICAgICAgICAgICAgIC8qIG9iamVjdCBoZWFkZXIgKi8KKyAgICBpbnQgICAgICAgICAgICBtYW51YWxfcmVzZXQ7ICAgIC8qIGlzIGl0IGEgbWFudWFsIHJlc2V0IGV2ZW50PyAqLworICAgIGludCAgICAgICAgICAgIHNpZ25hbGVkOyAgICAgICAgLyogZXZlbnQgaGFzIGJlZW4gc2lnbmFsZWQgKi8KK307CisKK3N0YXRpYyB2b2lkIGR1bXBfZXZlbnQoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKTsKK3N0YXRpYyBpbnQgZXZlbnRfc2lnbmFsZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICk7CitzdGF0aWMgaW50IGV2ZW50X3NhdGlzZmllZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfZXZlbnQoIHN0cnVjdCBvYmplY3QgKm9iaiApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgZXZlbnRfb3BzID0KK3sKKyAgICBkdW1wX2V2ZW50LAorICAgIGV2ZW50X3NpZ25hbGVkLAorICAgIGV2ZW50X3NhdGlzZmllZCwKKyAgICBkZXN0cm95X2V2ZW50Cit9OworCisKK3N0cnVjdCBvYmplY3QgKmNyZWF0ZV9ldmVudCggY29uc3QgY2hhciAqbmFtZSwgaW50IG1hbnVhbF9yZXNldCwgaW50IGluaXRpYWxfc3RhdGUgKQoreworICAgIHN0cnVjdCBldmVudCAqZXZlbnQ7CisKKyAgICBpZiAoIShldmVudCA9IChzdHJ1Y3QgZXZlbnQgKiljcmVhdGVfbmFtZWRfb2JqZWN0KCBuYW1lLCAmZXZlbnRfb3BzLCBzaXplb2YoKmV2ZW50KSApKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKEdFVF9FUlJPUigpICE9IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgIHsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBpdCBpZiBpdCBkaWRuJ3QgYWxyZWFkeSBleGlzdCAqLworICAgICAgICBldmVudC0+bWFudWFsX3Jlc2V0ID0gbWFudWFsX3Jlc2V0OworICAgICAgICBldmVudC0+c2lnbmFsZWQgICAgID0gaW5pdGlhbF9zdGF0ZTsKKyAgICB9CisgICAgcmV0dXJuICZldmVudC0+b2JqOworfQorCitpbnQgb3Blbl9ldmVudCggdW5zaWduZWQgaW50IGFjY2VzcywgaW50IGluaGVyaXQsIGNvbnN0IGNoYXIgKm5hbWUgKQoreworICAgIHJldHVybiBvcGVuX29iamVjdCggbmFtZSwgJmV2ZW50X29wcywgYWNjZXNzLCBpbmhlcml0ICk7Cit9CisKK2ludCBwdWxzZV9ldmVudCggaW50IGhhbmRsZSApCit7CisgICAgc3RydWN0IGV2ZW50ICpldmVudDsKKworICAgIGlmICghKGV2ZW50ID0gKHN0cnVjdCBldmVudCAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSwgJmV2ZW50X29wcyApKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZXZlbnQtPnNpZ25hbGVkID0gMTsKKyAgICAvKiB3YWtlIHVwIGFsbCB3YWl0ZXJzIGlmIG1hbnVhbCByZXNldCwgYSBzaW5nbGUgb25lIG90aGVyd2lzZSAqLworICAgIHdha2VfdXAoICZldmVudC0+b2JqLCAhZXZlbnQtPm1hbnVhbF9yZXNldCApOworICAgIGV2ZW50LT5zaWduYWxlZCA9IDA7CisgICAgcmVsZWFzZV9vYmplY3QoIGV2ZW50ICk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRfZXZlbnQoIGludCBoYW5kbGUgKQoreworICAgIHN0cnVjdCBldmVudCAqZXZlbnQ7CisKKyAgICBpZiAoIShldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVkVOVF9NT0RJRllfU1RBVEUsICZldmVudF9vcHMgKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGV2ZW50LT5zaWduYWxlZCA9IDE7CisgICAgLyogd2FrZSB1cCBhbGwgd2FpdGVycyBpZiBtYW51YWwgcmVzZXQsIGEgc2luZ2xlIG9uZSBvdGhlcndpc2UgKi8KKyAgICB3YWtlX3VwKCAmZXZlbnQtPm9iaiwgIWV2ZW50LT5tYW51YWxfcmVzZXQgKTsKKyAgICByZWxlYXNlX29iamVjdCggZXZlbnQgKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHJlc2V0X2V2ZW50KCBpbnQgaGFuZGxlICkKK3sKKyAgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50OworCisgICAgaWYgKCEoZXZlbnQgPSAoc3RydWN0IGV2ZW50ICopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfTU9ESUZZX1NUQVRFLCAmZXZlbnRfb3BzICkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBldmVudC0+c2lnbmFsZWQgPSAwOworICAgIHJlbGVhc2Vfb2JqZWN0KCBldmVudCApOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2V2ZW50KCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICkKK3sKKyAgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCBldmVudCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+b3BzID09ICZldmVudF9vcHMgKTsKKyAgICBwcmludGYoICJFdmVudCBtYW51YWw9JWQgc2lnbmFsZWQ9JWRcbiIsIGV2ZW50LT5tYW51YWxfcmVzZXQsIGV2ZW50LT5zaWduYWxlZCApOworfQorCitzdGF0aWMgaW50IGV2ZW50X3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgc3RydWN0IGV2ZW50ICpldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmZXZlbnRfb3BzICk7CisgICAgcmV0dXJuIGV2ZW50LT5zaWduYWxlZDsKK30KKworc3RhdGljIGludCBldmVudF9zYXRpc2ZpZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICkKK3sKKyAgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCBldmVudCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+b3BzID09ICZldmVudF9vcHMgKTsKKyAgICAvKiBSZXNldCBpZiBpdCdzIGFuIGF1dG8tcmVzZXQgZXZlbnQgKi8KKyAgICBpZiAoIWV2ZW50LT5tYW51YWxfcmVzZXQpIGV2ZW50LT5zaWduYWxlZCA9IDA7CisgICAgcmV0dXJuIDA7ICAvKiBOb3QgYWJhbmRvbmVkICovCit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfZXZlbnQoIHN0cnVjdCBvYmplY3QgKm9iaiApCit7CisgICAgc3RydWN0IGV2ZW50ICpldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmZXZlbnRfb3BzICk7CisgICAgZnJlZSggZXZlbnQgKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZlci9tdXRleC5jIGIvc2VydmVyL211dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1ZmM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZlci9tdXRleC5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogU2VydmVyLXNpZGUgbXV0ZXggbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2lubnQuaCIKKyNpbmNsdWRlICJzZXJ2ZXIvdGhyZWFkLmgiCisKK3N0cnVjdCBtdXRleAoreworICAgIHN0cnVjdCBvYmplY3QgIG9iajsgICAgICAgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLworICAgIHN0cnVjdCB0aHJlYWQgKm93bmVyOyAgICAgICAgICAgLyogbXV0ZXggb3duZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjb3VudDsgICAgICAgICAgIC8qIHJlY3Vyc2lvbiBjb3VudCAqLworICAgIGludCAgICAgICAgICAgIGFiYW5kb25lZDsgICAgICAgLyogaGFzIGl0IGJlZW4gYWJhbmRvbmVkPyAqLworICAgIHN0cnVjdCBtdXRleCAgKm5leHQ7CisgICAgc3RydWN0IG11dGV4ICAqcHJldjsKK307CisKK3N0YXRpYyB2b2lkIGR1bXBfbXV0ZXgoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKTsKK3N0YXRpYyBpbnQgbXV0ZXhfc2lnbmFsZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICk7CitzdGF0aWMgaW50IG11dGV4X3NhdGlzZmllZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfbXV0ZXgoIHN0cnVjdCBvYmplY3QgKm9iaiApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgbXV0ZXhfb3BzID0KK3sKKyAgICBkdW1wX211dGV4LAorICAgIG11dGV4X3NpZ25hbGVkLAorICAgIG11dGV4X3NhdGlzZmllZCwKKyAgICBkZXN0cm95X211dGV4Cit9OworCisKK3N0cnVjdCBvYmplY3QgKmNyZWF0ZV9tdXRleCggY29uc3QgY2hhciAqbmFtZSwgaW50IG93bmVkICkKK3sKKyAgICBzdHJ1Y3QgbXV0ZXggKm11dGV4OworCisgICAgaWYgKCEobXV0ZXggPSAoc3RydWN0IG11dGV4ICopY3JlYXRlX25hbWVkX29iamVjdCggbmFtZSwgJm11dGV4X29wcywgc2l6ZW9mKCptdXRleCkgKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChHRVRfRVJST1IoKSAhPSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICB7CisgICAgICAgIC8qIGluaXRpYWxpemUgaXQgaWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QgKi8KKyAgICAgICAgbXV0ZXgtPmNvdW50ID0gMDsKKyAgICAgICAgbXV0ZXgtPm93bmVyID0gTlVMTDsKKyAgICAgICAgbXV0ZXgtPmFiYW5kb25lZCA9IDA7CisgICAgICAgIG11dGV4LT5uZXh0ID0gbXV0ZXgtPnByZXYgPSBOVUxMOworICAgICAgICBpZiAob3duZWQpIG11dGV4X3NhdGlzZmllZCggJm11dGV4LT5vYmosIGN1cnJlbnQgKTsKKyAgICB9CisgICAgcmV0dXJuICZtdXRleC0+b2JqOworfQorCitpbnQgb3Blbl9tdXRleCggdW5zaWduZWQgaW50IGFjY2VzcywgaW50IGluaGVyaXQsIGNvbnN0IGNoYXIgKm5hbWUgKQoreworICAgIHJldHVybiBvcGVuX29iamVjdCggbmFtZSwgJm11dGV4X29wcywgYWNjZXNzLCBpbmhlcml0ICk7Cit9CisKKy8qIHJlbGVhc2UgYSBtdXRleCBvbmNlIHRoZSByZWN1cnNpb24gY291bnQgaXMgMCAqLworc3RhdGljIHZvaWQgZG9fcmVsZWFzZSggc3RydWN0IG11dGV4ICptdXRleCwgc3RydWN0IHRocmVhZCAqdGhyZWFkICkKK3sKKyAgICBhc3NlcnQoICFtdXRleC0+Y291bnQgKTsKKyAgICAvKiByZW1vdmUgdGhlIG11dGV4IGZyb20gdGhlIHRocmVhZCBsaXN0IG9mIG93bmVkIG11dGV4ZXMgKi8KKyAgICBpZiAobXV0ZXgtPm5leHQpIG11dGV4LT5uZXh0LT5wcmV2ID0gbXV0ZXgtPnByZXY7CisgICAgaWYgKG11dGV4LT5wcmV2KSBtdXRleC0+cHJldi0+bmV4dCA9IG11dGV4LT5uZXh0OworICAgIGVsc2UgdGhyZWFkLT5tdXRleCA9IG11dGV4LT5uZXh0OworICAgIG11dGV4LT5vd25lciA9IE5VTEw7CisgICAgbXV0ZXgtPm5leHQgPSBtdXRleC0+cHJldiA9IE5VTEw7CisgICAgd2FrZV91cCggJm11dGV4LT5vYmosIDAgKTsKK30KKworaW50IHJlbGVhc2VfbXV0ZXgoIGludCBoYW5kbGUgKQoreworICAgIHN0cnVjdCBtdXRleCAqbXV0ZXg7CisKKyAgICBpZiAoIShtdXRleCA9IChzdHJ1Y3QgbXV0ZXggKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVRFWF9NT0RJRllfU1RBVEUsICZtdXRleF9vcHMgKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghbXV0ZXgtPmNvdW50IHx8IChtdXRleC0+b3duZXIgIT0gY3VycmVudCkpCisgICAgeworICAgICAgICBTRVRfRVJST1IoIEVSUk9SX05PVF9PV05FUiApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCEtLW11dGV4LT5jb3VudCkgZG9fcmVsZWFzZSggbXV0ZXgsIGN1cnJlbnQgKTsKKyAgICByZWxlYXNlX29iamVjdCggbXV0ZXggKTsKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBhYmFuZG9uX211dGV4ZXMoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgd2hpbGUgKHRocmVhZC0+bXV0ZXgpCisgICAgeworICAgICAgICBzdHJ1Y3QgbXV0ZXggKm11dGV4ID0gdGhyZWFkLT5tdXRleDsKKyAgICAgICAgYXNzZXJ0KCBtdXRleC0+b3duZXIgPT0gdGhyZWFkICk7CisgICAgICAgIG11dGV4LT5jb3VudCA9IDA7CisgICAgICAgIG11dGV4LT5hYmFuZG9uZWQgPSAxOworICAgICAgICBkb19yZWxlYXNlKCBtdXRleCwgdGhyZWFkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX211dGV4KCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICkKK3sKKyAgICBzdHJ1Y3QgbXV0ZXggKm11dGV4ID0gKHN0cnVjdCBtdXRleCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+b3BzID09ICZtdXRleF9vcHMgKTsKKyAgICBwcmludGYoICJNdXRleCBjb3VudD0ldSBvd25lcj0lcFxuIiwgbXV0ZXgtPmNvdW50LCBtdXRleC0+b3duZXIgKTsKK30KKworc3RhdGljIGludCBtdXRleF9zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQoreworICAgIHN0cnVjdCBtdXRleCAqbXV0ZXggPSAoc3RydWN0IG11dGV4ICopb2JqOworICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJm11dGV4X29wcyApOworICAgIHJldHVybiAoIW11dGV4LT5jb3VudCB8fCAobXV0ZXgtPm93bmVyID09IHRocmVhZCkpOworfQorCitzdGF0aWMgaW50IG11dGV4X3NhdGlzZmllZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQoreworICAgIHN0cnVjdCBtdXRleCAqbXV0ZXggPSAoc3RydWN0IG11dGV4ICopb2JqOworICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJm11dGV4X29wcyApOworICAgIGFzc2VydCggIW11dGV4LT5jb3VudCB8fCAobXV0ZXgtPm93bmVyID09IHRocmVhZCkgKTsKKworICAgIGlmICghbXV0ZXgtPmNvdW50KyspICAvKiBGSVhNRTogYXZvaWQgd3JhcC1hcm91bmQgKi8KKyAgICB7CisgICAgICAgIGFzc2VydCggIW11dGV4LT5vd25lciApOworICAgICAgICBtdXRleC0+b3duZXIgPSB0aHJlYWQ7CisgICAgICAgIG11dGV4LT5wcmV2ICA9IE5VTEw7CisgICAgICAgIGlmICgobXV0ZXgtPm5leHQgPSB0aHJlYWQtPm11dGV4KSkgbXV0ZXgtPm5leHQtPnByZXYgPSBtdXRleDsKKyAgICAgICAgdGhyZWFkLT5tdXRleCA9IG11dGV4OworICAgIH0KKyAgICBpZiAoIW11dGV4LT5hYmFuZG9uZWQpIHJldHVybiAwOworICAgIG11dGV4LT5hYmFuZG9uZWQgPSAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X211dGV4KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQoreworICAgIHN0cnVjdCBtdXRleCAqbXV0ZXggPSAoc3RydWN0IG11dGV4ICopb2JqOworICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJm11dGV4X29wcyApOworICAgIGZyZWUoIG11dGV4ICk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2ZXIvb2JqZWN0LmMgYi9zZXJ2ZXIvb2JqZWN0LmMKaW5kZXggYzA1YTMxMC4uODJmMTE4MiAxMDA2NDQKLS0tIGEvc2VydmVyL29iamVjdC5jCisrKyBiL3NlcnZlci9vYmplY3QuYwpAQCAtMTAsOSArMTAsOSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJzZXJ2ZXIuaCIKLQotI2luY2x1ZGUgInNlcnZlci9vYmplY3QuaCIKKyNpbmNsdWRlICJzZXJ2ZXIvdGhyZWFkLmgiCiAKIGludCBkZWJ1Z19sZXZlbCA9IDA7CiAKQEAgLTMwLDYgKzMwLDE2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAordm9pZCAqbWVtX2FsbG9jKCBzaXplX3Qgc2l6ZSApCit7CisgICAgdm9pZCAqcHRyID0gbWFsbG9jKCBzaXplICk7CisgICAgaWYgKHB0cikgbWVtc2V0KCBwdHIsIDB4NTUsIHNpemUgKTsKKyAgICBlbHNlIGlmIChjdXJyZW50KSBTRVRfRVJST1IoIEVSUk9SX09VVE9GTUVNT1JZICk7CisgICAgcmV0dXJuIHB0cjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBzdGF0aWMgaW50IGdldF9uYW1lX2hhc2goIGNvbnN0IGNoYXIgKm5hbWUgKQogewogICAgIGludCBoYXNoID0gMDsKQEAgLTQzLDcgKzUzLDcgQEAKICAgICBpbnQgaGFzaCA9IGdldF9uYW1lX2hhc2goIG5hbWUgKTsKICAgICBpbnQgbGVuID0gc3RybGVuKCBuYW1lICk7CiAKLSAgICBpZiAoIShwdHIgPSAoc3RydWN0IG9iamVjdF9uYW1lICopbWFsbG9jKCBzaXplb2YoKnB0cikgKyBsZW4gKSkpCisgICAgaWYgKCEocHRyID0gKHN0cnVjdCBvYmplY3RfbmFtZSAqKW1lbV9hbGxvYyggc2l6ZW9mKCpwdHIpICsgbGVuICkpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBwdHItPm5leHQgPSBuYW1lc1toYXNoXTsKICAgICBwdHItPm9iaiAgPSBvYmo7CkBAIC02NCwxNSArNzQsNDAgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGFsbG9jYXRlZCBvYmplY3QgKi8KLXZvaWQgaW5pdF9vYmplY3QoIHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgKm9wcywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgKQorLyogcmV0dXJuIDEgaWYgT0ssIDAgb24gZXJyb3IgKi8KK2ludCBpbml0X29iamVjdCggc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyAqb3BzLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lICkKIHsKICAgICBvYmotPnJlZmNvdW50ID0gMTsKICAgICBvYmotPm9wcyAgICAgID0gb3BzOwogICAgIG9iai0+aGVhZCAgICAgPSBOVUxMOwogICAgIG9iai0+dGFpbCAgICAgPSBOVUxMOwogICAgIGlmICghbmFtZSkgb2JqLT5uYW1lID0gTlVMTDsKLSAgICBlbHNlIG9iai0+bmFtZSA9IGFkZF9uYW1lKCBvYmosIG5hbWUgKTsKKyAgICBlbHNlIGlmICghKG9iai0+bmFtZSA9IGFkZF9uYW1lKCBvYmosIG5hbWUgKSkpIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCitzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfbmFtZWRfb2JqZWN0KCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyAqb3BzLCBzaXplX3Qgc2l6ZSApCit7CisgICAgc3RydWN0IG9iamVjdCAqb2JqOworICAgIGlmICgob2JqID0gZmluZF9vYmplY3QoIG5hbWUgKSkpCisgICAgeworICAgICAgICBpZiAob2JqLT5vcHMgPT0gb3BzKQorICAgICAgICB7CisgICAgICAgICAgICBTRVRfRVJST1IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7CisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB9CisgICAgICAgIFNFVF9FUlJPUiggRVJST1JfSU5WQUxJRF9IQU5ETEUgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghKG9iaiA9IG1lbV9hbGxvYyggc2l6ZSApKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpbml0X29iamVjdCggb2JqLCBvcHMsIG5hbWUgKSkKKyAgICB7CisgICAgICAgIGZyZWUoIG9iaiApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQ0xFQVJfRVJST1IoKTsKKyAgICByZXR1cm4gb2JqOwogfQogCiAvKiBncmFiIGFuIG9iamVjdCAoaS5lLiBpbmNyZW1lbnQgaXRzIHJlZmNvdW50KSBhbmQgcmV0dXJuIHRoZSBvYmplY3QgKi8KQEAgLTEwMiwxMCArMTM3LDEwIEBACiAvKiBmaW5kIGFuIG9iamVjdCBieSBpdHMgbmFtZTsgdGhlIHJlZmNvdW50IGlzIGluY3JlbWVudGVkICovCiBzdHJ1Y3Qgb2JqZWN0ICpmaW5kX29iamVjdCggY29uc3QgY2hhciAqbmFtZSApCiB7Ci0gICAgaW50IGhhc2ggPSBnZXRfbmFtZV9oYXNoKCBuYW1lICk7Ci0gICAgc3RydWN0IG9iamVjdF9uYW1lICpwdHIgPSBuYW1lc1toYXNoXTsKKyAgICBzdHJ1Y3Qgb2JqZWN0X25hbWUgKnB0cjsKKyAgICBpZiAoIW5hbWUpIHJldHVybiBOVUxMOworICAgIHB0ciA9IG5hbWVzWyBnZXRfbmFtZV9oYXNoKCBuYW1lICkgXTsKICAgICB3aGlsZSAocHRyICYmIHN0cmNtcCggcHRyLT5uYW1lLCBuYW1lICkpIHB0ciA9IHB0ci0+bmV4dDsKICAgICBpZiAoIXB0cikgcmV0dXJuIE5VTEw7Ci0gICAgZ3JhYl9vYmplY3QoIHB0ci0+b2JqICk7Ci0gICAgcmV0dXJuIHB0ci0+b2JqOworICAgIHJldHVybiBncmFiX29iamVjdCggcHRyLT5vYmogKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZlci9wcm9jZXNzLmMgYi9zZXJ2ZXIvcHJvY2Vzcy5jCmluZGV4IDA2ZDNkNjMuLjNmYzczZmUgMTAwNjQ0Ci0tLSBhL3NlcnZlci9wcm9jZXNzLmMKKysrIGIvc2VydmVyL3Byb2Nlc3MuYwpAQCAtNzQsNyArNzQsNyBAQAogewogICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzOwogCi0gICAgaWYgKCEocHJvY2VzcyA9IG1hbGxvYyggc2l6ZW9mKCpwcm9jZXNzKSApKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCEocHJvY2VzcyA9IG1lbV9hbGxvYyggc2l6ZW9mKCpwcm9jZXNzKSApKSkgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoIWNvcHlfaGFuZGxlX3RhYmxlKCBwcm9jZXNzLCBjdXJyZW50ID8gY3VycmVudC0+cHJvY2VzcyA6IE5VTEwgKSkKICAgICB7CkBAIC0yMTksNyArMjE5LDcgQEAKICAgICBjb3VudCAqPSAyOwogICAgIGlmICghKG5ld19lbnRyaWVzID0gcmVhbGxvYyggcHJvY2Vzcy0+ZW50cmllcywgY291bnQgKiBzaXplb2Yoc3RydWN0IGhhbmRsZV9lbnRyeSkgKSkpCiAgICAgewotICAgICAgICBTRVRfRVJST1IoIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZICk7CisgICAgICAgIFNFVF9FUlJPUiggRVJST1JfT1VUT0ZNRU1PUlkgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHByb2Nlc3MtPmhhbmRsZV9jb3VudCA9IGNvdW50OwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAgICAgICAgIGxhc3QgID0gcGFyZW50LT5oYW5kbGVfbGFzdDsKICAgICB9CiAKLSAgICBpZiAoIShwdHIgPSBtYWxsb2MoIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBoYW5kbGVfZW50cnkpKSkpIHJldHVybiAwOworICAgIGlmICghKHB0ciA9IG1lbV9hbGxvYyggY291bnQgKiBzaXplb2Yoc3RydWN0IGhhbmRsZV9lbnRyeSkpKSkgcmV0dXJuIDA7CiAgICAgcHJvY2Vzcy0+ZW50cmllcyAgICAgID0gcHRyOwogICAgIHByb2Nlc3MtPmhhbmRsZV9jb3VudCA9IGNvdW50OwogICAgIHByb2Nlc3MtPmhhbmRsZV9sYXN0ICA9IGxhc3Q7CkBAIC00MzgsNiArNDM4LDIwIEBACiAgICAgcmV0dXJuIGFsbG9jX3NwZWNpZmljX2hhbmRsZSggZHN0LCBlbnRyeS0+cHRyLCBkc3RfaGFuZGxlLCBhY2Nlc3MsIGluaGVyaXQgKTsKIH0KIAorLyogb3BlbiBhIG5ldyBoYW5kbGUgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0ICovCitpbnQgb3Blbl9vYmplY3QoIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzICpvcHMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhY2Nlc3MsIGludCBpbmhlcml0ICkKK3sKKyAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBmaW5kX29iamVjdCggbmFtZSApOworICAgIGlmICghb2JqKSByZXR1cm4gLTE7ICAvKiBGSVhNRTogc2V0IGVycm9yIGNvZGUgKi8KKyAgICBpZiAob3BzICYmIG9iai0+b3BzICE9IG9wcykKKyAgICB7CisgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgLyogRklYTUU6IHNldCBlcnJvciBjb2RlICovCisgICAgfQorICAgIHJldHVybiBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7Cit9CisKIC8qIGR1bXAgYSBoYW5kbGUgdGFibGUgb24gc3Rkb3V0ICovCiB2b2lkIGR1bXBfaGFuZGxlcyggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgKQogewpkaWZmIC0tZ2l0IGEvc2VydmVyL3JlcXVlc3QuYyBiL3NlcnZlci9yZXF1ZXN0LmMKaW5kZXggZTQ4MWQ3Ni4uNmNlNWIzNSAxMDA2NDQKLS0tIGEvc2VydmVyL3JlcXVlc3QuYworKysgYi9zZXJ2ZXIvcmVxdWVzdC5jCkBAIC0xOSw3ICsxOSwxMiBAQAogI2luY2x1ZGUgInNlcnZlci9yZXF1ZXN0LmgiCiAjaW5jbHVkZSAic2VydmVyL3RocmVhZC5oIgogCi0KKy8qIGNoZWNrIHRoYXQgdGhlIHN0cmluZyBpcyBOVUxMLXRlcm1pbmF0ZWQgYW5kIHRoYXQgdGhlIGxlbiBpcyBjb3JyZWN0ICovCisjZGVmaW5lIENIRUNLX1NUUklORyhmdW5jLHN0cixsZW4pIFwKKyAgZG8geyBpZiAoKChzdHIpWyhsZW4pLTFdIHx8IHN0cmxlbihzdHIpICE9IChsZW4pLTEpKSBcCisgICAgICAgICBmYXRhbF9wcm90b2NvbF9lcnJvciggIiVzOiBpbnZhbGlkIHN0cmluZyAnLipzJ1xuIiwgKGZ1bmMpLCAobGVuKSwgKHN0cikgKTsgXAorICAgICB9IHdoaWxlKDApCisgCiBzdHJ1Y3QgdGhyZWFkICpjdXJyZW50ID0gTlVMTDsgIC8qIHRocmVhZCBoYW5kbGluZyB0aGUgY3VycmVudCByZXF1ZXN0ICovCiAKIC8qIGNvbXBsYWluIGFib3V0IGEgcHJvdG9jb2wgZXJyb3IgYW5kIHRlcm1pbmF0ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gKi8KQEAgLTEwNyw4ICsxMTIsOCBAQAogICAgIGlmICghKG5ld190aHJlYWQgPSBjcmVhdGVfdGhyZWFkKCBuZXdfZmQsIHJlcS0+cGlkLCAmcmVwbHkudGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5LnBoYW5kbGUgKSkpCiAgICAgewotICAgICAgICBlcnIgPSBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKICAgICAgICAgY2xvc2UoIG5ld19mZCApOworICAgICAgICBlcnIgPSBFUlJPUl9PVVRPRk1FTU9SWTsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KICAgICByZXBseS50aWQgPSBuZXdfdGhyZWFkOwpAQCAtMTM5LDExICsxNDQsNyBAQAogICAgIH0KICAgICBjdXJyZW50LT5zdGF0ZSAgICA9IFJVTk5JTkc7CiAgICAgY3VycmVudC0+dW5peF9waWQgPSByZXEtPnVuaXhfcGlkOwotICAgIGlmICghKGN1cnJlbnQtPm5hbWUgPSBtYWxsb2MoIGxlbiArIDEgKSkpCi0gICAgewotICAgICAgICBTRVRfRVJST1IoIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZICk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9CisgICAgaWYgKCEoY3VycmVudC0+bmFtZSA9IG1lbV9hbGxvYyggbGVuICsgMSApKSkgZ290byBkb25lOwogICAgIG1lbWNweSggY3VycmVudC0+bmFtZSwgZGF0YSwgbGVuICk7CiAgICAgY3VycmVudC0+bmFtZVtsZW5dID0gJ1wwJzsKICAgICBDTEVBUl9FUlJPUigpOwpAQCAtMjU2LDMgKzI1NywxMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgcmVxLT5jb3VudCApOwogICAgIHNsZWVwX29uKCBjdXJyZW50LCByZXEtPmNvdW50LCAoaW50ICopZGF0YSwgcmVxLT5mbGFncywgcmVxLT50aW1lb3V0ICk7CiB9CisKKy8qIGNyZWF0ZSBhbiBldmVudCAqLworREVDTF9IQU5ETEVSKGNyZWF0ZV9ldmVudCkKK3sKKyAgICBzdHJ1Y3QgY3JlYXRlX2V2ZW50X3JlcGx5IHJlcGx5ID0geyAtMSB9OworICAgIHN0cnVjdCBvYmplY3QgKm9iajsKKyAgICBjaGFyICpuYW1lID0gKGNoYXIgKilkYXRhOworICAgIGlmICghbGVuKSBuYW1lID0gTlVMTDsKKyAgICBlbHNlIENIRUNLX1NUUklORyggImNyZWF0ZV9ldmVudCIsIG5hbWUsIGxlbiApOworCisgICAgb2JqID0gY3JlYXRlX2V2ZW50KCBuYW1lLCByZXEtPm1hbnVhbF9yZXNldCwgcmVxLT5pbml0aWFsX3N0YXRlICk7CisgICAgaWYgKG9iaikKKyAgICB7CisgICAgICAgIHJlcGx5LmhhbmRsZSA9IGFsbG9jX2hhbmRsZSggY3VycmVudC0+cHJvY2Vzcywgb2JqLCBFVkVOVF9BTExfQUNDRVNTLCByZXEtPmluaGVyaXQgKTsKKyAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9iaiApOworICAgIH0KKyAgICBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMSwgJnJlcGx5LCBzaXplb2YocmVwbHkpICk7Cit9CisKKy8qIGRvIGFuIGV2ZW50IG9wZXJhdGlvbiAqLworREVDTF9IQU5ETEVSKGV2ZW50X29wKQoreworICAgIHN3aXRjaChyZXEtPm9wKQorICAgIHsKKyAgICBjYXNlIFBVTFNFX0VWRU5UOgorICAgICAgICBwdWxzZV9ldmVudCggcmVxLT5oYW5kbGUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRVRfRVZFTlQ6CisgICAgICAgIHNldF9ldmVudCggcmVxLT5oYW5kbGUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRVNFVF9FVkVOVDoKKyAgICAgICAgcmVzZXRfZXZlbnQoIHJlcS0+aGFuZGxlICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZhdGFsX3Byb3RvY29sX2Vycm9yKCAiZXZlbnRfb3A6IGludmFsaWQgb3BlcmF0aW9uICVkXG4iLCByZXEtPm9wICk7CisgICAgfQorICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAwICk7Cit9CisKKy8qIGNyZWF0ZSBhIG11dGV4ICovCitERUNMX0hBTkRMRVIoY3JlYXRlX211dGV4KQoreworICAgIHN0cnVjdCBjcmVhdGVfbXV0ZXhfcmVwbHkgcmVwbHkgPSB7IC0xIH07CisgICAgc3RydWN0IG9iamVjdCAqb2JqOworICAgIGNoYXIgKm5hbWUgPSAoY2hhciAqKWRhdGE7CisgICAgaWYgKCFsZW4pIG5hbWUgPSBOVUxMOworICAgIGVsc2UgQ0hFQ0tfU1RSSU5HKCAiY3JlYXRlX211dGV4IiwgbmFtZSwgbGVuICk7CisKKyAgICBvYmogPSBjcmVhdGVfbXV0ZXgoIG5hbWUsIHJlcS0+b3duZWQgKTsKKyAgICBpZiAob2JqKQorICAgIHsKKyAgICAgICAgcmVwbHkuaGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIE1VVEVYX0FMTF9BQ0NFU1MsIHJlcS0+aW5oZXJpdCApOworICAgICAgICByZWxlYXNlX29iamVjdCggb2JqICk7CisgICAgfQorICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKK30KKworLyogcmVsZWFzZSBhIG11dGV4ICovCitERUNMX0hBTkRMRVIocmVsZWFzZV9tdXRleCkKK3sKKyAgICBpZiAocmVsZWFzZV9tdXRleCggcmVxLT5oYW5kbGUgKSkgQ0xFQVJfRVJST1IoKTsKKyAgICBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMCApOworfQorCisvKiBjcmVhdGUgYSBzZW1hcGhvcmUgKi8KK0RFQ0xfSEFORExFUihjcmVhdGVfc2VtYXBob3JlKQoreworICAgIHN0cnVjdCBjcmVhdGVfc2VtYXBob3JlX3JlcGx5IHJlcGx5ID0geyAtMSB9OworICAgIHN0cnVjdCBvYmplY3QgKm9iajsKKyAgICBjaGFyICpuYW1lID0gKGNoYXIgKilkYXRhOworICAgIGlmICghbGVuKSBuYW1lID0gTlVMTDsKKyAgICBlbHNlIENIRUNLX1NUUklORyggImNyZWF0ZV9zZW1hcGhvcmUiLCBuYW1lLCBsZW4gKTsKKworICAgIG9iaiA9IGNyZWF0ZV9zZW1hcGhvcmUoIG5hbWUsIHJlcS0+aW5pdGlhbCwgcmVxLT5tYXggKTsKKyAgICBpZiAob2JqKQorICAgIHsKKyAgICAgICAgcmVwbHkuaGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIFNFTUFQSE9SRV9BTExfQUNDRVNTLCByZXEtPmluaGVyaXQgKTsKKyAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9iaiApOworICAgIH0KKyAgICBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMSwgJnJlcGx5LCBzaXplb2YocmVwbHkpICk7Cit9CisKKy8qIHJlbGVhc2UgYSBzZW1hcGhvcmUgKi8KK0RFQ0xfSEFORExFUihyZWxlYXNlX3NlbWFwaG9yZSkKK3sKKyAgICBzdHJ1Y3QgcmVsZWFzZV9zZW1hcGhvcmVfcmVwbHkgcmVwbHk7CisgICAgaWYgKHJlbGVhc2Vfc2VtYXBob3JlKCByZXEtPmhhbmRsZSwgcmVxLT5jb3VudCwgJnJlcGx5LnByZXZfY291bnQgKSkgQ0xFQVJfRVJST1IoKTsKKyAgICBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMSwgJnJlcGx5LCBzaXplb2YocmVwbHkpICk7Cit9CisKKy8qIG9wZW4gYSBoYW5kbGUgdG8gYSBuYW1lZCBvYmplY3QgKGV2ZW50LCBtdXRleCwgc2VtYXBob3JlKSAqLworREVDTF9IQU5ETEVSKG9wZW5fbmFtZWRfb2JqKQoreworICAgIHN0cnVjdCBvcGVuX25hbWVkX29ial9yZXBseSByZXBseTsKKyAgICBjaGFyICpuYW1lID0gKGNoYXIgKilkYXRhOworICAgIGlmICghbGVuKSBuYW1lID0gTlVMTDsKKyAgICBlbHNlIENIRUNLX1NUUklORyggIm9wZW5fbmFtZWRfb2JqIiwgbmFtZSwgbGVuICk7CisKKyAgICBzd2l0Y2gocmVxLT50eXBlKQorICAgIHsKKyAgICBjYXNlIE9QRU5fRVZFTlQ6CisgICAgICAgIHJlcGx5LmhhbmRsZSA9IG9wZW5fZXZlbnQoIHJlcS0+YWNjZXNzLCByZXEtPmluaGVyaXQsIG5hbWUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUEVOX01VVEVYOgorICAgICAgICByZXBseS5oYW5kbGUgPSBvcGVuX211dGV4KCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0LCBuYW1lICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BFTl9TRU1BUEhPUkU6CisgICAgICAgIHJlcGx5LmhhbmRsZSA9IG9wZW5fc2VtYXBob3JlKCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0LCBuYW1lICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZhdGFsX3Byb3RvY29sX2Vycm9yKCAib3Blbl9uYW1lZF9vYmo6IGludmFsaWQgdHlwZSAlZFxuIiwgcmVxLT50eXBlICk7CisgICAgfQorICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmVyL3NlbWFwaG9yZS5jIGIvc2VydmVyL3NlbWFwaG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGVkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2ZXIvc2VtYXBob3JlLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBTZXJ2ZXItc2lkZSBzZW1hcGhvcmUgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2lubnQuaCIKKyNpbmNsdWRlICJzZXJ2ZXIvdGhyZWFkLmgiCisKK3N0cnVjdCBzZW1hcGhvcmUKK3sKKyAgICBzdHJ1Y3Qgb2JqZWN0ICBvYmo7ICAgIC8qIG9iamVjdCBoZWFkZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjb3VudDsgIC8qIGN1cnJlbnQgY291bnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBtYXg7ICAgIC8qIG1heGltdW0gcG9zc2libGUgY291bnQgKi8KK307CisKK3N0YXRpYyB2b2lkIGR1bXBfc2VtYXBob3JlKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICk7CitzdGF0aWMgaW50IHNlbWFwaG9yZV9zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKK3N0YXRpYyBpbnQgc2VtYXBob3JlX3NhdGlzZmllZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc2VtYXBob3JlKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzIHNlbWFwaG9yZV9vcHMgPQoreworICAgIGR1bXBfc2VtYXBob3JlLAorICAgIHNlbWFwaG9yZV9zaWduYWxlZCwKKyAgICBzZW1hcGhvcmVfc2F0aXNmaWVkLAorICAgIGRlc3Ryb3lfc2VtYXBob3JlCit9OworCisKK3N0cnVjdCBvYmplY3QgKmNyZWF0ZV9zZW1hcGhvcmUoIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBpbml0aWFsLCB1bnNpZ25lZCBpbnQgbWF4ICkKK3sKKyAgICBzdHJ1Y3Qgc2VtYXBob3JlICpzZW07CisKKyAgICBpZiAoIW1heCB8fCAoaW5pdGlhbCA+IG1heCkpCisgICAgeworICAgICAgICBTRVRfRVJST1IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIShzZW0gPSAoc3RydWN0IHNlbWFwaG9yZSAqKWNyZWF0ZV9uYW1lZF9vYmplY3QoIG5hbWUsICZzZW1hcGhvcmVfb3BzLCBzaXplb2YoKnNlbSkgKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChHRVRfRVJST1IoKSAhPSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICB7CisgICAgICAgIC8qIGluaXRpYWxpemUgaXQgaWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QgKi8KKyAgICAgICAgc2VtLT5jb3VudCA9IGluaXRpYWw7CisgICAgICAgIHNlbS0+bWF4ICAgPSBtYXg7CisgICAgfQorICAgIHJldHVybiAmc2VtLT5vYmo7Cit9CisKK2ludCBvcGVuX3NlbWFwaG9yZSggdW5zaWduZWQgaW50IGFjY2VzcywgaW50IGluaGVyaXQsIGNvbnN0IGNoYXIgKm5hbWUgKQoreworICAgIHJldHVybiBvcGVuX29iamVjdCggbmFtZSwgJnNlbWFwaG9yZV9vcHMsIGFjY2VzcywgaW5oZXJpdCApOworfQorCitpbnQgcmVsZWFzZV9zZW1hcGhvcmUoIGludCBoYW5kbGUsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50ICpwcmV2X2NvdW50ICkKK3sKKyAgICBzdHJ1Y3Qgc2VtYXBob3JlICpzZW07CisKKyAgICBpZiAoIShzZW0gPSAoc3RydWN0IHNlbWFwaG9yZSAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VNQVBIT1JFX01PRElGWV9TVEFURSwgJnNlbWFwaG9yZV9vcHMgKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgKnByZXZfY291bnQgPSBzZW0tPmNvdW50OworICAgIGlmIChzZW0tPmNvdW50ICsgY291bnQgPCBzZW0tPmNvdW50IHx8IHNlbS0+Y291bnQgKyBjb3VudCA+IHNlbS0+bWF4KQorICAgIHsKKyAgICAgICAgU0VUX0VSUk9SKCBFUlJPUl9UT09fTUFOWV9QT1NUUyApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHNlbS0+Y291bnQpCisgICAgeworICAgICAgICAvKiB0aGVyZSBjYW5ub3QgYmUgYW55IHRocmVhZCB3YWl0aW5nIGlmIHRoZSBjb3VudCBpcyAhPSAwICovCisgICAgICAgIGFzc2VydCggIXNlbS0+b2JqLmhlYWQgKTsKKyAgICAgICAgc2VtLT5jb3VudCArPSBjb3VudDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2VtLT5jb3VudCA9IGNvdW50OworICAgICAgICB3YWtlX3VwKCAmc2VtLT5vYmosIGNvdW50ICk7CisgICAgfQorICAgIHJlbGVhc2Vfb2JqZWN0KCBzZW0gKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zZW1hcGhvcmUoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQoreworICAgIHN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlICopb2JqOworICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNlbWFwaG9yZV9vcHMgKTsKKyAgICBwcmludGYoICJTZW1hcGhvcmUgY291bnQ9JWQgbWF4PSVkXG4iLCBzZW0tPmNvdW50LCBzZW0tPm1heCApOworfQorCitzdGF0aWMgaW50IHNlbWFwaG9yZV9zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQoreworICAgIHN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlICopb2JqOworICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNlbWFwaG9yZV9vcHMgKTsKKyAgICByZXR1cm4gKHNlbS0+Y291bnQgPiAwKTsKK30KKworc3RhdGljIGludCBzZW1hcGhvcmVfc2F0aXNmaWVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgc3RydWN0IHNlbWFwaG9yZSAqc2VtID0gKHN0cnVjdCBzZW1hcGhvcmUgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc2VtYXBob3JlX29wcyApOworICAgIGFzc2VydCggc2VtLT5jb3VudCApOworICAgIHNlbS0+Y291bnQtLTsKKyAgICByZXR1cm4gMDsgIC8qIG5vdCBhYmFuZG9uZWQgKi8KK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9zZW1hcGhvcmUoIHN0cnVjdCBvYmplY3QgKm9iaiApCit7CisgICAgc3RydWN0IHNlbWFwaG9yZSAqc2VtID0gKHN0cnVjdCBzZW1hcGhvcmUgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc2VtYXBob3JlX29wcyApOworICAgIGZyZWUoIHNlbSApOworfQpkaWZmIC0tZ2l0IGEvc2VydmVyL3NvY2tldC5jIGIvc2VydmVyL3NvY2tldC5jCmluZGV4IGZkODU3NDEuLjEzMDI0NjcgMTAwNjQ0Ci0tLSBhL3NlcnZlci9zb2NrZXQuYworKysgYi9zZXJ2ZXIvc29ja2V0LmMKQEAgLTI3OSw3ICsyNzksMTIgQEAKICAgICB3aGlsZSAobmJfY2xpZW50cykKICAgICB7CiAgICAgICAgIGZkX3NldCByZWFkID0gcmVhZF9zZXQsIHdyaXRlID0gd3JpdGVfc2V0OwotCisjaWYgMAorICAgICAgICBwcmludGYoICJzZWxlY3Q6ICIgKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtYXhfZmQ7IGkrKykgcHJpbnRmKCAiJWMiLCBGRF9JU1NFVCggaSwgJnJlYWRfc2V0ICkgPyAncicgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGRF9JU1NFVCggaSwgJndyaXRlX3NldCApID8gJ3cnIDogJy0nKSApOworICAgICAgICBwcmludGYoICJcbiIgKTsKKyNlbmRpZgogICAgICAgICBpZiAodGltZW91dF9oZWFkKQogICAgICAgICB7CiAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0diwgbm93OwpkaWZmIC0tZ2l0IGEvc2VydmVyL3RocmVhZC5jIGIvc2VydmVyL3RocmVhZC5jCmluZGV4IGUyNTBjYzguLmZmZjIwNzkgMTAwNjQ0Ci0tLSBhL3NlcnZlci90aHJlYWQuYworKysgYi9zZXJ2ZXIvdGhyZWFkLmMKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQ7CiAgICAgc3RydWN0IHByb2Nlc3MgKnByb2Nlc3M7CiAKLSAgICBpZiAoISh0aHJlYWQgPSBtYWxsb2MoIHNpemVvZigqdGhyZWFkKSApKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCEodGhyZWFkID0gbWVtX2FsbG9jKCBzaXplb2YoKnRocmVhZCkgKSkpIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHBpZCkgcHJvY2VzcyA9IGdldF9wcm9jZXNzX2Zyb21faWQoIHBpZCApOwogICAgIGVsc2UgcHJvY2VzcyA9IGNyZWF0ZV9wcm9jZXNzKCk7CkBAIC03OSw2ICs3OSw3IEBACiAgICAgdGhyZWFkLT5wcm9jZXNzICAgPSBwcm9jZXNzOwogICAgIHRocmVhZC0+dW5peF9waWQgID0gMDsgIC8qIG5vdCBrbm93biB5ZXQgKi8KICAgICB0aHJlYWQtPm5hbWUgICAgICA9IE5VTEw7CisgICAgdGhyZWFkLT5tdXRleCAgICAgPSBOVUxMOwogICAgIHRocmVhZC0+d2FpdCAgICAgID0gTlVMTDsKICAgICB0aHJlYWQtPmVycm9yICAgICA9IDA7CiAgICAgdGhyZWFkLT5zdGF0ZSAgICAgPSBTVEFSVElORzsKQEAgLTI1MCwxMSArMjUxLDcgQEAKICAgICAgICAgU0VUX0VSUk9SKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgaWYgKCEod2FpdCA9IG1hbGxvYyggc2l6ZW9mKCp3YWl0KSArIChjb3VudC0xKSAqIHNpemVvZigqZW50cnkpICkpKQotICAgIHsKLSAgICAgICAgU0VUX0VSUk9SKCBFUlJPUl9PVVRPRk1FTU9SWSApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgaWYgKCEod2FpdCA9IG1lbV9hbGxvYyggc2l6ZW9mKCp3YWl0KSArIChjb3VudC0xKSAqIHNpemVvZigqZW50cnkpICkpKSByZXR1cm4gMDsKICAgICB0aHJlYWQtPndhaXQgID0gd2FpdDsKICAgICB3YWl0LT5jb3VudCAgID0gY291bnQ7CiAgICAgd2FpdC0+ZmxhZ3MgICA9IGZsYWdzOwpAQCAtMzk2LDYgKzM5Myw3IEBACiAvKiBraWxsIGEgdGhyZWFkIG9uIHRoZSBzcG90ICovCiB2b2lkIGtpbGxfdGhyZWFkKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGludCBleGl0X2NvZGUgKQogeworICAgIGlmICh0aHJlYWQtPnN0YXRlID09IFRFUk1JTkFURUQpIHJldHVybjsgIC8qIGFscmVhZHkga2lsbGVkICovCiAgICAgaWYgKHRocmVhZC0+dW5peF9waWQpIGtpbGwoIHRocmVhZC0+dW5peF9waWQsIFNJR1RFUk0gKTsKICAgICByZW1vdmVfY2xpZW50KCB0aHJlYWQtPmNsaWVudF9mZCwgZXhpdF9jb2RlICk7IC8qIHRoaXMgd2lsbCBjYWxsIHRocmVhZF9raWxsZWQgKi8KIH0KQEAgLTQwNiw2ICs0MDQsNyBAQAogICAgIHRocmVhZC0+c3RhdGUgPSBURVJNSU5BVEVEOwogICAgIHRocmVhZC0+ZXhpdF9jb2RlID0gZXhpdF9jb2RlOwogICAgIGlmICh0aHJlYWQtPndhaXQpIGVuZF93YWl0KCB0aHJlYWQgKTsKKyAgICBhYmFuZG9uX211dGV4ZXMoIHRocmVhZCApOwogICAgIHJlbW92ZV9wcm9jZXNzX3RocmVhZCggdGhyZWFkLT5wcm9jZXNzLCB0aHJlYWQgKTsKICAgICB3YWtlX3VwKCAmdGhyZWFkLT5vYmosIDAgKTsKICAgICByZWxlYXNlX29iamVjdCggdGhyZWFkICk7CmRpZmYgLS1naXQgYS9zZXJ2ZXIvdHJhY2UuYyBiL3NlcnZlci90cmFjZS5jCmluZGV4IGE5MTU4Y2UuLjA4NTBmZDUgMTAwNjQ0Ci0tLSBhL3NlcnZlci90cmFjZS5jCisrKyBiL3NlcnZlci90cmFjZS5jCkBAIC0xMDMsNiArMTAzLDc1IEBACiAgICAgcHJpbnRmKCAiIHNpZ25hbGVkPSVkIiwgcmVxLT5zaWduYWxlZCApOwogfQogCitzdGF0aWMgdm9pZCBkdW1wX2NyZWF0ZV9ldmVudF9yZXF1ZXN0KCBzdHJ1Y3QgY3JlYXRlX2V2ZW50X3JlcXVlc3QgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIG1hbnVhbF9yZXNldD0lZCwiLCByZXEtPm1hbnVhbF9yZXNldCApOworICAgIHByaW50ZiggIiBpbml0aWFsX3N0YXRlPSVkLCIsIHJlcS0+aW5pdGlhbF9zdGF0ZSApOworICAgIHByaW50ZiggIiBpbmhlcml0PSVkIiwgcmVxLT5pbmhlcml0ICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY3JlYXRlX2V2ZW50X3JlcGx5KCBzdHJ1Y3QgY3JlYXRlX2V2ZW50X3JlcGx5ICpyZXEgKQoreworICAgIHByaW50ZiggIiBoYW5kbGU9JWQiLCByZXEtPmhhbmRsZSApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2V2ZW50X29wX3JlcXVlc3QoIHN0cnVjdCBldmVudF9vcF9yZXF1ZXN0ICpyZXEgKQoreworICAgIHByaW50ZiggIiBoYW5kbGU9JWQsIiwgcmVxLT5oYW5kbGUgKTsKKyAgICBwcmludGYoICIgb3A9JWQiLCByZXEtPm9wICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY3JlYXRlX211dGV4X3JlcXVlc3QoIHN0cnVjdCBjcmVhdGVfbXV0ZXhfcmVxdWVzdCAqcmVxICkKK3sKKyAgICBwcmludGYoICIgb3duZWQ9JWQsIiwgcmVxLT5vd25lZCApOworICAgIHByaW50ZiggIiBpbmhlcml0PSVkIiwgcmVxLT5pbmhlcml0ICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY3JlYXRlX211dGV4X3JlcGx5KCBzdHJ1Y3QgY3JlYXRlX211dGV4X3JlcGx5ICpyZXEgKQoreworICAgIHByaW50ZiggIiBoYW5kbGU9JWQiLCByZXEtPmhhbmRsZSApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3JlbGVhc2VfbXV0ZXhfcmVxdWVzdCggc3RydWN0IHJlbGVhc2VfbXV0ZXhfcmVxdWVzdCAqcmVxICkKK3sKKyAgICBwcmludGYoICIgaGFuZGxlPSVkIiwgcmVxLT5oYW5kbGUgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9jcmVhdGVfc2VtYXBob3JlX3JlcXVlc3QoIHN0cnVjdCBjcmVhdGVfc2VtYXBob3JlX3JlcXVlc3QgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIGluaXRpYWw9JTA4eCwiLCByZXEtPmluaXRpYWwgKTsKKyAgICBwcmludGYoICIgbWF4PSUwOHgsIiwgcmVxLT5tYXggKTsKKyAgICBwcmludGYoICIgaW5oZXJpdD0lZCIsIHJlcS0+aW5oZXJpdCApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2NyZWF0ZV9zZW1hcGhvcmVfcmVwbHkoIHN0cnVjdCBjcmVhdGVfc2VtYXBob3JlX3JlcGx5ICpyZXEgKQoreworICAgIHByaW50ZiggIiBoYW5kbGU9JWQiLCByZXEtPmhhbmRsZSApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3JlbGVhc2Vfc2VtYXBob3JlX3JlcXVlc3QoIHN0cnVjdCByZWxlYXNlX3NlbWFwaG9yZV9yZXF1ZXN0ICpyZXEgKQoreworICAgIHByaW50ZiggIiBoYW5kbGU9JWQsIiwgcmVxLT5oYW5kbGUgKTsKKyAgICBwcmludGYoICIgY291bnQ9JTA4eCIsIHJlcS0+Y291bnQgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9yZWxlYXNlX3NlbWFwaG9yZV9yZXBseSggc3RydWN0IHJlbGVhc2Vfc2VtYXBob3JlX3JlcGx5ICpyZXEgKQoreworICAgIHByaW50ZiggIiBwcmV2X2NvdW50PSUwOHgiLCByZXEtPnByZXZfY291bnQgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9vcGVuX25hbWVkX29ial9yZXF1ZXN0KCBzdHJ1Y3Qgb3Blbl9uYW1lZF9vYmpfcmVxdWVzdCAqcmVxICkKK3sKKyAgICBwcmludGYoICIgdHlwZT0lZCwiLCByZXEtPnR5cGUgKTsKKyAgICBwcmludGYoICIgYWNjZXNzPSUwOHgsIiwgcmVxLT5hY2Nlc3MgKTsKKyAgICBwcmludGYoICIgaW5oZXJpdD0lZCIsIHJlcS0+aW5oZXJpdCApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX29wZW5fbmFtZWRfb2JqX3JlcGx5KCBzdHJ1Y3Qgb3Blbl9uYW1lZF9vYmpfcmVwbHkgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIGhhbmRsZT0lZCIsIHJlcS0+aGFuZGxlICk7Cit9CisKIHN0cnVjdCBkdW1wZXIKIHsKICAgICB2b2lkICgqZHVtcF9yZXEpKCk7CkBAIC0xNDIsNiArMjExLDI3IEBACiAgICAgeyAodm9pZCgqKSgpKWR1bXBfc2VsZWN0X3JlcXVlc3QsCiAgICAgICAodm9pZCgqKSgpKWR1bXBfc2VsZWN0X3JlcGx5LAogICAgICAgc2l6ZW9mKHN0cnVjdCBzZWxlY3RfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpZHVtcF9jcmVhdGVfZXZlbnRfcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpZHVtcF9jcmVhdGVfZXZlbnRfcmVwbHksCisgICAgICBzaXplb2Yoc3RydWN0IGNyZWF0ZV9ldmVudF9yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlkdW1wX2V2ZW50X29wX3JlcXVlc3QsCisgICAgICAodm9pZCgqKSgpKTAsCisgICAgICBzaXplb2Yoc3RydWN0IGV2ZW50X29wX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKWR1bXBfY3JlYXRlX211dGV4X3JlcXVlc3QsCisgICAgICAodm9pZCgqKSgpKWR1bXBfY3JlYXRlX211dGV4X3JlcGx5LAorICAgICAgc2l6ZW9mKHN0cnVjdCBjcmVhdGVfbXV0ZXhfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpZHVtcF9yZWxlYXNlX211dGV4X3JlcXVlc3QsCisgICAgICAodm9pZCgqKSgpKTAsCisgICAgICBzaXplb2Yoc3RydWN0IHJlbGVhc2VfbXV0ZXhfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpZHVtcF9jcmVhdGVfc2VtYXBob3JlX3JlcXVlc3QsCisgICAgICAodm9pZCgqKSgpKWR1bXBfY3JlYXRlX3NlbWFwaG9yZV9yZXBseSwKKyAgICAgIHNpemVvZihzdHJ1Y3QgY3JlYXRlX3NlbWFwaG9yZV9yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlkdW1wX3JlbGVhc2Vfc2VtYXBob3JlX3JlcXVlc3QsCisgICAgICAodm9pZCgqKSgpKWR1bXBfcmVsZWFzZV9zZW1hcGhvcmVfcmVwbHksCisgICAgICBzaXplb2Yoc3RydWN0IHJlbGVhc2Vfc2VtYXBob3JlX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKWR1bXBfb3Blbl9uYW1lZF9vYmpfcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpZHVtcF9vcGVuX25hbWVkX29ial9yZXBseSwKKyAgICAgIHNpemVvZihzdHJ1Y3Qgb3Blbl9uYW1lZF9vYmpfcmVxdWVzdCkgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVxX25hbWVzW1JFUV9OQl9SRVFVRVNUU10gPQpAQCAtMTU2LDYgKzI0NiwxMyBAQAogICAgICJkdXBfaGFuZGxlIiwKICAgICAib3Blbl9wcm9jZXNzIiwKICAgICAic2VsZWN0IiwKKyAgICAiY3JlYXRlX2V2ZW50IiwKKyAgICAiZXZlbnRfb3AiLAorICAgICJjcmVhdGVfbXV0ZXgiLAorICAgICJyZWxlYXNlX211dGV4IiwKKyAgICAiY3JlYXRlX3NlbWFwaG9yZSIsCisgICAgInJlbGVhc2Vfc2VtYXBob3JlIiwKKyAgICAib3Blbl9uYW1lZF9vYmoiLAogfTsKIAogdm9pZCB0cmFjZV9yZXF1ZXN0KCBlbnVtIHJlcXVlc3QgcmVxLCB2b2lkICpkYXRhLCBpbnQgbGVuLCBpbnQgZmQgKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQuYyBiL3Rvb2xzL2J1aWxkLmMKaW5kZXggNDdkN2ViZC4uZjdiMzg4NSAxMDA2NDQKLS0tIGEvdG9vbHMvYnVpbGQuYworKysgYi90b29scy9idWlsZC5jCkBAIC04NjIsNyArODYyLDcgQEAKICAgICBwU2VnbWVudC0+c2l6ZSA9IG1heF9jb2RlX29mZnNldDsKICAgICBwU2VnbWVudC0+ZmxhZ3MgPSAwOwogICAgIHBTZWdtZW50LT5taW5zaXplID0gbWF4X2NvZGVfb2Zmc2V0OwotICAgIHBTZWdtZW50LT5zZWxlY3RvciA9IDA7CisgICAgcFNlZ21lbnQtPmhTZWcgPSAwOwogICAgIHBTZWdtZW50Kys7CiAKICAgICBwTW9kdWxlLT5kZ3JvdXBfZW50cnkgPSAoaW50KXBTZWdtZW50IC0gKGludClwTW9kdWxlOwpAQCAtODcwLDcgKzg3MCw3IEBACiAgICAgcFNlZ21lbnQtPnNpemUgPSBtYXhfZGF0YV9vZmZzZXQ7CiAgICAgcFNlZ21lbnQtPmZsYWdzID0gTkVfU0VHRkxBR1NfREFUQTsKICAgICBwU2VnbWVudC0+bWluc2l6ZSA9IG1heF9kYXRhX29mZnNldDsKLSAgICBwU2VnbWVudC0+c2VsZWN0b3IgPSAwOworICAgIHBTZWdtZW50LT5oU2VnID0gMDsKICAgICBwU2VnbWVudCsrOwogCiAgICAgICAvKiBSZXNvdXJjZSB0YWJsZSAqLwpAQCAtMTY1Niw3ICsxNjU2LDcgQEAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAiIFBSRUZJWCAibGR0X2NvcHkoJSVlYXgpLCUlZWF4XG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYXgsLTI0KCUlZWJwKVxuIiApOwogICAgICAgICAvKiBBZGQgdGhlIG9mZnNldCAqLwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsIC0yMCglJWVicCksJSVlYXhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bGVhbCAtMTYoJSVlYnApLCUlZWF4XG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGFkZGwgJSVlYXgsLTI0KCUlZWJwKVxuIiApOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvZm50MmJkZi5jIGIvdG9vbHMvZm50MmJkZi5jCmluZGV4IGY2NzhlODUuLjkzMzcxMjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZudDJiZGYuYworKysgYi90b29scy9mbnQyYmRmLmMKQEAgLTM1MSwxNCArMzUxLDE0IEBACiAJLyogTWljcm9zb2Z0IGp1c3QgaGFkIHRvIGludmVudCBpdHMgb3duIGNoYXJzZXRzISAqLwogCiAJY2FzZSBBTlNJX0NIQVJTRVQ6IAlmcHV0cygiYW5zaS0wXG4iLCBmcyk7IGJyZWFrOwotCWNhc2UgR1JFRUtfQ0hBUlNFVDogCWZwdXRzKCJjcDEyNS0zXG4iLCBmcyk7IGJyZWFrOwotCWNhc2UgVFVSS0lTSF9DSEFSU0VUOiAJZnB1dHMoImNwMTI1LTRcbiIsIGZzKTsgYnJlYWs7Ci0JY2FzZSBIRUJSRVdfQ0hBUlNFVDogCWZwdXRzKCJjcDEyNS01XG4iLCBmcyk7IGJyZWFrOwotCWNhc2UgQVJBQklDX0NIQVJTRVQ6IAlmcHV0cygiY3AxMjUtNlxuIiwgZnMpOyBicmVhazsKLQljYXNlIEJBTFRJQ19DSEFSU0VUOiAJZnB1dHMoImNwMTI1LTdcbiIsIGZzKTsgYnJlYWs7Ci0JY2FzZSBSVVNTSUFOX0NIQVJTRVQ6IAlmcHV0cygiY3AxMjUtMVxuIiwgZnMpOyBicmVhazsKLQljYXNlIEVFX0NIQVJTRVQ6IAlmcHV0cygiY3AxMjUtMFxuIiwgZnMpOyBicmVhazsgCi0JY2FzZSBTWU1CT0xfQ0hBUlNFVDogCWZwdXRzKCJtaXNjLWZvbnRzcGVjaWZpY1xuIiwgZnMpOyBicmVhazsKKwljYXNlIEdSRUVLX0NIQVJTRVQ6IAlmcHV0cygibWljcm9zb2Z0LWNwMTI1M1xuIiwgZnMpOyBicmVhazsKKwljYXNlIFRVUktJU0hfQ0hBUlNFVDogCWZwdXRzKCJtaWNyb3NvZnQtY3AxMjU0XG4iLCBmcyk7IGJyZWFrOworCWNhc2UgSEVCUkVXX0NIQVJTRVQ6IAlmcHV0cygibWljcm9zb2Z0LWNwMTI1NVxuIiwgZnMpOyBicmVhazsKKwljYXNlIEFSQUJJQ19DSEFSU0VUOiAJZnB1dHMoIm1pY3Jvc29mdC1jcDEyNTZcbiIsIGZzKTsgYnJlYWs7CisJY2FzZSBCQUxUSUNfQ0hBUlNFVDogCWZwdXRzKCJtaWNyb3NvZnQtY3AxMjU3XG4iLCBmcyk7IGJyZWFrOworCWNhc2UgUlVTU0lBTl9DSEFSU0VUOiAJZnB1dHMoIm1pY3Jvc29mdC1jcDEyNTFcbiIsIGZzKTsgYnJlYWs7CisJY2FzZSBFRV9DSEFSU0VUOiAJZnB1dHMoIm1pY3Jvc29mdC1jcDEyNTBcbiIsIGZzKTsgYnJlYWs7IAorCWNhc2UgU1lNQk9MX0NIQVJTRVQ6IAlmcHV0cygibWljcm9zb2Z0LXN5bWJvbFxuIiwgZnMpOyBicmVhazsKIAljYXNlIFNISUZUSklTX0NIQVJTRVQ6IAlmcHV0cygiamlzeDAyMDguMTk4My0wXG4iLCBmcyk7IGJyZWFrOwogCWNhc2UgREVGQVVMVF9DSEFSU0VUOglmcHV0cygiaXNvODg1OS0xXG4iLCBmcyk7IGJyZWFrOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0cnVuIGIvdG9vbHMvdGVzdHJ1bgppbmRleCA3YTUyYWYyLi42NjVjYmUyIDEwMDc1NQotLS0gYS90b29scy90ZXN0cnVuCisrKyBiL3Rvb2xzL3Rlc3RydW4KQEAgLTk2LDE1ICs5NiwzMyBAQAogc3ViIGtpbGxfc3VicHJvY2Vzc2VzIHsKIAlsb2NhbCgka2lsbGVkYWxyZWFkeSwlcGFyZW50b2YsJWtpZHMsJGNoYW5nZWQsJWNtZGxpbmUpOwogCi0JIyBGSVhNRTogTGludXggcHMgZGVwZW5kZW5kLi4uCisJIyBGSVhNRTogc3Vic3RpdHV0ZSBwcyBjb21tYW5kIHRoYXQgc2hvd3MgUElELFBQSUQgYW5kIENPTU1BTkQKKwkjIE9uIExpbnV4JyBsYXRlc3QgcHJvY3BzIHRoaXMgaXMgInBzIGF1bGMiCiAJIwotCW9wZW4oUFNBVVgsInBzIC0tZm9ybWF0IHBpZCxwcGlkLGNvbW18Iik7CisJb3BlbihQU0FVWCwicHMgYXVsY3wiKTsKIAkjIGxvb2t1cCBhbGwgcHJvY2Vzc2VzLCByZW1lbWJlciB0aGVpciBwYXJlbnRzIGFuZCBjbWRsaW5lcy4KIAklcGFyZW50b2Y9KCk7Ci0Jd2hpbGUgKDxQU0FVWD4pIHsKLQkJaWYgKC9ccyooXGQqKVxzKihcZCopXHMqKFxTKikvKSB7Ci0JCQkkcGFyZW50b2Z7JDF9PSQyOwotCQkJJGNtZGxpbmV7JDF9PSQzOworCSR4bGluZSA9IDxQU0FVWD47ICMgZm10bGluZSAKKwlAcHNmb3JtYXQgPSBzcGxpdCgvXHNccyovLCR4bGluZSk7CisKKwlwc2xpbmU6IHdoaWxlICg8UFNBVVg+KSB7CisJCWNob3A7CisJCUBwc2xpbmUgPSBzcGxpdCgvXHNccyovKTsKKwkJJHBpZD0wOworCQlmb3IgKCRpPTA7JGk8PSQjcHNmb3JtYXQ7JGkrKykgeworCQkJaWYgKCRwc2Zvcm1hdFskaV0gPX4gL0NPTU1BTkQvKSB7CisJCQkJZGllIHVubGVzcyAkcGlkOworCQkJCSRjbWRsaW5leyRwaWR9PSRwc2xpbmVbJGldOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCRwc2Zvcm1hdFskaV0gPX4gL1BQSUQvICkgeworCQkJCSRwYXJlbnRvZnskcGlkfSA9ICRwc2xpbmVbJGldOworCQkJCW5leHQ7CisJCQl9CisJCQlpZiAoJHBzZm9ybWF0WyRpXSA9fiAvUElELyApIHsKKwkJCQkkcGlkID0gJHBzbGluZVskaV07CisJCQkJbmV4dDsKKwkJCX0KIAkJfQogCX0KIAljbG9zZShQU0FVWCk7CmRpZmYgLS1naXQgYS93aW4zMi9hZHZhcGkuYyBiL3dpbjMyL2FkdmFwaS5jCmluZGV4IDkxMTBhZjguLjY1NmE2MDEgMTAwNjQ0Ci0tLSBhL3dpbjMyL2FkdmFwaS5jCisrKyBiL3dpbjMyL2FkdmFwaS5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIEhBTkRMRTMyIFdJTkFQSSBPcGVuU0NNYW5hZ2VyMzJXKCBMUENXU1RSIGxwTWFjaGluZU5hbWUsIExQQ1dTVFIgbHBEYXRhYmFzZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzICkKIHsKLSAgICBGSVhNRShhZHZhcGksIiglcywlcywlMDhseCk6IHN0dWJcbiIsIGRlYnVnc3RyX3cobHBNYWNoaW5lTmFtZSksIAorICAgIEZJWE1FKGFkdmFwaSwiKCVzLCVzLDB4JTA4bHgpOiBzdHViXG4iLCBkZWJ1Z3N0cl93KGxwTWFjaGluZU5hbWUpLCAKICAgICAgICAgICBkZWJ1Z3N0cl93KGxwRGF0YWJhc2VOYW1lKSwgZHdEZXNpcmVkQWNjZXNzKTsKICAgICByZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL3dpbjMyL2NvbnNvbGUuYyBiL3dpbjMyL2NvbnNvbGUuYwppbmRleCAwYzI0ZmY2Li44OGZkNDEyIDEwMDY0NAotLS0gYS93aW4zMi9jb25zb2xlLmMKKysrIGIvd2luMzIvY29uc29sZS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTUyNiw3ICs1MjcsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIFNldENvbnNvbGVNb2RlKCBIQU5ETEUzMiBoY29uLCBEV09SRCBtb2RlICkKIHsKLSAgICBGSVhNRShjb25zb2xlLCIoJTA4eCwlMDhseCk6IHN0dWJcbiIsaGNvbixtb2RlKTsKKyAgICBGSVhNRShjb25zb2xlLCIoMHglMDh4LDB4JTA4bHgpOiBzdHViXG4iLGhjb24sbW9kZSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbGUuYyBiL3dpbjMyL2ZpbGUuYwppbmRleCAyNDNjMDZkLi5lMDg0NzVkIDEwMDY0NAotLS0gYS93aW4zMi9maWxlLmMKKysrIGIvd2luMzIvZmlsZS5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvd2luMzIva2VybmVsMzIuYyBiL3dpbjMyL2tlcm5lbDMyLmMKaW5kZXggMWJlNWY5My4uMTYwNDM1ZSAxMDA2NDQKLS0tIGEvd2luMzIva2VybmVsMzIuYworKysgYi93aW4zMi9rZXJuZWwzMi5jCkBAIC0zNTYsNyArMzU2LDcgQEAKIAogICAgIENPTlRFWFQgY29udGV4dDE2OwogICAgIERXT1JEIGksIGFyZ3NpemU7Ci0gICAgTFBCWVRFIG5ld3N0YWNrOworICAgIExQQllURSBuZXdzdGFjaywgb2xkc3RhY2s7CiAgICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CiAKICAgICBtZW1jcHkoJmNvbnRleHQxNixjb250ZXh0LHNpemVvZihjb250ZXh0MTYpKTsKQEAgLTM2OCwxNSArMzY4LDE3IEBACiAKICAgICBhcmdzaXplICA9IEVCUF9yZWcoY29udGV4dCktRVNQX3JlZyhjb250ZXh0KS0weDQ0OwogICAgIG5ld3N0YWNrID0gKChMUEJZVEUpVEhSRUFEX1NUQUNLMTYodGhkYikpLWFyZ3NpemU7CisgICAgb2xkc3RhY2sgPSAoTFBCWVRFKUVTUF9yZWcoY29udGV4dCkrNDsKIAotICAgIG1lbWNweSggbmV3c3RhY2ssIChMUEJZVEUpRVNQX3JlZyhjb250ZXh0KSs0LCBhcmdzaXplICk7CisgICAgbWVtY3B5KCBuZXdzdGFjaywgb2xkc3RhY2ssIGFyZ3NpemUgKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQkvKiBOT1RFOiBXaGF0IGFib3V0ID4gMzIgYXJndW1lbnRzPyAqLwogCWlmIChtYXBFU1ByZWxhdGl2ZSAmICgxIDw8IGkpKQogCXsKIAkgICAgU0VHUFRSICphcmcgPSAoU0VHUFRSICopKG5ld3N0YWNrICsgMippKTsKIAkgICAgKmFyZyA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihTRUxFQ1RPUk9GKHRoZGItPmN1cl9zdGFjayksIAotCQkJCQkgKihMUEJZVEUgKilhcmcgLSBuZXdzdGFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVE9GKHRoZGItPmN1cl9zdGFjaykgLSBhcmdzaXplCisJCQkJCSArICgqKExQQllURSAqKWFyZyAtIG9sZHN0YWNrKSk7CiAJfQogCiAgICAgRUFYX3JlZyhjb250ZXh0KSA9IENhbGxiYWNrcy0+Q2FsbFJlZ2lzdGVyU2hvcnRQcm9jKCAmY29udGV4dDE2LCBhcmdzaXplICk7CkBAIC04MjEsNiArODIzLDE2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU1NJbml0CQlLRVJORUwuNzAwCisgKiBSRVRVUk5TCisgKglUUlVFIGZvciBzdWNjZXNzLgorICovCitCT09MMzIgV0lOQVBJIFNTSW5pdCgpCit7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU1NPbkJpZ1N0YWNrCUtFUk5FTDMyLjg3CiAgKiBDaGVjayBpZiB0aHVua2luZyBpcyBpbml0aWFsaXplZCAoc3Mgc2VsZWN0b3Igc2V0IHVwIGV0Yy4pCiAgKiBXZSBkbyB0aGF0IGRpZmZlcmVudGx5LCBzbyBqdXN0IHJldHVybiBUUlVFLgpAQCAtODk2LDEwICs5MDgsMTkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJS0VSTkVMXzYxOQkJKEtFUk5FTCkKKyAqIAkJSW5pdENCQ2xpZW50CQkoS0VSTkVMLjYyMykKKyAqLworV09SRCBXSU5BUEkgSW5pdENCQ2xpZW50KERXT1JEIHgpCit7CisgICAgRklYTUUodGh1bmssIigweCUwOGx4KTogc3R1YlxuIix4KTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJUmVnaXN0ZXJDQkNsaWVudAkoS0VSTkVMLjYxOSkKICAqIFNlZW1zIHRvIHN0b3JlIHkgYW5kIHogZGVwZW5kaW5nIG9uIHggaW4gc29tZSBpbnRlcm5hbCBsaXN0cy4uLgogICovCi1XT1JEIFdJTkFQSSBfS0VSTkVMXzYxOShXT1JEIHgsRFdPUkQgeSxEV09SRCB6KQorV09SRCBXSU5BUEkgUmVnaXN0ZXJDQkNsaWVudChXT1JEIHgsRFdPUkQgeSxEV09SRCB6KQogewogICAgIEZJWE1FKHRodW5rLCIoMHglMDR4LDB4JTA4bHgsMHglMDhseCk6IHN0dWJcbiIseCx5LHopOwogICAgIHJldHVybiB4OwpAQCAtOTU1LDYgKzk3NiwxNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlLRVJORUxfNjEyCQkoS0VSTkVMKQorICovCitCT09MMTYgV0lOQVBJIF9LRVJORUxfNjEyKExQQllURSB0YXJnZXQpCit7CisgICAgcmV0dXJuICAgIHRhcmdldFsgMF0gPT0gMHg2NiAmJiB0YXJnZXRbIDFdID09IDB4NjggCisgICAgICAgICAgICYmIHRhcmdldFsgNl0gPT0gMHg2NiAmJiB0YXJnZXRbIDJdID09IDB4NjgKKyAgICAgICAgICAgJiYgdGFyZ2V0WzEyXSA9PSAweDY2ICYmIHRhcmdldFsxM10gPT0gMHg1OCAKKyAgICAgICAgICAgJiYgdGFyZ2V0WzE0XSA9PSAweENCOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlBbGxvY1NMQ2FsbGJhY2sJCShLRVJORUwzMikKICAqCiAgKiBXaW45NSB1c2VzIHNvbWUgc3RydWN0Y2hhaW5zIGZvciBjYWxsYmFja3MuIEl0IGFsbG9jYXRlcyB0aGVtCkBAIC0xMDE5LDM5ICsxMDUxLDEwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJS0VSTkVMXzQ3MQkJKEtFUk5FTC40NzEpCi0gKiBSRVRVUk5TCi0gKiAJU2VlbXMgdG8gcmV0dXJuIHRoZSB1bmNyeXB0ZWQgY3VycmVudCBwcm9jZXNzIHBvaW50ZXIuIFtOb3QgMTAwJSBzdXJlXS4KLSAqLwotTFBWT0lEIFdJTkFQSQotX0tFUk5FTF80NzEoKSB7Ci0JcmV0dXJuIFBST0NFU1NfQ3VycmVudCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlLRVJORUxfNDcyCQkoS0VSTkVMLjQ3MikKLSAqIHNvbWV0aGluZyBsaWtlIEdldEN1cnJlbnRoSW5zdGFuY2UuCi0gKiBSRVRVUk5TCi0gKgl0aGUgaEluc3RhbmNlCi0gKi8KLVZPSUQgV0lOQVBJCi1fS0VSTkVMXzQ3MihDT05URVhUICpjb250ZXh0KSB7Ci0JRklYTUUod2luMzIsIigweCUwOGx4KTogc3R1YlxuIixFQVhfcmVnKGNvbnRleHQpKTsKLQlpZiAoIUVBWF9yZWcoY29udGV4dCkpIHsKLQkJVERCICpwVGFzayA9IChUREIqKUdsb2JhbExvY2sxNihHZXRDdXJyZW50VGFzaygpKTsKLQkJQVhfcmVnKGNvbnRleHQpPXBUYXNrLT5oSW5zdGFuY2U7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFISVdPUkQoRUFYX3JlZyhjb250ZXh0KSkpCi0JCXJldHVybjsgLyogcmV0dXJucyB0aGUgcGFzc2VkIHZhbHVlICovCi0JLyogaG1tIC4uLiBmaXhtZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlLRVJORUxfNDc1CQkoS0VSTkVMLjQ3NSkKKyAqIAkJR2V0VEVCU2VsZWN0b3JGUwkoS0VSTkVMLjQ3NSkKICAqIAlTZXQgdGhlIDE2LWJpdCAlZnMgdG8gdGhlIDMyLWJpdCAlZnMgKGN1cnJlbnQgVEVCIHNlbGVjdG9yKQogICovCi1WT0lEIFdJTkFQSSBfS0VSTkVMXzQ3NShDT05URVhUICpjb250ZXh0KSAKK1ZPSUQgV0lOQVBJIEdldFRFQlNlbGVjdG9yRlMoIENPTlRFWFQgKmNvbnRleHQgKSAKIHsKICAgICBHRVRfRlMoIEZTX3JlZyhjb250ZXh0KSApOwogfQpkaWZmIC0tZ2l0IGEvd2luMzIvb3JkaW5hbHMuYyBiL3dpbjMyL29yZGluYWxzLmMKaW5kZXggNWI3NDI3YS4uOTcyMDlkZiAxMDA2NDQKLS0tIGEvd2luMzIvb3JkaW5hbHMuYworKysgYi93aW4zMi9vcmRpbmFscy5jCkBAIC0yNiw3ICsyNiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0UHJvY2Vzc0R3b3JkICAgIChLRVJORUwzMi4xOCkKKyAqICAgICAgICAgICBHZXRQcm9jZXNzRHdvcmQgICAgKEtFUk5FTDMyLjE4KSAoS0VSTkVMLjQ4NSkKICAqICdPZiBjb3Vyc2UgeW91IGNhbm5vdCBkaXJlY3RseSBhY2Nlc3MgV2luZG93cyBpbnRlcm5hbCBzdHJ1Y3R1cmVzJwogICovCiBEV09SRCBXSU5BUEkgR2V0UHJvY2Vzc0R3b3JkKERXT1JEIHByb2Nlc3NpZCxEV09SRCBhY3Rpb24pCkBAIC05OSw2ICs5OSwyNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRQcm9jZXNzRHdvcmQgICAgKEtFUk5FTC40ODQpCisgKiAnT2YgY291cnNlIHlvdSBjYW5ub3QgZGlyZWN0bHkgYWNjZXNzIFdpbmRvd3MgaW50ZXJuYWwgc3RydWN0dXJlcycKKyAqLworVk9JRCBXSU5BUEkgU2V0UHJvY2Vzc0R3b3JkKERXT1JEIHByb2Nlc3NpZCxEV09SRCBhY3Rpb24sRFdPUkQgdmFsdWUpCit7CisJUERCMzIJKnByb2Nlc3MgPSBwcm9jZXNzaWQ/IFBST0NFU1NfSWRUb1BEQiggcHJvY2Vzc2lkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUFJPQ0VTU19DdXJyZW50KCk7CisKKwlhY3Rpb24rPTU2OworCVRSQUNFKHdpbjMyLCIoJWxkLCVsZCsweDM4KVxuIixwcm9jZXNzaWQsYWN0aW9uKTsKKwlpZiAoIXByb2Nlc3MgfHwgYWN0aW9uPjU2KSByZXR1cm47CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWRlZmF1bHQ6CisJCUZJWE1FKHdpbjMyLCJVbmtub3duIG9mZnNldCAoJWxkKVxuIixhY3Rpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJR2V0V2luMTZET1NFbnYJCQkoS0VSTkVMMzIuMzQpCiAgKiBSZXR1cm5zIHNvbWUgaW50ZXJuYWwgdmFsdWUuLi4uIHByb2JhYmx5IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGRhdGFiYXNlPwogICovCmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggMmUwNmJiNC4uZjE4ODE3ZCAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtNjIsMTQgKzYyLDQ5IEBACiAgKiAgQ29udGludWVEZWJ1Z0V2ZW50IFtLRVJORUwzMi4xNDZdCiAgKi8KIEJPT0wzMiBXSU5BUEkgQ29udGludWVEZWJ1Z0V2ZW50KERXT1JEIHBpZCxEV09SRCB0aWQsRFdPUkQgY29udHN0YXR1cykgewotICAgIEZJWE1FKHdpbjMyLCIoJWxkLCVsZCwlbGQpOiBzdHViXG4iLHBpZCx0aWQsY29udHN0YXR1cyk7CisgICAgRklYTUUod2luMzIsIigweCVseCwlbGQsJWxkKTogc3R1YlxuIixwaWQsdGlkLGNvbnRzdGF0dXMpOwogCXJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIFByb2Nlc3NfQ2xvY2tUaW1lVG9GaWxlVGltZQorICogICAgICAob2xvcmluQGZhbmRyYS5vcmcsIDIwLVNlcC0xOTk4KQorICogICAgICBDb252ZXJ0cyBjbG9ja190IGludG8gRklMRVRJTUUuCisgKiAgICAgIFVzZWQgYnkgR2V0UHJvY2Vzc1RpbWUuCisgKiAgICAgIERpZmZlcmVuY2VzIHRvIFVuaXhUaW1lVG9GaWxlVGltZToKKyAqICAgICAgICAgIDEpIERpdmlkZWQgYnkgQ0xLX1RDSworICogICAgICAgICAgMikgVGltZSBpcyByZWxhdGl2ZS4gVGhlcmUgaXMgbm8gJ3N0YXJ0aW5nIGRhdGUnLCBzbyB0aGVyZSBpcyAKKyAqICAgICAgICAgICAgIG5vIG5lZWQgaW4gb2Zmc2V0IGNvcnJlY3Rpb24sIGxpa2UgaW4gVW5peFRpbWVUb0ZpbGVUaW1lCisgKiAgICAgIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBtb3ZlZCB0byBhIG1vcmUgYXBwcm9wcmlhdGUgLmMgZmlsZQorICogICAgICBGSVhNRTogT24gZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucywgaXQgaXMgYXNzdW1lZCB0aGF0CisgKiAgICAgICAgICAgICBmbG9hdGluZyB2YWx1ZXMgYXJlIHRydW5jYXRlZCBvbiBjb252ZXJ0aW9uIHRvIGludGVnZXIuCisgKi8KK3ZvaWQgUHJvY2Vzc19DbG9ja1RpbWVUb0ZpbGVUaW1lKCBjbG9ja190IHVuaXhfdGltZSwgTFBGSUxFVElNRSBmaWxldGltZSApCit7CisgICAgZG91YmxlIHRkID0gKHVuaXhfdGltZSoxMDAwMDAwMC4wKS9DTEtfVENLOworICAgIC8qIFllcywgZG91YmxlLCBiZWNhdXNlIGxvbmcgaW50IG1pZ2h0IG92ZXJmbG93IGhlcmUuICovCisjaWYgKFNJWkVPRl9MT05HX0xPTkcgPj0gOCkKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdCA9IHRkOworICAgIGZpbGV0aW1lLT5kd0xvd0RhdGVUaW1lICA9IChVSU5UMzIpIHQ7CisgICAgZmlsZXRpbWUtPmR3SGlnaERhdGVUaW1lID0gKFVJTlQzMikgKHQgPj4gMzIpOworI2Vsc2UKKyAgICBkb3VibGUgZGl2aWRlciA9IDEuICogKDEgPDwgMTYpICogKDEgPDwgMTYpOworICAgIGZpbGV0aW1lLT5kd0hpZ2hEYXRlVGltZSA9IChVSU5UMzIpICh0ZCAvIGRpdmlkZXIpOworICAgIGZpbGV0aW1lLT5kd0xvd0RhdGVUaW1lICA9IChVSU5UMzIpICh0ZCAtIGZpbGV0aW1lLT5kd0hpZ2hEYXRlVGltZSpkaXZpZGVyKTsKKyAgICAvKiB1c2luZyBmbG9vcigpIHByb2R1Y2VzIHdpZXJkIHJlc3VsdHMsIGJldHRlciBsZWF2ZSB0aGlzIGFzIGl0IGlzIAorICAgICAqICggd2l0aCAoVUlOVDMyKSBjb252ZXJ0aW9uICkKKyAgICAgKi8KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglHZXRQcm9jZXNzVGltZXMJCQkJW0tFUk5FTDMyLjI2Ml0KICAqCi0gKiBGSVhNRTogaW1wbGVtZW50IHRoaXMgYmV0dGVyIC4uLgorICogRklYTUU6IGxwQ3JlYXRpb25UaW1lLCBscEV4aXRUaW1lIGFyZSBOT1QgSU5JVElBTElaRUQuCisgKiBvbG9yaW5AZmFuZHJhLm9yZzogV291bGQgYmUgbmljZSB0byBzdWJzdHJhY3QgdGhlIGNwdSB0aW1lLAorICogICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgV2luZSBhdCBzdGFydHVwLgorICogICAgICAgICAgICAgICAgICAgIEFsc28sIHRoZXJlIGlzIGEgbmVlZCB0byBzZXBhcmF0ZSB0aW1lcworICogICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgZGlmZmVyZW50IGFwcGxpY2F0aW9ucy4KICAqLwogQk9PTDMyIFdJTkFQSSBHZXRQcm9jZXNzVGltZXMoCiAJSEFORExFMzIgaHByb2Nlc3MsTFBGSUxFVElNRSBscENyZWF0aW9uVGltZSxMUEZJTEVUSU1FIGxwRXhpdFRpbWUsCkBAIC03OCw4ICsxMTMsOCBAQAogCXN0cnVjdCB0bXMgdG1zOwogCiAJdGltZXMoJnRtcyk7Ci0JRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKHRtcy50bXNfdXRpbWUsbHBVc2VyVGltZSwwKTsKLQlET1NGU19Vbml4VGltZVRvRmlsZVRpbWUodG1zLnRtc19zdGltZSxscEtlcm5lbFRpbWUsMCk7CisgICAgICAgIFByb2Nlc3NfQ2xvY2tUaW1lVG9GaWxlVGltZSh0bXMudG1zX3V0aW1lLGxwVXNlclRpbWUpOworICAgICAgICBQcm9jZXNzX0Nsb2NrVGltZVRvRmlsZVRpbWUodG1zLnRtc19zdGltZSxscEtlcm5lbFRpbWUpOwogCXJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS93aW4zMi9zZWN1cml0eS5jIGIvd2luMzIvc2VjdXJpdHkuYwppbmRleCA5NmE5NDk2Li44YjEwNjA3IDEwMDY0NAotLS0gYS93aW4zMi9zZWN1cml0eS5jCisrKyBiL3dpbjMyL3NlY3VyaXR5LmMKQEAgLTY2LDcgKzY2LDcgQEAKICAqICAgICAgICAgICBHZXRTaWRMZW5ndGhSZXF1aXJlZCAgKEFEVkFQSS42MykKICAqLwogRFdPUkQgV0lOQVBJIEdldFNpZExlbmd0aFJlcXVpcmVkIChCWVRFIG5TdWJBdXRob3JpdHlDb3VudCkgewotICAgIHJldHVybiBzaXplb2YgKFNJRCkgKyAoblN1YkF1dGhvcml0eUNvdW50IC0gMSAqIHNpemVvZiAoRFdPUkQpKTsKKyAgICByZXR1cm4gc2l6ZW9mIChTSUQpICsgKG5TdWJBdXRob3JpdHlDb3VudCAtIDEpICogc2l6ZW9mIChEV09SRCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTI0LDcgKzEyNCw3IEBACiBCT09MMzIgV0lOQVBJIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoIFNFQ1VSSVRZX0RFU0NSSVBUT1IgKnBEZXNjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgcmV2aXNpb24gKQogewotICAgIEZJWE1FKHNlY3VyaXR5LCAiKCVwLCUjbHgpOiBlbXB0eSBzdHViXG4iLCBwRGVzY3IsIHJldmlzaW9uKTsKKyAgICBGSVhNRShzZWN1cml0eSwgIiglcCwlI2x4KTogc3R1YlxuIiwgcERlc2NyLCByZXZpc2lvbik7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvTWFrZWZpbGUuaW4gYi93aW5kb3dzL01ha2VmaWxlLmluCmluZGV4IDZmZWI3YTMuLmMyNzM4YzUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvTWFrZWZpbGUuaW4KKysrIGIvd2luZG93cy9NYWtlZmlsZS5pbgpAQCAtMjMsNiArMjMsNyBAQAogCW1kaS5jIFwKIAltZXNzYWdlLmMgXAogCW1zZ2JveC5jIFwKKwltdWx0aW1vbi5jIFwKIAlub25jbGllbnQuYyBcCiAJcGFpbnRpbmcuYyBcCiAJcHJvcGVydHkuYyBcCmRpZmYgLS1naXQgYS93aW5kb3dzL2NsaXBib2FyZC5jIGIvd2luZG93cy9jbGlwYm9hcmQuYwppbmRleCA4YjBhNTFkLi5hYTFmMjk4IDEwMDY0NAotLS0gYS93aW5kb3dzL2NsaXBib2FyZC5jCisrKyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKQEAgLTgwMyw4ICs4MDMsNyBAQAogewogICAgIEJPT0wzMiBiUmV0ID0gMDsKIAotICAgIEZJWE1FKGNsaXBib2FyZCwgIiglMDR4LCAlMDR4KSAtIHN0dWI/XG4iLCAKLQkJICAgICAgaFduZCwgaFduZE5leHQpOworICAgIEZJWE1FKGNsaXBib2FyZCwgIigweCUwNHgsIDB4JTA0eCk6IHN0dWI/XG4iLCBoV25kLCBoV25kTmV4dCk7CiAKICAgICBpZiggaFduZFZpZXdlciApCiAJYlJldCA9ICFTZW5kTWVzc2FnZTE2KCBoV25kVmlld2VyLCBXTV9DSEFOR0VDQkNIQUlOLApkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZkbGcuYyBiL3dpbmRvd3MvZGVmZGxnLmMKaW5kZXggZWRlMGUwOS4uMTYyMzllNSAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZkbGcuYworKysgYi93aW5kb3dzL2RlZmRsZy5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERFRkRMR19FcGlsb2cKICAqLwotc3RhdGljIExSRVNVTFQgREVGRExHX0VwaWxvZyhESUFMT0dJTkZPKiBkbGdJbmZvLCBVSU5UMzIgbXNnLCBCT09MMTYgZlJlc3VsdCkKK3N0YXRpYyBMUkVTVUxUIERFRkRMR19FcGlsb2coRElBTE9HSU5GTyogZGxnSW5mbywgVUlOVDMyIG1zZywgQk9PTDMyIGZSZXN1bHQpCiB7CiAgICAgLyogc2VlIFNESyAzLjEgKi8KIApAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQogewogICAgIERJQUxPR0lORk8gKiBkbGdJbmZvOwotICAgIEJPT0wxNiByZXN1bHQgPSBGQUxTRTsKKyAgICBCT09MMzIgcmVzdWx0ID0gRkFMU0U7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7CkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICBkbGdJbmZvLT5tc2dSZXN1bHQgPSAwOwogCiAgICAgaWYgKGRsZ0luZm8tPmRsZ1Byb2MpIAkvKiBDYWxsIGRpYWxvZyBwcm9jZWR1cmUgKi8KLQlyZXN1bHQgPSAoQk9PTDE2KUNhbGxXaW5kb3dQcm9jMTYoIChXTkRQUk9DMTYpZGxnSW5mby0+ZGxnUHJvYywKKwlyZXN1bHQgPSBDYWxsV2luZG93UHJvYzE2KCAoV05EUFJPQzE2KWRsZ0luZm8tPmRsZ1Byb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogCiAgICAgLyogQ2hlY2sgaWYgd2luZG93IHdhcyBkZXN0cm95ZWQgYnkgZGlhbG9nIHByb2NlZHVyZSAqLwpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewogICAgIERJQUxPR0lORk8gKiBkbGdJbmZvOwotICAgIEJPT0wxNiByZXN1bHQgPSBGQUxTRTsKKyAgICBCT09MMzIgcmVzdWx0ID0gRkFMU0U7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7CkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICBkbGdJbmZvLT5tc2dSZXN1bHQgPSAwOwogCiAgICAgaWYgKGRsZ0luZm8tPmRsZ1Byb2MpICAgICAgIC8qIENhbGwgZGlhbG9nIHByb2NlZHVyZSAqLwotICAgICAgICByZXN1bHQgPSAoQk9PTDE2KUNhbGxXaW5kb3dQcm9jMzJBKCAoV05EUFJPQzMyKWRsZ0luZm8tPmRsZ1Byb2MsCisgICAgICAgIHJlc3VsdCA9IENhbGxXaW5kb3dQcm9jMzJBKCAoV05EUFJPQzMyKWRsZ0luZm8tPmRsZ1Byb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKIAogICAgIC8qIENoZWNrIGlmIHdpbmRvdyB3YXMgZGVzdHJveWVkIGJ5IGRpYWxvZyBwcm9jZWR1cmUgKi8KQEAgLTM2Myw3ICszNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCiB7CiAgICAgRElBTE9HSU5GTyAqIGRsZ0luZm87Ci0gICAgQk9PTDE2IHJlc3VsdCA9IEZBTFNFOworICAgIEJPT0wzMiByZXN1bHQgPSBGQUxTRTsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIAogICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKQEAgLTM3MSw3ICszNzEsNyBAQAogICAgIGRsZ0luZm8tPm1zZ1Jlc3VsdCA9IDA7CiAKICAgICBpZiAoZGxnSW5mby0+ZGxnUHJvYykgICAgICAgLyogQ2FsbCBkaWFsb2cgcHJvY2VkdXJlICovCi0gICAgICAgIHJlc3VsdCA9IChCT09MMTYpQ2FsbFdpbmRvd1Byb2MzMlcoIChXTkRQUk9DMzIpZGxnSW5mby0+ZGxnUHJvYywKKyAgICAgICAgcmVzdWx0ID0gQ2FsbFdpbmRvd1Byb2MzMlcoIChXTkRQUk9DMzIpZGxnSW5mby0+ZGxnUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogCiAgICAgLyogQ2hlY2sgaWYgd2luZG93IHdhcyBkZXN0cm95ZWQgYnkgZGlhbG9nIHByb2NlZHVyZSAqLwpkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZ3bmQuYyBiL3dpbmRvd3MvZGVmd25kLmMKaW5kZXggNDYxMTdlNy4uY2ZjODY4MyAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZ3bmQuYworKysgYi93aW5kb3dzL2RlZnduZC5jCkBAIC04Niw3ICs4Niw3IEBACiAKICAgICBTZXRUZXh0Q29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPV1RFWFQpKTsKIAotICAgIGlmIChUV0VBS19XaW45NUxvb2spIHsKKyAgICBpZiAoVFdFQUtfV2luZUxvb2sgPiBXSU4zMV9MT09LKSB7CiAJaWYgKChjdGxUeXBlID09IENUTENPTE9SX0VESVQpIHx8IChjdGxUeXBlID09IENUTENPTE9SX0xJU1RCT1gpKQogCSAgICBTZXRCa0NvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1cpICk7CiAJZWxzZSB7CkBAIC0xMDcsNyArMTA3LDcgQEAKIHsKICAgICBCT09MMzIgYlZpc2libGUgPSB3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFOwogCi1UUkFDRSh3aW4sIiUwNHggJWlcbiIsIHduZFB0ci0+aHduZFNlbGYsICh3UGFyYW0hPTApICk7CisgICAgVFJBQ0Uod2luLCIlMDR4ICVpXG4iLCB3bmRQdHItPmh3bmRTZWxmLCAod1BhcmFtIT0wKSApOwogCiAgICAgaWYoIHdQYXJhbSApCiAgICAgewpAQCAtMTUzLDcgKzE1Myw3IEBACiAKICAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgogICAgIGNhc2UgV01fTkNSQlVUVE9ORE9XTjoKLSAgICAgICAgaWYgKCh3bmRQdHItPmZsYWdzICYgV0lOX0lTV0lOMzIpIHx8IFRXRUFLX1dpbjk1TG9vaykKKyAgICAgICAgaWYgKCh3bmRQdHItPmZsYWdzICYgV0lOX0lTV0lOMzIpIHx8IChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spKQogICAgICAgICB7CiAJICAgIENsaWVudFRvU2NyZWVuMTYod25kUHRyLT5od25kU2VsZiwgKExQUE9JTlQxNikmbFBhcmFtKTsKICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCB3bmRQdHItPmh3bmRTZWxmLCBXTV9DT05URVhUTUVOVSwKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDY5MTgxM2UuLjQ5ZjQyY2UgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtNSwxMSArNSwxMCBAQAogICovCiAKICNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKZGlmZiAtLWdpdCBhL3dpbmRvd3Mva2V5Ym9hcmQuYyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwppbmRleCA1NDIyNzAwLi45ZTc2OTZhIDEwMDY0NAotLS0gYS93aW5kb3dzL2tleWJvYXJkLmMKKysrIGIvd2luZG93cy9rZXlib2FyZC5jCkBAIC0xMDUyLDYgKzEwNTIsMzYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUdldEtleWJvYXJkTGF5b3V0TmFtZTMyQSAgIChVU0VSMzIuMjUyKQorICovCitJTlQzMiBXSU5BUEkgR2V0S2V5Ym9hcmRMYXlvdXROYW1lMzJBKExQU1RSIHB3c3pLTElEKQoreworCXJldHVybiBHZXRLZXlib2FyZExheW91dE5hbWUxNihwd3N6S0xJRCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglHZXRLZXlib2FyZExheW91dE5hbWUzMlcgICAoVVNFUjMyLjI1MykKKyAqLworSU5UMzIgV0lOQVBJIEdldEtleWJvYXJkTGF5b3V0TmFtZTMyVyhMUFdTVFIgcHdzektMSUQpCit7CisJTFBTVFIgYnVmID0gSEVBUF94YWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN0cmxlbigiMDAwMDA0MDkiKSsxKTsKKwlpbnQgcmVzID0gR2V0S2V5Ym9hcmRMYXlvdXROYW1lMzJBKGJ1Zik7CisJbHN0cmNweUF0b1cocHdzektMSUQsYnVmKTsKKwlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmICk7CisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUdldEtleWJvYXJkTGF5b3V0TmFtZTE2ICAgKFVTRVIuNDc3KQorICovCitJTlQxNiBXSU5BUEkgR2V0S2V5Ym9hcmRMYXlvdXROYW1lMTYoTFBTVFIgcHdzektMSUQpCit7CisJRklYTUUoa2V5Ym9hcmQsImFsd2F5cyByZXR1cm5zIHByaW1hcnkgVS5TLiBFbmdsaXNoIGxheW91dFxuIik7CisJc3RyY3B5KHB3c3pLTElELCIwMDAwMDQwOSIpOworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJR2V0S2V5TmFtZVRleHQzMkEgICAoVVNFUjMyLjI0NykKICAqLwogSU5UMzIgV0lOQVBJIEdldEtleU5hbWVUZXh0MzJBKExPTkcgbFBhcmFtLCBMUFNUUiBscEJ1ZmZlciwgSU5UMzIgblNpemUpCkBAIC0xMzA0LDkgKzEzMzQsNyBAQAogICogICAgICAgICAgIFJlZ2lzdGVySG90S2V5CQkJKFVTRVIzMi40MzMpCiAgKi8KIEJPT0wzMiBXSU5BUEkgUmVnaXN0ZXJIb3RLZXkoSFdORDMyIGh3bmQsSU5UMzIgaWQsVUlOVDMyIG1vZGlmaWVycyxVSU5UMzIgdmspIHsKLQlGSVhNRShrZXlib2FyZCwiKCUwOHgsJWQsJTA4eCwlZCk6IHN0dWJcbiIsCi0JCWh3bmQsaWQsbW9kaWZpZXJzLHZrCi0JKTsKKwlGSVhNRShrZXlib2FyZCwiKDB4JTA4eCwlZCwweCUwOHgsJWQpOiBzdHViXG4iLGh3bmQsaWQsbW9kaWZpZXJzLHZrKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtMTMxNCw2ICsxMzQyLDE0MCBAQAogICogICAgICAgICAgIFVucmVnaXN0ZXJIb3RLZXkJCQkoVVNFUjMyLjU2NSkKICAqLwogQk9PTDMyIFdJTkFQSSBVbnJlZ2lzdGVySG90S2V5KEhXTkQzMiBod25kLElOVDMyIGlkKSB7Ci0JRklYTUUoa2V5Ym9hcmQsIiglMDh4LCVkKTogc3R1YlxuIixod25kLGlkKTsKKwlGSVhNRShrZXlib2FyZCwiKDB4JTA4eCwlZCk6IHN0dWJcbiIsaHduZCxpZCk7CiAJcmV0dXJuIFRSVUU7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEtleWJvYXJkSW5xdWlyZQkJCShLRVlCT0FSRC4xKQorICovCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgX0tCSU5GTworeworICAgIEJZVEUgQmVnaW5fRmlyc3RfUmFuZ2U7CisgICAgQllURSBFbmRfRmlyc3RfUmFuZ2U7CisgICAgQllURSBCZWdpbl9TZWNvbmRfUmFuZ2U7CisgICAgQllURSBFbmRfU2Vjb25kX1JhbmdlOworICAgIFdPUkQgU3RhdGVTaXplOworfSBLQklORk87CisjcHJhZ21hIHBhY2soNCkKKworV09SRCBXSU5BUEkgS2V5Ym9hcmRJbnF1aXJlKEtCSU5GTyAqa2JJbmZvKSAKK3sKKyAgICBrYkluZm8tPkJlZ2luX0ZpcnN0X1JhbmdlID0gMDsKKyAgICBrYkluZm8tPkVuZF9GaXJzdF9SYW5nZSA9IDA7CisgICAga2JJbmZvLT5CZWdpbl9TZWNvbmRfUmFuZ2UgPSAwOworICAgIGtiSW5mby0+RW5kX1NlY29uZF9SYW5nZSA9IDA7CisgICAga2JJbmZvLT5TdGF0ZVNpemUgPSAxNjsgCisKKyAgICByZXR1cm4gc2l6ZW9mKEtCSU5GTyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEtleWJvYXJkRW5hYmxlCQkJKEtFWUJPQVJELjIpCisgKi8KK1ZPSUQgV0lOQVBJIEtleWJvYXJkRW5hYmxlKEZBUlBST0MxNiBldmVudFByb2MsIExQQllURSBscEtleVN0YXRlKQoreworICAgIEZJWE1FKGtleWJvYXJkLCAiKCUwOGx4LCUwOGx4KTogc3R1YlxuIiwgCisgICAgICAgICAgICAgICAgICAgIChEV09SRClldmVudFByb2MsIChEV09SRClscEtleVN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgS2V5Ym9hcmREaXNhYmxlCQkJKEtFWUJPQVJELjMpCisgKi8KK1ZPSUQgV0lOQVBJIEtleWJvYXJkRGlzYWJsZShWT0lEKQoreworICAgIEZJWE1FKGtleWJvYXJkLCAiKCk6IHN0dWJcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNb3VzZUlucXVpcmUJCQkoTU9VU0UuMSkKKyAqLworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IF9NT1VTRUlORk8KK3sKKyAgICBCWVRFIG1zRXhpc3Q7CisgICAgQllURSBtc1JlbGF0aXZlOworICAgIFdPUkQgbXNOdW1CdXR0b25zOworICAgIFdPUkQgbXNSYXRlOworICAgIFdPUkQgbXNYVGhyZXNob2xkOworICAgIFdPUkQgbXNZVGhyZXNob2xkOworICAgIFdPUkQgbXNYUmVzOworICAgIFdPUkQgbXNZUmVzOworICAgIFdPUkQgbXNNb3VzZUNvbW1Qb3J0OworfSBNT1VTRUlORk87CisjcHJhZ21hIHBhY2soNCkKKworV09SRCBXSU5BUEkgTW91c2VJbnF1aXJlKE1PVVNFSU5GTyAqbW91c2VJbmZvKSAKK3sKKyAgICBtb3VzZUluZm8tPm1zRXhpc3QgPSBUUlVFOworICAgIG1vdXNlSW5mby0+bXNSZWxhdGl2ZSA9IEZBTFNFOworICAgIG1vdXNlSW5mby0+bXNOdW1CdXR0b25zID0gMjsKKyAgICBtb3VzZUluZm8tPm1zUmF0ZSA9IDM0OyAgLyogdGhlIERESyBzYXlzIHNvIC4uLiAqLworICAgIG1vdXNlSW5mby0+bXNNb3VzZUNvbW1Qb3J0ID0gMDsKKworICAgIHJldHVybiBzaXplb2YoTU9VU0VJTkZPKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTW91c2VFbmFibGUJCQkoTU9VU0UuMikKKyAqLworVk9JRCBXSU5BUEkgTW91c2VFbmFibGUoRkFSUFJPQzE2IGV2ZW50UHJvYykKK3sKKyAgICBGSVhNRShrZXlib2FyZCwgIiglMDhseCk6IHN0dWJcbiIsIChEV09SRClldmVudFByb2MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNb3VzZURpc2FibGUJCQkoTU9VU0UuMykKKyAqLworVk9JRCBXSU5BUEkgTW91c2VEaXNhYmxlKFZPSUQpCit7CisgICAgRklYTUUoa2V5Ym9hcmQsICIoKTogc3R1YlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERpc3BsYXlJbnF1aXJlCQkJKERJU1BMQVkuMTAxKQorICovCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgX0NVUlNPUklORk8KK3sKKyAgICBXT1JEIHdYTWlja2V5czsKKyAgICBXT1JEIHdZTWlja2V5czsKK30gQ1VSU09SSU5GTzsKKyNwcmFnbWEgcGFjayg0KQorCitXT1JEIFdJTkFQSSBEaXNwbGF5SW5xdWlyZShDVVJTT1JJTkZPICpjdXJzb3JJbmZvKSAKK3sKKyAgICBjdXJzb3JJbmZvLT53WE1pY2tleXMgPSAxOworICAgIGN1cnNvckluZm8tPndZTWlja2V5cyA9IDE7CisKKyAgICByZXR1cm4gc2l6ZW9mKENVUlNPUklORk8pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEaXNwbGF5U2V0Q3Vyc29yCQkJKERJU1BMQVkuMTAyKQorICovCitWT0lEIFdJTkFQSSBEaXNwbGF5U2V0Q3Vyc29yKCBMUFZPSUQgY3Vyc29yU2hhcGUgKQoreworICAgIEZJWE1FKGtleWJvYXJkLCAiKCVwKTogc3R1YlxuIiwgY3Vyc29yU2hhcGUgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRGlzcGxheU1vdmVDdXJzb3IJCQkoRElTUExBWS4xMDMpCisgKi8KK1ZPSUQgV0lOQVBJIERpc3BsYXlNb3ZlQ3Vyc29yKCBXT1JEIHdBYnNYLCBXT1JEIHdBYnNZICkKK3sKKyAgICBGSVhNRShrZXlib2FyZCwgIiglZCwlZCk6IHN0dWJcbiIsIHdBYnNYLCB3QWJzWSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBVc2VyUmVwYWludERpc2FibGUJCQkoRElTUExBWS4xMDMpCisgKi8KK1ZPSUQgV0lOQVBJIFVzZXJSZXBhaW50RGlzYWJsZSggQk9PTDE2IGRpc2FibGUgKQoreworICAgIEZJWE1FKGtleWJvYXJkLCAiKCVkKTogc3R1YlxuIiwgZGlzYWJsZSk7Cit9CisKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggZWE2Yzg0OC4uOTIxODlkYSAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTE4OTksMjEgKzE4OTksNDEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2VuZE5vdGlmeU1lc3NhZ2VBICAgIChVU0VSMzIuNDYwKQorICogRklYTUUKKyAqICBUaGUgbWVzc2FnZSBzZW5kZWQgd2l0aCBQb3N0TWVzc2FnZSBoYXMgdG8gYmUgcHV0IGluIHRoZSBxdWV1ZQorICogIHdpdGggYSBoaWdoZXIgcHJpb3JpdHkgYXMgdGhlIG90aGVyICJQb3N0ZWQiIG1lc3NhZ2VzLgorICogIFFVRVVFX0FkZE1zZyBoYXMgdG8gYmUgbW9kaWZ5ZWQuCiAgKi8KIExPTkcgV0lOQVBJIFNlbmROb3RpZnlNZXNzYWdlMzJBKEhXTkQzMiBod25kLFVJTlQzMiBtc2csV1BBUkFNMzIgd1BhcmFtLExQQVJBTSBsUGFyYW0pCi17Ci0JRklYTUUobXNnLCIoJTA0eCwlMDhseCwlMDhseCwlMDhseCk6IHN0dWIhXG4iLAotCSAgICAgIGh3bmQsKGxvbmcpbXNnLChsb25nKXdQYXJhbSxsUGFyYW0KLQkpOwotCXJldHVybiAwOworewlCT09MMzIgcmV0ID0gVFJVRTsKKwlGSVhNRShtc2csIiglMDR4LCUwOHgsJTA4eCwlMDhseCkgbm90IGNvbXBsZXRlXG4iLAorCSAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworCSAgICAgIAorCWlmICggR2V0Q3VycmVudFRocmVhZElkKCkgPT0gR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkICggaHduZCwgTlVMTCkpCisJewlyZXQ9U2VuZE1lc3NhZ2UzMkEgKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisJfQorCWVsc2UKKwl7CVBvc3RNZXNzYWdlMzJBICggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworCX0KKwlyZXR1cm4gcmV0OwogfQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZW5kTWVzc2FnZUNhbGxCYWNrMzJBCisgKiBGSVhNRTogSXQncyBsaWtlIFBvc3RNZXNzYWdlLiBUaGUgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZQorICogaXMgcHJvY2Vzc2VkLiBXZSBoYXZlIHRvIG1vZGlmeSB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nIGZvciBhIGV4YWN0CisgKiBpbXBsZW1lbnRhdGlvbi4uLgorICovCiBCT09MMzIgV0lOQVBJIFNlbmRNZXNzYWdlQ2FsbEJhY2szMkEoCiAJSFdORDMyIGhXbmQsVUlOVDMyIE1zZyxXUEFSQU0zMiB3UGFyYW0sTFBBUkFNIGxQYXJhbSwKLQkvKlNFTkRBU1lOQ1BST0MqL0ZBUlBST0MzMiBscFJlc3VsdENhbGxCYWNrLERXT1JEIGR3RGF0YQotKSB7CisJRkFSUFJPQzMyIGxwUmVzdWx0Q2FsbEJhY2ssRFdPUkQgZHdEYXRhKQorewkKIAlGSVhNRShtc2csIigweCUwNHgsMHglMDR4LDB4JTA4eCwweCUwOGx4LCVwLDB4JTA4bHgpLHN0dWIhXG4iLAotCQloV25kLE1zZyx3UGFyYW0sbFBhcmFtLGxwUmVzdWx0Q2FsbEJhY2ssZHdEYXRhCi0JKTsKLQlyZXR1cm4gRkFMU0U7CisJCWhXbmQsTXNnLHdQYXJhbSxsUGFyYW0sbHBSZXN1bHRDYWxsQmFjayxkd0RhdGEpOworCWlmICggaFduZCA9PSBIV05EX0JST0FEQ0FTVCkKKwl7CVBvc3RNZXNzYWdlMzJBKCBoV25kLCBNc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJRklYTUUobXNnLCJCcm9hZGNhc3Q6IENhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZCFcbiIpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJKGxwUmVzdWx0Q2FsbEJhY2spKCBoV25kLCBNc2csIGR3RGF0YSwgU2VuZE1lc3NhZ2UzMkEgKCBoV25kLCBNc2csIHdQYXJhbSwgbFBhcmFtICkpOworCQlyZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvbXNnYm94LmMgYi93aW5kb3dzL21zZ2JveC5jCmluZGV4IDgzMTg2NWYuLjBiNzQ5MDUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbXNnYm94LmMKKysrIGIvd2luZG93cy9tc2dib3guYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnc3RyLmgiCisjaW5jbHVkZSAidHdlYWsuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTVNHQk9YX0RsZ1Byb2MKQEAgLTIyLDYgKzIzLDcgQEAKIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLIE1TR0JPWF9EbGdQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKKyAgc3RhdGljIEhGT05UMzIgaEZvbnQgPSAwOwogICBMUE1TR0JPWFBBUkFNUzMyQSBscG1iOwogCiAgIFJFQ1QzMiByZWN0LCB0ZXh0cmVjdDsKQEAgLTM0LDYgKzM2LDE4IEBACiAgIHN3aXRjaChtZXNzYWdlKSB7CiAgICBjYXNlIFdNX0lOSVRESUFMT0c6CiAgICAgbHBtYiA9IChMUE1TR0JPWFBBUkFNUzMyQSlsUGFyYW07CisgICAgaWYgKFRXRUFLX1dpbmVMb29rID49IFdJTjk1X0xPT0spIHsKKwlOT05DTElFTlRNRVRSSUNTMzJBIG5jbG07CisJSU5UMzIgaTsKKwluY2xtLmNiU2l6ZSA9IHNpemVvZihOT05DTElFTlRNRVRSSUNTMzJBKTsKKwlTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQSAoU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MsIDAsICZuY2xtLCAwKTsKKwloRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDMyQSAoJm5jbG0ubGZNZXNzYWdlRm9udCk7CisgICAgICAgIC8qIHNldCBidXR0b24gZm9udCAqLworCWZvciAoaT0xOyBpIDwgODsgaSsrKQorCSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UzMkEgKGh3bmQsIGksIFdNX1NFVEZPTlQsIChXUEFSQU0zMiloRm9udCwgMCk7CisgICAgICAgIC8qIHNldCB0ZXh0IGZvbnQgKi8KKwlTZW5kRGxnSXRlbU1lc3NhZ2UzMkEgKGh3bmQsIDEwMCwgV01fU0VURk9OVCwgKFdQQVJBTTMyKWhGb250LCAwKTsKKyAgICB9CiAgICAgaWYgKGxwbWItPmxwc3pDYXB0aW9uKSBTZXRXaW5kb3dUZXh0MzJBKGh3bmQsIGxwbWItPmxwc3pDYXB0aW9uKTsKICAgICBTZXRXaW5kb3dUZXh0MzJBKEdldERsZ0l0ZW0zMihod25kLCAxMDApLCBscG1iLT5scHN6VGV4dCk7CiAgICAgLyogSGlkZSBub3Qgc2VsZWN0ZWQgYnV0dG9ucyAqLwpAQCAtMTY2LDkgKzE4MCwxMiBAQAogICAgICBjYXNlIElESUdOT1JFOgogICAgICBjYXNlIElEWUVTOgogICAgICBjYXNlIElETk86CisgICAgICBpZiAoKFRXRUFLX1dpbmVMb29rID4gV0lOMzFfTE9PSykgJiYgaEZvbnQpCisgICAgICAgIERlbGV0ZU9iamVjdDMyIChoRm9udCk7CiAgICAgICBFbmREaWFsb2czMihod25kLCB3UGFyYW0pOwogICAgICAgYnJlYWs7CiAgICAgfQorCiAgICBkZWZhdWx0OgogICAgICAvKiBPay4gSWdub3JlIGFsbCB0aGUgb3RoZXIgbWVzc2FnZXMgKi8KICAgICAgVFJBQ0UgKGRpYWxvZywgIk1lc3NhZ2UgbnVtYmVyICVpIGlzIGJlaW5nIGlnbm9yZWQuXG4iLCBtZXNzYWdlKTsKQEAgLTE5MCw2ICsyMDcsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTWVzc2FnZUJveDMyQSAgIChVU0VSMzIuMzkxKQorICoKKyAqIE5PVEVTCisgKiAgIFRoZSBXQVJOIGlzIGhlcmUgdG8gaGVscCBkZWJ1ZyBlcnJvbmVvdXMgTWVzc2FnZUJveGVzCisgKiAgIFVzZTogLWRlYnVnbXNnIHdhcm4rZGlhbG9nLCtyZWxheQogICovCiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveDMyQShIV05EMzIgaFduZCwgTFBDU1RSIHRleHQsIExQQ1NUUiB0aXRsZSwgVUlOVDMyIHR5cGUpCiB7CmRpZmYgLS1naXQgYS93aW5kb3dzL211bHRpbW9uLmMgYi93aW5kb3dzL211bHRpbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhOWZmYQotLS0gL2Rldi9udWxsCisrKyBiL3dpbmRvd3MvbXVsdGltb24uYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIE11bHRpbW9uaXRvciBBUElzCisgKgorICogQ29weXJpZ2h0IDE5OTggVHVyY2hhbm92IFNlcmdleQorICovCisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAibXVsdGltb24uaCIKKworCisjZGVmaW5lIHhQUklNQVJZX01PTklUT1IgKChITU9OSVRPUikweDEyMzQwMDQyKQorCitITU9OSVRPUiBXSU5BUEkgTW9uaXRvckZyb21Qb2ludChQT0lOVDMyIHB0U2NyZWVuQ29vcmRzLCBEV09SRCBkd0ZsYWdzKQoreworICAgIGlmICgoZHdGbGFncyAmIChNT05JVE9SX0RFRkFVTFRUT1BSSU1BUlkgfCBNT05JVE9SX0RFRkFVTFRUT05FQVJFU1QpKSB8fAorICAgICAgICAoKHB0U2NyZWVuQ29vcmRzLnggPj0gMCkgJiYKKyAgICAgICAgKHB0U2NyZWVuQ29vcmRzLnggPCBHZXRTeXN0ZW1NZXRyaWNzMzIoU01fQ1hTQ1JFRU4pKSAmJgorICAgICAgICAocHRTY3JlZW5Db29yZHMueSA+PSAwKSAmJgorICAgICAgICAocHRTY3JlZW5Db29yZHMueSA8IEdldFN5c3RlbU1ldHJpY3MzMihTTV9DWVNDUkVFTikpKSkKKyAgICB7CisgICAgICAgIHJldHVybiB4UFJJTUFSWV9NT05JVE9SOworICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK0hNT05JVE9SIFdJTkFQSSBNb25pdG9yRnJvbVJlY3QoTFBSRUNUMzIgbHByY1NjcmVlbkNvb3JkcywgRFdPUkQgZHdGbGFncykKK3sKKyAgICBpZiAoKGR3RmxhZ3MgJiAoTU9OSVRPUl9ERUZBVUxUVE9QUklNQVJZIHwgTU9OSVRPUl9ERUZBVUxUVE9ORUFSRVNUKSkgfHwKKyAgICAgICAgKChscHJjU2NyZWVuQ29vcmRzLT5yaWdodCA+IDApICYmCisgICAgICAgIChscHJjU2NyZWVuQ29vcmRzLT5ib3R0b20gPiAwKSAmJgorICAgICAgICAobHByY1NjcmVlbkNvb3Jkcy0+bGVmdCA8IEdldFN5c3RlbU1ldHJpY3MzMihTTV9DWFNDUkVFTikpICYmCisgICAgICAgIChscHJjU2NyZWVuQ29vcmRzLT50b3AgPCBHZXRTeXN0ZW1NZXRyaWNzMzIoU01fQ1lTQ1JFRU4pKSkpCisgICAgeworICAgICAgICByZXR1cm4geFBSSU1BUllfTU9OSVRPUjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0hNT05JVE9SIFdJTkFQSSBNb25pdG9yRnJvbVdpbmRvdyhIV05EMzIgaFduZCwgRFdPUkQgZHdGbGFncykKK3sKKyAgICBXSU5ET1dQTEFDRU1FTlQzMiB3cDsKKworICAgIGlmIChkd0ZsYWdzICYgKE1PTklUT1JfREVGQVVMVFRPUFJJTUFSWSB8IE1PTklUT1JfREVGQVVMVFRPTkVBUkVTVCkpCisgICAgICAgIHJldHVybiB4UFJJTUFSWV9NT05JVE9SOworCisgICAgaWYgKElzSWNvbmljMzIoaFduZCkgPyAKKyAgICAgICAgICAgIEdldFdpbmRvd1BsYWNlbWVudDMyKGhXbmQsICZ3cCkgOiAKKyAgICAgICAgICAgIEdldFdpbmRvd1JlY3QzMihoV25kLCAmd3AucmNOb3JtYWxQb3NpdGlvbikpIHsKKworICAgICAgICByZXR1cm4gTW9uaXRvckZyb21SZWN0KCZ3cC5yY05vcm1hbFBvc2l0aW9uLCBkd0ZsYWdzKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworQk9PTDMyIFdJTkFQSSBHZXRNb25pdG9ySW5mbzMyQShITU9OSVRPUiBoTW9uaXRvciwgTFBNT05JVE9SSU5GTyBscE1vbml0b3JJbmZvKQoreworICAgIFJFQ1QzMiByY1dvcms7CisKKyAgICBpZiAoKGhNb25pdG9yID09IHhQUklNQVJZX01PTklUT1IpICYmCisgICAgICAgIGxwTW9uaXRvckluZm8gJiYKKyAgICAgICAgKGxwTW9uaXRvckluZm8tPmNiU2l6ZSA+PSBzaXplb2YoTU9OSVRPUklORk8pKSAmJgorICAgICAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQShTUElfR0VUV09SS0FSRUEsIDAsICZyY1dvcmssIDApKQorICAgIHsKKyAgICAgICAgbHBNb25pdG9ySW5mby0+cmNNb25pdG9yLmxlZnQgPSAwOworICAgICAgICBscE1vbml0b3JJbmZvLT5yY01vbml0b3IudG9wICA9IDA7CisgICAgICAgIGxwTW9uaXRvckluZm8tPnJjTW9uaXRvci5yaWdodCAgPSBHZXRTeXN0ZW1NZXRyaWNzMzIoU01fQ1hTQ1JFRU4pOworICAgICAgICBscE1vbml0b3JJbmZvLT5yY01vbml0b3IuYm90dG9tID0gR2V0U3lzdGVtTWV0cmljczMyKFNNX0NZU0NSRUVOKTsKKyAgICAgICAgbHBNb25pdG9ySW5mby0+cmNXb3JrID0gcmNXb3JrOworICAgICAgICBscE1vbml0b3JJbmZvLT5kd0ZsYWdzID0gTU9OSVRPUklORk9GX1BSSU1BUlk7CisJCisJaWYgKGxwTW9uaXRvckluZm8tPmNiU2l6ZSA+PSBzaXplb2YoTU9OSVRPUklORk9FWDMyQSkpCisgICAgICAgICAgICBsc3RyY3B5MzJBKCgoTU9OSVRPUklORk9FWDMyQSopbHBNb25pdG9ySW5mbyktPnN6RGV2aWNlLCAiRElTUExBWSIpOworCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKworQk9PTDMyIFdJTkFQSSBHZXRNb25pdG9ySW5mbzMyVyhITU9OSVRPUiBoTW9uaXRvciwgTFBNT05JVE9SSU5GTyBscE1vbml0b3JJbmZvKQoreworICAgIFJFQ1QzMiByY1dvcms7CisKKyAgICBpZiAoKGhNb25pdG9yID09IHhQUklNQVJZX01PTklUT1IpICYmCisgICAgICAgIGxwTW9uaXRvckluZm8gJiYKKyAgICAgICAgKGxwTW9uaXRvckluZm8tPmNiU2l6ZSA+PSBzaXplb2YoTU9OSVRPUklORk8pKSAmJgorICAgICAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyVyhTUElfR0VUV09SS0FSRUEsIDAsICZyY1dvcmssIDApKQorICAgIHsKKyAgICAgICAgbHBNb25pdG9ySW5mby0+cmNNb25pdG9yLmxlZnQgPSAwOworICAgICAgICBscE1vbml0b3JJbmZvLT5yY01vbml0b3IudG9wICA9IDA7CisgICAgICAgIGxwTW9uaXRvckluZm8tPnJjTW9uaXRvci5yaWdodCAgPSBHZXRTeXN0ZW1NZXRyaWNzMzIoU01fQ1hTQ1JFRU4pOworICAgICAgICBscE1vbml0b3JJbmZvLT5yY01vbml0b3IuYm90dG9tID0gR2V0U3lzdGVtTWV0cmljczMyKFNNX0NZU0NSRUVOKTsKKyAgICAgICAgbHBNb25pdG9ySW5mby0+cmNXb3JrID0gcmNXb3JrOworICAgICAgICBscE1vbml0b3JJbmZvLT5kd0ZsYWdzID0gTU9OSVRPUklORk9GX1BSSU1BUlk7CisKKyAgICAgICAgaWYgKGxwTW9uaXRvckluZm8tPmNiU2l6ZSA+PSBzaXplb2YoTU9OSVRPUklORk9FWDMyVykpCisgICAgICAgICAgICBsc3RyY3B5MzJXKCgoTU9OSVRPUklORk9FWDMyVyopbHBNb25pdG9ySW5mbyktPnN6RGV2aWNlLCAiRFwwSVwwU1wwUFwwTFwwQVwwWVwwXDAiKTsKKworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK0JPT0wzMiBXSU5BUEkgRW51bURpc3BsYXlNb25pdG9ycygKKyAgICAgICAgSERDMzIgICAgICAgICAgICAgaGRjT3B0aW9uYWxGb3JQYWludGluZywKKyAgICAgICAgTFBSRUNUMzIgICAgICAgICBscHJjRW51bU1vbml0b3JzVGhhdEludGVyc2VjdCwKKyAgICAgICAgTU9OSVRPUkVOVU1QUk9DIGxwZm5FbnVtUHJvYywKKyAgICAgICAgTFBBUkFNICAgICAgICAgIGR3RGF0YSkKK3sKKyAgICBSRUNUMzIgcmNMaW1pdDsKKworICAgIGlmICghbHBmbkVudW1Qcm9jKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByY0xpbWl0LmxlZnQgICA9IDA7CisgICAgcmNMaW1pdC50b3AgICAgPSAwOworICAgIHJjTGltaXQucmlnaHQgID0gR2V0U3lzdGVtTWV0cmljczMyKFNNX0NYU0NSRUVOKTsKKyAgICByY0xpbWl0LmJvdHRvbSA9IEdldFN5c3RlbU1ldHJpY3MzMihTTV9DWVNDUkVFTik7CisKKyAgICBpZiAoaGRjT3B0aW9uYWxGb3JQYWludGluZykKKyAgICB7CisgICAgICAgIFJFQ1QzMiAgICByY0NsaXA7CisgICAgICAgIFBPSU5UMzIgICBwdE9yZzsKKworICAgICAgICBzd2l0Y2ggKEdldENsaXBCb3gzMihoZGNPcHRpb25hbEZvclBhaW50aW5nLCAmcmNDbGlwKSkKKyAgICAgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKCFHZXREQ09yZ0V4KGhkY09wdGlvbmFsRm9yUGFpbnRpbmcsICZwdE9yZykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBPZmZzZXRSZWN0MzIoJnJjTGltaXQsIC1wdE9yZy54LCAtcHRPcmcueSk7CisgICAgICAgICAgICBpZiAoSW50ZXJzZWN0UmVjdDMyKCZyY0xpbWl0LCAmcmNMaW1pdCwgJnJjQ2xpcCkgJiYKKyAgICAgICAgICAgICAgICAoIWxwcmNFbnVtTW9uaXRvcnNUaGF0SW50ZXJzZWN0IHx8CisgICAgICAgICAgICAgICAgICAgICBJbnRlcnNlY3RSZWN0MzIoJnJjTGltaXQsICZyY0xpbWl0LCBscHJjRW51bU1vbml0b3JzVGhhdEludGVyc2VjdCkpKSB7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZmFsbCB0aHJ1CisgICAgICAgIGNhc2UgTlVMTFJFR0lPTjoKKyAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgY2FzZSBFUlJPUjoKKyAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoICAgIGxwcmNFbnVtTW9uaXRvcnNUaGF0SW50ZXJzZWN0ICYmCisgICAgICAgICAgICAgICAgIUludGVyc2VjdFJlY3QzMigmcmNMaW1pdCwgJnJjTGltaXQsIGxwcmNFbnVtTW9uaXRvcnNUaGF0SW50ZXJzZWN0KSkgeworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBscGZuRW51bVByb2MoCisgICAgICAgICAgICB4UFJJTUFSWV9NT05JVE9SLAorICAgICAgICAgICAgaGRjT3B0aW9uYWxGb3JQYWludGluZywKKyAgICAgICAgICAgICZyY0xpbWl0LAorICAgICAgICAgICAgZHdEYXRhKTsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IDgyZDc3OWEuLmI1ZGJiY2YgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtNzUsNyArNzUsNyBAQAogc3RhdGljIHZvaWQgTkNfQWRqdXN0UmVjdCggTFBSRUNUMTYgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wzMiBtZW51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXhTdHlsZSApCiB7Ci0gICAgaWYoVFdFQUtfV2luOTVMb29rKQorICAgIGlmIChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spCiAJRVJSKG5vbmNsaWVudCwgIkNhbGxlZCBpbiBXaW45NSBtb2RlLiBBaWVlISBQbGVhc2UgcmVwb3J0IHRoaXMuXG4iICk7CiAKICAgICBpZihzdHlsZSAmIFdTX0lDT05JQykgcmV0dXJuOwpAQCAtMjE3LDEzICsyMTcsMTYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEcmF3Q2FwdGlvblRlbXBBICAgIChVU0VSMzIuNTk5KQorICogRHJhd0NhcHRpb25UZW1wQSBbVVNFUjMyLjU5OV0KKyAqCiAgKi8KLURXT1JEIFdJTkFQSSBEcmF3Q2FwdGlvblRlbXAzMkEoSFdORDMyIGh3bmQsSERDMzIgaGRjLExQUkVDVDMyIHJlY3QsCi0gICAgSEZPTlQzMiBoZm9udCxEV09SRCB4MSxMUENTVFIgc3RyLERXT1JEIHgyKQorRFdPUkQgV0lOQVBJCitEcmF3Q2FwdGlvblRlbXAzMkEgKEhXTkQzMiBod25kLCBIREMzMiBoZGMsIExQUkVDVDMyIHJlY3QsCisJCSAgICBIRk9OVDMyIGhmb250LERXT1JEIHgxLExQQ1NUUiBzdHIsRFdPUkQgeDIpCiB7Ci0gICAgRklYTUUobm9uY2xpZW50LCIoJTA4eCwlMDh4LCVwLCUwOHgsJTA4bHgsXCIlc1wiLCUwOGx4KTogc3R1YlxuIiwKLSAgICAgICAgaHduZCxoZGMscmVjdCxoZm9udCx4MSxzdHIseDIpOworICAgIEZJWE1FIChub25jbGllbnQsICIoJTA4eCwlMDh4LCVwLCUwOHgsJTA4eCxcIiVzXCIsJTA4eCk6IHN0dWJcbiIsCisJICAgaHduZCwgaGRjLCByZWN0LCBoZm9udCwgeDEsIHN0ciwgeDIpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI2NSwxMiArMjY4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLCBtZW51LCBleFN0eWxlICk7CiAKLSAgICBpZihUV0VBS19XaW45NUxvb2spIHsKKyAgICBpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykKKwlOQ19BZGp1c3RSZWN0KCByZWN0LCBzdHlsZSwgbWVudSwgZXhTdHlsZSApOworICAgIGVsc2UgewogCU5DX0FkanVzdFJlY3RPdXRlcjk1KCByZWN0LCBzdHlsZSwgbWVudSwgZXhTdHlsZSApOwogCU5DX0FkanVzdFJlY3RJbm5lcjk1KCByZWN0LCBzdHlsZSwgZXhTdHlsZSApOwogICAgIH0KLSAgICBlbHNlCi0JTkNfQWRqdXN0UmVjdCggcmVjdCwgc3R5bGUsIG1lbnUsIGV4U3R5bGUgKTsKIAogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMzA2LDEwICszMDksMTAgQEAKICAgICBpZiAocFduZC0+Y2xhc3MtPnN0eWxlICYgQ1NfSFJFRFJBVykgcmVzdWx0IHw9IFdWUl9IUkVEUkFXOwogCiAgICAgaWYoICEoIHBXbmQtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSApICkgewotCWlmKFRXRUFLX1dpbjk1TG9vaykKLQkgICAgTkNfQWRqdXN0UmVjdE91dGVyOTUoICZ0bXBSZWN0LCBwV25kLT5kd1N0eWxlLCBGQUxTRSwgcFduZC0+ZHdFeFN0eWxlICk7Ci0JZWxzZQorCWlmIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKQogCSAgICBOQ19BZGp1c3RSZWN0KCAmdG1wUmVjdCwgcFduZC0+ZHdTdHlsZSwgRkFMU0UsIHBXbmQtPmR3RXhTdHlsZSApOworCWVsc2UKKwkgICAgTkNfQWRqdXN0UmVjdE91dGVyOTUoICZ0bXBSZWN0LCBwV25kLT5kd1N0eWxlLCBGQUxTRSwgcFduZC0+ZHdFeFN0eWxlICk7CiAKIAl3aW5SZWN0LT5sZWZ0ICAgLT0gdG1wUmVjdC5sZWZ0OwogCXdpblJlY3QtPnRvcCAgICAtPSB0bXBSZWN0LnRvcDsKQEAgLTMyOSw3ICszMzIsNyBAQAogCQkJCSAgICAgICAtdG1wUmVjdC5sZWZ0LCAtdG1wUmVjdC50b3AgKSArIDE7CiAJfQogCi0JaWYgKFRXRUFLX1dpbjk1TG9vaykgeworCWlmIChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spIHsKIAkgICAgU2V0UmVjdDE2ICgmdG1wUmVjdCwgMCwgMCwgMCwgMCk7CiAJICAgIE5DX0FkanVzdFJlY3RJbm5lcjk1ICgmdG1wUmVjdCwgcFduZC0+ZHdTdHlsZSwgcFduZC0+ZHdFeFN0eWxlKTsKIAkgICAgd2luUmVjdC0+bGVmdCAgIC09IHRtcFJlY3QubGVmdDsKQEAgLTM1OSw3ICszNjIsNyBAQAogCiAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19JQ09OSUMpIHx8ICh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpKSByZXR1cm47CiAKLSAgICAgIC8qIFJlbW92ZSBmcmFtZSBmcm9tIHJlY3RhbmdsZSAqLworICAgIC8qIFJlbW92ZSBmcmFtZSBmcm9tIHJlY3RhbmdsZSAqLwogICAgIGlmIChIQVNfRExHRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKICAgICB7CiAJSW5mbGF0ZVJlY3QzMiggcmVjdCwgLVNZU01FVFJJQ1NfQ1hETEdGUkFNRSwgLVNZU01FVFJJQ1NfQ1lETEdGUkFNRSk7CkBAIC0zOTcsNyArNDAwLDcgQEAKIAogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfSUNPTklDKSB8fCAod25kUHRyLT5mbGFncyAmIFdJTl9NQU5BR0VEKSkgcmV0dXJuOwogCi0gICAgICAvKiBSZW1vdmUgZnJhbWUgZnJvbSByZWN0YW5nbGUgKi8KKyAgICAvKiBSZW1vdmUgZnJhbWUgZnJvbSByZWN0YW5nbGUgKi8KICAgICBpZiAoSEFTX0ZJWEVERlJBTUUgKHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKICAgICB7CiAJSW5mbGF0ZVJlY3QzMiggcmVjdCwgLVNZU01FVFJJQ1NfQ1hGSVhFREZSQU1FLCAtU1lTTUVUUklDU19DWUZJWEVERlJBTUUpOwpAQCAtNzA4LDE3ICs3MTEsMTcgQEAKICAqIEhhbmRsZSBhIFdNX05DSElUVEVTVCBtZXNzYWdlLiBDYWxsZWQgZnJvbSBEZWZXaW5kb3dQcm9jKCkuCiAgKi8KIExPTkcKLU5DX0hhbmRsZU5DSGl0VGVzdCggSFdORDMyIGh3bmQgLCBQT0lOVDE2IHB0KQorTkNfSGFuZGxlTkNIaXRUZXN0IChIV05EMzIgaHduZCAsIFBPSU5UMTYgcHQpCiB7Ci0gICAgV05EKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIgKGh3bmQpOwogCiAgICAgaWYgKCF3bmRQdHIpCiAJcmV0dXJuIEhURVJST1I7CiAKLSAgICBpZihUV0VBS19XaW45NUxvb2spCi0JcmV0dXJuIE5DX0RvTkNIaXRUZXN0OTUgKHduZFB0ciwgcHQpOwotICAgIGVsc2UKKyAgICBpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykKICAgICAgICAgcmV0dXJuIE5DX0RvTkNIaXRUZXN0ICh3bmRQdHIsIHB0KTsKKyAgICBlbHNlCisJcmV0dXJuIE5DX0RvTkNIaXRUZXN0OTUgKHduZFB0ciwgcHQpOwogfQogCiAKQEAgLTk5MCw4ICs5OTMsOCBAQAogewogICAgIElOVDMyIHdpZHRoLCBoZWlnaHQ7CiAKLSAgICBpZihUV0VBS19XaW45NUxvb2spCi0JRVJSKG5vbmNsaWVudCwgIkNhbGxlZCBpbiBXaW45NSBtb2RlLiBBaWVlISBQbGVhc2UgcmVwb3J0IHRoaXMuXG4iICk7CisgICAgaWYgKFRXRUFLX1dpbmVMb29rICE9IFdJTjMxX0xPT0spCisJRVJSIChub25jbGllbnQsICJDYWxsZWQgaW4gV2luOTUgbW9kZS4gQWllZSEgUGxlYXNlIHJlcG9ydCB0aGlzLlxuIiApOwogCiAgICAgaWYgKGRsZ0ZyYW1lKQogICAgIHsKQEAgLTE1NDUsMTAgKzE1NDgsMTAgQEAKICAgICB7CiAJaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICkKIAkgICAgV0lOUE9TX1JlZHJhd0ljb25UaXRsZSggaHduZCApOwotCWVsc2UgaWYoVFdFQUtfV2luOTVMb29rKQotCSAgICBOQ19Eb05DUGFpbnQ5NSggd25kUHRyLCBjbGlwLCBGQUxTRSApOwotCWVsc2UKKwllbHNlIGlmIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKQogCSAgICBOQ19Eb05DUGFpbnQoIHduZFB0ciwgY2xpcCwgRkFMU0UgKTsKKwllbHNlCisJICAgIE5DX0RvTkNQYWludDk1KCB3bmRQdHIsIGNsaXAsIEZBTFNFICk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTU3MywxMCArMTU3NiwxMCBAQAogCiAJaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICkgCiAJICAgIFdJTlBPU19SZWRyYXdJY29uVGl0bGUoIHduZFB0ci0+aHduZFNlbGYgKTsKLQllbHNlIGlmKCBUV0VBS19XaW45NUxvb2sgKQotCSAgICBOQ19Eb05DUGFpbnQ5NSggd25kUHRyLCAoSFJHTjMyKTEsIEZBTFNFICk7Ci0JZWxzZQorCWVsc2UgaWYgKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spCiAJICAgIE5DX0RvTkNQYWludCggd25kUHRyLCAoSFJHTjMyKTEsIEZBTFNFICk7CisJZWxzZQorCSAgICBOQ19Eb05DUGFpbnQ5NSggd25kUHRyLCAoSFJHTjMyKTEsIEZBTFNFICk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMTY0NiwyMSArMTY0OSwyMSBAQAogCSAgR2V0V2luZG93UmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCByZWN0ICk7CiAgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgICAgaWYoVFdFQUtfV2luOTVMb29rKQotICAgICAgICAgICAgICBOQ19HZXRJbnNpZGVSZWN0OTUoIHduZFB0ci0+aHduZFNlbGYsIHJlY3QgKTsKLSAgICAgICAgICBlbHNlCisgICAgICAgICAgaWYgKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spCiAgICAgICAgICAgICAgIE5DX0dldEluc2lkZVJlY3QoIHduZFB0ci0+aHduZFNlbGYsIHJlY3QgKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIE5DX0dldEluc2lkZVJlY3Q5NSggd25kUHRyLT5od25kU2VsZiwgcmVjdCApOwogICAJICBPZmZzZXRSZWN0MzIoIHJlY3QsIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0LCB3bmRQdHItPnJlY3RXaW5kb3cudG9wKTsKICAgCSAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQogICAgICAJICAgICAgQ2xpZW50VG9TY3JlZW4zMiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAoUE9JTlQzMiAqKXJlY3QgKTsKLSAgICAgICAgICBpZihUV0VBS19XaW45NUxvb2spIHsKLSAgICAgICAgICAgIHJlY3QtPnJpZ2h0ID0gcmVjdC0+bGVmdCArIHN5c01ldHJpY3NbU01fQ1lDQVBUSU9OXSAtIDE7Ci0gICAgICAgICAgICByZWN0LT5ib3R0b20gPSByZWN0LT50b3AgKyBzeXNNZXRyaWNzW1NNX0NZQ0FQVElPTl0gLSAxOwotCSAgfQotCSAgZWxzZSB7CisgICAgICAgICAgaWYgKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spIHsKICAgICAgICAgICAgIHJlY3QtPnJpZ2h0ID0gcmVjdC0+bGVmdCArIFNZU01FVFJJQ1NfQ1hTSVpFOwogICAgICAgICAgICAgcmVjdC0+Ym90dG9tID0gcmVjdC0+dG9wICsgU1lTTUVUUklDU19DWVNJWkU7CiAJICB9CisJICBlbHNlIHsKKyAgICAgICAgICAgIHJlY3QtPnJpZ2h0ID0gcmVjdC0+bGVmdCArIHN5c01ldHJpY3NbU01fQ1lDQVBUSU9OXSAtIDE7CisgICAgICAgICAgICByZWN0LT5ib3R0b20gPSByZWN0LT50b3AgKyBzeXNNZXRyaWNzW1NNX0NZQ0FQVElPTl0gLSAxOworCSAgfQogICAgICAgfQogICAgICAgcmV0dXJuIFRSVUU7CiAgIH0KQEAgLTE2ODQsMTAgKzE2ODcsMTAgQEAKICAgICB7CiAJICAvKiBNb3ZlIHBvaW50ZXIgYXQgdGhlIGNlbnRlciBvZiB0aGUgY2FwdGlvbiAqLwogCVJFQ1QzMiByZWN0OwotICAgICAgICBpZihUV0VBS19XaW45NUxvb2spCi0gICAgICAgICAgICBOQ19HZXRJbnNpZGVSZWN0OTUoIHduZFB0ci0+aHduZFNlbGYsICZyZWN0ICk7Ci0gICAgICAgIGVsc2UKKyAgICAgICAgaWYgKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spCiAgICAgICAgICAgICBOQ19HZXRJbnNpZGVSZWN0KCB3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOQ19HZXRJbnNpZGVSZWN0OTUoIHduZFB0ci0+aHduZFNlbGYsICZyZWN0ICk7CiAJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpCiAJICAgIHJlY3QubGVmdCArPSBTWVNNRVRSSUNTX0NYU0laRSArIDE7CiAJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFQk9YKQpAQCAtMTc2MSw3ICsxNzY0LDcgQEAKICAqCiAgKiBQZXJmb3JtIFNDX01PVkUgYW5kIFNDX1NJWkUgY29tbWFuZHMuCiAgKi8KLXN0YXRpYyB2b2lkIE5DX0RvU2l6ZU1vdmUoIEhXTkQzMiBod25kLCBXT1JEIHdQYXJhbSwgUE9JTlQxNiBwdCApCitzdGF0aWMgdm9pZCBOQ19Eb1NpemVNb3ZlKCBIV05EMzIgaHduZCwgV09SRCB3UGFyYW0gKQogewogICAgIE1TRzE2IG1zZzsKICAgICBSRUNUMzIgc2l6aW5nUmVjdCwgbW91c2VSZWN0OwpAQCAtMTc2OSwxMiArMTc3MiwxNSBAQAogICAgIExPTkcgaGl0dGVzdCA9IChMT05HKSh3UGFyYW0gJiAweDBmKTsKICAgICBIQ1VSU09SMTYgaERyYWdDdXJzb3IgPSAwLCBoT2xkQ3Vyc29yID0gMDsKICAgICBQT0lOVDMyIG1pblRyYWNrLCBtYXhUcmFjazsKLSAgICBQT0lOVDE2IGNhcHR1cmVQb2ludCA9IHB0OworICAgIFBPSU5UMTYgY2FwdHVyZVBvaW50LCBwdDsKICAgICBXTkQgKiAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBCT09MMzIgICAgdGhpY2tmcmFtZSA9IEhBU19USElDS0ZSQU1FKCB3bmRQdHItPmR3U3R5bGUgKTsKICAgICBCT09MMzIgICAgaWNvbmljID0gd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkU7CiAgICAgQk9PTDMyICAgIG1vdmVkID0gRkFMU0U7CiAKKyAgICBHZXRDdXJzb3JQb3MxNiAoJnB0KTsKKyAgICBjYXB0dXJlUG9pbnQgPSBwdDsKKwogICAgIGlmIChJc1pvb21lZDMyKGh3bmQpIHx8ICFJc1dpbmRvd1Zpc2libGUzMihod25kKSB8fAogICAgICAgICAod25kUHRyLT5mbGFncyAmIFdJTl9NQU5BR0VEKSkgcmV0dXJuOwogCkBAIC0xOTk5LDkgKzIwMDUsMTEgQEAKIAogICAgIFNldENhcHR1cmUzMiggaHduZCApOwogICAgIGlmICh3UGFyYW0gPT0gSFRNSU5CVVRUT04pCi0JcGFpbnRCdXR0b24gPSAoVFdFQUtfV2luOTVMb29rKSA/ICZOQ19EcmF3TWluQnV0dG9uOTUgOiAmTkNfRHJhd01pbkJ1dHRvbjsKKwlwYWludEJ1dHRvbiA9CisJICAgIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKSA/ICZOQ19EcmF3TWluQnV0dG9uIDogJk5DX0RyYXdNaW5CdXR0b245NTsKICAgICBlbHNlCi0JcGFpbnRCdXR0b24gPSAoVFdFQUtfV2luOTVMb29rKSA/ICZOQ19EcmF3TWF4QnV0dG9uOTUgOiAmTkNfRHJhd01heEJ1dHRvbjsKKwlwYWludEJ1dHRvbiA9CisJICAgIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKSA/ICZOQ19EcmF3TWF4QnV0dG9uIDogJk5DX0RyYXdNYXhCdXR0b245NTsKIAogICAgICgqcGFpbnRCdXR0b24pKCBod25kLCBoZGMsIFRSVUUgKTsKIApAQCAtMjE0NSwxMCArMjE1MywxMCBAQAogCSAgICAgaWYoICEocFduZC0+ZHdTdHlsZSAmIFdTX01JTklNSVpFKSApCiAJICAgICB7CiAJCUhEQzMyIGhEQyA9IEdldFdpbmRvd0RDMzIoaHduZCk7Ci0JCWlmKCBUV0VBS19XaW45NUxvb2spCi0JCSAgICBOQ19EcmF3U3lzQnV0dG9uOTUoIGh3bmQsIGhEQywgVFJVRSApOwotCQllbHNlCisJCWlmIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKQogCQkgICAgTkNfRHJhd1N5c0J1dHRvbiggaHduZCwgaERDLCBUUlVFICk7CisJCWVsc2UKKwkJICAgIE5DX0RyYXdTeXNCdXR0b245NSggaHduZCwgaERDLCBUUlVFICk7CiAJCVJlbGVhc2VEQzMyKCBod25kLCBoREMgKTsKIAkgICAgIH0KIAkgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX01PVVNFTUVOVSArIEhUU1lTTUVOVSwgbFBhcmFtICk7CkBAIC0yMTczLDcgKzIxODEsNyBAQAogCWJyZWFrOwogCiAgICAgY2FzZSBIVENMT1NFOgotCWlmIChUV0VBS19XaW45NUxvb2spCisJaWYgKFRXRUFLX1dpbmVMb29rID49IFdJTjk1X0xPT0spCiAJICAgIE5DX1RyYWNrQ2xvc2VCdXR0b245NSAoaHduZCwgd1BhcmFtKTsKIAlicmVhazsKIApAQCAtMjI2Myw3ICsyMjcxLDcgQEAKICAgICB7CiAgICAgY2FzZSBTQ19TSVpFOgogICAgIGNhc2UgU0NfTU9WRToKLQlOQ19Eb1NpemVNb3ZlKCBod25kLCB3UGFyYW0sIHB0ICk7CisJTkNfRG9TaXplTW92ZSggaHduZCwgd1BhcmFtICk7CiAJYnJlYWs7CiAKICAgICBjYXNlIFNDX01JTklNSVpFOgpAQCAtMjMwOSw3ICsyMzE3LDcgQEAKICAgICBjYXNlIFNDX0FSUkFOR0U6CiAgICAgY2FzZSBTQ19ORVhUV0lORE9XOgogICAgIGNhc2UgU0NfUFJFVldJTkRPVzoKLSAJLyogRklYTUU6IHVuaW1wbGVtZW50ZWQgKi8KKyAJRklYTUUgKG5vbmNsaWVudCwgInVuaW1wbGVtZW50ZWQhXG4iKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9zeXNjb2xvci5jIGIvd2luZG93cy9zeXNjb2xvci5jCmluZGV4IGMzYzEwYjMuLmQ4ZGIxOWMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc3lzY29sb3IuYworKysgYi93aW5kb3dzL3N5c2NvbG9yLmMKQEAgLTM5LDcgKzM5LDExIEBACiAgICAgIjNERGFya1NoYWRvdyIsICIzMiAzMiAzMiIsICAgICAgLyogQ09MT1JfM0RES1NIQURPVyAgICAgICAgICAqLwogICAgICIzRExpZ2h0IiwgIjE5MiAxOTIgMTkyIiwgICAgICAgIC8qIENPTE9SXzNETElHSFQgICAgICAgICAgICAgKi8KICAgICAiSW5mb1RleHQiLCAiMCAwIDAiLCAgICAgICAgICAgICAvKiBDT0xPUl9JTkZPVEVYVCAgICAgICAgICAgICovCi0gICAgIkluZm9CYWNrZ3JvdW5kIiwgIjI1NSAyNTUgMTkyIiAgLyogQ09MT1JfSU5GT0JLICAgICAgICAgICAgICAqLworICAgICJJbmZvQmFja2dyb3VuZCIsICIyNTUgMjU1IDE5MiIsIC8qIENPTE9SX0lORk9CSyAgICAgICAgICAgICAgKi8KKyAgICAiQWx0ZXJuYXRlQnV0dG9uRmFjZSIsICIxODQgMTgwIDE4NCIsICAvKiBDT0xPUl9BTFRFUk5BVEVCVE5GQUNFICovCisgICAgIkhvdFRyYWNraW5nQ29sb3IiLCAiMCAwIDI1NSIsICAgICAgICAgLyogQ09MT1JfSE9UTElHSFQgKi8KKyAgICAiR3JhZGllbnRBY3RpdmVUaXRsZSIsICIxNiAxMzIgMjA4IiwgICAvKiBDT0xPUl9HUkFESUVOVEFDVElWRUNBUFRJT04gKi8KKyAgICAiR3JhZGllbnRJbmFjdGl2ZVRpdGxlIiwgIjE4NCAxODAgMTg0IiAvKiBDT0xPUl9HUkFESUVOVElOQUNUSVZFQ0FQVElPTiAqLwogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBEZWZTeXNDb2xvcnM5NVtdID0KQEAgLTY4LDExICs3MiwxNSBAQAogICAgICIzRERhcmtTaGFkb3ciLCAiMCAwIDAiLCAgICAgICAgIC8qIENPTE9SXzNEREtTSEFET1cgICAgICAgICAgKi8KICAgICAiM0RMaWdodCIsICIyMjMgMjIzIDIyMyIsICAgICAgICAvKiBDT0xPUl8zRExJR0hUICAgICAgICAgICAgICovCiAgICAgIkluZm9UZXh0IiwgIjAgMCAwIiwgICAgICAgICAgICAgLyogQ09MT1JfSU5GT1RFWFQgICAgICAgICAgICAqLwotICAgICJJbmZvQmFja2dyb3VuZCIsICIyNTUgMjU1IDE5MiIgIC8qIENPTE9SX0lORk9CSyAgICAgICAgICAgICAgKi8KKyAgICAiSW5mb0JhY2tncm91bmQiLCAiMjU1IDI1NSAxOTIiLCAvKiBDT0xPUl9JTkZPQksgICAgICAgICAgICAgICovCisgICAgIkFsdGVybmF0ZUJ1dHRvbkZhY2UiLCAiMTg0IDE4MCAxODQiLCAgLyogQ09MT1JfQUxURVJOQVRFQlRORkFDRSAqLworICAgICJIb3RUcmFja2luZ0NvbG9yIiwgIjAgMCAyNTUiLCAgICAgICAgIC8qIENPTE9SX0hPVExJR0hUICovCisgICAgIkdyYWRpZW50QWN0aXZlVGl0bGUiLCAiMTYgMTMyIDIwOCIsICAgLyogQ09MT1JfR1JBRElFTlRBQ1RJVkVDQVBUSU9OICovCisgICAgIkdyYWRpZW50SW5hY3RpdmVUaXRsZSIsICIxODQgMTgwIDE4NCIgLyogQ09MT1JfR1JBRElFTlRJTkFDVElWRUNBUFRJT04gKi8KIH07CiAKIAotI2RlZmluZSBOVU1fU1lTX0NPTE9SUyAgICAgKENPTE9SX0lORk9CSysxKQorI2RlZmluZSBOVU1fU1lTX0NPTE9SUyAgICAgKENPTE9SX0dSQURJRU5USU5BQ1RJVkVDQVBUSU9OKzEpCiAKIHN0YXRpYyBDT0xPUlJFRiBTeXNDb2xvcnNbTlVNX1NZU19DT0xPUlNdOwogc3RhdGljIEhCUlVTSDMyIFN5c0NvbG9yQnJ1c2hlc1tOVU1fU1lTX0NPTE9SU107CkBAIC0xMDQsOCArMTEyLDggQEAKICAgICBjb25zdCBjaGFyICogY29uc3QgKnA7CiAgICAgY2hhciBidWZmZXJbMTAwXTsKIAotICAgIGZvciAoaSA9IDAsIHAgPSBUV0VBS19XaW45NUxvb2sgPyBEZWZTeXNDb2xvcnM5NSA6IERlZlN5c0NvbG9yczsKLQkgaSA8IE5VTV9TWVNfQ09MT1JTOyBpKyssIHAgKz0gMikKKyAgICBwID0gKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spID8gRGVmU3lzQ29sb3JzIDogRGVmU3lzQ29sb3JzOTU7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9TWVNfQ09MT1JTOyBpKyssIHAgKz0gMikKICAgICB7CiAJR2V0UHJvZmlsZVN0cmluZzMyQSggImNvbG9ycyIsIHBbMF0sIHBbMV0sIGJ1ZmZlciwgMTAwICk7CiAJaWYgKHNzY2FuZiggYnVmZmVyLCAiICVkICVkICVkIiwgJnIsICZnLCAmYiApICE9IDMpIHIgPSBnID0gYiA9IDA7CmRpZmYgLS1naXQgYS93aW5kb3dzL3N5c21ldHJpY3MuYyBiL3dpbmRvd3Mvc3lzbWV0cmljcy5jCmluZGV4IDQ0MTFlMGMuLjdhY2QzMDUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc3lzbWV0cmljcy5jCisrKyBiL3dpbmRvd3Mvc3lzbWV0cmljcy5jCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgc3lzTWV0cmljc1tTTV9DWFZTQ1JPTExdID0KIAlQUk9GSUxFX0dldFdpbmVJbmlJbnQoIlR3ZWFrLkxheW91dCIsICJTY3JvbGxCYXJXaWR0aCIsIDE2KSArIDE7CiAgICAgc3lzTWV0cmljc1tTTV9DWUhTQ1JPTExdID0gc3lzTWV0cmljc1tTTV9DWFZTQ1JPTExdOwotICAgIGlmIChUV0VBS19XaW45NUxvb2spCisgICAgaWYgKFRXRUFLX1dpbmVMb29rID4gV0lOMzFfTE9PSykKIAlzeXNNZXRyaWNzW1NNX0NZQ0FQVElPTl0gPQogCSAgICBQUk9GSUxFX0dldFdpbmVJbmlJbnQoIlR3ZWFrLkxheW91dCIsICJDYXB0aW9uSGVpZ2h0IiwgMTkpOwogICAgIGVsc2UKQEAgLTM3LDEzICszNywxMyBAQAogICAgIHN5c01ldHJpY3NbU01fQ1lCT1JERVJdID0gc3lzTWV0cmljc1tTTV9DWEJPUkRFUl07CiAgICAgc3lzTWV0cmljc1tTTV9DWERMR0ZSQU1FXSA9CiAJUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiRGlhbG9nRnJhbWVXaWR0aCIsCi0JCQkgICAgICBUV0VBS19XaW45NUxvb2sgPyAzIDogNCk7CisJCQkgICAgICAoVFdFQUtfV2luZUxvb2sgPiBXSU4zMV9MT09LKSA/IDMgOiA0KTsKICAgICBzeXNNZXRyaWNzW1NNX0NZRExHRlJBTUVdID0gc3lzTWV0cmljc1tTTV9DWERMR0ZSQU1FXTsKICAgICBzeXNNZXRyaWNzW1NNX0NZVlRIVU1CXSA9IHN5c01ldHJpY3NbU01fQ1hWU0NST0xMXSAtIDE7CiAgICAgc3lzTWV0cmljc1tTTV9DWEhUSFVNQl0gPSBzeXNNZXRyaWNzW1NNX0NZVlRIVU1CXTsKICAgICBzeXNNZXRyaWNzW1NNX0NYSUNPTl0gPSAzMjsKICAgICBzeXNNZXRyaWNzW1NNX0NZSUNPTl0gPSAzMjsKLSAgICBpZiAoVFdFQUtfV2luOTVMb29rKQorICAgIGlmIChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spCiAJc3lzTWV0cmljc1tTTV9DWU1FTlVdID0KIAkgICAgUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5MYXlvdXQiLCAiTWVudUhlaWdodCIsIDE5KTsKICAgICBlbHNlCkBAIC02OCw4ICs2OCw4IEBACiAgICAgc3lzTWV0cmljc1tTTV9SRVNFUlZFRDRdID0gMDsKIAogICAgIC8qIEZJWE1FOiBUaGUgZm9sbG93aW5nIHR3byBhcmUgY2FsY3VsYXRlZCwgYnV0IGhvdz8gKi8KLSAgICBzeXNNZXRyaWNzW1NNX0NYTUlOXSA9IFRXRUFLX1dpbjk1TG9vayA/IDExMiA6IDEwMDsKLSAgICBzeXNNZXRyaWNzW1NNX0NZTUlOXSA9IFRXRUFLX1dpbjk1TG9vayA/IDI3IDogMjg7CisgICAgc3lzTWV0cmljc1tTTV9DWE1JTl0gPSAoVFdFQUtfV2luZUxvb2sgPiBXSU4zMV9MT09LKSA/IDExMiA6IDEwMDsKKyAgICBzeXNNZXRyaWNzW1NNX0NZTUlOXSA9IChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spID8gMjcgOiAyODsKIAogICAgIHN5c01ldHJpY3NbU01fQ1hTSVpFXSA9IHN5c01ldHJpY3NbU01fQ1lDQVBUSU9OXSAtIDI7CiAgICAgc3lzTWV0cmljc1tTTV9DWVNJWkVdID0gc3lzTWV0cmljc1tTTV9DWFNJWkVdOwpAQCAtMTM5LDYgKzEzOSwxMyBAQAogICAgIHN5c01ldHJpY3NbU01fTUlERUFTVEVOQUJMRURdID0gMDsKIAogICAgIHN5c01ldHJpY3NbU01fTU9VU0VXSEVFTFBSRVNFTlRdID0gMDsKKyAgICAKKyAgICBzeXNNZXRyaWNzW1NNX0NYVklSVFVBTFNDUkVFTl0gPSBzeXNNZXRyaWNzW1NNX0NYU0NSRUVOXTsKKyAgICBzeXNNZXRyaWNzW1NNX0NZVklSVFVBTFNDUkVFTl0gPSBzeXNNZXRyaWNzW1NNX0NZU0NSRUVOXTsKKyAgICBzeXNNZXRyaWNzW1NNX1hWSVJUVUFMU0NSRUVOXSA9IDA7CisgICAgc3lzTWV0cmljc1tTTV9ZVklSVFVBTFNDUkVFTl0gPSAwOworICAgIHN5c01ldHJpY3NbU01fQ01PTklUT1JTXSA9IDE7CisgICAgc3lzTWV0cmljc1tTTV9TQU1FRElTUExBWUZPUk1BVF0gPSAxOwogICAgIHN5c01ldHJpY3NbU01fQ01FVFJJQ1NdID0gU01fQ01FVFJJQ1M7CiB9CiAKQEAgLTE0OCw4ICsxNTUsNyBAQAogICovCiBJTlQxNiBXSU5BUEkgR2V0U3lzdGVtTWV0cmljczE2KCBJTlQxNiBpbmRleCApCiB7Ci0gICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IFNNX0NNRVRSSUNTKSkgcmV0dXJuIDA7Ci0gICAgZWxzZSByZXR1cm4gc3lzTWV0cmljc1tpbmRleF07ICAgIAorICAgIHJldHVybiAoSU5UMTYpR2V0U3lzdGVtTWV0cmljczMyKGluZGV4KTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL3VzZXIuYyBiL3dpbmRvd3MvdXNlci5jCmluZGV4IDQ2YmZkNWIuLmE1NGQzNGQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdXNlci5jCisrKyBiL3dpbmRvd3MvdXNlci5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAogICAgIC8qIEhhY2s6IHJlc3RvcmUgdGhlIGRpdmlkZS1ieS16ZXJvIGhhbmRsZXIgKi8KICAgICAvKiBGSVhNRTogc2hvdWxkIHNldCBhIFVTRVItc3BlY2lmaWMgaGFuZGxlciB0aGF0IGRpc3BsYXlzIGEgbXNnIGJveCAqLwotICAgIElOVF9TZXRIYW5kbGVyKCAwLCBJTlRfR2V0SGFuZGxlciggMHhmZiApICk7CisgICAgSU5UX1NldFBNSGFuZGxlciggMCwgSU5UX0dldFBNSGFuZGxlciggMHhmZiApICk7CiAKICAgICAgIC8qIENyZWF0ZSB0YXNrIG1lc3NhZ2UgcXVldWUgKi8KICAgICBxdWV1ZVNpemUgPSBHZXRQcm9maWxlSW50MzJBKCAid2luZG93cyIsICJEZWZhdWx0UXVldWVTaXplIiwgOCApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggNTc1NDU3Yi4uYTdkZmExMiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0xNTU0LDYgKzE1NTQsMTIgQEAKICAqCSAgICAgV0lOX1NldFdpbmRvd0xvbmcKICAqCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIFNldFdpbmRvd0xvbmcoKS4KKyAqCisgKiAwIGlzIHRoZSBmYWlsdXJlIGNvZGUuIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIGZhaWx1cmUgU2V0TGFzdEVycm9yCisgKiBtdXN0IGJlIHNldCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgMCByZXR1cm4gdmFsdWUgYW5kIGEgZmFpbHVyZS4KKyAqCisgKiBGSVhNRTogVGhlIGVycm9yIHZhbHVlcyBmb3IgU2V0TGFzdEVycm9yIG1heSBub3QgYmUgcmlnaHQuIENhbgorICogICAgICAgIHNvbWVvbmUgY2hlY2sgd2l0aCB0aGUgcmVhbCB0aGluZz8KICAqLwogc3RhdGljIExPTkcgV0lOX1NldFdpbmRvd0xvbmcoIEhXTkQzMiBod25kLCBJTlQzMiBvZmZzZXQsIExPTkcgbmV3dmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkRPV1BST0NUWVBFIHR5cGUgKQpAQCAtMTU2MywxMiArMTU2OSwyMyBAQAogICAgIFNUWUxFU1RSVUNUIHN0eWxlOwogICAgIAogICAgIFRSQUNFKHdpbiwiJXg9JXAgJXggJWx4ICV4XG4iLGh3bmQsIHduZFB0ciwgb2Zmc2V0LCBuZXd2YWwsIHR5cGUpOwotICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKKworICAgIGlmICghd25kUHRyKQorICAgIHsKKyAgICAgICAvKiBJcyB0aGlzIHRoZSByaWdodCBlcnJvcj8gKi8KKyAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfV0lORE9XX0hBTkRMRSApOworICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIGlmIChvZmZzZXQgPj0gMCkKICAgICB7CiAgICAgICAgIGlmIChvZmZzZXQgKyBzaXplb2YoTE9ORykgPiB3bmRQdHItPmNsYXNzLT5jYlduZEV4dHJhKQogICAgICAgICB7CiAgICAgICAgICAgICBXQVJOKCB3aW4sICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CisKKyAgICAgICAgICAgIC8qIElzIHRoaXMgdGhlIHJpZ2h0IGVycm9yPyAqLworICAgICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9PVVRPRk1FTU9SWSApOworCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBwdHIgPSAoTE9ORyAqKSgoKGNoYXIgKil3bmRQdHItPndFeHRyYSkgKyBvZmZzZXQpOwpAQCAtMTU5NCwzMiArMTYxMSwzNiBAQAogCQkJCQkJdHlwZSwgV0lOX1BST0NfV0lORE9XICk7CiAJCXJldHVybiByZXR2YWw7CiAJY2FzZSBHV0xfU1RZTEU6Ci0JCWlmICh3bmRQdHItPmZsYWdzICYgV0lOX0lTV0lOMzIpCi0JCXsJc3R5bGUuc3R5bGVPbGQgPSB3bmRQdHItPmR3U3R5bGU7Ci0JCQluZXd2YWwgJj0gfihXU19WSVNJQkxFIHwgV1NfQ0hJTEQpOwkvKiBTb21lIGJpdHMgY2FuJ3QgYmUgY2hhbmdlZCB0aGlzIHdheSAqLwotCQkJc3R5bGUuc3R5bGVOZXcgPSBuZXd2YWwgfCAoc3R5bGUuc3R5bGVPbGQgJiAoV1NfVklTSUJMRSB8IFdTX0NISUxEKSk7CisJICAgICAgIAlzdHlsZS5zdHlsZU9sZCA9IHduZFB0ci0+ZHdTdHlsZTsKKwkJbmV3dmFsICY9IH4oV1NfVklTSUJMRSB8IFdTX0NISUxEKTsJLyogU29tZSBiaXRzIGNhbid0IGJlIGNoYW5nZWQgdGhpcyB3YXkgKi8KKwkJc3R5bGUuc3R5bGVOZXcgPSBuZXd2YWwgfCAoc3R5bGUuc3R5bGVPbGQgJiAoV1NfVklTSUJMRSB8IFdTX0NISUxEKSk7CiAKKwkJaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fSVNXSU4zMikKIAkJCVNlbmRNZXNzYWdlMzJBKGh3bmQsV01fU1RZTEVDSEFOR0lORyxHV0xfU1RZTEUsKExQQVJBTSkmc3R5bGUpOwotCQkJd25kUHRyLT5kd1N0eWxlID0gc3R5bGUuc3R5bGVOZXc7CisJCXduZFB0ci0+ZHdTdHlsZSA9IHN0eWxlLnN0eWxlTmV3OworCQlpZiAod25kUHRyLT5mbGFncyAmIFdJTl9JU1dJTjMyKQogCQkJU2VuZE1lc3NhZ2UzMkEoaHduZCxXTV9TVFlMRUNIQU5HRUQsR1dMX1NUWUxFLChMUEFSQU0pJnN0eWxlKTsKLQkJCVVwZGF0ZVdpbmRvdzMyKGh3bmQpOwotCQkJcmV0dXJuIHN0eWxlLnN0eWxlT2xkOwotCQl9CisJCXJldHVybiBzdHlsZS5zdHlsZU9sZDsKKwkJICAgIAogICAgICAgICBjYXNlIEdXTF9VU0VSREFUQTogCiAJCXB0ciA9ICZ3bmRQdHItPnVzZXJkYXRhOyAKIAkJYnJlYWs7CiAgICAgICAgIGNhc2UgR1dMX0VYU1RZTEU6ICAKKwkgICAgICAgIHN0eWxlLnN0eWxlT2xkID0gd25kUHRyLT5kd0V4U3R5bGU7CisJCXN0eWxlLnN0eWxlTmV3ID0gbmV3dmFsOwogCQlpZiAod25kUHRyLT5mbGFncyAmIFdJTl9JU1dJTjMyKQotCQl7CXN0eWxlLnN0eWxlT2xkID0gd25kUHRyLT5kd0V4U3R5bGU7Ci0JCQlzdHlsZS5zdHlsZU5ldyA9IG5ld3ZhbDsKIAkJCVNlbmRNZXNzYWdlMzJBKGh3bmQsV01fU1RZTEVDSEFOR0lORyxHV0xfRVhTVFlMRSwoTFBBUkFNKSZzdHlsZSk7Ci0JCQl3bmRQdHItPmR3RXhTdHlsZSA9IG5ld3ZhbDsKKwkJd25kUHRyLT5kd0V4U3R5bGUgPSBuZXd2YWw7CisJCWlmICh3bmRQdHItPmZsYWdzICYgV0lOX0lTV0lOMzIpCiAJCQlTZW5kTWVzc2FnZTMyQShod25kLFdNX1NUWUxFQ0hBTkdFRCxHV0xfRVhTVFlMRSwoTFBBUkFNKSZzdHlsZSk7Ci0JCQlVcGRhdGVXaW5kb3czMihod25kKTsKLQkJCXJldHVybiBzdHlsZS5zdHlsZU9sZDsKLQkJfQorCQlyZXR1cm4gc3R5bGUuc3R5bGVPbGQ7CisKIAlkZWZhdWx0OgogICAgICAgICAgICAgV0FSTiggd2luLCAiSW52YWxpZCBvZmZzZXQgJWRcbiIsIG9mZnNldCApOworCisgICAgICAgICAgICAvKiBEb24ndCB0aGluayB0aGlzIGlzIHJpZ2h0IGVycm9yIGJ1dCBpdCBzaG91bGQgZG8gKi8KKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKKwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHZhbCA9ICpwdHI7CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCBkMWJiZDIxLi4yYzNkZTNmIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTIyMywxNCArMjIzLDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRXaW5kb3dSZWN0MzIgICAoVVNFUjMyLjMwOCkKICAqLwotdm9pZCBXSU5BUEkgR2V0V2luZG93UmVjdDMyKCBIV05EMzIgaHduZCwgTFBSRUNUMzIgcmVjdCApIAorQk9PTDMyIFdJTkFQSSBHZXRXaW5kb3dSZWN0MzIoIEhXTkQzMiBod25kLCBMUFJFQ1QzMiByZWN0ICkgCiB7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsgCi0gICAgaWYgKCF3bmRQdHIpIHJldHVybjsKKyAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOwogICAgIAogICAgICpyZWN0ID0gd25kUHRyLT5yZWN0V2luZG93OwogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKIAlNYXBXaW5kb3dQb2ludHMzMiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAwLCAoUE9JTlQzMiAqKXJlY3QsIDIgKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnByb2MuYyBiL3dpbmRvd3Mvd2lucHJvYy5jCmluZGV4IGM4MTM4NjAuLmNiOGU5ZjEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucHJvYy5jCisrKyBiL3dpbmRvd3Mvd2lucHJvYy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAic3B5LmgiCiAKIC8qIFdpbmRvdyBwcm9jZWR1cmUgMTYtdG8tMzItYml0IHRodW5rLAogICogc2VlIEJ1aWxkU3BlYzE2RmlsZXMoKSBpbiB0b29scy9idWlsZC5jICovCkBAIC0xMTMsOCArMTE0LDggQEAKIHN0YXRpYyBMUkVTVUxUIFdJTlBST0NfQ2FsbFduZFByb2MzMiggV05EUFJPQzMyIHByb2MsIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewotICAgIFRSQUNFKHJlbGF5LCAiKHduZHByb2M9JXAsaHduZD0lMDh4LG1zZz0lMDh4LHdwPSUwOHgsbHA9JTA4bHgpXG4iLAotICAgICAgICAgICAgICAgICAgIHByb2MsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICBUUkFDRShyZWxheSwgIih3bmRwcm9jPSVwLGh3bmQ9JTA4eCxtc2c9JXMsd3A9JTA4eCxscD0lMDhseClcbiIsCisgICAgICAgICAgICAgICAgICAgcHJvYywgaHduZCwgU1BZX0dldE1zZ05hbWUobXNnKSwgd1BhcmFtLCBsUGFyYW0gKTsKICAgICByZXR1cm4gcHJvYyggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogfQogCkBAIC00NDEsNyArNDQyLDcgQEAKICAgICBjYXNlIFdNX1BBSU5UQ0xJUEJPQVJEOgogICAgIGNhc2UgV01fU0laRUNMSVBCT0FSRDoKICAgICBjYXNlIFdNX1dJTklOSUNIQU5HRToKLSAgICAgICAgVFJBQ0UobXNnLCAibWVzc2FnZSAlMDR4IG5lZWRzIHRyYW5zbGF0aW9uXG4iLCBtc2cgKTsKKyAgICAgICAgVFJBQ0UobXNnLCAibWVzc2FnZSAlcyBuZWVkcyB0cmFuc2xhdGlvblxuIiwgU1BZX0dldE1zZ05hbWUobXNnKSApOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgZGVmYXVsdDogIC8qIE5vIHRyYW5zbGF0aW9uIG5lZWRlZCAqLwogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3dpbmUuaW5pIGIvd2luZS5pbmkKaW5kZXggMzJmMGI3MS4uNjBiZWFmYiAxMDA2NDQKLS0tIGEvd2luZS5pbmkKKysrIGIvd2luZS5pbmkKQEAgLTc2LDQgKzc2LDUgQEAKIEV4Y2x1ZGU9V01fU0laRTtXTV9USU1FUjsKIAogW1R3ZWFrLkxheW91dF0KLTtXaW45NUxvb2s9dHJ1ZQorOzsgV2luZUxvb2s9eHh4ICAoc3VwcG9ydGVkIHN0eWxlcyBhcmUgJ1dpbjMxJyhkZWZhdWx0KSwgJ1dpbjk1JywgJ1dpbjk4JykKKztXaW5lTG9vaz1XaW45NQo=